ZGlmZiAtLWdpdCBhL0FOTk9VTkNFIGIvQU5OT1VOQ0UKaW5kZXggMzAzYzViZC4uNWMwYmVhMSAxMDA2NDQKLS0tIGEvQU5OT1VOQ0UKKysrIGIvQU5OT1VOQ0UKQEAgLTEsMTYgKzEsMTUgQEAKLVRoaXMgaXMgcmVsZWFzZSA5ODA4MDkgb2YgV2luZSwgdGhlIE1TIFdpbmRvd3MgZW11bGF0b3IuICBUaGlzIGlzIHN0aWxsIGEKK1RoaXMgaXMgcmVsZWFzZSA5ODA4MjIgb2YgV2luZSwgdGhlIE1TIFdpbmRvd3MgZW11bGF0b3IuICBUaGlzIGlzIHN0aWxsIGEKIGRldmVsb3BlcidzIG9ubHkgcmVsZWFzZS4gIFRoZXJlIGFyZSBtYW55IGJ1Z3MgYW5kIG1hbnkgdW5pbXBsZW1lbnRlZCBBUEkKIGZlYXR1cmVzLiAgTW9zdCBhcHBsaWNhdGlvbnMgc3RpbGwgZG8gbm90IHdvcmsgY29ycmVjdGx5LgogCiBQYXRjaGVzIHNob3VsZCBiZSBzdWJtaXR0ZWQgdG8gImp1bGxpYXJkQGxyYy5lcGZsLmNoIi4gIFBsZWFzZSBkb24ndAogZm9yZ2V0IHRvIGluY2x1ZGUgYSBDaGFuZ2VMb2cgZW50cnkuCiAKLVdIQVQnUyBORVcgd2l0aCBXaW5lLTk4MDgwOTogKHNlZSBDaGFuZ2VMb2cgZm9yIGRldGFpbHMpCi0JLSBQcmVsaW1pbmFyeSBET1MgZXhlY3V0YWJsZXMgc3VwcG9ydC4KLQktIFBvc3RzY3JpcHQgZHJpdmVyIGltcHJvdmVtZW50cy4KLQktIE1vcmUgY2xpZW50L3NlcnZlciBzdHVmZi4KLQktIEJldHRlciBzaGVsbDMyLmRsbCBidWlsdGluIHN1cHBvcnQuCi0JLSBQcm9wZXIgV2luMTYgbXV0ZXggbG9ja2luZy4KK1dIQVQnUyBORVcgd2l0aCBXaW5lLTk4MDgyMjogKHNlZSBDaGFuZ2VMb2cgZm9yIGRldGFpbHMpCisJLSBJbXByb3ZlZCBtbWlvIHN1cHBvcnQuCisJLSBWeERDYWxsIHN1cHBvcnQuCisJLSBNb3JlIGNvbW1vbiBjb250cm9scyBhbmQgc2hlbGwzMiBzdHVmZi4KKwktIEJldHRlciBET1MgZXhlY3V0YWJsZXMgc3VwcG9ydC4KIAktIExvdHMgb2YgYnVnIGZpeGVzLgogCiBTZWUgdGhlIFJFQURNRSBmaWxlIGluIHRoZSBkaXN0cmlidXRpb24gZm9yIGluc3RhbGxhdGlvbiBpbnN0cnVjdGlvbnMuCkBAIC0xOSwxMCArMTgsMTAgQEAKIHRoZSByZWxlYXNlIGlzIGF2YWlsYWJsZSBhdCB0aGUgZnRwIHNpdGVzLiAgVGhlIHNvdXJjZXMgd2lsbCBiZSBhdmFpbGFibGUKIGZyb20gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6CiAKLSAgZnRwOi8vc3Vuc2l0ZS51bmMuZWR1L3B1Yi9MaW51eC9BTFBIQS93aW5lL2RldmVsb3BtZW50L1dpbmUtOTgwODA5LnRhci5negotICBmdHA6Ly90c3gtMTEubWl0LmVkdS9wdWIvbGludXgvQUxQSEEvV2luZS9kZXZlbG9wbWVudC9XaW5lLTk4MDgwOS50YXIuZ3oKLSAgZnRwOi8vZnRwLmluZm9tYWdpYy5jb20vcHViL21pcnJvcnMvbGludXgvc3Vuc2l0ZS9BTFBIQS93aW5lL2RldmVsb3BtZW50L1dpbmUtOTgwODA5LnRhci5negotICBmdHA6Ly9mdHAucHJvZ3NvYy51dHMuZWR1LmF1L3B1Yi9XaW5lL2RldmVsb3BtZW50L1dpbmUtOTgwODA5LnRhci5negorICBmdHA6Ly9zdW5zaXRlLnVuYy5lZHUvcHViL0xpbnV4L0FMUEhBL3dpbmUvZGV2ZWxvcG1lbnQvV2luZS05ODA4MjIudGFyLmd6CisgIGZ0cDovL3RzeC0xMS5taXQuZWR1L3B1Yi9saW51eC9BTFBIQS9XaW5lL2RldmVsb3BtZW50L1dpbmUtOTgwODIyLnRhci5negorICBmdHA6Ly9mdHAuaW5mb21hZ2ljLmNvbS9wdWIvbWlycm9ycy9saW51eC9zdW5zaXRlL0FMUEhBL3dpbmUvZGV2ZWxvcG1lbnQvV2luZS05ODA4MjIudGFyLmd6CisgIGZ0cDovL2Z0cC5wcm9nc29jLnV0cy5lZHUuYXUvcHViL1dpbmUvZGV2ZWxvcG1lbnQvV2luZS05ODA4MjIudGFyLmd6CiAKIEl0IHNob3VsZCBhbHNvIGJlIGF2YWlsYWJsZSBmcm9tIGFueSBzaXRlIHRoYXQgbWlycm9ycyB0c3gtMTEgb3Igc3Vuc2l0ZS4KIApkaWZmIC0tZ2l0IGEvQ2hhbmdlTG9nIGIvQ2hhbmdlTG9nCmluZGV4IGJkOWNiNDUuLmI2ZTRjNTQgMTAwNjQ0Ci0tLSBhL0NoYW5nZUxvZworKysgYi9DaGFuZ2VMb2cKQEAgLTEsNCArMSwyMTMgQEAKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1NhdCBBdWcgMjIgMTc6NDY6MTkgMTk5OCAgVWxyaWNoIFdlaWdhbmQgPHdlaWdhbmRAaW5mb3JtYXRpay51bmktZXJsYW5nZW4uZGU+CisKKwkqIFtpbmNsdWRlL2Rvc2V4ZS5oXSBbaW5jbHVkZS9tb2R1bGUuaF0gW2luY2x1ZGUvcGVfaW1hZ2UuaF0gCisJICBbaW5jbHVkZS9wcm9jZXNzLmhdIFtpbmNsdWRlL3dpbmRvd3MuaF0gW2xvYWRlci9kb3MvbW9kdWxlLmNdCisJICBbbG9hZGVyL21vZHVsZS5jXSBbbG9hZGVyL25lL21vZHVsZS5jXSBbbG9hZGVyL3BlX2ltYWdlLmNdCisJICBbc2NoZWR1bGVyL3Byb2Nlc3MuY10gW3dpbjMyL3Byb2Nlc3MuY10KKwlQYXJ0aWFsbHkgaW1wbGVtZW50ZWQgQ3JlYXRlUHJvY2VzczMyLgorCisJKiBbd2luMzIvZGV2aWNlLmNdIFtyZWxheTMyL2tlcm5lbDMyLnNwZWNdIFtzY2hlZHVsZXIvazMyb2JqLmNdCisJICBbbWlzYy9yZWdpc3RyeS5jXSBbd2luMzIvZmlsZS5jXQorCVBhcnRpYWxseSBpbXBsZW1lbnRlZCBWeERDYWxsIChWTU0gcmVnaXN0cnkgc2VydmljZXMpLgorCisJKiBbZmlsZXMvZG9zX2ZzLmNdCisJRE9TRlNfRmluZE5leHQgbWFkZSB0aHJlYWQtc2FmZS4KKworCSogW2luY2x1ZGUvc2lnX2NvbnRleHQuaF0gW2luY2x1ZGUvc3lzbGV2ZWwuaF0gW2xvYWRlci9zaWduYWwuY10KKwkgIFtzY2hlZHVsZXIvc3lzbGV2ZWwuY10gW3Rvb2xzL2J1aWxkLmNdCisJUmVwbGFjZWQgQ0FMTFRPMTZfQ3VycmVudF9mcyBieSBTWVNMRVZFTF9XaW4xNkN1cnJlbnRUZWIuCisKKwkqIFt3aW4zMi9rZXJuZWwzMi5jXQorCUJ1Z2ZpeDogUVRfVGh1bmsvRlRfVGh1bmsgc2hvdWxkIHJldHVybiAnbG9uZycgaW4gRFg6QVgsIG5vdCBFQVguCisKKwkqIFtpZjE2MzIvcmVsYXkuY10gW3JlbGF5MzIvYnVpbHRpbjMyLmNdIFt3aW5kb3dzL21zZ2JveC5jXQorCSAgW21zZG9zL2ludDIwLmNdIFttc2Rvcy9pbnQyMS5jXQorCVVzZSBFeGl0UHJvY2VzcyBpbnN0ZWFkIG9mIFRBU0tfS2lsbEN1cnJlbnRUYXNrLgorCisJKiBbaW5jbHVkZS90YXNrLmhdIFtpbmNsdWRlL3RocmVhZC5oXSBbbG9hZGVyL3Rhc2suY10gCisJICBbc2NoZWR1bGVyL3RocmVhZC5jXSBbaW5jbHVkZS9xdWV1ZS5oXSBbd2luZG93cy9tZXNzYWdlLmNdIAorCSAgW3dpbmRvd3MvcXVldWUuY10gW3dpbmRvd3Mvd2luLmNdCisJUHJldmVudCBXaW4zMiB0aHJlYWRzIGZyb20gZW50ZXJpbmcgdGhlIFRBU0tfUmVzY2hlZHVsZSBsb29wLgorCShOb3RlOiBXaW4zMiBtZXNzYWdpbmcgc3RpbGwgZG9lc24ndCB3b3JrIGNvcnJlY3RseTsgdGhpcyBwYXRjaAorCWlzIGp1c3QgcHJldmVudGluZyB0aGUgc3lzdGVtIGZyb20gY3Jhc2hpbmcgd2hlbiBXaW4zMiB0aHJlYWRzCisJY2FsbCBtZXNzYWdpbmcgZnVuY3Rpb25zLiBNZXNzYWdlcyB3aWxsIHByb2JhYmx5IHN0aWxsIGdldCBsb3N0LikKKworCSogW3NjaGVkdWxlci9jcml0c2VjdGlvbi5jXQorCURlYWN0aXZhdGVkIHRoZSB1c2Ugb2YgU0VNX1VORE8gZm9yIHRoZSBTWVNURU1fTE9DSyBzZW1hcGhvcmU7CisJZm9yIHNvbWUgcmVhc29uLCB0aGlzIGxlYWRzIHRvIHByb2JsZW1zIGFmdGVyIHRocmVhZHMgdGVybWluYXRlLi4uIAorCitTYXQgQXVnIDIyIDE1OjAwOjAwIDE5OTggIEr8cmdlbiBTY2htaWVkIDxqdWVyZ2VuLnNjaG1pZWRAbWV0cm9uZXQuZGU+CisKKwkqIFtpbmNsdWRlL2F1dGhvcnMuaF0KKwlOZXcgZmlsZSwgaW5jbHVkZXMgYWxsIG5hbWVzIG9mIHRoZSBkZXZlbG9wZXIgKGZvcm1lciBzaGVsbC5jKQorCisJKiBbTWFrZWZpbGUuaW5dW2NvbmZpZ3VyZV1bY29uZmlndXJlLmluXVtkbGxzL01ha2VmaWxlLmluXQorCSAgW2RsbHMvc2hlbGwzMi9NYWtlZmlsZS5pbl1bc2hyZXMucmNdCisJQ3JlYXRlZCBkbGxzL3NoZWxsMzIgYW5kIG1vdmVkIHRoZSBzaGVsbDMyIHN0dWZmIGluIGl0LgorCVN0YXJ0ZWQgdG8gY3JlYXRlIGludGVybmFsIHJlc291cmNlcy4KKworCSogW2RsbHMvc2hlbGwzMi8qXQorCVNwbGl0IHRoZSBzaGVsbDMyIGltcGxlbWVudGF0aW9uIGludG8gc21hbGxlciBmaWxlcy4KKwlOZXcgY2xhc3NlczogSUNvbnRleHRNZW51LCBJRXh0cmFjdEljb24sIElTaGVsbFZpZXcuCisJSW1wbGVtZW50ZWQgU2hlbGxfR2V0SW1hZ2VMaXN0KCkuCisJc2hlbGwzMiBsaW5rcyB0byBjb21jdGwzMiBub3cgZHluYW1pY2FsbHkgc28gaXQgY2FuIHVzZQorCWludGVybmFsL2V4dGVybmFsIGltcGxlbWVudGF0aW9ucy4KKworCSogW2RvY3VtZW50YXRpb24vaW50ZXJuYWwtZGxsXSBbZG9jdW1lbnRhdGlvbi9zaGVsbDMyXQorCU5ldywgY291bGQgYW55Ym9keSBkbyBhIHNwZWxsY2hlY2s/CisKKwkqIFtpbmNsdWRlL2NvbW1jdHJsLmhdCisJTWFueSBuZXcgTFYgY29uc3RhbnRzLCBzdHJ1Y3R1cmVzLCBmdW5jdGlvbnMuCisKKwkqIFtjb250cm9scy9jb21jdGwzMnVuZG9jLmNdCisJUmV3cm90ZSB0aGUgRFNBKiBmdW5jdGlvbnMuCisKKwkqIFt3aW5kb3dzL3dpbnBvcy5jXQorCVNldFNoZWxsV2luZG93MzIsIEdldFNoZWxsV2luZG93MzIuCisKK1NhdCBBdWcgMjIgMTQ6MDI6MTUgMTk5OCAgQWxleGFuZGVyIEx1a3lhbm92IDxsYXZAbG9uZy55YXIucnU+CisKKwkqIFtsb2FkZXIvcmVzb3VyY2UuY10KKwlNYXJrIGxhc3QgYWNjZWxlcmF0b3IgYXMgc3VjaCBpbiBMb2FkQWNjZWxlcmF0b3JzMzJXLgorCisJKiBbcmVsYXkzMi9zaGVsbDMyLnNwZWNdIFttaXNjL3NoZWxsLmNdCisJQWRkIHN0dWJzIGZvciBTSEdldFNwZWNpYWxGb2xkZXJQYXRoW0FXXS4KKworU2F0IEF1ZyAyMiAwMjowNzo0MiAxOTk4ICBBZHJpYW4gSGFydmV5IDxhZHJpYW5Ac2VsZWN0LmNvbS5hdT4KKworCSogW2luY2x1ZGUvZmlsZS5oXSBbZmlsZS9maWxlLmNdIFttc2Rvcy9pbnQyMS5jXSBbbXNkb3MvdnhkLmNdCisJICBbbWlzYy9semV4cGFuZC5jXSBbd2luMzIva2VybmVsMzIuY10gW2RvY3VtZW50YXRpb24vZmlsZWhhbmRsZXNdCisJRml4ZWQgZmlsZSBoYW5kbGUgaGFuZGxpbmcuICBDcmVhdGVkIHVuaXZlcnNhbCBIRklMRTE2IHRvIEhGSUxFMzIKKwl0cmFuc2xhdGlvbiBtYWNybyBmcm9tIG1zZG9zL2ludDIxIGNvZGUgYnkgT3ZlIEthYXZlbi4KKwlVc2VkIG1hY3JvIGluIGFsbCBXaW4xNiBmdW5jdGlvbnMgc28gdGhhdCB3aW4zMiBoYW5kbGVzIGFyZSB0cmFuc2xhdGVkCisJdG8gYXZvaWQgRE9TL1dpbjE2IHN0ZHh4IGhhbmRsZXMuCisJUmVtb3ZlZCBoYW5kbGUgdHJhbnNsYXRpb24gZnJvbSBpbnQyMS5jIHdoZXJlIFdpbjE2IGZ1bmN0aW9ucyBhcmUKKwljYWxsZWQuICBDaGFuZ2VkIHJlbWFpbmluZyBjYWxscyB0byB1c2UgbmV3IG1hY3JvIG5hbWVzLgorCURvY3VtZW50ZWQgZmlsZWhhbmRsZSBoYW5kbGluZyBhbmQgZGlmZmVyZW5jZXMgYmV0d2VlbiB3aW4gMTYgJiAzMi4KKworRnJpIEF1ZyAyMSAyMDozMjo0OSAxOTk4ICBBbGV4YW5kcmUgSnVsbGlhcmQgIDxqdWxsaWFyZEBscmMuZXBmbC5jaD4KKworCSogW3NlcnZlci9wcm9jZXNzLmNdIFtzZXJ2ZXIvdGhyZWFkLmNdCisJSW1wbGVtZW50ZWQgb2JqZWN0IHdhaXQgcXVldWVzIGFuZCBzeW5jaHJvbml6YXRpb24uCisKK0ZyaSBBdWcgMjEgMTg6NDA6MDIgMTk5OCAgSHV3IEQgTSBEYXZpZXMgPGRhdmllc2hAYWJhY3VzLnBoeXNpY3Mub3guYWMudWs+CisKKwkqIFtncmFwaGljcy9wc2Rydi8qXQorCURFVk1PREUgZG1QYXBlcntXaWR0aHxMZW5ndGh9IGZpZWxkcyBhcmUgaW4gMC4xbW0uCisJU2VsZWN0IGEgMTAwIHBpeGVsIGRlZmF1bHQgZm9udCBpbiBDcmVhdGVEQy4KKworVGh1IEF1ZyAyMCAyMjo0NzozOSAxOTk4ICBVd2UgQm9ubmVzICA8Ym9uQGVsZWt0cm9uLmlrcC5waHlzaWsudHUtZGFybXN0YWR0LmRlPgorCisJKiBbb2JqZWN0cy9iaXRtYXAuY10KKwlIYW5kbGUgYml0cz0zMiBpbiBTZXRCaXRtYXBCaXRzMzIgYW5kIEdldEJpdG1hcEJpdHMzMi4KKworCSogW21zZG9zL2ludDIxLmNdCisJQWRkIGhhbmRsaW5nIG9mIEludDIxIDBBIGFuZCAzNy4KKworCSogW21pc2MvY29tbWRsZy5jXQorCVVzZSBNYXBITW9kdWxlTFMgYW5kIE1hcEhNb2R1bGVTTCB3aGVuIHRyYW5zbGF0aW5nIEhJTlNUQU5DRTE2IHRvCisJSElOU1RBTkNFMzIgYW5kIHZpY2UgdmVyc2EuCisKKwkqIFt3aW4zMi9maWxlLmNdCisJQ3JlYXRlRmlsZTMyQTogQWJvcnQgaWYgZmlsZW5hbWUgPT0gTlVMTC4KKworVGh1IEF1ZyAyMCAxMjoyODozMSAxOTk4ICBNYXJjdXMgTWVpc3NuZXIgPG1hcmN1c0BqZXQuZnJhbmtlbi5kZT4KKworCSogWyovKl0KKwlMb3RzIG9mIG1pc3NpbmcgcHJvdG90eXBlcyBhZGRlZCwgc29tZSBwYXJhbWV0ZXIgdHlwZXMgYWRhcHRlZCB0byBtYXRjaAorCVNESy4KKworCSogW2RlYnVnZ2VyL3N0YWJzLmNdCisJRG9uJ3QgbG9vcCBmb3JldmVyIGlmIHdlIGRvbid0IGZpbmQgd2luZSBvciBvbmUgb2YgdGhlIGxpYnh4eC5zby4KKworCSogW2xvYWRlci9uZS9tb2R1bGUuY10KKwlJbXBsZW1lbnRlZCBNYXBITW9kdWxlTFMsTWFwSE1vZHVsZVNMLE1hcEhpbnN0TFMsTWFwSGluc3RTTC4KKworCSogW21pc2MvbmV0d29yay5jXQorCUltcGxlbWVudGVkIFdOZXRHZXRVc2VyMzJBLgorCisJKiBbbWlzYy9zaGVsbG9yZC5jXQorCUltcGxlbWVudGVkIElMUmVtb3ZlTGFzdElELgorCisJKiBbbXVsdGltZWRpYS9kc291bmQuY10KKwlGaXhlZCBTdGFyQ3JhZnQgbWVtb3J5IGxlYWsuCisKKwkqIFtncmFwaGljcy9kZHJhdy5jXQorCVJlbW92ZWQgc29tZSB1bm5lY2Vzc2FyeSBzaW1wbGUgcmVsYXlpbmcgZnVuY3Rpb25zLCB0cmllZCBwb2xpc2hpbmcKKwl1cCB0aGUgWGxpYiBpbXBsZW1lbnRhdGlvbiAoc3RpbGwgZG9lc24ndCB3b3JrKSwgdGVtcC4gcmVtb3ZlZCBYc2htCisJY29kZSAodG8gYmUgcmVtZXJnZWQgd2l0aCB3b3JraW5nIFhsaWIgY29kZSkuCisKK1R1ZSBBdWcgMTggMjI6Mjk6MTcgMTk5OCAgT3ZlIEthYXZlbiA8b3Zla0BhcmN0aWNuZXQubm8+CisKKwkqIFttdWx0aW1lZGlhL21taW8uY10gW211bHRpbWVkaWEvbW1zeXN0ZW0uY10KKwlGaXhlZCBtb3N0IG1taW8gYnVncywgZnVsbHkgaW1wbGVtZW50aW5nIG1taW9TZXRCdWZmZXIKKwlidWZmZXJpbmcsIGFiaWxpdHkgdG8gcmVhZCBtZW1vcnkgZmlsZXMsIGFuZCB0aGUKKwlzbmRQbGF5U291bmQoKSBTTkRfTUVNT1JZIGZsYWcuIE1vc3QgbW1pby11c2luZyBwcm9ncmFtcworCW5vdyB3b3JrIGZpbmUuCisKKwkqIFtpbmNsdWRlL2Rvc2V4ZS5oXSBbaW5jbHVkZS9taXNjZW11LmhdIFtpbmNsdWRlL21vZHVsZS5oXQorCSAgW2xvYWRlci9tb2R1bGUuY10gW2xvYWRlci90YXNrLmNdIFttc2Rvcy9kb3NtZW0uY10KKwlJbXByb3ZlZCBET1MgVk0gZmxleGliaWxpdHkgYW5kIHBvcnRhYmlsaXR5IHNvbWV3aGF0LiAoRGlkCisJSSBnZXQgdGhlICNpZmRlZnMgcmlnaHQgdGhpcyB0aW1lLCBCU0QtZXJzPykKKworCSogW21zZG9zL2ludDIxLmNdCisJTWFkZSAiR2V0IEN1cnJlbnQgUFNQIGFkZHJlc3MiIHdvcmsgYXMgZXhwZWN0ZWQgaW4gYSBET1MgVk0uCisKKwkqIFtsb2FkZXIvZG9zLypdCisJQmVnYW4gaW1wcm92aW5nIGZsZXhpYmlsaXR5IGFuZCBwb3J0YWJpbGl0eSBzb21ld2hhdC4gSXQKKwlzaG91bGQgYmUgZWFzaWVyIHRvIGFkZCBEUE1JIFJNQ0IgY2FsbGJhY2tzIG5vdy4gVGhlCisJRE9TIFZNIG5vIGxvbmdlciBsZWF2ZXMgYmlnIGZpbGVzIGx5aW5nIGFyb3VuZCBpbiAvdG1wCisJYWZ0ZXIgYSBjcmFzaC4KKworVHVlIEF1ZyAxOCAxMjozODozMSAxOTk4IFR1cmNoYW5vdiBTZXJnZXkgPHR1cmNoYW5vdkB1c2EubmV0PgorCisJKiBbcmVsYXkzMi93aW5tbS5zcGVjXQorCVRoaXMgcGF0Y2ggYWxsb3dzIFdpbkFtcCB0byBwbGF5IFdBViBmaWxlcyAoYXQgbGVhc3QgaW4gUENNCisJZm9ybWF0KS4KKworU3VuIEF1ZyAxNiAwNTozNDoxMyAxOTk4ICBQYWJsbyBTYXJhdHhhZ2EgPHNydHhnQGNoYW5hZS5hbHBoYW5ldC5jaD4KKworCSogW3dpbmRvd3Mva2V5Ym9hcmQuY10KKwlDb3JyZWN0ZWQga2V5Ym9hcmQgY29kZSB0byBwcm9wZXJseSBoYW5kbGUga2V5cyA6ID8gfiBhbmQgIgorCW9uIG5vbiBVUyBrZXlib2FyZHMuCisKK1NhdCBBdWcgMTUgMTg6NDc6MTQgMTk5OCAgQnJpYW4gQ3JhZnQgPGJjYm95QGRvcm90aHkud2FuZ2xhYi5icmFuZGVpcy5lZHU+CisKKwkqIFt3aW5kb3dzL3dpbi5jXQorCUZpeGVkIHNldmVyZSBidWcgaW4gRW51bUNoaWxkV2luZHdvcygpLgorCitUaHUgQXVnIDEzIDIxOjA1OjM1IDE5OTggIEVyaWMgS29obCA8ZWtvaGxAYWJvLnJoZWluLXplaXR1bmcuZGU+CisKKwkqIFtjb250cm9scy90b29sdGlwcy5jXQorCUZpeGVkIHNvbWUgYnVncy4gQWRkZWQgc3ViY2xhc3Npbmcgc3VwcG9ydC4KKworCSogW2NvbnRyb2xzL3Rvb2xiYXIuY10KKwlJbXByb3ZlZCB0b29sdGlwIGludGVncmF0aW9uLiBGaXhlZCBzb21lIGJ1Z3MuCisKKwkqIFtjb250cm9scy9jb21tY3RybC5jXQorCUNoYW5nZWQgY29udHJvbCByZWdpc3RyYXRpb24gYW5kIGFkZGVkIHNvbWUgZG9jdW1lbnRhdGlvbi4KKwlGaXhlZCBTaG93SGlkZU1lbnVDdGwuCisKKwkqIFtjb250cm9scy9yZWJhci5jXVtpbmNsdWRlL3JlYmFyLmhdW2luY2x1ZGUvY29tbWN0cmwuaF0KKwlJbXByb3ZlZCByZWJhciBpbXBsZW1lbnRhdGlvbiAoc3RpbGwgbm8gZGlzcGxheSkuCisKKwkqIFtjb250cm9scy9wYWdlci5jXVtpbmNsdWRlL3BhZ2VyLmhdW2luY2x1ZGUvY29tbWN0cmwuaF0KKwlJbXByb3ZlZCBwYWdlciBpbXBsZW1lbnRhdGlvbiAoc3RpbGwgbm8gZGlzcGxheSkuCisKKwkqIFttaXNjL2ltYWdlbGlzdC5jXQorCUZpeGVkIGEgYnVnLgorCisJKiBbZG9jdW1lbnRhdGlvbi9jb21tb25fY29udHJvbHNdCisJVXBkYXRlZC4KKworU3VuIEF1ZyAgOSAxOTo1MDoyMCAxOTk4ICBKYW1lcyBKdXJhbiA8anJqMTIwQHBzdS5lZHU+CisKKwkqIFtNYWtlZmlsZS5pbl0gW2RvY3VtZW50YXRpb24vTWFrZWZpbGUuaW5dIAorCSAgW3Byb2dyYW1zL01ha2VmaWxlLmluXSBbcHJvZ3JhbXMvKi9NYWtlZmlsZS5pbl0KKwlBZGRlZCB1bmluc3RhbGwgcnVsZXMsIGNsZWFuZWQgdXAgaW5zdGFsbCBydWxlcyBhIGxpdHRsZSBiaXQuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFN1biBBdWcgIDkgMTM6MjE6MzUgMTk5OCAgQW5kcmVhcyBNb2hyIDwxMDAuMzA5MzZAZ2VybWFueS5uZXQ+CiAKIAkqIFtsb2FkZXIvbmUvbW9kdWxlLmNdIFtpZjE2MzIva2VybmVsLnNwZWNdCkBAIC0xNSw2ICsyMjQsMzMgQEAKIAkqIFtsb2FkZXIvdGFzay5jXQogCUluaXRUYXNrIG5lZWRzIHRvIGRlY3JlbWVudCB0aGUgU1AgcmVnaXN0ZXIgYnkgdHdvIGFzIFdpbjk1IGRvZXMuCiAKK1N1biBBdWcgIDkgMDI6NDE6MjggMTk5OCAgVWxyaWNoIFdlaWdhbmQgPHdlaWdhbmRAaW5mb3JtYXRpay51bmktZXJsYW5nZW4uZGU+CisKKwkqIFtpZjE2MzIva2VybmVsLnNwZWNdIFtyZWxheTMyL2tlcm5lbDMyLnNwZWNdIFtzY2hlZHVsZXIvc3lzbGV2ZWwuY10KKwkgIFtsb2FkZXIvbWFpbi5jXSBbd2luMzIvb3JkaW5hbHMuY10gW2luY2x1ZGUvc3lzbGV2ZWwuaF0gCisJICBbc2NoZWR1bGVyL01ha2VmaWxlLmluXQorCUltcGxlbWVudGVkIFdpbjk1ICdzeXNsZXZlbCcgcm91dGluZXMgKGluY2x1ZGluZyBXaW4xNkxvY2spLgorCisJKiBbaWYxNjMyL3JlbGF5LmNdIFtpZjE2MzIvdGh1bmsuY10gW3Rvb2xzL2J1aWxkLmNdIFtsb2FkZXIvdGFzay5jXQorCSAgW2xvYWRlci9uZS9zZWdtZW50LmNdIFt3aW4zMi9rZXJuZWwzMi5jXSBbbWVtb3J5L3NlbGVjdG9yLmNdCisJICBbaW5jbHVkZS9zdGFja2ZyYW1lLmhdIFtpbmNsdWRlL3RocmVhZC5oXQorCTE2LWJpdCAlZnMgaGFuZGxpbmcgcmV2aXNlZC4gIFVzZSBXaW4xNkxvY2sgd2hlcmUgYXBwcm9wcmlhdGUuCisKKwkqIFtpbmNsdWRlL3RocmVhZC5oXSBbc2NoZWR1bGVyL3N5bmNocm8uY10gW3dpbmRvd3MvbWVzc2FnZS5jXSAKKwkgIFt3aW5kb3dzL3F1ZXVlLmNdIFt3aW4zMi9wcm9jZXNzLmNdCisJSW1wbGVtZW50ZWQgTXNnV2FpdEZvck11bHRpcGxlT2JqZWN0cy4KKworCSogW2ZpbGVzL2NoYW5nZS5jXSBbZmlsZXMvTWFrZWZpbGUuaW5dIFtzY2hlZHVsZXIvazMyb2JqLmNdIAorCSAgW3dpbjMyL25ld2Zucy5jXQorCUltcGxlbWVudGVkIChkdW1teSkgZmlsZSBjaGFuZ2Ugbm90aWZpY2F0aW9uIG9iamVjdHMuCisKKwkqIFtkZWJ1Z2dlci9kYmcueV0gW3NjaGVkdWxlci9wcm9jZXNzLmNdIFtzY2hlZHVsZXIvdGhyZWFkLmNdCisJICBbaW5jbHVkZS9wcm9jZXNzLmhdIFtpbmNsdWRlL3RocmVhZC5oXQorCVN1c3BlbmQgYWxsIHRocmVhZHMgZXhjZXB0IGN1cnJlbnQgd2hlbiBoaXR0aW5nIGRlYnVnZ2VyIGJyZWFrIHBvaW50LgorCisJKiBbb2JqZWN0cy9kaWIuY10KKwlCdWdmaXggZm9yIENyZWF0ZURJQlNlY3Rpb24uCisKIFNhdCBBdWcgIDggMTk6MTE6NDYgMTk5OCAgTWFyY3VzIE1laXNzbmVyIDxtYXJjdXNAamV0LmZyYW5rZW4uZGU+CiAKICAJKiBbKi8qXQpkaWZmIC0tZ2l0IGEvTWFrZWZpbGUuaW4gYi9NYWtlZmlsZS5pbgppbmRleCA1MmEzYjZhLi4zZjg4ZTE1IDEwMDY0NAotLS0gYS9NYWtlZmlsZS5pbgorKysgYi9NYWtlZmlsZS5pbgpAQCAtNSw2ICs1LDcgQEAKICMgY2xlYW46CQlyZW1vdmUgYWxsIGludGVybWVkaWF0ZSBmaWxlcwogIyBkaXN0Y2xlYW46CQlhbHNvIHJlbW92ZSBhbGwgZmlsZXMgY3JlYXRlZCBieSBjb25maWd1cmUKICMgaW5zdGFsbDogICAgICAgICAgICAgIGluc3RhbGwgZXZlcnl0aGluZworIyB1bmluc3RhbGw6CQl1bmluc3RhbGwgZXZlcnl0aGluZwogIyBkZXBlbmQ6CQljcmVhdGUgdGhlIGRlcGVuZGVuY2llcwogIyBldGFnczoJCWNyZWF0ZSBhIFRBR1MgZmlsZSBmb3IgRW1hY3MuCiAjIG1hbnBhZ2VzOgkJY29tcGlsZSBtYW5wYWdlcyBmb3IgV2luZSBBUEkKQEAgLTI2LDYgKzI3LDcgQEAKIAl0b29scyBcCiAJdG9vbHMvd3JjIFwKIAljb250cm9scyBcCisJZGxscy9zaGVsbDMyIFwKIAlmaWxlcyBcCiAJZ3JhcGhpY3MgXAogCWdyYXBoaWNzL21ldGFmaWxlZHJ2IFwKQEAgLTc1LDYgKzc3LDcgQEAKIAogTElCT0JKUyA9IFwKIAljb250cm9scy9jb250cm9scy5vIFwKKwlkbGxzL3NoZWxsMzIvc2hlbGwzMi5vIFwKIAlmaWxlcy9maWxlcy5vIFwKIAlncmFwaGljcy9ncmFwaGljcy5vIFwKIAlncmFwaGljcy9tZXRhZmlsZWRydi9tZXRhZmlsZWRydi5vIFwKQEAgLTExMiw2ICsxMTUsOCBAQAogCiBpbnN0YWxsOjogaW5zdGFsbF8kKE1BSU5fVEFSR0VUKQogCit1bmluc3RhbGw6OiB1bmluc3RhbGxfJChNQUlOX1RBUkdFVCkKKwogZW11OiB3aW5lCiAKIGxpYjogJChMSUJTVUJESVJTKSAkKExJQl9UQVJHRVQpCkBAIC0xMjksMjggKzEzNCw0NyBAQAogCSQoQ0MpIC1zaGFyZWQgLVdsLC1zb25hbWUsbGlid2luZS5zbyAtbyRAICQoTElCT0JKUykgJChMRE9QVElPTlMpICQoWF9MSUJTKSAkKFhQTV9MSUIpICQoWExJQikgJChMSUJTKQogCiBpbnN0YWxsX2VtdTogaW5zdGFsbF9saWIKLQktbWtkaXJoaWVyICQoYmluZGlyKQotCS1ta2RpcmhpZXIgJChsaWJkaXIpCisJWyAtZCAkKGJpbmRpcikgXSB8fCAkKE1LRElSKSAkKGJpbmRpcikKIAkkKElOU1RBTExfUFJPR1JBTSkgd2luZSAkKGJpbmRpcikvd2luZQotCSQoSU5TVEFMTF9EQVRBKSB3aW5lLnN5bSAkKGxpYmRpcikvd2luZS5zeW0KIAkkKElOU1RBTExfUFJPR1JBTSkgbG9hZGVyL2Rvcy9kb3Ntb2QgJChiaW5kaXIpL2Rvc21vZAogCit1bmluc3RhbGxfZW11OiB1bmluc3RhbGxfbGliCisJJChSTSkgJChiaW5kaXIpL3dpbmUgJChiaW5kaXIpL2Rvc21vZAorCiBpbnN0YWxsX2xpYjogaW5zdGFsbF9pbmNsdWRlcworCVsgLWQgJChsaWJkaXIpIF0gfHwgJChNS0RJUikgJChsaWJkaXIpCiAJJChJTlNUQUxMX0RBVEEpICQoTElCX1RBUkdFVCkgJChsaWJkaXIpCisJJChJTlNUQUxMX0RBVEEpIHdpbmUuc3ltICQobGliZGlyKS93aW5lLnN5bQorCit1bmluc3RhbGxfbGliOiB1bmluc3RhbGxfaW5jbHVkZXMKKwljZCAkKGxpYmRpcik7ICQoUk0pICQoTElCX1RBUkdFVCkKKwkkKFJNKSAkKGxpYmRpcikvd2luZS5zeW0KIAogaW5zdGFsbF9pbmNsdWRlczogZHVtbXkKLQlpZiBbIC1kICQoaW5jbHVkZWRpcikgXTsgdGhlbiA6IDsgZWxzZSAkKE1LRElSKSAkKGluY2x1ZGVkaXIpOyBmaSAKKwlbIC1kICQoaW5jbHVkZWRpcikgXSB8fCAkKE1LRElSKSAkKGluY2x1ZGVkaXIpCiAJY2QgJChUT1BTUkNESVIpL2luY2x1ZGU7ICQoSU5TVEFMTF9EQVRBKSB3aW5kb3dzLmggd2ludHlwZXMuaCAkKGluY2x1ZGVkaXIpCiAKKyMgRG9uJ3QganVzdCBkbyBhIHJtIC1yZiBvbiAkKGluY2x1ZGVkaXIpIC0tIGRvbid0IHdhbnQgdG8gd2lwZSBvdXQgCisjIGFueXRoaW5nIGV4dHJhIHRoZSB1c2VyIG1heSBoYXZlIHB1dCB0aGVyZS4KK3VuaW5zdGFsbF9pbmNsdWRlczogZHVtbXkKKwkkKFJNKSAkKGluY2x1ZGVkaXIpL3dpbmRvd3MuaCAkKGluY2x1ZGVkaXIpL3dpbnR5cGVzLmgKKwktcm1kaXIgJChpbmNsdWRlZGlyKQorCiAkKEFMTFNVQkRJUlMpOiBkdW1teQogCUBjZCAkQDsgJChTVUJNQUtFKQogCiBpbnN0YWxsX3Byb2dyYW1zOiBkdW1teQogCUBjZCBwcm9ncmFtczsgJChTVUJNQUtFKSBpbnN0YWxsCiAKK3VuaW5zdGFsbF9wcm9ncmFtczogZHVtbXkKKwlAY2QgcHJvZ3JhbXM7ICQoU1VCTUFLRSkgdW5pbnN0YWxsCisKIGluc3RhbGw6OgogCWZvciBpIGluICQoSU5TVEFMTFNVQkRJUlMpOyBkbyAoY2QgJCRpICYmICQoTUFLRSkgaW5zdGFsbCkgfHwgZXhpdCAxOyBkb25lCiAKK3VuaW5zdGFsbDo6CisJZm9yIGkgaW4gJChJTlNUQUxMU1VCRElSUyk7IGRvIChjZCAkJGkgJiYgJChNQUtFKSB1bmluc3RhbGwpIHx8IGV4aXQgMTsgZG9uZQorCiBkZXBlbmQ6OiBkdW1teQogCWZvciBpIGluICQoREVQRU5EU1VCRElSUyk7IGRvIChjZCAkJGkgJiYgJChNQUtFKSBkZXBlbmQpIHx8IGV4aXQgMTsgZG9uZQogCmRpZmYgLS1naXQgYS9jb25maWd1cmUgYi9jb25maWd1cmUKaW5kZXggODQwOTM4ZS4uNGM2ZjQ0YyAxMDA3NTUKLS0tIGEvY29uZmlndXJlCisrKyBiL2NvbmZpZ3VyZQpAQCAtMzM5Niw2ICszMzk2LDggQEAKIE1ha2VmaWxlCiBjb250cm9scy9NYWtlZmlsZQogZGVidWdnZXIvTWFrZWZpbGUKK2RsbHMvTWFrZWZpbGUKK2RsbHMvc2hlbGwzMi9NYWtlZmlsZQogZG9jdW1lbnRhdGlvbi9NYWtlZmlsZQogZmlsZXMvTWFrZWZpbGUKIGdyYXBoaWNzL01ha2VmaWxlCkBAIC0zNTMxLDYgKzM1MzMsOCBAQAogTWFrZWZpbGUKIGNvbnRyb2xzL01ha2VmaWxlCiBkZWJ1Z2dlci9NYWtlZmlsZQorZGxscy9NYWtlZmlsZQorZGxscy9zaGVsbDMyL01ha2VmaWxlCiBkb2N1bWVudGF0aW9uL01ha2VmaWxlCiBmaWxlcy9NYWtlZmlsZQogZ3JhcGhpY3MvTWFrZWZpbGUKZGlmZiAtLWdpdCBhL2NvbmZpZ3VyZS5pbiBiL2NvbmZpZ3VyZS5pbgppbmRleCAxOTczMWRmLi5jZjFkNDE0IDEwMDY0NAotLS0gYS9jb25maWd1cmUuaW4KKysrIGIvY29uZmlndXJlLmluCkBAIC00NjAsNiArNDYwLDggQEAKIE1ha2VmaWxlCiBjb250cm9scy9NYWtlZmlsZQogZGVidWdnZXIvTWFrZWZpbGUKK2RsbHMvTWFrZWZpbGUKK2RsbHMvc2hlbGwzMi9NYWtlZmlsZQogZG9jdW1lbnRhdGlvbi9NYWtlZmlsZQogZmlsZXMvTWFrZWZpbGUKIGdyYXBoaWNzL01ha2VmaWxlCmRpZmYgLS1naXQgYS9jb250cm9scy9jb21jdGwzMnVuZG9jLmMgYi9jb250cm9scy9jb21jdGwzMnVuZG9jLmMKaW5kZXggNzAyNzk2MC4uYWE1YzgzZCAxMDA2NDQKLS0tIGEvY29udHJvbHMvY29tY3RsMzJ1bmRvYy5jCisrKyBiL2NvbnRyb2xzL2NvbWN0bDMydW5kb2MuYwpAQCAtMiw3ICsyLDcgQEAKICAqIFVuZG9jdW1lbnRlZCBmdW5jdGlvbnMgZnJvbSBDT01DVEwzMi5ETEwKICAqCiAgKiBDb3B5cmlnaHQgMTk5OCBFcmljIEtvaGwgPGVrb2hsQGFiby5yaGVpbi16ZWl0dW5nLmRlPgotICoKKyAqICAgICAgICAgICAxOTk4IEp1ZXJnZW4gU2NobWllZCA8ai5zY2htaWVkQG1ldHJvbmV0LmRlPgogICogTk9URVMKICAqICAgICBBbGwgb2YgdGhlc2UgZnVuY3Rpb25zIGFyZSBVTkRPQ1VNRU5URUQhISBBbmQgSSBtZWFuIFVORE9DVU1FTlRFRCEhISEKICAqICAgICBEbyBOT1QgcmVseSBvbiBuYW1lcyBvciBjb250ZW50cyBvZiB1bmRvY3VtZW50ZWQgc3RydWN0dXJlcyBhbmQgdHlwZXMhISEKQEAgLTIyLDE3ICsyMiw2IEBACiAjaW5jbHVkZSAiaGVhcC5oIgogI2luY2x1ZGUgImRlYnVnLmgiCiAKLQotdHlwZWRlZiBzdHJ1Y3QgX0RTQV9EQVRBCi17Ci0gICAgRFdPUkQgICBkd0VudHJ5Q291bnQ7Ci0gICAgRFdPUkQgICBkd01heENvdW50OwotICAgIERXT1JEICAgZHdJbml0aWFsOwotICAgIERXT1JEICAgZHdHcm93OwotICAgIExQU1RSICAgKnB0cnM7Ci19IERTQV9EQVRBLCAqTFBEU0FfREFUQTsKLQotCiB0eXBlZGVmIHN0cnVjdCBfRFBBX0RBVEEKIHsKICAgICBEV09SRCAgIGR3RW50cnlDb3VudDsKQEAgLTQ3LDIyICszNiwzMCBAQAogRFdPUkQgV0lOQVBJIERQQV9JbnNlcnRQdHIgKERXT1JELCBEV09SRCwgRFdPUkQpOwogCiAKLQotCitDUklUSUNBTF9TRUNUSU9OIGNzX2NvbWN0bF9hbGxvYzsKK0hBTkRMRTMyIGhDb21jdGwzMkhlYXA9MDsKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogQWxsb2MgW0NPTUNUTDMyLjcxXQogICoKICAqLwogCi1MUFZPSUQgV0lOQVBJCi1DT01DVEwzMl9BbGxvYyAoRFdPUkQgZHdQYXJhbSkKLXsKLSAgICBMUFZPSUQgbHBQdHI7CitMUFZPSUQgV0lOQVBJIENPTUNUTDMyX0FsbG9jIChEV09SRCBkd1BhcmFtKQoreyAgIExQVk9JRCBscFB0cjsKIAotICAgIGxwUHRyID0gSGVhcEFsbG9jIChHZXRQcm9jZXNzSGVhcCAoKSwgSEVBUF9aRVJPX01FTU9SWSwgZHdQYXJhbSk7CisgICAgVFJBQ0UgKGNvbW1jdHJsLCAiKDB4JTA4bHgpXG4iLCBkd1BhcmFtKTsKIAotICAgIFRSQUNFIChjb21tY3RybCwgIigweCUwOGx4KSByZXQ9MHglMDhseFxuIiwgZHdQYXJhbSwgKERXT1JEKWxwUHRyKTsKKwlpZiAoaENvbWN0bDMySGVhcD09MCkKKwl7IEVudGVyQ3JpdGljYWxTZWN0aW9uKCh2b2lkKikmY3NfY29tY3RsX2FsbG9jKTsKKyAgICAgIGhDb21jdGwzMkhlYXA9SGVhcENyZWF0ZSgwLDEsMHg0MDAwMDAwKTsKKyAgICAgIExlYXZlQ3JpdGljYWxTZWN0aW9uKCh2b2lkKikmY3NfY29tY3RsX2FsbG9jKTsKKyAgICAgIFRSQUNFIChjb21tY3RybCwgIkhlYXAgY3JlYXRlZDogMHglMDh4XG4iLCBoQ29tY3RsMzJIZWFwKTsKKyAgICAgIGlmICghIGhDb21jdGwzMkhlYXApCisgICAgICAgIHJldHVybiBGQUxTRTsgICAgICAgIAorCX0KIAorLy8gICAgbHBQdHIgPSBIZWFwQWxsb2MgKEdldFByb2Nlc3NIZWFwKCksIEhFQVBfWkVST19NRU1PUlksIGR3UGFyYW0pOworICAgIGxwUHRyID0gSGVhcEFsbG9jIChoQ29tY3RsMzJIZWFwLCBIRUFQX1pFUk9fTUVNT1JZLCBkd1BhcmFtKTsKKyAgICBUUkFDRSAoY29tbWN0cmwsICItLSByZXQ9JXBcbiIsIGxwUHRyKTsKICAgICByZXR1cm4gbHBQdHI7CiB9CiAKQEAgLTc2LDE2ICs3MywxNiBAQAogQ09NQ1RMMzJfUmVBbGxvYyAoTFBWT0lEIGR3UGFyYW0xLCBEV09SRCBkd1BhcmFtMikKIHsKICAgICBMUFZPSUQgZHdQdHI7Ci0KKyAgICBUUkFDRSAoY29tbWN0cmwsICIoMHglMDhseCAweCUwOGx4KVxuIiwoRFdPUkQpZHdQYXJhbTEsIGR3UGFyYW0yKTsKKyAgICAKICAgICBpZiAoZHdQYXJhbTEgPT0gMCkKLQlkd1B0ciA9IEhlYXBBbGxvYyAoR2V0UHJvY2Vzc0hlYXAgKCksIEhFQVBfWkVST19NRU1PUlksCisJZHdQdHIgPSBIZWFwQWxsb2MgKGhDb21jdGwzMkhlYXAsIEhFQVBfWkVST19NRU1PUlksCiAJCQkgICBkd1BhcmFtMik7CiAgICAgZWxzZQotCWR3UHRyID0gSGVhcFJlQWxsb2MgKEdldFByb2Nlc3NIZWFwICgpLCBIRUFQX1pFUk9fTUVNT1JZLAorCWR3UHRyID0gSGVhcFJlQWxsb2MgKGhDb21jdGwzMkhlYXAsIEhFQVBfWkVST19NRU1PUlksCiAJCQkgICAgIGR3UGFyYW0xLCBkd1BhcmFtMik7CiAKLSAgICBUUkFDRSAoY29tbWN0cmwsICIoMHglMDhseCAweCUwOGx4KSByZXQ9MHglMDhseFxuIiwKLQkgICAoRFdPUkQpZHdQYXJhbTEsIGR3UGFyYW0yLCAoRFdPUkQpZHdQdHIpOworICAgIFRSQUNFIChjb21tY3RybCwgIi0tIHJldD0weCUwOGx4XG4iLCAoRFdPUkQpZHdQdHIpOwogCiAgICAgcmV0dXJuIGR3UHRyOwogfQpAQCAtMTAwLDcgKzk3LDcgQEAKIENPTUNUTDMyX0ZyZWUgKExQVk9JRCBkd1BhcmFtKQogewogICAgIFRSQUNFIChjb21tY3RybCwgIigweCUwOGx4KVxuIiwgKERXT1JEKWR3UGFyYW0pOwotICAgIEhlYXBGcmVlIChHZXRQcm9jZXNzSGVhcCAoKSwgMCwgZHdQYXJhbSk7CisgICAgSGVhcEZyZWUgKGhDb21jdGwzMkhlYXAsIDAsIGR3UGFyYW0pOwogCiAgICAgcmV0dXJuIDA7CiB9CkBAIC0xMTUsNyArMTEyLDcgQEAKIENPTUNUTDMyX0dldFNpemUgKExQVk9JRCBkd1BhcmFtKQogewogICAgIFRSQUNFIChjb21tY3RybCwgIigweCUwOGx4KVxuIiwgKERXT1JEKWR3UGFyYW0pOwotICAgIHJldHVybiAoSGVhcFNpemUgKEdldFByb2Nlc3NIZWFwICgpLCAwLCBkd1BhcmFtKSk7CisgICAgcmV0dXJuIChIZWFwU2l6ZSAoaENvbWN0bDMySGVhcCwgMCwgZHdQYXJhbSkpOwogfQogCiAKQEAgLTE1NSwyMTcgKzE1MiwyODMgQEAKICAgICByZXR1cm4gRkFMU0U7CiB9CiAKLQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogVGhlIERTQS1BUEkgaXMgYSBzZXQgb2YgZnVuY3Rpb25zIHRvIGNyZWF0ZSBhbmQgbWFuaXB1bGF0ZSBhcnJheXMgb2YKKyogZml4IHNpemVkIG1lbW9yeSBibG9ja3MuIFRoaXMgYXJyYXlzIGNhbiBzdG9yZSBhbnkga2luZCBvZiBkYXRhIChzdHJpbmdzLAorKiBpY29ucy4uLikgc28gdGhlIG5hbWUgImR5bmFtaWMgc3RyaW5nIGFycmF5IiBpcyBhIGJpdCBtaXNsZWFkaW5nLgorKgorKiBTVEFUVVMgCisqICBjb21wbGV0ZQorKi8KK3R5cGVkZWYgc3RydWN0IF9EU0FfREFUQQoreyAgIERXT1JEICAgZHdFbnRyeUNvdW50OworICAgIEJZVEUgICAgKiBwRGF0YTsKKyAgICBEV09SRCAgIGR3TWF4Q291bnQ7CisgICAgRFdPUkQgICBkd0VsZW1lbnRTaXplOworICAgIERXT1JEICAgZHdHcm93OworfSBEU0FfREFUQSwgKkxQRFNBX0RBVEE7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogRFNBX0NyZWF0ZSBbQ09NQ1RMMzIuMzIwXSBDcmVhdGVzIGEgZHluYW1pYyBzdHJpbmcgYXJyYXkKICAqCiAgKiBQQVJBTVMKLSAqICAgICBkd1BhcmFtMSBbSV0KLSAqICAgICBkd1BhcmFtMiBbSV0KKyAqICAgICBkd1NpemUgW0ldIHNpemUgb2YgdGhlIGFycmF5IGVsZW1lbnRzCisgKiAgICAgZHdHcm93IFtJXSAKKyAqIFJFVFVSTlMKKyAqICAgICBwb2ludGVyIHRvIGEgYXJyYXkgY29udHJvbCBzdHJ1Y3R1cmUuIHVzZSB0aGlzIGxpa2UgYSBoYW5kbGUuCiAgKi8KIAotRFdPUkQgV0lOQVBJCi1EU0FfQ3JlYXRlIChEV09SRCBkd1BhcmFtMSwgRFdPUkQgZHdQYXJhbTIpCi17Ci0gICAgTFBEU0FfREFUQSBkc2FQdHI7CitMUERTQV9EQVRBIFdJTkFQSSBEU0FfQ3JlYXRlIChEV09SRCBkd1NpemUsIERXT1JEIGR3R3JvdykKK3sgICBMUERTQV9EQVRBIGRzYVB0cjsKIAotICAgIGRzYVB0ciA9IChMUERTQV9EQVRBKUhlYXBBbGxvYyAoR2V0UHJvY2Vzc0hlYXAgKCksIEhFQVBfWkVST19NRU1PUlksCi0JCQkJICAgIHNpemVvZihEU0FfREFUQSkpOwotICAgIGRzYVB0ci0+ZHdJbml0aWFsID0gZHdQYXJhbTE7Ci0gICAgZHNhUHRyLT5kd0dyb3cgPSBkd1BhcmFtMjsKKyAgICBUUkFDRSAoY29tbWN0cmwsICIoc2l6ZT0weCUwOGx4IGdyb3c9MHglMDhseClcbiIsIGR3U2l6ZSwgZHdHcm93KTsKIAotICAgIFRSQUNFIChjb21tY3RybCwgIigweCUwOGx4IDB4JTA4bHgpIHJldD0weCUwOGx4XG4iLAotCSAgIGR3UGFyYW0xLCBkd1BhcmFtMiwgKERXT1JEKWRzYVB0cik7Ci0KLSAgICByZXR1cm4gKERXT1JEKWRzYVB0cjsKKyAgICBpZiAoKGRzYVB0cj0oTFBEU0FfREFUQSlDT01DVEwzMl9BbGxvYyhzaXplb2YoRFNBX0RBVEEpKSkpOworICAgIHsgIGRzYVB0ci0+ZHdFbnRyeUNvdW50PTB4MDA7CisgICAgICAgZHNhUHRyLT5wRGF0YT1OVUxMOworICAgICAgIGRzYVB0ci0+ZHdNYXhDb3VudD0weDAwOworICAgICAgIGRzYVB0ci0+ZHdFbGVtZW50U2l6ZT1kd1NpemU7CisgICAgICAgaWYgKCBkd0dyb3cgPT0gMCApCisgICAgICAgICBkc2FQdHItPmR3R3Jvdz0xOworICAgICAgIGVsc2UKKyAgICAgICAgIGRzYVB0ci0+ZHdHcm93PWR3R3JvdzsKKyAgICAgICByZXR1cm4gZHNhUHRyOworICAgIH0KKyAgICByZXR1cm4gRkFMU0U7ICAgCiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBEU0FfRGVzdHJveSBbQ09NQ1RMMzIuMzIxXSBEZXN0cm95cyBhIGR5bmFtaWMgc3RyaW5nIGFycmF5CiAgKgogICogUEFSQU1TCi0gKiAgICAgZHdQYXJhbTEgW0ldCisgKiAgICAgZHNhUHRyIFtJXSBwb2ludGVyIHRvIHRoZSBhcnJheSBjb250cm9sIHN0cnVjdHVyZQorICogUkVUVVJOUworICogIFRSVUUgaWYgZHNhUHRyID0gTlVMTCBvciBzdWNjZXNzCisgKiAgRkFMU0UgaWYgZmFpbHVyZQogICovCiAKLURXT1JEIFdJTkFQSQotRFNBX0Rlc3Ryb3kgKERXT1JEIGR3UGFyYW0xKQotewotICAgIExQRFNBX0RBVEEgZHNhUHRyID0gKExQRFNBX0RBVEEpZHdQYXJhbTE7Ci0gICAgRFdPUkQgaTsKK0JPT0wzMiBXSU5BUEkgRFNBX0Rlc3Ryb3kgKGNvbnN0IExQRFNBX0RBVEEgZHNhUHRyICkKK3sgICBUUkFDRSAoY29tbWN0cmwsICIoJXApXG4iLCBkc2FQdHIpOwogCi0gICAgVFJBQ0UgKGNvbW1jdHJsLCAiKDB4JTA4bHgpOnNlbWktc3R1YiFcbiIsIGR3UGFyYW0xKTsKKwlpZiAoISBkc2FQdHIpCisgICAgICByZXR1cm4gRkFMU0U7CiAKLSAgICBpZiAoZHNhUHRyLT5wdHJzKSB7Ci0JZm9yIChpID0gMDsgaSA8IGRzYVB0ci0+ZHdFbnRyeUNvdW50OyBpKyspIHsKLQkgICAgaWYgKGRzYVB0ci0+cHRyc1tpXSkKLQkJSGVhcEZyZWUgKEdldFByb2Nlc3NIZWFwICgpLCAwLCAoTFBTVFIpZHNhUHRyLT5wdHJzW2ldKTsKLQl9CisgICAgaWYgKGRzYVB0ci0+cERhdGEgJiYgKCEgQ09NQ1RMMzJfRnJlZShkc2FQdHItPnBEYXRhKSkpCisgICAgeyByZXR1cm4gRkFMU0U7CiAgICAgfQotCi0gICAgSGVhcEZyZWUgKEdldFByb2Nlc3NIZWFwICgpLCAwLCBkc2FQdHIpOwotCi0gICAgcmV0dXJuIDA7CisgICAgcmV0dXJuIENPTUNUTDMyX0ZyZWUgKGRzYVB0cik7CiB9CiAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRFNBX0dldEl0ZW0gW0NPTUNUTDMyLjMyMl0gCisgKgorICogUEFSQU1TCisgKiAgZHNhUHRyIFtJXSBwb2ludGVyIHRvIHRoZSBhcnJheSBjb250cm9sIHN0cnVjdHVyZQorICogIGR3SXRlbSBbSV0gbnVtYmVyIG9mIHRoZSBJdGVtIHRvIGdldAorKyAqICBwRGVzdCAgW09dIGRlc3RpbmF0aW9uIGJ1ZmZlci4gSGFzIHRvIGJlID49IGR3RWxlbWVudFNpemUuCisgKi8KIAotRFdPUkQgV0lOQVBJCi1EU0FfR2V0SXRlbSAoRFdPUkQgZHdQYXJhbTEsIERXT1JEIGR3UGFyYW0yLCBEV09SRCBkd1BhcmFtMykKLXsKLSAgICBMUERTQV9EQVRBIGRzYVB0ciA9IChMUERTQV9EQVRBKWR3UGFyYW0xOworQk9PTDMyIFdJTkFQSSBEU0FfR2V0SXRlbSAoY29uc3QgTFBEU0FfREFUQSBkc2FQdHIsIERXT1JEIGR3SXRlbSwgTFBCWVRFIHBEZXN0KQoreyAgIEJZVEUgKiBwU3JjOwogCi0gICAgRklYTUUgKGNvbW1jdHJsLCAiKDB4JTA4bHggMHglMDhseCAweCUwOGx4KTogc3R1YiFcbiIsCi0JICAgZHdQYXJhbTEsIGR3UGFyYW0yLCBkd1BhcmFtMyk7Ci0KLSAgICBpZiAoZHNhUHRyID09IE5VTEwpCi0JcmV0dXJuIDA7Ci0gICAgaWYgKGRzYVB0ci0+cHRycyA9PSBOVUxMKQotCXJldHVybiAwOwotICAgIGlmICgoZHdQYXJhbTIgPCAwKSB8fCAoZHdQYXJhbTIgPj0gZHNhUHRyLT5kd0VudHJ5Q291bnQpKQotCXJldHVybiAwOwotCi0vLyAgICBGSVhNRSAoY29tbWN0cmwsICJcIiVzXCJcbiIsIChMUFNUUilkc2FQdHItPnB0cnNbZHdQYXJhbTJdKTsKLQotICAgIHJldHVybiAoRFdPUkQpbHN0cmNweTMyQSAoKExQU1RSKWR3UGFyYW0zLCAoTFBTVFIpZHNhUHRyLT5wdHJzW2R3UGFyYW0yXSk7CisgICAgVFJBQ0UgKGNvbW1jdHJsLCAiKCVwIDB4JTA4bHggJXApXG4iLCBkc2FQdHIsIGR3SXRlbSwgcERlc3QpOworICAgIAorICAgIGlmICggKCFkc2FQdHIpIHx8IChkd0l0ZW0gPCAwKSB8fCAoZHdJdGVtID49IGRzYVB0ci0+ZHdFbnRyeUNvdW50KSkKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICAKKyAgICBwU3JjID0gZHNhUHRyLT5wRGF0YSArIChkc2FQdHItPmR3RWxlbWVudFNpemUgKiBkd0l0ZW0pOworICAgIG1lbW1vdmUocERlc3QscFNyYyxkc2FQdHItPmR3RWxlbWVudFNpemUpOworICAgIHJldHVybiBUUlVFOwogfQogCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIERTQV9HZXRJdGVtUHRyIFtDT01DVEwzMi4zMjNdIAorICoKKyAqIFBBUkFNUworICogIGRzYVB0ciBbSV0gcG9pbnRlciB0byB0aGUgYXJyYXkgY29udHJvbCBzdHJ1Y3R1cmUKKyAqICBkd0l0ZW0gW0ldIG51bWJlciBvZiB0aGUgSXRlbSB0byBnZXQKKyAqIFJFVFVSTlMKKyAqICBwb2ludGVyIHRpIGEgaXRlbSAKKyAqLworTFBCWVRFIFdJTkFQSSBEU0FfR2V0SXRlbVB0ciAoY29uc3QgTFBEU0FfREFUQSBkc2FQdHIsIERXT1JEIGR3SXRlbSkKK3sgICBCWVRFICogcFNyYzsKIAotRFdPUkQgV0lOQVBJCi1EU0FfR2V0SXRlbVB0ciAoRFdPUkQgZHdQYXJhbTEsIERXT1JEIGR3UGFyYW0yKQotewotICAgIExQRFNBX0RBVEEgZHNhUHRyID0gKExQRFNBX0RBVEEpZHdQYXJhbTE7CisJVFJBQ0UgKGNvbW1jdHJsLCAiKCVwIDB4JTA4bHgpXG4iLCBkc2FQdHIsIGR3SXRlbSk7CiAKLSAgICBUUkFDRSAoY29tbWN0cmwsICIoMHglMDhseCAweCUwOGx4KVxuIiwgZHdQYXJhbTEsIGR3UGFyYW0yKTsKKyAgICBpZiAoKCFkc2FQdHIpIHx8IChkd0l0ZW0gPCAwKSB8fCAoZHdJdGVtID49IGRzYVB0ci0+ZHdFbnRyeUNvdW50KSkKKwkgIHJldHVybiBGQUxTRTsKKyAgICBwU3JjID0gZHNhUHRyLT5wRGF0YSArIChkc2FQdHItPmR3RWxlbWVudFNpemUgKiBkd0l0ZW0pOworICAgIAorICAgIFRSQUNFIChjb21tY3RybCwgIi0tIHJldD0lcFxuIiwgcFNyYyk7CiAKLSAgICBpZiAoZHNhUHRyID09IE5VTEwpCi0JcmV0dXJuIDA7Ci0gICAgaWYgKGRzYVB0ci0+cHRycyA9PSBOVUxMKQotCXJldHVybiAwOwotICAgIGlmICgoZHdQYXJhbTIgPCAwKSB8fCAoZHdQYXJhbTIgPj0gZHNhUHRyLT5kd0VudHJ5Q291bnQpKQotCXJldHVybiAwOwotCi0gICAgVFJBQ0UgKGNvbW1jdHJsLCAicmV0PTB4JTA4bHhcbiIsIChEV09SRClkc2FQdHItPnB0cnNbZHdQYXJhbTJdKTsKLQotICAgIHJldHVybiAoRFdPUkQpZHNhUHRyLT5wdHJzW2R3UGFyYW0yXTsKKyAgICByZXR1cm4gIHBTcmM7CiB9CiAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRFNBX1NldEl0ZW0gW0NPTUNUTDMyLjMyNV0gCisgKgorICogUEFSQU1TCisgKiAgZHNhUHRyIFtJXSBwb2ludGVyIHRvIHRoZSBhcnJheSBjb250cm9sIHN0cnVjdHVyZQorICogIGR3SXRlbSBbSV0gaW5kZXggZm9yIHRoZSBuZXcgZWxlbWVudAorICogIHBTcmMgICBbSV0gdGhlIGVsZW1lbnQKKyAqLworQk9PTDMyIFdJTkFQSSBEU0FfU2V0SXRlbSAoY29uc3QgTFBEU0FfREFUQSBkc2FQdHIsIERXT1JEIGR3SXRlbSwgTFBCWVRFIHBTcmMpCit7ICAgTFBCWVRFIHBEZXN0OworIAlEV09SRCAgZHdTaXplLCBkd05ld0l0ZW1zOworCUxQQllURSBscFRlbXA7CisgICAgCisgICAgVFJBQ0UgKGNvbW1jdHJsLCAiKCVwIDB4JTA4bHggJXApXG4iLCBkc2FQdHIsIGR3SXRlbSwgcFNyYyk7CiAKLURXT1JEIFdJTkFQSQotRFNBX0luc2VydEl0ZW0gKERXT1JEIGR3UGFyYW0xLCBEV09SRCBkd1BhcmFtMiwgTFBTVFIgbHBTdHJpbmcpCi17Ci0gICAgTFBEU0FfREFUQSBkc2FQdHIgPSAoTFBEU0FfREFUQSlkd1BhcmFtMTsKLSAgICBEV09SRCBkd0luZGV4OwotICAgIElOVDMyIGxlbjsKLQotICAgIFRSQUNFIChjb21tY3RybCwgIigweCUwOGx4IDB4JTA4bHggXCIlc1wiKTpzZW1pLXN0dWIhXG4iLAotCSAgIGR3UGFyYW0xLCBkd1BhcmFtMiwgbHBTdHJpbmcpOwotCi0gICAgaWYgKGRzYVB0ci0+cHRycyA9PSBOVUxMKSB7Ci0JZHNhUHRyLT5wdHJzID0gKExQU1RSKilIZWFwQWxsb2MgKEdldFByb2Nlc3NIZWFwICgpLCBIRUFQX1pFUk9fTUVNT1JZLAotCQkJCQkgIGRzYVB0ci0+ZHdJbml0aWFsICogc2l6ZW9mKExQVk9JRCkpOwotCWRzYVB0ci0+ZHdNYXhDb3VudCA9IGRzYVB0ci0+ZHdJbml0aWFsOwotICAgICAgICBkd0luZGV4ID0gMDsKLQlsZW4gPSBsc3RybGVuMzJBIChscFN0cmluZyk7Ci0JZHNhUHRyLT5wdHJzW2R3SW5kZXhdID0KLQkgICAgKExQU1RSKUhlYXBBbGxvYyAoR2V0UHJvY2Vzc0hlYXAgKCksIEhFQVBfWkVST19NRU1PUlksIGxlbisxKTsKLQlsc3RyY3B5MzJBIChkc2FQdHItPnB0cnNbZHdJbmRleF0sIGxwU3RyaW5nKTsKKwlpZiAoKCFkc2FQdHIpIHx8IGR3SXRlbTwwICkKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgIAorICAgIGlmIChkc2FQdHItPmR3RW50cnlDb3VudCA8PSBkd0l0ZW0pCS8qIHdpdGhpbiB0aGUgb2xkIGFycmF5ICovCisgICAgeyBpZiAoIGRzYVB0ci0+ZHdNYXhDb3VudCA+IGR3SXRlbSkgCisgICAgICB7IGRzYVB0ci0+ZHdFbnRyeUNvdW50ID0gZHdJdGVtOyAvKiB3aXRoaW4gdGhlIGFsbG9jYXRlZCBzcGFjZSwgc2V0IGEgbmV3IGJvdW5kYXJ5ICovCisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7IC8qIHJlc2l6ZSB0aGUgYmxvY2sgb2YgbWVtb3J5Ki8KKyAgICAgICAgZHdOZXdJdGVtcyA9IGRzYVB0ci0+ZHdHcm93ICogKCAoV09SRCkoKGR3SXRlbS0xKS9kc2FQdHItPmR3R3JvdykgKzEpOworICAgICAgICBkd1NpemUgPSBkc2FQdHItPmR3RWxlbWVudFNpemUgKiBkd05ld0l0ZW1zOworICAgICAgICBscFRlbXAgPSAoTFBCWVRFKSBDT01DVEwzMl9SZUFsbG9jKGRzYVB0ci0+cERhdGEsZHdTaXplKTsKKyAgICAgICAgaWYgKCEgbHBUZW1wICkKKyAgICAgICAgeyByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgZHNhUHRyLT5kd01heENvdW50ID0gZHdOZXdJdGVtczsKKyAgICAgICAgZHNhUHRyLT5wRGF0YSA9IGxwVGVtcDsgICAgICAgIAorICAgICAgfSAgICAKICAgICB9Ci0gICAgZWxzZSB7Ci0JVFJBQ0UgKGNvbW1jdHJsLCAiKDB4JTA4bHggMHglMDhseClcbiIsCi0JICAgICAgIGRzYVB0ci0+ZHdFbnRyeUNvdW50LCBkc2FQdHItPmR3TWF4Q291bnQpOwotCWlmIChkd1BhcmFtMiA+PSBkc2FQdHItPmR3RW50cnlDb3VudCkgewotCSAgICBpZiAoZHNhUHRyLT5kd0VudHJ5Q291bnQgPCBkc2FQdHItPmR3TWF4Q291bnQpIHsKLQkJZHdJbmRleCA9IGRzYVB0ci0+ZHdFbnRyeUNvdW50OwotCQlsZW4gPSBsc3RybGVuMzJBIChscFN0cmluZyk7Ci0JCWRzYVB0ci0+cHRyc1tkd0luZGV4XSA9Ci0JCSAgICAoTFBTVFIpSGVhcEFsbG9jIChHZXRQcm9jZXNzSGVhcCAoKSwgSEVBUF9aRVJPX01FTU9SWSwgbGVuKzEpOwotCQlsc3RyY3B5MzJBIChkc2FQdHItPnB0cnNbZHdJbmRleF0sIGxwU3RyaW5nKTsKLQkgICAgfQotCSAgICBlbHNlIHsKLQkJLyogYWxsb2NhdGUgbmV3IHBvaW50ZXIgbGlzdCBhbmQgY29weSBhbGwgcG9pbnRlcnMgKi8KLQkJTFBTVFIgKmxwT2xkUHRycyA9IGRzYVB0ci0+cHRyczsKLQkJZHNhUHRyLT5wdHJzID0gKExQU1RSKilIZWFwQWxsb2MgKFN5c3RlbUhlYXAsIEhFQVBfWkVST19NRU1PUlksCi0JCQkJKGRzYVB0ci0+ZHdJbml0aWFsICsgZHNhUHRyLT5kd0dyb3cpICoKLQkJCQlzaXplb2YoTFBWT0lEKSk7Ci0JCW1lbWNweSAoZHNhUHRyLT5wdHJzLCBscE9sZFB0cnMsCi0JCQlkc2FQdHItPmR3TWF4Q291bnQgKiBzaXplb2YoTFBWT0lEKSk7Ci0JCWRzYVB0ci0+ZHdNYXhDb3VudCArPSBkc2FQdHItPmR3R3JvdzsKLQkJSGVhcEZyZWUgKEdldFByb2Nlc3NIZWFwICgpLCAwLCBscE9sZFB0cnMpOworCS8qIHB1dCB0aGUgbmV3IGVudHJ5IGluICovCisJcERlc3QgPSBkc2FQdHItPnBEYXRhICsgIChkc2FQdHItPmR3RWxlbWVudFNpemUgKiBkd0l0ZW0pOworICAgIFRSQUNFIChjb21tY3RybCwibW92ZSBkZXN0PSVwIHNyYz0lcCBzaXplPSV4IixwRGVzdCxwU3JjLGRzYVB0ci0+ZHdFbGVtZW50U2l6ZSk7CisJbWVtbW92ZShwRGVzdCxwU3JjLGRzYVB0ci0+ZHdFbGVtZW50U2l6ZSk7CisgICAgcmV0dXJuIFRSVUU7Cit9CiAKLQkJLyogYWRkIG5ldyBzdHJpbmcgKi8KLQkJZHdJbmRleCA9IGRzYVB0ci0+ZHdFbnRyeUNvdW50OwotCQlsZW4gPSBsc3RybGVuMzJBIChscFN0cmluZyk7Ci0JCWRzYVB0ci0+cHRyc1tkd0luZGV4XSA9Ci0JCSAgICAoTFBTVFIpSGVhcEFsbG9jIChHZXRQcm9jZXNzSGVhcCAoKSwgSEVBUF9aRVJPX01FTU9SWSwgbGVuKzEpOwotCQlsc3RyY3B5MzJBIChkc2FQdHItPnB0cnNbZHdJbmRleF0sIGxwU3RyaW5nKTsKLQkgICAgfQotCX0KLQllbHNlIHsKLQkgICAgRklYTUUgKGNvbW1jdHJsLCAiaW5zZXJ0aW5nISBzdHViIVxuIik7CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIERTQV9JbnNlcnRJdGVtIFtDT01DVEwzMi4zMjVdIAorICoKKyAqIFBBUkFNUworICogIGRzYVB0ciBbSV0gcG9pbnRlciB0byB0aGUgYXJyYXkgY29udHJvbCBzdHJ1Y3R1cmUKKyAqICBkd0l0ZW0gW0ldIGluZGV4IGZvciB0aGUgbmV3IGVsZW1lbnQKKyAqICBwU3JjICAgW0ldIHRoZSBlbGVtZW50CisgKgorICogUkVUVVJOUworICogIHRoZSBwb3NpdGlvbiBvZiB0aGUgbmV3IGVsZW1lbnQKKyAqLworRFdPUkQgV0lOQVBJIERTQV9JbnNlcnRJdGVtIChjb25zdCBMUERTQV9EQVRBIGRzYVB0ciwgRFdPUkQgZHdJdGVtLCBMUEJZVEUgcFNyYykKK3sJRFdPUkQgZHdOZXdJdGVtcywgZHdTaXplLGk7CisJTFBCWVRFIGxwVGVtcCwgbHBEZXN0OworICAgIExQRFdPUkQgcDsKKyAgICAKKwlUUkFDRShjb21tY3RybCwgIiglcCAweCUwOGx4ICVwKVxuIiwgZHNhUHRyLCBkd0l0ZW0sIHBTcmMpOwogCi0JICAgIGR3SW5kZXggPSBkd1BhcmFtMjsKLQl9CisJaWYgKCAoIWRzYVB0cikgfHwgZHdJdGVtPDAgKQorICAgICAgcmV0dXJuIC0xOworCisJZm9yIChpPTA7IGk8ZHNhUHRyLT5kd0VsZW1lbnRTaXplO2krPTQpCisgICAgeyBwID0gKihEV09SRCoqKShwU3JjK2kpOworICAgICAgaWYgKCBJc0JhZFN0cmluZ1B0cjMyQSAoKGNoYXIqKXAsMjU2KSkKKyAgICAgIHsgVFJBQ0UoY29tbWN0cmwsIi0tIDB4JTA0bHg9JXBcbiIsaSwoRFdPUkQqKXApOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeyBUUkFDRShjb21tY3RybCwiLS0gMHglMDRseD0lcCBbJXNdXG4iLGkscCxkZWJ1Z3N0cl9hKChjaGFyKilwKSk7CisgICAgICB9CisgICAgfQorICAgIAorICAgIGlmIChkd0l0ZW0gPiBkc2FQdHItPmR3RW50cnlDb3VudCkJCS8qIHdoZW4gZHdJdGVtID4gZHdFbnRyeUNvdW50IHRoZW4gYXBwZW5kKi8KKyAgICAgIGR3SXRlbSA9IGRzYVB0ci0+ZHdFbnRyeUNvdW50KzE7CisgICAgCisgICAgaWYgKGR3SXRlbSA+PSBkc2FQdHItPmR3TWF4Q291bnQpCQkvKiBkbyB3ZSBuZWVkIHRvIHJlc2l6ZSA/ICovCisgICAgeyBkd05ld0l0ZW1zID0gZHNhUHRyLT5kd01heENvdW50ICsgZHNhUHRyLT5kd0dyb3c7CisgICAgICBkd1NpemUgPSBkc2FQdHItPmR3RWxlbWVudFNpemUgKiBkd05ld0l0ZW1zOworCSAgbHBUZW1wID0gKExQQllURSlDT01DVEwzMl9SZUFsbG9jKGRzYVB0ci0+cERhdGEsZHdTaXplKTsKKyAgICAgIGlmICghbHBUZW1wKQorICAgICAgeyByZXR1cm4gLTE7CisgICAgICB9CisgICAgICBkc2FQdHItPmR3TWF4Q291bnQgPSBkd05ld0l0ZW1zOworICAgICAgZHNhUHRyLT5wRGF0YSA9IGxwVGVtcDsgICAgICAgICAKICAgICB9CiAKKyAgICBpZiAoZHdJdGVtIDwgZHNhUHRyLT5kd0VudHJ5Q291bnQpCQkvKiBkbyB3ZSBuZWVkIHRvIG1vdmUgZWxlbWVudHMgPyovCisJeyBscFRlbXAgPSBkc2FQdHItPnBEYXRhICsgKGRzYVB0ci0+ZHdFbGVtZW50U2l6ZSAqIGR3SXRlbSk7CisgICAgICBscERlc3QgPSBscFRlbXAgKyBkc2FQdHItPmR3RWxlbWVudFNpemU7CisgICAgICBUUkFDRSAoY29tbWN0cmwsIi0tIG1vdmUgZGVzdD0lcCBzcmM9JXAgc2l6ZT0leFxuIixscERlc3QsbHBUZW1wLGRzYVB0ci0+ZHdFbGVtZW50U2l6ZSk7CisgICAgICBtZW1tb3ZlIChscERlc3QsbHBUZW1wLGRzYVB0ci0+ZHdFbGVtZW50U2l6ZSk7CisgICAgfSAKKyAgICAvKiBvaywgd2UgY2FuIHB1dCB0aGUgbmV3IEl0ZW0gaW4qLwogICAgIGRzYVB0ci0+ZHdFbnRyeUNvdW50Kys7Ci0KLSAgICBUUkFDRSAoY29tbWN0cmwsICJyZXQ9MHglMDhseFxuIiwgZHdJbmRleCk7Ci0KLSAgICByZXR1cm4gKGR3SW5kZXgpOworICAgIGxwRGVzdCA9IGRzYVB0ci0+cERhdGEgKyAoZHNhUHRyLT5kd0VsZW1lbnRTaXplICogZHdJdGVtKTsKKyAgICBUUkFDRSAoY29tbWN0cmwsIi0tIG1vdmUgZGVzdD0lcCBzcmM9JXAgc2l6ZT0leFxuIixscERlc3QscFNyYyxkc2FQdHItPmR3RWxlbWVudFNpemUpOworCW1lbW1vdmUgKGxwRGVzdCxwU3JjLGRzYVB0ci0+ZHdFbGVtZW50U2l6ZSk7CisJcmV0dXJuIGRzYVB0ci0+ZHdFbnRyeUNvdW50OwogfQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBEU0FfRGVsZXRlSXRlbSBbQ09NQ1RMMzIuMzI2XSAKKyAqCisgKiBQQVJBTVMKKyAqICBkc2FQdHIgW0ldIHBvaW50ZXIgdG8gdGhlIGFycmF5IGNvbnRyb2wgc3RydWN0dXJlCisgKiAgZHdJdGVtIFtJXSBpbmRleCBmb3IgdGhlIGVsZW1lbnQgdG8gZGVsZXRlCisgKiBSRVRVUk5TCisgKiAgbnVtYmVyIG9mIHRoZSBlbGVtZW50IGRlbGV0ZWQKKyAqLworRFdPUkQgV0lOQVBJIERTQV9EZWxldGVJdGVtIChjb25zdCBMUERTQV9EQVRBIGRzYVB0ciwgRFdPUkQgZHdJdGVtKQorewlMUEJZVEUJbHBEZXN0LGxwU3JjOworCURXT1JECWR3U2l6ZTsKKyAgICAKKyAgICBUUkFDRSAoY29tbWN0cmwsICIoJXAgMHglMDhseClcbiIsIGRzYVB0ciwgZHdJdGVtKTsKIAorCWlmICggKCEgZHNhUHRyKSB8fCBkd0l0ZW08MCB8fCBkd0l0ZW0+PWRzYVB0ci0+ZHdFbnRyeUNvdW50KQorICAgICAgcmV0dXJuIEZBTFNFOwogCi0KLQotRFdPUkQgV0lOQVBJCi1EU0FfRGVsZXRlSXRlbSAoRFdPUkQgZHdQYXJhbTEsIERXT1JEIGR3UGFyYW0yKQotewotICAgIExQRFNBX0RBVEEgZHNhUHRyID0gKExQRFNBX0RBVEEpZHdQYXJhbTE7Ci0KLSAgICBUUkFDRSAoY29tbWN0cmwsICIoMHglMDhseCAweCUwOGx4KTpzZW1pLXN0dWIhXG4iLAotCSAgIGR3UGFyYW0xLCBkd1BhcmFtMik7Ci0KLSAgICBpZiAoZHNhUHRyLT5wdHJzKSB7Ci0JaWYgKGRzYVB0ci0+ZHdFbnRyeUNvdW50ID09IDEpIHsKLQkgICAgaWYgKGRzYVB0ci0+cHRyc1tkd1BhcmFtMl0pCi0JCUhlYXBGcmVlIChHZXRQcm9jZXNzSGVhcCAoKSwgMCwgZHNhUHRyLT5wdHJzW2R3UGFyYW0yXSk7Ci0JICAgIGRzYVB0ci0+ZHdFbnRyeUNvdW50LS07CisgICAgaWYgKCBkd0l0ZW0gPCBkc2FQdHItPmR3RW50cnlDb3VudC0xICkJLyogZG8gd2UgbmVlZCB0byBtb3ZlID8qLworCXsgbHBEZXN0ID0gZHNhUHRyLT5wRGF0YSArIChkc2FQdHItPmR3RWxlbWVudFNpemUgKiBkd0l0ZW0pOworICAgICAgbHBTcmMgPSBscERlc3QgKyBkc2FQdHItPmR3RWxlbWVudFNpemU7CisgICAgICBkd1NpemUgPSBkc2FQdHItPmR3RWxlbWVudFNpemUgKiAoZHNhUHRyLT5kd0VudHJ5Q291bnQtZHdJdGVtLTEpOworICAgICAgVFJBQ0UgKGNvbW1jdHJsLCItLSBtb3ZlIGRlc3Q9JXAgc3JjPSVwIHNpemU9JXhcbiIsbHBEZXN0LGxwU3JjLGR3U2l6ZSk7CisgICAgICBtZW1tb3ZlIChscERlc3QsbHBTcmMsZHdTaXplKTsKIAl9Ci0JZWxzZSB7Ci0JICAgIExQU1RSICpvbGRQdHJzID0gZHNhUHRyLT5wdHJzOwotCSAgICBUUkFDRSAoY29tbWN0cmwsICJjb21wbGV4IGRlbGV0ZSFcbiIpOworICAgIAorICAgIGRzYVB0ci0+ZHdFbnRyeUNvdW50LS07CisgICAgCisgICAgaWYgKCAoZHNhUHRyLT5kd01heENvdW50LWRzYVB0ci0+ZHdFbnRyeUNvdW50KSA+PSBkc2FQdHItPmR3R3JvdykgLyogZnJlZSBtZW1vcnkgPyovCisgICAgeyBkd1NpemUgPSBkc2FQdHItPmR3RWxlbWVudFNpemUgKiBkc2FQdHItPmR3RW50cnlDb3VudDsKKyAgICAgIGxwRGVzdCA9IChMUEJZVEUpIENPTUNUTDMyX1JlQWxsb2MoZHNhUHRyLT5wRGF0YSxkd1NpemUpOworICAgICAgaWYgKCFscERlc3QpCisgICAgICB7IHJldHVybiBGQUxTRTsKKyAgICAgIH0KKyAgICAgIGRzYVB0ci0+ZHdNYXhDb3VudCA9IGRzYVB0ci0+ZHdFbnRyeUNvdW50OworICAgICAgZHNhUHRyLT5wRGF0YSA9IGxwRGVzdDsgICAgICAgICAKIAotCSAgICBpZiAoZHNhUHRyLT5wdHJzW2R3UGFyYW0yXSkKLQkJSGVhcEZyZWUgKEdldFByb2Nlc3NIZWFwICgpLCAwLCBkc2FQdHItPnB0cnNbZHdQYXJhbTJdKTsKLQotCSAgICBkc2FQdHItPmR3RW50cnlDb3VudC0tOwotCSAgICBkc2FQdHItPnB0cnMgPSAKLQkJKExQU1RSKilIZWFwQWxsb2MgKEdldFByb2Nlc3NIZWFwICgpLCBIRUFQX1pFUk9fTUVNT1JZLAotCQkJCSAgIGRzYVB0ci0+ZHdFbnRyeUNvdW50ICogc2l6ZW9mKExQVk9JRCkpOwotCSAgICBpZiAoZHdQYXJhbTIgPiAwKSB7Ci0JCW1lbWNweSAoJmRzYVB0ci0+cHRyc1swXSwgJm9sZFB0cnNbMF0sCi0JCQlkd1BhcmFtMiAqIHNpemVvZihMUFNUUikpOwotCSAgICB9Ci0KLQkgICAgaWYgKGR3UGFyYW0yIDwgZHNhUHRyLT5kd0VudHJ5Q291bnQpIHsKLQkJbWVtY3B5ICgmZHNhUHRyLT5wdHJzW2R3UGFyYW0yXSwgJm9sZFB0cnNbZHdQYXJhbTIrMV0sCi0JCQkoZHNhUHRyLT5kd0VudHJ5Q291bnQgLSBkd1BhcmFtMikgKiBzaXplb2YoTFBTVFIpKTsKLQkgICAgfQotCSAgICBIZWFwRnJlZSAoR2V0UHJvY2Vzc0hlYXAgKCksIDAsIG9sZFB0cnMpOwotCX0KLQotCWlmIChkc2FQdHItPmR3RW50cnlDb3VudCA9PSAwKSB7Ci0JICAgIEhlYXBGcmVlIChHZXRQcm9jZXNzSGVhcCAoKSwgMCwgZHNhUHRyLT5wdHJzKTsKLQkgICAgZHNhUHRyLT5wdHJzID0gTlVMTDsKLQl9CiAgICAgfQotCi0gICAgcmV0dXJuIDA7CisgICAgcmV0dXJuIGR3SXRlbTsKIH0KIAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBEU0FfRGVsZXRlQWxsSXRlbXMgW0NPTUNUTDMyLjMyNl0gCisgKiAgZGVsZXRlcyBhbGwgZWxlbWVudHMgYW5kIGluaXRpYWxpemVzIGFycmF5CisgKgorICogUEFSQU1TCisgKiAgZHNhUHRyIFtJXSBwb2ludGVyIHRvIHRoZSBhcnJheSBjb250cm9sIHN0cnVjdHVyZQorICoKKyAqIFJFVFVSTlMKKyAqICBUUlVFL0ZBTFNFCisgKi8KK0JPT0wzMiBXSU5BUEkgRFNBX0RlbGV0ZUFsbEl0ZW1zIChjb25zdCBMUERTQV9EQVRBIGRzYVB0cikKK3sgICBUUkFDRSAoY29tbWN0cmwsICIoJXApXG4iLCBkc2FQdHIpOwogCisJaWYgKCEgZHNhUHRyKSAKKyAgICAgIHJldHVybiBGQUxTRTsKIAorICAgIGlmIChkc2FQdHItPnBEYXRhICYmICghIENPTUNUTDMyX0ZyZWUoZHNhUHRyLT5wRGF0YSkpKQorICAgIHsgcmV0dXJuIEZBTFNFOworICAgIH0KKwlkc2FQdHItPmR3RW50cnlDb3VudD0weDAwOworICAgIGRzYVB0ci0+cERhdGE9TlVMTDsKKyAgICBkc2FQdHItPmR3TWF4Q291bnQ9MHgwMDsKKyAgICByZXR1cm4gVFJVRTsKK30KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogCiBEV09SRCBXSU5BUEkKZGlmZiAtLWdpdCBhL2NvbnRyb2xzL2NvbW1jdHJsLmMgYi9jb250cm9scy9jb21tY3RybC5jCmluZGV4IDRiZTY1NDAuLjYyOWZjNTAgMTAwNjQ0Ci0tLSBhL2NvbnRyb2xzL2NvbW1jdHJsLmMKKysrIGIvY29udHJvbHMvY29tbWN0cmwuYwpAQCAtMjIsMTggKzIyLDQzIEBACiAjaW5jbHVkZSAidXBkb3duLmgiCiAjaW5jbHVkZSAiZGVidWcuaCIKIAorCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvbUN0bDMyTGliTWFpbgorICogQ29tQ3RsMzJMaWJNYWluIFtJbnRlcm5hbF0gSW5pdGlhbGl6ZXMgdGhlIGludGVybmFsICdDT01DVEwzMi5ETEwnLgorICoKKyAqIFBBUkFNUworICogICAgIGhpbnN0RExMICAgIFtJXQorICogICAgIGZkd1JlYXNvbiAgIFtJXQorICogICAgIGxwdlJlc2VydmVkIFtJXQorICoKICAqLwogCi1CT09MMzIgV0lOQVBJIENvbUN0bDMyTGliTWFpbiAoSElOU1RBTkNFMzIgaGluc3RETEwsIERXT1JEIGZkd1JlYXNvbiwgTFBWT0lEIGxwdlJlc2VydmVkKQoteyBUUkFDRShjb21tY3RybCwiJXgsJWx4LCVwXG4iLGhpbnN0RExMLGZkd1JlYXNvbixscHZSZXNlcnZlZCk7Ci0gIGlmICggZmR3UmVhc29uID09IERMTF9QUk9DRVNTX0FUVEFDSCkKLSAgeyBJbml0Q29tbW9uQ29udHJvbHMoKTsKLSAgfQotICByZXR1cm4gVFJVRTsKK0JPT0wzMiBXSU5BUEkKK0NvbUN0bDMyTGliTWFpbiAoSElOU1RBTkNFMzIgaGluc3RETEwsIERXT1JEIGZkd1JlYXNvbiwgTFBWT0lEIGxwdlJlc2VydmVkKQoreworICAgIFRSQUNFIChjb21tY3RybCwgIiV4LCVseCwlcFxuIiwgaGluc3RETEwsIGZkd1JlYXNvbiwgbHB2UmVzZXJ2ZWQpOwogCisgICAgc3dpdGNoIChmZHdSZWFzb24pIHsKKwljYXNlIERMTF9QUk9DRVNTX0FUVEFDSDoKKwkgICAgVFJBQ0UgKGNvbW1jdHJsLCAiTm8gYW5pbWF0aW9uIGNsYXNzIGltcGxlbWVudGVkIVxuIik7CisJICAgIEhFQURFUl9SZWdpc3RlciAoKTsKKwkgICAgVFJBQ0UgKGNvbW1jdHJsLCAiTm8gaG90a2V5IGNsYXNzIGltcGxlbWVudGVkIVxuIik7CisJICAgIExJU1RWSUVXX1JlZ2lzdGVyICgpOworCSAgICBQUk9HUkVTU19SZWdpc3RlciAoKTsKKwkgICAgU1RBVFVTX1JlZ2lzdGVyICgpOworCSAgICBUUkFDRSAoY29tbWN0cmwsICJObyB0YWIgY2xhc3MgaW1wbGVtZW50ZWQhXG4iKTsKKwkgICAgVE9PTEJBUl9SZWdpc3RlciAoKTsKKwkgICAgVE9PTFRJUFNfUmVnaXN0ZXIgKCk7CisJICAgIFRSQUNLQkFSX1JlZ2lzdGVyICgpOworCSAgICBUUkVFVklFV19SZWdpc3RlciAoKTsKKwkgICAgVVBET1dOX1JlZ2lzdGVyICgpOworCSAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gVFJVRTsKIH0KKworCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIERyYXdTdGF0dXNUZXh0MzJBIFtDT01DVEwzMi41XVtDT01DVEwzMi4yN10KICAqCkBAIC03Myw5ICs5OCwxOCBAQAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIERyYXdTdGF0dXNUZXh0MzJXIFtDT01DVEwzMi4yOF0KKyAqCisgKiBEcmF3cyB0ZXh0IHdpdGggYm9yZGVycywgbGlrZSBpbiBhIHN0YXR1cyBiYXIuCisgKgorICogUEFSQU1TCisgKiAgICAgaGRjICAgW0ldIGhhbmRsZSB0byB0aGUgd2luZG93J3MgZGlzcGxheSBjb250ZXh0CisgKiAgICAgbHByYyAgW0ldIHBvaW50ZXIgdG8gYSByZWN0YW5nbGUKKyAqICAgICB0ZXh0ICBbSV0gcG9pbnRlciB0byB0aGUgdGV4dAorICogICAgIHN0eWxlIFtJXSAKICAqLwotdm9pZCBXSU5BUEkgRHJhd1N0YXR1c1RleHQzMlcoIEhEQzMyIGhkYywgTFBSRUNUMzIgbHByYywgTFBDV1NUUiB0ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQzMiBzdHlsZSApCisKK1ZPSUQgV0lOQVBJCitEcmF3U3RhdHVzVGV4dDMyVyAoSERDMzIgaGRjLCBMUFJFQ1QzMiBscHJjLCBMUENXU1RSIHRleHQsIFVJTlQzMiBzdHlsZSkKIHsKICAgTFBTVFIgcCA9IEhFQVBfc3RyZHVwV3RvQSggR2V0UHJvY2Vzc0hlYXAoKSwgMCwgdGV4dCApOwogICBEcmF3U3RhdHVzVGV4dDMyQShoZGMsIGxwcmMsIHAsIHN0eWxlKTsKQEAgLTEzNywxOSArMTcxLDE0IEBACiAgKiAgICAgTm9uZS4KICAqCiAgKiBOT1RFUwotICogICAgIENhbGxzIEluaXRDb21tb25Db250cm9sc0V4LgotICogICAgIEluaXRDb21tb25Db250cm9sc0V4IHNob3VsZCBiZSB1c2VkIGluc3RlYWQuCisgKiAgICAgVGhpcyBmdW5jdGlvbiBpcyBqdXN0IGEgZHVtbXkuCisgKiAgICAgVGhlIFdpbjk1IGNvbnRyb2xzIGFyZSByZWdpc3RlcmVkIGF0IHRoZSBETEwncyBpbml0aWFsaXphdGlvbi4KKyAqICAgICBUbyByZWdpc3RlciBvdGhlciBjb250cm9scyBJbml0Q29tbW9uQ29udHJvbHNFeCBtdXN0IGJlIHVzZWQuCiAgKi8KIAogVk9JRCBXSU5BUEkKIEluaXRDb21tb25Db250cm9scyAoVk9JRCkKIHsKLSAgICBJTklUQ09NTU9OQ09OVFJPTFNFWCBpY2M7Ci0KLSAgICBpY2MuZHdTaXplID0gc2l6ZW9mKElOSVRDT01NT05DT05UUk9MU0VYKTsKLSAgICBpY2MuZHdJQ0MgPSBJQ0NfV0lOOTVfQ0xBU1NFUzsKLQotICAgIEluaXRDb21tb25Db250cm9sc0V4ICgmaWNjKTsKIH0KIAogCkBAIC0xNjAsNiArMTg5LDEwIEBACiAgKgogICogUEFSQU1TCiAgKiAgICAgbHBJbml0Q3RybHMgW0ldIHBvaW50ZXIgdG8gYSBJTklUQ09NTU9OQ09OVFJPTFMgc3RydWN0dXJlLgorICoKKyAqIE5PVEVTCisgKiAgICAgT25seSB0aGUgYWRkaXRpbmFsIGNvbW1vbiBjb250cm9scyBhcmUgcmVnaXN0ZXJlZCBieSB0aGlzIGZ1bmN0aW9uLgorICogICAgIFRoZSBXaW45NSBjb250cm9scyBhcmUgcmVnaXN0ZXJlZCBhdCB0aGUgRExMJ3MgaW5pdGlhbGl6YXRpb24uCiAgKi8KIAogQk9PTDMyIFdJTkFQSQpAQCAtMTczLDQ5ICsyMDYsMjEgQEAKICAgaWYgKGxwSW5pdEN0cmxzID09IE5VTEwpIHJldHVybiBGQUxTRTsKICAgaWYgKGxwSW5pdEN0cmxzLT5kd1NpemUgPCBzaXplb2YoSU5JVENPTU1PTkNPTlRST0xTRVgpKSByZXR1cm4gRkFMU0U7CiAKLSAgZm9yIChjQ291bnQgPSAwOyBjQ291bnQgPD0gMzE7IGNDb3VudCsrKSB7CisgIGZvciAoY0NvdW50ID0gMDsgY0NvdW50IDwgMzI7IGNDb3VudCsrKSB7CiAgICAgZHdNYXNrID0gMSA8PCBjQ291bnQ7CiAgICAgaWYgKCEobHBJbml0Q3RybHMtPmR3SUNDICYgZHdNYXNrKSkKICAgICAgIGNvbnRpbnVlOwogCiAgICAgc3dpdGNoIChscEluaXRDdHJscy0+ZHdJQ0MgJiBkd01hc2spIHsKLSAgICAgIGNhc2UgSUNDX0xJU1RWSUVXX0NMQVNTRVM6Ci0gICAgICAgIExJU1RWSUVXX1JlZ2lzdGVyICgpOwotICAgICAgICBIRUFERVJfUmVnaXN0ZXIgKCk7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIElDQ19UUkVFVklFV19DTEFTU0VTOgotICAgICAgICBUUkVFVklFV19SZWdpc3RlciAoKTsKLQlUT09MVElQU19SZWdpc3RlciAoKTsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgSUNDX0JBUl9DTEFTU0VTOgotCVRPT0xCQVJfUmVnaXN0ZXIgKCk7Ci0JU1RBVFVTX1JlZ2lzdGVyICgpOwotCVRSQUNLQkFSX1JlZ2lzdGVyICgpOwotCVRPT0xUSVBTX1JlZ2lzdGVyICgpOwotICAgICAgICBicmVhazsKLQotICAgICAgY2FzZSBJQ0NfVEFCX0NMQVNTRVM6Ci0gICAgICAgIFRSQUNFIChjb21tY3RybCwgIk5vIHRhYiBjbGFzcyBpbXBsZW1lbnRlZCFcbiIpOwotCVRPT0xUSVBTX1JlZ2lzdGVyICgpOwotICAgICAgICBVUERPV05fUmVnaXN0ZXIgKCk7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIElDQ19VUERPV05fQ0xBU1M6Ci0gICAgICAgIFVQRE9XTl9SZWdpc3RlciAoKTsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgSUNDX1BST0dSRVNTX0NMQVNTOgotICAgICAgICBQUk9HUkVTU19SZWdpc3RlciAoKTsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgSUNDX0hPVEtFWV9DTEFTUzoKLSAgICAgICAgVFJBQ0UgKGNvbW1jdHJsLCAiTm8gaG90a2V5IGNsYXNzIGltcGxlbWVudGVkIVxuIik7Ci0gICAgICAgIGJyZWFrOwotCisgICAgICAvKiBkdW1teSBpbml0aWFsaXphdGlvbiAqLwogICAgICAgY2FzZSBJQ0NfQU5JTUFURV9DTEFTUzoKLSAgICAgICAgVFJBQ0UgKGNvbW1jdHJsLCAiTm8gYW5pbWF0aW9uIGNsYXNzIGltcGxlbWVudGVkIVxuIik7CisgICAgICBjYXNlIElDQ19CQVJfQ0xBU1NFUzoKKyAgICAgIGNhc2UgSUNDX0xJU1RWSUVXX0NMQVNTRVM6CisgICAgICBjYXNlIElDQ19UUkVFVklFV19DTEFTU0VTOgorICAgICAgY2FzZSBJQ0NfVEFCX0NMQVNTRVM6CisgICAgICBjYXNlIElDQ19VUERPV05fQ0xBU1M6CisgICAgICBjYXNlIElDQ19QUk9HUkVTU19DTEFTUzoKKyAgICAgIGNhc2UgSUNDX0hPVEtFWV9DTEFTUzoKICAgICAgICAgYnJlYWs7CiAKICAgICAgIC8qIGFkdmFuY2VkIGNsYXNzZXMgLSBub3QgaW5jbHVkZWQgaW4gV2luOTUgKi8KQEAgLTI2Nyw2ICsyNzIsMTAgQEAKICAqICAgICBoSW5zdAogICogICAgIGh3bmRTdGF0dXMKICAqICAgICBscHdJRHMKKyAqCisgKiBOT1RFUworICogICAgIFNvbWUgZmVhdHVyZXMgYXJlIHN0aWxsIG1pc3NpbmcgYmVjYXVzZSBvZiBpbmNvbXBsZXRlIFdNX01FTlVTRUxFQ1QKKyAqICAgICBtZXNzYWdlcyAoMTYtPjMyIGJpdCBjb252ZXJzaW9uKS4KICAqLwogCiBWT0lEIFdJTkFQSQpAQCAtNTI4LDMyICs1MzcsNjAgQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFNob3dIaWRlTWVudUN0bCBbQ09NQ1RMMzIuM10KKyAqIFNob3dIaWRlTWVudUN0bCBbQ09NQ1RMMzIuM10gCisgKgorICogU2hvd3Mgb3IgaGlkZXMgY29udHJvbHMgYW5kIHVwZGF0ZXMgdGhlIGNvcnJlc3BvbmRpbmcgbWVudSBpdGVtLgogICoKICAqIFBBUkFNUwogICogICAgIGh3bmQgICBbSV0gaGFuZGxlIHRvIHRoZSBjbGllbnQgd2luZG93LgotICogICAgIHVGbGFncyBbSV0gbWVudSBjb21tYW5kIGlkCi0gKiAgICAgbHBJbmZvIFtJXSBwb2ludGVyIHRvIGFuIGFycmF5IG9mIGludGVnZXJzCisgKiAgICAgdUZsYWdzIFtJXSBtZW51IGNvbW1hbmQgaWQuCisgKiAgICAgbHBJbmZvIFtJXSBwb2ludGVyIHRvIGFuIGFycmF5IG9mIGludGVnZXJzLiAoU2VlIE5PVEVTLikKICAqCiAgKiBOT1RFUworICogICAgIFRoZSBvZmZpY2lhbCBkb2N1bWVudGF0aW9uIGlzIGluY29tcGxldGUhIFRoaXMgaGFzIGJlZW4gZml4ZWQuCisgKgorICogICAgIGxwSW5mbworICogICAgIFRoZSBhcnJheSBvZiBpbnRlZ2VycyBjb250YWlucyBwYWlycyBvZiB2YWx1ZXMuIEJPVEggdmFsdWVzIG9mCisgKiAgICAgdGhlIGZpcnN0IHBhaXIgbXVzdCBiZSB0aGUgaGFuZGxlcyB0byBhcHBsaWNhdGlvbidzIG1haW4gbWVudS4KKyAqICAgICBFYWNoIHN1YnNlcXVlbnQgcGFpciBjb25zaXN0cyBvZiBhIG1lbnUgaWQgYW5kIGNvbnRyb2wgaWQuCiAgKi8KIAogQk9PTDMyIFdJTkFQSQogU2hvd0hpZGVNZW51Q3RsIChIV05EMzIgaHduZCwgVUlOVDMyIHVGbGFncywgTFBJTlQzMiBscEluZm8pCiB7CisgICAgTFBJTlQzMiBscE1lbnVJZDsKICAgICBGSVhNRSAoY29tbWN0cmwsICIoMHglMDh4IDB4JTA4eCAlcCk6IGVtcHR5IHN0dWIhXG4iLAogCSAgIGh3bmQsIHVGbGFncywgbHBJbmZvKTsKLSNpZiAwCi0gICAgaWYgKEdldE1lbnVTdGF0ZSAobHBJbmZvWzFdLCB1RmxhZ3MsIE1GX0JZQ09NTUFORCkgJiBNRlNfQ0hFQ0tFRCkgewotCS8qIGNoZWNrZWQgLT4gaGlkZSBjb250cm9sICovCiAKKyAgICBpZiAobHBJbmZvID09IE5VTEwpCisJcmV0dXJuIEZBTFNFOworCisgICAgaWYgKCEobHBJbmZvWzBdKSB8fCAhKGxwSW5mb1sxXSkpCisJcmV0dXJuIEZBTFNFOworCisgICAgLyogc2VhcmNoIGZvciBjb250cm9sICovCisgICAgbHBNZW51SWQgPSAmbHBJbmZvWzJdOworICAgIHdoaWxlICgqbHBNZW51SWQgIT0gdUZsYWdzKQorCWxwTWVudUlkICs9IDI7CisKKyAgICBpZiAoR2V0TWVudVN0YXRlMzIgKGxwSW5mb1sxXSwgdUZsYWdzLCBNRl9CWUNPTU1BTkQpICYgTUZTX0NIRUNLRUQpIHsKKwkvKiB1bmNoZWNrIG1lbnUgaXRlbSAqLworCUNoZWNrTWVudUl0ZW0zMiAobHBJbmZvWzBdLCAqbHBNZW51SWQsIE1GX0JZQ09NTUFORCB8IE1GX1VOQ0hFQ0tFRCk7CisKKwkvKiBoaWRlIGNvbnRyb2wgKi8KKwlscE1lbnVJZCsrOworCVNldFdpbmRvd1BvczMyIChHZXREbGdJdGVtMzIgKGh3bmQsICpscE1lbnVJZCksIDAsIDAsIDAsIDAsIDAsCisJCQlTV1BfSElERVdJTkRPVyk7CiAgICAgfQogICAgIGVsc2UgewotCS8qIG5vdCBjaGVja2VkIC0+IHNob3cgY29udHJvbCAqLworCS8qIGNoZWNrIG1lbnUgaXRlbSAqLworCUNoZWNrTWVudUl0ZW0zMiAobHBJbmZvWzBdLCAqbHBNZW51SWQsIE1GX0JZQ09NTUFORCB8IE1GX0NIRUNLRUQpOwogCisJLyogc2hvdyBjb250cm9sICovCisJbHBNZW51SWQrKzsKKwlTZXRXaW5kb3dQb3MzMiAoR2V0RGxnSXRlbTMyIChod25kLCAqbHBNZW51SWQpLCAwLCAwLCAwLCAwLCAwLAorCQkJU1dQX1NIT1dXSU5ET1cpOwogICAgIH0KIAotI2VuZGlmCi0KLSAgICByZXR1cm4gRkFMU0U7CisgICAgcmV0dXJuIFRSVUU7CiB9CmRpZmYgLS1naXQgYS9jb250cm9scy9tZW51LmMgYi9jb250cm9scy9tZW51LmMKaW5kZXggZmMwMWU1My4uNDVhMjVjNiAxMDA2NDQKLS0tIGEvY29udHJvbHMvbWVudS5jCisrKyBiL2NvbnRyb2xzL21lbnUuYwpAQCAtMzg1Miw3ICszODUyLDcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgkJU2V0TWVudURlZmF1bHRJdGVtMzIgICAgKFVTRVIzMi40ODkpCiAgKi8KLUJPT0wzMiBXSU5BUEkgU2V0TWVudURlZmF1bHRJdGVtMzIoSE1FTlUzMiBobWVudSwgVUlOVDMyIGl0ZW0sIEJPT0wzMiBieXBvcykKK0JPT0wzMiBXSU5BUEkgU2V0TWVudURlZmF1bHRJdGVtMzIoSE1FTlUzMiBobWVudSwgVUlOVDMyIGl0ZW0sIFVJTlQzMiBieXBvcykKIHsKICAgICBNRU5VSVRFTSAqbWVudWl0ZW0gPSBNRU5VX0ZpbmRJdGVtKCZobWVudSwgJml0ZW0sIGJ5cG9zKTsKICAgICBQT1BVUE1FTlUgKm1lbnU7CkBAIC0zOTM4LDcgKzM5MzgsNyBAQAogCiBCT09MMzIgV0lOQVBJIENoZWNrTWVudVJhZGlvSXRlbTMyKEhNRU5VMzIgaE1lbnUsCiAJCQkJICAgVUlOVDMyIGZpcnN0LCBVSU5UMzIgbGFzdCwgVUlOVDMyIGNoZWNrLAotCQkJCSAgIEJPT0wzMiBieXBvcykKKwkJCQkgICBVSU5UMzIgYnlwb3MpCiB7CiAgICAgIE1FTlVJVEVNICptaWZpcnN0LCAqbWlsYXN0LCAqbWljaGVjazsKICAgICAgSE1FTlUzMiBtZmlyc3QgPSBoTWVudSwgbWxhc3QgPSBoTWVudSwgbWNoZWNrID0gaE1lbnU7CmRpZmYgLS1naXQgYS9jb250cm9scy9wYWdlci5jIGIvY29udHJvbHMvcGFnZXIuYwppbmRleCAyZTMzNWMwLi42MDYxMmMyIDEwMDY0NAotLS0gYS9jb250cm9scy9wYWdlci5jCisrKyBiL2NvbnRyb2xzL3BhZ2VyLmMKQEAgLTI1LDYgKzI1LDE3IEBACiAKIAogc3RhdGljIF9faW5saW5lX18gTFJFU1VMVAorUEFHRVJfRm9yd2FyZE1vdXNlIChXTkQgKnduZFB0ciwgV1BBUkFNMzIgd1BhcmFtKQoreworICAgIFBBR0VSX0lORk8gKmluZm9QdHIgPSBQQUdFUl9HZXRJbmZvUHRyKHduZFB0cik7CisKKyAgICBpbmZvUHRyLT5iRm9yd2FyZCA9IChCT09MMzIpd1BhcmFtOworCisgICAgcmV0dXJuIDA7Cit9CisKKworc3RhdGljIF9faW5saW5lX18gTFJFU1VMVAogUEFHRVJfR2V0QmtDb2xvciAoV05EICp3bmRQdHIsIFdQQVJBTTMyIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSkKIHsKICAgICBQQUdFUl9JTkZPICppbmZvUHRyID0gUEFHRVJfR2V0SW5mb1B0cih3bmRQdHIpOwpAQCAtNTEsNiArNjIsMjggQEAKIH0KIAogCisvLyA8PCBQQUdFUl9HZXRCdXR0b25TdGF0ZSA+PgorLy8gPDwgUEFHRVJfR2V0RHJvcFRhcmdldCA+PgorCisKK3N0YXRpYyBfX2lubGluZV9fIExSRVNVTFQKK1BBR0VSX0dldFBvcyAoV05EICp3bmRQdHIsIFdQQVJBTTMyIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSkKK3sKKyAgICBQQUdFUl9JTkZPICppbmZvUHRyID0gUEFHRVJfR2V0SW5mb1B0cih3bmRQdHIpOworCisgICAgcmV0dXJuIGluZm9QdHItPmlQb3M7Cit9CisKKworc3RhdGljIExSRVNVTFQKK1BBR0VSX1JlY2FsY1NpemUgKFdORCAqd25kUHRyLCBXUEFSQU0zMiB3UGFyYW0sIExQQVJBTSBsUGFyYW0pCit7CisvLyAgICBQQUdFUl9JTkZPICppbmZvUHRyID0gUEFHRVJfR2V0SW5mb1B0cih3bmRQdHIpOworCisgICAgRklYTUUgKHBhZ2VyLCAiZW1wdHkgc3R1YiFcbiIpOworCisgICAgcmV0dXJuIDA7Cit9CiAKIAogc3RhdGljIF9faW5saW5lX18gTFJFU1VMVApAQCAtMTA4LDYgKzE0MSwxOCBAQAogfQogCiAKK3N0YXRpYyBfX2lubGluZV9fIExSRVNVTFQKK1BBR0VSX1NldFBvcyAoV05EICp3bmRQdHIsIFdQQVJBTTMyIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSkKK3sKKyAgICBQQUdFUl9JTkZPICppbmZvUHRyID0gUEFHRVJfR2V0SW5mb1B0cih3bmRQdHIpOworCisgICAgaW5mb1B0ci0+aVBvcyA9IChJTlQzMilsUGFyYW07CisKKyAgICAvKiBGSVhNRTogcmVkcmF3ICovCisKKyAgICByZXR1cm4gMDsKK30KKwogCiBzdGF0aWMgTFJFU1VMVAogUEFHRVJfQ3JlYXRlIChXTkQgKnduZFB0ciwgV1BBUkFNMzIgd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQpAQCAtMTIwLDcgKzE2NSw3IEBACiAgICAgd25kUHRyLT53RXh0cmFbMF0gPSAoRFdPUkQpaW5mb1B0cjsKIAogICAgIGlmIChpbmZvUHRyID09IE5VTEwpIHsKLQlFUlIgKHRyZWV2aWV3LCAiY291bGQgbm90IGFsbG9jYXRlIGluZm8gbWVtb3J5IVxuIik7CisJRVJSIChwYWdlciwgImNvdWxkIG5vdCBhbGxvY2F0ZSBpbmZvIG1lbW9yeSFcbiIpOwogCXJldHVybiAwOwogICAgIH0KIApAQCAtMTM0LDYgKzE3OSw3IEBACiAgICAgaW5mb1B0ci0+Y2xyQmsgPSBHZXRTeXNDb2xvcjMyIChDT0xPUl9CVE5GQUNFKTsKICAgICBpbmZvUHRyLT5pQm9yZGVyID0gMDsKICAgICBpbmZvUHRyLT5pQnV0dG9uU2l6ZSA9IDA7CisgICAgaW5mb1B0ci0+aVBvcyA9IDA7CiAKIAogICAgIHJldHVybiAwOwpAQCAtMTQ4LDcgKzE5NCw3IEBACiAKIAogCi0gICAgLyogZnJlZSB0cmVlIHZpZXcgaW5mbyBkYXRhICovCisgICAgLyogZnJlZSBwYWdlciBpbmZvIGRhdGEgKi8KICAgICBIZWFwRnJlZSAoR2V0UHJvY2Vzc0hlYXAgKCksIDAsIGluZm9QdHIpOwogCiAgICAgcmV0dXJuIDA7CkBAIC0xNjksMTUgKzIxNSwxOSBAQAogfQogCiAKKy8vIDw8IFBBR0VSX01vdXNlTW92ZSA+PgorLy8gPDwgUEFHRVJfUGFpbnQgPj4KKwogCiBMUkVTVUxUIFdJTkFQSQotUGFnZXJXaW5kb3dQcm9jIChIV05EMzIgaHduZCwgVUlOVDMyIHVNc2csIFdQQVJBTTMyIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSkKK1BBR0VSX1dpbmRvd1Byb2MgKEhXTkQzMiBod25kLCBVSU5UMzIgdU1zZywgV1BBUkFNMzIgd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQogewogICAgIFdORCAqd25kUHRyID0gV0lOX0ZpbmRXbmRQdHIoaHduZCk7CiAKICAgICBzd2l0Y2ggKHVNc2cpCiAgICAgewotLy8JY2FzZSBQR01fRk9SV0FSRE1PVVNFOgorCWNhc2UgUEdNX0ZPUldBUkRNT1VTRToKKwkgICAgcmV0dXJuIFBBR0VSX0ZvcndhcmRNb3VzZSAod25kUHRyLCB3UGFyYW0pOwogCiAJY2FzZSBQR01fR0VUQktDT0xPUjoKIAkgICAgcmV0dXJuIFBBR0VSX0dldEJrQ29sb3IgKHduZFB0ciwgd1BhcmFtLCBsUGFyYW0pOwpAQCAtMTkwLDggKzI0MCwxMiBAQAogCiAvLwljYXNlIFBHTV9HRVRCVVRUT05TVEFURToKIC8vCWNhc2UgUEdNX0dFVERST1BUQVJHRVQ6Ci0vLwljYXNlIFBHTV9HRVRQT1M6Ci0vLwljYXNlIFBHTV9SRUNBTENTSVpFOgorCisJY2FzZSBQR01fR0VUUE9TOgorCSAgICByZXR1cm4gUEFHRVJfU2V0UG9zICh3bmRQdHIsIHdQYXJhbSwgbFBhcmFtKTsKKworCWNhc2UgUEdNX1JFQ0FMQ1NJWkU6CisJICAgIHJldHVybiBQQUdFUl9SZWNhbGNTaXplICh3bmRQdHIsIHdQYXJhbSwgbFBhcmFtKTsKIAogCWNhc2UgUEdNX1NFVEJLQ09MT1I6CiAJICAgIHJldHVybiBQQUdFUl9TZXRCa0NvbG9yICh3bmRQdHIsIHdQYXJhbSwgbFBhcmFtKTsKQEAgLTIwNSw3ICsyNTksOCBAQAogCWNhc2UgUEdNX1NFVENISUxEOgogCSAgICByZXR1cm4gUEFHRVJfU2V0Q2hpbGQgKHduZFB0ciwgd1BhcmFtLCBsUGFyYW0pOwogCi0vLwljYXNlIFBHTV9TRVRQT1M6CisJY2FzZSBQR01fU0VUUE9TOgorCSAgICByZXR1cm4gUEFHRVJfU2V0UG9zICh3bmRQdHIsIHdQYXJhbSwgbFBhcmFtKTsKIAogCWNhc2UgV01fQ1JFQVRFOgogCSAgICByZXR1cm4gUEFHRVJfQ3JlYXRlICh3bmRQdHIsIHdQYXJhbSwgbFBhcmFtKTsKQEAgLTI0Miw3ICsyOTcsNyBAQAogCiAgICAgWmVyb01lbW9yeSAoJnduZENsYXNzLCBzaXplb2YoV05EQ0xBU1MzMkEpKTsKICAgICB3bmRDbGFzcy5zdHlsZSAgICAgICAgID0gQ1NfR0xPQkFMQ0xBU1MgfCBDU19EQkxDTEtTIHwgQ1NfU0FWRUJJVFM7Ci0gICAgd25kQ2xhc3MubHBmblduZFByb2MgICA9IChXTkRQUk9DMzIpUGFnZXJXaW5kb3dQcm9jOworICAgIHduZENsYXNzLmxwZm5XbmRQcm9jICAgPSAoV05EUFJPQzMyKVBBR0VSX1dpbmRvd1Byb2M7CiAgICAgd25kQ2xhc3MuY2JDbHNFeHRyYSAgICA9IDA7CiAgICAgd25kQ2xhc3MuY2JXbmRFeHRyYSAgICA9IHNpemVvZihQQUdFUl9JTkZPICopOwogICAgIHduZENsYXNzLmhDdXJzb3IgICAgICAgPSBMb2FkQ3Vyc29yMzJBICgwLCBJRENfQVJST1czMkEpOwpkaWZmIC0tZ2l0IGEvY29udHJvbHMvcmViYXIuYyBiL2NvbnRyb2xzL3JlYmFyLmMKaW5kZXggOTI4MGNmOS4uYTM2YmJmZiAxMDA2NDQKLS0tIGEvY29udHJvbHMvcmViYXIuYworKysgYi9jb250cm9scy9yZWJhci5jCkBAIC0yNCwxOCArMjQsNTczIEBACiAjZGVmaW5lIFJFQkFSX0dldEluZm9QdHIod25kUHRyKSAoKFJFQkFSX0lORk8gKil3bmRQdHItPndFeHRyYVswXSkKIAogCisvLyA8PCBSRUJBUl9CZWdpbkRyYWcgPj4KKy8vIDw8IFJFQkFSX0RlbGV0ZUJhbmQgPj4KKy8vIDw8IFJFQkFSX0RyYWdNb3ZlID4+CisvLyA8PCBSRUJBUl9FbmREcmFnID4+CisvLyA8PCBSRUJBUl9HZXRCYW5kQm9yZGVycyA+PgorCisKK19faW5saW5lX18gc3RhdGljIExSRVNVTFQKK1JFQkFSX0dldEJhbmRDb3VudCAoV05EICp3bmRQdHIpCit7CisgICAgUkVCQVJfSU5GTyAqaW5mb1B0ciA9IFJFQkFSX0dldEluZm9QdHIgKHduZFB0cik7CisKKyAgICBUUkFDRSAocmViYXIsICJiYW5kIGNvdW50ICV1IVxuIiwgaW5mb1B0ci0+dU51bUJhbmRzKTsKKworICAgIHJldHVybiBpbmZvUHRyLT51TnVtQmFuZHM7Cit9CisKKworc3RhdGljIExSRVNVTFQKK1JFQkFSX0dldEJhbmRJbmZvMzJBIChXTkQgKnduZFB0ciwgV1BBUkFNMzIgd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQoreworICAgIFJFQkFSX0lORk8gKmluZm9QdHIgPSBSRUJBUl9HZXRJbmZvUHRyICh3bmRQdHIpOworICAgIExQUkVCQVJCQU5ESU5GTzMyQSBscHJiYmkgPSAoTFBSRUJBUkJBTkRJTkZPMzJBKWxQYXJhbTsKKyAgICBSRUJBUl9CQU5EICpscEJhbmQ7CisKKyAgICBpZiAobHByYmJpID09IE5VTEwpCisJcmV0dXJuIEZBTFNFOworICAgIGlmIChscHJiYmktPmNiU2l6ZSA8IHNpemVvZiAoTFBSRUJBUkJBTkRJTkZPMzJBKSkKKwlyZXR1cm4gRkFMU0U7CisgICAgaWYgKChVSU5UMzIpd1BhcmFtID49IGluZm9QdHItPnVOdW1CYW5kcykKKwlyZXR1cm4gRkFMU0U7CisKKyAgICBUUkFDRSAocmViYXIsICJpbmRleCAldVxuIiwgKFVJTlQzMil3UGFyYW0pOworCisgICAgLyogY29weSBiYW5kIGluZm9ybWF0aW9uICovCisgICAgbHBCYW5kID0gJmluZm9QdHItPmJhbmRzWyhVSU5UMzIpd1BhcmFtXTsKKworICAgIGlmIChscHJiYmktPmZNYXNrICYgUkJCSU1fU1RZTEUpCisJbHByYmJpLT5mU3R5bGUgPSBscEJhbmQtPmZTdHlsZTsKKworICAgIGlmIChscHJiYmktPmZNYXNrICYgUkJCSU1fQ09MT1JTKSB7CisJbHByYmJpLT5jbHJGb3JlID0gbHBCYW5kLT5jbHJGb3JlOworCWxwcmJiaS0+Y2xyQmFjayA9IGxwQmFuZC0+Y2xyQmFjazsKKyAgICB9CisKKyAgICBpZiAoKGxwcmJiaS0+Zk1hc2sgJiBSQkJJTV9URVhUKSAmJiAKKwkobHByYmJpLT5scFRleHQpICYmIChscEJhbmQtPmxwVGV4dCkpIHsKKwkgICAgbHN0cmNweW4zMkEgKGxwcmJiaS0+bHBUZXh0LCBscEJhbmQtPmxwVGV4dCwgbHByYmJpLT5jY2gpOworICAgIH0KKworICAgIGlmIChscHJiYmktPmZNYXNrICYgUkJCSU1fSU1BR0UpCisJbHByYmJpLT5pSW1hZ2UgPSBscEJhbmQtPmlJbWFnZTsKKworICAgIGlmIChscHJiYmktPmZNYXNrICYgUkJCSU1fQ0hJTEQpCisJbHByYmJpLT5od25kQ2hpbGQgPSBscEJhbmQtPmh3bmRDaGlsZDsKKworICAgIGlmIChscHJiYmktPmZNYXNrICYgUkJCSU1fQ0hJTERTSVpFKSB7CisJbHByYmJpLT5jeE1pbkNoaWxkID0gbHBCYW5kLT5jeE1pbkNoaWxkOworCWxwcmJiaS0+Y3lNaW5DaGlsZCA9IGxwQmFuZC0+Y3lNaW5DaGlsZDsKKwlscHJiYmktPmN5TWF4Q2hpbGQgPSBscEJhbmQtPmN5TWF4Q2hpbGQ7CisJbHByYmJpLT5jeUNoaWxkICAgID0gbHBCYW5kLT5jeUNoaWxkOworCWxwcmJiaS0+Y3lJbnRlZ3JhbCA9IGxwQmFuZC0+Y3lJbnRlZ3JhbDsKKyAgICB9CisKKyAgICBpZiAobHByYmJpLT5mTWFzayAmIFJCQklNX1NJWkUpCisJbHByYmJpLT5jeCA9IGxwQmFuZC0+Y3g7CisKKyAgICBpZiAobHByYmJpLT5mTWFzayAmIFJCQklNX0JBQ0tHUk9VTkQpCisJbHByYmJpLT5oYm1CYWNrID0gbHBCYW5kLT5oYm1CYWNrOworCisgICAgaWYgKGxwcmJiaS0+Zk1hc2sgJiBSQkJJTV9JRCkKKwlscHJiYmktPndJRCA9IGxwQmFuZC0+d0lEOworCisgICAgLyogRklYTUU6IGNoZWNrIGZvciBzaXplIG9mIGJhbmQgaW5mbyBzdHJ1Y3R1cmUgKi8KKworICAgIGlmIChscHJiYmktPmZNYXNrICYgUkJCSU1fSURFQUxTSVpFKQorCWxwcmJiaS0+Y3hJZGVhbCA9IGxwQmFuZC0+Y3hJZGVhbDsKKworICAgIGlmIChscHJiYmktPmZNYXNrICYgUkJCSU1fTFBBUkFNKQorCWxwcmJiaS0+bFBhcmFtID0gbHBCYW5kLT5sUGFyYW07CisKKyAgICBpZiAobHByYmJpLT5mTWFzayAmIFJCQklNX0hFQURFUlNJWkUpCisJbHByYmJpLT5jeEhlYWRlciA9IGxwQmFuZC0+Y3hIZWFkZXI7CisKKyAgICByZXR1cm4gVFJVRTsKK30KKworCisvLyA8PCBSRUJBUl9HZXRCYW5kSW5mbzMyVyA+PgorCisvLyA8PCBSRUJBUl9HZXRCYXJIZWlnaHQgPj4KKworCitzdGF0aWMgTFJFU1VMVAorUkVCQVJfR2V0QmFySW5mbyAoV05EICp3bmRQdHIsIFdQQVJBTTMyIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSkKK3sKKyAgICBSRUJBUl9JTkZPICppbmZvUHRyID0gUkVCQVJfR2V0SW5mb1B0ciAod25kUHRyKTsKKyAgICBMUFJFQkFSSU5GTyBscEluZm8gPSAoTFBSRUJBUklORk8pbFBhcmFtOworCisgICAgaWYgKGxwSW5mbyA9PSBOVUxMKQorCXJldHVybiBGQUxTRTsKKworICAgIGlmIChscEluZm8tPmNiU2l6ZSA8IHNpemVvZiAoUkVCQVJJTkZPKSkKKwlyZXR1cm4gRkFMU0U7CisKKyAgICBUUkFDRSAocmViYXIsICJnZXR0aW5nIGJhciBpbmZvIVxuIik7CisKKyAgICBpZiAoaW5mb1B0ci0+aGltbCkgeworCWxwSW5mby0+aGltbCA9IGluZm9QdHItPmhpbWw7CisJbHBJbmZvLT5mTWFzayB8PSBSQklNX0lNQUdFTElTVDsKKyAgICB9CisKKyAgICByZXR1cm4gVFJVRTsKK30KKworCitfX2lubGluZV9fIHN0YXRpYyBMUkVTVUxUCitSRUJBUl9HZXRCa0NvbG9yIChXTkQgKnduZFB0cikKK3sKKyAgICBSRUJBUl9JTkZPICppbmZvUHRyID0gUkVCQVJfR2V0SW5mb1B0ciAod25kUHRyKTsKKworICAgIFRSQUNFIChyZWJhciwgImJhY2tncm91bmQgY29sb3IgMHglMDZseCFcbiIsIGluZm9QdHItPmNsckJrKTsKKworICAgIHJldHVybiBpbmZvUHRyLT5jbHJCazsKK30KKworCisvLyA8PCBSRUJBUl9HZXRDb2xvclNjaGVtZSA+PgorCisvLyA8PCBSRUJBUl9HZXRSb3dIZWlnaHQgPj4KKworCitfX2lubGluZV9fIHN0YXRpYyBMUkVTVUxUCitSRUJBUl9HZXRUZXh0Q29sb3IgKFdORCAqd25kUHRyKQoreworICAgIFJFQkFSX0lORk8gKmluZm9QdHIgPSBSRUJBUl9HZXRJbmZvUHRyICh3bmRQdHIpOworCisgICAgVFJBQ0UgKHJlYmFyLCAidGV4dCBjb2xvciAweCUwNmx4IVxuIiwgaW5mb1B0ci0+Y2xyVGV4dCk7CisKKyAgICByZXR1cm4gaW5mb1B0ci0+Y2xyVGV4dDsKK30KKworCisvLyA8PCBSRUJBUl9HZXRUb29sVGlwcyA+PgorLy8gPDwgUkVCQVJfR2V0VW5pY29kZUZvcm1hdCA+PgorLy8gPDwgUkVCQVJfSGl0VGVzdCA+PgorCisKK3N0YXRpYyBMUkVTVUxUCitSRUJBUl9JZFRvSW5kZXggKFdORCAqd25kUHRyLCBXUEFSQU0zMiB3UGFyYW0sIExQQVJBTSBsUGFyYW0pCit7CisgICAgUkVCQVJfSU5GTyAqaW5mb1B0ciA9IFJFQkFSX0dldEluZm9QdHIgKHduZFB0cik7CisgICAgVUlOVDMyIGk7CisKKyAgICBpZiAoaW5mb1B0ciA9PSBOVUxMKQorCXJldHVybiAtMTsKKworICAgIGlmIChpbmZvUHRyLT51TnVtQmFuZHMgPCAxKQorCXJldHVybiAtMTsKKworICAgIFRSQUNFIChyZWJhciwgImlkICV1XG4iLCAoVUlOVDMyKXdQYXJhbSk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgaW5mb1B0ci0+dU51bUJhbmRzOyBpKyspIHsKKwlpZiAoaW5mb1B0ci0+YmFuZHNbaV0ud0lEID09IChVSU5UMzIpd1BhcmFtKQorCSAgICByZXR1cm4gaTsKKyAgICB9CisKKyAgICByZXR1cm4gLTE7Cit9CisKKworc3RhdGljIExSRVNVTFQKK1JFQkFSX0luc2VydEJhbmQzMkEgKFdORCAqd25kUHRyLCBXUEFSQU0zMiB3UGFyYW0sIExQQVJBTSBsUGFyYW0pCit7CisgICAgUkVCQVJfSU5GTyAqaW5mb1B0ciA9IFJFQkFSX0dldEluZm9QdHIgKHduZFB0cik7CisgICAgTFBSRUJBUkJBTkRJTkZPMzJBIGxwcmJiaSA9IChMUFJFQkFSQkFORElORk8zMkEpbFBhcmFtOworICAgIFVJTlQzMiB1SW5kZXggPSAoVUlOVDMyKXdQYXJhbTsKKyAgICBSRUJBUl9CQU5EICpscEJhbmQ7CisKKyAgICBpZiAoaW5mb1B0ciA9PSBOVUxMKQorCXJldHVybiBGQUxTRTsKKyAgICBpZiAobHByYmJpID09IE5VTEwpCisJcmV0dXJuIEZBTFNFOworICAgIGlmIChscHJiYmktPmNiU2l6ZSA8IHNpemVvZiAoUkVCQVJCQU5ESU5GTzMyQSkpCisJcmV0dXJuIEZBTFNFOworCisgICAgaWYgKGluZm9QdHItPnVOdW1CYW5kcyA9PSAwKSB7CisJaW5mb1B0ci0+YmFuZHMgPQorCSAgICAoUkVCQVJfQkFORCAqKUhlYXBBbGxvYyAoR2V0UHJvY2Vzc0hlYXAgKCksIEhFQVBfWkVST19NRU1PUlksCisJCQkJICAgICBzaXplb2YgKFJFQkFSX0JBTkQpKTsKKwl1SW5kZXggPSAwOworICAgIH0KKyAgICBlbHNlIHsKKwlSRUJBUl9CQU5EICpvbGRCYW5kcyA9IGluZm9QdHItPmJhbmRzOworCWluZm9QdHItPmJhbmRzID0KKwkgICAgKFJFQkFSX0JBTkQgKilIZWFwQWxsb2MgKEdldFByb2Nlc3NIZWFwICgpLCBIRUFQX1pFUk9fTUVNT1JZLAorCQkJCSAgICAgKGluZm9QdHItPnVOdW1CYW5kcysxKSpzaXplb2YoUkVCQVJfQkFORCkpOworCWlmICgoSU5UMzIpdUluZGV4ID09IC0xKQorCSAgICB1SW5kZXggPSBpbmZvUHRyLT51TnVtQmFuZHM7CisKKwkvKiBwcmUgY29weSAqLworCisJLyogcG9zdCBjb3B5ICovCisKKwlIZWFwRnJlZSAoR2V0UHJvY2Vzc0hlYXAgKCksIDAsICZvbGRCYW5kcyk7CisgICAgfQorCisgICAgaW5mb1B0ci0+dU51bUJhbmRzKys7CisKKyAgICBUUkFDRSAocmViYXIsICJpbmRleCAldSFcbiIsIHVJbmRleCk7CisKKyAgICAvKiBpbml0aWFsaXplIGJhbmQgKGluZm9QdHItPmJhbmRzW3VJbmRleF0pKi8KKyAgICBscEJhbmQgPSAmaW5mb1B0ci0+YmFuZHNbdUluZGV4XTsKKworICAgIGlmIChscHJiYmktPmZNYXNrICYgUkJCSU1fU1RZTEUpCisJbHBCYW5kLT5mU3R5bGUgPSBscHJiYmktPmZTdHlsZTsKKworICAgIGlmIChscHJiYmktPmZNYXNrICYgUkJCSU1fQ09MT1JTKSB7CisJbHBCYW5kLT5jbHJGb3JlID0gbHByYmJpLT5jbHJGb3JlOworCWxwQmFuZC0+Y2xyQmFjayA9IGxwcmJiaS0+Y2xyQmFjazsKKyAgICB9CisKKyAgICBpZiAoKGxwcmJiaS0+Zk1hc2sgJiBSQkJJTV9URVhUKSAmJiAobHByYmJpLT5scFRleHQpKSB7CisJSU5UMzIgbGVuID0gbHN0cmxlbjMyQSAobHByYmJpLT5scFRleHQpOworCWlmIChsZW4gPiAwKSB7CisJICAgIGxwQmFuZC0+bHBUZXh0ID0gCisJCShMUFNUUilIZWFwQWxsb2MgKEdldFByb2Nlc3NIZWFwICgpLCBIRUFQX1pFUk9fTUVNT1JZLCBsZW4gKyAxKTsKKwkgICAgbHN0cmNweTMyQSAobHBCYW5kLT5scFRleHQsIGxwcmJiaS0+bHBUZXh0KTsKKwl9CisgICAgfQorCisgICAgaWYgKGxwcmJiaS0+Zk1hc2sgJiBSQkJJTV9JTUFHRSkKKwlscEJhbmQtPmlJbWFnZSA9IGxwcmJiaS0+aUltYWdlOworCisgICAgaWYgKGxwcmJiaS0+Zk1hc2sgJiBSQkJJTV9DSElMRCkKKwlscEJhbmQtPmh3bmRDaGlsZCA9IGxwcmJiaS0+aHduZENoaWxkOworCisgICAgaWYgKGxwcmJiaS0+Zk1hc2sgJiBSQkJJTV9DSElMRFNJWkUpIHsKKwlscEJhbmQtPmN4TWluQ2hpbGQgPSBscHJiYmktPmN4TWluQ2hpbGQ7CisJbHBCYW5kLT5jeU1pbkNoaWxkID0gbHByYmJpLT5jeU1pbkNoaWxkOworCWxwQmFuZC0+Y3lNYXhDaGlsZCA9IGxwcmJiaS0+Y3lNYXhDaGlsZDsKKwlscEJhbmQtPmN5Q2hpbGQgICAgPSBscHJiYmktPmN5Q2hpbGQ7CisJbHBCYW5kLT5jeUludGVncmFsID0gbHByYmJpLT5jeUludGVncmFsOworICAgIH0KKworICAgIGlmIChscHJiYmktPmZNYXNrICYgUkJCSU1fU0laRSkKKwlscEJhbmQtPmN4ID0gbHByYmJpLT5jeDsKKworICAgIGlmIChscHJiYmktPmZNYXNrICYgUkJCSU1fQkFDS0dST1VORCkKKwlscEJhbmQtPmhibUJhY2sgPSBscHJiYmktPmhibUJhY2s7CisKKyAgICBpZiAobHByYmJpLT5mTWFzayAmIFJCQklNX0lEKQorCWxwQmFuZC0+d0lEID0gbHByYmJpLT53SUQ7CisKKyAgICAvKiBGSVhNRTogY2hlY2sgZm9yIHNpemUgb2YgYmFuZCBpbmZvIHN0cnVjdHVyZSAqLworCisgICAgaWYgKGxwcmJiaS0+Zk1hc2sgJiBSQkJJTV9JREVBTFNJWkUpCisJbHBCYW5kLT5jeElkZWFsID0gbHByYmJpLT5jeElkZWFsOworCisgICAgaWYgKGxwcmJiaS0+Zk1hc2sgJiBSQkJJTV9MUEFSQU0pCisJbHBCYW5kLT5sUGFyYW0gPSBscHJiYmktPmxQYXJhbTsKKworICAgIGlmIChscHJiYmktPmZNYXNrICYgUkJCSU1fSEVBREVSU0laRSkKKwlscEJhbmQtPmN4SGVhZGVyID0gbHByYmJpLT5jeEhlYWRlcjsKKworICAgIHJldHVybiBUUlVFOworfQorCisKKy8vIDw8IFJFQkFSX0luc2VydEJhbmQzMlcgPj4KKy8vIDw8IFJFQkFSX01heGltaXplQmFuZCA+PgorLy8gPDwgUkVCQVJfTWluaW1pemVCYW5kID4+CisvLyA8PCBSRUJBUl9Nb3ZlQmFuZCA+PgorCisKK3N0YXRpYyBMUkVTVUxUCitSRUJBUl9TZXRCYW5kSW5mbzMyQSAoV05EICp3bmRQdHIsIFdQQVJBTTMyIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSkKK3sKKyAgICBSRUJBUl9JTkZPICppbmZvUHRyID0gUkVCQVJfR2V0SW5mb1B0ciAod25kUHRyKTsKKyAgICBMUFJFQkFSQkFORElORk8zMkEgbHByYmJpID0gKExQUkVCQVJCQU5ESU5GTzMyQSlsUGFyYW07CisgICAgUkVCQVJfQkFORCAqbHBCYW5kOworCisgICAgaWYgKGxwcmJiaSA9PSBOVUxMKQorCXJldHVybiBGQUxTRTsKKyAgICBpZiAobHByYmJpLT5jYlNpemUgPCBzaXplb2YgKExQUkVCQVJCQU5ESU5GTzMyQSkpCisJcmV0dXJuIEZBTFNFOworICAgIGlmICgoVUlOVDMyKXdQYXJhbSA+PSBpbmZvUHRyLT51TnVtQmFuZHMpCisJcmV0dXJuIEZBTFNFOworCisgICAgVFJBQ0UgKHJlYmFyLCAiaW5kZXggJXVcbiIsIChVSU5UMzIpd1BhcmFtKTsKKworICAgIC8qIHNldCBiYW5kIGluZm9ybWF0aW9uICovCisgICAgbHBCYW5kID0gJmluZm9QdHItPmJhbmRzWyhVSU5UMzIpd1BhcmFtXTsKKworICAgIGlmIChscHJiYmktPmZNYXNrICYgUkJCSU1fU1RZTEUpCisJbHBCYW5kLT5mU3R5bGUgPSBscHJiYmktPmZTdHlsZTsKKworICAgIGlmIChscHJiYmktPmZNYXNrICYgUkJCSU1fQ09MT1JTKSB7CisJbHBCYW5kLT5jbHJGb3JlID0gbHByYmJpLT5jbHJGb3JlOworCWxwQmFuZC0+Y2xyQmFjayA9IGxwcmJiaS0+Y2xyQmFjazsKKyAgICB9CisKKyAgICBpZiAoKGxwcmJiaS0+Zk1hc2sgJiBSQkJJTV9URVhUKSAmJiAobHByYmJpLT5scFRleHQpKSB7CisvKgorCUlOVDMyIGxlbiA9IGxzdHJsZW4zMkEgKGxwcmJiaS0+bHBUZXh0KTsKKwlpZiAobGVuID4gMCkgeworCSAgICBscEJhbmQtPmxwVGV4dCA9IAorCQkoTFBTVFIpSGVhcEFsbG9jIChHZXRQcm9jZXNzSGVhcCAoKSwgSEVBUF9aRVJPX01FTU9SWSwgbGVuICsgMSk7CisJICAgIGxzdHJjcHkzMkEgKGxwQmFuZC0+bHBUZXh0LCBscHJiYmktPmxwVGV4dCk7CisJfQorKi8KKyAgICB9CisKKyAgICBpZiAobHByYmJpLT5mTWFzayAmIFJCQklNX0lNQUdFKQorCWxwQmFuZC0+aUltYWdlID0gbHByYmJpLT5pSW1hZ2U7CisKKyAgICBpZiAobHByYmJpLT5mTWFzayAmIFJCQklNX0NISUxEKQorCWxwQmFuZC0+aHduZENoaWxkID0gbHByYmJpLT5od25kQ2hpbGQ7CisKKyAgICBpZiAobHByYmJpLT5mTWFzayAmIFJCQklNX0NISUxEU0laRSkgeworCWxwQmFuZC0+Y3hNaW5DaGlsZCA9IGxwcmJiaS0+Y3hNaW5DaGlsZDsKKwlscEJhbmQtPmN5TWluQ2hpbGQgPSBscHJiYmktPmN5TWluQ2hpbGQ7CisJbHBCYW5kLT5jeU1heENoaWxkID0gbHByYmJpLT5jeU1heENoaWxkOworCWxwQmFuZC0+Y3lDaGlsZCAgICA9IGxwcmJiaS0+Y3lDaGlsZDsKKwlscEJhbmQtPmN5SW50ZWdyYWwgPSBscHJiYmktPmN5SW50ZWdyYWw7CisgICAgfQorCisgICAgaWYgKGxwcmJiaS0+Zk1hc2sgJiBSQkJJTV9TSVpFKQorCWxwQmFuZC0+Y3ggPSBscHJiYmktPmN4OworCisgICAgaWYgKGxwcmJiaS0+Zk1hc2sgJiBSQkJJTV9CQUNLR1JPVU5EKQorCWxwQmFuZC0+aGJtQmFjayA9IGxwcmJiaS0+aGJtQmFjazsKKworICAgIGlmIChscHJiYmktPmZNYXNrICYgUkJCSU1fSUQpCisJbHBCYW5kLT53SUQgPSBscHJiYmktPndJRDsKKworICAgIC8qIEZJWE1FOiBjaGVjayBmb3Igc2l6ZSBvZiBiYW5kIGluZm8gc3RydWN0dXJlICovCisKKyAgICBpZiAobHByYmJpLT5mTWFzayAmIFJCQklNX0lERUFMU0laRSkKKwlscEJhbmQtPmN4SWRlYWwgPSBscHJiYmktPmN4SWRlYWw7CisKKyAgICBpZiAobHByYmJpLT5mTWFzayAmIFJCQklNX0xQQVJBTSkKKwlscEJhbmQtPmxQYXJhbSA9IGxwcmJiaS0+bFBhcmFtOworCisgICAgaWYgKGxwcmJiaS0+Zk1hc2sgJiBSQkJJTV9IRUFERVJTSVpFKQorCWxwQmFuZC0+Y3hIZWFkZXIgPSBscHJiYmktPmN4SGVhZGVyOworCisgICAgcmV0dXJuIFRSVUU7Cit9CisKKworLy8gPDwgUkVCQVJfU2V0QmFuZEluZm8zMlcgPj4KKworCitzdGF0aWMgTFJFU1VMVAorUkVCQVJfU2V0QmFySW5mbyAoV05EICp3bmRQdHIsIFdQQVJBTTMyIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSkKK3sKKyAgICBSRUJBUl9JTkZPICppbmZvUHRyID0gUkVCQVJfR2V0SW5mb1B0ciAod25kUHRyKTsKKyAgICBMUFJFQkFSSU5GTyBscEluZm8gPSAoTFBSRUJBUklORk8pbFBhcmFtOworCisgICAgaWYgKGxwSW5mbyA9PSBOVUxMKQorCXJldHVybiBGQUxTRTsKKworICAgIGlmIChscEluZm8tPmNiU2l6ZSA8IHNpemVvZiAoUkVCQVJJTkZPKSkKKwlyZXR1cm4gRkFMU0U7CisKKyAgICBUUkFDRSAocmViYXIsICJzZXR0aW5nIGJhciBpbmZvIVxuIik7CisKKyAgICBpZiAobHBJbmZvLT5mTWFzayAmIFJCSU1fSU1BR0VMSVNUKQorCWluZm9QdHItPmhpbWwgPSBscEluZm8tPmhpbWw7CisKKyAgICByZXR1cm4gVFJVRTsKK30KKworCitzdGF0aWMgTFJFU1VMVAorUkVCQVJfU2V0QmtDb2xvciAoV05EICp3bmRQdHIsIFdQQVJBTTMyIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSkKK3sKKyAgICBSRUJBUl9JTkZPICppbmZvUHRyID0gUkVCQVJfR2V0SW5mb1B0ciAod25kUHRyKTsKKyAgICBDT0xPUlJFRiBjbHJUZW1wOworCisgICAgY2xyVGVtcCA9IGluZm9QdHItPmNsckJrOworICAgIGluZm9QdHItPmNsckJrID0gKENPTE9SUkVGKWxQYXJhbTsKKworICAgIFRSQUNFIChyZWJhciwgImJhY2tncm91bmQgY29sb3IgMHglMDZseCFcbiIsIGluZm9QdHItPmNsckJrKTsKKworICAgIHJldHVybiBjbHJUZW1wOworfQorCisKKy8vIDw8IFJFQkFSX1NldENvbG9yU2NoZW1lID4+CisvLyA8PCBSRUJBUl9TZXRQYWxldHRlID4+CisvLyA8PCBSRUJBUl9TZXRQYXJlbnQgPj4KKworCitzdGF0aWMgTFJFU1VMVAorUkVCQVJfU2V0VGV4dENvbG9yIChXTkQgKnduZFB0ciwgV1BBUkFNMzIgd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQoreworICAgIFJFQkFSX0lORk8gKmluZm9QdHIgPSBSRUJBUl9HZXRJbmZvUHRyICh3bmRQdHIpOworICAgIENPTE9SUkVGIGNsclRlbXA7CisKKyAgICBjbHJUZW1wID0gaW5mb1B0ci0+Y2xyVGV4dDsKKyAgICBpbmZvUHRyLT5jbHJUZXh0ID0gKENPTE9SUkVGKWxQYXJhbTsKKworICAgIFRSQUNFIChyZWJhciwgInRleHQgY29sb3IgMHglMDZseCFcbiIsIGluZm9QdHItPmNsclRleHQpOworCisgICAgcmV0dXJuIGNsclRlbXA7Cit9CisKKworLy8gPDwgUkVCQVJfU2V0VG9vbHRpcHMgPj4KKy8vIDw8IFJFQkFSX1NldFVuaWNvZGVGb3JtYXQgPj4KKy8vIDw8IFJFQkFSX1Nob3dCYW5kID4+CisvLyA8PCBSRUJBUl9TaXplVG9SZWN0ID4+CisKKworCitzdGF0aWMgTFJFU1VMVAorUkVCQVJfQ3JlYXRlIChXTkQgKnduZFB0ciwgV1BBUkFNMzIgd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQoreworICAgIFJFQkFSX0lORk8gKmluZm9QdHI7CisKKyAgICAvKiBhbGxvY2F0ZSBtZW1vcnkgZm9yIGluZm8gc3RydWN0dXJlICovCisgICAgaW5mb1B0ciA9IChSRUJBUl9JTkZPICopSGVhcEFsbG9jIChHZXRQcm9jZXNzSGVhcCAoKSwgSEVBUF9aRVJPX01FTU9SWSwKKwkJCQkgICAgICAgc2l6ZW9mKFJFQkFSX0lORk8pKTsKKyAgICB3bmRQdHItPndFeHRyYVswXSA9IChEV09SRClpbmZvUHRyOworCisgICAgaWYgKGluZm9QdHIgPT0gTlVMTCkgeworCUVSUiAocmViYXIsICJjb3VsZCBub3QgYWxsb2NhdGUgaW5mbyBtZW1vcnkhXG4iKTsKKwlyZXR1cm4gMDsKKyAgICB9CisKKyAgICBpZiAoKFJFQkFSX0lORk8qKXduZFB0ci0+d0V4dHJhWzBdICE9IGluZm9QdHIpIHsKKwlFUlIgKHJlYmFyLCAicG9pbnRlciBhc3NpZ25tZW50IGVycm9yIVxuIik7CisJcmV0dXJuIDA7CisgICAgfQorCisKKyAgICBpbmZvUHRyLT5jbHJUZXh0ID0gQ0xSX05PTkU7CisgICAgaW5mb1B0ci0+Y2xyVGV4dCA9IFJHQigwLCAwLCAwKTsKKworICAgIFRSQUNFIChyZWJhciwgImNyZWF0ZWQhXG4iKTsKKyAgICByZXR1cm4gMDsKK30KKworCitzdGF0aWMgTFJFU1VMVAorUkVCQVJfRGVzdHJveSAoV05EICp3bmRQdHIsIFdQQVJBTTMyIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSkKK3sKKyAgICBSRUJBUl9JTkZPICppbmZvUHRyID0gUkVCQVJfR2V0SW5mb1B0cih3bmRQdHIpOworICAgIFJFQkFSX0JBTkQgKmxwQmFuZDsKKyAgICBJTlQzMiBpOworCisKKyAgICAvKiBmcmVlIHJlYmFyIGJhbmRzICovCisgICAgaWYgKChpbmZvUHRyLT51TnVtQmFuZHMgPiAwKSAmJiBpbmZvUHRyLT5iYW5kcykgeworCS8qIGNsZWFuIHVwIGVhY2ggYmFuZCAqLworCWZvciAoaSA9IDA7IGkgPCBpbmZvUHRyLT51TnVtQmFuZHM7IGkrKykgeworCSAgICBscEJhbmQgPSAmaW5mb1B0ci0+YmFuZHNbaV07CisKKwkgICAgLyogZGVsZXRlIHRleHQgc3RyaW5ncyAqLworCSAgICBpZiAobHBCYW5kLT5scFRleHQpIHsKKwkJSGVhcEZyZWUgKEdldFByb2Nlc3NIZWFwICgpLCAwLCBscEJhbmQtPmxwVGV4dCk7CisJCWxwQmFuZC0+bHBUZXh0ID0gTlVMTDsKKwkgICAgfQorCX0KKworCS8qIGZyZWUgYmFuZCBhcnJheSAqLworCUhlYXBGcmVlIChHZXRQcm9jZXNzSGVhcCAoKSwgMCwgaW5mb1B0ci0+YmFuZHMpOworCWluZm9QdHItPmJhbmRzID0gTlVMTDsKKyAgICB9CisKKyAgICAvKiBmcmVlIHJlYmFyIGluZm8gZGF0YSAqLworICAgIEhlYXBGcmVlIChHZXRQcm9jZXNzSGVhcCAoKSwgMCwgaW5mb1B0cik7CisKKyAgICBUUkFDRSAocmViYXIsICJkZXN0cm95ZWQhXG4iKTsKKyAgICByZXR1cm4gMDsKK30KKworCisKKwogTFJFU1VMVCBXSU5BUEkKLVJlYmFyV2luZG93UHJvYyAoSFdORDMyIGh3bmQsIFVJTlQzMiB1TXNnLCBXUEFSQU0zMiB3UGFyYW0sIExQQVJBTSBsUGFyYW0pCitSRUJBUl9XaW5kb3dQcm9jIChIV05EMzIgaHduZCwgVUlOVDMyIHVNc2csIFdQQVJBTTMyIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSkKIHsKICAgICBXTkQgKnduZFB0ciA9IFdJTl9GaW5kV25kUHRyKGh3bmQpOwogCiAgICAgc3dpdGNoICh1TXNnKQogICAgIHsKLS8vCWNhc2UgV01fQ1JFQVRFOgotLy8JICAgIHJldHVybiBSRUJBUl9DcmVhdGUgKHduZFB0ciwgd1BhcmFtLCBsUGFyYW0pOworLy8JY2FzZSBSQl9CRUdJTkRSQUc6CisvLwljYXNlIFJCX0RFTEVURUJBTkQ6CisvLwljYXNlIFJCX0RSQUdNT1ZFOgorLy8JY2FzZSBSQl9FTkREUkFHOgorLy8JY2FzZSBSQl9HRVRCQU5EQk9SREVSUzoKIAotLy8JY2FzZSBXTV9ERVNUUk9ZOgotLy8JICAgIHJldHVybiBSRUJBUl9EZXN0cm95ICh3bmRQdHIsIHdQYXJhbSwgbFBhcmFtKTsKKwljYXNlIFJCX0dFVEJBTkRDT1VOVDoKKwkgICAgcmV0dXJuIFJFQkFSX0dldEJhbmRDb3VudCAod25kUHRyKTsKKworLy8JY2FzZSBSQl9HRVRCQU5ESU5GTzMyOiAgLyogb3V0ZGF0ZWQsIGp1c3QgZm9yIGNvbXBhdGliaWxpdHkgKi8KKworCWNhc2UgUkJfR0VUQkFORElORk8zMkE6CisJICAgIHJldHVybiBSRUJBUl9HZXRCYW5kSW5mbzMyQSAod25kUHRyLCB3UGFyYW0sIGxQYXJhbSk7CisKKworLy8JY2FzZSBSQl9HRVRCQU5ESU5GTzMyVzoKKy8vCWNhc2UgUkJfR0VUQkFSSEVJR0hUOgorCisJY2FzZSBSQl9HRVRCQVJJTkZPOgorCSAgICByZXR1cm4gUkVCQVJfR2V0QmFySW5mbyAod25kUHRyLCB3UGFyYW0sIGxQYXJhbSk7CisKKwljYXNlIFJCX0dFVEJLQ09MT1I6CisJICAgIHJldHVybiBSRUJBUl9HZXRCa0NvbG9yICh3bmRQdHIpOworCisvLwljYXNlIFJCX0dFVENPTE9SU0NIRU1FOgorLy8JY2FzZSBSQl9HRVREUk9QVEFSR0VUOgorLy8JY2FzZSBSQl9HRVRQQUxFVFRFOgorLy8JY2FzZSBSQl9HRVRSRUNUOgorLy8JY2FzZSBSQl9HRVRST1dDT1VOVDoKKy8vCWNhc2UgUkJfR0VUUk9XSEVJR0hUOgorCisJY2FzZSBSQl9HRVRURVhUQ09MT1I6CisJICAgIHJldHVybiBSRUJBUl9HZXRUZXh0Q29sb3IgKHduZFB0cik7CisKKy8vCWNhc2UgUkJfR0VUVE9PTFRJUFM6CisvLwljYXNlIFJCX0dFVFVOSUNPREVGT1JNQVQ6CisvLwljYXNlIFJCX0hJVFRFU1Q6CisKKwljYXNlIFJCX0lEVE9JTkRFWDoKKwkgICAgcmV0dXJuIFJFQkFSX0lkVG9JbmRleCAod25kUHRyLCB3UGFyYW0sIGxQYXJhbSk7CisKKwljYXNlIFJCX0lOU0VSVEJBTkQzMkE6CisJICAgIHJldHVybiBSRUJBUl9JbnNlcnRCYW5kMzJBICh3bmRQdHIsIHdQYXJhbSwgbFBhcmFtKTsKKworLy8JY2FzZSBSQl9JTlNFUlRCQU5EMzJXOgorLy8JY2FzZSBSQl9NQVhJTUlaRUJBTkQ6CisvLwljYXNlIFJCX01JTklNSVpFQkFORDoKKy8vCWNhc2UgUkJfTU9WRUJBTkQ6CisKKwljYXNlIFJCX1NFVEJBTkRJTkZPMzJBOgorCSAgICByZXR1cm4gUkVCQVJfU2V0QmFuZEluZm8zMkEgKHduZFB0ciwgd1BhcmFtLCBsUGFyYW0pOworCisvLwljYXNlIFJCX1NFVEJBTkRJTkZPMzJXOgorCisJY2FzZSBSQl9TRVRCQVJJTkZPOgorCSAgICByZXR1cm4gUkVCQVJfU2V0QmFySW5mbyAod25kUHRyLCB3UGFyYW0sIGxQYXJhbSk7CisKKwljYXNlIFJCX1NFVEJLQ09MT1I6CisJICAgIHJldHVybiBSRUJBUl9TZXRCa0NvbG9yICh3bmRQdHIsIHdQYXJhbSwgbFBhcmFtKTsKKworLy8JY2FzZSBSQl9TRVRDT0xPUlNDSEVNRToKKy8vCWNhc2UgUkJfU0VUUEFMRVRURToKKy8vCWNhc2UgUkJfU0VUUEFSRU5UOgorCisJY2FzZSBSQl9TRVRURVhUQ09MT1I6CisJICAgIHJldHVybiBSRUJBUl9TZXRUZXh0Q29sb3IgKHduZFB0ciwgd1BhcmFtLCBsUGFyYW0pOworCisvLwljYXNlIFJCX1NFVFRPT0xUSVBTOgorLy8JY2FzZSBSQl9TRVRVTklDT0RFRk9STUFUOgorLy8JY2FzZSBSQl9TSE9XQkFORDoKKy8vCWNhc2UgUkJfU0laRVRPUkVDVDoKKworCisJY2FzZSBXTV9DUkVBVEU6CisJICAgIHJldHVybiBSRUJBUl9DcmVhdGUgKHduZFB0ciwgd1BhcmFtLCBsUGFyYW0pOworCisJY2FzZSBXTV9ERVNUUk9ZOgorCSAgICByZXR1cm4gUkVCQVJfRGVzdHJveSAod25kUHRyLCB3UGFyYW0sIGxQYXJhbSk7CiAKIC8vCWNhc2UgV01fR0VURk9OVDoKIApAQCAtNzAsNyArNjI1LDcgQEAKIAogICAgIFplcm9NZW1vcnkgKCZ3bmRDbGFzcywgc2l6ZW9mKFdORENMQVNTMzJBKSk7CiAgICAgd25kQ2xhc3Muc3R5bGUgICAgICAgICA9IENTX0dMT0JBTENMQVNTIHwgQ1NfREJMQ0xLUyB8IENTX1NBVkVCSVRTOwotICAgIHduZENsYXNzLmxwZm5XbmRQcm9jICAgPSAoV05EUFJPQzMyKVJlYmFyV2luZG93UHJvYzsKKyAgICB3bmRDbGFzcy5scGZuV25kUHJvYyAgID0gKFdORFBST0MzMilSRUJBUl9XaW5kb3dQcm9jOwogICAgIHduZENsYXNzLmNiQ2xzRXh0cmEgICAgPSAwOwogICAgIHduZENsYXNzLmNiV25kRXh0cmEgICAgPSBzaXplb2YoUkVCQVJfSU5GTyAqKTsKICAgICB3bmRDbGFzcy5oQ3Vyc29yICAgICAgID0gTG9hZEN1cnNvcjMyQSAoMCwgSURDX0FSUk9XMzJBKTsKZGlmZiAtLWdpdCBhL2NvbnRyb2xzL3Rvb2xiYXIuYyBiL2NvbnRyb2xzL3Rvb2xiYXIuYwppbmRleCA2YTg4M2Q1Li4xNDJmZmI2IDEwMDY0NAotLS0gYS9jb250cm9scy90b29sYmFyLmMKKysrIGIvY29udHJvbHMvdG9vbGJhci5jCkBAIC0xMCw3ICsxMCw3IEBACiAgKiAgIC0gTm90aWZpY2F0aW9ucy4KICAqICAgLSBGaXggVEJfR0VUQklUTUFQRkxBR1MuCiAgKiAgIC0gRml4IFRCX0dFVFJPV1MgYW5kIFRCX1NFVFJPV1MuCi0gKiAgIC0gVG9vbHRpcCBzdXBwb3J0ICh1bmRlciBjb250cnVjdGlvbikuCisgKiAgIC0gVG9vbHRpcCBzdXBwb3J0IChhbG1vc3QgY29tcGxldGUpLgogICogICAtIFVuaWNvZGUgc3VwcHBvcnQuCiAgKiAgIC0gSW50ZXJuYWwgQ09NTUNUTDMyIGJpdG1hcHMuCiAgKiAgIC0gRml4IFRPT0xCQVJfQ3VzdG9taXplLiAoQ3VzdG9taXplIGRpYWxvZy4pCkBAIC0yMiw3ICsyMiw3IEBACiAgKiAgICAgZW5hYmxlYnRuLmV4ZSwgZ2V0Ym1wLmV4ZSwgZ2V0YnRuLmV4ZSwgZ2V0ZmxhZ3MuZXhlLCBoaWRlYnRuLmV4ZSwKICAqICAgICBpbmRldGJ0bi5leGUsIGluc2J0bi5leGUsIHByZXNzYnRuLmV4ZSwgc2V0YnRuc3ouZXhlLCBzZXRjbWRpZC5leGUsCiAgKiAgICAgc2V0cGFybnQuZXhlLCBzZXRyb3dzLmV4ZSwgdG9vbHduZC5leGUuCi0gKiAgIC0gYWRkaXRpb25hbCBmZWF0dXJlcy4KKyAqICAgLSBNaWNyb3NvZnRzIGNvbnRyb2xzcHkgZXhhbXBsZXMuCiAgKi8KIAogI2luY2x1ZGUgIndpbmRvd3MuaCIKQEAgLTI0OCwyMCArMjQ4LDI5IEBACiAgICAgSU5UMzIgeCwgeSwgY3gsIGN5OwogICAgIEJPT0wzMiBiVmVydGljYWw7CiAgICAgU0laRTMyICBzaXplU3RyaW5nOworICAgIFJFQ1QzMiByZWN0ID0gezAsIDAsIDAsIDB9OwogCiAgICAgVE9PTEJBUl9DYWxjU3RyaW5ncyAod25kUHRyLCAmc2l6ZVN0cmluZyk7CiAKICAgICBpZiAoc2l6ZVN0cmluZy5jeSA+IDApCiAJaW5mb1B0ci0+bkJ1dHRvbkhlaWdodCA9IHNpemVTdHJpbmcuY3kgKyBpbmZvUHRyLT5uQml0bWFwSGVpZ2h0ICsgNjsKKyAgICBlbHNlIGlmIChpbmZvUHRyLT5uQnV0dG9uSGVpZ2h0IDwgaW5mb1B0ci0+bkJpdG1hcEhlaWdodCArIDYpCisJaW5mb1B0ci0+bkJ1dHRvbkhlaWdodCA9IGluZm9QdHItPm5CaXRtYXBIZWlnaHQgKyA2OwogCiAgICAgaWYgKHNpemVTdHJpbmcuY3ggPiBpbmZvUHRyLT5uQml0bWFwV2lkdGgpCiAJaW5mb1B0ci0+bkJ1dHRvbldpZHRoID0gc2l6ZVN0cmluZy5jeCArIDY7CisgICAgZWxzZSBpZiAoaW5mb1B0ci0+bkJ1dHRvbldpZHRoIDwgaW5mb1B0ci0+bkJpdG1hcFdpZHRoICsgNikKKwlpbmZvUHRyLT5uQnV0dG9uV2lkdGggPSBpbmZvUHRyLT5uQml0bWFwV2lkdGggKyA2OwogCiAgICAgeCAgPSBpbmZvUHRyLT5uSW5kZW50OwogICAgIHkgID0gVE9QX0JPUkRFUjsKICAgICBjeCA9IGluZm9QdHItPm5CdXR0b25XaWR0aDsKICAgICBjeSA9IGluZm9QdHItPm5CdXR0b25IZWlnaHQ7CiAgICAgblJvd3MgPSAxOworICAgIHJlY3QudG9wID0geTsKKyAgICByZWN0LmxlZnQgPSB4OworICAgIHJlY3QuYm90dG9tID0geSArIGN5OworICAgIHJlY3QucmlnaHQgPSB4OwogCiAgICAgYnRuUHRyID0gaW5mb1B0ci0+YnV0dG9uczsKICAgICBmb3IgKGkgPSAwOyBpIDwgaW5mb1B0ci0+bk51bUJ1dHRvbnM7IGkrKywgYnRuUHRyKyspIHsKQEAgLTI3OSwxNCArMjg4LDE0IEBACiAJCXggPSAwOwogCQl5ICs9IGN5OwogCQljeCA9IGluZm9QdHItPm5XaWR0aDsKLQkJY3kgPSAoKGJ0blB0ci0+aUJpdG1hcCA9PSAwKSA/Ci0JCSAgICBTRVBBUkFUT1JfV0lEVEggOiBidG5QdHItPmlCaXRtYXApICogMiAvIDM7CisJCWN5ID0gKChidG5QdHItPmlCaXRtYXAgPiAwKSA/CisJCSAgICAgYnRuUHRyLT5pQml0bWFwIDogU0VQQVJBVE9SX1dJRFRIKSAqIDIgLyAzOwogCQluUm93cysrOwogCQliVmVydGljYWwgPSBUUlVFOwogCSAgICB9CiAJICAgIGVsc2UKLQkJY3ggPSAoYnRuUHRyLT5pQml0bWFwID09IDApID8KLQkJICAgIFNFUEFSQVRPUl9XSURUSCA6IGJ0blB0ci0+aUJpdG1hcDsKKwkJY3ggPSAoYnRuUHRyLT5pQml0bWFwID4gMCkgPworCQkgICAgIGJ0blB0ci0+aUJpdG1hcCA6IFNFUEFSQVRPUl9XSURUSDsKIAl9CiAJZWxzZSB7CiAJICAgIC8qIHRoaXMgbXVzdCBiZSBhIGJ1dHRvbiAqLwpAQCAtMjk5LDYgKzMwOCwxMyBAQAogCWJ0blB0ci0+cmVjdC5yaWdodCAgPSB4ICsgY3g7CiAJYnRuUHRyLT5yZWN0LmJvdHRvbSA9IHkgKyBjeTsKIAorCWlmIChyZWN0LmxlZnQgPiB4KQorCSAgICByZWN0LmxlZnQgPSB4OworCWlmIChyZWN0LnJpZ2h0IDwgeCArIGN4KQorCSAgICByZWN0LnJpZ2h0ID0geCArIGN4OworCWlmIChyZWN0LmJvdHRvbSA8IHkgKyBjeSkKKwkgICAgcmVjdC5ib3R0b20gPSB5ICsgY3k7CisKIAlpZiAoaW5mb1B0ci0+aHduZFRvb2xUaXApIHsKIAkgICAgVFRUT09MSU5GTzMyQSB0aTsKIApAQCAtMzIyLDYgKzMzOCw4IEBACiAgICAgfQogCiAgICAgaW5mb1B0ci0+bkhlaWdodCA9IHkgKyBjeSArIEJPVFRPTV9CT1JERVI7CisgICAgaW5mb1B0ci0+bWF4U2l6ZS5jeCA9IHJlY3QucmlnaHQgLSByZWN0LmxlZnQ7CisgICAgaW5mb1B0ci0+bWF4U2l6ZS5jeSA9IHJlY3QuYm90dG9tIC0gcmVjdC50b3A7CiAgICAgVFJBQ0UgKHRvb2xiYXIsICJ0b29sYmFyIGhlaWdodCAlZFxuIiwgaW5mb1B0ci0+bkhlaWdodCk7CiB9CiAKQEAgLTU0MSwxMyArNTU5LDEzIEBACiAJaW5mb1B0ci0+YnV0dG9uc1tuT2xkQnV0dG9ucytuQ291bnRdLmR3RGF0YSAgICA9IGxwVGJiW25Db3VudF0uZHdEYXRhOwogCWluZm9QdHItPmJ1dHRvbnNbbk9sZEJ1dHRvbnMrbkNvdW50XS5pU3RyaW5nICAgPSBscFRiYltuQ291bnRdLmlTdHJpbmc7CiAKLQlpZiAoaW5mb1B0ci0+aHduZFRvb2xUaXApIHsKKwlpZiAoKGluZm9QdHItPmh3bmRUb29sVGlwKSAmJiAhKGxwVGJiW25Db3VudF0uZnNTdHlsZSAmIFRCU1RZTEVfU0VQKSkgewogCSAgICBUVFRPT0xJTkZPMzJBIHRpOwogCiAJICAgIFplcm9NZW1vcnkgKCZ0aSwgc2l6ZW9mKFRUVE9PTElORk8zMkEpKTsKIAkgICAgdGkuY2JTaXplICAgPSBzaXplb2YgKFRUVE9PTElORk8zMkEpOwogCSAgICB0aS5od25kICAgICA9IHduZFB0ci0+aHduZFNlbGY7Ci0JICAgIHRpLnVJZCAgICAgID0gKExQU1RSKWxwVGJiW25Db3VudF0uaWRDb21tYW5kOworCSAgICB0aS51SWQgICAgICA9IGxwVGJiW25Db3VudF0uaWRDb21tYW5kOwogCSAgICB0aS5oaW5zdCAgICA9IDA7CiAJICAgIHRpLmxwc3pUZXh0ID0gTFBTVFJfVEVYVENBTExCQUNLMzJBOwogCkBAIC02NTQsNyArNjcyLDcgQEAKICAgICBJTlQzMiAgeCwgeSwgY3gsIGN5OwogICAgIFVJTlQzMiB1UG9zRmxhZ3MgPSAwOwogCi0gICAgRklYTUUgKHRvb2xiYXIsICJhdXRvIHNpemUhXG4iKTsKKyAgICBUUkFDRSAodG9vbGJhciwgInJlc2l6aW5nIVxuIik7CiAKICAgICBwYXJlbnQgPSBHZXRQYXJlbnQzMiAod25kUHRyLT5od25kU2VsZik7CiAgICAgR2V0Q2xpZW50UmVjdDMyKHBhcmVudCwgJnBhcmVudF9yZWN0KTsKQEAgLTgwNSw3ICs4MjMsOCBAQAogICAgIGlmICgobkluZGV4IDwgMCkgfHwgKG5JbmRleCA+PSBpbmZvUHRyLT5uTnVtQnV0dG9ucykpCiAJcmV0dXJuIEZBTFNFOwogCi0gICAgaWYgKGluZm9QdHItPmh3bmRUb29sVGlwKSB7CisgICAgaWYgKChpbmZvUHRyLT5od25kVG9vbFRpcCkgJiYgCisJIShpbmZvUHRyLT5idXR0b25zW25JbmRleF0uZnNTdHlsZSAmIFRCU1RZTEVfU0VQKSkgewogCVRUVE9PTElORk8zMkEgdGk7CiAKIAlaZXJvTWVtb3J5ICgmdGksIHNpemVvZihUVFRPT0xJTkZPMzJBKSk7CkBAIC0xMTAyLDcgKzExMjEsMTQgQEAKICAgICBUT09MQkFSX0lORk8gKmluZm9QdHIgPSBUT09MQkFSX0dldEluZm9QdHIod25kUHRyKTsKICAgICBMUFNJWkUzMiBscFNpemUgPSAoTFBTSVpFMzIpbFBhcmFtOwogCi0gICAgRklYTUUgKHRvb2xiYXIsICJlbXB0eSBzdHViIVxuIik7CisgICAgaWYgKGxwU2l6ZSA9PSBOVUxMKQorCXJldHVybiBGQUxTRTsKKworICAgIGxwU2l6ZS0+Y3ggPSBpbmZvUHRyLT5tYXhTaXplLmN4OworICAgIGxwU2l6ZS0+Y3ggPSBpbmZvUHRyLT5tYXhTaXplLmN5OworCisgICAgVFJBQ0UgKHRvb2xiYXIsICJtYXhpbXVtIHNpemUgJWQgeCAlZFxuIiwKKwkgICBpbmZvUHRyLT5tYXhTaXplLmN4LCBpbmZvUHRyLT5tYXhTaXplLmN5KTsKIAogICAgIHJldHVybiBUUlVFOwogfQpAQCAtMTExMCw3ICsxMTM2LDMxIEBACiAKIC8vIDw8IFRPT0xCQVJfR2V0T2JqZWN0ID4+CiAvLyA8PCBUT09MQkFSX0dldFBhZGRpbmcgPj4KLS8vIDw8IFRPT0xCQVJfR2V0UmVjdCA+PgorCisKK3N0YXRpYyBMUkVTVUxUCitUT09MQkFSX0dldFJlY3QgKFdORCAqd25kUHRyLCBXUEFSQU0zMiB3UGFyYW0sIExQQVJBTSBsUGFyYW0pCit7CisgICAgVE9PTEJBUl9JTkZPICppbmZvUHRyID0gVE9PTEJBUl9HZXRJbmZvUHRyKHduZFB0cik7CisgICAgVEJVVFRPTl9JTkZPICpidG5QdHI7CisgICAgTFBSRUNUMzIgICAgIGxwUmVjdDsKKyAgICBJTlQzMiAgICAgICAgbkluZGV4OworCisgICAgaWYgKGluZm9QdHIgPT0gTlVMTCkgcmV0dXJuIEZBTFNFOworICAgIG5JbmRleCA9IChJTlQzMil3UGFyYW07CisgICAgYnRuUHRyID0gJmluZm9QdHItPmJ1dHRvbnNbbkluZGV4XTsKKyAgICBpZiAoKG5JbmRleCA8IDApIHx8IChuSW5kZXggPj0gaW5mb1B0ci0+bk51bUJ1dHRvbnMpKQorCXJldHVybiBGQUxTRTsKKyAgICBscFJlY3QgPSAoTFBSRUNUMzIpbFBhcmFtOworICAgIGlmIChscFJlY3QgPT0gTlVMTCkgcmV0dXJuIEZBTFNFOworICAgIAorICAgIGxwUmVjdC0+bGVmdCAgID0gYnRuUHRyLT5yZWN0LmxlZnQ7CisgICAgbHBSZWN0LT5yaWdodCAgPSBidG5QdHItPnJlY3QucmlnaHQ7CisgICAgbHBSZWN0LT5ib3R0b20gPSBidG5QdHItPnJlY3QuYm90dG9tOworICAgIGxwUmVjdC0+dG9wICAgID0gYnRuUHRyLT5yZWN0LnRvcDsKKworICAgIHJldHVybiBUUlVFOworfQogCiAKIHN0YXRpYyBMUkVTVUxUCkBAIC0xMTUxLDcgKzEyMDEsMTYgQEAKIH0KIAogCi0vLyA8PCBUT09MQkFSX0dldFRleHRSb3dzID4+CitzdGF0aWMgTFJFU1VMVAorVE9PTEJBUl9HZXRUZXh0Um93cyAoV05EICp3bmRQdHIsIFdQQVJBTTMyIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSkKK3sKKyAgICBUT09MQkFSX0lORk8gKmluZm9QdHIgPSBUT09MQkFSX0dldEluZm9QdHIod25kUHRyKTsKKworICAgIGlmIChpbmZvUHRyID09IE5VTEwpCisJcmV0dXJuIDA7CisKKyAgICByZXR1cm4gaW5mb1B0ci0+bk1heFRleHRSb3dzOworfQogCiAKIHN0YXRpYyBMUkVTVUxUCkBAIC0xMTY0LDcgKzEyMjMsMTYgQEAKIH0KIAogCi0vLyA8PCBUT09MQkFSX0dldFVuaWNvZGVGb3JtYXQgPj4KK3N0YXRpYyBMUkVTVUxUCitUT09MQkFSX0dldFVuaWNvZGVGb3JtYXQgKFdORCAqd25kUHRyLCBXUEFSQU0zMiB3UGFyYW0sIExQQVJBTSBsUGFyYW0pCit7CisgICAgVE9PTEJBUl9JTkZPICppbmZvUHRyID0gVE9PTEJBUl9HZXRJbmZvUHRyKHduZFB0cik7CisKKyAgICBUUkFDRSAodG9vbGJhciwgIiVzIGh3bmQ9MHglMDR4IHN0dWIhXG4iLCAKKwkgICBpbmZvUHRyLT5iVW5pY29kZSA/ICJUUlVFIiA6ICJGQUxTRSIsIHduZFB0ci0+aHduZFNlbGYpOworCisgICAgcmV0dXJuIGluZm9QdHItPmJVbmljb2RlOworfQogCiAKIHN0YXRpYyBMUkVTVUxUCkBAIC0xMTkzLDcgKzEyNjEsNyBAQAogfQogCiAKLXN0YXRpYyBMUkVTVUxUCitfX2lubGluZV9fIHN0YXRpYyBMUkVTVUxUCiBUT09MQkFSX0hpdFRlc3QgKFdORCAqd25kUHRyLCBXUEFSQU0zMiB3UGFyYW0sIExQQVJBTSBsUGFyYW0pCiB7CiAgICAgcmV0dXJuIFRPT0xCQVJfSW50ZXJuYWxIaXRUZXN0ICh3bmRQdHIsIChMUFBPSU5UMzIpbFBhcmFtKTsKQEAgLTEyNjIsNyArMTMzMCw3IEBACiAgICAgaW5mb1B0ci0+YnV0dG9uc1tuSW5kZXhdLmR3RGF0YSAgICA9IGxwVGJiLT5kd0RhdGE7CiAgICAgaW5mb1B0ci0+YnV0dG9uc1tuSW5kZXhdLmlTdHJpbmcgICA9IGxwVGJiLT5pU3RyaW5nOwogCi0gICAgaWYgKGluZm9QdHItPmh3bmRUb29sVGlwKSB7CisgICAgaWYgKChpbmZvUHRyLT5od25kVG9vbFRpcCkgJiYgIShscFRiYi0+ZnNTdHlsZSAmIFRCU1RZTEVfU0VQKSkgewogCVRUVE9PTElORk8zMkEgdGk7CiAKIAlaZXJvTWVtb3J5ICgmdGksIHNpemVvZihUVFRPT0xJTkZPMzJBKSk7CkBAIC0xNDgyLDcgKzE1NTAsMTkgQEAKIH0KIAogCi0vLyA8PCBUT09MQkFSX1NldEJ1dHRvbldpZHRoID4+CitzdGF0aWMgTFJFU1VMVAorVE9PTEJBUl9TZXRCdXR0b25XaWR0aCAoV05EICp3bmRQdHIsIFdQQVJBTTMyIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSkKK3sKKyAgICBUT09MQkFSX0lORk8gKmluZm9QdHIgPSBUT09MQkFSX0dldEluZm9QdHIod25kUHRyKTsKKworICAgIGlmIChpbmZvUHRyID09IE5VTEwpCisJcmV0dXJuIEZBTFNFOworCisgICAgaW5mb1B0ci0+Y3hNaW4gPSAoSU5UMzIpTE9XT1JEKGxQYXJhbSk7CisgICAgaW5mb1B0ci0+Y3hNYXggPSAoSU5UMzIpSElXT1JEKGxQYXJhbSk7CisKKyAgICByZXR1cm4gVFJVRTsKK30KIAogCiBzdGF0aWMgTFJFU1VMVApAQCAtMTQ5Niw2ICsxNTc2LDEyIEBACiAKICAgICBpbmZvUHRyLT5idXR0b25zW25JbmRleF0uaWRDb21tYW5kID0gKElOVDMyKWxQYXJhbTsKIAorICAgIGlmIChpbmZvUHRyLT5od25kVG9vbFRpcCkgeworCisJRklYTUUgKHRvb2xiYXIsICJjaGFuZ2UgdG9vbCB0aXAhXG4iKTsKKworICAgIH0KKwogICAgIHJldHVybiBUUlVFOwogfQogCkBAIC0xNjA4LDcgKzE2OTQsMjAgQEAKIH0KIAogCi0vLyA8PCBUT09MQkFSX1NldE1heFRleHRSb3dzID4+CitzdGF0aWMgTFJFU1VMVAorVE9PTEJBUl9TZXRNYXhUZXh0Um93cyAoV05EICp3bmRQdHIsIFdQQVJBTTMyIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSkKK3sKKyAgICBUT09MQkFSX0lORk8gKmluZm9QdHIgPSBUT09MQkFSX0dldEluZm9QdHIod25kUHRyKTsKKworICAgIGlmIChpbmZvUHRyID09IE5VTEwpCisJcmV0dXJuIEZBTFNFOworCisgICAgaW5mb1B0ci0+bk1heFRleHRSb3dzID0gKElOVDMyKXdQYXJhbTsKKworICAgIHJldHVybiBUUlVFOworfQorCisKIC8vIDw8IFRPT0xCQVJfU2V0UGFkZGluZyA+PgogCiAKQEAgLTE2NzksNiArMTc3OCwxMiBAQAogICAgIFRPT0xCQVJfRHJhd0J1dHRvbiAod25kUHRyLCBidG5QdHIsIGhkYyk7CiAgICAgUmVsZWFzZURDMzIgKHduZFB0ci0+aHduZFNlbGYsIGhkYyk7CiAKKyAgICBpZiAoaW5mb1B0ci0+aHduZFRvb2xUaXApIHsKKworCUZJWE1FICh0b29sYmFyLCAiY2hhbmdlIHRvb2wgdGlwIVxuIik7CisKKyAgICB9CisKICAgICByZXR1cm4gVFJVRTsKIH0KIApAQCAtMTY5OCwxMCArMTgwMywxNSBAQAogVE9PTEJBUl9TZXRVbmljb2RlRm9ybWF0IChXTkQgKnduZFB0ciwgV1BBUkFNMzIgd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQogewogICAgIFRPT0xCQVJfSU5GTyAqaW5mb1B0ciA9IFRPT0xCQVJfR2V0SW5mb1B0cih3bmRQdHIpOworICAgIEJPT0wzMiBiVGVtcDsKIAotICAgIEZJWE1FICh0b29sYmFyLCAiaHduZD0weCUwNHggc3R1YiFcbiIsIHduZFB0ci0+aHduZFNlbGYpOworICAgIFRSQUNFICh0b29sYmFyLCAiJXMgaHduZD0weCUwNHggc3R1YiFcbiIsIAorCSAgICgoQk9PTDMyKXdQYXJhbSkgPyAiVFJVRSIgOiAiRkFMU0UiLCB3bmRQdHItPmh3bmRTZWxmKTsKIAotICAgIHJldHVybiAwOworICAgIGJUZW1wID0gaW5mb1B0ci0+YlVuaWNvZGU7CisgICAgaW5mb1B0ci0+YlVuaWNvZGUgPSAoQk9PTDMyKXdQYXJhbTsKKworICAgIHJldHVybiBiVGVtcDsKIH0KIAogCkBAIC0xNzE5LDggKzE4MjksMTIgQEAKIAogICAgIGluZm9QdHItPm5IZWlnaHQgPSBpbmZvUHRyLT5uQnV0dG9uSGVpZ2h0ICsgVE9QX0JPUkRFUiArIEJPVFRPTV9CT1JERVI7CiAgICAgaW5mb1B0ci0+bk1heFJvd3MgPSAxOworICAgIGluZm9QdHItPm5NYXhUZXh0Um93cyA9IDE7CisgICAgaW5mb1B0ci0+Y3hNaW4gPSAtMTsKKyAgICBpbmZvUHRyLT5jeE1heCA9IC0xOwogCi0gICAgaW5mb1B0ci0+YkNhcHR1cmVkID0gMDsKKyAgICBpbmZvUHRyLT5iQ2FwdHVyZWQgPSBGQUxTRTsKKyAgICBpbmZvUHRyLT5iVW5pY29kZSA9IEZBTFNFOwogICAgIGluZm9QdHItPm5CdXR0b25Eb3duID0gLTE7CiAgICAgaW5mb1B0ci0+bk9sZEhpdCA9IC0xOwogCkBAIC0xNzM3LDggKzE4NTEsNyBAQAogCSAgICBDcmVhdGVXaW5kb3dFeDMyQSAoMCwgVE9PTFRJUFNfQ0xBU1MzMkEsIE5VTEwsIFRUU19BTFdBWVNUSVAsCiAJCQkgICAgICAgQ1dfVVNFREVGQVVMVDMyLCBDV19VU0VERUZBVUxUMzIsCiAJCQkgICAgICAgQ1dfVVNFREVGQVVMVDMyLCBDV19VU0VERUZBVUxUMzIsCi0JCQkgICAgICAgd25kUHRyLT5od25kU2VsZiwgMCwKLQkJCSAgICAgICB3bmRQdHItPmhJbnN0YW5jZSwgMCk7CisJCQkgICAgICAgd25kUHRyLT5od25kU2VsZiwgMCwgMCwgMCk7CiAKIAkvKiBTZW5kIE5NX1RPT0xUSVBTQ1JFQVRFRCBub3RpZmljYXRpb24gKi8KIAlpZiAoaW5mb1B0ci0+aHduZFRvb2xUaXApIHsKQEAgLTE5OTcsNyArMjExMCw3IEBACiB9CiAKIAotCisvLyA8PCBUT09MQkFSX05DQWN0aXZhdGUgPj4KIAogCiBzdGF0aWMgTFJFU1VMVApAQCAtMjAwNSw4ICsyMTE4LDcgQEAKIHsKICAgICBpZiAoISh3bmRQdHItPmR3U3R5bGUgJiBDQ1NfTk9ESVZJREVSKSkgewogCUxQUkVDVDMyIHdpblJlY3QgID0gKExQUkVDVDMyKWxQYXJhbTsKLQl3aW5SZWN0LT50b3AgICAgKz0gMjsgICAKLQl3aW5SZWN0LT5ib3R0b20gKz0gMjsgICAKKwl3aW5SZWN0LT50b3AgKz0gMjsgICAKICAgICB9CiAKICAgICByZXR1cm4gRGVmV2luZG93UHJvYzMyQSAod25kUHRyLT5od25kU2VsZiwgV01fTkNDQUxDU0laRSwgd1BhcmFtLCBsUGFyYW0pOwpAQCAtMjA5NiwxMSArMjIwOCwyNSBAQAogICAgIFRPT0xCQVJfSU5GTyAqaW5mb1B0ciA9IFRPT0xCQVJfR2V0SW5mb1B0cih3bmRQdHIpOwogICAgIExQTk1IRFIgbHBubWggPSAoTFBOTUhEUilsUGFyYW07CiAKLSAgICBpZiAoKGluZm9QdHItPmh3bmRUb29sVGlwKSAmJiAoKGxwbm1oLT5jb2RlID09IFRUTl9HRVRESVNQSU5GTzMyQSkgfHwKLQkobHBubWgtPmNvZGUgPT0gVFROX0dFVERJU1BJTkZPMzJXKSkpIHsKKyAgICBUUkFDRSAodG9vbGJhciwgInBhc3NpbmcgV01fTk9USUZZIVxuIik7CiAKLQlTZW5kTWVzc2FnZTMyQSAoR2V0UGFyZW50MzIgKHduZFB0ci0+aHduZFNlbGYpLCBXTV9OT1RJRlksCi0JCQl3UGFyYW0sIGxQYXJhbSk7CisgICAgaWYgKChpbmZvUHRyLT5od25kVG9vbFRpcCkgJiYgKGxwbm1oLT5od25kRnJvbSA9PSBpbmZvUHRyLT5od25kVG9vbFRpcCkpIHsKKwlTZW5kTWVzc2FnZTMyQSAoaW5mb1B0ci0+aHduZE5vdGlmeSwgV01fTk9USUZZLAl3UGFyYW0sIGxQYXJhbSk7CisKKyNpZiAwCisJaWYgKGxwbm1oLT5jb2RlID09IFRUTl9HRVRESVNQSU5GTzMyQSkgeworCSAgICBMUE5NVFRESVNQSU5GTzMyQSBscGRpID0gKExQTk1UVERJU1BJTkZPMzJBKWxQYXJhbTsKKworCSAgICBGSVhNRSAodG9vbGJhciwgInJldHJpZXZpbmcgQVNDSUkgc3RyaW5nXG4iKTsKKworCX0KKwllbHNlIGlmIChscG5taC0+Y29kZSA9PSBUVE5fR0VURElTUElORk8zMlcpIHsKKwkgICAgTFBOTVRURElTUElORk8zMlcgbHBkaSA9IChMUE5NVFRESVNQSU5GTzMyVylsUGFyYW07CisKKwkgICAgRklYTUUgKHRvb2xiYXIsICJyZXRyaWV2aW5nIFVOSUNPREUgc3RyaW5nXG4iKTsKKworCX0KKyNlbmRpZgogICAgIH0KIAogICAgIHJldHVybiAwOwpAQCAtMjI4Niw3ICsyNDEyLDkgQEAKIAogLy8JY2FzZSBUQl9HRVRPQkpFQ1Q6CQkJLyogNC43MSAqLwogLy8JY2FzZSBUQl9HRVRQQURESU5HOgkJCS8qIDQuNzEgKi8KLS8vCWNhc2UgVEJfR0VUUkVDVDoJCQkvKiA0LjcwICovCisKKwljYXNlIFRCX0dFVFJFQ1Q6CisJICAgIHJldHVybiBUT09MQkFSX0dldFJlY3QgKHduZFB0ciwgd1BhcmFtLCBsUGFyYW0pOwogCiAJY2FzZSBUQl9HRVRST1dTOgogCSAgICByZXR1cm4gVE9PTEJBUl9HZXRSb3dzICh3bmRQdHIsIHdQYXJhbSwgbFBhcmFtKTsKQEAgLTIyOTcsMTIgKzI0MjUsMTQgQEAKIAljYXNlIFRCX0dFVFNUWUxFOgogCSAgICByZXR1cm4gVE9PTEJBUl9HZXRTdHlsZSAod25kUHRyLCB3UGFyYW0sIGxQYXJhbSk7CiAKLS8vCWNhc2UgVEJfR0VUVEVYVFJPV1M6CQkJLyogNC43MCAqLworCWNhc2UgVEJfR0VUVEVYVFJPV1M6CisJICAgIHJldHVybiBUT09MQkFSX0dldFRleHRSb3dzICh3bmRQdHIsIHdQYXJhbSwgbFBhcmFtKTsKIAogCWNhc2UgVEJfR0VUVE9PTFRJUFM6CiAJICAgIHJldHVybiBUT09MQkFSX0dldFRvb2xUaXBzICh3bmRQdHIsIHdQYXJhbSwgbFBhcmFtKTsKIAotLy8JY2FzZSBUQl9HRVRVTklDT0RFRk9STUFUOgorCWNhc2UgVEJfR0VUVU5JQ09ERUZPUk1BVDoKKwkgICAgcmV0dXJuIFRPT0xCQVJfR2V0VW5pY29kZUZvcm1hdCAod25kUHRyLCB3UGFyYW0sIGxQYXJhbSk7CiAKIAljYXNlIFRCX0hJREVCVVRUT046CiAJICAgIHJldHVybiBUT09MQkFSX0hpZGVCdXR0b24gKHduZFB0ciwgd1BhcmFtLCBsUGFyYW0pOwpAQCAtMjM2Myw3ICsyNDkzLDggQEAKIAljYXNlIFRCX1NFVEJVVFRPTlNJWkU6CiAJICAgIHJldHVybiBUT09MQkFSX1NldEJ1dHRvblNpemUgKHduZFB0ciwgd1BhcmFtLCBsUGFyYW0pOwogCi0vLwljYXNlIFRCX1NFVEJVVFRPTldJRFRIOgkJCS8qIDQuNzAgKi8KKwljYXNlIFRCX1NFVEJVVFRPTldJRFRIOgorCSAgICByZXR1cm4gVE9PTEJBUl9TZXRCdXR0b25XaWR0aCAod25kUHRyLCB3UGFyYW0sIGxQYXJhbSk7CiAKIAljYXNlIFRCX1NFVENNRElEOgogCSAgICByZXR1cm4gVE9PTEJBUl9TZXRDbWRJZCAod25kUHRyLCB3UGFyYW0sIGxQYXJhbSk7CkBAIC0yMzk0LDcgKzI1MjUsOSBAQAogCWNhc2UgVEJfU0VUSU5TRVJUTUFSS0NPTE9SOgogCSAgICByZXR1cm4gVE9PTEJBUl9TZXRJbnNlcnRNYXJrQ29sb3IgKHduZFB0ciwgd1BhcmFtLCBsUGFyYW0pOwogCi0vLwljYXNlIFRCX1NFVE1BWFRFWFRST1dTOgkJCS8qIDQuNzAgKi8KKwljYXNlIFRCX1NFVE1BWFRFWFRST1dTOgorCSAgICByZXR1cm4gVE9PTEJBUl9TZXRNYXhUZXh0Um93cyAod25kUHRyLCB3UGFyYW0sIGxQYXJhbSk7CisKIC8vCWNhc2UgVEJfU0VUUEFERElORzoJCQkvKiA0LjcxICovCiAKIAljYXNlIFRCX1NFVFBBUkVOVDoKZGlmZiAtLWdpdCBhL2NvbnRyb2xzL3Rvb2x0aXBzLmMgYi9jb250cm9scy90b29sdGlwcy5jCmluZGV4IGUwZTg0NzcuLmJhZjY5NzEgMTAwNjQ0Ci0tLSBhL2NvbnRyb2xzL3Rvb2x0aXBzLmMKKysrIGIvY29udHJvbHMvdG9vbHRpcHMuYwpAQCAtNCwyNCArNCwxOCBAQAogICogQ29weXJpZ2h0IDE5OTggRXJpYyBLb2hsCiAgKgogICogVE9ETzoKLSAqICAgLSBTdWJjbGFzc2luZy4KICAqICAgLSBUcmFja2luZyB0b29sdGlwcyAodW5kZXIgY29uc3RydWN0aW9uKS4KICAqICAgLSBUVFNfQUxXQVlTVElQICh1bmRlZmluZWQpLgogICogICAtIFVuaWNvZGUgc3VwcG9ydC4KICAqICAgLSBDdXN0b20gZHJhdyBzdXBwb3J0LgorICogICAtIFRoZSAibFBhcmFtIiB2YXJpYWJsZSBmcm9tIE5NVFRESVNQSU5GTzMyQSBpcyBub3QgaGFuZGxlZAorICogICAgIGluIFRPT0xUSVBTX0dldFRpcFRleHQuCiAgKgogICogVGVzdGluZzoKICAqICAgLSBSdW4gdGVzdHMgdXNpbmcgV2FpdGUgR3JvdXAgV2luZG93czk1IEFQSSBCaWJsZSBWb2x1bWUgMi4KICAqICAgICBUaGUgc2Vjb25kIGNkcm9tIChjaGFwdGVyIDMpIGNvbnRhaW5zIGV4ZWN1dGFibGVzIGFjdGl2YXRlLmV4ZSwKICAqICAgICBjdXJ0b29sLmV4ZSwgZGVsdG9vbC5leGUsIGVudW10b29scy5leGUsIGdldGluZm8uZXhlLCBnZXRpcHR4dC5leGUsCiAgKiAgICAgaGl0dGVzdC5leGUsIG5lZWR0ZXh0LmV4ZSwgbmV3cmVjdC5leGUsIHVwZHRleHQuZXhlIGFuZCB3aW5mcnB0LmV4ZS4KLSAqCi0gKiAgIC0gQWN0aXZhdGUuZXhlLCBkZWx0b29sLmV4ZSwgZW51bXRvb2wuZXhlLCBnZXRpbmZvLmV4ZSBhbmQgZ2V0aXB0eHQuZXhlCi0gKiAgICAgYXJlIHRoZSBvbmx5IHdvcmtpbmcgZXhhbXBsZXMsIHNpbmNlIHN1YmNsYXNzaW5nIGlzIG5vdCBpbXBsZW1lbnRlZC4KLSAqCi0gKiBGaXhtZToKLSAqICAgLSBUaGUgImxQYXJhbSIgdmFyaWFibGUgZnJvbSBOTVRURElTUElORk8zMkEgaXMgbm90IGhhbmRsZWQKLSAqICAgICBpbiBUT09MVElQU19HZXRUaXBUZXh0LgogICovCiAKICNpbmNsdWRlICJ3aW5kb3dzLmgiCkBAIC0zNSwxMCArMjksMTUgQEAKICNkZWZpbmUgSURfVElNRVIxICAxICAgIC8qIHNob3cgZGVsYXkgdGltZXIgKi8KICNkZWZpbmUgSURfVElNRVIyICAyICAgIC8qIGF1dG8gcG9wIHRpbWVyICovCiAjZGVmaW5lIElEX1RJTUVSMyAgMyAgICAvKiB0b29sIGxlYXZlIHRpbWVyICovCisjZGVmaW5lIFRUX1NVQkNMQVNTX1BST1AgIkNDMzJTdWJjbGFzc0luZm8iICAgLyogcHJvcGVydHkgbmFtZSBvZiB0b29sdGlwIHdpbmRvdyBoYW5kbGUgKi8KIAogI2RlZmluZSBUT09MVElQU19HZXRJbmZvUHRyKHduZFB0cikgKChUT09MVElQU19JTkZPICopd25kUHRyLT53RXh0cmFbMF0pCiAKIAorTFJFU1VMVCBDQUxMQkFDSworVE9PTFRJUFNfU3ViY2xhc3NQcm9jIChIV05EMzIgaHduZCwgVUlOVDMyIHVNc2csIFdQQVJBTTMyIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSk7CisKKwogc3RhdGljIFZPSUQKIFRPT0xUSVBTX1JlZnJlc2ggKFdORCAqd25kUHRyLCBIREMzMiBoZGMpCiB7CkBAIC05MSw4ICs5MCw4IEBACiAJICAgIHR0bm1kaS5scHN6VGV4dCA9IGluZm9QdHItPnN6VGlwVGV4dDsKIAogCSAgICBUUkFDRSAodG9vbHRpcHMsICJoZHIuaWRGcm9tID0gJXhcbiIsIHR0bm1kaS5oZHIuaWRGcm9tKTsKLQkgICAgU2VuZE1lc3NhZ2UzMkEgKEdldFBhcmVudDMyICh3bmRQdHItPmh3bmRTZWxmKSwgV01fTk9USUZZLAotCQkJICAgIChXUEFSQU0zMil3bmRQdHItPndJRG1lbnUsIChMUEFSQU0pJnR0bm1kaSk7CisJICAgIFNlbmRNZXNzYWdlMzJBICh0b29sUHRyLT5od25kLCBXTV9OT1RJRlksCisJCQkgICAgKFdQQVJBTTMyKXRvb2xQdHItPnVJZCwgKExQQVJBTSkmdHRubWRpKTsKIAogCSAgICBpZiAodHRubWRpLmhpbnN0KSB7CiAJCUxvYWRTdHJpbmczMkEgKHR0bm1kaS5oaW5zdCwgKFVJTlQzMil0dG5tZGkuc3pUZXh0LApAQCAtMTk1LDE3ICsxOTQsMTcgQEAKIAlyZXR1cm47CiAgICAgfQogCi0gICAgVFJBQ0UgKHRvb2x0aXBzLCAiU2hvdyB0b29sdGlwICVkIVxuIiwgaW5mb1B0ci0+blRvb2wpOworICAgIFRSQUNFICh0b29sdGlwcywgIlNob3cgdG9vbHRpcCAlZCFcbiIsIGluZm9QdHItPm5DdXJyZW50VG9vbCk7CisgICAgdG9vbFB0ciA9ICZpbmZvUHRyLT50b29sc1tpbmZvUHRyLT5uQ3VycmVudFRvb2xdOwogCiAgICAgaGRyLmh3bmRGcm9tID0gd25kUHRyLT5od25kU2VsZjsKLSAgICBoZHIuaWRGcm9tID0gaW5mb1B0ci0+blRvb2w7CisgICAgaGRyLmlkRnJvbSA9IHRvb2xQdHItPnVJZDsKICAgICBoZHIuY29kZSA9IFRUTl9TSE9XOwotICAgIFNlbmRNZXNzYWdlMzJBIChHZXRQYXJlbnQzMiAod25kUHRyLT5od25kU2VsZiksIFdNX05PVElGWSwKLQkJICAgIChXUEFSQU0zMil3bmRQdHItPndJRG1lbnUsIChMUEFSQU0pJmhkcik7CisgICAgU2VuZE1lc3NhZ2UzMkEgKHRvb2xQdHItPmh3bmQsIFdNX05PVElGWSwKKwkJICAgIChXUEFSQU0zMil0b29sUHRyLT51SWQsIChMUEFSQU0pJmhkcik7CiAKICAgICBUUkFDRSAodG9vbHRpcHMsICJcIiVzXCJcbiIsIGluZm9QdHItPnN6VGlwVGV4dCk7CiAKLSAgICB0b29sUHRyID0gJmluZm9QdHItPnRvb2xzW2luZm9QdHItPm5Ub29sXTsKICAgICBUT09MVElQU19DYWxjVGlwU2l6ZSAod25kUHRyLCBpbmZvUHRyLCAmc2l6ZSk7CiAgICAgVFJBQ0UgKHRvb2x0aXBzLCAic2l6ZSAlZCAtICVkXG4iLCBzaXplLmN4LCBzaXplLmN5KTsKIApAQCAtMjMyLDkgKzIzMSw4IEBACiAKICAgICBUUkFDRSAodG9vbHRpcHMsICJwb3MgJWQgLSAlZFxuIiwgcHQueCwgcHQueSk7CiAKLS8vICAgIFNldFdpbmRvd1BvczMyICh3bmRQdHItPmh3bmRTZWxmLCBIV05EX1RPUCwgcHQueCwgcHQueSwKLS8vCQkgICAgc2l6ZS5jeCwgc2l6ZS5jeSwgU1dQX1NIT1dXSU5ET1cpOwotICAgIFNldFdpbmRvd1BvczMyICh3bmRQdHItPmh3bmRTZWxmLCBIV05EX1RPUCwgMSwgMSwKKy8vICAgIFNldFdpbmRvd1BvczMyICh3bmRQdHItPmh3bmRTZWxmLCBIV05EX1RPUCwgMSwgMSwKKyAgICBTZXRXaW5kb3dQb3MzMiAod25kUHRyLT5od25kU2VsZiwgSFdORF9UT1AsIHB0LngsIHB0LnksCiAJCSAgICBzaXplLmN4LCBzaXplLmN5LCBTV1BfU0hPV1dJTkRPVyk7CiAKICAgICBTZXRUaW1lcjMyICh3bmRQdHItPmh3bmRTZWxmLCBJRF9USU1FUjIsIGluZm9QdHItPm5BdXRvUG9wVGltZSwgMCk7CkBAIC0yNDQsMTkgKzI0MiwyMSBAQAogc3RhdGljIFZPSUQKIFRPT0xUSVBTX0hpZGUgKFdORCAqd25kUHRyLCBUT09MVElQU19JTkZPICppbmZvUHRyKQogeworICAgIFRUVE9PTF9JTkZPICp0b29sUHRyOwogICAgIE5NSERSIGhkcjsKIAogICAgIGlmIChpbmZvUHRyLT5uQ3VycmVudFRvb2wgPT0gLTEpCiAJcmV0dXJuOwogCisgICAgdG9vbFB0ciA9ICZpbmZvUHRyLT50b29sc1tpbmZvUHRyLT5uQ3VycmVudFRvb2xdOwogICAgIFRSQUNFICh0b29sdGlwcywgIkhpZGUgdG9vbHRpcCAlZCFcbiIsIGluZm9QdHItPm5DdXJyZW50VG9vbCk7CiAgICAgS2lsbFRpbWVyMzIgKHduZFB0ci0+aHduZFNlbGYsIElEX1RJTUVSMik7CiAKICAgICBoZHIuaHduZEZyb20gPSB3bmRQdHItPmh3bmRTZWxmOwotICAgIGhkci5pZEZyb20gPSBpbmZvUHRyLT5uQ3VycmVudFRvb2w7CisgICAgaGRyLmlkRnJvbSA9IHRvb2xQdHItPnVJZDsKICAgICBoZHIuY29kZSA9IFRUTl9QT1A7Ci0gICAgU2VuZE1lc3NhZ2UzMkEgKEdldFBhcmVudDMyICh3bmRQdHItPmh3bmRTZWxmKSwgV01fTk9USUZZLAotCQkgICAgKFdQQVJBTTMyKXduZFB0ci0+d0lEbWVudSwgKExQQVJBTSkmaGRyKTsKKyAgICBTZW5kTWVzc2FnZTMyQSAodG9vbFB0ci0+aHduZCwgV01fTk9USUZZLAorCQkgICAgKFdQQVJBTTMyKXRvb2xQdHItPnVJZCwgKExQQVJBTSkmaGRyKTsKIAogICAgIGluZm9QdHItPm5DdXJyZW50VG9vbCA9IC0xOwogCkBAIC0yNzAsMjIgKzI3MCw2IEBACiAgICAgVFRUT09MX0lORk8gKnRvb2xQdHI7CiAgICAgSU5UMzIgblRvb2w7CiAKLSNpZiAwCi0gICAgZm9yIChuVG9vbCA9IDA7IG5Ub29sIDwgaW5mb1B0ci0+dU51bVRvb2xzOyBuVG9vbCsrKSB7Ci0JdG9vbFB0ciA9ICZpbmZvUHRyLT50b29sc1tuVG9vbF07Ci0KLQlpZiAodG9vbFB0ci0+dUZsYWdzICYgVFRGX0lESVNIV05EKSB7Ci0JICAgIGlmIChscFRvb2xJbmZvLT51SWQgPT0gdG9vbFB0ci0+dUlkKQotCQlyZXR1cm4gblRvb2w7Ci0JfQotCWVsc2UgewotCSAgICBpZiAoKGxwVG9vbEluZm8tPmh3bmQgPT0gdG9vbFB0ci0+aHduZCkgJiYKLQkJKGxwVG9vbEluZm8tPnVJZCA9PSB0b29sUHRyLT51SWQpKQotCQlyZXR1cm4gblRvb2w7Ci0JfQotICAgIH0KLSNlbmRpZgotCiAgICAgZm9yIChuVG9vbCA9IDA7IG5Ub29sIDwgaW5mb1B0ci0+dU51bVRvb2xzOyBuVG9vbCsrKSB7CiAJdG9vbFB0ciA9ICZpbmZvUHRyLT50b29sc1tuVG9vbF07CiAKQEAgLTMxNiwxMSArMzAwLDcgQEAKICAgICBmb3IgKG5Ub29sID0gMDsgblRvb2wgPCBpbmZvUHRyLT51TnVtVG9vbHM7IG5Ub29sKyspIHsKIAl0b29sUHRyID0gJmluZm9QdHItPnRvb2xzW25Ub29sXTsKIAotCWlmICh0b29sUHRyLT51RmxhZ3MgJiBUVEZfSURJU0hXTkQpIHsKLQkgICAgaWYgKChIV05EMzIpdG9vbFB0ci0+dUlkID09IGh3bmQpCi0JCXJldHVybiBuVG9vbDsKLQl9Ci0JZWxzZSB7CisJaWYgKCEodG9vbFB0ci0+dUZsYWdzICYgVFRGX0lESVNIV05EKSkgewogCSAgICBpZiAoaHduZCAhPSB0b29sUHRyLT5od25kKQogCQljb250aW51ZTsKIAkgICAgaWYgKCFQdEluUmVjdDMyICgmdG9vbFB0ci0+cmVjdCwgKmxwUHQpKQpAQCAtMzI5LDEwICszMDksMzQgQEAKIAl9CiAgICAgfQogCisgICAgZm9yIChuVG9vbCA9IDA7IG5Ub29sIDwgaW5mb1B0ci0+dU51bVRvb2xzOyBuVG9vbCsrKSB7CisJdG9vbFB0ciA9ICZpbmZvUHRyLT50b29sc1tuVG9vbF07CisKKwlpZiAodG9vbFB0ci0+dUZsYWdzICYgVFRGX0lESVNIV05EKSB7CisJICAgIGlmICgoSFdORDMyKXRvb2xQdHItPnVJZCA9PSBod25kKQorCQlyZXR1cm4gblRvb2w7CisJfQorICAgIH0KKwogICAgIHJldHVybiAtMTsKIH0KIAogCitzdGF0aWMgSU5UMzIKK1RPT0xUSVBTX0dldFRvb2xGcm9tTWVzc2FnZSAoVE9PTFRJUFNfSU5GTyAqaW5mb1B0ciwgSFdORDMyIGh3bmRUb29sKQoreworICAgIERXT1JEICAgZHdQb3M7CisgICAgUE9JTlQzMiBwdDsKKworICAgIGR3UG9zID0gR2V0TWVzc2FnZVBvcyAoKTsKKyAgICBwdC54ID0gKElOVDMyKUxPV09SRChkd1Bvcyk7CisgICAgcHQueSA9IChJTlQzMilISVdPUkQoZHdQb3MpOworICAgIFNjcmVlblRvQ2xpZW50MzIgKGh3bmRUb29sLCAmcHQpOworCisgICAgcmV0dXJuIFRPT0xUSVBTX0dldFRvb2xGcm9tUG9pbnQgKGluZm9QdHIsIGh3bmRUb29sLCAmcHQpOworfQorCisKIHN0YXRpYyBCT09MMzIKIFRPT0xUSVBTX0NoZWNrVG9vbCAoV05EICp3bmRQdHIpCiB7CkBAIC0zODEsOSArMzg1LDYgQEAKIAogICAgIGlmIChscFRvb2xJbmZvID09IE5VTEwpIHJldHVybiBGQUxTRTsKIAotICAgIGlmIChscFRvb2xJbmZvLT51RmxhZ3MgJiBUVEZfU1VCQ0xBU1MpCi0JRklYTUUgKHRvb2x0aXBzLCAic3ViY2xhc3Npbmcgbm90IHN1cHBvcnRlZCFcbiIpOwotCiAgICAgVFJBQ0UgKHRvb2x0aXBzLCAiYWRkIHRvb2wgKCV4KSAleCAlZCVzIVxuIiwKIAkgICB3bmRQdHItPmh3bmRTZWxmLCBscFRvb2xJbmZvLT5od25kLCBscFRvb2xJbmZvLT51SWQsCiAJICAgKGxwVG9vbEluZm8tPnVGbGFncyAmIFRURl9JRElTSFdORCkgPyAiIFRURl9JRElTSFdORCIgOiAiIik7CkBAIC00MzUsNiArNDM2LDQ0IEBACiAgICAgaWYgKGxwVG9vbEluZm8tPmNiU2l6ZSA+PSBzaXplb2YoVFRUT09MSU5GTzMyQSkpCiAJdG9vbFB0ci0+bFBhcmFtID0gbHBUb29sSW5mby0+bFBhcmFtOwogCisgICAgLyogaW5zdGFsbCBzdWJjbGFzc2luZyAqLworICAgIGlmICh0b29sUHRyLT51RmxhZ3MgJiBUVEZfU1VCQ0xBU1MpIHsKKwlpZiAodG9vbFB0ci0+dUZsYWdzICYgVFRGX0lESVNIV05EKSB7CisJICAgIExQVFRfU1VCQ0xBU1NfSU5GTyBscHR0c2kgPQorCQkoTFBUVF9TVUJDTEFTU19JTkZPKUdldFByb3AzMkEgKChIV05EMzIpdG9vbFB0ci0+dUlkLCBUVF9TVUJDTEFTU19QUk9QKTsKKwkgICAgaWYgKGxwdHRzaSA9PSBOVUxMKSB7CisJCWxwdHRzaSA9IChMUFRUX1NVQkNMQVNTX0lORk8pSGVhcEFsbG9jIChHZXRQcm9jZXNzSGVhcCgpLAorCQkgICAgSEVBUF9aRVJPX01FTU9SWSwgc2l6ZW9mKFRUX1NVQkNMQVNTX0lORk8pKTsKKwkJbHB0dHNpLT53cE9yaWdQcm9jID0gCisJCSAgICAoV05EUFJPQzMyKVNldFdpbmRvd0xvbmczMkEgKChIV05EMzIpdG9vbFB0ci0+dUlkLAorCQkgICAgR1dMX1dORFBST0MsKExPTkcpVE9PTFRJUFNfU3ViY2xhc3NQcm9jKTsKKwkJbHB0dHNpLT5od25kVG9vbFRpcCA9IHduZFB0ci0+aHduZFNlbGY7CisJCWxwdHRzaS0+dVJlZkNvdW50Kys7CisJCVNldFByb3AzMkEgKChIV05EMzIpdG9vbFB0ci0+dUlkLCBUVF9TVUJDTEFTU19QUk9QLAorCQkJICAgIChIQU5ETEUzMilscHR0c2kpOworCSAgICB9CisJICAgIGVsc2UKKwkJRVJSICh0b29sdGlwcywgIkEgd2luZG93IHRvb2wgbXVzdCBvbmx5IGJlIGxpc3RlZCBvbmNlIVxuIik7CisJfQorCWVsc2UgeworCSAgICBMUFRUX1NVQkNMQVNTX0lORk8gbHB0dHNpID0KKwkJKExQVFRfU1VCQ0xBU1NfSU5GTylHZXRQcm9wMzJBICh0b29sUHRyLT5od25kLCBUVF9TVUJDTEFTU19QUk9QKTsKKwkgICAgaWYgKGxwdHRzaSA9PSBOVUxMKSB7CisJCWxwdHRzaSA9IChMUFRUX1NVQkNMQVNTX0lORk8pSGVhcEFsbG9jIChHZXRQcm9jZXNzSGVhcCgpLAorCQkgICAgSEVBUF9aRVJPX01FTU9SWSwgc2l6ZW9mKFRUX1NVQkNMQVNTX0lORk8pKTsKKwkJbHB0dHNpLT53cE9yaWdQcm9jID0gCisJCSAgICAoV05EUFJPQzMyKVNldFdpbmRvd0xvbmczMkEgKHRvb2xQdHItPmh3bmQsCisJCSAgICBHV0xfV05EUFJPQywoTE9ORylUT09MVElQU19TdWJjbGFzc1Byb2MpOworCQlscHR0c2ktPmh3bmRUb29sVGlwID0gd25kUHRyLT5od25kU2VsZjsKKwkJbHB0dHNpLT51UmVmQ291bnQrKzsKKwkJU2V0UHJvcDMyQSAodG9vbFB0ci0+aHduZCwgVFRfU1VCQ0xBU1NfUFJPUCwgKEhBTkRMRTMyKWxwdHRzaSk7CisJICAgIH0KKwkgICAgZWxzZQorCQlscHR0c2ktPnVSZWZDb3VudCsrOworCX0KKwlUUkFDRSAodG9vbHRpcHMsICJzdWJjbGFzc2luZyBpbnN0YWxsZWQhXG4iKTsKKyAgICB9CisKICAgICByZXR1cm4gVFJVRTsKIH0KIApAQCAtNDY1LDYgKzUwNCwzOCBAQAogCSAgICBIZWFwRnJlZSAoR2V0UHJvY2Vzc0hlYXAgKCksIDAsIHRvb2xQdHItPmxwc3pUZXh0KTsKICAgICB9CiAKKyAgICAvKiByZW1vdmUgc3ViY2xhc3NpbmcgKi8KKyAgICBpZiAodG9vbFB0ci0+dUZsYWdzICYgVFRGX1NVQkNMQVNTKSB7CisJaWYgKHRvb2xQdHItPnVGbGFncyAmIFRURl9JRElTSFdORCkgeworCSAgICBMUFRUX1NVQkNMQVNTX0lORk8gbHB0dHNpID0KKwkJKExQVFRfU1VCQ0xBU1NfSU5GTylHZXRQcm9wMzJBICgoSFdORDMyKXRvb2xQdHItPnVJZCwgVFRfU1VCQ0xBU1NfUFJPUCk7CisJICAgIGlmIChscHR0c2kpIHsKKwkJU2V0V2luZG93TG9uZzMyQSAoKEhXTkQzMil0b29sUHRyLT51SWQsIEdXTF9XTkRQUk9DLAorCQkJCSAgKExPTkcpbHB0dHNpLT53cE9yaWdQcm9jKTsKKwkJUmVtb3ZlUHJvcDMyQSAoKEhXTkQzMil0b29sUHRyLT51SWQsIFRUX1NVQkNMQVNTX1BST1ApOworCQlIZWFwRnJlZSAoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgJmxwdHRzaSk7CisJICAgIH0KKwkgICAgZWxzZQorCQlFUlIgKHRvb2x0aXBzLCAiSW52YWxpZCBkYXRhIGhhbmRsZSFcbiIpOworCX0KKwllbHNlIHsKKwkgICAgTFBUVF9TVUJDTEFTU19JTkZPIGxwdHRzaSA9CisJCShMUFRUX1NVQkNMQVNTX0lORk8pR2V0UHJvcDMyQSAodG9vbFB0ci0+aHduZCwgVFRfU1VCQ0xBU1NfUFJPUCk7CisJICAgIGlmIChscHR0c2kpIHsKKwkJaWYgKGxwdHRzaS0+dVJlZkNvdW50ID09IDEpIHsKKwkJICAgIFNldFdpbmRvd0xvbmczMkEgKChIV05EMzIpdG9vbFB0ci0+dUlkLCBHV0xfV05EUFJPQywKKwkJCQkgICAgICAoTE9ORylscHR0c2ktPndwT3JpZ1Byb2MpOworCQkgICAgUmVtb3ZlUHJvcDMyQSAoKEhXTkQzMil0b29sUHRyLT51SWQsIFRUX1NVQkNMQVNTX1BST1ApOworCQkgICAgSGVhcEZyZWUgKEdldFByb2Nlc3NIZWFwKCksIDAsICZscHR0c2kpOworCQl9CisJCWVsc2UKKwkJICAgIGxwdHRzaS0+dVJlZkNvdW50LS07CisJICAgIH0KKwkgICAgZWxzZQorCQlFUlIgKHRvb2x0aXBzLCAiSW52YWxpZCBkYXRhIGhhbmRsZSFcbiIpOworCX0KKyAgICB9CisKICAgICAvKiBkZWxldGUgdG9vbCBmcm9tIHRvb2wgbGlzdCAqLwogICAgIGlmIChpbmZvUHRyLT51TnVtVG9vbHMgPT0gMSkgewogCUhlYXBGcmVlIChHZXRQcm9jZXNzSGVhcCAoKSwgMCwgaW5mb1B0ci0+dG9vbHMpOwpAQCAtNzM0LDcgKzgwNSw5IEBACiAgICAgSU5UMzIgblRvb2w7CiAKICAgICBpZiAoIShscHRpKSkgcmV0dXJuIDA7CisjaWYgMAogICAgIGlmIChscHRpLT5jYlNpemUgPCBzaXplb2YoVFRUT09MSU5GTzMyQSkpIHJldHVybiAwOworI2VuZGlmCiAKICAgICBuVG9vbCA9IFRPT0xUSVBTX0dldFRvb2xGcm9tSW5mb0EgKGluZm9QdHIsIGxwdGkpOwogICAgIGlmIChuVG9vbCA9PSAtMSkgcmV0dXJuIDA7CkBAIC03NjYsMTcgKzgzOSwxMSBAQAogICAgIExQTVNHMzIgbHBNc2cgPSAoTFBNU0czMilsUGFyYW07CiAgICAgUE9JTlQzMiBwdDsKIAotICAgIGlmIChscE1zZyA9PSBOVUxMKSB7CisgICAgaWYgKGxQYXJhbSA9PSBOVUxMKSB7CiAJRVJSICh0b29sdGlwcywgImxwTXNnID09IE5VTEwhXG4iKTsKIAlyZXR1cm4gMDsKICAgICB9CiAKLSAgICBwdCA9IGxwTXNnLT5wdDsKLSAgICBTY3JlZW5Ub0NsaWVudDMyIChscE1zZy0+aHduZCwgJnB0KTsKLSAgICBpbmZvUHRyLT5uT2xkVG9vbCA9IGluZm9QdHItPm5Ub29sOwotICAgIGluZm9QdHItPm5Ub29sID0gVE9PTFRJUFNfR2V0VG9vbEZyb21Qb2ludCAoaW5mb1B0ciwgbHBNc2ctPmh3bmQsICZwdCk7Ci0gICAgVFJBQ0UgKHRvb2x0aXBzLCAidG9vbCAoJXgpICVkICVkXG4iLCB3bmRQdHItPmh3bmRTZWxmLCBpbmZvUHRyLT5uT2xkVG9vbCwgaW5mb1B0ci0+blRvb2wpOwotCiAgICAgc3dpdGNoIChscE1zZy0+bWVzc2FnZSkgewogCWNhc2UgV01fTEJVVFRPTkRPV046CiAJY2FzZSBXTV9MQlVUVE9OVVA6CkBAIC03ODQsMTAgKzg1MSwyMiBAQAogCWNhc2UgV01fTUJVVFRPTlVQOgogCWNhc2UgV01fUkJVVFRPTkRPV046CiAJY2FzZSBXTV9SQlVUVE9OVVA6CisJICAgIHB0ID0gbHBNc2ctPnB0OworCSAgICBTY3JlZW5Ub0NsaWVudDMyIChscE1zZy0+aHduZCwgJnB0KTsKKwkgICAgaW5mb1B0ci0+bk9sZFRvb2wgPSBpbmZvUHRyLT5uVG9vbDsKKwkgICAgaW5mb1B0ci0+blRvb2wgPSBUT09MVElQU19HZXRUb29sRnJvbVBvaW50IChpbmZvUHRyLCBscE1zZy0+aHduZCwgJnB0KTsKKwkgICAgVFJBQ0UgKHRvb2x0aXBzLCAidG9vbCAoJXgpICVkICVkXG4iLAorCQkgICB3bmRQdHItPmh3bmRTZWxmLCBpbmZvUHRyLT5uT2xkVG9vbCwgaW5mb1B0ci0+blRvb2wpOwogCSAgICBUT09MVElQU19IaWRlICh3bmRQdHIsIGluZm9QdHIpOwogCSAgICBicmVhazsKIAogCWNhc2UgV01fTU9VU0VNT1ZFOgorCSAgICBwdCA9IGxwTXNnLT5wdDsKKwkgICAgU2NyZWVuVG9DbGllbnQzMiAobHBNc2ctPmh3bmQsICZwdCk7CisJICAgIGluZm9QdHItPm5PbGRUb29sID0gaW5mb1B0ci0+blRvb2w7CisJICAgIGluZm9QdHItPm5Ub29sID0gVE9PTFRJUFNfR2V0VG9vbEZyb21Qb2ludCAoaW5mb1B0ciwgbHBNc2ctPmh3bmQsICZwdCk7CisJICAgIFRSQUNFICh0b29sdGlwcywgInRvb2wgKCV4KSAlZCAlZFxuIiwKKwkJICAgd25kUHRyLT5od25kU2VsZiwgaW5mb1B0ci0+bk9sZFRvb2wsIGluZm9QdHItPm5Ub29sKTsKIAkgICAgVFJBQ0UgKHRvb2x0aXBzLCAiV01fTU9VU0VNT1ZFICglMDR4ICVkICVkKVxuIiwKIAkJICAgd25kUHRyLT5od25kU2VsZiwgcHQueCwgcHQueSk7CiAJICAgIGlmICgoaW5mb1B0ci0+YkFjdGl2ZSkgJiYgKGluZm9QdHItPm5Ub29sICE9IGluZm9QdHItPm5PbGRUb29sKSkgewpAQCAtMTEwMywxNCArMTE4MiwzMyBAQAogVE9PTFRJUFNfRGVzdHJveSAoV05EICp3bmRQdHIsIFdQQVJBTTMyIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSkKIHsKICAgICBUT09MVElQU19JTkZPICppbmZvUHRyID0gVE9PTFRJUFNfR2V0SW5mb1B0cih3bmRQdHIpOworICAgIFRUVE9PTF9JTkZPICp0b29sUHRyOwogCiAgICAgLyogZnJlZSB0b29scyAqLwogICAgIGlmIChpbmZvUHRyLT50b29scykgewogCUlOVDMyIGk7CiAJZm9yIChpID0gMDsgaSA8IGluZm9QdHItPnVOdW1Ub29sczsgaSsrKSB7Ci0JICAgIGlmICgoaW5mb1B0ci0+dG9vbHNbaV0uaGluc3QpICYmIChpbmZvUHRyLT50b29sc1tpXS5scHN6VGV4dCkpIHsKLQkJaWYgKGluZm9QdHItPnRvb2xzW2ldLmxwc3pUZXh0ICE9IExQU1RSX1RFWFRDQUxMQkFDSzMyQSkKLQkJICAgIEhlYXBGcmVlIChHZXRQcm9jZXNzSGVhcCAoKSwgMCwgaW5mb1B0ci0+dG9vbHNbaV0ubHBzelRleHQpOworCSAgICB0b29sUHRyID0gJmluZm9QdHItPnRvb2xzW2ldOworCSAgICBpZiAoKHRvb2xQdHItPmhpbnN0KSAmJiAodG9vbFB0ci0+bHBzelRleHQpKSB7CisJCWlmICh0b29sUHRyLT5scHN6VGV4dCAhPSBMUFNUUl9URVhUQ0FMTEJBQ0szMkEpCisJCSAgICBIZWFwRnJlZSAoR2V0UHJvY2Vzc0hlYXAgKCksIDAsIHRvb2xQdHItPmxwc3pUZXh0KTsKKwkgICAgfQorCisJICAgIC8qIHJlbW92ZSBzdWJjbGFzc2luZyAqLworCSAgICBpZiAodG9vbFB0ci0+dUZsYWdzICYgVFRGX1NVQkNMQVNTKSB7CisJCUxQVFRfU1VCQ0xBU1NfSU5GTyBscHR0c2k7CisKKwkJaWYgKHRvb2xQdHItPnVGbGFncyAmIFRURl9JRElTSFdORCkKKwkJICAgIGxwdHRzaSA9IChMUFRUX1NVQkNMQVNTX0lORk8pR2V0UHJvcDMyQSAoKEhXTkQzMil0b29sUHRyLT51SWQsIFRUX1NVQkNMQVNTX1BST1ApOworCQllbHNlCisJCSAgICBscHR0c2kgPSAoTFBUVF9TVUJDTEFTU19JTkZPKUdldFByb3AzMkEgKHRvb2xQdHItPmh3bmQsIFRUX1NVQkNMQVNTX1BST1ApOworCisJCWlmIChscHR0c2kpIHsKKwkJICAgIFNldFdpbmRvd0xvbmczMkEgKChIV05EMzIpdG9vbFB0ci0+dUlkLCBHV0xfV05EUFJPQywKKwkJCQkgICAgICAoTE9ORylscHR0c2ktPndwT3JpZ1Byb2MpOworCQkgICAgUmVtb3ZlUHJvcDMyQSAoKEhXTkQzMil0b29sUHRyLT51SWQsIFRUX1NVQkNMQVNTX1BST1ApOworCQkgICAgSGVhcEZyZWUgKEdldFByb2Nlc3NIZWFwKCksIDAsICZscHR0c2kpOworCQl9CiAJICAgIH0KIAl9CiAJSGVhcEZyZWUgKEdldFByb2Nlc3NIZWFwICgpLCAwLCBpbmZvUHRyLT50b29scyk7CkBAIC0xMjQ5LDggKzEzNDcsNzIgQEAKIH0KIAogCi1MUkVTVUxUIFdJTkFQSQotVG9vbFRpcHNXaW5kb3dQcm9jIChIV05EMzIgaHduZCwgVUlOVDMyIHVNc2csIFdQQVJBTTMyIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSkKK0xSRVNVTFQgQ0FMTEJBQ0sKK1RPT0xUSVBTX1N1YmNsYXNzUHJvYyAoSFdORDMyIGh3bmQsIFVJTlQzMiB1TXNnLCBXUEFSQU0zMiB3UGFyYW0sIExQQVJBTSBsUGFyYW0pCit7CisgICAgTFBUVF9TVUJDTEFTU19JTkZPIGxwdHRzaSA9CisJKExQVFRfU1VCQ0xBU1NfSU5GTylHZXRQcm9wMzJBIChod25kLCBUVF9TVUJDTEFTU19QUk9QKTsKKyAgICBXTkQgKnduZFB0cjsKKyAgICBUT09MVElQU19JTkZPICppbmZvUHRyOworICAgIFVJTlQzMiBuVG9vbDsKKworICAgIHN3aXRjaCAodU1zZykgeworCWNhc2UgV01fTEJVVFRPTkRPV046CisJY2FzZSBXTV9MQlVUVE9OVVA6CisJY2FzZSBXTV9NQlVUVE9ORE9XTjoKKwljYXNlIFdNX01CVVRUT05VUDoKKwljYXNlIFdNX1JCVVRUT05ET1dOOgorCWNhc2UgV01fUkJVVFRPTlVQOgorCSAgICB7CisJCXduZFB0ciA9IFdJTl9GaW5kV25kUHRyKGxwdHRzaS0+aHduZFRvb2xUaXApOworCQlpbmZvUHRyID0gVE9PTFRJUFNfR2V0SW5mb1B0cih3bmRQdHIpOworCQluVG9vbCA9IFRPT0xUSVBTX0dldFRvb2xGcm9tTWVzc2FnZSAoaW5mb1B0ciwgaHduZCk7CisKKwkJVFJBQ0UgKHRvb2x0aXBzLCAic3ViY2xhc3NlZCBtb3VzZSBtZXNzYWdlICUwNHhcbiIsIHVNc2cpOworCQlpbmZvUHRyLT5uT2xkVG9vbCA9IGluZm9QdHItPm5Ub29sOworCQlpbmZvUHRyLT5uVG9vbCA9IG5Ub29sOworCQlUT09MVElQU19IaWRlICh3bmRQdHIsIGluZm9QdHIpOworCSAgICB9CisJICAgIGJyZWFrOworCisJY2FzZSBXTV9NT1VTRU1PVkU6CisJICAgIHsKKwkJd25kUHRyID0gV0lOX0ZpbmRXbmRQdHIobHB0dHNpLT5od25kVG9vbFRpcCk7CisJCWluZm9QdHIgPSBUT09MVElQU19HZXRJbmZvUHRyKHduZFB0cik7CisJCW5Ub29sID0gVE9PTFRJUFNfR2V0VG9vbEZyb21NZXNzYWdlIChpbmZvUHRyLCBod25kKTsKKworCQlUUkFDRSAodG9vbHRpcHMsICJzdWJjbGFzc2VkIFdNX01PVVNFTU9WRVxuIik7CisJCWluZm9QdHItPm5PbGRUb29sID0gaW5mb1B0ci0+blRvb2w7CisJCWluZm9QdHItPm5Ub29sID0gblRvb2w7CisKKwkJaWYgKChpbmZvUHRyLT5iQWN0aXZlKSAmJgorCQkgICAgKGluZm9QdHItPm5Ub29sICE9IGluZm9QdHItPm5PbGRUb29sKSkgeworCQkgICAgaWYgKGluZm9QdHItPm5PbGRUb29sID09IC0xKSB7CisJCQlTZXRUaW1lcjMyICh3bmRQdHItPmh3bmRTZWxmLCBJRF9USU1FUjEsCisJCQkJICAgIGluZm9QdHItPm5Jbml0aWFsVGltZSwgMCk7CisJCQlUUkFDRSAodG9vbHRpcHMsICJ0aW1lciAxIHN0YXJ0ZWQhXG4iKTsKKwkJICAgIH0KKwkJICAgIGVsc2UgeworCQkJVE9PTFRJUFNfSGlkZSAod25kUHRyLCBpbmZvUHRyKTsKKwkJCVNldFRpbWVyMzIgKHduZFB0ci0+aHduZFNlbGYsIElEX1RJTUVSMSwKKwkJCQlpbmZvUHRyLT5uUmVzaG93VGltZSwgMCk7CisJCQlUUkFDRSAodG9vbHRpcHMsICJ0aW1lciAyIHN0YXJ0ZWQhXG4iKTsKKwkJICAgIH0KKwkJfQorCQlpZiAoaW5mb1B0ci0+bkN1cnJlbnRUb29sICE9IC0xKSB7CisJCSAgICBTZXRUaW1lcjMyICh3bmRQdHItPmh3bmRTZWxmLCBJRF9USU1FUjMsIDEwMCwgMCk7CisJCSAgICBUUkFDRSAodG9vbHRpcHMsICJ0aW1lciAzIHN0YXJ0ZWQhXG4iKTsKKwkJfQorCSAgICB9CisJICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBDYWxsV2luZG93UHJvYzMyQSAobHB0dHNpLT53cE9yaWdQcm9jLCBod25kLCB1TXNnLCB3UGFyYW0sIGxQYXJhbSk7Cit9CisKKworTFJFU1VMVCBDQUxMQkFDSworVE9PTFRJUFNfV2luZG93UHJvYyAoSFdORDMyIGh3bmQsIFVJTlQzMiB1TXNnLCBXUEFSQU0zMiB3UGFyYW0sIExQQVJBTSBsUGFyYW0pCiB7CiAgICAgV05EICp3bmRQdHIgPSBXSU5fRmluZFduZFB0cihod25kKTsKIApAQCAtMTQyMyw3ICsxNTg1LDcgQEAKIAogICAgIFplcm9NZW1vcnkgKCZ3bmRDbGFzcywgc2l6ZW9mKFdORENMQVNTMzJBKSk7CiAgICAgd25kQ2xhc3Muc3R5bGUgICAgICAgICA9IENTX0dMT0JBTENMQVNTIHwgQ1NfREJMQ0xLUyB8IENTX1NBVkVCSVRTOwotICAgIHduZENsYXNzLmxwZm5XbmRQcm9jICAgPSAoV05EUFJPQzMyKVRvb2xUaXBzV2luZG93UHJvYzsKKyAgICB3bmRDbGFzcy5scGZuV25kUHJvYyAgID0gKFdORFBST0MzMilUT09MVElQU19XaW5kb3dQcm9jOwogICAgIHduZENsYXNzLmNiQ2xzRXh0cmEgICAgPSAwOwogICAgIHduZENsYXNzLmNiV25kRXh0cmEgICAgPSBzaXplb2YoVE9PTFRJUFNfSU5GTyAqKTsKICAgICB3bmRDbGFzcy5oQ3Vyc29yICAgICAgID0gTG9hZEN1cnNvcjMyQSAoMCwgSURDX0FSUk9XMzJBKTsKZGlmZiAtLWdpdCBhL2RlYnVnZ2VyL3N0YWJzLmMgYi9kZWJ1Z2dlci9zdGFicy5jCmluZGV4IGYzZDA4MGIuLjhmYjljOTYgMTAwNjQ0Ci0tLSBhL2RlYnVnZ2VyL3N0YWJzLmMKKysrIGIvZGVidWdnZXIvc3RhYnMuYwpAQCAtMTA3NSw3ICsxMDc1LDcgQEAKIAkJZ290byBsZWF2ZTsKIAl9CiAJZnJlZShmbik7Ci0JaWYgKHQpIHMgPSB0KzE7CisJaWYgKHQpIHMgPSB0KzE7IGVsc2UgYnJlYWs7CiAgICAgICB9CiAgICAgICBpZiAoIXMgfHwgISpzKSBmcHJpbnRmKHN0ZGVyciwiIG5vdCBmb3VuZCIpOwogICAgICAgZnJlZShwYXRocyk7CmRpZmYgLS1naXQgYS9kbGxzL01ha2VmaWxlLmluIGIvZGxscy9NYWtlZmlsZS5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZmJhZmJjCi0tLSAvZGV2L251bGwKKysrIGIvZGxscy9NYWtlZmlsZS5pbgpAQCAtMCwwICsxLDIxIEBACitTVUJESVJTID0gXAorCXNoZWxsMzIKKworYWxsOiAkKFNVQkRJUlMpCisKKyQoU1VCRElSUyk6IGR1bW15CisJQGNkICRAOyAkKE1BS0UpCisKK2RlcGVuZDoKKwlmb3IgaSBpbiAkKFNVQkRJUlMpOyBkbyAoY2QgJCRpOyAkKE1BS0UpIGRlcGVuZCkgfHwgZXhpdCAxOyBkb25lCisKK2luc3RhbGw6CisJZm9yIGkgaW4gJChTVUJESVJTKTsgZG8gKGNkICQkaTsgJChNQUtFKSBpbnN0YWxsKSB8fCBleGl0IDE7IGRvbmUKKwordW5pbnN0YWxsOgorCWZvciBpIGluICQoU1VCRElSUyk7IGRvIChjZCAkJGk7ICQoTUFLRSkgdW5pbnN0YWxsKSB8fCBleGl0IDE7IGRvbmUKKworY2xlYW46CisJZm9yIGkgaW4gJChTVUJESVJTKTsgZG8gKGNkICQkaTsgJChNQUtFKSBjbGVhbikgfHwgZXhpdCAxOyBkb25lCisKK2R1bW15OgpkaWZmIC0tZ2l0IGEvZGxscy9zaGVsbDMyL01ha2VmaWxlLmluIGIvZGxscy9zaGVsbDMyL01ha2VmaWxlLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5YTAwMDQKLS0tIC9kZXYvbnVsbAorKysgYi9kbGxzL3NoZWxsMzIvTWFrZWZpbGUuaW4KQEAgLTAsMCArMSwzMCBAQAorREVGUyAgICAgID0gQERMTEZMQUdTQCAtRF9fV0lORV9fCitUT1BTUkNESVIgPSBAdG9wX3NyY2RpckAKK1RPUE9CSkRJUiA9IC4uLy4uCitTUkNESVIgICAgPSBAc3JjZGlyQAorVlBBVEggICAgID0gQHNyY2RpckAKK01PRFVMRSAgICA9IHNoZWxsMzIKK1dSQ0VYVFJBICA9IC1BIC1wICQqCisKK0NfU1JDUyA9IFwKKwljb250bWVudS5jIFwKKwllbnVtaWRsaXN0LmMgXAorCWZvbGRlcnMuYyBcCisJcGlkbC5jIFwKKwlzaGVsbDMyX21haW4uYyBcCisJc2hlbGxvbGUuYyBcCisJc2hlbGxvcmQuYyBcCisJc2hsZm9sZGVyLmMgXAorCXNobHZpZXcuYworCitSQ19TUkNTID0gXAorCXNocmVzLnJjCisKK2FsbDogY2hlY2tfd3JjICQoTU9EVUxFKS5vCisKK0BNQUtFX1JVTEVTQAorCiskKFJDX1NSQ1M6LnJjPS5zKTogJChXUkMpCisKKyMjIyBEZXBlbmRlbmNpZXM6CisKZGlmZiAtLWdpdCBhL2RsbHMvc2hlbGwzMi9jb250bWVudS5jIGIvZGxscy9zaGVsbDMyL2NvbnRtZW51LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTJjZTI1MwotLS0gL2Rldi9udWxsCisrKyBiL2RsbHMvc2hlbGwzMi9jb250bWVudS5jCkBAIC0wLDAgKzEsMzgzIEBACisvKgorICoJSUNvbnRleHRNZW51CisgKgorICoJQ29weXJpZ2h0IDE5OTgJSnVlcmdlbiBTY2htaWVkIDxqdWVyZ2VuLnNjaG1pZWRAbWV0cm9uZXQuZGU+CisgKi8KKyNpbmNsdWRlICJ3aW5kb3dzLmgiCisjaW5jbHVkZSAid2luZXJyb3IuaCIKKyNpbmNsdWRlICJkZWJ1Zy5oIgorI2luY2x1ZGUgInNobG9iai5oIgorI2luY2x1ZGUgInNoZWxsMzJfbWFpbi5oIgorCisjZGVmaW5lIElETV9FWFBMT1JFICAwCisjZGVmaW5lIElETV9PUEVOICAgICAxCisjZGVmaW5lIElETV9SRU5BTUUgICAyCisjZGVmaW5lIElETV9MQVNUICAgICBJRE1fUkVOQU1FCisKKyNkZWZpbmUgX19UKHgpICAgICAgeAorI2RlZmluZSBfVCh4KSAgICAgICBfX1QoeCkKKyNkZWZpbmUgVEVYVCAgICAgICAgX1QKKworc3RhdGljIEhSRVNVTFQgV0lOQVBJIElDb250ZXh0TWVudV9RdWVyeUludGVyZmFjZShMUENPTlRFWFRNRU5VICxSRUZJSUQgLCBMUFZPSUQgKik7CitzdGF0aWMgVUxPTkcgV0lOQVBJIElDb250ZXh0TWVudV9BZGRSZWYoTFBDT05URVhUTUVOVSk7CitzdGF0aWMgVUxPTkcgV0lOQVBJIElDb250ZXh0TWVudV9SZWxlYXNlKExQQ09OVEVYVE1FTlUpOworc3RhdGljIEhSRVNVTFQgV0lOQVBJIElDb250ZXh0TWVudV9RdWVyeUNvbnRleHRNZW51KExQQ09OVEVYVE1FTlUgLCBITUVOVTMyICxVSU5UMzIgLFVJTlQzMiAsVUlOVDMyICxVSU5UMzIpOworc3RhdGljIEhSRVNVTFQgV0lOQVBJIElDb250ZXh0TWVudV9JbnZva2VDb21tYW5kKExQQ09OVEVYVE1FTlUsIExQQ01JTlZPS0VDT01NQU5ESU5GTyk7CitzdGF0aWMgSFJFU1VMVCBXSU5BUEkgSUNvbnRleHRNZW51X0dldENvbW1hbmRTdHJpbmcoTFBDT05URVhUTUVOVSAsIFVJTlQzMiAsVUlOVDMyICxMUFVJTlQzMiAsTFBTVFIgLFVJTlQzMik7CisKK0JPT0wzMiBJQ29udGV4dE1lbnVfQWxsb2NQaWRsVGFibGUoTFBDT05URVhUTUVOVSwgRFdPUkQpOwordm9pZCBJQ29udGV4dE1lbnVfRnJlZVBpZGxUYWJsZShMUENPTlRFWFRNRU5VKTsKK0JPT0wzMiBJQ29udGV4dE1lbnVfQ2FuUmVuYW1lSXRlbXMoTFBDT05URVhUTUVOVSk7CitCT09MMzIgSUNvbnRleHRNZW51X0ZpbGxQaWRsVGFibGUoTFBDT05URVhUTUVOVSwgTFBDSVRFTUlETElTVCAqLCBVSU5UMzIpOworCitzdGF0aWMgc3RydWN0IElDb250ZXh0TWVudV9WVGFibGUgY212dCA9IAorewlJQ29udGV4dE1lbnVfUXVlcnlJbnRlcmZhY2UsCisJSUNvbnRleHRNZW51X0FkZFJlZiwKKyAgICBJQ29udGV4dE1lbnVfUmVsZWFzZSwKKwlJQ29udGV4dE1lbnVfUXVlcnlDb250ZXh0TWVudSwKKwlJQ29udGV4dE1lbnVfSW52b2tlQ29tbWFuZCwKKwlJQ29udGV4dE1lbnVfR2V0Q29tbWFuZFN0cmluZworfTsKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiAgSUNvbnRleHRNZW51X1F1ZXJ5SW50ZXJmYWNlCisqLworc3RhdGljIEhSRVNVTFQgV0lOQVBJIElDb250ZXh0TWVudV9RdWVyeUludGVyZmFjZShMUENPTlRFWFRNRU5VIHRoaXMsUkVGSUlEIHJpaWQsIExQVk9JRCAqcHB2T2JqKQoreyBjaGFyICAgIHhyaWlkWzUwXTsKKyAgV0lORV9TdHJpbmdGcm9tQ0xTSUQoKExQQ0xTSUQpcmlpZCx4cmlpZCk7CisgIFRSQUNFKHNoZWxsLCIoJXApLT4oXG5cdElJRDpcdCVzLCVwKVxuIix0aGlzLHhyaWlkLHBwdk9iaik7CisKKyAgKnBwdk9iaiA9IE5VTEw7CisKKyAgaWYoSXNFcXVhbElJRChyaWlkLCAmSUlEX0lVbmtub3duKSkgICAgICAgICAgLypJVW5rbm93biovCisgIHsgKnBwdk9iaiA9IChMUFVOS05PV04pKExQQ09OVEVYVE1FTlUpdGhpczsgCisgIH0KKyAgZWxzZSBpZihJc0VxdWFsSUlEKHJpaWQsICZJSURfSUNvbnRleHRNZW51KSkgIC8qSUNvbnRleHRNZW51Ki8KKyAgeyAqcHB2T2JqID0gKExQQ09OVEVYVE1FTlUpdGhpczsKKyAgfSAgIAorICBlbHNlIGlmKElzRXF1YWxJSUQocmlpZCwgJklJRF9JU2hlbGxFeHRJbml0KSkgIC8qSVNoZWxsRXh0SW5pdCovCisgIHsgKnBwdk9iaiA9IChMUFNIRUxMRVhUSU5JVCl0aGlzOworICB9ICAgCisKKyAgaWYoKnBwdk9iaikKKyAgeyAoKihMUENPTlRFWFRNRU5VKilwcHZPYmopLT5scHZ0YmwtPmZuQWRkUmVmKHRoaXMpOyAgICAgIAorICAgIFRSQUNFKHNoZWxsLCItLSBJbnRlcmZhY2U6ICglcCktPiglcClcbiIscHB2T2JqLCpwcHZPYmopOworICAgIHJldHVybiBTX09LOworICB9CisgIFRSQUNFKHNoZWxsLCItLSBJbnRlcmZhY2U6IEVfTk9JTlRFUkZBQ0VcbiIpOworICByZXR1cm4gRV9OT0lOVEVSRkFDRTsKK30gICAKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqICBJQ29udGV4dE1lbnVfQWRkUmVmCisqLworc3RhdGljIFVMT05HIFdJTkFQSSBJQ29udGV4dE1lbnVfQWRkUmVmKExQQ09OVEVYVE1FTlUgdGhpcykKK3sgVFJBQ0Uoc2hlbGwsIiglcCktPihjb3VudD0lbHUpXG4iLHRoaXMsKHRoaXMtPnJlZikrMSk7CisgIHJldHVybiArKyh0aGlzLT5yZWYpOworfQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqICBJQ29udGV4dE1lbnVfUmVsZWFzZQorKi8KK3N0YXRpYyBVTE9ORyBXSU5BUEkgSUNvbnRleHRNZW51X1JlbGVhc2UoTFBDT05URVhUTUVOVSB0aGlzKQoreyBUUkFDRShzaGVsbCwiKCVwKS0+KClcbiIsdGhpcyk7CisgIGlmICghLS0odGhpcy0+cmVmKSkgCisgIHsgVFJBQ0Uoc2hlbGwsIiBkZXN0cm95aW5nIElDb250ZXh0TWVudSglcClcbiIsdGhpcyk7CisKKwlpZih0aGlzLT5wU0ZQYXJlbnQpCisJICB0aGlzLT5wU0ZQYXJlbnQtPmxwdnRibC0+Zm5SZWxlYXNlKHRoaXMtPnBTRlBhcmVudCk7CisKKwkvKm1ha2Ugc3VyZSB0aGUgcGlkbCBpcyBmcmVlZCovCisJaWYodGhpcy0+YVBpZGxzKQorCXsgSUNvbnRleHRNZW51X0ZyZWVQaWRsVGFibGUodGhpcyk7CisJfQorCisJaWYodGhpcy0+cFBpZGxNZ3IpCisgICAJICBQaWRsTWdyX0Rlc3RydWN0b3IodGhpcy0+cFBpZGxNZ3IpOworCisgICAgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwwLHRoaXMpOworICAgIHJldHVybiAwOworICB9CisgIHJldHVybiB0aGlzLT5yZWY7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiAgIElDb250ZXh0TWVudV9Db25zdHJ1Y3RvcigpCisqLworTFBDT05URVhUTUVOVSBJQ29udGV4dE1lbnVfQ29uc3RydWN0b3IoTFBTSEVMTEZPTERFUiBwU0ZQYXJlbnQsIExQQ0lURU1JRExJU1QgKmFQaWRscywgVUlOVDMyIHVJdGVtQ291bnQpCit7CUxQQ09OVEVYVE1FTlUgY207CisJVUlOVDMyICB1OworICAgIAorCWNtID0gKExQQ09OVEVYVE1FTlUpSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksMCxzaXplb2YoSUNvbnRleHRNZW51KSk7CisJY20tPmxwdnRibD0mY212dDsKKwljbS0+cmVmID0gMTsKKworCWNtLT5wU0ZQYXJlbnQgPSBwU0ZQYXJlbnQ7CisJaWYoY20tPnBTRlBhcmVudCkKKwkgICBjbS0+cFNGUGFyZW50LT5scHZ0YmwtPmZuQWRkUmVmKGNtLT5wU0ZQYXJlbnQpOworCisJY20tPmFQaWRscyA9IE5VTEw7CisJY20tPnBQaWRsTWdyID0gUGlkbE1ncl9Db25zdHJ1Y3RvcigpOworCisJSUNvbnRleHRNZW51X0FsbG9jUGlkbFRhYmxlKGNtLCB1SXRlbUNvdW50KTsKKyAgICAKKwlpZihjbS0+YVBpZGxzKQorCXsgSUNvbnRleHRNZW51X0ZpbGxQaWRsVGFibGUoY20sIGFQaWRscywgdUl0ZW1Db3VudCk7CisJfQorCisJY20tPmJBbGxWYWx1ZXMgPSAxOworCWZvcih1ID0gMDsgdSA8IHVJdGVtQ291bnQ7IHUrKykKKyAgICB7IGNtLT5iQWxsVmFsdWVzICY9IChjbS0+cFBpZGxNZ3ItPmxwdnRibC0+Zm5Jc1ZhbHVlKGNtLT5wUGlkbE1nciwgYVBpZGxzW3VdKSA/IDEgOiAwKTsKKwl9CisgICAgVFJBQ0Uoc2hlbGwsIiglcCktPigpXG4iLGNtKTsKKyAgICByZXR1cm4gY207Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIElDb250ZXh0TWVudV9RdWVyeUNvbnRleHRNZW51KCkKKyovCisKK3N0YXRpYyBIUkVTVUxUIFdJTkFQSSAgSUNvbnRleHRNZW51X1F1ZXJ5Q29udGV4dE1lbnUoIExQQ09OVEVYVE1FTlUgdGhpcywgSE1FTlUzMiBobWVudSwKKwkJCQkJCQlVSU5UMzIgaW5kZXhNZW51LFVJTlQzMiBpZENtZEZpcnN0LFVJTlQzMiBpZENtZExhc3QsVUlOVDMyIHVGbGFncykKK3sJQk9PTDMyCQkJZkV4cGxvcmUgOworCU1FTlVJVEVNSU5GTzMyQQltaWk7CisKKwlUUkFDRShzaGVsbCwiKCVwKS0+KGhtZW51PSV4IGluZGV4bWVudT0leCBjbWRmaXJzdD0leCBjbWRsYXN0PSV4IGZsYWdzPSV4IClcbiIsdGhpcywgaG1lbnUsIGluZGV4TWVudSwgaWRDbWRGaXJzdCwgaWRDbWRMYXN0LCB1RmxhZ3MpOworCWlmKCEoQ01GX0RFRkFVTFRPTkxZICYgdUZsYWdzKSkKKwl7IGlmKCF0aGlzLT5iQWxsVmFsdWVzKQorICAgICAgeyBmRXhwbG9yZSA9IHVGbGFncyAmIENNRl9FWFBMT1JFOworICAgICAgICBpZihmRXhwbG9yZSkKKyAgICAgICAgeyBaZXJvTWVtb3J5KCZtaWksIHNpemVvZihtaWkpKTsKKyAgICAgICAgICBtaWkuY2JTaXplID0gc2l6ZW9mKG1paSk7CisgICAgICAgICAgbWlpLmZNYXNrID0gTUlJTV9JRCB8IE1JSU1fVFlQRSB8IE1JSU1fU1RBVEU7CisgICAgICAgICAgbWlpLndJRCA9IGlkQ21kRmlyc3QgKyBJRE1fRVhQTE9SRTsKKyAgICAgICAgICBtaWkuZlR5cGUgPSBNRlRfU1RSSU5HOworICAgICAgICAgIG1paS5kd1R5cGVEYXRhID0gVEVYVCgiJkV4cGxvcmUiKTsKKyAgICAgICAgICBtaWkuZlN0YXRlID0gTUZTX0VOQUJMRUQgfCBNRlNfREVGQVVMVDsKKyAgICAgICAgICBJbnNlcnRNZW51SXRlbTMyQSggaG1lbnUsIGluZGV4TWVudSsrLCBUUlVFLCAmbWlpKTsKKworICAgICAgICAgIFplcm9NZW1vcnkoJm1paSwgc2l6ZW9mKG1paSkpOworICAgICAgICAgIG1paS5jYlNpemUgPSBzaXplb2YobWlpKTsKKyAgICAgICAgICBtaWkuZk1hc2sgPSBNSUlNX0lEIHwgTUlJTV9UWVBFIHwgTUlJTV9TVEFURTsKKyAgICAgICAgICBtaWkud0lEID0gaWRDbWRGaXJzdCArIElETV9PUEVOOworICAgICAgICAgIG1paS5mVHlwZSA9IE1GVF9TVFJJTkc7CisgICAgICAgICAgbWlpLmR3VHlwZURhdGEgPSBURVhUKCImT3BlbiIpOworICAgICAgICAgIG1paS5mU3RhdGUgPSBNRlNfRU5BQkxFRDsKKyAgICAgICAgICBJbnNlcnRNZW51SXRlbTMyQSggaG1lbnUsIGluZGV4TWVudSsrLCBUUlVFLCAmbWlpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsgWmVyb01lbW9yeSgmbWlpLCBzaXplb2YobWlpKSk7CisgICAgICAgICAgbWlpLmNiU2l6ZSA9IHNpemVvZihtaWkpOworICAgICAgICAgIG1paS5mTWFzayA9IE1JSU1fSUQgfCBNSUlNX1RZUEUgfCBNSUlNX1NUQVRFOworICAgICAgICAgIG1paS53SUQgPSBpZENtZEZpcnN0ICsgSURNX09QRU47CisgICAgICAgICAgbWlpLmZUeXBlID0gTUZUX1NUUklORzsKKyAgICAgICAgICBtaWkuZHdUeXBlRGF0YSA9IFRFWFQoIiZPcGVuIik7CisgICAgICAgICAgbWlpLmZTdGF0ZSA9IE1GU19FTkFCTEVEIHwgTUZTX0RFRkFVTFQ7CisgICAgICAgICAgSW5zZXJ0TWVudUl0ZW0zMkEoIGhtZW51LCBpbmRleE1lbnUrKywgVFJVRSwgJm1paSk7CisKKyAgICAgICAgICBaZXJvTWVtb3J5KCZtaWksIHNpemVvZihtaWkpKTsKKyAgICAgICAgICBtaWkuY2JTaXplID0gc2l6ZW9mKG1paSk7CisgICAgICAgICAgbWlpLmZNYXNrID0gTUlJTV9JRCB8IE1JSU1fVFlQRSB8IE1JSU1fU1RBVEU7CisgICAgICAgICAgbWlpLndJRCA9IGlkQ21kRmlyc3QgKyBJRE1fRVhQTE9SRTsKKyAgICAgICAgICBtaWkuZlR5cGUgPSBNRlRfU1RSSU5HOworICAgICAgICAgIG1paS5kd1R5cGVEYXRhID0gVEVYVCgiJkV4cGxvcmUiKTsKKyAgICAgICAgICBtaWkuZlN0YXRlID0gTUZTX0VOQUJMRUQ7CisgICAgICAgICAgSW5zZXJ0TWVudUl0ZW0zMkEoIGhtZW51LCBpbmRleE1lbnUrKywgVFJVRSwgJm1paSk7CisgICAgICAgIH0KKworICAgICAgICBpZih1RmxhZ3MgJiBDTUZfQ0FOUkVOQU1FKQorICAgICAgICB7IFplcm9NZW1vcnkoJm1paSwgc2l6ZW9mKG1paSkpOworICAgICAgICAgIG1paS5jYlNpemUgPSBzaXplb2YobWlpKTsKKyAgICAgICAgICBtaWkuZk1hc2sgPSBNSUlNX0lEIHwgTUlJTV9UWVBFOworICAgICAgICAgIG1paS53SUQgPSAwOworICAgICAgICAgIG1paS5mVHlwZSA9IE1GVF9TRVBBUkFUT1I7CisgICAgICAgICAgSW5zZXJ0TWVudUl0ZW0zMkEoIGhtZW51LCBpbmRleE1lbnUrKywgVFJVRSwgJm1paSk7CisgCisgICAgICAgICAgWmVyb01lbW9yeSgmbWlpLCBzaXplb2YobWlpKSk7CisgICAgICAgICAgbWlpLmNiU2l6ZSA9IHNpemVvZihtaWkpOworICAgICAgICAgIG1paS5mTWFzayA9IE1JSU1fSUQgfCBNSUlNX1RZUEUgfCBNSUlNX1NUQVRFOworICAgICAgICAgIG1paS53SUQgPSBpZENtZEZpcnN0ICsgSURNX1JFTkFNRTsKKyAgICAgICAgICBtaWkuZlR5cGUgPSBNRlRfU1RSSU5HOworICAgICAgICAgIG1paS5kd1R5cGVEYXRhID0gVEVYVCgiJlJlbmFtZSIpOworICAgICAgICAgIG1paS5mU3RhdGUgPSAoSUNvbnRleHRNZW51X0NhblJlbmFtZUl0ZW1zKHRoaXMpID8gTUZTX0VOQUJMRUQgOiBNRlNfRElTQUJMRUQpOworICAgICAgICAgIEluc2VydE1lbnVJdGVtMzJBKCBobWVudSwgaW5kZXhNZW51KyssIFRSVUUsICZtaWkpOworICAgICAgICB9CisgICAgICB9CisgICAgICByZXR1cm4gTUFLRV9IUkVTVUxUKFNFVkVSSVRZX1NVQ0NFU1MsIDAsIChJRE1fTEFTVCArIDEpKTsKKyAgICB9CisJcmV0dXJuIE1BS0VfSFJFU1VMVChTRVZFUklUWV9TVUNDRVNTLCAwLCAwKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIElDb250ZXh0TWVudV9JbnZva2VDb21tYW5kKCkKKyovCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkgSUNvbnRleHRNZW51X0ludm9rZUNvbW1hbmQoTFBDT05URVhUTUVOVSB0aGlzLCBMUENNSU5WT0tFQ09NTUFORElORk8gbHBjbWkpCit7CUxQSVRFTUlETElTVCAgICAgIHBpZGxUZW1wLHBpZGxGUTsKKwlTSEVMTEVYRUNVVEVJTkZPICBzZWk7CisJaW50ICAgaTsKKworIAlUUkFDRShzaGVsbCwiKCVwKS0+KGV4ZWNpbmZvPSVwKVxuIix0aGlzLGxwY21pKTsgICAgCisKKwlpZihISVdPUkQobHBjbWktPmxwVmVyYikpCisJeyAvL3RoZSBjb21tYW5kIGlzIGJlaW5nIHNlbnQgdmlhIGEgdmVyYgorCSAgcmV0dXJuIE5PRVJST1I7CisJfQorCisJaWYoTE9XT1JEKGxwY21pLT5scFZlcmIpID4gSURNX0xBU1QpCisJICByZXR1cm4gRV9JTlZBTElEQVJHOworCisJc3dpdGNoKExPV09SRChscGNtaS0+bHBWZXJiKSkKKwl7IGNhc2UgSURNX0VYUExPUkU6CisJICBjYXNlIElETV9PUEVOOgorICAgICAgICAvKiBGaW5kIHRoZSBmaXJzdCBpdGVtIGluIHRoZSBsaXN0IHRoYXQgaXMgbm90IGEgdmFsdWUuIFRoZXNlIGNvbW1hbmRzIAorICAgICAgCXNob3VsZCBuZXZlciBiZSBpbnZva2VkIGlmIHRoZXJlIGlzbid0IGF0IGxlYXN0IG9uZSBrZXkgaXRlbSBpbiB0aGUgbGlzdC4qLworCisgICAgICAgIGZvcihpID0gMDsgdGhpcy0+YVBpZGxzW2ldOyBpKyspCisJICAgIHsgaWYoIXRoaXMtPnBQaWRsTWdyLT5scHZ0YmwtPmZuSXNWYWx1ZSh0aGlzLT5wUGlkbE1nciwgdGhpcy0+YVBpZGxzW2ldKSkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAKKwkJcGlkbFRlbXAgPSBJTENvbWJpbmUodGhpcy0+cFNGUGFyZW50LT5tcGlkbCwgdGhpcy0+YVBpZGxzW2ldKTsKKwkJcGlkbEZRID0gSUxDb21iaW5lKHRoaXMtPnBTRlBhcmVudC0+bXBpZGxOU1Jvb3QsIHBpZGxUZW1wKTsKKwkJU0hGcmVlKHBpZGxUZW1wKTsKKyAgICAgIAorCQlaZXJvTWVtb3J5KCZzZWksIHNpemVvZihzZWkpKTsKKwkJc2VpLmNiU2l6ZSA9IHNpemVvZihzZWkpOworCQlzZWkuZk1hc2sgPSBTRUVfTUFTS19JRExJU1QgfCBTRUVfTUFTS19DTEFTU05BTUU7CisJCXNlaS5scElETGlzdCA9IHBpZGxGUTsKKwkJc2VpLmxwQ2xhc3MgPSBURVhUKCJmb2xkZXIiKTsKKwkJc2VpLmh3bmQgPSBscGNtaS0+aHduZDsKKwkJc2VpLm5TaG93ID0gU1dfU0hPV05PUk1BTDsKKyAgICAgIAorCQlpZihMT1dPUkQobHBjbWktPmxwVmVyYikgPT0gSURNX0VYUExPUkUpCisJICAgIHsgc2VpLmxwVmVyYiA9IFRFWFQoImV4cGxvcmUiKTsKKyAgICAgICAgfQorCQllbHNlCisgICAgICAgIHsgc2VpLmxwVmVyYiA9IFRFWFQoIm9wZW4iKTsKKyAgICAgICAgfQorICAgICAgICBTaGVsbEV4ZWN1dGVFeDMyQSgmc2VpKTsKKwkJU0hGcmVlKHBpZGxGUSk7CisgICAgICAgIGJyZWFrOworCisJICBjYXNlIElETV9SRU5BTUU6CisgICAgICAgIE1lc3NhZ2VCZWVwMzIoTUJfT0spOworICAgICAgICAvKmhhbmRsZSByZW5hbWUgZm9yIHRoZSB2aWV3IGhlcmUqLworICAgICAgICBicmVhazsKKyAgIAl9CisJcmV0dXJuIE5PRVJST1I7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiAgSUNvbnRleHRNZW51X0dldENvbW1hbmRTdHJpbmcoKQorKi8KK3N0YXRpYyBIUkVTVUxUIFdJTkFQSSBJQ29udGV4dE1lbnVfR2V0Q29tbWFuZFN0cmluZyggTFBDT05URVhUTUVOVSB0aGlzLCBVSU5UMzIgaWRDb21tYW5kLAorCQkJCQkJVUlOVDMyIHVGbGFncyxMUFVJTlQzMiBscFJlc2VydmVkLExQU1RSIGxwc3pOYW1lLFVJTlQzMiB1TWF4TmFtZUxlbikKK3sJSFJFU1VMVCAgaHIgPSBFX0lOVkFMSURBUkc7CisKKwlUUkFDRShzaGVsbCwiKCVwKS0+KGlkY29tPSV4IGZsYWdzPSV4ICVwIG5hbWU9JXMgbGVuPSV4KVxuIix0aGlzLCBpZENvbW1hbmQsIHVGbGFncywgbHBSZXNlcnZlZCwgbHBzek5hbWUsIHVNYXhOYW1lTGVuKTsKKworIAlzd2l0Y2godUZsYWdzKQorCXsgY2FzZSBHQ1NfSEVMUFRFWFQ6CisgICAgICAgIGhyID0gRV9OT1RJTVBMOworICAgICAgICBicmVhazsKKyAgIAorCSAgY2FzZSBHQ1NfVkVSQkE6CisgICAgICAgIHN3aXRjaChpZENvbW1hbmQpCisgICAgICAgIHsgY2FzZSBJRE1fUkVOQU1FOgorICAgICAgICAgICAgc3RyY3B5KChMUFNUUilscHN6TmFtZSwgInJlbmFtZSIpOworICAgICAgICAgICAgaHIgPSBOT0VSUk9SOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisKKyAgIC8qIE5UIDQuMCB3aXRoIElFIDMuMHggb3Igbm8gSUUgd2lsbCBhbHdheXMgY2FsbCB0aGlzIHdpdGggR0NTX1ZFUkJXLiBJbiB0aGlzIAorICAgY2FzZSwgeW91IG5lZWQgdG8gZG8gdGhlIGxzdHJjcHlXIHRvIHRoZSBwb2ludGVyIHBhc3NlZC4qLworCSAgY2FzZSBHQ1NfVkVSQlc6CisgICAgICAgIHN3aXRjaChpZENvbW1hbmQpCisgICAgICAgIHsgY2FzZSBJRE1fUkVOQU1FOgorICAgICAgICAgICAgbHN0cmNweUF0b1coKExQV1NUUilscHN6TmFtZSwgInJlbmFtZSIpOworICAgICAgICAgICAgaHIgPSBOT0VSUk9SOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisKKwkgIGNhc2UgR0NTX1ZBTElEQVRFOgorICAgICAgICBociA9IE5PRVJST1I7CisgICAgICAgIGJyZWFrOworCX0KKwlyZXR1cm4gaHI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiAgSUNvbnRleHRNZW51X0FsbG9jUGlkbFRhYmxlKCkKKyovCitCT09MMzIgSUNvbnRleHRNZW51X0FsbG9jUGlkbFRhYmxlKExQQ09OVEVYVE1FTlUgdGhpcywgRFdPUkQgZHdFbnRyaWVzKQorewkvL2FkZCBvbmUgZm9yIE5VTEwgdGVybWluYXRvcgorCVRSQUNFKHNoZWxsLCIoJXApLT4oZW50cnlzPSV1KVxuIix0aGlzLCBkd0VudHJpZXMpOworCWR3RW50cmllcysrOworCisJdGhpcy0+YVBpZGxzID0gKExQSVRFTUlETElTVCopU0hBbGxvYyhkd0VudHJpZXMgKiBzaXplb2YoTFBJVEVNSURMSVNUKSk7CisKKwlpZih0aGlzLT5hUGlkbHMpCisJeyBaZXJvTWVtb3J5KHRoaXMtPmFQaWRscywgZHdFbnRyaWVzICogc2l6ZW9mKExQSVRFTUlETElTVCkpOwkvKnNldCBhbGwgb2YgdGhlIGVudHJpZXMgdG8gTlVMTCovCisJfQorCXJldHVybiAodGhpcy0+YVBpZGxzICE9IE5VTEwpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogSUNvbnRleHRNZW51X0ZyZWVQaWRsVGFibGUoKQorKi8KK3ZvaWQgSUNvbnRleHRNZW51X0ZyZWVQaWRsVGFibGUoTFBDT05URVhUTUVOVSB0aGlzKQoreyAgIGludCAgIGk7CisKKwlUUkFDRShzaGVsbCwiKCVwKS0+KClcbiIsdGhpcyk7CisKKwlpZih0aGlzLT5hUGlkbHMpCisJeyBmb3IoaSA9IDA7IHRoaXMtPmFQaWRsc1tpXTsgaSsrKQorICAgICAgeyBTSEZyZWUodGhpcy0+YVBpZGxzW2ldKTsKKyAgICAgIH0KKyAgIAorCVNIRnJlZSh0aGlzLT5hUGlkbHMpOworCXRoaXMtPmFQaWRscyA9IE5VTEw7CisJfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogSUNvbnRleHRNZW51X0ZpbGxQaWRsVGFibGUoKQorKi8KK0JPT0wzMiBJQ29udGV4dE1lbnVfRmlsbFBpZGxUYWJsZShMUENPTlRFWFRNRU5VIHRoaXMsIExQQ0lURU1JRExJU1QgKmFQaWRscywgVUlOVDMyIHVJdGVtQ291bnQpCit7ICAgVUlOVDMyICBpOworCVRSQUNFKHNoZWxsLCIoJXApLT4oYXBpZGw9JXAgY291bnQ9JXUpXG4iLHRoaXMsIGFQaWRscywgdUl0ZW1Db3VudCk7CisJaWYodGhpcy0+YVBpZGxzKQorCXsgZm9yKGkgPSAwOyBpIDwgdUl0ZW1Db3VudDsgaSsrKQorICAgICAgeyB0aGlzLT5hUGlkbHNbaV0gPSBJTENsb25lKGFQaWRsc1tpXSk7CisgICAgICB9CisgICAgICByZXR1cm4gVFJVRTsKKyAJfQorCXJldHVybiBGQUxTRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIElDb250ZXh0TWVudV9DYW5SZW5hbWVJdGVtcygpCisqLworQk9PTDMyIElDb250ZXh0TWVudV9DYW5SZW5hbWVJdGVtcyhMUENPTlRFWFRNRU5VIHRoaXMpCit7CVVJTlQzMiAgaTsKKwlEV09SRCBkd0F0dHJpYnV0ZXM7CisKKwlUUkFDRShzaGVsbCwiKCVwKS0+KClcbiIsdGhpcyk7CisKKwlpZih0aGlzLT5hUGlkbHMpCisJeyBpZih0aGlzLT5wUGlkbE1ncikKKwkgIHsgZm9yKGkgPSAwOyB0aGlzLT5hUGlkbHNbaV07IGkrKyl7fSAvKmdldCB0aGUgbnVtYmVyIG9mIGl0ZW1zIGFzc2lnbmVkIHRvIHRoaXMgb2JqZWN0Ki8KKyAgICAgICAgaWYoaSA+IDEpCS8qeW91IGNhbid0IHJlbmFtZSBtb3JlIHRoYW4gb25lIGl0ZW0gYXQgYSB0aW1lKi8KKyAgICAgICAgeyByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKwkgICAgZHdBdHRyaWJ1dGVzID0gU0ZHQU9fQ0FOUkVOQU1FOworCSAgICB0aGlzLT5wU0ZQYXJlbnQtPmxwdnRibC0+Zm5HZXRBdHRyaWJ1dGVzT2YodGhpcy0+cFNGUGFyZW50LCBpLAorICAgICAgICAJCQkJCQkgKExQQ0lURU1JRExJU1QqKXRoaXMtPmFQaWRscywgJmR3QXR0cmlidXRlcyk7CisgICAgICAKKyAgICAgIHJldHVybiBkd0F0dHJpYnV0ZXMgJiBTRkdBT19DQU5SRU5BTUU7CisgICAgICB9CisJfQkKKwlyZXR1cm4gRkFMU0U7Cit9CisKZGlmZiAtLWdpdCBhL2RsbHMvc2hlbGwzMi9lbnVtaWRsaXN0LmMgYi9kbGxzL3NoZWxsMzIvZW51bWlkbGlzdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhZmZmMGMKLS0tIC9kZXYvbnVsbAorKysgYi9kbGxzL3NoZWxsMzIvZW51bWlkbGlzdC5jCkBAIC0wLDAgKzEsMzU3IEBACisvKgorICoJSUVudW1JRExpc3QKKyAqCisgKglDb3B5cmlnaHQgMTk5OAlKdWVyZ2VuIFNjaG1pZWQgPGp1ZXJnZW4uc2NobWllZEBtZXRyb25ldC5kZT4KKyAqLworCisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlICJvbGUuaCIKKyNpbmNsdWRlICJvbGUyLmgiCisjaW5jbHVkZSAiZGVidWcuaCIKKyNpbmNsdWRlICJjb21wb2JqLmgiCisjaW5jbHVkZSAiaW50ZXJmYWNlcy5oIgorI2luY2x1ZGUgInNobG9iai5oIgorI2luY2x1ZGUgInNoZWxsLmgiCisjaW5jbHVkZSAid2luZXJyb3IuaCIKKyNpbmNsdWRlICJ3aW5ubHMuaCIKKyNpbmNsdWRlICJ3aW5wcm9jLmgiCisjaW5jbHVkZSAiY29tbWN0cmwuaCIKKworI2luY2x1ZGUgInNoZWxsMzJfbWFpbi5oIgorCisvKiBJRW51bUlETGlzdCBJbXBsZW1lbnRhdGlvbiAqLworc3RhdGljIEhSRVNVTFQgV0lOQVBJIElFbnVtSURMaXN0X1F1ZXJ5SW50ZXJmYWNlKExQRU5VTUlETElTVCxSRUZJSUQsTFBWT0lEKik7CitzdGF0aWMgVUxPTkcgV0lOQVBJIElFbnVtSURMaXN0X0FkZFJlZihMUEVOVU1JRExJU1QpOworc3RhdGljIFVMT05HIFdJTkFQSSBJRW51bUlETGlzdF9SZWxlYXNlKExQRU5VTUlETElTVCk7CitzdGF0aWMgSFJFU1VMVCBXSU5BUEkgSUVudW1JRExpc3RfTmV4dChMUEVOVU1JRExJU1QsVUxPTkcsTFBJVEVNSURMSVNUKixVTE9ORyopOworc3RhdGljIEhSRVNVTFQgV0lOQVBJIElFbnVtSURMaXN0X1NraXAoTFBFTlVNSURMSVNULFVMT05HKTsKK3N0YXRpYyBIUkVTVUxUIFdJTkFQSSBJRW51bUlETGlzdF9SZXNldChMUEVOVU1JRExJU1QpOworc3RhdGljIEhSRVNVTFQgV0lOQVBJIElFbnVtSURMaXN0X0Nsb25lKExQRU5VTUlETElTVCxMUEVOVU1JRExJU1QqKTsKK3N0YXRpYyBCT09MMzIgV0lOQVBJIElFbnVtSURMaXN0X0NyZWF0ZUVudW1MaXN0KExQRU5VTUlETElTVCxMUENTVFIsIERXT1JEKTsKK3N0YXRpYyBCT09MMzIgV0lOQVBJIElFbnVtSURMaXN0X0FkZFRvRW51bUxpc3QoTFBFTlVNSURMSVNULExQSVRFTUlETElTVCk7CitzdGF0aWMgQk9PTDMyIFdJTkFQSSBJRW51bUlETGlzdF9EZWxldGVMaXN0KExQRU5VTUlETElTVCk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIElFbnVtSURMaXN0X1ZUYWJsZQorICovCitzdGF0aWMgSUVudW1JRExpc3RfVlRhYmxlIGVpZGx2dCA9IAoreyBJRW51bUlETGlzdF9RdWVyeUludGVyZmFjZSwKKyAgSUVudW1JRExpc3RfQWRkUmVmLAorICBJRW51bUlETGlzdF9SZWxlYXNlLAorICBJRW51bUlETGlzdF9OZXh0LAorICBJRW51bUlETGlzdF9Ta2lwLAorICBJRW51bUlETGlzdF9SZXNldCwKKyAgSUVudW1JRExpc3RfQ2xvbmUsCisgIElFbnVtSURMaXN0X0NyZWF0ZUVudW1MaXN0LAorICBJRW51bUlETGlzdF9BZGRUb0VudW1MaXN0LAorICBJRW51bUlETGlzdF9EZWxldGVMaXN0Cit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBJRW51bUlETGlzdF9Db25zdHJ1Y3RvcgorICovCisKK0xQRU5VTUlETElTVCBJRW51bUlETGlzdF9Db25zdHJ1Y3RvciggTFBDU1RSIGxwc3pQYXRoLCBEV09SRCBkd0ZsYWdzLCBIUkVTVUxUKiBwUmVzdWx0KQorewlMUEVOVU1JRExJU1QJbHBlaWRsOworCisJbHBlaWRsID0gKExQRU5VTUlETElTVClIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwwLHNpemVvZihJRW51bUlETGlzdCkpOworCWxwZWlkbC0+cmVmID0gMTsKKwlscGVpZGwtPmxwdnRibCA9ICZlaWRsdnQ7CisJbHBlaWRsLT5tcEZpcnN0PU5VTEw7CisJbHBlaWRsLT5tcExhc3Q9TlVMTDsKKwlscGVpZGwtPm1wQ3VycmVudD1OVUxMOworCisgIFRSQUNFKHNoZWxsLCIoJXApLT4oJXMgMHglMDhseCAlcClcbiIsbHBlaWRsLGRlYnVnc3RyX2EobHBzelBhdGgpLGR3RmxhZ3MscFJlc3VsdCk7CisKKwlscGVpZGwtPm1wUGlkbE1ncj1QaWRsTWdyX0NvbnN0cnVjdG9yKCk7CisgIGlmICghbHBlaWRsLT5tcFBpZGxNZ3IpCisJeyBpZiAocFJlc3VsdCkKKwkgIHsgKnBSZXN1bHQ9RV9PVVRPRk1FTU9SWTsKKwkJCUhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksMCxscGVpZGwpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwl9CisKKwlpZighSUVudW1JRExpc3RfQ3JlYXRlRW51bUxpc3QobHBlaWRsLCBscHN6UGF0aCwgZHdGbGFncykpCisgIHsgaWYocFJlc3VsdCkKKyAgICB7ICpwUmVzdWx0ID0gRV9PVVRPRk1FTU9SWTsKKwkJCUhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksMCxscGVpZGwtPm1wUGlkbE1ncik7CisJCQlIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLDAsbHBlaWRsKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisgIH0KKworICBUUkFDRShzaGVsbCwiLS0gKCVwKS0+KClcbiIsbHBlaWRsKTsKKwlyZXR1cm4gbHBlaWRsOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBFbnVtSURMaXN0OjpRdWVyeUludGVyZmFjZQorICovCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkgSUVudW1JRExpc3RfUXVlcnlJbnRlcmZhY2UoCisgIExQRU5VTUlETElTVCB0aGlzLCBSRUZJSUQgcmlpZCwgTFBWT0lEICpwcHZPYmopCit7ICBjaGFyCXhyaWlkWzUwXTsKKyAgIFdJTkVfU3RyaW5nRnJvbUNMU0lEKChMUENMU0lEKXJpaWQseHJpaWQpOworICAgVFJBQ0Uoc2hlbGwsIiglcCktPihcblx0SUlEOlx0JXMsJXApXG4iLHRoaXMseHJpaWQscHB2T2JqKTsKKworICAqcHB2T2JqID0gTlVMTDsKKworICBpZihJc0VxdWFsSUlEKHJpaWQsICZJSURfSVVua25vd24pKSAgICAgICAgICAvKklVbmtub3duKi8KKyAgeyAqcHB2T2JqID0gdGhpczsgCisgIH0KKyAgZWxzZSBpZihJc0VxdWFsSUlEKHJpaWQsICZJSURfSUVudW1JRExpc3QpKSAgLypJRW51bUlETGlzdCovCisgIHsgICAgKnBwdk9iaiA9IChJRW51bUlETGlzdCopdGhpczsKKyAgfSAgIAorCisgIGlmKCpwcHZPYmopCisgIHsgKCooTFBFTlVNSURMSVNUKilwcHZPYmopLT5scHZ0YmwtPmZuQWRkUmVmKHRoaXMpOyAgCQorICAgIFRSQUNFKHNoZWxsLCItLSBJbnRlcmZhY2U6ICglcCktPiglcClcbiIscHB2T2JqLCpwcHZPYmopOworICAgIHJldHVybiBTX09LOworICB9CisJVFJBQ0Uoc2hlbGwsIi0tIEludGVyZmFjZTogRV9OT0lOVEVSRkFDRVxuIik7CisJcmV0dXJuIEVfTk9JTlRFUkZBQ0U7Cit9ICAgCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIElFbnVtSURMaXN0X0FkZFJlZgorICovCitzdGF0aWMgVUxPTkcgV0lOQVBJIElFbnVtSURMaXN0X0FkZFJlZihMUEVOVU1JRExJU1QgdGhpcykKK3sgVFJBQ0Uoc2hlbGwsIiglcCktPigpXG4iLHRoaXMpOworCXJldHVybiArKyh0aGlzLT5yZWYpOworfQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSUVudW1JRExpc3RfUmVsZWFzZQorICovCitzdGF0aWMgVUxPTkcgV0lOQVBJIElFbnVtSURMaXN0X1JlbGVhc2UoTFBFTlVNSURMSVNUIHRoaXMpCit7CVRSQUNFKHNoZWxsLCIoJXApLT4oKVxuIix0aGlzKTsKKwlpZiAoIS0tKHRoaXMtPnJlZikpIAorCXsgVFJBQ0Uoc2hlbGwsIiBkZXN0cm95aW5nIElFbnVtSURMaXN0KCVwKVxuIix0aGlzKTsKKwkJSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwwLHRoaXMpOworCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIHRoaXMtPnJlZjsKK30KKyAgIAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgSUVudW1JRExpc3RfTmV4dAorICovCisKK3N0YXRpYyBIUkVTVUxUIFdJTkFQSSBJRW51bUlETGlzdF9OZXh0KAorCUxQRU5VTUlETElTVCB0aGlzLFVMT05HIGNlbHQsTFBJVEVNSURMSVNUICogcmdlbHQsVUxPTkcgKnBjZWx0RmV0Y2hlZCkgCit7IFVMT05HICAgIGk7CisgIEhSRVNVTFQgIGhyID0gU19PSzsKKyAgTFBJVEVNSURMSVNUICB0ZW1wOworCisJVFJBQ0Uoc2hlbGwsIiglcCktPiglbGQsJXAsICVwKVxuIix0aGlzLGNlbHQscmdlbHQscGNlbHRGZXRjaGVkKTsKKworICAvKiBJdCBpcyB2YWxpZCB0byBsZWF2ZSBwY2VsdEZldGNoZWQgTlVMTCB3aGVuIGNlbHQgaXMgMS4gU29tZSBvZiBleHBsb3JlcidzCisgICAgIHN1YnN5c3RlbXMgYWN0dWFsbHkgdXNlIGl0IChhbmQgc28gbWF5IGEgdGhpcmQgcGFydHkgYnJvd3NlcikKKyAgICovCisgIGlmKHBjZWx0RmV0Y2hlZCkKKyAgICAqcGNlbHRGZXRjaGVkID0gMDsKKworCSpyZ2VsdD0wOworCQorICBpZihjZWx0ID4gMSAmJiAhcGNlbHRGZXRjaGVkKQorICB7IHJldHVybiBFX0lOVkFMSURBUkc7CisJfQorCisgIGZvcihpID0gMDsgaSA8IGNlbHQ7IGkrKykKKyAgeyBpZighKHRoaXMtPm1wQ3VycmVudCkpCisgICAgeyBociA9ICBTX0ZBTFNFOworICAgICAgYnJlYWs7CisgICAgfQorICAgIHRlbXAgPSBJTENsb25lKHRoaXMtPm1wQ3VycmVudC0+cGlkbCk7CisgICAgcmdlbHRbaV0gPSB0ZW1wOworICAgIHRoaXMtPm1wQ3VycmVudCA9IHRoaXMtPm1wQ3VycmVudC0+cE5leHQ7CisgIH0KKyAgaWYocGNlbHRGZXRjaGVkKQorICB7ICAqcGNlbHRGZXRjaGVkID0gaTsKKwl9CisKKyAgcmV0dXJuIGhyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogIElFbnVtSURMaXN0X1NraXAKKyovCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkgSUVudW1JRExpc3RfU2tpcCgKKwlMUEVOVU1JRExJU1QgdGhpcyxVTE9ORyBjZWx0KQoreyBEV09SRCAgICBkd0luZGV4OworICBIUkVTVUxUICBociA9IFNfT0s7CisKKyAgVFJBQ0Uoc2hlbGwsIiglcCktPiglbHUpXG4iLHRoaXMsY2VsdCk7CisKKyAgZm9yKGR3SW5kZXggPSAwOyBkd0luZGV4IDwgY2VsdDsgZHdJbmRleCsrKQorICB7IGlmKCF0aGlzLT5tcEN1cnJlbnQpCisgICAgeyBociA9IFNfRkFMU0U7CisgICAgICBicmVhazsKKyAgICB9CisgICAgdGhpcy0+bXBDdXJyZW50ID0gdGhpcy0+bXBDdXJyZW50LT5wTmV4dDsKKyAgfQorICByZXR1cm4gaHI7Cit9CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogIElFbnVtSURMaXN0X1Jlc2V0CisqLworc3RhdGljIEhSRVNVTFQgV0lOQVBJIElFbnVtSURMaXN0X1Jlc2V0KExQRU5VTUlETElTVCB0aGlzKQoreyBUUkFDRShzaGVsbCwiKCVwKVxuIix0aGlzKTsKKyAgdGhpcy0+bXBDdXJyZW50ID0gdGhpcy0+bXBGaXJzdDsKKyAgcmV0dXJuIFNfT0s7Cit9CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogIElFbnVtSURMaXN0X0Nsb25lCisqLworc3RhdGljIEhSRVNVTFQgV0lOQVBJIElFbnVtSURMaXN0X0Nsb25lKAorCUxQRU5VTUlETElTVCB0aGlzLExQRU5VTUlETElTVCAqIHBwZW51bSkKK3sgVFJBQ0Uoc2hlbGwsIiglcCktPigpIHRvICglcCktPigpIEVfTk9USU1QTFxuIix0aGlzLHBwZW51bSk7CisJcmV0dXJuIEVfTk9USU1QTDsKK30KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIEVudW1JRExpc3RfQ3JlYXRlRW51bUxpc3QoKQorICogIGZpeG1lOiBkZXZpY2VzIG5vdCBoYW5kbGVkCisgKiAgZml4bWU6IGFkZCB3aWxkY2FyZHMgdG8gcGF0aAorICovCitzdGF0aWMgQk9PTDMyIFdJTkFQSSBJRW51bUlETGlzdF9DcmVhdGVFbnVtTGlzdChMUEVOVU1JRExJU1QgdGhpcywgTFBDU1RSIGxwc3pQYXRoLCBEV09SRCBkd0ZsYWdzKQoreyBMUElURU1JRExJU1QgICBwaWRsPU5VTEw7CisgIFdJTjMyX0ZJTkRfREFUQTMyQSBzdGZmaWxlOwkKKyAgSEFORExFMzIgaEZpbGU7CisgIERXT1JEIGR3RHJpdmVtYXA7CisgIENIQVIgIHN6RHJpdmVOYW1lWzRdOworICBDSEFSICBzelBhdGhbTUFYX1BBVEhdOworICAgIAorICBUUkFDRShzaGVsbCwiKCVwKS0+KCVzIDB4JTA4bHgpIFxuIix0aGlzLGRlYnVnc3RyX2EobHBzelBhdGgpLGR3RmxhZ3MpOworCisgIGlmIChscHN6UGF0aCAmJiBscHN6UGF0aFswXSE9J1wwJykKKyAgeyBzdHJjcHkoc3pQYXRoLCBscHN6UGF0aCk7CisgICAgUGF0aEFkZEJhY2tzbGFzaChzelBhdGgpOworICAgIHN0cmNhdChzelBhdGgsIiouKiIpOworICB9CisKKyAgLyplbnVtZXJhdGUgdGhlIGZvbGRlcnMqLworICBpZihkd0ZsYWdzICYgU0hDT05URl9GT0xERVJTKQorICB7CS8qIHNwZWNpYWwgY2FzZSAtIHdlIGNhbid0IGVudW1lcmF0ZSB0aGUgRGVza3RvcCBsZXZlbCBPYmplY3RzIChNeUNvbXB1dGVyLE5ldGhvb2QuLi4KKyAgICBzbyB3ZSBuZWVkIHRvIGZha2UgYW4gZW51bWVyYXRpb24gb2YgdGhvc2UuKi8KKwkgIGlmKCFscHN6UGF0aCkKKyAgICB7IFRSQUNFIChzaGVsbCwiLS0gKCVwKS0+IGVudW1lcmF0ZSBTSENPTlRGX0ZPTERFUlMgKHNwZWNpYWwpIGl0ZW1zXG4iLHRoaXMpOworICAJCS8vY3JlYXRlIHRoZSBwaWRsIGZvciB0aGlzIGl0ZW0KKyAgICAgIHBpZGwgPSB0aGlzLT5tcFBpZGxNZ3ItPmxwdnRibC0+Zm5DcmVhdGVNeUNvbXB1dGVyKHRoaXMtPm1wUGlkbE1ncik7CisgICAgICBpZihwaWRsKQorICAgICAgeyBpZighSUVudW1JRExpc3RfQWRkVG9FbnVtTGlzdCh0aGlzLCBwaWRsKSkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgfQorICAgIH0gICAKKyAgICBlbHNlIGlmIChscHN6UGF0aFswXT09J1wwJykgLyogZW51bWVyYXRlIHRoZSBkcml2ZXMqLworICAgIHsgVFJBQ0UgKHNoZWxsLCItLSAoJXApLT4gZW51bWVyYXRlIFNIQ09OVEZfRk9MREVSUyAoZHJpdmVzKVxuIix0aGlzKTsKKyAgICAgIGR3RHJpdmVtYXAgPSBHZXRMb2dpY2FsRHJpdmVzKCk7CisgICAgICBzdHJjcHkgKHN6RHJpdmVOYW1lLCJBOlxcIik7CisgICAgICB3aGlsZSAoc3pEcml2ZU5hbWVbMF08PSdaJykKKyAgICAgIHsgaWYoZHdEcml2ZW1hcCAmIDB4MDAwMDAwMDFMKQorICAgICAgICB7IHBpZGwgPSB0aGlzLT5tcFBpZGxNZ3ItPmxwdnRibC0+Zm5DcmVhdGVEcml2ZSh0aGlzLT5tcFBpZGxNZ3Isc3pEcml2ZU5hbWUgKTsKKyAgICAgIGlmKHBpZGwpCisgICAgICB7IGlmKCFJRW51bUlETGlzdF9BZGRUb0VudW1MaXN0KHRoaXMsIHBpZGwpKQorICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgIH0KKyAgICAgIH0KKyAgICAgICAgc3pEcml2ZU5hbWVbMF0rKzsKKyAgICAgICAgZHdEcml2ZW1hcCA9IGR3RHJpdmVtYXAgPj4gMTsKKyAgICAgfSAgIAorICAgIH0KKyAgICAKKyAgICAgZWxzZQorICAgIHsgVFJBQ0UgKHNoZWxsLCItLSAoJXApLT4gZW51bWVyYXRlIFNIQ09OVEZfRk9MREVSUyBvZiAlc1xuIix0aGlzLGRlYnVnc3RyX2Eoc3pQYXRoKSk7CisgICAgICBoRmlsZSA9IEZpbmRGaXJzdEZpbGUzMkEoc3pQYXRoLCZzdGZmaWxlKTsKKyAgICAgIGlmICggaEZpbGUgIT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUzMiApCisgICAgICB7IGRvCisgICAgICAgIHsgaWYgKCAoc3RmZmlsZS5kd0ZpbGVBdHRyaWJ1dGVzICYgRklMRV9BVFRSSUJVVEVfRElSRUNUT1JZKSAmJiBzdHJjbXAgKHN0ZmZpbGUuY0ZpbGVOYW1lLCAiLiIpICYmIHN0cmNtcCAoc3RmZmlsZS5jRmlsZU5hbWUsICIuLiIpKQorICAgICAgICAgIHsgcGlkbCA9IHRoaXMtPm1wUGlkbE1nci0+bHB2dGJsLT5mbkNyZWF0ZUZvbGRlcih0aGlzLT5tcFBpZGxNZ3IsIHN0ZmZpbGUuY0ZpbGVOYW1lKTsKKyAgICAgICAgIGlmKHBpZGwpCisgICAgICAgICB7IGlmKCFJRW51bUlETGlzdF9BZGRUb0VudW1MaXN0KHRoaXMsIHBpZGwpKQorICAgICAgICAgICAgICAgeyAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgICAgfQorICAgICAgICAgfQorICAgICAgICAgZWxzZQorICAgICAgICAgeyByZXR1cm4gRkFMU0U7CisgICAgICAgICB9ICAgCisgICAgICAgICAgIH0KKyAgICAgIH0gd2hpbGUoIEZpbmROZXh0RmlsZTMyQShoRmlsZSwmc3RmZmlsZSkpOworCQkJRmluZENsb3NlMzIgKGhGaWxlKTsKKyAgICB9CisgIH0gICAKKyAgfSAgIAorICAvL2VudW1lcmF0ZSB0aGUgbm9uLWZvbGRlciBpdGVtcyAodmFsdWVzKQorICBpZihkd0ZsYWdzICYgU0hDT05URl9OT05GT0xERVJTKQorICB7IGlmKGxwc3pQYXRoKQorICAgIHsgVFJBQ0UgKHNoZWxsLCItLSAoJXApLT4gZW51bWVyYXRlIFNIQ09OVEZfTk9ORk9MREVSUyBvZiAlc1xuIix0aGlzLGRlYnVnc3RyX2Eoc3pQYXRoKSk7CisgICAgICBoRmlsZSA9IEZpbmRGaXJzdEZpbGUzMkEoc3pQYXRoLCZzdGZmaWxlKTsKKyAgICAgIGlmICggaEZpbGUgIT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUzMiApCisgICAgICB7IGRvCisgICAgeyBpZiAoISAoc3RmZmlsZS5kd0ZpbGVBdHRyaWJ1dGVzICYgRklMRV9BVFRSSUJVVEVfRElSRUNUT1JZKSApCisgICAgICAgICAgeyBwaWRsID0gdGhpcy0+bXBQaWRsTWdyLT5scHZ0YmwtPmZuQ3JlYXRlVmFsdWUodGhpcy0+bXBQaWRsTWdyLCBzdGZmaWxlLmNGaWxlTmFtZSk7CisgICAgICBpZihwaWRsKQorICAgICAgeyBpZighSUVudW1JRExpc3RfQWRkVG9FbnVtTGlzdCh0aGlzLCBwaWRsKSkKKyAgICAgICAgeyByZXR1cm4gRkFMU0U7CisJCQkgIH0KKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsgcmV0dXJuIEZBTFNFOworICAgICAgfSAgIAorICAgICAgICAgIH0KKyAgICB9IHdoaWxlKCBGaW5kTmV4dEZpbGUzMkEoaEZpbGUsJnN0ZmZpbGUpKTsKKwkgIEZpbmRDbG9zZTMyIChoRmlsZSk7CisgIH0gCisgICAgfQorICB9IAorICByZXR1cm4gVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgRW51bUlETGlzdF9BZGRUb0VudW1MaXN0KCkKKyAqLworc3RhdGljIEJPT0wzMiBXSU5BUEkgSUVudW1JRExpc3RfQWRkVG9FbnVtTGlzdChMUEVOVU1JRExJU1QgdGhpcyxMUElURU1JRExJU1QgcGlkbCkKK3sgTFBFTlVNTElTVCAgcE5ldzsKKworICBUUkFDRShzaGVsbCwiKCVwKS0+KHBpZGw9JXApXG4iLHRoaXMscGlkbCk7CisgIHBOZXcgPSAoTFBFTlVNTElTVClIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwwLHNpemVvZihFTlVNTElTVCkpOworICBpZihwTmV3KQorICB7IC8vc2V0IHRoZSBuZXh0IHBvaW50ZXIKKyAgICBwTmV3LT5wTmV4dCA9IE5VTEw7CisgICAgcE5ldy0+cGlkbCA9IHBpZGw7CisKKyAgICAvL2lzIHRoaXMgdGhlIGZpcnN0IGl0ZW0gaW4gdGhlIGxpc3Q/CisgICAgaWYoIXRoaXMtPm1wRmlyc3QpCisgICAgeyB0aGlzLT5tcEZpcnN0ID0gcE5ldzsKKyAgICAgIHRoaXMtPm1wQ3VycmVudCA9IHBOZXc7CisgICAgfQorICAgCisgICAgaWYodGhpcy0+bXBMYXN0KQorICAgIHsgLy9hZGQgdGhlIG5ldyBpdGVtIHRvIHRoZSBlbmQgb2YgdGhlIGxpc3QKKyAgICAgIHRoaXMtPm1wTGFzdC0+cE5leHQgPSBwTmV3OworICAgIH0KKyAgIAorICAgIC8vdXBkYXRlIHRoZSBsYXN0IGl0ZW0gcG9pbnRlcgorICAgIHRoaXMtPm1wTGFzdCA9IHBOZXc7CisgICAgVFJBQ0Uoc2hlbGwsIi0tICglcCktPihmaXJzdD0lcCwgbGFzdD0lcClcbiIsdGhpcyx0aGlzLT5tcEZpcnN0LHRoaXMtPm1wTGFzdCk7CisgICAgcmV0dXJuIFRSVUU7CisgIH0KKyAgcmV0dXJuIEZBTFNFOworfQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqICAgRW51bUlETGlzdF9EZWxldGVMaXN0KCkKKyovCitzdGF0aWMgQk9PTDMyIFdJTkFQSSBJRW51bUlETGlzdF9EZWxldGVMaXN0KExQRU5VTUlETElTVCB0aGlzKQoreyBMUEVOVU1MSVNUICBwRGVsZXRlOworCisgIFRSQUNFKHNoZWxsLCIoJXApLT4oKVxuIix0aGlzKTsKKwkKKyAgd2hpbGUodGhpcy0+bXBGaXJzdCkKKyAgeyBwRGVsZXRlID0gdGhpcy0+bXBGaXJzdDsKKyAgICB0aGlzLT5tcEZpcnN0ID0gcERlbGV0ZS0+cE5leHQ7CisgICAgU0hGcmVlKHBEZWxldGUtPnBpZGwpOworICAgIFNIRnJlZShwRGVsZXRlKTsKKyAgfQorICB0aGlzLT5tcEZpcnN0ID0gdGhpcy0+bXBMYXN0ID0gdGhpcy0+bXBDdXJyZW50ID0gTlVMTDsKKyAgcmV0dXJuIFRSVUU7Cit9CmRpZmYgLS1naXQgYS9kbGxzL3NoZWxsMzIvZm9sZGVycy5jIGIvZGxscy9zaGVsbDMyL2ZvbGRlcnMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOWUwNzhjCi0tLSAvZGV2L251bGwKKysrIGIvZGxscy9zaGVsbDMyL2ZvbGRlcnMuYwpAQCAtMCwwICsxLDIyNCBAQAorLyoKKyAqCVNoZWxsIEZvbGRlciBzdHVmZiAoLi4uYW5kIGFsbCB0aGUgT0xFLU9iamVjdHMgb2YgU0hFTEwzMi5ETEwpCisgKgorICoJQ29weXJpZ2h0IDE5OTcJTWFyY3VzIE1laXNzbmVyCisgKglDb3B5cmlnaHQgMTk5OAlKdWVyZ2VuIFNjaG1pZWQKKyAqCisgKiAgISEhIGN1cnJlbnRseSB3b3JrIGluIHByb2dyZXNzIG9uIGFsbCBjbGFzc2VzICEhIQorICogIDxjb250YWN0IGp1ZXJnZW4uc2NobWllZEBtZXRyb25ldC5kZSwgOTgwODAxPgorICovCisKKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgIm9sZS5oIgorI2luY2x1ZGUgIm9sZTIuaCIKKyNpbmNsdWRlICJkZWJ1Zy5oIgorI2luY2x1ZGUgImNvbXBvYmouaCIKKyNpbmNsdWRlICJpbnRlcmZhY2VzLmgiCisjaW5jbHVkZSAic2hsb2JqLmgiCisjaW5jbHVkZSAic2hlbGwuaCIKKyNpbmNsdWRlICJ3aW5lcnJvci5oIgorI2luY2x1ZGUgIndpbm5scy5oIgorI2luY2x1ZGUgIndpbnByb2MuaCIKKyNpbmNsdWRlICJjb21tY3RybC5oIgorCisjaW5jbHVkZSAic2hlbGwzMl9tYWluLmgiCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBmb3Jld2FyZCBkZWNsYXJhdGlvbgorKi8KKworLyogSUV4dHJhY3RJY29uIGltcGxlbWVudGF0aW9uKi8KK3N0YXRpYyBIUkVTVUxUIFdJTkFQSSBJRXh0cmFjdEljb25fUXVlcnlJbnRlcmZhY2UoTFBFWFRSQUNUSUNPTiwgUkVGSUlELCBMUFZPSUQgKik7CitzdGF0aWMgVUxPTkcgV0lOQVBJIElFeHRyYWN0SWNvbl9BZGRSZWYoTFBFWFRSQUNUSUNPTik7CitzdGF0aWMgVUxPTkcgV0lOQVBJIElFeHRyYWN0SWNvbl9BZGRSZWYoTFBFWFRSQUNUSUNPTik7CitzdGF0aWMgVUxPTkcgV0lOQVBJIElFeHRyYWN0SWNvbl9SZWxlYXNlKExQRVhUUkFDVElDT04pOworc3RhdGljIEhSRVNVTFQgSUV4dHJhY3RJY29uX0dldEljb25Mb2NhdGlvbihMUEVYVFJBQ1RJQ09OLCBVSU5UMzIsIExQU1RSLCBVSU5UMzIsIGludCAqLCBVSU5UMzIgKik7CitzdGF0aWMgSFJFU1VMVCBJRXh0cmFjdEljb25fRXh0cmFjdChMUEVYVFJBQ1RJQ09OLCBMUENTVFIsIFVJTlQzMiwgSElDT04zMiAqLCBISUNPTjMyICosIFVJTlQzMik7CisKKy8qIElTaGVsbExpbmsgSW1wbGVtZW50YXRpb24gKi8KK3N0YXRpYyBIUkVTVUxUIFdJTkFQSSBJU2hlbGxMaW5rX1F1ZXJ5SW50ZXJmYWNlKExQU0hFTExMSU5LLFJFRklJRCxMUFZPSUQqKTsKK3N0YXRpYyBVTE9ORyBXSU5BUEkgSVNoZWxsTGlua19BZGRSZWYoTFBTSEVMTExJTkspOworc3RhdGljIFVMT05HIFdJTkFQSSBJU2hlbGxMaW5rX1JlbGVhc2UoTFBTSEVMTExJTkspOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiAgIElFeHRyYWN0SWNvbiBpbXBsZW1lbnRhdGlvbgorKi8KK3N0YXRpYyBzdHJ1Y3QgSUV4dHJhY3RJY29uX1ZUYWJsZSBlaXZ0ID0gCit7IElFeHRyYWN0SWNvbl9RdWVyeUludGVyZmFjZSwKKyAgSUV4dHJhY3RJY29uX0FkZFJlZiwKKyAgSUV4dHJhY3RJY29uX1JlbGVhc2UsCisgIElFeHRyYWN0SWNvbl9HZXRJY29uTG9jYXRpb24sCisgIElFeHRyYWN0SWNvbl9FeHRyYWN0Cit9OworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqICBJRXh0cmFjdEljb25fQ29uc3RydWN0b3IKKyovCitMUEVYVFJBQ1RJQ09OIElFeHRyYWN0SWNvbl9Db25zdHJ1Y3RvcihMUENJVEVNSURMSVNUIHBpZGwpCit7IExQRVhUUkFDVElDT04gZWk7CisgIGVpPShMUEVYVFJBQ1RJQ09OKUhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLDAsc2l6ZW9mKElFeHRyYWN0SWNvbikpOworICBlaS0+cmVmPTE7CisgIGVpLT5scHZ0Ymw9JmVpdnQ7CisgIGVpLT5waWRsPUlMQ2xvbmUocGlkbCk7CisgIAorICBUUkFDRShzaGVsbCwiKCVwKVxuIixlaSk7CisgIHJldHVybiBlaTsKK30KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIElFeHRyYWN0SWNvbl9RdWVyeUludGVyZmFjZQorICovCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkgSUV4dHJhY3RJY29uX1F1ZXJ5SW50ZXJmYWNlKCBMUEVYVFJBQ1RJQ09OIHRoaXMsIFJFRklJRCByaWlkLCBMUFZPSUQgKnBwdk9iaikKK3sgIGNoYXIJeHJpaWRbNTBdOworICAgV0lORV9TdHJpbmdGcm9tQ0xTSUQoKExQQ0xTSUQpcmlpZCx4cmlpZCk7CisgICBUUkFDRShzaGVsbCwiKCVwKS0+KFxuXHRJSUQ6XHQlcywlcClcbiIsdGhpcyx4cmlpZCxwcHZPYmopOworCisgICpwcHZPYmogPSBOVUxMOworCisgIGlmKElzRXF1YWxJSUQocmlpZCwgJklJRF9JVW5rbm93bikpICAgICAgICAgIC8qSVVua25vd24qLworICB7ICpwcHZPYmogPSB0aGlzOyAKKyAgfQorICBlbHNlIGlmKElzRXF1YWxJSUQocmlpZCwgJklJRF9JRXh0cmFjdEljb24pKSAgLypJRXh0cmFjdEljb24qLworICB7ICAgICpwcHZPYmogPSAoSUV4dHJhY3RJY29uKil0aGlzOworICB9ICAgCisKKyAgaWYoKnBwdk9iaikKKyAgeyAoKihMUEVYVFJBQ1RJQ09OKilwcHZPYmopLT5scHZ0YmwtPmZuQWRkUmVmKHRoaXMpOyAgCQorICAgIFRSQUNFKHNoZWxsLCItLSBJbnRlcmZhY2U6ICglcCktPiglcClcbiIscHB2T2JqLCpwcHZPYmopOworICAgIHJldHVybiBTX09LOworICB9CisJVFJBQ0Uoc2hlbGwsIi0tIEludGVyZmFjZTogRV9OT0lOVEVSRkFDRVxuIik7CisJcmV0dXJuIEVfTk9JTlRFUkZBQ0U7Cit9ICAgCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiAgSUV4dHJhY3RJY29uX0FkZFJlZgorKi8KK3N0YXRpYyBVTE9ORyBXSU5BUEkgSUV4dHJhY3RJY29uX0FkZFJlZihMUEVYVFJBQ1RJQ09OIHRoaXMpCit7IFRSQUNFKHNoZWxsLCIoJXApLT4oY291bnQ9JWx1KVxuIix0aGlzLCh0aGlzLT5yZWYpKzEpOworICByZXR1cm4gKysodGhpcy0+cmVmKTsKK30KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiAgSUV4dHJhY3RJY29uX1JlbGVhc2UKKyovCitzdGF0aWMgVUxPTkcgV0lOQVBJIElFeHRyYWN0SWNvbl9SZWxlYXNlKExQRVhUUkFDVElDT04gdGhpcykKK3sgVFJBQ0Uoc2hlbGwsIiglcCktPigpXG4iLHRoaXMpOworICBpZiAoIS0tKHRoaXMtPnJlZikpIAorICB7IFRSQUNFKHNoZWxsLCIgZGVzdHJveWluZyBJRXh0cmFjdEljb24oJXApXG4iLHRoaXMpOworICAgIFNIRnJlZSh0aGlzLT5waWRsKTsKKyAgICBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLDAsdGhpcyk7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgcmV0dXJuIHRoaXMtPnJlZjsKK30KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiAgSUV4dHJhY3RJY29uX0dldEljb25Mb2NhdGlvbgorKiBOT1RFCisqICBGSVhNRSByZXR1cm5zIGFsbHdheXMgdGhlIGljb24gbm8uIDMgKGNsb3NlZCBGb2xkZXIpCisqLworc3RhdGljIEhSRVNVTFQgSUV4dHJhY3RJY29uX0dldEljb25Mb2NhdGlvbihMUEVYVFJBQ1RJQ09OIHRoaXMsIFVJTlQzMiB1RmxhZ3MsIExQU1RSIHN6SWNvbkZpbGUsIFVJTlQzMiBjY2hNYXgsIGludCAqIHBpSW5kZXgsIFVJTlQzMiAqIHB3RmxhZ3MpCit7IEZJWE1FIChzaGVsbCwiKCVwKSAoZmxhZ3M9JXUgZmlsZT0lcyBtYXg9JXUgJXAgJXApIHNlbWktc3R1YlxuIiwgdGhpcywgdUZsYWdzLCBzekljb25GaWxlLCBjY2hNYXgsIHBpSW5kZXgsIHB3RmxhZ3MpOworICAqcHdGbGFncyA9IEdJTF9OT1RGSUxFTkFNRTsKKyAgKnBpSW5kZXggPSAzOworICByZXR1cm4gTk9FUlJPUjsKK30KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiAgSUV4dHJhY3RJY29uX0V4dHJhY3QKKyovCitzdGF0aWMgSFJFU1VMVCBJRXh0cmFjdEljb25fRXh0cmFjdChMUEVYVFJBQ1RJQ09OIHRoaXMsIExQQ1NUUiBwc3pGaWxlLCBVSU5UMzIgbkljb25JbmRleCwgSElDT04zMiAqcGhpY29uTGFyZ2UsIEhJQ09OMzIgKnBoaWNvblNtYWxsLCBVSU5UMzIgbkljb25TaXplKQoreyBGSVhNRSAoc2hlbGwsIiglcCkgKGZpbGU9JXMgaW5kZXg9JXUgJXAgJXAgc2l6ZT0ldSkgc2VtaS1zdHViXG4iLCB0aGlzLCBwc3pGaWxlLCBuSWNvbkluZGV4LCBwaGljb25MYXJnZSwgcGhpY29uU21hbGwsIG5JY29uU2l6ZSk7CisgICpwaGljb25MYXJnZSA9IHBJbWFnZUxpc3RfR2V0SWNvbihTaGVsbEJpZ0ljb25MaXN0LCBuSWNvbkluZGV4LCBJTERfVFJBTlNQQVJFTlQpOworICAqcGhpY29uU21hbGwgPSBwSW1hZ2VMaXN0X0dldEljb24oU2hlbGxTbWFsbEljb25MaXN0LCBuSWNvbkluZGV4LCBJTERfVFJBTlNQQVJFTlQpOworICByZXR1cm4gU19PSzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIElTaGVsbExpbmsgSW1wbGVtZW50YXRpb24KKyovCisKK3N0YXRpYyBzdHJ1Y3QgSVNoZWxsTGlua19WVGFibGUgc2x2dCA9IHsKKyAgSVNoZWxsTGlua19RdWVyeUludGVyZmFjZSwKKyAgSVNoZWxsTGlua19BZGRSZWYsCisgIElTaGVsbExpbmtfUmVsZWFzZSwKKyAgICAodm9pZCAqKTB4Y2FmZTAwMDQsCisgICAgKHZvaWQgKikweGNhZmUwMDA1LAorICAgICh2b2lkICopMHhjYWZlMDAwNiwKKyAgICAodm9pZCAqKTB4Y2FmZTAwMDcsCisgICAgKHZvaWQgKikweGNhZmUwMDA4LAorICAgICh2b2lkICopMHhjYWZlMDAwOSwKKyAgICAodm9pZCAqKTB4Y2FmZTAwMTAsCisgICAgKHZvaWQgKikweGNhZmUwMDExLAorICAgICh2b2lkICopMHhjYWZlMDAxMiwKKyAgICAodm9pZCAqKTB4Y2FmZTAwMTMsCisgICAgKHZvaWQgKikweGNhZmUwMDE0LAorICAgICh2b2lkICopMHhjYWZlMDAxNSwKKyAgICAodm9pZCAqKTB4Y2FmZTAwMTYsCisgICAgKHZvaWQgKikweGNhZmUwMDE3LAorICAgICh2b2lkICopMHhjYWZlMDAxOCwKKyAgICAodm9pZCAqKTB4Y2FmZTAwMTksCisgICAgKHZvaWQgKikweGNhZmUwMDIwLAorICAgICh2b2lkICopMHhjYWZlMDAyMQorfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgkgIElTaGVsbExpbmtfQ29uc3RydWN0b3IKKyAqLworTFBTSEVMTExJTksgSVNoZWxsTGlua19Db25zdHJ1Y3RvcigpIAorewlMUFNIRUxMTElOSyBzbDsKKworCXNsID0gKExQU0hFTExMSU5LKUhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLDAsc2l6ZW9mKElTaGVsbExpbmspKTsKKwlzbC0+cmVmID0gMTsKKwlzbC0+bHB2dGJsID0gJnNsdnQ7CisJVFJBQ0Uoc2hlbGwsIiglcCktPigpXG4iLHNsKTsKKwlyZXR1cm4gc2w7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIElTaGVsbExpbms6OlF1ZXJ5SW50ZXJmYWNlCisgKi8KK3N0YXRpYyBIUkVTVUxUIFdJTkFQSSBJU2hlbGxMaW5rX1F1ZXJ5SW50ZXJmYWNlKAorICBMUFNIRUxMTElOSyB0aGlzLCBSRUZJSUQgcmlpZCwgTFBWT0lEICpwcHZPYmopCit7ICBjaGFyICAgIHhyaWlkWzUwXTsKKyAgIFdJTkVfU3RyaW5nRnJvbUNMU0lEKChMUENMU0lEKXJpaWQseHJpaWQpOworICAgVFJBQ0Uoc2hlbGwsIiglcCktPihcblx0SUlEOlx0JXMpXG4iLHRoaXMseHJpaWQpOworCisgICpwcHZPYmogPSBOVUxMOworCisgIGlmKElzRXF1YWxJSUQocmlpZCwgJklJRF9JVW5rbm93bikpICAgICAgICAgIC8qSVVua25vd24qLworICB7ICpwcHZPYmogPSB0aGlzOyAKKyAgfQorICBlbHNlIGlmKElzRXF1YWxJSUQocmlpZCwgJklJRF9JU2hlbGxMaW5rKSkgIC8qSVNoZWxsTGluayovCisgIHsgICAgKnBwdk9iaiA9IChMUFNIRUxMTElOSyl0aGlzOworICB9ICAgCisKKyAgaWYoKnBwdk9iaikKKyAgeyAoKihMUFNIRUxMTElOSyopcHB2T2JqKS0+bHB2dGJsLT5mbkFkZFJlZih0aGlzKTsgICAgICAKKyAgICBUUkFDRShzaGVsbCwiLS0gSW50ZXJmYWNlOiAoJXApLT4oJXApXG4iLHBwdk9iaiwqcHB2T2JqKTsKKyAgICByZXR1cm4gU19PSzsKKyAgfQorICAgIFRSQUNFKHNoZWxsLCItLSBJbnRlcmZhY2U6IEVfTk9JTlRFUkZBQ0VcbiIpOworICByZXR1cm4gRV9OT0lOVEVSRkFDRTsKK30gIAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSVNoZWxsTGlua19BZGRSZWYKKyAqLworc3RhdGljIFVMT05HIFdJTkFQSSBJU2hlbGxMaW5rX0FkZFJlZihMUFNIRUxMTElOSyB0aGlzKQoreyBUUkFDRShzaGVsbCwiKCVwKS0+KGNvdW50PSVsdSlcbiIsdGhpcyx0aGlzLT5yZWYpOworICAgIHJldHVybiArKyh0aGlzLT5yZWYpOworfQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSUNsYXNzRmFjdG9yeV9SZWxlYXNlCisgKi8KK3N0YXRpYyBVTE9ORyBXSU5BUEkgSVNoZWxsTGlua19SZWxlYXNlKExQU0hFTExMSU5LIHRoaXMpCit7IFRSQUNFKHNoZWxsLCIoJXApLT4oY291bnQ9JWx1KVxuIix0aGlzLHRoaXMtPnJlZik7CisgIGlmICghLS0odGhpcy0+cmVmKSkgCisgIHsgVFJBQ0Uoc2hlbGwsIi0tIGRlc3Ryb3lpbmcgSVNoZWxsTGluayglcClcbiIsdGhpcyk7CisgICAgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwwLHRoaXMpOworICAgIHJldHVybiAwOworICB9CisgIHJldHVybiB0aGlzLT5yZWY7Cit9CisKKwpkaWZmIC0tZ2l0IGEvZGxscy9zaGVsbDMyL3BpZGwuYyBiL2RsbHMvc2hlbGwzMi9waWRsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2IxNDQwYQotLS0gL2Rldi9udWxsCisrKyBiL2RsbHMvc2hlbGwzMi9waWRsLmMKQEAgLTAsMCArMSw4NDYgQEAKKy8qCisgKglwaWRsIEhhbmRsaW5nCisgKgorICoJQ29weXJpZ2h0IDE5OTgJSnVlcmdlbiBTY2htaWVkCisgKgorICogICEhISBjdXJyZW50bHkgd29yayBpbiBwcm9ncmVzcyBvbiBhbGwgY2xhc3NlcyAhISEKKyAqICA8Y29udGFjdCBqdWVyZ2VuLnNjaG1pZWRAbWV0cm9uZXQuZGUsIDk4MDgwMT4KKyAqLworCisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlICJvbGUuaCIKKyNpbmNsdWRlICJvbGUyLmgiCisjaW5jbHVkZSAiZGVidWcuaCIKKyNpbmNsdWRlICJjb21wb2JqLmgiCisjaW5jbHVkZSAiaW50ZXJmYWNlcy5oIgorI2luY2x1ZGUgInNobG9iai5oIgorI2luY2x1ZGUgInNoZWxsLmgiCisjaW5jbHVkZSAid2luZXJyb3IuaCIKKyNpbmNsdWRlICJ3aW5ubHMuaCIKKyNpbmNsdWRlICJ3aW5wcm9jLmgiCisjaW5jbHVkZSAiY29tbWN0cmwuaCIKKyNpbmNsdWRlICJzaGVsbDMyX21haW4uaCIKKworI2luY2x1ZGUgInBpZGwuaCIKKwordm9pZCBwZHVtcCAoTFBDSVRFTUlETElTVCBwaWRsKQoreyBEV09SRCB0eXBlOworICBDSEFSICogc3pEYXRhOworICBMUElURU1JRExJU1QgcGlkbHRlbXAgPSBwaWRsOworICBUUkFDRShwaWRsLCItLS0tLS0tLS0tIHBpZGw9JXAgXG4iLCBwaWRsKTsKKyAgZG8KKyAgeyBzekRhdGEgPSAoKExQUElETERBVEEgKShwaWRsdGVtcC0+bWtpZC5hYklEKSktPnN6VGV4dDsKKyAgICB0eXBlICAgPSAoKExQUElETERBVEEgKShwaWRsdGVtcC0+bWtpZC5hYklEKSktPnR5cGU7CisgICAgVFJBQ0UocGlkbCwiLS0tLSBwaWRsPSVwIHNpemU9JXUgdHlwZT0lbHggJXNcbiIscGlkbHRlbXAsIHBpZGx0ZW1wLT5ta2lkLmNiLHR5cGUsZGVidWdzdHJfYShzekRhdGEpKTsKKyAgICBwaWRsdGVtcCA9IChMUElURU1JRExJU1QpKCgoQllURSopcGlkbHRlbXApK3BpZGx0ZW1wLT5ta2lkLmNiKTsKKyAgfSB3aGlsZSAocGlkbHRlbXAtPm1raWQuY2IpOworfQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIElMR2V0RGlzcGxheU5hbWUJCQlbU0hFTEwzMi4xNV0KKyAqLworQk9PTDMyIFdJTkFQSSBJTEdldERpc3BsYXlOYW1lKExQQ0lURU1JRExJU1QgaWlsLExQU1RSIHBhdGgpCit7CUZJWE1FKHBpZGwsIiglcCwlcCksc3R1YiwgcmV0dXJuIGU6IVxuIixpaWwscGF0aCk7CisJc3RyY3B5KHBhdGgsImU6XFwiKTsKKwlyZXR1cm4gVFJVRTsKK30KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBJTEZpbmRMYXN0SUQgW1NIRUxMMzIuMTZdCisgKi8KK0xQU0hJVEVNSUQgV0lOQVBJIElMRmluZExhc3RJRChMUElURU1JRExJU1QgaWlsKSAKK3sJTFBTSElURU1JRAlsYXN0c2lpLHNpaTsKKworIAlUUkFDRShwaWRsLCIlcFxuIixpaWwpOworCWlmICghaWlsKQorCXsgcmV0dXJuIE5VTEw7CisgICAgfQorCXNpaSA9ICYoaWlsLT5ta2lkKTsKKwlsYXN0c2lpID0gc2lpOworCXdoaWxlIChzaWktPmNiKQorICAgIHsgbGFzdHNpaSA9IHNpaTsKKwkgIHNpaSA9IChMUFNISVRFTUlEKSgoKGNoYXIqKXNpaSkrc2lpLT5jYik7CisJfQorCXJldHVybiBsYXN0c2lpOworfQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIElMUmVtb3ZlTGFzdElEIFtTSEVMTDMyLjE3XQorICogTk9URVMKKyAqICBSZW1vdmVzIHRoZSBsYXN0IGl0ZW0gCisgKi8KK0JPT0wzMiBXSU5BUEkgSUxSZW1vdmVMYXN0SUQoTFBDSVRFTUlETElTVCBwaWRsKQoreyBMUENJVEVNSURMSVNUCXhwaWRsOworICAgCisgIFRSQUNFKHNoZWxsLCJwaWRsPSVwXG4iLHBpZGwpOworICBpZiAoIXBpZGwgfHwgIXBpZGwtPm1raWQuY2IpCisgICAgcmV0dXJuIDA7CisgIElMRmluZExhc3RJRChwaWRsKS0+Y2IgPSAwOworICByZXR1cm4gMTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIElMQ2xvbmUgW1NIRUxMMzIuMThdCisgKgorICogTk9URVMKKyAqICAgIGR1cGljYXRlIGFuIGlkbGlzdAorICovCitMUElURU1JRExJU1QgV0lOQVBJIElMQ2xvbmUgKExQQ0lURU1JRExJU1QgcGlkbCkKK3sgRFdPUkQgICAgbGVuOworICBMUElURU1JRExJU1QgIG5ld3BpZGw7CisKKyAgVFJBQ0UocGlkbCwiJXBcbiIscGlkbCk7CisKKyAgaWYgKCFwaWRsKQorICAgIHJldHVybiBOVUxMOworICAgIAorICBsZW4gPSBJTEdldFNpemUocGlkbCk7CisgIG5ld3BpZGwgPSAoTFBJVEVNSURMSVNUKVNIQWxsb2MobGVuKTsKKyAgaWYgKG5ld3BpZGwpCisgICAgbWVtY3B5KG5ld3BpZGwscGlkbCxsZW4pOworICByZXR1cm4gbmV3cGlkbDsKK30KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBJTENsb25lRmlyc3QgW1NIRUxMMzIuMTldCisgKgorICogTk9URVMKKyAqICBkdXBsaWNhdGVzIHRoZSBmaXJzdCBpZGxpc3Qgb2YgYSBjb21wbGV4IHBpZGwKKyAqLworTFBJVEVNSURMSVNUIFdJTkFQSSBJTENsb25lRmlyc3QoTFBDSVRFTUlETElTVCBwaWRsKQoreyBGSVhNRShwaWRsLCJwaWRsPSVwXG4iLHBpZGwpOworICByZXR1cm4gTlVMTDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIElMQ29tYmluZSBbU0hFTEwzMi4yNV0KKyAqCisgKiBOT1RFUworICogIENvbmNhdGVuYXRlcyB0d28gY29tcGxleCBpZGxpc3RzLgorICogIFRoZSBwaWRsIGlzIHRoZSBmaXJzdCBvbmUsIHBpZGxzdWIgdGhlIG5leHQgb25lCisgKiAgRG9lcyBub3QgZGVzdHJveSB0aGUgcGFzc2VkIGluIGlkbGlzdHMhCisgKi8KK0xQSVRFTUlETElTVCBXSU5BUEkgSUxDb21iaW5lKExQQ0lURU1JRExJU1QgcGlkbDEsTFBDSVRFTUlETElTVCBwaWRsMikKK3sgRFdPUkQgICAgbGVuMSxsZW4yOworICBMUElURU1JRExJU1QgIHBpZGxOZXc7CisgIAorICBUUkFDRShwaWRsLCJwaWRsPSVwIHBpZGw9JXBcbiIscGlkbDEscGlkbDIpOworCisgIGlmKCFwaWRsMSAmJiAhcGlkbDIpCisgIHsgIHJldHVybiBOVUxMOworICB9CisgCisgIGlmKCFwaWRsMSkKKyAgeyBwaWRsTmV3ID0gSUxDbG9uZShwaWRsMik7CisgICAgcmV0dXJuIHBpZGxOZXc7CisgIH0KKworICBpZighcGlkbDIpCisgIHsgcGlkbE5ldyA9IElMQ2xvbmUocGlkbDEpOworICAgIHJldHVybiBwaWRsTmV3OworICB9CisKKyAgbGVuMSAgPSBJTEdldFNpemUocGlkbDEpLTI7CisgIGxlbjIgID0gSUxHZXRTaXplKHBpZGwyKTsKKyAgcGlkbE5ldyAgPSBTSEFsbG9jKGxlbjErbGVuMik7CisgIAorICBpZiAocGlkbE5ldykKKyAgeyBtZW1jcHkocGlkbE5ldyxwaWRsMSxsZW4xKTsKKyAgICBtZW1jcHkoKChCWVRFICopcGlkbE5ldykrbGVuMSxwaWRsMixsZW4yKTsKKyAgfQorCisvKiAgVFJBQ0UocGlkbCwiLS1uZXcgcGlkbD0lcFxuIixwaWRsTmV3KTsqLworICByZXR1cm4gcGlkbE5ldzsKK30KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBJTEdldFNpemUgW1NIRUxMMzIuMTUyXQorICogIGdldHMgdGhlIGJ5dGUgc2l6ZSBvZiBhbiBpZGxpc3QgaW5jbHVkaW5nIHplcm8gdGVybWluYXRvciAocGlkbCkKKyAqCisgKiBQQVJBTUVURVJTCisgKiAgcGlkbCBJVEVNSURMSVNUCisgKgorICogUkVUVVJOUworICogIHNpemUgb2YgcGlkbAorICoKKyAqIE5PVEVTCisgKiAgZXhwb3J0ZWQgYnkgb3JkaW5hbAorICovCitEV09SRCBXSU5BUEkgSUxHZXRTaXplKExQSVRFTUlETElTVCBwaWRsKQoreyBMUFNISVRFTUlEIHNpID0gJihwaWRsLT5ta2lkKTsKKyAgRFdPUkQgIGxlbj0wOworCisgIFRSQUNFKHBpZGwsInBpZGw9JXBcbiIscGlkbCk7CisKKyAgaWYgKHBpZGwpCisgIHsgd2hpbGUgKHNpLT5jYikgCisgICAgeyBsZW4gKz0gc2ktPmNiOworICAgICAgc2kgID0gKExQU0hJVEVNSUQpKCgoTFBCWVRFKXNpKStzaS0+Y2IpOworICAgIH0KKyAgICBsZW4gKz0gMjsKKwl9CisvKiAgVFJBQ0UocGlkbCwiLS0gc2l6ZT0lbHVcbiIsbGVuKTsqLworCXJldHVybiBsZW47Cit9CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSUxHZXROZXh0IFtTSEVMTDMyLjE1M10KKyAqICBnZXRzIHRoZSBuZXh0IHNpbXBsZSBwaWRsIG90IG9mIGEgY29tcGxleCBwaWRsCisgKgorICogUEFSQU1FVEVSUworICogIHBpZGwgSVRFTUlETElTVAorICoKKyAqIFJFVFVSTlMKKyAqICBwb2ludGVyIHRvIG5leHQgZWxlbWVudAorICoKKyAqLworTFBJVEVNSURMSVNUIFdJTkFQSSBJTEdldE5leHQoTFBJVEVNSURMSVNUIHBpZGwpCit7IExQSVRFTUlETElTVCBuZXh0cGlkbDsKKworICBUUkFDRShwaWRsLCIocGlkbD0lcClcbiIscGlkbCk7CisgIGlmKHBpZGwpCisgIHsgbmV4dHBpZGwgPSAoTFBJVEVNSURMSVNUKShMUEJZVEUpKCgoTFBCWVRFKXBpZGwpICsgcGlkbC0+bWtpZC5jYik7CisJcmV0dXJuIG5leHRwaWRsOworICB9CisgIGVsc2UKKyAgeyAgcmV0dXJuIChOVUxMKTsKKyAgfQorfQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIElMQXBwZW5kIFtTSEVMTDMyLjE1NF0KKyAqCisgKiBOT1RFUworICogIEFkZHMgdGhlIHNpbmdsZSBpdGVtIHRvIHRoZSBpZGxpc3QgaW5kaWNhdGVkIGJ5IHBpZGwuCisgKiAgaWYgYkVuZCBpcyAwLCBhZGRzIHRoZSBpdGVtIHRvIHRoZSBmcm9udCBvZiB0aGUgbGlzdCwKKyAqICBvdGhlcndpc2UgYWRkcyB0aGUgaXRlbSB0byB0aGUgZW5kLgorICogIERlc3Ryb3lzIHRoZSBwYXNzZWQgaW4gaWRsaXN0IQorICovCitMUElURU1JRExJU1QgV0lOQVBJIElMQXBwZW5kKExQSVRFTUlETElTVCBwaWRsLExQQ0lURU1JRExJU1QgaXRlbSxCT09MMzIgYkVuZCkKK3sgVFJBQ0UocGlkbCwiKHBpZGw9JXAscGlkbD0lcCwlMDh1KVxuIixwaWRsLGl0ZW0sYkVuZCk7CisgIHJldHVybiBOVUxMOworfQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIElMRnJlZSBbU0hFTEwzMi4xNTVdCisgKgorICogTk9URVMKKyAqICAgICBmcmVlX2NoZWNrX3B0ciAtIGZyZWVzIG1lbW9yeSAoaWYgbm90IE5VTEwpCisgKiAgICAgYWxsb2NhdGVkIGJ5IFNITWFsbG9jIGFsbG9jYXRvcgorICogICAgIGV4cG9ydGVkIGJ5IG9yZGluYWwKKyAqLworRFdPUkQgV0lOQVBJIElMRnJlZShMUFZPSUQgcGlkbCkgCit7IFRSQUNFKHBpZGwsIihwaWRsPTB4JTA4bHgpXG4iLChEV09SRClwaWRsKTsKKyAgaWYgKCFwaWRsKQorCQlyZXR1cm4gMDsKKyAgcmV0dXJuIFNIRnJlZShwaWRsKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCSAgSU5URVJOQUwgQ0xBU1MgcGlkbG1ncgorKi8KKworc3RhdGljIHN0cnVjdCBQaWRsTWdyX1ZUYWJsZSBwbWdydnQgPSB7CisgICAgUGlkbE1ncl9DcmVhdGVEZXNrdG9wLAorICAgIFBpZGxNZ3JfQ3JlYXRlTXlDb21wdXRlciwKKwlQaWRsTWdyX0NyZWF0ZURyaXZlLAorICAgIFBpZGxNZ3JfQ3JlYXRlRm9sZGVyLAorICAgIFBpZGxNZ3JfQ3JlYXRlVmFsdWUsCisgICAgUGlkbE1ncl9HZXREZXNrdG9wLAorCVBpZGxNZ3JfR2V0RHJpdmUsCisgICAgUGlkbE1ncl9HZXRMYXN0SXRlbSwKKyAgICBQaWRsTWdyX0dldEl0ZW1UZXh0LAorICAgIFBpZGxNZ3JfSXNEZXNrdG9wLAorICAgIFBpZGxNZ3JfSXNNeUNvbXB1dGVyLAorCVBpZGxNZ3JfSXNEcml2ZSwKKyAgICBQaWRsTWdyX0lzRm9sZGVyLAorICAgIFBpZGxNZ3JfSXNWYWx1ZSwKKyAgICBQaWRsTWdyX0hhc0ZvbGRlcnMsCisgICAgUGlkbE1ncl9HZXRGb2xkZXJUZXh0LAorICAgIFBpZGxNZ3JfR2V0VmFsdWVUZXh0LAorICAgIFBpZGxNZ3JfR2V0VmFsdWVUeXBlLAorICAgIFBpZGxNZ3JfR2V0RGF0YVRleHQsCisgICAgUGlkbE1ncl9HZXRQaWRsUGF0aCwKKyAgICBQaWRsTWdyX0NyZWF0ZSwKKyAgICBQaWRsTWdyX0dldERhdGEsCisgICAgUGlkbE1ncl9HZXREYXRhUG9pbnRlciwKKyAgICBQaWRsTWdyX1NlcGFyYXRlUGF0aEFuZFZhbHVlCit9OworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgkgIFBpZGxNZ3JfQ29uc3RydWN0b3IKKyAqLworTFBQSURMTUdSIFBpZGxNZ3JfQ29uc3RydWN0b3IoKSAKK3sJTFBQSURMTUdSIHBtZ3I7CisJcG1nciA9IChMUFBJRExNR1IpSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksMCxzaXplb2YocGlkbG1ncikpOworCXBtZ3ItPmxwdnRibCA9ICZwbWdydnQ7CisJVFJBQ0UocGlkbCwiKCVwKS0+KClcbiIscG1ncik7CisgIC8qKiBGSVhNRURsbFJlZkNvdW50Kys7Ki8KKwlyZXR1cm4gcG1ncjsKK30KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJICBQaWRsTWdyX0Rlc3RydWN0b3IKKyAqLwordm9pZCBQaWRsTWdyX0Rlc3RydWN0b3IoTFBQSURMTUdSIHRoaXMpIAorewlIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLDAsdGhpcyk7CisgCVRSQUNFKHBpZGwsIiglcCktPigpXG4iLHRoaXMpOworICAvKiogRklYTUVEbGxSZWZDb3VudC0tOyovCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIFBpZGxNZ3JfQ3JlYXRlRGVza3RvcCgpCisgKiAgUGlkbE1ncl9DcmVhdGVNeUNvbXB1dGVyKCkKKyAqICBQaWRsTWdyX0NyZWF0ZURyaXZlKCkKKyAqICBQaWRsTWdyX0NyZWF0ZUZvbGRlcigpIAorICogIFBpZGxNZ3JfQ3JlYXRlVmFsdWUoKQorICovCitMUElURU1JRExJU1QgUGlkbE1ncl9DcmVhdGVEZXNrdG9wKExQUElETE1HUiB0aGlzKQoreyBUUkFDRShwaWRsLCIoJXApLT4oKVxuIix0aGlzKTsKKyAgICByZXR1cm4gUGlkbE1ncl9DcmVhdGUodGhpcyxQVF9ERVNLVE9QLCBOVUxMLCAwKTsKK30KK0xQSVRFTUlETElTVCBQaWRsTWdyX0NyZWF0ZU15Q29tcHV0ZXIoTFBQSURMTUdSIHRoaXMpCit7IFRSQUNFKHBpZGwsIiglcCktPigpXG4iLHRoaXMpOworICByZXR1cm4gUGlkbE1ncl9DcmVhdGUodGhpcyxQVF9NWUNPTVAsICh2b2lkICopIk15IENvbXB1dGVyIiwgc3RybGVuICgiTXkgQ29tcHV0ZXIiKSsxKTsKK30KK0xQSVRFTUlETElTVCBQaWRsTWdyX0NyZWF0ZURyaXZlKExQUElETE1HUiB0aGlzLCBMUENTVFIgbHBzek5ldykKK3sgY2hhciBzVGVtcFs0XTsKKyAgc3RybmNweSAoc1RlbXAsbHBzek5ldyw0KTsKKwlzVGVtcFsyXT0nXFwnOworCXNUZW1wWzNdPTB4MDA7CisgIFRSQUNFKHBpZGwsIiglcCktPiglcylcbiIsdGhpcyxzVGVtcCk7CisgIHJldHVybiBQaWRsTWdyX0NyZWF0ZSh0aGlzLFBUX0RSSVZFLChMUFZPSUQpJnNUZW1wWzBdLDQpOworfQorTFBJVEVNSURMSVNUIFBpZGxNZ3JfQ3JlYXRlRm9sZGVyKExQUElETE1HUiB0aGlzLCBMUENTVFIgbHBzek5ldykKK3sgVFJBQ0UocGlkbCwiKCVwKS0+KCVzKVxuIix0aGlzLGxwc3pOZXcpOworICByZXR1cm4gUGlkbE1ncl9DcmVhdGUodGhpcyxQVF9GT0xERVIsIChMUFZPSUQpbHBzek5ldywgc3RybGVuKGxwc3pOZXcpKzEpOworfQorTFBJVEVNSURMSVNUIFBpZGxNZ3JfQ3JlYXRlVmFsdWUoTFBQSURMTUdSIHRoaXMsTFBDU1RSIGxwc3pOZXcpCit7IFRSQUNFKHBpZGwsIiglcCktPiglcylcbiIsdGhpcyxscHN6TmV3KTsKKyAgcmV0dXJuIFBpZGxNZ3JfQ3JlYXRlKHRoaXMsUFRfVkFMVUUsIChMUFZPSUQpbHBzek5ldywgc3RybGVuKGxwc3pOZXcpKzEpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBQaWRsTWdyX0dldERlc2t0b3AoKQorICogCisgKiAgRklYTUU6IHF1aWNrIGhhY2sKKyAqLworQk9PTDMyIFBpZGxNZ3JfR2V0RGVza3RvcChMUFBJRExNR1IgdGhpcyxMUENJVEVNSURMSVNUIHBpZGwsTFBTVFIgcE91dCkKK3sgVFJBQ0UocGlkbCwiKCVwKS0+KCVwICVwKVxuIix0aGlzLHBpZGwscE91dCk7CisgIHJldHVybiAoQk9PTDMyKVBpZGxNZ3JfR2V0RGF0YSh0aGlzLFBUX0RFU0tUT1AsIHBpZGwsIChMUFZPSUQpcE91dCwgMjU1KTsKK30KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIFBpZGxNZ3JfR2V0RHJpdmUoKQorICoKKyAqICBGSVhNRTogcXVpY2sgaGFjaworICovCitCT09MMzIgUGlkbE1ncl9HZXREcml2ZShMUFBJRExNR1IgdGhpcyxMUENJVEVNSURMSVNUIHBpZGwsTFBTVFIgcE91dCwgVUlOVDE2IHVTaXplKQoreyBMUElURU1JRExJU1QgICBwaWRsVGVtcD1OVUxMOworCisgIFRSQUNFKHBpZGwsIiglcCktPiglcCwlcCwldSlcbiIsdGhpcyxwaWRsLHBPdXQsdVNpemUpOworICBpZihQaWRsTWdyX0lzTXlDb21wdXRlcih0aGlzLHBpZGwpKQorICB7IHBpZGxUZW1wID0gSUxHZXROZXh0KHBpZGwpOworCX0KKyAgZWxzZSBpZiAocGlkbFRlbXAgJiYgUGlkbE1ncl9Jc0RyaXZlKHRoaXMscGlkbFRlbXApKQorICB7IHJldHVybiAoQk9PTDMyKVBpZGxNZ3JfR2V0RGF0YSh0aGlzLFBUX0RSSVZFLCBwaWRsVGVtcCwgKExQVk9JRClwT3V0LCB1U2l6ZSk7CisJfQorCXJldHVybiBGQUxTRTsKK30KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIFBpZGxNZ3JfR2V0TGFzdEl0ZW0oKQorICogIEdldHMgdGhlIGxhc3QgaXRlbSBpbiB0aGUgbGlzdAorICovCitMUElURU1JRExJU1QgUGlkbE1ncl9HZXRMYXN0SXRlbShMUFBJRExNR1IgdGhpcyxMUENJVEVNSURMSVNUIHBpZGwpCit7IExQSVRFTUlETElTVCAgIHBpZGxMYXN0ID0gTlVMTDsKKworICBUUkFDRShwaWRsLCIoJXApLT4ocGlkbD0lcClcbiIsdGhpcyxwaWRsKTsKKworICBpZihwaWRsKQorICB7IHdoaWxlKHBpZGwtPm1raWQuY2IpCisgICAgeyBwaWRsTGFzdCA9IChMUElURU1JRExJU1QpcGlkbDsKKyAgICAgIHBpZGwgPSBJTEdldE5leHQocGlkbCk7CisgICAgfSAgCisgIH0KKyAgcmV0dXJuIHBpZGxMYXN0OworfQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgUGlkbE1ncl9HZXRJdGVtVGV4dCgpCisgKiAgR2V0cyB0aGUgdGV4dCBmb3Igb25seSB0aGlzIGl0ZW0KKyAqLworRFdPUkQgUGlkbE1ncl9HZXRJdGVtVGV4dChMUFBJRExNR1IgdGhpcyxMUENJVEVNSURMSVNUIHBpZGwsIExQU1RSIGxwc3pUZXh0LCBVSU5UMTYgdVNpemUpCit7IFRSQUNFKHBpZGwsIiglcCktPihwaWRsPSVwICVwICV4KVxuIix0aGlzLHBpZGwsbHBzelRleHQsdVNpemUpOworICBpZiAoUGlkbE1ncl9Jc015Q29tcHV0ZXIodGhpcywgcGlkbCkpCisgIHsgcmV0dXJuIFBpZGxNZ3JfR2V0RGF0YSh0aGlzLFBUX01ZQ09NUCwgcGlkbCwgKExQVk9JRClscHN6VGV4dCwgdVNpemUpOworCX0KKwlpZiAoUGlkbE1ncl9Jc0RyaXZlKHRoaXMsIHBpZGwpKQorCXsgcmV0dXJuIFBpZGxNZ3JfR2V0RGF0YSh0aGlzLFBUX0RSSVZFLCBwaWRsLCAoTFBWT0lEKWxwc3pUZXh0LCB1U2l6ZSk7CisJfQorCXJldHVybiBQaWRsTWdyX0dldERhdGEodGhpcyxQVF9URVhULCBwaWRsLCAoTFBWT0lEKWxwc3pUZXh0LCB1U2l6ZSk7CQorfQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgUGlkbE1ncl9Jc0Rlc2t0b3AoKQorICogIFBpZGxNZ3JfSXNEcml2ZSgpCisgKiAgUGlkbE1ncl9Jc0ZvbGRlcigpCisgKiAgUGlkbE1ncl9Jc1ZhbHVlKCkKKyovCitCT09MMzIgUGlkbE1ncl9Jc0Rlc2t0b3AoTFBQSURMTUdSIHRoaXMsTFBDSVRFTUlETElTVCBwaWRsKQoreyBUUkFDRShwaWRsLCIlcC0+KCVwKVxuIix0aGlzLHBpZGwpOworCisgIGlmICghIHBpZGwpCisgICAgcmV0dXJuIEZBTFNFOworCisgIHJldHVybiAoICBwaWRsLT5ta2lkLmNiID09IDB4MDAgKTsKK30KKworQk9PTDMyIFBpZGxNZ3JfSXNNeUNvbXB1dGVyKExQUElETE1HUiB0aGlzLExQQ0lURU1JRExJU1QgcGlkbCkKK3sgTFBQSURMREFUQSAgcERhdGE7CisgIFRSQUNFKHBpZGwsIiVwLT4oJXApXG4iLHRoaXMscGlkbCk7CisKKyAgaWYgKCEgcGlkbCkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgcERhdGEgPSBQaWRsTWdyX0dldERhdGFQb2ludGVyKHRoaXMscGlkbCk7CisgIHJldHVybiAoUFRfTVlDT01QID09IHBEYXRhLT50eXBlKTsKK30KKworQk9PTDMyIFBpZGxNZ3JfSXNEcml2ZShMUFBJRExNR1IgdGhpcyxMUENJVEVNSURMSVNUIHBpZGwpCit7IExQUElETERBVEEgIHBEYXRhOworICBUUkFDRShwaWRsLCIlcC0+KCVwKVxuIix0aGlzLHBpZGwpOworCisgIGlmICghIHBpZGwpCisgICAgcmV0dXJuIEZBTFNFOworCisgIHBEYXRhID0gUGlkbE1ncl9HZXREYXRhUG9pbnRlcih0aGlzLHBpZGwpOworICByZXR1cm4gKFBUX0RSSVZFID09IHBEYXRhLT50eXBlKTsKK30KKworQk9PTDMyIFBpZGxNZ3JfSXNGb2xkZXIoTFBQSURMTUdSIHRoaXMsTFBDSVRFTUlETElTVCBwaWRsKQoreyBMUFBJRExEQVRBICBwRGF0YTsKKyAgVFJBQ0UocGlkbCwiJXAtPiglcClcbiIsdGhpcyxwaWRsKTsKKworICBpZiAoISBwaWRsKQorICAgIHJldHVybiBGQUxTRTsKKworICBwRGF0YSA9IFBpZGxNZ3JfR2V0RGF0YVBvaW50ZXIodGhpcyxwaWRsKTsKKyAgcmV0dXJuIChQVF9GT0xERVIgPT0gcERhdGEtPnR5cGUpOworfQorCitCT09MMzIgUGlkbE1ncl9Jc1ZhbHVlKExQUElETE1HUiB0aGlzLExQQ0lURU1JRExJU1QgcGlkbCkKK3sgTFBQSURMREFUQSAgcERhdGE7CisgIFRSQUNFKHBpZGwsIiVwLT4oJXApXG4iLHRoaXMscGlkbCk7CisKKyAgaWYgKCEgcGlkbCkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgcERhdGEgPSBQaWRsTWdyX0dldERhdGFQb2ludGVyKHRoaXMscGlkbCk7CisgIHJldHVybiAoUFRfVkFMVUUgPT0gcERhdGEtPnR5cGUpOworfQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBQaWRsTWdyX0hhc0ZvbGRlcnMoKQorICogZml4bWU6IHF1aWNrIGhhY2sKKyAqLworQk9PTDMyIFBpZGxNZ3JfSGFzRm9sZGVycyhMUFBJRExNR1IgdGhpcywgTFBTVFIgcHN6UGF0aCwgTFBDSVRFTUlETElTVCBwaWRsKQoreyBCT09MMzIgYlJlc3VsdD0gRkFMU0U7CisgIFdJTjMyX0ZJTkRfREFUQTMyQSBzdGZmaWxlOwkKKyAgSEFORExFMzIgaEZpbGU7CisKKyAgVFJBQ0UocGlkbCwiKCVwKS0+JXAgJXBcbiIsdGhpcywgcHN6UGF0aCwgcGlkbCk7CisJCisgIGhGaWxlID0gRmluZEZpcnN0RmlsZTMyQShwc3pQYXRoLCZzdGZmaWxlKTsKKyAgZG8KKyAgeyBpZiAoISAoc3RmZmlsZS5kd0ZpbGVBdHRyaWJ1dGVzICYgRklMRV9BVFRSSUJVVEVfRElSRUNUT1JZKSApCisgICAgeyAgYlJlc3VsdD0gVFJVRTsKKwkJfQorICB9IHdoaWxlKCBGaW5kTmV4dEZpbGUzMkEoaEZpbGUsJnN0ZmZpbGUpKTsKKyAgRmluZENsb3NlMzIgKGhGaWxlKTsKKwkKKwlyZXR1cm4gYlJlc3VsdDsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBQaWRsTWdyX0dldEZvbGRlclRleHQoKQorICogIENyZWF0ZXMgYSBQYXRoIHN0cmluZyBmcm9tIGEgUElETCwgZmlsdGVyaW5nIG91dCB0aGUgc3BlY2lhbCBGb2xkZXJzIAorICovCitEV09SRCBQaWRsTWdyX0dldEZvbGRlclRleHQoTFBQSURMTUdSIHRoaXMsTFBDSVRFTUlETElTVCBwaWRsLAorICAgTFBTVFIgbHBzelBhdGgsIERXT1JEIGR3U2l6ZSkKK3sgTFBJVEVNSURMSVNUICAgcGlkbFRlbXA7CisgIERXT1JEICAgICAgICAgIGR3Q29waWVkID0gMDsKKyAKKyAgVFJBQ0UocGlkbCwiKCVwKS0+KCVwKVxuIix0aGlzLHBpZGwpOworIAorICBpZighcGlkbCkKKyAgeyByZXR1cm4gMDsKKyAgfQorCisgIGlmKFBpZGxNZ3JfSXNNeUNvbXB1dGVyKHRoaXMscGlkbCkpCisgIHsgcGlkbFRlbXAgPSBJTEdldE5leHQocGlkbCk7CisgICAgVFJBQ0UocGlkbCwiLS0gKCVwKS0+c2tpcCBNeSBDb21wdXRlclxuIix0aGlzKTsKKyAgfQorICBlbHNlCisgIHsgcGlkbFRlbXAgPSAoTFBJVEVNSURMSVNUKXBpZGw7CisgIH0KKworICAvL2lmIHRoaXMgaXMgTlVMTCwgcmV0dXJuIHRoZSByZXF1aXJlZCBzaXplIG9mIHRoZSBidWZmZXIKKyAgaWYoIWxwc3pQYXRoKQorICB7IHdoaWxlKHBpZGxUZW1wLT5ta2lkLmNiKQorICAgIHsgTFBQSURMREFUQSAgcERhdGEgPSBQaWRsTWdyX0dldERhdGFQb2ludGVyKHRoaXMscGlkbFRlbXApOworICAgICAgCisgICAgICAvL2FkZCB0aGUgbGVuZ3RoIG9mIHRoaXMgaXRlbSBwbHVzIG9uZSBmb3IgdGhlIGJhY2tzbGFzaAorICAgICAgZHdDb3BpZWQgKz0gc3RybGVuKHBEYXRhLT5zelRleHQpICsgMTsgIC8qIEZJWE1FIHBEYXRhLT5zelRleHQgaXMgbm90IGV2ZXJ5IHRpbWUgYSBzdHJpbmcqLworCisgICAgICBwaWRsVGVtcCA9IElMR2V0TmV4dChwaWRsVGVtcCk7CisgICAgfQorCisgICAgLy9hZGQgb25lIGZvciB0aGUgTlVMTCB0ZXJtaW5hdG9yCisJVFJBQ0UocGlkbCwiLS0gKCVwKS0+KHNpemU9JWx1KVxuIix0aGlzLGR3Q29waWVkKTsKKyAgICByZXR1cm4gZHdDb3BpZWQgKyAxOworICB9CisKKyAgKmxwc3pQYXRoID0gMDsKKworICB3aGlsZShwaWRsVGVtcC0+bWtpZC5jYiAmJiAoZHdDb3BpZWQgPCBkd1NpemUpKQorICB7IExQUElETERBVEEgIHBEYXRhID0gUGlkbE1ncl9HZXREYXRhUG9pbnRlcih0aGlzLHBpZGxUZW1wKTsKKworICAgIC8vaWYgdGhpcyBpdGVtIGlzIGEgdmFsdWUsIHRoZW4gc2tpcCBpdCBhbmQgZmluaXNoCisgICAgaWYoUFRfVkFMVUUgPT0gcERhdGEtPnR5cGUpCisgICAgeyBicmVhazsKKwl9CisgICAKKyAgICBzdHJjYXQobHBzelBhdGgsIHBEYXRhLT5zelRleHQpOworICAgIHN0cmNhdChscHN6UGF0aCwgIlxcIik7CisgICAgZHdDb3BpZWQgKz0gc3RybGVuKHBEYXRhLT5zelRleHQpICsgMTsKKyAgICBwaWRsVGVtcCA9IElMR2V0TmV4dChwaWRsVGVtcCk7CisKKwlUUkFDRShwaWRsLCItLSAoJXApLT4oc2l6ZT0lbHUsJXMpXG4iLHRoaXMsZHdDb3BpZWQsbHBzelBhdGgpOworICB9CisKKyAgLy9yZW1vdmUgdGhlIGxhc3QgYmFja3NsYXNoIGlmIG5lY2Vzc2FyeQorICBpZihkd0NvcGllZCkKKyAgeyBpZigqKGxwc3pQYXRoICsgc3RybGVuKGxwc3pQYXRoKSAtIDEpID09ICdcXCcpCisgICAgeyAqKGxwc3pQYXRoICsgc3RybGVuKGxwc3pQYXRoKSAtIDEpID0gMDsKKyAgICAgIGR3Q29waWVkLS07CisgICAgfQorICB9CisgIFRSQUNFKHBpZGwsIi0tICglcCktPihwYXRoPSVzKVxuIix0aGlzLGxwc3pQYXRoKTsKKyAgcmV0dXJuIGR3Q29waWVkOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIFBpZGxNZ3JfR2V0VmFsdWVUZXh0KCkKKyAqICBHZXRzIHRoZSB0ZXh0IGZvciB0aGUgbGFzdCBpdGVtIGluIHRoZSBsaXN0CisgKi8KK0RXT1JEIFBpZGxNZ3JfR2V0VmFsdWVUZXh0KExQUElETE1HUiB0aGlzLAorICAgIExQQ0lURU1JRExJU1QgcGlkbCwgTFBTVFIgbHBzelZhbHVlLCBEV09SRCBkd1NpemUpCit7IExQSVRFTUlETElTVCAgcGlkbFRlbXA9cGlkbDsKKyAgQ0hBUiAgICAgICAgICBzelRleHRbTUFYX1BBVEhdOworCisgIFRSQUNFKHBpZGwsIiglcCktPihwaWRsPSVwICVwIDB4JTA4bHgpXG4iLHRoaXMscGlkbCxscHN6VmFsdWUsZHdTaXplKTsKKworICBpZighcGlkbCkKKyAgeyByZXR1cm4gMDsKKwl9CisJCQorICB3aGlsZShwaWRsVGVtcC0+bWtpZC5jYiAmJiAhUGlkbE1ncl9Jc1ZhbHVlKHRoaXMscGlkbFRlbXApKQorICB7IHBpZGxUZW1wID0gSUxHZXROZXh0KHBpZGxUZW1wKTsKKyAgfQorCisgIGlmKCFwaWRsVGVtcC0+bWtpZC5jYikKKyAgeyByZXR1cm4gMDsKKwl9CisKKyAgUGlkbE1ncl9HZXRJdGVtVGV4dCh0aGlzLCBwaWRsVGVtcCwgc3pUZXh0LCBzaXplb2Yoc3pUZXh0KSk7CisKKyAgaWYoIWxwc3pWYWx1ZSkKKyAgeyByZXR1cm4gc3RybGVuKHN6VGV4dCkgKyAxOworICB9CisgIHN0cmNweShscHN6VmFsdWUsIHN6VGV4dCk7CisJVFJBQ0UocGlkbCwiLS0gKCVwKS0+KHBpZGw9JXAgJXA9JXMgMHglMDhseClcbiIsdGhpcyxwaWRsLGxwc3pWYWx1ZSxscHN6VmFsdWUsZHdTaXplKTsKKyAgcmV0dXJuIHN0cmxlbihscHN6VmFsdWUpOworfQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgUGlkbE1ncl9HZXRWYWx1ZVR5cGUoKQorICovCitCT09MMzIgUGlkbE1ncl9HZXRWYWx1ZVR5cGUoIExQUElETE1HUiB0aGlzLAorICAgTFBDSVRFTUlETElTVCBwaWRsUGF0aCwKKyAgIExQQ0lURU1JRExJU1QgcGlkbFZhbHVlLAorICAgTFBEV09SRCBwZHdUeXBlKQoreyBMUFNUUiAgICBscHN6Rm9sZGVyLAorICAgICAgICAgICBscHN6VmFsdWVOYW1lOworICBEV09SRCAgICBkd05hbWVTaXplOworIAorICBGSVhNRShwaWRsLCIoJXApLT4oJXAgJXAgJXApIHN0dWJcbiIsdGhpcyxwaWRsUGF0aCxwaWRsVmFsdWUscGR3VHlwZSk7CisJCisgIGlmKCFwaWRsUGF0aCkKKyAgeyByZXR1cm4gRkFMU0U7CisJfQorCisgIGlmKCFwaWRsVmFsdWUpCisgIHsgcmV0dXJuIEZBTFNFOworCX0KKworICBpZighcGR3VHlwZSkKKyAgeyByZXR1cm4gRkFMU0U7CisJfQorCisgIC8vZ2V0IHRoZSBEZXNrdG9wCisgIC8vUGlkbE1ncl9HZXREZXNrdG9wKHRoaXMscGlkbFBhdGgpOworCisgIC8qIGZpeG1lOiBhZGQgdGhlIGRyaXZlbGV0dGVyIGhlcmUqLworCQorICAvL2Fzc2VtYmxlIHRoZSBGb2xkZXIgc3RyaW5nCisgIGR3TmFtZVNpemUgPSBQaWRsTWdyX0dldEZvbGRlclRleHQodGhpcyxwaWRsUGF0aCwgTlVMTCwgMCk7CisgIGxwc3pGb2xkZXIgPSAoTFBTVFIpSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksMCxkd05hbWVTaXplKTsKKyAgaWYoIWxwc3pGb2xkZXIpCisgIHsgIHJldHVybiBGQUxTRTsKKwl9CisgIFBpZGxNZ3JfR2V0Rm9sZGVyVGV4dCh0aGlzLHBpZGxQYXRoLCBscHN6Rm9sZGVyLCBkd05hbWVTaXplKTsKKworICAvL2Fzc2VtYmxlIHRoZSB2YWx1ZSBuYW1lCisgIGR3TmFtZVNpemUgPSBQaWRsTWdyX0dldFZhbHVlVGV4dCh0aGlzLHBpZGxWYWx1ZSwgTlVMTCwgMCk7CisgIGxwc3pWYWx1ZU5hbWUgPSAoTFBTVFIpSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksMCxkd05hbWVTaXplKTsKKyAgaWYoIWxwc3pWYWx1ZU5hbWUpCisgIHsgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwwLGxwc3pGb2xkZXIpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBQaWRsTWdyX0dldFZhbHVlVGV4dCh0aGlzLHBpZGxWYWx1ZSwgbHBzelZhbHVlTmFtZSwgZHdOYW1lU2l6ZSk7CisKKyAgLyogZml4bWU6IHdlJ3ZlIGdvdCB0aGUgcGF0aCBub3cgZG8gc29tZXRoaW5nIHdpdGggaXQKKwkgIC1saWtlIGdldCB0aGUgZmlsZXR5cGUqLworCQorCXBkd1R5cGU9TlVMTDsKKwkKKyAgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwwLGxwc3pGb2xkZXIpOworICBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLDAsbHBzelZhbHVlTmFtZSk7CisgIHJldHVybiBUUlVFOworfQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgUGlkbE1ncl9HZXREYXRhVGV4dCgpCisgKi8KK0RXT1JEIFBpZGxNZ3JfR2V0RGF0YVRleHQoIExQUElETE1HUiB0aGlzLAorIExQQ0lURU1JRExJU1QgcGlkbFBhdGgsIExQQ0lURU1JRExJU1QgcGlkbFZhbHVlLCBMUFNUUiBscHN6T3V0LCBEV09SRCBkd091dFNpemUpCit7IExQU1RSICAgIGxwc3pGb2xkZXIsCisgICAgICAgICAgIGxwc3pWYWx1ZU5hbWU7CisgIERXT1JEICAgIGR3TmFtZVNpemU7CisKKyAgRklYTUUocGlkbCwiKCVwKS0+KHBpZGw9JXAgcGlkbD0lcCkgc3R1YlxuIix0aGlzLHBpZGxQYXRoLHBpZGxWYWx1ZSk7CisKKyAgaWYoIWxwc3pPdXQgfHwgIXBpZGxQYXRoIHx8ICFwaWRsVmFsdWUpCisgIHsgcmV0dXJuIEZBTFNFOworCX0KKworICAvKiBmaXhtZTogZ2V0IHRoZSBkcml2ZWxldHRlciovCisKKyAgLy9hc3NlbWJsZSB0aGUgRm9sZGVyIHN0cmluZworICBkd05hbWVTaXplID0gUGlkbE1ncl9HZXRGb2xkZXJUZXh0KHRoaXMscGlkbFBhdGgsIE5VTEwsIDApOworICBscHN6Rm9sZGVyID0gKExQU1RSKUhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLDAsZHdOYW1lU2l6ZSk7CisgIGlmKCFscHN6Rm9sZGVyKQorICB7ICByZXR1cm4gRkFMU0U7CisJfQorICBQaWRsTWdyX0dldEZvbGRlclRleHQodGhpcyxwaWRsUGF0aCwgbHBzekZvbGRlciwgZHdOYW1lU2l6ZSk7CisKKyAgLy9hc3NlbWJsZSB0aGUgdmFsdWUgbmFtZQorICBkd05hbWVTaXplID0gUGlkbE1ncl9HZXRWYWx1ZVRleHQodGhpcyxwaWRsVmFsdWUsIE5VTEwsIDApOworICBscHN6VmFsdWVOYW1lID0gKExQU1RSKUhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLDAsZHdOYW1lU2l6ZSk7CisgIGlmKCFscHN6VmFsdWVOYW1lKQorICB7IEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksMCxscHN6Rm9sZGVyKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgUGlkbE1ncl9HZXRWYWx1ZVRleHQodGhpcyxwaWRsVmFsdWUsIGxwc3pWYWx1ZU5hbWUsIGR3TmFtZVNpemUpOworCisgIC8qIGZpeG1lOiB3ZSd2ZSBnb3QgdGhlIHBhdGggbm93IGRvIHNvbWV0aGluZyB3aXRoIGl0Ki8KKwkKKyAgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwwLGxwc3pGb2xkZXIpOworICBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLDAsbHBzelZhbHVlTmFtZSk7CisKKyAgVFJBQ0UocGlkbCwiLS0gKCVwKS0+KCVwPSVzIDB4JTA4bHgpXG4iLHRoaXMsbHBzek91dCxscHN6T3V0LGR3T3V0U2l6ZSk7CisKKwlyZXR1cm4gVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgIENQaWRsTWdyOjpHZXRQaWRsUGF0aCgpCisgKiAgQ3JlYXRlIGEgc3RyaW5nIHRoYXQgaW5jbHVkZXMgdGhlIERyaXZlIG5hbWUsIHRoZSBmb2xkZXIgdGV4dCBhbmQgCisgKiAgdGhlIHZhbHVlIHRleHQuCisgKi8KK0RXT1JEIFBpZGxNZ3JfR2V0UGlkbFBhdGgoTFBQSURMTUdSIHRoaXMsCisgICAgTFBDSVRFTUlETElTVCBwaWRsLCBMUFNUUiBscHN6T3V0LCBEV09SRCBkd091dFNpemUpCit7IExQU1RSIGxwc3pUZW1wOworICBXT1JECWxlbjsKKworICBUUkFDRShwaWRsLCIoJXApLT4oJXAsJWx1KVxuIix0aGlzLGxwc3pPdXQsZHdPdXRTaXplKTsKKworICBpZighbHBzek91dCkKKyAgeyByZXR1cm4gMDsKKwl9CisKKyAgKmxwc3pPdXQgPSAwOworICBscHN6VGVtcCA9IGxwc3pPdXQ7CisKKyAgZHdPdXRTaXplIC09IFBpZGxNZ3JfR2V0Rm9sZGVyVGV4dCh0aGlzLHBpZGwsIGxwc3pUZW1wLCBkd091dFNpemUpOworCisgIC8vYWRkIGEgYmFja3NsYXNoIGlmIG5lY2Vzc2FyeQorICBsZW4gPSBzdHJsZW4obHBzelRlbXApOworICBpZiAobGVuICYmIGxwc3pUZW1wW2xlbi0xXSE9J1xcJykKKwl7IGxwc3pUZW1wW2xlbiswXT0nXFwnOworICAgIGxwc3pUZW1wW2xlbisxXT0nXDAnOworCQlkd091dFNpemUtLTsKKyAgfQorCisgIGxwc3pUZW1wID0gbHBzek91dCArIHN0cmxlbihscHN6T3V0KTsKKworICAvL2FkZCB0aGUgdmFsdWUgc3RyaW5nCisgIFBpZGxNZ3JfR2V0VmFsdWVUZXh0KHRoaXMscGlkbCwgbHBzelRlbXAsIGR3T3V0U2l6ZSk7CisKKyAgLy9yZW1vdmUgdGhlIGxhc3QgYmFja3NsYXNoIGlmIG5lY2Vzc2FyeQorICBpZigqKGxwc3pPdXQgKyBzdHJsZW4obHBzek91dCkgLSAxKSA9PSAnXFwnKQorICB7ICoobHBzek91dCArIHN0cmxlbihscHN6T3V0KSAtIDEpID0gMDsKKyAgfQorCisgIFRSQUNFKHBpZGwsIi0tICglcCktPiglcD0lcywlbHUpXG4iLHRoaXMsbHBzek91dCxscHN6T3V0LGR3T3V0U2l6ZSk7CisKKyAgcmV0dXJuIHN0cmxlbihscHN6T3V0KTsKKworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBQaWRsTWdyX0NyZWF0ZSgpCisgKiAgQ3JlYXRlcyBhIG5ldyBQSURMCisgKiAgdHlwZSA9IFBUX0RFU0tUT1AgfCBQVF9EUklWRSB8IFBUX0ZPTERFUiB8IFBUX1ZBTFVFCisgKiAgcEluID0gZGF0YQorICogIHVJblNpemUgPSBzaXplIG9mIGRhdGEKKyAqLworCitMUElURU1JRExJU1QgUGlkbE1ncl9DcmVhdGUoTFBQSURMTUdSIHRoaXMsUElETFRZUEUgdHlwZSwgTFBWT0lEIHBJbiwgVUlOVDE2IHVJblNpemUpCit7IExQSVRFTUlETElTVCAgIHBpZGxPdXQ9TlVMTDsKKyAgVUlOVDE2ICAgICAgICAgdVNpemU7CisgIExQSVRFTUlETElTVCAgIHBpZGxUZW1wPU5VTEw7CisgIExQUElETERBVEEgICAgIHBEYXRhOworCisgIFRSQUNFKHBpZGwsIiglcCktPigleCAlcCAleClcbiIsdGhpcyx0eXBlLHBJbix1SW5TaXplKTsKKworICBpZiAoIHR5cGUgPT0gUFRfREVTS1RPUCkKKyAgeyAgIHBpZGxPdXQgPSBTSEFsbG9jKDIpOworICAgICAgcGlkbE91dC0+bWtpZC5jYj0weDAwMDA7CisgICAgICByZXR1cm4gcGlkbE91dDsKKwl9CisKKyAgaWYgKCEgcEluKQorCXsgcmV0dXJuIE5VTEw7CisJfQkKKworICB1U2l6ZSA9IDIgKyAoc2l6ZW9mKFBJRExUWVBFKSkgKyB1SW5TaXplICsgMjsgIC8qIGNiICsgUElETFRZUEUgKyB1SW5TaXplICsyICovCisgIHBpZGxPdXQgPSBTSEFsbG9jKHVTaXplKTsKKyAgcGlkbFRlbXAgPSBwaWRsT3V0OworICBpZihwaWRsT3V0KQorICB7IHBpZGxUZW1wLT5ta2lkLmNiID0gdVNpemUgLSAyOworICAgIHBEYXRhID0oTFBQSURMREFUQSkgJihwaWRsVGVtcC0+bWtpZC5hYklEWzBdKTsKKyAgICBwRGF0YS0+dHlwZSA9IHR5cGU7CisgICAgc3dpdGNoKHR5cGUpCisgICAgeyBjYXNlIFBUX01ZQ09NUDoKKyAgICAgICAgbWVtY3B5KHBEYXRhLT5zelRleHQsIHBJbiwgdUluU2l6ZSk7CisgICAgICAgICAgICAgICAgICAgICAgIFRSQUNFKHBpZGwsIi0gKCVwKS0+Y3JlYXRlIE15IENvbXB1dGVyOiAlc1xuIix0aGlzLGRlYnVnc3RyX2EocERhdGEtPnN6VGV4dCkpOworICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgUFRfRFJJVkU6CisgICAgICAgIG1lbWNweShwRGF0YS0+c3pUZXh0LCBwSW4sIHVJblNpemUpOworICAgICAgICAgICAgICAgICAgICAgICBUUkFDRShwaWRsLCItICglcCktPmNyZWF0ZSBEcml2ZTogJXNcbiIsdGhpcyxkZWJ1Z3N0cl9hKHBEYXRhLT5zelRleHQpKTsKKwkJCQkJCQkJCQkJIGJyZWFrOworICAgICAgY2FzZSBQVF9GT0xERVI6CisgICAgICBjYXNlIFBUX1ZBTFVFOiAgIAorICAgICAgICBtZW1jcHkocERhdGEtPnN6VGV4dCwgcEluLCB1SW5TaXplKTsKKyAgICAgICAgICAgICAgICAgICAgICAgVFJBQ0UocGlkbCwiLSAoJXApLT5jcmVhdGUgVmFsdWU6ICVzXG4iLHRoaXMsZGVidWdzdHJfYShwRGF0YS0+c3pUZXh0KSk7CisJCQkJCQkJCQkJCSBicmVhazsKKyAgICAgIGRlZmF1bHQ6IAorICAgICAgICBGSVhNRShwaWRsLCItICglcCkgd3JvbmcgYXJndW1lbnRcbiIsdGhpcyk7CisJCQkgICAgICAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgIAorICAgIHBpZGxUZW1wID0gSUxHZXROZXh0KHBpZGxUZW1wKTsKKyAgcGlkbFRlbXAtPm1raWQuY2IgPSAweDAwOworICB9CisgIFRSQUNFKHBpZGwsIi0tICglcCktPihwaWRsPSVwLCBzaXplPSV1KVxuIix0aGlzLHBpZGxPdXQsdVNpemUtMik7CisgIHJldHVybiBwaWRsT3V0OworfQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgUGlkbE1ncl9HZXREYXRhKFBJRExUWVBFLCBMUENJVEVNSURMSVNULCBMUFZPSUQsIFVJTlQxNikKKyAqLworRFdPUkQgUGlkbE1ncl9HZXREYXRhKAorICAgIExQUElETE1HUiB0aGlzLAorCQlQSURMVFlQRSB0eXBlLCAKKyAgICBMUENJVEVNSURMSVNUIHBpZGwsCisJCUxQVk9JRCBwT3V0LAorCQlVSU5UMTYgdU91dFNpemUpCit7IExQUElETERBVEEgIHBEYXRhOworICBEV09SRCAgICAgICBkd1JldHVybj0wOyAKKworCVRSQUNFKHBpZGwsIiglcCktPigleCAlcCAlcCAleClcbiIsdGhpcyx0eXBlLHBpZGwscE91dCx1T3V0U2l6ZSk7CisJCisgIGlmKCFwaWRsKQorICB7ICByZXR1cm4gMDsKKwl9CisKKyAgcERhdGEgPSBQaWRsTWdyX0dldERhdGFQb2ludGVyKHRoaXMscGlkbCk7CisKKyAgLy9jb3B5IHRoZSBkYXRhCisgIHN3aXRjaCh0eXBlKQorICB7IGNhc2UgUFRfTVlDT01QOiAgaWYodU91dFNpemUgPCAxKQorICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgICAgICAgICAgIGlmKFBUX01ZQ09NUCAhPSBwRGF0YS0+dHlwZSkKKyAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisJCQkJCQkJCQkJICooTFBTVFIpcE91dCA9IDA7CSAKKyAgICAgICAgICAgICAgICAgICAgIHN0cm5jcHkoKExQU1RSKXBPdXQsICJNeSBDb21wdXRlciIsIHVPdXRTaXplKTsKKwkJCQkJCQkJCQkgZHdSZXR1cm4gPSBzdHJsZW4oKExQU1RSKXBPdXQpOworICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKwkgY2FzZSBQVF9EUklWRTogICAgaWYodU91dFNpemUgPCAxKQorICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgICAgICAgICAgIGlmKFBUX0RSSVZFICE9IHBEYXRhLT50eXBlKQorICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKwkJCQkJCQkJCQkgKihMUFNUUilwT3V0ID0gMDsJIAorICAgICAgICAgICAgICAgICAgICAgc3RybmNweSgoTFBTVFIpcE91dCwgcERhdGEtPnN6VGV4dCwgdU91dFNpemUpOworCQkJCQkJCQkJCSBkd1JldHVybiA9IHN0cmxlbigoTFBTVFIpcE91dCk7CisgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgY2FzZSBQVF9GT0xERVI6CisgICBjYXNlIFBUX1ZBTFVFOiAKKwkgY2FzZSBQVF9URVhUOiAgICAgKihMUFNUUilwT3V0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgIHN0cm5jcHkoKExQU1RSKXBPdXQsIHBEYXRhLT5zelRleHQsIHVPdXRTaXplKTsKKyAgICAgICAgICAgICAgICAgICAgIGR3UmV0dXJuID0gc3RybGVuKChMUFNUUilwT3V0KTsKKyAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgZGVmYXVsdDogICAgIGJyZWFrOwkJCQkJCQkJCQkgCisgIH0KKwlUUkFDRShwaWRsLCItLSAoJXApLT4oJXA9JXMgMHglMDhseClcbiIsdGhpcyxwT3V0LChjaGFyKilwT3V0LGR3UmV0dXJuKTsKKyAgcmV0dXJuIGR3UmV0dXJuOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIFBpZGxNZ3JfR2V0RGF0YVBvaW50ZXIoKQorICovCitMUFBJRExEQVRBIFBpZGxNZ3JfR2V0RGF0YVBvaW50ZXIoTFBQSURMTUdSIHRoaXMsTFBJVEVNSURMSVNUIHBpZGwpCit7IGlmKCFwaWRsKQorICB7ICByZXR1cm4gTlVMTDsKKwl9CisJVFJBQ0UocGlkbCwiKCVwKS0+KCVwKVxuIgksdGhpcywgcGlkbCk7CisgIHJldHVybiAoTFBQSURMREFUQSkocGlkbC0+bWtpZC5hYklEKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgQ1BpZGxNZ3JfU2VwYXJhdGVQYXRoQW5kVmFsdWUpCisgKiAgQ3JlYXRlcyBhIHNlcGFyYXRlIHBhdGggYW5kIHZhbHVlIFBJREwgZnJvbSBhIGZ1bGx5IHF1YWxpZmllZCBQSURMLgorICovCitCT09MMzIgUGlkbE1ncl9TZXBhcmF0ZVBhdGhBbmRWYWx1ZShMUFBJRExNR1IgdGhpcywgCisgICBMUElURU1JRExJU1QgcGlkbEZRLCBMUElURU1JRExJU1QgKnBwaWRsUGF0aCwgTFBJVEVNSURMSVNUICpwcGlkbFZhbHVlKQoreyBMUElURU1JRExJU1QgICBwaWRsVGVtcDsKKwlUUkFDRShwaWRsLCIoJXApLT4ocGlkbD0lcCBwaWRsPSVwIHBpZGw9JXApIix0aGlzLHBpZGxGUSxwcGlkbFBhdGgscHBpZGxWYWx1ZSk7CisgIGlmKCFwaWRsRlEpCisgIHsgIHJldHVybiBGQUxTRTsKKwl9CisKKyAgKnBwaWRsVmFsdWUgPSBQaWRsTWdyX0dldExhc3RJdGVtKHRoaXMscGlkbEZRKTsKKworICBpZighUGlkbE1ncl9Jc1ZhbHVlKHRoaXMsKnBwaWRsVmFsdWUpKQorICB7IHJldHVybiBGQUxTRTsKKwl9CisKKyAgKnBwaWRsVmFsdWUgPSBJTENsb25lKCpwcGlkbFZhbHVlKTsKKyAgKnBwaWRsUGF0aCA9IElMQ2xvbmUocGlkbEZRKTsKKworICBwaWRsVGVtcCA9IFBpZGxNZ3JfR2V0TGFzdEl0ZW0odGhpcywqcHBpZGxQYXRoKTsKKyAgcGlkbFRlbXAtPm1raWQuY2IgPSAweDAwOworCisgIHJldHVybiBUUlVFOworfQpkaWZmIC0tZ2l0IGEvZGxscy9zaGVsbDMyL3BpZGwuaCBiL2RsbHMvc2hlbGwzMi9waWRsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDgxN2I1MwotLS0gL2Rldi9udWxsCisrKyBiL2RsbHMvc2hlbGwzMi9waWRsLmgKQEAgLTAsMCArMSwzMSBAQAorLyoJICBJTlRFUk5BTCBDTEFTUyBwaWRsbWdyICovCisKKyNpZm5kZWYgX19XSU5FX1BJRExfSAorI2RlZmluZSBfX1dJTkVfUElETF9ICisKK2V4dGVybiBMUElURU1JRExJU1QgUGlkbE1ncl9DcmVhdGVEZXNrdG9wKExQUElETE1HUik7CitleHRlcm4gTFBJVEVNSURMSVNUIFBpZGxNZ3JfQ3JlYXRlTXlDb21wdXRlcihMUFBJRExNR1IpOworZXh0ZXJuIExQSVRFTUlETElTVCBQaWRsTWdyX0NyZWF0ZURyaXZlKExQUElETE1HUixMUENTVFIpOworZXh0ZXJuIExQSVRFTUlETElTVCBQaWRsTWdyX0NyZWF0ZUZvbGRlcihMUFBJRExNR1IsTFBDU1RSKTsKK2V4dGVybiBMUElURU1JRExJU1QgUGlkbE1ncl9DcmVhdGVWYWx1ZShMUFBJRExNR1IsTFBDU1RSKTsKK2V4dGVybiBCT09MMzIgUGlkbE1ncl9HZXREZXNrdG9wKExQUElETE1HUixMUENJVEVNSURMSVNULExQU1RSKTsKK2V4dGVybiBCT09MMzIgUGlkbE1ncl9HZXREcml2ZShMUFBJRExNR1IsTFBDSVRFTUlETElTVCxMUFNUUixVSU5UMTYpOworZXh0ZXJuIExQSVRFTUlETElTVCBQaWRsTWdyX0dldExhc3RJdGVtKExQUElETE1HUixMUENJVEVNSURMSVNUKTsKK2V4dGVybiBEV09SRCBQaWRsTWdyX0dldEl0ZW1UZXh0KExQUElETE1HUixMUENJVEVNSURMSVNULExQU1RSLFVJTlQxNik7CitleHRlcm4gQk9PTDMyIFBpZGxNZ3JfSXNEZXNrdG9wKExQUElETE1HUixMUENJVEVNSURMSVNUKTsKK2V4dGVybiBCT09MMzIgUGlkbE1ncl9Jc015Q29tcHV0ZXIoTFBQSURMTUdSLExQQ0lURU1JRExJU1QpOworZXh0ZXJuIEJPT0wzMiBQaWRsTWdyX0lzRHJpdmUoTFBQSURMTUdSLExQQ0lURU1JRExJU1QpOworZXh0ZXJuIEJPT0wzMiBQaWRsTWdyX0lzRm9sZGVyKExQUElETE1HUixMUENJVEVNSURMSVNUKTsKK2V4dGVybiBCT09MMzIgUGlkbE1ncl9Jc1ZhbHVlKExQUElETE1HUixMUENJVEVNSURMSVNUKTsKK2V4dGVybiBCT09MMzIgUGlkbE1ncl9IYXNGb2xkZXJzKExQUElETE1HUixMUFNUUixMUENJVEVNSURMSVNUKTsKK2V4dGVybiBEV09SRCBQaWRsTWdyX0dldEZvbGRlclRleHQoTFBQSURMTUdSLExQQ0lURU1JRExJU1QsTFBTVFIsRFdPUkQpOworZXh0ZXJuIERXT1JEIFBpZGxNZ3JfR2V0VmFsdWVUZXh0KExQUElETE1HUixMUENJVEVNSURMSVNULExQU1RSLERXT1JEKTsKK2V4dGVybiBCT09MMzIgUGlkbE1ncl9HZXRWYWx1ZVR5cGUoTFBQSURMTUdSLExQQ0lURU1JRExJU1QsTFBDSVRFTUlETElTVCxMUERXT1JEKTsKK2V4dGVybiBEV09SRCBQaWRsTWdyX0dldERhdGFUZXh0KExQUElETE1HUixMUENJVEVNSURMSVNULExQQ0lURU1JRExJU1QsTFBTVFIsRFdPUkQpOworZXh0ZXJuIERXT1JEIFBpZGxNZ3JfR2V0UGlkbFBhdGgoTFBQSURMTUdSLExQQ0lURU1JRExJU1QsTFBTVFIsRFdPUkQpOworZXh0ZXJuIExQSVRFTUlETElTVCBQaWRsTWdyX0NyZWF0ZShMUFBJRExNR1IsUElETFRZUEUsTFBWT0lELFVJTlQxNik7CitleHRlcm4gRFdPUkQgUGlkbE1ncl9HZXREYXRhKExQUElETE1HUixQSURMVFlQRSxMUENJVEVNSURMSVNULExQVk9JRCxVSU5UMTYpOworZXh0ZXJuIExQUElETERBVEEgUGlkbE1ncl9HZXREYXRhUG9pbnRlcihMUFBJRExNR1IsTFBDSVRFTUlETElTVCk7CitleHRlcm4gQk9PTDMyIFBpZGxNZ3JfU2VwYXJhdGVQYXRoQW5kVmFsdWUoTFBQSURMTUdSLExQSVRFTUlETElTVCxMUElURU1JRExJU1QqLExQSVRFTUlETElTVCopOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RsbHMvc2hlbGwzMi9zaGVsbDMyX21haW4uYyBiL2RsbHMvc2hlbGwzMi9zaGVsbDMyX21haW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYTM0OGY4Ci0tLSAvZGV2L251bGwKKysrIGIvZGxscy9zaGVsbDMyL3NoZWxsMzJfbWFpbi5jCkBAIC0wLDAgKzEsOTYyIEBACisvKgorICogCQkJCVNoZWxsIGJhc2ljcworICoKKyAqICAxOTk4IE1hcmN1cyBNZWlzc25lcgorICogIDE5OTggSnVlcmdlbiBTY2htaWVkIChqc2NoKSAgKiAgPGp1ZXJnZW4uc2NobWllZEBtZXRyb25ldC5kZT4KKyAqLworI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSAid2luZG93cy5oIgorI2luY2x1ZGUgIndpbmVycm9yLmgiCisjaW5jbHVkZSAiZmlsZS5oIgorI2luY2x1ZGUgInNoZWxsLmgiCisjaW5jbHVkZSAiaGVhcC5oIgorI2luY2x1ZGUgIm1vZHVsZS5oIgorI2luY2x1ZGUgIm5lZXhlLmgiCisjaW5jbHVkZSAicmVzb3VyY2UuaCIKKyNpbmNsdWRlICJkbGdzLmgiCisjaW5jbHVkZSAid2luLmgiCisjaW5jbHVkZSAiZ3JhcGhpY3MuaCIKKyNpbmNsdWRlICJjdXJzb3JpY29uLmgiCisjaW5jbHVkZSAiaW50ZXJmYWNlcy5oIgorI2luY2x1ZGUgInN5c21ldHJpY3MuaCIKKyNpbmNsdWRlICJzaGxvYmouaCIKKyNpbmNsdWRlICJkZWJ1Zy5oIgorI2luY2x1ZGUgIndpbnJlZy5oIgorI2luY2x1ZGUgImltYWdlbGlzdC5oIgorI2luY2x1ZGUgImNvbW1jdHJsLmgiCisjaW5jbHVkZSAiYXV0aG9ycy5oIgorCisjaW5jbHVkZSAic2hlbGwzMl9tYWluLmgiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgkJCQlDb21tYW5kTGluZVRvQXJndlcJW1NIRUxMMzIuN10KKyAqLworTFBXU1RSKiBXSU5BUEkgQ29tbWFuZExpbmVUb0FyZ3ZXKExQV1NUUiBjbWRsaW5lLExQRFdPUkQgbnVtYXJncykKK3sgTFBXU1RSICAqYXJndixzLHQ7CisJaW50CWk7CisgIFRSQUNFKHNoZWxsLCJcbiIpOworCisgICAgICAgIC8qIHRvIGdldCB3cml0ZWFibGUgY29weSAqLworCWNtZGxpbmUgPSBIRUFQX3N0cmR1cFcoIEdldFByb2Nlc3NIZWFwKCksIDAsIGNtZGxpbmUpOworCXM9Y21kbGluZTtpPTA7CisgIHdoaWxlICgqcykKKyAgeyAvKiBzcGFjZSAqLworICAgIGlmICgqcz09MHgwMDIwKSAKKyAgICB7IGkrKzsKKwkJCXMrKzsKKwkJCXdoaWxlICgqcyAmJiAqcz09MHgwMDIwKQorCQkJCXMrKzsKKwkJCWNvbnRpbnVlOworCQl9CisJCXMrKzsKKwl9CisJYXJndj0oTFBXU1RSKilIZWFwQWxsb2MoIEdldFByb2Nlc3NIZWFwKCksIDAsIHNpemVvZihMUFdTVFIpKihpKzEpICk7CisJcz10PWNtZGxpbmU7CisJaT0wOworICB3aGlsZSAoKnMpCisgIHsgaWYgKCpzPT0weDAwMjApCisgICAgeyAqcz0wOworCQkJYXJndltpKytdPUhFQVBfc3RyZHVwVyggR2V0UHJvY2Vzc0hlYXAoKSwgMCwgdCApOworCQkJKnM9MHgwMDIwOworCQkJd2hpbGUgKCpzICYmICpzPT0weDAwMjApCisJCQkJcysrOworCQkJaWYgKCpzKQorCQkJCXQ9cysxOworCQkJZWxzZQorCQkJCXQ9czsKKwkJCWNvbnRpbnVlOworCQl9CisJCXMrKzsKKwl9CisJaWYgKCp0KQorCQlhcmd2W2krK109KExQV1NUUilIRUFQX3N0cmR1cFcoIEdldFByb2Nlc3NIZWFwKCksIDAsIHQgKTsKKwlIZWFwRnJlZSggR2V0UHJvY2Vzc0hlYXAoKSwgMCwgY21kbGluZSApOworCWFyZ3ZbaV09TlVMTDsKKwkqbnVtYXJncz1pOworCXJldHVybiBhcmd2OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJCQkJQ29udHJvbF9SdW5ETEwJCVtTSEVMTDMyLjEyXQorICoKKyAqIFdpbGQgc3BlY3VsYXRpb24gaW4gdGhlIGZvbGxvd2luZyEKKyAqCisgKiBodHRwOi8vcHJlbWl1bS5taWNyb3NvZnQuY29tL21zZG4vbGlicmFyeS90ZWNoYXJ0L21zZG4xOTMuaHRtCisgKi8KKwordm9pZCBXSU5BUEkgQ29udHJvbF9SdW5ETEwgKEhXTkQzMiBod25kLCBMUENWT0lEIGNvZGUsIExQQ1NUUiBjbWQsIERXT1JEIGFyZzQpCit7IEZJWE1FKHNoZWxsLCAiKCUwOHgsICVwLCBcIiVzXCIsICUwOGx4KVxuIiwKKwlod25kLCBjb2RlID8gY29kZSA6ICIobnVsbCkiLCBjbWQgPyBjbWQgOiAiKG51bGwpIiwgYXJnNCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBTaGVsbF9HZXRJbWFnZUxpc3QgW1NIRUxMMzIuNzFdCisgKgorICogUEFSQU1FVEVSUworICogIGltZ2xpc3RbMXwyXSBbT1VUXSBwb2ludGVyIHdoaWNoIHJlY2l2ZSBpbWFnZWxpc3QgaGFuZGxlcworICoKKyAqIE5PVEVTCisgKiAgdW5kb2N1bWVudGVkCisgKiAgSSBkb24ndCBrbm93LCB3aGljaCBwb2ludGVyIGlzIHdoaWNoLiBUaGV5IG1heSBoYXZlIHRvIGJlCisgKiAgZXhjaGFuZ2VkLiAoanNjaCkKKyAqLworQk9PTDMyIFdJTkFQSSBTaGVsbF9HZXRJbWFnZUxpc3QoSElNQUdFTElTVCAqIGltZ2xpc3QxLEhJTUFHRUxJU1QgKiBpbWdsaXN0MikKK3sJV0FSTihzaGVsbCwiKCVwLCVwKTpzZW1pLXN0dWIuXG4iLGltZ2xpc3QxLGltZ2xpc3QyKTsKKwlpZiAoaW1nbGlzdDEpCisJeyAqaW1nbGlzdDE9U2hlbGxCaWdJY29uTGlzdDsKKyAgICB9CisgICAgaWYgKGltZ2xpc3QyKQorICAgIHsgKmltZ2xpc3QyPVNoZWxsU21hbGxJY29uTGlzdDsKKyAgICB9CisKKwlyZXR1cm4gVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCQkJCVNIR2V0RmlsZUluZm9BCQlbU0hFTEwzMi4yMThdCisgKgorICogRklYTUUKKyAqICAgCisgKi8KK0hJTUFHRUxJU1QgU2hlbGxTbWFsbEljb25MaXN0ID0gMDsKK0hJTUFHRUxJU1QgU2hlbGxCaWdJY29uTGlzdCA9IDA7CisKK0RXT1JEIFdJTkFQSSBTSEdldEZpbGVJbmZvMzJBKExQQ1NUUiBwYXRoLERXT1JEIGR3RmlsZUF0dHJpYnV0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTSEZJTEVJTkZPMzJBICpwc2ZpLCBVSU5UMzIgc2l6ZW9mcHNmaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQzMiBmbGFncyApCit7IENIQVIgc3pUZW1wW01BWF9QQVRIXTsKKyAgRFdPUkQgcmV0PTA7CisgIAorICBUUkFDRShzaGVsbCwiKCVzLDB4JWx4LCVwLDB4JXgsMHgleClcbiIsCisJICAgICAgcGF0aCxkd0ZpbGVBdHRyaWJ1dGVzLHBzZmksc2l6ZW9mcHNmaSxmbGFncyk7CisKKyAgLyogdHJhbnNsYXRlIHRoZSBwaWRsIHRvIGEgcGF0aCovCisgIGlmIChmbGFncyAmIFNIR0ZJX1BJREwpCisgIHsgU0hHZXRQYXRoRnJvbUlETGlzdDMyQSAoKExQQ0lURU1JRExJU1QpcGF0aCxzelRlbXApOworICAgIFRSQUNFKHNoZWxsLCJwaWRsPSVwIGlzICVzXG4iLHBhdGgsc3pUZW1wKTsKKyAgfQorICBlbHNlCisgIHsgVFJBQ0Uoc2hlbGwsInBhdGg9JXBcbiIscGF0aCk7CisgIH0KKworICBpZiAoZmxhZ3MgJiBTSEdGSV9BVFRSSUJVVEVTKQorICB7IEZJWE1FKHNoZWxsLCJmaWxlIGF0dHJpYnV0ZXMsIHN0dWJcbiIpOworICAgIHBzZmktPmR3QXR0cmlidXRlcz1TRkdBT19GSUxFU1lTVEVNOworICAgIHJldD1UUlVFOyAgICAKKyAgfQorCisgIGlmIChmbGFncyAmIFNIR0ZJX0RJU1BMQVlOQU1FKQorICB7IGlmIChmbGFncyAmIFNIR0ZJX1BJREwpCisgICAgeyBzdHJjcHkocHNmaS0+c3pEaXNwbGF5TmFtZSxzelRlbXApOworICAgIH0KKyAgICBlbHNlCisgICAgeyBzdHJjcHkocHNmaS0+c3pEaXNwbGF5TmFtZSxwYXRoKTsKKyAgICAgIFRSQUNFKHNoZWxsLCJkaXNwbGF5bmFtZT0lc1xuIiwgc3pUZW1wKTsKKyAgICB9CisgICAgcmV0PVRSVUU7CisgIH0KKyAgCisgIGlmIChmbGFncyAmIFNIR0ZJX1RZUEVOQU1FKQorICB7IEZJWE1FKHNoZWxsLCJnZXQgdGhlIGZpbGUgdHlwZSwgc3R1YlxuIik7CisgICAgc3RyY3B5KHBzZmktPnN6VHlwZU5hbWUsIiIpOworICAgIHJldD1UUlVFOworICB9CisgIAorICBpZiAoZmxhZ3MgJiBTSEdGSV9JQ09OTE9DQVRJT04pCisgIHsgRklYTUUoc2hlbGwsImxvY2F0aW9uIG9mIGljb24sIHN0dWJcbiIpOworICAgIHN0cmNweShwc2ZpLT5zekRpc3BsYXlOYW1lLCIiKTsKKyAgICByZXQ9VFJVRTsKKyAgfQorCisgIGlmIChmbGFncyAmIFNIR0ZJX0VYRVRZUEUpCisgICAgRklYTUUoc2hlbGwsInR5cGUgb2YgZXhlY3V0YWJsZSwgc3R1YlxuIik7CisKKyAgaWYgKGZsYWdzICYgU0hHRklfTElOS09WRVJMQVkpCisgICAgRklYTUUoc2hlbGwsInNldCBpY29uIHRvIGxpbmssIHN0dWJcbiIpOworCisgIGlmIChmbGFncyAmIFNIR0ZJX09QRU5JQ09OKQorICAgIEZJWE1FKHNoZWxsLCJzZXQgdG8gb3BlbiBpY29uLCBzdHViXG4iKTsKKworICBpZiAoZmxhZ3MgJiBTSEdGSV9TRUxFQ1RFRCkKKyAgICBGSVhNRShzaGVsbCwic2V0IGljb24gdG8gc2VsZWN0ZWQsIHN0dWJcbiIpOworCisgIGlmIChmbGFncyAmIFNIR0ZJX1NIRUxMSUNPTlNJWkUpCisgICAgRklYTUUoc2hlbGwsInNldCBpY29uIHRvIHNoZWxsIHNpemUsIHN0dWJcbiIpOworCisgIGlmIChmbGFncyAmIFNIR0ZJX1VTRUZJTEVBVFRSSUJVVEVTKQorICAgIEZJWE1FKHNoZWxsLCJ1c2UgdGhlIGR3RmlsZUF0dHJpYnV0ZXMsIHN0dWJcbiIpOworIAorICBpZiAoZmxhZ3MgJiBTSEdGSV9JQ09OKQorICB7IEZJWE1FKHNoZWxsLCJpY29uIGhhbmRsZVxuIik7CisgICAgaWYgKGZsYWdzICYgU0hHRklfU01BTExJQ09OKQorICAgICB7IFRSQUNFKHNoZWxsLCJzZXQgdG8gc21hbGwgaWNvblxuIik7IAorICAgICAgIHBzZmktPmhJY29uPXBJbWFnZUxpc3RfR2V0SWNvbihTaGVsbFNtYWxsSWNvbkxpc3QsMzIsSUxEX05PUk1BTCk7CisgICAgICAgcmV0ID0gKERXT1JEKSBTaGVsbFNtYWxsSWNvbkxpc3Q7CisgICAgIH0KKyAgICAgZWxzZQorICAgICB7IFRSQUNFKHNoZWxsLCJzZXQgdG8gYmlnIGljb25cbiIpOworICAgICAgIHBzZmktPmhJY29uPXBJbWFnZUxpc3RfR2V0SWNvbihTaGVsbEJpZ0ljb25MaXN0LDMyLElMRF9OT1JNQUwpOworICAgICAgIHJldCA9IChEV09SRCkgU2hlbGxCaWdJY29uTGlzdDsKKyAgICAgfSAgICAgIAorICB9CisKKyAgaWYgKGZsYWdzICYgU0hHRklfU1lTSUNPTklOREVYKQorICB7ICBGSVhNRShzaGVsbCwiZ2V0IHRoZSBTWVNJQ09OSU5ERVhcbiIpOworICAgICBwc2ZpLT5pSWNvbj0zMjsKKyAgICAgaWYgKGZsYWdzICYgU0hHRklfU01BTExJQ09OKQorICAgICB7IFRSQUNFKHNoZWxsLCJzZXQgdG8gc21hbGwgaWNvblxuIik7IAorICAgICAgIHJldCA9IChEV09SRCkgU2hlbGxTbWFsbEljb25MaXN0OworICAgICB9CisgICAgIGVsc2UgICAgICAgIAorICAgICB7IFRSQUNFKHNoZWxsLCJzZXQgdG8gYmlnIGljb25cbiIpOworICAgICAgIHJldCA9IChEV09SRCkgU2hlbGxCaWdJY29uTGlzdDsKKyAgICAgfQorICB9CisKKyAKKyAgcmV0dXJuIHJldDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgIEV4dHJhY3RJY29uMzJBICAgKFNIRUxMMzIuMTMzKQorICovCitISUNPTjMyIFdJTkFQSSBFeHRyYWN0SWNvbjMyQSggSElOU1RBTkNFMzIgaEluc3RhbmNlLCBMUENTVFIgbHBzekV4ZUZpbGVOYW1lLAorCVVJTlQzMiBuSWNvbkluZGV4ICkKK3sgICBIR0xPQkFMMTYgaGFuZGxlID0gSW50ZXJuYWxFeHRyYWN0SWNvbihoSW5zdGFuY2UsbHBzekV4ZUZpbGVOYW1lLG5JY29uSW5kZXgsIDEpOworICAgIFRSQUNFKHNoZWxsLCJcbiIpOworICAgIGlmKCBoYW5kbGUgKQorICAgIHsKKwlISUNPTjE2KiBwdHIgPSAoSElDT04xNiopR2xvYmFsTG9jazE2KGhhbmRsZSk7CisJSElDT04xNiAgaEljb24gPSAqcHRyOworCisJR2xvYmFsRnJlZTE2KGhhbmRsZSk7CisJcmV0dXJuIGhJY29uOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgIEV4dHJhY3RJY29uMzJXICAgKFNIRUxMMzIuMTgwKQorICovCitISUNPTjMyIFdJTkFQSSBFeHRyYWN0SWNvbjMyVyggSElOU1RBTkNFMzIgaEluc3RhbmNlLCBMUENXU1RSIGxwc3pFeGVGaWxlTmFtZSwKKwlVSU5UMzIgbkljb25JbmRleCApCit7IExQU1RSICBleGVmbjsKKyAgSElDT04zMiAgcmV0OworICBUUkFDRShzaGVsbCwiXG4iKTsKKworICBleGVmbiA9IEhFQVBfc3RyZHVwV3RvQShHZXRQcm9jZXNzSGVhcCgpLDAsbHBzekV4ZUZpbGVOYW1lKTsKKyAgcmV0ID0gRXh0cmFjdEljb24zMkEoaEluc3RhbmNlLGV4ZWZuLG5JY29uSW5kZXgpOworCisJSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwwLGV4ZWZuKTsKKwlyZXR1cm4gcmV0OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgRmluZEV4ZWN1dGFibGUzMkEgICAoU0hFTEwzMi4xODQpCisgKi8KK0hJTlNUQU5DRTMyIFdJTkFQSSBGaW5kRXhlY3V0YWJsZTMyQSggTFBDU1RSIGxwRmlsZSwgTFBDU1RSIGxwRGlyZWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUFNUUiBscFJlc3VsdCApCit7IEhJTlNUQU5DRTMyIHJldHZhbD0zMTsgICAgLyogZGVmYXVsdCAtICdObyBhc3NvY2lhdGlvbiB3YXMgZm91bmQnICovCisgICAgY2hhciBvbGRfZGlyWzEwMjRdOworCisgIFRSQUNFKHNoZWxsLCAiRmlsZSAlcywgRGlyICVzXG4iLCAKKwkJIChscEZpbGUgIT0gTlVMTD9scEZpbGU6Ii0iKSwgCisJCSAobHBEaXJlY3RvcnkgIT0gTlVMTD9scERpcmVjdG9yeToiLSIpKTsKKworICAgIGxwUmVzdWx0WzBdPSdcMCc7IC8qIFN0YXJ0IG9mZiB3aXRoIGFuIGVtcHR5IHJldHVybiBzdHJpbmcgKi8KKworICAgIC8qIHRyYXAgTlVMTCBwYXJhbWV0ZXJzIG9uIGVudHJ5ICovCisgICAgaWYgKCggbHBGaWxlID09IE5VTEwgKSB8fCAoIGxwUmVzdWx0ID09IE5VTEwgKSkKKyAgeyAvKiBGSVhNRSAtIHNob3VsZCB0aHJvdyBhIHdhcm5pbmcsIHBlcmhhcHMhICovCisJcmV0dXJuIDI7IC8qIEZpbGUgbm90IGZvdW5kLiBDbG9zZSBlbm91Z2gsIEkgZ3Vlc3MuICovCisgICAgfQorCisgICAgaWYgKGxwRGlyZWN0b3J5KQorICB7IEdldEN1cnJlbnREaXJlY3RvcnkzMkEoIHNpemVvZihvbGRfZGlyKSwgb2xkX2RpciApOworICAgICAgICBTZXRDdXJyZW50RGlyZWN0b3J5MzJBKCBscERpcmVjdG9yeSApOworICAgIH0KKworICAgIHJldHZhbCA9IFNIRUxMX0ZpbmRFeGVjdXRhYmxlKCBscEZpbGUsICJvcGVuIiwgbHBSZXN1bHQgKTsKKworICBUUkFDRShzaGVsbCwgInJldHVybmluZyAlc1xuIiwgbHBSZXN1bHQpOworICBpZiAobHBEaXJlY3RvcnkpCisgICAgU2V0Q3VycmVudERpcmVjdG9yeTMyQSggb2xkX2RpciApOworICAgIHJldHVybiByZXR2YWw7Cit9CisKK3R5cGVkZWYgc3RydWN0Cit7IExQQ1NUUiAgc3pBcHA7CisgICAgTFBDU1RSICBzek90aGVyU3R1ZmY7CisgICAgSElDT04zMiBoSWNvbjsKK30gQUJPVVRfSU5GTzsKKworI2RlZmluZQkJSURDX1NUQVRJQ19URVhUCQkxMDAKKyNkZWZpbmUJCUlEQ19MSVNUQk9YCQk5OQorI2RlZmluZQkJSURDX1dJTkVfVEVYVAkJOTgKKworI2RlZmluZQkJRFJPUF9GSUVMRF9UT1AJCSgtMTUpCisjZGVmaW5lCQlEUk9QX0ZJRUxEX0hFSUdIVAkxNQorCitleHRlcm4gSElDT04zMiBoSWNvblRpdGxlRm9udDsKKworc3RhdGljIEJPT0wzMiBfX2dldF9kcm9wbGluZSggSFdORDMyIGhXbmQsIExQUkVDVDMyIGxwcmVjdCApCit7IEhXTkQzMiBoV25kQ3RsID0gR2V0RGxnSXRlbTMyKGhXbmQsIElEQ19XSU5FX1RFWFQpOworICAgIGlmKCBoV25kQ3RsICkKKyAgeyBHZXRXaW5kb3dSZWN0MzIoIGhXbmRDdGwsIGxwcmVjdCApOworCU1hcFdpbmRvd1BvaW50czMyKCAwLCBoV25kLCAoTFBQT0lOVDMyKWxwcmVjdCwgMiApOworCWxwcmVjdC0+Ym90dG9tID0gKGxwcmVjdC0+dG9wICs9IERST1BfRklFTERfVE9QKTsKKwlyZXR1cm4gVFJVRTsKKyAgICB9CisgICAgcmV0dXJuIEZBTFNFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJCQkJU0hBcHBCYXJNZXNzYWdlMzIJW1NIRUxMMzIuMjA3XQorICovCitVSU5UMzIgV0lOQVBJIFNIQXBwQmFyTWVzc2FnZTMyKERXT1JEIG1zZywgUEFQUEJBUkRBVEEgZGF0YSkKK3sgRklYTUUoc2hlbGwsIigweCUwOGx4LCVwKTogc3R1YlxuIiwgbXNnLCBkYXRhKTsKKyNpZiAwCisgIHN3aXRjaCAobXNnKQorICB7IGNhc2UgQUJNX0FDVElWQVRFOgorICAgICAgICBjYXNlIEFCTV9HRVRBVVRPSElERUJBUjoKKyAgICAgICAgY2FzZSBBQk1fR0VUU1RBVEU6CisgICAgICAgIGNhc2UgQUJNX0dFVFRBU0tCQVJQT1M6CisgICAgICAgIGNhc2UgQUJNX05FVzoKKyAgICAgICAgY2FzZSBBQk1fUVVFUllQT1M6CisgICAgICAgIGNhc2UgQUJNX1JFTU9WRToKKyAgICAgICAgY2FzZSBBQk1fU0VUQVVUT0hJREVCQVI6CisgICAgICAgIGNhc2UgQUJNX1NFVFBPUzoKKyAgICAgICAgY2FzZSBBQk1fV0lORE9XUE9TQ0hBTkdFRDoKKwkgICAgOworICAgIH0KKyNlbmRpZgorICAgIHJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogU0hCcm93c2VGb3JGb2xkZXJBIFtTSEVMTDMyLjIwOV0KKyAqCisgKi8KK0xQSVRFTUlETElTVCBXSU5BUEkgU0hCcm93c2VGb3JGb2xkZXIzMkEgKExQQlJPV1NFSU5GTzMyQSBscGJpKQoreyBGSVhNRSAoc2hlbGwsICIoJWx4LCVzKSBlbXB0eSBzdHViIVxuIiwgKERXT1JEKWxwYmksIGxwYmktPmxwc3pUaXRsZSk7CisgIHJldHVybiBOVUxMOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIFNIR2V0RGVza3RvcEZvbGRlcgkJW1NIRUxMMzIuMjE2XQorICogCisgKiAgU0RLIGhlYWRlciB3aW45NS9zaGxvYmouaDogVGhpcyBpcyBlcXVpdmFsZW50IHRvIGNhbGwgQ29DcmVhdGVJbnN0YW5jZSB3aXRoCisgKiAgQ0xTSURfU2hlbGxEZXNrdG9wCisgKiAgQ29DcmVhdGVJbnN0YW5jZShDTFNJRF9EZXNrdG9wLCBOVUxMLCBDTFNDVFhfSU5QUk9DLCBJSURfSVNoZWxsRm9sZGVyLCAmcHNoZik7CisgKgorICogUkVUVVJOUworICogICB0aGUgaW50ZXJmYWNlIHRvIHRoZSBzaGVsbCBkZXNrdG9wIGZvbGRlci4KKyAqCisgKiBGSVhNRQorICogICB0aGUgcGRlc2t0b3Bmb2xkZXIgaGFzIHRvIGJlIHJlbGVhc2VkIGF0IHRoZSBlbmQgKGF0IGRsbCB1bmxvYWRpbmc/Pz8pCisgKi8KK0xQU0hFTExGT0xERVIgcGRlc2t0b3Bmb2xkZXI9TlVMTDsKKworRFdPUkQgV0lOQVBJIFNIR2V0RGVza3RvcEZvbGRlcihMUFNIRUxMRk9MREVSICpzaGVsbGZvbGRlcikKK3sgSFJFU1VMVAlocmVzID0gRV9PVVRPRk1FTU9SWTsKKyAgTFBDTEFTU0ZBQ1RPUlkgbHBjbGY7CisJVFJBQ0Uoc2hlbGwsIiVwLT4oJXApXG4iLHNoZWxsZm9sZGVyLCpzaGVsbGZvbGRlcik7CisKKyAgaWYgKHBkZXNrdG9wZm9sZGVyKQorCXsJaHJlcyA9IE5PRVJST1I7CisJfQorCWVsc2UKKyAgeyBscGNsZiA9IElDbGFzc0ZhY3RvcnlfQ29uc3RydWN0b3IoKTsKKyAgICAvKiBmaXhtZTogdGhlIGJ1aWxkaW4gSUNsYXNzRmFjdG9yeV9Db25zdHJ1Y3RvciBpcyBhdCB0aGUgbW9tZW50IG9ubHkgCisgCQlmb3IgcmNsc2lkPUNMU0lEX1NoZWxsRGVza3RvcCwgc28gd2UgZ2V0IHRoZSByaWdodCBJbnRlcmZhY2UgKGpzY2gpKi8KKyAgICBpZihscGNsZikKKyAgICB7IGhyZXMgPSBscGNsZi0+bHB2dGJsLT5mbkNyZWF0ZUluc3RhbmNlKGxwY2xmLE5VTEwsKFJFRklJRCkmSUlEX0lTaGVsbEZvbGRlciwgKHZvaWQqKSZwZGVza3RvcGZvbGRlcik7CisJIAkgIGxwY2xmLT5scHZ0YmwtPmZuUmVsZWFzZShscGNsZik7CisJICB9ICAKKyAgfQorCQorICBpZiAocGRlc2t0b3Bmb2xkZXIpCisJeyAqc2hlbGxmb2xkZXIgPSBwZGVza3RvcGZvbGRlcjsKKyAgICBwZGVza3RvcGZvbGRlci0+bHB2dGJsLT5mbkFkZFJlZihwZGVza3RvcGZvbGRlcik7CisJfQorICBlbHNlCisJeyAqc2hlbGxmb2xkZXI9TlVMTDsKKwl9CQorCisgIFRSQUNFKHNoZWxsLCItLSAlcC0+KCVwKVxuIixzaGVsbGZvbGRlciwgKnNoZWxsZm9sZGVyKTsKKwlyZXR1cm4gaHJlczsKK30KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgkJCSBTSEdldFBhdGhGcm9tSURMaXN0CQlbU0hFTEwzMi4yMjFdW05UIDQuMDogU0hFTEwzMi4yMTldCisgKi8KK0JPT0wzMiBXSU5BUEkgU0hHZXRQYXRoRnJvbUlETGlzdDMyKExQQ0lURU1JRExJU1QgcGlkbCxMUFNUUiBwc3pQYXRoKSAgICAgCit7IFRSQUNFKHNoZWxsLCIocGlkbD0lcCwlcClcbiIscGlkbCxwc3pQYXRoKTsKKyAgcmV0dXJuIFNIR2V0UGF0aEZyb21JRExpc3QzMkEocGlkbCxwc3pQYXRoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCQkJIFNIR2V0U3BlY2lhbEZvbGRlckxvY2F0aW9uCVtTSEVMTDMyLjIyM10KKyAqIGdldHMgdGhlIGZvbGRlciBsb2NhdGlvbnMgZnJvbSB0aGUgcmVnaXN0cnkgYW5kIGNyZWF0ZXMgYSBwaWRsCisgKiBjcmVhdGVzIG1pc3NpbmcgcmVnIGtleXMgYW5kIGRpcmVjdG9yeXMKKyAqIAorICogUEFSQU1TCisgKiAgIGh3bmRPd25lciBbSV0KKyAqICAgbkZvbGRlciAgIFtJXSBDU0lETF94eHh4eAorICogICBwcGlkbCAgICAgW09dIFBJREwgb2YgYSBzcGVjaWFsIGZvbGRlcgorICoKKyAqIFJFVFVSTlMKKyAqICAgIEhSZXN1bHQKKyAqCisgKiBGSVhNRQorICogICAtIGxvb2sgZm9yICJVc2VyIFNoZWxsIEZvbGRlciIgZmlyc3QKKyAqCisgKi8KK0hSRVNVTFQgV0lOQVBJIFNIR2V0U3BlY2lhbEZvbGRlckxvY2F0aW9uKEhXTkQzMiBod25kT3duZXIsIElOVDMyIG5Gb2xkZXIsIExQSVRFTUlETElTVCAqIHBwaWRsKQoreyBMUFNIRUxMRk9MREVSIHNoZWxsZm9sZGVyOworICBEV09SRCBwY2hFYXRlbix0cGF0aGxlbj1NQVhfUEFUSCx0eXBlLGR3ZGlzcCxyZXM7CisgIENIQVIgcHN6VGVtcFsyNTZdLGJ1ZmZlclsyNTZdLHRwYXRoW01BWF9QQVRIXSxucGF0aFtNQVhfUEFUSF07CisgIExQV1NUUiBscHN6RGlzcGxheU5hbWUgPSAoTFBXU1RSKSZwc3pUZW1wWzBdOworICBIS0VZIGtleTsKKworICBlbnVtIAorCXsJRlRfVU5LTk9XTj0gMHgwMDAwMDAwMCwKKwkgIEZUX0RJUj0gICAgIDB4MDAwMDAwMDEsIAorCSAgRlRfREVTS1RPUD0gMHgwMDAwMDAwMgorCX0gdEZvbGRlcjsgCisKKyAgVFJBQ0Uoc2hlbGwsIiglMDR4LCVkLCVwKVxuIiwgaHduZE93bmVyLG5Gb2xkZXIscHBpZGwpOworCisgIHN0cmNweShidWZmZXIsIlNvZnR3YXJlXFxNaWNyb3NvZnRcXFdpbmRvd3NcXEN1cnJlbnRWZXJzaW9uXFxFeHBsb3JlclxcU2hlbGwgRm9sZGVyc1xcIik7CisKKyAgcmVzPVJlZ0NyZWF0ZUtleUV4MzJBKEhLRVlfQ1VSUkVOVF9VU0VSLGJ1ZmZlciwwLE5VTEwsUkVHX09QVElPTl9OT05fVk9MQVRJTEUsS0VZX1dSSVRFLE5VTEwsJmtleSwmZHdkaXNwKTsKKwlpZiAocmVzKQorCXsgRVJSKHNoZWxsLCJDb3VsZCBub3QgY3JlYXRlIGtleSAlcyAlMDhseCBcbiIsYnVmZmVyLHJlcyk7CisJICByZXR1cm4gRV9PVVRPRk1FTU9SWTsKKwl9CisKKwl0Rm9sZGVyPUZUX0RJUjsJCisJc3dpdGNoIChuRm9sZGVyKQorCXsJY2FzZSBDU0lETF9CSVRCVUNLRVQ6CisJCQlzdHJjcHkgKGJ1ZmZlciwieHh4Iik7CQkJLypub3QgaW4gdGhlIHJlZ2lzdHJ5Ki8KKwkJCVRSQUNFIChzaGVsbCwibG9va2luZyBmb3IgUmVjeWNsZXJcbiIpOworCQkJdEZvbGRlcj1GVF9VTktOT1dOOworICAgICAgYnJlYWs7CisJCWNhc2UgQ1NJRExfQ09OVFJPTFM6CisJCQlzdHJjcHkgKGJ1ZmZlciwieHh4Iik7CQkJLyp2aXJ0dWFsIGZvbGRlciovCisgICAgICBUUkFDRSAoc2hlbGwsImxvb2tpbmcgZm9yIENvbnRyb2xcbiIpOworCQkJdEZvbGRlcj1GVF9VTktOT1dOOworICAgICAgYnJlYWs7CisJCWNhc2UgQ1NJRExfREVTS1RPUDoKKwkJCXN0cmNweSAoYnVmZmVyLCJ4eHgiKTsJCQkvKnZpcnR1YWwgZm9sZGVyKi8KKwkJCVRSQUNFIChzaGVsbCwibG9va2luZyBmb3IgRGVza3RvcFxuIik7CisJCQl0Rm9sZGVyPUZUX0RFU0tUT1A7CQkJCisgICAgICBicmVhazsKKwkJY2FzZSBDU0lETF9ERVNLVE9QRElSRUNUT1JZOgorCQkJc3RyY3B5IChidWZmZXIsIkRlc2t0b3AiKTsKKyAgICAgIGJyZWFrOworCQljYXNlIENTSURMX0RSSVZFUzoKKwkJCXN0cmNweSAoYnVmZmVyLCJ4eHgiKTsJCQkvKnZpcnR1YWwgZm9sZGVyKi8KKyAgICAgIFRSQUNFIChzaGVsbCwibG9va2luZyBmb3IgRHJpdmVzXG4iKTsKKwkJCXRGb2xkZXI9RlRfVU5LTk9XTjsKKyAgICAgIGJyZWFrOworCQljYXNlIENTSURMX0ZPTlRTOgorCQkJc3RyY3B5IChidWZmZXIsIkZvbnRzIik7CQkJCisgICAgICBicmVhazsKKwkJY2FzZSBDU0lETF9ORVRIT09EOgorCQkJc3RyY3B5IChidWZmZXIsIk5ldEhvb2QiKTsJCQkKKyAgICAgIGJyZWFrOworCQljYXNlIENTSURMX05FVFdPUks6CisJCQlzdHJjcHkgKGJ1ZmZlciwieHh4Iik7CQkJCS8qdmlydHVhbCBmb2xkZXIqLworCQkJVFJBQ0UgKHNoZWxsLCJsb29raW5nIGZvciBOZXR3b3JrXG4iKTsKKwkJCXRGb2xkZXI9RlRfVU5LTk9XTjsKKyAgICAgIGJyZWFrOworCQljYXNlIENTSURMX1BFUlNPTkFMOgorCQkJc3RyY3B5IChidWZmZXIsIlBlcnNvbmFsIik7CQkJCisgICAgICBicmVhazsKKwkJY2FzZSBDU0lETF9GQVZPUklURVM6CisJCQlzdHJjcHkgKGJ1ZmZlciwiRmF2b3JpdGVzIik7CQkJCisgICAgICBicmVhazsKKwkJY2FzZSBDU0lETF9QUklOVEVSUzoKKwkJCXN0cmNweSAoYnVmZmVyLCJQcmludEhvb2QiKTsJCQkKKyAgICAgIGJyZWFrOworCQljYXNlIENTSURMX1BST0dSQU1TOgorCQkJc3RyY3B5IChidWZmZXIsIlByb2dyYW1zIik7CQkJCisgICAgICBicmVhazsKKwkJY2FzZSBDU0lETF9SRUNFTlQ6CisJCQlzdHJjcHkgKGJ1ZmZlciwiUmVjZW50Iik7CisgICAgICBicmVhazsKKwkJY2FzZSBDU0lETF9TRU5EVE86CisJCQlzdHJjcHkgKGJ1ZmZlciwiU2VuZFRvIik7CisgCQkgIGJyZWFrOworCQljYXNlIENTSURMX1NUQVJUTUVOVToKKwkJCXN0cmNweSAoYnVmZmVyLCJTdGFydCBNZW51Iik7CisgICAgICBicmVhazsKKwkJY2FzZSBDU0lETF9TVEFSVFVQOgorCQkJc3RyY3B5IChidWZmZXIsIlN0YXJ0dXAiKTsJCQkKKyAgICAgIGJyZWFrOworCQljYXNlIENTSURMX1RFTVBMQVRFUzoKKwkJCXN0cmNweSAoYnVmZmVyLCJUZW1wbGF0ZXMiKTsJCQkKKyAgICAgIGJyZWFrOworCQlkZWZhdWx0OgorICAgICAgRVJSIChzaGVsbCwidW5rbm93biBDU0lETFxuIik7CisJCQl0Rm9sZGVyPUZUX1VOS05PV047CQkJCisgICAgICBicmVhazsKKwl9CisKKyAgVFJBQ0Uoc2hlbGwsIktleT0lc1xuIixidWZmZXIpOworCisgIHR5cGU9UkVHX1NaOworCisgIHN3aXRjaCAodEZvbGRlcikKKwl7IGNhc2UgRlRfRElSOgorCSAgICAvKiBEaXJlY3Rvcnk6IGdldCB0aGUgdmFsdWUgZnJvbSB0aGUgcmVnaXN0cnksIGlmIGl0cyBub3QgdGhlcmUgCisJCQljcmVhdGUgaXQgYW5kIHRoZSBkaXJlY3RvcnkqLworICAgIAlpZiAoUmVnUXVlcnlWYWx1ZUV4MzJBKGtleSxidWZmZXIsTlVMTCwmdHlwZSx0cGF0aCwmdHBhdGhsZW4pKQorICAJICB7IEdldFdpbmRvd3NEaXJlY3RvcnkzMkEobnBhdGgsTUFYX1BBVEgpOworCSAgICAgIFBhdGhBZGRCYWNrc2xhc2gobnBhdGgpOworICAJCQlzd2l0Y2ggKG5Gb2xkZXIpCisgIAkJCXsJY2FzZSBDU0lETF9ERVNLVE9QRElSRUNUT1JZOgorICAgICAgCQkJc3RyY2F0IChucGF0aCwiRGVza3RvcCIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAJCWNhc2UgQ1NJRExfRk9OVFM6CisgICAgICAJCQlzdHJjYXQgKG5wYXRoLCJGb250cyIpOwkJCQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAJCWNhc2UgQ1NJRExfTkVUSE9PRDoKKyAgICAgIAkJCXN0cmNhdCAobnBhdGgsIk5ldEhvb2QiKTsJCQkKKyAgICAgICAgICAgIGJyZWFrOworICAJCSAgICBjYXNlIENTSURMX1BFUlNPTkFMOgorICAgICAgCQkJc3RyY3B5IChucGF0aCwiQzpcXFBlcnNvbmFsIik7CQkJCisgICAgICAgICAgICBicmVhazsKKyAgICAgIAkJY2FzZSBDU0lETF9GQVZPUklURVM6CisgICAgICAJCQlzdHJjYXQgKG5wYXRoLCJGYXZvcml0ZXMiKTsJCQkKKyAgICAgICAgICAgIGJyZWFrOworICAJCSAgICBjYXNlIENTSURMX1BSSU5URVJTOgorICAgICAgCQkJc3RyY2F0IChucGF0aCwiUHJpbnRIb29kIik7CQkJCisgICAgICAgICAgICBicmVhazsKKyAgICAgIAkJY2FzZSBDU0lETF9QUk9HUkFNUzoKKyAgICAgIAkJCXN0cmNhdCAobnBhdGgsIlN0YXJ0IE1lbnUiKTsJCQkKKyAgCQkJCQlDcmVhdGVEaXJlY3RvcnkzMkEobnBhdGgsTlVMTCk7CisgICAgICAJCQlzdHJjYXQgKG5wYXRoLCJcXFByb2dyYW1zIik7CQkJCisgICAgICAgICAgICBicmVhazsKKyAgICAgIAkJY2FzZSBDU0lETF9SRUNFTlQ6CisgICAgICAJCQlzdHJjYXQgKG5wYXRoLCJSZWNlbnQiKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgCQljYXNlIENTSURMX1NFTkRUTzoKKyAgICAgIAkJCXN0cmNhdCAobnBhdGgsIlNlbmRUbyIpOworICAgICAgCQkJYnJlYWs7CisgICAgICAJCWNhc2UgQ1NJRExfU1RBUlRNRU5VOgorICAgICAgCQkJc3RyY2F0IChucGF0aCwiU3RhcnQgTWVudSIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAJCWNhc2UgQ1NJRExfU1RBUlRVUDoKKyAgICAgIAkJCXN0cmNhdCAobnBhdGgsIlN0YXJ0IE1lbnUiKTsJCQkKKyAgCQkJCQlDcmVhdGVEaXJlY3RvcnkzMkEobnBhdGgsTlVMTCk7CisgICAgICAJCQlzdHJjYXQgKG5wYXRoLCJcXFN0YXJ0dXAiKTsJCQkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgCQljYXNlIENTSURMX1RFTVBMQVRFUzoKKyAgICAgIAkJCXN0cmNhdCAobnBhdGgsIlRlbXBsYXRlcyIpOwkJCQorICAgICAgICAgICAgYnJlYWs7CisgIAkJCQlkZWZhdWx0OgorICAgICAgICAgCSAgUmVnQ2xvc2VLZXkoa2V5KTsKKyAgICAgICAgCSAgcmV0dXJuIEVfT1VUT0ZNRU1PUlk7CisgIAkJCX0KKyAgICAJCWlmIChSZWdTZXRWYWx1ZUV4MzJBKGtleSxidWZmZXIsMCxSRUdfU1osbnBhdGgsc2l6ZW9mKG5wYXRoKSsxKSkKKyAgICAgICAgewlFUlIoc2hlbGwsImNvdWxkIG5vdCBjcmVhdGUgdmFsdWUgJXNcbiIsYnVmZmVyKTsKKyAgICAgIAkgIFJlZ0Nsb3NlS2V5KGtleSk7CisgICAgICAJICByZXR1cm4gRV9PVVRPRk1FTU9SWTsKKyAgICAJCX0KKyAgICAJCVRSQUNFKHNoZWxsLCJ2YWx1ZSAlcz0lcyBjcmVhdGVkXG4iLGJ1ZmZlcixucGF0aCk7CisgICAgCSAgQ3JlYXRlRGlyZWN0b3J5MzJBKG5wYXRoLE5VTEwpOworICAgICAgfQorCQkJYnJlYWs7CisJCWNhc2UgRlRfREVTS1RPUDoKKwkJCXN0cmNweSAodHBhdGgsIkRlc2t0b3AiKTsJCQkKKwkJICBicmVhazsKKwkgIGRlZmF1bHQ6CisgICAgICBSZWdDbG9zZUtleShrZXkpOworICAgICAgcmV0dXJuIEVfT1VUT0ZNRU1PUlk7CisJCSAgYnJlYWs7CisgIH0KKworCVJlZ0Nsb3NlS2V5KGtleSk7CisKKyAgVFJBQ0Uoc2hlbGwsIlZhbHVlPSVzXG4iLHRwYXRoKTsKKyAgTG9jYWxUb1dpZGVDaGFyMzIobHBzekRpc3BsYXlOYW1lLCB0cGF0aCwgMjU2KTsKKyAgCisJaWYgKFNIR2V0RGVza3RvcEZvbGRlcigmc2hlbGxmb2xkZXIpPT1TX09LKQorCXsgc2hlbGxmb2xkZXItPmxwdnRibC0+Zm5QYXJzZURpc3BsYXlOYW1lKHNoZWxsZm9sZGVyLGh3bmRPd25lciwgTlVMTCxscHN6RGlzcGxheU5hbWUsJnBjaEVhdGVuLHBwaWRsLE5VTEwpOworCSAgc2hlbGxmb2xkZXItPmxwdnRibC0+Zm5SZWxlYXNlKHNoZWxsZm9sZGVyKTsKKwl9CisKKwlUUkFDRShzaGVsbCwgIi0tIChuZXcgcGlkbCAlcClcbiIsKnBwaWRsKTsKKwlyZXR1cm4gTk9FUlJPUjsKK30KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBTSEhlbHBTaG9ydGN1dHNfUnVuRExMIFtTSEVMTDMyLjIyNF0KKyAqCisgKi8KK0RXT1JEIFdJTkFQSSBTSEhlbHBTaG9ydGN1dHNfUnVuRExMIChEV09SRCBkd0FyZzEsIERXT1JEIGR3QXJnMiwgRFdPUkQgZHdBcmczLCBEV09SRCBkd0FyZzQpCit7IEZJWE1FIChleGVjLCAiKCVseCwgJWx4LCAlbHgsICVseCkgZW1wdHkgc3R1YiFcbiIsCisJZHdBcmcxLCBkd0FyZzIsIGR3QXJnMywgZHdBcmc0KTsKKworICByZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFNITG9hZEluUHJvYyBbU0hFTEwzMi4yMjVdCisgKgorICovCisKK0RXT1JEIFdJTkFQSSBTSExvYWRJblByb2MgKERXT1JEIGR3QXJnMSkKK3sgRklYTUUgKHNoZWxsLCAiKCVseCkgZW1wdHkgc3R1YiFcbiIsIGR3QXJnMSk7CisgICAgcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICBTaGVsbEV4ZWN1dGUzMkEgICAoU0hFTEwzMi4yNDUpCisgKi8KK0hJTlNUQU5DRTMyIFdJTkFQSSBTaGVsbEV4ZWN1dGUzMkEoIEhXTkQzMiBoV25kLCBMUENTVFIgbHBPcGVyYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUENTVFIgbHBGaWxlLCBMUENTVFIgbHBQYXJhbWV0ZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBDU1RSIGxwRGlyZWN0b3J5LCBJTlQzMiBpU2hvd0NtZCApCit7ICAgVFJBQ0Uoc2hlbGwsIlxuIik7CisgICAgcmV0dXJuIFNoZWxsRXhlY3V0ZTE2KCBoV25kLCBscE9wZXJhdGlvbiwgbHBGaWxlLCBscFBhcmFtZXRlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBscERpcmVjdG9yeSwgaVNob3dDbWQgKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgQWJvdXREbGdQcm9jMzIgIChub3QgYW4gZXhwb3J0ZWQgQVBJIGZ1bmN0aW9uKQorICovCitMUkVTVUxUIFdJTkFQSSBBYm91dERsZ1Byb2MzMiggSFdORDMyIGhXbmQsIFVJTlQzMiBtc2csIFdQQVJBTTMyIHdQYXJhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUEFSQU0gbFBhcmFtICkKK3sgICBIV05EMzIgaFduZEN0bDsKKyAgICBjaGFyIFRlbXBsYXRlWzUxMl0sIEFwcFRpdGxlWzUxMl07CisKKyAgICBUUkFDRShzaGVsbCwiXG4iKTsKKworICAgIHN3aXRjaChtc2cpCisgICAgeyBjYXNlIFdNX0lOSVRESUFMT0c6CisgICAgICB7IEFCT1VUX0lORk8gKmluZm8gPSAoQUJPVVRfSU5GTyAqKWxQYXJhbTsKKyAgICAgICAgICAgIGlmIChpbmZvKQorICAgICAgICB7IGNvbnN0IGNoYXIqIGNvbnN0ICpwc3RyID0gU0hFTExfUGVvcGxlOworICAgICAgICAgICAgICAgIFNlbmREbGdJdGVtTWVzc2FnZTMyQShoV25kLCBzdGMxLCBTVE1fU0VUSUNPTjMyLGluZm8tPmhJY29uLCAwKTsKKyAgICAgICAgICAgICAgICBHZXRXaW5kb3dUZXh0MzJBKCBoV25kLCBUZW1wbGF0ZSwgc2l6ZW9mKFRlbXBsYXRlKSApOworICAgICAgICAgICAgICAgIHNwcmludGYoIEFwcFRpdGxlLCBUZW1wbGF0ZSwgaW5mby0+c3pBcHAgKTsKKyAgICAgICAgICAgICAgICBTZXRXaW5kb3dUZXh0MzJBKCBoV25kLCBBcHBUaXRsZSApOworICAgICAgICAgICAgICAgIFNldFdpbmRvd1RleHQzMkEoIEdldERsZ0l0ZW0zMihoV25kLCBJRENfU1RBVElDX1RFWFQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8tPnN6T3RoZXJTdHVmZiApOworICAgICAgICAgICAgICAgIGhXbmRDdGwgPSBHZXREbGdJdGVtMzIoaFduZCwgSURDX0xJU1RCT1gpOworICAgICAgICAgICAgICAgIFNlbmRNZXNzYWdlMzJBKCBoV25kQ3RsLCBXTV9TRVRSRURSQVcsIDAsIDAgKTsKKyAgICAgICAgICAgICAgICBTZW5kTWVzc2FnZTMyQSggaFduZEN0bCwgV01fU0VURk9OVCwgaEljb25UaXRsZUZvbnQsIDAgKTsKKyAgICAgICAgICAgICAgICB3aGlsZSAoKnBzdHIpCisgICAgICAgICAgeyBTZW5kTWVzc2FnZTMyQSggaFduZEN0bCwgTEJfQUREU1RSSU5HMzIsIChXUEFSQU0zMiktMSwgKExQQVJBTSkqcHN0ciApOworICAgICAgICAgICAgICAgICAgICBwc3RyKys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIFNlbmRNZXNzYWdlMzJBKCBoV25kQ3RsLCBXTV9TRVRSRURSQVcsIDEsIDAgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gMTsKKworICAgIGNhc2UgV01fUEFJTlQ6CisgICAgICB7IFJFQ1QzMiByZWN0OworCSAgICBQQUlOVFNUUlVDVDMyIHBzOworCSAgICBIREMzMiBoREMgPSBCZWdpblBhaW50MzIoIGhXbmQsICZwcyApOworCisJICAgIGlmKCBfX2dldF9kcm9wbGluZSggaFduZCwgJnJlY3QgKSApCisJCUdSQVBIX0RyYXdMaW5lcyggaERDLCAoTFBQT0lOVDMyKSZyZWN0LCAxLCBHZXRTdG9ja09iamVjdDMyKCBCTEFDS19QRU4gKSApOworCSAgICBFbmRQYWludDMyKCBoV25kLCAmcHMgKTsKKwl9CisJYnJlYWs7CisKKyAgICBjYXNlIFdNX0xCVFJBQ0tQT0lOVDoKKwloV25kQ3RsID0gR2V0RGxnSXRlbTMyKGhXbmQsIElEQ19MSVNUQk9YKTsKKwlpZiggKElOVDE2KUdldEtleVN0YXRlMTYoIFZLX0NPTlRST0wgKSA8IDAgKQorICAgICAgeyBpZiggRHJhZ0RldGVjdDMyKCBoV25kQ3RsLCAqKChMUFBPSU5UMzIpJmxQYXJhbSkgKSApCisgICAgICAgIHsgSU5UMzIgaWR4ID0gU2VuZE1lc3NhZ2UzMkEoIGhXbmRDdGwsIExCX0dFVENVUlNFTDMyLCAwLCAwICk7CisJCWlmKCBpZHggIT0gLTEgKQorICAgICAgICAgIHsgSU5UMzIgbGVuZ3RoID0gU2VuZE1lc3NhZ2UzMkEoIGhXbmRDdGwsIExCX0dFVFRFWFRMRU4zMiwgKFdQQVJBTTMyKWlkeCwgMCApOworCQkgICAgSEdMT0JBTDE2IGhNZW1PYmogPSBHbG9iYWxBbGxvYzE2KCBHTUVNX01PVkVBQkxFLCBsZW5ndGggKyAxICk7CisJCSAgICBjaGFyKiBwc3RyID0gKGNoYXIqKUdsb2JhbExvY2sxNiggaE1lbU9iaiApOworCisJCSAgICBpZiggcHN0ciApCisgICAgICAgICAgICB7IEhDVVJTT1IxNiBoQ3Vyc29yID0gTG9hZEN1cnNvcjE2KCAwLCBNQUtFSU5UUkVTT1VSQ0UxNihPQ1JfRFJBR09CSkVDVCkgKTsKKwkJCVNlbmRNZXNzYWdlMzJBKCBoV25kQ3RsLCBMQl9HRVRURVhUMzIsIChXUEFSQU0zMilpZHgsIChMUEFSQU0pcHN0ciApOworCQkJU2VuZE1lc3NhZ2UzMkEoIGhXbmRDdGwsIExCX0RFTEVURVNUUklORzMyLCAoV1BBUkFNMzIpaWR4LCAwICk7CisJCQlVcGRhdGVXaW5kb3czMiggaFduZEN0bCApOworCQkJaWYoICFEcmFnT2JqZWN0MTYoKEhXTkQxNiloV25kLCAoSFdORDE2KWhXbmQsIERSQUdPQkpfREFUQSwgMCwgKFdPUkQpaE1lbU9iaiwgaEN1cnNvcikgKQorCQkJICAgIFNlbmRNZXNzYWdlMzJBKCBoV25kQ3RsLCBMQl9BRERTVFJJTkczMiwgKFdQQVJBTTMyKS0xLCAoTFBBUkFNKXBzdHIgKTsKKwkJICAgIH0KKyAgICAgICAgICAgIGlmKCBoTWVtT2JqICkKKyAgICAgICAgICAgICAgR2xvYmFsRnJlZTE2KCBoTWVtT2JqICk7CisJCX0KKwkgICAgfQorCX0KKwlicmVhazsKKworICAgIGNhc2UgV01fUVVFUllEUk9QT0JKRUNUOgorCWlmKCB3UGFyYW0gPT0gMCApCisgICAgICB7IExQRFJBR0lORk8gbHBEcmFnSW5mbyA9IChMUERSQUdJTkZPKVBUUl9TRUdfVE9fTElOKChTRUdQVFIpbFBhcmFtKTsKKwkgICAgaWYoIGxwRHJhZ0luZm8gJiYgbHBEcmFnSW5mby0+d0ZsYWdzID09IERSQUdPQkpfREFUQSApCisgICAgICAgIHsgUkVDVDMyIHJlY3Q7CisJCWlmKCBfX2dldF9kcm9wbGluZSggaFduZCwgJnJlY3QgKSApCisgICAgICAgICAgeyBQT0lOVDMyIHB0ID0geyBscERyYWdJbmZvLT5wdC54LCBscERyYWdJbmZvLT5wdC55IH07CisJCSAgICByZWN0LmJvdHRvbSArPSBEUk9QX0ZJRUxEX0hFSUdIVDsKKwkJICAgIGlmKCBQdEluUmVjdDMyKCAmcmVjdCwgcHQgKSApCisgICAgICAgICAgICB7IFNldFdpbmRvd0xvbmczMkEoIGhXbmQsIERXTF9NU0dSRVNVTFQsIDEgKTsKKwkJCXJldHVybiBUUlVFOworCQkgICAgfQorCQl9CisJICAgIH0KKwl9CisJYnJlYWs7CisKKyAgICBjYXNlIFdNX0RST1BPQkpFQ1Q6CisJaWYoIHdQYXJhbSA9PSBoV25kICkKKyAgICAgIHsgTFBEUkFHSU5GTyBscERyYWdJbmZvID0gKExQRFJBR0lORk8pUFRSX1NFR19UT19MSU4oKFNFR1BUUilsUGFyYW0pOworCSAgICBpZiggbHBEcmFnSW5mbyAmJiBscERyYWdJbmZvLT53RmxhZ3MgPT0gRFJBR09CSl9EQVRBICYmIGxwRHJhZ0luZm8tPmhMaXN0ICkKKyAgICAgICAgeyBjaGFyKiBwc3RyID0gKGNoYXIqKUdsb2JhbExvY2sxNiggKEhHTE9CQUwxNikobHBEcmFnSW5mby0+aExpc3QpICk7CisJCWlmKCBwc3RyICkKKyAgICAgICAgICB7IHN0YXRpYyBjaGFyIF9fYXBwZW5kaXhfc3RyW10gPSAiIHdpdGgiOworCisJCSAgICBoV25kQ3RsID0gR2V0RGxnSXRlbTMyKCBoV25kLCBJRENfV0lORV9URVhUICk7CisJCSAgICBTZW5kTWVzc2FnZTMyQSggaFduZEN0bCwgV01fR0VUVEVYVCwgNTEyLCAoTFBBUkFNKVRlbXBsYXRlICk7CisJCSAgICBpZiggIWxzdHJuY21wMzJBKCBUZW1wbGF0ZSwgIldJTkUiLCA0ICkgKQorCQkJU2V0V2luZG93VGV4dDMyQSggR2V0RGxnSXRlbTMyKGhXbmQsIElEQ19TVEFUSUNfVEVYVCksIFRlbXBsYXRlICk7CisJCSAgICBlbHNlCisgICAgICAgICAgeyBjaGFyKiBwY2ggPSBUZW1wbGF0ZSArIHN0cmxlbihUZW1wbGF0ZSkgLSBzdHJsZW4oX19hcHBlbmRpeF9zdHIpOworCQkJKnBjaCA9ICdcMCc7CisJCQlTZW5kTWVzc2FnZTMyQSggR2V0RGxnSXRlbTMyKGhXbmQsIElEQ19MSVNUQk9YKSwgTEJfQUREU1RSSU5HMzIsIAorCQkJCQkoV1BBUkFNMzIpLTEsIChMUEFSQU0pVGVtcGxhdGUgKTsKKwkJICAgIH0KKworCQkgICAgbHN0cmNweTMyQSggVGVtcGxhdGUsIHBzdHIgKTsKKwkJICAgIGxzdHJjYXQzMkEoIFRlbXBsYXRlLCBfX2FwcGVuZGl4X3N0ciApOworCQkgICAgU2V0V2luZG93VGV4dDMyQSggaFduZEN0bCwgVGVtcGxhdGUgKTsKKwkJICAgIFNldFdpbmRvd0xvbmczMkEoIGhXbmQsIERXTF9NU0dSRVNVTFQsIDEgKTsKKwkJICAgIHJldHVybiBUUlVFOworCQl9CisJICAgIH0KKwl9CisJYnJlYWs7CisKKyAgICBjYXNlIFdNX0NPTU1BTkQ6CisgICAgICAgIGlmICh3UGFyYW0gPT0gSURPSykKKyAgICB7ICBFbmREaWFsb2czMihoV25kLCBUUlVFKTsKKyAgICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgU2hlbGxBYm91dDMyQSAgIChTSEVMTDMyLjI0MykKKyAqLworQk9PTDMyIFdJTkFQSSBTaGVsbEFib3V0MzJBKCBIV05EMzIgaFduZCwgTFBDU1RSIHN6QXBwLCBMUENTVFIgc3pPdGhlclN0dWZmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBISUNPTjMyIGhJY29uICkKK3sgICBBQk9VVF9JTkZPIGluZm87CisgICAgVFJBQ0Uoc2hlbGwsIlxuIik7CisgICAgaW5mby5zekFwcCAgICAgICAgPSBzekFwcDsKKyAgICBpbmZvLnN6T3RoZXJTdHVmZiA9IHN6T3RoZXJTdHVmZjsKKyAgICBpbmZvLmhJY29uICAgICAgICA9IGhJY29uOworICAgIGlmICghaEljb24pIGluZm8uaEljb24gPSBMb2FkSWNvbjE2KCAwLCBNQUtFSU5UUkVTT1VSQ0UxNihPSUNfV0lORUlDT04pICk7CisgICAgcmV0dXJuIERpYWxvZ0JveEluZGlyZWN0UGFyYW0zMkEoIFdJTl9HZXRXaW5kb3dJbnN0YW5jZSggaFduZCApLAorICAgICAgICAgICAgICAgICAgICAgICAgIFNZU1JFU19HZXRSZXNQdHIoIFNZU1JFU19ESUFMT0dfU0hFTExfQUJPVVRfTVNHQk9YICksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhXbmQsIEFib3V0RGxnUHJvYzMyLCAoTFBBUkFNKSZpbmZvICk7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgIFNoZWxsQWJvdXQzMlcgICAoU0hFTEwzMi4yNDQpCisgKi8KK0JPT0wzMiBXSU5BUEkgU2hlbGxBYm91dDMyVyggSFdORDMyIGhXbmQsIExQQ1dTVFIgc3pBcHAsIExQQ1dTVFIgc3pPdGhlclN0dWZmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBISUNPTjMyIGhJY29uICkKK3sgICBCT09MMzIgcmV0OworICAgIEFCT1VUX0lORk8gaW5mbzsKKworICAgIFRSQUNFKHNoZWxsLCJcbiIpOworICAgIAorICAgIGluZm8uc3pBcHAgICAgICAgID0gSEVBUF9zdHJkdXBXdG9BKCBHZXRQcm9jZXNzSGVhcCgpLCAwLCBzekFwcCApOworICAgIGluZm8uc3pPdGhlclN0dWZmID0gSEVBUF9zdHJkdXBXdG9BKCBHZXRQcm9jZXNzSGVhcCgpLCAwLCBzek90aGVyU3R1ZmYgKTsKKyAgICBpbmZvLmhJY29uICAgICAgICA9IGhJY29uOworICAgIGlmICghaEljb24pIGluZm8uaEljb24gPSBMb2FkSWNvbjE2KCAwLCBNQUtFSU5UUkVTT1VSQ0UxNihPSUNfV0lORUlDT04pICk7CisgICAgcmV0ID0gRGlhbG9nQm94SW5kaXJlY3RQYXJhbTMyQSggV0lOX0dldFdpbmRvd0luc3RhbmNlKCBoV25kICksCisgICAgICAgICAgICAgICAgICAgICAgICAgU1lTUkVTX0dldFJlc1B0ciggU1lTUkVTX0RJQUxPR19TSEVMTF9BQk9VVF9NU0dCT1ggKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaFduZCwgQWJvdXREbGdQcm9jMzIsIChMUEFSQU0pJmluZm8gKTsKKyAgICBIZWFwRnJlZSggR2V0UHJvY2Vzc0hlYXAoKSwgMCwgKExQU1RSKWluZm8uc3pBcHAgKTsKKyAgICBIZWFwRnJlZSggR2V0UHJvY2Vzc0hlYXAoKSwgMCwgKExQU1RSKWluZm8uc3pPdGhlclN0dWZmICk7CisgICAgcmV0dXJuIHJldDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCQkJCVNoZWxsX05vdGlmeUljb24JW1NIRUxMMzIuMjk2XQorICoJRklYTUUKKyAqCVRoaXMgZnVuY3Rpb24gaXMgc3VwcG9zZWQgdG8gZGVhbCB3aXRoIHRoZSBzeXN0cmF5LgorICoJQW55IGlkZWFzIG9uIGhvdyB0aGlzIGlzIHRvIGJlIGltcGxpbWVudGVkPworICovCitCT09MMzIgV0lOQVBJIFNoZWxsX05vdGlmeUljb24oCURXT1JEIGR3TWVzc2FnZSwgUE5PVElGWUlDT05EQVRBIHBuaWQgKQoreyAgIFRSQUNFKHNoZWxsLCJcbiIpOworICAgIHJldHVybiBGQUxTRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCQkJCVNoZWxsX05vdGlmeUljb24JW1NIRUxMMzIuMjk3XQorICoJRklYTUUKKyAqCVRoaXMgZnVuY3Rpb24gaXMgc3VwcG9zZWQgdG8gZGVhbCB3aXRoIHRoZSBzeXN0cmF5LgorICoJQW55IGlkZWFzIG9uIGhvdyB0aGlzIGlzIHRvIGJlIGltcGxpbWVudGVkPworICovCitCT09MMzIgV0lOQVBJIFNoZWxsX05vdGlmeUljb25BKERXT1JEIGR3TWVzc2FnZSwgUE5PVElGWUlDT05EQVRBIHBuaWQgKQoreyAgIFRSQUNFKHNoZWxsLCJcbiIpOworICAgIHJldHVybiBGQUxTRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEZyZWVJY29uTGlzdAorICovCit2b2lkIFdJTkFQSSBGcmVlSWNvbkxpc3QoIERXT1JEIGR3ICkKK3sgRklYTUUoc2hlbGwsICIoJWx4KTogc3R1YlxuIixkdyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBTSEdldFBhdGhGcm9tSURMaXN0MzJBICAgICAgICBbU0hFTEwzMi4yNjFdW05UIDQuMDogU0hFTEwzMi4yMjBdCisgKgorICogUEFSQU1FVEVSUworICogIHBpZGwsICAgW0lOXSBwaWRsIAorICogIHBzelBhdGggW09VVF0gcGF0aAorICoKKyAqIFJFVFVSTlMgCisgKiAgcGF0aCBmcm9tIGEgcGFzc2VkIFBJREwuCisgKgorICogTk9URVMKKyAqICAgICBleHBvcnRlZCBieSBuYW1lCisgKgorICogRklYTUUKKyAqICBmbkdldERpc3BsYXlOYW1lT2YgY2FuIHJldHVybiBkaWZmZXJlbnQgdHlwZXMgb2YgT0xFU3RyaW5nCisgKi8KK0RXT1JEIFdJTkFQSSBTSEdldFBhdGhGcm9tSURMaXN0MzJBIChMUENJVEVNSURMSVNUIHBpZGwsTFBTVFIgcHN6UGF0aCkKK3sJU1RSUkVUIGxwTmFtZTsKKwlMUFNIRUxMRk9MREVSIHNoZWxsZm9sZGVyOworICBDSEFSICBidWZmZXJbTUFYX1BBVEhdLHRwYXRoW01BWF9QQVRIXTsKKyAgRFdPUkQgdHlwZSx0cGF0aGxlbj1NQVhfUEFUSCxkd2Rpc3A7CisgIEhLRVkgIGtleTsKKworCVRSQUNFKHNoZWxsLCIocGlkbD0lcCwlcClcbiIscGlkbCxwc3pQYXRoKTsKKworICBpZiAoIXBpZGwpCisgIHsgIHN0cmNweShidWZmZXIsIlNvZnR3YXJlXFxNaWNyb3NvZnRcXFdpbmRvd3NcXEN1cnJlbnRWZXJzaW9uXFxFeHBsb3JlclxcU2hlbGwgRm9sZGVyc1xcIik7CisKKyAgICAgaWYgKFJlZ0NyZWF0ZUtleUV4MzJBKEhLRVlfQ1VSUkVOVF9VU0VSLGJ1ZmZlciwwLE5VTEwsUkVHX09QVElPTl9OT05fVk9MQVRJTEUsS0VZX1dSSVRFLE5VTEwsJmtleSwmZHdkaXNwKSkKKyAgICAgeyByZXR1cm4gRV9PVVRPRk1FTU9SWTsKKyAgICAgfQorICAgICB0eXBlPVJFR19TWjsgICAgCisgICAgIHN0cmNweSAoYnVmZmVyLCJEZXNrdG9wIik7CQkJCQkvKnJlZ2lzdHJ5IG5hbWUqLworICAgICBpZiAoIFJlZ1F1ZXJ5VmFsdWVFeDMyQShrZXksYnVmZmVyLE5VTEwsJnR5cGUsdHBhdGgsJnRwYXRobGVuKSkKKyAgICAgeyBHZXRXaW5kb3dzRGlyZWN0b3J5MzJBKHRwYXRoLE1BWF9QQVRIKTsKKyAgICAgICBQYXRoQWRkQmFja3NsYXNoKHRwYXRoKTsKKyAgICAgICBzdHJjYXQgKHRwYXRoLCJEZXNrdG9wIik7CQkJCS8qZm9sZGVyIG5hbWUqLworICAgICAgIFJlZ1NldFZhbHVlRXgzMkEoa2V5LGJ1ZmZlciwwLFJFR19TWix0cGF0aCx0cGF0aGxlbik7CisgICAgICAgQ3JlYXRlRGlyZWN0b3J5MzJBKHRwYXRoLE5VTEwpOworICAgICB9CisgICAgIFJlZ0Nsb3NlS2V5KGtleSk7CisgICAgIHN0cmNweShwc3pQYXRoLHRwYXRoKTsKKyAgfQorICBlbHNlCisgIHsgaWYgKFNIR2V0RGVza3RvcEZvbGRlcigmc2hlbGxmb2xkZXIpPT1TX09LKQorCXsgc2hlbGxmb2xkZXItPmxwdnRibC0+Zm5HZXREaXNwbGF5TmFtZU9mKHNoZWxsZm9sZGVyLHBpZGwsU0hHRE5fRk9SUEFSU0lORywmbHBOYW1lKTsKKwkgIHNoZWxsZm9sZGVyLT5scHZ0YmwtPmZuUmVsZWFzZShzaGVsbGZvbGRlcik7CisJfQorICAvKldpZGVDaGFyVG9Mb2NhbDMyKHBzelBhdGgsIGxwTmFtZS51LnBPbGVTdHIsIE1BWF9QQVRIKTsqLworCXN0cmNweShwc3pQYXRoLGxwTmFtZS51LmNTdHIpOworCS8qIGZpeG1lIGZyZWUgdGhlIG9sZXN0cmluZyovCisgIH0KKwlUUkFDRShzaGVsbCwiLS0gKCVzKVxuIixwc3pQYXRoKTsKKwlyZXR1cm4gTk9FUlJPUjsKK30KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBTSEdldFBhdGhGcm9tSURMaXN0MzJXIFtTSEVMTDMyLjI2Ml0KKyAqLworRFdPUkQgV0lOQVBJIFNIR2V0UGF0aEZyb21JRExpc3QzMlcgKExQQ0lURU1JRExJU1QgcGlkbCxMUFdTVFIgcHN6UGF0aCkKK3sgRklYTUUgKHNoZWxsLCIocGlkbD0lcCAlcyk6c3R1Yi5cbiIsIHBpZGwsIGRlYnVnc3RyX3cocHN6UGF0aCkpOworICByZXR1cm4gMDsKK30KKworCit2b2lkIChDQUxMQkFDSyogcERMTEluaXRDb21jdGwpKCk7CitJTlQzMiAoQ0FMTEJBQ0sqIHBJbWFnZUxpc3RfQWRkSWNvbikgKEhJTUFHRUxJU1QgaGltbCwgSElDT04zMiBoSWNvbik7CitJTlQzMihDQUxMQkFDSyogcEltYWdlTGlzdF9SZXBsYWNlSWNvbikgKEhJTUFHRUxJU1QsIElOVDMyLCBISUNPTjMyKTsKK0hJTUFHRUxJU1QgKENBTExCQUNLICogcEltYWdlTGlzdF9DcmVhdGUpIChJTlQzMixJTlQzMixVSU5UMzIsSU5UMzIsSU5UMzIpOworSElDT04zMiAoQ0FMTEJBQ0sgKiBwSW1hZ2VMaXN0X0dldEljb24pIChISU1BR0VMSVNULCBJTlQzMiwgVUlOVDMyKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFNIRUxMMzIgTGliTWFpbgorICoKKyAqIEZJWE1FCisgKiAgYXQgdGhlIG1vbWVudCB0aGUgaWNvbnMgYXJlIGV4dHJhY3RlZCBmcm9tIHNoZWxsMzIuZGxsCisgKiAgZnJlZSB0aGUgaW1hZ2VsaXN0cworICovCitISU5TVEFOQ0UzMiBzaGVsbDMyX2hJbnN0YW5jZTsgCisKK0JPT0wzMiBXSU5BUEkgU2hlbGwzMkxpYk1haW4oSElOU1RBTkNFMzIgaGluc3RETEwsIERXT1JEIGZkd1JlYXNvbiwgTFBWT0lEIGxwdlJlc2VydmVkKQoreyBISUNPTjMyIGh0bXBJY29uOworICBVSU5UMzIgaWljb25pbmRleDsKKyAgVUlOVDMyIGluZGV4OworICBDSEFSICAgc3pTaGVsbFBhdGhbTUFYX1BBVEhdOworICBISU5TVEFOQ0UzMiBoQ29tY3RsMzI7CisgIAorCisgIFRSQUNFKHNoZWxsLCIweCV4IDB4JWx4ICVwXG4iLCBoaW5zdERMTCwgZmR3UmVhc29uLCBscHZSZXNlcnZlZCk7CisKKyAgc2hlbGwzMl9oSW5zdGFuY2UgPSBoaW5zdERMTDsKKyAgCisgIEdldFdpbmRvd3NEaXJlY3RvcnkzMkEoc3pTaGVsbFBhdGgsTUFYX1BBVEgpOworICBQYXRoQWRkQmFja3NsYXNoKHN6U2hlbGxQYXRoKTsKKyAgc3RyY2F0KHN6U2hlbGxQYXRoLCJzeXN0ZW1cXHNoZWxsMzIuZGxsIik7CisgICAgICAgCisgIGlmIChmZHdSZWFzb249PURMTF9QUk9DRVNTX0FUVEFDSCkKKyAgeyBoQ29tY3RsMzIgPSBMb2FkTGlicmFyeTMyQSgiQ09NQ1RMMzIuRExMIik7CQorICAgIGlmIChoQ29tY3RsMzIpCisgICAgeyBwRExMSW5pdENvbWN0bD1HZXRQcm9jQWRkcmVzczMyKGhDb21jdGwzMiwiSW5pdENvbW1vbkNvbnRyb2xzRXgiKTsKKyAgICAgIGlmIChwRExMSW5pdENvbWN0bCkKKyAgICAgIHsgcERMTEluaXRDb21jdGwoKTsKKyAgICAgIH0KKyAgICAgIHBJbWFnZUxpc3RfQ3JlYXRlPUdldFByb2NBZGRyZXNzMzIoaENvbWN0bDMyLCJJbWFnZUxpc3RfQ3JlYXRlIik7CisgICAgICBwSW1hZ2VMaXN0X0FkZEljb249R2V0UHJvY0FkZHJlc3MzMihoQ29tY3RsMzIsIkltYWdlTGlzdF9BZGRJY29uIik7CisgICAgICBwSW1hZ2VMaXN0X1JlcGxhY2VJY29uPUdldFByb2NBZGRyZXNzMzIoaENvbWN0bDMyLCJJbWFnZUxpc3RfUmVwbGFjZUljb24iKTsKKyAgICAgIHBJbWFnZUxpc3RfR2V0SWNvbj1HZXRQcm9jQWRkcmVzczMyKGhDb21jdGwzMiwiSW1hZ2VMaXN0X0dldEljb24iKTsKKyAgICAgIEZyZWVMaWJyYXJ5MzIoaENvbWN0bDMyKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsgLyogcGFuaWMsIGltZWRpYXRlbHkgZXhpdCB3aW5lKi8KKyAgICAgIEVSUihzaGVsbCwiUCBBIE4gSSBDIGVycm9yIGdldHRpbmcgZnVuY3Rpb25wb2ludGVyc1xuIik7CisgICAgICBleGl0ICgxKTsKKyAgICB9CisgICAgaWYgKCAhIFNoZWxsU21hbGxJY29uTGlzdCApCisgICAgeyBpZiAoIChTaGVsbFNtYWxsSWNvbkxpc3QgPSBwSW1hZ2VMaXN0X0NyZWF0ZShzeXNNZXRyaWNzW1NNX0NYU01JQ09OXSxzeXNNZXRyaWNzW1NNX0NZU01JQ09OXSwweDEwMSwwLDB4MjApKSApCisgICAgICB7IGZvciAoaW5kZXg9MDtpbmRleCA8IDQwOyBpbmRleCsrKQorICAgICAgICB7IGlmICggISAoIGh0bXBJY29uID0gRXh0cmFjdEljb24zMkEoaGluc3RETEwsIHN6U2hlbGxQYXRoLCBpbmRleCkpCisgICAgICAgICAgfHwgKCAtMSA9PSAoaWljb25pbmRleCA9IHBJbWFnZUxpc3RfQWRkSWNvbiAoU2hlbGxTbWFsbEljb25MaXN0LCBodG1wSWNvbikpKSApCisgICAgICAgICAgeyBFUlIoc2hlbGwsImNvdWxkIG5vdCBpbml0aWFsaXplIGljb25saXN0IChpcyBzaGVsbDMyLmRsbCBpbiB0aGUgc3lzdGVtIGRpcmVjdG9yeT8pXG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBpZiAoICEgU2hlbGxCaWdJY29uTGlzdCApCisgICAgeyBpZiAoIChTaGVsbEJpZ0ljb25MaXN0ID0gcEltYWdlTGlzdF9DcmVhdGUoU1lTTUVUUklDU19DWFNNSUNPTiwgU1lTTUVUUklDU19DWVNNSUNPTiwweDEwMSwwLDB4MjApKSApCisgICAgICB7IGZvciAoaW5kZXg9MDtpbmRleCA8IDQwOyBpbmRleCsrKQorICAgICAgICB7IGlmICggISAoaHRtcEljb24gPSBFeHRyYWN0SWNvbjMyQSggaGluc3RETEwsIHN6U2hlbGxQYXRoLCBpbmRleCkpIAorICAgICAgICAgICB8fCAoLTEgPT0gKGlpY29uaW5kZXggPSBwSW1hZ2VMaXN0X0FkZEljb24gKFNoZWxsQmlnSWNvbkxpc3QsIGh0bXBJY29uKSkpICkKKyAgICAgICAgICB7IEVSUihzaGVsbCwiY291bGQgbm90IGluaXRpYWxpemUgaWNvbmxpc3QgKGlzIHNoZWxsMzIuZGxsIGluIHRoZSBzeXN0ZW0gZGlyZWN0b3J5PylcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIFRSQUNFKHNoZWxsLCJoSWNvblNtYWxsPSVwIGhJY29uQmlnPSVwXG4iLFNoZWxsU21hbGxJY29uTGlzdCwgU2hlbGxCaWdJY29uTGlzdCk7CisgIH0KKyAgcmV0dXJuIFRSVUU7Cit9CmRpZmYgLS1naXQgYS9kbGxzL3NoZWxsMzIvc2hlbGwzMl9tYWluLmggYi9kbGxzL3NoZWxsMzIvc2hlbGwzMl9tYWluLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGEwZDg0MwotLS0gL2Rldi9udWxsCisrKyBiL2RsbHMvc2hlbGwzMi9zaGVsbDMyX21haW4uaApAQCAtMCwwICsxLDMxIEBACisvKgorICogCWludGVybmFsIFNoZWxsMzIgTGlicmFyeSBkZWZpbml0aW9ucworICovCisKKyNpZm5kZWYgX19XSU5FX1NIRUxMX01BSU5fSAorI2RlZmluZSBfX1dJTkVfU0hFTExfTUFJTl9ICisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqICBnbG9iYWwgU0hFTEwzMi5ETEwgdmFyaWFibGVzCisqLworZXh0ZXJuIEhJTlNUQU5DRTMyIHNoZWxsMzJfaEluc3RhbmNlOworZXh0ZXJuIFVJTlQzMiAgICAgIHNoZWxsMzJfRGxsUmVmQ291bnQ7CitleHRlcm4gSElNQUdFTElTVCBTaGVsbFNtYWxsSWNvbkxpc3Q7CitleHRlcm4gSElNQUdFTElTVCBTaGVsbEJpZ0ljb25MaXN0OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBwb2ludGVyIHRvIGZ1bmN0aW9ucyBkeW5hbWljYWxseSBsb2FkZWQKKyovCitleHRlcm4gdm9pZCAoQ0FMTEJBQ0sqIHBETExJbml0Q29tY3RsKSgpOworZXh0ZXJuIElOVDMyIChDQUxMQkFDSyogcEltYWdlTGlzdF9BZGRJY29uKSAoSElNQUdFTElTVCBoaW1sLCBISUNPTjMyIGhJY29uKTsKK2V4dGVybiBJTlQzMihDQUxMQkFDSyogcEltYWdlTGlzdF9SZXBsYWNlSWNvbikgKEhJTUFHRUxJU1QsIElOVDMyLCBISUNPTjMyKTsKK2V4dGVybiBISU1BR0VMSVNUIChDQUxMQkFDSyAqIHBJbWFnZUxpc3RfQ3JlYXRlKSAoSU5UMzIsSU5UMzIsVUlOVDMyLElOVDMyLElOVDMyKTsKK2V4dGVybiBISUNPTjMyIChDQUxMQkFDSyAqIHBJbWFnZUxpc3RfR2V0SWNvbikgKEhJTUFHRUxJU1QsIElOVDMyLCBVSU5UMzIpOworCisvKiBGSVhNRSBzaG91bGQgYmUgbW92ZWQgdG8gYSBoZWFkZXIgZmlsZS4gSXNFcXVhbEdVSUQgCitpcyBkZWNsYXJlZCBidXQgbm90IGV4cG9ydGVkIGluIGNvbXBvYmouYyAhISEqLworI2RlZmluZSBJc0VxdWFsR1VJRChyZ3VpZDEsIHJndWlkMikgKCFtZW1jbXAocmd1aWQxLCByZ3VpZDIsIHNpemVvZihHVUlEKSkpCisjZGVmaW5lIElzRXF1YWxJSUQocmlpZDEsIHJpaWQyKSBJc0VxdWFsR1VJRChyaWlkMSwgcmlpZDIpCisjZGVmaW5lIElzRXF1YWxDTFNJRChyY2xzaWQxLCByY2xzaWQyKSBJc0VxdWFsR1VJRChyY2xzaWQxLCByY2xzaWQyKQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RsbHMvc2hlbGwzMi9zaGVsbG9sZS5jIGIvZGxscy9zaGVsbDMyL3NoZWxsb2xlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmJiYzQyZQotLS0gL2Rldi9udWxsCisrKyBiL2RsbHMvc2hlbGwzMi9zaGVsbG9sZS5jCkBAIC0wLDAgKzEsMzQ2IEBACisvKgorICoJU2hlbGwgRm9sZGVyIHN0dWZmICguLi5hbmQgYWxsIHRoZSBPTEUtT2JqZWN0cyBvZiBTSEVMTDMyLkRMTCkKKyAqCisgKglDb3B5cmlnaHQgMTk5NwlNYXJjdXMgTWVpc3NuZXIKKyAqCUNvcHlyaWdodCAxOTk4CUp1ZXJnZW4gU2NobWllZCAgPGp1ZXJnZW4uc2NobWllZEBtZXRyb25ldC5kZT4KKyAqCisgKi8KKworI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSAib2xlLmgiCisjaW5jbHVkZSAib2xlMi5oIgorI2luY2x1ZGUgImRlYnVnLmgiCisjaW5jbHVkZSAiY29tcG9iai5oIgorI2luY2x1ZGUgImludGVyZmFjZXMuaCIKKyNpbmNsdWRlICJzaGxvYmouaCIKKyNpbmNsdWRlICJzaGVsbC5oIgorI2luY2x1ZGUgIndpbmVycm9yLmgiCisjaW5jbHVkZSAid2lubmxzLmgiCisjaW5jbHVkZSAid2lucHJvYy5oIgorI2luY2x1ZGUgImNvbW1jdHJsLmgiCisKKyNpbmNsdWRlICJzaGVsbDMyX21haW4uaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKi8KK3R5cGVkZWYgRFdPUkQgKCogV0lOQVBJIEdldENsYXNzUHRyKShSRUZDTFNJRCxSRUZJSUQsTFBWT0lEKTsKKworc3RhdGljIEdldENsYXNzUHRyIFNIX2ZpbmRfbW9kdWxlcHJvYyhMUFNUUiBkbGxuYW1lLEhNT0RVTEUzMiAqeGhtb2QsTFBTVFIgbmFtZSkKK3sgSE1PRFVMRTMyICBobW9kOworCUZBUlBST0MzMglkbGx1bmxvYWQsbmFtZXByb2M7CisKKwlpZiAoeGhtb2QpCisgICAgeyAqeGhtb2QgPSAwOworICAgIH0KKwlpZiAoIXN0cmNhc2VjbXAoUGF0aEZpbmRGaWxlbmFtZShkbGxuYW1lKSwic2hlbGwzMi5kbGwiKSkKKwl7IHJldHVybiAoR2V0Q2xhc3NQdHIpU0hFTEwzMl9EbGxHZXRDbGFzc09iamVjdDsKKyAgICB9CisKKwlobW9kID0gTG9hZExpYnJhcnlFeDMyQShkbGxuYW1lLDAsTE9BRF9XSVRIX0FMVEVSRURfU0VBUkNIX1BBVEgpOworCWlmICghaG1vZCkKKwl7IHJldHVybiBOVUxMOworICAgIH0KKwlkbGx1bmxvYWQgPSBHZXRQcm9jQWRkcmVzczMyKGhtb2QsIkRsbENhblVubG9hZE5vdyIpOworCWlmICghZGxsdW5sb2FkKQorCXsgaWYgKHhobW9kKQorICAgICAgeyAqeGhtb2QgPSBobW9kOworICAgICAgfQorICAgIH0KKwluYW1lcHJvYyA9IEdldFByb2NBZGRyZXNzMzIoaG1vZCxuYW1lKTsKKwlpZiAoIW5hbWVwcm9jKQorICAgIHsgRnJlZUxpYnJhcnkzMihobW9kKTsKKwkgIHJldHVybiBOVUxMOworCX0KKwkvKiByZWdpc3RlciB1bmxvYWRhYmxlIGRsbCB3aXRoIHVubG9hZHByb2MgLi4uICovCisJcmV0dXJuIChHZXRDbGFzc1B0ciluYW1lcHJvYzsKK30KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICovCitzdGF0aWMgRFdPUkQgU0hfZ2V0X2luc3RhbmNlKFJFRkNMU0lEIGNsc2lkLExQU1RSIGRsbG5hbWUsTFBWT0lEIHVua25vd25vdXRlcixSRUZJSUQgcmVmaWlkLExQVk9JRCBpbnN0KSAKK3sJR2V0Q2xhc3NQdHIgICAgIGRsbGdldGNsYXNzb2I7CisJRFdPUkQJCWhyZXM7CisJTFBDTEFTU0ZBQ1RPUlkJY2xhc3NmYWM7CisKKwljaGFyCXhjbHNpZFs1MF0seHJlZmlpZFs1MF07CisJV0lORV9TdHJpbmdGcm9tQ0xTSUQoKExQQ0xTSUQpY2xzaWQseGNsc2lkKTsKKwlXSU5FX1N0cmluZ0Zyb21DTFNJRCgoTFBDTFNJRClyZWZpaWQseHJlZmlpZCk7CisJVFJBQ0Uoc2hlbGwsIlxuXHRDTFNJRDolcywlcywlcCxcblx0SUlEOiVzLCVwXG4iLHhjbHNpZCwgZGxsbmFtZSx1bmtub3dub3V0ZXIseHJlZmlpZCxpbnN0KTsKKwkKKwlkbGxnZXRjbGFzc29iID0gU0hfZmluZF9tb2R1bGVwcm9jKGRsbG5hbWUsTlVMTCwiRGxsR2V0Q2xhc3NPYmplY3QiKTsKKwlpZiAoIWRsbGdldGNsYXNzb2IpCisJeyByZXR1cm4gMHg4MDA3MDAwMHxHZXRMYXN0RXJyb3IoKTsKKyAgICB9CisKKy8qIEZJWE1FICovCisvKgorCWhyZXMgPSAoKmRsbGdldGNsYXNzb2IpKGNsc2lkLChSRUZJSUQpJklJRF9JQ2xhc3NGYWN0b3J5LGluc3QpOworCWlmIChocmVzPDApCisJCXJldHVybiBocmVzOworCisgKi8KKwlocmVzID0gKCpkbGxnZXRjbGFzc29iKShjbHNpZCwoUkVGSUlEKSZJSURfSUNsYXNzRmFjdG9yeSwmY2xhc3NmYWMpOworCWlmIChocmVzPDAgfHwgKGhyZXM+PTB4ODAwMDAwMDApKQorCXsgcmV0dXJuIGhyZXM7CisgICAgfQorCWlmICghY2xhc3NmYWMpCisgICAgeyBGSVhNRShzaGVsbCwibm8gY2xhc3NmYWN0b3J5LCBidXQgaHJlcyBpcyAweCVsZCFcbiIsaHJlcyk7CisJICByZXR1cm4gRV9GQUlMOworCX0KKwljbGFzc2ZhYy0+bHB2dGJsLT5mbkNyZWF0ZUluc3RhbmNlKGNsYXNzZmFjLHVua25vd25vdXRlcixyZWZpaWQsaW5zdCk7CisJY2xhc3NmYWMtPmxwdnRibC0+Zm5SZWxlYXNlKGNsYXNzZmFjKTsKKwlyZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFNIQ29DcmVhdGVJbnN0YW5jZSBbU0hFTEwzMi4xMDJdCisgKiAKKyAqIE5PVEVTCisgKiAgICAgZXhwb3J0ZWQgYnkgb3JkaW5hbAorICovCitMUkVTVUxUIFdJTkFQSSBTSENvQ3JlYXRlSW5zdGFuY2UoTFBTVFIgYWNsc2lkLENMU0lEICpjbHNpZCxMUFVOS05PV04gdW5rbm93bm91dGVyLFJFRklJRCByZWZpaWQsTFBWT0lEIGluc3QpCit7CWNoYXIJYnVmZmVyWzI1Nl0seGNsc2lkWzQ4XSx4aWlkWzQ4XSxwYXRoWzI2MF0sdG1vZGVsWzEwMF07CisJSEtFWQlpbnByb2NrZXk7CisJRFdPUkQJcGF0aGxlbix0eXBlLHRtb2RlbGxlbjsKKwlEV09SRAlocmVzOworCQorCVdJTkVfU3RyaW5nRnJvbUNMU0lEKHJlZmlpZCx4aWlkKTsKKworCWlmIChjbHNpZCkKKwl7IFdJTkVfU3RyaW5nRnJvbUNMU0lEKGNsc2lkLHhjbHNpZCk7CisgICAgfQorCWVsc2UKKwl7IGlmICghYWNsc2lkKQorCSAgewlyZXR1cm4gMHg4MDA0MDE1NDsKKyAgICAgIH0KKwkgIHN0cmNweSh4Y2xzaWQsYWNsc2lkKTsKKwl9CisJVFJBQ0Uoc2hlbGwsIiglcCxcblx0U0lEOlx0JXMsJXAsXG5cdElJRDpcdCVzLCVwKVxuIixhY2xzaWQseGNsc2lkLHVua25vd25vdXRlcix4aWlkLGluc3QpOworCisJc3ByaW50ZihidWZmZXIsIkNMU0lEXFwlc1xcSW5Qcm9jU2VydmVyMzIiLHhjbHNpZCk7CisKKwlpZiAoUmVnT3BlbktleUV4MzJBKEhLRVlfQ0xBU1NFU19ST09ULGJ1ZmZlciwwLDB4MDIwMDAwMDAsJmlucHJvY2tleSkpCisJeyByZXR1cm4gU0hfZ2V0X2luc3RhbmNlKGNsc2lkLCJzaGVsbDMyLmRsbCIsdW5rbm93bm91dGVyLHJlZmlpZCxpbnN0KTsKKyAgICB9CisJcGF0aGxlbj1zaXplb2YocGF0aCk7CisKKwlpZiAoUmVnUXVlcnlWYWx1ZTMyQShpbnByb2NrZXksTlVMTCxwYXRoLCZwYXRobGVuKSkKKyAgICB7IFJlZ0Nsb3NlS2V5KGlucHJvY2tleSk7CisJICByZXR1cm4gU0hfZ2V0X2luc3RhbmNlKGNsc2lkLCJzaGVsbDMyLmRsbCIsdW5rbm93bm91dGVyLHJlZmlpZCxpbnN0KTsKKwl9CisKKwlUUkFDRShzaGVsbCwgIlNlcnZlciBkbGwgaXMgJXNcbiIscGF0aCk7CisJdG1vZGVsbGVuPXNpemVvZih0bW9kZWwpOworCXR5cGU9UkVHX1NaOworCWlmIChSZWdRdWVyeVZhbHVlRXgzMkEoaW5wcm9ja2V5LCJUaHJlYWRpbmdNb2RlbCIsTlVMTCwmdHlwZSx0bW9kZWwsJnRtb2RlbGxlbikpCisgICAgeyBSZWdDbG9zZUtleShpbnByb2NrZXkpOworCSAgcmV0dXJuIFNIX2dldF9pbnN0YW5jZShjbHNpZCwic2hlbGwzMi5kbGwiLHVua25vd25vdXRlcixyZWZpaWQsaW5zdCk7CisJfQorCisJVFJBQ0Uoc2hlbGwsICJUaHJlYWRpbmcgbW9kZWwgaXMgJXNcbiIsdG1vZGVsKTsKKworCWhyZXM9U0hfZ2V0X2luc3RhbmNlKGNsc2lkLHBhdGgsdW5rbm93bm91dGVyLHJlZmlpZCxpbnN0KTsKKwlpZiAoaHJlczwwKQorICAgIHsgaHJlcz1TSF9nZXRfaW5zdGFuY2UoY2xzaWQsInNoZWxsMzIuZGxsIix1bmtub3dub3V0ZXIscmVmaWlkLGluc3QpOworICAgIH0KKwlSZWdDbG9zZUtleShpbnByb2NrZXkpOworCXJldHVybiBocmVzOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBTSEVMTDMyX0RsbEdldENsYXNzT2JqZWN0ICAgW1NIRUxMMzIuMTI4XQorICoKKyAqIFtTdGFuZGFydCBPTEUvQ09NIEludGVyZmFjZSBNZXRob2RdCisgKiBUaGlzIEZ1bmN0aW9uIHJldHJpdmVzIHRoZSBwb2ludGVyIHRvIGEgc3BlY2lmaWVkIGludGVyZmFjZSAoaWlkKSBvZgorICogYSBnaXZlbiBjbGFzcyAocmNsc2lkKS4KKyAqIFdpdGggdGhpcyBwb2ludGVyIGl0J3MgcG9zc2libGUgdG8gY2FsbCB0aGUgSUNsYXNzRmFjdG9yeV9DcmVhdGVJbnN0YW5jZQorICogbWV0aG9kIHRvIGdldCBhIGluc3RhbmNlIG9mIHRoZSByZXF1ZXN0ZWQgQ2xhc3MuCisgKiBUaGlzIGZ1bmN0aW9uIGRvZXMgTk9UIGluc3RhbnRpYXRlIHRoZSBDbGFzcyEhIQorICogCisgKiBSRVRVUk5TCisgKiAgIEhSRVNVTFQKKyAqCisgKi8KK0RXT1JEIFdJTkFQSSBTSEVMTDMyX0RsbEdldENsYXNzT2JqZWN0KFJFRkNMU0lEIHJjbHNpZCxSRUZJSUQgaWlkLExQVk9JRCAqcHB2KQorewlIUkVTVUxUCWhyZXMgPSBFX09VVE9GTUVNT1JZOworCUxQQ0xBU1NGQUNUT1JZIGxwY2xmOworCisJY2hhciB4Y2xzaWRbNTBdLHhpaWRbNTBdOworCVdJTkVfU3RyaW5nRnJvbUNMU0lEKChMUENMU0lEKXJjbHNpZCx4Y2xzaWQpOworCVdJTkVfU3RyaW5nRnJvbUNMU0lEKChMUENMU0lEKWlpZCx4aWlkKTsKKwlUUkFDRShzaGVsbCwiXG5cdENMU0lEOlx0JXMsXG5cdElJRDpcdCVzXG4iLHhjbHNpZCx4aWlkKTsKKwkKKwkqcHB2ID0gTlVMTDsKKwlpZihJc0VxdWFsQ0xTSUQocmNsc2lkLCAmQ0xTSURfU2hlbGxEZXNrdG9wKXx8IAorCSAgIElzRXF1YWxDTFNJRChyY2xzaWQsICZDTFNJRF9TaGVsbExpbmspKQorCXsgaWYoSXNFcXVhbENMU0lEKHJjbHNpZCwgJkNMU0lEX1NoZWxsRGVza3RvcCkpICAgICAgLypkZWJ1ZyovCisJICB7IFRSQUNFKHNoZWxsLCJyZXF1ZXN0ZWQgQ0xTSURfU2hlbGxEZXNrdG9wXG4iKTsKKyAgICAgIH0KKwkgIGlmKElzRXF1YWxDTFNJRChyY2xzaWQsICZDTFNJRF9TaGVsbExpbmspKSAgICAgICAgIC8qZGVidWcqLworCSAgeyBUUkFDRShzaGVsbCwicmVxdWVzdGVkIENMU0lEX1NoZWxsTGlua1xuIik7CisgICAgICB9CisJICBscGNsZiA9IElDbGFzc0ZhY3RvcnlfQ29uc3RydWN0b3IoKTsKKwkgIGlmKGxwY2xmKQorCSAgeyBocmVzID0gbHBjbGYtPmxwdnRibC0+Zm5RdWVyeUludGVyZmFjZShscGNsZixpaWQsIHBwdik7CisJCWxwY2xmLT5scHZ0YmwtPmZuUmVsZWFzZShscGNsZik7CisJICB9CisJfQorCWVsc2UKKwl7IFdBUk4oc2hlbGwsICJjbHNpZCglcykgbm90IGluIGJ1aWxkaW4gU0hFTEwzMlxuIix4Y2xzaWQpOworCSAgaHJlcyA9IENMQVNTX0VfQ0xBU1NOT1RBVkFJTEFCTEU7CisJfQorCVRSQUNFKHNoZWxsLCJSRVRVUk4gcG9pbnRlciB0byBpbnRlcmZhY2U6ICVwXG4iLHBwdik7CisJcmV0dXJuIGhyZXM7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgkJCSBTSEdldE1hbGxvYwkJCVtTSEVMTDMyLjIyMF0KKyAqIHJldHVybnMgdGhlIGludGVyZmFjZSB0byBzaGVsbCBtYWxsb2MuCisgKgorICogW1NESyBoZWFkZXIgd2luOTUvc2hsb2JqLmg6CisgKiBlcXVpdmFsZW50IHRvOiAgI2RlZmluZSBTSEdldE1hbGxvYyhwcG1lbSkgICBDb0dldE1hbGxvYyhNRU1DVFhfVEFTSywgcHBtZW0pCisgKiBdCisgKiBXaGF0IHdlIGFyZSBjdXJyZW50bHkgZG9pbmcgaXMgbm90IHZlcnkgd3JvbmcsIHNpbmNlIHdlIGFsd2F5cyB1c2UgdGhlIHNhbWUKKyAqIGhlYXAgKFByb2Nlc3NIZWFwKS4KKyAqLworRFdPUkQgV0lOQVBJIFNIR2V0TWFsbG9jKExQTUFMTE9DMzIgKmxwbWFsKSAKK3sJVFJBQ0Uoc2hlbGwsIiglcClcbiIsIGxwbWFsKTsKKwlyZXR1cm4gQ29HZXRNYWxsb2MzMigwLGxwbWFsKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqICBJQ2xhc3NGYWN0b3J5IEltcGxlbWVudGF0aW9uCisqLworc3RhdGljIEhSRVNVTFQgV0lOQVBJIElDbGFzc0ZhY3RvcnlfUXVlcnlJbnRlcmZhY2UoTFBDTEFTU0ZBQ1RPUlksUkVGSUlELExQVk9JRCopOworc3RhdGljIFVMT05HIFdJTkFQSSBJQ2xhc3NGYWN0b3J5X0FkZFJlZihMUENMQVNTRkFDVE9SWSk7CitzdGF0aWMgVUxPTkcgV0lOQVBJIElDbGFzc0ZhY3RvcnlfUmVsZWFzZShMUENMQVNTRkFDVE9SWSk7CitzdGF0aWMgSFJFU1VMVCBXSU5BUEkgSUNsYXNzRmFjdG9yeV9DcmVhdGVJbnN0YW5jZSgpOworc3RhdGljIEhSRVNVTFQgV0lOQVBJIElDbGFzc0ZhY3RvcnlfTG9ja1NlcnZlcigpOworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgSUNsYXNzRmFjdG9yeV9WVGFibGUKKyAqLworc3RhdGljIElDbGFzc0ZhY3RvcnlfVlRhYmxlIGNsZnZ0ID0gCit7CUlDbGFzc0ZhY3RvcnlfUXVlcnlJbnRlcmZhY2UsCisJSUNsYXNzRmFjdG9yeV9BZGRSZWYsCisJSUNsYXNzRmFjdG9yeV9SZWxlYXNlLAorCUlDbGFzc0ZhY3RvcnlfQ3JlYXRlSW5zdGFuY2UsCisJSUNsYXNzRmFjdG9yeV9Mb2NrU2VydmVyCit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBJQ2xhc3NGYWN0b3J5X0NvbnN0cnVjdG9yCisgKi8KKworTFBDTEFTU0ZBQ1RPUlkgSUNsYXNzRmFjdG9yeV9Db25zdHJ1Y3RvcigpCit7CUxQQ0xBU1NGQUNUT1JZCWxwY2xmOworCisJbHBjbGY9IChMUENMQVNTRkFDVE9SWSlIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwwLHNpemVvZihJQ2xhc3NGYWN0b3J5KSk7CisJbHBjbGYtPnJlZiA9IDE7CisJbHBjbGYtPmxwdnRibCA9ICZjbGZ2dDsKKyAgVFJBQ0Uoc2hlbGwsIiglcCktPigpXG4iLGxwY2xmKTsKKwlyZXR1cm4gbHBjbGY7Cit9CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBJQ2xhc3NGYWN0b3J5OjpRdWVyeUludGVyZmFjZQorICovCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkgSUNsYXNzRmFjdG9yeV9RdWVyeUludGVyZmFjZSgKKyAgTFBDTEFTU0ZBQ1RPUlkgdGhpcywgUkVGSUlEIHJpaWQsIExQVk9JRCAqcHB2T2JqKQoreyAgY2hhcgl4cmlpZFs1MF07CisgICBXSU5FX1N0cmluZ0Zyb21DTFNJRCgoTFBDTFNJRClyaWlkLHhyaWlkKTsKKyAgIFRSQUNFKHNoZWxsLCIoJXApLT4oXG5cdElJRDpcdCVzKVxuIix0aGlzLHhyaWlkKTsKKworICAqcHB2T2JqID0gTlVMTDsKKworICBpZihJc0VxdWFsSUlEKHJpaWQsICZJSURfSVVua25vd24pKSAgICAgICAgICAvKklVbmtub3duKi8KKyAgeyAqcHB2T2JqID0gdGhpczsgCisgIH0KKyAgZWxzZSBpZihJc0VxdWFsSUlEKHJpaWQsICZJSURfSUNsYXNzRmFjdG9yeSkpICAvKklDbGFzc0ZhY3RvcnkqLworICB7ICAgICpwcHZPYmogPSAoSUNsYXNzRmFjdG9yeSopdGhpczsKKyAgfSAgIAorCisgIGlmKCpwcHZPYmopCisgIHsgKCooTFBDTEFTU0ZBQ1RPUlkqKXBwdk9iaiktPmxwdnRibC0+Zm5BZGRSZWYodGhpcyk7ICAJCisgICAgVFJBQ0Uoc2hlbGwsIi0tIEludGVyZmFjZTogKCVwKS0+KCVwKVxuIixwcHZPYmosKnBwdk9iaik7CisgICAgcmV0dXJuIFNfT0s7CisgIH0KKwlUUkFDRShzaGVsbCwiLS0gSW50ZXJmYWNlOiBFX05PSU5URVJGQUNFXG4iKTsKKyAgcmV0dXJuIEVfTk9JTlRFUkZBQ0U7Cit9ICAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIElDbGFzc0ZhY3RvcnlfQWRkUmVmCisgKi8KK3N0YXRpYyBVTE9ORyBXSU5BUEkgSUNsYXNzRmFjdG9yeV9BZGRSZWYoTFBDTEFTU0ZBQ1RPUlkgdGhpcykKK3sgVFJBQ0Uoc2hlbGwsIiglcCktPihjb3VudD0lbHUpXG4iLHRoaXMsdGhpcy0+cmVmKTsKKwlyZXR1cm4gKysodGhpcy0+cmVmKTsKK30KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIElDbGFzc0ZhY3RvcnlfUmVsZWFzZQorICovCitzdGF0aWMgVUxPTkcgV0lOQVBJIElDbGFzc0ZhY3RvcnlfUmVsZWFzZShMUENMQVNTRkFDVE9SWSB0aGlzKQorewlUUkFDRShzaGVsbCwiKCVwKS0+KGNvdW50PSVsdSlcbiIsdGhpcyx0aGlzLT5yZWYpOworCWlmICghLS0odGhpcy0+cmVmKSkgCisJeyBUUkFDRShzaGVsbCwiLS0gZGVzdHJveWluZyBJQ2xhc3NGYWN0b3J5KCVwKVxuIix0aGlzKTsKKwkJSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwwLHRoaXMpOworCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIHRoaXMtPnJlZjsKK30KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIElDbGFzc0ZhY3RvcnlfQ3JlYXRlSW5zdGFuY2UKKyAqLworc3RhdGljIEhSRVNVTFQgV0lOQVBJIElDbGFzc0ZhY3RvcnlfQ3JlYXRlSW5zdGFuY2UoCisgIExQQ0xBU1NGQUNUT1JZIHRoaXMsIExQVU5LTk9XTiBwVW5rbm93biwgUkVGSUlEIHJpaWQsIExQVk9JRCAqcHBPYmplY3QpCit7IElVbmtub3duICpwT2JqID0gTlVMTDsKKwlIUkVTVUxUIGhyZXM7CisJY2hhcgl4cmlpZFs1MF07CisKKyAgV0lORV9TdHJpbmdGcm9tQ0xTSUQoKExQQ0xTSUQpcmlpZCx4cmlpZCk7CisgIFRSQUNFKHNoZWxsLCIlcC0+KCVwLFxuXHRJSUQ6XHQlcywlcClcbiIsdGhpcyxwVW5rbm93bix4cmlpZCxwcE9iamVjdCk7CisKKwkqcHBPYmplY3QgPSBOVUxMOworCQkKKwlpZihwVW5rbm93bikKKwl7CXJldHVybihDTEFTU19FX05PQUdHUkVHQVRJT04pOworCX0KKworCWlmIChJc0VxdWFsSUlEKHJpaWQsICZJSURfSVNoZWxsRm9sZGVyKSkKKyAgeyBwT2JqID0gKElVbmtub3duICopSVNoZWxsRm9sZGVyX0NvbnN0cnVjdG9yKE5VTEwsTlVMTCk7CisgIH0gCisgIGVsc2UgaWYgKElzRXF1YWxJSUQocmlpZCwgJklJRF9JU2hlbGxWaWV3KSkKKyAgeyBwT2JqID0gKElVbmtub3duICopSVNoZWxsVmlld19Db25zdHJ1Y3RvcigpOworICB9IAorICBlbHNlIGlmIChJc0VxdWFsSUlEKHJpaWQsICZJSURfSVNoZWxsTGluaykpCisgIHsgcE9iaiA9IChJVW5rbm93biAqKUlTaGVsbExpbmtfQ29uc3RydWN0b3IoKTsKKyAgfSAKKyAgZWxzZSBpZiAoSXNFcXVhbElJRChyaWlkLCAmSUlEX0lFeHRyYWN0SWNvbikpCisgIHsgcE9iaiA9IChJVW5rbm93biAqKUlFeHRyYWN0SWNvbl9Db25zdHJ1Y3RvcihOVUxMKTsKKyAgfSAKKyAgZWxzZSBpZiAoSXNFcXVhbElJRChyaWlkLCAmSUlEX0lDb250ZXh0TWVudSkpCisgIHsgcE9iaiA9IChJVW5rbm93biAqKUlDb250ZXh0TWVudV9Db25zdHJ1Y3RvcihOVUxMLCBOVUxMLCAwKTsKKyAgfSAKKyAgZWxzZQorICB7IEVSUihzaGVsbCwidW5rbm93biBJSUQgcmVxdWVzdGVkXG5cdElJRDpcdCVzXG4iLHhyaWlkKTsKKyAgICByZXR1cm4oRV9OT0lOVEVSRkFDRSk7CisgIH0KKwkKKyAgaWYgKCFwT2JqKQorICB7IHJldHVybihFX09VVE9GTUVNT1JZKTsKKyAgfQorCSAKKwlocmVzID0gcE9iai0+bHB2dGJsLT5mblF1ZXJ5SW50ZXJmYWNlKHBPYmoscmlpZCwgcHBPYmplY3QpOworICBwT2JqLT5scHZ0YmwtPmZuUmVsZWFzZShwT2JqKTsKKyAgVFJBQ0Uoc2hlbGwsIi0tIE9iamVjdCBjcmVhdGVkOiAoJXApLT4lcFxuIix0aGlzLCpwcE9iamVjdCk7CisKKyAgcmV0dXJuIGhyZXM7Cit9CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBJQ2xhc3NGYWN0b3J5X0xvY2tTZXJ2ZXIKKyAqLworc3RhdGljIEhSRVNVTFQgV0lOQVBJIElDbGFzc0ZhY3RvcnlfTG9ja1NlcnZlcihMUENMQVNTRkFDVE9SWSB0aGlzLCBCT09MMzIgZkxvY2spCit7IFRSQUNFKHNoZWxsLCIlcC0+KDB4JXgpLCBub3QgaW1wbGVtZW50ZWRcbiIsdGhpcywgZkxvY2spOworICByZXR1cm4gRV9OT1RJTVBMOworfQpkaWZmIC0tZ2l0IGEvbWlzYy9zaGVsbG9yZC5jIGIvZGxscy9zaGVsbDMyL3NoZWxsb3JkLmMKc2ltaWxhcml0eSBpbmRleCA3MSUKcmVuYW1lIGZyb20gbWlzYy9zaGVsbG9yZC5jCnJlbmFtZSB0byBkbGxzL3NoZWxsMzIvc2hlbGxvcmQuYwppbmRleCA5MDc2ODM4Li5hZTk5OTBmIDEwMDY0NAotLS0gYS9taXNjL3NoZWxsb3JkLmMKKysrIGIvZGxscy9zaGVsbDMyL3NoZWxsb3JkLmMKQEAgLTMwLDE5ICszMCw4IEBACiAjaW5jbHVkZSAic2hsb2JqLmgiCiAjaW5jbHVkZSAiZGVidWcuaCIKICNpbmNsdWRlICJ3aW5yZWcuaCIKKyNpbmNsdWRlICJzaGVsbDMyX21haW4uaCIKIAotdm9pZCBwZHVtcCAoTFBDSVRFTUlETElTVCBwaWRsKQoteyBEV09SRCB0eXBlOwotICBDSEFSICogc3pEYXRhOwotICBMUElURU1JRExJU1QgcGlkbHRlbXAgPSBwaWRsOwotICBUUkFDRShzaGVsbCwiLS0tLS0tLS0tLSBwaWRsPSVwIFxuIiwgcGlkbCk7Ci0gIGRvCi0gIHsgc3pEYXRhID0gKChMUFBJRExEQVRBICkocGlkbHRlbXAtPm1raWQuYWJJRCkpLT5zelRleHQ7Ci0gICAgdHlwZSAgID0gKChMUFBJRExEQVRBICkocGlkbHRlbXAtPm1raWQuYWJJRCkpLT50eXBlOwotICAgIFRSQUNFIChzaGVsbCwiLS0tLSBwaWRsPSVwIHNpemU9JXUgdHlwZT0lbHggJXNcbiIscGlkbHRlbXAsIHBpZGx0ZW1wLT5ta2lkLmNiLHR5cGUsZGVidWdzdHJfYShzekRhdGEpKTsKLSAgICBwaWRsdGVtcCA9IChMUElURU1JRExJU1QpKCgoQllURSopcGlkbHRlbXApK3BpZGx0ZW1wLT5ta2lkLmNiKTsKLSAgfSB3aGlsZSAocGlkbHRlbXAtPm1raWQuY2IpOwotfQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIFNIQ2hhbmdlTm90aWZ5UmVnaXN0ZXIgW1NIRUxMMzIuMl0KICAqIE5PVEVTCkBAIC02OSwxMTYgKzU4LDYgQEAKIHsJRklYTUUoc2hlbGwsIigweCUwOGx4LDB4JTA4bHgpOnN0dWIuXG4iLHgxLHgyKTsKIAlyZXR1cm4gMDsKIH0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgkgCQkgSUxHZXREaXNwbGF5TmFtZQkJCVtTSEVMTDMyLjE1XQotICogZ2V0X3BhdGhfZnJvbV9pdGVtbGlzdChpdGVtbGlzdCxwYXRoKTsgPyBub3Qgc3VyZS4uLgotICovCi1CT09MMzIgV0lOQVBJIElMR2V0RGlzcGxheU5hbWUoTFBDSVRFTUlETElTVCBpaWwsTFBTVFIgcGF0aCkgewotCUZJWE1FKHNoZWxsLCIoJXAsJXApLHN0dWIsIHJldHVybiBlOiFcbiIsaWlsLHBhdGgpOwotCXN0cmNweShwYXRoLCJlOlxcIik7Ci0JcmV0dXJuIFRSVUU7Ci19Ci0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogSUxGaW5kTGFzdElEIFtTSEVMTDMyLjE2XQotICovCi1MUFNISVRFTUlEIFdJTkFQSSBJTEZpbmRMYXN0SUQoTFBJVEVNSURMSVNUIGlpbCkgewotCUxQU0hJVEVNSUQJbGFzdHNpaSxzaWk7Ci0KLSAgVFJBQ0Uoc2hlbGwsIiVwXG4iLGlpbCk7Ci0JaWYgKCFpaWwpCi0JCXJldHVybiBOVUxMOwotCXNpaSA9ICYoaWlsLT5ta2lkKTsKLQlsYXN0c2lpID0gc2lpOwotCXdoaWxlIChzaWktPmNiKSB7Ci0JCWxhc3RzaWkgPSBzaWk7Ci0JCXNpaSA9IChMUFNISVRFTUlEKSgoKGNoYXIqKXNpaSkrc2lpLT5jYik7Ci0JfQotCXJldHVybiBsYXN0c2lpOwotfQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIElMRmluZExhc3RJRCBbU0hFTEwzMi4xN10KLSAqIE5PVEVTCi0gKiAgQ3JlYXRlcyBhIG5ldyBsaXN0IHdpdGggdGhlIGxhc3QgaXRlbSByZW1vdmVkCi0gKi8KLUxQSVRFTUlETElTVCBXSU5BUEkgSUxSZW1vdmVMYXN0SUQoTFBDSVRFTUlETElTVCBwaWRsKQoteyBUUkFDRShzaGVsbCwicGlkbD0lcFxuIixwaWRsKTsKLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIElMQ2xvbmUgW1NIRUxMMzIuMThdCi0gKgotICogTk9URVMKLSAqICAgIGR1cGljYXRlIGFuIGlkbGlzdAotICovCi1MUElURU1JRExJU1QgV0lOQVBJIElMQ2xvbmUgKExQQ0lURU1JRExJU1QgcGlkbCkKLXsgRFdPUkQgICAgbGVuOwotICBMUElURU1JRExJU1QgIG5ld3BpZGw7Ci0KLSAgVFJBQ0Uoc2hlbGwsIiVwXG4iLHBpZGwpOwotCi0gIGlmICghcGlkbCkKLSAgICByZXR1cm4gTlVMTDsKLSAgICAKLSAgbGVuID0gSUxHZXRTaXplKHBpZGwpOwotICBuZXdwaWRsID0gKExQSVRFTUlETElTVClTSEFsbG9jKGxlbik7Ci0gIGlmIChuZXdwaWRsKQotICAgIG1lbWNweShuZXdwaWRsLHBpZGwsbGVuKTsKLSAgcmV0dXJuIG5ld3BpZGw7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBJTENsb25lRmlyc3QgW1NIRUxMMzIuMTldCi0gKgotICogTk9URVMKLSAqICBkdXBsaWNhdGVzIHRoZSBmaXJzdCBpZGxpc3Qgb2YgYSBjb21wbGV4IHBpZGwKLSAqLwotTFBJVEVNSURMSVNUIFdJTkFQSSBJTENsb25lRmlyc3QoTFBDSVRFTUlETElTVCBwaWRsKQoteyBGSVhNRShzaGVsbCwicGlkbD0lcFxuIixwaWRsKTsKLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBJTENvbWJpbmUgW1NIRUxMMzIuMjVdCi0gKgotICogTk9URVMKLSAqICBDb25jYXRlbmF0ZXMgdHdvIGNvbXBsZXggaWRsaXN0cy4KLSAqICBUaGUgcGlkbCBpcyB0aGUgZmlyc3Qgb25lLCBwaWRsc3ViIHRoZSBuZXh0IG9uZQotICogIERvZXMgbm90IGRlc3Ryb3kgdGhlIHBhc3NlZCBpbiBpZGxpc3RzIQotICovCi1MUElURU1JRExJU1QgV0lOQVBJIElMQ29tYmluZShMUENJVEVNSURMSVNUIHBpZGwxLExQQ0lURU1JRExJU1QgcGlkbDIpCi17IERXT1JEICAgIGxlbjEsbGVuMjsKLSAgTFBJVEVNSURMSVNUICBwaWRsTmV3OwotICAKLSAgVFJBQ0Uoc2hlbGwsInBpZGw9JXAgcGlkbD0lcFxuIixwaWRsMSxwaWRsMik7Ci0KLSAgaWYoIXBpZGwxICYmICFwaWRsMikKLSAgeyAgcmV0dXJuIE5VTEw7Ci0gIH0KLSAKLSAgaWYoIXBpZGwxKQotICB7IHBpZGxOZXcgPSBJTENsb25lKHBpZGwyKTsKLSAgICByZXR1cm4gcGlkbE5ldzsKLSAgfQotCi0gIGlmKCFwaWRsMikKLSAgeyBwaWRsTmV3ID0gSUxDbG9uZShwaWRsMSk7Ci0gICAgcmV0dXJuIHBpZGxOZXc7Ci0gIH0KLQotICBsZW4xICA9IElMR2V0U2l6ZShwaWRsMSktMjsKLSAgbGVuMiAgPSBJTEdldFNpemUocGlkbDIpOwotICBwaWRsTmV3ICA9IFNIQWxsb2MobGVuMStsZW4yKTsKLSAgCi0gIGlmIChwaWRsTmV3KQotICB7IG1lbWNweShwaWRsTmV3LHBpZGwxLGxlbjEpOwotICAgIG1lbWNweSgoKEJZVEUgKilwaWRsTmV3KStsZW4xLHBpZGwyLGxlbjIpOwotICB9Ci0KLS8qICBUUkFDRShzaGVsbCwiLS1uZXcgcGlkbD0lcFxuIixwaWRsTmV3KTsqLwotICByZXR1cm4gcGlkbE5ldzsKLX0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIFBhdGhJc1Jvb3QgW1NIRUxMMzIuMjldCkBAIC0yNzksMTQgKzE1OCwxNCBAQAogICogTk9URVMKICAqICAgICBiYXNlbmFtZShjaGFyICpmbik7CiAgKi8KLUxQU1RSIFdJTkFQSSBQYXRoRmluZEZpbGVuYW1lKExQU1RSIGZuKSB7Ci0gICAgTFBTVFIgYmFzZWZuOwotICBUUkFDRShzaGVsbCwiJXNcbiIsZm4pOworTFBTVFIgV0lOQVBJIFBhdGhGaW5kRmlsZW5hbWUoTFBTVFIgZm4pCit7CUxQU1RSIGJhc2VmbjsKKwlUUkFDRShzaGVsbCwiJXNcbiIsZm4pOwogICAgIGJhc2VmbiA9IGZuOwotICAgIHdoaWxlIChmblswXSkgewotICAgIAlpZiAoKChmblswXT09J1xcJykgfHwgKGZuWzBdPT0nOicpKSAmJiBmblsxXSAmJiBmblsxXSE9J1xcJykKLQkgICAgYmFzZWZuID0gZm4rMTsKLQlmbisrOworICAgIHdoaWxlIChmblswXSkgCisgICAgeyBpZiAoKChmblswXT09J1xcJykgfHwgKGZuWzBdPT0nOicpKSAmJiBmblsxXSAmJiBmblsxXSE9J1xcJykKKwkgIGJhc2VmbiA9IGZuKzE7CisJICBmbisrOwogICAgIH0KICAgICByZXR1cm4gYmFzZWZuOwogfQpAQCAtNDg2LDE3ICszNjUsNiBAQAogCSk7CiAJcmV0dXJuIDA7CiB9Ci0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogU2hlbGxfR2V0SW1hZ2VMaXN0IFtTSEVMTDMyLjcxXQotICogCi0gKiBOT1RFUwotICogICAgIHJldHVybnMgaW50ZXJuYWwgc2hlbGwgdmFsdWVzIGluIHRoZSBwYXNzZWQgcG9pbnRlcnMKLSAqLwotQk9PTDMyIFdJTkFQSSBTaGVsbF9HZXRJbWFnZUxpc3QoTFBEV09SRCB4LExQRFdPUkQgeSkgewotCi0JRklYTUUoc2hlbGwsIiglcCwlcCk6c3R1Yi5cbiIseCx5KTsKLQlyZXR1cm4gVFJVRTsKLX0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIFNoZWxsX0dldENhY2hlZEltYWdlSW5kZXggW1NIRUxMMzIuNzJdCkBAIC01NTgsNiArNDI2LDggQEAKICAqIAogICogTk9URVMKICAqICAgICBleHBvcnRlZCBieSBvcmRpbmFsCisgKiBGSVhNRQorICogIHdyb25nIGltcGxlbWVudGVkIE9sZVN0ciBpcyBOT1Qgd2lkZSBzdHJpbmcgISEhISAoanNjaCkKICAqLwogQk9PTDMyIFdJTkFQSQogT2xlU3RyVG9TdHJOIChMUFNUUiBscE11bHRpLCBJTlQzMiBuTXVsdGksIExQQ1dTVFIgbHBXaWRlLCBJTlQzMiBuV2lkZSkgewpAQCAtNTcwLDcgKzQ0MCw5IEBACiAgKgogICogTk9URVMKICAqICAgICBleHBvcnRlZCBieSBvcmRpbmFsCi0gKi8KKyAqIEZJWE1FCisgKiAgd3JvbmcgaW1wbGVtZW50ZWQgT2xlU3RyIGlzIE5PVCB3aWRlIHN0cmluZyAhISEhIChqc2NoKQorKi8KIEJPT0wzMiBXSU5BUEkKIFN0clRvT2xlU3RyTiAoTFBXU1RSIGxwV2lkZSwgSU5UMzIgbldpZGUsIExQQ1NUUiBscE11bHRpLCBJTlQzMiBuTXVsdGkpIHsKICAgICByZXR1cm4gTXVsdGlCeXRlVG9XaWRlQ2hhciAoMCwgMCwgbHBNdWx0aSwgbk11bHRpLCBscFdpZGUsIG5XaWRlKTsKQEAgLTYzMiwxMjUgKzUwNCw2IEBACiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICovCi10eXBlZGVmIERXT1JEICgqIFdJTkFQSSBHZXRDbGFzc1B0cikoUkVGQ0xTSUQsUkVGSUlELExQVk9JRCk7Ci0KLXN0YXRpYyBHZXRDbGFzc1B0ciBTSF9maW5kX21vZHVsZXByb2MoTFBTVFIgZGxsbmFtZSxITU9EVUxFMzIgKnhobW9kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUFNUUiBuYW1lKQoteyBITU9EVUxFMzIgIGhtb2Q7Ci0JRkFSUFJPQzMyCWRsbHVubG9hZCxuYW1lcHJvYzsKLQotCWlmICh4aG1vZCkgKnhobW9kID0gMDsKLQlpZiAoIXN0cmNhc2VjbXAoUGF0aEZpbmRGaWxlbmFtZShkbGxuYW1lKSwic2hlbGwzMi5kbGwiKSkKLQkJcmV0dXJuIChHZXRDbGFzc1B0cilTSEVMTDMyX0RsbEdldENsYXNzT2JqZWN0OwotCi0JaG1vZCA9IExvYWRMaWJyYXJ5RXgzMkEoZGxsbmFtZSwwLExPQURfV0lUSF9BTFRFUkVEX1NFQVJDSF9QQVRIKTsKLQlpZiAoIWhtb2QpCi0JCXJldHVybiBOVUxMOwotCWRsbHVubG9hZCA9IEdldFByb2NBZGRyZXNzMzIoaG1vZCwiRGxsQ2FuVW5sb2FkTm93Iik7Ci0JaWYgKCFkbGx1bmxvYWQpCi0JCWlmICh4aG1vZCkgKnhobW9kID0gaG1vZDsKLQluYW1lcHJvYyA9IEdldFByb2NBZGRyZXNzMzIoaG1vZCxuYW1lKTsKLQlpZiAoIW5hbWVwcm9jKSB7Ci0JCUZyZWVMaWJyYXJ5MzIoaG1vZCk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQkvKiByZWdpc3RlciB1bmxvYWRhYmxlIGRsbCB3aXRoIHVubG9hZHByb2MgLi4uICovCi0JcmV0dXJuIChHZXRDbGFzc1B0ciluYW1lcHJvYzsKLX0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICovCi1zdGF0aWMgRFdPUkQgU0hfZ2V0X2luc3RhbmNlKAotICAgIFJFRkNMU0lEIGNsc2lkLAotCQlMUFNUUiBkbGxuYW1lLAotCSAgTFBWT0lEIHVua25vd25vdXRlciwKLQkJUkVGSUlEIHJlZmlpZCwKLQkJTFBWT0lEIGluc3QpIAoteyBHZXRDbGFzc1B0ciAgICAgZGxsZ2V0Y2xhc3NvYjsKLQlEV09SRAkJaHJlczsKLQlMUENMQVNTRkFDVE9SWQljbGFzc2ZhYzsKLQotICBjaGFyCXhjbHNpZFs1MF0seHJlZmlpZFs1MF07Ci0gIFdJTkVfU3RyaW5nRnJvbUNMU0lEKChMUENMU0lEKWNsc2lkLHhjbHNpZCk7Ci0gIFdJTkVfU3RyaW5nRnJvbUNMU0lEKChMUENMU0lEKXJlZmlpZCx4cmVmaWlkKTsKLSAgVFJBQ0Uoc2hlbGwsIlxuXHRDTFNJRDolcywlcywlcCxcblx0SUlEOiVzLCVwXG4iLAotCSAgIHhjbHNpZCwgZGxsbmFtZSx1bmtub3dub3V0ZXIseHJlZmlpZCxpbnN0KTsKLQkKLQlkbGxnZXRjbGFzc29iID0gU0hfZmluZF9tb2R1bGVwcm9jKGRsbG5hbWUsTlVMTCwiRGxsR2V0Q2xhc3NPYmplY3QiKTsKLQlpZiAoIWRsbGdldGNsYXNzb2IpCi0JCXJldHVybiAweDgwMDcwMDAwfEdldExhc3RFcnJvcigpOwotCi0vKiBGSVhNRSAqLwotLyoKLQlocmVzID0gKCpkbGxnZXRjbGFzc29iKShjbHNpZCwoUkVGSUlEKSZJSURfSUNsYXNzRmFjdG9yeSxpbnN0KTsKLQlpZiAoaHJlczwwKQotCQlyZXR1cm4gaHJlczsKLQotICovCi0JaHJlcyA9ICgqZGxsZ2V0Y2xhc3NvYikoY2xzaWQsKFJFRklJRCkmSUlEX0lDbGFzc0ZhY3RvcnksJmNsYXNzZmFjKTsKLQlpZiAoaHJlczwwIHx8IChocmVzPj0weDgwMDAwMDAwKSkKLQkJcmV0dXJuIGhyZXM7Ci0JaWYgKCFjbGFzc2ZhYykgewotCQlGSVhNRShzaGVsbCwibm8gY2xhc3NmYWN0b3J5LCBidXQgaHJlcyBpcyAweCVsZCFcbiIsaHJlcyk7Ci0JCXJldHVybiBFX0ZBSUw7Ci0JfQotCWNsYXNzZmFjLT5scHZ0YmwtPmZuQ3JlYXRlSW5zdGFuY2UoY2xhc3NmYWMsdW5rbm93bm91dGVyLHJlZmlpZCxpbnN0KTsKLQljbGFzc2ZhYy0+bHB2dGJsLT5mblJlbGVhc2UoY2xhc3NmYWMpOwotCXJldHVybiAwOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogU0hDb0NyZWF0ZUluc3RhbmNlIFtTSEVMTDMyLjEwMl0KLSAqIAotICogTk9URVMKLSAqICAgICBleHBvcnRlZCBieSBvcmRpbmFsCi0gKi8KLUxSRVNVTFQgV0lOQVBJIFNIQ29DcmVhdGVJbnN0YW5jZSgKLQlMUFNUUiBhY2xzaWQsQ0xTSUQgKmNsc2lkLExQVU5LTk9XTiB1bmtub3dub3V0ZXIsUkVGSUlEIHJlZmlpZCxMUFZPSUQgaW5zdAotKSB7Ci0JY2hhcglidWZmZXJbMjU2XSx4Y2xzaWRbNDhdLHhpaWRbNDhdLHBhdGhbMjYwXSx0bW9kZWxbMTAwXTsKLQlIS0VZCWlucHJvY2tleTsKLQlEV09SRAlwYXRobGVuLHR5cGUsdG1vZGVsbGVuOwotCURXT1JECWhyZXM7Ci0JCi0JV0lORV9TdHJpbmdGcm9tQ0xTSUQocmVmaWlkLHhpaWQpOwotCi0JaWYgKGNsc2lkKQotCQlXSU5FX1N0cmluZ0Zyb21DTFNJRChjbHNpZCx4Y2xzaWQpOwotCWVsc2UgewotCQlpZiAoIWFjbHNpZCkKLQkJICAgIHJldHVybiAweDgwMDQwMTU0OwotCQlzdHJjcHkoeGNsc2lkLGFjbHNpZCk7Ci0JfQotCVRSQUNFKHNoZWxsLCIoJXAsXG5cdFNJRDpcdCVzLCVwLFxuXHRJSUQ6XHQlcywlcClcbiIsYWNsc2lkLHhjbHNpZCx1bmtub3dub3V0ZXIseGlpZCxpbnN0KTsKLQotCXNwcmludGYoYnVmZmVyLCJDTFNJRFxcJXNcXEluUHJvY1NlcnZlcjMyIix4Y2xzaWQpOwotCWlmIChSZWdPcGVuS2V5RXgzMkEoSEtFWV9DTEFTU0VTX1JPT1QsYnVmZmVyLDAsMHgwMjAwMDAwMCwmaW5wcm9ja2V5KSkKLQkJcmV0dXJuIFNIX2dldF9pbnN0YW5jZShjbHNpZCwic2hlbGwzMi5kbGwiLHVua25vd25vdXRlcixyZWZpaWQsaW5zdCk7Ci0JcGF0aGxlbj1zaXplb2YocGF0aCk7Ci0JaWYgKFJlZ1F1ZXJ5VmFsdWUzMkEoaW5wcm9ja2V5LE5VTEwscGF0aCwmcGF0aGxlbikpIHsKLQkJUmVnQ2xvc2VLZXkoaW5wcm9ja2V5KTsKLQkJcmV0dXJuIFNIX2dldF9pbnN0YW5jZShjbHNpZCwic2hlbGwzMi5kbGwiLHVua25vd25vdXRlcixyZWZpaWQsaW5zdCk7Ci0JfQotCVRSQUNFKHNoZWxsLCAiU2VydmVyIGRsbCBpcyAlc1xuIixwYXRoKTsKLQl0bW9kZWxsZW49c2l6ZW9mKHRtb2RlbCk7Ci0JdHlwZT1SRUdfU1o7Ci0JaWYgKFJlZ1F1ZXJ5VmFsdWVFeDMyQShpbnByb2NrZXksIlRocmVhZGluZ01vZGVsIixOVUxMLCZ0eXBlLHRtb2RlbCwmdG1vZGVsbGVuKSkgewotCQlSZWdDbG9zZUtleShpbnByb2NrZXkpOwotCQlyZXR1cm4gU0hfZ2V0X2luc3RhbmNlKGNsc2lkLCJzaGVsbDMyLmRsbCIsdW5rbm93bm91dGVyLHJlZmlpZCxpbnN0KTsKLQl9Ci0JVFJBQ0Uoc2hlbGwsICJUaHJlYWRpbmcgbW9kZWwgaXMgJXNcbiIsdG1vZGVsKTsKLQlocmVzPVNIX2dldF9pbnN0YW5jZShjbHNpZCxwYXRoLHVua25vd25vdXRlcixyZWZpaWQsaW5zdCk7Ci0JaWYgKGhyZXM8MCkKLQkJaHJlcz1TSF9nZXRfaW5zdGFuY2UoY2xzaWQsInNoZWxsMzIuZGxsIix1bmtub3dub3V0ZXIscmVmaWlkLGluc3QpOwotCVJlZ0Nsb3NlS2V5KGlucHJvY2tleSk7Ci0JcmV0dXJuIGhyZXM7Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIFNoZWxsTWVzc2FnZUJveEEgW1NIRUxMMzIuMTgzXQogICoKICAqIEZvcm1hdCBhbmQgb3V0cHV0IGVycm9ybWVzc2FnZS4KQEAgLTc3NSw3ICs1MjgsNiBAQAogCS8qTWVzc2FnZUJveDMyQShod25kLGJ1ZjMsYnVmLGlkfDB4MTAwMDApOyovCiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIFNIUmVzdHJpY3RlZCBbU0hFTEwzMi4xMDBdCiAgKgpAQCAtODE3LDQ5ICs1NjksNiBAQAogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogSUxHZXRTaXplIFtTSEVMTDMyLjE1Ml0KLSAqICBnZXRzIHRoZSBieXRlIHNpemUgb2YgYW4gaWRsaXN0IGluY2x1ZGluZyB6ZXJvIHRlcm1pbmF0b3IgKHBpZGwpCi0gKgotICogUEFSQU1FVEVSUwotICogIHBpZGwgSVRFTUlETElTVAotICoKLSAqIFJFVFVSTlMKLSAqICBzaXplIG9mIHBpZGwKLSAqCi0gKiBOT1RFUwotICogIGV4cG9ydGVkIGJ5IG9yZGluYWwKLSAqLwotRFdPUkQgV0lOQVBJIElMR2V0U2l6ZShMUElURU1JRExJU1QgcGlkbCkKLXsgTFBTSElURU1JRCBzaSA9ICYocGlkbC0+bWtpZCk7Ci0gIERXT1JEICBsZW49MDsKLQotICBUUkFDRShzaGVsbCwicGlkbD0lcFxuIixwaWRsKTsKLQotICBpZiAocGlkbCkKLSAgeyB3aGlsZSAoc2ktPmNiKSAKLSAgICB7IGxlbiArPSBzaS0+Y2I7Ci0gICAgICBzaSAgPSAoTFBTSElURU1JRCkoKChMUEJZVEUpc2kpK3NpLT5jYik7Ci0gICAgfQotICAgIGxlbiArPSAyOwotCX0KLS8qICBUUkFDRShzaGVsbCwiLS0gc2l6ZT0lbHVcbiIsbGVuKTsqLwotCXJldHVybiBsZW47Ci19Ci0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogSUxBcHBlbmQgW1NIRUxMMzIuMTU0XQotICoKLSAqIE5PVEVTCi0gKiAgQWRkcyB0aGUgc2luZ2xlIGl0ZW0gdG8gdGhlIGlkbGlzdCBpbmRpY2F0ZWQgYnkgcGlkbC4KLSAqICBpZiBiRW5kIGlzIDAsIGFkZHMgdGhlIGl0ZW0gdG8gdGhlIGZyb250IG9mIHRoZSBsaXN0LAotICogIG90aGVyd2lzZSBhZGRzIHRoZSBpdGVtIHRvIHRoZSBlbmQuCi0gKiAgRGVzdHJveXMgdGhlIHBhc3NlZCBpbiBpZGxpc3QhCi0gKi8KLUxQSVRFTUlETElTVCBXSU5BUEkgSUxBcHBlbmQoTFBJVEVNSURMSVNUIHBpZGwsTFBDSVRFTUlETElTVCBpdGVtLEJPT0wzMiBiRW5kKQoteyBUUkFDRShzaGVsbCwiKHBpZGw9JXAscGlkbD0lcCwlMDh1KVxuIixwaWRsLGl0ZW0sYkVuZCk7Ci0gIHJldHVybiBOVUxMOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogUGF0aEdldEV4dGVuc2lvbiBbU0hFTEwzMi4xNThdCiAgKgogICogTk9URVMKQEAgLTkxOCwyMiArNjI3LDYgQEAKICAgcmV0dXJuIHJldDsKIH0KIAotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogSUxGcmVlIFtTSEVMTDMyLjE1NV0KLSAqCi0gKiBOT1RFUwotICogICAgIGZyZWVfY2hlY2tfcHRyIC0gZnJlZXMgbWVtb3J5IChpZiBub3QgTlVMTCkKLSAqICAgICBhbGxvY2F0ZWQgYnkgU0hNYWxsb2MgYWxsb2NhdG9yCi0gKiAgICAgZXhwb3J0ZWQgYnkgb3JkaW5hbAotICovCi1EV09SRCBXSU5BUEkgSUxGcmVlKExQVk9JRCBwaWRsKSAKLXsgVFJBQ0UgKHNoZWxsLCIocGlkbD0weCUwOGx4KVxuIiwoRFdPUkQpcGlkbCk7Ci0gIGlmICghcGlkbCkKLQkJcmV0dXJuIDA7Ci0gIHJldHVybiBTSEZyZWUocGlkbCk7Ci19Ci0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBPcGVuUmVnU3RyZWFtIFtTSEVMTDMyLjg1XQogICoKQEAgLTk2OSw3ICs2NjIsNiBAQAogICAgIHJldHVybiAwOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBSdW5GaWxlRGxnIFtTSEVMTDMyLjYxXQogICoKQEAgLTk4NSw3ICs2NzcsNiBAQAogICAgIHJldHVybiAwOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBFeGl0V2luZG93c0RpYWxvZyBbU0hFTEwzMi42MF0KICAqCkBAIC05OTksNyArNjkwLDYgQEAKICAgICByZXR1cm4gMDsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogQXJyYW5nZVdpbmRvd3MgW1NIRUxMMzIuMTg0XQogICogCkBAIC0xMDEzLDcgKzcwMyw2IEBACiAgICAgcmV0dXJuIDA7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIFNIQ0xTSURGcm9tU3RyaW5nIFtTSEVMTDMyLjE0N10KICAqCkBAIC0xMDI0LDcgKzcxMyw2IEBACiBTSENMU0lERnJvbVN0cmluZyAoRFdPUkQgZHdQYXJhbTEsIERXT1JEIGR3UGFyYW0yKQogewogICAgIEZJWE1FIChzaGVsbCwiKDB4JWx4IDB4JWx4KTpzdHViLlxuIiwgZHdQYXJhbTEsIGR3UGFyYW0yKTsKLQogICAgIEZJWE1FIChzaGVsbCwiKFwiJXNcIiBcIiVzXCIpOnN0dWIuXG4iLCAoTFBTVFIpZHdQYXJhbTEsIChMUFNUUilkd1BhcmFtMik7CiAKICAgICByZXR1cm4gMDsKQEAgLTExMjMsOCArODExLDggQEAKICAqIFNoZWxsRXhlY3V0ZUV4IFtTSEVMTDMyLjI5MV0KICAqCiAgKi8KLUhSRVNVTFQgV0lOQVBJIFNoZWxsRXhlY3V0ZUV4IChEV09SRCB1KQoteyBGSVhNRShzaGVsbCwiMHglMDhseCBzdHViXG4iLHUpOworQk9PTDMyIFdJTkFQSSBTaGVsbEV4ZWN1dGVFeDMyQSAoTFBTSEVMTEVYRUNVVEVJTkZPQSB1KQoreyBGSVhNRShzaGVsbCwiJXAgc3R1YlxuIix1KTsKICAgcmV0dXJuIDA7CiB9CiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpkaWZmIC0tZ2l0IGEvZGxscy9zaGVsbDMyL3NobGZvbGRlci5jIGIvZGxscy9zaGVsbDMyL3NobGZvbGRlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhNTE2Y2YKLS0tIC9kZXYvbnVsbAorKysgYi9kbGxzL3NoZWxsMzIvc2hsZm9sZGVyLmMKQEAgLTAsMCArMSw3ODIgQEAKKy8qCisgKglTaGVsbCBGb2xkZXIgc3R1ZmYgKC4uLmFuZCBhbGwgdGhlIE9MRS1PYmplY3RzIG9mIFNIRUxMMzIuRExMKQorICoKKyAqCUNvcHlyaWdodCAxOTk3CU1hcmN1cyBNZWlzc25lcgorICoJQ29weXJpZ2h0IDE5OTgJSnVlcmdlbiBTY2htaWVkCisgKgorICogICEhISBjdXJyZW50bHkgd29yayBpbiBwcm9ncmVzcyBvbiBhbGwgY2xhc3NlcyA5ODA4MTggISEhCisgKiAgPGNvbnRhY3QganVlcmdlbi5zY2htaWVkQG1ldHJvbmV0LmRlPgorICovCisKKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgIm9sZS5oIgorI2luY2x1ZGUgIm9sZTIuaCIKKyNpbmNsdWRlICJkZWJ1Zy5oIgorI2luY2x1ZGUgImNvbXBvYmouaCIKKyNpbmNsdWRlICJpbnRlcmZhY2VzLmgiCisjaW5jbHVkZSAic2hsb2JqLmgiCisjaW5jbHVkZSAic2hlbGwuaCIKKyNpbmNsdWRlICJ3aW5lcnJvci5oIgorI2luY2x1ZGUgIndpbm5scy5oIgorI2luY2x1ZGUgIndpbnByb2MuaCIKKyNpbmNsdWRlICJjb21tY3RybC5oIgorCisjaW5jbHVkZSAic2hlbGwzMl9tYWluLmgiCisKK3N0YXRpYyBIUkVTVUxUIFdJTkFQSSBJU2hlbGxGb2xkZXJfUXVlcnlJbnRlcmZhY2UoTFBTSEVMTEZPTERFUixSRUZJSUQsTFBWT0lEKik7CitzdGF0aWMgVUxPTkcgV0lOQVBJIElTaGVsbEZvbGRlcl9BZGRSZWYoTFBTSEVMTEZPTERFUik7CitzdGF0aWMgVUxPTkcgV0lOQVBJIElTaGVsbEZvbGRlcl9SZWxlYXNlKExQU0hFTExGT0xERVIpOworc3RhdGljIEhSRVNVTFQgV0lOQVBJIElTaGVsbEZvbGRlcl9Jbml0aWFsaXplKExQU0hFTExGT0xERVIsTFBDSVRFTUlETElTVCk7CitzdGF0aWMgSFJFU1VMVCBXSU5BUEkgSVNoZWxsRm9sZGVyX1BhcnNlRGlzcGxheU5hbWUoTFBTSEVMTEZPTERFUixIV05EMzIsTFBCQyxMUE9MRVNUUjMyLERXT1JEKixMUElURU1JRExJU1QqLERXT1JEKik7CitzdGF0aWMgSFJFU1VMVCBXSU5BUEkgSVNoZWxsRm9sZGVyX0VudW1PYmplY3RzKExQU0hFTExGT0xERVIsSFdORDMyLERXT1JELExQRU5VTUlETElTVCopOworc3RhdGljIEhSRVNVTFQgV0lOQVBJIElTaGVsbEZvbGRlcl9CaW5kVG9PYmplY3QoTFBTSEVMTEZPTERFUixMUENJVEVNSURMSVNULExQQkMsUkVGSUlELExQVk9JRCopOworc3RhdGljIEhSRVNVTFQgV0lOQVBJIElTaGVsbEZvbGRlcl9CaW5kVG9TdG9yYWdlKExQU0hFTExGT0xERVIsTFBDSVRFTUlETElTVCxMUEJDLFJFRklJRCxMUFZPSUQqKTsKK3N0YXRpYyBIUkVTVUxUIFdJTkFQSSBJU2hlbGxGb2xkZXJfQ29tcGFyZUlEcyhMUFNIRUxMRk9MREVSLExQQVJBTSxMUENJVEVNSURMSVNULExQQ0lURU1JRExJU1QpOworc3RhdGljIEhSRVNVTFQgV0lOQVBJIElTaGVsbEZvbGRlcl9DcmVhdGVWaWV3T2JqZWN0KExQU0hFTExGT0xERVIsSFdORDMyLFJFRklJRCxMUFZPSUQqKTsKK3N0YXRpYyBIUkVTVUxUIFdJTkFQSSBJU2hlbGxGb2xkZXJfR2V0QXR0cmlidXRlc09mKExQU0hFTExGT0xERVIsVUlOVDMyLExQQ0lURU1JRExJU1QqLERXT1JEKik7CitzdGF0aWMgSFJFU1VMVCBXSU5BUEkgSVNoZWxsRm9sZGVyX0dldFVJT2JqZWN0T2YoTFBTSEVMTEZPTERFUixIV05EMzIsVUlOVDMyLExQQ0lURU1JRExJU1QqLFJFRklJRCxVSU5UMzIqLExQVk9JRCopOworc3RhdGljIEhSRVNVTFQgV0lOQVBJIElTaGVsbEZvbGRlcl9HZXREaXNwbGF5TmFtZU9mKExQU0hFTExGT0xERVIsTFBDSVRFTUlETElTVCxEV09SRCxMUFNUUlJFVCk7CitzdGF0aWMgSFJFU1VMVCBXSU5BUEkgSVNoZWxsRm9sZGVyX1NldE5hbWVPZihMUFNIRUxMRk9MREVSLEhXTkQzMixMUENJVEVNSURMSVNULExQQ09MRVNUUjMyLERXT1JELExQSVRFTUlETElTVCopOworc3RhdGljIEJPT0wzMiBXSU5BUEkgSVNoZWxsRm9sZGVyX0dldEZvbGRlclBhdGgoTFBTSEVMTEZPTERFUixMUFNUUixEV09SRCk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBHZXROZXh0RWxlbWVudCAoaW50ZXJuYWwgZnVuY3Rpb24pCisgKgorICogZ2V0cyBhIHBhcnQgb2YgYSBzdHJpbmcgdGlsbCB0aGUgZmlyc3QgYmFja3NsYXNoCisgKgorICogUEFSQU1FVEVSUworICogIHBzek5leHQgW0lOXSBzdHJpbmcgdG8gZ2V0IHRoZSBlbGVtZW50IGZyb20KKyAqICBwc3pPdXQgIFtJTl0gcG9pbnRlciB0byBidWZmZXIgd2hpdGNoIHJlY2VpdmVzIHN0cmluZworICogIGR3T3V0ICAgW0lOXSBsZW5ndGggb2YgcHN6T3V0CisgKgorICogIFJFVFVSTlMKKyAqICAgIExQU1RSIHBvaW50ZXIgdG8gZmlyc3QsIG5vdCB5ZXQgcGFyc2VkIGNoYXIKKyAqLworTFBTVFIgR2V0TmV4dEVsZW1lbnQoTFBTVFIgcHN6TmV4dCxMUFNUUiBwc3pPdXQsRFdPUkQgZHdPdXQpCit7IExQU1RSICAgcHN6VGFpbCA9IHBzek5leHQ7CisgIERXT1JEIGR3Q29weTsKKyAgVFJBQ0Uoc2hlbGwsIiglcyAlcCAweCUwOGx4KVxuIixkZWJ1Z3N0cl9hKHBzek5leHQpLHBzek91dCxkd091dCk7CisKKyAgaWYoIXBzek5leHQgfHwgISpwc3pOZXh0KQorICAgIHJldHVybiBOVUxMOworCisgIHdoaWxlKCpwc3pUYWlsICYmICgqcHN6VGFpbCAhPSAnXFwnKSkKKyAgeyBwc3pUYWlsKys7CisgIH0KKyAgZHdDb3B5PSgoTFBCWVRFKXBzelRhaWwtKExQQllURSlwc3pOZXh0KS9zaXplb2YoQ0hBUikrMTsKKyAgbHN0cmNweW4zMkEocHN6T3V0LCBwc3pOZXh0LCAoZHdPdXQ8ZHdDb3B5KT8gZHdPdXQgOiBkd0NvcHkpOworCisgIGlmKCpwc3pUYWlsKQorICB7ICBwc3pUYWlsKys7CisJfQorCisgIFRSQUNFKHNoZWxsLCItLSglcyAlcyAweCUwOGx4KVxuIixkZWJ1Z3N0cl9hKHBzek5leHQpLGRlYnVnc3RyX2EocHN6T3V0KSxkd091dCk7CisgIHJldHVybiBwc3pUYWlsOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogICBJU2hlbGxGb2xkZXIgaW1wbGVtZW50YXRpb24KKyovCitzdGF0aWMgc3RydWN0IElTaGVsbEZvbGRlcl9WVGFibGUgc2Z2dCA9IAoreyBJU2hlbGxGb2xkZXJfUXVlcnlJbnRlcmZhY2UsCisgIElTaGVsbEZvbGRlcl9BZGRSZWYsCisgIElTaGVsbEZvbGRlcl9SZWxlYXNlLAorICBJU2hlbGxGb2xkZXJfUGFyc2VEaXNwbGF5TmFtZSwKKyAgSVNoZWxsRm9sZGVyX0VudW1PYmplY3RzLAorICBJU2hlbGxGb2xkZXJfQmluZFRvT2JqZWN0LAorICBJU2hlbGxGb2xkZXJfQmluZFRvU3RvcmFnZSwKKyAgSVNoZWxsRm9sZGVyX0NvbXBhcmVJRHMsCisgIElTaGVsbEZvbGRlcl9DcmVhdGVWaWV3T2JqZWN0LAorICBJU2hlbGxGb2xkZXJfR2V0QXR0cmlidXRlc09mLAorICBJU2hlbGxGb2xkZXJfR2V0VUlPYmplY3RPZiwKKyAgSVNoZWxsRm9sZGVyX0dldERpc3BsYXlOYW1lT2YsCisgIElTaGVsbEZvbGRlcl9TZXROYW1lT2YsCisgIElTaGVsbEZvbGRlcl9HZXRGb2xkZXJQYXRoCit9OworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCSAgSVNoZWxsRm9sZGVyX0NvbnN0cnVjdG9yCisqLworCitMUFNIRUxMRk9MREVSIElTaGVsbEZvbGRlcl9Db25zdHJ1Y3RvcihMUFNIRUxMRk9MREVSIHBQYXJlbnQsTFBJVEVNSURMSVNUIHBpZGwpIAoreyBMUFNIRUxMRk9MREVSICAgIHNmOworCURXT1JEIGR3U2l6ZT0wOworICBzZj0oTFBTSEVMTEZPTERFUilIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwwLHNpemVvZihJU2hlbGxGb2xkZXIpKTsKKyAgc2YtPnJlZj0xOworICBzZi0+bHB2dGJsPSZzZnZ0OworICBzZi0+bWxwc3pGb2xkZXI9TlVMTDsKKwlzZi0+bXBTRlBhcmVudD1wUGFyZW50OworCisJVFJBQ0Uoc2hlbGwsIiglcCktPihwYXJlbnQ9JXAsIHBpZGw9JXApXG4iLHNmLHBQYXJlbnQsIHBpZGwpOworCQorCS8qIGNyZWF0ZSBvd24gcGlkbC1tYW5hZ2VyKi8KKyAgc2YtPnBQaWRsTWdyICA9IFBpZGxNZ3JfQ29uc3RydWN0b3IoKTsKKwlpZiAoISBzZi0+cFBpZGxNZ3IgKQorCXsgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwwLHNmKTsKKwkgIEVSUiAoc2hlbGwsIi0tIENvdWxkIG5vdCBpbml0aWFsaXplIFBpZE1HUlxuIik7CisJICByZXR1cm4gTlVMTDsKKwl9CisKKyAgLyoga2VlcCBhIGNvcHkgb2YgdGhlIHBpZGwgaW4gdGhlIGluc3RhbmNlKi8KKyAgc2YtPm1waWRsID0gSUxDbG9uZShwaWRsKTsKKwlzZi0+bXBpZGxOU1Jvb3QgPSBOVUxMOworCQorICBpZihzZi0+bXBpZGwpICAgICAgICAvKiBkbyB3ZSBoYXZlIGEgcGlkbD8qLworICB7IGR3U2l6ZSA9IDA7CisgICAgaWYoc2YtPm1wU0ZQYXJlbnQtPm1scHN6Rm9sZGVyKQorICAgIHsgZHdTaXplICs9IHN0cmxlbihzZi0+bXBTRlBhcmVudC0+bWxwc3pGb2xkZXIpICsgMTsKKyAgICB9ICAgCisgICAgZHdTaXplICs9IHNmLT5wUGlkbE1nci0+bHB2dGJsLT5mbkdldEZvbGRlclRleHQoc2YtPnBQaWRsTWdyLHNmLT5tcGlkbCxOVUxMLDApOworICAgIHNmLT5tbHBzekZvbGRlciA9IFNIQWxsb2MoZHdTaXplKTsKKyAgICBpZihzZi0+bWxwc3pGb2xkZXIpCisgICAgeyAqKHNmLT5tbHBzekZvbGRlcik9MHgwMDsKKyAgICAgIGlmKHNmLT5tcFNGUGFyZW50LT5tbHBzekZvbGRlcikKKyAgICAgIHsgIHN0cmNweShzZi0+bWxwc3pGb2xkZXIsIHNmLT5tcFNGUGFyZW50LT5tbHBzekZvbGRlcik7CisgICAgICAgICBQYXRoQWRkQmFja3NsYXNoIChzZi0+bWxwc3pGb2xkZXIpOworICAgICAgfQorICAgICAgc2YtPnBQaWRsTWdyLT5scHZ0YmwtPmZuR2V0Rm9sZGVyVGV4dChzZi0+cFBpZGxNZ3IsIHNmLT5tcGlkbCwgc2YtPm1scHN6Rm9sZGVyK3N0cmxlbihzZi0+bWxwc3pGb2xkZXIpLCBkd1NpemUtc3RybGVuKHNmLT5tbHBzekZvbGRlcikpOworICAgIH0KKyAgfQorCQorICBUUkFDRShzaGVsbCwiLS0gKCVwKS0+KCVwLCVwLHBhcmVudD0lcylcbiIsc2YscFBhcmVudCwgcGlkbCwgZGVidWdzdHJfYShzZi0+bWxwc3pGb2xkZXIpKTsKKwlyZXR1cm4gc2Y7Cit9CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogIElTaGVsbEZvbGRlcjo6UXVlcnlJbnRlcmZhY2UKKyogUEFSQU1FVEVSUworKiAgUkVGSUlEIHJpaWQsICAgICAgICAvL1tpbiBdIFJlcXVlc3RlZCBJbnRlcmZhY2VJRAorKiAgTFBWT0lEKiBwcHZPYmplY3QpICAvL1tvdXRdIEludGVyZmFjZSogdG8gaG9sZCB0aGUgcmVzdWx0CisqLworc3RhdGljIEhSRVNVTFQgV0lOQVBJIElTaGVsbEZvbGRlcl9RdWVyeUludGVyZmFjZSgKKyAgTFBTSEVMTEZPTERFUiB0aGlzLCBSRUZJSUQgcmlpZCwgTFBWT0lEICpwcHZPYmopCit7ICBjaGFyCXhyaWlkWzUwXTsKKyAgIFdJTkVfU3RyaW5nRnJvbUNMU0lEKChMUENMU0lEKXJpaWQseHJpaWQpOworICAgVFJBQ0Uoc2hlbGwsIiglcCktPihcblx0SUlEOlx0JXMsJXApXG4iLHRoaXMseHJpaWQscHB2T2JqKTsKKworICAqcHB2T2JqID0gTlVMTDsKKworICBpZihJc0VxdWFsSUlEKHJpaWQsICZJSURfSVVua25vd24pKSAgICAgICAgICAvKklVbmtub3duKi8KKyAgeyAqcHB2T2JqID0gdGhpczsgCisgIH0KKyAgZWxzZSBpZihJc0VxdWFsSUlEKHJpaWQsICZJSURfSVNoZWxsRm9sZGVyKSkgIC8qSVNoZWxsRm9sZGVyKi8KKyAgeyAgICAqcHB2T2JqID0gKElTaGVsbEZvbGRlciopdGhpczsKKyAgfSAgIAorCisgIGlmKCpwcHZPYmopCisgIHsgKCooTFBTSEVMTEZPTERFUiopcHB2T2JqKS0+bHB2dGJsLT5mbkFkZFJlZih0aGlzKTsgIAkKKyAgICBUUkFDRShzaGVsbCwiLS0gSW50ZXJmYWNlOiAoJXApLT4oJXApXG4iLHBwdk9iaiwqcHB2T2JqKTsKKwkJcmV0dXJuIFNfT0s7CisgIH0KKwlUUkFDRShzaGVsbCwiLS0gSW50ZXJmYWNlOiBFX05PSU5URVJGQUNFXG4iKTsKKwlyZXR1cm4gRV9OT0lOVEVSRkFDRTsKK30gICAKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqICBJU2hlbGxGb2xkZXI6OkFkZFJlZgorKi8KKworc3RhdGljIFVMT05HIFdJTkFQSSBJU2hlbGxGb2xkZXJfQWRkUmVmKExQU0hFTExGT0xERVIgdGhpcykKK3sJVFJBQ0Uoc2hlbGwsIiglcCktPihjb3VudD0lbHUpXG4iLHRoaXMsKHRoaXMtPnJlZikrMSk7CisJcmV0dXJuICsrKHRoaXMtPnJlZik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIElTaGVsbEZvbGRlcl9SZWxlYXNlCisgKi8KK3N0YXRpYyBVTE9ORyBXSU5BUEkgSVNoZWxsRm9sZGVyX1JlbGVhc2UoTFBTSEVMTEZPTERFUiB0aGlzKSAKK3sgVFJBQ0Uoc2hlbGwsIiglcCktPihjb3VudD0lbHUpXG4iLHRoaXMsdGhpcy0+cmVmKTsKKyAgaWYgKCEtLSh0aGlzLT5yZWYpKSAKKyAgeyBUUkFDRShzaGVsbCwiLS0gZGVzdHJveWluZyBJU2hlbGxGb2xkZXIoJXApXG4iLHRoaXMpOworCisJCWlmIChwZGVza3RvcGZvbGRlcj09dGhpcykKKwkJeyBwZGVza3RvcGZvbGRlcj1OVUxMOworCQkgIFRSQUNFKHNoZWxsLCItLSBkZXN0cm95ZWQgSVNoZWxsRm9sZGVyKCVwKSB3YXMgRGVza3RvcGZvbGRlclxuIix0aGlzKTsKKwkJfQorICAgIGlmICh0aGlzLT5wUGlkbE1ncikKKyAgICB7IFBpZGxNZ3JfRGVzdHJ1Y3Rvcih0aGlzLT5wUGlkbE1ncik7CisgICAgfQorICAgIGlmKHRoaXMtPm1waWRsTlNSb290KQorICAgIHsgU0hGcmVlKHRoaXMtPm1waWRsTlNSb290KTsKKyAgICB9CisgICAgaWYodGhpcy0+bXBpZGwpCisgICAgeyBTSEZyZWUodGhpcy0+bXBpZGwpOworICAgIH0KKyAgICBpZih0aGlzLT5tbHBzekZvbGRlcikKKyAgICB7IFNIRnJlZSh0aGlzLT5tbHBzekZvbGRlcik7CisgICAgfQorCisJCUhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksMCx0aGlzKTsKKworCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIHRoaXMtPnJlZjsKK30KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgkJSVNoZWxsRm9sZGVyX1BhcnNlRGlzcGxheU5hbWUKKyogUEFSQU1FVEVSUworKiAgSFdORCAgICAgICAgICBod25kT3duZXIsICAgICAgLy9baW4gXSBQYXJlbnQgd2luZG93IGZvciBhbnkgbWVzc2FnZSdzCisqICBMUEJDICAgICAgICAgIHBiYywgICAgICAgICAgICAvL1tpbiBdIHJlc2VydmVkCisqICBMUE9MRVNUUiAgICAgIGxwc3pEaXNwbGF5TmFtZSwvL1tpbiBdICJVbmljb2RlIiBkaXNwbGF5bmFtZS4KKyogIFVMT05HKiAgICAgICAgcGNoRWF0ZW4sICAgICAgIC8vW291dF0gKHVuaWNvZGUpIGNoYXJhY3RlcnMgcHJvY2Vzc2VkCisqICBMUElURU1JRExJU1QqIHBwaWRsLCAgICAgICAgICAvL1tvdXRdIGNvbXBsZXggcGlkbCB0byBpdGVtCisqICBVTE9ORyogICAgICAgIHBkd0F0dHJpYnV0ZXMgICAvL1tvdXRdIGl0ZW1zIGF0dHJpYnV0ZXMKKyoKKyogRklYTUU6IAorKiAgICBwZHdBdHRyaWJ1dGVzOiBub3QgdXNlZAorKi8KK3N0YXRpYyBIUkVTVUxUIFdJTkFQSSBJU2hlbGxGb2xkZXJfUGFyc2VEaXNwbGF5TmFtZSgKKwlMUFNIRUxMRk9MREVSIHRoaXMsCisJSFdORDMyIGh3bmRPd25lciwKKwlMUEJDIHBiY1Jlc2VydmVkLAorICAgIExQT0xFU1RSMzIgbHBzekRpc3BsYXlOYW1lLAorICAgIERXT1JEICpwY2hFYXRlbiwKKyAgICBMUElURU1JRExJU1QgKnBwaWRsLAorCURXT1JEICpwZHdBdHRyaWJ1dGVzKQorewlIUkVTVUxUICAgICAgICBocj1FX09VVE9GTUVNT1JZOworICBMUElURU1JRExJU1QgICBwaWRsRnVsbD1OVUxMLCBwaWRsVGVtcCA9IE5VTEwsIHBpZGxPbGQgPSBOVUxMOworICBMUFNUUiAgICAgICAgICBwc3pOZXh0PU5VTEw7CisgIENIQVIgICAgICAgICAgIHN6RWxlbWVudFtNQVhfUEFUSF07CisgIEJPT0wzMiAgICAgICAgIGJUeXBlOworCisgIERXT1JEICAgICAgICAgIGR3Q2hhcnM9bHN0cmxlbjMyVyhscHN6RGlzcGxheU5hbWUpICsgMTsKKyAgTFBTVFIgICAgICAgICAgcHN6VGVtcD0oTFBTVFIpSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksMCxkd0NoYXJzICogc2l6ZW9mKENIQVIpKTsKKyAgICAgICAKKyAgVFJBQ0Uoc2hlbGwsIiglcCktPihIV05EPTB4JTA4eCwlcCwlcD0lcywlcCxwaWRsPSVwLCVwKVxuIiwKKwl0aGlzLGh3bmRPd25lcixwYmNSZXNlcnZlZCxscHN6RGlzcGxheU5hbWUsZGVidWdzdHJfdyhscHN6RGlzcGxheU5hbWUpLHBjaEVhdGVuLHBwaWRsLHBkd0F0dHJpYnV0ZXMpOworCisgIGlmKHBzelRlbXApCisgIHsgaHIgPSBFX0ZBSUw7CisgICAgV2lkZUNoYXJUb0xvY2FsMzIocHN6VGVtcCwgbHBzekRpc3BsYXlOYW1lLCBkd0NoYXJzKTsKKyAgICBpZigqcHN6VGVtcCkKKyAgICB7IGlmIChzdHJjbXAocHN6VGVtcCwiRGVza3RvcCIpPT0wKQorICAgICAgeyBwaWRsRnVsbCA9IChMUElURU1JRExJU1QpSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksMCwyKTsKKwkJCSAgcGlkbEZ1bGwtPm1raWQuY2IgPSAwOworCQkJfQorCQkgIGVsc2UKKwkJCXsgcGlkbEZ1bGwgPSB0aGlzLT5wUGlkbE1nci0+bHB2dGJsLT5mbkNyZWF0ZU15Q29tcHV0ZXIodGhpcy0+cFBpZGxNZ3IpOworCisgICAgICAgIC8qIGNoZWNrIGlmIHRoZSBscHN6RGlzcGxheU5hbWUgaXMgRm9sZGVyIG9yIEZpbGUqLworICAJCQliVHlwZSA9ICEgKEdldEZpbGVBdHRyaWJ1dGVzMzJBKHBzek5leHQpJkZJTEVfQVRUUklCVVRFX0RJUkVDVE9SWSk7CisgIAkJCXBzek5leHQgPSBHZXROZXh0RWxlbWVudChwc3pUZW1wLCBzekVsZW1lbnQsIE1BWF9QQVRIKTsKKyAgCisgICAgICAgIHBpZGxUZW1wID0gdGhpcy0+cFBpZGxNZ3ItPmxwdnRibC0+Zm5DcmVhdGVEcml2ZSh0aGlzLT5wUGlkbE1ncixzekVsZW1lbnQpOwkJCQorICAgICAgICBwaWRsT2xkID0gcGlkbEZ1bGw7CisgICAgICAgIHBpZGxGdWxsID0gSUxDb21iaW5lKHBpZGxGdWxsLHBpZGxUZW1wKTsKKyAgICAgICAgU0hGcmVlKHBpZGxPbGQpOworICAKKyAgCQkJaWYocGlkbEZ1bGwpCisgICAgICAgIHsgd2hpbGUoKHBzek5leHQ9R2V0TmV4dEVsZW1lbnQocHN6TmV4dCwgc3pFbGVtZW50LCBNQVhfUEFUSCkpKQorICAgICAgICAgIHsgaWYoISpwc3pOZXh0ICYmIGJUeXBlKQorICAJCQkJCXsgcGlkbFRlbXAgPSB0aGlzLT5wUGlkbE1nci0+bHB2dGJsLT5mbkNyZWF0ZVZhbHVlKHRoaXMtPnBQaWRsTWdyLHN6RWxlbWVudCk7CisgIAkJCQkJfQorICAJCQkJCWVsc2UJCQkJCisgICAgICAgICAgICB7IHBpZGxUZW1wID0gdGhpcy0+cFBpZGxNZ3ItPmxwdnRibC0+Zm5DcmVhdGVGb2xkZXIodGhpcy0+cFBpZGxNZ3Isc3pFbGVtZW50KTsKKyAgCQkJCQl9CisgICAgICAgICAgICBwaWRsT2xkID0gcGlkbEZ1bGw7CisgICAgICAgICAgICBwaWRsRnVsbCA9IElMQ29tYmluZShwaWRsRnVsbCxwaWRsVGVtcCk7CisgICAgICAgICAgICBTSEZyZWUocGlkbE9sZCk7CisgICAgICAgICAgfQorICAgICAgICAgIGhyID0gU19PSzsKKyAgICAgICAgfQorICAgICAgfQorCQl9CisgIH0KKwlIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLDAscHN6VGVtcCk7CisgICpwcGlkbCA9IHBpZGxGdWxsOworICByZXR1cm4gaHI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgkJSVNoZWxsRm9sZGVyX0VudW1PYmplY3RzCisqIFBBUkFNRVRFUlMKKyogIEhXTkQgICAgICAgICAgaHduZE93bmVyLCAgICAvL1tpbiBdIFBhcmVudCBXaW5kb3cKKyogIERXT1JEICAgICAgICAgZ3JmRmxhZ3MsICAgICAvL1tpbiBdIFNIQ09OVEYgZW51bWVyYXRpb24gbWFzaworKiAgTFBFTlVNSURMSVNUKiBwcGVudW1JRExpc3QgIC8vW291dF0gSUVudW1JRExpc3QgaW50ZXJmYWNlCisqLworc3RhdGljIEhSRVNVTFQgV0lOQVBJIElTaGVsbEZvbGRlcl9FbnVtT2JqZWN0cygKKwlMUFNIRUxMRk9MREVSIHRoaXMsCisJSFdORDMyIGh3bmRPd25lciwKKwlEV09SRCBkd0ZsYWdzLAorCUxQRU5VTUlETElTVCogcHBFbnVtSURMaXN0KQoreyBIUkVTVUxUICBocjsKKwlUUkFDRShzaGVsbCwiKCVwKS0+KEhXTkQ9MHglMDh4LDB4JTA4bHgsJXApXG4iLHRoaXMsaHduZE93bmVyLGR3RmxhZ3MscHBFbnVtSURMaXN0KTsKKworICAqcHBFbnVtSURMaXN0ID0gTlVMTDsKKwkqcHBFbnVtSURMaXN0ID0gSUVudW1JRExpc3RfQ29uc3RydWN0b3IgKHRoaXMtPm1scHN6Rm9sZGVyLCBkd0ZsYWdzLCAmaHIpOworICBUUkFDRShzaGVsbCwiLS0gKCVwKS0+KG5ldyBJRCBMaXN0OiAlcClcbiIsdGhpcywqcHBFbnVtSURMaXN0KTsKKyAgaWYoISpwcEVudW1JRExpc3QpCisgIHsgcmV0dXJuIGhyOworICB9CisgIHJldHVybiBTX09LOwkJCit9CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBJU2hlbGxGb2xkZXJfSW5pdGlhbGl6ZSgpCisgKiAgSVBlcnNpc3RGb2xkZXIgTWV0aG9kCisgKi8KK3N0YXRpYyBIUkVTVUxUIFdJTkFQSSBJU2hlbGxGb2xkZXJfSW5pdGlhbGl6ZSgKKwlMUFNIRUxMRk9MREVSIHRoaXMsCisJTFBDSVRFTUlETElTVCBwaWRsKQoreyBUUkFDRShzaGVsbCwiKCVwKS0+KHBpZGw9JXApXG4iLHRoaXMscGlkbCk7CisgIGlmKHRoaXMtPm1waWRsTlNSb290KQorICB7IFNIRnJlZSh0aGlzLT5tcGlkbE5TUm9vdCk7CisgICAgdGhpcy0+bXBpZGxOU1Jvb3QgPSBOVUxMOworICB9CisgIHRoaXMtPm1waWRsTlNSb290PUlMQ2xvbmUocGlkbCk7CisgIHJldHVybiBTX09LOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoJCUlTaGVsbEZvbGRlcl9CaW5kVG9PYmplY3QKKyogUEFSQU1FVEVSUworKiAgTFBDSVRFTUlETElTVCBwaWRsLCAgICAgICAvL1tpbiBdIGNvbXBsZXggcGlkbCB0byBvcGVuCisqICBMUEJDICAgICAgICAgIHBiYywgICAgICAgIC8vW2luIF0gcmVzZXJ2ZWQKKyogIFJFRklJRCAgICAgICAgcmlpZCwgICAgICAgLy9baW4gXSBJbml0aWFsIEludGVyZmFjZQorKiAgTFBWT0lEKiAgICAgICBwcHZPYmplY3QgICAvL1tvdXRdIEludGVyZmFjZSoKKyovCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkgSVNoZWxsRm9sZGVyX0JpbmRUb09iamVjdCgKKwlMUFNIRUxMRk9MREVSIHRoaXMsCisJTFBDSVRFTUlETElTVCBwaWRsLAorCUxQQkMgcGJjUmVzZXJ2ZWQsCisJUkVGSUlEIHJpaWQsCisJTFBWT0lEICogcHB2T3V0KQorewljaGFyCSAgICAgICAgeHJpaWRbNTBdOworICBIUkVTVUxUICAgICAgIGhyOworCUxQU0hFTExGT0xERVIgcFNoZWxsRm9sZGVyOworCQorCVdJTkVfU3RyaW5nRnJvbUNMU0lEKHJpaWQseHJpaWQpOworCisJVFJBQ0Uoc2hlbGwsIiglcCktPihwaWRsPSVwLCVwLFxuXHRJSUQ6JXMsJXApXG4iLHRoaXMscGlkbCxwYmNSZXNlcnZlZCx4cmlpZCxwcHZPdXQpOworCisgICpwcHZPdXQgPSBOVUxMOworICBwU2hlbGxGb2xkZXIgPSBJU2hlbGxGb2xkZXJfQ29uc3RydWN0b3IodGhpcywgcGlkbCk7CisgIGlmKCFwU2hlbGxGb2xkZXIpCisgICAgcmV0dXJuIEVfT1VUT0ZNRU1PUlk7CisgIC8qICBwU2hlbGxGb2xkZXItPmxwdnRibC0+Zm5Jbml0aWFsaXplKHBTaGVsbEZvbGRlciwgdGhpcy0+bXBpZGxOU1Jvb3QpOyovCisgIElTaGVsbEZvbGRlcl9Jbml0aWFsaXplKHBTaGVsbEZvbGRlciwgdGhpcy0+bXBpZGxOU1Jvb3QpOworICBociA9IHBTaGVsbEZvbGRlci0+bHB2dGJsLT5mblF1ZXJ5SW50ZXJmYWNlKHBTaGVsbEZvbGRlciwgcmlpZCwgcHB2T3V0KTsKKyAgcFNoZWxsRm9sZGVyLT5scHZ0YmwtPmZuUmVsZWFzZShwU2hlbGxGb2xkZXIpOworCVRSQUNFKHNoZWxsLCItLSAoJXApLT4oaW50ZXJmYWNlPSVwKVxuIix0aGlzLCBwcHZPdXQpOworICByZXR1cm4gaHI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiAgSVNoZWxsRm9sZGVyX0JpbmRUb1N0b3JhZ2UKKyogUEFSQU1FVEVSUworKiAgTFBDSVRFTUlETElTVCBwaWRsLCAgICAgICAvL1tpbiBdIGNvbXBsZXggcGlkbCB0byBzdG9yZQorKiAgTFBCQyAgICAgICAgICBwYmMsICAgICAgICAvL1tpbiBdIHJlc2VydmVkCisqICBSRUZJSUQgICAgICAgIHJpaWQsICAgICAgIC8vW2luIF0gSW5pdGlhbCBzdG9yYWdlIGludGVyZmFjZSAKKyogIExQVk9JRCogICAgICAgcHB2T2JqZWN0ICAgLy9bb3V0XSBJbnRlcmZhY2UqIHJldHVybmVkCisqLworc3RhdGljIEhSRVNVTFQgV0lOQVBJIElTaGVsbEZvbGRlcl9CaW5kVG9TdG9yYWdlKAorICAJTFBTSEVMTEZPTERFUiB0aGlzLAorICAgIExQQ0lURU1JRExJU1QgcGlkbCwgLypzaW1wbGUvY29tcGxleCBwaWRsKi8KKyAgICBMUEJDIHBiY1Jlc2VydmVkLCAKKyAgICBSRUZJSUQgcmlpZCwgCisgICAgTFBWT0lEICpwcHZPdXQpCit7CWNoYXIgeHJpaWRbNTBdOworCVdJTkVfU3RyaW5nRnJvbUNMU0lEKHJpaWQseHJpaWQpOworCisJRklYTUUoc2hlbGwsIiglcCktPihwaWRsPSVwLCVwLFxuXHRJSUQ6JXMsJXApIHN0dWJcbiIsdGhpcyxwaWRsLHBiY1Jlc2VydmVkLHhyaWlkLHBwdk91dCk7CisKKyAgKnBwdk91dCA9IE5VTEw7CisgIHJldHVybiBFX05PVElNUEw7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiAgSVNoZWxsRm9sZGVyX0NvbXBhcmVJRHMKKyoKKyogUEFSTUVURVJTCisqICBMUEFSQU0gICAgICAgIGxQYXJhbSwgLy9baW4gXSBDb2x1bW4/CisqICBMUENJVEVNSURMSVNUIHBpZGwxLCAgLy9baW4gXSBzaW1wbGUgcGlkbAorKiAgTFBDSVRFTUlETElTVCBwaWRsMikgIC8vW2luIF0gc2ltcGxlIHBpZGwKKyogRklYTUUKKyogIHdlIGhhdmUgdG8gaGFuZGxlIHNpbXBsZSBwaWRsJ3Mgb25seQorKi8KK3N0YXRpYyBIUkVTVUxUIFdJTkFQSSAgSVNoZWxsRm9sZGVyX0NvbXBhcmVJRHMoCisgIAlMUFNIRUxMRk9MREVSIHRoaXMsCisJCUxQQVJBTSBsUGFyYW0sIAorICAgIExQQ0lURU1JRExJU1QgcGlkbDEsIC8qc2ltcGxlIHBpZGwqLworICAgIExQQ0lURU1JRExJU1QgcGlkbDIpIC8qc2ltcGxlIHBpZGwqLworeyBDSEFSIHN6U3RyaW5nMVtNQVhfUEFUSF0gPSAiIjsKKyAgQ0hBUiBzelN0cmluZzJbTUFYX1BBVEhdID0gIiI7CisgIGludCAgIG5SZXR1cm47CisgIExQQ0lURU1JRExJU1QgIHBpZGxUZW1wMSA9IHBpZGwxLCBwaWRsVGVtcDIgPSBwaWRsMjsKKworICBUUkFDRShzaGVsbCwiKCVwKS0+KDB4JTA4bHgscGlkbDE9JXAscGlkbDI9JXApXG4iLHRoaXMsbFBhcmFtLHBpZGwxLHBpZGwyKTsKKworICAvKlNwZWNpYWwgY2FzZSAtIElmIG9uZSBvZiB0aGUgaXRlbXMgaXMgYSBQYXRoIGFuZCB0aGUgb3RoZXIgaXMgYSBGaWxlLCBhbHdheXMgCisgIG1ha2UgdGhlIFBhdGggY29tZSBiZWZvcmUgdGhlIEZpbGUuKi8KKworICAvKiBnZXQgdGhlIGxhc3QgaXRlbSBpbiBlYWNoIGxpc3QgKi8KKyAgd2hpbGUoKElMR2V0TmV4dChwaWRsVGVtcDEpKS0+bWtpZC5jYikKKyAgICBwaWRsVGVtcDEgPSBJTEdldE5leHQocGlkbFRlbXAxKTsKKyAgd2hpbGUoKElMR2V0TmV4dChwaWRsVGVtcDIpKS0+bWtpZC5jYikKKyAgICBwaWRsVGVtcDIgPSBJTEdldE5leHQocGlkbFRlbXAyKTsKKworICAvKiBhdCB0aGlzIHBvaW50LCBib3RoIHBpZGxUZW1wMSBhbmQgcGlkbFRlbXAyIHBvaW50IHRvIHRoZSBsYXN0IGl0ZW0gaW4gdGhlIGxpc3QgKi8KKyAgaWYodGhpcy0+cFBpZGxNZ3ItPmxwdnRibC0+Zm5Jc1ZhbHVlKHRoaXMtPnBQaWRsTWdyLHBpZGxUZW1wMSkgIT0gdGhpcy0+cFBpZGxNZ3ItPmxwdnRibC0+Zm5Jc1ZhbHVlKHRoaXMtPnBQaWRsTWdyLHBpZGxUZW1wMikpCisgIHsgaWYodGhpcy0+cFBpZGxNZ3ItPmxwdnRibC0+Zm5Jc1ZhbHVlKHRoaXMtPnBQaWRsTWdyLHBpZGxUZW1wMSkpCisgICAgICByZXR1cm4gMTsKKyAgIHJldHVybiAtMTsKKyAgfQorCisgIHRoaXMtPnBQaWRsTWdyLT5scHZ0YmwtPmZuR2V0RHJpdmUodGhpcy0+cFBpZGxNZ3IsIHBpZGwxLHN6U3RyaW5nMSxzaXplb2Yoc3pTdHJpbmcxKSk7CisgIHRoaXMtPnBQaWRsTWdyLT5scHZ0YmwtPmZuR2V0RHJpdmUodGhpcy0+cFBpZGxNZ3IsIHBpZGwyLHN6U3RyaW5nMSxzaXplb2Yoc3pTdHJpbmcyKSk7CisgIG5SZXR1cm4gPSBzdHJjYXNlY21wKHN6U3RyaW5nMSwgc3pTdHJpbmcyKTsKKyAgaWYoblJldHVybikKKyAgICByZXR1cm4gblJldHVybjsKKworICB0aGlzLT5wUGlkbE1nci0+bHB2dGJsLT5mbkdldEZvbGRlclRleHQodGhpcy0+cFBpZGxNZ3IsIHBpZGwxLHN6U3RyaW5nMSxzaXplb2Yoc3pTdHJpbmcxKSk7CisgIHRoaXMtPnBQaWRsTWdyLT5scHZ0YmwtPmZuR2V0Rm9sZGVyVGV4dCh0aGlzLT5wUGlkbE1nciwgcGlkbDIsc3pTdHJpbmcyLHNpemVvZihzelN0cmluZzIpKTsKKyAgblJldHVybiA9IHN0cmNhc2VjbXAoc3pTdHJpbmcxLCBzelN0cmluZzIpOworICBpZihuUmV0dXJuKQorICAgIHJldHVybiBuUmV0dXJuOworCisgIHRoaXMtPnBQaWRsTWdyLT5scHZ0YmwtPmZuR2V0VmFsdWVUZXh0KHRoaXMtPnBQaWRsTWdyLHBpZGwxLHN6U3RyaW5nMSxzaXplb2Yoc3pTdHJpbmcxKSk7CisgIHRoaXMtPnBQaWRsTWdyLT5scHZ0YmwtPmZuR2V0VmFsdWVUZXh0KHRoaXMtPnBQaWRsTWdyLHBpZGwyLHN6U3RyaW5nMixzaXplb2Yoc3pTdHJpbmcyKSk7CisgIHJldHVybiBzdHJjYXNlY21wKHN6U3RyaW5nMSwgc3pTdHJpbmcyKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCSAgSVNoZWxsRm9sZGVyX0NyZWF0ZVZpZXdPYmplY3QKKyogQ3JlYXRlcyBhbiBWaWV3IE9iamVjdCByZXByZXNlbnRpbmcgdGhlIFNoZWxsRm9sZGVyCisqICBJU2hlbGxWaWV3IC8gSVNoZWxsQnJvd3NlciAvIElDb250ZXh0TWVudQorKgorKiBQQVJBTUVURVJTCisqICBIV05EICAgIGh3bmRPd25lciwgIC8vIEhhbmRsZSBvZiBvd25lciB3aW5kb3cKKyogIFJFRklJRCAgcmlpZCwgICAgICAgLy8gUmVxdWVzdGVkIGluaXRpYWwgaW50ZXJmYWNlCisqICBMUFZPSUQqIHBwdk9iamVjdCkgIC8vIFJlc3VsdGFudCBpbnRlcmZhY2UqCisqCisqIE5PVEVTCisqICB0aGUgc2FtZSBhcyBTSENyZWF0ZVNoZWxsRm9sZGVyVmlld0V4ID8/PworKi8KK3N0YXRpYyBIUkVTVUxUIFdJTkFQSSBJU2hlbGxGb2xkZXJfQ3JlYXRlVmlld09iamVjdCgKKwlMUFNIRUxMRk9MREVSIHRoaXMsCisJSFdORDMyIGh3bmRPd25lciwKKwlSRUZJSUQgcmlpZCwKKwlMUFZPSUQgKnBwdk91dCkKK3sgTFBTSEVMTFZJRVcgcFNoZWxsVmlldzsKKyAgY2hhciAgICB4cmlpZFs1MF07CisgIEhSRVNVTFQgICAgICAgaHI7CisKKwlXSU5FX1N0cmluZ0Zyb21DTFNJRChyaWlkLHhyaWlkKTsKKyAgVFJBQ0Uoc2hlbGwsIiglcCktPihod25kPTB4JXgsXG5cdElJRDpcdCVzLCVwKVxuIix0aGlzLGh3bmRPd25lcix4cmlpZCxwcHZPdXQpOworCQorCSpwcHZPdXQgPSBOVUxMOworCisgIHBTaGVsbFZpZXcgPSBJU2hlbGxWaWV3X0NvbnN0cnVjdG9yKHRoaXMsIHRoaXMtPm1waWRsKTsKKyAgaWYoIXBTaGVsbFZpZXcpCisgICAgcmV0dXJuIEVfT1VUT0ZNRU1PUlk7CisgIGhyID0gcFNoZWxsVmlldy0+bHB2dGJsLT5mblF1ZXJ5SW50ZXJmYWNlKHBTaGVsbFZpZXcsIHJpaWQsIHBwdk91dCk7CisgIHBTaGVsbFZpZXctPmxwdnRibC0+Zm5SZWxlYXNlKHBTaGVsbFZpZXcpOworICBUUkFDRShzaGVsbCwiLS0gKCVwKS0+KGludGVyZmFjZT0lcClcbiIsdGhpcywgcHB2T3V0KTsKKyAgcmV0dXJuIGhyOyAKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqICBJU2hlbGxGb2xkZXJfR2V0QXR0cmlidXRlc09mCisqCisqIFBBUkFNRVRFUlMKKyogIFVJTlQgICAgICAgICAgICBjaWRsLCAgICAgLy9baW4gXSBudW0gZWxlbWVudHMgaW4gcGlkbCBhcnJheQorKyAgTFBDSVRFTUlETElTVCogIGFwaWRsLCAgICAvL1tpbiBdIHNpbXBsZSBwaWRsIGFycmF5IAorKiAgVUxPTkcqICAgICAgICAgIHJnZkluT3V0KSAvL1tvdXRdIHJlc3VsdCBhcnJheSAgCisqCisqIEZJWE1FOiBxdWljayBoYWNrCisqICBOb3RlOiByZ2ZJbk91dCBpcyBkb2N1bWVudGVkIGFzIGJlaW5nIGFuIGFycmF5IG9mIFVMT05HUy4KKyogIFRoaXMgZG9lcyBub3Qgc2VlbSB0byBiZSB0aGUgY2FzZS4gVGVzdGluZyB0aGlzIGZ1bmN0aW9uIHVzaW5nIHRoZSBzaGVsbCB0byAKKyogIGNhbGwgaXQgd2l0aCBjaWRsID4gMSAoYnkgZGVsZXRpbmcgbXVsdGlwbGUgaXRlbXMpIHJldmVhbHMgdGhhdCB0aGUgc2hlbGwKKyogIHBhc3NlcyBPTkUgZWxlbWVudCBpbiB0aGUgYXJyYXkgYW5kIHdyaXRpbmcgdG8gZnVydGhlciBlbGVtZW50cyB3aWxsCisqICBjYXVzZSB0aGUgc2hlbGwgdG8gZmFpbCBsYXRlci4KKyovCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkgSVNoZWxsRm9sZGVyX0dldEF0dHJpYnV0ZXNPZigKKwlMUFNIRUxMRk9MREVSIHRoaXMsCisJVUlOVDMyIGNpZGwsCisgICAgTFBDSVRFTUlETElTVCAqYXBpZGwsIC8qc2ltcGxlIHBpZGwncyovCisJRFdPUkQgKnJnZkluT3V0KQoreyBMUENJVEVNSURMSVNUICogcGlkbHRlbXA7CisgIERXT1JEIGk7CisKKyAgVFJBQ0Uoc2hlbGwsIiglcCktPiglZCwlcCwlcClcbiIsdGhpcyxjaWRsLGFwaWRsLHJnZkluT3V0KTsKKworICBpZiAoKCEgY2lkbCApfCAoIWFwaWRsKSB8ICghcmdmSW5PdXQpKQorICAgIHJldHVybiBFX0lOVkFMSURBUkc7CisKKyAgcGlkbHRlbXA9YXBpZGw7CisgICpyZ2ZJbk91dCA9IDB4MDA7CisgIGk9Y2lkbDsKKworICBUUkFDRShzaGVsbCwiLS0gbWFzaz0weCUwOGx4XG4iLCpyZ2ZJbk91dCk7CisgIAorICBkbworICB7IGlmICgqcGlkbHRlbXApCisgICAgeyBpZiAodGhpcy0+cFBpZGxNZ3ItPmxwdnRibC0+Zm5Jc0Rlc2t0b3AodGhpcy0+cFBpZGxNZ3IsICpwaWRsdGVtcCkpCisgICAgICB7ICpyZ2ZJbk91dCB8PSAoU0ZHQU9fRk9MREVSIHwgU0ZHQU9fSEFTU1VCRk9MREVSIHwgU0ZHQU9fRklMRVNZU0FOQ0VTVE9SKTsKKyAgICAgIH0KKyAgICAgIGVsc2UgaWYgKHRoaXMtPnBQaWRsTWdyLT5scHZ0YmwtPmZuSXNNeUNvbXB1dGVyKHRoaXMtPnBQaWRsTWdyLCAqcGlkbHRlbXApKQorICAgICAgeyAqcmdmSW5PdXQgfD0gKFNGR0FPX0ZPTERFUiB8IFNGR0FPX0hBU1NVQkZPTERFUik7CisgICAgICB9CisgICAgICBlbHNlIGlmICh0aGlzLT5wUGlkbE1nci0+bHB2dGJsLT5mbklzRHJpdmUodGhpcy0+cFBpZGxNZ3IsICpwaWRsdGVtcCkpCisgICAgICB7ICpyZ2ZJbk91dCB8PSAoU0ZHQU9fRk9MREVSIHwgU0ZHQU9fSEFTU1VCRk9MREVSIHwgU0ZHQU9fRklMRVNZU0FOQ0VTVE9SIHwgU0ZHQU9fRklMRVNZU1RFTSk7CisgICAgICB9CisgICAgICBlbHNlIGlmICh0aGlzLT5wUGlkbE1nci0+bHB2dGJsLT5mbklzRm9sZGVyKHRoaXMtPnBQaWRsTWdyLCAqcGlkbHRlbXApKQorICAgICAgeyAqcmdmSW5PdXQgfD0gKFNGR0FPX0ZPTERFUiB8IFNGR0FPX0ZJTEVTWVNURU0gfCBTRkdBT19IQVNTVUJGT0xERVIpOworICAgICAgfQorICAgICAgZWxzZSBpZiAodGhpcy0+cFBpZGxNZ3ItPmxwdnRibC0+Zm5Jc1ZhbHVlKHRoaXMtPnBQaWRsTWdyLCAqcGlkbHRlbXApKQorICAgICAgeyAqcmdmSW5PdXQgfD0gKFNGR0FPX0ZJTEVTWVNURU0pOworICAgICAgfQorICAgIH0KKyAgICBwaWRsdGVtcCsrOworICAgIGNpZGwtLTsKKyAgfSB3aGlsZSAoY2lkbCA+IDAgJiYgKnBpZGx0ZW1wKTsKKworICByZXR1cm4gU19PSzsKK30KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiAgSVNoZWxsRm9sZGVyX0dldFVJT2JqZWN0T2YKKyoKKyogUEFSQU1FVEVSUworKiAgSFdORCAgICAgICAgICAgaHduZE93bmVyLCAvL1tpbiBdIFBhcmVudCB3aW5kb3cgZm9yIGFueSBvdXRwdXQKKyogIFVJTlQgICAgICAgICAgIGNpZGwsICAgICAgLy9baW4gXSBhcnJheSBzaXplCisqICBMUENJVEVNSURMSVNUKiBhcGlkbCwgICAgIC8vW2luIF0gc2ltcGxlIHBpZGwgYXJyYXkKKyogIFJFRklJRCAgICAgICAgIHJpaWQsICAgICAgLy9baW4gXSBSZXF1ZXN0ZWQgSW50ZXJmYWNlCisqICBVSU5UKiAgICAgICAgICBwcmdmSW5PdXQsIC8vWyAgIF0gcmVzZXJ2ZWQgCisqICBMUFZPSUQqICAgICAgICBwcHZPYmplY3QpIC8vW291dF0gUmVzdWx0aW5nIEludGVyZmFjZQorKgorKiBOT1RFUworKiAgVGhpcyBmdW5jdGlvbiBnZXRzIGFza2VkIHRvIHJldHVybiAidmlldyBvYmplY3RzIiBmb3Igb25lIG9yIG1vcmUgKG11bHRpcGxlIHNlbGVjdCkKKyogIGl0ZW1zOgorKiAgVGhlIHZpZXdvYmplY3QgdHlwaWNhbGx5IGlzIGFuIENPTSBvYmplY3Qgd2l0aCBvbmUgb2YgdGhlIGZvbGxvd2luZyBpbnRlcmZhY2VzOgorKiAgSUV4dHJhY3RJY29uLElEYXRhT2JqZWN0LElDb250ZXh0TWVudQorKiAgSW4gb3JkZXIgdG8gc3VwcG9ydCBpY29uIHBvc2l0aW9ucyBpbiB0aGUgZGVmYXVsdCBMaXN0dmlldyB5b3VyIERhdGFPYmplY3QKKyogIG11c3QgaW1wbGVtZW50IHRoZSBTZXREYXRhIG1ldGhvZCAoaW4gYWRkaXRpb24gdG8gR2V0RGF0YSA6KSAtIHRoZSBzaGVsbCBwYXNzZXMKKyogIGEgYmFyZWx5IGRvY3VtZW50ZWQgIkljb24gcG9zaXRpb25zIiBzdHJ1Y3R1cmUgdG8gU2V0RGF0YSB3aGVuIHRoZSBkcmFnIHN0YXJ0cywKKyogIGFuZCBHZXREYXRhJ3MgaXQgaWYgdGhlIGRyb3AgaXMgaW4gYW5vdGhlciBleHBsb3JlciB3aW5kb3cgdGhhdCBuZWVkcyB0aGUgcG9zaXRpb25zLgorKi8KK3N0YXRpYyBIUkVTVUxUIFdJTkFQSSBJU2hlbGxGb2xkZXJfR2V0VUlPYmplY3RPZiggTFBTSEVMTEZPTERFUiB0aGlzLEhXTkQzMiBod25kT3duZXIsVUlOVDMyIGNpZGwsCisgTFBDSVRFTUlETElTVCAqIGFwaWRsLCBSRUZJSUQgcmlpZCwgVUlOVDMyICogcHJnZkluT3V0LExQVk9JRCAqIHBwdk91dCkKK3sgY2hhcgkgICAgICAgIHhjbHNpZFs1MF07CisgIExQRVhUUkFDVElDT04JcGVpOworICBMUENPTlRFWFRNRU5VCXBjbTsKKyAgTFBJVEVNSURMSVNUCXBpZGw7CisgICAKKyAgV0lORV9TdHJpbmdGcm9tQ0xTSUQocmlpZCx4Y2xzaWQpOworCisgIFRSQUNFKHNoZWxsLCIoJXApLT4oJXUsJXUscGlkbD0lcCxcblx0SUlEOiVzLCVwLCVwKVxuIiwKKwkgIHRoaXMsaHduZE93bmVyLGNpZGwsYXBpZGwseGNsc2lkLHByZ2ZJbk91dCxwcHZPdXQpOworCisgICpwcHZPdXQgPSBOVUxMOworCisgIGlmKElzRXF1YWxJSUQocmlpZCwgJklJRF9JQ29udGV4dE1lbnUpKQorICB7IHBjbSAgPSBJQ29udGV4dE1lbnVfQ29uc3RydWN0b3IodGhpcywgYXBpZGwsIGNpZGwpOworICAgIGlmKHBjbSkKKyAgICB7ICpwcHZPdXQgPSBwY207CisgICAgICByZXR1cm4gU19PSzsKKyAgICB9CisgIH0KKworICBpZihjaWRsICE9IDEpCisgICAgcmV0dXJuIEVfRkFJTDsKKworICBpZihJc0VxdWFsSUlEKHJpaWQsICZJSURfSUV4dHJhY3RJY29uKSkKKyAgeyBwaWRsID0gSUxDb21iaW5lKHRoaXMtPm1waWRsLCBhcGlkbFswXSk7CisgICAgcGVpID0gSUV4dHJhY3RJY29uX0NvbnN0cnVjdG9yKHBpZGwpOworCisgICAgLyogVGhlIHRlbXAgUElETCBjYW4gYmUgZGVsZXRlZCBiZWNhdXNlIHRoZSBuZXcgQ0V4dHJhY3RJY29uIGVpdGhlciBmYWlsZWQgb3IgCisgICAgbWFkZSBpdHMgb3duIGNvcHkgb2YgaXQuICovCisgICAgU0hGcmVlKHBpZGwpOworCisgICAgaWYocGVpKQorICAgIHsgKnBwdk91dCA9IHBlaTsKKyAgICAgICByZXR1cm4gU19PSzsKKyAgICB9CisgICAgcmV0dXJuIEVfT1VUT0ZNRU1PUlk7CisgIH0KKworLyogIGlmKElzRXF1YWxJSUQocmlpZCwgSUlEX0lRdWVyeUluZm8pKQorICB7IENRdWVyeUluZm8gICAgICpwcWl0OworICAgIExQSVRFTUlETElTVCAgIHBpZGw7CisgICAgcGlkbCA9IG1fcFBpZGxNZ3ItPkNvbmNhdGVuYXRlKG1fcGlkbCwgcFBpZGxbMF0pOworICAgIHBxaXQgPSBuZXcgQ1F1ZXJ5SW5mbyhwaWRsKTsKKyAqLworICAgIC8qIFRoZSB0ZW1wIFBJREwgY2FuIGJlIGRlbGV0ZWQgYmVjYXVzZSB0aGUgbmV3IENRdWVyeUluZm8gZWl0aGVyIGZhaWxlZCBvciAKKyAgICBtYWRlIGl0cyBvd24gY29weSBvZiBpdC4gKi8KKyAvKiAgIG1fcFBpZGxNZ3ItPkRlbGV0ZShwaWRsKTsKKyAKKyAgICBpZihwcWl0KQorICAgIHsgKnBwdlJldHVybiA9IHBxaXQ7CisgICAgICByZXR1cm4gU19PSzsKKyAgICB9CisgICAgcmV0dXJuIEVfT1VUT0ZNRU1PUlk7CisgIH0KKyovCisgIEVSUihzaGVsbCwiKCVwKS0+RV9OT0lOVEVSRkFDRVxuIix0aGlzKTsKKyAgcmV0dXJuIEVfTk9JTlRFUkZBQ0U7Cit9CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogIElTaGVsbEZvbGRlcl9HZXREaXNwbGF5TmFtZU9mCisqICBSZXRyaWV2ZXMgdGhlIGRpc3BsYXkgbmFtZSBmb3IgdGhlIHNwZWNpZmllZCBmaWxlIG9iamVjdCBvciBzdWJmb2xkZXIKKyoKKyogUEFSQU1FVEVSUworKiAgTFBDSVRFTUlETElTVCBwaWRsLCAgICAvL1tpbiBdIGNvbXBsZXggcGlkbCB0byBpdGVtCisqICBEV09SRCAgICAgICAgIGR3RmxhZ3MsIC8vW2luIF0gU0hHTk8gZm9ybWF0dGluZyBmbGFncworKiAgTFBTVFJSRVQgICAgICBscE5hbWUpICAvL1tvdXRdIFJldHVybmVkIGRpc3BsYXkgbmFtZQorKgorKiBGSVhNRQorKiAgaWYgdGhlIG5hbWUgaXMgaW4gdGhlIHBpZGwgdGhlIHJldCB2YWx1ZSBzaG91bGQgYmUgYSBTVFJSRVRfT0ZGU0VUCisqLworI2RlZmluZSBHRVRfU0hHRE5fRk9SKGR3RmxhZ3MpICAgICAgICAgKChEV09SRClkd0ZsYWdzICYgKERXT1JEKTB4MDAwMEZGMDApCisjZGVmaW5lIEdFVF9TSEdETl9SRUxBVElPTihkd0ZsYWdzKSAgICAoKERXT1JEKWR3RmxhZ3MgJiAoRFdPUkQpMHgwMDAwMDBGRikKKworc3RhdGljIEhSRVNVTFQgV0lOQVBJIElTaGVsbEZvbGRlcl9HZXREaXNwbGF5TmFtZU9mKCAKKyAgCUxQU0hFTExGT0xERVIgdGhpcywKKyAgICBMUENJVEVNSURMSVNUIHBpZGwsIC8qIHNpbXBsZS9jb21wbGV4IHBpZGwqLworICAgIERXT1JEIGR3RmxhZ3MsIAorICAgIExQU1RSUkVUIGxwTmFtZSkKK3sgQ0hBUiAgICAgICAgICAgc3pUZXh0W01BWF9QQVRIXTsKKyAgQ0hBUiAgICAgICAgICAgc3pUZW1wW01BWF9QQVRIXTsKKwlDSEFSICAgICAgICAgICBzelNwZWNpYWxbTUFYX1BBVEhdOworCUNIQVIgICAgICAgICAgIHN6RHJpdmVbTUFYX1BBVEhdOworICBEV09SRCAgICAgICAgICBkd1ZvbHVtZVNlcmlhbE51bWJlcixkd01heGltdW1Db21wb25ldExlbmd0aCxkd0ZpbGVTeXN0ZW1GbGFnczsKKyAgTFBJVEVNSURMSVNUICAgcGlkbFRlbXA9TlVMTDsKKwlCT09MMzIJCQkJIGJTaW1wbGVQaWRsPUZBTFNFOworCQkKKyAgVFJBQ0Uoc2hlbGwsIiglcCktPihwaWRsPSVwLDB4JTA4bHgsJXApXG4iLHRoaXMscGlkbCxkd0ZsYWdzLGxwTmFtZSk7CisKKyAgaWYgKCFwaWRsKQorICB7ICByZXR1cm4gRV9PVVRPRk1FTU9SWTsKKyAgfSAKKworICBzelNwZWNpYWxbMF09MHgwMDsgCisgIHN6RHJpdmVbMF09MHgwMDsKKworICAvKiB0ZXN0IGlmIHNpbXBsZShyZWxhdGl2ZSkgb3IgY29tcGxleChhYnNvbHV0ZSkgcGlkbCAqLworICBwaWRsVGVtcCA9IElMR2V0TmV4dChwaWRsKTsKKwlpZiAocGlkbFRlbXAtPm1raWQuY2I9PTB4MDApCisJeyBiU2ltcGxlUGlkbCA9IFRSVUU7CisJfQorCWlmICh0aGlzLT5wUGlkbE1nci0+bHB2dGJsLT5mbklzRGVza3RvcCh0aGlzLT5wUGlkbE1nciwgcGlkbCkpCisJeyBzdHJjcHkgKHN6VGV4dCwiRGVza3RvcCIpOworCX0KKwllbHNlCisgIHsgaWYgKHRoaXMtPnBQaWRsTWdyLT5scHZ0YmwtPmZuSXNNeUNvbXB1dGVyKHRoaXMtPnBQaWRsTWdyLCBwaWRsKSkKKyAgICB7IHRoaXMtPnBQaWRsTWdyLT5scHZ0YmwtPmZuR2V0SXRlbVRleHQodGhpcy0+cFBpZGxNZ3IsIHBpZGwsIHN6U3BlY2lhbCwgTUFYX1BBVEgpOworICAgIH0KKwkgIGlmICh0aGlzLT5wUGlkbE1nci0+bHB2dGJsLT5mbklzRHJpdmUodGhpcy0+cFBpZGxNZ3IsIHBpZGwpKQorCQl7IHBpZGxUZW1wID0gdGhpcy0+cFBpZGxNZ3ItPmxwdnRibC0+Zm5HZXRMYXN0SXRlbSh0aGlzLT5wUGlkbE1ncixwaWRsKTsKKyAgCQlpZiAocGlkbFRlbXApCisgICAgICB7IHRoaXMtPnBQaWRsTWdyLT5scHZ0YmwtPmZuR2V0SXRlbVRleHQodGhpcy0+cFBpZGxNZ3IsIHBpZGxUZW1wLCBzelRlbXAsIE1BWF9QQVRIKTsKKyAgCQl9CisJCSAgaWYgKCBkd0ZsYWdzPT1TSEdETl9OT1JNQUwgfHwgZHdGbGFncz09U0hHRE5fSU5GT0xERVIpCisgIAkJeyBHZXRWb2x1bWVJbmZvcm1hdGlvbjMyQShzelRlbXAsc3pEcml2ZSxNQVhfUEFUSCwmZHdWb2x1bWVTZXJpYWxOdW1iZXIsJmR3TWF4aW11bUNvbXBvbmV0TGVuZ3RoLCZkd0ZpbGVTeXN0ZW1GbGFncyxOVUxMLDApOworCQkJCWlmIChzelRlbXBbMl09PSdcXCcpCisgICAgICAgIHsgc3pUZW1wWzJdPTB4MDA7CisJCQkJfQorICAgICAgICBzdHJjYXQgKHN6RHJpdmUsIiAoIik7CisJCQkJc3RyY2F0IChzekRyaXZlLHN6VGVtcCk7CisJCQkJc3RyY2F0IChzekRyaXZlLCIpIik7IAorICAJCX0KKwkJCWVsc2UKKwkJCXsgIFBhdGhBZGRCYWNrc2xhc2ggKHN6VGVtcCk7CisJCQkgICBzdHJjcHkoc3pEcml2ZSxzelRlbXApOworCQkJfQorCQl9CisJCQorICAJc3dpdGNoKGR3RmxhZ3MpCisgICAgeyBjYXNlIFNIR0ROX05PUk1BTDoKKyAgICAgICAgdGhpcy0+cFBpZGxNZ3ItPmxwdnRibC0+Zm5HZXRQaWRsUGF0aCh0aGlzLT5wUGlkbE1nciwgcGlkbCwgc3pUZXh0LCBNQVhfUEFUSCk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBTSEdETl9JTkZPTERFUjoKKyAgICAgICAgcGlkbFRlbXAgPSB0aGlzLT5wUGlkbE1nci0+bHB2dGJsLT5mbkdldExhc3RJdGVtKHRoaXMtPnBQaWRsTWdyLHBpZGwpOworICAJCQlpZiAocGlkbFRlbXApCisgICAgICAgIHsgdGhpcy0+cFBpZGxNZ3ItPmxwdnRibC0+Zm5HZXRJdGVtVGV4dCh0aGlzLT5wUGlkbE1nciwgcGlkbFRlbXAsIHN6VGV4dCwgTUFYX1BBVEgpOworICAJCQl9CisgICAJCQlicmVhazsJCQkJCisgICAJCWNhc2UJU0hHRE5fRk9SUEFSU0lORzoKKwkJCSAgaWYgKGJTaW1wbGVQaWRsKQorCQkJCXsgLyogaWYgdGhlIElTaGVsbEZvbGRlciBoYXMgcGFyZW50cywgZ2V0IHRoZSBwYXRoIGZyb20gdGhlCisJCQkJICBwYXJlbnQgYW5kIGFkZCB0aGUgSXRlbU5hbWUqLworICAgICAgICAgIHN6VGV4dFswXT0weDAwOworCQkJCSAgaWYgKHRoaXMtPm1scHN6Rm9sZGVyICYmIHN0cmxlbiAodGhpcy0+bWxwc3pGb2xkZXIpKQorICAgICAgICAgIHsgaWYgKHN0cmNtcCh0aGlzLT5tbHBzekZvbGRlciwiTXkgQ29tcHV0ZXIiKSkKKyAgCQkJICB7IHN0cmNweSAoc3pUZXh0LHRoaXMtPm1scHN6Rm9sZGVyKTsKKyAgCQkJICAgIFBhdGhBZGRCYWNrc2xhc2ggKHN6VGV4dCk7CisgIAkJCSAgfQorICAJCSAgCX0KKyAgICAgICAgICBwaWRsVGVtcCA9IHRoaXMtPnBQaWRsTWdyLT5scHZ0YmwtPmZuR2V0TGFzdEl0ZW0odGhpcy0+cFBpZGxNZ3IscGlkbCk7CisgICAgICAgIAlpZiAocGlkbFRlbXApCisgICAgICAgICAgeyB0aGlzLT5wUGlkbE1nci0+bHB2dGJsLT5mbkdldEl0ZW1UZXh0KHRoaXMtPnBQaWRsTWdyLCBwaWRsVGVtcCwgc3pUZW1wLCBNQVhfUEFUSCApOworICAgICAgICAJfSAKKwkJCQkJc3RyY2F0KHN6VGV4dCxzelRlbXApOworCQkJCX0KKwkJCQllbHNlCQkJCQkKKwkJCQl7IC8qIGlmIHRoZSBwaWRsIGlzIGFic29sdXRlLCBnZXQgZXZlcnl0aGluZyBmcm9tIHRoZSBwaWRsKi8KKwkJCQkgIHRoaXMtPnBQaWRsTWdyLT5scHZ0YmwtPmZuR2V0UGlkbFBhdGgodGhpcy0+cFBpZGxNZ3IsIHBpZGwsIHN6VGV4dCwgTUFYX1BBVEgpOworCQkJCX0KKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OiAgICByZXR1cm4gRV9JTlZBTElEQVJHOworICAgIH0KKwkJaWYgKChzelRleHRbMF09PTB4MDAgJiYgc3pEcml2ZVswXSE9MHgwMCl8fCAoYlNpbXBsZVBpZGwgJiYgc3pEcml2ZVswXSE9MHgwMCkpCisJCXsgc3RyY3B5KHN6VGV4dCxzekRyaXZlKTsKKwkJfQorCQlpZiAoc3pUZXh0WzBdPT0weDAwICYmIHN6U3BlY2lhbFswXSE9MHgwMCkKKwkJeyBzdHJjcHkoc3pUZXh0LHN6U3BlY2lhbCk7CisJCX0KKyAgfQorICAKKyAgVFJBQ0Uoc2hlbGwsIi0tICglcCktPiglcywlcywlcylcbiIsdGhpcyxzelNwZWNpYWwsc3pEcml2ZSxzelRleHQpOworCisgIGlmKCEobHBOYW1lKSkKKyAgeyAgcmV0dXJuIEVfT1VUT0ZNRU1PUlk7CisgIH0KKyAgbHBOYW1lLT51VHlwZSA9IFNUUlJFVF9DU1RSOwkKKyAgc3RyY3B5KGxwTmFtZS0+dS5jU3RyLHN6VGV4dCk7CisgIHJldHVybiBTX09LOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogIElTaGVsbEZvbGRlcl9TZXROYW1lT2YKKyogIENoYW5nZXMgdGhlIG5hbWUgb2YgYSBmaWxlIG9iamVjdCBvciBzdWJmb2xkZXIsIHBvc3NpYmx5IGNoYW5naW5nIGl0cyBpdGVtCisqICBpZGVudGlmaWVyIGluIHRoZSBwcm9jZXNzLgorKgorKiBQQVJBTUVURVJTCisqICBIV05EICAgICAgICAgIGh3bmRPd25lciwgIC8vW2luIF0gT3duZXIgd2luZG93IGZvciBvdXRwdXQKKyogIExQQ0lURU1JRExJU1QgcGlkbCwgICAgICAgLy9baW4gXSBzaW1wbGUgcGlkbCBvZiBpdGVtIHRvIGNoYW5nZQorKiAgTFBDT0xFU1RSICAgICBscHN6TmFtZSwgICAvL1tpbiBdIHRoZSBpdGVtcyBuZXcgZGlzcGxheSBuYW1lCisqICBEV09SRCAgICAgICAgIGR3RmxhZ3MsICAgIC8vW2luIF0gU0hHTk8gZm9ybWF0dGluZyBmbGFncworKiAgTFBJVEVNSURMSVNUKiBwcGlkbE91dCkgICAvL1tvdXRdIHNpbXBsZSBwaWRsIHJldHVybmVkCisqLworc3RhdGljIEhSRVNVTFQgV0lOQVBJIElTaGVsbEZvbGRlcl9TZXROYW1lT2YoCisgIAlMUFNIRUxMRk9MREVSIHRoaXMsCisJCUhXTkQzMiBod25kT3duZXIsIAorICAgIExQQ0lURU1JRExJU1QgcGlkbCwgLypzaW1wbGUgcGlkbCovCisgICAgTFBDT0xFU1RSMzIgbHBOYW1lLCAKKyAgICBEV09SRCBkdywgCisgICAgTFBJVEVNSURMSVNUICpwUGlkbE91dCkKK3sgIEZJWE1FKHNoZWxsLCIoJXApLT4oJXUscGlkbD0lcCwlcywlbHUsJXApLHN0dWIhXG4iLAorCSAgdGhpcyxod25kT3duZXIscGlkbCxkZWJ1Z3N0cl93KGxwTmFtZSksZHcscFBpZGxPdXQpOworCSByZXR1cm4gRV9OT1RJTVBMOworfQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqICBJU2hlbGxGb2xkZXJfR2V0Rm9sZGVyUGF0aAorKiAgRklYTUU6IGRyaXZlIG5vdCBpbmNsdWRlZAorKi8KK3N0YXRpYyBCT09MMzIgV0lOQVBJIElTaGVsbEZvbGRlcl9HZXRGb2xkZXJQYXRoKExQU0hFTExGT0xERVIgdGhpcywgTFBTVFIgbHBzek91dCwgRFdPUkQgZHdPdXRTaXplKQorewlDSEFSIHN6VGVtcFtNQVhfUEFUSF07CisJRFdPUkQgZHdTaXplOworICAgIAorICAgIFRSQUNFKHNoZWxsLCIoJXApLT4oJXAgJWx1KVxuIix0aGlzLCBscHN6T3V0LCBkd091dFNpemUpOworICAgIGlmICghbHBzek91dCkKKyAgICB7IHJldHVybiBGQUxTRTsKKyAgICB9CisgICAgCisgICAgKmxwc3pPdXQ9MDsKKyAgICAKKyAgICBkd1NpemUgPSBzdHJsZW4gKHRoaXMtPm1scHN6Rm9sZGVyKSArMTsKKyAgICBpZiAoIGR3U2l6ZSA+IGR3T3V0U2l6ZSkKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICBzdHJjcHkobHBzek91dCwgdGhpcy0+bWxwc3pGb2xkZXIpOworCisgICAgVFJBQ0Uoc2hlbGwsIi0tICglcCktPihyZXR1cm49JXMpXG4iLHRoaXMsIGxwc3pPdXQpOworICAgIHJldHVybiBUUlVFOworfQpkaWZmIC0tZ2l0IGEvZGxscy9zaGVsbDMyL3NobHZpZXcuYyBiL2RsbHMvc2hlbGwzMi9zaGx2aWV3LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTA3OTZkYgotLS0gL2Rldi9udWxsCisrKyBiL2RsbHMvc2hlbGwzMi9zaGx2aWV3LmMKQEAgLTAsMCArMSwxMTg1IEBACisvKgorICoJU2hlbGxWaWV3CisgKgorICoJQ29weXJpZ2h0IDE5OTgJSnVlcmdlbiBTY2htaWVkCisgKgorICogICEhISBjdXJyZW50bHkgd29yayBpbiBwcm9ncmVzcyBvbiBhbGwgY2xhc3NlcyA5ODA4MDEgISEhCisgKiAgPGNvbnRhY3QganVlcmdlbi5zY2htaWVkQG1ldHJvbmV0LmRlPgorICovCisKKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgIm9sZS5oIgorI2luY2x1ZGUgIm9sZTIuaCIKKyNpbmNsdWRlICJkZWJ1Zy5oIgorI2luY2x1ZGUgImNvbXBvYmouaCIKKyNpbmNsdWRlICJpbnRlcmZhY2VzLmgiCisjaW5jbHVkZSAic2hsb2JqLmgiCisjaW5jbHVkZSAic2hlbGwuaCIKKyNpbmNsdWRlICJ3aW5lcnJvci5oIgorI2luY2x1ZGUgIndpbm5scy5oIgorI2luY2x1ZGUgIndpbnByb2MuaCIKKyNpbmNsdWRlICJjb21tY3RybC5oIgorCisjaW5jbHVkZSAic2hlbGwzMl9tYWluLmgiCisjaW5jbHVkZSAicGlkbC5oIgorI2luY2x1ZGUgInNocmVzZGVmLmgiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiAgIElTaGVsbFZpZXcgaW1wbGVtZW50YXRpb24KKyovCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkgSVNoZWxsVmlld19RdWVyeUludGVyZmFjZShMUFNIRUxMVklFVyxSRUZJSUQsIExQVk9JRCAqKTsKK3N0YXRpYyBVTE9ORyBXSU5BUEkgSVNoZWxsVmlld19BZGRSZWYoTFBTSEVMTFZJRVcpIDsKK3N0YXRpYyBVTE9ORyBXSU5BUEkgSVNoZWxsVmlld19SZWxlYXNlKExQU0hFTExWSUVXKTsKKyAgICAvKiBJT2xlV2luZG93IG1ldGhvZHMgKi8KK3N0YXRpYyBIUkVTVUxUIFdJTkFQSSBJU2hlbGxWaWV3X0dldFdpbmRvdyhMUFNIRUxMVklFVyxIV05EMzIgKiBscGh3bmQpOworc3RhdGljIEhSRVNVTFQgV0lOQVBJIElTaGVsbFZpZXdfQ29udGV4dFNlbnNpdGl2ZUhlbHAoTFBTSEVMTFZJRVcsQk9PTDMyIGZFbnRlck1vZGUpOworICAgIC8qIElTaGVsbFZpZXcgbWV0aG9kcyAqLworc3RhdGljIEhSRVNVTFQgV0lOQVBJIElTaGVsbFZpZXdfVHJhbnNsYXRlQWNjZWxlcmF0b3IoTFBTSEVMTFZJRVcsTFBNU0czMiBscG1zZyk7CitzdGF0aWMgSFJFU1VMVCBXSU5BUEkgSVNoZWxsVmlld19FbmFibGVNb2RlbGVzcyhMUFNIRUxMVklFVyxCT09MMzIgZkVuYWJsZSk7CitzdGF0aWMgSFJFU1VMVCBXSU5BUEkgSVNoZWxsVmlld19VSUFjdGl2YXRlKExQU0hFTExWSUVXLFVJTlQzMiB1U3RhdGUpOworc3RhdGljIEhSRVNVTFQgV0lOQVBJIElTaGVsbFZpZXdfUmVmcmVzaChMUFNIRUxMVklFVyk7CitzdGF0aWMgSFJFU1VMVCBXSU5BUEkgSVNoZWxsVmlld19DcmVhdGVWaWV3V2luZG93KExQU0hFTExWSUVXLCBJU2hlbGxWaWV3ICpscFByZXZWaWV3LExQQ0ZPTERFUlNFVFRJTkdTIGxwZnMsIElTaGVsbEJyb3dzZXIgKiBwc2IsUkVDVDMyICogcHJjVmlldywgSFdORDMyICAqcGhXbmQpOworc3RhdGljIEhSRVNVTFQgV0lOQVBJIElTaGVsbFZpZXdfRGVzdHJveVZpZXdXaW5kb3coTFBTSEVMTFZJRVcpOworc3RhdGljIEhSRVNVTFQgV0lOQVBJIElTaGVsbFZpZXdfR2V0Q3VycmVudEluZm8oTFBTSEVMTFZJRVcsIExQRk9MREVSU0VUVElOR1MgbHBmcyk7CitzdGF0aWMgSFJFU1VMVCBXSU5BUEkgSVNoZWxsVmlld19BZGRQcm9wZXJ0eVNoZWV0UGFnZXMoTFBTSEVMTFZJRVcsIERXT1JEIGR3UmVzZXJ2ZWQsTFBGTkFERFBST1BTSEVFVFBBR0UgbHBmbiwgTFBBUkFNIGxwYXJhbSk7CitzdGF0aWMgSFJFU1VMVCBXSU5BUEkgSVNoZWxsVmlld19TYXZlVmlld1N0YXRlKExQU0hFTExWSUVXKTsKK3N0YXRpYyBIUkVTVUxUIFdJTkFQSSBJU2hlbGxWaWV3X1NlbGVjdEl0ZW0oTFBTSEVMTFZJRVcsIExQQ0lURU1JRExJU1QgcGlkbEl0ZW0sIFVJTlQzMiB1RmxhZ3MpOworc3RhdGljIEhSRVNVTFQgV0lOQVBJIElTaGVsbFZpZXdfR2V0SXRlbU9iamVjdChMUFNIRUxMVklFVywgVUlOVDMyIHVJdGVtLCBSRUZJSUQgcmlpZCxMUFZPSUQgKnBwdik7CisKK3N0YXRpYyBzdHJ1Y3QgSVNoZWxsVmlld19WVGFibGUgc3Z2dCA9IAoreyBJU2hlbGxWaWV3X1F1ZXJ5SW50ZXJmYWNlLAorICBJU2hlbGxWaWV3X0FkZFJlZiwKKyAgSVNoZWxsVmlld19SZWxlYXNlLAorICBJU2hlbGxWaWV3X0dldFdpbmRvdywKKyAgSVNoZWxsVmlld19Db250ZXh0U2Vuc2l0aXZlSGVscCwKKyAgSVNoZWxsVmlld19UcmFuc2xhdGVBY2NlbGVyYXRvciwKKyAgSVNoZWxsVmlld19FbmFibGVNb2RlbGVzcywKKyAgSVNoZWxsVmlld19VSUFjdGl2YXRlLAorICBJU2hlbGxWaWV3X1JlZnJlc2gsCisgIElTaGVsbFZpZXdfQ3JlYXRlVmlld1dpbmRvdywKKyAgSVNoZWxsVmlld19EZXN0cm95Vmlld1dpbmRvdywKKyAgSVNoZWxsVmlld19HZXRDdXJyZW50SW5mbywKKyAgSVNoZWxsVmlld19BZGRQcm9wZXJ0eVNoZWV0UGFnZXMsCisgIElTaGVsbFZpZXdfU2F2ZVZpZXdTdGF0ZSwKKyAgSVNoZWxsVmlld19TZWxlY3RJdGVtLAorICBJU2hlbGxWaWV3X0dldEl0ZW1PYmplY3QKK307CisKKy8vbWVudSBpdGVtcworI2RlZmluZSBJRE1fVklFV19GSUxFUyAgKEZDSURNX1NIVklFV0ZJUlNUICsgMHg1MDApCisjZGVmaW5lIElETV9WSUVXX0lEVyAgICAoRkNJRE1fU0hWSUVXRklSU1QgKyAweDUwMSkKKyNkZWZpbmUgSURNX01ZRklMRUlURU0gIChGQ0lETV9TSFZJRVdGSVJTVCArIDB4NTAyKQorCisjZGVmaW5lIFRPT0xCQVJfSUQgICAoTCJTaGVsbFZpZXciKQordHlwZWRlZiBzdHJ1Y3QKK3sgIGludCAgIGlkQ29tbWFuZDsKKyAgIGludCAgIGlJbWFnZTsKKyAgIGludCAgIGlkQnV0dG9uU3RyaW5nOworICAgaW50ICAgaWRNZW51U3RyaW5nOworICAgaW50ICAgblN0cmluZ09mZnNldDsKKyAgIEJZVEUgIGJTdGF0ZTsKKyAgIEJZVEUgIGJTdHlsZTsKK30gTVlUT09MSU5GTywgKkxQTVlUT09MSU5GTzsKKworTVlUT09MSU5GTyBnX1Rvb2xzW10gPSAKK3sge0lETV9WSUVXX0ZJTEVTLCAwLCBJRFNfVEJfVklFV19GSUxFUywgSURTX01JX1ZJRVdfRklMRVMsIDAsIFRCU1RBVEVfRU5BQkxFRCwgVEJTVFlMRV9CVVRUT059LAorICB7LTEsIDAsIDAsIDAsIDAsIDAsIDB9ICAgCit9OworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqICBJU2hlbGxWaWV3X0NvbnN0cnVjdG9yCisqLworTFBTSEVMTFZJRVcgSVNoZWxsVmlld19Db25zdHJ1Y3RvcihMUFNIRUxMRk9MREVSIHBGb2xkZXIsIExQQ0lURU1JRExJU1QgcGlkbCkKK3sgTFBTSEVMTFZJRVcgc3Y7CisgIHN2PShMUFNIRUxMVklFVylIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwwLHNpemVvZihJU2hlbGxWaWV3KSk7CisgIHN2LT5yZWY9MTsKKyAgc3YtPmxwdnRibD0mc3Z2dDsKKyAgCisgIHN2LT5tcGlkbCA9IElMQ2xvbmUocGlkbCk7CisKKyAgc3YtPnBTRlBhcmVudCA9IHBGb2xkZXI7CisgIGlmKHN2LT5wU0ZQYXJlbnQpCisgICAgc3YtPnBTRlBhcmVudC0+bHB2dGJsLT5mbkFkZFJlZihzdi0+cFNGUGFyZW50KTsKKworICBUUkFDRShzaGVsbCwiKCVwKS0+KCVwIHBpZGw9JXApXG4iLHN2LCBwRm9sZGVyLCBwaWRsKTsKKyAgcmV0dXJuIHN2OworfQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIFNoZWxsVmlld19DcmVhdGVMaXN0KCkKKyoKKyogTk9URVMKKyogIGludGVybmFsCisqLworI2RlZmluZSBJRF9MSVNUVklFVyAgICAgMjAwMAorCitCT09MMzIgU2hlbGxWaWV3X0NyZWF0ZUxpc3QgKExQU0hFTExWSUVXIHRoaXMpCit7IERXT1JEIGR3U3R5bGU7CisKKyAgVFJBQ0Uoc2hlbGwsIiVwXG4iLHRoaXMpOworCisgIGR3U3R5bGUgPSBXU19UQUJTVE9QIHwgV1NfVklTSUJMRSB8V1NfQ0hJTEQgfCBXU19CT1JERVIgfCBMVlNfUkVQT1JUIHwKKyAgICAgICAgICAgIExWU19TSEFSRUlNQUdFTElTVFMgfCBMVlNfRURJVExBQkVMUyA7CisKKyAgdGhpcy0+aFduZExpc3Q9Q3JlYXRlV2luZG93RXgzMkEoIFdTX0VYX0NMSUVOVEVER0UsV0NfTElTVFZJRVczMkEsTlVMTCxkd1N0eWxlLAorICAJCQkJCQkJCTAsMCwwLDAsCisgIAkJCQkJCQkJdGhpcy0+aFduZCwoSE1FTlUzMilJRF9MSVNUVklFVyxzaGVsbDMyX2hJbnN0YW5jZSxOVUxMKTsKKworICBpZighdGhpcy0+aFduZExpc3QpCisgICAgIHJldHVybiBGQUxTRTsKKworLy8gIFVwZGF0ZVNoZWxsU2V0dGluZ3MoKTsKKyAgcmV0dXJuIFRSVUU7Cit9CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogU2hlbGxWaWV3X0luaXRMaXN0KCkKKyoKKyogTk9URVMKKyogIGludGVybmFsCisqLworaW50ICBuQ29sdW1uMT0xMDA7IC8qIHdpZHRoIG9mIGNvbHVtbiAqLworaW50ICBuQ29sdW1uMj0xMDA7CitpbnQgIG5Db2x1bW4zPTEwMDsKK2ludCAgbkNvbHVtbjQ9MTAwOworCitCT09MMzIgU2hlbGxWaWV3X0luaXRMaXN0KExQU0hFTExWSUVXIHRoaXMpCit7IExWX0NPTFVNTiAgIGx2Q29sdW1uOworICBDSEFSICAgICAgICBzelN0cmluZ1s1MF07CisKKyAgVFJBQ0Uoc2hlbGwsIiVwXG4iLHRoaXMpOworCisKKyAgTGlzdFZpZXdfRGVsZXRlQWxsSXRlbXModGhpcy0+aFduZExpc3QpOwkJLyplbXB0eSB0aGUgbGlzdCovCisKKyAgLy9pbml0aWFsaXplIHRoZSBjb2x1bW5zCisgIGx2Q29sdW1uLm1hc2sgPSBMVkNGX0ZNVCB8IExWQ0ZfV0lEVEggfCBMVkNGX1RFWFQgfCAgTFZDRl9TVUJJVEVNOworICBsdkNvbHVtbi5mbXQgPSBMVkNGTVRfTEVGVDsKKyAgbHZDb2x1bW4ucHN6VGV4dCA9IHN6U3RyaW5nOworCisgIGx2Q29sdW1uLmN4ID0gbkNvbHVtbjE7CisgIHN0cmNweShzelN0cmluZywiRmlsZSIpOworICAvKkxvYWRTdHJpbmczMkEoc2hlbGwzMl9oSW5zdGFuY2UsIElEU19DT0xVTU4xLCBzelN0cmluZywgc2l6ZW9mKHN6U3RyaW5nKSk7Ki8KKyAgTGlzdFZpZXdfSW5zZXJ0Q29sdW1uKHRoaXMtPmhXbmRMaXN0LCAwLCAmbHZDb2x1bW4pOworCisgIGx2Q29sdW1uLmN4ID0gbkNvbHVtbjI7CisgIHN0cmNweShzelN0cmluZywiSURTX0NPTFVNTjIiKTsKKyAgTGlzdFZpZXdfSW5zZXJ0Q29sdW1uKHRoaXMtPmhXbmRMaXN0LCAxLCAmbHZDb2x1bW4pOworCisgIGx2Q29sdW1uLmN4ID0gbkNvbHVtbjM7CisgIHN0cmNweShzelN0cmluZywiSURTX0NPTFVNTjMiKTsKKyAgTGlzdFZpZXdfSW5zZXJ0Q29sdW1uKHRoaXMtPmhXbmRMaXN0LCAyLCAmbHZDb2x1bW4pOworCisgIGx2Q29sdW1uLmN4ID0gbkNvbHVtbjQ7CisgIHN0cmNweShzelN0cmluZywiSURTX0NPTFVNTjQiKTsKKyAgTGlzdFZpZXdfSW5zZXJ0Q29sdW1uKHRoaXMtPmhXbmRMaXN0LCAzLCAmbHZDb2x1bW4pOworCisgIExpc3RWaWV3X1NldEltYWdlTGlzdCh0aGlzLT5oV25kTGlzdCwgU2hlbGxCaWdJY29uTGlzdCwgTFZTSUxfU01BTEwpOworCisgIHJldHVybiBUUlVFOworfQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIFNoZWxsVmlld19Db21wYXJlSXRlbXMoKQorKgorKiBOT1RFUworKiAgaW50ZXJuYWwKKyovICAgCitpbnQgQ0FMTEJBQ0sgU2hlbGxWaWV3X0NvbXBhcmVJdGVtcyhMUEFSQU0gbFBhcmFtMSwgTFBBUkFNIGxQYXJhbTIsIExQQVJBTSBscERhdGEpCit7IExQU0hFTExGT0xERVIgIHBGb2xkZXIgPSAoTFBTSEVMTEZPTERFUilscERhdGE7CisKKyAgVFJBQ0Uoc2hlbGwsIlxuIik7CisgIGlmKCFwRm9sZGVyKQorICAgIHJldHVybiAwOworCisgcmV0dXJuIChpbnQpcEZvbGRlci0+bHB2dGJsLT5mbkNvbXBhcmVJRHMocEZvbGRlciwgMCwgKExQSVRFTUlETElTVClsUGFyYW0xLCAoTFBJVEVNSURMSVNUKWxQYXJhbTIpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogU2hlbGxWaWV3X0ZpbGxMaXN0KCkKKyoKKyogTk9URVMKKyogIGludGVybmFsCisqLyAgIAorCit2b2lkIFNoZWxsVmlld19GaWxsTGlzdChMUFNIRUxMVklFVyB0aGlzKQoreyBMUEVOVU1JRExJU1QgICBwRW51bUlETGlzdDsKKyAgTFBJVEVNSURMSVNUICAgcGlkbDsKKyAgRFdPUkQgICAgICAgICAgZHdGZXRjaGVkOworICBMVl9JVEVNICBsdkl0ZW07CisgIAorICBUUkFDRShzaGVsbCwiJXBcbiIsdGhpcyk7CisgIAorICBpZihTX09LID09IHRoaXMtPnBTRlBhcmVudC0+bHB2dGJsLT5mbkVudW1PYmplY3RzKHRoaXMtPnBTRlBhcmVudCx0aGlzLT5oV25kLCBTSENPTlRGX05PTkZPTERFUlMgfCBTSENPTlRGX0ZPTERFUlMsICZwRW51bUlETGlzdCkpCisgIHsgU2VuZE1lc3NhZ2UzMkEodGhpcy0+aFduZExpc3QsIFdNX1NFVFJFRFJBVywgRkFMU0UsIDApOyAvKnR1cm4gdGhlIGxpc3R2aWV3J3MgcmVkcmF3aW5nIG9mZiovCisKKyAgICB3aGlsZSgoU19PSyA9PSBwRW51bUlETGlzdC0+bHB2dGJsLT5mbk5leHQocEVudW1JRExpc3QsMSwgJnBpZGwsICZkd0ZldGNoZWQpKSAmJiBkd0ZldGNoZWQpCisgICAgeyBaZXJvTWVtb3J5KCZsdkl0ZW0sIHNpemVvZihsdkl0ZW0pKTsKKworICAgICAgbHZJdGVtLm1hc2sgPSBMVklGX1RFWFQgfCBMVklGX0lNQUdFIHwgTFZJRl9QQVJBTTsgICAgICAgLypzZXQgdGhlIG1hc2sqLworICAgICAgbHZJdGVtLmlJdGVtID0gTGlzdFZpZXdfR2V0SXRlbUNvdW50KHRoaXMtPmhXbmRMaXN0KTsgLyphZGQgdGhlIGl0ZW0gdG8gdGhlIGVuZCBvZiB0aGUgbGlzdCovCisgICAgICBsdkl0ZW0ubFBhcmFtID0gKExQQVJBTSlJTENsb25lKHBpZGwpOwkJLypzZXQgdGhlIGl0ZW0ncyBkYXRhKi8KKyAgICAgIGx2SXRlbS5wc3pUZXh0ID0gTFBTVFJfVEVYVENBTExCQUNLMzJBOwkJLypnZXQgdGV4dCBvbiBhIGNhbGxiYWNrIGJhc2lzKi8KKyAgICAgIGx2SXRlbS5pSW1hZ2UgPSBJX0lNQUdFQ0FMTEJBQ0s7CQkJCS8qZ2V0IHRoZSBpbWFnZSBvbiBhIGNhbGxiYWNrIGJhc2lzKi8KKyAgICAgIExpc3RWaWV3X0luc2VydEl0ZW0odGhpcy0+aFduZExpc3QsICZsdkl0ZW0pOwkvKmFkZCB0aGUgaXRlbSovICAgIAorICAgfQorCisgICAvKnNvcnQgdGhlIGl0ZW1zKi8KKyAgIExpc3RWaWV3X1NvcnRJdGVtcyh0aGlzLT5oV25kTGlzdCwgU2hlbGxWaWV3X0NvbXBhcmVJdGVtcywgKExQQVJBTSl0aGlzLT5wU0ZQYXJlbnQpOworICAgICAKKyAgIC8qdHVybiB0aGUgbGlzdHZpZXcncyByZWRyYXdpbmcgYmFjayBvbiBhbmQgZm9yY2UgaXQgdG8gZHJhdyovCisgICBTZW5kTWVzc2FnZTMyQSh0aGlzLT5oV25kTGlzdCwgV01fU0VUUkVEUkFXLCBUUlVFLCAwKTsKKyAgIEludmFsaWRhdGVSZWN0MzIodGhpcy0+aFduZExpc3QsIE5VTEwsIFRSVUUpOworICAgVXBkYXRlV2luZG93MzIodGhpcy0+aFduZExpc3QpOworCisgICBwRW51bUlETGlzdC0+bHB2dGJsLT5mblJlbGVhc2UocEVudW1JRExpc3QpOworIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqICBTaGVsbFZpZXdfT25DcmVhdGUoKQorKgorKiBOT1RFUworKiAgaW50ZXJuYWwKKyovICAgCitMUkVTVUxUIFNoZWxsVmlld19PbkNyZWF0ZShMUFNIRUxMVklFVyB0aGlzKQoreyBUUkFDRShzaGVsbCwiJXBcbiIsdGhpcyk7CisgIGlmKFNoZWxsVmlld19DcmVhdGVMaXN0KHRoaXMpKQorICB7ICBpZihTaGVsbFZpZXdfSW5pdExpc3QodGhpcykpCisgICAgIHsgU2hlbGxWaWV3X0ZpbGxMaXN0KHRoaXMpOworICAgICB9CisgIH0KKyAgcmV0dXJuIFNfT0s7Cit9CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogIFNoZWxsVmlld19PblNpemUoKQorKi8gICAKK0xSRVNVTFQgU2hlbGxWaWV3X09uU2l6ZShMUFNIRUxMVklFVyB0aGlzLCBXT1JEIHdXaWR0aCwgV09SRCB3SGVpZ2h0KQoreyBUUkFDRShzaGVsbCwiJXAgd2lkdGg9JXUgaGVpZ2h0PSV1XG4iLHRoaXMsIHdXaWR0aCx3SGVpZ2h0KTsKKyAgLy9yZXNpemUgdGhlIExpc3RWaWV3IHRvIGZpdCBvdXIgd2luZG93CisgIGlmKHRoaXMtPmhXbmRMaXN0KQorICB7IE1vdmVXaW5kb3czMih0aGlzLT5oV25kTGlzdCwgMCwgMCwgd1dpZHRoLCB3SGVpZ2h0LCBUUlVFKTsKKyAgfQorICByZXR1cm4gU19PSzsKK30KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBTaGVsbFZpZXdfQnVpbGRGaWxlTWVudSgpCisqLyAgIAorSE1FTlUzMiBTaGVsbFZpZXdfQnVpbGRGaWxlTWVudShMUFNIRUxMVklFVyB0aGlzKQoreyAgIENIQVIJCQlzelRleHRbTUFYX1BBVEhdOworCU1FTlVJVEVNSU5GTzMyQQltaWk7CisJaW50CQkJCW5Ub29scyxpOworCUhNRU5VMzIgCQloU3ViTWVudSA9IENyZWF0ZVBvcHVwTWVudTMyKCk7CisKKwlUUkFDRShzaGVsbCwiKCVwKSBzdHViXG4iLHRoaXMpOworCWlmKGhTdWJNZW51KQorCXsgLypnZXQgdGhlIG51bWJlciBvZiBpdGVtcyBpbiBvdXIgZ2xvYmFsIGFycmF5Ki8KKwkgIGZvcihuVG9vbHMgPSAwOyBnX1Rvb2xzW25Ub29sc10uaWRDb21tYW5kICE9IC0xOyBuVG9vbHMrKyl7fQorCisJICAvL2FkZCB0aGUgbWVudSBpdGVtcworCSAgZm9yKGkgPSAwOyBpIDwgblRvb2xzOyBpKyspCisgICAgICB7IHN0cmNweShzelRleHQsICJkdW1teSA0NCIpOworICAgICAgCisJICAgIFplcm9NZW1vcnkoJm1paSwgc2l6ZW9mKG1paSkpOworCSAgICBtaWkuY2JTaXplID0gc2l6ZW9mKG1paSk7CisJICAgIG1paS5mTWFzayA9IE1JSU1fVFlQRSB8IE1JSU1fSUQgfCBNSUlNX1NUQVRFOworCisJICAgIGlmKFRCU1RZTEVfU0VQICE9IGdfVG9vbHNbaV0uYlN0eWxlKQorCSAgICB7IG1paS5mVHlwZSA9IE1GVF9TVFJJTkc7CisgICAgICAgICAgbWlpLmZTdGF0ZSA9IE1GU19FTkFCTEVEOworICAgICAgICAgIG1paS5kd1R5cGVEYXRhID0gc3pUZXh0OworICAgICAgICAgIG1paS53SUQgPSBnX1Rvb2xzW2ldLmlkQ29tbWFuZDsKKyAgICAgICAgfQorCSAgICBlbHNlCisgICAgICAgIHsgbWlpLmZUeXBlID0gTUZUX1NFUEFSQVRPUjsKKyAgICAgICAgfQorICAgICAgICAvKiB0YWNrIHRoaXMgaXRlbSBvbnRvIHRoZSBlbmQgb2YgdGhlIG1lbnUgKi8KKyAgICAgICAgSW5zZXJ0TWVudUl0ZW0zMkEoaFN1Yk1lbnUsIChVSU5UMzIpLTEsIFRSVUUsICZtaWkpOworICAgICAgfQorCX0KKwlyZXR1cm4gaFN1Yk1lbnU7Cit9CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogU2hlbGxWaWV3X01lcmdlRmlsZU1lbnUoKQorKi8gICAKK3ZvaWQgU2hlbGxWaWV3X01lcmdlRmlsZU1lbnUoTFBTSEVMTFZJRVcgdGhpcywgSE1FTlUzMiBoU3ViTWVudSkKK3sgICBNRU5VSVRFTUlORk8zMkEgICBtaWk7CisJQ0hBUiAgICAgICAgICBzelRleHRbTUFYX1BBVEhdOworCisJVFJBQ0Uoc2hlbGwsIiglcCktPihzdWJtZW51PTB4JTA4eCkgc3R1YlxuIix0aGlzLGhTdWJNZW51KTsKKwlpZihoU3ViTWVudSkKKwl7IFplcm9NZW1vcnkoJm1paSwgc2l6ZW9mKG1paSkpOworCisJICAvKiBhZGQgYSBzZXBhcmF0b3IgKi8KKwkgIG1paS5mTWFzayA9IE1JSU1fVFlQRSB8IE1JSU1fSUQgfCBNSUlNX1NUQVRFOworCSAgbWlpLmZUeXBlID0gTUZUX1NFUEFSQVRPUjsKKwkgIG1paS5mU3RhdGUgPSBNRlNfRU5BQkxFRDsKKworCSAgLyppbnNlcnQgdGhpcyBpdGVtIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIG1lbnUgKi8KKwkgIEluc2VydE1lbnVJdGVtMzJBKGhTdWJNZW51LCAwLCBUUlVFLCAmbWlpKTsKKworCSAgLyphZGQgdGhlIGZpbGUgbWVudSBpdGVtcyAqLworICAgICAgc3RyY3B5KHN6VGV4dCwiZHVtbXkgNDUiKTsKKyAgICAgIAorCSAgbWlpLmNiU2l6ZSA9IHNpemVvZihtaWkpOworCSAgbWlpLmZNYXNrID0gTUlJTV9UWVBFIHwgTUlJTV9JRCB8IE1JSU1fU1RBVEU7CisJICBtaWkuZlR5cGUgPSBNRlRfU1RSSU5HOworCSAgbWlpLmZTdGF0ZSA9IE1GU19FTkFCTEVEOworCSAgbWlpLmR3VHlwZURhdGEgPSBzelRleHQ7CisJICBtaWkud0lEID0gSURNX01ZRklMRUlURU07CisKKwkgIC8qaW5zZXJ0IHRoaXMgaXRlbSBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBtZW51ICovCisJICBJbnNlcnRNZW51SXRlbTMyQShoU3ViTWVudSwgMCwgVFJVRSwgJm1paSk7CisJfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogU2hlbGxWaWV3X01lcmdlVmlld01lbnUoKQorKi8gICAKK3ZvaWQgU2hlbGxWaWV3X01lcmdlVmlld01lbnUoTFBTSEVMTFZJRVcgdGhpcywgSE1FTlUzMiBoU3ViTWVudSkKK3sgICBNRU5VSVRFTUlORk8zMkEgICBtaWk7CisgICAgQ0hBUiAgICAgICAgICBzelRleHRbTUFYX1BBVEhdOworCisJVFJBQ0Uoc2hlbGwsIiglcCktPihzdWJtZW51PTB4JTA4eCkgc3R1YlxuIix0aGlzLGhTdWJNZW51KTsKKwlpZihoU3ViTWVudSkKKwl7IFplcm9NZW1vcnkoJm1paSwgc2l6ZW9mKG1paSkpOworCisJICAvKmFkZCBhIHNlcGFyYXRvciBhdCB0aGUgY29ycmVjdCBwb3NpdGlvbiBpbiB0aGUgbWVudSovCisJICBtaWkuZk1hc2sgPSBNSUlNX1RZUEUgfCBNSUlNX0lEIHwgTUlJTV9TVEFURTsKKwkgIG1paS5mVHlwZSA9IE1GVF9TRVBBUkFUT1I7CisJICBtaWkuZlN0YXRlID0gTUZTX0VOQUJMRUQ7CisJICBJbnNlcnRNZW51SXRlbTMyQShoU3ViTWVudSwgRkNJRE1fTUVOVV9WSUVXX1NFUF9PUFRJT05TLCBGQUxTRSwgJm1paSk7CisKKwkgIC8qYWRkIHRoZSB2aWV3IG1lbnUgaXRlbXMgYXQgdGhlIGNvcnJlY3QgcG9zaXRpb24gaW4gdGhlIG1lbnUqLworICAgICAgc3RyY3B5KHN6VGV4dCwiRHVtbXkgNDYiKTsKKyAgICAgIAorCSAgbWlpLmNiU2l6ZSA9IHNpemVvZihtaWkpOworCSAgbWlpLmZNYXNrID0gTUlJTV9UWVBFIHwgTUlJTV9JRCB8IE1JSU1fU1RBVEU7CisJICBtaWkuZlR5cGUgPSBNRlRfU1RSSU5HOworCSAgbWlpLmZTdGF0ZSA9IE1GU19FTkFCTEVEOworCSAgbWlpLmR3VHlwZURhdGEgPSBzelRleHQ7CisJICBtaWkud0lEID0gSURNX1ZJRVdfRklMRVM7CisJICBJbnNlcnRNZW51SXRlbTMyQShoU3ViTWVudSwgRkNJRE1fTUVOVV9WSUVXX1NFUF9PUFRJT05TLCBGQUxTRSwgJm1paSk7CisJfQorfQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIFNoZWxsVmlld19PbkRlYWN0aXZhdGUoKQorKgorKiBOT1RFUworKiAgaW50ZXJuYWwKKyovICAgCit2b2lkIFNoZWxsVmlld19PbkRlYWN0aXZhdGUoTFBTSEVMTFZJRVcgdGhpcykKK3sgVFJBQ0Uoc2hlbGwsIiVwXG4iLHRoaXMpOworICBpZih0aGlzLT51U3RhdGUgIT0gU1ZVSUFfREVBQ1RJVkFURSkKKyAgeyBpZih0aGlzLT5oTWVudSkKKyAgICB7IHRoaXMtPnBTaGVsbEJyb3dzZXItPmxwdnRibC0+Zm5TZXRNZW51U0IodGhpcy0+cFNoZWxsQnJvd3NlciwwLCAwLCAwKTsKKyAgICAgIHRoaXMtPnBTaGVsbEJyb3dzZXItPmxwdnRibC0+Zm5SZW1vdmVNZW51c1NCKHRoaXMtPnBTaGVsbEJyb3dzZXIsdGhpcy0+aE1lbnUpOworICAgICAgRGVzdHJveU1lbnUzMih0aGlzLT5oTWVudSk7CisgICAgICB0aGlzLT5oTWVudSA9IDA7CisgICAgICB9CisKKyAgIHRoaXMtPnVTdGF0ZSA9IFNWVUlBX0RFQUNUSVZBVEU7CisgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBDU2hlbGxWaWV3X09uQWN0aXZhdGUoKQorKi8gICAKK0xSRVNVTFQgU2hlbGxWaWV3X09uQWN0aXZhdGUoTFBTSEVMTFZJRVcgdGhpcywgVUlOVDMyIHVTdGF0ZSkKK3sJT0xFTUVOVUdST1VQV0lEVEhTMzIgICBvbXcgPSB7IHswLCAwLCAwLCAwLCAwLCAwfSB9OworICAgIE1FTlVJVEVNSU5GTzMyQSAgICAgICAgIG1paTsKKyAgICBDSEFSICAgICAgICAgICAgICAgIHN6VGV4dFtNQVhfUEFUSF07CisKKwlUUkFDRShzaGVsbCwiJXAgdVN0YXRlPSV4XG4iLHRoaXMsdVN0YXRlKTsgICAgCisKKwkvL2Rvbid0IGRvIGFueXRoaW5nIGlmIHRoZSBzdGF0ZSBpc24ndCByZWFsbHkgY2hhbmdpbmcKKwlpZih0aGlzLT51U3RhdGUgPT0gdVN0YXRlKQorCXsgcmV0dXJuIFNfT0s7CisgICAgfQorCisJU2hlbGxWaWV3X09uRGVhY3RpdmF0ZSh0aGlzKTsKKworCS8vb25seSBkbyB0aGlzIGlmIHdlIGFyZSBhY3RpdmUKKwlpZih1U3RhdGUgIT0gU1ZVSUFfREVBQ1RJVkFURSkKKwl7IC8vbWVyZ2UgdGhlIG1lbnVzCisgICAgICB0aGlzLT5oTWVudSA9IENyZWF0ZU1lbnUzMigpOworICAgCisJICBpZih0aGlzLT5oTWVudSkKKwkgIHsgdGhpcy0+cFNoZWxsQnJvd3Nlci0+bHB2dGJsLT5mbkluc2VydE1lbnVzU0IodGhpcy0+cFNoZWxsQnJvd3NlciwgdGhpcy0+aE1lbnUsICZvbXcpOworCisgICAgICAgIC8vYnVpbGQgdGhlIHRvcCBsZXZlbCBtZW51CisgICAgICAgIC8vZ2V0IHRoZSBtZW51IGl0ZW0ncyB0ZXh0CisgICAgICAgIHN0cmNweShzelRleHQsImR1bW15IDMxIik7CisgICAgICAKKyAgICAgICAgWmVyb01lbW9yeSgmbWlpLCBzaXplb2YobWlpKSk7CisgICAgICAgIG1paS5jYlNpemUgPSBzaXplb2YobWlpKTsKKyAgICAgICAgbWlpLmZNYXNrID0gTUlJTV9TVUJNRU5VIHwgTUlJTV9UWVBFIHwgTUlJTV9TVEFURTsKKyAgICAgICAgbWlpLmZUeXBlID0gTUZUX1NUUklORzsKKyAgICAgICAgbWlpLmZTdGF0ZSA9IE1GU19FTkFCTEVEOworICAgICAgICBtaWkuZHdUeXBlRGF0YSA9IHN6VGV4dDsKKyAgICAgICAgbWlpLmhTdWJNZW51ID0gU2hlbGxWaWV3X0J1aWxkRmlsZU1lbnUodGhpcyk7CisKKyAgICAgICAgLy9pbnNlcnQgb3VyIG1lbnUgaW50byB0aGUgbWVudSBiYXIKKyAgICAgICAgaWYobWlpLmhTdWJNZW51KQorICAgICAgICB7IEluc2VydE1lbnVJdGVtMzJBKHRoaXMtPmhNZW51LCBGQ0lETV9NRU5VX0hFTFAsIEZBTFNFLCAmbWlpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vZ2V0IHRoZSB2aWV3IG1lbnUgc28gd2UgY2FuIG1lcmdlIHdpdGggaXQKKyAgICAgICAgWmVyb01lbW9yeSgmbWlpLCBzaXplb2YobWlpKSk7CisgICAgICAgIG1paS5jYlNpemUgPSBzaXplb2YobWlpKTsKKyAgICAgICAgbWlpLmZNYXNrID0gTUlJTV9TVUJNRU5VOworICAgICAgCisJICAgIGlmKEdldE1lbnVJdGVtSW5mbzMyQSh0aGlzLT5oTWVudSwgRkNJRE1fTUVOVV9WSUVXLCBGQUxTRSwgJm1paSkpCisJICAgIHsgU2hlbGxWaWV3X01lcmdlVmlld01lbnUodGhpcywgbWlpLmhTdWJNZW51KTsKKyAgICAgICAgfQorCisgICAgICAgIC8vYWRkIHRoZSBpdGVtcyB0aGF0IHNob3VsZCBvbmx5IGJlIGFkZGVkIGlmIHdlIGhhdmUgdGhlIGZvY3VzCisgICAgICAgIGlmKFNWVUlBX0FDVElWQVRFX0ZPQ1VTID09IHVTdGF0ZSkKKwkgICAgeyAvL2dldCB0aGUgZmlsZSBtZW51IHNvIHdlIGNhbiBtZXJnZSB3aXRoIGl0CisJICAgICAgWmVyb01lbW9yeSgmbWlpLCBzaXplb2YobWlpKSk7CisgICAgICAgICAgbWlpLmNiU2l6ZSA9IHNpemVvZihtaWkpOworCSAgICAgIG1paS5mTWFzayA9IE1JSU1fU1VCTUVOVTsKKyAgICAgIAorCSAgICAgIGlmKEdldE1lbnVJdGVtSW5mbzMyQSh0aGlzLT5oTWVudSwgRkNJRE1fTUVOVV9GSUxFLCBGQUxTRSwgJm1paSkpCisJICAgICAgeyBTaGVsbFZpZXdfTWVyZ2VGaWxlTWVudSh0aGlzLCBtaWkuaFN1Yk1lbnUpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICB0aGlzLT5wU2hlbGxCcm93c2VyLT5scHZ0YmwtPmZuU2V0TWVudVNCKHRoaXMtPnBTaGVsbEJyb3dzZXIsIHRoaXMtPmhNZW51LCAwLCB0aGlzLT5oV25kKTsKKwkgIH0KKwl9CisJdGhpcy0+dVN0YXRlID0gdVN0YXRlOworCXJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogIFNoZWxsVmlld19PblNldEZvY3VzKCkKKyoKKyogTk9URVMKKyogIGludGVybmFsCisqLworTFJFU1VMVCBTaGVsbFZpZXdfT25TZXRGb2N1cyhMUFNIRUxMVklFVyB0aGlzKQoreyBUUkFDRShzaGVsbCwiJXBcbiIsdGhpcyk7CisgIC8qIFRlbGwgdGhlIGJyb3dzZXIgb25lIG9mIG91ciB3aW5kb3dzIGhhcyByZWNlaXZlZCB0aGUgZm9jdXMuIFRoaXMgc2hvdWxkIGFsd2F5cyAKKyAgYmUgZG9uZSBiZWZvcmUgbWVyZ2luZyBtZW51cyAoT25BY3RpdmF0ZSBtZXJnZXMgdGhlIG1lbnVzKSBpZiBvbmUgb2Ygb3VyIAorICB3aW5kb3dzIGhhcyB0aGUgZm9jdXMuKi8KKyAgdGhpcy0+cFNoZWxsQnJvd3Nlci0+bHB2dGJsLT5mbk9uVmlld1dpbmRvd0FjdGl2ZSh0aGlzLT5wU2hlbGxCcm93c2VyLHRoaXMpOworICBTaGVsbFZpZXdfT25BY3RpdmF0ZSh0aGlzLCBTVlVJQV9BQ1RJVkFURV9GT0NVUyk7CisKKyAgcmV0dXJuIDA7Cit9CisKK0JPT0wzMiBnX2JWaWV3S2V5czsKK0JPT0wzMiBnX2JTaG93SURXOworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIFNoZWxsVmlld19PbktpbGxGb2N1cygpCisqLyAgIAorTFJFU1VMVCBTaGVsbFZpZXdfT25LaWxsRm9jdXMoTFBTSEVMTFZJRVcgdGhpcykKK3sJVFJBQ0Uoc2hlbGwsIiglcCkgc3R1YlxuIix0aGlzKTsKKwlTaGVsbFZpZXdfT25BY3RpdmF0ZSh0aGlzLCBTVlVJQV9BQ1RJVkFURV9OT0ZPQ1VTKTsKKwlyZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIENTaGVsbFZpZXc6OkFkZFJlbW92ZURvY2tpbmdXaW5kb3coKQorKi8gICAKK0JPT0wzMiBTaGVsbFZpZXdfQWRkUmVtb3ZlRG9ja2luZ1dpbmRvdyhMUFNIRUxMVklFVyB0aGlzLCBCT09MMzIgYkFkZCkKK3sJVFJBQ0Uoc2hlbGwsIiglcCktPihiYWRkPTB4JTA4eCkgc3R1YlxuIix0aGlzLGJBZGQpOworCXJldHVybiBGQUxTRTsKKy8qCisJQk9PTDMyICAgICAgICAgICAgICBiUmV0dXJuID0gRkFMU0U7CisJSFJFU1VMVDMyICAgICAgICAgICBocjsKKwlJU2VydmljZVByb3ZpZGVyICAqcFNQOworKi8KKwkvKiBnZXQgdGhlIGJyb3dzZXIncyBJU2VydmljZVByb3ZpZGVyICovCisvKglociA9IHRoaXMtPnBTaGVsbEJyb3dzZXItPlF1ZXJ5SW50ZXJmYWNlKChSRUZJSUQpSUlEX0lTZXJ2aWNlUHJvdmlkZXIsIChMUFZPSUQqKSZwU1ApOworCWlmKFNVQ0NFRURFRChocikpCisJeworCUlEb2NraW5nV2luZG93RnJhbWUgKnBGcmFtZTsKKyovCisJLypnZXQgdGhlIElEb2NraW5nV2luZG93RnJhbWUgcG9pbnRlciovCisvKgorCWhyID0gcFNQLT5RdWVyeVNlcnZpY2UoU0lEX1NTaGVsbEJyb3dzZXIsIElJRF9JRG9ja2luZ1dpbmRvd0ZyYW1lLCAoTFBWT0lEKikmcEZyYW1lKTsKKwlpZihTVUNDRUVERUQoaHIpKQorCXsgaWYoYkFkZCkKKwkgIHsgaHIgPSBTX09LOworCQlpZighdGhpcy0+cERvY2tpbmdXaW5kb3cpCisJCXsgLy9jcmVhdGUgdGhlIHRvb2xiYXIgb2JqZWN0CisJICAgICAgdGhpcy0+cERvY2tpbmdXaW5kb3cgPSBuZXcgQ0RvY2tpbmdXaW5kb3codGhpcywgdGhpcy0+aFduZCk7CisJICAgIH0KKworCSAgICBpZih0aGlzLT5wRG9ja2luZ1dpbmRvdykKKyAgICAgICAgeyAvL2FkZCB0aGUgdG9vbGJhciBvYmplY3QKKwkgICAgICBociA9IHBGcmFtZS0+QWRkVG9vbGJhcigoSURvY2tpbmdXaW5kb3cqKXRoaXMtPnBEb2NraW5nV2luZG93LCBUT09MQkFSX0lELCAwKTsKKworCSAgICAgIGlmKFNVQ0NFRURFRChocikpCisgICAgICAgICAgeyBiUmV0dXJuID0gVFJVRTsKKwkgICAgICB9CisJICAgIH0KKwkgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsgaWYodGhpcy0+cERvY2tpbmdXaW5kb3cpCisgICAgICAgIHsgaHIgPSBwRnJhbWUtPlJlbW92ZVRvb2xiYXIoKElEb2NraW5nV2luZG93Kil0aGlzLT5wRG9ja2luZ1dpbmRvdywgRFdGUkZfTk9STUFMKTsKKworCSAgICAgIGlmKFNVQ0NFRURFRChocikpCisgICAgICAgICAgeyovCisgICAgICAgICAgICAvKiBSZW1vdmVUb29sYmFyIHNob3VsZCByZWxlYXNlIHRoZSB0b29sYmFyIG9iamVjdCB3aGljaCB3aWxsIGNhdXNlIAorICAgICAgICAgICAgaXQgdG8gZGVzdHJveSBpdHNlbGYuIE91ciB0b29sYmFyIG9iamVjdCBpcyBubyBsb25nZXIgdmFsaWQgYXQgCisgICAgICAgICAgICB0aGlzIHBvaW50LiovCisgICAgICAgICAgICAKKy8qICAgICAgICAgIHRoaXMtPnBEb2NraW5nV2luZG93ID0gTlVMTDsKKwkgICAgICAgIGJSZXR1cm4gPSBUUlVFOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisJICAgICAgfQorCSAgICB9CisJICAgIHBGcmFtZS0+UmVsZWFzZSgpOworICAgICAgfQorCSAgcFNQLT5SZWxlYXNlKCk7CisJfQorCXJldHVybiBiUmV0dXJuOyovCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBTaGVsbFZpZXdfT25Db21tYW5kKCkKKyovICAgCitMUkVTVUxUIFNoZWxsVmlld19PbkNvbW1hbmQoTFBTSEVMTFZJRVcgdGhpcyxEV09SRCBkd0NtZElELCBEV09SRCBkd0NtZCwgSFdORDMyIGh3bmRDbWQpCit7CVRSQUNFKHNoZWxsLCIoJXApLT4oMHglMDhseCAweCUwOGx4IDB4JTA4eCkgc3R1YlxuIix0aGlzLCBkd0NtZElELCBkd0NtZCwgaHduZENtZCk7CisJc3dpdGNoKGR3Q21kSUQpCisgICAgeyBjYXNlIElETV9WSUVXX0ZJTEVTOgorICAgICAgICBnX2JWaWV3S2V5cyA9ICEgZ19iVmlld0tleXM7CisgICAgICAgIElTaGVsbFZpZXdfUmVmcmVzaCh0aGlzKTsKKyAgICAgICAgYnJlYWs7CisKKwkgIGNhc2UgSURNX1ZJRVdfSURXOgorICAgICAgICBnX2JTaG93SURXID0gISBnX2JTaG93SURXOworICAgICAgICBTaGVsbFZpZXdfQWRkUmVtb3ZlRG9ja2luZ1dpbmRvdyh0aGlzLCBnX2JTaG93SURXKTsKKyAgICAgICAgYnJlYWs7CisgICAKKwkgIGNhc2UgSURNX01ZRklMRUlURU06CisgICAgICAgIE1lc3NhZ2VCZWVwMzIoTUJfT0spOworICAgICAgICBicmVhazsKKwl9CisJcmV0dXJuIDA7Cit9CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogU2hlbGxWaWV3X0NhbkRvSURvY2tpbmdXaW5kb3coKQorKi8gICAKK0JPT0wzMiBTaGVsbFZpZXdfQ2FuRG9JRG9ja2luZ1dpbmRvdyhMUFNIRUxMVklFVyB0aGlzKQorewlUUkFDRShzaGVsbCwiKCVwKSBzdHViXG4iLHRoaXMpOworCXJldHVybiBGQUxTRTsKKy8qCisJQk9PTDMyICAgICAgICAgICAgICBiUmV0dXJuID0gRkFMU0U7CisJSFJFU1VMVDMyICAgICAgICAgICBocjsKKwlJU2VydmljZVByb3ZpZGVyCSpwU1A7CisJSURvY2tpbmdXaW5kb3dGcmFtZSAqcEZyYW1lOworCisJLy9nZXQgdGhlIGJyb3dzZXIncyBJU2VydmljZVByb3ZpZGVyCisJaHIgPSB0aGlzLT5wU2hlbGxCcm93c2VyLT5scHZ0YmwtPmZuUXVlcnlJbnRlcmZhY2UodGhpcy0+cFNoZWxsQnJvd3NlciwgKFJFRklJRClJSURfSVNlcnZpY2VQcm92aWRlciwgKExQVk9JRCopJnBTUCk7CisJaWYoaHI9PVNfT0spCisJeyBociA9IHBTUC0+bHB2dGJsLT5mblF1ZXJ5U2VydmljZShwU1AsIFNJRF9TU2hlbGxCcm93c2VyLCBJSURfSURvY2tpbmdXaW5kb3dGcmFtZSwgKExQVk9JRCopJnBGcmFtZSk7CisgICAJICBpZihTVUNDRUVERUQoaHIpKQorICAgICAgeyBiUmV0dXJuID0gVFJVRTsKKyAgICAgICAgcEZyYW1lLT5scHZ0YmwtPmZuUmVsZWFzZShwRnJhbWUpOworICAgICAgfQorCXBTUC0+bHB2dGJsLT5mblJlbGVhc2UocFNQKTsKKwl9CisJcmV0dXJuIGJSZXR1cm47Ki8KK30KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBTaGVsbFZpZXdfVXBkYXRlTWVudSgpCisqLworTFJFU1VMVCBTaGVsbFZpZXdfVXBkYXRlTWVudShMUFNIRUxMVklFVyB0aGlzLCBITUVOVTMyIGhNZW51KQorewlUUkFDRShzaGVsbCwiKCVwKS0+KG1lbnU9MHglMDh4XG4iLHRoaXMsaE1lbnUpOworCUNoZWNrTWVudUl0ZW0zMihoTWVudSwgSURNX1ZJRVdfRklMRVMsIE1GX0JZQ09NTUFORCB8IChnX2JWaWV3S2V5cyA/IE1GX0NIRUNLRUQ6IE1GX1VOQ0hFQ0tFRCkpOworCisJaWYoU2hlbGxWaWV3X0NhbkRvSURvY2tpbmdXaW5kb3codGhpcykpCisgICAgeyBFbmFibGVNZW51SXRlbTMyKGhNZW51LCBJRE1fVklFV19JRFcsIE1GX0JZQ09NTUFORCB8IE1GX0VOQUJMRUQpOworICAgICAgQ2hlY2tNZW51SXRlbTMyKGhNZW51LCBJRE1fVklFV19JRFcsIE1GX0JZQ09NTUFORCB8IChnX2JTaG93SURXID8gTUZfQ0hFQ0tFRDogTUZfVU5DSEVDS0VEKSk7CisJfQorCWVsc2UKKwl7IEVuYWJsZU1lbnVJdGVtMzIoaE1lbnUsIElETV9WSUVXX0lEVywgTUZfQllDT01NQU5EIHwgTUZfRElTQUJMRUQgfCBNRl9HUkFZRUQpOworICAgICAgQ2hlY2tNZW51SXRlbTMyKGhNZW51LCBJRE1fVklFV19JRFcsIE1GX0JZQ09NTUFORCB8IE1GX1VOQ0hFQ0tFRCk7CisJfQorCXJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogIFNoZWxsVmlld19VcGRhdGVTaGVsbFNldHRpbmdzKCkKKyAgIAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit0eXBlZGVmIHZvaWQgKFdJTkFQSSAqUEZOU0hHRVRTRVRUSU5HU1BST0MpKExQU0hFTExGTEFHU1RBVEUgbHBzZnMsIERXT1JEIGR3TWFzayk7CisKKwordm9pZCBTaGVsbFZpZXdfVXBkYXRlU2hlbGxTZXR0aW5ncyhMUFNIRUxMVklFVyB0aGlzKQorewlUUkFDRShzaGVsbCwiKCVwKSBzdHViXG4iLHRoaXMpOworCXJldHVybiA7CisvKgorCVNIRUxMRkxBR1NUQVRFICAgICAgIHNmczsKKwlISU5TVEFOQ0UgICAgICAgICAgICBoaW5zdFNoZWxsMzI7CisqLworCS8qIFNpbmNlIFNIR2V0U2V0dGluZ3MgaXMgbm90IGltcGxlbWVudGVkIGluIGFsbCB2ZXJzaW9ucyBvZiB0aGUgc2hlbGwsIGdldCB0aGUgCisJZnVuY3Rpb24gYWRkcmVzcyBtYW51YWxseSBhdCBydW4gdGltZS4gVGhpcyBhbGxvd3MgdGhlIGNvZGUgdG8gcnVuIG9uIGFsbCAKKwlwbGF0Zm9ybXMuKi8KKy8qCisJWmVyb01lbW9yeSgmc2ZzLCBzaXplb2Yoc2ZzKSk7CisqLworCS8qIFRoZSBkZWZhdWx0LCBpbiBjYXNlIGFueSBvZiB0aGUgZm9sbG93aW5nIHN0ZXBzIGZhaWxzLCBpcyBjbGFzc2ljIFdpbmRvd3MgOTUgCisJc3R5bGUuKi8KKy8qCisJc2ZzLmZXaW45NUNsYXNzaWMgPSBUUlVFOworCisJaGluc3RTaGVsbDMyID0gTG9hZExpYnJhcnkoVEVYVCgic2hlbGwzMi5kbGwiKSk7CisJaWYoaGluc3RTaGVsbDMyKQorCXsgUEZOU0hHRVRTRVRUSU5HU1BST0MgcGZuU0hHZXRTZXR0aW5nczsKKworICAgICAgcGZuU0hHZXRTZXR0aW5ncyA9IChQRk5TSEdFVFNFVFRJTkdTUFJPQylHZXRQcm9jQWRkcmVzcyhoaW5zdFNoZWxsMzIsICJTSEdldFNldHRpbmdzIik7CisJICBpZihwZm5TSEdldFNldHRpbmdzKQorICAgICAgeyAoKnBmblNIR2V0U2V0dGluZ3MpKCZzZnMsIFNTRl9ET1VCTEVDTElDS0lOV0VCVklFVyB8IFNTRl9XSU45NUNMQVNTSUMpOworICAgICAgfQorCSAgRnJlZUxpYnJhcnkoaGluc3RTaGVsbDMyKTsKKwl9CisKKwlEV09SRCBkd0V4U3R5bGVzID0gMDsKKworCWlmKCFzZnMuZldpbjk1Q2xhc3NpYyAmJiAhc2ZzLmZEb3VibGVDbGlja0luV2ViVmlldykKKwkgIGR3RXhTdHlsZXMgfD0gTFZTX0VYX09ORUNMSUNLQUNUSVZBVEUgfCBMVlNfRVhfVFJBQ0tTRUxFQ1QgfCBMVlNfRVhfVU5ERVJMSU5FSE9UOworCisJTGlzdFZpZXdfU2V0RXh0ZW5kZWRMaXN0Vmlld1N0eWxlKHRoaXMtPmhXbmRMaXN0LCBkd0V4U3R5bGVzKTsKKyovCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiAgIFNoZWxsVmlld19PblNldHRpbmdDaGFuZ2UoKQorKi8gICAKK0xSRVNVTFQgU2hlbGxWaWV3X09uU2V0dGluZ0NoYW5nZShMUFNIRUxMVklFVyB0aGlzLCBMUENTVFIgbHBzelNlY3Rpb24pCit7CVRSQUNFKHNoZWxsLCIoJXApIHN0dWJcbiIsdGhpcyk7CisJLy9pZigwID09IGxzdHJjbXBpKGxwc3pTZWN0aW9uLCBURVhUKCJTaGVsbFN0YXRlIikpKQorCXsgU2hlbGxWaWV3X1VwZGF0ZVNoZWxsU2V0dGluZ3ModGhpcyk7CisJICByZXR1cm4gMDsKKwl9CisJcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgTUVOVV9PRkZTRVQgIDEKKyNkZWZpbmUgTUVOVV9NQVggICAgIDEwMAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogICBTaGVsbFZpZXdfRG9Db250ZXh0TWVudSgpCisqLyAgIAordm9pZCBTaGVsbFZpZXdfRG9Db250ZXh0TWVudShMUFNIRUxMVklFVyB0aGlzLCBXT1JEIHgsIFdPUkQgeSwgQk9PTDMyIGZEZWZhdWx0KQorewlVSU5UMzIJCQl1U2VsZWN0ZWQgPSBMaXN0Vmlld19HZXRTZWxlY3RlZENvdW50KHRoaXMtPmhXbmRMaXN0KTsKKwlMUElURU1JRExJU1QJKmFTZWxlY3RlZEl0ZW1zOworCVVJTlQzMgkJCWk7CisJTFBDT05URVhUTUVOVQlwQ29udGV4dE1lbnUgPSBOVUxMOworCUxWSVRFTQkJCWx2SXRlbTsKKwlVSU5UMzIgIAkJdUNvbW1hbmQ7CisJTUVOVUlURU1JTkZPMzJBCW1paTsKKwlpbnQgICAgICAgICAgICAJbk1lbnVJbmRleDsKKyAgICBDTUlOVk9LRUNPTU1BTkRJTkZPICBjbWk7CisKKwlUUkFDRShzaGVsbCwiKCVwKS0+KDB4JTA4eCAweCUwOHggMHglMDh4KSBzdHViXG4iLHRoaXMsIHgsIHksIGZEZWZhdWx0KTsKKwlhU2VsZWN0ZWRJdGVtcyA9IChMUElURU1JRExJU1QqKVNIQWxsb2ModVNlbGVjdGVkICogc2l6ZW9mKExQSVRFTUlETElTVCkpOworCisJaWYoYVNlbGVjdGVkSXRlbXMpCisJeyBaZXJvTWVtb3J5KCZsdkl0ZW0sIHNpemVvZihsdkl0ZW0pKTsKKwkgIGx2SXRlbS5tYXNrID0gTFZJRl9TVEFURSB8IExWSUZfUEFSQU07CisJICBsdkl0ZW0uc3RhdGVNYXNrID0gTFZJU19TRUxFQ1RFRDsKKwkgIGx2SXRlbS5pSXRlbSA9IDA7CisKKwkgIGkgPSAwOworICAgCisJICB3aGlsZShMaXN0Vmlld19HZXRJdGVtKHRoaXMtPmhXbmRMaXN0LCAmbHZJdGVtKSAmJiAoaSA8IHVTZWxlY3RlZCkpCisgICAgICB7IGlmKGx2SXRlbS5zdGF0ZSAmIExWSVNfU0VMRUNURUQpCisgICAgICAgIHsgYVNlbGVjdGVkSXRlbXNbaV0gPSAoTFBJVEVNSURMSVNUKWx2SXRlbS5sUGFyYW07CisgICAgICAgICAgaSsrOworICAgICAgICB9CisgICAgICAgIGx2SXRlbS5pSXRlbSsrOworICAgICAgfQorCisJICB0aGlzLT5wU0ZQYXJlbnQtPmxwdnRibC0+Zm5HZXRVSU9iamVjdE9mKHRoaXMtPnBTRlBhcmVudCwgdGhpcy0+aFduZFBhcmVudCwgdVNlbGVjdGVkLAorICAgICAgCQkJCShMUENJVEVNSURMSVNUKilhU2VsZWN0ZWRJdGVtcywgJklJRF9JQ29udGV4dE1lbnUsIE5VTEwsKExQVk9JRCopJnBDb250ZXh0TWVudSk7CisgICAKKwkgIGlmKHBDb250ZXh0TWVudSkKKyAgICAgIHsgSE1FTlUzMiBoTWVudSA9IENyZWF0ZVBvcHVwTWVudTMyKCk7CisKKyAgICAgICAgLyogU2VlIGlmIHdlIGFyZSBpbiBFeHBsb3JlIG9yIE9wZW4gbW9kZS4gSWYgdGhlIGJyb3dzZXIncyB0cmVlIGlzIHByZXNlbnQsIAorICAgICAgICB0aGVuIHdlIGFyZSBpbiBFeHBsb3JlIG1vZGUuKi8KKyAgICAgICAgCisJICAgIEJPT0wzMiAgZkV4cGxvcmUgPSBGQUxTRTsKKwkgICAgSFdORDMyICBod25kVHJlZSA9IDA7CisJICAgIGlmKFNfT0s9PSh0aGlzLT5wU2hlbGxCcm93c2VyLT5scHZ0YmwtPmZuR2V0Q29udHJvbFdpbmRvdyh0aGlzLT5wU2hlbGxCcm93c2VyLEZDV19UUkVFLCAmaHduZFRyZWUpKSAmJiBod25kVHJlZSkKKyAgICAgICAgeyBmRXhwbG9yZSA9IFRSVUU7CisgICAgICAgIH0KKworCSAgICBpZihoTWVudSAmJiBTX09LPT0ocENvbnRleHRNZW51LT5scHZ0YmwtPmZuUXVlcnlDb250ZXh0TWVudShwQ29udGV4dE1lbnUsCisgICAgICAgIAkJCQkJaE1lbnUsMCxNRU5VX09GRlNFVCxNRU5VX01BWCxDTUZfTk9STUFMIHwgCisJCQkJCQkJKHVTZWxlY3RlZCAhPSAxID8gMCA6IENNRl9DQU5SRU5BTUUpIHwgKGZFeHBsb3JlID8gQ01GX0VYUExPUkUgOiAwKSkpKQorICAgICAgICB7IGlmKGZEZWZhdWx0KQorICAgICAgICAgICAgeyB1Q29tbWFuZCA9IDA7CisgICAgICAgICAgICAKKyAgICAgICAgICAgICAgWmVyb01lbW9yeSgmbWlpLCBzaXplb2YobWlpKSk7CisgICAgICAgICAgICAgIG1paS5jYlNpemUgPSBzaXplb2YobWlpKTsKKyAgICAgICAgICAgICAgbWlpLmZNYXNrID0gTUlJTV9TVEFURSB8IE1JSU1fSUQ7CisKKyAgICAgICAgICAgICAgbk1lbnVJbmRleCA9IDA7CisKKyAgICAgICAgICAgICAgLy9maW5kIHRoZSBkZWZhdWx0IGl0ZW0gaW4gdGhlIG1lbnUKKyAgICAgICAgICAgICAgd2hpbGUoR2V0TWVudUl0ZW1JbmZvMzJBKGhNZW51LCBuTWVudUluZGV4LCBUUlVFLCAmbWlpKSkKKyAgICAgICAgICAgICAgeyBpZihtaWkuZlN0YXRlICYgTUZTX0RFRkFVTFQpCisgICAgICAgICAgICAgICAgeyB1Q29tbWFuZCA9IG1paS53SUQ7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbk1lbnVJbmRleCsrOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7IHVDb21tYW5kID0gVHJhY2tQb3B1cE1lbnUzMiggaE1lbnUsVFBNX0xFRlRBTElHTiB8IFRQTV9SRVRVUk5DTUQseCx5LDAsdGhpcy0+aFduZCxOVUxMKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgIAorICAgICAgICAgICAgaWYodUNvbW1hbmQgPiAwKQorICAgICAgICAgICAgeyBaZXJvTWVtb3J5KCZjbWksIHNpemVvZihjbWkpKTsKKyAgICAgICAgICAgICAgY21pLmNiU2l6ZSA9IHNpemVvZihjbWkpOworICAgICAgICAgICAgICBjbWkuaHduZCA9IHRoaXMtPmhXbmRQYXJlbnQ7CisgICAgICAgICAgICAgIGNtaS5scFZlcmIgPSAoTFBDU1RSKU1BS0VJTlRSRVNPVVJDRTMyQSh1Q29tbWFuZCAtIE1FTlVfT0ZGU0VUKTsKKwkJCSAgcENvbnRleHRNZW51LT5scHZ0YmwtPmZuSW52b2tlQ29tbWFuZChwQ29udGV4dE1lbnUsICZjbWkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRGVzdHJveU1lbnUzMihoTWVudSk7CisgICAgICAgICB9CisgICAgICAgICBwQ29udGV4dE1lbnUtPmxwdnRibC0+Zm5SZWxlYXNlKHBDb250ZXh0TWVudSk7CisgICAgICB9CisgICAgICBTSEZyZWUoYVNlbGVjdGVkSXRlbXMpOworCX0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIFNoZWxsVmlld19Pbk5vdGlmeSgpCisqLworICAgCitMUkVTVUxUIFNoZWxsVmlld19Pbk5vdGlmeShMUFNIRUxMVklFVyB0aGlzLCBVSU5UMzIgQ3RsSUQsIExQTk1IRFIgbHBubWgpCit7IE5NX0xJU1RWSUVXICpscG5tbHYgPSAoTk1fTElTVFZJRVcqKWxwbm1oOworICBMVl9ESVNQSU5GTyAqbHBkaSA9IChMVl9ESVNQSU5GTyAqKWxwbm1oOworICBMUElURU1JRExJU1QgcGlkbDsKKyAgRFdPUkQgZHdDdXJzb3I7IAorICBTVFJSRVQgICBzdHI7ICAKKyAgVUlOVDMyICB1RmxhZ3M7CisgIElFeHRyYWN0SWNvbiAqcGVpOworICAKKyAgVFJBQ0Uoc2hlbGwsIiVwIEN0bElEPSV1IGxwbm1oLT5jb2RlPSV4XG4iLHRoaXMsQ3RsSUQsbHBubWgtPmNvZGUpOworICAKKyAgc3dpdGNoKGxwbm1oLT5jb2RlKQorICB7IGNhc2UgTk1fU0VURk9DVVM6CisJICBUUkFDRShzaGVsbCwiTk1fU0VURk9DVVMgJXBcbiIsdGhpcyk7CisgICAgICBTaGVsbFZpZXdfT25TZXRGb2N1cyh0aGlzKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBOTV9LSUxMRk9DVVM6CisJICBUUkFDRShzaGVsbCwiTk1fS0lMTEZPQ1VTICVwXG4iLHRoaXMpOworICAgICAgU2hlbGxWaWV3X09uRGVhY3RpdmF0ZSh0aGlzKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBIRE5fRU5EVFJBQ0s6CisJICBUUkFDRShzaGVsbCwiSEROX0VORFRSQUNLICVwXG4iLHRoaXMpOworICAgICAgLypuQ29sdW1uMSA9IExpc3RWaWV3X0dldENvbHVtbldpZHRoKHRoaXMtPmhXbmRMaXN0LCAwKTsKKyAgICAgIG5Db2x1bW4yID0gTGlzdFZpZXdfR2V0Q29sdW1uV2lkdGgodGhpcy0+aFduZExpc3QsIDEpOyovCisJICByZXR1cm4gMDsKKyAgIAorICAgY2FzZSBMVk5fREVMRVRFSVRFTToKKwkgIFRSQUNFKHNoZWxsLCJMVk5fREVMRVRFSVRFTSAlcFxuIix0aGlzKTsKKyAgICAgIFNIRnJlZSgoTFBJVEVNSURMSVNUKWxwbm1sdi0+bFBhcmFtKTsgICAgIC8qZGVsZXRlIHRoZSBwaWRsIGJlY2F1c2Ugd2UgbWFkZSBhIGNvcHkgb2YgaXQqLworICAgICAgYnJlYWs7CisgICAKKyNpZmRlZiBMVk5fSVRFTUFDVElWQVRFCisgICBjYXNlIExWTl9JVEVNQUNUSVZBVEU6CisKKyNlbHNlICAgIC8vTFZOX0lURU1BQ1RJVkFURQorICAgY2FzZSBOTV9EQkxDTEs6CisgICBjYXNlIE5NX1JFVFVSTjoKKyNlbmRpZiAgIC8vTFZOX0lURU1BQ1RJVkFURQorCSAgVFJBQ0Uoc2hlbGwsIkxWTl9JVEVNQUNUSVZBVEUgfCBOTV9SRVRVUk4gJXBcbiIsdGhpcyk7CisgICAgICBTaGVsbFZpZXdfRG9Db250ZXh0TWVudSh0aGlzLCAwLCAwLCBUUlVFKTsKKyAgICAgIHJldHVybiAwOworICAgCisgICBjYXNlIExWTl9HRVRESVNQSU5GTzoKKyAgICAgIFRSQUNFKHNoZWxsLCJMVk5fR0VURElTUElORk8gJXBcbiIsdGhpcyk7CisgICAgICBwaWRsID0gKExQSVRFTUlETElTVClscGRpLT5pdGVtLmxQYXJhbTsKKworCisgICAgICBpZihscGRpLT5pdGVtLmlTdWJJdGVtKQkgICAgICAvKmlzIHRoZSBzdWItaXRlbSBpbmZvcm1hdGlvbiBiZWluZyByZXF1ZXN0ZWQ/Ki8KKyAgICAgIHsgaWYobHBkaS0+aXRlbS5tYXNrICYgTFZJRl9URVhUKQkgLyppcyB0aGUgdGV4dCBiZWluZyByZXF1ZXN0ZWQ/Ki8KKyAgICAgICAgeyBpZihQaWRsTWdyX0lzVmFsdWUoTlVMTCxwaWRsKSkJLyppcyB0aGlzIGEgdmFsdWUgb3IgYSBmb2xkZXI/Ki8KKyAgICAgICAgICB7ICBQaWRsTWdyX0dldERhdGFUZXh0KE5VTEwsdGhpcy0+bXBpZGwsIHBpZGwsIGxwZGktPml0ZW0ucHN6VGV4dCwgbHBkaS0+aXRlbS5jY2hUZXh0TWF4KTsKKyAgICAgICAgICAgICBpZighKmxwZGktPml0ZW0ucHN6VGV4dCkKKyAgICAgICAgICAgICAgIHNwcmludGYobHBkaS0+aXRlbS5wc3pUZXh0LCAiZmlsZSBhdHRyaWIgJXUiLCBscGRpLT5pdGVtLmlTdWJJdGVtICk7CisgICAgICAgICAgfQorICAgICAgICAgIGVsc2UgIC8qaXRzIGEgZm9sZGVyKi8KKyAgICAgICAgICB7IHNwcmludGYobHBkaS0+aXRlbS5wc3pUZXh0LCAiZm9sZGVyIGF0dHJpYiAldSIsIGxwZGktPml0ZW0uaVN1Ykl0ZW0gKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGVsc2UgICAgICAgLyp0aGUgaXRlbSB0ZXh0IGlzIGJlaW5nIHJlcXVlc3RlZCovCisgICAgICB7IGlmKGxwZGktPml0ZW0ubWFzayAmIExWSUZfVEVYVCkgICAgICAgLyppcyB0aGUgdGV4dCBiZWluZyByZXF1ZXN0ZWQ/Ki8KKyAgICAgICAgeyBpZihTX09LPT10aGlzLT5wU0ZQYXJlbnQtPmxwdnRibC0+Zm5HZXREaXNwbGF5TmFtZU9mKHRoaXMtPnBTRlBhcmVudCxwaWRsLCBTSEdETl9OT1JNQUwgfCBTSEdETl9JTkZPTERFUiwgJnN0cikpCisgICAgICAgICAgeyBpZihTVFJSRVRfV1NUUiA9PSBzdHIudVR5cGUpCisgICAgICAgICAgICB7IFdpZGVDaGFyVG9Mb2NhbDMyKGxwZGktPml0ZW0ucHN6VGV4dCwgc3RyLnUucE9sZVN0ciwgbHBkaS0+aXRlbS5jY2hUZXh0TWF4KTsKKyAgICAgICAgICAgICAgU0hGcmVlKHN0ci51LnBPbGVTdHIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYoU1RSUkVUX0NTVFIgPT0gc3RyLnVUeXBlKQorICAgICAgICAgICAgeyBzdHJuY3B5KGxwZGktPml0ZW0ucHN6VGV4dCwgc3RyLnUuY1N0ciwgbHBkaS0+aXRlbS5jY2hUZXh0TWF4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZihscGRpLT5pdGVtLm1hc2sgJiBMVklGX0lNQUdFKSAJCS8qaXMgdGhlIGltYWdlIGJlaW5nIHJlcXVlc3RlZD8qLworICAgICAgICB7IGlmKFNfT0sgPT0gKHRoaXMtPnBTRlBhcmVudC0+bHB2dGJsLT5mbkdldFVJT2JqZWN0T2YodGhpcy0+cFNGUGFyZW50LHRoaXMtPmhXbmQsMSwKKyAgICAgICAgCQkJCQkJKExQQ0lURU1JRExJU1QqKSZwaWRsLCAoUkVGSUlEKSZJSURfSUV4dHJhY3RJY29uLCBOVUxMLCAoTFBWT0lEKikmcGVpKSkpCisgICAgICAgICAgeyAvL0dldEljb25Mb2FjdGlvbiB3aWxsIGdpdmUgdXMgdGhlIGluZGV4IGludG8gb3VyIGltYWdlIGxpc3QKKyAgICAgICAgICAgIHBlaS0+bHB2dGJsLT5mbkdldEljb25Mb2NhdGlvbihwZWksIEdJTF9GT1JTSEVMTCwgTlVMTCwgMCwgJmxwZGktPml0ZW0uaUltYWdlLCAmdUZsYWdzKTsKKwkgICAgICAgIHBlaS0+bHB2dGJsLT5mblJlbGVhc2UocGVpKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIFRSQUNFKHNoZWxsLCItLSB0ZXh0PSVzIGltYWdlPSV4XG4iLGxwZGktPml0ZW0ucHN6VGV4dCwgbHBkaS0+aXRlbS5pSW1hZ2UpOworICAgICAgcmV0dXJuIDA7CisKKyAgICBjYXNlIE5NX1JDTElDSzoKKwkgIFRSQUNFKHNoZWxsLCJOTV9SQ0xJQ0sgJXBcbiIsdGhpcyk7CisgICAgICBkd0N1cnNvciA9IEdldE1lc3NhZ2VQb3MoKTsKKyAgICAgIFNoZWxsVmlld19Eb0NvbnRleHRNZW51KHRoaXMsIExPV09SRChkd0N1cnNvciksIEhJV09SRChkd0N1cnNvciksIEZBTFNFKTsKKworICAgIGNhc2UgTk1fQ0xJQ0s6CisJICBUUkFDRShzaGVsbCwiTk1fQ0xJQ0sgJXBcbiIsdGhpcyk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgTFZOX0lURU1DSEFOR0lORzoKKwkgIFRSQUNFKHNoZWxsLCJMVk5fSVRFTUNIQU5HSU5HICVwXG4iLHRoaXMpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIE5NX0NVU1RPTURSQVc6CisJICBUUkFDRShzaGVsbCwiTk1fQ1VTVE9NRFJBVyAlcFxuIix0aGlzKTsKKyAgICAgIGJyZWFrOworCisJZGVmYXVsdDoKKyAgICAgIFdBUk4gKHNoZWxsLCItLSBXTV9OT1RJRlkgdW5oYW5kbGVkXG4iKTsKKyAgICByZXR1cm4gMDsKKyAgfQorICByZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqICBTaGVsbFZpZXdfV25kUHJvYworKi8KKy8vd2luZG93c3guaAorI2RlZmluZSBHRVRfV01fQ09NTUFORF9JRCh3cCwgbHApICAgICAgICAgICAgICAgTE9XT1JEKHdwKQorI2RlZmluZSBHRVRfV01fQ09NTUFORF9IV05EKHdwLCBscCkgICAgICAgICAgICAgKEhXTkQzMikobHApCisjZGVmaW5lIEdFVF9XTV9DT01NQU5EX0NNRCh3cCwgbHApICAgICAgICAgICAgICBISVdPUkQod3ApCisvLyB3aW51c2VyLmgKKyNkZWZpbmUgV01fU0VUVElOR0NIQU5HRSAgICAgICAgICAgICAgICBXTV9XSU5JTklDSEFOR0UKKworTFJFU1VMVCBDQUxMQkFDSyBTaGVsbFZpZXdfV25kUHJvYyhIV05EMzIgaFduZCwgVUlOVDMyIHVNZXNzYWdlLCBXUEFSQU0zMiB3UGFyYW0sIExQQVJBTSBsUGFyYW0pCit7IExQU0hFTExWSUVXIHBUaGlzID0gKExQU0hFTExWSUVXKUdldFdpbmRvd0xvbmczMkEoaFduZCwgR1dMX1VTRVJEQVRBKTsKKyAgTFBDUkVBVEVTVFJVQ1QzMkEgbHBjczsKKworICBGSVhNRShzaGVsbCwiKGh3bmQ9JXggbXNnPSV4IHdwYXJtPSV4IGxwYXJtPSVseClcbiIsaFduZCwgdU1lc3NhZ2UsIHdQYXJhbSwgbFBhcmFtKTsKKyAgICAKKyAgc3dpdGNoICh1TWVzc2FnZSkKKyAgeyBjYXNlIFdNX05DQ1JFQVRFOgorICAgICAgeyBUUkFDRShzaGVsbCwiV01fTkNDUkVBVEVcbiIpOworICAgICAgICBscGNzID0gKExQQ1JFQVRFU1RSVUNUMzJBKWxQYXJhbTsKKyAgICAgICAgcFRoaXMgPSAoTFBTSEVMTFZJRVcpKGxwY3MtPmxwQ3JlYXRlUGFyYW1zKTsKKyAgICAgICAgU2V0V2luZG93TG9uZzMyQShoV25kLCBHV0xfVVNFUkRBVEEsIChMT05HKXBUaGlzKTsKKyAgICAgICAgcFRoaXMtPmhXbmQgPSBoV25kOyAgICAgICAgLypzZXQgdGhlIHdpbmRvdyBoYW5kbGUqLworICAgICAgfQorICAgICAgYnJlYWs7CisgICAKKyAgIGNhc2UgV01fU0laRToKKyAgICAgIFRSQUNFKHNoZWxsLCJXTV9TSVpFXG4iKTsKKyAgICAgIHJldHVybiBTaGVsbFZpZXdfT25TaXplKHBUaGlzLExPV09SRChsUGFyYW0pLCBISVdPUkQobFBhcmFtKSk7CisgICAKKyAgIGNhc2UgV01fU0VURk9DVVM6CisgICAgICBUUkFDRShzaGVsbCwiV01fU0VURk9DVVNcbiIpOyAgIAorICAgICAgcmV0dXJuIFNoZWxsVmlld19PblNldEZvY3VzKHBUaGlzKTsKKyAKKyAgIGNhc2UgV01fS0lMTEZPQ1VTOgorICAgICAgVFJBQ0Uoc2hlbGwsIldNX0tJTExGT0NVU1xuIik7CisgIAkgIHJldHVybiBTaGVsbFZpZXdfT25LaWxsRm9jdXMocFRoaXMpOworCisgICBjYXNlIFdNX0NSRUFURToKKyAgICAgIFRSQUNFKHNoZWxsLCJXTV9DUkVBVEVcbiIpOworICAgICAgcmV0dXJuIFNoZWxsVmlld19PbkNyZWF0ZShwVGhpcyk7CisKKyAgIGNhc2UgV01fU0hPV1dJTkRPVzoKKyAgICAgIFRSQUNFKHNoZWxsLCJXTV9TSE9XV0lORE9XXG4iKTsKKyAgICAgIFVwZGF0ZVdpbmRvdzMyKHBUaGlzLT5oV25kTGlzdCk7CisgICAgICBicmVhazsKKworICAgY2FzZSBXTV9BQ1RJVkFURToKKyAgICAgIFRSQUNFKHNoZWxsLCJXTV9BQ1RJVkFURVxuIik7CisgICAgICByZXR1cm4gU2hlbGxWaWV3X09uQWN0aXZhdGUocFRoaXMsIFNWVUlBX0FDVElWQVRFX0ZPQ1VTKTsKKyAgIAorICAgY2FzZSBXTV9DT01NQU5EOgorICAgICAgVFJBQ0Uoc2hlbGwsIldNX0NPTU1BTkRcbiIpOworICAgICAgcmV0dXJuIFNoZWxsVmlld19PbkNvbW1hbmQocFRoaXMsIEdFVF9XTV9DT01NQU5EX0lEKHdQYXJhbSwgbFBhcmFtKSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0VUX1dNX0NPTU1BTkRfQ01EKHdQYXJhbSwgbFBhcmFtKSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0VUX1dNX0NPTU1BTkRfSFdORCh3UGFyYW0sIGxQYXJhbSkpOworICAgCisgICBjYXNlIFdNX0lOSVRNRU5VUE9QVVA6CisgICAgICBUUkFDRShzaGVsbCwiV01fSU5JVE1FTlVQT1BVUFxuIik7CisgICAgICByZXR1cm4gU2hlbGxWaWV3X1VwZGF0ZU1lbnUocFRoaXMsIChITUVOVTMyKXdQYXJhbSk7CisgICAKKyAgIGNhc2UgV01fTk9USUZZOgorICAgICAgVFJBQ0Uoc2hlbGwsIldNX05PVElGWVxuIik7CisgICAgICByZXR1cm4gU2hlbGxWaWV3X09uTm90aWZ5KHBUaGlzLChVSU5UMzIpd1BhcmFtLCAoTFBOTUhEUilsUGFyYW0pOworCisgICBjYXNlIFdNX1NFVFRJTkdDSEFOR0U6CisgICAgICBUUkFDRShzaGVsbCwiV01fU0VUVElOR0NIQU5HRVxuIik7CisgICAgICByZXR1cm4gU2hlbGxWaWV3X09uU2V0dGluZ0NoYW5nZShwVGhpcywoTFBDU1RSKWxQYXJhbSk7CisKKy8qIC0tLS0tLS0tLS0tLS0qLworICAgY2FzZSBXTV9NT1ZFOgorICAgICAgVFJBQ0Uoc2hlbGwsIldNX01PVkVcbiIpOyAgIAorICAgICAgYnJlYWs7CisgICAKKyAgIGNhc2UgV01fQUNUSVZBVEVBUFA6CisgICAgICBUUkFDRShzaGVsbCwiV01fQUNUSVZBVEVBUFBcbiIpOworICAgICAgYnJlYWs7CisKKyAgIGNhc2UgV01fTk9USUZZRk9STUFUOgorICAgICAgVFJBQ0Uoc2hlbGwsIldNX05PVElGWUZPUk1BVFxuIik7CisgICAgICBicmVhazsKKworICAgY2FzZSBXTV9OQ1BBSU5UOgorICAgICAgVFJBQ0Uoc2hlbGwsIldNX05DUEFJTlRcbiIpOworICAgICAgYnJlYWs7CisKKyAgIGNhc2UgV01fRVJBU0VCS0dORDoKKyAgICAgIFRSQUNFKHNoZWxsLCJXTV9FUkFTRUJLR05EXG4iKTsKKyAgICAgIGJyZWFrOworCisgICBjYXNlIFdNX1BBSU5UOgorICAgICAgVFJBQ0Uoc2hlbGwsIldNX1BBSU5UXG4iKTsKKyAgICAgIGJyZWFrOworCisgICBjYXNlIFdNX05DQ0FMQ1NJWkU6CisgICAgICBUUkFDRShzaGVsbCwiV01fTkNDQUxDU0laRVxuIik7CisgICAgICBicmVhazsKKworICAgY2FzZSBXTV9XSU5ET1dQT1NDSEFOR0lORzoKKyAgICAgIFRSQUNFKHNoZWxsLCJXTV9XSU5ET1dQT1NDSEFOR0lOR1xuIik7CisgICAgICBicmVhazsKKworICAgY2FzZSBXTV9XSU5ET1dQT1NDSEFOR0VEOgorICAgICAgVFJBQ0Uoc2hlbGwsIldNX1dJTkRPV1BPU0NIQU5HRURcbiIpOworICAgICAgYnJlYWs7CisKKyAgIGNhc2UgV01fUEFSRU5UTk9USUZZOgorICAgICAgVFJBQ0Uoc2hlbGwsIldNX1BBUkVOVE5PVElGWVxuIik7CisgICAgICBicmVhazsKKworICAgY2FzZSBXTV9NT1VTRUFDVElWQVRFOgorICAgICAgVFJBQ0Uoc2hlbGwsIldNX01PVVNFQUNUSVZBVEVcbiIpOworICAgICAgYnJlYWs7CisKKyAgIGNhc2UgV01fU0VUQ1VSU09SOgorICAgICAgVFJBQ0Uoc2hlbGwsIldNX1NFVENVUlNPUlxuIik7CisgICAgICBicmVhazsKKyAgfQorICByZXR1cm4gRGVmV2luZG93UHJvYzMyQSAoaFduZCwgdU1lc3NhZ2UsIHdQYXJhbSwgbFBhcmFtKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogIElTaGVsbFZpZXc6OlF1ZXJ5SW50ZXJmYWNlCisqLworc3RhdGljIEhSRVNVTFQgV0lOQVBJIElTaGVsbFZpZXdfUXVlcnlJbnRlcmZhY2UoTFBTSEVMTFZJRVcgdGhpcyxSRUZJSUQgcmlpZCwgTFBWT0lEICpwcHZPYmopCit7IGNoYXIgICAgeHJpaWRbNTBdOworICBXSU5FX1N0cmluZ0Zyb21DTFNJRCgoTFBDTFNJRClyaWlkLHhyaWlkKTsKKyAgVFJBQ0Uoc2hlbGwsIiglcCktPihcblx0SUlEOlx0JXMsJXApXG4iLHRoaXMseHJpaWQscHB2T2JqKTsKKworICAqcHB2T2JqID0gTlVMTDsKKworICBpZihJc0VxdWFsSUlEKHJpaWQsICZJSURfSVVua25vd24pKSAgICAgICAgICAvKklVbmtub3duKi8KKyAgeyAqcHB2T2JqID0gdGhpczsgCisgIH0KKyAgZWxzZSBpZihJc0VxdWFsSUlEKHJpaWQsICZJSURfSVNoZWxsVmlldykpICAvKklTaGVsbFZpZXcqLworICB7ICpwcHZPYmogPSAoSVNoZWxsVmlldyopdGhpczsKKyAgfSAgIAorCisgIGlmKCpwcHZPYmopCisgIHsgKCooTFBTSEVMTFZJRVcqKXBwdk9iaiktPmxwdnRibC0+Zm5BZGRSZWYodGhpcyk7ICAgICAgCisgICAgVFJBQ0Uoc2hlbGwsIi0tIEludGVyZmFjZTogKCVwKS0+KCVwKVxuIixwcHZPYmosKnBwdk9iaik7CisgICAgcmV0dXJuIFNfT0s7CisgIH0KKyAgVFJBQ0Uoc2hlbGwsIi0tIEludGVyZmFjZTogRV9OT0lOVEVSRkFDRVxuIik7CisgIHJldHVybiBFX05PSU5URVJGQUNFOworfSAgIAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqICBJU2hlbGxWaWV3OjpBZGRSZWYKKyovCitzdGF0aWMgVUxPTkcgV0lOQVBJIElTaGVsbFZpZXdfQWRkUmVmKExQU0hFTExWSUVXIHRoaXMpCit7IFRSQUNFKHNoZWxsLCIoJXApLT4oY291bnQ9JWx1KVxuIix0aGlzLCh0aGlzLT5yZWYpKzEpOworICByZXR1cm4gKysodGhpcy0+cmVmKTsKK30KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiAgSVNoZWxsVmlldzo6UmVsZWFzZQorKi8KK3N0YXRpYyBVTE9ORyBXSU5BUEkgSVNoZWxsVmlld19SZWxlYXNlKExQU0hFTExWSUVXIHRoaXMpCit7IFRSQUNFKHNoZWxsLCIoJXApLT4oKVxuIix0aGlzKTsKKyAgaWYgKCEtLSh0aGlzLT5yZWYpKSAKKyAgeyBUUkFDRShzaGVsbCwiIGRlc3Ryb3lpbmcgSUVudW1JRExpc3QoJXApXG4iLHRoaXMpOworCisgICAgaWYodGhpcy0+cFNGUGFyZW50KQorICAgICAgIHRoaXMtPnBTRlBhcmVudC0+bHB2dGJsLT5mblJlbGVhc2UodGhpcy0+cFNGUGFyZW50KTsKKworICAgIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksMCx0aGlzKTsKKyAgICByZXR1cm4gMDsKKyAgfQorICByZXR1cm4gdGhpcy0+cmVmOworfQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqICBJU2hlbGxWaWV3OjpHZXRXaW5kb3cKKyovCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkgSVNoZWxsVmlld19HZXRXaW5kb3coTFBTSEVMTFZJRVcgdGhpcyxIV05EMzIgKiBwaFduZCkKK3sgVFJBQ0Uoc2hlbGwsIiglcCkgc3R1YlxuIix0aGlzKTsKKyAqcGhXbmQgPSB0aGlzLT5oV25kOworCisgcmV0dXJuIFNfT0s7Cit9CitzdGF0aWMgSFJFU1VMVCBXSU5BUEkgSVNoZWxsVmlld19Db250ZXh0U2Vuc2l0aXZlSGVscChMUFNIRUxMVklFVyB0aGlzLEJPT0wzMiBmRW50ZXJNb2RlKQoreyBGSVhNRShzaGVsbCwiKCVwKSBzdHViXG4iLHRoaXMpOworICByZXR1cm4gRV9OT1RJTVBMOworfQorc3RhdGljIEhSRVNVTFQgV0lOQVBJIElTaGVsbFZpZXdfVHJhbnNsYXRlQWNjZWxlcmF0b3IoTFBTSEVMTFZJRVcgdGhpcyxMUE1TRzMyIGxwbXNnKQoreyBGSVhNRShzaGVsbCwiKCVwKS0+KCVwKSBzdHViXG4iLHRoaXMsbHBtc2cpOworICByZXR1cm4gRV9OT1RJTVBMOworfQorc3RhdGljIEhSRVNVTFQgV0lOQVBJIElTaGVsbFZpZXdfRW5hYmxlTW9kZWxlc3MoTFBTSEVMTFZJRVcgdGhpcyxCT09MMzIgZkVuYWJsZSkKK3sgRklYTUUoc2hlbGwsIiglcCkgc3R1YlxuIix0aGlzKTsKKyAgcmV0dXJuIEVfTk9USU1QTDsKK30KK3N0YXRpYyBIUkVTVUxUIFdJTkFQSSBJU2hlbGxWaWV3X1VJQWN0aXZhdGUoTFBTSEVMTFZJRVcgdGhpcyxVSU5UMzIgdVN0YXRlKQorewlDSEFSCXN6TmFtZVtNQVhfUEFUSF07CisJTFJFU1VMVAlsUmVzdWx0OworCWludAkJblBhcnRBcnJheVsxXSA9IHstMX07CisKKwlGSVhNRShzaGVsbCwiKCVwKSBzdHViXG4iLHRoaXMpOworCS8vZG9uJ3QgZG8gYW55dGhpbmcgaWYgdGhlIHN0YXRlIGlzbid0IHJlYWxseSBjaGFuZ2luZworCWlmKHRoaXMtPnVTdGF0ZSA9PSB1U3RhdGUpCisJeyByZXR1cm4gU19PSzsKKyAgICB9CisKKwkvL09uQWN0aXZhdGUgaGFuZGxlcyB0aGUgbWVudSBtZXJnaW5nIGFuZCBpbnRlcm5hbCBzdGF0ZQorCVNoZWxsVmlld19PbkFjdGl2YXRlKHRoaXMsIHVTdGF0ZSk7CisKKwkvL3JlbW92ZSB0aGUgZG9ja2luZyB3aW5kb3cKKwlpZihnX2JTaG93SURXKQorCXsgU2hlbGxWaWV3X0FkZFJlbW92ZURvY2tpbmdXaW5kb3codGhpcywgRkFMU0UpOworICAgIH0KKworCS8vb25seSBkbyB0aGlzIGlmIHdlIGFyZSBhY3RpdmUKKwlpZih1U3RhdGUgIT0gU1ZVSUFfREVBQ1RJVkFURSkKKwl7IC8vdXBkYXRlIHRoZSBzdGF0dXMgYmFyCisJICAgc3RyY3B5KHN6TmFtZSwgImR1bW15MzIiKTsKKyAgIAorCSAgdGhpcy0+cFNGUGFyZW50LT5scHZ0YmwtPmZuR2V0Rm9sZGVyUGF0aCh0aGlzLT5wU0ZQYXJlbnQsIHN6TmFtZSArIHN0cmxlbihzek5hbWUpLCBzaXplb2Yoc3pOYW1lKSAtIHN0cmxlbihzek5hbWUpKTsKKworCSAgLyogc2V0IHRoZSBudW1iZXIgb2YgcGFydHMgKi8KKwkgIHRoaXMtPnBTaGVsbEJyb3dzZXItPmxwdnRibC0+Zm5TZW5kQ29udHJvbE1zZyh0aGlzLT5wU2hlbGxCcm93c2VyLEZDV19TVEFUVVMsCisgICAgICAJCQkJIFNCX1NFVFBBUlRTLCAxLCAoTFBBUkFNKW5QYXJ0QXJyYXksICZsUmVzdWx0KTsKKworCSAgLyogc2V0IHRoZSB0ZXh0IGZvciB0aGUgcGFydHMgKi8KKwkgIHRoaXMtPnBTaGVsbEJyb3dzZXItPmxwdnRibC0+Zm5TZW5kQ29udHJvbE1zZyh0aGlzLT5wU2hlbGxCcm93c2VyLEZDV19TVEFUVVMsCisgICAgICAJCQkJIFNCX1NFVFRFWFQzMkEsIDAsIChMUEFSQU0pc3pOYW1lLCAmbFJlc3VsdCk7CisKKwkgIC8vYWRkIHRoZSBkb2NraW5nIHdpbmRvdyBpZiBuZWNlc3NhcnkKKwkgIGlmKGdfYlNob3dJRFcpCisJICB7IFNoZWxsVmlld19BZGRSZW1vdmVEb2NraW5nV2luZG93KHRoaXMsIFRSVUUpOworICAgICAgfQorCX0KKwlyZXR1cm4gU19PSzsKK30KK3N0YXRpYyBIUkVTVUxUIFdJTkFQSSBJU2hlbGxWaWV3X1JlZnJlc2goTFBTSEVMTFZJRVcgdGhpcykKK3sJVFJBQ0Uoc2hlbGwsIiglcCkgc3R1YlxuIix0aGlzKTsKKwlMaXN0Vmlld19EZWxldGVBbGxJdGVtcyh0aGlzLT5oV25kTGlzdCk7CisJU2hlbGxWaWV3X0ZpbGxMaXN0KHRoaXMpOworCXJldHVybiBTX09LOworfQorc3RhdGljIEhSRVNVTFQgV0lOQVBJIElTaGVsbFZpZXdfQ3JlYXRlVmlld1dpbmRvdyhMUFNIRUxMVklFVyB0aGlzLCBJU2hlbGxWaWV3ICpscFByZXZWaWV3LAorICAgICAgICAgICAgICAgICAgICAgTFBDRk9MREVSU0VUVElOR1MgbHBmcywgSVNoZWxsQnJvd3NlciAqIHBzYixSRUNUMzIgKiBwcmNWaWV3LCBIV05EMzIgICpwaFduZCkKK3sgIFdORENMQVNTMzJBIHdjOworICAgKnBoV25kID0gMDsKKworICAgVFJBQ0Uoc2hlbGwsIiglcCktPihzaGx2aWV3PSVwIHNldD0lcCBzaGxicnM9JXAgcmVjPSVwIGh3bmQ9JXApIGluY29tcGxldGVcbiIsdGhpcywgbHBQcmV2VmlldyxscGZzLCBwc2IsIHByY1ZpZXcsIHBoV25kKTsKKyAgIFRSQUNFKHNoZWxsLCItLSBsZWZ0PSVpIHRvcD0laSByaWdodD0laSBib3R0b209JWlcbiIscHJjVmlldy0+bGVmdCxwcmNWaWV3LT50b3AsIHByY1ZpZXctPnJpZ2h0LCBwcmNWaWV3LT5ib3R0b20pOworICAgCisvL2lmIG91ciB3aW5kb3cgY2xhc3MgaGFzIG5vdCBiZWVuIHJlZ2lzdGVyZWQsIHRoZW4gZG8gc28KKyAgaWYoIUdldENsYXNzSW5mbzMyQShzaGVsbDMyX2hJbnN0YW5jZSwgU1ZfQ0xBU1NfTkFNRSwgJndjKSkKKyAgeyBaZXJvTWVtb3J5KCZ3Yywgc2l6ZW9mKHdjKSk7CisgICAgd2Muc3R5bGUgICAgICAgICAgPSBDU19IUkVEUkFXIHwgQ1NfVlJFRFJBVzsKKyAgICB3Yy5scGZuV25kUHJvYyAgICA9IChXTkRQUk9DMzIpIFNoZWxsVmlld19XbmRQcm9jOworICAgIHdjLmNiQ2xzRXh0cmEgICAgID0gMDsKKyAgICB3Yy5jYlduZEV4dHJhICAgICA9IDA7CisgICAgd2MuaEluc3RhbmNlICAgICAgPSBzaGVsbDMyX2hJbnN0YW5jZTsKKyAgICB3Yy5oSWNvbiAgICAgICAgICA9IDA7CisgICAgd2MuaEN1cnNvciAgICAgICAgPSBMb2FkQ3Vyc29yMzJBICgwLCBJRENfQVJST1czMkEpOworICAgIHdjLmhickJhY2tncm91bmQgID0gKEhCUlVTSDMyKSAoQ09MT1JfV0lORE9XICsgMSk7CisgICAgd2MubHBzek1lbnVOYW1lICAgPSBOVUxMOworICAgIHdjLmxwc3pDbGFzc05hbWUgID0gU1ZfQ0xBU1NfTkFNRTsKKyAgIAorICAgIGlmKCFSZWdpc3RlckNsYXNzMzJBKCZ3YykpCisgICAgICByZXR1cm4gRV9GQUlMOworICAgfQorICAgLy9zZXQgdXAgdGhlIG1lbWJlciB2YXJpYWJsZXMKKyAgIHRoaXMtPnBTaGVsbEJyb3dzZXIgPSBwc2I7CisgICB0aGlzLT5Gb2xkZXJTZXR0aW5ncyA9ICpscGZzOworCisgICAvL2dldCBvdXIgcGFyZW50IHdpbmRvdworICAgdGhpcy0+cFNoZWxsQnJvd3Nlci0+bHB2dGJsLT5mbkdldFdpbmRvdyh0aGlzLT5wU2hlbGxCcm93c2VyLCAmKHRoaXMtPmhXbmRQYXJlbnQpKTsKKworICAgKnBoV25kID0gQ3JlYXRlV2luZG93RXgzMkEoMCwgU1ZfQ0xBU1NfTkFNRSwgTlVMTCwgV1NfQ0hJTEQgfCBXU19WSVNJQkxFIHwgV1NfQ0xJUFNJQkxJTkdTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJjVmlldy0+bGVmdCwgcHJjVmlldy0+dG9wLCBwcmNWaWV3LT5yaWdodCAtIHByY1ZpZXctPmxlZnQsIHByY1ZpZXctPmJvdHRvbSAtIHByY1ZpZXctPnRvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPmhXbmRQYXJlbnQsIDAsIHNoZWxsMzJfaEluc3RhbmNlLCAoTFBWT0lEKXRoaXMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICBpZighKnBoV25kKQorICAgICByZXR1cm4gRV9GQUlMOworCisgICB0aGlzLT5wU2hlbGxCcm93c2VyLT5scHZ0YmwtPmZuQWRkUmVmKHRoaXMtPnBTaGVsbEJyb3dzZXIpOworCisgICByZXR1cm4gU19PSzsKK30KKworc3RhdGljIEhSRVNVTFQgV0lOQVBJIElTaGVsbFZpZXdfRGVzdHJveVZpZXdXaW5kb3coTFBTSEVMTFZJRVcgdGhpcykKK3sJVFJBQ0Uoc2hlbGwsIiglcCkgc3R1YlxuIix0aGlzKTsKKworCS8qTWFrZSBhYnNvbHV0ZWx5IHN1cmUgYWxsIG91ciBVSSBpcyBjbGVhbmVkIHVwLiovCisJSVNoZWxsVmlld19VSUFjdGl2YXRlKHRoaXMsIFNWVUlBX0RFQUNUSVZBVEUpOworCWlmKHRoaXMtPmhNZW51KQorICAgCXsgRGVzdHJveU1lbnUzMih0aGlzLT5oTWVudSk7CisgICAgfQorCURlc3Ryb3lXaW5kb3czMih0aGlzLT5oV25kKTsKKwl0aGlzLT5wU2hlbGxCcm93c2VyLT5scHZ0YmwtPmZuUmVsZWFzZSh0aGlzLT5wU2hlbGxCcm93c2VyKTsKKwlyZXR1cm4gU19PSzsKK30KK3N0YXRpYyBIUkVTVUxUIFdJTkFQSSBJU2hlbGxWaWV3X0dldEN1cnJlbnRJbmZvKExQU0hFTExWSUVXIHRoaXMsIExQRk9MREVSU0VUVElOR1MgbHBmcykKK3sgRklYTUUoc2hlbGwsIiglcCktPiglcClzdHViXG4iLHRoaXMsIGxwZnMpOworCisgICpscGZzID0gdGhpcy0+Rm9sZGVyU2V0dGluZ3M7CisgIHJldHVybiBTX09LOworfQorc3RhdGljIEhSRVNVTFQgV0lOQVBJIElTaGVsbFZpZXdfQWRkUHJvcGVydHlTaGVldFBhZ2VzKExQU0hFTExWSUVXIHRoaXMsIERXT1JEIGR3UmVzZXJ2ZWQsTFBGTkFERFBST1BTSEVFVFBBR0UgbHBmbiwgTFBBUkFNIGxwYXJhbSkKK3sgRklYTUUoc2hlbGwsIiglcCkgc3R1YlxuIix0aGlzKTsKKyAgcmV0dXJuIEVfTk9USU1QTDsKK30KK3N0YXRpYyBIUkVTVUxUIFdJTkFQSSBJU2hlbGxWaWV3X1NhdmVWaWV3U3RhdGUoTFBTSEVMTFZJRVcgdGhpcykKK3sgRklYTUUoc2hlbGwsIiglcCkgc3R1YlxuIix0aGlzKTsKKyAgcmV0dXJuIFNfT0s7Cit9CitzdGF0aWMgSFJFU1VMVCBXSU5BUEkgSVNoZWxsVmlld19TZWxlY3RJdGVtKExQU0hFTExWSUVXIHRoaXMsIExQQ0lURU1JRExJU1QgcGlkbEl0ZW0sIFVJTlQzMiB1RmxhZ3MpCit7IEZJWE1FKHNoZWxsLCIoJXApLT4ocGlkbD0lcCwgMHglMDh4KSBzdHViXG4iLHRoaXMsIHBpZGxJdGVtLCB1RmxhZ3MpOworICByZXR1cm4gRV9OT1RJTVBMOworfQorc3RhdGljIEhSRVNVTFQgV0lOQVBJIElTaGVsbFZpZXdfR2V0SXRlbU9iamVjdChMUFNIRUxMVklFVyB0aGlzLCBVSU5UMzIgdUl0ZW0sIFJFRklJRCByaWlkLExQVk9JRCAqcHB2T3V0KQoreyBjaGFyICAgIHhyaWlkWzUwXTsKKyAgV0lORV9TdHJpbmdGcm9tQ0xTSUQoKExQQ0xTSUQpcmlpZCx4cmlpZCk7CisKKyAgRklYTUUoc2hlbGwsIiglcCktPigweCUwOHgsXG5cdCVzLCAlcClzdHViXG4iLHRoaXMsIHVJdGVtLCB4cmlpZCwgcHB2T3V0KTsKKworICAqcHB2T3V0ID0gTlVMTDsKKyAgcmV0dXJuIEVfTk9USU1QTDsKK30KZGlmZiAtLWdpdCBhL2RsbHMvc2hlbGwzMi9zaHJlcy5yYyBiL2RsbHMvc2hlbGwzMi9zaHJlcy5yYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MDhhMzFkCi0tLSAvZGV2L251bGwKKysrIGIvZGxscy9zaGVsbDMyL3NocmVzLnJjCkBAIC0wLDAgKzEsMjEgQEAKKyNpbmNsdWRlICJzaHJlc2RlZi5oIgorCisvLyB3ZSBoYXZlIHRvIGZpbmQgYSBzb2x1dGlvbiBmb3IgdGhlIGljb25zCisvLyBJRElfRk9MREVSICAgICAgICAgICAgICBJQ09OICAgIERJU0NBUkRBQkxFICAgICAiZm9sZGVyLmljbyIKKy8vIElESV9GT0xERVJPUEVOICAgICAgICAgIElDT04gICAgRElTQ0FSREFCTEUgICAgICJmb2xkZXJvcC5pY28iCisKK1NUUklOR1RBQkxFIERJU0NBUkRBQkxFIAorQkVHSU4KKyAgICBJRFNfRklMRV9USVRMRSAgICAgIAkiRmlsZXM6ICIKKyAgICBJRFNfTUlfRklMRSAgICAgICAgIAkiJkZpbGVzIgorICAgIElEU19NSV9WSUVXX0ZJTEVTICAgICAgICImVmlldyBGaWxlcyIKKyAgICBJRFNfVEJfVklFV19GSUxFUyAgICAgICAiVmlldyBGaWxlc3MiCisgICAgSURTX01JX1ZJRVdfSURXICAgICAgICAgIlNob3cgJkRvY2tpbmcgV2luZG93IgorICAgIElEU19UQl9WSUVXX0lEVyAgICAgICAgICJTaG93IERvY2tpbmcgV2luZG93IgorICAgIElEU19DT0xVTU4xICAgICAgICAgICAgICJOYW1lIgorICAgIElEU19DT0xVTU4yICAgICAgICAgICAgICJEYXRlIgorICAgIElEU19DT0xVTU4zICAgICAgICAgICAgICJTaXplIgorICAgIElEU19DT0xVTU40ICAgICAgICAgICAgICJBdHRyaWJ1dGVzIgorRU5ECisKKwpkaWZmIC0tZ2l0IGEvZGxscy9zaGVsbDMyL3NocmVzZGVmLmggYi9kbGxzL3NoZWxsMzIvc2hyZXNkZWYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Y2UwMjAyCi0tLSAvZGV2L251bGwKKysrIGIvZGxscy9zaGVsbDMyL3NocmVzZGVmLmgKQEAgLTAsMCArMSwyMSBAQAorI2lmbmRlZiBfX1dJTkVfU0hFTExfUkVTX0gKKyNkZWZpbmUgX19XSU5FX1NIRUxMX1JFU19ICisKKyNkZWZpbmUgSURTX0ZJTEVfVElUTEUgICAgICAgICAgICAgIAkxCisjZGVmaW5lIElEU19NSV9GSUxFICAgICAgICAgICAgICAgICAJMgorI2RlZmluZSBJRFNfTUlfVklFV19GSUxFUyAgICAgICAgICAgICAgIDMKKyNkZWZpbmUgSURTX1RCX1ZJRVdfRklMRVMgICAgICAgICAgICAgICA0CisjZGVmaW5lIElEU19NSV9WSUVXX0lEVyAgICAgICAgICAgICAgICAgNQorI2RlZmluZSBJRFNfVEJfVklFV19JRFcgICAgICAgICAgICAgICAgIDYKKworI2RlZmluZSBJRFNfQ09MVU1OMSAgICAgICAgICAgICAgICAgICAgIDcKKyNkZWZpbmUgSURTX0NPTFVNTjIgICAgICAgICAgICAgICAgICAgICA4CisjZGVmaW5lIElEU19DT0xVTU4zICAgICAgICAgICAgICAgICAgICAgOQorI2RlZmluZSBJRFNfQ09MVU1ONCAgICAgICAgICAgICAgICAgICAgIDEwCisKKyNkZWZpbmUgSURTX01JX0ZJTEVJVEVNICAgICAgICAgICAgICAgICAxMgorCisjZGVmaW5lIElESV9GT0xERVIgICAgICAgICAgICAgICAgICAgICAgMTAxCisjZGVmaW5lIElESV9GT0xERVJPUEVOICAgICAgICAgICAgICAgICAgMTAyCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZG9jdW1lbnRhdGlvbi9NYWtlZmlsZS5pbiBiL2RvY3VtZW50YXRpb24vTWFrZWZpbGUuaW4KaW5kZXggZmRmNDRiMS4uZmI1NTFiZCAxMDA2NDQKLS0tIGEvZG9jdW1lbnRhdGlvbi9NYWtlZmlsZS5pbgorKysgYi9kb2N1bWVudGF0aW9uL01ha2VmaWxlLmluCkBAIC01MiwxMCArNTIsMTYgQEAKIGluc3RhbGw6OiAKIAkkKElOU1RBTExfREFUQSkgJChTUkNESVIpL3dpbmUubWFuICQobWFuZGlyKS93aW5lJChtYW5leHQpCiAKK3VuaW5zdGFsbDo6CisJJChSTSkgJChtYW5kaXIpL3dpbmUkKG1hbmV4dCkKKwogIyBOb3QgZG9uZSBieSBkZWZhdWx0IGJlY2F1c2Ugb2YgbWFrZWluZm8gYnVncwogaW5zdGFsbF9pbmZvOiAkKElORk9GSUxFUykKIAlmb3IgaSBpbiAkKElORk9GSUxFUyk7IGRvICQoSU5TVEFMTF9EQVRBKSAkJGkgJChpbmZvZGlyKS8kJGk7IGRvbmUKIAordW5pbnN0YWxsX2luZm86CisJZm9yIGkgaW4gJChJTkZPRklMRVMpOyBkbyAkKFJNKSAkKGluZm9kaXIpLyQkaTsgZG9uZQorCiBjbGVhbjo6CiAJJChSTSkgJChJTkZPRklMRVMpICQoRFZJRklMRVMpICQoSU5DTFVERVMpCiAJJChSTSkgd2luZS5hdXggd2luZS5jcCB3aW5lLmNwcyB3aW5lLmZuIHdpbmUuZm5zIHdpbmUua3kgd2luZS5sb2cgXApkaWZmIC0tZ2l0IGEvZG9jdW1lbnRhdGlvbi9jb21tb25fY29udHJvbHMgYi9kb2N1bWVudGF0aW9uL2NvbW1vbl9jb250cm9scwppbmRleCA2Zjg1NGEyLi40M2I0NDMwIDEwMDY0NAotLS0gYS9kb2N1bWVudGF0aW9uL2NvbW1vbl9jb250cm9scworKysgYi9kb2N1bWVudGF0aW9uL2NvbW1vbl9jb250cm9scwpAQCAtMTk5LDcgKzE5OSw3IEBACiAgICAgICAtIEJhc2ljIGZ1bmN0aW9uYWxpdHkgaXMgYWxtb3N0IGRvbmUuIChkbGwgdmVyc2lvbiA0LjApCiAKICAgTm90ZXM6Ci0gICAgICBCaXRtYXBzIGFyZSBub3QgY29ycmVjdGx5IGRpc3BsYXllZC4KKyAgICAgIC0gQml0bWFwcyBhcmUgbm90IGNvcnJlY3RseSBkaXNwbGF5ZWQuCiAKIAogMy4xOSBUb29sdGlwIENvbnRyb2wKQEAgLTIxMiw3ICsyMTIsNiBAQAogCiAgIE5vdGVzOgogICAgICAgLSBVbmljb2RlIHN1cHBvcnQgaXMgc3RpbGwgbWlzc2luZy4KLSAgICAgIC0gTm8gc3ViY2xhc3NpbmcuCiAKIAogMy4yMCBUcmFja2JhciBDb250cm9sCkBAIC0yMzYsOSArMjM1LDYgQEAKICAgU3RhdHVzOgogICAgICAgLSBEdW1teSBjb250cm9sLiBObyBmdW5jdGlvbmFsaXR5LgogCi0gIE5vdGVzOgotICAgICAgQXV0aG9yIG5lZWRlZCEhIEFueSB2b2x1bnRlZXJzPz8KLQogCiAzLjIyIFVwZG93biBDb250cm9sCiAtLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC0yNzAsNyArMjY2LDcgQEAKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiAgIFRoZXJlIGFyZSBxdWl0ZSBhIGxvdCBvZiB1bmRvY3VtZW50ZWQgZnVuY3Rpb25zIGxpa2U6Ci0gICAgIC0gRFNBIChEeW5uYW1pYyBTdHJpbmcgQXJyYXk/KSBmdW5jdGlvbnMuCisgICAgIC0gRFNBIChEeW5uYW1pYyBTdHJ1Y3R1cmUgQXJyYXkpIGZ1bmN0aW9ucy4KICAgICAgLSBEUEEgKER5bW5hbWljIFBvaW50ZXIgQXJyYXk/KSBmdW5jdGlvbnMuCiAgICAgIC0gTVJVICgiTW9zdCBSZWNlbnRseSBVc2VkIiBMaXN0KSBmdW5jdGlvbnMuCiAgICAgIC0gb3RoZXIgdW5rbm93biBmdW5jdGlvbnMuCkBAIC0yNzgsMTIgKzI3NCwxMyBAQAogICBIYXZlIGEgbG9vayBhdCByZWxheTMyL2NvbWN0bDMyLnNwZWMuCiAKIAotNS4xIER5bW5hbWljIFN0cmluZyBBcnJheXMgPz8/IChEU0EpCis1LjEgRHltbmFtaWMgU3RydWN0dXJlIEFycmF5cyAoRFNBKQogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIE1vc3Qgb2YgdGhlIERTQSBmdW5jdGlvbnMgYXJlIGltcGxlbWVudGVkLiBJIHVzZWQgVEFTS01BTi5FWEUgdG8gd3JpdGUgdGhlbS4KICAgU2luY2UgVEFTS01BTi5FWEUgZG9lc24ndCBiYWlsIG91dCBvciBjcmFzaCBJIHRoaW5rIEkndmUgZG9uZSBpdCByaWdodC4KIAogICBIYXZlIGEgbG9vayBhdCB0aGUgc291cmNlIGNvZGUgdG8gZ2V0IG1vcmUgaW5mb3JtYXRpb24uCisKICAgRnVydGhlciBkb2N1bWVudGF0aW9uIHdpbGwgYmUgd3JpdHRlbi4uLgogCiAKQEAgLTI5OCwxNiArMjk1LDMyIEBACiAgIEZ1cnRoZXIgZG9jdW1lbnRhdGlvbiB3aWxsIGJlIHdyaXR0ZW4uLi4KIAogCi01LjMgTWVudUhlbHAKKzUuMyAiTW9zdCBSZWNlbnRseSBVc2VkIiAtIExpc3QgKE1SVSkKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgQ3VycmVudGx5IG5vIGluZm9ybWF0aW9uIGF2YWlsYWJsZSEKKworCis1LjQgTWVudUhlbHAKIC0tLS0tLS0tLS0tLQogICBIYXMgdG8gYmUgd3JpdHRlbi4uLgogCiAKLTUuNCBHZXRFZmZlY3RpdmVDbGllbnRSZWN0Cis1LjUgR2V0RWZmZWN0aXZlQ2xpZW50UmVjdAogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgSGFzIHRvIGJlIHdyaXR0ZW4uLi4KIAogCis1LjYgU2hvd0hpZGVNZW51Q3RsCistLS0tLS0tLS0tLS0tLS0tLS0tCisgIFRoZSBvZmZpY2lhbCBkb2N1bWVudGF0aW9uIHByb3ZpZGVkIGJ5IE1TIGlzIGluY29tcGxldGUuCisKKyAgbHBJbmZvOgorICAuLi4KKyAgQm90aCB2YWx1ZXMgb2YgdGhlIGZpcnN0IHBhaXIgbXVzdCBiZSB0aGUgaGFuZGxlIHRvIHRoZSBhcHBsaWNhdGlvbnMgbWFpbgorICBtZW51LgorICAuLi4KKworCiA2LiBFcGlsb2d1ZQogLS0tLS0tLS0tLS0KICAgWW91IHNlZSwgbXVjaCB3b3JrIGhhcyBzdGlsbCB0byBiZSBkb25lLiBJZiB5b3UgYXJlIGludGVyZXN0ZWQgaW4gd3JpdGluZwpkaWZmIC0tZ2l0IGEvZG9jdW1lbnRhdGlvbi9maWxlaGFuZGxlcyBiL2RvY3VtZW50YXRpb24vZmlsZWhhbmRsZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDAwMmU0YQotLS0gL2Rldi9udWxsCisrKyBiL2RvY3VtZW50YXRpb24vZmlsZWhhbmRsZXMKQEAgLTAsMCArMSwyNiBAQAorRE9TIHRyZWF0cyB0aGUgZmlyc3QgNSBmaWxlIGhhbmRsZXMgYXMgc3BlY2lhbCBjYXNlcy4gIFRoZXkgbWFwIGRpcmVjdGx5Cit0byBzdGRpbiwgc3Rkb3V0LCBzdGRlcnIsIHN0ZGF1eCBhbmQgc3RkcHJuLiAgV2luZG93cyAxNiBpbmhlcml0cyB0aGlzCitiZWhhdm9pciwgYW5kIGluIGZhY3QsIHdpbjE2IGhhbmRsZXMgYXJlIGludGVyY2hhbmdhYmxlIHdpdGggRE9TIGhhbmRsZXMuCitTb21lIG5hc3R5IHdpbmRvd3MgcHJvZ3JhbXMgZXZlbiBkbyB0aGlzIQorCitXaW5kb3dzMzIgaXNzdWVzIGZpbGUgaGFuZGxlcyBzdGFydGluZyBmcm9tIDEsIG9uIHRoZSBncm91bmRzIHRoYXQKK21vc3QgR1VJIHByb2Nlc3NlcyBkb24ndCBuZWVkIGEgc3RkaW4sIG91dCwgZXRjLgorCitUaGUgd2luZSBoYW5kbGUgY29kZSBpcyBpbXBsZW1lbnRlZCBpbiB0aGUgV2luMzIgc3R5bGUsIGFuZCB0aGUgV2luMTYKK2Z1bmN0aW9ucyB1c2UgdHdvIG1hY3JvcyB0byBjb252ZXJ0IHRvIGFuZCBmcm9tIHRoZSB0d28gdHlwZXMuCisKK1RoZSBtYWNyb3MgYXJlIGRlZmluZWQgaW4gZmlsZS5oIGFzIGZvbGxvd3MuOgorI2RlZmluZSBIRklMRTE2X1RPX0hGSUxFMzIoaGFuZGxlKSBcCisoKChoYW5kbGUpPT0wKSA/IEdldFN0ZEhhbmRsZShTVERfSU5QVVRfSEFORExFKSA6IFwKKyAoKGhhbmRsZSk9PTEpID8gR2V0U3RkSGFuZGxlKFNURF9PVVRQVVRfSEFORExFKSA6IFwKKyAoKGhhbmRsZSk9PTIpID8gR2V0U3RkSGFuZGxlKFNURF9FUlJPUl9IQU5ETEUpIDogXAorIChoYW5kbGUpLTUpCisKKyNkZWZpbmUgSEZJTEUzMl9UT19IRklMRTE2KGhhbmRsZSkgKHsgSEZJTEUzMiBobmQ9aGFuZGxlOyBcCisgICAgICAoKGhuZD09SEZJTEVfRVJST1IzMikgPyBIRklMRV9FUlJPUjE2IDogXAorICAgICAgIChIRklMRTE2KWhuZCs1KTsgfSkKKworV0FSTklORzogYmUgY2FyZWZ1bCBub3QgdG8gdXNlIHRoZSBtYWNybyBIRklMRTE2X1RPX0hGSUxFMzIgb24KK2Z1bmN0aW9ucyB3aXRoIHNpZGUtZWZmZWN0cywgYXMgaXQgd2lsbCBjYXVzZSB0aGVtIHRvIGJlIGV2YWx1YXRlZAorc2V2ZXJhbCB0aW1lcy4gIFRoaXMgY291bGQgYmUgY29uc2lkZXJlZCBhIGJ1ZywgYnV0IHRoZSB1c2Ugb2YgdGhpcworbWFjcm8gaXMgbGltaXRlZCBlbm91Z2ggbm90IHRvIG5lZWQgYSByZXdyaXRlLgpkaWZmIC0tZ2l0IGEvZG9jdW1lbnRhdGlvbi9pbnRlcm5hbC1kbGwgYi9kb2N1bWVudGF0aW9uL2ludGVybmFsLWRsbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOTBiNzBiCi0tLSAvZGV2L251bGwKKysrIGIvZG9jdW1lbnRhdGlvbi9pbnRlcm5hbC1kbGwKQEAgLTAsMCArMSw3NSBAQAorVGhpcyBkb2N1bWVudCBkZXNjcmliZXMgc29tZSBwb2ludHMgeW91IHNob3VsZCBrbm93IHdoZW4geW91IGFyZSBnb2luZyB0bworaW1wbGVtZW50IHRoZSBpbnRlcm5hbCBjb3VudGVycGFydHMgdG8gZXh0ZXJuYWwgRExMJ3MuIE9ubHkgMzIgIGJpdCBETEwncworYXJlIGNvbnNpZGVyZWQuCisKKzEuIFRoZSBMaWJNYWluIGZ1bmN0aW9uCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorVGhlc2UgYXJlIHRoZSB3YXkgdG8gZG8gc29tZSBpbml0aWFsaXNpbmcgd2hlbiBhIHByb2Nlc3Mgb3IgdGhyZWFkIGlzIGF0dGFjaGVkCit0byB0aGUgZGxsLiBUaGUgZnVuY3Rpb24gbmFtZSBpcyB0YWtlbiBmcm9tIGEgKi5zcGVjIGZpbGUgbGluZToKKworaW5pdCAgICBZb3VyRnVuY3Rpb25OYW1lCisKK3RoZSB5b3UgaGF2ZSB0byBpbXBsZW1lbnQgdGhlIGZ1bmN0aW9uOgorCisKK0JPT0wzMiBXSU5BUEkgWW91ckxpYk1haW4oSElOU1RBTkNFMzIgaGluc3RETEwsCisJCQkgRFdPUkQgZmR3UmVhc29uLCBMUFZPSUQgbHB2UmVzZXJ2ZWQpCit7IGlmIChmZHdSZWFzb249PURMTF9QUk9DRVNTX0FUVEFDSCkKKyAgeyAuLi4KKyAgfSAKKyAgLi4uLgorfQorCisKKzIuIFVzaW5nIGZ1bmN0aW9ucyBmcm9tIG90aGVyIGJ1aWxkLWluIERMTCdzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorVGhlIHByb2JsZW0gaGVyZSBpcywgdGhhdCB5b3UgY2FuJ3Qga25vdyBpZiB5b3UgaGF2ZSB0byBjYWxsIHRoZSBmdW5jdGlvbiBmcm9tCit0aGUgaW50ZXJuYWwgb3IgdGhlIGV4dGVybmFsIERMTC4gSWYgeW91IGp1c3QgY2FsbCB0aGUgZnVuY3Rpb24geW91IHdpbGwgZ2V0Cit0aGUgaW50ZXJuYWwgaW1wbGVtZW50YXRpb24uIElmIHRoZSBleHRlcm5hbCBETEwgaXMgbG9hZGVkIHRoZSBleGVjdXRlZCBwcm9ncmFtCit3aWxsIHVzZSB0aGUgZXh0ZXJuYWwgYW5kIHlvdSB0aGUgaW50ZXJuYWwgRExMLiAKK1doZW4geW91IC1hcyBleGFtcGxlLSBmaWxsIGEgaWNvbmxpc3QgcGxhY2VkIGluIHRoZSBpbnRlcm5hbCBETEwgdGhlCithcHBsaWNhdGlvbiB3b250IGdldCB0aGUgaWNvbnMgZnJvbSB0aGUgZXh0ZXJuYWwgRExMLgorCitUbyBnbyBhcm91bmQgdGhpcyB5b3UgaGF2ZSB0byBjYWxsIHRoZSBmdW5jdGlvbnMgb3ZlciBwb2ludGVyLgorCisvKiBkZWZpbml0aW9uIG9mIHRoZSBwb2ludGVyIHR5cGUqLwordm9pZCAoQ0FMTEJBQ0sqIHBETExJbml0Q29tY3RsKSgpOworCisvKiBnZXR0aW5nIHRoZSBmdW5jdGlvbiBhZGRyZXNzICB0aGlzIHNob3VsZCBiZSBkb25lIGluIHRoZQorIExpYk1haW4gZnVuY3Rpb24gd2hlbiBjYWxsZWQgd2l0aCBETExfUFJPQ0VTU19BVFRBQ0gqLworIAorQk9PTDMyIFdJTkFQSSBTaGVsbDMyTGliTWFpbihISU5TVEFOQ0UzMiBoaW5zdERMTCwgRFdPUkQgZmR3UmVhc29uLAorCQkJCQkJCSBMUFZPSUQgbHB2UmVzZXJ2ZWQpCit7IEhJTlNUQU5DRTMyIGhDb21jdGwzMjsKKyAgaWYgKGZkd1JlYXNvbj09RExMX1BST0NFU1NfQVRUQUNIKQorICB7IC8qIGxvYWQgdGhlIGV4dGVybmFsIC8gaW50ZXJuYWwgRExMKi8KKyAgICBoQ29tY3RsMzIgPSBMb2FkTGlicmFyeTMyQSgiQ09NQ1RMMzIuRExMIik7IAorICAgIGlmIChoQ29tY3RsMzIpCisgICAgeyAvKiBnZXQgdGhlIGZ1bmN0aW9uIHBvaW50ZXIgKi8KKyAgICAgIHBETExJbml0Q29tY3RsPUdldFByb2NBZGRyZXNzMzIoaENvbWN0bDMyLCJJbml0Q29tbW9uQ29udHJvbHNFeCIpOworCisJICAvKiBjaGVjayBpdCAqLworICAgICAgaWYgKHBETExJbml0Q29tY3RsKQorICAgICAgeyAvKiB1c2UgaXQgKi8KKyAgICAgICAgcERMTEluaXRDb21jdGwoKTsKKyAgICAgIH0KKyAgICAgIAorICAgICAgLyogZnJlZSB0aGUgRExMIC8gZGVjcmVhc2UgdGhlIHJlZiBjb3VudCAqLworICAgICAgRnJlZUxpYnJhcnkzMihoQ29tY3RsMzIpOworICAgIH0KKyAgICBlbHNlCisgICAgeyAvKiBkbyBzb21lIHBhbmljKi8KKyAgICAgIEVSUihzaGVsbCwiUCBBIE4gSSBDIGVycm9yIGdldHRpbmcgZnVuY3Rpb25wb2ludGVyc1xuIik7CisgICAgICBleGl0ICgxKTsKKyAgICB9CisgIH0KKyAuLi4uCisKKzMuIEdldHRpbmcgcmVzb3VyY2VzIGZyb20gYSAqLnJjIGZpbGUgbGlua2VkIHRvIHRoZSBETEwKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzwgSWYgeW91IGtub3cgaG93LCB3cml0ZSBzb21lIGxpbmVzPgorCisKKworLS0tLS0tLS0tLQorPGp1ZXJnZW4uc2NobWllZEBtZXRyb25ldC5kZT4KZGlmZiAtLWdpdCBhL2RvY3VtZW50YXRpb24vc2hlbGwzMiBiL2RvY3VtZW50YXRpb24vc2hlbGwzMgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZmNiMmVmCi0tLSAvZGV2L251bGwKKysrIGIvZG9jdW1lbnRhdGlvbi9zaGVsbDMyCkBAIC0wLDAgKzEsNzEgQEAKKwkJCQlTSEVMTDMyCisJCQlkZXZlbG9wbWVudCBzdGF0dXMKKworICAgICAgQXV0aG9yIG5lZWRlZCEhIEFueSB2b2x1bnRlZXJzPz8gCisgICAgICBtYWlsIHRvIDxqdWVyZ2VuLnNjaG1pZWRAbWV0cm9uZXQuZGU+CisgICAgICAgICAgICAKKzEuIEludHJvZHVjdGlvbgorLS0tLS0tLS0tLS0tLS0tCitBbGwgcGFydHMgb2YgdGhpcyBETEwgYXJlIGN1cnJlbnRseSB1bmRlciBkZXZlbG9wbWVudC4gQWJvdXQgYSB0aGlyZCBvZgorYmFzZSBmdW5jdGlvbmFsaXR5IGlzIHJvdWdobHkgaW4gcGxhY2UuIFRoZSBtaXNzaW5nIHBhcnRzIGFyZSB0aGUgaWNvbgorKHNoZWxsIGljb24gY2FjaGUpIGhhbmRsaW5nIGFuZCB0aGUgZGlhbG9ncyBwcm92aWRlZCBmcm9tIHRoZSBkbGwgbGlrZQordGhlIGZpbGUgY29weSBzdGF0dXMgd2luZG93LgorCitUaGUgYmFzaXMgY29tZXMgZnJvbSBNYXJjdXMgTWVpc3NuZXIgYW5kIEkgPGp1ZXJnZW4uc2NobWllZEBtZXRyb25ldC5kZT4KK2ltcGxlbWVudGVkIHRoZSBjbGFzc2VzIGFuZCBmaWxsZWQgZnVuY3Rpb24gc3R1YnMuCisgICAgICAgICAgICAKKzIuIEdlbmVyYWwgSW5mb3JtYXRpb24KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworMy4gRnVuY3Rpb25zCistLS0tLS0tLS0tLS0KKworNC4gQ2xhc3NlcworLS0tLS0tLS0tLQorCis0LjEgSUNvbnRleHRNZW51CistLS0tLS0tLS0tLS0tLS0tCisgICAgU3RhdHVzOgorCS0gZGV2ZWxvcG1lbnQgc3RhcnRlZAorIAorNC4yIElTaGVsbEV4dEluaXQKKy0tLS0tLS0tLS0tLS0tLS0tCisgb25seSBpbnRlcmZhY2UgZGVmaW5pdGlvbgorIAorNC4zIElFbnVtSURMaXN0CistLS0tLS0tLS0tLS0tLS0KKyAgU3RhdHVzOgorICAgICAgLSBBbG1vc3QgZmluaXNoZWQuCisKKyAKKzQuNC5JU2hlbGxGb2xkZXIKKy0tLS0tLS0tLS0tLS0tLS0KKyAgU3RhdHVzOgorICAgICAgLSByb3VnaGx5IGZpbmlzaGVkLgorCisKKzQuNSBJU2hlbGxWaWV3CistLS0tLS0tLS0tLS0tLQorICBTdGF0dXM6CisgICAgICAtIHVuZGVyIGRldmVsb3BtZW50CisKKworNC42IElTaGVsbEJyb3dzZXIKKy0tLS0tLS0tLS0tLS0tLS0tCisgIFN0YXR1czoKKwktIG9ubHkgaW50ZXJmYWNlIGRlZmluaXRpb24KKwkgIGl0J3MgaW1wbGVtZW50ZWQgYnkgdGhlIGV4cGxvcmVyCisJICBkb24ndCBrbm93IGlmIHdlIG5lZWQgaXQgCisgCis0LjcuIFBJREwgTWFuYWdlcgorLS0tLS0tLS0tLS0tLS0tLS0KKyAgU3RhdHVzOgorCS0gcm91Z2hseSBjb21wbGV0ZSB3aWxsIGJlIG1pZ3JhdGVkIHRvIGEgc2V0IG9mIGZ1bmN0aW9ucyBiZWNhdXNlIGl0J3MKKyAgICBub3QgaG9sZGluZyBhbnkgaW5zdGFuY2UgZGF0YSwKKworCis1LiBTdHJ1Y3R1cmVzCistLS0tLS0tLS0tLS0tCisKKzUuMSBQSURMCistLS0tLS0tLQpkaWZmIC0tZ2l0IGEvZmlsZXMvZG9zX2ZzLmMgYi9maWxlcy9kb3NfZnMuYwppbmRleCBlNjFlOGU3Li5mZDE2OGM0IDEwMDY0NAotLS0gYS9maWxlcy9kb3NfZnMuYworKysgYi9maWxlcy9kb3NfZnMuYwpAQCAtMjQsNiArMjQsNyBAQAogI2luY2x1ZGUgImZpbGUuaCIKICNpbmNsdWRlICJoZWFwLmgiCiAjaW5jbHVkZSAibXNkb3MuaCIKKyNpbmNsdWRlICJzeXNsZXZlbC5oIgogI2luY2x1ZGUgImRlYnVnLmgiCiAKIC8qIERlZmluZSB0aGUgVkZBVCBpb2N0bCB0byBnZXQgYm90aCBzaG9ydCBhbmQgbG9uZyBmaWxlIG5hbWVzICovCkBAIC03NCwxNiArNzUsNiBAQAogQllURSBET1NfRXJyb3JBY3Rpb247CiBCWVRFIERPU19FcnJvckxvY3VzOwogCi0vKiBJbmZvIHN0cnVjdHVyZSBmb3IgRmluZEZpcnN0RmlsZSBoYW5kbGUgKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgTFBTVFIgcGF0aDsKLSAgICBMUFNUUiBtYXNrOwotICAgIGludCAgIGRyaXZlOwotICAgIGludCAgIHNraXA7Ci19IEZJTkRfRklSU1RfSU5GTzsKLQotCiAvKiBEaXJlY3RvcnkgaW5mbyBmb3IgRE9TRlNfUmVhZERpciAqLwogdHlwZWRlZiBzdHJ1Y3QKIHsKQEAgLTk1LDYgKzg2LDE5IEBACiAjZW5kaWYKIH0gRE9TX0RJUjsKIAorLyogSW5mbyBzdHJ1Y3R1cmUgZm9yIEZpbmRGaXJzdEZpbGUgaGFuZGxlICovCit0eXBlZGVmIHN0cnVjdAoreworICAgIExQU1RSIHBhdGg7CisgICAgTFBTVFIgbG9uZ19tYXNrOworICAgIExQU1RSIHNob3J0X21hc2s7CisgICAgQllURSAgYXR0cjsKKyAgICBpbnQgICBkcml2ZTsKKyAgICBpbnQgICBjdXJfcG9zOworICAgIERPU19ESVIgKmRpcjsKK30gRklORF9GSVJTVF9JTkZPOworCisKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgRE9TRlNfVmFsaWRET1NOYW1lCkBAIC0xMDE2LDMzICsxMDIwLDIzIEBACiAgICAgcmV0dXJuIHJldDsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBET1NGU19GaW5kTmV4dAotICoKLSAqIEZpbmQgdGhlIG5leHQgbWF0Y2hpbmcgZmlsZS4gUmV0dXJuIHRoZSBudW1iZXIgb2YgZW50cmllcyByZWFkIHRvIGZpbmQKLSAqIHRoZSBtYXRjaGluZyBvbmUsIG9yIDAgaWYgbm8gbW9yZSBlbnRyaWVzLgotICogJ3Nob3J0X21hc2snIGlzIHRoZSA4LjMgbWFzayAoaW4gRkNCIGZvcm1hdCksICdsb25nX21hc2snIGlzIHRoZSBsb25nCi0gKiBmaWxlIG5hbWUgbWFzay4gRWl0aGVyIG9yIGJvdGggY2FuIGJlIE5VTEwuCisgKiAgICAgICAgICAgRE9TRlNfRmluZE5leHRFeAogICovCi1pbnQgRE9TRlNfRmluZE5leHQoIGNvbnN0IGNoYXIgKnBhdGgsIGNvbnN0IGNoYXIgKnNob3J0X21hc2ssCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmxvbmdfbWFzaywgaW50IGRyaXZlLCBCWVRFIGF0dHIsCi0gICAgICAgICAgICAgICAgICAgIGludCBza2lwLCBXSU4zMl9GSU5EX0RBVEEzMkEgKmVudHJ5ICkKK3N0YXRpYyBpbnQgRE9TRlNfRmluZE5leHRFeCggRklORF9GSVJTVF9JTkZPICppbmZvLCBXSU4zMl9GSU5EX0RBVEEzMkEgKmVudHJ5ICkKIHsKLSAgICBzdGF0aWMgRE9TX0RJUiAqZGlyID0gTlVMTDsKLSAgICBpbnQgY291bnQgPSAwOwotICAgIHN0YXRpYyBjaGFyIGJ1ZmZlcltNQVhfUEFUSE5BTUVfTEVOXTsKLSAgICBzdGF0aWMgaW50IGN1cl9wb3MgPSAwOwotICAgIHN0YXRpYyBpbnQgZHJpdmVfcm9vdCA9IDA7Ci0gICAgY2hhciAqcDsKLSAgICBjaGFyIGRvc19uYW1lWzEzXTsKKyAgICBCWVRFIGF0dHIgPSBpbmZvLT5hdHRyIHwgRkFfVU5VU0VEIHwgRkFfQVJDSElWRSB8IEZBX1JET05MWTsKKyAgICBVSU5UMzIgZmxhZ3MgPSBEUklWRV9HZXRGbGFncyggaW5mby0+ZHJpdmUgKTsKKyAgICBjaGFyICpwLCBidWZmZXJbTUFYX1BBVEhOQU1FX0xFTl07CisgICAgY29uc3QgY2hhciAqZHJpdmVfcGF0aDsKKyAgICBpbnQgZHJpdmVfcm9vdDsKICAgICBMUENTVFIgbG9uZ19uYW1lLCBzaG9ydF9uYW1lOwotICAgIFVJTlQzMiBmbGFnczsKLSAgICBCWV9IQU5ETEVfRklMRV9JTkZPUk1BVElPTiBpbmZvOworICAgIEJZX0hBTkRMRV9GSUxFX0lORk9STUFUSU9OIGZpbGVpbmZvOworICAgIGNoYXIgZG9zX25hbWVbMTNdOwogCi0gICAgaWYgKChhdHRyICYgfihGQV9VTlVTRUQgfCBGQV9BUkNISVZFIHwgRkFfUkRPTkxZKSkgPT0gRkFfTEFCRUwpCisgICAgaWYgKChpbmZvLT5hdHRyICYgfihGQV9VTlVTRUQgfCBGQV9BUkNISVZFIHwgRkFfUkRPTkxZKSkgPT0gRkFfTEFCRUwpCiAgICAgewotICAgICAgICBpZiAoc2tpcCkgcmV0dXJuIDA7CisgICAgICAgIGlmIChpbmZvLT5jdXJfcG9zKSByZXR1cm4gMDsKICAgICAgICAgZW50cnktPmR3RmlsZUF0dHJpYnV0ZXMgID0gRklMRV9BVFRSSUJVVEVfTEFCRUw7CiAgICAgICAgIERPU0ZTX1VuaXhUaW1lVG9GaWxlVGltZSggKHRpbWVfdCkwLCAmZW50cnktPmZ0Q3JlYXRpb25UaW1lLCAwICk7CiAgICAgICAgIERPU0ZTX1VuaXhUaW1lVG9GaWxlVGltZSggKHRpbWVfdCkwLCAmZW50cnktPmZ0TGFzdEFjY2Vzc1RpbWUsIDAgKTsKQEAgLTEwNTEsMzcgKzEwNDUsMjMgQEAKICAgICAgICAgZW50cnktPm5GaWxlU2l6ZUxvdyAgICAgID0gMDsKICAgICAgICAgZW50cnktPmR3UmVzZXJ2ZWQwICAgICAgID0gMDsKICAgICAgICAgZW50cnktPmR3UmVzZXJ2ZWQxICAgICAgID0gMDsKLSAgICAgICAgRE9TRlNfVG9Eb3NEVEFGb3JtYXQoIERSSVZFX0dldExhYmVsKCBkcml2ZSApLCBlbnRyeS0+Y0ZpbGVOYW1lICk7Ci0gICAgICAgIHN0cmNweSggZW50cnktPmNBbHRlcm5hdGVGaWxlTmFtZSwgZW50cnktPmNGaWxlTmFtZSApOworICAgICAgICBET1NGU19Ub0Rvc0RUQUZvcm1hdCggRFJJVkVfR2V0TGFiZWwoIGluZm8tPmRyaXZlICksIGVudHJ5LT5jRmlsZU5hbWUgKTsKKyAgICAgICAgc3RyY3B5KCBlbnRyeS0+Y0FsdGVybmF0ZUZpbGVOYW1lLCBlbnRyeS0+Y0ZpbGVOYW1lICk7IAorICAgICAgICBpbmZvLT5jdXJfcG9zKys7CiAgICAgICAgIHJldHVybiAxOwogICAgIH0KIAotICAgIC8qIENoZWNrIHRoZSBjYWNoZWQgZGlyZWN0b3J5ICovCi0gICAgaWYgKGRpciAmJiAhc3RyY21wKCBidWZmZXIsIHBhdGggKSAmJiAoY3VyX3BvcyA8PSBza2lwKSkgc2tpcCAtPSBjdXJfcG9zOwotICAgIGVsc2UgIC8qIE5vdCBpbiB0aGUgY2FjaGUsIG9wZW4gaXQgYW5ldyAqLwotICAgIHsKLSAgICAgICAgY29uc3QgY2hhciAqZHJpdmVfcGF0aDsKLSAgICAgICAgVFJBQ0UoZG9zZnMsICJjYWNoZSBtaXNzLCBwYXRoPSVzIHNraXA9JWQgYnVmPSVzIGN1cj0lZFxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgcGF0aCwgc2tpcCwgYnVmZmVyLCBjdXJfcG9zICk7Ci0gICAgICAgIGN1cl9wb3MgPSBza2lwOwotICAgICAgICBpZiAoZGlyKSBET1NGU19DbG9zZURpcihkaXIpOwotICAgICAgICBpZiAoISpwYXRoKSBwYXRoID0gIi8iOwotICAgICAgICBpZiAoIShkaXIgPSBET1NGU19PcGVuRGlyKHBhdGgpKSkgcmV0dXJuIDA7Ci0gICAgICAgIGRyaXZlX3BhdGggPSBwYXRoICsgc3RybGVuKERSSVZFX0dldFJvb3QoZHJpdmUpKTsKLSAgICAgICAgd2hpbGUgKCgqZHJpdmVfcGF0aCA9PSAnLycpIHx8ICgqZHJpdmVfcGF0aCA9PSAnXFwnKSkgZHJpdmVfcGF0aCsrOwotICAgICAgICBkcml2ZV9yb290ID0gISpkcml2ZV9wYXRoOwotICAgICAgICBUUkFDRShkb3NmcywgImRyaXZlX3Jvb3QgPSAlZFxuIiwgZHJpdmVfcm9vdCk7Ci0gICAgICAgIGxzdHJjcHluMzJBKCBidWZmZXIsIHBhdGgsIHNpemVvZihidWZmZXIpIC0gMSApOwotICAgIH0KKyAgICBkcml2ZV9wYXRoID0gaW5mby0+cGF0aCArIHN0cmxlbihEUklWRV9HZXRSb290KCBpbmZvLT5kcml2ZSApKTsKKyAgICB3aGlsZSAoKCpkcml2ZV9wYXRoID09ICcvJykgfHwgKCpkcml2ZV9wYXRoID09ICdcXCcpKSBkcml2ZV9wYXRoKys7CisgICAgZHJpdmVfcm9vdCA9ICEqZHJpdmVfcGF0aDsKKworICAgIGxzdHJjcHluMzJBKCBidWZmZXIsIGluZm8tPnBhdGgsIHNpemVvZihidWZmZXIpIC0gMSApOwogICAgIHN0cmNhdCggYnVmZmVyLCAiLyIgKTsKICAgICBwID0gYnVmZmVyICsgc3RybGVuKGJ1ZmZlcik7Ci0gICAgYXR0ciB8PSBGQV9VTlVTRUQgfCBGQV9BUkNISVZFIHwgRkFfUkRPTkxZOwotICAgIGZsYWdzID0gRFJJVkVfR2V0RmxhZ3MoIGRyaXZlICk7CiAKLSAgICB3aGlsZSAoRE9TRlNfUmVhZERpciggZGlyLCAmbG9uZ19uYW1lLCAmc2hvcnRfbmFtZSApKQorICAgIHdoaWxlIChET1NGU19SZWFkRGlyKCBpbmZvLT5kaXIsICZsb25nX25hbWUsICZzaG9ydF9uYW1lICkpCiAgICAgewotICAgICAgICBpZiAoc2tpcC0tID4gMCkgY29udGludWU7Ci0gICAgICAgIGNvdW50Kys7CisgICAgICAgIGluZm8tPmN1cl9wb3MrKzsKIAogICAgICAgICAvKiBEb24ndCByZXR1cm4gJy4nIGFuZCAnLi4nIGluIHRoZSByb290IG9mIHRoZSBkcml2ZSAqLwogICAgICAgICBpZiAoZHJpdmVfcm9vdCAmJiAobG9uZ19uYW1lWzBdID09ICcuJykgJiYKQEAgLTEwOTAsMTUgKzEwNzAsMTUgQEAKIAogICAgICAgICAvKiBDaGVjayB0aGUgbG9uZyBtYXNrICovCiAKLSAgICAgICAgaWYgKGxvbmdfbWFzaykKKyAgICAgICAgaWYgKGluZm8tPmxvbmdfbWFzaykKICAgICAgICAgewotICAgICAgICAgICAgaWYgKCFET1NGU19NYXRjaExvbmcoIGxvbmdfbWFzaywgbG9uZ19uYW1lLAorICAgICAgICAgICAgaWYgKCFET1NGU19NYXRjaExvbmcoIGluZm8tPmxvbmdfbWFzaywgbG9uZ19uYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzICYgRFJJVkVfQ0FTRV9TRU5TSVRJVkUgKSkgY29udGludWU7CiAgICAgICAgIH0KIAogICAgICAgICAvKiBDaGVjayB0aGUgc2hvcnQgbWFzayAqLwogCi0gICAgICAgIGlmIChzaG9ydF9tYXNrKQorICAgICAgICBpZiAoaW5mby0+c2hvcnRfbWFzaykKICAgICAgICAgewogICAgICAgICAgICAgaWYgKCFzaG9ydF9uYW1lKQogICAgICAgICAgICAgewpAQCAtMTEwNiwyNyArMTA4NiwyNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICEoZmxhZ3MgJiBEUklWRV9DQVNFX1NFTlNJVElWRSkgKTsKICAgICAgICAgICAgICAgICBzaG9ydF9uYW1lID0gZG9zX25hbWU7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoIURPU0ZTX01hdGNoU2hvcnQoIHNob3J0X21hc2ssIHNob3J0X25hbWUgKSkgY29udGludWU7CisgICAgICAgICAgICBpZiAoIURPU0ZTX01hdGNoU2hvcnQoIGluZm8tPnNob3J0X21hc2ssIHNob3J0X25hbWUgKSkgY29udGludWU7CiAgICAgICAgIH0KIAogICAgICAgICAvKiBDaGVjayB0aGUgZmlsZSBhdHRyaWJ1dGVzICovCiAKICAgICAgICAgbHN0cmNweW4zMkEoIHAsIGxvbmdfbmFtZSwgc2l6ZW9mKGJ1ZmZlcikgLSAoaW50KShwIC0gYnVmZmVyKSApOwotICAgICAgICBpZiAoIUZJTEVfU3RhdCggYnVmZmVyLCAmaW5mbyApKQorICAgICAgICBpZiAoIUZJTEVfU3RhdCggYnVmZmVyLCAmZmlsZWluZm8gKSkKICAgICAgICAgewogICAgICAgICAgICAgV0FSTihkb3NmcywgImNhbid0IHN0YXQgJXNcbiIsIGJ1ZmZlcik7CiAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQotICAgICAgICBpZiAoaW5mby5kd0ZpbGVBdHRyaWJ1dGVzICYgfmF0dHIpIGNvbnRpbnVlOworICAgICAgICBpZiAoZmlsZWluZm8uZHdGaWxlQXR0cmlidXRlcyAmIH5hdHRyKSBjb250aW51ZTsKIAogICAgICAgICAvKiBXZSBub3cgaGF2ZSBhIG1hdGNoaW5nIGVudHJ5OyBmaWxsIHRoZSByZXN1bHQgYW5kIHJldHVybiAqLwogCi0gICAgICAgIGVudHJ5LT5kd0ZpbGVBdHRyaWJ1dGVzID0gaW5mby5kd0ZpbGVBdHRyaWJ1dGVzOwotICAgICAgICBlbnRyeS0+ZnRDcmVhdGlvblRpbWUgICA9IGluZm8uZnRDcmVhdGlvblRpbWU7Ci0gICAgICAgIGVudHJ5LT5mdExhc3RBY2Nlc3NUaW1lID0gaW5mby5mdExhc3RBY2Nlc3NUaW1lOwotICAgICAgICBlbnRyeS0+ZnRMYXN0V3JpdGVUaW1lICA9IGluZm8uZnRMYXN0V3JpdGVUaW1lOwotICAgICAgICBlbnRyeS0+bkZpbGVTaXplSGlnaCAgICA9IGluZm8ubkZpbGVTaXplSGlnaDsKLSAgICAgICAgZW50cnktPm5GaWxlU2l6ZUxvdyAgICAgPSBpbmZvLm5GaWxlU2l6ZUxvdzsKKyAgICAgICAgZW50cnktPmR3RmlsZUF0dHJpYnV0ZXMgPSBmaWxlaW5mby5kd0ZpbGVBdHRyaWJ1dGVzOworICAgICAgICBlbnRyeS0+ZnRDcmVhdGlvblRpbWUgICA9IGZpbGVpbmZvLmZ0Q3JlYXRpb25UaW1lOworICAgICAgICBlbnRyeS0+ZnRMYXN0QWNjZXNzVGltZSA9IGZpbGVpbmZvLmZ0TGFzdEFjY2Vzc1RpbWU7CisgICAgICAgIGVudHJ5LT5mdExhc3RXcml0ZVRpbWUgID0gZmlsZWluZm8uZnRMYXN0V3JpdGVUaW1lOworICAgICAgICBlbnRyeS0+bkZpbGVTaXplSGlnaCAgICA9IGZpbGVpbmZvLm5GaWxlU2l6ZUhpZ2g7CisgICAgICAgIGVudHJ5LT5uRmlsZVNpemVMb3cgICAgID0gZmlsZWluZm8ubkZpbGVTaXplTG93OwogCiAgICAgICAgIGlmIChzaG9ydF9uYW1lKQogICAgICAgICAgICAgRE9TRlNfVG9Eb3NEVEFGb3JtYXQoIHNob3J0X25hbWUsIGVudHJ5LT5jQWx0ZXJuYXRlRmlsZU5hbWUgKTsKQEAgLTExMzksMTUgKzExMTksNzUgQEAKICAgICAgICAgVFJBQ0UoZG9zZnMsICJyZXR1cm5pbmcgJXMgKCVzKSAlMDJseCAlbGRcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5LT5jRmlsZU5hbWUsIGVudHJ5LT5jQWx0ZXJuYXRlRmlsZU5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5LT5kd0ZpbGVBdHRyaWJ1dGVzLCBlbnRyeS0+bkZpbGVTaXplTG93ICk7Ci0gICAgICAgIGN1cl9wb3MgKz0gY291bnQ7Ci0gICAgICAgIHBbLTFdID0gJ1wwJzsgIC8qIFJlbW92ZSB0cmFpbGluZyBzbGFzaCBpbiBidWZmZXIgKi8KLSAgICAgICAgcmV0dXJuIGNvdW50OworICAgICAgICByZXR1cm4gMTsKICAgICB9Ci0gICAgRE9TRlNfQ2xvc2VEaXIoIGRpciApOwotICAgIGRpciA9IE5VTEw7CiAgICAgcmV0dXJuIDA7ICAvKiBFbmQgb2YgZGlyZWN0b3J5ICovCiB9CiAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIERPU0ZTX0ZpbmROZXh0CisgKgorICogRmluZCB0aGUgbmV4dCBtYXRjaGluZyBmaWxlLiBSZXR1cm4gdGhlIG51bWJlciBvZiBlbnRyaWVzIHJlYWQgdG8gZmluZAorICogdGhlIG1hdGNoaW5nIG9uZSwgb3IgMCBpZiBubyBtb3JlIGVudHJpZXMuCisgKiAnc2hvcnRfbWFzaycgaXMgdGhlIDguMyBtYXNrIChpbiBGQ0IgZm9ybWF0KSwgJ2xvbmdfbWFzaycgaXMgdGhlIGxvbmcKKyAqIGZpbGUgbmFtZSBtYXNrLiBFaXRoZXIgb3IgYm90aCBjYW4gYmUgTlVMTC4KKyAqCisgKiBOT1RFOiBUaGlzIGlzIHN1cHBvc2VkIHRvIGJlIG9ubHkgY2FsbGVkIGJ5IHRoZSBpbnQyMSBlbXVsYXRpb24KKyAqICAgICAgIHJvdXRpbmVzLiBUaHVzLCB3ZSBzaG91bGQgb3duIHRoZSBXaW4xNk11dGV4IGFueXdheS4KKyAqICAgICAgIE5ldmVydGhlbGVzcywgd2UgZXhwbGljaXRseSBlbnRlciBpdCB0byBlbnN1cmUgdGhlIHN0YXRpYworICogICAgICAgZGlyZWN0b3J5IGNhY2hlIGlzIHByb3RlY3RlZC4KKyAqLworaW50IERPU0ZTX0ZpbmROZXh0KCBjb25zdCBjaGFyICpwYXRoLCBjb25zdCBjaGFyICpzaG9ydF9tYXNrLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpsb25nX21hc2ssIGludCBkcml2ZSwgQllURSBhdHRyLAorICAgICAgICAgICAgICAgICAgICBpbnQgc2tpcCwgV0lOMzJfRklORF9EQVRBMzJBICplbnRyeSApCit7CisgICAgc3RhdGljIEZJTkRfRklSU1RfSU5GTyBpbmZvID0geyBOVUxMIH07CisgICAgTFBDU1RSIHNob3J0X25hbWUsIGxvbmdfbmFtZTsKKyAgICBpbnQgY291bnQ7CisKKyAgICBTWVNMRVZFTF9FbnRlcldpbjE2TG9jaygpOworCisgICAgLyogQ2hlY2sgdGhlIGNhY2hlZCBkaXJlY3RvcnkgKi8KKyAgICBpZiAoIShpbmZvLmRpciAmJiBpbmZvLnBhdGggPT0gcGF0aCAmJiBpbmZvLnNob3J0X21hc2sgPT0gc2hvcnRfbWFzaworICAgICAgICAgICAgICAgICAgICYmIGluZm8ubG9uZ19tYXNrID09IGxvbmdfbWFzayAmJiBpbmZvLmRyaXZlID09IGRyaXZlCisgICAgICAgICAgICAgICAgICAgJiYgaW5mby5hdHRyID09IGF0dHIgJiYgaW5mby5jdXJfcG9zIDw9IHNraXApKQorICAgIHsgIAorICAgICAgICAvKiBOb3QgaW4gdGhlIGNhY2hlLCBvcGVuIGl0IGFuZXcgKi8KKyAgICAgICAgaWYgKGluZm8uZGlyKSBET1NGU19DbG9zZURpciggaW5mby5kaXIgKTsKKworICAgICAgICBpbmZvLnBhdGggPSAoTFBTVFIpcGF0aDsKKyAgICAgICAgaW5mby5sb25nX21hc2sgPSAoTFBTVFIpbG9uZ19tYXNrOworICAgICAgICBpbmZvLnNob3J0X21hc2sgPSAoTFBTVFIpc2hvcnRfbWFzazsKKyAgICAgICAgaW5mby5hdHRyID0gYXR0cjsKKyAgICAgICAgaW5mby5kcml2ZSA9IGRyaXZlOworICAgICAgICBpbmZvLmN1cl9wb3MgPSAwOworICAgICAgICBpbmZvLmRpciA9IERPU0ZTX09wZW5EaXIoIGluZm8ucGF0aCApOworICAgIH0KKworICAgIC8qIFNraXAgdG8gZGVzaXJlZCBwb3NpdGlvbiAqLworICAgIHdoaWxlIChpbmZvLmN1cl9wb3MgPCBza2lwKQorICAgICAgICBpZiAoRE9TRlNfUmVhZERpciggaW5mby5kaXIsICZsb25nX25hbWUsICZzaG9ydF9uYW1lICkpCisgICAgICAgICAgICBpbmZvLmN1cl9wb3MrKzsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICBpZiAoaW5mby5jdXJfcG9zID09IHNraXAgJiYgRE9TRlNfRmluZE5leHRFeCggJmluZm8sIGVudHJ5ICkpCisgICAgICAgIGNvdW50ID0gaW5mby5jdXJfcG9zIC0gc2tpcDsKKyAgICBlbHNlCisgICAgICAgIGNvdW50ID0gMDsKKworICAgIGlmICghY291bnQpCisgICAgeworICAgICAgICBET1NGU19DbG9zZURpciggaW5mby5kaXIgKTsKKyAgICAgICAgbWVtc2V0KCAmaW5mbywgJ1wwJywgc2l6ZW9mKGluZm8pICk7CisgICAgfQorCisgICAgU1lTTEVWRUxfTGVhdmVXaW4xNkxvY2soKTsKKworICAgIHJldHVybiBjb3VudDsKK30KKworCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgRmluZEZpcnN0RmlsZTE2ICAgKEtFUk5FTC40MTMpCkBAIC0xMTY1LDExICsxMjA1LDE2IEBACiAgICAgICAgIHJldHVybiBJTlZBTElEX0hBTkRMRV9WQUxVRTE2OwogICAgIGluZm8gPSAoRklORF9GSVJTVF9JTkZPICopR2xvYmFsTG9jazE2KCBoYW5kbGUgKTsKICAgICBpbmZvLT5wYXRoID0gSEVBUF9zdHJkdXBBKCBTeXN0ZW1IZWFwLCAwLCBmdWxsX25hbWUubG9uZ19uYW1lICk7Ci0gICAgaW5mby0+bWFzayA9IHN0cnJjaHIoIGluZm8tPnBhdGgsICcvJyApOwotICAgICooaW5mby0+bWFzaysrKSA9ICdcMCc7CisgICAgaW5mby0+bG9uZ19tYXNrID0gc3RycmNociggaW5mby0+cGF0aCwgJy8nICk7CisgICAgKihpbmZvLT5sb25nX21hc2srKykgPSAnXDAnOworICAgIGluZm8tPnNob3J0X21hc2sgPSBOVUxMOworICAgIGluZm8tPmF0dHIgPSAweGZmOwogICAgIGlmIChwYXRoWzBdICYmIChwYXRoWzFdID09ICc6JykpIGluZm8tPmRyaXZlID0gdG91cHBlcigqcGF0aCkgLSAnQSc7CiAgICAgZWxzZSBpbmZvLT5kcml2ZSA9IERSSVZFX0dldEN1cnJlbnREcml2ZSgpOwotICAgIGluZm8tPnNraXAgPSAwOworICAgIGluZm8tPmN1cl9wb3MgPSAwOworCisgICAgaW5mby0+ZGlyID0gRE9TRlNfT3BlbkRpciggaW5mby0+cGF0aCApOworCiAgICAgR2xvYmFsVW5sb2NrMTYoIGhhbmRsZSApOwogICAgIGlmICghRmluZE5leHRGaWxlMTYoIGhhbmRsZSwgZGF0YSApKQogICAgIHsKQEAgLTEyMjIsNyArMTI2Nyw2IEBACiBCT09MMTYgV0lOQVBJIEZpbmROZXh0RmlsZTE2KCBIQU5ETEUxNiBoYW5kbGUsIFdJTjMyX0ZJTkRfREFUQTMyQSAqZGF0YSApCiB7CiAgICAgRklORF9GSVJTVF9JTkZPICppbmZvOwotICAgIGludCBjb3VudDsKIAogICAgIGlmICghKGluZm8gPSAoRklORF9GSVJTVF9JTkZPICopR2xvYmFsTG9jazE2KCBoYW5kbGUgKSkpCiAgICAgewpAQCAtMTIzMCwyMCArMTI3NCwxOSBAQAogICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQogICAgIEdsb2JhbFVubG9jazE2KCBoYW5kbGUgKTsKLSAgICBpZiAoIWluZm8tPnBhdGgpCisgICAgaWYgKCFpbmZvLT5wYXRoIHx8ICFpbmZvLT5kaXIpCiAgICAgewogICAgICAgICBET1NfRVJST1IoIEVSX05vTW9yZUZpbGVzLCBFQ19NZWRpYUVycm9yLCBTQV9BYm9ydCwgRUxfRGlzayApOwogICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQotICAgIGlmICghKGNvdW50ID0gRE9TRlNfRmluZE5leHQoIGluZm8tPnBhdGgsIE5VTEwsIGluZm8tPm1hc2ssIGluZm8tPmRyaXZlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmYsIGluZm8tPnNraXAsIGRhdGEgKSkpCisgICAgaWYgKCFET1NGU19GaW5kTmV4dEV4KCBpbmZvLCBkYXRhICkpCiAgICAgeworICAgICAgICBET1NGU19DbG9zZURpciggaW5mby0+ZGlyICk7IGluZm8tPmRpciA9IE5VTEw7CiAgICAgICAgIEhlYXBGcmVlKCBTeXN0ZW1IZWFwLCAwLCBpbmZvLT5wYXRoICk7Ci0gICAgICAgIGluZm8tPnBhdGggPSBpbmZvLT5tYXNrID0gTlVMTDsKKyAgICAgICAgaW5mby0+cGF0aCA9IGluZm8tPmxvbmdfbWFzayA9IE5VTEw7CiAgICAgICAgIERPU19FUlJPUiggRVJfTm9Nb3JlRmlsZXMsIEVDX01lZGlhRXJyb3IsIFNBX0Fib3J0LCBFTF9EaXNrICk7CiAgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9Ci0gICAgaW5mby0+c2tpcCArPSBjb3VudDsKICAgICByZXR1cm4gVFJVRTsKIH0KIApAQCAtMTI4OSw2ICsxMzMyLDcgQEAKICAgICAgICAgRE9TX0VSUk9SKCBFUl9JbnZhbGlkSGFuZGxlLCBFQ19Qcm9ncmFtRXJyb3IsIFNBX0Fib3J0LCBFTF9EaXNrICk7CiAgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CisgICAgaWYgKGluZm8tPmRpcikgRE9TRlNfQ2xvc2VEaXIoIGluZm8tPmRpciApOwogICAgIGlmIChpbmZvLT5wYXRoKSBIZWFwRnJlZSggU3lzdGVtSGVhcCwgMCwgaW5mby0+cGF0aCApOwogICAgIEdsb2JhbFVubG9jazE2KCBoYW5kbGUgKTsKICAgICBHbG9iYWxGcmVlMTYoIGhhbmRsZSApOwpkaWZmIC0tZ2l0IGEvZmlsZXMvZmlsZS5jIGIvZmlsZXMvZmlsZS5jCmluZGV4IDZhZThkNjAuLmEyYmQ1ZGQgMTAwNjQ0Ci0tLSBhL2ZpbGVzL2ZpbGUuYworKysgYi9maWxlcy9maWxlLmMKQEAgLTg3MSw3ICs4NzEsNyBAQAogICovCiBIRklMRTE2IFdJTkFQSSBPcGVuRmlsZTE2KCBMUENTVFIgbmFtZSwgT0ZTVFJVQ1QgKm9mcywgVUlOVDE2IG1vZGUgKQogewotICAgIHJldHVybiBGSUxFX0RvT3BlbkZpbGUoIG5hbWUsIG9mcywgbW9kZSwgRkFMU0UgKTsKKyAgICByZXR1cm4gSEZJTEUzMl9UT19IRklMRTE2KEZJTEVfRG9PcGVuRmlsZSggbmFtZSwgb2ZzLCBtb2RlLCBGQUxTRSApKTsKIH0KIAogCkBAIC04OTAsNyArODkwLDcgQEAKIEhGSUxFMTYgV0lOQVBJIF9sY2xvc2UxNiggSEZJTEUxNiBoRmlsZSApCiB7CiAgICAgVFJBQ0UoZmlsZSwgImhhbmRsZSAlZFxuIiwgaEZpbGUgKTsKLSAgICByZXR1cm4gQ2xvc2VIYW5kbGUoIGhGaWxlICkgPyAwIDogSEZJTEVfRVJST1IxNjsKKyAgICByZXR1cm4gQ2xvc2VIYW5kbGUoIEhGSUxFMTZfVE9fSEZJTEUzMiggaEZpbGUgKSAgKSA/IDAgOiBIRklMRV9FUlJPUjE2OwogfQogCiAKQEAgLTkxNyw3ICs5MTcsNyBAQAogICAgIC8qIFNvbWUgcHJvZ3JhbXMgcGFzcyBhIGNvdW50IGxhcmdlciB0aGFuIHRoZSBhbGxvY2F0ZWQgYnVmZmVyICovCiAgICAgbWF4bGVuID0gR2V0U2VsZWN0b3JMaW1pdCggU0VMRUNUT1JPRihidWZmZXIpICkgLSBPRkZTRVRPRihidWZmZXIpICsgMTsKICAgICBpZiAoY291bnQgPiBtYXhsZW4pIGNvdW50ID0gbWF4bGVuOwotICAgIHJldHVybiBfbHJlYWQzMiggaEZpbGUsIFBUUl9TRUdfVE9fTElOKGJ1ZmZlciksIGNvdW50ICk7CisgICAgcmV0dXJuIF9scmVhZDMyKEhGSUxFMTZfVE9fSEZJTEUzMihoRmlsZSksIFBUUl9TRUdfVE9fTElOKGJ1ZmZlciksIGNvdW50ICk7CiB9CiAKIApAQCAtOTU1LDcgKzk1NSw3IEBACiAgKi8KIFVJTlQxNiBXSU5BUEkgX2xyZWFkMTYoIEhGSUxFMTYgaEZpbGUsIExQVk9JRCBidWZmZXIsIFVJTlQxNiBjb3VudCApCiB7Ci0gICAgcmV0dXJuIChVSU5UMTYpX2xyZWFkMzIoIGhGaWxlLCBidWZmZXIsIChMT05HKWNvdW50ICk7CisgICAgcmV0dXJuIChVSU5UMTYpX2xyZWFkMzIoSEZJTEUxNl9UT19IRklMRTMyKGhGaWxlKSwgYnVmZmVyLCAoTE9ORyljb3VudCApOwogfQogCiAKQEAgLTk2Niw3ICs5NjYsNyBAQAogewogICAgIGludCBtb2RlID0gKGF0dHIgJiAxKSA/IDA0NDQgOiAwNjY2OwogICAgIFRSQUNFKGZpbGUsICIlcyAlMDJ4XG4iLCBwYXRoLCBhdHRyICk7Ci0gICAgcmV0dXJuIChIRklMRTE2KUZJTEVfQ3JlYXRlKCBwYXRoLCBtb2RlLCBGQUxTRSApOworICAgIHJldHVybiAoSEZJTEUxNikgSEZJTEUzMl9UT19IRklMRTE2KEZJTEVfQ3JlYXRlKCBwYXRoLCBtb2RlLCBGQUxTRSApKTsKIH0KIAogCkBAIC0xMDM4LDcgKzEwMzgsNyBAQAogICovCiBMT05HIFdJTkFQSSBfbGxzZWVrMTYoIEhGSUxFMTYgaEZpbGUsIExPTkcgbE9mZnNldCwgSU5UMTYgbk9yaWdpbiApCiB7Ci0gICAgcmV0dXJuIFNldEZpbGVQb2ludGVyKCBoRmlsZSwgbE9mZnNldCwgTlVMTCwgbk9yaWdpbiApOworICAgIHJldHVybiBTZXRGaWxlUG9pbnRlciggSEZJTEUxNl9UT19IRklMRTMyKGhGaWxlKSwgbE9mZnNldCwgTlVMTCwgbk9yaWdpbiApOwogfQogCiAKQEAgLTEwNTYsNyArMTA1Niw3IEBACiAgKi8KIEhGSUxFMTYgV0lOQVBJIF9sb3BlbjE2KCBMUENTVFIgcGF0aCwgSU5UMTYgbW9kZSApCiB7Ci0gICAgcmV0dXJuIF9sb3BlbjMyKCBwYXRoLCBtb2RlICk7CisgICAgcmV0dXJuIEhGSUxFMzJfVE9fSEZJTEUxNihfbG9wZW4zMiggcGF0aCwgbW9kZSApKTsKIH0KIAogCkBAIC0xMDkxLDcgKzEwOTEsNyBAQAogICovCiBVSU5UMTYgV0lOQVBJIF9sd3JpdGUxNiggSEZJTEUxNiBoRmlsZSwgTFBDU1RSIGJ1ZmZlciwgVUlOVDE2IGNvdW50ICkKIHsKLSAgICByZXR1cm4gKFVJTlQxNilfaHdyaXRlMzIoIGhGaWxlLCBidWZmZXIsIChMT05HKWNvdW50ICk7CisgICAgcmV0dXJuIChVSU5UMTYpX2h3cml0ZTMyKCBIRklMRTE2X1RPX0hGSUxFMzIoaEZpbGUpLCBidWZmZXIsIChMT05HKWNvdW50ICk7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtMTEwOCw3ICsxMTA4LDcgQEAKICAqLwogTE9ORyBXSU5BUEkgX2hyZWFkMTYoIEhGSUxFMTYgaEZpbGUsIExQVk9JRCBidWZmZXIsIExPTkcgY291bnQpCiB7Ci0gICAgcmV0dXJuIF9scmVhZDMyKCBoRmlsZSwgYnVmZmVyLCBjb3VudCApOworICAgIHJldHVybiBfbHJlYWQzMiggSEZJTEUxNl9UT19IRklMRTMyKGhGaWxlKSwgYnVmZmVyLCBjb3VudCApOwogfQogCiAKQEAgLTExMjYsNyArMTEyNiw3IEBACiAgKi8KIExPTkcgV0lOQVBJIF9od3JpdGUxNiggSEZJTEUxNiBoRmlsZSwgTFBDU1RSIGJ1ZmZlciwgTE9ORyBjb3VudCApCiB7Ci0gICAgcmV0dXJuIF9od3JpdGUzMiggaEZpbGUsIGJ1ZmZlciwgY291bnQgKTsKKyAgICByZXR1cm4gX2h3cml0ZTMyKCBIRklMRTE2X1RPX0hGSUxFMzIoaEZpbGUpLCBidWZmZXIsIGNvdW50ICk7CiB9CiAKIApkaWZmIC0tZ2l0IGEvZmlsZXMvcHJvZmlsZS5jIGIvZmlsZXMvcHJvZmlsZS5jCmluZGV4IGVjZGQwOWMuLjQ5YjU4ZDcgMTAwNjQ0Ci0tLSBhL2ZpbGVzL3Byb2ZpbGUuYworKysgYi9maWxlcy9wcm9maWxlLmMKQEAgLTk0NSw3ICs5NDUsNyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgR2V0UHJvZmlsZVNlY3Rpb24zMkEgICAoS0VSTkVMMzIuMjY4KQogICovCi1JTlQzMiBXSU5BUEkgR2V0UHJvZmlsZVNlY3Rpb24zMkEoIExQQ1NUUiBzZWN0aW9uLCBMUFNUUiBidWZmZXIsIFVJTlQzMiBsZW4gKQorSU5UMzIgV0lOQVBJIEdldFByb2ZpbGVTZWN0aW9uMzJBKCBMUENTVFIgc2VjdGlvbiwgTFBTVFIgYnVmZmVyLCBEV09SRCBsZW4gKQogewogICAgIHJldHVybiBHZXRQcml2YXRlUHJvZmlsZVNlY3Rpb24zMkEoIHNlY3Rpb24sIGJ1ZmZlciwgbGVuLCAid2luLmluaSIgKTsKIH0KQEAgLTEwODAsNyArMTA4MCw3IEBACiAgKiAgICAgICAgICAgR2V0UHJpdmF0ZVByb2ZpbGVTZWN0aW9uMzJBICAgKEtFUk5FTDMyLjI1NSkKICAqLwogSU5UMzIgV0lOQVBJIEdldFByaXZhdGVQcm9maWxlU2VjdGlvbjMyQSggTFBDU1RSIHNlY3Rpb24sIExQU1RSIGJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQzMiBsZW4sIExQQ1NUUiBmaWxlbmFtZSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBsZW4sIExQQ1NUUiBmaWxlbmFtZSApCiB7CiAgICAgaWYgKFBST0ZJTEVfT3BlbiggZmlsZW5hbWUgKSkKICAgICAgICAgcmV0dXJuIFBST0ZJTEVfR2V0U2VjdGlvbihDdXJQcm9maWxlLT5zZWN0aW9uLCBzZWN0aW9uLCBidWZmZXIsIGxlbiwKQEAgLTExODYsNyArMTE4Niw3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBHZXRQcml2YXRlUHJvZmlsZVN0cnVjdDMyQSAoS0VSTkVMMzIuMzcwKQogICovCi1XT1JEIFdJTkFQSSBHZXRQcml2YXRlUHJvZmlsZVN0cnVjdDMyQSAoTFBDU1RSIHNlY3Rpb24sIExQQ1NUUiBrZXksIAorQk9PTDMyIFdJTkFQSSBHZXRQcml2YXRlUHJvZmlsZVN0cnVjdDMyQSAoTFBDU1RSIHNlY3Rpb24sIExQQ1NUUiBrZXksIAogCUxQVk9JRCBidWYsIFVJTlQzMiBsZW4sIExQQ1NUUiBmaWxlbmFtZSkKIHsKICAgICBQUk9GSUxFS0VZICprOwpAQCAtMTIwNCw3ICsxMjA0LDcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIFdyaXRlUHJpdmF0ZVByb2ZpbGVTdHJ1Y3QzMkEgKEtFUk5FTDMyLjc0NCkKICAqLwotV09SRCBXSU5BUEkgV3JpdGVQcml2YXRlUHJvZmlsZVN0cnVjdDMyQSAoTFBDU1RSIHNlY3Rpb24sIExQQ1NUUiBrZXksIAorQk9PTDMyIFdJTkFQSSBXcml0ZVByaXZhdGVQcm9maWxlU3RydWN0MzJBIChMUENTVFIgc2VjdGlvbiwgTFBDU1RSIGtleSwgCiAJTFBWT0lEIGJ1ZiwgVUlOVDMyIGJ1ZnNpemUsIExQQ1NUUiBmaWxlbmFtZSkKIHsKICAgICBpZiAoKCFzZWN0aW9uKSAmJiAoIWtleSkgJiYgKCFidWYpKSB7CS8qIGZsdXNoIHRoZSBjYWNoZSAqLwpkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvZGRyYXcuYyBiL2dyYXBoaWNzL2RkcmF3LmMKaW5kZXggNDQyMDg5MS4uM2M2NGZjYyAxMDA2NDQKLS0tIGEvZ3JhcGhpY3MvZGRyYXcuYworKysgYi9ncmFwaGljcy9kZHJhdy5jCkBAIC0xLDQgKzEsNCBAQAotLyoJCURpcmVjdERyYXcgdXNpbmcgREdBLCBYU2htLCBvciBYbGliCisvKgkJRGlyZWN0RHJhdyB1c2luZyBER0Egb3IgWGxpYgogICoKICAqIENvcHlyaWdodCAxOTk3LDE5OTggTWFyY3VzIE1laXNzbmVyCiAgKi8KQEAgLTEwLDUyICsxMCwyMCBAQAogICogLSBBIHRlcm1pbmFsIGNvbm5lY3RlZCB0byB0aGUgc2VyaWFsIHBvcnQuIENhbiBiZSBib3VnaHQgdXNlZCBmb3IgY2hlYXAuCiAgKiAgIChUaGlzIGlzIHRoZSBtZXRob2QgSSBhbSB1c2luZy4pCiAgKiAtIEFub3RoZXIgbWFjaGluZSBjb25uZWN0ZWQgb3ZlciBzb21lIGtpbmQgb2YgbmV0d29yay4KLSAqLwotLyogUHJvZ3Jlc3Mgb24gZm9sbG93aW5nIHByb2dyYW1zOgogICoKLSAqIC0gRGlhYmxvIFs2NDB4NDgweDhdOgotICogICBUaGUgbW92aWVzIHBsYXkuIFRoZSBnYW1lIGRvZXNuJ3Qgd29yaywgaXQgc29tZWhvdyB0cmllcyB0byB3cml0ZQotICogICBpbnRvIDIgbGluZXMgX0JFRk9SRV8gdGhlIHN0YXJ0IG9mIHRoZSBzdXJmYWNlLiBEb24ndCBrbm93IHdoeS4KKyAqIEZJWE1FOiBUaGUgWHNobSBpbXBsZW1lbnRhdGlvbiBoYXMgYmVlbiB0ZW1wb3JhcmlseSByZW1vdmVkLiBJdCB3aWxsIGJlCisgKiBsYXRlciByZWludGVncmF0ZWQgaW50byB0aGUgWGxpYiBpbXBsZW1lbnRhdGlvbi4KICAqCi0gKiAtIFdpbmdDb21tYW5kZXIgNCAvIFdpbjk1IFBhdGNoIFs2NDB4NDgweDhdOgotICogICBUaGUgaW50cm9tb3ZpZSBwbGF5cywgaW4gOCBiaXQgbW9kZSAodG8gcmVjb25maWd1cmUgd2M0LCBydW4gd2luZQotICogICAid2M0dy5leGUgLUkiKS4gVGhlIDE2Yml0IG1vZGUgbG9va3MgYnJva2VuLCBidXQgSSB0aGluayB0aGlzIGlzIGR1ZSB0bwotICogICBteSBNYXRyb3ggTXlzdGlxdWUgd2hpY2ggdXNlcyA1NjUgKHJnYikgY29sb3J3ZWlnaHQgaW5zdGVhZCBvZiB0aGUgdXN1YWwKLSAqICAgNTU1LiBTcGVjaWZ5aW5nIGl0IGluIEREUElYRUxGT1JNQVQgZGlkbid0IGhlbHAuCi0gKiAgIFJlcXVpcmVzIHRvIGJlIHJ1biBpbiA2NDB4NDgweGRlcHRoIG1vZGUgKGRvZXNuJ3Qgc2VlbSB0byBoZWVkCi0gKiAgIEREU1VSRkFDRURFU0MubFBpdGNoKS4gWW91IGNhbiBmbHkgdGhlIGZpcnN0IG1pc3Npb24gd2l0aCBNYW5pYWMsIGJ1dAotICogICBpdCBjcmFzaGVzIGFzIHNvb24gYXMgeW91IGFycml2ZSBhdCBCbHVlIFBvaW50IFN0YXRpb24uLi4KLSAqCi0gKiAtIE1vbmtleSBJc2xhbmQgMyBbNjQweDQ4MHg4XToKLSAqICAgR29lcyB0byB0aGUgZWFzeS9oYXJkIHNlbGVjdGlvbiBzY3JlZW4sIHRoZW4gaGFuZ3MgZHVlIHRvIE1UIHByb2JsZW1zLgotICogCi0gKiAtIERpc2NXb3JsZCAyIFs2NDB4NDgweDhdOgotICogICBbQ3Jhc2hlcyB3aXRoICdjbGknIGluIHJlbGVhc2VkIHZlcnNpb24uIFllcy4gUHJpdmlsZWdlZCBpbnN0cnVjdGlvbnMKLSAqICAgIGluIDMyYml0IGNvZGUuIFdpbGwgdGhleSBldmVyIGxlYXJuLi4uXQotICogICBQbGF5cyB0aHJvdWdoIG5lYXJseSBhbGwgaW50cm8gbW92aWVzLiBTb3VuZCBhbmQgYW5pbWF0aW9uIHNraXAgYSBsb3Qgb2YKLSAqICAgc3R1ZmYgKHBvc3NpYmxlIERpcmVjdFNvdW5kIHByb2JsZW0pLgotICogCi0gKiAtIFh2VCBbNjQweDQ4MHgxNl06Ci0gKiAgIFNob3dzIHRoZSBzcGxhc2ggc2NyZWVuLCB0aGVuIGZhaWxzIHdpdGggbWlzc2luZyBKb3lzdGljay4KLSAqCi0gKiAtIFRvbWIgUmFpZGVyIDIgRGVtbyAodXNpbmcgOCBiaXQgcmVuZGVyZXIpIFs2NDB4NDgweDhdOgotICogICBQbGF5YWJsZS4gU291bmQgaXMgd2VpcmQuCi0gKgotICogLSBXaW5nQ29tbWFuZGVyIFByb3BoZWN5IERlbW8gKHVzaW5nIHNvZnR3YXJlIHJlbmRlcmVyKSBbNjQweDQ4MHgxNl06Ci0gKiAgIFtDcmFzaGVzIHdpdGggYW4gaW52YWxpZCBvcGNvZGUgKG91dGIpIGluIHRoZSByZWxlYXNlIHZlcnNpb24uXQotICogICBQbGF5cyBpbnRyb21vdmllLCBoYW5ncyBpbiBzZWxlY3Rpb24gc2NyZWVuIChubyBrZXlib2FyZCBpbnB1dCwgcHJvYmFibHkKLSAqICAgRGlyZWN0SW5wdXQgcHJvYmxlbSkuCisgKiBGSVhNRTogVGhlIFhsaWIgaW1wbGVtZW50YXRpb24gaGFuZ3MgdGhlIHdpbmRvd21hbmFnZXIgYW5kIGFsbCBvdGhlciAKKyAqCSAgcnVubmluZyBYIGNsaWVudHMsIGV2ZW4gdGhvdWdoIEkgYW0gcG9sbGluZyBYIGV2ZW50cyBhbmQgYW5zd2VyaW5nCisgKgkgIHRoZW0uIEJ1dCB5b3UgY2FuIHN3aXRjaCB0byBhbm90aGVyIGNvbnNvbGUgKGN0cmwtYWx0LWZ4KSBhbmQKKyAqCSAgImtpbGxhbGwgd2luZSIgcHJvY2Vzc2VzLiBBbnkgaGVscCBvbiB0aGlzIG9uZSBhcHByZWNpYXRlZC4gLU1hcmN1cwogICovCiAKICNpbmNsdWRlICJjb25maWcuaCIKICNpbmNsdWRlIDx1bmlzdGQuaD4KICNpbmNsdWRlIDxhc3NlcnQuaD4KICNpbmNsdWRlICJ0c194bGliLmgiCi0jaWZkZWYgSEFWRV9MSUJYWFNITQotI2luY2x1ZGUgInRzX3hzaG0uaCIKLSNpbmNsdWRlIDxzeXMvaXBjLmg+Ci0jaW5jbHVkZSA8c3lzL3NobS5oPgotI2VuZGlmCiAjaW5jbHVkZSA8c3lzL3NpZ25hbC5oPgogCiAjaW5jbHVkZSAid2luZG93cy5oIgpAQCAtNzgsNiArNDYsOSBAQAogI2luY2x1ZGUgInRzX3hmODZkZ2EuaCIKICNlbmRpZgogCisvKiBkZWZpbmUgdGhpcyBpZiB5b3Ugd2FudCB0byBwbGF5IERpYWJsbyB1c2luZyBYRjg2REdBLiAoYnVnIHdvcmthcm91bmQpICovCisjdW5kZWYgRElBQkxPX0hBQ0sKKwogLyogcmVzdG9yZSBzaWduYWwgaGFuZGxlcnMgb3ZlcndyaXR0ZW4gYnkgWEY4NkRHQSAKICAqIHRoaXMgaXMgYSBkZWZpbmUsIGZvciBpdCB3aWxsIG9ubHkgd29yayBpbiBlbXVsYXRvciBtb2RlCiAgKi8KQEAgLTkzLDEyICs2NCw3IEBACiAJMHgxMWQxLAogCXsweDg0LCAweDA3LCAweDk3LCAweDE0LCAweGY1LCAweGQ1LCAweDA4LCAweDAyfQogfTsKLXN0YXRpYyBHVUlEIFhTSE1fRGlyZWN0RHJhd19HVUlEID0geyAvKiAyZTQ5NGZmMC1kYzYxLTExZDEtODQwNy04NjBjZjNmNTlmN2EgKi8KLSAgICAweDJlNDk0ZmYwLAotICAgIDB4ZGM2MSwKLSAgICAweDExZDEsCi0gICAgezB4ODQsIDB4MDcsIDB4ODYsIDB4MGMsIDB4ZjMsIDB4ZjUsIDB4OWYsIDB4N2F9Ci19OworCiBzdGF0aWMgR1VJRCBYTElCX0RpcmVjdERyYXdfR1VJRCA9IHsgLyogMTU3NGE3NDAtZGM2MS0xMWQxLTg0MDctZjc4NzVhN2QxODc5ICovCiAgICAgMHgxNTc0YTc0MCwKICAgICAweGRjNjEsCkBAIC0xMDYsMjUgKzcyLDI2IEBACiAgICAgezB4ODQsIDB4MDcsIDB4ZjcsIDB4ODcsIDB4NWEsIDB4N2QsIDB4MTgsIDB4Nzl9CiB9OwogCi1zdGF0aWMgc3RydWN0IElEaXJlY3REcmF3U3VyZmFjZTNfVlRhYmxlCWRnYV9kZHMzdnQsIHhzaG1fZGRzM3Z0LCB4bGliX2RkczN2dDsKLXN0YXRpYyBzdHJ1Y3QgSURpcmVjdERyYXdfVlRhYmxlCQlkZ2FfZGR2dCwgeHNobV9kZHZ0LCB4bGliX2RkdnQ7Ci1zdGF0aWMgc3RydWN0IElEaXJlY3REcmF3Ml9WVGFibGUJCWRnYV9kZDJ2dCwgeHNobV9kZDJ2dCwgeGxpYl9kZDJ2dDsKK3N0YXRpYyBzdHJ1Y3QgSURpcmVjdERyYXdTdXJmYWNlM19WVGFibGUJZGdhX2RkczN2dCwgeGxpYl9kZHMzdnQ7CitzdGF0aWMgc3RydWN0IElEaXJlY3REcmF3X1ZUYWJsZQkJZGdhX2RkdnQsIHhsaWJfZGR2dDsKK3N0YXRpYyBzdHJ1Y3QgSURpcmVjdERyYXcyX1ZUYWJsZQkJZGdhX2RkMnZ0LCB4bGliX2RkMnZ0Owogc3RhdGljIHN0cnVjdCBJRGlyZWN0RHJhd0NsaXBwZXJfVlRhYmxlCWRkY2xpcHZ0Owotc3RhdGljIHN0cnVjdCBJRGlyZWN0RHJhd1BhbGV0dGVfVlRhYmxlIGRnYV9kZHBhbHZ0LCB4c2htX2RkcGFsdnQsIHhsaWJfZGRwYWx2dDsKK3N0YXRpYyBzdHJ1Y3QgSURpcmVjdERyYXdQYWxldHRlX1ZUYWJsZSBkZ2FfZGRwYWx2dCwgeGxpYl9kZHBhbHZ0Owogc3RhdGljIHN0cnVjdCBJRGlyZWN0M0RfVlRhYmxlCQkJZDNkdnQ7CiBzdGF0aWMgc3RydWN0IElEaXJlY3QzRDJfVlRhYmxlCQkJZDNkMnZ0OwogCiB2b2lkIFhsaWJfTWVzc2FnZVB1bXAoSFdORDMyIGh3bmQpIHsKIAlNU0czMgltc2czMjsKIAotCXdoaWxlIChQZWVrTWVzc2FnZTMyQSgmbXNnMzIsMCwwLDAsUE1fTk9ZSUVMRCkpIHsKLQkJR2V0TWVzc2FnZTMyQSgmbXNnMzIsMCwwLDApOwotCQlUcmFuc2xhdGVNZXNzYWdlMzIoJm1zZzMyKTsKLQkJRGlzcGF0Y2hNZXNzYWdlMzJBKCZtc2czMik7CisJd2hpbGUgKEVWRU5UX1dhaXROZXRFdmVudChGQUxTRSxGQUxTRSkpIHsKKwkJd2hpbGUgKFBlZWtNZXNzYWdlMzJBKCZtc2czMiwwLDAsMCwwKSkgeworCQkJR2V0TWVzc2FnZTMyQSgmbXNnMzIsMCwwLDApOworCQkJVHJhbnNsYXRlTWVzc2FnZTMyKCZtc2czMik7CisJCQlEaXNwYXRjaE1lc3NhZ2UzMkEoJm1zZzMyKTsKKwkJfQogCX0KIH0KIAotCiBCT09MMzIKIEREUkFXX0RHQV9BdmFpbGFibGUoKQogewpAQCAtMTM2LDI0ICsxMDMsMTEgQEAKICNlbmRpZiAvKiBkZWZpbmVkKEhBVkVfTElCWFhGODZER0EpICovCiB9CiAKLUJPT0wzMgotRERSQVdfWFNobV9BdmFpbGFibGUoKQotewotI2lmZGVmIEhBVkVfTElCWFhTSE0KLQlyZXR1cm4gVFNYU2htUXVlcnlFeHRlbnNpb24oZGlzcGxheSk7Ci0jZWxzZSAvKiBkZWZpbmVkKEhBVkVfTElCWFhTSE0pICovCi0JcmV0dXJuIDA7Ci0jZW5kaWYgLyogZGVmaW5lZChIQVZFX0xJQlhYU0hNKSAqLwotfQotCiBIUkVTVUxUIFdJTkFQSQogRGlyZWN0RHJhd0VudW1lcmF0ZTMyQShMUERERU5VTUNBTExCQUNLMzJBIGRkZW51bXByb2MsTFBWT0lEIGRhdGEpIHsKIAlpZiAoRERSQVdfREdBX0F2YWlsYWJsZSgpKSB7CiAJCWRkZW51bXByb2MoJkRHQV9EaXJlY3REcmF3X0dVSUQsIldJTkUgd2l0aCBYRnJlZTg2IERHQSIsImRpc3BsYXkiLGRhdGEpOwogCX0KLQlpZiAoRERSQVdfWFNobV9BdmFpbGFibGUoKSkgewotCQlkZGVudW1wcm9jKCZYU0hNX0RpcmVjdERyYXdfR1VJRCwiV0lORSB3aXRoIE1JVCBYU2htIiwiZGlzcGxheSIsZGF0YSk7Ci0JfQogCWRkZW51bXByb2MoJlhMSUJfRGlyZWN0RHJhd19HVUlELCJXSU5FIHdpdGggWGxpYiIsImRpc3BsYXkiLGRhdGEpOwogCWRkZW51bXByb2MoTlVMTCwiV0lORSIsImRpc3BsYXkiLGRhdGEpOwogCXJldHVybiAwOwpAQCAtMzI2LDcgKzI4MCw3IEBACiAJRFVNUCgiXG4iKTsKIH0KIAotc3RhdGljIGludCBfZ2V0cGl4ZWxmb3JtYXQoTFBESVJFQ1REUkFXIGRkcmF3LExQRERQSVhFTEZPUk1BVCBwZikgeworc3RhdGljIGludCBfZ2V0cGl4ZWxmb3JtYXQoTFBESVJFQ1REUkFXMiBkZHJhdyxMUEREUElYRUxGT1JNQVQgcGYpIHsKIAlzdGF0aWMgWFZpc3VhbEluZm8JKnZpOwogCVhWaXN1YWxJbmZvCQl2dDsKIAlpbnQJCQluaXRlbXM7CkBAIC0zNTMsNyArMzA3LDcgQEAKIAkJcGYtPnh5LmR3UkdCQWxwaGFCaXRNYXNrPSAwOwogCQlyZXR1cm4gMDsKIAl9Ci0JRklYTUUoZGRyYXcsIl9nZXRwaXhlbGZvcm1hdDpvb3BzP1xuIik7CisJRklYTUUoZGRyYXcsIl9nZXRwaXhlbGZvcm1hdDp1bmtub3duIGRlcHRoICVsZD9cbiIsZGRyYXctPmQuZGVwdGgpOwogCXJldHVybiBEREVSUl9HRU5FUklDOwogfQogCkBAIC0zNzQsNyArMzI4LDcgQEAKIAkJCSB0aGlzLGxwcmVjdCxscGRkc2QsZmxhZ3MsKERXT1JEKWhuZCk7CiAKIAlpZiAobHByZWN0KSB7Ci0JCVRSQUNFKGRkcmF3LCIJbHByZWN0OiAlZHglZC0lZHglZFxuIiwKKwkJRklYTUUoZGRyYXcsIglscHJlY3Q6ICVkeCVkLSVkeCVkXG4iLAogCQkJbHByZWN0LT50b3AsbHByZWN0LT5sZWZ0LGxwcmVjdC0+Ym90dG9tLGxwcmVjdC0+cmlnaHQKIAkJKTsKIAkJbHBkZHNkLT55LmxwU3VyZmFjZSA9IHRoaXMtPnMuc3VyZmFjZSArCkBAIC0zOTksNDAgKzM1MywxNCBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgSFJFU1VMVCBXSU5BUEkgWFNobV9JRGlyZWN0RHJhd1N1cmZhY2UzX1VubG9jaygKLQlMUERJUkVDVERSQVdTVVJGQUNFMyB0aGlzLExQVk9JRCBzdXJmYWNlCi0pIHsKLSNpZmRlZiBIQVZFX0xJQlhYU0hNCi0JVFJBQ0UoZGRyYXcsIiglcCktPlVubG9jayglcClcbiIsdGhpcyxzdXJmYWNlKTsKLQkvKiBGSVhNRTogaXMgaXQgcmVhbGx5IHJpZ2h0IHRvIGRpc3BsYXkgdGhlIGltYWdlIG9uIHVubG9jaz8KLQkgKiBvciBzaG91bGQgaXQgd2FpdCBmb3IgYSBGbGlwKCk/ICovCi0JVFNYU2htUHV0SW1hZ2UoZGlzcGxheSwKLQkJCQkgICB0aGlzLT5zLmRkcmF3LT5lLnhzaG0uZHJhd2FibGUsCi0JCQkJICAgRGVmYXVsdEdDT2ZTY3JlZW4oc2NyZWVuKSwKLQkJCQkgICB0aGlzLT50LnhzaG0uaW1hZ2UsCi0JCQkJICAgMCwgMCwgMCwgMCwKLQkJCQkgICB0aGlzLT50LnhzaG0uaW1hZ2UtPndpZHRoLAotCQkJCSAgIHRoaXMtPnQueHNobS5pbWFnZS0+aGVpZ2h0LAotCQkJCSAgIEZhbHNlKTsKLS8qCi0JaWYgKHRoaXMtPnMucGFsZXR0ZSAmJiB0aGlzLT5zLnBhbGV0dGUtPmNtKSB7Ci0JCVRTWEluc3RhbGxDb2xvcm1hcChkaXNwbGF5LHRoaXMtPnMucGFsZXR0ZS0+Y20pOwotCX0KLSovCi0JLypUU1hTeW5jKGRpc3BsYXksRmFsc2UpOyovCi0JRVZFTlRfU3luY2hyb25pemUoKTsKLQlyZXR1cm4gMDsKLSNlbHNlIC8qIGRlZmluZWQoSEFWRV9MSUJYWFNITSkgKi8KLQlyZXR1cm4gRV9VTkVYUEVDVEVEOwotI2VuZGlmIC8qIGRlZmluZWQoSEFWRV9MSUJYWFNITSkgKi8KLX0KLQogc3RhdGljIEhSRVNVTFQgV0lOQVBJIFhsaWJfSURpcmVjdERyYXdTdXJmYWNlM19VbmxvY2soCiAJTFBESVJFQ1REUkFXU1VSRkFDRTMgdGhpcyxMUFZPSUQgc3VyZmFjZQogKSB7CiAJWGxpYl9NZXNzYWdlUHVtcCh0aGlzLT5zLmRkcmF3LT5lLnhsaWIud2luZG93KTsKIAogCVRSQUNFKGRkcmF3LCIoJXApLT5VbmxvY2soJXApXG4iLHRoaXMsc3VyZmFjZSk7CisJaWYgKCF0aGlzLT5zLmRkcmF3LT5lLnhsaWIucGFpbnRhYmxlKQorCQlyZXR1cm4gMDsKIAlUU1hQdXRJbWFnZSgJCWRpc3BsYXksCiAJCQkJdGhpcy0+cy5kZHJhdy0+ZS54bGliLmRyYXdhYmxlLAogCQkJCURlZmF1bHRHQ09mU2NyZWVuKHNjcmVlbiksCkBAIC00NDEsOCArMzY5LDYgQEAKIAkJCQl0aGlzLT50LnhsaWIuaW1hZ2UtPndpZHRoLAogCQkJCXRoaXMtPnQueGxpYi5pbWFnZS0+aGVpZ2h0CiAJKTsKLQkvKlRTWFNldFdpbmRvd0NvbG9ybWFwKGRpc3BsYXksdGhpcy0+cy5kZHJhdy0+ZS54bGliLmRyYXdhYmxlLHRoaXMtPnMucGFsZXR0ZS0+Y20pOyovCi0JRVZFTlRfU3luY2hyb25pemUoKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtNDgyLDQ3ICs0MDgsMTQgQEAKICNlbmRpZiAvKiBkZWZpbmVkKEhBVkVfTElCWFhGODZER0EpICovCiB9CiAKLXN0YXRpYyBIUkVTVUxUIFdJTkFQSSBYU2htX0lEaXJlY3REcmF3U3VyZmFjZTNfRmxpcCgKLQlMUERJUkVDVERSQVdTVVJGQUNFMyB0aGlzLExQRElSRUNURFJBV1NVUkZBQ0UzIGZsaXB0byxEV09SRCBkd0ZsYWdzCi0pIHsKLSNpZmRlZiBIQVZFX0xJQlhYU0hNCi0JVFJBQ0UoZGRyYXcsIiglcCktPkZsaXAoJXAsJTA4bHgpXG4iLHRoaXMsZmxpcHRvLGR3RmxhZ3MpOwotCWlmICghZmxpcHRvKSB7Ci0JCWlmICh0aGlzLT5zLmJhY2tidWZmZXIpCi0JCQlmbGlwdG8gPSB0aGlzLT5zLmJhY2tidWZmZXI7Ci0JCWVsc2UKLQkJCWZsaXB0byA9IHRoaXM7Ci0JfQotCVRTWFNobVB1dEltYWdlKGRpc3BsYXksCi0JCQkJICAgdGhpcy0+cy5kZHJhdy0+ZS54c2htLmRyYXdhYmxlLAotCQkJCSAgIERlZmF1bHRHQ09mU2NyZWVuKHNjcmVlbiksCi0JCQkJICAgZmxpcHRvLT50LnhzaG0uaW1hZ2UsCi0JCQkJICAgMCwgMCwgMCwgMCwKLQkJCQkgICBmbGlwdG8tPnQueHNobS5pbWFnZS0+d2lkdGgsCi0JCQkJICAgZmxpcHRvLT50LnhzaG0uaW1hZ2UtPmhlaWdodCwKLQkJCQkgICBGYWxzZSk7Ci0vKgotCWlmIChmbGlwdG8tPnMucGFsZXR0ZSAmJiBmbGlwdG8tPnMucGFsZXR0ZS0+Y20pIHsKLQkJVFNYSW5zdGFsbENvbG9ybWFwKGRpc3BsYXksZmxpcHRvLT5zLnBhbGV0dGUtPmNtKTsKLQl9Ci0qLwotCUVWRU5UX1N5bmNocm9uaXplKCk7Ci0JaWYgKGZsaXB0byE9dGhpcykgewotCQlYSW1hZ2UgKnRtcDsKLQkJdG1wID0gdGhpcy0+dC54c2htLmltYWdlOwotCQl0aGlzLT50LnhzaG0uaW1hZ2UgPSBmbGlwdG8tPnQueHNobS5pbWFnZTsKLQkJZmxpcHRvLT50LnhzaG0uaW1hZ2UgPSB0bXA7Ci0JfQotCXJldHVybiAwOwotI2Vsc2UgLyogZGVmaW5lZChIQVZFX0xJQlhYU0hNKSAqLwotCXJldHVybiBFX1VORVhQRUNURUQ7Ci0jZW5kaWYgLyogZGVmaW5lZChIQVZFX0xJQlhYU0hNKSAqLwotfQotCiBzdGF0aWMgSFJFU1VMVCBXSU5BUEkgWGxpYl9JRGlyZWN0RHJhd1N1cmZhY2UzX0ZsaXAoCiAJTFBESVJFQ1REUkFXU1VSRkFDRTMgdGhpcyxMUERJUkVDVERSQVdTVVJGQUNFMyBmbGlwdG8sRFdPUkQgZHdGbGFncwogKSB7CiAJVFJBQ0UoZGRyYXcsIiglcCktPkZsaXAoJXAsJTA4bHgpXG4iLHRoaXMsZmxpcHRvLGR3RmxhZ3MpOworCVhsaWJfTWVzc2FnZVB1bXAodGhpcy0+cy5kZHJhdy0+ZS54bGliLndpbmRvdyk7CisJaWYgKCF0aGlzLT5zLmRkcmF3LT5lLnhsaWIucGFpbnRhYmxlKQorCQlyZXR1cm4gMDsKKwogCWlmICghZmxpcHRvKSB7CiAJCWlmICh0aGlzLT5zLmJhY2tidWZmZXIpCiAJCQlmbGlwdG8gPSB0aGlzLT5zLmJhY2tidWZmZXI7CkBAIC01MzcsNyArNDMwLDYgQEAKIAkJCQlmbGlwdG8tPnQueGxpYi5pbWFnZS0+d2lkdGgsCiAJCQkJZmxpcHRvLT50LnhsaWIuaW1hZ2UtPmhlaWdodCk7CiAJVFNYU2V0V2luZG93Q29sb3JtYXAoZGlzcGxheSx0aGlzLT5zLmRkcmF3LT5lLnhsaWIuZHJhd2FibGUsdGhpcy0+cy5wYWxldHRlLT5jbSk7Ci0JRVZFTlRfU3luY2hyb25pemUoKTsKIAlpZiAoZmxpcHRvIT10aGlzKSB7CiAJCVhJbWFnZSAqdG1wOwogCQlMUFZPSUQJKnN1cmY7CkBAIC03MTIsMjQgKzYwNCw2IEBACiAJcmV0dXJuIHRoaXMtPnJlZjsKIH0KIAotc3RhdGljIFVMT05HIFdJTkFQSSBYU2htX0lEaXJlY3REcmF3U3VyZmFjZTNfUmVsZWFzZShMUERJUkVDVERSQVdTVVJGQUNFMyB0aGlzKSB7Ci0JVFJBQ0UoZGRyYXcsIiglcCktPlJlbGVhc2UoKVxuIix0aGlzKTsKLSNpZmRlZiBIQVZFX0xJQlhYU0hNCi0JaWYgKCEtLSh0aGlzLT5yZWYpKSB7Ci0JCXRoaXMtPnMuZGRyYXctPmxwdnRibC0+Zm5SZWxlYXNlKHRoaXMtPnMuZGRyYXcpOwotCQlIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLDAsdGhpcy0+cy5zdXJmYWNlKTsKLQkJdGhpcy0+dC54c2htLmltYWdlLT5kYXRhID0gTlVMTDsKLQkJVFNYU2htRGV0YWNoKGRpc3BsYXksJnRoaXMtPnQueHNobS5zaG1pbmZvKTsKLQkJVFNYRGVzdHJveUltYWdlKHRoaXMtPnQueHNobS5pbWFnZSk7Ci0JCXNobWR0KHRoaXMtPnQueHNobS5zaG1pbmZvLnNobWFkZHIpOwotCQlzaG1jdGwodGhpcy0+dC54c2htLnNobWluZm8uc2htaWQsIElQQ19STUlELCAwKTsKLQkJSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwwLHRoaXMpOwotCQlyZXR1cm4gMDsKLQl9Ci0jZW5kaWYgLyogZGVmaW5lZChIQVZFX0xJQlhYU0hNKSAqLwotCXJldHVybiB0aGlzLT5yZWY7Ci19Ci0KIHN0YXRpYyBVTE9ORyBXSU5BUEkgWGxpYl9JRGlyZWN0RHJhd1N1cmZhY2UzX1JlbGVhc2UoTFBESVJFQ1REUkFXU1VSRkFDRTMgdGhpcykgewogCVRSQUNFKGRkcmF3LCIoJXApLT5SZWxlYXNlKClcbiIsdGhpcyk7CiAJaWYgKCEtLSh0aGlzLT5yZWYpKSB7CkBAIC04MDMsMTMgKzY3NywxMyBAQAogCiBzdGF0aWMgSFJFU1VMVCBXSU5BUEkgSURpcmVjdERyYXdTdXJmYWNlM19HZXREQyhMUERJUkVDVERSQVdTVVJGQUNFMyB0aGlzLEhEQzMyKiBscGhkYykgewogCUZJWE1FKGRkcmF3LCIoJXApLT5HZXREQyglcClcbiIsdGhpcyxscGhkYyk7Ci0JKmxwaGRjID0gR2V0REMzMih0aGlzLT5zLmRkcmF3LT5lLnhsaWIud2luZG93KTsKKwkqbHBoZGMgPSBCZWdpblBhaW50MzIodGhpcy0+cy5kZHJhdy0+ZS54bGliLndpbmRvdywmdGhpcy0+cy5kZHJhdy0+ZS54bGliLnBzKTsKIAlyZXR1cm4gMDsKIH0KIAogc3RhdGljIEhSRVNVTFQgV0lOQVBJIElEaXJlY3REcmF3U3VyZmFjZTNfUmVsZWFzZURDKExQRElSRUNURFJBV1NVUkZBQ0UzIHRoaXMsSERDMzIgaGRjKSB7CiAJRklYTUUoZGRyYXcsIiglcCktPigweCUwOGx4KSxzdHViIVxuIix0aGlzLChsb25nKWhkYyk7Ci0JUmVsZWFzZURDMzIodGhpcy0+cy5kZHJhdy0+ZS54bGliLndpbmRvdyxoZGMpOworCUVuZFBhaW50MzIodGhpcy0+cy5kZHJhdy0+ZS54bGliLndpbmRvdywmdGhpcy0+cy5kZHJhdy0+ZS54bGliLnBzKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtOTAxLDQ5ICs3NzUsNiBAQAogCSh2b2lkKik0MCwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgSURpcmVjdERyYXdTdXJmYWNlM19WVGFibGUgeHNobV9kZHMzdnQgPSB7Ci0JSURpcmVjdERyYXdTdXJmYWNlM19RdWVyeUludGVyZmFjZSwKLQlJRGlyZWN0RHJhd1N1cmZhY2UzX0FkZFJlZiwKLQlYU2htX0lEaXJlY3REcmF3U3VyZmFjZTNfUmVsZWFzZSwKLQlJRGlyZWN0RHJhd1N1cmZhY2UzX0FkZEF0dGFjaGVkU3VyZmFjZSwKLQkodm9pZCopNSwKLQlJRGlyZWN0RHJhd1N1cmZhY2UzX0JsdCwKLQlJRGlyZWN0RHJhd1N1cmZhY2UzX0JsdEJhdGNoLAotCUlEaXJlY3REcmF3U3VyZmFjZTNfQmx0RmFzdCwKLQkodm9pZCopOSwKLQlJRGlyZWN0RHJhd1N1cmZhY2UzX0VudW1BdHRhY2hlZFN1cmZhY2VzLAotCSh2b2lkKikxMSwKLQlYU2htX0lEaXJlY3REcmF3U3VyZmFjZTNfRmxpcCwKLQlJRGlyZWN0RHJhd1N1cmZhY2UzX0dldEF0dGFjaGVkU3VyZmFjZSwKLQlJRGlyZWN0RHJhd1N1cmZhY2UzX0dldEJsdFN0YXR1cywKLQlJRGlyZWN0RHJhd1N1cmZhY2UzX0dldENhcHMsCi0JKHZvaWQqKTE2LAotCSh2b2lkKikxNywKLQlJRGlyZWN0RHJhd1N1cmZhY2UzX0dldERDLAotCSh2b2lkKikxOSwKLQlJRGlyZWN0RHJhd1N1cmZhY2UzX0dldE92ZXJsYXlQb3NpdGlvbiwKLQkodm9pZCopMjEsCi0JSURpcmVjdERyYXdTdXJmYWNlM19HZXRQaXhlbEZvcm1hdCwKLQlJRGlyZWN0RHJhd1N1cmZhY2UzX0dldFN1cmZhY2VEZXNjLAotCUlEaXJlY3REcmF3U3VyZmFjZTNfSW5pdGlhbGl6ZSwKLQlJRGlyZWN0RHJhd1N1cmZhY2UzX0lzTG9zdCwKLQlJRGlyZWN0RHJhd1N1cmZhY2UzX0xvY2ssCi0JSURpcmVjdERyYXdTdXJmYWNlM19SZWxlYXNlREMsCi0JSURpcmVjdERyYXdTdXJmYWNlM19SZXN0b3JlLAotCUlEaXJlY3REcmF3U3VyZmFjZTNfU2V0Q2xpcHBlciwKLQlJRGlyZWN0RHJhd1N1cmZhY2UzX1NldENvbG9yS2V5LAotCSh2b2lkKikzMSwKLQlJRGlyZWN0RHJhd1N1cmZhY2UzX1NldFBhbGV0dGUsCi0JWFNobV9JRGlyZWN0RHJhd1N1cmZhY2UzX1VubG9jaywKLQkodm9pZCopMzQsCi0JKHZvaWQqKTM1LAotCSh2b2lkKikzNiwKLQkodm9pZCopMzcsCi0JKHZvaWQqKTM4LAotCSh2b2lkKikzOSwKLQkodm9pZCopNDAsCi19OwotCiBzdGF0aWMgc3RydWN0IElEaXJlY3REcmF3U3VyZmFjZTNfVlRhYmxlIHhsaWJfZGRzM3Z0ID0gewogCUlEaXJlY3REcmF3U3VyZmFjZTNfUXVlcnlJbnRlcmZhY2UsCiAJSURpcmVjdERyYXdTdXJmYWNlM19BZGRSZWYsCkBAIC0xMDM2LDcgKzg2Nyw3IEBACiAgKgkJCUlEaXJlY3REcmF3UGFsZXR0ZQogICovCiBzdGF0aWMgSFJFU1VMVCBXSU5BUEkgSURpcmVjdERyYXdQYWxldHRlX0dldEVudHJpZXMoCi0JTFBESVJFQ1REUkFXUEFMRVRURSB0aGlzLERXT1JEIHgsRFdPUkQgc3RhcnQsRFdPUkQgZW5kLExQUEFMRVRURUVOVFJZIHBhbGVudAorCUxQRElSRUNURFJBV1BBTEVUVEUgdGhpcyxEV09SRCB4LERXT1JEIHN0YXJ0LERXT1JEIGNvdW50LExQUEFMRVRURUVOVFJZIHBhbGVudAogKSB7CiAJWENvbG9yIHhjOwogCWludAlpOwpAQCAtMTA0NSw1MiArODc2LDc2IEBACiAJCUZJWE1FKGRkcmF3LCJhcHAgdHJpZWQgdG8gcmVhZCBjb2xvcm1hcCBmb3Igbm9uLXBhbGV0dGl6ZWQgbW9kZVxuIik7CiAJCXJldHVybiBEREVSUl9HRU5FUklDOwogCX0KLQlmb3IgKGk9c3RhcnQ7aTxlbmQ7aSsrKSB7Ci0JCXhjLnBpeGVsID0gaTsKKwlmb3IgKGk9MDtpPGNvdW50O2krKykgeworCQl4Yy5waXhlbCA9IGkrc3RhcnQ7CiAJCVRTWFF1ZXJ5Q29sb3IoZGlzcGxheSx0aGlzLT5jbSwmeGMpOwotCQlwYWxlbnRbaS1zdGFydF0ucGVSZWQgPSB4Yy5yZWQ+Pjg7Ci0JCXBhbGVudFtpLXN0YXJ0XS5wZUdyZWVuID0geGMuZ3JlZW4+Pjg7Ci0JCXBhbGVudFtpLXN0YXJ0XS5wZUJsdWUgPSB4Yy5ibHVlPj44OworCQlwYWxlbnRbaV0ucGVSZWQgPSB4Yy5yZWQ+Pjg7CisJCXBhbGVudFtpXS5wZUdyZWVuID0geGMuZ3JlZW4+Pjg7CisJCXBhbGVudFtpXS5wZUJsdWUgPSB4Yy5ibHVlPj44OwogCX0KIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIEhSRVNVTFQgV0lOQVBJIGNvbW1vbl9JRGlyZWN0RHJhd1BhbGV0dGVfU2V0RW50cmllcygKLQlMUERJUkVDVERSQVdQQUxFVFRFIHRoaXMsRFdPUkQgeCxEV09SRCBzdGFydCxEV09SRCBlbmQsTFBQQUxFVFRFRU5UUlkgcGFsZW50CitzdGF0aWMgSFJFU1VMVCBXSU5BUEkgWGxpYl9JRGlyZWN0RHJhd1BhbGV0dGVfU2V0RW50cmllcygKKwlMUERJUkVDVERSQVdQQUxFVFRFIHRoaXMsRFdPUkQgeCxEV09SRCBzdGFydCxEV09SRCBjb3VudCxMUFBBTEVUVEVFTlRSWSBwYWxlbnQKICkgewogCVhDb2xvcgkJeGM7CiAJaW50CQlpOwogCiAJVFJBQ0UoZGRyYXcsIiglcCktPlNldEVudHJpZXMoJTA4bHgsJWxkLCVsZCwlcClcbiIsCi0JCXRoaXMseCxzdGFydCxlbmQscGFsZW50CisJCXRoaXMseCxzdGFydCxjb3VudCxwYWxlbnQKKwkpOworCWlmICghdGhpcy0+Y20pIC8qIHNob3VsZCBub3QgaGFwcGVuICovIHsKKwkJRklYTUUoZGRyYXcsImFwcCB0cmllZCB0byBzZXQgY29sb3JtYXAgaW4gbm9uLXBhbGV0dGl6ZWQgbW9kZVxuIik7CisJCXJldHVybiBEREVSUl9HRU5FUklDOworCX0KKwlpZiAoIXRoaXMtPmRkcmF3LT5lLnhsaWIucGFpbnRhYmxlKQorCQlyZXR1cm4gMDsKKwlmb3IgKGk9MDtpPGNvdW50O2krKykgeworCQl4Yy5yZWQgPSBwYWxlbnRbaV0ucGVSZWQ8PDg7CisJCXhjLmJsdWUgPSBwYWxlbnRbaV0ucGVCbHVlPDw4OworCQl4Yy5ncmVlbiA9IHBhbGVudFtpXS5wZUdyZWVuPDw4OworCQl4Yy5mbGFncyA9IERvUmVkfERvQmx1ZXxEb0dyZWVuOworCQl4Yy5waXhlbCA9IHN0YXJ0K2k7CisJCVRTWFN0b3JlQ29sb3IoZGlzcGxheSx0aGlzLT5jbSwmeGMpOworCQl0aGlzLT5wYWxlbnRzW3N0YXJ0K2ldLnBlUmVkID0gcGFsZW50W2ldLnBlUmVkOworCQl0aGlzLT5wYWxlbnRzW3N0YXJ0K2ldLnBlQmx1ZSA9IHBhbGVudFtpXS5wZUJsdWU7CisJCXRoaXMtPnBhbGVudHNbc3RhcnQraV0ucGVHcmVlbiA9IHBhbGVudFtpXS5wZUdyZWVuOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIEhSRVNVTFQgV0lOQVBJIERHQV9JRGlyZWN0RHJhd1BhbGV0dGVfU2V0RW50cmllcygKKwlMUERJUkVDVERSQVdQQUxFVFRFIHRoaXMsRFdPUkQgeCxEV09SRCBzdGFydCxEV09SRCBjb3VudCxMUFBBTEVUVEVFTlRSWSBwYWxlbnQKKykgeworI2lmZGVmIEhBVkVfTElCWFhGODZER0EKKwlYQ29sb3IJCXhjOworCUNvbG9ybWFwCWNtOworCWludAkJaTsKKworCVRSQUNFKGRkcmF3LCIoJXApLT5TZXRFbnRyaWVzKCUwOGx4LCVsZCwlbGQsJXApXG4iLAorCQl0aGlzLHgsc3RhcnQsY291bnQscGFsZW50CiAJKTsKIAlpZiAoIXRoaXMtPmNtKSAvKiBzaG91bGQgbm90IGhhcHBlbiAqLyB7CiAJCUZJWE1FKGRkcmF3LCJhcHAgdHJpZWQgdG8gc2V0IGNvbG9ybWFwIGluIG5vbi1wYWxldHRpemVkIG1vZGVcbiIpOwogCQlyZXR1cm4gRERFUlJfR0VORVJJQzsKIAl9CiAJLyogRklYTUU6IGZyZWUgY29sb3JjZWxscyBpbnN0ZWFkIG9mIGZyZWVpbmcgd2hvbGUgbWFwICovCi0JLyp0aGlzLT5jbSA9IFRTWENvcHlDb2xvcm1hcEFuZEZyZWUoZGlzcGxheSx0aGlzLT5jbSk7Ki8KLQlmb3IgKGk9c3RhcnQ7aTxlbmQ7aSsrKSB7Ci0JCXhjLnJlZCA9IHBhbGVudFtpLXN0YXJ0XS5wZVJlZDw8ODsKLQkJeGMuYmx1ZSA9IHBhbGVudFtpLXN0YXJ0XS5wZUJsdWU8PDg7Ci0JCXhjLmdyZWVuID0gcGFsZW50W2ktc3RhcnRdLnBlR3JlZW48PDg7Ci0JCXhjLmZsYWdzID0gRG9SZWR8RG9CbHVlfERvR3JlZW47Ci0JCXhjLnBpeGVsID0gaTsKLQkJVFNYU3RvcmVDb2xvcihkaXNwbGF5LHRoaXMtPmNtLCZ4Yyk7Ci0JCXRoaXMtPnBhbGVudHNbaV0ucGVSZWQgPSBwYWxlbnRbaS1zdGFydF0ucGVSZWQ7Ci0JCXRoaXMtPnBhbGVudHNbaV0ucGVCbHVlID0gcGFsZW50W2ktc3RhcnRdLnBlQmx1ZTsKLQkJdGhpcy0+cGFsZW50c1tpXS5wZUdyZWVuID0gcGFsZW50W2ktc3RhcnRdLnBlR3JlZW47Ci0JfQotCXJldHVybiAwOwotfQorCWNtID0gdGhpcy0+Y207CisJdGhpcy0+Y20gPSBUU1hDb3B5Q29sb3JtYXBBbmRGcmVlKGRpc3BsYXksdGhpcy0+Y20pOworCVRTWEZyZWVDb2xvcm1hcChkaXNwbGF5LGNtKTsKIAotc3RhdGljIEhSRVNVTFQgV0lOQVBJIERHQV9JRGlyZWN0RHJhd1BhbGV0dGVfU2V0RW50cmllcygKLQlMUERJUkVDVERSQVdQQUxFVFRFIHRoaXMsRFdPUkQgeCxEV09SRCBzdGFydCxEV09SRCBlbmQsTFBQQUxFVFRFRU5UUlkgcGFsZW50Ci0pIHsKLSNpZmRlZiBIQVZFX0xJQlhYRjg2REdBCi0JSFJFU1VMVCBocmVzOwotCWhyZXMgPSBjb21tb25fSURpcmVjdERyYXdQYWxldHRlX1NldEVudHJpZXModGhpcyx4LHN0YXJ0LGVuZCxwYWxlbnQpOwotCWlmIChocmVzICE9IDApIHJldHVybiBocmVzOworCWZvciAoaT0wO2k8Y291bnQ7aSsrKSB7CisJCXhjLnJlZCA9IHBhbGVudFtpXS5wZVJlZDw8ODsKKwkJeGMuYmx1ZSA9IHBhbGVudFtpXS5wZUJsdWU8PDg7CisJCXhjLmdyZWVuID0gcGFsZW50W2ldLnBlR3JlZW48PDg7CisJCXhjLmZsYWdzID0gRG9SZWR8RG9CbHVlfERvR3JlZW47CisJCXhjLnBpeGVsID0gaStzdGFydDsKKwkJVFNYU3RvcmVDb2xvcihkaXNwbGF5LHRoaXMtPmNtLCZ4Yyk7CisJCXRoaXMtPnBhbGVudHNbc3RhcnQraV0ucGVSZWQgPSBwYWxlbnRbaV0ucGVSZWQ7CisJCXRoaXMtPnBhbGVudHNbc3RhcnQraV0ucGVCbHVlID0gcGFsZW50W2ldLnBlQmx1ZTsKKwkJdGhpcy0+cGFsZW50c1tzdGFydCtpXS5wZUdyZWVuID0gcGFsZW50W2ldLnBlR3JlZW47CisJfQogCVRTWEY4NkRHQUluc3RhbGxDb2xvcm1hcChkaXNwbGF5LERlZmF1bHRTY3JlZW4oZGlzcGxheSksdGhpcy0+Y20pOwogCXJldHVybiAwOwogI2Vsc2UgLyogZGVmaW5lZChIQVZFX0xJQlhYRjg2REdBKSAqLwpAQCAtMTEzMCwxNiArOTg1LDYgQEAKIAlER0FfSURpcmVjdERyYXdQYWxldHRlX1NldEVudHJpZXMKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgSURpcmVjdERyYXdQYWxldHRlX1ZUYWJsZSB4c2htX2RkcGFsdnQgPSB7Ci0JKHZvaWQqKTEsCi0JSURpcmVjdERyYXdQYWxldHRlX0FkZFJlZiwKLQlJRGlyZWN0RHJhd1BhbGV0dGVfUmVsZWFzZSwKLQkodm9pZCopNCwKLQlJRGlyZWN0RHJhd1BhbGV0dGVfR2V0RW50cmllcywKLQlJRGlyZWN0RHJhd1BhbGV0dGVfSW5pdGlhbGl6ZSwKLQljb21tb25fSURpcmVjdERyYXdQYWxldHRlX1NldEVudHJpZXMKLX07Ci0KIHN0YXRpYyBzdHJ1Y3QgSURpcmVjdERyYXdQYWxldHRlX1ZUYWJsZSB4bGliX2RkcGFsdnQgPSB7CiAJKHZvaWQqKTEsCiAJSURpcmVjdERyYXdQYWxldHRlX0FkZFJlZiwKQEAgLTExNDcsNyArOTkyLDcgQEAKIAkodm9pZCopNCwKIAlJRGlyZWN0RHJhd1BhbGV0dGVfR2V0RW50cmllcywKIAlJRGlyZWN0RHJhd1BhbGV0dGVfSW5pdGlhbGl6ZSwKLQljb21tb25fSURpcmVjdERyYXdQYWxldHRlX1NldEVudHJpZXMKKwlYbGliX0lEaXJlY3REcmF3UGFsZXR0ZV9TZXRFbnRyaWVzCiB9OwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtMTE4OSw3ICsxMDM0LDcgQEAKIAogCWQyLmR3U2l6ZQk9IHNpemVvZihkMik7CiAJZDIuZHdGbGFncwk9IDA7Ci0JY2IoJklJRF9JRGlyZWN0M0RIQUxEZXZpY2UsIldJTkUgRGlyZWN0M0QgSEFMIiwiZGlyZWN0M2QiLCZkMSwmZDIsY29udGV4dCk7CisJY2IoKHZvaWQqKSZJSURfSURpcmVjdDNESEFMRGV2aWNlLCJXSU5FIERpcmVjdDNEIEhBTCIsImRpcmVjdDNkIiwmZDEsJmQyLGNvbnRleHQpOwogCXJldHVybiAwOwogfQogCkBAIC0xMjA4LDggKzEwNTMsOCBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCQkJCUlEaXJlY3REcmF3CiAgKi8KLXN0YXRpYyBIUkVTVUxUIFdJTkFQSSBER0FfSURpcmVjdERyYXdfQ3JlYXRlU3VyZmFjZSgKLQlMUERJUkVDVERSQVcgdGhpcyxMUEREU1VSRkFDRURFU0MgbHBkZHNkLExQRElSRUNURFJBV1NVUkZBQ0UgKmxwZHNmLElVbmtub3duICpscHVuaworc3RhdGljIEhSRVNVTFQgV0lOQVBJIERHQV9JRGlyZWN0RHJhdzJfQ3JlYXRlU3VyZmFjZSgKKwlMUERJUkVDVERSQVcyIHRoaXMsTFBERFNVUkZBQ0VERVNDIGxwZGRzZCxMUERJUkVDVERSQVdTVVJGQUNFICpscGRzZixJVW5rbm93biAqbHB1bmsKICkgewogI2lmZGVmIEhBVkVfTElCWFhGODZER0EKIAlpbnQJaTsKQEAgLTEyODgsNTAgKzExMzMsOCBAQAogI2VuZGlmIC8qIGRlZmluZWQoSEFWRV9MSUJYWEY4NkRHQSkgKi8KIH0KIAotc3RhdGljIEhSRVNVTFQgV0lOQVBJIFhTaG1fSURpcmVjdERyYXdfQ3JlYXRlU3VyZmFjZSgKLQlMUERJUkVDVERSQVcgdGhpcyxMUEREU1VSRkFDRURFU0MgbHBkZHNkLExQRElSRUNURFJBV1NVUkZBQ0UgKmxwZHNmLElVbmtub3duICpscHVuawotKSB7Ci0jaWZkZWYgSEFWRV9MSUJYWFNITQotCVhJbWFnZSAqaW1nOwotCWludCBzaG1pZDsKLQlUUkFDRShkZHJhdywiKCVwKS0+Q3JlYXRlU3VyZmFjZSglcCwlcCwlcClcbiIsdGhpcyxscGRkc2QsbHBkc2YsbHB1bmspOwotCWlmIChUUkFDRV9PTihkZHJhdykpIHsKLQkJZnByaW50ZihzdGRlcnIsIlt3PSVsZCxoPSVsZCxmbGFncyAiLGxwZGRzZC0+ZHdXaWR0aCxscGRkc2QtPmR3SGVpZ2h0KTsKLQkJX2R1bXBfRERTRChscGRkc2QtPmR3RmxhZ3MpOwotCQlmcHJpbnRmKHN0ZGVyciwiY2FwcyAiKTsKLQkJX2R1bXBfRERTQ0FQUyhscGRkc2QtPmRkc0NhcHMuZHdDYXBzKTsKLQkJZnByaW50ZihzdGRlcnIsIl1cbiIpOwotCX0KLQotCVRSQUNFKGRkcmF3LCJ1c2luZyBzaGFyZWQgWEltYWdlIGZvciBhIHByaW1hcnkgc3VyZmFjZVxuIik7Ci0JKmxwZHNmID0gKExQRElSRUNURFJBV1NVUkZBQ0UpSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksSEVBUF9aRVJPX01FTU9SWSxzaXplb2YoSURpcmVjdERyYXdTdXJmYWNlKSk7Ci0JdGhpcy0+bHB2dGJsLT5mbkFkZFJlZih0aGlzKTsKLQkoKmxwZHNmKS0+cmVmID0gMTsKLQkoKmxwZHNmKS0+bHB2dGJsID0gKExQRElSRUNURFJBV1NVUkZBQ0VfVlRBQkxFKSZ4c2htX2RkczN2dDsKLQkoKmxwZHNmKS0+dC54c2htLmltYWdlID0gaW1nID0KLQkJWFNobUNyZWF0ZUltYWdlKGRpc3BsYXksIC8qRklYTUU6dmlzdWFsKi8wLCAvKkZJWE1FOmRlcHRoKi84LCBaUGl4bWFwLAotCQkJCQkJTlVMTCwgJigqbHBkc2YpLT50LnhzaG0uc2htaW5mbywKLQkJCQkJCS8qRklYTUU6d2lkdGgqLzY0MCwgLypGSVhNRTpoZWlnaHQqLzQ4MCk7Ci0JKCpscGRzZiktPnQueHNobS5zaG1pbmZvLnNobWlkID0gc2htaWQgPQotCQlzaG1nZXQoSVBDX1BSSVZBVEUsIGltZy0+Ynl0ZXNfcGVyX2xpbmUqaW1nLT5oZWlnaHQsIElQQ19DUkVBVHwwNzc3KTsKLQkoKmxwZHNmKS0+dC54c2htLnNobWluZm8uc2htYWRkciA9IGltZy0+ZGF0YSA9IHNobWF0KHNobWlkLCAwLCAwKTsKLQlUU1hTaG1BdHRhY2goZGlzcGxheSwgJigqbHBkc2YpLT50LnhzaG0uc2htaW5mbyk7Ci0JLyogUE9PTEUgRklYTUU6IFhTaG06IHRoaXMgd2lsbCBlYXNpbHkgYnJlYWsgKi8KLQkoKmxwZHNmKS0+cy5zdXJmYWNlID0gaW1nLT5kYXRhOwotCS8qIEVORCBGSVhNRTogWFNobSAqLwotCSgqbHBkc2YpLT5zLmxwaXRjaCA9IGltZy0+Ynl0ZXNfcGVyX2xpbmU7Ci0JKCpscGRzZiktPnMud2lkdGggPSBpbWctPndpZHRoOwotCSgqbHBkc2YpLT5zLmhlaWdodCA9IGltZy0+aGVpZ2h0OwotCSgqbHBkc2YpLT5zLmRkcmF3ID0gdGhpczsKLQkoKmxwZHNmKS0+cy5iYWNrYnVmZmVyID0gTlVMTDsKLQlyZXR1cm4gMDsKLSNlbHNlIC8qIGRlZmluZWQoSEFWRV9MSUJYWFNITSkgKi8KLQlyZXR1cm4gRV9VTkVYUEVDVEVEOwotI2VuZGlmIC8qIGRlZmluZWQoSEFWRV9MSUJYWFNITSkgKi8KLX0KLQotc3RhdGljIEhSRVNVTFQgV0lOQVBJIFhsaWJfSURpcmVjdERyYXdfQ3JlYXRlU3VyZmFjZSgKLQlMUERJUkVDVERSQVcgdGhpcyxMUEREU1VSRkFDRURFU0MgbHBkZHNkLExQRElSRUNURFJBV1NVUkZBQ0UgKmxwZHNmLElVbmtub3duICpscHVuaworc3RhdGljIEhSRVNVTFQgV0lOQVBJIFhsaWJfSURpcmVjdERyYXcyX0NyZWF0ZVN1cmZhY2UoCisJTFBESVJFQ1REUkFXMiB0aGlzLExQRERTVVJGQUNFREVTQyBscGRkc2QsTFBESVJFQ1REUkFXU1VSRkFDRSAqbHBkc2YsSVVua25vd24gKmxwdW5rCiApIHsKIAlYSW1hZ2UgKmltZzsKIAlUUkFDRShkZHJhdywgIiglcCktPkNyZWF0ZVN1cmZhY2UoJXAsJXAsJXApXG4iLApAQCAtMTM2MCwxMSArMTE2MywxNyBAQAogCX0gZWxzZSB7CiAJCVRSQUNFKGRkcmF3LCJ1c2luZyBzdGFuZGFyZCBYSW1hZ2UgZm9yIGEgcHJpbWFyeSBzdXJmYWNlXG4iKTsKIAkJCS8qIEZJWE1FOiAhOCBiaXQgaW1hZ2VzICovCisJCWlmICghKGxwZGRzZC0+ZHdGbGFncyAmIEREU0RfV0lEVEgpKQorCQkJbHBkZHNkLT5kd1dpZHRoCSA9IHRoaXMtPmQud2lkdGg7CisJCWlmICghKGxwZGRzZC0+ZHdGbGFncyAmIEREU0RfSEVJR0hUKSkKKwkJCWxwZGRzZC0+ZHdIZWlnaHQgPSB0aGlzLT5kLmhlaWdodDsKIAkJKCpscGRzZiktPnMuc3VyZmFjZSA9IEhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLEhFQVBfWkVST19NRU1PUlksbHBkZHNkLT5kd0hlaWdodCpscGRkc2QtPmR3V2lkdGgpOwotCQkoKmxwZHNmKS0+cy53aWR0aCA9IHRoaXMtPmQud2lkdGg7Ci0JCSgqbHBkc2YpLT5zLmhlaWdodCA9IHRoaXMtPmQuaGVpZ2h0OworCQkoKmxwZHNmKS0+cy53aWR0aAk9IGxwZGRzZC0+ZHdXaWR0aDsKKwkJKCpscGRzZiktPnMuaGVpZ2h0CT0gbHBkZHNkLT5kd0hlaWdodDsKIAl9CiAJKCpscGRzZiktPnMuZGRyYXcgPSB0aGlzOworCisJewogCSgqbHBkc2YpLT50LnhsaWIuaW1hZ2UgPSBpbWcgPQogCQlUU1hDcmVhdGVJbWFnZSgJZGlzcGxheSwKIAkJCQlEZWZhdWx0VmlzdWFsT2ZTY3JlZW4oc2NyZWVuKSwKQEAgLTEzNzksOCArMTE4OCw4IEBACiAJCS8qIEZJWE1FOiAhOCBiaXQgaW1hZ2VzICovCiAJCSk7CiAJCS8qIEVORCBGSVhNRTogWGxpYiAqLworCX0KIAkoKmxwZHNmKS0+cy5scGl0Y2ggPSBpbWctPmJ5dGVzX3Blcl9saW5lOwotCWFzc2VydChpbWcpOwogCWlmIChscGRkc2QtPmR3RmxhZ3MgJiBERFNEX0JBQ0tCVUZGRVJDT1VOVCkgewogCQlMUERJUkVDVERSQVdTVVJGQUNFMwliYWNrOwogCkBAIC0xNDE4LDE2ICsxMjI3LDE2IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBIUkVTVUxUIFdJTkFQSSBJRGlyZWN0RHJhd19EdXBsaWNhdGVTdXJmYWNlKAotCUxQRElSRUNURFJBVyB0aGlzLExQRElSRUNURFJBV1NVUkZBQ0Ugc3JjLExQRElSRUNURFJBV1NVUkZBQ0UgKmRzdAorc3RhdGljIEhSRVNVTFQgV0lOQVBJIElEaXJlY3REcmF3Ml9EdXBsaWNhdGVTdXJmYWNlKAorCUxQRElSRUNURFJBVzIgdGhpcyxMUERJUkVDVERSQVdTVVJGQUNFIHNyYyxMUERJUkVDVERSQVdTVVJGQUNFICpkc3QKICkgewogCUZJWE1FKGRkcmF3LCIoJXApLT4oJXAsJXApIHNpbXBseSBjb3BpZXNcbiIsdGhpcyxzcmMsZHN0KTsKIAkqZHN0ID0gc3JjOyAvKiBGSVhNRSAqLwogCXJldHVybiAwOwogfQogCi1zdGF0aWMgSFJFU1VMVCBXSU5BUEkgSURpcmVjdERyYXdfU2V0Q29vcGVyYXRpdmVMZXZlbCgKLQlMUERJUkVDVERSQVcgdGhpcyxIV05EMzIgaHduZCxEV09SRCBjb29wbGV2ZWwKK3N0YXRpYyBIUkVTVUxUIFdJTkFQSSBJRGlyZWN0RHJhdzJfU2V0Q29vcGVyYXRpdmVMZXZlbCgKKwlMUERJUkVDVERSQVcyIHRoaXMsSFdORDMyIGh3bmQsRFdPUkQgY29vcGxldmVsCiApIHsKIAlpbnQJaTsKIAljb25zdCBzdHJ1Y3QgewpAQCAtMTQ0NSw5ICsxMjU0LDcgQEAKIAkJRkUoRERTQ0xfQ1JFQVRFREVWSUNFV0lORE9XKQogCX07CiAKLQlUUkFDRShkZHJhdywiKCVwKS0+KCUwOGx4LCUwOGx4KVxuIiwKLQkJdGhpcywoRFdPUkQpaHduZCxjb29wbGV2ZWwKLQkpOworCVRSQUNFKGRkcmF3LCIoJXApLT4oJTA4bHgsJTA4bHgpXG4iLHRoaXMsKERXT1JEKWh3bmQsY29vcGxldmVsKTsKIAlpZihUUkFDRV9PTihkZHJhdykpewogCSAgZGJnX2RlY2xfc3RyKGRkcmF3LCA1MTIpOwogCSAgZm9yIChpPTA7aTxzaXplb2YoZmxhZ21hcCkvc2l6ZW9mKGZsYWdtYXBbMF0pO2krKykKQEAgLTE0NTUsNyArMTI2Miw3IEBACiAJICAgICAgZHNwcmludGYoZGRyYXcsICIlcyAiLCBmbGFnbWFwW2ldLm5hbWUpOwogCSAgVFJBQ0UoZGRyYXcsIgljb29wZXJhdGl2ZSBsZXZlbCAlc1xuIiwgZGJnX3N0cihkZHJhdykpOwogCX0KLQl0aGlzLT5kLm1haW53aW5kb3cgPSBod25kOworLyoJdGhpcy0+ZC5tYWlud2luZG93ID0gaHduZDsqLwogCXJldHVybiAwOwogfQogCkBAIC0xNDkzLDkgKzEzMDAsOSBAQAogCSAqIGl0IHdvcmtzIGZvciB0aGUgbGlicmFyeSB0b28/CiAJICovCiAJVFNYRjg2REdBRGlyZWN0VmlkZW8oZGlzcGxheSxEZWZhdWx0U2NyZWVuKGRpc3BsYXkpLFhGODZER0FEaXJlY3RHcmFwaGljcyk7Ci0vKgotCVRTWEY4NkRHQVNldFZpZXdQb3J0KGRpc3BsYXksRGVmYXVsdFNjcmVlbihkaXNwbGF5KSwwLHRoaXMtPmQuZmJfaGVpZ2h0KTsKLSAqLworI2lmZGVmIERJQUJMT19IQUNLCisJVFNYRjg2REdBU2V0Vmlld1BvcnQoZGlzcGxheSxEZWZhdWx0U2NyZWVuKGRpc3BsYXkpLDAsdGhpcy0+ZS5kZ2EuZmJfaGVpZ2h0KTsKKyNlbmRpZgogCiAjaWZkZWYgUkVTVE9SRV9TSUdOQUxTCiAJU0lHTkFMX0luaXRFbXVsYXRvcigpOwpAQCAtMTUwNiw0NCArMTMxMyw2IEBACiAjZW5kaWYgLyogZGVmaW5lZChIQVZFX0xJQlhYRjg2REdBKSAqLwogfQogCi1zdGF0aWMgSFJFU1VMVCBXSU5BUEkgWFNobV9JRGlyZWN0RHJhd19TZXREaXNwbGF5TW9kZSgKLQlMUERJUkVDVERSQVcgdGhpcyxEV09SRCB3aWR0aCxEV09SRCBoZWlnaHQsRFdPUkQgZGVwdGgKLSkgewotI2lmZGVmIEhBVkVfTElCWFhTSE0KLQlpbnQJaSwqZGVwdGhzLGRlcGNvdW50OwotCWNoYXIJYnVmWzIwMF07Ci0KLQlUUkFDRShkZHJhdywgIiglcCktPlNldERpc3BsYXlNb2RlKCVsZCwlbGQsJWxkKVxuIiwKLQkJICAgICAgdGhpcywgd2lkdGgsIGhlaWdodCwgZGVwdGgpOwotCi0JZGVwdGhzID0gVFNYTGlzdERlcHRocyhkaXNwbGF5LERlZmF1bHRTY3JlZW4oZGlzcGxheSksJmRlcGNvdW50KTsKLQlmb3IgKGk9MDtpPGRlcGNvdW50O2krKykKLQkJaWYgKGRlcHRoc1tpXT09ZGVwdGgpCi0JCQlicmVhazsKLQlUU1hGcmVlKGRlcHRocyk7Ci0JaWYgKGk9PWRlcGNvdW50KSB7Lyogbm90IGZvdW5kICovCi0JCXNwcmludGYoYnVmLCJTZXREaXNwbGF5TW9kZSh3PSVsZCxoPSVsZCxkPSVsZCksIHVuc3VwcG9ydGVkIGRlcHRoISIsd2lkdGgsaGVpZ2h0LGRlcHRoKTsKLQkJTWVzc2FnZUJveDMyQSgwLGJ1ZiwiV0lORSBEaXJlY3REcmF3IixNQl9PS3xNQl9JQ09OU1RPUCk7Ci0JCXJldHVybiBEREVSUl9VTlNVUFBPUlRFRE1PREU7Ci0JfQotCWlmICh0aGlzLT5kLndpZHRoIDwgd2lkdGgpIHsKLQkJc3ByaW50ZihidWYsIlNldERpc3BsYXlNb2RlKHc9JWxkLGg9JWxkLGQ9JWxkKSwgd2lkdGggJWxkIGV4Y2VlZHMgZnJhbWVidWZmZXIgd2lkdGggJWxkIix3aWR0aCxoZWlnaHQsZGVwdGgsd2lkdGgsdGhpcy0+ZC53aWR0aCk7Ci0JCU1lc3NhZ2VCb3gzMkEoMCxidWYsIldJTkUgRGlyZWN0RHJhdyIsTUJfT0t8TUJfSUNPTlNUT1ApOwotCQlyZXR1cm4gRERFUlJfVU5TVVBQT1JURURNT0RFOwotCX0KLQl0aGlzLT5kLndpZHRoCT0gd2lkdGg7Ci0JdGhpcy0+ZC5oZWlnaHQJPSBoZWlnaHQ7Ci0JLyogYWRqdXN0IGZiX2hlaWdodCwgc28gd2UgZG9uJ3Qgb3ZlcmxhcCAqLwotCWlmICh0aGlzLT5lLmRnYS5mYl9oZWlnaHQgPCBoZWlnaHQpCi0JCXRoaXMtPmUuZGdhLmZiX2hlaWdodCA9IGhlaWdodDsKLQl0aGlzLT5kLmRlcHRoCT0gZGVwdGg7Ci0JLyogRU5EIEZJWE1FOiBYU2htICovCi0JcmV0dXJuIDA7Ci0jZWxzZSAvKiBkZWZpbmVkKEhBVkVfTElCWFhTSE0pICovCi0JcmV0dXJuIEVfVU5FWFBFQ1RFRDsKLSNlbmRpZiAvKiBkZWZpbmVkKEhBVkVfTElCWFhTSE0pICovCi19Ci0KIHN0YXRpYyBIUkVTVUxUIFdJTkFQSSBYbGliX0lEaXJlY3REcmF3X1NldERpc3BsYXlNb2RlKAogCUxQRElSRUNURFJBVyB0aGlzLERXT1JEIHdpZHRoLERXT1JEIGhlaWdodCxEV09SRCBkZXB0aAogKSB7CkBAIC0xNTgxLDYgKzEzNTAsOCBAQAogCQkwLAogCQlOVUxMCiAJKTsKKwlTZXRXaW5kb3dMb25nMzJBKHRoaXMtPmUueGxpYi53aW5kb3csMCwoTE9ORyl0aGlzKTsKKwl0aGlzLT5lLnhsaWIucGFpbnRhYmxlID0gMTsKIAlTaG93V2luZG93MzIodGhpcy0+ZS54bGliLndpbmRvdyxUUlVFKTsKIAlVcGRhdGVXaW5kb3czMih0aGlzLT5lLnhsaWIud2luZG93KTsKIAlhc3NlcnQodGhpcy0+ZS54bGliLndpbmRvdyk7CkBAIC0xNTk0LDggKzEzNjUsOCBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgSFJFU1VMVCBXSU5BUEkgREdBX0lEaXJlY3REcmF3X0dldENhcHMoCi0JTFBESVJFQ1REUkFXIHRoaXMsTFBERENBUFMgY2FwczEsTFBERENBUFMgY2FwczIKK3N0YXRpYyBIUkVTVUxUIFdJTkFQSSBER0FfSURpcmVjdERyYXcyX0dldENhcHMoCisJTFBESVJFQ1REUkFXMiB0aGlzLExQRERDQVBTIGNhcHMxLExQRERDQVBTIGNhcHMyCiApIHsKICNpZmRlZiBIQVZFX0xJQlhYRjg2REdBCiAJVFJBQ0UoZGRyYXcsIiglcCktPkdldENhcHMoJXAsJXApXG4iLHRoaXMsY2FwczEsY2FwczIpOwpAQCAtMTYxMywyOSArMTM4NCw4IEBACiAjZW5kaWYgLyogZGVmaW5lZChIQVZFX0xJQlhYRjg2REdBKSAqLwogfQogCi1zdGF0aWMgSFJFU1VMVCBXSU5BUEkgWFNobV9JRGlyZWN0RHJhd19HZXRDYXBzKAotCUxQRElSRUNURFJBVyB0aGlzLExQRERDQVBTIGNhcHMxLExQRERDQVBTIGNhcHMyCi0pICB7Ci0jaWZkZWYgSEFWRV9MSUJYWFNITQotCVRSQUNFKGRkcmF3LCIoJXApLT5HZXRDYXBzKCVwLCVwKVxuIix0aGlzLGNhcHMxLGNhcHMyKTsKLQkvKiBGSVhNRTogWFNobSAqLwotCWNhcHMxLT5kd1ZpZE1lbVRvdGFsID0gMjA0OCoxMDI0OwotCWNhcHMxLT5kd0NhcHMgPSAweGZmZmZmZmZmJn4oRERDQVBTX0JBTktTV0lUQ0hFRCk7CQkvKiB3ZSBjYW4gZG8gYW55dGhpbmcgKi8KLQljYXBzMS0+ZGRzQ2Fwcy5kd0NhcHMgPSAweGZmZmZmZmZmOwkvKiB3ZSBjYW4gZG8gYW55dGhpbmcgKi8KLQlpZiAoY2FwczIpIHsKLQkJY2FwczItPmR3VmlkTWVtVG90YWwgPSAyMDQ4KjEwMjQ7Ci0JCWNhcHMyLT5kd0NhcHMgPSAweGZmZmZmZmZmJn4oRERDQVBTX0JBTktTV0lUQ0hFRCk7CQkvKiB3ZSBjYW4gZG8gYW55dGhpbmcgKi8KLQkJY2FwczItPmRkc0NhcHMuZHdDYXBzID0gMHhmZmZmZmZmZjsJLyogd2UgY2FuIGRvIGFueXRoaW5nICovCi0JfQotCS8qIEVORCBGSVhNRTogWFNobSAqLwotCXJldHVybiAwOwotI2Vsc2UgLyogZGVmaW5lZChIQVZFX0xJQlhYU0hNKSAqLwotCXJldHVybiBFX1VORVhQRUNURUQ7Ci0jZW5kaWYgLyogZGVmaW5lZChIQVZFX0xJQlhYU0hNKSAqLwotfQotCi1zdGF0aWMgSFJFU1VMVCBXSU5BUEkgWGxpYl9JRGlyZWN0RHJhd19HZXRDYXBzKAotCUxQRElSRUNURFJBVyB0aGlzLExQRERDQVBTIGNhcHMxLExQRERDQVBTIGNhcHMyCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkgWGxpYl9JRGlyZWN0RHJhdzJfR2V0Q2FwcygKKwlMUERJUkVDVERSQVcyIHRoaXMsTFBERENBUFMgY2FwczEsTFBERENBUFMgY2FwczIKICkgIHsKIAlUUkFDRShkZHJhdywiKCVwKS0+R2V0Q2FwcyglcCwlcClcbiIsdGhpcyxjYXBzMSxjYXBzMik7CiAJLyogRklYTUU6IFhsaWIgKi8KQEAgLTE2NTEsOCArMTQwMSw4IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBIUkVTVUxUIFdJTkFQSSBJRGlyZWN0RHJhd19DcmVhdGVDbGlwcGVyKAotCUxQRElSRUNURFJBVyB0aGlzLERXT1JEIHgsTFBESVJFQ1REUkFXQ0xJUFBFUiAqbHBkZGNsaXAsTFBVTktOT1dOIGxwdW5rCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkgSURpcmVjdERyYXcyX0NyZWF0ZUNsaXBwZXIoCisJTFBESVJFQ1REUkFXMiB0aGlzLERXT1JEIHgsTFBESVJFQ1REUkFXQ0xJUFBFUiAqbHBkZGNsaXAsTFBVTktOT1dOIGxwdW5rCiApIHsKIAlGSVhNRShkZHJhdywiKCVwKS0+KCUwOGx4LCVwLCVwKSxzdHViIVxuIiwKIAkJdGhpcyx4LGxwZGRjbGlwLGxwdW5rCkBAIC0xNjYzLDEzICsxNDEzLDEzIEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBIUkVTVUxUIFdJTkFQSSBjb21tb25fSURpcmVjdERyYXdfQ3JlYXRlUGFsZXR0ZSgKLQlMUERJUkVDVERSQVcgdGhpcyxEV09SRCB4LExQUEFMRVRURUVOVFJZIHBhbGVudCxMUERJUkVDVERSQVdQQUxFVFRFICpscGRkcGFsLExQVU5LTk9XTiBscHVuaworc3RhdGljIEhSRVNVTFQgV0lOQVBJIGNvbW1vbl9JRGlyZWN0RHJhdzJfQ3JlYXRlUGFsZXR0ZSgKKwlMUERJUkVDVERSQVcyIHRoaXMsRFdPUkQgeCxMUFBBTEVUVEVFTlRSWSBwYWxlbnQsTFBESVJFQ1REUkFXUEFMRVRURSAqbHBkZHBhbCxMUFVOS05PV04gbHB1bmsKICkgewogCSpscGRkcGFsID0gKExQRElSRUNURFJBV1BBTEVUVEUpSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksSEVBUF9aRVJPX01FTU9SWSxzaXplb2YoSURpcmVjdERyYXdQYWxldHRlKSk7CiAJaWYgKCpscGRkcGFsID09IE5VTEwpIHJldHVybiBFX09VVE9GTUVNT1JZOwogCSgqbHBkZHBhbCktPnJlZiA9IDE7Ci0JKCpscGRkcGFsKS0+ZGRyYXcgPSB0aGlzOworCSgqbHBkZHBhbCktPmRkcmF3ID0gKExQRElSRUNURFJBVyl0aGlzOwogCSgqbHBkZHBhbCktPmluc3RhbGxlZCA9IDA7CiAJaWYgKHRoaXMtPmQuZGVwdGg8PTgpIHsKIAkJKCpscGRkcGFsKS0+Y20gPSBUU1hDcmVhdGVDb2xvcm1hcChkaXNwbGF5LERlZmF1bHRSb290V2luZG93KGRpc3BsYXkpLERlZmF1bHRWaXN1YWxPZlNjcmVlbihzY3JlZW4pLEFsbG9jQWxsKTsKQEAgLTE2ODAsNDMgKzE0MzAsMzIgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIEhSRVNVTFQgV0lOQVBJIERHQV9JRGlyZWN0RHJhd19DcmVhdGVQYWxldHRlKAotCUxQRElSRUNURFJBVyB0aGlzLERXT1JEIHgsTFBQQUxFVFRFRU5UUlkgcGFsZW50LExQRElSRUNURFJBV1BBTEVUVEUgKmxwZGRwYWwsTFBVTktOT1dOIGxwdW5rCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkgREdBX0lEaXJlY3REcmF3Ml9DcmVhdGVQYWxldHRlKAorCUxQRElSRUNURFJBVzIgdGhpcyxEV09SRCB4LExQUEFMRVRURUVOVFJZIHBhbGVudCxMUERJUkVDVERSQVdQQUxFVFRFICpscGRkcGFsLExQVU5LTk9XTiBscHVuawogKSB7CiAJSFJFU1VMVCByZXM7Ci0JVFJBQ0UoZGRyYXcsIiglcCktPiglMDhseCwlcCwlcCwlcClcbiIsCi0JCXRoaXMseCxwYWxlbnQsbHBkZHBhbCxscHVuawotCSk7Ci0JcmVzID0gY29tbW9uX0lEaXJlY3REcmF3X0NyZWF0ZVBhbGV0dGUodGhpcyx4LHBhbGVudCxscGRkcGFsLGxwdW5rKTsKKwlUUkFDRShkZHJhdywiKCVwKS0+KCUwOGx4LCVwLCVwLCVwKVxuIix0aGlzLHgscGFsZW50LGxwZGRwYWwsbHB1bmspOworCXJlcyA9IGNvbW1vbl9JRGlyZWN0RHJhdzJfQ3JlYXRlUGFsZXR0ZSh0aGlzLHgscGFsZW50LGxwZGRwYWwsbHB1bmspOwogCWlmIChyZXMgIT0gMCkgcmV0dXJuIHJlczsKIAkoKmxwZGRwYWwpLT5scHZ0YmwgPSAmZGdhX2RkcGFsdnQ7CiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBIUkVTVUxUIFdJTkFQSSBYU2htX0lEaXJlY3REcmF3X0NyZWF0ZVBhbGV0dGUoCi0JTFBESVJFQ1REUkFXIHRoaXMsRFdPUkQgeCxMUFBBTEVUVEVFTlRSWSBwYWxlbnQsTFBESVJFQ1REUkFXUEFMRVRURSAqbHBkZHBhbCxMUFVOS05PV04gbHB1bmsKLSkgewotCUhSRVNVTFQgcmVzOwotCVRSQUNFKGRkcmF3LCIoJXApLT4oJTA4bHgsJXAsJXAsJXApXG4iLHRoaXMseCxwYWxlbnQsbHBkZHBhbCxscHVuayk7Ci0JcmVzID0gY29tbW9uX0lEaXJlY3REcmF3X0NyZWF0ZVBhbGV0dGUodGhpcyx4LHBhbGVudCxscGRkcGFsLGxwdW5rKTsKLQlpZiAocmVzICE9IDApIHJldHVybiByZXM7Ci0JKCpscGRkcGFsKS0+bHB2dGJsID0gJnhzaG1fZGRwYWx2dDsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIEhSRVNVTFQgV0lOQVBJIFhsaWJfSURpcmVjdERyYXdfQ3JlYXRlUGFsZXR0ZSgKLQlMUERJUkVDVERSQVcgdGhpcyxEV09SRCB4LExQUEFMRVRURUVOVFJZIHBhbGVudCxMUERJUkVDVERSQVdQQUxFVFRFICpscGRkcGFsLExQVU5LTk9XTiBscHVuaworc3RhdGljIEhSRVNVTFQgV0lOQVBJIFhsaWJfSURpcmVjdERyYXcyX0NyZWF0ZVBhbGV0dGUoCisJTFBESVJFQ1REUkFXMiB0aGlzLERXT1JEIHgsTFBQQUxFVFRFRU5UUlkgcGFsZW50LExQRElSRUNURFJBV1BBTEVUVEUgKmxwZGRwYWwsTFBVTktOT1dOIGxwdW5rCiApIHsKIAlUUkFDRShkZHJhdywiKCVwKS0+KCUwOGx4LCVwLCVwLCVwKVxuIix0aGlzLHgscGFsZW50LGxwZGRwYWwsbHB1bmspOwogCSpscGRkcGFsID0gKExQRElSRUNURFJBV1BBTEVUVEUpSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksSEVBUF9aRVJPX01FTU9SWSxzaXplb2YoSURpcmVjdERyYXdQYWxldHRlKSk7CiAJaWYgKCpscGRkcGFsID09IE5VTEwpIHJldHVybiBFX09VVE9GTUVNT1JZOwogCSgqbHBkZHBhbCktPnJlZiA9IDE7CiAJKCpscGRkcGFsKS0+aW5zdGFsbGVkID0gMDsKLQkoKmxwZGRwYWwpLT5kZHJhdyA9IHRoaXM7CisJKCpscGRkcGFsKS0+ZGRyYXcgPSAoTFBESVJFQ1REUkFXKXRoaXM7CiAJaWYgKHRoaXMtPmQuZGVwdGg8PTgpIHsKIAkJKCpscGRkcGFsKS0+Y20gPSBUU1hDcmVhdGVDb2xvcm1hcChkaXNwbGF5LHRoaXMtPmUueGxpYi5kcmF3YWJsZSxEZWZhdWx0VmlzdWFsT2ZTY3JlZW4oc2NyZWVuKSxBbGxvY0FsbCk7Ci0JCVRTWEluc3RhbGxDb2xvcm1hcChkaXNwbGF5LCgqbHBkZHBhbCktPmNtKTsKLQkJVFNYU2V0V2luZG93Q29sb3JtYXAoZGlzcGxheSx0aGlzLT5lLnhsaWIuZHJhd2FibGUsKCpscGRkcGFsKS0+Y20pOworCQkvKiBsYXRlciBpbnN0YWxsZWQgLi4uIAorCQkgKiBUU1hJbnN0YWxsQ29sb3JtYXAoZGlzcGxheSwoKmxwZGRwYWwpLT5jbSk7CisJCSAqIFRTWFNldFdpbmRvd0NvbG9ybWFwKGRpc3BsYXksdGhpcy0+ZS54bGliLmRyYXdhYmxlLCgqbHBkZHBhbCktPmNtKTsKKwkJICovCiAJfSBlbHNlCiAJCS8qIHdlIGRvbid0IHdhbnQgcGFsZXR0ZXMgaW4gaGljb2xvciBvciB0cnVlY29sb3IgKi8KIAkJKCpscGRkcGFsKS0+Y20gPSAwOwpAQCAtMTcyNCw3ICsxNDYzLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIEhSRVNVTFQgV0lOQVBJIERHQV9JRGlyZWN0RHJhd19SZXN0b3JlRGlzcGxheU1vZGUoTFBESVJFQ1REUkFXIHRoaXMpIHsKK3N0YXRpYyBIUkVTVUxUIFdJTkFQSSBER0FfSURpcmVjdERyYXcyX1Jlc3RvcmVEaXNwbGF5TW9kZShMUERJUkVDVERSQVcyIHRoaXMpIHsKICNpZmRlZiBIQVZFX0xJQlhYRjg2REdBCiAJVFJBQ0UoZGRyYXcsICIoJXApLT4oKVxuIix0aGlzKTsKIAlTbGVlcCgxMDAwKTsKQEAgLTE3MzgsMzMgKzE0NzcsMjQgQEAKICNlbmRpZgogfQogCi1zdGF0aWMgSFJFU1VMVCBXSU5BUEkgWFNobV9JRGlyZWN0RHJhd19SZXN0b3JlRGlzcGxheU1vZGUoTFBESVJFQ1REUkFXIHRoaXMpIHsKLSNpZmRlZiBIQVZFX0xJQlhYRjg2REdBCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkgWGxpYl9JRGlyZWN0RHJhdzJfUmVzdG9yZURpc3BsYXlNb2RlKExQRElSRUNURFJBVzIgdGhpcykgewogCVRSQUNFKGRkcmF3LCAiKCVwKS0+UmVzdG9yZURpc3BsYXlNb2RlKClcbiIsIHRoaXMpOwogCVNsZWVwKDEwMDApOwogCXJldHVybiAwOwotI2Vsc2UgLyogZGVmaW5lZChIQVZFX0xJQlhYRjg2REdBKSAqLwotCXJldHVybiBFX1VORVhQRUNURUQ7Ci0jZW5kaWYKIH0KIAotc3RhdGljIEhSRVNVTFQgV0lOQVBJIFhsaWJfSURpcmVjdERyYXdfUmVzdG9yZURpc3BsYXlNb2RlKExQRElSRUNURFJBVyB0aGlzKSB7Ci0JVFJBQ0UoZGRyYXcsICIoJXApLT5SZXN0b3JlRGlzcGxheU1vZGUoKVxuIiwgdGhpcyk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBIUkVTVUxUIFdJTkFQSSBJRGlyZWN0RHJhd19XYWl0Rm9yVmVydGljYWxCbGFuaygKLQlMUERJUkVDVERSQVcgdGhpcyxEV09SRCB4LEhBTkRMRTMyIGgKK3N0YXRpYyBIUkVTVUxUIFdJTkFQSSBJRGlyZWN0RHJhdzJfV2FpdEZvclZlcnRpY2FsQmxhbmsoCisJTFBESVJFQ1REUkFXMiB0aGlzLERXT1JEIHgsSEFORExFMzIgaAogKSB7CiAJVFJBQ0UoZGRyYXcsIiglcCktPigweCUwOGx4LDB4JTA4eClcbiIsdGhpcyx4LGgpOwogCXJldHVybiAwOwogfQogCi1zdGF0aWMgVUxPTkcgV0lOQVBJIElEaXJlY3REcmF3X0FkZFJlZihMUERJUkVDVERSQVcgdGhpcykgeworc3RhdGljIFVMT05HIFdJTkFQSSBJRGlyZWN0RHJhdzJfQWRkUmVmKExQRElSRUNURFJBVzIgdGhpcykgewogCXJldHVybiArKyh0aGlzLT5yZWYpOwogfQogCi1zdGF0aWMgVUxPTkcgV0lOQVBJIERHQV9JRGlyZWN0RHJhd19SZWxlYXNlKExQRElSRUNURFJBVyB0aGlzKSB7CitzdGF0aWMgVUxPTkcgV0lOQVBJIERHQV9JRGlyZWN0RHJhdzJfUmVsZWFzZShMUERJUkVDVERSQVcyIHRoaXMpIHsKICNpZmRlZiBIQVZFX0xJQlhYRjg2REdBCiAJaWYgKCEtLSh0aGlzLT5yZWYpKSB7CiAJCVRTWEY4NkRHQURpcmVjdFZpZGVvKGRpc3BsYXksRGVmYXVsdFNjcmVlbihkaXNwbGF5KSwwKTsKQEAgLTE3NzgsMjYgKzE1MDgsMTcgQEAKIAlyZXR1cm4gdGhpcy0+cmVmOwogfQogCi1zdGF0aWMgVUxPTkcgV0lOQVBJIFhTaG1fSURpcmVjdERyYXdfUmVsZWFzZShMUERJUkVDVERSQVcgdGhpcykgewotI2lmZGVmIEhBVkVfTElCWFhTSE0KK3N0YXRpYyBVTE9ORyBXSU5BUEkgWGxpYl9JRGlyZWN0RHJhdzJfUmVsZWFzZShMUERJUkVDVERSQVcyIHRoaXMpIHsKIAlpZiAoIS0tKHRoaXMtPnJlZikpIHsKIAkJSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwwLHRoaXMpOwogCQlyZXR1cm4gMDsKIAl9Ci0jZW5kaWYgLyogZGVmaW5lZChIQVZFX0xJQlhYU0hNKSAqLworCS8qIEZJWE1FOiBkZXN0cm95IHdpbmRvdyAuLi4gKi8KIAlyZXR1cm4gdGhpcy0+cmVmOwogfQogCi1zdGF0aWMgVUxPTkcgV0lOQVBJIFhsaWJfSURpcmVjdERyYXdfUmVsZWFzZShMUERJUkVDVERSQVcgdGhpcykgewotCWlmICghLS0odGhpcy0+cmVmKSkgewotCQlIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLDAsdGhpcyk7Ci0JCXJldHVybiAwOwotCX0KLQlyZXR1cm4gdGhpcy0+cmVmOwotfQotCi1zdGF0aWMgSFJFU1VMVCBXSU5BUEkgREdBX0lEaXJlY3REcmF3X1F1ZXJ5SW50ZXJmYWNlKAotCUxQRElSRUNURFJBVyB0aGlzLFJFRklJRCByZWZpaWQsTFBWT0lEICpvYmoKK3N0YXRpYyBIUkVTVUxUIFdJTkFQSSBER0FfSURpcmVjdERyYXcyX1F1ZXJ5SW50ZXJmYWNlKAorCUxQRElSRUNURFJBVzIgdGhpcyxSRUZJSUQgcmVmaWlkLExQVk9JRCAqb2JqCiApIHsKIAljaGFyICAgIHhyZWZpaWRbNTBdOwogCkBAIC0xODA5LDEyICsxNTMwLDEzIEBACiAJCXJldHVybiAwOwogCX0KIAlpZiAoIW1lbWNtcCgmSUlEX0lEaXJlY3REcmF3LHJlZmlpZCxzaXplb2YoSUlEX0lEaXJlY3REcmF3KSkpIHsKLQkJKm9iaiA9IHRoaXM7CisJCXRoaXMtPmxwdnRibCA9IChMUERJUkVDVERSQVcyX1ZUQUJMRSkmZGdhX2RkdnQ7CiAJCXRoaXMtPmxwdnRibC0+Zm5BZGRSZWYodGhpcyk7CisJCSpvYmogPSB0aGlzOwogCQlyZXR1cm4gMDsKIAl9CiAJaWYgKCFtZW1jbXAoJklJRF9JRGlyZWN0RHJhdzIscmVmaWlkLHNpemVvZihJSURfSURpcmVjdERyYXcyKSkpIHsKLQkJdGhpcy0+bHB2dGJsID0gKExQRElSRUNURFJBV19WVEFCTEUpJmRnYV9kZDJ2dDsKKwkJdGhpcy0+bHB2dGJsID0gKExQRElSRUNURFJBVzJfVlRBQkxFKSZkZ2FfZGQydnQ7CiAJCXRoaXMtPmxwdnRibC0+Zm5BZGRSZWYodGhpcyk7CiAJCSpvYmogPSB0aGlzOwogCQlyZXR1cm4gMDsKQEAgLTE4MjQsNyArMTU0Niw3IEBACiAKIAkJZDNkID0gSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksMCxzaXplb2YoKmQzZCkpOwogCQlkM2QtPnJlZiA9IDE7Ci0JCWQzZC0+ZGRyYXcgPSB0aGlzOworCQlkM2QtPmRkcmF3ID0gKExQRElSRUNURFJBVyl0aGlzOwogCQl0aGlzLT5scHZ0YmwtPmZuQWRkUmVmKHRoaXMpOwogCQlkM2QtPmxwdnRibCA9ICZkM2R2dDsKIAkJKm9iaiA9IGQzZDsKQEAgLTE4MzUsNyArMTU1Nyw3IEBACiAKIAkJZDNkID0gSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksMCxzaXplb2YoKmQzZCkpOwogCQlkM2QtPnJlZiA9IDE7Ci0JCWQzZC0+ZGRyYXcgPSB0aGlzOworCQlkM2QtPmRkcmF3ID0gKExQRElSRUNURFJBVyl0aGlzOwogCQl0aGlzLT5scHZ0YmwtPmZuQWRkUmVmKHRoaXMpOwogCQlkM2QtPmxwdnRibCA9ICZkM2QydnQ7CiAJCSpvYmogPSBkM2Q7CkBAIC0xODQ1LDU3ICsxNTY3LDggQEAKICAgICAgICAgcmV0dXJuIE9MRV9FX0VOVU1fTk9NT1JFOwogfQogCi1zdGF0aWMgSFJFU1VMVCBXSU5BUEkgWFNobV9JRGlyZWN0RHJhd19RdWVyeUludGVyZmFjZSgKLQlMUERJUkVDVERSQVcgdGhpcyxSRUZJSUQgcmVmaWlkLExQVk9JRCAqb2JqCi0JKSB7Ci0JY2hhciAgICB4cmVmaWlkWzUwXTsKLQotCVdJTkVfU3RyaW5nRnJvbUNMU0lEKChMUENMU0lEKXJlZmlpZCx4cmVmaWlkKTsKLQlUUkFDRShkZHJhdywiKCVwKS0+KCVzLCVwKVxuIix0aGlzLHhyZWZpaWQsb2JqKTsKLQlpZiAoIW1lbWNtcCgmSUlEX0lVbmtub3duLHJlZmlpZCxzaXplb2YoSUlEX0lVbmtub3duKSkpIHsKLQkJKm9iaiA9IHRoaXM7Ci0JCXRoaXMtPmxwdnRibC0+Zm5BZGRSZWYodGhpcyk7Ci0JCXJldHVybiAwOwotCX0KLQlpZiAoIW1lbWNtcCgmSUlEX0lEaXJlY3REcmF3LHJlZmlpZCxzaXplb2YoSUlEX0lEaXJlY3REcmF3KSkpIHsKLQkJKm9iaiA9IHRoaXM7Ci0JCXRoaXMtPmxwdnRibC0+Zm5BZGRSZWYodGhpcyk7Ci0JCXJldHVybiAwOwotCX0KLQlpZiAoIW1lbWNtcCgmSUlEX0lEaXJlY3REcmF3MixyZWZpaWQsc2l6ZW9mKElJRF9JRGlyZWN0RHJhdzIpKSkgewotCQl0aGlzLT5scHZ0YmwgPSAoTFBESVJFQ1REUkFXX1ZUQUJMRSkmeHNobV9kZDJ2dDsKLQkJdGhpcy0+bHB2dGJsLT5mbkFkZFJlZih0aGlzKTsKLQkJKm9iaiA9IHRoaXM7Ci0JCXJldHVybiAwOwotCX0KLQlpZiAoIW1lbWNtcCgmSUlEX0lEaXJlY3QzRCxyZWZpaWQsc2l6ZW9mKElJRF9JRGlyZWN0M0QpKSkgewotCQlMUERJUkVDVDNECWQzZDsKLQotCQlkM2QgPSBIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwwLHNpemVvZigqZDNkKSk7Ci0JCWQzZC0+cmVmID0gMTsKLQkJZDNkLT5kZHJhdyA9IHRoaXM7Ci0JCXRoaXMtPmxwdnRibC0+Zm5BZGRSZWYodGhpcyk7Ci0JCWQzZC0+bHB2dGJsID0gJmQzZHZ0OwotCQkqb2JqID0gZDNkOwotCQlyZXR1cm4gMDsKLQl9Ci0JaWYgKCFtZW1jbXAoJklJRF9JRGlyZWN0M0QyLHJlZmlpZCxzaXplb2YoSUlEX0lEaXJlY3QzRCkpKSB7Ci0JCUxQRElSRUNUM0QyCWQzZDsKLQotCQlkM2QgPSBIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwwLHNpemVvZigqZDNkKSk7Ci0JCWQzZC0+cmVmID0gMTsKLQkJZDNkLT5kZHJhdyA9IHRoaXM7Ci0JCXRoaXMtPmxwdnRibC0+Zm5BZGRSZWYodGhpcyk7Ci0JCWQzZC0+bHB2dGJsID0gJmQzZDJ2dDsKLQkJKm9iaiA9IGQzZDsKLQkJcmV0dXJuIDA7Ci0JfQotCVdBUk4oZGRyYXcsIiglcCk6aW50ZXJmYWNlIGZvciBJSUQgJXMgX05PVF8gZm91bmQhXG4iLHRoaXMseHJlZmlpZCk7Ci0JcmV0dXJuIE9MRV9FX0VOVU1fTk9NT1JFOwotfQotCi1zdGF0aWMgSFJFU1VMVCBXSU5BUEkgWGxpYl9JRGlyZWN0RHJhd19RdWVyeUludGVyZmFjZSgKLQlMUERJUkVDVERSQVcgdGhpcyxSRUZJSUQgcmVmaWlkLExQVk9JRCAqb2JqCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkgWGxpYl9JRGlyZWN0RHJhdzJfUXVlcnlJbnRlcmZhY2UoCisJTFBESVJFQ1REUkFXMiB0aGlzLFJFRklJRCByZWZpaWQsTFBWT0lEICpvYmoKICkgewogCWNoYXIgICAgeHJlZmlpZFs1MF07CiAKQEAgLTE5MDcsMTIgKzE1ODAsMTMgQEAKIAkJcmV0dXJuIDA7CiAJfQogCWlmICghbWVtY21wKCZJSURfSURpcmVjdERyYXcscmVmaWlkLHNpemVvZihJSURfSURpcmVjdERyYXcpKSkgewotCQkqb2JqID0gdGhpczsKKwkJdGhpcy0+bHB2dGJsID0gKExQRElSRUNURFJBVzJfVlRBQkxFKSZ4bGliX2RkdnQ7CiAJCXRoaXMtPmxwdnRibC0+Zm5BZGRSZWYodGhpcyk7CisJCSpvYmogPSB0aGlzOwogCQlyZXR1cm4gMDsKIAl9CiAJaWYgKCFtZW1jbXAoJklJRF9JRGlyZWN0RHJhdzIscmVmaWlkLHNpemVvZihJSURfSURpcmVjdERyYXcyKSkpIHsKLQkJdGhpcy0+bHB2dGJsID0gKExQRElSRUNURFJBV19WVEFCTEUpJnhsaWJfZGQydnQ7CisJCXRoaXMtPmxwdnRibCA9IChMUERJUkVDVERSQVcyX1ZUQUJMRSkmeGxpYl9kZDJ2dDsKIAkJdGhpcy0+bHB2dGJsLT5mbkFkZFJlZih0aGlzKTsKIAkJKm9iaiA9IHRoaXM7CiAJCXJldHVybiAwOwpAQCAtMTkyMiw3ICsxNTk2LDcgQEAKIAogCQlkM2QgPSBIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwwLHNpemVvZigqZDNkKSk7CiAJCWQzZC0+cmVmID0gMTsKLQkJZDNkLT5kZHJhdyA9IHRoaXM7CisJCWQzZC0+ZGRyYXcgPSAoTFBESVJFQ1REUkFXKXRoaXM7CiAJCXRoaXMtPmxwdnRibC0+Zm5BZGRSZWYodGhpcyk7CiAJCWQzZC0+bHB2dGJsID0gJmQzZHZ0OwogCQkqb2JqID0gZDNkOwpAQCAtMTkzMyw3ICsxNjA3LDcgQEAKIAogCQlkM2QgPSBIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwwLHNpemVvZigqZDNkKSk7CiAJCWQzZC0+cmVmID0gMTsKLQkJZDNkLT5kZHJhdyA9IHRoaXM7CisJCWQzZC0+ZGRyYXcgPSAoTFBESVJFQ1REUkFXKXRoaXM7CiAJCXRoaXMtPmxwdnRibC0+Zm5BZGRSZWYodGhpcyk7CiAJCWQzZC0+bHB2dGJsID0gJmQzZDJ2dDsKIAkJKm9iaiA9IGQzZDsKQEAgLTE5NDMsMTYgKzE2MTcsMTYgQEAKICAgICAgICAgcmV0dXJuIE9MRV9FX0VOVU1fTk9NT1JFOwogfQogCi1zdGF0aWMgSFJFU1VMVCBXSU5BUEkgSURpcmVjdERyYXdfR2V0VmVydGljYWxCbGFua1N0YXR1cygKLQlMUERJUkVDVERSQVcgdGhpcyxCT09MMzIgKnN0YXR1cworc3RhdGljIEhSRVNVTFQgV0lOQVBJIElEaXJlY3REcmF3Ml9HZXRWZXJ0aWNhbEJsYW5rU3RhdHVzKAorCUxQRElSRUNURFJBVzIgdGhpcyxCT09MMzIgKnN0YXR1cwogKSB7CiAgICAgICAgIFRSQUNFKGRkcmF3LCIoJXApLT4oJXApXG4iLHRoaXMsc3RhdHVzKTsKIAkqc3RhdHVzID0gVFJVRTsKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIEhSRVNVTFQgV0lOQVBJIElEaXJlY3REcmF3X0VudW1EaXNwbGF5TW9kZXMoCi0JTFBESVJFQ1REUkFXIHRoaXMsRFdPUkQgZHdGbGFncyxMUEREU1VSRkFDRURFU0MgbHBkZHNmZCxMUFZPSUQgY29udGV4dCxMUERERU5VTU1PREVTQ0FMTEJBQ0sgbW9kZXNjYgorc3RhdGljIEhSRVNVTFQgV0lOQVBJIElEaXJlY3REcmF3Ml9FbnVtRGlzcGxheU1vZGVzKAorCUxQRElSRUNURFJBVzIgdGhpcyxEV09SRCBkd0ZsYWdzLExQRERTVVJGQUNFREVTQyBscGRkc2ZkLExQVk9JRCBjb250ZXh0LExQRERFTlVNTU9ERVNDQUxMQkFDSyBtb2Rlc2NiCiApIHsKIAlERFNVUkZBQ0VERVNDCWRkc2ZkOwogCkBAIC0xOTg3LDggKzE2NjEsOCBAQAogCXJldHVybiBERF9PSzsKIH0KIAotc3RhdGljIEhSRVNVTFQgV0lOQVBJIERHQV9JRGlyZWN0RHJhd19HZXREaXNwbGF5TW9kZSgKLQlMUERJUkVDVERSQVcgdGhpcyxMUEREU1VSRkFDRURFU0MgbHBkZHNmZAorc3RhdGljIEhSRVNVTFQgV0lOQVBJIERHQV9JRGlyZWN0RHJhdzJfR2V0RGlzcGxheU1vZGUoCisJTFBESVJFQ1REUkFXMiB0aGlzLExQRERTVVJGQUNFREVTQyBscGRkc2ZkCiApIHsKICNpZmRlZiBIQVZFX0xJQlhYRjg2REdBCiAJVFJBQ0UoZGRyYXcsIiglcCktPiglcClcbiIsdGhpcyxscGRkc2ZkKTsKQEAgLTIwMDYsMjkgKzE2ODAsOCBAQAogI2VuZGlmIC8qIGRlZmluZWQoSEFWRV9MSUJYWEY4NkRHQSkgKi8KIH0KIAotc3RhdGljIEhSRVNVTFQgV0lOQVBJIFhTaG1fSURpcmVjdERyYXdfR2V0RGlzcGxheU1vZGUoCi0JTFBESVJFQ1REUkFXIHRoaXMsTFBERFNVUkZBQ0VERVNDIGxwZGRzZmQKLSkgewotI2lmZGVmIEhBVkVfTElCWFhTTQotCVRSQUNFKGRkcmF3LCIoJXApLT5HZXREaXNwbGF5TW9kZSglcClcbiIsdGhpcyxscGRkc2ZkKTsKLQlscGRkc2ZkLT5kd0ZsYWdzID0gRERTRF9IRUlHSFR8RERTRF9XSURUSHxERFNEX1BJVENIfEREU0RfQkFDS0JVRkZFUkNPVU5UfEREU0RfUElYRUxGT1JNQVR8RERTRF9DQVBTOwotCWxwZGRzZmQtPmR3SGVpZ2h0ID0gc2NyZWVuSGVpZ2h0OwotCWxwZGRzZmQtPmR3V2lkdGggPSBzY3JlZW5XaWR0aDsKLQkvKiBQT09MRSBGSVhNRTogWFNobSAqLwotCWxwZGRzZmQtPmxQaXRjaCA9IHRoaXMtPmUuZGdhLmZiX3dpZHRoKnRoaXMtPmQuZGVwdGgvODsKLQkvKiBFTkQgRklYTUU6IFhTaG0gKi8KLQlscGRkc2ZkLT5kd0JhY2tCdWZmZXJDb3VudCA9IDE7Ci0JbHBkZHNmZC0+eC5kd1JlZnJlc2hSYXRlID0gNjA7Ci0JbHBkZHNmZC0+ZGRzQ2Fwcy5kd0NhcHMgPSBERFNDQVBTX1BBTEVUVEU7Ci0JX2dldHBpeGVsZm9ybWF0KHRoaXMsJihscGRkc2ZkLT5kZHBmUGl4ZWxGb3JtYXQpKTsKLQlyZXR1cm4gRERfT0s7Ci0jZWxzZSAvKiBkZWZpbmVkKEhBVkVfTElCWFhTSE0pICovCi0JcmV0dXJuIEVfVU5FWFBFQ1RFRDsKLSNlbmRpZiAvKiBkZWZpbmVkKEhBVkVfTElCWFhTSE0pICovCi19Ci0KLXN0YXRpYyBIUkVTVUxUIFdJTkFQSSBYbGliX0lEaXJlY3REcmF3X0dldERpc3BsYXlNb2RlKAotCUxQRElSRUNURFJBVyB0aGlzLExQRERTVVJGQUNFREVTQyBscGRkc2ZkCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkgWGxpYl9JRGlyZWN0RHJhdzJfR2V0RGlzcGxheU1vZGUoCisJTFBESVJFQ1REUkFXMiB0aGlzLExQRERTVVJGQUNFREVTQyBscGRkc2ZkCiApIHsKIAlUUkFDRShkZHJhdywiKCVwKS0+R2V0RGlzcGxheU1vZGUoJXApXG4iLHRoaXMsbHBkZHNmZCk7CiAJbHBkZHNmZC0+ZHdGbGFncyA9IEREU0RfSEVJR0hUfEREU0RfV0lEVEh8RERTRF9QSVRDSHxERFNEX0JBQ0tCVUZGRVJDT1VOVHxERFNEX1BJWEVMRk9STUFUfEREU0RfQ0FQUzsKQEAgLTIwNDQsMTMgKzE2OTcsMTMgQEAKIAlyZXR1cm4gRERfT0s7CiB9CiAKLXN0YXRpYyBIUkVTVUxUIFdJTkFQSSBJRGlyZWN0RHJhd19GbGlwVG9HRElTdXJmYWNlKExQRElSRUNURFJBVyB0aGlzKSB7CitzdGF0aWMgSFJFU1VMVCBXSU5BUEkgSURpcmVjdERyYXcyX0ZsaXBUb0dESVN1cmZhY2UoTFBESVJFQ1REUkFXMiB0aGlzKSB7CiAJVFJBQ0UoZGRyYXcsIiglcCktPigpXG4iLHRoaXMpOwogCXJldHVybiBERF9PSzsKIH0KIAotc3RhdGljIEhSRVNVTFQgV0lOQVBJIElEaXJlY3REcmF3X0dldE1vbml0b3JGcmVxdWVuY3koCi0JTFBESVJFQ1REUkFXIHRoaXMsTFBEV09SRCBmcmVxCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkgSURpcmVjdERyYXcyX0dldE1vbml0b3JGcmVxdWVuY3koCisJTFBESVJFQ1REUkFXMiB0aGlzLExQRFdPUkQgZnJlcQogKSB7CiAJRklYTUUoZGRyYXcsIiglcCktPiglcCkgcmV0dXJucyA2MCBIeiBhbHdheXNcbiIsdGhpcyxmcmVxKTsKIAkqZnJlcSA9IDYwKjEwMDsgLyogNjAgSHogKi8KQEAgLTIwNTgsMjI1ICsxNzExLDEzIEBACiB9CiAKIC8qIHdoYXQgY2FuIHdlIGRpcmVjdGx5IGRlY29tcHJlc3M/ICovCi1zdGF0aWMgSFJFU1VMVCBXSU5BUEkgSURpcmVjdERyYXdfR2V0Rm91ckNDQ29kZXMoCi0JTFBESVJFQ1REUkFXIHRoaXMsTFBEV09SRCB4LExQRFdPUkQgeQorc3RhdGljIEhSRVNVTFQgV0lOQVBJIElEaXJlY3REcmF3Ml9HZXRGb3VyQ0NDb2RlcygKKwlMUERJUkVDVERSQVcyIHRoaXMsTFBEV09SRCB4LExQRFdPUkQgeQogKSB7CiAJRklYTUUoZGRyYXcsIiglcCwlcCwlcCksIHN0dWJcbiIsdGhpcyx4LHkpOwogCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IElEaXJlY3REcmF3X1ZUYWJsZSBkZ2FfZGR2dCA9IHsKLQlER0FfSURpcmVjdERyYXdfUXVlcnlJbnRlcmZhY2UsCi0JSURpcmVjdERyYXdfQWRkUmVmLAotCURHQV9JRGlyZWN0RHJhd19SZWxlYXNlLAotCSh2b2lkKik0LAotCUlEaXJlY3REcmF3X0NyZWF0ZUNsaXBwZXIsCi0JREdBX0lEaXJlY3REcmF3X0NyZWF0ZVBhbGV0dGUsCi0JREdBX0lEaXJlY3REcmF3X0NyZWF0ZVN1cmZhY2UsCi0JSURpcmVjdERyYXdfRHVwbGljYXRlU3VyZmFjZSwKLQlJRGlyZWN0RHJhd19FbnVtRGlzcGxheU1vZGVzLAotCSh2b2lkKikxMCwKLQlJRGlyZWN0RHJhd19GbGlwVG9HRElTdXJmYWNlLAotCURHQV9JRGlyZWN0RHJhd19HZXRDYXBzLAotCURHQV9JRGlyZWN0RHJhd19HZXREaXNwbGF5TW9kZSwKLQlJRGlyZWN0RHJhd19HZXRGb3VyQ0NDb2RlcywKLQkodm9pZCopMTUsCi0JSURpcmVjdERyYXdfR2V0TW9uaXRvckZyZXF1ZW5jeSwKLQkodm9pZCopMTcsCi0JSURpcmVjdERyYXdfR2V0VmVydGljYWxCbGFua1N0YXR1cywKLQkodm9pZCopMTksCi0JREdBX0lEaXJlY3REcmF3X1Jlc3RvcmVEaXNwbGF5TW9kZSwKLQlJRGlyZWN0RHJhd19TZXRDb29wZXJhdGl2ZUxldmVsLAotCURHQV9JRGlyZWN0RHJhd19TZXREaXNwbGF5TW9kZSwKLQlJRGlyZWN0RHJhd19XYWl0Rm9yVmVydGljYWxCbGFuaywKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgSURpcmVjdERyYXdfVlRhYmxlIHhzaG1fZGR2dCA9IHsKLQlYU2htX0lEaXJlY3REcmF3X1F1ZXJ5SW50ZXJmYWNlLAotCUlEaXJlY3REcmF3X0FkZFJlZiwKLQlYU2htX0lEaXJlY3REcmF3X1JlbGVhc2UsCi0JKHZvaWQqKTQsCi0JSURpcmVjdERyYXdfQ3JlYXRlQ2xpcHBlciwKLQlYU2htX0lEaXJlY3REcmF3X0NyZWF0ZVBhbGV0dGUsCi0JWFNobV9JRGlyZWN0RHJhd19DcmVhdGVTdXJmYWNlLAotCUlEaXJlY3REcmF3X0R1cGxpY2F0ZVN1cmZhY2UsCi0JSURpcmVjdERyYXdfRW51bURpc3BsYXlNb2RlcywKLQkodm9pZCopMTAsCi0JSURpcmVjdERyYXdfRmxpcFRvR0RJU3VyZmFjZSwKLQlYU2htX0lEaXJlY3REcmF3X0dldENhcHMsCi0JWFNobV9JRGlyZWN0RHJhd19HZXREaXNwbGF5TW9kZSwKLQlJRGlyZWN0RHJhd19HZXRGb3VyQ0NDb2RlcywKLQkodm9pZCopMTUsCi0JSURpcmVjdERyYXdfR2V0TW9uaXRvckZyZXF1ZW5jeSwKLQkodm9pZCopMTcsCi0JSURpcmVjdERyYXdfR2V0VmVydGljYWxCbGFua1N0YXR1cywKLQkodm9pZCopMTksCi0JWFNobV9JRGlyZWN0RHJhd19SZXN0b3JlRGlzcGxheU1vZGUsCi0JSURpcmVjdERyYXdfU2V0Q29vcGVyYXRpdmVMZXZlbCwKLQlYU2htX0lEaXJlY3REcmF3X1NldERpc3BsYXlNb2RlLAotCUlEaXJlY3REcmF3X1dhaXRGb3JWZXJ0aWNhbEJsYW5rLAotfTsKLQotc3RhdGljIHN0cnVjdCBJRGlyZWN0RHJhd19WVGFibGUgeGxpYl9kZHZ0ID0gewotCVhsaWJfSURpcmVjdERyYXdfUXVlcnlJbnRlcmZhY2UsCi0JSURpcmVjdERyYXdfQWRkUmVmLAotCVhsaWJfSURpcmVjdERyYXdfUmVsZWFzZSwKLQkodm9pZCopNCwKLQlJRGlyZWN0RHJhd19DcmVhdGVDbGlwcGVyLAotCVhsaWJfSURpcmVjdERyYXdfQ3JlYXRlUGFsZXR0ZSwKLQlYbGliX0lEaXJlY3REcmF3X0NyZWF0ZVN1cmZhY2UsCi0JSURpcmVjdERyYXdfRHVwbGljYXRlU3VyZmFjZSwKLQlJRGlyZWN0RHJhd19FbnVtRGlzcGxheU1vZGVzLAotCSh2b2lkKikxMCwKLQlJRGlyZWN0RHJhd19GbGlwVG9HRElTdXJmYWNlLAotCVhsaWJfSURpcmVjdERyYXdfR2V0Q2FwcywKLQlYbGliX0lEaXJlY3REcmF3X0dldERpc3BsYXlNb2RlLAotCUlEaXJlY3REcmF3X0dldEZvdXJDQ0NvZGVzLAotCSh2b2lkKikxNSwKLQlJRGlyZWN0RHJhd19HZXRNb25pdG9yRnJlcXVlbmN5LAotCSh2b2lkKikxNywKLQlJRGlyZWN0RHJhd19HZXRWZXJ0aWNhbEJsYW5rU3RhdHVzLAotCSh2b2lkKikxOSwKLQlYbGliX0lEaXJlY3REcmF3X1Jlc3RvcmVEaXNwbGF5TW9kZSwKLQlJRGlyZWN0RHJhd19TZXRDb29wZXJhdGl2ZUxldmVsLAotCVhsaWJfSURpcmVjdERyYXdfU2V0RGlzcGxheU1vZGUsCi0JSURpcmVjdERyYXdfV2FpdEZvclZlcnRpY2FsQmxhbmssCi19OwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIAlJRGlyZWN0RHJhdzIKLSAqCi0gKi8KLXN0YXRpYyBIUkVTVUxUIFdJTkFQSSBJRGlyZWN0RHJhdzJfQ3JlYXRlQ2xpcHBlcigKLQlMUERJUkVDVERSQVcyIHRoaXMsRFdPUkQgeCxMUERJUkVDVERSQVdDTElQUEVSICpscGRkY2xpcCxMUFVOS05PV04gbHB1bmsKLSkgewotCXJldHVybiBJRGlyZWN0RHJhd19DcmVhdGVDbGlwcGVyKChMUERJUkVDVERSQVcpdGhpcyx4LGxwZGRjbGlwLGxwdW5rKTsKLX0KLQotc3RhdGljIEhSRVNVTFQgV0lOQVBJIERHQV9JRGlyZWN0RHJhdzJfQ3JlYXRlU3VyZmFjZSgKLQlMUERJUkVDVERSQVcyIHRoaXMsTFBERFNVUkZBQ0VERVNDIGxwZGRzZCxMUERJUkVDVERSQVdTVVJGQUNFICpscGRzZixJVW5rbm93biAqbHB1bmsKLSkgewotCXJldHVybiBER0FfSURpcmVjdERyYXdfQ3JlYXRlU3VyZmFjZSgoTFBESVJFQ1REUkFXKXRoaXMsbHBkZHNkLChMUERJUkVDVERSQVdTVVJGQUNFKilscGRzZixscHVuayk7Ci19Ci0KLXN0YXRpYyBIUkVTVUxUIFdJTkFQSSBYU2htX0lEaXJlY3REcmF3Ml9DcmVhdGVTdXJmYWNlKAotCUxQRElSRUNURFJBVzIgdGhpcyxMUEREU1VSRkFDRURFU0MgbHBkZHNkLExQRElSRUNURFJBV1NVUkZBQ0UgKmxwZHNmLElVbmtub3duICpscHVuawotKSB7Ci0JcmV0dXJuIFhTaG1fSURpcmVjdERyYXdfQ3JlYXRlU3VyZmFjZSgoTFBESVJFQ1REUkFXKXRoaXMsbHBkZHNkLChMUERJUkVDVERSQVdTVVJGQUNFKilscGRzZixscHVuayk7Ci19Ci0KLXN0YXRpYyBIUkVTVUxUIFdJTkFQSSBYbGliX0lEaXJlY3REcmF3Ml9DcmVhdGVTdXJmYWNlKAotCUxQRElSRUNURFJBVzIgdGhpcyxMUEREU1VSRkFDRURFU0MgbHBkZHNkLExQRElSRUNURFJBV1NVUkZBQ0UgKmxwZHNmLElVbmtub3duICpscHVuawotKSB7Ci0JcmV0dXJuIFhsaWJfSURpcmVjdERyYXdfQ3JlYXRlU3VyZmFjZSgoTFBESVJFQ1REUkFXKXRoaXMsbHBkZHNkLChMUERJUkVDVERSQVdTVVJGQUNFKilscGRzZixscHVuayk7Ci19Ci0KLXN0YXRpYyBIUkVTVUxUIFdJTkFQSSBER0FfSURpcmVjdERyYXcyX1F1ZXJ5SW50ZXJmYWNlKAotCUxQRElSRUNURFJBVzIgdGhpcyxSRUZJSUQgcmVmaWlkLExQVk9JRCAqb2JqCi0pIHsKLQlyZXR1cm4gREdBX0lEaXJlY3REcmF3X1F1ZXJ5SW50ZXJmYWNlKChMUERJUkVDVERSQVcpdGhpcyxyZWZpaWQsb2JqKTsKLX0KLQotc3RhdGljIEhSRVNVTFQgV0lOQVBJIFhTaG1fSURpcmVjdERyYXcyX1F1ZXJ5SW50ZXJmYWNlKAotCUxQRElSRUNURFJBVzIgdGhpcyxSRUZJSUQgcmVmaWlkLExQVk9JRCAqb2JqCi0pIHsKLQlyZXR1cm4gWFNobV9JRGlyZWN0RHJhd19RdWVyeUludGVyZmFjZSgoTFBESVJFQ1REUkFXKXRoaXMscmVmaWlkLG9iaik7Ci19Ci0KLXN0YXRpYyBIUkVTVUxUIFdJTkFQSSBYbGliX0lEaXJlY3REcmF3Ml9RdWVyeUludGVyZmFjZSgKLQlMUERJUkVDVERSQVcyIHRoaXMsUkVGSUlEIHJlZmlpZCxMUFZPSUQgKm9iagotKSB7Ci0JcmV0dXJuIFhsaWJfSURpcmVjdERyYXdfUXVlcnlJbnRlcmZhY2UoKExQRElSRUNURFJBVyl0aGlzLHJlZmlpZCxvYmopOwotfQotCi1zdGF0aWMgVUxPTkcgV0lOQVBJIElEaXJlY3REcmF3Ml9BZGRSZWYoTFBESVJFQ1REUkFXMiB0aGlzKSB7Ci0JcmV0dXJuIElEaXJlY3REcmF3X0FkZFJlZigoTFBESVJFQ1REUkFXKXRoaXMpOwotfQotCi1zdGF0aWMgVUxPTkcgV0lOQVBJIERHQV9JRGlyZWN0RHJhdzJfUmVsZWFzZShMUERJUkVDVERSQVcyIHRoaXMpIHsKLQlyZXR1cm4gREdBX0lEaXJlY3REcmF3X1JlbGVhc2UoKExQRElSRUNURFJBVyl0aGlzKTsKLX0KLQotc3RhdGljIFVMT05HIFdJTkFQSSBYU2htX0lEaXJlY3REcmF3Ml9SZWxlYXNlKExQRElSRUNURFJBVzIgdGhpcykgewotCXJldHVybiBYU2htX0lEaXJlY3REcmF3X1JlbGVhc2UoKExQRElSRUNURFJBVyl0aGlzKTsKLX0KLQotc3RhdGljIFVMT05HIFdJTkFQSSBYbGliX0lEaXJlY3REcmF3Ml9SZWxlYXNlKExQRElSRUNURFJBVzIgdGhpcykgewotCXJldHVybiBYbGliX0lEaXJlY3REcmF3X1JlbGVhc2UoKExQRElSRUNURFJBVyl0aGlzKTsKLX0KLQotc3RhdGljIEhSRVNVTFQgV0lOQVBJIERHQV9JRGlyZWN0RHJhdzJfR2V0Q2FwcygKLQlMUERJUkVDVERSQVcyIHRoaXMsTFBERENBUFMgY2FwczEsTFBERENBUFMgY2FwczIKLSkgIHsKLQlyZXR1cm4gREdBX0lEaXJlY3REcmF3X0dldENhcHMoKExQRElSRUNURFJBVyl0aGlzLGNhcHMxLGNhcHMyKTsKLX0KLQotc3RhdGljIEhSRVNVTFQgV0lOQVBJIFhTaG1fSURpcmVjdERyYXcyX0dldENhcHMoCi0JTFBESVJFQ1REUkFXMiB0aGlzLExQRERDQVBTIGNhcHMxLExQRERDQVBTIGNhcHMyCi0pICB7Ci0JcmV0dXJuIFhTaG1fSURpcmVjdERyYXdfR2V0Q2FwcygoTFBESVJFQ1REUkFXKXRoaXMsY2FwczEsY2FwczIpOwotfQotCi1zdGF0aWMgSFJFU1VMVCBXSU5BUEkgWGxpYl9JRGlyZWN0RHJhdzJfR2V0Q2FwcygKLQlMUERJUkVDVERSQVcyIHRoaXMsTFBERENBUFMgY2FwczEsTFBERENBUFMgY2FwczIKLSkgIHsKLQlyZXR1cm4gWGxpYl9JRGlyZWN0RHJhd19HZXRDYXBzKChMUERJUkVDVERSQVcpdGhpcyxjYXBzMSxjYXBzMik7Ci19Ci0KLXN0YXRpYyBIUkVTVUxUIFdJTkFQSSBJRGlyZWN0RHJhdzJfU2V0Q29vcGVyYXRpdmVMZXZlbCgKLQlMUERJUkVDVERSQVcyIHRoaXMsSFdORDMyIGh3bmQsRFdPUkQgeAotKSB7Ci0JcmV0dXJuIElEaXJlY3REcmF3X1NldENvb3BlcmF0aXZlTGV2ZWwoKExQRElSRUNURFJBVyl0aGlzLGh3bmQseCk7Ci19Ci0KLXN0YXRpYyBIUkVTVUxUIFdJTkFQSSBER0FfSURpcmVjdERyYXcyX0NyZWF0ZVBhbGV0dGUoCi0JTFBESVJFQ1REUkFXMiB0aGlzLERXT1JEIHgsTFBQQUxFVFRFRU5UUlkgcGFsZW50LExQRElSRUNURFJBV1BBTEVUVEUgKmxwZGRwYWwsTFBVTktOT1dOIGxwdW5rCi0pIHsKLQlyZXR1cm4gREdBX0lEaXJlY3REcmF3X0NyZWF0ZVBhbGV0dGUoKExQRElSRUNURFJBVyl0aGlzLHgscGFsZW50LGxwZGRwYWwsbHB1bmspOwotfQotCi1zdGF0aWMgSFJFU1VMVCBXSU5BUEkgWFNobV9JRGlyZWN0RHJhdzJfQ3JlYXRlUGFsZXR0ZSgKLQlMUERJUkVDVERSQVcyIHRoaXMsRFdPUkQgeCxMUFBBTEVUVEVFTlRSWSBwYWxlbnQsTFBESVJFQ1REUkFXUEFMRVRURSAqbHBkZHBhbCxMUFVOS05PV04gbHB1bmsKLSkgewotCXJldHVybiBYU2htX0lEaXJlY3REcmF3X0NyZWF0ZVBhbGV0dGUoKExQRElSRUNURFJBVyl0aGlzLHgscGFsZW50LGxwZGRwYWwsbHB1bmspOwotfQotCi1zdGF0aWMgSFJFU1VMVCBXSU5BUEkgWGxpYl9JRGlyZWN0RHJhdzJfQ3JlYXRlUGFsZXR0ZSgKLQlMUERJUkVDVERSQVcyIHRoaXMsRFdPUkQgeCxMUFBBTEVUVEVFTlRSWSBwYWxlbnQsTFBESVJFQ1REUkFXUEFMRVRURSAqbHBkZHBhbCxMUFVOS05PV04gbHB1bmsKLSkgewotCXJldHVybiBYbGliX0lEaXJlY3REcmF3X0NyZWF0ZVBhbGV0dGUoKExQRElSRUNURFJBVyl0aGlzLHgscGFsZW50LGxwZGRwYWwsbHB1bmspOwotfQotCi1zdGF0aWMgSFJFU1VMVCBXSU5BUEkgREdBX0lEaXJlY3REcmF3Ml9TZXREaXNwbGF5TW9kZSgKLQlMUERJUkVDVERSQVcyIHRoaXMsRFdPUkQgd2lkdGgsRFdPUkQgaGVpZ2h0LERXT1JEIGRlcHRoLERXT1JEIHh4LERXT1JEIHl5Ci0pIHsKLQlyZXR1cm4gREdBX0lEaXJlY3REcmF3X1NldERpc3BsYXlNb2RlKChMUERJUkVDVERSQVcpdGhpcyx3aWR0aCxoZWlnaHQsZGVwdGgpOwotfQotCi1zdGF0aWMgSFJFU1VMVCBXSU5BUEkgWFNobV9JRGlyZWN0RHJhdzJfU2V0RGlzcGxheU1vZGUoCi0JTFBESVJFQ1REUkFXMiB0aGlzLERXT1JEIHdpZHRoLERXT1JEIGhlaWdodCxEV09SRCBkZXB0aCxEV09SRCB4eCxEV09SRCB5eQotKSB7Ci0JcmV0dXJuIFhTaG1fSURpcmVjdERyYXdfU2V0RGlzcGxheU1vZGUoKExQRElSRUNURFJBVyl0aGlzLHdpZHRoLGhlaWdodCxkZXB0aCk7Ci19Ci0KLXN0YXRpYyBIUkVTVUxUIFdJTkFQSSBYbGliX0lEaXJlY3REcmF3Ml9TZXREaXNwbGF5TW9kZSgKLQlMUERJUkVDVERSQVcyIHRoaXMsRFdPUkQgd2lkdGgsRFdPUkQgaGVpZ2h0LERXT1JEIGRlcHRoLERXT1JEIHh4LERXT1JEIHl5Ci0pIHsKLQlyZXR1cm4gWGxpYl9JRGlyZWN0RHJhd19TZXREaXNwbGF5TW9kZSgoTFBESVJFQ1REUkFXKXRoaXMsd2lkdGgsaGVpZ2h0LGRlcHRoKTsKLX0KLQotc3RhdGljIEhSRVNVTFQgV0lOQVBJIERHQV9JRGlyZWN0RHJhdzJfUmVzdG9yZURpc3BsYXlNb2RlKExQRElSRUNURFJBVzIgdGhpcykgewotCXJldHVybiBER0FfSURpcmVjdERyYXdfUmVzdG9yZURpc3BsYXlNb2RlKChMUERJUkVDVERSQVcpdGhpcyk7Ci19Ci0KLXN0YXRpYyBIUkVTVUxUIFdJTkFQSSBYU2htX0lEaXJlY3REcmF3Ml9SZXN0b3JlRGlzcGxheU1vZGUoTFBESVJFQ1REUkFXMiB0aGlzKSB7Ci0JcmV0dXJuIFhTaG1fSURpcmVjdERyYXdfUmVzdG9yZURpc3BsYXlNb2RlKChMUERJUkVDVERSQVcpdGhpcyk7Ci19Ci0KLXN0YXRpYyBIUkVTVUxUIFdJTkFQSSBYbGliX0lEaXJlY3REcmF3Ml9SZXN0b3JlRGlzcGxheU1vZGUoTFBESVJFQ1REUkFXMiB0aGlzKSB7Ci0JcmV0dXJuIFhsaWJfSURpcmVjdERyYXdfUmVzdG9yZURpc3BsYXlNb2RlKChMUERJUkVDVERSQVcpdGhpcyk7Ci19Ci0KIHN0YXRpYyBIUkVTVUxUIFdJTkFQSSBJRGlyZWN0RHJhdzJfRW51bVN1cmZhY2VzKAogCUxQRElSRUNURFJBVzIgdGhpcyxEV09SRCB4LExQRERTVVJGQUNFREVTQyBkZHNmZCxMUFZPSUQgY29udGV4dCxMUERERU5VTVNVUkZBQ0VTQ0FMTEJBQ0sgZGRzZmNiCiApIHsKQEAgLTIyODQsMjggKzE3MjUsODAgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIEhSRVNVTFQgV0lOQVBJIElEaXJlY3REcmF3Ml9FbnVtRGlzcGxheU1vZGVzKAotCUxQRElSRUNURFJBVzIgdGhpcyxEV09SRCBkd0ZsYWdzLExQRERTVVJGQUNFREVTQyBscGRkc2ZkLExQVk9JRCBjb250ZXh0LExQRERFTlVNTU9ERVNDQUxMQkFDSyBtb2Rlc2NiCisvKiBOb3RlOiBIYWNrIHNvIHdlIGNhbiByZXVzZSB0aGUgb2xkIGZ1bmN0aW9ucyB3aXRob3V0IGNvbXBpbGVyIHdhcm5pbmdzICovCisjaWZkZWYgX19HTlVDX18KKyMgZGVmaW5lIFhDQVNUKGZ1bikJKHR5cGVvZihkZ2FfZGR2dC5mbiMjZnVuKSkKKyNlbHNlCisjIGRlZmluZSBYQ0FTVChmdW4pCSh2b2lkKikKKyNlbmRpZgorCitzdGF0aWMgc3RydWN0IElEaXJlY3REcmF3X1ZUYWJsZSBkZ2FfZGR2dCA9IHsKKwlYQ0FTVChRdWVyeUludGVyZmFjZSlER0FfSURpcmVjdERyYXcyX1F1ZXJ5SW50ZXJmYWNlLAorCVhDQVNUKEFkZFJlZilJRGlyZWN0RHJhdzJfQWRkUmVmLAorCVhDQVNUKFJlbGVhc2UpREdBX0lEaXJlY3REcmF3Ml9SZWxlYXNlLAorCVhDQVNUKENvbXBhY3QpNCwKKwlYQ0FTVChDcmVhdGVDbGlwcGVyKUlEaXJlY3REcmF3Ml9DcmVhdGVDbGlwcGVyLAorCVhDQVNUKENyZWF0ZVBhbGV0dGUpREdBX0lEaXJlY3REcmF3Ml9DcmVhdGVQYWxldHRlLAorCVhDQVNUKENyZWF0ZVN1cmZhY2UpREdBX0lEaXJlY3REcmF3Ml9DcmVhdGVTdXJmYWNlLAorCVhDQVNUKER1cGxpY2F0ZVN1cmZhY2UpSURpcmVjdERyYXcyX0R1cGxpY2F0ZVN1cmZhY2UsCisJWENBU1QoRW51bURpc3BsYXlNb2RlcylJRGlyZWN0RHJhdzJfRW51bURpc3BsYXlNb2RlcywKKwlYQ0FTVChFbnVtU3VyZmFjZXMpSURpcmVjdERyYXcyX0VudW1TdXJmYWNlcywKKwlYQ0FTVChGbGlwVG9HRElTdXJmYWNlKUlEaXJlY3REcmF3Ml9GbGlwVG9HRElTdXJmYWNlLAorCVhDQVNUKEdldENhcHMpREdBX0lEaXJlY3REcmF3Ml9HZXRDYXBzLAorCVhDQVNUKEdldERpc3BsYXlNb2RlKURHQV9JRGlyZWN0RHJhdzJfR2V0RGlzcGxheU1vZGUsCisJWENBU1QoR2V0Rm91ckNDQ29kZXMpSURpcmVjdERyYXcyX0dldEZvdXJDQ0NvZGVzLAorCVhDQVNUKEdldEdESVN1cmZhY2UpMTUsCisJWENBU1QoR2V0TW9uaXRvckZyZXF1ZW5jeSlJRGlyZWN0RHJhdzJfR2V0TW9uaXRvckZyZXF1ZW5jeSwKKwlYQ0FTVChHZXRTY2FuTGluZSkxNywKKwlYQ0FTVChHZXRWZXJ0aWNhbEJsYW5rU3RhdHVzKUlEaXJlY3REcmF3Ml9HZXRWZXJ0aWNhbEJsYW5rU3RhdHVzLAorCVhDQVNUKEluaXRpYWxpemUpMTksCisJWENBU1QoUmVzdG9yZURpc3BsYXlNb2RlKURHQV9JRGlyZWN0RHJhdzJfUmVzdG9yZURpc3BsYXlNb2RlLAorCVhDQVNUKFNldENvb3BlcmF0aXZlTGV2ZWwpSURpcmVjdERyYXcyX1NldENvb3BlcmF0aXZlTGV2ZWwsCisJREdBX0lEaXJlY3REcmF3X1NldERpc3BsYXlNb2RlLAorCVhDQVNUKFdhaXRGb3JWZXJ0aWNhbEJsYW5rKUlEaXJlY3REcmF3Ml9XYWl0Rm9yVmVydGljYWxCbGFuaywKK307CisKK3N0YXRpYyBzdHJ1Y3QgSURpcmVjdERyYXdfVlRhYmxlIHhsaWJfZGR2dCA9IHsKKwlYQ0FTVChRdWVyeUludGVyZmFjZSlYbGliX0lEaXJlY3REcmF3Ml9RdWVyeUludGVyZmFjZSwKKwlYQ0FTVChBZGRSZWYpSURpcmVjdERyYXcyX0FkZFJlZiwKKwlYQ0FTVChSZWxlYXNlKVhsaWJfSURpcmVjdERyYXcyX1JlbGVhc2UsCisJWENBU1QoQ29tcGFjdCk0LAorCVhDQVNUKENyZWF0ZUNsaXBwZXIpSURpcmVjdERyYXcyX0NyZWF0ZUNsaXBwZXIsCisJWENBU1QoQ3JlYXRlUGFsZXR0ZSlYbGliX0lEaXJlY3REcmF3Ml9DcmVhdGVQYWxldHRlLAorCVhDQVNUKENyZWF0ZVN1cmZhY2UpWGxpYl9JRGlyZWN0RHJhdzJfQ3JlYXRlU3VyZmFjZSwKKwlYQ0FTVChEdXBsaWNhdGVTdXJmYWNlKUlEaXJlY3REcmF3Ml9EdXBsaWNhdGVTdXJmYWNlLAorCVhDQVNUKEVudW1EaXNwbGF5TW9kZXMpSURpcmVjdERyYXcyX0VudW1EaXNwbGF5TW9kZXMsCisJWENBU1QoRW51bVN1cmZhY2VzKUlEaXJlY3REcmF3Ml9FbnVtU3VyZmFjZXMsCisJWENBU1QoRmxpcFRvR0RJU3VyZmFjZSlJRGlyZWN0RHJhdzJfRmxpcFRvR0RJU3VyZmFjZSwKKwlYQ0FTVChHZXRDYXBzKVhsaWJfSURpcmVjdERyYXcyX0dldENhcHMsCisJWENBU1QoR2V0RGlzcGxheU1vZGUpWGxpYl9JRGlyZWN0RHJhdzJfR2V0RGlzcGxheU1vZGUsCisJWENBU1QoR2V0Rm91ckNDQ29kZXMpSURpcmVjdERyYXcyX0dldEZvdXJDQ0NvZGVzLAorCVhDQVNUKEdldEdESVN1cmZhY2UpMTUsCisJWENBU1QoR2V0TW9uaXRvckZyZXF1ZW5jeSlJRGlyZWN0RHJhdzJfR2V0TW9uaXRvckZyZXF1ZW5jeSwKKwlYQ0FTVChHZXRTY2FuTGluZSkxNywKKwlYQ0FTVChHZXRWZXJ0aWNhbEJsYW5rU3RhdHVzKUlEaXJlY3REcmF3Ml9HZXRWZXJ0aWNhbEJsYW5rU3RhdHVzLAorCVhDQVNUKEluaXRpYWxpemUpMTksCisJWENBU1QoUmVzdG9yZURpc3BsYXlNb2RlKVhsaWJfSURpcmVjdERyYXcyX1Jlc3RvcmVEaXNwbGF5TW9kZSwKKwlYQ0FTVChTZXRDb29wZXJhdGl2ZUxldmVsKUlEaXJlY3REcmF3Ml9TZXRDb29wZXJhdGl2ZUxldmVsLAorCVhsaWJfSURpcmVjdERyYXdfU2V0RGlzcGxheU1vZGUsCisJWENBU1QoV2FpdEZvclZlcnRpY2FsQmxhbmspSURpcmVjdERyYXcyX1dhaXRGb3JWZXJ0aWNhbEJsYW5rLAorfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAJSURpcmVjdERyYXcyCisgKgorICovCisKK3N0YXRpYyBIUkVTVUxUIFdJTkFQSSBER0FfSURpcmVjdERyYXcyX1NldERpc3BsYXlNb2RlKAorCUxQRElSRUNURFJBVzIgdGhpcyxEV09SRCB3aWR0aCxEV09SRCBoZWlnaHQsRFdPUkQgZGVwdGgsRFdPUkQgeHgsRFdPUkQgeXkKICkgewotCXJldHVybiBJRGlyZWN0RHJhd19FbnVtRGlzcGxheU1vZGVzKChMUERJUkVDVERSQVcpdGhpcyxkd0ZsYWdzLGxwZGRzZmQsY29udGV4dCxtb2Rlc2NiKTsKKwlyZXR1cm4gREdBX0lEaXJlY3REcmF3X1NldERpc3BsYXlNb2RlKChMUERJUkVDVERSQVcpdGhpcyx3aWR0aCxoZWlnaHQsZGVwdGgpOwogfQogCi1zdGF0aWMgSFJFU1VMVCBXSU5BUEkgREdBX0lEaXJlY3REcmF3Ml9HZXREaXNwbGF5TW9kZSgKLQlMUERJUkVDVERSQVcyIHRoaXMsTFBERFNVUkZBQ0VERVNDIGxwZGRzZmQKK3N0YXRpYyBIUkVTVUxUIFdJTkFQSSBYbGliX0lEaXJlY3REcmF3Ml9TZXREaXNwbGF5TW9kZSgKKwlMUERJUkVDVERSQVcyIHRoaXMsRFdPUkQgd2lkdGgsRFdPUkQgaGVpZ2h0LERXT1JEIGRlcHRoLERXT1JEIHh4LERXT1JEIHl5CiApIHsKLQlyZXR1cm4gREdBX0lEaXJlY3REcmF3X0dldERpc3BsYXlNb2RlKChMUERJUkVDVERSQVcpdGhpcyxscGRkc2ZkKTsKLX0KLQotc3RhdGljIEhSRVNVTFQgV0lOQVBJIFhTaG1fSURpcmVjdERyYXcyX0dldERpc3BsYXlNb2RlKAotCUxQRElSRUNURFJBVzIgdGhpcyxMUEREU1VSRkFDRURFU0MgbHBkZHNmZAotKSB7Ci0JcmV0dXJuIFhTaG1fSURpcmVjdERyYXdfR2V0RGlzcGxheU1vZGUoKExQRElSRUNURFJBVyl0aGlzLGxwZGRzZmQpOwotfQotCi1zdGF0aWMgSFJFU1VMVCBXSU5BUEkgWGxpYl9JRGlyZWN0RHJhdzJfR2V0RGlzcGxheU1vZGUoCi0JTFBESVJFQ1REUkFXMiB0aGlzLExQRERTVVJGQUNFREVTQyBscGRkc2ZkCi0pIHsKLQlyZXR1cm4gWGxpYl9JRGlyZWN0RHJhd19HZXREaXNwbGF5TW9kZSgoTFBESVJFQ1REUkFXKXRoaXMsbHBkZHNmZCk7CisJcmV0dXJuIFhsaWJfSURpcmVjdERyYXdfU2V0RGlzcGxheU1vZGUoKExQRElSRUNURFJBVyl0aGlzLHdpZHRoLGhlaWdodCxkZXB0aCk7CiB9CiAKIHN0YXRpYyBIUkVTVUxUIFdJTkFQSSBER0FfSURpcmVjdERyYXcyX0dldEF2YWlsYWJsZVZpZE1lbSgKQEAgLTIzMzAsMjQgKzE4MjMsNiBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgSFJFU1VMVCBXSU5BUEkgSURpcmVjdERyYXcyX0dldE1vbml0b3JGcmVxdWVuY3koCi0JTFBESVJFQ1REUkFXMiB0aGlzLExQRFdPUkQgZnJlcQotKSB7Ci0JcmV0dXJuIElEaXJlY3REcmF3X0dldE1vbml0b3JGcmVxdWVuY3koKExQRElSRUNURFJBVyl0aGlzLGZyZXEpOwotfQotCi1zdGF0aWMgSFJFU1VMVCBXSU5BUEkgSURpcmVjdERyYXcyX0dldFZlcnRpY2FsQmxhbmtTdGF0dXMoCi0JTFBESVJFQ1REUkFXMiB0aGlzLEJPT0wzMiAqc3RhdHVzCi0pIHsKLQlyZXR1cm4gSURpcmVjdERyYXdfR2V0VmVydGljYWxCbGFua1N0YXR1cygoTFBESVJFQ1REUkFXKXRoaXMsc3RhdHVzKTsKLX0KLQotc3RhdGljIEhSRVNVTFQgV0lOQVBJIElEaXJlY3REcmF3Ml9XYWl0Rm9yVmVydGljYWxCbGFuaygKLQlMUERJUkVDVERSQVcyIHRoaXMsRFdPUkQgeCxIQU5ETEUzMiBoCi0pIHsKLQlyZXR1cm4gSURpcmVjdERyYXdfV2FpdEZvclZlcnRpY2FsQmxhbmsoKExQRElSRUNURFJBVyl0aGlzLHgsaCk7Ci19Ci0KIHN0YXRpYyBJRGlyZWN0RHJhdzJfVlRhYmxlIGRnYV9kZDJ2dCA9IHsKIAlER0FfSURpcmVjdERyYXcyX1F1ZXJ5SW50ZXJmYWNlLAogCUlEaXJlY3REcmF3Ml9BZGRSZWYsCkBAIC0yMzU5LDEwICsxODM0LDEwIEBACiAJKHZvaWQqKTgsCiAJSURpcmVjdERyYXcyX0VudW1EaXNwbGF5TW9kZXMsCiAJSURpcmVjdERyYXcyX0VudW1TdXJmYWNlcywKLQkodm9pZCopMTEsCisJSURpcmVjdERyYXcyX0ZsaXBUb0dESVN1cmZhY2UsCiAJREdBX0lEaXJlY3REcmF3Ml9HZXRDYXBzLAogCURHQV9JRGlyZWN0RHJhdzJfR2V0RGlzcGxheU1vZGUsCi0JKHZvaWQqKTE0LAorCUlEaXJlY3REcmF3Ml9HZXRGb3VyQ0NDb2RlcywKIAkodm9pZCopMTUsCiAJSURpcmVjdERyYXcyX0dldE1vbml0b3JGcmVxdWVuY3ksCiAJKHZvaWQqKTE3LApAQCAtMjM3NSwzMyArMTg1MCw2IEBACiAJREdBX0lEaXJlY3REcmF3Ml9HZXRBdmFpbGFibGVWaWRNZW0KIH07CiAKLXN0YXRpYyBJRGlyZWN0RHJhdzJfVlRhYmxlIHhzaG1fZGQydnQgPSB7Ci0JWFNobV9JRGlyZWN0RHJhdzJfUXVlcnlJbnRlcmZhY2UsCi0JSURpcmVjdERyYXcyX0FkZFJlZiwKLQlYU2htX0lEaXJlY3REcmF3Ml9SZWxlYXNlLAotCSh2b2lkKik0LAotCUlEaXJlY3REcmF3Ml9DcmVhdGVDbGlwcGVyLAotCVhTaG1fSURpcmVjdERyYXcyX0NyZWF0ZVBhbGV0dGUsCi0JWFNobV9JRGlyZWN0RHJhdzJfQ3JlYXRlU3VyZmFjZSwKLQkodm9pZCopOCwKLQlJRGlyZWN0RHJhdzJfRW51bURpc3BsYXlNb2RlcywKLQlJRGlyZWN0RHJhdzJfRW51bVN1cmZhY2VzLAotCSh2b2lkKikxMSwKLQlYU2htX0lEaXJlY3REcmF3Ml9HZXRDYXBzLAotCVhTaG1fSURpcmVjdERyYXcyX0dldERpc3BsYXlNb2RlLAotCSh2b2lkKikxNCwKLQkodm9pZCopMTUsCi0JSURpcmVjdERyYXcyX0dldE1vbml0b3JGcmVxdWVuY3ksCi0JKHZvaWQqKTE3LAotCUlEaXJlY3REcmF3Ml9HZXRWZXJ0aWNhbEJsYW5rU3RhdHVzLAotCSh2b2lkKikxOSwKLQlYU2htX0lEaXJlY3REcmF3Ml9SZXN0b3JlRGlzcGxheU1vZGUsCi0JSURpcmVjdERyYXcyX1NldENvb3BlcmF0aXZlTGV2ZWwsCi0JWFNobV9JRGlyZWN0RHJhdzJfU2V0RGlzcGxheU1vZGUsCi0JSURpcmVjdERyYXcyX1dhaXRGb3JWZXJ0aWNhbEJsYW5rLAotCVhsaWJfSURpcmVjdERyYXcyX0dldEF2YWlsYWJsZVZpZE1lbQotfTsKLQogc3RhdGljIHN0cnVjdCBJRGlyZWN0RHJhdzJfVlRhYmxlIHhsaWJfZGQydnQgPSB7CiAJWGxpYl9JRGlyZWN0RHJhdzJfUXVlcnlJbnRlcmZhY2UsCiAJSURpcmVjdERyYXcyX0FkZFJlZiwKQEAgLTI0MTMsMTAgKzE4NjEsMTAgQEAKIAkodm9pZCopOCwKIAlJRGlyZWN0RHJhdzJfRW51bURpc3BsYXlNb2RlcywKIAlJRGlyZWN0RHJhdzJfRW51bVN1cmZhY2VzLAotCSh2b2lkKikxMSwKKwlJRGlyZWN0RHJhdzJfRmxpcFRvR0RJU3VyZmFjZSwKIAlYbGliX0lEaXJlY3REcmF3Ml9HZXRDYXBzLAogCVhsaWJfSURpcmVjdERyYXcyX0dldERpc3BsYXlNb2RlLAotCSh2b2lkKikxNCwKKwlJRGlyZWN0RHJhdzJfR2V0Rm91ckNDQ29kZXMsCiAJKHZvaWQqKTE1LAogCUlEaXJlY3REcmF3Ml9HZXRNb25pdG9yRnJlcXVlbmN5LAogCSh2b2lkKikxNywKQEAgLTI0NjgsNyArMTkxNiwxMSBAQAogCVRTWEY4NkRHQUdldFZpZXdQb3J0U2l6ZShkaXNwbGF5LERlZmF1bHRTY3JlZW4oZGlzcGxheSksJndpZHRoLCZoZWlnaHQpOwogCVRTWEY4NkRHQVNldFZpZXdQb3J0KGRpc3BsYXksRGVmYXVsdFNjcmVlbihkaXNwbGF5KSwwLDApOwogCSgqbHBscEREKS0+ZS5kZ2EuZmJfaGVpZ2h0ID0gc2NyZWVuSGVpZ2h0OworI2lmZGVmIERJQUJMT19IQUNLCisJKCpscGxwREQpLT5lLmRnYS52cG1hc2sgPSAxOworI2Vsc2UKIAkoKmxwbHBERCktPmUuZGdhLnZwbWFzayA9IDA7CisjZW5kaWYKIAogCS8qIGp1c3QgYXNzdW1lIHRoZSBkZWZhdWx0IGRlcHRoIGlzIHRoZSBER0EgZGVwdGggdG9vICovCiAJKCpscGxwREQpLT5kLmRlcHRoID0gRGVmYXVsdERlcHRoT2ZTY3JlZW4oc2NyZWVuKTsKQEAgLTI0ODEsMzggKzE5MzMsMjggQEAKICNlbmRpZiAvKiBkZWZpbmVkKEhBVkVfTElCWFhGODZER0EpICovCiB9CiAKLUhSRVNVTFQgV0lOQVBJIFhTaG1fRGlyZWN0RHJhd0NyZWF0ZSggTFBESVJFQ1REUkFXICpscGxwREQsIExQVU5LTk9XTiBwVW5rT3V0ZXIpIHsKLSNpZmRlZiBIQVZFX0xJQlhYU0hNCi0JaWYgKCFERFJBV19YU2htX0F2YWlsYWJsZSgpKSB7Ci0JCWZwcmludGYoc3RkZXJyLCJObyBYU2htIGRldGVjdGVkLlxuIik7Ci0JCXJldHVybiBEREVSUl9HRU5FUklDOwotCX0KLQkqbHBscEREID0gKExQRElSRUNURFJBVylIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSxIRUFQX1pFUk9fTUVNT1JZLHNpemVvZihJRGlyZWN0RHJhdykpOwotCSgqbHBscEREKS0+bHB2dGJsID0gJnhzaG1fZGR2dDsKLQkoKmxwbHBERCktPnJlZiA9IDE7Ci0JKCpscGxwREQpLT5lLnhzaG0uZHJhd2FibGUgPSBEZWZhdWx0Um9vdFdpbmRvdyhkaXNwbGF5KTsgLyogRklYTUU6IG1ha2UgYSB3aW5kb3cgKi8KLQkoKmxwbHBERCktPmQuZGVwdGggPSBEZWZhdWx0RGVwdGhPZlNjcmVlbihzY3JlZW4pOwotCSgqbHBscEREKS0+ZC5oZWlnaHQgPSBzY3JlZW5IZWlnaHQ7Ci0JKCpscGxwREQpLT5kLndpZHRoID0gc2NyZWVuV2lkdGg7Ci0JcmV0dXJuIDA7Ci0jZWxzZSAvKiBkZWZpbmVkKEhBVkVfTElCWFhTSE0pICovCi0JcmV0dXJuIERERVJSX0lOVkFMSURESVJFQ1REUkFXR1VJRDsKLSNlbmRpZiAvKiBkZWZpbmVkKEhBVkVfTElCWFhTSE0pICovCi19CiBMUkVTVUxUIFdJTkFQSSBYbGliX0REV25kUHJvYyhIV05EMzIgaHduZCxVSU5UMzIgbXNnLFdQQVJBTTMyIHdQYXJhbSxMUEFSQU0gbFBhcmFtKSB7CiAJTFJFU1VMVAlyZXQ7CiAJLypGSVhNRShkZHJhdywiKDB4JTA0eCwlcywweCUwOGx4LDB4JTA4bHgpLHN0dWIhXG4iLChpbnQpaHduZCxTUFlfR2V0TXNnTmFtZShtc2cpLChsb25nKXdQYXJhbSwobG9uZylsUGFyYW0pOyAqLworCWlmIChtc2c9PVdNX1BBSU5UKXsKKwkJTFBESVJFQ1REUkFXIGRkcmF3ID0gKExQRElSRUNURFJBVylHZXRXaW5kb3dMb25nMzJBKGh3bmQsMCk7CisKKwkJaWYgKGRkcmF3KQorCQkJZGRyYXctPmUueGxpYi5wYWludGFibGUgPSAxOworCX0KIAlyZXQgPSBEZWZXaW5kb3dQcm9jMzJBKGh3bmQsbXNnLHdQYXJhbSxsUGFyYW0pOwogCXJldHVybiByZXQ7CiB9CiAKIEhSRVNVTFQgV0lOQVBJIFhsaWJfRGlyZWN0RHJhd0NyZWF0ZSggTFBESVJFQ1REUkFXICpscGxwREQsIExQVU5LTk9XTiBwVW5rT3V0ZXIpIHsKIAlXTkRDTEFTUzMyQQl3YzsKKwlpbnQJCWhhdmVfeHNobSA9IDA7CiAKIAkqbHBscEREID0gKExQRElSRUNURFJBVylIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSxIRUFQX1pFUk9fTUVNT1JZLHNpemVvZihJRGlyZWN0RHJhdykpOwogCSgqbHBscEREKS0+bHB2dGJsID0gJnhsaWJfZGR2dDsKIAkoKmxwbHBERCktPnJlZiA9IDE7CiAJKCpscGxwREQpLT5lLnhsaWIuZHJhd2FibGUgPSAwOyAvKiBpbiBTZXREaXNwbGF5TW9kZSAqLworCSgqbHBscEREKS0+ZS54bGliLnVzZV94c2htID0gaGF2ZV94c2htOwogCXdjLnN0eWxlCT0gQ1NfR0xPQkFMQ0xBU1M7CiAJd2MubHBmblduZFByb2MJPSBYbGliX0REV25kUHJvYzsKIAl3Yy5jYkNsc0V4dHJhCT0gMDsKQEAgLTI1NDksMTYgKzE5OTEsMTIgQEAKIAkJICogc3VwcG9ydGVkIG9uZSAqLwogCQlpZiAoRERSQVdfREdBX0F2YWlsYWJsZSgpKQogCQkJbHBHVUlEID0gJkRHQV9EaXJlY3REcmF3X0dVSUQ7Ci0JCWVsc2UgaWYgKEREUkFXX1hTaG1fQXZhaWxhYmxlKCkpCi0JCQlscEdVSUQgPSAmWFNITV9EaXJlY3REcmF3X0dVSUQ7CiAJCWVsc2UKIAkJCWxwR1VJRCA9ICZYTElCX0RpcmVjdERyYXdfR1VJRDsKIAl9CiAKIAlpZiAoIW1lbWNtcChscEdVSUQsICZER0FfRGlyZWN0RHJhd19HVUlELCBzaXplb2YoR1VJRCkpKQogCQlyZXR1cm4gREdBX0RpcmVjdERyYXdDcmVhdGUobHBscERELCBwVW5rT3V0ZXIpOwotCWVsc2UgaWYgKCFtZW1jbXAobHBHVUlELCAmWFNITV9EaXJlY3REcmF3X0dVSUQsIHNpemVvZihHVUlEKSkpCi0JCXJldHVybiBYU2htX0RpcmVjdERyYXdDcmVhdGUobHBscERELCBwVW5rT3V0ZXIpOwogCWVsc2UgaWYgKCFtZW1jbXAobHBHVUlELCAmWExJQl9EaXJlY3REcmF3X0dVSUQsIHNpemVvZihHVUlEKSkpCiAJCXJldHVybiBYbGliX0RpcmVjdERyYXdDcmVhdGUobHBscERELCBwVW5rT3V0ZXIpOwogCmRpZmYgLS1naXQgYS9ncmFwaGljcy9wYWludGluZy5jIGIvZ3JhcGhpY3MvcGFpbnRpbmcuYwppbmRleCA2Nzk3ZmNjLi41N2IzMzE2IDEwMDY0NAotLS0gYS9ncmFwaGljcy9wYWludGluZy5jCisrKyBiL2dyYXBoaWNzL3BhaW50aW5nLmMKQEAgLTc1NSw4ICs3NTUsOCBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgIFBvbHlQb2x5bGluZTMyICAoR0RJMzIuMjcyKQogICovCi1CT09MMzIgV0lOQVBJIFBvbHlQb2x5bGluZTMyKCBIREMzMiBoZGMsIExQUE9JTlQzMiBwdCwgTFBJTlQzMiBjb3VudHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQzMiBwb2x5bGluZXMgKQorQk9PTDMyIFdJTkFQSSBQb2x5UG9seWxpbmUzMiggSERDMzIgaGRjLCBMUFBPSU5UMzIgcHQsIExQRFdPUkQgY291bnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBwb2x5bGluZXMgKQogewogICAgIERDICogZGMgPSBEQ19HZXREQ1B0ciggaGRjICk7CiAKZGlmZiAtLWdpdCBhL2dyYXBoaWNzL3BzZHJ2L2RyaXZlci5jIGIvZ3JhcGhpY3MvcHNkcnYvZHJpdmVyLmMKaW5kZXggZWFkMzFiYi4uZWU2MmQ2MyAxMDA2NDQKLS0tIGEvZ3JhcGhpY3MvcHNkcnYvZHJpdmVyLmMKKysrIGIvZ3JhcGhpY3MvcHNkcnYvZHJpdmVyLmMKQEAgLTQ0LDggKzQ0LDEwIEBACiAJfQogCWlmKHBhZ2UpIHsKIAkgICAgZG0xLT5kbVB1YmxpYy5kbVBhcGVyU2l6ZSA9IGRtMi0+ZG1QdWJsaWMuZG1QYXBlclNpemU7Ci0JICAgIGRtMS0+ZG1QdWJsaWMuZG1QYXBlcldpZHRoID0gcGFnZS0+UGFwZXJEaW1lbnNpb24tPnggKiAyNS40IC8gNzIuMDsKLQkgICAgZG0xLT5kbVB1YmxpYy5kbVBhcGVyTGVuZ3RoID0gcGFnZS0+UGFwZXJEaW1lbnNpb24tPnkgKiAyNS40IC8gNzIuMDsKKwkgICAgZG0xLT5kbVB1YmxpYy5kbVBhcGVyV2lkdGggPSBwYWdlLT5QYXBlckRpbWVuc2lvbi0+eCAqIAorCQkJCQkJCQkyNTQuMCAvIDcyLjA7CisJICAgIGRtMS0+ZG1QdWJsaWMuZG1QYXBlckxlbmd0aCA9IHBhZ2UtPlBhcGVyRGltZW5zaW9uLT55ICoKKwkJCQkJCQkJMjU0LjAgLyA3Mi4wOwogCSAgICBUUkFDRShwc2RydiwgIkNoYW5naW5nIHBhZ2UgdG8gJXMgJWQgeCAlZFxuIiwgcGFnZS0+RnVsbE5hbWUsCiAJCSAgICAgZG0xLT5kbVB1YmxpYy5kbVBhcGVyV2lkdGgsIGRtMS0+ZG1QdWJsaWMuZG1QYXBlckxlbmd0aCApOwogCX0gZWxzZSB7CmRpZmYgLS1naXQgYS9ncmFwaGljcy9wc2Rydi9pbml0LmMgYi9ncmFwaGljcy9wc2Rydi9pbml0LmMKaW5kZXggMzE5NTIwMC4uNmE2MmE1YSAxMDA2NDQKLS0tIGEvZ3JhcGhpY3MvcHNkcnYvaW5pdC5jCisrKyBiL2dyYXBoaWNzL3BzZHJ2L2luaXQuYwpAQCAtMTY5LDYgKzE2OSwxMiBAQAogCiBIQU5ETEUzMiBQU0RSVl9IZWFwID0gMDsKIAorc3RhdGljIEhBTkRMRTMyIFBTRFJWX0RlZmF1bHRGb250ID0gMDsKK3N0YXRpYyBMT0dGT05UMzJBIERlZmF1bHRMb2dGb250ID0geworICAgIDEwMCwgMCwgMCwgMCwgRldfTk9STUFMLCBGQUxTRSwgRkFMU0UsIEZBTFNFLCBBTlNJX0NIQVJTRVQsIDAsIDAsCisgICAgREVGQVVMVF9RVUFMSVRZLCBGSVhFRF9QSVRDSCB8IEZGX01PREVSTiwgIiIKK307CisKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCSAgICAgUFNEUlZfSW5pdAogICoKQEAgLTE4MCw2ICsxODYsNyBAQAogICAgIFRSQUNFKHBzZHJ2LCAiXG4iKTsKICAgICBQU0RSVl9IZWFwID0gSGVhcENyZWF0ZSgwLCAweDEwMDAwLCAwKTsKICAgICBQU0RSVl9HZXRGb250TWV0cmljcygpOworICAgIFBTRFJWX0RlZmF1bHRGb250ID0gQ3JlYXRlRm9udEluZGlyZWN0MzJBKCZEZWZhdWx0TG9nRm9udCk7CiAgICAgcmV0dXJuIERSSVZFUl9SZWdpc3RlckRyaXZlciggIldJTkVQUyIsICZQU0RSVl9GdW5jcyApOwogfQogCkBAIC0yMjUsMTEgKzIzMiwxMSBAQAogICAgIG1lbWNweShkZXZDYXBzLCAmUFNEUlZfRGV2Q2Fwcywgc2l6ZW9mKFBTRFJWX0RldkNhcHMpKTsKIAogICAgIGlmKHBoeXNEZXYtPkRldm1vZGUtPmRtUHVibGljLmRtT3JpZW50YXRpb24gPT0gRE1PUklFTlRfUE9SVFJBSVQpIHsKLSAgICAgICAgZGV2Q2Fwcy0+aG9yelNpemUgPSBwaHlzRGV2LT5EZXZtb2RlLT5kbVB1YmxpYy5kbVBhcGVyV2lkdGg7Ci0JZGV2Q2Fwcy0+dmVydFNpemUgPSBwaHlzRGV2LT5EZXZtb2RlLT5kbVB1YmxpYy5kbVBhcGVyTGVuZ3RoOworICAgICAgICBkZXZDYXBzLT5ob3J6U2l6ZSA9IHBoeXNEZXYtPkRldm1vZGUtPmRtUHVibGljLmRtUGFwZXJXaWR0aCAvIDEwOworCWRldkNhcHMtPnZlcnRTaXplID0gcGh5c0Rldi0+RGV2bW9kZS0+ZG1QdWJsaWMuZG1QYXBlckxlbmd0aCAvIDEwOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIGRldkNhcHMtPmhvcnpTaXplID0gcGh5c0Rldi0+RGV2bW9kZS0+ZG1QdWJsaWMuZG1QYXBlckxlbmd0aDsKLQlkZXZDYXBzLT52ZXJ0U2l6ZSA9IHBoeXNEZXYtPkRldm1vZGUtPmRtUHVibGljLmRtUGFwZXJXaWR0aDsKKyAgICAgICAgZGV2Q2Fwcy0+aG9yelNpemUgPSBwaHlzRGV2LT5EZXZtb2RlLT5kbVB1YmxpYy5kbVBhcGVyTGVuZ3RoIC8gMTA7CisJZGV2Q2Fwcy0+dmVydFNpemUgPSBwaHlzRGV2LT5EZXZtb2RlLT5kbVB1YmxpYy5kbVBhcGVyV2lkdGggLyAxMDsKICAgICB9CiAKICAgICBkZXZDYXBzLT5ob3J6UmVzID0gcGh5c0Rldi0+cGktPnBwZC0+RGVmYXVsdFJlc29sdXRpb24gKiAKQEAgLTI1Miw2ICsyNTksNyBAQAogICAgIGRjLT53LmhWaXNSZ24gPSBDcmVhdGVSZWN0UmduMzIoMCwgMCwgZGMtPncuZGV2Q2Fwcy0+aG9yelJlcywKICAgICAJCQkgICAgZGMtPncuZGV2Q2Fwcy0+dmVydFJlcyk7CiAgICAgCisgICAgZGMtPncuaEZvbnQgPSBQU0RSVl9EZWZhdWx0Rm9udDsKICAgICBwaHlzRGV2LT5qb2Iub3V0cHV0ID0gSEVBUF9zdHJkdXBBKCBQU0RSVl9IZWFwLCAwLCBvdXRwdXQgKTsKICAgICBwaHlzRGV2LT5qb2IuaEpvYiA9IDA7CiAgICAgcmV0dXJuIFRSVUU7CmRpZmYgLS1naXQgYS9ncmFwaGljcy94MTFkcnYvZ3JhcGhpY3MuYyBiL2dyYXBoaWNzL3gxMWRydi9ncmFwaGljcy5jCmluZGV4IGVmMWNmMWMuLjNlNWYxODkgMTAwNjQ0Ci0tLSBhL2dyYXBoaWNzL3gxMWRydi9ncmFwaGljcy5jCisrKyBiL2dyYXBoaWNzL3gxMWRydi9ncmFwaGljcy5jCkBAIC03NTMsNyArNzUzLDcgQEAKICAqICAgICAgICAgIFgxMURSVl9Qb2x5UG9seWxpbmUKICAqLwogQk9PTDMyIAotWDExRFJWX1BvbHlQb2x5bGluZSggREMgKmRjLCBMUFBPSU5UMzIgcHQsIExQSU5UMzIgY291bnRzLCBVSU5UMzIgcG9seWxpbmVzICkKK1gxMURSVl9Qb2x5UG9seWxpbmUoIERDICpkYywgTFBQT0lOVDMyIHB0LCBMUERXT1JEIGNvdW50cywgRFdPUkQgcG9seWxpbmVzICkKIHsKICAgICBpZiAoRENfU2V0dXBHQ0ZvclBlbiAoIGRjICkpCiAgICAgewpkaWZmIC0tZ2l0IGEvaWYxNjMyL2dkaS5zcGVjIGIvaWYxNjMyL2dkaS5zcGVjCmluZGV4IGQwYTdlZjEuLjhmZGNjODggMTAwNjQ0Ci0tLSBhL2lmMTYzMi9nZGkuc3BlYworKysgYi9pZjE2MzIvZ2RpLnNwZWMKQEAgLTIxOCw3ICsyMTgsNyBAQAogMzA1IHN0dWIgRU5HSU5FR0VUR0xZUEhCTVAKIDMwNiBzdHViIEVOR0lORU1BS0VGT05URElSCiAzMDcgcGFzY2FsMTYgR2V0Q2hhckFCQ1dpZHRocyh3b3JkIHdvcmQgd29yZCBwdHIpIEdldENoYXJBQkNXaWR0aHMxNgotMzA4IHBhc2NhbCAgIEdldE91dGxpbmVUZXh0TWV0cmljcyh3b3JkIHdvcmQgcHRyKSBHZXRPdXRsaW5lVGV4dE1ldHJpY3MKKzMwOCBwYXNjYWwgICBHZXRPdXRsaW5lVGV4dE1ldHJpY3Mod29yZCB3b3JkIHB0cikgR2V0T3V0bGluZVRleHRNZXRyaWNzMTYKIDMwOSBwYXNjYWwgICBHZXRHbHlwaE91dGxpbmUod29yZCB3b3JkIHdvcmQgcHRyIGxvbmcgcHRyIHB0cikgR2V0R2x5cGhPdXRsaW5lMTYKIDMxMCBwYXNjYWwxNiBDcmVhdGVTY2FsYWJsZUZvbnRSZXNvdXJjZSh3b3JkIHN0ciBzdHIgc3RyKSBDcmVhdGVTY2FsYWJsZUZvbnRSZXNvdXJjZTE2CiAzMTEgc3R1YiBHZXRGb250RGF0YQpkaWZmIC0tZ2l0IGEvaWYxNjMyL2tleWJvYXJkLnNwZWMgYi9pZjE2MzIva2V5Ym9hcmQuc3BlYwppbmRleCAzNTRjNWFmLi41MGU5OTYwIDEwMDY0NAotLS0gYS9pZjE2MzIva2V5Ym9hcmQuc3BlYworKysgYi9pZjE2MzIva2V5Ym9hcmQuc3BlYwpAQCAtOCw3ICs4LDcgQEAKIDUgICBwYXNjYWwxNiBBbnNpVG9PZW0oc3RyIHB0cikgQW5zaVRvT2VtMTYKIDYgICBwYXNjYWwxNiBPZW1Ub0Fuc2koc3RyIHB0cikgT2VtVG9BbnNpMTYKIDcgICByZXR1cm4gICBTZXRTcGVlZCAyIDY1NTM1Ci0jMTAwCXBhc2NhbAlTY3JlZW5Td2l0Y2hFbmFibGUKKzEwMAlwYXNjYWwJU2NyZWVuU3dpdGNoRW5hYmxlKHdvcmQpIFNjcmVlblN3aXRjaEVuYWJsZQogIzEyNglwYXNjYWwJR2V0VGFibGVTZWcKICMxMjcJcGFzY2FsCU5ld1RhYmxlCiAxMjggcGFzY2FsICAgT2VtS2V5U2Nhbih3b3JkKSBPZW1LZXlTY2FuCmRpZmYgLS1naXQgYS9pZjE2MzIvcmVsYXkuYyBiL2lmMTYzMi9yZWxheS5jCmluZGV4IGNhOWY2YmIuLjJkNWUzM2UgMTAwNjQ0Ci0tLSBhL2lmMTYzMi9yZWxheS5jCisrKyBiL2lmMTYzMi9yZWxheS5jCkBAIC0yMzYsNyArMjM2LDcgQEAKICAgICBNU0coIk5vIGhhbmRsZXIgZm9yIFdpbjE2IHJvdXRpbmUgJXMgKGNhbGxlZCBmcm9tICUwNHg6JTA0eClcbiIsCiAgICAgICAgICAgICBCVUlMVElOX0dldEVudHJ5UG9pbnQxNihmcmFtZS0+ZW50cnlfY3MsZnJhbWUtPmVudHJ5X2lwLCZvcmRpbmFsKSwKICAgICAgICAgICAgIGZyYW1lLT5jcywgZnJhbWUtPmlwICk7Ci0gICAgVEFTS19LaWxsQ3VycmVudFRhc2soMSk7CisgICAgRXhpdFByb2Nlc3MoMSk7CiB9CiAKIApkaWZmIC0tZ2l0IGEvaWYxNjMyL3VzZXIuc3BlYyBiL2lmMTYzMi91c2VyLnNwZWMKaW5kZXggMjk5OTc3Yi4uM2M5MjVhNDIgMTAwNjQ0Ci0tLSBhL2lmMTYzMi91c2VyLnNwZWMKKysrIGIvaWYxNjMyL3VzZXIuc3BlYwpAQCAtMzY4LDcgKzM2OCw3IEBACiAzOTggcGFzY2FsMTYgR2V0Q2xhc3NJbmZvRXgod29yZCBzZWdzdHIgcHRyKSBHZXRDbGFzc0luZm9FeDE2CiAzOTkgc3R1YiBDaGlsZFdpbmRvd0Zyb21Qb2ludEV4CiA0MDAgc3R1YiBGaW5hbFVzZXJJbml0Ci00MDIgcGFzY2FsMTYgR2V0UHJpb3JpdHlDbGlwYm9hcmRGb3JtYXQod29yZCBwdHIgc193b3JkKSBHZXRQcmlvcml0eUNsaXBib2FyZEZvcm1hdDE2Cis0MDIgcGFzY2FsMTYgR2V0UHJpb3JpdHlDbGlwYm9hcmRGb3JtYXQocHRyIHNfd29yZCkgR2V0UHJpb3JpdHlDbGlwYm9hcmRGb3JtYXQxNgogNDAzIHBhc2NhbDE2IFVucmVnaXN0ZXJDbGFzcyhzZWdzdHIgd29yZCkgVW5yZWdpc3RlckNsYXNzMTYKIDQwNCBwYXNjYWwxNiBHZXRDbGFzc0luZm8od29yZCBzZWdzdHIgcHRyKSBHZXRDbGFzc0luZm8xNgogNDA2IHBhc2NhbDE2IENyZWF0ZUN1cnNvcih3b3JkIHdvcmQgd29yZCB3b3JkIHdvcmQgcHRyIHB0cikgQ3JlYXRlQ3Vyc29yMTYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXV0aG9ycy5oIGIvaW5jbHVkZS9hdXRob3JzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmNmYzcwYgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXV0aG9ycy5oCkBAIC0wLDAgKzEsMTQ3IEBACisjaWZuZGVmIF9fV0lORV9BVVRIT1JTX0gKKyNkZWZpbmUgX19XSU5FX0FVVEhPUlNfSAorCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IFNIRUxMX1Blb3BsZVtdID0KK3sKKyAgICAiQm9iIEFtc3RhZHQiLAorICAgICJEYWcgQXNoZWltIiwKKyAgICAiTWFydGluIEF5b3R0ZSIsCisgICAgIkthcmwgQmFja3N0cvZtIiwKKyAgICAiUGV0ZXIgQmFqdXN6IiwKKyAgICAiTWFyY2VsIEJhdXIiLAorICAgICJHZW9yZyBCZXllcmxlIiwKKyAgICAiUm9zcyBCaXJvIiwKKyAgICAiTWFydGluIEJvZWhtZSIsCisgICAgIlV3ZSBCb25uZXMiLAorICAgICJFcmlrIEJvcyIsCisgICAgIkZvbnMgQm90bWFuIiwKKyAgICAiSm9obiBCcmV6YWsiLAorICAgICJBbmRyZXcgQnVsaGFrIiwKKyAgICAiSm9obiBCdXJ0b24iLAorICAgICJOaWVscyBkZSBDYXJwZW50aWVyIiwKKyAgICAiR29yZG9uIENoYWZmZWUiLAorICAgICJKaW1lbiBDaGluZyIsCisgICAgIlBhc2NhbCBDdW9xIiwKKyAgICAiRGF2aWQgQS4gQ3V0aGJlcnQiLAorICAgICJIdXcgRC4gTS4gRGF2aWVzIiwKKyAgICAiUm9tYW4gRG9sZWpzaSIsCisgICAgIkZyYW5zIHZhbiBEb3Jzc2VsYWVyIiwKKyAgICAiQ2hyaXMgRmFoZXJ0eSIsCisgICAgIkNhcnN0ZW4gRmFsbGVzZW4iLAorICAgICJQYXVsIEZhbHN0YWQiLAorICAgICJEYXZpZCBGYXVyZSIsCisgICAgIkNsYXVzIEZpc2NoZXIiLAorICAgICJPbGFmIEZsZWJiZSIsCisgICAgIkNoYWQgRnJhbGVpZ2giLAorICAgICJNYXR0aGV3IEZyYW5jaXMiLAorICAgICJQZXRlciBHYWxiYXZ5IiwKKyAgICAiUmFtb24gR2FyY2lhIiwKKyAgICAiTWF0dGhldyBHaGlvIiwKKyAgICAiSm9keSBHb2xkYmVyZyIsCisgICAgIkhhbnMgZGUgR3JhYWZmIiwKKyAgICAiQ2hhcmxlcyBNLiBIYW5udW0iLAorICAgICJBZHJpYW4gSGFydmV5IiwKKyAgICAiSm9obiBIYXJ2ZXkiLAorICAgICJCaWxsIEhhd2VzIiwKKyAgICAiQ2FtZXJvbiBIZWlkZSIsCisgICAgIkpvY2hlbiBIb2VuaWNrZSIsCisgICAgIk9ubm8gSG92ZXJzIiwKKyAgICAiSmVmZnJleSBIc3UiLAorICAgICJNaWd1ZWwgZGUgSWNhemEiLAorICAgICJKdWtrYSBJaXZvbmVuIiwKKyAgICAiTGVlIEphZWtpbCIsCisgICAgIkFsZXhhbmRyZSBKdWxsaWFyZCIsCisgICAgIkJhbmcgSnVuLVlvdW5nIiwKKyAgICAiUGF2ZWwgS2Fua292c2t5IiwKKyAgICAiSm9jaGVuIEthcnJlciIsCisgICAgIkFuZHJlYXMgS2lyc2NoYmF1bSIsCisgICAgIlJlaW4gS2xhemVzIiwKKyAgICAiQWxicmVjaHQgS2xlaW5lIiwKKyAgICAiRXJpYyBLb2hsIiwKKyAgICAiSm9uIEtvbnJhdGgiLAorICAgICJBbGV4IEtvcm9ia2EiLAorICAgICJHcmVnIEtyZWlkZXIiLAorICAgICJBbmFuZCBLdW1yaWEiLAorICAgICJPdmUgS+V2ZW4iLAorICAgICJTY290dCBBLiBMYWlyZCIsCisgICAgIkRhdmlkIExlZSBMYW1iZXJ0IiwKKyAgICAiQW5kcmV3IExld3lja3kiLAorICAgICJQZXIgTGluZHN0cvZtIiwKKyAgICAiTWFydGluIHZvbiBMb2V3aXMiLAorICAgICJNaWNoaWVsIHZhbiBMb29uIiwKKyAgICAiS2VubmV0aCBNYWNEb25hbGQiLAorICAgICJQZXRlciBNYWNEb25hbGQiLAorICAgICJXaWxsaWFtIE1hZ3JvIiwKKyAgICAiSnVlcmdlbiBNYXJxdWFyZHQiLAorICAgICJSaWNhcmRvIE1hc3Nhcm8iLAorICAgICJNYXJjdXMgTWVpc3NuZXIiLAorICAgICJHcmFoYW0gTWVuaGVubml0dCIsCisgICAgIkRhdmlkIE1ldGNhbGZlIiwKKyAgICAiQnJ1Y2UgTWlsbmVyIiwKKyAgICAiU3RlZmZlbiBNb2VsbGVyIiwKKyAgICAiQW5kcmVhcyBNb2hyIiwKKyAgICAiSmFtZXMgTW9vZHkiLAorICAgICJQaGlsaXBwZSBEZSBNdXl0ZXIiLAorICAgICJJdGFpIE5haHNob24iLAorICAgICJLcmlzdGlhbiBOaWVsc2VuIiwKKyAgICAiSGVucmlrIE9sc2VuIiwKKyAgICAiTWljaGFlbCBQYXRyYSIsCisgICAgIkRpbWl0cmllIE8uIFBhdW4iLAorICAgICJKaW0gUGV0ZXJzb24iLAorICAgICJSb2JlcnQgUG91bGlvdCIsCisgICAgIktlaXRoIFJleW5vbGRzIiwKKyAgICAiU2xhdmVuIFJlemljIiwKKyAgICAiSm9obiBSaWNoYXJkc29uIiwKKyAgICAiUmljayBSaWNoYXJkc29uIiwKKyAgICAiRG91ZyBSaWRnd2F5IiwKKyAgICAiQmVybmhhcmQgUm9zZW5rcmFlbnplciIsCisgICAgIkpvaGFubmVzIFJ1c2NoZWluc2tpIiwKKyAgICAiVGhvbWFzIFNhbmRmb3JkIiwKKyAgICAiQ29uc3RhbnRpbmUgU2FwdW50emFraXMiLAorICAgICJQYWJsbyBTYXJhdHhhZ2EiLAorICAgICJEYW5pZWwgU2NoZXBsZXIiLAorICAgICJQZXRlciBTY2hsYWlsZSIsCisgICAgIlVscmljaCBTY2htaWQiLAorICAgICJCZXJuZCBTY2htaWR0IiwKKyAgICAiSnVlcmdlbiBTY2htaWVkIiwKKyAgICAiSW5nbyBTY2huZWlkZXIiLAorICAgICJWaWN0b3IgU2NobmVpZGVyIiwKKyAgICAiWW5ndmkgU2lndXJqb25zc29uIiwKKyAgICAiU3RlcGhlbiBTaW1tb25zIiwKKyAgICAiUmljayBTbGFka2V5IiwKKyAgICAiV2lsbGlhbSBTbWl0aCIsCisgICAgIkRvbWluaWsgU3RyYXNzZXIiLAorICAgICJWYWRpbSBTdHJpemhldnNreSIsCisgICAgIkJlcnRobyBTdHVsdGllbnMiLAorICAgICJFcmlrIFN2ZW5kc2VuIiwKKyAgICAiVHJpc3RhbiBUYXJyYW50IiwKKyAgICAiQW5kcmV3IFRheWxvciIsCisgICAgIkR1bmNhbiBDIFRob21zb24iLAorICAgICJHb3JhbiBUaHluaSIsCisgICAgIkppbW15IFRpcnRhd2FuZ3NhIiwKKyAgICAiSm9uIFRvbWJzIiwKKyAgICAiTGludXMgVG9ydmFsZHMiLAorICAgICJHcmVnb3J5IFRydWJldHNrb3kiLAorICAgICJQZXRyaSBUdW9tb2xhIiwKKyAgICAiTWljaGFlbCBWZWtzbGVyIiwKKyAgICAiU3ZlbiBWZXJkb29sYWVnZSIsCisgICAgIlJvbmFuIFdhaWRlIiwKKyAgICAiRXJpYyBXYXJua2UiLAorICAgICJNYW5mcmVkIFdlaWNoZWwiLAorICAgICJVbHJpY2ggV2VpZ2FuZCIsCisgICAgIk1vcnRlbiBXZWxpbmRlciIsCisgICAgIkxlbiBXaGl0ZSIsCisgICAgIkxhd3NvbiBXaGl0bmV5IiwKKyAgICAiSmFuIFdpbGxhbW93aXVzIiwKKyAgICAiQ2FybCBXaWxsaWFtcyIsCisgICAgIkthcmwgR3VlbnRlciBXdWVuc2NoIiwKKyAgICAiRXJpYyBZb3VuZ2RhbGUiLAorICAgICJKYW1lcyBZb3VuZ21hbiIsCisgICAgIk5pa2l0YSBWLiBZb3VzaGNoZW5rbyIsCisgICAgIk1pa29sYWogWmFsZXdza2kiLAorICAgICJKb2huIFplcm8iLAorICAgICJMdWl6IE90YXZpbyBMLiBab3J6ZWxsYSIsCisgICAgTlVMTAorfTsKKworI2VuZGlmICAvKiBfX1dJTkVfQVVUSE9SU19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbW1jdHJsLmggYi9pbmNsdWRlL2NvbW1jdHJsLmgKaW5kZXggMDRmMjlmZi4uMzI4NGM5OCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb21tY3RybC5oCisrKyBiL2luY2x1ZGUvY29tbWN0cmwuaApAQCAtNTUsMTQgKzU1LDY0IEBACiAjZGVmaW5lIENDTV9GSVJTVCAgICAgICAgICAgIDB4MjAwMAogCiAjZGVmaW5lIENDTV9TRVRCS0NPTE9SICAgICAgIChDQ01fRklSU1QrMSkgICAgIC8qIGxQYXJhbSA9IGJrQ29sb3IgKi8KLQorI2RlZmluZSBDQ01fU0VUQ09MT1JTQ0hFTUUgICAoQ0NNX0ZJUlNUKzIpCisjZGVmaW5lIENDTV9HRVRDT0xPUlNDSEVNRSAgIChDQ01fRklSU1QrMykKKyNkZWZpbmUgQ0NNX0dFVERST1BUQVJHRVQgICAgKENDTV9GSVJTVCs0KQogI2RlZmluZSBDQ01fU0VUVU5JQ09ERUZPUk1BVCAoQ0NNX0ZJUlNUKzUpCiAjZGVmaW5lIENDTV9HRVRVTklDT0RFRk9STUFUIChDQ01fRklSU1QrNikKIAogCi0vKiBjb21tb24gbm90aWZpY2F0aW9uIGNvZGVzICovCi0jZGVmaW5lIE5NX0ZJUlNUICAgICAgICAgICAgICgwVS0wVSkKLSNkZWZpbmUgTk1fTEFTVCAgICAgICAgICAgICAgKDBVLTk5VSkKKy8qIGNvbW1vbiBub3RpZmljYXRpb24gY29kZXMgKFdNX05PVElGWSkqLworI2RlZmluZSBOTV9GSVJTVCAgICAgICAgICAgICAgICAoMFUtICAwVSkgICAgICAgLy8gZ2VuZXJpYyB0byBhbGwgY29udHJvbHMKKyNkZWZpbmUgTk1fTEFTVCAgICAgICAgICAgICAgICAgKDBVLSA5OVUpCisKKyNkZWZpbmUgTFZOX0ZJUlNUICAgICAgICAgICAgICAgKDBVLTEwMFUpICAgICAgIC8vIGxpc3R2aWV3CisjZGVmaW5lIExWTl9MQVNUICAgICAgICAgICAgICAgICgwVS0xOTlVKQorCisjZGVmaW5lIEhETl9GSVJTVCAgICAgICAgICAgICAgICgwVS0zMDBVKSAgICAgICAvLyBoZWFkZXIKKyNkZWZpbmUgSEROX0xBU1QgICAgICAgICAgICAgICAgKDBVLTM5OVUpCisKKyNkZWZpbmUgVFZOX0ZJUlNUICAgICAgICAgICAgICAgKDBVLTQwMFUpICAgICAgIC8vIHRyZWV2aWV3CisjZGVmaW5lIFRWTl9MQVNUICAgICAgICAgICAgICAgICgwVS00OTlVKQorCisjZGVmaW5lIFRUTl9GSVJTVCAgICAgICAgICAgICAgICgwVS01MjBVKSAgICAgICAvLyB0b29sdGlwcworI2RlZmluZSBUVE5fTEFTVCAgICAgICAgICAgICAgICAoMFUtNTQ5VSkKKworI2RlZmluZSBUQ05fRklSU1QgICAgICAgICAgICAgICAoMFUtNTUwVSkgICAgICAgLy8gdGFiIGNvbnRyb2wKKyNkZWZpbmUgVENOX0xBU1QgICAgICAgICAgICAgICAgKDBVLTU4MFUpCisKKy8vIFNoZWxsIHJlc2VydmVkICAgICAgICAgICAgICAgKDBVLTU4MFUpIC0gICgwVS01ODlVKQorCisjZGVmaW5lIENETl9GSVJTVCAgICAgICAgICAgICAgICgwVS02MDFVKSAgICAgICAvLyBjb21tb24gZGlhbG9nIChuZXcpCisjZGVmaW5lIENETl9MQVNUICAgICAgICAgICAgICAgICgwVS02OTlVKQorCisjZGVmaW5lIFRCTl9GSVJTVCAgICAgICAgICAgICAgICgwVS03MDBVKSAgICAgICAvLyB0b29sYmFyCisjZGVmaW5lIFRCTl9MQVNUICAgICAgICAgICAgICAgICgwVS03MjBVKQorCisjZGVmaW5lIFVETl9GSVJTVCAgICAgICAgICAgICAgICgwVS03MjEpICAgICAgICAvLyB1cGRvd24KKyNkZWZpbmUgVUROX0xBU1QgICAgICAgICAgICAgICAgKDBVLTc0MCkKKworI2RlZmluZSBNQ05fRklSU1QgICAgICAgICAgICAgICAoMFUtNzUwVSkgICAgICAgLy8gbW9udGhjYWwKKyNkZWZpbmUgTUNOX0xBU1QgICAgICAgICAgICAgICAgKDBVLTc1OVUpCisKKyNkZWZpbmUgRFROX0ZJUlNUICAgICAgICAgICAgICAgKDBVLTc2MFUpICAgICAgIC8vIGRhdGV0aW1lcGljaworI2RlZmluZSBEVE5fTEFTVCAgICAgICAgICAgICAgICAoMFUtNzk5VSkKKworI2RlZmluZSBDQkVOX0ZJUlNUICAgICAgICAgICAgICAoMFUtODAwVSkgICAgICAgLy8gY29tYm8gYm94IGV4CisjZGVmaW5lIENCRU5fTEFTVCAgICAgICAgICAgICAgICgwVS04MzBVKQorCisjZGVmaW5lIFJCTl9GSVJTVCAgICAgICAgICAgICAgICgwVS04MzFVKSAgICAgICAvLyByZWJhcgorI2RlZmluZSBSQk5fTEFTVCAgICAgICAgICAgICAgICAoMFUtODU5VSkKKworI2RlZmluZSBJUE5fRklSU1QgICAgICAgICAgICAgICAoMFUtODYwVSkgICAgICAgLy8gaW50ZXJuZXQgYWRkcmVzcworI2RlZmluZSBJUE5fTEFTVCAgICAgICAgICAgICAgICAoMFUtODc5VSkgICAgICAgLy8gaW50ZXJuZXQgYWRkcmVzcworCisjZGVmaW5lIFNCTl9GSVJTVCAgICAgICAgICAgICAgICgwVS04ODBVKSAgICAgICAvLyBzdGF0dXMgYmFyCisjZGVmaW5lIFNCTl9MQVNUICAgICAgICAgICAgICAgICgwVS04OTlVKQorCisjZGVmaW5lIFBHTl9GSVJTVCAgICAgICAgICAgICAgICgwVS05MDBVKSAgICAgICAvLyBQYWdlciBDb250cm9sCisjZGVmaW5lIFBHTl9MQVNUICAgICAgICAgICAgICAgICgwVS05NTBVKQorCiAKICNkZWZpbmUgTk1fT1VUT0ZNRU1PUlkgICAgICAgKE5NX0ZJUlNULTEpCiAjZGVmaW5lIE5NX0NMSUNLICAgICAgICAgICAgIChOTV9GSVJTVC0yKQpAQCAtODEsNiArMTMxLDY2IEBACiAjZGVmaW5lIE5NX0NIQVIgICAgICAgICAgICAgIChOTV9GSVJTVC0xOCkKICNkZWZpbmUgTk1fVE9PTFRJUFNDUkVBVEVEICAgKE5NX0ZJUlNULTE5KQogCisjZGVmaW5lIEhETl9JVEVNQ0hBTkdJTkdBICAgICAgIChIRE5fRklSU1QtMCkKKyNkZWZpbmUgSEROX0lURU1DSEFOR0lOR1cgICAgICAgKEhETl9GSVJTVC0yMCkKKyNkZWZpbmUgSEROX0lURU1DSEFOR0VEQSAgICAgICAgKEhETl9GSVJTVC0xKQorI2RlZmluZSBIRE5fSVRFTUNIQU5HRURXICAgICAgICAoSEROX0ZJUlNULTIxKQorI2RlZmluZSBIRE5fSVRFTUNMSUNLQSAgICAgICAgICAoSEROX0ZJUlNULTIpCisjZGVmaW5lIEhETl9JVEVNQ0xJQ0tXICAgICAgICAgIChIRE5fRklSU1QtMjIpCisjZGVmaW5lIEhETl9JVEVNREJMQ0xJQ0tBICAgICAgIChIRE5fRklSU1QtMykKKyNkZWZpbmUgSEROX0lURU1EQkxDTElDS1cgICAgICAgKEhETl9GSVJTVC0yMykKKyNkZWZpbmUgSEROX0RJVklERVJEQkxDTElDS0EgICAgKEhETl9GSVJTVC01KQorI2RlZmluZSBIRE5fRElWSURFUkRCTENMSUNLVyAgICAoSEROX0ZJUlNULTI1KQorI2RlZmluZSBIRE5fQkVHSU5UUkFDS0EgICAgICAgICAoSEROX0ZJUlNULTYpCisjZGVmaW5lIEhETl9CRUdJTlRSQUNLVyAgICAgICAgIChIRE5fRklSU1QtMjYpCisjZGVmaW5lIEhETl9FTkRUUkFDS0EgICAgICAgICAgIChIRE5fRklSU1QtNykKKyNkZWZpbmUgSEROX0VORFRSQUNLVyAgICAgICAgICAgKEhETl9GSVJTVC0yNykKKyNkZWZpbmUgSEROX1RSQUNLQSAgICAgICAgICAgICAgKEhETl9GSVJTVC04KQorI2RlZmluZSBIRE5fVFJBQ0tXICAgICAgICAgICAgICAoSEROX0ZJUlNULTI4KQorI2RlZmluZSBIRE5fR0VURElTUElORk9BICAgICAgICAoSEROX0ZJUlNULTkpCisjZGVmaW5lIEhETl9HRVRESVNQSU5GT1cgICAgICAgIChIRE5fRklSU1QtMjkpCisjZGVmaW5lIEhETl9CRUdJTkRSQUcgICAgICAgICAgIChIRE5fRklSU1QtMTApCisjZGVmaW5lIEhETl9FTkREUkFHICAgICAgICAgICAgIChIRE5fRklSU1QtMTEpCisKKworI2RlZmluZSBIRE5fSVRFTUNIQU5HSU5HICAgICAgICAgSEROX0lURU1DSEFOR0lOR0EKKyNkZWZpbmUgSEROX0lURU1DSEFOR0VEICAgICAgICAgIEhETl9JVEVNQ0hBTkdFREEKKyNkZWZpbmUgSEROX0lURU1DTElDSyAgICAgICAgICAgIEhETl9JVEVNQ0xJQ0tBCisjZGVmaW5lIEhETl9JVEVNREJMQ0xJQ0sgICAgICAgICBIRE5fSVRFTURCTENMSUNLQQorI2RlZmluZSBIRE5fRElWSURFUkRCTENMSUNLICAgICAgSEROX0RJVklERVJEQkxDTElDS0EKKyNkZWZpbmUgSEROX0JFR0lOVFJBQ0sgICAgICAgICAgIEhETl9CRUdJTlRSQUNLQQorI2RlZmluZSBIRE5fRU5EVFJBQ0sgICAgICAgICAgICAgSEROX0VORFRSQUNLQQorI2RlZmluZSBIRE5fVFJBQ0sgICAgICAgICAgICAgICAgSEROX1RSQUNLQQorI2RlZmluZSBIRE5fR0VURElTUElORk8gICAgICAgICAgSEROX0dFVERJU1BJTkZPQQorCisjZGVmaW5lIExWTl9JVEVNQ0hBTkdJTkcgICAgICAgIChMVk5fRklSU1QtMCkKKyNkZWZpbmUgTFZOX0lURU1DSEFOR0VEICAgICAgICAgKExWTl9GSVJTVC0xKQorI2RlZmluZSBMVk5fSU5TRVJUSVRFTSAgICAgICAgICAoTFZOX0ZJUlNULTIpCisjZGVmaW5lIExWTl9ERUxFVEVJVEVNICAgICAgICAgIChMVk5fRklSU1QtMykKKyNkZWZpbmUgTFZOX0RFTEVURUFMTElURU1TICAgICAgKExWTl9GSVJTVC00KQorI2RlZmluZSBMVk5fQkVHSU5MQUJFTEVESVRBICAgICAoTFZOX0ZJUlNULTUpCisjZGVmaW5lIExWTl9CRUdJTkxBQkVMRURJVFcgICAgIChMVk5fRklSU1QtNzUpCisjZGVmaW5lIExWTl9FTkRMQUJFTEVESVRBICAgICAgIChMVk5fRklSU1QtNikKKyNkZWZpbmUgTFZOX0VORExBQkVMRURJVFcgICAgICAgKExWTl9GSVJTVC03NikKKyNkZWZpbmUgTFZOX0NPTFVNTkNMSUNLICAgICAgICAgKExWTl9GSVJTVC04KQorI2RlZmluZSBMVk5fQkVHSU5EUkFHICAgICAgICAgICAoTFZOX0ZJUlNULTkpCisjZGVmaW5lIExWTl9CRUdJTlJEUkFHICAgICAgICAgIChMVk5fRklSU1QtMTEpCisjZGVmaW5lIExWTl9PRENBQ0hFSElOVCAgICAgICAgIChMVk5fRklSU1QtMTMpCisjZGVmaW5lIExWTl9PREZJTkRJVEVNQSAgICAgICAgIChMVk5fRklSU1QtNTIpCisjZGVmaW5lIExWTl9PREZJTkRJVEVNVyAgICAgICAgIChMVk5fRklSU1QtNzkpCisjZGVmaW5lIExWTl9JVEVNQUNUSVZBVEUgICAgICAgIChMVk5fRklSU1QtMTQpCisjZGVmaW5lIExWTl9PRFNUQVRFQ0hBTkdFRCAgICAgIChMVk5fRklSU1QtMTUpCisjZGVmaW5lIExWTl9IT1RUUkFDSyAgICAgICAgICAgIChMVk5fRklSU1QtMjEpCisjZGVmaW5lIExWTl9HRVRESVNQSU5GT0EgICAgICAgIChMVk5fRklSU1QtNTApCisjZGVmaW5lIExWTl9HRVRESVNQSU5GT1cgICAgICAgIChMVk5fRklSU1QtNzcpCisjZGVmaW5lIExWTl9TRVRESVNQSU5GT0EgICAgICAgIChMVk5fRklSU1QtNTEpCisjZGVmaW5lIExWTl9TRVRESVNQSU5GT1cgICAgICAgIChMVk5fRklSU1QtNzgpCisKKyNkZWZpbmUgTFZOX09ERklORElURU0gICAgICAgICAgTFZOX09ERklORElURU1BCisjZGVmaW5lIExWTl9CRUdJTkxBQkVMRURJVCAgICAgIExWTl9CRUdJTkxBQkVMRURJVEEKKyNkZWZpbmUgTFZOX0VORExBQkVMRURJVCAgICAgICAgTFZOX0VORExBQkVMRURJVEEKKyNkZWZpbmUgTFZOX0dFVERJU1BJTkZPICAgICAgICAgTFZOX0dFVERJU1BJTkZPQQorI2RlZmluZSBMVk5fU0VURElTUElORk8gICAgICAgICBMVk5fU0VURElTUElORk9BCiAKIC8qIGNhbGxiYWNrIGNvbnN0YW50cyAqLwogI2RlZmluZSBMUFNUUl9URVhUQ0FMTEJBQ0szMkEgICAgKChMUFNUUiktMUwpCkBAIC05NTIsNiArMTA2MiwxMDMgQEAKICNkZWZpbmUgUkVCQVJDTEFTU05BTUUzMlcgICAgICAgTCJSZUJhcldpbmRvdzMyIgogI2RlZmluZSBSRUJBUkNMQVNTTkFNRSAgV0lORUxJQl9OQU1FX0FXKFJFQkFSQ0xBU1NOQU1FKQogCisjZGVmaW5lIFJCSU1fSU1BR0VMSVNUICAgICAgICAgIDB4MDAwMDAwMDEKKworI2RlZmluZSBSQkJJTV9TVFlMRSAgICAgICAgICAgICAweDAwMDAwMDAxCisjZGVmaW5lIFJCQklNX0NPTE9SUyAgICAgICAgICAgIDB4MDAwMDAwMDIKKyNkZWZpbmUgUkJCSU1fVEVYVCAgICAgICAgICAgICAgMHgwMDAwMDAwNAorI2RlZmluZSBSQkJJTV9JTUFHRSAgICAgICAgICAgICAweDAwMDAwMDA4CisjZGVmaW5lIFJCQklNX0NISUxEICAgICAgICAgICAgIDB4MDAwMDAwMTAKKyNkZWZpbmUgUkJCSU1fQ0hJTERTSVpFICAgICAgICAgMHgwMDAwMDAyMAorI2RlZmluZSBSQkJJTV9TSVpFICAgICAgICAgICAgICAweDAwMDAwMDQwCisjZGVmaW5lIFJCQklNX0JBQ0tHUk9VTkQgICAgICAgIDB4MDAwMDAwODAKKyNkZWZpbmUgUkJCSU1fSUQgICAgICAgICAgICAgICAgMHgwMDAwMDEwMAorI2RlZmluZSBSQkJJTV9JREVBTFNJWkUgICAgICAgICAweDAwMDAwMjAwCisjZGVmaW5lIFJCQklNX0xQQVJBTSAgICAgICAgICAgIDB4MDAwMDA0MDAKKyNkZWZpbmUgUkJCSU1fSEVBREVSU0laRSAgICAgICAgMHgwMDAwMDgwMAorCisKKyNkZWZpbmUgUkJfSU5TRVJUQkFORDMyQSAgICAgICAgKFdNX1VTRVIrMSkKKyNkZWZpbmUgUkJfSU5TRVJUQkFORDMyVyAgICAgICAgKFdNX1VTRVIrMTApCisjZGVmaW5lIFJCX0lOU0VSVEJBTk5EIFdJTkVMSUJfTkFNRV9BVyhSQl9JTlNFUlRCQU5EKQorI2RlZmluZSBSQl9ERUxFVEVCQU5EICAgICAgICAgICAoV01fVVNFUisyKQorI2RlZmluZSBSQl9HRVRCQVJJTkZPICAgICAgICAgICAoV01fVVNFUiszKQorI2RlZmluZSBSQl9TRVRCQVJJTkZPICAgICAgICAgICAoV01fVVNFUis0KQorI2RlZmluZSBSQl9HRVRCQU5ESU5GTzMyICAgICAgICAoV01fVVNFUis1KSAgIC8qIGp1c3QgZm9yIGNvbXBhdGliaWxpdHkgKi8KKyNkZWZpbmUgUkJfU0VUQkFORElORk8zMkEgICAgICAgKFdNX1VTRVIrNikKKyNkZWZpbmUgUkJfU0VUQkFORElORk8zMlcgICAgICAgKFdNX1VTRVIrMTEpCisjZGVmaW5lIFJCX1NFVEJBTkRJTkZPIFdJTkVMSUJfTkFNRV9BVyhSQl9TRVRCQU5ESU5GTykKKyNkZWZpbmUgUkJfU0VUUEFSRU5UICAgICAgICAgICAgKFdNX1VTRVIrNykKKyNkZWZpbmUgUkJfSElUVEVTVCAgICAgICAgICAgICAgKFdNX1VTRVIrOCkKKyNkZWZpbmUgUkJfR0VUUkVDVCAgICAgICAgICAgICAgKFdNX1VTRVIrOSkKKyNkZWZpbmUgUkJfR0VUQkFORENPVU5UICAgICAgICAgKFdNX1VTRVIrMTIpCisjZGVmaW5lIFJCX0dFVFJPV0NPVU5UICAgICAgICAgIChXTV9VU0VSKzEzKQorI2RlZmluZSBSQl9HRVRST1dIRUlHSFQgICAgICAgICAoV01fVVNFUisxNCkKKyNkZWZpbmUgUkJfSURUT0lOREVYICAgICAgICAgICAgKFdNX1VTRVIrMTYpCisjZGVmaW5lIFJCX0dFVFRPT0xUSVBTICAgICAgICAgIChXTV9VU0VSKzE3KQorI2RlZmluZSBSQl9TRVRUT09MVElQUyAgICAgICAgICAoV01fVVNFUisxOCkKKyNkZWZpbmUgUkJfU0VUQktDT0xPUiAgICAgICAgICAgKFdNX1VTRVIrMTkpCisjZGVmaW5lIFJCX0dFVEJLQ09MT1IgICAgICAgICAgIChXTV9VU0VSKzIwKQorI2RlZmluZSBSQl9TRVRURVhUQ09MT1IgICAgICAgICAoV01fVVNFUisyMSkKKyNkZWZpbmUgUkJfR0VUVEVYVENPTE9SICAgICAgICAgKFdNX1VTRVIrMjIpCisjZGVmaW5lIFJCX1NJWkVUT1JFQ1QgICAgICAgICAgIChXTV9VU0VSKzIzKQorI2RlZmluZSBSQl9CRUdJTkRSQUcgICAgICAgICAgICAoV01fVVNFUisyNCkKKyNkZWZpbmUgUkJfRU5ERFJBRyAgICAgICAgICAgICAgKFdNX1VTRVIrMjUpCisjZGVmaW5lIFJCX0RSQUdNT1ZFICAgICAgICAgICAgIChXTV9VU0VSKzI2KQorI2RlZmluZSBSQl9HRVRCQVJIRUlHSFQgICAgICAgICAoV01fVVNFUisyNykKKyNkZWZpbmUgUkJfR0VUQkFORElORk8zMlcgICAgICAgKFdNX1VTRVIrMjgpCisjZGVmaW5lIFJCX0dFVEJBTkRJTkZPMzJBICAgICAgIChXTV9VU0VSKzI5KQorI2RlZmluZSBSQl9HRVRCQU5ESU5GTyBXSU5FTElCX05BTUVfQVcoUkJfR0VUQkFORElORk8pCisjZGVmaW5lIFJCX01JTklNSVpFQkFORCAgICAgICAgIChXTV9VU0VSKzMwKQorI2RlZmluZSBSQl9NQVhJTUlaRUJBTkQgICAgICAgICAoV01fVVNFUiszMSkKKworI2RlZmluZSBSQl9HRVRCQU5ET1JERVJTICAgICAgICAoV01fVVNFUiszNCkKKyNkZWZpbmUgUkJfU0hPV0JBTkQgICAgICAgICAgICAgKFdNX1VTRVIrMzUpCisKKyNkZWZpbmUgUkJfU0VUUEFMRVRURSAgICAgICAgICAgKFdNX1VTRVIrMzcpCisjZGVmaW5lIFJCX0dFVFBBTEVUVEUgICAgICAgICAgIChXTV9VU0VSKzM4KQorI2RlZmluZSBSQl9NT1ZFQkFORCAgICAgICAgICAgICAoV01fVVNFUiszOSkKKyNkZWZpbmUgUkJfR0VURFJPUFRBUkdFVCAgICAgICAgQ0NTX0dFVERST1BUQVJHRVQKKyNkZWZpbmUgUkJfU0VUQ09MT1JTQ0hFTUUgICAgICAgQ0NTX1NFVENPTE9SU0NIRU1FCisjZGVmaW5lIFJCX0dFVENPTE9SU0NIRU1FICAgICAgIENDU19HRVRDT0xPUlNDSEVNRQorI2RlZmluZSBSQl9TRVRVTklDT0RFRk9STUFUICAgICBDQ1NfU0VUVU5JQ09ERUZPUk1BVAorI2RlZmluZSBSQl9HRVRVTklDT0RFRk9STUFUICAgICBDQ1NfR0VUVU5JQ09ERUZPUk1BVAorCisKK3R5cGVkZWYgc3RydWN0IHRhZ1JFQkFSSU5GTworeworICAgIFVJTlQzMiAgICAgY2JTaXplOworICAgIFVJTlQzMiAgICAgZk1hc2s7CisgICAgSElNQUdFTElTVCBoaW1sOworfSBSRUJBUklORk8sICpMUFJFQkFSSU5GTzsKKwordHlwZWRlZiBzdHJ1Y3QgdGFnUkVCQVJCQU5ESU5GT0EKK3sKKyAgICBVSU5UMzIgICAgY2JTaXplOworICAgIFVJTlQzMiAgICBmTWFzazsKKyAgICBVSU5UMzIgICAgZlN0eWxlOworICAgIENPTE9SUkVGICBjbHJGb3JlOworICAgIENPTE9SUkVGICBjbHJCYWNrOworICAgIExQU1RSICAgICBscFRleHQ7CisgICAgVUlOVDMyICAgIGNjaDsKKyAgICBJTlQzMiAgICAgaUltYWdlOworICAgIEhXTkQzMiAgICBod25kQ2hpbGQ7CisgICAgVUlOVDMyICAgIGN4TWluQ2hpbGQ7CisgICAgVUlOVDMyICAgIGN5TWluQ2hpbGQ7CisgICAgVUlOVDMyICAgIGN4OworICAgIEhCSVRNQVAzMiBoYm1CYWNrOworICAgIFVJTlQzMiAgICB3SUQ7CisgICAgVUlOVDMyICAgIGN5Q2hpbGQ7CisgICAgVUlOVDMyICAgIGN5TWF4Q2hpbGQ7CisgICAgVUlOVDMyICAgIGN5SW50ZWdyYWw7CisgICAgVUlOVDMyICAgIGN4SWRlYWw7CisgICAgTFBBUkFNICAgIGxQYXJhbTsKKyAgICBVSU5UMzIgICAgY3hIZWFkZXI7Cit9IFJFQkFSQkFORElORk8zMkEsICpMUFJFQkFSQkFORElORk8zMkE7CisKKworCisKIAogLyogVHJhY2tiYXIgY29udHJvbCAqLwogCkBAIC0xMTE5LDggKzEzMjYsMTk2IEBACiAjZGVmaW5lIExWTV9GSVJTVCAgICAgICAgICAgICAgIDB4MTAwMAogCiAjZGVmaW5lIExWTV9TRVRCS0NPTE9SICAgICAgICAgIChMVk1fRklSU1QrMSkKKyNkZWZpbmUgTFZNX0dFVElNQUdFTElTVCAgICAgICAgKExWTV9GSVJTVCsyKQogI2RlZmluZSBMVk1fU0VUSU1BR0VMSVNUICAgICAgICAoTFZNX0ZJUlNUKzMpCisjZGVmaW5lIExWTV9HRVRJVEVNQ09VTlQgICAgICAgIChMVk1fRklSU1QrNCkKKyNkZWZpbmUgTFZNX0dFVElURU0gICAgICAgICAgICAgKExWTV9GSVJTVCs1KQorI2RlZmluZSBMVk1fSU5TRVJUSVRFTSAgICAgICAgICAoTFZNX0ZJUlNUKzcpCisjZGVmaW5lIExWTV9ERUxFVEVBTExJVEVNUyAgICAgIChMVk1fRklSU1QrOSkKKyNkZWZpbmUgTFZNX1NFVElURU1QT1NJVElPTiAgICAgKExWTV9GSVJTVCsxNSkKKyNkZWZpbmUgTFZNX0lOU0VSVENPTFVNTiAgICAgICAgKExWTV9GSVJTVCsyNykKKyNkZWZpbmUgTFZNX1NPUlRJVEVNUyAgICAgICAgICAgKExWTV9GSVJTVCs0OCkKKyNkZWZpbmUgTFZNX0dFVFNFTEVDVEVEQ09VTlQgICAgKExWTV9GSVJTVCs1MCkKIAorI2RlZmluZSBMVlNfSUNPTiAgICAgICAgICAgICAgICAweDAwMDAKKyNkZWZpbmUgTFZTX1JFUE9SVCAgICAgICAgICAgICAgMHgwMDAxCisjZGVmaW5lIExWU19TTUFMTElDT04gICAgICAgICAgIDB4MDAwMgorI2RlZmluZSBMVlNfTElTVCAgICAgICAgICAgICAgICAweDAwMDMKKyNkZWZpbmUgTFZTX1RZUEVNQVNLICAgICAgICAgICAgMHgwMDAzCisjZGVmaW5lIExWU19TSU5HTEVTRUwgICAgICAgICAgIDB4MDAwNAorI2RlZmluZSBMVlNfU0hPV1NFTEFMV0FZUyAgICAgICAweDAwMDgKKyNkZWZpbmUgTFZTX1NPUlRBU0NFTkRJTkcgICAgICAgMHgwMDEwCisjZGVmaW5lIExWU19TT1JUREVTQ0VORElORyAgICAgIDB4MDAyMAorI2RlZmluZSBMVlNfU0hBUkVJTUFHRUxJU1RTICAgICAweDAwNDAKKyNkZWZpbmUgTFZTX05PTEFCRUxXUkFQICAgICAgICAgMHgwMDgwCisjZGVmaW5lIExWU19BVVRPQVJSQU5HRSAgICAgICAgIDB4MDEwMAorI2RlZmluZSBMVlNfRURJVExBQkVMUyAgICAgICAgICAweDAyMDAKKyNkZWZpbmUgTFZTX09XTkVSREFUQSAgICAgICAgICAgMHgxMDAwCisjZGVmaW5lIExWU19OT1NDUk9MTCAgICAgICAgICAgIDB4MjAwMAorI2RlZmluZSBMVlNfVFlQRVNUWUxFTUFTSyAgICAgICAweGZjMDAKKyNkZWZpbmUgTFZTX0FMSUdOVE9QICAgICAgICAgICAgMHgwMDAwCisjZGVmaW5lIExWU19BTElHTkxFRlQgICAgICAgICAgIDB4MDgwMAorI2RlZmluZSBMVlNfQUxJR05NQVNLICAgICAgICAgICAweDBjMDAKKyNkZWZpbmUgTFZTX09XTkVSRFJBV0ZJWEVEICAgICAgMHgwNDAwCisjZGVmaW5lIExWU19OT0NPTFVNTkhFQURFUiAgICAgIDB4NDAwMAorI2RlZmluZSBMVlNfTk9TT1JUSEVBREVSICAgICAgICAweDgwMDAKKworI2RlZmluZSBJX0lNQUdFQ0FMTEJBQ0sgICAgICAgICAoLTEpCisjZGVmaW5lIElfSU5ERU5UQ0FMTEJBQ0sgICAgICAgICgtMSkKKyNkZWZpbmUgTFZfSVRFTUEgTFZJVEVNQQorI2RlZmluZSBMVl9JVEVNVyBMVklURU1XCisKKyNkZWZpbmUgTFZfSVRFTSBMVklURU0KKworI2RlZmluZSBMVklURU1BX1YxX1NJWkUgQ0NTSVpFT0ZfU1RSVUNUKExWSVRFTUEsIGxQYXJhbSkKKyNkZWZpbmUgTFZJVEVNV19WMV9TSVpFIENDU0laRU9GX1NUUlVDVChMVklURU1XLCBsUGFyYW0pCisKK3R5cGVkZWYgc3RydWN0IHRhZ0xWSVRFTUEKK3sKKyAgICBVSU5UMzIgbWFzazsKKyAgICBpbnQgaUl0ZW07CisgICAgaW50IGlTdWJJdGVtOworICAgIFVJTlQzMiBzdGF0ZTsKKyAgICBVSU5UMzIgc3RhdGVNYXNrOworICAgIExQU1RSIHBzelRleHQ7CisgICAgaW50IGNjaFRleHRNYXg7CisgICAgaW50IGlJbWFnZTsKKyAgICBMUEFSQU0gbFBhcmFtOworICAgIGludCBpSW5kZW50OwkvLyhfV0lOMzJfSUUgPj0gMHgwMzAwKQorfSBMVklURU1BLCAqIExQTFZJVEVNQTsKKwordHlwZWRlZiBzdHJ1Y3QgdGFnTFZJVEVNVworeworICAgIFVJTlQzMiBtYXNrOworICAgIGludCBpSXRlbTsKKyAgICBpbnQgaVN1Ykl0ZW07CisgICAgVUlOVDMyIHN0YXRlOworICAgIFVJTlQzMiBzdGF0ZU1hc2s7CisgICAgTFBXU1RSIHBzelRleHQ7CisgICAgaW50IGNjaFRleHRNYXg7CisgICAgaW50IGlJbWFnZTsKKyAgICBMUEFSQU0gbFBhcmFtOworICAgIGludCBpSW5kZW50OwkvLyhfV0lOMzJfSUUgPj0gMHgwMzAwKQorfSBMVklURU1XLCAqIExQTFZJVEVNVzsKKworI2RlZmluZSBMVklURU0gICAgTFZJVEVNQQorI2RlZmluZSBMUExWSVRFTSAgTFBMVklURU1BCisjZGVmaW5lIExWSVRFTV9WMV9TSVpFIExWSVRFTUFfVjFfU0laRQorCisjZGVmaW5lIExWX0NPTFVNTkEgICAgICBMVkNPTFVNTkEKKyNkZWZpbmUgTFZfQ09MVU1OVyAgICAgIExWQ09MVU1OVworI2RlZmluZSBMVl9DT0xVTU4gICAgICAgTFZDT0xVTU4KKyNkZWZpbmUgTFZDT0xVTU5BX1YxX1NJWkUgQ0NTSVpFT0ZfU1RSVUNUKExWQ09MVU1OQSwgaVN1Ykl0ZW0pCisjZGVmaW5lIExWQ09MVU1OV19WMV9TSVpFIENDU0laRU9GX1NUUlVDVChMVkNPTFVNTlcsIGlTdWJJdGVtKQorCit0eXBlZGVmIHN0cnVjdCB0YWdMVkNPTFVNTkEKK3sgICBVSU5UMzIgbWFzazsKKyAgICBpbnQgZm10OworICAgIGludCBjeDsKKyAgICBMUFNUUiBwc3pUZXh0OworICAgIGludCBjY2hUZXh0TWF4OworICAgIGludCBpU3ViSXRlbTsKKyAgICBpbnQgaUltYWdlOyAgLy8oX1dJTjMyX0lFID49IDB4MDMwMCkKKyAgICBpbnQgaU9yZGVyOyAgLy8oX1dJTjMyX0lFID49IDB4MDMwMCkKK30gTFZDT0xVTU5BLCogTFBMVkNPTFVNTkE7CisKK3R5cGVkZWYgc3RydWN0IHRhZ0xWQ09MVU1OVworeyAgIFVJTlQzMiBtYXNrOworICAgIGludCBmbXQ7CisgICAgaW50IGN4OworICAgIExQV1NUUiBwc3pUZXh0OworICAgIGludCBjY2hUZXh0TWF4OworICAgIGludCBpU3ViSXRlbTsKKyAgICBpbnQgaUltYWdlOwkvLyhfV0lOMzJfSUUgPj0gMHgwMzAwKQorICAgIGludCBpT3JkZXI7CS8vKF9XSU4zMl9JRSA+PSAweDAzMDApCit9IExWQ09MVU1OVywqIExQTFZDT0xVTU5XOworCisjZGVmaW5lICBMVkNPTFVNTiAgICAgICAgICAgICAgIExWQ09MVU1OQQorI2RlZmluZSAgTFBMVkNPTFVNTiAgICAgICAgICAgICBMUExWQ09MVU1OQQorI2RlZmluZSBMVkNPTFVNTl9WMV9TSVpFIExWQ09MVU1OQV9WMV9TSVpFCisKKyNkZWZpbmUgTFZDRl9GTVQgICAgICAgICAgICAgICAgMHgwMDAxCisjZGVmaW5lIExWQ0ZfV0lEVEggICAgICAgICAgICAgIDB4MDAwMgorI2RlZmluZSBMVkNGX1RFWFQgICAgICAgICAgICAgICAweDAwMDQKKyNkZWZpbmUgTFZDRl9TVUJJVEVNICAgICAgICAgICAgMHgwMDA4CisjZGVmaW5lIExWQ0ZfSU1BR0UgICAgICAgICAgICAgIDB4MDAxMAorI2RlZmluZSBMVkNGX09SREVSICAgICAgICAgICAgICAweDAwMjAKKworCisjZGVmaW5lIExWQ0ZNVF9MRUZUICAgICAgICAgICAgIDB4MDAwMAorI2RlZmluZSBMVkNGTVRfUklHSFQgICAgICAgICAgICAweDAwMDEKKyNkZWZpbmUgTFZDRk1UX0NFTlRFUiAgICAgICAgICAgMHgwMDAyCisjZGVmaW5lIExWQ0ZNVF9KVVNUSUZZTUFTSyAgICAgIDB4MDAwMworI2RlZmluZSBMVkNGTVRfSU1BR0UgICAgICAgICAgICAweDA4MDAKKyNkZWZpbmUgTFZDRk1UX0JJVE1BUF9PTl9SSUdIVCAgMHgxMDAwCisjZGVmaW5lIExWQ0ZNVF9DT0xfSEFTX0lNQUdFUyAgIDB4ODAwMAorCisjZGVmaW5lIFNORE1TRyBTZW5kTWVzc2FnZTMyQQorI2RlZmluZSBMaXN0Vmlld19HZXRJbWFnZUxpc3QoaHduZCwgaUltYWdlTGlzdCkgKEhJTUFHRUxJU1QpU05ETVNHKChod25kKSwgTFZNX0dFVElNQUdFTElTVCwgKFdQQVJBTSkoSU5UKShpSW1hZ2VMaXN0KSwgMEwpCisKKyNkZWZpbmUgTFZTSUxfTk9STUFMICAgICAgICAgICAgMAorI2RlZmluZSBMVlNJTF9TTUFMTCAgICAgICAgICAgICAxCisjZGVmaW5lIExWU0lMX1NUQVRFICAgICAgICAgICAgIDIKKworCisjZGVmaW5lIExpc3RWaWV3X1NldEltYWdlTGlzdChod25kLCBoaW1sLCBpSW1hZ2VMaXN0KSAoSElNQUdFTElTVCkoVUlOVDMyKVNORE1TRygoaHduZCksIExWTV9TRVRJTUFHRUxJU1QsIChXUEFSQU0zMikoaUltYWdlTGlzdCksIChMUEFSQU0pKFVJTlQzMikoSElNQUdFTElTVCkoaGltbCkpCisjZGVmaW5lIExpc3RWaWV3X0dldEl0ZW1Db3VudChod25kKShpbnQpU05ETVNHKChod25kKSwgTFZNX0dFVElURU1DT1VOVCwgMCwgMEwpCisjZGVmaW5lIExpc3RWaWV3X0dldEl0ZW0oaHduZCwgcGl0ZW0pKEJPT0wzMilTTkRNU0coKGh3bmQpLCBMVk1fR0VUSVRFTSwgMCwgKExQQVJBTSkoTFZfSVRFTSAqKShwaXRlbSkpCisjZGVmaW5lIExpc3RWaWV3X0luc2VydEl0ZW0oaHduZCwgcGl0ZW0pIChpbnQpU05ETVNHKChod25kKSwgTFZNX0lOU0VSVElURU0sIDAsIChMUEFSQU0pKGNvbnN0IExWX0lURU0gKikocGl0ZW0pKQorI2RlZmluZSBMaXN0Vmlld19EZWxldGVBbGxJdGVtcyhod25kKSAoQk9PTDMyKVNORE1TRygoaHduZCksIExWTV9ERUxFVEVBTExJVEVNUywgMCwgMEwpCisjZGVmaW5lIExpc3RWaWV3X0luc2VydENvbHVtbihod25kLCBpQ29sLCBwY29sKShpbnQpU05ETVNHKChod25kKSwgTFZNX0lOU0VSVENPTFVNTiwgKFdQQVJBTTMyKShpbnQpKGlDb2wpLCAoTFBBUkFNKShjb25zdCBMVl9DT0xVTU4gKikocGNvbCkpCit0eXBlZGVmIGludCAoQ0FMTEJBQ0sgKlBGTkxWQ09NUEFSRSkoTFBBUkFNLCBMUEFSQU0sIExQQVJBTSk7CisjZGVmaW5lIExpc3RWaWV3X1NvcnRJdGVtcyhod25kTFYsIF9wZm5Db21wYXJlLCBfbFBybSkoQk9PTDMyKVNORE1TRygoaHduZExWKSwgTFZNX1NPUlRJVEVNUywgKFdQQVJBTTMyKShMUEFSQU0pX2xQcm0sKExQQVJBTSkoUEZOTFZDT01QQVJFKV9wZm5Db21wYXJlKQorI2RlZmluZSBMaXN0Vmlld19TZXRJdGVtUG9zaXRpb24oaHduZExWLCBpLCB4LCB5KShCT09MMzIpU05ETVNHKChod25kTFYpLCBMVk1fU0VUSVRFTVBPU0lUSU9OLCAoV1BBUkFNMzIpKGludCkoaSksIE1BS0VMUEFSQU0oKHgpLCAoeSkpKQorI2RlZmluZSBMaXN0Vmlld19HZXRTZWxlY3RlZENvdW50KGh3bmRMVikoVUlOVDMyKVNORE1TRygoaHduZExWKSwgTFZNX0dFVFNFTEVDVEVEQ09VTlQsIDAsIDBMKQorCisjZGVmaW5lIExWSUZfVEVYVCAgICAgICAgICAgICAgIDB4MDAwMQorI2RlZmluZSBMVklGX0lNQUdFICAgICAgICAgICAgICAweDAwMDIKKyNkZWZpbmUgTFZJRl9QQVJBTSAgICAgICAgICAgICAgMHgwMDA0CisjZGVmaW5lIExWSUZfU1RBVEUgICAgICAgICAgICAgIDB4MDAwOAorI2RlZmluZSBMVklGX0lOREVOVCAgICAgICAgICAgICAweDAwMTAKKyNkZWZpbmUgTFZJRl9OT1JFQ09NUFVURSAgICAgICAgMHgwODAwCisKKyNkZWZpbmUgTFZJU19GT0NVU0VEICAgICAgICAgICAgMHgwMDAxCisjZGVmaW5lIExWSVNfU0VMRUNURUQgICAgICAgICAgIDB4MDAwMgorI2RlZmluZSBMVklTX0NVVCAgICAgICAgICAgICAgICAweDAwMDQKKyNkZWZpbmUgTFZJU19EUk9QSElMSVRFRCAgICAgICAgMHgwMDA4CisjZGVmaW5lIExWSVNfQUNUSVZBVElORyAgICAgICAgIDB4MDAyMAorCisjZGVmaW5lIExWSVNfT1ZFUkxBWU1BU0sgICAgICAgIDB4MEYwMAorI2RlZmluZSBMVklTX1NUQVRFSU1BR0VNQVNLICAgICAweEYwMDAKKworI2RlZmluZSBMUE5NX0xJU1RWSUVXICAgTFBOTUxJU1RWSUVXCisjZGVmaW5lIE5NX0xJU1RWSUVXICAgICBOTUxJU1RWSUVXCisKK3R5cGVkZWYgc3RydWN0IHRhZ05NTElTVFZJRVcKK3sgICBOTUhEUiAgIGhkcjsKKyAgICBpbnQgICAgIGlJdGVtOworICAgIGludCAgICAgaVN1Ykl0ZW07CisgICAgVUlOVDMyICB1TmV3U3RhdGU7CisgICAgVUlOVDMyICB1T2xkU3RhdGU7CisgICAgVUlOVDMyICB1Q2hhbmdlZDsKKyAgICBQT0lOVDMyIHB0QWN0aW9uOworICAgIExQQVJBTSAgbFBhcmFtOworfSBOTUxJU1RWSUVXLCpMUE5NTElTVFZJRVc7CisKKworI2RlZmluZSBMVl9ESVNQSU5GT0EgICAgTk1MVkRJU1BJTkZPQQorI2RlZmluZSBMVl9ESVNQSU5GT1cgICAgTk1MVkRJU1BJTkZPVworCisjZGVmaW5lIExWX0RJU1BJTkZPICAgICBOTUxWRElTUElORk8KKwordHlwZWRlZiBzdHJ1Y3QgdGFnTFZESVNQSU5GTyB7CisgICAgTk1IRFIgaGRyOworICAgIExWSVRFTUEgaXRlbTsKK30gTk1MVkRJU1BJTkZPQSwgKkxQTk1MVkRJU1BJTkZPQTsKKwordHlwZWRlZiBzdHJ1Y3QgdGFnTFZESVNQSU5GT1cgeworICAgIE5NSERSIGhkcjsKKyAgICBMVklURU1XIGl0ZW07Cit9IE5NTFZESVNQSU5GT1csICogTFBOTUxWRElTUElORk9XOworCisjZGVmaW5lICBOTUxWRElTUElORk8gICAgICAgICAgIE5NTFZESVNQSU5GT0EKIAogCiAjZW5kaWYgIC8qIF9fV0lORV9DT01NQ1RSTF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2RkcmF3LmggYi9pbmNsdWRlL2RkcmF3LmgKaW5kZXggNThlYTZmZi4uZGI4NzY2NiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9kZHJhdy5oCisrKyBiL2luY2x1ZGUvZGRyYXcuaApAQCAtODc2LDcgKzg3Niw2IEBACiBzdHJ1Y3QgX2NvbW1vbl9kaXJlY3RkcmF3ZGF0YSB7CiAgICAgRFdPUkQJCQlkZXB0aDsKICAgICBEV09SRAkJCWhlaWdodCx3aWR0aDsJLyogU2V0RGlzcGxheU1vZGUgKi8KLSAgICBIV05EMzIJCQltYWlud2luZG93OwogfTsKIAogc3RydWN0IF9kZ2FfZGlyZWN0ZHJhd2RhdGEgewpAQCAtODg3LDEyICs4ODYsMTYgQEAKIAogc3RydWN0IF94bGliX2RpcmVjdGRyYXdkYXRhIHsKICAgICBXaW5kb3cJCWRyYXdhYmxlOworICAgIGludAkJCXVzZV94c2htOwogICAgIC8qIGFyZSB0aGVzZSBuZWVkZWQgZm9yIGFueXRoaW5nPyAoZHJhd19zdXJmIGlzIHRoZSBhY3RpdmUgc3VyZmFjZSkKLSAgICAgICBJRGlyZWN0RHJhd1N1cmZhY2UJKnN1cmZzOwotICAgICAgIERXT1JECQludW1fc3VyZnMsIGFsbG9jX3N1cmZzLCBkcmF3X3N1cmY7ICovCisgICAgSURpcmVjdERyYXdTdXJmYWNlCSpzdXJmczsKKyAgICBEV09SRAkJbnVtX3N1cmZzLCBhbGxvY19zdXJmcywgZHJhd19zdXJmOyAqLworICAgIGludAkJCXBhaW50YWJsZTsKIAotICAgICAgIEFUT00JCXdpbmNsYXNzOwotICAgICAgIEhXTkQzMgkJd2luZG93OworLyogY3VycmVudCB3aW5kb3cgaW1wbGVtZW50YXRpb24gKi8KKyAgICBBVE9NCQl3aW5jbGFzczsKKyAgICBIV05EMzIJCXdpbmRvdzsKKyAgICBQQUlOVFNUUlVDVDMyCXBzOwogfTsKIAogc3RydWN0IElEaXJlY3REcmF3IHsKQEAgLTkwMSw3ICs5MDQsNiBAQAogCXN0cnVjdCBfY29tbW9uX2RpcmVjdGRyYXdkYXRhIGQ7CiAJdW5pb24gewogCQlzdHJ1Y3QgX3hsaWJfZGlyZWN0ZHJhd2RhdGEgeGxpYjsKLQkJc3RydWN0IF94bGliX2RpcmVjdGRyYXdkYXRhIHhzaG07CiAJCXN0cnVjdCBfZGdhX2RpcmVjdGRyYXdkYXRhICBkZ2E7CiAJfSBlOwogfTsKQEAgLTk1Nyw4ICs5NTksNiBAQAogCXN0cnVjdCBfY29tbW9uX2RpcmVjdGRyYXdkYXRhCWQ7CiAJdW5pb24gewogCQlzdHJ1Y3QgX3hsaWJfZGlyZWN0ZHJhd2RhdGEgeGxpYjsKLQkJLyogb25seSBkaWZmZXJlbnQgaW4gaW1hZ2UgY3JlYXRlJnB1dCAqLwotCQlzdHJ1Y3QgX3hsaWJfZGlyZWN0ZHJhd2RhdGEgeHNobTsKIAkJc3RydWN0IF9kZ2FfZGlyZWN0ZHJhd2RhdGEgZGdhOwogCX0gZTsKIH07CkBAIC05NjcsNyArOTY3LDcgQEAKICNkZWZpbmUgVEhJUyBMUERJUkVDVERSQVdTVVJGQUNFIHRoaXMKIHN0cnVjdCBfY29tbW9uX2RpcmVjdGRyYXdzdXJmYWNlIHsKICAgICBMUERJUkVDVERSQVdQQUxFVFRFCQlwYWxldHRlOwotICAgIExQRElSRUNURFJBVwkJZGRyYXc7CisgICAgTFBESVJFQ1REUkFXMgkJZGRyYXc7CiAgICAgTFBESVJFQ1REUkFXU1VSRkFDRTMJYmFja2J1ZmZlcjsKICAgICBMUFZPSUQJCQlzdXJmYWNlOwogICAgIERXT1JECQkJbHBpdGNoLHdpZHRoLGhlaWdodDsKQEAgLTk3NywxNiArOTc3LDEyIEBACiAgICAgRFdPUkQJCWZiX2hlaWdodDsKIH07CiAKLXN0cnVjdCBfeHNobV9kaXJlY3RkcmF3c3VyZmFjZSB7CitzdHJ1Y3QgX3hsaWJfZGlyZWN0ZHJhd3N1cmZhY2UgewogICAgIFhJbWFnZQkJKmltYWdlOwogI2lmZGVmIEhBVkVfTElCWFhTSE0KICAgICBYU2htU2VnbWVudEluZm8Jc2htaW5mbzsKICNlbmRpZgogfTsKLXN0cnVjdCBfeGxpYl9kaXJlY3RkcmF3c3VyZmFjZSB7Ci0gICAgWEltYWdlCQkqaW1hZ2U7Ci0gICAgQk9PTDMyCQlzdXJmYWNlX2lzX2ltYWdlX2RhdGE7Ci19OwogCiB0eXBlZGVmIHN0cnVjdCBJRGlyZWN0RHJhd1N1cmZhY2VfVlRhYmxlIHsKICAgICAvKioqIElVbmtub3duIG1ldGhvZHMgKioqLwpAQCAtMTAzNCw3ICsxMDMwLDYgQEAKICAgICBzdHJ1Y3QgX2NvbW1vbl9kaXJlY3RkcmF3c3VyZmFjZQlzOwogICAgIHVuaW9uIHsKIAlzdHJ1Y3QgX2RnYV9kaXJlY3RkcmF3c3VyZmFjZQlkZ2E7Ci0Jc3RydWN0IF94c2htX2RpcmVjdGRyYXdzdXJmYWNlCXhzaG07CiAJc3RydWN0IF94bGliX2RpcmVjdGRyYXdzdXJmYWNlCXhsaWI7CiAgICAgfSB0OwogfTsKQEAgLTExODEsNSArMTE3Niw4IEBACiAjdW5kZWYgU1RETUVUSE9ECiAjdW5kZWYgU1RETUVUSE9EXwogCi1leHRlcm4gSFJFU1VMVCBXSU5BUEkgRGlyZWN0RHJhd0NyZWF0ZSggTFBHVUlEIGxwR1VJRCxMUERJUkVDVERSQVcgKmxwbHBERCxMUFVOS05PV04gcFVua091dGVyICk7CitIUkVTVUxUIFdJTkFQSSBEaXJlY3REcmF3Q3JlYXRlKExQR1VJRCxMUERJUkVDVERSQVcqLExQVU5LTk9XTik7CitIUkVTVUxUIFdJTkFQSSBEaXJlY3REcmF3RW51bWVyYXRlMzJBKExQRERFTlVNQ0FMTEJBQ0szMkEsTFBWT0lEKTsKK0hSRVNVTFQgV0lOQVBJIERpcmVjdERyYXdFbnVtZXJhdGUzMlcoTFBEREVOVU1DQUxMQkFDSzMyVyxMUFZPSUQpOworI2RlZmluZSBEaXJlY3REcmF3RW51bWVyYXRlIFdJTkVMSUJfTkFNRV9BVyhEaXJlY3REcmF3RW51bWVyYXRlKQogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2RlYnVnLmggYi9pbmNsdWRlL2RlYnVnLmgKaW5kZXggOTA1NmE1Yy4uOTYyZDgyNiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9kZWJ1Zy5oCisrKyBiL2luY2x1ZGUvZGVidWcuaApAQCAtODcsNTggKzg3LDU5IEBACiAjZGVmaW5lIGRiY2hfb2xlIDc5CiAjZGVmaW5lIGRiY2hfcGFnZXIgODAKICNkZWZpbmUgZGJjaF9wYWxldHRlIDgxCi0jZGVmaW5lIGRiY2hfcHJpbnQgODIKLSNkZWZpbmUgZGJjaF9wcm9jZXNzIDgzCi0jZGVmaW5lIGRiY2hfcHJvZmlsZSA4NAotI2RlZmluZSBkYmNoX3Byb2dyZXNzIDg1Ci0jZGVmaW5lIGRiY2hfcHJvcCA4NgotI2RlZmluZSBkYmNoX3BzZHJ2IDg3Ci0jZGVmaW5lIGRiY2hfcmViYXIgODgKLSNkZWZpbmUgZGJjaF9yZWcgODkKLSNkZWZpbmUgZGJjaF9yZWdpb24gOTAKLSNkZWZpbmUgZGJjaF9yZWxheSA5MQotI2RlZmluZSBkYmNoX3Jlc291cmNlIDkyCi0jZGVmaW5lIGRiY2hfcyA5MwotI2RlZmluZSBkYmNoX3Njcm9sbCA5NAotI2RlZmluZSBkYmNoX3NlY3VyaXR5IDk1Ci0jZGVmaW5lIGRiY2hfc2VnbWVudCA5NgotI2RlZmluZSBkYmNoX3NlbGVjdG9yIDk3Ci0jZGVmaW5lIGRiY2hfc2VtIDk4Ci0jZGVmaW5lIGRiY2hfc2VuZG1zZyA5OQotI2RlZmluZSBkYmNoX3NoZWxsIDEwMAotI2RlZmluZSBkYmNoX3NobSAxMDEKLSNkZWZpbmUgZGJjaF9zbm9vcCAxMDIKLSNkZWZpbmUgZGJjaF9zb3VuZCAxMDMKLSNkZWZpbmUgZGJjaF9zdGF0aWMgMTA0Ci0jZGVmaW5lIGRiY2hfc3RhdHVzYmFyIDEwNQotI2RlZmluZSBkYmNoX3N0cmVzcyAxMDYKLSNkZWZpbmUgZGJjaF9zdHJpbmcgMTA3Ci0jZGVmaW5lIGRiY2hfc3lzY29sb3IgMTA4Ci0jZGVmaW5lIGRiY2hfc3lzdGVtIDEwOQotI2RlZmluZSBkYmNoX3Rhc2sgMTEwCi0jZGVmaW5lIGRiY2hfdGV4dCAxMTEKLSNkZWZpbmUgZGJjaF90aHJlYWQgMTEyCi0jZGVmaW5lIGRiY2hfdGh1bmsgMTEzCi0jZGVmaW5lIGRiY2hfdGltZXIgMTE0Ci0jZGVmaW5lIGRiY2hfdG9vbGJhciAxMTUKLSNkZWZpbmUgZGJjaF90b29saGVscCAxMTYKLSNkZWZpbmUgZGJjaF90b29sdGlwcyAxMTcKLSNkZWZpbmUgZGJjaF90cmFja2JhciAxMTgKLSNkZWZpbmUgZGJjaF90cmVldmlldyAxMTkKLSNkZWZpbmUgZGJjaF90d2VhayAxMjAKLSNkZWZpbmUgZGJjaF91aXRvb2xzIDEyMQotI2RlZmluZSBkYmNoX3VwZG93biAxMjIKLSNkZWZpbmUgZGJjaF92ZXIgMTIzCi0jZGVmaW5lIGRiY2hfdmlydHVhbCAxMjQKLSNkZWZpbmUgZGJjaF92eGQgMTI1Ci0jZGVmaW5lIGRiY2hfd2luIDEyNgotI2RlZmluZSBkYmNoX3dpbjE2ZHJ2IDEyNwotI2RlZmluZSBkYmNoX3dpbjMyIDEyOAotI2RlZmluZSBkYmNoX3dpbmcgMTI5Ci0jZGVmaW5lIGRiY2hfd2luc29jayAxMzAKLSNkZWZpbmUgZGJjaF93bmV0IDEzMQotI2RlZmluZSBkYmNoX3gxMSAxMzIKLSNkZWZpbmUgZGJjaF94MTFkcnYgMTMzCisjZGVmaW5lIGRiY2hfcGlkbCA4MgorI2RlZmluZSBkYmNoX3ByaW50IDgzCisjZGVmaW5lIGRiY2hfcHJvY2VzcyA4NAorI2RlZmluZSBkYmNoX3Byb2ZpbGUgODUKKyNkZWZpbmUgZGJjaF9wcm9ncmVzcyA4NgorI2RlZmluZSBkYmNoX3Byb3AgODcKKyNkZWZpbmUgZGJjaF9wc2RydiA4OAorI2RlZmluZSBkYmNoX3JlYmFyIDg5CisjZGVmaW5lIGRiY2hfcmVnIDkwCisjZGVmaW5lIGRiY2hfcmVnaW9uIDkxCisjZGVmaW5lIGRiY2hfcmVsYXkgOTIKKyNkZWZpbmUgZGJjaF9yZXNvdXJjZSA5MworI2RlZmluZSBkYmNoX3MgOTQKKyNkZWZpbmUgZGJjaF9zY3JvbGwgOTUKKyNkZWZpbmUgZGJjaF9zZWN1cml0eSA5NgorI2RlZmluZSBkYmNoX3NlZ21lbnQgOTcKKyNkZWZpbmUgZGJjaF9zZWxlY3RvciA5OAorI2RlZmluZSBkYmNoX3NlbSA5OQorI2RlZmluZSBkYmNoX3NlbmRtc2cgMTAwCisjZGVmaW5lIGRiY2hfc2hlbGwgMTAxCisjZGVmaW5lIGRiY2hfc2htIDEwMgorI2RlZmluZSBkYmNoX3Nub29wIDEwMworI2RlZmluZSBkYmNoX3NvdW5kIDEwNAorI2RlZmluZSBkYmNoX3N0YXRpYyAxMDUKKyNkZWZpbmUgZGJjaF9zdGF0dXNiYXIgMTA2CisjZGVmaW5lIGRiY2hfc3RyZXNzIDEwNworI2RlZmluZSBkYmNoX3N0cmluZyAxMDgKKyNkZWZpbmUgZGJjaF9zeXNjb2xvciAxMDkKKyNkZWZpbmUgZGJjaF9zeXN0ZW0gMTEwCisjZGVmaW5lIGRiY2hfdGFzayAxMTEKKyNkZWZpbmUgZGJjaF90ZXh0IDExMgorI2RlZmluZSBkYmNoX3RocmVhZCAxMTMKKyNkZWZpbmUgZGJjaF90aHVuayAxMTQKKyNkZWZpbmUgZGJjaF90aW1lciAxMTUKKyNkZWZpbmUgZGJjaF90b29sYmFyIDExNgorI2RlZmluZSBkYmNoX3Rvb2xoZWxwIDExNworI2RlZmluZSBkYmNoX3Rvb2x0aXBzIDExOAorI2RlZmluZSBkYmNoX3RyYWNrYmFyIDExOQorI2RlZmluZSBkYmNoX3RyZWV2aWV3IDEyMAorI2RlZmluZSBkYmNoX3R3ZWFrIDEyMQorI2RlZmluZSBkYmNoX3VpdG9vbHMgMTIyCisjZGVmaW5lIGRiY2hfdXBkb3duIDEyMworI2RlZmluZSBkYmNoX3ZlciAxMjQKKyNkZWZpbmUgZGJjaF92aXJ0dWFsIDEyNQorI2RlZmluZSBkYmNoX3Z4ZCAxMjYKKyNkZWZpbmUgZGJjaF93aW4gMTI3CisjZGVmaW5lIGRiY2hfd2luMTZkcnYgMTI4CisjZGVmaW5lIGRiY2hfd2luMzIgMTI5CisjZGVmaW5lIGRiY2hfd2luZyAxMzAKKyNkZWZpbmUgZGJjaF93aW5zb2NrIDEzMQorI2RlZmluZSBkYmNoX3duZXQgMTMyCisjZGVmaW5lIGRiY2hfeDExIDEzMworI2RlZmluZSBkYmNoX3gxMWRydiAxMzQKIC8qIERlZmluaXRpb25zIGZvciBjbGFzc2VzIGlkZW50aWZpZXJzICovCiAjZGVmaW5lIGRiY2xfZml4bWUgMAogI2RlZmluZSBkYmNsX2VyciAxCmRpZmYgLS1naXQgYS9pbmNsdWRlL2RlYnVnZGVmcy5oIGIvaW5jbHVkZS9kZWJ1Z2RlZnMuaAppbmRleCAxNDQ1MGRlLi42MGNlZGVkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2RlYnVnZGVmcy5oCisrKyBiL2luY2x1ZGUvZGVidWdkZWZzLmgKQEAgLTQsNyArNCw3IEBACiAjaW5jbHVkZSAiZGVidWd0b29scy5oIgogI2VuZGlmCiAKLSNkZWZpbmUgREVCVUdfQ0hBTk5FTF9DT1VOVCAxMzQKKyNkZWZpbmUgREVCVUdfQ0hBTk5FTF9DT1VOVCAxMzUKICNpZmRlZiBERUJVR19SVU5USU1FCiBzaG9ydCBkZWJ1Z19tc2dfZW5hYmxlZFtdW0RFQlVHX0NMQVNTX0NPVU5UXSA9IHsKIHsxLCAxLCAwLCAwfSwKQEAgLTE0MSw2ICsxNDEsNyBAQAogezEsIDEsIDAsIDB9LAogezEsIDEsIDAsIDB9LAogezEsIDEsIDAsIDB9LAorezEsIDEsIDAsIDB9LAogfTsKIGNvbnN0IGNoYXIqIGRlYnVnX2NoX25hbWVbXSA9IHsKICIxIiwKQEAgLTIyNSw2ICsyMjYsNyBAQAogIm9sZSIsCiAicGFnZXIiLAogInBhbGV0dGUiLAorInBpZGwiLAogInByaW50IiwKICJwcm9jZXNzIiwKICJwcm9maWxlIiwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvZG9zZXhlLmggYi9pbmNsdWRlL2Rvc2V4ZS5oCmluZGV4IDU2Y2Q0NzguLmFkM2E4OTIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvZG9zZXhlLmgKKysrIGIvaW5jbHVkZS9kb3NleGUuaApAQCAtMTUsMjQgKzE1LDI1IEBACiB0eXBlZGVmIHN0cnVjdCBfRE9TVEFTSyB7CiAgTFBWT0lEIGltZzsKICB1bnNpZ25lZCBpbWdfb2ZzOworIFdPUkQgcHNwX3NlZyxsb2FkX3NlZzsKICBITU9EVUxFMTYgaE1vZHVsZTsKICBzdHJ1Y3Qgdm04NnBsdXNfc3RydWN0IFZNODY7CiAgaW50IGZuLCBzdGF0ZTsKLSNpZmRlZiBNWl9VU0VTWVNWCi0gLyogU1lTViBJUEMgaXMgbm90IHF1aXRlIHN1cHBvcnRlZCB5ZXQuLi4gKi8KLSBrZXlfdCBzaG1fa2V5OwotIGludCBzaG1faWQ7Ci0jZWxzZQogIGNoYXIgbW1fbmFtZVsxMjhdOwogIGludCBtbV9mZDsKLSNlbmRpZgogIGludCByZWFkX3BpcGUsd3JpdGVfcGlwZTsKICBwaWRfdCB0YXNrOwogfSBET1NUQVNLLCAqTFBET1NUQVNLOwogCi1leHRlcm4gSElOU1RBTkNFMTYgTVpfTG9hZE1vZHVsZSggTFBDU1RSIG5hbWUsIExQQ1NUUiBjbWRsaW5lLCBMUENTVFIgZW52LCBVSU5UMTYgc2hvd19jbWQgKTsKKyNkZWZpbmUgTVpfU1VQUE9SVEVECisKK2V4dGVybiBpbnQgTVpfSW5pdFRhc2soIExQRE9TVEFTSyBscERvc1Rhc2sgKTsKIGV4dGVybiBpbnQgTVpfUnVuTW9kdWxlKCBMUERPU1RBU0sgbHBEb3NUYXNrICk7CiBleHRlcm4gdm9pZCBNWl9LaWxsTW9kdWxlKCBMUERPU1RBU0sgbHBEb3NUYXNrICk7CiBleHRlcm4gaW50IERPU1ZNX1Byb2Nlc3MoIExQRE9TVEFTSyBscERvc1Rhc2sgKTsKIAogI2VuZGlmIC8qIGxpbnV4ICovCisKK2V4dGVybiBISU5TVEFOQ0UxNiBNWl9DcmVhdGVQcm9jZXNzKCBMUENTVFIgbmFtZSwgTFBDU1RSIGNtZGxpbmUsIExQQ1NUUiBlbnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBTVEFSVFVQSU5GTzMyQSBzdGFydHVwLCBMUFBST0NFU1NfSU5GT1JNQVRJT04gaW5mbyApOworZXh0ZXJuIGludCBET1NWTV9FbnRlciggUENPTlRFWFQgY29udGV4dCApOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9maWxlLmggYi9pbmNsdWRlL2ZpbGUuaAppbmRleCA1NjQzMTRmLi5mYzVmODA2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2ZpbGUuaAorKysgYi9pbmNsdWRlL2ZpbGUuaApAQCAtNDAsNiArNDAsMTcgQEAKICAgICBpbnQgZmxhZ3M7CiB9IERPU19ERVZJQ0U7CiAKKy8qIE1hY3JvcyB0byBjb252ZXJ0IDE2IGJpdCB0byAzMiBiaXQgZmlsZSBoYW5kbGVzIGFuZCBiYWNrICovCisjZGVmaW5lIEhGSUxFMTZfVE9fSEZJTEUzMihoYW5kbGUpIFwKKygoKGhhbmRsZSk9PTApID8gR2V0U3RkSGFuZGxlKFNURF9JTlBVVF9IQU5ETEUpIDogXAorICgoaGFuZGxlKT09MSkgPyBHZXRTdGRIYW5kbGUoU1REX09VVFBVVF9IQU5ETEUpIDogXAorICgoaGFuZGxlKT09MikgPyBHZXRTdGRIYW5kbGUoU1REX0VSUk9SX0hBTkRMRSkgOiBcCisgKGhhbmRsZSktNSkKKworI2RlZmluZSBIRklMRTMyX1RPX0hGSUxFMTYoaGFuZGxlKSAoeyBIRklMRTMyIGhuZD1oYW5kbGU7IFwKKyAgICAgICgoaG5kPT1IRklMRV9FUlJPUjMyKSA/IEhGSUxFX0VSUk9SMTYgOiBcCisgICAgICAgKEhGSUxFMTYpaG5kKzUpOyB9KQorCiAKIC8qIGZpbGVzL2ZpbGUuYyAqLwogZXh0ZXJuIEZJTEVfT0JKRUNUICpGSUxFX0dldEZpbGUoIEhGSUxFMzIgaGFuZGxlICk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2dkaS5oIGIvaW5jbHVkZS9nZGkuaAppbmRleCBmY2IxNzg2Li5jOGNhNDE4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2dkaS5oCisrKyBiL2luY2x1ZGUvZ2RpLmgKQEAgLTIwMCw3ICsyMDAsNyBAQAogICAgIEJPT0wzMiAgICAgKCpwUGF0Qmx0KShEQyosSU5UMzIsSU5UMzIsSU5UMzIsSU5UMzIsRFdPUkQpOwogICAgIEJPT0wzMiAgICAgKCpwUGllKShEQyosSU5UMzIsSU5UMzIsSU5UMzIsSU5UMzIsSU5UMzIsSU5UMzIsSU5UMzIsSU5UMzIpOwogICAgIEJPT0wzMiAgICAgKCpwUG9seVBvbHlnb24pKERDKixMUFBPSU5UMzIsTFBJTlQzMixVSU5UMzIpOwotICAgIEJPT0wzMiAgICAgKCpwUG9seVBvbHlsaW5lKShEQyosTFBQT0lOVDMyLExQSU5UMzIsVUlOVDMyKTsKKyAgICBCT09MMzIgICAgICgqcFBvbHlQb2x5bGluZSkoREMqLExQUE9JTlQzMixMUERXT1JELERXT1JEKTsKICAgICBCT09MMzIgICAgICgqcFBvbHlnb24pKERDKixMUFBPSU5UMzIsSU5UMzIpOwogICAgIEJPT0wzMiAgICAgKCpwUG9seWxpbmUpKERDKixMUFBPSU5UMzIsSU5UMzIpOwogICAgIEJPT0wzMiAgICAgKCpwUG9seUJlemllcikoREMqLFBPSU5UMzIsIExQUE9JTlQzMixEV09SRCk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2hlYWRlci5oIGIvaW5jbHVkZS9oZWFkZXIuaAppbmRleCA3MTBiMWU0Li4yOThmNjdiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2hlYWRlci5oCisrKyBiL2luY2x1ZGUvaGVhZGVyLmgKQEAgLTE4LDMyICsxOCwzMiBAQAogICAgIElOVDMyICAgICBmbXQ7CiAgICAgTFBBUkFNICAgIGxQYXJhbTsKICAgICBJTlQzMiAgICAgaUltYWdlOwotICAgIElOVDMyICAgICBpT3JkZXI7CisgICAgSU5UMzIgICAgIGlPcmRlcjsJCS8qIHNlZSBkb2N1bWVudGF0aW9uIG9mIEhEX0lURU0gKi8KIAotICAgIEJPT0wzMiAgICBiRG93bjsKLSAgICBSRUNUMzIgICAgcmVjdDsKKyAgICBCT09MMzIgICAgYkRvd247CQkvKiBpcyBpdGVtIHByZXNzZWQ/ICh1c2VkIGZvciBkcmF3aW5nKSAqLworICAgIFJFQ1QzMiAgICByZWN0OwkJLyogYm91bmRpbmcgcmVjdGFuZ2xlIG9mIHRoZSBpdGVtICovCiB9IEhFQURFUl9JVEVNOwogCiAKIHR5cGVkZWYgc3RydWN0CiB7Ci0gICAgVUlOVDMyICAgICAgdU51bUl0ZW07Ci0gICAgSU5UMzIgICAgICAgbkhlaWdodDsKLSAgICBIRk9OVDMyICAgICBoRm9udDsKLSAgICBIQ1VSU09SMzIgICBoY3VyQXJyb3c7Ci0gICAgSENVUlNPUjMyICAgaGN1ckRpdmlkZXI7Ci0gICAgSENVUlNPUjMyICAgaGN1ckRpdm9wZW47Ci0gICAgQk9PTDMyICAgICAgYkNhcHR1cmVkOwotICAgIEJPT0wzMiAgICAgIGJQcmVzc2VkOwotICAgIEJPT0wzMiAgICAgIGJUcmFja2luZzsKLSAgICBJTlQzMiAgICAgICBpTW92ZUl0ZW07Ci0gICAgSU5UMzIgICAgICAgeFRyYWNrT2Zmc2V0OwotICAgIElOVDMyICAgICAgIHhPbGRUcmFjazsKLSAgICBJTlQzMiAgICAgICBuT2xkV2lkdGg7Ci0gICAgSU5UMzIgICAgICAgaUhvdEl0ZW07CisgICAgVUlOVDMyICAgICAgdU51bUl0ZW07CS8qIG51bWJlciBvZiBpdGVtcyAoY29sdW1ucykgKi8KKyAgICBJTlQzMiAgICAgICBuSGVpZ2h0OwkvKiBoZWlnaHQgb2YgdGhlIGhlYWRlciAocGl4ZWxzKSAqLworICAgIEhGT05UMzIgICAgIGhGb250OwkJLyogaGFuZGxlIHRvIHRoZSBjdXJyZW50IGZvbnQgKi8KKyAgICBIQ1VSU09SMzIgICBoY3VyQXJyb3c7CS8qIGhhbmRsZSB0byB0aGUgYXJyb3cgY3Vyc29yICovCisgICAgSENVUlNPUjMyICAgaGN1ckRpdmlkZXI7CS8qIGhhbmRsZSB0byBhIGN1cnNvciAodXNlZCBvdmVyIGRpdmlkZXJzKSA8LXwtPiAqLworICAgIEhDVVJTT1IzMiAgIGhjdXJEaXZvcGVuOwkvKiBoYW5kbGUgdG8gYSBjdXJzb3IgKHVzZWQgb3ZlciBkaXZpZGVycykgPC18fC0+ICovCisgICAgQk9PTDMyICAgICAgYkNhcHR1cmVkOwkvKiBJcyB0aGUgbW91c2UgY2FwdHVyZWQ/ICovCisgICAgQk9PTDMyICAgICAgYlByZXNzZWQ7CS8qIElzIGEgaGVhZGVyIGl0ZW0gcHJlc3NlZCAoZG93bik/ICovCisgICAgQk9PTDMyICAgICAgYlRyYWNraW5nOwkvKiBJcyBpbiB0cmFja2luZyBtb2RlPyAqLworICAgIElOVDMyICAgICAgIGlNb3ZlSXRlbTsJLyogaW5kZXggb2YgdHJhY2tlZCBpdGVtLiAoVHJhY2tpbmcgbW9kZSkgKi8KKyAgICBJTlQzMiAgICAgICB4VHJhY2tPZmZzZXQ7CS8qIGRpc3RhbmNlIGJldHdlZW4gdGhlIHJpZ2h0IHNpZGUgb2YgdGhlIHRyYWNrZWQgaXRlbSBhbmQgdGhlIGN1cnNvciAqLworICAgIElOVDMyICAgICAgIHhPbGRUcmFjazsJLyogdHJhY2sgb2Zmc2V0IChzZWUgYWJvdmUpIGFmdGVyIHRoZSBsYXN0IFdNX01PVVNFTU9WRSAqLworICAgIElOVDMyICAgICAgIG5PbGRXaWR0aDsJLyogd2lkdGggb2YgYSBzaXppbmcgaXRlbSBhZnRlciB0aGUgbGFzdCBXTV9NT1VTRU1PVkUgKi8KKyAgICBJTlQzMiAgICAgICBpSG90SXRlbTsJLyogaW5kZXggb2YgaG90IGl0ZW0gKGN1cnNvciBpcyBvdmVyIHRoaXMgaXRlbSkgKi8KIAotICAgIEhJTUFHRUxJU1QgIGhpbWw7Ci0gICAgSEVBREVSX0lURU0gKml0ZW1zOworICAgIEhJTUFHRUxJU1QgIGhpbWw7CQkvKiBoYW5kbGUgdG8gYSBpbWFnZSBsaXN0IChtYXkgYmUgMCkgKi8KKyAgICBIRUFERVJfSVRFTSAqaXRlbXM7CQkvKiBwb2ludGVyIHRvIGFycmF5IG9mIEhFQURFUl9JVEVNJ3MgKi8KIH0gSEVBREVSX0lORk87CiAKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9taXNjZW11LmggYi9pbmNsdWRlL21pc2NlbXUuaAppbmRleCA1ZjRjNzY2Li42ODU1NzYyIDEwMDY0NAotLS0gYS9pbmNsdWRlL21pc2NlbXUuaAorKysgYi9pbmNsdWRlL21pc2NlbXUuaApAQCAtMTcsNiArMTcsNyBAQAogZXh0ZXJuIEJPT0wzMiBET1NNRU1fSW5pdChITU9EVUxFMTYgaE1vZHVsZSk7CiBleHRlcm4gdm9pZCAgIERPU01FTV9UaWNrKHZvaWQpOwogZXh0ZXJuIFdPUkQgICBET1NNRU1fQWxsb2NTZWxlY3RvcihXT1JEKTsKK2V4dGVybiBjaGFyICogRE9TTUVNX01lbW9yeUJhc2UoSE1PRFVMRTE2IGhNb2R1bGUpOwogZXh0ZXJuIExQVk9JRCBET1NNRU1fR2V0QmxvY2soSE1PRFVMRTE2IGhNb2R1bGUsIFVJTlQzMiBzaXplLCBVSU5UMTYqIHApOwogZXh0ZXJuIEJPT0wzMiBET1NNRU1fRnJlZUJsb2NrKEhNT0RVTEUxNiBoTW9kdWxlLCB2b2lkKiBwdHIpOwogZXh0ZXJuIExQVk9JRCBET1NNRU1fUmVzaXplQmxvY2soSE1PRFVMRTE2IGhNb2R1bGUsIHZvaWQqIHB0ciwgVUlOVDMyIHNpemUsIFVJTlQxNiogcCk7CkBAIC0zNiw2ICszNywxMCBAQAogCiAvKiBtc2Rvcy9pbnQxYS5jICovCiBleHRlcm4gRFdPUkQgSU5UMUFfR2V0VGlja3NTaW5jZU1pZG5pZ2h0KHZvaWQpOworZXh0ZXJuIHZvaWQgV0lOQVBJIElOVF9JbnQxYUhhbmRsZXIoQ09OVEVYVCopOworCisvKiBtc2Rvcy9pbnQyZi5jICovCitleHRlcm4gdm9pZCBXSU5BUEkgSU5UX0ludDJmSGFuZGxlcihDT05URVhUKik7CiAKIC8qIGxvYWRlci9zaWduYWwuYyAqLwogZXh0ZXJuIEJPT0wzMiBTSUdOQUxfSW5pdCh2b2lkKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbW9kdWxlLmggYi9pbmNsdWRlL21vZHVsZS5oCmluZGV4IDQ4NWQ3ODQuLmJjMGUyNWYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbW9kdWxlLmgKKysrIGIvaW5jbHVkZS9tb2R1bGUuaApAQCAtNTIsNiArNTIsNyBAQAogICAgIEhNT0RVTEUxNiAgc2VsZjsgICAgICAgICAgLyogNDQgSGFuZGxlIGZvciB0aGlzIG1vZHVsZSAqLwogICAgIFdPUkQgICAgc2VsZl9sb2FkaW5nX3NlbDsgLyogNDYgU2VsZWN0b3IgdXNlZCBmb3Igc2VsZi1sb2FkaW5nIGFwcHMuICovCiAgICAgc3RydWN0IF9ET1NUQVNLICpscERvc1Rhc2s7CisgICAgTFBWT0lEICBkb3NfaW1hZ2U7ICAgICAgICAvKiBwb2ludGVyIHRvIERPUyBtZW1vcnkgKGZvciBET1MgYXBwcykgKi8KIH0gTkVfTU9EVUxFOwogCiAKQEAgLTk4LDcgKzk5LDcgQEAKIHsKICAgICBMUFNUUiBscEVudkFkZHJlc3M7CiAgICAgTFBTVFIgbHBDbWRMaW5lOwotICAgIExQU1RSIGxwQ21kU2hvdzsKKyAgICBVSU5UMTYgKmxwQ21kU2hvdzsKICAgICBEV09SRCBkd1Jlc2VydmVkOwogfSBMT0FEUEFSQU1TMzI7CiAKQEAgLTE0MCw4ICsxNDEsNiBAQAogZXh0ZXJuIFdJTkVfTU9EUkVGICpNT0RVTEUzMl9Mb29rdXBITU9EVUxFKCBzdHJ1Y3QgX1BEQjMyICpwcm9jZXNzLCBITU9EVUxFMzIgaE1vZHVsZSApOwogZXh0ZXJuIEhNT0RVTEUzMiBNT0RVTEVfRmluZE1vZHVsZTMyKCBzdHJ1Y3QgX1BEQjMyICpwcm9jZXNzLCBMUENTVFIgcGF0aCApOwogZXh0ZXJuIEhNT0RVTEUzMiBNT0RVTEVfQ3JlYXRlRHVtbXlNb2R1bGUoIGNvbnN0IE9GU1RSVUNUICpvZnMgKTsKLWV4dGVybiBISU5TVEFOQ0UxNiBNT0RVTEVfTG9hZCggTFBDU1RSIG5hbWUsIEJPT0wzMiBpbXBsaWNpdCwgTFBDU1RSIGNtZF9saW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUENTVFIgZW52LCBVSU5UMzIgc2hvd19jbWQgKTsKIGV4dGVybiBGQVJQUk9DMTYgTU9EVUxFX0dldFduZFByb2NFbnRyeTE2KCBjb25zdCBjaGFyICpuYW1lICk7CiBleHRlcm4gRkFSUFJPQzE2IFdJTkFQSSBXSU4zMl9HZXRQcm9jQWRkcmVzczE2KCBITU9EVUxFMzIgaG1vZHVsZSwgTFBDU1RSIG5hbWUgKTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9wYWdlci5oIGIvaW5jbHVkZS9wYWdlci5oCmluZGV4IGZlOTkyZmYuLjA4MDgwODQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvcGFnZXIuaAorKysgYi9pbmNsdWRlL3BhZ2VyLmgKQEAgLTE0LDcgKzE0LDggQEAKICAgICBDT0xPUlJFRiBjbHJCazsKICAgICBJTlQzMiAgICBpQm9yZGVyOwogICAgIElOVDMyICAgIGlCdXR0b25TaXplOwotCisgICAgSU5UMzIgICAgaVBvczsKKyAgICBCT09MMzIgICBiRm9yd2FyZDsKIAogfSBQQUdFUl9JTkZPOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL3BlX2ltYWdlLmggYi9pbmNsdWRlL3BlX2ltYWdlLmgKaW5kZXggNWI5MTQ2MS4uYmJhNTczMyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9wZV9pbWFnZS5oCisrKyBiL2luY2x1ZGUvcGVfaW1hZ2UuaApAQCAtNDAsOCArNDAsOSBAQAogZXh0ZXJuIERXT1JEIFBFX1NpemVvZlJlc291cmNlMzIoSE1PRFVMRTMyLEhSU1JDMzIpOwogZXh0ZXJuIEhNT0RVTEUzMiBQRV9Mb2FkTGlicmFyeUV4MzJBKExQQ1NUUixzdHJ1Y3QgX1BEQjMyKixIRklMRTMyLERXT1JEKTsKIGV4dGVybiBIR0xPQkFMMzIgUEVfTG9hZFJlc291cmNlMzIoc3RydWN0IF93aW5lX21vZHJlZiAqd20sSFJTUkMzMik7Ci1leHRlcm4gSElOU1RBTkNFMTYgUEVfTG9hZE1vZHVsZSggTFBDU1RSIG5hbWUsIExQQ1NUUiBjbWRfbGluZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUENTVFIgZW52LCBVSU5UMTYgc2hvd0NtZCApOworZXh0ZXJuIEhJTlNUQU5DRTE2IFBFX0NyZWF0ZVByb2Nlc3MoIExQQ1NUUiBuYW1lLCBMUENTVFIgY21kX2xpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBDU1RSIGVudiwgTFBTVEFSVFVQSU5GTzMyQSBzdGFydHVwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQUFJPQ0VTU19JTkZPUk1BVElPTiBpbmZvICk7CiAKIHN0cnVjdCBfUERCMzI7IC8qIGZvcndhcmQgZGVmaW5pdGlvbiAqLwogc3RydWN0IF9USERCOyAvKiBmb3J3YXJkIGRlZmluaXRpb24gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvcHJvY2Vzcy5oIGIvaW5jbHVkZS9wcm9jZXNzLmgKaW5kZXggOGY4MjI5NC4uNTM5YWVlMSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9wcm9jZXNzLmgKKysrIGIvaW5jbHVkZS9wcm9jZXNzLmgKQEAgLTE0Miw3ICsxNDIsNyBAQAogZXh0ZXJuIFBEQjMyICpQUk9DRVNTX0lkVG9QREIoIERXT1JEIGlkICk7CiBleHRlcm4gUERCMzIgKlBST0NFU1NfQ3JlYXRlKCBzdHJ1Y3QgX05FX01PRFVMRSAqcE1vZHVsZSwgTFBDU1RSIGNtZF9saW5lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBDU1RSIGVudiwgSElOU1RBTkNFMTYgaEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSElOU1RBTkNFMTYgaFByZXZJbnN0YW5jZSwgVUlOVDMyIGNtZFNob3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBISU5TVEFOQ0UxNiBoUHJldkluc3RhbmNlLCBTVEFSVFVQSU5GTzMyQSAqc3RhcnR1cCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST0NFU1NfSU5GT1JNQVRJT04gKmluZm8gKTsKIGV4dGVybiB2b2lkIFBST0NFU1NfU3VzcGVuZE90aGVyVGhyZWFkcyh2b2lkKTsKIGV4dGVybiB2b2lkIFBST0NFU1NfUmVzdW1lT3RoZXJUaHJlYWRzKHZvaWQpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9xdWV1ZS5oIGIvaW5jbHVkZS9xdWV1ZS5oCmluZGV4IDM4MTM2YzUuLmY4NjRkZmUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvcXVldWUuaAorKysgYi9pbmNsdWRlL3F1ZXVlLmgKQEAgLTgwLDYgKzgwLDggQEAKIGV4dGVybiBCT09MMzIgUVVFVUVfSXNFeGl0aW5nUXVldWUoIEhRVUVVRTE2IGhRdWV1ZSApOwogZXh0ZXJuIHZvaWQgUVVFVUVfU2V0RXhpdGluZ1F1ZXVlKCBIUVVFVUUxNiBoUXVldWUgKTsKIGV4dGVybiBNRVNTQUdFUVVFVUUgKlFVRVVFX0dldFN5c1F1ZXVlKHZvaWQpOworZXh0ZXJuIHZvaWQgUVVFVUVfU2lnbmFsKCBIVEFTSzE2IGhUYXNrICk7CitleHRlcm4gdm9pZCBRVUVVRV9XYWl0KHZvaWQpOwogZXh0ZXJuIHZvaWQgUVVFVUVfU2V0V2FrZUJpdCggTUVTU0FHRVFVRVVFICpxdWV1ZSwgV09SRCBiaXQgKTsKIGV4dGVybiB2b2lkIFFVRVVFX0NsZWFyV2FrZUJpdCggTUVTU0FHRVFVRVVFICpxdWV1ZSwgV09SRCBiaXQgKTsKIGV4dGVybiB2b2lkIFFVRVVFX1JlY2VpdmVNZXNzYWdlKCBNRVNTQUdFUVVFVUUgKnF1ZXVlICk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL3JlYmFyLmggYi9pbmNsdWRlL3JlYmFyLmgKaW5kZXggMTUyZDZlZS4uZmY5MjUxMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9yZWJhci5oCisrKyBiL2luY2x1ZGUvcmViYXIuaApAQCAtNywxMCArNywzOCBAQAogI2lmbmRlZiBfX1dJTkVfUkVCQVJfSAogI2RlZmluZSBfX1dJTkVfUkVCQVJfSAogCit0eXBlZGVmIHN0cnVjdCB0YWdSRUJBUl9CQU5ECit7CisgICAgVUlOVDMyICAgIGZTdHlsZTsKKyAgICBDT0xPUlJFRiAgY2xyRm9yZTsKKyAgICBDT0xPUlJFRiAgY2xyQmFjazsKKyAgICBJTlQzMiAgICAgaUltYWdlOworICAgIEhXTkQzMiAgICBod25kQ2hpbGQ7CisgICAgVUlOVDMyICAgIGN4TWluQ2hpbGQ7CisgICAgVUlOVDMyICAgIGN5TWluQ2hpbGQ7CisgICAgVUlOVDMyICAgIGN4OworICAgIEhCSVRNQVAzMiBoYm1CYWNrOworICAgIFVJTlQzMiAgICB3SUQ7CisgICAgVUlOVDMyICAgIGN5Q2hpbGQ7CisgICAgVUlOVDMyICAgIGN5TWF4Q2hpbGQ7CisgICAgVUlOVDMyICAgIGN5SW50ZWdyYWw7CisgICAgVUlOVDMyICAgIGN4SWRlYWw7CisgICAgTFBBUkFNICAgIGxQYXJhbTsKKyAgICBVSU5UMzIgICAgY3hIZWFkZXI7CisKKyAgICBMUFNUUiAgICAgbHBUZXh0OworCit9IFJFQkFSX0JBTkQ7CisKIAogdHlwZWRlZiBzdHJ1Y3QgdGFnUkVCQVJfSU5GTwogewotICAgIFVJTlQzMiAgdUR1bW15OyAgIC8qIHRoaXMgaXMganVzdCBhIGR1bW15IHRvIGtlZXAgdGhlIGNvbXBpbGVyIGhhcHB5ICovCisgICAgQ09MT1JSRUYgICBjbHJCazsgICAgICAvKiBiYWNrZ3JvdW5kIGNvbG9yICovCisgICAgQ09MT1JSRUYgICBjbHJUZXh0OyAgICAvKiB0ZXh0IGNvbG9yICovCisgICAgSElNQUdFTElTVCBoaW1sOyAgICAgICAvKiBoYW5kbGUgdG8gaW1hZ2VsaXN0ICovCisgICAgVUlOVDMyICAgICB1TnVtQmFuZHM7ICAvKiBudW1iZXIgb2YgYmFuZHMgaW4gdGhlIHJlYmFyICovCisKKyAgICBSRUJBUl9CQU5EICpiYW5kczsgICAgIC8qIHBvaW50ZXIgdG8gdGhlIGFycmF5IG9mIHJlYmFyIGJhbmRzICovCiAKIH0gUkVCQVJfSU5GTzsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zZXJ2ZXIuaCBiL2luY2x1ZGUvc2VydmVyLmgKaW5kZXggMGI4MGU0OC4uMzBlMDlhYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9zZXJ2ZXIuaAorKysgYi9pbmNsdWRlL3NlcnZlci5oCkBAIC04Niw2ICs4NiwxOCBAQAogfTsKIAogCisvKiBSZXRyaWV2ZSBpbmZvcm1hdGlvbiBhYm91dCBhIHRocmVhZCAqLworc3RydWN0IGdldF90aHJlYWRfaW5mb19yZXF1ZXN0Cit7CisgICAgaW50ICAgICAgICAgIGhhbmRsZTsgICAgICAgLyogdGhyZWFkIGhhbmRsZSAqLworfTsKK3N0cnVjdCBnZXRfdGhyZWFkX2luZm9fcmVwbHkKK3sKKyAgICB2b2lkKiAgICAgICAgcGlkOyAgICAgICAgICAvKiBzZXJ2ZXIgdGhyZWFkIGlkICovCisgICAgaW50ICAgICAgICAgIGV4aXRfY29kZTsgICAgLyogdGhyZWFkIGV4aXQgY29kZSAqLworfTsKKworCiAvKiBDbG9zZSBhIGhhbmRsZSBmb3IgdGhlIGN1cnJlbnQgcHJvY2VzcyAqLwogc3RydWN0IGNsb3NlX2hhbmRsZV9yZXF1ZXN0CiB7CkBAIC0xMjMsNiArMTM1LDIzIEBACiB9OwogCiAKKy8qIFdhaXQgZm9yIGhhbmRsZXMgKi8KK3N0cnVjdCBzZWxlY3RfcmVxdWVzdAoreworICAgIGludCAgICAgICAgICBjb3VudDsgICAgICAgIC8qIGhhbmRsZXMgY291bnQgKi8KKyAgICBpbnQgICAgICAgICAgZmxhZ3M7ICAgICAgICAvKiB3YWl0IGZsYWdzIChzZWUgYmVsb3cpICovCisgICAgaW50ICAgICAgICAgIHRpbWVvdXQ7ICAgICAgLyogdGltZW91dCBpbiBtcyAqLworICAgIC8qIGludCBoYW5kbGVzW10gKi8KK307CitzdHJ1Y3Qgc2VsZWN0X3JlcGx5Cit7CisgICAgaW50ICAgICAgICAgIHNpZ25hbGVkOyAgICAgLyogc2lnbmFsZWQgaGFuZGxlICovCit9OworI2RlZmluZSBTRUxFQ1RfQUxMICAgICAgIDEKKyNkZWZpbmUgU0VMRUNUX01TRyAgICAgICAyCisjZGVmaW5lIFNFTEVDVF9BTEVSVEFCTEUgNAorI2RlZmluZSBTRUxFQ1RfVElNRU9VVCAgIDgKKwogLyogY2xpZW50LXNpZGUgZnVuY3Rpb25zICovCiAKICNpZm5kZWYgX19XSU5FX1NFUlZFUl9fCkBAIC0xMzQsOCArMTYzLDEwIEBACiBleHRlcm4gaW50IENMSUVOVF9DbG9zZUhhbmRsZSggaW50IGhhbmRsZSApOwogZXh0ZXJuIGludCBDTElFTlRfRHVwbGljYXRlSGFuZGxlKCBpbnQgc3JjX3Byb2Nlc3MsIGludCBzcmNfaGFuZGxlLCBpbnQgZHN0X3Byb2Nlc3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkc3RfaGFuZGxlLCBEV09SRCBhY2Nlc3MsIEJPT0wzMiBpbmhlcml0LCBEV09SRCBvcHRpb25zICk7CitleHRlcm4gaW50IENMSUVOVF9HZXRUaHJlYWRJbmZvKCBpbnQgaGFuZGxlLCBzdHJ1Y3QgZ2V0X3RocmVhZF9pbmZvX3JlcGx5ICpyZXBseSApOwogZXh0ZXJuIGludCBDTElFTlRfR2V0UHJvY2Vzc0luZm8oIGludCBoYW5kbGUsIHN0cnVjdCBnZXRfcHJvY2Vzc19pbmZvX3JlcGx5ICpyZXBseSApOwogZXh0ZXJuIGludCBDTElFTlRfT3BlblByb2Nlc3MoIHZvaWQgKnBpZCwgRFdPUkQgYWNjZXNzLCBCT09MMzIgaW5oZXJpdCApOworZXh0ZXJuIGludCBDTElFTlRfU2VsZWN0KCBpbnQgY291bnQsIGludCAqaGFuZGxlcywgaW50IGZsYWdzLCBpbnQgdGltZW91dCApOwogI2VuZGlmICAvKiBfX1dJTkVfU0VSVkVSX18gKi8KIAogI2VuZGlmICAvKiBfX1dJTkVfU0VSVkVSX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvc2VydmVyL29iamVjdC5oIGIvaW5jbHVkZS9zZXJ2ZXIvb2JqZWN0LmgKaW5kZXggYmY2ZGNkMy4uNTI2ODA2MSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9zZXJ2ZXIvb2JqZWN0LmgKKysrIGIvaW5jbHVkZS9zZXJ2ZXIvb2JqZWN0LmgKQEAgLTE4LDE3ICsxOCwyMiBAQAogCiBzdHJ1Y3Qgb2JqZWN0Owogc3RydWN0IG9iamVjdF9uYW1lOworc3RydWN0IHRocmVhZDsKIAogc3RydWN0IG9iamVjdF9vcHMKIHsKLSAgICB2b2lkICgqZHVtcCkoc3RydWN0IG9iamVjdCAqLGludCk7ICAgLyogZHVtcCB0aGUgb2JqZWN0IChmb3IgZGVidWdnaW5nKSAqLwotICAgIHZvaWQgKCpkZXN0cm95KShzdHJ1Y3Qgb2JqZWN0ICopOyAgICAvKiBkZXN0cm95IG9uIHJlZmNvdW50ID09IDAgKi8KKyAgICB2b2lkICgqZHVtcCkoc3RydWN0IG9iamVjdCAqLGludCk7ICAgICAgICAgICAgICAgICAgLyogZHVtcCB0aGUgb2JqZWN0IChmb3IgZGVidWdnaW5nKSAqLworICAgIGludCAgKCpzaWduYWxlZCkoc3RydWN0IG9iamVjdCAqLHN0cnVjdCB0aHJlYWQgKik7ICAvKiBpcyBvYmplY3Qgc2lnbmFsZWQ/ICovCisgICAgaW50ICAoKnNhdGlzZmllZCkoc3RydWN0IG9iamVjdCAqLHN0cnVjdCB0aHJlYWQgKik7IC8qIHdhaXQgc2F0aXNmaWVkOyByZXR1cm4gMSBpZiBhYmFuZG9uZWQgKi8KKyAgICB2b2lkICgqZGVzdHJveSkoc3RydWN0IG9iamVjdCAqKTsgICAgICAgICAgICAgICAgICAgLyogZGVzdHJveSBvbiByZWZjb3VudCA9PSAwICovCiB9OwogCiBzdHJ1Y3Qgb2JqZWN0CiB7CiAgICAgdW5zaWduZWQgaW50ICAgICAgICAgICAgICByZWZjb3VudDsKICAgICBjb25zdCBzdHJ1Y3Qgb2JqZWN0X29wcyAgKm9wczsKKyAgICBzdHJ1Y3Qgd2FpdF9xdWV1ZV9lbnRyeSAgKmhlYWQ7CisgICAgc3RydWN0IHdhaXRfcXVldWVfZW50cnkgICp0YWlsOwogICAgIHN0cnVjdCBvYmplY3RfbmFtZSAgICAgICAqbmFtZTsKIH07CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvc2VydmVyL3JlcXVlc3QuaCBiL2luY2x1ZGUvc2VydmVyL3JlcXVlc3QuaAppbmRleCA1NzRiNzMyLi5iODgyZWJjIDEwMDY0NAotLS0gYS9pbmNsdWRlL3NlcnZlci9yZXF1ZXN0LmgKKysrIGIvaW5jbHVkZS9zZXJ2ZXIvcmVxdWVzdC5oCkBAIC0xMCw5ICsxMCwxMSBAQAogICAgIFJFUV9URVJNSU5BVEVfUFJPQ0VTUywKICAgICBSRVFfVEVSTUlOQVRFX1RIUkVBRCwKICAgICBSRVFfR0VUX1BST0NFU1NfSU5GTywKKyAgICBSRVFfR0VUX1RIUkVBRF9JTkZPLAogICAgIFJFUV9DTE9TRV9IQU5ETEUsCiAgICAgUkVRX0RVUF9IQU5ETEUsCiAgICAgUkVRX09QRU5fUFJPQ0VTUywKKyAgICBSRVFfU0VMRUNULAogICAgIFJFUV9OQl9SRVFVRVNUUwogfTsKIApAQCAtMjYsOSArMjgsMTEgQEAKIERFQ0xfSEFORExFUih0ZXJtaW5hdGVfcHJvY2Vzcyk7CiBERUNMX0hBTkRMRVIodGVybWluYXRlX3RocmVhZCk7CiBERUNMX0hBTkRMRVIoZ2V0X3Byb2Nlc3NfaW5mbyk7CitERUNMX0hBTkRMRVIoZ2V0X3RocmVhZF9pbmZvKTsKIERFQ0xfSEFORExFUihjbG9zZV9oYW5kbGUpOwogREVDTF9IQU5ETEVSKGR1cF9oYW5kbGUpOwogREVDTF9IQU5ETEVSKG9wZW5fcHJvY2Vzcyk7CitERUNMX0hBTkRMRVIoc2VsZWN0KTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBoYW5kbGVyIHsKICAgICB2b2lkICAgICAgICgqaGFuZGxlcikoKTsKQEAgLTM5LDkgKzQzLDExIEBACiAgICAgeyAodm9pZCgqKSgpKXJlcV90ZXJtaW5hdGVfcHJvY2Vzcywgc2l6ZW9mKHN0cnVjdCB0ZXJtaW5hdGVfcHJvY2Vzc19yZXF1ZXN0KSB9LAogICAgIHsgKHZvaWQoKikoKSlyZXFfdGVybWluYXRlX3RocmVhZCwgc2l6ZW9mKHN0cnVjdCB0ZXJtaW5hdGVfdGhyZWFkX3JlcXVlc3QpIH0sCiAgICAgeyAodm9pZCgqKSgpKXJlcV9nZXRfcHJvY2Vzc19pbmZvLCBzaXplb2Yoc3RydWN0IGdldF9wcm9jZXNzX2luZm9fcmVxdWVzdCkgfSwKKyAgICB7ICh2b2lkKCopKCkpcmVxX2dldF90aHJlYWRfaW5mbywgc2l6ZW9mKHN0cnVjdCBnZXRfdGhyZWFkX2luZm9fcmVxdWVzdCkgfSwKICAgICB7ICh2b2lkKCopKCkpcmVxX2Nsb3NlX2hhbmRsZSwgc2l6ZW9mKHN0cnVjdCBjbG9zZV9oYW5kbGVfcmVxdWVzdCkgfSwKICAgICB7ICh2b2lkKCopKCkpcmVxX2R1cF9oYW5kbGUsIHNpemVvZihzdHJ1Y3QgZHVwX2hhbmRsZV9yZXF1ZXN0KSB9LAogICAgIHsgKHZvaWQoKikoKSlyZXFfb3Blbl9wcm9jZXNzLCBzaXplb2Yoc3RydWN0IG9wZW5fcHJvY2Vzc19yZXF1ZXN0KSB9LAorICAgIHsgKHZvaWQoKikoKSlyZXFfc2VsZWN0LCBzaXplb2Yoc3RydWN0IHNlbGVjdF9yZXF1ZXN0KSB9LAogfTsKICNlbmRpZiAgLyogV0FOVF9SRVFVRVNUX0hBTkRMRVJTICovCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvc2VydmVyL3RocmVhZC5oIGIvaW5jbHVkZS9zZXJ2ZXIvdGhyZWFkLmgKaW5kZXggOWVkYmZkZi4uN2Y3ZGY4ZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9zZXJ2ZXIvdGhyZWFkLmgKKysrIGIvaW5jbHVkZS9zZXJ2ZXIvdGhyZWFkLmgKQEAgLTE2LDIxICsxNiwyNiBAQAogLyogdGhyZWFkIHN0cnVjdHVyZSAqLwogCiBzdHJ1Y3QgcHJvY2VzczsKK3N0cnVjdCB0aHJlYWRfd2FpdDsKKworZW51bSBydW5fc3RhdGUgeyBTVEFSVElORywgUlVOTklORywgVEVSTUlOQVRFRCB9OwogCiBzdHJ1Y3QgdGhyZWFkCiB7Ci0gICAgc3RydWN0IG9iamVjdCAgIG9iajsgICAgICAgLyogb2JqZWN0IGhlYWRlciAqLwotICAgIHN0cnVjdCB0aHJlYWQgICpuZXh0OyAgICAgIC8qIHN5c3RlbS13aWRlIHRocmVhZCBsaXN0ICovCi0gICAgc3RydWN0IHRocmVhZCAgKnByZXY7Ci0gICAgc3RydWN0IHRocmVhZCAgKnByb2NfbmV4dDsgLyogcGVyLXByb2Nlc3MgdGhyZWFkIGxpc3QgKi8KLSAgICBzdHJ1Y3QgdGhyZWFkICAqcHJvY19wcmV2OwotICAgIHN0cnVjdCBwcm9jZXNzICpwcm9jZXNzOwotICAgIGludCAgICAgICAgICAgICBlcnJvcjsgICAgIC8qIGN1cnJlbnQgZXJyb3IgY29kZSAqLwotICAgIGludCAgICAgICAgICAgICBleGl0X2NvZGU7IC8qIHRocmVhZCBleGl0IGNvZGUgKi8KLSAgICBpbnQgICAgICAgICAgICAgY2xpZW50X2ZkOyAvKiBjbGllbnQgZmQgZm9yIHNvY2tldCBjb21tdW5pY2F0aW9ucyAqLwotICAgIGludCAgICAgICAgICAgICB1bml4X3BpZDsgIC8qIFVuaXggcGlkIG9mIGNsaWVudCAqLwotICAgIGVudW0gcmVxdWVzdCAgICBsYXN0X3JlcTsgIC8qIGxhc3QgcmVxdWVzdCByZWNlaXZlZCAoZm9yIGRlYnVnZ2luZykgKi8KLSAgICBjaGFyICAgICAgICAgICAqbmFtZTsKKyAgICBzdHJ1Y3Qgb2JqZWN0ICAgICAgIG9iajsgICAgICAgLyogb2JqZWN0IGhlYWRlciAqLworICAgIHN0cnVjdCB0aHJlYWQgICAgICAqbmV4dDsgICAgICAvKiBzeXN0ZW0td2lkZSB0aHJlYWQgbGlzdCAqLworICAgIHN0cnVjdCB0aHJlYWQgICAgICAqcHJldjsKKyAgICBzdHJ1Y3QgdGhyZWFkICAgICAgKnByb2NfbmV4dDsgLyogcGVyLXByb2Nlc3MgdGhyZWFkIGxpc3QgKi8KKyAgICBzdHJ1Y3QgdGhyZWFkICAgICAgKnByb2NfcHJldjsKKyAgICBzdHJ1Y3QgcHJvY2VzcyAgICAgKnByb2Nlc3M7CisgICAgc3RydWN0IHRocmVhZF93YWl0ICp3YWl0OyAgICAgIC8qIGN1cnJlbnQgd2FpdCBjb25kaXRpb24gaWYgc2xlZXBpbmcgKi8KKyAgICBpbnQgICAgICAgICAgICAgICAgIGVycm9yOyAgICAgLyogY3VycmVudCBlcnJvciBjb2RlICovCisgICAgZW51bSBydW5fc3RhdGUgICAgICBzdGF0ZTsgICAgIC8qIHJ1bm5pbmcgc3RhdGUgKi8KKyAgICBpbnQgICAgICAgICAgICAgICAgIGV4aXRfY29kZTsgLyogdGhyZWFkIGV4aXQgY29kZSAqLworICAgIGludCAgICAgICAgICAgICAgICAgY2xpZW50X2ZkOyAvKiBjbGllbnQgZmQgZm9yIHNvY2tldCBjb21tdW5pY2F0aW9ucyAqLworICAgIGludCAgICAgICAgICAgICAgICAgdW5peF9waWQ7ICAvKiBVbml4IHBpZCBvZiBjbGllbnQgKi8KKyAgICBlbnVtIHJlcXVlc3QgICAgICAgIGxhc3RfcmVxOyAgLyogbGFzdCByZXF1ZXN0IHJlY2VpdmVkIChmb3IgZGVidWdnaW5nKSAqLworICAgIGNoYXIgICAgICAgICAgICAgICAqbmFtZTsKIH07CiAKIGV4dGVybiBzdHJ1Y3QgdGhyZWFkICpjdXJyZW50OwpAQCAtNDEsMTAgKzQ2LDE2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpwcm9jZXNzX2hhbmRsZSApOwogZXh0ZXJuIHN0cnVjdCB0aHJlYWQgKmdldF90aHJlYWRfZnJvbV9pZCggdm9pZCAqaWQgKTsKIGV4dGVybiBzdHJ1Y3QgdGhyZWFkICpnZXRfdGhyZWFkX2Zyb21faGFuZGxlKCBpbnQgaGFuZGxlLCB1bnNpZ25lZCBpbnQgYWNjZXNzICk7CitleHRlcm4gdm9pZCBnZXRfdGhyZWFkX2luZm8oIHN0cnVjdCB0aHJlYWQgKnRocmVhZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGdldF90aHJlYWRfaW5mb19yZXBseSAqcmVwbHkgKTsKIGV4dGVybiBpbnQgc2VuZF9yZXBseSggc3RydWN0IHRocmVhZCAqdGhyZWFkLCBpbnQgcGFzc19mZCwKICAgICAgICAgICAgICAgICAgICAgICAgaW50IG4sIC4uLiAvKiBhcmdfMSwgbGVuXzEsIC4uLiwgYXJnX24sIGxlbl9uICovICk7CiBleHRlcm4gdm9pZCBraWxsX3RocmVhZCggc3RydWN0IHRocmVhZCAqdGhyZWFkLCBpbnQgZXhpdF9jb2RlICk7CiBleHRlcm4gdm9pZCB0aHJlYWRfa2lsbGVkKCBzdHJ1Y3QgdGhyZWFkICp0aHJlYWQsIGludCBleGl0X2NvZGUgKTsKK2V4dGVybiB2b2lkIHRocmVhZF90aW1lb3V0KHZvaWQpOworZXh0ZXJuIHZvaWQgc2xlZXBfb24oIHN0cnVjdCB0aHJlYWQgKnRocmVhZCwgaW50IGNvdW50LCBpbnQgKmhhbmRsZXMsCisgICAgICAgICAgICAgICAgICAgICAgaW50IGZsYWdzLCBpbnQgdGltZW91dCApOworZXh0ZXJuIHZvaWQgd2FrZV91cCggc3RydWN0IG9iamVjdCAqb2JqLCBpbnQgbWF4ICk7CiAKICNkZWZpbmUgU0VUX0VSUk9SKGVycikgIChjdXJyZW50LT5lcnJvciA9IChlcnIpKQogI2RlZmluZSBDTEVBUl9FUlJPUigpICAgKGN1cnJlbnQtPmVycm9yID0gMCkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvc2hlbGwuaCBiL2luY2x1ZGUvc2hlbGwuaAppbmRleCBjZGE2NDFjLi5lOWRjNGM1IDEwMDY0NAotLS0gYS9pbmNsdWRlL3NoZWxsLmgKKysrIGIvaW5jbHVkZS9zaGVsbC5oCkBAIC02LDE1ICs2LDI5IEBACiAKICNpbmNsdWRlICJ3aW5kb3dzLmgiCiAjaW5jbHVkZSAid2lucmVnLmgiCisjaW5jbHVkZSAiaW1hZ2VsaXN0LmgiCiAKICNpZm5kZWYgTUFYX1BBVEgKICNkZWZpbmUgTUFYX1BBVEggMjYwCiAjZW5kaWYKIAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogc2hlbGwgMTYKKyovCiBleHRlcm4gdm9pZCBTSEVMTF9Mb2FkUmVnaXN0cnkoKTsKIGV4dGVybiB2b2lkIFNIRUxMX1NhdmVSZWdpc3RyeSgpOwogZXh0ZXJuIHZvaWQgU0hFTExfSW5pdCgpOwogCisvKiBnbG9iYWwgZnVuY3Rpb25zIHVzZWQgZnJvbSBzaGVsbDMyICovCitleHRlcm4gSElOU1RBTkNFMzIgU0hFTExfRmluZEV4ZWN1dGFibGUoTFBDU1RSLExQQ1NUUiAsTFBTVFIpOworZXh0ZXJuIEhHTE9CQUwxNiBXSU5BUEkgSW50ZXJuYWxFeHRyYWN0SWNvbihISU5TVEFOQ0UxNixMUENTVFIsVUlOVDE2LFdPUkQpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBzaGVsbCAzMgorKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGNvbW1vbiByZXR1cm4gY29kZXMgCisqLwogI2RlZmluZSBTSEVMTF9FUlJPUl9TVUNDRVNTICAgICAgICAgICAwTAogI2RlZmluZSBTSEVMTF9FUlJPUl9CQUREQiAgICAgICAgICAgICAxTAogI2RlZmluZSBTSEVMTF9FUlJPUl9CQURLRVkgICAgICAgICAgICAyTApAQCAtMjUsOCArMzksOCBAQAogI2RlZmluZSBTSEVMTF9FUlJPUl9JTlZBTElEX1BBUkFNRVRFUiA3TAogI2RlZmluZSBTSEVMTF9FUlJPUl9BQ0NFU1NfREVOSUVEICAgICA4TAogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIGNvbW1vbiBzaGVsbCBmaWxlIHN0cnVjdHVyZXMKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGNvbW1vbiBzaGVsbCBmaWxlIHN0cnVjdHVyZXMgCiAqLwogI2RlZmluZSBGT19NT1ZFICAgICAgICAgICAweDAwMDEKICNkZWZpbmUgRk9fQ09QWSAgICAgICAgICAgMHgwMDAyCkBAIC02Myw4ICs3Nyw4IEBACiAJLyogbWVtb3J5IGJsb2NrIHdpdGggZmlsZW5hbWVzIGZvbGxvd3MgKi8gICAgIAogfSBEUk9QRklMRVNUUlVDVCwgKkxQRFJPUEZJTEVTVFJVQ1Q7IAogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIE5PVElGWUlDT05EQVRBCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBOT1RJRllJQ09OREFUQSAKICovCiB0eXBlZGVmIHN0cnVjdCBfTk9USUZZSUNPTkRBVEEgewogCURXT1JEIGNiU2l6ZTsKQEAgLTc2LDggKzkwLDggQEAKIAlDSEFSIHN6VGlwWzY0XTsKIH0gTk9USUZZSUNPTkRBVEEsICpQTk9USUZZSUNPTkRBVEE7CiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIFNISVRFTUlELCBJVEVNSURMSVNULCBQSURMIEFQSQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogU0hJVEVNSUQsIElURU1JRExJU1QsIFBJREwgQVBJIAogKi8KIHR5cGVkZWYgc3RydWN0IAogeyBXT1JECQljYjsJLyogbnIgb2YgYnl0ZXMgaW4gdGhpcyBpdGVtICovCkBAIC04OSw2ICsxMDMsNyBAQAogfSBJVEVNSURMSVNULCpMUElURU1JRExJU1QsKkxQQ0lURU1JRExJU1Q7CiAKIExQSVRFTUlETElTVCBXSU5BUEkgSUxDbG9uZSAoTFBDSVRFTUlETElTVCBwaWRsKTsKK0xQSVRFTUlETElTVCBXSU5BUEkgSUxHZXROZXh0KExQSVRFTUlETElTVCBwaWRsKTsKIExQSVRFTUlETElTVCBXSU5BUEkgSUxDb21iaW5lKExQQ0lURU1JRExJU1QgaWlsMSxMUENJVEVNSURMSVNUIGlpbDIpOwogRFdPUkQgV0lOQVBJIElMR2V0U2l6ZShMUElURU1JRExJU1QgcGlkbCk7CiAKQEAgLTk3LDcgKzExMiw3IEBACiAjZGVmaW5lICBTSEdldFBhdGhGcm9tSURMaXN0IFdJTkVMSUJfTkFNRV9BVyhTSEdldFBhdGhGcm9tSURMaXN0KQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBTSEZJTEVJTkZPIEFQSQorKiBTSEZJTEVJTkZPIEFQSSAKICovCiB0eXBlZGVmIHN0cnVjdCB0YWdTSEZJTEVJTkZPMzJBIHsKIAlISUNPTjMyCWhJY29uOwkJCS8qIGljb24gKi8KQEAgLTEyMiw3ICsxMzcsNyBAQAogI2RlZmluZSAgU0hHZXRGaWxlSW5mbyBXSU5FTElCX05BTUVfQVcoU0hHZXRGaWxlSW5mbykKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogU0hGSUxFT1BTVFJVQ1QgQVBJCisqIFNIRklMRU9QU1RSVUNUIEFQSSAKICovCiB0eXBlZGVmIHN0cnVjdCBfU0hGSUxFT1BTVFJVQ1RBCiB7IEhXTkQzMiAgICAgICAgICBod25kOwpAQCAtMTUzLDcgKzE2OCw3IEBACiAKIERXT1JEIFdJTkFQSSBTSEZpbGVPcGVyYXRpb24zMihMUFNIRklMRU9QU1RSVUNUMzIgbHBGaWxlT3ApOwogCi0vKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQVBQQkFSREFUQSAKICovCiB0eXBlZGVmIHN0cnVjdCBfQXBwQmFyRGF0YSB7CkBAIC0xODgsNiArMjAzLDcgQEAKIHsgTFBJVEVNSURMSVNUIHBpZGw7CiAgIERXT1JEIHVua25vd247CiB9IElEU1RSVUNUOworCiBEV09SRCBXSU5BUEkgU0hDaGFuZ2VOb3RpZnlSZWdpc3RlcihIV05EMzIgaHduZCxMT05HIGV2ZW50czEsTE9ORyBldmVudHMyLERXT1JEIG1zZyxpbnQgY291bnQsSURTVFJVQ1QgKmlkbGlzdCk7CiBEV09SRCBXSU5BUEkgU0hDaGFuZ2VOb3RpZnlEZXJlZ2lzdGVyKExPTkcgeDEsTE9ORyB4Mik7CiAKQEAgLTIwMCwxMyArMjE2LDE3IEBACiBEV09SRCBXSU5BUEkgU0hBZGRUb1JlY2VudERvY3MoVUlOVDMyIHVGbGFncywgTFBDVk9JRCBwdik7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqICBzdHJpbmcgYW5kIHBhdGggZnVuY3Rpb25zCisqLworTFBTVFIgV0lOQVBJIFBhdGhBZGRCYWNrc2xhc2goTFBTVFIgcGF0aCk7CQorTFBTVFIgV0lOQVBJIFBhdGhDb21iaW5lKExQU1RSIHRhcmdldCxMUFNUUiB4MSxMUFNUUiB4Mik7CitMUFNUUiBXSU5BUEkgUGF0aFJlbW92ZUJsYW5rcyhMUFNUUiBzdHIpOworTFBTVFIgV0lOQVBJIFBhdGhGaW5kRmlsZW5hbWUoTFBTVFIgZm4pOworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogIG90aGVyIGZ1bmN0aW9ucwogKi8KIExQVk9JRCBXSU5BUEkgU0hBbGxvYyhEV09SRCBsZW4pOwogRFdPUkQgV0lOQVBJIFNIRnJlZShMUFZPSUQgeCk7Ci1MUFNUUiBXSU5BUEkgUGF0aEFkZEJhY2tzbGFzaChMUFNUUiBwYXRoKTsJCi1MUFNUUiBXSU5BUEkgUGF0aENvbWJpbmUoTFBTVFIgdGFyZ2V0LExQU1RSIHgxLExQU1RSIHgyKTsKLUxQU1RSIFdJTkFQSSBQYXRoUmVtb3ZlQmxhbmtzKExQU1RSIHN0cik7CiAKICNkZWZpbmUgU0VfRVJSX1NIQVJFICAgICAgICAgICAgMjYKICNkZWZpbmUgU0VfRVJSX0FTU09DSU5DT01QTEVURSAgMjcKQEAgLTIzMywxMCArMjUzLDQgQEAKICNkZWZpbmUJQ1NJRExfRk9OVFMJCTB4MDAxNAogI2RlZmluZQlDU0lETF9URU1QTEFURVMJCTB4MDAxNQogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiAgZ2xvYmFsIFNIRUxMMzIuRExMIHZhcmlhYmxlcwotKi8KLWV4dGVybiBISU5TVEFOQ0UzMiBzaGVsbDMyX2hJbnN0YW5jZTsKLWV4dGVybiBVSU5UMzIgICAgICBzaGVsbDMyX0RsbFJlZkNvdW50OwotCiAjZW5kaWYgIC8qIF9fV0lORV9TSEVMTF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3NobG9iai5oIGIvaW5jbHVkZS9zaGxvYmouaAppbmRleCAzNTBmZTU3Li40YTkwMGFjIDEwMDY0NAotLS0gYS9pbmNsdWRlL3NobG9iai5oCisrKyBiL2luY2x1ZGUvc2hsb2JqLmgKQEAgLTcsNiArNyw3IEBACiAjaW5jbHVkZSAiY29tcG9iai5oIgogI2luY2x1ZGUgInN0b3JhZ2UuaCIKICNpbmNsdWRlICJjb21tY3RybC5oIgorI2luY2x1ZGUgImludGVyZmFjZXMuaCIKIAogI2RlZmluZSBTVERNRVRIT0QoeGZuKSBIUkVTVUxUIChDQUxMQkFDSyAqZm4jI3hmbikKICNkZWZpbmUgU1RETUVUSE9EXyh0eXBlLHhmbikgdHlwZSAoQ0FMTEJBQ0sgKmZuIyN4Zm4pCkBAIC0yNSwxMSArMjYsMTUgQEAKIHR5cGVkZWYgTFBWT0lECUxQQkM7IC8qICpJQmluZEN0eCByZWFsbHkgKi8KIAogLyogZm9yZXdhcmQgZGVjbGFyYXRpb24gb2YgdGhlIG9iamVjdHMqLwotdHlwZWRlZiBzdHJ1Y3QgSUVudW1JRExpc3QgSUVudW1JRExpc3QsKkxQRU5VTUlETElTVDsKLXR5cGVkZWYgc3RydWN0IHRhZ1NIRUxMRk9MREVSICpMUFNIRUxMRk9MREVSLElTaGVsbEZvbGRlcjsKLXR5cGVkZWYgc3RydWN0IHRhZ1NIRUxMVklFVyAqTFBTSEVMTFZJRVcsSVNoZWxsVmlldzsKLXR5cGVkZWYgc3RydWN0IHRhZ1NIRUxMQlJPV1NFUiAqTFBTSEVMTEJST1dTRVIsSVNoZWxsQnJvd3NlcjsKIAordHlwZWRlZiBzdHJ1Y3QgSUNvbnRleHRNZW51CQlJQ29udGV4dE1lbnUsCSpMUENPTlRFWFRNRU5VOwordHlwZWRlZiBzdHJ1Y3QgSVNoZWxsRXh0SW5pdAlJU2hlbGxFeHRJbml0LCAJKkxQU0hFTExFWFRJTklUOwordHlwZWRlZiBzdHJ1Y3QgSUVudW1JRExpc3QJCUlFbnVtSURMaXN0LAkqTFBFTlVNSURMSVNUOwordHlwZWRlZiBzdHJ1Y3QgdGFnU0hFTExGT0xERVIJKkxQU0hFTExGT0xERVIsCUlTaGVsbEZvbGRlcjsKK3R5cGVkZWYgc3RydWN0IHRhZ1NIRUxMVklFVwkJKkxQU0hFTExWSUVXLAlJU2hlbGxWaWV3OwordHlwZWRlZiBzdHJ1Y3QgdGFnU0hFTExCUk9XU0VSCSpMUFNIRUxMQlJPV1NFUixJU2hlbGxCcm93c2VyOworCit0eXBlZGVmIHN0cnVjdCBJRGF0YU9iamVjdAkJSURhdGFPYmplY3QsCSpMUERBVEFPQkpFQ1Q7CiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgU0hFTEwgSUQKICovCkBAIC0xMTQsMTcgKzExOSwxOCBAQAogICAgU1RETUVUSE9EXyhMUElURU1JRExJU1QsIENyZWF0ZURyaXZlKSAoVEhJU18gTFBDU1RSKTsKICAgIFNURE1FVEhPRF8oTFBJVEVNSURMSVNULCBDcmVhdGVGb2xkZXIpIChUSElTXyBMUENTVFIpOwogICAgU1RETUVUSE9EXyhMUElURU1JRExJU1QsIENyZWF0ZVZhbHVlKSAoVEhJU18gTFBDU1RSKTsKLS8qICAgU1RETUVUSE9EXyh2b2lkLCBEZWxldGUpIChUSElTXyBMUElURU1JRExJU1QpOyovCi0gICBTVERNRVRIT0RfKExQSVRFTUlETElTVCwgR2V0TmV4dEl0ZW0pIChUSElTXyBMUENJVEVNSURMSVNUKTsKKwogICAgU1RETUVUSE9EXyhCT09MMzIsIEdldERlc2t0b3ApIChUSElTXyBMUENJVEVNSURMSVNULCBMUFNUUik7CiAgICBTVERNRVRIT0RfKEJPT0wzMiwgR2V0RHJpdmUpIChUSElTXyBMUENJVEVNSURMSVNULCBMUFNUUiwgVUlOVDE2KTsKICAgIFNURE1FVEhPRF8oTFBJVEVNSURMSVNULCBHZXRMYXN0SXRlbSkgKFRISVNfIExQQ0lURU1JRExJU1QpOwogICAgU1RETUVUSE9EXyhEV09SRCwgR2V0SXRlbVRleHQpIChUSElTXyBMUENJVEVNSURMSVNULCBMUFNUUiwgVUlOVDE2KTsKKwogICAgU1RETUVUSE9EXyhCT09MMzIsIElzRGVza3RvcCkgKFRISVNfIExQQ0lURU1JRExJU1QpOwogICAgU1RETUVUSE9EXyhCT09MMzIsIElzTXlDb21wdXRlcikgKFRISVNfIExQQ0lURU1JRExJU1QpOwogICAgU1RETUVUSE9EXyhCT09MMzIsIElzRHJpdmUpIChUSElTXyBMUENJVEVNSURMSVNUKTsKICAgIFNURE1FVEhPRF8oQk9PTDMyLCBJc0ZvbGRlcikgKFRISVNfIExQQ0lURU1JRExJU1QpOwogICAgU1RETUVUSE9EXyhCT09MMzIsIElzVmFsdWUpIChUSElTXyBMUENJVEVNSURMSVNUKTsKKwogICAgU1RETUVUSE9EXyhCT09MMzIsIEhhc0ZvbGRlcnMpIChUSElTXyBMUFNUUiwgTFBDSVRFTUlETElTVCk7CiAgICBTVERNRVRIT0RfKERXT1JELCBHZXRGb2xkZXJUZXh0KSAoVEhJU18gTFBDSVRFTUlETElTVCwgTFBTVFIsIERXT1JEKTsKICAgIFNURE1FVEhPRF8oRFdPUkQsIEdldFZhbHVlVGV4dCkgKFRISVNfIExQQ0lURU1JRExJU1QsIExQU1RSLCBEV09SRCk7CkBAIC0xNDgsNiArMTU0LDEzNiBAQAogI2VuZGlmCiAKICN1bmRlZiBUSElTCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIElDb250ZXh0TWVudSBpbnRlcmZhY2UKKyAqLworI2RlZmluZSBUSElTIExQQ09OVEVYVE1FTlUgdGhpcworCisvKiBRdWVyeUNvbnRleHRNZW51IHVGbGFncyAqLworI2RlZmluZSBDTUZfTk9STUFMICAgICAgICAgICAgICAweDAwMDAwMDAwCisjZGVmaW5lIENNRl9ERUZBVUxUT05MWSAgICAgICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgQ01GX1ZFUkJTT05MWSAgICAgICAgICAgMHgwMDAwMDAwMgorI2RlZmluZSBDTUZfRVhQTE9SRSAgICAgICAgICAgICAweDAwMDAwMDA0CisjZGVmaW5lIENNRl9OT1ZFUkJTICAgICAgICAgICAgIDB4MDAwMDAwMDgKKyNkZWZpbmUgQ01GX0NBTlJFTkFNRSAgICAgICAgICAgMHgwMDAwMDAxMAorI2RlZmluZSBDTUZfTk9ERUZBVUxUICAgICAgICAgICAweDAwMDAwMDIwCisjZGVmaW5lIENNRl9JTkNMVURFU1RBVElDICAgICAgIDB4MDAwMDAwNDAKKyNkZWZpbmUgQ01GX1JFU0VSVkVEICAgICAgICAgICAgMHhmZmZmMDAwMCAgICAgIC8vIFZpZXcgc3BlY2lmaWMKKworLyogR2V0Q29tbWFuZFN0cmluZyB1RmxhZ3MgKi8KKyNkZWZpbmUgR0NTX1ZFUkJBICAgICAgICAweDAwMDAwMDAwICAgICAvLyBjYW5vbmljYWwgdmVyYgorI2RlZmluZSBHQ1NfSEVMUFRFWFRBICAgIDB4MDAwMDAwMDEgICAgIC8vIGhlbHAgdGV4dCAoZm9yIHN0YXR1cyBiYXIpCisjZGVmaW5lIEdDU19WQUxJREFURUEgICAgMHgwMDAwMDAwMiAgICAgLy8gdmFsaWRhdGUgY29tbWFuZCBleGlzdHMKKyNkZWZpbmUgR0NTX1ZFUkJXICAgICAgICAweDAwMDAwMDA0ICAgICAvLyBjYW5vbmljYWwgdmVyYiAodW5pY29kZSkKKyNkZWZpbmUgR0NTX0hFTFBURVhUVyAgICAweDAwMDAwMDA1ICAgICAvLyBoZWxwIHRleHQgKHVuaWNvZGUgdmVyc2lvbikKKyNkZWZpbmUgR0NTX1ZBTElEQVRFVyAgICAweDAwMDAwMDA2ICAgICAvLyB2YWxpZGF0ZSBjb21tYW5kIGV4aXN0cyAodW5pY29kZSkKKyNkZWZpbmUgR0NTX1VOSUNPREUgICAgICAweDAwMDAwMDA0ICAgICAvLyBmb3IgYml0IHRlc3RpbmcgLSBVbmljb2RlIHN0cmluZworCisjZGVmaW5lIEdDU19WRVJCICAgICAgICBHQ1NfVkVSQkEKKyNkZWZpbmUgR0NTX0hFTFBURVhUICAgIEdDU19IRUxQVEVYVEEKKyNkZWZpbmUgR0NTX1ZBTElEQVRFICAgIEdDU19WQUxJREFURUEKKworI2RlZmluZSBDTURTVFJfTkVXRk9MREVSQSAgICJOZXdGb2xkZXIiCisjZGVmaW5lIENNRFNUUl9WSUVXTElTVEEgICAgIlZpZXdMaXN0IgorI2RlZmluZSBDTURTVFJfVklFV0RFVEFJTFNBICJWaWV3RGV0YWlscyIKKyNkZWZpbmUgQ01EU1RSX05FV0ZPTERFUlcgICBMIk5ld0ZvbGRlciIKKyNkZWZpbmUgQ01EU1RSX1ZJRVdMSVNUVyAgICBMIlZpZXdMaXN0IgorI2RlZmluZSBDTURTVFJfVklFV0RFVEFJTFNXIEwiVmlld0RldGFpbHMiCisKKyNkZWZpbmUgQ01EU1RSX05FV0ZPTERFUiAgICBDTURTVFJfTkVXRk9MREVSQQorI2RlZmluZSBDTURTVFJfVklFV0xJU1QgICAgIENNRFNUUl9WSUVXTElTVEEKKyNkZWZpbmUgQ01EU1RSX1ZJRVdERVRBSUxTICBDTURTVFJfVklFV0RFVEFJTFNBCisKKyNkZWZpbmUgQ01JQ19NQVNLX0hPVEtFWSAgICAgICAgU0VFX01BU0tfSE9US0VZCisjZGVmaW5lIENNSUNfTUFTS19JQ09OICAgICAgICAgIFNFRV9NQVNLX0lDT04KKyNkZWZpbmUgQ01JQ19NQVNLX0ZMQUdfTk9fVUkgICAgU0VFX01BU0tfRkxBR19OT19VSQorI2RlZmluZSBDTUlDX01BU0tfVU5JQ09ERSAgICAgICBTRUVfTUFTS19VTklDT0RFCisjZGVmaW5lIENNSUNfTUFTS19OT19DT05TT0xFICAgIFNFRV9NQVNLX05PX0NPTlNPTEUKKyNkZWZpbmUgQ01JQ19NQVNLX0hBU0xJTktOQU1FICAgU0VFX01BU0tfSEFTTElOS05BTUUKKyNkZWZpbmUgQ01JQ19NQVNLX0ZMQUdfU0VQX1ZETSAgU0VFX01BU0tfRkxBR19TRVBWRE0KKyNkZWZpbmUgQ01JQ19NQVNLX0hBU1RJVExFICAgICAgU0VFX01BU0tfSEFTVElUTEUKKyNkZWZpbmUgQ01JQ19NQVNLX0FTWU5DT0sgICAgICAgU0VFX01BU0tfQVNZTkNPSworCisjZGVmaW5lIENNSUNfTUFTS19QVElOVk9LRSAgICAgIDB4MjAwMDAwMDAKKworLypOT1RFOiBXaGVuIFNFRV9NQVNLX0hNT05JVE9SIGlzIHNldCwgaEljb24gaXMgdHJlYXRlZCBhcyBoTW9uaXRvciAqLwordHlwZWRlZiBzdHJ1Y3QgX0NNSU5WT0tFQ09NTUFORElORk8gCit7ICAgRFdPUkQgY2JTaXplOyAgICAgICAgLy8gc2l6ZW9mKENNSU5WT0tFQ09NTUFORElORk8pCisgICAgRFdPUkQgZk1hc2s7ICAgICAgICAgLy8gYW55IGNvbWJpbmF0aW9uIG9mIENNSUNfTUFTS18qCisgICAgSFdORDMyIGh3bmQ7ICAgICAgICAgLy8gbWlnaHQgYmUgTlVMTCAoaW5kaWNhdGluZyBubyBvd25lciB3aW5kb3cpCisgICAgTFBDU1RSIGxwVmVyYjsgICAgICAgLy8gZWl0aGVyIGEgc3RyaW5nIG9yIE1BS0VJTlRSRVNPVVJDRShpZE9mZnNldCkKKyAgICBMUENTVFIgbHBQYXJhbWV0ZXJzOyAvLyBtaWdodCBiZSBOVUxMIChpbmRpY2F0aW5nIG5vIHBhcmFtZXRlcikKKyAgICBMUENTVFIgbHBEaXJlY3Rvcnk7ICAvLyBtaWdodCBiZSBOVUxMIChpbmRpY2F0aW5nIG5vIHNwZWNpZmljIGRpcmVjdG9yeSkKKyAgICBpbnQgblNob3c7ICAgICAgICAgICAvLyBvbmUgb2YgU1dfIHZhbHVlcyBmb3IgU2hvd1dpbmRvdygpIEFQSQorCisgICAgRFdPUkQgZHdIb3RLZXk7CisgICAgSEFORExFMzIgaEljb247Cit9IENNSU5WT0tFQ09NTUFORElORk8sICAqTFBDTUlOVk9LRUNPTU1BTkRJTkZPOworCit0eXBlZGVmIHN0cnVjdCBfQ01JbnZva2VDb21tYW5kSW5mb0V4IAoreyAgIERXT1JEIGNiU2l6ZTsgICAgICAgIC8vIG11c3QgYmUgc2l6ZW9mKENNSU5WT0tFQ09NTUFORElORk9FWCkKKyAgICBEV09SRCBmTWFzazsgICAgICAgICAvLyBhbnkgY29tYmluYXRpb24gb2YgQ01JQ19NQVNLXyoKKyAgICBIV05EMzIgaHduZDsgICAgICAgICAvLyBtaWdodCBiZSBOVUxMIChpbmRpY2F0aW5nIG5vIG93bmVyIHdpbmRvdykKKyAgICBMUENTVFIgbHBWZXJiOyAgICAgICAvLyBlaXRoZXIgYSBzdHJpbmcgb3IgTUFLRUlOVFJFU09VUkNFKGlkT2Zmc2V0KQorICAgIExQQ1NUUiBscFBhcmFtZXRlcnM7IC8vIG1pZ2h0IGJlIE5VTEwgKGluZGljYXRpbmcgbm8gcGFyYW1ldGVyKQorICAgIExQQ1NUUiBscERpcmVjdG9yeTsgIC8vIG1pZ2h0IGJlIE5VTEwgKGluZGljYXRpbmcgbm8gc3BlY2lmaWMgZGlyZWN0b3J5KQorICAgIGludCBuU2hvdzsgICAgICAgICAgIC8vIG9uZSBvZiBTV18gdmFsdWVzIGZvciBTaG93V2luZG93KCkgQVBJCisKKyAgICBEV09SRCBkd0hvdEtleTsKKyAgICAKKyAgICBIQU5ETEUzMiBoSWNvbjsKKyAgICBMUENTVFIgbHBUaXRsZTsgICAgICAgIC8vIEZvciBDcmVhdGVQcm9jZXNzLVN0YXJ0dXBJbmZvLmxwVGl0bGUKKyAgICBMUENXU1RSIGxwVmVyYlc7ICAgICAgIC8vIFVuaWNvZGUgdmVyYiAoZm9yIHRob3NlIHdobyBjYW4gdXNlIGl0KQorICAgIExQQ1dTVFIgbHBQYXJhbWV0ZXJzVzsgLy8gVW5pY29kZSBwYXJhbWV0ZXJzIChmb3IgdGhvc2Ugd2hvIGNhbiB1c2UgaXQpCisgICAgTFBDV1NUUiBscERpcmVjdG9yeVc7ICAvLyBVbmljb2RlIGRpcmVjdG9yeSAoZm9yIHRob3NlIHdobyBjYW4gdXNlIGl0KQorICAgIExQQ1dTVFIgbHBUaXRsZVc7ICAgICAgLy8gVW5pY29kZSB0aXRsZSAoZm9yIHRob3NlIHdobyBjYW4gdXNlIGl0KQorICAgIFBPSU5UMzIgcHRJbnZva2U7ICAgICAgLy8gUG9pbnQgd2hlcmUgaXQncyBpbnZva2VkCisKK30gQ01JTlZPS0VDT01NQU5ESU5GT0VYLCAgKkxQQ01JTlZPS0VDT01NQU5ESU5GT0VYOworCisKK3R5cGVkZWYgc3RydWN0IElDb250ZXh0TWVudV9WVGFibGUKK3sgICAvLyAqKiogSVVua25vd24gbWV0aG9kcyAqKioKKyAgICBTVERNRVRIT0QoUXVlcnlJbnRlcmZhY2UpIChUSElTXyBSRUZJSUQgcmlpZCwgTFBWT0lEICogcHB2T2JqKSBQVVJFOworICAgIFNURE1FVEhPRF8oVUxPTkcsQWRkUmVmKSAoVEhJUykgIFBVUkU7CisgICAgU1RETUVUSE9EXyhVTE9ORyxSZWxlYXNlKSAoVEhJUykgUFVSRTsKKworICAgIFNURE1FVEhPRChRdWVyeUNvbnRleHRNZW51KShUSElTXyBITUVOVTMyIGhtZW51LFVJTlQzMiBpbmRleE1lbnUsVUlOVDMyIGlkQ21kRmlyc3QsIFVJTlQzMiBpZENtZExhc3QsVUlOVDMyIHVGbGFncykgUFVSRTsKKyAgICBTVERNRVRIT0QoSW52b2tlQ29tbWFuZCkoVEhJU18gTFBDTUlOVk9LRUNPTU1BTkRJTkZPIGxwaWNpKSBQVVJFOworICAgIFNURE1FVEhPRChHZXRDb21tYW5kU3RyaW5nKShUSElTXyBVSU5UMzIgaWRDbWQsVUlOVDMyIHVUeXBlLFVJTlQzMiAqIHB3UmVzZXJ2ZWQsTFBTVFIgcHN6TmFtZSxVSU5UMzIgY2NoTWF4KSBQVVJFOworfSBJQ29udGV4dE1lbnVfVlRhYmxlLCpMUENPTlRFWFRNRU5VX1ZUQUJMRTsKKworc3RydWN0IElDb250ZXh0TWVudQoreyBMUENPTlRFWFRNRU5VX1ZUQUJMRQlscHZ0Ymw7CisgIERXT1JECQkJcmVmOworICBMUFNIRUxMRk9MREVSCXBTRlBhcmVudDsKKyAgTFBJVEVNSURMSVNUCSphUGlkbHM7CisgIExQUElETE1HUgkJcFBpZGxNZ3I7CisgIEJPT0wzMgkJYkFsbFZhbHVlczsKK307CisKKyN1bmRlZiBUSElTCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIElTaGVsbEV4dEluaXQgaW50ZXJmYWNlCisgKi8KKyNkZWZpbmUgVEhJUyBMUFNIRUxMRVhUSU5JVCB0aGlzCisKK3R5cGVkZWYgc3RydWN0IElTaGVsbEV4dEluaXRfVlRhYmxlIAoreyAgIC8vICoqKiBJVW5rbm93biBtZXRob2RzICoqKgorICAgIFNURE1FVEhPRChRdWVyeUludGVyZmFjZSkgKFRISVNfIFJFRklJRCByaWlkLCBMUFZPSUQgKiBwcHZPYmopIFBVUkU7CisgICAgU1RETUVUSE9EXyhVTE9ORyxBZGRSZWYpIChUSElTKSAgUFVSRTsKKyAgICBTVERNRVRIT0RfKFVMT05HLFJlbGVhc2UpIChUSElTKSBQVVJFOworCisgICAgLy8gKioqIElTaGVsbEV4dEluaXQgbWV0aG9kcyAqKioKKyAgICBTVERNRVRIT0QoSW5pdGlhbGl6ZSkoVEhJU18gTFBDSVRFTUlETElTVCBwaWRsRm9sZGVyLCBMUERBVEFPQkpFQ1QgbHBkb2JqLCBIS0VZIGhrZXlQcm9nSUQpIFBVUkU7Cit9IElTaGVsbEV4dEluaXRfVlRhYmxlLCpMUFNIRUxMRVhUSU5JVF9WVEFCTEU7CisKK3N0cnVjdCBJU2hlbGxFeHRJbml0Cit7IExQU0hFTExFWFRJTklUX1ZUQUJMRQlscHZ0Ymw7CisgIERXT1JECQkJIHJlZjsKK307CisKKyN1bmRlZiBUSElTCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogSUVudW1JRExpc3QgaW50ZXJmYWNlCkBAIC0zMTAsMTYgKzQ0NiwyMCBAQAogICAgIFNURE1FVEhPRChHZXRVSU9iamVjdE9mKShUSElTXyBIV05EMzIgaHduZE93bmVyLCBVSU5UMzIgY2lkbCwgTFBDSVRFTUlETElTVCAqIGFwaWRsLFJFRklJRCByaWlkLCBVSU5UMzIgKiBwcmdmSW5PdXQsIExQVk9JRCAqIHBwdk91dCkgUFVSRTsKICAgICBTVERNRVRIT0QoR2V0RGlzcGxheU5hbWVPZikoVEhJU18gTFBDSVRFTUlETElTVCBwaWRsLCBEV09SRCB1RmxhZ3MsIExQU1RSUkVUIGxwTmFtZSkgUFVSRTsKICAgICBTVERNRVRIT0QoU2V0TmFtZU9mKShUSElTXyBIV05EMzIgaHduZE93bmVyLCBMUENJVEVNSURMSVNUIHBpZGwsTFBDT0xFU1RSMzIgbHBzek5hbWUsIERXT1JEIHVGbGFncyxMUElURU1JRExJU1QgKiBwcGlkbE91dCkgUFVSRTsKKworCS8qIHV0aWxpdHkgZnVuY3Rpb25zICovCisgICBTVERNRVRIT0RfKEJPT0wzMixHZXRGb2xkZXJQYXRoKShUSElTXyBMUFNUUiwgRFdPUkQpOworICAgCiB9ICpMUFNIRUxMRk9MREVSX1ZUQUJMRSxJU2hlbGxGb2xkZXJfVlRhYmxlOwogCiBzdHJ1Y3QgdGFnU0hFTExGT0xERVIgewogCUxQU0hFTExGT0xERVJfVlRBQkxFCWxwdnRibDsKLQlEV09SRAkJCSAgIHJlZjsKLQlMUFNUUiAgICAgICAgbWxwc3pGb2xkZXI7Ci0gICAgTFBQSURMTUdSCSAgIHBQaWRsTWdyOwotCUxQSVRFTUlETElTVCBtcGlkbDsKLQlMUElURU1JRExJU1QgbXBpZGxOU1Jvb3Q7Ci0JTFBTSEVMTEZPTERFUiBtcFNGUGFyZW50OworCURXT1JECQkJcmVmOworCUxQU1RSCQkJbWxwc3pGb2xkZXI7CisgICAgTFBQSURMTUdSCQlwUGlkbE1ncjsKKwlMUElURU1JRExJU1QJbXBpZGw7CisJTFBJVEVNSURMSVNUCW1waWRsTlNSb290OworCUxQU0hFTExGT0xERVIJbXBTRlBhcmVudDsKIH07CiAKIGV4dGVybiBMUFNIRUxMRk9MREVSIHBkZXNrdG9wZm9sZGVyOwpAQCAtMzMwLDYgKzQ3MCwxMiBAQAogKi8KICNkZWZpbmUgVEhJUyBMUFNIRUxMQlJPV1NFUiB0aGlzCiAKKyNkZWZpbmUgRkNXX1NUQVRVUyAgICAgIDB4MDAwMQorI2RlZmluZSBGQ1dfVE9PTEJBUiAgICAgMHgwMDAyCisjZGVmaW5lIEZDV19UUkVFICAgICAgICAweDAwMDMKKyNkZWZpbmUgRkNXX0lOVEVSTkVUQkFSIDB4MDAwNgorI2RlZmluZSBGQ1dfUFJPR1JFU1MgICAgMHgwMDA4CisKIHR5cGVkZWYgc3RydWN0IElTaGVsbEJyb3dzZXJfVlRhYmxlIAogeyAgICAvLyAqKiogSVVua25vd24gbWV0aG9kcyAqKioKICAgICBTVERNRVRIT0QoUXVlcnlJbnRlcmZhY2UpIChUSElTXyBSRUZJSUQgcmlpZCwgTFBWT0lEICogcHB2T2JqKSBQVVJFOwpAQCAtMzgzLDYgKzUyOSw0MiBAQAogI2RlZmluZSBTVkdJT19TRUxFQ1RJT04gICAgIDB4MDAwMDAwMDEKICNkZWZpbmUgU1ZHSU9fQUxMVklFVyAgICAgICAweDAwMDAwMDAyCiAKKy8qIFRoZSBleHBsb3JlciBkaXNwYXRjaGVzIFdNX0NPTU1BTkQgbWVzc2FnZXMgYmFzZWQgb24gdGhlIHJhbmdlIG9mCisgY29tbWFuZC9tZW51aXRlbSBJRHMuIEFsbCB0aGUgSURzIG9mIG1lbnVpdGVtcyB0aGF0IHRoZSB2aWV3IChyaWdodAorIHBhbmUpIGluc2VydHMgbXVzdCBiZSBpbiBGQ0lETV9TSFZJRVdGSVJTVC9MQVNUIChvdGhlcndpc2UsIHRoZSBleHBsb3JlcgorIHdvbid0IGRpc3BhdGNoIHRoZW0pLiBUaGUgdmlldyBzaG91bGQgbm90IGRlYWwgd2l0aCBhbnkgbWVudWl0ZW1zCisgaW4gRkNJRE1fQlJPV1NFUkZJUlNUL0xBU1QgKG90aGVyd2lzZSwgaXQgd29uJ3Qgd29yayB3aXRoIHRoZSBmdXR1cmUKKyB2ZXJzaW9uIG9mIHRoZSBzaGVsbCkuCisKKyAgRkNJRE1fU0hWSUVXRklSU1QvTEFTVCAgICAgIGZvciB0aGUgcmlnaHQgcGFuZSAoSVNoZWxsVmlldykKKyAgRkNJRE1fQlJPV1NFUkZJUlNUL0xBU1QgICAgIGZvciB0aGUgZXhwbG9yZXIgZnJhbWUgKElTaGVsbEJyb3dzZXIpCisgIEZDSURNX0dMT0JBTC9MQVNUICAgICAgICAgICBmb3IgdGhlIGV4cGxvcmVyJ3Mgc3VibWVudSBJRHMKKyovCisjZGVmaW5lIEZDSURNX1NIVklFV0ZJUlNUICAgICAgICAgICAweDAwMDAKKyNkZWZpbmUgRkNJRE1fU0hWSUVXTEFTVCAgICAgICAgICAgIDB4N2ZmZgorI2RlZmluZSBGQ0lETV9CUk9XU0VSRklSU1QgICAgICAgICAgMHhhMDAwCisjZGVmaW5lIEZDSURNX0JST1dTRVJMQVNUICAgICAgICAgICAweGJmMDAKKyNkZWZpbmUgRkNJRE1fR0xPQkFMRklSU1QgICAgICAgICAgIDB4ODAwMAorI2RlZmluZSBGQ0lETV9HTE9CQUxMQVNUICAgICAgICAgICAgMHg5ZmZmCisKKy8qCisqIEdsb2JhbCBzdWJtZW51IElEcyBhbmQgc2VwYXJhdG9yIElEcworKi8KKyNkZWZpbmUgRkNJRE1fTUVOVV9GSUxFICAgICAgICAgICAgIChGQ0lETV9HTE9CQUxGSVJTVCsweDAwMDApCisjZGVmaW5lIEZDSURNX01FTlVfRURJVCAgICAgICAgICAgICAoRkNJRE1fR0xPQkFMRklSU1QrMHgwMDQwKQorI2RlZmluZSBGQ0lETV9NRU5VX1ZJRVcgICAgICAgICAgICAgKEZDSURNX0dMT0JBTEZJUlNUKzB4MDA4MCkKKyNkZWZpbmUgRkNJRE1fTUVOVV9WSUVXX1NFUF9PUFRJT05TIChGQ0lETV9HTE9CQUxGSVJTVCsweDAwODEpCisjZGVmaW5lIEZDSURNX01FTlVfVE9PTFMgICAgICAgICAgICAoRkNJRE1fR0xPQkFMRklSU1QrMHgwMGMwKQorI2RlZmluZSBGQ0lETV9NRU5VX1RPT0xTX1NFUF9HT1RPICAgKEZDSURNX0dMT0JBTEZJUlNUKzB4MDBjMSkKKyNkZWZpbmUgRkNJRE1fTUVOVV9IRUxQICAgICAgICAgICAgIChGQ0lETV9HTE9CQUxGSVJTVCsweDAxMDApCisjZGVmaW5lIEZDSURNX01FTlVfRklORCAgICAgICAgICAgICAoRkNJRE1fR0xPQkFMRklSU1QrMHgwMTQwKQorI2RlZmluZSBGQ0lETV9NRU5VX0VYUExPUkUgICAgICAgICAgKEZDSURNX0dMT0JBTEZJUlNUKzB4MDE1MCkKKyNkZWZpbmUgRkNJRE1fTUVOVV9GQVZPUklURVMgICAgICAgIChGQ0lETV9HTE9CQUxGSVJTVCsweDAxNzApCisKKy8qIGNvbnRyb2wgSURzIGtub3duIHRvIHRoZSB2aWV3ICovCisjZGVmaW5lIEZDSURNX1RPT0xCQVIgICAgICAoRkNJRE1fQlJPV1NFUkZJUlNUICsgMCkKKyNkZWZpbmUgRkNJRE1fU1RBVFVTICAgICAgIChGQ0lETV9CUk9XU0VSRklSU1QgKyAxKQorCiAvKiB1U3RhdGUgdmFsdWVzIGZvciBJU2hlbGxWaWV3OjpVSUFjdGl2YXRlICovCiB0eXBlZGVmIGVudW0gCiB7IFNWVUlBX0RFQUNUSVZBVEUgICAgICAgPSAwLApAQCAtNDI0LDggKzYwNiwxMSBAQAogICBMUFNIRUxMRk9MREVSICAgICAgcFNGUGFyZW50OwogICBMUFNIRUxMQlJPV1NFUiAgICAgcFNoZWxsQnJvd3NlcjsKICAgSFdORDMyICAgICAgICAgICAgIGhXbmQ7CisgIEhXTkQzMiAgICAgICAgICAgICBoV25kTGlzdDsKICAgRk9MREVSU0VUVElOR1MgICAgIEZvbGRlclNldHRpbmdzOwogICBIV05EMzIgICAgICAgICAgICAgaFduZFBhcmVudDsKKyAgSE1FTlUzMiAgICAgICAgICAgIGhNZW51OworICBVSU5UMzIJCQkgdVN0YXRlOwogfTsKIAogdHlwZWRlZiBHVUlEIFNIRUxMVklFV0lEOwpAQCAtNDk4LDE5ICs2ODMsMTczIEBACiAKICN1bmRlZiBUSElTCiAKLSNpZmRlZiBfX1dJTkVfXworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIElFeHRyYWN0SWNvbiBpbnRlcmZhY2UKKyAqCisgKiBGSVhNRQorICogIElzIHRoZSBFeHRyYWN0SWNvbkEgaW50ZXJmYWNlCisgKi8KKyNkZWZpbmUgVEhJUyBMUEVYVFJBQ1RJQ09OIHRoaXMKIAorLyogR2V0SWNvbkxvY2F0aW9uKCkgaW5wdXQgZmxhZ3MqLworI2RlZmluZSBHSUxfT1BFTklDT04gICAgIDB4MDAwMSAgICAgIC8vIGFsbG93cyBjb250YWluZXJzIHRvIHNwZWNpZnkgYW4gIm9wZW4iIGxvb2sKKyNkZWZpbmUgR0lMX0ZPUlNIRUxMICAgICAweDAwMDIgICAgICAvLyBpY29uIGlzIHRvIGJlIGRpc3BsYXllZCBpbiBhIFNoZWxsRm9sZGVyCisjZGVmaW5lIEdJTF9BU1lOQyAgICAgICAgMHgwMDIwICAgICAgLy8gdGhpcyBpcyBhbiBhc3luYyBleHRyYWN0LCByZXR1cm4gRV9BU1lOQworCisvKiBHZXRJY29uTG9jYXRpb24oKSByZXR1cm4gZmxhZ3MgKi8KKyNkZWZpbmUgR0lMX1NJTVVMQVRFRE9DICAweDAwMDEgICAgICAvLyBzaW11bGF0ZSB0aGlzIGRvY3VtZW50IGljb24gZm9yIHRoaXMKKyNkZWZpbmUgR0lMX1BFUklOU1RBTkNFICAweDAwMDIgICAgICAvLyBpY29ucyBmcm9tIHRoaXMgY2xhc3MgYXJlIHBlciBpbnN0YW5jZSAoZWFjaCBmaWxlIGhhcyBpdHMgb3duKQorI2RlZmluZSBHSUxfUEVSQ0xBU1MgICAgIDB4MDAwNCAgICAgIC8vIGljb25zIGZyb20gdGhpcyBjbGFzcyBwZXIgY2xhc3MgKHNoYXJlZCBmb3IgYWxsIGZpbGVzIG9mIHRoaXMgdHlwZSkKKyNkZWZpbmUgR0lMX05PVEZJTEVOQU1FICAweDAwMDggICAgICAvLyBsb2NhdGlvbiBpcyBub3QgYSBmaWxlbmFtZSwgbXVzdCBjYWxsIDo6RXh0cmFjdEljb24KKyNkZWZpbmUgR0lMX0RPTlRDQUNIRSAgICAweDAwMTAgICAgICAvLyB0aGlzIGljb24gc2hvdWxkIG5vdCBiZSBjYWNoZWQKKwordHlwZWRlZiBzdHJ1Y3QgSUV4dHJhY3RJY29uIElFeHRyYWN0SWNvbiwqTFBFWFRSQUNUSUNPTjsKK3R5cGVkZWYgc3RydWN0IElFeHRyYWN0SWNvbl9WVGFibGUKK3sgLyoqKiBJVW5rbm93biBtZXRob2RzICoqKi8KKyAgU1RETUVUSE9EKFF1ZXJ5SW50ZXJmYWNlKSAoVEhJU18gUkVGSUlEIHJpaWQsIExQVk9JRCAqIHBwdk9iaikgUFVSRTsKKyAgU1RETUVUSE9EXyhVTE9ORyxBZGRSZWYpIChUSElTKSAgUFVSRTsKKyAgU1RETUVUSE9EXyhVTE9ORyxSZWxlYXNlKSAoVEhJUykgUFVSRTsKKworICAvKioqIElFeHRyYWN0SWNvbiBtZXRob2RzICoqKi8KKyAgU1RETUVUSE9EKEdldEljb25Mb2NhdGlvbikoVEhJU18gVUlOVDMyIHVGbGFncywgTFBTVFIgc3pJY29uRmlsZSwgVUlOVDMyIGNjaE1heCwgaW50ICogcGlJbmRleCwgVUlOVDMyICogcHdGbGFncykgUFVSRTsKKyAgU1RETUVUSE9EKEV4dHJhY3QpKFRISVNfIExQQ1NUUiBwc3pGaWxlLCBVSU5UMzIgbkljb25JbmRleCwgSElDT04zMiAqcGhpY29uTGFyZ2UsIEhJQ09OMzIgKnBoaWNvblNtYWxsLCBVSU5UMzIgbkljb25TaXplKSBQVVJFOworfUlFeHRyYWN0SWNjb25fVlRhYmxlLCpMUEVYVFJBQ1RJQ09OX1ZUQUJMRTsKKworc3RydWN0IElFeHRyYWN0SWNvbiAKK3sgTFBFWFRSQUNUSUNPTl9WVEFCTEUgbHB2dGJsOworICBEV09SRCByZWY7CisgIExQSVRFTUlETElTVCBwaWRsOworfTsKKworI3VuZGVmIFRISVMKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBJU2hlbGxJY29uIGludGVyZmFjZQorICovCisKKyNkZWZpbmUgVEhJUyBMUFNIRUxMSUNPTiB0aGlzCit0eXBlZGVmIHN0cnVjdCBJU2hlbGxJY29uIElTaGVsbEljb24sKkxQU0hFTExJQ09OOwordHlwZWRlZiBzdHJ1Y3QgSVNoZWxsSWNvbl9WVGFibGUKK3sgLyoqKiBJVW5rbm93biBtZXRob2RzICoqKi8KKyAgU1RETUVUSE9EKFF1ZXJ5SW50ZXJmYWNlKSAoVEhJU18gUkVGSUlEIHJpaWQsIExQVk9JRCAqIHBwdk9iaikgUFVSRTsKKyAgU1RETUVUSE9EXyhVTE9ORyxBZGRSZWYpIChUSElTKSAgUFVSRTsKKyAgU1RETUVUSE9EXyhVTE9ORyxSZWxlYXNlKSAoVEhJUykgUFVSRTsKKworICAvKioqIElTaGVsbEljb24gbWV0aG9kcyAqKiovCisgIFNURE1FVEhPRChHZXRJY29uT2YpKFRISVNfIExQQ0lURU1JRExJU1QgcGlkbCwgVUlOVDMyIGZsYWdzLCBMUElOVDMyIGxwSWNvbkluZGV4KSBQVVJFOworfSBJU2hlbGxJY29uX1ZUYWJsZSwqTFBTSEVMTElDT05fVlRBQkxFOworCitzdHJ1Y3QgSVNoZWxsSWNvbgoreyBMUFNIRUxMSUNPTl9WVEFCTEUgbHB2dGJsOworICBEV09SRCByZWY7Cit9OworI3VuZGVmIFRISVMKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ2xhc3MgY29uc3RydWN0b3JzCisgKi8KKyNpZmRlZiBfX1dJTkVfXwogZXh0ZXJuIExQQ0xBU1NGQUNUT1JZIElDbGFzc0ZhY3RvcnlfQ29uc3RydWN0b3IoKTsKK2V4dGVybiBMUENPTlRFWFRNRU5VIElDb250ZXh0TWVudV9Db25zdHJ1Y3RvcihMUFNIRUxMRk9MREVSLCBMUENJVEVNSURMSVNUICosIFVJTlQzMik7CiBleHRlcm4gTFBTSEVMTEZPTERFUiBJU2hlbGxGb2xkZXJfQ29uc3RydWN0b3IoTFBTSEVMTEZPTERFUixMUElURU1JRExJU1QpOwogZXh0ZXJuIExQU0hFTExWSUVXIElTaGVsbFZpZXdfQ29uc3RydWN0b3IoKTsKIGV4dGVybiBMUFNIRUxMTElOSyBJU2hlbGxMaW5rX0NvbnN0cnVjdG9yKCk7CiBleHRlcm4gTFBFTlVNSURMSVNUIElFbnVtSURMaXN0X0NvbnN0cnVjdG9yKExQQ1NUUixEV09SRCxIUkVTVUxUKik7CitleHRlcm4gTFBFWFRSQUNUSUNPTiBJRXh0cmFjdEljb25fQ29uc3RydWN0b3IoTFBJVEVNSURMSVNUKTsKICNlbmRpZgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFNoZWxsIEV4ZWN1dGUgQVBJCisgKi8KKyNkZWZpbmUgU0VfRVJSX0ZORiAgICAgICAgICAgICAgMiAgICAgICAvLyBmaWxlIG5vdCBmb3VuZAorI2RlZmluZSBTRV9FUlJfUE5GICAgICAgICAgICAgICAzICAgICAgIC8vIHBhdGggbm90IGZvdW5kCisjZGVmaW5lIFNFX0VSUl9BQ0NFU1NERU5JRUQgICAgIDUgICAgICAgLy8gYWNjZXNzIGRlbmllZAorI2RlZmluZSBTRV9FUlJfT09NICAgICAgICAgICAgICA4ICAgICAgIC8vIG91dCBvZiBtZW1vcnkKKyNkZWZpbmUgU0VfRVJSX0RMTE5PVEZPVU5EICAgICAgMzIKKyNkZWZpbmUgU0VfRVJSX1NIQVJFICAgICAgICAgICAgICAgICAgICAyNgorI2RlZmluZSBTRV9FUlJfQVNTT0NJTkNPTVBMRVRFICAgICAgICAgIDI3CisjZGVmaW5lIFNFX0VSUl9EREVUSU1FT1VUICAgICAgICAgICAgICAgMjgKKyNkZWZpbmUgU0VfRVJSX0RERUZBSUwgICAgICAgICAgICAgICAgICAyOQorI2RlZmluZSBTRV9FUlJfRERFQlVTWSAgICAgICAgICAgICAgICAgIDMwCisjZGVmaW5lIFNFX0VSUl9OT0FTU09DICAgICAgICAgICAgICAgICAgMzEKKworI2RlZmluZSBTRUVfTUFTS19DTEFTU05BTUUgICAgICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgU0VFX01BU0tfQ0xBU1NLRVkgICAgICAgICAweDAwMDAwMDAzCisjZGVmaW5lIFNFRV9NQVNLX0lETElTVCAgICAgICAgICAgMHgwMDAwMDAwNAorI2RlZmluZSBTRUVfTUFTS19JTlZPS0VJRExJU1QgICAgIDB4MDAwMDAwMGMKKyNkZWZpbmUgU0VFX01BU0tfSUNPTiAgICAgICAgICAgICAweDAwMDAwMDEwCisjZGVmaW5lIFNFRV9NQVNLX0hPVEtFWSAgICAgICAgICAgMHgwMDAwMDAyMAorI2RlZmluZSBTRUVfTUFTS19OT0NMT1NFUFJPQ0VTUyAgIDB4MDAwMDAwNDAKKyNkZWZpbmUgU0VFX01BU0tfQ09OTkVDVE5FVERSViAgICAweDAwMDAwMDgwCisjZGVmaW5lIFNFRV9NQVNLX0ZMQUdfRERFV0FJVCAgICAgMHgwMDAwMDEwMAorI2RlZmluZSBTRUVfTUFTS19ET0VOVlNVQlNUICAgICAgIDB4MDAwMDAyMDAKKyNkZWZpbmUgU0VFX01BU0tfRkxBR19OT19VSSAgICAgICAweDAwMDAwNDAwCisjZGVmaW5lIFNFRV9NQVNLX1VOSUNPREUgICAgICAgICAgMHgwMDAwNDAwMAorI2RlZmluZSBTRUVfTUFTS19OT19DT05TT0xFICAgICAgIDB4MDAwMDgwMDAKKyNkZWZpbmUgU0VFX01BU0tfQVNZTkNPSyAgICAgICAgICAweDAwMTAwMDAwCisjZGVmaW5lIFNFRV9NQVNLX0hNT05JVE9SICAgICAgICAgMHgwMDIwMDAwMAorCit0eXBlZGVmIHN0cnVjdCBfU0hFTExFWEVDVVRFSU5GT0EKK3sgICAgICAgRFdPUkQgY2JTaXplOworICAgICAgICBVTE9ORyBmTWFzazsKKyAgICAgICAgSFdORDMyIGh3bmQ7CisgICAgICAgIExQQ1NUUiAgIGxwVmVyYjsKKyAgICAgICAgTFBDU1RSICAgbHBGaWxlOworICAgICAgICBMUENTVFIgICBscFBhcmFtZXRlcnM7CisgICAgICAgIExQQ1NUUiAgIGxwRGlyZWN0b3J5OworICAgICAgICBpbnQgblNob3c7CisgICAgICAgIEhJTlNUQU5DRTMyIGhJbnN0QXBwOworICAgICAgICAvKiBPcHRpb25hbCBmaWVsZHMgKi8KKyAgICAgICAgTFBWT0lEIGxwSURMaXN0OworICAgICAgICBMUENTVFIgICBscENsYXNzOworICAgICAgICBIS0VZIGhrZXlDbGFzczsKKyAgICAgICAgRFdPUkQgZHdIb3RLZXk7CisgICAgICAgIHVuaW9uIAorICAgICAgICB7IEhBTkRMRTMyIGhJY29uOworICAgICAgICAgIEhBTkRMRTMyIGhNb25pdG9yOworICAgICAgICB9IHU7CisgICAgICAgIEhBTkRMRTMyIGhQcm9jZXNzOworfSBTSEVMTEVYRUNVVEVJTkZPQSwgKkxQU0hFTExFWEVDVVRFSU5GT0E7CisKK3R5cGVkZWYgc3RydWN0IF9TSEVMTEVYRUNVVEVJTkZPVworeyAgICAgICBEV09SRCBjYlNpemU7CisgICAgICAgIFVMT05HIGZNYXNrOworICAgICAgICBIV05EMzIgaHduZDsKKyAgICAgICAgTFBDV1NUUiAgbHBWZXJiOworICAgICAgICBMUENXU1RSICBscEZpbGU7CisgICAgICAgIExQQ1dTVFIgIGxwUGFyYW1ldGVyczsKKyAgICAgICAgTFBDV1NUUiAgbHBEaXJlY3Rvcnk7CisgICAgICAgIGludCBuU2hvdzsKKyAgICAgICAgSElOU1RBTkNFMzIgaEluc3RBcHA7CisgICAgICAgIC8qIE9wdGlvbmFsIGZpZWxkcyovCisgICAgICAgIExQVk9JRCBscElETGlzdDsKKyAgICAgICAgTFBDV1NUUiAgbHBDbGFzczsKKyAgICAgICAgSEtFWSBoa2V5Q2xhc3M7CisgICAgICAgIERXT1JEIGR3SG90S2V5OworICAgICAgICB1bmlvbgorICAgICAgICB7IEhBTkRMRTMyIGhJY29uOworICAgICAgICAgIEhBTkRMRTMyIGhNb25pdG9yOworICAgICAgICB9IHU7CisgICAgICAgIEhBTkRMRTMyIGhQcm9jZXNzOworfSBTSEVMTEVYRUNVVEVJTkZPVywgKkxQU0hFTExFWEVDVVRFSU5GT1c7CisKK0RFQ0xfV0lORUxJQl9UWVBFX0FXKFNIRUxMRVhFQ1VURUlORk8pCisKK3R5cGVkZWYgU0hFTExFWEVDVVRFSU5GT0EgU0hFTExFWEVDVVRFSU5GTzsKK3R5cGVkZWYgTFBTSEVMTEVYRUNVVEVJTkZPQSBMUFNIRUxMRVhFQ1VURUlORk87CisKK0JPT0wzMiBXSU5BUEkgU2hlbGxFeGVjdXRlRXgzMkEoTFBTSEVMTEVYRUNVVEVJTkZPQSBscEV4ZWNJbmZvKTsKK0JPT0wzMiBXSU5BUEkgU2hlbGxFeGVjdXRlRXgzMlcoTFBTSEVMTEVYRUNVVEVJTkZPVyBscEV4ZWNJbmZvKTsKKyNkZWZpbmUgU2hlbGxFeGVjdXRlRXggIFdJTkVMSUJfTkFNRV9BVyhTaGVsbEV4ZWN1dGVFeCkKKwordm9pZCBXSU5BUEkgV2luRXhlY0Vycm9yQShIV05EMzIgaHduZCwgaW50IGVycm9yLCBMUENTVFIgbHBzdHJGaWxlTmFtZSwgTFBDU1RSIGxwc3RyVGl0bGUpOwordm9pZCBXSU5BUEkgV2luRXhlY0Vycm9yVyhIV05EMzIgaHduZCwgaW50IGVycm9yLCBMUENXU1RSIGxwc3RyRmlsZU5hbWUsIExQQ1dTVFIgbHBzdHJUaXRsZSk7CisjZGVmaW5lIFdpbkV4ZWNFcnJvciAgV0lORUxJQl9OQU1FX0FXKFdpbkV4ZWNFcnJvcikKKworCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBTSEJyb3dzZUZvckZvbGRlciBBUEkKICAqLwotCiB0eXBlZGVmIGludCAoQ0FMTEJBQ0sqIEJGRkNBTExCQUNLKShIV05EMzIgaHduZCwgVUlOVDMyIHVNc2csIExQQVJBTSBsUGFyYW0sIExQQVJBTSBscERhdGEpOwogCiB0eXBlZGVmIHN0cnVjdCB0YWdCUk9XU0VJTkZPMzJBIHsKQEAgLTU4NSw4ICs5MjQsOSBAQAogI2RlZmluZSAgU0hCcm93c2VGb3JGb2xkZXIgV0lORUxJQl9OQU1FX0FXKFNIQnJvd3NlRm9yRm9sZGVyKQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogc2hsdmlldyBzdHJ1Y3R1cmVzCi0gKi8KKyogc2hsdmlldyBzdHJ1Y3R1cmVzCisqLworCiAvKgogKiBJU2hlbGxGb2xkZXJWaWV3Q2FsbGJhY2sgQ2FsbGJhY2sKICogIFRoaXMgImNhbGxiYWNrIiBpcyBjYWxsZWQgYnkgdGhlIHNoZWxscyBkZWZhdWx0IElTaGVsbFZpZXcgaW1wbGVtZW50YXRpb24gKHRoYXQKQEAgLTYxOSw2ICs5NTksMjkgQEAKICAgRFdPUkQgICAgICAgICAgIHZpZXdtb2RlOyAgLy8gTkZfKiBlbnVtCiB9IFNIRUxMVklFV0RBVEEsICogTFBTSEVMTFZJRVdEQVRBOwogCisvKgorIFRoZSBzaGVsbCBrZWVwcyB0cmFjayBvZiBzb21lIHBlci11c2VyIHN0YXRlIHRvIGhhbmRsZSBkaXNwbGF5Cisgb3B0aW9ucyB0aGF0IGlzIG9mIG1ham9yIGludGVyZXN0IHRvIElTVnMuCisgVGhlIGtleSBvbmUgcmVxdWVzdGVkIHJpZ2h0IG5vdyBpcyAiRG91YmxlQ2xpY2tJbldlYlZpZXciLgorKi8KK3R5cGVkZWYgc3RydWN0IAoreyAgIEJPT0wzMiBmU2hvd0FsbE9iamVjdHMgOiAxOworICAgIEJPT0wzMiBmU2hvd0V4dGVuc2lvbnMgOiAxOworICAgIEJPT0wzMiBmTm9Db25maXJtUmVjeWNsZSA6IDE7CisgICAgQk9PTDMyIGZTaG93U3lzRmlsZXMgOiAxOworICAgIEJPT0wzMiBmU2hvd0NvbXBDb2xvciA6IDE7CisgICAgQk9PTDMyIGZEb3VibGVDbGlja0luV2ViVmlldyA6IDE7CisgICAgQk9PTDMyIGZEZXNrdG9wSFRNTCA6IDE7CisgICAgQk9PTDMyIGZXaW45NUNsYXNzaWMgOiAxOworICAgIEJPT0wzMiBmRG9udFByZXR0eVBhdGggOiAxOworICAgIEJPT0wzMiBmU2hvd0F0dHJpYkNvbCA6IDE7CisgICAgQk9PTDMyIGZNYXBOZXREcnZCdG4gOiAxOworICAgIEJPT0wzMiBmU2hvd0luZm9UaXAgOiAxOworICAgIEJPT0wzMiBmSGlkZUljb25zIDogMTsKKyAgICBVSU5UMzIgZlJlc3RGbGFncyA6IDM7Cit9IFNIRUxMRkxBR1NUQVRFLCAqIExQU0hFTExGTEFHU1RBVEU7CisKKwogI3VuZGVmIFBVUkUKICN1bmRlZiBGQVIKICN1bmRlZiBUSElTCmRpZmYgLS1naXQgYS9pbmNsdWRlL3NpZ19jb250ZXh0LmggYi9pbmNsdWRlL3NpZ19jb250ZXh0LmgKaW5kZXggNTk1ZDkxYy4uMzE1NTY0ZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9zaWdfY29udGV4dC5oCisrKyBiL2luY2x1ZGUvc2lnX2NvbnRleHQuaApAQCAtMjE3LDEwICsyMTcsMTAgQEAKICNkZWZpbmUgRkxfc2lnKGNvbnRleHQpICAgICAgKCooV09SRCopJkVGTF9zaWcoY29udGV4dCkpCiAKICNpZmRlZiBGU19zaWcKLWV4dGVybiBXT1JEIENBTExUTzE2X0N1cnJlbnRfZnM7CisjaW5jbHVkZSAic3lzbGV2ZWwuaCIKICNkZWZpbmUgSEFORExFUl9JTklUKCkgXAogICAgIFNFVF9GUyhJU19TRUxFQ1RPUl9TWVNURU0oQ1Nfc2lnKEhBTkRMRVJfQ09OVEVYVCkpID8gXAotICAgICAgICAgICBGU19zaWcoSEFORExFUl9DT05URVhUKSA6IENBTExUTzE2X0N1cnJlbnRfZnMpCisgICAgICAgICAgIEZTX3NpZyhIQU5ETEVSX0NPTlRFWFQpIDogU1lTTEVWRUxfV2luMTZDdXJyZW50VGViKQogI2Vsc2UKICNkZWZpbmUgSEFORExFUl9JTklUKCkgLyogbm90aGluZyAqLwogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL3N5c2xldmVsLmggYi9pbmNsdWRlL3N5c2xldmVsLmgKaW5kZXggNTZhYzg0Ni4uZTE1MTA3NSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9zeXNsZXZlbC5oCisrKyBiL2luY2x1ZGUvc3lzbGV2ZWwuaApAQCAtMTAsNiArMTAsOCBAQAogI2luY2x1ZGUgIndpbnR5cGVzLmgiCiAjaW5jbHVkZSAid2luYmFzZS5oIgogCitleHRlcm4gV09SRCBTWVNMRVZFTF9XaW4xNkN1cnJlbnRUZWI7CisKIHZvaWQgU1lTTEVWRUxfSW5pdCh2b2lkKTsKIFZPSUQgU1lTTEVWRUxfRW50ZXJXaW4xNkxvY2soVk9JRCk7CiBWT0lEIFNZU0xFVkVMX0xlYXZlV2luMTZMb2NrKFZPSUQpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS90YXNrLmggYi9pbmNsdWRlL3Rhc2suaAppbmRleCA4NWYzOGNiLi5iZGUwMzUxIDEwMDY0NAotLS0gYS9pbmNsdWRlL3Rhc2suaAorKysgYi9pbmNsdWRlL3Rhc2suaApAQCAtMTQ3LDYgKzE0Nyw3IEBACiBleHRlcm4gSFRBU0sxNiBUQVNLX0NyZWF0ZSggc3RydWN0IF9USERCICp0aGRiLCBzdHJ1Y3QgX05FX01PRFVMRSAqcE1vZHVsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBISU5TVEFOQ0UxNiBoSW5zdGFuY2UsIEhJTlNUQU5DRTE2IGhQcmV2SW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVDE2IGNtZFNob3cgKTsKK2V4dGVybiB2b2lkIFRBU0tfU3RhcnRUYXNrKCBIVEFTSzE2IGhUYXNrICk7CiBleHRlcm4gdm9pZCBUQVNLX0tpbGxDdXJyZW50VGFzayggSU5UMTYgZXhpdENvZGUgKTsKIGV4dGVybiBIVEFTSzE2IFRBU0tfR2V0TmV4dFRhc2soIEhUQVNLMTYgaFRhc2sgKTsKIGV4dGVybiB2b2lkIFRBU0tfUmVzY2hlZHVsZSh2b2lkKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvdGhyZWFkLmggYi9pbmNsdWRlL3RocmVhZC5oCmluZGV4IGUwMzNiMjkuLjU4YWQ4OWEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvdGhyZWFkLmgKKysrIGIvaW5jbHVkZS90aHJlYWQuaApAQCAtNDQsNiArNDQsNyBAQAogICAgIEJPT0wzMiAgICAgICAgd2FpdF9hbGw7ICAvKiBXYWl0IGZvciBhbGwgb2JqZWN0cyBmbGFnICovCiAgICAgQk9PTDMyICAgICAgICB3YWl0X21zZzsgIC8qIFdhaXQgZm9yIG1lc3NhZ2UgZmxhZyAqLwogICAgIEszMk9CSiAgICAgICAqb2Jqc1tNQVhJTVVNX1dBSVRfT0JKRUNUU107ICAvKiBPYmplY3QgcG9pbnRlcnMgKi8KKyAgICBpbnQgICAgICAgICAgIHNlcnZlcltNQVhJTVVNX1dBSVRfT0JKRUNUU107ICAvKiBTZXJ2ZXIgaGFuZGxlcyAqLwogfSBXQUlUX1NUUlVDVDsKIAogLyogVGhyZWFkIGRhdGFiYXNlICovCkBAIC0xMjgsNiArMTI5LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKnNlcnZlcl90aGFuZGxlLCBpbnQgKnNlcnZlcl9waGFuZGxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQVEhSRUFEX1NUQVJUX1JPVVRJTkUgc3RhcnRfYWRkciwgTFBWT0lEIHBhcmFtICk7CiBleHRlcm4gVEhEQiAqVEhSRUFEX0N1cnJlbnQodm9pZCk7CitleHRlcm4gQk9PTDMyIFRIUkVBRF9Jc1dpbjE2KCBUSERCICp0aGRiICk7CiBleHRlcm4gdm9pZCBUSFJFQURfU3RhcnQoIFRIREIgKnRoZGIgKTsKIGV4dGVybiBUSERCICpUSFJFQURfR2V0UHRyKCBIQU5ETEUzMiBoYW5kbGUsIERXT1JEIGFjY2VzcywgaW50ICpzZXJ2ZXJfaGFuZGxlICk7CiBleHRlcm4gdm9pZCBUSFJFQURfQWRkUXVldWUoIFRIUkVBRF9RVUVVRSAqcXVldWUsIFRIREIgKnRocmVhZCApOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS90b29sYmFyLmggYi9pbmNsdWRlL3Rvb2xiYXIuaAppbmRleCBmYzA1NzM5Li40YWY5Zjk4IDEwMDY0NAotLS0gYS9pbmNsdWRlL3Rvb2xiYXIuaAorKysgYi9pbmNsdWRlL3Rvb2xiYXIuaApAQCAtMzIsMTcgKzMyLDE4IEBACiAgICAgSU5UMzIgICAgICBuQml0bWFwSGVpZ2h0OwogICAgIElOVDMyICAgICAgbkJpdG1hcFdpZHRoOwogICAgIElOVDMyICAgICAgbkluZGVudDsKLSAgICBJTlQzMiAgICAgIG5NYXhSb3dzOyAgICAgICAgLyogbWF4aW11bSBudW1iZXIgb2Ygcm93cyAqLwotCisgICAgSU5UMzIgICAgICBuTWF4Um93czsgICAgICAgIC8qIG1heGltdW0gbnVtYmVyIG9mIGJ1dHRvbiByb3dzICovCisgICAgSU5UMzIgICAgICBuTWF4VGV4dFJvd3M7ICAgIC8qIG1heGltdW0gbnVtYmVyIG9mIHRleHQgcm93cyAqLworICAgIElOVDMyICAgICAgY3hNaW47ICAgICAgICAgICAvKiBtaW5pbXVtIGJ1dHRvbiB3aWR0aCAqLworICAgIElOVDMyICAgICAgY3hNYXg7ICAgICAgICAgICAvKiBtYXhpbXVtIGJ1dHRvbiB3aWR0aCAqLwogICAgIElOVDMyICAgICAgbk51bUJ1dHRvbnM7ICAgICAvKiBudW1iZXIgb2YgYnV0dG9ucyAqLwogICAgIElOVDMyICAgICAgbk51bUJpdG1hcHM7ICAgICAvKiBudW1iZXIgb2YgYml0bWFwcyAqLwogICAgIElOVDMyICAgICAgbk51bVN0cmluZ3M7ICAgICAvKiBudW1iZXIgb2Ygc3RyaW5ncyAqLwotCi0gICAgQk9PTDMyICAgICBiQ2FwdHVyZWQ7CisgICAgQk9PTDMyICAgICBiVW5pY29kZTsgICAgICAgIC8qIEFTQ0lJIChGQUxTRSkgb3IgVW5pY29kZSAoVFJVRSk/ICovCisgICAgQk9PTDMyICAgICBiQ2FwdHVyZWQ7ICAgICAgIC8qIG1vdXNlIGNhcHR1cmVkPyAqLwogICAgIElOVDMyICAgICAgbkJ1dHRvbkRvd247CiAgICAgSU5UMzIgICAgICBuT2xkSGl0OwogICAgIElOVDMyICAgICAgbkhvdEl0ZW07ICAgICAgICAvKiBpbmRleCBvZiB0aGUgImhvdCIgaXRlbSAqLwotCiAgICAgSEZPTlQzMiAgICBoRm9udDsgICAgICAgICAgIC8qIHRleHQgZm9udCAqLwogICAgIEhJTUFHRUxJU1QgaGltbERlZjsgICAgICAgICAvKiBkZWZhdWx0IGltYWdlIGxpc3QgKi8KICAgICBISU1BR0VMSVNUIGhpbWxIb3Q7ICAgICAgICAgLyogaG90IGltYWdlIGxpc3QgKi8KQEAgLTUwLDEyICs1MSwxMyBAQAogICAgIEhXTkQzMiAgICAgaHduZFRvb2xUaXA7ICAgICAvKiBoYW5kbGUgdG8gdG9vbCB0aXAgY29udHJvbCAqLwogICAgIEhXTkQzMiAgICAgaHduZE5vdGlmeTsgICAgICAvKiBoYW5kbGUgdG8gdGhlIHdpbmRvdyB0aGF0IGdldHMgbm90aWZpY2F0aW9ucyAqLwogICAgIEJPT0wzMiAgICAgYlRyYW5zcGFyZW50OyAgICAvKiBiYWNrZ3JvdW5kIHRyYW5zcGFyZW5jeSBmbGFnICovCi0gICAgQk9PTDMyICAgICBiQXV0b1NpemU7CisgICAgQk9PTDMyICAgICBiQXV0b1NpemU7ICAgICAgIC8qIGF1dG8gc2l6ZSBkZWFkbG9jayBpbmRpY2F0b3IgKi8KICAgICBEV09SRCAgICAgIGR3RXhTdHlsZTsgICAgICAgLyogZXh0ZW5kZWQgdG9vbGJhciBzdHlsZSAqLworICAgIFNJWkUzMiAgICAgbWF4U2l6ZTsgICAgICAgICAvKiBtYXhpbXVtIHRvb2xiYXIgc2l6ZSAqLwogCiAgICAgQ09MT1JSRUYgICBjbHJJbnNlcnRNYXJrOyAgIC8qIGluc2VydCBtYXJrIGNvbG9yICovCiAKLSAgICBUQlVUVE9OX0lORk8gKmJ1dHRvbnM7CisgICAgVEJVVFRPTl9JTkZPICpidXR0b25zOyAgICAgIC8qIHBvaW50ZXIgdG8gYnV0dG9uIGFycmF5ICovCiAgICAgQ0hBUiAgICAgICAgICoqc3RyaW5nczsKIH0gVE9PTEJBUl9JTkZPOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL3Rvb2x0aXBzLmggYi9pbmNsdWRlL3Rvb2x0aXBzLmgKaW5kZXggYjQ4NzVjMC4uMjc1MGNiNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS90b29sdGlwcy5oCisrKyBiL2luY2x1ZGUvdG9vbHRpcHMuaApAQCAtOCw2ICs4LDE0IEBACiAjZGVmaW5lIF9fV0lORV9UT09MVElQU19ICiAKIAordHlwZWRlZiBzdHJ1Y3QgdGFnVFRfU1VCQ0xBU1NfSU5GTworeworICAgIFdORFBST0MzMiB3cE9yaWdQcm9jOworICAgIEhXTkQzMiAgICBod25kVG9vbFRpcDsKKyAgICBVSU5UMzIgICAgdVJlZkNvdW50OworfSBUVF9TVUJDTEFTU19JTkZPLCAqTFBUVF9TVUJDTEFTU19JTkZPOworCisKIHR5cGVkZWYgc3RydWN0IHRhZ1RUVE9PTF9JTkZPCiB7CiAgICAgVUlOVDMyIHVGbGFnczsKQEAgLTE3LDggKzI1LDYgQEAKICAgICBISU5TVEFOQ0UzMiBoaW5zdDsKICAgICBMUFNUUiAgbHBzelRleHQ7CiAgICAgTFBBUkFNIGxQYXJhbTsKLQotICAgIFdORFBST0MzMiBscGZuT3JpZ1Byb2M7CiB9IFRUVE9PTF9JTkZPOyAKIAogCmRpZmYgLS1naXQgYS9pbmNsdWRlL3R3ZWFrLmggYi9pbmNsdWRlL3R3ZWFrLmgKaW5kZXggMzQ2ZjZhMC4uMDZiZmZlZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS90d2Vhay5oCisrKyBiL2luY2x1ZGUvdHdlYWsuaApAQCAtMTEsOCArMTEsOCBAQAogCiAjaW5jbHVkZSAid2ludHlwZXMuaCIKIAotaW50ICBUV0VBS19Jbml0KCk7Ci1pbnQgIFRXRUFLX0NoZWNrQ29uZmlndXJhdGlvbigpOworaW50ICBUV0VBS19Jbml0KHZvaWQpOworaW50ICBUV0VBS19DaGVja0NvbmZpZ3VyYXRpb24odm9pZCk7CiB2b2lkICBUV0VBS19EcmF3UmVsaWVmUmVjdDk1KEhEQzMyLCBSRUNUMzIgY29uc3QgKik7CiB2b2lkICBUV0VBS19EcmF3UmV2UmVsaWVmUmVjdDk1KEhEQzMyLCBSRUNUMzIgY29uc3QgKik7CiB2b2lkICBUV0VBS19EcmF3TWVudVNlcGFyYXRvckhvcml6OTUoSERDMzIsIFVJTlQzMiwgVUlOVDMyLCBVSU5UMzIpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS92ZXJzaW9uLmggYi9pbmNsdWRlL3ZlcnNpb24uaAppbmRleCAyMzExYzAxLi5hNmNhMTIwIDEwMDY0NAotLS0gYS9pbmNsdWRlL3ZlcnNpb24uaAorKysgYi9pbmNsdWRlL3ZlcnNpb24uaApAQCAtMSArMSBAQAotI2RlZmluZSBXSU5FX1JFTEVBU0VfSU5GTyAiV2luZSByZWxlYXNlIDk4MDgwOSIKKyNkZWZpbmUgV0lORV9SRUxFQVNFX0lORk8gIldpbmUgcmVsZWFzZSA5ODA4MjIiCmRpZmYgLS1naXQgYS9pbmNsdWRlL3dpbmJhc2UuaCBiL2luY2x1ZGUvd2luYmFzZS5oCmluZGV4IGI0Y2MyMzYuLjE2OTM4ZjIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvd2luYmFzZS5oCisrKyBiL2luY2x1ZGUvd2luYmFzZS5oCkBAIC03LDYgKzcsNyBAQAogI2RlZmluZSBXQUlUX09CSkVDVF8wCQkwCiAjZGVmaW5lIFdBSVRfQUJBTkRPTkVECQlTVEFUVVNfQUJBTkRPTkVEX1dBSVRfMAogI2RlZmluZSBXQUlUX0FCQU5ET05FRF8wCVNUQVRVU19BQkFORE9ORURfV0FJVF8wCisjZGVmaW5lIFdBSVRfSU9fQ09NUExFVElPTglTVEFUVVNfVVNFUl9BUEMKICNkZWZpbmUgV0FJVF9USU1FT1VUCQlTVEFUVVNfVElNRU9VVAogCiAjZGVmaW5lCVBBR0VfTk9BQ0NFU1MJCTB4MDEKQEAgLTE4OSw2ICsxOTAsNyBAQAogdm9pZCAgICAgIFdJTkFQSSBMZWF2ZUNyaXRpY2FsU2VjdGlvbihDUklUSUNBTF9TRUNUSU9OICpscENyaXQpOwogSEFORExFMzIgIFdJTkFQSSBPcGVuUHJvY2VzcyhEV09SRCBhY2Nlc3MsIEJPT0wzMiBpbmhlcml0LCBEV09SRCBpZCk7CiB2b2lkICAgICAgV0lOQVBJIFJhaXNlRXhjZXB0aW9uKERXT1JELERXT1JELERXT1JELGNvbnN0IExQRFdPUkQpOwotaW50ICAgICAgIFdJTkFQSSBUZXJtaW5hdGVQcm9jZXNzKEhBTkRMRTMyIGgsIGludCByZXQpOworQk9PTDMyICAgIFdJTkFQSSBUZXJtaW5hdGVQcm9jZXNzKEhBTkRMRTMyLERXT1JEKTsKK0JPT0wzMiAgICBXSU5BUEkgVGVybWluYXRlVGhyZWFkKEhBTkRMRTMyLERXT1JEKTsKIAogI2VuZGlmICAvKiBfX1dJTkVfV0lOQkFTRV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3dpbmRvd3MuaCBiL2luY2x1ZGUvd2luZG93cy5oCmluZGV4IGE5NGM4MTkuLmU1YzlmNzQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvd2luZG93cy5oCisrKyBiL2luY2x1ZGUvd2luZG93cy5oCkBAIC0xMDczLDYgKzEwNzMsMTAgQEAKICNkZWZpbmUgQ1RMQ09MT1JfU0NST0xMQkFSICAgICAgICAgIDUKICNkZWZpbmUgQ1RMQ09MT1JfU1RBVElDICAgICAgICAgICAgIDYKIAorI2RlZmluZSBJQ01fT0ZGICAgMQorI2RlZmluZSBJQ01fT04gICAgMgorI2RlZmluZSBJQ01fUVVFUlkgMworCiAgIC8qIEJpdG1hcHMgKi8KIAogdHlwZWRlZiBzdHJ1Y3QKQEAgLTIxNjUsNiArMjE2OSw3IEBACiAgICAgQllURSAgIHBhZDA7CiAgICAgV09SRCAgIGtleTsKICAgICBXT1JEICAgY21kOworICAgIFdPUkQgICBwYWQxOwogfSBBQ0NFTDMyLCAqTFBBQ0NFTDMyOwogCiBERUNMX1dJTkVMSUJfVFlQRShBQ0NFTCkKQEAgLTMxNzgsNiArMzE4Myw3IEBACiAjZGVmaW5lIFdNX01ESUNBU0NBREUJICAgIDB4MDIyNwogI2RlZmluZSBXTV9NRElJQ09OQVJSQU5HRSAgIDB4MDIyOAogI2RlZmluZSBXTV9NRElHRVRBQ1RJVkUgICAgIDB4MDIyOQorI2RlZmluZSBXTV9NRElSRUZSRVNITUVOVSAgIDB4MDIzNAogCiAgIC8qIEQmRCBtZXNzYWdlcyAqLwogI2RlZmluZSBXTV9EUk9QT0JKRUNUCSAgICAweDAyMkEKQEAgLTUyODIsNiArNTI4OCwyNyBAQAogI2RlZmluZSBUSU1FX1pPTkVfSURfU1RBTkRBUkQgICAxCiAjZGVmaW5lIFRJTUVfWk9ORV9JRF9EQVlMSUdIVCAgIDIKIAorLyogQ3JlYXRlUHJvY2VzczogZHdDcmVhdGlvbkZsYWcgdmFsdWVzCisgKi8KKyNkZWZpbmUgREVCVUdfUFJPQ0VTUyAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgREVCVUdfT05MWV9USElTX1BST0NFU1MgICAgIDB4MDAwMDAwMDIKKyNkZWZpbmUgQ1JFQVRFX1NVU1BFTkRFRCAgICAgICAgICAgIDB4MDAwMDAwMDQKKyNkZWZpbmUgREVUQUNIRURfUFJPQ0VTUyAgICAgICAgICAgIDB4MDAwMDAwMDgKKyNkZWZpbmUgQ1JFQVRFX05FV19DT05TT0xFICAgICAgICAgIDB4MDAwMDAwMTAKKyNkZWZpbmUgTk9STUFMX1BSSU9SSVRZX0NMQVNTICAgICAgIDB4MDAwMDAwMjAKKyNkZWZpbmUgSURMRV9QUklPUklUWV9DTEFTUyAgICAgICAgIDB4MDAwMDAwNDAKKyNkZWZpbmUgSElHSF9QUklPUklUWV9DTEFTUyAgICAgICAgIDB4MDAwMDAwODAKKyNkZWZpbmUgUkVBTFRJTUVfUFJJT1JJVFlfQ0xBU1MgICAgIDB4MDAwMDAxMDAKKyNkZWZpbmUgQ1JFQVRFX05FV19QUk9DRVNTX0dST1VQICAgIDB4MDAwMDAyMDAKKyNkZWZpbmUgQ1JFQVRFX1VOSUNPREVfRU5WSVJPTk1FTlQgIDB4MDAwMDA0MDAKKyNkZWZpbmUgQ1JFQVRFX1NFUEFSQVRFX1dPV19WRE0gICAgIDB4MDAwMDA4MDAKKyNkZWZpbmUgQ1JFQVRFX1NIQVJFRF9XT1dfVkRNICAgICAgIDB4MDAwMDEwMDAKKyNkZWZpbmUgQ1JFQVRFX0RFRkFVTFRfRVJST1JfTU9ERSAgIDB4MDQwMDAwMDAKKyNkZWZpbmUgQ1JFQVRFX05PX1dJTkRPVyAgICAgICAgICAgIDB4MDgwMDAwMDAKKyNkZWZpbmUgUFJPRklMRV9VU0VSICAgICAgICAgICAgICAgIDB4MTAwMDAwMDAKKyNkZWZpbmUgUFJPRklMRV9LRVJORUwgICAgICAgICAgICAgIDB4MjAwMDAwMDAKKyNkZWZpbmUgUFJPRklMRV9TRVJWRVIgICAgICAgICAgICAgIDB4NDAwMDAwMDAKKwogCiAvKiBGaWxlIG9iamVjdCB0eXBlIGRlZmluaXRpb25zCiAgKi8KQEAgLTYzMTIsNiArNjMzOSw3IEBACiBVSU5UMTYgICAgICBXSU5BUEkgR2V0Q29tbUV2ZW50TWFzayhJTlQxNixVSU5UMTYpOwogSEJSVVNIMTYgICAgV0lOQVBJIEdldENvbnRyb2xCcnVzaChIV05EMTYsSERDMTYsVUlOVDE2KTsKIFZPSUQgICAgICAgIFdJTkFQSSBHZXRDb2RlSW5mbyhGQVJQUk9DMTYsTFBWT0lEKTsKK0hGT05UMTYgICAgIFdJTkFQSSBHZXRDdXJMb2dGb250KEhEQzE2KTsKIEhBTkRMRTE2ICAgIFdJTkFQSSBHZXRDdXJyZW50UERCKHZvaWQpOwogRFdPUkQgICAgICAgV0lOQVBJIEdldEN1cnJlbnRQb3NpdGlvbihIREMxNik7CiBIVEFTSzE2ICAgICBXSU5BUEkgR2V0Q3VycmVudFRhc2sodm9pZCk7CkBAIC02MzM2LDYgKzYzNjQsNyBAQAogVUlOVDE2ICAgICAgV0lOQVBJIEdldE51bVRhc2tzKHZvaWQpOwogRFdPUkQgICAgICAgV0lOQVBJIEdldFNlbGVjdG9yQmFzZShXT1JEKTsKIERXT1JEICAgICAgIFdJTkFQSSBHZXRTZWxlY3RvckxpbWl0KFdPUkQpOworRkFSUFJPQzE2ICAgV0lOQVBJIEdldFNldEtlcm5lbERPU1Byb2MoRkFSUFJPQzE2IERvc1Byb2MpOwogSElOU1RBTkNFMTYgV0lOQVBJIEdldFRhc2tEUyh2b2lkKTsKIEhRVUVVRTE2ICAgIFdJTkFQSSBHZXRUYXNrUXVldWUoSFRBU0sxNik7CiBCWVRFICAgICAgICBXSU5BUEkgR2V0VGVtcERyaXZlKEJZVEUpOwpAQCAtNjM3NSw2ICs2NDA0LDcgQEAKIFdPUkQgICAgICAgIFdJTkFQSSBMb2NhbEhlYXBTaXplKHZvaWQpOwogSElDT04xNiAgICAgV0lOQVBJIExvYWRJY29uSGFuZGxlcihIR0xPQkFMMTYsQk9PTDE2KTsKIEJPT0wxNiAgICAgIFdJTkFQSSBMb2NhbEluaXQoSEFORExFMTYsV09SRCxXT1JEKTsKK0hNT0RVTEUzMiAgIFdJTkFQSSBMb2FkTGlicmFyeUV4MzJXMTYoTFBDU1RSLEhBTkRMRTE2LERXT1JEKTsKIEZBUlBST0MxNiAgIFdJTkFQSSBMb2NhbE5vdGlmeShGQVJQUk9DMTYpOwogSFRBU0sxNiAgICAgV0lOQVBJIExvY2tDdXJyZW50VGFzayhCT09MMTYpOwogSE1FTlUxNiAgICAgV0lOQVBJIExvb2t1cE1lbnVIYW5kbGUoSE1FTlUxNixJTlQxNik7CkBAIC02NDY3LDYgKzY0OTcsMTMgQEAKIEhBTkRMRTMyICAgIFdJTkFQSSBDcmVhdGVNdXRleDMyQShMUFNFQ1VSSVRZX0FUVFJJQlVURVMsQk9PTDMyLExQQ1NUUik7CiBIQU5ETEUzMiAgICBXSU5BUEkgQ3JlYXRlTXV0ZXgzMlcoTFBTRUNVUklUWV9BVFRSSUJVVEVTLEJPT0wzMixMUENXU1RSKTsKICNkZWZpbmUgICAgIENyZWF0ZU11dGV4IFdJTkVMSUJfTkFNRV9BVyhDcmVhdGVNdXRleCkKK0JPT0wzMiAgICAgIFdJTkFQSSBDcmVhdGVQcm9jZXNzMzJBKExQQ1NUUixMUFNUUixMUFNFQ1VSSVRZX0FUVFJJQlVURVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUFNFQ1VSSVRZX0FUVFJJQlVURVMsQk9PTDMyLERXT1JELExQVk9JRCxMUENTVFIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUFNUQVJUVVBJTkZPMzJBLExQUFJPQ0VTU19JTkZPUk1BVElPTik7CitCT09MMzIgICAgICBXSU5BUEkgQ3JlYXRlUHJvY2VzczMyVyhMUENXU1RSLExQV1NUUixMUFNFQ1VSSVRZX0FUVFJJQlVURVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUFNFQ1VSSVRZX0FUVFJJQlVURVMsQk9PTDMyLERXT1JELExQVk9JRCxMUENXU1RSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBTVEFSVFVQSU5GTzMyVyxMUFBST0NFU1NfSU5GT1JNQVRJT04pOworI2RlZmluZSAgICAgQ3JlYXRlUHJvY2VzcyBXSU5FTElCX05BTUVfQVcoQ3JlYXRlUHJvY2VzcykKIEhBTkRMRTMyICAgIFdJTkFQSSBDcmVhdGVTZW1hcGhvcmUzMkEoTFBTRUNVUklUWV9BVFRSSUJVVEVTLExPTkcsTE9ORyxMUENTVFIpOwogSEFORExFMzIgICAgV0lOQVBJIENyZWF0ZVNlbWFwaG9yZTMyVyhMUFNFQ1VSSVRZX0FUVFJJQlVURVMsTE9ORyxMT05HLExQQ1dTVFIpOwogI2RlZmluZSAgICAgQ3JlYXRlU2VtYXBob3JlIFdJTkVMSUJfTkFNRV9BVyhDcmVhdGVTZW1hcGhvcmUpCkBAIC02NTA4LDEyICs2NTQ1LDE5IEBACiBEV09SRCAgICAgICBXSU5BUEkgRXhwYW5kRW52aXJvbm1lbnRTdHJpbmdzMzJXKExQQ1dTVFIsTFBXU1RSLERXT1JEKTsKICNkZWZpbmUgICAgIEV4cGFuZEVudmlyb25tZW50U3RyaW5ncyBXSU5FTElCX05BTUVfQVcoRXhwYW5kRW52aXJvbm1lbnRTdHJpbmdzKQogSFJHTjMyICAgICAgV0lOQVBJIEV4dENyZWF0ZVJlZ2lvbihMUFhGT1JNLERXT1JELExQUkdOREFUQSk7CitJTlQzMiAgICAgICBXSU5BUEkgRXh0RXNjYXBlMzIoSERDMzIsSU5UMzIsSU5UMzIsTFBDU1RSLElOVDMyLExQU1RSKTsKIEJPT0wzMiAgICAgIFdJTkFQSSBGaWxlVGltZVRvRG9zRGF0ZVRpbWUoY29uc3QgRklMRVRJTUUqLExQV09SRCxMUFdPUkQpOwogQk9PTDMyICAgICAgV0lOQVBJIEZpbGVUaW1lVG9Mb2NhbEZpbGVUaW1lKGNvbnN0IEZJTEVUSU1FKixMUEZJTEVUSU1FKTsKIEJPT0wzMiAgICAgIFdJTkFQSSBGaWxlVGltZVRvU3lzdGVtVGltZShjb25zdCBGSUxFVElNRSosTFBTWVNURU1USU1FKTsKK0hBTkRMRTMyICAgIFdJTkFQSSBGaW5kRmlyc3RDaGFuZ2VOb3RpZmljYXRpb24zMkEoTFBDU1RSLEJPT0wzMixEV09SRCk7CitIQU5ETEUzMiAgICBXSU5BUEkgRmluZEZpcnN0Q2hhbmdlTm90aWZpY2F0aW9uMzJXKExQQ1dTVFIsQk9PTDMyLERXT1JEKTsKKyNkZWZpbmUgICAgIEZpbmRGaXJzdENoYW5nZU5vdGlmaWNhdGlvbiBXSU5FTElCX05BTUVfQVcoRmluZEZpcnN0Q2hhbmdlTm90aWZpY2F0aW9uKQorQk9PTDMyICAgICAgV0lOQVBJIEZpbmROZXh0Q2hhbmdlTm90aWZpY2F0aW9uKEhBTkRMRTMyKTsKK0JPT0wzMiAgICAgIFdJTkFQSSBGaW5kQ2xvc2VDaGFuZ2VOb3RpZmljYXRpb24oSEFORExFMzIpOwogSFJTUkMzMiAgICAgV0lOQVBJIEZpbmRSZXNvdXJjZUV4MzJBKEhNT0RVTEUzMixMUENTVFIsTFBDU1RSLFdPUkQpOwogSFJTUkMzMiAgICAgV0lOQVBJIEZpbmRSZXNvdXJjZUV4MzJXKEhNT0RVTEUzMixMUENXU1RSLExQQ1dTVFIsV09SRCk7CiAjZGVmaW5lICAgICBGaW5kUmVzb3VyY2VFeCBXSU5FTElCX05BTUVfQVcoRmluZFJlc291cmNlRXgpCitCT09MMzIgICAgICBXSU5BUEkgRml4QnJ1c2hPcmdFeChIREMzMixJTlQzMixJTlQzMixMUFBPSU5UMzIpOwogQk9PTDMyICAgICAgV0lOQVBJIEZsdXNoQ29uc29sZUlucHV0QnVmZmVyKEhBTkRMRTMyKTsKIEJPT0wzMiAgICAgIFdJTkFQSSBGbHVzaEZpbGVCdWZmZXJzKEhGSUxFMzIpOwogQk9PTDMyICAgICAgV0lOQVBJIEZsdXNoVmlld09mRmlsZShMUENWT0lELCBEV09SRCk7CkBAIC02NTI1LDE2ICs2NTY5LDE2IEBACiBCT09MMzIgICAgICBXSU5BUEkgRnJlZUVudmlyb25tZW50U3RyaW5nczMyVyhMUFdTVFIpOwogI2RlZmluZSAgICAgRnJlZUVudmlyb25tZW50U3RyaW5ncyBXSU5FTElCX05BTUVfQVcoRnJlZUVudmlyb25tZW50U3RyaW5ncykKIFVJTlQzMiAgICAgIFdJTkFQSSBHZXRBQ1Aodm9pZCk7Ci1MUENTVFIgICAgICBXSU5BUEkgR2V0Q29tbWFuZExpbmUzMkEoKTsKLUxQQ1dTVFIgICAgIFdJTkFQSSBHZXRDb21tYW5kTGluZTMyVygpOworTFBDU1RSICAgICAgV0lOQVBJIEdldENvbW1hbmRMaW5lMzJBKHZvaWQpOworTFBDV1NUUiAgICAgV0lOQVBJIEdldENvbW1hbmRMaW5lMzJXKHZvaWQpOwogI2RlZmluZSAgICAgR2V0Q29tbWFuZExpbmUgV0lORUxJQl9OQU1FX0FXKEdldENvbW1hbmRMaW5lKQogQk9PTDMyICAgICAgV0lOQVBJIEdldENvbW1UaW1lb3V0cyhJTlQzMixMUENPTU1USU1FT1VUUyk7CiBCT09MMzIgICAgICBXSU5BUEkgR2V0Q29tcHV0ZXJOYW1lMzJBKExQU1RSLExQRFdPUkQpOwogQk9PTDMyICAgICAgV0lOQVBJIEdldENvbXB1dGVyTmFtZTMyVyhMUFdTVFIsTFBEV09SRCk7CiAjZGVmaW5lICAgICBHZXRDb21wdXRlck5hbWUgV0lORUxJQl9OQU1FX0FXKEdldENvbXB1dGVyTmFtZSkKLVVJTlQzMiAgICAgIFdJTkFQSSBHZXRDb25zb2xlQ1AoKTsKK1VJTlQzMiAgICAgIFdJTkFQSSBHZXRDb25zb2xlQ1Aodm9pZCk7CiBCT09MMzIgICAgICBXSU5BUEkgR2V0Q29uc29sZU1vZGUoSEFORExFMzIsTFBEV09SRCk7Ci1VSU5UMzIgICAgICBXSU5BUEkgR2V0Q29uc29sZU91dHB1dENQKCk7CitVSU5UMzIgICAgICBXSU5BUEkgR2V0Q29uc29sZU91dHB1dENQKHZvaWQpOwogRFdPUkQgICAgICAgV0lOQVBJIEdldENvbnNvbGVUaXRsZTMyQShMUFNUUixEV09SRCk7CiBEV09SRCAgICAgICBXSU5BUEkgR2V0Q29uc29sZVRpdGxlMzJXKExQV1NUUixEV09SRCk7CiAjZGVmaW5lICAgICBHZXRDb25zb2xlVGl0bGUgV0lORUxJQl9OQU1FX0FXKEdldENvbnNvbGVUaXRsZSkKQEAgLTY1ODAsNiArNjYyNCw4IEBACiBEV09SRCAgICAgICBXSU5BUEkgR2V0TG9uZ1BhdGhOYW1lMzJBKExQQ1NUUixMUFNUUixEV09SRCk7CiBEV09SRCAgICAgICBXSU5BUEkgR2V0TG9uZ1BhdGhOYW1lMzJXKExQQ1dTVFIsTFBXU1RSLERXT1JEKTsKICNkZWZpbmUgICAgIEdldExvbmdQYXRoTmFtZSBXSU5FTElCX05BTUVfQVcoR2V0TG9uZ1BhdGhOYW1lKQorVUlOVDMyICAgICAgV0lOQVBJIEdldE1lbnVEZWZhdWx0SXRlbTMyKEhNRU5VMzIsVUlOVDMyLFVJTlQzMik7CisjZGVmaW5lICAgICBHZXRNZW51RGVmYXVsdEl0ZW0gV0lORUxJQl9OQU1FKEdldE1lbnVEZWZhdWx0SXRlbSkKIEJPT0wzMiAgICAgIFdJTkFQSSBHZXRNZW51SXRlbUluZm8zMkEoSE1FTlUzMixVSU5UMzIsQk9PTDMyLE1FTlVJVEVNSU5GTzMyQSopOwogQk9PTDMyICAgICAgV0lOQVBJIEdldE1lbnVJdGVtSW5mbzMyVyhITUVOVTMyLFVJTlQzMixCT09MMzIsTUVOVUlURU1JTkZPMzJXKik7CiAjZGVmaW5lICAgICBHZXRNZW51SXRlbUluZm8gV0lORUxJQl9OQU1FX0FXKEdldE1lbnVJdGVtSW5mbykKQEAgLTY1ODksOSArNjYzNSw2IEBACiBEV09SRCAgICAgICBXSU5BUEkgR2V0T2JqZWN0VHlwZShIQU5ETEUzMik7CiBVSU5UMzIgICAgICBXSU5BUEkgR2V0T0VNQ1Aodm9pZCk7CiBEV09SRCAgICAgICBXSU5BUEkgR2V0UHJpb3JpdHlDbGFzcyhIQU5ETEUzMik7Ci1JTlQzMiAgICAgICBXSU5BUEkgR2V0UHJpdmF0ZVByb2ZpbGVTZWN0aW9uMzJBKExQQ1NUUixMUFNUUixVSU5UMzIsTFBDU1RSKTsKLUlOVDMyICAgICAgIFdJTkFQSSBHZXRQcml2YXRlUHJvZmlsZVNlY3Rpb24zMlcoTFBDV1NUUixMUFdTVFIsVUlOVDMyLExQQ1dTVFIpOwotI2RlZmluZSAgICAgR2V0UHJpdmF0ZVByb2ZpbGVTZWN0aW9uIFdJTkVMSUJfTkFNRV9BVyhHZXRQcml2YXRlUHJvZmlsZVNlY3Rpb24pCiBIQU5ETEUzMiAgICBXSU5BUEkgR2V0UHJvY2Vzc0hlYXAodm9pZCk7CiBEV09SRCAgICAgICBXSU5BUEkgR2V0UmVnaW9uRGF0YShIUkdOMzIsRFdPUkQsTFBSR05EQVRBKTsKIERXT1JEICAgICAgIFdJTkFQSSBHZXRTaG9ydFBhdGhOYW1lMzJBKExQQ1NUUixMUFNUUixEV09SRCk7CkBAIC02NjEzLDcgKzY2NTYsNyBAQAogSU5UMzIgICAgICAgV0lOQVBJIEdldFRpbWVGb3JtYXQzMkEoTENJRCxEV09SRCxMUFNZU1RFTVRJTUUsTFBDU1RSLExQU1RSLElOVDMyKTsKIElOVDMyICAgICAgIFdJTkFQSSBHZXRUaW1lRm9ybWF0MzJXKExDSUQsRFdPUkQsTFBTWVNURU1USU1FLExQQ1dTVFIsTFBXU1RSLElOVDMyKTsKICNkZWZpbmUgICAgIEdldFRpbWVGb3JtYXQgV0lORUxJQl9OQU1FX0FXKEdldFRpbWVGb3JtYXQpCi1MQ0lEICAgICAgICBXSU5BUEkgR2V0VGhyZWFkTG9jYWxlKCk7CitMQ0lEICAgICAgICBXSU5BUEkgR2V0VGhyZWFkTG9jYWxlKHZvaWQpOwogSU5UMzIgICAgICAgV0lOQVBJIEdldFRocmVhZFByaW9yaXR5KEhBTkRMRTMyKTsKIEJPT0wzMiAgICAgIFdJTkFQSSBHZXRUaHJlYWRTZWxlY3RvckVudHJ5KEhBTkRMRTMyLERXT1JELExQTERUX0VOVFJZKTsKIEJPT0wzMiAgICAgIFdJTkFQSSBHZXRVc2VyTmFtZTMyQShMUFNUUixMUERXT1JEKTsKQEAgLTY2NDUsNiArNjY4OCw4IEBACiBCT09MMzIgICAgICBXSU5BUEkgTG9va3VwUHJpdmlsZWdlVmFsdWUzMkEoTFBDU1RSLExQQ1NUUixMUFZPSUQpOwogQk9PTDMyICAgICAgV0lOQVBJIExvb2t1cFByaXZpbGVnZVZhbHVlMzJXKExQQ1dTVFIsTFBDV1NUUixMUFZPSUQpOwogI2RlZmluZSAgICAgTG9va3VwUHJpdmlsZWdlVmFsdWUgV0lORUxJQl9OQU1FX0FXKExvb2t1cFByaXZpbGVnZVZhbHVlKQorSE1PRFVMRTMyICAgV0lOQVBJIE1hcEhNb2R1bGVTTChITU9EVUxFMTYpOworSE1PRFVMRTE2ICAgV0lOQVBJIE1hcEhNb2R1bGVMUyhITU9EVUxFMzIpOwogU0VHUFRSICAgICAgV0lOQVBJIE1hcExTKExQVk9JRCk7CiBMUFZPSUQgICAgICBXSU5BUEkgTWFwU0woU0VHUFRSKTsKIExQVk9JRCAgICAgIFdJTkFQSSBNYXBWaWV3T2ZGaWxlKEhBTkRMRTMyLERXT1JELERXT1JELERXT1JELERXT1JEKTsKQEAgLTY2ODIsOCArNjcyNywxMCBAQAogSEFORExFMzIgICAgV0lOQVBJIE9wZW5TZXJ2aWNlMzJBKEhBTkRMRTMyLExQQ1NUUixEV09SRCk7CiBIQU5ETEUzMiAgICBXSU5BUEkgT3BlblNlcnZpY2UzMlcoSEFORExFMzIsTFBDV1NUUixEV09SRCk7CiAjZGVmaW5lICAgICBPcGVuU2VydmljZSBXSU5FTElCX05BTUVfQVcoT3BlblNlcnZpY2UpCitCT09MMzIgICAgICBXSU5BUEkgUGFpbnREZXNrdG9wKEhEQzMyKTsKIEJPT0wzMiAgICAgIFdJTkFQSSBQbGF5RW5oTWV0YUZpbGUoSERDMzIsSEVOSE1FVEFGSUxFMzIsY29uc3QgUkVDVDMyKik7CiBCT09MMzIgICAgICBXSU5BUEkgUGxheUVuaE1ldGFGaWxlUmVjb3JkKEhEQzMyLExQSEFORExFVEFCTEUzMixjb25zdCBFTkhNRVRBUkVDT1JEKixVSU5UMzIpOworQk9PTDMyICAgICAgV0lOQVBJIFBvbHlQb2x5bGluZTMyKEhEQzMyLExQUE9JTlQzMixMUERXT1JELERXT1JEKTsKIEJPT0wzMiAgICAgIFdJTkFQSSBQdWxzZUV2ZW50KEhBTkRMRTMyKTsKIERXT1JEICAgICAgIFdJTkFQSSBRdWVyeURvc0RldmljZTMyQShMUENTVFIsTFBTVFIsRFdPUkQpOwogRFdPUkQgICAgICAgV0lOQVBJIFF1ZXJ5RG9zRGV2aWNlMzJXKExQQ1dTVFIsTFBXU1RSLERXT1JEKTsKQEAgLTY3NzUsNiArNjgyMiw4IEBACiBJTlQzMiAgICAgICBXSU5BUEkgU2V0R3JhcGhpY3NNb2RlKEhEQzMyLElOVDMyKTsKIEJPT0wzMiAgICAgIFdJTkFQSSBTZXRIYW5kbGVJbmZvcm1hdGlvbihIQU5ETEUzMixEV09SRCxEV09SRCk7CiBWT0lEICAgICAgICBXSU5BUEkgU2V0TGFzdEVycm9yRXgoRFdPUkQsRFdPUkQpOworQk9PTDMyICAgICAgV0lOQVBJIFNldE1lbnVEZWZhdWx0SXRlbTMyKEhNRU5VMzIsVUlOVDMyLFVJTlQzMik7CisjZGVmaW5lICAgICBTZXRNZW51RGVmYXVsdEl0ZW0gV0lORUxJQl9OQU1FKFNldE1lbnVEZWZhdWx0SXRlbSkKIEJPT0wzMiAgICAgIFdJTkFQSSBTZXRNZW51SXRlbUluZm8zMkEoSE1FTlUzMixVSU5UMzIsQk9PTDMyLGNvbnN0IE1FTlVJVEVNSU5GTzMyQSopOwogQk9PTDMyICAgICAgV0lOQVBJIFNldE1lbnVJdGVtSW5mbzMyVyhITUVOVTMyLFVJTlQzMixCT09MMzIsY29uc3QgTUVOVUlURU1JTkZPMzJXKik7CiAjZGVmaW5lICAgICBTZXRNZW51SXRlbUluZm8gV0lORUxJQl9OQU1FX0FXKFNldE1lbnVJdGVtSW5mbykKQEAgLTY4MDIsNiArNjg1MSw3IEBACiBCT09MMzIgICAgICBXSU5BUEkgVGxzRnJlZShEV09SRCk7CiBMUFZPSUQgICAgICBXSU5BUEkgVGxzR2V0VmFsdWUoRFdPUkQpOwogQk9PTDMyICAgICAgV0lOQVBJIFRsc1NldFZhbHVlKERXT1JELExQVk9JRCk7CitCT09MMzIgICAgICBXSU5BUEkgVHJhbnNsYXRlQ2hhcnNldEluZm8oTFBEV09SRCxMUENIQVJTRVRJTkZPLERXT1JEKTsKIFZPSUQgICAgICAgIFdJTkFQSSBVbk1hcExTKFNFR1BUUik7CiBCT09MMzIgICAgICBXSU5BUEkgVW5sb2NrRmlsZShIRklMRTMyLERXT1JELERXT1JELERXT1JELERXT1JEKTsKIEJPT0wzMiAgICAgIFdJTkFQSSBVbm1hcFZpZXdPZkZpbGUoTFBWT0lEKTsKQEAgLTY4NjIsNiArNjkxMiw3IEBACiBMQ0lEICAgICAgICBXSU5BUEkgR2V0VXNlckRlZmF1bHRMQ0lEKHZvaWQpOwogQVRPTSAgICAgICAgV0lOQVBJIEdsb2JhbERlbGV0ZUF0b20oQVRPTSk7CiBWT0lEICAgICAgICBXSU5BUEkgTFpEb25lKHZvaWQpOworVk9JRCAgICAgICAgV0lOQVBJIFNjcmVlblN3aXRjaEVuYWJsZShXT1JEKTsKIERXT1JEICAgICAgIFdJTkFQSSBPZW1LZXlTY2FuKFdPUkQpOwogRFdPUkQgICAgICAgV0lOQVBJIFJlZ0Nsb3NlS2V5KEhLRVkpOwogRFdPUkQgICAgICAgV0lOQVBJIFJlZ0ZsdXNoS2V5KEhLRVkpOwpAQCAtNzAyMyw2ICs3MDc0LDkgQEAKIEJPT0wxNiAgICAgIFdJTkFQSSBDaGVja01lbnVSYWRpb0J1dHRvbjE2KEhNRU5VMTYsVUlOVDE2LFVJTlQxNixVSU5UMTYsQk9PTDE2KTsKIEJPT0wzMiAgICAgIFdJTkFQSSBDaGVja01lbnVSYWRpb0J1dHRvbjMyKEhNRU5VMzIsVUlOVDMyLFVJTlQzMixVSU5UMzIsQk9PTDMyKTsKICNkZWZpbmUgICAgIENoZWNrTWVudVJhZGlvQnV0dG9uIFdJTkVMSUJfTkFNRShDaGVja01lbnVSYWRpb0J1dHRvbikKK0JPT0wxNiAgICAgIFdJTkFQSSBDaGVja01lbnVSYWRpb0l0ZW0xNihITUVOVTE2LFVJTlQxNixVSU5UMTYsVUlOVDE2LFVJTlQxNik7CitCT09MMzIgICAgICBXSU5BUEkgQ2hlY2tNZW51UmFkaW9JdGVtMzIoSE1FTlUzMixVSU5UMzIsVUlOVDMyLFVJTlQzMixVSU5UMzIpOworI2RlZmluZSAgICAgQ2hlY2tNZW51UmFkaW9JdGVtIFdJTkVMSUJfTkFNRShDaGVja01lbnVSYWRpb0l0ZW0pCiBCT09MMTYgICAgICBXSU5BUEkgQ2hlY2tSYWRpb0J1dHRvbjE2KEhXTkQxNixVSU5UMTYsVUlOVDE2LFVJTlQxNik7CiBCT09MMzIgICAgICBXSU5BUEkgQ2hlY2tSYWRpb0J1dHRvbjMyKEhXTkQzMixVSU5UMzIsVUlOVDMyLFVJTlQzMik7CiAjZGVmaW5lICAgICBDaGVja1JhZGlvQnV0dG9uIFdJTkVMSUJfTkFNRShDaGVja1JhZGlvQnV0dG9uKQpAQCAtNzA2Nyw2ICs3MTIxLDkgQEAKIEhJQ09OMTYgICAgIFdJTkFQSSBDb3B5SWNvbjE2KEhJTlNUQU5DRTE2LEhJQ09OMTYpOwogSElDT04zMiAgICAgV0lOQVBJIENvcHlJY29uMzIoSElDT04zMik7CiAjZGVmaW5lICAgICBDb3B5SWNvbiBXSU5FTElCX05BTUUoQ29weUljb24pCitISUNPTjE2ICAgICBXSU5BUEkgQ29weUltYWdlMTYoSEFORExFMTYsVUlOVDE2LElOVDE2LElOVDE2LFVJTlQxNik7CitISUNPTjMyICAgICBXSU5BUEkgQ29weUltYWdlMzIoSEFORExFMzIsVUlOVDMyLElOVDMyLElOVDMyLFVJTlQzMik7CisjZGVmaW5lICAgICBDb3B5SW1hZ2UgV0lORUxJQl9OQU1FKENvcHlJbWFnZSkKIExPTkcgICAgICAgIFdJTkFQSSBDb3B5TFpGaWxlMTYoSEZJTEUxNixIRklMRTE2KTsKIExPTkcgICAgICAgIFdJTkFQSSBDb3B5TFpGaWxlMzIoSEZJTEUzMixIRklMRTMyKTsKICNkZWZpbmUgICAgIENvcHlMWkZpbGUgV0lORUxJQl9OQU1FKENvcHlMWkZpbGUpCkBAIC03Mzc3LDYgKzc0MzQsMTAgQEAKIFZPSUQgICAgICAgIFdJTkFQSSBEcmF3TWVudUJhcjE2KEhXTkQxNik7CiBCT09MMzIgICAgICBXSU5BUEkgRHJhd01lbnVCYXIzMihIV05EMzIpOwogI2RlZmluZSAgICAgRHJhd01lbnVCYXIgV0lORUxJQl9OQU1FKERyYXdNZW51QmFyKQorQk9PTDE2ICAgICAgV0lOQVBJIERyYXdTdGF0ZTE2QShIREMxNixIQlJVU0gxNixEUkFXU1RBVEVQUk9DMTYsTFBBUkFNLFdQQVJBTTE2LElOVDE2LElOVDE2LElOVDE2LElOVDE2LFVJTlQxNik7CitCT09MMzIgICAgICBXSU5BUEkgRHJhd1N0YXRlMzJBKEhEQzMyLEhCUlVTSDMyLERSQVdTVEFURVBST0MzMixMUEFSQU0sV1BBUkFNMzIsSU5UMzIsSU5UMzIsSU5UMzIsSU5UMzIsVUlOVDMyKTsKK0JPT0wzMiAgICAgIFdJTkFQSSBEcmF3U3RhdGUzMlcoSERDMzIsSEJSVVNIMzIsRFJBV1NUQVRFUFJPQzMyLExQQVJBTSxXUEFSQU0zMixJTlQzMixJTlQzMixJTlQzMixJTlQzMixVSU5UMzIpOworI2RlZmluZSAgICAgRHJhd1N0YXRlIFdJTkVMSUJfTkFNRV9BVyhEcmF3U3RhdGUpCiBJTlQxNiAgICAgICBXSU5BUEkgRHJhd1RleHQxNihIREMxNixMUENTVFIsSU5UMTYsTFBSRUNUMTYsVUlOVDE2KTsKIElOVDMyICAgICAgIFdJTkFQSSBEcmF3VGV4dDMyQShIREMzMixMUENTVFIsSU5UMzIsTFBSRUNUMzIsVUlOVDMyKTsKIElOVDMyICAgICAgIFdJTkFQSSBEcmF3VGV4dDMyVyhIREMzMixMUENXU1RSLElOVDMyLExQUkVDVDMyLFVJTlQzMik7CkBAIC03NTcyLDYgKzc2MzMsOSBAQAogVUlOVDMyICAgICAgV0lOQVBJIEdldEF0b21OYW1lMzJBKEFUT00sTFBTVFIsSU5UMzIpOwogVUlOVDMyICAgICAgV0lOQVBJIEdldEF0b21OYW1lMzJXKEFUT00sTFBXU1RSLElOVDMyKTsKICNkZWZpbmUgICAgIEdldEF0b21OYW1lIFdJTkVMSUJfTkFNRV9BVyhHZXRBdG9tTmFtZSkKK0JPT0wxNiAgICAgIFdJTkFQSSBHZXRBc3BlY3RSYXRpb0ZpbHRlckV4MTYoSERDMTYsTFBTSVpFMTYpOworQk9PTDMyICAgICAgV0lOQVBJIEdldEFzcGVjdFJhdGlvRmlsdGVyRXgzMihIREMzMixMUFNJWkUzMik7CisjZGVmaW5lICAgICBHZXRBc3BlY3RSYXRpb0ZpbHRlckV4IFdJTkVMSUJfTkFNRShHZXRBc3BlY3RSYXRpb0ZpbHRlckV4KQogTE9ORyAgICAgICAgV0lOQVBJIEdldEJpdG1hcEJpdHMxNihIQklUTUFQMTYsTE9ORyxMUFZPSUQpOwogTE9ORyAgICAgICAgV0lOQVBJIEdldEJpdG1hcEJpdHMzMihIQklUTUFQMzIsTE9ORyxMUFZPSUQpOwogI2RlZmluZSAgICAgR2V0Qml0bWFwQml0cyBXSU5FTElCX05BTUUoR2V0Qml0bWFwQml0cykKQEAgLTc2MDAsNiArNzY2NCw5IEBACiBCT09MMzIgICAgICBXSU5BUEkgR2V0Q2hhckFCQ1dpZHRoczMyQShIREMzMixVSU5UMzIsVUlOVDMyLExQQUJDMzIpOwogQk9PTDMyICAgICAgV0lOQVBJIEdldENoYXJBQkNXaWR0aHMzMlcoSERDMzIsVUlOVDMyLFVJTlQzMixMUEFCQzMyKTsKICNkZWZpbmUgICAgIEdldENoYXJBQkNXaWR0aHMgV0lORUxJQl9OQU1FX0FXKEdldENoYXJBQkNXaWR0aHMpCitEV09SRCAgICAgICBXSU5BUEkgR2V0Q2hhcmFjdGVyUGxhY2VtZW50MzJBKEhEQzMyLExQQ1NUUixJTlQzMixJTlQzMixHQ1BfUkVTVUxUUzMyQSosRFdPUkQpOworRFdPUkQgICAgICAgV0lOQVBJIEdldENoYXJhY3RlclBsYWNlbWVudDMyVyhIREMzMixMUENXU1RSLElOVDMyLElOVDMyLEdDUF9SRVNVTFRTMzJXKixEV09SRCk7CisjZGVmaW5lICAgICBHZXRDaGFyYWN0ZXJQbGFjZW1lbnQgV0lORUxJQl9OQU1FX0FXKEdldENoYXJhY3RlclBsYWNlbWVudCkKIEJPT0wxNiAgICAgIFdJTkFQSSBHZXRDaGFyV2lkdGgxNihIREMxNixVSU5UMTYsVUlOVDE2LExQSU5UMTYpOwogQk9PTDMyICAgICAgV0lOQVBJIEdldENoYXJXaWR0aDMyQShIREMzMixVSU5UMzIsVUlOVDMyLExQSU5UMzIpOwogQk9PTDMyICAgICAgV0lOQVBJIEdldENoYXJXaWR0aDMyVyhIREMzMixVSU5UMzIsVUlOVDMyLExQSU5UMzIpOwpAQCAtNzY4OSw2ICs3NzU2LDkgQEAKIEJPT0wzMiAgICAgIFdJTkFQSSBHZXREaXNrRnJlZVNwYWNlMzJBKExQQ1NUUixMUERXT1JELExQRFdPUkQsTFBEV09SRCxMUERXT1JEKTsKIEJPT0wzMiAgICAgIFdJTkFQSSBHZXREaXNrRnJlZVNwYWNlMzJXKExQQ1dTVFIsTFBEV09SRCxMUERXT1JELExQRFdPUkQsTFBEV09SRCk7CiAjZGVmaW5lICAgICBHZXREaXNrRnJlZVNwYWNlIFdJTkVMSUJfTkFNRV9BVyhHZXREaXNrRnJlZVNwYWNlKQorQk9PTDMyICAgICAgV0lOQVBJIEdldERpc2tGcmVlU3BhY2VFeDMyQShMUENTVFIsTFBVTEFSR0VfSU5URUdFUixMUFVMQVJHRV9JTlRFR0VSLExQVUxBUkdFX0lOVEVHRVIpOworQk9PTDMyICAgICAgV0lOQVBJIEdldERpc2tGcmVlU3BhY2VFeDMyVyhMUENXU1RSLExQVUxBUkdFX0lOVEVHRVIsTFBVTEFSR0VfSU5URUdFUixMUFVMQVJHRV9JTlRFR0VSKTsKKyNkZWZpbmUgICAgIEdldERpc2tGcmVlU3BhY2VFeCBXSU5FTElCX05BTUVfQVcoR2V0RGlza0ZyZWVTcGFjZUV4KQogSU5UMTYgICAgICAgV0lOQVBJIEdldERsZ0N0cmxJRDE2KEhXTkQxNik7CiBJTlQzMiAgICAgICBXSU5BUEkgR2V0RGxnQ3RybElEMzIoSFdORDMyKTsKICNkZWZpbmUgICAgIEdldERsZ0N0cmxJRCBXSU5FTElCX05BTUUoR2V0RGxnQ3RybElEKQpAQCAtNzcyOCw2ICs3Nzk4LDExIEBACiBIV05EMTYgICAgICBXSU5BUEkgR2V0Rm9jdXMxNih2b2lkKTsKIEhXTkQzMiAgICAgIFdJTkFQSSBHZXRGb2N1czMyKHZvaWQpOwogI2RlZmluZSAgICAgR2V0Rm9jdXMgV0lORUxJQl9OQU1FKEdldEZvY3VzKQorRFdPUkQgICAgICAgV0lOQVBJIEdldEZvbnREYXRhMzIoSERDMzIsRFdPUkQsRFdPUkQsTFBWT0lELERXT1JEKTsKKyNkZWZpbmUgICAgIEdldEZvbnREYXRhIFdJTkVMSUJfTkFNRShHZXRGb250RGF0YSkKK0RXT1JEICAgICAgIFdJTkFQSSBHZXRGb250TGFuZ3VhZ2VJbmZvMTYoSERDMTYpOworRFdPUkQgICAgICAgV0lOQVBJIEdldEZvbnRMYW5ndWFnZUluZm8zMihIREMzMik7CisjZGVmaW5lICAgICBHZXRGb250TGFuZ3VhZ2VJbmZvIFdJTkVMSUJfTkFNRShHZXRGb250TGFuZ3VhZ2VJbmZvKQogSFdORDE2ICAgICAgV0lOQVBJIEdldEZvcmVncm91bmRXaW5kb3cxNih2b2lkKTsKIEhXTkQzMiAgICAgIFdJTkFQSSBHZXRGb3JlZ3JvdW5kV2luZG93MzIodm9pZCk7CiAjZGVmaW5lICAgICBHZXRGb3JlZ3JvdW5kV2luZG93IFdJTkVMSUJfTkFNRShHZXRGb3JlZ3JvdW5kV2luZG93KQpAQCAtNzgzMSw2ICs3OTA2LDExIEBACiBIV05EMTYgICAgICBXSU5BUEkgR2V0T3BlbkNsaXBib2FyZFdpbmRvdzE2KHZvaWQpOwogSFdORDMyICAgICAgV0lOQVBJIEdldE9wZW5DbGlwYm9hcmRXaW5kb3czMih2b2lkKTsKICNkZWZpbmUgICAgIEdldE9wZW5DbGlwYm9hcmRXaW5kb3cgV0lORUxJQl9OQU1FKEdldE9wZW5DbGlwYm9hcmRXaW5kb3cpCisvKiBGSVhNRTogTFBWT0lEIHNob3VsZCBiZSBMUE9VVExJTkVURVhUTUVUUklDezE2LDMyQSwzMld9ICovCitVSU5UMTYgICAgICBXSU5BUEkgR2V0T3V0bGluZVRleHRNZXRyaWNzMTYoSERDMTYsVUlOVDE2LExQVk9JRCk7CitVSU5UMzIgICAgICBXSU5BUEkgR2V0T3V0bGluZVRleHRNZXRyaWNzMzJBKEhEQzMyLFVJTlQzMixMUFZPSUQpOworVUlOVDMyICAgICAgV0lOQVBJIEdldE91dGxpbmVUZXh0TWV0cmljczMyVyhIREMzMixVSU5UMzIsTFBWT0lEKTsKKyNkZWZpbmUgICAgIEdldE91dGxpbmVUZXh0TWV0cmljcyBXSU5FTElCX05BTUVfQVcoR2V0T3V0bGluZVRleHRNZXRyaWNzKQogVUlOVDE2ICAgICAgV0lOQVBJIEdldFBhbGV0dGVFbnRyaWVzMTYoSFBBTEVUVEUxNixVSU5UMTYsVUlOVDE2LExQUEFMRVRURUVOVFJZKTsKIFVJTlQzMiAgICAgIFdJTkFQSSBHZXRQYWxldHRlRW50cmllczMyKEhQQUxFVFRFMzIsVUlOVDMyLFVJTlQzMixMUFBBTEVUVEVFTlRSWSk7CiAjZGVmaW5lICAgICBHZXRQYWxldHRlRW50cmllcyBXSU5FTElCX05BTUUoR2V0UGFsZXR0ZUVudHJpZXMpCkBAIC03ODU0LDEwICs3OTM0LDIyIEBACiBVSU5UMzIgICAgICBXSU5BUEkgR2V0UHJpdmF0ZVByb2ZpbGVJbnQzMkEoTFBDU1RSLExQQ1NUUixJTlQzMixMUENTVFIpOwogVUlOVDMyICAgICAgV0lOQVBJIEdldFByaXZhdGVQcm9maWxlSW50MzJXKExQQ1dTVFIsTFBDV1NUUixJTlQzMixMUENXU1RSKTsKICNkZWZpbmUgICAgIEdldFByaXZhdGVQcm9maWxlSW50IFdJTkVMSUJfTkFNRV9BVyhHZXRQcml2YXRlUHJvZmlsZUludCkKK0lOVDE2ICAgICAgIFdJTkFQSSBHZXRQcml2YXRlUHJvZmlsZVNlY3Rpb24xNihMUENTVFIsTFBTVFIsVUlOVDE2LExQQ1NUUik7CitJTlQzMiAgICAgICBXSU5BUEkgR2V0UHJpdmF0ZVByb2ZpbGVTZWN0aW9uMzJBKExQQ1NUUixMUFNUUixEV09SRCxMUENTVFIpOworSU5UMzIgICAgICAgV0lOQVBJIEdldFByaXZhdGVQcm9maWxlU2VjdGlvbjMyVyhMUENXU1RSLExQV1NUUixEV09SRCxMUENXU1RSKTsKKyNkZWZpbmUgICAgIEdldFByaXZhdGVQcm9maWxlU2VjdGlvbiBXSU5FTElCX05BTUVfQVcoR2V0UHJpdmF0ZVByb2ZpbGVTZWN0aW9uKQorV09SRCAgICAgICAgV0lOQVBJIEdldFByaXZhdGVQcm9maWxlU2VjdGlvbk5hbWVzMTYoTFBTVFIsVUlOVDE2LExQQ1NUUik7CitEV09SRCAgICAgICBXSU5BUEkgR2V0UHJpdmF0ZVByb2ZpbGVTZWN0aW9uTmFtZXMzMkEoTFBTVFIsRFdPUkQsTFBDU1RSKTsKK0RXT1JEICAgICAgIFdJTkFQSSBHZXRQcml2YXRlUHJvZmlsZVNlY3Rpb25OYW1lczMyVyhMUFdTVFIsRFdPUkQsTFBDV1NUUik7CisjZGVmaW5lICAgICBHZXRQcml2YXRlUHJvZmlsZVNlY3Rpb25OYW1lcyBXSU5FTElCX05BTUVfQVcoR2V0UHJpdmF0ZVByb2ZpbGVTZWN0aW9uTmFtZXMpCiBJTlQxNiAgICAgICBXSU5BUEkgR2V0UHJpdmF0ZVByb2ZpbGVTdHJpbmcxNihMUENTVFIsTFBDU1RSLExQQ1NUUixMUFNUUixVSU5UMTYsTFBDU1RSKTsKIElOVDMyICAgICAgIFdJTkFQSSBHZXRQcml2YXRlUHJvZmlsZVN0cmluZzMyQShMUENTVFIsTFBDU1RSLExQQ1NUUixMUFNUUixVSU5UMzIsTFBDU1RSKTsKIElOVDMyICAgICAgIFdJTkFQSSBHZXRQcml2YXRlUHJvZmlsZVN0cmluZzMyVyhMUENXU1RSLExQQ1dTVFIsTFBDV1NUUixMUFdTVFIsVUlOVDMyLExQQ1dTVFIpOwogI2RlZmluZSAgICAgR2V0UHJpdmF0ZVByb2ZpbGVTdHJpbmcgV0lORUxJQl9OQU1FX0FXKEdldFByaXZhdGVQcm9maWxlU3RyaW5nKQorQk9PTDE2ICAgICAgV0lOQVBJIEdldFByaXZhdGVQcm9maWxlU3RydWN0MTYoTFBDU1RSLExQQ1NUUixMUFZPSUQsVUlOVDE2LExQQ1NUUik7CitCT09MMzIgICAgICBXSU5BUEkgR2V0UHJpdmF0ZVByb2ZpbGVTdHJ1Y3QzMkEoTFBDU1RSLExQQ1NUUixMUFZPSUQsVUlOVDMyLExQQ1NUUik7CitCT09MMzIgICAgICBXSU5BUEkgR2V0UHJpdmF0ZVByb2ZpbGVTdHJ1Y3QzMlcoTFBDV1NUUixMUENXU1RSLExQVk9JRCxVSU5UMzIsTFBDV1NUUik7CisjZGVmaW5lICAgICBHZXRQcml2YXRlUHJvZmlsZVN0cnVjdCBXSU5FTElCX05BTUVfQVcoR2V0UHJpdmF0ZVByb2ZpbGVTdHJ1Y3QpCiBGQVJQUk9DMTYgICBXSU5BUEkgR2V0UHJvY0FkZHJlc3MxNihITU9EVUxFMTYsU0VHUFRSKTsKIEZBUlBST0MzMiAgIFdJTkFQSSBHZXRQcm9jQWRkcmVzczMyKEhNT0RVTEUzMixMUENTVFIpOwogI2RlZmluZSAgICAgR2V0UHJvY0FkZHJlc3MgV0lORUxJQl9OQU1FKEdldFByb2NBZGRyZXNzKQpAQCAtNzg2Niw2ICs3OTU4LDkgQEAKIFVJTlQzMiAgICAgIFdJTkFQSSBHZXRQcm9maWxlSW50MzJXKExQQ1dTVFIsTFBDV1NUUixJTlQzMik7CiAjZGVmaW5lICAgICBHZXRQcm9maWxlSW50IFdJTkVMSUJfTkFNRV9BVyhHZXRQcm9maWxlSW50KQogSU5UMTYgICAgICAgV0lOQVBJIEdldFByb2ZpbGVTdHJpbmcxNihMUENTVFIsTFBDU1RSLExQQ1NUUixMUFNUUixVSU5UMTYpOworSU5UMzIgICAgICAgV0lOQVBJIEdldFByb2ZpbGVTZWN0aW9uMzJBKExQQ1NUUixMUFNUUixEV09SRCk7CitJTlQzMiAgICAgICBXSU5BUEkgR2V0UHJvZmlsZVNlY3Rpb24zMlcoTFBDV1NUUixMUFdTVFIsRFdPUkQpOworI2RlZmluZSAgICAgR2V0UHJvZmlsZVNlY3Rpb24gV0lORUxJQl9OQU1FX0FXKEdldFByb2ZpbGVTZWN0aW9uKQogSU5UMzIgICAgICAgV0lOQVBJIEdldFByb2ZpbGVTdHJpbmczMkEoTFBDU1RSLExQQ1NUUixMUENTVFIsTFBTVFIsVUlOVDMyKTsKIElOVDMyICAgICAgIFdJTkFQSSBHZXRQcm9maWxlU3RyaW5nMzJXKExQQ1dTVFIsTFBDV1NUUixMUENXU1RSLExQV1NUUixVSU5UMzIpOwogI2RlZmluZSAgICAgR2V0UHJvZmlsZVN0cmluZyBXSU5FTElCX05BTUVfQVcoR2V0UHJvZmlsZVN0cmluZykKQEAgLTgwMzMsNiArODEyOCw5IEBACiB2b2lkICAgICAgICBXSU5BUEkgR2V0V2luZG93UmVjdDE2KEhXTkQxNixMUFJFQ1QxNik7CiB2b2lkICAgICAgICBXSU5BUEkgR2V0V2luZG93UmVjdDMyKEhXTkQzMixMUFJFQ1QzMik7CiAjZGVmaW5lICAgICBHZXRXaW5kb3dSZWN0IFdJTkVMSUJfTkFNRShHZXRXaW5kb3dSZWN0KQorSU5UMTYgICAgICAgV0lOQVBJIEdldFdpbmRvd1JnbjE2KEhXTkQxNixIUkdOMTYpOworSU5UMzIgICAgICAgV0lOQVBJIEdldFdpbmRvd1JnbjMyKEhXTkQzMixIUkdOMzIpOworI2RlZmluZSAgICAgR2V0V2luZG93UmduIFdJTkVMSUJfTkFNRShHZXRXaW5kb3dSZ24pCiBVSU5UMTYgICAgICBXSU5BUEkgR2V0V2luZG93c0RpcmVjdG9yeTE2KExQU1RSLFVJTlQxNik7CiBVSU5UMzIgICAgICBXSU5BUEkgR2V0V2luZG93c0RpcmVjdG9yeTMyQShMUFNUUixVSU5UMzIpOwogVUlOVDMyICAgICAgV0lOQVBJIEdldFdpbmRvd3NEaXJlY3RvcnkzMlcoTFBXU1RSLFVJTlQzMik7CkBAIC04MjgzLDcgKzgzODEsNyBAQAogSE1FTlUzMiAgICAgV0lOQVBJIExvYWRNZW51SW5kaXJlY3QzMlcoTFBDVk9JRCk7CiAjZGVmaW5lICAgICBMb2FkTWVudUluZGlyZWN0IFdJTkVMSUJfTkFNRV9BVyhMb2FkTWVudUluZGlyZWN0KQogSElOU1RBTkNFMTYgV0lOQVBJIExvYWRNb2R1bGUxNihMUENTVFIsTFBWT0lEKTsKLURXT1JEICAgICAgIFdJTkFQSSBMb2FkTW9kdWxlMzIoTFBDU1RSLExQVk9JRCk7CitISU5TVEFOQ0UzMiBXSU5BUEkgTG9hZE1vZHVsZTMyKExQQ1NUUixMUFZPSUQpOwogI2RlZmluZSAgICAgTG9hZE1vZHVsZSBXSU5FTElCX05BTUUoTG9hZE1vZHVsZSkKIEhHTE9CQUwxNiAgIFdJTkFQSSBMb2FkUmVzb3VyY2UxNihISU5TVEFOQ0UxNixIUlNSQzE2KTsKIEhHTE9CQUwzMiAgIFdJTkFQSSBMb2FkUmVzb3VyY2UzMihITU9EVUxFMzIsSFJTUkMzMik7CkBAIC04NTQ2LDYgKzg2NDQsOSBAQAogVUlOVDMyICAgICAgV0lOQVBJIFJlZ2lzdGVyQ2xpcGJvYXJkRm9ybWF0MzJBKExQQ1NUUik7CiBVSU5UMzIgICAgICBXSU5BUEkgUmVnaXN0ZXJDbGlwYm9hcmRGb3JtYXQzMlcoTFBDV1NUUik7CiAjZGVmaW5lICAgICBSZWdpc3RlckNsaXBib2FyZEZvcm1hdCBXSU5FTElCX05BTUVfQVcoUmVnaXN0ZXJDbGlwYm9hcmRGb3JtYXQpCitIUkVTVUxUICAgICBXSU5BUEkgUmVnaXN0ZXJEcmFnRHJvcDE2KEhXTkQxNixMUFZPSUQpOworSFJFU1VMVCAgICAgV0lOQVBJIFJlZ2lzdGVyRHJhZ0Ryb3AzMihIV05EMzIsTFBWT0lEKTsKKyNkZWZpbmUgICAgIFJlZ2lzdGVyRHJhZ0Ryb3AgV0lORUxJQl9OQU1FKFJlZ2lzdGVyRHJhZ0Ryb3ApCiBXT1JEICAgICAgICBXSU5BUEkgUmVnaXN0ZXJXaW5kb3dNZXNzYWdlMTYoU0VHUFRSKTsKIFdPUkQgICAgICAgIFdJTkFQSSBSZWdpc3RlcldpbmRvd01lc3NhZ2UzMkEoTFBDU1RSKTsKIFdPUkQgICAgICAgIFdJTkFQSSBSZWdpc3RlcldpbmRvd01lc3NhZ2UzMlcoTFBDV1NUUik7CkBAIC04NzgyLDYgKzg4ODMsNyBAQAogQ09MT1JSRUYgICAgV0lOQVBJIFNldFBpeGVsMTYoSERDMTYsSU5UMTYsSU5UMTYsQ09MT1JSRUYpOwogQ09MT1JSRUYgICAgV0lOQVBJIFNldFBpeGVsMzIoSERDMzIsSU5UMzIsSU5UMzIsQ09MT1JSRUYpOwogI2RlZmluZSAgICAgU2V0UGl4ZWwgV0lORUxJQl9OQU1FKFNldFBpeGVsKQorQk9PTDMyICAgICAgV0lOQVBJIFNldFBpeGVsVjMyKEhEQzMyLElOVDMyLElOVDMyLENPTE9SUkVGKTsKIEJPT0wzMiAgICAgIFdJTkFQSSBTZXRQaXhlbEZvcm1hdChIREMzMixpbnQsUElYRUxGT1JNQVRERVNDUklQVE9SKik7CiBJTlQxNiAgICAgICBXSU5BUEkgU2V0UG9seUZpbGxNb2RlMTYoSERDMTYsSU5UMTYpOwogSU5UMzIgICAgICAgV0lOQVBJIFNldFBvbHlGaWxsTW9kZTMyKEhEQzMyLElOVDMyKTsKQEAgLTg5MDEsNiArOTAwMyw5IEBACiBCT09MMTYgICAgICBXSU5BUEkgU2V0V2luZG93UG9zMTYoSFdORDE2LEhXTkQxNixJTlQxNixJTlQxNixJTlQxNixJTlQxNixXT1JEKTsKIEJPT0wzMiAgICAgIFdJTkFQSSBTZXRXaW5kb3dQb3MzMihIV05EMzIsSFdORDMyLElOVDMyLElOVDMyLElOVDMyLElOVDMyLFdPUkQpOwogI2RlZmluZSAgICAgU2V0V2luZG93UG9zIFdJTkVMSUJfTkFNRShTZXRXaW5kb3dQb3MpCitJTlQxNiAgICAgICBXSU5BUEkgU2V0V2luZG93UmduMTYoSFdORDE2LEhSR04xNixCT09MMTYpOworSU5UMzIgICAgICAgV0lOQVBJIFNldFdpbmRvd1JnbjMyKEhXTkQzMixIUkdOMzIsQk9PTDMyKTsKKyNkZWZpbmUgICAgIFNldFdpbmRvd1JnbiBXSU5FTElCX05BTUUoU2V0V2luZG93UmduKQogdm9pZCAgICAgICAgV0lOQVBJIFNldFdpbmRvd1RleHQxNihIV05EMTYsU0VHUFRSKTsKIHZvaWQgICAgICAgIFdJTkFQSSBTZXRXaW5kb3dUZXh0MzJBKEhXTkQzMixMUENTVFIpOwogdm9pZCAgICAgICAgV0lOQVBJIFNldFdpbmRvd1RleHQzMlcoSFdORDMyLExQQ1dTVFIpOwpAQCAtOTA1NywxMCArOTE2MiwxOCBAQAogSFdORDE2ICAgICAgV0lOQVBJIFdpbmRvd0Zyb21Qb2ludDE2KFBPSU5UMTYpOwogSFdORDMyICAgICAgV0lOQVBJIFdpbmRvd0Zyb21Qb2ludDMyKFBPSU5UMzIpOwogI2RlZmluZSAgICAgV2luZG93RnJvbVBvaW50IFdJTkVMSUJfTkFNRShXaW5kb3dGcm9tUG9pbnQpCitCT09MMTYgICAgICBXSU5BUEkgV3JpdGVQcml2YXRlUHJvZmlsZVNlY3Rpb24xNihMUENTVFIsTFBDU1RSLExQQ1NUUik7CitCT09MMzIgICAgICBXSU5BUEkgV3JpdGVQcml2YXRlUHJvZmlsZVNlY3Rpb24zMkEoTFBDU1RSLExQQ1NUUixMUENTVFIpOworQk9PTDMyICAgICAgV0lOQVBJIFdyaXRlUHJpdmF0ZVByb2ZpbGVTZWN0aW9uMzJXKExQQ1dTVFIsTFBDV1NUUixMUENXU1RSKTsKKyNkZWZpbmUgICAgIFdyaXRlUHJpdmF0ZVByb2ZpbGVTZWN0aW9uIFdJTkVMSUJfTkFNRV9BVyhXcml0ZVByaXZhdGVQcm9maWxlU2VjdGlvbikKIEJPT0wxNiAgICAgIFdJTkFQSSBXcml0ZVByaXZhdGVQcm9maWxlU3RyaW5nMTYoTFBDU1RSLExQQ1NUUixMUENTVFIsTFBDU1RSKTsKIEJPT0wzMiAgICAgIFdJTkFQSSBXcml0ZVByaXZhdGVQcm9maWxlU3RyaW5nMzJBKExQQ1NUUixMUENTVFIsTFBDU1RSLExQQ1NUUik7CiBCT09MMzIgICAgICBXSU5BUEkgV3JpdGVQcml2YXRlUHJvZmlsZVN0cmluZzMyVyhMUENXU1RSLExQQ1dTVFIsTFBDV1NUUixMUENXU1RSKTsKICNkZWZpbmUgICAgIFdyaXRlUHJpdmF0ZVByb2ZpbGVTdHJpbmcgV0lORUxJQl9OQU1FX0FXKFdyaXRlUHJpdmF0ZVByb2ZpbGVTdHJpbmcpCitCT09MMTYgICAgICBXSU5BUEkgV3JpdGVQcml2YXRlUHJvZmlsZVN0cnVjdDE2KExQQ1NUUixMUENTVFIsTFBWT0lELFVJTlQxNixMUENTVFIpOworQk9PTDMyICAgICAgV0lOQVBJIFdyaXRlUHJpdmF0ZVByb2ZpbGVTdHJ1Y3QzMkEoTFBDU1RSLExQQ1NUUixMUFZPSUQsVUlOVDMyLExQQ1NUUik7CitCT09MMzIgICAgICBXSU5BUEkgV3JpdGVQcml2YXRlUHJvZmlsZVN0cnVjdDMyVyhMUENXU1RSLExQQ1dTVFIsTFBWT0lELFVJTlQzMixMUENXU1RSKTsKKyNkZWZpbmUgICAgIFdyaXRlUHJpdmF0ZVByb2ZpbGVTdHJ1Y3QgV0lORUxJQl9OQU1FX0FXKFdyaXRlUHJpdmF0ZVByb2ZpbGVTdHJ1Y3QpCiBCT09MMTYgICAgICBXSU5BUEkgV3JpdGVQcm9maWxlU3RyaW5nMTYoTFBDU1RSLExQQ1NUUixMUENTVFIpOwogQk9PTDMyICAgICAgV0lOQVBJIFdyaXRlUHJvZmlsZVN0cmluZzMyQShMUENTVFIsTFBDU1RSLExQQ1NUUik7CiBCT09MMzIgICAgICBXSU5BUEkgV3JpdGVQcm9maWxlU3RyaW5nMzJXKExQQ1dTVFIsTFBDV1NUUixMUENXU1RSKTsKQEAgLTkxNTQsOSArOTI2NywxMSBAQAogSFBFTjMyICAgICAgV0lOQVBJIEdldFN5c0NvbG9yUGVuMzIoSU5UMzIpOwogSU5UMzIgICAgICAgV0lOQVBJIExvYWRNZXNzYWdlMzJBKEhNT0RVTEUzMixVSU5UMzIsV09SRCxMUFNUUixJTlQzMik7CiBJTlQzMiAgICAgICBXSU5BUEkgTG9hZE1lc3NhZ2UzMlcoSE1PRFVMRTMyLFVJTlQzMixXT1JELExQV1NUUixJTlQzMik7CitVSU5UMzIgICAgICBXSU5BUEkgV0lOMTZfR2V0VGVtcERyaXZlKEJZVEUpOwogU0VHUFRSICAgICAgV0lOQVBJIFdJTjE2X0dsb2JhbExvY2sxNihIR0xPQkFMMTYpOwogU0VHUFRSICAgICAgV0lOQVBJIFdJTjE2X0xvY2tSZXNvdXJjZTE2KEhHTE9CQUwxNik7CiBMT05HICAgICAgICBXSU5BUEkgV0lOMTZfaHJlYWQoSEZJTEUxNixTRUdQVFIsTE9ORyk7CitVSU5UMTYgICAgICBXSU5BUEkgV0lOMTZfbHJlYWQoSEZJTEUxNixTRUdQVFIsVUlOVDE2KTsKIElOVDMyICAgICAgIFdJTkFQSSBsc3RybmNtcDMyQShMUENTVFIsTFBDU1RSLElOVDMyKTsKIElOVDMyICAgICAgIFdJTkFQSSBsc3RybmNtcDMyVyhMUENXU1RSLExQQ1dTVFIsSU5UMzIpOwogSU5UMzIgICAgICAgV0lOQVBJIGxzdHJuY21waTMyQShMUENTVFIsTFBDU1RSLElOVDMyKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvd2luZXJyb3IuaCBiL2luY2x1ZGUvd2luZXJyb3IuaAppbmRleCAxMmYxNzI3Li45MWRiNzk1IDEwMDY0NAotLS0gYS9pbmNsdWRlL3dpbmVycm9yLmgKKysrIGIvaW5jbHVkZS93aW5lcnJvci5oCkBAIC0yMiw2ICsyMiw5IEBACiAgKi8KICNkZWZpbmUgRVJST1JfVU5LTk9XTiAgICAgICAgICAgICAgIDk5OTk5CiAKKyNkZWZpbmUgU0VWRVJJVFlfU1VDQ0VTUyAgICAwCisjZGVmaW5lIFNFVkVSSVRZX0VSUk9SICAgICAgMQorCiAjZGVmaW5lIEVSUk9SX1NVQ0NFU1MgICAgICAgICAgICAgICAwCiAjZGVmaW5lIEVSUk9SX0ZJTEVfTk9UX0ZPVU5EICAgICAgICAyCiAjZGVmaW5lIEVSUk9SX1BBVEhfTk9UX0ZPVU5EICAgICAgICAzCmRpZmYgLS1naXQgYS9pbmNsdWRlL3dpbnR5cGVzLmggYi9pbmNsdWRlL3dpbnR5cGVzLmgKaW5kZXggYjQ4MDRiYS4uODk1Njc2ZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS93aW50eXBlcy5oCisrKyBiL2luY2x1ZGUvd2ludHlwZXMuaApAQCAtMTM1LDYgKzEzNSw3IEBACiBERUNMQVJFX0hBTkRMRShIQUNDRUwpOwogREVDTEFSRV9IQU5ETEUoSEJJVE1BUCk7CiBERUNMQVJFX0hBTkRMRShIQlJVU0gpOworREVDTEFSRV9IQU5ETEUoSENPTE9SU1BBQ0UpOwogREVDTEFSRV9IQU5ETEUoSENVUlNPUik7CiBERUNMQVJFX0hBTkRMRShIREMpOwogREVDTEFSRV9IQU5ETEUoSERST1ApOwpAQCAtMjQzLDYgKzI0NCw3IEBACiBERUNMX1dJTkVMSUJfVFlQRShIQU5ETEUpCiBERUNMX1dJTkVMSUJfVFlQRShIQklUTUFQKQogREVDTF9XSU5FTElCX1RZUEUoSEJSVVNIKQorREVDTF9XSU5FTElCX1RZUEUoSENPTE9SU1BBQ0UpCiBERUNMX1dJTkVMSUJfVFlQRShIQ1VSU09SKQogREVDTF9XSU5FTElCX1RZUEUoSERDKQogREVDTF9XSU5FTElCX1RZUEUoSERST1ApCmRpZmYgLS1naXQgYS9pbmNsdWRlL3gxMWRydi5oIGIvaW5jbHVkZS94MTFkcnYuaAppbmRleCAwYmI5YjI0Li41OTY4Mzg4IDEwMDY0NAotLS0gYS9pbmNsdWRlL3gxMWRydi5oCisrKyBiL2luY2x1ZGUveDExZHJ2LmgKQEAgLTk4LDcgKzk4LDcgQEAKIGV4dGVybiBCT09MMzIgWDExRFJWX1BvbHlQb2x5Z29uKCBzdHJ1Y3QgdGFnREMgKmRjLCBMUFBPSU5UMzIgcHQsCiAJCQkJICBMUElOVDMyIGNvdW50cywgVUlOVDMyIHBvbHlnb25zKTsKIGV4dGVybiBCT09MMzIgWDExRFJWX1BvbHlQb2x5bGluZSggc3RydWN0IHRhZ0RDICpkYywgTFBQT0lOVDMyIHB0LAotCQkJCSAgTFBJTlQzMiBjb3VudHMsIFVJTlQzMiBwb2x5bGluZXMpOworCQkJCSAgTFBEV09SRCBjb3VudHMsIERXT1JEIHBvbHlsaW5lcyk7CiAKIGV4dGVybiBIR0RJT0JKMzIgWDExRFJWX1NlbGVjdE9iamVjdCggc3RydWN0IHRhZ0RDICpkYywgSEdESU9CSjMyIGhhbmRsZSApOwogCmRpZmYgLS1naXQgYS9sb2FkZXIvZG9zL01ha2VmaWxlLmluIGIvbG9hZGVyL2Rvcy9NYWtlZmlsZS5pbgppbmRleCBjNjA1MDQ5Li42N2I0YzdhIDEwMDY0NAotLS0gYS9sb2FkZXIvZG9zL01ha2VmaWxlLmluCisrKyBiL2xvYWRlci9kb3MvTWFrZWZpbGUuaW4KQEAgLTksNyArOSw5IEBACiAJbW9kdWxlLmMgXAogCWRvc3ZtLmMKIAotYWxsOiAkKE1PRFVMRSkubyBkb3Ntb2QKK1BST0dSQU1TID0gZG9zbW9kCisKK2FsbDogJChNT0RVTEUpLm8gJChQUk9HUkFNUykKIAogZG9zbW9kOiBkb3Ntb2QuYwogCSQoQ0MpICQoQUxMQ0ZMQUdTKSAtbyBkb3Ntb2QgJDwKZGlmZiAtLWdpdCBhL2xvYWRlci9kb3MvZG9zbW9kLmMgYi9sb2FkZXIvZG9zL2Rvc21vZC5jCmluZGV4IGI1YWQyNGYuLjk4MDdlY2YgMTAwNjQ0Ci0tLSBhL2xvYWRlci9kb3MvZG9zbW9kLmMKKysrIGIvbG9hZGVyL2Rvcy9kb3Ntb2QuYwpAQCAtNiwxOCArNiwyNiBAQAogCiAjaWZkZWYgbGludXgKIAotLyogZm9yY2UgZG9zbW9kIGF0IGhpZ2ggYWRkcmVzc2VzICovCisvKiBhcHBhcmVudGx5IEVMRiBpbWFnZXMgYXJlIHVzdWFsbHkgbG9hZGVkIGhpZ2ggYW55d2F5ICovCisjaWZuZGVmIF9fRUxGX18KKy8qIGlmIG5vdCwgZm9yY2UgZG9zbW9kIGF0IGhpZ2ggYWRkcmVzc2VzICovCiBhc20oIi5vcmcgMHgxMTAwMDAiKTsKKyNlbmRpZiBfX0VMRl9fCiAKICNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgogI2luY2x1ZGUgPHN0cmluZy5oPgogI2luY2x1ZGUgPGVycm5vLmg+CiAjaW5jbHVkZSA8dW5pc3RkLmg+CiAjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzaWduYWwuaD4KICNpbmNsdWRlIDxzeXMvc3RhdC5oPgogI2luY2x1ZGUgPHN5cy9tbWFuLmg+CiAjaW5jbHVkZSA8c3lzL3ZtODYuaD4KICNpbmNsdWRlIDxzeXMvc3lzY2FsbC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9wdHJhY2UuaD4KKyNpbmNsdWRlIDxzeXMvd2FpdC5oPgogCiAvKiBGSVhNRTogaGFjayBiZWNhdXNlIGxpYmMgdm04NiBtYXkgYmUgdGhlIG9sZCBzeXNjYWxsIHZlcnNpb24gKi8KIHN0YXRpYyBfX2lubGluZV9fIGludCB2bTg2cGx1cyggaW50IGZ1bmMsIHN0cnVjdCB2bTg2cGx1c19zdHJ1Y3QgKnB0ciApCkBAIC01MCwxNiArNTgsMzcgQEAKICB2b2lkKmltZzsKICBzdHJ1Y3Qgdm04NnBsdXNfc3RydWN0IFZNODY7CiAgaW50IGZ1bmMscmV0OworIG9mZl90IGZvZnM9MDsKKyBwaWRfdCBwcGlkPWdldHBwaWQoKTsKICAKIC8qIGZwcmludGYoc3RkZXJyLCJtYWluIGlzIGF0ICUwOGx4LCBmaWxlIGlzICVzLCBmZD0lZFxuIiwodW5zaWduZWQgbG9uZykmbWFpbixhcmd2WzBdLG1mZCk7ICovCiAgaWYgKG1mZDwwKSByZXR1cm4gMTsKIC8qIE1hcCBpbiBvdXIgRE9TIGltYWdlIGF0IHRoZSBzdGFydCBvZiB0aGUgcHJvY2VzcyBhZGRyZXNzIHNwYWNlICovCi0gaW1nPW1tYXAoTlVMTCwweDExMDAwMCxQUk9UX0VYRUN8UFJPVF9SRUFEfFBST1RfV1JJVEUsTUFQX0ZJWEVEfE1BUF9TSEFSRUQsbWZkLDApOworIGlmIChhcmd2WzFdKSB7CisgIC8qIFVscmljaCBXZWlnYW5kIHN1Z2dlc3RlZCBtYXBwaW5nIGluIHRoZSBET1MgaW1hZ2UgZGlyZWN0bHkgZnJvbSB0aGUgV2luZQorICAgICBhZGRyZXNzIHNwYWNlICovCisgIGZvZnM9YXRvbChhcmd2WzFdKTsKKyAgLyogbGludXggY3VycmVudGx5IG9ubHkgYWxsb3dzIG1hcHBpbmcgYSBwcm9jZXNzIG1lbW9yeSBpZiBpdCdzIGJlaW5nIHB0cmFjZWQgKi8KKyAgLyogTGludXMgZG9lc24ndCBsaWtlIGl0LCBzbyB0aGlzIHByb2JhYmx5IHdvbid0IHdvcmsgaW4gdGhlIGZ1dHVyZSAqLworICAvKiBpdCBkb2Vzbid0IGV2ZW4gd29yayBmb3IgbWUgcmlnaHQgbm93ICovCisgIHB0cmFjZShQVFJBQ0VfQVRUQUNILHBwaWQsMCwwKTsKKyAga2lsbChwcGlkLFNJR1NUT1ApOworICB3YWl0cGlkKHBwaWQsTlVMTCwwKTsKKyB9CisgaW1nPW1tYXAoTlVMTCwweDExMDAwMCxQUk9UX0VYRUN8UFJPVF9SRUFEfFBST1RfV1JJVEUsTUFQX0ZJWEVEfE1BUF9TSEFSRUQsbWZkLGZvZnMpOworIGlmIChhcmd2WzFdKSB7CisgIHB0cmFjZShQVFJBQ0VfREVUQUNILHBwaWQsMCwwKTsKKyAga2lsbChwcGlkLFNJR0NPTlQpOworIH0KICBpZiAoaW1nPT0odm9pZCopLTEpIHsKICAgZnByaW50ZihzdGRlcnIsIkRPUyBtZW1vcnkgbWFwIGZhaWxlZCwgZXJyb3I9JXNcbiIsc3RyZXJyb3IoZXJybm8pKTsKKyAgZnByaW50ZihzdGRlcnIsImluIGF0dGVtcHQgdG8gbWFwICVzLCBvZmZzZXQgJTA4bFgsIGxlbmd0aCAxMTAwMDAsIHRvIG9mZnNldCAwXG4iLGFyZ3ZbMF0sZm9mcyk7CiAgIHJldHVybiAxOwogIH0KIC8qIGZwcmludGYoc3RkZXJyLCJTdWNjZXNzZnVsbHkgbWFwcGVkIERPUyBtZW1vcnksIGVudGVyaW5nIHZtODYgbG9vcFxuIik7ICovCisvKiByZXBvcnQgYmFjayB0byB0aGUgbWFpbiBwcm9ncmFtIHRoYXQgd2UncmUgcmVhZHkgKi8KKyByZXQ9MDsKKyB3cml0ZSgxLCZyZXQsc2l6ZW9mKHJldCkpOwogLyogY29udGV4dCBleGNoYW5nZSBsb29wICovCiAgZG8gewogICBpZiAocmVhZCgwLCZmdW5jLHNpemVvZihmdW5jKSkhPXNpemVvZihmdW5jKSkgcmV0dXJuIDE7CmRpZmYgLS1naXQgYS9sb2FkZXIvZG9zL2Rvc3ZtLmMgYi9sb2FkZXIvZG9zL2Rvc3ZtLmMKaW5kZXggMzgxOGRhYS4uZWMyZTkxZCAxMDA2NDQKLS0tIGEvbG9hZGVyL2Rvcy9kb3N2bS5jCisrKyBiL2xvYWRlci9kb3MvZG9zdm0uYwpAQCAtMiw2ICsyLDggQEAKICAqIERPUyBWaXJ0dWFsIE1hY2hpbmUKICAqCiAgKiBDb3B5cmlnaHQgMTk5OCBPdmUgS+V2ZW4KKyAqCisgKiBUaGlzIGNvZGUgaGFzbid0IGJlZW4gY29tcGxldGVseSBjbGVhbmVkIHVwIHlldC4KICAqLwogCiAjaWZkZWYgbGludXgKQEAgLTE3LDE0ICsxOSwxNiBAQAogI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CiAjaW5jbHVkZSAid2luZG93cy5oIgogI2luY2x1ZGUgIndpbmJhc2UuaCIKKyNpbmNsdWRlICJ3aW5udC5oIgogI2luY2x1ZGUgIm1zZG9zLmgiCiAjaW5jbHVkZSAibWlzY2VtdS5oIgogI2luY2x1ZGUgImRlYnVnLmgiCiAjaW5jbHVkZSAibW9kdWxlLmgiCisjaW5jbHVkZSAidGFzay5oIgogI2luY2x1ZGUgImxkdC5oIgogI2luY2x1ZGUgImRvc2V4ZS5oIgogCi12b2lkIERPU1ZNX0R1bXAoIExQRE9TVEFTSyBscERvc1Rhc2spCitzdGF0aWMgdm9pZCBET1NWTV9EdW1wKCBMUERPU1RBU0sgbHBEb3NUYXNrKQogewogIHVuc2lnbmVkIGlvZnM7CiAgQllURSppbnN0OwpAQCAtNDgsNiArNTIsNyBAQAogIGZwcmludGYoc3RkZXJyLCJBWD0lMDRsWCBDWD0lMDRsWCBEWD0lMDRsWCBCWD0lMDRsWFxuIixSRUdTLmVheCxSRUdTLmVieCxSRUdTLmVjeCxSRUdTLmVkeCk7CiAgZnByaW50ZihzdGRlcnIsIlNJPSUwNGxYIERJPSUwNGxYIFNQPSUwNGxYIEJQPSUwNGxYXG4iLFJFR1MuZXNpLFJFR1MuZWRpLFJFR1MuZXNwLFJFR1MuZWJwKTsKICBmcHJpbnRmKHN0ZGVyciwiQ1M9JTA0WCBEUz0lMDRYIEVTPSUwNFggU1M9JTA0WFxuIixSRUdTLmNzLFJFR1MuZHMsUkVHUy5lcyxSRUdTLnNzKTsKKyBmcHJpbnRmKHN0ZGVyciwiRUlQPSUwNGxYIEVGTEFHUz0lMDhsWFxuIixSRUdTLmVpcCxSRUdTLmVmbGFncyk7CiAKICBpb2ZzPSgoRFdPUkQpUkVHUy5jczw8NCkrUkVHUy5laXA7CiAjdW5kZWYgUkVHUwpAQCAtNTksOCArNjQsMTAgQEAKICBleGl0KDApOwogfQogCi1pbnQgRE9TVk1fSW50KGludCB2ZWN0LCBMUERPU1RBU0sgbHBEb3NUYXNrLCBQQ09OVEVYVCBjb250ZXh0ICkKK3N0YXRpYyBpbnQgRE9TVk1fSW50KGludCB2ZWN0LCBMUERPU1RBU0sgbHBEb3NUYXNrLCBQQ09OVEVYVCBjb250ZXh0ICkKIHsKKyAvKiB3ZSBzaG91bGQgcmVhbGx5IG1hcCB0byBpZjE2MzIvd3Byb2NzLnNwZWMsIGJ1dCBub3QgYWxsCisgICAgaW50ZXJydXB0IGhhbmRsZXJzIGFyZSBhZGFwdGVkIHRvIHN1cHBvcnQgb3VyIFZNIHlldCAqLwogIHN3aXRjaCAodmVjdCkgewogICBjYXNlIDB4MjA6CiAgICByZXR1cm4gLTE7CkBAIC02OCwyMSArNzUsMzAgQEAKICAgIGlmIChBSF9yZWcoY29udGV4dCk9PTB4NGMpIHJldHVybiAtMTsKICAgIERPUzNDYWxsKGNvbnRleHQpOwogICAgYnJlYWs7CisgIGNhc2UgMHgxYToKKyAgIElOVF9JbnQxYUhhbmRsZXIoY29udGV4dCk7CisgICBicmVhazsKKyAgY2FzZSAweDJmOgorICAgSU5UX0ludDJmSGFuZGxlcihjb250ZXh0KTsKKyAgIGJyZWFrOwogIH0KICByZXR1cm4gMDsKIH0KIAorI2RlZmluZSBDViBDUChlYXgsRWF4KTsgQ1AoZWN4LEVjeCk7IENQKGVkeCxFZHgpOyBDUChlYngsRWJ4KTsgXAorICAgICAgICAgICBDUChlc2ksRXNpKTsgQ1AoZWRpLEVkaSk7IENQKGVzcCxFc3ApOyBDUChlYnAsRWJwKTsgXAorICAgICAgICAgICBDUChjcyxTZWdDcyk7IENQKGRzLFNlZ0RzKTsgQ1AoZXMsU2VnRXMpOyBcCisgICAgICAgICAgIENQKHNzLFNlZ1NzKTsgQ1AoZnMsU2VnRnMpOyBDUChncyxTZWdHcyk7IFwKKyAgICAgICAgICAgQ1AoZWlwLEVpcCk7IENQKGVmbGFncyxFRmxhZ3MpCisKIGludCBET1NWTV9Qcm9jZXNzKCBMUERPU1RBU0sgbHBEb3NUYXNrICkKIHsKICBDT05URVhUIGNvbnRleHQ7CiAgaW50IHJldD0wOwogCi0jZGVmaW5lIFJFR1MgbHBEb3NUYXNrLT5WTTg2LnJlZ3MKLSBjb250ZXh0LkVheD1SRUdTLmVheDsgY29udGV4dC5FY3g9UkVHUy5lY3g7IGNvbnRleHQuRWR4PVJFR1MuZWR4OyBjb250ZXh0LkVieD1SRUdTLmVieDsKLSBjb250ZXh0LkVzaT1SRUdTLmVzaTsgY29udGV4dC5FZGk9UkVHUy5lZGk7IGNvbnRleHQuRXNwPVJFR1MuZXNwOyBjb250ZXh0LkVicD1SRUdTLmVicDsKLSBjb250ZXh0LlNlZ0NzPVJFR1MuY3M7IGNvbnRleHQuU2VnRHM9UkVHUy5kczsgY29udGV4dC5TZWdFcz1SRUdTLmVzOwotIGNvbnRleHQuU2VnU3M9UkVHUy5zczsgY29udGV4dC5TZWdGcz1SRUdTLmZzOyBjb250ZXh0LlNlZ0dzPVJFR1MuZ3M7Ci0gY29udGV4dC5FaXA9UkVHUy5laXA7IGNvbnRleHQuRUZsYWdzPVJFR1MuZWZsYWdzOworI2RlZmluZSBDUCh4LHkpIGNvbnRleHQueSA9IGxwRG9zVGFzay0+Vk04Ni5yZWdzLngKKyBDVjsKKyN1bmRlZiBDUAogICh2b2lkKilWODZCQVNFKCZjb250ZXh0KT1scERvc1Rhc2stPmltZzsKIAogIHN3aXRjaCAoVk04Nl9UWVBFKGxwRG9zVGFzay0+Zm4pKSB7CkBAIC0xMDYsMTMgKzEyMiw2NyBAQAogIH0KIAogIGxwRG9zVGFzay0+Zm49Vk04Nl9FTlRFUjsKLSBSRUdTLmVheD1jb250ZXh0LkVheDsgUkVHUy5lY3g9Y29udGV4dC5FY3g7IFJFR1MuZWR4PWNvbnRleHQuRWR4OyBSRUdTLmVieD1jb250ZXh0LkVieDsKLSBSRUdTLmVzaT1jb250ZXh0LkVzaTsgUkVHUy5lZGk9Y29udGV4dC5FZGk7IFJFR1MuZXNwPWNvbnRleHQuRXNwOyBSRUdTLmVicD1jb250ZXh0LkVicDsKLSBSRUdTLmNzPWNvbnRleHQuU2VnQ3M7IFJFR1MuZHM9Y29udGV4dC5TZWdEczsgUkVHUy5lcz1jb250ZXh0LlNlZ0VzOwotIFJFR1Muc3M9Y29udGV4dC5TZWdTczsgUkVHUy5mcz1jb250ZXh0LlNlZ0ZzOyBSRUdTLmdzPWNvbnRleHQuU2VnR3M7Ci0gUkVHUy5laXA9Y29udGV4dC5FaXA7IFJFR1MuZWZsYWdzPWNvbnRleHQuRUZsYWdzOwotI3VuZGVmIFJFR1MKKyNkZWZpbmUgQ1AoeCx5KSBscERvc1Rhc2stPlZNODYucmVncy54ID0gY29udGV4dC55CisgQ1Y7CisjdW5kZWYgQ1AKICByZXR1cm4gcmV0OwogfQogCitpbnQgRE9TVk1fRW50ZXIoIFBDT05URVhUIGNvbnRleHQgKQoreworIFREQiAqcFRhc2sgPSAoVERCICopR2xvYmFsTG9jazE2KCBHZXRDdXJyZW50VGFzaygpICk7CisgTkVfTU9EVUxFICpwTW9kdWxlID0gTkVfR2V0UHRyKCBwVGFzay0+aE1vZHVsZSApOworIExQRE9TVEFTSyBscERvc1Rhc2s7CisgaW50IHN0YXQ7CisKKyBHbG9iYWxVbmxvY2sxNiggR2V0Q3VycmVudFRhc2soKSApOworIGlmICghcE1vZHVsZSkgeworICBFUlIobW9kdWxlLCJObyB0YXNrIGlzIGN1cnJlbnRseSBhY3RpdmUhXG4iKTsKKyAgcmV0dXJuIC0xOworIH0KKyBpZiAoIXBNb2R1bGUtPmxwRG9zVGFzaykgeworICAvKiBubyBWTTg2IChkb3Ntb2QpIHRhc2sgaXMgY3VycmVudGx5IHJ1bm5pbmcsIHN0YXJ0IG9uZSAqLworICBpZiAoKGxwRG9zVGFzayA9IGNhbGxvYygxLCBzaXplb2YoRE9TVEFTSykpKSA9PSBOVUxMKQorICAgIHJldHVybiAwOworICBscERvc1Rhc2stPmltZz1ET1NNRU1fTWVtb3J5QmFzZShwTW9kdWxlLT5zZWxmKTsKKyAgbHBEb3NUYXNrLT5oTW9kdWxlPXBNb2R1bGUtPnNlbGY7CisgIHN0YXQ9TVpfSW5pdFRhc2sobHBEb3NUYXNrKTsKKyAgaWYgKHN0YXQ8MzIpIHsKKyAgIGZyZWUobHBEb3NUYXNrKTsKKyAgIHJldHVybiAtMTsKKyAgfQorICBwTW9kdWxlLT5scERvc1Rhc2sgPSBscERvc1Rhc2s7CisgIHBNb2R1bGUtPmRvc19pbWFnZSA9IGxwRG9zVGFzay0+aW1nOworICAvKiBOb3RlOiB3ZSdyZSBsZWF2aW5nIGl0IHJ1bm5pbmcgYWZ0ZXIgdGhpcywgaW4gY2FzZSB3ZSBuZWVkIGl0IGFnYWluLAorICAgICBhcyB0aGlzIG1pbmltaXplcyB0aGUgb3ZlcmhlYWQgb2Ygc3RhcnRpbmcgaXQgdXAgZXZlcnkgdGltZS4uLgorICAgICBpdCB3aWxsIGJlIGtpbGxlZCBhdXRvbWF0aWNhbGx5IHdoZW4gdGhlIGN1cnJlbnQgdGFzayB0ZXJtaW5hdGVzICovCisgfSBlbHNlIGxwRG9zVGFzaz1wTW9kdWxlLT5scERvc1Rhc2s7CisKKyBpZiAoY29udGV4dCkgeworI2RlZmluZSBDUCh4LHkpIGxwRG9zVGFzay0+Vk04Ni5yZWdzLnggPSBjb250ZXh0LT55CisgIENWOworI3VuZGVmIENQCisgfQorCisgLyogbWFpbiBsb29wICovCisgd2hpbGUgKChzdGF0ID0gTVpfUnVuTW9kdWxlKGxwRG9zVGFzaykpID49IDApCisgIGlmIChzdGF0ID4gMCAmJiBET1NWTV9Qcm9jZXNzKGxwRG9zVGFzaykgPCAwKQorICAgYnJlYWs7CisKKyBpZiAoY29udGV4dCkgeworI2RlZmluZSBDUCh4LHkpIGNvbnRleHQtPnkgPSBscERvc1Rhc2stPlZNODYucmVncy54CisgIENWOworI3VuZGVmIENQCisgfQorIHJldHVybiAwOworfQorCisjZWxzZSAvKiAhbGludXggKi8KKworaW50IERPU1ZNX0VudGVyKCBQQ09OVEVYVCBjb250ZXh0ICkKK3sKKyBFUlIobW9kdWxlLCJET1MgcmVhbG1vZGUgbm90IHN1cHBvcnRlZCBvbiB0aGlzIGFyY2hpdGVjdHVyZSFcbiIpOworIHJldHVybiAtMTsKK30KKwogI2VuZGlmIC8qIGxpbnV4ICovCmRpZmYgLS1naXQgYS9sb2FkZXIvZG9zL21vZHVsZS5jIGIvbG9hZGVyL2Rvcy9tb2R1bGUuYwppbmRleCAwNTNjMmMzLi5jY2UzMDhmIDEwMDY0NAotLS0gYS9sb2FkZXIvZG9zL21vZHVsZS5jCisrKyBiL2xvYWRlci9kb3MvbW9kdWxlLmMKQEAgLTIsNiArMiw4IEBACiAgKiBET1MgKE1aKSBsb2FkZXIKICAqCiAgKiBDb3B5cmlnaHQgMTk5OCBPdmUgS+V2ZW4KKyAqCisgKiBUaGlzIGNvZGUgaGFzbid0IGJlZW4gY29tcGxldGVseSBjbGVhbmVkIHVwIHlldC4KICAqLwogCiAjaWZkZWYgbGludXgKQEAgLTE1LDE2ICsxNyw4IEBACiAjaW5jbHVkZSA8dW5pc3RkLmg+CiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiAjaW5jbHVkZSA8c3lzL3N0YXQuaD4KLSNpZmRlZiBNWl9VU0VTWVNWCi0jaW5jbHVkZSA8c3lzL2lwYy5oPgotI2luY2x1ZGUgPHN5cy9zaG0uaD4KLSNlbHNlCiAjaW5jbHVkZSA8c3lzL21tYW4uaD4KLSNlbmRpZgogI2luY2x1ZGUgPHN5cy92bTg2Lmg+Ci0jaWZkZWYgTVpfVVNFU1lTVgotI2luY2x1ZGUgPGxpbnV4L21tLmg+IC8qIEZJWE1FOiB3aGVyZSBlbHNlIHNob3VsZCBJIGZldGNoIHRoZSBQQUdFX1NJWkUgZGVmaW5lPyAqLwotI2VuZGlmCiAjaW5jbHVkZSAid2luZG93cy5oIgogI2luY2x1ZGUgIndpbmJhc2UuaCIKICNpbmNsdWRlICJtb2R1bGUuaCIKQEAgLTM1LDE1ICsyOSwxNCBAQAogI2luY2x1ZGUgImRlYnVnLmgiCiAjaW5jbHVkZSAiZG9zZXhlLmgiCiAKKy8qIGRlZmluZSB0aGlzIHRvIHRyeSBtYXBwaW5nIHRocm91Z2ggL3Byb2MvcGlkL21lbSBpbnN0ZWFkIG9mIGEgdGVtcCBmaWxlLAorICAgYnV0IExpbnVzIGRvZXNuJ3QgbGlrZSBtbWFwcGluZyAvcHJvYy9waWQvbWVtLCBzbyBpdCBkb2Vzbid0IHdvcmsgZm9yIG1lICovCisjdW5kZWYgTVpfTUFQU0VMRgorCiAjZGVmaW5lIEJJT1NfREFUQV9TRUdNRU5UIDB4NDAKICNkZWZpbmUgQklPU19TRUdNRU5UIEJJT1NTRUcgLyogQklPU1NFRyBpcyBkZWZpbmVkIHRvIDB4ZjAwMCBpbiBzeXMvdm04Ni5oICovCiAjZGVmaW5lIFNUVUJfU0VHTUVOVCBCSU9TX1NFR01FTlQKLSNpZmRlZiBNWl9VU0VTWVNWCi0vKiBpdCBtaWdodCBiZSB0aGF0IFNZU1Ygc3VwcG9ydHMgU1RBUlRfT0ZGU0VUIDAgYWZ0ZXIgYWxsLCBoYXZlbid0IGNoZWNrZWQgKi8KLSNkZWZpbmUgU1RBUlRfT0ZGU0VUIFBBR0VfU0laRQotI2Vsc2UKICNkZWZpbmUgU1RBUlRfT0ZGU0VUIDAKLSNlbmRpZgogI2RlZmluZSBQU1BfU0laRSAweDEwCiAKICNkZWZpbmUgU0VHMTYocHRyLHNlZykgKChMUFZPSUQpKChCWVRFKilwdHIrKChEV09SRCkoc2VnKTw8NCkpKQpAQCAtODAsNyArNzMsMTAgQEAKICBwc3AtPm5leHRQYXJhZ3JhcGg9MHg5RkZGOwogIC8qIGNvcHkgcGFyYW1ldGVycyAqLwogIGlmIChjbWQpIHsKKyNpZiAwCisgIC8qIGNvbW1hbmQuY29tIGRvZXNuJ3QgZG8gdGhpcyAqLwogICB3aGlsZSAoKmNtZCA9PSAnICcpIGNtZCsrOworI2VuZGlmCiAgIHBzcC0+Y21kTGluZVswXT1zdHJsZW4oY21kKTsKICAgc3RyY3B5KHBzcC0+Y21kTGluZSsxLGNtZCk7CiAgIHBzcC0+Y21kTGluZVtwc3AtPmNtZExpbmVbMF0rMV09J1xyJzsKQEAgLTg5LDExICs4NSwxMSBAQAogIC8qIEZJWE1FOiBpbnRlZ3JhdGUgdGhlIFBEQiBzdHVmZiBmcm9tIFdpbmUgKGxvYWRlci90YXNrLmMpICovCiB9CiAKLXN0YXRpYyBpbnQgTVpfTG9hZEltYWdlKCBIRklMRTE2IGhGaWxlLCBMUENTVFIgY21kbGluZSwgTFBDU1RSIGVudiwgTFBET1NUQVNLIGxwRG9zVGFzayApCitzdGF0aWMgaW50IE1aX0xvYWRJbWFnZSggSEZJTEUxNiBoRmlsZSwgTFBDU1RSIGNtZGxpbmUsIExQQ1NUUiBlbnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgTFBET1NUQVNLIGxwRG9zVGFzaywgTkVfTU9EVUxFICpwTW9kdWxlICkKIHsKICBJTUFHRV9ET1NfSEVBREVSIG16X2hlYWRlcjsKICBEV09SRCBpbWFnZV9zdGFydCxpbWFnZV9zaXplLG1pbl9zaXplLG1heF9zaXplLGF2YWlsOwotIFdPUkQgcHNwX3NlZyxsb2FkX3NlZzsKICBCWVRFKnBzcF9zdGFydCwqbG9hZF9zdGFydDsKICBpbnQgeDsKICBTRUdQVFIgcmVsb2M7CkBAIC0xMTEsMTAgKzEwNywxMCBAQAogCiAgLyogYWxsb2NhdGUgMU1CKzY0SyBzaGFyZWQgbWVtb3J5ICovCiAgbHBEb3NUYXNrLT5pbWdfb2ZzPVNUQVJUX09GRlNFVDsKLSNpZmRlZiBNWl9VU0VTWVNWCi0gbHBEb3NUYXNrLT5rZXk9ZnRvaygiLiIsJ2QnKTsgLyogRklYTUU6IHRoaXMgaXMgZnJvbSBteSBJUEMgaW50cm8gZG9jICovCi0gbHBEb3NUYXNrLT5zaG1faWQ9c2htZ2V0KGxwRG9zVGFzay0+a2V5LDB4MTEwMDAwLVNUQVJUX09GRlNFVCxJUENfQ1JFQVR8U0hNX1J8U0hNX1cpOwotIGxwRG9zVGFzay0+aW1nPXNobWF0KGxwRG9zVGFzay0+c2htX2lkLE5VTEwsMCk7CisjaWZkZWYgTVpfTUFQU0VMRgorIGxwRG9zVGFzay0+aW1nPVZpcnR1YWxBbGxvYyhOVUxMLDB4MTEwMDAwLE1FTV9DT01NSVQsUEFHRV9SRUFEV1JJVEUpOworIC8qIG1ha2Ugc3VyZSBtbWFwIGFjY2VwdHMgaXQgKi8KKyAoKGNoYXIqKWxwRG9zVGFzay0+aW1nKVsweDEwRkZGRl09MDsKICNlbHNlCiAgdG1wbmFtKGxwRG9zVGFzay0+bW1fbmFtZSk7CiAvKiBzdHJjcHkobHBEb3NUYXNrLT5tbV9uYW1lLCIvdG1wL215ZG9zaW1hZ2UiKTsgKi8KQEAgLTEzMSw2ICsxMjcsNyBAQAogICByZXR1cm4gMDsKICB9CiAgVFJBQ0UobW9kdWxlLCJET1MgVk04NiBpbWFnZSBtYXBwZWQgYXQgJTA4bHhcbiIsKERXT1JEKWxwRG9zVGFzay0+aW1nKTsKKyBwTW9kdWxlLT5kb3NfaW1hZ2U9bHBEb3NUYXNrLT5pbWc7CiAKICAvKiBpbml0aWFsaXplIHRoZSBtZW1vcnkgKi8KICBNWl9Jbml0U3lzdGVtKGxwRG9zVGFzay0+aW1nKTsKQEAgLTE0NywxMiArMTQ0LDEyIEBACiAgIHJldHVybiAwOwogIH0KICBpZiAoYXZhaWw+bWF4X3NpemUpIGF2YWlsPW1heF9zaXplOwotIHBzcF9zdGFydD1ET1NNRU1fR2V0QmxvY2sobHBEb3NUYXNrLT5oTW9kdWxlLGF2YWlsLCZwc3Bfc2VnKTsKKyBwc3Bfc3RhcnQ9RE9TTUVNX0dldEJsb2NrKGxwRG9zVGFzay0+aE1vZHVsZSxhdmFpbCwmbHBEb3NUYXNrLT5wc3Bfc2VnKTsKICBpZiAoIXBzcF9zdGFydCkgewogICBFUlIobW9kdWxlLCAiZXJyb3IgYWxsb2NhdGluZyBET1MgbWVtb3J5XG4iKTsKICAgcmV0dXJuIDA7CiAgfQotIGxvYWRfc2VnPXBzcF9zZWcrUFNQX1NJWkU7CisgbHBEb3NUYXNrLT5sb2FkX3NlZz1scERvc1Rhc2stPnBzcF9zZWcrUFNQX1NJWkU7CiAgbG9hZF9zdGFydD1wc3Bfc3RhcnQrKFBTUF9TSVpFPDw0KTsKICBNWl9Jbml0UFNQKHBzcF9zdGFydCwgY21kbGluZSwgZW52KTsKIApAQCAtMTY5LDI2ICsxNjYsMjcgQEAKICBmb3IgKHg9MDsgeDxtel9oZWFkZXIuZV9jcmxjOyB4KyspIHsKICAgaWYgKF9scmVhZDE2KGhGaWxlLCZyZWxvYyxzaXplb2YocmVsb2MpKSAhPSBzaXplb2YocmVsb2MpKQogICAgcmV0dXJuIDExOyAvKiBpbnZhbGlkIGV4ZSAqLwotICAqKFdPUkQqKVNFR1BUUjE2KGxvYWRfc3RhcnQscmVsb2MpKz1sb2FkX3NlZzsKKyAgKihXT1JEKilTRUdQVFIxNihsb2FkX3N0YXJ0LHJlbG9jKSs9bHBEb3NUYXNrLT5sb2FkX3NlZzsKICB9CiAKICAvKiBpbml0aWFsaXplIHZtODYgc3RydWN0ICovCiAgbWVtc2V0KCZscERvc1Rhc2stPlZNODYsMCxzaXplb2YobHBEb3NUYXNrLT5WTTg2KSk7Ci0gbHBEb3NUYXNrLT5WTTg2LnJlZ3MuY3M9bG9hZF9zZWcrbXpfaGVhZGVyLmVfY3M7CisgbHBEb3NUYXNrLT5WTTg2LnJlZ3MuY3M9bHBEb3NUYXNrLT5sb2FkX3NlZyttel9oZWFkZXIuZV9jczsKICBscERvc1Rhc2stPlZNODYucmVncy5laXA9bXpfaGVhZGVyLmVfaXA7Ci0gbHBEb3NUYXNrLT5WTTg2LnJlZ3Muc3M9bG9hZF9zZWcrbXpfaGVhZGVyLmVfc3M7CisgbHBEb3NUYXNrLT5WTTg2LnJlZ3Muc3M9bHBEb3NUYXNrLT5sb2FkX3NlZyttel9oZWFkZXIuZV9zczsKICBscERvc1Rhc2stPlZNODYucmVncy5lc3A9bXpfaGVhZGVyLmVfc3A7Ci0gbHBEb3NUYXNrLT5WTTg2LnJlZ3MuZHM9cHNwX3NlZzsKLSBscERvc1Rhc2stPlZNODYucmVncy5lcz1wc3Bfc2VnOworIGxwRG9zVGFzay0+Vk04Ni5yZWdzLmRzPWxwRG9zVGFzay0+cHNwX3NlZzsKKyBscERvc1Rhc2stPlZNODYucmVncy5lcz1scERvc1Rhc2stPnBzcF9zZWc7CiAgLyogaG1tLCB3aGF0IGVsc2UgZG8gd2UgbmVlZD8gKi8KIAogIHJldHVybiAzMjsKIH0KIAotc3RhdGljIGludCBNWl9Jbml0VGFzayggTFBET1NUQVNLIGxwRG9zVGFzayApCitpbnQgTVpfSW5pdFRhc2soIExQRE9TVEFTSyBscERvc1Rhc2sgKQogewogIGludCByZWFkX2ZkWzJdLHdyaXRlX2ZkWzJdOwogIHBpZF90IGNoaWxkOworIGNoYXIgKmZuYW1lLCpmYXJnLGFyZ1sxNl0sZnByb2NbNjRdOwogCiAgLyogY3JlYXRlIHJlYWQgcGlwZSAqLwogIGlmIChwaXBlKHJlYWRfZmQpPDApIHJldHVybiAwOwpAQCAtMTk5LDE1ICsxOTcsMzYgQEAKICBscERvc1Rhc2stPndyaXRlX3BpcGU9d3JpdGVfZmRbMV07CiAgbHBEb3NUYXNrLT5mbj1WTTg2X0VOVEVSOwogIGxwRG9zVGFzay0+c3RhdGU9MTsKLSBUUkFDRShtb2R1bGUsIlByZXBhcmluZyB0byBsb2FkIERPUyBFWEUgc3VwcG9ydCBtb2R1bGU6IGZvcmtpbmdcbiIpOworIC8qIGlmIHdlIGhhdmUgYSBtYXBwaW5nIGZpbGUsIHVzZSBpdCAqLworIGZuYW1lPWxwRG9zVGFzay0+bW1fbmFtZTsgZmFyZz1OVUxMOworIGlmICghZm5hbWVbMF0pIHsKKyAgLyogb3RoZXJ3aXNlLCBtYXAgb3VyIG93biBtZW1vcnkgaW1hZ2UgKi8KKyAgc3ByaW50ZihmcHJvYywiL3Byb2MvJWQvbWVtIixnZXRwaWQoKSk7CisgIHNwcmludGYoYXJnLCIlbGQiLCh1bnNpZ25lZCBsb25nKWxwRG9zVGFzay0+aW1nKTsKKyAgZm5hbWU9ZnByb2M7IGZhcmc9YXJnOworIH0KKworIFRSQUNFKG1vZHVsZSwiUHJlcGFyaW5nIHRvIGxvYWQgRE9TIFZNIHN1cHBvcnQgbW9kdWxlOiBmb3JraW5nXG4iKTsKICBpZiAoKGNoaWxkPWZvcmsoKSk8MCkgewogICBjbG9zZSh3cml0ZV9mZFswXSk7IGNsb3NlKHdyaXRlX2ZkWzFdKTsKICAgY2xvc2UocmVhZF9mZFswXSk7IGNsb3NlKHJlYWRfZmRbMV0pOyByZXR1cm4gMDsKICB9CiAgaWYgKGNoaWxkIT0wKSB7CiAgIC8qIHBhcmVudCBwcm9jZXNzICovCisgIGludCByZXQ7CisKICAgY2xvc2UocmVhZF9mZFsxXSk7IGNsb3NlKHdyaXRlX2ZkWzBdKTsKICAgbHBEb3NUYXNrLT50YXNrPWNoaWxkOworICAvKiB3YWl0IGZvciBjaGlsZCBwcm9jZXNzIHRvIHNpZ25hbCByZWFkaW5lc3MgKi8KKyAgZG8geworICAgaWYgKHJlYWQobHBEb3NUYXNrLT5yZWFkX3BpcGUsJnJldCxzaXplb2YocmV0KSkhPXNpemVvZihyZXQpKSB7CisgICAgaWYgKChlcnJubz09RUlOVFIpfHwoZXJybm89PUVBR0FJTikpIGNvbnRpbnVlOworICAgIC8qIGZhaWx1cmUgKi8KKyAgICBFUlIobW9kdWxlLCJkb3Ntb2QgaGFzIGZhaWxlZCB0byBpbml0aWFsaXplXG4iKTsKKyAgICByZXR1cm4gMDsKKyAgIH0KKyAgfSB3aGlsZSAoMCk7CisgIC8qIGFsbCBzeXN0ZW1zIGFyZSBub3cgZ28gKi8KICB9IGVsc2UgewogICAvKiBjaGlsZCBwcm9jZXNzICovCiAgIGNsb3NlKHJlYWRfZmRbMF0pOyBjbG9zZSh3cml0ZV9mZFsxXSk7CkBAIC0yMTUsOSArMjM0LDkgQEAKICAgZHVwMih3cml0ZV9mZFswXSwwKTsgICAgICAvKiBzdGRpbiAqLwogICBkdXAyKHJlYWRfZmRbMV0sMSk7ICAgICAgIC8qIHN0ZG91dCAqLwogICAvKiBub3cgbG9hZCBkb3Ntb2QgKi8KLSAgZXhlY2xwKCJkb3Ntb2QiLGxwRG9zVGFzay0+bW1fbmFtZSxOVUxMKTsKLSAgZXhlY2woImRvc21vZCIsbHBEb3NUYXNrLT5tbV9uYW1lLE5VTEwpOwotICBleGVjbCgibG9hZGVyL2Rvcy9kb3Ntb2QiLGxwRG9zVGFzay0+bW1fbmFtZSxOVUxMKTsKKyAgZXhlY2xwKCJkb3Ntb2QiLGZuYW1lLGZhcmcsTlVMTCk7CisgIGV4ZWNsKCJkb3Ntb2QiLGZuYW1lLGZhcmcsTlVMTCk7CisgIGV4ZWNsKCJsb2FkZXIvZG9zL2Rvc21vZCIsZm5hbWUsZmFyZyxOVUxMKTsKICAgLyogaWYgZmFpbHVyZSwgZXhpdCAqLwogICBFUlIobW9kdWxlLCJGYWlsZWQgdG8gc3Bhd24gZG9zbW9kLCBlcnJvcj0lc1xuIixzdHJlcnJvcihlcnJubykpOwogICBleGl0KDEpOwpAQCAtMjI1LDggKzI0NCw4IEBACiAgcmV0dXJuIDMyOwogfQogCi1ISU5TVEFOQ0UxNiBNWl9Mb2FkTW9kdWxlKCBMUENTVFIgbmFtZSwgTFBDU1RSIGNtZGxpbmUsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBDU1RSIGVudiwgVUlOVDE2IHNob3dfY21kICkKK0hJTlNUQU5DRTE2IE1aX0NyZWF0ZVByb2Nlc3MoIExQQ1NUUiBuYW1lLCBMUENTVFIgY21kbGluZSwgTFBDU1RSIGVudiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUFNUQVJUVVBJTkZPMzJBIHN0YXJ0dXAsIExQUFJPQ0VTU19JTkZPUk1BVElPTiBpbmZvICkKIHsKICBMUERPU1RBU0sgbHBEb3NUYXNrOwogIEhNT0RVTEUxNiBoTW9kdWxlOwpAQCAtMjM0LDcgKzI1Myw2IEBACiAgTkVfTU9EVUxFICpwTW9kdWxlOwogIEhGSUxFMTYgaEZpbGU7CiAgT0ZTVFJVQ1Qgb2ZzOwotIFBST0NFU1NfSU5GT1JNQVRJT04gaW5mbzsKICBpbnQgZXJyOwogCiAgaWYgKChscERvc1Rhc2sgPSBjYWxsb2MoMSwgc2l6ZW9mKERPU1RBU0spKSkgPT0gTlVMTCkKQEAgLTI1MiwyOSArMjcwLDQxIEBACiAgcE1vZHVsZS0+bHBEb3NUYXNrID0gbHBEb3NUYXNrOwogIAogIGxwRG9zVGFzay0+aW1nPU5VTEw7IGxwRG9zVGFzay0+bW1fbmFtZVswXT0wOyBscERvc1Rhc2stPm1tX2ZkPS0xOwotIGVyciA9IE1aX0xvYWRJbWFnZSggaEZpbGUsIGNtZGxpbmUsIGVudiwgbHBEb3NUYXNrICk7CisgZXJyID0gTVpfTG9hZEltYWdlKCBoRmlsZSwgY21kbGluZSwgZW52LCBscERvc1Rhc2ssIHBNb2R1bGUgKTsKICBfbGNsb3NlMTYoaEZpbGUpOworIHBNb2R1bGUtPmRvc19pbWFnZSA9IGxwRG9zVGFzay0+aW1nOwogIGlmIChlcnI8MzIpIHsKLSAgaWYgKGxwRG9zVGFzay0+aW1nIT1OVUxMKSBtdW5tYXAobHBEb3NUYXNrLT5pbWcsMHgxMTAwMDAtU1RBUlRfT0ZGU0VUKTsKLSAgaWYgKGxwRG9zVGFzay0+bW1fZmQ+PTApIGNsb3NlKGxwRG9zVGFzay0+bW1fZmQpOwotICBpZiAobHBEb3NUYXNrLT5tbV9uYW1lWzBdIT0wKSB1bmxpbmsobHBEb3NUYXNrLT5tbV9uYW1lKTsKKyAgaWYgKGxwRG9zVGFzay0+bW1fbmFtZVswXSE9MCkgeworICAgaWYgKGxwRG9zVGFzay0+aW1nIT1OVUxMKSBtdW5tYXAobHBEb3NUYXNrLT5pbWcsMHgxMTAwMDAtU1RBUlRfT0ZGU0VUKTsKKyAgIGlmIChscERvc1Rhc2stPm1tX2ZkPj0wKSBjbG9zZShscERvc1Rhc2stPm1tX2ZkKTsKKyAgIHVubGluayhscERvc1Rhc2stPm1tX25hbWUpOworICB9IGVsc2UKKyAgIGlmIChscERvc1Rhc2stPmltZyE9TlVMTCkgVmlydHVhbEZyZWUobHBEb3NUYXNrLT5pbWcsMHgxMTAwMDAsTUVNX1JFTEVBU0UpOwogICByZXR1cm4gZXJyOwogIH0KLSBNWl9Jbml0VGFzayggbHBEb3NUYXNrICk7CisgZXJyID0gTVpfSW5pdFRhc2soIGxwRG9zVGFzayApOworIGlmIChscERvc1Rhc2stPm1tX25hbWVbMF0hPTApIHsKKyAgLyogd2UgdW5saW5rIHRoZSB0ZW1wIGZpbGUgaGVyZSB0byBhdm9pZCBsZWF2aW5nIGEgbWVzcyBpbiAvdG1wCisgICAgIGlmL3doZW4gV2luZSBjcmFzaGVzOyB0aGUgbWFwcGluZyBzdGlsbCByZW1haW5zIG9wZW4sIHRob3VnaCAqLworICB1bmxpbmsobHBEb3NUYXNrLT5tbV9uYW1lKTsKKyB9CisgaWYgKGVycjwzMikgeworICBNWl9LaWxsTW9kdWxlKCBscERvc1Rhc2sgKTsKKyAgLyogRklYTUU6IGNsZWFudXAgaE1vZHVsZSAqLworICByZXR1cm4gZXJyOworIH0KIAogIGhJbnN0YW5jZSA9IE5FX0NyZWF0ZUluc3RhbmNlKHBNb2R1bGUsIE5VTEwsIChjbWRsaW5lID09IE5VTEwpKTsKLSBQUk9DRVNTX0NyZWF0ZSggcE1vZHVsZSwgY21kbGluZSwgZW52LCBoSW5zdGFuY2UsIDAsIHNob3dfY21kLCAmaW5mbyApOwotIC8qIHdlIGRvbid0IG5lZWQgdGhlIGhhbmRsZXMgZm9yIG5vdyAqLwotIENsb3NlSGFuZGxlKCBpbmZvLmhUaHJlYWQgKTsKLSBDbG9zZUhhbmRsZSggaW5mby5oUHJvY2VzcyApOworIFBST0NFU1NfQ3JlYXRlKCBwTW9kdWxlLCBjbWRsaW5lLCBlbnYsIGhJbnN0YW5jZSwgMCwgc3RhcnR1cCwgaW5mbyApOwogIHJldHVybiBoSW5zdGFuY2U7CiB9CiAKIHZvaWQgTVpfS2lsbE1vZHVsZSggTFBET1NUQVNLIGxwRG9zVGFzayApCiB7Ci0gbXVubWFwKGxwRG9zVGFzay0+aW1nLDB4MTEwMDAwLVNUQVJUX09GRlNFVCk7Ci0gY2xvc2UobHBEb3NUYXNrLT5tbV9mZCk7Ci0gdW5saW5rKGxwRG9zVGFzay0+bW1fbmFtZSk7CisgaWYgKGxwRG9zVGFzay0+bW1fbmFtZVswXSE9MCkgeworICBtdW5tYXAobHBEb3NUYXNrLT5pbWcsMHgxMTAwMDAtU1RBUlRfT0ZGU0VUKTsKKyAgY2xvc2UobHBEb3NUYXNrLT5tbV9mZCk7CisgfSBlbHNlIFZpcnR1YWxGcmVlKGxwRG9zVGFzay0+aW1nLDB4MTEwMDAwLE1FTV9SRUxFQVNFKTsKICBjbG9zZShscERvc1Rhc2stPnJlYWRfcGlwZSk7CiAgY2xvc2UobHBEb3NUYXNrLT53cml0ZV9waXBlKTsKICBraWxsKGxwRG9zVGFzay0+dGFzayxTSUdURVJNKTsKQEAgLTMxMCw0ICszNDAsMTMgQEAKICByZXR1cm4gMDsKIH0KIAotI2VuZGlmIC8qIGxpbnV4ICovCisjZWxzZSAvKiAhbGludXggKi8KKworSElOU1RBTkNFMTYgTVpfQ3JlYXRlUHJvY2VzcyggTFBDU1RSIG5hbWUsIExQQ1NUUiBjbWRsaW5lLCBMUENTVFIgZW52LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQU1RBUlRVUElORk8zMkEgc3RhcnR1cCwgTFBQUk9DRVNTX0lORk9STUFUSU9OIGluZm8gKQoreworIFdBUk4obW9kdWxlLCJET1MgZXhlY3V0YWJsZXMgbm90IHN1cHBvcnRlZCBvbiB0aGlzIGFyY2hpdGVjdHVyZVxuIik7CisgcmV0dXJuIChITU9EVUxFMTYpMTE7ICAvKiBpbnZhbGlkIGV4ZSAqLworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xvYWRlci9tb2R1bGUuYyBiL2xvYWRlci9tb2R1bGUuYwppbmRleCAyMWQ1NjY1Li4wODA0ZGYzIDEwMDY0NAotLS0gYS9sb2FkZXIvbW9kdWxlLmMKKysrIGIvbG9hZGVyL21vZHVsZS5jCkBAIC0xMSw2ICsxMSw3IEBACiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiAjaW5jbHVkZSA8dW5pc3RkLmg+CiAjaW5jbHVkZSAid2luZG93cy5oIgorI2luY2x1ZGUgIndpbmVycm9yLmgiCiAjaW5jbHVkZSAiY2xhc3MuaCIKICNpbmNsdWRlICJmaWxlLmgiCiAjaW5jbHVkZSAiZ2xvYmFsLmgiCkBAIC0yODQsMTYgKzI4NSwxMSBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgkgICAgTU9EVUxFX0xvYWQKLSAqCi0gKiBJbXBsZW1lbnRhdGlvbiBvZiBMb2FkTW9kdWxlKCkuCi0gKgotICogY21kX2xpbmUgbXVzdCBjb250YWluIHRoZSB3aG9sZSBjb21tYW5kLWxpbmUsIGluY2x1ZGluZyBhcmd2WzBdIChhbmQKLSAqIHdpdGhvdXQgYSBwcmVjZWRpbmcgbGVuZ3RoIGJ5dGUpLgotICogSWYgY21kX2xpbmUgaXMgTlVMTCwgdGhlIG1vZHVsZSBpcyBsb2FkZWQgYXMgYSBsaWJyYXJ5IGV2ZW4gaWYgaXQgaXMgYSAuZXhlCisgKgkgICAgTkVfQ3JlYXRlUHJvY2VzcwogICovCi1ISU5TVEFOQ0UxNiBNT0RVTEVfTG9hZCggTFBDU1RSIG5hbWUsIEJPT0wzMiBpbXBsaWNpdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBMUENTVFIgY21kX2xpbmUsIExQQ1NUUiBlbnYsIFVJTlQzMiBzaG93X2NtZCApCitzdGF0aWMgSElOU1RBTkNFMTYgTkVfQ3JlYXRlUHJvY2VzcyggTFBDU1RSIG5hbWUsIExQQ1NUUiBjbWRfbGluZSwgTFBDU1RSIGVudiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBTVEFSVFVQSU5GTzMyQSBzdGFydHVwLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUFBST0NFU1NfSU5GT1JNQVRJT04gaW5mbyApCiB7CiAgICAgSE1PRFVMRTE2IGhNb2R1bGU7CiAgICAgSElOU1RBTkNFMTYgaEluc3RhbmNlLCBoUHJldkluc3RhbmNlOwpAQCAtMzA1LDM4ICszMDEsMjQgQEAKICAgICAgICAgbHN0cmNweW4zMkEoIG9mcy5zelBhdGhOYW1lLCBuYW1lLCBzaXplb2Yob2ZzLnN6UGF0aE5hbWUpICk7CiAgICAgICAgIGlmICgoaE1vZHVsZSA9IE1PRFVMRV9DcmVhdGVEdW1teU1vZHVsZSggJm9mcyApKSA8IDMyKSByZXR1cm4gaE1vZHVsZTsKICAgICAgICAgcE1vZHVsZSA9IChORV9NT0RVTEUgKilHbG9iYWxMb2NrMTYoIGhNb2R1bGUgKTsKLSAgICAgICAgaEluc3RhbmNlID0gTkVfQ3JlYXRlSW5zdGFuY2UoIHBNb2R1bGUsICZoUHJldkluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNtZF9saW5lID09IE5VTEwpICk7CisgICAgICAgIGhJbnN0YW5jZSA9IE5FX0NyZWF0ZUluc3RhbmNlKCBwTW9kdWxlLCAmaFByZXZJbnN0YW5jZSwgRkFMU0UgKTsKICAgICB9CiAgICAgZWxzZQogICAgIHsKLSAgICAgICAgaEluc3RhbmNlID0gTkVfTG9hZE1vZHVsZSggbmFtZSwgJmhQcmV2SW5zdGFuY2UsIGltcGxpY2l0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNtZF9saW5lID09IE5VTEwpICk7Ci0gICAgICAgIGlmICgoaEluc3RhbmNlID09IDIxKSAmJiBjbWRfbGluZSkKLSAgICAgICAgICAgIHJldHVybiBQRV9Mb2FkTW9kdWxlKCBuYW1lLCBjbWRfbGluZSwgZW52LCBzaG93X2NtZCApOwotI2lmZGVmIGxpbnV4Ci0gICAgICAgIGlmIChoSW5zdGFuY2UgPT0gMTEpCi0gICAgICAgICAgICByZXR1cm4gTVpfTG9hZE1vZHVsZShuYW1lLCBjbWRfbGluZSwgZW52LCBzaG93X2NtZCApOwotI2VuZGlmCisgICAgICAgIGhJbnN0YW5jZSA9IE5FX0xvYWRNb2R1bGUoIG5hbWUsICZoUHJldkluc3RhbmNlLCBGQUxTRSwgRkFMU0UgKTsKKyAgICAgICAgcE1vZHVsZSA9IGhJbnN0YW5jZSA+PSAzMiA/IE5FX0dldFB0ciggaEluc3RhbmNlICkgOiBOVUxMOwogICAgIH0KIAogICAgIC8qIENyZWF0ZSBhIHRhc2sgZm9yIHRoaXMgaW5zdGFuY2UgKi8KIAotICAgIGlmIChoSW5zdGFuY2UgPCAzMikgcmV0dXJuIGhJbnN0YW5jZTsKLSAgICBwTW9kdWxlID0gTkVfR2V0UHRyKCBoSW5zdGFuY2UgKTsKLSAgICBpZiAoY21kX2xpbmUgJiYgIShwTW9kdWxlLT5mbGFncyAmIE5FX0ZGTEFHU19MSUJNT0RVTEUpKQorICAgIGlmIChwTW9kdWxlICYmICEocE1vZHVsZS0+ZmxhZ3MgJiBORV9GRkxBR1NfTElCTU9EVUxFKSkKICAgICB7CiAgICAgICAgIFBEQjMyICpwZGI7Ci0gICAgICAgIFBST0NFU1NfSU5GT1JNQVRJT04gaW5mbzsKIAogCXBNb2R1bGUtPmZsYWdzIHw9IE5FX0ZGTEFHU19HVUk7CiAKICAgICAgICAgcGRiID0gUFJPQ0VTU19DcmVhdGUoIHBNb2R1bGUsIGNtZF9saW5lLCBlbnYsIGhJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhQcmV2SW5zdGFuY2UsIHNob3dfY21kLCAmaW5mbyApOwotICAgICAgICAvKiB3ZSBkb24ndCBuZWVkIHRoZSBoYW5kbGVzIGZvciBub3cgKi8KLSAgICAgICAgQ2xvc2VIYW5kbGUoIGluZm8uaFRocmVhZCApOwotICAgICAgICBDbG9zZUhhbmRsZSggaW5mby5oUHJvY2VzcyApOwotICAgICAgICBpZiAocGRiICYmIChHZXROdW1UYXNrcygpID4gMSkpIFlpZWxkMTYoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhQcmV2SW5zdGFuY2UsIHN0YXJ0dXAsIGluZm8gKTsKICAgICB9CiAKICAgICByZXR1cm4gaEluc3RhbmNlOwpAQCAtMzQ5LDc3ICszMzEsMjM5IEBACiBISU5TVEFOQ0UxNiBXSU5BUEkgTG9hZE1vZHVsZTE2KCBMUENTVFIgbmFtZSwgTFBWT0lEIHBhcmFtQmxvY2sgKQogewogICAgIExPQURQQVJBTVMgKnBhcmFtczsKLSAgICBMUFNUUiBjbWRfbGluZSwgbmV3X2NtZF9saW5lOwotICAgIFVJTlQxNiBzaG93X2NtZCA9IDA7Ci0gICAgTFBDVk9JRCBlbnYgPSBOVUxMOworICAgIExPQURQQVJBTVMzMiBwYXJhbXMzMjsKICAgICBISU5TVEFOQ0UxNiBoSW5zdGFuY2U7CisgICAgTFBTVFIgY21kX2xpbmU7CiAKICAgICBpZiAoIXBhcmFtQmxvY2sgfHwgKHBhcmFtQmxvY2sgPT0gKExQVk9JRCktMSkpCiAgICAgICAgIHJldHVybiBMb2FkTGlicmFyeTE2KCBuYW1lICk7CiAKKyAgICAvKiBUcmFuc2ZlciBhcmd1bWVudHMgdG8gMzItYml0IHBhcmFtLWJsb2NrICovCiAgICAgcGFyYW1zID0gKExPQURQQVJBTVMgKilwYXJhbUJsb2NrOwotICAgIGNtZF9saW5lID0gKExQU1RSKVBUUl9TRUdfVE9fTElOKCBwYXJhbXMtPmNtZExpbmUgKTsKLSAgICAvKiBQb3dlclBvaW50IHBhc3NlcyBOVUxMIGFzIHNob3dDbWQgKi8KLSAgICBpZiAocGFyYW1zLT5zaG93Q21kKQotICAgICAgICBzaG93X2NtZCA9ICooKFVJTlQxNiAqKVBUUl9TRUdfVE9fTElOKHBhcmFtcy0+c2hvd0NtZCkrMSk7CisgICAgbWVtc2V0KCAmcGFyYW1zMzIsICdcMCcsIHNpemVvZihwYXJhbXMzMikgKTsKIAorICAgIGNtZF9saW5lID0gKExQU1RSKVBUUl9TRUdfVE9fTElOKCBwYXJhbXMtPmNtZExpbmUgKTsKICAgICBpZiAoIWNtZF9saW5lKSBjbWRfbGluZSA9ICIiOwogICAgIGVsc2UgaWYgKCpjbWRfbGluZSkgY21kX2xpbmUrKzsgIC8qIHNraXAgdGhlIGxlbmd0aCBieXRlICovCiAKLSAgICBpZiAoIShuZXdfY21kX2xpbmUgPSBIZWFwQWxsb2MoIEdldFByb2Nlc3NIZWFwKCksIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJsZW4oY21kX2xpbmUpICsgc3RybGVuKG5hbWUpICsgMiApKSkKKyAgICBpZiAoIShwYXJhbXMzMi5scENtZExpbmUgPSBIZWFwQWxsb2MoIEdldFByb2Nlc3NIZWFwKCksIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJsZW4oY21kX2xpbmUpK3N0cmxlbihuYW1lKSsyICkpKQogICAgICAgICByZXR1cm4gMDsKLSAgICBzdHJjcHkoIG5ld19jbWRfbGluZSwgbmFtZSApOwotICAgIHN0cmNhdCggbmV3X2NtZF9saW5lLCAiICIgKTsKLSAgICBzdHJjYXQoIG5ld19jbWRfbGluZSwgY21kX2xpbmUgKTsKKyAgICBzdHJjcHkoIHBhcmFtczMyLmxwQ21kTGluZSwgbmFtZSApOworICAgIHN0cmNhdCggcGFyYW1zMzIubHBDbWRMaW5lLCAiICIgKTsKKyAgICBzdHJjYXQoIHBhcmFtczMyLmxwQ21kTGluZSwgY21kX2xpbmUgKTsKIAotICAgIGlmIChwYXJhbXMtPmhFbnZpcm9ubWVudCkgZW52ID0gR2xvYmFsTG9jazE2KCBwYXJhbXMtPmhFbnZpcm9ubWVudCApOwotICAgIGhJbnN0YW5jZSA9IE1PRFVMRV9Mb2FkKCBuYW1lLCBGQUxTRSwgbmV3X2NtZF9saW5lLCBlbnYsIHNob3dfY21kICk7CisgICAgaWYgKHBhcmFtcy0+aEVudmlyb25tZW50KQorICAgICAgICBwYXJhbXMzMi5scEVudkFkZHJlc3MgPSBHbG9iYWxMb2NrMTYoIHBhcmFtcy0+aEVudmlyb25tZW50ICk7CisgICAgaWYgKHBhcmFtcy0+c2hvd0NtZCkKKyAgICAgICAgcGFyYW1zMzIubHBDbWRTaG93ID0gUFRSX1NFR19UT19MSU4oIHBhcmFtcy0+c2hvd0NtZCApOworCisgICAgLyogQ2FsbCBMb2FkTW9kdWxlMzIgKi8KKyAgICBoSW5zdGFuY2UgPSBMb2FkTW9kdWxlMzIoIG5hbWUsICZwYXJhbXMzMiApOworCisgICAgLyogQ2xlYW4gdXAgKi8KICAgICBpZiAocGFyYW1zLT5oRW52aXJvbm1lbnQpIEdsb2JhbFVubG9jazE2KCBwYXJhbXMtPmhFbnZpcm9ubWVudCApOwotICAgIEhlYXBGcmVlKCBHZXRQcm9jZXNzSGVhcCgpLCAwLCBuZXdfY21kX2xpbmUgKTsKKyAgICBIZWFwRnJlZSggR2V0UHJvY2Vzc0hlYXAoKSwgMCwgcGFyYW1zMzIubHBDbWRMaW5lICk7CisKICAgICByZXR1cm4gaEluc3RhbmNlOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoJICAgIExvYWRNb2R1bGUzMiAgICAoS0VSTkVMMzIuNDk5KQotICoKLSAqIEZJWE1FCi0gKgotICogIFRoaXMgc2hvdWxkIGdldCBpbXBsZW1lbnRlZCB2aWEgQ3JlYXRlUHJvY2VzcyAtLSBNT0RVTEVfTG9hZAotICogIGlzIHJlc29sdXRlbHkgMTYtYml0LgogICovCi1EV09SRCBXSU5BUEkgTG9hZE1vZHVsZTMyKCBMUENTVFIgbmFtZSwgTFBWT0lEIHBhcmFtQmxvY2sgKSAKK0hJTlNUQU5DRTMyIFdJTkFQSSBMb2FkTW9kdWxlMzIoIExQQ1NUUiBuYW1lLCBMUFZPSUQgcGFyYW1CbG9jayApIAogewogICAgIExPQURQQVJBTVMzMiAqcGFyYW1zID0gKExPQURQQVJBTVMzMiAqKXBhcmFtQmxvY2s7Ci0jaWYgMAotICBTVEFSVFVQSU5GTyBzdDsKLSAgUFJPQ0VTU0lORk9STUFUSU9OIHBpOwotICBzdC5jYiA9IHNpemVvZihTVEFSVFVQSU5GTyk7Ci0gIHN0LndTaG93V2luZG93ID0gcC0+bHBDbWRTaG93WzJdIDsgV1JPTkcKKyAgICBQUk9DRVNTX0lORk9STUFUSU9OIGluZm87CisgICAgU1RBUlRVUElORk8zMkEgc3RhcnR1cDsKKyAgICBISU5TVEFOQ0UzMiBoSW5zdGFuY2U7CisgICAgUERCMzIgKnBkYjsKKyAgICBUREIgKnRkYjsKIAotICBCT09MMzIgcmV0ID0gQ3JlYXRlUHJvY2VzczMyQSggbmFtZSwgcC0+bHBDbWRMaW5lLCAKLQkJCQkgTlVMTCwgTlVMTCwgRkFMU0UsIDAsIHAtPmxwRW52QWRkcmVzcywKLQkJCQkgTlVMTCwgJnN0LCAmcGkpOwotICBpZiAoIXJldCkgewotICAgIC8qICAgIGhhbmRsZSBlcnJvcnMgYXBwcm9wcmlhdGVseSAqLwotICB9Ci0gIENsb3NlSGFuZGxlMzIocGkuaFByb2Nlc3MpOwotICBDbG9zZUhhbmRsZTMyKHBpLmhUaHJlYWQpOyAKKyAgICBtZW1zZXQoICZzdGFydHVwLCAnXDAnLCBzaXplb2Yoc3RhcnR1cCkgKTsKKyAgICBzdGFydHVwLmNiID0gc2l6ZW9mKHN0YXJ0dXApOworICAgIHN0YXJ0dXAuZHdGbGFncyA9IFNUQVJURl9VU0VTSE9XV0lORE9XOworICAgIHN0YXJ0dXAud1Nob3dXaW5kb3cgPSBwYXJhbXMtPmxwQ21kU2hvdz8gcGFyYW1zLT5scENtZFNob3dbMV0gOiAwOwogCi0jZWxzZQotICByZXR1cm4gTU9EVUxFX0xvYWQoIG5hbWUsIEZBTFNFLCBwYXJhbXMtPmxwQ21kTGluZSwgcGFyYW1zLT5scEVudkFkZHJlc3MsIAotICAgICAgICAgICAgICAgICAgICAgICAgKigoVUlOVDE2ICopcGFyYW1zLT5scENtZFNob3cgKyAxKSApOwotI2VuZGlmCisgICAgaWYgKCFDcmVhdGVQcm9jZXNzMzJBKCBuYW1lLCBwYXJhbXMtPmxwQ21kTGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwsIEZBTFNFLCAwLCBwYXJhbXMtPmxwRW52QWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsICZzdGFydHVwLCAmaW5mbyApKQorICAgICAgICByZXR1cm4gR2V0TGFzdEVycm9yKCk7ICAvKiBndWFyYW50ZWVkIHRvIGJlIDwgMzIgKi8KKyAgICAKKyAgICAvKiBHZXQgaEluc3RhbmNlIGZyb20gcHJvY2VzcyAqLworICAgIHBkYiA9IFBST0NFU1NfSWRUb1BEQiggaW5mby5kd1Byb2Nlc3NJZCApOworICAgIHRkYiA9IHBkYj8gKFREQiAqKUdsb2JhbExvY2sxNiggcGRiLT50YXNrICkgOiBOVUxMOworICAgIGhJbnN0YW5jZSA9IHRkYj8gdGRiLT5oSW5zdGFuY2UgOiAwOworCisgICAgLyogQ2xvc2Ugb2ZmIHRoZSBoYW5kbGVzICovCisgICAgQ2xvc2VIYW5kbGUoIGluZm8uaFRocmVhZCApOworICAgIENsb3NlSGFuZGxlKCBpbmZvLmhQcm9jZXNzICk7CisKKyAgICByZXR1cm4gaEluc3RhbmNlOwogfQogCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgQ3JlYXRlUHJvY2VzczMyQSAgICAgICAgICAoS0VSTkVMMzIuMTcxKQorICovCitCT09MMzIgV0lOQVBJIENyZWF0ZVByb2Nlc3MzMkEoIExQQ1NUUiBscEFwcGxpY2F0aW9uTmFtZSwgTFBTVFIgbHBDb21tYW5kTGluZSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQU0VDVVJJVFlfQVRUUklCVVRFUyBscFByb2Nlc3NBdHRyaWJ1dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUFNFQ1VSSVRZX0FUVFJJQlVURVMgbHBUaHJlYWRBdHRyaWJ1dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT09MMzIgYkluaGVyaXRIYW5kbGVzLCBEV09SRCBkd0NyZWF0aW9uRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQVk9JRCBscEVudmlyb25tZW50LCBMUENTVFIgbHBDdXJyZW50RGlyZWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUFNUQVJUVVBJTkZPMzJBIGxwU3RhcnR1cEluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQUFJPQ0VTU19JTkZPUk1BVElPTiBscFByb2Nlc3NJbmZvICkKK3sKKyAgICBISU5TVEFOQ0UxNiBoSW5zdGFuY2U7CisgICAgTFBDU1RSIGNtZGxpbmU7CisgICAgUERCMzIgKnBkYjsKKyAgICBjaGFyIG5hbWVbMjU2XTsKKworICAgIC8qIEdldCBuYW1lIGFuZCBjb21tYW5kIGxpbmUgKi8KKworICAgIGlmICghbHBBcHBsaWNhdGlvbk5hbWUgJiYgIWxwQ29tbWFuZExpbmUpCisgICAgeworICAgICAgICBTZXRMYXN0RXJyb3IoIEVSUk9SX0ZJTEVfTk9UX0ZPVU5EICk7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgICBjbWRsaW5lID0gbHBDb21tYW5kTGluZT8gbHBDb21tYW5kTGluZSA6IGxwQXBwbGljYXRpb25OYW1lOworCisgICAgaWYgKGxwQXBwbGljYXRpb25OYW1lKQorICAgICAgICBsc3RyY3B5bjMyQShuYW1lLCBscEFwcGxpY2F0aW9uTmFtZSwgc2l6ZW9mKG5hbWUpIC0gNCk7CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgY2hhciAqcHRyID0gc3RyY2hyKGxwQ29tbWFuZExpbmUsICcgJyk7CisgICAgICAgIGludCBsZW4gPSAocHRyPyBwdHItbHBDb21tYW5kTGluZSA6IHN0cmxlbihscENvbW1hbmRMaW5lKSkgKyAxOworICAgICAgICBpZiAobGVuID4gc2l6ZW9mKG5hbWUpIC0gNCkgbGVuID0gc2l6ZW9mKG5hbWUpIC0gNDsKKyAgICAgICAgbHN0cmNweW4zMkEobmFtZSwgbHBDb21tYW5kTGluZSwgbGVuKTsKKyAgICB9CisKKyAgICBpZiAoIXN0cmNocihuYW1lLCAnXFwnKSAmJiAhc3RyY2hyKG5hbWUsICcuJykpCisgICAgICAgIHN0cmNhdChuYW1lLCAiLmV4ZSIpOworCisKKyAgICAvKiBXYXJuIGlmIHVuc3VwcG9ydGVkIGZlYXR1cmVzIGFyZSB1c2VkICovCisKKyAgICBpZiAobHBQcm9jZXNzQXR0cmlidXRlcykKKyAgICAgICAgRklYTUUobW9kdWxlLCAiKCVzLC4uLik6IGxwUHJvY2Vzc0F0dHJpYnV0ZXMgaWdub3JlZFxuIiwgbmFtZSk7CisgICAgaWYgKGxwVGhyZWFkQXR0cmlidXRlcykKKyAgICAgICAgRklYTUUobW9kdWxlLCAiKCVzLC4uLik6IGxwVGhyZWFkQXR0cmlidXRlcyBpZ25vcmVkXG4iLCBuYW1lKTsKKyAgICBpZiAoYkluaGVyaXRIYW5kbGVzKQorICAgICAgICBGSVhNRShtb2R1bGUsICIoJXMsLi4uKTogYkluaGVyaXRIYW5kbGVzIGlnbm9yZWRcbiIsIG5hbWUpOworICAgIGlmIChkd0NyZWF0aW9uRmxhZ3MgJiBERUJVR19QUk9DRVNTKQorICAgICAgICBGSVhNRShtb2R1bGUsICIoJXMsLi4uKTogREVCVUdfUFJPQ0VTUyBpZ25vcmVkXG4iLCBuYW1lKTsKKyAgICBpZiAoZHdDcmVhdGlvbkZsYWdzICYgREVCVUdfT05MWV9USElTX1BST0NFU1MpCisgICAgICAgIEZJWE1FKG1vZHVsZSwgIiglcywuLi4pOiBERUJVR19PTkxZX1RISVNfUFJPQ0VTUyBpZ25vcmVkXG4iLCBuYW1lKTsKKyAgICBpZiAoZHdDcmVhdGlvbkZsYWdzICYgQ1JFQVRFX1NVU1BFTkRFRCkKKyAgICAgICAgRklYTUUobW9kdWxlLCAiKCVzLC4uLik6IENSRUFURV9TVVNQRU5ERUQgaWdub3JlZFxuIiwgbmFtZSk7CisgICAgaWYgKGR3Q3JlYXRpb25GbGFncyAmIERFVEFDSEVEX1BST0NFU1MpCisgICAgICAgIEZJWE1FKG1vZHVsZSwgIiglcywuLi4pOiBERVRBQ0hFRF9QUk9DRVNTIGlnbm9yZWRcbiIsIG5hbWUpOworICAgIGlmIChkd0NyZWF0aW9uRmxhZ3MgJiBDUkVBVEVfTkVXX0NPTlNPTEUpCisgICAgICAgIEZJWE1FKG1vZHVsZSwgIiglcywuLi4pOiBDUkVBVEVfTkVXX0NPTlNPTEUgaWdub3JlZFxuIiwgbmFtZSk7CisgICAgaWYgKGR3Q3JlYXRpb25GbGFncyAmIE5PUk1BTF9QUklPUklUWV9DTEFTUykKKyAgICAgICAgRklYTUUobW9kdWxlLCAiKCVzLC4uLik6IE5PUk1BTF9QUklPUklUWV9DTEFTUyBpZ25vcmVkXG4iLCBuYW1lKTsKKyAgICBpZiAoZHdDcmVhdGlvbkZsYWdzICYgSURMRV9QUklPUklUWV9DTEFTUykKKyAgICAgICAgRklYTUUobW9kdWxlLCAiKCVzLC4uLik6IElETEVfUFJJT1JJVFlfQ0xBU1MgaWdub3JlZFxuIiwgbmFtZSk7CisgICAgaWYgKGR3Q3JlYXRpb25GbGFncyAmIEhJR0hfUFJJT1JJVFlfQ0xBU1MpCisgICAgICAgIEZJWE1FKG1vZHVsZSwgIiglcywuLi4pOiBISUdIX1BSSU9SSVRZX0NMQVNTIGlnbm9yZWRcbiIsIG5hbWUpOworICAgIGlmIChkd0NyZWF0aW9uRmxhZ3MgJiBSRUFMVElNRV9QUklPUklUWV9DTEFTUykKKyAgICAgICAgRklYTUUobW9kdWxlLCAiKCVzLC4uLik6IFJFQUxUSU1FX1BSSU9SSVRZX0NMQVNTIGlnbm9yZWRcbiIsIG5hbWUpOworICAgIGlmIChkd0NyZWF0aW9uRmxhZ3MgJiBDUkVBVEVfTkVXX1BST0NFU1NfR1JPVVApCisgICAgICAgIEZJWE1FKG1vZHVsZSwgIiglcywuLi4pOiBDUkVBVEVfTkVXX1BST0NFU1NfR1JPVVAgaWdub3JlZFxuIiwgbmFtZSk7CisgICAgaWYgKGR3Q3JlYXRpb25GbGFncyAmIENSRUFURV9VTklDT0RFX0VOVklST05NRU5UKQorICAgICAgICBGSVhNRShtb2R1bGUsICIoJXMsLi4uKTogQ1JFQVRFX1VOSUNPREVfRU5WSVJPTk1FTlQgaWdub3JlZFxuIiwgbmFtZSk7CisgICAgaWYgKGR3Q3JlYXRpb25GbGFncyAmIENSRUFURV9TRVBBUkFURV9XT1dfVkRNKQorICAgICAgICBGSVhNRShtb2R1bGUsICIoJXMsLi4uKTogQ1JFQVRFX1NFUEFSQVRFX1dPV19WRE0gaWdub3JlZFxuIiwgbmFtZSk7CisgICAgaWYgKGR3Q3JlYXRpb25GbGFncyAmIENSRUFURV9TSEFSRURfV09XX1ZETSkKKyAgICAgICAgRklYTUUobW9kdWxlLCAiKCVzLC4uLik6IENSRUFURV9TSEFSRURfV09XX1ZETSBpZ25vcmVkXG4iLCBuYW1lKTsKKyAgICBpZiAoZHdDcmVhdGlvbkZsYWdzICYgQ1JFQVRFX0RFRkFVTFRfRVJST1JfTU9ERSkKKyAgICAgICAgRklYTUUobW9kdWxlLCAiKCVzLC4uLik6IENSRUFURV9ERUZBVUxUX0VSUk9SX01PREUgaWdub3JlZFxuIiwgbmFtZSk7CisgICAgaWYgKGR3Q3JlYXRpb25GbGFncyAmIENSRUFURV9OT19XSU5ET1cpCisgICAgICAgIEZJWE1FKG1vZHVsZSwgIiglcywuLi4pOiBDUkVBVEVfTk9fV0lORE9XIGlnbm9yZWRcbiIsIG5hbWUpOworICAgIGlmIChkd0NyZWF0aW9uRmxhZ3MgJiBQUk9GSUxFX1VTRVIpCisgICAgICAgIEZJWE1FKG1vZHVsZSwgIiglcywuLi4pOiBQUk9GSUxFX1VTRVIgaWdub3JlZFxuIiwgbmFtZSk7CisgICAgaWYgKGR3Q3JlYXRpb25GbGFncyAmIFBST0ZJTEVfS0VSTkVMKQorICAgICAgICBGSVhNRShtb2R1bGUsICIoJXMsLi4uKTogUFJPRklMRV9LRVJORUwgaWdub3JlZFxuIiwgbmFtZSk7CisgICAgaWYgKGR3Q3JlYXRpb25GbGFncyAmIFBST0ZJTEVfU0VSVkVSKQorICAgICAgICBGSVhNRShtb2R1bGUsICIoJXMsLi4uKTogUFJPRklMRV9TRVJWRVIgaWdub3JlZFxuIiwgbmFtZSk7CisgICAgaWYgKGxwQ3VycmVudERpcmVjdG9yeSkKKyAgICAgICAgRklYTUUobW9kdWxlLCAiKCVzLC4uLik6IGxwQ3VycmVudERpcmVjdG9yeSAlcyBpZ25vcmVkXG4iLCAKKyAgICAgICAgICAgICAgICAgICAgICBuYW1lLCBscEN1cnJlbnREaXJlY3RvcnkpOworICAgIGlmIChscFN0YXJ0dXBJbmZvLT5scERlc2t0b3ApCisgICAgICAgIEZJWE1FKG1vZHVsZSwgIiglcywuLi4pOiBscFN0YXJ0dXBJbmZvLT5scERlc2t0b3AgJXMgaWdub3JlZFxuIiwgCisgICAgICAgICAgICAgICAgICAgICAgbmFtZSwgbHBTdGFydHVwSW5mby0+bHBEZXNrdG9wKTsKKyAgICBpZiAobHBTdGFydHVwSW5mby0+bHBUaXRsZSkKKyAgICAgICAgRklYTUUobW9kdWxlLCAiKCVzLC4uLik6IGxwU3RhcnR1cEluZm8tPmxwVGl0bGUgJXMgaWdub3JlZFxuIiwgCisgICAgICAgICAgICAgICAgICAgICAgbmFtZSwgbHBTdGFydHVwSW5mby0+bHBUaXRsZSk7CisgICAgaWYgKGxwU3RhcnR1cEluZm8tPmR3RmxhZ3MgJiBTVEFSVEZfVVNFQ09VTlRDSEFSUykKKyAgICAgICAgRklYTUUobW9kdWxlLCAiKCVzLC4uLik6IFNUQVJURl9VU0VDT1VOVENIQVJTICglbGQsJWxkKSBpZ25vcmVkXG4iLCAKKyAgICAgICAgICAgICAgICAgICAgICBuYW1lLCBscFN0YXJ0dXBJbmZvLT5kd1hDb3VudENoYXJzLCBscFN0YXJ0dXBJbmZvLT5kd1lDb3VudENoYXJzKTsKKyAgICBpZiAobHBTdGFydHVwSW5mby0+ZHdGbGFncyAmIFNUQVJURl9VU0VGSUxMQVRUUklCVVRFKQorICAgICAgICBGSVhNRShtb2R1bGUsICIoJXMsLi4uKTogU1RBUlRGX1VTRUZJTExBVFRSSUJVVEUgJWx4IGlnbm9yZWRcbiIsIAorICAgICAgICAgICAgICAgICAgICAgIG5hbWUsIGxwU3RhcnR1cEluZm8tPmR3RmlsbEF0dHJpYnV0ZSk7CisgICAgaWYgKGxwU3RhcnR1cEluZm8tPmR3RmxhZ3MgJiBTVEFSVEZfUlVORlVMTFNDUkVFTikKKyAgICAgICAgRklYTUUobW9kdWxlLCAiKCVzLC4uLik6IFNUQVJURl9SVU5GVUxMU0NSRUVOIGlnbm9yZWRcbiIsIG5hbWUpOworICAgIGlmIChscFN0YXJ0dXBJbmZvLT5kd0ZsYWdzICYgU1RBUlRGX0ZPUkNFT05GRUVEQkFDSykKKyAgICAgICAgRklYTUUobW9kdWxlLCAiKCVzLC4uLik6IFNUQVJURl9GT1JDRU9ORkVFREJBQ0sgaWdub3JlZFxuIiwgbmFtZSk7CisgICAgaWYgKGxwU3RhcnR1cEluZm8tPmR3RmxhZ3MgJiBTVEFSVEZfRk9SQ0VPRkZGRUVEQkFDSykKKyAgICAgICAgRklYTUUobW9kdWxlLCAiKCVzLC4uLik6IFNUQVJURl9GT1JDRU9GRkZFRURCQUNLIGlnbm9yZWRcbiIsIG5hbWUpOworICAgIGlmIChscFN0YXJ0dXBJbmZvLT5kd0ZsYWdzICYgU1RBUlRGX1VTRUhPVEtFWSkKKyAgICAgICAgRklYTUUobW9kdWxlLCAiKCVzLC4uLik6IFNUQVJURl9VU0VIT1RLRVkgaWdub3JlZFxuIiwgbmFtZSk7CisKKworICAgIC8qIFRyeSBORSAob3Igd2luZWxpYikgbW9kdWxlICovCisgICAgaEluc3RhbmNlID0gTkVfQ3JlYXRlUHJvY2VzcyggbmFtZSwgY21kbGluZSwgbHBFbnZpcm9ubWVudCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHBTdGFydHVwSW5mbywgbHBQcm9jZXNzSW5mbyApOworCisgICAgLyogVHJ5IFBFIG1vZHVsZSAqLworICAgIGlmIChoSW5zdGFuY2UgPT0gMjEpCisgICAgICAgIGhJbnN0YW5jZSA9IFBFX0NyZWF0ZVByb2Nlc3MoIG5hbWUsIGNtZGxpbmUsIGxwRW52aXJvbm1lbnQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBscFN0YXJ0dXBJbmZvLCBscFByb2Nlc3NJbmZvICk7CisKKyAgICAvKiBUcnkgRE9TIG1vZHVsZSAqLworI2lmZGVmIGxpbnV4CisgICAgaWYgKGhJbnN0YW5jZSA9PSAxMSkKKyAgICAgICAgaEluc3RhbmNlID0gTVpfQ3JlYXRlUHJvY2VzcyggbmFtZSwgY21kbGluZSwgbHBFbnZpcm9ubWVudCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxwU3RhcnR1cEluZm8sIGxwUHJvY2Vzc0luZm8gKTsKKyNlbmRpZgorCisgICAgaWYgKGhJbnN0YW5jZSA8IDMyKQorICAgIHsKKyAgICAgICAgU2V0TGFzdEVycm9yKCBoSW5zdGFuY2UgKTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICAgIC8qIEdldCBoVGFzayBmcm9tIHByb2Nlc3MgYW5kIHN0YXJ0IHRoZSB0YXNrICovCisgICAgcGRiID0gUFJPQ0VTU19JZFRvUERCKCBscFByb2Nlc3NJbmZvLT5kd1Byb2Nlc3NJZCApOworICAgIGlmIChwZGIpIFRBU0tfU3RhcnRUYXNrKCBwZGItPnRhc2sgKTsKKworICAgIHJldHVybiBUUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgQ3JlYXRlUHJvY2VzczMyVyAgICAgICAgICAoS0VSTkVMMzIuMTcyKQorICovCitCT09MMzIgV0lOQVBJIENyZWF0ZVByb2Nlc3MzMlcoIExQQ1dTVFIgbHBBcHBsaWNhdGlvbk5hbWUsIExQV1NUUiBscENvbW1hbmRMaW5lLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBTRUNVUklUWV9BVFRSSUJVVEVTIGxwUHJvY2Vzc0F0dHJpYnV0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQU0VDVVJJVFlfQVRUUklCVVRFUyBscFRocmVhZEF0dHJpYnV0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJPT0wzMiBiSW5oZXJpdEhhbmRsZXMsIERXT1JEIGR3Q3JlYXRpb25GbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBWT0lEIGxwRW52aXJvbm1lbnQsIExQQ1dTVFIgbHBDdXJyZW50RGlyZWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUFNUQVJUVVBJTkZPMzJXIGxwU3RhcnR1cEluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQUFJPQ0VTU19JTkZPUk1BVElPTiBscFByb2Nlc3NJbmZvICkKK3sKKyAgICBGSVhNRSh3aW4zMiwgIiglcywlcywuLi4pOiBzdHViXG4iLCBkZWJ1Z3N0cl93KGxwQXBwbGljYXRpb25OYW1lKSwKKyAgICAgICAgICAgICAgICAgZGVidWdzdHJfdyhscENvbW1hbmRMaW5lKSk7CisKKyAgICAvKiBtYWtlIGZyb20gbGNjIHVzZXMgc3lzdGVtIGFzIGZhbGxiYWNrIGlmIENyZWF0ZVByb2Nlc3MgcmV0dXJucworICAgICAgIEZBTFNFLCBzbyByZXR1cm4gZmFsc2UgKi8KKyAgICByZXR1cm4gRkFMU0U7Cit9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgICAgIEdldE1vZHVsZUhhbmRsZSAgICAgICAgIChLRVJORUwzMi4yMzcpCiAgKi8KIEhNT0RVTEUzMiBXSU5BUEkgR2V0TW9kdWxlSGFuZGxlMzJBKExQQ1NUUiBtb2R1bGUpCiB7Ci0KLSAgICBUUkFDRSh3aW4zMiwgIiVzXG4iLCBtb2R1bGUgPyBtb2R1bGUgOiAiTlVMTCIpOwogICAgIGlmIChtb2R1bGUgPT0gTlVMTCkKICAgICAJcmV0dXJuIFBST0NFU1NfQ3VycmVudCgpLT5leGVfbW9kcmVmLT5tb2R1bGU7CiAgICAgZWxzZQpAQCAtNTgyLDEwICs3MjYsMjEgQEAKICAgICBjaGFyICpwLCBmaWxlbmFtZVsyNTZdOwogICAgIHN0YXRpYyBpbnQgdXNlX2xvYWRfbW9kdWxlID0gMTsKICAgICBpbnQgIHNwYWNlbGltaXQgPSAwLCBleGhhdXN0ZWQgPSAwOworICAgIExPQURQQVJBTVMzMiBwYXJhbXM7CisgICAgVUlOVDE2IHBhcmFtQ21kU2hvd1syXTsKIAogICAgIGlmICghbHBDbWRMaW5lKQogICAgICAgICByZXR1cm4gMjsgIC8qIEZpbGUgbm90IGZvdW5kICovCiAKKyAgICAvKiBTZXQgdXAgTE9BRFBBUkFNUzMyIGJ1ZmZlciBmb3IgTG9hZE1vZHVsZTMyICovCisKKyAgICBtZW1zZXQoICZwYXJhbXMsICdcMCcsIHNpemVvZihwYXJhbXMpICk7CisgICAgcGFyYW1zLmxwQ21kTGluZSAgICA9IChMUFNUUilscENtZExpbmU7CisgICAgcGFyYW1zLmxwQ21kU2hvdyAgICA9IHBhcmFtQ21kU2hvdzsKKyAgICBwYXJhbXMubHBDbWRTaG93WzBdID0gMjsKKyAgICBwYXJhbXMubHBDbWRTaG93WzFdID0gbkNtZFNob3c7CisKKwogICAgIC8qIEtlZXAgdHJ5aW5nIHRvIGxvYWQgYSBmaWxlIGJ5IHRyeWluZyBkaWZmZXJlbnQgZmlsZW5hbWVzOyBlLmcuLAogICAgICAgIGZvciB0aGUgY21kbGluZSAiYWJjZCBlZmcgaGlqIiwgdHJ5ICJhYmNkIiB3aXRoIGFyZ3MgImVmZyBoaWoiLAogICAgICAgIHRoZW4gImFiY2QgZWZnIiB3aXRoIGFyZyAiaGlqIiwgYW5kIGZpbmFsbHkgImFiY2QgZWZnIGhpaiIgd2l0aApAQCAtNjI1LDcgKzc4MCw3IEBACiAJewogCSAgICAvKiBXaW5lbGliOiBVc2UgTG9hZE1vZHVsZSgpIG9ubHkgZm9yIHRoZSBwcm9ncmFtIGl0c2VsZiAqLwogCSAgICBpZiAoX193aW5lbGliKSB1c2VfbG9hZF9tb2R1bGUgPSAwOwotICAgICAgICAgICAgaGFuZGxlID0gTU9EVUxFX0xvYWQoIGZpbGVuYW1lLCBGQUxTRSwgbHBDbWRMaW5lLCBOVUxMLCBuQ21kU2hvdyApOworICAgICAgICAgICAgaGFuZGxlID0gTG9hZE1vZHVsZTMyKCBmaWxlbmFtZSwgJnBhcmFtcyApOwogCSAgICBpZiAoaGFuZGxlID09IDIpICAvKiBmaWxlIG5vdCBmb3VuZCAqLwogCSAgICB7CiAJCS8qIENoZWNrIHRoYXQgdGhlIG9yaWdpbmFsIGZpbGUgbmFtZSBkaWQgbm90IGhhdmUgYSBzdWZmaXggKi8KQEAgLTYzNSw4ICs3OTAsNyBAQAogCQl7CiAJCSAgICBwID0gZmlsZW5hbWUgKyBzdHJsZW4oZmlsZW5hbWUpOwogCQkgICAgc3RyY3B5KCBwLCAiLmV4ZSIgKTsKLSAgICAgICAgICAgICAgICAgICAgaGFuZGxlID0gTU9EVUxFX0xvYWQoIGZpbGVuYW1lLCBGQUxTRSwgbHBDbWRMaW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgbkNtZFNob3cgKTsKKyAgICAgICAgICAgICAgICAgICAgaGFuZGxlID0gTG9hZE1vZHVsZTMyKCBmaWxlbmFtZSwgJnBhcmFtcyApOwogICAgICAgICAgICAgICAgICAgICAqcCA9ICdcMCc7ICAvKiBSZW1vdmUgZXh0ZW5zaW9uICovCiAJCX0KIAkgICAgfQpkaWZmIC0tZ2l0IGEvbG9hZGVyL25lL21vZHVsZS5jIGIvbG9hZGVyL25lL21vZHVsZS5jCmluZGV4IGMwODU2NzguLmZiM2IxNjggMTAwNjQ0Ci0tLSBhL2xvYWRlci9uZS9tb2R1bGUuYworKysgYi9sb2FkZXIvbmUvbW9kdWxlLmMKQEAgLTE5LDYgKzE5LDcgQEAKICNpbmNsdWRlICJwcm9jZXNzLmgiCiAjaW5jbHVkZSAidG9vbGhlbHAuaCIKICNpbmNsdWRlICJzbm9vcC5oIgorI2luY2x1ZGUgInN0YWNrZnJhbWUuaCIKICNpbmNsdWRlICJkZWJ1Zy5oIgogCiBGQVJQUk9DMTYgKCpmblNOT09QMTZfR2V0UHJvY0FkZHJlc3MxNikoSE1PRFVMRTE2LERXT1JELEZBUlBST0MxNikgPSBOVUxMOwpAQCAtNzQ0LDYgKzc0NSw4IEBACiAgICAgewogICAgICAgICBISU5TVEFOQ0UxNiBwcmV2OwogICAgICAgICBwTW9kdWxlID0gTkVfR2V0UHRyKCBoTW9kdWxlICk7CisgICAgICAgIGlmICggcE1vZHVsZS0+bW9kdWxlMzIgKSByZXR1cm4gKEhJTlNUQU5DRTE2KTIxOworCiAgICAgICAgIGhJbnN0YW5jZSA9IE5FX0NyZWF0ZUluc3RhbmNlKCBwTW9kdWxlLCAmcHJldiwgbGliX29ubHkgKTsKICAgICAgICAgaWYgKGhJbnN0YW5jZSAhPSBwcmV2KSAgLyogbm90IGEgbGlicmFyeSAqLwogICAgICAgICAgICAgTkVfTG9hZFNlZ21lbnQoIHBNb2R1bGUsIHBNb2R1bGUtPmRncm91cCApOwpAQCAtMTExNSwzICsxMTE4LDU1IEBACiAgICAgbHBtZS0+d05leHQgPSBoTW9kdWxlOwogICAgIHJldHVybiBNb2R1bGVOZXh0KCBscG1lICk7CiB9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCQlNYXBITW9kdWxlTFMJCQkoS0VSTkVMMzIuNTIwKQorICovCitITU9EVUxFMTYgV0lOQVBJIE1hcEhNb2R1bGVMUyhITU9EVUxFMzIgaG1vZCkgeworCU5FX01PRFVMRQkqcE1vZHVsZTsKKworCWlmICghaG1vZCkKKwkJcmV0dXJuICgoVERCKilHbG9iYWxMb2NrMTYoR2V0Q3VycmVudFRhc2soKSkpLT5oSW5zdGFuY2U7CisJaWYgKCFISVdPUkQoaG1vZCkpCisJCXJldHVybiBobW9kOyAvKiB3ZSBhbHJlYWR5IGhhdmUgYSAxNiBiaXQgbW9kdWxlIGhhbmRsZSAqLworCXBNb2R1bGUgPSAoTkVfTU9EVUxFKilHbG9iYWxMb2NrMTYoaEZpcnN0TW9kdWxlKTsKKwl3aGlsZSAocE1vZHVsZSkgIHsKKwkJaWYgKHBNb2R1bGUtPm1vZHVsZTMyID09IGhtb2QpCisJCQlyZXR1cm4gcE1vZHVsZS0+c2VsZjsKKwkJcE1vZHVsZSA9IChORV9NT0RVTEUqKUdsb2JhbExvY2sxNihwTW9kdWxlLT5uZXh0KTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCQlNYXBITW9kdWxlU0wJCQkoS0VSTkVMMzIuNTIxKQorICovCitITU9EVUxFMzIgV0lOQVBJIE1hcEhNb2R1bGVTTChITU9EVUxFMTYgaG1vZCkgeworCU5FX01PRFVMRQkqcE1vZHVsZTsKKworCWlmICghaG1vZCkgeworCQlUREIgKnBUYXNrID0gKFREQiopR2xvYmFsTG9jazE2KEdldEN1cnJlbnRUYXNrKCkpOworCisJCWhtb2QgPSBwVGFzay0+aEluc3RhbmNlOworCX0KKwlwTW9kdWxlID0gKE5FX01PRFVMRSopR2xvYmFsTG9jazE2KGhtb2QpOworCWlmICgJKHBNb2R1bGUtPm1hZ2ljIT1JTUFHRV9PUzJfU0lHTkFUVVJFKQl8fAorCQkhKHBNb2R1bGUtPmZsYWdzICYgTkVfRkZMQUdTX1dJTjMyKQorCSkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIHBNb2R1bGUtPm1vZHVsZTMyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgkJTWFwSEluc3RMUwkJCShLRVJORUwzMi41MTYpCisgKi8KK1JFR1NfRU5UUllQT0lOVChNYXBISW5zdExTKSB7CisJRUFYX3JlZyhjb250ZXh0KSA9IE1hcEhNb2R1bGVMUyhFQVhfcmVnKGNvbnRleHQpKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJCU1hcEhJbnN0TFMJCQkoS0VSTkVMMzIuNTE4KQorICovCitSRUdTX0VOVFJZUE9JTlQoTWFwSEluc3RTTCkgeworCUVBWF9yZWcoY29udGV4dCkgPSBNYXBITW9kdWxlU0woRUFYX3JlZyhjb250ZXh0KSk7Cit9CmRpZmYgLS1naXQgYS9sb2FkZXIvbmUvcmVzb3VyY2UuYyBiL2xvYWRlci9uZS9yZXNvdXJjZS5jCmluZGV4IGM1ZDNmY2UuLjkwZmI0MTYgMTAwNjQ0Ci0tLSBhL2xvYWRlci9uZS9yZXNvdXJjZS5jCisrKyBiL2xvYWRlci9uZS9yZXNvdXJjZS5jCkBAIC0zNzQsNyArMzc0LDcgQEAKICAqLwogSU5UMTYgV0lOQVBJIEFjY2Vzc1Jlc291cmNlMTYoIEhJTlNUQU5DRTE2IGhNb2R1bGUsIEhSU1JDMTYgaFJzcmMgKQogewotICAgIEhGSUxFMzIgZmQ7CisgICAgSEZJTEUxNiBmZDsKIAogICAgIE5FX01PRFVMRSAqcE1vZHVsZSA9IE5FX0dldFB0ciggaE1vZHVsZSApOwogICAgIGlmICghcE1vZHVsZSB8fCAhcE1vZHVsZS0+cmVzX3RhYmxlIHx8ICFoUnNyYykgcmV0dXJuIC0xOwpAQCAtMzgzLDExICszODMsMTEgQEAKIAogICAgIGFzc2VydCggIV9fd2luZWxpYiApOyAgLyogQ2FuJ3QgdXNlIFdpbjE2IHJlc291cmNlIGZ1bmN0aW9ucyBpbiBXaW5lbGliICovCiAKLSAgICBpZiAoKGZkID0gX2xvcGVuMzIoIE5FX01PRFVMRV9OQU1FKHBNb2R1bGUpLCBPRl9SRUFEICkpICE9IC0xKQorICAgIGlmICgoZmQgPSBfbG9wZW4xNiggTkVfTU9EVUxFX05BTUUocE1vZHVsZSksIE9GX1JFQUQgKSkgIT0gLTEpCiAgICAgewogICAgICAgICBXT1JEIHNpemVTaGlmdCA9ICooV09SRCAqKSgoY2hhciAqKXBNb2R1bGUgKyBwTW9kdWxlLT5yZXNfdGFibGUpOwogICAgICAgICBORV9OQU1FSU5GTyAqcE5hbWVJbmZvID0gKE5FX05BTUVJTkZPKikoKGNoYXIqKXBNb2R1bGUgKyBoUnNyYyk7Ci0gICAgICAgIF9sbHNlZWszMiggZmQsIChpbnQpcE5hbWVJbmZvLT5vZmZzZXQgPDwgc2l6ZVNoaWZ0LCBTRUVLX1NFVCApOworICAgICAgICBfbGxzZWVrMTYoIGZkLCAoaW50KXBOYW1lSW5mby0+b2Zmc2V0IDw8IHNpemVTaGlmdCwgU0VFS19TRVQgKTsKICAgICB9CiAgICAgcmV0dXJuIGZkOwogfQpkaWZmIC0tZ2l0IGEvbG9hZGVyL3BlX2ltYWdlLmMgYi9sb2FkZXIvcGVfaW1hZ2UuYwppbmRleCA3NmRjODdlLi44ZWY5YjczIDEwMDY0NAotLS0gYS9sb2FkZXIvcGVfaW1hZ2UuYworKysgYi9sb2FkZXIvcGVfaW1hZ2UuYwpAQCAtODI3LDggKzgyNyw5IEBACiAgKiBGSVhNRTogdGhpcyBmdW5jdGlvbiBzaG91bGQgdXNlIFBFX0xvYWRMaWJyYXJ5RXgzMkEsIGJ1dCBjdXJyZW50bHkgY2FuJ3QKICAqIGR1ZSB0byB0aGUgUFJPQ0VTU19DcmVhdGUgc3R1ZmYuCiAgKi8KLUhJTlNUQU5DRTE2IFBFX0xvYWRNb2R1bGUoIExQQ1NUUiBuYW1lLCBMUENTVFIgY21kX2xpbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBMUENTVFIgZW52LCBVSU5UMTYgc2hvd19jbWQgKQorSElOU1RBTkNFMTYgUEVfQ3JlYXRlUHJvY2VzcyggTFBDU1RSIG5hbWUsIExQQ1NUUiBjbWRfbGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQQ1NUUiBlbnYsIExQU1RBUlRVUElORk8zMkEgc3RhcnR1cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQUFJPQ0VTU19JTkZPUk1BVElPTiBpbmZvICkKIHsKICAgICBITU9EVUxFMTYgaE1vZHVsZTE2OwogICAgIEhNT0RVTEUzMiBoTW9kdWxlMzI7CkBAIC04MzYsOCArODM3LDggQEAKICAgICBORV9NT0RVTEUgKnBNb2R1bGU7CiAgICAgSEZJTEUzMiBoRmlsZTsKICAgICBPRlNUUlVDVCBvZnM7Ci0gICAgVEhEQiAqdGhkYiA9IFRIUkVBRF9DdXJyZW50KCk7CiAgICAgUERCMzIgKnByb2Nlc3M7CisgICAgVERCICpwVGFzazsKICAgICBXSU5FX01PRFJFRgkqd207CiAKICAgICBpZiAoKGhGaWxlID0gT3BlbkZpbGUzMiggbmFtZSwgJm9mcywgT0ZfUkVBRCApKSA9PSBIRklMRV9FUlJPUjMyKQpAQCAtODUwLDIxICs4NTEsMTMgQEAKICAgICBwTW9kdWxlLT5tb2R1bGUzMiA9IGhNb2R1bGUzMiA9IFBFX0xvYWRJbWFnZSggaEZpbGUgKTsKICAgICBpZiAoaE1vZHVsZTMyIDwgMzIpIHJldHVybiAyMTsKIAotICAgIGhJbnN0YW5jZSA9IE5FX0NyZWF0ZUluc3RhbmNlKCBwTW9kdWxlLCBOVUxMLCAoY21kX2xpbmUgPT0gTlVMTCkgKTsKLSAgICBpZiAoY21kX2xpbmUgJiYKLSAgICAgICAgIShQRV9IRUFERVIoaE1vZHVsZTMyKS0+RmlsZUhlYWRlci5DaGFyYWN0ZXJpc3RpY3MgJiBJTUFHRV9GSUxFX0RMTCkpCi0gICAgewotICAgICAgICBQUk9DRVNTX0lORk9STUFUSU9OIGluZm87Ci0gICAgICAgIFBEQjMyICpwZGIgPSBQUk9DRVNTX0NyZWF0ZSggcE1vZHVsZSwgY21kX2xpbmUsIGVudiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoSW5zdGFuY2UsIDAsIHNob3dfY21kLCAmaW5mbyApOwotICAgICAgICBUREIgKnBUYXNrID0gKFREQiAqKUdsb2JhbExvY2sxNiggcGRiLT50YXNrICk7Ci0gICAgICAgIHRoZGIgPSBwVGFzay0+dGhkYjsKLSAgICAgICAgLyogd2UgZG9uJ3QgbmVlZCB0aGUgaGFuZGxlcyBmb3Igbm93ICovCi0gICAgICAgIENsb3NlSGFuZGxlKCBpbmZvLmhUaHJlYWQgKTsKLSAgICAgICAgQ2xvc2VIYW5kbGUoIGluZm8uaFByb2Nlc3MgKTsKLSAgICB9CisgICAgaWYgKFBFX0hFQURFUihoTW9kdWxlMzIpLT5GaWxlSGVhZGVyLkNoYXJhY3RlcmlzdGljcyAmIElNQUdFX0ZJTEVfRExMKQorICAgICAgICByZXR1cm4gMTE7CiAKLSAgICBwcm9jZXNzID0gdGhkYi0+cHJvY2VzczsKKyAgICBoSW5zdGFuY2UgPSBORV9DcmVhdGVJbnN0YW5jZSggcE1vZHVsZSwgTlVMTCwgRkFMU0UgKTsKKyAgICBwcm9jZXNzID0gUFJPQ0VTU19DcmVhdGUoIHBNb2R1bGUsIGNtZF9saW5lLCBlbnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoSW5zdGFuY2UsIDAsIHN0YXJ0dXAsIGluZm8gKTsKKyAgICBwVGFzayA9IChUREIgKilHbG9iYWxMb2NrMTYoIHByb2Nlc3MtPnRhc2sgKTsKIAogICAgIHdtPShXSU5FX01PRFJFRiopSGVhcEFsbG9jKHByb2Nlc3MtPmhlYXAsSEVBUF9aRVJPX01FTU9SWSxzaXplb2YoKndtKSk7CiAgICAgd20tPnR5cGUgPSBNT0RVTEUzMl9QRTsKQEAgLTg3OCw4ICs4NzEsMTAgQEAKICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQogICAgIHBNb2R1bGUtPm1vZHVsZTMyID0gd20tPm1vZHVsZTsKKwogICAgIC8qIEZJWE1FOiBZdWNrLiBJcyB0aGVyZSBubyBvdGhlciBnb29kIHBsYWNlIHRvIGRvIHRoYXQ/ICovCi0gICAgUEVfSW5pdFRscyggdGhkYiApOworICAgIFBFX0luaXRUbHMoIHBUYXNrLT50aGRiICk7CisKICAgICByZXR1cm4gaEluc3RhbmNlOwogfQogCkBAIC05MTYsNyArOTExLDcgQEAKICAgICBpZiAoKFBFX0hFQURFUih3bS0+bW9kdWxlKS0+RmlsZUhlYWRlci5DaGFyYWN0ZXJpc3RpY3MgJiBJTUFHRV9GSUxFX0RMTCkgJiYKICAgICAgICAgKFBFX0hFQURFUih3bS0+bW9kdWxlKS0+T3B0aW9uYWxIZWFkZXIuQWRkcmVzc09mRW50cnlQb2ludCkKICAgICApIHsKLSAgICAgICAgRkFSUFJPQzMyIGVudHJ5ID0gKEZBUlBST0MzMilSVkFfUFRSKCB3bS0+bW9kdWxlLAorICAgICAgICBEV09SRCAoQ0FMTEJBQ0sgKmVudHJ5KShITU9EVUxFMzIsRFdPUkQsTFBWT0lEKSA9ICh2b2lkKilSVkFfUFRSKCB3bS0+bW9kdWxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3B0aW9uYWxIZWFkZXIuQWRkcmVzc09mRW50cnlQb2ludCApOwogICAgICAgICBUUkFDRShyZWxheSwgIkNhbGxUbzMyKGVudHJ5cHJvYz0lcCxtb2R1bGU9JTA4eCx0eXBlPSVsZCxyZXM9JXApXG4iLAogICAgICAgICAgICAgICAgICAgICAgICBlbnRyeSwgd20tPm1vZHVsZSwgdHlwZSwgbHBSZXNlcnZlZCApOwpkaWZmIC0tZ2l0IGEvbG9hZGVyL3Jlc291cmNlLmMgYi9sb2FkZXIvcmVzb3VyY2UuYwppbmRleCBiZmYwMGI5Li43OThiOGE1IDEwMDY0NAotLS0gYS9sb2FkZXIvcmVzb3VyY2UuYworKysgYi9sb2FkZXIvcmVzb3VyY2UuYwpAQCAtNjYsNyArNjYsNyBAQAogICovCiBIUlNSQzMyIFdJTkFQSSBGaW5kUmVzb3VyY2VFeDMyVyggSE1PRFVMRTMyIGhNb2R1bGUsIExQQ1dTVFIgbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUENXU1RSIHR5cGUsIFdPUkQgbGFuZyApCi17Cit7CUhSU1JDMzIgcmV0OwogICAgIFdJTkVfTU9EUkVGCSp3bSA9IE1PRFVMRTMyX0xvb2t1cEhNT0RVTEUoUFJPQ0VTU19DdXJyZW50KCksaE1vZHVsZSk7CiAgICAgSFJTUkMzMglocnNyYzsKIApAQCAtODMsNyArODMsMTAgQEAKICAgICBpZiAod20pIHsKICAgICAJc3dpdGNoICh3bS0+dHlwZSkgewogCWNhc2UgTU9EVUxFMzJfUEU6Ci0JICAgIHJldHVybiBQRV9GaW5kUmVzb3VyY2VFeDMyVyh3bSxuYW1lLHR5cGUsbGFuZyk7CisJICAgIHJldCA9ICBQRV9GaW5kUmVzb3VyY2VFeDMyVyh3bSxuYW1lLHR5cGUsbGFuZyk7CisgICAgICAgIGlmICggcmV0PT0wICkKKyAgICAgICAgICBFUlIocmVzb3VyY2UsIiVzIG5vdCBmb3VuZCFcbiIsZGVidWdyZXNfdyAobmFtZSkpOworCSAgICByZXR1cm4gcmV0OwogCWRlZmF1bHQ6CiAJICAgIEVSUihtb2R1bGUsInVua25vd24gbW9kdWxlIHR5cGUgJWRcbiIsd20tPnR5cGUpOwogCSAgICBicmVhazsKQEAgLTIyOSw2ICsyMzIsNyBAQAogewogICAgIEhSU1JDMzIgaFJzcmM7CiAgICAgSEFDQ0VMMzIgaFJldHZhbDsKKyAgICBEV09SRCBzaXplOwogCiAgICAgaWYgKEhJV09SRChscFRhYmxlTmFtZSkpCiAgICAgICAgIFRSQUNFKGFjY2VsLCAiJXAgJyVzJ1xuIiwKQEAgLTI0NCw2ICsyNDgsMTMgQEAKICAgICB9CiAgICAgZWxzZSB7CiAgICAgICBoUmV0dmFsID0gTG9hZFJlc291cmNlMzIoIGluc3RhbmNlLCBoUnNyYyApOworICAgICAgc2l6ZSA9IFNpemVvZlJlc291cmNlMzIoIGluc3RhbmNlLCBoUnNyYyApOworICAgICAgaWYoc2l6ZT49c2l6ZW9mKEFDQ0VMMzIpKQorICAgICAgeworCUxQQUNDRUwzMiBhY2NlbF90YWJsZSA9IChMUEFDQ0VMMzIpIGhSZXR2YWw7CisJLyogbWFyayBsYXN0IGVsZW1lbnQgYXMgc3VjaCAtIHNvbWV0aW1lcyBpdCBpcyBub3QgbWFya2VkIGluIGltYWdlICovCisJYWNjZWxfdGFibGVbc2l6ZS9zaXplb2YoQUNDRUwzMiktMV0uZlZpcnQgfD0gMHg4MDsKKyAgICAgIH0KICAgICB9CiAKICAgICBUUkFDRShhY2NlbCwgInJldHVybmluZyBIQUNDRUwgMHgleFxuIiwgaFJzcmMpOwpkaWZmIC0tZ2l0IGEvbG9hZGVyL3NpZ25hbC5jIGIvbG9hZGVyL3NpZ25hbC5jCmluZGV4IDAwMjNjNjUuLmM2MjY3MjEgMTAwNjQ0Ci0tLSBhL2xvYWRlci9zaWduYWwuYworKysgYi9sb2FkZXIvc2lnbmFsLmMKQEAgLTM0LDkgKzM0LDYgQEAKICNpbmNsdWRlICJzaWdfY29udGV4dC5oIgogI2luY2x1ZGUgIndpbnNvY2suaCIKIAotLyogR2xvYmFsIHZhcmlhYmxlIHRvIHNhdmUgJWZzIHJlZ2lzdGVyIHdoaWxlIGluIDE2LWJpdCBjb2RlICovCi1XT1JEIENBTExUTzE2X0N1cnJlbnRfZnM7Ci0KIC8qIExpbnV4IHNpZ2FjdGlvbiBmdW5jdGlvbiAqLwogCiAjaWYgZGVmaW5lZChsaW51eCkgJiYgZGVmaW5lZChfX2kzODZfXykKZGlmZiAtLWdpdCBhL2xvYWRlci90YXNrLmMgYi9sb2FkZXIvdGFzay5jCmluZGV4IDdkMTgxNGQuLjA5OTMzM2UgMTAwNjQ0Ci0tLSBhL2xvYWRlci90YXNrLmMKKysrIGIvbG9hZGVyL3Rhc2suYwpAQCAtNiw2ICs2LDcgQEAKIAogI2luY2x1ZGUgPHN0ZGxpYi5oPgogI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGFzc2VydC5oPgogCiAjaW5jbHVkZSAid2luZG93cy5oIgogI2luY2x1ZGUgInVzZXIuaCIKQEAgLTU1LDYgKzU2LDkgQEAKIAogc3RhdGljIHZvaWQgVEFTS19ZaWVsZFRvU3lzdGVtKFREQiopOwogCitleHRlcm4gQk9PTDMyIFRIUkVBRF9Jbml0RG9uZTsKKworCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCSAgICAgVEFTS19JbnN0YWxsVEhIb29rCiAgKi8KQEAgLTc4LDcgKzgyLDYgQEAKICAgICByZXR1cm4gKGhGaXJzdFRhc2sgIT0gaFRhc2spID8gaEZpcnN0VGFzayA6IDA7IAogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIFRBU0tfTGlua1Rhc2sKICAqLwpAQCAtMjIyLDggKzIyNSw3IEBACiAgKi8KIHN0YXRpYyB2b2lkIFRBU0tfQ2FsbFRvU3RhcnQodm9pZCkKIHsKLSAgICBpbnQgZXhpdF9jb2RlID0gMTsKLSAgICBUREIgKnBUYXNrID0gKFREQiAqKUdsb2JhbExvY2sxNiggaEN1cnJlbnRUYXNrICk7CisgICAgVERCICpwVGFzayA9IChUREIgKilHbG9iYWxMb2NrMTYoIEdldEN1cnJlbnRUYXNrKCkgKTsKICAgICBORV9NT0RVTEUgKnBNb2R1bGUgPSBORV9HZXRQdHIoIHBUYXNrLT5oTW9kdWxlICk7CiAgICAgU0VHVEFCTEVFTlRSWSAqcFNlZ1RhYmxlID0gTkVfU0VHX1RBQkxFKCBwTW9kdWxlICk7CiAKQEAgLTIzNyw3ICsyMzksMTEgQEAKICAgICB7CiAgICAgICAgIC8qIEZJWE1FOiBhbGwgdGhpcyBpcyBhbiB1Z2x5IGhhY2sgKi8KIAotICAgICAgICBGQVJQUk9DMzIgZW50cnkgPSAoRkFSUFJPQzMyKVJWQV9QVFIoIFBST0NFU1NfQ3VycmVudCgpLT5leGVfbW9kcmVmLT5tb2R1bGUsIE9wdGlvbmFsSGVhZGVyLkFkZHJlc3NPZkVudHJ5UG9pbnQgKTsKKyAgICAgICAgTFBUSFJFQURfU1RBUlRfUk9VVElORSBlbnRyeSA9IChMUFRIUkVBRF9TVEFSVF9ST1VUSU5FKQorICAgICAgICAgICAgICAgIFJWQV9QVFIocE1vZHVsZS0+bW9kdWxlMzIsIE9wdGlvbmFsSGVhZGVyLkFkZHJlc3NPZkVudHJ5UG9pbnQpOworICAgICAgICBEV09SRCBzaXplID0gUEVfSEVBREVSKHBNb2R1bGUtPm1vZHVsZTMyKS0+T3B0aW9uYWxIZWFkZXIuU2l6ZU9mU3RhY2tSZXNlcnZlOworICAgICAgICBEV09SRCBpZDsKKyAgICAgICAgVEhEQiAqdGhkYjsKIAogICAgICAgICBwVGFzay0+dXNlcmhhbmRsZXIgPSAoVVNFUlNJR05BTFBST0MpJlVTRVJfU2lnbmFsUHJvYzsKICAgICAgICAgaWYgKHBNb2R1bGUtPmhlYXBfc2l6ZSkKQEAgLTI0NiwyMiArMjUyLDI3IEBACiAgICAgICAgIEluaXRBcHAoIHBUYXNrLT5oTW9kdWxlICk7CiAgICAgICAgIFBFX0luaXRpYWxpemVETExzKCBQUk9DRVNTX0N1cnJlbnQoKSwgRExMX1BST0NFU1NfQVRUQUNILCAoTFBWT0lEKS0xICk7CiAgICAgICAgIFRSQUNFKHJlbGF5LCAiKGVudHJ5cHJvYz0lcClcbiIsIGVudHJ5ICk7Ci0gICAgICAgIGV4aXRfY29kZSA9IGVudHJ5KCk7Ci0gICAgICAgIFRBU0tfS2lsbEN1cnJlbnRUYXNrKCBleGl0X2NvZGUgKTsKLSAgICB9Ci0jaWZkZWYgbGludXgKLSAgICBlbHNlIGlmIChwTW9kdWxlLT5scERvc1Rhc2spCi0gICAgewotICAgICAgICBpbnQgc3RhdDsKIAotICAgICAgICB3aGlsZSAoKHN0YXQgPSBNWl9SdW5Nb2R1bGUocE1vZHVsZS0+bHBEb3NUYXNrKSkgPj0gMCkKLSAgICAgICAgICAgIGlmIChzdGF0ID4gMCAmJiBET1NWTV9Qcm9jZXNzKHBNb2R1bGUtPmxwRG9zVGFzaykgPCAwKQotICAgICAgICAgICAgICAgIGJyZWFrOworI2lmIDEKKyAgICAgICAgRXhpdFByb2Nlc3MoIGVudHJ5KE5VTEwpICk7CisjZWxzZQorICAgICAgICBDcmVhdGVUaHJlYWQoIE5VTEwsIHNpemUsIGVudHJ5LCBOVUxMLCAwLCAmaWQgKTsKKyAgICAgICAgdGhkYiA9IFRIUkVBRF9JRF9UT19USERCKCBpZCApOwogCi0gICAgICAgIE1aX0tpbGxNb2R1bGUocE1vZHVsZS0+bHBEb3NUYXNrKTsKLSAgICAgICAgVEFTS19LaWxsQ3VycmVudFRhc2soIDAgKTsKLSAgICB9CisgICAgICAgIHdoaWxlICggdGhkYi0+ZXhpdF9jb2RlID09IDB4MTAzICkKKyAgICAgICAgeworICAgICAgICAgICAgV2FpdEV2ZW50KCAwICk7CisgICAgICAgICAgICBRVUVVRV9TaWduYWwoIHBUYXNrLT5oU2VsZiApOworICAgICAgICB9CisKKyAgICAgICAgRXhpdFByb2Nlc3MoIHRoZGItPmV4aXRfY29kZSApOwogI2VuZGlmCisgICAgfQorICAgIGVsc2UgaWYgKHBNb2R1bGUtPmRvc19pbWFnZSkKKyAgICB7CisgICAgICAgIERPU1ZNX0VudGVyKCBOVUxMICk7CisgICAgICAgIEV4aXRQcm9jZXNzKCAwICk7CisgICAgfQogICAgIGVsc2UKICAgICB7CiAgICAgICAgIC8qIFJlZ2lzdGVycyBhdCBpbml0aWFsaXphdGlvbiBtdXN0IGJlOgpAQCAtMjk1LDEzICszMDYsMTcgQEAKICAgICAgICAgQ2FsbGJhY2tzLT5DYWxsUmVnaXN0ZXJTaG9ydFByb2MoICZjb250ZXh0LCAwICk7CiAgICAgICAgIC8qIFRoaXMgc2hvdWxkIG5ldmVyIHJldHVybiAqLwogICAgICAgICBFUlIoIHRhc2ssICJNYWluIHByb2dyYW0gcmV0dXJuZWQhIChzaG91bGQgbmV2ZXIgaGFwcGVuKVxuIiApOwotICAgICAgICBUQVNLX0tpbGxDdXJyZW50VGFzayggMSApOworICAgICAgICBFeGl0UHJvY2VzcyggMSApOwogICAgIH0KIH0KIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBUQVNLX0NyZWF0ZQorICoKKyAqIE5PVEU6IFRoaXMgcm91dGluZSBtaWdodCBiZSBjYWxsZWQgYnkgYSBXaW4zMiB0aHJlYWQuIFdlIGRvbid0IGhhdmUKKyAqICAgICAgIGFueSByZWFsIHByb2JsZW1zIHdpdGggdGhhdCwgc2luY2Ugd2Ugb3BlcmF0ZWQgbWVyZWx5IG9uIGEgcHJpdmF0ZQorICogICAgICAgVERCIHN0cnVjdHVyZSB0aGF0IGlzIG5vdCB5ZXQgbGlua2VkIGludG8gdGhlIHRhc2sgbGlzdC4KICAqLwogSFRBU0sxNiBUQVNLX0NyZWF0ZSggVEhEQiAqdGhkYiwgTkVfTU9EVUxFICpwTW9kdWxlLCBISU5TVEFOQ0UxNiBoSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICBISU5TVEFOQ0UxNiBoUHJldkluc3RhbmNlLCBVSU5UMTYgY21kU2hvdykKQEAgLTMzOSw3ICszNTQsNyBAQAogICAgIHBUYXNrLT5oSW5zdGFuY2UgICAgID0gaEluc3RhbmNlOwogICAgIHBUYXNrLT5oUHJldkluc3RhbmNlID0gaFByZXZJbnN0YW5jZTsKICAgICBwVGFzay0+aE1vZHVsZSAgICAgICA9IHBNb2R1bGUtPnNlbGY7Ci0gICAgcFRhc2stPmhQYXJlbnQgICAgICAgPSBoQ3VycmVudFRhc2s7CisgICAgcFRhc2stPmhQYXJlbnQgICAgICAgPSBHZXRDdXJyZW50VGFzaygpOwogICAgIHBUYXNrLT5tYWdpYyAgICAgICAgID0gVERCX01BR0lDOwogICAgIHBUYXNrLT5uQ21kU2hvdyAgICAgID0gY21kU2hvdzsKICAgICBwVGFzay0+dGhkYiAgICAgICAgICA9IHRoZGI7CkBAIC00MzksOSArNDU0LDYgQEAKICAgICBpZiAoIVRIUkVBRF9DdXJyZW50KCktPmN1cl9zdGFjaykKICAgICAgICAgVEhSRUFEX0N1cnJlbnQoKS0+Y3VyX3N0YWNrID0gcFRhc2stPnRoZGItPmN1cl9zdGFjazsKIAotICAgIC8qIEFkZCB0aGUgdGFzayB0byB0aGUgbGlua2VkIGxpc3QgKi8KLQotICAgIFRBU0tfTGlua1Rhc2soIGhUYXNrICk7CiAKICAgICBUUkFDRSh0YXNrLCAibW9kdWxlPSclcycgY21kbGluZT0nJXMnIHRhc2s9JTA0eFxuIiwKICAgICAgICAgICBuYW1lLCBjbWRfbGluZSwgaFRhc2sgKTsKQEAgLTQ0OSw2ICs0NjEsMzUgQEAKICAgICByZXR1cm4gaFRhc2s7CiB9CiAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIFRBU0tfU3RhcnRUYXNrCisgKgorICogTk9URTogVGhpcyByb3V0aW5lIG1pZ2h0IGJlIGNhbGxlZCBieSBhIFdpbjMyIHRocmVhZC4gVGh1cywgd2UgbmVlZAorICogICAgICAgdG8gYmUgY2FyZWZ1bCB0byBwcm90ZWN0IGdsb2JhbCBkYXRhIHN0cnVjdHVyZXMuIFdlIGRvIHRoaXMKKyAqICAgICAgIGJ5IGVudGVyaW5nIHRoZSBXaW4xNkxvY2sgd2hpbGUgbGlua2luZyB0aGUgdGFzayBpbnRvIHRoZQorICogICAgICAgZ2xvYmFsIHRhc2sgbGlzdC4KKyAqLwordm9pZCBUQVNLX1N0YXJ0VGFzayggSFRBU0sxNiBoVGFzayApCit7CisgICAgLyogQWRkIHRoZSB0YXNrIHRvIHRoZSBsaW5rZWQgbGlzdCAqLworCisgICAgU1lTTEVWRUxfRW50ZXJXaW4xNkxvY2soKTsKKyAgICBUQVNLX0xpbmtUYXNrKCBoVGFzayApOworICAgIFNZU0xFVkVMX0xlYXZlV2luMTZMb2NrKCk7CisKKyAgICBUUkFDRSh0YXNrLCAibGlua2VkIHRhc2sgJTA0eFxuIiwgaFRhc2sgKTsKKworICAgIC8qIEdldCB0aGUgdGFzayB1cCBhbmQgcnVubmluZy4gSWYgd2Ugb3Vyc2VsdmVzIGFyZSBhIDE2LWJpdCB0YXNrLAorICAgICAgIHdlIHNpbXBseSBZaWVsZCgpLiBJZiB3ZSBhcmUgMzItYml0IGhvd2V2ZXIsIHdlIG5lZWQgdG8gc2lnbmFsCisgICAgICAgdGhlIG1haW4gcHJvY2VzcyBzb21laG93IChOT1QgWUVUIElNUExFTUVOVEVEISkgKi8KKworICAgIGlmICggR2V0Q3VycmVudFRhc2soKSApCisgICAgICAgIGlmICggVEhSRUFEX0lzV2luMTYoIFRIUkVBRF9DdXJyZW50KCkgKSApCisgICAgICAgICAgICBZaWVsZDE2KCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIEZJWE1FKHRhc2ssICJEb24ndCBrbm93IGhvdyB0byBzdGFydCAxNi1iaXQgdGFzayBmcm9tIDMyLWJpdCB0aHJlYWQuIE1vdmUgdGhlIG1vdXNlIVxuIik7Cit9CisKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgVEFTS19EZWxldGVUYXNrCkBAIC00OTgsOSArNTM5LDI1IEBACiAgKi8KIHZvaWQgVEFTS19LaWxsQ3VycmVudFRhc2soIElOVDE2IGV4aXRDb2RlICkKIHsKLSAgICBUREIqIHBUYXNrID0gKFREQiopIEdsb2JhbExvY2sxNiggaEN1cnJlbnRUYXNrICk7CisgICAgVERCKiBwVGFzayA9IChUREIqKSBHbG9iYWxMb2NrMTYoIEdldEN1cnJlbnRUYXNrKCkgKTsKKyAgICBORV9NT0RVTEUqIHBNb2R1bGUgPSBORV9HZXRQdHIoIHBUYXNrLT5oTW9kdWxlICk7CiAgICAgaWYgKCFwVGFzaykgVVNFUl9FeGl0V2luZG93cygpOyAgLyogTm8gY3VycmVudCB0YXNrIHlldCAqLwogCisgICAgaWYgKCAhVEhSRUFEX0lzV2luMTYoIFRIUkVBRF9DdXJyZW50KCkgKSApCisgICAgeworICAgICAgICBGSVhNRSh0YXNrLCAiY2FsbGVkIGZvciBXaW4zMiB0aHJlYWQgKCUwNHgpIVxuIiwgVEhSRUFEX0N1cnJlbnQoKS0+dGViX3NlbCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvKiBFbnRlciB0aGUgV2luMTZMb2NrIHRvIHByb3RlY3QgZ2xvYmFsIGRhdGEgc3RydWN0dXJlcworICAgICAgIE5PVEU6IFdlIG5ldmVyIGV4cGxpY2l0bHkgbGVhdmUgaXQgYWdhaW4uIFRoaXMgc2hvdWxkbid0IG1hdHRlcgorICAgICAgICAgICAgIHRob3VnaCwgYXMgaXQgd2lsbCBiZSByZWxlYXNlZCBpbiBUQVNLX1Jlc2NoZWR1bGUgYW5kIHRoaXMKKyAgICAgICAgICAgICB0YXNrIHdvbid0IGV2ZXIgZ2V0IHNjaGVkdWxlZCBhZ2FpbiAuLi4gKi8KKworICAgIFNZU0xFVkVMX0VudGVyV2luMTZMb2NrKCk7CisKKyAgICBhc3NlcnQoaEN1cnJlbnRUYXNrID09IEdldEN1cnJlbnRUYXNrKCkpOworCiAgICAgVFJBQ0UodGFzaywgIktpbGxpbmcgdGFzayAlMDR4XG4iLCBoQ3VycmVudFRhc2sgKTsKIAogICAgIC8qIERlbGV0ZSBhY3RpdmUgc29ja2V0cyAqLwpAQCAtNTA4LDYgKzU2NSwxMiBAQAogICAgIGlmKCBwVGFzay0+cHdzaSApCiAJV0lOU09DS19EZWxldGVUYXNrV1NJKCBwVGFzaywgcFRhc2stPnB3c2kgKTsKIAorI2lmZGVmIE1aX1NVUFBPUlRFRAorICAgIC8qIEtpbGwgRE9TIFZNIHRhc2sgKi8KKyAgICBpZiAoIHBNb2R1bGUtPmxwRG9zVGFzayApCisgICAgICAgIE1aX0tpbGxNb2R1bGUoIHBNb2R1bGUtPmxwRG9zVGFzayApOworI2VuZGlmCisKICAgICAvKiBQZXJmb3JtIFVTRVIgY2xlYW51cCAqLwogCiAgICAgaWYgKHBUYXNrLT51c2VyaGFuZGxlcikKQEAgLTU2Nyw5ICs2MzAsMTUgQEAKICAgICBIVEFTSzE2IGhUYXNrID0gMDsKICAgICBTVEFDSzE2RlJBTUUgKm5ld2ZyYW1lMTY7CiAKLSAgICBTWVNMRVZFTF9SZWxlYXNlV2luMTZMb2NrKCk7CisgICAgLyogTk9URTogQXMgd2UgYXJlIGVudGVyZWQgZnJvbSAxNi1iaXQgY29kZSwgd2UgaG9sZCB0aGUgV2luMTZMb2NrLgorICAgICAgICAgICAgIFdlIGhhbmcgb250byBpdCB0aG91Z2hvdXQgbW9zdCBvZiB0aGlzIHJvdXRpbmUsIHNvIHRoYXQgYWNjZXNzZXMKKyAgICAgICAgICAgICB0byBnbG9iYWwgdmFyaWFibGVzIChtb3N0IG5vdGFibHkgdGhlIHRhc2sgbGlzdCkgYXJlIHByb3RlY3RlZC4gKi8KKyAgICBhc3NlcnQoaEN1cnJlbnRUYXNrID09IEdldEN1cnJlbnRUYXNrKCkpOworCisgICAgVFJBQ0UodGFzaywgImVudGVyZWQgd2l0aCBoVGFzayAlMDR4IChwaWQgJWQpXG4iLCBoQ3VycmVudFRhc2ssIGdldHBpZCgpKTsKIAogI2lmZGVmIENPTkZJR19JUEMKKyAgICAvKiBGSVhNRTogV2hhdCBhYm91dCB0aGUgV2luMTZMb2NrID8/PyAqLwogICAgIGRkZV9yZXNjaGVkdWxlKCk7CiAjZW5kaWYKICAgICAgIC8qIEZpcnN0IGNoZWNrIGlmIHRoZXJlJ3MgYSB0YXNrIHRvIGtpbGwgKi8KQEAgLTYxNiwxMyArNjg1LDE5IEBACiAKICAgICAgICAgLyogTm8gdGFzayBmb3VuZCwgd2FpdCBmb3Igc29tZSBldmVudHMgdG8gY29tZSBpbiAqLwogCisgICAgICAgIC8qIE5PVEU6IFdlIHJlbGVhc2UgdGhlIFdpbjE2TG9jayB3aGlsZSB3YWl0aW5nIGZvciBldmVudHMuIFRoaXMgaXMgdG8gZW5hYmxlCisgICAgICAgICAgICAgICAgIFdpbjMyIHRocmVhZHMgdG8gdGh1bmsgZG93biB0byAxNi1iaXQgdGVtcG9yYXJpbHkuIFNpbmNlIFdpbjE2CisgICAgICAgICAgICAgICAgIHRhc2tzIHdvbid0IGV4ZWN1dGUgYW5kIFdpbjMyIHRocmVhZHMgYXJlIG5vdCBhbGxvd2VkIHRvIGVudGVyIAorICAgICAgICAgICAgICAgICBUQVNLX1Jlc2NoZWR1bGUgYW55d2F5LCB0aGVyZSBzaG91bGQgYmUgbm8gcmUtZW50cmFuY3kgcHJvYmxlbSAuLi4gKi8KKworICAgICAgICBTWVNMRVZFTF9SZWxlYXNlV2luMTZMb2NrKCk7CiAgICAgICAgIEVWRU5UX1dhaXROZXRFdmVudCggVFJVRSwgVFJVRSApOworICAgICAgICBTWVNMRVZFTF9SZXN0b3JlV2luMTZMb2NrKCk7CiAgICAgfQogCiAgICAgaWYgKGhUYXNrID09IGhDdXJyZW50VGFzaykgCiAgICAgewogICAgICAgIFRSQUNFKHRhc2ssICJyZXR1cm5pbmcgdG8gdGhlIGN1cnJlbnQgdGFzayglMDR4KVxuIiwgaFRhc2sgKTsKLSAgICAgICBTWVNMRVZFTF9SZXN0b3JlV2luMTZMb2NrKCk7CiAgICAgICAgcmV0dXJuOyAgLyogTm90aGluZyB0byBkbyAqLwogICAgIH0KICAgICBwTmV3VGFzayA9IChUREIgKilHbG9iYWxMb2NrMTYoIGhUYXNrICk7CkBAIC02NTUsNiArNzMwLDEyIEBACiAgICAgCiAgICAgLyogU3dpdGNoIHRvIHRoZSBuZXcgc3RhY2sgKi8KIAorICAgIC8qIE5PVEU6IFdlIG5lZWQgdG8gcmVsZWFzZS9yZXN0b3JlIHRoZSBXaW4xNkxvY2ssIGFzIHRoZSB0YXNrCisgICAgICAgICAgICAgc3dpdGNoZWQgdG8gbWlnaHQgYmUgYXQgYW5vdGhlciByZWN1cnNpb24gbGV2ZWwgdGhhbgorICAgICAgICAgICAgIHRoZSBvbGQgdGFzayAuLi4gKi8KKworICAgIFNZU0xFVkVMX1JlbGVhc2VXaW4xNkxvY2soKTsKKwogICAgIGhDdXJyZW50VGFzayA9IGhUYXNrOwogICAgIFNFVF9DVVJfVEhSRUFEKCBwTmV3VGFzay0+dGhkYiApOwogICAgIHBOZXdUYXNrLT5zc19zcCA9IHBOZXdUYXNrLT50aGRiLT5jdXJfc3RhY2s7CkBAIC02NzMsNiArNzU0LDEyIEBACiB7CiAgIE1FU1NBR0VRVUVVRSoJCXBROwogCisgIGlmICggIVRIUkVBRF9Jc1dpbjE2KCBUSFJFQURfQ3VycmVudCgpICkgKQorICB7CisgICAgRklYTUUodGFzaywgImNhbGxlZCBmb3IgV2luMzIgdGhyZWFkICglMDR4KSFcbiIsIFRIUkVBRF9DdXJyZW50KCktPnRlYl9zZWwpOworICAgIHJldHVybjsKKyAgfQorCiAgIENhbGxiYWNrcy0+Q2FsbFRhc2tSZXNjaGVkdWxlUHJvYygpOwogCiAgIGlmKCBwVGFzayApCkBAIC03MDIsNyArNzg5LDcgQEAKICAgICBMT05HIHN0YWNrbG93LCBzdGFja2hpOwogCiAgICAgaWYgKGNvbnRleHQpIEVBWF9yZWcoY29udGV4dCkgPSAwOwotICAgIGlmICghKHBUYXNrID0gKFREQiAqKUdsb2JhbExvY2sxNiggaEN1cnJlbnRUYXNrICkpKSByZXR1cm47CisgICAgaWYgKCEocFRhc2sgPSAoVERCICopR2xvYmFsTG9jazE2KCBHZXRDdXJyZW50VGFzaygpICkpKSByZXR1cm47CiAgICAgaWYgKCEocE1vZHVsZSA9IE5FX0dldFB0ciggcFRhc2stPmhNb2R1bGUgKSkpIHJldHVybjsKIAogICAgIC8qIFRoaXMgaXMgYSBoYWNrIHRvIGluc3RhbGwgdGFzayBVU0VSIHNpZ25hbCBoYW5kbGVyIGJlZm9yZSAKQEAgLTc3MCw4ICs4NTcsMTUgQEAKIHsKICAgICBUREIgKnBUYXNrOwogCi0gICAgaWYgKCFoVGFzaykgaFRhc2sgPSBoQ3VycmVudFRhc2s7CisgICAgaWYgKCFoVGFzaykgaFRhc2sgPSBHZXRDdXJyZW50VGFzaygpOwogICAgIHBUYXNrID0gKFREQiAqKUdsb2JhbExvY2sxNiggaFRhc2sgKTsKKworICAgIGlmICggIVRIUkVBRF9Jc1dpbjE2KCBUSFJFQURfQ3VycmVudCgpICkgKQorICAgIHsKKyAgICAgICAgRklYTUUodGFzaywgImNhbGxlZCBmb3IgV2luMzIgdGhyZWFkICglMDR4KSFcbiIsIFRIUkVBRF9DdXJyZW50KCktPnRlYl9zZWwpOworICAgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisKICAgICBpZiAocFRhc2stPm5FdmVudHMgPiAwKQogICAgIHsKICAgICAgICAgcFRhc2stPm5FdmVudHMtLTsKQEAgLTc5Myw4ICs4ODcsMTYgQEAKIHsKICAgICBUREIgKnBUYXNrOwogCi0gICAgaWYgKCFoVGFzaykgaFRhc2sgPSBoQ3VycmVudFRhc2s7CisgICAgaWYgKCFoVGFzaykgaFRhc2sgPSBHZXRDdXJyZW50VGFzaygpOwogICAgIGlmICghKHBUYXNrID0gKFREQiAqKUdsb2JhbExvY2sxNiggaFRhc2sgKSkpIHJldHVybjsKKworICAgIGlmICggIVRIUkVBRF9Jc1dpbjE2KCBUSFJFQURfQ3VycmVudCgpICkgKQorICAgIHsKKyAgICAgICAgRklYTUUodGFzaywgImNhbGxlZCBmb3IgV2luMzIgdGhyZWFkICglMDR4KSFcbiIsIFRIUkVBRF9DdXJyZW50KCktPnRlYl9zZWwpOworICAgICAgICBtZW1zZXQoMCwgMCwgNDA5Nik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKICAgICBwVGFzay0+bkV2ZW50cysrOwogfQogCkBAIC04MDcsNyArOTA5LDcgQEAKICAgICBUREIgKnBUYXNrOwogICAgIElOVDE2IG5ld3ByaW9yaXR5OwogCi0gICAgaWYgKCFoVGFzaykgaFRhc2sgPSBoQ3VycmVudFRhc2s7CisgICAgaWYgKCFoVGFzaykgaFRhc2sgPSBHZXRDdXJyZW50VGFzaygpOwogICAgIGlmICghKHBUYXNrID0gKFREQiAqKUdsb2JhbExvY2sxNiggaFRhc2sgKSkpIHJldHVybjsKICAgICBuZXdwcmlvcml0eSA9IHBUYXNrLT5wcmlvcml0eSArIGRlbHRhOwogICAgIGlmIChuZXdwcmlvcml0eSA8IC0zMikgbmV3cHJpb3JpdHkgPSAtMzI7CkBAIC04MjUsNyArOTI3LDcgQEAKICAqLwogSFRBU0sxNiBXSU5BUEkgTG9ja0N1cnJlbnRUYXNrKCBCT09MMTYgYkxvY2sgKQogewotICAgIGlmIChiTG9jaykgaExvY2tlZFRhc2sgPSBoQ3VycmVudFRhc2s7CisgICAgaWYgKGJMb2NrKSBoTG9ja2VkVGFzayA9IEdldEN1cnJlbnRUYXNrKCk7CiAgICAgZWxzZSBoTG9ja2VkVGFzayA9IDA7CiAgICAgcmV0dXJuIGhMb2NrZWRUYXNrOwogfQpAQCAtODQ1LDkgKzk0NywxNCBAQAogICovCiB2b2lkIFdJTkFQSSBPbGRZaWVsZCh2b2lkKQogewotICAgIFREQiAqcEN1clRhc2s7CisgICAgVERCICpwQ3VyVGFzayA9IChUREIgKilHbG9iYWxMb2NrMTYoIEdldEN1cnJlbnRUYXNrKCkgKTsKIAotICAgIHBDdXJUYXNrID0gKFREQiAqKUdsb2JhbExvY2sxNiggaEN1cnJlbnRUYXNrICk7CisgICAgaWYgKCAhVEhSRUFEX0lzV2luMTYoIFRIUkVBRF9DdXJyZW50KCkgKSApCisgICAgeworICAgICAgICBGSVhNRSh0YXNrLCAiY2FsbGVkIGZvciBXaW4zMiB0aHJlYWQgKCUwNHgpIVxuIiwgVEhSRUFEX0N1cnJlbnQoKS0+dGViX3NlbCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKICAgICBpZiAocEN1clRhc2spIHBDdXJUYXNrLT5uRXZlbnRzKys7ICAvKiBNYWtlIHN1cmUgd2UgZ2V0IGJhY2sgaGVyZSAqLwogICAgIFRBU0tfWWllbGRUb1N5c3RlbShwQ3VyVGFzayk7CiAgICAgaWYgKHBDdXJUYXNrKSBwQ3VyVGFzay0+bkV2ZW50cy0tOwpAQCAtODU5LDcgKzk2NiwxNCBAQAogICovCiB2b2lkIFdJTkFQSSBEaXJlY3RlZFlpZWxkKCBIVEFTSzE2IGhUYXNrICkKIHsKLSAgICBUREIgKnBDdXJUYXNrID0gKFREQiAqKUdsb2JhbExvY2sxNiggaEN1cnJlbnRUYXNrICk7CisgICAgVERCICpwQ3VyVGFzayA9IChUREIgKilHbG9iYWxMb2NrMTYoIEdldEN1cnJlbnRUYXNrKCkgKTsKKworICAgIGlmICggIVRIUkVBRF9Jc1dpbjE2KCBUSFJFQURfQ3VycmVudCgpICkgKQorICAgIHsKKyAgICAgICAgRklYTUUodGFzaywgImNhbGxlZCBmb3IgV2luMzIgdGhyZWFkICglMDR4KSFcbiIsIFRIUkVBRF9DdXJyZW50KCktPnRlYl9zZWwpOworICAgICAgICByZXR1cm47CisgICAgfQorCiAgICAgcEN1clRhc2stPmhZaWVsZFRvID0gaFRhc2s7CiAgICAgT2xkWWllbGQoKTsKIH0KQEAgLTg3MCw4ICs5ODQsMTUgQEAKICAqLwogdm9pZCBXSU5BUEkgVXNlcllpZWxkKHZvaWQpCiB7Ci0gICAgVERCICpwQ3VyVGFzayA9IChUREIgKilHbG9iYWxMb2NrMTYoIGhDdXJyZW50VGFzayApOworICAgIFREQiAqcEN1clRhc2sgPSAoVERCICopR2xvYmFsTG9jazE2KCBHZXRDdXJyZW50VGFzaygpICk7CiAgICAgTUVTU0FHRVFVRVVFICpxdWV1ZSA9IChNRVNTQUdFUVVFVUUgKilHbG9iYWxMb2NrMTYoIHBDdXJUYXNrLT5oUXVldWUgKTsKKworICAgIGlmICggIVRIUkVBRF9Jc1dpbjE2KCBUSFJFQURfQ3VycmVudCgpICkgKQorICAgIHsKKyAgICAgICAgRklYTUUodGFzaywgImNhbGxlZCBmb3IgV2luMzIgdGhyZWFkICglMDR4KSFcbiIsIFRIUkVBRF9DdXJyZW50KCktPnRlYl9zZWwpOworICAgICAgICByZXR1cm47CisgICAgfQorCiAgICAgLyogSGFuZGxlIHNlbnQgbWVzc2FnZXMgKi8KICAgICB3aGlsZSAocXVldWUgJiYgKHF1ZXVlLT53YWtlQml0cyAmIFFTX1NFTkRNRVNTQUdFKSkKICAgICAgICAgUVVFVUVfUmVjZWl2ZU1lc3NhZ2UoIHF1ZXVlICk7CkBAIC04ODksNyArMTAxMCwxNCBAQAogICovCiB2b2lkIFdJTkFQSSBZaWVsZDE2KHZvaWQpCiB7Ci0gICAgVERCICpwQ3VyVGFzayA9IChUREIgKilHbG9iYWxMb2NrMTYoIGhDdXJyZW50VGFzayApOworICAgIFREQiAqcEN1clRhc2sgPSAoVERCICopR2xvYmFsTG9jazE2KCBHZXRDdXJyZW50VGFzaygpICk7CisKKyAgICBpZiAoICFUSFJFQURfSXNXaW4xNiggVEhSRUFEX0N1cnJlbnQoKSApICkKKyAgICB7CisgICAgICAgIEZJWE1FKHRhc2ssICJjYWxsZWQgZm9yIFdpbjMyIHRocmVhZCAoJTA0eCkhXG4iLCBUSFJFQURfQ3VycmVudCgpLT50ZWJfc2VsKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKwogICAgIGlmIChwQ3VyVGFzaykgcEN1clRhc2stPmhZaWVsZFRvID0gMDsKICAgICBpZiAocEN1clRhc2sgJiYgcEN1clRhc2stPmhRdWV1ZSkgVXNlcllpZWxkKCk7CiAgICAgZWxzZSBPbGRZaWVsZCgpOwpAQCAtOTA1LDcgKzEwMzMsNyBAQAogICAgIFNFR1BUUiB0aHVua2FkZHI7CiAKICAgICBpZiAoIWhJbnN0YW5jZSkgaEluc3RhbmNlID0gQ1VSUkVOVF9EUzsKLSAgICB0aHVua2FkZHIgPSBUQVNLX0FsbG9jVGh1bmsoIGhDdXJyZW50VGFzayApOworICAgIHRodW5rYWRkciA9IFRBU0tfQWxsb2NUaHVuayggR2V0Q3VycmVudFRhc2soKSApOwogICAgIGlmICghdGh1bmthZGRyKSByZXR1cm4gKEZBUlBST0MxNikwOwogICAgIHRodW5rID0gUFRSX1NFR19UT19MSU4oIHRodW5rYWRkciApOwogICAgIGxmdW5jID0gUFRSX1NFR19UT19MSU4oIGZ1bmMgKTsKQEAgLTkzNSw3ICsxMDYzLDcgQEAKIHZvaWQgV0lOQVBJIEZyZWVQcm9jSW5zdGFuY2UxNiggRkFSUFJPQzE2IGZ1bmMgKQogewogICAgIFRSQUNFKHRhc2ssICIoJTA4bHgpXG4iLCAoRFdPUkQpZnVuYyApOwotICAgIFRBU0tfRnJlZVRodW5rKCBoQ3VycmVudFRhc2ssIChTRUdQVFIpZnVuYyApOworICAgIFRBU0tfRnJlZVRodW5rKCBHZXRDdXJyZW50VGFzaygpLCAoU0VHUFRSKWZ1bmMgKTsKIH0KIAogCkBAIC05NzcsNyArMTEwNSw3IEBACiAgICAgSFFVRVVFMTYgaFByZXY7CiAgICAgVERCICpwVGFzazsKIAotICAgIGlmICghaFRhc2spIGhUYXNrID0gaEN1cnJlbnRUYXNrOworICAgIGlmICghaFRhc2spIGhUYXNrID0gR2V0Q3VycmVudFRhc2soKTsKICAgICBpZiAoIShwVGFzayA9IChUREIgKilHbG9iYWxMb2NrMTYoIGhUYXNrICkpKSByZXR1cm4gMDsKIAogICAgIGhQcmV2ID0gcFRhc2stPmhRdWV1ZTsKQEAgLTk5Niw3ICsxMTI0LDcgQEAKIHsKICAgICBUREIgKnBUYXNrOwogCi0gICAgaWYgKCFoVGFzaykgaFRhc2sgPSBoQ3VycmVudFRhc2s7CisgICAgaWYgKCFoVGFzaykgaFRhc2sgPSBHZXRDdXJyZW50VGFzaygpOwogICAgIGlmICghKHBUYXNrID0gKFREQiAqKUdsb2JhbExvY2sxNiggaFRhc2sgKSkpIHJldHVybiAwOwogICAgIHJldHVybiBwVGFzay0+aFF1ZXVlOwogfQpAQCAtMTAxMiw3ICsxMTQwLDcgQEAKICAgICBJTlNUQU5DRURBVEEgKnBEYXRhOwogICAgIFVJTlQxNiBjb3B5U2l6ZTsKIAotICAgIGlmICghKHBUYXNrID0gKFREQiAqKUdsb2JhbExvY2sxNiggaEN1cnJlbnRUYXNrICkpKSByZXR1cm47CisgICAgaWYgKCEocFRhc2sgPSAoVERCICopR2xvYmFsTG9jazE2KCBHZXRDdXJyZW50VGFzaygpICkpKSByZXR1cm47CiAgICAgaWYgKCEocERhdGEgPSAoSU5TVEFOQ0VEQVRBICopR2xvYmFsTG9jazE2KCBzZWcgKSkpIHJldHVybjsKICAgICBUUkFDRSh0YXNrLCAib2xkPSUwNHg6JTA0eCBuZXc9JTA0eDolMDR4XG4iLAogICAgICAgICAgICAgICAgICAgU0VMRUNUT1JPRiggcFRhc2stPnRoZGItPmN1cl9zdGFjayApLApAQCAtMTA1Niw3ICsxMTg0LDcgQEAKICAgICBTVEFDSzE2RlJBTUUgKm9sZEZyYW1lLCAqbmV3RnJhbWU7CiAgICAgSU5TVEFOQ0VEQVRBICpwRGF0YTsKIAotICAgIGlmICghKHBUYXNrID0gKFREQiAqKUdsb2JhbExvY2sxNiggaEN1cnJlbnRUYXNrICkpKSByZXR1cm47CisgICAgaWYgKCEocFRhc2sgPSAoVERCICopR2xvYmFsTG9jazE2KCBHZXRDdXJyZW50VGFzaygpICkpKSByZXR1cm47CiAgICAgaWYgKCEocERhdGEgPSAoSU5TVEFOQ0VEQVRBICopR2xvYmFsTG9jazE2KFNFTEVDVE9ST0YocFRhc2stPnRoZGItPmN1cl9zdGFjaykpKSkKICAgICAgICAgcmV0dXJuOwogICAgIGlmICghcERhdGEtPm9sZF9zc19zcCkKQEAgLTExMTYsMTQgKzEyNDQsMTQgQEAKICAqLwogSFRBU0sxNiBXSU5BUEkgR2V0Q3VycmVudFRhc2sodm9pZCkKIHsKLSAgICByZXR1cm4gaEN1cnJlbnRUYXNrOworICAgIHJldHVybiBUSFJFQURfSW5pdERvbmU/IFBST0NFU1NfQ3VycmVudCgpLT50YXNrIDogMDsKIH0KIAogRFdPUkQgV0lOQVBJIFdJTjE2X0dldEN1cnJlbnRUYXNrKHZvaWQpCiB7CiAgICAgLyogVGhpcyBpcyB0aGUgdmVyc2lvbiB1c2VkIGJ5IHJlbGF5IGNvZGU7IHRoZSBmaXJzdCB0YXNrIGlzICovCiAgICAgLyogcmV0dXJuZWQgaW4gdGhlIGhpZ2ggd29yZCBvZiB0aGUgcmVzdWx0ICovCi0gICAgcmV0dXJuIE1BS0VMT05HKCBoQ3VycmVudFRhc2ssIGhGaXJzdFRhc2sgKTsKKyAgICByZXR1cm4gTUFLRUxPTkcoIEdldEN1cnJlbnRUYXNrKCksIGhGaXJzdFRhc2sgKTsKIH0KIAogCkBAIC0xMTM0LDcgKzEyNjIsNyBAQAogewogICAgIFREQiAqcFRhc2s7CiAKLSAgICBpZiAoIShwVGFzayA9IChUREIgKilHbG9iYWxMb2NrMTYoIGhDdXJyZW50VGFzayApKSkgcmV0dXJuIDA7CisgICAgaWYgKCEocFRhc2sgPSAoVERCICopR2xvYmFsTG9jazE2KCBHZXRDdXJyZW50VGFzaygpICkpKSByZXR1cm4gMDsKICAgICByZXR1cm4gcFRhc2stPmhQREI7CiB9CiAKQEAgLTExNTksNyArMTI4Nyw3IEBACiB7CiAgICAgVERCICpwVGFzazsKIAotICAgIGlmICghKHBUYXNrID0gKFREQiAqKUdsb2JhbExvY2sxNiggaEN1cnJlbnRUYXNrICkpKSByZXR1cm4gMDsKKyAgICBpZiAoIShwVGFzayA9IChUREIgKilHbG9iYWxMb2NrMTYoIEdldEN1cnJlbnRUYXNrKCkgKSkpIHJldHVybiAwOwogICAgIHJldHVybiBwVGFzay0+dmVyc2lvbjsKIH0KIApAQCAtMTE3Miw3ICsxMzAwLDcgQEAKICAgICBUREIgKnBUYXNrOwogICAgIFVJTlQxNiBvbGRNb2RlOwogCi0gICAgaWYgKCEocFRhc2sgPSAoVERCICopR2xvYmFsTG9jazE2KCBoQ3VycmVudFRhc2sgKSkpIHJldHVybiAwOworICAgIGlmICghKHBUYXNrID0gKFREQiAqKUdsb2JhbExvY2sxNiggR2V0Q3VycmVudFRhc2soKSApKSkgcmV0dXJuIDA7CiAgICAgb2xkTW9kZSA9IHBUYXNrLT5lcnJvcl9tb2RlOwogICAgIHBUYXNrLT5lcnJvcl9tb2RlID0gbW9kZTsKICAgICBwVGFzay0+dGhkYi0+cHJvY2Vzcy0+ZXJyb3JfbW9kZSA9IG1vZGU7CkBAIC0xMTk2LDcgKzEzMjQsNyBAQAogewogICAgIFREQiAqcFRhc2s7CiAKLSAgICBpZiAoIShwVGFzayA9IChUREIgKilHbG9iYWxMb2NrMTYoIGhDdXJyZW50VGFzayApKSkgcmV0dXJuIDA7CisgICAgaWYgKCEocFRhc2sgPSAoVERCICopR2xvYmFsTG9jazE2KCBHZXRDdXJyZW50VGFzaygpICkpKSByZXR1cm4gMDsKICAgICByZXR1cm4gUFRSX1NFR19PRkZfVE9fU0VHUFRSKCBwVGFzay0+cGRiLmVudmlyb25tZW50LCAwICk7CiB9CiAKQEAgLTEyMjAsNyArMTM0OCw3IEBACiB7CiAgICAgVERCICpwVGFzazsKIAotICAgIGlmICghKHBUYXNrID0gKFREQiAqKUdsb2JhbExvY2sxNiggaEN1cnJlbnRUYXNrICkpKSByZXR1cm4gMDsKKyAgICBpZiAoIShwVGFzayA9IChUREIgKilHbG9iYWxMb2NrMTYoIEdldEN1cnJlbnRUYXNrKCkgKSkpIHJldHVybiAwOwogICAgIHJldHVybiBwVGFzay0+aEluc3RhbmNlOwogfQogCkBAIC0xMjQ4LDcgKzEzNzYsNyBAQAogICAgIFREQiAqcFRhc2s7CiAgICAgRkFSUFJPQzE2IG9sZFByb2M7CiAKLSAgICBpZiAoIWhUYXNrKSBoVGFzayA9IGhDdXJyZW50VGFzazsKKyAgICBpZiAoIWhUYXNrKSBoVGFzayA9IEdldEN1cnJlbnRUYXNrKCk7CiAgICAgaWYgKCEocFRhc2sgPSAoVERCICopR2xvYmFsTG9jazE2KCBoVGFzayApKSkgcmV0dXJuIE5VTEw7CiAgICAgb2xkUHJvYyA9IChGQVJQUk9DMTYpcFRhc2stPnVzZXJoYW5kbGVyOwogICAgIHBUYXNrLT51c2VyaGFuZGxlciA9IChVU0VSU0lHTkFMUFJPQylwcm9jOwpAQCAtMTI3MSw3ICsxMzk5LDcgQEAKICAgICB7CiAgICAgICAgIFREQiAqcFRhc2s7CiAKLSAgICAgICAgaWYgKCEocFRhc2sgPSAoVERCICopR2xvYmFsTG9jazE2KCBoQ3VycmVudFRhc2sgKSkpIHJldHVybiAwOworICAgICAgICBpZiAoIShwVGFzayA9IChUREIgKilHbG9iYWxMb2NrMTYoIEdldEN1cnJlbnRUYXNrKCkgKSkpIHJldHVybiAwOwogICAgICAgICBpZiAob2xkbW9kZSkgKm9sZG1vZGUgPSBwVGFzay0+c2lnbmFsX2ZsYWdzOwogICAgICAgICBwVGFzay0+c2lnbmFsX2ZsYWdzID0gbmV3bW9kZTsKICAgICAgICAgaWYgKG9sZGhhbmRsZXIpICpvbGRoYW5kbGVyID0gcFRhc2stPnNpZ2hhbmRsZXI7CkBAIC0xMjg4LDcgKzE0MTYsNyBAQAogewogICAgIFREQiAqcFRhc2s7CiAKLSAgICBpZiAoIShwVGFzayA9IChUREIgKilHbG9iYWxMb2NrMTYoIGhDdXJyZW50VGFzayApKSkgcmV0dXJuOworICAgIGlmICghKHBUYXNrID0gKFREQiAqKUdsb2JhbExvY2sxNiggR2V0Q3VycmVudFRhc2soKSApKSkgcmV0dXJuOwogICAgIHBUYXNrLT5kaXNjYXJkaGFuZGxlciA9IHByb2M7CiB9CiAKZGlmZiAtLWdpdCBhL21pc2MvTWFrZWZpbGUuaW4gYi9taXNjL01ha2VmaWxlLmluCmluZGV4IDQyMGQ5ZTIuLmMxZDMxNzAgMTAwNjQ0Ci0tLSBhL21pc2MvTWFrZWZpbGUuaW4KKysrIGIvbWlzYy9NYWtlZmlsZS5pbgpAQCAtMjUsNyArMjUsNiBAQAogCXByaW50ZHJ2LmMgXAogCXJlZ2lzdHJ5LmMgXAogCXNoZWxsLmMgXAotCXNoZWxsb3JkLmMgXAogCXNvdW5kLmMgXAogCXNweS5jIFwKIAlzdHJlc3MuYyBcCmRpZmYgLS1naXQgYS9taXNjL2NvbW1kbGcuYyBiL21pc2MvY29tbWRsZy5jCmluZGV4IGRiMjEzNzcuLjAwN2Y0NzMgMTAwNjQ0Ci0tLSBhL21pc2MvY29tbWRsZy5jCisrKyBiL21pc2MvY29tbWRsZy5jCkBAIC03Myw3ICs3Myw3IEBACiAgICAgaWYgKGxwb2ZuLT5GbGFncyAmIE9GTl9XSU5FMzIpIHsKIAkgICAgaWYgKGxwb2ZuLT5GbGFncyAmIE9GTl9FTkFCTEVURU1QTEFURUhBTkRMRSkKIAkgICAgewotCQlpZiAoISh0ZW1wbGF0ZSA9IExvY2tSZXNvdXJjZTMyKCBscG9mbi0+aEluc3RhbmNlICkpKQorCQlpZiAoISh0ZW1wbGF0ZSA9IExvY2tSZXNvdXJjZTMyKCBNYXBITW9kdWxlU0wobHBvZm4tPmhJbnN0YW5jZSApKSkpCiAJCXsKIAkJICAgIENvbW1EbGdMYXN0RXJyb3IgPSBDREVSUl9MT0FEUkVTRkFJTFVSRTsKIAkJICAgIHJldHVybiBGQUxTRTsKQEAgLTgxLDEzICs4MSwxNCBAQAogCSAgICB9CiAJICAgIGVsc2UgaWYgKGxwb2ZuLT5GbGFncyAmIE9GTl9FTkFCTEVURU1QTEFURSkKIAkgICAgewotCQlpZiAoIShoUmVzSW5mbyA9IEZpbmRSZXNvdXJjZTMyQShscG9mbi0+aEluc3RhbmNlLAorCQlpZiAoIShoUmVzSW5mbyA9IEZpbmRSZXNvdXJjZTMyQShNYXBITW9kdWxlU0wobHBvZm4tPmhJbnN0YW5jZSksCiAJCQkJCQlQVFJfU0VHX1RPX0xJTihscG9mbi0+bHBUZW1wbGF0ZU5hbWUpLCBSVF9ESUFMT0czMkEpKSkKIAkJewogCQkgICAgQ29tbURsZ0xhc3RFcnJvciA9IENERVJSX0ZJTkRSRVNGQUlMVVJFOwogCQkgICAgcmV0dXJuIEZBTFNFOwogCQl9Ci0JCWlmICghKGhEbGdUbXBsID0gTG9hZFJlc291cmNlMzIoIGxwb2ZuLT5oSW5zdGFuY2UsIGhSZXNJbmZvICkpIHx8CisJCWlmICghKGhEbGdUbXBsID0gTG9hZFJlc291cmNlMzIoIE1hcEhNb2R1bGVTTChscG9mbi0+aEluc3RhbmNlKSwKKwkJCQkJCSBoUmVzSW5mbyApKSB8fAogCQkgICAgISh0ZW1wbGF0ZSA9IExvY2tSZXNvdXJjZTMyKCBoRGxnVG1wbCApKSkKIAkJewogCQkgICAgQ29tbURsZ0xhc3RFcnJvciA9IENERVJSX0xPQURSRVNGQUlMVVJFOwpAQCAtMTk4LDcgKzE5OSw3IEBACiAgICAgaWYgKGxwb2ZuLT5GbGFncyAmIE9GTl9XSU5FMzIpIHsKIAkgICAgaWYgKGxwb2ZuLT5GbGFncyAmIE9GTl9FTkFCTEVURU1QTEFURUhBTkRMRSkKIAkgICAgewotCQlpZiAoISh0ZW1wbGF0ZSA9IExvY2tSZXNvdXJjZTMyKCBscG9mbi0+aEluc3RhbmNlICkpKQorCQlpZiAoISh0ZW1wbGF0ZSA9IExvY2tSZXNvdXJjZTMyKCBNYXBITW9kdWxlU0wobHBvZm4tPmhJbnN0YW5jZSApKSkpCiAJCXsKIAkJICAgIENvbW1EbGdMYXN0RXJyb3IgPSBDREVSUl9MT0FEUkVTRkFJTFVSRTsKIAkJICAgIHJldHVybiBGQUxTRTsKQEAgLTIwNywxNCArMjA4LDE1IEBACiAJICAgIGVsc2UgaWYgKGxwb2ZuLT5GbGFncyAmIE9GTl9FTkFCTEVURU1QTEFURSkKIAkgICAgewogCQlIQU5ETEUzMiBoUmVzSW5mbzsKLQkJaWYgKCEoaFJlc0luZm8gPSBGaW5kUmVzb3VyY2UzMkEobHBvZm4tPmhJbnN0YW5jZSwKKwkJaWYgKCEoaFJlc0luZm8gPSBGaW5kUmVzb3VyY2UzMkEoTWFwSE1vZHVsZVNMKGxwb2ZuLT5oSW5zdGFuY2UpLAogCQkJCQkJIFBUUl9TRUdfVE9fTElOKGxwb2ZuLT5scFRlbXBsYXRlTmFtZSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUlRfRElBTE9HMzJBKSkpCiAJCXsKIAkJICAgIENvbW1EbGdMYXN0RXJyb3IgPSBDREVSUl9GSU5EUkVTRkFJTFVSRTsKIAkJICAgIHJldHVybiBGQUxTRTsKIAkJfQotCQlpZiAoIShoRGxnVG1wbCA9IExvYWRSZXNvdXJjZTMyKGxwb2ZuLT5oSW5zdGFuY2UsaFJlc0luZm8pKSB8fAorCQlpZiAoIShoRGxnVG1wbCA9IExvYWRSZXNvdXJjZTMyKE1hcEhNb2R1bGVTTChscG9mbi0+aEluc3RhbmNlKSwKKwkJCQkJCWhSZXNJbmZvKSkgfHwKIAkJICAgICEodGVtcGxhdGUgPSBMb2NrUmVzb3VyY2UzMihoRGxnVG1wbCkpKQogCQl7CiAJCSAgICBDb21tRGxnTGFzdEVycm9yID0gQ0RFUlJfTE9BRFJFU0ZBSUxVUkU7CkBAIC0zNjQ2LDggKzM2NDgsNyBAQAogCW1lbXNldChvZm4xNiwnXDAnLHNpemVvZigqb2ZuMTYpKTsKIAlvZm4xNi0+bFN0cnVjdFNpemUgPSBzaXplb2YoKm9mbjE2KTsKIAlvZm4xNi0+aHduZE93bmVyID0gb2ZuLT5od25kT3duZXI7Ci0JLyogRklYTUU6IE9QRU5GSUxFTkFNRTE2IGdvdCBvbmx5IDE2IGJpdCBmb3IgSElOU1RBTkNFLi4uICovCi0Jb2ZuMTYtPmhJbnN0YW5jZSA9IDA7CisJb2ZuMTYtPmhJbnN0YW5jZSA9IE1hcEhNb2R1bGVMUyhvZm4tPmhJbnN0YW5jZSk7CiAJaWYgKG9mbi0+bHBzdHJGaWx0ZXIpIHsKIAkJTFBTVFIJcyx4OwogCkBAIC0zNzM2LDggKzM3MzcsNyBAQAogCW1lbXNldChvZm4xNiwnXDAnLHNpemVvZigqb2ZuMTYpKTsKIAlvZm4xNi0+bFN0cnVjdFNpemUgPSBzaXplb2YoKm9mbjE2KTsKIAlvZm4xNi0+aHduZE93bmVyID0gb2ZuLT5od25kT3duZXI7Ci0JLyogRklYTUU6IE9QRU5GSUxFTkFNRTE2IGdvdCBvbmx5IDE2IGJpdCBmb3IgSElOU1RBTkNFLi4uICovCi0Jb2ZuMTYtPmhJbnN0YW5jZSA9IDA7CisJb2ZuMTYtPmhJbnN0YW5jZSA9IE1hcEhNb2R1bGVMUyhvZm4tPmhJbnN0YW5jZSk7CiAJaWYgKG9mbi0+bHBzdHJGaWx0ZXIpIHsKIAkJTFBXU1RSCXM7CiAJCUxQU1RSCXgseTsKQEAgLTM4ODEsNyArMzg4MSw3IEBACiAgIG1lbXNldChscGNjMTYsJ1wwJyxzaXplb2YoKmxwY2MxNikpOwogICBscGNjMTYtPmxTdHJ1Y3RTaXplPXNpemVvZigqbHBjYzE2KTsKICAgbHBjYzE2LT5od25kT3duZXI9bHBDaENvbC0+aHduZE93bmVyOwotICBscGNjMTYtPmhJbnN0YW5jZT0wOyAvKiBGSVhNRTpNT0RVTEVfSEFORExFdG9ITU9EVUxFMTYobHBDaENvbC0+aEluc3RhbmNlKSovCisgIGxwY2MxNi0+aEluc3RhbmNlPU1hcEhNb2R1bGVMUyhscENoQ29sLT5oSW5zdGFuY2UpOwogICBscGNjMTYtPnJnYlJlc3VsdD1scENoQ29sLT5yZ2JSZXN1bHQ7CiAgIG1lbWNweShjY3JlZixscENoQ29sLT5scEN1c3RDb2xvcnMsNjQpOwogICBscGNjMTYtPmxwQ3VzdENvbG9ycz0oQ09MT1JSRUYqKVNFR1BUUl9HRVQoY2NyZWYpOwpAQCAtMzkxNSw3ICszOTE1LDcgQEAKICAgbWVtc2V0KGxwY2MxNiwnXDAnLHNpemVvZigqbHBjYzE2KSk7CiAgIGxwY2MxNi0+bFN0cnVjdFNpemU9c2l6ZW9mKCpscGNjMTYpOwogICBscGNjMTYtPmh3bmRPd25lcj1scENoQ29sLT5od25kT3duZXI7Ci0gIGxwY2MxNi0+aEluc3RhbmNlPTA7IC8qRklYTUU6TU9EVUxFX0hBTkRMRXRvSE1PRFVMRTE2KGxwQ2hDb2wtPmhJbnN0YW5jZSkqLworICBscGNjMTYtPmhJbnN0YW5jZT1NYXBITW9kdWxlTFMobHBDaENvbC0+aEluc3RhbmNlKTsKICAgbHBjYzE2LT5yZ2JSZXN1bHQ9bHBDaENvbC0+cmdiUmVzdWx0OwogICBtZW1jcHkoY2NyZWYsbHBDaENvbC0+bHBDdXN0Q29sb3JzLDY0KTsKICAgbHBjYzE2LT5scEN1c3RDb2xvcnM9KENPTE9SUkVGKilTRUdQVFJfR0VUKGNjcmVmKTsKZGlmZiAtLWdpdCBhL21pc2MvaW1hZ2VsaXN0LmMgYi9taXNjL2ltYWdlbGlzdC5jCmluZGV4IDRjMzEyNWQuLjhjYWZkNGEgMTAwNjQ0Ci0tLSBhL21pc2MvaW1hZ2VsaXN0LmMKKysrIGIvbWlzYy9pbWFnZWxpc3QuYwpAQCAtNTU2LDcgKzU1Niw3IEBACiAgICAgaGltbC0+Y2xyQmsgPSBDTFJfTk9ORTsKIAogICAgIC8qIGluaXRpYWxpemUgb3ZlcmxheSBtYXNrIGluZGljZXMgKi8KLSAgICBmb3IgKG5Db3VudCA9IDA7IG5Db3VudCA8PSBNQVhfT1ZFUkxBWUlNQUdFOyBuQ291bnQrKykKKyAgICBmb3IgKG5Db3VudCA9IDA7IG5Db3VudCA8IE1BWF9PVkVSTEFZSU1BR0U7IG5Db3VudCsrKQogICAgICAgICBoaW1sLT5uT3ZsSWR4W25Db3VudF0gPSAtMTsKIAogICAgIGhkYyA9IENyZWF0ZUNvbXBhdGlibGVEQzMyICgwKTsKQEAgLTE2OTEsNyArMTY5MSw3IEBACiAKICAgICAgICAgaGltbC0+Y01heEltYWdlID0gaGltbC0+Y0luaXRpYWwgKyBoaW1sLT5jR3JvdzsKICAgICAgICAgaGltbC0+Y0N1ckltYWdlID0gMDsKLSAgICAgICAgZm9yIChuQ291bnQgPSAwOyBuQ291bnQgPD0gTUFYX09WRVJMQVlJTUFHRTsgbkNvdW50KyspCisgICAgICAgIGZvciAobkNvdW50ID0gMDsgbkNvdW50IDwgTUFYX09WRVJMQVlJTUFHRTsgbkNvdW50KyspCiAgICAgICAgICAgICAgaGltbC0+bk92bElkeFtuQ291bnRdID0gLTE7CiAKICAgICAgICAgRGVsZXRlT2JqZWN0MzIgKGhpbWwtPmhibUltYWdlKTsKQEAgLTE5MjEsMTAgKzE5MjEsMTAgQEAKICAgICBpZiAoaGRjSW1hZ2UpCiAJRGVsZXRlREMzMiAoaGRjSW1hZ2UpOwogCi0vLyAgICBGSVhNRSAoaW1hZ2VsaXN0LCAiZGVsZXRpbmcgaGJtQ29sb3IhXG4iKTsKLSAgICBEZWxldGVPYmplY3QzMiAoaWkuaGJtQ29sb3IpOwotLy8gICAgRklYTUUgKGltYWdlbGlzdCwgImRlbGV0ZWQgaGJtQ29sb3IhXG4iKTsKLSAgICBEZWxldGVPYmplY3QzMiAoaWkuaGJtTWFzayk7CisgICAgaWYgKGlpLmhibUNvbG9yKQorCURlbGV0ZU9iamVjdDMyIChpaS5oYm1Db2xvcik7CisgICAgaWYgKGlpLmhibU1hc2spCisJRGVsZXRlT2JqZWN0MzIgKGlpLmhibU1hc2spOwogCiAgICAgcmV0dXJuIChuSW5kZXgpOwogfQpkaWZmIC0tZ2l0IGEvbWlzYy9sc3RyLmMgYi9taXNjL2xzdHIuYwppbmRleCAwMjU1MDQ5Li5iMmI0YWUwIDEwMDY0NAotLS0gYS9taXNjL2xzdHIuYworKysgYi9taXNjL2xzdHIuYwpAQCAtNjY4LDYgKzY2OCw3IEBACiAJaWYgKG5TaXplICYmIHRhbGxvY2VkPG5TaXplKSB7CiAJCXRhcmdldCA9IChjaGFyKilIZWFwUmVBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLEhFQVBfWkVST19NRU1PUlksdGFyZ2V0LG5TaXplKTsKIAl9CisgICAgVFJBQ0UocmVzb3VyY2UsIi0tICVzXG4iLHRhcmdldCk7CiAJaWYgKGR3RmxhZ3MgJiBGT1JNQVRfTUVTU0FHRV9BTExPQ0FURV9CVUZGRVIpIHsKIAkJLyogblNpemUgaXMgdGhlIE1JTklNVU0gc2l6ZSAqLwogCQkqKChMUFZPSUQqKWxwQnVmZmVyKSA9IChMUFZPSUQpTG9jYWxBbGxvYzMyKEdNRU1fWkVST0lOSVQsdGFsbG9jZWQpOwpkaWZmIC0tZ2l0IGEvbWlzYy9semV4cGFuZC5jIGIvbWlzYy9semV4cGFuZC5jCmluZGV4IDc5MmE3ZGIuLjQ5NWVhOWIgMTAwNjQ0Ci0tLSBhL21pc2MvbHpleHBhbmQuYworKysgYi9taXNjL2x6ZXhwYW5kLmMKQEAgLTEzNyw3ICsxMzcsNyBAQAogICovCiBIRklMRTE2IFdJTkFQSSBMWkluaXQxNiggSEZJTEUxNiBoZlNyYyApCiB7Ci0gICAgcmV0dXJuIExaSW5pdDMyKCBoZlNyYyApOworICAgIHJldHVybiBMWkluaXQzMiggSEZJTEUxNl9UT19IRklMRTMyKGhmU3JjKSApOwogfQogCiAKZGlmZiAtLWdpdCBhL21pc2MvbmV0d29yay5jIGIvbWlzYy9uZXR3b3JrLmMKaW5kZXggODk2NjRkMC4uOWRjZGE5ZSAxMDA2NDQKLS0tIGEvbWlzYy9uZXR3b3JrLmMKKysrIGIvbWlzYy9uZXR3b3JrLmMKQEAgLTcsNiArNyw5IEBACiAgKi8KIAogI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8cHdkLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CiAKICNpbmNsdWRlICJ3aW5kb3dzLmgiCiAjaW5jbHVkZSAid2luZXJyb3IuaCIKQEAgLTQyNiw2ICs0MjksMzEgQEAKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgkJCQlXTmV0R2V0VXNlcgkJCVtNUFIuODZdCisgKiBGSVhNRTogd2Ugc2hvdWxkIG5vdCByZXR1cm4gb3Vyc2VsdmVzLCBidXQgdGhlIG93bmVyIG9mIHRoZSBkcml2ZSBscExvY2FsTmFtZQorICovCitEV09SRCBXSU5BUEkgV05ldEdldFVzZXIzMkEoTFBDU1RSIGxwTG9jYWxOYW1lLCBMUFNUUiBscFVzZXJOYW1lLCBEV09SRCAqbHBTaXplKQoreworCXN0cnVjdCBwYXNzd2QJKnB3ZCA9IGdldHB3dWlkKGdldHVpZCgpKTsKKworCUZJWE1FKHduZXQsICIoJXMsICVwLCAlcCksIG1vc3RseSBzdHViXG4iLCBscExvY2FsTmFtZSwgbHBVc2VyTmFtZSwgbHBTaXplKTsKKwlpZiAocHdkKSB7CisJCWlmIChzdHJsZW4ocHdkLT5wd19uYW1lKSsxPipscFNpemUpIHsKKwkJCSpscFNpemUgPSBzdHJsZW4ocHdkLT5wd19uYW1lKSsxOworCQkJU2V0TGFzdEVycm9yKEVSUk9SX01PUkVfREFUQSk7CisJCQlyZXR1cm4gRVJST1JfTU9SRV9EQVRBOworCQl9CisJCXN0cmNweShscFVzZXJOYW1lLHB3ZC0+cHdfbmFtZSk7CisJCWlmIChscFNpemUpCisJCQkqbHBTaXplID0gc3RybGVuKHB3ZC0+cHdfbmFtZSkrMTsKKwkJcmV0dXJuIFdOX1NVQ0NFU1M7CisJfQorCS8qIEZJWE1FOiB3cm9uZyByZXR1cm4gdmFsdWUgKi8KKwlTZXRMYXN0RXJyb3IoRVJST1JfTk9fTkVUV09SSyk7CisJcmV0dXJuIEVSUk9SX05PX05FVFdPUks7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgICAgIFdOZXRHZXRFcnJvciAgICAgICBbVVNFUi41MTldCiAgKi8KIGludCBXSU5BUEkgV05ldEdldEVycm9yKExQV09SRCBuRXJyb3IpCmRpZmYgLS1naXQgYS9taXNjL3JlZ2lzdHJ5LmMgYi9taXNjL3JlZ2lzdHJ5LmMKaW5kZXggNmY3ZmY5MS4uYjJkMWRlNCAxMDA2NDQKLS0tIGEvbWlzYy9yZWdpc3RyeS5jCisrKyBiL21pc2MvcmVnaXN0cnkuYwpAQCAtOTksNyArOTksOSBAQAogfSAgKm9wZW5oYW5kbGVzPU5VTEw7CiBzdGF0aWMgaW50CW5yb2ZvcGVuaGFuZGxlcz0wOwogLyogU3RhcnRzIGFmdGVyIDEgYmVjYXVzZSAwLDEgYXJlIHJlc2VydmVkIGZvciBXaW4xNiAqLwotc3RhdGljIGludAljdXJyZW50aGFuZGxlPTE7CisvKiBOb3RlOiBTaG91bGQgYWx3YXlzIGJlIGV2ZW4sIGFzIFdpbjk1IEFEVkFQSTMyLkRMTCByZXNlcnZlcyBvZGQKKyAgICAgICAgIEhLRVlzIGZvciByZW1vdGUgcmVnaXN0cnkgYWNjZXNzICovCitzdGF0aWMgaW50CWN1cnJlbnRoYW5kbGU9MjsKIAogCiAvKgpAQCAtMTc0Myw3ICsxNzQ1LDggQEAKICAgICBpZiAoIWxwc3pTdWJLZXkgfHwgISpscHN6U3ViS2V5KSB7CiAgICAgICAgIC8qIEVpdGhlciBOVUxMIG9yIHBvaW50ZXIgdG8gZW1wdHkgc3RyaW5nLCBzbyByZXR1cm4gYSBuZXcgaGFuZGxlCiAgICAgICAgICAgIHRvIHRoZSBvcmlnaW5hbCBoa2V5ICovCi0gICAgICAgIGFkZF9oYW5kbGUoKytjdXJyZW50aGFuZGxlLGxwTmV4dEtleSxzYW1EZXNpcmVkKTsKKyAgICAgICAgY3VycmVudGhhbmRsZSArPSAyOworICAgICAgICBhZGRfaGFuZGxlKGN1cnJlbnRoYW5kbGUsbHBOZXh0S2V5LHNhbURlc2lyZWQpOwogICAgICAgICAqcmV0a2V5PWN1cnJlbnRoYW5kbGU7CiAgICAgICAgIHJldHVybiBFUlJPUl9TVUNDRVNTOwogICAgIH0KQEAgLTE3NzYsNyArMTc3OSw4IEBACiAgICAgICAgIGxwTmV4dEtleSA9IGxweGtleTsKICAgICB9CiAKLSAgICBhZGRfaGFuZGxlKCsrY3VycmVudGhhbmRsZSxscHhrZXksc2FtRGVzaXJlZCk7CisgICAgY3VycmVudGhhbmRsZSArPSAyOworICAgIGFkZF9oYW5kbGUoY3VycmVudGhhbmRsZSxscHhrZXksc2FtRGVzaXJlZCk7CiAgICAgKnJldGtleSA9IGN1cnJlbnRoYW5kbGU7CiAgICAgVFJBQ0UocmVnLCIgIFJldHVybmluZyAleFxuIiwgY3VycmVudGhhbmRsZSk7CiAgICAgRlJFRV9LRVlfUEFUSDsKQEAgLTE5MDksNyArMTkxMyw4IEBACiAgICAgICAgIHJldHVybiBFUlJPUl9JTlZBTElEX1BBUkFNRVRFUjsKIAogCWlmICghbHBzelN1YktleSB8fCAhKmxwc3pTdWJLZXkpIHsKLQkJYWRkX2hhbmRsZSgrK2N1cnJlbnRoYW5kbGUsbHBOZXh0S2V5LHNhbURlc2lyZWQpOworICAgICAgICAgICAgICAgIGN1cnJlbnRoYW5kbGUgKz0gMjsKKwkJYWRkX2hhbmRsZShjdXJyZW50aGFuZGxlLGxwTmV4dEtleSxzYW1EZXNpcmVkKTsKIAkJKnJldGtleT1jdXJyZW50aGFuZGxlOwogICAgICAgICAgICAgICAgIFRSQUNFKHJlZywgIlJldHVybmluZyAleFxuIiwgY3VycmVudGhhbmRsZSk7CiAJCWxwTmV4dEtleS0+ZmxhZ3N8PVJFR19PUFRJT05fVEFJTlRFRDsKQEAgLTE5MzgsNyArMTk0Myw4IEBACiAJCWxwTmV4dEtleQk9IGxweGtleTsKIAl9CiAJaWYgKGxweGtleSkgewotCQlhZGRfaGFuZGxlKCsrY3VycmVudGhhbmRsZSxscHhrZXksc2FtRGVzaXJlZCk7CisgICAgICAgICAgICAgICAgY3VycmVudGhhbmRsZSArPSAyOworCQlhZGRfaGFuZGxlKGN1cnJlbnRoYW5kbGUsbHB4a2V5LHNhbURlc2lyZWQpOwogCQlscHhrZXktPmZsYWdzICB8PSBSRUdfT1BUSU9OX1RBSU5URUQ7CiAJCSpyZXRrZXkJCT0gY3VycmVudGhhbmRsZTsKICAgICAgICAgICAgICAgICBUUkFDRShyZWcsICJSZXR1cm5pbmcgJXhcbiIsIGN1cnJlbnRoYW5kbGUpOwpAQCAtMTk3Nyw3ICsxOTgzLDggQEAKIAkJbHBOZXh0S2V5CT0gKmxwbHBQcmV2S2V5OwogCQlpKys7CiAJfQotCWFkZF9oYW5kbGUoKytjdXJyZW50aGFuZGxlLGxwTmV4dEtleSxzYW1EZXNpcmVkKTsKKyAgICAgICAgY3VycmVudGhhbmRsZSArPSAyOworCWFkZF9oYW5kbGUoY3VycmVudGhhbmRsZSxscE5leHRLZXksc2FtRGVzaXJlZCk7CiAKIAkvKkZJWE1FOiBmbGFnIGhhbmRsaW5nIGNvcnJlY3Q/ICovCiAJbHBOZXh0S2V5LT5mbGFncz0gZmR3T3B0aW9ucyB8UkVHX09QVElPTl9UQUlOVEVEOwpkaWZmIC0tZ2l0IGEvbWlzYy9zaGVsbC5jIGIvbWlzYy9zaGVsbC5jCmluZGV4IDFiOGViYmYuLjZjZGVlYzggMTAwNjQ0Ci0tLSBhL21pc2Mvc2hlbGwuYworKysgYi9taXNjL3NoZWxsLmMKQEAgLTIsOSArMiw2IEBACiAgKiAJCQkJU2hlbGwgTGlicmFyeSBGdW5jdGlvbnMKICAqCiAgKiAgMTk5OCBNYXJjdXMgTWVpc3NuZXIKLSAqICAxOTk4IEp1ZXJnZW4gU2NobWllZCAoanNjaCkKLSAqICBjdXJyZW50bHkgd29yayBpbiBwcm9ncmVzcyBvbiBTSCogYW5kIFNIRUxMMzJfRGxsR2V0Q2xhc3NPYmplY3QgZnVuY3Rpb25zCi0gKiAgPGNvbnRhY3QganVlcmdlbi5zY2htaWVkQG1ldHJvbmV0LmRlIDk4MDYyND4KICAqLwogI2luY2x1ZGUgPGFzc2VydC5oPgogI2luY2x1ZGUgPHN0ZGxpYi5oPgpAQCAtMzEsMTU2ICsyOCw2IEBACiAjaW5jbHVkZSAiaW1hZ2VsaXN0LmgiCiAjaW5jbHVkZSAiY29tbWN0cmwuaCIKIAotLyogRklYTUUgc2hvdWxkIGJlIG1vdmVkIHRvIGEgaGVhZGVyIGZpbGUuIElzRXF1YWxHVUlEIAotaXMgZGVjbGFyZWQgYnV0IG5vdCBleHBvcnRlZCBpbiBjb21wb2JqLmMgISEhKi8KLSNkZWZpbmUgSXNFcXVhbEdVSUQocmd1aWQxLCByZ3VpZDIpICghbWVtY21wKHJndWlkMSwgcmd1aWQyLCBzaXplb2YoR1VJRCkpKQotI2RlZmluZSBJc0VxdWFsSUlEKHJpaWQxLCByaWlkMikgSXNFcXVhbEdVSUQocmlpZDEsIHJpaWQyKQotI2RlZmluZSBJc0VxdWFsQ0xTSUQocmNsc2lkMSwgcmNsc2lkMikgSXNFcXVhbEdVSUQocmNsc2lkMSwgcmNsc2lkMikKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBTSEVMTF9QZW9wbGVbXSA9Ci17Ci0gICAgIkJvYiBBbXN0YWR0IiwKLSAgICAiRGFnIEFzaGVpbSIsCi0gICAgIk1hcnRpbiBBeW90dGUiLAotICAgICJLYXJsIEJhY2tzdHL2bSIsCi0gICAgIlBldGVyIEJhanVzeiIsCi0gICAgIk1hcmNlbCBCYXVyIiwKLSAgICAiR2VvcmcgQmV5ZXJsZSIsCi0gICAgIlJvc3MgQmlybyIsCi0gICAgIk1hcnRpbiBCb2VobWUiLAotICAgICJVd2UgQm9ubmVzIiwKLSAgICAiRXJpayBCb3MiLAotICAgICJGb25zIEJvdG1hbiIsCi0gICAgIkpvaG4gQnJlemFrIiwKLSAgICAiQW5kcmV3IEJ1bGhhayIsCi0gICAgIkpvaG4gQnVydG9uIiwKLSAgICAiTmllbHMgZGUgQ2FycGVudGllciIsCi0gICAgIkdvcmRvbiBDaGFmZmVlIiwKLSAgICAiSmltZW4gQ2hpbmciLAotICAgICJQYXNjYWwgQ3VvcSIsCi0gICAgIkRhdmlkIEEuIEN1dGhiZXJ0IiwKLSAgICAiSHV3IEQuIE0uIERhdmllcyIsCi0gICAgIlJvbWFuIERvbGVqc2kiLAotICAgICJGcmFucyB2YW4gRG9yc3NlbGFlciIsCi0gICAgIkNocmlzIEZhaGVydHkiLAotICAgICJDYXJzdGVuIEZhbGxlc2VuIiwKLSAgICAiUGF1bCBGYWxzdGFkIiwKLSAgICAiRGF2aWQgRmF1cmUiLAotICAgICJDbGF1cyBGaXNjaGVyIiwKLSAgICAiT2xhZiBGbGViYmUiLAotICAgICJDaGFkIEZyYWxlaWdoIiwKLSAgICAiTWF0dGhldyBGcmFuY2lzIiwKLSAgICAiUGV0ZXIgR2FsYmF2eSIsCi0gICAgIlJhbW9uIEdhcmNpYSIsCi0gICAgIk1hdHRoZXcgR2hpbyIsCi0gICAgIkpvZHkgR29sZGJlcmciLAotICAgICJIYW5zIGRlIEdyYWFmZiIsCi0gICAgIkNoYXJsZXMgTS4gSGFubnVtIiwKLSAgICAiQWRyaWFuIEhhcnZleSIsCi0gICAgIkpvaG4gSGFydmV5IiwKLSAgICAiQmlsbCBIYXdlcyIsCi0gICAgIkNhbWVyb24gSGVpZGUiLAotICAgICJKb2NoZW4gSG9lbmlja2UiLAotICAgICJPbm5vIEhvdmVycyIsCi0gICAgIkplZmZyZXkgSHN1IiwKLSAgICAiTWlndWVsIGRlIEljYXphIiwKLSAgICAiSnVra2EgSWl2b25lbiIsCi0gICAgIkxlZSBKYWVraWwiLAotICAgICJBbGV4YW5kcmUgSnVsbGlhcmQiLAotICAgICJCYW5nIEp1bi1Zb3VuZyIsCi0gICAgIlBhdmVsIEthbmtvdnNreSIsCi0gICAgIkpvY2hlbiBLYXJyZXIiLAotICAgICJBbmRyZWFzIEtpcnNjaGJhdW0iLAotICAgICJSZWluIEtsYXplcyIsCi0gICAgIkFsYnJlY2h0IEtsZWluZSIsCi0gICAgIkVyaWMgS29obCIsCi0gICAgIkpvbiBLb25yYXRoIiwKLSAgICAiQWxleCBLb3JvYmthIiwKLSAgICAiR3JlZyBLcmVpZGVyIiwKLSAgICAiQW5hbmQgS3VtcmlhIiwKLSAgICAiT3ZlIEvldmVuIiwKLSAgICAiU2NvdHQgQS4gTGFpcmQiLAotICAgICJEYXZpZCBMZWUgTGFtYmVydCIsCi0gICAgIkFuZHJldyBMZXd5Y2t5IiwKLSAgICAiUGVyIExpbmRzdHL2bSIsCi0gICAgIk1hcnRpbiB2b24gTG9ld2lzIiwKLSAgICAiTWljaGllbCB2YW4gTG9vbiIsCi0gICAgIktlbm5ldGggTWFjRG9uYWxkIiwKLSAgICAiUGV0ZXIgTWFjRG9uYWxkIiwKLSAgICAiV2lsbGlhbSBNYWdybyIsCi0gICAgIkp1ZXJnZW4gTWFycXVhcmR0IiwKLSAgICAiUmljYXJkbyBNYXNzYXJvIiwKLSAgICAiTWFyY3VzIE1laXNzbmVyIiwKLSAgICAiR3JhaGFtIE1lbmhlbm5pdHQiLAotICAgICJEYXZpZCBNZXRjYWxmZSIsCi0gICAgIkJydWNlIE1pbG5lciIsCi0gICAgIlN0ZWZmZW4gTW9lbGxlciIsCi0gICAgIkFuZHJlYXMgTW9ociIsCi0gICAgIkphbWVzIE1vb2R5IiwKLSAgICAiUGhpbGlwcGUgRGUgTXV5dGVyIiwKLSAgICAiSXRhaSBOYWhzaG9uIiwKLSAgICAiS3Jpc3RpYW4gTmllbHNlbiIsCi0gICAgIkhlbnJpayBPbHNlbiIsCi0gICAgIk1pY2hhZWwgUGF0cmEiLAotICAgICJEaW1pdHJpZSBPLiBQYXVuIiwKLSAgICAiSmltIFBldGVyc29uIiwKLSAgICAiUm9iZXJ0IFBvdWxpb3QiLAotICAgICJLZWl0aCBSZXlub2xkcyIsCi0gICAgIlNsYXZlbiBSZXppYyIsCi0gICAgIkpvaG4gUmljaGFyZHNvbiIsCi0gICAgIlJpY2sgUmljaGFyZHNvbiIsCi0gICAgIkRvdWcgUmlkZ3dheSIsCi0gICAgIkJlcm5oYXJkIFJvc2Vua3JhZW56ZXIiLAotICAgICJKb2hhbm5lcyBSdXNjaGVpbnNraSIsCi0gICAgIlRob21hcyBTYW5kZm9yZCIsCi0gICAgIkNvbnN0YW50aW5lIFNhcHVudHpha2lzIiwKLSAgICAiUGFibG8gU2FyYXR4YWdhIiwKLSAgICAiRGFuaWVsIFNjaGVwbGVyIiwKLSAgICAiUGV0ZXIgU2NobGFpbGUiLAotICAgICJVbHJpY2ggU2NobWlkIiwKLSAgICAiQmVybmQgU2NobWlkdCIsCi0gICAgIkp1ZXJnZW4gU2NobWllZCIsCi0gICAgIkluZ28gU2NobmVpZGVyIiwKLSAgICAiVmljdG9yIFNjaG5laWRlciIsCi0gICAgIlluZ3ZpIFNpZ3Vyam9uc3NvbiIsCi0gICAgIlN0ZXBoZW4gU2ltbW9ucyIsCi0gICAgIlJpY2sgU2xhZGtleSIsCi0gICAgIldpbGxpYW0gU21pdGgiLAotICAgICJEb21pbmlrIFN0cmFzc2VyIiwKLSAgICAiVmFkaW0gU3RyaXpoZXZza3kiLAotICAgICJCZXJ0aG8gU3R1bHRpZW5zIiwKLSAgICAiRXJpayBTdmVuZHNlbiIsCi0gICAgIlRyaXN0YW4gVGFycmFudCIsCi0gICAgIkFuZHJldyBUYXlsb3IiLAotICAgICJEdW5jYW4gQyBUaG9tc29uIiwKLSAgICAiR29yYW4gVGh5bmkiLAotICAgICJKaW1teSBUaXJ0YXdhbmdzYSIsCi0gICAgIkpvbiBUb21icyIsCi0gICAgIkxpbnVzIFRvcnZhbGRzIiwKLSAgICAiR3JlZ29yeSBUcnViZXRza295IiwKLSAgICAiUGV0cmkgVHVvbW9sYSIsCi0gICAgIk1pY2hhZWwgVmVrc2xlciIsCi0gICAgIlN2ZW4gVmVyZG9vbGFlZ2UiLAotICAgICJSb25hbiBXYWlkZSIsCi0gICAgIkVyaWMgV2FybmtlIiwKLSAgICAiTWFuZnJlZCBXZWljaGVsIiwKLSAgICAiVWxyaWNoIFdlaWdhbmQiLAotICAgICJNb3J0ZW4gV2VsaW5kZXIiLAotICAgICJMZW4gV2hpdGUiLAotICAgICJMYXdzb24gV2hpdG5leSIsCi0gICAgIkphbiBXaWxsYW1vd2l1cyIsCi0gICAgIkNhcmwgV2lsbGlhbXMiLAotICAgICJLYXJsIEd1ZW50ZXIgV3VlbnNjaCIsCi0gICAgIkVyaWMgWW91bmdkYWxlIiwKLSAgICAiSmFtZXMgWW91bmdtYW4iLAotICAgICJOaWtpdGEgVi4gWW91c2hjaGVua28iLAotICAgICJNaWtvbGFqIFphbGV3c2tpIiwKLSAgICAiSm9obiBaZXJvIiwKLSAgICAiTHVpeiBPdGF2aW8gTC4gWm9yemVsbGEiLAotICAgIE5VTEwKLX07Ci0KLQogLyogLklDTyBmaWxlIElDT05ESVIgZGVmaW5pdGlvbnMgKi8KIAogI3ByYWdtYSBwYWNrKDEpCkBAIC0zMDEsNyArMTQ4LDcgQEAKICAqCiAgKiBVdGlsaXR5IGZvciBjb2RlIHNoYXJpbmcgYmV0d2VlbiBGaW5kRXhlY3V0YWJsZSBhbmQgU2hlbGxFeGVjdXRlCiAgKi8KLXN0YXRpYyBISU5TVEFOQ0UzMiBTSEVMTF9GaW5kRXhlY3V0YWJsZSggTFBDU1RSIGxwRmlsZSwgCitISU5TVEFOQ0UzMiBTSEVMTF9GaW5kRXhlY3V0YWJsZSggTFBDU1RSIGxwRmlsZSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQQ1NUUiBscE9wZXJhdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBTVFIgbHBSZXN1bHQpCiB7IGNoYXIgKmV4dGVuc2lvbiA9IE5VTEw7IC8qIHBvaW50ZXIgdG8gZmlsZSBleHRlbnNpb24gKi8KQEAgLTQ4NSwxOCArMzMyLDYgQEAKICAgICByZXR1cm4gcmV0dmFsOwogfQogCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgICBTaGVsbEV4ZWN1dGUzMkEgICAoU0hFTEwzMi4yNDUpCi0gKi8KLUhJTlNUQU5DRTMyIFdJTkFQSSBTaGVsbEV4ZWN1dGUzMkEoIEhXTkQzMiBoV25kLCBMUENTVFIgbHBPcGVyYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUENTVFIgbHBGaWxlLCBMUENTVFIgbHBQYXJhbWV0ZXJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBDU1RSIGxwRGlyZWN0b3J5LCBJTlQzMiBpU2hvd0NtZCApCi17ICAgVFJBQ0Uoc2hlbGwsIlxuIik7Ci0gICAgcmV0dXJuIFNoZWxsRXhlY3V0ZTE2KCBoV25kLCBscE9wZXJhdGlvbiwgbHBGaWxlLCBscFBhcmFtZXRlcnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBscERpcmVjdG9yeSwgaVNob3dDbWQgKTsKLX0KLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICAgIEZpbmRFeGVjdXRhYmxlMTYgICAoU0hFTEwuMjEpCiAgKi8KQEAgLTUwNSwxOTAgKzM0MCw2IEBACiB7IHJldHVybiAoSElOU1RBTkNFMTYpRmluZEV4ZWN1dGFibGUzMkEoIGxwRmlsZSwgbHBEaXJlY3RvcnksIGxwUmVzdWx0ICk7CiB9CiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgICBGaW5kRXhlY3V0YWJsZTMyQSAgIChTSEVMTDMyLjE4NCkKLSAqLwotSElOU1RBTkNFMzIgV0lOQVBJIEZpbmRFeGVjdXRhYmxlMzJBKCBMUENTVFIgbHBGaWxlLCBMUENTVFIgbHBEaXJlY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQU1RSIGxwUmVzdWx0ICkKLXsgSElOU1RBTkNFMzIgcmV0dmFsPTMxOyAgICAvKiBkZWZhdWx0IC0gJ05vIGFzc29jaWF0aW9uIHdhcyBmb3VuZCcgKi8KLSAgICBjaGFyIG9sZF9kaXJbMTAyNF07Ci0KLSAgVFJBQ0Uoc2hlbGwsICJGaWxlICVzLCBEaXIgJXNcbiIsIAotCQkgKGxwRmlsZSAhPSBOVUxMP2xwRmlsZToiLSIpLCAKLQkJIChscERpcmVjdG9yeSAhPSBOVUxMP2xwRGlyZWN0b3J5OiItIikpOwotCi0gICAgbHBSZXN1bHRbMF09J1wwJzsgLyogU3RhcnQgb2ZmIHdpdGggYW4gZW1wdHkgcmV0dXJuIHN0cmluZyAqLwotCi0gICAgLyogdHJhcCBOVUxMIHBhcmFtZXRlcnMgb24gZW50cnkgKi8KLSAgICBpZiAoKCBscEZpbGUgPT0gTlVMTCApIHx8ICggbHBSZXN1bHQgPT0gTlVMTCApKQotICB7IC8qIEZJWE1FIC0gc2hvdWxkIHRocm93IGEgd2FybmluZywgcGVyaGFwcyEgKi8KLQlyZXR1cm4gMjsgLyogRmlsZSBub3QgZm91bmQuIENsb3NlIGVub3VnaCwgSSBndWVzcy4gKi8KLSAgICB9Ci0KLSAgICBpZiAobHBEaXJlY3RvcnkpCi0gIHsgR2V0Q3VycmVudERpcmVjdG9yeTMyQSggc2l6ZW9mKG9sZF9kaXIpLCBvbGRfZGlyICk7Ci0gICAgICAgIFNldEN1cnJlbnREaXJlY3RvcnkzMkEoIGxwRGlyZWN0b3J5ICk7Ci0gICAgfQotCi0gICAgcmV0dmFsID0gU0hFTExfRmluZEV4ZWN1dGFibGUoIGxwRmlsZSwgIm9wZW4iLCBscFJlc3VsdCApOwotCi0gIFRSQUNFKHNoZWxsLCAicmV0dXJuaW5nICVzXG4iLCBscFJlc3VsdCk7Ci0gIGlmIChscERpcmVjdG9yeSkKLSAgICBTZXRDdXJyZW50RGlyZWN0b3J5MzJBKCBvbGRfZGlyICk7Ci0gICAgcmV0dXJuIHJldHZhbDsKLX0KLQotdHlwZWRlZiBzdHJ1Y3QKLXsgTFBDU1RSICBzekFwcDsKLSAgICBMUENTVFIgIHN6T3RoZXJTdHVmZjsKLSAgICBISUNPTjMyIGhJY29uOwotfSBBQk9VVF9JTkZPOwotCi0jZGVmaW5lCQlJRENfU1RBVElDX1RFWFQJCTEwMAotI2RlZmluZQkJSURDX0xJU1RCT1gJCTk5Ci0jZGVmaW5lCQlJRENfV0lORV9URVhUCQk5OAotCi0jZGVmaW5lCQlEUk9QX0ZJRUxEX1RPUAkJKC0xNSkKLSNkZWZpbmUJCURST1BfRklFTERfSEVJR0hUCTE1Ci0KLWV4dGVybiBISUNPTjMyIGhJY29uVGl0bGVGb250OwotCi1zdGF0aWMgQk9PTDMyIF9fZ2V0X2Ryb3BsaW5lKCBIV05EMzIgaFduZCwgTFBSRUNUMzIgbHByZWN0ICkKLXsgSFdORDMyIGhXbmRDdGwgPSBHZXREbGdJdGVtMzIoaFduZCwgSURDX1dJTkVfVEVYVCk7Ci0gICAgaWYoIGhXbmRDdGwgKQotICB7IEdldFdpbmRvd1JlY3QzMiggaFduZEN0bCwgbHByZWN0ICk7Ci0JTWFwV2luZG93UG9pbnRzMzIoIDAsIGhXbmQsIChMUFBPSU5UMzIpbHByZWN0LCAyICk7Ci0JbHByZWN0LT5ib3R0b20gPSAobHByZWN0LT50b3AgKz0gRFJPUF9GSUVMRF9UT1ApOwotCXJldHVybiBUUlVFOwotICAgIH0KLSAgICByZXR1cm4gRkFMU0U7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgICBBYm91dERsZ1Byb2MzMiAgKG5vdCBhbiBleHBvcnRlZCBBUEkgZnVuY3Rpb24pCi0gKi8KLUxSRVNVTFQgV0lOQVBJIEFib3V0RGxnUHJvYzMyKCBIV05EMzIgaFduZCwgVUlOVDMyIG1zZywgV1BBUkFNMzIgd1BhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQQVJBTSBsUGFyYW0gKQoteyAgIEhXTkQzMiBoV25kQ3RsOwotICAgIGNoYXIgVGVtcGxhdGVbNTEyXSwgQXBwVGl0bGVbNTEyXTsKLQotICAgIFRSQUNFKHNoZWxsLCJcbiIpOwotCi0gICAgc3dpdGNoKG1zZykKLSAgICB7IGNhc2UgV01fSU5JVERJQUxPRzoKLSAgICAgIHsgQUJPVVRfSU5GTyAqaW5mbyA9IChBQk9VVF9JTkZPICopbFBhcmFtOwotICAgICAgICAgICAgaWYgKGluZm8pCi0gICAgICAgIHsgY29uc3QgY2hhciogY29uc3QgKnBzdHIgPSBTSEVMTF9QZW9wbGU7Ci0gICAgICAgICAgICAgICAgU2VuZERsZ0l0ZW1NZXNzYWdlMzJBKGhXbmQsIHN0YzEsIFNUTV9TRVRJQ09OMzIsaW5mby0+aEljb24sIDApOwotICAgICAgICAgICAgICAgIEdldFdpbmRvd1RleHQzMkEoIGhXbmQsIFRlbXBsYXRlLCBzaXplb2YoVGVtcGxhdGUpICk7Ci0gICAgICAgICAgICAgICAgc3ByaW50ZiggQXBwVGl0bGUsIFRlbXBsYXRlLCBpbmZvLT5zekFwcCApOwotICAgICAgICAgICAgICAgIFNldFdpbmRvd1RleHQzMkEoIGhXbmQsIEFwcFRpdGxlICk7Ci0gICAgICAgICAgICAgICAgU2V0V2luZG93VGV4dDMyQSggR2V0RGxnSXRlbTMyKGhXbmQsIElEQ19TVEFUSUNfVEVYVCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mby0+c3pPdGhlclN0dWZmICk7Ci0gICAgICAgICAgICAgICAgaFduZEN0bCA9IEdldERsZ0l0ZW0zMihoV25kLCBJRENfTElTVEJPWCk7Ci0gICAgICAgICAgICAgICAgU2VuZE1lc3NhZ2UzMkEoIGhXbmRDdGwsIFdNX1NFVFJFRFJBVywgMCwgMCApOwotICAgICAgICAgICAgICAgIFNlbmRNZXNzYWdlMzJBKCBoV25kQ3RsLCBXTV9TRVRGT05ULCBoSWNvblRpdGxlRm9udCwgMCApOwotICAgICAgICAgICAgICAgIHdoaWxlICgqcHN0cikKLSAgICAgICAgICB7IFNlbmRNZXNzYWdlMzJBKCBoV25kQ3RsLCBMQl9BRERTVFJJTkczMiwgKFdQQVJBTTMyKS0xLCAoTFBBUkFNKSpwc3RyICk7Ci0gICAgICAgICAgICAgICAgICAgIHBzdHIrKzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgU2VuZE1lc3NhZ2UzMkEoIGhXbmRDdGwsIFdNX1NFVFJFRFJBVywgMSwgMCApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAxOwotCi0gICAgY2FzZSBXTV9QQUlOVDoKLSAgICAgIHsgUkVDVDMyIHJlY3Q7Ci0JICAgIFBBSU5UU1RSVUNUMzIgcHM7Ci0JICAgIEhEQzMyIGhEQyA9IEJlZ2luUGFpbnQzMiggaFduZCwgJnBzICk7Ci0KLQkgICAgaWYoIF9fZ2V0X2Ryb3BsaW5lKCBoV25kLCAmcmVjdCApICkKLQkJR1JBUEhfRHJhd0xpbmVzKCBoREMsIChMUFBPSU5UMzIpJnJlY3QsIDEsIEdldFN0b2NrT2JqZWN0MzIoIEJMQUNLX1BFTiApICk7Ci0JICAgIEVuZFBhaW50MzIoIGhXbmQsICZwcyApOwotCX0KLQlicmVhazsKLQotICAgIGNhc2UgV01fTEJUUkFDS1BPSU5UOgotCWhXbmRDdGwgPSBHZXREbGdJdGVtMzIoaFduZCwgSURDX0xJU1RCT1gpOwotCWlmKCAoSU5UMTYpR2V0S2V5U3RhdGUxNiggVktfQ09OVFJPTCApIDwgMCApCi0gICAgICB7IGlmKCBEcmFnRGV0ZWN0MzIoIGhXbmRDdGwsICooKExQUE9JTlQzMikmbFBhcmFtKSApICkKLSAgICAgICAgeyBJTlQzMiBpZHggPSBTZW5kTWVzc2FnZTMyQSggaFduZEN0bCwgTEJfR0VUQ1VSU0VMMzIsIDAsIDAgKTsKLQkJaWYoIGlkeCAhPSAtMSApCi0gICAgICAgICAgeyBJTlQzMiBsZW5ndGggPSBTZW5kTWVzc2FnZTMyQSggaFduZEN0bCwgTEJfR0VUVEVYVExFTjMyLCAoV1BBUkFNMzIpaWR4LCAwICk7Ci0JCSAgICBIR0xPQkFMMTYgaE1lbU9iaiA9IEdsb2JhbEFsbG9jMTYoIEdNRU1fTU9WRUFCTEUsIGxlbmd0aCArIDEgKTsKLQkJICAgIGNoYXIqIHBzdHIgPSAoY2hhciopR2xvYmFsTG9jazE2KCBoTWVtT2JqICk7Ci0KLQkJICAgIGlmKCBwc3RyICkKLSAgICAgICAgICAgIHsgSENVUlNPUjE2IGhDdXJzb3IgPSBMb2FkQ3Vyc29yMTYoIDAsIE1BS0VJTlRSRVNPVVJDRTE2KE9DUl9EUkFHT0JKRUNUKSApOwotCQkJU2VuZE1lc3NhZ2UzMkEoIGhXbmRDdGwsIExCX0dFVFRFWFQzMiwgKFdQQVJBTTMyKWlkeCwgKExQQVJBTSlwc3RyICk7Ci0JCQlTZW5kTWVzc2FnZTMyQSggaFduZEN0bCwgTEJfREVMRVRFU1RSSU5HMzIsIChXUEFSQU0zMilpZHgsIDAgKTsKLQkJCVVwZGF0ZVdpbmRvdzMyKCBoV25kQ3RsICk7Ci0JCQlpZiggIURyYWdPYmplY3QxNigoSFdORDE2KWhXbmQsIChIV05EMTYpaFduZCwgRFJBR09CSl9EQVRBLCAwLCAoV09SRCloTWVtT2JqLCBoQ3Vyc29yKSApCi0JCQkgICAgU2VuZE1lc3NhZ2UzMkEoIGhXbmRDdGwsIExCX0FERFNUUklORzMyLCAoV1BBUkFNMzIpLTEsIChMUEFSQU0pcHN0ciApOwotCQkgICAgfQotICAgICAgICAgICAgaWYoIGhNZW1PYmogKQotICAgICAgICAgICAgICBHbG9iYWxGcmVlMTYoIGhNZW1PYmogKTsKLQkJfQotCSAgICB9Ci0JfQotCWJyZWFrOwotCi0gICAgY2FzZSBXTV9RVUVSWURST1BPQkpFQ1Q6Ci0JaWYoIHdQYXJhbSA9PSAwICkKLSAgICAgIHsgTFBEUkFHSU5GTyBscERyYWdJbmZvID0gKExQRFJBR0lORk8pUFRSX1NFR19UT19MSU4oKFNFR1BUUilsUGFyYW0pOwotCSAgICBpZiggbHBEcmFnSW5mbyAmJiBscERyYWdJbmZvLT53RmxhZ3MgPT0gRFJBR09CSl9EQVRBICkKLSAgICAgICAgeyBSRUNUMzIgcmVjdDsKLQkJaWYoIF9fZ2V0X2Ryb3BsaW5lKCBoV25kLCAmcmVjdCApICkKLSAgICAgICAgICB7IFBPSU5UMzIgcHQgPSB7IGxwRHJhZ0luZm8tPnB0LngsIGxwRHJhZ0luZm8tPnB0LnkgfTsKLQkJICAgIHJlY3QuYm90dG9tICs9IERST1BfRklFTERfSEVJR0hUOwotCQkgICAgaWYoIFB0SW5SZWN0MzIoICZyZWN0LCBwdCApICkKLSAgICAgICAgICAgIHsgU2V0V2luZG93TG9uZzMyQSggaFduZCwgRFdMX01TR1JFU1VMVCwgMSApOwotCQkJcmV0dXJuIFRSVUU7Ci0JCSAgICB9Ci0JCX0KLQkgICAgfQotCX0KLQlicmVhazsKLQotICAgIGNhc2UgV01fRFJPUE9CSkVDVDoKLQlpZiggd1BhcmFtID09IGhXbmQgKQotICAgICAgeyBMUERSQUdJTkZPIGxwRHJhZ0luZm8gPSAoTFBEUkFHSU5GTylQVFJfU0VHX1RPX0xJTigoU0VHUFRSKWxQYXJhbSk7Ci0JICAgIGlmKCBscERyYWdJbmZvICYmIGxwRHJhZ0luZm8tPndGbGFncyA9PSBEUkFHT0JKX0RBVEEgJiYgbHBEcmFnSW5mby0+aExpc3QgKQotICAgICAgICB7IGNoYXIqIHBzdHIgPSAoY2hhciopR2xvYmFsTG9jazE2KCAoSEdMT0JBTDE2KShscERyYWdJbmZvLT5oTGlzdCkgKTsKLQkJaWYoIHBzdHIgKQotICAgICAgICAgIHsgc3RhdGljIGNoYXIgX19hcHBlbmRpeF9zdHJbXSA9ICIgd2l0aCI7Ci0KLQkJICAgIGhXbmRDdGwgPSBHZXREbGdJdGVtMzIoIGhXbmQsIElEQ19XSU5FX1RFWFQgKTsKLQkJICAgIFNlbmRNZXNzYWdlMzJBKCBoV25kQ3RsLCBXTV9HRVRURVhULCA1MTIsIChMUEFSQU0pVGVtcGxhdGUgKTsKLQkJICAgIGlmKCAhbHN0cm5jbXAzMkEoIFRlbXBsYXRlLCAiV0lORSIsIDQgKSApCi0JCQlTZXRXaW5kb3dUZXh0MzJBKCBHZXREbGdJdGVtMzIoaFduZCwgSURDX1NUQVRJQ19URVhUKSwgVGVtcGxhdGUgKTsKLQkJICAgIGVsc2UKLSAgICAgICAgICB7IGNoYXIqIHBjaCA9IFRlbXBsYXRlICsgc3RybGVuKFRlbXBsYXRlKSAtIHN0cmxlbihfX2FwcGVuZGl4X3N0cik7Ci0JCQkqcGNoID0gJ1wwJzsKLQkJCVNlbmRNZXNzYWdlMzJBKCBHZXREbGdJdGVtMzIoaFduZCwgSURDX0xJU1RCT1gpLCBMQl9BRERTVFJJTkczMiwgCi0JCQkJCShXUEFSQU0zMiktMSwgKExQQVJBTSlUZW1wbGF0ZSApOwotCQkgICAgfQotCi0JCSAgICBsc3RyY3B5MzJBKCBUZW1wbGF0ZSwgcHN0ciApOwotCQkgICAgbHN0cmNhdDMyQSggVGVtcGxhdGUsIF9fYXBwZW5kaXhfc3RyICk7Ci0JCSAgICBTZXRXaW5kb3dUZXh0MzJBKCBoV25kQ3RsLCBUZW1wbGF0ZSApOwotCQkgICAgU2V0V2luZG93TG9uZzMyQSggaFduZCwgRFdMX01TR1JFU1VMVCwgMSApOwotCQkgICAgcmV0dXJuIFRSVUU7Ci0JCX0KLQkgICAgfQotCX0KLQlicmVhazsKLQotICAgIGNhc2UgV01fQ09NTUFORDoKLSAgICAgICAgaWYgKHdQYXJhbSA9PSBJRE9LKQotICAgIHsgIEVuZERpYWxvZzMyKGhXbmQsIFRSVUUpOwotICAgICAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgfQotICAgIHJldHVybiAwOwotfQotCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgICBBYm91dERsZ1Byb2MxNiAgIChTSEVMTC4zMykKQEAgLTcwOCw2OSArMzU5LDYgQEAKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICAgIFNoZWxsQWJvdXQzMkEgICAoU0hFTEwzMi4yNDMpCi0gKi8KLUJPT0wzMiBXSU5BUEkgU2hlbGxBYm91dDMyQSggSFdORDMyIGhXbmQsIExQQ1NUUiBzekFwcCwgTFBDU1RSIHN6T3RoZXJTdHVmZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSElDT04zMiBoSWNvbiApCi17ICAgQUJPVVRfSU5GTyBpbmZvOwotICAgIFRSQUNFKHNoZWxsLCJcbiIpOwotICAgIGluZm8uc3pBcHAgICAgICAgID0gc3pBcHA7Ci0gICAgaW5mby5zek90aGVyU3R1ZmYgPSBzek90aGVyU3R1ZmY7Ci0gICAgaW5mby5oSWNvbiAgICAgICAgPSBoSWNvbjsKLSAgICBpZiAoIWhJY29uKSBpbmZvLmhJY29uID0gTG9hZEljb24xNiggMCwgTUFLRUlOVFJFU09VUkNFMTYoT0lDX1dJTkVJQ09OKSApOwotICAgIHJldHVybiBEaWFsb2dCb3hJbmRpcmVjdFBhcmFtMzJBKCBXSU5fR2V0V2luZG93SW5zdGFuY2UoIGhXbmQgKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBTWVNSRVNfR2V0UmVzUHRyKCBTWVNSRVNfRElBTE9HX1NIRUxMX0FCT1VUX01TR0JPWCApLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoV25kLCBBYm91dERsZ1Byb2MzMiwgKExQQVJBTSkmaW5mbyApOwotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgICBTaGVsbEFib3V0MzJXICAgKFNIRUxMMzIuMjQ0KQotICovCi1CT09MMzIgV0lOQVBJIFNoZWxsQWJvdXQzMlcoIEhXTkQzMiBoV25kLCBMUENXU1RSIHN6QXBwLCBMUENXU1RSIHN6T3RoZXJTdHVmZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSElDT04zMiBoSWNvbiApCi17ICAgQk9PTDMyIHJldDsKLSAgICBBQk9VVF9JTkZPIGluZm87Ci0KLSAgICBUUkFDRShzaGVsbCwiXG4iKTsKLSAgICAKLSAgICBpbmZvLnN6QXBwICAgICAgICA9IEhFQVBfc3RyZHVwV3RvQSggR2V0UHJvY2Vzc0hlYXAoKSwgMCwgc3pBcHAgKTsKLSAgICBpbmZvLnN6T3RoZXJTdHVmZiA9IEhFQVBfc3RyZHVwV3RvQSggR2V0UHJvY2Vzc0hlYXAoKSwgMCwgc3pPdGhlclN0dWZmICk7Ci0gICAgaW5mby5oSWNvbiAgICAgICAgPSBoSWNvbjsKLSAgICBpZiAoIWhJY29uKSBpbmZvLmhJY29uID0gTG9hZEljb24xNiggMCwgTUFLRUlOVFJFU09VUkNFMTYoT0lDX1dJTkVJQ09OKSApOwotICAgIHJldCA9IERpYWxvZ0JveEluZGlyZWN0UGFyYW0zMkEoIFdJTl9HZXRXaW5kb3dJbnN0YW5jZSggaFduZCApLAotICAgICAgICAgICAgICAgICAgICAgICAgIFNZU1JFU19HZXRSZXNQdHIoIFNZU1JFU19ESUFMT0dfU0hFTExfQUJPVVRfTVNHQk9YICksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhXbmQsIEFib3V0RGxnUHJvYzMyLCAoTFBBUkFNKSZpbmZvICk7Ci0gICAgSGVhcEZyZWUoIEdldFByb2Nlc3NIZWFwKCksIDAsIChMUFNUUilpbmZvLnN6QXBwICk7Ci0gICAgSGVhcEZyZWUoIEdldFByb2Nlc3NIZWFwKCksIDAsIChMUFNUUilpbmZvLnN6T3RoZXJTdHVmZiApOwotICAgIHJldHVybiByZXQ7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgkJCQlTaGVsbF9Ob3RpZnlJY29uCVtTSEVMTDMyLjI0OV0KLSAqCUZJWE1FCi0gKglUaGlzIGZ1bmN0aW9uIGlzIHN1cHBvc2VkIHRvIGRlYWwgd2l0aCB0aGUgc3lzdHJheS4KLSAqCUFueSBpZGVhcyBvbiBob3cgdGhpcyBpcyB0byBiZSBpbXBsaW1lbnRlZD8KLSAqLwotQk9PTDMyIFdJTkFQSSBTaGVsbF9Ob3RpZnlJY29uKAlEV09SRCBkd01lc3NhZ2UsCi0JCQkJUE5PVElGWUlDT05EQVRBIHBuaWQgKQoteyAgIFRSQUNFKHNoZWxsLCJcbiIpOwotICAgIHJldHVybiBGQUxTRTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCQkJCVNoZWxsX05vdGlmeUljb24JW1NIRUxMMzIuMjQwXQotICoJRklYTUUKLSAqCVRoaXMgZnVuY3Rpb24gaXMgc3VwcG9zZWQgdG8gZGVhbCB3aXRoIHRoZSBzeXN0cmF5LgotICoJQW55IGlkZWFzIG9uIGhvdyB0aGlzIGlzIHRvIGJlIGltcGxpbWVudGVkPwotICovCi1CT09MMzIgV0lOQVBJIFNoZWxsX05vdGlmeUljb25BKERXT1JEIGR3TWVzc2FnZSwKLQkJCQlQTk9USUZZSUNPTkRBVEEgcG5pZCApCi17ICAgVFJBQ0Uoc2hlbGwsIlxuIik7Ci0gICAgcmV0dXJuIEZBTFNFOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoJCQkJU0hFTExfR2V0UmVzb3VyY2VUYWJsZQogICovCiBzdGF0aWMgRFdPUkQgU0hFTExfR2V0UmVzb3VyY2VUYWJsZShIRklMRTMyIGhGaWxlLExQQllURSAqcmV0cHRyKQpAQCAtMTE4Niw0MCArNzc0LDYgQEAKIH0KIAogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgICAgRXh0cmFjdEljb24zMkEgICAoU0hFTEwzMi4xMzMpCi0gKi8KLUhJQ09OMzIgV0lOQVBJIEV4dHJhY3RJY29uMzJBKCBISU5TVEFOQ0UzMiBoSW5zdGFuY2UsIExQQ1NUUiBscHN6RXhlRmlsZU5hbWUsCi0JVUlOVDMyIG5JY29uSW5kZXggKQoteyAgIEhHTE9CQUwxNiBoYW5kbGUgPSBJbnRlcm5hbEV4dHJhY3RJY29uKGhJbnN0YW5jZSxscHN6RXhlRmlsZU5hbWUsbkljb25JbmRleCwgMSk7Ci0gICAgVFJBQ0Uoc2hlbGwsIlxuIik7Ci0gICAgaWYoIGhhbmRsZSApCi0gICAgewotCUhJQ09OMTYqIHB0ciA9IChISUNPTjE2KilHbG9iYWxMb2NrMTYoaGFuZGxlKTsKLQlISUNPTjE2ICBoSWNvbiA9ICpwdHI7Ci0KLQlHbG9iYWxGcmVlMTYoaGFuZGxlKTsKLQlyZXR1cm4gaEljb247Ci0gICAgfQotICAgIHJldHVybiAwOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgICAgRXh0cmFjdEljb24zMlcgICAoU0hFTEwzMi4xODApCi0gKi8KLUhJQ09OMzIgV0lOQVBJIEV4dHJhY3RJY29uMzJXKCBISU5TVEFOQ0UzMiBoSW5zdGFuY2UsIExQQ1dTVFIgbHBzekV4ZUZpbGVOYW1lLAotCVVJTlQzMiBuSWNvbkluZGV4ICkKLXsgTFBTVFIgIGV4ZWZuOwotICBISUNPTjMyICByZXQ7Ci0gIFRSQUNFKHNoZWxsLCJcbiIpOwotCi0gIGV4ZWZuID0gSEVBUF9zdHJkdXBXdG9BKEdldFByb2Nlc3NIZWFwKCksMCxscHN6RXhlRmlsZU5hbWUpOwotICByZXQgPSBFeHRyYWN0SWNvbjMyQShoSW5zdGFuY2UsZXhlZm4sbkljb25JbmRleCk7Ci0KLQlIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLDAsZXhlZm4pOwotCXJldHVybiByZXQ7Ci19Ci0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCQkJCUV4dHJhY3RBc3NvY2lhdGVkSWNvbglbU0hFTEwuMzZdCkBAIC0xNDMwLDY1MiArOTg0LDMgQEAKICAgICB9CiAgICAgcmV0dXJuIEZBTFNFOwogfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoJCQkJU0hHZXRGaWxlSW5mb0EJCVtTSEVMTDMyLjIxOF0KLSAqCi0gKiBGSVhNRQotICogICAKLSAqLwotSElNQUdFTElTVCBTaGVsbFNtYWxsSWNvbkxpc3QgPSAwOwotSElNQUdFTElTVCBTaGVsbEJpZ0ljb25MaXN0ID0gMDsKLQotRFdPUkQgV0lOQVBJIFNIR2V0RmlsZUluZm8zMkEoTFBDU1RSIHBhdGgsRFdPUkQgZHdGaWxlQXR0cmlidXRlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNIRklMRUlORk8zMkEgKnBzZmksIFVJTlQzMiBzaXplb2Zwc2ZpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVDMyIGZsYWdzICkKLXsgQ0hBUiBzelRlbXBbTUFYX1BBVEhdOwotICBEV09SRCByZXQ9MDsKLSAgCi0gIFRSQUNFKHNoZWxsLCIoJXMsMHgleCwlcCwweCV4LDB4JXgpXG4iLAotCSAgICAgIHBhdGgsZHdGaWxlQXR0cmlidXRlcyxwc2ZpLHNpemVvZnBzZmksZmxhZ3MpOwotCi0gIC8qIHRyYW5zbGF0ZSB0aGUgcGlkbCB0byBhIHBhdGgqLwotICBpZiAoZmxhZ3MgJiBTSEdGSV9QSURMKQotICB7IFNIR2V0UGF0aEZyb21JRExpc3QzMkEgKChMUENJVEVNSURMSVNUKXBhdGgsc3pUZW1wKTsKLSAgICBUUkFDRShzaGVsbCwicGlkbD0lcCBpcyAlc1xuIixwYXRoLHN6VGVtcCk7Ci0gIH0KLQotICBpZiAoZmxhZ3MgJiBTSEdGSV9BVFRSSUJVVEVTKQotICB7IEZJWE1FKHNoZWxsLCJmaWxlIGF0dHJpYnV0ZXMsIHN0dWJcbiIpOwotICAgIHBzZmktPmR3QXR0cmlidXRlcz0wOwotICAgIHJldD1UUlVFOyAgICAKLSAgfQotCi0gIGlmIChmbGFncyAmIFNIR0ZJX0RJU1BMQVlOQU1FKQotICB7IGlmIChmbGFncyAmIFNIR0ZJX1BJREwpCi0gICAgeyBzdHJjcHkocHNmaS0+c3pEaXNwbGF5TmFtZSxzelRlbXApOwotICAgIH0KLSAgICBlbHNlCi0gICAgeyBzdHJjcHkocHNmaS0+c3pEaXNwbGF5TmFtZSxwYXRoKTsKLSAgICAgIFRSQUNFKHNoZWxsLCJkaXNwbGF5bmFtZT0lc1xuIiwgc3pUZW1wKTsKLSAgICB9Ci0gICAgcmV0PVRSVUU7Ci0gIH0KLSAgCi0gIGlmIChmbGFncyAmIFNIR0ZJX1RZUEVOQU1FKQotICB7IEZJWE1FKHNoZWxsLCJnZXQgdGhlIGZpbGUgdHlwZSwgc3R1YlxuIik7Ci0gICAgc3RyY3B5KHBzZmktPnN6VHlwZU5hbWUsIiIpOwotICAgIHJldD1UUlVFOwotICB9Ci0gIAotICBpZiAoZmxhZ3MgJiBTSEdGSV9JQ09OTE9DQVRJT04pCi0gIHsgRklYTUUoc2hlbGwsImxvY2F0aW9uIG9mIGljb24sIHN0dWJcbiIpOwotICAgIHN0cmNweShwc2ZpLT5zekRpc3BsYXlOYW1lLCIiKTsKLSAgICByZXQ9VFJVRTsKLSAgfQotCi0gIGlmIChmbGFncyAmIFNIR0ZJX0VYRVRZUEUpCi0gICAgRklYTUUoc2hlbGwsInR5cGUgb2YgZXhlY3V0YWJsZSwgc3R1YlxuIik7Ci0KLSAgaWYgKGZsYWdzICYgU0hHRklfTElOS09WRVJMQVkpCi0gICAgRklYTUUoc2hlbGwsInNldCBpY29uIHRvIGxpbmssIHN0dWJcbiIpOwotCi0gIGlmIChmbGFncyAmIFNIR0ZJX09QRU5JQ09OKQotICAgIEZJWE1FKHNoZWxsLCJzZXQgdG8gb3BlbiBpY29uLCBzdHViXG4iKTsKLQotICBpZiAoZmxhZ3MgJiBTSEdGSV9TRUxFQ1RFRCkKLSAgICBGSVhNRShzaGVsbCwic2V0IGljb24gdG8gc2VsZWN0ZWQsIHN0dWJcbiIpOwotCi0gIGlmIChmbGFncyAmIFNIR0ZJX1NIRUxMSUNPTlNJWkUpCi0gICAgRklYTUUoc2hlbGwsInNldCBpY29uIHRvIHNoZWxsIHNpemUsIHN0dWJcbiIpOwotCi0gIGlmIChmbGFncyAmIFNIR0ZJX1VTRUZJTEVBVFRSSUJVVEVTKQotICAgIEZJWE1FKHNoZWxsLCJ1c2UgdGhlIGR3RmlsZUF0dHJpYnV0ZXMsIHN0dWJcbiIpOwotIAotICBpZiAoZmxhZ3MgJiBTSEdGSV9JQ09OKQotICB7IEZJWE1FKHNoZWxsLCJpY29uIGhhbmRsZVxuIik7Ci0gICAgaWYgKGZsYWdzICYgU0hHRklfU01BTExJQ09OKQotICAgICB7IFRSQUNFKHNoZWxsLCJzZXQgdG8gc21hbGwgaWNvblxuIik7IAotICAgICAgIHBzZmktPmhJY29uPUltYWdlTGlzdF9HZXRJY29uKFNoZWxsU21hbGxJY29uTGlzdCwwLElMRF9OT1JNQUwpOwotICAgICAgIHJldCA9IChEV09SRCkgU2hlbGxTbWFsbEljb25MaXN0OwotICAgICB9Ci0gICAgIGVsc2UKLSAgICAgeyBUUkFDRShzaGVsbCwic2V0IHRvIGJpZyBpY29uXG4iKTsKLSAgICAgICBwc2ZpLT5oSWNvbj1JbWFnZUxpc3RfR2V0SWNvbihTaGVsbEJpZ0ljb25MaXN0LDAsSUxEX05PUk1BTCk7Ci0gICAgICAgcmV0ID0gKERXT1JEKSBTaGVsbEJpZ0ljb25MaXN0OwotICAgICB9ICAgICAgCi0gIH0KLQotICBpZiAoZmxhZ3MgJiBTSEdGSV9TWVNJQ09OSU5ERVgpCi0gIHsgIEZJWE1FKHNoZWxsLCJnZXQgdGhlIFNZU0lDT05JTkRFWFxuIik7Ci0gICAgIHBzZmktPmlJY29uPTE7Ci0gICAgIGlmIChmbGFncyAmIFNIR0ZJX1NNQUxMSUNPTikKLSAgICAgeyBUUkFDRShzaGVsbCwic2V0IHRvIHNtYWxsIGljb25cbiIpOyAKLSAgICAgICByZXQgPSAoRFdPUkQpIFNoZWxsU21hbGxJY29uTGlzdDsKLSAgICAgfQotICAgICBlbHNlICAgICAgICAKLSAgICAgeyBUUkFDRShzaGVsbCwic2V0IHRvIGJpZyBpY29uXG4iKTsKLSAgICAgICByZXQgPSAoRFdPUkQpIFNoZWxsQmlnSWNvbkxpc3Q7Ci0gICAgIH0KLSAgfQotCi0gCi0gIHJldHVybiByZXQ7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgkJCQlTSEFwcEJhck1lc3NhZ2UzMglbU0hFTEwzMi4yMDddCi0gKi8KLVVJTlQzMiBXSU5BUEkgU0hBcHBCYXJNZXNzYWdlMzIoRFdPUkQgbXNnLCBQQVBQQkFSREFUQSBkYXRhKQoteyBGSVhNRShzaGVsbCwiKDB4JTA4bHgsJXApOiBzdHViXG4iLCBtc2csIGRhdGEpOwotI2lmIDAKLSAgc3dpdGNoIChtc2cpCi0gIHsgY2FzZSBBQk1fQUNUSVZBVEU6Ci0gICAgICAgIGNhc2UgQUJNX0dFVEFVVE9ISURFQkFSOgotICAgICAgICBjYXNlIEFCTV9HRVRTVEFURToKLSAgICAgICAgY2FzZSBBQk1fR0VUVEFTS0JBUlBPUzoKLSAgICAgICAgY2FzZSBBQk1fTkVXOgotICAgICAgICBjYXNlIEFCTV9RVUVSWVBPUzoKLSAgICAgICAgY2FzZSBBQk1fUkVNT1ZFOgotICAgICAgICBjYXNlIEFCTV9TRVRBVVRPSElERUJBUjoKLSAgICAgICAgY2FzZSBBQk1fU0VUUE9TOgotICAgICAgICBjYXNlIEFCTV9XSU5ET1dQT1NDSEFOR0VEOgotCSAgICA7Ci0gICAgfQotI2VuZGlmCi0gICAgcmV0dXJuIDA7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgkJCQlDb21tYW5kTGluZVRvQXJndlcJW1NIRUxMMzIuN10KLSAqLwotTFBXU1RSKiBXSU5BUEkgQ29tbWFuZExpbmVUb0FyZ3ZXKExQV1NUUiBjbWRsaW5lLExQRFdPUkQgbnVtYXJncykKLXsgTFBXU1RSICAqYXJndixzLHQ7Ci0JaW50CWk7Ci0gIFRSQUNFKHNoZWxsLCJcbiIpOwotCi0gICAgICAgIC8qIHRvIGdldCB3cml0ZWFibGUgY29weSAqLwotCWNtZGxpbmUgPSBIRUFQX3N0cmR1cFcoIEdldFByb2Nlc3NIZWFwKCksIDAsIGNtZGxpbmUpOwotCXM9Y21kbGluZTtpPTA7Ci0gIHdoaWxlICgqcykKLSAgeyAvKiBzcGFjZSAqLwotICAgIGlmICgqcz09MHgwMDIwKSAKLSAgICB7IGkrKzsKLQkJCXMrKzsKLQkJCXdoaWxlICgqcyAmJiAqcz09MHgwMDIwKQotCQkJCXMrKzsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCXMrKzsKLQl9Ci0JYXJndj0oTFBXU1RSKilIZWFwQWxsb2MoIEdldFByb2Nlc3NIZWFwKCksIDAsIHNpemVvZihMUFdTVFIpKihpKzEpICk7Ci0Jcz10PWNtZGxpbmU7Ci0JaT0wOwotICB3aGlsZSAoKnMpCi0gIHsgaWYgKCpzPT0weDAwMjApCi0gICAgeyAqcz0wOwotCQkJYXJndltpKytdPUhFQVBfc3RyZHVwVyggR2V0UHJvY2Vzc0hlYXAoKSwgMCwgdCApOwotCQkJKnM9MHgwMDIwOwotCQkJd2hpbGUgKCpzICYmICpzPT0weDAwMjApCi0JCQkJcysrOwotCQkJaWYgKCpzKQotCQkJCXQ9cysxOwotCQkJZWxzZQotCQkJCXQ9czsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCXMrKzsKLQl9Ci0JaWYgKCp0KQotCQlhcmd2W2krK109KExQV1NUUilIRUFQX3N0cmR1cFcoIEdldFByb2Nlc3NIZWFwKCksIDAsIHQgKTsKLQlIZWFwRnJlZSggR2V0UHJvY2Vzc0hlYXAoKSwgMCwgY21kbGluZSApOwotCWFyZ3ZbaV09TlVMTDsKLQkqbnVtYXJncz1pOwotCXJldHVybiBhcmd2OwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoJCQkJQ29udHJvbF9SdW5ETEwJCVtTSEVMTDMyLjEyXQotICoKLSAqIFdpbGQgc3BlY3VsYXRpb24gaW4gdGhlIGZvbGxvd2luZyEKLSAqCi0gKiBodHRwOi8vcHJlbWl1bS5taWNyb3NvZnQuY29tL21zZG4vbGlicmFyeS90ZWNoYXJ0L21zZG4xOTMuaHRtCi0gKi8KLQotdm9pZCBXSU5BUEkgQ29udHJvbF9SdW5ETEwgKEhXTkQzMiBod25kLCBMUENWT0lEIGNvZGUsIExQQ1NUUiBjbWQsIERXT1JEIGFyZzQpCi17IEZJWE1FKHNoZWxsLCAiKCUwOHgsICVwLCBcIiVzXCIsICUwOGx4KVxuIiwKLQlod25kLCBjb2RlID8gY29kZSA6ICIobnVsbCkiLCBjbWQgPyBjbWQgOiAiKG51bGwpIiwgYXJnNCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBGcmVlSWNvbkxpc3QKLSAqLwotdm9pZCBXSU5BUEkgRnJlZUljb25MaXN0KCBEV09SRCBkdyApCi17IEZJWE1FKHNoZWxsLCAiKCVseCk6IHN0dWJcbiIsZHcpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogU0hFTEwzMl9EbGxHZXRDbGFzc09iamVjdCAgIFtTSEVMTDMyLjEyOF0KLSAqCi0gKiBbU3RhbmRhcnQgT0xFL0NPTSBJbnRlcmZhY2UgTWV0aG9kXQotICogVGhpcyBGdW5jdGlvbiByZXRyaXZlcyB0aGUgcG9pbnRlciB0byBhIHNwZWNpZmllZCBpbnRlcmZhY2UgKGlpZCkgb2YKLSAqIGEgZ2l2ZW4gY2xhc3MgKHJjbHNpZCkuCi0gKiBXaXRoIHRoaXMgcG9pbnRlciBpdCdzIHBvc3NpYmxlIHRvIGNhbGwgdGhlIElDbGFzc0ZhY3RvcnlfQ3JlYXRlSW5zdGFuY2UKLSAqIG1ldGhvZCB0byBnZXQgYSBpbnN0YW5jZSBvZiB0aGUgcmVxdWVzdGVkIENsYXNzLgotICogVGhpcyBmdW5jdGlvbiBkb2VzIE5PVCBpbnN0YW50aWF0ZSB0aGUgQ2xhc3MhISEKLSAqIAotICogUkVUVVJOUwotICogICBIUkVTVUxUCi0gKgotICovCi1EV09SRCBXSU5BUEkgU0hFTEwzMl9EbGxHZXRDbGFzc09iamVjdChSRUZDTFNJRCByY2xzaWQsUkVGSUlEIGlpZCxMUFZPSUQgKnBwdikKLXsgSFJFU1VMVAlocmVzID0gRV9PVVRPRk1FTU9SWTsKLSAgTFBDTEFTU0ZBQ1RPUlkgbHBjbGY7Ci0KLSAgY2hhcgl4Y2xzaWRbNTBdLHhpaWRbNTBdOwotICBXSU5FX1N0cmluZ0Zyb21DTFNJRCgoTFBDTFNJRClyY2xzaWQseGNsc2lkKTsKLSAgV0lORV9TdHJpbmdGcm9tQ0xTSUQoKExQQ0xTSUQpaWlkLHhpaWQpOwotICBUUkFDRShzaGVsbCwiXG5cdENMU0lEOlx0JXMsXG5cdElJRDpcdCVzXG4iLHhjbHNpZCx4aWlkKTsKLQkKLSAgKnBwdiA9IE5VTEw7Ci0JaWYoSXNFcXVhbENMU0lEKHJjbHNpZCwgJkNMU0lEX1NoZWxsRGVza3RvcCl8fCAKLQkgICBJc0VxdWFsQ0xTSUQocmNsc2lkLCAmQ0xTSURfU2hlbGxMaW5rKSkKLQl7IGlmKElzRXF1YWxDTFNJRChyY2xzaWQsICZDTFNJRF9TaGVsbERlc2t0b3ApKSAgICAgIC8qZGVidWcqLwotCSAgICBUUkFDRShzaGVsbCwicmVxdWVzdGVkIENMU0lEX1NoZWxsRGVza3RvcFxuIik7Ci0JICBpZihJc0VxdWFsQ0xTSUQocmNsc2lkLCAmQ0xTSURfU2hlbGxMaW5rKSkgICAgICAgICAvKmRlYnVnKi8KLQkgICAgVFJBQ0Uoc2hlbGwsInJlcXVlc3RlZCBDTFNJRF9TaGVsbExpbmtcbiIpOwotCi0JICBscGNsZiA9IElDbGFzc0ZhY3RvcnlfQ29uc3RydWN0b3IoKTsKLSAgICBpZihscGNsZikKLSAgICB7IGhyZXMgPSBscGNsZi0+bHB2dGJsLT5mblF1ZXJ5SW50ZXJmYWNlKGxwY2xmLGlpZCwgcHB2KTsKLQkJICBscGNsZi0+bHB2dGJsLT5mblJlbGVhc2UobHBjbGYpOwotCQl9Ci0JfQotCWVsc2UKLSAgeyBXQVJOKHNoZWxsLCAiY2xzaWQoJXMpIG5vdCBpbiBidWlsZGluIFNIRUxMMzJcbiIseGNsc2lkKTsKLSAgICBocmVzID0gQ0xBU1NfRV9DTEFTU05PVEFWQUlMQUJMRTsKLQl9Ci0gIFRSQUNFKHNoZWxsLCJSRVRVUk4gcG9pbnRlciB0byBpbnRlcmZhY2U6ICVwXG4iLHBwdik7Ci0gIHJldHVybiBocmVzOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIFNIR2V0RGVza3RvcEZvbGRlcgkJW1NIRUxMMzIuMjE2XQotICogCi0gKiAgU0RLIGhlYWRlciB3aW45NS9zaGxvYmouaDogVGhpcyBpcyBlcXVpdmFsZW50IHRvIGNhbGwgQ29DcmVhdGVJbnN0YW5jZSB3aXRoCi0gKiAgQ0xTSURfU2hlbGxEZXNrdG9wCi0gKiAgQ29DcmVhdGVJbnN0YW5jZShDTFNJRF9EZXNrdG9wLCBOVUxMLCBDTFNDVFhfSU5QUk9DLCBJSURfSVNoZWxsRm9sZGVyLCAmcHNoZik7Ci0gKgotICogUkVUVVJOUwotICogICB0aGUgaW50ZXJmYWNlIHRvIHRoZSBzaGVsbCBkZXNrdG9wIGZvbGRlci4KLSAqCi0gKiBGSVhNRQotICogICB0aGUgcGRlc2t0b3Bmb2xkZXIgaGFzIHRvIGJlIHJlbGVhc2VkIGF0IHRoZSBlbmQgKGF0IGRsbCB1bmxvYWRpbmc/Pz8pCi0gKi8KLUxQU0hFTExGT0xERVIgcGRlc2t0b3Bmb2xkZXI9TlVMTDsKLQotRFdPUkQgV0lOQVBJIFNIR2V0RGVza3RvcEZvbGRlcihMUFNIRUxMRk9MREVSICpzaGVsbGZvbGRlcikKLXsgSFJFU1VMVAlocmVzID0gRV9PVVRPRk1FTU9SWTsKLSAgTFBDTEFTU0ZBQ1RPUlkgbHBjbGY7Ci0JVFJBQ0Uoc2hlbGwsIiVwLT4oJXApXG4iLHNoZWxsZm9sZGVyLCpzaGVsbGZvbGRlcik7Ci0KLSAgaWYgKHBkZXNrdG9wZm9sZGVyKQotCXsJaHJlcyA9IE5PRVJST1I7Ci0JfQotCWVsc2UKLSAgeyBscGNsZiA9IElDbGFzc0ZhY3RvcnlfQ29uc3RydWN0b3IoKTsKLSAgICAvKiBmaXhtZTogdGhlIGJ1aWxkaW4gSUNsYXNzRmFjdG9yeV9Db25zdHJ1Y3RvciBpcyBhdCB0aGUgbW9tZW50IG9ubHkgCi0gCQlmb3IgcmNsc2lkPUNMU0lEX1NoZWxsRGVza3RvcCwgc28gd2UgZ2V0IHRoZSByaWdodCBJbnRlcmZhY2UgKGpzY2gpKi8KLSAgICBpZihscGNsZikKLSAgICB7IGhyZXMgPSBscGNsZi0+bHB2dGJsLT5mbkNyZWF0ZUluc3RhbmNlKGxwY2xmLE5VTEwsKFJFRklJRCkmSUlEX0lTaGVsbEZvbGRlciwgKHZvaWQqKSZwZGVza3RvcGZvbGRlcik7Ci0JIAkgIGxwY2xmLT5scHZ0YmwtPmZuUmVsZWFzZShscGNsZik7Ci0JICB9ICAKLSAgfQotCQotICBpZiAocGRlc2t0b3Bmb2xkZXIpCi0JeyAqc2hlbGxmb2xkZXIgPSBwZGVza3RvcGZvbGRlcjsKLSAgICBwZGVza3RvcGZvbGRlci0+bHB2dGJsLT5mbkFkZFJlZihwZGVza3RvcGZvbGRlcik7Ci0JfQotICBlbHNlCi0JeyAqc2hlbGxmb2xkZXI9TlVMTDsKLQl9CQotCi0gIFRSQUNFKHNoZWxsLCItLSAlcC0+KCVwKVxuIixzaGVsbGZvbGRlciwgKnNoZWxsZm9sZGVyKTsKLQlyZXR1cm4gaHJlczsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCQkJIFNIR2V0TWFsbG9jCQkJW1NIRUxMMzIuMjIwXQotICogcmV0dXJucyB0aGUgaW50ZXJmYWNlIHRvIHNoZWxsIG1hbGxvYy4KLSAqCi0gKiBbU0RLIGhlYWRlciB3aW45NS9zaGxvYmouaDoKLSAqIGVxdWl2YWxlbnQgdG86ICAjZGVmaW5lIFNIR2V0TWFsbG9jKHBwbWVtKSAgIENvR2V0TWFsbG9jKE1FTUNUWF9UQVNLLCBwcG1lbSkKLSAqIF0KLSAqIFdoYXQgd2UgYXJlIGN1cnJlbnRseSBkb2luZyBpcyBub3QgdmVyeSB3cm9uZywgc2luY2Ugd2UgYWx3YXlzIHVzZSB0aGUgc2FtZQotICogaGVhcCAoUHJvY2Vzc0hlYXApLgotICovCi1EV09SRCBXSU5BUEkgU0hHZXRNYWxsb2MoTFBNQUxMT0MzMiAqbHBtYWwpIAotewlUUkFDRShzaGVsbCwiKCVwKVxuIiwgbHBtYWwpOwotCXJldHVybiBDb0dldE1hbGxvYzMyKDAsbHBtYWwpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoJCQkgU0hHZXRTcGVjaWFsRm9sZGVyTG9jYXRpb24JW1NIRUxMMzIuMjIzXQotICogZ2V0cyB0aGUgZm9sZGVyIGxvY2F0aW9ucyBmcm9tIHRoZSByZWdpc3RyeSBhbmQgY3JlYXRlcyBhIHBpZGwKLSAqIGNyZWF0ZXMgbWlzc2luZyByZWcga2V5cyBhbmQgZGlyZWN0b3J5cwotICogCi0gKiBQQVJBTVMKLSAqICAgaHduZE93bmVyIFtJXQotICogICBuRm9sZGVyICAgW0ldIENTSURMX3h4eHh4Ci0gKiAgIHBwaWRsICAgICBbT10gUElETCBvZiBhIHNwZWNpYWwgZm9sZGVyCi0gKgotICogUkVUVVJOUwotICogICAgSFJlc3VsdAotICoKLSAqIEZJWE1FCi0gKiAgIC0gbG9vayBmb3IgIlVzZXIgU2hlbGwgRm9sZGVyIiBmaXJzdAotICoKLSAqLwotSFJFU1VMVCBXSU5BUEkgU0hHZXRTcGVjaWFsRm9sZGVyTG9jYXRpb24oSFdORDMyIGh3bmRPd25lciwgSU5UMzIgbkZvbGRlciwgTFBJVEVNSURMSVNUICogcHBpZGwpCi17CUxQU0hFTExGT0xERVIgc2hlbGxmb2xkZXI7Ci0gIERXT1JEICBwY2hFYXRlbix0cGF0aGxlbj1NQVhfUEFUSCx0eXBlLGR3ZGlzcCxyZXM7Ci0JQ0hBUiAgIHBzelRlbXBbMjU2XSxidWZmZXJbMjU2XSx0cGF0aFtNQVhfUEFUSF0sbnBhdGhbTUFYX1BBVEhdOwotCUxQV1NUUiBscHN6RGlzcGxheU5hbWUgPSAoTFBXU1RSKSZwc3pUZW1wWzBdOwotCUhLRVkJIGtleTsKLQotICBlbnVtIAotCXsJRlRfVU5LTk9XTj0gMHgwMDAwMDAwMCwKLQkgIEZUX0RJUj0gICAgIDB4MDAwMDAwMDEsIAotCSAgRlRfREVTS1RPUD0gMHgwMDAwMDAwMgotCX0gdEZvbGRlcjsgCi0KLSAgVFJBQ0Uoc2hlbGwsIiglMDR4LCVkLCVwKVxuIiwgaHduZE93bmVyLG5Gb2xkZXIscHBpZGwpOwotCi0gIHN0cmNweShidWZmZXIsIlNvZnR3YXJlXFxNaWNyb3NvZnRcXFdpbmRvd3NcXEN1cnJlbnRWZXJzaW9uXFxFeHBsb3JlclxcU2hlbGwgRm9sZGVyc1xcIik7Ci0KLSAgcmVzPVJlZ0NyZWF0ZUtleUV4MzJBKEhLRVlfQ1VSUkVOVF9VU0VSLGJ1ZmZlciwwLE5VTEwsUkVHX09QVElPTl9OT05fVk9MQVRJTEUsS0VZX1dSSVRFLE5VTEwsJmtleSwmZHdkaXNwKTsKLQlpZiAocmVzKQotCXsgRVJSKHNoZWxsLCJDb3VsZCBub3QgY3JlYXRlIGtleSAlcyAlMDhseCBcbiIsYnVmZmVyLHJlcyk7Ci0JICByZXR1cm4gRV9PVVRPRk1FTU9SWTsKLQl9Ci0KLQl0Rm9sZGVyPUZUX0RJUjsJCi0Jc3dpdGNoIChuRm9sZGVyKQotCXsJY2FzZSBDU0lETF9CSVRCVUNLRVQ6Ci0JCQlzdHJjcHkgKGJ1ZmZlciwieHh4Iik7CQkJLypub3QgaW4gdGhlIHJlZ2lzdHJ5Ki8KLQkJCVRSQUNFIChzaGVsbCwibG9va2luZyBmb3IgUmVjeWNsZXJcbiIpOwotCQkJdEZvbGRlcj1GVF9VTktOT1dOOwotICAgICAgYnJlYWs7Ci0JCWNhc2UgQ1NJRExfQ09OVFJPTFM6Ci0JCQlzdHJjcHkgKGJ1ZmZlciwieHh4Iik7CQkJLyp2aXJ0dWFsIGZvbGRlciovCi0gICAgICBUUkFDRSAoc2hlbGwsImxvb2tpbmcgZm9yIENvbnRyb2xcbiIpOwotCQkJdEZvbGRlcj1GVF9VTktOT1dOOwotICAgICAgYnJlYWs7Ci0JCWNhc2UgQ1NJRExfREVTS1RPUDoKLQkJCXN0cmNweSAoYnVmZmVyLCJ4eHgiKTsJCQkvKnZpcnR1YWwgZm9sZGVyKi8KLQkJCVRSQUNFIChzaGVsbCwibG9va2luZyBmb3IgRGVza3RvcFxuIik7Ci0JCQl0Rm9sZGVyPUZUX0RFU0tUT1A7CQkJCi0gICAgICBicmVhazsKLQkJY2FzZSBDU0lETF9ERVNLVE9QRElSRUNUT1JZOgotCQkJc3RyY3B5IChidWZmZXIsIkRlc2t0b3AiKTsKLSAgICAgIGJyZWFrOwotCQljYXNlIENTSURMX0RSSVZFUzoKLQkJCXN0cmNweSAoYnVmZmVyLCJ4eHgiKTsJCQkvKnZpcnR1YWwgZm9sZGVyKi8KLSAgICAgIFRSQUNFIChzaGVsbCwibG9va2luZyBmb3IgRHJpdmVzXG4iKTsKLQkJCXRGb2xkZXI9RlRfVU5LTk9XTjsKLSAgICAgIGJyZWFrOwotCQljYXNlIENTSURMX0ZPTlRTOgotCQkJc3RyY3B5IChidWZmZXIsIkZvbnRzIik7CQkJCi0gICAgICBicmVhazsKLQkJY2FzZSBDU0lETF9ORVRIT09EOgotCQkJc3RyY3B5IChidWZmZXIsIk5ldEhvb2QiKTsJCQkKLSAgICAgIGJyZWFrOwotCQljYXNlIENTSURMX05FVFdPUks6Ci0JCQlzdHJjcHkgKGJ1ZmZlciwieHh4Iik7CQkJCS8qdmlydHVhbCBmb2xkZXIqLwotCQkJVFJBQ0UgKHNoZWxsLCJsb29raW5nIGZvciBOZXR3b3JrXG4iKTsKLQkJCXRGb2xkZXI9RlRfVU5LTk9XTjsKLSAgICAgIGJyZWFrOwotCQljYXNlIENTSURMX1BFUlNPTkFMOgotCQkJc3RyY3B5IChidWZmZXIsIlBlcnNvbmFsIik7CQkJCi0gICAgICBicmVhazsKLQkJY2FzZSBDU0lETF9GQVZPUklURVM6Ci0JCQlzdHJjcHkgKGJ1ZmZlciwiRmF2b3JpdGVzIik7CQkJCi0gICAgICBicmVhazsKLQkJY2FzZSBDU0lETF9QUklOVEVSUzoKLQkJCXN0cmNweSAoYnVmZmVyLCJQcmludEhvb2QiKTsJCQkKLSAgICAgIGJyZWFrOwotCQljYXNlIENTSURMX1BST0dSQU1TOgotCQkJc3RyY3B5IChidWZmZXIsIlByb2dyYW1zIik7CQkJCi0gICAgICBicmVhazsKLQkJY2FzZSBDU0lETF9SRUNFTlQ6Ci0JCQlzdHJjcHkgKGJ1ZmZlciwiUmVjZW50Iik7Ci0gICAgICBicmVhazsKLQkJY2FzZSBDU0lETF9TRU5EVE86Ci0JCQlzdHJjcHkgKGJ1ZmZlciwiU2VuZFRvIik7Ci0gCQkgIGJyZWFrOwotCQljYXNlIENTSURMX1NUQVJUTUVOVToKLQkJCXN0cmNweSAoYnVmZmVyLCJTdGFydCBNZW51Iik7Ci0gICAgICBicmVhazsKLQkJY2FzZSBDU0lETF9TVEFSVFVQOgotCQkJc3RyY3B5IChidWZmZXIsIlN0YXJ0dXAiKTsJCQkKLSAgICAgIGJyZWFrOwotCQljYXNlIENTSURMX1RFTVBMQVRFUzoKLQkJCXN0cmNweSAoYnVmZmVyLCJUZW1wbGF0ZXMiKTsJCQkKLSAgICAgIGJyZWFrOwotCQlkZWZhdWx0OgotICAgICAgRVJSIChzaGVsbCwidW5rbm93biBDU0lETFxuIik7Ci0JCQl0Rm9sZGVyPUZUX1VOS05PV047CQkJCi0gICAgICBicmVhazsKLQl9Ci0KLSAgVFJBQ0Uoc2hlbGwsIktleT0lc1xuIixidWZmZXIpOwotCi0gIHR5cGU9UkVHX1NaOwotCi0gIHN3aXRjaCAodEZvbGRlcikKLQl7IGNhc2UgRlRfRElSOgotCSAgICAvKiBEaXJlY3Rvcnk6IGdldCB0aGUgdmFsdWUgZnJvbSB0aGUgcmVnaXN0cnksIGlmIGl0cyBub3QgdGhlcmUgCi0JCQljcmVhdGUgaXQgYW5kIHRoZSBkaXJlY3RvcnkqLwotICAgIAlpZiAoUmVnUXVlcnlWYWx1ZUV4MzJBKGtleSxidWZmZXIsTlVMTCwmdHlwZSx0cGF0aCwmdHBhdGhsZW4pKQotICAJICB7IEdldFdpbmRvd3NEaXJlY3RvcnkzMkEobnBhdGgsTUFYX1BBVEgpOwotCSAgICAgIFBhdGhBZGRCYWNrc2xhc2gobnBhdGgpOwotICAJCQlzd2l0Y2ggKG5Gb2xkZXIpCi0gIAkJCXsJY2FzZSBDU0lETF9ERVNLVE9QRElSRUNUT1JZOgotICAgICAgCQkJc3RyY2F0IChucGF0aCwiRGVza3RvcCIpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAJCWNhc2UgQ1NJRExfRk9OVFM6Ci0gICAgICAJCQlzdHJjYXQgKG5wYXRoLCJGb250cyIpOwkJCQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAJCWNhc2UgQ1NJRExfTkVUSE9PRDoKLSAgICAgIAkJCXN0cmNhdCAobnBhdGgsIk5ldEhvb2QiKTsJCQkKLSAgICAgICAgICAgIGJyZWFrOwotICAJCSAgICBjYXNlIENTSURMX1BFUlNPTkFMOgotICAgICAgCQkJc3RyY3B5IChucGF0aCwiQzpcXFBlcnNvbmFsIik7CQkJCi0gICAgICAgICAgICBicmVhazsKLSAgICAgIAkJY2FzZSBDU0lETF9GQVZPUklURVM6Ci0gICAgICAJCQlzdHJjYXQgKG5wYXRoLCJGYXZvcml0ZXMiKTsJCQkKLSAgICAgICAgICAgIGJyZWFrOwotICAJCSAgICBjYXNlIENTSURMX1BSSU5URVJTOgotICAgICAgCQkJc3RyY2F0IChucGF0aCwiUHJpbnRIb29kIik7CQkJCi0gICAgICAgICAgICBicmVhazsKLSAgICAgIAkJY2FzZSBDU0lETF9QUk9HUkFNUzoKLSAgICAgIAkJCXN0cmNhdCAobnBhdGgsIlN0YXJ0IE1lbnUiKTsJCQkKLSAgCQkJCQlDcmVhdGVEaXJlY3RvcnkzMkEobnBhdGgsTlVMTCk7Ci0gICAgICAJCQlzdHJjYXQgKG5wYXRoLCJcXFByb2dyYW1zIik7CQkJCi0gICAgICAgICAgICBicmVhazsKLSAgICAgIAkJY2FzZSBDU0lETF9SRUNFTlQ6Ci0gICAgICAJCQlzdHJjYXQgKG5wYXRoLCJSZWNlbnQiKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgCQljYXNlIENTSURMX1NFTkRUTzoKLSAgICAgIAkJCXN0cmNhdCAobnBhdGgsIlNlbmRUbyIpOwotICAgICAgCQkJYnJlYWs7Ci0gICAgICAJCWNhc2UgQ1NJRExfU1RBUlRNRU5VOgotICAgICAgCQkJc3RyY2F0IChucGF0aCwiU3RhcnQgTWVudSIpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAJCWNhc2UgQ1NJRExfU1RBUlRVUDoKLSAgICAgIAkJCXN0cmNhdCAobnBhdGgsIlN0YXJ0IE1lbnUiKTsJCQkKLSAgCQkJCQlDcmVhdGVEaXJlY3RvcnkzMkEobnBhdGgsTlVMTCk7Ci0gICAgICAJCQlzdHJjYXQgKG5wYXRoLCJcXFN0YXJ0dXAiKTsJCQkKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgCQljYXNlIENTSURMX1RFTVBMQVRFUzoKLSAgICAgIAkJCXN0cmNhdCAobnBhdGgsIlRlbXBsYXRlcyIpOwkJCQotICAgICAgICAgICAgYnJlYWs7Ci0gIAkJCQlkZWZhdWx0OgotICAgICAgICAgCSAgUmVnQ2xvc2VLZXkoa2V5KTsKLSAgICAgICAgCSAgcmV0dXJuIEVfT1VUT0ZNRU1PUlk7Ci0gIAkJCX0KLSAgICAJCWlmIChSZWdTZXRWYWx1ZUV4MzJBKGtleSxidWZmZXIsMCxSRUdfU1osbnBhdGgsc2l6ZW9mKG5wYXRoKSsxKSkKLSAgICAgICAgewlFUlIoc2hlbGwsImNvdWxkIG5vdCBjcmVhdGUgdmFsdWUgJXNcbiIsYnVmZmVyKTsKLSAgICAgIAkgIFJlZ0Nsb3NlS2V5KGtleSk7Ci0gICAgICAJICByZXR1cm4gRV9PVVRPRk1FTU9SWTsKLSAgICAJCX0KLSAgICAJCVRSQUNFKHNoZWxsLCJ2YWx1ZSAlcz0lcyBjcmVhdGVkXG4iLGJ1ZmZlcixucGF0aCk7Ci0gICAgCSAgQ3JlYXRlRGlyZWN0b3J5MzJBKG5wYXRoLE5VTEwpOwotICAgICAgfQotCQkJYnJlYWs7Ci0JCWNhc2UgRlRfREVTS1RPUDoKLQkJCXN0cmNweSAodHBhdGgsIkRlc2t0b3AiKTsJCQkKLQkJICBicmVhazsKLQkgIGRlZmF1bHQ6Ci0gICAgICBSZWdDbG9zZUtleShrZXkpOwotICAgICAgcmV0dXJuIEVfT1VUT0ZNRU1PUlk7Ci0JCSAgYnJlYWs7Ci0gIH0KLQotCVJlZ0Nsb3NlS2V5KGtleSk7Ci0KLSAgVFJBQ0Uoc2hlbGwsIlZhbHVlPSVzXG4iLHRwYXRoKTsKLSAgTG9jYWxUb1dpZGVDaGFyMzIobHBzekRpc3BsYXlOYW1lLCB0cGF0aCwgMjU2KTsKLSAgCi0JaWYgKFNIR2V0RGVza3RvcEZvbGRlcigmc2hlbGxmb2xkZXIpPT1TX09LKQotCXsgc2hlbGxmb2xkZXItPmxwdnRibC0+Zm5QYXJzZURpc3BsYXlOYW1lKHNoZWxsZm9sZGVyLGh3bmRPd25lciwgTlVMTCxscHN6RGlzcGxheU5hbWUsJnBjaEVhdGVuLHBwaWRsLE5VTEwpOwotCSAgc2hlbGxmb2xkZXItPmxwdnRibC0+Zm5SZWxlYXNlKHNoZWxsZm9sZGVyKTsKLQl9Ci0KLQlUUkFDRShzaGVsbCwgIi0tIChuZXcgcGlkbCAlcClcbiIsKnBwaWRsKTsKLQlyZXR1cm4gTk9FUlJPUjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFNIR2V0UGF0aEZyb21JRExpc3QzMkEgICAgICAgIFtTSEVMTDMyLjI2MV1bTlQgNC4wOiBTSEVMTDMyLjIyMF0KLSAqCi0gKiBQQVJBTUVURVJTCi0gKiAgcGlkbCwgICBbSU5dIHBpZGwgCi0gKiAgcHN6UGF0aCBbT1VUXSBwYXRoCi0gKgotICogUkVUVVJOUyAKLSAqICBwYXRoIGZyb20gYSBwYXNzZWQgUElETC4KLSAqCi0gKiBOT1RFUwotICogICAgIGV4cG9ydGVkIGJ5IG5hbWUKLSAqCi0gKiBGSVhNRQotICogIGZuR2V0RGlzcGxheU5hbWVPZiBjYW4gcmV0dXJuIGRpZmZlcmVudCB0eXBlcyBvZiBPTEVTdHJpbmcKLSAqLwotRFdPUkQgV0lOQVBJIFNIR2V0UGF0aEZyb21JRExpc3QzMkEgKExQQ0lURU1JRExJU1QgcGlkbCxMUFNUUiBwc3pQYXRoKQotewlTVFJSRVQgbHBOYW1lOwotCUxQU0hFTExGT0xERVIgc2hlbGxmb2xkZXI7Ci0gIENIQVIgIGJ1ZmZlcltNQVhfUEFUSF0sdHBhdGhbTUFYX1BBVEhdOwotICBEV09SRCB0eXBlLHRwYXRobGVuPU1BWF9QQVRILGR3ZGlzcDsKLSAgSEtFWSAga2V5OwotCi0JVFJBQ0Uoc2hlbGwsIihwaWRsPSVwLCVwKVxuIixwaWRsLHBzelBhdGgpOwotCi0gIGlmICghcGlkbCkKLSAgeyAgc3RyY3B5KGJ1ZmZlciwiU29mdHdhcmVcXE1pY3Jvc29mdFxcV2luZG93c1xcQ3VycmVudFZlcnNpb25cXEV4cGxvcmVyXFxTaGVsbCBGb2xkZXJzXFwiKTsKLQotICAgICBpZiAoUmVnQ3JlYXRlS2V5RXgzMkEoSEtFWV9DVVJSRU5UX1VTRVIsYnVmZmVyLDAsTlVMTCxSRUdfT1BUSU9OX05PTl9WT0xBVElMRSxLRVlfV1JJVEUsTlVMTCwma2V5LCZkd2Rpc3ApKQotICAgICB7IHJldHVybiBFX09VVE9GTUVNT1JZOwotICAgICB9Ci0gICAgIHR5cGU9UkVHX1NaOyAgICAKLSAgICAgc3RyY3B5IChidWZmZXIsIkRlc2t0b3AiKTsJCQkJCS8qcmVnaXN0cnkgbmFtZSovCi0gICAgIGlmICggUmVnUXVlcnlWYWx1ZUV4MzJBKGtleSxidWZmZXIsTlVMTCwmdHlwZSx0cGF0aCwmdHBhdGhsZW4pKQotICAgICB7IEdldFdpbmRvd3NEaXJlY3RvcnkzMkEodHBhdGgsTUFYX1BBVEgpOwotICAgICAgIFBhdGhBZGRCYWNrc2xhc2godHBhdGgpOwotICAgICAgIHN0cmNhdCAodHBhdGgsIkRlc2t0b3AiKTsJCQkJLypmb2xkZXIgbmFtZSovCi0gICAgICAgUmVnU2V0VmFsdWVFeDMyQShrZXksYnVmZmVyLDAsUkVHX1NaLHRwYXRoLHRwYXRobGVuKTsKLSAgICAgICBDcmVhdGVEaXJlY3RvcnkzMkEodHBhdGgsTlVMTCk7Ci0gICAgIH0KLSAgICAgUmVnQ2xvc2VLZXkoa2V5KTsKLSAgICAgc3RyY3B5KHBzelBhdGgsdHBhdGgpOwotICB9Ci0gIGVsc2UKLSAgeyBpZiAoU0hHZXREZXNrdG9wRm9sZGVyKCZzaGVsbGZvbGRlcik9PVNfT0spCi0JeyBzaGVsbGZvbGRlci0+bHB2dGJsLT5mbkdldERpc3BsYXlOYW1lT2Yoc2hlbGxmb2xkZXIscGlkbCxTSEdETl9GT1JQQVJTSU5HLCZscE5hbWUpOwotCSAgc2hlbGxmb2xkZXItPmxwdnRibC0+Zm5SZWxlYXNlKHNoZWxsZm9sZGVyKTsKLQl9Ci0gIC8qV2lkZUNoYXJUb0xvY2FsMzIocHN6UGF0aCwgbHBOYW1lLnUucE9sZVN0ciwgTUFYX1BBVEgpOyovCi0Jc3RyY3B5KHBzelBhdGgsbHBOYW1lLnUuY1N0cik7Ci0JLyogZml4bWUgZnJlZSB0aGUgb2xlc3RyaW5nKi8KLSAgfQotCVRSQUNFKHNoZWxsLCItLSAoJXMpXG4iLHBzelBhdGgpOwotCXJldHVybiBOT0VSUk9SOwotfQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFNIR2V0UGF0aEZyb21JRExpc3QzMlcgW1NIRUxMMzIuMjYyXQotICovCi1EV09SRCBXSU5BUEkgU0hHZXRQYXRoRnJvbUlETGlzdDMyVyAoTFBDSVRFTUlETElTVCBwaWRsLExQV1NUUiBwc3pQYXRoKQoteyBGSVhNRSAoc2hlbGwsIihwaWRsPSVwICVzKTpzdHViLlxuIiwgcGlkbCwgZGVidWdzdHJfdyhwc3pQYXRoKSk7Ci0gIHJldHVybiAwOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoJCQkgU0hHZXRQYXRoRnJvbUlETGlzdAkJW1NIRUxMMzIuMjIxXVtOVCA0LjA6IFNIRUxMMzIuMjE5XQotICovCi1CT09MMzIgV0lOQVBJIFNIR2V0UGF0aEZyb21JRExpc3QzMihMUENJVEVNSURMSVNUIHBpZGwsTFBTVFIgcHN6UGF0aCkgICAgIAoteyBUUkFDRShzaGVsbCwiKHBpZGw9JXAsJXApXG4iLHBpZGwscHN6UGF0aCk7Ci0gIHJldHVybiBTSEdldFBhdGhGcm9tSURMaXN0MzJBKHBpZGwscHN6UGF0aCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBTSEhlbHBTaG9ydGN1dHNfUnVuRExMIFtTSEVMTDMyLjIyNF0KLSAqCi0gKi8KLURXT1JEIFdJTkFQSSBTSEhlbHBTaG9ydGN1dHNfUnVuRExMIChEV09SRCBkd0FyZzEsIERXT1JEIGR3QXJnMiwgRFdPUkQgZHdBcmczLCBEV09SRCBkd0FyZzQpCi17IEZJWE1FIChleGVjLCAiKCVseCwgJWx4LCAlbHgsICVseCkgZW1wdHkgc3R1YiFcbiIsCi0JZHdBcmcxLCBkd0FyZzIsIGR3QXJnMywgZHdBcmc0KTsKLQotICByZXR1cm4gMDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFNITG9hZEluUHJvYyBbU0hFTEwzMi4yMjVdCi0gKgotICovCi0KLURXT1JEIFdJTkFQSSBTSExvYWRJblByb2MgKERXT1JEIGR3QXJnMSkKLXsgRklYTUUgKHNoZWxsLCAiKCVseCkgZW1wdHkgc3R1YiFcbiIsIGR3QXJnMSk7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBTSEJyb3dzZUZvckZvbGRlckEgW1NIRUxMMzIuMjA5XQotICoKLSAqLwotTFBJVEVNSURMSVNUIFdJTkFQSSBTSEJyb3dzZUZvckZvbGRlcjMyQSAoTFBCUk9XU0VJTkZPMzJBIGxwYmkpCi17IEZJWE1FIChzaGVsbCwgIiglbHgsJXMpIGVtcHR5IHN0dWIhXG4iLCAoRFdPUkQpbHBiaSwgbHBiaS0+bHBzelRpdGxlKTsKLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBTSEVMTDMyIExpYk1haW4KLSAqCi0gKiBGSVhNRQotICogIGF0IHRoZSBtb21lbnQgdGhlIGljb25zIGFyZSBleHRyYWN0ZWQgZnJvbSBzaGVsbDMyLmRsbAotICovCi1ISU5TVEFOQ0UzMiBzaGVsbDMyX2hJbnN0YW5jZTsgCi0KLUJPT0wzMiBXSU5BUEkgU2hlbGwzMkxpYk1haW4oSElOU1RBTkNFMzIgaGluc3RETEwsIERXT1JEIGZkd1JlYXNvbiwgTFBWT0lEIGxwdlJlc2VydmVkKQoteyBISUNPTjMyIGh0bXBJY29uOwotICBVSU5UMzIgaWljb25pbmRleDsKLSAgVUlOVDMyIGluZGV4OwotICBDSEFSICAgc3pTaGVsbFBhdGhbTUFYX1BBVEhdOwotICAKLSAgVFJBQ0Uoc2hlbGwsIjB4JXggMHglbHggJXBcbiIsIGhpbnN0RExMLCBmZHdSZWFzb24sIGxwdlJlc2VydmVkKTsKLQotICBzaGVsbDMyX2hJbnN0YW5jZSA9IGhpbnN0RExMOwotICAKLSAgR2V0V2luZG93c0RpcmVjdG9yeTMyQShzelNoZWxsUGF0aCxNQVhfUEFUSCk7Ci0gIFBhdGhBZGRCYWNrc2xhc2goc3pTaGVsbFBhdGgpOwotICBzdHJjYXQoc3pTaGVsbFBhdGgsInN5c3RlbVxcc2hlbGwzMi5kbGwiKTsKLSAgICAgICAKLSAgaWYgKGZkd1JlYXNvbj09RExMX1BST0NFU1NfQVRUQUNIKQotICB7IGlmICggISBTaGVsbFNtYWxsSWNvbkxpc3QgKQotICAgIHsgaWYgKCAoU2hlbGxTbWFsbEljb25MaXN0ID0gSW1hZ2VMaXN0X0NyZWF0ZSgxNiwxNixJTENfQ09MT1IsNjQsMTYpKSApCi0gICAgICB7IGZvciAoaW5kZXg9MDtpbmRleCA8IDQwOyBpbmRleCsrKQotICAgICAgICB7IGlmICggKCBodG1wSWNvbiA9IEV4dHJhY3RJY29uMzJBKGhpbnN0RExMLCBzelNoZWxsUGF0aCwgaW5kZXgpKSApCi0gICAgICAgICAgeyBpaWNvbmluZGV4ID0gSW1hZ2VMaXN0X0FkZEljb24gKFNoZWxsU21hbGxJY29uTGlzdCwgaHRtcEljb24pOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgeyBFUlIoc2hlbGwsImNvdWxkIG5vdCBpbml0aWFsaXplIGljb25saXN0IChpcyBzaGVsbDMyLmRsbCBpbiB0aGUgc3lzdGVtIGRpcmVjdG9yeT8pXG4iKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICBpZiAoICEgU2hlbGxCaWdJY29uTGlzdCApCi0gICAgeyBpZiAoIChTaGVsbEJpZ0ljb25MaXN0ID0gSW1hZ2VMaXN0X0NyZWF0ZSgzMiwzMixJTENfQ09MT1IsNjQsMTYpKSApCi0gICAgICB7IGZvciAoaW5kZXg9MDtpbmRleCA8IDQwOyBpbmRleCsrKQotICAgICAgICB7IGlmICggKGh0bXBJY29uID0gRXh0cmFjdEljb24zMkEoIGhpbnN0RExMLCBzelNoZWxsUGF0aCwgaW5kZXgpKSApCi0gICAgICAgICAgeyBpaWNvbmluZGV4ID0gSW1hZ2VMaXN0X0FkZEljb24gKFNoZWxsQmlnSWNvbkxpc3QsIGh0bXBJY29uKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgIHsgRVJSKHNoZWxsLCJjb3VsZCBub3QgaW5pdGlhbGl6ZSBpY29ubGlzdCAoaXMgc2hlbGwzMi5kbGwgaW4gdGhlIHN5c3RlbSBkaXJlY3Rvcnk/KVxuIik7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgcmV0dXJuIFRSVUU7Ci19CmRpZmYgLS1naXQgYS9tc2Rvcy9kb3NtZW0uYyBiL21zZG9zL2Rvc21lbS5jCmluZGV4IGQwYmZkZGQuLjFhZmZiMGEgMTAwNjQ0Ci0tLSBhL21zZG9zL2Rvc21lbS5jCisrKyBiL21zZG9zL2Rvc21lbS5jCkBAIC0xNSw3ICsxNSw2IEBACiAjaW5jbHVkZSAibWlzY2VtdS5oIgogI2luY2x1ZGUgIm1vZHVsZS5oIgogI2luY2x1ZGUgInRhc2suaCIKLSNpbmNsdWRlICJkb3NleGUuaCIKICNpbmNsdWRlICJkZWJ1Zy5oIgogCiBIQU5ETEUxNiBET1NNRU1fQmlvc1NlZzsgIC8qIEJJT1MgZGF0YSBzZWdtZW50IGF0IDB4NDA6MCAqLwpAQCAtMTEyLDEzICsxMTEsMTQgQEAKICAqCiAgKiBHZXRzIHRoZSBET1MgbWVtb3J5IGJhc2UuCiAgKi8KLXN0YXRpYyBjaGFyICpET1NNRU1fTWVtb3J5QmFzZShITU9EVUxFMTYgaE1vZHVsZSkKK2NoYXIgKkRPU01FTV9NZW1vcnlCYXNlKEhNT0RVTEUxNiBoTW9kdWxlKQogewogICAgIFREQiAqcFRhc2sgPSBoTW9kdWxlID8gTlVMTCA6IChUREIgKilHbG9iYWxMb2NrMTYoIEdldEN1cnJlbnRUYXNrKCkgKTsKICAgICBORV9NT0RVTEUgKnBNb2R1bGUgPSAoaE1vZHVsZSB8fCBwVGFzaykgPyBORV9HZXRQdHIoIGhNb2R1bGUgPyBoTW9kdWxlIDogcFRhc2stPmhNb2R1bGUgKSA6IE5VTEw7CiAKLSAgICBpZiAocE1vZHVsZSAmJiBwTW9kdWxlLT5scERvc1Rhc2spCi0gICAgICAgIHJldHVybiBwTW9kdWxlLT5scERvc1Rhc2stPmltZzsKKyAgICBHbG9iYWxVbmxvY2sxNiggR2V0Q3VycmVudFRhc2soKSApOworICAgIGlmIChwTW9kdWxlICYmIHBNb2R1bGUtPmRvc19pbWFnZSkKKyAgICAgICAgcmV0dXJuIHBNb2R1bGUtPmRvc19pbWFnZTsKICAgICBlbHNlCiAgICAgICAgIHJldHVybiBET1NNRU1fZG9zbWVtOwogfQpAQCAtNDMxLDcgKzQzMSw2IEBACiBVSU5UMzIgRE9TTUVNX0F2YWlsYWJsZShITU9EVUxFMTYgaE1vZHVsZSkKIHsKICAgIFVJTlQzMiAgCSBibG9ja3NpemUsIGF2YWlsYWJsZSA9IDA7Ci0gICBjaGFyICAgICAgICAgKmJsb2NrID0gTlVMTDsKICAgIGRvc21lbV9lbnRyeSAqZG07CiAgICAKICAgIGRtID0gcm9vdF9ibG9jazsKZGlmZiAtLWdpdCBhL21zZG9zL2ludDIwLmMgYi9tc2Rvcy9pbnQyMC5jCmluZGV4IGU1MzgxM2EuLmY2YmU3YWQgMTAwNjQ0Ci0tLSBhL21zZG9zL2ludDIwLmMKKysrIGIvbXNkb3MvaW50MjAuYwpAQCAtMTUsNSArMTUsNSBAQAogICovCiB2b2lkIFdJTkFQSSBJTlRfSW50MjBIYW5kbGVyKCBDT05URVhUICpjb250ZXh0ICkKIHsKLSAgICAgICAgVEFTS19LaWxsQ3VycmVudFRhc2soIDAgKTsKKyAgICAgICAgRXhpdFByb2Nlc3MoIDAgKTsKIH0KZGlmZiAtLWdpdCBhL21zZG9zL2ludDIxLmMgYi9tc2Rvcy9pbnQyMS5jCmluZGV4IDZiYjY1MGUuLmE0ZTk1ZjEgMTAwNjQ0Ci0tLSBhL21zZG9zL2ludDIxLmMKKysrIGIvbXNkb3MvaW50MjEuYwpAQCAtMzIsMTQgKzMyLDYgQEAKICNlbmRpZgogCiAKLSNkZWZpbmUgRE9TX1RPX0hBTkRMRShoYW5kbGUpICgoKGhhbmRsZSk9PTApID8gR2V0U3RkSGFuZGxlKFNURF9JTlBVVF9IQU5ETEUpIDogXAotCQkJICAgICAgKChoYW5kbGUpPT0xKSA/IEdldFN0ZEhhbmRsZShTVERfT1VUUFVUX0hBTkRMRSkgOiBcCi0JCQkgICAgICAoKGhhbmRsZSk9PTIpID8gR2V0U3RkSGFuZGxlKFNURF9FUlJPUl9IQU5ETEUpIDogXAotCQkJICAgICAgIChoYW5kbGUpLTUpCi0jZGVmaW5lIEhBTkRMRV9UT19ET1MoaGFuZGxlKSAoeyBXT1JEIGhuZD1oYW5kbGU7IFwKLQkJCSAgICAgICgoaG5kPT1IRklMRV9FUlJPUjE2KSA/IEhGSUxFX0VSUk9SMTYgOiBcCi0JCQkgICAgICAgIGhuZCs1KTsgfSkKLQogI2RlZmluZSBET1NfR0VUX0RSSVZFKHJlZykgKChyZWcpID8gKHJlZykgLSAxIDogRFJJVkVfR2V0Q3VycmVudERyaXZlKCkpCiAKIC8qIERlZmluZSB0aGUgZHJpdmUgcGFyYW1ldGVyIGJsb2NrLCBhcyB1c2VkIGJ5IGludDIxLzFGCkBAIC0yMjgsNyArMjIwLDcgQEAKICAgICBSRVNFVF9DRkxBRyhjb250ZXh0KTsKIAogICAgIC8qIERPUyBkZXZpY2UgPyAqLwotICAgIGlmICgoZmlsZSA9IEZJTEVfR2V0RmlsZSggRE9TX1RPX0hBTkRMRShCWF9yZWcoY29udGV4dCkpICkpKQorICAgIGlmICgoZmlsZSA9IEZJTEVfR2V0RmlsZSggSEZJTEUxNl9UT19IRklMRTMyKEJYX3JlZyhjb250ZXh0KSkgKSkpCiAgICAgewogICAgICAgICBjb25zdCBET1NfREVWSUNFICpkZXYgPSBET1NGU19HZXREZXZpY2UoIGZpbGUtPnVuaXhfbmFtZSApOwogICAgICAgICBGSUxFX1JlbGVhc2VGaWxlKCBmaWxlICk7CkBAIC0zNjQsMTYgKzM1NiwxNiBAQAogfQogc3RhdGljIEJPT0wzMiBJTlQyMV9DcmVhdGVGaWxlKCBDT05URVhUICpjb250ZXh0ICkKIHsKLSAgICBBWF9yZWcoY29udGV4dCkgPSBIQU5ETEVfVE9fRE9TKF9sY3JlYXQxNiggQ1RYX1NFR19PRkZfVE9fTElOKGNvbnRleHQsICBEU19yZWcoY29udGV4dCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEWF9yZWcoY29udGV4dCkgKSwgQ1hfcmVnKGNvbnRleHQpICkpOworICAgIEFYX3JlZyhjb250ZXh0KSA9IF9sY3JlYXQxNiggQ1RYX1NFR19PRkZfVE9fTElOKGNvbnRleHQsIERTX3JlZyhjb250ZXh0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERYX3JlZyhjb250ZXh0KSApLCBDWF9yZWcoY29udGV4dCkgKTsKICAgICByZXR1cm4gKEFYX3JlZyhjb250ZXh0KSA9PSAoV09SRClIRklMRV9FUlJPUjE2KTsKIH0KIAogCiBzdGF0aWMgdm9pZCBPcGVuRXhpc3RpbmdGaWxlKCBDT05URVhUICpjb250ZXh0ICkKIHsKLSAgICBBWF9yZWcoY29udGV4dCkgPSBIQU5ETEVfVE9fRE9TKF9sb3BlbjE2KCBDVFhfU0VHX09GRl9UT19MSU4oY29udGV4dCwgRFNfcmVnKGNvbnRleHQpLERYX3JlZyhjb250ZXh0KSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTF9yZWcoY29udGV4dCkgKSk7CisgICAgQVhfcmVnKGNvbnRleHQpID0gX2xvcGVuMTYoIENUWF9TRUdfT0ZGX1RPX0xJTihjb250ZXh0LCBEU19yZWcoY29udGV4dCksRFhfcmVnKGNvbnRleHQpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTF9yZWcoY29udGV4dCkgKTsKICAgICBpZiAoQVhfcmVnKGNvbnRleHQpID09IChXT1JEKUhGSUxFX0VSUk9SMTYpCiAgICAgewogICAgICAgICBBWF9yZWcoY29udGV4dCkgPSBET1NfRXh0ZW5kZWRFcnJvcjsKQEAgLTQ0Miw3ICs0MzQsNyBAQAogICAgICAgICB9CiAKIAlFcnJvciAoMCwwLDApOwotCUFYX3JlZyhjb250ZXh0KSA9IEhBTkRMRV9UT19ET1MoaGFuZGxlKTsKKwlBWF9yZWcoY29udGV4dCkgPSBoYW5kbGU7CiAJUkVTRVRfQ0ZMQUcoY29udGV4dCk7CiAgICAgfQogI2VuZGlmCkBAIC00NTAsNyArNDQyLDcgQEAKIAogc3RhdGljIHZvaWQgQ2xvc2VGaWxlKCBDT05URVhUICpjb250ZXh0ICkKIHsKLSAgICBpZiAoKEFYX3JlZyhjb250ZXh0KSA9IF9sY2xvc2UxNiggRE9TX1RPX0hBTkRMRShCWF9yZWcoY29udGV4dCkpICkpICE9IDApCisgICAgaWYgKChBWF9yZWcoY29udGV4dCkgPSBfbGNsb3NlMTYoIEJYX3JlZyhjb250ZXh0KSApKSAhPSAwKQogICAgIHsKICAgICAgICAgQVhfcmVnKGNvbnRleHQpID0gRE9TX0V4dGVuZGVkRXJyb3I7CiAgICAgICAgIFNFVF9DRkxBRyhjb250ZXh0KTsKQEAgLTY2Niw3ICs2NTgsNyBAQAogICAgICAgICBzcHJpbnRmKCBwLCAid2luZSUwNHguJTAzZCIsIChpbnQpZ2V0cGlkKCksIGNvdW50ZXIgKTsKICAgICAgICAgY291bnRlciA9IChjb3VudGVyICsgMSkgJSAxMDAwOwogCi0gICAgICAgIGlmICgoQVhfcmVnKGNvbnRleHQpID0gSEFORExFX1RPX0RPUyhfbGNyZWF0X3VuaXEoIG5hbWUsIDAgKSkpICE9IChXT1JEKUhGSUxFX0VSUk9SMTYpCisgICAgICAgIGlmICgoQVhfcmVnKGNvbnRleHQpID0gSEZJTEUzMl9UT19IRklMRTE2KF9sY3JlYXRfdW5pcSggbmFtZSwgMCApKSkgIT0gKFdPUkQpSEZJTEVfRVJST1IxNikKICAgICAgICAgewogICAgICAgICAgICAgVFJBQ0UoaW50MjEsICJjcmVhdGVkICVzXG4iLCBuYW1lICk7CiAgICAgICAgICAgICByZXR1cm4gVFJVRTsKQEAgLTg0NCw3ICs4MzYsNyBAQAogCQlCWF9yZWcoY29udGV4dCksCiAJCU1BS0VMT05HKERYX3JlZyhjb250ZXh0KSxDWF9yZWcoY29udGV4dCkpLAogCQlNQUtFTE9ORyhESV9yZWcoY29udGV4dCksU0lfcmVnKGNvbnRleHQpKSkgOwotCSAgaWYgKCFMb2NrRmlsZShET1NfVE9fSEFORExFKEJYX3JlZyhjb250ZXh0KSksCisgICAgICAgICAgaWYgKCFMb2NrRmlsZShIRklMRTE2X1RPX0hGSUxFMzIoQlhfcmVnKGNvbnRleHQpKSwKICAgICAgICAgICAgICAgICAgICAgICAgIE1BS0VMT05HKERYX3JlZyhjb250ZXh0KSxDWF9yZWcoY29udGV4dCkpLCAwLAogICAgICAgICAgICAgICAgICAgICAgICAgTUFLRUxPTkcoRElfcmVnKGNvbnRleHQpLFNJX3JlZyhjb250ZXh0KSksIDApKSB7CiAJICAgIEFYX3JlZyhjb250ZXh0KSA9IERPU19FeHRlbmRlZEVycm9yOwpAQCAtODU3LDcgKzg0OSw3IEBACiAJCUJYX3JlZyhjb250ZXh0KSwKIAkJTUFLRUxPTkcoRFhfcmVnKGNvbnRleHQpLENYX3JlZyhjb250ZXh0KSksCiAJCU1BS0VMT05HKERJX3JlZyhjb250ZXh0KSxTSV9yZWcoY29udGV4dCkpKSA7Ci0JICBpZiAoIVVubG9ja0ZpbGUoRE9TX1RPX0hBTkRMRShCWF9yZWcoY29udGV4dCkpLAorICAgICAgICAgIGlmICghVW5sb2NrRmlsZShIRklMRTE2X1RPX0hGSUxFMzIoQlhfcmVnKGNvbnRleHQpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgTUFLRUxPTkcoRFhfcmVnKGNvbnRleHQpLENYX3JlZyhjb250ZXh0KSksIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIE1BS0VMT05HKERJX3JlZyhjb250ZXh0KSxTSV9yZWcoY29udGV4dCkpLCAwKSkgewogCSAgICBBWF9yZWcoY29udGV4dCkgPSBET1NfRXh0ZW5kZWRFcnJvcjsKQEAgLTkwMiw2ICs4OTQsMjAgQEAKICAgICAgfQogfQogCitzdGF0aWMgV09SRCBJTlQyMV9HZXRDdXJyZW50UFNQKCkKK3sKKyNpZmRlZiBNWl9TVVBQT1JURUQKKyAgICBUREIgKnBUYXNrID0gaE1vZHVsZSA/IE5VTEwgOiAoVERCICopR2xvYmFsTG9jazE2KCBHZXRDdXJyZW50VGFzaygpICk7CisgICAgTkVfTU9EVUxFICpwTW9kdWxlID0gKGhNb2R1bGUgfHwgcFRhc2spID8gTkVfR2V0UHRyKCBoTW9kdWxlID8gaE1vZHVsZSA6IHBUYXNrLT5oTW9kdWxlICkgOiBOVUxMOworICAgICAgICAKKyAgICBHbG9iYWxVbmxvY2sxNiggR2V0Q3VycmVudFRhc2soKSApOworICAgIGlmIChwTW9kdWxlLT5scERvc1Rhc2spCisgICAgICAgIHJldHVybiBwTW9kdWxlLT5scERvc1Rhc2stPnBzcF9zZWc7CisgICAgZWxzZQorI2VuZGlmCisgICAgICAgIHJldHVybiBHZXRDdXJyZW50UERCKCk7Cit9CisKIAogU0VHUFRSIElOVDIxX0dldExpc3RPZkxpc3RzKCkKIHsKQEAgLTEwMDEsMTYgKzEwMDcsMTMgQEAKICAgICB7CiAgICAgY2FzZSAweDAwOiAvKiBURVJNSU5BVEUgUFJPR1JBTSAqLwogICAgICAgICBUUkFDRShpbnQyMSwiVEVSTUlOQVRFIFBST0dSQU1cbiIpOwotICAgICAgICBUQVNLX0tpbGxDdXJyZW50VGFzayggMCApOworICAgICAgICBFeGl0UHJvY2VzcyggMCApOwogICAgICAgICBicmVhazsKIAogICAgIGNhc2UgMHgwMTogLyogUkVBRCBDSEFSQUNURVIgRlJPTSBTVEFOREFSRCBJTlBVVCwgV0lUSCBFQ0hPICovCi0gICAgY2FzZSAweDAyOiAvKiBXUklURSBDSEFSQUNURVIgVE8gU1RBTkRBUkQgT1VUUFVUICovCiAgICAgY2FzZSAweDAzOiAvKiBSRUFEIENIQVJBQ1RFUiBGUk9NIFNUREFVWCAgKi8KICAgICBjYXNlIDB4MDQ6IC8qIFdSSVRFIENIQVJBQ1RFUiBUTyBTVERBVVggKi8KICAgICBjYXNlIDB4MDU6IC8qIFdSSVRFIENIQVJBQ1RFUiBUTyBQUklOVEVSICovCi0gICAgY2FzZSAweDA2OiAvKiBESVJFQ1QgQ09OU09MRSBJTi9PVVRQVVQgKi8KLSAgICBjYXNlIDB4MGE6IC8qIEJVRkZFUkVEIElOUFVUICovCiAgICAgY2FzZSAweDBiOiAvKiBHRVQgU1RESU4gU1RBVFVTICovCiAgICAgY2FzZSAweDBmOiAvKiBPUEVOIEZJTEUgVVNJTkcgRkNCICovCiAgICAgY2FzZSAweDEwOiAvKiBDTE9TRSBGSUxFIFVTSU5HIEZDQiAqLwpAQCAtMTAyNSwyMSArMTAyOCwyMyBAQAogICAgIGNhc2UgMHgyNzogLyogUkFORE9NIEJMT0NLIFJFQUQgRlJPTSBGQ0IgRklMRSAqLwogICAgIGNhc2UgMHgyODogLyogUkFORE9NIEJMT0NLIFdSSVRFIFRPIEZDQiBGSUxFICovCiAgICAgY2FzZSAweDI5OiAvKiBQQVJTRSBGSUxFTkFNRSBJTlRPIEZDQiAqLwotICAgIGNhc2UgMHgzNzogLyogIlNXSVRDSEFSIiAtIEdFVCBTV0lUQ0ggQ0hBUkFDVEVSCi0gICAgICAgICAgICAgICAgICAiU1dJVENIQVIiIC0gU0VUIFNXSVRDSCBDSEFSQUNURVIKLSAgICAgICAgICAgICAgICAgICJBVkFJTERFViIgLSBTUEVDSUZZIFxERVZcIFBSRUZJWCBVU0UgKi8KICAgICBjYXNlIDB4NTQ6IC8qIEdFVCBWRVJJRlkgRkxBRyAqLwogICAgICAgICBJTlRfQkFSRiggY29udGV4dCwgMHgyMSApOwogICAgICAgICBicmVhazsKIAorICAgIGNhc2UgMHgwMjogLyogV1JJVEUgQ0hBUkFDVEVSIFRPIFNUQU5EQVJEIE9VVFBVVCAqLworICAgIGNhc2UgMHgwNjogLyogRElSRUNUIENPTlNPTEUgSU4vT1VUUFVUICovCisgICAgCV9sd3JpdGUxNiggMSwgJkRMX3JlZyhjb250ZXh0KSwgMSk7CisgICAgICAgIGJyZWFrOworCiAgICAgY2FzZSAweDA3OiAvKiBESVJFQ1QgQ0hBUkFDVEVSIElOUFVUIFdJVEhPVVQgRUNITyAqLwogICAgICAgICBUUkFDRShpbnQyMSwiRElSRUNUIENIQVJBQ1RFUiBJTlBVVCBXSVRIT1VUIEVDSE9cbiIpOwotCV9scmVhZDE2KCBET1NfVE9fSEFORExFKDApLCAmQUxfcmVnKGNvbnRleHQpLCAxKTsKKwlfbHJlYWQxNiggMCwgJkFMX3JlZyhjb250ZXh0KSwgMSk7CiAgICAgICAgIGJyZWFrOwogCiAgICAgY2FzZSAweDA4OiAvKiBDSEFSQUNURVIgSU5QVVQgV0lUSE9VVCBFQ0hPICovCiAgICAgICAgIFRSQUNFKGludDIxLCJDSEFSQUNURVIgSU5QVVQgV0lUSE9VVCBFQ0hPXG4iKTsKLQlfbHJlYWQxNiggRE9TX1RPX0hBTkRMRSgwKSwgJkFMX3JlZyhjb250ZXh0KSwgMSk7CisJX2xyZWFkMTYoIDAsICZBTF9yZWcoY29udGV4dCksIDEpOwogICAgICAgICBicmVhazsKIAogICAgIGNhc2UgMHgwOTogLyogV1JJVEUgU1RSSU5HIFRPIFNUQU5EQVJEIE9VVFBVVCAqLwpAQCAtMTA0OCwxMCArMTA1MywyNiBAQAogICAgICAgICB7CiAgICAgICAgICAgICBMUFNUUiBkYXRhID0gQ1RYX1NFR19PRkZfVE9fTElOKGNvbnRleHQsRFNfcmVnKGNvbnRleHQpLERYX3JlZyhjb250ZXh0KSk7CiAgICAgICAgICAgICBMT05HIGxlbmd0aCA9IHN0cmNocihkYXRhLCckJyktZGF0YTsKLSAgICAgICAgICAgIF9od3JpdGUxNiggRE9TX1RPX0hBTkRMRSgxKSwgZGF0YSwgbGVuZ3RoKTsKKyAgICAgICAgICAgIF9od3JpdGUxNiggMSwgZGF0YSwgbGVuZ3RoKTsKICAgICAgICAgfQogICAgICAgICBicmVhazsKIAorICAgIGNhc2UgMHgwYTogLyogQlVGRkVSRUQgSU5QVVQgKi8KKyAgICAgIHsKKwljaGFyICpidWZmZXIgPSAoKGNoYXIgKilDVFhfU0VHX09GRl9UT19MSU4oY29udGV4dCwgIERTX3JlZyhjb250ZXh0KSwgCisJCQkJCQkgICBEWF9yZWcoY29udGV4dCkgKSk7CisJaW50IHJlczsKKwkKKwlUUkFDRShpbnQyMSwiQlVGRkVSRUQgSU5QVVRcbiIpOworCWlmIChidWZmZXJbMV0pCisJICBUUkFDRShpbnQyMSwiSGFuZGxlIG9sZCBjaGFycyBpbiBidWZmZXIhXG4iKTsKKwlyZXM9X2xyZWFkMTYoIDAsIGJ1ZmZlcisyLGJ1ZmZlclswXSk7CisJYnVmZmVyWzFdPXJlczsKKwlpZihidWZmZXJbcmVzKzFdID09ICdcbicpCisJICBidWZmZXJbcmVzKzFdID0gJ1xyJzsKKwlicmVhazsKKyAgICAgIH0KKwogICAgIGNhc2UgMHgyZTogLyogU0VUIFZFUklGWSBGTEFHICovCiAgICAgICAgIFRSQUNFKGludDIxLCJTRVQgVkVSSUZZIEZMQUcgaWdub3JlZFxuIik7CiAgICAgCS8qIHdlIGNhbm5vdCBjaGFuZ2UgdGhlIGJlaGF2aW91ciBhbnl3YXksIHNvIGp1c3QgaWdub3JlIGl0ICovCkBAIC0xMjQxLDYgKzEyNjIsMjggQEAKICAgICAgICAgaWYgKCFJTlQyMV9HZXRGcmVlRGlza1NwYWNlKGNvbnRleHQpKSBBWF9yZWcoY29udGV4dCkgPSAweGZmZmY7CiAgICAgICAgIGJyZWFrOwogCisgICAgY2FzZSAweDM3OiAKKyAgICAgIHsKKwl1bnNpZ25lZCBjaGFyIHN3aXRjaGNoYXI9Jy8nOworCXN3aXRjaCAoQUxfcmVnKGNvbnRleHQpKQorCXsKKwljYXNlIDB4MDA6IC8qICJTV0lUQ0hBUiIgLSBHRVQgU1dJVENIIENIQVJBQ1RFUiAqLworCSAgVFJBQ0UoaW50MjEsIlNXSVRDSEFSIC0gR0VUIFNXSVRDSCBDSEFSQUNURVJcbiIpOworCSAgQUxfcmVnKGNvbnRleHQpID0gMHgwMDsgLyogc3VjY2VzcyovCisJICBETF9yZWcoY29udGV4dCkgPSBzd2l0Y2hjaGFyOworCSAgYnJlYWs7CisJY2FzZSAweDAxOiAvKiJTV0lUQ0hBUiIgLSBTRVQgU1dJVENIIENIQVJBQ1RFUiovCisJICBUUkFDRShpbnQyMSwiU1dJVENIQVIgLSBTRVQgU1dJVENIIENIQVJBQ1RFUlxuIik7CisJICBzd2l0Y2hjaGFyID0gRExfcmVnKGNvbnRleHQpOworCSAgQUxfcmVnKGNvbnRleHQpID0gMHgwMDsgLyogc3VjY2VzcyovCisJICBicmVhazsKKwlkZWZhdWx0OiAvKiJBVkFJTERFViIgLSBTUEVDSUZZIFxERVZcIFBSRUZJWCBVU0UqLworCSAgSU5UX0JBUkYoIGNvbnRleHQsIDB4MjEgKTsKKwkgIGJyZWFrOworCX0KKwlicmVhazsKKyAgICAgIH0KKwogICAgIGNhc2UgMHgzODogLyogR0VUIENPVU5UUlktU1BFQ0lGSUMgSU5GT1JNQVRJT04gKi8KIAlUUkFDRShpbnQyMSwiR0VUIENPVU5UUlktU1BFQ0lGSUMgSU5GT1JNQVRJT04gZm9yIGNvdW50cnkgMHglMDJ4XG4iLAogCSAgICAgIEFMX3JlZyhjb250ZXh0KSk7CkBAIC0xMjcxLDggKzEzMTQsOCBAQAogICAgIGNhc2UgMHgzYzogLyogIkNSRUFUIiAtIENSRUFURSBPUiBUUlVOQ0FURSBGSUxFICovCiAgICAgICAgIFRSQUNFKGludDIxLCJDUkVBVCBmbGFnIDB4JTAyeCAlc1xuIixDWF9yZWcoY29udGV4dCksCiAJICAgICAgKExQQ1NUUilDVFhfU0VHX09GRl9UT19MSU4oY29udGV4dCwgIERTX3JlZyhjb250ZXh0KSwgRFhfcmVnKGNvbnRleHQpKSk7Ci0gICAgICAgIEFYX3JlZyhjb250ZXh0KSA9IEhBTkRMRV9UT19ET1MoX2xjcmVhdDE2KCBDVFhfU0VHX09GRl9UT19MSU4oY29udGV4dCwgIERTX3JlZyhjb250ZXh0KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERYX3JlZyhjb250ZXh0KSApLCBDWF9yZWcoY29udGV4dCkgKSk7CisgICAgICAgIEFYX3JlZyhjb250ZXh0KSA9IF9sY3JlYXQxNiggQ1RYX1NFR19PRkZfVE9fTElOKGNvbnRleHQsICBEU19yZWcoY29udGV4dCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERYX3JlZyhjb250ZXh0KSApLCBDWF9yZWcoY29udGV4dCkgKTsKICAgICAgICAgYlNldERPU0V4dGVuZGVkRXJyb3IgPSAoQVhfcmVnKGNvbnRleHQpID09IChXT1JEKUhGSUxFX0VSUk9SMTYpOwogICAgICAgICBicmVhazsKIApAQCAtMTI4OSwxNCArMTMzMiwxNCBAQAogCSAgICBET1NfRXh0ZW5kZWRFcnJvciA9IDB4MDY7CiAJICAgIGJTZXRET1NFeHRlbmRlZEVycm9yID0gVFJVRTsKIAl9IGVsc2UKLSAgICAgICAgYlNldERPU0V4dGVuZGVkRXJyb3IgPSAoKEFYX3JlZyhjb250ZXh0KSA9IF9sY2xvc2UxNiggRE9TX1RPX0hBTkRMRShCWF9yZWcoY29udGV4dCkpICkpICE9IDApOworICAgICAgICBiU2V0RE9TRXh0ZW5kZWRFcnJvciA9ICgoQVhfcmVnKGNvbnRleHQpID0gX2xjbG9zZTE2KCBCWF9yZWcoY29udGV4dCkgKSkgIT0gMCk7CiAgICAgICAgIGJyZWFrOwogCiAgICAgY2FzZSAweDNmOiAvKiAiUkVBRCIgLSBSRUFEIEZST00gRklMRSBPUiBERVZJQ0UgKi8KICAgICAgICAgVFJBQ0UoaW50MjEsIlJFQUQgZnJvbSAlZCB0byAlMDRsWDolMDRYIGZvciAlZCBieXRlXG4iLEJYX3JlZyhjb250ZXh0KSwKIAkgICAgICBEU19yZWcoY29udGV4dCksRFhfcmVnKGNvbnRleHQpLENYX3JlZyhjb250ZXh0KSApOwogICAgICAgICB7Ci0gICAgICAgICAgICBMT05HIHJlc3VsdCA9IF9ocmVhZDE2KCBET1NfVE9fSEFORExFKEJYX3JlZyhjb250ZXh0KSksCisgICAgICAgICAgICBMT05HIHJlc3VsdCA9IF9ocmVhZDE2KCBCWF9yZWcoY29udGV4dCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDVFhfU0VHX09GRl9UT19MSU4oY29udGV4dCwgRFNfcmVnKGNvbnRleHQpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERYX3JlZyhjb250ZXh0KSApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hfcmVnKGNvbnRleHQpICk7CkBAIC0xMzA5LDcgKzEzNTIsNyBAQAogICAgICAgICBUUkFDRShpbnQyMSwiV1JJVEUgZnJvbSAlMDRsWDolMDRYIHRvIGhhbmRsZSAlZCBmb3IgJWQgYnl0ZVxuIiwKIAkgICAgICBEU19yZWcoY29udGV4dCksRFhfcmVnKGNvbnRleHQpLEJYX3JlZyhjb250ZXh0KSxDWF9yZWcoY29udGV4dCkgKTsKICAgICAgICAgewotICAgICAgICAgICAgTE9ORyByZXN1bHQgPSBfaHdyaXRlMTYoIERPU19UT19IQU5ETEUoQlhfcmVnKGNvbnRleHQpKSwKKyAgICAgICAgICAgIExPTkcgcmVzdWx0ID0gX2h3cml0ZTE2KCBCWF9yZWcoY29udGV4dCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1RYX1NFR19PRkZfVE9fTElOKGNvbnRleHQsICBEU19yZWcoY29udGV4dCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEWF9yZWcoY29udGV4dCkgKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWF9yZWcoY29udGV4dCkgKTsKQEAgLTEzMzEsNyArMTM3NCw3IEBACiAJICAgICAgKEFMX3JlZyhjb250ZXh0KT09MCk/InN0YXJ0IG9mIGZpbGUiOihBTF9yZWcoY29udGV4dCk9PTEpPwogCSAgICAgICJjdXJyZW50IGZpbGUgcG9zaXRpb24iOiJlbmQgb2YgZmlsZSIpOwogICAgICAgICB7Ci0gICAgICAgICAgICBMT05HIHN0YXR1cyA9IF9sbHNlZWsxNiggRE9TX1RPX0hBTkRMRShCWF9yZWcoY29udGV4dCkpLAorICAgICAgICAgICAgTE9ORyBzdGF0dXMgPSBfbGxzZWVrMTYoIEJYX3JlZyhjb250ZXh0KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQUtFTE9ORyhEWF9yZWcoY29udGV4dCksQ1hfcmVnKGNvbnRleHQpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTF9yZWcoY29udGV4dCkgKTsKICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gLTEpIGJTZXRET1NFeHRlbmRlZEVycm9yID0gVFJVRTsKQEAgLTEzODEsNyArMTQyNCw3IEBACiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSAweDAyOnsKICAgICAgICAgICAgRklMRV9PQkpFQ1QgKmZpbGU7Ci0gICAgICAgICAgIGZpbGUgPSBGSUxFX0dldEZpbGUoRE9TX1RPX0hBTkRMRShCWF9yZWcoY29udGV4dCkpKTsKKyAgICAgICAgICAgZmlsZSA9IEZJTEVfR2V0RmlsZShIRklMRTE2X1RPX0hGSUxFMzIoQlhfcmVnKGNvbnRleHQpKSk7CiAgICAgICAgICAgIGlmICghc3RyY2FzZWNtcChmaWxlLT51bml4X25hbWUsICJTQ1NJTUdSJCIpKQogICAgICAgICAgICAgICAgICAgICAgICAgQVNQSV9ET1NfSGFuZGxlSW50KGNvbnRleHQpOwogICAgICAgICAgICBGSUxFX1JlbGVhc2VGaWxlKCBmaWxlICk7CkBAIC0xNDkzLDEzICsxNTM2LDEzIEBACiAKICAgICBjYXNlIDB4NDU6IC8qICJEVVAiIC0gRFVQTElDQVRFIEZJTEUgSEFORExFICovCiAgICAgICAgIFRSQUNFKGludDIxLCJEVVAgLSBEVVBMSUNBVEUgRklMRSBIQU5ETEUgJWRcbiIsQlhfcmVnKGNvbnRleHQpKTsKLSAgICAgICAgYlNldERPU0V4dGVuZGVkRXJyb3IgPSAoKEFYX3JlZyhjb250ZXh0KSA9IEhBTkRMRV9UT19ET1MoRklMRV9EdXAoRE9TX1RPX0hBTkRMRShCWF9yZWcoY29udGV4dCkpKSkpID09IChXT1JEKUhGSUxFX0VSUk9SMTYpOworICAgICAgICBiU2V0RE9TRXh0ZW5kZWRFcnJvciA9ICgoQVhfcmVnKGNvbnRleHQpID0gSEZJTEUzMl9UT19IRklMRTE2KEZJTEVfRHVwKEhGSUxFMTZfVE9fSEZJTEUzMihCWF9yZWcoY29udGV4dCkpKSkpID09IChXT1JEKUhGSUxFX0VSUk9SMTYpOwogICAgICAgICBicmVhazsKIAogICAgIGNhc2UgMHg0NjogLyogIkRVUDIiLCAiRk9SQ0VEVVAiIC0gRk9SQ0UgRFVQTElDQVRFIEZJTEUgSEFORExFICovCiAgICAgICAgIFRSQUNFKGludDIxLCJGT1JDRURVUCAtIEZPUkNFIERVUExJQ0FURSBGSUxFIEhBTkRMRSAlZCB0byAlZFxuIiwKIAkgICAgICBCWF9yZWcoY29udGV4dCksQ1hfcmVnKGNvbnRleHQpKTsKLSAgICAgICAgYlNldERPU0V4dGVuZGVkRXJyb3IgPSAoRklMRV9EdXAyKCBET1NfVE9fSEFORExFKEJYX3JlZyhjb250ZXh0KSksIERPU19UT19IQU5ETEUoQ1hfcmVnKGNvbnRleHQpKSApID09IEhGSUxFX0VSUk9SMzIpOworICAgICAgICBiU2V0RE9TRXh0ZW5kZWRFcnJvciA9IChGSUxFX0R1cDIoIEhGSUxFMTZfVE9fSEZJTEUzMihCWF9yZWcoY29udGV4dCkpLCBIRklMRTE2X1RPX0hGSUxFMzIoQ1hfcmVnKGNvbnRleHQpKSApID09IEhGSUxFX0VSUk9SMzIpOwogICAgICAgICBicmVhazsKIAogICAgIGNhc2UgMHg0NzogLyogIkNXRCIgLSBHRVQgQ1VSUkVOVCBESVJFQ1RPUlkgKi8KQEAgLTE1NTcsNyArMTYwMCw3IEBACiAJCiAgICAgY2FzZSAweDRjOiAvKiAiRVhJVCIgLSBURVJNSU5BVEUgV0lUSCBSRVRVUk4gQ09ERSAqLwogICAgICAgICBUUkFDRShpbnQyMSwiRVhJVCB3aXRoIHJldHVybiBjb2RlICVkXG4iLEFMX3JlZyhjb250ZXh0KSk7Ci0gICAgICAgIFRBU0tfS2lsbEN1cnJlbnRUYXNrKCBBTF9yZWcoY29udGV4dCkgKTsKKyAgICAgICAgRXhpdFByb2Nlc3MoIEFMX3JlZyhjb250ZXh0KSApOwogICAgICAgICBicmVhazsKIAogICAgIGNhc2UgMHg0ZDogLyogR0VUIFJFVFVSTiBDT0RFICovCkBAIC0xNTg2LDEzICsxNjI5LDEzIEBACiAgICAgICAgIFRSQUNFKGludDIxLCJHRVQgQ1VSUkVOVCBQUk9DRVNTIElEIChHRVQgUFNQIEFERFJFU1MpXG4iKTsKICAgICAgICAgLyogRklYTUU6IHNob3VsZCB3ZSByZXR1cm4gdGhlIG9yaWdpbmFsIERPUyBQU1AgdXBvbiAqLwogICAgICAgICAvKiAgICAgICAgV2luZG93cyBzdGFydHVwID8gKi8KLSAgICAgICAgQlhfcmVnKGNvbnRleHQpID0gR2V0Q3VycmVudFBEQigpOworICAgICAgICBCWF9yZWcoY29udGV4dCkgPSBJTlQyMV9HZXRDdXJyZW50UFNQKCk7CiAgICAgICAgIGJyZWFrOwogICAgIGNhc2UgMHg2MjogLyogR0VUIFBTUCBBRERSRVNTICovCiAgICAgICAgIFRSQUNFKGludDIxLCJHRVQgQ1VSUkVOVCBQU1AgQUREUkVTU1xuIik7CiAgICAgICAgIC8qIEZJWE1FOiBzaG91bGQgd2UgcmV0dXJuIHRoZSBvcmlnaW5hbCBET1MgUFNQIHVwb24gKi8KICAgICAgICAgLyogICAgICAgIFdpbmRvd3Mgc3RhcnR1cCA/ICovCi0gICAgICAgIEJYX3JlZyhjb250ZXh0KSA9IEdldEN1cnJlbnRQREIoKTsKKyAgICAgICAgQlhfcmVnKGNvbnRleHQpID0gSU5UMjFfR2V0Q3VycmVudFBTUCgpOwogICAgICAgICBicmVhazsKIAogICAgIGNhc2UgMHg1MjogLyogIlNZU1ZBUlMiIC0gR0VUIExJU1QgT0YgTElTVFMgKi8KQEAgLTE2NzAsNyArMTcxMyw3IEBACiAgICAgICAgIFRSQUNFKGludDIxLCJDUkVBVEUgTkVXIEZJTEUgMHglMDJ4IGZvciAlc1xuIiwgQ1hfcmVnKGNvbnRleHQpLAogCSAgICAgIChMUENTVFIpQ1RYX1NFR19PRkZfVE9fTElOKGNvbnRleHQsICBEU19yZWcoY29udGV4dCksIERYX3JlZyhjb250ZXh0KSkpOwogICAgICAgICBiU2V0RE9TRXh0ZW5kZWRFcnJvciA9ICgoQVhfcmVnKGNvbnRleHQpID0gCi0JCUhBTkRMRV9UT19ET1MoX2xjcmVhdF91bmlxKCBDVFhfU0VHX09GRl9UT19MSU4oY29udGV4dCwgRFNfcmVnKGNvbnRleHQpLERYX3JlZyhjb250ZXh0KSksIDAgKSkpIAorICAgICAgICAgICAgICAgSEZJTEUzMl9UT19IRklMRTE2KF9sY3JlYXRfdW5pcSggQ1RYX1NFR19PRkZfVE9fTElOKGNvbnRleHQsIERTX3JlZyhjb250ZXh0KSxEWF9yZWcoY29udGV4dCkpLCAwICkpKQogCQkJCQkJCQk9PSAoV09SRClIRklMRV9FUlJPUjE2KTsKICAgICAgICAgYnJlYWs7CiAKQEAgLTE3ODksNyArMTgzMiw3IEBACiAgICAgY2FzZSAweDY4OiAvKiAiRkZMVVNIIiAtIENPTU1JVCBGSUxFICovCiAgICAgY2FzZSAweDZhOiAvKiBDT01NSVQgRklMRSAqLwogICAgICAgICBUUkFDRShpbnQyMSwiRkZMVVNIL0NPTU1JVCBoYW5kbGUgJWRcbiIsQlhfcmVnKGNvbnRleHQpKTsKLSAgICAgICAgYlNldERPU0V4dGVuZGVkRXJyb3IgPSAoIUZsdXNoRmlsZUJ1ZmZlcnMoIERPU19UT19IQU5ETEUoQlhfcmVnKGNvbnRleHQpKSApKTsKKyAgICAgICAgYlNldERPU0V4dGVuZGVkRXJyb3IgPSAoIUZsdXNoRmlsZUJ1ZmZlcnMoIEhGSUxFMTZfVE9fSEZJTEUzMihCWF9yZWcoY29udGV4dCkpICkpOwogICAgICAgICBicmVhazsJCQogCQogICAgIGNhc2UgMHg2OTogLyogRElTSyBTRVJJQUwgTlVNQkVSICovCmRpZmYgLS1naXQgYS9tc2Rvcy92eGQuYyBiL21zZG9zL3Z4ZC5jCmluZGV4IDNmMDhhYzguLmNhYWM3YTMgMTAwNjQ0Ci0tLSBhL21zZG9zL3Z4ZC5jCisrKyBiL21zZG9zL3Z4ZC5jCkBAIC04MDYsNyArODA2LDcgQEAKICAgICAgICAgTEFSR0VfSU5URUdFUiAqc2l6ZSA9IChMQVJHRV9JTlRFR0VSICopQXBwVG9XaW5lKHN0YWNrWzNdKTsKICAgICAgICAgRFdPUkQgIHByb3RlY3QgID0gc3RhY2tbNF07CiAgICAgICAgIERXT1JEICBmbGFnczIgICA9IHN0YWNrWzVdOwotICAgICAgICBIRklMRTMyIGhGaWxlICAgPSBzdGFja1s2XTsKKyAgICAgICAgSEZJTEUzMiBoRmlsZSAgID0gSEZJTEUxNl9UT19IRklMRTMyKHN0YWNrWzZdKTsKICAgICAgICAgRFdPUkQgIHBzcCAgICAgID0gc3RhY2tbN107CiAKICAgICAgICAgSEFORExFMzIgcmVzdWx0ID0gSU5WQUxJRF9IQU5ETEVfVkFMVUUzMjsKZGlmZiAtLWdpdCBhL211bHRpbWVkaWEvZHNvdW5kLmMgYi9tdWx0aW1lZGlhL2Rzb3VuZC5jCmluZGV4IGQzYWRjNzYuLjY1NDIwNmYgMTAwNjQ0Ci0tLSBhL211bHRpbWVkaWEvZHNvdW5kLmMKKysrIGIvbXVsdGltZWRpYS9kc291bmQuYwpAQCAtMjQyLDYgKzI0Miw3IEBACiAJCXRoaXMtPmRzb3VuZC0+bnJvZmJ1ZmZlcnMtLTsKIAkJdGhpcy0+ZHNvdW5kLT5scHZ0YmwtPmZuUmVsZWFzZSh0aGlzLT5kc291bmQpOwogCX0KKwlIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLDAsdGhpcy0+YnVmZmVyKTsKIAlIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLDAsdGhpcyk7CiAJcmV0dXJuIDA7CiB9CkBAIC03ODQsNyArNzg1LDcgQEAKIC8qCQkJdW5zaWduZWQgY2hhcgkqeGJ1ZiA9ICh1bnNpZ25lZCBjaGFyKikoZHNiLT5idWZmZXIpOyAqLwogCQkJY2hhcgkqeGJ1ZiA9IGRzYi0+YnVmZmVyOwogCQkJaWYgKGRzYi0+d2Z4Lm5DaGFubmVscyA9PSAxKSB7Ci0JcHJpbnRmKCJNaXhpbmcgOC1iaXQgc3RlcmVvIGludG8gMTYhIVxuIik7CisJCQkJV0FSTihkc291bmQsIk1peGluZyA4LWJpdCBzdGVyZW8gaW50byAxNiEhXG4iKTsKIAkJCQlmb3IgKGo9MDtqPHNpemVvZihwbGF5YnVmKS9zaXplb2YocGxheWJ1ZlswXSkvMjtqKyspIHsKIAkJCQkJZHNiLT5wbGF5cG9zPShkc2ItPnBsYXlwb3MrMSklYnVmbGVuOwogCQkJCQlpZiAoIWRzYi0+cGxheXBvcyAmJiAhKGRzYi0+cGxheWZsYWdzJkRTQlBMQVlfTE9PUElORykpIHsKZGlmZiAtLWdpdCBhL211bHRpbWVkaWEvbW1pby5jIGIvbXVsdGltZWRpYS9tbWlvLmMKaW5kZXggZjZiZGM3Ny4uODQ0M2NhMSAxMDA2NDQKLS0tIGEvbXVsdGltZWRpYS9tbWlvLmMKKysrIGIvbXVsdGltZWRpYS9tbWlvLmMKQEAgLTMyLDcgKzMyLDcgQEAKIAkJY2FzZSBNTUlPTV9PUEVOOiB7CiAJCQkvKiBQYXJhbWV0ZXJzOgogCQkJICogbFBhcmFtMSA9IHN6RmlsZU5hbWUgcGFyYW1ldGVyIGZyb20gbW1pb09wZW4KLQkJCSAqIGxQYXJhbTIgPSB1bnVzZWQKKwkJCSAqIGxQYXJhbTIgPSByZXNlcnZlZCAod2UgdXNlIGl0IGZvciAxNi1iaXRuZXNzKQogCQkJICogUmV0dXJuczogemVybyBvbiBzdWNjZXNzLCBlcnJvciBjb2RlIG9uIGVycm9yCiAJCQkgKiBOT1RFOiBsRGlza09mZnNldCBhdXRvbWF0aWNhbGx5IHNldCB0byB6ZXJvCiAJCQkgKi8KQEAgLTQ2LDggKzQ2LDExIEBACiAJCQl9CiAKIAkJCS8qIGlmIGZpbGVuYW1lIE5VTEwsIGFzc3VtZSBvcGVuIGZpbGUgaGFuZGxlIGluIGFkd0luZm9bMF0gKi8KLQkJCWlmICghc3pGaWxlTmFtZSkKKwkJCWlmICghc3pGaWxlTmFtZSkgeworCQkJCWlmIChsUGFyYW0yKSBscG1taW9pbmZvLT5hZHdJbmZvWzBdID0KKwkJCQkJSEZJTEUxNl9UT19IRklMRTMyKGxwbW1pb2luZm8tPmFkd0luZm9bMF0pOwogCQkJCXJldHVybiAwOworCQkJfQogCiAJCQlscG1taW9pbmZvLT5hZHdJbmZvWzBdID0KIAkJCQkoRFdPUkQpIE9wZW5GaWxlMzIoc3pGaWxlTmFtZSwgJm9mcywgbHBtbWlvaW5mby0+ZHdGbGFncyk7CkBAIC0xMTAsNyArMTEzLDcgQEAKIAkJCUxPTkcgY2NoID0gKExPTkcpIGxQYXJhbTI7CiAJCQlMT05HIGNvdW50OwogCi0JCQljb3VudCA9IF9od3JpdGUxNigoSEZJTEUzMilscG1taW9pbmZvLT5hZHdJbmZvWzBdLCBwY2gsIGNjaCk7CisJCQljb3VudCA9IF9od3JpdGUzMigoSEZJTEUzMilscG1taW9pbmZvLT5hZHdJbmZvWzBdLCBwY2gsIGNjaCk7CiAJCQlpZiAoY291bnQgIT0gLTEpCiAJCQkJbHBtbWlvaW5mby0+bERpc2tPZmZzZXQgKz0gY291bnQ7CiAKQEAgLTE1OSwzNyArMTYyLDk3IEBACiAqICAgICAgICAgICAgICAgbW1pb01lbUlPUHJvYyAgICAgICAgICAgW2ludGVybmFsXQogKi8KIHN0YXRpYyBMUkVTVUxUIG1taW9NZW1JT1Byb2MoTFBNTUlPSU5GTzE2IGxwbW1pb2luZm8sIFVJTlQxNiB1TWVzc2FnZSwgTFBBUkFNIGxQYXJhbTEsIExQQVJBTSBsUGFyYW0yKSB7Ci0JRklYTUUobW1pbywiKCVwLDB4JTA0eCwweCUwOGx4LDB4JTA4bHgpLCBzdHViIVxuIixscG1taW9pbmZvLHVNZXNzYWdlLGxQYXJhbTEsbFBhcmFtMik7CisJVFJBQ0UobW1pbywiKCVwLDB4JTA0eCwweCUwOGx4LDB4JTA4bHgpXG4iLGxwbW1pb2luZm8sdU1lc3NhZ2UsbFBhcmFtMSxsUGFyYW0yKTsKKwlzd2l0Y2ggKHVNZXNzYWdlKSB7CisKKwkJY2FzZSBNTUlPTV9PUEVOOiB7CisJCQkvKiBQYXJhbWV0ZXJzOgorCQkJICogbFBhcmFtMSA9IGZpbGVuYW1lIChtdXN0IGJlIE5VTEwpCisJCQkgKiBsUGFyYW0yID0gcmVzZXJ2ZWQgKHdlIHVzZSBpdCBmb3IgMTYtYml0bmVzcykKKwkJCSAqIFJldHVybnM6IHplcm8gb24gc3VjY2VzcywgZXJyb3IgY29kZSBvbiBlcnJvcgorCQkJICogTk9URTogbERpc2tPZmZzZXQgYXV0b21hdGljYWxseSBzZXQgdG8gemVybworCQkJICovCisKKwkJCWlmICghKGxwbW1pb2luZm8tPmR3RmxhZ3MgJiBNTUlPX0NSRUFURSkpCisJCQkJbHBtbWlvaW5mby0+cGNoRW5kUmVhZCA9IGxwbW1pb2luZm8tPnBjaEVuZFdyaXRlOworCisJCQlyZXR1cm4gMDsKKwkJfQorCisJCWNhc2UgTU1JT01fQ0xPU0U6IHsKKwkJCS8qIFBhcmFtZXRlcnM6CisJCQkgKiBsUGFyYW0xID0gd0ZsYWdzIHBhcmFtZXRlciBmcm9tIG1taW9DbG9zZQorCQkJICogbFBhcmFtMiA9IHVudXNlZAorCQkJICogUmV0dXJuczogemVybyBvbiBzdWNjZXNzLCBlcnJvciBjb2RlIG9uIGVycm9yCisJCQkgKi8KKworCQkJcmV0dXJuIDA7CisKKwkJfQorCisJCWNhc2UgTU1JT01fUkVBRDogeworCQkJLyogUGFyYW1ldGVyczoKKwkJCSAqIGxQYXJhbTEgPSBodWdlIHBvaW50ZXIgdG8gcmVhZCBidWZmZXIKKwkJCSAqIGxQYXJhbTIgPSBudW1iZXIgb2YgYnl0ZXMgdG8gcmVhZAorCQkJICogUmV0dXJuczogbnVtYmVyIG9mIGJ5dGVzIHJlYWQsIDAgZm9yIEVPRiwgLTEgZm9yIGVycm9yIChlcnJvciBjb2RlCisJCQkgKgkgICBpbiB3RXJyb3JSZXQpCisJCQkgKiBOT1RFOiBsRGlza09mZnNldCBzaG91bGQgYmUgdXBkYXRlZAorCQkJICovCisKKwkJCUhQU1RSIHBjaCA9IChIUFNUUikgbFBhcmFtMTsKKwkJCUxPTkcgY2NoID0gKExPTkcpIGxQYXJhbTI7CisKKwkJCUZJWE1FKG1taW8sIk1NSU9NX1JFQUQgb24gbWVtb3J5IGZpbGVzIHNob3VsZCBub3Qgb2NjdXIsIGJ1ZmZlciBtYXkgYmUgbG9zdCFcbiIpOworCQkJcmV0dXJuIDA7CisJCX0KKworCQljYXNlIE1NSU9NX1dSSVRFOgorCQljYXNlIE1NSU9NX1dSSVRFRkxVU0g6IHsgCisJCQkvKiBubyBpbnRlcm5hbCBidWZmZXJpbmcsIHNvIFdSSVRFRkxVU0ggaGFuZGxlZCBzYW1lIGFzIFdSSVRFICovCisKKwkJCS8qIFBhcmFtZXRlcnM6CisJCQkgKiBsUGFyYW0xID0gaHVnZSBwb2ludGVyIHRvIHdyaXRlIGJ1ZmZlcgorCQkJICogbFBhcmFtMiA9IG51bWJlciBvZiBieXRlcyB0byB3cml0ZQorCQkJICogUmV0dXJuczogbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4sIC0xIGZvciBlcnJvciAoZXJyb3IgY29kZSBpbgorCQkJICoJCXdFcnJvclJldCkKKwkJCSAqIE5PVEU6IGxEaXNrT2Zmc2V0IHNob3VsZCBiZSB1cGRhdGVkCisJCQkgKi8KKworCQkJSFBTVFIgcGNoID0gKEhQU1RSKSBsUGFyYW0xOworCQkJTE9ORyBjY2ggPSAoTE9ORykgbFBhcmFtMjsKKworCQkJRklYTUUobW1pbywiTU1JT01fV1JJVEUgb24gbWVtb3J5IGZpbGVzIHNob3VsZCBub3Qgb2NjdXIsIGJ1ZmZlciBtYXkgYmUgbG9zdCFcbiIpOworCQkJcmV0dXJuIDA7CisJCX0KKworCQljYXNlIE1NSU9NX1NFRUs6IHsKKwkJCS8qIFBhcmFtZXRlcnM6CisJCQkgKiBsUGFyYW0xID0gbmV3IHBvc2l0aW9uCisJCQkgKiBsUGFyYW0yID0gZnJvbSB3aGVuY2UgdG8gc2VlayAoU0VFS19TRVQsIFNFRUtfQ1VSLCBTRUVLX0VORCkKKwkJCSAqIFJldHVybnM6IG5ldyBmaWxlIHBvc3Rpb24sIC0xIG9uIGVycm9yCisJCQkgKiBOT1RFOiBsRGlza09mZnNldCBzaG91bGQgYmUgdXBkYXRlZAorCQkJICovCisKKwkJCUxPTkcgT2Zmc2V0ID0gKExPTkcpIGxQYXJhbTE7IAorCQkJTE9ORyBXaGVuY2UgPSAoTE9ORykgbFBhcmFtMjsgCisKKwkJCUZJWE1FKG1taW8sIk1NSU9NX1NFRUsgb24gbWVtb3J5IGZpbGVzIHNob3VsZCBub3Qgb2NjdXIsIGJ1ZmZlciBtYXkgYmUgbG9zdCFcbiIpOworCQkJcmV0dXJuIC0xOworCQl9CisJCSAgCisJCWRlZmF1bHQ6CisJCQlGSVhNRShtbWlvLCAidW5leHBlY3RlZCBtZXNzYWdlICV1XG4iLCB1TWVzc2FnZSk7CisJCQlyZXR1cm4gMDsKKwl9CisJCiAJcmV0dXJuIDA7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogCQkJCW1taW9PcGVuVyAgICAgICAJCVtXSU5NTS4xMjNdCisgKiAJCU1NSU9fT3BlbiAgICAgIAkJW2ludGVybmFsXQogICovCi1ITU1JTzMyIFdJTkFQSSBtbWlvT3BlbjMyVyhMUFdTVFIgc3pGaWxlTmFtZSwgTU1JT0lORk8zMiAqIGxwbW1pb2luZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIGR3T3BlbkZsYWdzKQotewotCUxQU1RSCXN6Rm4gPSBIRUFQX3N0cmR1cFd0b0EoR2V0UHJvY2Vzc0hlYXAoKSwwLHN6RmlsZU5hbWUpOwotCUhNTUlPMzIgcmV0ID0gbW1pb09wZW4xNihzekZuLChMUE1NSU9JTkZPMTYpbHBtbWlvaW5mbyxkd09wZW5GbGFncyk7Ci0KLQlIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLDAsc3pGbik7Ci0JcmV0dXJuIHJldDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAJCQkJbW1pb09wZW5BICAgICAgIAkJW1dJTk1NLjEyMl0KLSAqLwotSE1NSU8zMiBXSU5BUEkgbW1pb09wZW4zMkEoTFBTVFIgc3pGaWxlTmFtZSwgTU1JT0lORk8zMiAqIGxwbW1pb2luZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIGR3T3BlbkZsYWdzKQotewotCXJldHVybiBtbWlvT3BlbjE2KHN6RmlsZU5hbWUsKExQTU1JT0lORk8xNilscG1taW9pbmZvLGR3T3BlbkZsYWdzKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAJCQkJbW1pb09wZW4gICAgICAgCQlbTU1TWVNURU0uMTIxMF0KLSAqLwotSE1NSU8xNiBXSU5BUEkgbW1pb09wZW4xNihMUFNUUiBzekZpbGVOYW1lLCBNTUlPSU5GTzE2ICogbHBtbWlvaW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgZHdPcGVuRmxhZ3MpCitzdGF0aWMgSE1NSU8xNiBNTUlPX09wZW4oTFBTVFIgc3pGaWxlTmFtZSwgTU1JT0lORk8xNiAqIGxwbW1pb2luZm8sCisJCQlEV09SRCBkd09wZW5GbGFncywgaW50IHVzZTE2KQogewogCUxQTU1JT0lORk8xNiBscG1taW5mbzsKIAlITU1JTzE2IGhtbWlvOwpAQCAtMjA3LDcgKzI3MCw3IEBACiAJaWYgKCFscG1taW9pbmZvIHx8CiAJCShscG1taW9pbmZvLT5mY2NJT1Byb2MgPT0gMCAmJiBscG1taW9pbmZvLT5wSU9Qcm9jID09IE5VTEwpKSB7CiAKLQkJbHBtbWluZm8tPmZjY0lPUHJvYyA9IG1taW9GT1VSQ0MoJ0QnLCAnTycsICdTJywgJyAnKTsKKwkJbHBtbWluZm8tPmZjY0lPUHJvYyA9IEZPVVJDQ19ET1M7CiAJCWxwbW1pbmZvLT5wSU9Qcm9jID0gKExQTU1JT1BST0MxNikgbW1pb0Rvc0lPUHJvYzsKIAl9CiAJLyogaWYganVzdCB0aGUgZm91ciBjaGFyYWN0ZXIgY29kZSBpcyBwcmVzZW50LCBsb29rIHVwIElPIHByb2MgKi8KQEAgLTIzMCwxMyArMjkzLDIwIEBACiAJCQkJbHBtbWlvaW5mby0+d0Vycm9yUmV0ID0gcmVzdWx0OwogCQkJcmV0dXJuIDA7CiAJCX0KKwl9IGVsc2UKKwlpZiAobHBtbWluZm8tPmZjY0lPUHJvYyA9PSBGT1VSQ0NfTUVNKSB7CisJCWlmICgocmVzdWx0ID0gbW1pb1NldEJ1ZmZlcihobW1pbywgbHBtbWlvaW5mby0+cGNoQnVmZmVyLCBscG1taW9pbmZvLT5jY2hCdWZmZXIsIDApKSkgeworCQkJaWYgKGxwbW1pb2luZm8pCisJCQkJbHBtbWlvaW5mby0+d0Vycm9yUmV0ID0gcmVzdWx0OworCQkJcmV0dXJuIDA7CisJCX0KIAl9CiAKIAlscG1taW5mby0+ZHdGbGFncyA9IGR3T3BlbkZsYWdzOwogCWxwbW1pbmZvLT5obW1pbyA9IGhtbWlvOwogCiAJLyogY2FsbCBJTyBwcm9jIHRvIGFjdHVhbGx5IG9wZW4gZmlsZSAqLwotCXJlc3VsdCA9IChVSU5UMTYpIG1taW9TZW5kTWVzc2FnZShobW1pbywgTU1JT01fT1BFTiwgKExQQVJBTSkgc3pGaWxlTmFtZSwgKExQQVJBTSkgMCk7CisJcmVzdWx0ID0gKFVJTlQxNikgbW1pb1NlbmRNZXNzYWdlKGhtbWlvLCBNTUlPTV9PUEVOLCAoTFBBUkFNKSBzekZpbGVOYW1lLCAoTFBBUkFNKSB1c2UxNik7CiAKIAlHbG9iYWxVbmxvY2sxNihobW1pbyk7CiAKQEAgLTI0OCw2ICszMTgsMzcgQEAKIAlyZXR1cm4gaG1taW87CiB9CiAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogCQkJCW1taW9PcGVuVyAgICAgICAJCVtXSU5NTS4xMjNdCisgKi8KK0hNTUlPMzIgV0lOQVBJIG1taW9PcGVuMzJXKExQV1NUUiBzekZpbGVOYW1lLCBNTUlPSU5GTzMyICogbHBtbWlvaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgZHdPcGVuRmxhZ3MpCit7CisJTFBTVFIJc3pGbiA9IEhFQVBfc3RyZHVwV3RvQShHZXRQcm9jZXNzSGVhcCgpLDAsc3pGaWxlTmFtZSk7CisJSE1NSU8zMiByZXQgPSBNTUlPX09wZW4oc3pGbiwoTFBNTUlPSU5GTzE2KWxwbW1pb2luZm8sZHdPcGVuRmxhZ3MsRkFMU0UpOworCisJSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwwLHN6Rm4pOworCXJldHVybiByZXQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogCQkJCW1taW9PcGVuQSAgICAgICAJCVtXSU5NTS4xMjJdCisgKi8KK0hNTUlPMzIgV0lOQVBJIG1taW9PcGVuMzJBKExQU1RSIHN6RmlsZU5hbWUsIE1NSU9JTkZPMzIgKiBscG1taW9pbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBkd09wZW5GbGFncykKK3sKKwlyZXR1cm4gTU1JT19PcGVuKHN6RmlsZU5hbWUsKExQTU1JT0lORk8xNilscG1taW9pbmZvLGR3T3BlbkZsYWdzLEZBTFNFKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAJCQkJbW1pb09wZW4gICAgICAgCQlbTU1TWVNURU0uMTIxMF0KKyAqLworSE1NSU8xNiBXSU5BUEkgbW1pb09wZW4xNihMUFNUUiBzekZpbGVOYW1lLCBNTUlPSU5GTzE2ICogbHBtbWlvaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgZHdPcGVuRmxhZ3MpCit7CisJcmV0dXJuIE1NSU9fT3BlbihzekZpbGVOYW1lLChMUE1NSU9JTkZPMTYpbHBtbWlvaW5mbyxkd09wZW5GbGFncyxUUlVFKTsKK30KKwogICAgIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAJCQkJbW1pb0Nsb3NlICAgICAgCQlbV0lOTU0uMTE0XQpAQCAtMzA0LDcgKzQwNSw3IEBACiAKIAlpZiAobHBtbWluZm8tPnBjaE5leHQgIT0gbHBtbWluZm8tPnBjaEVuZFJlYWQpIHsKIAkJY291bnQgPSBscG1taW5mby0+cGNoRW5kUmVhZCAtIGxwbW1pbmZvLT5wY2hOZXh0OwotCQlpZiAoY291bnQgPiBjY2gpIGNvdW50ID0gY2NoOworCQlpZiAoY291bnQgPiBjY2ggfHwgY291bnQgPCAwKSBjb3VudCA9IGNjaDsKIAkJbWVtY3B5KHBjaCwgbHBtbWluZm8tPnBjaE5leHQsIGNvdW50KTsKIAkJbHBtbWluZm8tPnBjaE5leHQgKz0gY291bnQ7CiAJCXBjaCArPSBjb3VudDsKQEAgLTMxMiwxNSArNDEzLDE5IEBACiAJfSBlbHNlCiAJCWNvdW50ID0gMDsKIAotCWlmIChjY2gpIHsKKwlpZiAoY2NoJiYobHBtbWluZm8tPmZjY0lPUHJvYyE9Rk9VUkNDX01FTSkpIHsKIAkJaWYgKGxwbW1pbmZvLT5jY2hCdWZmZXIpIHsKIAkJCW1taW9GbHVzaDMyKGhtbWlvLCBNTUlPX0VNUFRZQlVGKTsKIAogCQkJd2hpbGUgKGNjaCkgewotCQkJCUxPTkcgc2l6ZSA9IG1taW9TZW5kTWVzc2FnZShobW1pbywgTU1JT01fUkVBRCwKKwkJCQlMT05HIHNpemU7CisJCQkJbHBtbWluZm8tPmxCdWZPZmZzZXQgPSBscG1taW5mby0+bERpc2tPZmZzZXQ7CisJCQkJbHBtbWluZm8tPnBjaE5leHQgPSBscG1taW5mby0+cGNoQnVmZmVyOworCQkJCWxwbW1pbmZvLT5wY2hFbmRSZWFkID0gbHBtbWluZm8tPnBjaEJ1ZmZlcjsKKwkJCQlzaXplID0gbW1pb1NlbmRNZXNzYWdlKGhtbWlvLCBNTUlPTV9SRUFELAogCQkJCQkJKExQQVJBTSkgbHBtbWluZm8tPnBjaEJ1ZmZlciwKIAkJCQkJCShMUEFSQU0pIGxwbW1pbmZvLT5jY2hCdWZmZXIpOwotCQkJCWxwbW1pbmZvLT5wY2hOZXh0ID0gbHBtbWluZm8tPnBjaEJ1ZmZlcjsKKwkJCQlpZiAoc2l6ZTw9MCkgYnJlYWs7CiAJCQkJbHBtbWluZm8tPnBjaEVuZFJlYWQgPSBscG1taW5mby0+cGNoQnVmZmVyICsgc2l6ZTsKIAkJCQlpZiAoc2l6ZSA+IGNjaCkgc2l6ZSA9IGNjaDsKIAkJCQltZW1jcHkocGNoLCBscG1taW5mby0+cGNoTmV4dCwgc2l6ZSk7CkBAIC0zMzEsNiArNDM2LDcgQEAKIAkJCX0KIAkJfSBlbHNlIHsKIAkJCWNvdW50ICs9IG1taW9TZW5kTWVzc2FnZShobW1pbywgTU1JT01fUkVBRCwgKExQQVJBTSkgcGNoLCAoTFBBUkFNKSBjY2gpOworCQkJaWYgKGNvdW50PjApIGxwbW1pbmZvLT5sQnVmT2Zmc2V0ICs9IGNvdW50OwogCQl9CiAJfQogCkBAIC0zNjYsMTIgKzQ3MiwxOCBAQAogCQl3aGlsZSAoY2NoKSB7CiAJCQlpZiAobHBtbWluZm8tPnBjaE5leHQgIT0gbHBtbWluZm8tPnBjaEVuZFdyaXRlKSB7CiAJCQkJY291bnQgPSBscG1taW5mby0+cGNoRW5kV3JpdGUgLSBscG1taW5mby0+cGNoTmV4dDsKLQkJCQlpZiAoY291bnQgPiBjY2gpIGNvdW50ID0gY2NoOworCQkJCWlmIChjb3VudCA+IGNjaCB8fCBjb3VudCA8IDApIGNvdW50ID0gY2NoOwogCQkJCW1lbWNweShscG1taW5mby0+cGNoTmV4dCwgcGNoLCBjb3VudCk7CiAJCQkJbHBtbWluZm8tPnBjaE5leHQgKz0gY291bnQ7CiAJCQkJcGNoICs9IGNvdW50OwogCQkJCWNjaCAtPSBjb3VudDsKIAkJCQlscG1taW5mby0+ZHdGbGFncyB8PSBNTUlPX0RJUlRZOworCQkJfSBlbHNlCisJCQlpZiAobHBtbWluZm8tPmZjY0lPUHJvYz09Rk9VUkNDX01FTSkgeworCQkJCWlmIChscG1taW5mby0+YWR3SW5mb1swXSkgeworCQkJCQkvKiBmcm9tIHdoZXJlIHdvdWxkIHdlIGdldCB0aGUgbWVtb3J5IGhhbmRsZT8gKi8KKwkJCQkJRklYTUUobW1pbywgIm1lbW9yeSBmaWxlIGV4cGFuc2lvbiBub3QgaW1wbGVtZW50ZWQhXG4iKTsKKwkJCQl9IGVsc2UgYnJlYWs7CiAJCQl9CiAKIAkJCWlmIChscG1taW5mby0+cGNoTmV4dCA9PSBscG1taW5mby0+cGNoRW5kV3JpdGUKQEAgLTM3OSw2ICs0OTEsNyBAQAogCQl9CiAJfSBlbHNlIHsKIAkJY291bnQgPSBtbWlvU2VuZE1lc3NhZ2UoaG1taW8sIE1NSU9NX1dSSVRFLCAoTFBBUkFNKSBwY2gsIChMUEFSQU0pIGNjaCk7CisJCWxwbW1pbmZvLT5sQnVmT2Zmc2V0ID0gbHBtbWluZm8tPmxEaXNrT2Zmc2V0OwogCX0KIAogCUdsb2JhbFVubG9jazE2KGhtbWlvKTsKQEAgLTQwNCwxNCArNTE3LDI4IEBACiAKIAlUUkFDRShtbWlvLCAiKCUwNFgsICUwOGxYLCAlZCk7XG4iLCBobW1pbywgbE9mZnNldCwgaU9yaWdpbik7CiAKLQlpZiAobW1pb0ZsdXNoMzIoaG1taW8sIE1NSU9fRU1QVFlCVUYpKQotCQlyZXR1cm4gLTE7Ci0KIAlscG1taW5mbyA9IChMUE1NSU9JTkZPMTYpR2xvYmFsTG9jazE2KGhtbWlvKTsKIAlpZiAobHBtbWluZm8gPT0gTlVMTCkKLQkJcmV0dXJuIDA7CisJCXJldHVybiAtMTsKKworCW9mZnNldCA9IChpT3JpZ2luPT1TRUVLX1NFVCk/KGxPZmZzZXQgLSBscG1taW5mby0+bEJ1Zk9mZnNldCk6CisJCSAoaU9yaWdpbj09U0VFS19DVVIpPyhsT2Zmc2V0ICsKKwkJIChscG1taW5mby0+cGNoTmV4dCAtIGxwbW1pbmZvLT5wY2hCdWZmZXIpKTotMTsKKworCWlmICgobHBtbWluZm8tPmNjaEJ1ZmZlcjwwKXx8CisJICAgICgob2Zmc2V0Pj0wKSYmKG9mZnNldDw9KGxwbW1pbmZvLT5wY2hFbmRSZWFkLWxwbW1pbmZvLT5wY2hCdWZmZXIpKSkpIHsKKwkJbHBtbWluZm8tPnBjaE5leHQgPSBscG1taW5mby0+cGNoQnVmZmVyICsgb2Zmc2V0OworCQlHbG9iYWxVbmxvY2sxNihobW1pbyk7CisJCXJldHVybiBscG1taW5mby0+bEJ1Zk9mZnNldCArIG9mZnNldDsKKwl9CisKKwlpZiAoKGxwbW1pbmZvLT5mY2NJT1Byb2M9PUZPVVJDQ19NRU0pfHxtbWlvRmx1c2gzMihobW1pbywgTU1JT19FTVBUWUJVRikpIHsKKwkJR2xvYmFsVW5sb2NrMTYoaG1taW8pOworCQlyZXR1cm4gLTE7CisJfQogCiAJb2Zmc2V0ID0gbW1pb1NlbmRNZXNzYWdlKGhtbWlvLCBNTUlPTV9TRUVLLCAoTFBBUkFNKSBsT2Zmc2V0LCAoTFBBUkFNKSBpT3JpZ2luKTsKKwlscG1taW5mby0+bEJ1Zk9mZnNldCA9IGxwbW1pbmZvLT5sRGlza09mZnNldDsKIAogCUdsb2JhbFVubG9jazE2KGhtbWlvKTsKIAlyZXR1cm4gb2Zmc2V0OwpAQCAtNTU0LDI0ICs2ODEsMzAgQEAKIAlscG1taW5mbyA9IChMUE1NSU9JTkZPMTYpR2xvYmFsTG9jazE2KGhtbWlvKTsKIAlpZiAobHBtbWluZm8gPT0gTlVMTCkgcmV0dXJuIDA7CiAKKwlpZiAoKCFscG1taW5mby0+Y2NoQnVmZmVyKXx8KGxwbW1pbmZvLT5mY2NJT1Byb2M9PUZPVVJDQ19NRU0pKSB7CisJCUdsb2JhbFVubG9jazE2KGhtbWlvKTsKKwkJcmV0dXJuIDA7CisJfQogCS8qIG5vdCBxdWl0ZSBzdXJlIHdoYXQgdG8gZG8gaGVyZSwgYnV0IEknbGwgZ3Vlc3MgKi8KLQlpZiAobHBtbWluZm8tPmR3RmxhZ3MmTU1JT19ESVJUWSkgewotCQlpZiAobHBtbWluZm8tPnBjaE5leHQgIT0gKGxwbW1pbmZvLT5wY2hCdWZmZXIgKyBscG1taW5mby0+bEJ1Zk9mZnNldCkpIHsKLQkJCWlmIChscG1taW5mby0+ZHdGbGFncyZNTUlPX1JFQURXUklURSkKLQkJCQltbWlvU2VuZE1lc3NhZ2UoaG1taW8sIE1NSU9NX1NFRUssCi0JCQkJCShMUEFSQU0pIChscG1taW5mby0+cGNoQnVmZmVyIC0gbHBtbWluZm8tPnBjaEVuZFJlYWQpICsgbHBtbWluZm8tPmxCdWZPZmZzZXQsCi0JCQkJCShMUEFSQU0pIFNFRUtfQ1VSICk7Ci0JCQltbWlvU2VuZE1lc3NhZ2UoaG1taW8sIE1NSU9NX1dSSVRFLAotCQkJCShMUEFSQU0pIGxwbW1pbmZvLT5wY2hCdWZmZXIgKyBscG1taW5mby0+bEJ1Zk9mZnNldCwKLQkJCQkoTFBBUkFNKSAobHBtbWluZm8tPnBjaE5leHQgLSBscG1taW5mby0+cGNoQnVmZmVyKSAtIGxwbW1pbmZvLT5sQnVmT2Zmc2V0ICk7Ci0JCX0KLQkJbHBtbWluZm8tPmxCdWZPZmZzZXQgPSBscG1taW5mby0+cGNoTmV4dCAtIGxwbW1pbmZvLT5wY2hCdWZmZXI7CisJaWYgKGxwbW1pbmZvLT5kd0ZsYWdzICYgTU1JT19ESVJUWSkgeworCQltbWlvU2VuZE1lc3NhZ2UoaG1taW8sIE1NSU9NX1NFRUssCisJCQkoTFBBUkFNKSBscG1taW5mby0+bEJ1Zk9mZnNldCwKKwkJCShMUEFSQU0pIFNFRUtfU0VUKTsKKwkJbW1pb1NlbmRNZXNzYWdlKGhtbWlvLCBNTUlPTV9XUklURSwKKwkJCShMUEFSQU0pIGxwbW1pbmZvLT5wY2hCdWZmZXIsCisJCQkoTFBBUkFNKSAobHBtbWluZm8tPnBjaE5leHQgLSBscG1taW5mby0+cGNoQnVmZmVyKSApOwogCQlscG1taW5mby0+ZHdGbGFncyAmPSB+TU1JT19ESVJUWTsKIAl9CiAJaWYgKHVGbGFncyAmIE1NSU9fRU1QVFlCVUYpIHsKKwkJLyogc2VlbXMgV2luZG93cyBkb2Vzbid0IGRvIGFueSBzZWVraW5nIGhlcmUsIGhvcGVmdWxseSB0aGlzCisJCSAgIHdvbid0IG1hdHRlciwgb3RoZXJ3aXNlIGEgc2xpZ2h0IHJld3JpdGUgaXMgbmVjZXNzYXJ5ICovCisJCW1taW9TZW5kTWVzc2FnZShobW1pbywgTU1JT01fU0VFSywKKwkJCShMUEFSQU0pIChscG1taW5mby0+bEJ1Zk9mZnNldCArCisJCQkJICAobHBtbWluZm8tPnBjaE5leHQgLSBscG1taW5mby0+cGNoQnVmZmVyKSksCisJCQkoTFBBUkFNKSBTRUVLX1NFVCk7CiAJCWxwbW1pbmZvLT5wY2hOZXh0ID0gbHBtbWluZm8tPnBjaEJ1ZmZlcjsKIAkJbHBtbWluZm8tPnBjaEVuZFJlYWQgPSBscG1taW5mby0+cGNoQnVmZmVyOwotCQlscG1taW5mby0+bEJ1Zk9mZnNldCA9IDA7CisJCWxwbW1pbmZvLT5sQnVmT2Zmc2V0ID0gbHBtbWluZm8tPmxEaXNrT2Zmc2V0OwogCX0KIAogCUdsb2JhbFVubG9jazE2KGhtbWlvKTsKQEAgLTU5NSwxNSArNzI4LDI2IEBACiAJVFJBQ0UobW1pbywgIm1taW9BZHZhbmNlXG4iKTsKIAlscG1taW5mbyA9IChMUE1NSU9JTkZPMTYpR2xvYmFsTG9jazE2KGhtbWlvKTsKIAlpZiAobHBtbWluZm8gPT0gTlVMTCkgcmV0dXJuIDA7CisJaWYgKCFscG1taW5mby0+Y2NoQnVmZmVyKSB7CisJCUdsb2JhbFVubG9jazE2KGhtbWlvKTsKKwkJcmV0dXJuIE1NSU9FUlJfVU5CVUZGRVJFRDsKKwl9CisJbHBtbWluZm8tPnBjaE5leHQgPSBscG1taW9pbmZvLT5wY2hOZXh0OworCWlmIChtbWlvRmx1c2gzMihobW1pbywgTU1JT19FTVBUWUJVRikpIHsKKwkJR2xvYmFsVW5sb2NrMTYoaG1taW8pOworCQlyZXR1cm4gTU1JT0VSUl9DQU5OT1RXUklURTsKKwl9CiAJaWYgKHVGbGFncyA9PSBNTUlPX1JFQUQpCiAJICAgICAgICBscG1taW9pbmZvLT5wY2hFbmRSZWFkID0gbHBtbWlvaW5mby0+cGNoQnVmZmVyICsKIAkgICAgICAgICAgICBtbWlvU2VuZE1lc3NhZ2UoaG1taW8sIE1NSU9NX1JFQUQsCiAJICAgICAgICAgICAgICAgIChMUEFSQU0pIGxwbW1pb2luZm8tPnBjaEJ1ZmZlciwKIAkgICAgICAgICAgICAgICAgKExQQVJBTSkgbHBtbWlvaW5mby0+Y2NoQnVmZmVyKTsKKyNpZiAwICAgLyogbW1pb0ZsdXNoMzIgYWxyZWFkeSBkaWQgdGhlIHdyaXRpbmcgKi8KIAlpZiAodUZsYWdzID09IE1NSU9fV1JJVEUpCiAJICAgICAgICAgICAgbW1pb1NlbmRNZXNzYWdlKGhtbWlvLCBNTUlPTV9XUklURSwKIAkgICAgICAgICAgICAgICAgKExQQVJBTSkgbHBtbWlvaW5mby0+cGNoQnVmZmVyLAogCSAgICAgICAgICAgICAgICAoTFBBUkFNKSBscG1taW9pbmZvLT5jY2hCdWZmZXIpOworI2VuZGlmCiAJbHBtbWlvaW5mby0+cGNoTmV4dCA9IGxwbW1pb2luZm8tPnBjaEJ1ZmZlcjsKIAlHbG9iYWxVbmxvY2sxNihobW1pbyk7CiAJcmV0dXJuIDA7CkBAIC02MTgsMTUgKzc2MiwyNiBAQAogCVRSQUNFKG1taW8sICJtbWlvQWR2YW5jZVxuIik7CiAJbHBtbWluZm8gPSAoTFBNTUlPSU5GTzE2KUdsb2JhbExvY2sxNihobW1pbyk7CiAJaWYgKGxwbW1pbmZvID09IE5VTEwpIHJldHVybiAwOworCWlmICghbHBtbWluZm8tPmNjaEJ1ZmZlcikgeworCQlHbG9iYWxVbmxvY2sxNihobW1pbyk7CisJCXJldHVybiBNTUlPRVJSX1VOQlVGRkVSRUQ7CisJfQorCWxwbW1pbmZvLT5wY2hOZXh0ID0gbHBtbWlvaW5mby0+cGNoTmV4dDsKKwlpZiAobW1pb0ZsdXNoMzIoaG1taW8sIE1NSU9fRU1QVFlCVUYpKSB7CisJCUdsb2JhbFVubG9jazE2KGhtbWlvKTsKKwkJcmV0dXJuIE1NSU9FUlJfQ0FOTk9UV1JJVEU7CisJfQogCWlmICh1RmxhZ3MgPT0gTU1JT19SRUFEKQogCSAgICAgICAgbHBtbWlvaW5mby0+cGNoRW5kUmVhZCA9IGxwbW1pb2luZm8tPnBjaEJ1ZmZlciArCiAJICAgICAgICAgICAgbW1pb1NlbmRNZXNzYWdlKGhtbWlvLCBNTUlPTV9SRUFELAogCSAgICAgICAgICAgICAgICAoTFBBUkFNKSBscG1taW9pbmZvLT5wY2hCdWZmZXIsCiAJICAgICAgICAgICAgICAgIChMUEFSQU0pIGxwbW1pb2luZm8tPmNjaEJ1ZmZlcik7CisjaWYgMCAgIC8qIG1taW9GbHVzaDMyIGFscmVhZHkgZGlkIHRoZSB3cml0aW5nICovCiAJaWYgKHVGbGFncyA9PSBNTUlPX1dSSVRFKQogCSAgICAgICAgICAgIG1taW9TZW5kTWVzc2FnZShobW1pbywgTU1JT01fV1JJVEUsCiAJICAgICAgICAgICAgICAgIChMUEFSQU0pIGxwbW1pb2luZm8tPnBjaEJ1ZmZlciwKIAkgICAgICAgICAgICAgICAgKExQQVJBTSkgbHBtbWlvaW5mby0+Y2NoQnVmZmVyKTsKKyNlbmRpZgogCWxwbW1pb2luZm8tPnBjaE5leHQgPSBscG1taW9pbmZvLT5wY2hCdWZmZXI7CiAJR2xvYmFsVW5sb2NrMTYoaG1taW8pOwogCXJldHVybiAwOwpAQCAtNzg2LDEwICs5NDEsMTcgQEAKIAkJd2hpbGUgKFRSVUUpIHsKIAkJICAgICAgICBMT05HIGl4OwogCi0JCQlpeCA9IG1taW9SZWFkMzIoaG1taW8sIChMUFNUUilscGNrLCBzaXplb2YoTU1DS0lORk8pKTsKLQkJCVRSQUNFKG1taW8sICJhZnRlciBfbHJlYWQzMiBpeCA9ICVsZCByZXEgPSAlZCwgZXJybm8gPSAlZFxuIixpeCxzaXplb2YoTU1DS0lORk8pLGVycm5vKTsKLQkJCWlmIChpeCA8IHNpemVvZihNTUNLSU5GTykpIHsKLQorCQkJaXggPSBtbWlvUmVhZDMyKGhtbWlvLCAoTFBTVFIpbHBjaywgMyAqIHNpemVvZihEV09SRCkpOworCQkJVFJBQ0UobW1pbywgImFmdGVyIF9scmVhZDMyIGl4ID0gJWxkIHJlcSA9ICVkLCBlcnJubyA9ICVkXG4iLGl4LDMgKiBzaXplb2YoRFdPUkQpLGVycm5vKTsKKwkJCWlmIChpeCA8IHNpemVvZihEV09SRCkpIHsKKwkJCQltbWlvU2VlazMyKGhtbWlvLCBkd09sZFBvcywgU0VFS19TRVQpOworCQkJCVdBUk4obW1pbywgInJldHVybiBDaHVua05vdEZvdW5kXG4iKTsKKwkJCQlyZXR1cm4gTU1JT0VSUl9DSFVOS05PVEZPVU5EOworCQkJfQorCQkJbHBjay0+ZHdEYXRhT2Zmc2V0ID0gZHdPbGRQb3MgKyAyICogc2l6ZW9mKERXT1JEKTsKKwkJCWlmIChscGNrLT5ja2lkID09IEZPVVJDQ19SSUZGIHx8IGxwY2stPmNraWQgPT0gRk9VUkNDX0xJU1QpIAorCQkJCWxwY2stPmR3RGF0YU9mZnNldCArPSBzaXplb2YoRFdPUkQpOworCQkJaWYgKGl4IDwgbHBjay0+ZHdEYXRhT2Zmc2V0IC0gZHdPbGRQb3MpIHsKIAkJCQltbWlvU2VlazMyKGhtbWlvLCBkd09sZFBvcywgU0VFS19TRVQpOwogCQkJCVdBUk4obW1pbywgInJldHVybiBDaHVua05vdEZvdW5kXG4iKTsKIAkJCQlyZXR1cm4gTU1JT0VSUl9DSFVOS05PVEZPVU5EOwpAQCAtNzk5LDkgKzk2MSw3IEBACiAJCQlpZiAoZHdmY2MgPT0gbHBjay0+Y2tpZCkKIAkJCQlicmVhazsKIAotCQkJZHdPbGRQb3MgKz0gbHBjay0+Y2tzaXplICsgMiAqIHNpemVvZihEV09SRCk7Ci0JCQlpZiAobHBjay0+Y2tpZCA9PSBGT1VSQ0NfUklGRiB8fCBscGNrLT5ja2lkID09IEZPVVJDQ19MSVNUKSAKLQkJCQlkd09sZFBvcyArPSBzaXplb2YoRFdPUkQpOworCQkJZHdPbGRQb3MgPSBscGNrLT5kd0RhdGFPZmZzZXQgKyBscGNrLT5ja3NpemU7CiAJCQltbWlvU2VlazMyKGhtbWlvLCBkd09sZFBvcywgU0VFS19TRVQpOwogCQl9CiAJfQpAQCAtODExLDEwICs5NzEsMTAgQEAKIAkJCVdBUk4obW1pbywgInJldHVybiBDaHVua05vdEZvdW5kIDJuZFxuIik7CiAJCQlyZXR1cm4gTU1JT0VSUl9DSFVOS05PVEZPVU5EOwogCQl9CisJCWxwY2stPmR3RGF0YU9mZnNldCA9IGR3T2xkUG9zICsgMiAqIHNpemVvZihEV09SRCk7CisJCWlmIChscGNrLT5ja2lkID09IEZPVVJDQ19SSUZGIHx8IGxwY2stPmNraWQgPT0gRk9VUkNDX0xJU1QpIAorCQkJbHBjay0+ZHdEYXRhT2Zmc2V0ICs9IHNpemVvZihEV09SRCk7CiAJfQotCWxwY2stPmR3RGF0YU9mZnNldCA9IGR3T2xkUG9zICsgMiAqIHNpemVvZihEV09SRCk7Ci0JaWYgKGxwY2stPmNraWQgPT0gRk9VUkNDX1JJRkYgfHwgbHBjay0+Y2tpZCA9PSBGT1VSQ0NfTElTVCkgCi0JCWxwY2stPmR3RGF0YU9mZnNldCArPSBzaXplb2YoRFdPUkQpOwogCW1taW9TZWVrMzIoaG1taW8sIGxwY2stPmR3RGF0YU9mZnNldCwgU0VFS19TRVQpOwogCiAJVFJBQ0UobW1pbywgImxwY2stPmNraWQ9JTA4bFggbHBjay0+Y2tzaXplPSVsZCAhXG4iLCAKQEAgLTgzMyw3ICs5OTMsOCBAQAogCQkJCWhtbWlvLCBscGNrLCB1RmxhZ3MpOwogCWlmIChscGNrLT5kd0ZsYWdzJk1NSU9fRElSVFkpIHsKIAkJRFdPUkQJZHdPbGRQb3MsIGR3TmV3U2l6ZSwgZHdTaXplUG9zOwotCQkKKworCQlUUkFDRShtbWlvLCAiY2h1bmsgaXMgbWFya2VkIE1NSU9fRElSVFksIGNvcnJlY3RpbmcgY2h1bmsgc2l6ZVxuIik7CiAJCWR3T2xkUG9zID0gbW1pb1NlZWszMihobW1pbywgMCwgU0VFS19DVVIpOwogCQlUUkFDRShtbWlvLCAiZHdPbGRQb3M9JWxkXG4iLCBkd09sZFBvcyk7CiAJCWR3TmV3U2l6ZSA9IGR3T2xkUG9zIC0gbHBjay0+ZHdEYXRhT2Zmc2V0OwpAQCAtODgyLDYgKzEwNDMsOCBAQAogCWVsc2UgaWYgKHVGbGFncyA9PSBNTUlPX0NSRUFURVJJRkYpCiAJCWxwY2stPmNraWQgPSBGT1VSQ0NfUklGRjsKIAorCVRSQUNFKG1taW8sICJja2lkPSUwOGxYXG4iLCBscGNrLT5ja2lkKTsKKwogCWxwY2stPmR3RGF0YU9mZnNldCA9IGR3T2xkUG9zICsgMiAqIHNpemVvZihEV09SRCk7CiAJaWYgKGxwY2stPmNraWQgPT0gRk9VUkNDX1JJRkYgfHwgbHBjay0+Y2tpZCA9PSBGT1VSQ0NfTElTVCkgCiAJCWxwY2stPmR3RGF0YU9mZnNldCArPSBzaXplb2YoRFdPUkQpOwpkaWZmIC0tZ2l0IGEvbXVsdGltZWRpYS9tbXN5c3RlbS5jIGIvbXVsdGltZWRpYS9tbXN5c3RlbS5jCmluZGV4IDQ1OGE1YmUuLjQwZDQ0MjQgMTAwNjQ0Ci0tLSBhL211bHRpbWVkaWEvbW1zeXN0ZW0uYworKysgYi9tdWx0aW1lZGlhL21tc3lzdGVtLmMKQEAgLTE2MiwxMyArMTYyLDE3IEBACiAJCVRSQUNFKG1tc3lzLCAiU3RvcCAhXG4iKTsKIAkJcmV0dXJuIEZBTFNFOwogCQl9Ci0JaG1taW8gPSBtbWlvT3BlbjE2KChMUFNUUilscHN6U291bmROYW1lLCBOVUxMLCAKLQkJTU1JT19BTExPQ0JVRiB8IE1NSU9fUkVBRCB8IE1NSU9fREVOWVdSSVRFKTsKLQogCWlmICh1RmxhZ3MgJiBTTkRfTUVNT1JZKSB7Ci0JCUZJWE1FKG1tc3lzLCAiU05EX01FTU9SWSBmbGFnIG5vdCBpbXBsZW1lbnRlZCFcbiIpOwotCQlyZXR1cm4gRkFMU0U7Ci0JfQorCQlNTUlPSU5GTzE2IG1taW5mbzsKKwkJbWVtc2V0KCZtbWluZm8sIDAsIHNpemVvZihtbWluZm8pKTsKKwkJbW1pbmZvLmZjY0lPUHJvYyA9IEZPVVJDQ19NRU07CisJCW1taW5mby5wY2hCdWZmZXIgPSAoTFBTVFIpbHBzelNvdW5kTmFtZTsKKwkJbW1pbmZvLmNjaEJ1ZmZlciA9IC0xOworCQlUUkFDRShtbXN5cywgIk1lbW9yeSBzb3VuZCAlcFxuIixscHN6U291bmROYW1lKTsKKwkJaG1taW8gPSBtbWlvT3BlbjE2KE5VTEwsICZtbWluZm8sIE1NSU9fUkVBRCk7CisJfSBlbHNlCisJCWhtbWlvID0gbW1pb09wZW4xNigoTFBTVFIpbHBzelNvdW5kTmFtZSwgTlVMTCwgCisJCQlNTUlPX0FMTE9DQlVGIHwgTU1JT19SRUFEIHwgTU1JT19ERU5ZV1JJVEUpOwogCiAJaWYgKGhtbWlvID09IDApIAogCXsKQEAgLTIzMyw3ICsyMzcsNyBAQAogCQkJICAgIHsKIAkJCQlXQVZFSERSCQl3YXZlSGRyOwogCQkJCUhHTE9CQUwxNgloRGF0YTsKLQkJCQlJTlQzMgkJY291bnQsIGJ1ZnNpemU7CisJCQkJSU5UMzIJCWNvdW50LCBidWZzaXplLCBsZWZ0ID0gbW1ja0luZm8uY2tzaXplOwogCiAJCQkJYnVmc2l6ZSA9IDY0MDAwOwogCQkJCWhEYXRhID0gR2xvYmFsQWxsb2MxNihHTUVNX01PVkVBQkxFLCBidWZzaXplKTsKQEAgLTI0NiwxMCArMjUwLDEyIEBACiAJCQkJZHdSZXQgPSB3b2RNZXNzYWdlKDAsV09ETV9QUkVQQVJFLDAsKERXT1JEKSZ3YXZlSGRyLHNpemVvZihXQVZFSERSKSk7CiAJCQkJaWYgKGR3UmV0ID09IE1NU1lTRVJSX05PRVJST1IpIAogCQkJCXsKLQkJCQkgICAgd2hpbGUoIFRSVUUgKQorCQkJCSAgICB3aGlsZSggbGVmdCApCiAJCQkJICAgIHsKKwkJCQkJaWYgKGJ1ZnNpemUgPiBsZWZ0KSBidWZzaXplID0gbGVmdDsKIAkJCQkJY291bnQgPSBtbWlvUmVhZDMyKGhtbWlvLHdhdmVIZHIubHBEYXRhLGJ1ZnNpemUpOwogCQkJCQlpZiAoY291bnQgPCAxKSBicmVhazsKKwkJCQkJbGVmdCAtPSBjb3VudDsKIAkJCQkJd2F2ZUhkci5kd0J1ZmZlckxlbmd0aCA9IGNvdW50OwogCQkJCS8qCXdhdmVIZHIuZHdCeXRlc1JlY29yZGVkID0gY291bnQ7ICovCiAJCQkJCS8qIEZJWE1FOiBkb2Vzbid0IGV4cGVjdCBhc3luYyBvcHMgKi8gCmRpZmYgLS1naXQgYS9vYmplY3RzL2JpdG1hcC5jIGIvb2JqZWN0cy9iaXRtYXAuYwppbmRleCBhM2RmMDJiLi4yNDgwZjI3IDEwMDY0NAotLS0gYS9vYmplY3RzL2JpdG1hcC5jCisrKyBiL29iamVjdHMvYml0bWFwLmMKQEAgLTM5NCw2ICszOTQsMjIgQEAKICAgICAgICAgICAgIHRidWYgKz0gcGFkOwogCX0KICAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIDMyOgorICAgICAgICBmb3IgKGg9MDtoPGhlaWdodDtoKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAodz0wO3c8Ym1wLT5iaXRtYXAuYm1XaWR0aDt3KyspCisgICAgICAgICAgICB7CisJICAgIAlsb25nIHBpeGVsID0gWEdldFBpeGVsKGltYWdlLHcsaCk7CisKKwkJKnRidWYrKyA9IHBpeGVsICYgMHhmZjsKKwkJKnRidWYrKyA9IChwaXhlbD4+IDgpICYgMHhmZjsKKwkJKnRidWYrKyA9IChwaXhlbD4+MTYpICYgMHhmZjsKKwkJKnRidWYrKyA9IChwaXhlbD4+MjQpICYgMHhmZjsKKwkgICAgfQorICAgICAgICAgICAgdGJ1ZiArPSBwYWQ7CisJfQorICAgICAgICBicmVhazsKICAgICBkZWZhdWx0OgogICAgICAgICBGSVhNRShiaXRtYXAsICJVbmhhbmRsZWQgYml0czolZFxuIiwgYm1wLT5iaXRtYXAuYm1CaXRzUGl4ZWwpOwogICAgIH0KQEAgLTUyNCw2ICs1NDAsMjAgQEAKICAgICAgICAgICAgIHNidWYgKz0gcGFkOwogICAgICAgICB9CiAgICAgICAgIGJyZWFrOworICAgIGNhc2UgMzI6IAorICAgICAgICBmb3IgKGg9MDtoPGhlaWdodDtoKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAodz0wO3c8Ym1wLT5iaXRtYXAuYm1XaWR0aDt3KyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgWFB1dFBpeGVsKGltYWdlLHcsaCwoc2J1ZlszXTw8MjQpKyhzYnVmWzJdPDwxNikrKHNidWZbMV08PDgpK3NidWZbMF0pOworICAgICAgICAgICAgICAgIHNidWYgKz0gNDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNidWYgKz0gcGFkOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBGSVhNRShiaXRtYXAsICJVbmhhbmRsZWQgYml0czolZFxuIiwgYm1wLT5iaXRtYXAuYm1CaXRzUGl4ZWwpOworCiAgICAgfQogCiAgICAgZGVzY3IuYm1wICAgID0gYm1wOwpAQCAtNjg0LDcgKzcxNCw3IEBACiAgKiBGSVhNRTogaW1wbGVtZW50YXRpb24gc3RpbGwgbGFja3MgbmVhcmx5IGFsbCBmZWF0dXJlcywgc2VlIExSXyoKICAqIGRlZmluZXMgaW4gd2luZG93cy5oCiAgKi8KLUhBTkRMRTMyIFdJTkFQSSBDb3B5SW1hZ2UzMiggSEFORExFMzIgaG5kLCBVSU5UMzIgdHlwZSwgSU5UMzIgZGVzaXJlZHgsCitISUNPTjMyIFdJTkFQSSBDb3B5SW1hZ2UzMiggSEFORExFMzIgaG5kLCBVSU5UMzIgdHlwZSwgSU5UMzIgZGVzaXJlZHgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVDMyIGRlc2lyZWR5LCBVSU5UMzIgZmxhZ3MgKQogewogICAgIHN3aXRjaCAodHlwZSkKQEAgLTY5OSw3ICs3MjksNiBAQAogICAgIHJldHVybiAwOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgkgICAgTG9hZEJpdG1hcDE2ICAgIChVU0VSLjE3NSkKICAqCmRpZmYgLS1naXQgYS9vYmplY3RzL2NvbG9yLmMgYi9vYmplY3RzL2NvbG9yLmMKaW5kZXggNjQ4N2FkYi4uNjVmZGNjYyAxMDA2NDQKLS0tIGEvb2JqZWN0cy9jb2xvci5jCisrKyBiL29iamVjdHMvY29sb3IuYwpAQCAtODE2LDkgKzgxNiwxMSBAQAogewogICAgIFhDb2xvciBjb2xvcjsKIAorI2lmIDAKICAgICAvKiB0cnVlY29sb3IgdmlzdWFsICovCiAKICAgICBpZiAoc2NyZWVuRGVwdGggPj0gMjQpIHJldHVybiBwaXhlbDsKKyNlbmRpZgogCiAgICAgLyogY2hlY2sgZm9yIGhpY29sb3IgdmlzdWFscyBmaXJzdCAqLwogCmRpZmYgLS1naXQgYS9vYmplY3RzL2RjLmMgYi9vYmplY3RzL2RjLmMKaW5kZXggMjAyNDNjMy4uMTg5OWQ0OCAxMDA2NDQKLS0tIGEvb2JqZWN0cy9kYy5jCisrKyBiL29iamVjdHMvZGMuYwpAQCAtMTQ5NywzICsxNDk3LDI0IEBACiAgICAgcmV0dXJuIDA7CiB9CiAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIFNldElDTU1vZGUgICAgKEdESTMyLjMxOCkKKyAqLworSU5UMzIgV0lOQVBJIFNldElDTU1vZGUoSERDMzIgaGRjLCBJTlQzMiBpRW5hYmxlSUNNKQoreworLypGSVhNRSAgQXN1bWluZyB0aGF0IElDTSBpcyBhbHdheXMgb2ZmLCBhbmQgY2Fubm90IGJlIHR1cm5lZCBvbiAqLworICAgIGlmIChpRW5hYmxlSUNNID09IElDTV9PRkYpIHJldHVybiBJQ01fT0ZGOworICAgIGlmIChpRW5hYmxlSUNNID09IElDTV9PTikgcmV0dXJuIDA7CisgICAgaWYgKGlFbmFibGVJQ00gPT0gSUNNX1FVRVJZKSByZXR1cm4gSUNNX09GRjsKKyAgICByZXR1cm4gMDsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBHZXRDb2xvclNwYWNlICAgIChHREkzMi4xNjUpCisgKi8KK0hDT0xPUlNQQUNFMzIgV0lOQVBJIEdldENvbG9yU3BhY2UoSERDMzIgaGRjKQoreworLypGSVhNRSAgICBOZWVkIHRvIHRvIHdoYXRldmVyIEdldENvbG9yU3BhY2UgYWN0dWFsbHkgZG9lcyAqLworICAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvb2JqZWN0cy9mb250LmMgYi9vYmplY3RzL2ZvbnQuYwppbmRleCA5MTQzNGQzLi45NTU3NWI0IDEwMDY0NAotLS0gYS9vYmplY3RzL2ZvbnQuYworKysgYi9vYmplY3RzL2ZvbnQuYwpAQCAtOTI3LDkgKzkyNyw5IEBACiAgKiAgICBTdWNjZXNzOiBOb24temVybyBvciBzaXplIG9mIHJlcXVpcmVkIGJ1ZmZlcgogICogICAgRmFpbHVyZTogMAogICovCi1JTlQxNiBXSU5BUEkgR2V0T3V0bGluZVRleHRNZXRyaWNzKAorVUlOVDE2IFdJTkFQSSBHZXRPdXRsaW5lVGV4dE1ldHJpY3MxNigKICAgICBIREMxNiBoZGMsICAgIC8qIFtpbl0gIEhhbmRsZSBvZiBkZXZpY2UgY29udGV4dCAqLwotICAgIElOVDE2IGNiRGF0YSwgLyogW2luXSAgU2l6ZSBvZiBtZXRyaWMgZGF0YSBhcnJheSAqLworICAgIFVJTlQxNiBjYkRhdGEsIC8qIFtpbl0gIFNpemUgb2YgbWV0cmljIGRhdGEgYXJyYXkgKi8KICAgICB2b2lkICpscE9UTSkgIC8qIFtvdXRdIEFkZHJlc3Mgb2YgbWV0cmljIGRhdGEgYXJyYXkgKi8KIHsKICAgICBGSVhNRShmb250LCAiKCUwNHgsJTA0eCwlcCk6IHN0dWJcbiIsIGhkYyxjYkRhdGEsbHBPVE0pOwpAQCAtMTAzNiw3ICsxMDM2LDcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgR2V0QXNwZWN0UmF0aW9GaWx0ZXJFeDE2ICAoR0RJLjQ4NikKICAqLwotQk9PTDE2IEdldEFzcGVjdFJhdGlvRmlsdGVyRXgxNiggSERDMTYgaGRjLCBMUFZPSUQgcEFzcGVjdFJhdGlvICkKK0JPT0wxNiBXSU5BUEkgR2V0QXNwZWN0UmF0aW9GaWx0ZXJFeDE2KCBIREMxNiBoZGMsIExQU0laRTE2IHBBc3BlY3RSYXRpbyApCiB7CiAgIEZJWE1FKGZvbnQsICIoJTA0eCwgJXApOiAtLSBFbXB0eSBTdHViICFcbiIsCiAJCWhkYywgcEFzcGVjdFJhdGlvKTsKQEAgLTEyOTAsOCArMTI5MCw4IEBACiAgKiBHZXRDaGFyYWN0ZXJQbGFjZW1lbnQzMkEgW0dESTMyLjE2MF0KICAqLwogRFdPUkQgV0lOQVBJCi1HZXRDaGFyYWN0ZXJQbGFjZW1lbnQzMkEoSERDMzIgaGRjLCBMUENTVFIgbHBTdHJpbmcsIFVJTlQzMiB1Q291bnQsCi0JCQkgSU5UMzIgbk1heEV4dGVudCwgR0NQX1JFU1VMVFMzMkEgbHBSZXN1bHRzLAorR2V0Q2hhcmFjdGVyUGxhY2VtZW50MzJBKEhEQzMyIGhkYywgTFBDU1RSIGxwU3RyaW5nLCBJTlQzMiB1Q291bnQsCisJCQkgSU5UMzIgbk1heEV4dGVudCwgR0NQX1JFU1VMVFMzMkEgKmxwUmVzdWx0cywKIAkJCSBEV09SRCBkd0ZsYWdzKQogewogICAgIC8qIHJldHVybiB2YWx1ZSAwIGlzIGNvcnJlY3QgZm9yIG1vc3QgY2FzZXMgYW55d2F5ICovCkBAIC0xMzAzLDEyICsxMzAzLDExIEBACiAgKiBHZXRDaGFyYWN0ZXJQbGFjZW1lbnQzMlcgW0dESTMyLjE2MV0KICAqLwogRFdPUkQgV0lOQVBJCi1HZXRDaGFyYWN0ZXJQbGFjZW1lbnQzMlcoSERDMzIgaGRjLCBMUENXU1RSIGxwU3RyaW5nLCBVSU5UMzIgdUNvdW50LAotCQkJIElOVDMyIG5NYXhFeHRlbnQsIEdDUF9SRVNVTFRTMzJXIGxwUmVzdWx0cywKK0dldENoYXJhY3RlclBsYWNlbWVudDMyVyhIREMzMiBoZGMsIExQQ1dTVFIgbHBTdHJpbmcsIElOVDMyIHVDb3VudCwKKwkJCSBJTlQzMiBuTWF4RXh0ZW50LCBHQ1BfUkVTVUxUUzMyVyAqbHBSZXN1bHRzLAogCQkJIERXT1JEIGR3RmxhZ3MpCiB7CiAgICAgLyogcmV0dXJuIHZhbHVlIDAgaXMgY29ycmVjdCBmb3IgbW9zdCBjYXNlcyBhbnl3YXkgKi8KICAgICBGSVhNRShmb250LCI6c3R1YiFcbiIpOwogICAgIHJldHVybiAwOwogfQotCmRpZmYgLS1naXQgYS9vbGUvTWFrZWZpbGUuaW4gYi9vbGUvTWFrZWZpbGUuaW4KaW5kZXggYmJlNzE5OC4uMTM0ZjRmYyAxMDA2NDQKLS0tIGEvb2xlL01ha2VmaWxlLmluCisrKyBiL29sZS9NYWtlZmlsZS5pbgpAQCAtOCw3ICs4LDYgQEAKIENfU1JDUyA9IFwKIAljb21wb2JqLmMgXAogCWlmcy5jIFwKLQlmb2xkZXJzLmMgXAogCW1vbmlrZXIuYyBcCiAJb2xlMi5jIFwKIAlvbGUyZGlzcC5jIFwKZGlmZiAtLWdpdCBhL29sZS9mb2xkZXJzLmMgYi9vbGUvZm9sZGVycy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZGRkZTExLi4wMDAwMDAwCi0tLSBhL29sZS9mb2xkZXJzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMjE1ICswLDAgQEAKLS8qCi0gKglTaGVsbCBGb2xkZXIgc3R1ZmYgKC4uLmFuZCBhbGwgdGhlIE9MRS1PYmplY3RzIG9mIFNIRUxMMzIuRExMKQotICoKLSAqCUNvcHlyaWdodCAxOTk3CU1hcmN1cyBNZWlzc25lcgotICoJQ29weXJpZ2h0IDE5OTgJSnVlcmdlbiBTY2htaWVkCi0gKgotICogICEhISBjdXJyZW50bHkgd29yayBpbiBwcm9ncmVzcyBvbiBhbGwgY2xhc3NlcyAhISEKLSAqICA8Y29udGFjdCBqdWVyZ2VuLnNjaG1pZWRAbWV0cm9uZXQuZGUsIDk4MDgwMT4KLSAqLwotCi0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlICJvbGUuaCIKLSNpbmNsdWRlICJvbGUyLmgiCi0jaW5jbHVkZSAiZGVidWcuaCIKLSNpbmNsdWRlICJjb21wb2JqLmgiCi0jaW5jbHVkZSAiaW50ZXJmYWNlcy5oIgotI2luY2x1ZGUgInNobG9iai5oIgotI2luY2x1ZGUgIndpbmVycm9yLmgiCi0jaW5jbHVkZSAid2lubmxzLmgiCi0jaW5jbHVkZSAid2lucHJvYy5oIgotCi0vKiBGSVhNRSBzaG91bGQgYmUgbW92ZWQgdG8gYSBoZWFkZXIgZmlsZS4gSXNFcXVhbEdVSUQgCi1pcyBkZWNsYXJlZCBidXQgbm90IGV4cG9ydGVkIGluIGNvbXBvYmouYyAhISEqLwotI2RlZmluZSBJc0VxdWFsR1VJRChyZ3VpZDEsIHJndWlkMikgKCFtZW1jbXAocmd1aWQxLCByZ3VpZDIsIHNpemVvZihHVUlEKSkpCi0jZGVmaW5lIElzRXF1YWxJSUQocmlpZDEsIHJpaWQyKSBJc0VxdWFsR1VJRChyaWlkMSwgcmlpZDIpCi0jZGVmaW5lIElzRXF1YWxDTFNJRChyY2xzaWQxLCByY2xzaWQyKSBJc0VxdWFsR1VJRChyY2xzaWQxLCByY2xzaWQyKQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIEdldE5leHRFbGVtZW50IChpbnRlcm5hbCBmdW5jdGlvbikKLSAqCi0gKiBnZXRzIGEgcGFydCBvZiBhIHN0cmluZyB0aWxsIHRoZSBmaXJzdCBiYWNrc2xhc2gKLSAqCi0gKiBQQVJBTUVURVJTCi0gKiAgcHN6TmV4dCBbSU5dIHN0cmluZyB0byBnZXQgdGhlIGVsZW1lbnQgZnJvbQotICogIHBzek91dCAgW0lOXSBwb2ludGVyIHRvIGJ1ZmZlciB3aGl0Y2ggcmVjZWl2ZXMgc3RyaW5nCi0gKiAgZHdPdXQgICBbSU5dIGxlbmd0aCBvZiBwc3pPdXQKLSAqCi0gKiAgUkVUVVJOUwotICogICAgTFBTVFIgcG9pbnRlciB0byBmaXJzdCwgbm90IHlldCBwYXJzZWQgY2hhcgotICovCi1MUFNUUiBHZXROZXh0RWxlbWVudChMUFNUUiBwc3pOZXh0LExQU1RSIHBzek91dCxEV09SRCBkd091dCkKLXsgTFBTVFIgICBwc3pUYWlsID0gcHN6TmV4dDsKLSAgRFdPUkQgZHdDb3B5OwotICBUUkFDRShzaGVsbCwiKCVzICVwIDB4JTA4bHgpXG4iLGRlYnVnc3RyX2EocHN6TmV4dCkscHN6T3V0LGR3T3V0KTsKLQotICBpZighcHN6TmV4dCB8fCAhKnBzek5leHQpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgd2hpbGUoKnBzelRhaWwgJiYgKCpwc3pUYWlsICE9ICdcXCcpKQotICB7IHBzelRhaWwrKzsKLSAgfQotICBkd0NvcHk9KChMUEJZVEUpcHN6VGFpbC0oTFBCWVRFKXBzek5leHQpL3NpemVvZihDSEFSKSsxOwotICBsc3RyY3B5bjMyQShwc3pPdXQsIHBzek5leHQsIChkd091dDxkd0NvcHkpPyBkd091dCA6IGR3Q29weSk7Ci0KLSAgaWYoKnBzelRhaWwpCi0gIHsgIHBzelRhaWwrKzsKLQl9Ci0KLSAgVFJBQ0Uoc2hlbGwsIi0tKCVzICVzIDB4JTA4bHgpXG4iLGRlYnVnc3RyX2EocHN6TmV4dCksZGVidWdzdHJfYShwc3pPdXQpLGR3T3V0KTsKLSAgcmV0dXJuIHBzelRhaWw7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiAgSUNsYXNzRmFjdG9yeSBJbXBsZW1lbnRhdGlvbgotKi8KLXN0YXRpYyBIUkVTVUxUIFdJTkFQSSBJQ2xhc3NGYWN0b3J5X1F1ZXJ5SW50ZXJmYWNlKExQQ0xBU1NGQUNUT1JZLFJFRklJRCxMUFZPSUQqKTsKLXN0YXRpYyBVTE9ORyBXSU5BUEkgSUNsYXNzRmFjdG9yeV9BZGRSZWYoTFBDTEFTU0ZBQ1RPUlkpOwotc3RhdGljIFVMT05HIFdJTkFQSSBJQ2xhc3NGYWN0b3J5X1JlbGVhc2UoTFBDTEFTU0ZBQ1RPUlkpOwotc3RhdGljIEhSRVNVTFQgV0lOQVBJIElDbGFzc0ZhY3RvcnlfQ3JlYXRlSW5zdGFuY2UoKTsKLXN0YXRpYyBIUkVTVUxUIFdJTkFQSSBJQ2xhc3NGYWN0b3J5X0xvY2tTZXJ2ZXIoKTsKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIElDbGFzc0ZhY3RvcnlfVlRhYmxlCi0gKi8KLXN0YXRpYyBJQ2xhc3NGYWN0b3J5X1ZUYWJsZSBjbGZ2dCA9IAoteyBJQ2xhc3NGYWN0b3J5X1F1ZXJ5SW50ZXJmYWNlLAotCUlDbGFzc0ZhY3RvcnlfQWRkUmVmLAotCUlDbGFzc0ZhY3RvcnlfUmVsZWFzZSwKLQlJQ2xhc3NGYWN0b3J5X0NyZWF0ZUluc3RhbmNlLAotICBJQ2xhc3NGYWN0b3J5X0xvY2tTZXJ2ZXIKLX07Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIElDbGFzc0ZhY3RvcnlfQ29uc3RydWN0b3IKLSAqLwotCi1MUENMQVNTRkFDVE9SWSBJQ2xhc3NGYWN0b3J5X0NvbnN0cnVjdG9yKCkKLXsJTFBDTEFTU0ZBQ1RPUlkJbHBjbGY7Ci0KLQlscGNsZj0gKExQQ0xBU1NGQUNUT1JZKUhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLDAsc2l6ZW9mKElDbGFzc0ZhY3RvcnkpKTsKLQlscGNsZi0+cmVmID0gMTsKLQlscGNsZi0+bHB2dGJsID0gJmNsZnZ0OwotICBUUkFDRShzaGVsbCwiKCVwKS0+KClcbiIsbHBjbGYpOwotCXJldHVybiBscGNsZjsKLX0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIElDbGFzc0ZhY3Rvcnk6OlF1ZXJ5SW50ZXJmYWNlCi0gKi8KLXN0YXRpYyBIUkVTVUxUIFdJTkFQSSBJQ2xhc3NGYWN0b3J5X1F1ZXJ5SW50ZXJmYWNlKAotICBMUENMQVNTRkFDVE9SWSB0aGlzLCBSRUZJSUQgcmlpZCwgTFBWT0lEICpwcHZPYmopCi17ICBjaGFyCXhyaWlkWzUwXTsKLSAgIFdJTkVfU3RyaW5nRnJvbUNMU0lEKChMUENMU0lEKXJpaWQseHJpaWQpOwotICAgVFJBQ0Uoc2hlbGwsIiglcCktPihcblx0SUlEOlx0JXMpXG4iLHRoaXMseHJpaWQpOwotCi0gICpwcHZPYmogPSBOVUxMOwotCi0gIGlmKElzRXF1YWxJSUQocmlpZCwgJklJRF9JVW5rbm93bikpICAgICAgICAgIC8qSVVua25vd24qLwotICB7ICpwcHZPYmogPSB0aGlzOyAKLSAgfQotICBlbHNlIGlmKElzRXF1YWxJSUQocmlpZCwgJklJRF9JQ2xhc3NGYWN0b3J5KSkgIC8qSUNsYXNzRmFjdG9yeSovCi0gIHsgICAgKnBwdk9iaiA9IChJQ2xhc3NGYWN0b3J5Kil0aGlzOwotICB9ICAgCi0KLSAgaWYoKnBwdk9iaikKLSAgeyAoKihMUENMQVNTRkFDVE9SWSopcHB2T2JqKS0+bHB2dGJsLT5mbkFkZFJlZih0aGlzKTsgIAkKLSAgICBUUkFDRShzaGVsbCwiLS0gSW50ZXJmYWNlOiAoJXApLT4oJXApXG4iLHBwdk9iaiwqcHB2T2JqKTsKLSAgICByZXR1cm4gU19PSzsKLSAgfQotCVRSQUNFKHNoZWxsLCItLSBJbnRlcmZhY2U6IEVfTk9JTlRFUkZBQ0VcbiIpOwotICByZXR1cm4gRV9OT0lOVEVSRkFDRTsKLX0gIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogSUNsYXNzRmFjdG9yeV9BZGRSZWYKLSAqLwotc3RhdGljIFVMT05HIFdJTkFQSSBJQ2xhc3NGYWN0b3J5X0FkZFJlZihMUENMQVNTRkFDVE9SWSB0aGlzKQoteyBUUkFDRShzaGVsbCwiKCVwKS0+KGNvdW50PSVsdSlcbiIsdGhpcyx0aGlzLT5yZWYpOwotCXJldHVybiArKyh0aGlzLT5yZWYpOwotfQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogSUNsYXNzRmFjdG9yeV9SZWxlYXNlCi0gKi8KLXN0YXRpYyBVTE9ORyBXSU5BUEkgSUNsYXNzRmFjdG9yeV9SZWxlYXNlKExQQ0xBU1NGQUNUT1JZIHRoaXMpCi17CVRSQUNFKHNoZWxsLCIoJXApLT4oY291bnQ9JWx1KVxuIix0aGlzLHRoaXMtPnJlZik7Ci0JaWYgKCEtLSh0aGlzLT5yZWYpKSAKLQl7IFRSQUNFKHNoZWxsLCItLSBkZXN0cm95aW5nIElDbGFzc0ZhY3RvcnkoJXApXG4iLHRoaXMpOwotCQlIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLDAsdGhpcyk7Ci0JCXJldHVybiAwOwotCX0KLQlyZXR1cm4gdGhpcy0+cmVmOwotfQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogSUNsYXNzRmFjdG9yeV9DcmVhdGVJbnN0YW5jZQotICovCi1zdGF0aWMgSFJFU1VMVCBXSU5BUEkgSUNsYXNzRmFjdG9yeV9DcmVhdGVJbnN0YW5jZSgKLSAgTFBDTEFTU0ZBQ1RPUlkgdGhpcywgTFBVTktOT1dOIHBVbmtub3duLCBSRUZJSUQgcmlpZCwgTFBWT0lEICpwcE9iamVjdCkKLXsgSVVua25vd24gKnBPYmogPSBOVUxMOwotCUhSRVNVTFQgaHJlczsKLQljaGFyCXhyaWlkWzUwXTsKLQotICBXSU5FX1N0cmluZ0Zyb21DTFNJRCgoTFBDTFNJRClyaWlkLHhyaWlkKTsKLSAgVFJBQ0Uoc2hlbGwsIiVwLT4oJXAsXG5cdElJRDpcdCVzLCVwKVxuIix0aGlzLHBVbmtub3duLHhyaWlkLHBwT2JqZWN0KTsKLQotCSpwcE9iamVjdCA9IE5VTEw7Ci0JCQotCWlmKHBVbmtub3duKQotCXsJcmV0dXJuKENMQVNTX0VfTk9BR0dSRUdBVElPTik7Ci0JfQotCi0JaWYgKElzRXF1YWxJSUQocmlpZCwgJklJRF9JU2hlbGxGb2xkZXIpKQotICB7IHBPYmogPSAoSVVua25vd24gKilJU2hlbGxGb2xkZXJfQ29uc3RydWN0b3IoTlVMTCxOVUxMKTsKLSAgfSAKLSAgZWxzZSBpZiAoSXNFcXVhbElJRChyaWlkLCAmSUlEX0lTaGVsbFZpZXcpKQotICB7IHBPYmogPSAoSVVua25vd24gKilJU2hlbGxWaWV3X0NvbnN0cnVjdG9yKCk7Ci0gIH0gCi0gIGVsc2UgaWYgKElzRXF1YWxJSUQocmlpZCwgJklJRF9JU2hlbGxMaW5rKSkKLSAgeyBwT2JqID0gKElVbmtub3duICopSVNoZWxsTGlua19Db25zdHJ1Y3RvcigpOwotICB9IAotCWVsc2UKLQl7IEVSUihzaGVsbCwidW5rbm93biBJSUQgcmVxdWVzdGVkXG5cdElJRDpcdCVzXG4iLHhyaWlkKTsKLQkgIHJldHVybihFX05PSU5URVJGQUNFKTsKLQl9Ci0JCi0gIGlmICghcE9iaikKLSAgeyByZXR1cm4oRV9PVVRPRk1FTU9SWSk7Ci0gIH0KLQkgCi0JaHJlcyA9IHBPYmotPmxwdnRibC0+Zm5RdWVyeUludGVyZmFjZShwT2JqLHJpaWQsIHBwT2JqZWN0KTsKLSAgcE9iai0+bHB2dGJsLT5mblJlbGVhc2UocE9iaik7Ci0gIFRSQUNFKHNoZWxsLCItLSBPYmplY3QgY3JlYXRlZDogKCVwKS0+JXBcbiIsdGhpcywqcHBPYmplY3QpOwotCi0gIHJldHVybiBocmVzOwotfQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogSUNsYXNzRmFjdG9yeV9Mb2NrU2VydmVyCi0gKi8KLXN0YXRpYyBIUkVTVUxUIFdJTkFQSSBJQ2xhc3NGYWN0b3J5X0xvY2tTZXJ2ZXIoTFBDTEFTU0ZBQ1RPUlkgdGhpcywgQk9PTDMyIGZMb2NrKQoteyBUUkFDRShzaGVsbCwiJXAtPigweCV4KSwgbm90IGltcGxlbWVudGVkXG4iLHRoaXMsIGZMb2NrKTsKLSAgcmV0dXJuIEVfTk9USU1QTDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgSUVudW1JRExpc3QgSW1wbGVtZW50YXRpb24KLSAqLwotc3RhdGljIEhSRVNVTFQgV0lOQVBJIElFbnVtSURMaXN0X1F1ZXJ5SW50ZXJmYWNlKExQRU5VTUlETElTVCxSRUZJSUQsTFBWT0lEKik7Ci1zdGF0aWMgVUxPTkcgV0lOQVBJIElFbnVtSURMaXN0X0FkZFJlZihMUEVOVU1JRExJU1QpOwotc3RhdGljIFVMT05HIFdJTkFQSSBJRW51bUlETGlzdF9SZWxlYXNlKExQRU5VTUlETElTVCk7Ci1zdGF0aWMgSFJFU1VMVCBXSU5BUEkgSUVudW1JRExpc3RfTmV4dChMUEVOVU1JRExJU1QsVUxPTkcsTFBJVEVNSURMSVNUKixVTE9ORyopOwotc3RhdGljIEhSRVNVTFQgV0lOQVBJIElFbnVtSURMaXN0X1NraXAoTFBFTlVNSURMSVNULFVMT05HKTsKLXN0YXRpYyBIUkVTVUxUIFdJTkFQSSBJRW51bUlETGlzdF9SZXNldChMUEVOVU1JRExJU1QpOwotc3RhdGljIEhSRVNVTFQgV0lOQVBJIElFbnVtSURMaXN0X0Nsb25lKExQRU5VTUlETElTVCxMUEVOVU1JRExJU1QqKTsKLXN0YXRpYyBCT09MMzIgV0lOQVBJIElFbnVtSURMaXN0X0NyZWF0ZUVudW1MaXN0KExQRU5VTUlETElTVCxMUENTVFIsIERXT1JEKTsKLXN0YXRpYyBCT09MMzIgV0lOQVBJIElFbnVtSURMaXN0X0FkZFRvRW51bUxpc3QoTFBFTlVNSURMSVNULExQSVRFTUlETElTVCk7Ci1zdGF0aWMgQk9PTDMyIFdJTkFQSSBJRW51bUlETGlzdF9EZWxldGVMaXN0KExQRU5VTUlETElTVCk7Ci0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBJRW51bUlETGlzdF9WVGFibGUKLSAqLwotc3RhdGljIElFbnVtSURMaXN0X1ZUYWJsZSBlaWRsdnQgPSAKLXsgSUVudW1JRExpc3RfUXVlcnlJbnRlcmZhY2UsCi0JSUVudW1JRExpc3RfQWRkUmVmLAotCUlFbnVtSURMaXN0X1JlbGVhc2UsCi0JSUVudW1JRExpc3RfTmV4dCwKLQlJRW51bUlETGlzdF9Ta2lwLAotCUlFbnVtSURMaXN0X1Jlc2V0LAotICBJRW51bUlETGlzdF9DbG9uZSwKLQlJRW51bUlETGlzdF9DcmVhdGVFbnVtTGlzdCwKLSAgSUVudW1JRExpc3RfQWRkVG9FbnVtTGlzdCwKLQlJRW51bUlETGlzdF9EZWxldGVMaXN0Ci19OwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBJRW51bUlETGlzdF9Db25zdHJ1Y3RvcgotICovCi0KLUxQRU5VTUlETElTVCBJRW51bUlETGlzdF9Db25zdHJ1Y3RvciggTFBDU1RSIGxwc3pQYXRoLCBEV09SRCBkd0ZsYWdzLCBIUkVTVUxUKiBwUmVzdWx0KQotewlMUEVOVU1JRExJU1QJbHBlaWRsOwotCi0JbHBlaWRsID0gKExQRU5VTUlETElTVClIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwwLHNpemVvZihJRW51bUlETGlzdCkpOwotCWxwZWlkbC0+cmVmID0gMTsKLQlscGVpZGwtPmxwdnRibCA9ICZlaWRsdnQ7Ci0JbHBlaWRsLT5tcEZpcnN0PU5VTEw7Ci0JbHBlaWRsLT5tcExhc3Q9TlVMTDsKLQlscGVpZGwtPm1wQ3VycmVudD1OVUxMOwotCi0gIFRSQUNFKHNoZWxsLCIoJXApLT4oJXMgMHglMDhseCAlcClcbiIsbHBlaWRsLGRlYnVnc3RyX2EobHBzelBhdGgpLGR3RmxhZ3MscFJlc3VsdCk7Ci0KLQlscGVpZGwtPm1wUGlkbE1ncj1QaWRsTWdyX0NvbnN0cnVjdG9yKCk7Ci0gIGlmICghbHBlaWRsLT5tcFBpZGxNZ3IpCi0JeyBpZiAocFJlc3VsdCkKLQkgIHsgKnBSZXN1bHQ9RV9PVVRPRk1FTU9SWTsKLQkJCUhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksMCxscGVpZGwpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQl9Ci0KLQlpZighSUVudW1JRExpc3RfQ3JlYXRlRW51bUxpc3QobHBlaWRsLCBscHN6UGF0aCwgZHdGbGFncykpCi0gIHsgaWYocFJlc3VsdCkKLSAgICB7ICpwUmVzdWx0ID0gRV9PVVRPRk1FTU9SWTsKLQkJCUhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksMCxscGVpZGwtPm1wUGlkbE1ncik7Ci0JCQlIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLDAsbHBlaWRsKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0gIH0KLQotICBUUkFDRShzaGVsbCwiLS0gKCVwKS0+KClcbiIsbHBlaWRsKTsKLQlyZXR1cm4gbHBlaWRsOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBFbnVtSURMaXN0OjpRdWVyeUludGVyZmFjZQotICovCi1zdGF0aWMgSFJFU1VMVCBXSU5BUEkgSUVudW1JRExpc3RfUXVlcnlJbnRlcmZhY2UoCi0gIExQRU5VTUlETElTVCB0aGlzLCBSRUZJSUQgcmlpZCwgTFBWT0lEICpwcHZPYmopCi17ICBjaGFyCXhyaWlkWzUwXTsKLSAgIFdJTkVfU3RyaW5nRnJvbUNMU0lEKChMUENMU0lEKXJpaWQseHJpaWQpOwotICAgVFJBQ0Uoc2hlbGwsIiglcCktPihcblx0SUlEOlx0JXMsJXApXG4iLHRoaXMseHJpaWQscHB2T2JqKTsKLQotICAqcHB2T2JqID0gTlVMTDsKLQotICBpZihJc0VxdWFsSUlEKHJpaWQsICZJSURfSVVua25vd24pKSAgICAgICAgICAvKklVbmtub3duKi8KLSAgeyAqcHB2T2JqID0gdGhpczsgCi0gIH0KLSAgZWxzZSBpZihJc0VxdWFsSUlEKHJpaWQsICZJSURfSUVudW1JRExpc3QpKSAgLypJRW51bUlETGlzdCovCi0gIHsgICAgKnBwdk9iaiA9IChJRW51bUlETGlzdCopdGhpczsKLSAgfSAgIAotCi0gIGlmKCpwcHZPYmopCi0gIHsgKCooTFBFTlVNSURMSVNUKilwcHZPYmopLT5scHZ0YmwtPmZuQWRkUmVmKHRoaXMpOyAgCQotICAgIFRSQUNFKHNoZWxsLCItLSBJbnRlcmZhY2U6ICglcCktPiglcClcbiIscHB2T2JqLCpwcHZPYmopOwotICAgIHJldHVybiBTX09LOwotICB9Ci0JVFJBQ0Uoc2hlbGwsIi0tIEludGVyZmFjZTogRV9OT0lOVEVSRkFDRVxuIik7Ci0JcmV0dXJuIEVfTk9JTlRFUkZBQ0U7Ci19ICAgCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIElFbnVtSURMaXN0X0FkZFJlZgotICovCi1zdGF0aWMgVUxPTkcgV0lOQVBJIElFbnVtSURMaXN0X0FkZFJlZihMUEVOVU1JRExJU1QgdGhpcykKLXsgVFJBQ0Uoc2hlbGwsIiglcCktPigpXG4iLHRoaXMpOwotCXJldHVybiArKyh0aGlzLT5yZWYpOwotfQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogSUVudW1JRExpc3RfUmVsZWFzZQotICovCi1zdGF0aWMgVUxPTkcgV0lOQVBJIElFbnVtSURMaXN0X1JlbGVhc2UoTFBFTlVNSURMSVNUIHRoaXMpCi17CVRSQUNFKHNoZWxsLCIoJXApLT4oKVxuIix0aGlzKTsKLQlpZiAoIS0tKHRoaXMtPnJlZikpIAotCXsgVFJBQ0Uoc2hlbGwsIiBkZXN0cm95aW5nIElFbnVtSURMaXN0KCVwKVxuIix0aGlzKTsKLQkJSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwwLHRoaXMpOwotCQlyZXR1cm4gMDsKLQl9Ci0JcmV0dXJuIHRoaXMtPnJlZjsKLX0KLSAgIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgSUVudW1JRExpc3RfTmV4dAotICovCi0KLXN0YXRpYyBIUkVTVUxUIFdJTkFQSSBJRW51bUlETGlzdF9OZXh0KAotCUxQRU5VTUlETElTVCB0aGlzLFVMT05HIGNlbHQsTFBJVEVNSURMSVNUICogcmdlbHQsVUxPTkcgKnBjZWx0RmV0Y2hlZCkgCi17IFVMT05HICAgIGk7Ci0gIEhSRVNVTFQgIGhyID0gU19PSzsKLSAgTFBJVEVNSURMSVNUICB0ZW1wOwotCi0JVFJBQ0Uoc2hlbGwsIiglcCktPiglbGQsJXAsICVwKVxuIix0aGlzLGNlbHQscmdlbHQscGNlbHRGZXRjaGVkKTsKLQotICAvKiBJdCBpcyB2YWxpZCB0byBsZWF2ZSBwY2VsdEZldGNoZWQgTlVMTCB3aGVuIGNlbHQgaXMgMS4gU29tZSBvZiBleHBsb3JlcidzCi0gICAgIHN1YnN5c3RlbXMgYWN0dWFsbHkgdXNlIGl0IChhbmQgc28gbWF5IGEgdGhpcmQgcGFydHkgYnJvd3NlcikKLSAgICovCi0gIGlmKHBjZWx0RmV0Y2hlZCkKLSAgICAqcGNlbHRGZXRjaGVkID0gMDsKLQotCSpyZ2VsdD0wOwotCQotICBpZihjZWx0ID4gMSAmJiAhcGNlbHRGZXRjaGVkKQotICB7IHJldHVybiBFX0lOVkFMSURBUkc7Ci0JfQotCi0gIGZvcihpID0gMDsgaSA8IGNlbHQ7IGkrKykKLSAgeyBpZighKHRoaXMtPm1wQ3VycmVudCkpCi0gICAgeyBociA9ICBTX0ZBTFNFOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIHRlbXAgPSBJTENsb25lKHRoaXMtPm1wQ3VycmVudC0+cGlkbCk7Ci0gICAgcmdlbHRbaV0gPSB0ZW1wOwotICAgIHRoaXMtPm1wQ3VycmVudCA9IHRoaXMtPm1wQ3VycmVudC0+cE5leHQ7Ci0gIH0KLSAgaWYocGNlbHRGZXRjaGVkKQotICB7ICAqcGNlbHRGZXRjaGVkID0gaTsKLQl9Ci0KLSAgcmV0dXJuIGhyOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogIElFbnVtSURMaXN0X1NraXAKLSovCi1zdGF0aWMgSFJFU1VMVCBXSU5BUEkgSUVudW1JRExpc3RfU2tpcCgKLQlMUEVOVU1JRExJU1QgdGhpcyxVTE9ORyBjZWx0KQoteyBEV09SRCAgICBkd0luZGV4OwotICBIUkVTVUxUICBociA9IFNfT0s7Ci0KLSAgVFJBQ0Uoc2hlbGwsIiglcCktPiglbHUpXG4iLHRoaXMsY2VsdCk7Ci0KLSAgZm9yKGR3SW5kZXggPSAwOyBkd0luZGV4IDwgY2VsdDsgZHdJbmRleCsrKQotICB7IGlmKCF0aGlzLT5tcEN1cnJlbnQpCi0gICAgeyBociA9IFNfRkFMU0U7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgdGhpcy0+bXBDdXJyZW50ID0gdGhpcy0+bXBDdXJyZW50LT5wTmV4dDsKLSAgfQotICByZXR1cm4gaHI7Ci19Ci0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogIElFbnVtSURMaXN0X1Jlc2V0Ci0qLwotc3RhdGljIEhSRVNVTFQgV0lOQVBJIElFbnVtSURMaXN0X1Jlc2V0KExQRU5VTUlETElTVCB0aGlzKQoteyBUUkFDRShzaGVsbCwiKCVwKVxuIix0aGlzKTsKLSAgdGhpcy0+bXBDdXJyZW50ID0gdGhpcy0+bXBGaXJzdDsKLSAgcmV0dXJuIFNfT0s7Ci19Ci0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogIElFbnVtSURMaXN0X0Nsb25lCi0qLwotc3RhdGljIEhSRVNVTFQgV0lOQVBJIElFbnVtSURMaXN0X0Nsb25lKAotCUxQRU5VTUlETElTVCB0aGlzLExQRU5VTUlETElTVCAqIHBwZW51bSkKLXsgVFJBQ0Uoc2hlbGwsIiglcCktPigpIHRvICglcCktPigpIEVfTk9USU1QTFxuIix0aGlzLHBwZW51bSk7Ci0JcmV0dXJuIEVfTk9USU1QTDsKLX0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIEVudW1JRExpc3RfQ3JlYXRlRW51bUxpc3QoKQotICogIGZpeG1lOiBkZXZpY2VzIG5vdCBoYW5kbGVkCi0gKiAgZml4bWU6IGFkZCB3aWxkY2FyZHMgdG8gcGF0aAotICovCi1zdGF0aWMgQk9PTDMyIFdJTkFQSSBJRW51bUlETGlzdF9DcmVhdGVFbnVtTGlzdChMUEVOVU1JRExJU1QgdGhpcywgTFBDU1RSIGxwc3pQYXRoLCBEV09SRCBkd0ZsYWdzKQoteyBMUElURU1JRExJU1QgICBwaWRsPU5VTEw7Ci0gIFdJTjMyX0ZJTkRfREFUQTMyQSBzdGZmaWxlOwkKLSAgSEFORExFMzIgaEZpbGU7Ci0gIERXT1JEIGR3RHJpdmVtYXA7Ci0gIENIQVIgIHN6RHJpdmVOYW1lWzRdOwotICBDSEFSICBzelBhdGhbTUFYX1BBVEhdOwotICAgIAotICBUUkFDRShzaGVsbCwiKCVwKS0+KCVzIDB4JTA4bHgpIFxuIix0aGlzLGRlYnVnc3RyX2EobHBzelBhdGgpLGR3RmxhZ3MpOwotCi0gIGlmIChscHN6UGF0aCAmJiBscHN6UGF0aFswXSE9J1wwJykKLSAgeyBzdHJjcHkoc3pQYXRoLCBscHN6UGF0aCk7Ci0gICAgUGF0aEFkZEJhY2tzbGFzaChzelBhdGgpOwotICAgIHN0cmNhdChzelBhdGgsIiouKiIpOwotICB9Ci0KLSAgLyplbnVtZXJhdGUgdGhlIGZvbGRlcnMqLwotICBpZihkd0ZsYWdzICYgU0hDT05URl9GT0xERVJTKQotICB7CS8qIHNwZWNpYWwgY2FzZSAtIHdlIGNhbid0IGVudW1lcmF0ZSB0aGUgRGVza3RvcCBsZXZlbCBPYmplY3RzIChNeUNvbXB1dGVyLE5ldGhvb2QuLi4KLSAgICBzbyB3ZSBuZWVkIHRvIGZha2UgYW4gZW51bWVyYXRpb24gb2YgdGhvc2UuKi8KLQkgIGlmKCFscHN6UGF0aCkKLSAgICB7IFRSQUNFIChzaGVsbCwiLS0gKCVwKS0+IGVudW1lcmF0ZSBTSENPTlRGX0ZPTERFUlMgKHNwZWNpYWwpIGl0ZW1zXG4iLHRoaXMpOwotICAJCS8vY3JlYXRlIHRoZSBwaWRsIGZvciB0aGlzIGl0ZW0KLSAgICAgIHBpZGwgPSB0aGlzLT5tcFBpZGxNZ3ItPmxwdnRibC0+Zm5DcmVhdGVNeUNvbXB1dGVyKHRoaXMtPm1wUGlkbE1ncik7Ci0gICAgICBpZihwaWRsKQotICAgICAgeyBpZighSUVudW1JRExpc3RfQWRkVG9FbnVtTGlzdCh0aGlzLCBwaWRsKSkKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgfQotICAgIH0gICAKLSAgICBlbHNlIGlmIChscHN6UGF0aFswXT09J1wwJykgLyogZW51bWVyYXRlIHRoZSBkcml2ZXMqLwotICAgIHsgVFJBQ0UgKHNoZWxsLCItLSAoJXApLT4gZW51bWVyYXRlIFNIQ09OVEZfRk9MREVSUyAoZHJpdmVzKVxuIix0aGlzKTsKLSAgICAgIGR3RHJpdmVtYXAgPSBHZXRMb2dpY2FsRHJpdmVzKCk7Ci0gICAgICBzdHJjcHkgKHN6RHJpdmVOYW1lLCJBOlxcIik7Ci0gICAgICB3aGlsZSAoc3pEcml2ZU5hbWVbMF08PSdaJykKLSAgICAgIHsgaWYoZHdEcml2ZW1hcCAmIDB4MDAwMDAwMDFMKQotICAgICAgICB7IHBpZGwgPSB0aGlzLT5tcFBpZGxNZ3ItPmxwdnRibC0+Zm5DcmVhdGVEcml2ZSh0aGlzLT5tcFBpZGxNZ3Isc3pEcml2ZU5hbWUgKTsKLSAgICAgIGlmKHBpZGwpCi0gICAgICB7IGlmKCFJRW51bUlETGlzdF9BZGRUb0VudW1MaXN0KHRoaXMsIHBpZGwpKQotICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgIH0KLSAgICAgIH0KLSAgICAgICAgc3pEcml2ZU5hbWVbMF0rKzsKLSAgICAgICAgZHdEcml2ZW1hcCA9IGR3RHJpdmVtYXAgPj4gMTsKLSAgICAgfSAgIAotICAgIH0KLSAgICAKLSAgICAgZWxzZQotICAgIHsgVFJBQ0UgKHNoZWxsLCItLSAoJXApLT4gZW51bWVyYXRlIFNIQ09OVEZfRk9MREVSUyBvZiAlc1xuIix0aGlzLGRlYnVnc3RyX2Eoc3pQYXRoKSk7Ci0gICAgICBoRmlsZSA9IEZpbmRGaXJzdEZpbGUzMkEoc3pQYXRoLCZzdGZmaWxlKTsKLSAgICAgIGlmICggaEZpbGUgIT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUzMiApCi0gICAgICB7IGRvCi0gICAgICAgIHsgaWYgKCAoc3RmZmlsZS5kd0ZpbGVBdHRyaWJ1dGVzICYgRklMRV9BVFRSSUJVVEVfRElSRUNUT1JZKSAmJiBzdHJjbXAgKHN0ZmZpbGUuY0ZpbGVOYW1lLCAiLiIpICYmIHN0cmNtcCAoc3RmZmlsZS5jRmlsZU5hbWUsICIuLiIpKQotICAgICAgICAgIHsgcGlkbCA9IHRoaXMtPm1wUGlkbE1nci0+bHB2dGJsLT5mbkNyZWF0ZUZvbGRlcih0aGlzLT5tcFBpZGxNZ3IsIHN0ZmZpbGUuY0ZpbGVOYW1lKTsKLSAgICAgICAgIGlmKHBpZGwpCi0gICAgICAgICB7IGlmKCFJRW51bUlETGlzdF9BZGRUb0VudW1MaXN0KHRoaXMsIHBpZGwpKQotICAgICAgICAgICAgICAgeyAgcmV0dXJuIEZBTFNFOwotICAgICAgICAgICAgICAgfQotICAgICAgICAgfQotICAgICAgICAgZWxzZQotICAgICAgICAgeyByZXR1cm4gRkFMU0U7Ci0gICAgICAgICB9ICAgCi0gICAgICAgICAgIH0KLSAgICAgIH0gd2hpbGUoIEZpbmROZXh0RmlsZTMyQShoRmlsZSwmc3RmZmlsZSkpOwotCQkJRmluZENsb3NlMzIgKGhGaWxlKTsKLSAgICB9Ci0gIH0gICAKLSAgfSAgIAotICAvL2VudW1lcmF0ZSB0aGUgbm9uLWZvbGRlciBpdGVtcyAodmFsdWVzKQotICBpZihkd0ZsYWdzICYgU0hDT05URl9OT05GT0xERVJTKQotICB7IGlmKGxwc3pQYXRoKQotICAgIHsgVFJBQ0UgKHNoZWxsLCItLSAoJXApLT4gZW51bWVyYXRlIFNIQ09OVEZfTk9ORk9MREVSUyBvZiAlc1xuIix0aGlzLGRlYnVnc3RyX2Eoc3pQYXRoKSk7Ci0gICAgICBoRmlsZSA9IEZpbmRGaXJzdEZpbGUzMkEoc3pQYXRoLCZzdGZmaWxlKTsKLSAgICAgIGlmICggaEZpbGUgIT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUzMiApCi0gICAgICB7IGRvCi0gICAgeyBpZiAoISAoc3RmZmlsZS5kd0ZpbGVBdHRyaWJ1dGVzICYgRklMRV9BVFRSSUJVVEVfRElSRUNUT1JZKSApCi0gICAgICAgICAgeyBwaWRsID0gdGhpcy0+bXBQaWRsTWdyLT5scHZ0YmwtPmZuQ3JlYXRlVmFsdWUodGhpcy0+bXBQaWRsTWdyLCBzdGZmaWxlLmNGaWxlTmFtZSk7Ci0gICAgICBpZihwaWRsKQotICAgICAgeyBpZighSUVudW1JRExpc3RfQWRkVG9FbnVtTGlzdCh0aGlzLCBwaWRsKSkKLSAgICAgICAgeyByZXR1cm4gRkFMU0U7Ci0JCQkgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsgcmV0dXJuIEZBTFNFOwotICAgICAgfSAgIAotICAgICAgICAgIH0KLSAgICB9IHdoaWxlKCBGaW5kTmV4dEZpbGUzMkEoaEZpbGUsJnN0ZmZpbGUpKTsKLQkgIEZpbmRDbG9zZTMyIChoRmlsZSk7Ci0gIH0gCi0gICAgfQotICB9IAotICByZXR1cm4gVFJVRTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgRW51bUlETGlzdF9BZGRUb0VudW1MaXN0KCkKLSAqLwotc3RhdGljIEJPT0wzMiBXSU5BUEkgSUVudW1JRExpc3RfQWRkVG9FbnVtTGlzdChMUEVOVU1JRExJU1QgdGhpcyxMUElURU1JRExJU1QgcGlkbCkKLXsgTFBFTlVNTElTVCAgcE5ldzsKLQotICBUUkFDRShzaGVsbCwiKCVwKS0+KHBpZGw9JXApXG4iLHRoaXMscGlkbCk7Ci0gIHBOZXcgPSAoTFBFTlVNTElTVClIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwwLHNpemVvZihFTlVNTElTVCkpOwotICBpZihwTmV3KQotICB7IC8vc2V0IHRoZSBuZXh0IHBvaW50ZXIKLSAgICBwTmV3LT5wTmV4dCA9IE5VTEw7Ci0gICAgcE5ldy0+cGlkbCA9IHBpZGw7Ci0KLSAgICAvL2lzIHRoaXMgdGhlIGZpcnN0IGl0ZW0gaW4gdGhlIGxpc3Q/Ci0gICAgaWYoIXRoaXMtPm1wRmlyc3QpCi0gICAgeyB0aGlzLT5tcEZpcnN0ID0gcE5ldzsKLSAgICAgIHRoaXMtPm1wQ3VycmVudCA9IHBOZXc7Ci0gICAgfQotICAgCi0gICAgaWYodGhpcy0+bXBMYXN0KQotICAgIHsgLy9hZGQgdGhlIG5ldyBpdGVtIHRvIHRoZSBlbmQgb2YgdGhlIGxpc3QKLSAgICAgIHRoaXMtPm1wTGFzdC0+cE5leHQgPSBwTmV3OwotICAgIH0KLSAgIAotICAgIC8vdXBkYXRlIHRoZSBsYXN0IGl0ZW0gcG9pbnRlcgotICAgIHRoaXMtPm1wTGFzdCA9IHBOZXc7Ci0gICAgVFJBQ0Uoc2hlbGwsIi0tICglcCktPihmaXJzdD0lcCwgbGFzdD0lcClcbiIsdGhpcyx0aGlzLT5tcEZpcnN0LHRoaXMtPm1wTGFzdCk7Ci0gICAgcmV0dXJuIFRSVUU7Ci0gIH0KLSAgcmV0dXJuIEZBTFNFOwotfQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qICAgRW51bUlETGlzdF9EZWxldGVMaXN0KCkKLSovCi1zdGF0aWMgQk9PTDMyIFdJTkFQSSBJRW51bUlETGlzdF9EZWxldGVMaXN0KExQRU5VTUlETElTVCB0aGlzKQoteyBMUEVOVU1MSVNUICBwRGVsZXRlOwotCi0gIFRSQUNFKHNoZWxsLCIoJXApLT4oKVxuIix0aGlzKTsKLQkKLSAgd2hpbGUodGhpcy0+bXBGaXJzdCkKLSAgeyBwRGVsZXRlID0gdGhpcy0+bXBGaXJzdDsKLSAgICB0aGlzLT5tcEZpcnN0ID0gcERlbGV0ZS0+cE5leHQ7Ci0gICAgU0hGcmVlKHBEZWxldGUtPnBpZGwpOwotICAgIFNIRnJlZShwRGVsZXRlKTsKLSAgfQotICB0aGlzLT5tcEZpcnN0ID0gdGhpcy0+bXBMYXN0ID0gdGhpcy0+bXBDdXJyZW50ID0gTlVMTDsKLSAgcmV0dXJuIFRSVUU7Ci19Ci0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogICBJU2hlbGxWaWV3IGltcGxlbWVudGF0aW9uCi0qLwotc3RhdGljIEhSRVNVTFQgV0lOQVBJIElTaGVsbFZpZXdfUXVlcnlJbnRlcmZhY2UoTFBTSEVMTFZJRVcsUkVGSUlEIHJpaWQsIExQVk9JRCAqcHB2T2JqKTsKLXN0YXRpYyBVTE9ORyBXSU5BUEkgSVNoZWxsVmlld19BZGRSZWYoTFBTSEVMTFZJRVcpIDsKLXN0YXRpYyBVTE9ORyBXSU5BUEkgSVNoZWxsVmlld19SZWxlYXNlKExQU0hFTExWSUVXKTsKLQotICAgIC8vICoqKiBJT2xlV2luZG93IG1ldGhvZHMgKioqCi1zdGF0aWMgSFJFU1VMVCBXSU5BUEkgSVNoZWxsVmlld19HZXRXaW5kb3coTFBTSEVMTFZJRVcsSFdORDMyICogbHBod25kKTsKLXN0YXRpYyBIUkVTVUxUIFdJTkFQSSBJU2hlbGxWaWV3X0NvbnRleHRTZW5zaXRpdmVIZWxwKExQU0hFTExWSUVXLEJPT0wzMiBmRW50ZXJNb2RlKTsKLQotICAgIC8vICoqKiBJU2hlbGxWaWV3IG1ldGhvZHMgKioqCi1zdGF0aWMgSFJFU1VMVCBXSU5BUEkgSVNoZWxsVmlld19UcmFuc2xhdGVBY2NlbGVyYXRvcihMUFNIRUxMVklFVyxMUE1TRzMyIGxwbXNnKTsKLXN0YXRpYyBIUkVTVUxUIFdJTkFQSSBJU2hlbGxWaWV3X0VuYWJsZU1vZGVsZXNzKExQU0hFTExWSUVXLEJPT0wzMiBmRW5hYmxlKTsKLXN0YXRpYyBIUkVTVUxUIFdJTkFQSSBJU2hlbGxWaWV3X1VJQWN0aXZhdGUoTFBTSEVMTFZJRVcsVUlOVDMyIHVTdGF0ZSk7Ci1zdGF0aWMgSFJFU1VMVCBXSU5BUEkgSVNoZWxsVmlld19SZWZyZXNoKExQU0hFTExWSUVXKTsKLXN0YXRpYyBIUkVTVUxUIFdJTkFQSSBJU2hlbGxWaWV3X0NyZWF0ZVZpZXdXaW5kb3coTFBTSEVMTFZJRVcsIElTaGVsbFZpZXcgKmxwUHJldlZpZXcsTFBDRk9MREVSU0VUVElOR1MgbHBmcywgSVNoZWxsQnJvd3NlciAqIHBzYixSRUNUMzIgKiBwcmNWaWV3LCBIV05EMzIgICpwaFduZCk7Ci1zdGF0aWMgSFJFU1VMVCBXSU5BUEkgSVNoZWxsVmlld19EZXN0cm95Vmlld1dpbmRvdyhMUFNIRUxMVklFVyk7Ci1zdGF0aWMgSFJFU1VMVCBXSU5BUEkgSVNoZWxsVmlld19HZXRDdXJyZW50SW5mbyhMUFNIRUxMVklFVywgTFBGT0xERVJTRVRUSU5HUyBscGZzKTsKLXN0YXRpYyBIUkVTVUxUIFdJTkFQSSBJU2hlbGxWaWV3X0FkZFByb3BlcnR5U2hlZXRQYWdlcyhMUFNIRUxMVklFVywgRFdPUkQgZHdSZXNlcnZlZCxMUEZOQUREUFJPUFNIRUVUUEFHRSBscGZuLCBMUEFSQU0gbHBhcmFtKTsKLXN0YXRpYyBIUkVTVUxUIFdJTkFQSSBJU2hlbGxWaWV3X1NhdmVWaWV3U3RhdGUoTFBTSEVMTFZJRVcpOwotc3RhdGljIEhSRVNVTFQgV0lOQVBJIElTaGVsbFZpZXdfU2VsZWN0SXRlbShMUFNIRUxMVklFVywgTFBDSVRFTUlETElTVCBwaWRsSXRlbSwgVUlOVDMyIHVGbGFncyk7Ci1zdGF0aWMgSFJFU1VMVCBXSU5BUEkgSVNoZWxsVmlld19HZXRJdGVtT2JqZWN0KExQU0hFTExWSUVXLCBVSU5UMzIgdUl0ZW0sIFJFRklJRCByaWlkLExQVk9JRCAqcHB2KTsKLQotc3RhdGljIHN0cnVjdCBJU2hlbGxWaWV3X1ZUYWJsZSBzdnZ0ID0gCi17IElTaGVsbFZpZXdfUXVlcnlJbnRlcmZhY2UsCi0gIElTaGVsbFZpZXdfQWRkUmVmLAotICBJU2hlbGxWaWV3X1JlbGVhc2UsCi0gIElTaGVsbFZpZXdfR2V0V2luZG93LAotICBJU2hlbGxWaWV3X0NvbnRleHRTZW5zaXRpdmVIZWxwLAotICBJU2hlbGxWaWV3X1RyYW5zbGF0ZUFjY2VsZXJhdG9yLAotICBJU2hlbGxWaWV3X0VuYWJsZU1vZGVsZXNzLAotICBJU2hlbGxWaWV3X1VJQWN0aXZhdGUsCi0gIElTaGVsbFZpZXdfUmVmcmVzaCwKLSAgSVNoZWxsVmlld19DcmVhdGVWaWV3V2luZG93LAotICBJU2hlbGxWaWV3X0Rlc3Ryb3lWaWV3V2luZG93LAotICBJU2hlbGxWaWV3X0dldEN1cnJlbnRJbmZvLAotICBJU2hlbGxWaWV3X0FkZFByb3BlcnR5U2hlZXRQYWdlcywKLSAgSVNoZWxsVmlld19TYXZlVmlld1N0YXRlLAotICBJU2hlbGxWaWV3X1NlbGVjdEl0ZW0sCi0gIElTaGVsbFZpZXdfR2V0SXRlbU9iamVjdAotfTsKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiAgSVNoZWxsVmlld19Db25zdHJ1Y3RvcgotKi8KLUxQU0hFTExWSUVXIElTaGVsbFZpZXdfQ29uc3RydWN0b3IoTFBTSEVMTEZPTERFUiBwRm9sZGVyLCBMUENJVEVNSURMSVNUIHBpZGwpCi17IExQU0hFTExWSUVXIHN2OwotICBzdj0oTFBTSEVMTFZJRVcpSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksMCxzaXplb2YoSVNoZWxsVmlldykpOwotICBzdi0+cmVmPTE7Ci0gIHN2LT5scHZ0Ymw9JnN2dnQ7Ci0gIAotICBzdi0+bXBpZGwgPSBJTENsb25lKHBpZGwpOwotCi0gIHN2LT5wU0ZQYXJlbnQgPSBwRm9sZGVyOwotICBpZihzdi0+cFNGUGFyZW50KQotICAgIHN2LT5wU0ZQYXJlbnQtPmxwdnRibC0+Zm5BZGRSZWYoc3YtPnBTRlBhcmVudCk7Ci0KLSAgVFJBQ0Uoc2hlbGwsIiglcCktPiglcCBwaWRsPSVwKVxuIixzdiwgcEZvbGRlciwgcGlkbCk7Ci0gIHJldHVybiBzdjsKLX0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiAgU2hlbGxWaWV3X1duZFByb2MKLSovCi1MUkVTVUxUIENBTExCQUNLIFNoZWxsVmlld19XbmRQcm9jKEhXTkQzMiBoV25kLCBVSU5UMzIgdU1lc3NhZ2UsIFdQQVJBTTMyIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSkKLXsgTFBTSEVMTFZJRVcgcFRoaXMgPSAoTFBTSEVMTFZJRVcpR2V0V2luZG93TG9uZzMyQShoV25kLCBHV0xfVVNFUkRBVEEpOwotICBMUENSRUFURVNUUlVDVDMyQSBscGNzOwotCi0gIEZJWE1FKHNoZWxsLCIoaHduZD0leCBtc2c9JXggd3Bhcm09JXggbHBhcm09JWx4KVxuIixoV25kLCB1TWVzc2FnZSwgd1BhcmFtLCBsUGFyYW0pOwotICAgIAotICBzd2l0Y2ggKHVNZXNzYWdlKQotICB7IGNhc2UgV01fTkNDUkVBVEU6Ci0gICAgICB7IFRSQUNFKHNoZWxsLCJXTV9OQ0NSRUFURVxuIik7Ci0gICAgICAgIGxwY3MgPSAoTFBDUkVBVEVTVFJVQ1QzMkEpbFBhcmFtOwotICAgICAgICBwVGhpcyA9IChMUFNIRUxMVklFVykobHBjcy0+bHBDcmVhdGVQYXJhbXMpOwotICAgICAgICBTZXRXaW5kb3dMb25nMzJBKGhXbmQsIEdXTF9VU0VSREFUQSwgKExPTkcpcFRoaXMpOwotCi0gICAgICAgIC8vc2V0IHRoZSB3aW5kb3cgaGFuZGxlCi0gICAgICAgIHBUaGlzLT5oV25kID0gaFduZDsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgCi0gICBjYXNlIFdNX1NJWkU6Ci0gICAgICBUUkFDRShzaGVsbCwiV01fU0laRVxuIik7Ci0gICAgICByZXR1cm4gRkFMU0U7Ci0gICAKLSAgIGNhc2UgV01fQ1JFQVRFOgotICAgICAgVFJBQ0Uoc2hlbGwsIldNX0NSRUFURVxuIik7Ci0gICAgICByZXR1cm4gRkFMU0U7Ci0gICAKLSAgIGNhc2UgV01fU0VURk9DVVM6Ci0gICAgICBUUkFDRShzaGVsbCwiV01fU0VURk9DVVNcbiIpOyAgIAotICAgICAgcmV0dXJuIEZBTFNFOwotICAgCi0gICBjYXNlIFdNX0tJTExGT0NVUzoKLSAgICAgIFRSQUNFKHNoZWxsLCJXTV9LSUxMRk9DVVNcbiIpOwotICAgICAgcmV0dXJuIEZBTFNFOwotCi0gICBjYXNlIFdNX0FDVElWQVRFOgotICAgICAgVFJBQ0Uoc2hlbGwsIldNX0FDVElWQVRFXG4iKTsKLSAgICAgIHJldHVybiBGQUxTRTsKLSAgIAotICAgY2FzZSBXTV9DT01NQU5EOgotICAgICAgVFJBQ0Uoc2hlbGwsIldNX0NPTU1BTkRcbiIpOwotICAgICAgcmV0dXJuIEZBTFNFOwotICAgCi0gICBjYXNlIFdNX0lOSVRNRU5VUE9QVVA6Ci0gICAgICBUUkFDRShzaGVsbCwiV01fSU5JVE1FTlVQT1BVUFxuIik7Ci0gICAgICByZXR1cm4gRkFMU0U7Ci0gICAKLSAgIGNhc2UgV01fTk9USUZZOgotICAgICAgVFJBQ0Uoc2hlbGwsIldNX05PVElGWVxuIik7Ci0gICAgICByZXR1cm4gRkFMU0U7Ci0gICAKLS8qICAgY2FzZSBXTV9TRVRUSU5HQ0hBTkdFOgotICAgICAgcmV0dXJuIEZBTFNFOyovCi0gIH0KLQotICByZXR1cm4gRGVmV2luZG93UHJvYzMyQSAoaFduZCwgdU1lc3NhZ2UsIHdQYXJhbSwgbFBhcmFtKTsKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogIElTaGVsbFZpZXc6OlF1ZXJ5SW50ZXJmYWNlCi0qLwotc3RhdGljIEhSRVNVTFQgV0lOQVBJIElTaGVsbFZpZXdfUXVlcnlJbnRlcmZhY2UoTFBTSEVMTFZJRVcgdGhpcyxSRUZJSUQgcmlpZCwgTFBWT0lEICpwcHZPYmopCi17IGNoYXIgICAgeHJpaWRbNTBdOwotICBXSU5FX1N0cmluZ0Zyb21DTFNJRCgoTFBDTFNJRClyaWlkLHhyaWlkKTsKLSAgVFJBQ0Uoc2hlbGwsIiglcCktPihcblx0SUlEOlx0JXMsJXApXG4iLHRoaXMseHJpaWQscHB2T2JqKTsKLQotICAqcHB2T2JqID0gTlVMTDsKLQotICBpZihJc0VxdWFsSUlEKHJpaWQsICZJSURfSVVua25vd24pKSAgICAgICAgICAvKklVbmtub3duKi8KLSAgeyAqcHB2T2JqID0gdGhpczsgCi0gIH0KLSAgZWxzZSBpZihJc0VxdWFsSUlEKHJpaWQsICZJSURfSVNoZWxsVmlldykpICAvKklTaGVsbFZpZXcqLwotICB7ICpwcHZPYmogPSAoSVNoZWxsVmlldyopdGhpczsKLSAgfSAgIAotCi0gIGlmKCpwcHZPYmopCi0gIHsgKCooTFBTSEVMTFZJRVcqKXBwdk9iaiktPmxwdnRibC0+Zm5BZGRSZWYodGhpcyk7ICAgICAgCi0gICAgVFJBQ0Uoc2hlbGwsIi0tIEludGVyZmFjZTogKCVwKS0+KCVwKVxuIixwcHZPYmosKnBwdk9iaik7Ci0gICAgcmV0dXJuIFNfT0s7Ci0gIH0KLSAgVFJBQ0Uoc2hlbGwsIi0tIEludGVyZmFjZTogRV9OT0lOVEVSRkFDRVxuIik7Ci0gIHJldHVybiBFX05PSU5URVJGQUNFOwotfSAgIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qICBJU2hlbGxWaWV3OjpBZGRSZWYKLSovCi1zdGF0aWMgVUxPTkcgV0lOQVBJIElTaGVsbFZpZXdfQWRkUmVmKExQU0hFTExWSUVXIHRoaXMpCi17IFRSQUNFKHNoZWxsLCIoJXApLT4oY291bnQ9JWx1KVxuIix0aGlzLCh0aGlzLT5yZWYpKzEpOwotICByZXR1cm4gKysodGhpcy0+cmVmKTsKLX0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiAgSVNoZWxsVmlldzo6UmVsZWFzZQotKi8KLXN0YXRpYyBVTE9ORyBXSU5BUEkgSVNoZWxsVmlld19SZWxlYXNlKExQU0hFTExWSUVXIHRoaXMpCi17IFRSQUNFKHNoZWxsLCIoJXApLT4oKVxuIix0aGlzKTsKLSAgaWYgKCEtLSh0aGlzLT5yZWYpKSAKLSAgeyBUUkFDRShzaGVsbCwiIGRlc3Ryb3lpbmcgSUVudW1JRExpc3QoJXApXG4iLHRoaXMpOwotCi0gICAgaWYodGhpcy0+cFNGUGFyZW50KQotICAgICAgIHRoaXMtPnBTRlBhcmVudC0+bHB2dGJsLT5mblJlbGVhc2UodGhpcy0+cFNGUGFyZW50KTsKLQotICAgIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksMCx0aGlzKTsKLSAgICByZXR1cm4gMDsKLSAgfQotICByZXR1cm4gdGhpcy0+cmVmOwotfQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qICBJU2hlbGxWaWV3OjpHZXRXaW5kb3cKLSovCi1zdGF0aWMgSFJFU1VMVCBXSU5BUEkgSVNoZWxsVmlld19HZXRXaW5kb3coTFBTSEVMTFZJRVcgdGhpcyxIV05EMzIgKiBwaFduZCkKLXsgVFJBQ0Uoc2hlbGwsIiglcCkgc3R1YlxuIix0aGlzKTsKLSAqcGhXbmQgPSB0aGlzLT5oV25kOwotCi0gcmV0dXJuIFNfT0s7Ci19Ci1zdGF0aWMgSFJFU1VMVCBXSU5BUEkgSVNoZWxsVmlld19Db250ZXh0U2Vuc2l0aXZlSGVscChMUFNIRUxMVklFVyB0aGlzLEJPT0wzMiBmRW50ZXJNb2RlKQoteyBGSVhNRShzaGVsbCwiKCVwKSBzdHViXG4iLHRoaXMpOwotICByZXR1cm4gRV9OT1RJTVBMOwotfQotc3RhdGljIEhSRVNVTFQgV0lOQVBJIElTaGVsbFZpZXdfVHJhbnNsYXRlQWNjZWxlcmF0b3IoTFBTSEVMTFZJRVcgdGhpcyxMUE1TRzMyIGxwbXNnKQoteyBGSVhNRShzaGVsbCwiKCVwKS0+KCVwKSBzdHViXG4iLHRoaXMsbHBtc2cpOwotICByZXR1cm4gRV9OT1RJTVBMOwotfQotc3RhdGljIEhSRVNVTFQgV0lOQVBJIElTaGVsbFZpZXdfRW5hYmxlTW9kZWxlc3MoTFBTSEVMTFZJRVcgdGhpcyxCT09MMzIgZkVuYWJsZSkKLXsgRklYTUUoc2hlbGwsIiglcCkgc3R1YlxuIix0aGlzKTsKLSAgcmV0dXJuIEVfTk9USU1QTDsKLX0KLXN0YXRpYyBIUkVTVUxUIFdJTkFQSSBJU2hlbGxWaWV3X1VJQWN0aXZhdGUoTFBTSEVMTFZJRVcgdGhpcyxVSU5UMzIgdVN0YXRlKQoteyBGSVhNRShzaGVsbCwiKCVwKSBzdHViXG4iLHRoaXMpOwotICByZXR1cm4gRV9OT1RJTVBMOwotfQotc3RhdGljIEhSRVNVTFQgV0lOQVBJIElTaGVsbFZpZXdfUmVmcmVzaChMUFNIRUxMVklFVyB0aGlzKQoteyBGSVhNRShzaGVsbCwiKCVwKSBzdHViXG4iLHRoaXMpOwotICByZXR1cm4gU19PSzsKLX0KLXN0YXRpYyBIUkVTVUxUIFdJTkFQSSBJU2hlbGxWaWV3X0NyZWF0ZVZpZXdXaW5kb3coTFBTSEVMTFZJRVcgdGhpcywgSVNoZWxsVmlldyAqbHBQcmV2VmlldywKLSAgICAgICAgICAgICAgICAgICAgIExQQ0ZPTERFUlNFVFRJTkdTIGxwZnMsIElTaGVsbEJyb3dzZXIgKiBwc2IsUkVDVDMyICogcHJjVmlldywgSFdORDMyICAqcGhXbmQpCi17ICBXTkRDTEFTUzMyQSB3YzsKLSAgICpwaFduZCA9IDA7Ci0KLSAgIFRSQUNFKHNoZWxsLCIoJXApLT4oc2hsdmlldz0lcCBzZXQ9JXAgc2hsYnJzPSVwIHJlYz0lcCBod25kPSVwKSBpbmNvbXBsZXRlXG4iLHRoaXMsIGxwUHJldlZpZXcsbHBmcywgcHNiLCBwcmNWaWV3LCBwaFduZCk7Ci0KLS8vaWYgb3VyIHdpbmRvdyBjbGFzcyBoYXMgbm90IGJlZW4gcmVnaXN0ZXJlZCwgdGhlbiBkbyBzbwotICBpZighR2V0Q2xhc3NJbmZvMzJBKHNoZWxsMzJfaEluc3RhbmNlLCBTVl9DTEFTU19OQU1FLCAmd2MpKQotICB7IFplcm9NZW1vcnkoJndjLCBzaXplb2Yod2MpKTsKLSAgICB3Yy5zdHlsZSAgICAgICAgICA9IENTX0hSRURSQVcgfCBDU19WUkVEUkFXOwotICAgIHdjLmxwZm5XbmRQcm9jICAgID0gKFdORFBST0MzMikgU2hlbGxWaWV3X1duZFByb2M7Ci0gICAgd2MuY2JDbHNFeHRyYSAgICAgPSAwOwotICAgIHdjLmNiV25kRXh0cmEgICAgID0gMDsKLSAgICB3Yy5oSW5zdGFuY2UgICAgICA9IHNoZWxsMzJfaEluc3RhbmNlOwotICAgIHdjLmhJY29uICAgICAgICAgID0gMDsKLSAgICB3Yy5oQ3Vyc29yICAgICAgICA9IExvYWRDdXJzb3IzMkEgKDAsIElEQ19BUlJPVzMyQSk7Ci0gICAgd2MuaGJyQmFja2dyb3VuZCAgPSAoSEJSVVNIMzIpKENPTE9SX1dJTkRPVyArIDEpOwotICAgIHdjLmxwc3pNZW51TmFtZSAgID0gTlVMTDsKLSAgICB3Yy5scHN6Q2xhc3NOYW1lICA9IFNWX0NMQVNTX05BTUU7Ci0gICAKLSAgICBpZighUmVnaXN0ZXJDbGFzczMyQSgmd2MpKQotICAgICAgcmV0dXJuIEVfRkFJTDsKLSAgIH0KLSAgIC8vc2V0IHVwIHRoZSBtZW1iZXIgdmFyaWFibGVzCi0gICB0aGlzLT5wU2hlbGxCcm93c2VyID0gcHNiOwotICAgdGhpcy0+Rm9sZGVyU2V0dGluZ3MgPSAqbHBmczsKLQotICAgLy9nZXQgb3VyIHBhcmVudCB3aW5kb3cKLSAgIHRoaXMtPnBTaGVsbEJyb3dzZXItPmxwdnRibC0+Zm5HZXRXaW5kb3codGhpcy0+cFNoZWxsQnJvd3NlciwgJih0aGlzLT5oV25kUGFyZW50KSk7Ci0KLSAgICpwaFduZCA9IENyZWF0ZVdpbmRvd0V4MzJBKDAsIFNWX0NMQVNTX05BTUUsIE5VTEwsIFdTX0NISUxEIHwgV1NfVklTSUJMRSB8IFdTX0NMSVBTSUJMSU5HUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHByY1ZpZXctPmxlZnQsIHByY1ZpZXctPnRvcCwgcHJjVmlldy0+cmlnaHQgLSBwcmNWaWV3LT5sZWZ0LCBwcmNWaWV3LT5ib3R0b20gLSBwcmNWaWV3LT50b3AsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT5oV25kUGFyZW50LCAwLCBzaGVsbDMyX2hJbnN0YW5jZSwgKExQVk9JRCl0aGlzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgaWYoISpwaFduZCkKLSAgICAgcmV0dXJuIEVfRkFJTDsKLQotICAgdGhpcy0+cFNoZWxsQnJvd3Nlci0+bHB2dGJsLT5mbkFkZFJlZih0aGlzLT5wU2hlbGxCcm93c2VyKTsKLQotICAgcmV0dXJuIFNfT0s7Ci19Ci0KLXN0YXRpYyBIUkVTVUxUIFdJTkFQSSBJU2hlbGxWaWV3X0Rlc3Ryb3lWaWV3V2luZG93KExQU0hFTExWSUVXIHRoaXMpCi17IEZJWE1FKHNoZWxsLCIoJXApIHN0dWJcbiIsdGhpcyk7Ci0KLSAgdGhpcy0+cFNoZWxsQnJvd3Nlci0+bHB2dGJsLT5mblJlbGVhc2UodGhpcy0+cFNoZWxsQnJvd3Nlcik7Ci0KLSAgcmV0dXJuIFNfT0s7Ci19Ci1zdGF0aWMgSFJFU1VMVCBXSU5BUEkgSVNoZWxsVmlld19HZXRDdXJyZW50SW5mbyhMUFNIRUxMVklFVyB0aGlzLCBMUEZPTERFUlNFVFRJTkdTIGxwZnMpCi17IEZJWE1FKHNoZWxsLCIoJXApLT4oJXApc3R1YlxuIix0aGlzLCBscGZzKTsKLQotICAqbHBmcyA9IHRoaXMtPkZvbGRlclNldHRpbmdzOwotICByZXR1cm4gU19PSzsKLX0KLXN0YXRpYyBIUkVTVUxUIFdJTkFQSSBJU2hlbGxWaWV3X0FkZFByb3BlcnR5U2hlZXRQYWdlcyhMUFNIRUxMVklFVyB0aGlzLCBEV09SRCBkd1Jlc2VydmVkLExQRk5BRERQUk9QU0hFRVRQQUdFIGxwZm4sIExQQVJBTSBscGFyYW0pCi17IEZJWE1FKHNoZWxsLCIoJXApIHN0dWJcbiIsdGhpcyk7Ci0gIHJldHVybiBFX05PVElNUEw7Ci19Ci1zdGF0aWMgSFJFU1VMVCBXSU5BUEkgSVNoZWxsVmlld19TYXZlVmlld1N0YXRlKExQU0hFTExWSUVXIHRoaXMpCi17IEZJWE1FKHNoZWxsLCIoJXApIHN0dWJcbiIsdGhpcyk7Ci0gIHJldHVybiBTX09LOwotfQotc3RhdGljIEhSRVNVTFQgV0lOQVBJIElTaGVsbFZpZXdfU2VsZWN0SXRlbShMUFNIRUxMVklFVyB0aGlzLCBMUENJVEVNSURMSVNUIHBpZGxJdGVtLCBVSU5UMzIgdUZsYWdzKQoteyBGSVhNRShzaGVsbCwiKCVwKS0+KHBpZGw9JXAsIDB4JTA4eCkgc3R1YlxuIix0aGlzLCBwaWRsSXRlbSwgdUZsYWdzKTsKLSAgcmV0dXJuIEVfTk9USU1QTDsKLX0KLXN0YXRpYyBIUkVTVUxUIFdJTkFQSSBJU2hlbGxWaWV3X0dldEl0ZW1PYmplY3QoTFBTSEVMTFZJRVcgdGhpcywgVUlOVDMyIHVJdGVtLCBSRUZJSUQgcmlpZCxMUFZPSUQgKnBwdk91dCkKLXsgY2hhciAgICB4cmlpZFs1MF07Ci0gIFdJTkVfU3RyaW5nRnJvbUNMU0lEKChMUENMU0lEKXJpaWQseHJpaWQpOwotCi0gIEZJWE1FKHNoZWxsLCIoJXApLT4oMHglMDh4LFxuXHQlcywgJXApc3R1YlxuIix0aGlzLCB1SXRlbSwgeHJpaWQsIHBwdk91dCk7Ci0KLSAgKnBwdk91dCA9IE5VTEw7Ci0gIHJldHVybiBFX05PVElNUEw7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiAgIElTaGVsbEZvbGRlciBpbXBsZW1lbnRhdGlvbgotKi8KLXN0YXRpYyBIUkVTVUxUIFdJTkFQSSBJU2hlbGxGb2xkZXJfUXVlcnlJbnRlcmZhY2UoTFBTSEVMTEZPTERFUixSRUZJSUQsTFBWT0lEKik7Ci1zdGF0aWMgVUxPTkcgV0lOQVBJIElTaGVsbEZvbGRlcl9BZGRSZWYoTFBTSEVMTEZPTERFUik7Ci1zdGF0aWMgVUxPTkcgV0lOQVBJIElTaGVsbEZvbGRlcl9SZWxlYXNlKExQU0hFTExGT0xERVIpOwotc3RhdGljIEhSRVNVTFQgV0lOQVBJIElTaGVsbEZvbGRlcl9Jbml0aWFsaXplKExQU0hFTExGT0xERVIsTFBDSVRFTUlETElTVCk7Ci1zdGF0aWMgSFJFU1VMVCBXSU5BUEkgSVNoZWxsRm9sZGVyX1BhcnNlRGlzcGxheU5hbWUoTFBTSEVMTEZPTERFUixIV05EMzIsTFBCQyxMUE9MRVNUUjMyLERXT1JEKixMUElURU1JRExJU1QqLERXT1JEKik7Ci1zdGF0aWMgSFJFU1VMVCBXSU5BUEkgSVNoZWxsRm9sZGVyX0VudW1PYmplY3RzKExQU0hFTExGT0xERVIsSFdORDMyLERXT1JELExQRU5VTUlETElTVCopOwotc3RhdGljIEhSRVNVTFQgV0lOQVBJIElTaGVsbEZvbGRlcl9CaW5kVG9PYmplY3QoTFBTSEVMTEZPTERFUixMUENJVEVNSURMSVNULExQQkMsUkVGSUlELExQVk9JRCopOwotc3RhdGljIEhSRVNVTFQgV0lOQVBJIElTaGVsbEZvbGRlcl9CaW5kVG9TdG9yYWdlKExQU0hFTExGT0xERVIsTFBDSVRFTUlETElTVCxMUEJDLFJFRklJRCxMUFZPSUQqKTsKLXN0YXRpYyBIUkVTVUxUIFdJTkFQSSBJU2hlbGxGb2xkZXJfQ29tcGFyZUlEcyhMUFNIRUxMRk9MREVSLExQQVJBTSxMUENJVEVNSURMSVNULExQQ0lURU1JRExJU1QpOwotc3RhdGljIEhSRVNVTFQgV0lOQVBJIElTaGVsbEZvbGRlcl9DcmVhdGVWaWV3T2JqZWN0KExQU0hFTExGT0xERVIsSFdORDMyLFJFRklJRCxMUFZPSUQqKTsKLXN0YXRpYyBIUkVTVUxUIFdJTkFQSSBJU2hlbGxGb2xkZXJfR2V0QXR0cmlidXRlc09mKExQU0hFTExGT0xERVIsVUlOVDMyLExQQ0lURU1JRExJU1QqLERXT1JEKik7Ci1zdGF0aWMgSFJFU1VMVCBXSU5BUEkgSVNoZWxsRm9sZGVyX0dldFVJT2JqZWN0T2YoTFBTSEVMTEZPTERFUixIV05EMzIsVUlOVDMyLExQQ0lURU1JRExJU1QqLFJFRklJRCxVSU5UMzIqLExQVk9JRCopOwotc3RhdGljIEhSRVNVTFQgV0lOQVBJIElTaGVsbEZvbGRlcl9HZXREaXNwbGF5TmFtZU9mKExQU0hFTExGT0xERVIsTFBDSVRFTUlETElTVCxEV09SRCxMUFNUUlJFVCk7Ci1zdGF0aWMgSFJFU1VMVCBXSU5BUEkgSVNoZWxsRm9sZGVyX1NldE5hbWVPZihMUFNIRUxMRk9MREVSLEhXTkQzMixMUENJVEVNSURMSVNULExQQ09MRVNUUjMyLERXT1JELExQSVRFTUlETElTVCopOwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qCSAgSVNoZWxsRm9sZGVyX1ZUYWJsZQotKi8KLXN0YXRpYyBzdHJ1Y3QgSVNoZWxsRm9sZGVyX1ZUYWJsZSBzZnZ0ID0gCi17IElTaGVsbEZvbGRlcl9RdWVyeUludGVyZmFjZSwKLQlJU2hlbGxGb2xkZXJfQWRkUmVmLAotCUlTaGVsbEZvbGRlcl9SZWxlYXNlLAotCUlTaGVsbEZvbGRlcl9QYXJzZURpc3BsYXlOYW1lLAotCUlTaGVsbEZvbGRlcl9FbnVtT2JqZWN0cywKLQlJU2hlbGxGb2xkZXJfQmluZFRvT2JqZWN0LAotICBJU2hlbGxGb2xkZXJfQmluZFRvU3RvcmFnZSwKLSAgSVNoZWxsRm9sZGVyX0NvbXBhcmVJRHMsCi0JSVNoZWxsRm9sZGVyX0NyZWF0ZVZpZXdPYmplY3QsCi0JSVNoZWxsRm9sZGVyX0dldEF0dHJpYnV0ZXNPZiwKLSAgSVNoZWxsRm9sZGVyX0dldFVJT2JqZWN0T2YsCi0gIElTaGVsbEZvbGRlcl9HZXREaXNwbGF5TmFtZU9mLAotICBJU2hlbGxGb2xkZXJfU2V0TmFtZU9mCi0gIC8qICAgIElTaGVsbEZvbGRlcl9Jbml0aWFsaXplKi8KLX07Ci0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoJICBJU2hlbGxGb2xkZXJfQ29uc3RydWN0b3IKLSovCi0KLUxQU0hFTExGT0xERVIgSVNoZWxsRm9sZGVyX0NvbnN0cnVjdG9yKExQU0hFTExGT0xERVIgcFBhcmVudCxMUElURU1JRExJU1QgcGlkbCkgCi17IExQU0hFTExGT0xERVIgICAgc2Y7Ci0JRFdPUkQgZHdTaXplPTA7Ci0gIHNmPShMUFNIRUxMRk9MREVSKUhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLDAsc2l6ZW9mKElTaGVsbEZvbGRlcikpOwotICBzZi0+cmVmPTE7Ci0gIHNmLT5scHZ0Ymw9JnNmdnQ7Ci0gIHNmLT5tbHBzekZvbGRlcj1OVUxMOwotCXNmLT5tcFNGUGFyZW50PXBQYXJlbnQ7Ci0KLQlUUkFDRShzaGVsbCwiKCVwKS0+KHBhcmVudD0lcCwgcGlkbD0lcClcbiIsc2YscFBhcmVudCwgcGlkbCk7Ci0JCi0JLyogY3JlYXRlIG93biBwaWRsLW1hbmFnZXIqLwotICBzZi0+cFBpZGxNZ3IgID0gUGlkbE1ncl9Db25zdHJ1Y3RvcigpOwotCWlmICghIHNmLT5wUGlkbE1nciApCi0JeyBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLDAsc2YpOwotCSAgRVJSIChzaGVsbCwiLS0gQ291bGQgbm90IGluaXRpYWxpemUgUGlkTUdSXG4iKTsKLQkgIHJldHVybiBOVUxMOwotCX0KLQotICAvKiBrZWVwIGEgY29weSBvZiB0aGUgcGlkbCBpbiB0aGUgaW5zdGFuY2UqLwotICBzZi0+bXBpZGwgPSBJTENsb25lKHBpZGwpOwotCXNmLT5tcGlkbE5TUm9vdCA9IE5VTEw7Ci0JCi0gIGlmKHNmLT5tcGlkbCkgICAgICAgIC8qIGRvIHdlIGhhdmUgYSBwaWRsPyovCi0gIHsgZHdTaXplID0gMDsKLSAgICBpZihzZi0+bXBTRlBhcmVudC0+bWxwc3pGb2xkZXIpCi0gICAgeyBkd1NpemUgKz0gc3RybGVuKHNmLT5tcFNGUGFyZW50LT5tbHBzekZvbGRlcikgKyAxOwotICAgIH0gICAKLSAgICBkd1NpemUgKz0gc2YtPnBQaWRsTWdyLT5scHZ0YmwtPmZuR2V0Rm9sZGVyVGV4dChzZi0+cFBpZGxNZ3Isc2YtPm1waWRsLE5VTEwsMCk7Ci0gICAgc2YtPm1scHN6Rm9sZGVyID0gU0hBbGxvYyhkd1NpemUpOwotICAgIGlmKHNmLT5tbHBzekZvbGRlcikKLSAgICB7ICooc2YtPm1scHN6Rm9sZGVyKT0weDAwOwotICAgICAgaWYoc2YtPm1wU0ZQYXJlbnQtPm1scHN6Rm9sZGVyKQotICAgICAgeyAgc3RyY3B5KHNmLT5tbHBzekZvbGRlciwgc2YtPm1wU0ZQYXJlbnQtPm1scHN6Rm9sZGVyKTsKLSAgICAgICAgIFBhdGhBZGRCYWNrc2xhc2ggKHNmLT5tbHBzekZvbGRlcik7Ci0gICAgICB9Ci0gICAgICBzZi0+cFBpZGxNZ3ItPmxwdnRibC0+Zm5HZXRGb2xkZXJUZXh0KHNmLT5wUGlkbE1nciwgc2YtPm1waWRsLCBzZi0+bWxwc3pGb2xkZXIrc3RybGVuKHNmLT5tbHBzekZvbGRlciksIGR3U2l6ZS1zdHJsZW4oc2YtPm1scHN6Rm9sZGVyKSk7Ci0gICAgfQotICB9Ci0JCi0gIFRSQUNFKHNoZWxsLCItLSAoJXApLT4oJXAsJXAscGFyZW50PSVzKVxuIixzZixwUGFyZW50LCBwaWRsLCBkZWJ1Z3N0cl9hKHNmLT5tbHBzekZvbGRlcikpOwotCXJldHVybiBzZjsKLX0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiAgSVNoZWxsRm9sZGVyOjpRdWVyeUludGVyZmFjZQotKiBQQVJBTUVURVJTCi0qICBSRUZJSUQgcmlpZCwgICAgICAgIC8vW2luIF0gUmVxdWVzdGVkIEludGVyZmFjZUlECi0qICBMUFZPSUQqIHBwdk9iamVjdCkgIC8vW291dF0gSW50ZXJmYWNlKiB0byBob2xkIHRoZSByZXN1bHQKLSovCi1zdGF0aWMgSFJFU1VMVCBXSU5BUEkgSVNoZWxsRm9sZGVyX1F1ZXJ5SW50ZXJmYWNlKAotICBMUFNIRUxMRk9MREVSIHRoaXMsIFJFRklJRCByaWlkLCBMUFZPSUQgKnBwdk9iaikKLXsgIGNoYXIJeHJpaWRbNTBdOwotICAgV0lORV9TdHJpbmdGcm9tQ0xTSUQoKExQQ0xTSUQpcmlpZCx4cmlpZCk7Ci0gICBUUkFDRShzaGVsbCwiKCVwKS0+KFxuXHRJSUQ6XHQlcywlcClcbiIsdGhpcyx4cmlpZCxwcHZPYmopOwotCi0gICpwcHZPYmogPSBOVUxMOwotCi0gIGlmKElzRXF1YWxJSUQocmlpZCwgJklJRF9JVW5rbm93bikpICAgICAgICAgIC8qSVVua25vd24qLwotICB7ICpwcHZPYmogPSB0aGlzOyAKLSAgfQotICBlbHNlIGlmKElzRXF1YWxJSUQocmlpZCwgJklJRF9JU2hlbGxGb2xkZXIpKSAgLypJU2hlbGxGb2xkZXIqLwotICB7ICAgICpwcHZPYmogPSAoSVNoZWxsRm9sZGVyKil0aGlzOwotICB9ICAgCi0KLSAgaWYoKnBwdk9iaikKLSAgeyAoKihMUFNIRUxMRk9MREVSKilwcHZPYmopLT5scHZ0YmwtPmZuQWRkUmVmKHRoaXMpOyAgCQotICAgIFRSQUNFKHNoZWxsLCItLSBJbnRlcmZhY2U6ICglcCktPiglcClcbiIscHB2T2JqLCpwcHZPYmopOwotCQlyZXR1cm4gU19PSzsKLSAgfQotCVRSQUNFKHNoZWxsLCItLSBJbnRlcmZhY2U6IEVfTk9JTlRFUkZBQ0VcbiIpOwotCXJldHVybiBFX05PSU5URVJGQUNFOwotfSAgIAotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogIElTaGVsbEZvbGRlcjo6QWRkUmVmCi0qLwotCi1zdGF0aWMgVUxPTkcgV0lOQVBJIElTaGVsbEZvbGRlcl9BZGRSZWYoTFBTSEVMTEZPTERFUiB0aGlzKQotewlUUkFDRShzaGVsbCwiKCVwKS0+KGNvdW50PSVsdSlcbiIsdGhpcywodGhpcy0+cmVmKSsxKTsKLQlyZXR1cm4gKysodGhpcy0+cmVmKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgSVNoZWxsRm9sZGVyX1JlbGVhc2UKLSAqLwotc3RhdGljIFVMT05HIFdJTkFQSSBJU2hlbGxGb2xkZXJfUmVsZWFzZShMUFNIRUxMRk9MREVSIHRoaXMpIAoteyBUUkFDRShzaGVsbCwiKCVwKS0+KGNvdW50PSVsdSlcbiIsdGhpcyx0aGlzLT5yZWYpOwotICBpZiAoIS0tKHRoaXMtPnJlZikpIAotICB7IFRSQUNFKHNoZWxsLCItLSBkZXN0cm95aW5nIElTaGVsbEZvbGRlciglcClcbiIsdGhpcyk7Ci0KLQkJaWYgKHBkZXNrdG9wZm9sZGVyPT10aGlzKQotCQl7IHBkZXNrdG9wZm9sZGVyPU5VTEw7Ci0JCSAgVFJBQ0Uoc2hlbGwsIi0tIGRlc3Ryb3llZCBJU2hlbGxGb2xkZXIoJXApIHdhcyBEZXNrdG9wZm9sZGVyXG4iLHRoaXMpOwotCQl9Ci0gICAgaWYgKHRoaXMtPnBQaWRsTWdyKQotICAgIHsgUGlkbE1ncl9EZXN0cnVjdG9yKHRoaXMtPnBQaWRsTWdyKTsKLSAgICB9Ci0gICAgaWYodGhpcy0+bXBpZGxOU1Jvb3QpCi0gICAgeyBTSEZyZWUodGhpcy0+bXBpZGxOU1Jvb3QpOwotICAgIH0KLSAgICBpZih0aGlzLT5tcGlkbCkKLSAgICB7IFNIRnJlZSh0aGlzLT5tcGlkbCk7Ci0gICAgfQotICAgIGlmKHRoaXMtPm1scHN6Rm9sZGVyKQotICAgIHsgU0hGcmVlKHRoaXMtPm1scHN6Rm9sZGVyKTsKLSAgICB9Ci0KLQkJSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwwLHRoaXMpOwotCi0JCXJldHVybiAwOwotCX0KLQlyZXR1cm4gdGhpcy0+cmVmOwotfQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCQlJU2hlbGxGb2xkZXJfUGFyc2VEaXNwbGF5TmFtZQotKiBQQVJBTUVURVJTCi0qICBIV05EICAgICAgICAgIGh3bmRPd25lciwgICAgICAvL1tpbiBdIFBhcmVudCB3aW5kb3cgZm9yIGFueSBtZXNzYWdlJ3MKLSogIExQQkMgICAgICAgICAgcGJjLCAgICAgICAgICAgIC8vW2luIF0gcmVzZXJ2ZWQKLSogIExQT0xFU1RSICAgICAgbHBzekRpc3BsYXlOYW1lLC8vW2luIF0gIlVuaWNvZGUiIGRpc3BsYXluYW1lLgotKiAgVUxPTkcqICAgICAgICBwY2hFYXRlbiwgICAgICAgLy9bb3V0XSAodW5pY29kZSkgY2hhcmFjdGVycyBwcm9jZXNzZWQKLSogIExQSVRFTUlETElTVCogcHBpZGwsICAgICAgICAgIC8vW291dF0gY29tcGxleCBwaWRsIHRvIGl0ZW0KLSogIFVMT05HKiAgICAgICAgcGR3QXR0cmlidXRlcyAgIC8vW291dF0gaXRlbXMgYXR0cmlidXRlcwotKgotKiBGSVhNRTogCi0qICAgIHBkd0F0dHJpYnV0ZXM6IG5vdCB1c2VkCi0qLwotc3RhdGljIEhSRVNVTFQgV0lOQVBJIElTaGVsbEZvbGRlcl9QYXJzZURpc3BsYXlOYW1lKAotCUxQU0hFTExGT0xERVIgdGhpcywKLQlIV05EMzIgaHduZE93bmVyLAotCUxQQkMgcGJjUmVzZXJ2ZWQsCi0gICAgTFBPTEVTVFIzMiBscHN6RGlzcGxheU5hbWUsCi0gICAgRFdPUkQgKnBjaEVhdGVuLAotICAgIExQSVRFTUlETElTVCAqcHBpZGwsCi0JRFdPUkQgKnBkd0F0dHJpYnV0ZXMpCi17CUhSRVNVTFQgICAgICAgIGhyPUVfT1VUT0ZNRU1PUlk7Ci0gIExQSVRFTUlETElTVCAgIHBpZGxGdWxsPU5VTEwsIHBpZGxUZW1wID0gTlVMTCwgcGlkbE9sZCA9IE5VTEw7Ci0gIExQU1RSICAgICAgICAgIHBzek5leHQ9TlVMTDsKLSAgQ0hBUiAgICAgICAgICAgc3pFbGVtZW50W01BWF9QQVRIXTsKLSAgQk9PTDMyICAgICAgICAgYlR5cGU7Ci0KLSAgRFdPUkQgICAgICAgICAgZHdDaGFycz1sc3RybGVuMzJXKGxwc3pEaXNwbGF5TmFtZSkgKyAxOwotICBMUFNUUiAgICAgICAgICBwc3pUZW1wPShMUFNUUilIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwwLGR3Q2hhcnMgKiBzaXplb2YoQ0hBUikpOwotICAgICAgIAotICBUUkFDRShzaGVsbCwiKCVwKS0+KEhXTkQ9MHglMDh4LCVwLCVwPSVzLCVwLHBpZGw9JXAsJXApXG4iLAotCXRoaXMsaHduZE93bmVyLHBiY1Jlc2VydmVkLGxwc3pEaXNwbGF5TmFtZSxkZWJ1Z3N0cl93KGxwc3pEaXNwbGF5TmFtZSkscGNoRWF0ZW4scHBpZGwscGR3QXR0cmlidXRlcyk7Ci0KLSAgaWYocHN6VGVtcCkKLSAgeyBociA9IEVfRkFJTDsKLSAgICBXaWRlQ2hhclRvTG9jYWwzMihwc3pUZW1wLCBscHN6RGlzcGxheU5hbWUsIGR3Q2hhcnMpOwotICAgIGlmKCpwc3pUZW1wKQotICAgIHsgaWYgKHN0cmNtcChwc3pUZW1wLCJEZXNrdG9wIik9PTApCi0gICAgICB7IHBpZGxGdWxsID0gKExQSVRFTUlETElTVClIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwwLDIpOwotCQkJICBwaWRsRnVsbC0+bWtpZC5jYiA9IDA7Ci0JCQl9Ci0JCSAgZWxzZQotCQkJeyBwaWRsRnVsbCA9IHRoaXMtPnBQaWRsTWdyLT5scHZ0YmwtPmZuQ3JlYXRlTXlDb21wdXRlcih0aGlzLT5wUGlkbE1ncik7Ci0KLSAgICAgICAgLyogY2hlY2sgaWYgdGhlIGxwc3pEaXNwbGF5TmFtZSBpcyBGb2xkZXIgb3IgRmlsZSovCi0gIAkJCWJUeXBlID0gISAoR2V0RmlsZUF0dHJpYnV0ZXMzMkEocHN6TmV4dCkmRklMRV9BVFRSSUJVVEVfRElSRUNUT1JZKTsKLSAgCQkJcHN6TmV4dCA9IEdldE5leHRFbGVtZW50KHBzelRlbXAsIHN6RWxlbWVudCwgTUFYX1BBVEgpOwotICAKLSAgICAgICAgcGlkbFRlbXAgPSB0aGlzLT5wUGlkbE1nci0+bHB2dGJsLT5mbkNyZWF0ZURyaXZlKHRoaXMtPnBQaWRsTWdyLHN6RWxlbWVudCk7CQkJCi0gICAgICAgIHBpZGxPbGQgPSBwaWRsRnVsbDsKLSAgICAgICAgcGlkbEZ1bGwgPSBJTENvbWJpbmUocGlkbEZ1bGwscGlkbFRlbXApOwotICAgICAgICBTSEZyZWUocGlkbE9sZCk7Ci0gIAotICAJCQlpZihwaWRsRnVsbCkKLSAgICAgICAgeyB3aGlsZSgocHN6TmV4dD1HZXROZXh0RWxlbWVudChwc3pOZXh0LCBzekVsZW1lbnQsIE1BWF9QQVRIKSkpCi0gICAgICAgICAgeyBpZighKnBzek5leHQgJiYgYlR5cGUpCi0gIAkJCQkJeyBwaWRsVGVtcCA9IHRoaXMtPnBQaWRsTWdyLT5scHZ0YmwtPmZuQ3JlYXRlVmFsdWUodGhpcy0+cFBpZGxNZ3Isc3pFbGVtZW50KTsKLSAgCQkJCQl9Ci0gIAkJCQkJZWxzZQkJCQkKLSAgICAgICAgICAgIHsgcGlkbFRlbXAgPSB0aGlzLT5wUGlkbE1nci0+bHB2dGJsLT5mbkNyZWF0ZUZvbGRlcih0aGlzLT5wUGlkbE1ncixzekVsZW1lbnQpOwotICAJCQkJCX0KLSAgICAgICAgICAgIHBpZGxPbGQgPSBwaWRsRnVsbDsKLSAgICAgICAgICAgIHBpZGxGdWxsID0gSUxDb21iaW5lKHBpZGxGdWxsLHBpZGxUZW1wKTsKLSAgICAgICAgICAgIFNIRnJlZShwaWRsT2xkKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaHIgPSBTX09LOwotICAgICAgICB9Ci0gICAgICB9Ci0JCX0KLSAgfQotCUhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksMCxwc3pUZW1wKTsKLSAgKnBwaWRsID0gcGlkbEZ1bGw7Ci0gIHJldHVybiBocjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCQlJU2hlbGxGb2xkZXJfRW51bU9iamVjdHMKLSogUEFSQU1FVEVSUwotKiAgSFdORCAgICAgICAgICBod25kT3duZXIsICAgIC8vW2luIF0gUGFyZW50IFdpbmRvdwotKiAgRFdPUkQgICAgICAgICBncmZGbGFncywgICAgIC8vW2luIF0gU0hDT05URiBlbnVtZXJhdGlvbiBtYXNrCi0qICBMUEVOVU1JRExJU1QqIHBwZW51bUlETGlzdCAgLy9bb3V0XSBJRW51bUlETGlzdCBpbnRlcmZhY2UKLSovCi1zdGF0aWMgSFJFU1VMVCBXSU5BUEkgSVNoZWxsRm9sZGVyX0VudW1PYmplY3RzKAotCUxQU0hFTExGT0xERVIgdGhpcywKLQlIV05EMzIgaHduZE93bmVyLAotCURXT1JEIGR3RmxhZ3MsCi0JTFBFTlVNSURMSVNUKiBwcEVudW1JRExpc3QpCi17IEhSRVNVTFQgIGhyOwotCVRSQUNFKHNoZWxsLCIoJXApLT4oSFdORD0weCUwOHgsMHglMDhseCwlcClcbiIsdGhpcyxod25kT3duZXIsZHdGbGFncyxwcEVudW1JRExpc3QpOwotCi0gICpwcEVudW1JRExpc3QgPSBOVUxMOwotCSpwcEVudW1JRExpc3QgPSBJRW51bUlETGlzdF9Db25zdHJ1Y3RvciAodGhpcy0+bWxwc3pGb2xkZXIsIGR3RmxhZ3MsICZocik7Ci0gIFRSQUNFKHNoZWxsLCItLSAoJXApLT4obmV3IElEIExpc3Q6ICVwKVxuIix0aGlzLCpwcEVudW1JRExpc3QpOwotICBpZighKnBwRW51bUlETGlzdCkKLSAgeyByZXR1cm4gaHI7Ci0gIH0KLSAgcmV0dXJuIFNfT0s7CQkKLX0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIElTaGVsbEZvbGRlcl9Jbml0aWFsaXplKCkKLSAqICBJUGVyc2lzdEZvbGRlciBNZXRob2QKLSAqLwotc3RhdGljIEhSRVNVTFQgV0lOQVBJIElTaGVsbEZvbGRlcl9Jbml0aWFsaXplKAotCUxQU0hFTExGT0xERVIgdGhpcywKLQlMUENJVEVNSURMSVNUIHBpZGwpCi17IFRSQUNFKHNoZWxsLCIoJXApLT4ocGlkbD0lcClcbiIsdGhpcyxwaWRsKTsKLSAgaWYodGhpcy0+bXBpZGxOU1Jvb3QpCi0gIHsgU0hGcmVlKHRoaXMtPm1waWRsTlNSb290KTsKLSAgICB0aGlzLT5tcGlkbE5TUm9vdCA9IE5VTEw7Ci0gIH0KLSAgdGhpcy0+bXBpZGxOU1Jvb3Q9SUxDbG9uZShwaWRsKTsKLSAgcmV0dXJuIFNfT0s7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgkJSVNoZWxsRm9sZGVyX0JpbmRUb09iamVjdAotKiBQQVJBTUVURVJTCi0qICBMUENJVEVNSURMSVNUIHBpZGwsICAgICAgIC8vW2luIF0gY29tcGxleCBwaWRsIHRvIG9wZW4KLSogIExQQkMgICAgICAgICAgcGJjLCAgICAgICAgLy9baW4gXSByZXNlcnZlZAotKiAgUkVGSUlEICAgICAgICByaWlkLCAgICAgICAvL1tpbiBdIEluaXRpYWwgSW50ZXJmYWNlCi0qICBMUFZPSUQqICAgICAgIHBwdk9iamVjdCAgIC8vW291dF0gSW50ZXJmYWNlKgotKi8KLXN0YXRpYyBIUkVTVUxUIFdJTkFQSSBJU2hlbGxGb2xkZXJfQmluZFRvT2JqZWN0KAotCUxQU0hFTExGT0xERVIgdGhpcywKLQlMUENJVEVNSURMSVNUIHBpZGwsCi0JTFBCQyBwYmNSZXNlcnZlZCwKLQlSRUZJSUQgcmlpZCwKLQlMUFZPSUQgKiBwcHZPdXQpCi17CWNoYXIJICAgICAgICB4cmlpZFs1MF07Ci0gIEhSRVNVTFQgICAgICAgaHI7Ci0JTFBTSEVMTEZPTERFUiBwU2hlbGxGb2xkZXI7Ci0JCi0JV0lORV9TdHJpbmdGcm9tQ0xTSUQocmlpZCx4cmlpZCk7Ci0KLQlUUkFDRShzaGVsbCwiKCVwKS0+KHBpZGw9JXAsJXAsXG5cdElJRDolcywlcClcbiIsdGhpcyxwaWRsLHBiY1Jlc2VydmVkLHhyaWlkLHBwdk91dCk7Ci0KLSAgKnBwdk91dCA9IE5VTEw7Ci0gIHBTaGVsbEZvbGRlciA9IElTaGVsbEZvbGRlcl9Db25zdHJ1Y3Rvcih0aGlzLCBwaWRsKTsKLSAgaWYoIXBTaGVsbEZvbGRlcikKLSAgICByZXR1cm4gRV9PVVRPRk1FTU9SWTsKLSAgLyogIHBTaGVsbEZvbGRlci0+bHB2dGJsLT5mbkluaXRpYWxpemUocFNoZWxsRm9sZGVyLCB0aGlzLT5tcGlkbE5TUm9vdCk7Ki8KLSAgSVNoZWxsRm9sZGVyX0luaXRpYWxpemUocFNoZWxsRm9sZGVyLCB0aGlzLT5tcGlkbE5TUm9vdCk7Ci0gIGhyID0gcFNoZWxsRm9sZGVyLT5scHZ0YmwtPmZuUXVlcnlJbnRlcmZhY2UocFNoZWxsRm9sZGVyLCByaWlkLCBwcHZPdXQpOwotICBwU2hlbGxGb2xkZXItPmxwdnRibC0+Zm5SZWxlYXNlKHBTaGVsbEZvbGRlcik7Ci0JVFJBQ0Uoc2hlbGwsIi0tICglcCktPihpbnRlcmZhY2U9JXApXG4iLHRoaXMsIHBwdk91dCk7Ci0gIHJldHVybiBocjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qICBJU2hlbGxGb2xkZXJfQmluZFRvU3RvcmFnZQotKiBQQVJBTUVURVJTCi0qICBMUENJVEVNSURMSVNUIHBpZGwsICAgICAgIC8vW2luIF0gY29tcGxleCBwaWRsIHRvIHN0b3JlCi0qICBMUEJDICAgICAgICAgIHBiYywgICAgICAgIC8vW2luIF0gcmVzZXJ2ZWQKLSogIFJFRklJRCAgICAgICAgcmlpZCwgICAgICAgLy9baW4gXSBJbml0aWFsIHN0b3JhZ2UgaW50ZXJmYWNlIAotKiAgTFBWT0lEKiAgICAgICBwcHZPYmplY3QgICAvL1tvdXRdIEludGVyZmFjZSogcmV0dXJuZWQKLSovCi1zdGF0aWMgSFJFU1VMVCBXSU5BUEkgSVNoZWxsRm9sZGVyX0JpbmRUb1N0b3JhZ2UoCi0gIAlMUFNIRUxMRk9MREVSIHRoaXMsCi0gICAgTFBDSVRFTUlETElTVCBwaWRsLCAvKnNpbXBsZS9jb21wbGV4IHBpZGwqLwotICAgIExQQkMgcGJjUmVzZXJ2ZWQsIAotICAgIFJFRklJRCByaWlkLCAKLSAgICBMUFZPSUQgKnBwdk91dCkKLXsJY2hhciB4cmlpZFs1MF07Ci0JV0lORV9TdHJpbmdGcm9tQ0xTSUQocmlpZCx4cmlpZCk7Ci0KLQlGSVhNRShzaGVsbCwiKCVwKS0+KHBpZGw9JXAsJXAsXG5cdElJRDolcywlcCkgc3R1YlxuIix0aGlzLHBpZGwscGJjUmVzZXJ2ZWQseHJpaWQscHB2T3V0KTsKLQotICAqcHB2T3V0ID0gTlVMTDsKLSAgcmV0dXJuIEVfTk9USU1QTDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qICBJU2hlbGxGb2xkZXJfQ29tcGFyZUlEcwotKgotKiBQQVJNRVRFUlMKLSogIExQQVJBTSAgICAgICAgbFBhcmFtLCAvL1tpbiBdIENvbHVtbj8KLSogIExQQ0lURU1JRExJU1QgcGlkbDEsICAvL1tpbiBdIHNpbXBsZSBwaWRsCi0qICBMUENJVEVNSURMSVNUIHBpZGwyKSAgLy9baW4gXSBzaW1wbGUgcGlkbAotKiBGSVhNRQotKiAgd2UgaGF2ZSB0byBoYW5kbGUgc2ltcGxlIHBpZGwncyBvbmx5Ci0qLwotc3RhdGljIEhSRVNVTFQgV0lOQVBJICBJU2hlbGxGb2xkZXJfQ29tcGFyZUlEcygKLSAgCUxQU0hFTExGT0xERVIgdGhpcywKLQkJTFBBUkFNIGxQYXJhbSwgCi0gICAgTFBDSVRFTUlETElTVCBwaWRsMSwgLypzaW1wbGUgcGlkbCovCi0gICAgTFBDSVRFTUlETElTVCBwaWRsMikgLypzaW1wbGUgcGlkbCovCi17IENIQVIgc3pTdHJpbmcxW01BWF9QQVRIXSA9ICIiOwotICBDSEFSIHN6U3RyaW5nMltNQVhfUEFUSF0gPSAiIjsKLSAgaW50ICAgblJldHVybjsKLSAgTFBDSVRFTUlETElTVCAgcGlkbFRlbXAxID0gcGlkbDEsIHBpZGxUZW1wMiA9IHBpZGwyOwotCi0gIFRSQUNFKHNoZWxsLCIoJXApLT4oMHglMDhseCxwaWRsMT0lcCxwaWRsMj0lcClcbiIsdGhpcyxsUGFyYW0scGlkbDEscGlkbDIpOwotCi0gIC8qU3BlY2lhbCBjYXNlIC0gSWYgb25lIG9mIHRoZSBpdGVtcyBpcyBhIFBhdGggYW5kIHRoZSBvdGhlciBpcyBhIEZpbGUsIGFsd2F5cyAKLSAgbWFrZSB0aGUgUGF0aCBjb21lIGJlZm9yZSB0aGUgRmlsZS4qLwotCi0gIC8qIGdldCB0aGUgbGFzdCBpdGVtIGluIGVhY2ggbGlzdCAqLwotICB3aGlsZSgodGhpcy0+cFBpZGxNZ3ItPmxwdnRibC0+Zm5HZXROZXh0SXRlbSh0aGlzLT5wUGlkbE1ncixwaWRsVGVtcDEpKS0+bWtpZC5jYikKLSAgICBwaWRsVGVtcDEgPSB0aGlzLT5wUGlkbE1nci0+bHB2dGJsLT5mbkdldE5leHRJdGVtKHRoaXMtPnBQaWRsTWdyLHBpZGxUZW1wMSk7Ci0gIHdoaWxlKCh0aGlzLT5wUGlkbE1nci0+bHB2dGJsLT5mbkdldE5leHRJdGVtKHRoaXMtPnBQaWRsTWdyLHBpZGxUZW1wMikpLT5ta2lkLmNiKQotICAgIHBpZGxUZW1wMiA9IHRoaXMtPnBQaWRsTWdyLT5scHZ0YmwtPmZuR2V0TmV4dEl0ZW0odGhpcy0+cFBpZGxNZ3IscGlkbFRlbXAyKTsKLQotICAvKiBhdCB0aGlzIHBvaW50LCBib3RoIHBpZGxUZW1wMSBhbmQgcGlkbFRlbXAyIHBvaW50IHRvIHRoZSBsYXN0IGl0ZW0gaW4gdGhlIGxpc3QgKi8KLSAgaWYodGhpcy0+cFBpZGxNZ3ItPmxwdnRibC0+Zm5Jc1ZhbHVlKHRoaXMtPnBQaWRsTWdyLHBpZGxUZW1wMSkgIT0gdGhpcy0+cFBpZGxNZ3ItPmxwdnRibC0+Zm5Jc1ZhbHVlKHRoaXMtPnBQaWRsTWdyLHBpZGxUZW1wMikpCi0gIHsgaWYodGhpcy0+cFBpZGxNZ3ItPmxwdnRibC0+Zm5Jc1ZhbHVlKHRoaXMtPnBQaWRsTWdyLHBpZGxUZW1wMSkpCi0gICAgICByZXR1cm4gMTsKLSAgIHJldHVybiAtMTsKLSAgfQotCi0gIHRoaXMtPnBQaWRsTWdyLT5scHZ0YmwtPmZuR2V0RHJpdmUodGhpcy0+cFBpZGxNZ3IsIHBpZGwxLHN6U3RyaW5nMSxzaXplb2Yoc3pTdHJpbmcxKSk7Ci0gIHRoaXMtPnBQaWRsTWdyLT5scHZ0YmwtPmZuR2V0RHJpdmUodGhpcy0+cFBpZGxNZ3IsIHBpZGwyLHN6U3RyaW5nMSxzaXplb2Yoc3pTdHJpbmcyKSk7Ci0gIG5SZXR1cm4gPSBzdHJjYXNlY21wKHN6U3RyaW5nMSwgc3pTdHJpbmcyKTsKLSAgaWYoblJldHVybikKLSAgICByZXR1cm4gblJldHVybjsKLQotICB0aGlzLT5wUGlkbE1nci0+bHB2dGJsLT5mbkdldEZvbGRlclRleHQodGhpcy0+cFBpZGxNZ3IsIHBpZGwxLHN6U3RyaW5nMSxzaXplb2Yoc3pTdHJpbmcxKSk7Ci0gIHRoaXMtPnBQaWRsTWdyLT5scHZ0YmwtPmZuR2V0Rm9sZGVyVGV4dCh0aGlzLT5wUGlkbE1nciwgcGlkbDIsc3pTdHJpbmcyLHNpemVvZihzelN0cmluZzIpKTsKLSAgblJldHVybiA9IHN0cmNhc2VjbXAoc3pTdHJpbmcxLCBzelN0cmluZzIpOwotICBpZihuUmV0dXJuKQotICAgIHJldHVybiBuUmV0dXJuOwotCi0gIHRoaXMtPnBQaWRsTWdyLT5scHZ0YmwtPmZuR2V0VmFsdWVUZXh0KHRoaXMtPnBQaWRsTWdyLHBpZGwxLHN6U3RyaW5nMSxzaXplb2Yoc3pTdHJpbmcxKSk7Ci0gIHRoaXMtPnBQaWRsTWdyLT5scHZ0YmwtPmZuR2V0VmFsdWVUZXh0KHRoaXMtPnBQaWRsTWdyLHBpZGwyLHN6U3RyaW5nMixzaXplb2Yoc3pTdHJpbmcyKSk7Ci0gIHJldHVybiBzdHJjYXNlY21wKHN6U3RyaW5nMSwgc3pTdHJpbmcyKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCSAgSVNoZWxsRm9sZGVyX0NyZWF0ZVZpZXdPYmplY3QKLSogQ3JlYXRlcyBhbiBWaWV3IE9iamVjdCByZXByZXNlbnRpbmcgdGhlIFNoZWxsRm9sZGVyCi0qICBJU2hlbGxWaWV3IC8gSVNoZWxsQnJvd3NlciAvIElDb250ZXh0TWVudQotKgotKiBQQVJBTUVURVJTCi0qICBIV05EICAgIGh3bmRPd25lciwgIC8vIEhhbmRsZSBvZiBvd25lciB3aW5kb3cKLSogIFJFRklJRCAgcmlpZCwgICAgICAgLy8gUmVxdWVzdGVkIGluaXRpYWwgaW50ZXJmYWNlCi0qICBMUFZPSUQqIHBwdk9iamVjdCkgIC8vIFJlc3VsdGFudCBpbnRlcmZhY2UqCi0qCi0qIE5PVEVTCi0qICB0aGUgc2FtZSBhcyBTSENyZWF0ZVNoZWxsRm9sZGVyVmlld0V4ID8/PwotKi8KLXN0YXRpYyBIUkVTVUxUIFdJTkFQSSBJU2hlbGxGb2xkZXJfQ3JlYXRlVmlld09iamVjdCgKLQlMUFNIRUxMRk9MREVSIHRoaXMsCi0JSFdORDMyIGh3bmRPd25lciwKLQlSRUZJSUQgcmlpZCwKLQlMUFZPSUQgKnBwdk91dCkKLXsgTFBTSEVMTFZJRVcgcFNoZWxsVmlldzsKLSAgY2hhciAgICB4cmlpZFs1MF07Ci0gIEhSRVNVTFQgICAgICAgaHI7Ci0KLQlXSU5FX1N0cmluZ0Zyb21DTFNJRChyaWlkLHhyaWlkKTsKLSAgVFJBQ0Uoc2hlbGwsIiglcCktPihod25kPTB4JXgsXG5cdElJRDpcdCVzLCVwKVxuIix0aGlzLGh3bmRPd25lcix4cmlpZCxwcHZPdXQpOwotCQotCSpwcHZPdXQgPSBOVUxMOwotCi0gIHBTaGVsbFZpZXcgPSBJU2hlbGxWaWV3X0NvbnN0cnVjdG9yKHRoaXMsIHRoaXMtPm1waWRsKTsKLSAgaWYoIXBTaGVsbFZpZXcpCi0gICAgcmV0dXJuIEVfT1VUT0ZNRU1PUlk7Ci0gIGhyID0gcFNoZWxsVmlldy0+bHB2dGJsLT5mblF1ZXJ5SW50ZXJmYWNlKHBTaGVsbFZpZXcsIHJpaWQsIHBwdk91dCk7Ci0gIHBTaGVsbFZpZXctPmxwdnRibC0+Zm5SZWxlYXNlKHBTaGVsbFZpZXcpOwotICBUUkFDRShzaGVsbCwiLS0gKCVwKS0+KGludGVyZmFjZT0lcClcbiIsdGhpcywgcHB2T3V0KTsKLSAgcmV0dXJuIGhyOyAKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qICBJU2hlbGxGb2xkZXJfR2V0QXR0cmlidXRlc09mCi0qCi0qIFBBUkFNRVRFUlMKLSogIFVJTlQgICAgICAgICAgICBjaWRsLCAgICAgLy9baW4gXSBudW0gZWxlbWVudHMgaW4gcGlkbCBhcnJheQotKyAgTFBDSVRFTUlETElTVCogIGFwaWRsLCAgICAvL1tpbiBdIHNpbXBsZSBwaWRsIGFycmF5IAotKiAgVUxPTkcqICAgICAgICAgIHJnZkluT3V0KSAvL1tvdXRdIHJlc3VsdCBhcnJheSAgCi0qCi0qIEZJWE1FOiBxdWljayBoYWNrCi0qICBOb3RlOiByZ2ZJbk91dCBpcyBkb2N1bWVudGVkIGFzIGJlaW5nIGFuIGFycmF5IG9mIFVMT05HUy4KLSogIFRoaXMgZG9lcyBub3Qgc2VlbSB0byBiZSB0aGUgY2FzZS4gVGVzdGluZyB0aGlzIGZ1bmN0aW9uIHVzaW5nIHRoZSBzaGVsbCB0byAKLSogIGNhbGwgaXQgd2l0aCBjaWRsID4gMSAoYnkgZGVsZXRpbmcgbXVsdGlwbGUgaXRlbXMpIHJldmVhbHMgdGhhdCB0aGUgc2hlbGwKLSogIHBhc3NlcyBPTkUgZWxlbWVudCBpbiB0aGUgYXJyYXkgYW5kIHdyaXRpbmcgdG8gZnVydGhlciBlbGVtZW50cyB3aWxsCi0qICBjYXVzZSB0aGUgc2hlbGwgdG8gZmFpbCBsYXRlci4KLSovCi1zdGF0aWMgSFJFU1VMVCBXSU5BUEkgSVNoZWxsRm9sZGVyX0dldEF0dHJpYnV0ZXNPZigKLQlMUFNIRUxMRk9MREVSIHRoaXMsCi0JVUlOVDMyIGNpZGwsCi0gICAgTFBDSVRFTUlETElTVCAqYXBpZGwsIC8qc2ltcGxlIHBpZGwncyovCi0JRFdPUkQgKnJnZkluT3V0KQoteyBMUENJVEVNSURMSVNUICogcGlkbHRlbXA7Ci0gIERXT1JEIGk7Ci0gIFRSQUNFKHNoZWxsLCIoJXApLT4oJWQsJXAsJXApXG4iLHRoaXMsY2lkbCxhcGlkbCxyZ2ZJbk91dCk7Ci0KLSAgcGlkbHRlbXA9YXBpZGw7Ci0gICpyZ2ZJbk91dCA9IDB4MDA7Ci0gIGk9Y2lkbDsKLSAgaWYgKCghIGNpZGwgKXwgKCFhcGlkbCkgfCAoIXJnZkluT3V0KSkKLSAgICByZXR1cm4gRV9JTlZBTElEQVJHOwotICAKLSAgZG8KLSAgeyBpZiAoKnBpZGx0ZW1wKQotICAgIHsgaWYgKHRoaXMtPnBQaWRsTWdyLT5scHZ0YmwtPmZuSXNEZXNrdG9wKHRoaXMtPnBQaWRsTWdyLCAqcGlkbHRlbXApKQotICAgICAgeyAqcmdmSW5PdXQgfD0gKFNGR0FPX0ZPTERFUiB8IFNGR0FPX0hBU1NVQkZPTERFUiB8IFNGR0FPX0ZJTEVTWVNBTkNFU1RPUik7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmICh0aGlzLT5wUGlkbE1nci0+bHB2dGJsLT5mbklzTXlDb21wdXRlcih0aGlzLT5wUGlkbE1nciwgKnBpZGx0ZW1wKSkKLSAgICAgIHsgKnJnZkluT3V0IHw9IChTRkdBT19GT0xERVIgfCBTRkdBT19IQVNTVUJGT0xERVIpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAodGhpcy0+cFBpZGxNZ3ItPmxwdnRibC0+Zm5Jc0RyaXZlKHRoaXMtPnBQaWRsTWdyLCAqcGlkbHRlbXApKQotICAgICAgeyAqcmdmSW5PdXQgfD0gKFNGR0FPX0ZPTERFUiB8IFNGR0FPX0hBU1NVQkZPTERFUiB8IFNGR0FPX0ZJTEVTWVNBTkNFU1RPUiB8IFNGR0FPX0ZJTEVTWVNURU0pOwotICAgICAgfQotICAgICAgZWxzZSBpZiAodGhpcy0+cFBpZGxNZ3ItPmxwdnRibC0+Zm5Jc0ZvbGRlcih0aGlzLT5wUGlkbE1nciwgKnBpZGx0ZW1wKSkKLSAgICAgIHsgKnJnZkluT3V0IHw9IChTRkdBT19GT0xERVIgfCBTRkdBT19GSUxFU1lTVEVNIHwgU0ZHQU9fSEFTU1VCRk9MREVSKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKHRoaXMtPnBQaWRsTWdyLT5scHZ0YmwtPmZuSXNWYWx1ZSh0aGlzLT5wUGlkbE1nciwgKnBpZGx0ZW1wKSkKLSAgICAgIHsgKnJnZkluT3V0IHw9IChTRkdBT19GSUxFU1lTVEVNKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcGlkbHRlbXArKzsKLSAgICBjaWRsLS07Ci0gIH0gd2hpbGUgKGNpZGwgPiAwICYmICpwaWRsdGVtcCk7Ci0KLSAgcmV0dXJuIFNfT0s7Ci19Ci0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogIElTaGVsbEZvbGRlcl9HZXRVSU9iamVjdE9mCi0qCi0qIFBBUkFNRVRFUlMKLSogIEhXTkQgICAgICAgICAgIGh3bmRPd25lciwgLy9baW4gXSBQYXJlbnQgd2luZG93IGZvciBhbnkgb3V0cHV0Ci0qICBVSU5UICAgICAgICAgICBjaWRsLCAgICAgIC8vW2luIF0gYXJyYXkgc2l6ZQotKiAgTFBDSVRFTUlETElTVCogYXBpZGwsICAgICAvL1tpbiBdIHNpbXBsZSBwaWRsIGFycmF5Ci0qICBSRUZJSUQgICAgICAgICByaWlkLCAgICAgIC8vW2luIF0gUmVxdWVzdGVkIEludGVyZmFjZQotKiAgVUlOVCogICAgICAgICAgcHJnZkluT3V0LCAvL1sgICBdIHJlc2VydmVkIAotKiAgTFBWT0lEKiAgICAgICAgcHB2T2JqZWN0KSAvL1tvdXRdIFJlc3VsdGluZyBJbnRlcmZhY2UKLSoKLSogTk9URVMKLSogIFRoaXMgZnVuY3Rpb24gZ2V0cyBhc2tlZCB0byByZXR1cm4gInZpZXcgb2JqZWN0cyIgZm9yIG9uZSBvciBtb3JlIChtdWx0aXBsZSBzZWxlY3QpCi0qICBpdGVtczoKLSogIFRoZSB2aWV3b2JqZWN0IHR5cGljYWxseSBpcyBhbiBDT00gb2JqZWN0IHdpdGggb25lIG9mIHRoZSBmb2xsb3dpbmcgaW50ZXJmYWNlczoKLSogIElFeHRyYWN0SWNvbixJRGF0YU9iamVjdCxJQ29udGV4dE1lbnUKLSogIEluIG9yZGVyIHRvIHN1cHBvcnQgaWNvbiBwb3NpdGlvbnMgaW4gdGhlIGRlZmF1bHQgTGlzdHZpZXcgeW91ciBEYXRhT2JqZWN0Ci0qICBtdXN0IGltcGxlbWVudCB0aGUgU2V0RGF0YSBtZXRob2QgKGluIGFkZGl0aW9uIHRvIEdldERhdGEgOikgLSB0aGUgc2hlbGwgcGFzc2VzCi0qICBhIGJhcmVseSBkb2N1bWVudGVkICJJY29uIHBvc2l0aW9ucyIgc3RydWN0dXJlIHRvIFNldERhdGEgd2hlbiB0aGUgZHJhZyBzdGFydHMsCi0qICBhbmQgR2V0RGF0YSdzIGl0IGlmIHRoZSBkcm9wIGlzIGluIGFub3RoZXIgZXhwbG9yZXIgd2luZG93IHRoYXQgbmVlZHMgdGhlIHBvc2l0aW9ucy4KLSovCi1zdGF0aWMgSFJFU1VMVCBXSU5BUEkgSVNoZWxsRm9sZGVyX0dldFVJT2JqZWN0T2YoCi0JTFBTSEVMTEZPTERFUiB0aGlzLAotCUhXTkQzMiBod25kT3duZXIsCi0JVUlOVDMyIGNpZGwsIAotICBMUENJVEVNSURMSVNUICogYXBpZGwsIC8qIHNpbXBsZSBwaWRsJ3MqLwotICBSRUZJSUQgcmlpZCwKLQlVSU5UMzIgKiBwcmdmSW5PdXQsCi0JTFBWT0lEICogcHB2T3V0KQoteyBjaGFyCSAgICAgICAgeGNsc2lkWzUwXTsKLSAgCi0JV0lORV9TdHJpbmdGcm9tQ0xTSUQocmlpZCx4Y2xzaWQpOwotCi0gIEZJWE1FKHNoZWxsLCIoJXApLT4oJXUsJXUscGlkbD0lcCxcblx0SUlEOiVzLCVwLCVwKSxzdHViIVxuIiwKLQkgIHRoaXMsaHduZE93bmVyLGNpZGwsYXBpZGwseGNsc2lkLHByZ2ZJbk91dCxwcHZPdXQpOwotCi0JKnBwdk91dCA9IE5VTEw7CQotCXJldHVybiBFX05PVElNUEw7Ci19Ci0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogIElTaGVsbEZvbGRlcl9HZXREaXNwbGF5TmFtZU9mCi0qICBSZXRyaWV2ZXMgdGhlIGRpc3BsYXkgbmFtZSBmb3IgdGhlIHNwZWNpZmllZCBmaWxlIG9iamVjdCBvciBzdWJmb2xkZXIKLSoKLSogUEFSQU1FVEVSUwotKiAgTFBDSVRFTUlETElTVCBwaWRsLCAgICAvL1tpbiBdIGNvbXBsZXggcGlkbCB0byBpdGVtCi0qICBEV09SRCAgICAgICAgIGR3RmxhZ3MsIC8vW2luIF0gU0hHTk8gZm9ybWF0dGluZyBmbGFncwotKiAgTFBTVFJSRVQgICAgICBscE5hbWUpICAvL1tvdXRdIFJldHVybmVkIGRpc3BsYXkgbmFtZQotKgotKiBGSVhNRQotKiAgaWYgdGhlIG5hbWUgaXMgaW4gdGhlIHBpZGwgdGhlIHJldCB2YWx1ZSBzaG91bGQgYmUgYSBTVFJSRVRfT0ZGU0VUCi0qLwotI2RlZmluZSBHRVRfU0hHRE5fRk9SKGR3RmxhZ3MpICAgICAgICAgKChEV09SRClkd0ZsYWdzICYgKERXT1JEKTB4MDAwMEZGMDApCi0jZGVmaW5lIEdFVF9TSEdETl9SRUxBVElPTihkd0ZsYWdzKSAgICAoKERXT1JEKWR3RmxhZ3MgJiAoRFdPUkQpMHgwMDAwMDBGRikKLQotc3RhdGljIEhSRVNVTFQgV0lOQVBJIElTaGVsbEZvbGRlcl9HZXREaXNwbGF5TmFtZU9mKCAKLSAgCUxQU0hFTExGT0xERVIgdGhpcywKLSAgICBMUENJVEVNSURMSVNUIHBpZGwsIC8qIHNpbXBsZS9jb21wbGV4IHBpZGwqLwotICAgIERXT1JEIGR3RmxhZ3MsIAotICAgIExQU1RSUkVUIGxwTmFtZSkKLXsgQ0hBUiAgICAgICAgICAgc3pUZXh0W01BWF9QQVRIXTsKLSAgQ0hBUiAgICAgICAgICAgc3pUZW1wW01BWF9QQVRIXTsKLQlDSEFSICAgICAgICAgICBzelNwZWNpYWxbTUFYX1BBVEhdOwotCUNIQVIgICAgICAgICAgIHN6RHJpdmVbTUFYX1BBVEhdOwotICBEV09SRCAgICAgICAgICBkd1ZvbHVtZVNlcmlhbE51bWJlcixkd01heGltdW1Db21wb25ldExlbmd0aCxkd0ZpbGVTeXN0ZW1GbGFnczsKLSAgTFBJVEVNSURMSVNUICAgcGlkbFRlbXA9TlVMTDsKLQlCT09MMzIJCQkJIGJTaW1wbGVQaWRsPUZBTFNFOwotCQkKLSAgVFJBQ0Uoc2hlbGwsIiglcCktPihwaWRsPSVwLDB4JTA4bHgsJXApXG4iLHRoaXMscGlkbCxkd0ZsYWdzLGxwTmFtZSk7Ci0KLSAgaWYgKCFwaWRsKQotICB7ICByZXR1cm4gRV9PVVRPRk1FTU9SWTsKLSAgfSAKLQotICBzelNwZWNpYWxbMF09MHgwMDsgCi0gIHN6RHJpdmVbMF09MHgwMDsKLQotICAvKiB0ZXN0IGlmIHNpbXBsZShyZWxhdGl2ZSkgb3IgY29tcGxleChhYnNvbHV0ZSkgcGlkbCAqLwotICBwaWRsVGVtcCA9IHRoaXMtPnBQaWRsTWdyLT5scHZ0YmwtPmZuR2V0TmV4dEl0ZW0odGhpcy0+cFBpZGxNZ3IscGlkbCk7Ci0JaWYgKHBpZGxUZW1wLT5ta2lkLmNiPT0weDAwKQotCXsgYlNpbXBsZVBpZGwgPSBUUlVFOwotCX0KLQlpZiAodGhpcy0+cFBpZGxNZ3ItPmxwdnRibC0+Zm5Jc0Rlc2t0b3AodGhpcy0+cFBpZGxNZ3IsIHBpZGwpKQotCXsgc3RyY3B5IChzelRleHQsIkRlc2t0b3AiKTsKLQl9Ci0JZWxzZQotICB7IGlmICh0aGlzLT5wUGlkbE1nci0+bHB2dGJsLT5mbklzTXlDb21wdXRlcih0aGlzLT5wUGlkbE1nciwgcGlkbCkpCi0gICAgeyB0aGlzLT5wUGlkbE1nci0+bHB2dGJsLT5mbkdldEl0ZW1UZXh0KHRoaXMtPnBQaWRsTWdyLCBwaWRsLCBzelNwZWNpYWwsIE1BWF9QQVRIKTsKLSAgICB9Ci0JICBpZiAodGhpcy0+cFBpZGxNZ3ItPmxwdnRibC0+Zm5Jc0RyaXZlKHRoaXMtPnBQaWRsTWdyLCBwaWRsKSkKLQkJeyBwaWRsVGVtcCA9IHRoaXMtPnBQaWRsTWdyLT5scHZ0YmwtPmZuR2V0TGFzdEl0ZW0odGhpcy0+cFBpZGxNZ3IscGlkbCk7Ci0gIAkJaWYgKHBpZGxUZW1wKQotICAgICAgeyB0aGlzLT5wUGlkbE1nci0+bHB2dGJsLT5mbkdldEl0ZW1UZXh0KHRoaXMtPnBQaWRsTWdyLCBwaWRsVGVtcCwgc3pUZW1wLCBNQVhfUEFUSCk7Ci0gIAkJfQotCQkgIGlmICggZHdGbGFncz09U0hHRE5fTk9STUFMIHx8IGR3RmxhZ3M9PVNIR0ROX0lORk9MREVSKQotICAJCXsgR2V0Vm9sdW1lSW5mb3JtYXRpb24zMkEoc3pUZW1wLHN6RHJpdmUsTUFYX1BBVEgsJmR3Vm9sdW1lU2VyaWFsTnVtYmVyLCZkd01heGltdW1Db21wb25ldExlbmd0aCwmZHdGaWxlU3lzdGVtRmxhZ3MsTlVMTCwwKTsKLQkJCQlpZiAoc3pUZW1wWzJdPT0nXFwnKQotICAgICAgICB7IHN6VGVtcFsyXT0weDAwOwotCQkJCX0KLSAgICAgICAgc3RyY2F0IChzekRyaXZlLCIgKCIpOwotCQkJCXN0cmNhdCAoc3pEcml2ZSxzelRlbXApOwotCQkJCXN0cmNhdCAoc3pEcml2ZSwiKSIpOyAKLSAgCQl9Ci0JCQllbHNlCi0JCQl7ICBQYXRoQWRkQmFja3NsYXNoIChzelRlbXApOwotCQkJICAgc3RyY3B5KHN6RHJpdmUsc3pUZW1wKTsKLQkJCX0KLQkJfQotCQkKLSAgCXN3aXRjaChkd0ZsYWdzKQotICAgIHsgY2FzZSBTSEdETl9OT1JNQUw6Ci0gICAgICAgIHRoaXMtPnBQaWRsTWdyLT5scHZ0YmwtPmZuR2V0UGlkbFBhdGgodGhpcy0+cFBpZGxNZ3IsIHBpZGwsIHN6VGV4dCwgTUFYX1BBVEgpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgU0hHRE5fSU5GT0xERVI6Ci0gICAgICAgIHBpZGxUZW1wID0gdGhpcy0+cFBpZGxNZ3ItPmxwdnRibC0+Zm5HZXRMYXN0SXRlbSh0aGlzLT5wUGlkbE1ncixwaWRsKTsKLSAgCQkJaWYgKHBpZGxUZW1wKQotICAgICAgICB7IHRoaXMtPnBQaWRsTWdyLT5scHZ0YmwtPmZuR2V0SXRlbVRleHQodGhpcy0+cFBpZGxNZ3IsIHBpZGxUZW1wLCBzelRleHQsIE1BWF9QQVRIKTsKLSAgCQkJfQotICAgCQkJYnJlYWs7CQkJCQotICAgCQljYXNlCVNIR0ROX0ZPUlBBUlNJTkc6Ci0JCQkgIGlmIChiU2ltcGxlUGlkbCkKLQkJCQl7IC8qIGlmIHRoZSBJU2hlbGxGb2xkZXIgaGFzIHBhcmVudHMsIGdldCB0aGUgcGF0aCBmcm9tIHRoZQotCQkJCSAgcGFyZW50IGFuZCBhZGQgdGhlIEl0ZW1OYW1lKi8KLSAgICAgICAgICBzelRleHRbMF09MHgwMDsKLQkJCQkgIGlmICh0aGlzLT5tbHBzekZvbGRlciAmJiBzdHJsZW4gKHRoaXMtPm1scHN6Rm9sZGVyKSkKLSAgICAgICAgICB7IGlmIChzdHJjbXAodGhpcy0+bWxwc3pGb2xkZXIsIk15IENvbXB1dGVyIikpCi0gIAkJCSAgeyBzdHJjcHkgKHN6VGV4dCx0aGlzLT5tbHBzekZvbGRlcik7Ci0gIAkJCSAgICBQYXRoQWRkQmFja3NsYXNoIChzelRleHQpOwotICAJCQkgIH0KLSAgCQkgIAl9Ci0gICAgICAgICAgcGlkbFRlbXAgPSB0aGlzLT5wUGlkbE1nci0+bHB2dGJsLT5mbkdldExhc3RJdGVtKHRoaXMtPnBQaWRsTWdyLHBpZGwpOwotICAgICAgICAJaWYgKHBpZGxUZW1wKQotICAgICAgICAgIHsgdGhpcy0+cFBpZGxNZ3ItPmxwdnRibC0+Zm5HZXRJdGVtVGV4dCh0aGlzLT5wUGlkbE1nciwgcGlkbFRlbXAsIHN6VGVtcCwgTUFYX1BBVEggKTsKLSAgICAgICAgCX0gCi0JCQkJCXN0cmNhdChzelRleHQsc3pUZW1wKTsKLQkJCQl9Ci0JCQkJZWxzZQkJCQkJCi0JCQkJeyAvKiBpZiB0aGUgcGlkbCBpcyBhYnNvbHV0ZSwgZ2V0IGV2ZXJ5dGhpbmcgZnJvbSB0aGUgcGlkbCovCi0JCQkJICB0aGlzLT5wUGlkbE1nci0+bHB2dGJsLT5mbkdldFBpZGxQYXRoKHRoaXMtPnBQaWRsTWdyLCBwaWRsLCBzelRleHQsIE1BWF9QQVRIKTsKLQkJCQl9Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDogICAgcmV0dXJuIEVfSU5WQUxJREFSRzsKLSAgICB9Ci0JCWlmICgoc3pUZXh0WzBdPT0weDAwICYmIHN6RHJpdmVbMF0hPTB4MDApfHwgKGJTaW1wbGVQaWRsICYmIHN6RHJpdmVbMF0hPTB4MDApKQotCQl7IHN0cmNweShzelRleHQsc3pEcml2ZSk7Ci0JCX0KLQkJaWYgKHN6VGV4dFswXT09MHgwMCAmJiBzelNwZWNpYWxbMF0hPTB4MDApCi0JCXsgc3RyY3B5KHN6VGV4dCxzelNwZWNpYWwpOwotCQl9Ci0gIH0KLSAgCi0gIFRSQUNFKHNoZWxsLCItLSAoJXApLT4oJXMsJXMsJXMpXG4iLHRoaXMsc3pTcGVjaWFsLHN6RHJpdmUsc3pUZXh0KTsKLQotICBpZighKGxwTmFtZSkpCi0gIHsgIHJldHVybiBFX09VVE9GTUVNT1JZOwotCX0KLSAgbHBOYW1lLT51VHlwZSA9IFNUUlJFVF9DU1RSOwkKLQlzdHJjcHkobHBOYW1lLT51LmNTdHIsc3pUZXh0KTsKLSAgcmV0dXJuIFNfT0s7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiAgSVNoZWxsRm9sZGVyX1NldE5hbWVPZgotKiAgQ2hhbmdlcyB0aGUgbmFtZSBvZiBhIGZpbGUgb2JqZWN0IG9yIHN1YmZvbGRlciwgcG9zc2libHkgY2hhbmdpbmcgaXRzIGl0ZW0KLSogIGlkZW50aWZpZXIgaW4gdGhlIHByb2Nlc3MuCi0qCi0qIFBBUkFNRVRFUlMKLSogIEhXTkQgICAgICAgICAgaHduZE93bmVyLCAgLy9baW4gXSBPd25lciB3aW5kb3cgZm9yIG91dHB1dAotKiAgTFBDSVRFTUlETElTVCBwaWRsLCAgICAgICAvL1tpbiBdIHNpbXBsZSBwaWRsIG9mIGl0ZW0gdG8gY2hhbmdlCi0qICBMUENPTEVTVFIgICAgIGxwc3pOYW1lLCAgIC8vW2luIF0gdGhlIGl0ZW1zIG5ldyBkaXNwbGF5IG5hbWUKLSogIERXT1JEICAgICAgICAgZHdGbGFncywgICAgLy9baW4gXSBTSEdOTyBmb3JtYXR0aW5nIGZsYWdzCi0qICBMUElURU1JRExJU1QqIHBwaWRsT3V0KSAgIC8vW291dF0gc2ltcGxlIHBpZGwgcmV0dXJuZWQKLSovCi1zdGF0aWMgSFJFU1VMVCBXSU5BUEkgSVNoZWxsRm9sZGVyX1NldE5hbWVPZigKLSAgCUxQU0hFTExGT0xERVIgdGhpcywKLQkJSFdORDMyIGh3bmRPd25lciwgCi0gICAgTFBDSVRFTUlETElTVCBwaWRsLCAvKnNpbXBsZSBwaWRsKi8KLSAgICBMUENPTEVTVFIzMiBscE5hbWUsIAotICAgIERXT1JEIGR3LCAKLSAgICBMUElURU1JRExJU1QgKnBQaWRsT3V0KQoteyAgRklYTUUoc2hlbGwsIiglcCktPigldSxwaWRsPSVwLCVzLCVsdSwlcCksc3R1YiFcbiIsCi0JICB0aGlzLGh3bmRPd25lcixwaWRsLGRlYnVnc3RyX3cobHBOYW1lKSxkdyxwUGlkbE91dCk7Ci0JIHJldHVybiBFX05PVElNUEw7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBJU2hlbGxMaW5rIEltcGxlbWVudGF0aW9uCi0qLwotc3RhdGljIEhSRVNVTFQgV0lOQVBJIElTaGVsbExpbmtfUXVlcnlJbnRlcmZhY2UoTFBTSEVMTExJTkssUkVGSUlELExQVk9JRCopOwotc3RhdGljIFVMT05HIFdJTkFQSSBJU2hlbGxMaW5rX0FkZFJlZihMUFNIRUxMTElOSyk7Ci1zdGF0aWMgVUxPTkcgV0lOQVBJIElTaGVsbExpbmtfUmVsZWFzZShMUFNIRUxMTElOSyk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgkgIElTaGVsbExpbmtfVlRhYmxlCi0qLwotc3RhdGljIHN0cnVjdCBJU2hlbGxMaW5rX1ZUYWJsZSBzbHZ0ID0gewotICBJU2hlbGxMaW5rX1F1ZXJ5SW50ZXJmYWNlLAotICBJU2hlbGxMaW5rX0FkZFJlZiwKLSAgSVNoZWxsTGlua19SZWxlYXNlLAotICAgICh2b2lkICopMHhjYWZlMDAwNCwKLSAgICAodm9pZCAqKTB4Y2FmZTAwMDUsCi0gICAgKHZvaWQgKikweGNhZmUwMDA2LAotICAgICh2b2lkICopMHhjYWZlMDAwNywKLSAgICAodm9pZCAqKTB4Y2FmZTAwMDgsCi0gICAgKHZvaWQgKikweGNhZmUwMDA5LAotICAgICh2b2lkICopMHhjYWZlMDAxMCwKLSAgICAodm9pZCAqKTB4Y2FmZTAwMTEsCi0gICAgKHZvaWQgKikweGNhZmUwMDEyLAotICAgICh2b2lkICopMHhjYWZlMDAxMywKLSAgICAodm9pZCAqKTB4Y2FmZTAwMTQsCi0gICAgKHZvaWQgKikweGNhZmUwMDE1LAotICAgICh2b2lkICopMHhjYWZlMDAxNiwKLSAgICAodm9pZCAqKTB4Y2FmZTAwMTcsCi0gICAgKHZvaWQgKikweGNhZmUwMDE4LAotICAgICh2b2lkICopMHhjYWZlMDAxOSwKLSAgICAodm9pZCAqKTB4Y2FmZTAwMjAsCi0gICAgKHZvaWQgKikweGNhZmUwMDIxCi19OwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCSAgSVNoZWxsTGlua19Db25zdHJ1Y3RvcgotICovCi1MUFNIRUxMTElOSyBJU2hlbGxMaW5rX0NvbnN0cnVjdG9yKCkgCi17CUxQU0hFTExMSU5LIHNsOwotCi0Jc2wgPSAoTFBTSEVMTExJTkspSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksMCxzaXplb2YoSVNoZWxsTGluaykpOwotCXNsLT5yZWYgPSAxOwotCXNsLT5scHZ0YmwgPSAmc2x2dDsKLQlUUkFDRShzaGVsbCwiKCVwKS0+KClcbiIsc2wpOwotCXJldHVybiBzbDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgSVNoZWxsTGluazo6UXVlcnlJbnRlcmZhY2UKLSAqLwotc3RhdGljIEhSRVNVTFQgV0lOQVBJIElTaGVsbExpbmtfUXVlcnlJbnRlcmZhY2UoCi0gIExQU0hFTExMSU5LIHRoaXMsIFJFRklJRCByaWlkLCBMUFZPSUQgKnBwdk9iaikKLXsgIGNoYXIgICAgeHJpaWRbNTBdOwotICAgV0lORV9TdHJpbmdGcm9tQ0xTSUQoKExQQ0xTSUQpcmlpZCx4cmlpZCk7Ci0gICBUUkFDRShzaGVsbCwiKCVwKS0+KFxuXHRJSUQ6XHQlcylcbiIsdGhpcyx4cmlpZCk7Ci0KLSAgKnBwdk9iaiA9IE5VTEw7Ci0KLSAgaWYoSXNFcXVhbElJRChyaWlkLCAmSUlEX0lVbmtub3duKSkgICAgICAgICAgLypJVW5rbm93biovCi0gIHsgKnBwdk9iaiA9IHRoaXM7IAotICB9Ci0gIGVsc2UgaWYoSXNFcXVhbElJRChyaWlkLCAmSUlEX0lTaGVsbExpbmspKSAgLypJU2hlbGxMaW5rKi8KLSAgeyAgICAqcHB2T2JqID0gKExQU0hFTExMSU5LKXRoaXM7Ci0gIH0gICAKLQotICBpZigqcHB2T2JqKQotICB7ICgqKExQU0hFTExMSU5LKilwcHZPYmopLT5scHZ0YmwtPmZuQWRkUmVmKHRoaXMpOyAgICAgIAotICAgIFRSQUNFKHNoZWxsLCItLSBJbnRlcmZhY2U6ICglcCktPiglcClcbiIscHB2T2JqLCpwcHZPYmopOwotICAgIHJldHVybiBTX09LOwotICB9Ci0gICAgVFJBQ0Uoc2hlbGwsIi0tIEludGVyZmFjZTogRV9OT0lOVEVSRkFDRVxuIik7Ci0gIHJldHVybiBFX05PSU5URVJGQUNFOwotfSAgCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBJU2hlbGxMaW5rX0FkZFJlZgotICovCi1zdGF0aWMgVUxPTkcgV0lOQVBJIElTaGVsbExpbmtfQWRkUmVmKExQU0hFTExMSU5LIHRoaXMpCi17IFRSQUNFKHNoZWxsLCIoJXApLT4oY291bnQ9JWx1KVxuIix0aGlzLHRoaXMtPnJlZik7Ci0gICAgcmV0dXJuICsrKHRoaXMtPnJlZik7Ci19Ci0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBJQ2xhc3NGYWN0b3J5X1JlbGVhc2UKLSAqLwotc3RhdGljIFVMT05HIFdJTkFQSSBJU2hlbGxMaW5rX1JlbGVhc2UoTFBTSEVMTExJTksgdGhpcykKLXsgVFJBQ0Uoc2hlbGwsIiglcCktPihjb3VudD0lbHUpXG4iLHRoaXMsdGhpcy0+cmVmKTsKLSAgaWYgKCEtLSh0aGlzLT5yZWYpKSAKLSAgeyBUUkFDRShzaGVsbCwiLS0gZGVzdHJveWluZyBJU2hlbGxMaW5rKCVwKVxuIix0aGlzKTsKLSAgICBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLDAsdGhpcyk7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLSAgcmV0dXJuIHRoaXMtPnJlZjsKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoJICBJTlRFUk5BTCBDTEFTUyBwaWRsbWdyCi0qLwotTFBJVEVNSURMSVNUIFBpZGxNZ3JfQ3JlYXRlRGVza3RvcChMUFBJRExNR1IpOwotTFBJVEVNSURMSVNUIFBpZGxNZ3JfQ3JlYXRlTXlDb21wdXRlcihMUFBJRExNR1IpOwotTFBJVEVNSURMSVNUIFBpZGxNZ3JfQ3JlYXRlRHJpdmUoTFBQSURMTUdSLExQQ1NUUik7Ci1MUElURU1JRExJU1QgUGlkbE1ncl9DcmVhdGVGb2xkZXIoTFBQSURMTUdSLExQQ1NUUik7Ci1MUElURU1JRExJU1QgUGlkbE1ncl9DcmVhdGVWYWx1ZShMUFBJRExNR1IsTFBDU1RSKTsKLS8qdm9pZCBQaWRsTWdyX0RlbGV0ZShMUFBJRExNR1IsTFBJVEVNSURMSVNUKTsqLwotTFBJVEVNSURMSVNUIFBpZGxNZ3JfR2V0TmV4dEl0ZW0oTFBQSURMTUdSLExQSVRFTUlETElTVCk7Ci1CT09MMzIgUGlkbE1ncl9HZXREZXNrdG9wKExQUElETE1HUixMUENJVEVNSURMSVNULExQU1RSKTsKLUJPT0wzMiBQaWRsTWdyX0dldERyaXZlKExQUElETE1HUixMUENJVEVNSURMSVNULExQU1RSLFVJTlQxNik7Ci1MUElURU1JRExJU1QgUGlkbE1ncl9HZXRMYXN0SXRlbShMUFBJRExNR1IsTFBDSVRFTUlETElTVCk7Ci1EV09SRCBQaWRsTWdyX0dldEl0ZW1UZXh0KExQUElETE1HUixMUENJVEVNSURMSVNULExQU1RSLFVJTlQxNik7Ci1CT09MMzIgUGlkbE1ncl9Jc0Rlc2t0b3AoTFBQSURMTUdSLExQQ0lURU1JRExJU1QpOwotQk9PTDMyIFBpZGxNZ3JfSXNNeUNvbXB1dGVyKExQUElETE1HUixMUENJVEVNSURMSVNUKTsKLUJPT0wzMiBQaWRsTWdyX0lzRHJpdmUoTFBQSURMTUdSLExQQ0lURU1JRExJU1QpOwotQk9PTDMyIFBpZGxNZ3JfSXNGb2xkZXIoTFBQSURMTUdSLExQQ0lURU1JRExJU1QpOwotQk9PTDMyIFBpZGxNZ3JfSXNWYWx1ZShMUFBJRExNR1IsTFBDSVRFTUlETElTVCk7Ci1CT09MMzIgUGlkbE1ncl9IYXNGb2xkZXJzKExQUElETE1HUixMUFNUUixMUENJVEVNSURMSVNUKTsKLURXT1JEIFBpZGxNZ3JfR2V0Rm9sZGVyVGV4dChMUFBJRExNR1IsTFBDSVRFTUlETElTVCxMUFNUUixEV09SRCk7Ci1EV09SRCBQaWRsTWdyX0dldFZhbHVlVGV4dChMUFBJRExNR1IsTFBDSVRFTUlETElTVCxMUFNUUixEV09SRCk7Ci1CT09MMzIgUGlkbE1ncl9HZXRWYWx1ZVR5cGUoTFBQSURMTUdSLExQQ0lURU1JRExJU1QsTFBDSVRFTUlETElTVCxMUERXT1JEKTsKLURXT1JEIFBpZGxNZ3JfR2V0RGF0YVRleHQoTFBQSURMTUdSLExQQ0lURU1JRExJU1QsTFBDSVRFTUlETElTVCxMUFNUUixEV09SRCk7Ci1EV09SRCBQaWRsTWdyX0dldFBpZGxQYXRoKExQUElETE1HUixMUENJVEVNSURMSVNULExQU1RSLERXT1JEKTsKLUxQSVRFTUlETElTVCBQaWRsTWdyX0NyZWF0ZShMUFBJRExNR1IsUElETFRZUEUsTFBWT0lELFVJTlQxNik7Ci1EV09SRCBQaWRsTWdyX0dldERhdGEoTFBQSURMTUdSLFBJRExUWVBFLExQQ0lURU1JRExJU1QsTFBWT0lELFVJTlQxNik7Ci1MUFBJRExEQVRBIFBpZGxNZ3JfR2V0RGF0YVBvaW50ZXIoTFBQSURMTUdSLExQQ0lURU1JRExJU1QpOwotQk9PTDMyIFBpZGxNZ3JfU2VwYXJhdGVQYXRoQW5kVmFsdWUoTFBQSURMTUdSLExQSVRFTUlETElTVCxMUElURU1JRExJU1QqLExQSVRFTUlETElTVCopOwotCi1zdGF0aWMgc3RydWN0IFBpZGxNZ3JfVlRhYmxlIHBtZ3J2dCA9IHsKLSAgICBQaWRsTWdyX0NyZWF0ZURlc2t0b3AsCi0gICAgUGlkbE1ncl9DcmVhdGVNeUNvbXB1dGVyLAotCQlQaWRsTWdyX0NyZWF0ZURyaXZlLAotICAgIFBpZGxNZ3JfQ3JlYXRlRm9sZGVyLAotICAgIFBpZGxNZ3JfQ3JlYXRlVmFsdWUsCi0gIC8qICBQaWRsTWdyX0RlbGV0ZSwqLwotICAgIFBpZGxNZ3JfR2V0TmV4dEl0ZW0sCi0gICAgUGlkbE1ncl9HZXREZXNrdG9wLAotCQlQaWRsTWdyX0dldERyaXZlLAotICAgIFBpZGxNZ3JfR2V0TGFzdEl0ZW0sCi0gICAgUGlkbE1ncl9HZXRJdGVtVGV4dCwKLSAgICBQaWRsTWdyX0lzRGVza3RvcCwKLSAgICBQaWRsTWdyX0lzTXlDb21wdXRlciwKLQkJUGlkbE1ncl9Jc0RyaXZlLAotICAgIFBpZGxNZ3JfSXNGb2xkZXIsCi0gICAgUGlkbE1ncl9Jc1ZhbHVlLAotICAgIFBpZGxNZ3JfSGFzRm9sZGVycywKLSAgICBQaWRsTWdyX0dldEZvbGRlclRleHQsCi0gICAgUGlkbE1ncl9HZXRWYWx1ZVRleHQsCi0gICAgUGlkbE1ncl9HZXRWYWx1ZVR5cGUsCi0gICAgUGlkbE1ncl9HZXREYXRhVGV4dCwKLSAgICBQaWRsTWdyX0dldFBpZGxQYXRoLAotICAgIFBpZGxNZ3JfQ3JlYXRlLAotICAgIFBpZGxNZ3JfR2V0RGF0YSwKLSAgICBQaWRsTWdyX0dldERhdGFQb2ludGVyLAotICAgIFBpZGxNZ3JfU2VwYXJhdGVQYXRoQW5kVmFsdWUKLX07Ci0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCSAgUGlkbE1ncl9Db25zdHJ1Y3RvcgotICovCi1MUFBJRExNR1IgUGlkbE1ncl9Db25zdHJ1Y3RvcigpIAotewlMUFBJRExNR1IgcG1ncjsKLQlwbWdyID0gKExQUElETE1HUilIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwwLHNpemVvZihwaWRsbWdyKSk7Ci0JcG1nci0+bHB2dGJsID0gJnBtZ3J2dDsKLQlUUkFDRShzaGVsbCwiKCVwKS0+KClcbiIscG1ncik7Ci0gIC8qKiBGSVhNRSBEbGxSZWZDb3VudCsrOyovCi0JcmV0dXJuIHBtZ3I7Ci19Ci0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCSAgUGlkbE1ncl9EZXN0cnVjdG9yCi0gKi8KLXZvaWQgUGlkbE1ncl9EZXN0cnVjdG9yKExQUElETE1HUiB0aGlzKSAKLXsJSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwwLHRoaXMpOwotIAlUUkFDRShzaGVsbCwiKCVwKS0+KClcbiIsdGhpcyk7Ci0gIC8qKiBGSVhNRSBEbGxSZWZDb3VudC0tOyovCi19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIFBpZGxNZ3JfQ3JlYXRlRGVza3RvcCgpCi0gKiAgUGlkbE1ncl9DcmVhdGVNeUNvbXB1dGVyKCkKLSAqICBQaWRsTWdyX0NyZWF0ZURyaXZlKCkKLSAqICBQaWRsTWdyX0NyZWF0ZUZvbGRlcigpIAotICogIFBpZGxNZ3JfQ3JlYXRlVmFsdWUoKQotICovCi1MUElURU1JRExJU1QgUGlkbE1ncl9DcmVhdGVEZXNrdG9wKExQUElETE1HUiB0aGlzKQoteyBUUkFDRShzaGVsbCwiKCVwKS0+KClcbiIsdGhpcyk7Ci0gICAgcmV0dXJuIFBpZGxNZ3JfQ3JlYXRlKHRoaXMsUFRfREVTS1RPUCwgTlVMTCwgMCk7Ci19Ci1MUElURU1JRExJU1QgUGlkbE1ncl9DcmVhdGVNeUNvbXB1dGVyKExQUElETE1HUiB0aGlzKQoteyBUUkFDRShzaGVsbCwiKCVwKS0+KClcbiIsdGhpcyk7Ci0gIHJldHVybiBQaWRsTWdyX0NyZWF0ZSh0aGlzLFBUX01ZQ09NUCwgKHZvaWQgKikiTXkgQ29tcHV0ZXIiLCBzdHJsZW4gKCJNeSBDb21wdXRlciIpKzEpOwotfQotTFBJVEVNSURMSVNUIFBpZGxNZ3JfQ3JlYXRlRHJpdmUoTFBQSURMTUdSIHRoaXMsIExQQ1NUUiBscHN6TmV3KQoteyBjaGFyIHNUZW1wWzRdOwotICBzdHJuY3B5IChzVGVtcCxscHN6TmV3LDQpOwotCXNUZW1wWzJdPSdcXCc7Ci0Jc1RlbXBbM109MHgwMDsKLSAgVFJBQ0Uoc2hlbGwsIiglcCktPiglcylcbiIsdGhpcyxzVGVtcCk7Ci0gIHJldHVybiBQaWRsTWdyX0NyZWF0ZSh0aGlzLFBUX0RSSVZFLChMUFZPSUQpJnNUZW1wWzBdLDQpOwotfQotTFBJVEVNSURMSVNUIFBpZGxNZ3JfQ3JlYXRlRm9sZGVyKExQUElETE1HUiB0aGlzLCBMUENTVFIgbHBzek5ldykKLXsgVFJBQ0Uoc2hlbGwsIiglcCktPiglcylcbiIsdGhpcyxscHN6TmV3KTsKLSAgcmV0dXJuIFBpZGxNZ3JfQ3JlYXRlKHRoaXMsUFRfRk9MREVSLCAoTFBWT0lEKWxwc3pOZXcsIHN0cmxlbihscHN6TmV3KSsxKTsKLX0KLUxQSVRFTUlETElTVCBQaWRsTWdyX0NyZWF0ZVZhbHVlKExQUElETE1HUiB0aGlzLExQQ1NUUiBscHN6TmV3KQoteyBUUkFDRShzaGVsbCwiKCVwKS0+KCVzKVxuIix0aGlzLGxwc3pOZXcpOwotICByZXR1cm4gUGlkbE1ncl9DcmVhdGUodGhpcyxQVF9WQUxVRSwgKExQVk9JRClscHN6TmV3LCBzdHJsZW4obHBzek5ldykrMSk7Ci19Ci0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBQaWRsTWdyX0RlbGV0ZSgpCi0gKiAgRGVsZXRlcyBhIFBJREwKLSAqLwotLyp2b2lkIFBpZGxNZ3JfRGVsZXRlKExQUElETE1HUiB0aGlzLExQSVRFTUlETElTVCBwaWRsKQoteyBUUkFDRShzaGVsbCwiKCVwKS0+KHBpZGw9JXApXG4iLHRoaXMscGlkbCk7Ci0gIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksMCxwaWRsKTsKLX0KLSovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBQaWRsTWdyX0dldE5leHRJdGVtKCkKLSAqLwotTFBJVEVNSURMSVNUIFBpZGxNZ3JfR2V0TmV4dEl0ZW0oTFBQSURMTUdSIHRoaXMsIExQSVRFTUlETElTVCBwaWRsKQoteyBMUElURU1JRExJU1QgbmV4dHBpZGw7Ci0KLSAgVFJBQ0Uoc2hlbGwsIiglcCktPihwaWRsPSVwKVxuIix0aGlzLHBpZGwpOwotICBpZihwaWRsKQotICB7IG5leHRwaWRsID0gKExQSVRFTUlETElTVCkoTFBCWVRFKSgoKExQQllURSlwaWRsKSArIHBpZGwtPm1raWQuY2IpOwotLyogICAgVFJBQ0Uoc2hlbGwsIi0tICglcCktPihuZXh0IHBpZGw9JXApXG4iLHRoaXMsbmV4dHBpZGwpOyovCi0JCXJldHVybiBuZXh0cGlkbDsKLQl9Ci0gIGVsc2UKLSAgeyAgcmV0dXJuIChOVUxMKTsKLQl9Ci19Ci0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBQaWRsTWdyX0dldERlc2t0b3AoKQotICogCi0gKiAgRklYTUU6IHF1aWNrIGhhY2sKLSAqLwotQk9PTDMyIFBpZGxNZ3JfR2V0RGVza3RvcChMUFBJRExNR1IgdGhpcyxMUENJVEVNSURMSVNUIHBpZGwsTFBTVFIgcE91dCkKLXsgVFJBQ0Uoc2hlbGwsIiglcCktPiglcCAlcClcbiIsdGhpcyxwaWRsLHBPdXQpOwotICByZXR1cm4gKEJPT0wzMilQaWRsTWdyX0dldERhdGEodGhpcyxQVF9ERVNLVE9QLCBwaWRsLCAoTFBWT0lEKXBPdXQsIDI1NSk7Ci19Ci0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBQaWRsTWdyX0dldERyaXZlKCkKLSAqCi0gKiAgRklYTUU6IHF1aWNrIGhhY2sKLSAqLwotQk9PTDMyIFBpZGxNZ3JfR2V0RHJpdmUoTFBQSURMTUdSIHRoaXMsTFBDSVRFTUlETElTVCBwaWRsLExQU1RSIHBPdXQsIFVJTlQxNiB1U2l6ZSkKLXsgTFBJVEVNSURMSVNUICAgcGlkbFRlbXA9TlVMTDsKLQotICBUUkFDRShzaGVsbCwiKCVwKS0+KCVwLCVwLCV1KVxuIix0aGlzLHBpZGwscE91dCx1U2l6ZSk7Ci0gIGlmKFBpZGxNZ3JfSXNNeUNvbXB1dGVyKHRoaXMscGlkbCkpCi0gIHsgcGlkbFRlbXAgPSBQaWRsTWdyX0dldE5leHRJdGVtKHRoaXMscGlkbCk7Ci0JfQotICBlbHNlIGlmIChwaWRsVGVtcCAmJiBQaWRsTWdyX0lzRHJpdmUodGhpcyxwaWRsVGVtcCkpCi0gIHsgcmV0dXJuIChCT09MMzIpUGlkbE1ncl9HZXREYXRhKHRoaXMsUFRfRFJJVkUsIHBpZGxUZW1wLCAoTFBWT0lEKXBPdXQsIHVTaXplKTsKLQl9Ci0JcmV0dXJuIEZBTFNFOwotfQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgUGlkbE1ncl9HZXRMYXN0SXRlbSgpCi0gKiAgR2V0cyB0aGUgbGFzdCBpdGVtIGluIHRoZSBsaXN0Ci0gKi8KLUxQSVRFTUlETElTVCBQaWRsTWdyX0dldExhc3RJdGVtKExQUElETE1HUiB0aGlzLExQQ0lURU1JRExJU1QgcGlkbCkKLXsgTFBJVEVNSURMSVNUICAgcGlkbExhc3QgPSBOVUxMOwotCi0gIFRSQUNFKHNoZWxsLCIoJXApLT4ocGlkbD0lcClcbiIsdGhpcyxwaWRsKTsKLQotICBpZihwaWRsKQotICB7IHdoaWxlKHBpZGwtPm1raWQuY2IpCi0gICAgeyBwaWRsTGFzdCA9IChMUElURU1JRExJU1QpcGlkbDsKLSAgICAgIHBpZGwgPSBQaWRsTWdyX0dldE5leHRJdGVtKHRoaXMscGlkbCk7Ci0gICAgfSAgCi0gIH0KLSAgcmV0dXJuIHBpZGxMYXN0OwotfQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgUGlkbE1ncl9HZXRJdGVtVGV4dCgpCi0gKiAgR2V0cyB0aGUgdGV4dCBmb3Igb25seSB0aGlzIGl0ZW0KLSAqLwotRFdPUkQgUGlkbE1ncl9HZXRJdGVtVGV4dChMUFBJRExNR1IgdGhpcyxMUENJVEVNSURMSVNUIHBpZGwsIExQU1RSIGxwc3pUZXh0LCBVSU5UMTYgdVNpemUpCi17IFRSQUNFKHNoZWxsLCIoJXApLT4ocGlkbD0lcCAlcCAleClcbiIsdGhpcyxwaWRsLGxwc3pUZXh0LHVTaXplKTsKLSAgaWYgKFBpZGxNZ3JfSXNNeUNvbXB1dGVyKHRoaXMsIHBpZGwpKQotICB7IHJldHVybiBQaWRsTWdyX0dldERhdGEodGhpcyxQVF9NWUNPTVAsIHBpZGwsIChMUFZPSUQpbHBzelRleHQsIHVTaXplKTsKLQl9Ci0JaWYgKFBpZGxNZ3JfSXNEcml2ZSh0aGlzLCBwaWRsKSkKLQl7IHJldHVybiBQaWRsTWdyX0dldERhdGEodGhpcyxQVF9EUklWRSwgcGlkbCwgKExQVk9JRClscHN6VGV4dCwgdVNpemUpOwotCX0KLQlyZXR1cm4gUGlkbE1ncl9HZXREYXRhKHRoaXMsUFRfVEVYVCwgcGlkbCwgKExQVk9JRClscHN6VGV4dCwgdVNpemUpOwkKLX0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIFBpZGxNZ3JfSXNEZXNrdG9wKCkKLSAqICBQaWRsTWdyX0lzRHJpdmUoKQotICogIFBpZGxNZ3JfSXNGb2xkZXIoKQotICogIFBpZGxNZ3JfSXNWYWx1ZSgpCi0qLwotQk9PTDMyIFBpZGxNZ3JfSXNEZXNrdG9wKExQUElETE1HUiB0aGlzLExQQ0lURU1JRExJU1QgcGlkbCkKLXsgVFJBQ0Uoc2hlbGwsIiVwLT4oJXApXG4iLHRoaXMscGlkbCk7Ci0KLSAgaWYgKCEgcGlkbCkKLSAgICByZXR1cm4gRkFMU0U7Ci0KLSAgcmV0dXJuICggIHBpZGwtPm1raWQuY2IgPT0gMHgwMCApOwotfQotCi1CT09MMzIgUGlkbE1ncl9Jc015Q29tcHV0ZXIoTFBQSURMTUdSIHRoaXMsTFBDSVRFTUlETElTVCBwaWRsKQoteyBMUFBJRExEQVRBICBwRGF0YTsKLSAgVFJBQ0Uoc2hlbGwsIiVwLT4oJXApXG4iLHRoaXMscGlkbCk7Ci0KLSAgaWYgKCEgcGlkbCkKLSAgICByZXR1cm4gRkFMU0U7Ci0KLSAgcERhdGEgPSBQaWRsTWdyX0dldERhdGFQb2ludGVyKHRoaXMscGlkbCk7Ci0gIHJldHVybiAoUFRfTVlDT01QID09IHBEYXRhLT50eXBlKTsKLX0KLQotQk9PTDMyIFBpZGxNZ3JfSXNEcml2ZShMUFBJRExNR1IgdGhpcyxMUENJVEVNSURMSVNUIHBpZGwpCi17IExQUElETERBVEEgIHBEYXRhOwotICBUUkFDRShzaGVsbCwiJXAtPiglcClcbiIsdGhpcyxwaWRsKTsKLQotICBpZiAoISBwaWRsKQotICAgIHJldHVybiBGQUxTRTsKLQotICBwRGF0YSA9IFBpZGxNZ3JfR2V0RGF0YVBvaW50ZXIodGhpcyxwaWRsKTsKLSAgcmV0dXJuIChQVF9EUklWRSA9PSBwRGF0YS0+dHlwZSk7Ci19Ci0KLUJPT0wzMiBQaWRsTWdyX0lzRm9sZGVyKExQUElETE1HUiB0aGlzLExQQ0lURU1JRExJU1QgcGlkbCkKLXsgTFBQSURMREFUQSAgcERhdGE7Ci0gIFRSQUNFKHNoZWxsLCIlcC0+KCVwKVxuIix0aGlzLHBpZGwpOwotCi0gIGlmICghIHBpZGwpCi0gICAgcmV0dXJuIEZBTFNFOwotCi0gIHBEYXRhID0gUGlkbE1ncl9HZXREYXRhUG9pbnRlcih0aGlzLHBpZGwpOwotICByZXR1cm4gKFBUX0ZPTERFUiA9PSBwRGF0YS0+dHlwZSk7Ci19Ci0KLUJPT0wzMiBQaWRsTWdyX0lzVmFsdWUoTFBQSURMTUdSIHRoaXMsTFBDSVRFTUlETElTVCBwaWRsKQoteyBMUFBJRExEQVRBICBwRGF0YTsKLSAgVFJBQ0Uoc2hlbGwsIiVwLT4oJXApXG4iLHRoaXMscGlkbCk7Ci0KLSAgaWYgKCEgcGlkbCkKLSAgICByZXR1cm4gRkFMU0U7Ci0KLSAgcERhdGEgPSBQaWRsTWdyX0dldERhdGFQb2ludGVyKHRoaXMscGlkbCk7Ci0gIHJldHVybiAoUFRfVkFMVUUgPT0gcERhdGEtPnR5cGUpOwotfQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBQaWRsTWdyX0hhc0ZvbGRlcnMoKQotICogZml4bWU6IHF1aWNrIGhhY2sKLSAqLwotQk9PTDMyIFBpZGxNZ3JfSGFzRm9sZGVycyhMUFBJRExNR1IgdGhpcywgTFBTVFIgcHN6UGF0aCwgTFBDSVRFTUlETElTVCBwaWRsKQoteyBCT09MMzIgYlJlc3VsdD0gRkFMU0U7Ci0gIFdJTjMyX0ZJTkRfREFUQTMyQSBzdGZmaWxlOwkKLSAgSEFORExFMzIgaEZpbGU7Ci0KLSAgVFJBQ0UgKHNoZWxsLCIoJXApLT4lcCAlcFxuIix0aGlzLCBwc3pQYXRoLCBwaWRsKTsKLQkKLSAgaEZpbGUgPSBGaW5kRmlyc3RGaWxlMzJBKHBzelBhdGgsJnN0ZmZpbGUpOwotICBkbwotICB7IGlmICghIChzdGZmaWxlLmR3RmlsZUF0dHJpYnV0ZXMgJiBGSUxFX0FUVFJJQlVURV9ESVJFQ1RPUlkpICkKLSAgICB7ICBiUmVzdWx0PSBUUlVFOwotCQl9Ci0gIH0gd2hpbGUoIEZpbmROZXh0RmlsZTMyQShoRmlsZSwmc3RmZmlsZSkpOwotICBGaW5kQ2xvc2UzMiAoaEZpbGUpOwotCQotCXJldHVybiBiUmVzdWx0OwotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIFBpZGxNZ3JfR2V0Rm9sZGVyVGV4dCgpCi0gKiAgQ3JlYXRlcyBhIFBhdGggc3RyaW5nIGZyb20gYSBQSURMLCBmaWx0ZXJpbmcgb3V0IHRoZSBzcGVjaWFsIEZvbGRlcnMgCi0gKi8KLURXT1JEIFBpZGxNZ3JfR2V0Rm9sZGVyVGV4dChMUFBJRExNR1IgdGhpcyxMUENJVEVNSURMSVNUIHBpZGwsCi0gICBMUFNUUiBscHN6UGF0aCwgRFdPUkQgZHdTaXplKQoteyBMUElURU1JRExJU1QgICBwaWRsVGVtcDsKLSAgRFdPUkQgICAgICAgICAgZHdDb3BpZWQgPSAwOwotIAotICBUUkFDRShzaGVsbCwiKCVwKS0+KCVwKVxuIix0aGlzLHBpZGwpOwotIAotICBpZighcGlkbCkKLSAgeyByZXR1cm4gMDsKLQl9Ci0KLSAgaWYoUGlkbE1ncl9Jc015Q29tcHV0ZXIodGhpcyxwaWRsKSkKLSAgeyBwaWRsVGVtcCA9IFBpZGxNZ3JfR2V0TmV4dEl0ZW0odGhpcyxwaWRsKTsKLSAgICBUUkFDRShzaGVsbCwiLS0gKCVwKS0+c2tpcCBNeSBDb21wdXRlclxuIix0aGlzKTsKLQl9Ci0gIGVsc2UKLSAgeyBwaWRsVGVtcCA9IChMUElURU1JRExJU1QpcGlkbDsKLQl9Ci0KLSAgLy9pZiB0aGlzIGlzIE5VTEwsIHJldHVybiB0aGUgcmVxdWlyZWQgc2l6ZSBvZiB0aGUgYnVmZmVyCi0gIGlmKCFscHN6UGF0aCkKLSAgeyB3aGlsZShwaWRsVGVtcC0+bWtpZC5jYikKLSAgICB7IExQUElETERBVEEgIHBEYXRhID0gUGlkbE1ncl9HZXREYXRhUG9pbnRlcih0aGlzLHBpZGxUZW1wKTsKLSAgICAgIAotICAgICAgLy9hZGQgdGhlIGxlbmd0aCBvZiB0aGlzIGl0ZW0gcGx1cyBvbmUgZm9yIHRoZSBiYWNrc2xhc2gKLSAgICAgIGR3Q29waWVkICs9IHN0cmxlbihwRGF0YS0+c3pUZXh0KSArIDE7ICAvKiBmaXhtZSBwRGF0YS0+c3pUZXh0IGlzIG5vdCBldmVyeSB0aW1lIGEgc3RyaW5nKi8KLQotICAgICAgcGlkbFRlbXAgPSBQaWRsTWdyX0dldE5leHRJdGVtKHRoaXMscGlkbFRlbXApOwotICAgIH0KLQotICAgIC8vYWRkIG9uZSBmb3IgdGhlIE5VTEwgdGVybWluYXRvcgotCSAgVFJBQ0Uoc2hlbGwsIi0tICglcCktPihzaXplPSVsdSlcbiIsdGhpcyxkd0NvcGllZCk7Ci0gICAgcmV0dXJuIGR3Q29waWVkICsgMTsKLSAgfQotCi0gICpscHN6UGF0aCA9IDA7Ci0KLSAgd2hpbGUocGlkbFRlbXAtPm1raWQuY2IgJiYgKGR3Q29waWVkIDwgZHdTaXplKSkKLSAgeyBMUFBJRExEQVRBICBwRGF0YSA9IFBpZGxNZ3JfR2V0RGF0YVBvaW50ZXIodGhpcyxwaWRsVGVtcCk7Ci0KLSAgICAvL2lmIHRoaXMgaXRlbSBpcyBhIHZhbHVlLCB0aGVuIHNraXAgaXQgYW5kIGZpbmlzaAotICAgIGlmKFBUX1ZBTFVFID09IHBEYXRhLT50eXBlKQotICAgIHsgYnJlYWs7Ci0JCX0KLSAgIAotICAgIHN0cmNhdChscHN6UGF0aCwgcERhdGEtPnN6VGV4dCk7Ci0gICAgc3RyY2F0KGxwc3pQYXRoLCAiXFwiKTsKLSAgICBkd0NvcGllZCArPSBzdHJsZW4ocERhdGEtPnN6VGV4dCkgKyAxOwotICAgIHBpZGxUZW1wID0gUGlkbE1ncl9HZXROZXh0SXRlbSh0aGlzLHBpZGxUZW1wKTsKLQotCQlUUkFDRShzaGVsbCwiLS0gKCVwKS0+KHNpemU9JWx1LCVzKVxuIix0aGlzLGR3Q29waWVkLGxwc3pQYXRoKTsKLSAgfQotCi0gIC8vcmVtb3ZlIHRoZSBsYXN0IGJhY2tzbGFzaCBpZiBuZWNlc3NhcnkKLSAgaWYoZHdDb3BpZWQpCi0gIHsgaWYoKihscHN6UGF0aCArIHN0cmxlbihscHN6UGF0aCkgLSAxKSA9PSAnXFwnKQotICAgIHsgKihscHN6UGF0aCArIHN0cmxlbihscHN6UGF0aCkgLSAxKSA9IDA7Ci0gICAgICBkd0NvcGllZC0tOwotICAgIH0KLSAgfQotICBUUkFDRShzaGVsbCwiLS0gKCVwKS0+KHBhdGg9JXMpXG4iLHRoaXMsbHBzelBhdGgpOwotICByZXR1cm4gZHdDb3BpZWQ7Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgUGlkbE1ncl9HZXRWYWx1ZVRleHQoKQotICogIEdldHMgdGhlIHRleHQgZm9yIHRoZSBsYXN0IGl0ZW0gaW4gdGhlIGxpc3QKLSAqLwotRFdPUkQgUGlkbE1ncl9HZXRWYWx1ZVRleHQoTFBQSURMTUdSIHRoaXMsCi0gICAgTFBDSVRFTUlETElTVCBwaWRsLCBMUFNUUiBscHN6VmFsdWUsIERXT1JEIGR3U2l6ZSkKLXsgTFBJVEVNSURMSVNUICBwaWRsVGVtcD1waWRsOwotICBDSEFSICAgICAgICAgIHN6VGV4dFtNQVhfUEFUSF07Ci0KLSAgVFJBQ0Uoc2hlbGwsIiglcCktPihwaWRsPSVwICVwIDB4JTA4bHgpXG4iLHRoaXMscGlkbCxscHN6VmFsdWUsZHdTaXplKTsKLQotICBpZighcGlkbCkKLSAgeyByZXR1cm4gMDsKLQl9Ci0JCQotICB3aGlsZShwaWRsVGVtcC0+bWtpZC5jYiAmJiAhUGlkbE1ncl9Jc1ZhbHVlKHRoaXMscGlkbFRlbXApKQotICB7IHBpZGxUZW1wID0gUGlkbE1ncl9HZXROZXh0SXRlbSh0aGlzLHBpZGxUZW1wKTsKLSAgfQotCi0gIGlmKCFwaWRsVGVtcC0+bWtpZC5jYikKLSAgeyByZXR1cm4gMDsKLQl9Ci0KLSAgUGlkbE1ncl9HZXRJdGVtVGV4dCh0aGlzLCBwaWRsVGVtcCwgc3pUZXh0LCBzaXplb2Yoc3pUZXh0KSk7Ci0KLSAgaWYoIWxwc3pWYWx1ZSkKLSAgeyByZXR1cm4gc3RybGVuKHN6VGV4dCkgKyAxOwotICB9Ci0gIHN0cmNweShscHN6VmFsdWUsIHN6VGV4dCk7Ci0JVFJBQ0Uoc2hlbGwsIi0tICglcCktPihwaWRsPSVwICVwPSVzIDB4JTA4bHgpXG4iLHRoaXMscGlkbCxscHN6VmFsdWUsbHBzelZhbHVlLGR3U2l6ZSk7Ci0gIHJldHVybiBzdHJsZW4obHBzelZhbHVlKTsKLX0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIFBpZGxNZ3JfR2V0VmFsdWVUeXBlKCkKLSAqLwotQk9PTDMyIFBpZGxNZ3JfR2V0VmFsdWVUeXBlKCBMUFBJRExNR1IgdGhpcywKLSAgIExQQ0lURU1JRExJU1QgcGlkbFBhdGgsCi0gICBMUENJVEVNSURMSVNUIHBpZGxWYWx1ZSwKLSAgIExQRFdPUkQgcGR3VHlwZSkKLXsgTFBTVFIgICAgbHBzekZvbGRlciwKLSAgICAgICAgICAgbHBzelZhbHVlTmFtZTsKLSAgRFdPUkQgICAgZHdOYW1lU2l6ZTsKLSAKLSAgRklYTUUoc2hlbGwsIiglcCktPiglcCAlcCAlcCkgc3R1YlxuIix0aGlzLHBpZGxQYXRoLHBpZGxWYWx1ZSxwZHdUeXBlKTsKLQkKLSAgaWYoIXBpZGxQYXRoKQotICB7IHJldHVybiBGQUxTRTsKLQl9Ci0KLSAgaWYoIXBpZGxWYWx1ZSkKLSAgeyByZXR1cm4gRkFMU0U7Ci0JfQotCi0gIGlmKCFwZHdUeXBlKQotICB7IHJldHVybiBGQUxTRTsKLQl9Ci0KLSAgLy9nZXQgdGhlIERlc2t0b3AKLSAgLy9QaWRsTWdyX0dldERlc2t0b3AodGhpcyxwaWRsUGF0aCk7Ci0KLSAgLyogZml4bWU6IGFkZCB0aGUgZHJpdmVsZXR0ZXIgaGVyZSovCi0JCi0gIC8vYXNzZW1ibGUgdGhlIEZvbGRlciBzdHJpbmcKLSAgZHdOYW1lU2l6ZSA9IFBpZGxNZ3JfR2V0Rm9sZGVyVGV4dCh0aGlzLHBpZGxQYXRoLCBOVUxMLCAwKTsKLSAgbHBzekZvbGRlciA9IChMUFNUUilIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwwLGR3TmFtZVNpemUpOwotICBpZighbHBzekZvbGRlcikKLSAgeyAgcmV0dXJuIEZBTFNFOwotCX0KLSAgUGlkbE1ncl9HZXRGb2xkZXJUZXh0KHRoaXMscGlkbFBhdGgsIGxwc3pGb2xkZXIsIGR3TmFtZVNpemUpOwotCi0gIC8vYXNzZW1ibGUgdGhlIHZhbHVlIG5hbWUKLSAgZHdOYW1lU2l6ZSA9IFBpZGxNZ3JfR2V0VmFsdWVUZXh0KHRoaXMscGlkbFZhbHVlLCBOVUxMLCAwKTsKLSAgbHBzelZhbHVlTmFtZSA9IChMUFNUUilIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwwLGR3TmFtZVNpemUpOwotICBpZighbHBzelZhbHVlTmFtZSkKLSAgeyBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLDAsbHBzekZvbGRlcik7Ci0gICAgcmV0dXJuIEZBTFNFOwotICB9Ci0gIFBpZGxNZ3JfR2V0VmFsdWVUZXh0KHRoaXMscGlkbFZhbHVlLCBscHN6VmFsdWVOYW1lLCBkd05hbWVTaXplKTsKLQotICAvKiBmaXhtZTogd2UndmUgZ290IHRoZSBwYXRoIG5vdyBkbyBzb21ldGhpbmcgd2l0aCBpdAotCSAgLWxpa2UgZ2V0IHRoZSBmaWxldHlwZSovCi0JCi0JcGR3VHlwZT1OVUxMOwotCQotICBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLDAsbHBzekZvbGRlcik7Ci0gIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksMCxscHN6VmFsdWVOYW1lKTsKLSAgcmV0dXJuIFRSVUU7Ci19Ci0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBQaWRsTWdyX0dldERhdGFUZXh0KCkKLSAqLwotRFdPUkQgUGlkbE1ncl9HZXREYXRhVGV4dCggTFBQSURMTUdSIHRoaXMsCi0gTFBDSVRFTUlETElTVCBwaWRsUGF0aCwgTFBDSVRFTUlETElTVCBwaWRsVmFsdWUsIExQU1RSIGxwc3pPdXQsIERXT1JEIGR3T3V0U2l6ZSkKLXsgTFBTVFIgICAgbHBzekZvbGRlciwKLSAgICAgICAgICAgbHBzelZhbHVlTmFtZTsKLSAgRFdPUkQgICAgZHdOYW1lU2l6ZTsKLQotICBGSVhNRShzaGVsbCwiKCVwKS0+KHBpZGw9JXAgcGlkbD0lcCkgc3R1YlxuIix0aGlzLHBpZGxQYXRoLHBpZGxWYWx1ZSk7Ci0KLSAgaWYoIWxwc3pPdXQgfHwgIXBpZGxQYXRoIHx8ICFwaWRsVmFsdWUpCi0gIHsgcmV0dXJuIEZBTFNFOwotCX0KLQotICAvKiBmaXhtZTogZ2V0IHRoZSBkcml2ZWxldHRlciovCi0KLSAgLy9hc3NlbWJsZSB0aGUgRm9sZGVyIHN0cmluZwotICBkd05hbWVTaXplID0gUGlkbE1ncl9HZXRGb2xkZXJUZXh0KHRoaXMscGlkbFBhdGgsIE5VTEwsIDApOwotICBscHN6Rm9sZGVyID0gKExQU1RSKUhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLDAsZHdOYW1lU2l6ZSk7Ci0gIGlmKCFscHN6Rm9sZGVyKQotICB7ICByZXR1cm4gRkFMU0U7Ci0JfQotICBQaWRsTWdyX0dldEZvbGRlclRleHQodGhpcyxwaWRsUGF0aCwgbHBzekZvbGRlciwgZHdOYW1lU2l6ZSk7Ci0KLSAgLy9hc3NlbWJsZSB0aGUgdmFsdWUgbmFtZQotICBkd05hbWVTaXplID0gUGlkbE1ncl9HZXRWYWx1ZVRleHQodGhpcyxwaWRsVmFsdWUsIE5VTEwsIDApOwotICBscHN6VmFsdWVOYW1lID0gKExQU1RSKUhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLDAsZHdOYW1lU2l6ZSk7Ci0gIGlmKCFscHN6VmFsdWVOYW1lKQotICB7IEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksMCxscHN6Rm9sZGVyKTsKLSAgICByZXR1cm4gRkFMU0U7Ci0gIH0KLSAgUGlkbE1ncl9HZXRWYWx1ZVRleHQodGhpcyxwaWRsVmFsdWUsIGxwc3pWYWx1ZU5hbWUsIGR3TmFtZVNpemUpOwotCi0gIC8qIGZpeG1lOiB3ZSd2ZSBnb3QgdGhlIHBhdGggbm93IGRvIHNvbWV0aGluZyB3aXRoIGl0Ki8KLQkKLSAgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwwLGxwc3pGb2xkZXIpOwotICBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLDAsbHBzelZhbHVlTmFtZSk7Ci0KLSAgVFJBQ0Uoc2hlbGwsIi0tICglcCktPiglcD0lcyAweCUwOGx4KVxuIix0aGlzLGxwc3pPdXQsbHBzek91dCxkd091dFNpemUpOwotCi0JcmV0dXJuIFRSVUU7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICBDUGlkbE1ncjo6R2V0UGlkbFBhdGgoKQotICogIENyZWF0ZSBhIHN0cmluZyB0aGF0IGluY2x1ZGVzIHRoZSBEcml2ZSBuYW1lLCB0aGUgZm9sZGVyIHRleHQgYW5kIAotICogIHRoZSB2YWx1ZSB0ZXh0LgotICovCi1EV09SRCBQaWRsTWdyX0dldFBpZGxQYXRoKExQUElETE1HUiB0aGlzLAotICAgIExQQ0lURU1JRExJU1QgcGlkbCwgTFBTVFIgbHBzek91dCwgRFdPUkQgZHdPdXRTaXplKQoteyBMUFNUUiBscHN6VGVtcDsKLSAgV09SRAlsZW47Ci0KLSAgVFJBQ0Uoc2hlbGwsIiglcCktPiglcCwlbHUpXG4iLHRoaXMsbHBzek91dCxkd091dFNpemUpOwotCi0gIGlmKCFscHN6T3V0KQotICB7IHJldHVybiAwOwotCX0KLQotICAqbHBzek91dCA9IDA7Ci0gIGxwc3pUZW1wID0gbHBzek91dDsKLQotICBkd091dFNpemUgLT0gUGlkbE1ncl9HZXRGb2xkZXJUZXh0KHRoaXMscGlkbCwgbHBzelRlbXAsIGR3T3V0U2l6ZSk7Ci0KLSAgLy9hZGQgYSBiYWNrc2xhc2ggaWYgbmVjZXNzYXJ5Ci0gIGxlbiA9IHN0cmxlbihscHN6VGVtcCk7Ci0gIGlmIChsZW4gJiYgbHBzelRlbXBbbGVuLTFdIT0nXFwnKQotCXsgbHBzelRlbXBbbGVuKzBdPSdcXCc7Ci0gICAgbHBzelRlbXBbbGVuKzFdPSdcMCc7Ci0JCWR3T3V0U2l6ZS0tOwotICB9Ci0KLSAgbHBzelRlbXAgPSBscHN6T3V0ICsgc3RybGVuKGxwc3pPdXQpOwotCi0gIC8vYWRkIHRoZSB2YWx1ZSBzdHJpbmcKLSAgUGlkbE1ncl9HZXRWYWx1ZVRleHQodGhpcyxwaWRsLCBscHN6VGVtcCwgZHdPdXRTaXplKTsKLQotICAvL3JlbW92ZSB0aGUgbGFzdCBiYWNrc2xhc2ggaWYgbmVjZXNzYXJ5Ci0gIGlmKCoobHBzek91dCArIHN0cmxlbihscHN6T3V0KSAtIDEpID09ICdcXCcpCi0gIHsgKihscHN6T3V0ICsgc3RybGVuKGxwc3pPdXQpIC0gMSkgPSAwOwotICB9Ci0KLSAgVFJBQ0Uoc2hlbGwsIi0tICglcCktPiglcD0lcywlbHUpXG4iLHRoaXMsbHBzek91dCxscHN6T3V0LGR3T3V0U2l6ZSk7Ci0KLSAgcmV0dXJuIHN0cmxlbihscHN6T3V0KTsKLQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBQaWRsTWdyX0NyZWF0ZSgpCi0gKiAgQ3JlYXRlcyBhIG5ldyBQSURMCi0gKiAgdHlwZSA9IFBUX0RFU0tUT1AgfCBQVF9EUklWRSB8IFBUX0ZPTERFUiB8IFBUX1ZBTFVFCi0gKiAgcEluID0gZGF0YQotICogIHVJblNpemUgPSBzaXplIG9mIGRhdGEKLSAqLwotCi1MUElURU1JRExJU1QgUGlkbE1ncl9DcmVhdGUoTFBQSURMTUdSIHRoaXMsUElETFRZUEUgdHlwZSwgTFBWT0lEIHBJbiwgVUlOVDE2IHVJblNpemUpCi17IExQSVRFTUlETElTVCAgIHBpZGxPdXQ9TlVMTDsKLSAgVUlOVDE2ICAgICAgICAgdVNpemU7Ci0gIExQSVRFTUlETElTVCAgIHBpZGxUZW1wPU5VTEw7Ci0gIExQUElETERBVEEgICAgIHBEYXRhOwotCi0gIFRSQUNFKHNoZWxsLCIoJXApLT4oJXggJXAgJXgpXG4iLHRoaXMsdHlwZSxwSW4sdUluU2l6ZSk7Ci0KLSAgaWYgKCB0eXBlID09IFBUX0RFU0tUT1ApCi0gIHsgICBwaWRsT3V0ID0gU0hBbGxvYygyKTsKLSAgICAgIHBpZGxPdXQtPm1raWQuY2I9MHgwMDAwOwotICAgICAgcmV0dXJuIHBpZGxPdXQ7Ci0JfQotCi0gIGlmICghIHBJbikKLQl7IHJldHVybiBOVUxMOwotCX0JCi0KLSAgdVNpemUgPSAyICsgKHNpemVvZihQSURMVFlQRSkpICsgdUluU2l6ZSArIDI7ICAvKiBjYiArIFBJRExUWVBFICsgdUluU2l6ZSArMiAqLwotICBwaWRsT3V0ID0gU0hBbGxvYyh1U2l6ZSk7Ci0gIHBpZGxUZW1wID0gcGlkbE91dDsKLSAgaWYocGlkbE91dCkKLSAgeyBwaWRsVGVtcC0+bWtpZC5jYiA9IHVTaXplIC0gMjsKLSAgICBwRGF0YSA9KExQUElETERBVEEpICYocGlkbFRlbXAtPm1raWQuYWJJRFswXSk7Ci0gICAgcERhdGEtPnR5cGUgPSB0eXBlOwotICAgIHN3aXRjaCh0eXBlKQotICAgIHsgY2FzZSBQVF9NWUNPTVA6Ci0gICAgICAgIG1lbWNweShwRGF0YS0+c3pUZXh0LCBwSW4sIHVJblNpemUpOwotICAgICAgICAgICAgICAgICAgICAgICBUUkFDRShzaGVsbCwiLSAoJXApLT5jcmVhdGUgTXkgQ29tcHV0ZXI6ICVzXG4iLHRoaXMsZGVidWdzdHJfYShwRGF0YS0+c3pUZXh0KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBQVF9EUklWRToKLSAgICAgICAgbWVtY3B5KHBEYXRhLT5zelRleHQsIHBJbiwgdUluU2l6ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgIFRSQUNFKHNoZWxsLCItICglcCktPmNyZWF0ZSBEcml2ZTogJXNcbiIsdGhpcyxkZWJ1Z3N0cl9hKHBEYXRhLT5zelRleHQpKTsKLQkJCQkJCQkJCQkJIGJyZWFrOwotICAgICAgY2FzZSBQVF9GT0xERVI6Ci0gICAgICBjYXNlIFBUX1ZBTFVFOiAgIAotICAgICAgICBtZW1jcHkocERhdGEtPnN6VGV4dCwgcEluLCB1SW5TaXplKTsKLSAgICAgICAgICAgICAgICAgICAgICAgVFJBQ0Uoc2hlbGwsIi0gKCVwKS0+Y3JlYXRlIFZhbHVlOiAlc1xuIix0aGlzLGRlYnVnc3RyX2EocERhdGEtPnN6VGV4dCkpOwotCQkJCQkJCQkJCQkgYnJlYWs7Ci0gICAgICBkZWZhdWx0OiAKLSAgICAgICAgRklYTUUoc2hlbGwsIi0gKCVwKSB3cm9uZyBhcmd1bWVudFxuIix0aGlzKTsKLQkJCSAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotICAgCi0gICAgcGlkbFRlbXAgPSBQaWRsTWdyX0dldE5leHRJdGVtKHRoaXMscGlkbFRlbXApOwotICBwaWRsVGVtcC0+bWtpZC5jYiA9IDB4MDA7Ci0gIH0KLSAgVFJBQ0Uoc2hlbGwsIi0tICglcCktPihwaWRsPSVwLCBzaXplPSV1KVxuIix0aGlzLHBpZGxPdXQsdVNpemUtMik7Ci0gIHJldHVybiBwaWRsT3V0OwotfQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgUGlkbE1ncl9HZXREYXRhKFBJRExUWVBFLCBMUENJVEVNSURMSVNULCBMUFZPSUQsIFVJTlQxNikKLSAqLwotRFdPUkQgUGlkbE1ncl9HZXREYXRhKAotICAgIExQUElETE1HUiB0aGlzLAotCQlQSURMVFlQRSB0eXBlLCAKLSAgICBMUENJVEVNSURMSVNUIHBpZGwsCi0JCUxQVk9JRCBwT3V0LAotCQlVSU5UMTYgdU91dFNpemUpCi17IExQUElETERBVEEgIHBEYXRhOwotICBEV09SRCAgICAgICBkd1JldHVybj0wOyAKLQotCVRSQUNFKHNoZWxsLCIoJXApLT4oJXggJXAgJXAgJXgpXG4iLHRoaXMsdHlwZSxwaWRsLHBPdXQsdU91dFNpemUpOwotCQotICBpZighcGlkbCkKLSAgeyAgcmV0dXJuIDA7Ci0JfQotCi0gIHBEYXRhID0gUGlkbE1ncl9HZXREYXRhUG9pbnRlcih0aGlzLHBpZGwpOwotCi0gIC8vY29weSB0aGUgZGF0YQotICBzd2l0Y2godHlwZSkKLSAgeyBjYXNlIFBUX01ZQ09NUDogIGlmKHVPdXRTaXplIDwgMSkKLSAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgICAgICAgICAgICAgICBpZihQVF9NWUNPTVAgIT0gcERhdGEtPnR5cGUpCi0gICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwotCQkJCQkJCQkJCSAqKExQU1RSKXBPdXQgPSAwOwkgCi0gICAgICAgICAgICAgICAgICAgICBzdHJuY3B5KChMUFNUUilwT3V0LCAiTXkgQ29tcHV0ZXIiLCB1T3V0U2l6ZSk7Ci0JCQkJCQkJCQkJIGR3UmV0dXJuID0gc3RybGVuKChMUFNUUilwT3V0KTsKLSAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0JIGNhc2UgUFRfRFJJVkU6ICAgIGlmKHVPdXRTaXplIDwgMSkKLSAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgICAgICAgICAgICAgICBpZihQVF9EUklWRSAhPSBwRGF0YS0+dHlwZSkKLSAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0JCQkJCQkJCQkJICooTFBTVFIpcE91dCA9IDA7CSAKLSAgICAgICAgICAgICAgICAgICAgIHN0cm5jcHkoKExQU1RSKXBPdXQsIHBEYXRhLT5zelRleHQsIHVPdXRTaXplKTsKLQkJCQkJCQkJCQkgZHdSZXR1cm4gPSBzdHJsZW4oKExQU1RSKXBPdXQpOwotICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgIGNhc2UgUFRfRk9MREVSOgotICAgY2FzZSBQVF9WQUxVRTogCi0JIGNhc2UgUFRfVEVYVDogICAgICooTFBTVFIpcE91dCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICBzdHJuY3B5KChMUFNUUilwT3V0LCBwRGF0YS0+c3pUZXh0LCB1T3V0U2l6ZSk7Ci0gICAgICAgICAgICAgICAgICAgICBkd1JldHVybiA9IHN0cmxlbigoTFBTVFIpcE91dCk7Ci0gICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgIGRlZmF1bHQ6ICAgICBicmVhazsJCQkJCQkJCQkJIAotICB9Ci0JVFJBQ0Uoc2hlbGwsIi0tICglcCktPiglcD0lcyAweCUwOGx4KVxuIix0aGlzLHBPdXQsKGNoYXIqKXBPdXQsZHdSZXR1cm4pOwotICByZXR1cm4gZHdSZXR1cm47Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgUGlkbE1ncl9HZXREYXRhUG9pbnRlcigpCi0gKi8KLUxQUElETERBVEEgUGlkbE1ncl9HZXREYXRhUG9pbnRlcihMUFBJRExNR1IgdGhpcyxMUElURU1JRExJU1QgcGlkbCkKLXsgaWYoIXBpZGwpCi0gIHsgIHJldHVybiBOVUxMOwotCX0KLQlUUkFDRSAoc2hlbGwsIiglcCktPiglcClcbiIJLHRoaXMsIHBpZGwpOwotICByZXR1cm4gKExQUElETERBVEEpKHBpZGwtPm1raWQuYWJJRCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENQaWRsTWdyX1NlcGFyYXRlUGF0aEFuZFZhbHVlKQotICogIENyZWF0ZXMgYSBzZXBhcmF0ZSBwYXRoIGFuZCB2YWx1ZSBQSURMIGZyb20gYSBmdWxseSBxdWFsaWZpZWQgUElETC4KLSAqLwotQk9PTDMyIFBpZGxNZ3JfU2VwYXJhdGVQYXRoQW5kVmFsdWUoTFBQSURMTUdSIHRoaXMsIAotICAgTFBJVEVNSURMSVNUIHBpZGxGUSwgTFBJVEVNSURMSVNUICpwcGlkbFBhdGgsIExQSVRFTUlETElTVCAqcHBpZGxWYWx1ZSkKLXsgTFBJVEVNSURMSVNUICAgcGlkbFRlbXA7Ci0JVFJBQ0UgKHNoZWxsLCIoJXApLT4ocGlkbD0lcCBwaWRsPSVwIHBpZGw9JXApIix0aGlzLHBpZGxGUSxwcGlkbFBhdGgscHBpZGxWYWx1ZSk7Ci0gIGlmKCFwaWRsRlEpCi0gIHsgIHJldHVybiBGQUxTRTsKLQl9Ci0KLSAgKnBwaWRsVmFsdWUgPSBQaWRsTWdyX0dldExhc3RJdGVtKHRoaXMscGlkbEZRKTsKLQotICBpZighUGlkbE1ncl9Jc1ZhbHVlKHRoaXMsKnBwaWRsVmFsdWUpKQotICB7IHJldHVybiBGQUxTRTsKLQl9Ci0KLSAgKnBwaWRsVmFsdWUgPSBJTENsb25lKCpwcGlkbFZhbHVlKTsKLSAgKnBwaWRsUGF0aCA9IElMQ2xvbmUocGlkbEZRKTsKLQotICBwaWRsVGVtcCA9IFBpZGxNZ3JfR2V0TGFzdEl0ZW0odGhpcywqcHBpZGxQYXRoKTsKLSAgcGlkbFRlbXAtPm1raWQuY2IgPSAweDAwOwotCi0gIHJldHVybiBUUlVFOwotfQpkaWZmIC0tZ2l0IGEvb2xlL25scy9ub3IubmxzIGIvb2xlL25scy9ub3IubmxzCmluZGV4IDQ5MjU2NDguLmYyMzU1YjEgMTAwNjQ0Ci0tLSBhL29sZS9ubHMvbm9yLm5scworKysgYi9vbGUvbmxzL25vci5ubHMKQEAgLTEsMTQgKzEsMTQgQEAKIC8qCiAgKglPTEUyTkxTIGxpYnJhcnkKLSAqICAgICAgTm9yd2F5IChCb2ttYWVsKQorICogICAgICBOb3J3YXkgKEJva21hYWwpCiAgKgkoTm9yd2VnaWFuIHN0cmluZ3MgaW4gaXNvLTg4NTktMSkKICAqLwogCiAvKiBMT0NWQUwoTE9DQUxFX0lMQU5HVUFHRSwiIikgKi8KLUxPQ1ZBTChMT0NBTEVfU0xBTkdVQUdFLCJOb3JzayAoQm9rbeZsKSIpCi1MT0NWQUwoTE9DQUxFX1NFTkdMQU5HVUFHRSwiTm9yd2VnaWFuIChCb2ttYWVsKSIpCitMT0NWQUwoTE9DQUxFX1NMQU5HVUFHRSwiTm9yc2sgKEJva23lbCkiKQorTE9DVkFMKExPQ0FMRV9TRU5HTEFOR1VBR0UsIk5vcndlZ2lhbiAoQm9rbWFhbCkiKQogTE9DVkFMKExPQ0FMRV9TQUJCUkVWTEFOR05BTUUsIm5vciIpCi1MT0NWQUwoTE9DQUxFX1NOQVRJVkVMQU5HTkFNRSwiYm9rbeZsIikKK0xPQ1ZBTChMT0NBTEVfU05BVElWRUxBTkdOQU1FLCJib2tt5WwiKQogTE9DVkFMKExPQ0FMRV9JQ09VTlRSWSwiNDciKQogTE9DVkFMKExPQ0FMRV9TQ09VTlRSWSwiTm9yZ2UiKQogTE9DVkFMKExPQ0FMRV9TRU5HQ09VTlRSWSwiTm9yd2F5IikKZGlmZiAtLWdpdCBhL29sZS9vbGUyLmMgYi9vbGUvb2xlMi5jCmluZGV4IDViZmUzYzcuLjIyOGIwMWMgMTAwNjQ0Ci0tLSBhL29sZS9vbGUyLmMKKysrIGIvb2xlL29sZTIuYwpAQCAtODUsNyArODUsNyBAQAogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBSZWdpc3RlckRyYWdEcm9wIChPTEUyLjM1KQorICogICAgICAgICAgIFJlZ2lzdGVyRHJhZ0Ryb3AxNiAoT0xFMi4zNSkKICAqLwogSFJFU1VMVCBXSU5BUEkgUmVnaXN0ZXJEcmFnRHJvcDE2KAogCUhXTkQxNiBod25kLApAQCAtOTUsMyArOTUsMTMgQEAKIAlyZXR1cm4gU19PSzsKIH0KIAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgUmVnaXN0ZXJEcmFnRHJvcDMyIChPTEUzMi4xMzkpCisgKi8KK0hSRVNVTFQgV0lOQVBJIFJlZ2lzdGVyRHJhZ0Ryb3AzMigKKwlIV05EMzIgaHduZCwKKwlMUERST1BUQVJHRVQgcERyb3BUYXJnZXQKKykgeworCUZJWE1FKG9sZSwiKDB4JTA0eCwlcCksc3R1YiFcbiIsaHduZCxwRHJvcFRhcmdldCk7CisJcmV0dXJuIFNfT0s7Cit9CmRpZmYgLS1naXQgYS9wcm9ncmFtcy9NYWtlZmlsZS5pbiBiL3Byb2dyYW1zL01ha2VmaWxlLmluCmluZGV4IGFhZjNjN2MuLjY4NmY1YjMgMTAwNjQ0Ci0tLSBhL3Byb2dyYW1zL01ha2VmaWxlLmluCisrKyBiL3Byb2dyYW1zL01ha2VmaWxlLmluCkBAIC0xOCw2ICsxOCw5IEBACiBpbnN0YWxsOgogCWZvciBpIGluICQoU1VCRElSUyk7IGRvIChjZCAkJGk7ICQoTUFLRSkgaW5zdGFsbCkgfHwgZXhpdCAxOyBkb25lCiAKK3VuaW5zdGFsbDoKKwlmb3IgaSBpbiAkKFNVQkRJUlMpOyBkbyAoY2QgJCRpOyAkKE1BS0UpIHVuaW5zdGFsbCkgfHwgZXhpdCAxOyBkb25lCisKIGNsZWFuOgogCWZvciBpIGluICQoU1VCRElSUyk7IGRvIChjZCAkJGk7ICQoTUFLRSkgY2xlYW4pIHx8IGV4aXQgMTsgZG9uZQogCmRpZmYgLS1naXQgYS9wcm9ncmFtcy9jbG9jay9NYWtlZmlsZS5pbiBiL3Byb2dyYW1zL2Nsb2NrL01ha2VmaWxlLmluCmluZGV4IDZhY2Q2YTguLmFkNzU5YTUgMTAwNjQ0Ci0tLSBhL3Byb2dyYW1zL2Nsb2NrL01ha2VmaWxlLmluCisrKyBiL3Byb2dyYW1zL2Nsb2NrL01ha2VmaWxlLmluCkBAIC00OSw2ICs0OSw5IEBACiBpbnN0YWxsOiBkdW1teQogCSQoSU5TVEFMTF9QUk9HUkFNKSBjbG9jayAkKGJpbmRpcikvY2xvY2sKIAordW5pbnN0YWxsOiBkdW1teQorCSQoUk0pICQoYmluZGlyKS9jbG9jaworCiAkKFJDX1NSQ1M6LnJjPS5zKTogJChXUkMpCiAKIGR1bW15OgpkaWZmIC0tZ2l0IGEvcHJvZ3JhbXMvbm90ZXBhZC9NYWtlZmlsZS5pbiBiL3Byb2dyYW1zL25vdGVwYWQvTWFrZWZpbGUuaW4KaW5kZXggNDZmZWQyNC4uZmU4MTkzMyAxMDA2NDQKLS0tIGEvcHJvZ3JhbXMvbm90ZXBhZC9NYWtlZmlsZS5pbgorKysgYi9wcm9ncmFtcy9ub3RlcGFkL01ha2VmaWxlLmluCkBAIC00OSw2ICs0OSw5IEBACiBpbnN0YWxsOiBkdW1teQogCSQoSU5TVEFMTF9QUk9HUkFNKSBub3RlcGFkICQoYmluZGlyKS9ub3RlcGFkCiAKK3VuaW5zdGFsbDogZHVtbXkKKwkkKFJNKSAkKGJpbmRpcikvbm90ZXBhZAorCiAkKFJDX1NSQ1M6LnJjPS5zKTogJChXUkMpCiAKIGR1bW15OgpkaWZmIC0tZ2l0IGEvcHJvZ3JhbXMvcHJvZ21hbi9NYWtlZmlsZS5pbiBiL3Byb2dyYW1zL3Byb2dtYW4vTWFrZWZpbGUuaW4KaW5kZXggMGE2ZTJjZC4uNjY2MmZiZCAxMDA2NDQKLS0tIGEvcHJvZ3JhbXMvcHJvZ21hbi9NYWtlZmlsZS5pbgorKysgYi9wcm9ncmFtcy9wcm9nbWFuL01ha2VmaWxlLmluCkBAIC01NCw2ICs1NCw5IEBACiBpbnN0YWxsOiBkdW1teQogCSQoSU5TVEFMTF9QUk9HUkFNKSBwcm9nbWFuICQoYmluZGlyKS9wcm9nbWFuCiAKK3VuaW5zdGFsbDogZHVtbXkKKwkkKFJNKSAkKGJpbmRpcikvcHJvZ21hbgorCiAkKFJDX1NSQ1M6LnJjPS5zKTogJChXUkMpCiAKIGR1bW15OgpkaWZmIC0tZ2l0IGEvcHJvZ3JhbXMvcmVndGVzdC9NYWtlZmlsZS5pbiBiL3Byb2dyYW1zL3JlZ3Rlc3QvTWFrZWZpbGUuaW4KaW5kZXggOTg2ODNkNC4uYTFhMWU4ZCAxMDA2NDQKLS0tIGEvcHJvZ3JhbXMvcmVndGVzdC9NYWtlZmlsZS5pbgorKysgYi9wcm9ncmFtcy9yZWd0ZXN0L01ha2VmaWxlLmluCkBAIC0xOSw3ICsxOSwxMCBAQAogCSQoQ0MpIC1vIHJlZ3Rlc3QgJChPQkpTKSAkKExET1BUSU9OUykgJChBTExfTElCUykKIAogaW5zdGFsbDogZHVtbXkKLQkkKElOU1RBTExfUFJPR1JBTSkgcmVndGVzdCAkKGJpbmRpcikvcHJvZ3JhbQorCSQoSU5TVEFMTF9QUk9HUkFNKSByZWd0ZXN0ICQoYmluZGlyKS9yZWd0ZXN0CisKK3VuaW5zdGFsbDogZHVtbXkKKwkkKFJNKSAkKGJpbmRpcikvcmVndGVzdAogCiBkdW1teToKIApkaWZmIC0tZ2l0IGEvcHJvZ3JhbXMvdmlldy9NYWtlZmlsZS5pbiBiL3Byb2dyYW1zL3ZpZXcvTWFrZWZpbGUuaW4KaW5kZXggMGFlYTdmNi4uYjUzMWU4MCAxMDA2NDQKLS0tIGEvcHJvZ3JhbXMvdmlldy9NYWtlZmlsZS5pbgorKysgYi9wcm9ncmFtcy92aWV3L01ha2VmaWxlLmluCkBAIC0zNyw2ICszNyw5IEBACiBpbnN0YWxsOiBkdW1teQogCSQoSU5TVEFMTF9QUk9HUkFNKSB2aWV3ICQoYmluZGlyKS92aWV3CiAKK3VuaW5zdGFsbDogZHVtbXkKKwkkKFJNKSAkKGJpbmRpcikvdmlldworCiAkKFJDX1NSQ1M6LnJjPS5zKTogJChXUkMpCiAKIGR1bW15OgpkaWZmIC0tZ2l0IGEvcHJvZ3JhbXMvd2luaGVscC9NYWtlZmlsZS5pbiBiL3Byb2dyYW1zL3dpbmhlbHAvTWFrZWZpbGUuaW4KaW5kZXggNzZjNDBmMC4uYTk1ZmE3NyAxMDA2NDQKLS0tIGEvcHJvZ3JhbXMvd2luaGVscC9NYWtlZmlsZS5pbgorKysgYi9wcm9ncmFtcy93aW5oZWxwL01ha2VmaWxlLmluCkBAIC01Myw2ICs1Myw5IEBACiAJJChJTlNUQUxMX1BST0dSQU0pIHdpbmhlbHAgJChiaW5kaXIpL3dpbmhlbHAKIAkkKElOU1RBTExfUFJPR1JBTSkgaGxwMnNnbWwgJChiaW5kaXIpL2hscDJzZ21sCiAKK3VuaW5zdGFsbDogZHVtbXkKKwkkKFJNKSAkKGJpbmRpcikvd2luaGVscCAkKGJpbmRpcikvaGxwMnNnbWwKKwogeS50YWIuYyB5LnRhYi5oOiBtYWNyby55YWNjLnkKIAkkKFlBQ0MpIC1kIC10ICQoU1JDRElSKS9tYWNyby55YWNjLnkKIApkaWZmIC0tZ2l0IGEvcHJvZ3JhbXMvd2ludmVyL01ha2VmaWxlLmluIGIvcHJvZ3JhbXMvd2ludmVyL01ha2VmaWxlLmluCmluZGV4IGVkNTkxMWIuLjYwODIwMDQgMTAwNjQ0Ci0tLSBhL3Byb2dyYW1zL3dpbnZlci9NYWtlZmlsZS5pbgorKysgYi9wcm9ncmFtcy93aW52ZXIvTWFrZWZpbGUuaW4KQEAgLTE5LDcgKzE5LDEwIEBACiAJJChDQykgLW8gd2ludmVyICQoT0JKUykgJChMRE9QVElPTlMpICQoQUxMX0xJQlMpCiAKIGluc3RhbGw6IGR1bW15Ci0JJChJTlNUQUxMX1BST0dSQU0pIHdpbnZlciAkKGJpbmRpcikvcHJvZ3JhbQorCSQoSU5TVEFMTF9QUk9HUkFNKSB3aW52ZXIgJChiaW5kaXIpL3dpbnZlcgorCit1bmluc3RhbGw6IGR1bW15CisJJChSTSkgJChiaW5kaXIpL3dpbnZlcgogCiBkdW1teToKIApkaWZmIC0tZ2l0IGEvcmVsYXkzMi9idWlsdGluMzIuYyBiL3JlbGF5MzIvYnVpbHRpbjMyLmMKaW5kZXggNWVhNDZiNC4uMDRjNTc5ZSAxMDA2NDQKLS0tIGEvcmVsYXkzMi9idWlsdGluMzIuYworKysgYi9yZWxheTMyL2J1aWx0aW4zMi5jCkBAIC0zODUsNyArMzg1LDcgQEAKICAgICBNU0coICIgKGNhbGxlZCBmcm9tICVwKSIsIF9fYnVpbHRpbl9yZXR1cm5fYWRkcmVzcygxKSApOwogI2VuZGlmCiAgICAgTVNHKCAiXG4iICk7Ci0gICAgVEFTS19LaWxsQ3VycmVudFRhc2soMSk7CisgICAgRXhpdFByb2Nlc3MoMSk7CiB9CiAKIApkaWZmIC0tZ2l0IGEvcmVsYXkzMi9jb21jdGwzMi5zcGVjIGIvcmVsYXkzMi9jb21jdGwzMi5zcGVjCmluZGV4IDhjN2FhODIuLmMzODVjZjYgMTAwNjQ0Ci0tLSBhL3JlbGF5MzIvY29tY3RsMzIuc3BlYworKysgYi9yZWxheTMyL2NvbWN0bDMyLnNwZWMKQEAgLTExNCwxMSArMTE0LDExIEBACiAyMzYgc3R1YiBTdHJfU2V0UHRyVwogCiAzMjAgc3RkY2FsbCBEU0FfQ3JlYXRlKGxvbmcgbG9uZykgRFNBX0NyZWF0ZQotMzIxIHN0ZGNhbGwgRFNBX0Rlc3Ryb3kobG9uZykgRFNBX0Rlc3Ryb3kKLTMyMiBzdGRjYWxsIERTQV9HZXRJdGVtKGxvbmcgbG9uZyBsb25nKSBEU0FfR2V0SXRlbQorMzIxIHN0ZGNhbGwgRFNBX0Rlc3Ryb3kocHRyKSBEU0FfRGVzdHJveQorMzIyIHN0ZGNhbGwgRFNBX0dldEl0ZW0ocHRyIGxvbmcgbG9uZykgRFNBX0dldEl0ZW0KIDMyMyBzdGRjYWxsIERTQV9HZXRJdGVtUHRyKGxvbmcgbG9uZykgRFNBX0dldEl0ZW1QdHIKIDMyNCBzdGRjYWxsIERTQV9JbnNlcnRJdGVtKGxvbmcgbG9uZyBsb25nKSBEU0FfSW5zZXJ0SXRlbQotMzI1IHN0dWIgRFNBX1NldEl0ZW0KKzMyNSBzdGRjYWxsIERTQV9TZXRJdGVtIChsb25nIGxvbmcgbG9uZykgRFNBX1NldEl0ZW0KIDMyNiBzdGRjYWxsIERTQV9EZWxldGVJdGVtKGxvbmcgbG9uZykgRFNBX0RlbGV0ZUl0ZW0KIDMyNyBzdHViIERTQV9EZWxldGVBbGxJdGVtcwogCmRpZmYgLS1naXQgYS9yZWxheTMyL2dkaTMyLnNwZWMgYi9yZWxheTMyL2dkaTMyLnNwZWMKaW5kZXggMDg3ZTA5Yi4uOGYzMTAwMCAxMDA2NDQKLS0tIGEvcmVsYXkzMi9nZGkzMi5zcGVjCisrKyBiL3JlbGF5MzIvZ2RpMzIuc3BlYwpAQCAtMTY2LDcgKzE2Niw3IEBACiAxNjIgc3RkY2FsbCBHZXRDbGlwQm94KGxvbmcgcHRyKSBHZXRDbGlwQm94MzIKIDE2MyBzdGRjYWxsIEdldENsaXBSZ24obG9uZyBsb25nKSBHZXRDbGlwUmduMzIKIDE2NCBzdHViIEdldENvbG9yQWRqdXN0bWVudAotMTY1IHN0dWIgR2V0Q29sb3JTcGFjZQorMTY1IHN0ZGNhbGwgR2V0Q29sb3JTcGFjZShsb25nKSBHZXRDb2xvclNwYWNlCiAxNjYgc3RkY2FsbCBHZXRDdXJyZW50T2JqZWN0KGxvbmcgbG9uZykgR2V0Q3VycmVudE9iamVjdAogMTY3IHN0ZGNhbGwgR2V0Q3VycmVudFBvc2l0aW9uRXgobG9uZyBwdHIpIEdldEN1cnJlbnRQb3NpdGlvbkV4MzIKIDE2OCBzdGRjYWxsIEdldERDT3JnRXgobG9uZyBwdHIpIEdldERDT3JnRXgKQEAgLTMxOSw3ICszMTksNyBAQAogMzE1IHN0ZGNhbGwgU2V0RW5oTWV0YUZpbGVCaXRzKGxvbmcgcHRyKSBTZXRFbmhNZXRhRmlsZUJpdHMKIDMxNiBzdHViIFNldEZvbnRFbnVtZXJhdGlvbgogMzE3IHN0ZGNhbGwgU2V0R3JhcGhpY3NNb2RlKGxvbmcgbG9uZykgU2V0R3JhcGhpY3NNb2RlCi0zMTggc3R1YiBTZXRJQ01Nb2RlCiszMTggc3RkY2FsbCBTZXRJQ01Nb2RlKGxvbmcgbG9uZykgU2V0SUNNTW9kZQogMzE5IHN0dWIgU2V0SUNNUHJvZmlsZUEKIDMyMCBzdHViIFNldElDTVByb2ZpbGVXCiAzMjEgc3RkY2FsbCBTZXRNYXBNb2RlKGxvbmcgbG9uZykgU2V0TWFwTW9kZTMyCmRpZmYgLS1naXQgYS9yZWxheTMyL2tlcm5lbDMyLnNwZWMgYi9yZWxheTMyL2tlcm5lbDMyLnNwZWMKaW5kZXggODU3NjU3Ny4uMmMwOGUxNiAxMDA2NDQKLS0tIGEvcmVsYXkzMi9rZXJuZWwzMi5zcGVjCisrKyBiL3JlbGF5MzIva2VybmVsMzIuc3BlYwpAQCAtMTIsMTUgKzEyLDE1IEBACiAjIC0gY29kZSBnZW5lcmF0ZWQgYnkgdGhlIE1TIFRodW5rIENvbXBpbGVyCiAjIC0gc3ltYm9scyBleHBvcnRlZCBieSB0aGUgT2N0IDk0IGJldGEgdmVyc2lvbiBvZiBrZXJuZWwzMi5kbGwKIAotICAxIHN0ZGNhbGwgVnhEQ2FsbDAobG9uZykgVnhEQ2FsbAotICAyIHN0ZGNhbGwgVnhEQ2FsbDEobG9uZykgVnhEQ2FsbAotICAzIHN0ZGNhbGwgVnhEQ2FsbDIobG9uZykgVnhEQ2FsbAotICA0IHN0ZGNhbGwgVnhEQ2FsbDMobG9uZykgVnhEQ2FsbAotICA1IHN0ZGNhbGwgVnhEQ2FsbDQobG9uZykgVnhEQ2FsbAotICA2IHN0ZGNhbGwgVnhEQ2FsbDUobG9uZykgVnhEQ2FsbAotICA3IHN0ZGNhbGwgVnhEQ2FsbDYobG9uZykgVnhEQ2FsbAotICA4IHN0ZGNhbGwgVnhEQ2FsbDcobG9uZykgVnhEQ2FsbAotICA5IHN0ZGNhbGwgVnhEQ2FsbDgobG9uZykgVnhEQ2FsbAorICAxIHJlZ2lzdGVyIFZ4RENhbGwwKCkgVnhEQ2FsbDAKKyAgMiByZWdpc3RlciBWeERDYWxsMSgpIFZ4RENhbGwxCisgIDMgcmVnaXN0ZXIgVnhEQ2FsbDIoKSBWeERDYWxsMgorICA0IHJlZ2lzdGVyIFZ4RENhbGwzKCkgVnhEQ2FsbDMKKyAgNSByZWdpc3RlciBWeERDYWxsNCgpIFZ4RENhbGw0CisgIDYgcmVnaXN0ZXIgVnhEQ2FsbDUoKSBWeERDYWxsNQorICA3IHJlZ2lzdGVyIFZ4RENhbGw2KCkgVnhEQ2FsbDYKKyAgOCByZWdpc3RlciBWeERDYWxsNygpIFZ4RENhbGw3CisgIDkgcmVnaXN0ZXIgVnhEQ2FsbDgoKSBWeERDYWxsOAogIDEwIHN0ZGNhbGwgazMyQ2hhclRvT2VtQShzdHIgc3RyKSBDaGFyVG9PZW0zMkEKICAxMSBzdGRjYWxsIGszMkNoYXJUb09lbUJ1ZmZBKHN0ciBzdHIgbG9uZykgQ2hhclRvT2VtQnVmZjMyQQogIDEyIHN0ZGNhbGwgazMyT2VtVG9DaGFyQShwdHIgcHRyKSBPZW1Ub0NoYXIzMkEKQEAgLTUzMCwxMiArNTMwLDEyIEBACiA1MTMgc3R1YiBMb2NrRmlsZUV4CiA1MTQgc3RkY2FsbCBMb2NrUmVzb3VyY2UobG9uZykgTG9ja1Jlc291cmNlMzIKIDUxNSBzdGRjYWxsIE1ha2VDcml0aWNhbFNlY3Rpb25HbG9iYWwocHRyKSBNYWtlQ3JpdGljYWxTZWN0aW9uR2xvYmFsCi01MTYgc3R1YiBNYXBISW5zdExTCis1MTYgcmVnaXN0ZXIgTWFwSEluc3RMUygpIE1hcEhJbnN0TFMKIDUxNyBzdHViIE1hcEhJbnN0TFNfUE4KLTUxOCBzdHViIE1hcEhJbnN0U0wKKzUxOCByZWdpc3RlciBNYXBISW5zdFNMKCkgTWFwSEluc3RTTAogNTE5IHN0dWIgTWFwSEluc3RTTF9QTgotNTIwIHN0dWIgTWFwSE1vZHVsZUxTCi01MjEgc3R1YiBNYXBITW9kdWxlU0wKKzUyMCBzdGRjYWxsIE1hcEhNb2R1bGVMUyhsb25nKSBNYXBITW9kdWxlTFMKKzUyMSBzdGRjYWxsIE1hcEhNb2R1bGVTTChsb25nKSBNYXBITW9kdWxlU0wKIDUyMiBzdGRjYWxsIE1hcExTKHB0cikgTWFwTFMKIDUyMyBzdGRjYWxsIE1hcFNMKGxvbmcpIE1hcFNMCiA1MjQgc3RkY2FsbCBNYXBTTEZpeChsb25nKSBNYXBTTEZpeApAQCAtNjk4LDcgKzY5OCw3IEBACiA2ODEgc3RkY2FsbCBTdXNwZW5kVGhyZWFkKGxvbmcpIFN1c3BlbmRUaHJlYWQKIDY4MiBzdGRjYWxsIFN5c3RlbVRpbWVUb0ZpbGVUaW1lKHB0ciBwdHIpIFN5c3RlbVRpbWVUb0ZpbGVUaW1lCiA2ODMgc3R1YiBTeXN0ZW1UaW1lVG9UelNwZWNpZmljTG9jYWxUaW1lCi02ODQgc3RkY2FsbCBUZXJtaW5hdGVQcm9jZXNzKHB0ciBsb25nKSBUZXJtaW5hdGVQcm9jZXNzCis2ODQgc3RkY2FsbCBUZXJtaW5hdGVQcm9jZXNzKGxvbmcgbG9uZykgVGVybWluYXRlUHJvY2VzcwogNjg1IHN0ZGNhbGwgVGVybWluYXRlVGhyZWFkKGxvbmcgbG9uZykgVGVybWluYXRlVGhyZWFkCiA2ODYgc3R1YiBUaHJlYWQzMkZpcnN0CiA2ODcgc3R1YiBUaHJlYWQzMk5leHQKZGlmZiAtLWdpdCBhL3JlbGF5MzIvbXByLnNwZWMgYi9yZWxheTMyL21wci5zcGVjCmluZGV4IGQxNzY4YjUuLjUxZDIwZTggMTAwNjQ0Ci0tLSBhL3JlbGF5MzIvbXByLnNwZWMKKysrIGIvcmVsYXkzMi9tcHIuc3BlYwpAQCAtODYsNyArODYsNyBAQAogMDA4MyBzdHViIFdOZXRHZXRSZXNvdXJjZVBhcmVudFcKIDAwODQgc3R1YiBXTmV0R2V0VW5pdmVyc2FsTmFtZUEKIDAwODUgc3R1YiBXTmV0R2V0VW5pdmVyc2FsTmFtZVcKLTAwODYgc3R1YiBXTmV0R2V0VXNlckEKKzAwODYgc3RkY2FsbCBXTmV0R2V0VXNlckEoc3RyIHB0ciBwdHIpIFdOZXRHZXRVc2VyMzJBCiAwMDg3IHN0dWIgV05ldEdldFVzZXJXCiAwMDg4IHN0dWIgV05ldExvZ29mZkEKIDAwODkgc3R1YiBXTmV0TG9nb2ZmVwpkaWZmIC0tZ2l0IGEvcmVsYXkzMi9vbGUzMi5zcGVjIGIvcmVsYXkzMi9vbGUzMi5zcGVjCmluZGV4IGJiNjE5N2MuLjQ4ODNmZGIgMTAwNjQ0Ci0tLSBhL3JlbGF5MzIvb2xlMzIuc3BlYworKysgYi9yZWxheTMyL29sZTMyLnNwZWMKQEAgLTEzOSw3ICsxMzksNyBAQAogMTM2IHN0dWIgUmVhZEZtdFVzZXJUeXBlU3RnCiAxMzcgc3R1YiBSZWFkT2xlU3RnCiAxMzggc3R1YiBSZWFkU3RyaW5nU3RyZWFtCi0xMzkgc3R1YiBSZWdpc3RlckRyYWdEcm9wCisxMzkgc3RkY2FsbCBSZWdpc3RlckRyYWdEcm9wKGxvbmcgcHRyKSBSZWdpc3RlckRyYWdEcm9wMzIKIDE0MCBzdHViIFJlbGVhc2VTdGdNZWRpdW0KIDE0MSBzdHViIFJldm9rZURyYWdEcm9wCiAxNDIgc3R1YiBTZXRDb252ZXJ0U3RnCmRpZmYgLS1naXQgYS9yZWxheTMyL3NoZWxsMzIuc3BlYyBiL3JlbGF5MzIvc2hlbGwzMi5zcGVjCmluZGV4IGVjZmVmYWIuLjY0ZTM1NDYgMTAwNjQ0Ci0tLSBhL3JlbGF5MzIvc2hlbGwzMi5zcGVjCisrKyBiL3JlbGF5MzIvc2hlbGwzMi5zcGVjCkBAIC0yMiw3ICsyMiw3IEBACiAgIDE0IHN0dWIgQ29udHJvbF9GaWxsQ2FjaGVfUnVuRExMV0AxNiAgICMgZXhwb3J0ZWQgYnkgbmFtZQogICAxNSBzdGRjYWxsIElMR2V0RGlzcGxheU5hbWUocHRyIHB0cikgSUxHZXREaXNwbGF5TmFtZQogICAxNiBzdGRjYWxsIElMRmluZExhc3RJRChwdHIpIElMRmluZExhc3RJRAotICAxNyBzdHViIElMUmVtb3ZlTGFzdElEQDQKKyAgMTcgc3RkY2FsbCBJTFJlbW92ZUxhc3RJREA0KHB0cikgSUxSZW1vdmVMYXN0SUQKICAgMTggc3RkY2FsbCBJTENsb25lKHB0cikgSUxDbG9uZQogICAxOSBzdHViIElMQ2xvbmVGaXJzdEA0CiAgIDIwIHN0dWIgSUxHbG9iYWxDbG9uZUA0CkBAIC0xNTgsNyArMTU4LDcgQEAKICAxNTAgc3R1YiBFeHRyYWN0QXNzb2NpYXRlZEljb25FeEEgICAjIGV4cG9ydGVkIGJ5IG5hbWUKICAxNTEgc3R1YiBTSExvYWRPTEUKICAxNTIgc3RkY2FsbCBJTEdldFNpemUocHRyKSBJTEdldFNpemUKLSAxNTMgc3R1YiBJTEdldE5leHQKKyAxNTMgc3RkY2FsbCBJTEdldE5leHQocHRyKSBJTEdldE5leHQKICAxNTQgc3R1YiBJTEFwcGVuZAogIDE1NSBzdGRjYWxsIElMRnJlZShwdHIpIElMRnJlZQogIDE1NiBzdHViIElMR2xvYmFsRnJlZQpAQCAtMjk3LDggKzI5Nyw4IEBACiAgMjg4IHN0ZGNhbGwgU2hlbGxBYm91dEEobG9uZyBzdHIgc3RyIGxvbmcpIFNoZWxsQWJvdXQzMkEKICAyODkgc3RkY2FsbCBTaGVsbEFib3V0Vyhsb25nIHdzdHIgd3N0ciBsb25nKSBTaGVsbEFib3V0MzJXCiAgMjkwIHN0ZGNhbGwgU2hlbGxFeGVjdXRlQShsb25nIHN0ciBzdHIgc3RyIHN0ciBsb25nKSBTaGVsbEV4ZWN1dGUzMkEKLSAyOTEgc3RkY2FsbCBTaGVsbEV4ZWN1dGVFeCAobG9uZykgU2hlbGxFeGVjdXRlRXgKLSAyOTIgc3R1YiBTaGVsbEV4ZWN1dGVFeEEKKyAyOTEgc3RkY2FsbCBTaGVsbEV4ZWN1dGVFeCAobG9uZykgU2hlbGxFeGVjdXRlRXgzMkEKKyAyOTIgc3RkY2FsbCBTaGVsbEV4ZWN1dGVFeEEgKGxvbmcpIFNoZWxsRXhlY3V0ZUV4MzJBCiAgMjkzIHN0dWIgU2hlbGxFeGVjdXRlRXhXCiAgMjk0IHN0dWIgU2hlbGxFeGVjdXRlVwogIDI5NSBzdHViIFNoZWxsSG9va1Byb2MgICAjIGV4cG9ydGVkIGJ5IG5hbWUKQEAgLTM3MywzICszNzMsNiBAQAogIDY4MCBzdHViIElzVXNlckFkbWluCiAKIDEyMTcgc3R1YiBGT09CQVIxMjE3ICAgIyBubyBqb2tlISBUaGlzIGlzIHRoZSByZWFsIG5hbWUhIQorCisjIGxhdGVyIGFkZGl0aW9ucyAuLi4gRklYTUU6IGluY29ycmVjdCBvcmRpbmFscworMTIxOCBzdGRjYWxsIFNIR2V0U3BlY2lhbEZvbGRlclBhdGhBKGxvbmcgbG9uZyBsb25nIGxvbmcpIFNIR2V0U3BlY2lhbEZvbGRlclBhdGgKZGlmZiAtLWdpdCBhL3JlbGF5MzIvc25vb3AuYyBiL3JlbGF5MzIvc25vb3AuYwppbmRleCA1MzQ2MDdkLi45YmM0ZTM4IDEwMDY0NAotLS0gYS9yZWxheTMyL3Nub29wLmMKKysrIGIvcmVsYXkzMi9zbm9vcC5jCkBAIC00LDcgKzQsNiBAQAogICogQ29weXJpZ2h0IDE5OTggTWFyY3VzIE1laXNzbmVyCiAgKi8KIAotI2lmZGVmIF9faTM4Nl9fCiAKICNpbmNsdWRlIDxhc3NlcnQuaD4KICNpbmNsdWRlICJ3aW5kb3dzLmgiCkBAIC0xOSw2ICsxOCw4IEBACiAjaW5jbHVkZSAiZGVidWdzdHIuaCIKICNpbmNsdWRlICJkZWJ1Zy5oIgogCisjaWZkZWYgX19pMzg2X18KKwogY2hhciAqKmRlYnVnX3Nub29wX2V4Y2x1ZGVsaXN0ID0gTlVMTCwgKipkZWJ1Z19zbm9vcF9pbmNsdWRlbGlzdCA9IE5VTEw7CiAKICNpZmRlZiBORUVEX1VOREVSU0NPUkVfUFJFRklYCmRpZmYgLS1naXQgYS9yZWxheTMyL3dpbm1tLnNwZWMgYi9yZWxheTMyL3dpbm1tLnNwZWMKaW5kZXggMmViYmRkNy4uOThkNTFjYyAxMDA2NDQKLS0tIGEvcmVsYXkzMi93aW5tbS5zcGVjCisrKyBiL3JlbGF5MzIvd2lubW0uc3BlYwpAQCAtNSw3ICs1LDcgQEAKICAgMiBzdGRjYWxsIFdJTk1NXzIocHRyIGxvbmcgbG9uZykgUGxheVNvdW5kMzJBCiAgIDMgc3R1YiBXSU5NTV8zCiAgIDQgc3R1YiBDbG9zZURyaXZlcgotICA1IHN0dWIgRGVmRHJpdmVyUHJvYworICA1IHN0ZGNhbGwgRGVmRHJpdmVyUHJvYyhsb25nIGxvbmcgbG9uZyBsb25nIGxvbmcpIERlZkRyaXZlclByb2MKICAgNiBzdHViIERyaXZlckNhbGxiYWNrCiAgIDcgc3R1YiBEcnZDbG9zZQogICA4IHN0dWIgRHJ2RGVmRHJpdmVyUHJvYwpAQCAtMTksNyArMTksNyBAQAogIDE2IHN0ZGNhbGwgT3BlbkRyaXZlckEoc3RyIHN0ciBsb25nKSBPcGVuRHJpdmVyMzJBCiAgMTcgc3RkY2FsbCBQbGF5U291bmQocHRyIGxvbmcgbG9uZykgUGxheVNvdW5kMzJBCiAgMTggc3RkY2FsbCBQbGF5U291bmRXKHB0ciBsb25nIGxvbmcpIFBsYXlTb3VuZDMyVwotIDE5IHN0dWIgU2VuZERyaXZlck1lc3NhZ2UKKyAxOSBzdGRjYWxsIFNlbmREcml2ZXJNZXNzYWdlKGxvbmcgbG9uZyBsb25nIGxvbmcpIFNlbmREcml2ZXJNZXNzYWdlMzIKICAyMCBzdGRjYWxsIGF1eEdldERldkNhcHNBKGxvbmcgcHRyIGxvbmcpIGF1eEdldERldkNhcHMzMkEKICAyMSBzdGRjYWxsIGF1eEdldERldkNhcHNXKGxvbmcgcHRyIGxvbmcpIGF1eEdldERldkNhcHMzMlcKICAyMiBzdGRjYWxsIGF1eEdldE51bURldnMoKSBhdXhHZXROdW1EZXZzMzIKQEAgLTEyNyw3ICsxMjcsNyBAQAogMTI0IHN0ZGNhbGwgbW1pb1JlYWQobG9uZyBwdHIgbG9uZykgbW1pb1JlYWQzMgogMTI1IHN0dWIgbW1pb1JlbmFtZUEKIDEyNiBzdHViIG1taW9SZW5hbWVXCi0xMjcgc3R1YiBtbWlvU2VlaworMTI3IHN0ZGNhbGwgbW1pb1NlZWsobG9uZyBsb25nIGxvbmcpIG1taW9TZWVrMzIKIDEyOCBzdHViIG1taW9TZW5kTWVzc2FnZQogMTI5IHN0dWIgbW1pb1NldEJ1ZmZlcgogMTMwIHN0dWIgbW1pb1NldEluZm8KZGlmZiAtLWdpdCBhL3NjaGVkdWxlci9jbGllbnQuYyBiL3NjaGVkdWxlci9jbGllbnQuYwppbmRleCA0YTM1YmNmLi5lMzlkODJkIDEwMDY0NAotLS0gYS9zY2hlZHVsZXIvY2xpZW50LmMKKysrIGIvc2NoZWR1bGVyL2NsaWVudC5jCkBAIC0xNDAsOCArMTQwLDkgQEAKICAgICB2ZWNbMF0uaW92X2Jhc2UgICAgICAgPSAmaGVhZDsKICAgICB2ZWNbMF0uaW92X2xlbiAgICAgICAgPSBzaXplb2YoaGVhZCk7CiAKLSAgICBpZiAoKHJldCA9IHJlY3Ztc2coIHRoZGItPnNvY2tldCwgJm1zZ2hkciwgMCApKSA9PSAtMSkKKyAgICB3aGlsZSAoKHJldCA9IHJlY3Ztc2coIHRoZGItPnNvY2tldCwgJm1zZ2hkciwgMCApKSA9PSAtMSkKICAgICB7CisgICAgICAgIGlmIChlcnJubyA9PSBFSU5UUikgY29udGludWU7CiAgICAgICAgIHBlcnJvcigicmVjdm1zZyIpOwogICAgICAgICBDTElFTlRfUHJvdG9jb2xFcnJvciggInJlY3Ztc2dcbiIgKTsKICAgICB9CkBAIC0zNzgsNiArMzc5LDcgQEAKICAgICByZXR1cm4gcmVwbHkuaGFuZGxlOwogfQogCisKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIENMSUVOVF9HZXRQcm9jZXNzSW5mbwogICoKQEAgLTM5NSw2ICszOTcsMjIgQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBDTElFTlRfR2V0VGhyZWFkSW5mbworICoKKyAqIFNlbmQgYSBnZXQgdGhyZWFkIGluZm8gcmVxdWVzdC4gUmV0dXJuIDAgaWYgT0suCisgKi8KK2ludCBDTElFTlRfR2V0VGhyZWFkSW5mbyggaW50IGhhbmRsZSwgc3RydWN0IGdldF90aHJlYWRfaW5mb19yZXBseSAqcmVwbHkgKQoreworICAgIGludCBsZW4sIGVycjsKKworICAgIENMSUVOVF9TZW5kUmVxdWVzdCggUkVRX0dFVF9USFJFQURfSU5GTywgLTEsIDEsICZoYW5kbGUsIHNpemVvZihoYW5kbGUpICk7CisgICAgZXJyID0gQ0xJRU5UX1dhaXRSZXBseSggJmxlbiwgTlVMTCwgMSwgcmVwbHksIHNpemVvZigqcmVwbHkpICk7CisgICAgQ0hFQ0tfTEVOKCBsZW4sIHNpemVvZigqcmVwbHkpICk7CisgICAgcmV0dXJuIGVycjsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBDTElFTlRfT3BlblByb2Nlc3MKICAqCiAgKiBPcGVuIGEgaGFuZGxlIHRvIGEgcHJvY2Vzcy4KQEAgLTQxNCwzICs0MzIsMjYgQEAKICAgICBDSEVDS19MRU4oIGxlbiwgc2l6ZW9mKHJlcGx5KSApOwogICAgIHJldHVybiByZXBseS5oYW5kbGU7CiB9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgQ0xJRU5UX1NlbGVjdAorICovCitpbnQgQ0xJRU5UX1NlbGVjdCggaW50IGNvdW50LCBpbnQgKmhhbmRsZXMsIGludCBmbGFncywgaW50IHRpbWVvdXQgKQoreworICAgIHN0cnVjdCBzZWxlY3RfcmVxdWVzdCByZXE7CisgICAgc3RydWN0IHNlbGVjdF9yZXBseSByZXBseTsKKyAgICBpbnQgbGVuOworCisgICAgcmVxLmNvdW50ICAgPSBjb3VudDsKKyAgICByZXEuZmxhZ3MgICA9IGZsYWdzOworICAgIHJlcS50aW1lb3V0ID0gdGltZW91dDsKKworICAgIENMSUVOVF9TZW5kUmVxdWVzdCggUkVRX1NFTEVDVCwgLTEsIDIsCisgICAgICAgICAgICAgICAgICAgICAgICAmcmVxLCBzaXplb2YocmVxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZXMsIGNvdW50ICogc2l6ZW9mKGludCkgKTsKKyAgICBDTElFTlRfV2FpdFJlcGx5KCAmbGVuLCBOVUxMLCAxLCAmcmVwbHksIHNpemVvZihyZXBseSkgKTsKKyAgICBDSEVDS19MRU4oIGxlbiwgc2l6ZW9mKHJlcGx5KSApOworICAgIHJldHVybiByZXBseS5zaWduYWxlZDsKK30KKwpkaWZmIC0tZ2l0IGEvc2NoZWR1bGVyL2NyaXRzZWN0aW9uLmMgYi9zY2hlZHVsZXIvY3JpdHNlY3Rpb24uYwppbmRleCBlMTU0YWJlLi40Y2Q0NzhhIDEwMDY0NAotLS0gYS9zY2hlZHVsZXIvY3JpdHNlY3Rpb24uYworKysgYi9zY2hlZHVsZXIvY3JpdHNlY3Rpb24uYwpAQCAtMTU2LDcgKzE1Niw3IEBACiAgICAgICAgICAgICBzdHJ1Y3Qgc2VtYnVmIHNvcDsKICAgICAgICAgICAgIHNvcC5zZW1fbnVtID0gMDsKICAgICAgICAgICAgIHNvcC5zZW1fb3AgID0gLTE7Ci0gICAgICAgICAgICBzb3Auc2VtX2ZsZyA9IFNFTV9VTkRPOworICAgICAgICAgICAgc29wLnNlbV9mbGcgPSAwLypTRU1fVU5ETyovOwogICAgICAgICAgICAgZG8KICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICByZXQgPSBzZW1vcCggKGludCljcml0LT5SZXNlcnZlZCwgJnNvcCwgMSApOwpAQCAtMjI0LDcgKzIyNCw3IEBACiAgICAgICAgICAgICBzdHJ1Y3Qgc2VtYnVmIHNvcDsKICAgICAgICAgICAgIHNvcC5zZW1fbnVtID0gMDsKICAgICAgICAgICAgIHNvcC5zZW1fb3AgID0gMTsKLSAgICAgICAgICAgIHNvcC5zZW1fZmxnID0gU0VNX1VORE87CisgICAgICAgICAgICBzb3Auc2VtX2ZsZyA9IDAvKlNFTV9VTkRPKi87CiAgICAgICAgICAgICBzZW1vcCggKGludCljcml0LT5SZXNlcnZlZCwgJnNvcCwgMSApOwogICAgICAgICB9CiAgICAgfQpkaWZmIC0tZ2l0IGEvc2NoZWR1bGVyL2szMm9iai5jIGIvc2NoZWR1bGVyL2szMm9iai5jCmluZGV4IDk2MGU5NjIuLmFlYmNhNjEgMTAwNjQ0Ci0tLSBhL3NjaGVkdWxlci9rMzJvYmouYworKysgYi9zY2hlZHVsZXIvazMyb2JqLmMKQEAgLTIxLDYgKzIxLDcgQEAKIGV4dGVybiBjb25zdCBLMzJPQkpfT1BTIEZJTEVfT3BzOwogZXh0ZXJuIGNvbnN0IEszMk9CSl9PUFMgQ0hBTkdFX09wczsKIGV4dGVybiBjb25zdCBLMzJPQkpfT1BTIE1FTV9NQVBQRURfRklMRV9PcHM7CitleHRlcm4gY29uc3QgSzMyT0JKX09QUyBERVZJQ0VfT3BzOwogZXh0ZXJuIGNvbnN0IEszMk9CSl9PUFMgQ09OU09MRV9PcHM7CiAKIHN0YXRpYyBjb25zdCBLMzJPQkpfT1BTIEszMk9CSl9OdWxsT3BzID0KQEAgLTQ5LDcgKzUwLDcgQEAKICAgICAmSzMyT0JKX051bGxPcHMsICAgICAgICAvKiBLMzJPQkpfU0NSRUVOX0JVRkZFUiAqLwogICAgICZNRU1fTUFQUEVEX0ZJTEVfT3BzLCAgIC8qIEszMk9CSl9NRU1fTUFQUEVEX0ZJTEUgKi8KICAgICAmSzMyT0JKX051bGxPcHMsICAgICAgICAvKiBLMzJPQkpfU0VSSUFMICovCi0gICAgJkszMk9CSl9OdWxsT3BzLCAgICAgICAgLyogSzMyT0JKX0RFVklDRV9JT0NUTCAqLworICAgICZERVZJQ0VfT3BzLCAgICAgICAgICAgIC8qIEszMk9CSl9ERVZJQ0VfSU9DVEwgKi8KICAgICAmSzMyT0JKX051bGxPcHMsICAgICAgICAvKiBLMzJPQkpfUElQRSAqLwogICAgICZLMzJPQkpfTnVsbE9wcywgICAgICAgIC8qIEszMk9CSl9NQUlMU0xPVCAqLwogICAgICZLMzJPQkpfTnVsbE9wcywgICAgICAgIC8qIEszMk9CSl9UT09MSEVMUF9TTkFQU0hPVCAqLwpkaWZmIC0tZ2l0IGEvc2NoZWR1bGVyL3Byb2Nlc3MuYyBiL3NjaGVkdWxlci9wcm9jZXNzLmMKaW5kZXggM2NjZDNkMi4uM2MxZjk0YSAxMDA2NDQKLS0tIGEvc2NoZWR1bGVyL3Byb2Nlc3MuYworKysgYi9zY2hlZHVsZXIvcHJvY2Vzcy5jCkBAIC0xMjgsNyArMTI4LDggQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIFBST0NFU1NfSW5oZXJpdEVudkRCCiAgKi8KLXN0YXRpYyBCT09MMzIgUFJPQ0VTU19Jbmhlcml0RW52REIoIFBEQjMyICpwZGIsIExQQ1NUUiBjbWRfbGluZSwgTFBDU1RSIGVudiApCitzdGF0aWMgQk9PTDMyIFBST0NFU1NfSW5oZXJpdEVudkRCKCBQREIzMiAqcGRiLCBMUENTVFIgY21kX2xpbmUsIExQQ1NUUiBlbnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTVEFSVFVQSU5GTzMyQSAqc3RhcnR1cCApCiB7CiAgICAgaWYgKCEocGRiLT5lbnZfZGIgPSBIZWFwQWxsb2MocGRiLT5oZWFwLCBIRUFQX1pFUk9fTUVNT1JZLCBzaXplb2YoRU5WREIpKSkpCiAgICAgICAgIHJldHVybiBGQUxTRTsKQEAgLTE0MywxMCArMTQ0LDI1IEBACiAgICAgaWYgKCEocGRiLT5lbnZfZGItPmNtZF9saW5lID0gSEVBUF9zdHJkdXBBKCBwZGItPmhlYXAsIDAsIGNtZF9saW5lICkpKQogICAgICAgICByZXR1cm4gRkFMU0U7CiAKKyAgICAvKiBSZW1lbWJlciBzdGFydHVwIGluZm8gKi8KKyAgICBpZiAoIShwZGItPmVudl9kYi0+c3RhcnR1cF9pbmZvID0gCisgICAgICAgICAgSGVhcEFsbG9jKCBwZGItPmhlYXAsIEhFQVBfWkVST19NRU1PUlksIHNpemVvZihTVEFSVFVQSU5GTzMyQSkgKSkpCisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAqcGRiLT5lbnZfZGItPnN0YXJ0dXBfaW5mbyA9ICpzdGFydHVwOworCiAgICAgLyogSW5oZXJpdCB0aGUgc3RhbmRhcmQgaGFuZGxlcyAqLwotICAgIHBkYi0+ZW52X2RiLT5oU3RkaW4gID0gcGRiLT5wYXJlbnQtPmVudl9kYi0+aFN0ZGluOwotICAgIHBkYi0+ZW52X2RiLT5oU3Rkb3V0ID0gcGRiLT5wYXJlbnQtPmVudl9kYi0+aFN0ZG91dDsKLSAgICBwZGItPmVudl9kYi0+aFN0ZGVyciA9IHBkYi0+cGFyZW50LT5lbnZfZGItPmhTdGRlcnI7CisgICAgaWYgKHBkYi0+ZW52X2RiLT5zdGFydHVwX2luZm8tPmR3RmxhZ3MgJiBTVEFSVEZfVVNFU1RESEFORExFUykKKyAgICB7CisgICAgICAgIHBkYi0+ZW52X2RiLT5oU3RkaW4gID0gcGRiLT5lbnZfZGItPnN0YXJ0dXBfaW5mby0+aFN0ZElucHV0OworICAgICAgICBwZGItPmVudl9kYi0+aFN0ZG91dCA9IHBkYi0+ZW52X2RiLT5zdGFydHVwX2luZm8tPmhTdGRPdXRwdXQ7CisgICAgICAgIHBkYi0+ZW52X2RiLT5oU3RkZXJyID0gcGRiLT5lbnZfZGItPnN0YXJ0dXBfaW5mby0+aFN0ZEVycm9yOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBwZGItPmVudl9kYi0+aFN0ZGluICA9IHBkYi0+cGFyZW50LT5lbnZfZGItPmhTdGRpbjsKKyAgICAgICAgcGRiLT5lbnZfZGItPmhTdGRvdXQgPSBwZGItPnBhcmVudC0+ZW52X2RiLT5oU3Rkb3V0OworICAgICAgICBwZGItPmVudl9kYi0+aFN0ZGVyciA9IHBkYi0+cGFyZW50LT5lbnZfZGItPmhTdGRlcnI7CisgICAgfQogCiAgICAgcmV0dXJuIFRSVUU7CiB9CkBAIC0yNDksMTMgKzI2NSwxNSBAQAogICovCiBQREIzMiAqUFJPQ0VTU19DcmVhdGUoIE5FX01PRFVMRSAqcE1vZHVsZSwgTFBDU1RSIGNtZF9saW5lLCBMUENTVFIgZW52LAogICAgICAgICAgICAgICAgICAgICAgICBISU5TVEFOQ0UxNiBoSW5zdGFuY2UsIEhJTlNUQU5DRTE2IGhQcmV2SW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgIFVJTlQzMiBjbWRTaG93LCBQUk9DRVNTX0lORk9STUFUSU9OICppbmZvICkKKyAgICAgICAgICAgICAgICAgICAgICAgU1RBUlRVUElORk8zMkEgKnN0YXJ0dXAsIFBST0NFU1NfSU5GT1JNQVRJT04gKmluZm8gKQogewogICAgIERXT1JEIHNpemUsIGNvbW1pdDsKICAgICBpbnQgc2VydmVyX3RoYW5kbGUsIHNlcnZlcl9waGFuZGxlOworICAgIFVJTlQzMiBjbWRTaG93ID0gMDsKICAgICBUSERCICp0aGRiID0gTlVMTDsKICAgICBQREIzMiAqcGFyZW50ID0gUFJPQ0VTU19DdXJyZW50KCk7CiAgICAgUERCMzIgKnBkYiA9IFBST0NFU1NfQ3JlYXRlUERCKCBwYXJlbnQgKTsKKyAgICBUREIgKnBUYXNrOwogCiAgICAgaWYgKCFwZGIpIHJldHVybiBOVUxMOwogICAgIGluZm8tPmhUaHJlYWQgPSBpbmZvLT5oUHJvY2VzcyA9IElOVkFMSURfSEFORExFX1ZBTFVFMzI7CkBAIC0yNzgsNyArMjk2LDcgQEAKIAogICAgIC8qIEluaGVyaXQgdGhlIGVudiBEQiBmcm9tIHRoZSBwYXJlbnQgKi8KIAotICAgIGlmICghUFJPQ0VTU19Jbmhlcml0RW52REIoIHBkYiwgY21kX2xpbmUsIGVudiApKSBnb3RvIGVycm9yOworICAgIGlmICghUFJPQ0VTU19Jbmhlcml0RW52REIoIHBkYiwgY21kX2xpbmUsIGVudiwgc3RhcnR1cCApKSBnb3RvIGVycm9yOwogCiAgICAgLyogQ3JlYXRlIHRoZSBtYWluIHRocmVhZCAqLwogCkBAIC0yOTUsMTIgKzMxMywyMiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZBTFNFLCBzZXJ2ZXJfcGhhbmRsZSApKSA9PSBJTlZBTElEX0hBTkRMRV9WQUxVRTMyKQogICAgICAgICBnb3RvIGVycm9yOwogICAgIGluZm8tPmR3UHJvY2Vzc0lkID0gUERCX1RPX1BST0NFU1NfSUQocGRiKTsKLSAgICBpbmZvLT5kd1Byb2Nlc3NJZCA9IFRIREJfVE9fVEhSRUFEX0lEKHRoZGIpOworICAgIGluZm8tPmR3VGhyZWFkSWQgID0gVEhEQl9UT19USFJFQURfSUQodGhkYik7CiAKKyNpZiAwCiAgICAgdGhkYi0+dW5peF9waWQgPSBnZXRwaWQoKTsgLyogRklYTUU6IHdyb25nIGhlcmUgLi4uICovCisjZWxzZQorICAgIC8qIEFsbCBXaW4xNiAndGhyZWFkcycgaGF2ZSB0aGUgc2FtZSB1bml4X3BpZCwgbm8gbWF0dGVyIGJ5IHdoaWNoIHRocmVhZAorICAgICAgIHRoZXkgd2VyZSBjcmVhdGVkICEgKi8KKyAgICBwVGFzayA9IChUREIgKilHbG9iYWxMb2NrMTYoIHBhcmVudC0+dGFzayApOworICAgIHRoZGItPnVuaXhfcGlkID0gcFRhc2s/IHBUYXNrLT50aGRiLT51bml4X3BpZCA6IFRIUkVBRF9DdXJyZW50KCktPnVuaXhfcGlkOworI2VuZGlmCiAKICAgICAvKiBDcmVhdGUgYSBXaW4xNiB0YXNrIGZvciB0aGlzIHByb2Nlc3MgKi8KIAorICAgIGlmIChzdGFydHVwLT5kd0ZsYWdzICYgU1RBUlRGX1VTRVNIT1dXSU5ET1cpCisgICAgICAgIGNtZFNob3cgPSBzdGFydHVwLT53U2hvd1dpbmRvdzsKKwogICAgIHBkYi0+dGFzayA9IFRBU0tfQ3JlYXRlKCB0aGRiLCBwTW9kdWxlLCBoSW5zdGFuY2UsIGhQcmV2SW5zdGFuY2UsIGNtZFNob3cpOwogICAgIGlmICghcGRiLT50YXNrKSBnb3RvIGVycm9yOwogCkBAIC0zODYsNiArNDE0LDExIEBACiB2b2lkIFdJTkFQSSBFeGl0UHJvY2VzcyggRFdPUkQgc3RhdHVzICkKIHsKICAgICBQREIzMiAqcGRiID0gUFJPQ0VTU19DdXJyZW50KCk7CisgICAgVERCICpwVGFzayA9IChUREIgKilHbG9iYWxMb2NrMTYoIHBkYi0+dGFzayApOworICAgIGlmICggcFRhc2sgKSBwVGFzay0+bkV2ZW50cysrOworCisgICAgaWYgKCBwVGFzayAmJiBwVGFzay0+dGhkYiAhPSBUSFJFQURfQ3VycmVudCgpICkKKyAgICAgICAgRXhpdFRocmVhZCggc3RhdHVzICk7CiAKICAgICBTWVNURU1fTE9DSygpOwogICAgIC8qIEZJWE1FOiBzaG91bGQga2lsbCBhbGwgcnVubmluZyB0aHJlYWRzIG9mIHRoaXMgcHJvY2VzcyAqLwpAQCAtMzk5LDYgKzQzMiwyMCBAQAogfQogCiAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBUZXJtaW5hdGVQcm9jZXNzICAgKEtFUk5FTDMyLjY4NCkKKyAqLworQk9PTDMyIFdJTkFQSSBUZXJtaW5hdGVQcm9jZXNzKCBIQU5ETEUzMiBoYW5kbGUsIERXT1JEIGV4aXRfY29kZSApCit7CisgICAgaW50IHNlcnZlcl9oYW5kbGU7CisgICAgQk9PTDMyIHJldDsKKyAgICBQREIzMiAqcGRiID0gUFJPQ0VTU19HZXRQdHIoIGhhbmRsZSwgUFJPQ0VTU19URVJNSU5BVEUsICZzZXJ2ZXJfaGFuZGxlICk7CisgICAgaWYgKCFwZGIpIHJldHVybiBGQUxTRTsKKyAgICByZXQgPSAhQ0xJRU5UX1Rlcm1pbmF0ZVByb2Nlc3MoIHNlcnZlcl9oYW5kbGUsIGV4aXRfY29kZSApOworICAgIEszMk9CSl9EZWNDb3VudCggJnBkYi0+aGVhZGVyICk7CisgICAgcmV0dXJuIHJldDsKK30KKwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgR2V0Q3VycmVudFByb2Nlc3MgICAoS0VSTkVMMzIuMTk4KQogICovCkBAIC03NTcsNyArODA0LDcgQEAKICAgICBlbnRyeSA9IHBkYi0+dGhyZWFkX2xpc3QtPm5leHQ7CiAgICAgZm9yICg7OykKICAgICB7Ci0gICAgICAgICBpZiAoZW50cnktPnRocmVhZCAhPSBUSFJFQURfQ3VycmVudCgpKQorICAgICAgICAgaWYgKGVudHJ5LT50aHJlYWQgIT0gVEhSRUFEX0N1cnJlbnQoKSAmJiAhVEhSRUFEX0lzV2luMTYoZW50cnktPnRocmVhZCkpCiAgICAgICAgICB7CiAgICAgICAgICAgICAgSEFORExFMzIgaGFuZGxlID0gSEFORExFX0FsbG9jKCBQUk9DRVNTX0N1cnJlbnQoKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZW50cnktPnRocmVhZC0+aGVhZGVyLApAQCAtNzg3LDcgKzgzNCw3IEBACiAgICAgZW50cnkgPSBwZGItPnRocmVhZF9saXN0LT5uZXh0OwogICAgIGZvciAoOzspCiAgICAgewotICAgICAgICAgaWYgKGVudHJ5LT50aHJlYWQgIT0gVEhSRUFEX0N1cnJlbnQoKSkKKyAgICAgICAgIGlmIChlbnRyeS0+dGhyZWFkICE9IFRIUkVBRF9DdXJyZW50KCkgJiYgIVRIUkVBRF9Jc1dpbjE2KGVudHJ5LT50aHJlYWQpKQogICAgICAgICAgewogICAgICAgICAgICAgIEhBTkRMRTMyIGhhbmRsZSA9IEhBTkRMRV9BbGxvYyggUFJPQ0VTU19DdXJyZW50KCksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVudHJ5LT50aHJlYWQtPmhlYWRlciwKZGlmZiAtLWdpdCBhL3NjaGVkdWxlci9zeW5jaHJvLmMgYi9zY2hlZHVsZXIvc3luY2hyby5jCmluZGV4IDIyOTEzNGMuLjRlZDlhMjUgMTAwNjQ0Ci0tLSBhL3NjaGVkdWxlci9zeW5jaHJvLmMKKysrIGIvc2NoZWR1bGVyL3N5bmNocm8uYwpAQCAtMTMsNiArMTMsNyBAQAogI2luY2x1ZGUgInByb2Nlc3MuaCIKICNpbmNsdWRlICJ0aHJlYWQuaCIKICNpbmNsdWRlICJ3aW5lcnJvci5oIgorI2luY2x1ZGUgInNlcnZlci5oIgogI2luY2x1ZGUgImRlYnVnLmgiCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtMjUsMTUgKzI2LDE2IEBACiAgICAgRFdPUkQgaTsKICAgICBLMzJPQkogKipwdHI7CiAKKyAgICBTWVNURU1fTE9DSygpOwogICAgIHdhaXQtPmNvdW50ICAgID0gY291bnQ7CiAgICAgd2FpdC0+c2lnbmFsZWQgPSBXQUlUX0ZBSUxFRDsKICAgICB3YWl0LT53YWl0X2FsbCA9IHdhaXRfYWxsOwogICAgIHdhaXQtPndhaXRfbXNnID0gd2FpdF9tc2c7Ci0gICAgU1lTVEVNX0xPQ0soKTsKICAgICBmb3IgKGkgPSAwLCBwdHIgPSB3YWl0LT5vYmpzOyBpIDwgY291bnQ7IGkrKywgcHRyKyspCiAgICAgewogICAgICAgICBpZiAoISgqcHRyID0gSEFORExFX0dldE9ialB0ciggUFJPQ0VTU19DdXJyZW50KCksIGhhbmRsZXNbaV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLMzJPQkpfVU5LTk9XTiwgU1lOQ0hST05JWkUsIE5VTEwgKSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLMzJPQkpfVU5LTk9XTiwgU1lOQ0hST05JWkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmd2FpdC0+c2VydmVyW2ldICkpKQogICAgICAgICB7IAogICAgICAgICAgICAgRVJSKHdpbjMyLCAiQmFkIGhhbmRsZSAlMDh4XG4iLCBoYW5kbGVzW2ldKTsgCiAgICAgICAgICAgICBicmVhazsgCkBAIC0yNTEsNyArMjUzLDcgQEAKICAgICAgICAgVEhEQiAqdGhkYiA9IGVudHJ5LT50aHJlYWQ7CiAgICAgICAgIGlmIChTWU5DX0NoZWNrQ29uZGl0aW9uKCAmdGhkYi0+d2FpdF9zdHJ1Y3QsIFRIREJfVE9fVEhSRUFEX0lEKHRoZGIpICkpCiAgICAgICAgIHsKLSAgICAgICAgICAgIFRSQUNFKHdpbjMyLCAid2FraW5nIHVwICUwNHhcbiIsIHRoZGItPnRlYl9zZWwgKTsKKyAgICAgICAgICAgIFRSQUNFKHdpbjMyLCAid2FraW5nIHVwICUwNHggKHBpZCAlZClcbiIsIHRoZGItPnRlYl9zZWwsIHRoZGItPnVuaXhfcGlkICk7CiAgICAgICAgICAgICBpZiAodGhkYi0+dW5peF9waWQpCiAJICAgIAlraWxsKCB0aGRiLT51bml4X3BpZCwgU0lHVVNSMSApOwogCSAgICBlbHNlCkBAIC0zMTQsMTUgKzMxNiw1MSBAQAogICAgICAgICB3YWl0LT5zaWduYWxlZCA9IFdBSVRfRkFJTEVEOwogICAgIGVsc2UKICAgICB7Ci0gICAgICAgIC8qIE5vdyB3YWl0IGZvciBpdCAqLwotICAgICAgICBTWU5DX1dhaXRGb3JDb25kaXRpb24oIHdhaXQsIHRpbWVvdXQgKTsKLSAgICAgICAgU1lOQ19GcmVlV2FpdFN0cnVjdCggd2FpdCApOworICAgICAgICBpbnQgaTsKKyAgICAgICAgLyogQ2hlY2sgaWYgd2UgY2FuIHVzZSBhIHNlcnZlciB3YWl0ICovCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKQorICAgICAgICAgICAgaWYgKHdhaXQtPnNlcnZlcltpXSA9PSAtMSkgYnJlYWs7CisgICAgICAgIGlmIChpID09IGNvdW50KQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgZmxhZ3MgPSAwOworICAgICAgICAgICAgU1lTVEVNX1VOTE9DSygpOworICAgICAgICAgICAgaWYgKHdhaXRfYWxsKSBmbGFncyB8PSBTRUxFQ1RfQUxMOworICAgICAgICAgICAgaWYgKGFsZXJ0YWJsZSkgZmxhZ3MgfD0gU0VMRUNUX0FMRVJUQUJMRTsKKyAgICAgICAgICAgIGlmICh3YWl0X21zZykgZmxhZ3MgfD0gU0VMRUNUX01TRzsKKyAgICAgICAgICAgIGlmICh0aW1lb3V0ICE9IElORklOSVRFMzIpIGZsYWdzIHw9IFNFTEVDVF9USU1FT1VUOworICAgICAgICAgICAgcmV0dXJuIENMSUVOVF9TZWxlY3QoIGNvdW50LCB3YWl0LT5zZXJ2ZXIsIGZsYWdzLCB0aW1lb3V0ICk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAvKiBOb3cgd2FpdCBmb3IgaXQgKi8KKyAgICAgICAgICAgIFNZTkNfV2FpdEZvckNvbmRpdGlvbiggd2FpdCwgdGltZW91dCApOworICAgICAgICAgICAgU1lOQ19GcmVlV2FpdFN0cnVjdCggd2FpdCApOworICAgICAgICB9CiAgICAgfQogICAgIFNZU1RFTV9VTkxPQ0soKTsKICAgICByZXR1cm4gd2FpdC0+c2lnbmFsZWQ7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgIFNsZWVwICAoS0VSTkVMMzIuNjc5KQorICovCitWT0lEIFdJTkFQSSBTbGVlcCggRFdPUkQgdGltZW91dCApCit7CisgICAgU1lOQ19Eb1dhaXQoIDAsIE5VTEwsIEZBTFNFLCB0aW1lb3V0LCBGQUxTRSwgRkFMU0UgKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgIFNsZWVwRXggICAoS0VSTkVMMzIuNjgwKQorICovCitEV09SRCBXSU5BUEkgU2xlZXBFeCggRFdPUkQgdGltZW91dCwgQk9PTDMyIGFsZXJ0YWJsZSApCit7CisgICAgRFdPUkQgcmV0ID0gU1lOQ19Eb1dhaXQoIDAsIE5VTEwsIEZBTFNFLCB0aW1lb3V0LCBhbGVydGFibGUsIEZBTFNFICk7CisgICAgaWYgKHJldCAhPSBXQUlUX0lPX0NPTVBMRVRJT04pIHJldCA9IDA7CisgICAgcmV0dXJuIHJldDsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBXYWl0Rm9yU2luZ2xlT2JqZWN0ICAgKEtFUk5FTDMyLjcyMykKICAqLwogRFdPUkQgV0lOQVBJIFdhaXRGb3JTaW5nbGVPYmplY3QoIEhBTkRMRTMyIGhhbmRsZSwgRFdPUkQgdGltZW91dCApCmRpZmYgLS1naXQgYS9zY2hlZHVsZXIvc3lzZGVwcy5jIGIvc2NoZWR1bGVyL3N5c2RlcHMuYwppbmRleCBkNjNkMzBmLi45ZWMzYjdhIDEwMDY0NAotLS0gYS9zY2hlZHVsZXIvc3lzZGVwcy5jCisrKyBiL3NjaGVkdWxlci9zeXNkZXBzLmMKQEAgLTExNSw2ICsxMTUsOCBAQAogICovCiB2b2lkIFNZU0RFUFNfRXhpdFRocmVhZCh2b2lkKQogeworICAgIFRIREIgKnRoZGIgPSBUSFJFQURfQ3VycmVudCgpOworICAgIGNsb3NlKCB0aGRiLT5zb2NrZXQgKTsKICAgICBfZXhpdCggMCApOwogfQogCmRpZmYgLS1naXQgYS9zY2hlZHVsZXIvc3lzbGV2ZWwuYyBiL3NjaGVkdWxlci9zeXNsZXZlbC5jCmluZGV4IDUwYTVkZDMuLjQ4M2RiYjAgMTAwNjQ0Ci0tLSBhL3NjaGVkdWxlci9zeXNsZXZlbC5jCisrKyBiL3NjaGVkdWxlci9zeXNsZXZlbC5jCkBAIC0xMyw2ICsxMyw5IEBACiBzdGF0aWMgQ1JJVElDQUxfU0VDVElPTiBXaW4xNk11dGV4Owogc3RhdGljIFNFR1BUUiBzZWdwV2luMTZNdXRleDsKIAorLyogR2xvYmFsIHZhcmlhYmxlIHRvIHNhdmUgY3VycmVudCBURUIgd2hpbGUgaW4gMTYtYml0IGNvZGUgKi8KK1dPUkQgU1lTTEVWRUxfV2luMTZDdXJyZW50VGViID0gMDsKKwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgU1lTTEVWRUxfSW5pdApAQCAtNDksNiArNTIsOSBAQAogVk9JRCBXSU5BUEkgX0VudGVyU3lzTGV2ZWwoQ1JJVElDQUxfU0VDVElPTiAqbG9jaykKIHsKICAgICBFbnRlckNyaXRpY2FsU2VjdGlvbihsb2NrKTsKKworICAgIGlmIChsb2NrID09ICZXaW4xNk11dGV4KQorICAgICAgICBHRVRfRlMoIFNZU0xFVkVMX1dpbjE2Q3VycmVudFRlYiApOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCmRpZmYgLS1naXQgYS9zY2hlZHVsZXIvdGhyZWFkLmMgYi9zY2hlZHVsZXIvdGhyZWFkLmMKaW5kZXggMmZhYmRiYy4uNjAzNjVkNSAxMDA2NDQKLS0tIGEvc2NoZWR1bGVyL3RocmVhZC5jCisrKyBiL3NjaGVkdWxlci90aHJlYWQuYwpAQCAtOSw2ICs5LDkgQEAKICNpbmNsdWRlIDx1bmlzdGQuaD4KICNpbmNsdWRlICJ0aHJlYWQuaCIKICNpbmNsdWRlICJwcm9jZXNzLmgiCisjaW5jbHVkZSAidGFzay5oIgorI2luY2x1ZGUgIm1vZHVsZS5oIgorI2luY2x1ZGUgInVzZXIuaCIKICNpbmNsdWRlICJ3aW5lcnJvci5oIgogI2luY2x1ZGUgImhlYXAuaCIKICNpbmNsdWRlICJzZWxlY3RvcnMuaCIKQEAgLTc4LDYgKzgxLDIwIEBACiAgICAgcmV0dXJuIChUSERCICopKChjaGFyICopTnRDdXJyZW50VGViKCkgLSAoaW50KSYoKFRIREIgKikwKS0+dGViKTsKIH0KIAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgVEhSRUFEX0lzV2luMTYKKyAqLworQk9PTDMyIFRIUkVBRF9Jc1dpbjE2KCBUSERCICp0aGRiICkKK3sKKyAgICBpZiAoIXRoZGIgfHwgIXRoZGItPnByb2Nlc3MpCisgICAgICAgIHJldHVybiBUUlVFOworICAgIGVsc2UKKyAgICB7CisgICAgICAgIFREQiogcFRhc2sgPSAoVERCKilHbG9iYWxMb2NrMTYoIHRoZGItPnByb2Nlc3MtPnRhc2sgKTsKKyAgICAgICAgcmV0dXJuICFwVGFzayB8fCBwVGFzay0+dGhkYiA9PSB0aGRiOworICAgIH0KK30KKwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBUSFJFQURfQWRkUXVldWUKQEAgLTY4OCw3ICs3MDUsNyBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBUZXJtaW5hdGVUaHJlYWQgW0tFUk5FTDMyLj8/P10gIFRlcm1pbmF0ZXMgYSB0aHJlYWQKKyAqIFRlcm1pbmF0ZVRocmVhZCBbS0VSTkVMMzIuNjg1XSAgVGVybWluYXRlcyBhIHRocmVhZAogICoKICAqIFJFVFVSTlMKICAqICAgIFN1Y2Nlc3M6IFRSVUUKQEAgLTY5OCw5ICs3MTUsMTUgQEAKICAgICBIQU5ETEUzMiBoYW5kbGUsIC8qIFtpbl0gSGFuZGxlIHRvIHRocmVhZCAqLwogICAgIERXT1JEIGV4aXRjb2RlKSAgLyogW2luXSBFeGl0IGNvZGUgZm9yIHRocmVhZCAqLwogewotICAgIEZJWE1FKHRocmVhZCwiKDB4JTA4eCwlbGQpOiBzdHViXG4iLGhhbmRsZSxleGl0Y29kZSk7Ci0gICAgU2V0TGFzdEVycm9yKEVSUk9SX0NBTExfTk9UX0lNUExFTUVOVEVEKTsKLSAgICByZXR1cm4gVFJVRTsKKyAgICBpbnQgc2VydmVyX2hhbmRsZTsKKyAgICBCT09MMzIgcmV0OworICAgIFRIREIgKnRocmVhZDsKKyAgICAKKyAgICBpZiAoISh0aHJlYWQgPSBUSFJFQURfR2V0UHRyKCBoYW5kbGUsIFRIUkVBRF9URVJNSU5BVEUsICZzZXJ2ZXJfaGFuZGxlICkpKQorICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgcmV0ID0gIUNMSUVOVF9UZXJtaW5hdGVUaHJlYWQoIHNlcnZlcl9oYW5kbGUsIGV4aXRjb2RlICk7CisgICAgSzMyT0JKX0RlY0NvdW50KCAmdGhyZWFkLT5oZWFkZXIgKTsKKyAgICByZXR1cm4gcmV0OwogfQogCiAKQEAgLTcxNiwxMCArNzM5LDE3IEBACiAgICAgTFBEV09SRCBleGl0Y29kZSkgLyogW291dF0gQWRkcmVzcyB0byByZWNlaXZlIHRlcm1pbmF0aW9uIHN0YXR1cyAqLwogewogICAgIFRIREIgKnRocmVhZDsKLSAgICAKLSAgICBpZiAoISh0aHJlYWQgPSBUSFJFQURfR2V0UHRyKCBodGhyZWFkLCBUSFJFQURfUVVFUllfSU5GT1JNQVRJT04sIE5VTEwgKSkpCisgICAgaW50IHNlcnZlcl9oYW5kbGU7CisKKyAgICBpZiAoISh0aHJlYWQgPSBUSFJFQURfR2V0UHRyKCBodGhyZWFkLCBUSFJFQURfUVVFUllfSU5GT1JNQVRJT04sICZzZXJ2ZXJfaGFuZGxlICkpKQogICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgaWYgKGV4aXRjb2RlKSAqZXhpdGNvZGUgPSB0aHJlYWQtPmV4aXRfY29kZTsKKyAgICBpZiAoc2VydmVyX2hhbmRsZSAhPSAtMSkKKyAgICB7CisgICAgICAgIHN0cnVjdCBnZXRfdGhyZWFkX2luZm9fcmVwbHkgaW5mbzsKKyAgICAgICAgQ0xJRU5UX0dldFRocmVhZEluZm8oIHNlcnZlcl9oYW5kbGUsICZpbmZvICk7CisgICAgICAgIGlmIChleGl0Y29kZSkgKmV4aXRjb2RlID0gaW5mby5leGl0X2NvZGU7CisgICAgfQorICAgIGVsc2UgaWYgKGV4aXRjb2RlKSAqZXhpdGNvZGUgPSB0aHJlYWQtPmV4aXRfY29kZTsKICAgICBLMzJPQkpfRGVjQ291bnQoICZ0aHJlYWQtPmhlYWRlciApOwogICAgIHJldHVybiBUUlVFOwogfQpkaWZmIC0tZ2l0IGEvc2VydmVyL29iamVjdC5jIGIvc2VydmVyL29iamVjdC5jCmluZGV4IDE3YTY4NDMuLmMwNWEzMTAgMTAwNjQ0Ci0tLSBhL3NlcnZlci9vYmplY3QuYworKysgYi9zZXJ2ZXIvb2JqZWN0LmMKQEAgLTY5LDYgKzY5LDggQEAKIHsKICAgICBvYmotPnJlZmNvdW50ID0gMTsKICAgICBvYmotPm9wcyAgICAgID0gb3BzOworICAgIG9iai0+aGVhZCAgICAgPSBOVUxMOworICAgIG9iai0+dGFpbCAgICAgPSBOVUxMOwogICAgIGlmICghbmFtZSkgb2JqLT5uYW1lID0gTlVMTDsKICAgICBlbHNlIG9iai0+bmFtZSA9IGFkZF9uYW1lKCBvYmosIG5hbWUgKTsKIH0KQEAgLTg5LDYgKzkxLDkgQEAKICAgICBhc3NlcnQoIG9iai0+cmVmY291bnQgKTsKICAgICBpZiAoIS0tb2JqLT5yZWZjb3VudCkKICAgICB7CisgICAgICAgIC8qIGlmIHRoZSByZWZjb3VudCBpcyAwLCBub2JvZHkgY2FuIGJlIGluIHRoZSB3YWl0IHF1ZXVlICovCisgICAgICAgIGFzc2VydCggIW9iai0+aGVhZCApOworICAgICAgICBhc3NlcnQoICFvYmotPnRhaWwgKTsKICAgICAgICAgaWYgKG9iai0+bmFtZSkgZnJlZV9uYW1lKCBvYmogKTsKICAgICAgICAgb2JqLT5vcHMtPmRlc3Ryb3koIG9iaiApOwogICAgIH0KZGlmZiAtLWdpdCBhL3NlcnZlci9wcm9jZXNzLmMgYi9zZXJ2ZXIvcHJvY2Vzcy5jCmluZGV4IGIzYWRjYjIuLjA2ZDNkNjMgMTAwNjQ0Ci0tLSBhL3NlcnZlci9wcm9jZXNzLmMKKysrIGIvc2VydmVyL3Byb2Nlc3MuYwpAQCAtNiw2ICs2LDcgQEAKIAogI2luY2x1ZGUgPGFzc2VydC5oPgogI2luY2x1ZGUgPGxpbWl0cy5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgogI2luY2x1ZGUgPHN0ZGlvLmg+CiAjaW5jbHVkZSA8c3RkbGliLmg+CiAjaW5jbHVkZSA8c3lzL3RpbWUuaD4KQEAgLTU0LDEyICs1NSwxNyBAQAogLyogcHJvY2VzcyBvcGVyYXRpb25zICovCiAKIHN0YXRpYyB2b2lkIGR1bXBfcHJvY2Vzcyggc3RydWN0IG9iamVjdCAqb2JqLCBpbnQgdmVyYm9zZSApOworc3RhdGljIGludCBwcm9jZXNzX3NpZ25hbGVkKCBzdHJ1Y3Qgb2JqZWN0ICpvYmosIHN0cnVjdCB0aHJlYWQgKnRocmVhZCApOworc3RhdGljIGludCBwcm9jZXNzX3NhdGlzZmllZCggc3RydWN0IG9iamVjdCAqb2JqLCBzdHJ1Y3QgdGhyZWFkICp0aHJlYWQgKTsKIHN0YXRpYyB2b2lkIGRlc3Ryb3lfcHJvY2Vzcyggc3RydWN0IG9iamVjdCAqb2JqICk7CiBzdGF0aWMgdm9pZCBmcmVlX2hhbmRsZXMoIHN0cnVjdCBwcm9jZXNzICpwcm9jZXNzICk7CitzdGF0aWMgaW50IGNvcHlfaGFuZGxlX3RhYmxlKCBzdHJ1Y3QgcHJvY2VzcyAqcHJvY2Vzcywgc3RydWN0IHByb2Nlc3MgKnBhcmVudCApOwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IG9iamVjdF9vcHMgcHJvY2Vzc19vcHMgPQogewogICAgIGR1bXBfcHJvY2VzcywKKyAgICBwcm9jZXNzX3NpZ25hbGVkLAorICAgIHByb2Nlc3Nfc2F0aXNmaWVkLAogICAgIGRlc3Ryb3lfcHJvY2VzcwogfTsKIApAQCAtNjcsMTAgKzczLDEwIEBACiBzdHJ1Y3QgcHJvY2VzcyAqY3JlYXRlX3Byb2Nlc3Modm9pZCkKIHsKICAgICBzdHJ1Y3QgcHJvY2VzcyAqcHJvY2VzczsKLSAgICBzdHJ1Y3QgaGFuZGxlX2VudHJ5ICplbnRyaWVzOwogCiAgICAgaWYgKCEocHJvY2VzcyA9IG1hbGxvYyggc2l6ZW9mKCpwcm9jZXNzKSApKSkgcmV0dXJuIE5VTEw7Ci0gICAgaWYgKCEoZW50cmllcyA9IG1hbGxvYyggTUlOX0hBTkRMRV9FTlRSSUVTICogc2l6ZW9mKHN0cnVjdCBoYW5kbGVfZW50cnkpKSkpCisKKyAgICBpZiAoIWNvcHlfaGFuZGxlX3RhYmxlKCBwcm9jZXNzLCBjdXJyZW50ID8gY3VycmVudC0+cHJvY2VzcyA6IE5VTEwgKSkKICAgICB7CiAgICAgICAgIGZyZWUoIHByb2Nlc3MgKTsKICAgICAgICAgcmV0dXJuIE5VTEw7CkBAIC04MSwxNCArODcsMTIgQEAKICAgICBwcm9jZXNzLT50aHJlYWRfbGlzdCAgICAgPSBOVUxMOwogICAgIHByb2Nlc3MtPmV4aXRfY29kZSAgICAgICA9IDB4MTAzOyAgLyogU1RJTExfQUNUSVZFICovCiAgICAgcHJvY2Vzcy0+cnVubmluZ190aHJlYWRzID0gMDsKLSAgICBwcm9jZXNzLT5oYW5kbGVfY291bnQgICAgPSBNSU5fSEFORExFX0VOVFJJRVM7Ci0gICAgcHJvY2Vzcy0+aGFuZGxlX2xhc3QgICAgID0gLTE7Ci0gICAgcHJvY2Vzcy0+ZW50cmllcyAgICAgICAgID0gZW50cmllczsKIAogICAgIGlmIChmaXJzdF9wcm9jZXNzKSBmaXJzdF9wcm9jZXNzLT5wcmV2ID0gcHJvY2VzczsKICAgICBmaXJzdF9wcm9jZXNzID0gcHJvY2VzczsKIAogICAgIGdldHRpbWVvZmRheSggJnByb2Nlc3MtPnN0YXJ0X3RpbWUsIE5VTEwgKTsKKyAgICAvKiBhbGxvYyBhIGhhbmRsZSBmb3IgdGhlIHByb2Nlc3MgaXRzZWxmICovCiAgICAgYWxsb2NfaGFuZGxlKCBwcm9jZXNzLCBwcm9jZXNzLCBQUk9DRVNTX0FMTF9BQ0NFU1MsIDAgKTsKICAgICByZXR1cm4gcHJvY2VzczsKIH0KQEAgLTEwNSw2ICsxMDksNyBAQAogICAgIGlmIChwcm9jZXNzLT5wcmV2KSBwcm9jZXNzLT5wcmV2LT5uZXh0ID0gcHJvY2Vzcy0+bmV4dDsKICAgICBlbHNlIGZpcnN0X3Byb2Nlc3MgPSBwcm9jZXNzLT5uZXh0OwogICAgIGZyZWVfaGFuZGxlcyggcHJvY2VzcyApOworICAgIGlmIChkZWJ1Z19sZXZlbCkgbWVtc2V0KCBwcm9jZXNzLCAweGJiLCBzaXplb2YocHJvY2VzcykgKTsgIC8qIGNhdGNoIGVycm9ycyAqLwogICAgIGZyZWUoIHByb2Nlc3MgKTsKIH0KIApAQCAtMTE3LDYgKzEyMiwxNyBAQAogICAgIHByaW50ZiggIlByb2Nlc3MgbmV4dD0lcCBwcmV2PSVwXG4iLCBwcm9jZXNzLT5uZXh0LCBwcm9jZXNzLT5wcmV2ICk7CiB9CiAKK3N0YXRpYyBpbnQgcHJvY2Vzc19zaWduYWxlZCggc3RydWN0IG9iamVjdCAqb2JqLCBzdHJ1Y3QgdGhyZWFkICp0aHJlYWQgKQoreworICAgIHN0cnVjdCBwcm9jZXNzICpwcm9jZXNzID0gKHN0cnVjdCBwcm9jZXNzICopb2JqOworICAgIHJldHVybiAocHJvY2Vzcy0+cnVubmluZ190aHJlYWRzID4gMCk7Cit9CisKK3N0YXRpYyBpbnQgcHJvY2Vzc19zYXRpc2ZpZWQoIHN0cnVjdCBvYmplY3QgKm9iaiwgc3RydWN0IHRocmVhZCAqdGhyZWFkICkKK3sKKyAgICByZXR1cm4gMDsKK30KKwogLyogZ2V0IGEgcHJvY2VzcyBmcm9tIGFuIGlkIChhbmQgaW5jcmVtZW50IHRoZSByZWZjb3VudCkgKi8KIHN0cnVjdCBwcm9jZXNzICpnZXRfcHJvY2Vzc19mcm9tX2lkKCB2b2lkICppZCApCiB7CkBAIC0xNDAsNiArMTU2LDcgQEAKICAgICBhc3NlcnQoICFwcm9jZXNzLT50aHJlYWRfbGlzdCApOwogICAgIHByb2Nlc3MtPmV4aXRfY29kZSA9IGV4aXRfY29kZTsKICAgICBnZXR0aW1lb2ZkYXkoICZwcm9jZXNzLT5lbmRfdGltZSwgTlVMTCApOworICAgIHdha2VfdXAoICZwcm9jZXNzLT5vYmosIDAgKTsKICAgICBmcmVlX2hhbmRsZXMoIHByb2Nlc3MgKTsKIH0KIApAQCAtMzA4LDYgKzMyNSw0NSBAQAogICAgIHJldHVybiAxOwogfQogCisvKiBjb3B5IHRoZSBoYW5kbGUgdGFibGUgb2YgdGhlIHBhcmVudCBwcm9jZXNzICovCisvKiByZXR1cm4gMSBpZiBPSywgMCBvbiBlcnJvciAqLworc3RhdGljIGludCBjb3B5X2hhbmRsZV90YWJsZSggc3RydWN0IHByb2Nlc3MgKnByb2Nlc3MsIHN0cnVjdCBwcm9jZXNzICpwYXJlbnQgKQoreworICAgIHN0cnVjdCBoYW5kbGVfZW50cnkgKnB0cjsKKyAgICBpbnQgaSwgY291bnQsIGxhc3Q7CisKKyAgICBpZiAoIXBhcmVudCkgIC8qIGZpcnN0IHByb2Nlc3MgKi8KKyAgICB7CisgICAgICAgIGNvdW50ID0gTUlOX0hBTkRMRV9FTlRSSUVTOworICAgICAgICBsYXN0ICA9IC0xOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhc3NlcnQoIHBhcmVudC0+ZW50cmllcyApOworICAgICAgICBjb3VudCA9IHBhcmVudC0+aGFuZGxlX2NvdW50OworICAgICAgICBsYXN0ICA9IHBhcmVudC0+aGFuZGxlX2xhc3Q7CisgICAgfQorCisgICAgaWYgKCEocHRyID0gbWFsbG9jKCBjb3VudCAqIHNpemVvZihzdHJ1Y3QgaGFuZGxlX2VudHJ5KSkpKSByZXR1cm4gMDsKKyAgICBwcm9jZXNzLT5lbnRyaWVzICAgICAgPSBwdHI7CisgICAgcHJvY2Vzcy0+aGFuZGxlX2NvdW50ID0gY291bnQ7CisgICAgcHJvY2Vzcy0+aGFuZGxlX2xhc3QgID0gbGFzdDsKKworICAgIGlmIChsYXN0ID49IDApCisgICAgeworICAgICAgICBtZW1jcHkoIHB0ciwgcGFyZW50LT5lbnRyaWVzLCAobGFzdCArIDEpICogc2l6ZW9mKHN0cnVjdCBoYW5kbGVfZW50cnkpICk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPD0gbGFzdDsgaSsrLCBwdHIrKykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCFwdHItPnB0cikgY29udGludWU7CisgICAgICAgICAgICBpZiAocHRyLT5hY2Nlc3MgJiBSRVNFUlZFRF9JTkhFUklUKSBncmFiX29iamVjdCggcHRyLT5wdHIgKTsKKyAgICAgICAgICAgIGVsc2UgcHRyLT5wdHIgPSBOVUxMOyAvKiBkb24ndCBpbmhlcml0IHRoaXMgZW50cnkgKi8KKyAgICAgICAgfQorICAgIH0KKyAgICAvKiBhdHRlbXB0IHRvIHNocmluayB0aGUgdGFibGUgKi8KKyAgICBzaHJpbmtfaGFuZGxlX3RhYmxlKCBwcm9jZXNzICk7CisgICAgcmV0dXJuIDE7Cit9CisKIC8qIGNsb3NlIGEgaGFuZGxlIGFuZCBkZWNyZW1lbnQgdGhlIHJlZmNvdW50IG9mIHRoZSBhc3NvY2lhdGVkIG9iamVjdCAqLwogLyogcmV0dXJuIDEgaWYgT0ssIDAgb24gZXJyb3IgKi8KIGludCBjbG9zZV9oYW5kbGUoIHN0cnVjdCBwcm9jZXNzICpwcm9jZXNzLCBpbnQgaGFuZGxlICkKQEAgLTM5MCw3ICs0NDYsNyBAQAogCiAgICAgaWYgKCFwcm9jZXNzLT5lbnRyaWVzKSByZXR1cm47CiAgICAgZW50cnkgPSBwcm9jZXNzLT5lbnRyaWVzOwotICAgIGZvciAoaSA9IDA7IGkgPCBwcm9jZXNzLT5oYW5kbGVfbGFzdDsgaSsrLCBlbnRyeSsrKQorICAgIGZvciAoaSA9IDA7IGkgPD0gcHJvY2Vzcy0+aGFuZGxlX2xhc3Q7IGkrKywgZW50cnkrKykKICAgICB7CiAgICAgICAgIGlmICghZW50cnktPnB0cikgY29udGludWU7CiAgICAgICAgIHByaW50ZiggIiU1ZDogJXAgJTA4eCAiLCBpICsgMSwgZW50cnktPnB0ciwgZW50cnktPmFjY2VzcyApOwpkaWZmIC0tZ2l0IGEvc2VydmVyL3JlcXVlc3QuYyBiL3NlcnZlci9yZXF1ZXN0LmMKaW5kZXggMzk3ZmU0Zi4uZTQ4MWQ3NiAxMDA2NDQKLS0tIGEvc2VydmVyL3JlcXVlc3QuYworKysgYi9zZXJ2ZXIvcmVxdWVzdC5jCkBAIC03LDYgKzcsNyBAQAogI2luY2x1ZGUgPHN0ZGFyZy5oPgogI2luY2x1ZGUgPHN0ZGlvLmg+CiAjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiAjaW5jbHVkZSA8c3lzL3Vpby5oPgogI2luY2x1ZGUgPHVuaXN0ZC5oPgogCkBAIC03MSw3ICs3Miw3IEBACiAgICAgY3VycmVudCA9IHRocmVhZDsKICAgICBpZiAoZGVidWdfbGV2ZWwpIHRyYWNlX3RpbWVvdXQoKTsKICAgICBDTEVBUl9FUlJPUigpOwotICAgIHNlbmRfcmVwbHkoIGN1cnJlbnQsIC0xLCAwICk7CisgICAgdGhyZWFkX3RpbWVvdXQoKTsKICAgICBjdXJyZW50ID0gTlVMTDsKIH0KIApAQCAtMTMxLDYgKzEzMiwxMiBAQAogLyogY3JlYXRlIGEgbmV3IHRocmVhZCAqLwogREVDTF9IQU5ETEVSKGluaXRfdGhyZWFkKQogeworICAgIGlmIChjdXJyZW50LT5zdGF0ZSAhPSBTVEFSVElORykKKyAgICB7CisgICAgICAgIGZhdGFsX3Byb3RvY29sX2Vycm9yKCAiaW5pdF90aHJlYWQ6IGFscmVhZHkgcnVubmluZ1xuIiApOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGN1cnJlbnQtPnN0YXRlICAgID0gUlVOTklORzsKICAgICBjdXJyZW50LT51bml4X3BpZCA9IHJlcS0+dW5peF9waWQ7CiAgICAgaWYgKCEoY3VycmVudC0+bmFtZSA9IG1hbGxvYyggbGVuICsgMSApKSkKICAgICB7CkBAIC0yMTMsNyArMjIwLDIxIEBACiAgICAgc2VuZF9yZXBseSggY3VycmVudCwgLTEsIDEsICZyZXBseSwgc2l6ZW9mKHJlcGx5KSApOwogfQogCi0vKiBvcGVuIGEgaGFuZGxlIGEgcHJvY2VzcyAqLworLyogZmV0Y2ggaW5mb3JtYXRpb24gYWJvdXQgYSB0aHJlYWQgKi8KK0RFQ0xfSEFORExFUihnZXRfdGhyZWFkX2luZm8pCit7CisgICAgc3RydWN0IHRocmVhZCAqdGhyZWFkOworICAgIHN0cnVjdCBnZXRfdGhyZWFkX2luZm9fcmVwbHkgcmVwbHkgPSB7IDAsIDAgfTsKKworICAgIGlmICgodGhyZWFkID0gZ2V0X3RocmVhZF9mcm9tX2hhbmRsZSggcmVxLT5oYW5kbGUsIFRIUkVBRF9RVUVSWV9JTkZPUk1BVElPTiApKSkKKyAgICB7CisgICAgICAgIGdldF90aHJlYWRfaW5mbyggdGhyZWFkLCAmcmVwbHkgKTsKKyAgICAgICAgcmVsZWFzZV9vYmplY3QoIHRocmVhZCApOworICAgIH0KKyAgICBzZW5kX3JlcGx5KCBjdXJyZW50LCAtMSwgMSwgJnJlcGx5LCBzaXplb2YocmVwbHkpICk7Cit9CisKKy8qIG9wZW4gYSBoYW5kbGUgdG8gYSBwcm9jZXNzICovCiBERUNMX0hBTkRMRVIob3Blbl9wcm9jZXNzKQogewogICAgIHN0cnVjdCBvcGVuX3Byb2Nlc3NfcmVwbHkgcmVwbHkgPSB7IC0xIH07CkBAIC0yMjYsMyArMjQ3LDEyIEBACiAgICAgfQogICAgIHNlbmRfcmVwbHkoIGN1cnJlbnQsIC0xLCAxLCAmcmVwbHksIHNpemVvZihyZXBseSkgKTsKIH0KKworLyogc2VsZWN0IG9uIGEgaGFuZGxlIGxpc3QgKi8KK0RFQ0xfSEFORExFUihzZWxlY3QpCit7CisgICAgaWYgKGxlbiAhPSByZXEtPmNvdW50ICogc2l6ZW9mKGludCkpCisgICAgICAgIGZhdGFsX3Byb3RvY29sX2Vycm9yKCAic2VsZWN0OiBiYWQgbGVuZ3RoICVkIGZvciAlZCBoYW5kbGVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuLCByZXEtPmNvdW50ICk7CisgICAgc2xlZXBfb24oIGN1cnJlbnQsIHJlcS0+Y291bnQsIChpbnQgKilkYXRhLCByZXEtPmZsYWdzLCByZXEtPnRpbWVvdXQgKTsKK30KZGlmZiAtLWdpdCBhL3NlcnZlci9zb2NrZXQuYyBiL3NlcnZlci9zb2NrZXQuYwppbmRleCA1ZDk2YTkzLi5mZDg1NzQxIDEwMDY0NAotLS0gYS9zZXJ2ZXIvc29ja2V0LmMKKysrIGIvc2VydmVyL3NvY2tldC5jCkBAIC0xNjUsOSArMTY1LDYgQEAKICNlbmRpZgogICAgIGludCByZXQ7CiAKLSAgICBpZiAoY2xpZW50LT5zdGF0ZSA9PSBSVU5OSU5HKSBjbGllbnQtPnN0YXRlID0gU0VORElORzsKLSAgICBhc3NlcnQoIGNsaWVudC0+c3RhdGUgPT0gU0VORElORyApOwotCiAgICAgaWYgKGNsaWVudC0+Y291bnQgPCBzaXplb2YoY2xpZW50LT5oZWFkKSkKICAgICB7CiAgICAgICAgIHZlYy5pb3ZfYmFzZSA9IChjaGFyICopJmNsaWVudC0+aGVhZCArIGNsaWVudC0+Y291bnQ7CkBAIC0yMDcsNiArMjA0LDkgQEAKICAgICAgICAgcmV0dXJuOwogICAgIH0KIAorICAgIGlmIChjbGllbnQtPnN0YXRlID09IFJVTk5JTkcpIGNsaWVudC0+c3RhdGUgPSBTRU5ESU5HOworICAgIGFzc2VydCggY2xpZW50LT5zdGF0ZSA9PSBTRU5ESU5HICk7CisKICAgICBjbGllbnQtPmNvdW50ICs9IHJldDsKIAogICAgIC8qIHJlY2VpdmVkIHRoZSBjb21wbGV0ZSBoZWFkZXIgeWV0PyAqLwpkaWZmIC0tZ2l0IGEvc2VydmVyL3RocmVhZC5jIGIvc2VydmVyL3RocmVhZC5jCmluZGV4IDIwNmUxYTkuLmUyNTBjYzggMTAwNjQ0Ci0tLSBhL3NlcnZlci90aHJlYWQuYworKysgYi9zZXJ2ZXIvdGhyZWFkLmMKQEAgLTEwLDYgKzEwLDcgQEAKICNpbmNsdWRlIDxzdGRpby5oPgogI2luY2x1ZGUgPHN0ZGxpYi5oPgogI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgogI2luY2x1ZGUgPHN5cy91aW8uaD4KICNpbmNsdWRlIDx1bmlzdGQuaD4KIApAQCAtMTksMTQgKzIwLDM3IEBACiAjaW5jbHVkZSAic2VydmVyL3RocmVhZC5oIgogCiAKKy8qIHRocmVhZCBxdWV1ZXMgKi8KKworc3RydWN0IHdhaXRfcXVldWVfZW50cnkKK3sKKyAgICBzdHJ1Y3Qgd2FpdF9xdWV1ZV9lbnRyeSAqbmV4dDsKKyAgICBzdHJ1Y3Qgd2FpdF9xdWV1ZV9lbnRyeSAqcHJldjsKKyAgICBzdHJ1Y3Qgb2JqZWN0ICAgICAgICAgICAqb2JqOworICAgIHN0cnVjdCB0aHJlYWQgICAgICAgICAgICp0aHJlYWQ7Cit9OworCitzdHJ1Y3QgdGhyZWFkX3dhaXQKK3sKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICBjb3VudDsgICAgICAvKiBjb3VudCBvZiBvYmplY3RzICovCisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgZmxhZ3M7CisgICAgc3RydWN0IHRpbWV2YWwgICAgICAgICAgdGltZW91dDsKKyAgICBzdHJ1Y3Qgd2FpdF9xdWV1ZV9lbnRyeSBxdWV1ZXNbMV07Cit9OworCisKIC8qIHRocmVhZCBvcGVyYXRpb25zICovCiAKIHN0YXRpYyB2b2lkIGR1bXBfdGhyZWFkKCBzdHJ1Y3Qgb2JqZWN0ICpvYmosIGludCB2ZXJib3NlICk7CitzdGF0aWMgaW50IHRocmVhZF9zaWduYWxlZCggc3RydWN0IG9iamVjdCAqb2JqLCBzdHJ1Y3QgdGhyZWFkICp0aHJlYWQgKTsKK3N0YXRpYyBpbnQgdGhyZWFkX3NhdGlzZmllZCggc3RydWN0IG9iamVjdCAqb2JqLCBzdHJ1Y3QgdGhyZWFkICp0aHJlYWQgKTsKIHN0YXRpYyB2b2lkIGRlc3Ryb3lfdGhyZWFkKCBzdHJ1Y3Qgb2JqZWN0ICpvYmogKTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBvYmplY3Rfb3BzIHRocmVhZF9vcHMgPQogewogICAgIGR1bXBfdGhyZWFkLAorICAgIHRocmVhZF9zaWduYWxlZCwKKyAgICB0aHJlYWRfc2F0aXNmaWVkLAogICAgIGRlc3Ryb3lfdGhyZWFkCiB9OwogCkBAIC01NSw3ICs3OSw5IEBACiAgICAgdGhyZWFkLT5wcm9jZXNzICAgPSBwcm9jZXNzOwogICAgIHRocmVhZC0+dW5peF9waWQgID0gMDsgIC8qIG5vdCBrbm93biB5ZXQgKi8KICAgICB0aHJlYWQtPm5hbWUgICAgICA9IE5VTEw7CisgICAgdGhyZWFkLT53YWl0ICAgICAgPSBOVUxMOwogICAgIHRocmVhZC0+ZXJyb3IgICAgID0gMDsKKyAgICB0aHJlYWQtPnN0YXRlICAgICA9IFNUQVJUSU5HOwogICAgIHRocmVhZC0+ZXhpdF9jb2RlID0gMHgxMDM7ICAvKiBTVElMTF9BQ1RJVkUgKi8KICAgICB0aHJlYWQtPm5leHQgICAgICA9IGZpcnN0X3RocmVhZDsKICAgICB0aHJlYWQtPnByZXYgICAgICA9IE5VTEw7CkBAIC0xMDQsNiArMTMwLDcgQEAKICAgICBpZiAodGhyZWFkLT5wcmV2KSB0aHJlYWQtPnByZXYtPm5leHQgPSB0aHJlYWQtPm5leHQ7CiAgICAgZWxzZSBmaXJzdF90aHJlYWQgPSB0aHJlYWQtPm5leHQ7CiAgICAgaWYgKHRocmVhZC0+bmFtZSkgZnJlZSggdGhyZWFkLT5uYW1lICk7CisgICAgaWYgKGRlYnVnX2xldmVsKSBtZW1zZXQoIHRocmVhZCwgMHhhYSwgc2l6ZW9mKHRocmVhZCkgKTsgIC8qIGNhdGNoIGVycm9ycyAqLwogICAgIGZyZWUoIHRocmVhZCApOwogfQogCkBAIC0xMTcsNiArMTQ0LDE3IEBACiAgICAgICAgICAgICB0aHJlYWQtPnVuaXhfcGlkLCB0aHJlYWQtPmNsaWVudF9mZCwgdGhyZWFkLT5uYW1lICk7CiB9CiAKK3N0YXRpYyBpbnQgdGhyZWFkX3NpZ25hbGVkKCBzdHJ1Y3Qgb2JqZWN0ICpvYmosIHN0cnVjdCB0aHJlYWQgKnRocmVhZCApCit7CisgICAgc3RydWN0IHRocmVhZCAqbXl0aHJlYWQgPSAoc3RydWN0IHRocmVhZCAqKW9iajsKKyAgICByZXR1cm4gKG15dGhyZWFkLT5zdGF0ZSA9PSBURVJNSU5BVEVEKTsKK30KKworc3RhdGljIGludCB0aHJlYWRfc2F0aXNmaWVkKCBzdHJ1Y3Qgb2JqZWN0ICpvYmosIHN0cnVjdCB0aHJlYWQgKnRocmVhZCApCit7CisgICAgcmV0dXJuIDA7Cit9CisKIC8qIGdldCBhIHRocmVhZCBwb2ludGVyIGZyb20gYSB0aHJlYWQgaWQgKGFuZCBpbmNyZW1lbnQgdGhlIHJlZmNvdW50KSAqLwogc3RydWN0IHRocmVhZCAqZ2V0X3RocmVhZF9mcm9tX2lkKCB2b2lkICppZCApCiB7CkBAIC0xMzMsNiArMTcxLDE0IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjY2VzcywgJnRocmVhZF9vcHMgKTsKIH0KIAorLyogZ2V0IGFsbCBpbmZvcm1hdGlvbiBhYm91dCBhIHRocmVhZCAqLwordm9pZCBnZXRfdGhyZWFkX2luZm8oIHN0cnVjdCB0aHJlYWQgKnRocmVhZCwKKyAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZ2V0X3RocmVhZF9pbmZvX3JlcGx5ICpyZXBseSApCit7CisgICAgcmVwbHktPnBpZCAgICAgICA9IHRocmVhZDsKKyAgICByZXBseS0+ZXhpdF9jb2RlID0gdGhyZWFkLT5leGl0X2NvZGU7Cit9CisKIC8qIHNlbmQgYSByZXBseSB0byBhIHRocmVhZCAqLwogaW50IHNlbmRfcmVwbHkoIHN0cnVjdCB0aHJlYWQgKnRocmVhZCwgaW50IHBhc3NfZmQsIGludCBuLAogICAgICAgICAgICAgICAgIC4uLiAvKiBhcmdfMSwgbGVuXzEsIC4uLiwgYXJnX24sIGxlbl9uICovICkKQEAgLTE1Miw2ICsxOTgsMjAxIEBACiAgICAgcmV0dXJuIHNlbmRfcmVwbHlfdiggdGhyZWFkLT5jbGllbnRfZmQsIHRocmVhZC0+ZXJyb3IsIHBhc3NfZmQsIHZlYywgbiApOwogfQogCisvKiBhZGQgYSB0aHJlYWQgdG8gYW4gb2JqZWN0IHdhaXQgcXVldWU7IHJldHVybiAxIGlmIE9LLCAwIG9uIGVycm9yICovCitzdGF0aWMgdm9pZCBhZGRfcXVldWUoIHN0cnVjdCBvYmplY3QgKm9iaiwgc3RydWN0IHdhaXRfcXVldWVfZW50cnkgKmVudHJ5ICkKK3sKKyAgICBlbnRyeS0+b2JqICAgID0gb2JqOworICAgIGVudHJ5LT5wcmV2ICAgPSBvYmotPnRhaWw7CisgICAgZW50cnktPm5leHQgICA9IE5VTEw7CisgICAgaWYgKG9iai0+dGFpbCkgb2JqLT50YWlsLT5uZXh0ID0gZW50cnk7CisgICAgZWxzZSBvYmotPmhlYWQgPSBlbnRyeTsKKyAgICBvYmotPnRhaWwgPSBlbnRyeTsKK30KKworLyogcmVtb3ZlIGEgdGhyZWFkIGZyb20gYW4gb2JqZWN0IHdhaXQgcXVldWUgKi8KK3N0YXRpYyB2b2lkIHJlbW92ZV9xdWV1ZSggc3RydWN0IHdhaXRfcXVldWVfZW50cnkgKmVudHJ5ICkKK3sKKyAgICBzdHJ1Y3Qgb2JqZWN0ICpvYmogPSBlbnRyeS0+b2JqOworCisgICAgaWYgKGVudHJ5LT5uZXh0KSBlbnRyeS0+bmV4dC0+cHJldiA9IGVudHJ5LT5wcmV2OworICAgIGVsc2Ugb2JqLT50YWlsID0gZW50cnktPnByZXY7CisgICAgaWYgKGVudHJ5LT5wcmV2KSBlbnRyeS0+cHJldi0+bmV4dCA9IGVudHJ5LT5uZXh0OworICAgIGVsc2Ugb2JqLT5oZWFkID0gZW50cnktPm5leHQ7CisgICAgcmVsZWFzZV9vYmplY3QoIG9iaiApOworfQorCisvKiBmaW5pc2ggd2FpdGluZyAqLworc3RhdGljIHZvaWQgZW5kX3dhaXQoIHN0cnVjdCB0aHJlYWQgKnRocmVhZCApCit7CisgICAgc3RydWN0IHRocmVhZF93YWl0ICp3YWl0ID0gdGhyZWFkLT53YWl0OworICAgIHN0cnVjdCB3YWl0X3F1ZXVlX2VudHJ5ICplbnRyeTsKKyAgICBpbnQgaTsKKworICAgIGFzc2VydCggd2FpdCApOworICAgIGZvciAoaSA9IDAsIGVudHJ5ID0gd2FpdC0+cXVldWVzOyBpIDwgd2FpdC0+Y291bnQ7IGkrKykKKyAgICAgICAgcmVtb3ZlX3F1ZXVlKCBlbnRyeSsrICk7CisgICAgaWYgKHdhaXQtPmZsYWdzICYgU0VMRUNUX1RJTUVPVVQpIHNldF90aW1lb3V0KCB0aHJlYWQtPmNsaWVudF9mZCwgTlVMTCApOworICAgIGZyZWUoIHdhaXQgKTsKKyAgICB0aHJlYWQtPndhaXQgPSBOVUxMOworfQorCisvKiBidWlsZCB0aGUgdGhyZWFkIHdhaXQgc3RydWN0dXJlICovCitzdGF0aWMgaW50IHdhaXRfb24oIHN0cnVjdCB0aHJlYWQgKnRocmVhZCwgaW50IGNvdW50LAorICAgICAgICAgICAgICAgICAgICBpbnQgKmhhbmRsZXMsIGludCBmbGFncywgaW50IHRpbWVvdXQgKQoreworICAgIHN0cnVjdCB0aHJlYWRfd2FpdCAqd2FpdDsKKyAgICBzdHJ1Y3Qgd2FpdF9xdWV1ZV9lbnRyeSAqZW50cnk7CisgICAgc3RydWN0IG9iamVjdCAqb2JqOworICAgIGludCBpOworCisgICAgaWYgKChjb3VudCA8IDApIHx8IChjb3VudCA+IE1BWElNVU1fV0FJVF9PQkpFQ1RTKSkKKyAgICB7CisgICAgICAgIFNFVF9FUlJPUiggRVJST1JfSU5WQUxJRF9QQVJBTUVURVIgKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGlmICghKHdhaXQgPSBtYWxsb2MoIHNpemVvZigqd2FpdCkgKyAoY291bnQtMSkgKiBzaXplb2YoKmVudHJ5KSApKSkKKyAgICB7CisgICAgICAgIFNFVF9FUlJPUiggRVJST1JfT1VUT0ZNRU1PUlkgKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHRocmVhZC0+d2FpdCAgPSB3YWl0OworICAgIHdhaXQtPmNvdW50ICAgPSBjb3VudDsKKyAgICB3YWl0LT5mbGFncyAgID0gZmxhZ3M7CisgICAgaWYgKGZsYWdzICYgU0VMRUNUX1RJTUVPVVQpCisgICAgeworICAgICAgICBnZXR0aW1lb2ZkYXkoICZ3YWl0LT50aW1lb3V0LCAwICk7CisgICAgICAgIGlmICh0aW1lb3V0KQorICAgICAgICB7CisgICAgICAgICAgICB3YWl0LT50aW1lb3V0LnR2X3VzZWMgKz0gKHRpbWVvdXQgJSAxMDAwKSAqIDEwMDA7CisgICAgICAgICAgICBpZiAod2FpdC0+dGltZW91dC50dl91c2VjID49IDEwMDAwMDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgd2FpdC0+dGltZW91dC50dl91c2VjIC09IDEwMDAwMDA7CisgICAgICAgICAgICAgICAgd2FpdC0+dGltZW91dC50dl9zZWMrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHdhaXQtPnRpbWVvdXQudHZfc2VjICs9IHRpbWVvdXQgLyAxMDAwOworICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChpID0gMCwgZW50cnkgPSB3YWl0LT5xdWV1ZXM7IGkgPCBjb3VudDsgaSsrLCBlbnRyeSsrKQorICAgIHsKKyAgICAgICAgaWYgKCEob2JqID0gZ2V0X2hhbmRsZV9vYmooIHRocmVhZC0+cHJvY2VzcywgaGFuZGxlc1tpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNZTkNIUk9OSVpFLCBOVUxMICkpKQorICAgICAgICB7CisgICAgICAgICAgICB3YWl0LT5jb3VudCA9IGkgLSAxOworICAgICAgICAgICAgZW5kX3dhaXQoIHRocmVhZCApOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgZW50cnktPnRocmVhZCA9IHRocmVhZDsKKyAgICAgICAgYWRkX3F1ZXVlKCBvYmosIGVudHJ5ICk7CisgICAgfQorICAgIHJldHVybiAxOworfQorCisvKiBjaGVjayBpZiB0aGUgdGhyZWFkIHdhaXRpbmcgY29uZGl0aW9uIGlzIHNhdGlzZmllZCAqLworc3RhdGljIGludCBjaGVja193YWl0KCBzdHJ1Y3QgdGhyZWFkICp0aHJlYWQsIGludCAqc2lnbmFsZWQgKQoreworICAgIGludCBpOworICAgIHN0cnVjdCB0aHJlYWRfd2FpdCAqd2FpdCA9IHRocmVhZC0+d2FpdDsKKyAgICBzdHJ1Y3Qgd2FpdF9xdWV1ZV9lbnRyeSAqZW50cnkgPSB3YWl0LT5xdWV1ZXM7CisgICAgc3RydWN0IHRpbWV2YWwgbm93OworCisgICAgYXNzZXJ0KCB3YWl0ICk7CisgICAgaWYgKHdhaXQtPmZsYWdzICYgU0VMRUNUX0FMTCkKKyAgICB7CisgICAgICAgIGZvciAoaSA9IDAsIGVudHJ5ID0gd2FpdC0+cXVldWVzOyBpIDwgd2FpdC0+Y291bnQ7IGkrKywgZW50cnkrKykKKyAgICAgICAgICAgIGlmICghZW50cnktPm9iai0+b3BzLT5zaWduYWxlZCggZW50cnktPm9iaiwgdGhyZWFkICkpIGdvdG8gY2hlY2tfdGltZW91dDsKKyAgICAgICAgLyogV2FpdCBzYXRpc2ZpZWQ6IHRlbGwgaXQgdG8gYWxsIG9iamVjdHMgKi8KKyAgICAgICAgKnNpZ25hbGVkID0gMDsKKyAgICAgICAgZm9yIChpID0gMCwgZW50cnkgPSB3YWl0LT5xdWV1ZXM7IGkgPCB3YWl0LT5jb3VudDsgaSsrLCBlbnRyeSsrKQorICAgICAgICAgICAgaWYgKGVudHJ5LT5vYmotPm9wcy0+c2F0aXNmaWVkKCBlbnRyeS0+b2JqLCB0aHJlYWQgKSkKKyAgICAgICAgICAgICAgICAqc2lnbmFsZWQgPSBTVEFUVVNfQUJBTkRPTkVEX1dBSVRfMDsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGZvciAoaSA9IDAsIGVudHJ5ID0gd2FpdC0+cXVldWVzOyBpIDwgd2FpdC0+Y291bnQ7IGkrKywgZW50cnkrKykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCFlbnRyeS0+b2JqLT5vcHMtPnNpZ25hbGVkKCBlbnRyeS0+b2JqLCB0aHJlYWQgKSkgY29udGludWU7CisgICAgICAgICAgICAvKiBXYWl0IHNhdGlzZmllZDogdGVsbCBpdCB0byB0aGUgb2JqZWN0ICovCisgICAgICAgICAgICAqc2lnbmFsZWQgPSBpOworICAgICAgICAgICAgaWYgKGVudHJ5LT5vYmotPm9wcy0+c2F0aXNmaWVkKCBlbnRyeS0+b2JqLCB0aHJlYWQgKSkKKyAgICAgICAgICAgICAgICAqc2lnbmFsZWQgKz0gU1RBVFVTX0FCQU5ET05FRF9XQUlUXzA7CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorICAgIH0KKyBjaGVja190aW1lb3V0OgorICAgIGlmICghKHdhaXQtPmZsYWdzICYgU0VMRUNUX1RJTUVPVVQpKSByZXR1cm4gMDsKKyAgICBnZXR0aW1lb2ZkYXkoICZub3csIE5VTEwgKTsKKyAgICBpZiAoKG5vdy50dl9zZWMgPiB3YWl0LT50aW1lb3V0LnR2X3NlYykgfHwKKyAgICAgICAgKChub3cudHZfc2VjID09IHdhaXQtPnRpbWVvdXQudHZfc2VjKSAmJgorICAgICAgICAgKG5vdy50dl91c2VjID49IHdhaXQtPnRpbWVvdXQudHZfdXNlYykpKQorICAgIHsKKyAgICAgICAgKnNpZ25hbGVkID0gU1RBVFVTX1RJTUVPVVQ7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworLyogc2xlZXAgb24gYSBsaXN0IG9mIG9iamVjdHMgKi8KK3ZvaWQgc2xlZXBfb24oIHN0cnVjdCB0aHJlYWQgKnRocmVhZCwgaW50IGNvdW50LCBpbnQgKmhhbmRsZXMsIGludCBmbGFncywgaW50IHRpbWVvdXQgKQoreworICAgIHN0cnVjdCBzZWxlY3RfcmVwbHkgcmVwbHk7CisKKyAgICBhc3NlcnQoICF0aHJlYWQtPndhaXQgKTsKKyAgICByZXBseS5zaWduYWxlZCA9IC0xOworICAgIGlmICghd2FpdF9vbiggdGhyZWFkLCBjb3VudCwgaGFuZGxlcywgZmxhZ3MsIHRpbWVvdXQgKSkgZ290byBkb25lOworICAgIGlmICghY2hlY2tfd2FpdCggdGhyZWFkLCAmcmVwbHkuc2lnbmFsZWQgKSkKKyAgICB7CisgICAgICAgIC8qIHdlIG5lZWQgdG8gd2FpdCAqLworICAgICAgICBpZiAoZmxhZ3MgJiBTRUxFQ1RfVElNRU9VVCkKKyAgICAgICAgICAgIHNldF90aW1lb3V0KCB0aHJlYWQtPmNsaWVudF9mZCwgJnRocmVhZC0+d2FpdC0+dGltZW91dCApOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGVuZF93YWl0KCB0aHJlYWQgKTsKKyBkb25lOgorICAgIHNlbmRfcmVwbHkoIHRocmVhZCwgLTEsIDEsICZyZXBseSwgc2l6ZW9mKHJlcGx5KSApOworfQorCisvKiBhdHRlbXB0IHRvIHdha2UgdXAgYSB0aHJlYWQgKi8KKy8qIHJldHVybiAxIGlmIE9LLCAwIGlmIHRoZSB3YWl0IGNvbmRpdGlvbiBpcyBzdGlsbCBub3Qgc2F0aXNmaWVkICovCitzdGF0aWMgaW50IHdha2VfdGhyZWFkKCBzdHJ1Y3QgdGhyZWFkICp0aHJlYWQgKQoreworICAgIHN0cnVjdCBzZWxlY3RfcmVwbHkgcmVwbHk7CisKKyAgICBpZiAoIWNoZWNrX3dhaXQoIHRocmVhZCwgJnJlcGx5LnNpZ25hbGVkICkpIHJldHVybiAwOworICAgIGVuZF93YWl0KCB0aHJlYWQgKTsKKyAgICBzZW5kX3JlcGx5KCB0aHJlYWQsIC0xLCAxLCAmcmVwbHksIHNpemVvZihyZXBseSkgKTsKKyAgICByZXR1cm4gMTsKK30KKworLyogdGltZW91dCBmb3IgdGhlIGN1cnJlbnQgdGhyZWFkICovCit2b2lkIHRocmVhZF90aW1lb3V0KHZvaWQpCit7CisgICAgc3RydWN0IHNlbGVjdF9yZXBseSByZXBseTsKKworICAgIGFzc2VydCggY3VycmVudC0+d2FpdCApOworCisgICAgcmVwbHkuc2lnbmFsZWQgPSBTVEFUVVNfVElNRU9VVDsKKyAgICBlbmRfd2FpdCggY3VycmVudCApOworICAgIHNlbmRfcmVwbHkoIGN1cnJlbnQsIC0xLCAxLCAmcmVwbHksIHNpemVvZihyZXBseSkgKTsKK30KKworLyogYXR0ZW1wdCB0byB3YWtlIHRocmVhZHMgc2xlZXBpbmcgb24gdGhlIG9iamVjdCB3YWl0IHF1ZXVlICovCit2b2lkIHdha2VfdXAoIHN0cnVjdCBvYmplY3QgKm9iaiwgaW50IG1heCApCit7CisgICAgc3RydWN0IHdhaXRfcXVldWVfZW50cnkgKmVudHJ5ID0gb2JqLT5oZWFkOworCisgICAgd2hpbGUgKGVudHJ5KQorICAgIHsKKyAgICAgICAgc3RydWN0IHdhaXRfcXVldWVfZW50cnkgKm5leHQgPSBlbnRyeS0+bmV4dDsKKyAgICAgICAgaWYgKHdha2VfdGhyZWFkKCBlbnRyeS0+dGhyZWFkICkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChtYXggJiYgIS0tbWF4KSBicmVhazsKKyAgICAgICAgfQorICAgICAgICBlbnRyeSA9IG5leHQ7CisgICAgfQorfQorCiAvKiBraWxsIGEgdGhyZWFkIG9uIHRoZSBzcG90ICovCiB2b2lkIGtpbGxfdGhyZWFkKCBzdHJ1Y3QgdGhyZWFkICp0aHJlYWQsIGludCBleGl0X2NvZGUgKQogewpAQCAtMTYyLDcgKzQwMywxMCBAQAogLyogYSB0aHJlYWQgaGFzIGJlZW4ga2lsbGVkICovCiB2b2lkIHRocmVhZF9raWxsZWQoIHN0cnVjdCB0aHJlYWQgKnRocmVhZCwgaW50IGV4aXRfY29kZSApCiB7CisgICAgdGhyZWFkLT5zdGF0ZSA9IFRFUk1JTkFURUQ7CiAgICAgdGhyZWFkLT5leGl0X2NvZGUgPSBleGl0X2NvZGU7CisgICAgaWYgKHRocmVhZC0+d2FpdCkgZW5kX3dhaXQoIHRocmVhZCApOwogICAgIHJlbW92ZV9wcm9jZXNzX3RocmVhZCggdGhyZWFkLT5wcm9jZXNzLCB0aHJlYWQgKTsKKyAgICB3YWtlX3VwKCAmdGhyZWFkLT5vYmosIDAgKTsKICAgICByZWxlYXNlX29iamVjdCggdGhyZWFkICk7CiB9CmRpZmYgLS1naXQgYS9zZXJ2ZXIvdHJhY2UuYyBiL3NlcnZlci90cmFjZS5jCmluZGV4IDcxMmVkZWEuLmE5MTU4Y2UgMTAwNjQ0Ci0tLSBhL3NlcnZlci90cmFjZS5jCisrKyBiL3NlcnZlci90cmFjZS5jCkBAIC0xLDYgKzEsNyBAQAogLyogRmlsZSBnZW5lcmF0ZWQgYXV0b21hdGljYWxseSBieSB0b29scy9tYWtlX3JlcXVlc3RzOyBETyBOT1QgRURJVCEhICovCiAKICNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgogI2luY2x1ZGUgPHN5cy91aW8uaD4KICNpbmNsdWRlICJzZXJ2ZXIuaCIKICNpbmNsdWRlICJzZXJ2ZXIvdGhyZWFkLmgiCkBAIC00Niw2ICs0NywxNyBAQAogICAgIHByaW50ZiggIiBleGl0X2NvZGU9JWQiLCByZXEtPmV4aXRfY29kZSApOwogfQogCitzdGF0aWMgdm9pZCBkdW1wX2dldF90aHJlYWRfaW5mb19yZXF1ZXN0KCBzdHJ1Y3QgZ2V0X3RocmVhZF9pbmZvX3JlcXVlc3QgKnJlcSApCit7CisgICAgcHJpbnRmKCAiIGhhbmRsZT0lZCIsIHJlcS0+aGFuZGxlICk7Cit9CisKK3N0YXRpYyB2b2lkIGR1bXBfZ2V0X3RocmVhZF9pbmZvX3JlcGx5KCBzdHJ1Y3QgZ2V0X3RocmVhZF9pbmZvX3JlcGx5ICpyZXEgKQoreworICAgIHByaW50ZiggIiBwaWQ9JXAsIiwgcmVxLT5waWQgKTsKKyAgICBwcmludGYoICIgZXhpdF9jb2RlPSVkIiwgcmVxLT5leGl0X2NvZGUgKTsKK30KKwogc3RhdGljIHZvaWQgZHVtcF9jbG9zZV9oYW5kbGVfcmVxdWVzdCggc3RydWN0IGNsb3NlX2hhbmRsZV9yZXF1ZXN0ICpyZXEgKQogewogICAgIHByaW50ZiggIiBoYW5kbGU9JWQiLCByZXEtPmhhbmRsZSApOwpAQCAtNzksNiArOTEsMTggQEAKICAgICBwcmludGYoICIgaGFuZGxlPSVkIiwgcmVxLT5oYW5kbGUgKTsKIH0KIAorc3RhdGljIHZvaWQgZHVtcF9zZWxlY3RfcmVxdWVzdCggc3RydWN0IHNlbGVjdF9yZXF1ZXN0ICpyZXEgKQoreworICAgIHByaW50ZiggIiBjb3VudD0lZCwiLCByZXEtPmNvdW50ICk7CisgICAgcHJpbnRmKCAiIGZsYWdzPSVkLCIsIHJlcS0+ZmxhZ3MgKTsKKyAgICBwcmludGYoICIgdGltZW91dD0lZCIsIHJlcS0+dGltZW91dCApOworfQorCitzdGF0aWMgdm9pZCBkdW1wX3NlbGVjdF9yZXBseSggc3RydWN0IHNlbGVjdF9yZXBseSAqcmVxICkKK3sKKyAgICBwcmludGYoICIgc2lnbmFsZWQ9JWQiLCByZXEtPnNpZ25hbGVkICk7Cit9CisKIHN0cnVjdCBkdW1wZXIKIHsKICAgICB2b2lkICgqZHVtcF9yZXEpKCk7CkBAIC0xMDMsNiArMTI3LDkgQEAKICAgICB7ICh2b2lkKCopKCkpZHVtcF9nZXRfcHJvY2Vzc19pbmZvX3JlcXVlc3QsCiAgICAgICAodm9pZCgqKSgpKWR1bXBfZ2V0X3Byb2Nlc3NfaW5mb19yZXBseSwKICAgICAgIHNpemVvZihzdHJ1Y3QgZ2V0X3Byb2Nlc3NfaW5mb19yZXF1ZXN0KSB9LAorICAgIHsgKHZvaWQoKikoKSlkdW1wX2dldF90aHJlYWRfaW5mb19yZXF1ZXN0LAorICAgICAgKHZvaWQoKikoKSlkdW1wX2dldF90aHJlYWRfaW5mb19yZXBseSwKKyAgICAgIHNpemVvZihzdHJ1Y3QgZ2V0X3RocmVhZF9pbmZvX3JlcXVlc3QpIH0sCiAgICAgeyAodm9pZCgqKSgpKWR1bXBfY2xvc2VfaGFuZGxlX3JlcXVlc3QsCiAgICAgICAodm9pZCgqKSgpKTAsCiAgICAgICBzaXplb2Yoc3RydWN0IGNsb3NlX2hhbmRsZV9yZXF1ZXN0KSB9LApAQCAtMTEyLDYgKzEzOSw5IEBACiAgICAgeyAodm9pZCgqKSgpKWR1bXBfb3Blbl9wcm9jZXNzX3JlcXVlc3QsCiAgICAgICAodm9pZCgqKSgpKWR1bXBfb3Blbl9wcm9jZXNzX3JlcGx5LAogICAgICAgc2l6ZW9mKHN0cnVjdCBvcGVuX3Byb2Nlc3NfcmVxdWVzdCkgfSwKKyAgICB7ICh2b2lkKCopKCkpZHVtcF9zZWxlY3RfcmVxdWVzdCwKKyAgICAgICh2b2lkKCopKCkpZHVtcF9zZWxlY3RfcmVwbHksCisgICAgICBzaXplb2Yoc3RydWN0IHNlbGVjdF9yZXF1ZXN0KSB9LAogfTsKIAogc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCByZXFfbmFtZXNbUkVRX05CX1JFUVVFU1RTXSA9CkBAIC0xMjEsOSArMTUxLDExIEBACiAgICAgInRlcm1pbmF0ZV9wcm9jZXNzIiwKICAgICAidGVybWluYXRlX3RocmVhZCIsCiAgICAgImdldF9wcm9jZXNzX2luZm8iLAorICAgICJnZXRfdGhyZWFkX2luZm8iLAogICAgICJjbG9zZV9oYW5kbGUiLAogICAgICJkdXBfaGFuZGxlIiwKICAgICAib3Blbl9wcm9jZXNzIiwKKyAgICAic2VsZWN0IiwKIH07CiAKIHZvaWQgdHJhY2VfcmVxdWVzdCggZW51bSByZXF1ZXN0IHJlcSwgdm9pZCAqZGF0YSwgaW50IGxlbiwgaW50IGZkICkKZGlmZiAtLWdpdCBhL3Rvb2xzL2J1aWxkLmMgYi90b29scy9idWlsZC5jCmluZGV4IDc2ZDhiN2UuLmJkN2YxZTkgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2J1aWxkLmMKKysrIGIvdG9vbHMvYnVpbGQuYwpAQCAtMTYzMCw3ICsxNjMwLDcgQEAKICNlbmRpZgogICAgIGZwcmludGYoIG91dGZpbGUsICJcdG1vdncgJSVieCwlJWVzXG4iICk7CiAKLSAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHRtb3Z3ICIgUFJFRklYICJDQUxMVE8xNl9DdXJyZW50X2ZzLCUlZnNcbiIgKTsKKyAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHRtb3Z3ICIgUFJFRklYICJTWVNMRVZFTF9XaW4xNkN1cnJlbnRUZWIsJSVmc1xuIiApOwogCiAgICAgLyogR2V0IHRoZSAzMi1iaXQgc3RhY2sgcG9pbnRlciBmcm9tIHRoZSBURUIgKi8KIApAQCAtMTc0Nyw3ICsxNzQ3LDYgQEAKICAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHQuYnl0ZSAweDY0XG5cdG1vdncgKCVkKSwlJXNzXG4iLCBTVEFDS09GRlNFVCArIDIgKTsKICAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHQuYnl0ZSAweDY0XG5cdG1vdncgKCVkKSwlJXNwXG4iLCBTVEFDS09GRlNFVCApOwogICAgIGZwcmludGYoIG91dGZpbGUsICJcdC5ieXRlIDB4NjRcblx0cG9wbCAoJWQpXG4iLCBTVEFDS09GRlNFVCApOwotICAgIGZwcmludGYoIG91dGZpbGUsICJcdG1vdncgJSVmcywiIFBSRUZJWCAiQ0FMTFRPMTZfQ3VycmVudF9mc1xuIiApOwogCiAgICAgaWYgKHJlZ19mdW5jKQogICAgIHsKQEAgLTE5NDgsMTIgKzE5NDcsMTEgQEAKIAogICAgIGZwcmludGYoIG91dGZpbGUsICJkb19jYWxsdG8xNl8lczpcbiIsIHByb2ZpbGUgKTsKIAotICAgIC8qIFNhdmUgdGhlIDMyLWJpdCBzdGFjayBhbmQgJWZzICovCisgICAgLyogU2F2ZSB0aGUgMzItYml0IHN0YWNrICovCiAKICAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHQuYnl0ZSAweDY0XG5cdHB1c2hsICglZClcbiIsIFNUQUNLT0ZGU0VUICk7CiAgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0bW92bCAlJWVicCwlJWVieFxuIiApOwogICAgIGZwcmludGYoIG91dGZpbGUsICJcdG1vdmwgJSVlc3AsJSVlZHhcbiIgKTsKLSAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHRtb3Z3ICUlZnMsIiBQUkVGSVggIkNBTExUTzE2X0N1cnJlbnRfZnNcbiIgKTsKIAogICAgIGlmIChyZWdfZnVuYykKICAgICB7CkBAIC0yMTA2LDcgKzIxMDQsNyBAQAogI2VuZGlmCiAgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0bW92dyAlJWJ4LCUlZXNcbiIgKTsKIAotICAgIGZwcmludGYoIG91dGZpbGUsICJcdG1vdncgIiBQUkVGSVggIkNBTExUTzE2X0N1cnJlbnRfZnMsJSVmc1xuIiApOworICAgIGZwcmludGYoIG91dGZpbGUsICJcdG1vdncgIiBQUkVGSVggIlNZU0xFVkVMX1dpbjE2Q3VycmVudFRlYiwlJWZzXG4iICk7CiAKICAgICAvKiBSZXN0b3JlIHRoZSAzMi1iaXQgc3RhY2sgKi8KIApkaWZmIC0tZ2l0IGEvdG9vbHMvbWFrZV9yZXF1ZXN0cyBiL3Rvb2xzL21ha2VfcmVxdWVzdHMKaW5kZXggMWNiYTU4MC4uZjAyYmQ0MyAxMDA3NTUKLS0tIGEvdG9vbHMvbWFrZV9yZXF1ZXN0cworKysgYi90b29scy9tYWtlX3JlcXVlc3RzCkBAIC0xLDQgKzEsNCBAQAotIyEgL3Vzci9iaW4vcGVybAorIyEgL3Vzci9iaW4vcGVybCAtdwogIwogIyBCdWlsZCB0aGUgc2VydmVyL3RyYWNlLmMgYW5kIGluY2x1ZGUvc2VydmVyL3JlcXVlc3QuaCBmaWxlcwogIyBmcm9tIHRoZSBjb250ZW50cyBvZiBpbmNsdWRlL3NlcnZlci5oLgpAQCAtMjYsNiArMjYsNyBAQAogLyogRmlsZSBnZW5lcmF0ZWQgYXV0b21hdGljYWxseSBieSAkMDsgRE8gTk9UIEVESVQhISAqLwogCiAjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KICNpbmNsdWRlIDxzeXMvdWlvLmg+CiAjaW5jbHVkZSAic2VydmVyLmgiCiAjaW5jbHVkZSAic2VydmVyL3RocmVhZC5oIgpAQCAtMTk0LDYgKzE5NSw3IEBACiAJbGFzdCBpZiAvXn07JC87CiAgICAgICAgIG5leHQgaWYgL157JC87CiAJcyEvXCouKlwqLyEhZzsKKwluZXh0IGlmIC9eXHMqJC87CiAJLyAqKFx3K1wqKiggK1x3K1wqKikqKSArKFx3Kyk7LyBvciBkaWUgIlVucmVjb2duaXplZCBzeW50YXggJF8iOwogCW15ICR0eXBlID0gJDE7CiAJbXkgJHZhciA9ICQzOwpAQCAtMjE1LDYgKzIxNyw3IEBACiAJbGFzdCBpZiAvXn07JC87CiAgICAgICAgIG5leHQgaWYgL157JC87CiAJcyEvXCouKlwqLyEhZzsKKwluZXh0IGlmIC9eXHMqJC87CiAJLyAqKFx3K1wqKiggK1x3K1wqKikqKSArKFx3Kyk7LyBvciBkaWUgIlVucmVjb2duaXplZCBzeW50YXggJF8iOwogCW15ICR0eXBlID0gJDE7CiAJbXkgJHZhciA9ICQzOwpAQCAtMjM4LDcgKzI0MSw2IEBACiAJcHJpbnQgVFJBQ0UgIiAgICBwcmludGYoIFwiICR2YXI9JGZvcm1hdHN7JHR5cGV9IjsKIAlwcmludCBUUkFDRSAiLCIgaWYgKCQjXyA+IDApOwogCXByaW50IFRSQUNFICJcIiwgcmVxLT4kdmFyICk7XG4iOwotCSRzaXplIC49ICIrc2l6ZW9mKCR0eXBlKSI7CiAgICAgfQogICAgIHByaW50IFRSQUNFICJ9XG4iOwogfQpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdHJ1biBiL3Rvb2xzL3Rlc3RydW4KaW5kZXggNDk5ZTEzNC4uNjUwOGMwMSAxMDA3NTUKLS0tIGEvdG9vbHMvdGVzdHJ1bgorKysgYi90b29scy90ZXN0cnVuCkBAIC0yMjMsMzEgKzIyMyw2IEBACiAJCSNwcmludCAic2tpcHBpbmcgJGV4ZSwgYWxyZWFkeSBkb25lLlxuIjsKIAkJbmV4dDsKIAl9Ci0KLQkjIGNoZWNrIHJ1bmZpbGUgaWYgdGhlIGV4ZSBpcyBhIERPUyBleGVjdXRlYWJsZSBvciAKLQkjIG9mIGRpZmZlcmVudCBhcmNoaXRlY3R1cmUgKHdpbjMyKQotCWlmIChvcGVuKFJVTkZJTEUsInJ1bnMvJHJ1bmZpbGUub3V0IikpIHsKLQkJd2hpbGUgKCR4cnVuPTxSVU5GSUxFPikgewotCQkJY2hvcCgkeHJ1bik7Ci0JCQlpZiAoJHhydW49fiAvTG9hZE1vZHVsZTouKmVycm9yPTExJC8pIHsKLQkJCQkkZmxhZz0xOwotCQkJCWxhc3Q7Ci0JCQl9Ci0JCQlpZiAoJHhydW49fiAvTG9hZE1vZHVsZTouKmVycm9yPTIxJC8pIHsKLQkJCQkkZmxhZz0yOwotCQkJCWxhc3Q7Ci0JCQl9Ci0JCX0KLQkJY2xvc2UoUlVORklMRSk7Ci0JCWlmICgkZmxhZz09MSkgewotCQkJI3ByaW50ICJza2lwcGluZyAkZXhlLCBzZWVtcyB0byBiZSBhIERPUyBleGVjdXRhYmxlLlxuIjsKLQkJCW5leHQ7Ci0JCX0KLQkJaWYgKCRmbGFnPT0yKSB7Ci0JCQkjcHJpbnQgInNraXBwaW5nICRleGUsIHNlZW1zIHRvIGJlIGEgbm9uIGkzODYgZXhlY3V0YWJsZS5cbiI7Ci0JCQluZXh0OwotCQl9Ci0JfQogCSMgbm93IHRlc3RydW4uLi4KIAlwcmludCAiJGV4ZTpcbiI7CiAJJGRpciA9ICRleGU7CmRpZmYgLS1naXQgYS93aW4zMi9kZXZpY2UuYyBiL3dpbjMyL2RldmljZS5jCmluZGV4IDc1NzRiYjUuLjljZTI0MGUgMTAwNjQ0Ci0tLSBhL3dpbjMyL2RldmljZS5jCisrKyBiL3dpbjMyL2RldmljZS5jCkBAIC0yLDYgKzIsOCBAQAogICogV2luMzIgZGV2aWNlIGZ1bmN0aW9ucwogICoKICAqIENvcHlyaWdodCAxOTk4IE1hcmN1cyBNZWlzc25lcgorICogQ29weXJpZ2h0IDE5OTggVWxyaWNoIFdlaWdhbmQKKyAqCiAgKi8KIAogI2luY2x1ZGUgPGVycm5vLmg+CkBAIC0yMyw4ICsyNSw5IEBACiAjaW5jbHVkZSAiaGVhcC5oIgogI2luY2x1ZGUgImRlYnVnLmgiCiAjaW5jbHVkZSAid2luaW9jdGwuaCIKKyNpbmNsdWRlICJzdGFja2ZyYW1lLmgiCiAKLXZvaWQgREVWSUNFX0Rlc3Ryb3koSzMyT0JKICpkZXYpOworc3RhdGljIHZvaWQgREVWSUNFX0Rlc3Ryb3koSzMyT0JKICpkZXYpOwogY29uc3QgSzMyT0JKX09QUyBERVZJQ0VfT3BzID0KIHsKICAgICBOVUxMLAkJLyogc2lnbmFsZWQgKi8KQEAgLTQwLDIyICs0MywyNDAgQEAKIHR5cGVkZWYgc3RydWN0CiB7CiAgICAgSzMyT0JKICAgIGhlYWRlcjsKLSAgICBpbnQgICAgICAgbW9kZTsKKworICAgIHN0cnVjdCBWeERJbmZvICppbmZvOwogICAgIGNoYXIgICAgICpkZXZuYW1lOworICAgIGludCAgICAgICBtb2RlOworCiB9IERFVklDRV9PQkpFQ1Q7CiAKLUhBTkRMRTMyCi1ERVZJQ0VfT3BlbihMUENTVFIgZmlsZW5hbWUsIERXT1JEIGFjY2VzcykgewotCURFVklDRV9PQkpFQ1QJKmRldjsKLQlIQU5ETEUzMiBoYW5kbGU7CiAKLQlkZXYgPSBIZWFwQWxsb2MoIFN5c3RlbUhlYXAsIDAsIHNpemVvZihGSUxFX09CSkVDVCkgKTsKLQlpZiAoIWRldikKLQkgICAgcmV0dXJuIElOVkFMSURfSEFORExFX1ZBTFVFMzI7CitzdGF0aWMgQk9PTDMyIERldmljZUlvX1ZUREFQSShERVZJQ0VfT0JKRUNUICpkZXYsIERXT1JEIGR3SW9Db250cm9sQ29kZSwgCisJCQkgICAgICBMUFZPSUQgbHB2SW5CdWZmZXIsIERXT1JEIGNiSW5CdWZmZXIsCisJCQkgICAgICBMUFZPSUQgbHB2T3V0QnVmZmVyLCBEV09SRCBjYk91dEJ1ZmZlciwKKwkJCSAgICAgIExQRFdPUkQgbHBjYkJ5dGVzUmV0dXJuZWQsCisJCQkgICAgICBMUE9WRVJMQVBQRUQgbHBPdmVybGFwcGVkKTsKKworc3RhdGljIEJPT0wzMiBWeERDYWxsX1ZNTSggRFdPUkQgKnJldHYsIERXT1JEIHNlcnZpY2UsIENPTlRFWFQgKmNvbnRleHQgKTsKKworLyoKKyAqIFZ4RCBuYW1lcyBhcmUgdGFrZW4gZnJvbSB0aGUgV2luOTUgRERLCisgKi8KKworc3RydWN0IFZ4REluZm8KK3sKKyAgICBMUENTVFIgIG5hbWU7CisgICAgV09SRCAgICBpZDsKKyAgICBCT09MMzIgICgqdnhkY2FsbCkoRFdPUkQgKiwgRFdPUkQsIENPTlRFWFQgKik7CisgICAgQk9PTDMyICAoKmRldmljZWlvKShERVZJQ0VfT0JKRUNUICosIERXT1JELCBMUFZPSUQsIERXT1JELCAKKyAgICAgICAgICAgICAgICAgICAgICAgIExQVk9JRCwgRFdPUkQsIExQRFdPUkQsIExQT1ZFUkxBUFBFRCk7Cit9ICAgCisgICAgVnhETGlzdFtdID0gCit7CisgICAgLyogU3RhbmRhcmQgVnhEIElEcyAqLworICAgIHsgIlZNTSIsICAgICAgMHgwMDAxLCBWeERDYWxsX1ZNTSwgTlVMTCB9LAorICAgIHsgIkRFQlVHIiwgICAgMHgwMDAyLCBOVUxMLCBOVUxMIH0sCisgICAgeyAiVlBJQ0QiLCAgICAweDAwMDMsIE5VTEwsIE5VTEwgfSwKKyAgICB7ICJWRE1BRCIsICAgIDB4MDAwNCwgTlVMTCwgTlVMTCB9LAorICAgIHsgIlZURCIsICAgICAgMHgwMDA1LCBOVUxMLCBOVUxMIH0sCisgICAgeyAiVjg2TU1HUiIsICAweDAwMDYsIE5VTEwsIE5VTEwgfSwKKyAgICB7ICJQQUdFU1dBUCIsIDB4MDAwNywgTlVMTCwgTlVMTCB9LAorICAgIHsgIlBBUklUWSIsICAgMHgwMDA4LCBOVUxMLCBOVUxMIH0sCisgICAgeyAiUkVCT09UIiwgICAweDAwMDksIE5VTEwsIE5VTEwgfSwKKyAgICB7ICJWREQiLCAgICAgIDB4MDAwQSwgTlVMTCwgTlVMTCB9LAorICAgIHsgIlZTRCIsICAgICAgMHgwMDBCLCBOVUxMLCBOVUxMIH0sCisgICAgeyAiVk1EIiwgICAgICAweDAwMEMsIE5VTEwsIE5VTEwgfSwKKyAgICB7ICJWS0QiLCAgICAgIDB4MDAwRCwgTlVMTCwgTlVMTCB9LAorICAgIHsgIlZDRCIsICAgICAgMHgwMDBFLCBOVUxMLCBOVUxMIH0sCisgICAgeyAiVlBEIiwgICAgICAweDAwMEYsIE5VTEwsIE5VTEwgfSwKKyAgICB7ICJCTE9DS0RFViIsIDB4MDAxMCwgTlVMTCwgTlVMTCB9LAorICAgIHsgIlZNQ1BEIiwgICAgMHgwMDExLCBOVUxMLCBOVUxMIH0sCisgICAgeyAiRUJJT1MiLCAgICAweDAwMTIsIE5VTEwsIE5VTEwgfSwKKyAgICB7ICJCSU9TWExBVCIsIDB4MDAxMywgTlVMTCwgTlVMTCB9LAorICAgIHsgIlZORVRCSU9TIiwgMHgwMDE0LCBOVUxMLCBOVUxMIH0sCisgICAgeyAiRE9TTUdSIiwgICAweDAwMTUsIE5VTEwsIE5VTEwgfSwKKyAgICB7ICJXSU5MT0FEIiwgIDB4MDAxNiwgTlVMTCwgTlVMTCB9LAorICAgIHsgIlNIRUxMIiwgICAgMHgwMDE3LCBOVUxMLCBOVUxMIH0sCisgICAgeyAiVk1QT0xMIiwgICAweDAwMTgsIE5VTEwsIE5VTEwgfSwKKyAgICB7ICJWUFJPRCIsICAgIDB4MDAxOSwgTlVMTCwgTlVMTCB9LAorICAgIHsgIkRPU05FVCIsICAgMHgwMDFBLCBOVUxMLCBOVUxMIH0sCisgICAgeyAiVkZEIiwgICAgICAweDAwMUIsIE5VTEwsIE5VTEwgfSwKKyAgICB7ICJWREQyIiwgICAgIDB4MDAxQywgTlVMTCwgTlVMTCB9LAorICAgIHsgIldJTkRFQlVHIiwgMHgwMDFELCBOVUxMLCBOVUxMIH0sCisgICAgeyAiVFNSTE9BRCIsICAweDAwMUUsIE5VTEwsIE5VTEwgfSwKKyAgICB7ICJCSU9TSE9PSyIsIDB4MDAxRiwgTlVMTCwgTlVMTCB9LAorICAgIHsgIklOVDEzIiwgICAgMHgwMDIwLCBOVUxMLCBOVUxMIH0sCisgICAgeyAiUEFHRUZJTEUiLCAweDAwMjEsIE5VTEwsIE5VTEwgfSwKKyAgICB7ICJTQ1NJIiwgICAgIDB4MDAyMiwgTlVMTCwgTlVMTCB9LAorICAgIHsgIk1DQV9QT1MiLCAgMHgwMDIzLCBOVUxMLCBOVUxMIH0sCisgICAgeyAiU0NTSUZEIiwgICAweDAwMjQsIE5VTEwsIE5VTEwgfSwKKyAgICB7ICJWUEVORCIsICAgIDB4MDAyNSwgTlVMTCwgTlVMTCB9LAorICAgIHsgIlZQT1dFUkQiLCAgMHgwMDI2LCBOVUxMLCBOVUxMIH0sCisgICAgeyAiVlhETERSIiwgICAweDAwMjcsIE5VTEwsIE5VTEwgfSwKKyAgICB7ICJORElTIiwgICAgIDB4MDAyOCwgTlVMTCwgTlVMTCB9LAorICAgIHsgIkJJT1NfRVhUIiwgMHgwMDI5LCBOVUxMLCBOVUxMIH0sCisgICAgeyAiVldJTjMyIiwgICAweDAwMkEsIE5VTEwsIE5VTEwgfSwKKyAgICB7ICJWQ09NTSIsICAgIDB4MDAyQiwgTlVMTCwgTlVMTCB9LAorICAgIHsgIlNQT09MRVIiLCAgMHgwMDJDLCBOVUxMLCBOVUxMIH0sCisgICAgeyAiV0lOMzJTIiwgICAweDAwMkQsIE5VTEwsIE5VTEwgfSwKKyAgICB7ICJERUJVR0NNRCIsIDB4MDAyRSwgTlVMTCwgTlVMTCB9LAorCisgICAgeyAiVk5CIiwgICAgICAweDAwMzEsIE5VTEwsIE5VTEwgfSwKKyAgICB7ICJTRVJWRVIiLCAgIDB4MDAzMiwgTlVMTCwgTlVMTCB9LAorICAgIHsgIkNPTkZJR01HIiwgMHgwMDMzLCBOVUxMLCBOVUxMIH0sCisgICAgeyAiRFdDRkdNRyIsICAweDAwMzQsIE5VTEwsIE5VTEwgfSwKKyAgICB7ICJTQ1NJUE9SVCIsIDB4MDAzNSwgTlVMTCwgTlVMTCB9LAorICAgIHsgIlZGQkFDS1VQIiwgMHgwMDM2LCBOVUxMLCBOVUxMIH0sCisgICAgeyAiRU5BQkxFIiwgICAweDAwMzcsIE5VTEwsIE5VTEwgfSwKKyAgICB7ICJWQ09ORCIsICAgIDB4MDAzOCwgTlVMTCwgTlVMTCB9LAorCisgICAgeyAiRUZBWCIsICAgICAweDAwM0EsIE5VTEwsIE5VTEwgfSwKKyAgICB7ICJEU1ZYRCIsICAgIDB4MDAzQiwgTlVMTCwgTlVMTCB9LAorICAgIHsgIklTQVBOUCIsICAgMHgwMDNDLCBOVUxMLCBOVUxMIH0sCisgICAgeyAiQklPUyIsICAgICAweDAwM0QsIE5VTEwsIE5VTEwgfSwKKyAgICB7ICJXSU5TT0NLIiwgIDB4MDAzRSwgTlVMTCwgTlVMTCB9LAorICAgIHsgIldTT0NLIiwgICAgMHgwMDNFLCBOVUxMLCBOVUxMIH0sCisgICAgeyAiV1NJUFgiLCAgICAweDAwM0YsIE5VTEwsIE5VTEwgfSwKKyAgICB7ICJJRlNNZ3IiLCAgIDB4MDA0MCwgTlVMTCwgTlVMTCB9LAorICAgIHsgIlZDREZTRCIsICAgMHgwMDQxLCBOVUxMLCBOVUxMIH0sCisgICAgeyAiTVJDSTIiLCAgICAweDAwNDIsIE5VTEwsIE5VTEwgfSwKKyAgICB7ICJQQ0kiLCAgICAgIDB4MDA0MywgTlVMTCwgTlVMTCB9LAorICAgIHsgIlBFTE9BREVSIiwgMHgwMDQ0LCBOVUxMLCBOVUxMIH0sCisgICAgeyAiRUlTQSIsICAgICAweDAwNDUsIE5VTEwsIE5VTEwgfSwKKyAgICB7ICJEUkFHQ0xJIiwgIDB4MDA0NiwgTlVMTCwgTlVMTCB9LAorICAgIHsgIkRSQUdTUlYiLCAgMHgwMDQ3LCBOVUxMLCBOVUxMIH0sCisgICAgeyAiUEVSRiIsICAgICAweDAwNDgsIE5VTEwsIE5VTEwgfSwKKyAgICB7ICJBV1JFRElSIiwgIDB4MDA0OSwgTlVMTCwgTlVMTCB9LAorCisgICAgLyogRmFyIEVhc3Qgc3VwcG9ydCAqLworICAgIHsgIkVURU4iLCAgICAgMHgwMDYwLCBOVUxMLCBOVUxMIH0sCisgICAgeyAiQ0hCSU9TIiwgICAweDAwNjEsIE5VTEwsIE5VTEwgfSwKKyAgICB7ICJWTVNHRCIsICAgIDB4MDA2MiwgTlVMTCwgTlVMTCB9LAorICAgIHsgIlZQUElEIiwgICAgMHgwMDYzLCBOVUxMLCBOVUxMIH0sCisgICAgeyAiVklNRSIsICAgICAweDAwNjQsIE5VTEwsIE5VTEwgfSwKKyAgICB7ICJWSEJJT1NEIiwgIDB4MDA2NSwgTlVMTCwgTlVMTCB9LAorCisgICAgLyogTXVsdGltZWRpYSBPRU0gSURzICovCisgICAgeyAiVlREQVBJIiwgICAweDA0NDIsIE5VTEwsIERldmljZUlvX1ZUREFQSSB9LAorCisgICAgLyogTmV0d29yayBEZXZpY2UgSURzICovCisgICAgeyAiVk5ldFN1cCIsICAweDA0ODAsIE5VTEwsIE5VTEwgfSwKKyAgICB7ICJWUmVkaXIiLCAgIDB4MDQ4MSwgTlVMTCwgTlVMTCB9LAorICAgIHsgIlZCcm93c2UiLCAgMHgwNDgyLCBOVUxMLCBOVUxMIH0sCisgICAgeyAiVlNIQVJFIiwgICAweDA0ODMsIE5VTEwsIE5VTEwgfSwKKyAgICB7ICJJRlNNZ3IiLCAgIDB4MDQ4NCwgTlVMTCwgTlVMTCB9LAorICAgIHsgIk1FTVBST0JFIiwgMHgwNDg1LCBOVUxMLCBOVUxMIH0sCisgICAgeyAiVkZBVCIsICAgICAweDA0ODYsIE5VTEwsIE5VTEwgfSwKKyAgICB7ICJOV0xJTksiLCAgIDB4MDQ4NywgTlVMTCwgTlVMTCB9LAorICAgIHsgIlZOV0xJTksiLCAgMHgwNDg3LCBOVUxMLCBOVUxMIH0sCisgICAgeyAiTldTVVAiLCAgICAweDA0ODcsIE5VTEwsIE5VTEwgfSwKKyAgICB7ICJWVERJIiwgICAgIDB4MDQ4OCwgTlVMTCwgTlVMTCB9LAorICAgIHsgIlZJUCIsICAgICAgMHgwNDg5LCBOVUxMLCBOVUxMIH0sCisgICAgeyAiVlRDUCIsICAgICAweDA0OEEsIE5VTEwsIE5VTEwgfSwKKyAgICB7ICJWQ2FjaGUiLCAgIDB4MDQ4QiwgTlVMTCwgTlVMTCB9LAorICAgIHsgIlZVRFAiLCAgICAgMHgwNDhDLCBOVUxMLCBOVUxMIH0sCisgICAgeyAiVkFzeW5jIiwgICAweDA0OEQsIE5VTEwsIE5VTEwgfSwKKyAgICB7ICJOV1JFRElSIiwgIDB4MDQ4RSwgTlVMTCwgTlVMTCB9LAorICAgIHsgIlNUQVQ4MCIsICAgMHgwNDhGLCBOVUxMLCBOVUxMIH0sCisgICAgeyAiU0NTSVBPUlQiLCAweDA0OTAsIE5VTEwsIE5VTEwgfSwKKyAgICB7ICJGSUxFU0VDIiwgIDB4MDQ5MSwgTlVMTCwgTlVMTCB9LAorICAgIHsgIk5XU0VSVkVSIiwgMHgwNDkyLCBOVUxMLCBOVUxMIH0sCisgICAgeyAiU0VDUFJPViIsICAweDA0OTMsIE5VTEwsIE5VTEwgfSwKKyAgICB7ICJOU0NMIiwgICAgIDB4MDQ5NCwgTlVMTCwgTlVMTCB9LAorICAgIHsgIldTVENQIiwgICAgMHgwNDk1LCBOVUxMLCBOVUxMIH0sCisgICAgeyAiTkRJUzJTVVAiLCAweDA0OTYsIE5VTEwsIE5VTEwgfSwKKyAgICB7ICJNU09ESVNVUCIsIDB4MDQ5NywgTlVMTCwgTlVMTCB9LAorICAgIHsgIlNwbGl0dGVyIiwgMHgwNDk4LCBOVUxMLCBOVUxMIH0sCisgICAgeyAiUFBQIiwgICAgICAweDA0OTksIE5VTEwsIE5VTEwgfSwKKyAgICB7ICJWREhDUCIsICAgIDB4MDQ5QSwgTlVMTCwgTlVMTCB9LAorICAgIHsgIlZOQlQiLCAgICAgMHgwNDlCLCBOVUxMLCBOVUxMIH0sCisgICAgeyAiTE9HR0VSIiwgICAweDA0OUQsIE5VTEwsIE5VTEwgfSwKKyAgICB7ICJFRklMVEVSIiwgIDB4MDQ5RSwgTlVMTCwgTlVMTCB9LAorICAgIHsgIkZGSUxURVIiLCAgMHgwNDlGLCBOVUxMLCBOVUxMIH0sCisgICAgeyAiVEZJTFRFUiIsICAweDA0QTAsIE5VTEwsIE5VTEwgfSwKKyAgICB7ICJBRklMVEVSIiwgIDB4MDRBMSwgTlVMTCwgTlVMTCB9LAorICAgIHsgIklSTEFNUCIsICAgMHgwNEEyLCBOVUxMLCBOVUxMIH0sCisKKyAgICB7IE5VTEwsICAgICAgIDAsICAgICAgTlVMTCwgTlVMTCB9Cit9OworCisvKgorICogVk1NIFZ4RENhbGwgc2VydmljZSBuYW1lcyBhcmUgKG1vc3RseSkgdGFrZW4gZnJvbSBTdGFuIE1pdGNoZWxsJ3MKKyAqICJJbnNpZGUgdGhlIFdpbmRvd3MgOTUgRmlsZSBTeXN0ZW0iCisgKi8KKworI2RlZmluZSBOX1ZNTV9TRVJWSUNFIDQxCisKK0xQQ1NUUiBWTU1fU2VydmljZV9OYW1lW05fVk1NX1NFUlZJQ0VdID0KK3sgCisgICAgIlBhZ2VSZXNlcnZlIiwgICAgICAgICAgICAvKiAweDAwMDAgKi8KKyAgICAiUGFnZUNvbW1pdCIsICAgICAgICAgICAgIC8qIDB4MDAwMSAqLworICAgICJQYWdlRGVjb21taXQiLCAgICAgICAgICAgLyogMHgwMDAyICovCisgICAgIlBhZ2VyUmVnaXN0ZXIiLCAgICAgICAgICAvKiAweDAwMDMgKi8KKyAgICAiUGFnZXJRdWVyeSIsICAgICAgICAgICAgIC8qIDB4MDAwNCAqLworICAgICJIZWFwQWxsb2NhdGUiLCAgICAgICAgICAgLyogMHgwMDA1ICovCisgICAgIkNvbnRleHRDcmVhdGUiLCAgICAgICAgICAvKiAweDAwMDYgKi8KKyAgICAiQ29udGV4dERlc3Ryb3kiLCAgICAgICAgIC8qIDB4MDAwNyAqLworICAgICJQYWdlQXR0YWNoIiwgICAgICAgICAgICAgLyogMHgwMDA4ICovCisgICAgIlBhZ2VGbHVzaCIsICAgICAgICAgICAgICAvKiAweDAwMDkgKi8KKyAgICAiUGFnZUZyZWUiLCAgICAgICAgICAgICAgIC8qIDB4MDAwQSAqLworICAgICJDb250ZXh0U3dpdGNoIiwgICAgICAgICAgLyogMHgwMDBCICovCisgICAgIkhlYXBSZUFsbG9jYXRlIiwgICAgICAgICAvKiAweDAwMEMgKi8KKyAgICAiUGFnZU1vZGlmeVBlcm0iLCAgICAgICAgIC8qIDB4MDAwRCAqLworICAgICJQYWdlUXVlcnkiLCAgICAgICAgICAgICAgLyogMHgwMDBFICovCisgICAgIkdldEN1cnJlbnRDb250ZXh0IiwgICAgICAvKiAweDAwMEYgKi8KKyAgICAiSGVhcEZyZWUiLCAgICAgICAgICAgICAgIC8qIDB4MDAxMCAqLworICAgICJSZWdPcGVuS2V5IiwgICAgICAgICAgICAgLyogMHgwMDExICovCisgICAgIlJlZ0NyZWF0ZUtleSIsICAgICAgICAgICAvKiAweDAwMTIgKi8KKyAgICAiUmVnQ2xvc2VLZXkiLCAgICAgICAgICAgIC8qIDB4MDAxMyAqLworICAgICJSZWdEZWxldGVLZXkiLCAgICAgICAgICAgLyogMHgwMDE0ICovCisgICAgIlJlZ1NldFZhbHVlIiwgICAgICAgICAgICAvKiAweDAwMTUgKi8KKyAgICAiUmVnRGVsZXRlVmFsdWUiLCAgICAgICAgIC8qIDB4MDAxNiAqLworICAgICJSZWdRdWVyeVZhbHVlIiwgICAgICAgICAgLyogMHgwMDE3ICovCisgICAgIlJlZ0VudW1LZXkiLCAgICAgICAgICAgICAvKiAweDAwMTggKi8KKyAgICAiUmVnRW51bVZhbHVlIiwgICAgICAgICAgIC8qIDB4MDAxOSAqLworICAgICJSZWdRdWVyeVZhbHVlRXgiLCAgICAgICAgLyogMHgwMDFBICovCisgICAgIlJlZ1NldFZhbHVlRXgiLCAgICAgICAgICAvKiAweDAwMUIgKi8KKyAgICAiUmVnRmx1c2hLZXkiLCAgICAgICAgICAgIC8qIDB4MDAxQyAqLworICAgICJSZWdRdWVyeUluZm9LZXkiLCAgICAgICAgLyogMHgwMDFEICovCisgICAgIkdldERlbWFuZFBhZ2VJbmZvIiwgICAgICAvKiAweDAwMUUgKi8KKyAgICAiQmxvY2tPbklEIiwgICAgICAgICAgICAgIC8qIDB4MDAxRiAqLworICAgICJTaWduYWxJRCIsICAgICAgICAgICAgICAgLyogMHgwMDIwICovCisgICAgIlJlZ0xvYWRLZXkiLCAgICAgICAgICAgICAvKiAweDAwMjEgKi8KKyAgICAiUmVnVW5Mb2FkS2V5IiwgICAgICAgICAgIC8qIDB4MDAyMiAqLworICAgICJSZWdTYXZlS2V5IiwgICAgICAgICAgICAgLyogMHgwMDIzICovCisgICAgIlJlZ1JlbWFwUHJlRGVmS2V5IiwgICAgICAvKiAweDAwMjQgKi8KKyAgICAiUGFnZUNoYW5nZVBhZ2VyIiwgICAgICAgIC8qIDB4MDAyNSAqLworICAgICJSZWdRdWVyeU11bHRpcGxlVmFsdWVzIiwgLyogMHgwMDI2ICovCisgICAgIlJlZ1JlcGxhY2VLZXkiLCAgICAgICAgICAvKiAweDAwMjcgKi8KKyAgICAiPEtFUk5FTDMyLjEwMT4iICAgICAgICAgIC8qIDB4MDAyOCAtLSBXaGF0IGRvZXMgdGhpcyBkbz8/PyAqLworfTsKKworCisKK0hBTkRMRTMyIERFVklDRV9PcGVuKExQQ1NUUiBmaWxlbmFtZSwgRFdPUkQgYWNjZXNzKSAKK3sKKwlERVZJQ0VfT0JKRUNUICpkZXY7CisJSEFORExFMzIgaGFuZGxlOworCWludCBpOworCisJZGV2ID0gSGVhcEFsbG9jKCBTeXN0ZW1IZWFwLCAwLCBzaXplb2YoREVWSUNFX09CSkVDVCkgKTsKKwlpZiAoIWRldikgcmV0dXJuIElOVkFMSURfSEFORExFX1ZBTFVFMzI7CisKIAlkZXYtPmhlYWRlci50eXBlID0gSzMyT0JKX0RFVklDRV9JT0NUTDsKLQlkZXYtPmhlYWRlci5yZWZjb3VudCA9IDA7CisJZGV2LT5oZWFkZXIucmVmY291bnQgPSAxOwogCWRldi0+bW9kZQk9IGFjY2VzczsKIAlkZXYtPmRldm5hbWUJPSBIRUFQX3N0cmR1cEEoU3lzdGVtSGVhcCwwLGZpbGVuYW1lKTsKKwlkZXYtPmluZm8gICAgICAgPSBOVUxMOworCisJZm9yIChpID0gMDsgVnhETGlzdFtpXS5uYW1lOyBpKyspCisJICAgIGlmICghbHN0cmNtcGkzMkEoVnhETGlzdFtpXS5uYW1lLCBmaWxlbmFtZSkpCisJICAgICAgICBicmVhazsKKwlpZiAoVnhETGlzdFtpXS5uYW1lKQorCSAgICBkZXYtPmluZm8gPSBWeERMaXN0ICsgaTsKKwllbHNlCisJICAgIEZJWE1FKHdpbjMyLCAiVW5rbm93biBWeEQgJXNcbiIsIGZpbGVuYW1lKTsKKwogCiAJaGFuZGxlID0gSEFORExFX0FsbG9jKCBQUk9DRVNTX0N1cnJlbnQoKSwgJihkZXYtPmhlYWRlciksCiAJCQkgICAgICAgRklMRV9BTExfQUNDRVNTIHwgR0VORVJJQ19SRUFEIHwKQEAgLTY1LDkgKzI4NiwxOSBAQAogCXJldHVybiBoYW5kbGU7CiB9CiAKLXZvaWQKLURFVklDRV9EZXN0cm95KEszMk9CSiAqZGV2KSB7Ci0JYXNzZXJ0KGRldi0+dHlwZSA9PSBLMzJPQkpfREVWSUNFX0lPQ1RMKTsKK3N0YXRpYyB2b2lkIERFVklDRV9EZXN0cm95KEszMk9CSiAqb2JqKSAKK3sKKyAgICBERVZJQ0VfT0JKRUNUICpkZXYgPSAoREVWSUNFX09CSkVDVCAqKW9iajsKKyAgICBhc3NlcnQoIG9iai0+dHlwZSA9PSBLMzJPQkpfREVWSUNFX0lPQ1RMICk7CisKKyAgICBpZiAoIGRldi0+ZGV2bmFtZSApCisgICAgeworICAgICAgICBIZWFwRnJlZSggU3lzdGVtSGVhcCwgMCwgZGV2LT5kZXZuYW1lICk7CisgICAgICAgIGRldi0+ZGV2bmFtZSA9IE5VTEw7CisgICAgfQorCisgICAgb2JqLT50eXBlID0gSzMyT0JKX1VOS05PV047CisgICAgSGVhcEZyZWUoIFN5c3RlbUhlYXAsIDAsIGRldiApOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtODAsNyArMzExLDcgQEAKICAqIEdldExhc3RFcnJvciBjYW4gZGVjeXBoZXIuCiAgKi8KIEJPT0wzMiBXSU5BUEkgRGV2aWNlSW9Db250cm9sKEhBTkRMRTMyIGhEZXZpY2UsIERXT1JEIGR3SW9Db250cm9sQ29kZSwgCi0JCQkgICAgICBMUFZPSUQgbHB2bG5CdWZmZXIsIERXT1JEIGNibG5CdWZmZXIsCisJCQkgICAgICBMUFZPSUQgbHB2SW5CdWZmZXIsIERXT1JEIGNiSW5CdWZmZXIsCiAJCQkgICAgICBMUFZPSUQgbHB2T3V0QnVmZmVyLCBEV09SRCBjYk91dEJ1ZmZlciwKIAkJCSAgICAgIExQRFdPUkQgbHBjYkJ5dGVzUmV0dXJuZWQsCiAJCQkgICAgICBMUE9WRVJMQVBQRUQgbHBPdmVybGFwcGVkKQpAQCAtODgsOCArMzE5LDggQEAKIAlERVZJQ0VfT0JKRUNUCSpkZXYgPSAoREVWSUNFX09CSkVDVCAqKUhBTkRMRV9HZXRPYmpQdHIoCiAJCVBST0NFU1NfQ3VycmVudCgpLCBoRGV2aWNlLCBLMzJPQkpfREVWSUNFX0lPQ1RMLCAwIC8qRklYTUUqLywgTlVMTCApOwogCi0gICAgICAgIEZJWE1FKHdpbjMyLCAiKCVsZCwlbGQsJXAsJWxkLCVwLCVsZCwlcCwlcCksIHN0dWJcbiIsCi0JCWhEZXZpY2UsZHdJb0NvbnRyb2xDb2RlLGxwdmxuQnVmZmVyLGNibG5CdWZmZXIsCisgICAgICAgIFRSQUNFKHdpbjMyLCAiKCVkLCVsZCwlcCwlbGQsJXAsJWxkLCVwLCVwKVxuIiwKKwkJaERldmljZSxkd0lvQ29udHJvbENvZGUsbHB2SW5CdWZmZXIsY2JJbkJ1ZmZlciwKIAkJbHB2T3V0QnVmZmVyLGNiT3V0QnVmZmVyLGxwY2JCeXRlc1JldHVybmVkLGxwT3ZlcmxhcHBlZAogCSk7CiAKQEAgLTEwMiwyMyArMzMzLDE1IEBACiAJLyogQ2hlY2sgaWYgdGhpcyBpcyBhIHVzZXIgZGVmaW5lZCBjb250cm9sIGNvZGUgZm9yIGEgVnhEICovCiAgICAgICAgIGlmKCBISVdPUkQoIGR3SW9Db250cm9sQ29kZSApID09IDAgKQogICAgICAgICB7CisJICAgIGlmICggZGV2LT5pbmZvICYmIGRldi0+aW5mby0+ZGV2aWNlaW8gKQorCSAgICAgICAgcmV0dXJuIGRldi0+aW5mby0+ZGV2aWNlaW8oIGRldiwgZHdJb0NvbnRyb2xDb2RlLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHB2SW5CdWZmZXIsIGNiSW5CdWZmZXIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBscHZPdXRCdWZmZXIsIGNiT3V0QnVmZmVyLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHBjYkJ5dGVzUmV0dXJuZWQsIGxwT3ZlcmxhcHBlZCApOworCiAJICAgIC8qIEZJWE1FOiBTZXQgYXBwcm9wcmlhdGUgZXJyb3IgKi8KLQkgICAgRklYTUUod2luMzIsIiBWeEQgZGV2aWNlICVzIG1zZ1xuIixkZXYtPmRldm5hbWUpOwotIAotCSAgICBpZiAoIXN0cmNtcChkZXYtPmRldm5hbWUsIlZUREFQSSIpKQotICAgICAgICAgICAgewotCQlzd2l0Y2ggKGR3SW9Db250cm9sQ29kZSkKLSAgICAgICAgICAgICAgICB7Ci0JCWNhc2UgNToJaWYgKGxwdk91dEJ1ZmZlciAmJiAoY2JPdXRCdWZmZXI+PTQpKQotCQkJCSooRFdPUkQqKWxwdk91dEJ1ZmZlciA9IHRpbWVHZXRUaW1lKCk7Ci0JCQlpZiAobHBjYkJ5dGVzUmV0dXJuZWQpCi0JCQkJKmxwY2JCeXRlc1JldHVybmVkID0gNDsKLQkJCXJldHVybiBUUlVFOwotCQlkZWZhdWx0OgotCQkJYnJlYWs7Ci0JCX0KLQkKLSAgICAgICAgICAgfQorCSAgICBGSVhNRSggd2luMzIsICJVbmltcGxlbWVudGVkIGNvbnRyb2wgJWxkIGZvciBWeEQgZGV2aWNlICVzXG4iLCAKKwkgICAgICAgICAgICAgICAgICBkd0lvQ29udHJvbENvZGUsIGRldi0+ZGV2bmFtZSApOwogCX0KIAllbHNlCiAJewpAQCAtMTY4LDMgKzM5MSwyOTcgQEAKIAl9CiAgICAJcmV0dXJuIEZBTFNFOwogfQorIAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgRGV2aWNlSW9fVlREQVBJCisgKi8KK3N0YXRpYyBCT09MMzIgRGV2aWNlSW9fVlREQVBJKERFVklDRV9PQkpFQ1QgKmRldiwgRFdPUkQgZHdJb0NvbnRyb2xDb2RlLCAKKwkJCSAgICAgIExQVk9JRCBscHZJbkJ1ZmZlciwgRFdPUkQgY2JJbkJ1ZmZlciwKKwkJCSAgICAgIExQVk9JRCBscHZPdXRCdWZmZXIsIERXT1JEIGNiT3V0QnVmZmVyLAorCQkJICAgICAgTFBEV09SRCBscGNiQnl0ZXNSZXR1cm5lZCwKKwkJCSAgICAgIExQT1ZFUkxBUFBFRCBscE92ZXJsYXBwZWQpCit7CisgICAgQk9PTDMyIHJldHYgPSBUUlVFOworCisgICAgc3dpdGNoIChkd0lvQ29udHJvbENvZGUpCisgICAgeworICAgIGNhc2UgNToKKyAgICAgICAgaWYgKGxwdk91dEJ1ZmZlciAmJiAoY2JPdXRCdWZmZXI+PTQpKQorICAgICAgICAgICAgKihEV09SRCopbHB2T3V0QnVmZmVyID0gdGltZUdldFRpbWUoKTsKKworICAgICAgICBpZiAobHBjYkJ5dGVzUmV0dXJuZWQpCisgICAgICAgICAgICAqbHBjYkJ5dGVzUmV0dXJuZWQgPSA0OworCisgICAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgICAgRklYTUUod2luMzIsICJDb250cm9sICVsZCBub3QgaW1wbGVtZW50ZWRcbiIsIGR3SW9Db250cm9sQ29kZSk7CisgICAgICAgIHJldHYgPSBGQUxTRTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIHJldHY7Cit9CisKKworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgVnhEQ2FsbCAgICAgICAgICAgICAgICAgICAoS0VSTkVMMzIuWzEtOV0pCisgKi8KK3N0YXRpYyB2b2lkIFZ4RENhbGwoIENPTlRFWFQgKmNvbnRleHQsIGludCBuQXJncyApCit7CisgICAgRFdPUkQgcmV0diwgc2VydmljZTsKKyAgICBpbnQgaSwgb2sgPSBGQUxTRTsKKworICAgIC8qIFBvcCByZXR1cm4gYWRkcmVzcyB0byBjYWxsZXIgKi8KKyAgICBFSVBfcmVnKGNvbnRleHQpID0gU1RBQ0szMl9QT1AoY29udGV4dCk7CisKKyAgICAvKiBQb3AgcmVxdWVzdGVkIHNlcnZpY2UgSUQgKi8KKyAgICBzZXJ2aWNlID0gU1RBQ0szMl9QT1AoY29udGV4dCk7CisKKyAgICBUUkFDRSh3aW4zMiwgIiglMDhseCwgLi4uKVxuIiwgc2VydmljZSk7CisKKyAgICBmb3IgKGkgPSAwOyBWeERMaXN0W2ldLm5hbWU7IGkrKykKKyAgICAgICAgaWYgKFZ4RExpc3RbaV0uaWQgPT0gSElXT1JEKHNlcnZpY2UpKQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICBpZiAoIVZ4RExpc3RbaV0ubmFtZSkKKyAgICAgICAgRklYTUUod2luMzIsICJVbmtub3duIFZ4RCAoJTA4bHgpXG4iLCBzZXJ2aWNlKTsKKyAgICBlbHNlIGlmICghVnhETGlzdFtpXS52eGRjYWxsKQorICAgICAgICBGSVhNRSh3aW4zMiwgIlVuaW1wbGVtZW50ZWQgVnhEICglMDhseClcbiIsIHNlcnZpY2UpOworICAgIGVsc2UKKyAgICAgICAgb2sgPSBWeERMaXN0W2ldLnZ4ZGNhbGwoJnJldHYsIHNlcnZpY2UsIGNvbnRleHQpOworCisgICAgLyogSWYgdW5pbXBsZW1lbnRlZCwgdHJ1c3QgdGhlIGNhbGxlciB0byBoYXZlIGNhbGxlZCB0aGUKKyAgICAgICB2ZXJzaW9uIHdpdGggdGhlIGNvcnJlY3QgbnVtYmVyIG9mIGFyZ3VtZW50cyAqLworICAgIGlmICghb2spCisgICAgeworICAgICAgICBFU1BfcmVnKGNvbnRleHQpICs9IDQgKiBuQXJnczsKKyAgICAgICAgcmV0diA9IDB4ZmZmZmZmZmY7ICAvKiBGSVhNRSAqLworICAgIH0KKworICAgIC8qIFB1c2ggcmV0dXJuIGFkZHJlc3MgYmFjayBvbnRvIHN0YWNrICovCisgICAgU1RBQ0szMl9QVVNIKGNvbnRleHQsIEVJUF9yZWcoY29udGV4dCkpOworCisgICAgLyogUmV0dXJuIHRvIGNhbGxlciAqLworICAgIEVBWF9yZWcoY29udGV4dCkgPSByZXR2OworfQorCitSRUdTX0VOVFJZUE9JTlQoVnhEQ2FsbDApIHsgVnhEQ2FsbCggY29udGV4dCwgMCApOyB9CitSRUdTX0VOVFJZUE9JTlQoVnhEQ2FsbDEpIHsgVnhEQ2FsbCggY29udGV4dCwgMSApOyB9CitSRUdTX0VOVFJZUE9JTlQoVnhEQ2FsbDIpIHsgVnhEQ2FsbCggY29udGV4dCwgMiApOyB9CitSRUdTX0VOVFJZUE9JTlQoVnhEQ2FsbDMpIHsgVnhEQ2FsbCggY29udGV4dCwgMyApOyB9CitSRUdTX0VOVFJZUE9JTlQoVnhEQ2FsbDQpIHsgVnhEQ2FsbCggY29udGV4dCwgNCApOyB9CitSRUdTX0VOVFJZUE9JTlQoVnhEQ2FsbDUpIHsgVnhEQ2FsbCggY29udGV4dCwgNSApOyB9CitSRUdTX0VOVFJZUE9JTlQoVnhEQ2FsbDYpIHsgVnhEQ2FsbCggY29udGV4dCwgNiApOyB9CitSRUdTX0VOVFJZUE9JTlQoVnhEQ2FsbDcpIHsgVnhEQ2FsbCggY29udGV4dCwgNyApOyB9CitSRUdTX0VOVFJZUE9JTlQoVnhEQ2FsbDgpIHsgVnhEQ2FsbCggY29udGV4dCwgOCApOyB9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIFZ4RENhbGxfVk1NCisgKi8KK0JPT0wzMiBWeERDYWxsX1ZNTSggRFdPUkQgKnJldHYsIERXT1JEIHNlcnZpY2UsIENPTlRFWFQgKmNvbnRleHQgKQoreworICAgIEJPT0wzMiBvayA9IFRSVUU7CisKKyAgICBzd2l0Y2ggKCBMT1dPUkQoc2VydmljZSkgKQorICAgIHsKKyAgICBjYXNlIDB4MDAxMTogIC8qIFJlZ09wZW5LZXkgKi8KKyAgICB7CisgICAgICAgIEhLRVkgICAgaGtleSAgICAgICA9IChIS0VZKSAgIFNUQUNLMzJfUE9QKCBjb250ZXh0ICk7CisgICAgICAgIExQQ1NUUiAgbHBzelN1YktleSA9IChMUENTVFIpIFNUQUNLMzJfUE9QKCBjb250ZXh0ICk7CisgICAgICAgIExQSEtFWSAgcmV0a2V5ICAgICA9IChMUEhLRVkpIFNUQUNLMzJfUE9QKCBjb250ZXh0ICk7CisgICAgICAgICpyZXR2ID0gUmVnT3BlbktleTMyQSggaGtleSwgbHBzelN1YktleSwgcmV0a2V5ICk7CisgICAgfQorICAgIGJyZWFrOworCisgICAgY2FzZSAweDAwMTI6ICAvKiBSZWdDcmVhdGVLZXkgKi8KKyAgICB7CisgICAgICAgIEhLRVkgICAgaGtleSAgICAgICA9IChIS0VZKSAgIFNUQUNLMzJfUE9QKCBjb250ZXh0ICk7CisgICAgICAgIExQQ1NUUiAgbHBzelN1YktleSA9IChMUENTVFIpIFNUQUNLMzJfUE9QKCBjb250ZXh0ICk7CisgICAgICAgIExQSEtFWSAgcmV0a2V5ICAgICA9IChMUEhLRVkpIFNUQUNLMzJfUE9QKCBjb250ZXh0ICk7CisgICAgICAgICpyZXR2ID0gUmVnQ3JlYXRlS2V5MzJBKCBoa2V5LCBscHN6U3ViS2V5LCByZXRrZXkgKTsKKyAgICB9CisgICAgYnJlYWs7CisKKyAgICBjYXNlIDB4MDAxMzogIC8qIFJlZ0Nsb3NlS2V5ICovCisgICAgeworICAgICAgICBIS0VZICAgIGhrZXkgICAgICAgPSAoSEtFWSkgICBTVEFDSzMyX1BPUCggY29udGV4dCApOworICAgICAgICAqcmV0diA9IFJlZ0Nsb3NlS2V5KCBoa2V5ICk7CisgICAgfQorICAgIGJyZWFrOworCisgICAgY2FzZSAweDAwMTQ6ICAvKiBSZWdEZWxldGVLZXkgKi8KKyAgICB7CisgICAgICAgIEhLRVkgICAgaGtleSAgICAgICA9IChIS0VZKSAgIFNUQUNLMzJfUE9QKCBjb250ZXh0ICk7CisgICAgICAgIExQQ1NUUiAgbHBzelN1YktleSA9IChMUENTVFIpIFNUQUNLMzJfUE9QKCBjb250ZXh0ICk7CisgICAgICAgICpyZXR2ID0gUmVnRGVsZXRlS2V5MzJBKCBoa2V5LCBscHN6U3ViS2V5ICk7CisgICAgfQorICAgIGJyZWFrOworCisgICAgY2FzZSAweDAwMTU6ICAvKiBSZWdTZXRWYWx1ZSAqLworICAgIHsKKyAgICAgICAgSEtFWSAgICBoa2V5ICAgICAgID0gKEhLRVkpICAgU1RBQ0szMl9QT1AoIGNvbnRleHQgKTsKKyAgICAgICAgTFBDU1RSICBscHN6U3ViS2V5ID0gKExQQ1NUUikgU1RBQ0szMl9QT1AoIGNvbnRleHQgKTsKKyAgICAgICAgRFdPUkQgICBkd1R5cGUgICAgID0gKERXT1JEKSAgU1RBQ0szMl9QT1AoIGNvbnRleHQgKTsKKyAgICAgICAgTFBDU1RSICBscHN6RGF0YSAgID0gKExQQ1NUUikgU1RBQ0szMl9QT1AoIGNvbnRleHQgKTsKKyAgICAgICAgRFdPUkQgICBjYkRhdGEgICAgID0gKERXT1JEKSAgU1RBQ0szMl9QT1AoIGNvbnRleHQgKTsKKyAgICAgICAgKnJldHYgPSBSZWdTZXRWYWx1ZTMyQSggaGtleSwgbHBzelN1YktleSwgZHdUeXBlLCBscHN6RGF0YSwgY2JEYXRhICk7CisgICAgfQorICAgIGJyZWFrOworCisgICAgY2FzZSAweDAwMTY6ICAvKiBSZWdEZWxldGVWYWx1ZSAqLworICAgIHsKKyAgICAgICAgSEtFWSAgICBoa2V5ICAgICAgID0gKEhLRVkpICAgU1RBQ0szMl9QT1AoIGNvbnRleHQgKTsKKyAgICAgICAgTFBTVFIgICBscHN6VmFsdWUgID0gKExQU1RSKSAgU1RBQ0szMl9QT1AoIGNvbnRleHQgKTsKKyAgICAgICAgKnJldHYgPSBSZWdEZWxldGVWYWx1ZTMyQSggaGtleSwgbHBzelZhbHVlICk7CisgICAgfQorICAgIGJyZWFrOworCisgICAgY2FzZSAweDAwMTc6ICAvKiBSZWdRdWVyeVZhbHVlICovCisgICAgeworICAgICAgICBIS0VZICAgIGhrZXkgICAgICAgPSAoSEtFWSkgICBTVEFDSzMyX1BPUCggY29udGV4dCApOworICAgICAgICBMUFNUUiAgIGxwc3pTdWJLZXkgPSAoTFBTVFIpICBTVEFDSzMyX1BPUCggY29udGV4dCApOworICAgICAgICBMUFNUUiAgIGxwc3pEYXRhICAgPSAoTFBTVFIpICBTVEFDSzMyX1BPUCggY29udGV4dCApOworICAgICAgICBMUERXT1JEIGxwY2JEYXRhICAgPSAoTFBEV09SRClTVEFDSzMyX1BPUCggY29udGV4dCApOworICAgICAgICAqcmV0diA9IFJlZ1F1ZXJ5VmFsdWUzMkEoIGhrZXksIGxwc3pTdWJLZXksIGxwc3pEYXRhLCBscGNiRGF0YSApOworICAgIH0KKyAgICBicmVhazsKKworICAgIGNhc2UgMHgwMDE4OiAgLyogUmVnRW51bUtleSAqLworICAgIHsKKyAgICAgICAgSEtFWSAgICBoa2V5ICAgICAgID0gKEhLRVkpICAgU1RBQ0szMl9QT1AoIGNvbnRleHQgKTsKKyAgICAgICAgRFdPUkQgICBpU3Via2V5ICAgID0gKERXT1JEKSAgU1RBQ0szMl9QT1AoIGNvbnRleHQgKTsKKyAgICAgICAgTFBTVFIgICBscHN6TmFtZSAgID0gKExQU1RSKSAgU1RBQ0szMl9QT1AoIGNvbnRleHQgKTsKKyAgICAgICAgRFdPUkQgICBscGNjaE5hbWUgID0gKERXT1JEKSAgU1RBQ0szMl9QT1AoIGNvbnRleHQgKTsKKyAgICAgICAgKnJldHYgPSBSZWdFbnVtS2V5MzJBKCBoa2V5LCBpU3Via2V5LCBscHN6TmFtZSwgbHBjY2hOYW1lICk7CisgICAgfQorICAgIGJyZWFrOworCisgICAgY2FzZSAweDAwMTk6ICAvKiBSZWdFbnVtVmFsdWUgKi8KKyAgICB7CisgICAgICAgIEhLRVkgICAgaGtleSAgICAgICA9IChIS0VZKSAgIFNUQUNLMzJfUE9QKCBjb250ZXh0ICk7CisgICAgICAgIERXT1JEICAgaVZhbHVlICAgICA9IChEV09SRCkgIFNUQUNLMzJfUE9QKCBjb250ZXh0ICk7CisgICAgICAgIExQU1RSICAgbHBzelZhbHVlICA9IChMUFNUUikgIFNUQUNLMzJfUE9QKCBjb250ZXh0ICk7CisgICAgICAgIExQRFdPUkQgbHBjY2hWYWx1ZSA9IChMUERXT1JEKVNUQUNLMzJfUE9QKCBjb250ZXh0ICk7CisgICAgICAgIExQRFdPUkQgbHBSZXNlcnZlZCA9IChMUERXT1JEKVNUQUNLMzJfUE9QKCBjb250ZXh0ICk7CisgICAgICAgIExQRFdPUkQgbHBkd1R5cGUgICA9IChMUERXT1JEKVNUQUNLMzJfUE9QKCBjb250ZXh0ICk7CisgICAgICAgIExQQllURSAgbHBiRGF0YSAgICA9IChMUEJZVEUpIFNUQUNLMzJfUE9QKCBjb250ZXh0ICk7CisgICAgICAgIExQRFdPUkQgbHBjYkRhdGEgICA9IChMUERXT1JEKVNUQUNLMzJfUE9QKCBjb250ZXh0ICk7CisgICAgICAgICpyZXR2ID0gUmVnRW51bVZhbHVlMzJBKCBoa2V5LCBpVmFsdWUsIGxwc3pWYWx1ZSwgbHBjY2hWYWx1ZSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBscFJlc2VydmVkLCBscGR3VHlwZSwgbHBiRGF0YSwgbHBjYkRhdGEgKTsKKyAgICB9CisgICAgYnJlYWs7CisKKyAgICBjYXNlIDB4MDAxQTogIC8qIFJlZ1F1ZXJ5VmFsdWVFeCAqLworICAgIHsKKyAgICAgICAgSEtFWSAgICBoa2V5ICAgICAgID0gKEhLRVkpICAgU1RBQ0szMl9QT1AoIGNvbnRleHQgKTsKKyAgICAgICAgTFBTVFIgICBscHN6VmFsdWUgID0gKExQU1RSKSAgU1RBQ0szMl9QT1AoIGNvbnRleHQgKTsKKyAgICAgICAgTFBEV09SRCBscFJlc2VydmVkID0gKExQRFdPUkQpU1RBQ0szMl9QT1AoIGNvbnRleHQgKTsKKyAgICAgICAgTFBEV09SRCBscGR3VHlwZSAgID0gKExQRFdPUkQpU1RBQ0szMl9QT1AoIGNvbnRleHQgKTsKKyAgICAgICAgTFBCWVRFICBscGJEYXRhICAgID0gKExQQllURSkgU1RBQ0szMl9QT1AoIGNvbnRleHQgKTsKKyAgICAgICAgTFBEV09SRCBscGNiRGF0YSAgID0gKExQRFdPUkQpU1RBQ0szMl9QT1AoIGNvbnRleHQgKTsKKyAgICAgICAgKnJldHYgPSBSZWdRdWVyeVZhbHVlRXgzMkEoIGhrZXksIGxwc3pWYWx1ZSwgbHBSZXNlcnZlZCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBscGR3VHlwZSwgbHBiRGF0YSwgbHBjYkRhdGEgKTsKKyAgICB9CisgICAgYnJlYWs7CisKKyAgICBjYXNlIDB4MDAxQjogIC8qIFJlZ1NldFZhbHVlRXggKi8KKyAgICB7CisgICAgICAgIEhLRVkgICAgaGtleSAgICAgICA9IChIS0VZKSAgIFNUQUNLMzJfUE9QKCBjb250ZXh0ICk7CisgICAgICAgIExQU1RSICAgbHBzelZhbHVlICA9IChMUFNUUikgIFNUQUNLMzJfUE9QKCBjb250ZXh0ICk7CisgICAgICAgIERXT1JEICAgZHdSZXNlcnZlZCA9IChEV09SRCkgIFNUQUNLMzJfUE9QKCBjb250ZXh0ICk7CisgICAgICAgIERXT1JEICAgZHdUeXBlICAgICA9IChEV09SRCkgIFNUQUNLMzJfUE9QKCBjb250ZXh0ICk7CisgICAgICAgIExQQllURSAgbHBiRGF0YSAgICA9IChMUEJZVEUpIFNUQUNLMzJfUE9QKCBjb250ZXh0ICk7CisgICAgICAgIERXT1JEICAgY2JEYXRhICAgICA9IChEV09SRClTVEFDSzMyX1BPUCggY29udGV4dCApOworICAgICAgICAqcmV0diA9IFJlZ1NldFZhbHVlRXgzMkEoIGhrZXksIGxwc3pWYWx1ZSwgZHdSZXNlcnZlZCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHdUeXBlLCBscGJEYXRhLCBjYkRhdGEgKTsKKyAgICB9CisgICAgYnJlYWs7CisKKyAgICBjYXNlIDB4MDAxQzogIC8qIFJlZ0ZsdXNoS2V5ICovCisgICAgeworICAgICAgICBIS0VZICAgIGhrZXkgICAgICAgPSAoSEtFWSkgICBTVEFDSzMyX1BPUCggY29udGV4dCApOworICAgICAgICAqcmV0diA9IFJlZ0ZsdXNoS2V5KCBoa2V5ICk7CisgICAgfQorICAgIGJyZWFrOworCisgICAgY2FzZSAweDAwMUQ6ICAvKiBSZWdRdWVyeUluZm9LZXkgKi8KKyAgICB7CisgICAgICAgIC8qIE5PVEU6IFRoaXMgVnhEQ2FsbCB0YWtlcyBvbmx5IGEgc3Vic2V0IG9mIHRoZSBwYXJhbWV0ZXJzIHRoYXQgdGhlCisgICAgICAgICAgICAgICAgIGNvcnJlc3BvbmRpbmcgV2luMzIgQVBJIGNhbGwgZG9lcy4gVGhlIGltcGxlbWVudGF0aW9uIGluIFdpbjk1CisgICAgICAgICAgICAgICAgIEFEVkFQSTMyIHNldHMgYWxsIG91dHB1dCBwYXJhbWV0ZXJzIG5vdCBtZW50aW9uZWQgaGVyZSB0byB6ZXJvLiAqLworCisgICAgICAgIEhLRVkgICAgaGtleSAgICAgICA9IChIS0VZKSAgIFNUQUNLMzJfUE9QKCBjb250ZXh0ICk7CisgICAgICAgIExQRFdPUkQgbHBjU3ViS2V5cyA9IChMUERXT1JEKVNUQUNLMzJfUE9QKCBjb250ZXh0ICk7CisgICAgICAgIExQRFdPUkQgbHBjY2hNYXhTdWJLZXkgCisgICAgICAgICAgICAgICAgICAgICAgICAgICA9IChMUERXT1JEKVNUQUNLMzJfUE9QKCBjb250ZXh0ICk7CisgICAgICAgIExQRFdPUkQgbHBjVmFsdWVzICA9IChMUERXT1JEKVNUQUNLMzJfUE9QKCBjb250ZXh0ICk7CisgICAgICAgIExQRFdPUkQgbHBjY2hNYXhWYWx1ZU5hbWUgCisgICAgICAgICAgICAgICAgICAgICAgICAgICA9IChMUERXT1JEKVNUQUNLMzJfUE9QKCBjb250ZXh0ICk7CisgICAgICAgIExQRFdPUkQgbHBjY2hNYXhWYWx1ZURhdGEgCisgICAgICAgICAgICAgICAgICAgICAgICAgICA9IChMUERXT1JEKVNUQUNLMzJfUE9QKCBjb250ZXh0ICk7CisgICAgICAgICpyZXR2ID0gUmVnUXVlcnlJbmZvS2V5MzJBKCBoa2V5LCBOVUxMLCBOVUxMLCBOVUxMLCBscGNTdWJLZXlzLCBscGNjaE1heFN1YktleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIGxwY1ZhbHVlcywgbHBjY2hNYXhWYWx1ZU5hbWUsIGxwY2NoTWF4VmFsdWVEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCApOworICAgIH0KKyAgICBicmVhazsKKworICAgIGNhc2UgMHgwMDIxOiAgLyogUmVnTG9hZEtleSAqLworICAgIHsKKyAgICAgICAgSEtFWSAgICBoa2V5ICAgICAgID0gKEhLRVkpICAgU1RBQ0szMl9QT1AoIGNvbnRleHQgKTsKKyAgICAgICAgTFBDU1RSICBscHN6U3ViS2V5ID0gKExQQ1NUUikgU1RBQ0szMl9QT1AoIGNvbnRleHQgKTsKKyAgICAgICAgTFBDU1RSICBscHN6RmlsZSAgID0gKExQQ1NUUikgU1RBQ0szMl9QT1AoIGNvbnRleHQgKTsKKyAgICAgICAgKnJldHYgPSBSZWdMb2FkS2V5MzJBKCBoa2V5LCBscHN6U3ViS2V5LCBscHN6RmlsZSApOworICAgIH0KKyAgICBicmVhazsKKworICAgIGNhc2UgMHgwMDIyOiAgLyogUmVnVW5Mb2FkS2V5ICovCisgICAgeworICAgICAgICBIS0VZICAgIGhrZXkgICAgICAgPSAoSEtFWSkgICBTVEFDSzMyX1BPUCggY29udGV4dCApOworICAgICAgICBMUENTVFIgIGxwc3pTdWJLZXkgPSAoTFBDU1RSKSBTVEFDSzMyX1BPUCggY29udGV4dCApOworICAgICAgICAqcmV0diA9IFJlZ1VuTG9hZEtleTMyQSggaGtleSwgbHBzelN1YktleSApOworICAgIH0KKyAgICBicmVhazsKKworICAgIGNhc2UgMHgwMDIzOiAgLyogUmVnU2F2ZUtleSAqLworICAgIHsKKyAgICAgICAgSEtFWSAgICBoa2V5ICAgICAgID0gKEhLRVkpICAgU1RBQ0szMl9QT1AoIGNvbnRleHQgKTsKKyAgICAgICAgTFBDU1RSICBscHN6RmlsZSAgID0gKExQQ1NUUikgU1RBQ0szMl9QT1AoIGNvbnRleHQgKTsKKyAgICAgICAgTFBTRUNVUklUWV9BVFRSSUJVVEVTIHNhID0gCisgICAgICAgICAgICAgICAoTFBTRUNVUklUWV9BVFRSSUJVVEVTKVNUQUNLMzJfUE9QKCBjb250ZXh0ICk7CisgICAgICAgICpyZXR2ID0gUmVnU2F2ZUtleTMyQSggaGtleSwgbHBzekZpbGUsIHNhICk7CisgICAgfQorICAgIGJyZWFrOworCisjaWYgMCAvKiBGdW5jdGlvbnMgYXJlIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gbWlzYy9yZWdpc3RyeS5jICovCisgICAgY2FzZSAweDAwMjQ6ICAvKiBSZWdSZW1hcFByZURlZktleSAqLworICAgIGNhc2UgMHgwMDI2OiAgLyogUmVnUXVlcnlNdWx0aXBsZVZhbHVlcyAqLworI2VuZGlmCisKKyAgICBjYXNlIDB4MDAyNzogIC8qIFJlZ1JlcGxhY2VLZXkgKi8KKyAgICB7CisgICAgICAgIEhLRVkgICAgaGtleSAgICAgICA9IChIS0VZKSAgIFNUQUNLMzJfUE9QKCBjb250ZXh0ICk7CisgICAgICAgIExQQ1NUUiAgbHBzelN1YktleSA9IChMUENTVFIpIFNUQUNLMzJfUE9QKCBjb250ZXh0ICk7CisgICAgICAgIExQQ1NUUiAgbHBzek5ld0ZpbGU9IChMUENTVFIpIFNUQUNLMzJfUE9QKCBjb250ZXh0ICk7CisgICAgICAgIExQQ1NUUiAgbHBzek9sZEZpbGU9IChMUENTVFIpIFNUQUNLMzJfUE9QKCBjb250ZXh0ICk7CisgICAgICAgICpyZXR2ID0gUmVnUmVwbGFjZUtleTMyQSggaGtleSwgbHBzelN1YktleSwgbHBzek5ld0ZpbGUsIGxwc3pPbGRGaWxlICk7CisgICAgfQorICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgICAgaWYgKExPV09SRChzZXJ2aWNlKSA8IE5fVk1NX1NFUlZJQ0UpCisgICAgICAgICAgICBGSVhNRSh3aW4zMiwgIlVuaW1wbGVtZW50ZWQgc2VydmljZSAlcyAoJTA4bHgpXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICBWTU1fU2VydmljZV9OYW1lW0xPV09SRChzZXJ2aWNlKV0sIHNlcnZpY2UpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBGSVhNRSh3aW4zMiwgIlVua25vd24gc2VydmljZSAlMDhseFxuIiwgc2VydmljZSk7CisKKyAgICAgICAgb2sgPSBGQUxTRTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIG9rOworfQorCmRpZmYgLS1naXQgYS93aW4zMi9maWxlLmMgYi93aW4zMi9maWxlLmMKaW5kZXggZmQxZGUxOC4uYTU5NWQ4NiAxMDA2NDQKLS0tIGEvd2luMzIvZmlsZS5jCisrKyBiL3dpbjMyL2ZpbGUuYwpAQCAtMTM4LDE2ICsxMzgsMTUgQEAKICAgICBpZih0ZW1wbGF0ZSkKICAgICAgICAgRklYTUUoZmlsZSwgInRlbXBsYXRlIGhhbmRsZXMgbm90IHN1cHBvcnRlZC5cbiIpOwogCisgICAgaWYoIWZpbGVuYW1lKQorICAgICAgcmV0dXJuIEhGSUxFX0VSUk9SMzI7CiAgICAgLyogSWYgdGhlIG5hbWUgc3RhcnRzIHdpdGggJ1xcP1wnIG9yICdcXC5cJywgaWdub3JlIHRoZSBmaXJzdCA0IGNoYXJzLgogICAgICAqLwogICAgIGlmKCFzdHJuY21wKGZpbGVuYW1lLCAiXFxcXD9cXCIsIDQpIHx8ICFzdHJuY21wKGZpbGVuYW1lLCAiXFxcXC5cXCIsIDQpKQogICAgIHsKICAgICAgICAgaWYgKGZpbGVuYW1lWzJdID09ICcuJykKLSAgICAgICAgewotICAgICAgICAgICAgRklYTUUoZmlsZSwiZGV2aWNlIG5hbWU/ICVzXG4iLGZpbGVuYW1lKTsKLSAgICAgICAgICAgIC8qIGRldmljZT8gKi8KICAgICAgICAgICAgIHJldHVybiBERVZJQ0VfT3BlbiggZmlsZW5hbWUrNCwgYWNjZXNzX2ZsYWdzIHwgY3JlYXRlX2ZsYWdzICk7Ci0gICAgICAgIH0KKwogICAgICAgICBmaWxlbmFtZSArPSA0OwogCWlmICghc3RybmNtcChmaWxlbmFtZSwgIlVOQyIsIDMpKQogCXsKZGlmZiAtLWdpdCBhL3dpbjMyL2tlcm5lbDMyLmMgYi93aW4zMi9rZXJuZWwzMi5jCmluZGV4IDA4ZWNhMTUuLjFiZTVmOTMgMTAwNjQ0Ci0tLSBhL3dpbjMyL2tlcm5lbDMyLmMKKysrIGIvd2luMzIva2VybmVsMzIuYwpAQCAtMTgsNiArMTgsNyBAQAogI2luY2x1ZGUgInNlbGVjdG9ycy5oIgogI2luY2x1ZGUgInRhc2suaCIKICNpbmNsdWRlICJ3aW4uaCIKKyNpbmNsdWRlICJmaWxlLmgiCiAjaW5jbHVkZSAiZGVidWcuaCIKICNpbmNsdWRlICJmbGF0dGh1bmsuaCIKICNpbmNsdWRlICJzeXNsZXZlbC5oIgpAQCAtMjUyLDYgKzI1Myw3IEBACiAgICAgICAgICAgICAoTFBCWVRFKUVTUF9yZWcoY29udGV4dCkrNCwgYXJnc2l6ZSApOwogCiAgICAgRUFYX3JlZyhjb250ZXh0KSA9IENhbGxiYWNrcy0+Q2FsbFJlZ2lzdGVyU2hvcnRQcm9jKCAmY29udGV4dDE2LCBhcmdzaXplICk7CisgICAgRURYX3JlZyhjb250ZXh0KSA9IEhJV09SRChFQVhfcmVnKGNvbnRleHQpKTsKIH0KIAogCkBAIC0zNzgsNiArMzgwLDcgQEAKIAl9CiAKICAgICBFQVhfcmVnKGNvbnRleHQpID0gQ2FsbGJhY2tzLT5DYWxsUmVnaXN0ZXJTaG9ydFByb2MoICZjb250ZXh0MTYsIGFyZ3NpemUgKTsKKyAgICBFRFhfcmVnKGNvbnRleHQpID0gSElXT1JEKEVBWF9yZWcoY29udGV4dCkpOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtMTA2Niw3ICsxMDY5LDcgQEAKIAlIRklMRTE2IGhmMTYJLyogW2luXSBvcGVuIGZpbGUsIGlmIGZpbGVuYW1lIGlzIE5VTEwgKi8KICkgewogCUlNQUdFX0RPU19IRUFERVIJbXpoOwotCUhGSUxFMzIJCQloZj1oZjE2OworICAgICAgICBIRklMRTMyICAgICAgICAgICAgICAgICBoZj1IRklMRTE2X1RPX0hGSUxFMzIoaGYxNik7CiAJT0ZTVFJVQ1QJCW9mczsKIAlEV09SRAkJCXhtYWdpYzsKIApAQCAtMTIwNSwxMCArMTIwOCwzIEBACiAgICB9CiB9CiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIFZ4RENhbGwJCQkoS0VSTkVMMzIuMS04KQotICovCi1EV09SRCBXSU5BUEkgVnhEQ2FsbChEV09SRCB4KSB7Ci0JRklYTUUodnhkLCIoMHglMDhseCksIHN0dWIhXG4iLHgpOwotCXJldHVybiAweGZmZmZmZmZmOwotfQpkaWZmIC0tZ2l0IGEvd2luMzIvbmV3Zm5zLmMgYi93aW4zMi9uZXdmbnMuYwppbmRleCA2OTNjNWY3Li5jZWQ2YjA2IDEwMDY0NAotLS0gYS93aW4zMi9uZXdmbnMuYworKysgYi93aW4zMi9uZXdmbnMuYwpAQCAtMzYxLDMyICszNjEsNiBAQAogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBTbGVlcEV4IFtLRVJORUwzMi42ODBdCi0gKgotICogQlVHUwotICogICBVbmltcGxlbWVudGVkCi0gKi8KLURXT1JEIFdJTkFQSSBTbGVlcEV4KERXT1JEIHgxLEJPT0wzMiB4MikKLXsKLSAgRklYTUUod2luMzIsIjooJWQsJWxkKTogc3R1YlxuIix4MSx4Mik7Ci0gIFNldExhc3RFcnJvcihFUlJPUl9DQUxMX05PVF9JTVBMRU1FTlRFRCk7Ci0gIHJldHVybiBGQUxTRTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogVGVybWluYXRlUHJvY2VzcyBbS0VSTkVMMzIuNjg0XQotICogCi0gKiBCVUdTCi0gKiAgIFVuaW1wbGVtZW50ZWQKLSAqLwotaW50IFdJTkFQSSBUZXJtaW5hdGVQcm9jZXNzKEhBTkRMRTMyIGgsIGludCByZXQpCi17Ci0gIEZJWE1FKHdpbjMyLCI6KCVwLCVkKTogc3R1YlxuIixoLHJldCk7Ci0gIFNldExhc3RFcnJvcihFUlJPUl9DQUxMX05PVF9JTVBMRU1FTlRFRCk7Ci0JcmV0dXJuIEZBTFNFOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBPcGVuRGVza3RvcDMyQSBbVVNFUjMyLjQwOF0KICAqCiAgKiBOT1RFUwpkaWZmIC0tZ2l0IGEvd2luMzIvb3JkaW5hbHMuYyBiL3dpbjMyL29yZGluYWxzLmMKaW5kZXggYTk2OTljZi4uNWI3NDI3YSAxMDA2NDQKLS0tIGEvd2luMzIvb3JkaW5hbHMuYworKysgYi93aW4zMi9vcmRpbmFscy5jCkBAIC0xMjksNCArMTI5LDMgQEAKIAlGSVhNRSh3aW4zMiwiKDB4JTA4bHgpOiBzdHViXG4iLHgpOwogCXJldHVybiAxOwogfQotCmRpZmYgLS1naXQgYS93aW4zMi9wcm9jZXNzLmMgYi93aW4zMi9wcm9jZXNzLmMKaW5kZXggM2E4NTQzMC4uMmUwNmJiNCAxMDA2NDQKLS0tIGEvd2luMzIvcHJvY2Vzcy5jCisrKyBiL3dpbjMyL3Byb2Nlc3MuYwpAQCAtNTksNTAgKzU5LDYgQEAKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDcmVhdGVQcm9jZXNzMzJBIFtLRVJORUwzMi4xNzFdCi0gKi8KLUJPT0wzMiBXSU5BUEkgQ3JlYXRlUHJvY2VzczMyQSgKLQlMUENTVFIgYXBwbmFtZSxMUFNUUiBjbWRsaW5lLExQU0VDVVJJVFlfQVRUUklCVVRFUyBwcm9jZXNzYXR0cmlidXRlcywKLSAgICAgICAgTFBTRUNVUklUWV9BVFRSSUJVVEVTIHRocmVhZGF0dHJpYnV0ZXMsQk9PTDMyIGluaGVyaXRoYW5kbGVzLAotCURXT1JEIGNyZWF0aW9uZmxhZ3MsTFBWT0lEIGVudixMUENTVFIgY3VyZGlyLAotCUxQU1RBUlRVUElORk8zMkEgc3RhcnR1cGluZm8sTFBQUk9DRVNTX0lORk9STUFUSU9OIHByb2Nlc3NpbmZvCi0pIHsKLQlISU5TVEFOQ0UxNiBoSW5zdCA9IDA7Ci0JaWYgKHByb2Nlc3NpbmZvKSBtZW1zZXQocHJvY2Vzc2luZm8sICdcMCcsIHNpemVvZigqcHJvY2Vzc2luZm8pKTsKLQotCUZJWE1FKHdpbjMyLCIoJXMsJXMsJXAsJXAsJWQsJTA4bHgsJXAsJXMsJXAsJXApOiBjYWxsaW5nIFdpbkV4ZWMzMlxuIiwKLQkJYXBwbmFtZSxjbWRsaW5lLHByb2Nlc3NhdHRyaWJ1dGVzLHRocmVhZGF0dHJpYnV0ZXMsCi0JCWluaGVyaXRoYW5kbGVzLGNyZWF0aW9uZmxhZ3MsZW52LGN1cmRpcixzdGFydHVwaW5mbyxwcm9jZXNzaW5mbyk7Ci0KLQloSW5zdCA9IFdpbkV4ZWMzMihjbWRsaW5lLFRSVUUpOwotCi0gICAgICAgIHJldHVybiBoSW5zdCA+PSAzMjsKLSNpZiAwCi0JLyogbWFrZSBmcm9tIGxjYyB1c2VzIHN5c3RlbSBhcyBmYWxsYmFjayBpZiBDcmVhdGVQcm9jZXNzIHJldHVybnMKLQkgICBGQUxTRSwgc28gcmV0dXJuIGZhbHNlICovCi0JcmV0dXJuIEZBTFNFOwotI2VuZGlmCi19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ3JlYXRlUHJvY2VzczMyVyBbS0VSTkVMMzIuMTcyXQotICovCi1CT09MMzIgV0lOQVBJIENyZWF0ZVByb2Nlc3MzMlcoCi0JTFBDV1NUUiBhcHBuYW1lLExQV1NUUiBjbWRsaW5lLExQU0VDVVJJVFlfQVRUUklCVVRFUyBwcm9jZXNzYXR0cmlidXRlcywKLSAgICAgICAgTFBTRUNVUklUWV9BVFRSSUJVVEVTIHRocmVhZGF0dHJpYnV0ZXMsQk9PTDMyIGluaGVyaXRoYW5kbGVzLAotCURXT1JEIGNyZWF0aW9uZmxhZ3MsTFBWT0lEIGVudixMUENXU1RSIGN1cmRpciwKLQlMUFNUQVJUVVBJTkZPMzJXIHN0YXJ0dXBpbmZvLExQUFJPQ0VTU19JTkZPUk1BVElPTiBwcm9jZXNzaW5mbykKLXsKLSAgICBGSVhNRSh3aW4zMiwiKCVwLCVzLCVwLCVwLCVkLCUwOGx4LCVwLCVzLCVwLCVwKTogc3R1YlxuIiwKLSAgICAgICAgICAgIGFwcG5hbWUsZGVidWdzdHJfdyhjbWRsaW5lKSxwcm9jZXNzYXR0cmlidXRlcyx0aHJlYWRhdHRyaWJ1dGVzLAotICAgICAgICAgICAgaW5oZXJpdGhhbmRsZXMsY3JlYXRpb25mbGFncyxlbnYsZGVidWdzdHJfdyhjdXJkaXIpLHN0YXJ0dXBpbmZvLAotCSAgICBwcm9jZXNzaW5mbyApOwotICAgIC8qIG1ha2UgZnJvbSBsY2MgdXNlcyBzeXN0ZW0gYXMgZmFsbGJhY2sgaWYgQ3JlYXRlUHJvY2VzcyByZXR1cm5zCi0gICAgICAgRkFMU0UsIHNvIHJldHVybiBmYWxzZSAqLwotICAgIHJldHVybiBGQUxTRTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICBDb250aW51ZURlYnVnRXZlbnQgW0tFUk5FTDMyLjE0Nl0KICAqLwogQk9PTDMyIFdJTkFQSSBDb250aW51ZURlYnVnRXZlbnQoRFdPUkQgcGlkLERXT1JEIHRpZCxEV09SRCBjb250c3RhdHVzKSB7CmRpZmYgLS1naXQgYS93aW4zMi90aW1lLmMgYi93aW4zMi90aW1lLmMKaW5kZXggOWRjMWU0Yy4uZmM4MjAzNCAxMDA2NDQKLS0tIGEvd2luMzIvdGltZS5jCisrKyBiL3dpbjMyL3RpbWUuYwpAQCAtMTMzLDE2ICsxMzMsNiBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgICAgIFNsZWVwICAoS0VSTkVMMzIuNTIzKQotICovCi1WT0lEIFdJTkFQSSBTbGVlcChEV09SRCBjTWlsbGlzZWNvbmRzKQotewotICAgIGlmKGNNaWxsaXNlY29uZHMgPT0gSU5GSU5JVEUzMikKLSAgICAgICAgd2hpbGUoMSkgc2xlZXAoMTAwMCk7IC8qIFNwaW4gZm9yZXZlciAqLwotICAgIHVzbGVlcChjTWlsbGlzZWNvbmRzKjEwMDApOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICAgICBHZXRTeXN0ZW1UaW1lQXNGaWxlVGltZSAgKEtFUk5FTDMyKQogICovCiBWT0lEIFdJTkFQSSBHZXRTeXN0ZW1UaW1lQXNGaWxlVGltZShMUEZJTEVUSU1FIHN5c3RlbXRpbWVBc2ZpbGV0aW1lKSB7CmRpZmYgLS1naXQgYS93aW5kb3dzL2tleWJvYXJkLmMgYi93aW5kb3dzL2tleWJvYXJkLmMKaW5kZXggYWM0YjU0Mi4uNjY3ZjJkNSAxMDA2NDQKLS0tIGEvd2luZG93cy9rZXlib2FyZC5jCisrKyBiL3dpbmRvd3Mva2V5Ym9hcmQuYwpAQCAtMjc3LDEzICsyNzcsMTMgQEAKICAgICAgICAgICAgICAgICBrZXlzeW0gPSBUU1hMb29rdXBLZXlzeW0oJmUyLCBpKTsKIAkJc3dpdGNoIChrZXlzeW0pCiAJCXsKLQkJY2FzZSAnOyc6IGNhc2UgJzonOiAgIHZrZXkgPSBWS19PRU1fMTsgYnJlYWs7Ci0JCWNhc2UgJy8nOiBjYXNlICc/JzogICB2a2V5ID0gVktfT0VNXzI7IGJyZWFrOwotCQljYXNlICdgJzogY2FzZSAnfic6ICAgdmtleSA9IFZLX09FTV8zOyBicmVhazsKKwkJY2FzZSAnOyc6ICAgICAgICAgICAgIHZrZXkgPSBWS19PRU1fMTsgYnJlYWs7CisJCWNhc2UgJy8nOiAgICAgICAgICAgICB2a2V5ID0gVktfT0VNXzI7IGJyZWFrOworCQljYXNlICdgJzogICAgICAgICAgICAgdmtleSA9IFZLX09FTV8zOyBicmVhazsKIAkJY2FzZSAnWyc6ICAgICAgICAgICAgIHZrZXkgPSBWS19PRU1fNDsgYnJlYWs7CiAJCWNhc2UgJ1xcJzogICAgICAgICAgICB2a2V5ID0gVktfT0VNXzU7IGJyZWFrOwogCQljYXNlICddJzogICAgICAgICAgICAgdmtleSA9IFZLX09FTV82OyBicmVhazsKLQkJY2FzZSAnXCcnOiBjYXNlICdcIic6IHZrZXkgPSBWS19PRU1fNzsgYnJlYWs7CisJCWNhc2UgJ1wnJzogICAgICAgICAgICB2a2V5ID0gVktfT0VNXzc7IGJyZWFrOwogCQljYXNlICcsJzogICAgICAgICAgICAgdmtleSA9IFZLX09FTV9DT01NQTsgYnJlYWs7CiAJCWNhc2UgJy4nOiAgICAgICAgICAgICB2a2V5ID0gVktfT0VNX1BFUklPRDsgYnJlYWs7CiAJCWNhc2UgJy0nOiAgICAgICAgICAgICB2a2V5ID0gVktfT0VNX01JTlVTOyBicmVhazsKQEAgLTM5MSwxMyArMzkxLDE5IEBACiAgICAgV09SRCB2a2V5ID0gMDsKICAgICBLRVlMUCBrZXlscDsKICAgICBzdGF0aWMgQk9PTDMyIGZvcmNlX2V4dGVuZGVkID0gRkFMU0U7IC8qIGhhY2sgZm9yIEFsdEdyIHRyYW5zbGF0aW9uICovCi0KLSAgICBpbnQgYXNjaWlfY2hhcnMgPSBUU1hMb29rdXBTdHJpbmcoZXZlbnQsIFN0ciwgMSwgJmtleXN5bSwgJmNzKTsKKyAgICAKKyAgICBpbnQgYXNjaWlfY2hhcnM7CiAKICAgICBJTlQzMiBldmVudF94ID0gcFduZC0+cmVjdFdpbmRvdy5sZWZ0ICsgZXZlbnQtPng7CiAgICAgSU5UMzIgZXZlbnRfeSA9IHBXbmQtPnJlY3RXaW5kb3cudG9wICsgZXZlbnQtPnk7CiAgICAgRFdPUkQgZXZlbnRfdGltZSA9IGV2ZW50LT50aW1lIC0gTVNHX1dpbmVTdGFydFRpY2tzOwogCisgICAgLyogdGhpcyBhbGxvd3Mgc3VwcG9ydCBmb3IgZGVhZCBrZXlzICovCisgICAgaWYgKChldmVudC0+a2V5Y29kZSA+PiA4KSA9PSAweDEwKQorCWV2ZW50LT5rZXljb2RlPShldmVudC0+a2V5Y29kZSAmIDB4ZmYpOworCisgICAgYXNjaWlfY2hhcnMgPSBUU1hMb29rdXBTdHJpbmcoZXZlbnQsIFN0ciwgMSwgJmtleXN5bSwgJmNzKTsKKwogICAgIFRSQUNFKGtleSwgIkVWRU5UX2tleSA6IHN0YXRlID0gJVhcbiIsIGV2ZW50LT5zdGF0ZSk7CiAgICAgaWYgKGtleXN5bSA9PSBYS19Nb2RlX3N3aXRjaCkKIAl7CkBAIC04MzIsNiArODM4LDE0IEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBTY3JlZW5Td2l0Y2hFbmFibGUgICAgICAoS0VZQk9BUkQuMTAwKQorICovCitWT0lEIFdJTkFQSSBTY3JlZW5Td2l0Y2hFbmFibGUoV09SRCB1bnVzZWQpCit7CisgICAgRklYTUUoa2V5Ym9hcmQsIiglMDR4KTogc3R1YlxuIix1bnVzZWQpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIE9lbUtleVNjYW4gICAgICAoS0VZQk9BUkQuMTI4KShVU0VSMzIuNDAxKQogICovCiBEV09SRCBXSU5BUEkgT2VtS2V5U2NhbihXT1JEIHdPZW1DaGFyKQpkaWZmIC0tZ2l0IGEvd2luZG93cy9tZGkuYyBiL3dpbmRvd3MvbWRpLmMKaW5kZXggMzQ3OGNiNC4uZGFkYzRjOCAxMDA2NDQKLS0tIGEvd2luZG93cy9tZGkuYworKysgYi93aW5kb3dzL21kaS5jCkBAIC0yNDcsNiArMjQ3LDIzIEBACiAgICAgcmV0dXJuIDA7CiB9CiAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgIE1ESVJlZnJlc2hNZW51CisgKi8KK3N0YXRpYyBMUkVTVUxUIE1ESVJlZnJlc2hNZW51KCBIV05EMzIgaHduZCwgSE1FTlUzMiBobWVudUZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgSE1FTlUzMiBobWVudVdpbmRvdykKK3sKKyAgICBIV05EMzIgaHduZEZyYW1lID0gR2V0UGFyZW50MzIoaHduZCk7CisgICAgSE1FTlUzMiBvbGRGcmFtZU1lbnUgPSBHZXRNZW51MzIoaHduZEZyYW1lKTsKKworICAgIFRSQUNFKG1kaSwgIiUwNHggJTA0eCAlMDR4XG4iLAorICAgICAgICAgICAgICAgIGh3bmQsIGhtZW51RnJhbWUsIGhtZW51V2luZG93KTsKKworICAgIEZJWE1FKG1kaSwicGFydGlhbGx5IGZ1bmN0aW9uIHN0dWIiKTsKKworICAgIHJldHVybiBvbGRGcmFtZU1lbnU7Cit9CisKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tIE1ESSBjaGlsZCB3aW5kb3cgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIApAQCAtOTgzLDYgKzEwMDAsOSBAQAogICAgICAgY2FzZSBXTV9NRElTRVRNRU5VOgogICAgICAgICAgIHJldHVybiBNRElTZXRNZW51KCBod25kLCAoSE1FTlUzMil3UGFyYW0sIChITUVOVTMyKWxQYXJhbSApOwogCQorICAgICAgY2FzZSBXTV9NRElSRUZSRVNITUVOVToKKyAgICAgICAgICByZXR1cm4gTURJUmVmcmVzaE1lbnUoIGh3bmQsIChITUVOVTMyKXdQYXJhbSwgKEhNRU5VMzIpbFBhcmFtICk7CisKICAgICAgIGNhc2UgV01fTURJVElMRToKIAljaS0+bWRpRmxhZ3MgfD0gTURJRl9ORUVEVVBEQVRFOwogCVNob3dTY3JvbGxCYXIzMihod25kLFNCX0JPVEgsRkFMU0UpOwpkaWZmIC0tZ2l0IGEvd2luZG93cy9tZXNzYWdlLmMgYi93aW5kb3dzL21lc3NhZ2UuYwppbmRleCA0ZThjNjMyLi45NzJlNmVmIDEwMDY0NAotLS0gYS93aW5kb3dzL21lc3NhZ2UuYworKysgYi93aW5kb3dzL21lc3NhZ2UuYwpAQCAtNDQ5LDcgKzQ0OSw4IEBACiAgICAgam95U2VuZE1lc3NhZ2VzKCk7CiAKICAgICAvKiBJZiB0aGUgcXVldWUgaXMgZW1wdHksIGF0dGVtcHQgdG8gZmlsbCBpdCAqLwotICAgIGlmICghc3lzTXNnUXVldWUtPm1zZ0NvdW50ICYmIFRTWFBlbmRpbmcoZGlzcGxheSkpCisgICAgaWYgKCFzeXNNc2dRdWV1ZS0+bXNnQ291bnQgJiYgVEhSRUFEX0lzV2luMTYoIFRIUkVBRF9DdXJyZW50KCkgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIFRTWFBlbmRpbmcoZGlzcGxheSkpCiAgICAgICAgIEVWRU5UX1dhaXROZXRFdmVudCggRkFMU0UsIEZBTFNFICk7CiAKICAgICBmb3IgKGkgPSBrYmRfbXNnID0gMDsgaSA8IHN5c01zZ1F1ZXVlLT5tc2dDb3VudDsgaSsrLCBwb3MrKykKQEAgLTYzNCw3ICs2MzUsMTAgQEAKICAgICAgIGlmICghKHF1ZXVlLT53YWtlQml0cyAmIFFTX1NNUkVTVUxUKSkKICAgICAgIHsKICAgICAgICAgcXVldWUtPmNoYW5nZUJpdHMgJj0gflFTX1NNUkVTVUxUOwotICAgICAgICBEaXJlY3RlZFlpZWxkKCBkZXN0US0+aFRhc2sgKTsKKyAgICAgICAgaWYgKFRIUkVBRF9Jc1dpbjE2KCBUSFJFQURfQ3VycmVudCgpICkpCisgICAgICAgICAgRGlyZWN0ZWRZaWVsZCggZGVzdFEtPmhUYXNrICk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICBRVUVVRV9TaWduYWwoIGRlc3RRLT5oVGFzayApOwogICAgICAgICBRVUVVRV9XYWl0Qml0cyggUVNfU01SRVNVTFQgKTsKIAlUUkFDRShzZW5kbXNnLCJcdHNtOiBoYXZlIHJlc3VsdCFcbiIpOwogICAgICAgfQpAQCAtNjg0LDcgKzY4OCw3IEBACiAgICAgICB9CiAKICAgICAgIGlmKCEoc2VuZGVyUS0+d2FrZUJpdHMgJiBRU19TTVJFU1VMVCkgKSBicmVhazsKLSAgICAgIE9sZFlpZWxkKCk7CisgICAgICBpZiAoVEhSRUFEX0lzV2luMTYoVEhSRUFEX0N1cnJlbnQoKSkpIE9sZFlpZWxkKCk7CiAgICAgfSAKICAgICBpZiggIXNlbmRlclEgKSB7IFRSQUNFKG1zZywiXHRycG06IGRvbmVcbiIpOyByZXR1cm47IH0KIApAQCAtNjk2LDcgKzcwMCw3IEBACiAgICAgcXVldWUtPkluU2VuZE1lc3NhZ2VIYW5kbGUgPSAwOwogCiAgICAgUVVFVUVfU2V0V2FrZUJpdCggc2VuZGVyUSwgUVNfU01SRVNVTFQgKTsKLSAgICBEaXJlY3RlZFlpZWxkKCBxdWV1ZS0+aFNlbmRpbmdUYXNrICk7CisgICAgaWYgKFRIUkVBRF9Jc1dpbjE2KFRIUkVBRF9DdXJyZW50KCkpKSBEaXJlY3RlZFlpZWxkKCBxdWV1ZS0+aFNlbmRpbmdUYXNrICk7CiB9CiAKIApAQCAtNzI5LDYgKzczMyw5IEBACiAKICAgICBpZiAoSXNUYXNrTG9ja2VkKCkpIGZsYWdzIHw9IFBNX05PWUlFTEQ7CiAKKyAgICAvKiBOZXZlciB5aWVsZCBvbiBXaW4zMiB0aHJlYWRzICovCisgICAgaWYgKCFUSFJFQURfSXNXaW4xNihUSFJFQURfQ3VycmVudCgpKSkgZmxhZ3MgfD0gUE1fTk9ZSUVMRDsKKwogICAgIHdoaWxlKDEpCiAgICAgeyAgICAKIAloUXVldWUgICA9IEdldFRhc2tRdWV1ZSgwKTsKZGlmZiAtLWdpdCBhL3dpbmRvd3MvbXNnYm94LmMgYi93aW5kb3dzL21zZ2JveC5jCmluZGV4IDQ0MWVhNGEuLjgzMTg2NWYgMTAwNjQ0Ci0tLSBhL3dpbmRvd3MvbXNnYm94LmMKKysrIGIvd2luZG93cy9tc2dib3guYwpAQCAtMzIwLDcgKzMyMCw3IEBACiB7CiAgICAgV0FSTihkaWFsb2csIkFwcEV4aXRcbiIpOwogICAgIE1lc3NhZ2VCb3gzMkEoIDAsIHN0ciwgTlVMTCwgTUJfU1lTVEVNTU9EQUwgfCBNQl9PSyApOwotICAgIFRBU0tfS2lsbEN1cnJlbnRUYXNrKDApOworICAgIEV4aXRQcm9jZXNzKDApOwogfQogCiAKQEAgLTMzMSw3ICszMzEsNyBAQAogewogICAgIFdBUk4oZGlhbG9nLCJBcHBFeGl0XG4iKTsKICAgICBNZXNzYWdlQm94MzJXKCAwLCBzdHIsIE5VTEwsIE1CX1NZU1RFTU1PREFMIHwgTUJfT0sgKTsKLSAgICBUQVNLX0tpbGxDdXJyZW50VGFzaygwKTsKKyAgICBFeGl0UHJvY2VzcygwKTsKIH0KIAogCmRpZmYgLS1naXQgYS93aW5kb3dzL3F1ZXVlLmMgYi93aW5kb3dzL3F1ZXVlLmMKaW5kZXggNzEyZGVhMS4uOGFiMWM4MCAxMDA2NDQKLS0tIGEvd2luZG93cy9xdWV1ZS5jCisrKyBiL3dpbmRvd3MvcXVldWUuYwpAQCAtMjE3LDYgKzIxNyw1OSBAQAogICAgIHJldHVybiBzeXNNc2dRdWV1ZTsKIH0KIAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgUVVFVUVfU2lnbmFsCisgKi8KK3ZvaWQgUVVFVUVfU2lnbmFsKCBIVEFTSzE2IGhUYXNrICkKK3sKKyAgICBQREIzMiAqcGRiOworICAgIFRIUkVBRF9FTlRSWSAqZW50cnk7CisgICAgaW50IHdha2V1cCA9IEZBTFNFOworCisgICAgVERCICpwVGFzayA9IChUREIgKilHbG9iYWxMb2NrMTYoIGhUYXNrICk7CisgICAgaWYgKCAhcFRhc2sgKSByZXR1cm47CisKKyAgICBUUkFDRShtc2csICJjYWxsaW5nIFNZTkNfTXNnV2FrZVVwXG4iKTsKKworICAgIC8qIFdha2UgdXAgdGhyZWFkIHdhaXRpbmcgZm9yIG1lc3NhZ2UgKi8KKyAgICAvKiBOT1RFOiBUaGlzIHNob3VsZCByZWFsbHkgd2FrZSB1cCAqdGhlKiB0aHJlYWQgdGhhdCBvd25zCisgICAgICAgICAgICAgdGhlIHF1ZXVlLiBTaW5jZSB3ZSBkb250J3QgaGF2ZSB0aHJlYWQtbG9jYWwgbWVzc2FnZQorICAgICAgICAgICAgIHF1ZXVlcyB5ZXQsIHdlIHdha2UgdXAgYWxsIHdhaXRpbmcgdGhyZWFkcyAuLi4gKi8KKyAgICBTWVNURU1fTE9DSygpOworICAgIHBkYiA9IHBUYXNrLT50aGRiLT5wcm9jZXNzOworICAgIGVudHJ5ID0gcGRiPyBwZGItPnRocmVhZF9saXN0LT5uZXh0IDogTlVMTDsKKworICAgIGlmIChlbnRyeSkKKyAgICAgICAgZm9yICg7OykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGVudHJ5LT50aHJlYWQtPndhaXRfc3RydWN0LndhaXRfbXNnKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFNZTkNfTXNnV2FrZVVwKCBlbnRyeS0+dGhyZWFkICk7CisgICAgICAgICAgICAgICAgd2FrZXVwID0gVFJVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChlbnRyeSA9PSBwZGItPnRocmVhZF9saXN0KSBicmVhazsKKyAgICAgICAgICAgIGVudHJ5ID0gZW50cnktPm5leHQ7CisgICAgICAgIH0KKyAgICBTWVNURU1fVU5MT0NLKCk7CisKKyAgICBpZiAoICF3YWtldXAgJiYgVEhSRUFEX0lzV2luMTYoIFRIUkVBRF9DdXJyZW50KCkgKSApCisgICAgICAgIFBvc3RFdmVudCggaFRhc2sgKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgUVVFVUVfV2FpdAorICovCit2b2lkIFFVRVVFX1dhaXQoIHZvaWQgKQoreworICAgIGlmICggVEhSRUFEX0lzV2luMTYoIFRIUkVBRF9DdXJyZW50KCkgKSApCisgICAgICAgIFdhaXRFdmVudCggMCApOworICAgIGVsc2UKKyAgICB7CisgICAgICAgIFRSQUNFKG1zZywgImN1cnJlbnQgdGFzayBpcyAzMi1iaXQsIGNhbGxpbmcgU1lOQ19Eb1dhaXRcbiIpOworICAgICAgICBTWU5DX0RvV2FpdCggMCwgTlVMTCwgRkFMU0UsIElORklOSVRFMzIsIEZBTFNFLCBUUlVFICk7CisgICAgfQorfQorCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIFFVRVVFX1NldFdha2VCaXQKQEAgLTIzNSwyOCArMjg4LDcgQEAKICAgICBpZiAocXVldWUtPndha2VNYXNrICYgYml0KQogICAgIHsKICAgICAgICAgcXVldWUtPndha2VNYXNrID0gMDsKLSAgICAgICAgUG9zdEV2ZW50KCBxdWV1ZS0+aFRhc2sgKTsKLQotICAgICAgICAvKiBXYWtlIHVwIHRocmVhZCB3YWl0aW5nIGZvciBtZXNzYWdlICovCi0gICAgICAgIC8qIE5PVEU6IFRoaXMgc2hvdWxkIHJlYWxseSB3YWtlIHVwICp0aGUqIHRocmVhZCB0aGF0IG93bnMKLSAgICAgICAgICAgICAgICAgdGhlIHF1ZXVlLiBTaW5jZSB3ZSBkb250J3QgaGF2ZSB0aHJlYWQtbG9jYWwgbWVzc2FnZQotICAgICAgICAgICAgICAgICBxdWV1ZXMgeWV0LCB3ZSB3YWtlIHVwIGFsbCB3YWl0aW5nIHRocmVhZHMgLi4uICovCi0gICAgICAgIFNZU1RFTV9MT0NLKCk7Ci0gICAgICAgIHsKLSAgICAgICAgICAgIFREQiAqcFRhc2sgPSAoVERCICopR2xvYmFsTG9jazE2KCBxdWV1ZS0+aFRhc2sgKTsKLSAgICAgICAgICAgIFBEQjMyICpwZGIgPSBwVGFzaz8gcFRhc2stPnRoZGItPnByb2Nlc3MgOiBOVUxMOwotICAgICAgICAgICAgVEhSRUFEX0VOVFJZICplbnRyeSA9IHBkYj8gcGRiLT50aHJlYWRfbGlzdC0+bmV4dCA6IE5VTEw7Ci0KLSAgICAgICAgICAgIGlmIChlbnRyeSkKLSAgICAgICAgICAgICAgICBmb3IgKDs7KQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGVudHJ5LT50aHJlYWQtPndhaXRfc3RydWN0LndhaXRfbXNnKQotICAgICAgICAgICAgICAgICAgICAgICAgU1lOQ19Nc2dXYWtlVXAoIGVudHJ5LT50aHJlYWQgKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGVudHJ5ID09IHBkYi0+dGhyZWFkX2xpc3QpIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBlbnRyeSA9IGVudHJ5LT5uZXh0OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBTWVNURU1fVU5MT0NLKCk7CisgICAgICAgIFFVRVVFX1NpZ25hbCggcXVldWUtPmhUYXNrICk7CiAgICAgfQogfQogCkBAIC0zMDYsNyArMzM4LDcgQEAKIAkKIAlUUkFDRShtc2csIiUwNHgpIHdha2VNYXNrIGlzICUwNHgsIHdhaXRpbmdcbiIsIHF1ZXVlLT5zZWxmLCBxdWV1ZS0+d2FrZU1hc2spOwogCi0gICAgICAgIFdhaXRFdmVudCggMCApOworICAgICAgICBRVUVVRV9XYWl0KCk7CiAgICAgfQogfQogCmRpZmYgLS1naXQgYS93aW5kb3dzL3dpbi5jIGIvd2luZG93cy93aW4uYwppbmRleCAxYjA5YzhhLi40NTZmMjE1IDEwMDY0NAotLS0gYS93aW5kb3dzL3dpbi5jCisrKyBiL3dpbmRvd3Mvd2luLmMKQEAgLTI5LDYgKzI5LDcgQEAKICNpbmNsdWRlICJjbGlwYm9hcmQuaCIKICNpbmNsdWRlICJ3aW5wcm9jLmgiCiAjaW5jbHVkZSAidGhyZWFkLmgiCisjaW5jbHVkZSAicHJvY2Vzcy5oIgogI2luY2x1ZGUgImRlYnVnLmgiCiAjaW5jbHVkZSAid2luZXJyb3IuaCIKIApAQCAtMjkxLDcgKzI5Miw2IEBACiAgICAgUFJPUEVSVFlfUmVtb3ZlV2luZG93UHJvcHMoIHduZFB0ciApOwogCiAgICAgd25kUHRyLT5kd01hZ2ljID0gMDsgIC8qIE1hcmsgaXQgYXMgaW52YWxpZCAqLwotICAgIHduZFB0ci0+aHduZFNlbGYgPSAwOwogCiAgICAgaWYgKCh3bmRQdHItPmhyZ25VcGRhdGUpIHx8ICh3bmRQdHItPmZsYWdzICYgV0lOX0lOVEVSTkFMX1BBSU5UKSkKICAgICB7CkBAIC0zMjYsMTAgKzMyNiw5IEBACiAgICAgICAgaWYgKHduZFB0ci0+d0lEbWVudSkgRGVzdHJveU1lbnUzMiggKEhNRU5VMzIpd25kUHRyLT53SURtZW51ICk7CiAgICAgaWYgKHduZFB0ci0+aFN5c01lbnUpIERlc3Ryb3lNZW51MzIoIHduZFB0ci0+aFN5c01lbnUgKTsKICAgICBpZiAod25kUHRyLT53aW5kb3cpIEVWRU5UX0Rlc3Ryb3lXaW5kb3coIHduZFB0ciApOwotICAgIGlmICh3bmRQdHItPmNsYXNzLT5zdHlsZSAmIENTX09XTkRDKSBEQ0VfRnJlZVdpbmRvd0RDRSggd25kUHRyICk7Ci0KKyAgICBEQ0VfRnJlZVdpbmRvd0RDRSggd25kUHRyICk7ICAgIC8qIEFsd2F5cyBkbyB0aGlzIHRvIGNhdGNoIG9ycGhhbmVkIERDcyAqLyAKICAgICBXSU5QUk9DX0ZyZWVQcm9jKCB3bmRQdHItPndpbnByb2MsIFdJTl9QUk9DX1dJTkRPVyApOwotCisgICAgd25kUHRyLT5od25kU2VsZiA9IDA7CiAgICAgd25kUHRyLT5jbGFzcy0+Y1dpbmRvd3MtLTsKICAgICB3bmRQdHItPmNsYXNzID0gTlVMTDsKICAgICBwV25kID0gd25kUHRyLT5uZXh0OwpAQCAtNDkzLDEzICs0OTIsMzMgQEAKIAogICAgIC8qIEZpeCB0aGUgY29vcmRpbmF0ZXMgKi8KIAotICAgIGlmIChjcy0+eCA9PSBDV19VU0VERUZBVUxUMzIpIGNzLT54ID0gY3MtPnkgPSAwOworICAgIGlmIChjcy0+eCA9PSBDV19VU0VERUZBVUxUMzIpIAorICAgIHsKKyAgICAgICAgUERCMzIgKnBkYiA9IFBST0NFU1NfQ3VycmVudCgpOworICAgICAgICBpZiAoICAgIShjcy0+c3R5bGUgJiAoV1NfQ0hJTEQgfCBXU19QT1BVUCkpCisgICAgICAgICAgICAmJiAgKHBkYi0+ZW52X2RiLT5zdGFydHVwX2luZm8tPmR3RmxhZ3MgJiBTVEFSVEZfVVNFUE9TSVRJT04pICkKKyAgICAgICAgeworICAgICAgICAgICAgY3MtPnggPSBwZGItPmVudl9kYi0+c3RhcnR1cF9pbmZvLT5kd1g7CisgICAgICAgICAgICBjcy0+eSA9IHBkYi0+ZW52X2RiLT5zdGFydHVwX2luZm8tPmR3WTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGNzLT54ID0gMDsKKyAgICAgICAgICAgIGNzLT55ID0gMDsKKyAgICAgICAgfQorICAgIH0KICAgICBpZiAoY3MtPmN4ID09IENXX1VTRURFRkFVTFQzMikKICAgICB7Ci0vKiAgICAgICAgaWYgKCEoY3MtPnN0eWxlICYgKFdTX0NISUxEIHwgV1NfUE9QVVApKSkgY3MtPmN4ID0gY3MtPmN5ID0gMDsKLSAgICAgICAgZWxzZSAqLworICAgICAgICBQREIzMiAqcGRiID0gUFJPQ0VTU19DdXJyZW50KCk7CisgICAgICAgIGlmICggICAhKGNzLT5zdHlsZSAmIChXU19DSElMRCB8IFdTX1BPUFVQKSkKKyAgICAgICAgICAgICYmICAocGRiLT5lbnZfZGItPnN0YXJ0dXBfaW5mby0+ZHdGbGFncyAmIFNUQVJURl9VU0VTSVpFKSApCiAgICAgICAgIHsKLSAgICAgICAgICAgIGNzLT5jeCA9IDYwMDsKKyAgICAgICAgICAgIGNzLT5jeCA9IHBkYi0+ZW52X2RiLT5zdGFydHVwX2luZm8tPmR3WFNpemU7CisgICAgICAgICAgICBjcy0+Y3kgPSBwZGItPmVudl9kYi0+c3RhcnR1cF9pbmZvLT5kd1lTaXplOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgY3MtPmN4ID0gNjAwOyAvKiBGSVhNRSAqLwogICAgICAgICAgICAgY3MtPmN5ID0gNDAwOwogICAgICAgICB9CiAgICAgfQpAQCAtMjI3NCwxMSArMjI5MywxMyBAQAogICAgICAgICAvKiBNYWtlIHN1cmUgdGhhdCB0aGUgd2luZG93IHN0aWxsIGV4aXN0cyAqLwogICAgICAgICBpZiAoIUlzV2luZG93MzIoKCpwcFduZCktPmh3bmRTZWxmKSkgY29udGludWU7CiAgICAgICAgIC8qIEJ1aWxkIGNoaWxkcmVuIGxpc3QgZmlyc3QgKi8KLSAgICAgICAgaWYgKCEoY2hpbGRMaXN0ID0gV0lOX0J1aWxkV2luQXJyYXkoICpwcFduZCwgQldBX1NLSVBPV05FRCwgTlVMTCApKSkKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgaWYgKCFmdW5jKCAoKnBwV25kKS0+aHduZFNlbGYsIGxQYXJhbSApKSByZXR1cm4gRkFMU0U7Ci0gICAgICAgIHJldCA9IFdJTl9FbnVtQ2hpbGRXaW5kb3dzKCBjaGlsZExpc3QsIGZ1bmMsIGxQYXJhbSApOwotICAgICAgICBIZWFwRnJlZSggU3lzdGVtSGVhcCwgMCwgY2hpbGRMaXN0ICk7CisgICAgICAgIGNoaWxkTGlzdCA9IFdJTl9CdWlsZFdpbkFycmF5KCAqcHBXbmQsIEJXQV9TS0lQT1dORUQsIE5VTEwgKTsKKyAgICAgICAgcmV0ID0gZnVuYyggKCpwcFduZCktPmh3bmRTZWxmLCBsUGFyYW0gKTsKKyAgICAgICAgaWYgKGNoaWxkTGlzdCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHJldCkgcmV0ID0gV0lOX0VudW1DaGlsZFdpbmRvd3MoIGNoaWxkTGlzdCwgZnVuYywgbFBhcmFtICk7CisgICAgICAgICAgICBIZWFwRnJlZSggU3lzdGVtSGVhcCwgMCwgY2hpbGRMaXN0ICk7CisgICAgICAgIH0KICAgICAgICAgaWYgKCFyZXQpIHJldHVybiBGQUxTRTsKICAgICB9CiAgICAgcmV0dXJuIFRSVUU7CmRpZmYgLS1naXQgYS93aW5kb3dzL3dpbnBvcy5jIGIvd2luZG93cy93aW5wb3MuYwppbmRleCA4YmVjNTE5Li43NGFmOTBhIDEwMDY0NAotLS0gYS93aW5kb3dzL3dpbnBvcy5jCisrKyBiL3dpbmRvd3Mvd2lucG9zLmMKQEAgLTUzLDYgKzUzLDcgQEAKIAogc3RhdGljIEhXTkQzMiBod25kQWN0aXZlICAgICAgPSAwOyAgLyogQ3VycmVudGx5IGFjdGl2ZSB3aW5kb3cgKi8KIHN0YXRpYyBIV05EMzIgaHduZFByZXZBY3RpdmUgID0gMDsgIC8qIFByZXZpb3VzbHkgYWN0aXZlIHdpbmRvdyAqLworc3RhdGljIEhXTkQzMiBoR2xvYmFsU2hlbGxXaW5kb3c9MDsgLyp0aGUgc2hlbGwqLwogCiBzdGF0aWMgTFBDU1RSIGF0b21JbnRlcm5hbFBvczsKIApAQCAtNzAyLDkgKzcwMywxMCBAQAogICogICAgICAgICBTZXRTaGVsbFdpbmRvdzMyICAgIChVU0VSMzIuNTA0KQogICovCiBIV05EMzIgV0lOQVBJIFNldFNoZWxsV2luZG93MzIoSFdORDMyIGh3bmRzaGVsbCkKLXsKLSAgICBGSVhNRSh3aW4sICIoJTA4eCk6IGVtcHR5IHN0dWJcbiIsaHduZHNoZWxsICk7Ci0gICAgcmV0dXJuIDA7Cit7ICAgV0FSTih3aW4sICIoaFduZD0lMDh4KSBzZW1pIHN0dWJcbiIsaHduZHNoZWxsICk7CisKKyAgICBoR2xvYmFsU2hlbGxXaW5kb3cgPSBod25kc2hlbGw7CisgICAgcmV0dXJuIGhHbG9iYWxTaGVsbFdpbmRvdzsKIH0KIAogCkBAIC03MTIsOSArNzE0LDkgQEAKICAqICAgICAgICAgR2V0U2hlbGxXaW5kb3czMiAgICAoVVNFUjMyLjI4NykKICAqLwogSFdORDMyIFdJTkFQSSBHZXRTaGVsbFdpbmRvdzMyKHZvaWQpCi17Ci0gICAgRklYTUUod2luLCAiKHZvaWQpOiBlbXB0eSBzdHViXG4iICk7Ci0gICAgcmV0dXJuIDA7Cit7ICAgV0FSTih3aW4sICIoaFduZD0leCkgc2VtaSBzdHViXG4iLGhHbG9iYWxTaGVsbFdpbmRvdyApOworCisgICAgcmV0dXJuIGhHbG9iYWxTaGVsbFdpbmRvdzsKIH0KIAogCmRpZmYgLS1naXQgYS93aW5kb3dzL3dpbnByb2MuYyBiL3dpbmRvd3Mvd2lucHJvYy5jCmluZGV4IGY2MmY4NmYuLmJiNmZmOTIgMTAwNjQ0Ci0tLSBhL3dpbmRvd3Mvd2lucHJvYy5jCisrKyBiL3dpbmRvd3Mvd2lucHJvYy5jCkBAIC03MzAsNiArNzMwLDggQEAKICAgICAgICAgKnBscGFyYW0gPSAoTFBBUkFNKUhlYXBBbGxvYyggU3lzdGVtSGVhcCwgMCwgc2l6ZW9mKEJPT0wzMikgKTsKICAgICAgICAgcmV0dXJuIDE7CiAgICAgY2FzZSBXTV9NRElTRVRNRU5VOgorICAgICAgICBpZih3UGFyYW0xNj09VFJVRSkKKyAgICAgICAgICAgKnBtc2czMj1XTV9NRElSRUZSRVNITUVOVTsKICAgICAgICAgKnB3cGFyYW0zMiA9IChXUEFSQU0zMikoSE1FTlUzMilMT1dPUkQoKnBscGFyYW0pOwogICAgICAgICAqcGxwYXJhbSAgID0gKExQQVJBTSkoSE1FTlUzMilISVdPUkQoKnBscGFyYW0pOwogICAgICAgICByZXR1cm4gMDsK