ZGlmZiAtLWdpdCBhL0FOTk9VTkNFIGIvQU5OT1VOQ0UKaW5kZXggNGI3NDZmOS4uMDNmMzc3ZSAxMDA2NDQKLS0tIGEvQU5OT1VOQ0UKKysrIGIvQU5OT1VOQ0UKQEAgLTEsMTQgKzEsMTUgQEAKLVRoaXMgaXMgcmVsZWFzZSA5NTA0MzAgb2YgV2luZSB0aGUgTVMgV2luZG93cyBlbXVsYXRvci4gIFRoaXMgaXMgc3RpbGwgYQorVGhpcyBpcyByZWxlYXNlIDk1MDUyMiBvZiBXaW5lIHRoZSBNUyBXaW5kb3dzIGVtdWxhdG9yLiAgVGhpcyBpcyBzdGlsbCBhCiBkZXZlbG9wZXIncyBvbmx5IHJlbGVhc2UuICBUaGVyZSBhcmUgbWFueSBidWdzIGFuZCBtYW55IHVuaW1wbGVtZW50ZWQgQVBJCiBmZWF0dXJlcy4gIE1vc3QgYXBwbGljYXRpb25zIHN0aWxsIGRvIG5vdCB3b3JrLgogCiBQYXRjaGVzIHNob3VsZCBiZSBzdWJtaXR0ZWQgdG8gIndpbmUtbmV3QGFtc2NvbnMuY29tIi4gIFBsZWFzZSBkb24ndCBmb3JnZXQKIHRvIGluY2x1ZGUgYSBDaGFuZ2VMb2cgZW50cnkuICBJJ2xsIG1ha2UgYSBuZXcgcmVsZWFzZSBldmVyeSBvdGhlciBTdW5kYXkuCiAKLVdIQVQnUyBORVcgd2l0aCBXaW5lLTk1MDQzMDogKHNlZSBDaGFuZ2VMb2cgZm9yIGRldGFpbHMpCi0JLSBQcmVsaW1pbmFyeSBtdWx0aXRhc2tpbmcgc3VwcG9ydC4KLQktIEJldHRlciBET1MgZHJpdmVzIHN1cHBvcnQuCi0JLSBTdHVicyBmb3IgRERFTUwgbGlicmFyeS4KK1dIQVQnUyBORVcgd2l0aCBXaW5lLTk1MDUyMjogKHNlZSBDaGFuZ2VMb2cgZm9yIGRldGFpbHMpCisJLSBQcmVsaW1pbmFyeSBXaW4zMiBzdXBwb3J0LgorCS0gTXVsdGltZWRpYSBjb2RlIHdvcmtzIGJldHRlci4KKwktIEJldHRlciBtZXNzYWdlIGJveGVzLCBsaXN0Ym94ZXMgYW5kIGNvbWJvcy4KKwktIFNZU1JFUy5ETEwgaXMgbm8gbG9uZ2VyIG5lZWRlZC4KIAktIExvdHMgb2YgYnVnIGZpeGVzLgogCiBTZWUgdGhlIFJFQURNRSBmaWxlIGluIHRoZSBkaXN0cmlidXRpb24gZm9yIGluc3RhbGxhdGlvbiBpbnN0cnVjdGlvbnMuCkBAIC0xNywxMCArMTgsMTAgQEAKIHRoZSByZWxlYXNlIGlzIGF2YWlsYWJsZSBhdCB0aGUgZnRwIHNpdGVzLiAgVGhlIHNvdXJjZXMgd2lsbCBiZSBhdmFpbGFibGUKIGZyb20gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6CiAKLSAgICBzdW5zaXRlLnVuYy5lZHU6L3B1Yi9MaW51eC9BTFBIQS93aW5lL1dpbmUtOTUwNDMwLnRhci5negotICAgIHRzeC0xMS5taXQuZWR1Oi9wdWIvbGludXgvQUxQSEEvV2luZS9kZXZlbG9wbWVudC9XaW5lLTk1MDQzMC50YXIuZ3oKLSAgICBmdHAuaW5mb21hZ2ljLmNvbTovcHViL21pcnJvcnMvbGludXgvd2luZS9kZXZlbG9wbWVudC9XaW5lLTk1MDQzMC50YXIuZ3oKLSAgICBmdHAuZnVuZXQuZmk6L3B1Yi9PUy9MaW51eC9BTFBIQS9XaW5lL1dpbmUtOTUwNDMwLnRhci5negorICAgIHN1bnNpdGUudW5jLmVkdTovcHViL0xpbnV4L0FMUEhBL3dpbmUvV2luZS05NTA1MjIudGFyLmd6CisgICAgdHN4LTExLm1pdC5lZHU6L3B1Yi9saW51eC9BTFBIQS9XaW5lL2RldmVsb3BtZW50L1dpbmUtOTUwNTIyLnRhci5negorICAgIGZ0cC5pbmZvbWFnaWMuY29tOi9wdWIvbWlycm9ycy9saW51eC93aW5lL2RldmVsb3BtZW50L1dpbmUtOTUwNTIyLnRhci5negorICAgIGZ0cC5mdW5ldC5maTovcHViL09TL0xpbnV4L0FMUEhBL1dpbmUvV2luZS05NTA1MjIudGFyLmd6CiAKIEl0IHNob3VsZCBhbHNvIGJlIGF2YWlsYWJsZSBmcm9tIGFueSBzaXRlIHRoYXQgbWlycm9ycyB0c3gtMTEgb3Igc3Vuc2l0ZS4KIApkaWZmIC0tZ2l0IGEvQ2hhbmdlTG9nIGIvQ2hhbmdlTG9nCmluZGV4IDc4NGZkNzYuLmZiNTVjY2QgMTAwNjQ0Ci0tLSBhL0NoYW5nZUxvZworKysgYi9DaGFuZ2VMb2cKQEAgLTEsNCArMSwyNDggQEAKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1N1biBNYXkgMjEgMTI6MzA6MzAgMTk5NSAgQWxleGFuZHJlIEp1bGxpYXJkICAoanVsbGlhcmRAc3Vuc2l0ZS51bmMuZWR1KQorCisJKiBbZGVidWdnZXIvaGFzaC5jXSBbZGVidWdnZXIvaW5mby5jXQorCUFkZGVkIHN1cHBvcnQgZm9yIHN5bWJvbGljIHNlZ21lbnRlZCBhZGRyZXNzZXMuIEFkZCBzeW1ib2xzIGZvciBhbGwKKwlidWlsdC1pbiBBUEkgZW50cnkgcG9pbnRzLgorCisJKiBbaWYxNjMyL3JlbGF5LmNdIFtpbmNsdWRlL2RsbHMuaF0KKwlSZW1vdmVkIGRsbF90YWJsZSBzdHJ1Y3R1cmUsIGFzIHdlIG5vdyB1c2UgdGhlIGJ1aWx0LWluIG1vZHVsZQorCXN0cnVjdHVyZXMuCisKKwkqIFtpZjE2MzIvcmVsYXkuY10gW2xvYWRlci9tYWluLmNdCisJUmVtb3ZlZCB3aW5lc3RhdCBvcHRpb24sIGFzIGl0IHdhcyBubyBsb25nZXIgdmVyeSBtZWFuaW5nZnVsLgorCisJKiBbaW5jbHVkZS9zdGFja2ZyYW1lLmhdCisJTmV3IG1hY3JvIE1BS0VfU0VHUFRSIHRoYXQgY3JlYXRlcyBhIHNlZ21lbnRlZCBwb2ludGVyIHRvIGEgbG9jYWwKKwl2YXJpYWJsZSBvbiB0aGUgMzItYml0IHN0YWNrLgorCisJKiBbbG9hZGVyL21vZHVsZS5jXQorCUFkZGVkIHN1cHBvcnQgZm9yIG11bHRpcGxlIGluc3RhbmNlcyBvZiBhbiBhcHBsaWNhdGlvbi4KKwlJbXBsZW1lbnRlZCBMb2FkTW9kdWxlKCkgYW5kIEZyZWVNb2R1bGUoKS4KKworCSogW2xvYWRlci9uZV9pbWFnZS5jXSBbbG9hZGVyL3Rhc2suY10KKwlNb3ZlZCBpbml0aWFsaXNhdGlvbiBvZiBidWlsdC1pbiBETExzIHRvIEluaXRUYXNrKCkuCisKKwkqIFttZW1vcnkvZ2xvYmFsLmNdCisJSW1wbGVtZW50ZWQgZGlzY2FyZGFibGUgYmxvY2tzLgorCisJKiBbbWlzYy9maWxlLmNdCisJU2VhcmNoIHBhdGggb2YgY3VycmVudCBleGVjdXRhYmxlIGluIE9wZW5GaWxlKCkuCisJRml4ZWQgYnVnIHdpdGggc2VhcmNoaW5nIGluIFdpbmRvd3MgcGF0aC4KKworCSogW21pc2MvbHN0ci5jXQorCUhhcmQtY29kZWQgdHJhbnNsYXRpb24gdGFibGVzIGZvciBBbnNpPC0+T2VtLgorCisJKiBbbWlzYy91c2VyLmNdCisJTW92ZWQgc29tZSBnbG9iYWwgaW5pdGlhbGl6YXRpb25zIHRvIEluaXRBcHAoKSwgYmVjYXVzZSB0aGV5IG5lZWQKKwlhIHRhc2sgY29udGV4dCB0byBiZSBwZXJmb3JtZWQuCisKKwkqIFtvYmplY3RzL2RjLmNdCisJSGFuZGxlIFIyX0JMQUNLIGFuZCBSMl9XSElURSBzcGVjaWFsbHkgc28gdGhhdCB0aGV5IHdvcmsgY29ycmVjdGx5CisJd2l0aCBwYWxldHRlIGRpc3BsYXlzLgorCisJKiBbdG9vbHMvYnVpbGQuY10KKwlTdXBwcmVzc2VkIGdlbmVyYXRpb24gb2YgdGhlIEMgZmlsZSBmb3IgRExMIHNwZWNzLCBiZWNhdXNlIGl0J3Mgbm8KKwlsb25nZXIgbmVlZGVkLiBPdXRwdXQgYWxsIHRoZSBhc3NlbWJseSBjb2RlIGRpcmVjdGx5IHRvIHN0ZG91dC4KKwlTb21lIGNoYW5nZXMgdG8gaW50ZWdyYXRlIFdpbjMyIHN1cHBvcnQgZnJvbSBNYXJ0aW4gdm9uCUxvZXdpcy4gCisKKwkqIFt3aW5kb3dzL21zZ2JveC5jXQorCU1vdmVkIG1lc3NhZ2UgYm94IGNvZGUgZnJvbSBtaXNjLyB0byB3aW5kb3dzLy4KKworTW9uIE1heSAxNSAyMzo0MDowNCAxOTk1ICBNYXJ0aW4gQXlvdHRlICh3aW5lQHRyZ2NvcnAubWtzaW5mby5xYy5jYSkKKworCSogW21pc2MvYXVkaW8uY10gW21pc2MvbWNpY2RhLmNdIFttaXNjL21jaWFuaW0uY10gW21pc2MvbWlkaS5jXQorCSAgW21pc2MvbW1hdXguY10gW21pc2MvbW1zeXN0ZW0uY10KKwlNb2RpZnkgY29kZSAmIHVzZSBwb2ludGVycyBjb252ZXJzaW9uIG1hY3Jvcy4KKwlNYWtlIGNkYXVkaW8gJiB3YXZlIGRldmljZXMgd29yayBhZ2FpbiAob25seSB1c2luZyBzb21lIGFwcGxldHMpLgorCisJKiBbbWlzYy9wcm9maWxlLmNdCisJQ2hhbmdlIGdldGMoKSB0byBmZ2V0YygpIHdoZXJlIG5lZWRlZC4KKworTW9uIE1heSAxNSAyMjoxMDo1NiAxOTk1ICBNYXJ0aW4gdm9uIExvZXdpcyAgPGxvZXdpc0BpbmZvcm1hdGlrLmh1LWJlcmxpbi5kZT4KKworCSogW2lmMTYzMi9JbWFrZWZpbGVdCisJYWRkZWQgZW50cmllcyBmb3IgdGhlIG5ldyBmaWxlcyBnZGkzMi5zcGVjLCBrZXJuZWwzMi5zcGVjLAorCXVzZXIzMi5zcGVjLCBzaGVsbDMyLnNwZWMgYW5kIHdpbnByb2NzMzIuc3BlYy4KKworCSogW2lmMTYzMi9jb21tZGxnLnNwZWNdW2lmMTYzMi9rZXJuZWwuc3BlY11baWYxNjMyL3NoZWxsLnNwZWNdCisJICBbaWYxNjMyL3N0b3JhZ2Uuc3BlY11baWYxNjMyL3N5c3RlbS5zcGVjXVtpZjE2MzIvdXNlci5zcGVjXQorCUNob29zZUZvbnQsIFJFU0VSVkVENSwgSW50ZXJuYWxFeHRyYWN0SWNvbjogTWFya2VkIGFzIHN0dWJzCisJRXh0cmFjdEFzc29jaWF0ZWRJY29uLCBEb0Vudmlyb25tZW50U3Vic3QsIER1bXBJY29uOgorCQlzdHViIGltcGxlbWVudGF0aW9ucyBwcm92aWRlZCAKKwltYXJrZWQgc3RvcmFnZS5kbGwsc3RvcmVnZS5zeXMgZnVuY3Rpb25zIGFzIHN0dWJzCisKKwkqIFtpbmNsdWRlL3BlX2ltYWdlLmhdCisJQWRkZWQgc3RydWN0dXJlcyBXSU4zMl9idWlsdGluIGFuZCAgV0lOMzJfZnVuY3Rpb24KKworCSogW2luY2x1ZGUvcGVleGUuaF0KKwlQRV9JbXBvcnRfRGlyZWN0b3J5OiByZW5hbWVkIHJlc2VydmVkIGZpZWxkcyB0byAKKwkJVGltZURhdGUsIEZvcndhcmRlciwgVGh1bmtfTGlzdAorCisJKiBbaW5jbHVkZS93aW5lcnJvci5oXQorCU5ldyBmaWxlLgorCisJKiBbbG9hZGVyL21haW4uY10KKwljYWxsZWQgUkVMQVkzMl9Jbml0CisKKwkqIFtsb2FkZXIvcGVfaW1hZ2UuY10KKwl4bW1hcDogbWFwIEJTUyBhbm9ueW1vdXMKKwlkdW1wX2ltcG9ydHM6IHJlbmFtZWQgdG8gZml4dXBfaW1wb3J0cywgZG8gdGhlIGZpeHVwIG9mIGltcG9ydGVkCisJICAgICAgICAgICAgICBzeW1ib2xzCisJUEVfTG9hZEltYWdlOiBwYXNzIHJhdyBkYXRhIHNpemUgdG8geG1tYXAKKworCSogW2xvYWRlci9yZXNvdXJjZS5jXQorCUR1bXBJY29uOiBuZXcgZnVuY3Rpb24KKworCSogW21pc2Mva2VybmVsMzIuY10KKwlOZXcgZmlsZS4KKworCSogW21pc2MvbWFpbi5jXQorCW1ha2Ugc3Rkb3V0IGFuZCBzdGRlcnIgdW5idWZmZXJlZAorCisJKiBbbWlzYy9zaGVsbC5jXQorCURvRW52aXJvbm1lbnRTdWJzdDogbmV3IGZ1bmN0aW9uCisKKwkqIFtvYmplY3RzL2ZvbnQuY10KKwlGT05UX01hdGNoRm9udDogdHJ5IG9ibGlxdWUgaWYgdGhlcmUgaXMgbm8gaXRhbGljCisKKwkqIFtyYy9JbWFrZWZpbGVdW3JjL3BhcnNlci5sXQorCXl5d3JhcDogbmV3IGZ1bmN0aW9uCisJRG9uJ3QgbGluayB3aXRoIGxpYmZsLmEgb24gTGludXgKKworCSogW3Rvb2xzL2J1aWxkLmNdCisJQWRkZWQga2V5d29yZHMgc3RkY2FsbCwgc3Vic3lzdGVtLCBiYXNlCisJR2VuZXJhdGVGb3JXaW4zMjogbmV3IGZ1bmN0aW9uCisJQnVpbGRTcGVjRmlsZXM6IGNhbGwgR2VuZXJhdGVGb3JXaW4zMiBpZiBzdWJzeXN0ZW0gaXMgd2luMzIKKworTW9uIE1heSAxNSAxMDozODoxNCAxOTk1ICAgQmVybmQgU2NobWlkdCA8Y3J1eEBwb29sLmluZm9ybWF0aWsucnd0aC1hYWNoZW4uZGU+CisgICAgICAgIAorICAgICAgICAqIFtjb250cm9scy9saXN0Ym94LmNdIFtjb250cm9scy9jb21iby5jXSBbd2luZG93cy9kZWZ3bmQuY10KKwlNaW5vciBmaXhlcy4KKwkKKwkqIFttaXNjL21lc3NhZ2UuY10gW21pc2MvbWFpbi5jXSBbcmMvc3lzcmVzKi5yY10gW2luY2x1ZGUvdGV4dHMuaF0KKwlSZXdyb3RlIG1lc3NhZ2UgYm94IGhhbmRsaW5nLgorCQorCSogW3dpbmRvd3MvZGlhbG9nLmNdCisJRGlhbG9ncyBzaG91bGQgYmUgaW52aXNpYmxlIHVudGlsIGFmdGVyIFdNX0lOSVRESUFMT0cgaXMgc2VlbnQuCisJRG9uJ3Qgc3dpdGNoIHRvIGludmlzaWJsZSBkaWFsb2cgaXRlbXMgb24gYSBUQUIga2V5cHJlc3MuCisJCisJKiBbd2luZG93cy9tZGkuY10KKwlTZW5kIFdNX05DUEFJTlQgbWVzc2FnZSBpbiBNRElSZXN0b3JlQ2hpbGQoKS4KKwkKKwkqIFt3aW5kb3dzL3BhaW50aW5nLmNdCisJRml4ZWQgdHlwbyAoJiYgLT4gJikuCisJCisJKiBbd2luZG93cy9tZXNzYWdlLmNdIFtpZjE2MzIvdXNlci5zcGVjXQorCUltcGxlbWVudGVkIFBvc3RBcHBNZXNzYWdlKCkuCisJCisJKiBbd2luZG93cy9ldmVudC5jXQorCVNldENhcHR1cmUoMCkgc2hvdWxkIGFjdCBsaWtlIFJlbGVhc2VDYXB0dXJlKCkuCisKK1R1ZSBNYXkgIDkgMTE6NTU6NTIgMTk5NSAgICAgRWRkaWUgQy4gRG9zdCAgICAgICAgICAgICAoZWNkQGRyZXNzbGVyLmRlKQorCisJKiBbSW1ha2VmaWxlXQorCUNoYW5nZWQgQ0RFQlVHRkxBR1MgZm9yIHN5c3RlbXMgcnVubmluZyBfX0VMRl9fICh0ZW1wb3JhcmlseSkKKwlBZGRlZCBBU0ZMQUdTIHRvIGV4cG9ydGVkIHZhcmlhYmxlcy4KKworCSogW2RlYnVnZ2VyL3JlYWRsaW5lL0ltYWtlZmlsZV0KKwlNb3ZlZCBkZWZpbmVzIGZvciBsaWJyZWFkbGluZSBmcm9tIERFRklORVMgdG8gRVhUUkFfREVGSU5FUworCisJKiBbbWVtb3J5L2xvY2FsLmNdIFttaXNjZW11L2ludDIxLmNdCisJQWRkZWQgc29tZSBtb3JlIGRlYnVnZ2luZyBvdXRwdXRzLgorCitNb24gTWF5ICA4IDAwOjU1OjI3IE1FVCBEU1QgMTk5NQkgIERhZyBBc2hlaW0gKGRhc2hAaWZpLnVpby5ubykKKworCSogW21pc2MvbWVzc2FnZS5jXQorCUZpeGVkIGEgIkZJWE1FIiBjb25jZXJuaW5nIG5vcndlZ2lhbiB0cmFuc2xhdGlvbi4KKworU3VuIE1heSAgNyAyMzoyNToyMyAxOTk1ICAgQmVybmQgU2NobWlkdCA8Y3J1eEBwb29sLmluZm9ybWF0aWsucnd0aC1hYWNoZW4uZGU+CisgICAgICAgIAorCSogWyovKl0KKyAgICAgICAgUmVtb3ZlZCB3YXJuaW5ncyBpbiBhIGNvdXBsZSBvZiBmaWxlcyBhbmQgZGVsZXRlZCBzb21lIG9ic29sZXRlIGNvZGUuCisKKyAgICAgICAgKiBbY29udHJvbHMvbGlzdGJveC5jXQorICAgICAgICBDbGVhbnVwLCBzcGVlZCBpbXByb3ZlbWVudHMgJiBsb3RzIG9mIGJ1ZyBmaXhlcy4KKworICAgICAgICAqIFtjb250cm9scy9jb21iby5jXQorCU1vc3RseSByZXdyaXR0ZW4uIFRoaXMgaXMgc3RpbGwgdmVyeSBidWdneSwgYnV0IG5vdCBxdWl0ZSBhcyBiYWQgYXMgCisJYmVmb3JlLgorCisgICAgICAgICogW2luY2x1ZGUvY29tbWRsZy5oXSBbbWlzYy9jb21tZGxnLmNdCisgICAgICAgIFJlbW92ZWQgdGhlIG5lZWQgZm9yIHN5c3Jlcy5kbGwuIFNtYWxsIGJ1ZyBmaXhlcy4KKwkKKyAgICAgICAgKiBbb2JqZWN0cy9vZW1iaXRtYXAuY10gW2luY2x1ZGUvYml0bWFwcy88bWFueT5dIFtpbmNsdWRlL3dpbmRvd3MuaF0KKyAgICAgICAgICBbbG9hZGVyL2xpYnJhcnkuY10gW2xvYWRlci9tYWluLmNdIFtyYy9zeXNyZXMqLnJjXQorICAgICAgICBSZW1vdmVkIHN5c3Jlcy5kbGwgYW5kIHJlcGxhY2VkIHRoZSByZW1haW5pbmcgYml0bWFwcy9pY29ucyB3aXRoCisgICAgICAgIFhQTSBlcXVpdmFsZW50cy4KKworICAgICAgICAqIFttaXNjL21lc3NhZ2UuY10gW3dpbmRvd3Mvbm9uY2xpZW50LmNdIFttaXNjL21haW4uY10KKyAgICAgICAgICBbaWYxNjMyL3dpbnByb2NzLnNwZWNdCisgICAgICAgICJBYm91dCBXaW5lLi4uIiBub3cgYnJpbmdzIHVwIGEgc3RhbmRhcmQgU2hlbGxBYm91dCgpIHdpbmRvdyB3aXRoCisgICAgICAgIHRoZSBXaW5lIGljb24gYW5kIHRoZSBsaXN0IG9mIGNvbnRyaWJ1dG9ycy4KKwkKKwkqIFttaXNjL3NoZWxsLmNdCisJRml4ZWQgU2hlbGxBYm91dCgpL0Fib3V0RGlhbG9nUHJvYygpIHRvIHNob3cgdGhlIHJpZ2h0IGljb24uCisKKwkqIFt3aW5kb3dzL2V2ZW50LmNdCisJU21hbGwgaGFjayBmb3Igbm9uLWFscGhhbnVtZXJpYyBrZXlzOiBEb250J3Qgc2VuZCB0aGUgYXNjaWkgdmFsdWUgaW4KKwl0aGUgV01fS0VZRE9XTiBtZXNzYWdlLCBidXQgc29tZSB1bnVzZWQgY29kZSBpbnN0ZWFkLiBTaG91bGQgYmUgZG9uZQorCXByb3Blcmx5IGJ5IHNlbmRpbmcgZGlmZmVyZW50IGNvZGVzIGZvciBlYWNoIGtleS4gVGhlIGVkaXQgY29udHJvbAorCXVzZWQgdG8gZ2V0IGEgVktfREVMRVRFIG1lc3NhZ2UgZWFjaCB0aW1lIHRoZSB1c2VyIHR5cGVkICcuJy4KKworCSogW3dpbmRvd3MvY2xhc3MuY10KKwlSZW1vdmVkIGEgY2hlY2sgZm9yIENTX0dMT0JBTENMQVNTIGluIENMQVNTX0ZpbmRDbGFzc0J5TmFtZSgpLgorCVRoaXMgdXNlZCB0byBiZSBubyBwcm9ibGVtLCBidXQgYnJlYWtzIFJlc291cmNlIFdvcmtzaG9wIGluIDk1MDQwMy4KKwkKKwkqIFtvYmplY3RzL2RpYi5jXQorCU5ldyBkaWFnbm9zdGljIGZvciBhIGJ1ZyBJJ3ZlIGJlZW4gZW5jb3VudGVyaW5nLiBJZiBpdCBzaG93cyB1cCwKKwlwbGVhc2UgcmVwb3J0IGl0LgorCitTdW4gTWF5ICA3IDIzOjExOjE4IEVEVCAxOTk1ICBXaWxsaWFtIE1hZ3JvICh3bWFncm9AdGMuY29ybmVsbC5lZHUpCisKKwkqIFtvYmplY3RzL2NvbG9yLmNdCisJSGFuZGxlIHNpdHVhdGlvbiB3aGVuICdkYycgZXhpc3RzLCBidXQgcGFsZXR0ZSBtYXBwaW5nCisJZG9lcyBub3QuICAoRml4ZXMga2lkcGl4MiBkZW1vLikKKworU3VuIE1heSAgNyAwMzozMjowMCAxOTk1ICBDaGFybGVzIE0uIEhhbm51bSAgKG15Y3JvZnRAbWl0LmVkdSkKKworCSogW2xvYWRlci9sZHQuY10KKwlMRFRfUHJpbnQ6IE9ubHkgc2hvdyB0aGUgbnVtYmVyIG9mIGVudHJpZXMgdGhhdCB0aGUga2VybmVsCisJcmV0dXJuZWQuIE1ha2UgdGhpcyB3b3JrIGZvciBOZXRCU0QuCisKK0ZyaSBNYXkgIDUgMDI6NTM6MjYgMTk5NSAgQ2hhcmxlcyBNLiBIYW5udW0gIChteWNyb2Z0QG1pdC5lZHUpCisKKwkqIFtkZWJ1Z2dlci9kYmcueV0gW2luY2x1ZGUvd2luZS5oXSBbbG9hZGVyL3NpZ25hbC5jXQorCU1vZGlmeSBjcyBhbmQgZHMgc2VsZWN0b3IgdmFsdWVzIGZvciBOZXRCU0QtY3VycmVudC4KKworCSogW2RlYnVnZ2VyL2RlYnVnLmxdCisJJHNwLCAkZXNwOiBVc2UgUk5fRVNQX0FUX1NJR05BTCByYXRoZXIgdGhhbiBSTl9FU1AuCisKKwkqIFtkZWJ1Z2dlci9yZWdwb3MuaF0KKwlNb2RpZnkgc2lnY29udGV4dCBmb3JtYXQgZm9yIE5ldEJTRC1jdXJyZW50LgorCVNDX0VTUDogVXNlIFJOX0VTUF9BVF9TSUdOQUwgcmF0aGVyIHRoYW4gUk5fRVNQLgorCisJKiBbaW5jbHVkZS9sZHQuaF0KKwlTRUxFQ1RPUl9UT19FTlRSWTogRXhwbGljaXRseSBjbGVhciB0aGUgdG9wIGhhbGYgb2YgdGhlIHNlbGVjdG9yCisJdmFsdWUsIHNpbmNlIG9ubHkgMTYgYml0cyBvZiBpdCBtYXkgaGF2ZSBiZWVuIHNhdmVkLgorCisJKiBbbWlzYy93aW5zb2NrZXQuY10KKwlTZXQgc3RydWN0dXJlIHBhY2tpbmcgd2l0aCBgI3ByYWdtYSBwYWNrJyB0byBhY2NvbW9kYXRlCisJb3RoZXIvb2xkZXIgY29tcGlsZXJzLgorCitUdWUgTWF5ICAyIDE4OjE1OjAxIDE5OTUgUGFhbCBCZXllciAoYmV5ZXJAaWR0LnVuaXQubm8pCisJCisJKiBbbWlzYy9jb21tZGxnLmNdCisJRml4ZWQgcGF0aC1uYW1lcyBzbyB3aGVuIGNoYW5naW5nIGRpcmVjdG9yeSB0aGUgbGlzdGJveGVzCisJY2hhbmdlcyB0b28uCisJCisJKiBbZGVidWdnZXIvZGJnLnkgZGVidWdnZXIvZGVidWcubCB3aW5lLmluaV0KKwlBZGRlZCBTeW1ib2xUYWJsZUZpbGUgdG8gd2luZS5pbmkgc28gc3ltYm9scyBjYW4gYmUgcmVhZAorCXdpdGhvdXQgc3RhbmRpbmcgaW4gdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHdpbmUuc3ltLgorCUFkZGVkIHRoZSBwb3NzaWJpbGl0eSB0byBzcGVjaWZ5IGZ1bGwgbmFtZSBvZiB3aW5lLnN5bSBmcm9tCisJdGhlIGRlYnVnZ2VyIHByb21wdC4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogU2F0IEFwciAyOSAyMDo0MjowMSAxOTk1ICBBbGV4YW5kcmUgSnVsbGlhcmQgIChqdWxsaWFyZEBzdW5zaXRlLnVuYy5lZHUpCiAKIAkqIFtjb250cm9scy9zdGF0aWMuY10KZGlmZiAtLWdpdCBhL0ltYWtlZmlsZSBiL0ltYWtlZmlsZQppbmRleCAzM2VlODg3Li40OTI3OThkIDEwMDY0NAotLS0gYS9JbWFrZWZpbGUKKysrIGIvSW1ha2VmaWxlCkBAIC02LDkgKzYsMTEgQEAKIENDID0gZ2NjIC1EX19GcmVlQlNEX18KICNlbmRpZgogCi1ERUZJTkVTID0gQXV0b0RlZmluZXMgLURVU0VfUkVBRExJTkUgLURXSU5FU1RBVAorREVGSU5FUyA9IEF1dG9EZWZpbmVzIC1EVVNFX1JFQURMSU5FCiAjaWZkZWYgX19FTEZfXwotQ0RFQlVHRkxBR1MgPSAtTzIgLVdhbGwgLXN0YXRpYworTEQgPSAvdXNyL2k0ODYtbGludXhhb3V0L2Jpbi9sZCAtbSBpMzg2bGludXgKK0NERUJVR0ZMQUdTID0gLU8yIC1XYWxsIC1iIGk0ODYtbGludXhhb3V0CitBU0ZMQUdTID0gLWIgaTQ4Ni1saW51eGFvdXQKICNlbHNlCiBDREVCVUdGTEFHUyA9IC1PMiAtV2FsbAogI2VuZGlmCkBAIC0yNiw3ICsyOCw3IEBACiAKICNkZWZpbmUgSUhhdmVTdWJkaXJzCiAjZGVmaW5lCVBhc3NDRGVidWdGbGFncyAnQ0RFQlVHRkxBR1M9JChDREVCVUdGTEFHUyknICdDQz0kKENDKScgJ01BS0U9JChNQUtFKSdcCi0JCQknREVGSU5FUz0kKERFRklORVMpJyAnTEQ9JChMRCknCisJCQknREVGSU5FUz0kKERFRklORVMpJyAnTEQ9JChMRCknICdBU0ZMQUdTPSQoQVNGTEFHUyknCiAKIENPTU1PTlNVQkRJUlMgPSBcCiAJY29udHJvbHMgXApkaWZmIC0tZ2l0IGEvUkVBRE1FIGIvUkVBRE1FCmluZGV4IGEwMDcxMTEuLmY5Y2EwMTkgMTAwNjQ0Ci0tLSBhL1JFQURNRQorKysgYi9SRUFETUUKQEAgLTgyLDEwICs4MiwxMSBAQAogCiBVc2VkIHRvIHNwZWNpZnkgdGhlIHBhdGggd2hpY2ggd2lsbCBiZSB1c2VkIHRvIGZpbmQgZXhlY3V0YWJsZXMgYW5kIERMTCdzLgogCi1mb3JtYXQ6IHN5c3RlbXJlc291cmNlcyA9IDxmaWxlbmFtZT4KLWRlZmF1bHQ6IGM6XHRlbXAKK2Zvcm1hdDogc3ltYm9sdGFibGVmaWxlID0gPGZpbGVuYW1lPgorZGVmYXVsdDogd2luZS5zeW0KIAotVXNlZCB0byBzcGVjaWZ5IHRoZSBuYW1lIG9mIHN5c3Jlcy5kbGwsIGEgZGxsIHdoaWNoIGlzIHVzZWQgYnkgV2luZSBpdHNlbGYuCitVc2VkIHRvIHNwZWNpZnkgdGhlIHBhdGggYW5kIGZpbGUgbmFtZSBvZiB0aGUgc3ltYm9sIHRhYmxlIHVzZWQgYnkgdGhlCitidWlsdC1pbiBkZWJ1Z2dlci4KIAogKiBbc2VyaWFscG9ydHNdCiAKZGlmZiAtLWdpdCBhL1JFQURNRS5PRU1BTlNJIGIvUkVBRE1FLk9FTUFOU0kKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyN2I0OWQuLjAwMDAwMDAKLS0tIGEvUkVBRE1FLk9FTUFOU0kKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0KLUluIHRoaXMgZGlyZWN0b3J5IHlvdSBtaWdodCBmaW5kIG15IGltcGxlbWFudGF0aW9uIG9mIHRoZSBXaW5kb3dzCi1TdHJpbmcuICBUaGUgcGF0Y2ggbHN0ci5wYXRjaCBpbmNsdWRlcyB3aGF0cyBuZWVkZWQgZm9yIHRoZSBmb2xsb3dpbmcKLWZ1bmN0aW9uczoKLWxzdHJjYXQsbHN0cmNtcCxsc3RyY21waSxsc3RyY3B5LGxzdHJjcHluLGxzdHJsZW4sQW5zaVVwcGVyLEFuc2lMb3dlciwKLUlzQ2hhckFscGhhLElzQ2hhckFscGhhbnVtZXJpYyxJc0NoYXJVcHBlcixJc0NoYXJMb3dlcixBbnNpVXBwZXJCdWZmLAotQW5zaUxvd2VyQnVmZixBbnNpTmV4dCxBbnNpUHJldi4gU2ltcGx5IGFwcGx5IHRoZSBwYXRjaCB0byBXaW5lLjAuNC4xCi1hbmQgcmVtYWtlLgotCi0KLUFsc28gdGhlcmUgc2hvdWxkIGJlIHRoZSBmaWxlcyBvZW0yYW5zaS50cmwgYW5kIGFuc2kyb2VtLnRybCB0aGF0Ci1kZWZpbmUgaG93IHRvIHRyYW5zbGF0ZSBiZXR3ZWVuIGFuc2kgYW5kIG9lbSBjb2RlcGFnZSA4NjEgSSBiZWxpZXZlCi10aGV5IGNhbGwgaXQuIFRoZXNlIGZpbGVzIHdoZXJlIGNyZWF0ZWQgYnkgdGhlIFdpbmRvd3MgcHJvZ3JhbQotb2VtYW5zaS5leGUgd2hpY2ggaXMgYWxzbyBpbmNsdWRlZC4gVG8gZ2V0IHRoZSBvZW08LT5hbnNpIHRyYW5zbGF0aW9ucwotcmlnaHQgZm9yIHlvdXIgcGFydCBvZiB0aGUgd29ybGQganVzdCBydW4gb2VtYW5zaSB1bmRlciBXaW5kb3dzIG5vdAotV2luZSBhbmQgb2VtYW5zaSB3aWxsIGNyZWF0ZSBvZW0yYW5zaSBhbmQgYW5zaTJvZW0gZm9yIHlvdXIgbG9jYWxlCi10aGF0IGlzIGlmIHlvdXIgV2luZG93cy9Eb3MgaXMgc2V0IHVwIGNvcnJlY3RseS4gTW92ZSB0aGUgLnRybCBmaWxlcwotaW50byB0aGUgZGlyZWN0b3J5IGZyb20gd2hlcmUgeW91IHJ1biB3aW5lLiBJZiBXaW5lIGRvZXMgbm90IGZpbmQgdGhlCi0qLnRybCBpbiB0aGUgY3VycmVudCBkaXJlY3RvcnkgQW5zaVRvT2VtIGFuZCBPZW1Ub0Fuc2kgd2lsbCBiZQotcGFzc2l2ZS4KLQotU2hvcnRjb21pbmdzL0J1Z3M6IAotU29tZSBmdW5jdGlvbnMgZGVwZW5kIHVwb24gbGliYyBmdW5jdGlvbnMgbGlrZSB0b3VwcGVyLCB0b2xvd2VyIGFuZAotaXNhbHBoYSB0aGF0LCBhcyBmYXIgYXMgSSBrbm93LCBhcmUgdG90YWxseSB3aXRob3V0IHN1cHBvcnQgZm9yIE5MUwotYW5kIElTTyA4ODU5LTEuICBEZWZhdWx0IEFuc2k8LT5PRU0gdHJhbnNsYXRpb25zIHdoZW4gKi50cmwgZmlsZXMgYXJlCi1ub3QgZm91bmQgYXJlIG1pc3NpbmcuCi0KLQotTk9URTogUGxlYXNlIGRvbid0IHJ1biBvZW1hbnNpLmV4ZSB1bmRlciB3aW5lLgpkaWZmIC0tZ2l0IGEvY29udHJvbHMvYnV0dG9uLmMgYi9jb250cm9scy9idXR0b24uYwppbmRleCBjMjFkMjIyLi42M2ZhZTA4IDEwMDY0NAotLS0gYS9jb250cm9scy9idXR0b24uYworKysgYi9jb250cm9scy9idXR0b24uYwpAQCAtMywxOSArMywxNSBAQAogICogQ29weXJpZ2h0IChDKSAxOTkzIEpvaGFubmVzIFJ1c2NoZWluc2tpCiAgKiBDb3B5cmlnaHQgKEMpIDE5OTMgRGF2aWQgTWV0Y2FsZmUKICAqIENvcHlyaWdodCAoQykgMTk5NCBBbGV4YW5kcmUgSnVsbGlhcmQKLQotc3RhdGljIGNoYXIgQ29weXJpZ2h0MVtdID0gIkNvcHlyaWdodCBKb2hhbm5lcyBSdXNjaGVpbnNraSwgMTk5MyI7Ci1zdGF0aWMgY2hhciBDb3B5cmlnaHQyW10gPSAiQ29weXJpZ2h0IERhdmlkIE1ldGNhbGZlLCAxOTkzIjsKLXN0YXRpYyBjaGFyIENvcHlyaWdodDNbXSA9ICJDb3B5cmlnaHQgQWxleGFuZHJlIEp1bGxpYXJkLCAxOTk0IjsKLSovCisgKi8KIAogI2luY2x1ZGUgIndpbi5oIgogI2luY2x1ZGUgInVzZXIuaCIKICNpbmNsdWRlICJzeXNjb2xvci5oIgogI2luY2x1ZGUgImdyYXBoaWNzLmgiCiAjaW5jbHVkZSAiYnV0dG9uLmgiCi0jaW5jbHVkZSAic3RkZGVidWcuaCIKLSNpbmNsdWRlICJkZWJ1Zy5oIgorI2luY2x1ZGUgInN0YWNrZnJhbWUuaCIKKwogZXh0ZXJuIHZvaWQgREVGV05EX1NldFRleHQoIEhXTkQgaHduZCwgTFBTVFIgdGV4dCApOyAgLyogd2luZG93cy9kZWZ3bmQuYyAqLwogCiBzdGF0aWMgdm9pZCBQQl9QYWludCggSFdORCBoV25kLCBIREMgaERDLCBXT1JEIGFjdGlvbiApOwpAQCAtNDc3LDI2ICs0NzMsMjAgQEAKIAogc3RhdGljIHZvaWQgT0JfUGFpbnQoIEhXTkQgaFduZCwgSERDIGhEQywgV09SRCBhY3Rpb24gKQogewotICAgIEhBTkRMRQloRGlzOwotICAgIExQRFJBV0lURU1TVFJVQ1QgbHBkaXM7CisgICAgRFJBV0lURU1TVFJVQ1QgZGlzOwogICAgIFdORCAqd25kUHRyID0gV0lOX0ZpbmRXbmRQdHIoIGhXbmQgKTsKICAgICBCVVRUT05JTkZPICppbmZvUHRyID0gKEJVVFRPTklORk8gKil3bmRQdHItPndFeHRyYTsKIAotICAgIGlmICghKGhEaXMgPSBVU0VSX0hFQVBfQUxMT0MoIHNpemVvZihEUkFXSVRFTVNUUlVDVCkgKSkpIHJldHVybjsKLSAgICBscGRpcyA9IChMUERSQVdJVEVNU1RSVUNUKVVTRVJfSEVBUF9MSU5fQUREUihoRGlzKTsKLSAgICBscGRpcy0+Q3RsVHlwZSAgICA9IE9EVF9CVVRUT047Ci0gICAgbHBkaXMtPkN0bElEICAgICAgPSB3bmRQdHItPndJRG1lbnU7Ci0gICAgbHBkaXMtPml0ZW1JRCAgICAgPSAwOwotICAgIGxwZGlzLT5pdGVtQWN0aW9uID0gYWN0aW9uOwotICAgIGxwZGlzLT5pdGVtU3RhdGUgID0gKGluZm9QdHItPnN0YXRlICYgQlVUVE9OX0hBU0ZPQ1VTKSA/IE9EU19GT0NVUyA6IDAgfAorICAgIGRpcy5DdGxUeXBlICAgID0gT0RUX0JVVFRPTjsKKyAgICBkaXMuQ3RsSUQgICAgICA9IHduZFB0ci0+d0lEbWVudTsKKyAgICBkaXMuaXRlbUlEICAgICA9IDA7CisgICAgZGlzLml0ZW1BY3Rpb24gPSBhY3Rpb247CisgICAgZGlzLml0ZW1TdGF0ZSAgPSAoaW5mb1B0ci0+c3RhdGUgJiBCVVRUT05fSEFTRk9DVVMpID8gT0RTX0ZPQ1VTIDogMCB8CiAgICAgICAgICAgICAgICAgICAgICAoaW5mb1B0ci0+c3RhdGUgJiBCVVRUT05fSElHSExJR0hURUQpID8gT0RTX1NFTEVDVEVEIDogMCB8CiAgICAgICAgICAgICAgICAgICAgICAod25kUHRyLT5kd1N0eWxlICYgV1NfRElTQUJMRUQpID8gT0RTX0RJU0FCTEVEIDogMDsKLSAgICBscGRpcy0+aHduZEl0ZW0gICA9IGhXbmQ7Ci0gICAgbHBkaXMtPmhEQyAgICAgICAgPSBoREM7Ci0gICAgR2V0Q2xpZW50UmVjdCggaFduZCwgJmxwZGlzLT5yY0l0ZW0gKTsKLSAgICBscGRpcy0+aXRlbURhdGEgICA9IDA7Ci0gICAgU2VuZE1lc3NhZ2UoR2V0UGFyZW50KGhXbmQpLCBXTV9EUkFXSVRFTSwgMSwgVVNFUl9IRUFQX1NFR19BRERSKGhEaXMpICk7Ci0gICAgVVNFUl9IRUFQX0ZSRUUoaERpcyk7CisgICAgZGlzLmh3bmRJdGVtICAgPSBoV25kOworICAgIGRpcy5oREMgICAgICAgID0gaERDOworICAgIEdldENsaWVudFJlY3QoIGhXbmQsICZkaXMucmNJdGVtICk7CisgICAgZGlzLml0ZW1EYXRhICAgPSAwOworICAgIFNlbmRNZXNzYWdlKEdldFBhcmVudChoV25kKSwgV01fRFJBV0lURU0sIDEsIE1BS0VfU0VHUFRSKCZkaXMpICk7CiB9Ci0KLQpkaWZmIC0tZ2l0IGEvY29udHJvbHMvY29tYm8uYyBiL2NvbnRyb2xzL2NvbWJvLmMKaW5kZXggZjYxZDhlNC4uMzQxMTFkNyAxMDA2NDQKLS0tIGEvY29udHJvbHMvY29tYm8uYworKysgYi9jb250cm9scy9jb21iby5jCkBAIC0xLDEwICsxLDEwIEBACiAvKgotICogSW50ZXJmYWNlIGNvZGUgdG8gQ09NQk9CT1ggd2lkZ2V0Ci0gKgotICogQ29weXJpZ2h0ICBNYXJ0aW4gQXlvdHRlLCAxOTkzCi0gKgotc3RhdGljIGNoYXIgQ29weXJpZ2h0W10gPSAiQ29weXJpZ2h0IE1hcnRpbiBBeW90dGUsIDE5OTMiOwotKi8KKyAqIENvbWJvIGNvbnRyb2xzCisgKiAKKyAqIENvcHlyaWdodCAxOTkzIE1hcnRpbiBBeW90dGUKKyAqIENvcHlyaWdodCAxOTk1IEJlcm5kIFNjaG1pZHQKKyAqIAorICovCiAKICNpbmNsdWRlIDxzdGRpby5oPgogI2luY2x1ZGUgPHN0ZGxpYi5oPgpAQCAtMTIsNiArMTIsNyBAQAogI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CiAKICNpbmNsdWRlICJ3aW5kb3dzLmgiCisjaW5jbHVkZSAic3lzbWV0cmljcy5oIgogI2luY2x1ZGUgImNvbWJvLmgiCiAjaW5jbHVkZSAidXNlci5oIgogI2luY2x1ZGUgIndpbi5oIgpAQCAtMTksNDk4ICsyMCwxMDEwIEBACiAvKiAjZGVmaW5lIERFQlVHX0NPTUJPICovCiAjaW5jbHVkZSAiZGVidWcuaCIKICNpbmNsdWRlICJncmFwaGljcy5oIgorI2luY2x1ZGUgImxpc3Rib3guaCIKKyNpbmNsdWRlICJkb3NfZnMuaCIKIAotSEJJVE1BUCBoQ29tYm9CaXQgPSAwOworIC8qCisgICogTm90ZTogQ29tYm9zIGFyZSBwcm9iYWJseSBpbXBsZW1lbnRlZCBpbiBhIGRpZmZlcmVudCB3YXkgYnkgV2luZG93cy4KKyAgKiBVc2luZyBhIG1lc3NhZ2Ugc3B5IGZvciBXaW5kb3dzLCB5b3UgY2FuIHNlZSBzb21lIHVuZG9jdW1lbnRlZAorICAqIG1lc3NhZ2VzIGJlaW5nIHBhc3NlZCBiZXR3ZWVuIENvbWJvQm94IGFuZCBDb21ib0xCb3guCisgICogSSBob3BlIG5vIHByb2dyYW1zIHJlbHkgb24gdGhlIGltcGxlbWVudGF0aW9uIG9mIGNvbWJvcy4KKyAgKi8KIAotTFBIRUFEQ09NQk8gQ29tYm9HZXRTdG9yYWdlSGVhZGVyKEhXTkQgaHduZCk7Ci1pbnQgQ3JlYXRlQ29tYm9TdHJ1Y3QoSFdORCBod25kKTsKLXZvaWQgQ29tYm9Cb3hTdGF0aWNPd25lckRyYXcoSFdORCBoV25kLCBMUEhFQURDT01CTyBscGhjKTsKK3N0YXRpYyBMT05HIENCTkNDcmVhdGUoIEhXTkQgaHduZCwgV09SRCBtZXNzYWdlLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0gKTsKK3N0YXRpYyBMT05HIENCQ3JlYXRlKCBIV05EIGh3bmQsIFdPUkQgbWVzc2FnZSwgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtICk7CitzdGF0aWMgTE9ORyBDQkdldERsZ0NvZGUoIEhXTkQgaHduZCwgV09SRCBtZXNzYWdlLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0gKTsKK3N0YXRpYyBMT05HIENCRGVzdHJveSggSFdORCBod25kLCBXT1JEIG1lc3NhZ2UsIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSApOworc3RhdGljIExPTkcgQ0JQYWludCggSFdORCBod25kLCBXT1JEIG1lc3NhZ2UsIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSApOworc3RhdGljIExPTkcgQ0JLZXlEb3duKCBIV05EIGh3bmQsIFdPUkQgbWVzc2FnZSwgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtICk7CitzdGF0aWMgTE9ORyBDQkNoYXIoIEhXTkQgaHduZCwgV09SRCBtZXNzYWdlLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0gKTsKK3N0YXRpYyBMT05HIENCU2V0Rm9udCggSFdORCBod25kLCBXT1JEIG1lc3NhZ2UsIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSApOworc3RhdGljIExPTkcgQ0JTZXRSZWRyYXcoIEhXTkQgaHduZCwgV09SRCBtZXNzYWdlLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0gKTsKK3N0YXRpYyBMT05HIENCTEJ1dHRvbkRvd24oIEhXTkQgaHduZCwgV09SRCBtZXNzYWdlLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0gKTsKK3N0YXRpYyBMT05HIENCU2V0Rm9jdXMoIEhXTkQgaHduZCwgV09SRCBtZXNzYWdlLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0gKTsKK3N0YXRpYyBMT05HIENCS2lsbEZvY3VzKCBIV05EIGh3bmQsIFdPUkQgbWVzc2FnZSwgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtICk7CitzdGF0aWMgTE9ORyBDQlJlc2V0Q29udGVudCggSFdORCBod25kLCBXT1JEIG1lc3NhZ2UsIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSApOworc3RhdGljIExPTkcgQ0JEaXIoIEhXTkQgaHduZCwgV09SRCBtZXNzYWdlLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0gKTsKK3N0YXRpYyBMT05HIENCQWRkU3RyaW5nKCBIV05EIGh3bmQsIFdPUkQgbWVzc2FnZSwgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtICk7CitzdGF0aWMgTE9ORyBDQkdldExCVGV4dCggSFdORCBod25kLCBXT1JEIG1lc3NhZ2UsIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSApOworc3RhdGljIExPTkcgQ0JJbnNlcnRTdHJpbmcoIEhXTkQgaHduZCwgV09SRCBtZXNzYWdlLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0gKTsKK3N0YXRpYyBMT05HIENCRGVsZXRlU3RyaW5nKCBIV05EIGh3bmQsIFdPUkQgbWVzc2FnZSwgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtICk7CitzdGF0aWMgTE9ORyBDQkZpbmRTdHJpbmcoIEhXTkQgaHduZCwgV09SRCBtZXNzYWdlLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0gKTsKK3N0YXRpYyBMT05HIENCR2V0Q291bnQoIEhXTkQgaHduZCwgV09SRCBtZXNzYWdlLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0gKTsKK3N0YXRpYyBMT05HIENCR2V0Q3VyU2VsKCBIV05EIGh3bmQsIFdPUkQgbWVzc2FnZSwgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtICk7CitzdGF0aWMgTE9ORyBDQkdldEl0ZW1EYXRhKCBIV05EIGh3bmQsIFdPUkQgbWVzc2FnZSwgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtICk7CitzdGF0aWMgTE9ORyBDQkdldEl0ZW1IZWlnaHQoIEhXTkQgaHduZCwgV09SRCBtZXNzYWdlLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0gKTsKK3N0YXRpYyBMT05HIENCR2V0TEJUZXh0TGVuKCBIV05EIGh3bmQsIFdPUkQgbWVzc2FnZSwgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtICk7CitzdGF0aWMgTE9ORyBDQlNlbGVjdFN0cmluZyggSFdORCBod25kLCBXT1JEIG1lc3NhZ2UsIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSApOworc3RhdGljIExPTkcgQ0JTZXRJdGVtRGF0YSggSFdORCBod25kLCBXT1JEIG1lc3NhZ2UsIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSApOworc3RhdGljIExPTkcgQ0JTZXRDdXJTZWwoIEhXTkQgaHduZCwgV09SRCBtZXNzYWdlLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0gKTsKK3N0YXRpYyBMT05HIENCU2V0SXRlbUhlaWdodCggSFdORCBod25kLCBXT1JEIG1lc3NhZ2UsIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSApOworc3RhdGljIExPTkcgQ0JTaG93RHJvcERvd24oIEhXTkQgaHduZCwgV09SRCBtZXNzYWdlLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0gKTsKKworc3RhdGljIExPTkcgQ0JMQ3JlYXRlKCBIV05EIGh3bmQsIFdPUkQgbWVzc2FnZSwgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtICk7CitzdGF0aWMgTE9ORyBDQkxHZXREbGdDb2RlKCBIV05EIGh3bmQsIFdPUkQgbWVzc2FnZSwgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtICk7CitzdGF0aWMgTE9ORyBDQkxLZXlEb3duKCBIV05EIGh3bmQsIFdPUkQgbWVzc2FnZSwgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtICk7CitzdGF0aWMgTE9ORyBDQkxDaGFyKCBIV05EIGh3bmQsIFdPUkQgbWVzc2FnZSwgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtICk7CitzdGF0aWMgTE9ORyBDQkxQYWludCggSFdORCBod25kLCBXT1JEIG1lc3NhZ2UsIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSApOworc3RhdGljIExPTkcgQ0JMS2lsbEZvY3VzKCBIV05EIGh3bmQsIFdPUkQgbWVzc2FnZSwgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtICk7CitzdGF0aWMgTE9ORyBDQkxBY3RpdmF0ZSggSFdORCBod25kLCBXT1JEIG1lc3NhZ2UsIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSApOworc3RhdGljIExPTkcgQ0JMTEJ1dHRvbkRvd24oIEhXTkQgaHduZCwgV09SRCBtZXNzYWdlLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0gKTsKK3N0YXRpYyBMT05HIENCTExCdXR0b25VcCggSFdORCBod25kLCBXT1JEIG1lc3NhZ2UsIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSApOworc3RhdGljIExPTkcgQ0JMTW91c2VNb3ZlKCBIV05EIGh3bmQsIFdPUkQgbWVzc2FnZSwgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtICk7CitzdGF0aWMgTE9ORyBDQkxWU2Nyb2xsKCBIV05EIGh3bmQsIFdPUkQgbWVzc2FnZSwgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtICk7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgV09SRCAgIG1lc3NhZ2U7CisgIExPTkcgICgqaGFuZGxlcikoSFdORCwgV09SRCwgV1BBUkFNLCBMUEFSQU0pOworfSBtc2dfdGJsOworCitzdGF0aWMgbXNnX3RibCBjb21ib190YmxbXSA9IHsKKyAge1dNX05DQ1JFQVRFLCBDQk5DQ3JlYXRlfSwKKyAge1dNX0NSRUFURSwgQ0JDcmVhdGV9LAorICB7V01fREVTVFJPWSwgQ0JEZXN0cm95fSwKKyAge1dNX0dFVERMR0NPREUsIENCR2V0RGxnQ29kZX0sCisgIHtXTV9LRVlET1dOLCBDQktleURvd259LAorICB7V01fQ0hBUiwgQ0JDaGFyfSwKKyAge1dNX1NFVEZPTlQsIENCU2V0Rm9udH0sCisgIHtXTV9TRVRSRURSQVcsIENCU2V0UmVkcmF3fSwKKyAge1dNX1BBSU5ULCBDQlBhaW50fSwKKyAge1dNX0xCVVRUT05ET1dOLCBDQkxCdXR0b25Eb3dufSwKKyAge1dNX1NFVEZPQ1VTLCBDQlNldEZvY3VzfSwKKyAge1dNX0tJTExGT0NVUywgQ0JLaWxsRm9jdXN9LAorICB7Q0JfUkVTRVRDT05URU5ULCBDQlJlc2V0Q29udGVudH0sCisgIHtDQl9ESVIsIENCRGlyfSwKKyAge0NCX0FERFNUUklORywgQ0JBZGRTdHJpbmd9LAorICB7Q0JfSU5TRVJUU1RSSU5HLCBDQkluc2VydFN0cmluZ30sCisgIHtDQl9ERUxFVEVTVFJJTkcsIENCRGVsZXRlU3RyaW5nfSwKKyAge0NCX0ZJTkRTVFJJTkcsIENCRmluZFN0cmluZ30sCisgIHtDQl9HRVRDT1VOVCwgQ0JHZXRDb3VudH0sCisgIHtDQl9HRVRDVVJTRUwsIENCR2V0Q3VyU2VsfSwKKyAge0NCX0dFVElURU1EQVRBLCBDQkdldEl0ZW1EYXRhfSwKKyAge0NCX0dFVElURU1IRUlHSFQsIENCR2V0SXRlbUhlaWdodH0sCisgIHtDQl9HRVRMQlRFWFQsIENCR2V0TEJUZXh0fSwKKyAge0NCX0dFVExCVEVYVExFTiwgQ0JHZXRMQlRleHRMZW59LAorICB7Q0JfU0VMRUNUU1RSSU5HLCBDQlNlbGVjdFN0cmluZ30sCisgIHtDQl9TRVRJVEVNREFUQSwgQ0JTZXRJdGVtRGF0YX0sCisgIHtDQl9TRVRDVVJTRUwsIENCU2V0Q3VyU2VsfSwKKyAge0NCX1NFVElURU1IRUlHSFQsIENCU2V0SXRlbUhlaWdodH0sCisgIHtDQl9TSE9XRFJPUERPV04sIENCU2hvd0Ryb3BEb3dufQorICAgIAorfTsKKworc3RhdGljIG1zZ190YmwgY2xib3hfdGJsW10gPSB7CisgIHtXTV9DUkVBVEUsIENCTENyZWF0ZX0sCisgIHtXTV9HRVRETEdDT0RFLCBDQkxHZXREbGdDb2RlfSwKKyAge1dNX0tFWURPV04sIENCTEtleURvd259LAorICB7V01fQ0hBUiwgQ0JMQ2hhcn0sCisgIHtXTV9QQUlOVCwgQ0JMUGFpbnR9LAorICB7V01fS0lMTEZPQ1VTLCBDQkxLaWxsRm9jdXN9LAorICB7V01fQUNUSVZBVEUsIENCTEFjdGl2YXRlfSwKKyAge1dNX0xCVVRUT05ET1dOLCBDQkxMQnV0dG9uRG93bn0sCisgIHtXTV9MQlVUVE9OVVAsIENCTExCdXR0b25VcH0sCisgIHtXTV9NT1VTRU1PVkUsIENCTE1vdXNlTW92ZX0sCisgIHtXTV9WU0NST0xMLCBDQkxWU2Nyb2xsfQorfTsKKworc3RhdGljIEhCSVRNQVAgaENvbWJvQml0ID0gMDsKK3N0YXRpYyBXT1JEIENCaXRIZWlnaHQsIENCaXRXaWR0aDsKKworc3RhdGljIGludCBDT01CT19Jbml0KCkKK3sKKyAgQklUTUFQIGJtOworICAKKyAgZHByaW50Zl9jb21ibyhzdGRkZWIsICJDT01CT19Jbml0XG4iKTsKKyAgaENvbWJvQml0ID0gTG9hZEJpdG1hcCgwLCBNQUtFSU5UUkVTT1VSQ0UoT0JNX0NPTUJPKSk7CisgIEdldE9iamVjdChoQ29tYm9CaXQsIHNpemVvZihCSVRNQVApLCAoTFBTVFIpJmJtKTsKKyAgQ0JpdEhlaWdodCA9IGJtLmJtSGVpZ2h0OworICBDQml0V2lkdGggPSBibS5ibVdpZHRoOworICByZXR1cm4gMDsKK30KKworTFBIRUFEQ09NQk8gQ29tYm9HZXRTdG9yYWdlSGVhZGVyKEhXTkQgaHduZCkKK3sKKyAgcmV0dXJuIChMUEhFQURDT01CTylHZXRXaW5kb3dMb25nKGh3bmQsNCk7Cit9CisKK0xQSEVBRExJU1QgQ29tYm9HZXRMaXN0SGVhZGVyKEhXTkQgaHduZCkKK3sKKyAgcmV0dXJuIChMUEhFQURMSVNUKUdldFdpbmRvd0xvbmcoaHduZCwwKTsKK30KKworaW50IENyZWF0ZUNvbWJvU3RydWN0KEhXTkQgaHduZCwgTE9ORyBzdHlsZSkKK3sKKyAgTFBIRUFEQ09NQk8gbHBoYzsKKworICBscGhjID0gKExQSEVBRENPTUJPKW1hbGxvYyhzaXplb2YoSEVBRENPTUJPKSk7CisgIFNldFdpbmRvd0xvbmcoaHduZCw0LChMT05HKWxwaGMpOworICBscGhjLT5oV25kRWRpdCA9IDA7CisgIGxwaGMtPmhXbmRMQm94ID0gMDsKKyAgbHBoYy0+ZHdTdGF0ZSA9IDA7CisgIGxwaGMtPkxhc3RTZWwgPSAtMTsKKyAgbHBoYy0+ZHdTdHlsZSA9IHN0eWxlOworICBscGhjLT5Ecm9wRG93blZpc2libGUgPSBGQUxTRTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3ZvaWQgQ29tYm9VcGRhdGVXaW5kb3coSFdORCBod25kLCBMUEhFQURMSVNUIGxwaGwsIExQSEVBRENPTUJPIGxwaGMsIEJPT0wgcmVwYWludCkKK3sKKyAgU2V0U2Nyb2xsUmFuZ2UobHBoYy0+aFduZExCb3gsIFNCX1ZFUlQsIDAsIExpc3RNYXhGaXJzdFZpc2libGUobHBobCksIFRSVUUpOworICBpZiAocmVwYWludCAmJiBscGhsLT5iUmVkcmF3RmxhZykgeworICAgIEludmFsaWRhdGVSZWN0KGh3bmQsIE5VTEwsIFRSVUUpOworICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIENCTkNDcmVhdGUKKyAqLworc3RhdGljIExPTkcgQ0JOQ0NyZWF0ZShIV05EIGh3bmQsIFdPUkQgbWVzc2FnZSwgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtKQoreworICBDUkVBVEVTVFJVQ1QgKmNyZWF0ZVN0cnVjdDsKKworICBpZiAoIWhDb21ib0JpdCkgQ09NQk9fSW5pdCgpOworCisgIGNyZWF0ZVN0cnVjdCA9IChDUkVBVEVTVFJVQ1QgKilQVFJfU0VHX1RPX0xJTihsUGFyYW0pOworICBjcmVhdGVTdHJ1Y3QtPnN0eWxlICY9IH4oV1NfVlNDUk9MTCB8IFdTX0hTQ1JPTEwpOworICBTZXRXaW5kb3dMb25nKGh3bmQsIEdXTF9TVFlMRSwgY3JlYXRlU3RydWN0LT5zdHlsZSk7CisKKyAgZHByaW50Zl9jb21ibyhzdGRkZWIsIkNvbWJvQm94IFdNX05DQ1JFQVRFIVxuIik7CisgIHJldHVybiBEZWZXaW5kb3dQcm9jKGh3bmQsIG1lc3NhZ2UsIHdQYXJhbSwgbFBhcmFtKTsKKworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBDQkNyZWF0ZQorICovCitzdGF0aWMgTE9ORyBDQkNyZWF0ZShIV05EIGh3bmQsIFdPUkQgbWVzc2FnZSwgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtKQoreworICBMUEhFQURMSVNUICAgbHBobDsKKyAgTFBIRUFEQ09NQk8gIGxwaGM7CisgIExPTkcgICAgICAgICBzdHlsZSA9IDA7CisgIExPTkcgICAgICAgICBjc3R5bGUgPSBHZXRXaW5kb3dMb25nKGh3bmQsR1dMX1NUWUxFKTsKKyAgUkVDVCAgICAgICAgIHJlY3QsbGJveHJlY3Q7CisKKyAgLyogdHJhbnNsYXRlIGNvbWJvIGludG8gbGlzdGJveCBzdHlsZXMgKi8KKyAgaWYgKGNzdHlsZSAmIENCU19PV05FUkRSQVdGSVhFRCkgc3R5bGUgfD0gTEJTX09XTkVSRFJBV0ZJWEVEOworICBpZiAoY3N0eWxlICYgQ0JTX09XTkVSRFJBV1ZBUklBQkxFKSBzdHlsZSB8PSBMQlNfT1dORVJEUkFXVkFSSUFCTEU7CisgIGlmIChjc3R5bGUgJiBDQlNfU09SVCkgc3R5bGUgfD0gTEJTX1NPUlQ7CisgIGlmIChjc3R5bGUgJiBDQlNfSEFTU1RSSU5HUykgc3R5bGUgfD0gTEJTX0hBU1NUUklOR1M7CisgIHN0eWxlIHw9IExCU19OT1RJRlk7CisgIENyZWF0ZUxpc3RCb3hTdHJ1Y3QoaHduZCwgT0RUX0NPTUJPQk9YLCBzdHlsZSwgR2V0UGFyZW50KGh3bmQpKTsKKyAgQ3JlYXRlQ29tYm9TdHJ1Y3QoaHduZCxjc3R5bGUpOworICBscGhsID0gQ29tYm9HZXRMaXN0SGVhZGVyKGh3bmQpOworICBscGhjID0gQ29tYm9HZXRTdG9yYWdlSGVhZGVyKGh3bmQpOworCisgIEdldENsaWVudFJlY3QoaHduZCwmcmVjdCk7CisgIEdldFdpbmRvd1JlY3QoaHduZCwmbGJveHJlY3QpOworICAvKiBGSVhNRTogY29tYm9zIHdpdGggZWRpdCBjb250cm9scyBhcmUgYnJva2VuLiAqLworICBzd2l0Y2goY3N0eWxlICYgMykgeworICAgY2FzZSBDQlNfU0lNUExFOiAgICAgICAgICAgIC8qIGVkaXQgY29udHJvbCwgbGlzdCBhbHdheXMgdmlzaWJsZSAgKi8KKyAgICBkcHJpbnRmX2NvbWJvKHN0ZGRlYiwiQ0JTX1NJTVBMRVxuIik7CisgICAgU2V0UmVjdEVtcHR5KCZscGhjLT5SZWN0QnV0dG9uKTsKKyAgICBscGhjLT5MQm94VG9wID0gbHBobC0+U3RkSXRlbUhlaWdodDsKKyAgICBscGhjLT5oV25kRWRpdCA9IENyZWF0ZVdpbmRvdygiRURJVCIsICIiLCAKKwkJCQkgIFdTX0NISUxEIHwgV1NfQ0xJUENISUxEUkVOIHwgV1NfVklTSUJMRSB8IFNTX0xFRlQsCisJCQkJICAwLCAwLCByZWN0LnJpZ2h0LCBscGhsLT5TdGRJdGVtSGVpZ2h0LAorCQkJCSAgaHduZCwgMSwgR2V0V2luZG93V29yZChod25kLEdXV19ISU5TVEFOQ0UpLCAwTCk7CisgICAgYnJlYWs7CisgICBjYXNlIENCU19EUk9QRE9XTjogICAgICAgICAgLyogZWRpdCBjb250cm9sLCBkcm9wZG93biBsaXN0Ym94ICAgICAqLworICAgIGRwcmludGZfY29tYm8oc3RkZGViLCJDQlNfRFJPUERPV05cbiIpOworICAgIGxwaGMtPlJlY3RCdXR0b24gPSByZWN0OworICAgIGxwaGMtPlJlY3RCdXR0b24ubGVmdCA9IGxwaGMtPlJlY3RCdXR0b24ucmlnaHQgLSA2IC0gQ0JpdFdpZHRoOworICAgIGxwaGMtPlJlY3RCdXR0b24uYm90dG9tID0gbHBoYy0+UmVjdEJ1dHRvbi50b3AgKyBscGhsLT5TdGRJdGVtSGVpZ2h0OworICAgIGxwaGMtPkxCb3hUb3AgPSBscGhsLT5TdGRJdGVtSGVpZ2h0OworICAgIFNldFdpbmRvd1Bvcyhod25kLCAwLCAwLCAwLCByZWN0LnJpZ2h0IC0gcmVjdC5sZWZ0ICsgMipTWVNNRVRSSUNTX0NYQk9SREVSLAorCQkgbHBobC0+U3RkSXRlbUhlaWdodCArIDIqU1lTTUVUUklDU19DWUJPUkRFUiwKKwkJIFNXUF9OT01PVkUgfCBTV1BfTk9aT1JERVIpOworICAgIGxwaGMtPmhXbmRFZGl0ID0gQ3JlYXRlV2luZG93KCJFRElUIiwgIiIsCisJCQkJICBXU19DSElMRCB8IFdTX0NMSVBDSElMRFJFTiB8IFdTX1ZJU0lCTEUgfCBTU19MRUZULAorCQkJCSAgMCwgMCwgbHBoYy0+UmVjdEJ1dHRvbi5sZWZ0LCBscGhsLT5TdGRJdGVtSGVpZ2h0LAorCQkJCSAgaHduZCwgMSwgR2V0V2luZG93V29yZChod25kLEdXV19ISU5TVEFOQ0UpLCAwTCk7CisgICAgYnJlYWs7CisgICBjYXNlIENCU19EUk9QRE9XTkxJU1Q6ICAgICAgLyogc3RhdGljIGNvbnRyb2wsIGRvd25kb3duIGxpc3Rib3ggICAqLworICAgIGRwcmludGZfY29tYm8oc3RkZGViLCJDQlNfRFJPUERPV05MSVNUXG4iKTsKKyAgICBscGhjLT5SZWN0QnV0dG9uID0gcmVjdDsKKyAgICBscGhjLT5SZWN0QnV0dG9uLmxlZnQgPSBscGhjLT5SZWN0QnV0dG9uLnJpZ2h0IC0gNiAtIENCaXRXaWR0aDsKKyAgICBscGhjLT5SZWN0QnV0dG9uLmJvdHRvbSA9IGxwaGMtPlJlY3RCdXR0b24udG9wICsgbHBobC0+U3RkSXRlbUhlaWdodDsKKyAgICBscGhjLT5MQm94VG9wID0gbHBobC0+U3RkSXRlbUhlaWdodDsKKyAgICBTZXRXaW5kb3dQb3MoaHduZCwgMCwgMCwgMCwgcmVjdC5yaWdodCAtIHJlY3QubGVmdCArIDIqU1lTTUVUUklDU19DWEJPUkRFUiwKKwkJIGxwaGwtPlN0ZEl0ZW1IZWlnaHQgKyAyKlNZU01FVFJJQ1NfQ1lCT1JERVIsCisJCSBTV1BfTk9NT1ZFIHwgU1dQX05PWk9SREVSKTsKKyAgICBicmVhazsKKyAgfQorICBsYm94cmVjdC50b3AgKz0gbHBoYy0+TEJveFRvcDsKKyAgLyogRklYTUU6IFdpblNpZ2h0IHNheXMgdGhlc2Ugc2hvdWxkIGJlIENISUxEIHdpbmRvd3Mgd2l0aCB0aGUgVE9QTU9TVCBmbGFnCisgICAqIHNldC4gV2luZSBkb2Vzbid0IHN1cHBvcnQgVE9QTU9TVCwgYW5kIHNpbXBseSBzZXR0aW5nIHRoZSBXU19DSElMRAorICAgKiBmbGFnIGRvZXNuJ3Qgd29yay4gKi8KKyAgbHBoYy0+aFduZExCb3ggPSBDcmVhdGVXaW5kb3coIkNPTUJPTEJPWCIsICIiLCAKKwkJCQlXU19QT1BVUCB8IFdTX0JPUkRFUiB8IFdTX1ZTQ1JPTEwsCisJCQkJbGJveHJlY3QubGVmdCwgbGJveHJlY3QudG9wLAorCQkJCWxib3hyZWN0LnJpZ2h0IC0gbGJveHJlY3QubGVmdCwgCisJCQkJbGJveHJlY3QuYm90dG9tIC0gbGJveHJlY3QudG9wLAorCQkJCTAsIDAsIEdldFdpbmRvd1dvcmQoaHduZCxHV1dfSElOU1RBTkNFKSwKKwkJCQkoU0VHUFRSKU1BS0VMT05HKGh3bmQsIGh3bmQpKTsKKyAgU2hvd1dpbmRvdyhscGhjLT5oV25kTEJveCwgU1dfSElERSk7CisgIGRwcmludGZfY29tYm8oc3RkZGViLCJDb21ibyBDcmVhdGlvbiBMQm94PSVYIVxuIiwgbHBoYy0+aFduZExCb3gpOworICByZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgQ0JEZXN0cm95CisgKi8KK3N0YXRpYyBMT05HIENCRGVzdHJveShIV05EIGh3bmQsIFdPUkQgbWVzc2FnZSwgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtKQoreworICBMUEhFQURMSVNUIGxwaGwgPSBDb21ib0dldExpc3RIZWFkZXIoaHduZCk7CisKKyAgTGlzdEJveFJlc2V0Q29udGVudChscGhsKTsKKyAgRGVzdHJveUxpc3RCb3hTdHJ1Y3QobHBobCk7CisgIGRwcmludGZfY29tYm8oc3RkZGViLCJDb21ibyBXTV9ERVNUUk9ZICVwICFcbiIsIGxwaGwpOworICByZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgQ0JQYWludAorICovCitzdGF0aWMgTE9ORyBDQlBhaW50KEhXTkQgaHduZCwgV09SRCBtZXNzYWdlLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0pCit7CisgIExQSEVBRExJU1QgbHBobCA9IENvbWJvR2V0TGlzdEhlYWRlcihod25kKTsKKyAgTFBIRUFEQ09NQk8gbHBoYyA9IENvbWJvR2V0U3RvcmFnZUhlYWRlcihod25kKTsKKyAgTFBMSVNUU1RSVUNUIGxwbHM7CisgIFBBSU5UU1RSVUNUICBwczsKKyAgSEJSVVNIIGhCcnVzaDsKKyAgSEZPTlQgIGhPbGRGb250OworICBIREMgIGhkYzsKKyAgUkVDVCByZWN0OworICBpbnQgaGVpZ2h0OworICAKKyAgaGRjID0gQmVnaW5QYWludChod25kLCAmcHMpOworCisgIGlmIChoQ29tYm9CaXQgIT0gMCkgeworICAgIEdSQVBIX0RyYXdSZWxpZWZSZWN0KGhkYywgJmxwaGMtPlJlY3RCdXR0b24sIDIsIDIsIEZBTFNFKTsKKyAgICBHUkFQSF9EcmF3Qml0bWFwKGhkYywgaENvbWJvQml0LAorCQkgICAgIGxwaGMtPlJlY3RCdXR0b24ubGVmdCArIDMsbHBoYy0+UmVjdEJ1dHRvbi50b3AgKyAyLAorCQkgICAgIDAsIDAsIENCaXRXaWR0aCwgQ0JpdEhlaWdodCApOworICB9CisgIGlmICghSXNXaW5kb3dWaXNpYmxlKGh3bmQpIHx8ICFscGhsLT5iUmVkcmF3RmxhZyAKKyAgICAgIHx8IChscGhjLT5kd1N0eWxlICYgMykgIT0gQ0JTX0RST1BET1dOTElTVCkgCisgIHsKKyAgICAvKiB3ZSBkb24ndCB3YW50IHRvIGRyYXcgYW4gZW50cnkgd2hlbiB0aGVyZSBpcyBhbiBlZGl0IGNvbnRyb2wgKi8KKyAgICBFbmRQYWludChod25kLCAmcHMpOworICAgIHJldHVybiAwOworICB9CisKKyAgaE9sZEZvbnQgPSBTZWxlY3RPYmplY3QoaGRjLCBscGhsLT5oRm9udCk7CisKKyAgaEJydXNoID0gU2VuZE1lc3NhZ2UobHBobC0+aFBhcmVudCwgV01fQ1RMQ09MT1IsIGhkYywKKwkJICAgICAgIE1BS0VMT05HKGh3bmQsIENUTENPTE9SX0xJU1RCT1gpKTsKKyAgaWYgKGhCcnVzaCA9PSAwKSBoQnJ1c2ggPSBHZXRTdG9ja09iamVjdChXSElURV9CUlVTSCk7CisKKyAgR2V0Q2xpZW50UmVjdChod25kLCAmcmVjdCk7CisgIHJlY3QucmlnaHQgLT0gKGxwaGMtPlJlY3RCdXR0b24ucmlnaHQgLSBscGhjLT5SZWN0QnV0dG9uLmxlZnQpOworICBGaWxsUmVjdChoZGMsICZyZWN0LCBoQnJ1c2gpOworCisgIGxwbHMgPSBMaXN0Qm94R2V0SXRlbShscGhsLGxwaGwtPkl0ZW1Gb2N1c2VkKTsKKyAgaWYgKGxwbHMgIT0gTlVMTCkgeyAgCisgICAgaGVpZ2h0ID0gbHBscy0+bWlzLml0ZW1IZWlnaHQ7CisgICAgcmVjdC5ib3R0b20gPSByZWN0LnRvcCArIGhlaWdodDsKKworICAgIGlmIChPV05FUl9EUkFXTihscGhsKSkgeworICAgICAgTGlzdEJveERyYXdJdGVtIChod25kLCBscGhsLCBoZGMsIGxwbHMsICZyZWN0LCBPREFfRFJBV0VOVElSRSwgMCk7CisgICAgfSBlbHNlIHsKKyAgICAgIExpc3RCb3hEcmF3SXRlbSAoaHduZCwgbHBobCwgaGRjLCBscGxzLCAmcmVjdCwgT0RBX0RSQVdFTlRJUkUsIDApOworICAgIH0KKyAgICBpZiAoR2V0Rm9jdXMoKSA9PSBod25kKQorICAgIExpc3RCb3hEcmF3SXRlbSAoaHduZCxscGhsLCBoZGMsIGxwbHMsICZyZWN0LCBPREFfRk9DVVMsIE9EU19GT0NVUyk7CisgIH0KKyAgU2VsZWN0T2JqZWN0KGhkYyxoT2xkRm9udCk7CisgIEVuZFBhaW50KGh3bmQsICZwcyk7CisgIHJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBDQkdldERsZ0NvZGUKKyAqLworc3RhdGljIExPTkcgQ0JHZXREbGdDb2RlKEhXTkQgaHduZCwgV09SRCBtZXNzYWdlLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0pCit7CisgIHJldHVybiBETEdDX1dBTlRBUlJPV1MgfCBETEdDX1dBTlRDSEFSUzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgQ0JMQnV0dG9uRG93bgorICovCitzdGF0aWMgTE9ORyBDQkxCdXR0b25Eb3duKEhXTkQgaHduZCwgV09SRCBtZXNzYWdlLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0pCit7CisgIExQSEVBRENPTUJPIGxwaGMgPSBDb21ib0dldFN0b3JhZ2VIZWFkZXIoaHduZCk7CisgIFNlbmRNZXNzYWdlKGh3bmQsQ0JfU0hPV0RST1BET1dOLCFscGhjLT5Ecm9wRG93blZpc2libGUsMCk7CisgIHJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBDQktleURvd24KKyAqLworc3RhdGljIExPTkcgQ0JLZXlEb3duKEhXTkQgaHduZCwgV09SRCBtZXNzYWdlLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0pCit7CisgIExQSEVBRExJU1QgbHBobCA9IENvbWJvR2V0TGlzdEhlYWRlcihod25kKTsKKyAgV09SRCAgICAgICBuZXdGb2N1c2VkID0gbHBobC0+SXRlbUZvY3VzZWQ7CisKKyAgc3dpdGNoKHdQYXJhbSkgeworICBjYXNlIFZLX0hPTUU6CisgICAgbmV3Rm9jdXNlZCA9IDA7CisgICAgYnJlYWs7CisgIGNhc2UgVktfRU5EOgorICAgIG5ld0ZvY3VzZWQgPSBscGhsLT5JdGVtc0NvdW50IC0gMTsKKyAgICBicmVhazsKKyAgY2FzZSBWS19VUDoKKyAgICBpZiAobmV3Rm9jdXNlZCA+IDApIG5ld0ZvY3VzZWQtLTsKKyAgICBicmVhazsKKyAgY2FzZSBWS19ET1dOOgorICAgIG5ld0ZvY3VzZWQrKzsKKyAgICBicmVhazsKKyAgZGVmYXVsdDoKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIGlmIChuZXdGb2N1c2VkID49IGxwaGwtPkl0ZW1zQ291bnQpCisgICAgbmV3Rm9jdXNlZCA9IGxwaGwtPkl0ZW1zQ291bnQgLSAxOworICAKKyAgTGlzdEJveFNldEN1clNlbChscGhsLCBuZXdGb2N1c2VkKTsKKyAgTGlzdEJveFNlbmROb3RpZmljYXRpb24obHBobCwgaHduZCwgQ0JOX1NFTENIQU5HRSk7CisKKyAgbHBobC0+SXRlbUZvY3VzZWQgPSBuZXdGb2N1c2VkOworICBMaXN0Qm94U2Nyb2xsVG9Gb2N1cyhscGhsKTsKKy8qICBTZXRTY3JvbGxQb3MoaHduZCwgU0JfVkVSVCwgbHBobC0+Rmlyc3RWaXNpYmxlLCBUUlVFKTsqLworICBJbnZhbGlkYXRlUmVjdChod25kLCBOVUxMLCBUUlVFKTsKKworICByZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgQ0JDaGFyCisgKi8KK3N0YXRpYyBMT05HIENCQ2hhcihIV05EIGh3bmQsIFdPUkQgbWVzc2FnZSwgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtKQoreworICBMUEhFQURMSVNUIGxwaGwgPSBDb21ib0dldExpc3RIZWFkZXIoaHduZCk7CisgIFdPUkQgICAgICAgbmV3Rm9jdXNlZDsKKworICBuZXdGb2N1c2VkID0gTGlzdEJveEZpbmROZXh0TWF0Y2gobHBobCwgd1BhcmFtKTsKKyAgaWYgKG5ld0ZvY3VzZWQgPT0gKFdPUkQpTEJfRVJSKSByZXR1cm4gMDsKKworICBpZiAobmV3Rm9jdXNlZCA+PSBscGhsLT5JdGVtc0NvdW50KQorICAgIG5ld0ZvY3VzZWQgPSBscGhsLT5JdGVtc0NvdW50IC0gMTsKKyAgCisgIExpc3RCb3hTZXRDdXJTZWwobHBobCwgbmV3Rm9jdXNlZCk7CisgIExpc3RCb3hTZW5kTm90aWZpY2F0aW9uKGxwaGwsIGh3bmQsIENCTl9TRUxDSEFOR0UpOworICBscGhsLT5JdGVtRm9jdXNlZCA9IG5ld0ZvY3VzZWQ7CisgIExpc3RCb3hTY3JvbGxUb0ZvY3VzKGxwaGwpOworICAKKy8qICBTZXRTY3JvbGxQb3MoaHduZCwgU0JfVkVSVCwgbHBobC0+Rmlyc3RWaXNpYmxlLCBUUlVFKTsqLworICBJbnZhbGlkYXRlUmVjdChod25kLCBOVUxMLCBUUlVFKTsKKworICByZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgQ0JLaWxsRm9jdXMKKyAqLworc3RhdGljIExPTkcgQ0JLaWxsRm9jdXMoSFdORCBod25kLCBXT1JEIG1lc3NhZ2UsIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSkKK3sKKyAgcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIENCU2V0Rm9jdXMKKyAqLworc3RhdGljIExPTkcgQ0JTZXRGb2N1cyhIV05EIGh3bmQsIFdPUkQgbWVzc2FnZSwgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtKQoreworICByZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgQ0JSZXNldENvbnRlbnQKKyAqLworc3RhdGljIExPTkcgQ0JSZXNldENvbnRlbnQoSFdORCBod25kLCBXT1JEIG1lc3NhZ2UsIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSkKK3sKKyAgTFBIRUFETElTVCBscGhsID0gQ29tYm9HZXRMaXN0SGVhZGVyKGh3bmQpOworICBMUEhFQURDT01CTyBscGhjID0gQ29tYm9HZXRTdG9yYWdlSGVhZGVyKGh3bmQpOworCisgIExpc3RCb3hSZXNldENvbnRlbnQobHBobCk7CisgIENvbWJvVXBkYXRlV2luZG93KGh3bmQsIGxwaGwsIGxwaGMsIFRSVUUpOworICByZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgQ0JEaXIKKyAqLworc3RhdGljIExPTkcgQ0JEaXIoSFdORCBod25kLCBXT1JEIG1lc3NhZ2UsIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSkKK3sKKyAgV09SRCB3UmV0OworICBMUEhFQURMSVNUIGxwaGwgPSBDb21ib0dldExpc3RIZWFkZXIoaHduZCk7CisgIExQSEVBRENPTUJPIGxwaGMgPSBDb21ib0dldFN0b3JhZ2VIZWFkZXIoaHduZCk7CisKKyAgd1JldCA9IExpc3RCb3hEaXJlY3RvcnkobHBobCwgd1BhcmFtLCAoTFBTVFIpUFRSX1NFR19UT19MSU4obFBhcmFtKSk7CisgIENvbWJvVXBkYXRlV2luZG93KGh3bmQsIGxwaGwsIGxwaGMsIFRSVUUpOworICByZXR1cm4gd1JldDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgQ0JJbnNlcnRTdHJpbmcKKyAqLworc3RhdGljIExPTkcgQ0JJbnNlcnRTdHJpbmcoSFdORCBod25kLCBXT1JEIG1lc3NhZ2UsIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSkKK3sKKyAgV09SRCAgd1JldDsKKyAgTFBIRUFETElTVCBscGhsID0gQ29tYm9HZXRMaXN0SGVhZGVyKGh3bmQpOworICBMUEhFQURDT01CTyBscGhjID0gQ29tYm9HZXRTdG9yYWdlSGVhZGVyKGh3bmQpOworCisgIGlmIChIYXNTdHJpbmdzKGxwaGwpKQorICAgIHdSZXQgPSBMaXN0Qm94SW5zZXJ0U3RyaW5nKGxwaGwsIHdQYXJhbSwgKExQU1RSKVBUUl9TRUdfVE9fTElOKGxQYXJhbSkpOworICBlbHNlCisgICAgd1JldCA9IExpc3RCb3hJbnNlcnRTdHJpbmcobHBobCwgd1BhcmFtLCAoTFBTVFIpbFBhcmFtKTsKKworICBDb21ib1VwZGF0ZVdpbmRvdyhod25kLCBscGhsLCBscGhjLCBUUlVFKTsKKyAgcmV0dXJuIHdSZXQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIENCQWRkU3RyaW5nCisgKi8KK3N0YXRpYyBMT05HIENCQWRkU3RyaW5nKEhXTkQgaHduZCwgV09SRCBtZXNzYWdlLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0pCit7CisgIFdPUkQgIHdSZXQ7CisgIExQSEVBRExJU1QgbHBobCA9IENvbWJvR2V0TGlzdEhlYWRlcihod25kKTsKKyAgTFBIRUFEQ09NQk8gbHBoYyA9IENvbWJvR2V0U3RvcmFnZUhlYWRlcihod25kKTsKKworICBpZiAoSGFzU3RyaW5ncyhscGhsKSkKKyAgICB3UmV0ID0gTGlzdEJveEFkZFN0cmluZyhscGhsLCAoTFBTVFIpUFRSX1NFR19UT19MSU4obFBhcmFtKSk7CisgIGVsc2UKKyAgICB3UmV0ID0gTGlzdEJveEFkZFN0cmluZyhscGhsLCAoTFBTVFIpbFBhcmFtKTsKKworICBDb21ib1VwZGF0ZVdpbmRvdyhod25kLCBscGhsLCBscGhjLCBUUlVFKTsKKyAgcmV0dXJuIHdSZXQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIENCRGVsZXRlU3RyaW5nCisgKi8KK3N0YXRpYyBMT05HIENCRGVsZXRlU3RyaW5nKEhXTkQgaHduZCwgV09SRCBtZXNzYWdlLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0pCit7CisgIExQSEVBRExJU1QgbHBobCA9IENvbWJvR2V0TGlzdEhlYWRlcihod25kKTsKKyAgTFBIRUFEQ09NQk8gbHBoYyA9IENvbWJvR2V0U3RvcmFnZUhlYWRlcihod25kKTsKKyAgTE9ORyBsUmV0ID0gTGlzdEJveERlbGV0ZVN0cmluZyhscGhsLHdQYXJhbSk7CisgIAorICBDb21ib1VwZGF0ZVdpbmRvdyhod25kLCBscGhsLCBscGhjLCBUUlVFKTsKKyAgcmV0dXJuIGxSZXQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIENCU2VsZWN0U3RyaW5nCisgKi8KK3N0YXRpYyBMT05HIENCU2VsZWN0U3RyaW5nKEhXTkQgaHduZCwgV09SRCBtZXNzYWdlLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0pCit7CisgIExQSEVBRExJU1QgbHBobCA9IENvbWJvR2V0TGlzdEhlYWRlcihod25kKTsKKyAgV09SRCAgd1JldDsKKworICB3UmV0ID0gTGlzdEJveEZpbmRTdHJpbmcobHBobCwgd1BhcmFtLCBsUGFyYW0pOworCisgIC8qIFhYWCBhZGQgZnVuY3Rpb25hbGl0eSBoZXJlICovCisKKyAgcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIENCRmluZFN0cmluZworICovCitzdGF0aWMgTE9ORyBDQkZpbmRTdHJpbmcoSFdORCBod25kLCBXT1JEIG1lc3NhZ2UsIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSkKK3sKKyAgTFBIRUFETElTVCBscGhsID0gQ29tYm9HZXRMaXN0SGVhZGVyKGh3bmQpOworICByZXR1cm4gTGlzdEJveEZpbmRTdHJpbmcobHBobCwgd1BhcmFtLCBsUGFyYW0pOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBDQkdldENvdW50CisgKi8KK3N0YXRpYyBMT05HIENCR2V0Q291bnQoSFdORCBod25kLCBXT1JEIG1lc3NhZ2UsIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSkKK3sKKyAgTFBIRUFETElTVCBscGhsID0gQ29tYm9HZXRMaXN0SGVhZGVyKGh3bmQpOworICByZXR1cm4gbHBobC0+SXRlbXNDb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgQ0JTZXRDdXJTZWwKKyAqLworc3RhdGljIExPTkcgQ0JTZXRDdXJTZWwoSFdORCBod25kLCBXT1JEIG1lc3NhZ2UsIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSkKK3sKKyAgTFBIRUFETElTVCBscGhsID0gQ29tYm9HZXRMaXN0SGVhZGVyKGh3bmQpOworICBXT1JEICB3UmV0OworCisgIHdSZXQgPSBMaXN0Qm94U2V0Q3VyU2VsKGxwaGwsIHdQYXJhbSk7CisKKy8qICBTZXRTY3JvbGxQb3MoaHduZCwgU0JfVkVSVCwgbHBobC0+Rmlyc3RWaXNpYmxlLCBUUlVFKTsqLworICBJbnZhbGlkYXRlUmVjdChod25kLCBOVUxMLCBUUlVFKTsKKworICByZXR1cm4gd1JldDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgQ0JHZXRDdXJTZWwKKyAqLworc3RhdGljIExPTkcgQ0JHZXRDdXJTZWwoSFdORCBod25kLCBXT1JEIG1lc3NhZ2UsIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSkKK3sKKyAgTFBIRUFETElTVCBscGhsID0gQ29tYm9HZXRMaXN0SGVhZGVyKGh3bmQpOworICByZXR1cm4gbHBobC0+SXRlbUZvY3VzZWQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIENCR2V0SXRlbUhlaWdodAorICovCitzdGF0aWMgTE9ORyBDQkdldEl0ZW1IZWlnaHQoSFdORCBod25kLCBXT1JEIG1lc3NhZ2UsIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSkKK3sKKyAgTFBIRUFETElTVCBscGhsID0gQ29tYm9HZXRMaXN0SGVhZGVyKGh3bmQpOworICBMUExJU1RTVFJVQ1QgbHBscyA9IExpc3RCb3hHZXRJdGVtIChscGhsLCB3UGFyYW0pOworCisgIGlmIChscGxzID09IE5VTEwpIHJldHVybiBMQl9FUlI7CisgIHJldHVybiBscGxzLT5taXMuaXRlbUhlaWdodDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgQ0JTZXRJdGVtSGVpZ2h0CisgKi8KK3N0YXRpYyBMT05HIENCU2V0SXRlbUhlaWdodChIV05EIGh3bmQsIFdPUkQgbWVzc2FnZSwgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtKQoreworICBMUEhFQURMSVNUIGxwaGwgPSBDb21ib0dldExpc3RIZWFkZXIoaHduZCk7CisgIHJldHVybiBMaXN0Qm94U2V0SXRlbUhlaWdodChscGhsLCB3UGFyYW0sIGxQYXJhbSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIENCU2V0UmVkcmF3CisgKi8KK3N0YXRpYyBMT05HIENCU2V0UmVkcmF3KEhXTkQgaHduZCwgV09SRCBtZXNzYWdlLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0pCit7CisgIExQSEVBRExJU1QgbHBobCA9IENvbWJvR2V0TGlzdEhlYWRlcihod25kKTsKKyAgbHBobC0+YlJlZHJhd0ZsYWcgPSB3UGFyYW07CisgIHJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBDQlNldEZvbnQKKyAqLworc3RhdGljIExPTkcgQ0JTZXRGb250KEhXTkQgaHduZCwgV09SRCBtZXNzYWdlLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0pCit7CisgIExQSEVBRExJU1QgIGxwaGwgPSBDb21ib0dldExpc3RIZWFkZXIoaHduZCk7CisKKyAgaWYgKHdQYXJhbSA9PSAwKQorICAgIGxwaGwtPmhGb250ID0gR2V0U3RvY2tPYmplY3QoU1lTVEVNX0ZPTlQpOworICBlbHNlCisgICAgbHBobC0+aEZvbnQgPSB3UGFyYW07CisKKyAgcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIENCR2V0TEJUZXh0TGVuCisgKi8KK3N0YXRpYyBMT05HIENCR2V0TEJUZXh0TGVuKEhXTkQgaHduZCwgV09SRCBtZXNzYWdlLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0pCit7CisgIExQSEVBRExJU1QgICBscGhsID0gQ29tYm9HZXRMaXN0SGVhZGVyKGh3bmQpOworICBMUExJU1RTVFJVQ1QgbHBscyA9IExpc3RCb3hHZXRJdGVtKGxwaGwsd1BhcmFtKTsKKworICBpZiAobHBscyA9PSBOVUxMIHx8ICFIYXNTdHJpbmdzKGxwaGwpKSByZXR1cm4gTEJfRVJSOworICByZXR1cm4gc3RybGVuKGxwbHMtPml0ZW1UZXh0KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgQ0JHZXRMQlRleHQKKyAqLworc3RhdGljIExPTkcgQ0JHZXRMQlRleHQoSFdORCBod25kLCBXT1JEIG1lc3NhZ2UsIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSkKK3sKKyAgTFBIRUFETElTVCBscGhsID0gQ29tYm9HZXRMaXN0SGVhZGVyKGh3bmQpOworICByZXR1cm4gTGlzdEJveEdldFRleHQobHBobCwgd1BhcmFtLCAoTFBTVFIpUFRSX1NFR19UT19MSU4obFBhcmFtKSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIENCR2V0SXRlbURhdGEKKyAqLworc3RhdGljIExPTkcgQ0JHZXRJdGVtRGF0YShIV05EIGh3bmQsIFdPUkQgbWVzc2FnZSwgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtKQoreworICBMUEhFQURMSVNUIGxwaGwgPSBDb21ib0dldExpc3RIZWFkZXIoaHduZCk7CisgIHJldHVybiBMaXN0Qm94R2V0SXRlbURhdGEobHBobCwgd1BhcmFtKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgQ0JTZXRJdGVtRGF0YQorICovCitzdGF0aWMgTE9ORyBDQlNldEl0ZW1EYXRhKEhXTkQgaHduZCwgV09SRCBtZXNzYWdlLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0pCit7CisgIExQSEVBRExJU1QgbHBobCA9IENvbWJvR2V0TGlzdEhlYWRlcihod25kKTsKKyAgcmV0dXJuIExpc3RCb3hTZXRJdGVtRGF0YShscGhsLCB3UGFyYW0sIGxQYXJhbSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIENCU2hvd0Ryb3BEb3duCisgKi8KK3N0YXRpYyBMT05HIENCU2hvd0Ryb3BEb3duKEhXTkQgaHduZCwgV09SRCBtZXNzYWdlLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0pCit7CisgIExQSEVBRENPTUJPIGxwaGMgPSBDb21ib0dldFN0b3JhZ2VIZWFkZXIoaHduZCk7CisgIFJFQ1QgcmVjdDsKKyAgCisgIGlmIChscGhjLT5kd1N0eWxlICYgMyA9PSBDQlNfU0lNUExFKSByZXR1cm4gTEJfRVJSOworICAKKyAgd1BhcmFtID0gISF3UGFyYW07CisgIGlmICh3UGFyYW0gIT0gbHBoYy0+RHJvcERvd25WaXNpYmxlKSB7CisgICAgbHBoYy0+RHJvcERvd25WaXNpYmxlID0gd1BhcmFtOworICAgIEdldFdpbmRvd1JlY3QoaHduZCwmcmVjdCk7CisgICAgU2V0V2luZG93UG9zKGxwaGMtPmhXbmRMQm94LCAwLCByZWN0LmxlZnQsIHJlY3QudG9wK2xwaGMtPkxCb3hUb3AsIDAsIDAsCisJCSBTV1BfTk9TSVpFIHwgKHdQYXJhbSA/IFNXUF9TSE9XV0lORE9XIDogU1dQX0hJREVXSU5ET1cpKTsKKyAgICBpZiAoIXdQYXJhbSkgU2V0Rm9jdXMoaHduZCk7CisgIH0KKyAgcmV0dXJuIDA7Cit9CiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgQ29tYm9XbmRQcm9jCiAgKi8KLUxPTkcgQ29tYm9Cb3hXbmRQcm9jKCBIV05EIGh3bmQsIFdPUkQgbWVzc2FnZSwgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtICkKLXsgICAgCi0JUkVDVAlyZWN0OwotCWludAkJeSwgY291bnQ7Ci0JaW50CQl3aWR0aCwgaGVpZ2h0OwotCVdORCAgCSp3bmRQdHI7Ci0JTFBIRUFEQ09NQk8gbHBoYzsKLQlIREMJCWhEQzsKLQlCSVRNQVAJYm07Ci0JUEFJTlRTVFJVQ1QgcGFpbnRzdHJ1Y3Q7Ci0JTFBEUkFXSVRFTVNUUlVDVCBscGRpczsKLQlEV09SRCAgICAgICBkd1N0eWxlOwotICAgICAgICBIQU5ETEUgaFN0cjsKK0xPTkcgQ29tYm9Cb3hXbmRQcm9jKEhXTkQgaHduZCwgV09SRCBtZXNzYWdlLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0pCit7CisgIGludCBpZHggPSAwOworICBpbnQgdGFibGVfc2l6ZSA9IHNpemVvZiAoY29tYm9fdGJsKSAvIHNpemVvZiAobXNnX3RibCk7CiAKLQlzd2l0Y2gobWVzc2FnZSkgewotCQljYXNlIFdNX0NSRUFURToKLQkJCXduZFB0ciA9IFdJTl9GaW5kV25kUHRyKGh3bmQpOwotCQkJaWYgKHduZFB0ciA9PSBOVUxMKSByZXR1cm4gMDsKLQkJCWRwcmludGZfY29tYm8oc3RkZGViLCJDb21ibyBXTV9DUkVBVEUgJWQgIVxuIiwgaHduZCk7Ci0JCQlpZiAoaENvbWJvQml0ID09IChIQklUTUFQKU5VTEwpIAotCQkJaENvbWJvQml0ID0gTG9hZEJpdG1hcCgoSElOU1RBTkNFKU5VTEwsIE1BS0VJTlRSRVNPVVJDRShPQk1fQ09NQk8pKTsKLQkJCUdldE9iamVjdChoQ29tYm9CaXQsIHNpemVvZihCSVRNQVApLCAoTFBTVFIpJmJtKTsKLQkJCXduZFB0ci0+ZHdTdHlsZSAmPSAweEZGRkZGRkZGTCBeIChXU19WU0NST0xMIHwgV1NfSFNDUk9MTCk7Ci0JCQlHZXRXaW5kb3dSZWN0KGh3bmQsICZyZWN0KTsKLQkJCXdpZHRoID0gcmVjdC5yaWdodCAtIHJlY3QubGVmdDsKLQkJCWhlaWdodCA9IHJlY3QuYm90dG9tIC0gcmVjdC50b3A7Ci0JCQlpZiAoaGVpZ2h0IDwgYm0uYm1IZWlnaHQpIGhlaWdodCA9IGJtLmJtSGVpZ2h0OwotLyoJCQlTZXRXaW5kb3dQb3MoaHduZCwgMCwgMCwgMCwgd2lkdGggKyBibS5ibUhlaWdodCwgYm0uYm1IZWlnaHQsIAotCQkJCQkJCQkJU1dQX05PTU9WRSB8IFNXUF9OT1pPUkRFUik7ICovCi0JCQlTZXRXaW5kb3dQb3MoaHduZCwgMCwgMCwgMCwgd2lkdGgsIGJtLmJtSGVpZ2h0LCAKLQkJCQkJCQkJU1dQX05PTU9WRSB8IFNXUF9OT1pPUkRFUik7IAotCQkJQ3JlYXRlQ29tYm9TdHJ1Y3QoaHduZCk7Ci0JCQlscGhjID0gQ29tYm9HZXRTdG9yYWdlSGVhZGVyKGh3bmQpOwotCQkJaWYgKGxwaGMgPT0gTlVMTCkgcmV0dXJuIDA7Ci0vKgkJCVNldFJlY3QoJmxwaGMtPlJlY3RFZGl0LCAwLCAwLCB3aWR0aCAtIDIsIGJtLmJtSGVpZ2h0KTsgKi8KLQkJCVNldFJlY3QoJmxwaGMtPlJlY3RFZGl0LCAwLCAwLCB3aWR0aCAtIGJtLmJtSGVpZ2h0LCBibS5ibUhlaWdodCk7Ci0JCQlpZiAod25kUHRyLT5kd1N0eWxlICYgQ0JTX0RST1BET1dOTElTVCkgewotCQkJCWlmICgod25kUHRyLT5kd1N0eWxlICYgQ0JTX09XTkVSRFJBV0ZJWEVEKSA9PSBDQlNfT1dORVJEUkFXRklYRUQgfHwKLQkJCQkJKHduZFB0ci0+ZHdTdHlsZSAmIENCU19PV05FUkRSQVdWQVJJQUJMRSkgPT0gQ0JTX09XTkVSRFJBV1ZBUklBQkxFKQotCQkJCQlscGhjLT5oV25kRWRpdCA9IDA7Ci0JCQkJZWxzZQotCQkJCQlscGhjLT5oV25kRWRpdCA9IENyZWF0ZVdpbmRvdygiU1RBVElDIiwgIiIsCi0JCQkJCQlXU19DSElMRCB8IFdTX0NMSVBDSElMRFJFTiB8IFdTX1ZJU0lCTEUgfCBTU19MRUZULAotCQkJCQkJMCwgMCwgd2lkdGggLSBibS5ibUhlaWdodCwgYm0uYm1IZWlnaHQsCi0JCQkJCQlod25kLCAxLCB3bmRQdHItPmhJbnN0YW5jZSwgMEwpOwotCQkJCX0KLQkJCWVsc2UgewotLyoJCQkJbHBoYy0+aFduZEVkaXQgPSBDcmVhdGVXaW5kb3coIkVESVQiLCAiIiwgKi8KLQkJCQlscGhjLT5oV25kRWRpdCA9IENyZWF0ZVdpbmRvdygiU1RBVElDIiwgIiIsCi0JCQkJCVdTX0NISUxEIHwgV1NfQ0xJUENISUxEUkVOIHwgV1NfVklTSUJMRSB8IFNTX0xFRlQsCi0JCQkJCTAsIDAsIHdpZHRoIC0gYm0uYm1IZWlnaHQsIGJtLmJtSGVpZ2h0LAotCQkJCQlod25kLCAxLCB3bmRQdHItPmhJbnN0YW5jZSwgMEwpOwotCQkJCX0KLQkJCWR3U3R5bGUgPSBXU19QT1BVUCB8IFdTX0JPUkRFUiB8IFdTX1ZTQ1JPTEwgfCBMQlNfTk9USUZZOwotCQkJaWYgKCh3bmRQdHItPmR3U3R5bGUgJiBDQlNfSEFTU1RSSU5HUykgPT0gQ0JTX0hBU1NUUklOR1MpCi0JCQkJZHdTdHlsZSB8PSBMQlNfSEFTU1RSSU5HUzsKLQkJCWlmICgod25kUHRyLT5kd1N0eWxlICYgQ0JTX1NPUlQpID09IENCU19TT1JUKQotCQkJCWR3U3R5bGUgfD0gTEJTX1NPUlQ7Ci0JCQlpZiAoKHduZFB0ci0+ZHdTdHlsZSAmIENCU19PV05FUkRSQVdGSVhFRCkgPT0gQ0JTX09XTkVSRFJBV0ZJWEVEKQotCQkJCWR3U3R5bGUgfD0gTEJTX09XTkVSRFJBV0ZJWEVEOwotCQkJaWYgKCh3bmRQdHItPmR3U3R5bGUgJiBDQlNfT1dORVJEUkFXVkFSSUFCTEUpID09IENCU19PV05FUkRSQVdWQVJJQUJMRSkKLQkJCQlkd1N0eWxlIHw9IExCU19PV05FUkRSQVdWQVJJQUJMRTsKLQkJCWxwaGMtPmhXbmRMQm94ID0gQ3JlYXRlV2luZG93KCJMSVNUQk9YIiwgIiIsIGR3U3R5bGUsCi0JCQkJcmVjdC5sZWZ0LCByZWN0LnRvcCArIGJtLmJtSGVpZ2h0LAotCQkJCXdpZHRoLCBoZWlnaHQsIHduZFB0ci0+aHduZFBhcmVudCwgMCwKLQkJCQl3bmRQdHItPmhJbnN0YW5jZSwgKFNFR1BUUilNQUtFTE9ORygwLCBod25kKSk7Ci0JCQlTaG93V2luZG93KGxwaGMtPmhXbmRMQm94LCBTV19ISURFKTsKLQkJCWRwcmludGZfY29tYm8oc3RkZGViLCJDb21ibyBDcmVhdGlvbiBMQm94PSVYIVxuIiwgbHBoYy0+aFduZExCb3gpOwotCQkJcmV0dXJuIDA7Ci0gICAgY2FzZSBXTV9ERVNUUk9ZOgotCQlscGhjID0gQ29tYm9HZXRTdG9yYWdlSGVhZGVyKGh3bmQpOwotCQlpZiAobHBoYyA9PSAwKSByZXR1cm4gMDsKLS8qCi0JCWlmIChscGhjLT5oV25kRWRpdCAhPSAwKSBEZXN0cm95V2luZG93KGxwaGMtPmhXbmRFZGl0KTsKLSovCi0JCURlc3Ryb3lXaW5kb3cobHBoYy0+aFduZExCb3gpOwotCQlmcmVlKGxwaGMpOwotLyoKLQkJKigoTFBIRUFEQ09NQk8gKikmd25kUHRyLT53RXh0cmFbMV0pID0gMDsgCi0JCXByaW50ZigiQ29tYm8gV01fREVTVFJPWSBhZnRlciBjbGVhcmluZyB3RXh0cmEgIVxuIik7Ci0qLwotCQlkcHJpbnRmX2NvbWJvKHN0ZGRlYiwiQ29tYm8gV01fREVTVFJPWSAlcCAhXG4iLCBscGhjKTsKLQkJcmV0dXJuIERlZldpbmRvd1Byb2MoIGh3bmQsIG1lc3NhZ2UsIHdQYXJhbSwgbFBhcmFtICk7Ci0JY2FzZSBXTV9TSE9XV0lORE9XOgotCQlkcHJpbnRmX2NvbWJvKHN0ZGRlYiwiQ29tYm9Cb3ggV01fU0hPV1dJTkRPVyBoV25kPSUwNFggIVxuIiwgCi0JCQkgICAgICBod25kKTsKLQkJaWYgKCEod1BhcmFtID09IDAgJiYgbFBhcmFtID09IDBMKSkgewotCQkJSW52YWxpZGF0ZVJlY3QoaHduZCwgTlVMTCwgVFJVRSk7Ci0JCQl9Ci0JICAgIGJyZWFrOwotCQotICAgIGNhc2UgV01fQ09NTUFORDoKLQkJd25kUHRyID0gV0lOX0ZpbmRXbmRQdHIoaHduZCk7Ci0JCWxwaGMgPSBDb21ib0dldFN0b3JhZ2VIZWFkZXIoaHduZCk7Ci0JCWlmIChscGhjID09IE5VTEwgfHwgd25kUHRyID09IE5VTEwpIHJldHVybiAwOwotCQlpZiAoTE9XT1JEKGxQYXJhbSkgPT0gbHBoYy0+aFduZExCb3gpIHsKLSAgICAgICAgICAgICAgICAgICAgaFN0ciA9IFVTRVJfSEVBUF9BTExPQyggMjU2ICk7Ci0JCQlzd2l0Y2goSElXT1JEKGxQYXJhbSkpIHsKLQkJCQljYXNlIExCTl9TRUxDSEFOR0U6Ci0JCQkJCWxwaGMtPmR3U3RhdGUgPSBscGhjLT5kd1N0YXRlICYgKENCX1NIT1dEUk9QRE9XTiBeIDB4RkZGRkZGRkZMKTsKLQkJCQkJU2hvd1dpbmRvdyhscGhjLT5oV25kTEJveCwgU1dfSElERSk7Ci0JCQkJCXkgPSBTZW5kTWVzc2FnZShscGhjLT5oV25kTEJveCwgTEJfR0VUQ1VSU0VMLCAwLCAwTCk7Ci0JCQkJCWlmICh5ICE9IExCX0VSUikgewotCQkJCQkJU2VuZE1lc3NhZ2UobHBoYy0+aFduZExCb3gsIExCX0dFVFRFWFQsIChXT1JEKXksIFVTRVJfSEVBUF9TRUdfQUREUihoU3RyKSk7Ci0JCQkJCQlpZiAobHBoYy0+aFduZEVkaXQgIT0gMCkgCi0JCQkJCQkJU2VuZE1lc3NhZ2UobHBoYy0+aFduZEVkaXQsIFdNX1NFVFRFWFQsIChXT1JEKXksIFVTRVJfSEVBUF9TRUdfQUREUihoU3RyKSk7Ci0JCQkJCQllbHNlIHsKLQkJCQkJCQlJbnZhbGlkYXRlUmVjdChod25kLCBOVUxMLCBUUlVFKTsKLQkJCQkJCQlVcGRhdGVXaW5kb3coaHduZCk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQlTZW5kTWVzc2FnZShHZXRQYXJlbnQoaHduZCksIFdNX0NPTU1BTkQsIHduZFB0ci0+d0lEbWVudSwKLQkJCQkJCQkJCQlNQUtFTE9ORyhod25kLCBDQk5fU0VMQ0hBTkdFKSk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgTEJOX0RCTENMSzoKLQkJCQkJU2VuZE1lc3NhZ2UoR2V0UGFyZW50KGh3bmQpLCBXTV9DT01NQU5ELCB3bmRQdHItPndJRG1lbnUsCi0JCQkJCQkJCQkJTUFLRUxPTkcoaHduZCwgQ0JOX0RCTENMSykpOwotCQkJCQlicmVhazsKLQkgICAgICAgIAl9Ci0gICAgICAgICAgICAgICAgICAgIFVTRVJfSEVBUF9GUkVFKCBoU3RyICk7Ci0gICAgICAgICAgICB9Ci0JCWJyZWFrOwotICAgIGNhc2UgV01fTEJVVFRPTkRPV046Ci0JCWRwcmludGZfY29tYm8oc3RkZGViLCJDb21ibyBXTV9MQlVUVE9ORE9XTiB3UGFyYW09JXggbFBhcmFtPSVsWCAhXG4iLCB3UGFyYW0sIGxQYXJhbSk7Ci0JCUdldENsaWVudFJlY3QoaHduZCwgJnJlY3QpOwotCQlyZWN0LmxlZnQgPSByZWN0LnJpZ2h0IC0gKHJlY3QuYm90dG9tIC0gcmVjdC50b3ApOyAKLQkJaERDID0gR2V0REMoaHduZCk7Ci0JCUluZmxhdGVSZWN0KCZyZWN0LCAtMSwgLTEpOwotCQlHUkFQSF9EcmF3UmVsaWVmUmVjdChoREMsICZyZWN0LCAxLCAxLCBUUlVFKTsKLQkJUmVsZWFzZURDKGh3bmQsIGhEQyk7Ci0JCXduZFB0ciA9IFdJTl9GaW5kV25kUHRyKGh3bmQpOwotCQlscGhjID0gQ29tYm9HZXRTdG9yYWdlSGVhZGVyKGh3bmQpOwotCQlpZiAobHBoYyA9PSBOVUxMKSByZXR1cm4gMDsKLQkJbHBoYy0+ZHdTdGF0ZSA9IGxwaGMtPmR3U3RhdGUgXiBDQl9TSE9XRFJPUERPV047Ci0JCWlmICgobHBoYy0+ZHdTdGF0ZSAmIENCX1NIT1dEUk9QRE9XTikgPT0gQ0JfU0hPV0RST1BET1dOKSB7Ci0JCSAgICBTaG93V2luZG93KGxwaGMtPmhXbmRMQm94LCBTV19TSE9XKTsKLQkJICAgIFNldEZvY3VzKGxwaGMtPmhXbmRMQm94KTsKLQkJCX0KLQkJZWxzZSB7Ci0JCQlkcHJpbnRmX2NvbWJvKHN0ZGRlYiwiYmVmb3JlIENvbWJvIFJlc3RvcmUgRm9jdXMgIVxuIik7Ci0JCQlTZXRGb2N1cyhscGhjLT5oV25kRWRpdCk7Ci0JCQlkcHJpbnRmX2NvbWJvKHN0ZGRlYiwiYmVmb3JlIENvbWJvIExpc3QgSGlkZSAhXG4iKTsKLQkJCVNob3dXaW5kb3cobHBoYy0+aFduZExCb3gsIFNXX0hJREUpOwotCQkJZHByaW50Zl9jb21ibyhzdGRkZWIsImJlZm9yZSBDb21ibyBMaXN0IEdldEN1clNlbCAhXG4iKTsKLQkJCXkgPSBTZW5kTWVzc2FnZShscGhjLT5oV25kTEJveCwgTEJfR0VUQ1VSU0VMLCAwLCAwTCk7Ci0JCQlpZiAoeSAhPSBMQl9FUlIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaFN0ciA9IFVTRVJfSEVBUF9BTExPQyggMjU2ICk7Ci0JCQkJZHByaW50Zl9jb21ibyhzdGRkZWIsImJlZm9yZSBDb21ibyBMaXN0IEdldFRleHQgIVxuIik7Ci0JCQkJU2VuZE1lc3NhZ2UobHBoYy0+aFduZExCb3gsIExCX0dFVFRFWFQsIChXT1JEKXksIFVTRVJfSEVBUF9TRUdfQUREUihoU3RyKSk7Ci0JCQkJU2VuZE1lc3NhZ2UobHBoYy0+aFduZEVkaXQsIFdNX1NFVFRFWFQsIChXT1JEKXksIFVTRVJfSEVBUF9TRUdfQUREUihoU3RyKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVTRVJfSEVBUF9GUkVFKCBoU3RyICk7Ci0JCQkJfQotCQkJZHByaW50Zl9jb21ibyhzdGRkZWIsIkVuZCBvZiBDb21ibyBMaXN0IEhpZGUgIVxuIik7Ci0JCQl9Ci0JCWJyZWFrOwotICAgIGNhc2UgV01fTEJVVFRPTlVQOgotCQlkcHJpbnRmX2NvbWJvKHN0ZGRlYiwiQ29tYm8gV01fTEJVVFRPTlVQIHdQYXJhbT0leCBsUGFyYW09JWxYICFcbiIsIHdQYXJhbSwgbFBhcmFtKTsKLQkJR2V0Q2xpZW50UmVjdChod25kLCAmcmVjdCk7Ci0JCXJlY3QubGVmdCA9IHJlY3QucmlnaHQgLSAocmVjdC5ib3R0b20gLSByZWN0LnRvcCk7IAotCQloREMgPSBHZXREQyhod25kKTsKLQkJSW5mbGF0ZVJlY3QoJnJlY3QsIC0xLCAtMSk7Ci0JCUdSQVBIX0RyYXdSZWxpZWZSZWN0KGhEQywgJnJlY3QsIDEsIDEsIEZBTFNFKTsKLQkJUmVsZWFzZURDKGh3bmQsIGhEQyk7Ci0JCWJyZWFrOwotICAgY2FzZSBXTV9LRVlET1dOOgotCQl3bmRQdHIgPSBXSU5fRmluZFduZFB0cihod25kKTsKLQkJbHBoYyA9IENvbWJvR2V0U3RvcmFnZUhlYWRlcihod25kKTsKLQkJaWYgKGxwaGMgPT0gTlVMTCB8fCB3bmRQdHIgPT0gTlVMTCkgcmV0dXJuIDA7Ci0JCXkgPSBTZW5kTWVzc2FnZShscGhjLT5oV25kTEJveCwgTEJfR0VUQ1VSU0VMLCAwLCAwTCk7Ci0JCWNvdW50ID0gU2VuZE1lc3NhZ2UobHBoYy0+aFduZExCb3gsIExCX0dFVENPVU5ULCAwLCAwTCk7Ci0JCWRwcmludGZfY29tYm8oc3RkZGViLCJDT01CT0JPWCAvLyBHZXRLZXlTdGF0ZShWS19NRU5VKT0lZFxuIiwgR2V0S2V5U3RhdGUoVktfTUVOVSkpOwotCQlpZiAoR2V0S2V5U3RhdGUoVktfTUVOVSkgPCAwKSB7Ci0JCQlscGhjLT5kd1N0YXRlID0gbHBoYy0+ZHdTdGF0ZSBeIENCX1NIT1dEUk9QRE9XTjsKLQkJCWlmICgobHBoYy0+ZHdTdGF0ZSAmIENCX1NIT1dEUk9QRE9XTikgPT0gQ0JfU0hPV0RST1BET1dOKSB7Ci0JCQkJR2V0V2luZG93UmVjdChod25kLCAmcmVjdCk7Ci0JCQkJU2V0V2luZG93UG9zKGxwaGMtPmhXbmRMQm94LCAwLCByZWN0LmxlZnQsIHJlY3QuYm90dG9tLCAwLCAwLCAKLQkJCQkJCQkJCVNXUF9OT1JFRFJBVyB8IFNXUF9OT1NJWkUpOyAKLQkJCQlTZXRXaW5kb3dQb3MobHBoYy0+aFduZExCb3gsIDAsIDAsIDAsIDAsIDAsIFNXUF9TSE9XV0lORE9XIHwgCi0JCQkJCQkJCQlTV1BfTk9NT1ZFIHwgU1dQX05PU0laRSB8IFNXUF9OT1pPUkRFUik7IAotCQkJICAgIFNldEZvY3VzKGxwaGMtPmhXbmRMQm94KTsKLQkJCQl9Ci0JCQllbHNlIHsKLQkJCQlTaG93V2luZG93KGxwaGMtPmhXbmRMQm94LCBTV19ISURFKTsKLQkJCQl5ID0gU2VuZE1lc3NhZ2UobHBoYy0+aFduZExCb3gsIExCX0dFVENVUlNFTCwgMCwgMEwpOwotCQkJCWlmICh5ICE9IExCX0VSUikgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhTdHIgPSBVU0VSX0hFQVBfQUxMT0MoIDI1NiApOwotCQkJCQlTZW5kTWVzc2FnZShscGhjLT5oV25kTEJveCwgTEJfR0VUVEVYVCwgKFdPUkQpeSwgVVNFUl9IRUFQX1NFR19BRERSKGhTdHIpKTsKLQkJCQkJaWYgKGxwaGMtPmhXbmRFZGl0ICE9IDApIAotCQkJCQkJU2VuZE1lc3NhZ2UobHBoYy0+aFduZEVkaXQsIFdNX1NFVFRFWFQsIChXT1JEKXksIFVTRVJfSEVBUF9TRUdfQUREUihoU3RyKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNFUl9IRUFQX0ZSRUUoIGhTdHIgKTsKLQkJCQkJfQotCQkJCX0KLQkJICAgIH0KLQkJZWxzZSB7Ci0JCSAgICBzd2l0Y2god1BhcmFtKSB7Ci0JCQkJY2FzZSBWS19IT01FOgotCQkJCSAgICB5ID0gMDsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBWS19FTkQ6Ci0JCQkJICAgIHkgPSBjb3VudCAtIDE7Ci0JCQkJICAgIGJyZWFrOwotCQkJCWNhc2UgVktfVVA6Ci0JCQkJICAgIHktLTsKLQkJCQkgICAgYnJlYWs7Ci0JCQkJY2FzZSBWS19ET1dOOgotCQkJCSAgICB5Kys7Ci0JCQkJICAgIGJyZWFrOwotCQkJCX0KLQkJCWlmICh5IDwgMCkgeSA9IDA7Ci0JCQlpZiAoeSA+PSBjb3VudCkgeSA9IGNvdW50IC0gMTsKLQkJCWxwaGMtPkxhc3RTZWwgPSB5OwotCQkJU2VuZE1lc3NhZ2UobHBoYy0+aFduZExCb3gsIExCX1NFVENVUlNFTCwgeSwgMEwpOwotICAgICAgICAgICAgICAgICAgICAgICAgaFN0ciA9IFVTRVJfSEVBUF9BTExPQyggMjU2ICk7Ci0JCQlTZW5kTWVzc2FnZShscGhjLT5oV25kTEJveCwgTEJfR0VUVEVYVCwgKFdPUkQpeSwgVVNFUl9IRUFQX1NFR19BRERSKGhTdHIpKTsKLQkJCWlmIChscGhjLT5oV25kRWRpdCAhPSAwKSAKLQkJCQlTZW5kTWVzc2FnZShscGhjLT5oV25kRWRpdCwgV01fU0VUVEVYVCwgKFdPUkQpeSwgVVNFUl9IRUFQX1NFR19BRERSKGhTdHIpKTsKLQkJCVNlbmRNZXNzYWdlKEdldFBhcmVudChod25kKSwgV01fQ09NTUFORCwgd25kUHRyLT53SURtZW51LAotCQkJTUFLRUxPTkcoaHduZCwgQ0JOX1NFTENIQU5HRSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgVVNFUl9IRUFQX0ZSRUUoIGhTdHIgKTsKLQkJCX0KLQkJYnJlYWs7Ci0gICAgY2FzZSBXTV9NRUFTVVJFSVRFTToKLQlkcHJpbnRmX2NvbWJvKHN0ZGRlYiwiQ29tYm9Cb3hXbmRQcm9jIFdNX01FQVNVUkVJVEVNICFcbiIpOwotICAgIAlyZXR1cm4oU2VuZE1lc3NhZ2UoR2V0UGFyZW50KGh3bmQpLCBXTV9NRUFTVVJFSVRFTSwgd1BhcmFtLCBsUGFyYW0pKTsKLSAgICBjYXNlIFdNX0NUTENPTE9SOgotICAgIAlyZXR1cm4oU2VuZE1lc3NhZ2UoR2V0UGFyZW50KGh3bmQpLCBXTV9DVExDT0xPUiwgd1BhcmFtLCBsUGFyYW0pKTsKLQljYXNlIFdNX1NFVFJFRFJBVzoKLQkJZHByaW50Zl9jb21ibyhzdGRkZWIsIkNvbWJvQm94V25kUHJvYyBXTV9TRVRSRURSQVcgaFduZD0lMDRYIHc9JTA0WCAhXG4iLCBod25kLCB3UGFyYW0pOwotCQlscGhjID0gQ29tYm9HZXRTdG9yYWdlSGVhZGVyKGh3bmQpOwotCQlpZiAobHBoYyA9PSBOVUxMKSByZXR1cm4gMDsKLQkJbHBoYy0+YlJlZHJhd0ZsYWcgPSB3UGFyYW07Ci0JCWJyZWFrOwotICAgIGNhc2UgV01fRFJBV0lURU06Ci0JCWRwcmludGZfY29tYm8oc3RkZGViLCJDb21ib0JveFduZFByb2MgLy8gV01fRFJBV0lURU0gdz0lMDRYIGw9JTA4bFhcbiIsIHdQYXJhbSwgbFBhcmFtKTsKLQkJd25kUHRyID0gV0lOX0ZpbmRXbmRQdHIoaHduZCk7Ci0JCWlmICh3bmRQdHIgPT0gTlVMTCkgYnJlYWs7Ci0JCWxwZGlzID0gKExQRFJBV0lURU1TVFJVQ1QpUFRSX1NFR19UT19MSU4obFBhcmFtKTsKLQkJaWYgKGxwZGlzID09IE5VTEwpIGJyZWFrOwotCQlscGRpcy0+Q3RsVHlwZSA9IE9EVF9DT01CT0JPWDsKLQkJbHBkaXMtPkN0bElEID0gd25kUHRyLT53SURtZW51OwotCQlyZXR1cm4oU2VuZE1lc3NhZ2UoR2V0UGFyZW50KGh3bmQpLCBXTV9EUkFXSVRFTSwgd1BhcmFtLCBsUGFyYW0pKTsKLSAgICBjYXNlIFdNX1BBSU5UOgotCQlHZXRDbGllbnRSZWN0KGh3bmQsICZyZWN0KTsKLQkJaERDID0gQmVnaW5QYWludChod25kLCAmcGFpbnRzdHJ1Y3QpOwotCQlpZiAoaENvbWJvQml0ICE9IDApIHsKLQkJCUdldE9iamVjdChoQ29tYm9CaXQsIHNpemVvZihCSVRNQVApLCAoTFBTVFIpJmJtKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIEdSQVBIX0RyYXdCaXRtYXAoIGhEQywgaENvbWJvQml0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjdC5yaWdodCAtIGJtLmJtV2lkdGgsIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAwLCBibS5ibVdpZHRoLCBibS5ibUhlaWdodCApOwotCQkJfQotCQlFbmRQYWludChod25kLCAmcGFpbnRzdHJ1Y3QpOwotCQlscGhjID0gQ29tYm9HZXRTdG9yYWdlSGVhZGVyKGh3bmQpOwotCQlpZiAobHBoYyA9PSBOVUxMKSByZXR1cm4gMDsKLQkJaWYgKGxwaGMtPmhXbmRFZGl0ICE9IDApIHsKLQkJCUludmFsaWRhdGVSZWN0KGxwaGMtPmhXbmRFZGl0LCBOVUxMLCBUUlVFKTsKLQkJCVVwZGF0ZVdpbmRvdyhscGhjLT5oV25kRWRpdCk7Ci0JCQl9Ci0JCWVsc2UgewotCQkJQ29tYm9Cb3hTdGF0aWNPd25lckRyYXcoaHduZCwgbHBoYyk7Ci0JCQl9Ci0JCWlmICgobHBoYy0+ZHdTdGF0ZSAmIENCX1NIT1dEUk9QRE9XTikgPT0gQ0JfU0hPV0RST1BET1dOKSB7Ci0JCQlJbnZhbGlkYXRlUmVjdChscGhjLT5oV25kTEJveCwgTlVMTCwgVFJVRSk7Ci0JCQlVcGRhdGVXaW5kb3cobHBoYy0+aFduZExCb3gpOwotCQkJfQotCQlicmVhazsKLQljYXNlIFdNX1NFVEZPQ1VTOgotCQlscGhjID0gQ29tYm9HZXRTdG9yYWdlSGVhZGVyKGh3bmQpOwotCQlpZiAobHBoYyA9PSBOVUxMKSByZXR1cm4gMDsKLQkJaWYgKGxwaGMtPmhXbmRFZGl0ICE9IDApIAotCQkJU2V0Rm9jdXMobHBoYy0+aFduZEVkaXQpOwotCQlicmVhazsKLQljYXNlIFdNX0tJTExGT0NVUzoKLQkJbHBoYyA9IENvbWJvR2V0U3RvcmFnZUhlYWRlcihod25kKTsKLQkJaWYgKGxwaGMgPT0gTlVMTCkgcmV0dXJuIDA7Ci0JCVNob3dXaW5kb3cobHBoYy0+aFduZExCb3gsIFNXX0hJREUpOwotCQl5ID0gU2VuZE1lc3NhZ2UobHBoYy0+aFduZExCb3gsIExCX0dFVENVUlNFTCwgMCwgMEwpOwotCQlpZiAoeSAhPSBMQl9FUlIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGhTdHIgPSBVU0VSX0hFQVBfQUxMT0MoIDI1NiApOwotCQkJU2VuZE1lc3NhZ2UobHBoYy0+aFduZExCb3gsIExCX0dFVFRFWFQsIChXT1JEKXksIFVTRVJfSEVBUF9TRUdfQUREUihoU3RyKSk7Ci0JCQlpZiAobHBoYy0+aFduZEVkaXQgIT0gMCkgCi0JCQkJU2VuZE1lc3NhZ2UobHBoYy0+aFduZEVkaXQsIFdNX1NFVFRFWFQsIChXT1JEKXksIFVTRVJfSEVBUF9TRUdfQUREUihoU3RyKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBVU0VSX0hFQVBfRlJFRSggaFN0ciApOwotCQkJfQotCQlicmVhazsKLQljYXNlIENCX0FERFNUUklORzoKLQkJZHByaW50Zl9jb21ibyhzdGRkZWIsIkNCX0FERFNUUklORyAnJXMnICFcbiIsIChMUFNUUilQVFJfU0VHX1RPX0xJTihsUGFyYW0pKTsKLQkJbHBoYyA9IENvbWJvR2V0U3RvcmFnZUhlYWRlcihod25kKTsKLQkJaWYgKGxwaGMgPT0gTlVMTCkgcmV0dXJuIDA7Ci0JCXJldHVybihTZW5kTWVzc2FnZShscGhjLT5oV25kTEJveCwgTEJfQUREU1RSSU5HLCB3UGFyYW0sIGxQYXJhbSkpOwotICAgIGNhc2UgQ0JfR0VUTEJURVhUOgotCQlkcHJpbnRmX2NvbWJvKHN0ZGRlYiwiQ0JfR0VUTEJURVhUICMldSAhXG4iLCB3UGFyYW0pOwotCQlscGhjID0gQ29tYm9HZXRTdG9yYWdlSGVhZGVyKGh3bmQpOwotCQlpZiAobHBoYyA9PSBOVUxMKSByZXR1cm4gMDsKLQkJcmV0dXJuKFNlbmRNZXNzYWdlKGxwaGMtPmhXbmRMQm94LCBMQl9HRVRURVhULCB3UGFyYW0sIGxQYXJhbSkpOwotICAgIGNhc2UgQ0JfR0VUTEJURVhUTEVOOgotCQlkcHJpbnRmX2NvbWJvKHN0ZGRlYiwiQ0JfR0VUTEJURVhUTEVOICFcbiIpOwotCQlscGhjID0gQ29tYm9HZXRTdG9yYWdlSGVhZGVyKGh3bmQpOwotCQlpZiAobHBoYyA9PSBOVUxMKSByZXR1cm4gMDsKLQkJcmV0dXJuKFNlbmRNZXNzYWdlKGxwaGMtPmhXbmRMQm94LCBMQl9HRVRURVhUTEVOLCB3UGFyYW0sIGxQYXJhbSkpOwotICAgIGNhc2UgQ0JfSU5TRVJUU1RSSU5HOgotCQlkcHJpbnRmX2NvbWJvKHN0ZGRlYiwiQ0JfSU5TRVJUU1RSSU5HICclcycgIVxuIiwoTFBTVFIpUFRSX1NFR19UT19MSU4obFBhcmFtKSk7Ci0JCWxwaGMgPSBDb21ib0dldFN0b3JhZ2VIZWFkZXIoaHduZCk7Ci0JCWlmIChscGhjID09IE5VTEwpIHJldHVybiAwOwotCQlyZXR1cm4oU2VuZE1lc3NhZ2UobHBoYy0+aFduZExCb3gsIExCX0lOU0VSVFNUUklORywgd1BhcmFtLCBsUGFyYW0pKTsKLQljYXNlIENCX0RFTEVURVNUUklORzoKLQkJZHByaW50Zl9jb21ibyhzdGRkZWIsIkNCX0RFTEVURVNUUklORyAjJXUgIVxuIiwgd1BhcmFtKTsKLQkJbHBoYyA9IENvbWJvR2V0U3RvcmFnZUhlYWRlcihod25kKTsKLQkJaWYgKGxwaGMgPT0gTlVMTCkgcmV0dXJuIDA7Ci0JCXJldHVybihTZW5kTWVzc2FnZShscGhjLT5oV25kTEJveCwgTEJfREVMRVRFU1RSSU5HLCB3UGFyYW0sIDBMKSk7Ci0JY2FzZSBDQl9SRVNFVENPTlRFTlQ6Ci0JCWRwcmludGZfY29tYm8oc3RkZGViLCJDQl9SRVNFVENPTlRFTlQgIVxuIik7Ci0JCWxwaGMgPSBDb21ib0dldFN0b3JhZ2VIZWFkZXIoaHduZCk7Ci0JCWlmIChscGhjID09IE5VTEwpIHJldHVybiAwOwotCQlyZXR1cm4oU2VuZE1lc3NhZ2UobHBoYy0+aFduZExCb3gsIExCX1JFU0VUQ09OVEVOVCwgMCwgMEwpKTsKLSAgICBjYXNlIENCX0RJUjoKLQkJZHByaW50Zl9jb21ibyhzdGRkZWIsIkNvbWJvQm94IENCX0RJUiAhXG4iKTsKLQkJbHBoYyA9IENvbWJvR2V0U3RvcmFnZUhlYWRlcihod25kKTsKLQkJaWYgKGxwaGMgPT0gTlVMTCkgcmV0dXJuIDA7Ci0JCXJldHVybihTZW5kTWVzc2FnZShscGhjLT5oV25kTEJveCwgTEJfRElSLCB3UGFyYW0sIGxQYXJhbSkpOwotCWNhc2UgQ0JfRklORFNUUklORzoKLQkJbHBoYyA9IENvbWJvR2V0U3RvcmFnZUhlYWRlcihod25kKTsKLQkJcmV0dXJuKFNlbmRNZXNzYWdlKGxwaGMtPmhXbmRMQm94LCBMQl9GSU5EU1RSSU5HLCB3UGFyYW0sIGxQYXJhbSkpOwotCWNhc2UgQ0JfR0VUQ09VTlQ6Ci0JCWxwaGMgPSBDb21ib0dldFN0b3JhZ2VIZWFkZXIoaHduZCk7Ci0JCWlmIChscGhjID09IE5VTEwpIHJldHVybiAwOwotCQlyZXR1cm4oU2VuZE1lc3NhZ2UobHBoYy0+aFduZExCb3gsIExCX0dFVENPVU5ULCAwLCAwTCkpOwotCWNhc2UgQ0JfR0VUQ1VSU0VMOgotCQlkcHJpbnRmX2NvbWJvKHN0ZGRlYiwiQ29tYm9Cb3ggQ0JfR0VUQ1VSU0VMICFcbiIpOwotCQlscGhjID0gQ29tYm9HZXRTdG9yYWdlSGVhZGVyKGh3bmQpOwotCQlpZiAobHBoYyA9PSBOVUxMKSByZXR1cm4gMDsKLQkJcmV0dXJuKFNlbmRNZXNzYWdlKGxwaGMtPmhXbmRMQm94LCBMQl9HRVRDVVJTRUwsIDAsIDBMKSk7Ci0gICAgY2FzZSBDQl9TRVRDVVJTRUw6Ci0JCWRwcmludGZfY29tYm8oc3RkZGViLCJDb21ib0JveCBDQl9TRVRDVVJTRUwgd1BhcmFtPSVYICFcbiIsIHdQYXJhbSk7Ci0JCWxwaGMgPSBDb21ib0dldFN0b3JhZ2VIZWFkZXIoaHduZCk7Ci0JCWlmIChscGhjID09IE5VTEwpIHJldHVybiAwOwotCQlyZXR1cm4oU2VuZE1lc3NhZ2UobHBoYy0+aFduZExCb3gsIExCX1NFVENVUlNFTCwgd1BhcmFtLCAwTCkpOwotCWNhc2UgQ0JfR0VURURJVFNFTDoKLQkJZHByaW50Zl9jb21ibyhzdGRkZWIsIkNvbWJvQm94IENCX0dFVEVESVRTRUwgIVxuIik7Ci0JCWxwaGMgPSBDb21ib0dldFN0b3JhZ2VIZWFkZXIoaHduZCk7Ci0JCWlmIChscGhjID09IE5VTEwpIHJldHVybiAwOwotLyoJCWlmIChscGhjLT5oV25kRWRpdCAhPSAwKQotCQkJcmV0dXJuKFNlbmRNZXNzYWdlKGxwaGMtPmhXbmRFZGl0LCBFTV9HRVRTRUwsIDAsIDBMKSk7ICovCi0JCWJyZWFrOwotCWNhc2UgQ0JfU0VURURJVFNFTDoKLQkJZHByaW50Zl9jb21ibyhzdGRkZWIsIkNvbWJvQm94IENCX1NFVEVESVRTRUwgbFBhcmFtPSVsWCAhXG4iLCAKLQkJCSAgICAgIGxQYXJhbSk7Ci0JCWxwaGMgPSBDb21ib0dldFN0b3JhZ2VIZWFkZXIoaHduZCk7Ci0JCWlmIChscGhjID09IE5VTEwpIHJldHVybiAwOwotLyoJCWlmIChscGhjLT5oV25kRWRpdCAhPSAwKQotCQkJcmV0dXJuKFNlbmRNZXNzYWdlKGxwaGMtPmhXbmRFZGl0LCBFTV9TRVRTRUwsIDAsIGxQYXJhbSkpOyAqLwotCQlicmVhazsKLQljYXNlIENCX1NFTEVDVFNUUklORzoKLQkJZHByaW50Zl9jb21ibyhzdGRkZWIsIkNvbWJvQm94IENCX1NFTEVDVFNUUklORyAhXG4iKTsKLQkJbHBoYyA9IENvbWJvR2V0U3RvcmFnZUhlYWRlcihod25kKTsKLQkJaWYgKGxwaGMgPT0gTlVMTCkgcmV0dXJuIDA7Ci0JCWJyZWFrOwotCWNhc2UgQ0JfU0hPV0RST1BET1dOOgotCQlkcHJpbnRmX2NvbWJvKHN0ZGRlYiwiQ29tYm9Cb3ggQ0JfU0hPV0RST1BET1dOICFcbiIpOwotCQlscGhjID0gQ29tYm9HZXRTdG9yYWdlSGVhZGVyKGh3bmQpOwotCQlpZiAobHBoYyA9PSBOVUxMKSByZXR1cm4gMDsKLQkJd25kUHRyID0gV0lOX0ZpbmRXbmRQdHIoaHduZCk7Ci0JCWxwaGMtPmR3U3RhdGUgPSBscGhjLT5kd1N0YXRlIHwgQ0JfU0hPV0RST1BET1dOOwotCQlpZiAod1BhcmFtICE9IDApIHsKLQkJCUdldFdpbmRvd1JlY3QoaHduZCwgJnJlY3QpOwotCQkJU2V0V2luZG93UG9zKGxwaGMtPmhXbmRMQm94LCAwLCByZWN0LmxlZnQsIHJlY3QuYm90dG9tLCAwLCAwLCAKLQkJCQkJCQkJU1dQX05PUkVEUkFXIHwgU1dQX05PU0laRSk7IAotCQkJU2V0V2luZG93UG9zKGxwaGMtPmhXbmRMQm94LCAwLCAwLCAwLCAwLCAwLCBTV1BfU0hPV1dJTkRPVyB8IAotCQkJCQkJCQlTV1BfTk9NT1ZFIHwgU1dQX05PU0laRSB8IFNXUF9OT1pPUkRFUik7IAotCQkJfQotCQllbHNlIHsKLQkJCWxwaGMtPmR3U3RhdGUgPSBscGhjLT5kd1N0YXRlIF4gQ0JfU0hPV0RST1BET1dOOwotCQkJU2hvd1dpbmRvdyhscGhjLT5oV25kTEJveCwgU1dfSElERSk7Ci0JCQlTZW5kTWVzc2FnZShHZXRQYXJlbnQoaHduZCksIFdNX0NPTU1BTkQsIHduZFB0ci0+d0lEbWVudSwKLQkJCQkJCQkJCU1BS0VMT05HKGh3bmQsIENCTl9EUk9QRE9XTikpOwotCQl9Ci0JCWJyZWFrOwotICAgIGNhc2UgQ0JfR0VUSVRFTURBVEE6Ci0JCWRwcmludGZfY29tYm8oc3RkZGViLCJDb21ib0JveCBDQl9HRVRJVEVNREFUQSB3UGFyYW09JVggIVxuIiwgd1BhcmFtKTsKLQkJbHBoYyA9IENvbWJvR2V0U3RvcmFnZUhlYWRlcihod25kKTsKLQkJaWYgKGxwaGMgPT0gTlVMTCkgcmV0dXJuIDA7Ci0JCXJldHVybihTZW5kTWVzc2FnZShscGhjLT5oV25kTEJveCwgTEJfR0VUSVRFTURBVEEsIHdQYXJhbSwgMEwpKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBDQl9TRVRJVEVNREFUQToKLQkJZHByaW50Zl9jb21ibyhzdGRkZWIsIkNvbWJvQm94IENCX1NFVElURU1EQVRBIHdQYXJhbT0lMDRYIGxQYXJhbT0lMDhsWCFcbiIsIHdQYXJhbSwgbFBhcmFtKTsKLQkJbHBoYyA9IENvbWJvR2V0U3RvcmFnZUhlYWRlcihod25kKTsKLQkJaWYgKGxwaGMgPT0gTlVMTCkgcmV0dXJuIDA7Ci0JCXJldHVybihTZW5kTWVzc2FnZShscGhjLT5oV25kTEJveCwgTEJfU0VUSVRFTURBVEEsIHdQYXJhbSwgbFBhcmFtKSk7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgQ0JfTElNSVRURVhUOgotCQlkcHJpbnRmX2NvbWJvKHN0ZGRlYiwiQ29tYm9Cb3ggQ0JfTElNSVRURVhUICFcbiIpOwotCQlscGhjID0gQ29tYm9HZXRTdG9yYWdlSGVhZGVyKGh3bmQpOwotCQlpZiAobHBoYyA9PSBOVUxMKSByZXR1cm4gMDsKLS8qCQlpZiAobHBoYy0+aFduZEVkaXQgIT0gMCkgCi0JICAgICAgICByZXR1cm4oU2VuZE1lc3NhZ2UobHBoYy0+aFduZEVkaXQsIEVNX0xJTUlUVEVYVCwgd1BhcmFtLCAwTCkpOyAqLwotICAgICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0JCXJldHVybiBEZWZXaW5kb3dQcm9jKCBod25kLCBtZXNzYWdlLCB3UGFyYW0sIGxQYXJhbSApOworICB3aGlsZSAoaWR4IDwgdGFibGVfc2l6ZSkgeworICAgIGlmIChtZXNzYWdlID09IGNvbWJvX3RibFtpZHhdLm1lc3NhZ2UpIHsKKyAgICAgIHJldHVybiAoKihjb21ib190YmxbaWR4XS5oYW5kbGVyKSkoaHduZCwgbWVzc2FnZSwgd1BhcmFtLCBsUGFyYW0pOwogICAgIH0KLXJldHVybiAwOworICAgIGlkeCsrOworICB9CisgIHJldHVybiBEZWZXaW5kb3dQcm9jIChod25kLCBtZXNzYWdlLCB3UGFyYW0sIGxQYXJhbSk7CiB9CiAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogQ29tYm9MQm94IGNvZGUgc3RhcnRzIGhlcmUgKi8KIAotCi1MUEhFQURDT01CTyBDb21ib0dldFN0b3JhZ2VIZWFkZXIoSFdORCBod25kKQorSFdORCBDTEJveEdldENvbWJvKEhXTkQgaHduZCkKIHsKLQlXTkQgICp3bmRQdHI7Ci0JTFBIRUFEQ09NQk8gbHBoYzsKLQl3bmRQdHIgPSBXSU5fRmluZFduZFB0cihod25kKTsKLQlpZiAod25kUHRyID09IDApIHsKLQkJZnByaW50ZihzdGRlcnIsIkJhZCBXaW5kb3cgaGFuZGxlIG9uIENvbWJvQm94ICFcbiIpOwotCQlyZXR1cm4gMDsKLQkJfQotCWxwaGMgPSAqKChMUEhFQURDT01CTyAqKSZ3bmRQdHItPndFeHRyYVsxXSk7Ci0JcmV0dXJuIGxwaGM7CisgIHJldHVybiBHZXRXaW5kb3dXb3JkKGh3bmQsMCk7CiB9CiAKLQotCi1pbnQgQ3JlYXRlQ29tYm9TdHJ1Y3QoSFdORCBod25kKQorTFBIRUFETElTVCBDTEJveEdldExpc3RIZWFkZXIoSFdORCBod25kKQogewotCVdORCAgKnduZFB0cjsKLQlMUEhFQURDT01CTyBscGhjOwotCXduZFB0ciA9IFdJTl9GaW5kV25kUHRyKGh3bmQpOwotCWlmICh3bmRQdHIgPT0gMCkgewotCQlmcHJpbnRmKHN0ZGVyciwiQmFkIFdpbmRvdyBoYW5kbGUgb24gQ29tYm9Cb3ggIVxuIik7Ci0JCXJldHVybiAwOwotCQl9Ci0JbHBoYyA9IChMUEhFQURDT01CTyltYWxsb2Moc2l6ZW9mKEhFQURDT01CTykpOwotCSooKExQSEVBRENPTUJPICopJnduZFB0ci0+d0V4dHJhWzFdKSA9IGxwaGM7Ci0JbHBoYy0+aFduZEVkaXQgPSAwOwotCWxwaGMtPmhXbmRMQm94ID0gMDsKLQlscGhjLT5kd1N0YXRlID0gMDsKLQlscGhjLT5MYXN0U2VsID0gLTE7Ci0JcmV0dXJuIFRSVUU7CisgIHJldHVybiBDb21ib0dldExpc3RIZWFkZXIoQ0xCb3hHZXRDb21ibyhod25kKSk7CiB9CiAKLQotdm9pZCBDb21ib0JveFN0YXRpY093bmVyRHJhdyhIV05EIGhXbmQsIExQSEVBRENPTUJPIGxwaGMpCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBDQkxDcmVhdGUKKyAqLworc3RhdGljIExPTkcgQ0JMQ3JlYXRlKCBIV05EIGh3bmQsIFdPUkQgbWVzc2FnZSwgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtICkKIHsKLQlIREMgICAgIGhEQzsKLQlIQlJVU0ggIGhCcnVzaDsKLQlzaG9ydCAgIHk7Ci0JTFBTVFIgICBwdHIgPSBOVUxMOwotCUhBTkRMRSAgaFRlbXA7Ci0JV05EICAgICAgICp3bmRQdHI7Ci0JTFBEUkFXSVRFTVNUUlVDVCBscGRpczsKLQlkcHJpbnRmX2NvbWJvKHN0ZGRlYiwiQ29tYm9Cb3hTdGF0aWNPd25lckRyYXcoJTA0WCwgJXApICFcbiIsIGhXbmQsIGxwaGMpOwotCXkgPSBTZW5kTWVzc2FnZShscGhjLT5oV25kTEJveCwgTEJfR0VUQ1VSU0VMLCAwLCAwTCk7Ci0JaWYgKHkgIT0gTEJfRVJSKSB7Ci0JCXB0ciA9IChMUFNUUilTZW5kTWVzc2FnZShscGhjLT5oV25kTEJveCwgTEJfR0VUSVRFTURBVEEsIHksIDBMKTsKLQkJfQotCWhEQyA9IEdldERDKGhXbmQpOwotCWhCcnVzaCA9IFNlbmRNZXNzYWdlKEdldFBhcmVudChoV25kKSwgV01fQ1RMQ09MT1IsIChXT1JEKWhEQywKLQkJCQkJCU1BS0VMT05HKGhXbmQsIENUTENPTE9SX1NUQVRJQykpOyAKLQlpZiAoaEJydXNoID09IChIQlJVU0gpTlVMTCkgIGhCcnVzaCA9IEdldFN0b2NrT2JqZWN0KFdISVRFX0JSVVNIKTsKLQl3bmRQdHIgPSBXSU5fRmluZFduZFB0cihoV25kKTsKLQlpZiAod25kUHRyID09IE5VTEwpIHJldHVybjsKLQloVGVtcCA9IFVTRVJfSEVBUF9BTExPQyggc2l6ZW9mKERSQVdJVEVNU1RSVUNUKSApOwotCWxwZGlzID0gKExQRFJBV0lURU1TVFJVQ1QpIFVTRVJfSEVBUF9MSU5fQUREUihoVGVtcCk7Ci0JaWYgKGxwZGlzID09IE5VTEwpIHsKLQkJcHJpbnRmKCJDb21ib0JveCBPd25lcmRyYXcgLy8gRXJyb3IgYWxsb2NhdGluZyBEUkFXSVRFTVNUUlVDVCAhXG4iKTsKLSAgICAgICAgICAgICAgICBSZWxlYXNlREMoIGhXbmQsIGhEQyApOwotCQlyZXR1cm47Ci0JCX0KLQlGaWxsUmVjdChoREMsICZscGhjLT5SZWN0RWRpdCwgaEJydXNoKTsKLQlscGRpcy0+aERDID0gaERDOwotCWlmICh5ICE9IExCX0VSUikgbHBkaXMtPml0ZW1JRCA9IHkgLSAxOwotCUNvcHlSZWN0KCZscGRpcy0+cmNJdGVtLCAmbHBoYy0+UmVjdEVkaXQpOwotCWxwZGlzLT5pdGVtRGF0YSA9IChEV09SRClwdHI7Ci0JbHBkaXMtPml0ZW1BY3Rpb24gPSBPREFfRFJBV0VOVElSRTsKLQlscGRpcy0+Q3RsVHlwZSA9IE9EVF9DT01CT0JPWDsKLQlscGRpcy0+Q3RsSUQgPSB3bmRQdHItPndJRG1lbnU7Ci0JU2VuZE1lc3NhZ2UoR2V0UGFyZW50KGhXbmQpLCBXTV9EUkFXSVRFTSwgeSxVU0VSX0hFQVBfU0VHX0FERFIoaFRlbXApKTsKLQlVU0VSX0hFQVBfRlJFRShoVGVtcCk7Ci0JUmVsZWFzZURDKGhXbmQsIGhEQyk7CisgIENSRUFURVNUUlVDVCAqY3JlYXRlU3RydWN0ID0gKENSRUFURVNUUlVDVCAqKVBUUl9TRUdfVE9fTElOKGxQYXJhbSk7CisgIFNldFdpbmRvd1dvcmQoaHduZCwwLExPV09SRChjcmVhdGVTdHJ1Y3QtPmxwQ3JlYXRlUGFyYW1zKSk7CisgIHJldHVybiAwOwogfQogCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBDQkxHZXREbGdDb2RlCisgKi8KK3N0YXRpYyBMT05HIENCTEdldERsZ0NvZGUoIEhXTkQgaHduZCwgV09SRCBtZXNzYWdlLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0gKQoreworICByZXR1cm4gRExHQ19XQU5UQVJST1dTIHwgRExHQ19XQU5UQ0hBUlM7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIENCTEtleURvd24KKyAqLworc3RhdGljIExPTkcgQ0JMS2V5RG93biggSFdORCBod25kLCBXT1JEIG1lc3NhZ2UsIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSApIAoreworICBMUEhFQURMSVNUIGxwaGwgPSBDTEJveEdldExpc3RIZWFkZXIoaHduZCk7CisgIFdPUkQgbmV3Rm9jdXNlZCA9IGxwaGwtPkl0ZW1Gb2N1c2VkOworCisgIHN3aXRjaCh3UGFyYW0pIHsKKyAgY2FzZSBWS19IT01FOgorICAgIG5ld0ZvY3VzZWQgPSAwOworICAgIGJyZWFrOworICBjYXNlIFZLX0VORDoKKyAgICBuZXdGb2N1c2VkID0gbHBobC0+SXRlbXNDb3VudCAtIDE7CisgICAgYnJlYWs7CisgIGNhc2UgVktfVVA6CisgICAgaWYgKG5ld0ZvY3VzZWQgPiAwKSBuZXdGb2N1c2VkLS07CisgICAgYnJlYWs7CisgIGNhc2UgVktfRE9XTjoKKyAgICBuZXdGb2N1c2VkKys7CisgICAgYnJlYWs7CisgIGNhc2UgVktfUFJJT1I6CisgICAgaWYgKG5ld0ZvY3VzZWQgPiBscGhsLT5JdGVtc1Zpc2libGUpIHsKKyAgICAgIG5ld0ZvY3VzZWQgLT0gbHBobC0+SXRlbXNWaXNpYmxlOworICAgIH0gZWxzZSB7CisgICAgICBuZXdGb2N1c2VkID0gMDsKKyAgICB9CisgICAgYnJlYWs7CisgIGNhc2UgVktfTkVYVDoKKyAgICBuZXdGb2N1c2VkICs9IGxwaGwtPkl0ZW1zVmlzaWJsZTsKKyAgICBicmVhazsKKyAgZGVmYXVsdDoKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIGlmIChuZXdGb2N1c2VkID49IGxwaGwtPkl0ZW1zQ291bnQpCisgICAgbmV3Rm9jdXNlZCA9IGxwaGwtPkl0ZW1zQ291bnQgLSAxOworICAKKyAgTGlzdEJveFNldEN1clNlbChscGhsLCBuZXdGb2N1c2VkKTsKKyAgTGlzdEJveFNlbmROb3RpZmljYXRpb24obHBobCwgaHduZCwgQ0JOX1NFTENIQU5HRSk7CisKKyAgbHBobC0+SXRlbUZvY3VzZWQgPSBuZXdGb2N1c2VkOworICBMaXN0Qm94U2Nyb2xsVG9Gb2N1cyhscGhsKTsKKyAgU2V0U2Nyb2xsUG9zKGh3bmQsIFNCX1ZFUlQsIGxwaGwtPkZpcnN0VmlzaWJsZSwgVFJVRSk7CisgIEludmFsaWRhdGVSZWN0KGh3bmQsIE5VTEwsIFRSVUUpOyAgCisgIHJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBDQkxDaGFyCisgKi8KK3N0YXRpYyBMT05HIENCTENoYXIoIEhXTkQgaHduZCwgV09SRCBtZXNzYWdlLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0gKQoreworICByZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgQ0JMUGFpbnQKKyAqLworc3RhdGljIExPTkcgQ0JMUGFpbnQoIEhXTkQgaHduZCwgV09SRCBtZXNzYWdlLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0gKQoreworICBMUEhFQURMSVNUICAgbHBobCA9IENMQm94R2V0TGlzdEhlYWRlcihod25kKTsKKyAgTFBMSVNUU1RSVUNUIGxwbHM7CisgIFBBSU5UU1RSVUNUICBwczsKKyAgSEJSVVNIICAgICAgIGhCcnVzaDsKKyAgSEZPTlQgICAgICAgIGhPbGRGb250OworICBIREMgCWhkYzsKKyAgUkVDVCAJcmVjdDsKKyAgaW50ICAgaSwgdG9wLCBoZWlnaHQ7CisKKyAgdG9wID0gMDsKKyAgaGRjID0gQmVnaW5QYWludCggaHduZCwgJnBzICk7CisKKyAgaWYgKCFJc1dpbmRvd1Zpc2libGUoaHduZCkgfHwgIWxwaGwtPmJSZWRyYXdGbGFnKSB7CisgICAgRW5kUGFpbnQoaHduZCwgJnBzKTsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIGhPbGRGb250ID0gU2VsZWN0T2JqZWN0KGhkYywgbHBobC0+aEZvbnQpOworICBoQnJ1c2ggPSBTZW5kTWVzc2FnZShscGhsLT5oUGFyZW50LCBXTV9DVExDT0xPUiwgaGRjLAorCQkgICAgICAgTUFLRUxPTkcoaHduZCwgQ1RMQ09MT1JfTElTVEJPWCkpOworCisgIGlmIChoQnJ1c2ggPT0gMCkgaEJydXNoID0gR2V0U3RvY2tPYmplY3QoV0hJVEVfQlJVU0gpOworCisgIEdldENsaWVudFJlY3QoaHduZCwgJnJlY3QpOworICBGaWxsUmVjdChoZGMsICZyZWN0LCBoQnJ1c2gpOworCisgIGxwbHMgPSBscGhsLT5scEZpcnN0OworCisgIGxwaGwtPkl0ZW1zVmlzaWJsZSA9IDA7CisgIGZvcihpID0gMDsgaSA8IGxwaGwtPkl0ZW1zQ291bnQ7IGkrKykgeworICAgIGlmIChscGxzID09IE5VTEwpIGJyZWFrOworCisgICAgaWYgKGkgPj0gbHBobC0+Rmlyc3RWaXNpYmxlKSB7CisgICAgICBoZWlnaHQgPSBscGxzLT5taXMuaXRlbUhlaWdodDsKKworICAgICAgaWYgKHRvcCA+IHJlY3QuYm90dG9tKSBicmVhazsKKyAgICAgIGxwbHMtPml0ZW1SZWN0LnRvcCAgICA9IHRvcDsKKyAgICAgIGxwbHMtPml0ZW1SZWN0LmJvdHRvbSA9IHRvcCArIGhlaWdodDsKKyAgICAgIGxwbHMtPml0ZW1SZWN0LmxlZnQgICA9IHJlY3QubGVmdDsKKyAgICAgIGxwbHMtPml0ZW1SZWN0LnJpZ2h0ICA9IHJlY3QucmlnaHQ7CisKKyAgICAgIGRwcmludGZfbGlzdGJveChzdGRkZWIsImRyYXdpbmcgaXRlbTogJWQgJWQgJWQgJWQgJWRcbiIscmVjdC5sZWZ0LHRvcCxyZWN0LnJpZ2h0LHRvcCtoZWlnaHQsbHBscy0+aXRlbVN0YXRlKTsKKyAgICAgIGlmIChPV05FUl9EUkFXTihscGhsKSkgeworCUxpc3RCb3hEcmF3SXRlbSAoaHduZCwgbHBobCwgaGRjLCBscGxzLCAmbHBscy0+aXRlbVJlY3QsIE9EQV9EUkFXRU5USVJFLCAwKTsKKwlpZiAobHBscy0+aXRlbVN0YXRlKQorCSAgTGlzdEJveERyYXdJdGVtIChod25kLCBscGhsLCBoZGMsIGxwbHMsICZscGxzLT5pdGVtUmVjdCwgT0RBX1NFTEVDVCwgT0RTX1NFTEVDVEVEKTsKKyAgICAgIH0gZWxzZSB7CisJTGlzdEJveERyYXdJdGVtIChod25kLCBscGhsLCBoZGMsIGxwbHMsICZscGxzLT5pdGVtUmVjdCwgT0RBX0RSQVdFTlRJUkUsIAorCQkJIGxwbHMtPml0ZW1TdGF0ZSk7CisgICAgICB9CisgICAgICBpZiAoKGxwaGwtPkl0ZW1Gb2N1c2VkID09IGkpICYmIEdldEZvY3VzKCkgPT0gaHduZCkKKwlMaXN0Qm94RHJhd0l0ZW0gKGh3bmQsbHBobCwgaGRjLCBscGxzLCAmbHBscy0+aXRlbVJlY3QsIE9EQV9GT0NVUywgT0RTX0ZPQ1VTKTsKKworICAgICAgdG9wICs9IGhlaWdodDsKKyAgICAgIGxwaGwtPkl0ZW1zVmlzaWJsZSsrOworICAgIH0KKworICAgIGxwbHMgPSBscGxzLT5scE5leHQ7CisgIH0KKyAgU2VsZWN0T2JqZWN0KGhkYyxoT2xkRm9udCk7CisgIEVuZFBhaW50KCBod25kLCAmcHMgKTsKKyAgcmV0dXJuIDA7CisKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgQ0JMS2lsbEZvY3VzCisgKi8KK3N0YXRpYyBMT05HIENCTEtpbGxGb2N1cyggSFdORCBod25kLCBXT1JEIG1lc3NhZ2UsIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSApCit7CisvKiAgU2VuZE1lc3NhZ2UoQ0xCb3hHZXRDb21ibyhod25kKSxDQl9TSE9XRFJPUERPV04sMCwwKTsqLworICByZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgQ0JMQWN0aXZhdGUKKyAqLworc3RhdGljIExPTkcgQ0JMQWN0aXZhdGUoIEhXTkQgaHduZCwgV09SRCBtZXNzYWdlLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0gKQoreworICBpZiAod1BhcmFtID09IFdBX0lOQUNUSVZFKQorICAgIFNlbmRNZXNzYWdlKENMQm94R2V0Q29tYm8oaHduZCksQ0JfU0hPV0RST1BET1dOLDAsMCk7CisgIHJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBDQkxMQnV0dG9uRG93bgorICovCitzdGF0aWMgTE9ORyBDQkxMQnV0dG9uRG93biggSFdORCBod25kLCBXT1JEIG1lc3NhZ2UsIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSApCit7CisgIExQSEVBRExJU1QgbHBobCA9IENMQm94R2V0TGlzdEhlYWRlcihod25kKTsKKyAgV09SRCAgICAgICB3UmV0OworICBpbnQgICAgICAgIHk7CisgIFJFQ1QgICAgICAgcmVjdHNlbDsKKworICBTZXRGb2N1cyhod25kKTsKKyAgU2V0Q2FwdHVyZShod25kKTsKKworICBscGhsLT5QcmV2Rm9jdXNlZCA9IGxwaGwtPkl0ZW1Gb2N1c2VkOworCisgIHkgPSBMaXN0Qm94RmluZE1vdXNlKGxwaGwsIExPV09SRChsUGFyYW0pLCBISVdPUkQobFBhcmFtKSk7CisgIGlmICh5ID09IC0xKQorICAgIHJldHVybiAwOworCisgIExpc3RCb3hTZXRDdXJTZWwobHBobCwgeSk7CisgIExpc3RCb3hHZXRJdGVtUmVjdChscGhsLCB5LCAmcmVjdHNlbCk7CisKKyAgSW52YWxpZGF0ZVJlY3QoaHduZCwgTlVMTCwgVFJVRSk7CisgIHJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBDQkxMQnV0dG9uVXAKKyAqLworc3RhdGljIExPTkcgQ0JMTEJ1dHRvblVwKCBIV05EIGh3bmQsIFdPUkQgbWVzc2FnZSwgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtICkKK3sKKyAgTFBIRUFETElTVCBscGhsID0gQ0xCb3hHZXRMaXN0SGVhZGVyKGh3bmQpOworCisgIGlmIChHZXRDYXB0dXJlKCkgPT0gaHduZCkgUmVsZWFzZUNhcHR1cmUoKTsKKworICBpZiAobHBobC0+UHJldkZvY3VzZWQgIT0gbHBobC0+SXRlbUZvY3VzZWQpIHsKKyAgICBTZW5kTWVzc2FnZShDTEJveEdldENvbWJvKGh3bmQpLENCX1NFVENVUlNFTCxscGhsLT5JdGVtRm9jdXNlZCwwKTsKKyAgICBMaXN0Qm94U2VuZE5vdGlmaWNhdGlvbihscGhsLCBDTEJveEdldENvbWJvKGh3bmQpLCBDQk5fU0VMQ0hBTkdFKTsKKyAgfQorICBTZW5kTWVzc2FnZShDTEJveEdldENvbWJvKGh3bmQpLENCX1NIT1dEUk9QRE9XTiwwLDApOworCisgIHJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBDQkxNb3VzZU1vdmUKKyAqLworc3RhdGljIExPTkcgQ0JMTW91c2VNb3ZlKCBIV05EIGh3bmQsIFdPUkQgbWVzc2FnZSwgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtICkKK3sKKyAgTFBIRUFETElTVCBscGhsID0gQ0xCb3hHZXRMaXN0SGVhZGVyKGh3bmQpOworICBpbnQgIHk7CisgIFdPUkQgd1JldDsKKyAgUkVDVCByZWN0LCByZWN0c2VsOyAgIC8qIFhYWCBCcm9rZW4gKi8KKworICBpZiAoKHdQYXJhbSAmIE1LX0xCVVRUT04pICE9IDApIHsKKyAgICB5ID0gU0hJV09SRChsUGFyYW0pOworICAgIGlmICh5IDwgMCkgeworICAgICAgaWYgKGxwaGwtPkZpcnN0VmlzaWJsZSA+IDApIHsKKwlscGhsLT5GaXJzdFZpc2libGUtLTsKKwlTZXRTY3JvbGxQb3MoaHduZCwgU0JfVkVSVCwgbHBobC0+Rmlyc3RWaXNpYmxlLCBUUlVFKTsKKwlJbnZhbGlkYXRlUmVjdChod25kLCBOVUxMLCBUUlVFKTsKKwlyZXR1cm4gMDsKKyAgICAgIH0KKyAgICB9CisgICAgR2V0Q2xpZW50UmVjdChod25kLCAmcmVjdCk7CisgICAgaWYgKHkgPj0gcmVjdC5ib3R0b20pIHsKKyAgICAgIGlmIChscGhsLT5GaXJzdFZpc2libGUgPCBMaXN0TWF4Rmlyc3RWaXNpYmxlKGxwaGwpKSB7CisJbHBobC0+Rmlyc3RWaXNpYmxlKys7CisJU2V0U2Nyb2xsUG9zKGh3bmQsIFNCX1ZFUlQsIGxwaGwtPkZpcnN0VmlzaWJsZSwgVFJVRSk7CisJSW52YWxpZGF0ZVJlY3QoaHduZCwgTlVMTCwgVFJVRSk7CisJcmV0dXJuIDA7CisgICAgICB9CisgICAgfQorICAgIGlmICgoeSA+IDApICYmICh5IDwgKHJlY3QuYm90dG9tIC0gNCkpKSB7CisgICAgICBpZiAoKHkgPCByZWN0c2VsLnRvcCkgfHwgKHkgPiByZWN0c2VsLmJvdHRvbSkpIHsKKwl3UmV0ID0gTGlzdEJveEZpbmRNb3VzZShscGhsLCBMT1dPUkQobFBhcmFtKSwgSElXT1JEKGxQYXJhbSkpOworCWlmICh3UmV0ID09IGxwaGwtPkl0ZW1Gb2N1c2VkKSByZXR1cm4gMDsKKwlMaXN0Qm94U2V0Q3VyU2VsKGxwaGwsIHdSZXQpOworCUxpc3RCb3hHZXRJdGVtUmVjdChscGhsLCB3UmV0LCAmcmVjdHNlbCk7CisJSW52YWxpZGF0ZVJlY3QoaHduZCwgTlVMTCwgVFJVRSk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIENCTFZTY3JvbGwKKyAqLworc3RhdGljIExPTkcgQ0JMVlNjcm9sbCggSFdORCBod25kLCBXT1JEIG1lc3NhZ2UsIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSApCit7CisgIExQSEVBRExJU1QgbHBobCA9IENMQm94R2V0TGlzdEhlYWRlcihod25kKTsKKyAgaW50ICB5OworCisgIHkgPSBscGhsLT5GaXJzdFZpc2libGU7CisKKyAgc3dpdGNoKHdQYXJhbSkgeworICBjYXNlIFNCX0xJTkVVUDoKKyAgICBpZiAobHBobC0+Rmlyc3RWaXNpYmxlID4gMCkKKyAgICAgIGxwaGwtPkZpcnN0VmlzaWJsZS0tOworICAgIGJyZWFrOworCisgIGNhc2UgU0JfTElORURPV046CisgICAgbHBobC0+Rmlyc3RWaXNpYmxlKys7CisgICAgYnJlYWs7CisKKyAgY2FzZSBTQl9QQUdFVVA6CisgICAgaWYgKGxwaGwtPkZpcnN0VmlzaWJsZSA+IGxwaGwtPkl0ZW1zVmlzaWJsZSkgeworICAgICAgbHBobC0+Rmlyc3RWaXNpYmxlIC09IGxwaGwtPkl0ZW1zVmlzaWJsZTsKKyAgICB9IGVsc2UgeworICAgICAgbHBobC0+Rmlyc3RWaXNpYmxlID0gMDsKKyAgICB9CisgICAgYnJlYWs7CisKKyAgY2FzZSBTQl9QQUdFRE9XTjoKKyAgICBscGhsLT5GaXJzdFZpc2libGUgKz0gbHBobC0+SXRlbXNWaXNpYmxlOworICAgIGJyZWFrOworCisgIGNhc2UgU0JfVEhVTUJUUkFDSzoKKyAgICBscGhsLT5GaXJzdFZpc2libGUgPSBMT1dPUkQobFBhcmFtKTsKKyAgICBicmVhazsKKyAgfQorCisgIGlmIChscGhsLT5GaXJzdFZpc2libGUgPiBMaXN0TWF4Rmlyc3RWaXNpYmxlKGxwaGwpKQorICAgIGxwaGwtPkZpcnN0VmlzaWJsZSA9IExpc3RNYXhGaXJzdFZpc2libGUobHBobCk7CisKKyAgaWYgKHkgIT0gbHBobC0+Rmlyc3RWaXNpYmxlKSB7CisgICAgU2V0U2Nyb2xsUG9zKGh3bmQsIFNCX1ZFUlQsIGxwaGwtPkZpcnN0VmlzaWJsZSwgVFJVRSk7CisgICAgSW52YWxpZGF0ZVJlY3QoaHduZCwgTlVMTCwgVFJVRSk7CisgIH0KKworICByZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgQ29tYm9MQm94V25kUHJvYworICovCitMT05HIENvbWJvTEJveFduZFByb2MoSFdORCBod25kLCBXT1JEIG1lc3NhZ2UsIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSkKK3sKKyAgaW50IGlkeCA9IDA7CisgIGludCB0YWJsZV9zaXplID0gc2l6ZW9mIChjbGJveF90YmwpIC8gc2l6ZW9mIChtc2dfdGJsKTsKKworICB3aGlsZSAoaWR4IDwgdGFibGVfc2l6ZSkgeworICAgIGlmIChtZXNzYWdlID09IGNsYm94X3RibFtpZHhdLm1lc3NhZ2UpIHsKKyAgICAgIHJldHVybiAoKihjbGJveF90YmxbaWR4XS5oYW5kbGVyKSkoaHduZCwgbWVzc2FnZSwgd1BhcmFtLCBsUGFyYW0pOworICAgIH0KKyAgICBpZHgrKzsKKyAgfQorICByZXR1cm4gRGVmV2luZG93UHJvYyAoaHduZCwgbWVzc2FnZSwgd1BhcmFtLCBsUGFyYW0pOworfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAJCQkJCURsZ0RpclNlbGVjdENvbWJvQm94CVtVU0VSLjE5NF0KKyAqIAkJCSAgICAgICAJRGxnRGlyU2VsZWN0Q29tYm9Cb3gJW1VTRVIuMTk0XQogICovCiBCT09MIERsZ0RpclNlbGVjdENvbWJvQm94KEhXTkQgaERsZywgTFBTVFIgbHBTdHIsIGludCBuSURMQm94KQogewpAQCAtNTIzLDE5ICsxMDM2LDQ4IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAJCQkJCURsZ0Rpckxpc3RDb21ib0JveCAgICAgW1VTRVIuMTk1XQogICovCi1pbnQgRGxnRGlyTGlzdENvbWJvQm94KEhXTkQgaERsZywgU0VHUFRSIGxwUGF0aFNwZWMsIAotCWludCBuSURMQm94LCBpbnQgbklEU3RhdCwgV09SRCB3VHlwZSkKK2ludCBEbGdEaXJMaXN0Q29tYm9Cb3goSFdORCBoRGxnLCBTRUdQVFIgUGF0aFNwZWMsCisJCSAgICAgICBpbnQgbklETEJveCwgaW50IG5JRFN0YXQsIFdPUkQgd1R5cGUpCiB7Ci0JSFdORAkJaFduZDsKLQlMUEhFQURDT01CTyBscGhjOwotCWRwcmludGZfY29tYm8oc3RkZGViLCJEbGdEaXJMaXN0Q29tYm9Cb3goJTA0WCwgJyVzJywgJWQsICVkLCAlMDRYKSBcbiIsCi0JCQloRGxnLCAoY2hhciAqKVBUUl9TRUdfVE9fTElOKGxwUGF0aFNwZWMpLCBuSURMQm94LCBuSURTdGF0LCB3VHlwZSk7Ci0JaFduZCA9IEdldERsZ0l0ZW0oaERsZywgbklETEJveCk7Ci0JbHBoYyA9IENvbWJvR2V0U3RvcmFnZUhlYWRlcihoV25kKTsKLQlpZiAobHBoYyA9PSBOVUxMKSByZXR1cm4gMDsKLQlTZW5kTWVzc2FnZShscGhjLT5oV25kTEJveCwgTEJfUkVTRVRDT05URU5ULCAwLCAwTCk7Ci0JcmV0dXJuIFNlbmRNZXNzYWdlKGxwaGMtPmhXbmRMQm94LCBMQl9ESVIsIHdUeXBlLCAoRFdPUkQpbHBQYXRoU3BlYyk7CisgIEhXTkQJaFduZDsKKyAgaW50IHJldDsKKyAgTFBTVFIgbHBQYXRoU3BlYyA9IFBUUl9TRUdfVE9fTElOKFBhdGhTcGVjKTsKKyAgCisgIGRwcmludGZfY29tYm8oc3RkZGViLCJEbGdEaXJMaXN0Q29tYm9Cb3goJTA0WCwgJyVzJywgJWQsICVkLCAlMDRYKSBcbiIsCisJCSAgaERsZywgbHBQYXRoU3BlYywgbklETEJveCwgbklEU3RhdCwgd1R5cGUpOworICBpZiAobklETEJveCkgeworICAgIExQSEVBRExJU1QgbHBobDsKKyAgICBMUEhFQURDT01CTyBscGhjOworICAgIGhXbmQgPSBHZXREbGdJdGVtKGhEbGcsIG5JRExCb3gpOworICAgIGxwaGwgPSBDb21ib0dldExpc3RIZWFkZXIoaFduZCk7CisgICAgbHBoYyA9IENvbWJvR2V0U3RvcmFnZUhlYWRlcihoV25kKTsKKyAgICBMaXN0Qm94UmVzZXRDb250ZW50KGxwaGwpOworICAgIHJldCA9IExpc3RCb3hEaXJlY3RvcnkobHBobCwgd1R5cGUsIGxwUGF0aFNwZWMpOworICAgIENvbWJvVXBkYXRlV2luZG93KGhXbmQsIGxwaGwsIGxwaGMsIFRSVUUpOworICB9IGVsc2UgeworICAgIHJldCA9IDA7CisgIH0KKyAgaWYgKG5JRFN0YXQpIHsKKyAgICAgIGludCBkcml2ZTsKKyAgICAgIEhBTkRMRSBoVGVtcDsKKyAgICAgIGNoYXIgKnRlbXA7CisgICAgICBkcml2ZSA9IERPU19HZXREZWZhdWx0RHJpdmUoKTsKKyAgICAgIGhUZW1wID0gVVNFUl9IRUFQX0FMTE9DKCAyNTYgKTsKKyAgICAgIHRlbXAgPSAoY2hhciAqKSBVU0VSX0hFQVBfTElOX0FERFIoIGhUZW1wICk7CisgICAgICBzdHJjcHkoIHRlbXArMywgRE9TX0dldEN1cnJlbnREaXIoZHJpdmUpICk7CisgICAgICBpZiggdGVtcFszXSA9PSAnXFwnICkgeworCXRlbXBbMV0gPSAnQScrZHJpdmU7CisJdGVtcFsyXSA9ICc6JzsKKwlTZW5kRGxnSXRlbU1lc3NhZ2UoIGhEbGcsIG5JRFN0YXQsIFdNX1NFVFRFWFQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNFUl9IRUFQX1NFR19BRERSKGhUZW1wKSArIDEgKTsKKyAgICAgIH0gZWxzZSB7CisJdGVtcFswXSA9ICdBJytkcml2ZTsKKwl0ZW1wWzFdID0gJzonOworCXRlbXBbMl0gPSAnXFwnOworCVNlbmREbGdJdGVtTWVzc2FnZSggaERsZywgbklEU3RhdCwgV01fU0VUVEVYVCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBVU0VSX0hFQVBfU0VHX0FERFIoaFRlbXApICk7CisgICAgICB9CisgICAgICBVU0VSX0hFQVBfRlJFRSggaFRlbXAgKTsKKyAgfSAKKyAgcmV0dXJuIHJldDsKIH0KLQotCi0KZGlmZiAtLWdpdCBhL2NvbnRyb2xzL2Rlc2t0b3AuYyBiL2NvbnRyb2xzL2Rlc2t0b3AuYwppbmRleCA5YmE3OGI0Li4wOTYwOTJlIDEwMDY0NAotLS0gYS9jb250cm9scy9kZXNrdG9wLmMKKysrIGIvY29udHJvbHMvZGVza3RvcC5jCkBAIC0xMTQsMzEgKzExNCw2IEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgREVTS1RPUF9Jbml0Ci0gKgotICogSW5pdGlhbGl6ZSB0aGUgZGVza3RvcCB3aW5kb3cgcHJpdmF0ZSBpbmZvcm1hdGlvbi4KLSAqLwotQk9PTCBERVNLVE9QX0luaXQoKQotewotICAgIEhXTkQgaHduZCA9IEdldERlc2t0b3BXaW5kb3coKTsKLSAgICBXTkQgKnduZFB0ciA9IFdJTl9GaW5kV25kUHRyKCBod25kICk7Ci0gICAgREVTS1RPUElORk8gKmluZm9QdHIgPSAoREVTS1RPUElORk8gKil3bmRQdHItPndFeHRyYTsKLQotICAgIGluZm9QdHItPmhicnVzaFBhdHRlcm4gPSAwOwotICAgIGluZm9QdHItPmhiaXRtYXBXYWxsUGFwZXIgPSAwOwotICAgIFNldERlc2tQYXR0ZXJuKCk7Ci0gICAgU2V0RGVza1dhbGxQYXBlciggKExQU1RSKS0xICk7Ci0gICAgaWYgKHJvb3RXaW5kb3cgIT0gRGVmYXVsdFJvb3RXaW5kb3coZGlzcGxheSkpCi0gICAgewotICAgICAgICBIREMgaGRjID0gR2V0REMoIGh3bmQgKTsKLSAgICAgICAgREVTS1RPUF9Eb0VyYXNlQmtnbmQoIGh3bmQsIGhkYywgaW5mb1B0ciApOwotICAgICAgICBSZWxlYXNlREMoIGh3bmQsIGhkYyApOwotICAgIH0KLSAgICByZXR1cm4gVFJVRTsKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBEZXNrdG9wV25kUHJvYwogICoKICAqIFdpbmRvdyBwcm9jZWR1cmUgZm9yIHRoZSBkZXNrdG9wIHdpbmRvdy4KZGlmZiAtLWdpdCBhL2NvbnRyb2xzL2xpc3Rib3guYyBiL2NvbnRyb2xzL2xpc3Rib3guYwppbmRleCBkMjBlNTY4Li43NWIxYTM3IDEwMDY0NAotLS0gYS9jb250cm9scy9saXN0Ym94LmMKKysrIGIvY29udHJvbHMvbGlzdGJveC5jCkBAIC0xLDE4ICsxLDIxIEBACiAvKgotICogSW50ZXJmYWNlIGNvZGUgdG8gbGlzdGJveCB3aWRnZXRzCi0gKgorICogTGlzdGJveCBjb250cm9scworICogCiAgKiBDb3B5cmlnaHQgIE1hcnRpbiBBeW90dGUsIDE5OTMKICAqIENvcHlyaWdodCAgQ29uc3RhbnRpbmUgU2FwdW50emFraXMsIDE5OTUKLSAqCi1zdGF0aWMgY2hhciBDb3B5cmlnaHRbXSA9ICJDb3B5cmlnaHQgTWFydGluIEF5b3R0ZSwgMTk5MyI7Ci0qLworICogCisgKi8KKworIC8qCisgICogVE9ETzogCisgICogLSBjaGVjayBpZiBtdWx0aS1jb2x1bW4gbGlzdGJveGVzIHdvcmsKKyAgKiAtIGltcGxlbWVudCBtb3JlIG1lc3NhZ2VzIGFuZCBzdHlsZXMKKyAgKi8KIAogI2luY2x1ZGUgPHN0ZGlvLmg+CiAjaW5jbHVkZSA8c3RkbGliLmg+CiAjaW5jbHVkZSA8c3RyaW5nLmg+CiAjaW5jbHVkZSA8Y3R5cGUuaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgogI2luY2x1ZGUgIndpbmRvd3MuaCIKICNpbmNsdWRlICJ1c2VyLmgiCiAjaW5jbHVkZSAid2luLmgiCkBAIC0yMiw0MyArMjUsNiBAQAogI2luY2x1ZGUgInN0ZGRlYnVnLmgiCiAjaW5jbHVkZSAiZGVidWcuaCIKIAotI2RlZmluZSBHTUVNX1pFUk9JTklUIDB4MDA0MAotCi1MUExJU1RTVFJVQ1QgTGlzdEJveEdldEl0ZW0gKEhXTkQgaHduZCwgVUlOVCB1SW5kZXgpOwotaW50IExpc3RCb3hTY3JvbGx0b0ZvY3VzKEhXTkQgaHduZCk7Ci1MUEhFQURMSVNUIExpc3RCb3hHZXRXaW5kb3dBbmRTdG9yYWdlKEhXTkQgaHduZCwgV05EICoqd25kUHRyKTsKLUxQSEVBRExJU1QgTGlzdEJveEdldFN0b3JhZ2VIZWFkZXIoSFdORCBod25kKTsKLXZvaWQgUmVwYWludExpc3RCb3goSFdORCBod25kKTsKLWludCBMaXN0Qm94RmluZE1vdXNlKEhXTkQgaHduZCwgaW50IFgsIGludCBZKTsKLWludCBDcmVhdGVMaXN0Qm94U3RydWN0KEhXTkQgaHduZCk7Ci12b2lkIExpc3RCb3hBc2tNZWFzdXJlKFdORCAqd25kUHRyLCBMUEhFQURMSVNUIGxwaGwsIExQTElTVFNUUlVDVCBscGxzKTsKLWludCBMaXN0Qm94QWRkU3RyaW5nKEhXTkQgaHduZCwgTFBTVFIgbmV3c3RyKTsKLWludCBMaXN0Qm94SW5zZXJ0U3RyaW5nKEhXTkQgaHduZCwgVUlOVCB1SW5kZXgsIExQU1RSIG5ld3N0cik7Ci1pbnQgTGlzdEJveEdldFRleHQoSFdORCBod25kLCBVSU5UIHVJbmRleCwgTFBTVFIgT3V0U3RyLCBCT09MIGJJdGVtRGF0YSk7Ci1pbnQgTGlzdEJveFNldEl0ZW1EYXRhKEhXTkQgaHduZCwgVUlOVCB1SW5kZXgsIERXT1JEIEl0ZW1EYXRhKTsKLWludCBMaXN0Qm94RGVsZXRlU3RyaW5nKEhXTkQgaHduZCwgVUlOVCB1SW5kZXgpOwotaW50IExpc3RCb3hGaW5kU3RyaW5nKEhXTkQgaHduZCwgVUlOVCBuRmlyc3QsIExQU1RSIE1hdGNoU3RyKTsKLWludCBMaXN0Qm94UmVzZXRDb250ZW50KEhXTkQgaHduZCk7Ci1pbnQgTGlzdEJveFNldEN1clNlbChIV05EIGh3bmQsIFdPUkQgd0luZGV4KTsKLWludCBMaXN0Qm94U2V0U2VsKEhXTkQgaHduZCwgV09SRCB3SW5kZXgsIFdPUkQgc3RhdGUpOwotaW50IExpc3RCb3hHZXRTZWwoSFdORCBod25kLCBXT1JEIHdJbmRleCk7Ci1pbnQgTGlzdEJveERpcmVjdG9yeShIV05EIGh3bmQsIFVJTlQgYXR0cmliLCBMUFNUUiBmaWxlc3BlYyk7Ci1pbnQgTGlzdEJveEdldEl0ZW1SZWN0KEhXTkQgaHduZCwgV09SRCB3SW5kZXgsIExQUkVDVCByZWN0KTsKLWludCBMaXN0Qm94U2V0SXRlbUhlaWdodChIV05EIGh3bmQsIFdPUkQgd0luZGV4LCBsb25nIGhlaWdodCk7Ci1pbnQgTGlzdEJveERlZmF1bHRJdGVtKEhXTkQgaHduZCwgV05EICp3bmRQdHIsIAotCUxQSEVBRExJU1QgbHBobCwgTFBMSVNUU1RSVUNUIGxwbHMpOwotaW50IExpc3RCb3hGaW5kTmV4dE1hdGNoKEhXTkQgaHduZCwgV09SRCB3Q2hhcik7Ci1pbnQgTGlzdE1heEZpcnN0VmlzaWJsZShMUEhFQURMSVNUIGxwaGwpOwotdm9pZCBMaXN0Qm94U2VuZE5vdGlmaWNhdGlvbihIV05EIGh3bmQsIFdPUkQgY29kZSk7Ci0KLSNkZWZpbmUgT1dORVJfRFJBV04od25kUHRyKSBcCi0gICgod25kUHRyLT5kd1N0eWxlICYgTEJTX09XTkVSRFJBV0ZJWEVEKSB8fCAgXAotICAgKHduZFB0ci0+ZHdTdHlsZSAmIExCU19PV05FUkRSQVdWQVJJQUJMRSkpCi0KLSNkZWZpbmUgSGFzU3RyaW5ncyh3bmRQdHIpICggIFwKLSAgKCEgT1dORVJfRFJBV04gKHduZFB0cikpIHx8IFwKLSAgKHduZFB0ci0+ZHdTdHlsZSAmIExCU19IQVNTVFJJTkdTKSkKLQogI2lmIDAKICNkZWZpbmUgTElTVF9IRUFQX0FMTE9DKGxwaGwsZixzaXplKSAoKGludClIRUFQX0FsbG9jKCZscGhsLT5IZWFwLGYsc2l6ZSkgJiAweGZmZmYpCiAjZGVmaW5lIExJU1RfSEVBUF9GUkVFKGxwaGwsaGFuZGxlKSAoSEVBUF9GcmVlKCZscGhsLT5IZWFwLExJU1RfSEVBUF9BRERSKGxwaGwsaGFuZGxlKSkpCkBAIC03Niw1MiArNDIsNTIgQEAKIAogLyogRGVzaWduIG5vdGVzIGdvIGhlcmUgKi8KIAotTE9ORyBMQkNyZWF0ZSggSFdORCBod25kLCBXT1JEIG1lc3NhZ2UsIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSApOwotTE9ORyBMQkdldERsZ0NvZGUoIEhXTkQgaHduZCwgV09SRCBtZXNzYWdlLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0gKTsKLUxPTkcgTEJEZXN0cm95KCBIV05EIGh3bmQsIFdPUkQgbWVzc2FnZSwgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtICk7Ci1MT05HIExCVlNjcm9sbCggSFdORCBod25kLCBXT1JEIG1lc3NhZ2UsIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSApOwotTE9ORyBMQkhTY3JvbGwoIEhXTkQgaHduZCwgV09SRCBtZXNzYWdlLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0gKTsKLUxPTkcgTEJMQnV0dG9uRG93biggSFdORCBod25kLCBXT1JEIG1lc3NhZ2UsIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSApOwotTE9ORyBMQkxCdXR0b25VcCggSFdORCBod25kLCBXT1JEIG1lc3NhZ2UsIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSApOwotTE9ORyBMQlJCdXR0b25VcCggSFdORCBod25kLCBXT1JEIG1lc3NhZ2UsIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSApOwotTE9ORyBMQk1vdXNlTW92ZSggSFdORCBod25kLCBXT1JEIG1lc3NhZ2UsIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSApOwotTE9ORyBMQktleURvd24oIEhXTkQgaHduZCwgV09SRCBtZXNzYWdlLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0gKTsKLUxPTkcgTEJTZXRGb250KCBIV05EIGh3bmQsIFdPUkQgbWVzc2FnZSwgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtICk7Ci1MT05HIExCU2V0UmVkcmF3KCBIV05EIGh3bmQsIFdPUkQgbWVzc2FnZSwgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtICk7Ci1MT05HIExCUGFpbnQoIEhXTkQgaHduZCwgV09SRCBtZXNzYWdlLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0gKTsKLUxPTkcgTEJTZXRGb2N1cyggSFdORCBod25kLCBXT1JEIG1lc3NhZ2UsIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSApOwotTE9ORyBMQktpbGxGb2N1cyggSFdORCBod25kLCBXT1JEIG1lc3NhZ2UsIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSApOwotTE9ORyBMQlJlc2V0Q29udGVudCggSFdORCBod25kLCBXT1JEIG1lc3NhZ2UsIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSApOwotTE9ORyBMQkRpciggSFdORCBod25kLCBXT1JEIG1lc3NhZ2UsIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSApOwotTE9ORyBMQkFkZFN0cmluZyggSFdORCBod25kLCBXT1JEIG1lc3NhZ2UsIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSApOwotTE9ORyBMQkdldFRleHQoIEhXTkQgaHduZCwgV09SRCBtZXNzYWdlLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0gKTsKLUxPTkcgTEJJbnNlcnRTdHJpbmcoIEhXTkQgaHduZCwgV09SRCBtZXNzYWdlLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0gKTsKLUxPTkcgTEJEZWxldGVTdHJpbmcoIEhXTkQgaHduZCwgV09SRCBtZXNzYWdlLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0gKTsKLUxPTkcgTEJGaW5kU3RyaW5nKCBIV05EIGh3bmQsIFdPUkQgbWVzc2FnZSwgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtICk7Ci1MT05HIExCR2V0Q2FyZXRJbmRleCggSFdORCBod25kLCBXT1JEIG1lc3NhZ2UsIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSApOwotTE9ORyBMQkdldENvdW50KCBIV05EIGh3bmQsIFdPUkQgbWVzc2FnZSwgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtICk7Ci1MT05HIExCR2V0Q3VyU2VsKCBIV05EIGh3bmQsIFdPUkQgbWVzc2FnZSwgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtICk7Ci1MT05HIExCR2V0SG9yaXpvbnRhbEV4dGVudChIV05EIGh3bmQsIFdPUkQgbWVzc2FnZSwgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtICk7Ci1MT05HIExCR2V0SXRlbURhdGEoIEhXTkQgaHduZCwgV09SRCBtZXNzYWdlLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0gKTsKLUxPTkcgTEJHZXRJdGVtSGVpZ2h0KCBIV05EIGh3bmQsIFdPUkQgbWVzc2FnZSwgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtICk7Ci1MT05HIExCR2V0SXRlbVJlY3QoIEhXTkQgaHduZCwgV09SRCBtZXNzYWdlLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0gKTsKLUxPTkcgTEJHZXRTZWwoIEhXTkQgaHduZCwgV09SRCBtZXNzYWdlLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0gKTsKLUxPTkcgTEJHZXRTZWxDb3VudCggSFdORCBod25kLCBXT1JEIG1lc3NhZ2UsIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSApOwotTE9ORyBMQkdldFNlbEl0ZW1zKCBIV05EIGh3bmQsIFdPUkQgbWVzc2FnZSwgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtICk7Ci1MT05HIExCR2V0VGV4dExlbiggSFdORCBod25kLCBXT1JEIG1lc3NhZ2UsIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSApOwotTE9ORyBMQkdldFRvcEluZGV4KCBIV05EIGh3bmQsIFdPUkQgbWVzc2FnZSwgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtICk7Ci1MT05HIExCU2VsZWN0U3RyaW5nKCBIV05EIGh3bmQsIFdPUkQgbWVzc2FnZSwgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtICk7Ci1MT05HIExCU2VsSXRlbVJhbmdlKCBIV05EIGh3bmQsIFdPUkQgbWVzc2FnZSwgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtICk7Ci1MT05HIExCU2V0Q2FyZXRJbmRleCggSFdORCBod25kLCBXT1JEIG1lc3NhZ2UsIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSApOwotTE9ORyBMQlNldENvbHVtbldpZHRoKCBIV05EIGh3bmQsIFdPUkQgbWVzc2FnZSwgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtICk7Ci1MT05HIExCU2V0SG9yaXpvbnRhbEV4dGVudChIV05EIGh3bmQsIFdPUkQgbWVzc2FnZSwgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtICk7Ci1MT05HIExCU2V0SXRlbURhdGEoIEhXTkQgaHduZCwgV09SRCBtZXNzYWdlLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0gKTsKLUxPTkcgTEJTZXRUYWJTdG9wcyggSFdORCBod25kLCBXT1JEIG1lc3NhZ2UsIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSApOwotTE9ORyBMQlNldEN1clNlbCggSFdORCBod25kLCBXT1JEIG1lc3NhZ2UsIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSApOwotTE9ORyBMQlNldFNlbCggSFdORCBod25kLCBXT1JEIG1lc3NhZ2UsIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSApOwotTE9ORyBMQlNldFRvcEluZGV4KCBIV05EIGh3bmQsIFdPUkQgbWVzc2FnZSwgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtICk7Ci1MT05HIExCU2V0SXRlbUhlaWdodCggSFdORCBod25kLCBXT1JEIG1lc3NhZ2UsIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSApOwotCitzdGF0aWMgTE9ORyBMQkNyZWF0ZSggSFdORCBod25kLCBXT1JEIG1lc3NhZ2UsIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSApOworc3RhdGljIExPTkcgTEJHZXREbGdDb2RlKCBIV05EIGh3bmQsIFdPUkQgbWVzc2FnZSwgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtICk7CitzdGF0aWMgTE9ORyBMQkRlc3Ryb3koIEhXTkQgaHduZCwgV09SRCBtZXNzYWdlLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0gKTsKK3N0YXRpYyBMT05HIExCVlNjcm9sbCggSFdORCBod25kLCBXT1JEIG1lc3NhZ2UsIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSApOworc3RhdGljIExPTkcgTEJIU2Nyb2xsKCBIV05EIGh3bmQsIFdPUkQgbWVzc2FnZSwgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtICk7CitzdGF0aWMgTE9ORyBMQkxCdXR0b25Eb3duKCBIV05EIGh3bmQsIFdPUkQgbWVzc2FnZSwgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtICk7CitzdGF0aWMgTE9ORyBMQkxCdXR0b25VcCggSFdORCBod25kLCBXT1JEIG1lc3NhZ2UsIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSApOworc3RhdGljIExPTkcgTEJSQnV0dG9uVXAoIEhXTkQgaHduZCwgV09SRCBtZXNzYWdlLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0gKTsKK3N0YXRpYyBMT05HIExCTW91c2VNb3ZlKCBIV05EIGh3bmQsIFdPUkQgbWVzc2FnZSwgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtICk7CitzdGF0aWMgTE9ORyBMQktleURvd24oIEhXTkQgaHduZCwgV09SRCBtZXNzYWdlLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0gKTsKK3N0YXRpYyBMT05HIExCQ2hhciggSFdORCBod25kLCBXT1JEIG1lc3NhZ2UsIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSApOworc3RhdGljIExPTkcgTEJTZXRGb250KCBIV05EIGh3bmQsIFdPUkQgbWVzc2FnZSwgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtICk7CitzdGF0aWMgTE9ORyBMQlNldFJlZHJhdyggSFdORCBod25kLCBXT1JEIG1lc3NhZ2UsIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSApOworc3RhdGljIExPTkcgTEJQYWludCggSFdORCBod25kLCBXT1JEIG1lc3NhZ2UsIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSApOworc3RhdGljIExPTkcgTEJTZXRGb2N1cyggSFdORCBod25kLCBXT1JEIG1lc3NhZ2UsIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSApOworc3RhdGljIExPTkcgTEJLaWxsRm9jdXMoIEhXTkQgaHduZCwgV09SRCBtZXNzYWdlLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0gKTsKK3N0YXRpYyBMT05HIExCUmVzZXRDb250ZW50KCBIV05EIGh3bmQsIFdPUkQgbWVzc2FnZSwgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtICk7CitzdGF0aWMgTE9ORyBMQkRpciggSFdORCBod25kLCBXT1JEIG1lc3NhZ2UsIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSApOworc3RhdGljIExPTkcgTEJBZGRTdHJpbmcoIEhXTkQgaHduZCwgV09SRCBtZXNzYWdlLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0gKTsKK3N0YXRpYyBMT05HIExCR2V0VGV4dCggSFdORCBod25kLCBXT1JEIG1lc3NhZ2UsIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSApOworc3RhdGljIExPTkcgTEJJbnNlcnRTdHJpbmcoIEhXTkQgaHduZCwgV09SRCBtZXNzYWdlLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0gKTsKK3N0YXRpYyBMT05HIExCRGVsZXRlU3RyaW5nKCBIV05EIGh3bmQsIFdPUkQgbWVzc2FnZSwgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtICk7CitzdGF0aWMgTE9ORyBMQkZpbmRTdHJpbmcoIEhXTkQgaHduZCwgV09SRCBtZXNzYWdlLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0gKTsKK3N0YXRpYyBMT05HIExCR2V0Q2FyZXRJbmRleCggSFdORCBod25kLCBXT1JEIG1lc3NhZ2UsIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSApOworc3RhdGljIExPTkcgTEJHZXRDb3VudCggSFdORCBod25kLCBXT1JEIG1lc3NhZ2UsIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSApOworc3RhdGljIExPTkcgTEJHZXRDdXJTZWwoIEhXTkQgaHduZCwgV09SRCBtZXNzYWdlLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0gKTsKK3N0YXRpYyBMT05HIExCR2V0SG9yaXpvbnRhbEV4dGVudChIV05EIGh3bmQsIFdPUkQgbWVzc2FnZSwgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtICk7CitzdGF0aWMgTE9ORyBMQkdldEl0ZW1EYXRhKCBIV05EIGh3bmQsIFdPUkQgbWVzc2FnZSwgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtICk7CitzdGF0aWMgTE9ORyBMQkdldEl0ZW1IZWlnaHQoIEhXTkQgaHduZCwgV09SRCBtZXNzYWdlLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0gKTsKK3N0YXRpYyBMT05HIExCR2V0SXRlbVJlY3QoIEhXTkQgaHduZCwgV09SRCBtZXNzYWdlLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0gKTsKK3N0YXRpYyBMT05HIExCR2V0U2VsKCBIV05EIGh3bmQsIFdPUkQgbWVzc2FnZSwgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtICk7CitzdGF0aWMgTE9ORyBMQkdldFNlbENvdW50KCBIV05EIGh3bmQsIFdPUkQgbWVzc2FnZSwgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtICk7CitzdGF0aWMgTE9ORyBMQkdldFNlbEl0ZW1zKCBIV05EIGh3bmQsIFdPUkQgbWVzc2FnZSwgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtICk7CitzdGF0aWMgTE9ORyBMQkdldFRleHRMZW4oIEhXTkQgaHduZCwgV09SRCBtZXNzYWdlLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0gKTsKK3N0YXRpYyBMT05HIExCR2V0VG9wSW5kZXgoIEhXTkQgaHduZCwgV09SRCBtZXNzYWdlLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0gKTsKK3N0YXRpYyBMT05HIExCU2VsZWN0U3RyaW5nKCBIV05EIGh3bmQsIFdPUkQgbWVzc2FnZSwgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtICk7CitzdGF0aWMgTE9ORyBMQlNlbEl0ZW1SYW5nZSggSFdORCBod25kLCBXT1JEIG1lc3NhZ2UsIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSApOworc3RhdGljIExPTkcgTEJTZXRDYXJldEluZGV4KCBIV05EIGh3bmQsIFdPUkQgbWVzc2FnZSwgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtICk7CitzdGF0aWMgTE9ORyBMQlNldENvbHVtbldpZHRoKCBIV05EIGh3bmQsIFdPUkQgbWVzc2FnZSwgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtICk7CitzdGF0aWMgTE9ORyBMQlNldEhvcml6b250YWxFeHRlbnQoSFdORCBod25kLCBXT1JEIG1lc3NhZ2UsIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSApOworc3RhdGljIExPTkcgTEJTZXRJdGVtRGF0YSggSFdORCBod25kLCBXT1JEIG1lc3NhZ2UsIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSApOworc3RhdGljIExPTkcgTEJTZXRUYWJTdG9wcyggSFdORCBod25kLCBXT1JEIG1lc3NhZ2UsIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSApOworc3RhdGljIExPTkcgTEJTZXRDdXJTZWwoIEhXTkQgaHduZCwgV09SRCBtZXNzYWdlLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0gKTsKK3N0YXRpYyBMT05HIExCU2V0U2VsKCBIV05EIGh3bmQsIFdPUkQgbWVzc2FnZSwgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtICk7CitzdGF0aWMgTE9ORyBMQlNldFRvcEluZGV4KCBIV05EIGh3bmQsIFdPUkQgbWVzc2FnZSwgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtICk7CitzdGF0aWMgTE9ORyBMQlNldEl0ZW1IZWlnaHQoIEhXTkQgaHduZCwgV09SRCBtZXNzYWdlLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0gKTsKIAogdHlwZWRlZiBzdHJ1Y3QgewogICBXT1JEICAgbWVzc2FnZTsKQEAgLTE0MCw2ICsxMDYsNyBAQAogICB7V01fTEJVVFRPTkRCTENMSywgTEJSQnV0dG9uVXB9LAogICB7V01fTU9VU0VNT1ZFLCBMQk1vdXNlTW92ZX0sCiAgIHtXTV9LRVlET1dOLCBMQktleURvd259LAorICB7V01fQ0hBUiwgTEJDaGFyfSwKICAge1dNX1NFVEZPTlQsIExCU2V0Rm9udH0sCiAgIHtXTV9TRVRSRURSQVcsIExCU2V0UmVkcmF3fSwKICAge1dNX1BBSU5ULCBMQlBhaW50fSwKQEAgLTE3NywxNDQgKzE0NCw3MzIgQEAKICAge0xCX1NFVElURU1IRUlHSFQsIExCU2V0SXRlbUhlaWdodH0KIH07CiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIExCQ3JlYXRlCi0gKi8KLUxPTkcgTEJDcmVhdGUoIEhXTkQgaHduZCwgV09SRCBtZXNzYWdlLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0gKQotCitCT09MIE9XTkVSX0RSQVdOKExQSEVBRExJU1QgbHBobCkKIHsKLSAgTFBIRUFETElTVCAgbHBobDsKLSAgQ1JFQVRFU1RSVUNUICpjcmVhdGVTdHJ1Y3Q7Ci0gIFdORCAgICAgICAgICAqd25kUHRyOwotCi0gIENyZWF0ZUxpc3RCb3hTdHJ1Y3QoaHduZCk7Ci0gIGxwaGwgPSBMaXN0Qm94R2V0V2luZG93QW5kU3RvcmFnZShod25kLCAmd25kUHRyKTsKLQotICBkcHJpbnRmX2xpc3Rib3goc3RkZGViLCJMaXN0Qm94IFdNX0NSRUFURSAlcCAhXG4iLCBscGhsKTsKLQotICBpZiAobHBobCA9PSBOVUxMKSByZXR1cm4gMDsKLQotICBjcmVhdGVTdHJ1Y3QgPSAoQ1JFQVRFU1RSVUNUICopUFRSX1NFR19UT19MSU4obFBhcmFtKTsKLQotICBpZiAoSElXT1JEKGNyZWF0ZVN0cnVjdC0+bHBDcmVhdGVQYXJhbXMpICE9IDApCi0gICAgbHBobC0+aFduZExvZ2ljUGFyZW50ID0gKEhXTkQpSElXT1JEKGNyZWF0ZVN0cnVjdC0+bHBDcmVhdGVQYXJhbXMpOwotICBlbHNlCi0gICAgbHBobC0+aFduZExvZ2ljUGFyZW50ID0gR2V0UGFyZW50KGh3bmQpOwotCi0gIGxwaGwtPmhGb250ID0gR2V0U3RvY2tPYmplY3QoU1lTVEVNX0ZPTlQpOwotICBscGhsLT5Db2x1bW5zV2lkdGggPSB3bmRQdHItPnJlY3RDbGllbnQucmlnaHQgLSB3bmRQdHItPnJlY3RDbGllbnQubGVmdDsKLQotICBTZXRTY3JvbGxSYW5nZShod25kLCBTQl9WRVJULCAxLCBMaXN0TWF4Rmlyc3RWaXNpYmxlKGxwaGwpLCBUUlVFKTsKLSAgU2V0U2Nyb2xsUmFuZ2UoaHduZCwgU0JfSE9SWiwgMSwgMSwgVFJVRSk7Ci0KLSAgcmV0dXJuIDA7CisgIHJldHVybiBscGhsLT5kd1N0eWxlICYgKExCU19PV05FUkRSQVdGSVhFRCB8IExCU19PV05FUkRSQVdWQVJJQUJMRSk7CiB9CiAKLWludCBDcmVhdGVMaXN0Qm94U3RydWN0KEhXTkQgaHduZCkKLQorQk9PTCBIYXNTdHJpbmdzKExQSEVBRExJU1QgbHBobCkKIHsKLSAgV05EICAqd25kUHRyOwotICBMUEhFQURMSVNUIGxwaGw7CisgIHJldHVybiAobHBobC0+ZHdTdHlsZSAmIExCU19IQVNTVFJJTkdTKSB8fCAhT1dORVJfRFJBV04obHBobCk7Cit9CiAKLSAgd25kUHRyID0gV0lOX0ZpbmRXbmRQdHIoaHduZCk7Ci0KLSAgbHBobCA9IChMUEhFQURMSVNUKW1hbGxvYyhzaXplb2YoSEVBRExJU1QpKTsKLSAgKigoTFBIRUFETElTVCAqKSZ3bmRQdHItPndFeHRyYVsxXSkgPSBscGhsOwotCitzdGF0aWMgdm9pZCBMaXN0Qm94SW5pdGlhbGl6ZShMUEhFQURMSVNUIGxwaGwpCit7CiAgIGxwaGwtPmxwRmlyc3QgICAgICAgID0gTlVMTDsKICAgbHBobC0+SXRlbXNDb3VudCAgICAgPSAwOwogICBscGhsLT5JdGVtc1Zpc2libGUgICA9IDA7Ci0gIGxwaGwtPkZpcnN0VmlzaWJsZSAgID0gMTsKKyAgbHBobC0+Rmlyc3RWaXNpYmxlICAgPSAwOwogICBscGhsLT5Db2x1bW5zVmlzaWJsZSA9IDE7CiAgIGxwaGwtPkl0ZW1zUGVyQ29sdW1uID0gMDsKLSAgbHBobC0+U3RkSXRlbUhlaWdodCAgPSAxNTsKICAgbHBobC0+SXRlbUZvY3VzZWQgICAgPSAtMTsKICAgbHBobC0+UHJldkZvY3VzZWQgICAgPSAtMTsKLSAgbHBobC0+RHJhd0N0bFR5cGUgICAgPSBPRFRfTElTVEJPWDsKK30KKwordm9pZCBDcmVhdGVMaXN0Qm94U3RydWN0KEhXTkQgaHduZCwgV09SRCBDdGxUeXBlLCBMT05HIHN0eWxlcywgSFdORCBwYXJlbnQpCit7CisgIExQSEVBRExJU1QgbHBobDsKKworICBscGhsID0gKExQSEVBRExJU1QpbWFsbG9jKHNpemVvZihIRUFETElTVCkpOworICBTZXRXaW5kb3dMb25nKGh3bmQsIDAsIChMT05HKWxwaGwpOworICBpZiAobHBobCA9PSBOVUxMKSB7CisgICAgZnByaW50ZihzdGRlcnIsIm1hbGxvYyBmYWlsZWQgaW4gQ3JlYXRlTGlzdEJveFN0cnVjdCgpXG4iKTsKKyAgICBleGl0KDEpOyAvKiBUaGluZ3Mgd29uJ3QgZ2V0IGJldHRlciAqLworICB9CisKKyAgTGlzdEJveEluaXRpYWxpemUobHBobCk7CisgIGxwaGwtPkRyYXdDdGxUeXBlICAgID0gQ3RsVHlwZTsKKyAgbHBobC0+Q3RsSUQgICAgICAgICAgPSBHZXRXaW5kb3dXb3JkKGh3bmQsR1dXX0lEKTsKICAgbHBobC0+YlJlZHJhd0ZsYWcgICAgPSBUUlVFOwogICBscGhsLT5pTnVtU3RvcHMgICAgICA9IDA7CiAgIGxwaGwtPlRhYlN0b3BzICAgICAgID0gTlVMTDsKKyAgbHBobC0+aEZvbnQgICAgICAgICAgPSBHZXRTdG9ja09iamVjdChTWVNURU1fRk9OVCk7CisgIGxwaGwtPmhQYXJlbnQgICAgICAgID0gcGFyZW50OworICBscGhsLT5TdGRJdGVtSGVpZ2h0ICA9IDE1OyAvKiBGSVhNRTogc2hvdWxkIGdldCB0aGUgZm9udCBoZWlnaHQgKi8KKyAgbHBobC0+ZHdTdHlsZSAgICAgICAgPSBzdHlsZXM7CiAKLSAgaWYgKE9XTkVSX0RSQVdOKHduZFB0cikpIAorICBpZiAoT1dORVJfRFJBV04obHBobCkpIHsKKyAgICBMSVNUU1RSVUNUIGR1bW15bHM7CisgICAgCiAgICAgbHBobC0+aERyYXdJdGVtU3RydWN0ID0gVVNFUl9IRUFQX0FMTE9DKHNpemVvZihEUkFXSVRFTVNUUlVDVCkpOwotICBlbHNlCisgICAgbHBobC0+bmVlZE1lYXN1cmUgPSBUUlVFOworICAgIGR1bW15bHMubWlzLkN0bFR5cGUgICAgPSBscGhsLT5EcmF3Q3RsVHlwZTsKKyAgICBkdW1teWxzLm1pcy5DdGxJRCAgICAgID0gbHBobC0+Q3RsSUQ7CisgICAgZHVtbXlscy5taXMuaXRlbUlEICAgICA9IC0xOworICAgIGR1bW15bHMubWlzLml0ZW1XaWR0aCAgPSAwOyAvKiBpZ25vcmVkICovCisgICAgZHVtbXlscy5taXMuaXRlbURhdGEgICA9IDA7CisKKyAgICBMaXN0Qm94QXNrTWVhc3VyZShscGhsLCZkdW1teWxzKTsKKyAgfSBlbHNlIHsKICAgICBscGhsLT5oRHJhd0l0ZW1TdHJ1Y3QgPSAwOworICB9CiAKICNpZiAwCiAgIEhlYXBIYW5kbGUgPSBHbG9iYWxBbGxvYyhHTUVNX0ZJWEVELCBMSVNUX0hFQVBfU0laRSk7CiAgIEhlYXBCYXNlID0gR2xvYmFsTG9jayhIZWFwSGFuZGxlKTsKICAgSEVBUF9Jbml0KCZscGhsLT5IZWFwLCBIZWFwQmFzZSwgTElTVF9IRUFQX1NJWkUpOwogI2VuZGlmCi0gIHJldHVybiBUUlVFOwogfQogCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIExCRGVzdHJveQotICovCi1MT05HIExCRGVzdHJveSggSFdORCBod25kLCBXT1JEIG1lc3NhZ2UsIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSApCi0KK3ZvaWQgRGVzdHJveUxpc3RCb3hTdHJ1Y3QoTFBIRUFETElTVCBscGhsKQogewotICBMUEhFQURMSVNUIGxwaGw7Ci0gIFdORCAgICAgICAgKnduZFB0cjsKLQotICBscGhsID0gTGlzdEJveEdldFdpbmRvd0FuZFN0b3JhZ2UoaHduZCwgJnduZFB0cik7Ci0KLSAgaWYgKGxwaGwgPT0gTlVMTCkgcmV0dXJuIDA7Ci0gIExpc3RCb3hSZXNldENvbnRlbnQoaHduZCk7Ci0KICAgaWYgKGxwaGwtPmhEcmF3SXRlbVN0cnVjdCkKICAgICBVU0VSX0hFQVBfRlJFRShscGhsLT5oRHJhd0l0ZW1TdHJ1Y3QpOwogCiAgIC8qIFhYWCBuZWVkIHRvIGZyZWUgbHBobC0+SGVhcCAqLwogICBmcmVlKGxwaGwpOwotICAqKChMUEhFQURMSVNUICopJnduZFB0ci0+d0V4dHJhWzFdKSA9IDA7Ci0gIGRwcmludGZfbGlzdGJveChzdGRkZWIsIkxpc3RCb3ggV01fREVTVFJPWSAlcCAhXG4iLCBscGhsKTsKLSAgcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBMUEhFQURMSVNUIExpc3RCb3hHZXRTdG9yYWdlSGVhZGVyKEhXTkQgaHduZCkKK3sKKyAgICByZXR1cm4gKExQSEVBRExJU1QpR2V0V2luZG93TG9uZyhod25kLDApOworfQorCisvKiBTZW5kIG5vdGlmaWNhdGlvbiAiY29kZSIgYXMgcGFydCBvZiBhIFdNX0NPTU1BTkQtbWVzc2FnZSBpZiBod25kCisgICBoYXMgdGhlIExCU19OT1RJRlkgc3R5bGUgKi8KK3ZvaWQgTGlzdEJveFNlbmROb3RpZmljYXRpb24oTFBIRUFETElTVCBscGhsLCBIV05EIGh3bmQsIFdPUkQgY29kZSkKK3sKKyAgaWYgKGxwaGwtPmR3U3R5bGUgJiBMQlNfTk9USUZZKQorICAgIFNlbmRNZXNzYWdlKGxwaGwtPmhQYXJlbnQsIFdNX0NPTU1BTkQsCisJCWxwaGwtPkN0bElELCBNQUtFTE9ORyhod25kLCBjb2RlKSk7Cit9CisKKwogLyogZ2V0IHRoZSBtYXhpbXVtIHZhbHVlIG9mIGxwaGwtPkZpcnN0VmlzaWJsZSAqLwogaW50IExpc3RNYXhGaXJzdFZpc2libGUoTFBIRUFETElTVCBscGhsKQogewotICAgIGludCBtID0gbHBobC0+SXRlbXNDb3VudC1scGhsLT5JdGVtc1Zpc2libGUrMTsKLSAgICByZXR1cm4gKG0gPCAxKSA/IDEgOiBtOworICAgIGludCBtID0gbHBobC0+SXRlbXNDb3VudC1scGhsLT5JdGVtc1Zpc2libGU7CisgICAgcmV0dXJuIChtIDwgMCkgPyAwIDogbTsKIH0KIAogCit2b2lkIExpc3RCb3hVcGRhdGVXaW5kb3coSFdORCBod25kLCBMUEhFQURMSVNUIGxwaGwsIEJPT0wgcmVwYWludCkKK3sKKyAgU2V0U2Nyb2xsUmFuZ2UoaHduZCwgU0JfVkVSVCwgMCwgTGlzdE1heEZpcnN0VmlzaWJsZShscGhsKSwgVFJVRSk7CisgIGlmIChscGhsLT5JdGVtc1BlckNvbHVtbiAhPSAwKSB7CisgICAgU2V0U2Nyb2xsUmFuZ2UoaHduZCwgU0JfSE9SWiwgMSwgbHBobC0+SXRlbXNWaXNpYmxlIC8KKwkJICAgbHBobC0+SXRlbXNQZXJDb2x1bW4gKyAxLCBUUlVFKTsKKyAgfQorICBpZiAocmVwYWludCAmJiBscGhsLT5iUmVkcmF3RmxhZykgeworICAgIEludmFsaWRhdGVSZWN0KGh3bmQsIE5VTEwsIFRSVUUpOworICB9Cit9CisKKy8qIFJldHVybnM6IDAgaWYgbm90aGluZyBuZWVkcyB0byBiZSBjaGFuZ2VkICovCisvKiAgICAgICAgICAxIGlmIEZpcnN0VmlzaWJsZSBjaGFuZ2VkICovCisKK2ludCBMaXN0Qm94U2Nyb2xsVG9Gb2N1cyhMUEhFQURMSVNUIGxwaGwpCit7CisgIHNob3J0ICAgICAgIGVuZDsKKworICBpZiAobHBobC0+SXRlbXNDb3VudCA9PSAwKSByZXR1cm4gMDsKKyAgaWYgKGxwaGwtPkl0ZW1Gb2N1c2VkID09IC0xKSByZXR1cm4gMDsKKworICBlbmQgPSBscGhsLT5GaXJzdFZpc2libGUgKyBscGhsLT5JdGVtc1Zpc2libGUgLSAxOworCisgIGlmIChscGhsLT5JdGVtRm9jdXNlZCA8IGxwaGwtPkZpcnN0VmlzaWJsZSApIHsKKyAgICBscGhsLT5GaXJzdFZpc2libGUgPSBscGhsLT5JdGVtRm9jdXNlZDsKKyAgICByZXR1cm4gMTsKKyAgfSBlbHNlIHsKKyAgICBpZiAobHBobC0+SXRlbUZvY3VzZWQgPiBlbmQpIHsKKyAgICAgIFdPUkQgbWF4Rmlyc3RWaXNpYmxlID0gTGlzdE1heEZpcnN0VmlzaWJsZShscGhsKTsKKworICAgICAgbHBobC0+Rmlyc3RWaXNpYmxlID0gbHBobC0+SXRlbUZvY3VzZWQ7CisgICAgICAKKyAgICAgIGlmIChscGhsLT5GaXJzdFZpc2libGUgPiBtYXhGaXJzdFZpc2libGUpIHsKKwlscGhsLT5GaXJzdFZpc2libGUgPSBtYXhGaXJzdFZpc2libGU7CisgICAgICB9CisgICAgICByZXR1cm4gMTsKKyAgICB9CisgIH0gCisgIHJldHVybiAwOworfQorCisKK0xQTElTVFNUUlVDVCBMaXN0Qm94R2V0SXRlbShMUEhFQURMSVNUIGxwaGwsIFVJTlQgdUluZGV4KQoreworICBMUExJU1RTVFJVQ1QgbHBsczsKKyAgVUlOVCAgICAgICAgIENvdW50ID0gMDsKKworICBpZiAodUluZGV4ID49IGxwaGwtPkl0ZW1zQ291bnQpIHJldHVybiBOVUxMOworCisgIGxwbHMgPSBscGhsLT5scEZpcnN0OworICB3aGlsZSAoQ291bnQrKyA8IHVJbmRleCkgbHBscyA9IGxwbHMtPmxwTmV4dDsKKyAgcmV0dXJuIGxwbHM7Cit9CisKKwordm9pZCBMaXN0Qm94RHJhd0l0ZW0gKEhXTkQgaHduZCwgTFBIRUFETElTVCBscGhsLCBIREMgaGRjLCBMUExJU1RTVFJVQ1QgbHBscywgCisJCSAgICAgIFJFQ1QgKnJlY3QsIFdPUkQgaXRlbUFjdGlvbiwgV09SRCBpdGVtU3RhdGUpCit7CisgIGlmIChPV05FUl9EUkFXTihscGhsKSkgeworICAgIERSQVdJVEVNU1RSVUNUICAgKmRpcyA9IFVTRVJfSEVBUF9MSU5fQUREUihscGhsLT5oRHJhd0l0ZW1TdHJ1Y3QpOworCisgICAgZGlzLT5DdGxJRCAgICA9IGxwbHMtPm1pcy5DdGxJRDsKKyAgICBkaXMtPkN0bFR5cGUgID0gbHBscy0+bWlzLkN0bFR5cGU7CisgICAgZGlzLT5pdGVtSUQgICA9IGxwbHMtPm1pcy5pdGVtSUQ7CisgICAgZGlzLT5oREMgICAgICA9IGhkYzsKKyAgICBkaXMtPmh3bmRJdGVtID0gaHduZDsKKyAgICBkaXMtPml0ZW1EYXRhID0gbHBscy0+bWlzLml0ZW1EYXRhOworICAgIGRpcy0+aXRlbUFjdGlvbiA9IGl0ZW1BY3Rpb247CisgICAgZGlzLT5pdGVtU3RhdGUgID0gaXRlbVN0YXRlOworICAgIGRpcy0+cmNJdGVtICAgICA9ICpyZWN0OworICAgIFNlbmRNZXNzYWdlKGxwaGwtPmhQYXJlbnQsIFdNX0RSQVdJVEVNLAorCQkwLCAoTFBBUkFNKVVTRVJfSEVBUF9TRUdfQUREUihscGhsLT5oRHJhd0l0ZW1TdHJ1Y3QpKTsKKyAgfSBlbHNlIHsKKyAgICBpZiAoaXRlbUFjdGlvbiA9PSBPREFfRFJBV0VOVElSRSB8fCBpdGVtQWN0aW9uID09IE9EQV9TRUxFQ1QpIHsKKyAgICAgIGludCAJT2xkQmtNb2RlOworICAgICAgRFdPUkQgCWR3T2xkVGV4dENvbG9yID0gMDsKKworICAgICAgT2xkQmtNb2RlID0gU2V0QmtNb2RlKGhkYywgVFJBTlNQQVJFTlQpOworCisgICAgICBpZiAoaXRlbVN0YXRlICE9IDApIHsKKwlkd09sZFRleHRDb2xvciA9IFNldFRleHRDb2xvcihoZGMsIDB4MDBGRkZGRkZMKTsKKwlGaWxsUmVjdChoZGMsIHJlY3QsIEdldFN0b2NrT2JqZWN0KEJMQUNLX0JSVVNIKSk7CisgICAgICB9CisKKyAgICAgIGlmIChscGhsLT5kd1N0eWxlICYgTEJTX1VTRVRBQlNUT1BTKSB7CisJVGFiYmVkVGV4dE91dChoZGMsIHJlY3QtPmxlZnQgKyA1LCByZWN0LT50b3AgKyAyLCAKKwkJICAgICAgKGNoYXIgKilscGxzLT5pdGVtVGV4dCwgc3RybGVuKChjaGFyICopbHBscy0+aXRlbVRleHQpLCAKKwkJICAgICAgbHBobC0+aU51bVN0b3BzLCBscGhsLT5UYWJTdG9wcywgMCk7CisgICAgICB9IGVsc2UgeworCVRleHRPdXQoaGRjLCByZWN0LT5sZWZ0ICsgNSwgcmVjdC0+dG9wICsgMiwKKwkJKGNoYXIgKilscGxzLT5pdGVtVGV4dCwgc3RybGVuKChjaGFyICopbHBscy0+aXRlbVRleHQpKTsKKyAgICAgIH0KKworICAgICAgaWYgKGl0ZW1TdGF0ZSAhPSAwKSB7CisJU2V0VGV4dENvbG9yKGhkYywgZHdPbGRUZXh0Q29sb3IpOworICAgICAgfQorICAgICAgCisgICAgICBTZXRCa01vZGUoaGRjLCBPbGRCa01vZGUpOworICAgIH0gZWxzZSBEcmF3Rm9jdXNSZWN0KGhkYywgcmVjdCk7CisgIH0KKworICByZXR1cm47Cit9CisKKworaW50IExpc3RCb3hGaW5kTW91c2UoTFBIRUFETElTVCBscGhsLCBpbnQgWCwgaW50IFkpCit7CisgIExQTElTVFNUUlVDVCBscGxzID0gbHBobC0+bHBGaXJzdDsKKyAgaW50ICAgICAgICAgIGksIGo7CisgIFBPSU5UICAgICAgICBwb2ludDsKKyAgCisgIHBvaW50LnggPSBYOyBwb2ludC55ID0gWTsKKyAgaWYgKGxwaGwtPkl0ZW1zQ291bnQgPT0gMCkgcmV0dXJuIExCX0VSUjsKKworICBmb3IoaSA9IDA7IGkgPCBscGhsLT5GaXJzdFZpc2libGU7IGkrKykgeworICAgIGlmIChscGxzID09IE5VTEwpIHJldHVybiBMQl9FUlI7CisgICAgbHBscyA9IGxwbHMtPmxwTmV4dDsKKyAgfQorICBmb3IoaiA9IDA7IGogPCBscGhsLT5JdGVtc1Zpc2libGU7IGkrKywgaisrKSB7CisgICAgaWYgKGxwbHMgPT0gTlVMTCkgcmV0dXJuIExCX0VSUjsKKyAgICBpZiAoUHRJblJlY3QoJmxwbHMtPml0ZW1SZWN0LHBvaW50KSkgeworICAgICAgcmV0dXJuIGk7CisgICAgfQorICAgIGxwbHMgPSBscGxzLT5scE5leHQ7CisgIH0KKyAgZHByaW50Zl9saXN0Ym94KHN0ZGRlYiwiTGlzdEJveEZpbmRNb3VzZTogbm90IGZvdW5kXG4iKTsKKyAgcmV0dXJuIExCX0VSUjsKK30KKworCit2b2lkIExpc3RCb3hBc2tNZWFzdXJlKExQSEVBRExJU1QgbHBobCwgTFBMSVNUU1RSVUNUIGxwbHMpICAKK3sKKyAgSEFORExFIGhUZW1wID0gVVNFUl9IRUFQX0FMTE9DKCBzaXplb2YoTUVBU1VSRUlURU1TVFJVQ1QpICk7CisgIE1FQVNVUkVJVEVNU1RSVUNUICpscG1lYXN1cmUgPSAoTUVBU1VSRUlURU1TVFJVQ1QgKikgVVNFUl9IRUFQX0xJTl9BRERSKGhUZW1wKTsKKworICBpZiAobHBtZWFzdXJlID09IE5VTEwpIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwiTGlzdEJveEFza01lYXN1cmUoKSBvdXQgb2YgbWVtb3J5ICFcbiIpOworICAgIHJldHVybjsKKyAgfQorIAorICAqbHBtZWFzdXJlID0gbHBscy0+bWlzOworICBscG1lYXN1cmUtPml0ZW1IZWlnaHQgPSBscGhsLT5TdGRJdGVtSGVpZ2h0OworICBTZW5kTWVzc2FnZShscGhsLT5oUGFyZW50LCBXTV9NRUFTVVJFSVRFTSwKKwkgICAgICAwLCBVU0VSX0hFQVBfU0VHX0FERFIoaFRlbXApKTsKKworICBpZiAobHBobC0+ZHdTdHlsZSAmIExCU19PV05FUkRSQVdGSVhFRCkgeworICAgIGxwaGwtPlN0ZEl0ZW1IZWlnaHQgPSBscG1lYXN1cmUtPml0ZW1IZWlnaHQ7CisgICAgbHBobC0+bmVlZE1lYXN1cmUgPSBGQUxTRTsKKyAgfQorCisgIFVTRVJfSEVBUF9GUkVFKGhUZW1wKTsJCQkKK30KKworCitMUExJU1RTVFJVQ1QgTGlzdEJveENyZWF0ZUl0ZW0oTFBIRUFETElTVCBscGhsLCBpbnQgaWQpCit7CisgIExQTElTVFNUUlVDVCBscGxzbmV3ID0gKExQTElTVFNUUlVDVCltYWxsb2Moc2l6ZW9mKExJU1RTVFJVQ1QpKTsKKworICBpZiAobHBsc25ldyA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKyAgCisgIGxwbHNuZXctPml0ZW1TdGF0ZSAgICAgID0gMDsKKyAgbHBsc25ldy0+bWlzLkN0bFR5cGUgICAgPSBscGhsLT5EcmF3Q3RsVHlwZTsKKyAgbHBsc25ldy0+bWlzLkN0bElEICAgICAgPSBscGhsLT5DdGxJRDsKKyAgbHBsc25ldy0+bWlzLml0ZW1JRCAgICAgPSBpZDsKKyAgbHBsc25ldy0+bWlzLml0ZW1IZWlnaHQgPSBscGhsLT5TdGRJdGVtSGVpZ2h0OworICBscGxzbmV3LT5taXMuaXRlbVdpZHRoICA9IDA7IC8qIGlnbm9yZWQgKi8KKyAgbHBsc25ldy0+bWlzLml0ZW1EYXRhICAgPSAwOworICBTZXRSZWN0KCZscGxzbmV3LT5pdGVtUmVjdCwgMCwgMCwgMCwgMCk7CisKKyAgcmV0dXJuIGxwbHNuZXc7Cit9CisKKworaW50IExpc3RCb3hJbnNlcnRTdHJpbmcoTFBIRUFETElTVCBscGhsLCBVSU5UIHVJbmRleCwgTFBTVFIgbmV3c3RyKQoreworICBMUExJU1RTVFJVQ1QgKmxwcGxzLCBscGxzbmV3OworICBIQU5ETEUgICAgICAgaFN0cjsKKyAgTFBTVFIJc3RyOworICBVSU5UCUNvdW50OworICAgIAorICBkcHJpbnRmX2xpc3Rib3goc3RkZGViLCJMaXN0Qm94SW5zZXJ0U3RyaW5nKCVkLCAlcCk7XG4iLCB1SW5kZXgsIG5ld3N0cik7CisgICAgCisgIGlmICh1SW5kZXggPT0gKFVJTlQpLTEpCisgICAgdUluZGV4ID0gbHBobC0+SXRlbXNDb3VudDsKKworICBscHBscyA9ICZscGhsLT5scEZpcnN0OworICBmb3IoQ291bnQgPSAwOyBDb3VudCA8IHVJbmRleDsgQ291bnQrKykgeworICAgIGlmICgqbHBwbHMgPT0gTlVMTCkgcmV0dXJuIExCX0VSUjsKKyAgICBscHBscyA9IChMUExJU1RTVFJVQ1QgKikgJigqbHBwbHMpLT5scE5leHQ7CisgIH0KKyAgICAKKyAgbHBsc25ldyA9IExpc3RCb3hDcmVhdGVJdGVtKGxwaGwsIENvdW50KTsKKyAgCisgIGlmIChscGxzbmV3ID09IE5VTEwpIHsKKyAgICBwcmludGYoIkxpc3RCb3hJbnNlcnRTdHJpbmcoKSBvdXQgb2YgbWVtb3J5ICFcbiIpOworICAgIHJldHVybiBMQl9FUlJTUEFDRTsKKyAgfQorCisgIGxwbHNuZXctPmxwTmV4dCA9ICpscHBsczsKKyAgKmxwcGxzID0gbHBsc25ldzsKKyAgbHBobC0+SXRlbXNDb3VudCsrOworICAKKyAgaFN0ciA9IDA7CisgIGlmIChIYXNTdHJpbmdzKGxwaGwpKSB7CisgICAgaFN0ciA9IExJU1RfSEVBUF9BTExPQyhscGhsLCBHTUVNX01PVkVBQkxFLCBzdHJsZW4obmV3c3RyKSArIDEpOworICAgIHN0ciA9IChMUFNUUilMSVNUX0hFQVBfQUREUihscGhsLCBoU3RyKTsKKyAgICBpZiAoc3RyID09IE5VTEwpIHJldHVybiBMQl9FUlJTUEFDRTsKKyAgICBzdHJjcHkoc3RyLCBuZXdzdHIpOworICAgIGxwbHNuZXctPml0ZW1UZXh0ID0gc3RyOworICAgIC8qIEknbSBub3Qgc28gc3VyZSBhYm91dCB0aGUgbmV4dCBvbmUgKi8KKyAgICBscGxzbmV3LT5taXMuaXRlbURhdGEgPSBMSVNUX0hFQVBfU0VHX0FERFIobHBobCxoU3RyKTsgCisgIH0gZWxzZSB7CisgICAgbHBsc25ldy0+aXRlbVRleHQgPSBOVUxMOworICAgIGxwbHNuZXctPm1pcy5pdGVtRGF0YSA9IChEV09SRCluZXdzdHI7CisgIH0KKworICBscGxzbmV3LT5taXMuaXRlbUlEID0gbHBobC0+SXRlbXNDb3VudDsKKyAgbHBsc25ldy0+aERhdGEgPSBoU3RyOworIAorICBpZiAobHBobC0+bmVlZE1lYXN1cmUpIHsKKyAgICBMaXN0Qm94QXNrTWVhc3VyZShscGhsLCBscGxzbmV3KTsKKyAgfQorCisgIGRwcmludGZfbGlzdGJveChzdGRkZWIsIkxpc3RCb3hJbnNlcnRTdHJpbmcgLy8gY291bnQ9JWRcbiIsIGxwaGwtPkl0ZW1zQ291bnQpOworICByZXR1cm4gdUluZGV4OworfQorCisKK2ludCBMaXN0Qm94QWRkU3RyaW5nKExQSEVBRExJU1QgbHBobCwgTFBTVFIgbmV3c3RyKQoreworICAgIFVJTlQgcG9zID0gKFVJTlQpIC0xOworICAgIAorICAgIGlmIChIYXNTdHJpbmdzKGxwaGwpICYmIChscGhsLT5kd1N0eWxlICYgTEJTX1NPUlQpKSB7CisJTFBMSVNUU1RSVUNUIGxwbHMgPSBscGhsLT5scEZpcnN0OworCWZvciAocG9zID0gMDsgbHBscyAhPSBOVUxMOyBscGxzID0gbHBscy0+bHBOZXh0LCBwb3MrKykKKwkgICAgaWYgKHN0cmNtcChscGxzLT5pdGVtVGV4dCwgbmV3c3RyKSA+PSAwKQorCQlicmVhazsKKyAgICB9CisgICAgcmV0dXJuIExpc3RCb3hJbnNlcnRTdHJpbmcobHBobCwgcG9zLCBuZXdzdHIpOworfQorCisKK2ludCBMaXN0Qm94R2V0VGV4dChMUEhFQURMSVNUIGxwaGwsIFVJTlQgdUluZGV4LCBMUFNUUiBPdXRTdHIpCit7CisgIExQTElTVFNUUlVDVCBscGxzOworCisgIGlmICghT3V0U3RyKSB7CisgICAgZHByaW50Zl9saXN0Ym94KHN0ZGRlYiwgIkxpc3RCb3hHZXRUZXh0IC8vIE91dFN0cj09TlVMTFxuIik7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBscGxzID0gTGlzdEJveEdldEl0ZW0gKGxwaGwsIHVJbmRleCk7CisgIGlmIChscGxzID09IE5VTEwpIHJldHVybiBMQl9FUlI7CisKKyAgaWYgKCFIYXNTdHJpbmdzKGxwaGwpKSB7CisgICAgKigobG9uZyAqKU91dFN0cikgPSBscGxzLT5taXMuaXRlbURhdGE7CisgICAgcmV0dXJuIDQ7CisgIH0KKwkKKyAgc3RyY3B5KE91dFN0ciwgbHBscy0+aXRlbVRleHQpOworICByZXR1cm4gc3RybGVuKE91dFN0cik7Cit9CisKKworRFdPUkQgTGlzdEJveEdldEl0ZW1EYXRhKExQSEVBRExJU1QgbHBobCwgVUlOVCB1SW5kZXgpCit7CisgIExQTElTVFNUUlVDVCBscGxzOworCisgIGxwbHMgPSBMaXN0Qm94R2V0SXRlbSAobHBobCwgdUluZGV4KTsKKyAgaWYgKGxwbHMgPT0gTlVMTCkgcmV0dXJuIExCX0VSUjsKKyAgcmV0dXJuIGxwbHMtPm1pcy5pdGVtRGF0YTsKK30KKworCitpbnQgTGlzdEJveFNldEl0ZW1EYXRhKExQSEVBRExJU1QgbHBobCwgVUlOVCB1SW5kZXgsIERXT1JEIEl0ZW1EYXRhKQoreworICBMUExJU1RTVFJVQ1QgbHBscyA9IExpc3RCb3hHZXRJdGVtKGxwaGwsIHVJbmRleCk7CisKKyAgaWYgKGxwbHMgPT0gTlVMTCkgcmV0dXJuIExCX0VSUjsKKyAgbHBscy0+bWlzLml0ZW1EYXRhID0gSXRlbURhdGE7CisgIHJldHVybiAxOworfQorCisKK2ludCBMaXN0Qm94RGVsZXRlU3RyaW5nKExQSEVBRExJU1QgbHBobCwgVUlOVCB1SW5kZXgpCit7CisgIExQTElTVFNUUlVDVCBscGxzOworICBVSU5UCUNvdW50OworCisgIGlmICh1SW5kZXggPj0gbHBobC0+SXRlbXNDb3VudCkgcmV0dXJuIExCX0VSUjsKKworICBscGxzID0gbHBobC0+bHBGaXJzdDsKKyAgaWYgKGxwbHMgPT0gTlVMTCkgcmV0dXJuIExCX0VSUjsKKworICBpZiAodUluZGV4ID09IDApCisgICAgbHBobC0+bHBGaXJzdCA9IGxwbHMtPmxwTmV4dDsKKyAgZWxzZSB7CisgICAgTFBMSVNUU1RSVUNUIGxwbHMyID0gTlVMTDsKKyAgICBmb3IoQ291bnQgPSAwOyBDb3VudCA8IHVJbmRleDsgQ291bnQrKykgeworICAgICAgaWYgKGxwbHMtPmxwTmV4dCA9PSBOVUxMKSByZXR1cm4gTEJfRVJSOworCisgICAgICBscGxzMiA9IGxwbHM7CisgICAgICBscGxzID0gKExQTElTVFNUUlVDVClscGxzLT5scE5leHQ7CisgICAgfQorICAgIGxwbHMyLT5scE5leHQgPSAoTFBMSVNUU1RSVUNUKWxwbHMtPmxwTmV4dDsKKyAgfQorCisgIGxwaGwtPkl0ZW1zQ291bnQtLTsKKworICBpZiAobHBscy0+aERhdGEgIT0gMCkgTElTVF9IRUFQX0ZSRUUobHBobCwgbHBscy0+aERhdGEpOworICBmcmVlKGxwbHMpOworICAKKyAgcmV0dXJuIGxwaGwtPkl0ZW1zQ291bnQ7Cit9CisKKworaW50IExpc3RCb3hGaW5kU3RyaW5nKExQSEVBRExJU1QgbHBobCwgVUlOVCBuRmlyc3QsIFNFR1BUUiBNYXRjaFN0cikKK3sKKyAgTFBMSVNUU1RSVUNUIGxwbHM7CisgIFVJTlQJICAgICAgIENvdW50OworICBVSU5UICAgICAgICAgRmlyc3QgPSBuRmlyc3QgKyAxOworICBMUFNUUiAgICAgICAgbHBNYXRjaFN0ciA9IChMUFNUUilNYXRjaFN0cjsKKworICBpZiAoRmlyc3QgPiBscGhsLT5JdGVtc0NvdW50KSByZXR1cm4gTEJfRVJSOworCisgIGlmIChIYXNTdHJpbmdzKGxwaGwpKSBscE1hdGNoU3RyID0gUFRSX1NFR19UT19MSU4oTWF0Y2hTdHIpOworICAKKyAgbHBscyA9IExpc3RCb3hHZXRJdGVtKGxwaGwsIEZpcnN0KTsKKyAgQ291bnQgPSAwOworICB3aGlsZShscGxzICE9IE5VTEwpIHsKKyAgICBpZiAoSGFzU3RyaW5ncyhscGhsKSkgeworICAgICAgaWYgKHN0cnN0cihscGxzLT5pdGVtVGV4dCwgbHBNYXRjaFN0cikgPT0gbHBscy0+aXRlbVRleHQpIHJldHVybiBDb3VudDsKKyAgICB9IGVsc2UgaWYgKGxwaGwtPmR3U3R5bGUgJiBMQlNfU09SVCkgeworICAgICAgLyogWFhYIERvIGEgY29tcGFyZSBpdGVtICovCisgICAgfQorICAgIGVsc2UKKyAgICAgIGlmIChscGxzLT5taXMuaXRlbURhdGEgPT0gKERXT1JEKWxwTWF0Y2hTdHIpIHJldHVybiBDb3VudDsKKworICAgIGxwbHMgPSBscGxzLT5scE5leHQ7CisgICAgQ291bnQrKzsKKyAgfQorCisgIC8qIFN0YXJ0IG92ZXIgYXQgdG9wICovCisgIENvdW50ID0gMDsKKyAgbHBscyA9IGxwaGwtPmxwRmlyc3Q7CisKKyAgd2hpbGUgKENvdW50IDwgRmlyc3QpIHsKKyAgICBpZiAoSGFzU3RyaW5ncyhscGhsKSkgeworICAgICAgaWYgKHN0cnN0cihscGxzLT5pdGVtVGV4dCwgbHBNYXRjaFN0cikgPT0gbHBscy0+aXRlbVRleHQpIHJldHVybiBDb3VudDsKKyAgICB9IGVsc2UgaWYgKGxwaGwtPmR3U3R5bGUgJiBMQlNfU09SVCkgeworICAgICAgLyogWFhYIERvIGEgY29tcGFyZSBpdGVtICovCisgICAgfSBlbHNlIHsKKyAgICAgIGlmIChscGxzLT5taXMuaXRlbURhdGEgPT0gKERXT1JEKWxwTWF0Y2hTdHIpIHJldHVybiBDb3VudDsKKyAgICB9CisgICAgbHBscyA9IGxwbHMtPmxwTmV4dDsKKyAgICBDb3VudCsrOworICB9CisKKyAgcmV0dXJuIExCX0VSUjsKK30KKworCitpbnQgTGlzdEJveFJlc2V0Q29udGVudChMUEhFQURMSVNUIGxwaGwpCit7CisgICAgTFBMSVNUU1RSVUNUIGxwbHM7CisgICAgaW50IGk7CisKKyAgICBpZiAobHBobC0+SXRlbXNDb3VudCA9PSAwKSByZXR1cm4gMDsKKworICAgIGRwcmludGZfbGlzdGJveChzdGRkZWIsICJMaXN0Qm94UmVzZXRDb250ZW50IC8vIEl0ZW1Db3VudCA9ICVkXG4iLAorCWxwaGwtPkl0ZW1zQ291bnQpOworCisgICAgZm9yKGkgPSAwOyBpIDwgbHBobC0+SXRlbXNDb3VudDsgaSsrKSB7CisgICAgICBscGxzID0gbHBobC0+bHBGaXJzdDsKKyAgICAgIGlmIChscGxzID09IE5VTEwpIHJldHVybiBMQl9FUlI7CisgICAgICAKKyAgICAgIGxwaGwtPmxwRmlyc3QgPSBscGxzLT5scE5leHQ7CisgICAgICBpZiAobHBscy0+aERhdGEgIT0gMCkgTElTVF9IRUFQX0ZSRUUobHBobCwgbHBscy0+aERhdGEpOworICAgICAgZnJlZShscGxzKTsKKyAgICB9CisgICAgTGlzdEJveEluaXRpYWxpemUobHBobCk7CisKKyAgICByZXR1cm4gVFJVRTsKK30KKworCitpbnQgTGlzdEJveFNldEN1clNlbChMUEhFQURMSVNUIGxwaGwsIFdPUkQgd0luZGV4KQoreworICBMUExJU1RTVFJVQ1QgbHBsczsKKworICBpZiAobHBobC0+ZHdTdHlsZSAmIExCU19NVUxUSVBMRVNFTCkgcmV0dXJuIDA7CisKKyAgaWYgKGxwaGwtPkl0ZW1Gb2N1c2VkICE9IC0xKSB7CisgICAgbHBscyA9IExpc3RCb3hHZXRJdGVtKGxwaGwsIGxwaGwtPkl0ZW1Gb2N1c2VkKTsKKyAgICBpZiAobHBscyA9PSAwKSByZXR1cm4gTEJfRVJSOworICAgIGxwbHMtPml0ZW1TdGF0ZSA9IDA7CisgIH0KKworICBpZiAod0luZGV4ICE9IChVSU5UKS0xKSB7CisgICAgbHBobC0+SXRlbUZvY3VzZWQgPSB3SW5kZXg7CisgICAgbHBscyA9IExpc3RCb3hHZXRJdGVtKGxwaGwsIHdJbmRleCk7CisgICAgaWYgKGxwbHMgPT0gMCkgcmV0dXJuIExCX0VSUjsKKyAgICBscGxzLT5pdGVtU3RhdGUgPSBPRFNfU0VMRUNURUQgfCBPRFNfRk9DVVM7CisKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIHJldHVybiBMQl9FUlI7Cit9CisKKworaW50IExpc3RCb3hTZXRTZWwoTFBIRUFETElTVCBscGhsLCBXT1JEIHdJbmRleCwgV09SRCBzdGF0ZSkKK3sKKyAgTFBMSVNUU1RSVUNUIGxwbHM7CisKKyAgaWYgKCEobHBobC0+ZHdTdHlsZSAmIExCU19NVUxUSVBMRVNFTCkpIHJldHVybiAwOworCisgIGlmICh3SW5kZXggPT0gKFVJTlQpLTEpIHsKKyAgICBmb3IgKGxwbHMgPSBscGhsLT5scEZpcnN0OyBscGxzICE9IE5VTEw7IGxwbHMgPSBscGxzLT5scE5leHQpIHsKKyAgICAgIGxwbHMtPml0ZW1TdGF0ZSA9IHN0YXRlOworICAgIH0KKyAgICByZXR1cm4gMDsKKyAgfQorCisgIGlmICh3SW5kZXggPj0gbHBobC0+SXRlbXNDb3VudCkgcmV0dXJuIExCX0VSUjsKKworICBscGxzID0gTGlzdEJveEdldEl0ZW0obHBobCwgd0luZGV4KTsKKyAgbHBscy0+aXRlbVN0YXRlID0gc3RhdGU7CisKKyAgcmV0dXJuIDA7Cit9CisKKworaW50IExpc3RCb3hHZXRTZWwoTFBIRUFETElTVCBscGhsLCBXT1JEIHdJbmRleCkKK3sKKyAgTFBMSVNUU1RSVUNUIGxwbHMgPSBMaXN0Qm94R2V0SXRlbShscGhsLCB3SW5kZXgpOworCisgIGlmIChscGxzID09IE5VTEwpIHJldHVybiBMQl9FUlI7CisgIHJldHVybiBscGxzLT5pdGVtU3RhdGU7Cit9CisKKworaW50IExpc3RCb3hEaXJlY3RvcnkoTFBIRUFETElTVCBscGhsLCBVSU5UIGF0dHJpYiwgTFBTVFIgZmlsZXNwZWMpCit7CisgIHN0cnVjdCBkb3NkaXJlbnQgKmRwLCAqZHBfb2xkOworICBjaGFyIHRlbXBbMjU2XTsKKyAgaW50ICAgZHJpdmU7CisgIExQU1RSIHRzdHI7CisKKyAgZHByaW50Zl9saXN0Ym94KHN0ZGRlYiwiTGlzdEJveERpcmVjdG9yeTogJXMsICU0eFxuIixmaWxlc3BlYyxhdHRyaWIpOworCisgIGlmIChzdHJjaHIoZmlsZXNwZWMsICdcXCcpIHx8IHN0cmNocihmaWxlc3BlYywgJzonKSkgeworICAgIGRyaXZlID0gRE9TX0dldERlZmF1bHREcml2ZSgpOworICAgIGlmIChmaWxlc3BlY1sxXSA9PSAnOicpIHsKKyAgICAgIGRyaXZlID0gdG91cHBlcihmaWxlc3BlY1swXSkgLSAnQSc7CisgICAgICBmaWxlc3BlYyArPSAyOworICAgIH0KKyAgICBzdHJjcHkodGVtcCxmaWxlc3BlYyk7CisgICAgdHN0ciA9IHN0cnJjaHIodGVtcCwgJ1xcJyk7CisgICAgaWYgKHRzdHIgPT0gTlVMTCkKKyAgICAgIERPU19TZXREZWZhdWx0RHJpdmUoIGRyaXZlICk7CisgICAgZWxzZSB7CisgICAgICAqdHN0ciA9IDA7CisgICAgICBmaWxlc3BlYyA9IHRzdHIgKyAxOworICAgICAgaWYgKCFET1NfQ2hhbmdlRGlyKCBkcml2ZSwgdGVtcCApKSByZXR1cm4gMDsKKyAgICAgIERPU19TZXREZWZhdWx0RHJpdmUoIGRyaXZlICk7CisgICAgfQorICAgIGRwcmludGZfbGlzdGJveChzdGRkZWIsIkNoYW5naW5nIGRpcmVjdG9yeSB0byAlYzolcywgZmlsZW1hc2sgaXMgJXNcbiIsCisJCSAgICBkcml2ZSsnQScsIHRlbXAsIGZpbGVzcGVjKTsKKyAgfQorCisgIGlmICgoZHAgPSAoc3RydWN0IGRvc2RpcmVudCAqKURPU19vcGVuZGlyKGZpbGVzcGVjKSkgPT1OVUxMKSByZXR1cm4gMDsKKyAgZHBfb2xkID0gZHA7CisgIHdoaWxlICgoZHAgPSAoc3RydWN0IGRvc2RpcmVudCAqKURPU19yZWFkZGlyKGRwKSkpIHsKKyAgICBpZiAoIWRwLT5pbnVzZSkgYnJlYWs7CisgICAgZHByaW50Zl9saXN0Ym94KHN0ZGRlYiwgIkxpc3RCb3hEaXJlY3RvcnkgJXAgJyVzJyAhXG4iLCBkcC0+ZmlsZW5hbWUsIAorCQkgICAgZHAtPmZpbGVuYW1lKTsKKyAgICBpZiAoZHAtPmF0dHJpYnV0ZSAmIEZBX0RJUkVDKSB7CisgICAgICBpZiAoYXR0cmliICYgRERMX0RJUkVDVE9SWSAmJiBzdHJjbXAoZHAtPmZpbGVuYW1lLCAiLiIpICE9IDApIHsKKwlzcHJpbnRmKHRlbXAsICJbJXNdIiwgZHAtPmZpbGVuYW1lKTsKKwlpZiAoTGlzdEJveEFkZFN0cmluZyhscGhsLCB0ZW1wKSA9PSBMQl9FUlIpIGJyZWFrOworICAgICAgfQorICAgIH0gCisgICAgZWxzZSB7CisgICAgICBpZiAoYXR0cmliICYgRERMX0VYQ0xVU0lWRSkgeworCWlmIChhdHRyaWIgJiAoRERMX1JFQURXUklURSB8IERETF9SRUFET05MWSB8IERETF9ISURERU4gfCBERExfU1lTVEVNKSkgeworCSAgaWYgKExpc3RCb3hBZGRTdHJpbmcobHBobCwgZHAtPmZpbGVuYW1lKSA9PSBMQl9FUlIpIGJyZWFrOworCX0KKyAgICAgIH0gZWxzZSB7CisJaWYgKExpc3RCb3hBZGRTdHJpbmcobHBobCwgZHAtPmZpbGVuYW1lKSA9PSBMQl9FUlIpIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgfQorICBET1NfY2xvc2VkaXIoZHBfb2xkKTsKKyAgCisgIGlmIChhdHRyaWIgJiBERExfRFJJVkVTKSB7CisgICAgaW50IHg7CisgICAgZm9yICh4ID0gMDsgeCAhPSBNQVhfRE9TX0RSSVZFUyA7IHgrKykgeworICAgICAgaWYgKERPU19WYWxpZERyaXZlKHgpKSB7CisJc3ByaW50Zih0ZW1wLCAiWy0lYy1dIiwgJ2EnK3gpOworCWlmIChMaXN0Qm94SW5zZXJ0U3RyaW5nKGxwaGwsIChVSU5UKS0xLCB0ZW1wKSA9PSBMQl9FUlIpIGJyZWFrOworICAgICAgfQkJCisgICAgfQorICB9CisgIHJldHVybiAxOworfQorCisKK2ludCBMaXN0Qm94R2V0SXRlbVJlY3QoTFBIRUFETElTVCBscGhsLCBXT1JEIHdJbmRleCwgTFBSRUNUIGxwcmVjdCkKK3sKKyAgTFBMSVNUU1RSVUNUIGxwbHMgPSBMaXN0Qm94R2V0SXRlbShscGhsLHdJbmRleCk7CisKKyAgaWYgKGxwbHMgPT0gTlVMTCkgcmV0dXJuIExCX0VSUjsKKyAgKmxwcmVjdCA9IGxwbHMtPml0ZW1SZWN0OworICByZXR1cm4gMDsKK30KKworCitpbnQgTGlzdEJveFNldEl0ZW1IZWlnaHQoTFBIRUFETElTVCBscGhsLCBXT1JEIHdJbmRleCwgbG9uZyBoZWlnaHQpCit7CisgIExQTElTVFNUUlVDVCBscGxzOworCisgIGlmICghKGxwaGwtPmR3U3R5bGUgJiBMQlNfT1dORVJEUkFXVkFSSUFCTEUpKSB7CisgICAgbHBobC0+U3RkSXRlbUhlaWdodCA9IChzaG9ydCloZWlnaHQ7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgCisgIGxwbHMgPSBMaXN0Qm94R2V0SXRlbShscGhsLCB3SW5kZXgpOworICBpZiAobHBscyA9PSBOVUxMKSByZXR1cm4gTEJfRVJSOworICAKKyAgbHBscy0+bWlzLml0ZW1IZWlnaHQgPSBoZWlnaHQ7CisgIHJldHVybiAwOworfQorCisKK2ludCBMaXN0Qm94RmluZE5leHRNYXRjaChMUEhFQURMSVNUIGxwaGwsIFdPUkQgd0NoYXIpCit7CisgIExQTElTVFNUUlVDVCBscGxzOworICBVSU5UCSAgICAgICBjb3VudCxmaXJzdDsKKworICBpZiAoKGNoYXIpd0NoYXIgPCAnICcpIHJldHVybiBMQl9FUlI7CisgIGlmICghSGFzU3RyaW5ncyhscGhsKSkgcmV0dXJuIExCX0VSUjsKKworICBscGxzID0gbHBobC0+bHBGaXJzdDsKKyAgCisgIGZvciAoY291bnQgPSAwOyBscGxzICE9IE5VTEw7IGxwbHMgPSBscGxzLT5scE5leHQsIGNvdW50KyspIHsKKyAgICBpZiAodG9sb3dlcigqbHBscy0+aXRlbVRleHQpID09IHRvbG93ZXIoKGNoYXIpd0NoYXIpKSBicmVhazsKKyAgfQorICBpZiAobHBscyA9PSBOVUxMKSByZXR1cm4gTEJfRVJSOworICBmaXJzdCA9IGNvdW50OworICBmb3IoOyBscGxzICE9IE5VTEw7IGxwbHMgPSBscGxzLT5scE5leHQsIGNvdW50KyspIHsKKyAgICBpZiAoKmxwbHMtPml0ZW1UZXh0ICE9IChjaGFyKXdDaGFyKSAKKyAgICAgIGJyZWFrOworICAgIGlmIChjb3VudCA+IGxwaGwtPkl0ZW1Gb2N1c2VkKQorICAgICAgcmV0dXJuIGNvdW50OworICB9CisgIHJldHVybiBmaXJzdDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgTEJDcmVhdGUKKyAqLworc3RhdGljIExPTkcgTEJDcmVhdGUoSFdORCBod25kLCBXT1JEIG1lc3NhZ2UsIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSkKK3sKKyAgTFBIRUFETElTVCAgIGxwaGw7CisgIFJFQ1QgcmVjdDsKKworICBDcmVhdGVMaXN0Qm94U3RydWN0KGh3bmQsIE9EVF9MSVNUQk9YLCBHZXRXaW5kb3dMb25nKGh3bmQsR1dMX1NUWUxFKSwgR2V0UGFyZW50KGh3bmQpKTsKKyAgbHBobCA9IExpc3RCb3hHZXRTdG9yYWdlSGVhZGVyKGh3bmQpOworICBkcHJpbnRmX2xpc3Rib3goc3RkZGViLCJMaXN0Qm94IFdNX0NSRUFURSAlcCAhXG4iLCBscGhsKTsKKworICBHZXRDbGllbnRSZWN0KGh3bmQsJnJlY3QpOworICBscGhsLT5Db2x1bW5zV2lkdGggPSByZWN0LnJpZ2h0IC0gcmVjdC5sZWZ0OworCisgIFNldFNjcm9sbFJhbmdlKGh3bmQsIFNCX1ZFUlQsIDAsIExpc3RNYXhGaXJzdFZpc2libGUobHBobCksIFRSVUUpOworICBTZXRTY3JvbGxSYW5nZShod25kLCBTQl9IT1JaLCAxLCAxLCBUUlVFKTsKKworICByZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgTEJEZXN0cm95CisgKi8KK3N0YXRpYyBMT05HIExCRGVzdHJveShIV05EIGh3bmQsIFdPUkQgbWVzc2FnZSwgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtKQoreworICBMUEhFQURMSVNUIGxwaGwgPSBMaXN0Qm94R2V0U3RvcmFnZUhlYWRlcihod25kKTsKKworICBMaXN0Qm94UmVzZXRDb250ZW50KGxwaGwpOworCisgIERlc3Ryb3lMaXN0Qm94U3RydWN0KGxwaGwpOworICBkcHJpbnRmX2xpc3Rib3goc3RkZGViLCJMaXN0Qm94IFdNX0RFU1RST1kgJXAgIVxuIiwgbHBobCk7CisgIHJldHVybiAwOworfQorCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBMQlZTY3JvbGwKICAqLwotTE9ORyBMQlZTY3JvbGwoIEhXTkQgaHduZCwgV09SRCBtZXNzYWdlLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0gKQotCitzdGF0aWMgTE9ORyBMQlZTY3JvbGwoSFdORCBod25kLCBXT1JEIG1lc3NhZ2UsIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSkKIHsKLSAgTFBIRUFETElTVCBscGhsOworICBMUEhFQURMSVNUIGxwaGwgPSBMaXN0Qm94R2V0U3RvcmFnZUhlYWRlcihod25kKTsKICAgaW50ICB5OwogCiAgIGRwcmludGZfbGlzdGJveChzdGRkZWIsIkxpc3RCb3ggV01fVlNDUk9MTCB3PSUwNFggbD0lMDhsWCAhXG4iLAogCQkgIHdQYXJhbSwgbFBhcmFtKTsKLSAgbHBobCA9IExpc3RCb3hHZXRTdG9yYWdlSGVhZGVyKGh3bmQpOwotICBpZiAobHBobCA9PSBOVUxMKSByZXR1cm4gMDsKICAgeSA9IGxwaGwtPkZpcnN0VmlzaWJsZTsKIAogICBzd2l0Y2god1BhcmFtKSB7CiAgIGNhc2UgU0JfTElORVVQOgotICAgIGlmIChscGhsLT5GaXJzdFZpc2libGUgPiAxKQkKKyAgICBpZiAobHBobC0+Rmlyc3RWaXNpYmxlID4gMCkKICAgICAgIGxwaGwtPkZpcnN0VmlzaWJsZS0tOwogICAgIGJyZWFrOwogCiAgIGNhc2UgU0JfTElORURPV046Ci0gICAgaWYgKGxwaGwtPkZpcnN0VmlzaWJsZSA8IExpc3RNYXhGaXJzdFZpc2libGUobHBobCkpCi0gICAgICBscGhsLT5GaXJzdFZpc2libGUrKzsKKyAgICBscGhsLT5GaXJzdFZpc2libGUrKzsKICAgICBicmVhazsKIAogICBjYXNlIFNCX1BBR0VVUDoKLSAgICBpZiAobHBobC0+Rmlyc3RWaXNpYmxlID4gMSkgIAorICAgIGlmIChscGhsLT5GaXJzdFZpc2libGUgPiBscGhsLT5JdGVtc1Zpc2libGUpIHsKICAgICAgIGxwaGwtPkZpcnN0VmlzaWJsZSAtPSBscGhsLT5JdGVtc1Zpc2libGU7CisgICAgfSBlbHNlIHsKKyAgICAgIGxwaGwtPkZpcnN0VmlzaWJsZSA9IDA7CisgICAgfQogICAgIGJyZWFrOwogCiAgIGNhc2UgU0JfUEFHRURPV046Ci0gICAgaWYgKGxwaGwtPkZpcnN0VmlzaWJsZSA8IExpc3RNYXhGaXJzdFZpc2libGUobHBobCkpICAKLSAgICAgIGxwaGwtPkZpcnN0VmlzaWJsZSArPSBscGhsLT5JdGVtc1Zpc2libGU7CisgICAgbHBobC0+Rmlyc3RWaXNpYmxlICs9IGxwaGwtPkl0ZW1zVmlzaWJsZTsKICAgICBicmVhazsKIAogICBjYXNlIFNCX1RIVU1CVFJBQ0s6CkBAIC0zMjIsMTQgKzg3NywxMiBAQAogICAgIGJyZWFrOwogICB9CiAKLSAgaWYgKGxwaGwtPkZpcnN0VmlzaWJsZSA8IDEpICAgIGxwaGwtPkZpcnN0VmlzaWJsZSA9IDE7CiAgIGlmIChscGhsLT5GaXJzdFZpc2libGUgPiBMaXN0TWF4Rmlyc3RWaXNpYmxlKGxwaGwpKQogICAgIGxwaGwtPkZpcnN0VmlzaWJsZSA9IExpc3RNYXhGaXJzdFZpc2libGUobHBobCk7CiAKICAgaWYgKHkgIT0gbHBobC0+Rmlyc3RWaXNpYmxlKSB7CiAgICAgU2V0U2Nyb2xsUG9zKGh3bmQsIFNCX1ZFUlQsIGxwaGwtPkZpcnN0VmlzaWJsZSwgVFJVRSk7CiAgICAgSW52YWxpZGF0ZVJlY3QoaHduZCwgTlVMTCwgVFJVRSk7Ci0gICAgVXBkYXRlV2luZG93KGh3bmQpOwogICB9CiAgIHJldHVybiAwOwogfQpAQCAtMzM3LDggKzg5MCw3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBMQkhTY3JvbGwKICAqLwotTE9ORyBMQkhTY3JvbGwoIEhXTkQgaHduZCwgV09SRCBtZXNzYWdlLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0gKQotCitzdGF0aWMgTE9ORyBMQkhTY3JvbGwoSFdORCBod25kLCBXT1JEIG1lc3NhZ2UsIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSkKIHsKICAgTFBIRUFETElTVCBscGhsOwogICBpbnQgICAgICAgIHk7CkBAIC0zNDYsMzQgKzg5OCwzNyBAQAogICBkcHJpbnRmX2xpc3Rib3goc3RkZGViLCJMaXN0Qm94IFdNX0hTQ1JPTEwgdz0lMDRYIGw9JTA4bFggIVxuIiwKIAkJICB3UGFyYW0sIGxQYXJhbSk7CiAgIGxwaGwgPSBMaXN0Qm94R2V0U3RvcmFnZUhlYWRlcihod25kKTsKLSAgaWYgKGxwaGwgPT0gTlVMTCkgcmV0dXJuIDA7CiAgIHkgPSBscGhsLT5GaXJzdFZpc2libGU7CiAgIHN3aXRjaCh3UGFyYW0pIHsKICAgY2FzZSBTQl9MSU5FVVA6Ci0gICAgaWYgKGxwaGwtPkZpcnN0VmlzaWJsZSA+IDEpCisgICAgaWYgKGxwaGwtPkZpcnN0VmlzaWJsZSA+IGxwaGwtPkl0ZW1zUGVyQ29sdW1uKSB7CiAgICAgICBscGhsLT5GaXJzdFZpc2libGUgLT0gbHBobC0+SXRlbXNQZXJDb2x1bW47CisgICAgfSBlbHNlIHsKKyAgICAgIGxwaGwtPkZpcnN0VmlzaWJsZSA9IDA7CisgICAgfQogICAgIGJyZWFrOwogICBjYXNlIFNCX0xJTkVET1dOOgotICAgIGlmIChscGhsLT5GaXJzdFZpc2libGUgPCBMaXN0TWF4Rmlyc3RWaXNpYmxlKGxwaGwpKQotICAgICAgbHBobC0+Rmlyc3RWaXNpYmxlICs9IGxwaGwtPkl0ZW1zUGVyQ29sdW1uOworICAgIGxwaGwtPkZpcnN0VmlzaWJsZSArPSBscGhsLT5JdGVtc1BlckNvbHVtbjsKICAgICBicmVhazsKICAgY2FzZSBTQl9QQUdFVVA6Ci0gICAgaWYgKGxwaGwtPkZpcnN0VmlzaWJsZSA+IDEgJiYgbHBobC0+SXRlbXNQZXJDb2x1bW4gIT0gMCkgIAotICAgICAgbHBobC0+Rmlyc3RWaXNpYmxlIC09IGxwaGwtPkl0ZW1zVmlzaWJsZSAvCi0JbHBobC0+SXRlbXNQZXJDb2x1bW4gKiBscGhsLT5JdGVtc1BlckNvbHVtbjsKKyAgICBpZiAobHBobC0+SXRlbXNQZXJDb2x1bW4gIT0gMCkgeworICAgICAgaW50IGxic3ViID0gbHBobC0+SXRlbXNWaXNpYmxlIC8gbHBobC0+SXRlbXNQZXJDb2x1bW4gKiBscGhsLT5JdGVtc1BlckNvbHVtbjsKKyAgICAgIGlmIChscGhsLT5GaXJzdFZpc2libGUgPiBsYnN1YikgeworCWxwaGwtPkZpcnN0VmlzaWJsZSAtPSBsYnN1YjsKKyAgICAgIH0gZWxzZSB7CisJbHBobC0+Rmlyc3RWaXNpYmxlID0gMDsKKyAgICAgIH0KKyAgICB9CiAgICAgYnJlYWs7CiAgIGNhc2UgU0JfUEFHRURPV046Ci0gICAgaWYgKGxwaGwtPkZpcnN0VmlzaWJsZSA8IExpc3RNYXhGaXJzdFZpc2libGUobHBobCkgJiYKLQlscGhsLT5JdGVtc1BlckNvbHVtbiAhPSAwKSAgCisgICAgaWYgKGxwaGwtPkl0ZW1zUGVyQ29sdW1uICE9IDApCiAgICAgICBscGhsLT5GaXJzdFZpc2libGUgKz0gbHBobC0+SXRlbXNWaXNpYmxlIC8KIAlscGhsLT5JdGVtc1BlckNvbHVtbiAqIGxwaGwtPkl0ZW1zUGVyQ29sdW1uOwogICAgIGJyZWFrOwogICBjYXNlIFNCX1RIVU1CVFJBQ0s6Ci0gICAgbHBobC0+Rmlyc3RWaXNpYmxlID0gbHBobC0+SXRlbXNQZXJDb2x1bW4gKiAKLSAgICAgIChMT1dPUkQobFBhcmFtKSAtIDEpICsgMTsKKyAgICBscGhsLT5GaXJzdFZpc2libGUgPSBscGhsLT5JdGVtc1BlckNvbHVtbiAqIExPV09SRChsUGFyYW0pOwogICAgIGJyZWFrOwogICB9IAotICBpZiAobHBobC0+Rmlyc3RWaXNpYmxlIDwgMSkgbHBobC0+Rmlyc3RWaXNpYmxlID0gMTsKICAgaWYgKGxwaGwtPkZpcnN0VmlzaWJsZSA+IExpc3RNYXhGaXJzdFZpc2libGUobHBobCkpCiAgICAgbHBobC0+Rmlyc3RWaXNpYmxlID0gTGlzdE1heEZpcnN0VmlzaWJsZShscGhsKTsKIApAQCAtMzg0LDcgKzkzOSw2IEBACiAgICAgICBTZXRTY3JvbGxQb3MoaHduZCwgU0JfSE9SWiwgbHBobC0+Rmlyc3RWaXNpYmxlIC8gCiAJCSAgIGxwaGwtPkl0ZW1zUGVyQ29sdW1uICsgMSwgVFJVRSk7CiAgICAgICBJbnZhbGlkYXRlUmVjdChod25kLCBOVUxMLCBUUlVFKTsKLSAgICAgIFVwZGF0ZVdpbmRvdyhod25kKTsKICAgICB9CiAgIH0KICAgcmV0dXJuIDA7CkBAIC0zOTMsMTEgKzk0Nyw5IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBMQkxCdXR0b25Eb3duCiAgKi8KLUxPTkcgTEJMQnV0dG9uRG93biggSFdORCBod25kLCBXT1JEIG1lc3NhZ2UsIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSApCi0KK3N0YXRpYyBMT05HIExCTEJ1dHRvbkRvd24oSFdORCBod25kLCBXT1JEIG1lc3NhZ2UsIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSkKIHsKLSAgTFBIRUFETElTVCBscGhsOwotICBXTkQgICAgICAgICp3bmRQdHI7CisgIExQSEVBRExJU1QgbHBobCA9IExpc3RCb3hHZXRTdG9yYWdlSGVhZGVyKGh3bmQpOwogICBXT1JEICAgICAgIHdSZXQ7CiAgIGludCAgICAgICAgeTsKICAgUkVDVCAgICAgICByZWN0c2VsOwpAQCAtNDA1LDMwICs5NTcsMjUgQEAKICAgU2V0Rm9jdXMoaHduZCk7CiAgIFNldENhcHR1cmUoaHduZCk7CiAKLSAgbHBobCA9IExpc3RCb3hHZXRXaW5kb3dBbmRTdG9yYWdlKGh3bmQsICZ3bmRQdHIpOwotICBpZiAobHBobCA9PSBOVUxMKSByZXR1cm4gMDsKLQogICBscGhsLT5QcmV2Rm9jdXNlZCA9IGxwaGwtPkl0ZW1Gb2N1c2VkOwogCi0gIHkgPSBMaXN0Qm94RmluZE1vdXNlKGh3bmQsIExPV09SRChsUGFyYW0pLCBISVdPUkQobFBhcmFtKSk7Ci0gIGlmICh5PT0tMSkKKyAgeSA9IExpc3RCb3hGaW5kTW91c2UobHBobCwgTE9XT1JEKGxQYXJhbSksIEhJV09SRChsUGFyYW0pKTsKKyAgaWYgKHkgPT0gLTEpCiAgICAgcmV0dXJuIDA7CiAKLSAgaWYgKHduZFB0ci0+ZHdTdHlsZSAmIExCU19NVUxUSVBMRVNFTCkgeworICBpZiAobHBobC0+ZHdTdHlsZSAmIExCU19NVUxUSVBMRVNFTCkgewogICAgIGxwaGwtPkl0ZW1Gb2N1c2VkID0geTsKLSAgICB3UmV0ID0gTGlzdEJveEdldFNlbChod25kLCB5KTsKLSAgICBMaXN0Qm94U2V0U2VsKGh3bmQsIHksICF3UmV0KTsKKyAgICB3UmV0ID0gTGlzdEJveEdldFNlbChscGhsLCB5KTsKKyAgICBMaXN0Qm94U2V0U2VsKGxwaGwsIHksICF3UmV0KTsKKyAgfSBlbHNlIHsKKyAgICBMaXN0Qm94U2V0Q3VyU2VsKGxwaGwsIHkpOwogICB9Ci0gIGVsc2UKLSAgICBMaXN0Qm94U2V0Q3VyU2VsKGh3bmQsIHkpOworICBpZiAobHBobC0+ZHdTdHlsZSAmIExCU19NVUxUSVBMRVNFTCkKKyAgICBMaXN0Qm94U2VuZE5vdGlmaWNhdGlvbihscGhsLCBod25kLCBMQk5fU0VMQ0hBTkdFKTsKIAotICBpZiAod25kUHRyLT5kd1N0eWxlICYgTEJTX01VTFRJUExFU0VMKQotICAgIExpc3RCb3hTZW5kTm90aWZpY2F0aW9uKCBod25kLCBMQk5fU0VMQ0hBTkdFICk7Ci0KLSAgTGlzdEJveEdldEl0ZW1SZWN0KGh3bmQsIHksICZyZWN0c2VsKTsKKyAgTGlzdEJveEdldEl0ZW1SZWN0KGxwaGwsIHksICZyZWN0c2VsKTsKIAogICBJbnZhbGlkYXRlUmVjdChod25kLCBOVUxMLCBUUlVFKTsKLSAgVXBkYXRlV2luZG93KGh3bmQpOwogCiAgIHJldHVybiAwOwogfQpAQCAtNDM2LDE4ICs5ODMsMTQgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIExCTEJ1dHRvblVwCiAgKi8KLUxPTkcgTEJMQnV0dG9uVXAoIEhXTkQgaHduZCwgV09SRCBtZXNzYWdlLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0gKQotCitzdGF0aWMgTE9ORyBMQkxCdXR0b25VcChIV05EIGh3bmQsIFdPUkQgbWVzc2FnZSwgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtKQogewotICBMUEhFQURMSVNUIGxwaGw7Ci0gIFdORCAgICAgICAgKnduZFB0cjsKKyAgTFBIRUFETElTVCBscGhsID0gTGlzdEJveEdldFN0b3JhZ2VIZWFkZXIoaHduZCk7CiAKICAgaWYgKEdldENhcHR1cmUoKSA9PSBod25kKSBSZWxlYXNlQ2FwdHVyZSgpOwogCi0gIGxwaGwgPSBMaXN0Qm94R2V0V2luZG93QW5kU3RvcmFnZShod25kLCAmd25kUHRyKTsKLSAgaWYgKGxwaGwgPT0gTlVMTCkgcmV0dXJuIDA7CiAgIGlmIChscGhsLT5QcmV2Rm9jdXNlZCAhPSBscGhsLT5JdGVtRm9jdXNlZCkKLSAgICBMaXN0Qm94U2VuZE5vdGlmaWNhdGlvbiggaHduZCwgTEJOX1NFTENIQU5HRSApOworICAgIExpc3RCb3hTZW5kTm90aWZpY2F0aW9uKGxwaGwsIGh3bmQsIExCTl9TRUxDSEFOR0UpOwogCiAgIHJldHVybiAwOwogfQpAQCAtNDU1LDE1ICs5OTgsMTEgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIExCUkJ1dHRvblVwCiAgKi8KLUxPTkcgTEJSQnV0dG9uVXAoIEhXTkQgaHduZCwgV09SRCBtZXNzYWdlLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0gKQotCitzdGF0aWMgTE9ORyBMQlJCdXR0b25VcChIV05EIGh3bmQsIFdPUkQgbWVzc2FnZSwgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtKQogewotICBMUEhFQURMSVNUIGxwaGw7Ci0gIFdORCAgICAgICAgKnduZFB0cjsKLSAgCi0gIGxwaGwgPSBMaXN0Qm94R2V0V2luZG93QW5kU3RvcmFnZShod25kLCAmd25kUHRyKTsKLSAgaWYgKGxwaGwgPT0gTlVMTCkgcmV0dXJuIDA7Ci0gIFNlbmRNZXNzYWdlKGxwaGwtPmhXbmRMb2dpY1BhcmVudCwgV01fQ09NTUFORCwgd25kUHRyLT53SURtZW51LAorICBMUEhFQURMSVNUIGxwaGwgPSBMaXN0Qm94R2V0U3RvcmFnZUhlYWRlcihod25kKTsKKworICBTZW5kTWVzc2FnZShscGhsLT5oUGFyZW50LCBXTV9DT01NQU5ELCBHZXRXaW5kb3dXb3JkKGh3bmQsR1dXX0lEKSwKIAkJTUFLRUxPTkcoaHduZCwgTEJOX0RCTENMSykpOwogCiAgIHJldHVybiAwOwpAQCAtNDcyLDUwICsxMDExLDQ3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBMQk1vdXNlTW92ZQogICovCi1MT05HIExCTW91c2VNb3ZlKCBIV05EIGh3bmQsIFdPUkQgbWVzc2FnZSwgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtICkKLQorc3RhdGljIExPTkcgTEJNb3VzZU1vdmUoSFdORCBod25kLCBXT1JEIG1lc3NhZ2UsIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSkKIHsKLSAgTFBIRUFETElTVCAgbHBobDsKLSAgV05EICAgICAgICAqd25kUHRyOworICBMUEhFQURMSVNUIGxwaGwgPSBMaXN0Qm94R2V0U3RvcmFnZUhlYWRlcihod25kKTsKICAgaW50ICB5OwotICBXT1JEICAgICAgICB3UmV0OwotICBSRUNUICAgICAgICByZWN0LCByZWN0c2VsOyAgIC8qIFhYWCBCcm9rZW4gKi8KKyAgV09SRCB3UmV0OworICBSRUNUIHJlY3QsIHJlY3RzZWw7ICAgLyogWFhYIEJyb2tlbiAqLwogCi0gIGxwaGwgPSBMaXN0Qm94R2V0V2luZG93QW5kU3RvcmFnZShod25kLCAmd25kUHRyKTsKLSAgaWYgKGxwaGwgPT0gTlVMTCkgcmV0dXJuIDA7CisgIGRwcmludGZfbGlzdGJveChzdGRkZWIsIkxCTW91c2VNb3ZlICVkICVkXG4iLFNMT1dPUkQobFBhcmFtKSxTSElXT1JEKGxQYXJhbSkpOwogICBpZiAoKHdQYXJhbSAmIE1LX0xCVVRUT04pICE9IDApIHsKLSAgICB5ID0gSElXT1JEKGxQYXJhbSk7Ci0gICAgaWYgKHkgPCA0KSB7Ci0gICAgICBpZiAobHBobC0+Rmlyc3RWaXNpYmxlID4gMSkgeworICAgIHkgPSBTSElXT1JEKGxQYXJhbSk7CisgICAgaWYgKHkgPCAwKSB7CisgICAgICBpZiAobHBobC0+Rmlyc3RWaXNpYmxlID4gMCkgewogCWxwaGwtPkZpcnN0VmlzaWJsZS0tOwogCVNldFNjcm9sbFBvcyhod25kLCBTQl9WRVJULCBscGhsLT5GaXJzdFZpc2libGUsIFRSVUUpOwogCUludmFsaWRhdGVSZWN0KGh3bmQsIE5VTEwsIFRSVUUpOwotCVVwZGF0ZVdpbmRvdyhod25kKTsKIAlyZXR1cm4gMDsKICAgICAgIH0KICAgICB9CiAgICAgR2V0Q2xpZW50UmVjdChod25kLCAmcmVjdCk7Ci0gICAgaWYgKHkgPiAocmVjdC5ib3R0b20gLSA0KSkgeworICAgIGlmICh5ID49IHJlY3QuYm90dG9tKSB7CiAgICAgICBpZiAobHBobC0+Rmlyc3RWaXNpYmxlIDwgTGlzdE1heEZpcnN0VmlzaWJsZShscGhsKSkgewogCWxwaGwtPkZpcnN0VmlzaWJsZSsrOwogCVNldFNjcm9sbFBvcyhod25kLCBTQl9WRVJULCBscGhsLT5GaXJzdFZpc2libGUsIFRSVUUpOwogCUludmFsaWRhdGVSZWN0KGh3bmQsIE5VTEwsIFRSVUUpOwotCVVwZGF0ZVdpbmRvdyhod25kKTsKIAlyZXR1cm4gMDsKICAgICAgIH0KICAgICB9CiAgICAgaWYgKCh5ID4gMCkgJiYgKHkgPCAocmVjdC5ib3R0b20gLSA0KSkpIHsKICAgICAgIGlmICgoeSA8IHJlY3RzZWwudG9wKSB8fCAoeSA+IHJlY3RzZWwuYm90dG9tKSkgewotCXdSZXQgPSBMaXN0Qm94RmluZE1vdXNlKGh3bmQsIExPV09SRChsUGFyYW0pLCBISVdPUkQobFBhcmFtKSk7Ci0JaWYgKCh3bmRQdHItPmR3U3R5bGUgJiBMQlNfTVVMVElQTEVTRUwpID09IExCU19NVUxUSVBMRVNFTCkgewotCSAgbHBobC0+SXRlbUZvY3VzZWQgPSB3UmV0OwotCSAgTGlzdEJveFNlbmROb3RpZmljYXRpb24oaHduZCwgTEJOX1NFTENIQU5HRSk7CisJd1JldCA9IExpc3RCb3hGaW5kTW91c2UobHBobCwgTE9XT1JEKGxQYXJhbSksIEhJV09SRChsUGFyYW0pKTsKKwlpZiAod1JldCA9PSBscGhsLT5JdGVtRm9jdXNlZCkgIHsKKwkgIHJldHVybiAwOwogCX0KLQllbHNlCi0JICBMaXN0Qm94U2V0Q3VyU2VsKGh3bmQsIHdSZXQpOwotCUxpc3RCb3hHZXRJdGVtUmVjdChod25kLCB3UmV0LCAmcmVjdHNlbCk7CisJaWYgKGxwaGwtPmR3U3R5bGUgJiBMQlNfTVVMVElQTEVTRUwpIHsKKwkgIGxwaGwtPkl0ZW1Gb2N1c2VkID0gd1JldDsKKwkgIExpc3RCb3hTZW5kTm90aWZpY2F0aW9uKGxwaGwsIGh3bmQsIExCTl9TRUxDSEFOR0UpOworCX0gZWxzZSB7CisJICBMaXN0Qm94U2V0Q3VyU2VsKGxwaGwsIHdSZXQpOworCX0KKwlMaXN0Qm94R2V0SXRlbVJlY3QobHBobCwgd1JldCwgJnJlY3RzZWwpOwogCUludmFsaWRhdGVSZWN0KGh3bmQsIE5VTEwsIFRSVUUpOwotCVVwZGF0ZVdpbmRvdyhod25kKTsKICAgICAgIH0KICAgICB9CiAgIH0KQEAgLTUyNiw4NSArMTA2Miw5NyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgTEJLZXlEb3duCiAgKi8KLUxPTkcgTEJLZXlEb3duKCBIV05EIGh3bmQsIFdPUkQgbWVzc2FnZSwgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtICkKLQorc3RhdGljIExPTkcgTEJLZXlEb3duKEhXTkQgaHduZCwgV09SRCBtZXNzYWdlLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0pCiB7Ci0gIExQSEVBRExJU1QgIGxwaGw7Ci0gIFdORCAgICAgICAgKnduZFB0cjsKLSAgSFdORCAgICAgICAgaFduZEN0bDsKLSAgV09SRCAgICAgICAgd1JldDsKKyAgTFBIRUFETElTVCBscGhsID0gTGlzdEJveEdldFN0b3JhZ2VIZWFkZXIoaHduZCk7CisgIFdPUkQgICAgICAgbmV3Rm9jdXNlZCA9IGxwaGwtPkl0ZW1Gb2N1c2VkOwogCi0gIGxwaGwgPSBMaXN0Qm94R2V0V2luZG93QW5kU3RvcmFnZShod25kLCAmd25kUHRyKTsKLSAgaWYgKGxwaGwgPT0gTlVMTCkgcmV0dXJuIDA7Ci0gIHN3aXRjaCh3UGFyYW0pIHsKLSAgY2FzZSBWS19UQUI6Ci0gICAgaFduZEN0bCA9IEdldE5leHREbGdUYWJJdGVtKGxwaGwtPmhXbmRMb2dpY1BhcmVudCwKLQkJCQlod25kLCAhKEdldEtleVN0YXRlKFZLX1NISUZUKSA8IDApKTsKLSAgICBTZXRGb2N1cyhoV25kQ3RsKTsKLSAgICBpZihkZWJ1Z2dpbmdfbGlzdGJveCl7Ci0gICAgICBpZiAoKEdldEtleVN0YXRlKFZLX1NISUZUKSA8IDApKQotCWRwcmludGZfbGlzdGJveChzdGRkZWIsIkxpc3RCb3ggUHJldmlvdXNEbGdUYWJJdGVtICUwNFggIVxuIiwgaFduZEN0bCk7Ci0gICAgICBlbHNlCi0JZHByaW50Zl9saXN0Ym94KHN0ZGRlYiwiTGlzdEJveCBOZXh0RGxnVGFiSXRlbSAlMDRYICFcbiIsIGhXbmRDdGwpOworICBpZiAod1BhcmFtID09IFZLX1NQQUNFKSB7CisgICAgaWYgKGxwaGwtPmR3U3R5bGUgJiBMQlNfTVVMVElQTEVTRUwpIHsKKyAgICAgIFdPUkQgd1JldCA9IExpc3RCb3hHZXRTZWwobHBobCwgbHBobC0+SXRlbUZvY3VzZWQpOworICAgICAgTGlzdEJveFNldFNlbChscGhsLCBscGhsLT5JdGVtRm9jdXNlZCwgIXdSZXQpOwogICAgIH0KLSAgICBicmVhazsKKyAgICByZXR1cm4gMDsKKyAgfQorICBzd2l0Y2god1BhcmFtKSB7CiAgIGNhc2UgVktfSE9NRToKLSAgICBscGhsLT5JdGVtRm9jdXNlZCA9IDA7CisgICAgbmV3Rm9jdXNlZCA9IDA7CiAgICAgYnJlYWs7CiAgIGNhc2UgVktfRU5EOgotICAgIGxwaGwtPkl0ZW1Gb2N1c2VkID0gbHBobC0+SXRlbXNDb3VudCAtIDE7CisgICAgbmV3Rm9jdXNlZCA9IGxwaGwtPkl0ZW1zQ291bnQgLSAxOwogICAgIGJyZWFrOwogICBjYXNlIFZLX0xFRlQ6Ci0gICAgaWYgKCh3bmRQdHItPmR3U3R5bGUgJiBMQlNfTVVMVElDT0xVTU4pID09IExCU19NVUxUSUNPTFVNTikgewotICAgICAgbHBobC0+SXRlbUZvY3VzZWQgLT0gbHBobC0+SXRlbXNQZXJDb2x1bW47CisgICAgaWYgKGxwaGwtPmR3U3R5bGUgJiBMQlNfTVVMVElDT0xVTU4pIHsKKyAgICAgIGlmIChuZXdGb2N1c2VkID49IGxwaGwtPkl0ZW1zUGVyQ29sdW1uKSB7CisJbmV3Rm9jdXNlZCAtPSBscGhsLT5JdGVtc1BlckNvbHVtbjsKKyAgICAgIH0gZWxzZSB7CisJbmV3Rm9jdXNlZCA9IDA7CisgICAgICB9CiAgICAgfQogICAgIGJyZWFrOwogICBjYXNlIFZLX1VQOgotICAgIGxwaGwtPkl0ZW1Gb2N1c2VkLS07CisgICAgaWYgKG5ld0ZvY3VzZWQgPiAwKSBuZXdGb2N1c2VkLS07CiAgICAgYnJlYWs7CiAgIGNhc2UgVktfUklHSFQ6Ci0gICAgaWYgKCh3bmRQdHItPmR3U3R5bGUgJiBMQlNfTVVMVElDT0xVTU4pID09IExCU19NVUxUSUNPTFVNTikgewotICAgICAgbHBobC0+SXRlbUZvY3VzZWQgKz0gbHBobC0+SXRlbXNQZXJDb2x1bW47CisgICAgaWYgKGxwaGwtPmR3U3R5bGUgJiBMQlNfTVVMVElDT0xVTU4pIHsKKyAgICAgIG5ld0ZvY3VzZWQgKz0gbHBobC0+SXRlbXNQZXJDb2x1bW47CiAgICAgfQogICAgIGJyZWFrOwogICBjYXNlIFZLX0RPV046Ci0gICAgbHBobC0+SXRlbUZvY3VzZWQrKzsKKyAgICBuZXdGb2N1c2VkKys7CiAgICAgYnJlYWs7CiAgIGNhc2UgVktfUFJJT1I6Ci0gICAgbHBobC0+SXRlbUZvY3VzZWQgLT0gbHBobC0+SXRlbXNWaXNpYmxlOworICAgIGlmIChuZXdGb2N1c2VkID4gbHBobC0+SXRlbXNWaXNpYmxlKSB7CisgICAgICBuZXdGb2N1c2VkIC09IGxwaGwtPkl0ZW1zVmlzaWJsZTsKKyAgICB9IGVsc2UgeworICAgICAgbmV3Rm9jdXNlZCA9IDA7CisgICAgfQogICAgIGJyZWFrOwogICBjYXNlIFZLX05FWFQ6Ci0gICAgbHBobC0+SXRlbUZvY3VzZWQgKz0gbHBobC0+SXRlbXNWaXNpYmxlOwotICAgIGJyZWFrOwotICBjYXNlIFZLX1NQQUNFOgotICAgIHdSZXQgPSBMaXN0Qm94R2V0U2VsKGh3bmQsIGxwaGwtPkl0ZW1Gb2N1c2VkKTsKLSAgICBMaXN0Qm94U2V0U2VsKGh3bmQsIGxwaGwtPkl0ZW1Gb2N1c2VkLCAhd1JldCk7CisgICAgbmV3Rm9jdXNlZCArPSBscGhsLT5JdGVtc1Zpc2libGU7CiAgICAgYnJlYWs7CiAgIGRlZmF1bHQ6Ci0gICAgTGlzdEJveEZpbmROZXh0TWF0Y2goaHduZCwgd1BhcmFtKTsKICAgICByZXR1cm4gMDsKICAgfQogCi0gIGlmIChscGhsLT5JdGVtRm9jdXNlZCA8IDApIGxwaGwtPkl0ZW1Gb2N1c2VkID0gMDsKLSAgaWYgKGxwaGwtPkl0ZW1Gb2N1c2VkID49IGxwaGwtPkl0ZW1zQ291bnQpCi0gICAgbHBobC0+SXRlbUZvY3VzZWQgPSBscGhsLT5JdGVtc0NvdW50IC0gMTsKLQotICBpZiAobHBobC0+SXRlbXNWaXNpYmxlICE9IDApCi0gICAgbHBobC0+Rmlyc3RWaXNpYmxlID0gbHBobC0+SXRlbUZvY3VzZWQgLyBscGhsLT5JdGVtc1Zpc2libGUgKiAKLSAgICAgIGxwaGwtPkl0ZW1zVmlzaWJsZSArIDE7Ci0KLSAgaWYgKGxwaGwtPkZpcnN0VmlzaWJsZSA8IDEpIGxwaGwtPkZpcnN0VmlzaWJsZSA9IDE7Ci0gIGlmIChscGhsLT5GaXJzdFZpc2libGUgPiBMaXN0TWF4Rmlyc3RWaXNpYmxlKGxwaGwpKQotICAgIGxwaGwtPkZpcnN0VmlzaWJsZSA9IExpc3RNYXhGaXJzdFZpc2libGUobHBobCk7Ci0KLSAgaWYgKCh3bmRQdHItPmR3U3R5bGUgJiBMQlNfTVVMVElQTEVTRUwpICE9IExCU19NVUxUSVBMRVNFTCkgewotICAgIExpc3RCb3hTZXRDdXJTZWwoaHduZCwgbHBobC0+SXRlbUZvY3VzZWQpOwotICAgIExpc3RCb3hTZW5kTm90aWZpY2F0aW9uKGh3bmQsIExCTl9TRUxDSEFOR0UpOworICBpZiAobmV3Rm9jdXNlZCA+PSBscGhsLT5JdGVtc0NvdW50KQorICAgIG5ld0ZvY3VzZWQgPSBscGhsLT5JdGVtc0NvdW50IC0gMTsKKyAgCisgIGlmICghKGxwaGwtPmR3U3R5bGUgJiBMQlNfTVVMVElQTEVTRUwpKSB7CisgICAgTGlzdEJveFNldEN1clNlbChscGhsLCBuZXdGb2N1c2VkKTsKKyAgICBMaXN0Qm94U2VuZE5vdGlmaWNhdGlvbihscGhsLCBod25kLCBMQk5fU0VMQ0hBTkdFKTsKICAgfQogCisgIGxwaGwtPkl0ZW1Gb2N1c2VkID0gbmV3Rm9jdXNlZDsKKyAgTGlzdEJveFNjcm9sbFRvRm9jdXMobHBobCk7IAogICBTZXRTY3JvbGxQb3MoaHduZCwgU0JfVkVSVCwgbHBobC0+Rmlyc3RWaXNpYmxlLCBUUlVFKTsKICAgSW52YWxpZGF0ZVJlY3QoaHduZCwgTlVMTCwgVFJVRSk7Ci0gIFVwZGF0ZVdpbmRvdyhod25kKTsKKworICByZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgTEJDaGFyCisgKi8KK3N0YXRpYyBMT05HIExCQ2hhcihIV05EIGh3bmQsIFdPUkQgbWVzc2FnZSwgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtKQoreworICBMUEhFQURMSVNUIGxwaGwgPSBMaXN0Qm94R2V0U3RvcmFnZUhlYWRlcihod25kKTsKKyAgV09SRCAgICAgICBuZXdGb2N1c2VkOworCisgIG5ld0ZvY3VzZWQgPSBMaXN0Qm94RmluZE5leHRNYXRjaChscGhsLCB3UGFyYW0pOworICBpZiAobmV3Rm9jdXNlZCA9PSAoV09SRClMQl9FUlIpIHJldHVybiAwOworCisgIGlmIChuZXdGb2N1c2VkID49IGxwaGwtPkl0ZW1zQ291bnQpCisgICAgbmV3Rm9jdXNlZCA9IGxwaGwtPkl0ZW1zQ291bnQgLSAxOworICBpZiAoIShscGhsLT5kd1N0eWxlICYgTEJTX01VTFRJUExFU0VMKSkgeworICAgIExpc3RCb3hTZXRDdXJTZWwobHBobCwgbmV3Rm9jdXNlZCk7CisgICAgTGlzdEJveFNlbmROb3RpZmljYXRpb24obHBobCwgaHduZCwgTEJOX1NFTENIQU5HRSk7CisgIH0KKworICBscGhsLT5JdGVtRm9jdXNlZCA9IG5ld0ZvY3VzZWQ7CisgIExpc3RCb3hTY3JvbGxUb0ZvY3VzKGxwaGwpOworICBTZXRTY3JvbGxQb3MoaHduZCwgU0JfVkVSVCwgbHBobC0+Rmlyc3RWaXNpYmxlLCBUUlVFKTsKKyAgSW52YWxpZGF0ZVJlY3QoaHduZCwgTlVMTCwgVFJVRSk7CiAKICAgcmV0dXJuIDA7CiB9CkBAIC02MTIsMTUgKzExNjAsMTEgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIExCU2V0UmVkcmF3CiAgKi8KLUxPTkcgTEJTZXRSZWRyYXcoIEhXTkQgaHduZCwgV09SRCBtZXNzYWdlLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0gKQotCitzdGF0aWMgTE9ORyBMQlNldFJlZHJhdyhIV05EIGh3bmQsIFdPUkQgbWVzc2FnZSwgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtKQogewotICBMUEhFQURMSVNUICBscGhsOwotICBXTkQgICAgICAgICp3bmRQdHI7CisgIExQSEVBRExJU1QgIGxwaGwgPSBMaXN0Qm94R2V0U3RvcmFnZUhlYWRlcihod25kKTsKIAogICBkcHJpbnRmX2xpc3Rib3goc3RkZGViLCJMaXN0Qm94IFdNX1NFVFJFRFJBVyBoV25kPSUwNFggdz0lMDRYICFcbiIsIGh3bmQsIHdQYXJhbSk7Ci0gIGxwaGwgPSBMaXN0Qm94R2V0V2luZG93QW5kU3RvcmFnZShod25kLCAmd25kUHRyKTsKLSAgaWYgKGxwaGwgPT0gTlVMTCkgcmV0dXJuIDA7CiAgIGxwaGwtPmJSZWRyYXdGbGFnID0gd1BhcmFtOwogCiAgIHJldHVybiAwOwpAQCAtNjI5LDE1ICsxMTczLDkgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIExCU2V0Rm9udAogICovCi0KLUxPTkcgTEJTZXRGb250KCBIV05EIGh3bmQsIFdPUkQgbWVzc2FnZSwgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtICkKLQorc3RhdGljIExPTkcgTEJTZXRGb250KEhXTkQgaHduZCwgV09SRCBtZXNzYWdlLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0pCiB7Ci0gIExQSEVBRExJU1QgIGxwaGw7Ci0gIFdORCAgICAgICAgKnduZFB0cjsKLQotICBscGhsID0gTGlzdEJveEdldFdpbmRvd0FuZFN0b3JhZ2UoaHduZCwgJnduZFB0cik7Ci0gIGlmIChscGhsID09IE5VTEwpIHJldHVybiAwOworICBMUEhFQURMSVNUICBscGhsID0gTGlzdEJveEdldFN0b3JhZ2VIZWFkZXIoaHduZCk7CiAKICAgaWYgKHdQYXJhbSA9PSAwKQogICAgIGxwaGwtPmhGb250ID0gR2V0U3RvY2tPYmplY3QoU1lTVEVNX0ZPTlQpOwpAQCAtNjUwLDI0ICsxMTg4LDk4IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBMQlBhaW50CiAgKi8KLUxPTkcgTEJQYWludCggSFdORCBod25kLCBXT1JEIG1lc3NhZ2UsIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSApCi0KK3N0YXRpYyBMT05HIExCUGFpbnQoSFdORCBod25kLCBXT1JEIG1lc3NhZ2UsIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSkKIHsKLSAgUmVwYWludExpc3RCb3goaHduZCk7CisgIExQSEVBRExJU1QgICBscGhsID0gTGlzdEJveEdldFN0b3JhZ2VIZWFkZXIoaHduZCk7CisgIExQTElTVFNUUlVDVCBscGxzOworICBQQUlOVFNUUlVDVCAgcHM7CisgIEhCUlVTSCAgICAgICBoQnJ1c2g7CisgIEhGT05UICAgICAgICBoT2xkRm9udDsKKyAgSERDIAloZGM7CisgIFJFQ1QgCXJlY3Q7CisgIGludCAgIGksIHRvcCwgaGVpZ2h0LCBtYXh3aWR0aCwgaXBjOworCisgIHRvcCA9IDA7CisgIGhkYyA9IEJlZ2luUGFpbnQoIGh3bmQsICZwcyApOworCisgIGlmICghSXNXaW5kb3dWaXNpYmxlKGh3bmQpIHx8ICFscGhsLT5iUmVkcmF3RmxhZykgeworICAgIEVuZFBhaW50KGh3bmQsICZwcyk7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBoT2xkRm9udCA9IFNlbGVjdE9iamVjdChoZGMsIGxwaGwtPmhGb250KTsKKworICBoQnJ1c2ggPSBTZW5kTWVzc2FnZShscGhsLT5oUGFyZW50LCBXTV9DVExDT0xPUiwgaGRjLAorCQkgICAgICAgTUFLRUxPTkcoaHduZCwgQ1RMQ09MT1JfTElTVEJPWCkpOworCisgIGlmIChoQnJ1c2ggPT0gMCkgaEJydXNoID0gR2V0U3RvY2tPYmplY3QoV0hJVEVfQlJVU0gpOworCisgIEdldENsaWVudFJlY3QoaHduZCwgJnJlY3QpOworICBGaWxsUmVjdChoZGMsICZyZWN0LCBoQnJ1c2gpOworCisgIG1heHdpZHRoID0gcmVjdC5yaWdodDsKKyAgaWYgKGxwaGwtPmR3U3R5bGUgJiBMQlNfTVVMVElDT0xVTU4pIHsKKyAgICByZWN0LnJpZ2h0ID0gbHBobC0+Q29sdW1uc1dpZHRoOworICB9CisgIGxwbHMgPSBscGhsLT5scEZpcnN0OworCisgIGxwaGwtPkl0ZW1zVmlzaWJsZSA9IDA7CisgIGxwaGwtPkl0ZW1zUGVyQ29sdW1uID0gaXBjID0gMDsKKworICBmb3IoaSA9IDA7IGkgPCBscGhsLT5JdGVtc0NvdW50OyBpKyspIHsKKyAgICBpZiAobHBscyA9PSBOVUxMKSBicmVhazsKKworICAgIGlmIChpID49IGxwaGwtPkZpcnN0VmlzaWJsZSkgeworICAgICAgaGVpZ2h0ID0gbHBscy0+bWlzLml0ZW1IZWlnaHQ7CisKKyAgICAgIGlmICh0b3AgPiByZWN0LmJvdHRvbSkgeworCWlmIChscGhsLT5kd1N0eWxlICYgTEJTX01VTFRJQ09MVU1OKSB7CisJICBscGhsLT5JdGVtc1BlckNvbHVtbiA9IG1heChscGhsLT5JdGVtc1BlckNvbHVtbiwgaXBjKTsKKwkgIGlwYyA9IDA7CisJICB0b3AgPSAwOworCSAgcmVjdC5sZWZ0ICs9IGxwaGwtPkNvbHVtbnNXaWR0aDsKKwkgIHJlY3QucmlnaHQgKz0gbHBobC0+Q29sdW1uc1dpZHRoOworCSAgaWYgKHJlY3QubGVmdCA+IG1heHdpZHRoKSBicmVhazsKKwl9IGVsc2UgeworCSAgYnJlYWs7CisJfQorICAgICAgfQorCisgICAgICBscGxzLT5pdGVtUmVjdC50b3AgICAgPSB0b3A7CisgICAgICBscGxzLT5pdGVtUmVjdC5ib3R0b20gPSB0b3AgKyBoZWlnaHQ7CisgICAgICBscGxzLT5pdGVtUmVjdC5sZWZ0ICAgPSByZWN0LmxlZnQ7CisgICAgICBscGxzLT5pdGVtUmVjdC5yaWdodCAgPSByZWN0LnJpZ2h0OworCisgICAgICBkcHJpbnRmX2xpc3Rib3goc3RkZGViLCJkcmF3aW5nIGl0ZW06ICVkICVkICVkICVkICVkXG4iLHJlY3QubGVmdCx0b3AscmVjdC5yaWdodCx0b3AraGVpZ2h0LGxwbHMtPml0ZW1TdGF0ZSk7CisgICAgICBpZiAoT1dORVJfRFJBV04obHBobCkpIHsKKwlMaXN0Qm94RHJhd0l0ZW0gKGh3bmQsIGxwaGwsIGhkYywgbHBscywgJmxwbHMtPml0ZW1SZWN0LCBPREFfRFJBV0VOVElSRSwgMCk7CisJaWYgKGxwbHMtPml0ZW1TdGF0ZSkKKwkgIExpc3RCb3hEcmF3SXRlbSAoaHduZCwgbHBobCwgaGRjLCBscGxzLCAmbHBscy0+aXRlbVJlY3QsIE9EQV9TRUxFQ1QsIE9EU19TRUxFQ1RFRCk7CisgICAgICB9IGVsc2UgeworCUxpc3RCb3hEcmF3SXRlbSAoaHduZCwgbHBobCwgaGRjLCBscGxzLCAmbHBscy0+aXRlbVJlY3QsIE9EQV9EUkFXRU5USVJFLCAKKwkJCSBscGxzLT5pdGVtU3RhdGUpOworICAgICAgfQorICAgICAgaWYgKChscGhsLT5JdGVtRm9jdXNlZCA9PSBpKSAmJiBHZXRGb2N1cygpID09IGh3bmQpCisJTGlzdEJveERyYXdJdGVtIChod25kLGxwaGwsIGhkYywgbHBscywgJmxwbHMtPml0ZW1SZWN0LCBPREFfRk9DVVMsIE9EU19GT0NVUyk7CisKKyAgICAgIHRvcCArPSBoZWlnaHQ7CisgICAgICBscGhsLT5JdGVtc1Zpc2libGUrKzsKKyAgICAgIGlwYysrOworICAgIH0KKworICAgIGxwbHMgPSBscGxzLT5scE5leHQ7CisgIH0KKyAgU2VsZWN0T2JqZWN0KGhkYyxoT2xkRm9udCk7CisgIEVuZFBhaW50KCBod25kLCAmcHMgKTsKICAgcmV0dXJuIDA7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIExCU2V0Rm9jdXMKICAqLwotTE9ORyBMQlNldEZvY3VzKCBIV05EIGh3bmQsIFdPUkQgbWVzc2FnZSwgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtICkKLQorc3RhdGljIExPTkcgTEJTZXRGb2N1cyhIV05EIGh3bmQsIFdPUkQgbWVzc2FnZSwgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtKQogewotICBMUEhFQURMSVNUIGxwaGw7Ci0gIFdORCAgICAgICAqd25kUHRyOwotCiAgIGRwcmludGZfbGlzdGJveChzdGRkZWIsIkxpc3RCb3ggV01fU0VURk9DVVMgIVxuIik7Ci0gIGxwaGwgPSBMaXN0Qm94R2V0V2luZG93QW5kU3RvcmFnZShod25kLCAmd25kUHRyKTsKIAogICByZXR1cm4gMDsKIH0KQEAgLTY3NSwxMyArMTI4NywxMSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgTEJLaWxsRm9jdXMKICAqLwotTE9ORyBMQktpbGxGb2N1cyggSFdORCBod25kLCBXT1JEIG1lc3NhZ2UsIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSApCi0KK3N0YXRpYyBMT05HIExCS2lsbEZvY3VzKEhXTkQgaHduZCwgV09SRCBtZXNzYWdlLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0pCiB7CiAgIGRwcmludGZfbGlzdGJveChzdGRkZWIsIkxpc3RCb3ggV01fS0lMTEZPQ1VTICFcbiIpOwogCiAgIEludmFsaWRhdGVSZWN0KGh3bmQsIE5VTEwsIFRSVUUpOwotICBVcGRhdGVXaW5kb3coaHduZCk7CiAgIAogICByZXR1cm4gMDsKIH0KQEAgLTY4OSw2MSArMTI5OSw1NyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgTEJSZXNldENvbnRlbnQKICAqLwotTE9ORyBMQlJlc2V0Q29udGVudCggSFdORCBod25kLCBXT1JEIG1lc3NhZ2UsIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSApCi0KK3N0YXRpYyBMT05HIExCUmVzZXRDb250ZW50KEhXTkQgaHduZCwgV09SRCBtZXNzYWdlLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0pCiB7Ci0gIGRwcmludGZfbGlzdGJveChzdGRkZWIsIkxpc3RCb3ggTEJfUkVTRVRDT05URU5UICFcbiIpOwotICBMaXN0Qm94UmVzZXRDb250ZW50KGh3bmQpOworICBMUEhFQURMSVNUIGxwaGwgPSBMaXN0Qm94R2V0U3RvcmFnZUhlYWRlcihod25kKTsKIAorICBkcHJpbnRmX2xpc3Rib3goc3RkZGViLCJMaXN0Qm94IExCX1JFU0VUQ09OVEVOVCAhXG4iKTsKKyAgTGlzdEJveFJlc2V0Q29udGVudChscGhsKTsKKyAgTGlzdEJveFVwZGF0ZVdpbmRvdyhod25kLCBscGhsLCBUUlVFKTsKICAgcmV0dXJuIDA7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIExCRGlyCiAgKi8KLUxPTkcgTEJEaXIoIEhXTkQgaHduZCwgV09SRCBtZXNzYWdlLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0gKQotCitzdGF0aWMgTE9ORyBMQkRpcihIV05EIGh3bmQsIFdPUkQgbWVzc2FnZSwgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtKQogewogICBXT1JEICAgd1JldDsKKyAgTFBIRUFETElTVCBscGhsID0gTGlzdEJveEdldFN0b3JhZ2VIZWFkZXIoaHduZCk7CiAgIGRwcmludGZfbGlzdGJveChzdGRkZWIsIkxpc3RCb3ggTEJfRElSICFcbiIpOwogCi0gIHdSZXQgPSBMaXN0Qm94RGlyZWN0b3J5KGh3bmQsIHdQYXJhbSwKLQkJCSAgKExQU1RSKVBUUl9TRUdfVE9fTElOKGxQYXJhbSkpOwotICBJbnZhbGlkYXRlUmVjdChod25kLCBOVUxMLCBUUlVFKTsKLSAgVXBkYXRlV2luZG93KGh3bmQpOworICB3UmV0ID0gTGlzdEJveERpcmVjdG9yeShscGhsLCB3UGFyYW0sIChMUFNUUilQVFJfU0VHX1RPX0xJTihsUGFyYW0pKTsKKyAgTGlzdEJveFVwZGF0ZVdpbmRvdyhod25kLCBscGhsLCBUUlVFKTsKICAgcmV0dXJuIHdSZXQ7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIExCQWRkU3RyaW5nCiAgKi8KLUxPTkcgTEJBZGRTdHJpbmcoIEhXTkQgaHduZCwgV09SRCBtZXNzYWdlLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0gKQotCitzdGF0aWMgTE9ORyBMQkFkZFN0cmluZyhIV05EIGh3bmQsIFdPUkQgbWVzc2FnZSwgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtKQogewogICBXT1JEICB3UmV0OwotICBXTkQgICp3bmRQdHI7CisgIExQSEVBRExJU1QgbHBobCA9IExpc3RCb3hHZXRTdG9yYWdlSGVhZGVyKGh3bmQpOwogCi0gIHduZFB0ciA9IFdJTl9GaW5kV25kUHRyKGh3bmQpOwotCi0gIGlmIChIYXNTdHJpbmdzKHduZFB0cikpCi0gICAgd1JldCA9IExpc3RCb3hBZGRTdHJpbmcoaHduZCwgKExQU1RSKVBUUl9TRUdfVE9fTElOKGxQYXJhbSkpOworICBpZiAoSGFzU3RyaW5ncyhscGhsKSkKKyAgICB3UmV0ID0gTGlzdEJveEFkZFN0cmluZyhscGhsLCAoTFBTVFIpUFRSX1NFR19UT19MSU4obFBhcmFtKSk7CiAgIGVsc2UKLSAgICB3UmV0ID0gTGlzdEJveEFkZFN0cmluZyhod25kLCAoTFBTVFIpbFBhcmFtKTsKKyAgICB3UmV0ID0gTGlzdEJveEFkZFN0cmluZyhscGhsLCAoTFBTVFIpbFBhcmFtKTsKIAorICBMaXN0Qm94VXBkYXRlV2luZG93KGh3bmQsbHBobCxUUlVFKTsKICAgcmV0dXJuIHdSZXQ7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIExCR2V0VGV4dAogICovCi1MT05HIExCR2V0VGV4dCggSFdORCBod25kLCBXT1JEIG1lc3NhZ2UsIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSApCi0KK3N0YXRpYyBMT05HIExCR2V0VGV4dChIV05EIGh3bmQsIFdPUkQgbWVzc2FnZSwgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtKQogewogICBMT05HICAgd1JldDsKKyAgTFBIRUFETElTVCBscGhsID0gTGlzdEJveEdldFN0b3JhZ2VIZWFkZXIoaHduZCk7CiAKICAgZHByaW50Zl9saXN0Ym94KHN0ZGRlYiwgIkxCX0dFVFRFWFQgIHdQYXJhbT0lZFxuIix3UGFyYW0pOwotICB3UmV0ID0gTGlzdEJveEdldFRleHQoaHduZCwgd1BhcmFtLAotCQkJKExQU1RSKVBUUl9TRUdfVE9fTElOKGxQYXJhbSksIEZBTFNFKTsKKyAgd1JldCA9IExpc3RCb3hHZXRUZXh0KGxwaGwsIHdQYXJhbSwgKExQU1RSKVBUUl9TRUdfVE9fTElOKGxQYXJhbSkpOwogCiAgIHJldHVybiB3UmV0OwogfQpAQCAtNzUxLDYwICsxMzU3LDU0IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBMQkluc2VydFN0cmluZwogICovCi1MT05HIExCSW5zZXJ0U3RyaW5nKCBIV05EIGh3bmQsIFdPUkQgbWVzc2FnZSwgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtICkKLQorc3RhdGljIExPTkcgTEJJbnNlcnRTdHJpbmcoSFdORCBod25kLCBXT1JEIG1lc3NhZ2UsIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSkKIHsKICAgV09SRCAgd1JldDsKLSAgV05EICAqd25kUHRyOworICBMUEhFQURMSVNUIGxwaGwgPSBMaXN0Qm94R2V0U3RvcmFnZUhlYWRlcihod25kKTsKIAotICB3bmRQdHIgPSBXSU5fRmluZFduZFB0cihod25kKTsKLQotICBpZiAoSGFzU3RyaW5ncyh3bmRQdHIpKQotICAgIHdSZXQgPSBMaXN0Qm94SW5zZXJ0U3RyaW5nKGh3bmQsIHdQYXJhbSwgKExQU1RSKVBUUl9TRUdfVE9fTElOKGxQYXJhbSkpOworICBpZiAoSGFzU3RyaW5ncyhscGhsKSkKKyAgICB3UmV0ID0gTGlzdEJveEluc2VydFN0cmluZyhscGhsLCB3UGFyYW0sIChMUFNUUilQVFJfU0VHX1RPX0xJTihsUGFyYW0pKTsKICAgZWxzZQotICAgIHdSZXQgPSBMaXN0Qm94SW5zZXJ0U3RyaW5nKGh3bmQsIHdQYXJhbSwgKExQU1RSKWxQYXJhbSk7CisgICAgd1JldCA9IExpc3RCb3hJbnNlcnRTdHJpbmcobHBobCwgd1BhcmFtLCAoTFBTVFIpbFBhcmFtKTsKIAorICBMaXN0Qm94VXBkYXRlV2luZG93KGh3bmQsbHBobCxUUlVFKTsKICAgcmV0dXJuIHdSZXQ7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIExCRGVsZXRlU3RyaW5nCi0gKi8gICAgCi1MT05HIExCRGVsZXRlU3RyaW5nKCBIV05EIGh3bmQsIFdPUkQgbWVzc2FnZSwgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtICkKLQorICovCitzdGF0aWMgTE9ORyBMQkRlbGV0ZVN0cmluZyhIV05EIGh3bmQsIFdPUkQgbWVzc2FnZSwgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtKQogewotICByZXR1cm4gTGlzdEJveERlbGV0ZVN0cmluZyhod25kLCB3UGFyYW0pOyAKKyAgTFBIRUFETElTVCBscGhsID0gTGlzdEJveEdldFN0b3JhZ2VIZWFkZXIoaHduZCk7CisgIExPTkcgbFJldCA9IExpc3RCb3hEZWxldGVTdHJpbmcobHBobCx3UGFyYW0pOworICAKKyAgTGlzdEJveFVwZGF0ZVdpbmRvdyhod25kLGxwaGwsVFJVRSk7CisgIHJldHVybiBsUmV0OwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBMQkZpbmRTdHJpbmcKICAqLwotTE9ORyBMQkZpbmRTdHJpbmcoIEhXTkQgaHduZCwgV09SRCBtZXNzYWdlLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0gKQotCitzdGF0aWMgTE9ORyBMQkZpbmRTdHJpbmcoSFdORCBod25kLCBXT1JEIG1lc3NhZ2UsIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSkKIHsKLSAgcmV0dXJuIExpc3RCb3hGaW5kU3RyaW5nKGh3bmQsIHdQYXJhbSwKLQkJCSAgIChMUFNUUilQVFJfU0VHX1RPX0xJTihsUGFyYW0pKTsKKyAgTFBIRUFETElTVCBscGhsID0gTGlzdEJveEdldFN0b3JhZ2VIZWFkZXIoaHduZCk7CisgIHJldHVybiBMaXN0Qm94RmluZFN0cmluZyhscGhsLCB3UGFyYW0sIGxQYXJhbSk7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIExCR2V0Q2FyZXRJbmRleAogICovCi1MT05HIExCR2V0Q2FyZXRJbmRleCggSFdORCBod25kLCBXT1JEIG1lc3NhZ2UsIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSApCi0KK3N0YXRpYyBMT05HIExCR2V0Q2FyZXRJbmRleChIV05EIGh3bmQsIFdPUkQgbWVzc2FnZSwgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtKQogewotICBMUEhFQURMSVNUICBscGhsOwotCi0gIGxwaGwgPSBMaXN0Qm94R2V0U3RvcmFnZUhlYWRlcihod25kKTsKLSAgaWYgKGxwaGwgPT0gTlVMTCkgcmV0dXJuIExCX0VSUjsKLQorICBMUEhFQURMSVNUIGxwaGwgPSBMaXN0Qm94R2V0U3RvcmFnZUhlYWRlcihod25kKTsKICAgcmV0dXJuIGxwaGwtPkl0ZW1Gb2N1c2VkOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBMQkdldENvdW50CiAgKi8KLUxPTkcgTEJHZXRDb3VudCggSFdORCBod25kLCBXT1JEIG1lc3NhZ2UsIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSApCi0KK3N0YXRpYyBMT05HIExCR2V0Q291bnQoSFdORCBod25kLCBXT1JEIG1lc3NhZ2UsIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSkKIHsKICAgTFBIRUFETElTVCAgbHBobDsKIApAQCAtODE1LDggKzE0MTUsNyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgTEJHZXRDdXJTZWwKICAqLwotTE9ORyBMQkdldEN1clNlbCggSFdORCBod25kLCBXT1JEIG1lc3NhZ2UsIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSApCi0KK3N0YXRpYyBMT05HIExCR2V0Q3VyU2VsKEhXTkQgaHduZCwgV09SRCBtZXNzYWdlLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0pCiB7CiAgIExQSEVBRExJU1QgIGxwaGw7CiAKQEAgLTgyOSw3MyArMTQyOCw1NiBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgTEJHZXRIb3Jpem9udGFsRXh0ZW50CiAgKi8KLUxPTkcgTEJHZXRIb3Jpem9udGFsRXh0ZW50KCBIV05EIGh3bmQsIFdPUkQgbWVzc2FnZSwgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtICkKLQorc3RhdGljIExPTkcgTEJHZXRIb3Jpem9udGFsRXh0ZW50KEhXTkQgaHduZCwgV09SRCBtZXNzYWdlLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0pCiB7ICAgIAogICByZXR1cm4gMDsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgTEJHZXRJdGVtRGF0YQotICovCi1MT05HIExCR2V0SXRlbURhdGEoIEhXTkQgaHduZCwgV09SRCBtZXNzYWdlLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0gKQotCi17Ci0gICAgZHByaW50Zl9saXN0Ym94KHN0ZGRlYiwgIkxCX0dFVElURU1EQVRBIHdQYXJhbT0leFxuIiwgd1BhcmFtKTsKLSAgICByZXR1cm4gTGlzdEJveEdldFRleHQoaHduZCwgd1BhcmFtLAotCQkJICAoTFBTVFIpUFRSX1NFR19UT19MSU4obFBhcmFtKSwgVFJVRSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIExCR2V0SXRlbUhlaWdodAogICovCi1MT05HIExCR2V0SXRlbUhlaWdodCggSFdORCBod25kLCBXT1JEIG1lc3NhZ2UsIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSApCi0KK3N0YXRpYyBMT05HIExCR2V0SXRlbUhlaWdodChIV05EIGh3bmQsIFdPUkQgbWVzc2FnZSwgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtKQogewotICBSRUNUICAgcmVjdDsKLQotICBMaXN0Qm94R2V0SXRlbVJlY3QoaHduZCwgd1BhcmFtLCAmcmVjdCk7Ci0gIHJldHVybiAocmVjdC5ib3R0b20gLSByZWN0LnRvcCk7CisgIExQSEVBRExJU1QgbHBobCA9IExpc3RCb3hHZXRTdG9yYWdlSGVhZGVyKGh3bmQpOworICBMUExJU1RTVFJVQ1QgbHBscyA9IExpc3RCb3hHZXRJdGVtIChscGhsLCB3UGFyYW0pOworICAKKyAgaWYgKGxwbHMgPT0gTlVMTCkgcmV0dXJuIExCX0VSUjsKKyAgcmV0dXJuIGxwbHMtPm1pcy5pdGVtSGVpZ2h0OwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBMQkdldEl0ZW1SZWN0CiAgKi8KLUxPTkcgTEJHZXRJdGVtUmVjdCggSFdORCBod25kLCBXT1JEIG1lc3NhZ2UsIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSApCi0KK3N0YXRpYyBMT05HIExCR2V0SXRlbVJlY3QoSFdORCBod25kLCBXT1JEIG1lc3NhZ2UsIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSkKIHsKLSAgcmV0dXJuIExpc3RCb3hHZXRJdGVtUmVjdCAoaHduZCwgd1BhcmFtLCBQVFJfU0VHX1RPX0xJTihsUGFyYW0pKTsKKyAgTFBIRUFETElTVCBscGhsID0gTGlzdEJveEdldFN0b3JhZ2VIZWFkZXIoaHduZCk7CisgIHJldHVybiBMaXN0Qm94R2V0SXRlbVJlY3QobHBobCwgd1BhcmFtLCBQVFJfU0VHX1RPX0xJTihsUGFyYW0pKTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgTEJHZXRTZWwKICAqLwotTE9ORyBMQkdldFNlbCggSFdORCBod25kLCBXT1JEIG1lc3NhZ2UsIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSApCi0KK3N0YXRpYyBMT05HIExCR2V0U2VsKEhXTkQgaHduZCwgV09SRCBtZXNzYWdlLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0pCiB7Ci0gIHJldHVybiBMaXN0Qm94R2V0U2VsIChod25kLCB3UGFyYW0pOworICBMUEhFQURMSVNUIGxwaGwgPSBMaXN0Qm94R2V0U3RvcmFnZUhlYWRlcihod25kKTsKKyAgcmV0dXJuIExpc3RCb3hHZXRTZWwobHBobCwgd1BhcmFtKTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgTEJHZXRTZWxDb3VudAogICovCi1MT05HIExCR2V0U2VsQ291bnQoIEhXTkQgaHduZCwgV09SRCBtZXNzYWdlLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0gKQotCitzdGF0aWMgTE9ORyBMQkdldFNlbENvdW50KEhXTkQgaHduZCwgV09SRCBtZXNzYWdlLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0pCiB7Ci0gIExQSEVBRExJU1QgICBscGhsOworICBMUEhFQURMSVNUIGxwaGwgPSBMaXN0Qm94R2V0U3RvcmFnZUhlYWRlcihod25kKTsKICAgTFBMSVNUU1RSVUNUIGxwbHM7CiAgIGludCAgICAgICAgICBjbnQgPSAwOwotICBXTkQgICAgICAgICp3bmRQdHI7CiAKLSAgbHBobCA9IExpc3RCb3hHZXRXaW5kb3dBbmRTdG9yYWdlKGh3bmQsICZ3bmRQdHIpOwotICBpZiAobHBobCA9PSBOVUxMKSByZXR1cm4gTEJfRVJSOwotCi0gIGlmICghKHduZFB0ci0+ZHdTdHlsZSAmIExCU19NVUxUSVBMRVNFTCkpIHJldHVybiBMQl9FUlI7CisgIGlmICghKGxwaGwtPmR3U3R5bGUgJiBMQlNfTVVMVElQTEVTRUwpKSByZXR1cm4gTEJfRVJSOwogCiAgIGxwbHMgPSBscGhsLT5scEZpcnN0OwogCiAgIHdoaWxlIChscGxzICE9IE5VTEwpIHsKLSAgICBpZiAobHBscy0+ZGlzLml0ZW1TdGF0ZSA+IDApIGNudCsrOworICAgIGlmIChscGxzLT5pdGVtU3RhdGUgPiAwKSBjbnQrKzsKIAogICAgIGxwbHMgPSBscGxzLT5scE5leHQ7CiAgIH0KQEAgLTkwNiwxOSArMTQ4OCwxNCBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgTEJHZXRTZWxJdGVtcwogICovCi1MT05HIExCR2V0U2VsSXRlbXMoIEhXTkQgaHduZCwgV09SRCBtZXNzYWdlLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0gKQotCitzdGF0aWMgTE9ORyBMQkdldFNlbEl0ZW1zKEhXTkQgaHduZCwgV09SRCBtZXNzYWdlLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0pCiB7Ci0gIExQSEVBRExJU1QgICBscGhsOworICBMUEhFQURMSVNUICBscGhsID0gTGlzdEJveEdldFN0b3JhZ2VIZWFkZXIoaHduZCk7CiAgIExQTElTVFNUUlVDVCBscGxzOwotICBpbnQgICAgICAgICAgY250LCBpZHg7Ci0gIFdORCAgICAgICAgICp3bmRQdHI7Ci0gIGludCAgICAgICAgICpscEl0ZW1zID0gUFRSX1NFR19UT19MSU4obFBhcmFtKTsKKyAgaW50IGNudCwgaWR4OworICBpbnQgKmxwSXRlbXMgPSBQVFJfU0VHX1RPX0xJTihsUGFyYW0pOwogCi0gIGxwaGwgPSBMaXN0Qm94R2V0V2luZG93QW5kU3RvcmFnZShod25kLCAmd25kUHRyKTsKLSAgaWYgKGxwaGwgPT0gTlVMTCkgcmV0dXJuIExCX0VSUjsKLQotICBpZiAoISh3bmRQdHItPmR3U3R5bGUgJiBMQlNfTVVMVElQTEVTRUwpKSByZXR1cm4gTEJfRVJSOworICBpZiAoIShscGhsLT5kd1N0eWxlICYgTEJTX01VTFRJUExFU0VMKSkgcmV0dXJuIExCX0VSUjsKIAogICBpZiAod1BhcmFtID09IDApIHJldHVybiAwOwogCkBAIC05MjYsNyArMTUwMyw3IEBACiAgIGNudCA9IDA7IGlkeCA9IDA7CiAKICAgd2hpbGUgKGxwbHMgIT0gTlVMTCkgewotICAgIGlmIChscGxzLT5kaXMuaXRlbVN0YXRlID4gMCkgbHBJdGVtc1tjbnQrK10gPSBpZHg7CisgICAgaWYgKGxwbHMtPml0ZW1TdGF0ZSA+IDApIGxwSXRlbXNbY250KytdID0gaWR4OwogCiAgICAgaWYgKGNudCA9PSB3UGFyYW0pIGJyZWFrOwogICAgIGlkeCsrOwpAQCAtOTM5LDY1ICsxNTE2LDQzIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBMQkdldFRleHRMZW4KICAqLwotTE9ORyBMQkdldFRleHRMZW4oIEhXTkQgaHduZCwgV09SRCBtZXNzYWdlLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0gKQotCitzdGF0aWMgTE9ORyBMQkdldFRleHRMZW4oSFdORCBod25kLCBXT1JEIG1lc3NhZ2UsIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSkKIHsKLSAgTFBIRUFETElTVCAgIGxwaGw7Ci0gIExQTElTVFNUUlVDVCBscGxzOwotICBXTkQgICAgICAgICAqd25kUHRyOwotICBpbnQgICAgICAgICAgY250ID0gMDsKKyAgTFBIRUFETElTVCAgIGxwaGwgPSBMaXN0Qm94R2V0U3RvcmFnZUhlYWRlcihod25kKTsKKyAgTFBMSVNUU1RSVUNUIGxwbHMgPSBMaXN0Qm94R2V0SXRlbShscGhsLHdQYXJhbSk7CiAKLSAgbHBobCA9IExpc3RCb3hHZXRXaW5kb3dBbmRTdG9yYWdlKGh3bmQsICZ3bmRQdHIpOwotICBpZiAobHBobCA9PSBOVUxMKSByZXR1cm4gTEJfRVJSOwotCi0gIGlmICghSGFzU3RyaW5ncyh3bmRQdHIpKSByZXR1cm4gTEJfRVJSOwotCi0gIGlmICh3UGFyYW0gPj0gbHBobC0+SXRlbXNDb3VudCkgcmV0dXJuIExCX0VSUjsKLSAgICAKLSAgbHBscyA9IGxwaGwtPmxwRmlyc3Q7Ci0KLSAgd2hpbGUgKGNudCsrIDwgd1BhcmFtKSBscGxzID0gbHBscy0+bHBOZXh0OwotICAKKyAgaWYgKGxwbHMgPT0gTlVMTCB8fCAhSGFzU3RyaW5ncyhscGhsKSkgcmV0dXJuIExCX0VSUjsKICAgcmV0dXJuIHN0cmxlbihscGxzLT5pdGVtVGV4dCk7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIExCR2V0RGxnQ29kZQogICovCi1MT05HIExCR2V0RGxnQ29kZSggSFdORCBod25kLCBXT1JEIG1lc3NhZ2UsIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSApCi0KK3N0YXRpYyBMT05HIExCR2V0RGxnQ29kZShIV05EIGh3bmQsIFdPUkQgbWVzc2FnZSwgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtKQogewotICByZXR1cm4gRExHQ19XQU5UQUxMS0VZUzsKKyAgcmV0dXJuIERMR0NfV0FOVEFSUk9XUyB8IERMR0NfV0FOVENIQVJTOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBMQkdldFRvcEluZGV4CiAgKi8KLUxPTkcgTEJHZXRUb3BJbmRleCggSFdORCBod25kLCBXT1JEIG1lc3NhZ2UsIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSApCi0KK3N0YXRpYyBMT05HIExCR2V0VG9wSW5kZXgoSFdORCBod25kLCBXT1JEIG1lc3NhZ2UsIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSkKIHsKLSAgTFBIRUFETElTVCBscGhsOworICBMUEhFQURMSVNUIGxwaGwgPSBMaXN0Qm94R2V0U3RvcmFnZUhlYWRlcihod25kKTsKIAotICBscGhsID0gTGlzdEJveEdldFN0b3JhZ2VIZWFkZXIoaHduZCk7Ci0gIGlmIChscGhsID09IE5VTEwpIHJldHVybiBMQl9FUlI7Ci0KLSAgcmV0dXJuIChscGhsLT5GaXJzdFZpc2libGUgLSAxKTsKKyAgcmV0dXJuIGxwaGwtPkZpcnN0VmlzaWJsZTsKIH0KIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBMQlNlbGVjdFN0cmluZwogICovCi1MT05HIExCU2VsZWN0U3RyaW5nKCBIV05EIGh3bmQsIFdPUkQgbWVzc2FnZSwgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtICkKLQorc3RhdGljIExPTkcgTEJTZWxlY3RTdHJpbmcoSFdORCBod25kLCBXT1JEIG1lc3NhZ2UsIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSkKIHsKLSAgV05EICAqd25kUHRyOworICBMUEhFQURMSVNUIGxwaGwgPSBMaXN0Qm94R2V0U3RvcmFnZUhlYWRlcihod25kKTsKICAgV09SRCAgd1JldDsKIAotICB3bmRQdHIgPSBXSU5fRmluZFduZFB0cihod25kKTsKLQotICB3UmV0ID0gTGlzdEJveEZpbmRTdHJpbmcoaHduZCwgd1BhcmFtLAotCQkJICAgKExQU1RSKVBUUl9TRUdfVE9fTElOKGxQYXJhbSkpOworICB3UmV0ID0gTGlzdEJveEZpbmRTdHJpbmcobHBobCwgd1BhcmFtLCBsUGFyYW0pOwogCiAgIC8qIFhYWCBhZGQgZnVuY3Rpb25hbGl0eSBoZXJlICovCiAKQEAgLTEwMDcsMjEgKzE1NjIsMTYgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIExCU2VsSXRlbVJhbmdlCiAgKi8KLUxPTkcgTEJTZWxJdGVtUmFuZ2UoIEhXTkQgaHduZCwgV09SRCBtZXNzYWdlLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0gKQotCitzdGF0aWMgTE9ORyBMQlNlbEl0ZW1SYW5nZShIV05EIGh3bmQsIFdPUkQgbWVzc2FnZSwgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtKQogewotICBMUEhFQURMSVNUICAgbHBobDsKKyAgTFBIRUFETElTVCAgIGxwaGwgPSBMaXN0Qm94R2V0U3RvcmFnZUhlYWRlcihod25kKTsKICAgTFBMSVNUU1RSVUNUIGxwbHM7Ci0gIFdORCAgICAgICAgICp3bmRQdHI7CiAgIFdPUkQgICAgICAgICBjbnQ7CiAgIFdPUkQgICAgICAgICBmaXJzdCA9IExPV09SRChsUGFyYW0pOwogICBXT1JEICAgICAgICAgbGFzdCA9IEhJV09SRChsUGFyYW0pOwogICBCT09MICAgICAgICAgc2VsZWN0ID0gd1BhcmFtOwogCi0gIGxwaGwgPSBMaXN0Qm94R2V0V2luZG93QW5kU3RvcmFnZShod25kLCAmd25kUHRyKTsKLSAgaWYgKGxwaGwgPT0gTlVMTCkgcmV0dXJuIExCX0VSUjsKLQotICBpZiAoISh3bmRQdHItPmR3U3R5bGUgJiBMQlNfTVVMVElQTEVTRUwpKSByZXR1cm4gTEJfRVJSOworICBpZiAoIShscGhsLT5kd1N0eWxlICYgTEJTX01VTFRJUExFU0VMKSkgcmV0dXJuIExCX0VSUjsKIAogICBpZiAoZmlyc3QgPj0gbHBobC0+SXRlbXNDb3VudCB8fAogICAgICAgbGFzdCA+PSBscGhsLT5JdGVtc0NvdW50KSByZXR1cm4gTEJfRVJSOwpAQCAtMTAzMSw3ICsxNTgxLDcgQEAKIAogICB3aGlsZSAobHBscyAhPSBOVUxMKSB7CiAgICAgaWYgKGNudCsrID49IGZpcnN0KQotICAgICAgbHBscy0+ZGlzLml0ZW1TdGF0ZSA9IHNlbGVjdCA/IE9EU19TRUxFQ1RFRCA6IDA7CisgICAgICBscGxzLT5pdGVtU3RhdGUgPSBzZWxlY3QgPyBPRFNfU0VMRUNURUQgOiAwOwogCiAgICAgaWYgKGNudCA+IGxhc3QpCiAgICAgICBicmVhazsKQEAgLTEwNDUsNjYgKzE1OTUsNjQgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIExCU2V0Q2FyZXRJbmRleAogICovCi1MT05HIExCU2V0Q2FyZXRJbmRleCggSFdORCBod25kLCBXT1JEIG1lc3NhZ2UsIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSApCi0KK3N0YXRpYyBMT05HIExCU2V0Q2FyZXRJbmRleChIV05EIGh3bmQsIFdPUkQgbWVzc2FnZSwgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtKQogewotICBMUEhFQURMSVNUICAgbHBobDsKLSAgV05EICAgICAgICAgKnduZFB0cjsKKyAgTFBIRUFETElTVCBscGhsID0gTGlzdEJveEdldFN0b3JhZ2VIZWFkZXIoaHduZCk7CiAKLSAgbHBobCA9IExpc3RCb3hHZXRXaW5kb3dBbmRTdG9yYWdlKGh3bmQsICZ3bmRQdHIpOwotICBpZiAobHBobCA9PSBOVUxMKSByZXR1cm4gTEJfRVJSOwotCi0gIGlmICghKHduZFB0ci0+ZHdTdHlsZSAmIExCU19NVUxUSVBMRVNFTCkpIHJldHVybiAwOworICBpZiAoIShscGhsLT5kd1N0eWxlICYgTEJTX01VTFRJUExFU0VMKSkgcmV0dXJuIDA7CiAgIGlmICh3UGFyYW0gPj0gbHBobC0+SXRlbXNDb3VudCkgcmV0dXJuIExCX0VSUjsKIAogICBscGhsLT5JdGVtRm9jdXNlZCA9IHdQYXJhbTsKLSAgTGlzdEJveFNjcm9sbHRvRm9jdXMgKGh3bmQpOworICBMaXN0Qm94U2Nyb2xsVG9Gb2N1cyAobHBobCk7CiAKICAgU2V0U2Nyb2xsUG9zKGh3bmQsIFNCX1ZFUlQsIGxwaGwtPkZpcnN0VmlzaWJsZSwgVFJVRSk7CiAgIEludmFsaWRhdGVSZWN0KGh3bmQsIE5VTEwsIFRSVUUpOwotICBVcGRhdGVXaW5kb3coaHduZCk7CiAgIHJldHVybiAwOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBMQlNldENvbHVtbldpZHRoCiAgKi8KLUxPTkcgTEJTZXRDb2x1bW5XaWR0aCggSFdORCBod25kLCBXT1JEIG1lc3NhZ2UsIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSApCi0KK3N0YXRpYyBMT05HIExCU2V0Q29sdW1uV2lkdGgoSFdORCBod25kLCBXT1JEIG1lc3NhZ2UsIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSkKIHsKLSAgTFBIRUFETElTVCAgIGxwaGw7Ci0KLSAgbHBobCA9IExpc3RCb3hHZXRTdG9yYWdlSGVhZGVyKGh3bmQpOwotICBpZiAobHBobCA9PSBOVUxMKSByZXR1cm4gTEJfRVJSOworICBMUEhFQURMSVNUIGxwaGwgPSBMaXN0Qm94R2V0U3RvcmFnZUhlYWRlcihod25kKTsKICAgbHBobC0+Q29sdW1uc1dpZHRoID0gd1BhcmFtOwotCisgIEludmFsaWRhdGVSZWN0KGh3bmQsTlVMTCxUUlVFKTsKICAgcmV0dXJuIDA7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIExCU2V0SG9yaXpvbnRhbEV4dGVudAogICovCi1MT05HIExCU2V0SG9yaXpvbnRhbEV4dGVudCggSFdORCBod25kLCBXT1JEIG1lc3NhZ2UsIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSApCi0KK3N0YXRpYyBMT05HIExCU2V0SG9yaXpvbnRhbEV4dGVudChIV05EIGh3bmQsIFdPUkQgbWVzc2FnZSwgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtKQogewogICByZXR1cm4gMDsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgTEJHZXRJdGVtRGF0YQorICovCitzdGF0aWMgTE9ORyBMQkdldEl0ZW1EYXRhKEhXTkQgaHduZCwgV09SRCBtZXNzYWdlLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0pCit7CisgIExQSEVBRExJU1QgbHBobCA9IExpc3RCb3hHZXRTdG9yYWdlSGVhZGVyKGh3bmQpOworICBkcHJpbnRmX2xpc3Rib3goc3RkZGViLCAiTEJfR0VUSVRFTURBVEEgd1BhcmFtPSV4XG4iLCB3UGFyYW0pOworICByZXR1cm4gTGlzdEJveEdldEl0ZW1EYXRhKGxwaGwsIHdQYXJhbSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIExCU2V0SXRlbURhdGEKICAqLwotTE9ORyBMQlNldEl0ZW1EYXRhKCBIV05EIGh3bmQsIFdPUkQgbWVzc2FnZSwgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtICkKLQorc3RhdGljIExPTkcgTEJTZXRJdGVtRGF0YShIV05EIGh3bmQsIFdPUkQgbWVzc2FnZSwgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtKQogeworICBMUEhFQURMSVNUIGxwaGwgPSBMaXN0Qm94R2V0U3RvcmFnZUhlYWRlcihod25kKTsKICAgZHByaW50Zl9saXN0Ym94KHN0ZGRlYiwgIkxCX1NFVElURU1EQVRBICB3UGFyYW09JXggIGxQYXJhbT0lbHhcbiIsIHdQYXJhbSwgbFBhcmFtKTsKLSAgcmV0dXJuIExpc3RCb3hTZXRJdGVtRGF0YShod25kLCB3UGFyYW0sIGxQYXJhbSk7CisgIHJldHVybiBMaXN0Qm94U2V0SXRlbURhdGEobHBobCwgd1BhcmFtLCBsUGFyYW0pOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBMQlNldFRhYlN0b3BzCiAgKi8KLUxPTkcgTEJTZXRUYWJTdG9wcyggSFdORCBod25kLCBXT1JEIG1lc3NhZ2UsIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSApCi0KK3N0YXRpYyBMT05HIExCU2V0VGFiU3RvcHMoSFdORCBod25kLCBXT1JEIG1lc3NhZ2UsIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSkKIHsKICAgTFBIRUFETElTVCAgbHBobDsKIApAQCAtMTEyOCwyMyArMTY3NiwxOCBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgTEJTZXRDdXJTZWwKICAqLwotTE9ORyBMQlNldEN1clNlbCggSFdORCBod25kLCBXT1JEIG1lc3NhZ2UsIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSApCi0KK3N0YXRpYyBMT05HIExCU2V0Q3VyU2VsKEhXTkQgaHduZCwgV09SRCBtZXNzYWdlLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0pCiB7Ci0gIExQSEVBRExJU1QgIGxwaGw7CisgIExQSEVBRExJU1QgbHBobCA9IExpc3RCb3hHZXRTdG9yYWdlSGVhZGVyKGh3bmQpOwogICBXT1JEICB3UmV0OwogCi0gIGxwaGwgPSBMaXN0Qm94R2V0U3RvcmFnZUhlYWRlcihod25kKTsKLSAgaWYgKGxwaGwgPT0gTlVMTCkgcmV0dXJuIExCX0VSUjsgCi0KICAgZHByaW50Zl9saXN0Ym94KHN0ZGRlYiwiTGlzdEJveCBMQl9TRVRDVVJTRUwgd1BhcmFtPSV4ICFcbiIsIAogCQkgIHdQYXJhbSk7CiAKLSAgd1JldCA9IExpc3RCb3hTZXRDdXJTZWwoaHduZCwgd1BhcmFtKTsKKyAgd1JldCA9IExpc3RCb3hTZXRDdXJTZWwobHBobCwgd1BhcmFtKTsKIAogICBTZXRTY3JvbGxQb3MoaHduZCwgU0JfVkVSVCwgbHBobC0+Rmlyc3RWaXNpYmxlLCBUUlVFKTsKICAgSW52YWxpZGF0ZVJlY3QoaHduZCwgTlVMTCwgVFJVRSk7Ci0gIFVwZGF0ZVdpbmRvdyhod25kKTsKIAogICByZXR1cm4gd1JldDsKIH0KQEAgLTExNTIsMTYgKzE2OTUsMTUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIExCU2V0U2VsCiAgKi8KLUxPTkcgTEJTZXRTZWwoIEhXTkQgaHduZCwgV09SRCBtZXNzYWdlLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0gKQotCitzdGF0aWMgTE9ORyBMQlNldFNlbChIV05EIGh3bmQsIFdPUkQgbWVzc2FnZSwgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtKQogeworICBMUEhFQURMSVNUIGxwaGwgPSBMaXN0Qm94R2V0U3RvcmFnZUhlYWRlcihod25kKTsKICAgV09SRCB3UmV0OwogCiAgIGRwcmludGZfbGlzdGJveChzdGRkZWIsIkxpc3RCb3ggTEJfU0VUU0VMIHdQYXJhbT0leCBsUGFyYW09JWxYICFcbiIsIHdQYXJhbSwgbFBhcmFtKTsKIAotICB3UmV0ID0gTGlzdEJveFNldFNlbChod25kLCBMT1dPUkQobFBhcmFtKSwgd1BhcmFtKTsKKyAgd1JldCA9IExpc3RCb3hTZXRTZWwobHBobCwgTE9XT1JEKGxQYXJhbSksIHdQYXJhbSk7CiAgIEludmFsaWRhdGVSZWN0KGh3bmQsIE5VTEwsIFRSVUUpOwotICBVcGRhdGVXaW5kb3coaHduZCk7CiAKICAgcmV0dXJuIHdSZXQ7CiB9CkBAIC0xMTY5LDE5ICsxNzExLDE2IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBMQlNldFRvcEluZGV4CiAgKi8KLUxPTkcgTEJTZXRUb3BJbmRleCggSFdORCBod25kLCBXT1JEIG1lc3NhZ2UsIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSApCi0KK3N0YXRpYyBMT05HIExCU2V0VG9wSW5kZXgoSFdORCBod25kLCBXT1JEIG1lc3NhZ2UsIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSkKIHsKLSAgTFBIRUFETElTVCBscGhsOworICBMUEhFQURMSVNUIGxwaGwgPSBMaXN0Qm94R2V0U3RvcmFnZUhlYWRlcihod25kKTsKIAogICBkcHJpbnRmX2xpc3Rib3goc3RkZGViLCJMaXN0Qm94IExCX1NFVFRPUElOREVYIHdQYXJhbT0leCAhXG4iLAogCQkgIHdQYXJhbSk7Ci0gIGxwaGwgPSBMaXN0Qm94R2V0U3RvcmFnZUhlYWRlcihod25kKTsKICAgbHBobC0+Rmlyc3RWaXNpYmxlID0gd1BhcmFtOwogICBTZXRTY3JvbGxQb3MoaHduZCwgU0JfVkVSVCwgbHBobC0+Rmlyc3RWaXNpYmxlLCBUUlVFKTsKIAogICBJbnZhbGlkYXRlUmVjdChod25kLCBOVUxMLCBUUlVFKTsKLSAgVXBkYXRlV2luZG93KGh3bmQpOwogCiAgIHJldHVybiAwOwogfQpAQCAtMTE4OSwyMyArMTcyOCwyMSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgTEJTZXRJdGVtSGVpZ2h0CiAgKi8KLUxPTkcgTEJTZXRJdGVtSGVpZ2h0KCBIV05EIGh3bmQsIFdPUkQgbWVzc2FnZSwgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtKQotCitzdGF0aWMgTE9ORyBMQlNldEl0ZW1IZWlnaHQoSFdORCBod25kLCBXT1JEIG1lc3NhZ2UsIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSkKIHsKLSAgV09SRCAgd1JldDsKLQorICBMUEhFQURMSVNUIGxwaGwgPSBMaXN0Qm94R2V0U3RvcmFnZUhlYWRlcihod25kKTsKKyAgV09SRCB3UmV0OworICAKICAgZHByaW50Zl9saXN0Ym94KHN0ZGRlYiwiTGlzdEJveCBMQl9TRVRJVEVNSEVJR0hUIHdQYXJhbT0leCBsUGFyYW09JWxYICFcbiIsIHdQYXJhbSwgbFBhcmFtKTsKLSAgd1JldCA9IExpc3RCb3hTZXRJdGVtSGVpZ2h0KGh3bmQsIHdQYXJhbSwgbFBhcmFtKTsKKyAgd1JldCA9IExpc3RCb3hTZXRJdGVtSGVpZ2h0KGxwaGwsIHdQYXJhbSwgbFBhcmFtKTsKKyAgSW52YWxpZGF0ZVJlY3QoaHduZCxOVUxMLFRSVUUpOwogICByZXR1cm4gd1JldDsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBMaXN0Qm94V25kUHJvYyAKICAqLwotCi1MT05HIExpc3RCb3hXbmRQcm9jKCBIV05EIGh3bmQsIFdPUkQgbWVzc2FnZSwgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtICkKLQorTE9ORyBMaXN0Qm94V25kUHJvYyhIV05EIGh3bmQsIFdPUkQgbWVzc2FnZSwgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtKQogeyAKICAgaW50IGlkeCA9IDA7CiAgIGludCB0YWJsZV9zaXplID0gc2l6ZW9mIChtZXRob2RzKSAvIHNpemVvZiAobXNnX3RibCk7CkBAIC0xMjE5LDg2MCArMTc1Niw2IEBACiAgIHJldHVybiBEZWZXaW5kb3dQcm9jIChod25kLCBtZXNzYWdlLCB3UGFyYW0sIGxQYXJhbSk7CiB9CiAKLQotTFBMSVNUU1RSVUNUIExpc3RCb3hHZXRJdGVtKEhXTkQgaHduZCwgVUlOVCB1SW5kZXgpCi0KLXsKLSAgTFBIRUFETElTVCBscGhsID0gTGlzdEJveEdldFN0b3JhZ2VIZWFkZXIoaHduZCk7Ci0gIExQTElTVFNUUlVDVCBscGxzOwotICBVSU5UICAgICAgICAgQ291bnQgPSAwOwotCi0gIGlmICh1SW5kZXggPj0gbHBobC0+SXRlbXNDb3VudCkgcmV0dXJuIE5VTEw7Ci0KLSAgbHBscyA9IGxwaGwtPmxwRmlyc3Q7Ci0KLSAgd2hpbGUgKENvdW50KysgPCB1SW5kZXgpIGxwbHMgPSBscGxzLT5scE5leHQ7Ci0KLSAgcmV0dXJuIGxwbHM7Ci19Ci0KLSAKLUxQSEVBRExJU1QgTGlzdEJveEdldFdpbmRvd0FuZFN0b3JhZ2UoSFdORCBod25kLCBXTkQgKip3bmRQdHIpCi17Ci0gICAgV05EICAqUHRyOwotICAgIExQSEVBRExJU1QgbHBobDsKLSAgICAqKHduZFB0cikgPSBQdHIgPSBXSU5fRmluZFduZFB0cihod25kKTsKLSAgICBscGhsID0gKigoTFBIRUFETElTVCAqKSZQdHItPndFeHRyYVsxXSk7Ci0gICAgcmV0dXJuIGxwaGw7Ci19Ci0KLQotTFBIRUFETElTVCBMaXN0Qm94R2V0U3RvcmFnZUhlYWRlcihIV05EIGh3bmQpCi17Ci0gICAgV05EICAqd25kUHRyOwotICAgIExQSEVBRExJU1QgbHBobDsKLSAgICB3bmRQdHIgPSBXSU5fRmluZFduZFB0cihod25kKTsKLSAgICBscGhsID0gKigoTFBIRUFETElTVCAqKSZ3bmRQdHItPndFeHRyYVsxXSk7Ci0gICAgcmV0dXJuIGxwaGw7Ci19Ci0KLQotdm9pZCBMaXN0Qm94RHJhd0l0ZW0gKEhXTkQgaHduZCwgSERDIGhkYywgTFBMSVNUU1RSVUNUIGxwbHMsCi0JCSAgICAgIFdPUkQgaXRlbUFjdGlvbiwgV09SRCBpdGVtU3RhdGUpCi0KLXsKLSAgTFBIRUFETElTVCAgbHBobDsKLSAgV05EICAgICAgICAqd25kUHRyOwotCi0gIGxwaGwgPSBMaXN0Qm94R2V0V2luZG93QW5kU3RvcmFnZShod25kLCAmd25kUHRyKTsKLQotICBpZiAoT1dORVJfRFJBV04od25kUHRyKSkgewotICAgIERSQVdJVEVNU1RSVUNUICAgKmRpcyA9IFVTRVJfSEVBUF9MSU5fQUREUihscGhsLT5oRHJhd0l0ZW1TdHJ1Y3QpOwotCi0gICAgbWVtY3B5IChkaXMsICZscGxzLT5kaXMsIHNpemVvZihEUkFXSVRFTVNUUlVDVCkpOwotCi0gICAgZGlzLT5DdGxUeXBlICA9IE9EVF9MSVNUQk9YOwotICAgIGRpcy0+aERDICAgICAgPSBoZGM7Ci0KLSAgICBpZiAoKCFkaXMtPkN0bElEKSAmJiBscGhsLT5oV25kTG9naWNQYXJlbnQpIHsKLSAgICAgIFdORCAgICpQYXJlbnRXbmRQdHI7Ci0KLSAgICAgIFBhcmVudFduZFB0ciA9IFdJTl9GaW5kV25kUHRyKGxwaGwtPmhXbmRMb2dpY1BhcmVudCk7Ci0gICAgICBkaXMtPkN0bElEICAgPSBQYXJlbnRXbmRQdHItPndJRG1lbnU7Ci0gICAgfQotCi0gICAgaWYgKEhhc1N0cmluZ3Mod25kUHRyKSkgZGlzLT5pdGVtRGF0YSA9IExJU1RfSEVBUF9TRUdfQUREUihscGxzLGxwbHMtPmhEYXRhKTsKLSAgIAotICAgIGRpcy0+aXRlbUFjdGlvbiA9IGl0ZW1BY3Rpb247Ci0gICAgZGlzLT5pdGVtU3RhdGUgID0gaXRlbVN0YXRlOwotCi0gICAgU2VuZE1lc3NhZ2UobHBobC0+aFduZExvZ2ljUGFyZW50LCBXTV9EUkFXSVRFTSwgCi0JCTAsIChMUEFSQU0pVVNFUl9IRUFQX1NFR19BRERSKGxwaGwtPmhEcmF3SXRlbVN0cnVjdCkpOwotICB9IGVsc2UgewotCi0gICAgaWYgKGl0ZW1BY3Rpb24gPT0gT0RBX0RSQVdFTlRJUkUgfHwKLQlpdGVtQWN0aW9uID09IE9EQV9TRUxFQ1QpIHsKLSAgICAgIGludCAJT2xkQmtNb2RlOwotICAgICAgRFdPUkQgCWR3T2xkVGV4dENvbG9yOwotCi0gICAgICBPbGRCa01vZGUgPSBTZXRCa01vZGUoaGRjLCBUUkFOU1BBUkVOVCk7Ci0KLSAgICAgIGlmIChpdGVtU3RhdGUgIT0gMCkgewotCWR3T2xkVGV4dENvbG9yID0gU2V0VGV4dENvbG9yKGhkYywgMHgwMEZGRkZGRkwpOwotCUZpbGxSZWN0KGhkYywgJmxwbHMtPmRpcy5yY0l0ZW0sIEdldFN0b2NrT2JqZWN0KEJMQUNLX0JSVVNIKSk7Ci0gICAgICB9Ci0KLSAgICAgIGlmICh3bmRQdHItPmR3U3R5bGUgJiBMQlNfVVNFVEFCU1RPUFMpCi0JVGFiYmVkVGV4dE91dChoZGMsIGxwbHMtPmRpcy5yY0l0ZW0ubGVmdCArIDUsIAotCQkgICAgICBscGxzLT5kaXMucmNJdGVtLnRvcCArIDIsIAotCQkgICAgICAoY2hhciAqKWxwbHMtPml0ZW1UZXh0LCAKLQkJICAgICAgc3RybGVuKChjaGFyICopbHBscy0+aXRlbVRleHQpLCBscGhsLT5pTnVtU3RvcHMsCi0JCSAgICAgIGxwaGwtPlRhYlN0b3BzLCAwKTsKLSAgICAgIGVsc2UKLQlUZXh0T3V0KGhkYywgbHBscy0+ZGlzLnJjSXRlbS5sZWZ0ICsgNSwgbHBscy0+ZGlzLnJjSXRlbS50b3AgKyAyLCAKLQkJKGNoYXIgKilscGxzLT5pdGVtVGV4dCwgc3RybGVuKChjaGFyICopbHBscy0+aXRlbVRleHQpKTsKLQotICAgICAgaWYgKGl0ZW1TdGF0ZSAhPSAwKSB7Ci0JU2V0VGV4dENvbG9yKGhkYywgZHdPbGRUZXh0Q29sb3IpOwotICAgICAgfQotICAgICAgCi0gICAgICBTZXRCa01vZGUoaGRjLCBPbGRCa01vZGUpOwotICAgIH0gZWxzZSBEcmF3Rm9jdXNSZWN0KGhkYywgJmxwbHMtPmRpcy5yY0l0ZW0pOwotICB9Ci0KLSAgcmV0dXJuOwotfQotCi12b2lkIFJlcGFpbnRMaXN0Qm94KEhXTkQgaHduZCkKLQotewotICBXTkQgCSp3bmRQdHI7Ci0gIExQSEVBRExJU1QgIGxwaGw7Ci0gIExQTElTVFNUUlVDVCBscGxzOwotICBQQUlOVFNUUlVDVCBwczsKLSAgSEJSVVNIIAloQnJ1c2g7Ci0KLSAgSERDIAloZGM7Ci0gIFJFQ1QgCXJlY3Q7Ci0gIGludCAgIGksIHRvcCwgaGVpZ2h0LCBtYXh3aWR0aCwgaXBjOwotCi0gIHRvcCA9IDA7Ci0KLSAgaGRjID0gQmVnaW5QYWludCggaHduZCwgJnBzICk7Ci0KLSAgaWYgKCFJc1dpbmRvd1Zpc2libGUoaHduZCkpIHsKLSAgICBFbmRQYWludCggaHduZCwgJnBzICk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgbHBobCA9IExpc3RCb3hHZXRXaW5kb3dBbmRTdG9yYWdlKGh3bmQsICZ3bmRQdHIpOwotICBpZiAobHBobCA9PSBOVUxMKSBnb3RvIEVuZE9mUGFpbnQ7Ci0gIGlmICghbHBobC0+YlJlZHJhd0ZsYWcpIGdvdG8gRW5kT2ZQYWludDsKLQotICBTZWxlY3RPYmplY3QoaGRjLCBscGhsLT5oRm9udCk7Ci0KLSAgaEJydXNoID0gU2VuZE1lc3NhZ2UobHBobC0+aFduZExvZ2ljUGFyZW50LCBXTV9DVExDT0xPUiwgKFdPUkQpaGRjLAotCQkgICAgICAgTUFLRUxPTkcoaHduZCwgQ1RMQ09MT1JfTElTVEJPWCkpOwotCi0gIGlmIChoQnJ1c2ggPT0gKEhCUlVTSClOVUxMKSAgaEJydXNoID0gR2V0U3RvY2tPYmplY3QoV0hJVEVfQlJVU0gpOwotCi0gIEdldENsaWVudFJlY3QoaHduZCwgJnJlY3QpOwotICBGaWxsUmVjdChoZGMsICZyZWN0LCBoQnJ1c2gpOwotCi0gIG1heHdpZHRoID0gcmVjdC5yaWdodDsKLSAgcmVjdC5yaWdodCA9IGxwaGwtPkNvbHVtbnNXaWR0aDsKLQotICBpZiAobHBobC0+SXRlbXNDb3VudCA9PSAwKSBnb3RvIEVuZE9mUGFpbnQ7Ci0KLSAgbHBscyA9IGxwaGwtPmxwRmlyc3Q7Ci0KLSAgbHBobC0+SXRlbXNWaXNpYmxlID0gMDsKLSAgbHBobC0+SXRlbXNQZXJDb2x1bW4gPSBpcGMgPSAwOwotCi0gIGZvcihpID0gMDsgaSA8IGxwaGwtPkl0ZW1zQ291bnQ7IGkrKykgewotICAgIGlmIChscGxzID09IE5VTEwpIGdvdG8gRW5kT2ZQYWludDsKLQotICAgIGlmIChpID49IGxwaGwtPkZpcnN0VmlzaWJsZSAtIDEpIHsKLSAgICAgIGhlaWdodCA9IGxwbHMtPmRpcy5yY0l0ZW0uYm90dG9tIC0gbHBscy0+ZGlzLnJjSXRlbS50b3A7Ci0KLSAgICAgIGlmICh0b3AgPiByZWN0LmJvdHRvbSkgewotCWlmICgod25kUHRyLT5kd1N0eWxlICYgTEJTX01VTFRJQ09MVU1OKSA9PSBMQlNfTVVMVElDT0xVTU4pIHsKLQkgIGxwaGwtPkl0ZW1zUGVyQ29sdW1uID0gbWF4KGxwaGwtPkl0ZW1zUGVyQ29sdW1uLCBpcGMpOwotCSAgaXBjID0gMDsKLQkgIHRvcCA9IDA7Ci0JICByZWN0LmxlZnQgKz0gbHBobC0+Q29sdW1uc1dpZHRoOwotCSAgcmVjdC5yaWdodCArPSBscGhsLT5Db2x1bW5zV2lkdGg7Ci0JICBpZiAocmVjdC5sZWZ0ID4gbWF4d2lkdGgpIGJyZWFrOwotCX0KLQllbHNlIAotCSAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAgIGxwbHMtPmRpcy5yY0l0ZW0udG9wICAgID0gdG9wOwotICAgICAgbHBscy0+ZGlzLnJjSXRlbS5ib3R0b20gPSB0b3AgKyBoZWlnaHQ7Ci0gICAgICBscGxzLT5kaXMucmNJdGVtLmxlZnQgICA9IHJlY3QubGVmdDsKLSAgICAgIGxwbHMtPmRpcy5yY0l0ZW0ucmlnaHQgID0gcmVjdC5yaWdodDsKLQotICAgICAgaWYgKE9XTkVSX0RSQVdOKHduZFB0cikpIHsKLQlMaXN0Qm94RHJhd0l0ZW0gKGh3bmQsIGhkYywgbHBscywgT0RBX0RSQVdFTlRJUkUsIDApOwotCWlmIChscGxzLT5kaXMuaXRlbVN0YXRlKQotCSAgTGlzdEJveERyYXdJdGVtIChod25kLCBoZGMsIGxwbHMsIE9EQV9TRUxFQ1QsIE9EU19TRUxFQ1RFRCk7Ci0gICAgICB9Ci0gICAgICBlbHNlIAotCUxpc3RCb3hEcmF3SXRlbSAoaHduZCwgaGRjLCBscGxzLCBPREFfRFJBV0VOVElSRSwgbHBscy0+ZGlzLml0ZW1TdGF0ZSk7Ci0KLSAgICAgIGlmICgobHBobC0+SXRlbUZvY3VzZWQgPT0gaSkgJiYgR2V0Rm9jdXMoKSA9PSBod25kKQotCUxpc3RCb3hEcmF3SXRlbSAoaHduZCwgaGRjLCBscGxzLCBPREFfRk9DVVMsIE9EU19GT0NVUyk7Ci0KLSAgICAgIHRvcCArPSBoZWlnaHQ7Ci0gICAgICBscGhsLT5JdGVtc1Zpc2libGUrKzsKLSAgICAgIGlwYysrOwotICAgIH0KLQotICAgIGxwbHMgPSBscGxzLT5scE5leHQ7Ci0gIH0KLSBFbmRPZlBhaW50OgotICBFbmRQYWludCggaHduZCwgJnBzICk7Ci19Ci0KLWludCBMaXN0Qm94RmluZE1vdXNlKEhXTkQgaHduZCwgaW50IFgsIGludCBZKQotCi17Ci0gIFdORCAJCSp3bmRQdHI7Ci0gIExQSEVBRExJU1QgCQlscGhsOwotICBMUExJU1RTVFJVQ1QJbHBsczsKLSAgUkVDVCAJCXJlY3Q7Ci0gIGludCAgICAgICAgICAgICAgICAgaSwgaCwgaDIsIHcsIHcyOwotCi0gIGxwaGwgPSBMaXN0Qm94R2V0V2luZG93QW5kU3RvcmFnZShod25kLCAmd25kUHRyKTsKLQotICBpZiAobHBobCA9PSBOVUxMKSByZXR1cm4gTEJfRVJSOwotICBpZiAobHBobC0+SXRlbXNDb3VudCA9PSAwKSByZXR1cm4gTEJfRVJSOwotCi0gIGxwbHMgPSBscGhsLT5scEZpcnN0OwotICBpZiAobHBscyA9PSBOVUxMKSByZXR1cm4gTEJfRVJSOwotICBHZXRDbGllbnRSZWN0KGh3bmQsICZyZWN0KTsKLSAgaCA9IHcyID0gMDsKLSAgdyA9IGxwaGwtPkNvbHVtbnNXaWR0aDsKLQotICBmb3IoaSA9IDE7IGkgPD0gbHBobC0+SXRlbXNDb3VudDsgaSsrKSB7Ci0gICAgaWYgKGkgPj0gbHBobC0+Rmlyc3RWaXNpYmxlKSB7Ci0gICAgICBoMiA9IGg7Ci0gICAgICBoICs9IGxwbHMtPmRpcy5yY0l0ZW0uYm90dG9tIC0gbHBscy0+ZGlzLnJjSXRlbS50b3A7Ci0gICAgICBpZiAoKFkgPiBoMikgJiYgKFkgPCBoKSAmJgotCSAgKFggPiB3MikgJiYgKFggPCB3KSkgcmV0dXJuKGkgLSAxKTsKLSAgICAgIGlmIChoID4gcmVjdC5ib3R0b20pIHsKLQlpZiAoKHduZFB0ci0+ZHdTdHlsZSAmIExCU19NVUxUSUNPTFVNTikgIT0gTEJTX01VTFRJQ09MVU1OKSByZXR1cm4gTEJfRVJSOwotCWggPSAwOwotCXcyID0gdzsKLQl3ICs9IGxwaGwtPkNvbHVtbnNXaWR0aDsKLQlpZiAodzIgPiByZWN0LnJpZ2h0KSByZXR1cm4gTEJfRVJSOwotICAgICAgfQotICAgIH0KLSAgICBpZiAobHBscy0+bHBOZXh0ID09IE5VTEwpIHJldHVybiBMQl9FUlI7Ci0gICAgbHBscyA9IChMUExJU1RTVFJVQ1QpbHBscy0+bHBOZXh0OwotICB9Ci0gIHJldHVybihMQl9FUlIpOwotfQotCi12b2lkIExpc3RCb3hBc2tNZWFzdXJlKFdORCAqd25kUHRyLCBMUEhFQURMSVNUIGxwaGwsIExQTElTVFNUUlVDVCBscGxzKSAgCi0KLXsKLSAgTUVBU1VSRUlURU1TVFJVQ1QgCSpscG1lYXN1cmU7Ci0KLSAgSEFORExFIGhUZW1wID0gVVNFUl9IRUFQX0FMTE9DKCBzaXplb2YoTUVBU1VSRUlURU1TVFJVQ1QpICk7Ci0KLSAgbHBtZWFzdXJlID0gKE1FQVNVUkVJVEVNU1RSVUNUICopIFVTRVJfSEVBUF9MSU5fQUREUihoVGVtcCk7Ci0KLSAgaWYgKGxwbWVhc3VyZSA9PSBOVUxMKSB7Ci0gICAgZnByaW50ZihzdGRlcnIsIkxpc3RCb3hBc2tNZWFzdXJlKCkgLy8gQmFkIGFsbG9jYXRpb24gb2YgTWVhc3VyZSBzdHJ1Y3QgIVxuIik7Ci0gICAgcmV0dXJuOwotICB9Ci0gCi0gIGxwbWVhc3VyZS0+Q3RsVHlwZSAgICA9IE9EVF9MSVNUQk9YOwotICBscG1lYXN1cmUtPkN0bElEICAgICAgPSB3bmRQdHItPndJRG1lbnU7Ci0gIGxwbWVhc3VyZS0+aXRlbUlEICAgICA9IGxwbHMtPmRpcy5pdGVtSUQ7Ci0gIGxwbWVhc3VyZS0+aXRlbVdpZHRoICA9IHduZFB0ci0+cmVjdFdpbmRvdy5yaWdodCAtIHduZFB0ci0+cmVjdFdpbmRvdy5sZWZ0OwotICBscG1lYXN1cmUtPml0ZW1IZWlnaHQgPSAwOwotCi0gIGlmIChIYXNTdHJpbmdzKHduZFB0cikpCi0gICAgbHBtZWFzdXJlLT5pdGVtRGF0YSA9IExJU1RfSEVBUF9TRUdfQUREUihscGxzLGxwbHMtPmhEYXRhKTsKLSAgZWxzZQotICAgIGxwbWVhc3VyZS0+aXRlbURhdGEgPSBscGxzLT5kaXMuaXRlbURhdGE7Ci0KLSAgU2VuZE1lc3NhZ2UobHBobC0+aFduZExvZ2ljUGFyZW50LCBXTV9NRUFTVVJFSVRFTSwKLQkgICAgICAwLCBVU0VSX0hFQVBfU0VHX0FERFIoaFRlbXApKTsKLQotICBpZiAod25kUHRyLT5kd1N0eWxlICYgTEJTX09XTkVSRFJBV0ZJWEVEKSB7Ci0gICAgbHBobC0+U3RkSXRlbUhlaWdodCA9IGxwbWVhc3VyZS0+aXRlbUhlaWdodDsKLSAgfQotCi0gIGxwbHMtPmRpcy5yY0l0ZW0ucmlnaHQgID0gbHBscy0+ZGlzLnJjSXRlbS5sZWZ0ICsgbHBtZWFzdXJlLT5pdGVtV2lkdGg7Ci0gIGxwbHMtPmRpcy5yY0l0ZW0uYm90dG9tID0gbHBscy0+ZGlzLnJjSXRlbS50b3AgKyBscG1lYXN1cmUtPml0ZW1IZWlnaHQ7Ci0gIFVTRVJfSEVBUF9GUkVFKGhUZW1wKTsJCQkKLX0KLQotCi1pbnQgTGlzdEJveEFkZFN0cmluZyhIV05EIGh3bmQsIExQU1RSIG5ld3N0cikKLXsKLSAgICBMUEhFQURMSVNUCWxwaGw7Ci0gICAgVUlOVAlwb3MgPSAoVUlOVCkgLTE7Ci0gICAgV05ECQkqd25kUHRyOwotICAgIAotICAgIGxwaGwgPSBMaXN0Qm94R2V0V2luZG93QW5kU3RvcmFnZShod25kLCAmd25kUHRyKTsKLSAgICBpZiAobHBobCA9PSBOVUxMKSByZXR1cm4gTEJfRVJSOwotCi0gICAgaWYgKEhhc1N0cmluZ3Mod25kUHRyKSAmJiAod25kUHRyLT5kd1N0eWxlICYgTEJTX1NPUlQpKSB7Ci0JTFBMSVNUU1RSVUNUIGxwbHMgPSBscGhsLT5scEZpcnN0OwotCWZvciAocG9zID0gMDsgbHBsczsgbHBscyA9IGxwbHMtPmxwTmV4dCwgcG9zKyspCi0JICAgIGlmIChzdHJjbXAobHBscy0+aXRlbVRleHQsIG5ld3N0cikgPj0gMCkKLQkJYnJlYWs7Ci0gICAgfQotICAgIHJldHVybiBMaXN0Qm94SW5zZXJ0U3RyaW5nKGh3bmQsIHBvcywgbmV3c3RyKTsKLX0KLQotaW50IExpc3RCb3hJbnNlcnRTdHJpbmcoSFdORCBod25kLCBVSU5UIHVJbmRleCwgTFBTVFIgbmV3c3RyKQotCi17Ci0gIFdORCAgCSAgICAgICAqd25kUHRyOwotICBMUEhFQURMSVNUIAlscGhsOwotICBMUExJU1RTVFJVQ1QgKmxwcGxzLCBscGxzbmV3OwotICBIQU5ETEUgCWhJdGVtOwotICBIQU5ETEUgCWhTdHI7Ci0gIExQU1RSCXN0cjsKLSAgVUlOVAlDb3VudDsKLSAgICAKLSAgZHByaW50Zl9saXN0Ym94KHN0ZGRlYiwiTGlzdEJveEluc2VydFN0cmluZyglMDRYLCAlZCwgJXApO1xuIiwgCi0JCSAgaHduZCwgdUluZGV4LCBuZXdzdHIpOwotICAgIAotICBscGhsID0gTGlzdEJveEdldFdpbmRvd0FuZFN0b3JhZ2UoaHduZCwgJnduZFB0cik7Ci0gIGlmIChscGhsID09IE5VTEwpIHJldHVybiBMQl9FUlI7Ci0gICAgCi0gIGlmICh1SW5kZXggPT0gKFVJTlQpLTEpCi0gICAgdUluZGV4ID0gbHBobC0+SXRlbXNDb3VudDsKLQotICBpZiAodUluZGV4ID4gbHBobC0+SXRlbXNDb3VudCkgcmV0dXJuIExCX0VSUjsKLQotICBscHBscyA9IChMUExJU1RTVFJVQ1QgKikgJmxwaGwtPmxwRmlyc3Q7Ci0gICAgCi0gIGZvcihDb3VudCA9IDA7IENvdW50IDwgdUluZGV4OyBDb3VudCsrKSB7Ci0gICAgaWYgKCpscHBscyA9PSBOVUxMKSByZXR1cm4gTEJfRVJSOwotICAgIGxwcGxzID0gKExQTElTVFNUUlVDVCAqKSAmKCpscHBscyktPmxwTmV4dDsKLSAgfQotICAgIAotICBoSXRlbSA9IExJU1RfSEVBUF9BTExPQyhscGhsLCBHTUVNX01PVkVBQkxFLCBzaXplb2YoTElTVFNUUlVDVCkpOwotICBscGxzbmV3ID0gKExQTElTVFNUUlVDVCkgTElTVF9IRUFQX0FERFIobHBobCwgaEl0ZW0pOwotCi0gIGlmIChscGxzbmV3ID09IE5VTEwpIHsKLSAgICBwcmludGYoIkxpc3RCb3hJbnNlcnRTdHJpbmcoKSAvLyBCYWQgYWxsb2NhdGlvbiBvZiBuZXcgaXRlbSAhXG4iKTsKLSAgICByZXR1cm4gTEJfRVJSU1BBQ0U7Ci0gIH0KLQotICBMaXN0Qm94RGVmYXVsdEl0ZW0oaHduZCwgd25kUHRyLCBscGhsLCBscGxzbmV3KTsKLSAgbHBsc25ldy0+aE1lbSA9IGhJdGVtOwotICBscGxzbmV3LT5scE5leHQgPSAqbHBwbHM7Ci0gICpscHBscyA9IGxwbHNuZXc7Ci0gIGxwaGwtPkl0ZW1zQ291bnQrKzsKLSAgaFN0ciA9IDA7Ci0KLSAgaWYgKEhhc1N0cmluZ3Mod25kUHRyKSkgewotICAgIGhTdHIgPSBMSVNUX0hFQVBfQUxMT0MobHBobCwgR01FTV9NT1ZFQUJMRSwgc3RybGVuKG5ld3N0cikgKyAxKTsKLSAgICBzdHIgPSAoTFBTVFIpTElTVF9IRUFQX0FERFIobHBobCwgaFN0cik7Ci0gICAgaWYgKHN0ciA9PSBOVUxMKSByZXR1cm4gTEJfRVJSU1BBQ0U7Ci0gICAgc3RyY3B5KHN0ciwgbmV3c3RyKTsKLSAgICBuZXdzdHIgPSBzdHI7Ci0gICAgbHBsc25ldy0+aXRlbVRleHQgPSBzdHI7Ci0gICAgZHByaW50Zl9saXN0Ym94KHN0ZGRlYiwiTGlzdEJveEluc2VydFN0cmluZyAvLyBMQlNfSEFTU1RSSU5HUyBhZnRlciBzdHJjcHkgJyVzJ1xuIiwgc3RyKTsKLSAgfSBlbHNlIHsKLSAgICBscGxzbmV3LT5pdGVtVGV4dCA9IE5VTEw7Ci0gICAgbHBsc25ldy0+ZGlzLml0ZW1EYXRhID0gKERXT1JEKW5ld3N0cjsKLSAgfQotCi0gIGxwbHNuZXctPmRpcy5pdGVtSUQgPSBscGhsLT5JdGVtc0NvdW50OwotICBscGxzbmV3LT5oRGF0YSA9IGhTdHI7Ci0gCi0gIGlmICgod25kUHRyLT5kd1N0eWxlICYgTEJTX09XTkVSRFJBV0ZJWEVEKSAmJiAobHBobC0+SXRlbXNDb3VudCA9PSAxKSkgewotICAgIExpc3RCb3hBc2tNZWFzdXJlKHduZFB0ciwgbHBobCwgbHBsc25ldyk7Ci0gIH0KLQotICBpZiAod25kUHRyLT5kd1N0eWxlICYgTEJTX09XTkVSRFJBV1ZBUklBQkxFKQotICAgIExpc3RCb3hBc2tNZWFzdXJlKHduZFB0ciwgbHBobCwgbHBsc25ldyk7ICAgCi0KLSAgU2V0U2Nyb2xsUmFuZ2UoaHduZCwgU0JfVkVSVCwgMSwgTGlzdE1heEZpcnN0VmlzaWJsZShscGhsKSwgCi0JCSAobHBobC0+Rmlyc3RWaXNpYmxlICE9IDEgJiYgbHBobC0+YlJlZHJhd0ZsYWcpKTsKLQotICBpZiAobHBobC0+SXRlbXNQZXJDb2x1bW4gIT0gMCkKLSAgICBTZXRTY3JvbGxSYW5nZShod25kLCBTQl9IT1JaLCAxLCBscGhsLT5JdGVtc1Zpc2libGUgLyAKLQkJICAgbHBobC0+SXRlbXNQZXJDb2x1bW4gKyAxLAotCQkgICAobHBobC0+Rmlyc3RWaXNpYmxlICE9IDEgJiYgbHBobC0+YlJlZHJhd0ZsYWcpKTsKLQotICBpZiAoKGxwaGwtPkZpcnN0VmlzaWJsZSA8PSB1SW5kZXgpICYmCi0gICAgICAoKGxwaGwtPkZpcnN0VmlzaWJsZSArIGxwaGwtPkl0ZW1zVmlzaWJsZSkgPj0gdUluZGV4KSkgewotICAgIEludmFsaWRhdGVSZWN0KGh3bmQsIE5VTEwsIFRSVUUpOwotICAgIFVwZGF0ZVdpbmRvdyhod25kKTsKLSAgfQotCi0gIGRwcmludGZfbGlzdGJveChzdGRkZWIsIkxpc3RCb3hJbnNlcnRTdHJpbmcgLy8gY291bnQ9JWRcbiIsIGxwaGwtPkl0ZW1zQ291bnQpOwotICByZXR1cm4gdUluZGV4OwotfQotCi0KLWludCBMaXN0Qm94R2V0VGV4dChIV05EIGh3bmQsIFVJTlQgdUluZGV4LCBMUFNUUiBPdXRTdHIsIEJPT0wgYkl0ZW1EYXRhKQotCi17Ci0gIFdORCAgCSp3bmRQdHI7Ci0gIExQTElTVFNUUlVDVCBscGxzOwotCi0gIHduZFB0ciA9IFdJTl9GaW5kV25kUHRyKGh3bmQpOwotCi0gIGlmICghT3V0U3RyICYmICFiSXRlbURhdGEpIHsKLSAgICBkcHJpbnRmX2xpc3Rib3goc3RkZGViLCAiTGlzdEJveEdldFRleHQgLy8gT3V0U3RyPT1OVUxMXG4iKTsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIGlmICghYkl0ZW1EYXRhKSAqT3V0U3RyPTA7Ci0KLSAgaWYgKChscGxzID0gTGlzdEJveEdldEl0ZW0gKGh3bmQsIHVJbmRleCkpID09IE5VTEwpIAotICAgIHJldHVybiBMQl9FUlI7Ci0KLSAgaWYgKGJJdGVtRGF0YSkKLSAgICByZXR1cm4gbHBscy0+ZGlzLml0ZW1EYXRhOwotCi0gIGlmICghSGFzU3RyaW5ncyh3bmRQdHIpKSB7Ci0gICAgKigobG9uZyAqKU91dFN0cikgPSBscGxzLT5kaXMuaXRlbURhdGE7Ci0gICAgcmV0dXJuIDQ7Ci0gIH0KLQkKLSAgc3RyY3B5KE91dFN0ciwgbHBscy0+aXRlbVRleHQpOwotICByZXR1cm4gc3RybGVuKE91dFN0cik7Ci19Ci0KLWludCBMaXN0Qm94U2V0SXRlbURhdGEoSFdORCBod25kLCBVSU5UIHVJbmRleCwgRFdPUkQgSXRlbURhdGEpCi0KLXsKLSAgTFBMSVNUU1RSVUNUIGxwbHM7Ci0KLSAgaWYgKChscGxzID0gTGlzdEJveEdldEl0ZW0oaHduZCwgdUluZGV4KSkgPT0gTlVMTCkKLSAgICByZXR1cm4gTEJfRVJSOwotCi0gIGxwbHMtPmRpcy5pdGVtRGF0YSA9IEl0ZW1EYXRhOwotICByZXR1cm4gMTsKLX0KLQotCi1pbnQgTGlzdEJveERlbGV0ZVN0cmluZyhIV05EIGh3bmQsIFVJTlQgdUluZGV4KQotCi17Ci0gIFdORCAgCSp3bmRQdHI7Ci0gIExQSEVBRExJU1QgCWxwaGw7Ci0gIExQTElTVFNUUlVDVCBscGxzLCBscGxzMjsKLSAgVUlOVAlDb3VudDsKLQotICBscGhsID0gTGlzdEJveEdldFdpbmRvd0FuZFN0b3JhZ2UoaHduZCwgJnduZFB0cik7Ci0gIGlmIChscGhsID09IE5VTEwpIHJldHVybiBMQl9FUlI7Ci0KLSAgaWYgKHVJbmRleCA+PSBscGhsLT5JdGVtc0NvdW50KSByZXR1cm4gTEJfRVJSOwotCi0gIGxwbHMgPSBscGhsLT5scEZpcnN0OwotICBpZiAobHBscyA9PSBOVUxMKSByZXR1cm4gTEJfRVJSOwotCi0gIGlmKCB1SW5kZXggPT0gMCApCi0gICAgbHBobC0+bHBGaXJzdCA9IGxwbHMtPmxwTmV4dDsKLSAgZWxzZSB7Ci0gICAgZm9yKENvdW50ID0gMDsgQ291bnQgPCB1SW5kZXg7IENvdW50KyspIHsKLSAgICAgIGlmIChscGxzLT5scE5leHQgPT0gTlVMTCkgcmV0dXJuIExCX0VSUjsKLQotICAgICAgbHBsczIgPSBscGxzOwotICAgICAgbHBscyA9IChMUExJU1RTVFJVQ1QpbHBscy0+bHBOZXh0OwotICAgIH0KLSAgICBscGxzMi0+bHBOZXh0ID0gKExQTElTVFNUUlVDVClscGxzLT5scE5leHQ7Ci0gIH0KLQotICBscGhsLT5JdGVtc0NvdW50LS07Ci0KLSAgaWYgKGxwbHMtPmhEYXRhICE9IDApIExJU1RfSEVBUF9GUkVFKGxwaGwsIGxwbHMtPmhEYXRhKTsKLSAgaWYgKGxwbHMtPmhNZW0gIT0gMCkgTElTVF9IRUFQX0ZSRUUobHBobCwgbHBscy0+aE1lbSk7Ci0KLSAgU2V0U2Nyb2xsUmFuZ2UoaHduZCwgU0JfVkVSVCwgMSwgTGlzdE1heEZpcnN0VmlzaWJsZShscGhsKSwgVFJVRSk7Ci0gIGlmIChscGhsLT5JdGVtc1BlckNvbHVtbiAhPSAwKQotICAgIFNldFNjcm9sbFJhbmdlKGh3bmQsIFNCX0hPUlosIDEsIGxwaGwtPkl0ZW1zVmlzaWJsZSAvIAotCQkgICBscGhsLT5JdGVtc1BlckNvbHVtbiArIDEsIFRSVUUpOwotCi0gIGlmICgobHBobC0+Rmlyc3RWaXNpYmxlIDw9IHVJbmRleCkgJiYKLSAgICAgICgobHBobC0+Rmlyc3RWaXNpYmxlICsgbHBobC0+SXRlbXNWaXNpYmxlKSA+PSB1SW5kZXgpKSB7Ci0gICAgSW52YWxpZGF0ZVJlY3QoaHduZCwgTlVMTCwgVFJVRSk7Ci0gICAgVXBkYXRlV2luZG93KGh3bmQpOwotICB9Ci0KLSAgcmV0dXJuIGxwaGwtPkl0ZW1zQ291bnQ7Ci19Ci0KLQotaW50IExpc3RCb3hGaW5kU3RyaW5nKEhXTkQgaHduZCwgVUlOVCBuRmlyc3QsIExQU1RSIE1hdGNoU3RyKQotewotICBXTkQgICAgICAgICAgKnduZFB0cjsKLSAgTFBIRUFETElTVCAgIGxwaGw7Ci0gIExQTElTVFNUUlVDVCBscGxzOwotICBVSU5UCSAgICAgICBDb3VudDsKLSAgVUlOVCAgICAgICAgIEZpcnN0ID0gbkZpcnN0ICsgMTsKLQotICBscGhsID0gTGlzdEJveEdldFdpbmRvd0FuZFN0b3JhZ2UoaHduZCwgJnduZFB0cik7Ci0KLSAgaWYgKGxwaGwgPT0gTlVMTCkgcmV0dXJuIExCX0VSUjsKLQotICBpZiAoRmlyc3QgPiBscGhsLT5JdGVtc0NvdW50KSByZXR1cm4gTEJfRVJSOwotIAotICBscGxzID0gTGlzdEJveEdldEl0ZW0oaHduZCwgRmlyc3QpOwotICBDb3VudCA9IDA7Ci0gIHdoaWxlKGxwbHMgIT0gTlVMTCkgewotICAgIGlmIChIYXNTdHJpbmdzKHduZFB0cikpIHsKLSAgICAgIGlmIChzdHJzdHIobHBscy0+aXRlbVRleHQsIE1hdGNoU3RyKSA9PSBscGxzLT5pdGVtVGV4dCkgcmV0dXJuIENvdW50OwotICAgIH0gZWxzZSBpZiAod25kUHRyLT5kd1N0eWxlICYgTEJTX1NPUlQpIHsKLSAgICAgIC8qIFhYWCBEbyBhIGNvbXBhcmUgaXRlbSAqLwotICAgIH0KLSAgICBlbHNlCi0gICAgICBpZiAobHBscy0+ZGlzLml0ZW1EYXRhID09IChEV09SRClNYXRjaFN0cikgcmV0dXJuIENvdW50OwotCi0gICAgbHBscyA9IGxwbHMtPmxwTmV4dDsKLSAgICBDb3VudCsrOwotICB9Ci0KLSAgLyogU3RhcnQgb3ZlciBhdCB0b3AgKi8KLSAgQ291bnQgPSAwOwotICBscGxzID0gbHBobC0+bHBGaXJzdDsKLQotICB3aGlsZSAoQ291bnQgPCBGaXJzdCkgewotICAgIGlmIChIYXNTdHJpbmdzKHduZFB0cikpIHsKLSAgICAgIGlmIChzdHJzdHIobHBscy0+aXRlbVRleHQsIE1hdGNoU3RyKSA9PSBscGxzLT5pdGVtVGV4dCkgcmV0dXJuIENvdW50OwotICAgIH0gZWxzZSBpZiAod25kUHRyLT5kd1N0eWxlICYgTEJTX1NPUlQpIHsKLSAgICAgIC8qIFhYWCBEbyBhIGNvbXBhcmUgaXRlbSAqLwotICAgIH0KLSAgICBlbHNlCi0gICAgICBpZiAobHBscy0+ZGlzLml0ZW1EYXRhID09IChEV09SRClNYXRjaFN0cikgcmV0dXJuIENvdW50OwotCi0gICAgbHBscyA9IGxwbHMtPmxwTmV4dDsKLSAgICBDb3VudCsrOwotICB9Ci0KLSAgcmV0dXJuIExCX0VSUjsKLX0KLQotCi1pbnQgTGlzdEJveFJlc2V0Q29udGVudChIV05EIGh3bmQpCi17Ci0gICAgV05EICAqd25kUHRyOwotICAgIExQSEVBRExJU1QgCWxwaGw7Ci0gICAgTFBMSVNUU1RSVUNUIGxwbHM7Ci0gICAgVUlOVAlpOwotCi0gICAgbHBobCA9IExpc3RCb3hHZXRXaW5kb3dBbmRTdG9yYWdlKGh3bmQsICZ3bmRQdHIpOwotICAgIGlmIChscGhsID09IE5VTEwpIHJldHVybiBMQl9FUlI7Ci0KLSAgICBpZiAobHBobC0+SXRlbXNDb3VudCA9PSAwKSByZXR1cm4gMDsKLQotICAgIGxwbHMgPSBscGhsLT5scEZpcnN0OwotCi0gICAgZHByaW50Zl9saXN0Ym94KHN0ZGRlYiwgIkxpc3RCb3hSZXNldENvbnRlbnQgLy8gSXRlbUNvdW50ID0gJWRcbiIsCi0JbHBobC0+SXRlbXNDb3VudCk7Ci0KLSAgICBmb3IoaSA9IDA7IGkgPCBscGhsLT5JdGVtc0NvdW50OyBpKyspIHsKLSAgICAgIExQTElTVFNUUlVDVCBscGxzMjsKLQotICAgICAgaWYgKGxwbHMgPT0gTlVMTCkgcmV0dXJuIExCX0VSUjsKLQotICAgICAgbHBsczIgPSBscGxzLT5scE5leHQ7Ci0KLSAgICAgIGlmIChpICE9IDApIHsKLQlkcHJpbnRmX2xpc3Rib3goc3RkZGViLCJSZXNldENvbnRlbnQgIyV1XG4iLCBpKTsKLQlpZiAobHBscy0+aERhdGEgIT0gMCAmJiBscGxzLT5oRGF0YSAhPSBscGxzLT5oTWVtKQotCSAgTElTVF9IRUFQX0ZSRUUobHBobCwgbHBscy0+aERhdGEpOwotCi0JaWYgKGxwbHMtPmhNZW0gIT0gMCkgTElTVF9IRUFQX0ZSRUUobHBobCwgbHBscy0+aE1lbSk7Ci0gICAgICB9ICAKLQotICAgICAgbHBscyA9IGxwbHMyOwotICAgIH0KLQotICAgIGxwaGwtPmxwRmlyc3QgICAgICA9IE5VTEw7Ci0gICAgbHBobC0+Rmlyc3RWaXNpYmxlID0gMTsKLSAgICBscGhsLT5JdGVtc0NvdW50ICAgPSAwOwotICAgIGxwaGwtPkl0ZW1Gb2N1c2VkICA9IC0xOwotICAgIGxwaGwtPlByZXZGb2N1c2VkICA9IC0xOwotCi0gICAgU2V0U2Nyb2xsUmFuZ2UoaHduZCwgU0JfVkVSVCwgMSwgTGlzdE1heEZpcnN0VmlzaWJsZShscGhsKSwgVFJVRSk7Ci0KLSAgICBpZiAobHBobC0+SXRlbXNQZXJDb2x1bW4gIT0gMCkKLQlTZXRTY3JvbGxSYW5nZShod25kLCBTQl9IT1JaLCAxLCBscGhsLT5JdGVtc1Zpc2libGUgLyAKLQkgICAgbHBobC0+SXRlbXNQZXJDb2x1bW4gKyAxLCBUUlVFKTsKLQotICAgIEludmFsaWRhdGVSZWN0KGh3bmQsIE5VTEwsIFRSVUUpOwotICAgIFVwZGF0ZVdpbmRvdyhod25kKTsKLQotICAgIHJldHVybiBUUlVFOwotfQotCi0KLWludCBMaXN0Qm94U2V0Q3VyU2VsKEhXTkQgaHduZCwgV09SRCB3SW5kZXgpCi0KLXsKLSAgV05EICAqd25kUHRyOwotICBMUEhFQURMSVNUIAlscGhsOwotICBMUExJU1RTVFJVQ1QgbHBsczsKLQotICBscGhsID0gTGlzdEJveEdldFdpbmRvd0FuZFN0b3JhZ2UoaHduZCwgJnduZFB0cik7Ci0gIGlmIChscGhsID09IE5VTEwpIHJldHVybiBMQl9FUlI7Ci0KLSAgaWYgKHduZFB0ci0+ZHdTdHlsZSAmIExCU19NVUxUSVBMRVNFTCkgcmV0dXJuIDA7Ci0KLSAgaWYgKGxwaGwtPkl0ZW1Gb2N1c2VkICE9IC0xKSB7Ci0gICAgbHBscyA9IExpc3RCb3hHZXRJdGVtKGh3bmQsIGxwaGwtPkl0ZW1Gb2N1c2VkKTsKLSAgICBpZiAobHBscyA9PSAwKSByZXR1cm4gTEJfRVJSOwotICAgIGxwbHMtPmRpcy5pdGVtU3RhdGUgPSAwOwotICB9Ci0KLSAgaWYgKHdJbmRleCAhPSAoVUlOVCktMSkgewotICAgIGxwaGwtPkl0ZW1Gb2N1c2VkID0gd0luZGV4OwotICAgIGxwbHMgPSBMaXN0Qm94R2V0SXRlbShod25kLCB3SW5kZXgpOwotICAgIGlmIChscGxzID09IDApIHJldHVybiBMQl9FUlI7Ci0gICAgbHBscy0+ZGlzLml0ZW1TdGF0ZSA9IE9EU19TRUxFQ1RFRCB8IE9EU19GT0NVUzsKLQotICAgIHJldHVybiAwOwotICB9Ci0KLSAgcmV0dXJuIExCX0VSUjsKLX0KLQotaW50IExpc3RCb3hTZXRTZWwoSFdORCBod25kLCBXT1JEIHdJbmRleCwgV09SRCBzdGF0ZSkKLQotewotICBMUEhFQURMSVNUIAlscGhsOwotICBMUExJU1RTVFJVQ1QgbHBsczsKLSAgV05EICAgICAgICAgKnduZFB0cjsKLQotICBscGhsID0gTGlzdEJveEdldFdpbmRvd0FuZFN0b3JhZ2UoaHduZCwgJnduZFB0cik7Ci0gIGlmIChscGhsID09IE5VTEwpIHJldHVybiBMQl9FUlI7Ci0KLSAgaWYgKCEod25kUHRyLT5kd1N0eWxlICYgTEJTX01VTFRJUExFU0VMKSkgcmV0dXJuIDA7Ci0KLSAgaWYgKHdJbmRleCA9PSAoVUlOVCktMSkgewotICAgIGxwbHMgPSBscGhsLT5scEZpcnN0OwotCi0gICAgd2hpbGUgKGxwbHMgIT0gTlVMTCkgewotICAgICAgbHBscy0+ZGlzLml0ZW1TdGF0ZSA9IHN0YXRlOwotICAgICAgbHBscyA9IGxwbHMtPmxwTmV4dDsKLSAgICB9Ci0KLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIGlmICh3SW5kZXggPj0gbHBobC0+SXRlbXNDb3VudCkgcmV0dXJuIExCX0VSUjsKLQotICBscGxzID0gTGlzdEJveEdldEl0ZW0oaHduZCwgd0luZGV4KTsKLSAgbHBscy0+ZGlzLml0ZW1TdGF0ZSA9IHN0YXRlOwotCi0gIHJldHVybiAwOwotfQotCi0KLWludCBMaXN0Qm94R2V0U2VsKEhXTkQgaHduZCwgV09SRCB3SW5kZXgpCi17Ci0gIExQTElTVFNUUlVDVCBscGxzOwotCi0gIGlmICgobHBscyA9IExpc3RCb3hHZXRJdGVtKGh3bmQsIHdJbmRleCkpID09IE5VTEwpIHJldHVybiBMQl9FUlI7Ci0KLSAgcmV0dXJuIGxwbHMtPmRpcy5pdGVtU3RhdGU7Ci19Ci0KLQotaW50IExpc3RCb3hEaXJlY3RvcnkoSFdORCBod25kLCBVSU5UIGF0dHJpYiwgTFBTVFIgZmlsZXNwZWMpCi17Ci0gIHN0cnVjdCBkb3NkaXJlbnQgKmRwLCAqZHBfb2xkOwotICBpbnQJeCwgd1JldCA9IExCX09LQVk7Ci0gIEJPT0wgIE9sZEZsYWc7Ci0gIGNoYXIgCXRlbXBbMjU2XTsKLSAgTFBIRUFETElTVCAJbHBobDsKLSAgaW50ICAgZHJpdmU7Ci0gIExQU1RSIHRzdHI7Ci0KLSAgZHByaW50Zl9saXN0Ym94KHN0ZGRlYiwiTGlzdEJveERpcmVjdG9yeTogJXMsICU0eFxuIixmaWxlc3BlYyxhdHRyaWIpOwotCi0gIGlmKCBzdHJjaHIoIGZpbGVzcGVjLCAnXFwnICkgfHwgc3RyY2hyKCBmaWxlc3BlYywgJzonICkgKSB7Ci0gICAgZHJpdmUgPSBET1NfR2V0RGVmYXVsdERyaXZlKCk7Ci0gICAgaWYoIGZpbGVzcGVjWzFdID09ICc6JyApIHsKLSAgICAgIGRyaXZlID0gdG91cHBlcihmaWxlc3BlY1swXSkgLSAnQSc7Ci0gICAgICBmaWxlc3BlYyArPSAyOwotICAgIH0KLSAgICBzdHJjcHkodGVtcCxmaWxlc3BlYyk7Ci0gICAgdHN0ciA9IHN0cnJjaHIodGVtcCwgJ1xcJyk7Ci0gICAgaWYoIHRzdHIgPT0gTlVMTCApIAotICAgICAgRE9TX1NldERlZmF1bHREcml2ZSggZHJpdmUgKTsKLSAgICBlbHNlIHsKLSAgICAgICp0c3RyID0gMDsKLSAgICAgIGZpbGVzcGVjID0gdHN0ciArIDE7Ci0gICAgICBET1NfQ2hhbmdlRGlyKCBkcml2ZSwgdGVtcCApOwotICAgICAgaWYgKCFET1NfQ2hhbmdlRGlyKCBkcml2ZSwgdGVtcCApKSByZXR1cm4gMDsKLSAgICB9Ci0gICAgZHByaW50Zl9saXN0Ym94KHN0ZGRlYiwiQ2hhbmdpbmcgZGlyZWN0b3J5IHRvICVjOiVzLCBmaWxlbWFzayBpcyAlc1xuIiwKLQkJICAgIGRyaXZlKydBJywgdGVtcCwgZmlsZXNwZWMgKTsKLSAgfQotICBscGhsID0gTGlzdEJveEdldFN0b3JhZ2VIZWFkZXIoaHduZCk7Ci0gIGlmIChscGhsID09IE5VTEwpIHJldHVybiBMQl9FUlI7Ci0gIGlmICgoZHAgPSAoc3RydWN0IGRvc2RpcmVudCAqKURPU19vcGVuZGlyKGZpbGVzcGVjKSkgPT1OVUxMKSByZXR1cm4gMDsKLSAgZHBfb2xkID0gZHA7Ci0gIE9sZEZsYWcgPSBscGhsLT5iUmVkcmF3RmxhZzsKLSAgbHBobC0+YlJlZHJhd0ZsYWcgPSBGQUxTRTsKLSAgd2hpbGUgKChkcCA9IChzdHJ1Y3QgZG9zZGlyZW50ICopRE9TX3JlYWRkaXIoZHApKSkgewotICAgIGlmICghZHAtPmludXNlKSBicmVhazsKLSAgICBkcHJpbnRmX2xpc3Rib3goIHN0ZGRlYiwgIkxpc3RCb3hEaXJlY3RvcnkgJXAgJyVzJyAhXG4iLCBkcC0+ZmlsZW5hbWUsIAotCQkgICAgZHAtPmZpbGVuYW1lKTsKLSAgICBpZiAoZHAtPmF0dHJpYnV0ZSAmIEZBX0RJUkVDKSB7Ci0gICAgICBpZiAoYXR0cmliICYgRERMX0RJUkVDVE9SWSAmJiBzdHJjbXAoZHAtPmZpbGVuYW1lLCAiLiIpICE9IDApIHsKLQlzcHJpbnRmKHRlbXAsICJbJXNdIiwgZHAtPmZpbGVuYW1lKTsKLQlpZiAoICh3UmV0ID0gTGlzdEJveEFkZFN0cmluZyhod25kLCB0ZW1wKSkgPT0gTEJfRVJSKSBicmVhazsKLSAgICAgIH0KLSAgICB9IAotICAgIGVsc2UgewotICAgICAgaWYgKGF0dHJpYiAmIERETF9FWENMVVNJVkUpIHsKLQlpZiAoYXR0cmliICYgKERETF9SRUFEV1JJVEUgfCBERExfUkVBRE9OTFkgfCBERExfSElEREVOIHwKLQkJICAgICAgRERMX1NZU1RFTSkgKQotCSAgaWYgKCAod1JldCA9IExpc3RCb3hBZGRTdHJpbmcoaHduZCwgZHAtPmZpbGVuYW1lKSkgCi0JICAgICAgPT0gTEJfRVJSKSBicmVhazsKLSAgICAgIH0gCi0gICAgICBlbHNlIHsKLQlpZiAoICh3UmV0ID0gTGlzdEJveEFkZFN0cmluZyhod25kLCBkcC0+ZmlsZW5hbWUpKSAKLQkgICAgPT0gTEJfRVJSKSBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgRE9TX2Nsb3NlZGlyKGRwX29sZCk7Ci0gIAotICBpZiAoYXR0cmliICYgRERMX0RSSVZFUykgewotICAgIGZvciAoeD0wO3ghPU1BWF9ET1NfRFJJVkVTO3grKykgewotICAgICAgaWYgKERPU19WYWxpZERyaXZlKHgpKSB7Ci0Jc3ByaW50Zih0ZW1wLCAiWy0lYy1dIiwgJ2EnK3gpOwotCWlmKCh3UmV0ID0gTGlzdEJveEluc2VydFN0cmluZyhod25kLCAoVUlOVCktMSwgdGVtcCkpID09IExCX0VSUikgYnJlYWs7Ci0gICAgICB9CQkKLSAgICB9Ci0gIH0KLSAgbHBobC0+YlJlZHJhd0ZsYWcgPSBPbGRGbGFnOwotICBpZiAoT2xkRmxhZykgewotICAgIEludmFsaWRhdGVSZWN0KGh3bmQsIE5VTEwsIFRSVUUpOwotICAgIFVwZGF0ZVdpbmRvdyhod25kKTsKLSAgfQotICBkcHJpbnRmX2xpc3Rib3goc3RkZGViLCJFbmQgb2YgTGlzdEJveERpcmVjdG9yeSAhXG4iKTsKLSAgcmV0dXJuIDE7ICAvKiBGSVhNRTogU2hvdWxkIGJlIDAgaWYgImZpbGVzcGVjIiBpcyBpbnZhbGlkICovCi19Ci0KLQotaW50IExpc3RCb3hHZXRJdGVtUmVjdChIV05EIGh3bmQsIFdPUkQgd0luZGV4LCBMUFJFQ1QgbHByZWN0KQotCi17Ci0gIExQTElTVFNUUlVDVCBscGxzOwotCi0gIGlmICgobHBscyA9IExpc3RCb3hHZXRJdGVtKGh3bmQsIHdJbmRleCkpID09IE5VTEwpIHJldHVybiBMQl9FUlI7Ci0KLSAgKihscHJlY3QpID0gbHBscy0+ZGlzLnJjSXRlbTsKLQotICByZXR1cm4gMDsKLX0KLQotCi1pbnQgTGlzdEJveFNldEl0ZW1IZWlnaHQoSFdORCBod25kLCBXT1JEIHdJbmRleCwgbG9uZyBoZWlnaHQpCi0KLXsKLSAgTFBIRUFETElTVCAgICBscGhsOwotICBXTkQgICAgICAgICAgKnduZFB0cjsKLSAgTFBMSVNUU1RSVUNUICBscGxzOwotCi0gIGxwaGwgPSBMaXN0Qm94R2V0V2luZG93QW5kU3RvcmFnZShod25kLCAmd25kUHRyKTsKLSAgaWYgKGxwaGwgPT0gTlVMTCkgcmV0dXJuIExCX0VSUjsKLQotICBpZiAoISh3bmRQdHItPmR3U3R5bGUgJiBMQlNfT1dORVJEUkFXVkFSSUFCTEUpKSB7Ci0gICAgbHBobC0+U3RkSXRlbUhlaWdodCA9IChzaG9ydCloZWlnaHQ7Ci0gICAgSW52YWxpZGF0ZVJlY3QoaHduZCwgTlVMTCwgVFJVRSk7Ci0gICAgVXBkYXRlV2luZG93KGh3bmQpOwotCi0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICBpZiAoKGxwbHMgPSBMaXN0Qm94R2V0SXRlbShod25kLCB3SW5kZXgpKSA9PSBOVUxMKSByZXR1cm4gTEJfRVJSOwotICAKLSAgbHBscy0+ZGlzLnJjSXRlbS5ib3R0b20gPSBscGxzLT5kaXMucmNJdGVtLnRvcCArIChzaG9ydCloZWlnaHQ7Ci0gIEludmFsaWRhdGVSZWN0KGh3bmQsIE5VTEwsIFRSVUUpOwotICBVcGRhdGVXaW5kb3coaHduZCk7Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLWludCBMaXN0Qm94RGVmYXVsdEl0ZW0oSFdORCBod25kLCBXTkQgKnduZFB0ciwgCi0JTFBIRUFETElTVCBscGhsLCBMUExJU1RTVFJVQ1QgbHBscykKLQotewotICBSRUNUCXJlY3Q7Ci0KLSAgaWYgKHduZFB0ciA9PSBOVUxMIHx8IGxwaGwgPT0gTlVMTCB8fCBscGxzID09IE5VTEwpIHsKLSAgICBmcHJpbnRmKHN0ZGVyciwiTGlzdEJveERlZmF1bHRJdGVtKCkgLy8gQmFkIFBvaW50ZXJzICFcbiIpOwotICAgIHJldHVybiBGQUxTRTsKLSAgfQotCi0gIEdldENsaWVudFJlY3QoaHduZCwgJnJlY3QpOwotICBTZXRSZWN0KCZscGxzLT5kaXMucmNJdGVtLCAwLCAwLCByZWN0LnJpZ2h0LCBscGhsLT5TdGRJdGVtSGVpZ2h0KTsKLQotICBscGxzLT5kaXMuQ3RsVHlwZSAgICA9IGxwaGwtPkRyYXdDdGxUeXBlOwotICBscGxzLT5kaXMuQ3RsSUQgICAgICA9IHduZFB0ci0+d0lEbWVudTsKLSAgbHBscy0+ZGlzLml0ZW1JRCAgICAgPSAwOwotICBscGxzLT5kaXMuaXRlbUFjdGlvbiA9IDA7Ci0gIGxwbHMtPmRpcy5pdGVtU3RhdGUgID0gMDsKLSAgbHBscy0+ZGlzLmh3bmRJdGVtICAgPSBod25kOwotICBscGxzLT5kaXMuaERDICAgICAgICA9IDA7Ci0gIGxwbHMtPmRpcy5pdGVtRGF0YSAgID0gMDsKLQotICByZXR1cm4gVFJVRTsKLX0KLQotCi0KLWludCBMaXN0Qm94RmluZE5leHRNYXRjaChIV05EIGh3bmQsIFdPUkQgd0NoYXIpCi0KLXsKLSAgV05EICAJICAgICAgICAqd25kUHRyOwotICBMUEhFQURMSVNUIAlscGhsOwotICBMUExJU1RTVFJVQ1QgIGxwbHM7Ci0gIFVJTlQJICAgICAgICBDb3VudDsKLQotICBscGhsID0gTGlzdEJveEdldFdpbmRvd0FuZFN0b3JhZ2UoaHduZCwgJnduZFB0cik7Ci0gIGlmIChscGhsID09IE5VTEwpIHJldHVybiBMQl9FUlI7Ci0gIGxwbHMgPSBscGhsLT5scEZpcnN0OwotICBpZiAobHBscyA9PSBOVUxMKSByZXR1cm4gTEJfRVJSOwotICBpZiAod0NoYXIgPCAnICcpIHJldHVybiBMQl9FUlI7Ci0KLSAgaWYgKCFIYXNTdHJpbmdzKHduZFB0cikpIHJldHVybiBMQl9FUlI7Ci0KLSAgQ291bnQgPSAwOwotICB3aGlsZShscGxzICE9IE5VTEwpIHsKLSAgICBpZiAoQ291bnQgPiBscGhsLT5JdGVtRm9jdXNlZCkgewotICAgICAgaWYgKCoobHBscy0+aXRlbVRleHQpID09IChjaGFyKXdDaGFyKSB7Ci0JaWYgKCh3bmRQdHItPmR3U3R5bGUgJiBMQlNfTVVMVElQTEVTRUwpID09IExCU19NVUxUSVBMRVNFTCkgewotCSAgbHBobC0+SXRlbUZvY3VzZWQgPSBDb3VudDsKLQkgIExpc3RCb3hTY3JvbGx0b0ZvY3VzKGh3bmQpOwotCX0KLQllbHNlIHsKLQkgIExpc3RCb3hTZXRDdXJTZWwoaHduZCwgQ291bnQpOwotCX0KLQlTZXRTY3JvbGxQb3MoaHduZCwgU0JfVkVSVCwgbHBobC0+Rmlyc3RWaXNpYmxlLCBUUlVFKTsKLQlJbnZhbGlkYXRlUmVjdChod25kLCBOVUxMLCBUUlVFKTsKLQlVcGRhdGVXaW5kb3coaHduZCk7Ci0JcmV0dXJuIENvdW50OwotICAgICAgfQotICAgIH0KLSAgICBscGxzID0gKExQTElTVFNUUlVDVClscGxzLT5scE5leHQ7Ci0gICAgQ291bnQrKzsKLSAgfQotICBDb3VudCA9IDA7Ci0gIGxwbHMgPSBscGhsLT5scEZpcnN0OwotICB3aGlsZShscGxzICE9IE5VTEwpIHsKLSAgICBpZiAoKihscGxzLT5pdGVtVGV4dCkgPT0gKGNoYXIpd0NoYXIpIHsKLSAgICAgIGlmIChDb3VudCA9PSBscGhsLT5JdGVtRm9jdXNlZCkgICAgcmV0dXJuIExCX0VSUjsKLQotICAgICAgaWYgKCh3bmRQdHItPmR3U3R5bGUgJiBMQlNfTVVMVElQTEVTRUwpID09IExCU19NVUxUSVBMRVNFTCkgewotCWxwaGwtPkl0ZW1Gb2N1c2VkID0gQ291bnQ7Ci0JTGlzdEJveFNjcm9sbHRvRm9jdXMoaHduZCk7Ci0gICAgICB9Ci0gICAgICBlbHNlIHsKLQlMaXN0Qm94U2V0Q3VyU2VsKGh3bmQsIENvdW50KTsKLSAgICAgIH0KLSAgICAgIFNldFNjcm9sbFBvcyhod25kLCBTQl9WRVJULCBscGhsLT5GaXJzdFZpc2libGUsIFRSVUUpOwotICAgICAgSW52YWxpZGF0ZVJlY3QoaHduZCwgTlVMTCwgVFJVRSk7Ci0gICAgICBVcGRhdGVXaW5kb3coaHduZCk7Ci0gICAgICByZXR1cm4gQ291bnQ7Ci0gICAgfQotICAgIGxwbHMgPSBscGxzLT5scE5leHQ7Ci0gICAgQ291bnQrKzsKLSAgfQotICByZXR1cm4gTEJfRVJSOwotfQotCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIAkJICAgICAgCURsZ0RpclNlbGVjdAkJCVtVU0VSLjk5XQogICovCkBAIC0yMDg3LDEyICsxNzcwLDEyIEBACiAKICAgaHduZCA9IEdldERsZ0l0ZW0oaERsZywgbklETEJveCk7CiAgIGxwaGwgPSBMaXN0Qm94R2V0U3RvcmFnZUhlYWRlcihod25kKTsKLSAgaWYoIGxwaGwtPkl0ZW1Gb2N1c2VkID09IC0xICkgewotICAgIGRwcmludGZfbGlzdGJveCggc3RkZGViLCAiTm90aGluZyBzZWxlY3RlZCFcbiIgKTsKKyAgaWYobHBobC0+SXRlbUZvY3VzZWQgPT0gLTEpIHsKKyAgICBkcHJpbnRmX2xpc3Rib3goc3RkZGViLCAiTm90aGluZyBzZWxlY3RlZCFcbiIpOwogICAgIHJldHVybiBGQUxTRTsKICAgfQotICBMaXN0Qm94R2V0VGV4dChod25kLCBscGhsLT5JdGVtRm9jdXNlZCwgKExQU1RSKXMsIEZBTFNFKTsKLSAgZHByaW50Zl9saXN0Ym94KCBzdGRkZWIsICJTZWxlY3Rpb24gaXMgJXNcbiIsIHMgKTsKKyAgTGlzdEJveEdldFRleHQobHBobCwgbHBobC0+SXRlbUZvY3VzZWQsIHMpOworICBkcHJpbnRmX2xpc3Rib3goc3RkZGViLCAiU2VsZWN0aW9uIGlzICVzXG4iLCBzKTsKICAgaWYoIHNbMF0gPT0gJ1snICkgewogICAgIGlmKCBzWzFdID09ICctJyApIHsKICAgICAgIHN0cm5jcHkoIGxwU3RyLCBzKzIsIHN0cmxlbihzKS00ICk7ICAgIC8qIGRldmljZSBuYW1lICovCkBAIC0yMTA2LDggKzE3ODksNyBAQAogICAgIH0KICAgICBkcHJpbnRmX2xpc3Rib3goIHN0ZGRlYiwgIlJldHVybmluZyAlc1xuIiwgbHBTdHIgKTsKICAgICByZXR1cm4gVFJVRTsKLSAgfQotICBlbHNlIHsKKyAgfSBlbHNlIHsKICAgICBzdHJjcHkoIGxwU3RyLCBzICk7ICAgICAgICAgICAgICAgICAgICAgLyogZmlsZSBuYW1lICovCiAgICAgZHByaW50Zl9saXN0Ym94KCBzdGRkZWIsICJSZXR1cm5pbmcgJXNcbiIsIGxwU3RyICk7CiAgICAgcmV0dXJuIEZBTFNFOwpAQCAtMjExNiwyNyArMTc5OCwyNyBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIAkJCSAgIERsZ0Rpckxpc3QJCQkJW1VTRVIuMTAwXQorICogCQkJICAgRGxnRGlyTGlzdAkJICAgICAgIAlbVVNFUi4xMDBdCiAgKi8KIGludCBEbGdEaXJMaXN0KEhXTkQgaERsZywgTFBTVFIgbHBQYXRoU3BlYywgCi0JaW50IG5JRExCb3gsIGludCBuSURTdGF0LCBXT1JEIHdUeXBlKQorCSAgICAgICBpbnQgbklETEJveCwgaW50IG5JRFN0YXQsIFdPUkQgd1R5cGUpCiB7CiAgIEhXTkQJaFduZDsKICAgaW50IHJldDsKKyAgCiAgIGRwcmludGZfbGlzdGJveChzdGRkZWIsIkRsZ0Rpckxpc3QoJTA0WCwgJyVzJywgJWQsICVkLCAlMDRYKSBcbiIsCiAJCSAgaERsZywgbHBQYXRoU3BlYywgbklETEJveCwgbklEU3RhdCwgd1R5cGUpOwotICBpZiAobklETEJveCkKKyAgaWYgKG5JRExCb3gpICB7CisgICAgTFBIRUFETElTVCBscGhsOwogICAgIGhXbmQgPSBHZXREbGdJdGVtKGhEbGcsIG5JRExCb3gpOwotICBlbHNlCi0gICAgaFduZCA9IDA7Ci0gIGlmIChoV25kKQotICAgIExpc3RCb3hSZXNldENvbnRlbnQoaFduZCk7Ci0gIGlmIChoV25kKQotICAgIHJldD1MaXN0Qm94RGlyZWN0b3J5KGhXbmQsIHdUeXBlLCBscFBhdGhTcGVjKTsKLSAgZWxzZQotICAgIHJldD0wOwotICBpZiAobklEU3RhdCkKLSAgICB7CisgICAgbHBobCA9IExpc3RCb3hHZXRTdG9yYWdlSGVhZGVyKGhXbmQpOworICAgIExpc3RCb3hSZXNldENvbnRlbnQobHBobCk7CisgICAgcmV0ID0gTGlzdEJveERpcmVjdG9yeShscGhsLCB3VHlwZSwgbHBQYXRoU3BlYyk7CisgICAgTGlzdEJveFVwZGF0ZVdpbmRvdyhoV25kLCBscGhsLCBUUlVFKTsKKyAgfSBlbHNlIHsKKyAgICByZXQgPSAwOworICB9CisgIGlmIChuSURTdGF0KSB7CiAgICAgICBpbnQgZHJpdmU7CiAgICAgICBIQU5ETEUgaFRlbXA7CiAgICAgICBjaGFyICp0ZW1wOwpAQCAtMjE0OSw4ICsxODMxLDcgQEAKIAl0ZW1wWzJdID0gJzonOwogCVNlbmREbGdJdGVtTWVzc2FnZSggaERsZywgbklEU3RhdCwgV01fU0VUVEVYVCwgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVU0VSX0hFQVBfU0VHX0FERFIoaFRlbXApICsgMSApOwotICAgICAgfQotICAgICAgZWxzZSB7CisgICAgICB9IGVsc2UgewogCXRlbXBbMF0gPSAnQScrZHJpdmU7CiAJdGVtcFsxXSA9ICc6JzsKIAl0ZW1wWzJdID0gJ1xcJzsKQEAgLTIxNTgsNTMgKzE4MzksNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVTRVJfSEVBUF9TRUdfQUREUihoVGVtcCkgKTsKICAgICAgIH0KICAgICAgIFVTRVJfSEVBUF9GUkVFKCBoVGVtcCApOwotICAgIH0gCisgIH0gCiAgIHJldHVybiByZXQ7CiB9Ci0KLQotLyogUmV0dXJuczogMCBpZiBub3RoaW5nIG5lZWRzIHRvIGJlIGNoYW5nZWQgKi8KLS8qICAgICAgICAgIDEgaWYgRmlyc3RWaXNpYmxlIGNoYW5nZWQgKi8KLQotaW50IExpc3RCb3hTY3JvbGx0b0ZvY3VzKEhXTkQgaHduZCkKLQotewotICBXTkQgICp3bmRQdHI7Ci0gIExQSEVBRExJU1QgIGxwaGw7Ci0gIHNob3J0ICAgICAgIGVuZDsKLQotICBscGhsID0gTGlzdEJveEdldFdpbmRvd0FuZFN0b3JhZ2UoaHduZCwgJnduZFB0cik7Ci0KLSAgaWYgKGxwaGwtPkl0ZW1zQ291bnQgPT0gMCkgcmV0dXJuIDA7Ci0gIGlmIChscGhsLT5JdGVtRm9jdXNlZCA9PSAtMSkgcmV0dXJuIDA7Ci0KLSAgZW5kID0gbHBobC0+Rmlyc3RWaXNpYmxlICsgbHBobC0+SXRlbXNWaXNpYmxlIC0gMjsKLQotICBpZiAobHBobC0+SXRlbUZvY3VzZWQgPCBscGhsLT5GaXJzdFZpc2libGUgLSAxKSB7Ci0gICAgbHBobC0+Rmlyc3RWaXNpYmxlID0gbHBobC0+SXRlbUZvY3VzZWQgKyAxOwotICB9Ci0gIGVsc2UgaWYgKGxwaGwtPkl0ZW1Gb2N1c2VkID4gZW5kKSB7Ci0gICAgVUlOVCBtYXhGaXJzdFZpc2libGUgPSBMaXN0TWF4Rmlyc3RWaXNpYmxlKGxwaGwpOwotCi0gICAgbHBobC0+Rmlyc3RWaXNpYmxlID0gbHBobC0+SXRlbUZvY3VzZWQ7Ci0KLSAgICBpZiAobHBobC0+Rmlyc3RWaXNpYmxlID4gbWF4Rmlyc3RWaXNpYmxlKSB7Ci0gICAgICBscGhsLT5GaXJzdFZpc2libGUgPSBtYXhGaXJzdFZpc2libGU7Ci0gICAgfQotICB9IGVsc2UgcmV0dXJuIDA7Ci0KLSAgcmV0dXJuIDE7Ci19Ci0KLS8qIFNlbmQgbm90aWZpY2F0aW9uICJjb2RlIiBhcyBwYXJ0IG9mIGEgV01fQ09NTUFORC1tZXNzYWdlIGlmIGh3bmQKLSAgIGhhcyB0aGUgTEJTX05PVElGWSBzdHlsZSAqLwotdm9pZCBMaXN0Qm94U2VuZE5vdGlmaWNhdGlvbihIV05EIGh3bmQsIFdPUkQgY29kZSkKLXsKLSAgV05EICAqd25kUHRyOwotICBMUEhFQURMSVNUICBscGhsOwotICBscGhsID0gTGlzdEJveEdldFdpbmRvd0FuZFN0b3JhZ2UoaHduZCwgJnduZFB0cik7Ci0KLSAgaWYgKHduZFB0ciAmJiAod25kUHRyLT5kd1N0eWxlICYgTEJTX05PVElGWSkpCi0gICAgU2VuZE1lc3NhZ2UobHBobC0+aFduZExvZ2ljUGFyZW50LCBXTV9DT01NQU5ELAotCQl3bmRQdHItPndJRG1lbnUsIE1BS0VMT05HKGh3bmQsIGNvZGUpKTsKLX0KZGlmZiAtLWdpdCBhL2NvbnRyb2xzL21lbnUuYyBiL2NvbnRyb2xzL21lbnUuYwppbmRleCBiZTdkZjI3Li4wMWEwNDBjIDEwMDY0NAotLS0gYS9jb250cm9scy9tZW51LmMKKysrIGIvY29udHJvbHMvbWVudS5jCkBAIC0yMSw3ICsyMSw2IEBACiAjaW5jbHVkZSAibWVudS5oIgogI2luY2x1ZGUgInVzZXIuaCIKICNpbmNsdWRlICJ3aW4uaCIKLSNpbmNsdWRlICJsaWJyYXJ5LmgiCiAjaW5jbHVkZSAibWVzc2FnZS5oIgogI2luY2x1ZGUgImdyYXBoaWNzLmgiCiAjaW5jbHVkZSAic3RkZGVidWcuaCIKQEAgLTY2Nyw3ICs2NjYsNyBAQAogCW1lbnUtPkZvY3VzZWRJdGVtID0gTk9fU0VMRUNURURfSVRFTTsKICAgICB9CiAgICAgU2VuZE1lc3NhZ2UoIGh3bmRPd25lciwgV01fSU5JVE1FTlVQT1BVUCwgaG1lbnUsCi0JCSBNQUtFTE9ORyggaWQsIChtZW51LT53RmxhZ3MgJiBNRl9QT1BVUCkgPyAxIDogMCApKTsKKwkJIE1BS0VMT05HKCBpZCwgKG1lbnUtPndGbGFncyAmIE1GX1NZU01FTlUpID8gMSA6IDAgKSk7CiAgICAgTUVOVV9Qb3B1cE1lbnVDYWxjU2l6ZSggbWVudSwgaHduZE93bmVyICk7CiAgICAgaWYgKCFtZW51LT5oV25kKQogICAgIHsKQEAgLTc0MCw3ICs3MzksNyBAQAogCQkJICAgICAgICEobHBwb3AtPndGbGFncyAmIE1GX1BPUFVQKSApOwogCSAgICBkcHJpbnRmX21lbnUoc3RkZGViLCJTZW5kaW5nIFdNX01FTlVTRUxFQ1QgJTA0eCAlMDR4XG4iLCBpdGVtc1tscHBvcC0+Rm9jdXNlZEl0ZW1dLml0ZW1faWQsaXRlbXNbbHBwb3AtPkZvY3VzZWRJdGVtXS5pdGVtX2ZsYWdzKTsKIAkgICAgU2VuZE1lc3NhZ2UobHBwb3AtPmhXbmQsIFdNX01FTlVTRUxFQ1QsIGl0ZW1zW2xwcG9wLT5Gb2N1c2VkSXRlbV0uaXRlbV9pZCwKLQkJICAgICAgIE1BS0VMT05HKCBobWVudSwgaXRlbXNbbHBwb3AtPkZvY3VzZWRJdGVtXS5pdGVtX2ZsYWdzKSk7CisJCSAgICAgICBNQUtFTE9ORyggaXRlbXNbbHBwb3AtPkZvY3VzZWRJdGVtXS5pdGVtX2ZsYWdzIHwgTUZfTU9VU0VTRUxFQ1QsIGhtZW51KSk7CiAJfQogICAgIH0KICAgICBSZWxlYXNlREMoIGxwcG9wLT5oV25kLCBoZGMgKTsKZGlmZiAtLWdpdCBhL2NvbnRyb2xzL3dpZGdldHMuYyBiL2NvbnRyb2xzL3dpZGdldHMuYwppbmRleCBhMmYxN2E5Li5mODE2Yzc2IDEwMDY0NAotLS0gYS9jb250cm9scy93aWRnZXRzLmMKKysrIGIvY29udHJvbHMvd2lkZ2V0cy5jCkBAIC0yLDkgKzIsNyBAQAogICogV2luZG93cyB3aWRnZXRzIChidWlsdC1pbiB3aW5kb3cgY2xhc3NlcykKICAqCiAgKiBDb3B5cmlnaHQgMTk5MyBBbGV4YW5kcmUgSnVsbGlhcmQKLQotc3RhdGljIGNoYXIgQ29weXJpZ2h0W10gPSAiQ29weXJpZ2h0ICBBbGV4YW5kcmUgSnVsbGlhcmQsIDE5OTMiOwotKi8KKyAqLwogCiAjaW5jbHVkZSAid2luLmgiCiAjaW5jbHVkZSAiYnV0dG9uLmgiCkBAIC0xNSw2ICsxMyw3IEBACiAjaW5jbHVkZSAiZ2RpLmgiCiAjaW5jbHVkZSAidXNlci5oIgogI2luY2x1ZGUgInNlbGVjdG9ycy5oIgorI2luY2x1ZGUgInN0YWNrZnJhbWUuaCIKIAogCiBzdGF0aWMgV05EQ0xBU1MgV0lER0VUU19CdWlsdGluQ2xhc3Nlc1tdID0KQEAgLTI3LDggKzI2LDEwIEBACiAgICAgICBzaXplb2YoU0NST0xMSU5GTyksIDAsIDAsIDAsIDAsIE5VTEwsICJTQ1JPTExCQVIiIH0sCiAgICAgeyBDU19HTE9CQUxDTEFTUyB8IENTX1BBUkVOVERDIHwgQ1NfREJMQ0xLUywgKFdORFBST0MpIkxpc3RCb3hXbmRQcm9jIiwgMCwKICAgICAgIDgsIDAsIDAsIDAsIDAsIE5VTEwsICJMSVNUQk9YIiB9LAotICAgIHsgQ1NfR0xPQkFMQ0xBU1MgfCBDU19QQVJFTlREQyB8IENTX0RCTENMS1MsIChXTkRQUk9DKSJDb21ib0JveFduZFByb2MiLCAwLAorICAgIHsgQ1NfR0xPQkFMQ0xBU1MgfCBDU19QQVJFTlREQywgKFdORFBST0MpIkNvbWJvQm94V25kUHJvYyIsIDAsCiAgICAgICA4LCAwLCAwLCAwLCAwLCBOVUxMLCAiQ09NQk9CT1giIH0sCisgICAgeyBDU19HTE9CQUxDTEFTUyB8IENTX1BBUkVOVERDIHwgQ1NfREJMQ0xLUywgKFdORFBST0MpIkNvbWJvTEJveFduZFByb2MiLCAwLAorICAgICAgOCwgMCwgMCwgMCwgMCwgTlVMTCwgIkNPTUJPTEJPWCIgfSwKICAgICB7IENTX0dMT0JBTENMQVNTLCAoV05EUFJPQykiRWRpdFduZFByb2MiLCAwLAogICAgICAgc2l6ZW9mKFdPUkQpLCAwLCAwLCAwLCAwLCBOVUxMLCAiRURJVCIgfSwKICAgICB7IENTX0dMT0JBTENMQVNTIHwgQ1NfU0FWRUJJVFMsIChXTkRQUk9DKSJQb3B1cE1lbnVXbmRQcm9jIiwgMCwKQEAgLTUzLDIwICs1NCwxNiBAQAogQk9PTCBXSURHRVRTX0luaXQodm9pZCkKIHsKICAgICBpbnQgaTsKLSAgICBIQU5ETEUgaE5hbWU7Ci0gICAgY2hhciAqbmFtZTsKKyAgICBjaGFyIG5hbWVbMjBdOwogICAgIFdORENMQVNTICpjbGFzcyA9IFdJREdFVFNfQnVpbHRpbkNsYXNzZXM7CiAKLSAgICBpZiAoIShoTmFtZSA9IFVTRVJfSEVBUF9BTExPQyggMjAgKSkpIHJldHVybiBGQUxTRTsKLSAgICBuYW1lID0gVVNFUl9IRUFQX0xJTl9BRERSKCBoTmFtZSApOwogICAgIGZvciAoaSA9IDA7IGkgPCBOQl9CVUlMVElOX0NMQVNTRVM7IGkrKywgY2xhc3MrKykKICAgICB7CiAgICAgICAgIHN0cmNweSggbmFtZSwgY2xhc3MtPmxwc3pDbGFzc05hbWUgKTsKLSAgICAgICAgY2xhc3MtPmxwc3pDbGFzc05hbWUgPSAoTFBTVFIpVVNFUl9IRUFQX1NFR19BRERSKCBoTmFtZSApOworICAgICAgICBjbGFzcy0+bHBzekNsYXNzTmFtZSA9IChMUFNUUilNQUtFX1NFR1BUUihuYW1lKTsKIAljbGFzcy0+aEN1cnNvciA9IExvYWRDdXJzb3IoIDAsIElEQ19BUlJPVyApOwogICAgICAgICBjbGFzcy0+bHBmblduZFByb2MgPSBHZXRXbmRQcm9jRW50cnkxNiggKGNoYXIgKiljbGFzcy0+bHBmblduZFByb2MgKTsKIAlpZiAoIVJlZ2lzdGVyQ2xhc3MoIGNsYXNzICkpIHJldHVybiBGQUxTRTsKICAgICB9Ci0gICAgVVNFUl9IRUFQX0ZSRUUoIGhOYW1lICk7CiAgICAgcmV0dXJuIFRSVUU7CiB9CmRpZmYgLS1naXQgYS9kZWJ1Z2dlci9kYl9kaXNhc20uYyBiL2RlYnVnZ2VyL2RiX2Rpc2FzbS5jCmluZGV4IDU2OGE5MzMuLmZlNjQ1OTQgMTAwNjQ0Ci0tLSBhL2RlYnVnZ2VyL2RiX2Rpc2FzbS5jCisrKyBiL2RlYnVnZ2VyL2RiX2Rpc2FzbS5jCkBAIC03NCw2ICs3NCw4IEBACiAjaW5jbHVkZSAiZGJfZGlzYXNtLmgiCiAjaW5jbHVkZSAibGR0LmgiCiAKK2V4dGVybiB2b2lkIHByaW50X2FkZHJlc3ModW5zaWduZWQgaW50IGFkZHIsIEZJTEUgKiBvdXRmaWxlLCBpbnQgYWRkcmxlbik7CisKIC8qCiAgKiBTd2l0Y2ggdG8gZGlzYXNzZW1ibGUgMTYtYml0IGNvZGUuCiAgKi8KQEAgLTEwMTYsNyArMTAxOCw2IEBACiAKIHN0YXRpYyB2b2lkIGRiX3Rhc2tfcHJpbnRzeW0odW5zaWduZWQgaW50IGFkZHIsIGludCBzaXplKQogewotICAgIGV4dGVybiB2b2lkIHByaW50X2FkZHJlc3ModW5zaWduZWQgaW50IGFkZHIsIEZJTEUgKiBvdXRmaWxlLCBpbnQgYWRkcmxlbik7CiAgICAgc3dpdGNoKHNpemUpCiAgICAgewogICAgIGNhc2UgQllURToKQEAgLTE0ODYsNyArMTQ4NywxMCBAQAogCQkJZ2V0X3ZhbHVlX2luYyhpbW0sIGxvYywgNCwgRkFMU0UpOyAvKiBvZmZzZXQgKi8KIAkJICAgIH0KIAkJICAgIGdldF92YWx1ZV9pbmMoaW1tMiwgbG9jLCAyLCBGQUxTRSk7CS8qIHNlZ21lbnQgKi8KLQkJICAgIGZwcmludGYoc3RkZXJyLCIkJWQsJWQiLCBpbW0yLCBpbW0pOworICAgICAgICAgICAgICAgICAgICBpZiAoc2hvcnRfYWRkcikKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50X2FkZHJlc3MoIChpbW0yIDw8IDE2KSB8IGltbSwgc3RkZXJyLCAxNiApOworICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwiJDB4JXgsMHglMDh4IiwgaW1tMiwgaW1tKTsKIAkJICAgIGJyZWFrOwogCSAgICB9CiAJfQpkaWZmIC0tZ2l0IGEvZGVidWdnZXIvZGJnLnkgYi9kZWJ1Z2dlci9kYmcueQppbmRleCA1NGQ1OTkyLi5jZjdhM2QyIDEwMDY0NAotLS0gYS9kZWJ1Z2dlci9kYmcueQorKysgYi9kZWJ1Z2dlci9kYmcueQpAQCAtMTEsNiArMTEsOCBAQAogI2luY2x1ZGUgPHN0ZGlvLmg+CiAjaW5jbHVkZSA8c2lnbmFsLmg+CiAjaW5jbHVkZSAibGR0LmgiCisjaW5jbHVkZSAid2luZG93cy5oIgorI2luY2x1ZGUgIndpbmUuaCIKIAogI2RlZmluZSBZWVNUWVBFIGludAogCkBAIC00MSw2ICs0Myw3IEBACiAldG9rZW4gU0VUCiAldG9rZW4gTU9ERQogJXRva2VuIFBSSU5UCisldG9rZW4gRklMRV9JREVOVElGSUVSCiAldG9rZW4gSURFTlRJRklFUgogJXRva2VuIE5PX1NZTUJPTAogJXRva2VuIFNZTUJPTEZJTEUKQEAgLTYxLDggKzY0LDggQEAKIAl8IENPTlQgJ1xuJyAgICAgICAgeyByZXR1cm4gMDsgfQogCXwgJ2MnICdcbicgICAgICAgICB7IHJldHVybiAwOyB9CiAJfCBBQk9SVCAnXG4nICAgICAgIHsga2lsbChnZXRwaWQoKSwgU0lHQUJSVCk7IH0KLQl8IFNZTUJPTEZJTEUgSURFTlRJRklFUiAnXG4nIHsgcmVhZF9zeW1ib2x0YWJsZSgkMik7IH0KLQl8IERFRklORSBJREVOVElGSUVSIGV4cHIgJ1xuJyAgeyBhZGRfaGFzaCgkMiwgJDMpOyB9CisgCXwgU1lNQk9MRklMRSBGSUxFX0lERU5USUZJRVIgJ1xuJyB7IHJlYWRfc3ltYm9sdGFibGUoJDIpOyB9CisJfCBERUZJTkUgSURFTlRJRklFUiBleHByICdcbicgIHsgYWRkX2hhc2goJDIsIDAsICQzKTsgfQogCXwgTU9ERSBOVU0JICAgeyBtb2RlX2NvbW1hbmQoJDIpOyB9CiAJfCBFTkFCTEUgTlVNCSAgIHsgZW5hYmxlX2JyZWFrKCQyKTsgfQogCXwgRElTQUJMRSBOVU0JICAgeyBkaXNhYmxlX2JyZWFrKCQyKTsgfQpAQCAtMTUxLDYgKzE1NCw3IEBACiB3aW5lX2RlYnVnKGludCBzaWduYWwsIGludCAqIHJlZ3MpCiB7CiAJc3RhdGljIGludCBkdW1teV9yZWdzWzMyXTsKKwljaGFyIFN5bWJvbFRhYmxlRmlsZVsyNTZdOwogI2lmZGVmIFlZREVCVUcKIAl5eWRlYnVnID0gMDsKICNlbmRpZgpAQCAtMTU4LDM0ICsxNjIsMjMgQEAKIAl5eWluID0gc3RkaW47CiAJcmVndmFsID0gcmVncyA/IHJlZ3MgOiBkdW1teV9yZWdzOwogCi0jaWZkZWYgbGludXggICAgICAgIAotCWlmKChTQ19DUyAmIDcpICE9IDcpIHsKKwlpZiAoU0NfQ1MgPT0gV0lORV9DT0RFX1NFTEVDVE9SKQorICAgICAgICB7CiAJCWRiZ19tYXNrID0gMHhmZmZmZmZmZjsKIAkJZGJnX21vZGUgPSAzMjsKLQl9IGVsc2UgeworCX0gZWxzZQorICAgICAgICB7CiAJCWRiZ19tYXNrID0gMHhmZmZmOwogCQlkYmdfbW9kZSA9IDE2OwogCX0KLSNlbmRpZgotI2lmZGVmIF9fTmV0QlNEX18KLQlpZihTQ19DUyA9PSAweDFmKSB7Ci0JCWRiZ19tYXNrID0gMHhmZmZmZmZmZjsKLQkJZGJnX21vZGUgPSAzMjsKLQl9IGVsc2UgewotCQlkYmdfbWFzayA9IDB4ZmZmZjsKLQkJZGJnX21vZGUgPSAxNjsKLQl9Ci0jZW5kaWYKIAlmcHJpbnRmKHN0ZGVyciwiSW4gJWQgYml0IG1vZGUuXG4iLCBkYmdfbW9kZSk7CiAKLQkvKiBUaGlzIGlzIGludGVuZGVkIHRvIHJlYWQgdGhlIGVudHJ5IHBvaW50cyBmcm9tIHRoZSBXaW5kb3dzIGltYWdlLCBhbmQKLQkgICBpbnNlcnQgdGhlbSBpbiB0aGUgaGFzaCB0YWJsZS4gIEl0IGRvZXMgbm90IHdvcmsgeWV0LCBzbyBpdCBpcyBjb21tZW50ZWQgb3V0LiAqLwotCWlmKGRiZ19tb2RlID09IDMyICYmICFsb2FkZWRfc3ltYm9scyl7CisJaWYoZGJnX21vZGUgPT0gMzIgJiYgIWxvYWRlZF9zeW1ib2xzKQorICAgICAgICB7CiAJCWxvYWRlZF9zeW1ib2xzKys7Ci0JCXJlYWRfc3ltYm9sdGFibGUoIndpbmUuc3ltIik7Ci0jaWYgMAotCQlsb2FkX2VudHJ5cG9pbnRzKCk7Ci0jZW5kaWYKKwkJR2V0UHJpdmF0ZVByb2ZpbGVTdHJpbmcoIndpbmUiLCAiU3ltYm9sVGFibGVGaWxlIiwgIndpbmUuc3ltIiwKKwkJCVN5bWJvbFRhYmxlRmlsZSwgc2l6ZW9mKFN5bWJvbFRhYmxlRmlsZSksIFdJTkVfSU5JKTsKKwkJcmVhZF9zeW1ib2x0YWJsZShTeW1ib2xUYWJsZUZpbGUpOwogCX0KIAogCS8qIFJlbW92ZSB0aGUgYnJlYWtwb2ludHMgZnJvbSBtZW1vcnkuLi4gKi8KZGlmZiAtLWdpdCBhL2RlYnVnZ2VyL2RlYnVnLmwgYi9kZWJ1Z2dlci9kZWJ1Zy5sCmluZGV4IDNhMWE5MmUuLjE4YTZiNWEgMTAwNjQ0Ci0tLSBhL2RlYnVnZ2VyL2RlYnVnLmwKKysrIGIvZGVidWdnZXIvZGVidWcubApAQCAtMjksNiArMjksNyBAQAogSEVYRElHSVQgWzAtOWEtZkEtRl0KIAogSURFTlRJRklFUiBbX2EtekEtWlwufl1bX2EtekEtWjAtOVwufl0qCitGSUxFX0lERU5USUZJRVIgW19hLXpBLVpcLn4vXVtfYS16QS1aXC5+L10qCiAKICUlCiAKQEAgLTYxLDkgKzYyLDkgQEAKIAkJfQogCiAkcGMJCXsgeXlsdmFsID0gUk5fRUlQOyByZXR1cm4gUkVHO30KLSRzcAkJeyB5eWx2YWwgPSBSTl9FU1A7IHJldHVybiBSRUc7fQorJHNwCQl7IHl5bHZhbCA9IFJOX0VTUF9BVF9TSUdOQUw7IHJldHVybiBSRUc7fQogJGVpcAkJeyB5eWx2YWwgPSBSTl9FSVA7IHJldHVybiBSRUc7fQotJGVzcAkJeyB5eWx2YWwgPSBSTl9FU1A7IHJldHVybiBSRUc7fQorJGVzcAkJeyB5eWx2YWwgPSBSTl9FU1BfQVRfU0lHTkFMOyByZXR1cm4gUkVHO30KICRlYnAJCXsgeXlsdmFsID0gUk5fRUJQOyByZXR1cm4gUkVHO30KICRlYXgJCXsgeXlsdmFsID0gUk5fRUFYOyByZXR1cm4gUkVHO30KICRlYngJCXsgeXlsdmFsID0gUk5fRUJYOyByZXR1cm4gUkVHO30KQEAgLTExOSw2ICsxMjAsMTAgQEAKIAkgICAgICAgICAgcmV0dXJuIElERU5USUZJRVI7CiAJICAgICAgICAgfQogCit7RklMRV9JREVOVElGSUVSfSB7eXlsdmFsID0gKGludCkgbWFrZV9zeW1ib2woeXl0ZXh0KTsgCisJICAgICAgICAgIHJldHVybiBGSUxFX0lERU5USUZJRVI7CisJICAgICAgICAgfQorCiBbIFx0XSsgICAgICAgIC8qIEVhdCB1cCB3aGl0ZXNwYWNlICovCiAKIC4JCXsgaWYoc3ludGF4X2Vycm9yID09IDApIHsKQEAgLTIwMyw3ICsyMDgsNyBAQAogc3RhdGljIGludCBuZXh0X3N5bWJvbDsKIAogY2hhciAqIG1ha2Vfc3ltYm9sKGNoYXIgKiBzeW1ib2wpewotCXJldHVybiBsb2NhbF9zeW1ib2xzW25leHRfc3ltYm9sKytdID0gc3RyZHVwKHN5bWJvbCk7CisgICAgICAgIHJldHVybiBsb2NhbF9zeW1ib2xzW25leHRfc3ltYm9sKytdID0gc3RyZHVwKHN5bWJvbCk7CiB9CiAKIHZvaWQKZGlmZiAtLWdpdCBhL2RlYnVnZ2VyL2hhc2guYyBiL2RlYnVnZ2VyL2hhc2guYwppbmRleCAyNmQ4MjJiLi40ZGQ5M2FkIDEwMDY0NAotLS0gYS9kZWJ1Z2dlci9oYXNoLmMKKysrIGIvZGVidWdnZXIvaGFzaC5jCkBAIC0xMCwxMiArMTAsMTMgQEAKICNpbmNsdWRlIDxzdHJpbmcuaD4KICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KICNpbmNsdWRlIDxuZWV4ZS5oPgorI2luY2x1ZGUgIm1vZHVsZS5oIgogI2luY2x1ZGUgInNlbGVjdG9ycy5oIgotI2luY2x1ZGUgPHdpbmUuaD4KLSNpbmNsdWRlIDxkbGxzLmg+CisjaW5jbHVkZSAid2luZS5oIgogCiBzdHJ1Y3QgIG5hbWVfaGFzaHsKIAlzdHJ1Y3QgbmFtZV9oYXNoICogbmV4dDsKKyAgICAgICAgdW5zaWduZWQgc2hvcnQgc2VnbWVudDsKIAl1bnNpZ25lZCBpbnQgKiBhZGRyZXNzOwogCWNoYXIgKiBuYW1lOwogfTsKQEAgLTM2LDExICszNywxMyBAQAogfQogCiAKLXZvaWQgYWRkX2hhc2goY2hhciAqIG5hbWUsIHVuc2lnbmVkIGludCAqIGFkZHJlc3Mpewordm9pZCBhZGRfaGFzaChjaGFyICogbmFtZSwgdW5zaWduZWQgc2hvcnQgc2VnbWVudCwgdW5zaWduZWQgaW50ICogYWRkcmVzcykKK3sKIAlzdHJ1Y3QgbmFtZV9oYXNoICAqIG5ldzsKIAlpbnQgaGFzaDsKIAogCW5ldyA9IChzdHJ1Y3QgIG5hbWVfaGFzaCAqKSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCBuYW1lX2hhc2gpKTsKKyAgICAgICAgbmV3LT5zZWdtZW50ID0gc2VnbWVudDsKIAluZXctPmFkZHJlc3MgPSBhZGRyZXNzOwogCW5ldy0+bmFtZSA9IHN0cmR1cChuYW1lKTsKIAluZXctPm5leHQgPSBOVUxMOwpAQCAtNTEsNyArNTQsOCBAQAogCW5hbWVfaGFzaF90YWJsZVtoYXNoXSA9IG5ldzsKIH0KIAotdW5zaWduZWQgaW50ICogZmluZF9oYXNoKGNoYXIgKiBuYW1lKXsKK3Vuc2lnbmVkIGludCAqIGZpbmRfaGFzaChjaGFyICogbmFtZSkKK3sKIAljaGFyIGJ1ZmZlclsyNTZdOwogCXN0cnVjdCBuYW1lX2hhc2ggICogbmg7CiAKQEAgLTcyLDcgKzc2LDggQEAKIAogc3RhdGljIGNoYXIgbmFtZV9idWZmZXJbMjU2XTsKIAotY2hhciAqIGZpbmRfbmVhcmVzdF9zeW1ib2wodW5zaWduZWQgaW50ICogYWRkcmVzcyl7CitjaGFyICogZmluZF9uZWFyZXN0X3N5bWJvbCh1bnNpZ25lZCBpbnQgc2VnbWVudCwgdW5zaWduZWQgaW50ICogYWRkcmVzcykKK3sKIAlzdHJ1Y3QgbmFtZV9oYXNoICogbmVhcmVzdDsKIAlzdHJ1Y3QgbmFtZV9oYXNoIHN0YXJ0OwogCXN0cnVjdCBuYW1lX2hhc2ggICogbmg7CkBAIC04Myw4ICs4OCw5IEBACiAJCiAJZm9yKGk9MDsgaTxOUl9OQU1FX0hBU0g7IGkrKykgewogCQlmb3IobmggPSBuYW1lX2hhc2hfdGFibGVbaV07IG5oOyBuaCA9IG5oLT5uZXh0KQotCQkJaWYobmgtPmFkZHJlc3MgPD0gYWRkcmVzcyAmJiBuaC0+YWRkcmVzcyA+IG5lYXJlc3QtPmFkZHJlc3MpCi0JCQkJbmVhcmVzdCA9IG5oOworCQkJaWYgKG5oLT5zZWdtZW50ID09IHNlZ21lbnQgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuaC0+YWRkcmVzcyA8PSBhZGRyZXNzICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmgtPmFkZHJlc3MgPiBuZWFyZXN0LT5hZGRyZXNzKSBuZWFyZXN0ID0gbmg7CiAJfTsKIAlpZigodW5zaWduZWQgaW50KSBuZWFyZXN0LT5hZGRyZXNzID09IDApIHJldHVybiBOVUxMOwogCkBAIC0xMzYsNyArMTQyLDcgQEAKIAkJfTsKIAkJCiAJCW5hcmdzID0gc3NjYW5mKGJ1ZmZlciwgIiV4ICVjICVzIiwgJmFkZHIsICZ0eXBlLCBuYW1lKTsKLQkJYWRkX2hhc2gobmFtZSwgKHVuc2lnbmVkIGludCAqKSBhZGRyKTsKKwkJYWRkX2hhc2gobmFtZSwgMCwgKHVuc2lnbmVkIGludCAqKSBhZGRyKTsKICAgICAgIH07CiAgICAgICBmY2xvc2Uoc3ltYm9sZmlsZSk7CiB9CkBAIC0xNDcsMzMgKzE1Myw0MCBAQAogICogdGFibGVzIGNvcnJlY3RseSAKICAqLwogCi12b2lkCi1sb2FkX2VudHJ5cG9pbnRzKCl7Ci0JY2hhciBidWZmZXJbMjU2XTsKLQljaGFyICogY3BudDsKLQlpbnQgaiwgb3JkaW5hbCwgbGVuOwotCXVuc2lnbmVkIGludCBhZGRyZXNzOwordm9pZCBsb2FkX2VudHJ5cG9pbnRzKCBITU9EVUxFIGhNb2R1bGUgKQoreworICAgIGNoYXIgYnVmZmVyWzI1Nl07CisgICAgdW5zaWduZWQgY2hhciAqY3BudCwgKm5hbWU7CisgICAgTkVfTU9EVUxFICpwTW9kdWxlOworICAgIHVuc2lnbmVkIGludCBhZGRyZXNzOwogCi0jaWYgMAotCXN0cnVjdCB3X2ZpbGVzICogd3BudDsKLQlmb3Iod3BudCA9IHdpbmVfZmlsZXM7IHdwbnQ7IHdwbnQgPSB3cG50LT5uZXh0KXsKLQkJY3BudCAgPSB3cG50LT5uZS0+bnJuYW1lX3RhYmxlOwotCQl3aGlsZSgxPT0xKXsKLQkJCWlmKCAoKGludCkgY3BudCkgIC0gKChpbnQpd3BudC0+bmUtPm5ybmFtZV90YWJsZSkgPiAgCi0JCQkgICB3cG50LT5uZS0+bmVfaGVhZGVyLT5ucm5hbWVfdGFiX2xlbmd0aCkgIGJyZWFrOwotCQkJbGVuID0gKmNwbnQrKzsKLQkJCXN0cm5jcHkoYnVmZmVyLCBjcG50LCBsZW4pOwotCQkJYnVmZmVyW2xlbl0gPSAwOwotCQkJb3JkaW5hbCA9ICAqKCh1bnNpZ25lZCBzaG9ydCAqKSAgKGNwbnQgKyAgbGVuKSk7Ci0JCQlqID0gR2V0RW50cnlQb2ludEZyb21PcmRpbmFsKHdwbnQsIG9yZGluYWwpOwkJCi0JCQlhZGRyZXNzICA9IGogJiAweGZmZmY7Ci0JCQlqID0gaiA+PiAxNjsKLQkJCWFkZHJlc3MgfD0gd3BudC0+bmUtPnNlbGVjdG9yX3RhYmxlW2pdIDw8IDE2OwotCQkJZnByaW50ZihzdGRlcnIsIiVzIC0+ICV4XG4iLCBidWZmZXIsIGFkZHJlc3MpOwotCQkJYWRkX2hhc2goYnVmZmVyLCAodW5zaWduZWQgaW50ICopIGFkZHJlc3MpOwotCQkJY3BudCArPSBsZW4gKyAyOwotCQl9OwotCX07Ci0JcmV0dXJuOwotI2VuZGlmCisgICAgaWYgKCEocE1vZHVsZSA9IChORV9NT0RVTEUgKilHbG9iYWxMb2NrKCBoTW9kdWxlICkpKSByZXR1cm47CisgICAgbmFtZSA9ICh1bnNpZ25lZCBjaGFyICopcE1vZHVsZSArIHBNb2R1bGUtPm5hbWVfdGFibGU7CisKKyAgICAgIC8qIEZpcnN0IHNlYXJjaCB0aGUgcmVzaWRlbnQgbmFtZXMgKi8KKworICAgIGNwbnQgPSAodW5zaWduZWQgY2hhciAqKXBNb2R1bGUgKyBwTW9kdWxlLT5uYW1lX3RhYmxlOworICAgIHdoaWxlICgqY3BudCkKKyAgICB7CisgICAgICAgIGNwbnQgKz0gKmNwbnQgKyAxICsgc2l6ZW9mKFdPUkQpOworICAgICAgICBzcHJpbnRmKCBidWZmZXIsICIlKi4qcy4lKi4qcyIsICpuYW1lLCAqbmFtZSwgbmFtZSArIDEsCisgICAgICAgICAgICAgICAgICpjcG50LCAqY3BudCwgY3BudCArIDEgKTsKKyAgICAgICAgYWRkcmVzcyA9IE1PRFVMRV9HZXRFbnRyeVBvaW50KCBoTW9kdWxlLCAqKFdPUkQgKikoY3BudCArICpjcG50ICsgMSkgKTsKKyAgICAgICAgaWYgKGFkZHJlc3MpCisgICAgICAgICAgICBhZGRfaGFzaChidWZmZXIsIGFkZHJlc3MgPj4gMTYsICh1bnNpZ25lZCBpbnQqKShhZGRyZXNzICYgMHhmZmZmKSk7CisgICAgfQorCisgICAgICAvKiBOb3cgc2VhcmNoIHRoZSBub24tcmVzaWRlbnQgbmFtZXMgdGFibGUgKi8KKworICAgIGlmICghcE1vZHVsZS0+bnJuYW1lX2hhbmRsZSkgcmV0dXJuOyAgLyogTm8gbm9uLXJlc2lkZW50IHRhYmxlICovCisgICAgY3BudCA9IChjaGFyICopR2xvYmFsTG9jayggcE1vZHVsZS0+bnJuYW1lX2hhbmRsZSApOworICAgIHdoaWxlICgqY3BudCkKKyAgICB7CisgICAgICAgIGNwbnQgKz0gKmNwbnQgKyAxICsgc2l6ZW9mKFdPUkQpOworICAgICAgICBzcHJpbnRmKCBidWZmZXIsICIlKi4qcy4lKi4qcyIsICpuYW1lLCAqbmFtZSwgbmFtZSArIDEsCisgICAgICAgICAgICAgICAgICpjcG50LCAqY3BudCwgY3BudCArIDEgKTsKKyAgICAgICAgYWRkcmVzcyA9IE1PRFVMRV9HZXRFbnRyeVBvaW50KCBoTW9kdWxlLCAqKFdPUkQgKikoY3BudCArICpjcG50ICsgMSkgKTsKKyAgICAgICAgaWYgKGFkZHJlc3MpCisgICAgICAgICAgICBhZGRfaGFzaChidWZmZXIsIGFkZHJlc3MgPj4gMTYsICh1bnNpZ25lZCBpbnQqKShhZGRyZXNzICYgMHhmZmZmKSk7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvZGVidWdnZXIvaW5mby5jIGIvZGVidWdnZXIvaW5mby5jCmluZGV4IDgxNjYzMTAuLmIzMWVlYWUgMTAwNjQ0Ci0tLSBhL2RlYnVnZ2VyL2luZm8uYworKysgYi9kZWJ1Z2dlci9pbmZvLmMKQEAgLTIxLDE1ICsyMSwyMiBAQAogCiB2b2lkIHByaW50X2FkZHJlc3ModW5zaWduZWQgaW50IGFkZHIsIEZJTEUgKiBvdXRmaWxlLCBpbnQgYWRkcmxlbikKIHsKKyAgICBleHRlcm4gY2hhciAqIGZpbmRfbmVhcmVzdF9zeW1ib2wodW5zaWduZWQgc2hvcnQsIHVuc2lnbmVkIGludCAqKTsKKyAgICBjaGFyICpuYW1lOworCiAgICAgaWYgKGFkZHJsZW4gPT0gMTYpCiAgICAgewotICAgICAgICBmcHJpbnRmKCBvdXRmaWxlLCAiJTQuNHg6JTQuNHgiLCBhZGRyID4+IDE2LCBhZGRyICYgMHhmZmZmICk7CisgICAgICAgIG5hbWUgPSBmaW5kX25lYXJlc3Rfc3ltYm9sKCBhZGRyID4+IDE2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGludCAqKShhZGRyICYgMHhmZmZmKSApOworICAgICAgICBpZiAobmFtZSkKKyAgICAgICAgICAgIGZwcmludGYoIG91dGZpbGUsICIweCU0LjR4OjB4JTQuNHggKCVzKSIsCisgICAgICAgICAgICAgICAgICAgICBhZGRyID4+IDE2LCBhZGRyICYgMHhmZmZmLCBuYW1lICk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGZwcmludGYoIG91dGZpbGUsICIweCU0LjR4OjB4JTQuNHgiLCBhZGRyID4+IDE2LCBhZGRyICYgMHhmZmZmICk7CiAgICAgfQogICAgIGVsc2UKICAgICB7Ci0gICAgICAgIGV4dGVybiBjaGFyICogZmluZF9uZWFyZXN0X3N5bWJvbCh1bnNpZ25lZCBpbnQgKik7Ci0KLSAgICAgICAgY2hhciAqIG5hbWUgPSBmaW5kX25lYXJlc3Rfc3ltYm9sKCh1bnNpZ25lZCBpbnQgKikgYWRkcik7CisgICAgICAgIG5hbWUgPSBmaW5kX25lYXJlc3Rfc3ltYm9sKDAsICh1bnNpZ25lZCBpbnQgKikgYWRkcik7CiAJaWYobmFtZSkKIAkJZnByaW50ZihvdXRmaWxlLCIweCU4Ljh4KCVzKSIsIGFkZHIsIG5hbWUpOwogCWVsc2UKZGlmZiAtLWdpdCBhL2RlYnVnZ2VyL3JlYWRsaW5lL0ltYWtlZmlsZSBiL2RlYnVnZ2VyL3JlYWRsaW5lL0ltYWtlZmlsZQppbmRleCBmNzgwYmQ2Li5hZWJkMDNhIDEwMDY0NAotLS0gYS9kZWJ1Z2dlci9yZWFkbGluZS9JbWFrZWZpbGUKKysrIGIvZGVidWdnZXIvcmVhZGxpbmUvSW1ha2VmaWxlCkBAIC00LDcgKzQsNyBAQAogCiBZQUNDID0geWFjYyAtYiBkYmcgLWQKIAotREVGSU5FUwk9IC1EQU5TSV9BUlJPV1MgLURIQVZFX1RDR0VUQVRUUiAtREhJREUgLURVU0VfRElSRU5UIC1EU1lTX1VOSVgKK0VYVFJBX0RFRklORVM9IC1EQU5TSV9BUlJPV1MgLURIQVZFX1RDR0VUQVRUUiAtREhJREUgLURVU0VfRElSRU5UIC1EU1lTX1VOSVgKIAogU1JDUyA9IFwKIAljb21wbGV0ZS5jIFwKZGlmZiAtLWdpdCBhL2RlYnVnZ2VyL3JlZ3Bvcy5oIGIvZGVidWdnZXIvcmVncG9zLmgKaW5kZXggMzlkNGI1ZS4uZTQwNjhlMSAxMDA2NDQKLS0tIGEvZGVidWdnZXIvcmVncG9zLmgKKysrIGIvZGVidWdnZXIvcmVncG9zLmgKQEAgLTI1LDcgKzI1LDI4IEBACiAjZGVmaW5lICBSTl9DUjIJCQkyMQogI2VuZGlmCiAKLSNpZiBkZWZpbmVkKF9fTmV0QlNEX18pIHx8IGRlZmluZWQoX19GcmVlQlNEX18pCisjaWZkZWYgX19OZXRCU0RfXworLyogUmVnaXN0ZXIgbnVtYmVycyAqLworI2RlZmluZSAgUk5fR1MJCQkwCisjZGVmaW5lICBSTl9GUwkJCTEKKyNkZWZpbmUgIFJOX0VTCQkJMgorI2RlZmluZSAgUk5fRFMJCQkzCisjZGVmaW5lICBSTl9FREkgIAkJNAorI2RlZmluZSAgUk5fRVNJCQkJNQorI2RlZmluZSAgUk5fRUJQCQkJNgorI2RlZmluZSAgUk5fRUJYCQkJNworI2RlZmluZSAgUk5fRURYCQkJOAorI2RlZmluZSAgUk5fRUNYCQkJOQorI2RlZmluZSAgUk5fRUFYCQkJMTAKKyNkZWZpbmUgIFJOX0VJUAkJCTExCisjZGVmaW5lICBSTl9DUwkJCTEyCisjZGVmaW5lICBSTl9FRkxBR1MJCTEzCisjZGVmaW5lICBSTl9FU1BfQVRfU0lHTkFMCTE0CisjZGVmaW5lICBSTl9TUwkJCTE1CisjZGVmaW5lICBSTl9PTERNQVNLCQkxNworI2VuZGlmCisKKyNpZmRlZiBfX0ZyZWVCU0RfXwogI2RlZmluZSAgUk5fT0xETUFTSwkJMQogLyogUmVnaXN0ZXIgbnVtYmVycyAqLwogI2RlZmluZSAgUk5fRVNQCQkJMgpAQCAtNDMsNyArNjQsNyBAQAogI2RlZmluZSAgUk5fRURYCQkJMTQKICNkZWZpbmUgIFJOX0VDWAkJCTE1CiAjZGVmaW5lICBSTl9FQVgJCQkxNgotLyogTmV0QlNEIGRvZXNuJ3QgY29udGV4dCBzd2l0Y2ggZ3Mgb3IgZnMgKi8KKy8qIEZyZWVCU0QgZG9lc24ndCBzYXZlIGdzIG9yIGZzICovCiAjZGVmaW5lICBTQ19HUwkJCTB4MjcKICNkZWZpbmUgIFNDX0ZTCQkJMHgyNwogI2VuZGlmCkBAIC01NCwxMiArNzUsMTUgQEAKICNkZWZpbmUgIEkzODcJCQlyZWd2YWxbUk5fSTM4N10KICNkZWZpbmUgIENSMgkJCXJlZ3ZhbFtSTl9DUjJdCiAjZW5kaWYKKyNpZmRlZiBfX05ldEJTRF9fCisjZGVmaW5lICBTQ19HUwkJCXJlZ3ZhbFtSTl9HU10KKyNkZWZpbmUgIFNDX0ZTCQkJcmVndmFsW1JOX0ZTXQorI2VuZGlmCiAjZGVmaW5lICBTQ19FUwkJCXJlZ3ZhbFtSTl9FU10KICNkZWZpbmUgIFNDX0RTCQkJcmVndmFsW1JOX0RTXQogI2RlZmluZSAgU0NfRURJKGRiZ19tYXNrKSAgCShyZWd2YWxbUk5fRURJXSAmIGRiZ19tYXNrKQogI2RlZmluZSAgU0NfRVNJKGRiZ19tYXNrKQkocmVndmFsW1JOX0VTSV0gJiBkYmdfbWFzaykKICNkZWZpbmUgIFNDX0VCUChkYmdfbWFzaykJKHJlZ3ZhbFtSTl9FQlBdICYgZGJnX21hc2spCi0jZGVmaW5lICBTQ19FU1AoZGJnX21hc2spCShyZWd2YWxbUk5fRVNQXSAmIGRiZ19tYXNrKQogI2RlZmluZSAgU0NfRUJYKGRiZ19tYXNrKQkocmVndmFsW1JOX0VCWF0gJiBkYmdfbWFzaykKICNkZWZpbmUgIFNDX0VEWChkYmdfbWFzaykJKHJlZ3ZhbFtSTl9FRFhdICYgZGJnX21hc2spCiAjZGVmaW5lICBTQ19FQ1goZGJnX21hc2spCShyZWd2YWxbUk5fRUNYXSAmIGRiZ19tYXNrKQpAQCAtNzcsNiArMTAxLDYgQEAKICNkZWZpbmUgIFNDX0VJUChkYmdfbWFzaykJKHJlZ3ZhbFtSTl9FSVBdICYgZGJnX21hc2spCiAjZGVmaW5lICBTQ19DUwkJCXJlZ3ZhbFtSTl9DU10KICNkZWZpbmUgIFNDX0VGTEFHUwkJcmVndmFsW1JOX0VGTEFHU10KLSNkZWZpbmUgIEVTUF9BVF9TSUdOQUwJCXJlZ3ZhbFtSTl9FU1BfQVRfU0lHTkFMXQorI2RlZmluZSAgU0NfRVNQKGRiZ19tYXNrKQkocmVndmFsW1JOX0VTUF9BVF9TSUdOQUxdICYgZGJnX21hc2spCiAjZGVmaW5lICBTQ19TUwkJCXJlZ3ZhbFtSTl9TU10KICNkZWZpbmUgIE9MRE1BU0sJCXJlZ3ZhbFtSTl9PTERNQVNLXQpkaWZmIC0tZ2l0IGEvaWYxNjMyL0ltYWtlZmlsZSBiL2lmMTYzMi9JbWFrZWZpbGUKaW5kZXggYjM3OTBhZS4uNmUzMmNhYiAxMDA2NDQKLS0tIGEvaWYxNjMyL0ltYWtlZmlsZQorKysgYi9pZjE2MzIvSW1ha2VmaWxlCkBAIC01LDg3ICs1LDEwNSBAQAogCiBTUkNTID0gXAogCWNhbGxiYWNrLmMgXAotCXJlbGF5LmMKKwlyZWxheS5jIFwKKwlyZWxheTMyLmMKIAogI2lmZGVmIFdJTkVMSUIKIENBTExPQkpTID0KLURMTFMgPQorRExMUzE2ID0KK0RMTFMzMiA9CiAjZWxzZQogQ0FMTE9CSlMgPSBcCiAJY2FsbDE2Lm8gXAogCWNhbGwzMi5vCi1ETExTID0gXAotCWNvbW1kbGcgXAotCWNvbXBvYmogXAotCWRkZW1sIFwKLQlnZGkgXAotCWtlcm5lbCBcCi0Ja2V5Ym9hcmQgXAotCW1tc3lzdGVtIFwKLQltb3VzZSBcCi0Jb2xlMiBcCi0Jb2xlMmNvbnYgXAotCW9sZTJkaXNwIFwKLQlvbGUybmxzIFwKLQlvbGUycHJveCBcCi0Jb2xlY2xpIFwKLQlvbGVzdnIgXAotCXNoZWxsIFwKLQlzb3VuZCBcCi0Jc3RvcmFnZSBcCi0Jc3RyZXNzIFwKLQlzeXN0ZW0gXAotCXRvb2xoZWxwIFwKLQl1c2VyIFwKLQl3aW44N2VtIFwKLQl3aW5wcm9jcyBcCi0Jd2luc29jaworRExMUzE2ID0gXAorCWNvbW1kbGcuc3BlYyBcCisJY29tcG9iai5zcGVjIFwKKwlkZGVtbC5zcGVjIFwKKwlnZGkuc3BlYyBcCisJa2VybmVsLnNwZWMgXAorCWtleWJvYXJkLnNwZWMgXAorCW1tc3lzdGVtLnNwZWMgXAorCW1vdXNlLnNwZWMgXAorCW9sZTIuc3BlYyBcCisJb2xlMmNvbnYuc3BlYyBcCisJb2xlMmRpc3Auc3BlYyBcCisJb2xlMm5scy5zcGVjIFwKKwlvbGUycHJveC5zcGVjIFwKKwlvbGVjbGkuc3BlYyBcCisJb2xlc3ZyLnNwZWMgXAorCXNoZWxsLnNwZWMgXAorCXNvdW5kLnNwZWMgXAorCXN0b3JhZ2Uuc3BlYyBcCisJc3RyZXNzLnNwZWMgXAorCXN5c3RlbS5zcGVjIFwKKwl0b29saGVscC5zcGVjIFwKKwl1c2VyLnNwZWMgXAorCXdpbjg3ZW0uc3BlYyBcCisJd2lucHJvY3Muc3BlYyBcCisJd2luc29jay5zcGVjCitETExTMzIgPSBcCisJZ2RpMzIuc3BlYyBcCisJa2VybmVsMzIuc3BlYyBcCisJc2hlbGwzMi5zcGVjIFwKKwl1c2VyMzIuc3BlYyBcCisJd2lucHJvY3MzMi5zcGVjCiAjZW5kaWYKIAotT0JKUyA9ICQoU1JDUzouYz0ubykgJChDQUxMT0JKUykgJChETExTOiU9ZGxsXyUubykgJChETExTOiU9dGFiXyUubykKK09CSlMgPSAkKFNSQ1M6LmM9Lm8pICQoQ0FMTE9CSlMpICQoRExMUzE2Oi5zcGVjPS5vKSAkKERMTFMzMjouc3BlYz0ubykKIAogQlVJTEQgPSAkKFRPUCkvdG9vbHMvYnVpbGQKIAotI2RlZmluZSBNYWtlRGxsRnJvbVNwZWMobmFtZSkJCQkJCUBAXAotQ29uY2F0KGRsbF8sbmFtZS5TKSBDb25jYXQodGFiXyxuYW1lLmMpOiBuYW1lLnNwZWMgJChCVUlMRCkJQEBcCi0JJChCVUlMRCkgLXNwZWMgbmFtZS5zcGVjCQkJCUBAXAorI2RlZmluZSBNYWtlRGxsMTZGcm9tU3BlYyhuYW1lKQkJCUBAXAorbmFtZS5TIDogbmFtZS5zcGVjICQoQlVJTEQpCQkJQEBcCisJJChCVUlMRCkgLXNwZWMxNiBuYW1lLnNwZWMgPiBuYW1lLlMJQEBcCisKKyNkZWZpbmUgTWFrZURsbDMyRnJvbVNwZWMobmFtZSkJCQlAQFwKK25hbWUuYyA6IG5hbWUuc3BlYyAkKEJVSUxEKQkJCUBAXAorCSQoQlVJTEQpIC1zcGVjMzIgbmFtZS5zcGVjID4gbmFtZS5jCUBAXAogCiAvKgogICogSWYgeW91IGFkZCBhIG5ldyBzcGVjIGZpbGUsIGNvcHkgb25lIG9mIHRoZXNlIGxpbmVzCiAgKi8KLU1ha2VEbGxGcm9tU3BlYyhjb21tZGxnKQotTWFrZURsbEZyb21TcGVjKGNvbXBvYmopCi1NYWtlRGxsRnJvbVNwZWMoZGRlbWwpCi1NYWtlRGxsRnJvbVNwZWMoZ2RpKQotTWFrZURsbEZyb21TcGVjKGtlcm5lbCkKLU1ha2VEbGxGcm9tU3BlYyhrZXlib2FyZCkKLU1ha2VEbGxGcm9tU3BlYyhzaGVsbCkKLU1ha2VEbGxGcm9tU3BlYyhtbXN5c3RlbSkKLU1ha2VEbGxGcm9tU3BlYyhtb3VzZSkKLU1ha2VEbGxGcm9tU3BlYyhvbGUyKQotTWFrZURsbEZyb21TcGVjKG9sZTJjb252KQotTWFrZURsbEZyb21TcGVjKG9sZTJkaXNwKQotTWFrZURsbEZyb21TcGVjKG9sZTJubHMpCi1NYWtlRGxsRnJvbVNwZWMob2xlMnByb3gpCi1NYWtlRGxsRnJvbVNwZWMob2xlY2xpKQotTWFrZURsbEZyb21TcGVjKG9sZXN2cikKLU1ha2VEbGxGcm9tU3BlYyhzb3VuZCkKLU1ha2VEbGxGcm9tU3BlYyhzdG9yYWdlKQotTWFrZURsbEZyb21TcGVjKHN0cmVzcykKLU1ha2VEbGxGcm9tU3BlYyhzeXN0ZW0pCi1NYWtlRGxsRnJvbVNwZWModG9vbGhlbHApCi1NYWtlRGxsRnJvbVNwZWModXNlcikKLU1ha2VEbGxGcm9tU3BlYyh3aW44N2VtKQotTWFrZURsbEZyb21TcGVjKHdpbnByb2NzKQotTWFrZURsbEZyb21TcGVjKHdpbnNvY2spCitNYWtlRGxsMTZGcm9tU3BlYyhjb21tZGxnKQorTWFrZURsbDE2RnJvbVNwZWMoY29tcG9iaikKK01ha2VEbGwxNkZyb21TcGVjKGRkZW1sKQorTWFrZURsbDE2RnJvbVNwZWMoZ2RpKQorTWFrZURsbDE2RnJvbVNwZWMoa2VybmVsKQorTWFrZURsbDE2RnJvbVNwZWMoa2V5Ym9hcmQpCitNYWtlRGxsMTZGcm9tU3BlYyhzaGVsbCkKK01ha2VEbGwxNkZyb21TcGVjKG1tc3lzdGVtKQorTWFrZURsbDE2RnJvbVNwZWMobW91c2UpCitNYWtlRGxsMTZGcm9tU3BlYyhvbGUyKQorTWFrZURsbDE2RnJvbVNwZWMob2xlMmNvbnYpCitNYWtlRGxsMTZGcm9tU3BlYyhvbGUyZGlzcCkKK01ha2VEbGwxNkZyb21TcGVjKG9sZTJubHMpCitNYWtlRGxsMTZGcm9tU3BlYyhvbGUycHJveCkKK01ha2VEbGwxNkZyb21TcGVjKG9sZWNsaSkKK01ha2VEbGwxNkZyb21TcGVjKG9sZXN2cikKK01ha2VEbGwxNkZyb21TcGVjKHNvdW5kKQorTWFrZURsbDE2RnJvbVNwZWMoc3RvcmFnZSkKK01ha2VEbGwxNkZyb21TcGVjKHN0cmVzcykKK01ha2VEbGwxNkZyb21TcGVjKHN5c3RlbSkKK01ha2VEbGwxNkZyb21TcGVjKHRvb2xoZWxwKQorTWFrZURsbDE2RnJvbVNwZWModXNlcikKK01ha2VEbGwxNkZyb21TcGVjKHdpbjg3ZW0pCitNYWtlRGxsMTZGcm9tU3BlYyh3aW5wcm9jcykKK01ha2VEbGwxNkZyb21TcGVjKHdpbnNvY2spCisKK01ha2VEbGwzMkZyb21TcGVjKGdkaTMyKQorTWFrZURsbDMyRnJvbVNwZWMoa2VybmVsMzIpCitNYWtlRGxsMzJGcm9tU3BlYyhzaGVsbDMyKQorTWFrZURsbDMyRnJvbVNwZWModXNlcjMyKQorTWFrZURsbDMyRnJvbVNwZWMod2lucHJvY3MzMikKIAogV2luZVJlbG9jYXRhYmxlVGFyZ2V0KCQoTU9EVUxFKSwsJChPQkpTKSkKIERlcGVuZFRhcmdldCgpCiAKICNpZm5kZWYgV0lORUxJQgogCi1jYWxsMzIuUzogJChCVUlMRCkgJChETExTOiU9ZGxsXyUuUykKLQkkKEJVSUxEKSAtY2FsbDMyIGBjYXQgJChETExTOiU9ZGxsXyUuUykgfCBncmVwIENhbGxUbzMyXyB8IHNlZCAncy8uKkNhbGxUbzMyX1woLipcKS9cMS8nIHwgc29ydCB8IHVuaXFgID4gY2FsbDMyLlMKK2NhbGwzMi5TOiAkKEJVSUxEKSAkKERMTFMxNjouc3BlYz0uUykKKwkkKEJVSUxEKSAtY2FsbDMyIGBjYXQgJChETExTMTY6LnNwZWM9LlMpIHwgZ3JlcCBDYWxsVG8zMl8gfCBzZWQgJ3MvLipDYWxsVG8zMl9cKC4qXCkvXDEvJyB8IHNvcnQgfCB1bmlxYCA+IGNhbGwzMi5TCiAKIGNhbGwxNi5TOiAkKEJVSUxEKSAkKFRPUCkvaW5jbHVkZS9jYWxsYmFjay5oCiAJJChCVUlMRCkgLWNhbGwxNiBgY2F0ICQoVE9QKS9pbmNsdWRlL2NhbGxiYWNrLmggfCBncmVwICJleHRlcm4uKkNhbGxUbzE2XyIgfCBzZWQgJ3MvLipDYWxsVG8xNl9cKC4qXCkoLiovXDEvJyB8IHNvcnQgfCB1bmlxYCA+IGNhbGwxNi5TCkBAIC05Nyw0ICsxMTUsNCBAQAogaW5zdGFsbDo6CiAKIGNsZWFuOjoKLQkkKFJNKSBkbGxfKiB0YWJfKiBjYWxsMzIuUyBjYWxsMTYuUworCSQoUk0pICQoRExMUzE2Oi5zcGVjPS5TKSAkKERMTFMzMjouc3BlYz0uYykgY2FsbDMyLlMgY2FsbDE2LlMKZGlmZiAtLWdpdCBhL2lmMTYzMi9jb21tZGxnLnNwZWMgYi9pZjE2MzIvY29tbWRsZy5zcGVjCmluZGV4IGFiNzg2NTMuLjEyN2UwNjQgMTAwNjQ0Ci0tLSBhL2lmMTYzMi9jb21tZGxnLnNwZWMKKysrIGIvaWYxNjMyL2NvbW1kbGcuc3BlYwpAQCAtMTIsNyArMTIsNyBAQAogIDEyICAgcGFzY2FsICBSRVBMQUNFVEVYVChwdHIpIFJlcGxhY2VUZXh0CiAgMTMgICBwYXNjYWwgIEZJTkRURVhURExHUFJPQyh3b3JkIHdvcmQgd29yZCBsb25nKSBGaW5kVGV4dERsZ1Byb2MKICAxNCAgIHBhc2NhbCAgUkVQTEFDRVRFWFRETEdQUk9DKHdvcmQgd29yZCB3b3JkIGxvbmcpIFJlcGxhY2VUZXh0RGxnUHJvYwotIyAxNSAgIHBhc2NhbCAgQ0hPT1NFRk9OVCBleHBvcnRlZCwgc2hhcmVkIGRhdGEKKyAxNSAgIHN0dWIgIENob29zZUZvbnQKICMgMTYgICBwYXNjYWwgIEZPUk1BVENIQVJETEdQUk9DIGV4cG9ydGVkLCBzaGFyZWQgZGF0YQogIyAxOCAgIHBhc2NhbCAgRk9OVFNUWUxFRU5VTVBST0MgZXhwb3J0ZWQsIHNoYXJlZCBkYXRhCiAjIDE5ICAgcGFzY2FsICBGT05URkFNSUxZRU5VTVBST0MgZXhwb3J0ZWQsIHNoYXJlZCBkYXRhCmRpZmYgLS1naXQgYS9pZjE2MzIvZ2RpLnNwZWMgYi9pZjE2MzIvZ2RpLnNwZWMKaW5kZXggYTUxNGZjNi4uNTk4ZDI4OSAxMDA2NDQKLS0tIGEvaWYxNjMyL2dkaS5zcGVjCisrKyBiL2lmMTYzMi9nZGkuc3BlYwpAQCAtMjM0LDYgKzIzNCw3IEBACiAzNjggc3R1YiBSZXNpemVQYWxldHRlCiAzNzAgcGFzY2FsMTYgR2V0TmVhcmVzdFBhbGV0dGVJbmRleCh3b3JkIGxvbmcpIEdldE5lYXJlc3RQYWxldHRlSW5kZXgKIDM3MiBwYXNjYWwxNiBFeHRGbG9vZEZpbGwod29yZCBzX3dvcmQgc193b3JkIGxvbmcgd29yZCkgRXh0Rmxvb2RGaWxsCiszNzQgcGFzY2FsMTYgR2V0U3lzdGVtUGFsZXR0ZVVzZSh3b3JkKSBHZXRTeXN0ZW1QYWxldHRlVXNlCiAzNzUgcGFzY2FsMTYgR2V0U3lzdGVtUGFsZXR0ZUVudHJpZXMod29yZCB3b3JkIHdvcmQgcHRyKQogICAgICAgICAgICAgIEdldFN5c3RlbVBhbGV0dGVFbnRyaWVzCiAzNzYgc3R1YiBSZXNldERDCkBAIC0yNTIsNyArMjUzLDggQEAKIDQxMCBzdHViIElTVkFMSURNRVRBRklMRQogNDExIHBhc2NhbDE2IEdldEN1ckxvZ0ZvbnQod29yZCkgR2V0Q3VyTG9nRm9udAogNDEyIHN0dWIgSXNEQ0N1cnJlbnRQYWxldHRlCi00Mzkgc3R1YiBTdHJldGNoRElCaXRzCis0MzkgcGFzY2FsMTYgU3RyZXRjaERJQml0cyAod29yZCBzX3dvcmQgc193b3JkIHdvcmQgd29yZCB3b3JkIHdvcmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JkIHdvcmQgcHRyIHB0ciB3b3JkIGxvbmcpIFN0cmV0Y2hESUJpdHMKIDQ0MCBwYXNjYWwxNiBTZXRESUJpdHMod29yZCB3b3JkIHdvcmQgd29yZCBwdHIgcHRyIHdvcmQpIFNldERJQml0cwogNDQxIHBhc2NhbDE2IEdldERJQml0cyh3b3JkIHdvcmQgd29yZCB3b3JkIHB0ciBwdHIgd29yZCkgR2V0RElCaXRzCiA0NDIgcGFzY2FsMTYgQ3JlYXRlRElCaXRtYXAod29yZCBwdHIgbG9uZyBwdHIgcHRyIHdvcmQpIENyZWF0ZURJQml0bWFwCmRpZmYgLS1naXQgYS9pZjE2MzIvZ2RpMzIuc3BlYyBiL2lmMTYzMi9nZGkzMi5zcGVjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlNWIxZjQKLS0tIC9kZXYvbnVsbAorKysgYi9pZjE2MzIvZ2RpMzIuc3BlYwpAQCAtMCwwICsxLDM2NiBAQAorbmFtZQlnZGkzMgorYmFzZQkxCisKKzAwMDAgc3R1YiBBYm9ydERvYworMDAwMSBzdHViIEFib3J0UGF0aAorMDAwMiBzdHViIEFkZEZvbnRSZXNvdXJjZUEKKzAwMDMgc3R1YiBBZGRGb250UmVzb3VyY2VUcmFja2luZworMDAwNCBzdHViIEFkZEZvbnRSZXNvdXJjZVcKKzAwMDUgc3R1YiBBbmdsZUFyYworMDAwNiBzdHViIEFuaW1hdGVQYWxldHRlCiswMDA3IHN0dWIgQXJjCiswMDA4IHN0dWIgQXJjVG8KKzAwMDkgc3R1YiBCZWdpblBhdGgKKzAwMTAgc3R1YiBCaXRCbHQKKzAwMTEgc3R1YiBDYW5jZWxEQworMDAxMiBzdHViIENoZWNrQ29sb3JzSW5HYW11dAorMDAxMyBzdHViIENob29zZVBpeGVsRm9ybWF0CiswMDE0IHN0dWIgQ2hvcmQKKzAwMTUgc3R1YiBDbG9zZUVuaE1ldGFGaWxlCiswMDE2IHN0dWIgQ2xvc2VGaWd1cmUKKzAwMTcgc3R1YiBDbG9zZU1ldGFGaWxlCiswMDE4IHN0dWIgQ29sb3JNYXRjaFRvVGFyZ2V0CiswMDE5IHN0dWIgQ29tYmluZVJnbgorMDAyMCBzdHViIENvbWJpbmVUcmFuc2Zvcm0KKzAwMjEgc3R1YiBDb3B5RW5oTWV0YUZpbGVBCiswMDIyIHN0dWIgQ29weUVuaE1ldGFGaWxlVworMDAyMyBzdHViIENvcHlNZXRhRmlsZUEKKzAwMjQgc3R1YiBDb3B5TWV0YUZpbGVXCiswMDI1IHN0dWIgQ3JlYXRlQml0bWFwCiswMDI2IHN0dWIgQ3JlYXRlQml0bWFwSW5kaXJlY3QKKzAwMjcgc3R1YiBDcmVhdGVCcnVzaEluZGlyZWN0CiswMDI4IHN0dWIgQ3JlYXRlQ29sb3JTcGFjZUEKKzAwMjkgc3R1YiBDcmVhdGVDb2xvclNwYWNlVworMDAzMCBzdHViIENyZWF0ZUNvbXBhdGlibGVCaXRtYXAKKzAwMzEgc3R1YiBDcmVhdGVDb21wYXRpYmxlREMKKzAwMzIgc3R1YiBDcmVhdGVEQ0EKKzAwMzMgc3R1YiBDcmVhdGVEQ1cKKzAwMzQgc3R1YiBDcmVhdGVESUJQYXR0ZXJuQnJ1c2gKKzAwMzUgc3R1YiBDcmVhdGVESUJQYXR0ZXJuQnJ1c2hQdAorMDAzNiBzdHViIENyZWF0ZURJQlNlY3Rpb24KKzAwMzcgc3R1YiBDcmVhdGVESUJpdG1hcAorMDAzOCBzdHViIENyZWF0ZURpc2NhcmRhYmxlQml0bWFwCiswMDM5IHN0dWIgQ3JlYXRlRWxsaXB0aWNSZ24KKzAwNDAgc3R1YiBDcmVhdGVFbGxpcHRpY1JnbkluZGlyZWN0CiswMDQxIHN0dWIgQ3JlYXRlRW5oTWV0YUZpbGVBCiswMDQyIHN0dWIgQ3JlYXRlRW5oTWV0YUZpbGVXCiswMDQzIHN0dWIgQ3JlYXRlRm9udEEKKzAwNDQgc3R1YiBDcmVhdGVGb250SW5kaXJlY3RBCiswMDQ1IHN0dWIgQ3JlYXRlRm9udEluZGlyZWN0VworMDA0NiBzdHViIENyZWF0ZUZvbnRXCiswMDQ3IHN0dWIgQ3JlYXRlSGFsZnRvbmVQYWxldHRlCiswMDQ4IHN0dWIgQ3JlYXRlSGF0Y2hCcnVzaAorMDA0OSBzdHViIENyZWF0ZUlDQQorMDA1MCBzdHViIENyZWF0ZUlDVworMDA1MSBzdHViIENyZWF0ZU1ldGFGaWxlQQorMDA1MiBzdHViIENyZWF0ZU1ldGFGaWxlVworMDA1MyBzdHViIENyZWF0ZVBhbGV0dGUKKzAwNTQgc3R1YiBDcmVhdGVQYXR0ZXJuQnJ1c2gKKzAwNTUgc3R1YiBDcmVhdGVQZW4KKzAwNTYgc3R1YiBDcmVhdGVQZW5JbmRpcmVjdAorMDA1NyBzdHViIENyZWF0ZVBvbHlQb2x5Z29uUmduCiswMDU4IHN0dWIgQ3JlYXRlUG9seWdvblJnbgorMDA1OSBzdHViIENyZWF0ZVJlY3RSZ24KKzAwNjAgc3R1YiBDcmVhdGVSZWN0UmduSW5kaXJlY3QKKzAwNjEgc3R1YiBDcmVhdGVSb3VuZFJlY3RSZ24KKzAwNjIgc3R1YiBDcmVhdGVTY2FsYWJsZUZvbnRSZXNvdXJjZUEKKzAwNjMgc3R1YiBDcmVhdGVTY2FsYWJsZUZvbnRSZXNvdXJjZVcKKzAwNjQgc3R1YiBDcmVhdGVTb2xpZEJydXNoCiswMDY1IHN0dWIgRFB0b0xQCiswMDY2IHN0dWIgRGVsZXRlQ29sb3JTcGFjZQorMDA2NyBzdHViIERlbGV0ZURDCiswMDY4IHN0dWIgRGVsZXRlRW5oTWV0YUZpbGUKKzAwNjkgc3R1YiBEZWxldGVNZXRhRmlsZQorMDA3MCBzdHViIERlbGV0ZU9iamVjdAorMDA3MSBzdHViIERlc2NyaWJlUGl4ZWxGb3JtYXQKKzAwNzIgc3R1YiBEZXZpY2VDYXBhYmlsaXRpZXNFeEEKKzAwNzMgc3R1YiBEZXZpY2VDYXBhYmlsaXRpZXNFeFcKKzAwNzQgc3R1YiBEcmF3RXNjYXBlCiswMDc1IHN0dWIgRWxsaXBzZQorMDA3NiBzdHViIEVuZERvYworMDA3NyBzdHViIEVuZFBhZ2UKKzAwNzggc3R1YiBFbmRQYXRoCiswMDc5IHN0dWIgRW51bUVuaE1ldGFGaWxlCiswMDgwIHN0dWIgRW51bUZvbnRGYW1pbGllc0EKKzAwODEgc3R1YiBFbnVtRm9udEZhbWlsaWVzRXhBCiswMDgyIHN0dWIgRW51bUZvbnRGYW1pbGllc0V4VworMDA4MyBzdHViIEVudW1Gb250RmFtaWxpZXNXCiswMDg0IHN0dWIgRW51bUZvbnRzQQorMDA4NSBzdHViIEVudW1Gb250c1cKKzAwODYgc3R1YiBFbnVtSUNNUHJvZmlsZXNBCiswMDg3IHN0dWIgRW51bUlDTVByb2ZpbGVzVworMDA4OCBzdHViIEVudW1NZXRhRmlsZQorMDA4OSBzdHViIEVudW1PYmplY3RzCiswMDkwIHN0dWIgRXF1YWxSZ24KKzAwOTEgc3R1YiBFc2NhcGUKKzAwOTIgc3R1YiBFeGNsdWRlQ2xpcFJlY3QKKzAwOTMgc3R1YiBFeHRDcmVhdGVQZW4KKzAwOTQgc3R1YiBFeHRDcmVhdGVSZWdpb24KKzAwOTUgc3R1YiBFeHRFc2NhcGUKKzAwOTYgc3R1YiBFeHRGbG9vZEZpbGwKKzAwOTcgc3R1YiBFeHRTZWxlY3RDbGlwUmduCiswMDk4IHN0dWIgRXh0VGV4dE91dEEKKzAwOTkgc3R1YiBFeHRUZXh0T3V0VworMDEwMCBzdHViIEZpbGxQYXRoCiswMTAxIHN0dWIgRmlsbFJnbgorMDEwMiBzdHViIEZpeEJydXNoT3JnRXgKKzAxMDMgc3R1YiBGbGF0dGVuUGF0aAorMDEwNCBzdHViIEZsb29kRmlsbAorMDEwNSBzdHViIEZyYW1lUmduCiswMTA2IHN0dWIgRnJlZUltYWdlQ29sb3JNYXRjaGVyCiswMTA3IHN0dWIgR2RpQXNzb2NpYXRlT2JqZWN0CiswMTA4IHN0dWIgR2RpQ2xlYW5DYWNoZURDCiswMTA5IHN0dWIgR2RpQ29tbWVudAorMDExMCBzdHViIEdkaUNvbnZlcnRBbmRDaGVja0RDCiswMTExIHN0dWIgR2RpQ29udmVydEJpdG1hcAorMDExMiBzdHViIEdkaUNvbnZlcnRCcnVzaAorMDExMyBzdHViIEdkaUNvbnZlcnREQworMDExNCBzdHViIEdkaUNvbnZlcnRFbmhNZXRhRmlsZQorMDExNSBzdHViIEdkaUNvbnZlcnRGb250CiswMTE2IHN0dWIgR2RpQ29udmVydE1ldGFGaWxlUGljdAorMDExNyBzdHViIEdkaUNvbnZlcnRQYWxldHRlCiswMTE4IHN0dWIgR2RpQ29udmVydFJlZ2lvbgorMDExOSBzdHViIEdkaUNyZWF0ZUxvY2FsQml0bWFwCiswMTIwIHN0dWIgR2RpQ3JlYXRlTG9jYWxCcnVzaAorMDEyMSBzdHViIEdkaUNyZWF0ZUxvY2FsRW5oTWV0YUZpbGUKKzAxMjIgc3R1YiBHZGlDcmVhdGVMb2NhbEZvbnQKKzAxMjMgc3R1YiBHZGlDcmVhdGVMb2NhbE1ldGFGaWxlUGljdAorMDEyNCBzdHViIEdkaUNyZWF0ZUxvY2FsUGFsZXR0ZQorMDEyNSBzdHViIEdkaUNyZWF0ZUxvY2FsUmVnaW9uCiswMTI2IHN0dWIgR2RpRGVsZXRlTG9jYWxEQworMDEyNyBzdHViIEdkaURlbGV0ZUxvY2FsT2JqZWN0CiswMTI4IHN0dWIgR2RpRmx1c2gKKzAxMjkgc3R1YiBHZGlHZXRCYXRjaExpbWl0CiswMTMwIHN0dWIgR2RpR2V0TG9jYWxCcnVzaAorMDEzMSBzdHViIEdkaUdldExvY2FsREMKKzAxMzIgc3R1YiBHZGlHZXRMb2NhbEZvbnQKKzAxMzMgc3R1YiBHZGlJc01ldGFGaWxlREMKKzAxMzQgc3R1YiBHZGlQbGF5RENTY3JpcHQKKzAxMzUgc3R1YiBHZGlQbGF5Sm91cm5hbAorMDEzNiBzdHViIEdkaVBsYXlTY3JpcHQKKzAxMzcgc3R1YiBHZGlSZWxlYXNlTG9jYWxEQworMDEzOCBzdHViIEdkaVNldEF0dHJzCiswMTM5IHN0dWIgR2RpU2V0QmF0Y2hMaW1pdAorMDE0MCBzdHViIEdkaVNldFNlcnZlckF0dHIKKzAxNDEgc3R1YiBHZXRBcmNEaXJlY3Rpb24KKzAxNDIgc3R1YiBHZXRBc3BlY3RSYXRpb0ZpbHRlckV4CiswMTQzIHN0dWIgR2V0Qml0bWFwQml0cworMDE0NCBzdHViIEdldEJpdG1hcERpbWVuc2lvbkV4CiswMTQ1IHN0dWIgR2V0QmtDb2xvcgorMDE0NiBzdHViIEdldEJrTW9kZQorMDE0NyBzdHViIEdldEJvdW5kc1JlY3QKKzAxNDggc3R1YiBHZXRCcnVzaE9yZ0V4CiswMTQ5IHN0dWIgR2V0Q2hhckFCQ1dpZHRoc0EKKzAxNTAgc3R1YiBHZXRDaGFyQUJDV2lkdGhzRmxvYXRBCiswMTUxIHN0dWIgR2V0Q2hhckFCQ1dpZHRoc0Zsb2F0VworMDE1MiBzdHViIEdldENoYXJBQkNXaWR0aHNXCiswMTUzIHN0dWIgR2V0Q2hhcldpZHRoMzJBCiswMTU0IHN0dWIgR2V0Q2hhcldpZHRoMzJXCiswMTU1IHN0dWIgR2V0Q2hhcldpZHRoQQorMDE1NiBzdHViIEdldENoYXJXaWR0aEZsb2F0QQorMDE1NyBzdHViIEdldENoYXJXaWR0aEZsb2F0VworMDE1OCBzdHViIEdldENoYXJXaWR0aFcKKzAxNTkgc3R1YiBHZXRDaGFyV2lkdGhXT1cKKzAxNjAgc3R1YiBHZXRDaGFyYWN0ZXJQbGFjZW1lbnRBCiswMTYxIHN0dWIgR2V0Q2hhcmFjdGVyUGxhY2VtZW50VworMDE2MiBzdHViIEdldENsaXBCb3gKKzAxNjMgc3R1YiBHZXRDbGlwUmduCiswMTY0IHN0dWIgR2V0Q29sb3JBZGp1c3RtZW50CiswMTY1IHN0dWIgR2V0Q29sb3JTcGFjZQorMDE2NiBzdHViIEdldEN1cnJlbnRPYmplY3QKKzAxNjcgc3R1YiBHZXRDdXJyZW50UG9zaXRpb25FeAorMDE2OCBzdHViIEdldERDT3JnRXgKKzAxNjkgc3R1YiBHZXRESUJDb2xvclRhYmxlCiswMTcwIHN0dWIgR2V0RElCaXRzCiswMTcxIHN0dWIgR2V0RGV2aWNlQ2FwcworMDE3MiBzdHViIEdldERldmljZUdhbW1hUmFtcAorMDE3MyBzdHViIEdldEVUTQorMDE3NCBzdHViIEdldEVuaE1ldGFGaWxlQQorMDE3NSBzdHViIEdldEVuaE1ldGFGaWxlQml0cworMDE3NiBzdHViIEdldEVuaE1ldGFGaWxlRGVzY3JpcHRpb25BCiswMTc3IHN0dWIgR2V0RW5oTWV0YUZpbGVEZXNjcmlwdGlvblcKKzAxNzggc3R1YiBHZXRFbmhNZXRhRmlsZUhlYWRlcgorMDE3OSBzdHViIEdldEVuaE1ldGFGaWxlUGFsZXR0ZUVudHJpZXMKKzAxODAgc3R1YiBHZXRFbmhNZXRhRmlsZVcKKzAxODEgc3R1YiBHZXRGb250RGF0YQorMDE4MiBzdHViIEdldEZvbnRMYW5ndWFnZUluZm8KKzAxODMgc3R1YiBHZXRGb250UmVzb3VyY2VJbmZvCiswMTg0IHN0dWIgR2V0Rm9udFJlc291cmNlSW5mb1cKKzAxODUgc3R1YiBHZXRHbHlwaE91dGxpbmUKKzAxODYgc3R1YiBHZXRHbHlwaE91dGxpbmVBCiswMTg3IHN0dWIgR2V0R2x5cGhPdXRsaW5lVworMDE4OCBzdHViIEdldEdyYXBoaWNzTW9kZQorMDE4OSBzdHViIEdldElDTVByb2ZpbGVBCiswMTkwIHN0dWIgR2V0SUNNUHJvZmlsZVcKKzAxOTEgc3R1YiBHZXRLZXJuaW5nUGFpcnMKKzAxOTIgc3R1YiBHZXRLZXJuaW5nUGFpcnNBCiswMTkzIHN0dWIgR2V0S2VybmluZ1BhaXJzVworMDE5NCBzdHViIEdldExvZ0NvbG9yU3BhY2VBCiswMTk1IHN0dWIgR2V0TG9nQ29sb3JTcGFjZVcKKzAxOTYgc3R1YiBHZXRNYXBNb2RlCiswMTk3IHN0dWIgR2V0TWV0YUZpbGVBCiswMTk4IHN0dWIgR2V0TWV0YUZpbGVCaXRzRXgKKzAxOTkgc3R1YiBHZXRNZXRhRmlsZVcKKzAyMDAgc3R1YiBHZXRNZXRhUmduCiswMjAxIHN0dWIgR2V0TWl0ZXJMaW1pdAorMDIwMiBzdHViIEdldE5lYXJlc3RDb2xvcgorMDIwMyBzdHViIEdldE5lYXJlc3RQYWxldHRlSW5kZXgKKzAyMDQgc3R1YiBHZXRPYmplY3RBCiswMjA1IHN0dWIgR2V0T2JqZWN0VHlwZQorMDIwNiBzdHViIEdldE9iamVjdFcKKzAyMDcgc3R1YiBHZXRPdXRsaW5lVGV4dE1ldHJpY3NBCiswMjA4IHN0dWIgR2V0T3V0bGluZVRleHRNZXRyaWNzVworMDIwOSBzdHViIEdldFBhbGV0dGVFbnRyaWVzCiswMjEwIHN0dWIgR2V0UGF0aAorMDIxMSBzdHViIEdldFBpeGVsCiswMjEyIHN0dWIgR2V0UGl4ZWxGb3JtYXQKKzAyMTMgc3R1YiBHZXRQb2x5RmlsbE1vZGUKKzAyMTQgc3R1YiBHZXRST1AyCiswMjE1IHN0dWIgR2V0UmFuZG9tUmduCiswMjE2IHN0dWIgR2V0UmFzdGVyaXplckNhcHMKKzAyMTcgc3R1YiBHZXRSZWdpb25EYXRhCiswMjE4IHN0dWIgR2V0UmVsQWJzCiswMjE5IHN0dWIgR2V0UmduQm94CiswMjIwIHN0dWIgR2V0U3RvY2tPYmplY3QKKzAyMjEgc3R1YiBHZXRTdHJldGNoQmx0TW9kZQorMDIyMiBzdHViIEdldFN5c3RlbVBhbGV0dGVFbnRyaWVzCiswMjIzIHN0dWIgR2V0U3lzdGVtUGFsZXR0ZVVzZQorMDIyNCBzdHViIEdldFRleHRBbGlnbgorMDIyNSBzdHViIEdldFRleHRDaGFyYWN0ZXJFeHRyYQorMDIyNiBzdHViIEdldFRleHRDaGFyc2V0CiswMjI3IHN0dWIgR2V0VGV4dENvbG9yCiswMjI4IHN0dWIgR2V0VGV4dEV4dGVudEV4UG9pbnRBCiswMjI5IHN0dWIgR2V0VGV4dEV4dGVudEV4UG9pbnRXCiswMjMwIHN0dWIgR2V0VGV4dEV4dGVudFBvaW50MzJBCiswMjMxIHN0dWIgR2V0VGV4dEV4dGVudFBvaW50MzJXCiswMjMyIHN0dWIgR2V0VGV4dEV4dGVudFBvaW50QQorMDIzMyBzdHViIEdldFRleHRFeHRlbnRQb2ludFcKKzAyMzQgc3R1YiBHZXRUZXh0RmFjZUEKKzAyMzUgc3R1YiBHZXRUZXh0RmFjZVcKKzAyMzYgc3R1YiBHZXRUZXh0TWV0cmljc0EKKzAyMzcgc3R1YiBHZXRUZXh0TWV0cmljc1cKKzAyMzggc3R1YiBHZXRUcmFuc2Zvcm0KKzAyMzkgc3R1YiBHZXRWaWV3cG9ydEV4dEV4CiswMjQwIHN0dWIgR2V0Vmlld3BvcnRPcmdFeAorMDI0MSBzdHViIEdldFdpbk1ldGFGaWxlQml0cworMDI0MiBzdHViIEdldFdpbmRvd0V4dEV4CiswMjQzIHN0dWIgR2V0V2luZG93T3JnRXgKKzAyNDQgc3R1YiBHZXRXb3JsZFRyYW5zZm9ybQorMDI0NSBzdHViIEludGVyc2VjdENsaXBSZWN0CiswMjQ2IHN0dWIgSW52ZXJ0UmduCiswMjQ3IHN0dWIgTFB0b0RQCiswMjQ4IHN0dWIgTGluZUREQQorMDI0OSBzdHViIExpbmVUbworMDI1MCBzdHViIExvYWRJbWFnZUNvbG9yTWF0Y2hlckEKKzAyNTEgc3R1YiBMb2FkSW1hZ2VDb2xvck1hdGNoZXJXCiswMjUyIHN0dWIgTWFza0JsdAorMDI1MyBzdHViIE1vZGlmeVdvcmxkVHJhbnNmb3JtCiswMjU0IHN0dWIgTW92ZVRvRXgKKzAyNTUgc3R1YiBPZmZzZXRDbGlwUmduCiswMjU2IHN0dWIgT2Zmc2V0UmduCiswMjU3IHN0dWIgT2Zmc2V0Vmlld3BvcnRPcmdFeAorMDI1OCBzdHViIE9mZnNldFdpbmRvd09yZ0V4CiswMjU5IHN0dWIgUGFpbnRSZ24KKzAyNjAgc3R1YiBQYXRCbHQKKzAyNjEgc3R1YiBQYXRoVG9SZWdpb24KKzAyNjIgc3R1YiBQaWUKKzAyNjMgc3R1YiBQbGF5RW5oTWV0YUZpbGUKKzAyNjQgc3R1YiBQbGF5RW5oTWV0YUZpbGVSZWNvcmQKKzAyNjUgc3R1YiBQbGF5TWV0YUZpbGUKKzAyNjYgc3R1YiBQbGF5TWV0YUZpbGVSZWNvcmQKKzAyNjcgc3R1YiBQbGdCbHQKKzAyNjggc3R1YiBQb2x5QmV6aWVyCiswMjY5IHN0dWIgUG9seUJlemllclRvCiswMjcwIHN0dWIgUG9seURyYXcKKzAyNzEgc3R1YiBQb2x5UG9seWdvbgorMDI3MiBzdHViIFBvbHlQb2x5bGluZQorMDI3MyBzdHViIFBvbHlUZXh0T3V0QQorMDI3NCBzdHViIFBvbHlUZXh0T3V0VworMDI3NSBzdHViIFBvbHlnb24KKzAyNzYgc3R1YiBQb2x5bGluZQorMDI3NyBzdHViIFBvbHlsaW5lVG8KKzAyNzggc3R1YiBQdEluUmVnaW9uCiswMjc5IHN0dWIgUHRWaXNpYmxlCiswMjgwIHN0dWIgUmVhbGl6ZVBhbGV0dGUKKzAyODEgc3R1YiBSZWN0SW5SZWdpb24KKzAyODIgc3R1YiBSZWN0VmlzaWJsZQorMDI4MyBzdHViIFJlY3RhbmdsZQorMDI4NCBzdHViIFJlbW92ZUZvbnRSZXNvdXJjZUEKKzAyODUgc3R1YiBSZW1vdmVGb250UmVzb3VyY2VUcmFja2luZworMDI4NiBzdHViIFJlbW92ZUZvbnRSZXNvdXJjZVcKKzAyODcgc3R1YiBSZXNldERDQQorMDI4OCBzdHViIFJlc2V0RENXCiswMjg5IHN0dWIgUmVzaXplUGFsZXR0ZQorMDI5MCBzdHViIFJlc3RvcmVEQworMDI5MSBzdHViIFJvdW5kUmVjdAorMDI5MiBzdHViIFNhdmVEQworMDI5MyBzdHViIFNjYWxlVmlld3BvcnRFeHRFeAorMDI5NCBzdHViIFNjYWxlV2luZG93RXh0RXgKKzAyOTUgc3R1YiBTZWxlY3RCcnVzaExvY2FsCiswMjk2IHN0dWIgU2VsZWN0Q2xpcFBhdGgKKzAyOTcgc3R1YiBTZWxlY3RDbGlwUmduCiswMjk4IHN0dWIgU2VsZWN0Rm9udExvY2FsCiswMjk5IHN0dWIgU2VsZWN0T2JqZWN0CiswMzAwIHN0dWIgU2VsZWN0UGFsZXR0ZQorMDMwMSBzdHViIFNldEFib3J0UHJvYworMDMwMiBzdHViIFNldEFyY0RpcmVjdGlvbgorMDMwMyBzdHViIFNldEJpdG1hcEJpdHMKKzAzMDQgc3R1YiBTZXRCaXRtYXBEaW1lbnNpb25FeAorMDMwNSBzdHViIFNldEJrQ29sb3IKKzAzMDYgc3R1YiBTZXRCa01vZGUKKzAzMDcgc3R1YiBTZXRCb3VuZHNSZWN0CiswMzA4IHN0dWIgU2V0QnJ1c2hPcmdFeAorMDMwOSBzdHViIFNldENvbG9yQWRqdXN0bWVudAorMDMxMCBzdHViIFNldENvbG9yU3BhY2UKKzAzMTEgc3R1YiBTZXRESUJDb2xvclRhYmxlCiswMzEyIHN0dWIgU2V0RElCaXRzCiswMzEzIHN0dWIgU2V0RElCaXRzVG9EZXZpY2UKKzAzMTQgc3R1YiBTZXREZXZpY2VHYW1tYVJhbXAKKzAzMTUgc3R1YiBTZXRFbmhNZXRhRmlsZUJpdHMKKzAzMTYgc3R1YiBTZXRGb250RW51bWVyYXRpb24KKzAzMTcgc3R1YiBTZXRHcmFwaGljc01vZGUKKzAzMTggc3R1YiBTZXRJQ01Nb2RlCiswMzE5IHN0dWIgU2V0SUNNUHJvZmlsZUEKKzAzMjAgc3R1YiBTZXRJQ01Qcm9maWxlVworMDMyMSBzdHViIFNldE1hcE1vZGUKKzAzMjIgc3R1YiBTZXRNYXBwZXJGbGFncworMDMyMyBzdHViIFNldE1ldGFGaWxlQml0c0V4CiswMzI0IHN0dWIgU2V0TWV0YVJnbgorMDMyNSBzdHViIFNldE1pdGVyTGltaXQKKzAzMjYgc3R1YiBTZXRQYWxldHRlRW50cmllcworMDMyNyBzdHViIFNldFBpeGVsCiswMzI4IHN0dWIgU2V0UGl4ZWxGb3JtYXQKKzAzMjkgc3R1YiBTZXRQaXhlbFYKKzAzMzAgc3R1YiBTZXRQb2x5RmlsbE1vZGUKKzAzMzEgc3R1YiBTZXRST1AyCiswMzMyIHN0dWIgU2V0UmVjdFJnbgorMDMzMyBzdHViIFNldFJlbEFicworMDMzNCBzdHViIFNldFN0cmV0Y2hCbHRNb2RlCiswMzM1IHN0dWIgU2V0U3lzdGVtUGFsZXR0ZVVzZQorMDMzNiBzdHViIFNldFRleHRBbGlnbgorMDMzNyBzdHViIFNldFRleHRDaGFyYWN0ZXJFeHRyYQorMDMzOCBzdHViIFNldFRleHRDb2xvcgorMDMzOSBzdHViIFNldFRleHRKdXN0aWZpY2F0aW9uCiswMzQwIHN0dWIgU2V0Vmlld3BvcnRFeHRFeAorMDM0MSBzdHViIFNldFZpZXdwb3J0T3JnRXgKKzAzNDIgc3R1YiBTZXRWaXJ0dWFsUmVzb2x1dGlvbgorMDM0MyBzdHViIFNldFdpbk1ldGFGaWxlQml0cworMDM0NCBzdHViIFNldFdpbmRvd0V4dEV4CiswMzQ1IHN0dWIgU2V0V2luZG93T3JnRXgKKzAzNDYgc3R1YiBTZXRXb3JsZFRyYW5zZm9ybQorMDM0NyBzdHViIFN0YXJ0RG9jQQorMDM0OCBzdHViIFN0YXJ0RG9jVworMDM0OSBzdHViIFN0YXJ0UGFnZQorMDM1MCBzdHViIFN0cmV0Y2hCbHQKKzAzNTEgc3R1YiBTdHJldGNoRElCaXRzCiswMzUyIHN0dWIgU3Ryb2tlQW5kRmlsbFBhdGgKKzAzNTMgc3R1YiBTdHJva2VQYXRoCiswMzU0IHN0dWIgU3dhcEJ1ZmZlcnMKKzAzNTUgc3R1YiBUZXh0T3V0QQorMDM1NiBzdHViIFRleHRPdXRXCiswMzU3IHN0dWIgVW5sb2FkTmV0d29ya0ZvbnRzCiswMzU4IHN0dWIgVW5yZWFsaXplT2JqZWN0CiswMzU5IHN0dWIgVXBkYXRlQ29sb3JzCiswMzYwIHN0dWIgV2lkZW5QYXRoCiswMzYxIHN0dWIgcHN0YWNrQ29ubmVjdAorCmRpZmYgLS1naXQgYS9pZjE2MzIva2VybmVsLnNwZWMgYi9pZjE2MzIva2VybmVsLnNwZWMKaW5kZXggODkwODFmNC4uN2NhNjI2YyAxMDA2NDQKLS0tIGEvaWYxNjMyL2tlcm5lbC5zcGVjCisrKyBiL2lmMTYzMi9rZXJuZWwuc3BlYwpAQCAtNDEsNyArNDEsNyBAQAogNDEgIHJldHVybiBFbmFibGVEb3MgMCAwCiA0MiAgcmV0dXJuIERpc2FibGVEb3MgMCAwCiA0NSAgcGFzY2FsMTYgTG9hZE1vZHVsZShwdHIgcHRyKSBMb2FkTW9kdWxlCi00NiAgcGFzY2FsMTYgRnJlZU1vZHVsZSh3b3JkKSBGcmVlTGlicmFyeQorNDYgIHBhc2NhbDE2IEZyZWVNb2R1bGUod29yZCkgRnJlZU1vZHVsZQogNDcgIHBhc2NhbDE2IEdldE1vZHVsZUhhbmRsZShwdHIpIEdldE1vZHVsZUhhbmRsZQogNDggIHBhc2NhbDE2IEdldE1vZHVsZVVzYWdlKHdvcmQpIEdldE1vZHVsZVVzYWdlCiA0OSAgcGFzY2FsMTYgR2V0TW9kdWxlRmlsZU5hbWUod29yZCBwdHIgc193b3JkKSBHZXRNb2R1bGVGaWxlTmFtZQpAQCAtODIsMTEgKzgyLDExIEBACiA4NCAgcGFzY2FsIF9sbHNlZWsod29yZCBsb25nIHdvcmQpIF9sbHNlZWsKIDg1ICBwYXNjYWwxNiBfbG9wZW4ocHRyIHdvcmQpIF9sb3BlbgogODYgIHBhc2NhbDE2IF9sd3JpdGUod29yZCBwdHIgd29yZCkgX2x3cml0ZQotIzg3IFJFU0VSVkVENQorODcgCXN0dWIgUkVTRVJWRUQ1CiA4OCAgcGFzY2FsIGxzdHJjcHkoc2VncHRyIHNlZ3B0cikgbHN0cmNweQogODkgIHBhc2NhbCBsc3RyY2F0KHNlZ3B0ciBzZWdwdHIpIGxzdHJjYXQKIDkwICBwYXNjYWwxNiBsc3RybGVuKHB0cikgbHN0cmxlbgotOTEgIHJlZ2lzdGVyIEluaXRUYXNrKCkgS0VSTkVMX0luaXRUYXNrCis5MSAgcmVnaXN0ZXIgSW5pdFRhc2soKSBJbml0VGFzawogOTIgIHBhc2NhbDE2IEdldFRlbXBEcml2ZShieXRlKSBHZXRUZW1wRHJpdmUKIDkzICBwYXNjYWwxNiBHZXRDb2RlSGFuZGxlKHNlZ3B0cikgR2V0Q29kZUhhbmRsZQogOTQgIHN0dWIgRGVmaW5lSGFuZGxlVGFibGUKQEAgLTE2MSwyOSArMTYxLDI5IEBACiAxNzAgcGFzY2FsMTYgQWxsb2NDU3RvRFNBbGlhcyh3b3JkKSBBbGxvY0NTdG9EU0FsaWFzCiAxNzEgcGFzY2FsMTYgQWxsb2NEU3RvQ1NBbGlhcyh3b3JkKSBBbGxvY0RTdG9DU0FsaWFzCiAxNzIgcGFzY2FsMTYgQWxsb2NBbGlhcyh3b3JkKSBBbGxvY0NTdG9EU0FsaWFzCi0jMTczIF9fUk9NQklPUwotIzE3NCBfX0EwMDBICisxNzMgZXF1YXRlIF9fUk9NQklPUyAwCisxNzQgZXF1YXRlIF9fQTAwMEggMAogMTc1IHBhc2NhbDE2IEFsbG9jU2VsZWN0b3Iod29yZCkgQWxsb2NTZWxlY3RvcgogMTc2IHBhc2NhbDE2IEZyZWVTZWxlY3Rvcih3b3JkKSBGcmVlU2VsZWN0b3IKIDE3NyBwYXNjYWwxNiBQcmVzdG9DaGFuZ29TZWxlY3Rvcih3b3JkIHdvcmQpIFByZXN0b0NoYW5nb1NlbGVjdG9yCiAxNzggZXF1YXRlIF9fV0lORkxBR1MgMHg0MTMKLSMxNzkgX19EMDAwSAorMTc5IGVxdWF0ZSBfX0QwMDBIIDAKIDE4MCBwYXNjYWwxNiBMb25nUHRyQWRkKGxvbmcgbG9uZykgTG9uZ1B0ckFkZAotIzE4MSBfX0IwMDBICi0jMTgyIF9fQjgwMEgKLSMxODMgX18wMDAwSAorMTgxIGVxdWF0ZSBfX0IwMDBIIDAKKzE4MiBlcXVhdGUgX19CODAwSCAwCisxODMgZXF1YXRlIF9fMDAwMEggMAogMTg0IHBhc2NhbCBHbG9iYWxET1NBbGxvYyhsb25nKSBHbG9iYWxET1NBbGxvYwogMTg1IHBhc2NhbDE2IEdsb2JhbERPU0ZyZWUod29yZCkgR2xvYmFsRE9TRnJlZQogMTg2IHBhc2NhbCBHZXRTZWxlY3RvckJhc2Uod29yZCkgR2V0U2VsZWN0b3JCYXNlCiAxODcgcGFzY2FsMTYgU2V0U2VsZWN0b3JCYXNlKHdvcmQgbG9uZykgU2V0U2VsZWN0b3JCYXNlCiAxODggcGFzY2FsIEdldFNlbGVjdG9yTGltaXQod29yZCkgR2V0U2VsZWN0b3JMaW1pdAogMTg5IHBhc2NhbDE2IFNldFNlbGVjdG9yTGltaXQod29yZCBsb25nKSBTZXRTZWxlY3RvckxpbWl0Ci0jMTkwIF9fRTAwMEgKKzE5MCBlcXVhdGUgX19FMDAwSCAwCiAxOTEgcGFzY2FsMTYgR2xvYmFsUGFnZUxvY2sod29yZCkgR2xvYmFsUGFnZUxvY2sKIDE5MiBwYXNjYWwxNiBHbG9iYWxQYWdlVW5sb2NrKHdvcmQpIEdsb2JhbFBhZ2VVbmxvY2sKLSMxOTMgX18wMDQwSAotIzE5NCBfX0YwMDBICi0jMTk1IF9fQzAwMEgKKzE5MyBlcXVhdGUgX18wMDQwSCAwCisxOTQgZXF1YXRlIF9fRjAwMEggMAorMTk1IGVxdWF0ZSBfX0MwMDBIIDAKIDE5NiBwYXNjYWwxNiBTZWxlY3RvckFjY2Vzc1JpZ2h0cyh3b3JkIHdvcmQgd29yZCkgU2VsZWN0b3JBY2Nlc3NSaWdodHMKIDE5NyBwYXNjYWwxNiBHbG9iYWxGaXgod29yZCkgR2xvYmFsRml4CiAxOTggcGFzY2FsMTYgR2xvYmFsVW5maXgod29yZCkgR2xvYmFsVW5maXgKZGlmZiAtLWdpdCBhL2lmMTYzMi9rZXJuZWwzMi5zcGVjIGIvaWYxNjMyL2tlcm5lbDMyLnNwZWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWYwY2VlZQotLS0gL2Rldi9udWxsCisrKyBiL2lmMTYzMi9rZXJuZWwzMi5zcGVjCkBAIC0wLDAgKzEsNjIwIEBACituYW1lCWtlcm5lbDMyCitiYXNlCTEKKworMDAwMCBzdHViIEFkZEF0b21BCiswMDAxIHN0dWIgQWRkQXRvbVcKKzAwMDIgc3R1YiBBZGRDb25zb2xlQWxpYXNBCiswMDAzIHN0dWIgQWRkQ29uc29sZUFsaWFzVworMDAwNCBzdHViIEFsbG9jQ29uc29sZQorMDAwNSBzdHViIEFyZUZpbGVBcGlzQU5TSQorMDAwNiBzdHViIEJhY2t1cFJlYWQKKzAwMDcgc3R1YiBCYWNrdXBTZWVrCiswMDA4IHN0dWIgQmFja3VwV3JpdGUKKzAwMDkgc3R1YiBCYXNlQXR0YWNoQ29tcGxldGVUaHVuaworMDAxMCBzdHViIEJhc2VwRGVidWdEdW1wCiswMDExIHN0dWIgQmVlcAorMDAxMiBzdHViIEJlZ2luVXBkYXRlUmVzb3VyY2VBCiswMDEzIHN0dWIgQmVnaW5VcGRhdGVSZXNvdXJjZVcKKzAwMTQgc3R1YiBCdWlsZENvbW1EQ0JBCiswMDE1IHN0dWIgQnVpbGRDb21tRENCQW5kVGltZW91dHNBCiswMDE2IHN0dWIgQnVpbGRDb21tRENCQW5kVGltZW91dHNXCiswMDE3IHN0dWIgQnVpbGRDb21tRENCVworMDAxOCBzdHViIENhbGxOYW1lZFBpcGVBCiswMDE5IHN0dWIgQ2FsbE5hbWVkUGlwZVcKKzAwMjAgc3R1YiBDbGVhckNvbW1CcmVhaworMDAyMSBzdHViIENsZWFyQ29tbUVycm9yCiswMDIyIHN0dWIgQ2xvc2VDb25zb2xlSGFuZGxlCiswMDIzIHN0dWIgQ2xvc2VIYW5kbGUKKzAwMjQgc3R1YiBDbG9zZVByb2ZpbGVVc2VyTWFwcGluZworMDAyNSBzdHViIENtZEJhdE5vdGlmaWNhdGlvbgorMDAyNiBzdHViIENvbW1Db25maWdEaWFsb2dBCiswMDI3IHN0dWIgQ29tbUNvbmZpZ0RpYWxvZ1cKKzAwMjggc3R1YiBDb21wYXJlRmlsZVRpbWUKKzAwMjkgc3R1YiBDb21wYXJlU3RyaW5nQQorMDAzMCBzdHViIENvbXBhcmVTdHJpbmdXCiswMDMxIHN0dWIgQ29ubmVjdE5hbWVkUGlwZQorMDAzMiBzdHViIENvbnNvbGVNZW51Q29udHJvbAorMDAzMyBzdHViIENvbnNvbGVTdWJzdAorMDAzNCBzdHViIENvbnRpbnVlRGVidWdFdmVudAorMDAzNSBzdHViIENvbnZlcnREZWZhdWx0TG9jYWxlCiswMDM2IHN0dWIgQ29weUZpbGVBCiswMDM3IHN0dWIgQ29weUZpbGVXCiswMDM4IHN0dWIgQ3JlYXRlQ29uc29sZVNjcmVlbkJ1ZmZlcgorMDAzOSBzdHViIENyZWF0ZURpcmVjdG9yeUEKKzAwNDAgc3R1YiBDcmVhdGVEaXJlY3RvcnlFeEEKKzAwNDEgc3R1YiBDcmVhdGVEaXJlY3RvcnlFeFcKKzAwNDIgc3R1YiBDcmVhdGVEaXJlY3RvcnlXCiswMDQzIHN0dWIgQ3JlYXRlRXZlbnRBCiswMDQ0IHN0dWIgQ3JlYXRlRXZlbnRXCiswMDQ1IHN0dWIgQ3JlYXRlRmlsZUEKKzAwNDYgc3R1YiBDcmVhdGVGaWxlTWFwcGluZ0EKKzAwNDcgc3R1YiBDcmVhdGVGaWxlTWFwcGluZ1cKKzAwNDggc3R1YiBDcmVhdGVGaWxlVworMDA0OSBzdHViIENyZWF0ZUlvQ29tcGxldGlvblBvcnQKKzAwNTAgc3R1YiBDcmVhdGVNYWlsc2xvdEEKKzAwNTEgc3R1YiBDcmVhdGVNYWlsc2xvdFcKKzAwNTIgc3R1YiBDcmVhdGVNdXRleEEKKzAwNTMgc3R1YiBDcmVhdGVNdXRleFcKKzAwNTQgc3R1YiBDcmVhdGVOYW1lZFBpcGVBCiswMDU1IHN0dWIgQ3JlYXRlTmFtZWRQaXBlVworMDA1NiBzdHViIENyZWF0ZVBpcGUKKzAwNTcgc3R1YiBDcmVhdGVQcm9jZXNzQQorMDA1OCBzdHViIENyZWF0ZVByb2Nlc3NXCiswMDU5IHN0dWIgQ3JlYXRlUmVtb3RlVGhyZWFkCiswMDYwIHN0dWIgQ3JlYXRlU2VtYXBob3JlQQorMDA2MSBzdHViIENyZWF0ZVNlbWFwaG9yZVcKKzAwNjIgc3R1YiBDcmVhdGVUYXBlUGFydGl0aW9uCiswMDYzIHN0dWIgQ3JlYXRlVGhyZWFkCiswMDY0IHN0dWIgQ3JlYXRlVmlydHVhbEJ1ZmZlcgorMDA2NSBzdHViIERlYnVnQWN0aXZlUHJvY2VzcworMDA2NiBzdHViIERlYnVnQnJlYWsKKzAwNjcgc3R1YiBEZWZpbmVEb3NEZXZpY2VBCiswMDY4IHN0dWIgRGVmaW5lRG9zRGV2aWNlVworMDA2OSBzdHViIERlbGV0ZUF0b20KKzAwNzAgc3R1YiBEZWxldGVDcml0aWNhbFNlY3Rpb24KKzAwNzEgc3R1YiBEZWxldGVGaWxlQQorMDA3MiBzdHViIERlbGV0ZUZpbGVXCiswMDczIHN0dWIgRGV2aWNlSW9Db250cm9sCiswMDc0IHN0dWIgRGlzYWJsZVRocmVhZExpYnJhcnlDYWxscworMDA3NSBzdHViIERpc2Nvbm5lY3ROYW1lZFBpcGUKKzAwNzYgc3R1YiBEb3NEYXRlVGltZVRvRmlsZVRpbWUKKzAwNzcgc3R1YiBEdXBsaWNhdGVDb25zb2xlSGFuZGxlCiswMDc4IHN0dWIgRHVwbGljYXRlSGFuZGxlCiswMDc5IHN0dWIgRW5kVXBkYXRlUmVzb3VyY2VBCiswMDgwIHN0dWIgRW5kVXBkYXRlUmVzb3VyY2VXCiswMDgxIHN0dWIgRW50ZXJDcml0aWNhbFNlY3Rpb24KKzAwODIgc3R1YiBFbnVtQ2FsZW5kYXJJbmZvQQorMDA4MyBzdHViIEVudW1DYWxlbmRhckluZm9XCiswMDg0IHN0dWIgRW51bURhdGVGb3JtYXRzQQorMDA4NSBzdHViIEVudW1EYXRlRm9ybWF0c1cKKzAwODYgc3R1YiBFbnVtUmVzb3VyY2VMYW5ndWFnZXNBCiswMDg3IHN0dWIgRW51bVJlc291cmNlTGFuZ3VhZ2VzVworMDA4OCBzdHViIEVudW1SZXNvdXJjZU5hbWVzQQorMDA4OSBzdHViIEVudW1SZXNvdXJjZU5hbWVzVworMDA5MCBzdHViIEVudW1SZXNvdXJjZVR5cGVzQQorMDA5MSBzdHViIEVudW1SZXNvdXJjZVR5cGVzVworMDA5MiBzdHViIEVudW1TeXN0ZW1Db2RlUGFnZXNBCiswMDkzIHN0dWIgRW51bVN5c3RlbUNvZGVQYWdlc1cKKzAwOTQgc3R1YiBFbnVtU3lzdGVtTG9jYWxlc0EKKzAwOTUgc3R1YiBFbnVtU3lzdGVtTG9jYWxlc1cKKzAwOTYgc3R1YiBFbnVtVGltZUZvcm1hdHNBCiswMDk3IHN0dWIgRW51bVRpbWVGb3JtYXRzVworMDA5OCBzdHViIEVyYXNlVGFwZQorMDA5OSBzdHViIEVzY2FwZUNvbW1GdW5jdGlvbgorMDEwMCBzdHViIEV4aXRQcm9jZXNzCiswMTAxIHN0dWIgRXhpdFRocmVhZAorMDEwMiBzdHViIEV4aXRWRE0KKzAxMDMgc3R1YiBFeHBhbmRFbnZpcm9ubWVudFN0cmluZ3NBCiswMTA0IHN0dWIgRXhwYW5kRW52aXJvbm1lbnRTdHJpbmdzVworMDEwNSBzdHViIEV4cHVuZ2VDb25zb2xlQ29tbWFuZEhpc3RvcnlBCiswMTA2IHN0dWIgRXhwdW5nZUNvbnNvbGVDb21tYW5kSGlzdG9yeVcKKzAxMDcgc3R1YiBFeHRlbmRWaXJ0dWFsQnVmZmVyCiswMTA4IHN0dWIgRmF0YWxBcHBFeGl0QQorMDEwOSBzdHViIEZhdGFsQXBwRXhpdFcKKzAxMTAgc3R1YiBGYXRhbEV4aXQKKzAxMTEgc3R1YiBGaWxlVGltZVRvRG9zRGF0ZVRpbWUKKzAxMTIgc3R1YiBGaWxlVGltZVRvTG9jYWxGaWxlVGltZQorMDExMyBzdHViIEZpbGVUaW1lVG9TeXN0ZW1UaW1lCiswMTE0IHN0dWIgRmlsbENvbnNvbGVPdXRwdXRBdHRyaWJ1dGUKKzAxMTUgc3R1YiBGaWxsQ29uc29sZU91dHB1dENoYXJhY3RlckEKKzAxMTYgc3R1YiBGaWxsQ29uc29sZU91dHB1dENoYXJhY3RlclcKKzAxMTcgc3R1YiBGaW5kQXRvbUEKKzAxMTggc3R1YiBGaW5kQXRvbVcKKzAxMTkgc3R1YiBGaW5kQ2xvc2UKKzAxMjAgc3R1YiBGaW5kQ2xvc2VDaGFuZ2VOb3RpZmljYXRpb24KKzAxMjEgc3R1YiBGaW5kRmlyc3RDaGFuZ2VOb3RpZmljYXRpb25BCiswMTIyIHN0dWIgRmluZEZpcnN0Q2hhbmdlTm90aWZpY2F0aW9uVworMDEyMyBzdHViIEZpbmRGaXJzdEZpbGVBCiswMTI0IHN0dWIgRmluZEZpcnN0RmlsZVcKKzAxMjUgc3R1YiBGaW5kTmV4dENoYW5nZU5vdGlmaWNhdGlvbgorMDEyNiBzdHViIEZpbmROZXh0RmlsZUEKKzAxMjcgc3R1YiBGaW5kTmV4dEZpbGVXCiswMTI4IHN0dWIgRmluZFJlc291cmNlQQorMDEyOSBzdHViIEZpbmRSZXNvdXJjZUV4QQorMDEzMCBzdHViIEZpbmRSZXNvdXJjZUV4VworMDEzMSBzdHViIEZpbmRSZXNvdXJjZVcKKzAxMzIgc3R1YiBGbHVzaENvbnNvbGVJbnB1dEJ1ZmZlcgorMDEzMyBzdHViIEZsdXNoRmlsZUJ1ZmZlcnMKKzAxMzQgc3R1YiBGbHVzaEluc3RydWN0aW9uQ2FjaGUKKzAxMzUgc3R1YiBGbHVzaFZpZXdPZkZpbGUKKzAxMzYgc3R1YiBGb2xkU3RyaW5nQQorMDEzNyBzdHViIEZvbGRTdHJpbmdXCiswMTM4IHN0dWIgRm9ybWF0TWVzc2FnZUEKKzAxMzkgc3R1YiBGb3JtYXRNZXNzYWdlVworMDE0MCBzdHViIEZyZWVDb25zb2xlCiswMTQxIHN0dWIgRnJlZUVudmlyb25tZW50U3RyaW5nc0EKKzAxNDIgc3R1YiBGcmVlRW52aXJvbm1lbnRTdHJpbmdzVworMDE0MyBzdHViIEZyZWVMaWJyYXJ5CiswMTQ0IHN0dWIgRnJlZUxpYnJhcnlBbmRFeGl0VGhyZWFkCiswMTQ1IHN0dWIgRnJlZVJlc291cmNlCiswMTQ2IHN0dWIgRnJlZVZpcnR1YWxCdWZmZXIKKzAxNDcgc3R1YiBHZW5lcmF0ZUNvbnNvbGVDdHJsRXZlbnQKKzAxNDggc3R1YiBHZXRBQ1AKKzAxNDkgc3R1YiBHZXRBdG9tTmFtZUEKKzAxNTAgc3R1YiBHZXRBdG9tTmFtZVcKKzAxNTEgc3R1YiBHZXRCaW5hcnlUeXBlCiswMTUyIHN0dWIgR2V0QmluYXJ5VHlwZUEKKzAxNTMgc3R1YiBHZXRCaW5hcnlUeXBlVworMDE1NCBzdHViIEdldENQSW5mbworMDE1NSBzdHViIEdldENvbW1Db25maWcKKzAxNTYgc3R1YiBHZXRDb21tTWFzaworMDE1NyBzdHViIEdldENvbW1Nb2RlbVN0YXR1cworMDE1OCBzdHViIEdldENvbW1Qcm9wZXJ0aWVzCiswMTU5IHN0dWIgR2V0Q29tbVN0YXRlCiswMTYwIHN0dWIgR2V0Q29tbVRpbWVvdXRzCiswMTYxCXN0ZGNhbGwgR2V0Q29tbWFuZExpbmVBKCkJR2V0Q29tbWFuZExpbmVBCiswMTYyIHN0dWIgR2V0Q29tbWFuZExpbmVXCiswMTYzIHN0dWIgR2V0Q29tcHJlc3NlZEZpbGVTaXplQQorMDE2NCBzdHViIEdldENvbXByZXNzZWRGaWxlU2l6ZVcKKzAxNjUgc3R1YiBHZXRDb21wdXRlck5hbWVBCiswMTY2IHN0dWIgR2V0Q29tcHV0ZXJOYW1lVworMDE2NyBzdHViIEdldENvbnNvbGVBbGlhc0EKKzAxNjggc3R1YiBHZXRDb25zb2xlQWxpYXNFeGVzQQorMDE2OSBzdHViIEdldENvbnNvbGVBbGlhc0V4ZXNMZW5ndGhBCiswMTcwIHN0dWIgR2V0Q29uc29sZUFsaWFzRXhlc0xlbmd0aFcKKzAxNzEgc3R1YiBHZXRDb25zb2xlQWxpYXNFeGVzVworMDE3MiBzdHViIEdldENvbnNvbGVBbGlhc1cKKzAxNzMgc3R1YiBHZXRDb25zb2xlQWxpYXNlc0EKKzAxNzQgc3R1YiBHZXRDb25zb2xlQWxpYXNlc0xlbmd0aEEKKzAxNzUgc3R1YiBHZXRDb25zb2xlQWxpYXNlc0xlbmd0aFcKKzAxNzYgc3R1YiBHZXRDb25zb2xlQWxpYXNlc1cKKzAxNzcgc3R1YiBHZXRDb25zb2xlQ1AKKzAxNzggc3R1YiBHZXRDb25zb2xlQ29tbWFuZEhpc3RvcnlBCiswMTc5IHN0dWIgR2V0Q29uc29sZUNvbW1hbmRIaXN0b3J5TGVuZ3RoQQorMDE4MCBzdHViIEdldENvbnNvbGVDb21tYW5kSGlzdG9yeUxlbmd0aFcKKzAxODEgc3R1YiBHZXRDb25zb2xlQ29tbWFuZEhpc3RvcnlXCiswMTgyIHN0dWIgR2V0Q29uc29sZUN1cnNvckluZm8KKzAxODMgc3R1YiBHZXRDb25zb2xlRGlzcGxheU1vZGUKKzAxODQgc3R1YiBHZXRDb25zb2xlRm9udEluZm8KKzAxODUgc3R1YiBHZXRDb25zb2xlRm9udFNpemUKKzAxODYgc3R1YiBHZXRDb25zb2xlSGFyZHdhcmVTdGF0ZQorMDE4NyBzdHViIEdldENvbnNvbGVJbnB1dFdhaXRIYW5kbGUKKzAxODggc3R1YiBHZXRDb25zb2xlTW9kZQorMDE4OSBzdHViIEdldENvbnNvbGVPdXRwdXRDUAorMDE5MCBzdHViIEdldENvbnNvbGVTY3JlZW5CdWZmZXJJbmZvCiswMTkxIHN0dWIgR2V0Q29uc29sZVRpdGxlQQorMDE5MiBzdHViIEdldENvbnNvbGVUaXRsZVcKKzAxOTMgc3R1YiBHZXRDdXJyZW5jeUZvcm1hdEEKKzAxOTQgc3R1YiBHZXRDdXJyZW5jeUZvcm1hdFcKKzAxOTUgc3R1YiBHZXRDdXJyZW50Q29uc29sZUZvbnQKKzAxOTYgc3R1YiBHZXRDdXJyZW50RGlyZWN0b3J5QQorMDE5NyBzdHViIEdldEN1cnJlbnREaXJlY3RvcnlXCiswMTk4IHN0dWIgR2V0Q3VycmVudFByb2Nlc3MKKzAxOTkgc3R1YiBHZXRDdXJyZW50UHJvY2Vzc0lkCiswMjAwIHN0dWIgR2V0Q3VycmVudFRocmVhZAorMDIwMQlzdGRjYWxsIEdldEN1cnJlbnRUaHJlYWRJZCgpCUdldEN1cnJlbnRUaHJlYWRJZAorMDIwMiBzdHViIEdldERhdGVGb3JtYXRBCiswMjAzIHN0dWIgR2V0RGF0ZUZvcm1hdFcKKzAyMDQgc3R1YiBHZXREZWZhdWx0Q29tbUNvbmZpZ0EKKzAyMDUgc3R1YiBHZXREZWZhdWx0Q29tbUNvbmZpZ1cKKzAyMDYgc3R1YiBHZXREaXNrRnJlZVNwYWNlQQorMDIwNyBzdHViIEdldERpc2tGcmVlU3BhY2VXCiswMjA4IHN0dWIgR2V0RHJpdmVUeXBlQQorMDIwOSBzdHViIEdldERyaXZlVHlwZVcKKzAyMTAJc3RkY2FsbCBHZXRFbnZpcm9ubWVudFN0cmluZ3MoKQlHZXRFbnZpcm9ubWVudFN0cmluZ3MKKzAyMTEgc3R1YiBHZXRFbnZpcm9ubWVudFN0cmluZ3NBCiswMjEyIHN0dWIgR2V0RW52aXJvbm1lbnRTdHJpbmdzVworMDIxMyBzdHViIEdldEVudmlyb25tZW50VmFyaWFibGVBCiswMjE0IHN0dWIgR2V0RW52aXJvbm1lbnRWYXJpYWJsZVcKKzAyMTUgc3R1YiBHZXRFeGl0Q29kZVByb2Nlc3MKKzAyMTYgc3R1YiBHZXRFeGl0Q29kZVRocmVhZAorMDIxNyBzdHViIEdldEZpbGVBdHRyaWJ1dGVzQQorMDIxOCBzdHViIEdldEZpbGVBdHRyaWJ1dGVzVworMDIxOSBzdHViIEdldEZpbGVJbmZvcm1hdGlvbkJ5SGFuZGxlCiswMjIwIHN0dWIgR2V0RmlsZVNpemUKKzAyMjEgc3R1YiBHZXRGaWxlVGltZQorMDIyMiBzdHViIEdldEZpbGVUeXBlCiswMjIzIHN0dWIgR2V0RnVsbFBhdGhOYW1lQQorMDIyNCBzdHViIEdldEZ1bGxQYXRoTmFtZVcKKzAyMjUgc3R1YiBHZXRIYW5kbGVJbmZvcm1hdGlvbgorMDIyNiBzdHViIEdldExhcmdlc3RDb25zb2xlV2luZG93U2l6ZQorMDIyNyBzdHViIEdldExhc3RFcnJvcgorMDIyOCBzdHViIEdldExvY2FsVGltZQorMDIyOSBzdHViIEdldExvY2FsZUluZm9BCiswMjMwIHN0dWIgR2V0TG9jYWxlSW5mb1cKKzAyMzEgc3R1YiBHZXRMb2dpY2FsRHJpdmVTdHJpbmdzQQorMDIzMiBzdHViIEdldExvZ2ljYWxEcml2ZVN0cmluZ3NXCiswMjMzIHN0dWIgR2V0TG9naWNhbERyaXZlcworMDIzNCBzdHViIEdldE1haWxzbG90SW5mbworMDIzNQlyZXR1cm4gR2V0TW9kdWxlRmlsZU5hbWVBIDEyIDAKKzAyMzYgc3R1YiBHZXRNb2R1bGVGaWxlTmFtZVcKKzAyMzcJc3RkY2FsbCBHZXRNb2R1bGVIYW5kbGVBKHB0cikJR2V0TW9kdWxlSGFuZGxlCiswMjM4IHN0dWIgR2V0TW9kdWxlSGFuZGxlVworMDIzOSBzdHViIEdldE5hbWVkUGlwZUhhbmRsZVN0YXRlQQorMDI0MCBzdHViIEdldE5hbWVkUGlwZUhhbmRsZVN0YXRlVworMDI0MSBzdHViIEdldE5hbWVkUGlwZUluZm8KKzAyNDIgc3R1YiBHZXROZXh0VkRNQ29tbWFuZAorMDI0MyBzdHViIEdldE51bWJlckZvcm1hdEEKKzAyNDQgc3R1YiBHZXROdW1iZXJGb3JtYXRXCiswMjQ1IHN0dWIgR2V0TnVtYmVyT2ZDb25zb2xlRm9udHMKKzAyNDYgc3R1YiBHZXROdW1iZXJPZkNvbnNvbGVJbnB1dEV2ZW50cworMDI0NyBzdHViIEdldE51bWJlck9mQ29uc29sZU1vdXNlQnV0dG9ucworMDI0OCBzdHViIEdldE9FTUNQCiswMjQ5IHN0dWIgR2V0T3ZlcmxhcHBlZFJlc3VsdAorMDI1MCBzdHViIEdldFByaW9yaXR5Q2xhc3MKKzAyNTEgc3R1YiBHZXRQcml2YXRlUHJvZmlsZUludEEKKzAyNTIgc3R1YiBHZXRQcml2YXRlUHJvZmlsZUludFcKKzAyNTMgc3R1YiBHZXRQcml2YXRlUHJvZmlsZVNlY3Rpb25BCiswMjU0IHN0dWIgR2V0UHJpdmF0ZVByb2ZpbGVTZWN0aW9uVworMDI1NSBzdHViIEdldFByaXZhdGVQcm9maWxlU3RyaW5nQQorMDI1NiBzdHViIEdldFByaXZhdGVQcm9maWxlU3RyaW5nVworMDI1NyBzdHViIEdldFByb2NBZGRyZXNzCiswMjU4IHN0dWIgR2V0UHJvY2Vzc0FmZmluaXR5TWFzaworMDI1OQlyZXR1cm4gR2V0UHJvY2Vzc0hlYXAgMCAwCiswMjYwIHN0dWIgR2V0UHJvY2Vzc0hlYXBzCiswMjYxIHN0dWIgR2V0UHJvY2Vzc1NodXRkb3duUGFyYW1ldGVycworMDI2MiBzdHViIEdldFByb2Nlc3NUaW1lcworMDI2MyBzdHViIEdldFByb2Nlc3NXb3JraW5nU2V0U2l6ZQorMDI2NCBzdHViIEdldFByb2ZpbGVJbnRBCiswMjY1IHN0dWIgR2V0UHJvZmlsZUludFcKKzAyNjYgc3R1YiBHZXRQcm9maWxlU2VjdGlvbkEKKzAyNjcgc3R1YiBHZXRQcm9maWxlU2VjdGlvblcKKzAyNjggc3R1YiBHZXRQcm9maWxlU3RyaW5nQQorMDI2OSBzdHViIEdldFByb2ZpbGVTdHJpbmdXCiswMjcwIHN0dWIgR2V0UXVldWVkQ29tcGxldGlvblN0YXR1cworMDI3MSBzdHViIEdldFNob3J0UGF0aE5hbWVBCiswMjcyIHN0dWIgR2V0U2hvcnRQYXRoTmFtZVcKKzAyNzMJcmV0dXJuIEdldFN0YXJ0dXBJbmZvQSA0IDAKKzAyNzQgc3R1YiBHZXRTdGFydHVwSW5mb1cKKzAyNzUJc3RkY2FsbCBHZXRTdGRIYW5kbGUobG9uZykJR2V0U3RkSGFuZGxlCiswMjc2IHN0dWIgR2V0U3RyaW5nVHlwZUEKKzAyNzcgc3R1YiBHZXRTdHJpbmdUeXBlRXhBCiswMjc4IHN0dWIgR2V0U3RyaW5nVHlwZUV4VworMDI3OSBzdHViIEdldFN0cmluZ1R5cGVXCiswMjgwIHN0dWIgR2V0U3lzdGVtRGVmYXVsdExDSUQKKzAyODEgc3R1YiBHZXRTeXN0ZW1EZWZhdWx0TGFuZ0lECiswMjgyIHN0dWIgR2V0U3lzdGVtRGlyZWN0b3J5QQorMDI4MyBzdHViIEdldFN5c3RlbURpcmVjdG9yeVcKKzAyODQgc3R1YiBHZXRTeXN0ZW1JbmZvCiswMjg1IHN0dWIgR2V0U3lzdGVtVGltZQorMDI4NiBzdHViIEdldFN5c3RlbVRpbWVBZGp1c3RtZW50CiswMjg3IHN0dWIgR2V0VGFwZVBhcmFtZXRlcnMKKzAyODggc3R1YiBHZXRUYXBlUG9zaXRpb24KKzAyODkgc3R1YiBHZXRUYXBlU3RhdHVzCiswMjkwIHN0dWIgR2V0VGVtcEZpbGVOYW1lQQorMDI5MSBzdHViIEdldFRlbXBGaWxlTmFtZVcKKzAyOTIgc3R1YiBHZXRUZW1wUGF0aEEKKzAyOTMgc3R1YiBHZXRUZW1wUGF0aFcKKzAyOTQJc3RkY2FsbCBHZXRUaHJlYWRDb250ZXh0KGxvbmcgcHRyKQlHZXRUaHJlYWRDb250ZXh0CiswMjk1IHN0dWIgR2V0VGhyZWFkTG9jYWxlCiswMjk2IHN0dWIgR2V0VGhyZWFkUHJpb3JpdHkKKzAyOTcgc3R1YiBHZXRUaHJlYWRTZWxlY3RvckVudHJ5CiswMjk4IHN0dWIgR2V0VGhyZWFkVGltZXMKKzAyOTkgc3R1YiBHZXRUaWNrQ291bnQKKzAzMDAgc3R1YiBHZXRUaW1lRm9ybWF0QQorMDMwMSBzdHViIEdldFRpbWVGb3JtYXRXCiswMzAyIHN0dWIgR2V0VGltZVpvbmVJbmZvcm1hdGlvbgorMDMwMyBzdHViIEdldFVzZXJEZWZhdWx0TENJRAorMDMwNCBzdHViIEdldFVzZXJEZWZhdWx0TGFuZ0lECiswMzA1IHN0dWIgR2V0VkRNQ3VycmVudERpcmVjdG9yaWVzCisjVXNlIFdpbiAzLjEgR2V0VmVyc2lvbiBmb3Igbm93CiswMzA2CXN0ZGNhbGwgR2V0VmVyc2lvbigpCUdldFZlcnNpb24KKzAzMDcgc3R1YiBHZXRWZXJzaW9uRXhBCiswMzA4IHN0dWIgR2V0VmVyc2lvbkV4VworMDMwOSBzdHViIEdldFZvbHVtZUluZm9ybWF0aW9uQQorMDMxMCBzdHViIEdldFZvbHVtZUluZm9ybWF0aW9uVworMDMxMSBzdHViIEdldFdpbmRvd3NEaXJlY3RvcnlBCiswMzEyIHN0dWIgR2V0V2luZG93c0RpcmVjdG9yeVcKKzAzMTMgc3R1YiBHbG9iYWxBZGRBdG9tQQorMDMxNCBzdHViIEdsb2JhbEFkZEF0b21XCiswMzE1CXN0ZGNhbGwgR2xvYmFsQWxsb2MobG9uZyBsb25nKQlHbG9iYWxBbGxvYzMyCiswMzE2IHN0dWIgR2xvYmFsQ29tcGFjdAorMDMxNyBzdHViIEdsb2JhbERlbGV0ZUF0b20KKzAzMTggc3R1YiBHbG9iYWxGaW5kQXRvbUEKKzAzMTkgc3R1YiBHbG9iYWxGaW5kQXRvbVcKKzAzMjAgc3R1YiBHbG9iYWxGaXgKKzAzMjEgc3R1YiBHbG9iYWxGbGFncworMDMyMiBzdHViIEdsb2JhbEZyZWUKKzAzMjMgc3R1YiBHbG9iYWxHZXRBdG9tTmFtZUEKKzAzMjQgc3R1YiBHbG9iYWxHZXRBdG9tTmFtZVcKKzAzMjUgc3R1YiBHbG9iYWxIYW5kbGUKKzAzMjYgc3R1YiBHbG9iYWxMb2NrCiswMzI3IHN0dWIgR2xvYmFsTWVtb3J5U3RhdHVzCiswMzI4IHN0dWIgR2xvYmFsUmVBbGxvYworMDMyOSBzdHViIEdsb2JhbFNpemUKKzAzMzAgc3R1YiBHbG9iYWxVbldpcmUKKzAzMzEgc3R1YiBHbG9iYWxVbmZpeAorMDMzMiBzdHViIEdsb2JhbFVubG9jaworMDMzMyBzdHViIEdsb2JhbFdpcmUKKzAzMzQgc3R1YiBIZWFwQWxsb2MKKzAzMzUgc3R1YiBIZWFwQ29tcGFjdAorMDMzNiBzdHViIEhlYXBDcmVhdGUKKzAzMzcgc3R1YiBIZWFwRGVzdHJveQorMDMzOCBzdHViIEhlYXBGcmVlCiswMzM5IHN0dWIgSGVhcExvY2sKKzAzNDAgc3R1YiBIZWFwUmVBbGxvYworMDM0MSBzdHViIEhlYXBTaXplCiswMzQyIHN0dWIgSGVhcFVubG9jaworMDM0MyBzdHViIEhlYXBWYWxpZGF0ZQorMDM0NCBzdHViIEhlYXBXYWxrCiswMzQ1IHN0dWIgSW5pdEF0b21UYWJsZQorMDM0NiBzdHViIEluaXRpYWxpemVDcml0aWNhbFNlY3Rpb24KKzAzNDcgc3R1YiBJbnRlcmxvY2tlZERlY3JlbWVudAorMDM0OCBzdHViIEludGVybG9ja2VkRXhjaGFuZ2UKKzAzNDkgc3R1YiBJbnRlcmxvY2tlZEluY3JlbWVudAorMDM1MCBzdHViIEludmFsaWRhdGVDb25zb2xlRElCaXRzCiswMzUxIHN0dWIgSXNCYWRDb2RlUHRyCiswMzUyIHN0dWIgSXNCYWRIdWdlUmVhZFB0cgorMDM1MyBzdHViIElzQmFkSHVnZVdyaXRlUHRyCiswMzU0IHN0dWIgSXNCYWRSZWFkUHRyCiswMzU1IHN0dWIgSXNCYWRTdHJpbmdQdHJBCiswMzU2IHN0dWIgSXNCYWRTdHJpbmdQdHJXCiswMzU3IHN0dWIgSXNCYWRXcml0ZVB0cgorMDM1OCBzdHViIElzREJDU0xlYWRCeXRlCiswMzU5IHN0dWIgSXNEQkNTTGVhZEJ5dGVFeAorMDM2MCBzdHViIElzVmFsaWRDb2RlUGFnZQorMDM2MSBzdHViIElzVmFsaWRMb2NhbGUKKzAzNjIgc3R1YiBMQ01hcFN0cmluZ0EKKzAzNjMgc3R1YiBMQ01hcFN0cmluZ1cKKzAzNjQgc3R1YiBMZWF2ZUNyaXRpY2FsU2VjdGlvbgorMDM2NSBzdHViIExvYWRMaWJyYXJ5QQorMDM2NiBzdHViIExvYWRMaWJyYXJ5RXhBCiswMzY3IHN0dWIgTG9hZExpYnJhcnlFeFcKKzAzNjggc3R1YiBMb2FkTGlicmFyeVcKKzAzNjkgc3R1YiBMb2FkTW9kdWxlCiswMzcwIHN0dWIgTG9hZFJlc291cmNlCiswMzcxCXN0ZGNhbGwgTG9jYWxBbGxvYyhsb25nIGxvbmcpCUdsb2JhbEFsbG9jMzIKKzAzNzIgc3R1YiBMb2NhbENvbXBhY3QKKzAzNzMgc3R1YiBMb2NhbEZpbGVUaW1lVG9GaWxlVGltZQorMDM3NCBzdHViIExvY2FsRmxhZ3MKKzAzNzUgc3R1YiBMb2NhbEZyZWUKKzAzNzYgc3R1YiBMb2NhbEhhbmRsZQorMDM3NyBzdHViIExvY2FsTG9jaworMDM3OCBzdHViIExvY2FsUmVBbGxvYworMDM3OSBzdHViIExvY2FsU2hyaW5rCiswMzgwIHN0dWIgTG9jYWxTaXplCiswMzgxIHN0dWIgTG9jYWxVbmxvY2sKKzAzODIgc3R1YiBMb2NrRmlsZQorMDM4MyBzdHViIExvY2tGaWxlRXgKKzAzODQgc3R1YiBMb2NrUmVzb3VyY2UKKzAzODUgc3R1YiBNYXBWaWV3T2ZGaWxlCiswMzg2IHN0dWIgTWFwVmlld09mRmlsZUV4CiswMzg3IHN0dWIgTW92ZUZpbGVBCiswMzg4IHN0dWIgTW92ZUZpbGVFeEEKKzAzODkgc3R1YiBNb3ZlRmlsZUV4VworMDM5MCBzdHViIE1vdmVGaWxlVworMDM5MSBzdHViIE11bERpdgorMDM5MiBzdHViIE11bHRpQnl0ZVRvV2lkZUNoYXIKKzAzOTMgc3R1YiBPcGVuQ29uc29sZVcKKzAzOTQgc3R1YiBPcGVuRXZlbnRBCiswMzk1IHN0dWIgT3BlbkV2ZW50VworMDM5NiBzdHViIE9wZW5GaWxlCiswMzk3IHN0dWIgT3BlbkZpbGVNYXBwaW5nQQorMDM5OCBzdHViIE9wZW5GaWxlTWFwcGluZ1cKKzAzOTkgc3R1YiBPcGVuTXV0ZXhBCiswNDAwIHN0dWIgT3Blbk11dGV4VworMDQwMSBzdHViIE9wZW5Qcm9jZXNzCiswNDAyIHN0dWIgT3BlblByb2ZpbGVVc2VyTWFwcGluZworMDQwMyBzdHViIE9wZW5TZW1hcGhvcmVBCiswNDA0IHN0dWIgT3BlblNlbWFwaG9yZVcKKzA0MDUgc3R1YiBPdXRwdXREZWJ1Z1N0cmluZ0EKKzA0MDYgc3R1YiBPdXRwdXREZWJ1Z1N0cmluZ1cKKzA0MDcgc3R1YiBQZWVrQ29uc29sZUlucHV0QQorMDQwOCBzdHViIFBlZWtDb25zb2xlSW5wdXRXCiswNDA5IHN0dWIgUGVla05hbWVkUGlwZQorMDQxMCBzdHViIFByZXBhcmVUYXBlCiswNDExIHN0dWIgUHVsc2VFdmVudAorMDQxMiBzdHViIFB1cmdlQ29tbQorMDQxMyBzdHViIFF1ZXJ5RG9zRGV2aWNlQQorMDQxNCBzdHViIFF1ZXJ5RG9zRGV2aWNlVworMDQxNSBzdHViIFF1ZXJ5UGVyZm9ybWFuY2VDb3VudGVyCiswNDE2IHN0dWIgUXVlcnlQZXJmb3JtYW5jZUZyZXF1ZW5jeQorMDQxNyBzdHViIFF1ZXJ5V2luMzFJbmlGaWxlc01hcHBlZFRvUmVnaXN0cnkKKzA0MTggc3R1YiBSYWlzZUV4Y2VwdGlvbgorMDQxOSBzdHViIFJlYWRDb25zb2xlQQorMDQyMCBzdHViIFJlYWRDb25zb2xlSW5wdXRBCiswNDIxIHN0dWIgUmVhZENvbnNvbGVJbnB1dFcKKzA0MjIgc3R1YiBSZWFkQ29uc29sZU91dHB1dEEKKzA0MjMgc3R1YiBSZWFkQ29uc29sZU91dHB1dEF0dHJpYnV0ZQorMDQyNCBzdHViIFJlYWRDb25zb2xlT3V0cHV0Q2hhcmFjdGVyQQorMDQyNSBzdHViIFJlYWRDb25zb2xlT3V0cHV0Q2hhcmFjdGVyVworMDQyNiBzdHViIFJlYWRDb25zb2xlT3V0cHV0VworMDQyNyBzdHViIFJlYWRDb25zb2xlVworMDQyOCBzdHViIFJlYWRGaWxlCiswNDI5IHN0dWIgUmVhZEZpbGVFeAorMDQzMCBzdHViIFJlYWRQcm9jZXNzTWVtb3J5CiswNDMxIHN0dWIgUmVnaXN0ZXJDb25zb2xlVkRNCiswNDMyIHN0dWIgUmVnaXN0ZXJXYWl0Rm9ySW5wdXRJZGxlCiswNDMzIHN0dWIgUmVnaXN0ZXJXb3dCYXNlSGFuZGxlcnMKKzA0MzQgc3R1YiBSZWdpc3Rlcldvd0V4ZWMKKzA0MzUgc3R1YiBSZWxlYXNlTXV0ZXgKKzA0MzYgc3R1YiBSZWxlYXNlU2VtYXBob3JlCiswNDM3IHN0dWIgUmVtb3ZlRGlyZWN0b3J5QQorMDQzOCBzdHViIFJlbW92ZURpcmVjdG9yeVcKKzA0Mzkgc3R1YiBSZXNldEV2ZW50CiswNDQwIHN0dWIgUmVzdW1lVGhyZWFkCiswNDQxIHN0dWIgUnRsRmlsbE1lbW9yeQorMDQ0MiBzdHViIFJ0bE1vdmVNZW1vcnkKKzA0NDMgc3R1YiBSdGxVbndpbmQKKzA0NDQgc3R1YiBSdGxaZXJvTWVtb3J5CiswNDQ1IHN0dWIgU2Nyb2xsQ29uc29sZVNjcmVlbkJ1ZmZlckEKKzA0NDYgc3R1YiBTY3JvbGxDb25zb2xlU2NyZWVuQnVmZmVyVworMDQ0NyBzdHViIFNlYXJjaFBhdGhBCiswNDQ4IHN0dWIgU2VhcmNoUGF0aFcKKzA0NDkgc3R1YiBTZXRDb21tQnJlYWsKKzA0NTAgc3R1YiBTZXRDb21tQ29uZmlnCiswNDUxIHN0dWIgU2V0Q29tbU1hc2sKKzA0NTIgc3R1YiBTZXRDb21tU3RhdGUKKzA0NTMgc3R1YiBTZXRDb21tVGltZW91dHMKKzA0NTQgc3R1YiBTZXRDb21wdXRlck5hbWVBCiswNDU1IHN0dWIgU2V0Q29tcHV0ZXJOYW1lVworMDQ1NiBzdHViIFNldENvbnNvbGVBY3RpdmVTY3JlZW5CdWZmZXIKKzA0NTcgc3R1YiBTZXRDb25zb2xlQ1AKKzA0NTggc3R1YiBTZXRDb25zb2xlQ29tbWFuZEhpc3RvcnlNb2RlCiswNDU5IHN0dWIgU2V0Q29uc29sZUN0cmxIYW5kbGVyCiswNDYwIHN0dWIgU2V0Q29uc29sZUN1cnNvcgorMDQ2MSBzdHViIFNldENvbnNvbGVDdXJzb3JJbmZvCiswNDYyIHN0dWIgU2V0Q29uc29sZUN1cnNvclBvc2l0aW9uCiswNDYzIHN0dWIgU2V0Q29uc29sZURpc3BsYXlNb2RlCiswNDY0IHN0dWIgU2V0Q29uc29sZUZvbnQKKzA0NjUgc3R1YiBTZXRDb25zb2xlSGFyZHdhcmVTdGF0ZQorMDQ2NiBzdHViIFNldENvbnNvbGVLZXlTaG9ydGN1dHMKKzA0Njcgc3R1YiBTZXRDb25zb2xlTWF4aW11bVdpbmRvd1NpemUKKzA0Njggc3R1YiBTZXRDb25zb2xlTWVudUNsb3NlCiswNDY5IHN0dWIgU2V0Q29uc29sZU1vZGUKKzA0NzAgc3R1YiBTZXRDb25zb2xlTnVtYmVyT2ZDb21tYW5kc0EKKzA0NzEgc3R1YiBTZXRDb25zb2xlTnVtYmVyT2ZDb21tYW5kc1cKKzA0NzIgc3R1YiBTZXRDb25zb2xlT3V0cHV0Q1AKKzA0NzMgc3R1YiBTZXRDb25zb2xlUGFsZXR0ZQorMDQ3NCBzdHViIFNldENvbnNvbGVTY3JlZW5CdWZmZXJTaXplCiswNDc1IHN0dWIgU2V0Q29uc29sZVRleHRBdHRyaWJ1dGUKKzA0NzYgc3R1YiBTZXRDb25zb2xlVGl0bGVBCiswNDc3IHN0dWIgU2V0Q29uc29sZVRpdGxlVworMDQ3OCBzdHViIFNldENvbnNvbGVXaW5kb3dJbmZvCiswNDc5IHN0dWIgU2V0Q3VycmVudERpcmVjdG9yeUEKKzA0ODAgc3R1YiBTZXRDdXJyZW50RGlyZWN0b3J5VworMDQ4MSBzdHViIFNldERlZmF1bHRDb21tQ29uZmlnQQorMDQ4MiBzdHViIFNldERlZmF1bHRDb21tQ29uZmlnVworMDQ4MyBzdHViIFNldEVuZE9mRmlsZQorMDQ4NCBzdHViIFNldEVudmlyb25tZW50VmFyaWFibGVBCiswNDg1IHN0dWIgU2V0RW52aXJvbm1lbnRWYXJpYWJsZVcKKzA0ODYgc3R1YiBTZXRFcnJvck1vZGUKKzA0ODcgc3R1YiBTZXRFdmVudAorMDQ4OCBzdHViIFNldEZpbGVBcGlzVG9BTlNJCiswNDg5IHN0dWIgU2V0RmlsZUFwaXNUb09FTQorMDQ5MCBzdHViIFNldEZpbGVBdHRyaWJ1dGVzQQorMDQ5MSBzdHViIFNldEZpbGVBdHRyaWJ1dGVzVworMDQ5MiBzdHViIFNldEZpbGVQb2ludGVyCiswNDkzIHN0dWIgU2V0RmlsZVRpbWUKKzA0OTQgc3R1YiBTZXRIYW5kbGVDb3VudAorMDQ5NSBzdHViIFNldEhhbmRsZUluZm9ybWF0aW9uCiswNDk2IHN0dWIgU2V0TGFzdENvbnNvbGVFdmVudEFjdGl2ZQorMDQ5NyBzdHViIFNldExhc3RFcnJvcgorMDQ5OCBzdHViIFNldExvY2FsVGltZQorMDQ5OSBzdHViIFNldExvY2FsZUluZm9BCiswNTAwIHN0dWIgU2V0TG9jYWxlSW5mb1cKKzA1MDEgc3R1YiBTZXRNYWlsc2xvdEluZm8KKzA1MDIgc3R1YiBTZXROYW1lZFBpcGVIYW5kbGVTdGF0ZQorMDUwMyBzdHViIFNldFByaW9yaXR5Q2xhc3MKKzA1MDQgc3R1YiBTZXRQcm9jZXNzU2h1dGRvd25QYXJhbWV0ZXJzCiswNTA1IHN0dWIgU2V0UHJvY2Vzc1dvcmtpbmdTZXRTaXplCiswNTA2IHN0dWIgU2V0U3RkSGFuZGxlCiswNTA3IHN0dWIgU2V0U3lzdGVtVGltZQorMDUwOCBzdHViIFNldFN5c3RlbVRpbWVBZGp1c3RtZW50CiswNTA5IHN0dWIgU2V0VGFwZVBhcmFtZXRlcnMKKzA1MTAgc3R1YiBTZXRUYXBlUG9zaXRpb24KKzA1MTEgc3R1YiBTZXRUaHJlYWRBZmZpbml0eU1hc2sKKzA1MTIgc3R1YiBTZXRUaHJlYWRDb250ZXh0CiswNTEzIHN0dWIgU2V0VGhyZWFkTG9jYWxlCiswNTE0IHN0dWIgU2V0VGhyZWFkUHJpb3JpdHkKKzA1MTUgc3R1YiBTZXRUaW1lWm9uZUluZm9ybWF0aW9uCiswNTE2IHN0dWIgU2V0VW5oYW5kbGVkRXhjZXB0aW9uRmlsdGVyCiswNTE3IHN0dWIgU2V0VkRNQ3VycmVudERpcmVjdG9yaWVzCiswNTE4IHN0dWIgU2V0Vm9sdW1lTGFiZWxBCiswNTE5IHN0dWIgU2V0Vm9sdW1lTGFiZWxXCiswNTIwIHN0dWIgU2V0dXBDb21tCiswNTIxIHN0dWIgU2hvd0NvbnNvbGVDdXJzb3IKKzA1MjIgc3R1YiBTaXplb2ZSZXNvdXJjZQorMDUyMyBzdHViIFNsZWVwCiswNTI0IHN0dWIgU2xlZXBFeAorMDUyNSBzdHViIFN1c3BlbmRUaHJlYWQKKzA1MjYgc3R1YiBTeXN0ZW1UaW1lVG9GaWxlVGltZQorMDUyNyBzdHViIFN5c3RlbVRpbWVUb1R6U3BlY2lmaWNMb2NhbFRpbWUKKzA1Mjggc3R1YiBUZXJtaW5hdGVQcm9jZXNzCiswNTI5IHN0dWIgVGVybWluYXRlVGhyZWFkCiswNTMwIHN0dWIgVGxzQWxsb2MKKzA1MzEgc3R1YiBUbHNGcmVlCiswNTMyIHN0dWIgVGxzR2V0VmFsdWUKKzA1MzMgc3R1YiBUbHNTZXRWYWx1ZQorMDUzNCBzdHViIFRyYW5zYWN0TmFtZWRQaXBlCiswNTM1IHN0dWIgVHJhbnNtaXRDb21tQ2hhcgorMDUzNiBzdHViIFRyaW1WaXJ0dWFsQnVmZmVyCiswNTM3IHN0dWIgVW5oYW5kbGVkRXhjZXB0aW9uRmlsdGVyCiswNTM4IHN0dWIgVW5sb2NrRmlsZQorMDUzOSBzdHViIFVubG9ja0ZpbGVFeAorMDU0MCBzdHViIFVubWFwVmlld09mRmlsZQorMDU0MSBzdHViIFVwZGF0ZVJlc291cmNlQQorMDU0MiBzdHViIFVwZGF0ZVJlc291cmNlVworMDU0MyBzdHViIFZETUNvbnNvbGVPcGVyYXRpb24KKzA1NDQgc3R1YiBWRE1PcGVyYXRpb25TdGFydGVkCiswNTQ1IHN0dWIgVmVyTGFuZ3VhZ2VOYW1lQQorMDU0NiBzdHViIFZlckxhbmd1YWdlTmFtZVcKKzA1NDcgc3R1YiBWZXJpZnlDb25zb2xlSW9IYW5kbGUKKzA1NDggc3R1YiBWaXJ0dWFsQWxsb2MKKzA1NDkgc3R1YiBWaXJ0dWFsQnVmZmVyRXhjZXB0aW9uSGFuZGxlcgorMDU1MCBzdHViIFZpcnR1YWxGcmVlCiswNTUxIHN0dWIgVmlydHVhbExvY2sKKzA1NTIgc3R1YiBWaXJ0dWFsUHJvdGVjdAorMDU1MyBzdHViIFZpcnR1YWxQcm90ZWN0RXgKKzA1NTQgc3R1YiBWaXJ0dWFsUXVlcnkKKzA1NTUgc3R1YiBWaXJ0dWFsUXVlcnlFeAorMDU1NiBzdHViIFZpcnR1YWxVbmxvY2sKKzA1NTcgc3R1YiBXYWl0Q29tbUV2ZW50CiswNTU4IHN0dWIgV2FpdEZvckRlYnVnRXZlbnQKKzA1NTkgc3R1YiBXYWl0Rm9yTXVsdGlwbGVPYmplY3RzCiswNTYwIHN0dWIgV2FpdEZvck11bHRpcGxlT2JqZWN0c0V4CiswNTYxIHN0dWIgV2FpdEZvclNpbmdsZU9iamVjdAorMDU2MiBzdHViIFdhaXRGb3JTaW5nbGVPYmplY3RFeAorMDU2MyBzdHViIFdhaXROYW1lZFBpcGVBCiswNTY0IHN0dWIgV2FpdE5hbWVkUGlwZVcKKzA1NjUgc3R1YiBXaWRlQ2hhclRvTXVsdGlCeXRlCiswNTY2IHN0dWIgV2luRXhlYworMDU2NyBzdHViIFdyaXRlQ29uc29sZUEKKzA1Njggc3R1YiBXcml0ZUNvbnNvbGVJbnB1dEEKKzA1Njkgc3R1YiBXcml0ZUNvbnNvbGVJbnB1dFZETUEKKzA1NzAgc3R1YiBXcml0ZUNvbnNvbGVJbnB1dFZETVcKKzA1NzEgc3R1YiBXcml0ZUNvbnNvbGVJbnB1dFcKKzA1NzIgc3R1YiBXcml0ZUNvbnNvbGVPdXRwdXRBCiswNTczIHN0dWIgV3JpdGVDb25zb2xlT3V0cHV0QXR0cmlidXRlCiswNTc0IHN0dWIgV3JpdGVDb25zb2xlT3V0cHV0Q2hhcmFjdGVyQQorMDU3NSBzdHViIFdyaXRlQ29uc29sZU91dHB1dENoYXJhY3RlclcKKzA1NzYgc3R1YiBXcml0ZUNvbnNvbGVPdXRwdXRXCiswNTc3IHN0dWIgV3JpdGVDb25zb2xlVworMDU3OCBzdHViIFdyaXRlRmlsZQorMDU3OSBzdHViIFdyaXRlRmlsZUV4CiswNTgwIHN0dWIgV3JpdGVQcml2YXRlUHJvZmlsZVNlY3Rpb25BCiswNTgxIHN0dWIgV3JpdGVQcml2YXRlUHJvZmlsZVNlY3Rpb25XCiswNTgyIHN0dWIgV3JpdGVQcml2YXRlUHJvZmlsZVN0cmluZ0EKKzA1ODMgc3R1YiBXcml0ZVByaXZhdGVQcm9maWxlU3RyaW5nVworMDU4NCBzdHViIFdyaXRlUHJvY2Vzc01lbW9yeQorMDU4NSBzdHViIFdyaXRlUHJvZmlsZVNlY3Rpb25BCiswNTg2IHN0dWIgV3JpdGVQcm9maWxlU2VjdGlvblcKKzA1ODcgc3R1YiBXcml0ZVByb2ZpbGVTdHJpbmdBCiswNTg4IHN0dWIgV3JpdGVQcm9maWxlU3RyaW5nVworMDU4OSBzdHViIFdyaXRlVGFwZW1hcmsKKzA1OTAgc3R1YiBfaHJlYWQKKzA1OTEgc3R1YiBfaHdyaXRlCiswNTkyIHN0dWIgX2xjbG9zZQorMDU5MyBzdHViIF9sY3JlYXQKKzA1OTQgc3R1YiBfbGxzZWVrCiswNTk1IHN0dWIgX2xvcGVuCiswNTk2IHN0dWIgX2xyZWFkCiswNTk3IHN0dWIgX2x3cml0ZQorMDU5OCBzdHViIGxzdHJjYXQKKzA1OTkgc3R1YiBsc3RyY2F0QQorMDYwMCBzdHViIGxzdHJjYXRXCiswNjAxIHN0dWIgbHN0cmNtcAorMDYwMiBzdHViIGxzdHJjbXBBCiswNjAzIHN0dWIgbHN0cmNtcFcKKzA2MDQgc3R1YiBsc3RyY21waQorMDYwNSBzdHViIGxzdHJjbXBpQQorMDYwNiBzdHViIGxzdHJjbXBpVworMDYwNyBzdHViIGxzdHJjcHkKKzA2MDggc3R1YiBsc3RyY3B5QQorMDYwOSBzdHViIGxzdHJjcHlXCiswNjEwIHN0dWIgbHN0cmNweW4KKzA2MTEgc3R1YiBsc3RyY3B5bkEKKzA2MTIgc3R1YiBsc3RyY3B5blcKKzA2MTMgc3R1YiBsc3RybGVuCiswNjE0IHN0dWIgbHN0cmxlbkEKKzA2MTUgc3R1YiBsc3RybGVuVwpkaWZmIC0tZ2l0IGEvaWYxNjMyL21tc3lzdGVtLnNwZWMgYi9pZjE2MzIvbW1zeXN0ZW0uc3BlYwppbmRleCA4ZTAzYzIxLi5kNGUwYjI4IDEwMDY0NAotLS0gYS9pZjE2MzIvbW1zeXN0ZW0uc3BlYworKysgYi9pZjE2MzIvbW1zeXN0ZW0uc3BlYwpAQCAtMSw3ICsxLDcgQEAKIG5hbWUJbW1zeXN0ZW0KIGlkCTEwCiAKLTEgICAgICBwYXNjYWwgIE1NU1lTVEVNX1dFUCh3b3JkIHdvcmQgd29yZCBwdHIpIE1NU1lTVEVNX1dFUAorIzEgICAgICBwYXNjYWwgIE1NU1lTVEVNX1dFUCh3b3JkIHdvcmQgd29yZCBwdHIpIE1NU1lTVEVNX1dFUAogMiAgICAgIHBhc2NhbCAgU05EUExBWVNPVU5EKHB0ciB3b3JkKSBzbmRQbGF5U291bmQKIDUgICAgICBwYXNjYWwgIE1NU1lTVEVNR0VUVkVSU0lPTigpIG1tc3lzdGVtR2V0VmVyc2lvbgogNiAgICAgIHBhc2NhbCAgRHJpdmVyUHJvYyhsb25nIHdvcmQgd29yZCBsb25nIGxvbmcpIERyaXZlclByb2MKQEAgLTIwLDUxICsyMCw1MSBAQAogMTA3ICAgIHBhc2NhbCAgSk9ZU0VUVEhSRVNIT0xEKHdvcmQgd29yZCkgSm95U2V0VGhyZXNob2xkCiAxMDkgICAgcGFzY2FsICBKT1lTRVRDQUxJQlJBVElPTih3b3JkKSBKb3lTZXRDYWxpYnJhdGlvbgogMjAxICAgIHBhc2NhbCAgTUlESU9VVEdFVE5VTURFVlMoKSBtaWRpT3V0R2V0TnVtRGV2cwotMjAyICAgIHBhc2NhbCAgTUlESU9VVEdFVERFVkNBUFMod29yZCBwdHIgd29yZCkgbWlkaU91dEdldERldkNhcHMKKzIwMiAgICBwYXNjYWwgIE1JRElPVVRHRVRERVZDQVBTKHdvcmQgc2VncHRyIHdvcmQpIG1pZGlPdXRHZXREZXZDYXBzCiAyMDMgICAgcGFzY2FsICBNSURJT1VUR0VURVJST1JURVhUKHdvcmQgcHRyIHdvcmQpIG1pZGlPdXRHZXRFcnJvclRleHQKIDIwNCAgICBwYXNjYWwgIE1JRElPVVRPUEVOKHB0ciB3b3JkIHB0ciBsb25nIGxvbmcgbG9uZykgbWlkaU91dE9wZW4KIDIwNSAgICBwYXNjYWwgIE1JRElPVVRDTE9TRSh3b3JkKSBtaWRpT3V0Q2xvc2UKLTIwNiAgICBwYXNjYWwgIE1JRElPVVRQUkVQQVJFSEVBREVSKHdvcmQgcHRyIHdvcmQpIG1pZGlPdXRQcmVwYXJlSGVhZGVyCi0yMDcgICAgcGFzY2FsICBNSURJT1VUVU5QUkVQQVJFSEVBREVSKHdvcmQgcHRyIHdvcmQpIG1pZGlPdXRVbnByZXBhcmVIZWFkZXIKKzIwNiAgICBwYXNjYWwgIE1JRElPVVRQUkVQQVJFSEVBREVSKHdvcmQgc2VncHRyIHdvcmQpIG1pZGlPdXRQcmVwYXJlSGVhZGVyCisyMDcgICAgcGFzY2FsICBNSURJT1VUVU5QUkVQQVJFSEVBREVSKHdvcmQgc2VncHRyIHdvcmQpIG1pZGlPdXRVbnByZXBhcmVIZWFkZXIKIDIwOCAgICBwYXNjYWwgIE1JRElPVVRTSE9SVE1TRyh3b3JkIGxvbmcpIG1pZGlPdXRTaG9ydE1zZwogMjA5ICAgIHBhc2NhbCAgTUlESU9VVExPTkdNU0cod29yZCBwdHIgd29yZCkgbWlkaU91dExvbmdNc2cKIDIxMCAgICBwYXNjYWwgIE1JRElPVVRSRVNFVCh3b3JkKSBtaWRpT3V0UmVzZXQKLTIxMSAgICBwYXNjYWwgIE1JRElPVVRHRVRWT0xVTUUod29yZCBwdHIpIG1pZGlPdXRHZXRWb2x1bWUKKzIxMSAgICBwYXNjYWwgIE1JRElPVVRHRVRWT0xVTUUod29yZCBzZWdwdHIpIG1pZGlPdXRHZXRWb2x1bWUKIDIxMiAgICBwYXNjYWwgIE1JRElPVVRTRVRWT0xVTUUod29yZCBsb25nKSBtaWRpT3V0U2V0Vm9sdW1lCiAyMTUgICAgcGFzY2FsICBNSURJT1VUR0VUSUQod29yZCBwdHIpIG1pZGlPdXRHZXRJRAogMjE2ICAgIHBhc2NhbCAgTUlESU9VVE1FU1NBR0Uod29yZCB3b3JkIGxvbmcgbG9uZykgbWlkaU91dE1lc3NhZ2UKIDMwMSAgICBwYXNjYWwgIE1JRElJTkdFVE5VTURFVlMoKSBtaWRpSW5HZXROdW1EZXZzCi0zMDIgICAgcGFzY2FsICBNSURJSU5HRVRERVZDQVBTKHdvcmQgcHRyIHdvcmQpIG1pZGlJbkdldERldkNhcHMKKzMwMiAgICBwYXNjYWwgIE1JRElJTkdFVERFVkNBUFMod29yZCBzZWdwdHIgd29yZCkgbWlkaUluR2V0RGV2Q2FwcwogMzAzICAgIHBhc2NhbCAgTUlESUlOR0VURVJST1JURVhUKHdvcmQgcHRyIHdvcmQpIG1pZGlJbkdldEVycm9yVGV4dAogMzA0ICAgIHBhc2NhbCAgTUlESUlOT1BFTihwdHIgd29yZCBwdHIgbG9uZyBsb25nIGxvbmcpIG1pZGlJbk9wZW4KIDMwNSAgICBwYXNjYWwgIE1JRElJTkNMT1NFKHdvcmQpIG1pZGlJbkNsb3NlCi0zMDYgICAgcGFzY2FsICBNSURJSU5QUkVQQVJFSEVBREVSKHdvcmQgcHRyIHdvcmQpIG1pZGlJblByZXBhcmVIZWFkZXIKLTMwNyAgICBwYXNjYWwgIE1JRElJTlVOUFJFUEFSRUhFQURFUih3b3JkIHB0ciB3b3JkKSBtaWRpSW5VbnByZXBhcmVIZWFkZXIKKzMwNiAgICBwYXNjYWwgIE1JRElJTlBSRVBBUkVIRUFERVIod29yZCBzZWdwdHIgd29yZCkgbWlkaUluUHJlcGFyZUhlYWRlcgorMzA3ICAgIHBhc2NhbCAgTUlESUlOVU5QUkVQQVJFSEVBREVSKHdvcmQgc2VncHRyIHdvcmQpIG1pZGlJblVucHJlcGFyZUhlYWRlcgogMzA5ICAgIHBhc2NhbCAgTUlESUlOU1RBUlQod29yZCkgbWlkaUluU3RhcnQKIDMxMCAgICBwYXNjYWwgIE1JRElJTlNUT1Aod29yZCkgbWlkaUluU3RvcAogMzExICAgIHBhc2NhbCAgTUlESUlOUkVTRVQod29yZCkgbWlkaUluUmVzZXQKIDMxMiAgICBwYXNjYWwgIE1JRElJTkdFVElEKHdvcmQgcHRyKSBtaWRpSW5HZXRJRAogMzEzICAgIHBhc2NhbCAgTUlESUlOTUVTU0FHRSh3b3JkIHdvcmQgbG9uZyBsb25nKSBtaWRpSW5NZXNzYWdlCiAzNTAgICAgcGFzY2FsICBBVVhHRVROVU1ERVZTKCkgYXV4R2V0TnVtRGV2cwotMzUxICAgIHBhc2NhbCAgQVVYR0VUREVWQ0FQUyh3b3JkIHB0ciB3b3JkKSBhdXhHZXREZXZDYXBzCi0zNTIgICAgcGFzY2FsICBBVVhHRVRWT0xVTUUod29yZCBwdHIpIGF1eEdldFZvbHVtZQorMzUxICAgIHBhc2NhbCAgQVVYR0VUREVWQ0FQUyh3b3JkIHNlZ3B0ciB3b3JkKSBhdXhHZXREZXZDYXBzCiszNTIgICAgcGFzY2FsICBBVVhHRVRWT0xVTUUod29yZCBzZWdwdHIpIGF1eEdldFZvbHVtZQogMzUzICAgIHBhc2NhbCAgQVVYU0VUVk9MVU1FKHdvcmQgbG9uZykgYXV4U2V0Vm9sdW1lCiAzNTQgICAgcGFzY2FsICBBVVhPVVRNRVNTQUdFKHdvcmQgd29yZCBsb25nIGxvbmcpIGF1eE91dE1lc3NhZ2UKIDQwMSAgICBwYXNjYWwgIFdBVkVPVVRHRVROVU1ERVZTKCkgd2F2ZU91dEdldE51bURldnMKLTQwMiAgICBwYXNjYWwgIFdBVkVPVVRHRVRERVZDQVBTKHdvcmQgcHRyIHdvcmQpIHdhdmVPdXRHZXREZXZDYXBzCis0MDIgICAgcGFzY2FsICBXQVZFT1VUR0VUREVWQ0FQUyh3b3JkIHNlZ3B0ciB3b3JkKSB3YXZlT3V0R2V0RGV2Q2FwcwogNDAzICAgIHBhc2NhbCAgV0FWRU9VVEdFVEVSUk9SVEVYVCh3b3JkIHB0ciB3b3JkKSB3YXZlT3V0R2V0RXJyb3JUZXh0CiA0MDQgICAgcGFzY2FsICBXQVZFT1VUT1BFTihwdHIgd29yZCBwdHIgbG9uZyBsb25nIGxvbmcpIHdhdmVPdXRPcGVuCiA0MDUgICAgcGFzY2FsICBXQVZFT1VUQ0xPU0Uod29yZCkgd2F2ZU91dENsb3NlCi00MDYgICAgcGFzY2FsICBXQVZFT1VUUFJFUEFSRUhFQURFUih3b3JkIHB0ciB3b3JkKSB3YXZlT3V0UHJlcGFyZUhlYWRlcgotNDA3ICAgIHBhc2NhbCAgV0FWRU9VVFVOUFJFUEFSRUhFQURFUih3b3JkIHB0ciB3b3JkKSB3YXZlT3V0VW5wcmVwYXJlSGVhZGVyCi00MDggICAgcGFzY2FsICBXQVZFT1VUV1JJVEUod29yZCBwdHIgd29yZCkgd2F2ZU91dFdyaXRlCis0MDYgICAgcGFzY2FsICBXQVZFT1VUUFJFUEFSRUhFQURFUih3b3JkIHNlZ3B0ciB3b3JkKSB3YXZlT3V0UHJlcGFyZUhlYWRlcgorNDA3ICAgIHBhc2NhbCAgV0FWRU9VVFVOUFJFUEFSRUhFQURFUih3b3JkIHNlZ3B0ciB3b3JkKSB3YXZlT3V0VW5wcmVwYXJlSGVhZGVyCis0MDggICAgcGFzY2FsICBXQVZFT1VUV1JJVEUod29yZCBzZWdwdHIgd29yZCkgd2F2ZU91dFdyaXRlCiA0MDkgICAgcGFzY2FsICBXQVZFT1VUUEFVU0Uod29yZCkgd2F2ZU91dFBhdXNlCiA0MTAgICAgcGFzY2FsICBXQVZFT1VUUkVTVEFSVCh3b3JkKSB3YXZlT3V0UmVzdGFydAogNDExICAgIHBhc2NhbCAgV0FWRU9VVFJFU0VUKHdvcmQpIHdhdmVPdXRSZXNldAotNDEyICAgIHBhc2NhbCAgV0FWRU9VVEdFVFBPU0lUSU9OKHdvcmQgcHRyIHdvcmQpIHdhdmVPdXRHZXRQb3NpdGlvbgorNDEyICAgIHBhc2NhbCAgV0FWRU9VVEdFVFBPU0lUSU9OKHdvcmQgc2VncHRyIHdvcmQpIHdhdmVPdXRHZXRQb3NpdGlvbgogNDEzICAgIHBhc2NhbCAgV0FWRU9VVEdFVFBJVENIKHdvcmQgcHRyKSB3YXZlT3V0R2V0UGl0Y2gKIDQxNCAgICBwYXNjYWwgIFdBVkVPVVRTRVRQSVRDSCh3b3JkIGxvbmcpIHdhdmVPdXRTZXRQaXRjaAotNDE1ICAgIHBhc2NhbCAgV0FWRU9VVEdFVFZPTFVNRSh3b3JkIHB0cikgd2F2ZU91dEdldFZvbHVtZQorNDE1ICAgIHBhc2NhbCAgV0FWRU9VVEdFVFZPTFVNRSh3b3JkIHNlZ3B0cikgd2F2ZU91dEdldFZvbHVtZQogNDE2ICAgIHBhc2NhbCAgV0FWRU9VVFNFVFZPTFVNRSh3b3JkIGxvbmcpIHdhdmVPdXRTZXRWb2x1bWUKIDQxNyAgICBwYXNjYWwgIFdBVkVPVVRHRVRQTEFZQkFDS1JBVEUod29yZCBwdHIpIHdhdmVPdXRHZXRQbGF5YmFja1JhdGUKIDQxOCAgICBwYXNjYWwgIFdBVkVPVVRTRVRQTEFZQkFDS1JBVEUod29yZCBsb25nKSB3YXZlT3V0U2V0UGxheWJhY2tSYXRlCkBAIC03MiwxNyArNzIsMTcgQEAKIDQyMCAgICBwYXNjYWwgIFdBVkVPVVRHRVRJRCh3b3JkIHB0cikgd2F2ZU91dEdldElECiA0MjEgICAgcGFzY2FsICBXQVZFT1VUTUVTU0FHRSh3b3JkIHdvcmQgbG9uZyBsb25nKSB3YXZlT3V0TWVzc2FnZQogNTAxICAgIHBhc2NhbCAgV0FWRUlOR0VUTlVNREVWUygpIHdhdmVJbkdldE51bURldnMKLTUwMiAgICBwYXNjYWwgIFdBVkVJTkdFVERFVkNBUFMod29yZCBwdHIgd29yZCkgd2F2ZUluR2V0RGV2Q2FwcworNTAyICAgIHBhc2NhbCAgV0FWRUlOR0VUREVWQ0FQUyh3b3JkIHNlZ3B0ciB3b3JkKSB3YXZlSW5HZXREZXZDYXBzCiA1MDMgICAgcGFzY2FsICBXQVZFSU5HRVRFUlJPUlRFWFQod29yZCBwdHIgd29yZCkgd2F2ZUluR2V0RXJyb3JUZXh0CiA1MDQgICAgcGFzY2FsICBXQVZFSU5PUEVOKHB0ciB3b3JkIHB0ciBsb25nIGxvbmcgbG9uZykgd2F2ZUluT3BlbgogNTA1ICAgIHBhc2NhbCAgV0FWRUlOQ0xPU0Uod29yZCkgd2F2ZUluQ2xvc2UKLTUwNiAgICBwYXNjYWwgIFdBVkVJTlBSRVBBUkVIRUFERVIod29yZCBwdHIgd29yZCkgd2F2ZUluUHJlcGFyZUhlYWRlcgotNTA3ICAgIHBhc2NhbCAgV0FWRUlOVU5QUkVQQVJFSEVBREVSKHdvcmQgcHRyIHdvcmQpIHdhdmVJblVucHJlcGFyZUhlYWRlcgotNTA4ICAgIHBhc2NhbCAgV0FWRUlOQUREQlVGRkVSKHdvcmQgcHRyIHdvcmQpIHdhdmVJbkFkZEJ1ZmZlcgorNTA2ICAgIHBhc2NhbCAgV0FWRUlOUFJFUEFSRUhFQURFUih3b3JkIHNlZ3B0ciB3b3JkKSB3YXZlSW5QcmVwYXJlSGVhZGVyCis1MDcgICAgcGFzY2FsICBXQVZFSU5VTlBSRVBBUkVIRUFERVIod29yZCBzZWdwdHIgd29yZCkgd2F2ZUluVW5wcmVwYXJlSGVhZGVyCis1MDggICAgcGFzY2FsICBXQVZFSU5BRERCVUZGRVIod29yZCBzZWdwdHIgd29yZCkgd2F2ZUluQWRkQnVmZmVyCiA1MDkgICAgcGFzY2FsICBXQVZFSU5TVEFSVCh3b3JkKSB3YXZlSW5TdGFydAogNTEwICAgIHBhc2NhbCAgV0FWRUlOU1RPUCh3b3JkKSB3YXZlSW5TdG9wCiA1MTEgICAgcGFzY2FsICBXQVZFSU5SRVNFVCh3b3JkKSB3YXZlSW5SZXNldAotNTEyICAgIHBhc2NhbCAgV0FWRUlOR0VUUE9TSVRJT04od29yZCBwdHIgd29yZCkgd2F2ZUluR2V0UG9zaXRpb24KKzUxMiAgICBwYXNjYWwgIFdBVkVJTkdFVFBPU0lUSU9OKHdvcmQgc2VncHRyIHdvcmQpIHdhdmVJbkdldFBvc2l0aW9uCiA1MTMgICAgcGFzY2FsICBXQVZFSU5HRVRJRCh3b3JkIHB0cikgd2F2ZUluR2V0SUQKIDUxNCAgICBwYXNjYWwgIFdBVkVJTk1FU1NBR0Uod29yZCB3b3JkIGxvbmcgbG9uZykgd2F2ZUluTWVzc2FnZQogNjAxICAgIHBhc2NhbCAgdGltZUdldFN5c3RlbVRpbWUocHRyIHdvcmQpIHRpbWVHZXRTeXN0ZW1UaW1lCmRpZmYgLS1naXQgYS9pZjE2MzIvcmVsYXkuYyBiL2lmMTYzMi9yZWxheS5jCmluZGV4IDBhM2NjZjUuLjUwNDk4MjcgMTAwNjQ0Ci0tLSBhL2lmMTYzMi9yZWxheS5jCisrKyBiL2lmMTYzMi9yZWxheS5jCkBAIC0xLDMxICsxLDE0IEBACiAvKgotc3RhdGljIGNoYXIgUkNTSWRbXSA9ICIkSWQ6IHJlbGF5LmMsdiAxLjIgMTk5My8wNy8wNCAwNDowNDoyMSByb290IEV4cCByb290ICQiOwotc3RhdGljIGNoYXIgQ29weXJpZ2h0W10gPSAiQ29weXJpZ2h0ICBSb2JlcnQgSi4gQW1zdGFkdCwgMTk5MyI7Ci0qLworICogQ29weXJpZ2h0IDE5OTMgUm9iZXJ0IEouIEFtc3RhZHQKKyAqIENvcHlyaWdodCAxOTk1IEFsZXhhbmRyZSBKdWxsaWFyZAorICovCiAKICNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNpbmNsdWRlIDxlcnJuby5oPgotI2lmZGVmIGxpbnV4Ci0jaW5jbHVkZSA8bGludXgvdW5pc3RkLmg+Ci0jaW5jbHVkZSA8bGludXgvaGVhZC5oPgotI2luY2x1ZGUgPGxpbnV4L2xkdC5oPgotI2VuZGlmCiAKLSNpbmNsdWRlICJsZHQuaCIKLQotI2luY2x1ZGUgIm5lZXhlLmgiCi0jaW5jbHVkZSAicHJvdG90eXBlcy5oIgogI2luY2x1ZGUgImRsbHMuaCIKLSNpbmNsdWRlICJvcHRpb25zLmgiCi0jaW5jbHVkZSAic2VsZWN0b3JzLmgiCisjaW5jbHVkZSAiZ2xvYmFsLmgiCisjaW5jbHVkZSAibW9kdWxlLmgiCiAjaW5jbHVkZSAic3RhY2tmcmFtZS5oIgotI2luY2x1ZGUgIndpbmUuaCIKICNpbmNsdWRlICJzdGRkZWJ1Zy5oIgogLyogI2RlZmluZSBERUJVR19SRUxBWSAqLwogI2luY2x1ZGUgImRlYnVnLmgiCkBAIC0zNSw0MSArMTgsMzkgQEAKIGRwcmludGZfcmVsYXkKICNlbmRpZgogCi0jaWZkZWYgV0lORUxJQgotI2RlZmluZSBXaW5lTGliU2tpcCh4KSAwCi0jZWxzZQotI2RlZmluZSBXaW5lTGliU2tpcCh4KSB4Ci0jZW5kaWYKKyNkZWZpbmUgRExMX0VOVFJZKG5hbWUpIFwKKyAgeyAjbmFtZSwgbmFtZSMjX0NvZGVfU3RhcnQsIG5hbWUjI19EYXRhX1N0YXJ0LCBcCisgICAgbmFtZSMjX01vZHVsZV9TdGFydCwgbmFtZSMjX01vZHVsZV9FbmQsIFRSVUUsIDAgfQogCi1zdHJ1Y3QgZGxsX25hbWVfdGFibGVfZW50cnlfcyBkbGxfYnVpbHRpbl90YWJsZVtOX0JVSUxUSU5TXSA9CitzdHJ1Y3QgZGxsX3RhYmxlX3MgZGxsX2J1aWx0aW5fdGFibGVbTl9CVUlMVElOU10gPQogewotICAgIHsgIktFUk5FTCIsICAgV2luZUxpYlNraXAoJktFUk5FTF90YWJsZSksIDEgfSwKLSAgICB7ICJVU0VSIiwgICAgIFdpbmVMaWJTa2lwKCZVU0VSX3RhYmxlKSwgMSB9LAotICAgIHsgIkdESSIsICAgICAgV2luZUxpYlNraXAoJkdESV90YWJsZSksIDEgfSwKLSAgICB7ICJXSU44N0VNIiwgIFdpbmVMaWJTa2lwKCZXSU44N0VNX3RhYmxlKSwgMSB9LAotICAgIHsgIlNIRUxMIiwgICAgV2luZUxpYlNraXAoJlNIRUxMX3RhYmxlKSwgMSB9LAotICAgIHsgIlNPVU5EIiwgICAgV2luZUxpYlNraXAoJlNPVU5EX3RhYmxlKSwgMSB9LAotICAgIHsgIktFWUJPQVJEIiwgV2luZUxpYlNraXAoJktFWUJPQVJEX3RhYmxlKSwgMSB9LAotICAgIHsgIldJTlNPQ0siLCAgV2luZUxpYlNraXAoJldJTlNPQ0tfdGFibGUpLCAxIH0sCi0gICAgeyAiU1RSRVNTIiwgICBXaW5lTGliU2tpcCgmU1RSRVNTX3RhYmxlKSwgMSB9LAotICAgIHsgIk1NU1lTVEVNIiwgV2luZUxpYlNraXAoJk1NU1lTVEVNX3RhYmxlKSwgMSB9LAotICAgIHsgIlNZU1RFTSIsICAgV2luZUxpYlNraXAoJlNZU1RFTV90YWJsZSksIDEgfSwKLSAgICB7ICJUT09MSEVMUCIsIFdpbmVMaWJTa2lwKCZUT09MSEVMUF90YWJsZSksIDEgfSwKLSAgICB7ICJNT1VTRSIsICAgIFdpbmVMaWJTa2lwKCZNT1VTRV90YWJsZSksIDEgfSwKLSAgICB7ICJDT01NRExHIiwgIFdpbmVMaWJTa2lwKCZDT01NRExHX3RhYmxlKSwgMSB9LAotICAgIHsgIk9MRTIiLCAgICAgV2luZUxpYlNraXAoJk9MRTJfdGFibGUpLCAxIH0sCi0gICAgeyAiT0xFMkNPTlYiLCBXaW5lTGliU2tpcCgmT0xFMkNPTlZfdGFibGUpLCAxIH0sCi0gICAgeyAiT0xFMkRJU1AiLCBXaW5lTGliU2tpcCgmT0xFMkRJU1BfdGFibGUpLCAxIH0sCi0gICAgeyAiT0xFMk5MUyIsICBXaW5lTGliU2tpcCgmT0xFMk5MU190YWJsZSksIDEgfSwKLSAgICB7ICJPTEUyUFJPWCIsIFdpbmVMaWJTa2lwKCZPTEUyUFJPWF90YWJsZSksIDEgfSwKLSAgICB7ICJPTEVDTEkiLCAgIFdpbmVMaWJTa2lwKCZPTEVDTElfdGFibGUpLCAxIH0sCi0gICAgeyAiT0xFU1ZSIiwgICBXaW5lTGliU2tpcCgmT0xFU1ZSX3RhYmxlKSwgMSB9LAotICAgIHsgIkNPTVBPQkoiLCAgV2luZUxpYlNraXAoJkNPTVBPQkpfdGFibGUpLCAxIH0sCi0gICAgeyAiU1RPUkFHRSIsICBXaW5lTGliU2tpcCgmU1RPUkFHRV90YWJsZSksIDEgfSwKLSAgICB7ICJXSU5QUk9DUyIsIFdpbmVMaWJTa2lwKCZXSU5QUk9DU190YWJsZSksIDEgfSwKLSAgICB7ICJEREVNTCIsICAgIFdpbmVMaWJTa2lwKCZEREVNTF90YWJsZSksIDEgfQotICAgIAorICAgIERMTF9FTlRSWShLRVJORUwpLAorICAgIERMTF9FTlRSWShVU0VSKSwKKyAgICBETExfRU5UUlkoR0RJKSwKKyAgICBETExfRU5UUlkoV0lOODdFTSksCisgICAgRExMX0VOVFJZKFNIRUxMKSwKKyAgICBETExfRU5UUlkoU09VTkQpLAorICAgIERMTF9FTlRSWShLRVlCT0FSRCksCisgICAgRExMX0VOVFJZKFdJTlNPQ0spLAorICAgIERMTF9FTlRSWShTVFJFU1MpLAorICAgIERMTF9FTlRSWShNTVNZU1RFTSksCisgICAgRExMX0VOVFJZKFNZU1RFTSksCisgICAgRExMX0VOVFJZKFRPT0xIRUxQKSwKKyAgICBETExfRU5UUlkoTU9VU0UpLAorICAgIERMTF9FTlRSWShDT01NRExHKSwKKyAgICBETExfRU5UUlkoT0xFMiksCisgICAgRExMX0VOVFJZKE9MRTJDT05WKSwKKyAgICBETExfRU5UUlkoT0xFMkRJU1ApLAorICAgIERMTF9FTlRSWShPTEUyTkxTKSwKKyAgICBETExfRU5UUlkoT0xFMlBST1gpLAorICAgIERMTF9FTlRSWShPTEVDTEkpLAorICAgIERMTF9FTlRSWShPTEVTVlIpLAorICAgIERMTF9FTlRSWShDT01QT0JKKSwKKyAgICBETExfRU5UUlkoU1RPUkFHRSksCisgICAgRExMX0VOVFJZKFdJTlBST0NTKSwKKyAgICBETExfRU5UUlkoRERFTUwpCiB9OworCiAvKiBkb24ndCBmb3JnZXQgdG8gaW5jcmVhc2UgTl9CVUlMVElOUyBpbiBkbGxzLmggaWYgeW91IGFkZCBhIGRsbCAqLwogCiAgIC8qIFNhdmVkIDE2LWJpdCBzdGFjayAqLwpAQCAtNzgsNyArNTksNyBAQAogCiAgIC8qIFNhdmVkIDMyLWJpdCBzdGFjayAqLwogRFdPUkQgSUYxNjMyX1NhdmVkMzJfZXNwID0gMDsKLQorU0VHUFRSIElGMTYzMl9TdGFjazMyX2Jhc2UgPSAwOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBSRUxBWV9Jbml0CkBAIC05Myw5ICs3NCw5IEBACiAgICAgZXh0ZXJuIHZvaWQgQ0FMTDE2X1JldF93b3JkKCksIENBTEwxNl9SZXRfbG9uZygpOwogICAgIGV4dGVybiBEV09SRCBDQUxMMTZfUmV0QWRkcl93b3JkLCBDQUxMMTZfUmV0QWRkcl9sb25nOwogCi0gICAgY29kZXNlbCA9IFNFTEVDVE9SX0FsbG9jQmxvY2soICh2b2lkICopQ0FMTDE2X1N0YXJ0LAorICAgIGNvZGVzZWwgPSBHTE9CQUxfQ3JlYXRlQmxvY2soIEdNRU1fRklYRUQsICh2b2lkICopQ0FMTDE2X1N0YXJ0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KUNBTEwxNl9FbmQgLSAoaW50KUNBTEwxNl9TdGFydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0VHTUVOVF9DT0RFLCBUUlVFLCBGQUxTRSApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCBUUlVFLCBUUlVFLCBGQUxTRSApOwogICAgIGlmICghY29kZXNlbCkgcmV0dXJuIEZBTFNFOwogCiAgICAgICAvKiBQYXRjaCB0aGUgcmV0dXJuIGFkZHJlc3NlcyBmb3IgQ2FsbFRvMTYgcm91dGluZXMgKi8KQEAgLTEwOSwyMSArOTAsMjQgQEAKIH0KIAogCi0jaWZuZGVmIFdJTkVMSUIKLQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgUkVMQVlfRGVidWdDYWxsMzIKKyAqLwogdm9pZCBSRUxBWV9EZWJ1Z0NhbGwzMiggY2hhciAqYXJncyApCiB7CiAgICAgU1RBQ0sxNkZSQU1FICpmcmFtZTsKLSAgICBjaGFyICphcmdzMTY7CisgICAgc3RydWN0IGRsbF90YWJsZV9zICp0YWJsZTsKKyAgICBjaGFyICphcmdzMTYsICpuYW1lOwogICAgIGludCBpOwogCiAgICAgaWYgKCFkZWJ1Z2dpbmdfcmVsYXkpIHJldHVybjsKIAogICAgIGZyYW1lID0gQ1VSUkVOVF9TVEFDSzE2OwotICAgIHByaW50ZiggIkNhbGwgJXMuJWQ6ICVzKCIsCi0gICAgICAgICAgICBkbGxfYnVpbHRpbl90YWJsZVtmcmFtZS0+ZGxsX2lkLTFdLmRsbF9uYW1lLAotICAgICAgICAgICAgZnJhbWUtPm9yZGluYWxfbnVtYmVyLAotICAgICAgICAgICAgZGxsX2J1aWx0aW5fdGFibGVbZnJhbWUtPmRsbF9pZC0xXS50YWJsZS0+ZGxsX3RhYmxlW2ZyYW1lLT5vcmRpbmFsX251bWJlcl0uZXhwb3J0X25hbWUgKTsKKyAgICB0YWJsZSA9ICZkbGxfYnVpbHRpbl90YWJsZVtmcmFtZS0+ZGxsX2lkLTFdOworICAgIG5hbWUgID0gTU9EVUxFX0dldEVudHJ5UG9pbnROYW1lKCB0YWJsZS0+aE1vZHVsZSwgZnJhbWUtPm9yZGluYWxfbnVtYmVyICk7CisgICAgcHJpbnRmKCAiQ2FsbCAlcy4lZDogJSouKnMoIiwKKyAgICAgICAgICAgIHRhYmxlLT5uYW1lLCBmcmFtZS0+b3JkaW5hbF9udW1iZXIsICpuYW1lLCAqbmFtZSwgbmFtZSArIDEgKTsKKwogICAgIGFyZ3MxNiA9IChjaGFyICopZnJhbWUtPmFyZ3M7CiAgICAgZm9yIChpID0gMDsgaSA8IHN0cmxlbihhcmdzKTsgaSsrKQogICAgIHsKQEAgLTE2NSwzMCArMTQ5LDQxIEBACiB9CiAKIAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgUkVMQVlfRGVidWdSZXR1cm4KKyAqLwogdm9pZCBSRUxBWV9EZWJ1Z1JldHVybiggaW50IHNob3J0X3JldCwgaW50IHJldF92YWwgKQogewogICAgIFNUQUNLMTZGUkFNRSAqZnJhbWU7CisgICAgc3RydWN0IGRsbF90YWJsZV9zICp0YWJsZTsKKyAgICBjaGFyICpuYW1lOwogCiAgICAgaWYgKCFkZWJ1Z2dpbmdfcmVsYXkpIHJldHVybjsKIAogICAgIGZyYW1lID0gQ1VSUkVOVF9TVEFDSzE2OwotICAgIHByaW50ZiggIlJldCAgJXMuJWQ6ICVzKCkgIiwKLSAgICAgICAgICAgIGRsbF9idWlsdGluX3RhYmxlW2ZyYW1lLT5kbGxfaWQtMV0uZGxsX25hbWUsCi0gICAgICAgICAgICBmcmFtZS0+b3JkaW5hbF9udW1iZXIsCi0gICAgICAgICAgICBkbGxfYnVpbHRpbl90YWJsZVtmcmFtZS0+ZGxsX2lkLTFdLnRhYmxlLT5kbGxfdGFibGVbZnJhbWUtPm9yZGluYWxfbnVtYmVyXS5leHBvcnRfbmFtZSApOworICAgIHRhYmxlID0gJmRsbF9idWlsdGluX3RhYmxlW2ZyYW1lLT5kbGxfaWQtMV07CisgICAgbmFtZSAgPSBNT0RVTEVfR2V0RW50cnlQb2ludE5hbWUoIHRhYmxlLT5oTW9kdWxlLCBmcmFtZS0+b3JkaW5hbF9udW1iZXIgKTsKKyAgICBwcmludGYoICJSZXQgICVzLiVkOiAlKi4qcygpICIsCisgICAgICAgICAgICB0YWJsZS0+bmFtZSwgZnJhbWUtPm9yZGluYWxfbnVtYmVyLCAqbmFtZSwgKm5hbWUsIG5hbWUgKyAxICk7CiAgICAgaWYgKHNob3J0X3JldCkgcHJpbnRmKCAicmV0dmFsPTB4JTA0eFxuIiwgcmV0X3ZhbCAmIDB4ZmZmZiApOwogICAgIGVsc2UgcHJpbnRmKCAicmV0dmFsPTB4JTA4eFxuIiwgcmV0X3ZhbCApOwogfQogCiAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIFJFTEFZX1VuaW1wbGVtZW50ZWQKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBmb3IgdW5pbXBsZW1lbnRlZCBlbnRyeSBwb2ludHMgKGRlY2xhcmVkCisgKiBhcyAnc3R1YicgaW4gdGhlIHNwZWMgZmlsZSkuCisgKi8KIHZvaWQgUkVMQVlfVW5pbXBsZW1lbnRlZCh2b2lkKQogewogICAgIFNUQUNLMTZGUkFNRSAqZnJhbWUgPSBDVVJSRU5UX1NUQUNLMTY7CisgICAgc3RydWN0IGRsbF90YWJsZV9zICp0YWJsZSA9ICZkbGxfYnVpbHRpbl90YWJsZVtmcmFtZS0+ZGxsX2lkLTFdOworICAgIGNoYXIgKm5hbWUgPSBNT0RVTEVfR2V0RW50cnlQb2ludE5hbWUoIHRhYmxlLT5oTW9kdWxlLCBmcmFtZS0+b3JkaW5hbF9udW1iZXIgKTsKIAotICAgIGZwcmludGYoIHN0ZGVyciwgIk5vIGhhbmRsZXIgZm9yIHJvdXRpbmUgJXMuJWQgKCVzKVxuIiwKLSAgICAgICAgICAgICBkbGxfYnVpbHRpbl90YWJsZVtmcmFtZS0+ZGxsX2lkLTFdLmRsbF9uYW1lLAotICAgICAgICAgICAgIGZyYW1lLT5vcmRpbmFsX251bWJlciwKLSAgICAgICAgICAgICBkbGxfYnVpbHRpbl90YWJsZVtmcmFtZS0+ZGxsX2lkLTFdLnRhYmxlLT5kbGxfdGFibGVbZnJhbWUtPm9yZGluYWxfbnVtYmVyXS5leHBvcnRfbmFtZSApOworICAgIGZwcmludGYoIHN0ZGVyciwgIk5vIGhhbmRsZXIgZm9yIHJvdXRpbmUgJXMuJWQgKCUqLipzKVxuIiwKKyAgICAgICAgICAgICB0YWJsZS0+bmFtZSwgZnJhbWUtPm9yZGluYWxfbnVtYmVyLCAqbmFtZSwgKm5hbWUsIG5hbWUgKyAxICk7CiAgICAgZXhpdCgxKTsKIH0KIApAQCAtMjE0LDgzICsyMDksMyBAQAogICAgIHdoaWxlIChuYmFyZ3MtLSkgcHJpbnRmKCAiLDB4JXgiLCAqc3RhY2srKyApOwogICAgIHByaW50ZiggIilcbiIgKTsKIH0KLQotI2VuZGlmICAvKiBXSU5FTElCICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgkJCQkJRmluZERMTFRhYmxlCi0gKi8KLXN0cnVjdCBkbGxfdGFibGVfcyAqCi1GaW5kRExMVGFibGUoY2hhciAqZGxsX25hbWUpCi17Ci0gICAgaW50IGk7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgTl9CVUlMVElOUzsgaSsrKQotCWlmIChzdHJjYXNlY21wKGRsbF9idWlsdGluX3RhYmxlW2ldLmRsbF9uYW1lLCBkbGxfbmFtZSkgPT0gMAotCSAgJiYgZGxsX2J1aWx0aW5fdGFibGVbaV0uZGxsX2lzX3VzZWQpCi0JICAgIHJldHVybiBkbGxfYnVpbHRpbl90YWJsZVtpXS50YWJsZTsKLSAgICByZXR1cm4gTlVMTDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCQkJCQlGaW5kT3JkaW5hbEZyb21OYW1lCi0gKi8KLWludAotRmluZE9yZGluYWxGcm9tTmFtZShzdHJ1Y3QgZGxsX3RhYmxlX2VudHJ5X3MgKmRsbF90YWJsZSwgY2hhciAqZnVuY19uYW1lKQotewotICAgIGludCBpLCBsaW1pdDsKLQotICAgIGZvciAoaSA9IDA7IGkgPCBOX0JVSUxUSU5TOyBpKyspCi0JaWYgKGRsbF90YWJsZSA9PSBkbGxfYnVpbHRpbl90YWJsZVtpXS50YWJsZS0+ZGxsX3RhYmxlKQotCSAgICBicmVhazsKLSAgICAKLSAgICBpZiAoaSA9PSBOX0JVSUxUSU5TKQotCXJldHVybiAwOwotCi0gICAgbGltaXQgPSBkbGxfYnVpbHRpbl90YWJsZVtpXS50YWJsZS0+ZGxsX3RhYmxlX2xlbmd0aDsKLSAgICBmb3IgKGkgPSAwOyBpIDwgbGltaXQ7IGkrKykKLQlpZiAoc3RyY2FzZWNtcChkbGxfdGFibGVbaV0uZXhwb3J0X25hbWUsIGZ1bmNfbmFtZSkgPT0gMCkKLQkgICAgcmV0dXJuIGk7Ci0gICAgCi0gICAgcmV0dXJuIDA7Ci19Ci0KLSNpZm5kZWYgV0lORUxJQgotI2lmZGVmIFdJTkVTVEFUCi12b2lkIHdpbmVzdGF0KCl7Ci0JaW50IGksIGo7Ci0JZG91YmxlIHBlcmM7Ci0JaW50IHVzZWQsIGltcGxlbWVudGVkOwotCWludCB0dXNlZCwgdGltcGxlbWVudGVkOwotCXN0cnVjdCBkbGxfdGFibGVfZW50cnlfcyAqdGFibGU7Ci0KLQl0dXNlZCA9IDA7Ci0JdGltcGxlbWVudGVkID0gMDsKLSAgICBmb3IgKGkgPSAwOyBpIDwgTl9CVUlMVElOUzsgaSsrKSB7Ci0JICAgIHRhYmxlID0gZGxsX2J1aWx0aW5fdGFibGVbaV0udGFibGUtPmRsbF90YWJsZTsKLQkgICAgdXNlZCA9IDA7Ci0JICAgIGltcGxlbWVudGVkID0gMDsKLQkgICAgZm9yKGo9MDsgaiA8IGRsbF9idWlsdGluX3RhYmxlW2ldLnRhYmxlLT5kbGxfdGFibGVfbGVuZ3RoOyBqKyspIHsKLQkJICAgIGlmKHRhYmxlW2pdLnVzZWQpewotCQkJICAgIHVzZWQrKzsKLQkJCSAgICBpZiAodGFibGVbal0uZXhwb3J0X25hbWVbMF0pIGltcGxlbWVudGVkKys7Ci0JCQkgICAgZWxzZSAKLQkJCQkgICAgcHJpbnRmKCIlcy4lZCBub3QgaW1wbGVtZW50ZWRcbiIsCi0JCQkJCSAgIGRsbF9idWlsdGluX3RhYmxlW2ldLmRsbF9uYW1lLAotCQkJCQkgICBqKTsKLQkJICAgIH07Ci0JICAgIH07Ci0JICAgIHR1c2VkICs9IHVzZWQ7Ci0JICAgIHRpbXBsZW1lbnRlZCArPSBpbXBsZW1lbnRlZDsKLQkgICAgaWYodXNlZCkKLQkJICAgIHBlcmMgPSBpbXBsZW1lbnRlZCAqIDEwMC4wMCAvIHVzZWQ7Ci0JICAgIGVsc2UKLQkJICAgIHBlcmMgPSAwLjA7Ci0JICAgIGlmICh1c2VkKQotCQkgICAgcHJpbnRmKCIlczogJWQgb2YgJWQgKCUzLjFmICUlKVxuIiwgZGxsX2J1aWx0aW5fdGFibGVbaV0uZGxsX25hbWUsIGltcGxlbWVudGVkLCB1c2VkLCBwZXJjKTsKLSAgICB9OwotCXBlcmMgPSB0aW1wbGVtZW50ZWQgKiAxMDAuMDAgLyB0dXNlZDsKLQlwcmludGYoIlRPVEFMOiAlZCBvZiAlZCB3aW5hcGkgZnVuY3Rpb25zIGltcGxlbWVudGVkICglMy4xZiAlJSlcbiIsdGltcGxlbWVudGVkLCB0dXNlZCwgcGVyYyk7Ci19Ci0jZW5kaWYgLyogV0lORVNUQVQgKi8KLSNlbmRpZiAvKiAhV0lORUxJQiAqLwpkaWZmIC0tZ2l0IGEvaWYxNjMyL3JlbGF5MzIuYyBiL2lmMTYzMi9yZWxheTMyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTYwZDczOQotLS0gL2Rldi9udWxsCisrKyBiL2lmMTYzMi9yZWxheTMyLmMKQEAgLTAsMCArMSwxMTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgMTk5NSBNYXJ0aW4gdm9uIExvZXdpcworICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgIndpbmRvd3MuaCIKKyNpbmNsdWRlICJkbGxzLmgiCisjaW5jbHVkZSAicGVfaW1hZ2UuaCIKKyNpbmNsdWRlICJzdGRkZWJ1Zy5oIgorLyogI2RlZmluZSBERUJVR19SRUxBWSAqLworI2luY2x1ZGUgImRlYnVnLmgiCisKK1dJTjMyX2J1aWx0aW4JKldJTjMyX2J1aWx0aW5fbGlzdDsKKworaW50IFJFTEFZMzJfSW5pdCh2b2lkKQoreworI2lmbmRlZiBXSU5FTElCCisJLyogQWRkIGEgY2FsbCBmb3IgZWFjaCBETEwgKi8KKwlHREkzMl9Jbml0KCk7CisJS0VSTkVMMzJfSW5pdCgpOworCVNIRUxMMzJfSW5pdCgpOworCVVTRVIzMl9Jbml0KCk7CisJV0lOUFJPQ1MzMl9Jbml0KCk7CisjZW5kaWYKKwkvKiBXaHkgc2hvdWxkIGl0IGZhaWwsIGFueXdheXM/ICovCisJcmV0dXJuIDE7Cit9CisKK1dJTjMyX2J1aWx0aW4gKlJFTEFZMzJfR2V0QnVpbHRpbkRMTChjaGFyICpuYW1lKQoreworCVdJTjMyX2J1aWx0aW4gKml0OworCWZvcihpdD1XSU4zMl9idWlsdGluX2xpc3Q7aXQ7aXQ9aXQtPm5leHQpCisJaWYoc3RyY21wKG5hbWUsaXQtPm5hbWUpPT0wKQorCQlyZXR1cm4gaXQ7CisJcmV0dXJuIE5VTEw7Cit9CisKK3ZvaWQgUkVMQVkzMl9VbmltcGxlbWVudGVkKGNoYXIgKmRsbCwgaW50IGl0ZW0pCit7CisJV0lOMzJfYnVpbHRpbiAqRGxsOworCWZwcmludGYoIHN0ZGVyciwgIk5vIGhhbmRsZXIgZm9yIHJvdXRpbmUgJXMuJWQiLCBkbGwsIGl0ZW0pOworCURsbD1SRUxBWTMyX0dldEJ1aWx0aW5ETEwoZGxsKTsKKwlpZihEbGwgJiYgRGxsLT5mdW5jdGlvbnNbaXRlbV0ubmFtZSkKKwkJZnByaW50ZihzdGRlcnIsICIoJXM/KVxuIiwgRGxsLT5mdW5jdGlvbnNbaXRlbV0ubmFtZSk7CisJZWxzZQorCQlmcHJpbnRmKHN0ZGVyciwgIlxuIik7CisJZmZsdXNoKHN0ZGVycik7CisJZXhpdCgxKTsKK30KKwordm9pZCAqUkVMQVkzMl9HZXRFbnRyeVBvaW50KGNoYXIgKmRsbF9uYW1lLCBjaGFyICppdGVtLCBpbnQgaGludCkKK3sKKwlXSU4zMl9idWlsdGluICpkbGw7CisJaW50IGk7CisJZHByaW50Zl9tb2R1bGUoc3RkZGViLCAiTG9va2luZyBmb3IgJXMgaW4gJXMsIGhpbnQgJXhcbiIsCisJCWl0ZW0gPyBpdGVtOiAiKG5vIG5hbWUpIiwgZGxsX25hbWUsIGhpbnQpOworCWRsbD1SRUxBWTMyX0dldEJ1aWx0aW5ETEwoZGxsX25hbWUpOworCWlmKCFkbGwpcmV0dXJuIDA7CisJLyogaW1wb3J0IGJ5IG9yZGluYWwgKi8KKwlpZighaXRlbSl7CisJCWlmKGhpbnQgJiYgaGludDxkbGwtPnNpemUpcmV0dXJuIGRsbC0+ZnVuY3Rpb25zW2hpbnRdLmRlZmluaXRpb247CisJCXJldHVybiAwOworCX0KKwkvKiBoaW50IGlzIGNvcnJlY3QgKi8KKwlpZihoaW50ICYmIGhpbnQ8ZGxsLT5zaXplICYmIAorCQlkbGwtPmZ1bmN0aW9uc1toaW50XS5uYW1lICYmCisJCXN0cmNtcChpdGVtLGRsbC0+ZnVuY3Rpb25zW2hpbnRdLm5hbWUpPT0wKQorCQlyZXR1cm4gZGxsLT5mdW5jdGlvbnNbaGludF0uZGVmaW5pdGlvbjsKKwkvKiBoaW50IGlzIGluY29ycmVjdCwgc2VhcmNoIGZvciBuYW1lICovCisJZm9yKGk9MTtpPGRsbC0+c2l6ZTtpKyspCisJCWlmKHN0cmNtcChpdGVtLGRsbC0+ZnVuY3Rpb25zW2ldLm5hbWUpPT0wKQorCQkJcmV0dXJuIGRsbC0+ZnVuY3Rpb25zW2ldLmRlZmluaXRpb247CisJLyogZnVuY3Rpb24gYXQgaGludCBoYXMgbm8gbmFtZSAodW5pbXBsZW1lbnRlZCkgKi8KKwlpZihoaW50ICYmIGhpbnQ8ZGxsLT5zaXplICYmICFkbGwtPmZ1bmN0aW9uc1toaW50XS5uYW1lKQorCXsKKwkJZGxsLT5mdW5jdGlvbnNbaGludF0ubmFtZT1zdHJkdXAoaXRlbSk7CisJCWRwcmludGZfbW9kdWxlKHN0ZGRlYiwgIlJldHVybmluZyB1bmltcGxlbWVudGVkIGZ1bmN0aW9uICVzLiVkXG4iLAorCQkJZGxsX25hbWUsaGludCk7CisJCXJldHVybiBkbGwtPmZ1bmN0aW9uc1toaW50XS5kZWZpbml0aW9uOworCX0KKwlwcmludGYoIk5vdCBmb3VuZFxuIik7CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgUkVMQVkzMl9EZWJ1Z0VudGVyKGNoYXIgKmRsbCxjaGFyICpuYW1lKQoreworCWRwcmludGZfcmVsYXkoc3RkZGViLCAiRW50ZXJpbmcgJXMuJXNcbiIsZGxsLG5hbWUpOworfQorCitMT05HIFJFTEFZMzJfQ2FsbFdpbmRvd1Byb2MoIFdORFBST0MgZnVuYywgaW50IGh3bmQsIGludCBtZXNzYWdlLAorICAgICAgICAgICAgIGludCB3UGFyYW0sIGludCBsUGFyYW0gKQoreworCWludCByZXQ7CisJU3B5TWVzc2FnZShod25kLCBtZXNzYWdlLCB3UGFyYW0sIGxQYXJhbSk7CisJX19hc21fXyAoCisJCSJwdXNoICUxOyIKKwkJInB1c2ggJTI7IgorCQkicHVzaCAlMzsiCisJCSJwdXNoICU0OyIKKwkJImNhbGwgJTU7IgorCQk6ICI9YSIgKHJldCkKKwkJOiAiZyIgKGxQYXJhbSksICJnIiAod1BhcmFtKSwgImciIChtZXNzYWdlKSwgImciIChod25kKSwgImciIChmdW5jKQorCSk7CisJcmV0dXJuIHJldDsKK30KZGlmZiAtLWdpdCBhL2lmMTYzMi9zaGVsbC5zcGVjIGIvaWYxNjMyL3NoZWxsLnNwZWMKaW5kZXggY2FiNDQ3Zi4uYjAwYTVjNCAxMDA2NDQKLS0tIGEvaWYxNjMyL3NoZWxsLnNwZWMKKysrIGIvaWYxNjMyL3NoZWxsLnNwZWMKQEAgLTIyLDYgKzIyLDkgQEAKICAyMiBwYXNjYWwgU2hlbGxBYm91dCh3b3JkIHB0ciBwdHIgd29yZCkgU2hlbGxBYm91dAogIDMzIHBhc2NhbCBBYm91dERsZ1Byb2Mod29yZCB3b3JkIHdvcmQgbG9uZykgQWJvdXREbGdQcm9jCiAgMzQgcGFzY2FsIEV4dHJhY3RJY29uKHdvcmQgcHRyIHNfd29yZCkgRXh0cmFjdEljb24KKyAzNiBwYXNjYWwgRXh0cmFjdEFzc29jaWF0ZWRJY29uKHdvcmQgcHRyIHB0cikgRXh0cmFjdEFzc29jaWF0ZWRJY29uCisgMzcgcGFzY2FsIERvRW52aXJvbm1lbnRTdWJzdChwdHIgd29yZCB3b3JkKSBEb0Vudmlyb25tZW50U3Vic3QKKyAzOSBzdHViIEludGVybmFsRXh0cmFjdEljb24KIDEwMiBwYXNjYWwgUmVnaXN0ZXJTaGVsbEhvb2socHRyKSBSZWdpc3RlclNoZWxsSG9vawogMTAzIHBhc2NhbCBTaGVsbEhvb2tQcm9jKCkgU2hlbGxIb29rUHJvYwogCmRpZmYgLS1naXQgYS9pZjE2MzIvc2hlbGwzMi5zcGVjIGIvaWYxNjMyL3NoZWxsMzIuc3BlYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xY2UyZThhCi0tLSAvZGV2L251bGwKKysrIGIvaWYxNjMyL3NoZWxsMzIuc3BlYwpAQCAtMCwwICsxLDg3IEBACituYW1lCXNoZWxsMzIKK2Jhc2UJMQorCiswMDAwIHN0dWIgQ2hlY2tFc2NhcGVzQQorMDAwMSBzdHViIENoZWNrRXNjYXBlc1cKKzAwMDIgc3R1YiBDb21tYW5kTGluZVRvQXJndlcKKzAwMDMgc3R1YiBEb0Vudmlyb25tZW50U3Vic3RBCiswMDA0IHN0dWIgRG9FbnZpcm9ubWVudFN1YnN0VworMDAwNSBzdHViIERyYWdBY2NlcHRGaWxlcworMDAwNiBzdHViIERyYWdGaW5pc2gKKzAwMDcgc3R1YiBEcmFnUXVlcnlGaWxlQQorMDAwOCBzdHViIERyYWdRdWVyeUZpbGVBb3JXCiswMDA5IHN0dWIgRHJhZ1F1ZXJ5RmlsZVcKKzAwMTAgc3R1YiBEcmFnUXVlcnlQb2ludAorMDAxMSBzdHViIER1cGxpY2F0ZUljb24KKzAwMTIgc3R1YiBFeHRyYWN0QXNzb2NpYXRlZEljb25BCiswMDEzIHN0dWIgRXh0cmFjdEFzc29jaWF0ZWRJY29uRXhBCiswMDE0IHN0dWIgRXh0cmFjdEFzc29jaWF0ZWRJY29uRXhXCiswMDE1IHN0dWIgRXh0cmFjdEFzc29jaWF0ZWRJY29uVworMDAxNiBzdHViIEV4dHJhY3RJY29uQQorMDAxNyBzdHViIEV4dHJhY3RJY29uUmVzSW5mb0EKKzAwMTggc3R1YiBFeHRyYWN0SWNvblJlc0luZm9XCiswMDE5IHN0dWIgRXh0cmFjdEljb25XCiswMDIwIHN0dWIgRXh0cmFjdFZlcnNpb25SZXNvdXJjZTE2VworMDAyMSBzdHViIEZpbmRFeGVEbGdQcm9jCiswMDIyIHN0dWIgRmluZEV4ZWN1dGFibGVBCiswMDIzIHN0dWIgRmluZEV4ZWN1dGFibGVXCiswMDI0IHN0dWIgRnJlZUljb25MaXN0CiswMDI1IHN0dWIgSW50ZXJuYWxFeHRyYWN0SWNvbkxpc3RBCiswMDI2IHN0dWIgSW50ZXJuYWxFeHRyYWN0SWNvbkxpc3RXCiswMDI3IHN0dWIgUmVhbFNoZWxsRXhlY3V0ZUEKKzAwMjggc3R1YiBSZWFsU2hlbGxFeGVjdXRlRXhBCiswMDI5IHN0dWIgUmVhbFNoZWxsRXhlY3V0ZUV4VworMDAzMCBzdHViIFJlYWxTaGVsbEV4ZWN1dGVXCiswMDMxIHN0dWIgUmVnZW5lcmF0ZVVzZXJFbnZpcm9ubWVudAorMDAzMiBzdHViIFJlZ2lzdGVyU2hlbGxIb29rCiswMDMzIHN0dWIgU2hlQ2hhbmdlRGlyQQorMDAzNCBzdHViIFNoZUNoYW5nZURpckV4QQorMDAzNSBzdHViIFNoZUNoYW5nZURpckV4VworMDAzNiBzdHViIFNoZUNoYW5nZURpclcKKzAwMzcgc3R1YiBTaGVDb252ZXJ0UGF0aFcKKzAwMzggc3R1YiBTaGVGdWxsUGF0aEEKKzAwMzkgc3R1YiBTaGVGdWxsUGF0aFcKKzAwNDAgc3R1YiBTaGVHZXRDdXJEcml2ZQorMDA0MSBzdHViIFNoZUdldERpckEKKzAwNDIgc3R1YiBTaGVHZXREaXJFeFcKKzAwNDMgc3R1YiBTaGVHZXREaXJXCiswMDQ0IHN0dWIgU2hlR2V0UGF0aE9mZnNldFcKKzAwNDUgc3R1YiBTaGVSZW1vdmVRdW90ZXNBCiswMDQ2IHN0dWIgU2hlUmVtb3ZlUXVvdGVzVworMDA0NyBzdHViIFNoZVNldEN1ckRyaXZlCiswMDQ4IHN0dWIgU2hlU2hvcnRlblBhdGhBCiswMDQ5IHN0dWIgU2hlU2hvcnRlblBhdGhXCiswMDUwIHN0dWIgU2hlbGxBYm91dEEKKzAwNTEgc3R1YiBTaGVsbEFib3V0VworMDA1MiBzdHViIFNoZWxsRXhlY3V0ZUEKKzAwNTMgc3R1YiBTaGVsbEV4ZWN1dGVXCiswMDU0IHN0dWIgU2hlbGxIb29rUHJvYworMDA1NSBzdHViIFN0ckNockEKKzAwNTYgc3R1YiBTdHJDaHJJQQorMDA1NyBzdHViIFN0ckNocklXCiswMDU4IHN0dWIgU3RyQ2hyVworMDA1OSBzdHViIFN0ckNtcE5BCiswMDYwIHN0dWIgU3RyQ21wTklBCiswMDYxIHN0dWIgU3RyQ21wTklXCiswMDYyIHN0dWIgU3RyQ21wTlcKKzAwNjMgc3R1YiBTdHJDcHlOQQorMDA2NCBzdHViIFN0ckNweU5XCiswMDY1IHN0dWIgU3RyTkNtcEEKKzAwNjYgc3R1YiBTdHJOQ21wSUEKKzAwNjcgc3R1YiBTdHJOQ21wSVcKKzAwNjggc3R1YiBTdHJOQ21wVworMDA2OSBzdHViIFN0ck5DcHlBCiswMDcwIHN0dWIgU3RyTkNweVcKKzAwNzEgc3R1YiBTdHJSQ2hyQQorMDA3MiBzdHViIFN0clJDaHJJQQorMDA3MyBzdHViIFN0clJDaHJJVworMDA3NCBzdHViIFN0clJDaHJXCiswMDc1IHN0dWIgU3RyUlN0ckEKKzAwNzYgc3R1YiBTdHJSU3RySUEKKzAwNzcgc3R1YiBTdHJSU3RySVcKKzAwNzggc3R1YiBTdHJSU3RyVworMDA3OSBzdHViIFN0clN0ckEKKzAwODAgc3R1YiBTdHJTdHJJQQorMDA4MSBzdHViIFN0clN0cklXCiswMDgyIHN0dWIgU3RyU3RyVworMDA4MyBzdHViIFdPV1NoZWxsRXhlY3V0ZQpkaWZmIC0tZ2l0IGEvaWYxNjMyL3N0b3JhZ2Uuc3BlYyBiL2lmMTYzMi9zdG9yYWdlLnNwZWMKaW5kZXggZDZkNTljNy4uMDhlZmRjMyAxMDA2NDQKLS0tIGEvaWYxNjMyL3N0b3JhZ2Uuc3BlYworKysgYi9pZjE2MzIvc3RvcmFnZS5zcGVjCkBAIC0xLDEzICsxLDEzIEBACiBuYW1lCXN0b3JhZ2UKIGlkCTIzCiAgCi0jMSBTVEdDUkVBVEVET0NGSUxFCi0jMiBTVEdDUkVBVEVET0NGSUxFT05JTE9DS0JZVEVTCi0jMyBTVEdPUEVOU1RPUkFHRQotIzQgU1RHT1BFTlNUT1JBR0VPTklMT0NLQllURVMKLSM1IFNUR0lTU1RPUkFHRUZJTEUKLSM2IFNUR0lTU1RPUkFHRUlMT0NLQllURVMKLSM3IFNUR1NFVFRJTUVTCisxIHN0dWIgU3RnQ3JlYXRlRG9jRmlsZQorMiBzdHViIFN0Z0NyZWF0ZURvY0ZpbGVPbklMb2NrQnl0ZXMKKzMgc3R1YiBTdGdPcGVuU3RvcmFnZQorNCBzdHViIFN0Z09wZW5TdG9yYWdlT25JTG9ja0J5dGVzCis1IHN0dWIgU3RnSXNTdG9yYWdlRmlsZQorNiBzdHViIFN0Z0lzU3RvcmFnZUlMb2NrQnl0ZXMKKzcgc3R1YiBTdGdTZXRUaW1lcwogIzggV0VQCiAjOSBfX19FWFBPUlRFRFNUVUIKLSMxMDMgRExMR0VUQ0xBU1NPQkpFQ1QKKzEwMyBzdHViIERsbEdldENsYXNzT2JqZWN0CmRpZmYgLS1naXQgYS9pZjE2MzIvc3lzdGVtLnNwZWMgYi9pZjE2MzIvc3lzdGVtLnNwZWMKaW5kZXggNmFkYjUzNC4uNGVkYzQ4NSAxMDA2NDQKLS0tIGEvaWYxNjMyL3N5c3RlbS5zcGVjCisrKyBiL2lmMTYzMi9zeXN0ZW0uc3BlYwpAQCAtMSw0ICsxLDEzIEBACiBuYW1lCXN5c3RlbQogaWQJMTEKIAorMSBzdHViIElucXVpcmVTeXN0ZW0KKzIgc3R1YiBDcmVhdGVTeXN0ZW1UaW1lcgorMyBzdHViIEtpbGxTeXN0ZW1UaW1lcgorNCBzdHViIEVuYWJsZVN5c3RlbVRpbWVycworNSBzdHViIERpc2FibGVTeXN0ZW1UaW1lcnMKIDYgcGFzY2FsIEdldFN5c3RlbW1zZWNDb3VudCgpIEdldFRpY2tDb3VudAorNyBzdHViIEdldDgweDg3U2F2ZVNpemUKKzggc3R1YiBTYXZlODB4ODdTdGF0ZQorOSBzdHViIFJlc3RvcmU4MHg4N1N0YXRlCisjMjAgc3R1YiBBMjBfUHJvYwpkaWZmIC0tZ2l0IGEvaWYxNjMyL3VzZXIuc3BlYyBiL2lmMTYzMi91c2VyLnNwZWMKaW5kZXggOTY5ZWIxNC4uZTY5MzkwYyAxMDA2NDQKLS0tIGEvaWYxNjMyL3VzZXIuc3BlYworKysgYi9pZjE2MzIvdXNlci5zcGVjCkBAIC0xMTQsNyArMTE0LDcgQEAKIDExMyBwYXNjYWwgVHJhbnNsYXRlTWVzc2FnZShwdHIpIFRyYW5zbGF0ZU1lc3NhZ2UKIDExNCBwYXNjYWwgRGlzcGF0Y2hNZXNzYWdlKHB0cikgRGlzcGF0Y2hNZXNzYWdlCiAxMTUgc3R1YiBSZXBseU1lc3NhZ2UKLTExNiBzdHViIFBvc3RBcHBNZXNzYWdlCisxMTYgcGFzY2FsIFBvc3RBcHBNZXNzYWdlKHdvcmQgd29yZCB3b3JkIGxvbmcpIFBvc3RBcHBNZXNzYWdlCiAxMTggcGFzY2FsIFJlZ2lzdGVyV2luZG93TWVzc2FnZShwdHIpIFJlZ2lzdGVyV2luZG93TWVzc2FnZQogMTE5IHBhc2NhbCBHZXRNZXNzYWdlUG9zKCkgR2V0TWVzc2FnZVBvcwogMTIwIHBhc2NhbCBHZXRNZXNzYWdlVGltZSgpIEdldE1lc3NhZ2VUaW1lCkBAIC0zNzIsNyArMzcyLDcgQEAKIDQ1NiBzdHViIExvYWRJY29uSGFuZGxlcgogNDU3IHBhc2NhbCBEZXN0cm95SWNvbih3b3JkKSBEZXN0cm95SWNvbgogNDU4IHBhc2NhbCBEZXN0cm95Q3Vyc29yKHdvcmQpIERlc3Ryb3lDdXJzb3IKLTQ1OSBzdHViIER1bXBJY29uCis0NTkgcGFzY2FsIER1bXBJY29uKHB0ciBwdHIgcHRyIHB0cikgRHVtcEljb24KIDQ2MCBwYXNjYWwgR2V0SW50ZXJuYWxXaW5kb3dQb3Mod29yZCBwdHIgcHRyKSBHZXRJbnRlcm5hbFdpbmRvd1BvcwogNDYxIHBhc2NhbCBTZXRJbnRlcm5hbFdpbmRvd1Bvcyh3b3JkIHdvcmQgcHRyIHB0cikgU2V0SW50ZXJuYWxXaW5kb3dQb3MKIDQ2MiBzdHViIENhbGNDaGlsZFNjcm9sbApkaWZmIC0tZ2l0IGEvaWYxNjMyL3VzZXIzMi5zcGVjIGIvaWYxNjMyL3VzZXIzMi5zcGVjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiODBiZjAKLS0tIC9kZXYvbnVsbAorKysgYi9pZjE2MzIvdXNlcjMyLnNwZWMKQEAgLTAsMCArMSw1OTEgQEAKK25hbWUJdXNlcjMyCitiYXNlCTEKKworMDAwMCBzdHViIEFjdGl2YXRlS2V5Ym9hcmRMYXlvdXQKKzAwMDEgc3R1YiBBZGp1c3RXaW5kb3dSZWN0CiswMDAyIHN0dWIgQWRqdXN0V2luZG93UmVjdEV4CiswMDAzIHN0dWIgQW55UG9wdXAKKzAwMDQgc3R1YiBBcHBlbmRNZW51QQorMDAwNSBzdHViIEFwcGVuZE1lbnVXCiswMDA2IHN0dWIgQXJyYW5nZUljb25pY1dpbmRvd3MKKzAwMDcgc3R1YiBBdHRhY2hUaHJlYWRJbnB1dAorMDAwOCBzdHViIEJlZ2luRGVmZXJXaW5kb3dQb3MKKzAwMDkgc3R1YiBCZWdpblBhaW50CiswMDEwIHN0dWIgQnJpbmdXaW5kb3dUb1RvcAorMDAxMSBzdHViIEJyb2FkY2FzdFN5c3RlbU1lc3NhZ2UKKzAwMTIgc3R1YiBDYWxjQ2hpbGRTY3JvbGwKKzAwMTMgc3R1YiBDYWxsTXNnRmlsdGVyCiswMDE0IHN0dWIgQ2FsbE1zZ0ZpbHRlckEKKzAwMTUgc3R1YiBDYWxsTXNnRmlsdGVyVworMDAxNiBzdHViIENhbGxOZXh0SG9va0V4CiswMDE3IHN0dWIgQ2FsbFdpbmRvd1Byb2NBCiswMDE4IHN0dWIgQ2FsbFdpbmRvd1Byb2NXCiswMDE5IHN0dWIgQ2FzY2FkZUNoaWxkV2luZG93cworMDAyMCBzdHViIENhc2NhZGVXaW5kb3dzCiswMDIxIHN0dWIgQ2hhbmdlQ2xpcGJvYXJkQ2hhaW4KKzAwMjIgc3R1YiBDaGFuZ2VNZW51QQorMDAyMyBzdHViIENoYW5nZU1lbnVXCiswMDI0IHN0dWIgQ2hhckxvd2VyQQorMDAyNSBzdHViIENoYXJMb3dlckJ1ZmZBCiswMDI2IHN0dWIgQ2hhckxvd2VyQnVmZlcKKzAwMjcgc3R1YiBDaGFyTG93ZXJXCiswMDI4IHN0dWIgQ2hhck5leHRBCiswMDI5IHN0dWIgQ2hhck5leHRFeEEKKzAwMzAgc3R1YiBDaGFyTmV4dEV4VworMDAzMSBzdHViIENoYXJOZXh0VworMDAzMiBzdHViIENoYXJQcmV2QQorMDAzMyBzdHViIENoYXJQcmV2RXhBCiswMDM0IHN0dWIgQ2hhclByZXZFeFcKKzAwMzUgc3R1YiBDaGFyUHJldlcKKzAwMzYgc3R1YiBDaGFyVG9PZW1BCiswMDM3IHN0dWIgQ2hhclRvT2VtQnVmZkEKKzAwMzggc3R1YiBDaGFyVG9PZW1CdWZmVworMDAzOSBzdHViIENoYXJUb09lbVcKKzAwNDAgc3R1YiBDaGFyVXBwZXJBCiswMDQxIHN0dWIgQ2hhclVwcGVyQnVmZkEKKzAwNDIgc3R1YiBDaGFyVXBwZXJCdWZmVworMDA0MyBzdHViIENoYXJVcHBlclcKKzAwNDQgc3R1YiBDaGVja0RsZ0J1dHRvbgorMDA0NSBzdHViIENoZWNrTWVudUl0ZW0KKzAwNDYgc3R1YiBDaGVja01lbnVSYWRpb0l0ZW0KKzAwNDcgc3R1YiBDaGVja1JhZGlvQnV0dG9uCiswMDQ4IHN0dWIgQ2hpbGRXaW5kb3dGcm9tUG9pbnQKKzAwNDkgc3R1YiBDaGlsZFdpbmRvd0Zyb21Qb2ludEV4CiswMDUwIHN0dWIgQ2xpZW50VGhyZWFkQ29ubmVjdAorMDA1MSBzdHViIENsaWVudFRvU2NyZWVuCiswMDUyIHN0dWIgQ2xpcEN1cnNvcgorMDA1MyBzdHViIENsb3NlQ2xpcGJvYXJkCiswMDU0IHN0dWIgQ2xvc2VEZXNrdG9wCiswMDU1IHN0dWIgQ2xvc2VXaW5kb3cKKzAwNTYgc3R1YiBDbG9zZVdpbmRvd1N0YXRpb24KKzAwNTcgc3R1YiBDb3B5QWNjZWxlcmF0b3JUYWJsZUEKKzAwNTggc3R1YiBDb3B5QWNjZWxlcmF0b3JUYWJsZVcKKzAwNTkgc3R1YiBDb3B5SWNvbgorMDA2MCBzdHViIENvcHlJbWFnZQorMDA2MSBzdHViIENvcHlSZWN0CiswMDYyIHN0dWIgQ291bnRDbGlwYm9hcmRGb3JtYXRzCiswMDYzIHN0dWIgQ3JlYXRlQWNjZWxlcmF0b3JUYWJsZUEKKzAwNjQgc3R1YiBDcmVhdGVBY2NlbGVyYXRvclRhYmxlVworMDA2NSBzdHViIENyZWF0ZUNhcmV0CiswMDY2IHN0dWIgQ3JlYXRlQ3Vyc29yCiswMDY3IHN0dWIgQ3JlYXRlRGVza3RvcEEKKzAwNjggc3R1YiBDcmVhdGVEZXNrdG9wVworMDA2OSBzdHViIENyZWF0ZURpYWxvZ0luZGlyZWN0UGFyYW1BCiswMDcwIHN0dWIgQ3JlYXRlRGlhbG9nSW5kaXJlY3RQYXJhbUFvclcKKzAwNzEgc3R1YiBDcmVhdGVEaWFsb2dJbmRpcmVjdFBhcmFtVworMDA3MiBzdHViIENyZWF0ZURpYWxvZ1BhcmFtQQorMDA3MyBzdHViIENyZWF0ZURpYWxvZ1BhcmFtVworMDA3NCBzdHViIENyZWF0ZUljb24KKzAwNzUgc3R1YiBDcmVhdGVJY29uRnJvbVJlc291cmNlCiswMDc2IHN0dWIgQ3JlYXRlSWNvbkZyb21SZXNvdXJjZUV4CiswMDc3IHN0dWIgQ3JlYXRlSWNvbkluZGlyZWN0CiswMDc4IHN0dWIgQ3JlYXRlTURJV2luZG93QQorMDA3OSBzdHViIENyZWF0ZU1ESVdpbmRvd1cKKzAwODAgc3R1YiBDcmVhdGVNZW51CiswMDgxIHN0dWIgQ3JlYXRlUG9wdXBNZW51CiswMDgyIHN0dWIgQ3JlYXRlV2luZG93RXhBCiswMDgzIHN0dWIgQ3JlYXRlV2luZG93RXhXCiswMDg0IHN0dWIgQ3JlYXRlV2luZG93U3RhdGlvbkEKKzAwODUgc3R1YiBDcmVhdGVXaW5kb3dTdGF0aW9uVworMDA4NiBzdHViIERkZUFiYW5kb25UcmFuc2FjdGlvbgorMDA4NyBzdHViIERkZUFjY2Vzc0RhdGEKKzAwODggc3R1YiBEZGVBZGREYXRhCiswMDg5IHN0dWIgRGRlQ2xpZW50VHJhbnNhY3Rpb24KKzAwOTAgc3R1YiBEZGVDbXBTdHJpbmdIYW5kbGVzCiswMDkxIHN0dWIgRGRlQ29ubmVjdAorMDA5MiBzdHViIERkZUNvbm5lY3RMaXN0CiswMDkzIHN0dWIgRGRlQ3JlYXRlRGF0YUhhbmRsZQorMDA5NCBzdHViIERkZUNyZWF0ZVN0cmluZ0hhbmRsZUEKKzAwOTUgc3R1YiBEZGVDcmVhdGVTdHJpbmdIYW5kbGVXCiswMDk2IHN0dWIgRGRlRGlzY29ubmVjdAorMDA5NyBzdHViIERkZURpc2Nvbm5lY3RMaXN0CiswMDk4IHN0dWIgRGRlRW5hYmxlQ2FsbGJhY2sKKzAwOTkgc3R1YiBEZGVGcmVlRGF0YUhhbmRsZQorMDEwMCBzdHViIERkZUZyZWVTdHJpbmdIYW5kbGUKKzAxMDEgc3R1YiBEZGVHZXREYXRhCiswMTAyIHN0dWIgRGRlR2V0TGFzdEVycm9yCiswMTAzIHN0dWIgRGRlR2V0UXVhbGl0eU9mU2VydmljZQorMDEwNCBzdHViIERkZUltcGVyc29uYXRlQ2xpZW50CiswMTA1IHN0dWIgRGRlSW5pdGlhbGl6ZUEKKzAxMDYgc3R1YiBEZGVJbml0aWFsaXplVworMDEwNyBzdHViIERkZUtlZXBTdHJpbmdIYW5kbGUKKzAxMDggc3R1YiBEZGVOYW1lU2VydmljZQorMDEwOSBzdHViIERkZVBvc3RBZHZpc2UKKzAxMTAgc3R1YiBEZGVRdWVyeUNvbnZJbmZvCiswMTExIHN0dWIgRGRlUXVlcnlOZXh0U2VydmVyCiswMTEyIHN0dWIgRGRlUXVlcnlTdHJpbmdBCiswMTEzIHN0dWIgRGRlUXVlcnlTdHJpbmdXCiswMTE0IHN0dWIgRGRlUmVjb25uZWN0CiswMTE1IHN0dWIgRGRlU2V0UXVhbGl0eU9mU2VydmljZQorMDExNiBzdHViIERkZVNldFVzZXJIYW5kbGUKKzAxMTcgc3R1YiBEZGVVbmFjY2Vzc0RhdGEKKzAxMTggc3R1YiBEZGVVbmluaXRpYWxpemUKKzAxMTkgc3R1YiBEZWZEbGdQcm9jQQorMDEyMCBzdHViIERlZkRsZ1Byb2NXCiswMTIxIHN0dWIgRGVmRnJhbWVQcm9jQQorMDEyMiBzdHViIERlZkZyYW1lUHJvY1cKKzAxMjMgc3R1YiBEZWZNRElDaGlsZFByb2NBCiswMTI0IHN0dWIgRGVmTURJQ2hpbGRQcm9jVworMDEyNSBzdHViIERlZldpbmRvd1Byb2NBCiswMTI2IHN0dWIgRGVmV2luZG93UHJvY1cKKzAxMjcgc3R1YiBEZWZlcldpbmRvd1BvcworMDEyOCBzdHViIERlbGV0ZU1lbnUKKzAxMjkgc3R1YiBEZXN0cm95QWNjZWxlcmF0b3JUYWJsZQorMDEzMCBzdHViIERlc3Ryb3lDYXJldAorMDEzMSBzdHViIERlc3Ryb3lDdXJzb3IKKzAxMzIgc3R1YiBEZXN0cm95SWNvbgorMDEzMyBzdHViIERlc3Ryb3lNZW51CiswMTM0IHN0dWIgRGVzdHJveVdpbmRvdworMDEzNSBzdHViIERpYWxvZ0JveEluZGlyZWN0UGFyYW1BCiswMTM2IHN0dWIgRGlhbG9nQm94SW5kaXJlY3RQYXJhbUFvclcKKzAxMzcgc3R1YiBEaWFsb2dCb3hJbmRpcmVjdFBhcmFtVworMDEzOCBzdHViIERpYWxvZ0JveFBhcmFtQQorMDEzOSBzdHViIERpYWxvZ0JveFBhcmFtVworMDE0MCBzdHViIERpc3BhdGNoTWVzc2FnZUEKKzAxNDEgc3R1YiBEaXNwYXRjaE1lc3NhZ2VXCiswMTQyIHN0dWIgRGxnRGlyTGlzdEEKKzAxNDMgc3R1YiBEbGdEaXJMaXN0Q29tYm9Cb3hBCiswMTQ0IHN0dWIgRGxnRGlyTGlzdENvbWJvQm94VworMDE0NSBzdHViIERsZ0Rpckxpc3RXCiswMTQ2IHN0dWIgRGxnRGlyU2VsZWN0Q29tYm9Cb3hFeEEKKzAxNDcgc3R1YiBEbGdEaXJTZWxlY3RDb21ib0JveEV4VworMDE0OCBzdHViIERsZ0RpclNlbGVjdEV4QQorMDE0OSBzdHViIERsZ0RpclNlbGVjdEV4VworMDE1MCBzdHViIERyYWdEZXRlY3QKKzAxNTEgc3R1YiBEcmFnT2JqZWN0CiswMTUyIHN0dWIgRHJhd0FuaW1hdGVkUmVjdHMKKzAxNTMgc3R1YiBEcmF3Q2FwdGlvbgorMDE1NCBzdHViIERyYXdFZGdlCiswMTU1IHN0dWIgRHJhd0ZvY3VzUmVjdAorMDE1NiBzdHViIERyYXdGcmFtZQorMDE1NyBzdHViIERyYXdGcmFtZUNvbnRyb2wKKzAxNTggc3R1YiBEcmF3SWNvbgorMDE1OSBzdHViIERyYXdJY29uRXgKKzAxNjAgc3R1YiBEcmF3TWVudUJhcgorMDE2MSBzdHViIERyYXdTdGF0ZUEKKzAxNjIgc3R1YiBEcmF3U3RhdGVXCiswMTYzIHN0dWIgRHJhd1RleHRBCiswMTY0IHN0dWIgRHJhd1RleHRFeEEKKzAxNjUgc3R1YiBEcmF3VGV4dEV4VworMDE2NiBzdHViIERyYXdUZXh0VworMDE2NyBzdHViIEVkaXRXbmRQcm9jCiswMTY4IHN0dWIgRW1wdHlDbGlwYm9hcmQKKzAxNjkgc3R1YiBFbmFibGVNZW51SXRlbQorMDE3MCBzdHViIEVuYWJsZVNjcm9sbEJhcgorMDE3MSBzdHViIEVuYWJsZVdpbmRvdworMDE3MiBzdHViIEVuZERlZmVyV2luZG93UG9zCiswMTczIHN0dWIgRW5kRGlhbG9nCiswMTc0IHN0dWIgRW5kTWVudQorMDE3NSBzdHViIEVuZFBhaW50CiswMTc2IHN0dWIgRW5kVGFzaworMDE3NyBzdHViIEVudW1DaGlsZFdpbmRvd3MKKzAxNzggc3R1YiBFbnVtQ2xpcGJvYXJkRm9ybWF0cworMDE3OSBzdHViIEVudW1EZXNrdG9wc0EKKzAxODAgc3R1YiBFbnVtRGVza3RvcHNXCiswMTgxIHN0dWIgRW51bURpc3BsYXlEZXZpY2VNb2Rlc0EKKzAxODIgc3R1YiBFbnVtRGlzcGxheURldmljZU1vZGVzVworMDE4MyBzdHViIEVudW1EaXNwbGF5RGV2aWNlc0EKKzAxODQgc3R1YiBFbnVtRGlzcGxheURldmljZXNXCiswMTg1IHN0dWIgRW51bVByb3BzQQorMDE4NiBzdHViIEVudW1Qcm9wc0V4QQorMDE4NyBzdHViIEVudW1Qcm9wc0V4VworMDE4OCBzdHViIEVudW1Qcm9wc1cKKzAxODkgc3R1YiBFbnVtVGhyZWFkV2luZG93cworMDE5MCBzdHViIEVudW1XaW5kb3dTdGF0aW9uc0EKKzAxOTEgc3R1YiBFbnVtV2luZG93U3RhdGlvbnNXCiswMTkyIHN0dWIgRW51bVdpbmRvd3MKKzAxOTMgc3R1YiBFcXVhbFJlY3QKKzAxOTQgc3R1YiBFeGNsdWRlVXBkYXRlUmduCiswMTk1IHN0dWIgRXhpdFdpbmRvd3NFeAorMDE5NiBzdHViIEZpbGxSZWN0CiswMTk3IHN0dWIgRmluZFdpbmRvd0EKKzAxOTggc3R1YiBGaW5kV2luZG93RXhBCiswMTk5IHN0dWIgRmluZFdpbmRvd0V4VworMDIwMCBzdHViIEZpbmRXaW5kb3dXCiswMjAxIHN0dWIgRmxhc2hXaW5kb3cKKzAyMDIgc3R1YiBGcmFtZVJlY3QKKzAyMDMgc3R1YiBGcmVlRERFbFBhcmFtCiswMjA0IHN0dWIgR2V0QWN0aXZlV2luZG93CiswMjA1IHN0dWIgR2V0QXBwQ29tcGF0RmxhZ3MKKzAyMDYgc3R1YiBHZXRBc3luY0tleVN0YXRlCiswMjA3IHN0dWIgR2V0Q2FwdHVyZQorMDIwOCBzdHViIEdldENhcmV0QmxpbmtUaW1lCiswMjA5IHN0dWIgR2V0Q2FyZXRQb3MKKzAyMTAgc3R1YiBHZXRDbGFzc0luZm9BCiswMjExIHN0dWIgR2V0Q2xhc3NJbmZvRXhBCiswMjEyIHN0dWIgR2V0Q2xhc3NJbmZvRXhXCiswMjEzIHN0dWIgR2V0Q2xhc3NJbmZvVworMDIxNCBzdHViIEdldENsYXNzTG9uZ0EKKzAyMTUgc3R1YiBHZXRDbGFzc0xvbmdXCiswMjE2IHN0dWIgR2V0Q2xhc3NOYW1lQQorMDIxNyBzdHViIEdldENsYXNzTmFtZVcKKzAyMTggc3R1YiBHZXRDbGFzc1dvcmQKKzAyMTkgc3R1YiBHZXRDbGllbnRSZWN0CiswMjIwIHN0dWIgR2V0Q2xpcEN1cnNvcgorMDIyMSBzdHViIEdldENsaXBib2FyZERhdGEKKzAyMjIgc3R1YiBHZXRDbGlwYm9hcmRGb3JtYXROYW1lQQorMDIyMyBzdHViIEdldENsaXBib2FyZEZvcm1hdE5hbWVXCiswMjI0IHN0dWIgR2V0Q2xpcGJvYXJkT3duZXIKKzAyMjUgc3R1YiBHZXRDbGlwYm9hcmRWaWV3ZXIKKzAyMjYgc3R1YiBHZXRDdXJzb3IKKzAyMjcgc3R1YiBHZXRDdXJzb3JJbmZvCiswMjI4IHN0dWIgR2V0Q3Vyc29yUG9zCiswMjI5IHN0dWIgR2V0REMKKzAyMzAgc3R1YiBHZXREQ0V4CiswMjMxIHN0dWIgR2V0RGVza3RvcFdpbmRvdworMDIzMiBzdHViIEdldERpYWxvZ0Jhc2VVbml0cworMDIzMyBzdHViIEdldERsZ0N0cmxJRAorMDIzNCBzdHViIEdldERsZ0l0ZW0KKzAyMzUgc3R1YiBHZXREbGdJdGVtSW50CiswMjM2IHN0dWIgR2V0RGxnSXRlbVRleHRBCiswMjM3IHN0dWIgR2V0RGxnSXRlbVRleHRXCiswMjM4IHN0dWIgR2V0RG91YmxlQ2xpY2tUaW1lCiswMjM5IHN0dWIgR2V0Rm9jdXMKKzAyNDAgc3R1YiBHZXRGb3JlZ3JvdW5kV2luZG93CiswMjQxIHN0dWIgR2V0SWNvbkluZm8KKzAyNDIgc3R1YiBHZXRJbnB1dERlc2t0b3AKKzAyNDMgc3R1YiBHZXRJbnB1dFN0YXRlCiswMjQ0IHN0dWIgR2V0SW50ZXJuYWxXaW5kb3dQb3MKKzAyNDUgc3R1YiBHZXRLQkNvZGVQYWdlCiswMjQ2IHN0dWIgR2V0S2V5TmFtZVRleHRBCiswMjQ3IHN0dWIgR2V0S2V5TmFtZVRleHRXCiswMjQ4IHN0dWIgR2V0S2V5U3RhdGUKKzAyNDkgc3R1YiBHZXRLZXlib2FyZExheW91dAorMDI1MCBzdHViIEdldEtleWJvYXJkTGF5b3V0TGlzdAorMDI1MSBzdHViIEdldEtleWJvYXJkTGF5b3V0TmFtZUEKKzAyNTIgc3R1YiBHZXRLZXlib2FyZExheW91dE5hbWVXCiswMjUzIHN0dWIgR2V0S2V5Ym9hcmRTdGF0ZQorMDI1NCBzdHViIEdldEtleWJvYXJkVHlwZQorMDI1NSBzdHViIEdldExhc3RBY3RpdmVQb3B1cAorMDI1NiBzdHViIEdldE1lbnUKKzAyNTcgc3R1YiBHZXRNZW51Q2hlY2tNYXJrRGltZW5zaW9ucworMDI1OCBzdHViIEdldE1lbnVDb250ZXh0SGVscElkCiswMjU5IHN0dWIgR2V0TWVudURlZmF1bHRJdGVtCiswMjYwIHN0dWIgR2V0TWVudUluZGV4CiswMjYxIHN0dWIgR2V0TWVudUl0ZW1Db3VudAorMDI2MiBzdHViIEdldE1lbnVJdGVtSUQKKzAyNjMgc3R1YiBHZXRNZW51SXRlbUluZm9BCiswMjY0IHN0dWIgR2V0TWVudUl0ZW1JbmZvVworMDI2NSBzdHViIEdldE1lbnVJdGVtUmVjdAorMDI2NiBzdHViIEdldE1lbnVTdGF0ZQorMDI2NyBzdHViIEdldE1lbnVTdHJpbmdBCiswMjY4IHN0dWIgR2V0TWVudVN0cmluZ1cKKzAyNjkgc3R1YiBHZXRNZXNzYWdlQQorMDI3MCBzdHViIEdldE1lc3NhZ2VFeHRyYUluZm8KKzAyNzEgc3R1YiBHZXRNZXNzYWdlUG9zCiswMjcyIHN0dWIgR2V0TWVzc2FnZVRpbWUKKzAyNzMgc3R1YiBHZXRNZXNzYWdlVworMDI3NCBzdHViIEdldE5leHREbGdHcm91cEl0ZW0KKzAyNzUgc3R1YiBHZXROZXh0RGxnVGFiSXRlbQorMDI3NiBzdHViIEdldE9wZW5DbGlwYm9hcmRXaW5kb3cKKzAyNzcgc3R1YiBHZXRQYXJlbnQKKzAyNzggc3R1YiBHZXRQcmlvcml0eUNsaXBib2FyZEZvcm1hdAorMDI3OSBzdHViIEdldFByb2Nlc3NXaW5kb3dTdGF0aW9uCiswMjgwIHN0dWIgR2V0UHJvcEEKKzAyODEgc3R1YiBHZXRQcm9wVworMDI4MiBzdHViIEdldFF1ZXVlU3RhdHVzCiswMjgzIHN0dWIgR2V0U2Nyb2xsSW5mbworMDI4NCBzdHViIEdldFNjcm9sbFBvcworMDI4NSBzdHViIEdldFNjcm9sbFJhbmdlCiswMjg2IHN0dWIgR2V0U2hlbGxXaW5kb3cKKzAyODcgc3R1YiBHZXRTdWJNZW51CiswMjg4IHN0dWIgR2V0U3lzQ29sb3IKKzAyODkgc3R1YiBHZXRTeXNDb2xvckJydXNoCiswMjkwIHN0dWIgR2V0U3lzdGVtTWVudQorMDI5MSBzdHViIEdldFN5c3RlbU1ldHJpY3MKKzAyOTIgc3R1YiBHZXRUYWJiZWRUZXh0RXh0ZW50QQorMDI5MyBzdHViIEdldFRhYmJlZFRleHRFeHRlbnRXCiswMjk0IHN0dWIgR2V0VGhyZWFkRGVza3RvcAorMDI5NSBzdHViIEdldFRvcFdpbmRvdworMDI5NiBzdHViIEdldFVwZGF0ZVJlY3QKKzAyOTcgc3R1YiBHZXRVcGRhdGVSZ24KKzAyOTggc3R1YiBHZXRVc2VyT2JqZWN0SW5mb3JtYXRpb25BCiswMjk5IHN0dWIgR2V0VXNlck9iamVjdEluZm9ybWF0aW9uVworMDMwMCBzdHViIEdldFVzZXJPYmplY3RTZWN1cml0eQorMDMwMSBzdHViIEdldFdpbmRvdworMDMwMiBzdHViIEdldFdpbmRvd0NvbnRleHRIZWxwSWQKKzAzMDMgc3R1YiBHZXRXaW5kb3dEQworMDMwNCBzdHViIEdldFdpbmRvd0xvbmdBCiswMzA1IHN0dWIgR2V0V2luZG93TG9uZ1cKKzAzMDYgc3R1YiBHZXRXaW5kb3dQbGFjZW1lbnQKKzAzMDcgc3R1YiBHZXRXaW5kb3dSZWN0CiswMzA4IHN0dWIgR2V0V2luZG93VGV4dEEKKzAzMDkgc3R1YiBHZXRXaW5kb3dUZXh0TGVuZ3RoQQorMDMxMCBzdHViIEdldFdpbmRvd1RleHRMZW5ndGhXCiswMzExIHN0dWIgR2V0V2luZG93VGV4dFcKKzAzMTIgc3R1YiBHZXRXaW5kb3dUaHJlYWRQcm9jZXNzSWQKKzAzMTMgc3R1YiBHZXRXaW5kb3dXb3JkCiswMzE0IHN0dWIgR3JheVN0cmluZ0EKKzAzMTUgc3R1YiBHcmF5U3RyaW5nVworMDMxNiBzdHViIEhpZGVDYXJldAorMDMxNyBzdHViIEhpbGl0ZU1lbnVJdGVtCiswMzE4IHN0dWIgSW1wZXJzb25hdGVEZGVDbGllbnRXaW5kb3cKKzAzMTkgc3R1YiBJblNlbmRNZXNzYWdlCiswMzIwIHN0dWIgSW5mbGF0ZVJlY3QKKzAzMjEgc3R1YiBJbnNlcnRNZW51QQorMDMyMiBzdHViIEluc2VydE1lbnVJdGVtQQorMDMyMyBzdHViIEluc2VydE1lbnVJdGVtVworMDMyNCBzdHViIEluc2VydE1lbnVXCiswMzI1IHN0dWIgSW50ZXJuYWxHZXRXaW5kb3dUZXh0CiswMzI2IHN0dWIgSW50ZXJzZWN0UmVjdAorMDMyNyBzdHViIEludmFsaWRhdGVSZWN0CiswMzI4IHN0dWIgSW52YWxpZGF0ZVJnbgorMDMyOSBzdHViIEludmVydFJlY3QKKzAzMzAgc3R1YiBJc0NoYXJBbHBoYUEKKzAzMzEgc3R1YiBJc0NoYXJBbHBoYU51bWVyaWNBCiswMzMyIHN0dWIgSXNDaGFyQWxwaGFOdW1lcmljVworMDMzMyBzdHViIElzQ2hhckFscGhhVworMDMzNCBzdHViIElzQ2hhckxvd2VyQQorMDMzNSBzdHViIElzQ2hhckxvd2VyVworMDMzNiBzdHViIElzQ2hhclVwcGVyQQorMDMzNyBzdHViIElzQ2hhclVwcGVyVworMDMzOCBzdHViIElzQ2hpbGQKKzAzMzkgc3R1YiBJc0NsaXBib2FyZEZvcm1hdEF2YWlsYWJsZQorMDM0MCBzdHViIElzRGlhbG9nTWVzc2FnZQorMDM0MSBzdHViIElzRGlhbG9nTWVzc2FnZUEKKzAzNDIgc3R1YiBJc0RpYWxvZ01lc3NhZ2VXCiswMzQzIHN0dWIgSXNEbGdCdXR0b25DaGVja2VkCiswMzQ0IHN0dWIgSXNJY29uaWMKKzAzNDUgc3R1YiBJc01lbnUKKzAzNDYgc3R1YiBJc1JlY3RFbXB0eQorMDM0NyBzdHViIElzV2luZG93CiswMzQ4IHN0dWIgSXNXaW5kb3dFbmFibGVkCiswMzQ5IHN0dWIgSXNXaW5kb3dVbmljb2RlCiswMzUwIHN0dWIgSXNXaW5kb3dWaXNpYmxlCiswMzUxIHN0dWIgSXNab29tZWQKKzAzNTIgc3R1YiBLaWxsU3lzdGVtVGltZXIKKzAzNTMgc3R1YiBLaWxsVGltZXIKKzAzNTQgc3R1YiBMb2FkQWNjZWxlcmF0b3JzQQorMDM1NSBzdHViIExvYWRBY2NlbGVyYXRvcnNXCiswMzU2IHN0dWIgTG9hZEJpdG1hcEEKKzAzNTcgc3R1YiBMb2FkQml0bWFwVworMDM1OCBzdHViIExvYWRDdXJzb3JBCiswMzU5IHN0dWIgTG9hZEN1cnNvckZyb21GaWxlQQorMDM2MCBzdHViIExvYWRDdXJzb3JGcm9tRmlsZVcKKzAzNjEgc3R1YiBMb2FkQ3Vyc29yVworMDM2MiBzdHViIExvYWRJY29uQQorMDM2MyBzdHViIExvYWRJY29uVworMDM2NCBzdHViIExvYWRJbWFnZUEKKzAzNjUgc3R1YiBMb2FkSW1hZ2VXCiswMzY2IHN0dWIgTG9hZEtleWJvYXJkTGF5b3V0QQorMDM2NyBzdHViIExvYWRLZXlib2FyZExheW91dFcKKzAzNjggc3R1YiBMb2FkTG9jYWxGb250cworMDM2OSBzdHViIExvYWRNZW51QQorMDM3MCBzdHViIExvYWRNZW51SW5kaXJlY3RBCiswMzcxIHN0dWIgTG9hZE1lbnVJbmRpcmVjdFcKKzAzNzIgc3R1YiBMb2FkTWVudVcKKzAzNzMgc3R1YiBMb2FkUmVtb3RlRm9udHMKKzAzNzQgc3R1YiBMb2FkU3RyaW5nQQorMDM3NSBzdHViIExvYWRTdHJpbmdXCiswMzc2IHN0dWIgTG9ja1dpbmRvd1N0YXRpb24KKzAzNzcgc3R1YiBMb2NrV2luZG93VXBkYXRlCiswMzc4IHN0dWIgTG9va3VwSWNvbklkRnJvbURpcmVjdG9yeQorMDM3OSBzdHViIExvb2t1cEljb25JZEZyb21EaXJlY3RvcnlFeAorMDM4MCBzdHViIE1CVG9XQ1NFeAorMDM4MSBzdHViIE1hcERpYWxvZ1JlY3QKKzAzODIgc3R1YiBNYXBWaXJ0dWFsS2V5QQorMDM4MyBzdHViIE1hcFZpcnR1YWxLZXlFeEEKKzAzODQgc3R1YiBNYXBWaXJ0dWFsS2V5VworMDM4NSBzdHViIE1hcFdpbmRvd1BvaW50cworMDM4NiBzdHViIE1lbnVJdGVtRnJvbVBvaW50CiswMzg3IHN0dWIgTWVudVdpbmRvd1Byb2NBCiswMzg4IHN0dWIgTWVudVdpbmRvd1Byb2NXCiswMzg5IHN0dWIgTWVzc2FnZUJlZXAKKzAzOTAJc3RkY2FsbCBNZXNzYWdlQm94QShsb25nIHB0ciBwdHIgbG9uZykJTWVzc2FnZUJveAorMDM5MSBzdHViIE1lc3NhZ2VCb3hFeEEKKzAzOTIgc3R1YiBNZXNzYWdlQm94RXhXCiswMzkzIHN0dWIgTWVzc2FnZUJveEluZGlyZWN0QQorMDM5NCBzdHViIE1lc3NhZ2VCb3hJbmRpcmVjdFcKKzAzOTUgc3R1YiBNZXNzYWdlQm94VworMDM5NiBzdHViIE1vZGlmeU1lbnVBCiswMzk3IHN0dWIgTW9kaWZ5TWVudVcKKzAzOTggc3R1YiBNb3ZlV2luZG93CiswMzk5IHN0dWIgTXNnV2FpdEZvck11bHRpcGxlT2JqZWN0cworMDQwMCBzdHViIE9lbUtleVNjYW4KKzA0MDEgc3R1YiBPZW1Ub0NoYXJBCiswNDAyIHN0dWIgT2VtVG9DaGFyQnVmZkEKKzA0MDMgc3R1YiBPZW1Ub0NoYXJCdWZmVworMDQwNCBzdHViIE9lbVRvQ2hhclcKKzA0MDUgc3R1YiBPZmZzZXRSZWN0CiswNDA2IHN0dWIgT3BlbkNsaXBib2FyZAorMDQwNyBzdHViIE9wZW5EZXNrdG9wQQorMDQwOCBzdHViIE9wZW5EZXNrdG9wVworMDQwOSBzdHViIE9wZW5JY29uCiswNDEwIHN0dWIgT3BlbklucHV0RGVza3RvcAorMDQxMSBzdHViIE9wZW5XaW5kb3dTdGF0aW9uQQorMDQxMiBzdHViIE9wZW5XaW5kb3dTdGF0aW9uVworMDQxMyBzdHViIFBhY2tEREVsUGFyYW0KKzA0MTQgc3R1YiBQYWludERlc2t0b3AKKzA0MTUgc3R1YiBQZWVrTWVzc2FnZUEKKzA0MTYgc3R1YiBQZWVrTWVzc2FnZVcKKzA0MTcgc3R1YiBQbGF5U291bmRFdmVudAorMDQxOCBzdHViIFBvc3RNZXNzYWdlQQorMDQxOSBzdHViIFBvc3RNZXNzYWdlVworMDQyMCBzdHViIFBvc3RRdWl0TWVzc2FnZQorMDQyMSBzdHViIFBvc3RUaHJlYWRNZXNzYWdlQQorMDQyMiBzdHViIFBvc3RUaHJlYWRNZXNzYWdlVworMDQyMyBzdHViIFB0SW5SZWN0CiswNDI0IHN0dWIgUXVlcnlTZW5kTWVzc2FnZQorMDQyNSBzdHViIFJlZHJhd1dpbmRvdworMDQyNiBzdHViIFJlZ2lzdGVyQ2xhc3NBCiswNDI3IHN0dWIgUmVnaXN0ZXJDbGFzc0V4QQorMDQyOCBzdHViIFJlZ2lzdGVyQ2xhc3NFeFcKKzA0Mjkgc3R1YiBSZWdpc3RlckNsYXNzVworMDQzMCBzdHViIFJlZ2lzdGVyQ2xpcGJvYXJkRm9ybWF0QQorMDQzMSBzdHViIFJlZ2lzdGVyQ2xpcGJvYXJkRm9ybWF0VworMDQzMiBzdHViIFJlZ2lzdGVySG90S2V5CiswNDMzIHN0dWIgUmVnaXN0ZXJMb2dvblByb2Nlc3MKKzA0MzQgc3R1YiBSZWdpc3RlclN5c3RlbVRocmVhZAorMDQzNSBzdHViIFJlZ2lzdGVyVGFza2xpc3QKKzA0MzYgc3R1YiBSZWdpc3RlcldpbmRvd01lc3NhZ2VBCiswNDM3IHN0dWIgUmVnaXN0ZXJXaW5kb3dNZXNzYWdlVworMDQzOCBzdHViIFJlbGVhc2VDYXB0dXJlCiswNDM5IHN0dWIgUmVsZWFzZURDCiswNDQwIHN0dWIgUmVtb3ZlTWVudQorMDQ0MSBzdHViIFJlbW92ZVByb3BBCiswNDQyIHN0dWIgUmVtb3ZlUHJvcFcKKzA0NDMgc3R1YiBSZXBseU1lc3NhZ2UKKzA0NDQgc3R1YiBSZXNldERpc3BsYXkKKzA0NDUgc3R1YiBSZXVzZURERWxQYXJhbQorMDQ0NiBzdHViIFNjcmVlblRvQ2xpZW50CiswNDQ3IHN0dWIgU2Nyb2xsQ2hpbGRyZW4KKzA0NDggc3R1YiBTY3JvbGxEQworMDQ0OSBzdHViIFNjcm9sbFdpbmRvdworMDQ1MCBzdHViIFNjcm9sbFdpbmRvd0V4CiswNDUxIHN0dWIgU2VuZERsZ0l0ZW1NZXNzYWdlQQorMDQ1MiBzdHViIFNlbmREbGdJdGVtTWVzc2FnZVcKKzA0NTMgc3R1YiBTZW5kTWVzc2FnZUEKKzA0NTQgc3R1YiBTZW5kTWVzc2FnZUNhbGxiYWNrQQorMDQ1NSBzdHViIFNlbmRNZXNzYWdlQ2FsbGJhY2tXCiswNDU2IHN0dWIgU2VuZE1lc3NhZ2VUaW1lb3V0QQorMDQ1NyBzdHViIFNlbmRNZXNzYWdlVGltZW91dFcKKzA0NTggc3R1YiBTZW5kTWVzc2FnZVcKKzA0NTkgc3R1YiBTZW5kTm90aWZ5TWVzc2FnZUEKKzA0NjAgc3R1YiBTZW5kTm90aWZ5TWVzc2FnZVcKKzA0NjEgc3R1YiBTZXJ2ZXJTZXRGdW5jdGlvblBvaW50ZXJzCiswNDYyIHN0dWIgU2V0QWN0aXZlV2luZG93CiswNDYzIHN0dWIgU2V0Q2FwdHVyZQorMDQ2NCBzdHViIFNldENhcmV0QmxpbmtUaW1lCiswNDY1IHN0dWIgU2V0Q2FyZXRQb3MKKzA0NjYgc3R1YiBTZXRDbGFzc0xvbmdBCiswNDY3IHN0dWIgU2V0Q2xhc3NMb25nVworMDQ2OCBzdHViIFNldENsYXNzV29yZAorMDQ2OSBzdHViIFNldENsaXBib2FyZERhdGEKKzA0NzAgc3R1YiBTZXRDbGlwYm9hcmRWaWV3ZXIKKzA0NzEgc3R1YiBTZXRDdXJzb3IKKzA0NzIgc3R1YiBTZXRDdXJzb3JDb250ZW50cworMDQ3MyBzdHViIFNldEN1cnNvclBvcworMDQ3NCBzdHViIFNldERlYnVnRXJyb3JMZXZlbAorMDQ3NSBzdHViIFNldERlc2tXYWxscGFwZXIKKzA0NzYgc3R1YiBTZXREbGdJdGVtSW50CiswNDc3IHN0dWIgU2V0RGxnSXRlbVRleHRBCiswNDc4IHN0dWIgU2V0RGxnSXRlbVRleHRXCiswNDc5IHN0dWIgU2V0RG91YmxlQ2xpY2tUaW1lCiswNDgwIHN0dWIgU2V0Rm9jdXMKKzA0ODEgc3R1YiBTZXRGb3JlZ3JvdW5kV2luZG93CiswNDgyIHN0dWIgU2V0SW50ZXJuYWxXaW5kb3dQb3MKKzA0ODMgc3R1YiBTZXRLZXlib2FyZFN0YXRlCiswNDg0IHN0dWIgU2V0TGFzdEVycm9yRXgKKzA0ODUgc3R1YiBTZXRMb2dvbk5vdGlmeVdpbmRvdworMDQ4NiBzdHViIFNldE1lbnUKKzA0ODcgc3R1YiBTZXRNZW51Q29udGV4dEhlbHBJZAorMDQ4OCBzdHViIFNldE1lbnVEZWZhdWx0SXRlbQorMDQ4OSBzdHViIFNldE1lbnVJdGVtQml0bWFwcworMDQ5MCBzdHViIFNldE1lbnVJdGVtSW5mb0EKKzA0OTEgc3R1YiBTZXRNZW51SXRlbUluZm9XCiswNDkyIHN0dWIgU2V0TWVzc2FnZUV4dHJhSW5mbworMDQ5MyBzdHViIFNldE1lc3NhZ2VRdWV1ZQorMDQ5NCBzdHViIFNldFBhcmVudAorMDQ5NSBzdHViIFNldFByb2Nlc3NXaW5kb3dTdGF0aW9uCiswNDk2IHN0dWIgU2V0UHJvcEEKKzA0OTcgc3R1YiBTZXRQcm9wVworMDQ5OCBzdHViIFNldFJlY3QKKzA0OTkgc3R1YiBTZXRSZWN0RW1wdHkKKzA1MDAgc3R1YiBTZXRTY3JvbGxJbmZvCiswNTAxIHN0dWIgU2V0U2Nyb2xsUG9zCiswNTAyIHN0dWIgU2V0U2Nyb2xsUmFuZ2UKKzA1MDMgc3R1YiBTZXRTaGVsbFdpbmRvdworMDUwNCBzdHViIFNldFN5c0NvbG9ycworMDUwNSBzdHViIFNldFN5c0NvbG9yc1RlbXAKKzA1MDYgc3R1YiBTZXRTeXN0ZW1DdXJzb3IKKzA1MDcgc3R1YiBTZXRTeXN0ZW1NZW51CiswNTA4IHN0dWIgU2V0U3lzdGVtVGltZXIKKzA1MDkgc3R1YiBTZXRUaHJlYWREZXNrdG9wCiswNTEwIHN0dWIgU2V0VGltZXIKKzA1MTEgc3R1YiBTZXRVc2VyT2JqZWN0SW5mb3JtYXRpb25BCiswNTEyIHN0dWIgU2V0VXNlck9iamVjdEluZm9ybWF0aW9uVworMDUxMyBzdHViIFNldFVzZXJPYmplY3RTZWN1cml0eQorMDUxNCBzdHViIFNldFdpbmRvd0NvbnRleHRIZWxwSWQKKzA1MTUgc3R1YiBTZXRXaW5kb3dGdWxsU2NyZWVuU3RhdGUKKzA1MTYgc3R1YiBTZXRXaW5kb3dMb25nQQorMDUxNyBzdHViIFNldFdpbmRvd0xvbmdXCiswNTE4IHN0dWIgU2V0V2luZG93UGxhY2VtZW50CiswNTE5IHN0dWIgU2V0V2luZG93UG9zCiswNTIwIHN0dWIgU2V0V2luZG93U3RhdGlvblVzZXIKKzA1MjEgc3R1YiBTZXRXaW5kb3dUZXh0QQorMDUyMiBzdHViIFNldFdpbmRvd1RleHRXCiswNTIzIHN0dWIgU2V0V2luZG93V29yZAorMDUyNCBzdHViIFNldFdpbmRvd3NIb29rQQorMDUyNSBzdHViIFNldFdpbmRvd3NIb29rRXhBCiswNTI2IHN0dWIgU2V0V2luZG93c0hvb2tFeFcKKzA1Mjcgc3R1YiBTZXRXaW5kb3dzSG9va1cKKzA1Mjggc3R1YiBTaG93Q2FyZXQKKzA1Mjkgc3R1YiBTaG93Q3Vyc29yCiswNTMwIHN0dWIgU2hvd093bmVkUG9wdXBzCiswNTMxIHN0dWIgU2hvd1Njcm9sbEJhcgorMDUzMiBzdHViIFNob3dTdGFydEdsYXNzCiswNTMzIHN0dWIgU2hvd1dpbmRvdworMDUzNCBzdHViIFNob3dXaW5kb3dBc3luYworMDUzNSBzdHViIFN1YnRyYWN0UmVjdAorMDUzNiBzdHViIFN3YXBNb3VzZUJ1dHRvbgorMDUzNyBzdHViIFN3aXRjaERlc2t0b3AKKzA1Mzggc3R1YiBTd2l0Y2hUb1RoaXNXaW5kb3cKKzA1Mzkgc3R1YiBTeXN0ZW1QYXJhbWV0ZXJzSW5mb0EKKzA1NDAgc3R1YiBTeXN0ZW1QYXJhbWV0ZXJzSW5mb1cKKzA1NDEgc3R1YiBUYWJiZWRUZXh0T3V0QQorMDU0MiBzdHViIFRhYmJlZFRleHRPdXRXCiswNTQzIHN0dWIgVGlsZUNoaWxkV2luZG93cworMDU0NCBzdHViIFRpbGVXaW5kb3dzCiswNTQ1IHN0dWIgVG9Bc2NpaQorMDU0NiBzdHViIFRvQXNjaWlFeAorMDU0NyBzdHViIFRvVW5pY29kZQorMDU0OCBzdHViIFRyYWNrUG9wdXBNZW51CiswNTQ5IHN0dWIgVHJhY2tQb3B1cE1lbnVFeAorMDU1MCBzdHViIFRyYW5zbGF0ZUFjY2VsZXJhdG9yCiswNTUxIHN0dWIgVHJhbnNsYXRlQWNjZWxlcmF0b3JBCiswNTUyIHN0dWIgVHJhbnNsYXRlQWNjZWxlcmF0b3JXCiswNTUzIHN0dWIgVHJhbnNsYXRlQ2hhcnNldEluZm8KKzA1NTQgc3R1YiBUcmFuc2xhdGVNRElTeXNBY2NlbAorMDU1NSBzdHViIFRyYW5zbGF0ZU1lc3NhZ2UKKzA1NTYgc3R1YiBVbmhvb2tXaW5kb3dzSG9vaworMDU1NyBzdHViIFVuaG9va1dpbmRvd3NIb29rRXgKKzA1NTggc3R1YiBVbmlvblJlY3QKKzA1NTkgc3R1YiBVbmxvYWRLZXlib2FyZExheW91dAorMDU2MCBzdHViIFVubG9ja1dpbmRvd1N0YXRpb24KKzA1NjEgc3R1YiBVbnBhY2tEREVsUGFyYW0KKzA1NjIgc3R1YiBVbnJlZ2lzdGVyQ2xhc3NBCiswNTYzIHN0dWIgVW5yZWdpc3RlckNsYXNzVworMDU2NCBzdHViIFVucmVnaXN0ZXJIb3RLZXkKKzA1NjUgc3R1YiBVcGRhdGVQZXJVc2VyU3lzdGVtUGFyYW1ldGVycworMDU2NiBzdHViIFVwZGF0ZVdpbmRvdworMDU2NyBzdHViIFVzZXJDbGllbnREbGxJbml0aWFsaXplCiswNTY4IHN0dWIgVXNlclJlYWxpemVQYWxldHRlCiswNTY5IHN0dWIgVXNlclJlZ2lzdGVyV293SGFuZGxlcnMKKzA1NzAgc3R1YiBWYWxpZGF0ZVJlY3QKKzA1NzEgc3R1YiBWYWxpZGF0ZVJnbgorMDU3MiBzdHViIFZrS2V5U2NhbkEKKzA1NzMgc3R1YiBWa0tleVNjYW5FeEEKKzA1NzQgc3R1YiBWa0tleVNjYW5FeFcKKzA1NzUgc3R1YiBWa0tleVNjYW5XCiswNTc2IHN0dWIgV2FpdEZvcklucHV0SWRsZQorMDU3NyBzdHViIFdhaXRNZXNzYWdlCiswNTc4IHN0dWIgV2luSGVscEEKKzA1Nzkgc3R1YiBXaW5IZWxwVworMDU4MCBzdHViIFdpbmRvd0Zyb21EQworMDU4MSBzdHViIFdpbmRvd0Zyb21Qb2ludAorMDU4MiBzdHViIGtleWJkX2V2ZW50CiswNTgzIHN0dWIgbW91c2VfZXZlbnQKKzA1ODQgc3R1YiB3c3ByaW50ZkEKKzA1ODUgc3R1YiB3c3ByaW50ZlcKKzA1ODYgc3R1YiB3dnNwcmludGZBCiswNTg3IHN0dWIgd3ZzcHJpbnRmVwpkaWZmIC0tZ2l0IGEvaWYxNjMyL3dpbnByb2NzLnNwZWMgYi9pZjE2MzIvd2lucHJvY3Muc3BlYwppbmRleCBhMWM1NGY2Li4xNjI0MGM0IDEwMDY0NAotLS0gYS9pZjE2MzIvd2lucHJvY3Muc3BlYworKysgYi9pZjE2MzIvd2lucHJvY3Muc3BlYwpAQCAtMjIsNiArMjIsNiBAQAogMTkgcGFzY2FsIFByaW50U2V0dXBEbGdQcm9jKHdvcmQgd29yZCB3b3JkIGxvbmcpIFByaW50U2V0dXBEbGdQcm9jCiAyMCBwYXNjYWwgUHJpbnREbGdQcm9jKHdvcmQgd29yZCB3b3JkIGxvbmcpIFByaW50RGxnUHJvYwogMjEgcGFzY2FsIEFib3V0RGxnUHJvYyh3b3JkIHdvcmQgd29yZCBsb25nKSBBYm91dERsZ1Byb2MKLTIyIHBhc2NhbCBBYm91dFdpbmVfUHJvYyh3b3JkIHdvcmQgd29yZCBsb25nKSBBYm91dFdpbmVfUHJvYworMjIgcGFzY2FsIENvbWJvTEJveFduZFByb2Mod29yZCB3b3JkIHdvcmQgbG9uZykgQ29tYm9MQm94V25kUHJvYwogMjMgcGFzY2FsMTYgQ0FSRVRfQ2FsbGJhY2sod29yZCB3b3JkIHdvcmQgbG9uZykgQ0FSRVRfQ2FsbGJhY2sKIDI0IHBhc2NhbDE2IFRBU0tfUmVzY2hlZHVsZSgpIFRBU0tfUmVzY2hlZHVsZQpkaWZmIC0tZ2l0IGEvaWYxNjMyL3dpbnByb2NzMzIuc3BlYyBiL2lmMTYzMi93aW5wcm9jczMyLnNwZWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTc4OWU4YQotLS0gL2Rldi9udWxsCisrKyBiL2lmMTYzMi93aW5wcm9jczMyLnNwZWMKQEAgLTAsMCArMSwyNSBAQAorbmFtZQl3aW5wcm9jczMyCisKKzEgIHN0ZGNhbGwgQnV0dG9uV25kUHJvYyhsb25nIGxvbmcgbG9uZyBsb25nKSBCdXR0b25XbmRQcm9jCisyICBzdGRjYWxsIFN0YXRpY1duZFByb2MobG9uZyBsb25nIGxvbmcgbG9uZykgU3RhdGljV25kUHJvYworMyAgc3RkY2FsbCBTY3JvbGxCYXJXbmRQcm9jKGxvbmcgbG9uZyBsb25nIGxvbmcpIFNjcm9sbEJhclduZFByb2MKKzQgIHN0ZGNhbGwgTGlzdEJveFduZFByb2MobG9uZyBsb25nIGxvbmcgbG9uZykgTGlzdEJveFduZFByb2MKKzUgIHN0ZGNhbGwgQ29tYm9Cb3hXbmRQcm9jKGxvbmcgbG9uZyBsb25nIGxvbmcpIENvbWJvQm94V25kUHJvYworNiAgc3RkY2FsbCBFZGl0V25kUHJvYyhsb25nIGxvbmcgbG9uZyBsb25nKSBFZGl0V25kUHJvYworNyAgc3RkY2FsbCBQb3B1cE1lbnVXbmRQcm9jKGxvbmcgbG9uZyBsb25nIGxvbmcpIFBvcHVwTWVudVduZFByb2MKKzggIHN0ZGNhbGwgRGVza3RvcFduZFByb2MobG9uZyBsb25nIGxvbmcgbG9uZykgRGVza3RvcFduZFByb2MKKzkgIHN0ZGNhbGwgRGVmRGxnUHJvYyhsb25nIGxvbmcgbG9uZyBsb25nKSBEZWZEbGdQcm9jCisxMCBzdGRjYWxsIE1ESUNsaWVudFduZFByb2MobG9uZyBsb25nIGxvbmcgbG9uZykgTURJQ2xpZW50V25kUHJvYworMTEgc3RkY2FsbCBEZWZXaW5kb3dQcm9jKGxvbmcgbG9uZyBsb25nIGxvbmcpIERlZldpbmRvd1Byb2MKKzEyIHN0ZGNhbGwgRGVmTURJQ2hpbGRQcm9jKGxvbmcgbG9uZyBsb25nIGxvbmcpIERlZk1ESUNoaWxkUHJvYworMTMgc3RkY2FsbCBTeXN0ZW1NZXNzYWdlQm94UHJvYyhsb25nIGxvbmcgbG9uZyBsb25nKSBTeXN0ZW1NZXNzYWdlQm94UHJvYworMTQgc3RkY2FsbCBGaWxlT3BlbkRsZ1Byb2MobG9uZyBsb25nIGxvbmcgbG9uZykgRmlsZU9wZW5EbGdQcm9jCisxNSBzdGRjYWxsIEZpbGVTYXZlRGxnUHJvYyhsb25nIGxvbmcgbG9uZyBsb25nKSBGaWxlU2F2ZURsZ1Byb2MKKzE2IHN0ZGNhbGwgQ29sb3JEbGdQcm9jKGxvbmcgbG9uZyBsb25nIGxvbmcpIENvbG9yRGxnUHJvYworMTcgc3RkY2FsbCBGaW5kVGV4dERsZ1Byb2MobG9uZyBsb25nIGxvbmcgbG9uZykgRmluZFRleHREbGdQcm9jCisxOCBzdGRjYWxsIFJlcGxhY2VUZXh0RGxnUHJvYyhsb25nIGxvbmcgbG9uZyBsb25nKSBSZXBsYWNlVGV4dERsZ1Byb2MKKzE5IHN0ZGNhbGwgUHJpbnRTZXR1cERsZ1Byb2MobG9uZyBsb25nIGxvbmcgbG9uZykgUHJpbnRTZXR1cERsZ1Byb2MKKzIwIHN0ZGNhbGwgUHJpbnREbGdQcm9jKGxvbmcgbG9uZyBsb25nIGxvbmcpIFByaW50RGxnUHJvYworMjEgc3RkY2FsbCBBYm91dERsZ1Byb2MobG9uZyBsb25nIGxvbmcgbG9uZykgQWJvdXREbGdQcm9jCisyMiBzdGRjYWxsIENvbWJvTEJveFduZFByb2MobG9uZyBsb25nIGxvbmcgbG9uZykgQ29tYm9MQm94V25kUHJvYworMjMgc3RkY2FsbCBDQVJFVF9DYWxsYmFjayhsb25nIGxvbmcgbG9uZyBsb25nKSBDQVJFVF9DYWxsYmFjawpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9iaXRtYXBzL29ibV9jZHJvbSBiL2luY2x1ZGUvYml0bWFwcy9vYm1fY2Ryb20KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjYxMjMwYwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYml0bWFwcy9vYm1fY2Ryb20KQEAgLTAsMCArMSwyMyBAQAorLyogWFBNICovCitzdGF0aWMgY2hhciAqIG9ibV9jZHJvbVtdID0geworIjIwIDE1IDUgMSIsCisiIAlzIHdoaXRlIGMgd2hpdGUiLAorIi4JcyBibGFjayBjIGJsYWNrIiwKKyJYCXMgbHRncmF5IGMgI2MwYzBjMCIsCisibwlzIGRrZ3JheSBjICM4MDgwODAiLAorIk8JcyByZWQgYyByZWQiLAorIiAgICAgICAgICAgICAgICAgICAgIiwKKyIgICAgICAgICAgICAgICAgICAgICIsCisiIC4uLi4uLi4uLi4uLi4uLi4uLiAiLAorIiAuWFhYWFhYWFhYWFhYWFhYby4gIiwKKyIgLlhYWFhYWFhYWFhYWFhYWG8uICIsCisiIC5Yb29vb29vb29vb29vb1hvLiAiLAorIiAuWG8uWFhYWFhYWFhYLm9Yby4gIiwKKyIgLlhvby4uWFhYWFguLm9vWG8uICIsCisiIC5YWFhYWC4uLi4uWFhYWFhvLiAiLAorIiAuWC5YT09YWFhYWFhYLi5Yby4gIiwKKyIgLlguWE9PWFhYWFhYWC4uWG8uICIsCisiIC5vb29vb29vb29vb29vb29vLiAiLAorIiAuLi4uLi4uLi4uLi4uLi4uLi4gIiwKKyIgICAgICAgICAgICAgICAgICAgICIsCisiICAgICAgICAgICAgICAgICAgICAifTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYml0bWFwcy9vYm1fZHJpdmUgYi9pbmNsdWRlL2JpdG1hcHMvb2JtX2RyaXZlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5OTFkYzYKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2JpdG1hcHMvb2JtX2RyaXZlCkBAIC0wLDAgKzEsMjMgQEAKKy8qIFhQTSAqLworc3RhdGljIGNoYXIgKiBvYm1fZHJpdmVbXSA9IHsKKyIyMCAxNSA1IDEiLAorIiAJcyB3aGl0ZSBjIHdoaXRlIiwKKyIuCXMgYmxhY2sgYyBibGFjayIsCisiWAlzIGx0Z3JheSBjICNjMGMwYzAiLAorIm8JcyBka2dyYXkgYyAjODA4MDgwIiwKKyJPCXMgcmVkIGMgcmVkIiwKKyIgICAgICAgICAgICAgICAgICAgICIsCisiICAgICAgICAgICAgICAgICAgICAiLAorIiAuLi4uLi4uLi4uLi4uLi4uLi4gIiwKKyIgLlhYWFhYWFhYWFhYWFhYWG8uICIsCisiIC5YWFhYWFhYWFhYWFhYWFhvLiAiLAorIiAuWFhYLi4uLi4uLi4uWFhYby4gIiwKKyIgLlguLi4uLi4uLi4uLi4uWG8uICIsCisiIC5YWFguLi4uLi4uLi5YWFhvLiAiLAorIiAuWFhYWFhYWFhYWFhYWFhYby4gIiwKKyIgLlhYWE9PWFhYWFguLlhYWG8uICIsCisiIC5YWFhPT1hYWFhYLi5YWFhvLiAiLAorIiAub29vb29vb29vb29vb29vby4gIiwKKyIgLi4uLi4uLi4uLi4uLi4uLi4uICIsCisiICAgICAgICAgICAgICAgICAgICAiLAorIiAgICAgICAgICAgICAgICAgICAgIn07CmRpZmYgLS1naXQgYS9pbmNsdWRlL2JpdG1hcHMvb2JtX2ZvbGRlciBiL2luY2x1ZGUvYml0bWFwcy9vYm1fZm9sZGVyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyYzg0ZWQKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2JpdG1hcHMvb2JtX2ZvbGRlcgpAQCAtMCwwICsxLDIyIEBACisvKiBYUE0gKi8KK3N0YXRpYyBjaGFyICogb2JtX2ZvbGRlcltdID0geworIjIwIDE1IDQgMSIsCisiIAlzIHdoaXRlIGMgd2hpdGUiLAorIi4JcyBibGFjayBjIGJsYWNrIiwKKyJYCXMgZm9sZGVyY29sIGMgIzAwYmZiZiIsCisibwlzIGN5YW4gYyBjeWFuIiwKKyIgICAgICAgICAgICAgICAgICAgICIsCisiICAgIC4uLi4gICAgICAgICAgICAiLAorIiAgIC5YWFhYLiAgICAgICAgICAgIiwKKyIgIC4uLi4uLi4uLi4uLi4uICAgICIsCisiICAuWG9Yb1hvWG9Yb1hvWC4gICAiLAorIiAgLm9Yb1hvWG9Yb1hvWG8uICAgIiwKKyIgIC5Yb1hvWG9Yb1hvWG9YLiAgICIsCisiICAub1hvWG9Yb1hvWG9Yby4gICAiLAorIiAgLlhvWG9Yb1hvWG9Yb1guICAgIiwKKyIgIC5vWG9Yb1hvWG9Yb1hvLiAgICIsCisiICAuWG9Yb1hvWG9Yb1hvWC4gICAiLAorIiAgLm9Yb1hvWG9Yb1hvWG8uICAgIiwKKyIgICAuLi4uLi4uLi4uLi4uLiAgICIsCisiICAgICAgICAgICAgICAgICAgICAiLAorIiAgICAgICAgICAgICAgICAgICAgIn07CmRpZmYgLS1naXQgYS9pbmNsdWRlL2JpdG1hcHMvb2JtX2ZvbGRlcjIgYi9pbmNsdWRlL2JpdG1hcHMvb2JtX2ZvbGRlcjIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGI5OTQ2YgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYml0bWFwcy9vYm1fZm9sZGVyMgpAQCAtMCwwICsxLDIxIEBACisvKiBYUE0gKi8KK3N0YXRpYyBjaGFyICogb2JtX2ZvbGRlcjJbXSA9IHsKKyIyMCAxNSAzIDEiLAorIiAJcyB3aGl0ZSBjIHdoaXRlIiwKKyIuCXMgYmxhY2sgYyBibGFjayIsCisiWAlzIGZvbGRlcmNvbCBjICMwMGJmYmYiLAorIiAgICAgICAgICAgICAgICAgICAgIiwKKyIgICAgICAgICAgICAgICAgICAgICIsCisiICAgIC4uLiAgICAgICAgICAgICAiLAorIiAgIC4uWC4uICAgICAgICAgICAgIiwKKyIgIC4uWC5YLi4uLi4uLi4gICAgICIsCisiICAuWC5YLlguWC5YLlguLiAgICAiLAorIiAgLi5YLlguWC5YLlguWC4gICAgIiwKKyIgIC5YLlguLi4uLi4uLi4uLi4gICIsCisiICAuLlguWC5YWFhYWFhYWFhYLiAiLAorIiAgLlguWC5YWFhYWFhYWFhYWC4gIiwKKyIgIC4uWC5YWFhYWFhYWFhYWC4gICIsCisiICAuWC5YWFhYWFhYWFhYWC4gICAiLAorIiAgLi5YWFhYWFhYWFhYWC4gICAgIiwKKyIgIC4uLi4uLi4uLi4uLi4gICAgICIsCisiICAgICAgICAgICAgICAgICAgICAifTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYml0bWFwcy9vYm1faGFyZGRpc2sgYi9pbmNsdWRlL2JpdG1hcHMvb2JtX2hhcmRkaXNrCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhYjBkMDIKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2JpdG1hcHMvb2JtX2hhcmRkaXNrCkBAIC0wLDAgKzEsMjMgQEAKKy8qIFhQTSAqLworc3RhdGljIGNoYXIgKiBvYm1faGFyZGRpc2tbXSA9IHsKKyIyMCAxNSA1IDEiLAorIiAJcyB3aGl0ZSBjIHdoaXRlIiwKKyIuCXMgYmxhY2sgYyBibGFjayIsCisiWAlzIGx0Z3JheSBjICNjMGMwYzAiLAorIm8JcyBka2dyYXkgYyAjODA4MDgwIiwKKyJPCXMgZ3JlZW4gYyBncmVlbiIsCisiICAgICAgICAgICAgICAgICAgICAiLAorIiAgICAgICAgICAgICAgICAgICAgIiwKKyIgLi4uLi4uLi4uLi4uLi4uLi4uICIsCisiIC5YWFhYWFhYWFhYWFhYWFhvLiAiLAorIiAuWFhYWFhYWFhYWFhYWFhYby4gIiwKKyIgLlhYWFhYWFhYWFhYWFhYWG8uICIsCisiIC5YWFhYWFhYWFhYWFhYWFhvLiAiLAorIiAuWFhYWFhYWFhYWFhYWFhYby4gIiwKKyIgLm9vb29vb29vb29vb29vb28uICIsCisiIC5YWFhYWFhYWFhYWE9PWFhvLiAiLAorIiAuWFhYWFhYWFhYWFhPT1hYby4gIiwKKyIgLm9vb29vb29vb29vb29vb28uICIsCisiIC4uLi4uLi4uLi4uLi4uLi4uLiAiLAorIiAgICAgICAgICAgICAgICAgICAgIiwKKyIgICAgICAgICAgICAgICAgICAgICJ9OwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9iaXRtYXBzL29pY19sYW5kc2NhcGUgYi9pbmNsdWRlL2JpdG1hcHMvb2ljX2xhbmRzY2FwZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNWUyYjBiCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9iaXRtYXBzL29pY19sYW5kc2NhcGUKQEAgLTAsMCArMSw0MSBAQAorLyogWFBNICovCitzdGF0aWMgY2hhciAqIG9pY19sYW5kc2NhcGVbXSA9IHsKKyIzMiAzMiA2IDEiLAorIiAJcyBOb25lCWMgTm9uZSIsCisiLglzIGJsYWNrIGMgYmxhY2siLAorIlgJcyBsdGdyYXkgYyAjYzBjMGMwIiwKKyJvCXMgd2hpdGUgYyB3aGl0ZSIsCisiTwlzIGRrZ3JheSBjICM4MDgwODAiLAorIisJcyBibHVlIGMgYmx1ZSIsCisiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLAorIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiwKKyIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIsCisiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLAorIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiwKKyIgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAgICAgICAgICIsCisiIC5YWFhYWFhYWFhYWFhYWFhYWFhYWC4uICAgICAgICAiLAorIiAuWC4uLi4uWFhYWFhYWFhYWFhYWFguby4gICAgICAgIiwKKyIgLlhYLlhYWC5YWFhYWFhYWFhYWFhYLm9vLiAgICAgICIsCisiIC5YWC5YWFguWFhYWFhYWFhYWFhYWC5vb28uICAgICAiLAorIiAuWFguLi4uWFhYWFhYWFhYWFhYWFgub29vby4gICAgIiwKKyIgLlhYLlhYWC5YWFhYWFhYWFhYWFhYLi4uLi4uLiAgICIsCisiIC5YWC5YWFguWFhYWFhYWFhYWFhYWFhYWFhYWC5PICAiLAorIiAuWC4uLi4uWFhYWFhYWFhYWFhYWFhYWFhYWFguTyAgIiwKKyIgLlhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYLk8gICIsCisiIC5YWFgrK1grWCsrWCsrK1grK1grKytYK1grWC5PICAiLAorIiAuWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFguTyAgIiwKKyIgLlgrWCtYKytYKytYKytYK1grK1grK1grWCtYLk8gICIsCisiIC5YWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWC5PICAiLAorIiAuWCsrK1grKytYK1grK1grK1grWCsrWCsrK1guTyAgIiwKKyIgLlhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYLk8gICIsCisiIC5YKytYK1grKytYKysrK1grK1grK1grKysrWC5PICAiLAorIiAuWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFguTyAgIiwKKyIgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLk8gICIsCisiICBPT09PT09PT09PT09PT09PT09PT09PT09PT09PICAiLAorIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiwKKyIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIsCisiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLAorIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiwKKyIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIsCisiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLAorIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIn07CmRpZmYgLS1naXQgYS9pbmNsdWRlL2JpdG1hcHMvb2ljX3BvcnRyYWl0IGIvaW5jbHVkZS9iaXRtYXBzL29pY19wb3J0cmFpdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNGMzNTY1Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9iaXRtYXBzL29pY19wb3J0cmFpdApAQCAtMCwwICsxLDQxIEBACisvKiBYUE0gKi8KK3N0YXRpYyBjaGFyICogb2ljX3BvcnRyYWl0W10gPSB7CisiMzIgMzIgNiAxIiwKKyIgCXMgTm9uZQljIE5vbmUiLAorIi4JcyBibGFjayBjIGJsYWNrIiwKKyJYCXMgbHRncmF5IGMgI2MwYzBjMCIsCisibwlzIHdoaXRlIGMgd2hpdGUiLAorIk8JcyBka2dyYXkgYyAjODA4MDgwIiwKKyIrCXMgYmx1ZSBjIGJsdWUiLAorIiAgIC4uLi4uLi4uLi4uLi4uLi4uLi4gICAgICAgICAgIiwKKyIgICAuWFhYWFhYWFhYWFhYWFhYWFguLiAgICAgICAgICIsCisiICAgLlguLi4uLlhYWFhYWFhYWFhYLm8uICAgICAgICAiLAorIiAgIC5YWC5YWFguWFhYWFhYWFhYWC5vby4gICAgICAgIiwKKyIgICAuWFguWFhYLlhYWFhYWFhYWFgub29vLiAgICAgICIsCisiICAgLlhYLi4uLlhYWFhYWFhYWFhYLm9vb28uICAgICAiLAorIiAgIC5YWC5YWFguWFhYWFhYWFhYWC4uLi4uLi4gICAgIiwKKyIgICAuWFguWFhYLlhYWFhYWFhYWFhYWFhYWFguTyAgICIsCisiICAgLlguLi4uLlhYWFhYWFhYWFhYWFhYWFhYLk8gICAiLAorIiAgIC5YWFhYWFhYWFhYWFhYWFhYWFhYWFhYWC5PICAgIiwKKyIgICAuWFhYKytYK1grK1grWCtYKysrWCtYK1guTyAgICIsCisiICAgLlhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYLk8gICAiLAorIiAgIC5YK1grWCsrWCsrWCtYKytYKytYK1grWC5PICAgIiwKKyIgICAuWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFguTyAgICIsCisiICAgLlgrKytYKysrWCtYKytYK1grK1grKytYLk8gICAiLAorIiAgIC5YWFhYWFhYWFhYWFhYWFhYWFhYWFhYWC5PICAgIiwKKyIgICAuWCsrWCtYKysrWCsrWCtYKytYKysrK1guTyAgICIsCisiICAgLlhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYLk8gICAiLAorIiAgIC5YK1grWCsrWCtYKytYKytYK1grK1grWC5PICAgIiwKKyIgICAuWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFguTyAgICIsCisiICAgLlgrWCtYKytYKytYK1grK1grK1grWCtYLk8gICAiLAorIiAgIC5YWFhYWFhYWFhYWFhYWFhYWFhYWFhYWC5PICAgIiwKKyIgICAuWCsrK1grKytYK1grK1grWCsrWCsrK1guTyAgICIsCisiICAgLlhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYLk8gICAiLAorIiAgIC5YKytYK1grKytYKytYK1grK1grKysrWC5PICAgIiwKKyIgICAuWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFguTyAgICIsCisiICAgLlgrWCtYKytYK1grK1grK1grWCsrWCtYLk8gICAiLAorIiAgIC5YWFhYWFhYWFhYWFhYWFhYWFhYWFhYWC5PICAgIiwKKyIgICAuWCsrK1grK1grWCtYK1grWCsrWCtYK1guTyAgICIsCisiICAgLlhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYLk8gICAiLAorIiAgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5PICAgIiwKKyIgICAuT09PT09PT09PT09PT09PT09PT09PT09PTyAgICJ9OwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9iaXRtYXBzL29pY193aW5laWNvbiBiL2luY2x1ZGUvYml0bWFwcy9vaWNfd2luZWljb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTJkOGI1YwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYml0bWFwcy9vaWNfd2luZWljb24KQEAgLTAsMCArMSw0MyBAQAorLyogWFBNICovCitzdGF0aWMgY2hhciAqIG9pY193aW5laWNvbltdID0geworIjMyIDMyIDggMSIsCisiIAlzIE5vbmUJYyBOb25lIiwKKyIuCXMgY3lhbiBjIGN5YW4iLAorIlgJcyBwdXJwbGUgYyAjODAwMDgwIiwKKyJvCXMgYmxhY2sgYyBibGFjayIsCisiTwlzIHdoaXRlIGMgd2hpdGUiLAorIisJcyBka3llbGxvdyBjICM4MDgwMDAiLAorIkAJcyB5ZWxsb3cgYyB5ZWxsb3ciLAorIiMJcyByZWQgYyByZWQiLAorIiAgICAgICAgLiAgLiAgICAgLiAgIC4gICAuIFhYICAgIiwKKyIgICAgICAgICAgICAgIC4gICAgICAgICAgIFhYICAgICIsCisiICAgICAgICAgIC4gICAgICAgIC4gICAgWFhYWCAgICAiLAorIiAgICAgICAuICAgICAgIC4gICAgICAgLiBYWFhYICAgIiwKKyIgICAgICAgb28ub29vb29vby5vb29vb29vWFggICAgICIsCisiICBvb29vb09PT09PLk9PT09PTy5PT09PWFhvb29vbyAiLAorIiAgIG9PT09vLm9vb29vb29vb29vb29vWFhvT09PbyAgIiwKKyIgICAgb09PTysrQEBALkBAQEBAQC5AQFhYT09PbyAgICIsCisiICAgICBvKysrQEBAQEBAQEBAQEBAQFhYKysrbyAgICAiLAorIiAgICAgIG8rKysrKysrKysrKysrK1hYKysrbyAgICAgIiwKKyIgICAgICAgbysrKysrKysrKysrKytYWCsrbyAgICAgICIsCisiICAgICAgICBvKysrKysrKysrKytYWCsrbyAgICAgICAiLAorIiAgICAgICAgIG8rKysrKysrKysrWFgrbyAgICAgICAgIiwKKyIgICAgICAgICAgbysrKysrIyMrWFgrbyAgICAgICAgICIsCisiICAgICAgICAgICBvKysrIyMjI1grbyAgICAgICAgICAiLAorIiAgICAgICAgICAgIG8rKysjI1hYbyAgICAgICAgICAgIiwKKyIgICAgICAgICAgICAgb28rKytvbyAgICAgICAgICAgICIsCisiICAgICAgICAgICAgICAgb29vICAgICAgICAgICAgICAiLAorIiAgICAgICAgICAgICAgIG9PbyAgICAgICAgICAgICAgIiwKKyIgICAgICAgICAgICAgICBvT28gICAgICAgICAgICAgICIsCisiICAgICAgICAgICAgICAgb09vICAgICAgICAgICAgICAiLAorIiAgICAgICAgICAgICAgIG9PbyAgICAgICAgICAgICAgIiwKKyIgICAgICAgICAgICAgICBvT28gICAgICAgICAgICAgICIsCisiICAgICAgICAgICAgICAgb09vICAgICAgICAgICAgICAiLAorIiAgICAgICAgICAgICAgIG9PbyAgICAgICAgICAgICAgIiwKKyIgICAgICAgICAgICAgICBvT28gICAgICAgICAgICAgICIsCisiICAgICAgICAgICBvb29vb09vb29vbyAgICAgICAgICAiLAorIiAgICAgIG9vb29vT09Pb09PT29PT09vb29vbyAgICAgIiwKKyIgICAgIG9PT09PT09Pb09PT09Pb09PT09PT09vICAgICIsCisiICAgICBvT09PT09PT09PT09PT09PT09PT09PbyAgICAiLAorIiAgICAgIG9vb29vT09PT09PT09PT09vb29vbyAgICAgIiwKKyIgICAgICAgICAgIG9vb29vb29vb29vICAgICAgICAgICJ9OwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb21iby5oIGIvaW5jbHVkZS9jb21iby5oCmluZGV4IDRiMGQ0NDQuLmNmMzAxZjAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29tYm8uaAorKysgYi9pbmNsdWRlL2NvbWJvLmgKQEAgLTMsMTUgKzMsMTUgQEAKICAqLwogCiAKLXR5cGVkZWYgc3RydWN0IHRhZ0hFQURDT01CTyB7Ci0gICAgRFdPUkQJZHdTdHlsZTsKLSAgICBEV09SRAlkd1N0YXRlOwotICAgIEhXTkQJaFduZEVkaXQ7Ci0gICAgSFdORAloV25kTEJveDsKLQlzaG9ydAlMYXN0U2VsOwotCVJFQ1QJUmVjdEVkaXQ7Ci0JQk9PTAliUmVkcmF3RmxhZzsKLX0gSEVBRENPTUJPOwotdHlwZWRlZiBIRUFEQ09NQk8gRkFSKiBMUEhFQURDT01CTzsKLQotCit0eXBlZGVmIHN0cnVjdCB7CisgIERXT1JEIGR3U3R5bGU7CisgIERXT1JEIGR3U3RhdGU7CisgIEhXTkQgIGhXbmRFZGl0OworICBIV05EICBoV25kTEJveDsKKyAgV09SRCAgTEJveFRvcDsKKyAgQk9PTCAgRHJvcERvd25WaXNpYmxlOworICBzaG9ydCBMYXN0U2VsOworICBSRUNUICBSZWN0RWRpdDsKKyAgUkVDVCAgUmVjdEJ1dHRvbjsKKyAgQk9PTCAgYlJlZHJhd0ZsYWc7Cit9IEhFQURDT01CTywqTFBIRUFEQ09NQk87CmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbW1kbGcuaCBiL2luY2x1ZGUvY29tbWRsZy5oCmluZGV4IDk1ZWVmYjYuLjIxNjFhNmMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29tbWRsZy5oCisrKyBiL2luY2x1ZGUvY29tbWRsZy5oCkBAIC0yODEsMjAgKzI4MSwxNCBAQAogKiAgICAgICAgICAgICAgICAgQ09NTURMRyBSZXNvdXJjZXMgcGxhY2VkIGluIFdpbmUgU1lTUkVTLkRMTAkJICAgICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotI2RlZmluZSBPQk1fRk9MREVSCQkJMzI1MjAKLSNkZWZpbmUgT0JNX0ZPTERFUjIJCQkzMjUyMQotI2RlZmluZSBPQk1fRkxPUFBZCQkJMzI1MjIKLSNkZWZpbmUgT0JNX0hESVNLCQkJMzI1MjMKLSNkZWZpbmUgT0JNX0NEUk9NCQkJMzI1MjQKLQotI2RlZmluZSBPUEVORklMRURMRwkJCQkzCi0jZGVmaW5lIFNBVkVGSUxFRExHCQkJCTQKLSNkZWZpbmUgUFJJTlRETEcJCQkJNQorI2RlZmluZSBPUEVORklMRURMRyAgICAJCQkzCisjZGVmaW5lIFNBVkVGSUxFRExHICAgIAkJCTQKKyNkZWZpbmUgUFJJTlRETEcJICAgICAgIAkJNQogI2RlZmluZSBQUklOVFNFVFVQRExHCQkJNgotI2RlZmluZSBGT05URExHCQkJCQk3Ci0jZGVmaW5lIENPTE9SRExHCQkJCTgKLSNkZWZpbmUgRklORERMRwkJCQkJOQotI2RlZmluZSBSRVBMQUNFRExHCQkJCTEwCisjZGVmaW5lIEZPTlRETEcJCSAgICAgICAJCTcKKyNkZWZpbmUgQ09MT1JETEcJICAgICAgIAkJOAorI2RlZmluZSBGSU5ERExHCQkgICAgICAgCQk5CisjZGVmaW5lIFJFUExBQ0VETEcJICAgICAgIAkJMTAKIAogCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvZGlhbG9nLmggYi9pbmNsdWRlL2RpYWxvZy5oCmluZGV4IGNhMWY0MTguLjAyYmY4ZDAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvZGlhbG9nLmgKKysrIGIvaW5jbHVkZS9kaWFsb2cuaApAQCAtMTEsOCArMTEsMTEgQEAKIAogZXh0ZXJuIEJPT0wgRElBTE9HX0luaXQodm9pZCk7CiBleHRlcm4gSFdORCBESUFMT0dfR2V0Rmlyc3RUYWJJdGVtKCBIV05EIGh3bmREbGcgKTsKLWV4dGVybiBpbnQgRGlhbG9nQm94SW5kaXJlY3RQdHIoIEhJTlNUQU5DRSBoSW5zdCwgTFBDU1RSIGRsZ1RlbXBsYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICBIV05EIG93bmVyLCBXTkRQUk9DIGRsZ1Byb2MpOworZXh0ZXJuIGludCBEaWFsb2dCb3hJbmRpcmVjdFB0cihISU5TVEFOQ0UgaEluc3QsIExQQ1NUUiBkbGdUZW1wbGF0ZSwKKwkJCQlIV05EIG93bmVyLCBXTkRQUk9DIGRsZ1Byb2MpOworZXh0ZXJuIGludCBEaWFsb2dCb3hJbmRpcmVjdFBhcmFtUHRyKEhJTlNUQU5DRSBoSW5zdCwgTFBDU1RSIGRsZ1RlbXBsYXRlLAorCQkJCSAgICAgSFdORCBvd25lciwgV05EUFJPQyBkbGdQcm9jLCAKKwkJCQkgICAgIExQQVJBTSBwYXJhbSk7CiAKICNpZm5kZWYgV0lORUxJQgogI3ByYWdtYSBwYWNrKDEpCmRpZmYgLS1naXQgYS9pbmNsdWRlL2RsbHMuaCBiL2luY2x1ZGUvZGxscy5oCmluZGV4IDY4MWQ4MjEuLjgxMzIyMGIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvZGxscy5oCisrKyBiL2luY2x1ZGUvZGxscy5oCkBAIC0xMiw5ICsxMiw2IEBACiAjZGVmaW5lIE1BWF9OQU1FX0xFTkdUSAkJNjQKIAogCi1zdHJ1Y3QgbmVfZGF0YSB7Ci0gICAgc3RydWN0IG5lX2hlYWRlcl9zICpuZV9oZWFkZXI7Ci19OwogCiBzdHJ1Y3QgcGVfZGF0YSB7CiAJc3RydWN0IHBlX2hlYWRlcl9zICpwZV9oZWFkZXI7CkBAIC0zNiw3ICszMyw2IEBACiAgICAgSEFORExFIGhNb2R1bGU7CiAgICAgaW50IGluaXRpYWxpc2VkOwogICAgIHN0cnVjdCBtel9oZWFkZXJfcyAqbXpfaGVhZGVyOwotICAgIHN0cnVjdCBuZV9kYXRhICpuZTsKICAgICBzdHJ1Y3QgcGVfZGF0YSAqcGU7CiB9OwogCkBAIC00NSw2NCArNDEsNTIgQEAKICNkZWZpbmUgRExMCTAKICNkZWZpbmUgRVhFCTEKIAotc3RydWN0IGRsbF90YWJsZV9lbnRyeV9zCi17Ci0gICAgLyoKLSAgICAgKiAxNi0+MzIgYml0IGludGVyZmFjZSBkYXRhCi0gICAgICovCi0gICAgY2hhciAqZXhwb3J0X25hbWU7Ci0jaWZkZWYgV0lORVNUQVQKLSAgICBpbnQgdXNlZDsJCQkvKiBOdW1iZXIgb2YgdGltZXMgdGhpcyBmdW5jdGlvbiByZWZlcmVuY2VkICovCi0jZW5kaWYKLX07CiAKIHN0cnVjdCBkbGxfdGFibGVfcwogewotICAgIHN0cnVjdCBkbGxfdGFibGVfZW50cnlfcyAqZGxsX3RhYmxlOwotICAgIGludCBkbGxfdGFibGVfbGVuZ3RoOwotICAgIGludCBkbGxfbnVtYmVyOwotICAgIEJZVEUgKmNvZGVfc3RhcnQ7ICAgIC8qIDMyLWJpdCBhZGRyZXNzIG9mIERMTCBjb2RlICovCi0gICAgQllURSAqZGF0YV9zdGFydDsgICAgLyogMzItYml0IGFkZHJlc3Mgb2YgRExMIGRhdGEgKi8KLSAgICBCWVRFICptb2R1bGVfc3RhcnQ7ICAvKiAzMi1iaXQgYWRkcmVzcyBvZiB0aGUgbW9kdWxlIGRhdGEgKi8KLSAgICBCWVRFICptb2R1bGVfZW5kOwotICAgIEhNT0RVTEUgaE1vZHVsZTsKKyAgICBjaGFyICogIG5hbWU7ICAgICAgICAgIC8qIERMTCBuYW1lICovCisgICAgQllURSAqICBjb2RlX3N0YXJ0OyAgICAvKiAzMi1iaXQgYWRkcmVzcyBvZiBETEwgY29kZSAqLworICAgIEJZVEUgKiAgZGF0YV9zdGFydDsgICAgLyogMzItYml0IGFkZHJlc3Mgb2YgRExMIGRhdGEgKi8KKyAgICBCWVRFICogIG1vZHVsZV9zdGFydDsgIC8qIDMyLWJpdCBhZGRyZXNzIG9mIHRoZSBtb2R1bGUgZGF0YSAqLworICAgIEJZVEUgKiAgbW9kdWxlX2VuZDsKKyAgICBCT09MICAgIHVzZWQ7ICAgICAgICAgIC8qIHVzZSBNUyBwcm92aWRlZCBpZiBGQUxTRSAqLworICAgIEhNT0RVTEUgaE1vZHVsZTsgICAgICAgLyogbW9kdWxlIGNyZWF0ZWQgZm9yIHRoaXMgRExMICovCiB9OwogCi1zdHJ1Y3QgZGxsX25hbWVfdGFibGVfZW50cnlfcwotewotICAgIGNoYXIgKmRsbF9uYW1lOwotICAgIHN0cnVjdCBkbGxfdGFibGVfcyAqdGFibGU7Ci0gICAgaW50IGRsbF9pc191c2VkOyAgIC8qIHVzZSBNUyBwcm92aWRlZCBpZiBzZXQgdG8gemVybyAqLwotfTsKKyNkZWZpbmUgREVDTEFSRV9ETEwobmFtZSkgXAorZXh0ZXJuIEJZVEUgbmFtZSMjX0NvZGVfU3RhcnRbXTsgXAorZXh0ZXJuIEJZVEUgbmFtZSMjX0RhdGFfU3RhcnRbXTsgXAorZXh0ZXJuIEJZVEUgbmFtZSMjX01vZHVsZV9TdGFydFtdOyBcCitleHRlcm4gQllURSBuYW1lIyNfTW9kdWxlX0VuZFtdOwogCi1leHRlcm4gc3RydWN0IGRsbF90YWJsZV9zIEtFUk5FTF90YWJsZTsKLWV4dGVybiBzdHJ1Y3QgZGxsX3RhYmxlX3MgVVNFUl90YWJsZTsKLWV4dGVybiBzdHJ1Y3QgZGxsX3RhYmxlX3MgR0RJX3RhYmxlOwotZXh0ZXJuIHN0cnVjdCBkbGxfdGFibGVfcyBXSU44N0VNX3RhYmxlOwotZXh0ZXJuIHN0cnVjdCBkbGxfdGFibGVfcyBNTVNZU1RFTV90YWJsZTsKLWV4dGVybiBzdHJ1Y3QgZGxsX3RhYmxlX3MgU0hFTExfdGFibGU7Ci1leHRlcm4gc3RydWN0IGRsbF90YWJsZV9zIFNPVU5EX3RhYmxlOwotZXh0ZXJuIHN0cnVjdCBkbGxfdGFibGVfcyBLRVlCT0FSRF90YWJsZTsKLWV4dGVybiBzdHJ1Y3QgZGxsX3RhYmxlX3MgV0lOU09DS190YWJsZTsKLWV4dGVybiBzdHJ1Y3QgZGxsX3RhYmxlX3MgU1RSRVNTX3RhYmxlOwotZXh0ZXJuIHN0cnVjdCBkbGxfdGFibGVfcyBTWVNURU1fdGFibGU7Ci1leHRlcm4gc3RydWN0IGRsbF90YWJsZV9zIFRPT0xIRUxQX3RhYmxlOwotZXh0ZXJuIHN0cnVjdCBkbGxfdGFibGVfcyBNT1VTRV90YWJsZTsKLWV4dGVybiBzdHJ1Y3QgZGxsX3RhYmxlX3MgQ09NTURMR190YWJsZTsKLWV4dGVybiBzdHJ1Y3QgZGxsX3RhYmxlX3MgT0xFMl90YWJsZTsKLWV4dGVybiBzdHJ1Y3QgZGxsX3RhYmxlX3MgT0xFMkNPTlZfdGFibGU7Ci1leHRlcm4gc3RydWN0IGRsbF90YWJsZV9zIE9MRTJESVNQX3RhYmxlOwotZXh0ZXJuIHN0cnVjdCBkbGxfdGFibGVfcyBPTEUyTkxTX3RhYmxlOwotZXh0ZXJuIHN0cnVjdCBkbGxfdGFibGVfcyBPTEUyUFJPWF90YWJsZTsKLWV4dGVybiBzdHJ1Y3QgZGxsX3RhYmxlX3MgT0xFQ0xJX3RhYmxlOwotZXh0ZXJuIHN0cnVjdCBkbGxfdGFibGVfcyBPTEVTVlJfdGFibGU7Ci1leHRlcm4gc3RydWN0IGRsbF90YWJsZV9zIENPTVBPQkpfdGFibGU7Ci1leHRlcm4gc3RydWN0IGRsbF90YWJsZV9zIFNUT1JBR0VfdGFibGU7Ci1leHRlcm4gc3RydWN0IGRsbF90YWJsZV9zIFdJTlBST0NTX3RhYmxlOwotZXh0ZXJuIHN0cnVjdCBkbGxfdGFibGVfcyBEREVNTF90YWJsZTsKK0RFQ0xBUkVfRExMKEtFUk5FTCkKK0RFQ0xBUkVfRExMKFVTRVIpCitERUNMQVJFX0RMTChHREkpCitERUNMQVJFX0RMTChXSU44N0VNKQorREVDTEFSRV9ETEwoTU1TWVNURU0pCitERUNMQVJFX0RMTChTSEVMTCkKK0RFQ0xBUkVfRExMKFNPVU5EKQorREVDTEFSRV9ETEwoS0VZQk9BUkQpCitERUNMQVJFX0RMTChXSU5TT0NLKQorREVDTEFSRV9ETEwoU1RSRVNTKQorREVDTEFSRV9ETEwoU1lTVEVNKQorREVDTEFSRV9ETEwoVE9PTEhFTFApCitERUNMQVJFX0RMTChNT1VTRSkKK0RFQ0xBUkVfRExMKENPTU1ETEcpCitERUNMQVJFX0RMTChPTEUyKQorREVDTEFSRV9ETEwoT0xFMkNPTlYpCitERUNMQVJFX0RMTChPTEUyRElTUCkKK0RFQ0xBUkVfRExMKE9MRTJOTFMpCitERUNMQVJFX0RMTChPTEUyUFJPWCkKK0RFQ0xBUkVfRExMKE9MRUNMSSkKK0RFQ0xBUkVfRExMKE9MRVNWUikKK0RFQ0xBUkVfRExMKENPTVBPQkopCitERUNMQVJFX0RMTChTVE9SQUdFKQorREVDTEFSRV9ETEwoV0lOUFJPQ1MpCitERUNMQVJFX0RMTChEREVNTCkKIAogI2RlZmluZSBOX0JVSUxUSU5TCTI1CiAKK2V4dGVybiBzdHJ1Y3QgZGxsX3RhYmxlX3MgZGxsX2J1aWx0aW5fdGFibGVbXTsKKwogI2VuZGlmIC8qIERMTFNfSCAqLwotCi0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvZG9zX2ZzLmggYi9pbmNsdWRlL2Rvc19mcy5oCmluZGV4IGQwYjI0OTIuLjAxYTQ1OGMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvZG9zX2ZzLmgKKysrIGIvaW5jbHVkZS9kb3NfZnMuaApAQCAtMzIsNiArMzIsNyBAQAogZXh0ZXJuIHZvaWQgRE9TX0V4cGFuZFRvRnVsbFBhdGgoY2hhciAqZmlsZW5hbWUsIGludCBkcml2ZSk7CiBleHRlcm4gdm9pZCBET1NfRXhwYW5kVG9GdWxsVW5peFBhdGgoY2hhciAqZmlsZW5hbWUpOwogZXh0ZXJuIGNoYXIgKkRPU19HZXRSZWRpcmVjdGVkRGlyKGludCBkcml2ZSk7CitleHRlcm4gdm9pZCBlcnJub190b19kb3NlcnIodm9pZCk7CiAKIGV4dGVybiBjaGFyIFdpbmRvd3NQYXRoWzI1Nl07CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvaWYxNjMyLmggYi9pbmNsdWRlL2lmMTYzMi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NjcyNmRkLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvaWYxNjMyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0jaWZuZGVmIF9fV0lORV9JRjE2MzJfSAotI2RlZmluZSBfX1dJTkVfSUYxNjMyX0gKLQotI2luY2x1ZGUgPHdpbnR5cGVzLmg+Ci0KLWV4dGVybiBpbnQgQ2FsbFRvSW5pdDE2KHVuc2lnbmVkIGxvbmcgY3NpcCwgdW5zaWduZWQgbG9uZyBzc3NwLCAKLQkJCXVuc2lnbmVkIHNob3J0IGRzKTsKLWV4dGVybiBpbnQgQ2FsbFRvMTZjeCh1bnNpZ25lZCBsb25nIGNzaXAsIHVuc2lnbmVkIGxvbmcgZHNjeCk7Ci1leHRlcm4gaW50IENhbGxUb0RsbEVudHJ5KHVuc2lnbmVkIGxvbmcgY3NpcCwgdW5zaWduZWQgbG9uZyBkc2N4LCB1bnNpZ25lZCBzaG9ydCBkaSk7Ci1leHRlcm4gdm9pZCB3aW5lc3RhdCh2b2lkKTsKLWV4dGVybiBzdHJ1Y3QgZGxsX3RhYmxlX3MgKkZpbmRETExUYWJsZShjaGFyICpkbGxfbmFtZSk7Ci1leHRlcm4gaW50IEZpbmRPcmRpbmFsRnJvbU5hbWUoc3RydWN0IGRsbF90YWJsZV9lbnRyeV9zICpkbGxfdGFibGUsIGNoYXIgKmZ1bmNfbmFtZSk7Ci1leHRlcm4gaW50IFJldHVybkFyZyhpbnQgYXJnKTsKLQotZXh0ZXJuIEJPT0wgUkVMQVlfSW5pdCh2b2lkKTsKLQotI2VuZGlmIC8qIF9fV0lORV9JRjE2MzJfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9sZHQuaCBiL2luY2x1ZGUvbGR0LmgKaW5kZXggNmZhMTlhYS4uZGI5ZDM3ZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9sZHQuaAorKysgYi9pbmNsdWRlL2xkdC5oCkBAIC00NSw3ICs0NSw3IEBACiAjZGVmaW5lIF9fQUhTSElGVCAgMwogI2RlZmluZSBfX0FISU5DUiAgICgxIDw8IF9fQUhTSElGVCkKIAotI2RlZmluZSBTRUxFQ1RPUl9UT19FTlRSWShzZWwpICAoKGludCkoc2VsKSA+PiBfX0FIU0hJRlQpCisjZGVmaW5lIFNFTEVDVE9SX1RPX0VOVFJZKHNlbCkgICgoKGludCkoc2VsKSAmIDB4ZmZmZikgPj4gX19BSFNISUZUKQogI2RlZmluZSBFTlRSWV9UT19TRUxFQ1RPUihpKSAgICAoKGkpID8gKCgoaW50KShpKSA8PCBfX0FIU0hJRlQpIHwgNykgOiAwKQogI2RlZmluZSBJU19MRFRfRU5UUllfRlJFRShpKSAgICAoIShsZHRfY29weVsoaSldLmJhc2UgfHwgbGR0X2NvcHlbKGkpXS5saW1pdCkpCiAjZGVmaW5lIElTX1NFTEVDVE9SX0ZSRUUoc2VsKSAgIChJU19MRFRfRU5UUllfRlJFRShTRUxFQ1RPUl9UT19FTlRSWShzZWwpKSkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGlicmFyeS5oIGIvaW5jbHVkZS9saWJyYXJ5LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxNjFkNjYuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9saWJyYXJ5LmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi0jaWZuZGVmIF9fV0lORV9MSUJSQVJZX0gKLSNkZWZpbmUgX19XSU5FX0xJQlJBUllfSAotCi1leHRlcm4gSElOU1RBTkNFIGhJbnN0TWFpbjsKLWV4dGVybiBISU5TVEFOQ0UgaFN5c1JlczsKLWV4dGVybiBzdHJ1Y3Qgd19maWxlcyAqR2V0RmlsZUluZm8odW5zaWduZWQgc2hvcnQgaW5zdGFuY2UpOwotZXh0ZXJuIGludCBJc0RMTExvYWRlZChjaGFyICpuYW1lKTsKLWV4dGVybiB2b2lkIEluaXRETEwoc3RydWN0IHdfZmlsZXMgKndwbnQpOwotZXh0ZXJuIHZvaWQgSW5pdGlhbGl6ZUxvYWRlZERMTHMoc3RydWN0IHdfZmlsZXMgKndwbnQpOwotZXh0ZXJuIEhJTlNUQU5DRSBMb2FkSW1hZ2UoY2hhciAqbW9kdWxlLCBpbnQgZmlsZXR5cGUsIGludCBjaGFuZ2VfZGlyKTsKLQotZXh0ZXJuIHN0cnVjdCBkbGxfbmFtZV90YWJsZV9lbnRyeV9zIGRsbF9idWlsdGluX3RhYmxlW107Ci0KLSNlbmRpZiAvKiBfX1dJTkVfTElCUkFSWV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpc3Rib3guaCBiL2luY2x1ZGUvbGlzdGJveC5oCmluZGV4IDMwN2E3NGUuLmYzYWIyNmYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGlzdGJveC5oCisrKyBiL2luY2x1ZGUvbGlzdGJveC5oCkBAIC0xLDM5ICsxLDcwIEBACiAvKgotICogICBMaXN0IEJveCBkZWZpbml0aW9ucworICogICBMaXN0Ym94IGRlZmluaXRpb25zCiAgKi8KIAotCiB0eXBlZGVmIHN0cnVjdCB0YWdMSVNUU1RSVUNUIHsKLQlEUkFXSVRFTVNUUlVDVCAJZGlzOwotCUhBTkRMRQkJaE1lbTsKKyAgICAgICAgTUVBU1VSRUlURU1TVFJVQ1QgbWlzOworICAgICAgICBVSU5UICAgICAgICAgICAgaXRlbVN0YXRlOworICAgICAgICBSRUNUICAgICAgICAgICAgaXRlbVJlY3Q7CiAJSEFORExFCQloRGF0YTsKLQljaGFyCQkqaXRlbVRleHQ7CisJY2hhciAgICAgICAgICAgICppdGVtVGV4dDsKIAlzdHJ1Y3QgdGFnTElTVFNUUlVDVCAqbHBOZXh0OwotfSBMSVNUU1RSVUNUOwotdHlwZWRlZiBMSVNUU1RSVUNUIEZBUiogTFBMSVNUU1RSVUNUOworfSBMSVNUU1RSVUNULCAqTFBMSVNUU1RSVUNUOwogCi0KLXR5cGVkZWYgc3RydWN0IHRhZ0hFQURMSVNUIHsKLQlVSU5UCUZpcnN0VmlzaWJsZTsKLQlVSU5UCUl0ZW1zQ291bnQ7Ci0Jc2hvcnQJSXRlbXNWaXNpYmxlOwotCXNob3J0CUNvbHVtbnNWaXNpYmxlOwotCXNob3J0CUl0ZW1zUGVyQ29sdW1uOwotCXNob3J0CUl0ZW1Gb2N1c2VkOwotCXNob3J0CVByZXZGb2N1c2VkOwotCXNob3J0IAlTdGRJdGVtSGVpZ2h0OwotCXNob3J0CUNvbHVtbnNXaWR0aDsKLQlzaG9ydAlEcmF3Q3RsVHlwZTsKLQl2b2lkCSpscEZpcnN0OwotCURXT1JECWR3U3R5bGU7Ci0JSFdORAloV25kTG9naWNQYXJlbnQ7Ci0JSEZPTlQJaEZvbnQ7Ci0JQk9PTAliUmVkcmF3RmxhZzsKK3R5cGVkZWYgc3RydWN0IHsKKwlXT1JEICAgIEZpcnN0VmlzaWJsZTsKKwlXT1JEICAgIEl0ZW1zQ291bnQ7CisJV09SRCAgICBJdGVtc1Zpc2libGU7CisJV09SRCAgICBDb2x1bW5zVmlzaWJsZTsKKwlXT1JEICAgIEl0ZW1zUGVyQ29sdW1uOworCXNob3J0ICAgSXRlbUZvY3VzZWQ7CisJc2hvcnQgICBQcmV2Rm9jdXNlZDsKKwlXT1JEICAgIFN0ZEl0ZW1IZWlnaHQ7CisJV09SRCAgICBDb2x1bW5zV2lkdGg7CisJV09SRCAgICBEcmF3Q3RsVHlwZTsKKyAgICAgICAgV09SRCAgICBDdGxJRDsKKwlMUExJU1RTVFJVQ1QgbHBGaXJzdDsKKwlEV09SRCAgIGR3U3R5bGU7CisJSFdORCAgICBoUGFyZW50OworCUhGT05UICAgaEZvbnQ7CisJQk9PTCAgICBiUmVkcmF3RmxhZzsKIAlXT1JEICAgIGlOdW1TdG9wczsKIAlMUElOVCAgIFRhYlN0b3BzOwogCUhBTkRMRSAgaERyYXdJdGVtU3RydWN0OwotLyoJTURFU0MJKkhlYXA7ICovCi19IEhFQURMSVNUOwotdHlwZWRlZiBIRUFETElTVCBGQVIqIExQSEVBRExJU1Q7CisgICAgICAgIEJPT0wgICAgbmVlZE1lYXN1cmU7CisvKglNREVTQyAgICpIZWFwOyAqLworfSBIRUFETElTVCwqTFBIRUFETElTVDsKIAorLyogc2hhcmVkIGNvZGUgYmV0d2VlbiBsaXN0Ym94IGFuZCBjb21ibyBjb250cm9scyAqLworZXh0ZXJuIHZvaWQgQ3JlYXRlTGlzdEJveFN0cnVjdChIV05EIGh3bmQsIFdPUkQgQ3RsVHlwZSwgTE9ORyBzdHlsZXMsIEhXTkQgcGFyZW50KTsKK2V4dGVybiB2b2lkIERlc3Ryb3lMaXN0Qm94U3RydWN0KExQSEVBRExJU1QgbHBobCk7CiAKK2V4dGVybiB2b2lkIExpc3RCb3hTZW5kTm90aWZpY2F0aW9uKExQSEVBRExJU1QgbHBobCxIV05EIGh3bmQsIFdPUkQgY29kZSk7CisKK2V4dGVybiBCT09MIE9XTkVSX0RSQVdOKExQSEVBRExJU1QgbHBobCk7CitleHRlcm4gQk9PTCBIYXNTdHJpbmdzKExQSEVBRExJU1QgbHBobCk7CisKK2V4dGVybiBMUExJU1RTVFJVQ1QgTGlzdEJveEdldEl0ZW0oTFBIRUFETElTVCBscGhsLCBVSU5UIHVJbmRleCk7CitleHRlcm4gaW50IExpc3RNYXhGaXJzdFZpc2libGUoTFBIRUFETElTVCBscGhsKTsKK2V4dGVybiBpbnQgTGlzdEJveFNjcm9sbFRvRm9jdXMoTFBIRUFETElTVCBscGhsKTsKK2V4dGVybiBpbnQgTGlzdEJveEFkZFN0cmluZyhMUEhFQURMSVNUIGxwaGwsIExQU1RSIG5ld3N0cik7CitleHRlcm4gaW50IExpc3RCb3hJbnNlcnRTdHJpbmcoTFBIRUFETElTVCBscGhsLCBVSU5UIHVJbmRleCwgTFBTVFIgbmV3c3RyKTsKK2V4dGVybiBpbnQgTGlzdEJveEdldFRleHQoTFBIRUFETElTVCBscGhsLCBVSU5UIHVJbmRleCwgTFBTVFIgT3V0U3RyKTsKK2V4dGVybiBEV09SRCBMaXN0Qm94R2V0SXRlbURhdGEoTFBIRUFETElTVCBscGhsLCBVSU5UIHVJbmRleCk7CitleHRlcm4gaW50IExpc3RCb3hTZXRJdGVtRGF0YShMUEhFQURMSVNUIGxwaGwsIFVJTlQgdUluZGV4LCBEV09SRCBJdGVtRGF0YSk7CitleHRlcm4gaW50IExpc3RCb3hEZWxldGVTdHJpbmcoTFBIRUFETElTVCBscGhsLCBVSU5UIHVJbmRleCk7CitleHRlcm4gaW50IExpc3RCb3hGaW5kU3RyaW5nKExQSEVBRExJU1QgbHBobCwgVUlOVCBuRmlyc3QsIFNFR1BUUiBNYXRjaFN0cik7CitleHRlcm4gaW50IExpc3RCb3hSZXNldENvbnRlbnQoTFBIRUFETElTVCBscGhsKTsKK2V4dGVybiBpbnQgTGlzdEJveFNldEN1clNlbChMUEhFQURMSVNUIGxwaGwsIFdPUkQgd0luZGV4KTsKK2V4dGVybiBpbnQgTGlzdEJveFNldFNlbChMUEhFQURMSVNUIGxwaGwsIFdPUkQgd0luZGV4LCBXT1JEIHN0YXRlKTsKK2V4dGVybiBpbnQgTGlzdEJveEdldFNlbChMUEhFQURMSVNUIGxwaGwsIFdPUkQgd0luZGV4KTsKK2V4dGVybiBpbnQgTGlzdEJveERpcmVjdG9yeShMUEhFQURMSVNUIGxwaGwsIFVJTlQgYXR0cmliLCBMUFNUUiBmaWxlc3BlYyk7CitleHRlcm4gaW50IExpc3RCb3hHZXRJdGVtUmVjdChMUEhFQURMSVNUIGxwaGwsIFdPUkQgd0luZGV4LCBMUFJFQ1QgcmVjdCk7CitleHRlcm4gaW50IExpc3RCb3hTZXRJdGVtSGVpZ2h0KExQSEVBRExJU1QgbHBobCwgV09SRCB3SW5kZXgsIGxvbmcgaGVpZ2h0KTsKK2V4dGVybiBpbnQgTGlzdEJveEZpbmROZXh0TWF0Y2goTFBIRUFETElTVCBscGhsLCBXT1JEIHdDaGFyKTsKKworZXh0ZXJuIHZvaWQgTGlzdEJveERyYXdJdGVtIChIV05EIGh3bmQsIExQSEVBRExJU1QgbHBobCwgSERDIGhkYywKKwkJCSAgICAgTFBMSVNUU1RSVUNUIGxwbHMsIFJFQ1QgKnJlY3QsIFdPUkQgaXRlbUFjdGlvbiwKKwkJCSAgICAgV09SRCBpdGVtU3RhdGUpOworZXh0ZXJuIGludCBMaXN0Qm94RmluZE1vdXNlKExQSEVBRExJU1QgbHBobCwgaW50IFgsIGludCBZKTsKK2V4dGVybiB2b2lkIExpc3RCb3hBc2tNZWFzdXJlKExQSEVBRExJU1QgbHBobCwgTFBMSVNUU1RSVUNUIGxwbHMpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tbXN5c3RlbS5oIGIvaW5jbHVkZS9tbXN5c3RlbS5oCmluZGV4IDgxNWY0MzEuLjM2MDdlNWMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbW1zeXN0ZW0uaAorKysgYi9pbmNsdWRlL21tc3lzdGVtLmgKQEAgLTIzMiwxMSArMjMyLDExIEBACiAKIC8qIGdlbmVyYWwgZm9ybWF0IHN0cnVjdHVyZSBjb21tb24gdG8gYWxsIGZvcm1hdHMgKi8KIHR5cGVkZWYgc3RydWN0IHsKLSAgICBXT1JEICAgIHdGb3JtYXRUYWc7ICAgICAgICAvKiBmb3JtYXQgdHlwZSAqLwotICAgIFdPUkQgICAgbkNoYW5uZWxzOyAgICAgICAgIC8qIG51bWJlciBvZiBjaGFubmVscyAoaS5lLiBtb25vLCBzdGVyZW8sIGV0Yy4pICovCi0gICAgRFdPUkQgICBuU2FtcGxlc1BlclNlYzsgICAgLyogc2FtcGxlIHJhdGUgKi8KLSAgICBEV09SRCAgIG5BdmdCeXRlc1BlclNlYzsgICAvKiBmb3IgYnVmZmVyIGVzdGltYXRpb24gKi8KLSAgICBXT1JEICAgIG5CbG9ja0FsaWduOyAgICAgICAvKiBibG9jayBzaXplIG9mIGRhdGEgKi8KKyAgICBXT1JEICAgIHdGb3JtYXRUYWc7CQkJCQkJLyogZm9ybWF0IHR5cGUgKi8KKyAgICBXT1JEICAgIG5DaGFubmVsczsgCQkJCQkJLyogbnVtYmVyIG9mIGNoYW5uZWxzICovCisgICAgRFdPUkQgICBuU2FtcGxlc1BlclNlYyBXSU5FX1BBQ0tFRDsJCS8qIHNhbXBsZSByYXRlICovCisgICAgRFdPUkQgICBuQXZnQnl0ZXNQZXJTZWMgV0lORV9QQUNLRUQ7CS8qIGZvciBidWZmZXIgZXN0aW1hdGlvbiAqLworICAgIFdPUkQgICAgbkJsb2NrQWxpZ247IAkJCQkJLyogYmxvY2sgc2l6ZSBvZiBkYXRhICovCiB9IFdBVkVGT1JNQVQ7CiB0eXBlZGVmIFdBVkVGT1JNQVQgRkFSICAqTFBXQVZFRk9STUFUOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL21vZHVsZS5oIGIvaW5jbHVkZS9tb2R1bGUuaAppbmRleCBkMzk3M2EwLi41OGEzMDYxIDEwMDY0NAotLS0gYS9pbmNsdWRlL21vZHVsZS5oCisrKyBiL2luY2x1ZGUvbW9kdWxlLmgKQEAgLTQ0LDcgKzQ0LDcgQEAKICAgICBXT1JEICAgIHRydWV0eXBlOyAgICAgICAgIC8qIFNldCB0byAyIGlmIFRydWVUeXBlIGZvbnQgKi8KICAgICBCWVRFICAgIG9zX2ZsYWdzOyAgICAgICAgIC8qIE9wZXJhdGluZyBzeXN0ZW0gZmxhZ3MgKi8KICAgICBCWVRFICAgIG1pc2NfZmxhZ3M7ICAgICAgIC8qIE1pc2MuIGZsYWdzICovCi0gICAgV09SRCAgICByZXNlcnZlZDsgICAgICAgICAvKiBTYW1lIHZhbHVlIGFzIGltcG9ydF90YWJsZSAqLworICAgIEhBTkRMRSAgZGxsc190b19pbml0OyAgICAgLyogTGlzdCBvZiBETExzIHRvIGluaXRpYWxpemUgKi8KICAgICBIQU5ETEUgIG5ybmFtZV9oYW5kbGU7ICAgIC8qIEhhbmRsZSB0byBub24tcmVzaWRlbnQgbmFtZSB0YWJsZSBpbiBtZW1vcnkgKi8KICAgICBXT1JEICAgIG1pbl9zd2FwX2FyZWE7ICAgIC8qIE1pbi4gc3dhcCBhcmVhIHNpemUgKi8KICAgICBXT1JEICAgIGV4cGVjdGVkX3ZlcnNpb247IC8qIEV4cGVjdGVkIFdpbmRvd3MgdmVyc2lvbiAqLwpAQCAtNzEsNiArNzEsMTQgQEAKICAgICBXT1JEICAgIHNlbGVjdG9yOyAgLyogU2VsZWN0b3Igb2Ygc2VnbWVudCBpbiBtZW1vcnkgKi8KIH0gU0VHVEFCTEVFTlRSWTsKIAorICAvKiBQYXJhbWV0ZXJzIGZvciBMb2FkTW9kdWxlKCkgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgICAgSEFORExFIGhFbnZpcm9ubWVudDsgIC8qIEVudmlyb25tZW50IHNlZ21lbnQgKi8KKyAgICBTRUdQVFIgY21kTGluZTsgICAgICAgLyogQ29tbWFuZC1saW5lICovCisgICAgU0VHUFRSIHNob3dDbWQ7ICAgICAgIC8qIENvZGUgZm9yIFNob3dXaW5kb3coKSAqLworICAgIFNFR1BUUiByZXNlcnZlZDsKK30gTE9BRFBBUkFNUzsKIAogI2RlZmluZSBORV9TRUdfVEFCTEUocE1vZHVsZSkgXAogICAgICgoU0VHVEFCTEVFTlRSWSAqKSgoY2hhciAqKShwTW9kdWxlKSArIChwTW9kdWxlKS0+c2VnX3RhYmxlKSkKQEAgLTg3LDYgKzk1LDExIEBACiBleHRlcm4gTFBTVFIgTU9EVUxFX0dldE1vZHVsZU5hbWUoIEhNT0RVTEUgaE1vZHVsZSApOwogZXh0ZXJuIFdPUkQgTU9EVUxFX0dldE9yZGluYWwoIEhNT0RVTEUgaE1vZHVsZSwgY2hhciAqbmFtZSApOwogZXh0ZXJuIERXT1JEIE1PRFVMRV9HZXRFbnRyeVBvaW50KCBITU9EVUxFIGhNb2R1bGUsIFdPUkQgb3JkaW5hbCApOwotZXh0ZXJuIHZvaWQgTU9EVUxFX0ZpeHVwUHJvbG9ncyggSE1PRFVMRSBoTW9kdWxlICk7CitleHRlcm4gQk9PTCBNT0RVTEVfU2V0RW50cnlQb2ludCggSE1PRFVMRSBoTW9kdWxlLCBXT1JEIG9yZGluYWwsIFdPUkQgb2Zmc2V0ICk7CitleHRlcm4gTFBTVFIgTU9EVUxFX0dldEVudHJ5UG9pbnROYW1lKCBITU9EVUxFIGhNb2R1bGUsIFdPUkQgb3JkaW5hbCApOworCitleHRlcm4gQk9PTCBORV9Mb2FkU2VnbWVudCggSE1PRFVMRSBoTW9kdWxlLCBXT1JEIHNlZ251bSApOworZXh0ZXJuIHZvaWQgTkVfRml4dXBQcm9sb2dzKCBITU9EVUxFIGhNb2R1bGUgKTsKK2V4dGVybiB2b2lkIE5FX0luaXRpYWxpemVETExzKCBITU9EVUxFIGhNb2R1bGUgKTsKIAogI2VuZGlmICAvKiBfV0lORV9NT0RVTEVfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZV9pbWFnZS5oIGIvaW5jbHVkZS9uZV9pbWFnZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNGQzZWE3Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvbmVfaW1hZ2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLSNpZm5kZWYgX19XSU5FX05FX0lNQUdFX0gKLSNkZWZpbmUgX19XSU5FX05FX0lNQUdFX0gKLQotZXh0ZXJuIGludCBORV9GaXh1cFNlZ21lbnQoc3RydWN0IHdfZmlsZXMgKndwbnQsIGludCBzZWdtZW50X251bSk7Ci1leHRlcm4gaW50IE5FX3VubG9hZEltYWdlKHN0cnVjdCB3X2ZpbGVzICp3cG50KTsKLWV4dGVybiBpbnQgTkVfU3RhcnRQcm9ncmFtKCBITU9EVUxFIGhNb2R1bGUgKTsKLWV4dGVybiBCT09MIE5FX0luaXRETEwoIEhNT0RVTEUgaE1vZHVsZSApOwotZXh0ZXJuIEhJTlNUQU5DRSBORV9Mb2FkSW1hZ2Uoc3RydWN0IHdfZmlsZXMgKndwbnQpOwotCi0jZW5kaWYgLyogX19XSU5FX05FX0lNQUdFX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvb3B0aW9ucy5oIGIvaW5jbHVkZS9vcHRpb25zLmgKaW5kZXggMDk1ZmE4OC4uODBiOGE3MyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9vcHRpb25zLmgKKysrIGIvaW5jbHVkZS9vcHRpb25zLmgKQEAgLTE5LDYgKzE5LDcgQEAKICAgICBpbnQgICAgZGVidWc7CiAgICAgaW50ICAgIGFsbG93UmVhZE9ubHk7ICAgLyogT3BlbmluZyBhIHJlYWQgb25seSBmaWxlIHdpbGwgc3VjY2VlZCBldmVuCiAJCQkgICAgICAgaWYgd3JpdGUgYWNjZXNzIGlzIHJlcXVlc3RlZCAqLworICAgIGludCAgICBlbmhhbmNlZDsgICAgICAgIC8qIFN0YXJ0IFdpbmUgaW4gZW5oYW5jZWQgbW9kZSAqLyAKIH07CiAKIGV4dGVybiBzdHJ1Y3Qgb3B0aW9ucyBPcHRpb25zOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9wZV9pbWFnZS5oIGIvaW5jbHVkZS9wZV9pbWFnZS5oCmluZGV4IDUyNTk2MDMuLmQ3ZmNlZWUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvcGVfaW1hZ2UuaAorKysgYi9pbmNsdWRlL3BlX2ltYWdlLmgKQEAgLTcsNCArNywxOCBAQAogZXh0ZXJuIEhJTlNUQU5DRSBQRV9Mb2FkSW1hZ2Uoc3RydWN0IHdfZmlsZXMgKndwbnQpOwogZXh0ZXJuIHZvaWQgbXlfd2NzdG9tYnMoY2hhciAqIHJlc3VsdCwgdV9zaG9ydCAqIHNvdXJjZSwgaW50IGxlbik7CiAKK3R5cGVkZWYgc3RydWN0IF9XSU4zMl9mdW5jdGlvbnsKKyAgICBjaGFyICpuYW1lOworICAgIHZvaWQgKmRlZmluaXRpb247Cit9IFdJTjMyX2Z1bmN0aW9uOworCit0eXBlZGVmIHN0cnVjdCBfV0lOMzJfYnVpbHRpbnsKKyAgICBjaGFyICpuYW1lOworICAgIFdJTjMyX2Z1bmN0aW9uICpmdW5jdGlvbnM7CisgICAgaW50IHNpemU7CisgICAgc3RydWN0IF9XSU4zMl9idWlsdGluICpuZXh0OworfSBXSU4zMl9idWlsdGluOworCitleHRlcm4gV0lOMzJfYnVpbHRpbiAqV0lOMzJfYnVpbHRpbl9saXN0OworCiAjZW5kaWYgLyogX19XSU5FX1BFX0lNQUdFX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvcGVleGUuaCBiL2luY2x1ZGUvcGVleGUuaAppbmRleCBkNWNlMzQyLi42ZjU0ODExIDEwMDY0NAotLS0gYS9pbmNsdWRlL3BlZXhlLmgKKysrIGIvaW5jbHVkZS9wZWV4ZS5oCkBAIC0xMzgsOSArMTM4LDEwIEBACiBzdHJ1Y3QgUEVfSW1wb3J0X0RpcmVjdG9yeQogewogICB1X2ludCBJbXBvcnRfTGlzdDsKLSAgdV9pbnQgcmVzZXJ2ZWRbMl07CisgIHVfaW50IFRpbWVEYXRlOworICB1X2ludCBGb3J3YXJkZXI7CiAgIHVfaW50IE1vZHVsZU5hbWU7Ci0gIHVfaW50IHJlc2VydmVkMTsKKyAgdV9pbnQgVGh1bmtfTGlzdDsKIH07CiAKIHN0cnVjdCBwZV9pbXBvcnRfbmFtZQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9wcm90b3R5cGVzLmggYi9pbmNsdWRlL3Byb3RvdHlwZXMuaAppbmRleCA5ZmEwM2RhLi5iMjI4OGM2IDEwMDY0NAotLS0gYS9pbmNsdWRlL3Byb3RvdHlwZXMuaAorKysgYi9pbmNsdWRlL3Byb3RvdHlwZXMuaApAQCAtOCw4ICs4LDYgQEAKIAogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgogCi0jaW5jbHVkZSAibmVleGUuaCIKLSNpbmNsdWRlICJtc2Rvcy5oIgogI2luY2x1ZGUgIndpbmRvd3MuaCIKIAogI2lmbmRlZiBXSU5FTElCCkBAIC0yNiwyMCArMjQsMTEgQEAKIAogLyogbG9hZGVyL3dpbmUuYyAqLwogCi1leHRlcm4gdm9pZCBteWVycm9yKGNvbnN0IGNoYXIgKnMpOwotCi1leHRlcm4gY2hhciAqR2V0RmlsZW5hbWVGcm9tSW5zdGFuY2UodW5zaWduZWQgc2hvcnQgaW5zdGFuY2UpOwotZXh0ZXJuIEhJTlNUQU5DRSBMb2FkSW1hZ2UoY2hhciAqbW9kdWxlbmFtZSwgaW50IGZpbGV0eXBlLCBpbnQgY2hhbmdlX2Rpcik7CiBleHRlcm4gaW50IF9XaW5NYWluKGludCBhcmdjLCBjaGFyICoqYXJndik7Ci1leHRlcm4gdm9pZCBJbml0aWFsaXplTG9hZGVkRExMcygpOwogCiAvKiBtaXNjL3NweS5jICovCiAKIGV4dGVybiB2b2lkIFNweUluaXQodm9pZCk7CiAKLS8qIGNvbnRyb2xzL3dpZGdldC5jICovCi0KLWV4dGVybiBCT09MIFdJREdFVFNfSW5pdCh2b2lkKTsKLQogI2VuZGlmIC8qIFdJTkVMSUIgKi8KICNlbmRpZiAvKiBfV0lORV9QUk9UT1RZUEVTX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvc2VsZWN0b3JzLmggYi9pbmNsdWRlL3NlbGVjdG9ycy5oCmluZGV4IDlmN2VmODAuLjgzYTUzMDkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvc2VsZWN0b3JzLmgKKysrIGIvaW5jbHVkZS9zZWxlY3RvcnMuaApAQCAtMTYsMTYgKzE2LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bSBzZWdfdHlwZSB0eXBlLCBCT09MIGlzMzJiaXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJPT0wgcmVhZG9ubHkgKTsKIAotI2luY2x1ZGUgImRsbHMuaCIKLQogZXh0ZXJuIHZvaWQgQ3JlYXRlU2VsZWN0b3JzKHZvaWQpOwogCi1leHRlcm4gdW5zaWduZWQgaW50IEdldEVudHJ5RExMTmFtZShjaGFyICpkbGxfbmFtZSwgY2hhciAqZnVuY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXT1JEICpzZWwsIFdPUkQgKm9mZnNldCk7Ci1leHRlcm4gdW5zaWduZWQgaW50IEdldEVudHJ5RExMT3JkaW5hbChjaGFyICpkbGxfbmFtZSwgaW50IG9yZGluYWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXT1JEICpzZWwsIFdPUkQgKm9mZnNldCk7Ci1leHRlcm4gdm9pZCBJbml0U2VsZWN0b3JzKHZvaWQpOwotCiBleHRlcm4gV05EUFJPQyBHZXRXbmRQcm9jRW50cnkxNiggY2hhciAqbmFtZSApOwogCiAjZW5kaWYgLyogX19XSU5FX1NFTEVDVE9SU19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3N0YWNrZnJhbWUuaCBiL2luY2x1ZGUvc3RhY2tmcmFtZS5oCmluZGV4IGE2YTlhYzcuLjgxOTY0NjEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvc3RhY2tmcmFtZS5oCisrKyBiL2luY2x1ZGUvc3RhY2tmcmFtZS5oCkBAIC01NCwxMSArNTQsMTcgQEAKIAogICAvKiBTYXZlZCAzMi1iaXQgc3RhY2sgKi8KIGV4dGVybiBEV09SRCBJRjE2MzJfU2F2ZWQzMl9lc3A7Ci0KK2V4dGVybiBTRUdQVFIgSUYxNjMyX1N0YWNrMzJfYmFzZTsKIAogI2RlZmluZSBDVVJSRU5UX1NUQUNLMTYgXAogICAgICgoU1RBQ0sxNkZSQU1FICopUFRSX1NFR19PRkZfVE9fTElOKElGMTYzMl9TYXZlZDE2X3NzLElGMTYzMl9TYXZlZDE2X3NwKSkKIAogI2RlZmluZSBDVVJSRU5UX0RTICAgKENVUlJFTlRfU1RBQ0sxNi0+ZHMpCiAKKyAgLyogTWFrZSBhIHNlZ21lbnRlZCBwb2ludGVyIGZyb20gYSBwb2ludGVyIHRvIGEgdmFyaWFibGUgbG9jYXRlZCAqLworICAvKiBvbiB0aGUgMzItYml0IHN0YWNrIGZvciB0aGUgY3VycmVudCB0YXNrLiAqLworI2RlZmluZSBNQUtFX1NFR1BUUihwdHIpIFwKKyAgICAgKChTRUdQVFIpSUYxNjMyX1N0YWNrMzJfYmFzZSArIFwKKyAgICAgICgoRFdPUkQpKHB0cikgLSAoRFdPUkQpUFRSX1NFR19UT19MSU4oSUYxNjMyX1N0YWNrMzJfYmFzZSkpKQorCiAjZW5kaWYgLyogV0lORV9TVEFDS0ZSQU1FX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvdGFzay5oIGIvaW5jbHVkZS90YXNrLmgKaW5kZXggYTY5ZmVhNy4uZTc4ZjZkNSAxMDA2NDQKLS0tIGEvaW5jbHVkZS90YXNrLmgKKysrIGIvaW5jbHVkZS90YXNrLmgKQEAgLTU4LDEzICs1OCwxMyBAQAogICAgIEJZVEUgICAgdW51c2VkMTsKICAgICBIR0xPQkFMIGhTdGFjazMyOyAgICAgICAgICAgICAgICAgICAvKiBIYW5kbGUgdG8gMzItYml0IHN0YWNrICovCiAgICAgV09SRCAgICBoU2VsZjsgICAgICAgICAgICAgICAgICAgICAgLyogU2VsZWN0b3Igb2YgdGhpcyBUREIgKi8KLSAgICBXT1JEICAgIHVudXNlZDM7CisgICAgSEFORExFICBoUHJldkluc3RhbmNlOyAgICAgICAgICAgICAgLyogUHJldmlvdXMgaW5zdGFuY2Ugb2YgdGhlIG1vZHVsZSAqLwogICAgIERXT1JEICAgZXNwOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIDMyLWJpdCBzdGFjayBwb2ludGVyICovCiAgICAgV09SRCAgICBjdHJsd29yZDgwODc7ICAgICAgICAgICAgICAgLyogODB4ODcgY29udHJvbCB3b3JkICovCiAgICAgV09SRCAgICBmbGFnczsgICAgICAgICAgICAgICAgICAgICAgLyogVGFzayBmbGFncyAqLwogICAgIFdPUkQgICAgZXJyb3JfZmxhZ3M7ICAgICAgICAgICAgICAgIC8qIEVycm9yIGhhbmRsaW5nIGZsYWdzICovCiAgICAgV09SRCAgICB2ZXJzaW9uOyAgICAgICAgICAgICAgICAgICAgLyogRXhwZWN0ZWQgV2luZG93cyB2ZXJzaW9uICovCi0gICAgSEFORExFICBoSW5zdGFuY2U7ICAgICAgICAgICAgICAgICAgLyogSW5zdGFuY2UgaGFuZGxlICBmb3IgdGhpcyB0YXNrICovCisgICAgSEFORExFICBoSW5zdGFuY2U7ICAgICAgICAgICAgICAgICAgLyogSW5zdGFuY2UgaGFuZGxlIGZvciB0aGlzIHRhc2sgKi8KICAgICBITU9EVUxFIGhNb2R1bGU7ICAgICAgICAgICAgICAgICAgICAvKiBNb2R1bGUgaGFuZGxlICovCiAgICAgSEFORExFICBoUXVldWU7ICAgICAgICAgICAgICAgICAgICAgLyogU2VsZWN0b3Igb2YgdGFzayBtZXNzYWdlIHF1ZXVlICovCiAgICAgSFRBU0sgICBoUGFyZW50OyAgICAgICAgICAgICAgICAgICAgLyogU2VsZWN0b3Igb2YgVERCIG9mIHBhcmVudCB0YXNrICovCkBAIC04NSw3ICs4NSw3IEBACiAgICAgRFdPUkQgICBkdGEgV0lORV9QQUNLRUQ7ICAgICAgICAgICAgLyogQ3VycmVudCBEVEEgKi8KICAgICBCWVRFICAgIGN1cmRyaXZlOyAgICAgICAgICAgICAgICAgICAvKiBDdXJyZW50IGRyaXZlICovCiAgICAgQllURSAgICBjdXJkaXJbNjVdOyAgICAgICAgICAgICAgICAgLyogQ3VycmVudCBkaXJlY3RvcnkgKi8KLSAgICBXT1JEICAgIHVudXNlZDU7CisgICAgV09SRCAgICBuQ21kU2hvdzsgICAgICAgICAgICAgICAgICAgLyogY21kU2hvdyBwYXJhbWV0ZXIgdG8gV2luTWFpbiAqLwogICAgIEhUQVNLICAgaFlpZWxkVG87ICAgICAgICAgICAgICAgICAgIC8qIE5leHQgdGFzayB0byBzY2hlZHVsZSAqLwogICAgIERXT1JEICAgZGxsc190b19pbml0OyAgICAgICAgICAgICAgIC8qIFB0ciB0byBsaXN0IG9mIERMTCB0byBpbml0aWFsaXplICovCiAgICAgSEFORExFICBoQ1NBbGlhczsgICAgICAgICAgICAgICAgICAgLyogQ29kZSBzZWdtZW50IGFsaWFzIGZvciB0aGlzIFREQiAqLwpAQCAtMTA4LDYgKzEwOCwxMCBAQAogI3ByYWdtYSBwYWNrKDQpCiAjZW5kaWYKIAorZXh0ZXJuIEhUQVNLIFRBU0tfQ3JlYXRlVGFzayggSE1PRFVMRSBoTW9kdWxlLCBIQU5ETEUgaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFIGhQcmV2SW5zdGFuY2UsIEhBTkRMRSBoRW52aXJvbm1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICpjbWRMaW5lLCBXT1JEIGNtZFNob3cgKTsKKwogICAvKiBUQVNLX1Jlc2NoZWR1bGUoKSAxNi1iaXQgZW50cnkgcG9pbnQgKi8KIGV4dGVybiBGQVJQUk9DIFJFTEFZX1Jlc2NoZWR1bGVQcm9jQWRkcjsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS90ZXh0cy5oIGIvaW5jbHVkZS90ZXh0cy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNDNiMzk5Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvdGV4dHMuaAorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLQotLyoKLSAqIHRleHRzLmggLSBTdHJpbmcgY29uc3RhbnRzIGFyZSByZWFkIGZyb20gWHJlc291cmNlcy9hcHAtZGVmYXVsdHMKLSAqIChjKSAxOTk0IEpvY2hlbiBIZWluICggSGVpbkBTdHVkZW50LlRVLUNsYXVzdGhhbC5kZSApCi0gKi8KLQotLyoKLSAqIFR5cGUtZGVzY3JpcHRpb24gZm9yIGJ1dHRvbnMKLSAqLwotCi10eXBlZGVmIHN0cnVjdCB0QnV0dG9uRGVzYyB7Ci0gIGNoYXIgKkxhYmVsOyAgICAgICAgICAgICAgLyogTGFiZWwgb2YgdGhlIEJ1dHRvbiAqLwotICBjaGFyIEhvdGtleTsgICAgICAgICAgICAgICAvKiBIb3RrZXkgdG8gcHJlc3MgdGhpcyBCdXR0b24gKi8KLX0gQnV0dG9uRGVzYzsKLQotdHlwZWRlZiBzdHJ1Y3QgdEJ1dHRvblRleHRzIHsKLSAgQnV0dG9uRGVzYyBZZXM7Ci0gIEJ1dHRvbkRlc2MgTm87Ci0gIEJ1dHRvbkRlc2MgT2s7Ci0gIEJ1dHRvbkRlc2MgQ2FuY2VsOwotICBCdXR0b25EZXNjIEFib3J0OwotICBCdXR0b25EZXNjIFJldHJ5OwotICBCdXR0b25EZXNjIElnbm9yZTsKLX0gQnV0dG9uVGV4dHM7Ci0KLQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS93aW5kb3dzLmggYi9pbmNsdWRlL3dpbmRvd3MuaAppbmRleCBmNzRhYTNlLi43NmVjNTlkIDEwMDY0NAotLS0gYS9pbmNsdWRlL3dpbmRvd3MuaAorKysgYi9pbmNsdWRlL3dpbmRvd3MuaApAQCAtMyw3ICszLDcgQEAKICNpZm5kZWYgV0lORE9XU19ICiAjZGVmaW5lIFdJTkRPV1NfSAogCi0jaW5jbHVkZSA8d2ludHlwZXMuaD4KKyNpbmNsdWRlICJ3aW50eXBlcy5oIgogCiAjaWZuZGVmIFdJTkVMSUIKICNwcmFnbWEgcGFjaygxKQpAQCAtNDgsOCArNDgsNiBAQAogCiAgIC8qIFdpbmRvdyBjbGFzc2VzICovCiAKLXR5cGVkZWYgTE9ORyAoKldORFBST0MpKEhXTkQsIFVJTlQsIFdQQVJBTSwgTFBBUkFNKTsKLQogdHlwZWRlZiBzdHJ1Y3QgewogCVdPUkQJc3R5bGU7CiAJV05EUFJPQwlscGZuV25kUHJvYyBXSU5FX1BBQ0tFRDsKQEAgLTcwMCw2ICs2OTgsMTAgQEAKICNkZWZpbmUgVFRfQVZBSUxBQkxFICAgICAgICAweDAwMDEKICNkZWZpbmUgVFRfRU5BQkxFRCAgICAgICAgICAweDAwMDIKIAorLyogR2V0L1NldFN5c3RlbVBhbGV0dGVVc2UoKSB2YWx1ZXMgKi8KKyNkZWZpbmUgU1lTUEFMX1NUQVRJQyAgIDEKKyNkZWZpbmUgU1lTUEFMX05PU1RBVElDIDIKKwogdHlwZWRlZiBzdHJ1Y3QgdGFnUEFMRVRURUVOVFJZCiB7CiAJQllURSBwZVJlZCwgcGVHcmVlbiwgcGVCbHVlLCBwZUZsYWdzOwpAQCAtMTMxMyw2ICsxMzE1LDEyIEBACiAjZGVmaW5lIE9CTV9SR0FSUk9XSSAgICAgICAgMzI3MzUKICNkZWZpbmUgT0JNX0xGQVJST1dJICAgICAgICAzMjczNAogCisjZGVmaW5lIE9CTV9GT0xERVIgICAgICAgICAgMzI3MzMKKyNkZWZpbmUgT0JNX0ZPTERFUjIgICAgICAgICAzMjczMgorI2RlZmluZSBPQk1fRkxPUFBZICAgICAgICAgIDMyNzMxCisjZGVmaW5lIE9CTV9IRElTSyAgICAgICAgICAgMzI3MzAKKyNkZWZpbmUgT0JNX0NEUk9NICAgICAgICAgICAzMjcyOQorCiAjZGVmaW5lIE9CTV9PTERfQ0xPU0UgICAgICAgMzI3NjcKICNkZWZpbmUgT0JNX1NJWkUgICAgICAgICAgICAzMjc2NgogI2RlZmluZSBPQk1fT0xEX1VQQVJST1cgICAgIDMyNzY1CkBAIC0xMzQ2LDYgKzEzNTQsOSBAQAogI2RlZmluZSBPSUNfUVVFUyAgICAgICAgICAgIDMyNTE0CiAjZGVmaW5lIE9JQ19CQU5HICAgICAgICAgICAgMzI1MTUKICNkZWZpbmUgT0lDX05PVEUgICAgICAgICAgICAzMjUxNgorI2RlZmluZSBPSUNfUE9SVFJBSVQgICAgICAgIDMyNTE3CisjZGVmaW5lIE9JQ19MQU5EU0NBUEUgICAgICAgMzI1MTgKKyNkZWZpbmUgT0lDX1dJTkVJQ09OICAgICAgICAzMjUxOQogCiAgIC8qIFN0b2NrIEdESSBvYmplY3RzIGZvciBHZXRTdG9ja09iamVjdCgpICovCiAKQEAgLTIxMzEsNiArMjE0Miw4IEBACiAjZGVmaW5lIEdNRU1fRERFU0hBUkUgICAgICAgMHgyMDAwCiAjZGVmaW5lIEdNRU1fTk9USUZZICAgICAgICAgMHg0MDAwCiAjZGVmaW5lIEdNRU1fTE9XRVIgICAgICAgICAgR01FTV9OT1RfQkFOS0VECisjZGVmaW5lIEdNRU1fRElTQ0FSREVEICAgICAgMHg0MDAwCisjZGVmaW5lIEdNRU1fTE9DS0NPVU5UICAgICAgMHgwMGZmCiAKICNkZWZpbmUgR0hORCAgICAgICAgICAgICAgICAoR01FTV9NT1ZFQUJMRSB8IEdNRU1fWkVST0lOSVQpCiAjZGVmaW5lIEdQVFIgICAgICAgICAgICAgICAgKEdNRU1fRklYRUQgfCBHTUVNX1pFUk9JTklUKQpAQCAtMjMxMCwyMCArMjMyMywyMCBAQAogCiAKICNkZWZpbmUgRihyZXQsbmFtZSkgcmV0IG5hbWUodm9pZCk7Ci0jZGVmaW5lIEZhKHJldCxuYW1lLHQxLGExKSByZXQgbmFtZSh0MSBhMSk7Ci0jZGVmaW5lIEZiKHJldCxuYW1lLHQxLGExLHQyLGEyKSByZXQgbmFtZSh0MSBhMSx0MiBhMik7Ci0jZGVmaW5lIEZjKHJldCxuYW1lLHQxLGExLHQyLGEyLHQzLGEzKSByZXQgbmFtZSh0MSBhMSx0MiBhMix0MyBhMyk7Ci0jZGVmaW5lIEZkKHJldCxuYW1lLHQxLGExLHQyLGEyLHQzLGEzLHQ0LGE0KSByZXQgbmFtZSh0MSBhMSx0MiBhMix0MyBhMyx0NCBhNCk7Ci0jZGVmaW5lIEZlKHJldCxuYW1lLHQxLGExLHQyLGEyLHQzLGEzLHQ0LGE0LHQ1LGE1KSByZXQgbmFtZSggdDEgYTEsdDIgYTIsdDMgYTMsdDQgYTQsdDUgYTUpOwotI2RlZmluZSBGZihyZXQsbmFtZSx0MSxhMSx0MixhMix0MyxhMyx0NCxhNCx0NSxhNSx0NixhNikgcmV0IG5hbWUodDEgYTEsdDIgYTIsdDMgYTMsdDQgYTQsdDUgYTUsdDYgYTYpOwotI2RlZmluZSBGZyhyZXQsbmFtZSx0MSxhMSx0MixhMix0MyxhMyx0NCxhNCx0NSxhNSx0NixhNix0NyxhNykgcmV0IG5hbWUoIHQxIGExLHQyIGEyLHQzIGEzLHQ0IGE0LHQ1IGE1LHQ2IGE2LHQ3IGE3KTsKLSNkZWZpbmUgRmgocmV0LG5hbWUsdDEsYTEsdDIsYTIsdDMsYTMsdDQsYTQsdDUsYTUsdDYsYTYsdDcsYTcsdDgsYTgpIHJldCBuYW1lKHQxIGExLHQyIGEyLHQzIGEzLHQ0IGE0LHQ1IGE1LHQ2IGE2LHQ3IGE3LHQ4IGE4KTsKLSNkZWZpbmUgRmkocmV0LG5hbWUsdDEsYTEsdDIsYTIsdDMsYTMsdDQsYTQsdDUsYTUsdDYsYTYsdDcsYTcsdDgsYTgsdDksYTkpIHJldCBuYW1lKHQxIGExLHQyIGEyLHQzIGEzLHQ0IGE0LHQ1IGE1LHQ2IGE2LHQ3IGE3LHQ4IGE4LHQ5IGE5KTsKLSNkZWZpbmUgRmoocmV0LG5hbWUsdDEsYTEsdDIsYTIsdDMsYTMsdDQsYTQsdDUsYTUsdDYsYTYsdDcsYTcsdDgsYTgsdDksYTksdDEwLGExMCkgcmV0IG5hbWUodDEgYTEsdDIgYTIsdDMgYTMsdDQgYTQsdDUgYTUsdDYgYTYsdDcgYTcsdDggYTgsdDkgYTksdDEwIGExMCk7Ci0jZGVmaW5lIEZrKHJldCxuYW1lLHQxLGExLHQyLGEyLHQzLGEzLHQ0LGE0LHQ1LGE1LHQ2LGE2LHQ3LGE3LHQ4LGE4LHQ5LGE5LHQxMCxhMTAsdDExLGExMSkgcmV0IG5hbWUgKHQxIGExLHQyIGEyLHQzIGEzLHQ0IGE0LHQ1IGE1LHQ2IGE2LHQ3IGE3LHQ4IGE4LHQ5IGE5LHQxMCBhMTAsdDExIGExMSk7Ci0jZGVmaW5lIEZsKHJldCxuYW1lLHQxLGExLHQyLGEyLHQzLGEzLHQ0LGE0LHQ1LGE1LHQ2LGE2LHQ3LGE3LHQ4LGE4LHQ5LGE5LHQxMCxhMTAsdDExLGExMSx0MTIsYTEyKSByZXQgbmFtZSh0MSBhMSx0MiBhMix0MyBhMyx0NCBhNCx0NSBhNSx0NiBhNix0NyBhNyx0OCBhOCx0OSBhOSx0MTAgYTEwLHQxMSBhMTEsdDEyIGExMik7Ci0jZGVmaW5lIEZtKHJldCxuYW1lLHQxLGExLHQyLGEyLHQzLGEzLHQ0LGE0LHQ1LGE1LHQ2LGE2LHQ3LGE3LHQ4LGE4LHQ5LGE5LHQxMCxhMTAsdDExLGExMSx0MTIsYTEyLHQxMyxhMTMpIHJldCBuYW1lKHQxIGExLHQyIGEyLHQzIGEzLHQ0IGE0LHQ1IGE1LHQ2IGE2LHQ3IGE3LHQ4IGE4LHQ5IGE5LHQxMCBhMTAsdDExIGExMSx0MTIgYTEyLHQxMyBhMTMpOwotI2RlZmluZSBGbihyZXQsbmFtZSx0MSxhMSx0MixhMix0MyxhMyx0NCxhNCx0NSxhNSx0NixhNix0NyxhNyx0OCxhOCx0OSxhOSx0MTAsYTEwLHQxMSxhMTEsdDEyLGExMix0MTMsYTEzLHQxNCxhMTQpIHJldCBuYW1lKHQxIGExLHQyIGEyLHQzIGEzLHQ0IGE0LHQ1IGE1LHQ2IGE2LHQ3IGE3LHQ4IGE4LHQ5IGE5LHQxMCBhMTAsdDExIGExMSx0MTIgYTEyLHQxMyBhMTMsdDE0IGExNCk7CisjZGVmaW5lIEZhKHJldCxuYW1lLHQxLGExKSByZXQgbmFtZSh0MSk7CisjZGVmaW5lIEZiKHJldCxuYW1lLHQxLGExLHQyLGEyKSByZXQgbmFtZSh0MSx0Mik7CisjZGVmaW5lIEZjKHJldCxuYW1lLHQxLGExLHQyLGEyLHQzLGEzKSByZXQgbmFtZSh0MSx0Mix0Myk7CisjZGVmaW5lIEZkKHJldCxuYW1lLHQxLGExLHQyLGEyLHQzLGEzLHQ0LGE0KSByZXQgbmFtZSh0MSx0Mix0Myx0NCk7CisjZGVmaW5lIEZlKHJldCxuYW1lLHQxLGExLHQyLGEyLHQzLGEzLHQ0LGE0LHQ1LGE1KSByZXQgbmFtZSh0MSx0Mix0Myx0NCx0NSk7CisjZGVmaW5lIEZmKHJldCxuYW1lLHQxLGExLHQyLGEyLHQzLGEzLHQ0LGE0LHQ1LGE1LHQ2LGE2KSByZXQgbmFtZSh0MSx0Mix0Myx0NCx0NSx0Nik7CisjZGVmaW5lIEZnKHJldCxuYW1lLHQxLGExLHQyLGEyLHQzLGEzLHQ0LGE0LHQ1LGE1LHQ2LGE2LHQ3LGE3KSByZXQgbmFtZSh0MSx0Mix0Myx0NCx0NSx0Nix0Nyk7CisjZGVmaW5lIEZoKHJldCxuYW1lLHQxLGExLHQyLGEyLHQzLGEzLHQ0LGE0LHQ1LGE1LHQ2LGE2LHQ3LGE3LHQ4LGE4KSByZXQgbmFtZSh0MSx0Mix0Myx0NCx0NSx0Nix0Nyx0OCk7CisjZGVmaW5lIEZpKHJldCxuYW1lLHQxLGExLHQyLGEyLHQzLGEzLHQ0LGE0LHQ1LGE1LHQ2LGE2LHQ3LGE3LHQ4LGE4LHQ5LGE5KSByZXQgbmFtZSh0MSx0Mix0Myx0NCx0NSx0Nix0Nyx0OCx0OSk7CisjZGVmaW5lIEZqKHJldCxuYW1lLHQxLGExLHQyLGEyLHQzLGEzLHQ0LGE0LHQ1LGE1LHQ2LGE2LHQ3LGE3LHQ4LGE4LHQ5LGE5LHQxMCxhMTApIHJldCBuYW1lKHQxLHQyLHQzLHQ0LHQ1LHQ2LHQ3LHQ4LHQ5LHQxMCk7CisjZGVmaW5lIEZrKHJldCxuYW1lLHQxLGExLHQyLGEyLHQzLGEzLHQ0LGE0LHQ1LGE1LHQ2LGE2LHQ3LGE3LHQ4LGE4LHQ5LGE5LHQxMCxhMTAsdDExLGExMSkgcmV0IG5hbWUodDEsdDIsdDMsdDQsdDUsdDYsdDcsdDgsdDksdDEwLHQxMSk7CisjZGVmaW5lIEZsKHJldCxuYW1lLHQxLGExLHQyLGEyLHQzLGEzLHQ0LGE0LHQ1LGE1LHQ2LGE2LHQ3LGE3LHQ4LGE4LHQ5LGE5LHQxMCxhMTAsdDExLGExMSx0MTIsYTEyKSByZXQgbmFtZSh0MSx0Mix0Myx0NCx0NSx0Nix0Nyx0OCx0OSx0MTAsdDExLHQxMik7CisjZGVmaW5lIEZtKHJldCxuYW1lLHQxLGExLHQyLGEyLHQzLGEzLHQ0LGE0LHQ1LGE1LHQ2LGE2LHQ3LGE3LHQ4LGE4LHQ5LGE5LHQxMCxhMTAsdDExLGExMSx0MTIsYTEyLHQxMyxhMTMpIHJldCBuYW1lKHQxLHQyLHQzLHQ0LHQ1LHQ2LHQ3LHQ4LHQ5LHQxMCx0MTEsdDEyLHQxMyk7CisjZGVmaW5lIEZuKHJldCxuYW1lLHQxLGExLHQyLGEyLHQzLGEzLHQ0LGE0LHQ1LGE1LHQ2LGE2LHQ3LGE3LHQ4LGE4LHQ5LGE5LHQxMCxhMTAsdDExLGExMSx0MTIsYTEyLHQxMyxhMTMsdDE0LGExNCkgcmV0IG5hbWUodDEsdDIsdDMsdDQsdDUsdDYsdDcsdDgsdDksdDEwLHQxMSx0MTIsdDEzLHQxNCk7CiAKIGludCB3c3ByaW50ZihMUFNUUiBhLExQU1RSIGIsLi4uKTsKIApAQCAtMjQ1OSw3ICsyNDcyLDcgQEAKIEZhKEhBTkRMRSxHZXRNb2R1bGVIYW5kbGUsTFBDU1RSLGEpCiBGYShIQU5ETEUsR2V0U3RvY2tPYmplY3QsaW50LGEpCiBGYShIQU5ETEUsR2V0V2luZG93VGFzayxIV05ELGEpCi1GYShIQU5ETEUsTG9hZExpYnJhcnksTFBTVFIsYSkKK0ZhKEhBTkRMRSxMb2FkTGlicmFyeSxMUENTVFIsYSkKIEZhKEhBTkRMRSxMb2NhbEZyZWUsSEFORExFLGEpCiBGYShIQU5ETEUsTG9jYWxIYW5kbGUsV09SRCxhKQogRmEoSEFORExFLFNldE1ldGFGaWxlQml0cyxIQU5ETEUsYSkKQEAgLTI1MjgsNiArMjU0MSw3IEBACiBGYShXT1JELEdldFJPUDIsSERDLGEpCiBGYShXT1JELEdldFJlbEFicyxIREMsYSkKIEZhKFdPUkQsR2V0U3RyZXRjaEJsdE1vZGUsSERDLGEpCitGYShXT1JELEdldFN5c3RlbVBhbGV0dGVVc2UsSERDLGEpCiBGYShXT1JELEdldFRleHRBbGlnbixIREMsYSkKIEZhKFdPUkQsR2xvYmFsRE9TRnJlZSxXT1JELGEpCiBGYShXT1JELEdsb2JhbEZsYWdzLEhHTE9CQUwsYSkKQEAgLTI2NDQsNyArMjY1OCw3IEBACiBGYihIQU5ETEUsQ29weU1ldGFGaWxlLEhBTkRMRSxhLExQU1RSLGIpCiBGYihIQU5ETEUsR2V0UHJvcCxIV05ELGEsU0VHUFRSLGIpCiBGYihIQU5ETEUsTG9hZEFjY2VsZXJhdG9ycyxIQU5ETEUsYSxTRUdQVFIsYikKLUZiKEhBTkRMRSxMb2FkTW9kdWxlLExQU1RSLGEsTFBWT0lELGIpCitGYihIQU5ETEUsTG9hZE1vZHVsZSxMUENTVFIsYSxMUFZPSUQsYikKIEZiKEhBTkRMRSxMb2FkUmVzb3VyY2UsSEFORExFLGEsSEFORExFLGIpCiBGYihIQU5ETEUsTG9jYWxBbGxvYyxXT1JELGEsV09SRCxiKQogRmIoSEFORExFLFJlbW92ZVByb3AsSFdORCxhLFNFR1BUUixiKQpAQCAtMjY4OSw3ICsyNzAzLDYgQEAKIEZiKFdPUkQsR2V0TWVudUl0ZW1JRCxITUVOVSxhLGludCxiKQogRmIoV09SRCxHZXROZWFyZXN0UGFsZXR0ZUluZGV4LEhQQUxFVFRFLGEsRFdPUkQsYikKIEZiKFdPUkQsR2V0U3lzdGVtRGlyZWN0b3J5LExQU1RSLGEsV09SRCxiKQotRmIoV09SRCxHZXRTeXN0ZW1QYWxldHRlVXNlLEhEQyxhLFdPUkQsYikKIEZiKFdPUkQsR2V0V2luZG93V29yZCxIV05ELGEsc2hvcnQsYikKIEZiKFdPUkQsR2V0V2luZG93c0RpcmVjdG9yeSxMUFNUUixhLFdPUkQsYikKIEZiKFdPUkQsSXNEbGdCdXR0b25DaGVja2VkLEhXTkQsYSxXT1JELGIpCkBAIC0yODAzLDYgKzI4MTYsOCBAQAogRmMoSU5ULE9wZW5GaWxlLExQU1RSLGEsTFBPRlNUUlVDVCxiLFdPUkQsYykKIEZjKElOVCxfbHJlYWQsSU5ULGEsTFBTVFIsYixXT1JELGMpCiBGYyhJTlQsX2x3cml0ZSxJTlQsYSxMUFNUUixiLFdPUkQsYykKK0ZjKExPTkcsX2hyZWFkLElOVCxhLExQU1RSLGIsTE9ORyxjKQorRmMoTE9ORyxfaHdyaXRlLElOVCxhLExQU1RSLGIsTE9ORyxjKQogRmMoTE9ORyxHZXRCaXRtYXBCaXRzLEhCSVRNQVAsYSxMT05HLGIsTFBTVFIsYykKIEZjKExPTkcsU2V0Qml0bWFwQml0cyxIQklUTUFQLGEsTE9ORyxiLExQU1RSLGMpCiBGYyhMT05HLFNldENsYXNzTG9uZyxIV05ELGEsc2hvcnQsYixMT05HLGMpCkBAIC0yOTgwLDcgKzI5OTUsNyBAQAogRmkoQk9PTCxHcmF5U3RyaW5nLEhEQyxhLEhCUlVTSCxiLEZBUlBST0MsZ3NwcmMsTFBBUkFNLGxQYXJhbSxJTlQsY2NoLElOVCx4LElOVCx5LElOVCxjeCxJTlQsY3kpCiBGaShCT09MLFBpZSxIREMsYSxpbnQseExlZnQsaW50LHlUb3AsaW50LHhSaWdodCxpbnQseUJvdHRvbSxpbnQseFN0YXJ0LGludCx5U3RhcnQsaW50LHhFbmQsaW50LHlFbmQpCiBGayhCT09MLFN0cmV0Y2hCbHQsSERDLGEsc2hvcnQsYixzaG9ydCxjLHNob3J0LGQsc2hvcnQsZSxIREMsZixzaG9ydCxnLHNob3J0LGgsc2hvcnQsaSxzaG9ydCxqLERXT1JELGspCi1GayhIV05ELENyZWF0ZVdpbmRvdyxMUFNUUixzekFwcE5hbWUsTFBTVFIsTGFiZWwsRFdPUkQsb2wsc2hvcnQseCxzaG9ydCx5LHNob3J0LHcsc2hvcnQsaCxIV05ELGQsSE1FTlUsZSwsSEFORExFIGksU0VHUFRSLGcpCitGayhIV05ELENyZWF0ZVdpbmRvdyxMUFNUUixhLExQU1RSLGIsRFdPUkQsYyxzaG9ydCxkLHNob3J0LGUsc2hvcnQsZixzaG9ydCxnLEhXTkQsaCxITUVOVSxpLEhBTkRMRSxqLFNFR1BUUixrKQogRmwoSFdORCxDcmVhdGVXaW5kb3dFeCxEV09SRCxhLExQU1RSLGIsTFBTVFIsYyxEV09SRCxkLHNob3J0LGUsc2hvcnQsZixzaG9ydCxnLHNob3J0LGgsSFdORCxpLEhNRU5VLGosSEFORExFLGssU0VHUFRSLGwpCiBGbChpbnQsU2V0RElCaXRzVG9EZXZpY2UsSERDLGEsc2hvcnQsYixzaG9ydCxjLFdPUkQsZCxXT1JELGUsV09SRCxmLFdPUkQsZyxXT1JELGgsV09SRCxpLExQU1RSLGosTFBCSVRNQVBJTkZPLGssV09SRCxsKQogRm0oaW50LFN0cmV0Y2hESUJpdHMsSERDLGEsV09SRCxiLFdPUkQsYyxXT1JELGQsV09SRCxlLFdPUkQsZixXT1JELGcsV09SRCxoLFdPUkQsaSxMUFNUUixqLExQQklUTUFQSU5GTyxrLFdPUkQsbCxEV09SRCxtKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS93aW5lLmggYi9pbmNsdWRlL3dpbmUuaAppbmRleCAxMDFmNTBlLi41ZGVlOThhIDEwMDY0NAotLS0gYS9pbmNsdWRlL3dpbmUuaAorKysgYi9pbmNsdWRlL3dpbmUuaApAQCAtMzYsNyArMzYsMTUgQEAKICNkZWZpbmUgV0lORV9DT0RFX1NFTEVDVE9SIDB4MjMKICNlbmRpZiAgLyogbGludXggKi8KIAotI2lmIGRlZmluZWQoX19OZXRCU0RfXykgfHwgZGVmaW5lZChfX0ZyZWVCU0RfXykKKyNpZmRlZiBfX05ldEJTRF9fCisjaW5jbHVkZSA8c2lnbmFsLmg+CisjZGVmaW5lIHNpZ2NvbnRleHRfc3RydWN0IHNpZ2NvbnRleHQKKyNkZWZpbmUgSFogMTAwCisjZGVmaW5lIFdJTkVfREFUQV9TRUxFQ1RPUiAweDFmCisjZGVmaW5lIFdJTkVfQ09ERV9TRUxFQ1RPUiAweDE3CisjZW5kaWYKKworI2lmZGVmIF9fRnJlZUJTRF9fCiAjaW5jbHVkZSA8c2lnbmFsLmg+CiAjZGVmaW5lIHNpZ2NvbnRleHRfc3RydWN0IHNpZ2NvbnRleHQKICNkZWZpbmUgSFogMTAwCmRpZmYgLS1naXQgYS9pbmNsdWRlL3dpbmVycm9yLmggYi9pbmNsdWRlL3dpbmVycm9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTFjMWRiZgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvd2luZXJyb3IuaApAQCAtMCwwICsxLDIgQEAKK2V4dGVybiBpbnQgV0lOMzJfTGFzdEVycm9yOworI2RlZmluZQlFUlJPUl9DQUxMX05PVF9JTVBMRU1FTlRFRAkxMjAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvd2ludHlwZXMuaCBiL2luY2x1ZGUvd2ludHlwZXMuaAppbmRleCBhZGUzZDU3Li5lNjNmOTdhIDEwMDY0NAotLS0gYS9pbmNsdWRlL3dpbnR5cGVzLmgKKysrIGIvaW5jbHVkZS93aW50eXBlcy5oCkBAIC0yNSw4ICsyNSwxMCBAQAogdHlwZWRlZiB2b2lkICpMUFZPSUQ7CiAjaWZkZWYgV0lORUxJQgogdHlwZWRlZiBsb25nICgqRkFSUFJPQykoKTsKK3R5cGVkZWYgTE9ORyAoKldORFBST0MpKFdPUkQsV09SRCxXT1JELExPTkcpOwogI2Vsc2UKIHR5cGVkZWYgU0VHUFRSIEZBUlBST0M7Cit0eXBlZGVmIFNFR1BUUiBXTkRQUk9DOwogI2VuZGlmCiB0eXBlZGVmIEZBUlBST0MgRExHUFJPQzsKIHR5cGVkZWYgaW50IENBVENIQlVGWzldOwpAQCAtNjksOSArNzEsOCBAQAogI2RlZmluZSBXSU5BUEkgICAgICAgICAgICAgIFBBU0NBTAogI2RlZmluZSBDQUxMQkFDSyAgICAgICAgICAgIFBBU0NBTAogCi0jaWZuZGVmIE5VTEwKLSNkZWZpbmUgTlVMTCAoMCkKLSNlbmRpZgorI3VuZGVmIE5VTEwKKyNkZWZpbmUgTlVMTCAwCiAKICNpZmRlZiBXSU5FTElCCiAjZGVmaW5lIFdJTkVfUEFDS0VECkBAIC04NSw2ICs4Niw5IEBACiAjZGVmaW5lIExPV09SRChsKSAgICAgICAgICAgKChXT1JEKShEV09SRCkobCkpCiAjZGVmaW5lIEhJV09SRChsKSAgICAgICAgICAgKChXT1JEKSgoRFdPUkQpKGwpID4+IDE2KSkKIAorI2RlZmluZSBTTE9XT1JEKGwpICAgICAgICAgICAoKElOVCkoTE9ORykobCkpCisjZGVmaW5lIFNISVdPUkQobCkgICAgICAgICAgICgoSU5UKSgoTE9ORykobCkgPj4gMTYpKQorCiAjZGVmaW5lIE1BS0VMT05HKGxvdywgaGlnaCkgKChMT05HKSgoKFdPUkQpKGxvdykpIHwgXAogCQkJCSAgICAoKChEV09SRCkoKFdPUkQpKGhpZ2gpKSkgPDwgMTYpKSkKIApkaWZmIC0tZ2l0IGEvbG9hZGVyL0ltYWtlZmlsZSBiL2xvYWRlci9JbWFrZWZpbGUKaW5kZXggYjM4NjNhNi4uOWMxNWMyOCAxMDA2NDQKLS0tIGEvbG9hZGVyL0ltYWtlZmlsZQorKysgYi9sb2FkZXIvSW1ha2VmaWxlCkBAIC0xMyw3ICsxMyw2IEBACiAJcGVfcmVzb3VyY2UuYyBcCiAJc2VsZWN0b3IuYyBcCiAJc2lnbmFsLmMgXAotCWxpYnJhcnkuYyBcCiAJcmVzb3VyY2UuYyBcCiAJdGFzay5jIAogCmRpZmYgLS1naXQgYS9sb2FkZXIvbGR0LmMgYi9sb2FkZXIvbGR0LmMKaW5kZXggMzY1NGYyZS4uNzNlMTI2MCAxMDA2NDQKLS0tIGEvbG9hZGVyL2xkdC5jCisrKyBiL2xvYWRlci9sZHQuYwpAQCAtMTgwLDEyICsxODAsMTcgQEAKICAgICB9CiAjZWxzZSAgLyogV0lORUxJQiAqLwogCi0jaWZkZWYgbGludXgKICAgICBsb25nIGJ1ZmZlclsyKkxEVF9TSVpFXTsKICAgICBsZHRfZW50cnkgY29udGVudDsKKyAgICBpbnQgbjsKIAotICAgIG1vZGlmeV9sZHQoIDAsIGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlcikgKTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgTERUX1NJWkU7IGkrKykKKyNpZmRlZiBsaW51eAorICAgIG4gPSBtb2RpZnlfbGR0KCAwLCBidWZmZXIsIHNpemVvZihidWZmZXIpICkgLyA4OworI2VuZGlmICAvKiBsaW51eCAqLworI2lmIGRlZmluZWQoX19OZXRCU0RfXykgfHwgZGVmaW5lZChfX0ZyZWVCU0RfXykKKyAgICBuID0gaTM4Nl9nZXRfbGR0KCAwLCAodW5pb24gZGVzY3JpcHRvciAqKWJ1ZmZlciwgTERUX1NJWkUgKTsKKyNlbmRpZiAgLyogX19OZXRCU0RfXyB8fCBfX0ZyZWVCU0RfXyAqLworICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspCiAgICAgewogICAgICAgICBMRFRfQnl0ZXNUb0VudHJ5KCAmYnVmZmVyWzIqaV0sICZjb250ZW50ICk7CiAgICAgICAgIGlmIChjb250ZW50LmJhc2UgfHwgY29udGVudC5saW1pdCkKQEAgLTE5NywyNSArMjAyLDUgQEAKICAgICAgICAgICAgICAgICAgICAgY29udGVudC50eXBlICk7CiAgICAgICAgIH0KICAgICB9Ci0jZW5kaWYgIC8qIGxpbnV4ICovCi0KLSNpZiBkZWZpbmVkKF9fTmV0QlNEX18pIHx8IGRlZmluZWQoX19GcmVlQlNEX18pCi0gICAgbG9uZyBidWZmZXJbMipMRFRfU0laRV07Ci0gICAgbGR0X2VudHJ5IGNvbnRlbnQ7Ci0KLSAgICBpMzg2X2dldF9sZHQoIDAsICh1bmlvbiBkZXNjcmlwdG9yICopYnVmZmVyLCBMRFRfU0laRSApOwotICAgIGZvciAoaSA9IDA7IGkgPCBMRFRfU0laRTsgaSsrKQotICAgIHsKLSAgICAgICAgTERUX0J5dGVzVG9FbnRyeSggYnVmZmVyWzIqaV0sICZjb250ZW50ICk7Ci0gICAgICAgIGlmIChjb250ZW50LmJhc2UgfHwgY29udGVudC5saW1pdCkKLSAgICAgICAgewotICAgICAgICAgICAgZnByaW50Ziggc3RkZXJyLCAiJTA0eDogc2VsPSUwNHggYmFzZT0lMDhseCBsaW1pdD0lMDVseCAlcyB0eXBlPSVkXG4iLAotICAgICAgICAgICAgICAgICAgICBpLCBFTlRSWV9UT19TRUxFQ1RPUihpKSwKLSAgICAgICAgICAgICAgICAgICAgY29udGVudC5iYXNlLCBjb250ZW50LmxpbWl0LAotICAgICAgICAgICAgICAgICAgICBjb250ZW50LmxpbWl0X2luX3BhZ2VzID8gIihwYWdlcykiIDogIihieXRlcykiLAotICAgICAgICAgICAgICAgICAgICBjb250ZW50LnR5cGUgKTsKLSAgICAgICAgfQotICAgIH0KLSNlbmRpZiAgLyogX19OZXRCU0RfXyB8fCBfX0ZyZWVCU0RfXyAqLwogI2VuZGlmICAvKiBXSU5FTElCICovCiB9CmRpZmYgLS1naXQgYS9sb2FkZXIvbGlicmFyeS5jIGIvbG9hZGVyL2xpYnJhcnkuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTMwM2JiYi4uMDAwMDAwMAotLS0gYS9sb2FkZXIvbGlicmFyeS5jCisrKyAvZGV2L251bGwKQEAgLTEsMzUxICswLDAgQEAKLS8qCi0gKiAgICAgICAgTW9kdWxlICYgTGlicmFyeSBmdW5jdGlvbnMKLXN0YXRpYyBjaGFyIENvcHlyaWdodFtdID0gIkNvcHlyaWdodCAxOTkzLCAxOTk0IE1hcnRpbiBBeW90dGUsIFJvYmVydCBKLiBBbXN0YWR0LCBFcmlrIEJvcyI7Ci0qLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotI2luY2x1ZGUgPGZjbnRsLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jaW5jbHVkZSAibmVleGUuaCIKLSNpbmNsdWRlICJkbGxzLmgiCi0jaW5jbHVkZSAiaWYxNjMyLmgiCi0jaW5jbHVkZSAid2luZW9wdHMuaCIKLSNpbmNsdWRlICJhcmNoLmgiCi0jaW5jbHVkZSAib3B0aW9ucy5oIgotI2luY2x1ZGUgImRvc19mcy5oIgotI2luY2x1ZGUgIndpbmRvd3MuaCIKLSNpbmNsdWRlICJ0YXNrLmgiCi0jaW5jbHVkZSAidG9vbGhlbHAuaCIKLSNpbmNsdWRlICJzZWxlY3RvcnMuaCIKLSNpbmNsdWRlICJwcm90b3R5cGVzLmgiCi0jaW5jbHVkZSAibGlicmFyeS5oIgotI2luY2x1ZGUgIm5lX2ltYWdlLmgiCi0jaW5jbHVkZSAicGVfaW1hZ2UuaCIKLSNpbmNsdWRlICJtb2R1bGUuaCIKLSNpbmNsdWRlICJzdGRkZWJ1Zy5oIgotI2luY2x1ZGUgImRlYnVnLmgiCi0KLXN0cnVjdCB3X2ZpbGVzICp3aW5lX2ZpbGVzID0gTlVMTDsKLXN0YXRpYyBjaGFyICpETExfRXh0ZW5zaW9uc1tdID0geyAiZGxsIiwgTlVMTCB9Owotc3RhdGljIGNoYXIgKkVYRV9FeHRlbnNpb25zW10gPSB7ICJleGUiLCBOVUxMIH07Ci0KLSNkZWZpbmUgSVNfQlVJTFRJTl9ETEwoaGFuZGxlKSAoKGhhbmRsZSA+PiA4KSA9PSAweGZmKSAKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXZvaWQgRXh0cmFjdERMTE5hbWUoY2hhciAqbGlibmFtZSwgY2hhciAqdGVtcCkKLXsKLSAgICBpbnQgaTsKLSAgICAKLSAgICBzdHJjcHkodGVtcCwgbGlibmFtZSk7Ci0gICAgaWYgKHN0cmNocih0ZW1wLCAnXFwnKSB8fCBzdHJjaHIodGVtcCwgJy8nKSkKLQlmb3IgKGkgPSBzdHJsZW4odGVtcCkgLSAxOyBpIDsgaS0tKSAKLQkJaWYgKHRlbXBbaV0gPT0gJ1xcJyB8fCB0ZW1wW2ldID09ICcvJykgewotCQkJc3RyY3B5KHRlbXAsIHRlbXAgKyBpICsgMSk7Ci0JCQlicmVhazsKLQkJfQotICAgIGZvciAoaSA9IHN0cmxlbih0ZW1wKSAtIDE7IGkgOyBpLS0pIAotCWlmICh0ZW1wW2ldID09ICcuJykgewotCQl0ZW1wW2ldID0gMDsKLQkJYnJlYWs7Ci0JfQotfQotCi1zdHJ1Y3Qgd19maWxlcyAqR2V0RmlsZUluZm8odW5zaWduZWQgc2hvcnQgaW5zdGFuY2UpCi17Ci0gICAgcmVnaXN0ZXIgc3RydWN0IHdfZmlsZXMgKncgPSB3aW5lX2ZpbGVzOwotCi0gICAgd2hpbGUgKHcgJiYgdy0+aGluc3RhbmNlICE9IGluc3RhbmNlKQotCXcgPSB3LT5uZXh0OwotICAgIAotICAgIHJldHVybiB3OwotfQotLyoKLWludCBJc0RMTExvYWRlZChjaGFyICpuYW1lKQotewotCXN0cnVjdCB3X2ZpbGVzICp3cG50OwotCi0JaWYoRmluZERMTFRhYmxlKG5hbWUpKQotCQlyZXR1cm4gMTsKLQotCWZvcih3cG50ID0gd2luZV9maWxlczsgd3BudDsgd3BudCA9IHdwbnQtPm5leHQpCi0JCWlmKHN0cmNtcCh3cG50LT5uYW1lLCBuYW1lKSA9PSAwICkKLQkJCXJldHVybiAxOwotCi0JcmV0dXJuIDA7Ci19Ci0qLwotdm9pZCBJbml0RExMKHN0cnVjdCB3X2ZpbGVzICp3cG50KQotewotCWlmICh3cG50LT5uZSkgCi0JCU5FX0luaXRETEwod3BudC0+aE1vZHVsZSk7Ci0JZWxzZQotCQlQRV9Jbml0RExMKHdwbnQpOwotfQotCi12b2lkIEluaXRpYWxpemVMb2FkZWRETExzKHN0cnVjdCB3X2ZpbGVzICp3cG50KQotewotICAgIHN0YXRpYyBmbGFnUmVhZHlUb1J1biA9IDA7Ci0gICAgc3RydWN0IHdfZmlsZXMgKmZpbmFsX3dwbnQ7Ci0KLSAgICBkcHJpbnRmX21vZHVsZShzdGRkZWIsIkluaXRpYWxpemVMb2FkZWRETExzKCVwKVxuIiwgd3BudCk7Ci0KLSAgICBpZiAod3BudCA9PSBOVUxMKQotICAgIHsKLQlmbGFnUmVhZHlUb1J1biA9IDE7Ci0JZHByaW50Zl9tb2R1bGUoc3RkZGViLCJJbml0aWFsaXppbmcgRExMc1xuIik7Ci0gICAgfQotICAgIAotICAgIGlmICghZmxhZ1JlYWR5VG9SdW4pCi0JcmV0dXJuOwotCi0jaWYgMQotICAgIGlmICh3cG50ICE9IE5VTEwpCi0JZHByaW50Zl9tb2R1bGUoc3RkZGViLCJJbml0aWFsaXppbmcgJXNcbiIsIHdwbnQtPm5hbWUpOwotI2VuZGlmCi0KLSAgICAvKgotICAgICAqIEluaXRpYWxpemUgbGlicmFyaWVzCi0gICAgICovCi0gICAgaWYgKCF3cG50KQotICAgIHsKLQl3cG50ID0gd2luZV9maWxlczsKLQlmaW5hbF93cG50ID0gTlVMTDsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLQlmaW5hbF93cG50ID0gd3BudC0+bmV4dDsKLSAgICB9Ci0gICAgCi0gICAgZm9yKCA7IHdwbnQgIT0gZmluYWxfd3BudDsgd3BudCA9IHdwbnQtPm5leHQpCi0JSW5pdERMTCh3cG50KTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCQkJTG9hZEltYWdlCi0gKiBMb2FkIG9uZSBleGVjdXRhYmxlIGludG8gbWVtb3J5Ci0gKi8KLUhJTlNUQU5DRSBMb2FkSW1hZ2UoY2hhciAqbW9kdWxlLCBpbnQgZmlsZXR5cGUsIGludCBjaGFuZ2VfZGlyKQotewotICAgIEhJTlNUQU5DRSBoYW5kbGU7Ci0gICAgc3RydWN0IHdfZmlsZXMgKndwbnQsICp3cG50MTsKLSAgICBjaGFyIGJ1ZmZlclsyNTZdLCBoZWFkZXJbMl0sIG1vZHVsZW5hbWVbNjRdLCAqZnVsbG5hbWU7Ci0KLSAgICBFeHRyYWN0RExMTmFtZShtb2R1bGUsIG1vZHVsZW5hbWUpOwotICAgIGRwcmludGZfbW9kdWxlKHN0ZGRlYiwiTG9hZEltYWdlIFslc11cbiIsIG1vZHVsZSk7Ci0gICAgLyogYnVpbHQtaW4gb25lID8gKi8KLSAgICBpZiAoRmluZERMTFRhYmxlKG1vZHVsZW5hbWUpKSB7Ci0JcmV0dXJuIEdldE1vZHVsZUhhbmRsZShtb2R1bGVuYW1lKTsKLSAgICB9Ci0gICAgCi0gICAgLyogYWxyZWFkeSBsb2FkZWQgPyAqLwotICAgIGZvciAod3BudCA9IHdpbmVfZmlsZXMgOyB3cG50IDsgd3BudCA9IHdwbnQtPm5leHQpICB7Ci0gICAgICBpZiAoc3RyY2FzZWNtcCh3cG50LT5uYW1lLCBtb2R1bGVuYW1lKSA9PSAwICYmIGZpbGV0eXBlID09IHdwbnQtPnR5cGUpIHsKLQlyZXR1cm4gd3BudC0+aGluc3RhbmNlOwotICAgICAgfQotICAgIH0KLQotICAgIC8qCi0gICAgICogc2VhcmNoIGZpbGUKLSAgICAgKi8KLSAgICBmdWxsbmFtZSA9IERPU19GaW5kRmlsZShidWZmZXIsIHNpemVvZihidWZmZXIpLCBtb2R1bGUsIAotCQkJKGZpbGV0eXBlID09IEVYRSA/IEVYRV9FeHRlbnNpb25zIDogRExMX0V4dGVuc2lvbnMpLCAKLQkJCVdpbmRvd3NQYXRoKTsKLSAgICBpZiAoZnVsbG5hbWUgPT0gTlVMTCkKLSAgICB7Ci0gICAgCWZwcmludGYoc3RkZXJyLCAiTG9hZEltYWdlOiBJIGNhbid0IGZpbmQgJXMuZGxsIHwgJXMuZXhlICFcbiIsCi0JCW1vZHVsZSwgbW9kdWxlKTsKLQlyZXR1cm4gMjsKLSAgICB9Ci0KLSAgICBmdWxsbmFtZSA9IERPU19HZXREb3NGaWxlTmFtZShmdWxsbmFtZSk7Ci0gICAgCi0gICAgZHByaW50Zl9tb2R1bGUoc3RkZGViLCJMb2FkSW1hZ2U6IGxvYWRpbmcgJXMgKCVzKVxuICAgICAgICAgICBbJXNdXG4iLCAKLQkgICAgbW9kdWxlLCBidWZmZXIsIGZ1bGxuYW1lKTsKLQotICAgIGlmIChjaGFuZ2VfZGlyICYmIGZ1bGxuYW1lKQotICAgIHsKLQljaGFyIGRpcm5hbWVbMjU2XTsKLQljaGFyICpwOwotCi0Jc3RyY3B5KGRpcm5hbWUsIGZ1bGxuYW1lKTsKLQlwID0gc3RycmNocihkaXJuYW1lLCAnXFwnKTsKLQkqcCA9ICdcMCc7Ci0KLQlET1NfU2V0RGVmYXVsdERyaXZlKGRpcm5hbWVbMF0gLSAnQScpOwotCURPU19DaGFuZ2VEaXIoZGlybmFtZVswXSAtICdBJywgZGlybmFtZSArIDIpOwotICAgIH0KLQotICAgIC8qIEZpcnN0IGFsbG9jYXRlIGEgc3BvdCB0byBzdG9yZSB0aGUgaW5mbyB3ZSBjb2xsZWN0LCBhbmQgYWRkIGl0IHRvCi0gICAgICogb3VyIGxpbmtlZCBsaXN0IGlmIHdlIGNvdWxkIGxvYWQgdGhlIGZpbGUuCi0gICAgICovCi0KLSAgICB3cG50ID0gKHN0cnVjdCB3X2ZpbGVzICopIG1hbGxvYyhzaXplb2Yoc3RydWN0IHdfZmlsZXMpKTsKLQotICAgIC8qCi0gICAgICogT3BlbiBmaWxlIGZvciByZWFkaW5nLgotICAgICAqLwotICAgIHdwbnQtPmZkID0gb3BlbihidWZmZXIsIE9fUkRPTkxZKTsKLSAgICBpZiAod3BudC0+ZmQgPCAwKQotCXJldHVybiAyOwotCi0gICAgLyogCi0gICAgICogRXN0YWJsaXNoIGhlYWRlciBwb2ludGVycy4KLSAgICAgKi8KLSAgICB3cG50LT5maWxlbmFtZSA9IHN0cmR1cChidWZmZXIpOwotICAgIHdwbnQtPm5hbWUgPSBzdHJkdXAobW9kdWxlbmFtZSk7Ci0gICAgd3BudC0+dHlwZSA9IGZpbGV0eXBlOwotICAgIHdwbnQtPmluaXRpYWxpc2VkID0gRkFMU0U7Ci0KLSAgICAvKiByZWFkIG16IGhlYWRlciAqLwotICAgIHdwbnQtPm16X2hlYWRlciA9IChzdHJ1Y3QgbXpfaGVhZGVyX3MgKikgbWFsbG9jKHNpemVvZihzdHJ1Y3QgbXpfaGVhZGVyX3MpKTs7Ci0gICAgbHNlZWsod3BudC0+ZmQsIDAsIFNFRUtfU0VUKTsKLSAgICBpZiAocmVhZCh3cG50LT5mZCwgd3BudC0+bXpfaGVhZGVyLCBzaXplb2Yoc3RydWN0IG16X2hlYWRlcl9zKSkgIT0KLQlzaXplb2Yoc3RydWN0IG16X2hlYWRlcl9zKSkKLSAgICB7Ci0JZnByaW50ZihzdGRlcnIsICJVbmFibGUgdG8gcmVhZCBNWiBoZWFkZXIgZnJvbSBmaWxlICclcydcbiIsIGJ1ZmZlcik7Ci0gICAgICAgIGV4aXQoMSk7Ci0gICAgfQotCi0gICAgICAvKiBUaGlzIGZpZWxkIGlzIGlnbm9yZWQgYWNjb3JkaW5nIHRvICJXaW5kb3dzIEludGVybmFscyIsIHAuMjQyICovCi0jaWYgMAotICAgIGlmICh3cG50LT5tel9oZWFkZXItPm11c3RfYmVfMHg0MCAhPSAweDQwKQotCW15ZXJyb3IoIlRoaXMgaXMgbm90IGEgV2luZG93cyBwcm9ncmFtIik7Ci0jZW5kaWYKLQotICAgIC8qIHJlYWQgZmlyc3QgdHdvIGJ5dGVzIHRvIGRldGVybWluZSBmaWxldHlwZSAqLwotICAgIGxzZWVrKHdwbnQtPmZkLCB3cG50LT5tel9oZWFkZXItPm5lX29mZnNldCwgU0VFS19TRVQpOwotICAgIHJlYWQod3BudC0+ZmQsICZoZWFkZXIsIHNpemVvZihoZWFkZXIpKTsKLQotICAgIGhhbmRsZSA9IDA7Ci0KLSAgICAvKiAKLSAgICAgKiBTdGljayB0aGlzIGZpbGUgaW50byB0aGUgbGlzdCBvZiBsb2FkZWQgZmlsZXMgc28gd2UgZG9uJ3QgdHJ5IHRvIHJlbG9hZAotICAgICAqIGl0IGFnYWluIGlmIGFub3RoZXIgbW9kdWxlIHJlZmVyZW5jZXMgdGhpcyBtb2R1bGUuICBEbyB0aGlzIGJlZm9yZQotICAgICAqIGNhbGxpbmcgTkVfTG9hZEltYWdlIGJlY2F1c2Ugd2UgbWlnaHQgZ2V0IGJhY2sgaGVyZSBiZWZvcmUgTkVfbG9hZEltYWdlCi0gICAgICogcmV0dXJucy4KLSAgICAgKi8KLSAgICBpZih3aW5lX2ZpbGVzID09IE5VTEwpCi0gICAgICAgd2luZV9maWxlcyA9IHdwbnQ7Ci0gICAgZWxzZSB7Ci0JIHdwbnQxID0gd2luZV9maWxlczsKLQkgd2hpbGUod3BudDEtPm5leHQpCi0JICAgIHdwbnQxID0gd3BudDEtPm5leHQ7Ci0JIHdwbnQxLT5uZXh0ID0gd3BudDsKLSAgICB9Ci0gICAgd3BudC0+bmV4dCA9IE5VTEw7Ci0KLSAgICBpZiAoaGVhZGVyWzBdID09ICdOJyAmJiBoZWFkZXJbMV0gPT0gJ0UnKQotICAgIAloYW5kbGUgPSBORV9Mb2FkSW1hZ2Uod3BudCk7Ci0gICAgaWYgKGhlYWRlclswXSA9PSAnUCcgJiYgaGVhZGVyWzFdID09ICdFJykKLSAgICAgICAgaGFuZGxlID0gUEVfTG9hZEltYWdlKHdwbnQpOwotICAgIHdwbnQtPmhpbnN0YW5jZSA9IGhhbmRsZTsKLQotICAgIGlmIChoYW5kbGUgPiAzMikgewotCXJldHVybiBoYW5kbGU7Ci0gICAgfSBlbHNlIHsKLQlmcHJpbnRmKHN0ZGVyciwgIndpbmU6ICglcykgdW5rbm93biBmaWxlZm9ybWF0ICFcbiIsIHdwbnQtPmZpbGVuYW1lKTsKLQotCS8qIFJlbW92ZSB0aGlzIG1vZHVsZSBmcm9tIHRoZSBsaXN0IG9mIGxvYWRlZCBtb2R1bGVzICovCi0JaWYgKHdpbmVfZmlsZXMgPT0gd3BudCkKLQkgICAgd2luZV9maWxlcyA9IE5VTEw7Ci0JZWxzZQotCSAgICB3cG50MS0+bmV4dCA9IE5VTEw7Ci0JY2xvc2Uod3BudC0+ZmQpOwotCWZyZWUod3BudC0+ZmlsZW5hbWUpOwotCWZyZWUod3BudC0+bmFtZSk7Ci0JZnJlZSh3cG50KTsKLQotCXJldHVybiAxNDsKLSAgICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgkJCQlMb2FkTGlicmFyeQlbS0VSTkVMLjk1XQotICovCi1IQU5ETEUgTG9hZExpYnJhcnkoTFBTVFIgbGlibmFtZSkKLXsKLQlIQU5ETEUgaDsKLQkKLSAgICAgICAgZHByaW50Zl9tb2R1bGUoc3RkZGViLCJMb2FkTGlicmFyeTogKCUwOHgpICVzXG4iLChpbnQpbGlibmFtZSxsaWJuYW1lKTsKLQotCWlmICgoaCA9IExvYWRJbWFnZShsaWJuYW1lLCBETEwsIDApKSA8IDMyKQotCQlyZXR1cm4gaDsKLQotCWlmICghSVNfQlVJTFRJTl9ETEwoaCkpCi0JCUluaXRETEwoR2V0RmlsZUluZm8oaCkpOwotCQotCXJldHVybiBoOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoJCQkJRnJlZUxpYnJhcnkJW0tFUk5FTC45Nl0KLSAqLwotdm9pZCBGcmVlTGlicmFyeShIQU5ETEUgaExpYikKLXsKLQlkcHJpbnRmX21vZHVsZShzdGRkZWIsIkZyZWVMaWJyYXJ5KCUwNFgpO1xuIiwgaExpYik7Ci0KLQkvKiBidWlsdC1pbiBkbGwgPyAqLwotCWlmIChJU19CVUlMVElOX0RMTChoTGliKSB8fCBoTGliID09IDAgfHwgaExpYiA9PSBoU3lzUmVzKSAKLQkgICAgCXJldHVybjsKLQotLyoKLQl3aGlsZSAobHBNb2QgIT0gTlVMTCkgewotCQlpZiAobHBNb2QtPmhJbnN0ID09IGhMaWIpIHsKLQkJCWlmIChscE1vZC0+Q291bnQgPT0gMSkgewotCQkJCXdwbnQgPSBHZXRGaWxlSW5mbyhoTGliKTsKLQkJCQlpZiAod3BudC0+bmUpCi0JCQkJCU5FX1VubG9hZEltYWdlKHdwbnQpOwotCQkJCWVsc2UKLQkJCQkJUEVfVW5sb2FkSW1hZ2Uod3BudCk7Ci0JCQkJaWYgKGhMaWIgIT0gKEhBTkRMRSlOVUxMKSBHbG9iYWxGcmVlKGhMaWIpOwotCQkJCWlmIChscE1vZC0+TW9kdWxlTmFtZSAhPSBOVUxMKSBmcmVlKGxwTW9kLT5Nb2R1bGVOYW1lKTsKLQkJCQlpZiAobHBNb2QtPkZpbGVOYW1lICE9IE5VTEwpIGZyZWUobHBNb2QtPkZpbGVOYW1lKTsKLQkJCQlHbG9iYWxGcmVlKGxwTW9kLT5oTW9kdWxlKTsKLQkJCQlkcHJpbnRmX21vZHVsZShzdGRkZWIsIkZyZWVMaWJyYXJ5IC8vIGZyZWVkICFcbiIpOwotCQkJCXJldHVybjsKLQkJCQl9Ci0JCQlscE1vZC0+Q291bnQtLTsKLQkJCWRwcmludGZfbW9kdWxlKHN0ZGRlYiwiRnJlZUxpYnJhcnkgLy8gQ291bnQgZGVjcmVtZW50ZWQgIVxuIik7Ci0JCQlyZXR1cm47Ci0JCQl9Ci0JCWxwTW9kID0gbHBNb2QtPmxwTmV4dE1vZHVsZTsKLQkJfQotKi8KLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBHZXRQcm9jQWRkcmVzcyAgIChLRVJORUwuNTApCi0gKi8KLUZBUlBST0MgR2V0UHJvY0FkZHJlc3MoIEhBTkRMRSBoTW9kdWxlLCBTRUdQVFIgbmFtZSApCi17Ci0gICAgV09SRCBvcmRpbmFsOwotICAgIFNFR1BUUiByZXQ7Ci0KLSAgICBpZiAoIWhNb2R1bGUpIGhNb2R1bGUgPSBHZXRDdXJyZW50VGFzaygpOwotICAgIGhNb2R1bGUgPSBHZXRFeGVQdHIoIGhNb2R1bGUgKTsKLQotICAgIGlmIChISVdPUkQobmFtZSkgIT0gMCkKLSAgICB7Ci0gICAgICAgIG9yZGluYWwgPSBNT0RVTEVfR2V0T3JkaW5hbCggaE1vZHVsZSwgKExQU1RSKVBUUl9TRUdfVE9fTElOKG5hbWUpICk7Ci0gICAgICAgIGRwcmludGZfbW9kdWxlKCBzdGRkZWIsICJHZXRQcm9jQWRkcmVzczogJTA0eCAnJXMnXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgaE1vZHVsZSwgKExQU1RSKVBUUl9TRUdfVE9fTElOKG5hbWUpICk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIG9yZGluYWwgPSBMT1dPUkQobmFtZSk7Ci0gICAgICAgIGRwcmludGZfbW9kdWxlKCBzdGRkZWIsICJHZXRQcm9jQWRkcmVzczogJTA0eCAlMDR4XG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgaE1vZHVsZSwgb3JkaW5hbCApOwotICAgIH0KLSAgICBpZiAoIW9yZGluYWwpIHJldHVybiAoRkFSUFJPQykwOwotCi0gICAgcmV0ID0gTU9EVUxFX0dldEVudHJ5UG9pbnQoIGhNb2R1bGUsIG9yZGluYWwgKTsKLQotICAgIGRwcmludGZfbW9kdWxlKCBzdGRkZWIsICJHZXRQcm9jQWRkcmVzczogcmV0dXJuaW5nICUwOGx4XG4iLCByZXQgKTsKLSAgICByZXR1cm4gKEZBUlBST0MpcmV0OwotfQpkaWZmIC0tZ2l0IGEvbG9hZGVyL21haW4uYyBiL2xvYWRlci9tYWluLmMKaW5kZXggY2U3MTJhZS4uM2FjZTlkMyAxMDA2NDQKLS0tIGEvbG9hZGVyL21haW4uYworKysgYi9sb2FkZXIvbWFpbi5jCkBAIC0xMyw0NCArMTMsMjMgQEAKICNpbmNsdWRlICJuZWV4ZS5oIgogI2luY2x1ZGUgImRvc19mcy5oIgogI2luY2x1ZGUgImRsbHMuaCIKLSNpbmNsdWRlICJsaWJyYXJ5LmgiCiAjaW5jbHVkZSAid2luZG93cy5oIgogI2luY2x1ZGUgIndpbmVvcHRzLmgiCiAjaW5jbHVkZSAid2luZS5oIgogI2luY2x1ZGUgInRhc2suaCIKLSNpbmNsdWRlICJwcm90b3R5cGVzLmgiCiAjaW5jbHVkZSAib3B0aW9ucy5oIgotI2luY2x1ZGUgImlmMTYzMi5oIgotI2luY2x1ZGUgIm5lX2ltYWdlLmgiCiAjaW5jbHVkZSAicGVfaW1hZ2UuaCIKICNpbmNsdWRlICJzdGRkZWJ1Zy5oIgogI2luY2x1ZGUgImRlYnVnLmgiCiAKLWNoYXIgKipBcmd2OwotaW50IEFyZ2M7Ci1ISU5TVEFOQ0UgaFN5c1JlcywgaEluc3RNYWluOwotdW5zaWduZWQgc2hvcnQgV0lOX1N0YWNrU2l6ZTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCQkJCQlteWVycm9yCi0gKi8KLXZvaWQKLW15ZXJyb3IoY29uc3QgY2hhciAqcykKLXsKLSAgICBpZiAocyA9PSBOVUxMKQotCXBlcnJvcigid2luZSIpOwotICAgIGVsc2UKLQlmcHJpbnRmKHN0ZGVyciwgIndpbmU6ICVzXG4iLCBzKTsKLQotICAgIGV4aXQoMSk7Ci19Ci0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgTWFpbiBpbml0aWFsaXNhdGlvbiByb3V0aW5lCiAgKi8KIGludCBNQUlOX0luaXQodm9pZCkKIHsKKyAgICBleHRlcm4gQk9PTCBSRUxBWV9Jbml0KHZvaWQpOworCiAgICAgaW50IHF1ZXVlU2l6ZTsKIAogICAgIFNweUluaXQoKTsKQEAgLTU4LDYgKzM3LDkgQEAKICAgICAgIC8qIEluaXRpYWxpemUgcmVsYXkgY29kZSAqLwogICAgIGlmICghUkVMQVlfSW5pdCgpKSByZXR1cm4gMDsKIAorICAgICAgLyogSW5pdGlhbGl6ZSBXaW4zMiByZWxheSBjb2RlICovCisgICAgaWYgKCFSRUxBWTMyX0luaXQoKSkgcmV0dXJuIDA7CisKICAgICAgIC8qIENyZWF0ZSBidWlsdC1pbiBtb2R1bGVzICovCiAgICAgaWYgKCFNT0RVTEVfSW5pdCgpKSByZXR1cm4gMDsKIApAQCAtNjcsNiArNDksMTIgQEAKICAgICAgIC8qIEluaXRpYWxpemUgdGhlIERPUyBmaWxlIHN5c3RlbSAqLwogICAgIERPU19Jbml0RlMoKTsKIAorICAgICAgLyogQ3JlYXRlIERPUyBlbnZpcm9ubWVudCAqLworICAgIENyZWF0ZVNlbGVjdG9ycygpOworCisgICAgICAvKiBJbml0aWFsaXplIHNpZ25hbCBoYW5kbGluZyAqLworICAgIGluaXRfd2luZV9zaWduYWxzKCk7CisKICAgICAgIC8qIEluaXRpYWxpemUgY29tbXVuaWNhdGlvbnMgKi8KICAgICBDT01NX0luaXQoKTsKIApAQCAtOTEsMTkgKzc5LDEyIEBACiAgICAgICAvKiBDcmVhdGUgdGhlIERDRXMgKi8KICAgICBEQ0VfSW5pdCgpOwogICAgIAotICAgICAgLyogSW5pdGlhbGl6ZSBidWlsdC1pbiB3aW5kb3cgY2xhc3NlcyAqLwotICAgIGlmICghV0lER0VUU19Jbml0KCkpIHJldHVybiAwOwotCiAgICAgICAvKiBJbml0aWFsaXplIGRpYWxvZyBtYW5hZ2VyICovCiAgICAgaWYgKCFESUFMT0dfSW5pdCgpKSByZXR1cm4gMDsKIAogICAgICAgLyogSW5pdGlhbGl6ZSBtZW51cyAqLwogICAgIGlmICghTUVOVV9Jbml0KCkpIHJldHVybiAwOwogCi0gICAgICAvKiBDcmVhdGUgZGVza3RvcCB3aW5kb3cgKi8KLSAgICBpZiAoIVdJTl9DcmVhdGVEZXNrdG9wV2luZG93KCkpIHJldHVybiAwOwotICAgIGlmICghREVTS1RPUF9Jbml0KCkpIHJldHVybiAwOwotCiAgICAgICAvKiBDcmVhdGUgc3lzdGVtIG1lc3NhZ2UgcXVldWUgKi8KICAgICBxdWV1ZVNpemUgPSBHZXRQcm9maWxlSW50KCAid2luZG93cyIsICJUeXBlQWhlYWQiLCAxMjAgKTsKICAgICBpZiAoIU1TR19DcmVhdGVTeXNNc2dRdWV1ZSggcXVldWVTaXplICkpIHJldHVybiAwOwpAQCAtMTE4LDcwICs5OSwyMCBAQAogICovCiBpbnQgX1dpbk1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQogewotICAgIGNoYXIgKnAsIGZpbGVuYW1lWzI1Nl07CiAgICAgaW50IGk7CiAKLSAgICBzdHJ1Y3Qgd19maWxlcyAqd3BudDsKLSNpZmRlZiBXSU5FU1RBVAotICAgIGNoYXIgKiBjcDsKLSNlbmRpZgotCiAgICAgaWYgKCFNQUlOX0luaXQoKSkgcmV0dXJuIDA7CiAKLQlBcmdjID0gYXJnYyAtIDE7Ci0JQXJndiA9IGFyZ3YgKyAxOwotCi0JaWYgKHN0cmNocihBcmd2WzBdLCAnXFwnKSB8fCBzdHJjaHIoQXJndlswXSwnLycpKSB7Ci0gICAgICAgICAgICBmb3IgKHAgPSBBcmd2WzBdICsgc3RybGVuKEFyZ3ZbMF0pOyAqcCAhPSAnXFwnICYmICpwICE9Jy8nOyBwLS0pCi0JCS8qIE5PVEhJTkcgKi87Ci0JCQotCSAgICBzdHJuY3B5KGZpbGVuYW1lLCBBcmd2WzBdLCBwIC0gQXJndlswXSk7Ci0JICAgIGZpbGVuYW1lW3AgLSBBcmd2WzBdXSA9ICdcMCc7Ci0JICAgIHN0cmNhdChXaW5kb3dzUGF0aCwgIjsiKTsKLQkgICAgaWYgKHN0cmNocihmaWxlbmFtZSwgJy8nKSkKLQkJICAgIHN0cmNhdChXaW5kb3dzUGF0aCwgRE9TX0dldERvc0ZpbGVOYW1lKGZpbGVuYW1lKSk7Ci0JICAgIGVsc2UKLQkgICAgCSAgICBzdHJjYXQoV2luZG93c1BhdGgsIGZpbGVuYW1lKTsKLQl9Ci0KLQlmb3IgKGkgPSAwOyBpIDwgQXJnYzsgaSsrKQorICAgIGZvciAoaSA9IDE7IGkgPCBhcmdjOyBpKyspCisgICAgeworICAgICAgICBpZiAoV2luRXhlYyggYXJndltpXSwgU1dfU0hPV05PUk1BTCApIDwgMzIpCiAgICAgICAgIHsKLSAgICAgICAgICAgIGlmICgoaEluc3RNYWluID0gTG9hZEltYWdlKEFyZ3ZbaV0sIEVYRSwgMSkpIDwgMzIpIHsKLQkJZnByaW50ZihzdGRlcnIsICJ3aW5lOiBjYW4ndCBsb2FkICVzIS5cbiIsIEFyZ3ZbaV0pOwotCQlleGl0KDEpOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJ3aW5lOiBjYW4ndCBleGVjICclcycuXG4iLCBhcmd2W2ldKTsKKyAgICAgICAgICAgIGV4aXQoMSk7CiAgICAgICAgIH0KKyAgICB9CiAKLQlHZXRQcml2YXRlUHJvZmlsZVN0cmluZygid2luZSIsICJTeXN0ZW1SZXNvdXJjZXMiLCAic3lzcmVzLmRsbCIsIAotCQkJCWZpbGVuYW1lLCBzaXplb2YoZmlsZW5hbWUpLCBXSU5FX0lOSSk7Ci0KLQloU3lzUmVzID0gTG9hZEltYWdlKGZpbGVuYW1lLCBETEwsIDApOwotCWlmIChoU3lzUmVzIDwgMzIpIHsKLQkJZnByaW50ZihzdGRlcnIsICJ3aW5lOiBjYW4ndCBsb2FkICVzIS5cbiIsIGZpbGVuYW1lKTsKLQkJZXhpdCgxKTsKLQl9IGVsc2UKLSAJICAgIGRwcmludGZfZGxsKHN0ZGRlYiwiU3lzdGVtIFJlc291cmNlcyBMb2FkZWQgLy8gaFN5c1Jlcz0nJTA0WCdcbiIsCi0JCQloU3lzUmVzKTsKLQkKLQotI2lmZGVmIFdJTkVTVEFUCi0gICAgY3AgPSBzdHJyY2hyKGFyZ3ZbMF0sICcvJyk7Ci0gICAgaWYoIWNwKSBjcCA9IGFyZ3ZbMF07Ci0JZWxzZSBjcCsrOwotICAgIGlmKHN0cmNtcChjcCwid2luZXN0YXQiKSA9PSAwKSB7Ci0JICAgIHdpbmVzdGF0KCk7Ci0JICAgIGV4aXQoMCk7Ci0gICAgfTsKLSNlbmRpZgotCi0gICAgLyoKLSAgICAgKiBJbml0aWFsaXplIHNpZ25hbCBoYW5kbGluZy4KLSAgICAgKi8KLSAgICBpbml0X3dpbmVfc2lnbmFscygpOwotICAgICAgICAKLSAgICB3cG50ID0gR2V0RmlsZUluZm8oaEluc3RNYWluKTsKLSAgICBpZiAoT3B0aW9ucy5kZWJ1ZykKLQl3aW5lX2RlYnVnKDAsIE5VTEwpOworICAgIGlmIChPcHRpb25zLmRlYnVnKSB3aW5lX2RlYnVnKDAsIE5VTEwpOwogCiAgICAgWWllbGQoKTsgIC8qIFN0YXJ0IHRoZSBmaXJzdCB0YXNrICovCiAgICAgZnByaW50Ziggc3RkZXJyLCAiV2luTWFpbjogU2hvdWxkIG5ldmVyIGhhcHBlbjogcmV0dXJuZWQgZnJvbSBZaWVsZCgpXG4iICk7CmRpZmYgLS1naXQgYS9sb2FkZXIvbW9kdWxlLmMgYi9sb2FkZXIvbW9kdWxlLmMKaW5kZXggN2VhMjk0NC4uYzRhZjViZiAxMDA2NDQKLS0tIGEvbG9hZGVyL21vZHVsZS5jCisrKyBiL2xvYWRlci9tb2R1bGUuYwpAQCAtMTIsMjAgKzEyLDE5IEBACiAjaW5jbHVkZSA8dW5pc3RkLmg+CiAjaW5jbHVkZSAid2luZG93cy5oIgogI2luY2x1ZGUgImRsbHMuaCIKKyNpbmNsdWRlICJkb3NfZnMuaCIKICNpbmNsdWRlICJnbG9iYWwuaCIKICNpbmNsdWRlICJsZHQuaCIKICNpbmNsdWRlICJtb2R1bGUuaCIKICNpbmNsdWRlICJuZWV4ZS5oIgorI2luY2x1ZGUgInN0YWNrZnJhbWUuaCIKKyNpbmNsdWRlICJ0YXNrLmgiCiAjaW5jbHVkZSAidG9vbGhlbHAuaCIKICNpbmNsdWRlICJzdGRkZWJ1Zy5oIgogLyogI2RlZmluZSBERUJVR19NT0RVTEUgKi8KICNpbmNsdWRlICJkZWJ1Zy5oIgogCiAKLWV4dGVybiBCWVRFIEtFUk5FTF9Nb2R1bGVfU3RhcnRbXSwgS0VSTkVMX01vZHVsZV9FbmRbXTsKLQotZXh0ZXJuIHN0cnVjdCBkbGxfbmFtZV90YWJsZV9lbnRyeV9zIGRsbF9idWlsdGluX3RhYmxlW107Ci0KIHN0YXRpYyBITU9EVUxFIGhGaXJzdE1vZHVsZSA9IDA7CiAKIApAQCAtMzYsMTggKzM1LDIwIEBACiAgKi8KIEJPT0wgTU9EVUxFX0luaXQodm9pZCkKIHsKKyAgICBleHRlcm4gdm9pZCBsb2FkX2VudHJ5cG9pbnRzKCBITU9EVUxFICk7CisKICAgICBITU9EVUxFIGhNb2R1bGU7CiAgICAgTkVfTU9EVUxFICpwTW9kdWxlOwogICAgIFNFR1RBQkxFRU5UUlkgKnBTZWdUYWJsZTsKICAgICBzdHJ1Y3QgZGxsX3RhYmxlX3MgKnRhYmxlOworICAgIGNoYXIgKmRvc21lbTsKICAgICBpbnQgaTsKIAogICAgICAgLyogQ3JlYXRlIHRoZSBidWlsdC1pbiBtb2R1bGVzICovCiAKLSAgICBmb3IgKGkgPSAwOyBpIDwgTl9CVUlMVElOUzsgaSsrKQorICAgIGZvciAoaSA9IDAsIHRhYmxlID0gZGxsX2J1aWx0aW5fdGFibGU7IGkgPCBOX0JVSUxUSU5TOyBpKyssIHRhYmxlKyspCiAgICAgewotICAgICAgICBpZiAoIWRsbF9idWlsdGluX3RhYmxlW2ldLmRsbF9pc191c2VkKSBjb250aW51ZTsKLSAgICAgICAgdGFibGUgPSBkbGxfYnVpbHRpbl90YWJsZVtpXS50YWJsZTsKKyAgICAgICAgaWYgKCF0YWJsZS0+dXNlZCkgY29udGludWU7CiAKICAgICAgICAgaE1vZHVsZSA9IEdMT0JBTF9DcmVhdGVCbG9jayggR01FTV9NT1ZFQUJMRSwgdGFibGUtPm1vZHVsZV9zdGFydCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFibGUtPm1vZHVsZV9lbmQgLSB0YWJsZS0+bW9kdWxlX3N0YXJ0LApAQCAtNTgsNyArNTksNyBAQAogICAgICAgICB0YWJsZS0+aE1vZHVsZSA9IGhNb2R1bGU7CiAKICAgICAgICAgZHByaW50Zl9tb2R1bGUoIHN0ZGRlYiwgIkJ1aWx0LWluICVzOiBobW9kdWxlPSUwNHhcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICBkbGxfYnVpbHRpbl90YWJsZVtpXS5kbGxfbmFtZSwgaE1vZHVsZSApOworICAgICAgICAgICAgICAgICAgICAgICAgdGFibGUtPm5hbWUsIGhNb2R1bGUgKTsKIAogICAgICAgICAgIC8qIEFsbG9jYXRlIHRoZSBjb2RlIHNlZ21lbnQgKi8KIApAQCAtODEsNyArODIsNTEgQEAKIAogICAgICAgICBwTW9kdWxlLT5uZXh0ID0gaEZpcnN0TW9kdWxlOwogICAgICAgICBoRmlyc3RNb2R1bGUgPSBoTW9kdWxlOworICAgICAgICBsb2FkX2VudHJ5cG9pbnRzKCBoTW9kdWxlICk7CiAgICAgfQorCisgICAgICAvKiBJbml0aWFsaXplIHNvbWUgS0VSTkVMIGV4cG9ydGVkIHZhbHVlcyAqLworCisgICAgaWYgKCEoaE1vZHVsZSA9IEdldE1vZHVsZUhhbmRsZSggIktFUk5FTCIgKSkpIHJldHVybiBUUlVFOworCisgICAgICAvKiBLRVJORUwuMTc4OiBfX1dJTkZMQUdTICovCisgICAgTU9EVUxFX1NldEVudHJ5UG9pbnQoIGhNb2R1bGUsIDE3OCwgR2V0V2luRmxhZ3MoKSApOworCisgICAgLyogQWxsb2NhdGUgNyA2NGsgc2VnbWVudHMgZm9yIDAwMDAsIEEwMDAsIEIwMDAsIEMwMDAsIEQwMDAsIEUwMDAsIEYwMDAuICovCisKKyAgICBkb3NtZW0gPSBtYWxsb2MoIDB4NzAwMDAgKTsKKworICAgIE1PRFVMRV9TZXRFbnRyeVBvaW50KCBoTW9kdWxlLCAxODMsICAvKiBLRVJORUwuMTgzOiBfXzAwMDBIICovCisgICAgICAgICAgICAgICAgICAgICAgICAgIEdMT0JBTF9DcmVhdGVCbG9jayggR01FTV9GSVhFRCwgZG9zbWVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTAwMDAsIGhNb2R1bGUsIEZBTFNFLCBGQUxTRSwgRkFMU0UgKSApOworICAgIE1PRFVMRV9TZXRFbnRyeVBvaW50KCBoTW9kdWxlLCAxOTMsICAvKiBLRVJORUwuMTkzOiBfXzAwNDBIICovCisgICAgICAgICAgICAgICAgICAgICAgICAgIEdMT0JBTF9DcmVhdGVCbG9jayggR01FTV9GSVhFRCwgZG9zbWVtICsgMHg0MDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMDAsIGhNb2R1bGUsIEZBTFNFLCBGQUxTRSwgRkFMU0UgKSApOworICAgIE1PRFVMRV9TZXRFbnRyeVBvaW50KCBoTW9kdWxlLCAxNzQsICAvKiBLRVJORUwuMTc0OiBfX0EwMDBIICovCisgICAgICAgICAgICAgICAgICAgICAgICAgIEdMT0JBTF9DcmVhdGVCbG9jayggR01FTV9GSVhFRCwgZG9zbWVtICsgMHgxMDAwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEwMDAwLCBoTW9kdWxlLCBGQUxTRSwgRkFMU0UsIEZBTFNFICkgKTsKKyAgICBNT0RVTEVfU2V0RW50cnlQb2ludCggaE1vZHVsZSwgMTgxLCAgLyogS0VSTkVMLjE4MTogX19CMDAwSCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICBHTE9CQUxfQ3JlYXRlQmxvY2soIEdNRU1fRklYRUQsIGRvc21lbSArIDB4MjAwMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMDAwMCwgaE1vZHVsZSwgRkFMU0UsIEZBTFNFLCBGQUxTRSApICk7CisgICAgTU9EVUxFX1NldEVudHJ5UG9pbnQoIGhNb2R1bGUsIDE4MiwgIC8qIEtFUk5FTC4xODI6IF9fQjgwMEggKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgR0xPQkFMX0NyZWF0ZUJsb2NrKCBHTUVNX0ZJWEVELCBkb3NtZW0gKyAweDI4MDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTAwMDAsIGhNb2R1bGUsIEZBTFNFLCBGQUxTRSwgRkFMU0UgKSApOworICAgIE1PRFVMRV9TZXRFbnRyeVBvaW50KCBoTW9kdWxlLCAxOTUsICAvKiBLRVJORUwuMTk1OiBfX0MwMDBIICovCisgICAgICAgICAgICAgICAgICAgICAgICAgIEdMT0JBTF9DcmVhdGVCbG9jayggR01FTV9GSVhFRCwgZG9zbWVtICsgMHgzMDAwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEwMDAwLCBoTW9kdWxlLCBGQUxTRSwgRkFMU0UsIEZBTFNFICkgKTsKKyAgICBNT0RVTEVfU2V0RW50cnlQb2ludCggaE1vZHVsZSwgMTc5LCAgLyogS0VSTkVMLjE3OTogX19EMDAwSCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICBHTE9CQUxfQ3JlYXRlQmxvY2soIEdNRU1fRklYRUQsIGRvc21lbSArIDB4NDAwMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMDAwMCwgaE1vZHVsZSwgRkFMU0UsIEZBTFNFLCBGQUxTRSApICk7CisgICAgTU9EVUxFX1NldEVudHJ5UG9pbnQoIGhNb2R1bGUsIDE5MCwgIC8qIEtFUk5FTC4xOTA6IF9fRTAwMEggKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgR0xPQkFMX0NyZWF0ZUJsb2NrKCBHTUVNX0ZJWEVELCBkb3NtZW0gKyAweDUwMDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTAwMDAsIGhNb2R1bGUsIEZBTFNFLCBGQUxTRSwgRkFMU0UgKSApOworICAgIE1PRFVMRV9TZXRFbnRyeVBvaW50KCBoTW9kdWxlLCAxNzMsICAvKiBLRVJORUwuMTczOiBfX1JPTUJJT1MgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgR0xPQkFMX0NyZWF0ZUJsb2NrKCBHTUVNX0ZJWEVELCBkb3NtZW0gKyAweDYwMDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTAwMDAsIGhNb2R1bGUsIEZBTFNFLCBGQUxTRSwgRkFMU0UgKSApOworICAgIE1PRFVMRV9TZXRFbnRyeVBvaW50KCBoTW9kdWxlLCAxOTQsICAvKiBLRVJORUwuMTk0OiBfX0YwMDBIICovCisgICAgICAgICAgICAgICAgICAgICAgICAgIEdMT0JBTF9DcmVhdGVCbG9jayggR01FTV9GSVhFRCwgZG9zbWVtICsgMHg2MDAwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEwMDAwLCBoTW9kdWxlLCBGQUxTRSwgRkFMU0UsIEZBTFNFICkgKTsKKwogICAgIHJldHVybiBUUlVFOwogfQogCkBAIC0yMzcsNyArMjgyLDcgQEAKICAgICBjbG9zZSggY2FjaGVkZmQgKTsKICAgICBoQ2FjaGVkTW9kdWxlID0gaE1vZHVsZTsKICAgICBuYW1lID0gKChMT0FERURGSUxFSU5GTyopKChjaGFyKilwTW9kdWxlICsgcE1vZHVsZS0+ZmlsZWluZm8pKS0+ZmlsZW5hbWU7Ci0gICAgY2FjaGVkZmQgPSBvcGVuKCBuYW1lIC8qIERPU19HZXRVbml4RmlsZU5hbWUoIG5hbWUgKSAqLywgT19SRE9OTFkgKTsKKyAgICBjYWNoZWRmZCA9IG9wZW4oIERPU19HZXRVbml4RmlsZU5hbWUoIG5hbWUgKSwgT19SRE9OTFkgKTsKICAgICBkcHJpbnRmX21vZHVsZSggc3RkZGViLCAiTU9EVUxFX09wZW5GaWxlOiBvcGVuZWQgJyVzJyAtPiAlZFxuIiwKICAgICAgICAgICAgICAgICAgICAgbmFtZSwgY2FjaGVkZmQgKTsKICAgICByZXR1cm4gY2FjaGVkZmQ7CkBAIC0yNjMsNyArMzA4LDkgQEAKICAgICAgICAgewogICAgICAgICAgICAgLyogRklYTUU6IHRoaXMgaXMgbmVlZGVkIGJlY2F1c2UgaGVhcCBncm93aW5nIGlzIG5vdCBpbXBsZW1lbnRlZCAqLwogICAgICAgICAgICAgcE1vZHVsZS0+aGVhcF9zaXplID0gMHgxMDAwMCAtIG1pbnNpemU7CisgICAgICAgICAgICAvKiBGb3IgdGFza3MsIHRoZSBER1JPVVAgaXMgYWxsb2NhdGVkIGJ5IE1PRFVMRV9NYWtlTmV3SW5zdGFuY2UgKi8KICAgICAgICAgICAgIG1pbnNpemUgPSAweDEwMDAwOworICAgICAgICAgICAgaWYgKCEocE1vZHVsZS0+ZmxhZ3MgJiBORV9GRkxBR1NfTElCTU9EVUxFKSkgY29udGludWU7CiAgICAgICAgIH0KICAgICAgICAgcFNlZ21lbnQtPnNlbGVjdG9yID0gR0xPQkFMX0FsbG9jKCBHTUVNX1pFUk9JTklUIHwgR01FTV9GSVhFRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluc2l6ZSwgaE1vZHVsZSwKQEAgLTI4Miw3ICszMjksNyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgTU9EVUxFX0xvYWRFeGVIZWFkZXIKICAqLwotSE1PRFVMRSBNT0RVTEVfTG9hZEV4ZUhlYWRlciggaW50IGZkLCBjaGFyICpmaWxlbmFtZSApCitITU9EVUxFIE1PRFVMRV9Mb2FkRXhlSGVhZGVyKCBpbnQgZmQsIE9GU1RSVUNUICpvZnMgKQogewogICAgIHN0cnVjdCBtel9oZWFkZXJfcyBtel9oZWFkZXI7CiAgICAgc3RydWN0IG5lX2hlYWRlcl9zIG5lX2hlYWRlcjsKQEAgLTMxNiw3ICszNjMsNyBAQAogCiAgICAgc2l6ZSA9IHNpemVvZihORV9NT0RVTEUpICsKICAgICAgICAgICAgICAvKiBsb2FkZWQgZmlsZSBpbmZvICovCi0gICAgICAgICAgIHNpemVvZihMT0FERURGSUxFSU5GTykgKyBzdHJsZW4oZmlsZW5hbWUpICsKKyAgICAgICAgICAgc2l6ZW9mKExPQURFREZJTEVJTkZPKSArIHN0cmxlbihvZnMtPnN6UGF0aE5hbWUpICsKICAgICAgICAgICAgICAvKiBzZWdtZW50IHRhYmxlICovCiAgICAgICAgICAgIG5lX2hlYWRlci5uX3NlZ21lbnRfdGFiICogc2l6ZW9mKFNFR1RBQkxFRU5UUlkpICsKICAgICAgICAgICAgICAvKiByZXNvdXJjZSB0YWJsZSAqLwpAQCAtMzM1LDYgKzM4Miw3IEBACiAgICAgRmFyU2V0T3duZXIoIGhNb2R1bGUsIGhNb2R1bGUgKTsKICAgICBwTW9kdWxlID0gKE5FX01PRFVMRSAqKUdsb2JhbExvY2soIGhNb2R1bGUgKTsKICAgICBtZW1jcHkoIHBNb2R1bGUsICZuZV9oZWFkZXIsIHNpemVvZihORV9NT0RVTEUpICk7CisgICAgcE1vZHVsZS0+Y291bnQgPSAwOwogICAgIHBEYXRhID0gKEJZVEUgKikocE1vZHVsZSArIDEpOwogCiAgICAgLyogUmVhZCB0aGUgZmFzdC1sb2FkIGFyZWEgKi8KQEAgLTM1OSwxMiArNDA3LDEyIEBACiAgICAgLyogU3RvcmUgdGhlIGZpbGVuYW1lIGluZm9ybWF0aW9uICovCiAKICAgICBwTW9kdWxlLT5maWxlaW5mbyA9IChpbnQpcERhdGEgLSAoaW50KXBNb2R1bGU7Ci0gICAgKChMT0FERURGSUxFSU5GTyopcERhdGEpLT5sZW5ndGggPSBzaXplb2YoTE9BREVERklMRUlORk8pK3N0cmxlbihmaWxlbmFtZSk7CisgICAgKChMT0FERURGSUxFSU5GTyopcERhdGEpLT5sZW5ndGggPSBzaXplb2YoTE9BREVERklMRUlORk8pK3N0cmxlbihvZnMtPnN6UGF0aE5hbWUpOwogICAgICgoTE9BREVERklMRUlORk8qKXBEYXRhKS0+Zml4ZWRfbWVkaWEgPSBUUlVFOwogICAgICgoTE9BREVERklMRUlORk8qKXBEYXRhKS0+ZXJyb3IgPSAwOwogICAgICgoTE9BREVERklMRUlORk8qKXBEYXRhKS0+ZGF0ZSA9IDA7CiAgICAgKChMT0FERURGSUxFSU5GTyopcERhdGEpLT50aW1lID0gMDsKLSAgICBzdHJjcHkoICgoTE9BREVERklMRUlORk8qKXBEYXRhKS0+ZmlsZW5hbWUsIGZpbGVuYW1lICk7CisgICAgc3RyY3B5KCAoKExPQURFREZJTEVJTkZPKilwRGF0YSktPmZpbGVuYW1lLCBvZnMtPnN6UGF0aE5hbWUgKTsKICAgICBwRGF0YSArPSAoKExPQURFREZJTEVJTkZPKilwRGF0YSktPmxlbmd0aC0tOwogCiAgICAgLyogR2V0IHRoZSBzZWdtZW50IHRhYmxlICovCkBAIC00NTEsNiArNDk5LDE3IEBACiAgICAgfQogICAgIGVsc2UgcE1vZHVsZS0+bnJuYW1lX2hhbmRsZSA9IDA7CiAKKyAgICAvKiBBbGxvY2F0ZSBhIHNlZ21lbnQgZm9yIHRoZSBpbXBsaWNpdGx5LWxvYWRlZCBETExzICovCisKKyAgICBpZiAocE1vZHVsZS0+bW9kcmVmX2NvdW50KQorICAgIHsKKyAgICAgICAgcE1vZHVsZS0+ZGxsc190b19pbml0ID0gR0xPQkFMX0FsbG9jKEdNRU1fWkVST0lOSVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocE1vZHVsZS0+bW9kcmVmX2NvdW50KzEpKnNpemVvZihITU9EVUxFKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhNb2R1bGUsIEZBTFNFLCBGQUxTRSwgRkFMU0UgKTsKKyAgICAgICAgaWYgKCFwTW9kdWxlLT5kbGxzX3RvX2luaXQpIHJldHVybiAxMTsgIC8qIGludmFsaWQgZXhlICovCisgICAgfQorICAgIGVsc2UgcE1vZHVsZS0+ZGxsc190b19pbml0ID0gMDsKKwogICAgIGlmIChkZWJ1Z2dpbmdfbW9kdWxlKSBNT0RVTEVfUHJpbnRNb2R1bGUoIGhNb2R1bGUgKTsKICAgICBwTW9kdWxlLT5uZXh0ID0gaEZpcnN0TW9kdWxlOwogICAgIGhGaXJzdE1vZHVsZSA9IGhNb2R1bGU7CkBAIC00NTksNiArNTE4LDYyIEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgTU9EVUxFX01ha2VOZXdJbnN0YW5jZQorICoKKyAqIENyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgc3BlY2lmaWVkIG1vZHVsZS4KKyAqLworSElOU1RBTkNFIE1PRFVMRV9NYWtlTmV3SW5zdGFuY2UoIEhNT0RVTEUgaE1vZHVsZSwgTE9BRFBBUkFNUyAqcGFyYW1zICkKK3sKKyAgICBORV9NT0RVTEUgKnBNb2R1bGU7CisgICAgU0VHVEFCTEVFTlRSWSAqcFNlZ21lbnQ7CisgICAgSElOU1RBTkNFIGhOZXdJbnN0YW5jZSwgaFByZXZJbnN0YW5jZTsKKyAgICBpbnQgbWluc2l6ZTsKKworICAgIGlmICghKHBNb2R1bGUgPSAoTkVfTU9EVUxFICopR2xvYmFsTG9jayggaE1vZHVsZSApKSkgcmV0dXJuIDA7CisgICAgaWYgKCFwTW9kdWxlLT5kZ3JvdXApIHJldHVybiBoTW9kdWxlOyAgLyogTm8gREdST1VQIC0+IHJldHVybiB0aGUgbW9kdWxlICovCisKKyAgICBwU2VnbWVudCA9IE5FX1NFR19UQUJMRSggcE1vZHVsZSApICsgcE1vZHVsZS0+ZGdyb3VwIC0gMTsKKyAgICBoUHJldkluc3RhbmNlID0gcFNlZ21lbnQtPnNlbGVjdG9yOworCisgICAgICAvKiBEb24ndCBjcmVhdGUgYSBuZXcgaW5zdGFuY2UgaWYgaXQncyBhIGxpYnJhcnkgKi8KKworICAgIGlmIChwTW9kdWxlLT5mbGFncyAmIE5FX0ZGTEFHU19MSUJNT0RVTEUpIHJldHVybiBoUHJldkluc3RhbmNlOworICAgIGlmIChwYXJhbXMgPT0gKExPQURQQVJBTVMqKS0xKSByZXR1cm4gaFByZXZJbnN0YW5jZTsKKworICAgICAgLyogQWxsb2NhdGUgdGhlIG5ldyBkYXRhIHNlZ21lbnQgKi8KKworICAgIG1pbnNpemUgPSBwU2VnbWVudC0+bWluc2l6ZSA/IHBTZWdtZW50LT5taW5zaXplIDogMHgxMDAwMDsKKyAgICBpZiAocE1vZHVsZS0+c3MgPT0gcE1vZHVsZS0+ZGdyb3VwKSBtaW5zaXplICs9IHBNb2R1bGUtPnN0YWNrX3NpemU7CisgICAgbWluc2l6ZSArPSBwTW9kdWxlLT5oZWFwX3NpemU7CisgICAgaE5ld0luc3RhbmNlID0gR0xPQkFMX0FsbG9jKCBHTUVNX1pFUk9JTklUIHwgR01FTV9GSVhFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbnNpemUsIGhNb2R1bGUsIEZBTFNFLCBGQUxTRSwgRkFMU0UgKTsKKyAgICBpZiAoIWhOZXdJbnN0YW5jZSkgcmV0dXJuIDA7CisgICAgcFNlZ21lbnQtPnNlbGVjdG9yID0gaE5ld0luc3RhbmNlOworICAgIE5FX0xvYWRTZWdtZW50KCBoTW9kdWxlLCBwTW9kdWxlLT5kZ3JvdXAgKTsKKworICAgICAgLyogQ3JlYXRlIGEgbmV3IHRhc2sgZm9yIHRoaXMgaW5zdGFuY2UgKi8KKyAgICBpZiAoIVRBU0tfQ3JlYXRlVGFzayggaE1vZHVsZSwgaE5ld0luc3RhbmNlLCBoUHJldkluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXMtPmhFbnZpcm9ubWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKExQU1RSKVBUUl9TRUdfVE9fTElOKCBwYXJhbXMtPmNtZExpbmUgKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKigoV09SRCAqKVBUUl9TRUdfVE9fTElOKHBhcmFtcy0+c2hvd0NtZCkrMSkgKSkKKyAgICB7CisgICAgICAgIEdsb2JhbEZyZWUoIGhOZXdJbnN0YW5jZSApOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICAgIC8qIEluaXRpYWxpemUgdGhlIGxvY2FsIGhlYXAgKi8KKworICAgIGlmIChwTW9kdWxlLT5oZWFwX3NpemUpCisgICAgeworICAgICAgICBXT1JEIGhlYXBzdGFydCA9IHBTZWdtZW50LT5taW5zaXplOworICAgICAgICBpZiAocE1vZHVsZS0+c3MgPT0gcE1vZHVsZS0+ZGdyb3VwKSBoZWFwc3RhcnQgKz0gcE1vZHVsZS0+c3RhY2tfc2l6ZTsKKyAgICAgICAgTG9jYWxJbml0KCBoTmV3SW5zdGFuY2UsIGhlYXBzdGFydCwgaGVhcHN0YXJ0ICsgcE1vZHVsZS0+aGVhcF9zaXplICk7CisgICAgfQorICAgIHJldHVybiBoTmV3SW5zdGFuY2U7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgTU9EVUxFX0dldE9yZGluYWwKICAqCiAgKiBMb29rdXAgdGhlIG9yZGluYWwgZm9yIGEgZ2l2ZW4gbmFtZS4KQEAgLTUzOCw4ICs2NTMsNiBAQAogCiAgICAgaWYgKCEocE1vZHVsZSA9IChORV9NT0RVTEUgKilHbG9iYWxMb2NrKCBoTW9kdWxlICkpKSByZXR1cm4gMDsKIAotICAgIGRwcmludGZfbW9kdWxlKCBzdGRkZWIsICJNT0RVTEVfR2V0RW50cnlQb2ludCglMDR4LCVkKVxuIiwKLSAgICAgICAgICAgICAgICAgICAgaE1vZHVsZSwgb3JkaW5hbCApOwogICAgIHAgPSAoQllURSAqKXBNb2R1bGUgKyBwTW9kdWxlLT5lbnRyeV90YWJsZTsKICAgICB3aGlsZSAoKnAgJiYgKGN1ck9yZGluYWwgKyAqcCA8PSBvcmRpbmFsKSkKICAgICB7CkBAIC01NTIsMTYgKzY2NSwxMSBAQAogICAgICAgICAgICAgZGVmYXVsdDogICBwICs9IDIgKyAqcCAqIDM7IGJyZWFrOyAgLyogZml4ZWQgKi8KICAgICAgICAgfQogICAgIH0KLSAgICBpZiAoISpwKQotICAgIHsKLSAgICAgICAgZHByaW50Zl9tb2R1bGUoIHN0ZGRlYiwgIiAgTm90IGZvdW5kIChsYXN0PSVkKVxuIiwgY3VyT3JkaW5hbC0xICk7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KKyAgICBpZiAoISpwKSByZXR1cm4gMDsKIAogICAgIHN3aXRjaChwWzFdKQogICAgIHsKICAgICAgICAgY2FzZSAwOiAgLyogdW51c2VkICovCi0gICAgICAgICAgICBkcHJpbnRmX21vZHVsZSggc3RkZGViLCAiICBGb3VuZCwgYnV0IGVudHJ5IGlzIHVudXNlZFxuIiApOwogICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgIGNhc2UgMHhmZjogIC8qIG1vdmVhYmxlICovCiAgICAgICAgICAgICBwICs9IDIgKyA2ICogKG9yZGluYWwgLSBjdXJPcmRpbmFsKTsKQEAgLTU3NSw4ICs2ODMsNiBAQAogICAgICAgICAgICAgYnJlYWs7CiAgICAgfQogCi0gICAgZHByaW50Zl9tb2R1bGUoIHN0ZGRlYiwgIiAgRm91bmQsIGxvZ2ljYWwgYWRkciA9ICUwNHg6JTA0eFxuIiwKLSAgICAgICAgICAgICAgICAgICAgc2VsLCBvZmZzZXQgKTsKICAgICBpZiAoc2VsID09IDB4ZmUpIHNlbCA9IDB4ZmZmZjsgIC8qIGNvbnN0YW50IGVudHJ5ICovCiAgICAgZWxzZSBzZWwgPSBORV9TRUdfVEFCTEUocE1vZHVsZSlbc2VsLTFdLnNlbGVjdG9yOwogICAgIHJldHVybiBNQUtFTE9ORyggb2Zmc2V0LCBzZWwgKTsKQEAgLTU4NCw2ICs2OTAsODcgQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBNT0RVTEVfU2V0RW50cnlQb2ludAorICoKKyAqIENoYW5nZSB0aGUgdmFsdWUgb2YgYW4gZW50cnkgcG9pbnQuIFVzZSB3aXRoIGNhdXRpb24hCisgKiBJdCBjYW4gb25seSBjaGFuZ2UgdGhlIG9mZnNldCB2YWx1ZSwgbm90IHRoZSBzZWxlY3Rvci4KKyAqLworQk9PTCBNT0RVTEVfU2V0RW50cnlQb2ludCggSE1PRFVMRSBoTW9kdWxlLCBXT1JEIG9yZGluYWwsIFdPUkQgb2Zmc2V0ICkKK3sKKyAgICBORV9NT0RVTEUgKnBNb2R1bGU7CisgICAgV09SRCBjdXJPcmRpbmFsID0gMTsKKyAgICBCWVRFICpwOworCisgICAgaWYgKCEocE1vZHVsZSA9IChORV9NT0RVTEUgKilHbG9iYWxMb2NrKCBoTW9kdWxlICkpKSByZXR1cm4gRkFMU0U7CisKKyAgICBwID0gKEJZVEUgKilwTW9kdWxlICsgcE1vZHVsZS0+ZW50cnlfdGFibGU7CisgICAgd2hpbGUgKCpwICYmIChjdXJPcmRpbmFsICsgKnAgPD0gb3JkaW5hbCkpCisgICAgeworICAgICAgICAgIC8qIFNraXBwaW5nIHRoaXMgYnVuZGxlICovCisgICAgICAgIGN1ck9yZGluYWwgKz0gKnA7CisgICAgICAgIHN3aXRjaChwWzFdKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIDA6ICAgIHAgKz0gMjsgYnJlYWs7ICAvKiB1bnVzZWQgKi8KKyAgICAgICAgICAgIGNhc2UgMHhmZjogcCArPSAyICsgKnAgKiA2OyBicmVhazsgIC8qIG1vdmVhYmxlICovCisgICAgICAgICAgICBkZWZhdWx0OiAgIHAgKz0gMiArICpwICogMzsgYnJlYWs7ICAvKiBmaXhlZCAqLworICAgICAgICB9CisgICAgfQorICAgIGlmICghKnApIHJldHVybiBGQUxTRTsKKworICAgIHN3aXRjaChwWzFdKQorICAgIHsKKyAgICAgICAgY2FzZSAwOiAgLyogdW51c2VkICovCisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIGNhc2UgMHhmZjogIC8qIG1vdmVhYmxlICovCisgICAgICAgICAgICBwICs9IDIgKyA2ICogKG9yZGluYWwgLSBjdXJPcmRpbmFsKTsKKyAgICAgICAgICAgICooV09SRCAqKShwICsgNCkgPSBvZmZzZXQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDogIC8qIGZpeGVkICovCisgICAgICAgICAgICBwICs9IDIgKyAzICogKG9yZGluYWwgLSBjdXJPcmRpbmFsKTsKKyAgICAgICAgICAgICooV09SRCAqKShwICsgMSkgPSBvZmZzZXQ7CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIFRSVUU7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgTU9EVUxFX0dldEVudHJ5UG9pbnROYW1lCisgKgorICogUmV0dXJuIHRoZSBlbnRyeSBwb2ludCBuYW1lIGZvciBhIGdpdmVuIG9yZGluYWwuCisgKiBVc2VkIG9ubHkgYnkgcmVsYXkgZGVidWdnaW5nLgorICogV2FybmluZzogcmV0dXJuZWQgcG9pbnRlciBpcyB0byBhIFBhc2NhbC10eXBlIHN0cmluZy4KKyAqLworTFBTVFIgTU9EVUxFX0dldEVudHJ5UG9pbnROYW1lKCBITU9EVUxFIGhNb2R1bGUsIFdPUkQgb3JkaW5hbCApCit7CisgICAgcmVnaXN0ZXIgY2hhciAqY3BudDsKKyAgICBORV9NT0RVTEUgKnBNb2R1bGU7CisKKyAgICBpZiAoIShwTW9kdWxlID0gKE5FX01PRFVMRSAqKUdsb2JhbExvY2soIGhNb2R1bGUgKSkpIHJldHVybiAwOworCisgICAgICAvKiBGaXJzdCBzZWFyY2ggdGhlIHJlc2lkZW50IG5hbWVzICovCisKKyAgICBjcG50ID0gKGNoYXIgKilwTW9kdWxlICsgcE1vZHVsZS0+bmFtZV90YWJsZTsKKyAgICB3aGlsZSAoKmNwbnQpCisgICAgeworICAgICAgICBjcG50ICs9ICpjcG50ICsgMSArIHNpemVvZihXT1JEKTsKKyAgICAgICAgaWYgKCooV09SRCAqKShjcG50ICsgKmNwbnQgKyAxKSA9PSBvcmRpbmFsKSByZXR1cm4gY3BudDsKKyAgICB9CisKKyAgICAgIC8qIE5vdyBzZWFyY2ggdGhlIG5vbi1yZXNpZGVudCBuYW1lcyB0YWJsZSAqLworCisgICAgaWYgKCFwTW9kdWxlLT5ucm5hbWVfaGFuZGxlKSByZXR1cm4gMDsgIC8qIE5vIG5vbi1yZXNpZGVudCB0YWJsZSAqLworICAgIGNwbnQgPSAoY2hhciAqKUdsb2JhbExvY2soIHBNb2R1bGUtPm5ybmFtZV9oYW5kbGUgKTsKKyAgICB3aGlsZSAoKmNwbnQpCisgICAgeworICAgICAgICBjcG50ICs9ICpjcG50ICsgMSArIHNpemVvZihXT1JEKTsKKyAgICAgICAgaWYgKCooV09SRCAqKShjcG50ICsgKmNwbnQgKyAxKSA9PSBvcmRpbmFsKSByZXR1cm4gY3BudDsKKyAgICB9CisgICAgcmV0dXJuIE5VTEw7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgTU9EVUxFX0dldE1vZHVsZU5hbWUKICAqLwogTFBTVFIgTU9EVUxFX0dldE1vZHVsZU5hbWUoIEhNT0RVTEUgaE1vZHVsZSApCkBAIC02MDIsMTAgKzc4OSwyMDggQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJICAgIE1PRFVMRV9GaW5kTW9kdWxlCisgKgorICogRmluZCBhIG1vZHVsZSBmcm9tIGEgcGF0aCBuYW1lLgorICovCitITU9EVUxFIE1PRFVMRV9GaW5kTW9kdWxlKCBMUENTVFIgcGF0aCApCit7CisgICAgSE1PRFVMRSBoTW9kdWxlID0gaEZpcnN0TW9kdWxlOworICAgIExQQ1NUUiBmaWxlbmFtZSwgZG90cHRyLCBtb2R1bGVwYXRoLCBtb2R1bGVuYW1lOworICAgIEJZVEUgbGVuLCAqbmFtZV90YWJsZTsKKworICAgIGlmICghKGZpbGVuYW1lID0gc3RycmNociggcGF0aCwgJ1xcJyApKSkgZmlsZW5hbWUgPSBwYXRoOworICAgIGlmICgoZG90cHRyID0gc3RycmNociggZmlsZW5hbWUsICcuJyApKSAhPSBOVUxMKQorICAgICAgICBsZW4gPSAoQllURSkoZG90cHRyIC0gZmlsZW5hbWUpOworICAgIGVsc2UgbGVuID0gc3RybGVuKCBmaWxlbmFtZSApOworCisgICAgd2hpbGUoaE1vZHVsZSkKKyAgICB7CisgICAgICAgIE5FX01PRFVMRSAqcE1vZHVsZSA9IChORV9NT0RVTEUgKilHbG9iYWxMb2NrKCBoTW9kdWxlICk7CisgICAgICAgIGlmICghcE1vZHVsZSkgYnJlYWs7CisgICAgICAgIG1vZHVsZXBhdGggPSAoKExPQURFREZJTEVJTkZPKikoKGNoYXIqKXBNb2R1bGUgKyBwTW9kdWxlLT5maWxlaW5mbykpLT5maWxlbmFtZTsKKyAgICAgICAgaWYgKCEobW9kdWxlbmFtZSA9IHN0cnJjaHIoIG1vZHVsZXBhdGgsICdcXCcgKSkpCisgICAgICAgICAgICBtb2R1bGVuYW1lID0gbW9kdWxlcGF0aDsKKyAgICAgICAgaWYgKCFzdHJjYXNlY21wKCBtb2R1bGVuYW1lLCBmaWxlbmFtZSApKSByZXR1cm4gaE1vZHVsZTsKKworICAgICAgICBuYW1lX3RhYmxlID0gKEJZVEUgKilwTW9kdWxlICsgcE1vZHVsZS0+bmFtZV90YWJsZTsKKyAgICAgICAgaWYgKCgqbmFtZV90YWJsZSA9PSBsZW4pICYmICFzdHJuY2FzZWNtcChmaWxlbmFtZSwgbmFtZV90YWJsZSsxLCBsZW4pKQorICAgICAgICAgICAgcmV0dXJuIGhNb2R1bGU7CisgICAgICAgIGhNb2R1bGUgPSBwTW9kdWxlLT5uZXh0OworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJICAgIE1PRFVMRV9GcmVlTW9kdWxlCisgKgorICogUmVtb3ZlIGEgbW9kdWxlIGZyb20gbWVtb3J5LgorICovCitzdGF0aWMgdm9pZCBNT0RVTEVfRnJlZU1vZHVsZSggSE1PRFVMRSBoTW9kdWxlICkKK3sKKyAgICBITU9EVUxFICpoUHJldk1vZHVsZTsKKyAgICBORV9NT0RVTEUgKnBNb2R1bGU7CisgICAgU0VHVEFCTEVFTlRSWSAqcFNlZ21lbnQ7CisgICAgV09SRCAqcE1vZFJlZjsKKyAgICBpbnQgaTsKKworICAgIGlmICghKHBNb2R1bGUgPSAoTkVfTU9EVUxFICopR2xvYmFsTG9jayggaE1vZHVsZSApKSkgcmV0dXJuOworCisgICAgLyogRklYTUU6IHNob3VsZCBjYWxsIHRoZSBleGl0IGNvZGUgZm9yIHRoZSBsaWJyYXJ5IGhlcmUgKi8KKworICAgICAgLyogUmVtb3ZlIGl0IGZyb20gdGhlIGxpbmtlZCBsaXN0ICovCisKKyAgICBoUHJldk1vZHVsZSA9ICZoRmlyc3RNb2R1bGU7CisgICAgd2hpbGUgKCpoUHJldk1vZHVsZSAmJiAoKmhQcmV2TW9kdWxlICE9IGhNb2R1bGUpKQorICAgIHsKKyAgICAgICAgaFByZXZNb2R1bGUgPSAmKChORV9NT0RVTEUgKilHbG9iYWxMb2NrKCAqaFByZXZNb2R1bGUgKSktPm5leHQ7CisgICAgfQorICAgIGlmICgqaFByZXZNb2R1bGUpICpoUHJldk1vZHVsZSA9IHBNb2R1bGUtPm5leHQ7CisKKyAgICAgIC8qIEZyZWUgYWxsIHRoZSBzZWdtZW50cyAqLworCisgICAgcFNlZ21lbnQgPSBORV9TRUdfVEFCTEUoIHBNb2R1bGUgKTsKKyAgICBmb3IgKGkgPSAxOyBpIDw9IHBNb2R1bGUtPnNlZ19jb3VudDsgaSsrLCBwU2VnbWVudCsrKQorICAgIHsKKyAgICAgICAgR2xvYmFsRnJlZSggcFNlZ21lbnQtPnNlbGVjdG9yICk7CisgICAgfQorCisgICAgICAvKiBGcmVlIHRoZSByZWZlcmVuY2VkIG1vZHVsZXMgKi8KKworICAgIHBNb2RSZWYgPSBORV9NT0RVTEVfVEFCTEUoIHBNb2R1bGUgKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgcE1vZHVsZS0+bW9kcmVmX2NvdW50OyBpKyssIHBNb2RSZWYrKykKKyAgICB7CisgICAgICAgIEZyZWVNb2R1bGUoICpwTW9kUmVmICk7CisgICAgfQorCisgICAgICAvKiBGcmVlIHRoZSBtb2R1bGUgc3RvcmFnZSAqLworCisgICAgaWYgKHBNb2R1bGUtPm5ybmFtZV9oYW5kbGUpIEdsb2JhbEZyZWUoIHBNb2R1bGUtPm5ybmFtZV9oYW5kbGUgKTsKKyAgICBpZiAocE1vZHVsZS0+ZGxsc190b19pbml0KSBHbG9iYWxGcmVlKCBwTW9kdWxlLT5kbGxzX3RvX2luaXQgKTsKKyAgICBHbG9iYWxGcmVlKCBoTW9kdWxlICk7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCSAgICBMb2FkTW9kdWxlICAgIChLRVJORUwuNDUpCiAgKi8KLUhJTlNUQU5DRSBNT0RVTEVfTG9hZE1vZHVsZSggTFBDU1RSIG5hbWUsIExQVk9JRCBwYXJhbUJsb2NrICkKK0hJTlNUQU5DRSBMb2FkTW9kdWxlKCBMUENTVFIgbmFtZSwgTFBWT0lEIHBhcmFtQmxvY2sgKQogeworICAgIEhNT0RVTEUgaE1vZHVsZTsKKyAgICBIQU5ETEUgaEluc3RhbmNlOworICAgIE5FX01PRFVMRSAqcE1vZHVsZTsKKyAgICBXT1JEICpwTW9kUmVmLCAqcERMTHM7CisgICAgaW50IGksIGZkOworCisgICAgaE1vZHVsZSA9IE1PRFVMRV9GaW5kTW9kdWxlKCBuYW1lICk7CisgICAgaWYgKCFoTW9kdWxlKSAgLyogV2UgaGF2ZSB0byBsb2FkIHRoZSBtb2R1bGUgKi8KKyAgICB7CisgICAgICAgIE9GU1RSVUNUIG9mczsKKyAgICAgICAgaWYgKHN0cmNociggbmFtZSwgJy8nICkpIG5hbWUgPSBET1NfR2V0RG9zRmlsZU5hbWUoIG5hbWUgKTsKKyAgICAgICAgaWYgKChmZCA9IE9wZW5GaWxlKCBuYW1lLCAmb2ZzLCBPRl9SRUFEICkpID09IC0xKQorICAgICAgICAgICAgcmV0dXJuIDI7ICAvKiBGaWxlIG5vdCBmb3VuZCAqLworCisgICAgICAgICAgLyogQ3JlYXRlIHRoZSBtb2R1bGUgc3RydWN0dXJlICovCisKKyAgICAgICAgaWYgKChoTW9kdWxlID0gTU9EVUxFX0xvYWRFeGVIZWFkZXIoIGZkLCAmb2ZzICkpIDwgMzIpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNsb3NlKCBmZCApOworICAgICAgICAgICAgZnByaW50Ziggc3RkZXJyLCAiTG9hZE1vZHVsZTogY2FuJ3QgbG9hZCAnJXMnLCBlcnJvcj0lZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgIG5hbWUsIGhNb2R1bGUgKTsKKyAgICAgICAgICAgIHJldHVybiBoTW9kdWxlOworICAgICAgICB9CisgICAgICAgIHBNb2R1bGUgPSAoTkVfTU9EVUxFICopR2xvYmFsTG9jayggaE1vZHVsZSApOworCisgICAgICAgICAgLyogQWxsb2NhdGUgdGhlIHNlZ21lbnRzIGZvciB0aGlzIG1vZHVsZSAqLworCisgICAgICAgIE1PRFVMRV9DcmVhdGVTZWdtZW50cyggaE1vZHVsZSApOworCisgICAgICAgICAgLyogTG9hZCB0aGUgcmVmZXJlbmNlZCBETExzICovCisKKyAgICAgICAgcE1vZFJlZiA9IChXT1JEICopKChjaGFyICopcE1vZHVsZSArIHBNb2R1bGUtPm1vZHJlZl90YWJsZSk7CisgICAgICAgIHBETExzID0gKFdPUkQgKilHbG9iYWxMb2NrKCBwTW9kdWxlLT5kbGxzX3RvX2luaXQgKTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHBNb2R1bGUtPm1vZHJlZl9jb3VudDsgaSsrLCBwTW9kUmVmKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGNoYXIgYnVmZmVyWzI1Nl07CisgICAgICAgICAgICBCWVRFICpwc3RyID0gKEJZVEUgKilwTW9kdWxlICsgcE1vZHVsZS0+aW1wb3J0X3RhYmxlICsgKnBNb2RSZWY7CisgICAgICAgICAgICBtZW1jcHkoIGJ1ZmZlciwgcHN0ciArIDEsICpwc3RyICk7CisgICAgICAgICAgICBzdHJjcHkoIGJ1ZmZlciArICpwc3RyLCAiLmRsbCIgKTsKKyAgICAgICAgICAgIGRwcmludGZfbW9kdWxlKCBzdGRkZWIsICJMb2FkaW5nICclcydcbiIsIGJ1ZmZlciApOworICAgICAgICAgICAgaWYgKCEoKnBNb2RSZWYgPSBNT0RVTEVfRmluZE1vZHVsZSggYnVmZmVyICkpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIElmIHRoZSBETEwgaXMgbm90IGxvYWRlZCB5ZXQsIGxvYWQgaXQgYW5kIHN0b3JlICovCisgICAgICAgICAgICAgICAgLyogaXRzIGhhbmRsZSBpbiB0aGUgbGlzdCBvZiBETExzIHRvIGluaXRpYWxpemUuICAgKi8KKyAgICAgICAgICAgICAgICBITU9EVUxFIGhETEw7CisKKyAgICAgICAgICAgICAgICBpZiAoKGhETEwgPSBMb2FkTW9kdWxlKCBidWZmZXIsIChMUFZPSUQpLTEgKSkgPT0gMikgIC8qIGZpbGUgbm90IGZvdW5kICovCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjaGFyICpwOworCisgICAgICAgICAgICAgICAgICAgIC8qIFRyeSB3aXRoIHByZXBlbmRpbmcgdGhlIHBhdGggb2YgdGhlIGN1cnJlbnQgbW9kdWxlICovCisgICAgICAgICAgICAgICAgICAgIEdldE1vZHVsZUZpbGVOYW1lKCBoTW9kdWxlLCBidWZmZXIsIDI1NiApOworICAgICAgICAgICAgICAgICAgICBpZiAoIShwID0gc3RycmNociggYnVmZmVyLCAnXFwnICkpKSBwID0gYnVmZmVyOworICAgICAgICAgICAgICAgICAgICBtZW1jcHkoIHAgKyAxLCBwc3RyICsgMSwgKnBzdHIgKTsKKyAgICAgICAgICAgICAgICAgICAgc3RyY3B5KCBwICsgMSArICpwc3RyLCAiLmRsbCIgKTsKKyAgICAgICAgICAgICAgICAgICAgaERMTCA9IExvYWRNb2R1bGUoIGJ1ZmZlciwgKExQVk9JRCktMSApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoaERMTCA8IDMyKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZnByaW50Ziggc3RkZXJyLCAiQ291bGQgbm90IGxvYWQgJyVzJyByZXF1aXJlZCBieSAnJXMnLCBlcnJvciA9ICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIsIG5hbWUsIGhETEwgKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDI7ICAvKiBmaWxlIG5vdCBmb3VuZCAqLworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAqcE1vZFJlZiA9IEdldEV4ZVB0ciggaERMTCApOworICAgICAgICAgICAgICAgICpwRExMcysrID0gKnBNb2RSZWY7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlICAvKiBJbmNyZW1lbnQgdGhlIHJlZmVyZW5jZSBjb3VudCBvZiB0aGUgRExMICovCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTkVfTU9EVUxFICpwT2xkRExMID0gKE5FX01PRFVMRSAqKUdsb2JhbExvY2soICpwTW9kUmVmICk7CisgICAgICAgICAgICAgICAgaWYgKHBPbGRETEwpIHBPbGRETEwtPmNvdW50Kys7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAgIC8qIExvYWQgdGhlIHNlZ21lbnRzIChleGNlcHQgdGhlIERHUk9VUCkgKi8KKworICAgICAgICBmb3IgKGkgPSAxOyBpIDw9IHBNb2R1bGUtPnNlZ19jb3VudDsgaSsrKQorICAgICAgICAgICAgaWYgKGkgIT0gcE1vZHVsZS0+ZGdyb3VwKSBORV9Mb2FkU2VnbWVudCggaE1vZHVsZSwgaSApOworCisgICAgICAgICAgLyogQ3JlYXRlIGFuIGluc3RhbmNlIGZvciB0aGlzIG1vZHVsZSAqLworCisgICAgICAgIGhJbnN0YW5jZSA9IE1PRFVMRV9NYWtlTmV3SW5zdGFuY2UoIGhNb2R1bGUsIChMT0FEUEFSQU1TKilwYXJhbUJsb2NrICk7CisKKyAgICAgICAgICAvKiBGaXh1cCB0aGUgZnVuY3Rpb25zIHByb2xvZ3MgKi8KKworICAgICAgICBORV9GaXh1cFByb2xvZ3MoIGhNb2R1bGUgKTsKKworICAgICAgICAgIC8qIE1ha2Ugc3VyZSB0aGUgdXNhZ2UgY291bnQgaXMgMSBvbiB0aGUgZmlyc3QgbG9hZGluZyBvZiAgKi8KKyAgICAgICAgICAvKiB0aGUgbW9kdWxlLCBldmVuIGlmIGl0IGNvbnRhaW5zIGNpcmN1bGFyIERMTCByZWZlcmVuY2VzICovCisKKyAgICAgICAgcE1vZHVsZS0+Y291bnQgPSAxOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBwTW9kdWxlID0gKE5FX01PRFVMRSAqKUdsb2JhbExvY2soIGhNb2R1bGUgKTsKKyAgICAgICAgaEluc3RhbmNlID0gTU9EVUxFX01ha2VOZXdJbnN0YW5jZSggaE1vZHVsZSwgKExPQURQQVJBTVMqKXBhcmFtQmxvY2sgKTsKKyAgICAgICAgcE1vZHVsZS0+Y291bnQrKzsKKyAgICB9CisKKyAgICByZXR1cm4gaEluc3RhbmNlOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgkgICAgRnJlZU1vZHVsZSAgICAoS0VSTkVMLjQ2KQorICovCitCT09MIEZyZWVNb2R1bGUoIEhBTkRMRSBoTW9kdWxlICkKK3sKKyAgICBORV9NT0RVTEUgKnBNb2R1bGU7CisKKyAgICBoTW9kdWxlID0gR2V0RXhlUHRyKCBoTW9kdWxlICk7ICAvKiBJbiBjYXNlIHdlIHdlcmUgcGFzc2VkIGFuIGhJbnN0YW5jZSAqLworICAgIGlmICghKHBNb2R1bGUgPSAoTkVfTU9EVUxFICopR2xvYmFsTG9jayggaE1vZHVsZSApKSkgcmV0dXJuIEZBTFNFOworCisgICAgaWYgKC0tcE1vZHVsZS0+Y291bnQgPT0gMCkgTU9EVUxFX0ZyZWVNb2R1bGUoIGhNb2R1bGUgKTsKKyAgICByZXR1cm4gVFJVRTsKIH0KIAogCkBAIC02MTQsMjEgKzk5OSwxNSBAQAogICovCiBITU9EVUxFIEdldE1vZHVsZUhhbmRsZSggTFBDU1RSIG5hbWUgKQogewotICAgIGNoYXIgYnVmZmVyWzE2XTsKLSAgICBCWVRFIGxlbjsKLSAgICBITU9EVUxFIGhNb2R1bGU7CisgICAgQllURSBsZW4gPSBzdHJsZW4obmFtZSk7CisgICAgSE1PRFVMRSBoTW9kdWxlID0gaEZpcnN0TW9kdWxlOwogCi0gICAgc3RybmNweSggYnVmZmVyLCBuYW1lLCAxNSApOwotICAgIGJ1ZmZlclsxNV0gPSAnXDAnOwotICAgIGxlbiA9IHN0cmxlbihidWZmZXIpOwotICAgIEFuc2lVcHBlciggYnVmZmVyICk7Ci0KLSAgICBoTW9kdWxlID0gaEZpcnN0TW9kdWxlOwogICAgIHdoaWxlKCBoTW9kdWxlICkKICAgICB7CiAgICAgICAgIE5FX01PRFVMRSAqcE1vZHVsZSA9IChORV9NT0RVTEUgKilHbG9iYWxMb2NrKCBoTW9kdWxlICk7CiAgICAgICAgIGNoYXIgKnBuYW1lID0gKGNoYXIgKilwTW9kdWxlICsgcE1vZHVsZS0+bmFtZV90YWJsZTsKLSAgICAgICAgaWYgKCgoQllURSkqcG5hbWUgPT0gbGVuKSAmJiAhbWVtY21wKCBwbmFtZSsxLCBidWZmZXIsIGxlbiApKSBicmVhazsKKyAgICAgICAgaWYgKCgoQllURSkqcG5hbWUgPT0gbGVuKSAmJiAhc3RybmNhc2VjbXAoIHBuYW1lKzEsIG5hbWUsIGxlbiApKQorICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGhNb2R1bGUgPSBwTW9kdWxlLT5uZXh0OwogICAgIH0KICAgICBkcHJpbnRmX21vZHVsZSggc3RkZGViLCAiR2V0TW9kdWxlSGFuZGxlKCclcycpOiByZXR1cm5pbmcgJTA0eFxuIiwKQEAgLTY2OSw2ICsxMDQ4LDEyMiBAQAogfQogCiAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIExvYWRMaWJyYXJ5ICAgKEtFUk5FTC45NSkKKyAqLworSEFORExFIExvYWRMaWJyYXJ5KCBMUENTVFIgbGlibmFtZSApCit7CisgICAgSEFORExFIGhhbmRsZTsKKworICAgIGRwcmludGZfbW9kdWxlKCBzdGRkZWIsICJMb2FkTGlicmFyeTogKCUwOHgpICVzXG4iLCAoaW50KWxpYm5hbWUsIGxpYm5hbWUpOworICAgIGhhbmRsZSA9IExvYWRNb2R1bGUoIGxpYm5hbWUsIChMUFZPSUQpLTEgKTsKKyAgICBpZiAoaGFuZGxlID09IDIpICAvKiBmaWxlIG5vdCBmb3VuZCAqLworICAgIHsKKyAgICAgICAgY2hhciBidWZmZXJbMjU2XTsKKyAgICAgICAgc3RyY3B5KCBidWZmZXIsIGxpYm5hbWUgKTsKKyAgICAgICAgc3RyY2F0KCBidWZmZXIsICIuZGxsIiApOworICAgICAgICBoYW5kbGUgPSBMb2FkTW9kdWxlKCBidWZmZXIsIChMUFZPSUQpLTEgKTsKKyAgICB9CisgICAgaWYgKGhhbmRsZSA+PSAzMikgTkVfSW5pdGlhbGl6ZURMTHMoIGhhbmRsZSApOworICAgIHJldHVybiBoYW5kbGU7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgRnJlZUxpYnJhcnkgICAoS0VSTkVMLjk2KQorICovCit2b2lkIEZyZWVMaWJyYXJ5KCBIQU5ETEUgaGFuZGxlICkKK3sKKyAgICBkcHJpbnRmX21vZHVsZSggc3RkZGViLCJGcmVlTGlicmFyeTogJTA0eFxuIiwgaGFuZGxlICk7CisgICAgRnJlZU1vZHVsZSggaGFuZGxlICk7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgV2luRXhlYyAgIChLRVJORUwuMTY2KQorICovCitIQU5ETEUgV2luRXhlYyggTFBTVFIgbHBDbWRMaW5lLCBXT1JEIG5DbWRTaG93ICkKK3sKKyAgICBMT0FEUEFSQU1TIHBhcmFtczsKKyAgICBITE9DQUwgY21kU2hvd0hhbmRsZSwgY21kTGluZUhhbmRsZTsKKyAgICBIQU5ETEUgaGFuZGxlOworICAgIFdPUkQgKmNtZFNob3dQdHI7CisgICAgY2hhciAqcCwgKmNtZGxpbmUsIGZpbGVuYW1lWzI1Nl07CisKKyAgICBpZiAoIShjbWRTaG93SGFuZGxlID0gR2xvYmFsQWxsb2MoIDAsIDIgKiBzaXplb2YoV09SRCkgKSkpIHJldHVybiAwOworICAgIGlmICghKGNtZExpbmVIYW5kbGUgPSBHbG9iYWxBbGxvYyggMCwgMjU2ICkpKSByZXR1cm4gMDsKKworICAgICAgLyogU3RvcmUgbkNtZFNob3cgKi8KKworICAgIGNtZFNob3dQdHIgPSAoV09SRCAqKUdsb2JhbExvY2soIGNtZFNob3dIYW5kbGUgKTsKKyAgICBjbWRTaG93UHRyWzBdID0gMjsKKyAgICBjbWRTaG93UHRyWzFdID0gbkNtZFNob3c7CisKKyAgICAgIC8qIEJ1aWxkIHRoZSBmaWxlbmFtZSBhbmQgY29tbWFuZC1saW5lICovCisKKyAgICBjbWRsaW5lID0gKGNoYXIgKilHbG9iYWxMb2NrKCBjbWRMaW5lSGFuZGxlICk7CisgICAgc3RybmNweSggZmlsZW5hbWUsIGxwQ21kTGluZSwgMjU2ICk7CisgICAgZmlsZW5hbWVbMjU1XSA9ICdcMCc7CisgICAgZm9yIChwID0gZmlsZW5hbWU7ICpwICYmICgqcCAhPSAnICcpICYmICgqcCAhPSAnXHQnKTsgcCsrKTsKKyAgICBpZiAoKnApCisgICAgeworICAgICAgICBzdHJuY3B5KCBjbWRsaW5lLCBwICsgMSwgMTI4ICk7CisgICAgICAgIGNtZGxpbmVbMTI3XSA9ICdcMCc7CisgICAgfQorICAgIGVsc2UgY21kbGluZVswXSA9ICdcMCc7CisgICAgKnAgPSAnXDAnOworCisgICAgICAvKiBOb3cgbG9hZCB0aGUgZXhlY3V0YWJsZSBmaWxlICovCisKKyAgICBwYXJhbXMuaEVudmlyb25tZW50ID0gU0VMRUNUT1JPRiggR2V0RE9TRW52aXJvbm1lbnQoKSApOworICAgIHBhcmFtcy5jbWRMaW5lICA9IFdJTjE2X0dsb2JhbExvY2soIGNtZExpbmVIYW5kbGUgKTsKKyAgICBwYXJhbXMuc2hvd0NtZCAgPSBXSU4xNl9HbG9iYWxMb2NrKCBjbWRTaG93SGFuZGxlICk7CisgICAgcGFyYW1zLnJlc2VydmVkID0gMDsKKyAgICBoYW5kbGUgPSBMb2FkTW9kdWxlKCBmaWxlbmFtZSwgJnBhcmFtcyApOworICAgIGlmIChoYW5kbGUgPT0gMikgIC8qIGZpbGUgbm90IGZvdW5kICovCisgICAgeworICAgICAgICBzdHJjYXQoIGZpbGVuYW1lLCAiLmV4ZSIgKTsKKyAgICAgICAgaGFuZGxlID0gTG9hZE1vZHVsZSggZmlsZW5hbWUsICZwYXJhbXMgKTsKKyAgICB9CisKKyAgICBHbG9iYWxGcmVlKCBjbWRTaG93SGFuZGxlICk7CisgICAgR2xvYmFsRnJlZSggY21kTGluZUhhbmRsZSApOworICAgIHJldHVybiBoYW5kbGU7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgR2V0UHJvY0FkZHJlc3MgICAoS0VSTkVMLjUwKQorICovCitGQVJQUk9DIEdldFByb2NBZGRyZXNzKCBIQU5ETEUgaE1vZHVsZSwgU0VHUFRSIG5hbWUgKQoreworICAgIFdPUkQgb3JkaW5hbDsKKyAgICBTRUdQVFIgcmV0OworCisgICAgaWYgKCFoTW9kdWxlKSBoTW9kdWxlID0gR2V0Q3VycmVudFRhc2soKTsKKyAgICBoTW9kdWxlID0gR2V0RXhlUHRyKCBoTW9kdWxlICk7CisKKyAgICBpZiAoSElXT1JEKG5hbWUpICE9IDApCisgICAgeworICAgICAgICBvcmRpbmFsID0gTU9EVUxFX0dldE9yZGluYWwoIGhNb2R1bGUsIChMUFNUUilQVFJfU0VHX1RPX0xJTihuYW1lKSApOworICAgICAgICBkcHJpbnRmX21vZHVsZSggc3RkZGViLCAiR2V0UHJvY0FkZHJlc3M6ICUwNHggJyVzJ1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGhNb2R1bGUsIChMUFNUUilQVFJfU0VHX1RPX0xJTihuYW1lKSApOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBvcmRpbmFsID0gTE9XT1JEKG5hbWUpOworICAgICAgICBkcHJpbnRmX21vZHVsZSggc3RkZGViLCAiR2V0UHJvY0FkZHJlc3M6ICUwNHggJTA0eFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGhNb2R1bGUsIG9yZGluYWwgKTsKKyAgICB9CisgICAgaWYgKCFvcmRpbmFsKSByZXR1cm4gKEZBUlBST0MpMDsKKworICAgIHJldCA9IE1PRFVMRV9HZXRFbnRyeVBvaW50KCBoTW9kdWxlLCBvcmRpbmFsICk7CisKKyAgICBkcHJpbnRmX21vZHVsZSggc3RkZGViLCAiR2V0UHJvY0FkZHJlc3M6IHJldHVybmluZyAlMDhseFxuIiwgcmV0ICk7CisgICAgcmV0dXJuIChGQVJQUk9DKXJldDsKK30KKworCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoJICAgIE1vZHVsZUZpcnN0ICAgIChUT09MSEVMUC41OSkKICAqLwpkaWZmIC0tZ2l0IGEvbG9hZGVyL25lX2ltYWdlLmMgYi9sb2FkZXIvbmVfaW1hZ2UuYwppbmRleCA5MmUzN2Y1Li4xYTE0ZWYyIDEwMDY0NAotLS0gYS9sb2FkZXIvbmVfaW1hZ2UuYworKysgYi9sb2FkZXIvbmVfaW1hZ2UuYwpAQCAtMTgsMTIgKzE4LDggQEAKICNpbmNsdWRlICJkbGxzLmgiCiAjaW5jbHVkZSAid2luZG93cy5oIgogI2luY2x1ZGUgImFyY2guaCIKLSNpbmNsdWRlICJsaWJyYXJ5LmgiCi0jaW5jbHVkZSAiaWYxNjMyLmgiCiAjaW5jbHVkZSAic2VsZWN0b3JzLmgiCiAjaW5jbHVkZSAiY2FsbGJhY2suaCIKLSNpbmNsdWRlICJuZV9pbWFnZS5oIgotI2luY2x1ZGUgInByb3RvdHlwZXMuaCIKICNpbmNsdWRlICJtb2R1bGUuaCIKICNpbmNsdWRlICJzdGFja2ZyYW1lLmgiCiAjaW5jbHVkZSAic3RkZGVidWcuaCIKQEAgLTMzLDcgKzI5LDcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIE5FX0xvYWRTZWdtZW50CiAgKi8KLXN0YXRpYyBCT09MIE5FX0xvYWRTZWdtZW50KCBITU9EVUxFIGhNb2R1bGUsIFdPUkQgc2VnbnVtICkKK0JPT0wgTkVfTG9hZFNlZ21lbnQoIEhNT0RVTEUgaE1vZHVsZSwgV09SRCBzZWdudW0gKQogewogICAgIE5FX01PRFVMRSAqcE1vZHVsZTsKICAgICBTRUdUQUJMRUVOVFJZICpwU2VnVGFibGUsICpwU2VnOwpAQCAtNDIsOSArMzgsOSBAQAogICAgIERXT1JEIGFkZHJlc3M7CiAgICAgaW50IGZkOwogICAgIHN0cnVjdCByZWxvY2F0aW9uX2VudHJ5X3MgKnJlcCwgKnJlbG9jX2VudHJpZXM7Ci0gICAgY2hhciAqZGxsX25hbWUsICpmdW5jX25hbWU7CisgICAgQllURSAqZnVuY19uYW1lOwogCi0gICAgY2hhciBidWZmZXJbMTAwXSwgYnVmZmVyMlsxMDBdOworICAgIGNoYXIgYnVmZmVyWzEwMF07CiAgICAgaW50IG9yZGluYWwsIGFkZGl0aXZlOwogICAgIHVuc2lnbmVkIHNob3J0ICpzcDsKIApAQCAtNjYsNiArNjIsMTIgQEAKICAgICByZWFkKCBmZCwgJmNvdW50LCBzaXplb2YoY291bnQpICk7CiAgICAgaWYgKCFjb3VudCkgcmV0dXJuIFRSVUU7CiAKKyAgICBkcHJpbnRmX2ZpeHVwKCBzdGRkZWIsICJGaXh1cHMgZm9yICUqLipzLCBzZWdtZW50ICVkLCBzZWxlY3RvciAlMDR4XG4iLAorICAgICAgICAgICAgICAgICAgICooKEJZVEUgKilwTW9kdWxlICsgcE1vZHVsZS0+bmFtZV90YWJsZSksCisgICAgICAgICAgICAgICAgICAgKigoQllURSAqKXBNb2R1bGUgKyBwTW9kdWxlLT5uYW1lX3RhYmxlKSwKKyAgICAgICAgICAgICAgICAgICAoY2hhciAqKXBNb2R1bGUgKyBwTW9kdWxlLT5uYW1lX3RhYmxlICsgMSwKKyAgICAgICAgICAgICAgICAgICBzZWdudW0sIHBTZWctPnNlbGVjdG9yICk7CisKICAgICByZWxvY19lbnRyaWVzID0gKHN0cnVjdCByZWxvY2F0aW9uX2VudHJ5X3MgKiltYWxsb2MoY291bnQgKiBzaXplb2Yoc3RydWN0IHJlbG9jYXRpb25fZW50cnlfcykpOwogICAgIGlmIChyZWFkKCBmZCwgcmVsb2NfZW50cmllcywgY291bnQgKiBzaXplb2Yoc3RydWN0IHJlbG9jYXRpb25fZW50cnlfcykpICE9CiAgICAgICAgICAgICBjb3VudCAqIHNpemVvZihzdHJ1Y3QgcmVsb2NhdGlvbl9lbnRyeV9zKSkKQEAgLTkzLDQyICs5NSw2MiBAQAogCXsKIAkgIGNhc2UgTkVfUkVMVFlQRV9PUkRJTkFMOgogICAgICAgICAgICAgbW9kdWxlID0gcE1vZHVsZVRhYmxlW3JlcC0+dGFyZ2V0MS0xXTsKLSAgICAgICAgICAgIGRsbF9uYW1lID0gKGNoYXIgKilwTW9kdWxlICsgcE1vZHVsZS0+aW1wb3J0X3RhYmxlICsgbW9kdWxlOwotICAgICAgICAgICAgbWVtY3B5KCBidWZmZXIsIGRsbF9uYW1lKzEsICpkbGxfbmFtZSApOwotICAgICAgICAgICAgYnVmZmVyWypkbGxfbmFtZV0gPSAnXDAnOwotICAgICAgICAgICAgZGxsX25hbWUgPSBidWZmZXI7Ci0gICAgICAgICAgICBtb2R1bGUgPSBHZXRNb2R1bGVIYW5kbGUoIGRsbF9uYW1lICk7Ci0KIAkgICAgb3JkaW5hbCA9IHJlcC0+dGFyZ2V0MjsKICAgICAgICAgICAgIGFkZHJlc3MgPSBNT0RVTEVfR2V0RW50cnlQb2ludCggbW9kdWxlLCBvcmRpbmFsICk7Ci0gICAgICAgICAgICBpZiAoIWFkZHJlc3MpIGZwcmludGYoIHN0ZGVyciwgIldhcm5pbmc6IG5vIGhhbmRsZXIgZm9yICVzLiVkLCBzZXR0aW5nIHRvIDA6MFxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkbGxfbmFtZSwgb3JkaW5hbCApOwotCi0JICAgIGRwcmludGZfZml4dXAoc3RkZGViLCIlZDogJXMuJWQ6ICUwNHg6JTA0eFxuIiwgaSArIDEsIAotICAgICAgICAgICAgICAgICAgICAgICAgZGxsX25hbWUsIG9yZGluYWwsIEhJV09SRChhZGRyZXNzKSwgTE9XT1JEKGFkZHJlc3MpICk7CisgICAgICAgICAgICBpZiAoIWFkZHJlc3MpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTkVfTU9EVUxFICpwVGFyZ2V0ID0gKE5FX01PRFVMRSAqKUdsb2JhbExvY2soIG1vZHVsZSApOworICAgICAgICAgICAgICAgIGlmICghcFRhcmdldCkKKyAgICAgICAgICAgICAgICAgICAgZnByaW50Ziggc3RkZXJyLCAiTW9kdWxlIG5vdCBmb3VuZDogJTA0eCwgcmVmZXJlbmNlICVkIG9mIG1vZHVsZSAlKi4qc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlLCByZXAtPnRhcmdldDEsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKChCWVRFICopcE1vZHVsZSArIHBNb2R1bGUtPm5hbWVfdGFibGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKChCWVRFICopcE1vZHVsZSArIHBNb2R1bGUtPm5hbWVfdGFibGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhciAqKXBNb2R1bGUgKyBwTW9kdWxlLT5uYW1lX3RhYmxlICsgMSApOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgZnByaW50Ziggc3RkZXJyLCAiV2FybmluZzogbm8gaGFuZGxlciBmb3IgJSouKnMuJWQsIHNldHRpbmcgdG8gMDowXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICooKEJZVEUgKilwVGFyZ2V0ICsgcFRhcmdldC0+bmFtZV90YWJsZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKigoQllURSAqKXBUYXJnZXQgKyBwVGFyZ2V0LT5uYW1lX3RhYmxlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhciAqKXBUYXJnZXQgKyBwVGFyZ2V0LT5uYW1lX3RhYmxlICsgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmRpbmFsICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZGVidWdnaW5nX2ZpeHVwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIE5FX01PRFVMRSAqcFRhcmdldCA9IChORV9NT0RVTEUgKilHbG9iYWxMb2NrKCBtb2R1bGUgKTsKKyAgICAgICAgICAgICAgICBmcHJpbnRmKCBzdGRkZWIsIiVkOiAlKi4qcy4lZD0lMDR4OiUwNHhcbiIsIGkgKyAxLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAqKChCWVRFICopcFRhcmdldCArIHBUYXJnZXQtPm5hbWVfdGFibGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICooKEJZVEUgKilwVGFyZ2V0ICsgcFRhcmdldC0+bmFtZV90YWJsZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIgKilwVGFyZ2V0ICsgcFRhcmdldC0+bmFtZV90YWJsZSArIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgb3JkaW5hbCwgSElXT1JEKGFkZHJlc3MpLCBMT1dPUkQoYWRkcmVzcykgKTsKKyAgICAgICAgICAgIH0KIAkgICAgYnJlYWs7CiAJICAgIAogCSAgY2FzZSBORV9SRUxUWVBFX05BTUU6CiAgICAgICAgICAgICBtb2R1bGUgPSBwTW9kdWxlVGFibGVbcmVwLT50YXJnZXQxLTFdOwotICAgICAgICAgICAgZGxsX25hbWUgPSAoY2hhciAqKXBNb2R1bGUgKyBwTW9kdWxlLT5pbXBvcnRfdGFibGUgKyBtb2R1bGU7Ci0gICAgICAgICAgICBtZW1jcHkoIGJ1ZmZlciwgZGxsX25hbWUrMSwgKmRsbF9uYW1lICk7Ci0gICAgICAgICAgICBidWZmZXJbKmRsbF9uYW1lXSA9ICdcMCc7Ci0gICAgICAgICAgICBkbGxfbmFtZSA9IGJ1ZmZlcjsKLSAgICAgICAgICAgIG1vZHVsZSA9IEdldE1vZHVsZUhhbmRsZSggZGxsX25hbWUgKTsKLQogICAgICAgICAgICAgZnVuY19uYW1lID0gKGNoYXIgKilwTW9kdWxlICsgcE1vZHVsZS0+aW1wb3J0X3RhYmxlICsgcmVwLT50YXJnZXQyOwotICAgICAgICAgICAgbWVtY3B5KCBidWZmZXIyLCBmdW5jX25hbWUrMSwgKmZ1bmNfbmFtZSApOwotICAgICAgICAgICAgYnVmZmVyMlsqZnVuY19uYW1lXSA9ICdcMCc7Ci0gICAgICAgICAgICBmdW5jX25hbWUgPSBidWZmZXIyOworICAgICAgICAgICAgbWVtY3B5KCBidWZmZXIsIGZ1bmNfbmFtZSsxLCAqZnVuY19uYW1lICk7CisgICAgICAgICAgICBidWZmZXJbKmZ1bmNfbmFtZV0gPSAnXDAnOworICAgICAgICAgICAgZnVuY19uYW1lID0gYnVmZmVyOwogICAgICAgICAgICAgb3JkaW5hbCA9IE1PRFVMRV9HZXRPcmRpbmFsKCBtb2R1bGUsIGZ1bmNfbmFtZSApOwogCiAgICAgICAgICAgICBhZGRyZXNzID0gTU9EVUxFX0dldEVudHJ5UG9pbnQoIG1vZHVsZSwgb3JkaW5hbCApOwogCi0gICAgICAgICAgICBpZiAoIWFkZHJlc3MpIGZwcmludGYoIHN0ZGVyciwgIldhcm5pbmc6IG5vIGhhbmRsZXIgZm9yICVzLiVzLCBzZXR0aW5nIHRvIDA6MFxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkbGxfbmFtZSwgZnVuY19uYW1lICk7Ci0KLSAgICAgICAgICAgIGRwcmludGZfZml4dXAoc3RkZGViLCIlZDogJXMuJXM6ICUwNHg6JTA0eFxuIiwgaSArIDEsIAotICAgICAgICAgICAgICAgICAgICAgICBkbGxfbmFtZSwgZnVuY19uYW1lLCBISVdPUkQoYWRkcmVzcyksIExPV09SRChhZGRyZXNzKSApOworICAgICAgICAgICAgaWYgKCFhZGRyZXNzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIE5FX01PRFVMRSAqcFRhcmdldCA9IChORV9NT0RVTEUgKilHbG9iYWxMb2NrKCBtb2R1bGUgKTsKKyAgICAgICAgICAgICAgICBmcHJpbnRmKCBzdGRlcnIsICJXYXJuaW5nOiBubyBoYW5kbGVyIGZvciAlKi4qcy4lcywgc2V0dGluZyB0byAwOjBcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAqKChCWVRFICopcFRhcmdldCArIHBUYXJnZXQtPm5hbWVfdGFibGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgKigoQllURSAqKXBUYXJnZXQgKyBwVGFyZ2V0LT5uYW1lX3RhYmxlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyICopcFRhcmdldCArIHBUYXJnZXQtPm5hbWVfdGFibGUgKyAxLCBmdW5jX25hbWUgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChkZWJ1Z2dpbmdfZml4dXApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTkVfTU9EVUxFICpwVGFyZ2V0ID0gKE5FX01PRFVMRSAqKUdsb2JhbExvY2soIG1vZHVsZSApOworICAgICAgICAgICAgICAgIGZwcmludGYoIHN0ZGRlYiwiJWQ6ICUqLipzLiVzPSUwNHg6JTA0eFxuIiwgaSArIDEsIAorICAgICAgICAgICAgICAgICAgICAgICAgICooKEJZVEUgKilwVGFyZ2V0ICsgcFRhcmdldC0+bmFtZV90YWJsZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgKigoQllURSAqKXBUYXJnZXQgKyBwVGFyZ2V0LT5uYW1lX3RhYmxlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhciAqKXBUYXJnZXQgKyBwVGFyZ2V0LT5uYW1lX3RhYmxlICsgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jX25hbWUsIEhJV09SRChhZGRyZXNzKSwgTE9XT1JEKGFkZHJlc3MpICk7CisgICAgICAgICAgICB9CiAJICAgIGJyZWFrOwogCSAgICAKIAkgIGNhc2UgTkVfUkVMVFlQRV9JTlRFUk5BTDoKQEAgLTE3MywxNyArMTk1LDYgQEAKIAkgICAgcmV0dXJuIEZBTFNFOwogCX0KIAotICAgICAgICAvKiBJJ20gbm90IHN1cmUgd2h5IGEgRExMIGVudHJ5IHBvaW50IGZpeHVwIGNvdWxkIGJlIGFkZGl0aXZlLgotICAgICAgICAgICBPbGQgY29kZSB1c2VkIHRvIGlnbm9yZSBhZGRpdGl2ZSBpZiB0aGUgdGFyZ2V0IGlzIGEgYnVpbHQtaW4KLSAgICAgICAgICAgRExMLiBUaGlzIGRvZXNuJ3Qgc2VlbSB0byB3b3JrIGZvciBfX0FIU0hJRlQgKi8KLSNpZiAwCi0gICAgICAgIGlmIChhZGRpdGl2ZSAmJiBGaW5kRExMVGFibGUoZGxsX25hbWUpICE9IE5VTEwpCi0gICAgICAgICAgICBkcHJpbnRmX2ZpeHVwKHN0ZGRlYiwiQWRkaXRpdmUgZm9yIGJ1aWx0aW4/Pz9cbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIiVkOiBBRERSIFRZUEUgJWQsIFRZUEUgJWQsIE9GRlNFVCAlMDR4LCAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICJUQVJHRVQgJTA0eCAlMDR4XG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICBpKzEsIHJlcC0+YWRkcmVzc190eXBlLCByZXAtPnJlbG9jYXRpb25fdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwLT5vZmZzZXQsIHJlcC0+dGFyZ2V0MSwgcmVwLT50YXJnZXQyKTsKLSNlbmRpZgogCW9mZnNldCAgPSByZXAtPm9mZnNldDsKIAogCXN3aXRjaCAocmVwLT5hZGRyZXNzX3R5cGUpCkBAIC0yNjMsNyArMjc0LDcgQEAKICAqCiAgKiBGaXh1cCB0aGUgZXhwb3J0ZWQgZnVuY3Rpb25zIHByb2xvZ3MuCiAgKi8KLXN0YXRpYyB2b2lkIE5FX0ZpeHVwUHJvbG9ncyggSE1PRFVMRSBoTW9kdWxlICkKK3ZvaWQgTkVfRml4dXBQcm9sb2dzKCBITU9EVUxFIGhNb2R1bGUgKQogewogICAgIE5FX01PRFVMRSAqcE1vZHVsZTsKICAgICBTRUdUQUJMRUVOVFJZICpwU2VnVGFibGU7CkBAIC0zMzMsMTUgKzM0NCwxMiBAQAogfQogCiAKLWludCBORV91bmxvYWRJbWFnZShzdHJ1Y3Qgd19maWxlcyAqd3BudCkKLXsKLQlkcHJpbnRmX2ZpeHVwKHN0ZG5pbXAsICJORXVubG9hZEltYWdlKCkgY2FsbGVkIVxuIik7Ci0JLyogZnJlZSByZXNvdXJjZXMsIGltYWdlICovCi0JcmV0dXJuIDE7Ci19Ci0KLQotQk9PTCBORV9Jbml0RExMKCBITU9EVUxFIGhNb2R1bGUgKQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgTkVfSW5pdERMTAorICoKKyAqIENhbGwgdGhlIERMTCBpbml0aWFsaXphdGlvbiBjb2RlCisgKi8KK3N0YXRpYyBCT09MIE5FX0luaXRETEwoIEhNT0RVTEUgaE1vZHVsZSApCiB7CiAgICAgaW50IGNzX3JlZywgZHNfcmVnLCBpcF9yZWcsIGN4X3JlZywgZGlfcmVnLCBicF9yZWc7CiAgICAgTkVfTU9EVUxFICpwTW9kdWxlOwpAQCAtMzgzLDcgKzM5MSw3IEBACiAgICAgY3NfcmVnID0gcFNlZ1RhYmxlW3BNb2R1bGUtPmNzLTFdLnNlbGVjdG9yOwogICAgIGlwX3JlZyA9IHBNb2R1bGUtPmlwOwogICAgIGRpX3JlZyA9IGRzX3JlZyA/IGRzX3JlZyA6IGhNb2R1bGU7Ci0gICAgYnBfcmVnID0gSUYxNjMyX1NhdmVkMTZfc3AgKyAoJigoU1RBQ0sxNkZSQU1FKikxKS0+YnAgLSAxKTsKKyAgICBicF9yZWcgPSBJRjE2MzJfU2F2ZWQxNl9zcCArICgoV09SRCkmKChTVEFDSzE2RlJBTUUqKTEpLT5icCAtIDEpOwogCiAgICAgcE1vZHVsZS0+Y3MgPSAwOyAgLyogRG9uJ3QgaW5pdGlhbGl6ZSBpdCB0d2ljZSAqLwogICAgIGRwcmludGZfZGxsKCBzdGRkZWIsICJDYWxsaW5nIExpYk1haW4sIGNzOmlwPSUwNHg6JTA0eCBkcz0lMDR4IGRpPSUwNHggY3g9JTA0eFxuIiwgCkBAIC0zOTQsOTIgKzQwMiwyMyBAQAogfQogCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgkJCU5FX0xvYWRJbWFnZQotICogTG9hZCBvbmUgTkUgZm9ybWF0IGV4ZWN1dGFibGUgaW50byBtZW1vcnkKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIE5FX0luaXRpYWxpemVETExzCisgKgorICogSW5pdGlhbGl6ZSB0aGUgbG9hZGVkIERMTHMuCiAgKi8KLUhJTlNUQU5DRSBORV9Mb2FkSW1hZ2Uoc3RydWN0IHdfZmlsZXMgKndwbnQpCit2b2lkIE5FX0luaXRpYWxpemVETExzKCBITU9EVUxFIGhNb2R1bGUgKQogewogICAgIE5FX01PRFVMRSAqcE1vZHVsZTsKLSAgICBTRUdUQUJMRUVOVFJZICpwU2VnVGFibGU7Ci0gICAgV09SRCAqcE1vZFJlZjsKLSAgICB1bnNpZ25lZCBpbnQgcmVhZF9zaXplLCBzdGF0dXMsIHNlZ21lbnQ7Ci0gICAgaW50IGk7Ci0gICAgY2hhciBjbWRMaW5lWzI1Nl07Ci0gICAgZXh0ZXJuIGludCBBcmdjOwotICAgIGV4dGVybiBjaGFyICoqQXJndjsKKyAgICBXT1JEICpwRExMOwogCi0gICAgd3BudC0+bmUgPSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCBuZV9kYXRhKSk7Ci0gICAgd3BudC0+bmUtPm5lX2hlYWRlciA9IG1hbGxvYyhzaXplb2Yoc3RydWN0IG5lX2hlYWRlcl9zKSk7Ci0KLSAgICBsc2Vlayh3cG50LT5mZCwgd3BudC0+bXpfaGVhZGVyLT5uZV9vZmZzZXQsIFNFRUtfU0VUKTsKLSAgICBpZiAocmVhZCh3cG50LT5mZCwgd3BudC0+bmUtPm5lX2hlYWRlciwgc2l6ZW9mKHN0cnVjdCBuZV9oZWFkZXJfcykpIAotCSE9IHNpemVvZihzdHJ1Y3QgbmVfaGVhZGVyX3MpKQotCW15ZXJyb3IoIlVuYWJsZSB0byByZWFkIE5FIGhlYWRlciBmcm9tIGZpbGUiKTsKLQotICAgIHdwbnQtPmhNb2R1bGUgPSBNT0RVTEVfTG9hZEV4ZUhlYWRlciggd3BudC0+ZmQsIHdwbnQtPmZpbGVuYW1lICk7Ci0gICAgcE1vZHVsZSA9IChORV9NT0RVTEUgKilHbG9iYWxMb2NrKCB3cG50LT5oTW9kdWxlICk7Ci0gICAgcFNlZ1RhYmxlID0gTkVfU0VHX1RBQkxFKHBNb2R1bGUpOwotCi0gICAgICAvKiBDcmVhdGUgdGhlIG1vZHVsZSBzZWdtZW50cyAqLwotCi0gICAgTU9EVUxFX0NyZWF0ZVNlZ21lbnRzKCB3cG50LT5oTW9kdWxlICk7Ci0jaWZuZGVmIFdJTkVMSUIKLSAgICAvKgotICAgICAqIENyZWF0ZSBzZWdtZW50IHNlbGVjdG9ycy4KLSAgICAgKi8KLSAgICBDcmVhdGVTZWxlY3RvcnMoKTsKLQotICAgIGlmIChwTW9kdWxlLT5kZ3JvdXApCi0gICAgICAgIHdwbnQtPmhpbnN0YW5jZSA9IE5FX1NFR19UQUJMRShwTW9kdWxlKVtwTW9kdWxlLT5kZ3JvdXAtMV0uc2VsZWN0b3I7Ci0gICAgZWxzZQotICAgICAgICB3cG50LT5oaW5zdGFuY2UgPSB3cG50LT5oTW9kdWxlOwotI2VuZGlmCi0KLSAgICAgIC8qIENyZWF0ZSBhIHRhc2sgZm9yIHRoaXMgbW9kdWxlICovCi0KLSAgICBjbWRMaW5lWzBdID0gJ1wwJzsKLSAgICBmb3IgKGkgPSAxOyBpIDwgQXJnYzsgaSsrKQorICAgIHBNb2R1bGUgPSAoTkVfTU9EVUxFICopR2xvYmFsTG9jayggaE1vZHVsZSApOworICAgIGlmICghcE1vZHVsZS0+ZGxsc190b19pbml0KSByZXR1cm47CisgICAgZm9yIChwRExMID0gKFdPUkQgKilHbG9iYWxMb2NrKCBwTW9kdWxlLT5kbGxzX3RvX2luaXQgKTsgKnBETEw7IHBETEwrKykKICAgICB7Ci0gICAgICAgIHN0cmNhdCggY21kTGluZSwgQXJndltpXSApOwotICAgICAgICBzdHJjYXQoIGNtZExpbmUsICIgIiApOworICAgICAgICBORV9Jbml0RExMKCAqcERMTCApOworICAgICAgICBORV9Jbml0aWFsaXplRExMcyggKnBETEwgKTsKICAgICB9Ci0gICAgaWYgKCEocE1vZHVsZS0+ZmxhZ3MgJiBORV9GRkxBR1NfTElCTU9EVUxFKSkKLSAgICAgICAgVEFTS19DcmVhdGVUYXNrKCB3cG50LT5oTW9kdWxlLCBTRUxFQ1RPUk9GKCBHZXRET1NFbnZpcm9ubWVudCgpICksCi0gICAgICAgICAgICAgICAgICAgICAgICAgR2V0Q3VycmVudFRhc2soKSwgY21kTGluZSApOwotCi0gICAgLyoKLSAgICAgKiBOb3cgbG9hZCBhbnkgRExMcyB0aGF0ICB0aGlzIG1vZHVsZSByZWZlcnMgdG8uCi0gICAgICovCi0gICAgcE1vZFJlZiA9IChXT1JEICopKChjaGFyICopcE1vZHVsZSArIHBNb2R1bGUtPm1vZHJlZl90YWJsZSk7Ci0gICAgZm9yIChpID0gMDsgaSA8IHBNb2R1bGUtPm1vZHJlZl9jb3VudDsgaSsrLCBwTW9kUmVmKyspCi0gICAgewotICAgICAgICBjaGFyIGJ1ZmZlcls4MF07Ci0gICAgICAgIGNoYXIgKnBzdHIgPSAoY2hhciAqKXBNb2R1bGUgKyBwTW9kdWxlLT5pbXBvcnRfdGFibGUgKyAqcE1vZFJlZjsKLSAgICAgICAgbWVtY3B5KCBidWZmZXIsIHBzdHIgKyAxLCAqcHN0ciApOwotICAgICAgICBidWZmZXJbKnBzdHJdID0gJ1wwJzsKLSAgICAgICAgZHByaW50Zl9tb2R1bGUoIHN0ZGRlYiwgIkxvYWRpbmcgJyVzJ1xuIiwgYnVmZmVyICk7Ci0gICAgICAgIExvYWRJbWFnZSggYnVmZmVyLCBETEwsIDAgKTsKLSAgICB9Ci0KLSAgICAvKiBmaXh1cCByZWZlcmVuY2VzICovCi0KLSAgICBmb3IgKGkgPSAxOyBpIDw9IHBNb2R1bGUtPnNlZ19jb3VudDsgaSsrKQotICAgICAgICBORV9Mb2FkU2VnbWVudCggd3BudC0+aE1vZHVsZSwgaSApOwotCi0gICAgTkVfRml4dXBQcm9sb2dzKCB3cG50LT5oTW9kdWxlICk7Ci0gICAgSW5pdGlhbGl6ZUxvYWRlZERMTHMod3BudCk7Ci0KLQotICAgICAgLyogSW5pdGlhbGl6ZSB0aGUgbG9jYWwgaGVhcCAqLwotCi0gICAgaWYgKHBNb2R1bGUtPmRncm91cCkKLSAgICB7Ci0gICAgICAgIGludCBzdGFydCA9IHBTZWdUYWJsZVtwTW9kdWxlLT5kZ3JvdXAtMV0ubWluc2l6ZTsKLSAgICAgICAgaWYgKHBNb2R1bGUtPnNzID09IHBNb2R1bGUtPmRncm91cCkgc3RhcnQgKz0gcE1vZHVsZS0+c3RhY2tfc2l6ZTsKLSAgICAgICAgTG9jYWxJbml0KCBwU2VnVGFibGVbcE1vZHVsZS0+ZGdyb3VwLTFdLnNlbGVjdG9yLAotICAgICAgICAgICAgICAgICAgIHN0YXJ0LCBzdGFydCArIHBNb2R1bGUtPmhlYXBfc2l6ZSApOwotICAgIH0KLQotICAgIHJldHVybih3cG50LT5oaW5zdGFuY2UpOworICAgIEdsb2JhbEZyZWUoIHBNb2R1bGUtPmRsbHNfdG9faW5pdCApOworICAgIHBNb2R1bGUtPmRsbHNfdG9faW5pdCA9IDA7CiB9CmRpZmYgLS1naXQgYS9sb2FkZXIvbmVfcmVzb3VyY2UuYyBiL2xvYWRlci9uZV9yZXNvdXJjZS5jCmluZGV4IGUzZTQ0MjguLjc2ZjMwYjggMTAwNjQ0Ci0tLSBhL2xvYWRlci9uZV9yZXNvdXJjZS5jCisrKyBiL2xvYWRlci9uZV9yZXNvdXJjZS5jCkBAIC0yMDQsOCArMjA0LDEwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVHlwZUluZm8tPmNvdW50ICogc2l6ZW9mKE5FX05BTUVJTkZPKSk7CiAgICAgICAgIH0KICAgICB9Ci0gICAgZnByaW50Ziggc3RkZXJyLCAiRmluZFJlc291cmNlKCUwNHgsJTA4bHgsJTA4bHgpOiBOb3QgZm91bmQuXG4iLAotICAgICAgICAgICAgIGhNb2R1bGUsIHR5cGVJZCwgcmVzSWQgKTsKKyAgICBmcHJpbnRmKCBzdGRlcnIsICJGaW5kUmVzb3VyY2UoJyUqLipzJywlMDhseCwlMDhseCk6IE5vdCBmb3VuZC5cbiIsCisgICAgICAgICAgICAgKigoQllURSAqKXBNb2R1bGUgKyBwTW9kdWxlLT5uYW1lX3RhYmxlKSwKKyAgICAgICAgICAgICAqKChCWVRFICopcE1vZHVsZSArIHBNb2R1bGUtPm5hbWVfdGFibGUpLAorICAgICAgICAgICAgIChjaGFyICopcE1vZHVsZSArIHBNb2R1bGUtPm5hbWVfdGFibGUgKyAxLCB0eXBlSWQsIHJlc0lkICk7CiAgICAgcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2xvYWRlci9wZV9pbWFnZS5jIGIvbG9hZGVyL3BlX2ltYWdlLmMKaW5kZXggOWRjYWQ1MC4uZWUxYjExOSAxMDA2NDQKLS0tIGEvbG9hZGVyL3BlX2ltYWdlLmMKKysrIGIvbG9hZGVyL3BlX2ltYWdlLmMKQEAgLTIxLDYgKzIxLDggQEAKIAogI2RlZmluZSBNQVBfQU5PTllNT1VTCTB4MjAKIAorc3RydWN0IHdfZmlsZXMgKndpbmVfZmlsZXMgPSBOVUxMOworCiB1bnNpZ25lZCBpbnQgbG9hZF9hZGRyOwogCiB2b2lkIG15X3djc3RvbWJzKGNoYXIgKiByZXN1bHQsIHVfc2hvcnQgKiBzb3VyY2UsIGludCBsZW4pCkBAIC0zNCwxMCArMzYsMTUgQEAKICAgfTsKIH0KIAotY2hhciAqIHhtbWFwKGNoYXIgKiB2YWRkciwgdW5zaWduZWQgaW50IHZfc2l6ZSwgaW50IHByb3QsIGludCBmbGFncywgCi0JICAgICBpbnQgZmQsIHVuc2lnbmVkIGludCBmaWxlX29mZnNldCkKK2NoYXIgKiB4bW1hcChjaGFyICogdmFkZHIsIHVuc2lnbmVkIGludCB2X3NpemUsIHVuc2lnbmVkIGludCByX3NpemUsCisJaW50IHByb3QsIGludCBmbGFncywgaW50IGZkLCB1bnNpZ25lZCBpbnQgZmlsZV9vZmZzZXQpCiB7CiAgIGNoYXIgKiByZXN1bHQ7CisgIC8qIC5ic3MgaGFzIG5vIGFzc29jaWF0ZWQgc3RvcmFnZSBpbiB0aGUgUEUgZmlsZSAqLworICBpZihyX3NpemUpCisgICAgdl9zaXplPXJfc2l6ZTsKKyAgZWxzZQorICAgIGZsYWdzIHw9IE1BUF9BTk9OOwogICByZXN1bHQgPSBtbWFwKHZhZGRyLCB2X3NpemUsIHByb3QsIGZsYWdzLCBmZCwgZmlsZV9vZmZzZXQpOwogICBpZigodW5zaWduZWQgaW50KSByZXN1bHQgIT0gMHhmZmZmZmZmZikgcmV0dXJuIHJlc3VsdDsKIApAQCAtNzksOSArODYsMTAgQEAKICAgICB9CiB9CiAKLXZvaWQgZHVtcF9pbXBvcnRzKHN0cnVjdCBQRV9JbXBvcnRfRGlyZWN0b3J5ICpwZV9pbXBvcnRzKQordm9pZCBmaXh1cF9pbXBvcnRzKHN0cnVjdCBQRV9JbXBvcnRfRGlyZWN0b3J5ICpwZV9pbXBvcnRzKQogeyAKICAgc3RydWN0IFBFX0ltcG9ydF9EaXJlY3RvcnkgKiBwZV9pbXA7CisgIGludCBmaXh1cF9mYWlsZWQ9MDsKIAogIC8qIE9LLCBub3cgZHVtcCB0aGUgaW1wb3J0IGxpc3QgKi8KICAgcHJpbnRmKCJcbkR1bXBpbmcgaW1wb3J0cyBsaXN0XG4iKTsKQEAgLTkwLDcgKzk4LDcgQEAKICAgICB7CiAgICAgICBjaGFyICogTW9kdWxlOwogICAgICAgc3RydWN0IHBlX2ltcG9ydF9uYW1lICogcGVfbmFtZTsKLSAgICAgIHVuc2lnbmVkIGludCAqIGltcG9ydF9saXN0OworICAgICAgdW5zaWduZWQgaW50ICogaW1wb3J0X2xpc3QsICp0aHVua19saXN0OwogICAgICAgY2hhciAqIGM7CiAKICAgICAgIE1vZHVsZSA9ICgoY2hhciAqKSBsb2FkX2FkZHIpICsgcGVfaW1wLT5Nb2R1bGVOYW1lOwpAQCAtMTAwLDE1ICsxMDgsMzIgQEAKIAogICAgICAgaW1wb3J0X2xpc3QgPSAodW5zaWduZWQgaW50ICopIAogCSgoKHVuc2lnbmVkIGludCkgbG9hZF9hZGRyKSArIHBlX2ltcC0+SW1wb3J0X0xpc3QpOworCSAgdGh1bmtfbGlzdCA9ICh1bnNpZ25lZCBpbnQgKikKKwkgICgoKHVuc2lnbmVkIGludCkgbG9hZF9hZGRyKSArIHBlX2ltcC0+VGh1bmtfTGlzdCk7CisKIAogICAgICAgd2hpbGUoKmltcG9ydF9saXN0KQogCXsKIAkgIHBlX25hbWUgPSAoc3RydWN0IHBlX2ltcG9ydF9uYW1lICopICgoaW50KSBsb2FkX2FkZHIgKyAqaW1wb3J0X2xpc3QpOworCSAgaWYoKHVuc2lnbmVkKXBlX25hbWUgJiAweDgwMDAwMDAwKQorCSAgeworCSAgCWZwcmludGYoc3RkZXJyLCJJbXBvcnQgYnkgb3JkaW5hbCBub3Qgc3VwcG9ydGVkXG4iKTsKKwkJZXhpdCgwKTsKKwkgIH0KIAkgIHByaW50ZigiLS0tICVzICVzLiVkXG4iLCBwZV9uYW1lLT5OYW1lLCBNb2R1bGUsIHBlX25hbWUtPkhpbnQpOworCSAgKnRodW5rX2xpc3Q9UkVMQVkzMl9HZXRFbnRyeVBvaW50KE1vZHVsZSxwZV9uYW1lLT5OYW1lLHBlX25hbWUtPkhpbnQpOworCSAgaWYoISp0aHVua19saXN0KQorCSAgeworCSAgCWZwcmludGYoc3RkZXJyLCJObyBpbXBsZW1lbnRhdGlvbiBmb3IgJXMuJWRcbiIsTW9kdWxlLCBwZV9uYW1lLT5IaW50KTsKKwkJZml4dXBfZmFpbGVkPTE7CisJICB9CisKIAkgIGltcG9ydF9saXN0Kys7CisJICB0aHVua19saXN0Kys7CiAJfQogICAgICAgcGVfaW1wKys7CiAgICAgfTsKKwlpZihmaXh1cF9mYWlsZWQpZXhpdCgxKTsKIH0KIAogc3RhdGljIHZvaWQgZHVtcF90YWJsZShzdHJ1Y3Qgd19maWxlcyAqd3BudCkKQEAgLTE1NSwxOSArMTgwLDI4IEBACiAJCQl3cG50LT5wZS0+cGVfaGVhZGVyLT5jb2ZmLk51bWJlck9mU2VjdGlvbnMpOwogCiAJbG9hZF9hZGRyID0gd3BudC0+cGUtPnBlX2hlYWRlci0+b3B0X2NvZmYuQmFzZU9mSW1hZ2U7CisJcHJpbnRmKCJMb2FkIGFkZHIgaXMgJXhcbiIsbG9hZF9hZGRyKTsKIAlkdW1wX3RhYmxlKHdwbnQpOwogCiAJZm9yKGk9MDsgaSA8IHdwbnQtPnBlLT5wZV9oZWFkZXItPmNvZmYuTnVtYmVyT2ZTZWN0aW9uczsgaSsrKQogCXsKIAlpZighbG9hZF9hZGRyKSB7Ci0JCXJlc3VsdCA9IHhtbWFwKChjaGFyICopMCwgd3BudC0+cGUtPnBlX3NlZ1tpXS5TaXplX09mX1Jhd19EYXRhLCA3LAorCQlyZXN1bHQgPSB4bW1hcCgoY2hhciAqKTAsIHdwbnQtPnBlLT5wZV9zZWdbaV0uVmlydHVhbF9TaXplLAorCQkJd3BudC0+cGUtPnBlX3NlZ1tpXS5TaXplX09mX1Jhd19EYXRhLCA3LAogCQkJTUFQX1BSSVZBVEUsIHdwbnQtPmZkLCB3cG50LT5wZS0+cGVfc2VnW2ldLlBvaW50ZXJUb1Jhd0RhdGEpOwogCQlsb2FkX2FkZHIgPSAodW5zaWduZWQgaW50KSByZXN1bHQgLSAgd3BudC0+cGUtPnBlX3NlZ1tpXS5WaXJ0dWFsX0FkZHJlc3M7CiAJfSBlbHNlIHsKIAkJcmVzdWx0ID0geG1tYXAoKGNoYXIgKikgbG9hZF9hZGRyICsgd3BudC0+cGUtPnBlX3NlZ1tpXS5WaXJ0dWFsX0FkZHJlc3MsIAorCQkJICB3cG50LT5wZS0+cGVfc2VnW2ldLlZpcnR1YWxfU2l6ZSwKIAkJICAgICAgd3BudC0+cGUtPnBlX3NlZ1tpXS5TaXplX09mX1Jhd19EYXRhLCA3LCBNQVBfUFJJVkFURSB8IE1BUF9GSVhFRCwgCiAJCSAgICAgIHdwbnQtPmZkLCB3cG50LT5wZS0+cGVfc2VnW2ldLlBvaW50ZXJUb1Jhd0RhdGEpOwogCX0KKwlpZihyZXN1bHQ9PS0xKXsKKwkJZnByaW50ZihzdGRlcnIsIkNvdWxkIG5vdCBsb2FkIHNlY3Rpb24gJXggdG8gZGVzaXJlZCBhZGRyZXNzICV4XG4iLAorCQkJaSwgbG9hZF9hZGRyK3dwbnQtPnBlLT5wZV9zZWdbaV0uVmlydHVhbF9BZGRyZXNzKTsKKwkJZnByaW50ZihzdGRlcnIsIk5lZWQgdG8gaW1wbGVtZW50IHJlbG9jYXRpb25zIG5vd1xuIik7CisJCWV4aXQoMCk7CisJfQogCiAJaWYoc3RyY21wKHdwbnQtPnBlLT5wZV9zZWdbaV0uTmFtZSwgIi5pZGF0YSIpID09IDApCiAJCXdwbnQtPnBlLT5wZV9pbXBvcnQgPSAoc3RydWN0IFBFX0ltcG9ydF9EaXJlY3RvcnkgKikgcmVzdWx0OwpAQCAtMTg0LDcgKzIxOCw3IEBACiAJICAgIH0KIAl9CiAKLQlpZih3cG50LT5wZS0+cGVfaW1wb3J0KSBkdW1wX2ltcG9ydHMod3BudC0+cGUtPnBlX2ltcG9ydCk7CisJaWYod3BudC0+cGUtPnBlX2ltcG9ydCkgZml4dXBfaW1wb3J0cyh3cG50LT5wZS0+cGVfaW1wb3J0KTsKIAlpZih3cG50LT5wZS0+cGVfZXhwb3J0KSBkdW1wX2V4cG9ydHMod3BudC0+cGUtPnBlX2V4cG9ydCk7CiAgIAogCXdwbnQtPmhpbnN0YW5jZSA9IDB4ODAwMDsKZGlmZiAtLWdpdCBhL2xvYWRlci9yZXNvdXJjZS5jIGIvbG9hZGVyL3Jlc291cmNlLmMKaW5kZXggY2ZjN2RiZC4uYWRiZmM4MCAxMDA2NDQKLS0tIGEvbG9hZGVyL3Jlc291cmNlLmMKKysrIGIvbG9hZGVyL3Jlc291cmNlLmMKQEAgLTIyLDcgKzIyLDYgQEAKICNpbmNsdWRlICJkbGxzLmgiCiAjaW5jbHVkZSAibW9kdWxlLmgiCiAjaW5jbHVkZSAicmVzb3VyY2UuaCIKLSNpbmNsdWRlICJsaWJyYXJ5LmgiCiAjaW5jbHVkZSAic3RkZGVidWcuaCIKICNpbmNsdWRlICJkZWJ1Zy5oIgogCkBAIC00NTgsNiArNDU3LDE3IEBACiAgICAgR2xvYmFsRnJlZShoSWNvbik7CiAgICAgcmV0dXJuIFRSVUU7CiB9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICBEdW1wSWNvbiBbVVNFUi40NTldCisgKi8KK0RXT1JEIER1bXBJY29uKHZvaWQqIGN1cnNvckljb25JbmZvLCBXT1JEIEZBUiAqbHBMZW4sIExQU1RSIEZBUiAqbHBYb3JCaXRzLAorCUxQU1RSIEZBUiAqbHBBbmRNYXNrKQoreworCWRwcmludGZfcmVzb3VyY2Uoc3RkbmltcCwiRHVtcEljb246IEVtcHR5IFN0dWIhISFcbiIpOworCXJldHVybiAwOworfQorCiAMCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoJCQlMb2FkQWNjZWxlcmF0b3JzCVtVU0VSLjE3N10KZGlmZiAtLWdpdCBhL2xvYWRlci9zZWxlY3Rvci5jIGIvbG9hZGVyL3NlbGVjdG9yLmMKaW5kZXggZjU0NjA1YS4uZDA0ZTRmMSAxMDA2NDQKLS0tIGEvbG9hZGVyL3NlbGVjdG9yLmMKKysrIGIvbG9hZGVyL3NlbGVjdG9yLmMKQEAgLTM0LDcgKzM0LDYgQEAKICNpbmNsdWRlICJnbG9iYWwuaCIKICNpbmNsdWRlICJkbGxzLmgiCiAjaW5jbHVkZSAibmVleGUuaCIKLSNpbmNsdWRlICJpZjE2MzIuaCIKICNpbmNsdWRlICJwcm90b3R5cGVzLmgiCiAjaW5jbHVkZSAibW9kdWxlLmgiCiAjaW5jbHVkZSAic3RkZGVidWcuaCIKQEAgLTQ5LDEzNSArNDgsMTggQEAKIAogZXh0ZXJuIGNoYXIgV2luZG93c1BhdGhbMjU2XTsKIAotZXh0ZXJuIGNoYXIgKipBcmd2OwotZXh0ZXJuIGludCBBcmdjOwogZXh0ZXJuIGNoYXIgKiplbnZpcm9uOwogCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ2hlY2sgd2hldGhlciBwc2V1ZG8tZnVuY3Rpb25zIGxpa2UgX18wMDQwSCBmb3IgZGlyZWN0IG1lbW9yeQotICogIGFjY2VzcyBhcmUgcmVmZXJlbmNlZCBhbmQgcmV0dXJuIDEgaWYgc28uCi0gKiAgRklYTUU6IFJlYWRpbmcgYW5kIHdyaXRpbmcgdG8gdGhlIHJldHVybmVkIHNlbGVjdG9ycyBoYXMgbm8gZWZmZWN0Ci0gKiAgICAgICAgIChlLmcuIHJlYWRpbmcgZnJvbSB0aGUgQmlvcyBkYXRhIHNlZ21lbnQgKGVzcC4gY2xvY2shKSApCi0gKi8KLQotdW5zaWduZWQgaW50IEdldE1lbW9yeVJlZmVyZW5jZSggY2hhciAqZGxsX25hbWUsIGNoYXIgKmZ1bmN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV09SRCAqc2VsLCBXT1JEICpvZmZzZXQgKQotewotICBzdGF0aWMgSEFORExFIG1lbW9yeV9oYW5kbGVzWyAxMCBdID0geyAwLDAsMCwwLDAsMCwwLDAsMCwwIH07Ci0gIHN0YXRpYyBjaGFyICptZW1vcnlfbmFtZXNbIDEwIF0gPSB7ICJzZWdtZW50IDB4QTAwMCIsCi0JCQkJCSJzZWdtZW50IDB4QjAwMCIsCi0JCQkJCSJzZWdtZW50IDB4QjgwMCIsCi0JCQkJCSJCaW9zLVJvbSIsCi0JCQkJCSJzZWdtZW50IDB4RDAwMCIsCi0JCQkJCSJzZWdtZW50IDB4MDAwMCIsCi0JCQkJCSJzZWdtZW50IDB4RTAwMCIsCi0JCQkJCSJzZWdtZW50IDB4RjAwMCIsCi0JCQkJCSJzZWdtZW50IDB4QzAwMCIsCi0JCQkJCSJCaW9zIGRhdGEgc2VnbWVudCIgfTsKLSAgc2hvcnQgbnI7Ci0KLSAgaWYoIHN0cmNhc2VjbXAoIGRsbF9uYW1lLCAiS0VSTkVMIiApICkgCi0gICAgcmV0dXJuIDA7Ci0KLSAgaWYoIEhJV09SRCggZnVuY3Rpb24gKSApIHsKLSAgICBpZiggKCAqZnVuY3Rpb24gIT0gJ18nICkgfHwgKCAqKGZ1bmN0aW9uKzEpICE9ICdfJyApICkKLSAgICAgIHJldHVybiAwOwotICAgIGlmKCAhc3RyY2FzZWNtcCggZnVuY3Rpb24sICJfX0EwMDBIIiApICkgbnIgPSAwOwotICAgIGVsc2UgaWYoICFzdHJjYXNlY21wKCBmdW5jdGlvbiwgIl9fQjAwMEgiICkgKSBuciA9IDE7Ci0gICAgZWxzZSBpZiggIXN0cmNhc2VjbXAoIGZ1bmN0aW9uLCAiX19CODAwSCIgKSApIG5yID0gMjsKLSAgICBlbHNlIGlmKCAhc3RyY2FzZWNtcCggZnVuY3Rpb24sICJfX1JPTUJJT1MiICkgKSBuciA9IDM7Ci0gICAgZWxzZSBpZiggIXN0cmNhc2VjbXAoIGZ1bmN0aW9uLCAiX19EMDAwSCIgKSApIG5yID0gNDsKLSAgICBlbHNlIGlmKCAhc3RyY2FzZWNtcCggZnVuY3Rpb24sICJfXzAwMDBIIiApICkgbnIgPSA1OwotICAgIGVsc2UgaWYoICFzdHJjYXNlY21wKCBmdW5jdGlvbiwgIl9fRTAwMEgiICkgKSBuciA9IDY7Ci0gICAgZWxzZSBpZiggIXN0cmNhc2VjbXAoIGZ1bmN0aW9uLCAiX19GMDAwSCIgKSApIG5yID0gNzsKLSAgICBlbHNlIGlmKCAhc3RyY2FzZWNtcCggZnVuY3Rpb24sICJfX0MwMDBIIiApICkgbnIgPSA4OwotICAgIGVsc2UgaWYoICFzdHJjYXNlY21wKCBmdW5jdGlvbiwgIl9fMDA0MEgiICkgKSBuciA9IDk7Ci0gICAgIGVsc2UKLSAgICAgIHJldHVybiAwOwotICB9Ci0gIGVsc2UgewotICAgIHN3aXRjaCggTE9XT1JEKCBmdW5jdGlvbiApICkgewotICAgIGNhc2UgMTc0OiBuciA9IDA7IGJyZWFrOwotICAgIGNhc2UgMTgxOiBuciA9IDE7IGJyZWFrOwotICAgIGNhc2UgMTgyOiBuciA9IDI7IGJyZWFrOwotICAgIGNhc2UgMTczOiBuciA9IDM7IGJyZWFrOwotICAgIGNhc2UgMTc5OiBuciA9IDQ7IGJyZWFrOwotICAgIGNhc2UgMTgzOiBuciA9IDU7IGJyZWFrOwotICAgIGNhc2UgMTkwOiBuciA9IDY7IGJyZWFrOwotICAgIGNhc2UgMTk0OiBuciA9IDc7IGJyZWFrOwotICAgIGNhc2UgMTk1OiBuciA9IDg7IGJyZWFrOwotICAgIGNhc2UgMTkzOiBuciA9IDk7IGJyZWFrOwotICAgIGRlZmF1bHQ6IHJldHVybiAwOwotICAgIH0KLSAgfQotICAKLSAgaWYoICFtZW1vcnlfaGFuZGxlc1sgbnIgXSApIHsKLSAgICBmcHJpbnRmKCBzdGRlcnIsICJXYXJuaW5nOiBEaXJlY3QgYWNjZXNzIHRvICVzIVxuIiwgbWVtb3J5X25hbWVzWyBuciBdICk7Ci0gICAgbWVtb3J5X2hhbmRsZXNbIG5yIF0gPSBHbG9iYWxBbGxvYyggR01FTV9GSVhFRCwgNjU1MzUgKTsKLSAgfQotICAqc2VsID0gKm9mZnNldCA9IG1lbW9yeV9oYW5kbGVzWyBuciBdOwotICByZXR1cm4gMTsKLX0KLSAKLQotCi11bnNpZ25lZCBpbnQgR2V0RW50cnlETExOYW1lKCBjaGFyICogZGxsX25hbWUsIGNoYXIgKiBmdW5jdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdPUkQqIHNlbCwgV09SRCAqb2Zmc2V0ICkKLXsKLSAgICBITU9EVUxFIGhNb2R1bGU7Ci0gICAgc3RydWN0IGRsbF90YWJsZV9zICpkbGxfdGFibGU7Ci0gICAgaW50IG9yZGluYWwsIGFkZHI7Ci0KLSAgICBpZiggR2V0TWVtb3J5UmVmZXJlbmNlKCBkbGxfbmFtZSwgZnVuY3Rpb24sIHNlbCwgb2Zmc2V0ICkgKQotICAgICAgICByZXR1cm4gMDsKLQotICAgIGhNb2R1bGUgPSBHZXRNb2R1bGVIYW5kbGUoIGRsbF9uYW1lICk7Ci0gICAgb3JkaW5hbCA9IE1PRFVMRV9HZXRPcmRpbmFsKCBoTW9kdWxlLCBmdW5jdGlvbiApOwotICAgIGlmICghb3JkaW5hbCkgcmV0dXJuIDE7Ci0gICAgYWRkciA9IE1PRFVMRV9HZXRFbnRyeVBvaW50KCBoTW9kdWxlLCBvcmRpbmFsICk7Ci0gICAgaWYgKCFhZGRyKSByZXR1cm4gMTsKLSNpZmRlZiBXSU5FU1RBVAotICAgIGlmICgoZGxsX3RhYmxlID0gRmluZERMTFRhYmxlKGRsbF9uYW1lKSkgIT0gTlVMTCkKLSAgICB7Ci0gICAgICAgIGRsbF90YWJsZS0+ZGxsX3RhYmxlW29yZGluYWxdLnVzZWQrKzsKLSAgICB9Ci0jZW5kaWYKLSAgICAqb2Zmc2V0ID0gTE9XT1JEKGFkZHIpOwotICAgICpzZWwgICAgPSBISVdPUkQoYWRkcik7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLQotdW5zaWduZWQgaW50IEdldEVudHJ5RExMT3JkaW5hbCggY2hhciAqIGRsbF9uYW1lLCBpbnQgb3JkaW5hbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdPUkQgKnNlbCwgV09SRCAqb2Zmc2V0ICkKLXsKLSAgICBITU9EVUxFIGhNb2R1bGU7Ci0gICAgc3RydWN0IGRsbF90YWJsZV9zICpkbGxfdGFibGU7Ci0gICAgaW50IGFkZHI7Ci0KLSAgICBpZiggR2V0TWVtb3J5UmVmZXJlbmNlKCBkbGxfbmFtZSwgKGNoYXIqKW9yZGluYWwsIHNlbCwgb2Zmc2V0ICkgKQotICAgICAgICByZXR1cm4gMDsKLQotICAgIGhNb2R1bGUgPSBHZXRNb2R1bGVIYW5kbGUoIGRsbF9uYW1lICk7Ci0gICAgYWRkciA9IE1PRFVMRV9HZXRFbnRyeVBvaW50KCBoTW9kdWxlLCBvcmRpbmFsICk7Ci0gICAgaWYgKCFhZGRyKSByZXR1cm4gMTsKLSNpZmRlZiBXSU5FU1RBVAotICAgIGlmICgoZGxsX3RhYmxlID0gRmluZERMTFRhYmxlKGRsbF9uYW1lKSkgIT0gTlVMTCkKLSAgICAgICAgZGxsX3RhYmxlLT5kbGxfdGFibGVbb3JkaW5hbF0udXNlZCsrOwotI2VuZGlmCi0gICAgKm9mZnNldCA9IExPV09SRChhZGRyKTsKLSAgICAqc2VsICAgID0gSElXT1JEKGFkZHIpOwotICAgIHJldHVybiAwOwotfQotCiAKIFdORFBST0MgR2V0V25kUHJvY0VudHJ5MTYoIGNoYXIgKm5hbWUgKQogewotICAgIFdPUkQgc2VsLCBvZmZzZXQ7CisgICAgV09SRCBvcmRpbmFsOworICAgIHN0YXRpYyBITU9EVUxFIGhNb2R1bGUgPSAwOwogCi0gICAgR2V0RW50cnlETExOYW1lKCAiV0lOUFJPQ1MiLCBuYW1lLCAmc2VsLCAmb2Zmc2V0ICk7Ci0gICAgcmV0dXJuIChXTkRQUk9DKSBNQUtFTE9ORyggb2Zmc2V0LCBzZWwgKTsKKyAgICBpZiAoIWhNb2R1bGUpIGhNb2R1bGUgPSBHZXRNb2R1bGVIYW5kbGUoICJXSU5QUk9DUyIgKTsKKyAgICBvcmRpbmFsID0gTU9EVUxFX0dldE9yZGluYWwoIGhNb2R1bGUsIG5hbWUgKTsKKyAgICByZXR1cm4gTU9EVUxFX0dldEVudHJ5UG9pbnQoIGhNb2R1bGUsIG9yZGluYWwgKTsKIH0KIAogCmRpZmYgLS1naXQgYS9sb2FkZXIvc2lnbmFsLmMgYi9sb2FkZXIvc2lnbmFsLmMKaW5kZXggYzY5NDNkZS4uYjM5NWQ0MSAxMDA2NDQKLS0tIGEvbG9hZGVyL3NpZ25hbC5jCisrKyBiL2xvYWRlci9zaWduYWwuYwpAQCAtMTE0LDI0ICsxMTQsMjYgQEAKICAgICBpZihzaWduYWwgPT0gU0lHVFJBUCkgewogICAgICAgc2NwLT5zY19laXAtLTsKICAgICAgIGdvdG8gb29wczsKLSAgICB9OwotCi0gICAgaWYoKHNjcC0+c2NfY3MgJiA3KSAhPSA3KQotICAgIHsKKyAgICB9CiAjZW5kaWYKLSNpZiBkZWZpbmVkKF9fTmV0QlNEX18pIHx8IGRlZmluZWQoX19GcmVlQlNEX18pCisjaWZkZWYgX19OZXRCU0RfXworLyogICAgICAgICBzZXRfZXMoMHgxZik7IHNldF9kcygweDFmKTsgKi8KKyAgICBpZihzaWduYWwgIT0gU0lHQlVTICYmIHNpZ25hbCAhPSBTSUdTRUdWICYmIHNpZ25hbCAhPSBTSUdUUkFQKSAKKwlleGl0KDEpOworI2VuZGlmCisjaWZkZWYgX19GcmVlQlNEX18KIC8qICAgICAgICAgc2V0X2VzKDB4MjcpOyBzZXRfZHMoMHgyNyk7ICovCiAgICAgaWYoc2lnbmFsICE9IFNJR0JVUyAmJiBzaWduYWwgIT0gU0lHU0VHViAmJiBzaWduYWwgIT0gU0lHVFJBUCkgCiAJZXhpdCgxKTsKLSAgICBpZihzY3AtPnNjX2NzID09IDB4MWYpCi0gICAgewogI2VuZGlmCisgICAgaWYgKHNjcC0+c2NfY3MgPT0gV0lORV9DT0RFX1NFTEVDVE9SKQorICAgIHsKIAlmcHJpbnRmKHN0ZGVyciwKIAkJIlNlZ21lbnRhdGlvbiBmYXVsdCBpbiBXaW5lIHByb2dyYW0gKCV4OiVseCkuIgogCQkiICBQbGVhc2UgZGVidWdcbiIsCiAJCXNjcC0+c2NfY3MsIHNjcC0+c2NfZWlwKTsKIAlnb3RvIG9vcHM7Ci0gICAgfTsKKyAgICB9CiAKICAgICAvKiAgTm93IHRha2UgYSBsb29rIGF0IHRoZSBhY3R1YWwgaW5zdHJ1Y3Rpb24gd2hlcmUgdGhlIHByb2dyYW0KIAlib21iZWQgKi8KZGlmZiAtLWdpdCBhL2xvYWRlci90YXNrLmMgYi9sb2FkZXIvdGFzay5jCmluZGV4IDdmMjYxMzEuLjMzZDUzZGUgMTAwNjQ0Ci0tLSBhL2xvYWRlci90YXNrLmMKKysrIGIvbG9hZGVyL3Rhc2suYwpAQCAtMjAsMTAgKzIwLDEyIEBACiAjaW5jbHVkZSAic3RkZGVidWcuaCIKICNpbmNsdWRlICJkZWJ1Zy5oIgogCisgIC8qIE1pbi4gbnVtYmVyIG9mIHRodW5rcyBhbGxvY2F0ZWQgd2hlbiBjcmVhdGluZyBhIG5ldyBzZWdtZW50ICovCisjZGVmaW5lIE1JTl9USFVOS1MgIDMyCiAKLSNkZWZpbmUgTUlOX1RIVU5LUyAgMzIgIC8qIE1pbi4gdGh1bmtzIGFsbG9jYXRlZCB3aGVuIGNyZWF0aW5nIGEgbmV3IHNlZ21lbnQgKi8KLQotI2RlZmluZSBTVEFDSzMyX1NJWkUgMHgxMDAwMCAgLyogMzItYml0IHN0YWNrIHNpemUgZm9yIGVhY2ggdGFzayAqLworICAvKiAzMi1iaXQgc3RhY2sgc2l6ZSBmb3IgZWFjaCB0YXNrICovCisgIC8qIE11c3Qgbm90IGJlIGdyZWF0ZXIgdGhhbiA2NGssIG9yIE1BS0VfU0VHUFRSIHdvbid0IHdvcmsgKi8KKyNkZWZpbmUgU1RBQ0szMl9TSVpFIDB4MTAwMDAKIAogCiBzdGF0aWMgSFRBU0sgaEZpcnN0VGFzayA9IDA7CkBAIC0xOTQsNyArMTk2LDYgQEAKICAgICBUREIgKnBUYXNrID0gKFREQiAqKUdsb2JhbExvY2soIGhDdXJyZW50VGFzayApOwogICAgIE5FX01PRFVMRSAqcE1vZHVsZSA9IChORV9NT0RVTEUgKilHbG9iYWxMb2NrKCBwVGFzay0+aE1vZHVsZSApOwogICAgIFNFR1RBQkxFRU5UUlkgKnBTZWdUYWJsZSA9IE5FX1NFR19UQUJMRSggcE1vZHVsZSApOwotICAgIGV4dGVybiB1bnNpZ25lZCBzaG9ydCBXSU5fU3RhY2tTaXplOwogCiAgICAgLyogUmVnaXN0ZXJzIGF0IGluaXRpYWxpemF0aW9uIG11c3QgYmU6CiAgICAgICogYXggICB6ZXJvCkBAIC0yMDksMjAgKzIxMCwxNyBAQAogICAgICAqIHNwICAgdG9wIG9mIHRoZSBzdGFjawogICAgICAqLwogCi0gICAgV0lOX1N0YWNrU2l6ZSA9IHBNb2R1bGUtPnN0YWNrX3NpemU7Ci0KICAgICBjc19yZWcgPSBwU2VnVGFibGVbcE1vZHVsZS0+Y3MgLSAxXS5zZWxlY3RvcjsKICAgICBpcF9yZWcgPSBwTW9kdWxlLT5pcDsKICAgICBkc19yZWcgPSBwU2VnVGFibGVbcE1vZHVsZS0+ZGdyb3VwIC0gMV0uc2VsZWN0b3I7CiAgICAgSUYxNjMyX1NhdmVkMTZfc3MgPSBwVGFzay0+c3M7CiAgICAgSUYxNjMyX1NhdmVkMTZfc3AgPSBwVGFzay0+c3A7Ci0vKiAgICBkcHJpbnRmX3Rhc2soIHN0ZGRlYiwgIlN0YXJ0aW5nIG1haW4gcHJvZ3JhbTogY3M6aXA9JTA0eDolMDR4IGRzPSUwNHggc3M6c3A9JTA0eDolMDR4XG4iLAorICAgIGRwcmludGZfdGFzayggc3RkZGViLCAiU3RhcnRpbmcgbWFpbiBwcm9ncmFtOiBjczppcD0lMDR4OiUwNHggZHM9JTA0eCBzczpzcD0lMDR4OiUwNHhcbiIsCiAgICAgICAgICAgICAgICAgIGNzX3JlZywgaXBfcmVnLCBkc19yZWcsCiAgICAgICAgICAgICAgICAgIElGMTYzMl9TYXZlZDE2X3NzLCBJRjE2MzJfU2F2ZWQxNl9zcCk7Ci0qLwogICAgIENhbGxUbzE2X3JlZ3NfKCAoRkFSUFJPQykoY3NfcmVnIDw8IDE2IHwgaXBfcmVnKSwgZHNfcmVnLAogICAgICAgICAgICAgICAgICAgIHBUYXNrLT5oUERCIC8qZXMqLywgMCAvKmJwKi8sIDAgLypheCovLAotICAgICAgICAgICAgICAgICAgIFdJTl9TdGFja1NpemUgLypieCovLCBwTW9kdWxlLT5oZWFwX3NpemUgLypjeCovLAorICAgICAgICAgICAgICAgICAgIHBNb2R1bGUtPnN0YWNrX3NpemUgLypieCovLCBwTW9kdWxlLT5oZWFwX3NpemUgLypjeCovLAogICAgICAgICAgICAgICAgICAgIDAgLypkeCovLCAwIC8qc2kqLywgZHNfcmVnIC8qZGkqLyApOwogICAgIC8qIFRoaXMgc2hvdWxkIG5ldmVyIHJldHVybiAqLwogICAgIGZwcmludGYoIHN0ZGVyciwgIlRBU0tfQ2FsbFRvU3RhcnQ6IE1haW4gcHJvZ3JhbSByZXR1cm5lZCFcbiIgKTsKQEAgLTIzMyw4ICsyMzEsOCBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgVEFTS19DcmVhdGVUYXNrCiAgKi8KLUhUQVNLIFRBU0tfQ3JlYXRlVGFzayggSE1PRFVMRSBoTW9kdWxlLCBIQU5ETEUgaEVudmlyb25tZW50LAotICAgICAgICAgICAgICAgICAgICAgICBIVEFTSyBoVGFza1BhcmVudCwgY2hhciAqY21kTGluZSApCitIVEFTSyBUQVNLX0NyZWF0ZVRhc2soIEhNT0RVTEUgaE1vZHVsZSwgSEFORExFIGhJbnN0YW5jZSwgSEFORExFIGhQcmV2SW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRSBoRW52aXJvbm1lbnQsIGNoYXIgKmNtZExpbmUsIFdPUkQgY21kU2hvdyApCiB7CiAgICAgSFRBU0sgaFRhc2s7CiAgICAgVERCICpwVGFzazsKQEAgLTI1OCwxNSArMjU2LDE3IEBACiAKICAgICAgIC8qIEZpbGwgdGhlIHRhc2sgc3RydWN0dXJlICovCiAKLSAgICBwVGFzay0+bkV2ZW50cyAgID0gMTsgIC8qIFNvIHRoZSB0YXNrIGNhbiBiZSBzdGFydGVkICovCi0gICAgcFRhc2stPmhTZWxmICAgICA9IGhUYXNrOwotICAgIHBUYXNrLT5mbGFncyAgICAgPSAwOwotICAgIHBUYXNrLT52ZXJzaW9uICAgPSBwTW9kdWxlLT5leHBlY3RlZF92ZXJzaW9uOwotICAgIHBUYXNrLT5oSW5zdGFuY2UgPSBORV9TRUdfVEFCTEUocE1vZHVsZSlbcE1vZHVsZS0+ZGdyb3VwLTFdLnNlbGVjdG9yLAotICAgIHBUYXNrLT5oTW9kdWxlICAgPSBoTW9kdWxlOwotICAgIHBUYXNrLT5oUGFyZW50ICAgPSBoVGFza1BhcmVudDsKLSAgICBwVGFzay0+Y3VyZHJpdmUgID0gJ0MnIC0gJ0EnICsgMHg4MDsKLSAgICBwVGFzay0+bWFnaWMgICAgID0gVERCX01BR0lDOworICAgIHBUYXNrLT5uRXZlbnRzICAgICAgID0gMTsgIC8qIFNvIHRoZSB0YXNrIGNhbiBiZSBzdGFydGVkICovCisgICAgcFRhc2stPmhTZWxmICAgICAgICAgPSBoVGFzazsKKyAgICBwVGFzay0+ZmxhZ3MgICAgICAgICA9IDA7CisgICAgcFRhc2stPnZlcnNpb24gICAgICAgPSBwTW9kdWxlLT5leHBlY3RlZF92ZXJzaW9uOworICAgIHBUYXNrLT5oSW5zdGFuY2UgICAgID0gaEluc3RhbmNlOworICAgIHBUYXNrLT5oUHJldkluc3RhbmNlID0gaFByZXZJbnN0YW5jZTsKKyAgICBwVGFzay0+aE1vZHVsZSAgICAgICA9IGhNb2R1bGU7CisgICAgcFRhc2stPmhQYXJlbnQgICAgICAgPSBoQ3VycmVudFRhc2s7CisgICAgcFRhc2stPmN1cmRyaXZlICAgICAgPSAnQycgLSAnQScgKyAweDgwOworICAgIHBUYXNrLT5tYWdpYyAgICAgICAgID0gVERCX01BR0lDOworICAgIHBUYXNrLT5uQ21kU2hvdyAgICAgID0gY21kU2hvdzsKICAgICBzdHJjcHkoIHBUYXNrLT5jdXJkaXIsICJXSU5ET1dTIiApOwogCiAgICAgICAvKiBDcmVhdGUgdGhlIHRodW5rcyBibG9jayAqLwpAQCAtMzM4LDcgKzMzOCw3IEBACiAKICAgICAgIC8qIENyZWF0ZSB0aGUgMTYtYml0IHN0YWNrIGZyYW1lICovCiAKLSAgICBwVGFzay0+c3MgPSBwU2VnVGFibGVbcE1vZHVsZS0+c3MgLSAxXS5zZWxlY3RvcjsKKyAgICBwVGFzay0+c3MgPSBoSW5zdGFuY2U7CiAgICAgcFRhc2stPnNwID0gKHBNb2R1bGUtPnNwICE9IDApID8gcE1vZHVsZS0+c3AgOgogICAgICAgICAgICAgICAgIHBTZWdUYWJsZVtwTW9kdWxlLT5zcy0xXS5taW5zaXplICsgcE1vZHVsZS0+c3RhY2tfc2l6ZTsKICAgICBzdGFjazE2VG9wID0gKGNoYXIgKilQVFJfU0VHX09GRl9UT19MSU4oIHBUYXNrLT5zcywgcFRhc2stPnNwICk7CkBAIC0zODQsNiArMzg0LDEwIEBACiAKICAgICBpZiAoIShwVGFzayA9IChUREIgKilHbG9iYWxMb2NrKCBoVGFzayApKSkgcmV0dXJuOwogCisgICAgICAvKiBGcmVlIHRoZSB0YXNrIG1vZHVsZSAqLworCisgICAgRnJlZU1vZHVsZSggcFRhc2stPmhNb2R1bGUgKTsKKwogICAgICAgLyogRnJlZSBhbGwgbWVtb3J5IHVzZWQgYnkgdGhpcyB0YXNrIChpbmNsdWRpbmcgdGhlIDMyLWJpdCBzdGFjaywgKi8KICAgICAgIC8qIHRoZSBlbnZpcm9ubWVudCBibG9jayBhbmQgdGhlIHRodW5rIHNlZ21lbnRzKS4gKi8KIApAQCAtMzk0LDcgKzM5OCw5IEBACiAgICAgR0xPQkFMX0ZyZWVCbG9jayggcFRhc2stPmhDU0FsaWFzICk7CiAgICAgR0xPQkFMX0ZyZWVCbG9jayggcFRhc2stPmhQREIgKTsKIAotICAgIEdsb2JhbEZyZWUoIGhUYXNrICk7ICAvKiBGcmVlIHRoZSB0YXNrIHN0cnVjdHVyZSAqLworICAgICAgLyogRnJlZSB0aGUgdGFzayBzdHJ1Y3R1cmUgaXRzZWxmICovCisKKyAgICBHbG9iYWxGcmVlKCBoVGFzayApOwogfQogCiAKQEAgLTUwMSw5ICs1MDcsNDIgQEAKICAgICAgIC8qIFN3aXRjaCB0byB0aGUgbmV3IHN0YWNrICovCiAKICAgICBoQ3VycmVudFRhc2sgPSBoVGFzazsKLSAgICBJRjE2MzJfU2F2ZWQxNl9zcyAgPSBwTmV3VGFzay0+c3M7Ci0gICAgSUYxNjMyX1NhdmVkMTZfc3AgID0gcE5ld1Rhc2stPnNwOwotICAgIElGMTYzMl9TYXZlZDMyX2VzcCA9IHBOZXdUYXNrLT5lc3A7CisgICAgSUYxNjMyX1NhdmVkMTZfc3MgICA9IHBOZXdUYXNrLT5zczsKKyAgICBJRjE2MzJfU2F2ZWQxNl9zcCAgID0gcE5ld1Rhc2stPnNwOworICAgIElGMTYzMl9TYXZlZDMyX2VzcCAgPSBwTmV3VGFzay0+ZXNwOworICAgIElGMTYzMl9TdGFjazMyX2Jhc2UgPSBXSU4xNl9HbG9iYWxMb2NrKCBwTmV3VGFzay0+aFN0YWNrMzIgKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBJbml0VGFzayAgKEtFUk5FTC45MSkKKyAqLwordm9pZCBJbml0VGFzayggc3RydWN0IHNpZ2NvbnRleHRfc3RydWN0IGNvbnRleHQgKQoreworICAgIFREQiAqcFRhc2s7CisgICAgTkVfTU9EVUxFICpwTW9kdWxlOworCisgICAgY29udGV4dC5zY19lYXggPSAwOworICAgIGlmICghKHBUYXNrID0gKFREQiAqKUdsb2JhbExvY2soIGhDdXJyZW50VGFzayApKSkgcmV0dXJuOworICAgIGlmICghKHBNb2R1bGUgPSAoTkVfTU9EVUxFICopR2xvYmFsTG9jayggcFRhc2stPmhNb2R1bGUgKSkpIHJldHVybjsKKworICAgIE5FX0luaXRpYWxpemVETExzKCBwVGFzay0+aE1vZHVsZSApOworCisgICAgLyogUmVnaXN0ZXJzIG9uIHJldHVybiBhcmU6CisgICAgICogYXggICAgIDEgaWYgT0ssIDAgb24gZXJyb3IKKyAgICAgKiBjeCAgICAgc3RhY2sgbGltaXQgaW4gYnl0ZXMKKyAgICAgKiBkeCAgICAgY21kU2hvdyBwYXJhbWV0ZXIKKyAgICAgKiBzaSAgICAgaW5zdGFuY2UgaGFuZGxlIG9mIHRoZSBwcmV2aW91cyBpbnN0YW5jZQorICAgICAqIGRpICAgICBpbnN0YW5jZSBoYW5kbGUgb2YgdGhlIG5ldyB0YXNrCisgICAgICogZXM6YnggIHBvaW50ZXIgdG8gY29tbWFuZC1saW5lIGluc2lkZSBQU1AKKyAgICAgKi8KKyAgICBjb250ZXh0LnNjX2VheCA9IDE7CisgICAgY29udGV4dC5zY19lYnggPSAweDgxOworICAgIGNvbnRleHQuc2NfZWN4ID0gcE1vZHVsZS0+c3RhY2tfc2l6ZTsKKyAgICBjb250ZXh0LnNjX2VkeCA9IHBUYXNrLT5uQ21kU2hvdzsKKyAgICBjb250ZXh0LnNjX2VzaSA9IHBUYXNrLT5oUHJldkluc3RhbmNlOworICAgIGNvbnRleHQuc2NfZWRpID0gcFRhc2stPmhJbnN0YW5jZTsKKyAgICBjb250ZXh0LnNjX2VzICA9IHBUYXNrLT5oUERCOwogfQogCiAKQEAgLTY1MCw3ICs2ODksOCBAQAogICAgIGVsc2UKICAgICAgICAgaGFuZGxlID0gR2xvYmFsSGFuZGxlKCBISVdPUkQocHJvYykgKTsKIAotICAgIHByaW50ZiggIlNUVUI6IEdldENvZGVIYW5kbGUoJXApIHJldHVybmluZyAlMDR4XG4iLCBwcm9jLCBoYW5kbGUgKTsKKyAgICBwcmludGYoICJTVFVCOiBHZXRDb2RlSGFuZGxlKCUwOGx4KSByZXR1cm5pbmcgJTA0eFxuIiwKKyAgICAgICAgICAgIChEV09SRClwcm9jLCBoYW5kbGUgKTsKICAgICByZXR1cm4gaGFuZGxlOwogfQogCmRpZmYgLS1naXQgYS9tZW1vcnkvZ2xvYmFsLmMgYi9tZW1vcnkvZ2xvYmFsLmMKaW5kZXggMzJhMTlmMC4uN2EwYTE0NCAxMDA2NDQKLS0tIGEvbWVtb3J5L2dsb2JhbC5jCisrKyBiL21lbW9yeS9nbG9iYWwuYwpAQCAtNyw2ICs3LDcgQEAKICNpbmNsdWRlIDxzdGRsaWIuaD4KICNpbmNsdWRlIDxzdHJpbmcuaD4KICNpbmNsdWRlICJ3aW5kb3dzLmgiCisjaW5jbHVkZSAiZ2xvYmFsLmgiCiAjaW5jbHVkZSAidG9vbGhlbHAuaCIKICNpbmNsdWRlICJzZWxlY3RvcnMuaCIKICNpbmNsdWRlICJzdGFja2ZyYW1lLmgiCkBAIC0xNyw3ICsxOCw3IEBACiB0eXBlZGVmIHN0cnVjdAogewogICAgIERXT1JEICAgIGJhc2U7ICAgICAgICAgICAvKiBCYXNlIGFkZHJlc3MgICovCi0gICAgRFdPUkQgICAgc2l6ZTsgICAgICAgICAgIC8qIFNpemUgaW4gYnl0ZXMgKi8KKyAgICBEV09SRCAgICBzaXplOyAgICAgICAgICAgLyogU2l6ZSBpbiBieXRlcyAoMCBpbmRpY2F0ZXMgYSBmcmVlIGJsb2NrKSAqLwogICAgIEhHTE9CQUwgIGhhbmRsZTsgICAgICAgICAvKiBIYW5kbGUgZm9yIHRoaXMgYmxvY2sgKi8KICAgICBIR0xPQkFMICBoT3duZXI7ICAgICAgICAgLyogT3duZXIgb2YgdGhpcyBibG9jayAqLwogICAgIEJZVEUgICAgIGxvY2tDb3VudDsgICAgICAvKiBDb3VudCBvZiBHbG9iYWxGaXgoKSBjYWxscyAqLwpAQCAtMjcsNiArMjgsNyBAQAogfSBHTE9CQUxBUkVOQTsKIAogICAvKiBGbGFncyBkZWZpbml0aW9ucyAqLworI2RlZmluZSBHQV9NT1ZFQUJMRSAgICAgMHgwMiAgLyogc2FtZSBhcyBHTUVNX01PVkVBQkxFICovCiAjZGVmaW5lIEdBX0RHUk9VUCAgICAgICAweDA0CiAjZGVmaW5lIEdBX0RJU0NBUkRBQkxFICAweDA4CiAKQEAgLTQ1LDE0ICs0NywxNiBAQAogICovCiBzdGF0aWMgR0xPQkFMQVJFTkEgKkdMT0JBTF9HZXRBcmVuYSggV09SRCBzZWwsIFdPUkQgc2VsY291bnQgKQogewotICAgIGlmICgoKHNlbCA+PiBfX0FIU0hJRlQpICsgc2VsY291bnQpID49IGdsb2JhbEFyZW5hU2l6ZSkKKyAgICBpZiAoKChzZWwgPj4gX19BSFNISUZUKSArIHNlbGNvdW50KSA+IGdsb2JhbEFyZW5hU2l6ZSkKICAgICB7CisgICAgICAgIGludCBuZXdzaXplID0gKChzZWwgPj4gX19BSFNISUZUKSArIHNlbGNvdW50ICsgMHhmZikgJiB+MHhmZjsKICAgICAgICAgR0xPQkFMQVJFTkEgKnBOZXdBcmVuYSA9IHJlYWxsb2MoIHBHbG9iYWxBcmVuYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZ2xvYmFsQXJlbmFTaXplICsgMjU2KSAqIHNpemVvZihHTE9CQUxBUkVOQSkgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld3NpemUgKiBzaXplb2YoR0xPQkFMQVJFTkEpICk7CiAgICAgICAgIGlmICghcE5ld0FyZW5hKSByZXR1cm4gMDsKICAgICAgICAgcEdsb2JhbEFyZW5hID0gcE5ld0FyZW5hOwotICAgICAgICBtZW1zZXQoIHBHbG9iYWxBcmVuYSArIGdsb2JhbEFyZW5hU2l6ZSwgMCwgMjU2ICogc2l6ZW9mKEdMT0JBTEFSRU5BKSApOwotICAgICAgICBnbG9iYWxBcmVuYVNpemUgKz0gMjU2OworICAgICAgICBtZW1zZXQoIHBHbG9iYWxBcmVuYSArIGdsb2JhbEFyZW5hU2l6ZSwgMCwKKyAgICAgICAgICAgICAgICAobmV3c2l6ZSAtIGdsb2JhbEFyZW5hU2l6ZSkgKiBzaXplb2YoR0xPQkFMQVJFTkEpICk7CisgICAgICAgIGdsb2JhbEFyZW5hU2l6ZSA9IG5ld3NpemU7CiAgICAgfQogICAgIHJldHVybiBwR2xvYmFsQXJlbmEgKyAoc2VsID4+IF9fQUhTSElGVCk7CiB9CkBAIC05MSw3ICs5NSw3IEBACiAgICAgcEFyZW5hLT5oT3duZXIgPSBoT3duZXI7CiAgICAgcEFyZW5hLT5sb2NrQ291bnQgPSAwOwogICAgIHBBcmVuYS0+cGFnZUxvY2tDb3VudCA9IDA7Ci0gICAgcEFyZW5hLT5mbGFncyA9IGZsYWdzICYgMHhmZjsKKyAgICBwQXJlbmEtPmZsYWdzID0gZmxhZ3MgJiBHQV9NT1ZFQUJMRTsKICAgICBpZiAoZmxhZ3MgJiBHTUVNX0RJU0NBUkRBQkxFKSBwQXJlbmEtPmZsYWdzIHw9IEdBX0RJU0NBUkRBQkxFOwogICAgIGlmICghaXNDb2RlKSBwQXJlbmEtPmZsYWdzIHw9IEdBX0RHUk9VUDsKICAgICBwQXJlbmEtPnNlbENvdW50ID0gc2VsY291bnQ7CkBAIC0xODgsMTkgKzE5MiwyOSBAQAogICAgIGlmICghaGFuZGxlKSByZXR1cm4gMDsKICAgICBwQXJlbmEgPSBHRVRfQVJFTkFfUFRSKCBoYW5kbGUgKTsKIAorICAgICAgLyogRGlzY2FyZCB0aGUgYmxvY2sgaWYgcmVxdWVzdGVkICovCisKKyAgICBpZiAoKHNpemUgPT0gMCkgJiYgKGZsYWdzICYgR01FTV9NT1ZFQUJMRSkpCisgICAgeworICAgICAgICBpZiAoIShwQXJlbmEtPmZsYWdzICYgR0FfTU9WRUFCTEUpIHx8CisgICAgICAgICAgICAhKHBBcmVuYS0+ZmxhZ3MgJiBHQV9ESVNDQVJEQUJMRSkgfHwKKyAgICAgICAgICAgIChwQXJlbmEtPmxvY2tDb3VudCA+IDApIHx8IChwQXJlbmEtPnBhZ2VMb2NrQ291bnQgPiAwKSkgcmV0dXJuIDA7CisgICAgICAgIGZyZWUoICh2b2lkICopcEFyZW5hLT5iYXNlICk7CisgICAgICAgIHBBcmVuYS0+YmFzZSA9IDA7CisgICAgfQorCiAgICAgICAvKiBGaXh1cCB0aGUgc2l6ZSAqLwogCi0gICAgaWYgKHNpemUgPj0gMHgwMGZmMDAwMC0weDBmKSByZXR1cm4gMDsgIC8qIE5vIGFsbG9jYXRpb24gPiAxNk1iLTY0S2IgKi8KLSAgICBpZiAoc2l6ZSA9PSAwKSBzaXplID0gMHgxMDsKLSAgICBlbHNlIHNpemUgPSAoc2l6ZSArIDB4MGYpICYgfjB4MGY7CisgICAgaWYgKHNpemUgPiBHTE9CQUxfTUFYX0FMTE9DX1NJWkUgLSAweDIwKSByZXR1cm4gMDsKKyAgICBpZiAoc2l6ZSA9PSAwKSBzaXplID0gMHgyMDsKKyAgICBlbHNlIHNpemUgPSAoc2l6ZSArIDB4MWYpICYgfjB4MWY7CiAKICAgICAgIC8qIENoYW5nZSB0aGUgZmxhZ3MgKi8KIAogICAgIGlmIChmbGFncyAmIEdNRU1fTU9ESUZZKQogICAgIHsKICAgICAgICAgICAvKiBDaGFuZ2UgdGhlIGZsYWdzLCBsZWF2aW5nIEdBX0RHUk9VUCBhbG9uZSAqLwotICAgICAgICBwQXJlbmEtPmZsYWdzID0gKHBBcmVuYS0+ZmxhZ3MgJiBHQV9ER1JPVVApIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIChmbGFncyAmIH5HQV9ER1JPVVApOworICAgICAgICBwQXJlbmEtPmZsYWdzID0gKHBBcmVuYS0+ZmxhZ3MgJiBHQV9ER1JPVVApIHwgKGZsYWdzICYgR0FfTU9WRUFCTEUpOwogICAgICAgICBpZiAoZmxhZ3MgJiBHTUVNX0RJU0NBUkRBQkxFKSBwQXJlbmEtPmZsYWdzIHw9IEdBX0RJU0NBUkRBQkxFOwogICAgICAgICByZXR1cm4gaGFuZGxlOwogICAgIH0KQEAgLTI0NSw3ICsyNTksNyBAQAogICAgIHBOZXdBcmVuYS0+YmFzZSA9IChEV09SRClwdHI7CiAgICAgcE5ld0FyZW5hLT5zaXplID0gR0VUX1NFTF9MSU1JVChzZWwpICsgMTsKICAgICBwTmV3QXJlbmEtPnNlbENvdW50ID0gc2VsY291bnQ7Ci0gICAgcE5ld0FyZW5hLT5oYW5kbGUgPSAocE5ld0FyZW5hLT5mbGFncyAmIEdNRU1fTU9WRUFCTEUpID8gc2VsIC0gMSA6IHNlbDsKKyAgICBwTmV3QXJlbmEtPmhhbmRsZSA9IChwTmV3QXJlbmEtPmZsYWdzICYgR0FfTU9WRUFCTEUpID8gc2VsIC0gMSA6IHNlbDsKIAogICAgIGlmIChzZWxjb3VudCA+IDEpICAvKiBjbGVhciB0aGUgbmV4dCBhcmVuYSBibG9ja3MgKi8KICAgICAgICAgbWVtc2V0KCBwTmV3QXJlbmEgKyAxLCAwLCAoc2VsY291bnQgLSAxKSAqIHNpemVvZihHTE9CQUxBUkVOQSkgKTsKQEAgLTI4MSw2ICsyOTUsNyBAQAogICAgIGRwcmludGZfZ2xvYmFsKCBzdGRkZWIsICJXSU4xNl9HbG9iYWxMb2NrKCUwNHgpIC0+ICUwOGx4XG4iLAogICAgICAgICAgICAgICAgICAgICBoYW5kbGUsIE1BS0VMT05HKCAwLCBHbG9iYWxIYW5kbGVUb1NlbChoYW5kbGUpKSApOwogICAgIGlmICghaGFuZGxlKSByZXR1cm4gMDsKKyAgICBpZiAoIUdFVF9BUkVOQV9QVFIoaGFuZGxlKS0+YmFzZSkgcmV0dXJuIChTRUdQVFIpMDsKICAgICByZXR1cm4gKFNFR1BUUilNQUtFTE9ORyggMCwgR2xvYmFsSGFuZGxlVG9TZWwoaGFuZGxlKSApOwogfQogCkBAIC0zMzksNyArMzU0LDggQEAKICAgICBkcHJpbnRmX2dsb2JhbCggc3RkZGViLCAiR2xvYmFsRmxhZ3M6ICUwNHhcbiIsIGhhbmRsZSApOwogICAgIHBBcmVuYSA9IEdFVF9BUkVOQV9QVFIoaGFuZGxlKTsKICAgICByZXR1cm4gcEFyZW5hLT5sb2NrQ291bnQgfAotICAgICAgICAgICAoKHBBcmVuYS0+ZmxhZ3MgJiBHQV9ESVNDQVJEQUJMRSkgPyBHTUVNX0RJU0NBUkRBQkxFIDogMCk7CisgICAgICAgICAgICgocEFyZW5hLT5mbGFncyAmIEdBX0RJU0NBUkRBQkxFKSA/IEdNRU1fRElTQ0FSREFCTEUgOiAwKSB8CisgICAgICAgICAgICgocEFyZW5hLT5iYXNlID09IDApID8gR01FTV9ESVNDQVJERUQgOiAwKTsKIH0KIAogCkBAIC02MzIsMyArNjQ4LDE0IEBACiB7CiAgICAgcmV0dXJuIFRSVUU7CiB9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICBHbG9iYWxBbGxvYzMyCisgKiBpbXBsZW1lbnRzICAgIEdsb2JhbEFsbG9jICAgICAgICAoS0VSTkVMMzIuMzE2KQorICogICAgICAgICAgICAgICBMb2NhbEFsbG9jICAgICAgICAgKEtFUk5FTDMyLjM3MikKKyAqLwordm9pZCAqR2xvYmFsQWxsb2MzMihpbnQgZmxhZ3MsaW50IHNpemUpCit7CisgICAgZHByaW50Zl9nbG9iYWwoc3RkZGViLCJHbG9iYWxBbGxvYzMyKCV4LCV4KVxuIixmbGFncyxzaXplKTsKKyAgICByZXR1cm4gbWFsbG9jKHNpemUpOworfQpkaWZmIC0tZ2l0IGEvbWVtb3J5L2xvY2FsLmMgYi9tZW1vcnkvbG9jYWwuYwppbmRleCBjN2Q1MjMxLi4xMzRjMWJmIDEwMDY0NAotLS0gYS9tZW1vcnkvbG9jYWwuYworKysgYi9tZW1vcnkvbG9jYWwuYwpAQCAtMjQzLDYgKzI0MywxMSBAQAogICAgICAgICBMT0NBTEFSRU5BICpwQXJlbmEgPSBBUkVOQV9QVFIocHRyLGFyZW5hKTsKICAgICAgICAgcHJpbnRmKCAiICAlMDR4OiBwcmV2PSUwNHggbmV4dD0lMDR4IHR5cGU9JWRcbiIsIGFyZW5hLAogICAgICAgICAgICAgICAgIHBBcmVuYS0+cHJldiAmIH4zLCBwQXJlbmEtPm5leHQsIHBBcmVuYS0+cHJldiAmIDMgKTsKKyAgICAgICAgaWYgKGFyZW5hID09IHBJbmZvLT5maXJzdCkKKwl7CisgICAgICAgICAgICBwcmludGYoICIgICAgICAgIHNpemU9JWQgZnJlZV9wcmV2PSUwNHggZnJlZV9uZXh0PSUwNHhcbiIsCisgICAgICAgICAgICAgICAgICAgIHBBcmVuYS0+c2l6ZSwgcEFyZW5hLT5mcmVlX3ByZXYsIHBBcmVuYS0+ZnJlZV9uZXh0ICk7CisJfQogICAgICAgICBpZiAoKHBBcmVuYS0+cHJldiAmIDMpID09IExPQ0FMX0FSRU5BX0ZSRUUpCiAgICAgICAgIHsKICAgICAgICAgICAgIHByaW50ZiggIiAgICAgICAgc2l6ZT0lZCBmcmVlX3ByZXY9JTA0eCBmcmVlX25leHQ9JTA0eFxuIiwKQEAgLTM3Nyw2ICszODIsNyBAQAogICAgICAgLyogRmluZCBhIHN1aXRhYmxlIGZyZWUgYmxvY2sgKi8KIAogICAgIGlmICghKHBJbmZvID0gTE9DQUxfR2V0SGVhcCggZHMgKSkpIHsKKyAgICAgIGRwcmludGZfbG9jYWwoIHN0ZGRlYiwgIkxvY2FsQWxsb2M6IEhlYXAgbm90IGZvdW5kXG4iKTsKICAgICAgIExPQ0FMX1ByaW50SGVhcChkcyk7CiAgICAgICByZXR1cm4gMDsKICAgICB9CkBAIC0zODcsNyArMzkzLDggQEAKICAgICBmb3IgKDs7KQogICAgIHsKICAgICAgICAgaWYgKGFyZW5hID09IHBBcmVuYS0+ZnJlZV9uZXh0KSB7Ci0JICBMT0NBTF9QcmludEhlYXAoZHMpOworCSAgZnByaW50ZihzdGRlcnIsICJMb2NhbCBoZWFwIGZ1bGxcbiIpOworCSAgaWYgKGRlYnVnZ2luZ19sb2NhbCkgTE9DQUxfUHJpbnRIZWFwKGRzKTsKICAgICAgICAgICByZXR1cm4gMDsgIC8qIG5vdCBmb3VuZCAqLwogCX0KICAgICAgICAgYXJlbmEgPSBwQXJlbmEtPmZyZWVfbmV4dDsKQEAgLTYyOSw2ICs2MzYsOCBAQAogICovCiBXT1JEIExvY2FsQ29tcGFjdCggV09SRCBtaW5mcmVlICkKIHsKKyAgICBkcHJpbnRmX2xvY2FsKCBzdGRkZWIsICJMb2NhbENvbXBhY3Q6ICUwNHhcbiIsIG1pbmZyZWUgKTsKKyAgICByZXR1cm4gMDsKIH0KIAogCkBAIC02MzcsNiArNjQ2LDggQEAKICAqLwogRkFSUFJPQyBMb2NhbE5vdGlmeSggRkFSUFJPQyBmdW5jICkKIHsKKyAgICBkcHJpbnRmX2xvY2FsKCBzdGRkZWIsICJMb2NhbE5vdGlmeTogJTA4bHhcbiIsIGZ1bmMgKTsKKyAgICByZXR1cm4gMDsKIH0KIAogCkBAIC02NDUsNiArNjU2LDggQEAKICAqLwogV09SRCBMb2NhbFNocmluayggSExPQ0FMIGhhbmRsZSwgV09SRCBuZXdzaXplICkKIHsKKyAgICBkcHJpbnRmX2xvY2FsKCBzdGRkZWIsICJMb2NhbFNocmluazogJTA0eCAlMDR4XG4iLCBoYW5kbGUsIG5ld3NpemUgKTsKKyAgICByZXR1cm4gMDsKIH0KIAogCkBAIC02NjIsNiArNjc1LDcgQEAKICAqLwogdm9pZCBMb2NhbENvdW50RnJlZSgpCiB7CisgICAgZHByaW50Zl9sb2NhbCggc3RkZGViLCAiTG9jYWxDb3VudEZyZWU6XG4iICk7CiB9CiAKIApAQCAtNjcwLDYgKzY4NCw3IEBACiAgKi8KIFdPUkQgTG9jYWxIZWFwU2l6ZSgpCiB7CisgICAgZHByaW50Zl9sb2NhbCggc3RkZGViLCAiTG9jYWxIZWFwU2l6ZTpcbiIgKTsKICAgICByZXR1cm4gTE9DQUxfSGVhcFNpemUoIENVUlJFTlRfRFMgKTsKIH0KIApAQCAtNjc5LDYgKzY5NCw4IEBACiAgKi8KIFdPUkQgTG9jYWxIYW5kbGVEZWx0YSggV09SRCBkZWx0YSApCiB7CisgICAgZHByaW50Zl9sb2NhbCggc3RkZGViLCAiTG9jYWxIYW5kbGVEZWx0YTogJTA0eFxuIiwgZGVsdGEgKTsKKyAgICByZXR1cm4gMDsKIH0KIAogCmRpZmYgLS1naXQgYS9tZW1vcnkvc2VsZWN0b3IuYyBiL21lbW9yeS9zZWxlY3Rvci5jCmluZGV4IDYwNTU2YzIuLjM2N2FhZTIgMTAwNjQ0Ci0tLSBhL21lbW9yeS9zZWxlY3Rvci5jCisrKyBiL21lbW9yeS9zZWxlY3Rvci5jCkBAIC0xMyw3ICsxMyw3IEBACiAKIGxkdF9jb3B5X2VudHJ5IGxkdF9jb3B5W0xEVF9TSVpFXSA9IHsgezAsMH0sIH07CiAKLSNkZWZpbmUgRklSU1RfTERUX0VOVFJZX1RPX0FMTE9DICA0CisjZGVmaW5lIEZJUlNUX0xEVF9FTlRSWV9UT19BTExPQyAgNgogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpkaWZmIC0tZ2l0IGEvbWlzYy9JbWFrZWZpbGUgYi9taXNjL0ltYWtlZmlsZQppbmRleCA1YzMyYmE1Li4zNmIwOTdhIDEwMDY0NAotLS0gYS9taXNjL0ltYWtlZmlsZQorKysgYi9taXNjL0ltYWtlZmlsZQpAQCAtMTQsMTIgKzE0LDEyIEBACiAJZXNjYXBlLmMgXAogCWZpbGUuYyBcCiAJa2V5Ym9hcmQuYyBcCisJa2VybmVsMzIuYyBcCiAJbHN0ci5jIFwKIAltYWluLmMgXAogCW9sZTJubHMuYyBcCiAJb2xlY2xpLmMgXAogCW9sZXN2ci5jIFwKLQltZXNzYWdlLmMgXAogCW5ldHdvcmsuYyBcCiAJcHJvZmlsZS5jIFwKIAlyZWN0LmMgXApkaWZmIC0tZ2l0IGEvbWlzYy9jb21tZGxnLmMgYi9taXNjL2NvbW1kbGcuYwppbmRleCAzNTY4MzVmLi5kOWEwZjMxIDEwMDY0NAotLS0gYS9taXNjL2NvbW1kbGcuYworKysgYi9taXNjL2NvbW1kbGcuYwpAQCAtMTEsMTAgKzExLDEwIEBACiAjaW5jbHVkZSAid2luLmgiCiAjaW5jbHVkZSAidXNlci5oIgogI2luY2x1ZGUgIm1lc3NhZ2UuaCIKLSNpbmNsdWRlICJsaWJyYXJ5LmgiCiAjaW5jbHVkZSAiY29tbWRsZy5oIgogI2luY2x1ZGUgImRsZ3MuaCIKICNpbmNsdWRlICJzZWxlY3RvcnMuaCIKKyNpbmNsdWRlICIuLi9yYy9zeXNyZXMuaCIKIAogI2RlZmluZSBPUEVORklMRURMRzIJCQkxMQogI2RlZmluZSBTQVZFRklMRURMRzIJCQkxMgpAQCAtNTcsMTEgKzU3LDExIEBACiAgKi8KIHN0YXRpYyBCT09MIEZpbGVEbGdfSW5pdCgpCiB7Ci0gIGlmICghaEZvbGRlcikgaEZvbGRlciA9IExvYWRCaXRtYXAoaFN5c1JlcywgTUFLRUlOVFJFU09VUkNFKE9CTV9GT0xERVIpKTsKLSAgaWYgKCFoRm9sZGVyMikgaEZvbGRlcjIgPSBMb2FkQml0bWFwKGhTeXNSZXMsIE1BS0VJTlRSRVNPVVJDRShPQk1fRk9MREVSMikpOwotICBpZiAoIWhGbG9wcHkpIGhGbG9wcHkgPSBMb2FkQml0bWFwKGhTeXNSZXMsIE1BS0VJTlRSRVNPVVJDRShPQk1fRkxPUFBZKSk7Ci0gIGlmICghaEhEaXNrKSBoSERpc2sgPSBMb2FkQml0bWFwKGhTeXNSZXMsIE1BS0VJTlRSRVNPVVJDRShPQk1fSERJU0spKTsKLSAgaWYgKCFoQ0RSb20pIGhDRFJvbSA9IExvYWRCaXRtYXAoaFN5c1JlcywgTUFLRUlOVFJFU09VUkNFKE9CTV9DRFJPTSkpOworICBpZiAoIWhGb2xkZXIpIGhGb2xkZXIgPSBMb2FkQml0bWFwKDAsIE1BS0VJTlRSRVNPVVJDRShPQk1fRk9MREVSKSk7CisgIGlmICghaEZvbGRlcjIpIGhGb2xkZXIyID0gTG9hZEJpdG1hcCgwLCBNQUtFSU5UUkVTT1VSQ0UoT0JNX0ZPTERFUjIpKTsKKyAgaWYgKCFoRmxvcHB5KSBoRmxvcHB5ID0gTG9hZEJpdG1hcCgwLCBNQUtFSU5UUkVTT1VSQ0UoT0JNX0ZMT1BQWSkpOworICBpZiAoIWhIRGlzaykgaEhEaXNrID0gTG9hZEJpdG1hcCgwLCBNQUtFSU5UUkVTT1VSQ0UoT0JNX0hESVNLKSk7CisgIGlmICghaENEUm9tKSBoQ0RSb20gPSBMb2FkQml0bWFwKDAsIE1BS0VJTlRSRVNPVVJDRShPQk1fQ0RST00pKTsKICAgaWYgKGhGb2xkZXIgPT0gMCB8fCBoRm9sZGVyMiA9PSAwIHx8IGhGbG9wcHkgPT0gMCB8fCAKICAgICAgIGhIRGlzayA9PSAwIHx8IGhDRFJvbSA9PSAwKQogICBmcHJpbnRmKHN0ZGVyciwgIkZpbGVEbGdfSW5pdCAvLyBFcnJvciBsb2FkaW5nIGJpdG1hcHMgISIpOwpAQCAtNjksNiArNjksMzYgQEAKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wZW5EbGdfRml4RGlyTmFtZSAgICAgICAgICAgICAgW2ludGVybmFsXQorICovCit2b2lkIE9wZW5EbGdfRml4RGlyTmFtZShMUFNUUiBkaXJuYW1lKQoreworICBjaGFyIHRlbXBbNTEyXTsKKyAgY2hhciogc3RycDE7CisgIGNoYXIqIHN0cnAyOworCisgIHN0cnAxPWRpcm5hbWU7CisgIGlmKCBkaXJuYW1lWzFdICE9ICc6Jyl7CisgICAgdGVtcFswXT0oY2hhcikoKGNoYXIpRE9TX0dldERlZmF1bHREcml2ZSgpKydBJyk7CisgICAgdGVtcFsxXT0nOic7CisgICAgdGVtcFsyXT0nXFwnOworICAgIHRlbXBbM109ICdcMCc7CisgICAgc3RyY2F0KHRlbXAsIERPU19HZXRDdXJyZW50RGlyKERPU19HZXREZWZhdWx0RHJpdmUoKSkpOworICAgIGlmKGRpcm5hbWVbMF09PScuJyAmJiBkaXJuYW1lWzFdPT0nLicpIHsKKyAgICAgIHN0cnAyID0gc3RycmNocih0ZW1wLCAnXFwnKTsKKyAgICAgIGlmIChzdHJwMiAhPSBOVUxMKXsKKwkqc3RycDI9J1wwJzsKKwlzdHJwMSs9MjsKKyAgICAgIH0KKyAgICB9CisgICAgc3RyY2F0KHRlbXAsICJcXCIpOworICAgIHN0cmNhdCh0ZW1wLCBzdHJwMSk7CisgICAgc3RyY3B5KGRpcm5hbWUsIHRlbXApOworICB9IAorfQorICAKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAJCQkJT3BlbkRsZ19TY2FuRGlyCQkJW2ludGVybmFsXQogICovCiBzdGF0aWMgQk9PTCBPcGVuRGxnX1NjYW5EaXIoSFdORCBoV25kLCBMUFNUUiBuZXdQYXRoKQpAQCAtNzcsMTMgKzEwNywxNCBAQAogICBzdGF0aWMgTFBTVFIgIHN0ciAgPSBOVUxMOwogICBzdGF0aWMgU0VHUFRSIHN0cjE2ID0gMDsKICAgTFBTVFIgc3RycDsKLSAgCisKKyAgT3BlbkRsZ19GaXhEaXJOYW1lKG5ld1BhdGgpOwogICBpZiAoc3RyID09IE5VTEwpICB7CiAgICAgaFN0ciA9IEdsb2JhbEFsbG9jKDAsNTEyKTsKICAgICBzdHIgPSBHbG9iYWxMb2NrKGhTdHIpOwogICAgIHN0cjE2ID0gV0lOMTZfR2xvYmFsTG9jayhoU3RyKTsKICAgfQotICAKKwogICBzdHJjcHkoc3RyLG5ld1BhdGgpOwogICBEbGdEaXJMaXN0KGhXbmQsIHN0ciwgbHN0MSwgMCwgMHgwMDAwKTsKICAgc3RycCA9IHN0cnJjaHIoc3RyLCdcXCcpOwpAQCAtOTYsMzcgKzEyNywyNyBAQAogICB9IGVsc2Ugc3RycCsrOwogICBzdHJjcHkoc3RyLHN0cnApOwogICBTZW5kRGxnSXRlbU1lc3NhZ2UoaFduZCxlZHQxLFdNX1NFVFRFWFQsIDAsIHN0cjE2KTsKLSAgc3RyY3B5KHN0cixuZXdQYXRoKTsKLSAgKnN0cnAgPSAwOwotICBzdHJjYXQoc3RyLCIqLioiKTsKKyAgc3RyY3B5KHN0ciwiKi4qIik7CiAgIERsZ0Rpckxpc3QoaFduZCwgc3RyLCBsc3QyLCBzdGMxLCAweDgwMTApOwogICAKICAgcmV0dXJuIFRSVUU7CiB9CiAKLQotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIAkJCQlPcGVuRGxnX0dldEZpbGVUeXBlCQlbaW50ZXJuYWxdCiAgKi8KLUxQU1RSIE9wZW5EbGdfR2V0RmlsZVR5cGUoTFBDU1RSIHR5cGVzLCBXT1JEIGluZGV4KQorc3RhdGljIExQU1RSIE9wZW5EbGdfR2V0RmlsZVR5cGUoTFBDU1RSIHR5cGVzLCBXT1JEIGluZGV4KQogewogCWludAkJbjsKIAlpbnQJCWkgPSAxOwogCUxQU1RSIAlwdHIgPSAoTFBTVFIpIHR5cGVzOwogCWlmCShwdHIgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CiAJd2hpbGUoKG4gPSBzdHJsZW4ocHRyKSkgIT0gMCkgewotI2lmZGVmIERFQlVHX09QRU5ETEcKLQkJcHJpbnRmKCJPcGVuRGxnX0dldEZpbGVUeXBlIC8vIGZpbGUgdHlwZSAnJXMnICFcbiIsIHB0cik7Ci0jZW5kaWYKIAkJcHRyICs9ICsrbjsKLSNpZmRlZiBERUJVR19PUEVORExHCi0JCXByaW50ZigiT3BlbkRsZ19HZXRGaWxlVHlwZSAvLyBmaWxlIHNwZWMgJyVzJyAhXG4iLCBwdHIpOwotI2VuZGlmCiAJCWlmIChpKysgPT0gaW5kZXgpIHJldHVybiBwdHI7CiAJCW4gPSBzdHJsZW4ocHRyKTsKIAkJcHRyICs9ICsrbjsKLQkJfQorCX0KIAlyZXR1cm4gTlVMTDsKIH0KIApAQCAtMTM1LDQ1ICsxNTYsNDUgQEAKICAqLwogQk9PTCBHZXRPcGVuRmlsZU5hbWUoTFBPUEVORklMRU5BTUUgbHBvZm4pCiB7Ci0JSEFORExFCQloRGxnVG1wbDsKLQlIQU5ETEUJCWhSZXNJbmZvOwotCUhJTlNUQU5DRQloSW5zdDsKLQlXTkQgCQkqd25kUHRyOwotCUJPT0wJCWJSZXQ7Ci0KLSAgICAgICAgaWYgKGxwb2ZuID09IE5VTEwpIHJldHVybiBGQUxTRTsKLQlpZiAobHBvZm4tPkZsYWdzICYgT0ZOX0VOQUJMRVRFTVBMQVRFSEFORExFKSB7Ci0JCWhEbGdUbXBsID0gbHBvZm4tPmhJbnN0YW5jZTsKLQl9IGVsc2UgewotCQlpZiAobHBvZm4tPkZsYWdzICYgT0ZOX0VOQUJMRVRFTVBMQVRFKSB7Ci0JCQloSW5zdCA9IGxwb2ZuLT5oSW5zdGFuY2U7Ci0JCQloUmVzSW5mbyA9IEZpbmRSZXNvdXJjZShoSW5zdCwKLQkJCQlscG9mbi0+bHBUZW1wbGF0ZU5hbWUsIFJUX0RJQUxPRyk7Ci0JCX0gZWxzZSB7Ci0JCQloSW5zdCA9IGhTeXNSZXM7Ci0JCQloUmVzSW5mbyA9IEZpbmRSZXNvdXJjZShoSW5zdCwgTUFLRUlOVFJFU09VUkNFKE9QRU5GSUxFRExHMiksIFJUX0RJQUxPRyk7Ci0JCX0KLQkJaWYgKGhSZXNJbmZvID09IDApIHsKLQkJCUNvbW1EbGdMYXN0RXJyb3IgPSBDREVSUl9GSU5EUkVTRkFJTFVSRTsKLQkJCXJldHVybiBGQUxTRTsKLQkJfQotCQlwcmludGYoIkdldE9wZW5GaWxlTmFtZSAvLyBhcHJlcyBGaW5kUmVzb3VyY2UgaFJlc0luZm89JTA0WCFcbiIsIGhSZXNJbmZvKTsKLQkJaERsZ1RtcGwgPSBMb2FkUmVzb3VyY2UoaEluc3QsIGhSZXNJbmZvKTsKLSAgICAgICAJfQotCWlmIChoRGxnVG1wbCA9PSAwKSB7Ci0JCUNvbW1EbGdMYXN0RXJyb3IgPSBDREVSUl9MT0FEUkVTRkFJTFVSRTsKLQkJcmV0dXJuIEZBTFNFOwotCX0KLQlwcmludGYoIkdldE9wZW5GaWxlTmFtZSAvLyBhcHJlcyBMb2FkUmVzb3VyY2UgaERsZ1RtcGw9JTA0WCFcbiIsIGhEbGdUbXBsKTsKLSAgICAgICAgd25kUHRyID0gV0lOX0ZpbmRXbmRQdHIobHBvZm4tPmh3bmRPd25lcik7Ci0JYlJldCA9IERpYWxvZ0JveEluZGlyZWN0UGFyYW0od25kUHRyLT5oSW5zdGFuY2UsIGhEbGdUbXBsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBscG9mbi0+aHduZE93bmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZXRXbmRQcm9jRW50cnkxNigiRmlsZU9wZW5EbGdQcm9jIiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChEV09SRClscG9mbik7IAotCi0JcHJpbnRmKCJHZXRPcGVuRmlsZU5hbWUgLy8gcmV0dXJuIGxwc3RyRmlsZT0nJXMnICFcbiIsIAotCSAgICAgICAoTFBTVFIpUFRSX1NFR19UT19MSU4obHBvZm4tPmxwc3RyRmlsZSkpOwotCXJldHVybiBiUmV0OworICBIQU5ETEUgICAgaERsZ1RtcGw7CisgIEhBTkRMRSAgICBoUmVzSW5mbzsKKyAgSElOU1RBTkNFIGhJbnN0OworICBCT09MIAkgICAgYlJldDsKKyAgTFBDU1RSICAgIGRsZ1RlbXBsYXRlOworICAKKyAgaWYgKGxwb2ZuID09IE5VTEwpIHJldHVybiBGQUxTRTsKKyAgaWYgKGxwb2ZuLT5GbGFncyAmIE9GTl9FTkFCTEVURU1QTEFURUhBTkRMRSkgeworICAgIGRsZ1RlbXBsYXRlID0gR2xvYmFsTG9jayhscG9mbi0+aEluc3RhbmNlKTsKKyAgICBpZiAoIWRsZ1RlbXBsYXRlKSB7CisgICAgICBDb21tRGxnTGFzdEVycm9yID0gQ0RFUlJfTE9BRFJFU0ZBSUxVUkU7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICB9IGVsc2UgeworICAgIGlmIChscG9mbi0+RmxhZ3MgJiBPRk5fRU5BQkxFVEVNUExBVEUpIHsKKyAgICAgIGhJbnN0ID0gbHBvZm4tPmhJbnN0YW5jZTsKKyAgICAgIGhSZXNJbmZvID0gRmluZFJlc291cmNlKGhJbnN0LCBscG9mbi0+bHBUZW1wbGF0ZU5hbWUsIFJUX0RJQUxPRyk7CisgICAgICBpZiAoaFJlc0luZm8gPT0gMCkgeworCUNvbW1EbGdMYXN0RXJyb3IgPSBDREVSUl9GSU5EUkVTRkFJTFVSRTsKKwlyZXR1cm4gRkFMU0U7CisgICAgICB9CisgICAgICBoRGxnVG1wbCA9IExvYWRSZXNvdXJjZShoSW5zdCwgaFJlc0luZm8pOworICAgICAgaWYgKGhEbGdUbXBsID09IDApIHsKKwlDb21tRGxnTGFzdEVycm9yID0gQ0RFUlJfTE9BRFJFU0ZBSUxVUkU7CisJcmV0dXJuIEZBTFNFOworICAgICAgfQorICAgICAgZGxnVGVtcGxhdGUgPSBHbG9iYWxMb2NrKGhEbGdUbXBsKTsKKyAgICB9IGVsc2UgeworICAgICAgZGxnVGVtcGxhdGUgPSBzeXNyZXNfRElBTE9HXzM7CisgICAgfQorICB9CisgIGhJbnN0ID0gR2V0V2luZG93V29yZChscG9mbi0+aHduZE93bmVyLCBHV1dfSElOU1RBTkNFKTsKKyAgYlJldCA9IERpYWxvZ0JveEluZGlyZWN0UGFyYW1QdHIoaEluc3QsIGRsZ1RlbXBsYXRlLCBscG9mbi0+aHduZE93bmVyLAorCQkJCSAgIEdldFduZFByb2NFbnRyeTE2KCJGaWxlT3BlbkRsZ1Byb2MiKSwKKwkJCQkgICAoRFdPUkQpbHBvZm4pOyAKKyAgCisgIHByaW50ZigiR2V0T3BlbkZpbGVOYW1lIC8vIHJldHVybiBscHN0ckZpbGU9JyVzJyAhXG4iLCAKKwkgKExQU1RSKVBUUl9TRUdfVE9fTElOKGxwb2ZuLT5scHN0ckZpbGUpKTsKKyAgcmV0dXJuIGJSZXQ7CiB9CiAKIApAQCAtMTgyLDQyICsyMDMsNDQgQEAKICAqLwogQk9PTCBHZXRTYXZlRmlsZU5hbWUoTFBPUEVORklMRU5BTUUgbHBvZm4pCiB7Ci0gICAgICAgIEhBTkRMRQkgICAgICAgIGhEbGdUbXBsOwotICAgICAgICBIQU5ETEUJICAgICAgICBoUmVzSW5mbzsKLSAgICAgICAgSElOU1RBTkNFICAgICAgIGhJbnN0OwotICAgICAgICBXTkQgCSAgICAgICAgKnduZFB0cjsKLSAgICAgICAgQk9PTAkgICAgICAgIGJSZXQ7Ci0KLSAgICAgICAgaWYgKGxwb2ZuID09IE5VTEwpIHJldHVybiBGQUxTRTsKLQlpZiAobHBvZm4tPkZsYWdzICYgT0ZOX0VOQUJMRVRFTVBMQVRFSEFORExFKSB7Ci0JCWhEbGdUbXBsID0gbHBvZm4tPmhJbnN0YW5jZTsKLQl9IGVsc2UgewotCQlpZiAobHBvZm4tPkZsYWdzICYgT0ZOX0VOQUJMRVRFTVBMQVRFKSB7Ci0JCQloSW5zdCA9IGxwb2ZuLT5oSW5zdGFuY2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICBoUmVzSW5mbyA9IEZpbmRSZXNvdXJjZShoSW5zdCwgbHBvZm4tPmxwVGVtcGxhdGVOYW1lLAotCQkJCQkJUlRfRElBTE9HKTsKLQkJfSBlbHNlIHsKLQkJCWhJbnN0ID0gaFN5c1JlczsKLQkJCWhSZXNJbmZvID0gRmluZFJlc291cmNlKGhJbnN0LCBNQUtFSU5UUkVTT1VSQ0UoU0FWRUZJTEVETEcyKSwgUlRfRElBTE9HKTsKLQkJfQotCQlpZiAoaFJlc0luZm8gPT0gMCkgewotCQkJQ29tbURsZ0xhc3RFcnJvciA9IENERVJSX0ZJTkRSRVNGQUlMVVJFOwotCQkJcmV0dXJuIEZBTFNFOwotCQl9Ci0JCWhEbGdUbXBsID0gTG9hZFJlc291cmNlKGhJbnN0LCBoUmVzSW5mbyk7Ci0JfQotCWlmIChoRGxnVG1wbCA9PSAwKSB7Ci0JCUNvbW1EbGdMYXN0RXJyb3IgPSBDREVSUl9MT0FEUkVTRkFJTFVSRTsKLQkJcmV0dXJuIEZBTFNFOwotCX0KLSAgICAgICAgd25kUHRyID0gV0lOX0ZpbmRXbmRQdHIobHBvZm4tPmh3bmRPd25lcik7Ci0JYlJldCA9IERpYWxvZ0JveEluZGlyZWN0UGFyYW0od25kUHRyLT5oSW5zdGFuY2UsIGhEbGdUbXBsLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHBvZm4tPmh3bmRPd25lciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0V25kUHJvY0VudHJ5MTYoIkZpbGVTYXZlRGxnUHJvYyIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRFdPUkQpbHBvZm4gKTsKLQlwcmludGYoIkdldFNhdmVGaWxlTmFtZSAvLyByZXR1cm4gbHBzdHJGaWxlPSclcycgIVxuIiwgCi0JICAgICAgIChMUFNUUilQVFJfU0VHX1RPX0xJTihscG9mbi0+bHBzdHJGaWxlKSk7Ci0JcmV0dXJuIGJSZXQ7CisgIEhBTkRMRSAgICBoRGxnVG1wbDsKKyAgSEFORExFICAgIGhSZXNJbmZvOworICBISU5TVEFOQ0UgaEluc3Q7CisgIEJPT0wJICAgIGJSZXQ7CisgIExQQ1NUUiAgICBkbGdUZW1wbGF0ZTsKKyAgCisgIGlmIChscG9mbiA9PSBOVUxMKSByZXR1cm4gRkFMU0U7CisgIGlmIChscG9mbi0+RmxhZ3MgJiBPRk5fRU5BQkxFVEVNUExBVEVIQU5ETEUpIHsKKyAgICBkbGdUZW1wbGF0ZSA9IEdsb2JhbExvY2sobHBvZm4tPmhJbnN0YW5jZSk7CisgICAgaWYgKCFkbGdUZW1wbGF0ZSkgeworICAgICAgQ29tbURsZ0xhc3RFcnJvciA9IENERVJSX0xPQURSRVNGQUlMVVJFOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBpZiAobHBvZm4tPkZsYWdzICYgT0ZOX0VOQUJMRVRFTVBMQVRFKSB7CisgICAgICBoSW5zdCA9IGxwb2ZuLT5oSW5zdGFuY2U7CisgICAgICBoUmVzSW5mbyA9IEZpbmRSZXNvdXJjZShoSW5zdCwgbHBvZm4tPmxwVGVtcGxhdGVOYW1lLCBSVF9ESUFMT0cpOworICAgICAgaWYgKGhSZXNJbmZvID09IDApIHsKKwlDb21tRGxnTGFzdEVycm9yID0gQ0RFUlJfRklORFJFU0ZBSUxVUkU7CisJcmV0dXJuIEZBTFNFOworICAgICAgfQorICAgICAgaERsZ1RtcGwgPSBMb2FkUmVzb3VyY2UoaEluc3QsIGhSZXNJbmZvKTsKKyAgICAgIGlmIChoRGxnVG1wbCA9PSAwKSB7CisJQ29tbURsZ0xhc3RFcnJvciA9IENERVJSX0xPQURSRVNGQUlMVVJFOworCXJldHVybiBGQUxTRTsKKyAgICAgIH0KKyAgICAgIGRsZ1RlbXBsYXRlID0gR2xvYmFsTG9jayhoRGxnVG1wbCk7CisgICAgfSBlbHNlIHsKKyAgICAgIGRsZ1RlbXBsYXRlID0gc3lzcmVzX0RJQUxPR180OyAvKiBTQVZFRklMRURJQUxPRyAqLworICAgIH0KKyAgfQorICBoSW5zdCA9IEdldFdpbmRvd1dvcmQobHBvZm4tPmh3bmRPd25lciwgR1dXX0hJTlNUQU5DRSk7CisgIGJSZXQgPSBEaWFsb2dCb3hJbmRpcmVjdFBhcmFtUHRyKGhJbnN0LCBkbGdUZW1wbGF0ZSwgbHBvZm4tPmh3bmRPd25lciwKKwkJCQkgICBHZXRXbmRQcm9jRW50cnkxNigiRmlsZVNhdmVEbGdQcm9jIiksCisJCQkJICAgKERXT1JEKWxwb2ZuKTsgCisgIHByaW50ZigiR2V0U2F2ZUZpbGVOYW1lIC8vIHJldHVybiBscHN0ckZpbGU9JyVzJyAhXG4iLCAKKwkgKExQU1RSKVBUUl9TRUdfVE9fTElOKGxwb2ZuLT5scHN0ckZpbGUpKTsKKyAgcmV0dXJuIGJSZXQ7CiB9CiAKIApAQCAtMjI4LDEzICsyNTEsMTAgQEAKIHsKICAgICAgICAgV05EICAgICAqd25kUHRyOwogCUJPT0wJYlJldDsKLQogICAgICAgICB3bmRQdHIgPSBXSU5fRmluZFduZFB0cihscENoQ29sLT5od25kT3duZXIpOwotCWJSZXQgPSBEaWFsb2dCb3hQYXJhbSggd25kUHRyLT5oSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUFLRUlOVFJFU09VUkNFKENPTE9SRExHKSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHBDaENvbC0+aHduZE93bmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdldFduZFByb2NFbnRyeTE2KCJDb2xvckRsZ1Byb2MiKSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKERXT1JEKWxwQ2hDb2wpOworCWJSZXQgPSBEaWFsb2dCb3hJbmRpcmVjdFBhcmFtUHRyKHduZFB0ci0+aEluc3RhbmNlLCBzeXNyZXNfRElBTE9HXzgsCisJCWxwQ2hDb2wtPmh3bmRPd25lciwgR2V0V25kUHJvY0VudHJ5MTYoIkNvbG9yRGxnUHJvYyIpLCAKKwkJKERXT1JEKWxwQ2hDb2wpOwogCXJldHVybiBiUmV0OwogfQogCkBAIC00NTksMTMgKzQ3OSwxMSBAQAogI2VuZGlmCiAgICAgICBicmVhazsKICAgICAgY2FzZSBJRE9LOgotICAgICAgU2VuZERsZ0l0ZW1NZXNzYWdlKGhXbmQsIGVkdDEsIFdNX0dFVFRFWFQsIDAsIHN0cjE2KTsKLSAgICAgIHByaW50ZigiT0s6IHN0ciAlc1xuIixzdHIpOworICAgICAgU2VuZERsZ0l0ZW1NZXNzYWdlKGhXbmQsIGVkdDEsIFdNX0dFVFRFWFQsIDUxMSwgc3RyMTYpOwogICAgICAgaWYgKENPTU1ETEdfSXNQYXRoTmFtZShzdHIpKSB7CiAJT3BlbkRsZ19TY2FuRGlyKGhXbmQsIHN0cik7CiAgICAgICB9IGVsc2UgIHsJCiAJU2hvd1dpbmRvdyhoV25kLCBTV19ISURFKTsgCi0JcHJpbnRmKCJGaWxlT3BlbkRsZ1Byb2MgLy8gSURPSyBzdHI9JyVzJ1xuIiwgc3RyKTsKIAlzdHJjcHkoUFRSX1NFR19UT19MSU4obHBvZm4tPmxwc3RyRmlsZSksIHN0cik7CiAJbHBvZm4tPm5GaWxlT2Zmc2V0ID0gMDsKIAlscG9mbi0+bkZpbGVFeHRlbnNpb24gPSBzdHJsZW4oUFRSX1NFR19UT19MSU4obHBvZm4tPmxwc3RyRmlsZSkpIC0gMzsKQEAgLTcyMyw3ICs3NDEsNyBAQAogI2VuZGlmCiAgICAgICBicmVhazsKICAgICAgY2FzZSBJRE9LOgotICAgICAgU2VuZERsZ0l0ZW1NZXNzYWdlKGhXbmQsIGVkdDEsIFdNX0dFVFRFWFQsIDAsIHN0cjE2KTsKKyAgICAgIFNlbmREbGdJdGVtTWVzc2FnZShoV25kLCBlZHQxLCBXTV9HRVRURVhULCA1MTEsIHN0cjE2KTsKICAgICAgIGlmIChDT01NRExHX0lzUGF0aE5hbWUoc3RyKSkgewogCU9wZW5EbGdfU2NhbkRpcihoV25kLCBzdHIpOwogICAgICAgfSBlbHNlICB7CQpAQCAtNzk3LDI2ICs4MTUsMTYgQEAKICAqLwogQk9PTCBGaW5kVGV4dChMUEZJTkRSRVBMQUNFIGxwRmluZCkKIHsKLQlIQU5ETEUJaERsZ1RtcGw7Ci0JSEFORExFCWhSZXNJbmZvOwotICAgIFdORCAJKnduZFB0cjsKLQlCT09MCWJSZXQ7Ci0JaFJlc0luZm8gPSBGaW5kUmVzb3VyY2UoaFN5c1JlcywgTUFLRUlOVFJFU09VUkNFKEZJTkRETEcpLCBSVF9ESUFMT0cpOwotCWlmIChoUmVzSW5mbyA9PSAwKSB7Ci0JCUNvbW1EbGdMYXN0RXJyb3IgPSBDREVSUl9GSU5EUkVTRkFJTFVSRTsKLQkJcmV0dXJuIEZBTFNFOwotCQl9Ci0JaERsZ1RtcGwgPSBMb2FkUmVzb3VyY2UoaFN5c1JlcywgaFJlc0luZm8pOwotCWlmIChoRGxnVG1wbCA9PSAwKSB7Ci0JCUNvbW1EbGdMYXN0RXJyb3IgPSBDREVSUl9MT0FEUkVTRkFJTFVSRTsKLQkJcmV0dXJuIEZBTFNFOwotCQl9Ci0gICAgd25kUHRyID0gV0lOX0ZpbmRXbmRQdHIobHBGaW5kLT5od25kT3duZXIpOwotCWJSZXQgPSBEaWFsb2dCb3hJbmRpcmVjdFBhcmFtKHduZFB0ci0+aEluc3RhbmNlLCBoRGxnVG1wbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHBGaW5kLT5od25kT3duZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdldFduZFByb2NFbnRyeTE2KCJGaW5kVGV4dERsZ1Byb2MiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKERXT1JEKWxwRmluZCk7Ci0JcmV0dXJuIGJSZXQ7CisgIFdORCAgICAqd25kUHRyOworICBCT09MICAgYlJldDsKKyAgTFBDU1RSIGxwVGVtcGxhdGU7CisgIAorICBscFRlbXBsYXRlID0gc3lzcmVzX0RJQUxPR185OworICB3bmRQdHIgPSBXSU5fRmluZFduZFB0cihscEZpbmQtPmh3bmRPd25lcik7CisgIGJSZXQgPSBEaWFsb2dCb3hJbmRpcmVjdFBhcmFtUHRyKHduZFB0ci0+aEluc3RhbmNlLCBscFRlbXBsYXRlLAorCQkJCWxwRmluZC0+aHduZE93bmVyLCBHZXRXbmRQcm9jRW50cnkxNigiRmluZFRleHREbGdQcm9jIiksCisJCQkJKERXT1JEKWxwRmluZCk7CisgIHJldHVybiBiUmV0OwogfQogCiAKQEAgLTgyNSwyNiArODMzLDE2IEBACiAgKi8KIEJPT0wgUmVwbGFjZVRleHQoTFBGSU5EUkVQTEFDRSBscEZpbmQpCiB7Ci0JSEFORExFCWhEbGdUbXBsOwotCUhBTkRMRQloUmVzSW5mbzsKLSAgICBXTkQgCSp3bmRQdHI7Ci0JQk9PTAliUmV0OwotCWhSZXNJbmZvID0gRmluZFJlc291cmNlKGhTeXNSZXMsIE1BS0VJTlRSRVNPVVJDRShSRVBMQUNFRExHKSwgUlRfRElBTE9HKTsKLQlpZiAoaFJlc0luZm8gPT0gMCkgewotCQlDb21tRGxnTGFzdEVycm9yID0gQ0RFUlJfRklORFJFU0ZBSUxVUkU7Ci0JCXJldHVybiBGQUxTRTsKLQkJfQotCWhEbGdUbXBsID0gTG9hZFJlc291cmNlKGhTeXNSZXMsIGhSZXNJbmZvKTsKLQlpZiAoaERsZ1RtcGwgPT0gMCkgewotCQlDb21tRGxnTGFzdEVycm9yID0gQ0RFUlJfTE9BRFJFU0ZBSUxVUkU7Ci0JCXJldHVybiBGQUxTRTsKLQkJfQotICAgIHduZFB0ciA9IFdJTl9GaW5kV25kUHRyKGxwRmluZC0+aHduZE93bmVyKTsKLQliUmV0ID0gRGlhbG9nQm94SW5kaXJlY3RQYXJhbSh3bmRQdHItPmhJbnN0YW5jZSwgaERsZ1RtcGwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxwRmluZC0+aHduZE93bmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZXRXbmRQcm9jRW50cnkxNigiUmVwbGFjZVRleHREbGdQcm9jIiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChEV09SRClscEZpbmQpOwotCXJldHVybiBiUmV0OworICBXTkQgICAgKnduZFB0cjsKKyAgQk9PTCAgIGJSZXQ7CisgIExQQ1NUUiBscFRlbXBsYXRlOworCisgIGxwVGVtcGxhdGUgPSBzeXNyZXNfRElBTE9HXzEwOworICB3bmRQdHIgPSBXSU5fRmluZFduZFB0cihscEZpbmQtPmh3bmRPd25lcik7CisgIGJSZXQgPSBEaWFsb2dCb3hJbmRpcmVjdFBhcmFtUHRyKHduZFB0ci0+aEluc3RhbmNlLCBscFRlbXBsYXRlLAorCQkJCSAgIGxwRmluZC0+aHduZE93bmVyLCBHZXRXbmRQcm9jRW50cnkxNigiUmVwbGFjZVRleHREbGdQcm9jIiksCisJCQkJICAgKERXT1JEKWxwRmluZCk7CisgIHJldHVybiBiUmV0OwogfQogCiAKQEAgLTg1MywyNCArODUxLDI0IEBACiAgKi8KIEJPT0wgRmluZFRleHREbGdQcm9jKEhXTkQgaFduZCwgV09SRCB3TXNnLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0pCiB7Ci0Jc3dpdGNoICh3TXNnKSB7Ci0JCWNhc2UgV01fSU5JVERJQUxPRzoKLQkJCXByaW50ZigiRmluZFRleHREbGdQcm9jIC8vIFdNX0lOSVRESUFMT0cgbFBhcmFtPSUwOGxYXG4iLCBsUGFyYW0pOwotCQkJU2hvd1dpbmRvdyhoV25kLCBTV19TSE9XTk9STUFMKTsKLQkJCXJldHVybiAoVFJVRSk7Ci0KLQkJY2FzZSBXTV9DT01NQU5EOgotCQkJc3dpdGNoICh3UGFyYW0pIHsKLQkJCQljYXNlIElET0s6Ci0JCQkJCUVuZERpYWxvZyhoV25kLCBUUlVFKTsKLQkJCQkJcmV0dXJuKFRSVUUpOwotCQkJCWNhc2UgSURDQU5DRUw6Ci0JCQkJCUVuZERpYWxvZyhoV25kLCBGQUxTRSk7Ci0JCQkJCXJldHVybihUUlVFKTsKLQkJCQl9Ci0JCQlyZXR1cm4oRkFMU0UpOwotCQl9Ci0JcmV0dXJuIEZBTFNFOworICBzd2l0Y2ggKHdNc2cpIHsKKyAgIGNhc2UgV01fSU5JVERJQUxPRzoKKyAgICBwcmludGYoIkZpbmRUZXh0RGxnUHJvYyAvLyBXTV9JTklURElBTE9HIGxQYXJhbT0lMDhsWFxuIiwgbFBhcmFtKTsKKyAgICBTaG93V2luZG93KGhXbmQsIFNXX1NIT1dOT1JNQUwpOworICAgIHJldHVybiAoVFJVRSk7CisgICAgCisgICBjYXNlIFdNX0NPTU1BTkQ6CisgICAgc3dpdGNoICh3UGFyYW0pIHsKKyAgICAgY2FzZSBJRE9LOgorICAgICAgRW5kRGlhbG9nKGhXbmQsIFRSVUUpOworICAgICAgcmV0dXJuKFRSVUUpOworICAgICBjYXNlIElEQ0FOQ0VMOgorICAgICAgRW5kRGlhbG9nKGhXbmQsIEZBTFNFKTsKKyAgICAgIHJldHVybihUUlVFKTsKKyAgICB9CisgICAgcmV0dXJuKEZBTFNFKTsKKyAgfQorICByZXR1cm4gRkFMU0U7CiB9CiAKIApAQCAtODc5LDI0ICs4NzcsMjQgQEAKICAqLwogQk9PTCBSZXBsYWNlVGV4dERsZ1Byb2MoSFdORCBoV25kLCBXT1JEIHdNc2csIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSkKIHsKLQlzd2l0Y2ggKHdNc2cpIHsKLQkJY2FzZSBXTV9JTklURElBTE9HOgotCQkJcHJpbnRmKCJSZXBsYWNlVGV4dERsZ1Byb2MgLy8gV01fSU5JVERJQUxPRyBsUGFyYW09JTA4bFhcbiIsIGxQYXJhbSk7Ci0JCQlTaG93V2luZG93KGhXbmQsIFNXX1NIT1dOT1JNQUwpOwotCQkJcmV0dXJuIChUUlVFKTsKLQotCQljYXNlIFdNX0NPTU1BTkQ6Ci0JCQlzd2l0Y2ggKHdQYXJhbSkgewotCQkJCWNhc2UgSURPSzoKLQkJCQkJRW5kRGlhbG9nKGhXbmQsIFRSVUUpOwotCQkJCQlyZXR1cm4oVFJVRSk7Ci0JCQkJY2FzZSBJRENBTkNFTDoKLQkJCQkJRW5kRGlhbG9nKGhXbmQsIEZBTFNFKTsKLQkJCQkJcmV0dXJuKFRSVUUpOwotCQkJCX0KLQkJCXJldHVybihGQUxTRSk7Ci0JCX0KLQlyZXR1cm4gRkFMU0U7CisgIHN3aXRjaCAod01zZykgeworICAgY2FzZSBXTV9JTklURElBTE9HOgorICAgIHByaW50ZigiUmVwbGFjZVRleHREbGdQcm9jIC8vIFdNX0lOSVRESUFMT0cgbFBhcmFtPSUwOGxYXG4iLCBsUGFyYW0pOworICAgIFNob3dXaW5kb3coaFduZCwgU1dfU0hPV05PUk1BTCk7CisgICAgcmV0dXJuIChUUlVFKTsKKyAgICAKKyAgIGNhc2UgV01fQ09NTUFORDoKKyAgICBzd2l0Y2ggKHdQYXJhbSkgeworICAgICBjYXNlIElET0s6CisgICAgICBFbmREaWFsb2coaFduZCwgVFJVRSk7CisgICAgICByZXR1cm4oVFJVRSk7CisgICAgIGNhc2UgSURDQU5DRUw6CisgICAgICBFbmREaWFsb2coaFduZCwgRkFMU0UpOworICAgICAgcmV0dXJuKFRSVUUpOworICAgIH0KKyAgICByZXR1cm4oRkFMU0UpOworICB9CisgIHJldHVybiBGQUxTRTsKIH0KIAogCkBAIC05MDUsMzYgKzkwMywyNiBAQAogICovCiBCT09MIFByaW50RGxnKExQUFJJTlRETEcgbHBQcmludCkKIHsKLQlIQU5ETEUJaERsZ1RtcGw7Ci0JSEFORExFCWhSZXNJbmZvOwotICAgIFdORCAJKnduZFB0cjsKLQlCT09MCWJSZXQ7Ci0JcHJpbnRmKCJQcmludERsZyglcCkgLy8gRmxhZ3M9JTA4bFhcbiIsIGxwUHJpbnQsIGxwUHJpbnQtPkZsYWdzKTsKLQlpZiAobHBQcmludC0+RmxhZ3MgJiBQRF9QUklOVFNFVFVQKQotCQloUmVzSW5mbyA9IEZpbmRSZXNvdXJjZShoU3lzUmVzLCBNQUtFSU5UUkVTT1VSQ0UoUFJJTlRTRVRVUERMRyksIFJUX0RJQUxPRyk7Ci0JZWxzZQotCQloUmVzSW5mbyA9IEZpbmRSZXNvdXJjZShoU3lzUmVzLCBNQUtFSU5UUkVTT1VSQ0UoUFJJTlRETEcpLCBSVF9ESUFMT0cpOwotCWlmIChoUmVzSW5mbyA9PSAwKSB7Ci0JCUNvbW1EbGdMYXN0RXJyb3IgPSBDREVSUl9GSU5EUkVTRkFJTFVSRTsKLQkJcmV0dXJuIEZBTFNFOwotCQl9Ci0JaERsZ1RtcGwgPSBMb2FkUmVzb3VyY2UoaFN5c1JlcywgaFJlc0luZm8pOwotCWlmIChoRGxnVG1wbCA9PSAwKSB7Ci0JCUNvbW1EbGdMYXN0RXJyb3IgPSBDREVSUl9MT0FEUkVTRkFJTFVSRTsKLQkJcmV0dXJuIEZBTFNFOwotCQl9Ci0gICAgd25kUHRyID0gV0lOX0ZpbmRXbmRQdHIobHBQcmludC0+aHduZE93bmVyKTsKLQlpZiAobHBQcmludC0+RmxhZ3MgJiBQRF9QUklOVFNFVFVQKQotICAgICAgICAgICAgYlJldCA9IERpYWxvZ0JveEluZGlyZWN0UGFyYW0od25kUHRyLT5oSW5zdGFuY2UsIGhEbGdUbXBsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHBQcmludC0+aHduZE93bmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0V25kUHJvY0VudHJ5MTYoIlByaW50U2V0dXBEbGdQcm9jIiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRFdPUkQpbHBQcmludCk7Ci0JZWxzZQotICAgICAgICAgICAgYlJldCA9IERpYWxvZ0JveEluZGlyZWN0UGFyYW0od25kUHRyLT5oSW5zdGFuY2UsIGhEbGdUbXBsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHBQcmludC0+aHduZE93bmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0V25kUHJvY0VudHJ5MTYoIlByaW50RGxnUHJvYyIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKERXT1JEKWxwUHJpbnQpOwotCXJldHVybiBiUmV0OworICBXTkQgICAgKnduZFB0cjsKKyAgQk9PTCAgIGJSZXQ7CisgIExQQ1NUUiBscFRlbXBsYXRlOworICAKKyAgcHJpbnRmKCJQcmludERsZyglcCkgLy8gRmxhZ3M9JTA4bFhcbiIsIGxwUHJpbnQsIGxwUHJpbnQtPkZsYWdzKTsKKyAgaWYgKGxwUHJpbnQtPkZsYWdzICYgUERfUFJJTlRTRVRVUCkgIHsKKyAgICBscFRlbXBsYXRlID0gc3lzcmVzX0RJQUxPR182OworICB9IGVsc2UgIHsKKyAgICBscFRlbXBsYXRlID0gc3lzcmVzX0RJQUxPR181OworICB9CisgIHduZFB0ciA9IFdJTl9GaW5kV25kUHRyKGxwUHJpbnQtPmh3bmRPd25lcik7CisgIGlmIChscFByaW50LT5GbGFncyAmIFBEX1BSSU5UU0VUVVApCisgIGJSZXQgPSBEaWFsb2dCb3hJbmRpcmVjdFBhcmFtUHRyKHduZFB0ci0+aEluc3RhbmNlLCBscFRlbXBsYXRlLAorCQkJCSAgIGxwUHJpbnQtPmh3bmRPd25lciwgR2V0V25kUHJvY0VudHJ5MTYoIlByaW50U2V0dXBEbGdQcm9jIiksCisJCQkJICAgKERXT1JEKWxwUHJpbnQpOworICBlbHNlCisgIGJSZXQgPSBEaWFsb2dCb3hJbmRpcmVjdFBhcmFtUHRyKHduZFB0ci0+aEluc3RhbmNlLCBscFRlbXBsYXRlLAorCQkJCSAgIGxwUHJpbnQtPmh3bmRPd25lciwgR2V0V25kUHJvY0VudHJ5MTYoIlByaW50RGxnUHJvYyIpLAorCQkJCSAgIChEV09SRClscFByaW50KTsKKyAgcmV0dXJuIGJSZXQ7CiB9CiAKIApAQCAtOTQzLDI0ICs5MzEsMjQgQEAKICAqLwogQk9PTCBQcmludERsZ1Byb2MoSFdORCBoV25kLCBXT1JEIHdNc2csIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSkKIHsKLQlzd2l0Y2ggKHdNc2cpIHsKLQkJY2FzZSBXTV9JTklURElBTE9HOgotCQkJcHJpbnRmKCJQcmludERsZ1Byb2MgLy8gV01fSU5JVERJQUxPRyBsUGFyYW09JTA4bFhcbiIsIGxQYXJhbSk7Ci0JCQlTaG93V2luZG93KGhXbmQsIFNXX1NIT1dOT1JNQUwpOwotCQkJcmV0dXJuIChUUlVFKTsKLQotCQljYXNlIFdNX0NPTU1BTkQ6Ci0JCQlzd2l0Y2ggKHdQYXJhbSkgewotCQkJCWNhc2UgSURPSzoKLQkJCQkJRW5kRGlhbG9nKGhXbmQsIFRSVUUpOwotCQkJCQlyZXR1cm4oVFJVRSk7Ci0JCQkJY2FzZSBJRENBTkNFTDoKLQkJCQkJRW5kRGlhbG9nKGhXbmQsIEZBTFNFKTsKLQkJCQkJcmV0dXJuKFRSVUUpOwotCQkJCX0KLQkJCXJldHVybihGQUxTRSk7Ci0JCX0KLQlyZXR1cm4gRkFMU0U7CisgIHN3aXRjaCAod01zZykgeworICAgY2FzZSBXTV9JTklURElBTE9HOgorICAgIHByaW50ZigiUHJpbnREbGdQcm9jIC8vIFdNX0lOSVRESUFMT0cgbFBhcmFtPSUwOGxYXG4iLCBsUGFyYW0pOworICAgIFNob3dXaW5kb3coaFduZCwgU1dfU0hPV05PUk1BTCk7CisgICAgcmV0dXJuIChUUlVFKTsKKyAgICAKKyAgIGNhc2UgV01fQ09NTUFORDoKKyAgICBzd2l0Y2ggKHdQYXJhbSkgeworICAgICBjYXNlIElET0s6CisgICAgICBFbmREaWFsb2coaFduZCwgVFJVRSk7CisgICAgICByZXR1cm4oVFJVRSk7CisgICAgIGNhc2UgSURDQU5DRUw6CisgICAgICBFbmREaWFsb2coaFduZCwgRkFMU0UpOworICAgICAgcmV0dXJuKFRSVUUpOworICAgIH0KKyAgICByZXR1cm4oRkFMU0UpOworICB9CisgIHJldHVybiBGQUxTRTsKIH0KIAogCkBAIC05NjksMjQgKzk1NywyNCBAQAogICovCiBCT09MIFByaW50U2V0dXBEbGdQcm9jKEhXTkQgaFduZCwgV09SRCB3TXNnLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0pCiB7Ci0Jc3dpdGNoICh3TXNnKSB7Ci0JCWNhc2UgV01fSU5JVERJQUxPRzoKLQkJCXByaW50ZigiUHJpbnRTZXR1cERsZ1Byb2MgLy8gV01fSU5JVERJQUxPRyBsUGFyYW09JTA4bFhcbiIsIGxQYXJhbSk7Ci0JCQlTaG93V2luZG93KGhXbmQsIFNXX1NIT1dOT1JNQUwpOwotCQkJcmV0dXJuIChUUlVFKTsKLQotCQljYXNlIFdNX0NPTU1BTkQ6Ci0JCQlzd2l0Y2ggKHdQYXJhbSkgewotCQkJCWNhc2UgSURPSzoKLQkJCQkJRW5kRGlhbG9nKGhXbmQsIFRSVUUpOwotCQkJCQlyZXR1cm4oVFJVRSk7Ci0JCQkJY2FzZSBJRENBTkNFTDoKLQkJCQkJRW5kRGlhbG9nKGhXbmQsIEZBTFNFKTsKLQkJCQkJcmV0dXJuKFRSVUUpOwotCQkJCX0KLQkJCXJldHVybihGQUxTRSk7Ci0JCX0KLQlyZXR1cm4gRkFMU0U7CisgIHN3aXRjaCAod01zZykgeworICAgY2FzZSBXTV9JTklURElBTE9HOgorICAgIHByaW50ZigiUHJpbnRTZXR1cERsZ1Byb2MgLy8gV01fSU5JVERJQUxPRyBsUGFyYW09JTA4bFhcbiIsIGxQYXJhbSk7CisgICAgU2hvd1dpbmRvdyhoV25kLCBTV19TSE9XTk9STUFMKTsKKyAgICByZXR1cm4gKFRSVUUpOworICAgIAorICAgY2FzZSBXTV9DT01NQU5EOgorICAgIHN3aXRjaCAod1BhcmFtKSB7CisgICAgIGNhc2UgSURPSzoKKyAgICAgIEVuZERpYWxvZyhoV25kLCBUUlVFKTsKKyAgICAgIHJldHVybihUUlVFKTsKKyAgICAgY2FzZSBJRENBTkNFTDoKKyAgICAgIEVuZERpYWxvZyhoV25kLCBGQUxTRSk7CisgICAgICByZXR1cm4oVFJVRSk7CisgICAgfQorICAgIHJldHVybihGQUxTRSk7CisgIH0KKyAgcmV0dXJuIEZBTFNFOwogfQogCiAKQEAgLTEwMDQsNyArOTkyLDcgQEAKICAqLwogaW50IEdldEZpbGVUaXRsZShMUENTVFIgbHBGaWxlLCBMUFNUUiBscFRpdGxlLCBVSU5UIGNiQnVmKQogewotCWludAkJaSwgbGVuOworCWludCAgICAJaSwgbGVuOwogCXByaW50ZigiR2V0RmlsZVRpdGxlKCVwICVwICVkKTsgXG4iLCBscEZpbGUsIGxwVGl0bGUsIGNiQnVmKTsKIAlpZiAobHBGaWxlID09IE5VTEwgfHwgbHBUaXRsZSA9PSBOVUxMKSByZXR1cm4gLTE7CiAJbGVuID0gc3RybGVuKGxwRmlsZSk7CkBAIC0xMDE1LDEzICsxMDAzLDExIEBACiAJbGVuLS07CiAJaWYgKGxwRmlsZVtsZW5dID09ICcvJyB8fCBscEZpbGVbbGVuXSA9PSAnXFwnIHx8IGxwRmlsZVtsZW5dID09ICc6JykgcmV0dXJuIC0xOwogCWZvciAoaSA9IGxlbjsgaSA+PSAwOyBpLS0pIHsKLQkJaWYgKGxwRmlsZVtpXSA9PSAnLycgfHwgCi0JCQlscEZpbGVbaV0gPT0gJ1xcJyB8fCAKLQkJCWxwRmlsZVtpXSA9PSAnOicpIHsKLQkJCWkrKzsKLQkJCWJyZWFrOwotCQkJfQotCQl9CisJICBpZiAobHBGaWxlW2ldID09ICcvJyB8fCAgbHBGaWxlW2ldID09ICdcXCcgfHwgIGxwRmlsZVtpXSA9PSAnOicpIHsKKwkgICAgaSsrOworCSAgICBicmVhazsKKwkgIH0KKwl9CiAJcHJpbnRmKCJcbi0tLT4gJyVzJyAiLCAmbHBGaWxlW2ldKTsKIAlsZW4gPSBtaW4oY2JCdWYsIHN0cmxlbigmbHBGaWxlW2ldKSArIDEpOwogCXN0cm5jcHkobHBUaXRsZSwgJmxwRmlsZVtpXSwgbGVuICsgMSk7CmRpZmYgLS1naXQgYS9taXNjL2V4ZWMuYyBiL21pc2MvZXhlYy5jCmluZGV4IGUxMGNiMjEuLmFkNTVjMWMgMTAwNjQ0Ci0tLSBhL21pc2MvZXhlYy5jCisrKyBiL21pc2MvZXhlYy5jCkBAIC0xMSwxMCArMTEsNyBAQAogI2luY2x1ZGUgInByb3RvdHlwZXMuaCIKICNpbmNsdWRlICJkbGxzLmgiCiAjaW5jbHVkZSAid2luZG93cy5oIgotI2luY2x1ZGUgImlmMTYzMi5oIgogI2luY2x1ZGUgImNhbGxiYWNrLmgiCi0jaW5jbHVkZSAibGlicmFyeS5oIgotI2luY2x1ZGUgIm5lX2ltYWdlLmgiCiAjaW5jbHVkZSAic3RkZGVidWcuaCIKICNpbmNsdWRlICJkZWJ1Zy5oIgogCkBAIC0zMyw4OCArMzAsNiBAQAogI2RlZmluZSBIRUxQX01VTFRJS0VZICAgICAweDAyMDEKICNkZWZpbmUgSEVMUF9TRVRXSU5QT1MgICAgMHgwMjAzCiAKLXR5cGVkZWYgc3RydWN0IHsKLQlXT1JECXdFbnZTZWc7Ci0JTFBTVFIJbHBDbWRMaW5lOwotCUxQVk9JRAlscENtZFNob3c7Ci0JRFdPUkQJZHdSZXNlcnZlZDsKLQl9IFBBUkFNQkxPQ0s7Ci0KLXR5cGVkZWYgQk9PTCAoQ0FMTEJBQ0sgKiBMUEZOV0lOTUFJTikoSEFORExFLCBIQU5ETEUsIExQU1RSLCBpbnQpOwotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgkJCQlMb2FkTW9kdWxlCVtLRVJORUwuNDVdCi0gKi8KLUhBTkRMRSBMb2FkTW9kdWxlKExQU1RSIG1vZHVsZWZpbGUsIExQVk9JRCBscFBhcmFtQmxrKQotewotCVBBUkFNQkxPQ0sgICpwYmxrID0gbHBQYXJhbUJsazsKLQlXT1JEIAkqbHBDbWRTaG93OwotICAgIAlkcHJpbnRmX2V4ZWMoc3RkZGViLCJMb2FkTW9kdWxlICclcycgJXBcbiIsIG1vZHVsZWZpbGUsIGxwUGFyYW1CbGspOwotCWlmIChscFBhcmFtQmxrID09IE5VTEwpIHJldHVybiAwOwotCWxwQ21kU2hvdyA9IChXT1JEICopcGJsay0+bHBDbWRTaG93OwotCXJldHVybiBXaW5FeGVjKHBibGstPmxwQ21kTGluZSwgbHBDbWRTaG93WzFdKTsKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoJCQkJV2luRXhlYwkJW0tFUk5FTC4xNjZdCi0gKi8KLVdPUkQgV2luRXhlYyhMUFNUUiBscENtZExpbmUsIFdPUkQgbkNtZFNob3cpCi17Ci0JaW50IAkJYyA9IDA7Ci0JaW50IAkJeCwgeDI7Ci0JY2hhciAJCSpBcmdWWzIwXTsKLQlISU5TVEFOQ0UJaEluc3QgPSAwOwotCUhBTkRMRQkJaFRhc2sgPSAwOwotICAgIAlkcHJpbnRmX2V4ZWMoc3RkZGViLCJXaW5FeGVjKCclcycsICUwNFgpXG4iLCBscENtZExpbmUsIG5DbWRTaG93KTsKLS8qCUFyZ1ZbMF0gPSAid2luZSI7Ci0JYyA9IDE7ICovCi0JZm9yICh4ID0geDIgPSAwOyB4IDwgc3RybGVuKGxwQ21kTGluZSkgKyAxOyB4KyspIHsKLQkJaWYgKChscENtZExpbmVbeF0gPT0gJyAnKSB8fCAobHBDbWRMaW5lW3hdID09ICdcMCcpKSB7Ci0JCQlBcmdWW2NdID0gKGNoYXIgKiltYWxsb2MoeCAtIHgyICsgMSk7Ci0JCQlzdHJuY3B5KEFyZ1ZbY10sICZscENtZExpbmVbeDJdLCB4IC0geDIpOwotCQkJQXJnVltjXVt4IC0geDJdID0gJ1wwJzsKLQkJCWMrKzsgICB4MiA9IHggKyAxOwotCQkJfQkJCQkJCQkgIAotCQl9ICAKLQlBcmdWW2NdID0gTlVMTDsKLSAgICBmb3IgKGMgPSAwOyBBcmdWW2NdICE9IE5VTEw7IGMrKykgCi0JZHByaW50Zl9leGVjKHN0ZGRlYiwiLS0+ICclcycgXG4iLCBBcmdWW2NdKTsKLQotICAgICAgICBpZiAoKGhJbnN0ID0gTG9hZEltYWdlKEFyZ1ZbMF0sIEVYRSwgMSkpID09IChISU5TVEFOQ0UpIE5VTEwgKSB7Ci0gICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIndpbmU6IGNhbid0IGZpbmQgJXMhLlxuIiwgQXJnVlswXSk7Ci0gICAgICAgIH0KLSNpZiAwCi0Jc3dpdGNoKGZvcmsoKSkgewotCQljYXNlIC0xOgotICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsIkNhbid0ICdmb3JrJyBwcm9jZXNzICFcbiIpOwotCQkJYnJlYWs7Ci0JCWNhc2UgMDoKLQkJCWlmICgoaEluc3QgPSBMb2FkSW1hZ2UoQXJnVlswXSwgRVhFLCAxKSkgPT0gKEhJTlNUQU5DRSkgTlVMTCApIHsKLQkJCQlmcHJpbnRmKHN0ZGVyciwgIndpbmU6IGNhbid0IGZpbmQgJXMhLlxuIiwgQXJnVlswXSk7Ci0gICAgICAgICAgICAgICAgCQlmcHJpbnRmKHN0ZGVyciwiQ2hpbGQgcHJvY2VzcyBkaWVkICFcbiIpOwotCQkJCWV4aXQoMSk7Ci0JCQkJfQotCQkJU3RhcnROZXdUYXNrKGhJbnN0KTsgCi0vKgkJCWhUYXNrID0gQ3JlYXRlTmV3VGFzaygwKTsKLSAgICAgICAgICAgIAkJZHByaW50Zl9leGVjKHN0ZGRlYiwKLQkJCQkiV2luRXhlYyAvLyBOZXcgVGFzayBoVGFzaz0lMDRYICFcbiIsIGhUYXNrKTsKLQkJCWV4ZWN2cChBcmdWWzBdLCBBcmdWKTsgKi8KLQotICAgICAgICAgICAgCQlmcHJpbnRmKHN0ZGVyciwiQ2hpbGQgcHJvY2VzcyBkaWVkICFcbiIpOwotCQkJZXhpdCgxKTsKLQkJZGVmYXVsdDoKLSAgICAgICAgICAgIAkJZHByaW50Zl9leGVjKHN0ZGRlYiwKLQkJCSJXaW5FeGVjIChNYWluIHByb2Nlc3Mgc3RheSBhbGl2ZSkgaFRhc2s9JTA0WCAhXG4iLCAKLQkJCWhUYXNrKTsKLQkJCWJyZWFrOyAgICAgICAgIAotCQl9Ci0jZW5kaWYKLQlmb3IgKGMgPSAwOyBBcmdWW2NdICE9IE5VTEw7IGMrKykgCWZyZWUoQXJnVltjXSk7Ci0JcmV0dXJuIGhUYXNrOwotfQotCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgkJCQlFeGl0V2luZG93cwkJW1VTRVIuN10KZGlmZiAtLWdpdCBhL21pc2MvZmlsZS5jIGIvbWlzYy9maWxlLmMKaW5kZXggYzcxNjczYS4uMzFjMmNmYyAxMDA2NDQKLS0tIGEvbWlzYy9maWxlLmMKKysrIGIvbWlzYy9maWxlLmMKQEAgLTQyLDEzICs0MiwxOSBAQAogewogICBpbnQgIGhhbmRsZTsKICAgY2hhciAqVW5peEZpbGVOYW1lOworICBpbnQgbW9kZSA9IDA7CiAKICAgZHByaW50Zl9maWxlKHN0ZGRlYiwgIl9sb3Blbjogb3BlbignJXMnLCAlWCk7XG4iLCBscFBhdGhOYW1lLCBpUmVhZFdyaXRlKTsKICAgaWYgKChVbml4RmlsZU5hbWUgPSBET1NfR2V0VW5peEZpbGVOYW1lKGxwUGF0aE5hbWUpKSA9PSBOVUxMKQogICAJcmV0dXJuIEhGSUxFX0VSUk9SOwotICBpUmVhZFdyaXRlICY9IDB4MDAwRjsKLSAgaGFuZGxlID0gIG9wZW4gKFVuaXhGaWxlTmFtZSwgaVJlYWRXcml0ZSk7Ci0gIGlmKCAoIGhhbmRsZSA9PSAtMSApICYmIE9wdGlvbnMuYWxsb3dSZWFkT25seSApCisgIHN3aXRjaChpUmVhZFdyaXRlICYgMykKKyAgeworICBjYXNlIE9GX1JFQUQ6ICAgICAgbW9kZSA9IE9fUkRPTkxZOyBicmVhazsKKyAgY2FzZSBPRl9XUklURTogICAgIG1vZGUgPSBPX1dST05MWTsgYnJlYWs7CisgIGNhc2UgT0ZfUkVBRFdSSVRFOiBtb2RlID0gT19SRFdSOyBicmVhazsKKyAgfQorICBoYW5kbGUgPSBvcGVuKCBVbml4RmlsZU5hbWUsIG1vZGUgKTsKKyAgaWYgKCggaGFuZGxlID09IC0xICkgJiYgT3B0aW9ucy5hbGxvd1JlYWRPbmx5KQogICAgIGhhbmRsZSA9IG9wZW4oIFVuaXhGaWxlTmFtZSwgT19SRE9OTFkgKTsKIAogICBkcHJpbnRmX2ZpbGUoc3RkZGViLCAiX2xvcGVuOiBvcGVuOiAlcyAoaGFuZGxlICVkKVxuIiwgVW5peEZpbGVOYW1lLCBoYW5kbGUpOwpAQCAtMTEyLDE3ICsxMTgsMTQgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIElOVCBPcGVuRmlsZSAoTFBTVFIgbHBGaWxlTmFtZSwgTFBPRlNUUlVDVCBvZnMsIFdPUkQgd1N0eWxlKQogewotI2lmZGVmIFdJTkVMSUIKLSAgICBkcHJpbnRmX2ZpbGUoc3RkbmltcCwgIk9wZW5GaWxlOiBub3QgaW1wbGVtZW50ZWRcbiIpOwotI2Vsc2UKLSAgICBjaGFyICAgICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lW01BWF9QQVRIKzFdOwotICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uOwotICAgIHN0cnVjdCBzdGF0ICAgICAgICAgICAgICAgczsKLSAgICBzdHJ1Y3QgdG0gICAgICAgICAgICAgICAgICpub3c7Ci0gICAgaW50ICAgICAgICAgICAgICAgICAgICAgICByZXM7Ci0gICAgaW50ICAgICAgICAgICAgICAgICAgICAgICB2ZXJpZnlfdGltZTsKKyAgICBjaGFyICAgICAgICAgZmlsZW5hbWVbTUFYX1BBVEgrMV07CisgICAgaW50ICAgICAgICAgIGFjdGlvbjsKKyAgICBzdHJ1Y3Qgc3RhdCAgczsKKyAgICBzdHJ1Y3QgdG0gICAqbm93OworICAgIGludCAgICAgICAgICByZXMsIGhhbmRsZTsKKyAgICBpbnQgICAgICAgICAgdmVyaWZ5X3RpbWU7CiAgIAotICAgIGRwcmludGZfZmlsZShzdGRkZWIsIk9wZW5maWxlKCVzLDxzdHJ1Y3Q+LCVkKSAiLGxwRmlsZU5hbWUsd1N0eWxlKTsKKyAgICBkcHJpbnRmX2ZpbGUoc3RkZGViLCJPcGVuZmlsZSglcyw8c3RydWN0PiwlZClcbiIsbHBGaWxlTmFtZSx3U3R5bGUpOwogICAKICAgICBhY3Rpb24gPSB3U3R5bGUgJiAweGZmMDA7CiAgIApAQCAtMTMxLDMxICsxMzQsMjkgQEAKICAgICAgICBoYW5kbGUgaXQgZmlyc3QgKi8KIAogICAgIGlmIChhY3Rpb24gJiBPRl9DUkVBVEUpCi0gICAgICB7Ci0gICAgICBpbnQgaGFuZGxlOwotICAgICAgY2hhciAqdW5peGZpbGVuYW1lOworICAgIHsKKyAgICAgICAgY2hhciAqdW5peGZpbGVuYW1lOwogCi0gICAgICBpZiAoIShhY3Rpb24gJiBPRl9SRU9QRU4pKQotICAgICAgICBzdHJjcHkob2ZzLT5zelBhdGhOYW1lLCBscEZpbGVOYW1lKTsKLSAgICAgIG9mcy0+Y0J5dGVzID0gc2l6ZW9mKE9GU1RSVUNUKTsKLSAgICAgIG9mcy0+ZkZpeGVkRGlzayA9IEZBTFNFOwotICAgICAgb2ZzLT5uRXJyQ29kZSA9IDA7Ci0gICAgICAqKChpbnQqKW9mcy0+cmVzZXJ2ZWQpID0gMDsKKyAgICAgICAgaWYgKCEoYWN0aW9uICYgT0ZfUkVPUEVOKSkgc3RyY3B5KG9mcy0+c3pQYXRoTmFtZSwgbHBGaWxlTmFtZSk7CisgICAgICAgIG9mcy0+Y0J5dGVzID0gc2l6ZW9mKE9GU1RSVUNUKTsKKyAgICAgICAgb2ZzLT5mRml4ZWREaXNrID0gRkFMU0U7CisgICAgICAgIG9mcy0+bkVyckNvZGUgPSAwOworICAgICAgICAqKChpbnQqKW9mcy0+cmVzZXJ2ZWQpID0gMDsKIAotICAgICAgaWYgKCh1bml4ZmlsZW5hbWUgPSBET1NfR2V0VW5peEZpbGVOYW1lIChvZnMtPnN6UGF0aE5hbWUpKSA9PSBOVUxMKQotICAgICAgewotICAgICAgICBlcnJub190b19kb3NlcnIoKTsKLQlvZnMtPm5FcnJDb2RlID0gRXh0ZW5kZWRFcnJvcjsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgICAgfQotICAgICAgaGFuZGxlID0gb3BlbiAodW5peGZpbGVuYW1lLCAod1N0eWxlICYgMHgwMDAzKSB8IE9fQ1JFQVQsIDB4NjY2KTsKLSAgICAgIGlmIChoYW5kbGUgPT0gLTEpCi0gICAgICB7Ci0JZXJybm9fdG9fZG9zZXJyKCk7Ci0Jb2ZzLT5uRXJyQ29kZSA9IEV4dGVuZGVkRXJyb3I7Ci0gICAgICB9ICAgCi0gICAgICByZXR1cm4gaGFuZGxlOwotICAgICAgfQorICAgICAgICBpZiAoKHVuaXhmaWxlbmFtZSA9IERPU19HZXRVbml4RmlsZU5hbWUgKG9mcy0+c3pQYXRoTmFtZSkpID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGVycm5vX3RvX2Rvc2VycigpOworICAgICAgICAgICAgb2ZzLT5uRXJyQ29kZSA9IEV4dGVuZGVkRXJyb3I7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgaGFuZGxlID0gb3BlbiAodW5peGZpbGVuYW1lLCAod1N0eWxlICYgMHgwMDAzKSB8IE9fQ1JFQVQsIDB4NjY2KTsKKyAgICAgICAgaWYgKGhhbmRsZSA9PSAtMSkKKyAgICAgICAgeworICAgICAgICAgICAgZXJybm9fdG9fZG9zZXJyKCk7CisgICAgICAgICAgICBvZnMtPm5FcnJDb2RlID0gRXh0ZW5kZWRFcnJvcjsKKyAgICAgICAgfSAgIAorICAgICAgICByZXR1cm4gaGFuZGxlOworICAgIH0KIAogCiAgICAgLyogSWYgcGF0aCBpc24ndCBnaXZlbiwgdHJ5IHRvIGZpbmQgdGhlIGZpbGUuICovCkBAIC0xNjYsMjcgKzE2Nyw1MyBAQAogCSAgICAgIGluZGV4KGxwRmlsZU5hbWUsJzonKSkpCiAJd2hpbGUoMSkKIAl7Ci0JICBjaGFyIHRlbXBbTUFYX1BBVEgrMV07CisgICAgICAgICAgY2hhciB0ZW1wW01BWF9QQVRIKzFdOworICAgICAgICAgIC8qIFRyeSBjdXJyZW50IGRpcmVjdG9yeSAqLwogCSAgc3RyY3B5IChmaWxlbmFtZSwgbHBGaWxlTmFtZSk7CiAJICBpZiAoICghc3RhdChET1NfR2V0VW5peEZpbGVOYW1lKGZpbGVuYW1lKSwgJnMpKSAmJiAoU19JU1JFRyhzLnN0X21vZGUpKSApCiAJICAgIGJyZWFrOworCisgICAgICAgICAgLyogVHJ5IFdpbmRvd3MgZGlyZWN0b3J5ICovCisKIAkgIEdldFdpbmRvd3NEaXJlY3RvcnkgKGZpbGVuYW1lLE1BWF9QQVRIKTsKIAkgIGlmICgoIWZpbGVuYW1lWzBdKXx8KGZpbGVuYW1lW3N0cmxlbihmaWxlbmFtZSktMV0hPSdcXCcpKQogICAgICAgICAgICAgc3RyY2F0KGZpbGVuYW1lLCAiXFwiKTsKIAkgIHN0cmNhdCAoZmlsZW5hbWUsIGxwRmlsZU5hbWUpOwogCSAgaWYgKCAoIXN0YXQoRE9TX0dldFVuaXhGaWxlTmFtZShmaWxlbmFtZSksICZzKSkgJiYgKFNfSVNSRUcocy5zdF9tb2RlKSkgKQogCSAgICBicmVhazsKKworICAgICAgICAgIC8qIFRyeSBXaW5kb3dzIHN5c3RlbSBkaXJlY3RvcnkgKi8KKwogCSAgR2V0U3lzdGVtRGlyZWN0b3J5IChmaWxlbmFtZSxNQVhfUEFUSCk7CiAJICBpZiAoKCFmaWxlbmFtZVswXSl8fChmaWxlbmFtZVtzdHJsZW4oZmlsZW5hbWUpLTFdIT0nXFwnKSkKICAJICAgIHN0cmNhdChmaWxlbmFtZSwgIlxcIik7CiAJICBzdHJjYXQgKGZpbGVuYW1lLCBscEZpbGVOYW1lKTsKIAkgIGlmICggKCFzdGF0KERPU19HZXRVbml4RmlsZU5hbWUoZmlsZW5hbWUpLCAmcykpICYmIChTX0lTUkVHKHMuc3RfbW9kZSkpICkKIAkgICAgYnJlYWs7Ci0JICBpZiAoIURPU19GaW5kRmlsZSh0ZW1wLE1BWF9QQVRILGxwRmlsZU5hbWUsTlVMTCxXaW5kb3dzUGF0aCkpCi0JICAgIHsKKworICAgICAgICAgIC8qIFRyeSB0aGUgcGF0aCBvZiB0aGUgY3VycmVudCBleGVjdXRhYmxlICovCisKKyAgICAgICAgICBpZiAoR2V0Q3VycmVudFRhc2soKSkKKyAgICAgICAgICB7CisgICAgICAgICAgICAgIGNoYXIgKnA7CisgICAgICAgICAgICAgIEdldE1vZHVsZUZpbGVOYW1lKCBHZXRDdXJyZW50VGFzaygpLCBmaWxlbmFtZSwgTUFYX1BBVEggKTsKKyAgICAgICAgICAgICAgaWYgKChwID0gc3RycmNociggZmlsZW5hbWUsICdcXCcgKSkpCisgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIHBbMV0gPSAnXDAnOworICAgICAgICAgICAgICAgICAgc3RyY2F0KCBmaWxlbmFtZSwgbHBGaWxlTmFtZSApOworICAgICAgICAgICAgICAgICAgaWYgKCghc3RhdChET1NfR2V0VW5peEZpbGVOYW1lKGZpbGVuYW1lKSwgJnMpKSAmJgorICAgICAgICAgICAgICAgICAgICAgIChTX0lTUkVHKHMuc3RfbW9kZSkpICkKKyAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgIH0KKworICAgICAgICAgIC8qIFRyeSBhbGwgZGlyZWN0b3JpZXMgaW4gcGF0aCAqLworCisJICBpZiAoRE9TX0ZpbmRGaWxlKHRlbXAsTUFYX1BBVEgsbHBGaWxlTmFtZSxOVUxMLFdpbmRvd3NQYXRoKSkKKyAgICAgICAgICB7CiAJICAgICAgc3RyY3B5KGZpbGVuYW1lLCBET1NfR2V0RG9zRmlsZU5hbWUodGVtcCkpOwogCSAgICAgIGJyZWFrOwotCSAgICB9CisgICAgICAgICAgfQogCSAgc3RyY3B5IChmaWxlbmFtZSwgbHBGaWxlTmFtZSk7CiAJICBicmVhazsKIAl9CkBAIC0yMzUsNDcgKzI2MiwxNSBAQAogICAgIGlmIChhY3Rpb24gJiBPRl9FWElTVCkKICAgICAgIHJldHVybiAwOwogICAgIAotICAgLyogTm93IHdlIGFyZSBhY3R1YWxseSBnb2luZyB0byBvcGVuIHRoZSBmaWxlLiBBY2NvcmRpbmcgdG8gTWljcm9zb2Z0J3MKLSAgICAgICBLbm93bGVkZ2UgQmFzaXMsIHRoaXMgaXMgZG9uZSBieSBjYWxsaW5nIGludCAyMWgsIGF4PTNkaC4gKi8gICAgCi0KLSNpZiAwCi0gICAgQVggPSAweDNkMDA7Ci0gICAgQUwgPSAoQUwgJiAweDBmKSB8ICh3U3R5bGUgJiAweDcwKTsgLyogSGFuZGxlIE9GX1NIQVJFX3h4eCBldGMuICovCi0gICAgQUwgPSAoQUwgJiAweGYwKSB8ICh3U3R5bGUgJiAweDAzKTsgLyogSGFuZGxlIE9GX1JFQUQgZXRjLiAqLwotICAgIERTID0gU0VMRUNUT1JPRihvZnMtPnN6UGF0aE5hbWUpOwotICAgIERYID0gT0ZGU0VUT0Yob2ZzLT5zelBhdGhOYW1lKTsKLSAgCi0gICAgT3BlbkV4aXN0aW5nRmlsZSAoY29udGV4dCk7Ci0KLSAgICBpZiAoRUZMICYgMHgwMDAwMDAwMSkgICAgIC8qIENmbGFnICovCisgICAgaWYgKChoYW5kbGUgPSBfbG9wZW4oIG9mcy0+c3pQYXRoTmFtZSwgd1N0eWxlICkpID09IC0xKQogICAgIHsKLSAgICAgIG9mcy0+bkVyckNvZGUgPSBBTDsKLSAgICAgIHJldHVybiAtMTsKLSAgICAgIH0KLQotICAgIHJldHVybiBBWDsKLSNlbmRpZgotICAgICAgLyogRklYTUU6IFF1aWNrIGhhY2sgdG8gZ2V0IGl0IHRvIHdvcmsgd2l0aG91dCBjYWxsaW5nIERPUyAgLS1BSiAqLwotICAgIHsKLSAgICAgICAgaW50IG1vZGUsIGhhbmRsZTsKLSAgICAgICAgc3dpdGNoKHdTdHlsZSAmIDMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgMDogbW9kZSA9IE9fUkRPTkxZOyBicmVhazsKLSAgICAgICAgICAgIGNhc2UgMTogbW9kZSA9IE9fV1JPTkxZOyBicmVhazsKLSAgICAgICAgICAgIGRlZmF1bHQ6IG1vZGUgPSBPX1JEV1I7IGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGlmICgoaGFuZGxlID0gb3BlbihET1NfR2V0VW5peEZpbGVOYW1lKG9mcy0+c3pQYXRoTmFtZSksIG1vZGUpKSA9PSAtMSkKLSAgICAgICAgewotICAgICAgICAgICAgb2ZzLT5uRXJyQ29kZSA9IDI7ICAvKiBub3QgZm91bmQgKi8KLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotICAgICAgICAgIC8qIGRvbid0IGJvdGhlciB3aXRoIGxvY2tpbmcgZm9yIG5vdyAqLwotCi0gICAgICAgIHJldHVybiBoYW5kbGU7CisgICAgICAgIG9mcy0+bkVyckNvZGUgPSAyOyAgLyogbm90IGZvdW5kICovCisgICAgICAgIHJldHVybiAtMTsKICAgICB9Ci0jZW5kaWYgLypXSU5FTElCKi8KKyAgICByZXR1cm4gaGFuZGxlOwogfQogCisKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogIFNldEhhbmRsZUNvdW50CiAKQEAgLTM1OCw3ICszNTMsOCBAQAogQllURSBHZXRUZW1wRHJpdmUoQllURSBjaERyaXZlTGV0dGVyKQogewogICAgIGRwcmludGZfZmlsZShzdGRkZWIsIkdldFRlbXBEcml2ZSAoJWQpXG4iLGNoRHJpdmVMZXR0ZXIpOwotCXJldHVybignQycpOworICAgIGlmIChUZW1wRGlyZWN0b3J5WzFdID09ICc6JykgcmV0dXJuIFRlbXBEaXJlY3RvcnlbMF07CisgICAgZWxzZSByZXR1cm4gJ0MnOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC00MzcsMTQgKzQzMywxNCBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogIF9ocmVhZAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWxvbmcgX2hyZWFkKGludCBoZiwgdm9pZCBGQVIgKmhwdkJ1ZmZlciwgbG9uZyBjYkJ1ZmZlcikKK0xPTkcgX2hyZWFkKElOVCBoZiwgTFBTVFIgaHB2QnVmZmVyLCBMT05HIGNiQnVmZmVyKQogewogCXJldHVybiByZWFkKGhmLCBocHZCdWZmZXIsIGNiQnVmZmVyKTsKIH0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICBfaHdyaXRlCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotbG9uZyBfaHdyaXRlKGludCBoZiwgY29uc3Qgdm9pZCBGQVIgKmhwdkJ1ZmZlciwgbG9uZyBjYkJ1ZmZlcikKK0xPTkcgX2h3cml0ZShJTlQgaGYsIGNvbnN0IExQU1RSIGhwdkJ1ZmZlciwgTE9ORyBjYkJ1ZmZlcikKIHsKIAlyZXR1cm4gd3JpdGUoaGYsIGhwdkJ1ZmZlciwgY2JCdWZmZXIpOwogfQpkaWZmIC0tZ2l0IGEvbWlzYy9rZXJuZWwzMi5jIGIvbWlzYy9rZXJuZWwzMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiZTJiMDkKLS0tIC9kZXYvbnVsbAorKysgYi9taXNjL2tlcm5lbDMyLmMKQEAgLTAsMCArMSw2MSBAQAorLyoKKyAqIFdpbjMyIGtlcm5lbCBmdW5jdGlvbnMKKyAqCisgKiBDb3B5cmlnaHQgMTk5NSBNYXJ0aW4gdm9uIExvZXdpcworICovCisKKy8qIFRoaXMgZmlsZSBjb250YWlucyBvbmx5IHdyYXBwZXJzIHRvIGV4aXN0aW5nIFdpbmUgZnVuY3Rpb25zIG9yIHRyaXZpYWwKKyAgIHN0dWJzLiAnUmVhbCcgaW1wbGVtZW50YXRpb25zIGdvIGludG8gY29udGV4dCBzcGVjaWZpYyBmaWxlcyAqLworCisjaW5jbHVkZSAid2luZG93cy5oIgorI2luY2x1ZGUgIndpbmVycm9yLmgiCisKK2ludCBXSU4zMl9MYXN0RXJyb3I7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIEdldENvbW1hbmRMaW5lQSAgICAgIChLRVJORUwzMi4xNjEpCisgKi8KK0xQU1RSIEdldENvbW1hbmRMaW5lQSh2b2lkKQoreworCXJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBHZXRDdXJyZW50VGhyZWFkSWQgICAoS0VSTkVMMzIuMjAwKQorICovCisKK2ludCBHZXRDdXJyZW50VGhyZWFkSWQodm9pZCkKK3sKKwlyZXR1cm4gZ2V0cGlkKCk7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgR2V0RW52aXJvbm1lbnRTdHJpbmdzICAgIChLRVJORUwzMi4yMTApCisgKi8KK0xQU1RSIEdldEVudmlyb25tZW50U3RyaW5ncyh2b2lkKQoreworCXJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBHZXRTdGRIYW5kbGUgICAgICAgICAgICAgKEtFUk5FTDMyLjI3NikKKyAqLworSEFORExFIEdldFN0ZEhhbmRsZShEV09SRCBuU3RkSGFuZGxlKQoreworCXN3aXRjaChuU3RkSGFuZGxlKQorCXsKKwkJY2FzZSAtMTAvKlNURF9JTlBVVF9IQU5ETEUqLzpyZXR1cm4gMDsKKwkJY2FzZSAtMTEvKlNURF9PVVRQVVRfSEFORExFKi86cmV0dXJuIDE7CisJCWNhc2UgLTEyLypTVERfRVJST1JfSEFORExFKi86cmV0dXJuIDI7CisJfQorCXJldHVybiAtMTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgR2V0VGhyZWFkQ29udGV4dCAgICAgICAgIChLRVJORUwzMi4yOTQpCisgKi8KK0JPT0wgR2V0VGhyZWFkQ29udGV4dChIQU5ETEUgaFRocmVhZCwgdm9pZCAqbHBDb250ZXh0KQoreworCXJldHVybiBGQUxTRTsKK30KZGlmZiAtLWdpdCBhL21pc2MvbHN0ci5jIGIvbWlzYy9sc3RyLmMKaW5kZXggOWQ3YmU0Mi4uN2JhMTEzZSAxMDA2NDQKLS0tIGEvbWlzYy9sc3RyLmMKKysrIGIvbWlzYy9sc3RyLmMKQEAgLTEsMTMgKzEsMTMgQEAKIC8qCi1zdGF0aWMgY2hhciBDb3B5cmlnaHRbXSA9ICJDb3B5cmlnaHQgIFluZ3ZpIFNpZ3Vyam9uc3NvbiAoeW5ndmlAaGFmcm8uaXMpLCAxOTkzIjsKLSovCisgKiBTdHJpbmcgZnVuY3Rpb25zCisgKgorICogQ29weXJpZ2h0IDE5OTMgWW5ndmkgU2lndXJqb25zc29uICh5bmd2aUBoYWZyby5pcykKKyAqLworCiAjaW5jbHVkZSA8c3RkaW8uaD4KICNpbmNsdWRlIDxzdGRsaWIuaD4KICNpbmNsdWRlIDxzdHJpbmcuaD4KICNpbmNsdWRlIDxjdHlwZS5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPGZjbnRsLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+CiAKICNpbmNsdWRlICJsZHQuaCIKICNpbmNsdWRlICJ3aW5kb3dzLmgiCkBAIC0xNyw2ICsxNyw0NCBAQAogI2RlZmluZSBUb1VwcGVyKGMpCXRvdXBwZXIoYykKICNkZWZpbmUgVG9Mb3dlcihjKQl0b2xvd2VyKGMpCiAKKworc3RhdGljIGNvbnN0IEJZVEUgT2VtMkFuc2lbMjU2XSA9CisiXDAwMFwwMDFcMDAyXDAwM1wwMDRcMDA1XDAwNlwwMDdcMDEwXDAxMVwwMTJcMDEzXDAxNFwwMTVcMDE2XDI0NCIKKyJcMDIwXDAyMVwwMjJcMDIzXDI2NlwyNDdcMDI2XDAyN1wwMzBcMDMxXDAzMlwwMzNcMDM0XDAzNVwwMzZcMDM3IgorIlwwNDBcMDQxXDA0MlwwNDNcMDQ0XDA0NVwwNDZcMDQ3XDA1MFwwNTFcMDUyXDA1M1wwNTRcMDU1XDA1NlwwNTciCisiXDA2MFwwNjFcMDYyXDA2M1wwNjRcMDY1XDA2NlwwNjdcMDcwXDA3MVwwNzJcMDczXDA3NFwwNzVcMDc2XDA3NyIKKyJcMTAwXDEwMVwxMDJcMTAzXDEwNFwxMDVcMTA2XDEwN1wxMTBcMTExXDExMlwxMTNcMTE0XDExNVwxMTZcMTE3IgorIlwxMjBcMTIxXDEyMlwxMjNcMTI0XDEyNVwxMjZcMTI3XDEzMFwxMzFcMTMyXDEzM1wxMzRcMTM1XDEzNlwxMzciCisiXDE0MFwxNDFcMTQyXDE0M1wxNDRcMTQ1XDE0NlwxNDdcMTUwXDE1MVwxNTJcMTUzXDE1NFwxNTVcMTU2XDE1NyIKKyJcMTYwXDE2MVwxNjJcMTYzXDE2NFwxNjVcMTY2XDE2N1wxNzBcMTcxXDE3MlwxNzNcMTc0XDE3NVwxNzZcMTc3IgorIlwzMDdcMzc0XDM1MVwzNDJcMzQ0XDM0MFwzNDVcMzQ3XDM1MlwzNTNcMzUwXDM1N1wzNTZcMzU0XDMwNFwzMDUiCisiXDMxMVwzNDZcMzA2XDM2NFwzNjZcMzYyXDM3M1wzNzFcMzc3XDMyNlwzMzRcMjQyXDI0M1wyNDVcMTIwXDIwMyIKKyJcMzQxXDM1NVwzNjNcMzcyXDM2MVwzMjFcMjUyXDI3MlwyNzdcMTM3XDI1NFwyNzVcMjc0XDI0MVwyNTNcMjczIgorIlwxMzdcMTM3XDEzN1wyNDZcMjQ2XDI0NlwyNDZcMDUzXDA1M1wyNDZcMjQ2XDA1M1wwNTNcMDUzXDA1M1wwNTMiCisiXDA1M1wwNTVcMDU1XDA1M1wwNTVcMDUzXDI0NlwyNDZcMDUzXDA1M1wwNTVcMDU1XDI0NlwwNTVcMDUzXDA1NSIKKyJcMDU1XDA1NVwwNTVcMDUzXDA1M1wwNTNcMDUzXDA1M1wwNTNcMDUzXDA1M1wxMzdcMTM3XDI0NlwxMzdcMTM3IgorIlwxMzdcMzM3XDEzN1wyNjZcMTM3XDEzN1wyNjVcMTM3XDEzN1wxMzdcMTM3XDEzN1wxMzdcMTM3XDEzN1wxMzciCisiXDEzN1wyNjFcMTM3XDEzN1wxMzdcMTM3XDM2N1wxMzdcMjYwXDIyNVwyNjdcMTM3XDE1NlwyNjJcMTM3XDEzNyI7CisKK3N0YXRpYyBjb25zdCBCWVRFIEFuc2kyT2VtWzI1Nl0gPQorIlwwMDBcMDAxXDAwMlwwMDNcMDA0XDAwNVwwMDZcMDA3XDAxMFwwMTFcMDEyXDAxM1wwMTRcMDE1XDAxNlwwMTciCisiXDAyMFwwMjFcMDIyXDAyM1wwMjRcMDI1XDAyNlwwMjdcMDMwXDAzMVwwMzJcMDMzXDAzNFwwMzVcMDM2XDAzNyIKKyJcMDQwXDA0MVwwNDJcMDQzXDA0NFwwNDVcMDQ2XDA0N1wwNTBcMDUxXDA1MlwwNTNcMDU0XDA1NVwwNTZcMDU3IgorIlwwNjBcMDYxXDA2MlwwNjNcMDY0XDA2NVwwNjZcMDY3XDA3MFwwNzFcMDcyXDA3M1wwNzRcMDc1XDA3NlwwNzciCisiXDEwMFwxMDFcMTAyXDEwM1wxMDRcMTA1XDEwNlwxMDdcMTEwXDExMVwxMTJcMTEzXDExNFwxMTVcMTE2XDExNyIKKyJcMTIwXDEyMVwxMjJcMTIzXDEyNFwxMjVcMTI2XDEyN1wxMzBcMTMxXDEzMlwxMzNcMTM0XDEzNVwxMzZcMTM3IgorIlwxNDBcMTQxXDE0MlwxNDNcMTQ0XDE0NVwxNDZcMTQ3XDE1MFwxNTFcMTUyXDE1M1wxNTRcMTU1XDE1NlwxNTciCisiXDE2MFwxNjFcMTYyXDE2M1wxNjRcMTY1XDE2NlwxNjdcMTcwXDE3MVwxNzJcMTczXDE3NFwxNzVcMTc2XDE3NyIKKyJcMjAwXDIwMVwwNTRcMjM3XDA1NFwxMzdcMzc1XDM3NFwyMTBcMDQ1XDEyM1wwNzRcMTE3XDIxNVwyMTZcMjE3IgorIlwyMjBcMTQwXDA0N1wwNDJcMDQyXDM3MVwwNTVcMTM3XDIzMFwyMzFcMTYzXDA3NlwxNTdcMjM1XDIzNlwxMzEiCisiXDA0MFwyNTVcMjMzXDIzNFwwMTdcMjM1XDMzNVwwMjVcMDQyXDE0M1wyNDZcMjU2XDI1MlwwNTVcMTYyXDEzNyIKKyJcMzcwXDM2MVwzNzVcMDYzXDA0N1wzNDZcMDI0XDM3MlwwNTRcMDYxXDI0N1wyNTdcMjU0XDI1M1wxMzdcMjUwIgorIlwxMDFcMTAxXDEwMVwxMDFcMjE2XDIxN1wyMjJcMjAwXDEwNVwyMjBcMTA1XDEwNVwxMTFcMTExXDExMVwxMTEiCisiXDEwNFwyNDVcMTE3XDExN1wxMTdcMTE3XDIzMVwxNzBcMTE3XDEyNVwxMjVcMTI1XDIzMlwxMzFcMTM3XDM0MSIKKyJcMjA1XDI0MFwyMDNcMTQxXDIwNFwyMDZcMjIxXDIwN1wyMTJcMjAyXDIxMFwyMTFcMjE1XDI0MVwyMTRcMjEzIgorIlwxNDRcMjQ0XDIyNVwyNDJcMjIzXDE1N1wyMjRcMzY2XDE1N1wyMjdcMjQzXDIyNlwyMDFcMTcxXDEzN1wyMzAiOworCisKIC8qIEZ1bm55IHRvIGRpdmlkZSB0aGVtIGJldHdlZW4gdXNlciBhbmQga2VybmVsLiAqLwogCiAvKiBLRVJORUwuODkgKi8KQEAgLTE5MSwzNiArMjI5LDEwIEBACiAgICAgcmV0dXJuIChjdXJyZW50PT1zdGFydCk/c3RhcnQ6Y3VycmVudC0xOwogfQogCi1CWVRFIE9lbTJBbnNpWzI1Nl0sIEFuc2kyT2VtWzI1Nl07Ci0KLXZvaWQgSW5pdE9lbUFuc2lUcmFuc2xhdGlvbnModm9pZCkKLXsKLSAgc3RhdGljIGludCBpbml0ZWQ9MDsgLyogc2hvdWxkIGNhbGxlZCBjYWxsZWQgaW4gc29tZSBpbml0IGZ1bmN0aW9uKi8KLSAgaW50IHRyYW5zZmlsZSxpOwotICBpZihpbml0ZWQpIHJldHVybjsKLSAgaWYoKHRyYW5zZmlsZT1vcGVuKCJvZW0yYW5zaS50cmwiLE9fUkRPTkxZKSkpewotICAgIHJlYWQodHJhbnNmaWxlLE9lbTJBbnNpLDI1Nik7Ci0gICAgY2xvc2UodHJhbnNmaWxlKTsKLSAgfQotICBlbHNlIHsgIC8qIHNldHMgdXAgcGFzc2l2ZSB0cmFuc2xhdGlvbnMgaWYgaXQgZG9lcyBub3QgZmluZCB0aGUgZmlsZSAqLwotICAgIGZvcihpPTA7aTwyNTY7aSsrKSAgLyogTmVlZHMgc29tZSBmaXhpbmcgKi8KLSAgICAgIE9lbTJBbnNpW2ldPWk7ICAKLSAgfQotICBpZigodHJhbnNmaWxlPW9wZW4oImFuc2kyb2VtLnRybCIsT19SRE9OTFkpKSl7Ci0gICAgcmVhZCh0cmFuc2ZpbGUsQW5zaTJPZW0sMjU2KTsKLSAgICBjbG9zZSh0cmFuc2ZpbGUpOwotICB9Ci0gIGVsc2UgeyAgLyogc2V0cyB1cCBwYXNzaXZlIHRyYW5zbGF0aW9ucyBpZiBpdCBkb2VzIG5vdCBmaW5kIHRoZSBmaWxlICovCi0gICAgZm9yKGk9MDtpPDI1NjtpKyspICAvKiBOZWVkcyBzb21lIGZpeGluZyAqLwotICAgICAgQW5zaTJPZW1baV09aTsgIAotICB9Ci0gIGluaXRlZD0xOwotfQogCiAvKiBBbnNpVG9PZW0gS2V5Ym9hcmQuNSAqLwogSU5UIEFuc2lUb09lbShMUFNUUiBscEFuc2lTdHIsIExQU1RSIGxwT2VtU3RyKSAgIC8qIHdoeSBpcyB0aGlzIGludCA/Pz8gKi8KIHsKLSAgSW5pdE9lbUFuc2lUcmFuc2xhdGlvbnMoKTsgLyogc2hvdWxkIGNhbGxlZCBjYWxsZWQgaW4gc29tZSBpbml0IGZ1bmN0aW9uKi8KICAgd2hpbGUoKmxwQW5zaVN0cil7CiAgICAgKmxwT2VtU3RyKys9QW5zaTJPZW1bKHVuc2lnbmVkIGNoYXIpKCpscEFuc2lTdHIrKyldOwogICB9CkBAIC0yMzEsNyArMjQzLDYgQEAKIC8qIE9lbVRvQW5zaSBLZXlib2FyZC42ICovCiBCT09MIE9lbVRvQW5zaShMUFNUUiBscE9lbVN0ciwgTFBTVFIgbHBBbnNpU3RyKSAgIC8qIHdoeSBpcyB0aGlzIEJPT0wgPz8/PyAqLwogewotICBJbml0T2VtQW5zaVRyYW5zbGF0aW9ucygpOyAvKiBzaG91bGQgY2FsbGVkIGNhbGxlZCBpbiBzb21lIGluaXQgZnVuY3Rpb24qLwogICB3aGlsZSgqbHBPZW1TdHIpewogICAgICpscEFuc2lTdHIrKz1PZW0yQW5zaVsodW5zaWduZWQgY2hhcikoKmxwT2VtU3RyKyspXTsKICAgfQpAQCAtMjQzLDcgKzI1NCw2IEBACiB2b2lkIEFuc2lUb09lbUJ1ZmYoTFBTVFIgbHBBbnNpU3RyLCBMUFNUUiBscE9lbVN0ciwgSU5UIG5MZW5ndGgpCiB7CiAgIGludCBpOwotICBJbml0T2VtQW5zaVRyYW5zbGF0aW9ucygpOyAvKiBzaG91bGQgY2FsbGVkIGNhbGxlZCBpbiBzb21lIGluaXQgZnVuY3Rpb24qLwogICBmb3IoaT0wO2k8bkxlbmd0aDtpKyspCiAgICAgbHBPZW1TdHJbaV09QW5zaTJPZW1bKHVuc2lnbmVkIGNoYXIpKGxwQW5zaVN0cltpXSldOwogfQpAQCAtMjUyLDcgKzI2Miw2IEBACiB2b2lkIE9lbVRvQW5zaUJ1ZmYoTFBTVFIgbHBPZW1TdHIsIExQU1RSIGxwQW5zaVN0ciwgSU5UIG5MZW5ndGgpCiB7CiAgIGludCBpOwotICBJbml0T2VtQW5zaVRyYW5zbGF0aW9ucygpOyAvKiBzaG91bGQgY2FsbGVkIGNhbGxlZCBpbiBzb21lIGluaXQgZnVuY3Rpb24qLwogICBmb3IoaT0wO2k8bkxlbmd0aDtpKyspCiAgICAgbHBBbnNpU3RyW2ldPU9lbTJBbnNpWyh1bnNpZ25lZCBjaGFyKShscE9lbVN0cltpXSldOwogfQpkaWZmIC0tZ2l0IGEvbWlzYy9tYWluLmMgYi9taXNjL21haW4uYwppbmRleCAwZDJkYzIzLi5jMTc0MTMyIDEwMDY0NAotLS0gYS9taXNjL21haW4uYworKysgYi9taXNjL21haW4uYwpAQCAtMjUsMTcgKzI1LDEyIEBACiAjaW5jbHVkZSAib3B0aW9ucy5oIgogI2luY2x1ZGUgImRlc2t0b3AuaCIKICNpbmNsdWRlICJwcm90b3R5cGVzLmgiCi0jaW5jbHVkZSAidGV4dHMuaCIKLSNpbmNsdWRlICJsaWJyYXJ5LmgiCiAjaW5jbHVkZSAiZGxscy5oIgotI2luY2x1ZGUgImlmMTYzMi5oIgogI2RlZmluZSBERUJVR19ERUZJTkVfVkFSSUFCTEVTCiAjaW5jbHVkZSAic3RkZGVidWcuaCIKICNpbmNsdWRlICJkZWJ1Zy5oIgogCi1leHRlcm4gQnV0dG9uVGV4dHMgQnV0dG9uVGV4dDsKLQotc3RhdGljIGNvbnN0IGNoYXIgcGVvcGxlW10gPSAiV2luZSBpcyBhdmFpbGFibGUgdGhhbmtzIHRvIHRoZSB3b3JrIG9mICJcCitjb25zdCBjaGFyIHBlb3BsZVtdID0gIldpbmUgaXMgYXZhaWxhYmxlIHRoYW5rcyB0byB0aGUgd29yayBvZiAiXAogIkJvYiBBbXN0YWR0LCBEYWcgQXNoZWltLCBNYXJ0aW4gQXlvdHRlLCBSb3NzIEJpcm8sIEVyaWsgQm9zLCBGb25zIEJvdG1hbiwgIlwKICJKb2huIEJyZXphaywgQW5kcmV3IEJ1bGhhaywgSm9obiBCdXJ0b24sIFBhdWwgRmFsc3RhZCwgT2xhZiBGbGViYmUsICJcCiAiUGV0ZXIgR2FsYmF2eSwgQ2FtZXJvbiBIZWlkZSwgSmVmZnJleSBIc3UsIE1pZ3VlbCBkZSBJY2F6YSwgIlwKQEAgLTUwLDEzICs0NSwxMiBAQAogI2RlZmluZSBXSU5FX0NMQVNTICAgICJXaW5lIiAgICAvKiBDbGFzcyBuYW1lIGZvciByZXNvdXJjZXMgKi8KIAogdHlwZWRlZiBzdHJ1Y3QgdGFnRU5WRU5UUlkgewotCUxQU1RSCQkJCU5hbWU7Ci0JTFBTVFIJCQkJVmFsdWU7Ci0JV09SRAkJCQl3U2l6ZTsKLQlzdHJ1Y3QgdGFnRU5WRU5UUlkJKlByZXY7Ci0Jc3RydWN0IHRhZ0VOVkVOVFJZCSpOZXh0OwotCX0gRU5WRU5UUlk7Ci10eXBlZGVmIEVOVkVOVFJZICpMUEVOVkVOVFJZOworICBMUFNUUgkgICAgICAgCSAgICAgICAgTmFtZTsKKyAgTFBTVFIJICAgICAgIAkgICAgICAgIFZhbHVlOworICBXT1JECSAgICAgICAJICAgICAgICB3U2l6ZTsKKyAgc3RydWN0IHRhZ0VOVkVOVFJZICAgICpQcmV2OworICBzdHJ1Y3QgdGFnRU5WRU5UUlkgICAgKk5leHQ7Cit9IEVOVkVOVFJZLCAqTFBFTlZFTlRSWTsKIAogTFBFTlZFTlRSWQlscEVudkxpc3QgPSBOVUxMOwogCkBAIC03Nyw3ICs3MSw4IEBACiAgICAgRkFMU0UsICAgICAgICAgIC8qIGJhY2tpbmcgc3RvcmUgKi8KICAgICBTV19TSE9XTk9STUFMLCAgLyogY21kU2hvdyAqLwogICAgIEZBTFNFLAotICAgIEZBTFNFICAgICAgICAgICAvKiBBbGxvd1JlYWRPbmx5ICovCisgICAgRkFMU0UsICAgICAgICAgIC8qIEFsbG93UmVhZE9ubHkgKi8KKyAgICBGQUxTRSAgICAgICAgICAgLyogRW5oYW5jZWQgbW9kZSAqLwogfTsKIAogCkBAIC05NSw3ICs5MCw4IEBACiAgICAgeyAiLWRlYnVnIiwgICAgICAgICAiLmRlYnVnIiwgICAgICAgICAgIFhybW9wdGlvbk5vQXJnLCAgKGNhZGRyX3QpIm9uIiB9LAogICAgIHsgIi1kZWJ1Z21zZyIsICAgICAgIi5kZWJ1Z21zZyIsICAgICAgICBYcm1vcHRpb25TZXBBcmcsIChjYWRkcl90KU5VTEwgfSwKICAgICB7ICItZGxsIiwgICAgICAgICAgICIuZGxsIiwgICAgICAgICAgICAgWHJtb3B0aW9uU2VwQXJnLCAoY2FkZHJfdClOVUxMIH0sCi0gICAgeyAiLWFsbG93cmVhZG9ubHkiLCAiLmFsbG93cmVhZG9ubHkiLCAgIFhybW9wdGlvbk5vQXJnLCAgKGNhZGRyX3QpIm9uIiB9CisgICAgeyAiLWFsbG93cmVhZG9ubHkiLCAiLmFsbG93cmVhZG9ubHkiLCAgIFhybW9wdGlvbk5vQXJnLCAgKGNhZGRyX3QpIm9uIiB9LAorICAgIHsgIi1lbmhhbmNlZCIsICAgICAgIi5lbmhhbmNlZCIsICAgICAgICBYcm1vcHRpb25Ob0FyZywgIChjYWRkcl90KSJvZmYifQogfTsKIAogI2RlZmluZSBOQl9PUFRJT05TICAoc2l6ZW9mKG9wdGlvbnNUYWJsZSkgLyBzaXplb2Yob3B0aW9uc1RhYmxlWzBdKSkKQEAgLTExNCwxMCArMTEwLDEwIEBACiAgICIgICAgLXN5bmNocm9ub3VzICAgIFR1cm4gb24gc3luY2hyb25vdXMgZGlzcGxheSBtb2RlXG4iIFwKICAgIiAgICAtYmFja2luZ3N0b3JlICAgVHVybiBvbiBiYWNraW5nIHN0b3JlXG4iIFwKICAgIiAgICAtc3B5IGZpbGUgICAgICAgVHVybiBvbiBtZXNzYWdlIHNweWluZyB0byB0aGUgc3BlY2lmaWVkIGZpbGVcbiIgXAotICAiICAgIC1yZWxheWRiZyAgICAgICBPYnNvbGV0ZS4gVXNlIC1kZWJ1Z21zZyArcmVsYXkgaW5zdGVhZFxuIiBcCiAgICIgICAgLWRlYnVnbXNnIG5hbWUgIFR1cm4gZGVidWdnaW5nLW1lc3NhZ2VzIG9uIG9yIG9mZlxuIiBcCiAgICIgICAgLWRsbCBuYW1lICAgICAgIEVuYWJsZSBvciBkaXNhYmxlIGJ1aWx0LWluIERMTHNcbiIgXAotICAiICAgIC1hbGxvd3JlYWRvbmx5ICBSZWFkIG9ubHkgZmlsZXMgbWF5IGJlIG9wZW5lZCBpbiB3cml0ZSBtb2RlXG4iCisgICIgICAgLWFsbG93cmVhZG9ubHkgIFJlYWQgb25seSBmaWxlcyBtYXkgYmUgb3BlbmVkIGluIHdyaXRlIG1vZGVcbiIgXAorICAiICAgIC1lbmhhbmNlZCAgICAgICBTdGFydCB3aW5lIGluIGVuaGFuY2VkIG1vZGVcbiIKIAogCiAKQEAgLTE3OSw1MyArMTc1LDYgQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBNQUlOX0dldEJ1dHRvblRleHQKLSAqCi0gKiBGZXRjaCB0aGUgdmFsdWUgb2YgcmVzb3VyY2UgJ25hbWUnIHVzaW5nIHRoZSBjb3JyZWN0IGluc3RhbmNlIG5hbWUuCi0gKiAnbmFtZScgbXVzdCBiZWdpbiB3aXRoICcuJyBvciAnKicKLSAqCi0gKiBUaGUgYWRkcmVzcyBvZiB0aGUgc3RyaW5nIGdvdCBmcm9tIHRoZSBYUmVzb3VyZSBpcyBzdG9yZWQgaW4gQnV0dG9uLkxhYmVsLgotICogVGhlIGNvcnJlc3BvbmRpbmcgaG90a2V5IGlzIHRha2VuIGZyb20gdGhpcyBzdHJpbmcuCi0gKi8KLQotc3RhdGljIHZvaWQgTUFJTl9HZXRCdXR0b25UZXh0KCBYcm1EYXRhYmFzZSBkYiwgY2hhciAqbmFtZSwgQnV0dG9uRGVzYyAqQnV0dG9uKQotewotICAgIFhybVZhbHVlIHZhbHVlOwotICAgIGNoYXIgKmk7Ci0KLSAgICBpZiAoTUFJTl9HZXRSZXNvdXJjZSggZGIsIG5hbWUsICZ2YWx1ZSkpCi0gICAgICB7Ci0gICAgICAgQnV0dG9uLT5MYWJlbCA9IHZhbHVlLmFkZHI7Ci0gICAgICAgaSA9IHN0cmNocihCdXR0b24tPkxhYmVsLCcmJyk7Ci0gICAgICAgaWYgKCBpID09IE5VTEwgKQotICAgICAgICAgQnV0dG9uLT5Ib3RrZXkgPSAnXDAnOwotICAgICAgIGVsc2UgaWYgKCBpKysgPT0gJ1wwJyApCi0gICAgICAgICBCdXR0b24tPkhvdGtleSA9ICdcMCc7Ci0gICAgICAgZWxzZQotICAgICAgICAgQnV0dG9uLT5Ib3RrZXkgPSAqaTsKLSAgICAgIH0KLSAgICBCdXR0b24tPkhvdGtleSA9IHRvdXBwZXIoQnV0dG9uLT5Ib3RrZXkpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBNQUlOX0dldEFsbEJ1dHRvblRleHRzCi0gKgotICogUmVhZCBhbGwgQnV0dG9uLWxhYmVscyBmcm9tIFgxMS1yZXNvdXJjZXMgaWYgdGhleSBleGlzdC4KLSAqLwotCi1zdGF0aWMgdm9pZCBNQUlOX0dldEFsbEJ1dHRvblRleHRzKFhybURhdGFiYXNlIGRiKQotewotICBNQUlOX0dldEJ1dHRvblRleHQoZGIsICIuWWVzTGFiZWwiLCAgICAmQnV0dG9uVGV4dC5ZZXMpOwotICBNQUlOX0dldEJ1dHRvblRleHQoZGIsICIuTm9MYWJlbCIsICAgICAmQnV0dG9uVGV4dC5Obyk7Ci0gIE1BSU5fR2V0QnV0dG9uVGV4dChkYiwgIi5Pa0xhYmVsIiwgICAgICZCdXR0b25UZXh0Lk9rKTsKLSAgTUFJTl9HZXRCdXR0b25UZXh0KGRiLCAiLkNhbmNlbExhYmVsIiwgJkJ1dHRvblRleHQuQ2FuY2VsKTsKLSAgTUFJTl9HZXRCdXR0b25UZXh0KGRiLCAiLkFib3J0TGFiZWwiLCAgJkJ1dHRvblRleHQuQWJvcnQpOwotICBNQUlOX0dldEJ1dHRvblRleHQoZGIsICIuUmV0cnlMYWJlbCIsICAmQnV0dG9uVGV4dC5SZXRyeSk7Ci0gIE1BSU5fR2V0QnV0dG9uVGV4dChkYiwgIi5JZ25vcmVMYWJlbCIsICZCdXR0b25UZXh0Lklnbm9yZSk7Ci0gIE1BSU5fR2V0QnV0dG9uVGV4dChkYiwgIi5DYW5jZWxMYWJlbCIsICZCdXR0b25UZXh0LkNhbmNlbCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgICAgICAgICAgIFBhcnNlRGVidWdPcHRpb25zCiAgKgogICogIFR1cm5zIHNwZWNpZmljIGRlYnVnIG1lc3NhZ2VzIG9uIG9yIG9mZiwgYWNjb3JkaW5nIHRvICJvcHRpb25zIi4KQEAgLTI5NCw5ICsyNDMsOSBAQAogICAgICAgbD1zdHJjaHIob3B0aW9ucywnLCcpLW9wdGlvbnM7CiAgICAgZWxzZSBsPXN0cmxlbihvcHRpb25zKTsKICAgICBmb3IgKGk9MDtpPE5fQlVJTFRJTlM7aSsrKQotICAgICAgICAgaWYgKCFzdHJuY2FzZWNtcChvcHRpb25zKzEsZGxsX2J1aWx0aW5fdGFibGVbaV0uZGxsX25hbWUsbC0xKSkKKyAgICAgICAgIGlmICghc3RybmNhc2VjbXAob3B0aW9ucysxLGRsbF9idWlsdGluX3RhYmxlW2ldLm5hbWUsbC0xKSkKICAgICAgICAgICAgewotICAgICAgICAgICAgIGRsbF9idWlsdGluX3RhYmxlW2ldLmRsbF9pc191c2VkPSgqb3B0aW9ucz09JysnKTsKKyAgICAgICAgICAgICBkbGxfYnVpbHRpbl90YWJsZVtpXS51c2VkID0gKCpvcHRpb25zPT0nKycpOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgaWYgKGk9PU5fQlVJTFRJTlMpCkBAIC0zNjAsNiArMzA5LDggQEAKIAlPcHRpb25zLmRlYnVnID0gVFJVRTsKICAgICBpZiAoTUFJTl9HZXRSZXNvdXJjZSggZGIsICIuYWxsb3dyZWFkb25seSIsICZ2YWx1ZSApKQogICAgICAgICBPcHRpb25zLmFsbG93UmVhZE9ubHkgPSBUUlVFOworICAgIGlmIChNQUlOX0dldFJlc291cmNlKCBkYiwgIi5lbmhhbmNlZCIsICZ2YWx1ZSApKQorICAgICAgICBPcHRpb25zLmVuaGFuY2VkID0gVFJVRTsKICAgICBpZiAoTUFJTl9HZXRSZXNvdXJjZSggZGIsICIuc3B5IiwgJnZhbHVlKSkKIAlPcHRpb25zLnNweUZpbGVuYW1lID0gdmFsdWUuYWRkcjsKICAgICBpZiAoTUFJTl9HZXRSZXNvdXJjZSggZGIsICIuZGVwdGgiLCAmdmFsdWUpKQpAQCAtNDAzLDE0ICszNTQsMTEgQEAKICAgICAgICAgIGZwcmludGYoc3RkZXJyLCJFeGFtcGxlOiAtZGxsIC1vbGUyICAgIERvIG5vdCB1c2UgZW11bGF0ZWQgT0xFMi5ETExcbiIpOwogICAgICAgICAgZnByaW50ZihzdGRlcnIsIkF2YWlsYWJsZSBETExzXG4iKTsKICAgICAgICAgIGZvcihpPTA7aTxOX0JVSUxUSU5TO2krKykKLSAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCIlLTlzJWMiLGRsbF9idWlsdGluX3RhYmxlW2ldLmRsbF9uYW1lLAorICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsIiUtOXMlYyIsZGxsX2J1aWx0aW5fdGFibGVbaV0ubmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgKCgoaSsyKSU4PT0wKT8nXG4nOicgJykpOwogICAgICAgICAgZnByaW50ZihzdGRlcnIsIlxuXG4iKTsKICAgICAgICAgIGV4aXQoMSk7CiAgICAgICAgfQotCi0vKiAgICBNQUlOX0dldEFsbEJ1dHRvblRleHRzKGRiKTsgKi8KLSAKIH0KIAogCkBAIC01MzEsNiArNDc5LDkgQEAKICAgICBpbnQgZGVwdGhfY291bnQsIGk7CiAgICAgaW50ICpkZXB0aF9saXN0OwogCisJc2V0YnVmKHN0ZG91dCxOVUxMKTsKKwlzZXRidWYoc3RkZXJyLE5VTEwpOworCiAgICAgc2V0bG9jYWxlKExDX0NUWVBFLCIiKTsKIAogICAgIFhybUluaXRpYWxpemUoKTsKQEAgLTYwNyw3ICs1NTgsMTAgQEAKICAqLwogTE9ORyBHZXRXaW5GbGFncyh2b2lkKQogewotCXJldHVybiAoV0ZfU1RBTkRBUkQgfCBXRl9DUFUyODYgfCBXRl9QTU9ERSB8IFdGXzgweDg3KTsKKyAgaWYgKE9wdGlvbnMuZW5oYW5jZWQpCisgICAgcmV0dXJuIChXRl9TVEFOREFSRCB8IFdGX0VOSEFOQ0VEIHwgV0ZfQ1BVMjg2IHwgV0ZfUE1PREUgfCBXRl84MHg4Nyk7CisgIGVsc2UKKyAgICByZXR1cm4gKFdGX1NUQU5EQVJEIHwgV0ZfQ1BVMjg2IHwgV0ZfUE1PREUgfCBXRl84MHg4Nyk7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpkaWZmIC0tZ2l0IGEvbWlzYy9tZXNzYWdlLmMgYi9taXNjL21lc3NhZ2UuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2QyM2Y3ZS4uMDAwMDAwMAotLS0gYS9taXNjL21lc3NhZ2UuYworKysgL2Rldi9udWxsCkBAIC0xLDQ3NiArMCwwIEBACi0vKgotICogJ1dpbmUnIE1lc3NhZ2VCb3ggZnVuY3Rpb24gaGFuZGxpbmcKLSAqCi0gKiBDb3B5cmlnaHQgMTk5MyBNYXJ0aW4gQXlvdHRlCi0gKgotc3RhdGljIGNoYXIgQ29weXJpZ2h0W10gPSAiQ29weXJpZ2h0IE1hcnRpbiBBeW90dGUsIDE5OTMiOwotKi8KLQotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8d2luZG93cy5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNpbmNsdWRlIDxmY250bC5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2luY2x1ZGUgImxpYnJhcnkuaCIKLSNpbmNsdWRlICJ3aW4uaCIKLSNpbmNsdWRlICJ0ZXh0cy5oIgotI2luY2x1ZGUgInVzZXIuaCIKLSNpbmNsdWRlICJzZWxlY3RvcnMuaCIKLSNpbmNsdWRlICJzdGRkZWJ1Zy5oIgotLyogI2RlZmluZSBERUJVR19NU0dCT1ggKi8KLSNpbmNsdWRlICJkZWJ1Zy5oIgotCi0KLS8qCi0gKiBEZWZhdWx0cyBmb3IgYnV0dG9uLXRleHRzCi0gKi8KLQotQnV0dG9uVGV4dHMgQnV0dG9uVGV4dCA9IHsgICAgLyogRklYTUU6IE5vcndlZ2lhbiBUcmFuc2xhdGlvbiBtaXNzaW5nICovCi0jaWYgI0xBTkcoRGUpCi0gIHsgIiZKYSIsICAgICAnSicgfSwKLSAgeyAiJk5laW4iLCAgICdOJyB9LAotICB7ICImT2siLCAgICAgJ08nIH0sCi0gIHsgIiZBYmJydWNoIiwnQScgfSwKLSAgeyAiJkFiYnJ1Y2giLCdBJyB9LAotICB7ICImV2llZGVyaG9sZW4iLCAnVycgfSwKLSAgeyAiJklnbm9yaWVyZW4iLCAnSScgfQotI2Vsc2UKLSAgeyAiJlllcyIsICAgICdZJyB9LAotICB7ICImTm8iLCAgICAgJ04nIH0sCi0gIHsgIiZPayIsICAgICAnTycgfSwKLSAgeyAiJkNhbmNlbCIsICdDJyB9LAotICB7ICImQWJvcnQiLCAgJ0EnIH0sCi0gIHsgIiZSZXRyeSIsICAnUicgfSwKLSAgeyAiJklnbm9yZSIsICdJJyB9Ci0jZW5kaWYKLX07Ci0KLWV4dGVybiBIQklUTUFQIGhVcEFycm93OwotCi10eXBlZGVmIHN0cnVjdCB0YWdNU0dCT1ggewotICAgIExQU1RSCVRpdGxlOwotICAgIExQU1RSCVN0cjsKLSAgICBXT1JECXdUeXBlOwotICAgIFdPUkQJd1JldFZhbDsKLSAgICBCT09MCUFjdGl2ZUZsZzsKLSAgICBIV05ECWhXbmRZZXM7Ci0gICAgSFdORAloV25kTm87Ci0gICAgSFdORAloV25kQ2FuY2VsOwotICAgIEhJQ09OCWhJY29uOwotICAgIFJFQ1QJcmVjdEljb247Ci0gICAgUkVDVAlyZWN0U3RyOwotfSBNU0dCT1g7Ci10eXBlZGVmIE1TR0JPWCBGQVIqIExQTVNHQk9YOwotCi1MT05HIFN5c3RlbU1lc3NhZ2VCb3hQcm9jKEhXTkQgaHduZCwgV09SRCBtZXNzYWdlLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0pOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCQkJTWVzc2FnZUJveCAgW1VTRVIuMV0KLSAqLwotCi1pbnQgTWVzc2FnZUJveChIV05EIGhXbmQsIExQU1RSIHN0ciwgTFBTVFIgdGl0bGUsIFdPUkQgdHlwZSkKLXsKLQlIV05EICAgIAloRGxnLCBoV25kT2xkOwotCVdORAkgICAgCSp3bmRQdHI7Ci0JV05EQ0xBU1MgIAl3bmRDbGFzczsKLQlNU0cqCSAgICAJbXNnOwotICAgICAgICBMUE1TR0JPWCAJbHBtYjsKLSAgICAgICAgSEFORExFICAgICAgICAgIGhDbGFzc05hbWUsIGhNc2c7Ci0JRFdPUkQJCWR3U3R5bGU7Ci0JSElOU1RBTkNFCWhJbnN0OwotCWludAkJCW5SZXQ7Ci0KLSAgICAgICAgaWYgKHRpdGxlID09IE5VTEwpCi0JCXRpdGxlID0gIkVycm9yIjsKLQl3bmRQdHIgPSBXSU5fRmluZFduZFB0cihoV25kKTsKLQlpZiAod25kUHRyID09IE5VTEwpIHsKLQkJaEluc3QgPSBoU3lzUmVzOwotCQlkcHJpbnRmX21zZ2JveChzdGRkZWIsIk1lc3NhZ2VCb3goTlVMTCwgc3RyPSclcycsIHRpdGxlPSclcycsICUwNFgpXG4iLCAKLQkJCXN0ciwgdGl0bGUsIHR5cGUpOwotCQl9Ci0JZWxzZSB7Ci0JCWhJbnN0ID0gd25kUHRyLT5oSW5zdGFuY2U7Ci0JCWRwcmludGZfbXNnYm94KHN0ZGRlYiwiTWVzc2FnZUJveCglMDRYLCBzdHI9JyVzJywgdGl0bGU9JyVzJywgJTA0WClcbiIsIAotCQkJaFduZCwgc3RyLCB0aXRsZSwgdHlwZSk7Ci0JCX0KLSAgICBscG1iID0gKExQTVNHQk9YKSBtYWxsb2Moc2l6ZW9mKE1TR0JPWCkpOwotCW1lbXNldChscG1iLCAwLCBzaXplb2YoTVNHQk9YKSk7Ci0vKglscG1iLT5UaXRsZSA9IHRpdGxlOyovCi0JbHBtYi0+VGl0bGUgPSAoTFBTVFIpIG1hbGxvYyhzdHJsZW4odGl0bGUpICsgMSk7Ci0Jc3RyY3B5KGxwbWItPlRpdGxlLCB0aXRsZSk7Ci0vKglscG1iLT5TdHIgPSBzdHI7Ki8KLQlpZiAoc3RyICYmICpzdHIpCi0JewotCQlscG1iLT5TdHIgPSAoTFBTVFIpIG1hbGxvYyhzdHJsZW4oc3RyKSArIDEpOwotCQlzdHJjcHkobHBtYi0+U3RyLCBzdHIpOwotCX0KLQllbHNlCi0JewotCQlscG1iLT5TdHIgPSAoTFBTVFIpIG1hbGxvYyg4KTsKLQkJc3RyY3B5KGxwbWItPlN0ciwgIk1lc3NhZ2UiKTsKLQl9Ci0JbHBtYi0+d1R5cGUgPSB0eXBlOwotCWxwbWItPkFjdGl2ZUZsZyA9IFRSVUU7Ci0Jd25kQ2xhc3Muc3R5bGUgICAgICAgICAgID0gQ1NfSFJFRFJBVyB8IENTX1ZSRURSQVcgOwotCXduZENsYXNzLmxwZm5XbmRQcm9jICAgICA9IEdldFduZFByb2NFbnRyeTE2KCJTeXN0ZW1NZXNzYWdlQm94UHJvYyIpOwotCXduZENsYXNzLmNiQ2xzRXh0cmEgICAgICA9IDA7Ci0Jd25kQ2xhc3MuY2JXbmRFeHRyYSAgICAgID0gNDsKLQl3bmRDbGFzcy5oSW5zdGFuY2UgICAgICAgPSBoSW5zdDsKLQl3bmRDbGFzcy5oSWNvbiAgICAgICAgICAgPSAoSElDT04pTlVMTDsKLQl3bmRDbGFzcy5oQ3Vyc29yICAgICAgICAgPSBMb2FkQ3Vyc29yKChIQU5ETEUpTlVMTCwgSURDX0FSUk9XKTsgCi0Jd25kQ2xhc3MuaGJyQmFja2dyb3VuZCAgID0gR2V0U3RvY2tPYmplY3QoV0hJVEVfQlJVU0gpOwotCXduZENsYXNzLmxwc3pNZW51TmFtZSAgICA9IE5VTEw7Ci0gICAgICAgIGhDbGFzc05hbWUgPSBVU0VSX0hFQVBfQUxMT0MoIDIwICk7Ci0gICAgICAgIHN0cmNweSggVVNFUl9IRUFQX0xJTl9BRERSKCBoQ2xhc3NOYW1lICksICJNRVNTQUdFQk9YIiApOwotICAgICAgICBoTXNnID0gVVNFUl9IRUFQX0FMTE9DKCBzaXplb2YoTVNHKSApOwotICAgICAgICBtc2cgPSAoTVNHICopIFVTRVJfSEVBUF9MSU5fQUREUiggaE1zZyApOwotCXduZENsYXNzLmxwc3pDbGFzc05hbWUgPSAoTFBTVFIpVVNFUl9IRUFQX1NFR19BRERSKCBoQ2xhc3NOYW1lICk7Ci0JZHByaW50Zl9tc2dib3goc3RkZGViLCAiTWVzc2FnZUJveCAvLyBiZWZvcmUgUmVnaXN0ZXJDbGFzcywgJyVzJyAnJXMnICFcbiIsIHN0ciwgdGl0bGUpOwotCWlmICghUmVnaXN0ZXJDbGFzcygmd25kQ2xhc3MpKSB7Ci0JCXByaW50ZigiVW5hYmxlIHRvIFJlZ2lzdGVyIGNsYXNzICdNRVNTQUdFQk9YJyAhXG4iKTsKLQkJaWYgKGxwbWIgIT0gTlVMTCkgZnJlZShscG1iKTsKLQkJcmV0dXJuIDA7Ci0JCX0KLSAgICAgICAgVVNFUl9IRUFQX0ZSRUUoIGhDbGFzc05hbWUgKTsKLQlkd1N0eWxlID0gV1NfUE9QVVAgfCBXU19ETEdGUkFNRSB8IFdTX1ZJU0lCTEU7Ci0JaWYgKCh0eXBlICYgKE1CX1NZU1RFTU1PREFMIHwgTUJfVEFTS01PREFMKSkgPT0gMCkgZHdTdHlsZSB8PSBXU19DQVBUSU9OOwotCWhXbmRPbGQgPSBHZXRGb2N1cygpOwotCWhEbGcgPSBDcmVhdGVXaW5kb3coIk1FU1NBR0VCT1giLCBscG1iLT5UaXRsZSwgZHdTdHlsZSwgMTAwLCAxNTAsIDQwMCwgMTYwLAotCQkJCShIV05EKU5VTEwsIChITUVOVSlOVUxMLCBoSW5zdCwgKFNFR1BUUilscG1iKTsKLQlpZiAoaERsZyA9PSAwKSB7Ci0JCXByaW50ZigiVW5hYmxlIHRvIGNyZWF0ZSAnTUVTU0FHRUJPWCcgd2luZG93ICFcbiIpOwotCQlpZiAobHBtYiAhPSBOVUxMKSBmcmVlKGxwbWIpOwotCQlyZXR1cm4gMDsKLQkJfQotCWRwcmludGZfbXNnYm94KHN0ZGRlYiwgIk1lc3NhZ2VCb3ggLy8gYmVmb3JlIE1zZyBMb29wICFcbiIpOwotCXdoaWxlKFRSVUUpIHsKLQkJaWYgKCFscG1iLT5BY3RpdmVGbGcpIGJyZWFrOwotCQlpZiAoIUdldE1lc3NhZ2UoIFVTRVJfSEVBUF9TRUdfQUREUihoTXNnKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChIV05EKU5VTEwsIDAsIDApKSBicmVhazsKLQkJVHJhbnNsYXRlTWVzc2FnZShtc2cpOwotCQlpZiAoKHR5cGUgJiAoTUJfU1lTVEVNTU9EQUwgfCBNQl9UQVNLTU9EQUwpKSAhPSAwICYmCi0JCQltc2ctPmh3bmQgIT0gaERsZykgewotCQkJc3dpdGNoKG1zZy0+bWVzc2FnZSkgewotCQkJCWNhc2UgV01fS0VZRE9XTjoKLQkJCQljYXNlIFdNX0xCVVRUT05ET1dOOgotCQkJCWNhc2UgV01fTUJVVFRPTkRPV046Ci0JCQkJY2FzZSBXTV9SQlVUVE9ORE9XTjoKLQkJCQkJTWVzc2FnZUJlZXAoMCk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJRGlzcGF0Y2hNZXNzYWdlKG1zZyk7Ci0JCX0KLSAgICAgICAgVVNFUl9IRUFQX0ZSRUUoaE1zZyk7Ci0JU2V0Rm9jdXMoaFduZE9sZCk7Ci0JblJldCA9IGxwbWItPndSZXRWYWw7Ci0JaWYgKGxwbWIgIT0gTlVMTCkgZnJlZShscG1iKTsKLQlpZiAoIVVucmVnaXN0ZXJDbGFzcygiTUVTU0FHRUJPWCIsIGhJbnN0KSkgcmV0dXJuIDA7Ci0JZHByaW50Zl9tc2dib3goc3RkZGViLCAiTWVzc2FnZUJveCByZXR1cm4gJTA0WCAhXG4iLCBuUmV0KTsKLQlyZXR1cm4oblJldCk7Ci19Ci0KLQotTFBNU0dCT1ggTXNnQm94R2V0U3RvcmFnZUhlYWRlcihIV05EIGh3bmQpCi17Ci0gICAgV05EICAqd25kUHRyOwotICAgIExQTVNHQk9YIGxwbWI7Ci0gICAgd25kUHRyID0gV0lOX0ZpbmRXbmRQdHIoaHduZCk7Ci0gICAgaWYgKHduZFB0ciA9PSAwKSB7Ci0gICAgCXByaW50ZigiQmFkIFdpbmRvdyBoYW5kbGUgb24gTWVzc2FnZUJveCAhXG4iKTsKLSAgICAJcmV0dXJuIDA7Ci0gICAgCX0KLSAgICBscG1iID0gKigoTFBNU0dCT1ggKil3bmRQdHItPndFeHRyYSk7Ci0gICAgcmV0dXJuIGxwbWI7Ci19Ci0KLQotCi0KLUxPTkcgU3lzdGVtTWVzc2FnZUJveFByb2MoSFdORCBoV25kLCBXT1JEIG1lc3NhZ2UsIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSkKLXsKLQlXTkQJICAgIAkqd25kUHRyOwotCUNSRUFURVNUUlVDVCAqY3JlYXRlU3RydWN0OwotCVBBSU5UU1RSVUNUCXBzOwotCUhEQwkJCWhEQzsKLQlEV09SRAkJT2xkVGV4dENvbG9yOwotCVJFQ1QJCXJlY3Q7Ci0JTFBNU0dCT1gJbHBtYjsKLQotCXN3aXRjaChtZXNzYWdlKSB7Ci0JY2FzZSBXTV9DUkVBVEU6Ci0JCWRwcmludGZfbXNnYm94KHN0ZGRlYiwgIk1lc3NhZ2VCb3ggV01fQ1JFQVRFIGhXbmQ9JTA0WCAhXG4iLCBoV25kKTsKLQkJd25kUHRyID0gV0lOX0ZpbmRXbmRQdHIoaFduZCk7Ci0JCWNyZWF0ZVN0cnVjdCA9IChDUkVBVEVTVFJVQ1QgKilQVFJfU0VHX1RPX0xJTihsUGFyYW0pOwotCQlscG1iID0gKExQTVNHQk9YKWNyZWF0ZVN0cnVjdC0+bHBDcmVhdGVQYXJhbXM7Ci0JCWlmIChscG1iID09IE5VTEwpIGJyZWFrOwotCQkqKChMUE1TR0JPWCAqKXduZFB0ci0+d0V4dHJhKSA9IGxwbWI7Ci0JCWRwcmludGZfbXNnYm94KHN0ZGRlYiwgIk1lc3NhZ2VCb3ggV01fQ1JFQVRFIHRpdGxlPSclcycgc3RyPSclcycgIVxuIiwgCi0JCQkJCQkJCQlscG1iLT5UaXRsZSwgbHBtYi0+U3RyKTsKLQkJR2V0Q2xpZW50UmVjdChoV25kLCAmcmVjdCk7Ci0JCUNvcHlSZWN0KCZscG1iLT5yZWN0U3RyLCAmcmVjdCk7Ci0JCWxwbWItPnJlY3RTdHIuYm90dG9tIC09IDMyOwotCQlzd2l0Y2gobHBtYi0+d1R5cGUgJiBNQl9UWVBFTUFTSykgewotCQljYXNlIE1CX09LIDoKLQkJICAgICAgICBscG1iLT5oV25kWWVzID0gQ3JlYXRlV2luZG93KCJCVVRUT04iLCBCdXR0b25UZXh0Lk9rLkxhYmVsLAotCQkJCVdTX0NISUxEIHwgV1NfQ0xJUENISUxEUkVOIHwgV1NfVklTSUJMRSB8IEJTX1BVU0hCVVRUT04sCi0JCQkJcmVjdC5yaWdodCAvIDIgLSAzMCwgcmVjdC5ib3R0b20gLSAyNSwgCi0JCQkJNjAsIDE4LCBoV25kLCBJRE9LLCB3bmRQdHItPmhJbnN0YW5jZSwgMEwpOwotCQkJYnJlYWs7Ci0JCWNhc2UgTUJfT0tDQU5DRUwgOgotCQkJbHBtYi0+aFduZFllcyA9IENyZWF0ZVdpbmRvdygiQlVUVE9OIiwgQnV0dG9uVGV4dC5Pay5MYWJlbCwKLQkJCQlXU19DSElMRCB8IFdTX0NMSVBDSElMRFJFTiB8IFdTX1ZJU0lCTEUgfCBCU19QVVNIQlVUVE9OLAotCQkJCXJlY3QucmlnaHQgLyAyIC0gNjUsIHJlY3QuYm90dG9tIC0gMjUsIAotCQkJCTYwLCAxOCwgaFduZCwgSURPSywgd25kUHRyLT5oSW5zdGFuY2UsIDBMKTsKLQkJCWxwbWItPmhXbmRDYW5jZWwgPSBDcmVhdGVXaW5kb3coIkJVVFRPTiIsIEJ1dHRvblRleHQuQ2FuY2VsLkxhYmVsLAotCQkJCVdTX0NISUxEIHwgV1NfQ0xJUENISUxEUkVOIHwgV1NfVklTSUJMRSB8IEJTX1BVU0hCVVRUT04sCi0JCQkJcmVjdC5yaWdodCAvIDIgKyA1LCByZWN0LmJvdHRvbSAtIDI1LCAKLQkJCQk2MCwgMTgsIGhXbmQsIElEQ0FOQ0VMLCB3bmRQdHItPmhJbnN0YW5jZSwgMEwpOwotCQkJYnJlYWs7Ci0JCWNhc2UgTUJfQUJPUlRSRVRSWUlHTk9SRSA6Ci0JCQlscG1iLT5oV25kWWVzID0gQ3JlYXRlV2luZG93KCJCVVRUT04iLCBCdXR0b25UZXh0LlJldHJ5LkxhYmVsLAotCQkJCVdTX0NISUxEIHwgV1NfQ0xJUENISUxEUkVOIHwgV1NfVklTSUJMRSB8IEJTX1BVU0hCVVRUT04sCi0JCQkJcmVjdC5yaWdodCAvIDIgLSAxMDAsIHJlY3QuYm90dG9tIC0gMjUsIAotCQkJCTYwLCAxOCwgaFduZCwgSURSRVRSWSwgd25kUHRyLT5oSW5zdGFuY2UsIDBMKTsKLQkJCWxwbWItPmhXbmRObyA9IENyZWF0ZVdpbmRvdygiQlVUVE9OIiwgQnV0dG9uVGV4dC5JZ25vcmUuTGFiZWwsCi0JCQkJV1NfQ0hJTEQgfCBXU19DTElQQ0hJTERSRU4gfCBXU19WSVNJQkxFIHwgQlNfUFVTSEJVVFRPTiwKLQkJCQlyZWN0LnJpZ2h0IC8gMiAtIDMwLCByZWN0LmJvdHRvbSAtIDI1LCAKLQkJCQk2MCwgMTgsIGhXbmQsIElESUdOT1JFLCB3bmRQdHItPmhJbnN0YW5jZSwgMEwpOwotCQkJbHBtYi0+aFduZENhbmNlbCA9IENyZWF0ZVdpbmRvdygiQlVUVE9OIiwgQnV0dG9uVGV4dC5BYm9ydC5MYWJlbCwKLQkJCQlXU19DSElMRCB8IFdTX0NMSVBDSElMRFJFTiB8IFdTX1ZJU0lCTEUgfCBCU19QVVNIQlVUVE9OLAotCQkJCXJlY3QucmlnaHQgLyAyICsgNDAsIHJlY3QuYm90dG9tIC0gMjUsIAotCQkJCTYwLCAxOCwgaFduZCwgSURBQk9SVCwgd25kUHRyLT5oSW5zdGFuY2UsIDBMKTsKLQkJCWJyZWFrOwotCQljYXNlIE1CX1lFU05PIDoKLQkJCWxwbWItPmhXbmRZZXMgPSBDcmVhdGVXaW5kb3coIkJVVFRPTiIsIEJ1dHRvblRleHQuWWVzLkxhYmVsLAotCQkJCVdTX0NISUxEIHwgV1NfQ0xJUENISUxEUkVOIHwgV1NfVklTSUJMRSB8IEJTX1BVU0hCVVRUT04sCi0JCQkJcmVjdC5yaWdodCAvIDIgLSA2NSwgcmVjdC5ib3R0b20gLSAyNSwgCi0JCQkJNjAsIDE4LCBoV25kLCBJRFlFUywgd25kUHRyLT5oSW5zdGFuY2UsIDBMKTsKLQkJCWxwbWItPmhXbmRObyA9IENyZWF0ZVdpbmRvdygiQlVUVE9OIiwgQnV0dG9uVGV4dC5Oby5MYWJlbCwKLQkJCQlXU19DSElMRCB8IFdTX0NMSVBDSElMRFJFTiB8IFdTX1ZJU0lCTEUgfCBCU19QVVNIQlVUVE9OLAotCQkJCXJlY3QucmlnaHQgLyAyICsgNSwgcmVjdC5ib3R0b20gLSAyNSwgCi0JCQkJNjAsIDE4LCBoV25kLCBJRE5PLCB3bmRQdHItPmhJbnN0YW5jZSwgMEwpOwotCQkJYnJlYWs7Ci0JCWNhc2UgTUJfWUVTTk9DQU5DRUwgOgotCQkJbHBtYi0+aFduZFllcyA9IENyZWF0ZVdpbmRvdygiQlVUVE9OIiwgQnV0dG9uVGV4dC5ZZXMuTGFiZWwsCi0JCQkJV1NfQ0hJTEQgfCBXU19DTElQQ0hJTERSRU4gfCBXU19WSVNJQkxFIHwgQlNfUFVTSEJVVFRPTiwKLQkJCQlyZWN0LnJpZ2h0IC8gMiAtIDEwMCwgcmVjdC5ib3R0b20gLSAyNSwgCi0JCQkJNjAsIDE4LCBoV25kLCBJRFlFUywgd25kUHRyLT5oSW5zdGFuY2UsIDBMKTsKLQkJCWxwbWItPmhXbmRObyA9IENyZWF0ZVdpbmRvdygiQlVUVE9OIiwgQnV0dG9uVGV4dC5Oby5MYWJlbCwKLQkJCQlXU19DSElMRCB8IFdTX0NMSVBDSElMRFJFTiB8IFdTX1ZJU0lCTEUgfCBCU19QVVNIQlVUVE9OLAotCQkJCXJlY3QucmlnaHQgLyAyIC0gMzAsIHJlY3QuYm90dG9tIC0gMjUsIAotCQkJCTYwLCAxOCwgaFduZCwgSUROTywgd25kUHRyLT5oSW5zdGFuY2UsIDBMKTsKLQkJCWxwbWItPmhXbmRDYW5jZWwgPSBDcmVhdGVXaW5kb3coIkJVVFRPTiIsIEJ1dHRvblRleHQuQ2FuY2VsLkxhYmVsLAotCQkJCVdTX0NISUxEIHwgV1NfQ0xJUENISUxEUkVOIHwgV1NfVklTSUJMRSB8IEJTX1BVU0hCVVRUT04sCi0JCQkJcmVjdC5yaWdodCAvIDIgKyA0MCwgcmVjdC5ib3R0b20gLSAyNSwgCi0JCQkJNjAsIDE4LCBoV25kLCBJRENBTkNFTCwgd25kUHRyLT5oSW5zdGFuY2UsIDBMKTsKLQkJCWJyZWFrOwotCQl9Ci0JICAgIHN3aXRjaChscG1iLT53VHlwZSAmIE1CX0lDT05NQVNLKSB7Ci0JCWNhc2UgTUJfSUNPTkVYQ0xBTUFUSU9OOgotCQkJcHJpbnRmKCJNc2dCb3ggTG9hZEljb24gRXhjbGFtYXRpb24gIVxuIik7Ci0JCQlscG1iLT5oSWNvbiA9IExvYWRJY29uKChISU5TVEFOQ0UpTlVMTCwgSURJX0VYQ0xBTUFUSU9OKTsKLQkJCWJyZWFrOwotCQljYXNlIE1CX0lDT05RVUVTVElPTjoKLQkJCXByaW50ZigiTXNnQm94IExvYWRJY29uIFF1ZXN0aW9uICFcbiIpOwotCQkJbHBtYi0+aEljb24gPSBMb2FkSWNvbigoSElOU1RBTkNFKU5VTEwsIElESV9RVUVTVElPTik7Ci0JCQlicmVhazsKLQkJY2FzZSBNQl9JQ09OQVNURVJJU0s6Ci0JCQlwcmludGYoIk1zZ0JveCBMb2FkSWNvbiBBc3RlcmlzayAhXG4iKTsKLQkJCWxwbWItPmhJY29uID0gTG9hZEljb24oKEhJTlNUQU5DRSlOVUxMLCBJRElfQVNURVJJU0spOwotCQkJYnJlYWs7Ci0JCWNhc2UgTUJfSUNPTkhBTkQ6Ci0JCQlwcmludGYoIk1zZ0JveCBMb2FkSWNvbiBIYW5kICFcbiIpOwotCQkJbHBtYi0+aEljb24gPSBMb2FkSWNvbigoSElOU1RBTkNFKU5VTEwsIElESV9IQU5EKTsKLQkJCWJyZWFrOwotCQkJfQotCSAgICBpZiAobHBtYi0+aEljb24gIT0gKEhJQ09OKU5VTEwpIHsKLQkJCVNldFJlY3QoJmxwbWItPnJlY3RJY29uLCAxNiwKLQkJCWxwbWItPnJlY3RTdHIuYm90dG9tIC8gMiAtIDE2LCA0OCwKLQkJCWxwbWItPnJlY3RTdHIuYm90dG9tIC8gMiArIDE2KTsKLQkJCWxwbWItPnJlY3RTdHIubGVmdCArPSA2NDsKLQkJCX0KLQkgICAgYnJlYWs7Ci0JY2FzZSBXTV9TSE9XV0lORE9XOgotCQlkcHJpbnRmX21zZ2JveChzdGRkZWIsICJNZXNzYWdlQm94IFdNX1NIT1dXSU5ET1cgaFduZD0lMDRYICFcbiIsIGhXbmQpOwotCQlpZiAoISh3UGFyYW0gPT0gMCAmJiBsUGFyYW0gPT0gMEwpKSB7Ci0JCQlJbnZhbGlkYXRlUmVjdChoV25kLCBOVUxMLCBUUlVFKTsKLQkJCX0KLQkgICAgYnJlYWs7Ci0JY2FzZSBXTV9QQUlOVDoKLQkJZHByaW50Zl9tc2dib3goc3RkZGViLCAiTWVzc2FnZUJveCBXTV9QQUlOVCBoV25kPSUwNFggIVxuIiwgaFduZCk7Ci0JCWxwbWIgPSBNc2dCb3hHZXRTdG9yYWdlSGVhZGVyKGhXbmQpOwotCQlpZiAobHBtYiA9PSBOVUxMKSBicmVhazsKLQkJaWYgKCFscG1iLT5BY3RpdmVGbGcpIGJyZWFrOwotCQloREMgPSBCZWdpblBhaW50KGhXbmQsICZwcyk7Ci0JCWlmIChoREMgPT0gMCkgewotCQkJcHJpbnRmKCJNZXNzYWdlQm94IFdNX1BBSU5UIC8vIEJlZ2luUGFpbnQgcmV0dXJuZWQgQkFEIGhEQyAhXG4iKTsKLQkJCWJyZWFrOwotCQkJfQotCQlHZXRDbGllbnRSZWN0KGhXbmQsICZyZWN0KTsKLQkJRmlsbFJlY3QoaERDLCAmcmVjdCwgR2V0U3RvY2tPYmplY3QoV0hJVEVfQlJVU0gpKTsKLQkJQ29weVJlY3QoJnJlY3QsICZscG1iLT5yZWN0U3RyKTsKLQkJT2xkVGV4dENvbG9yID0gU2V0VGV4dENvbG9yKGhEQywgMHgwMDAwMDAwMCk7Ci0JCWlmIChscG1iLT5oSWNvbikgCi0JCQlEcmF3SWNvbihoREMsIGxwbWItPnJlY3RJY29uLmxlZnQsCi0JCQkJbHBtYi0+cmVjdEljb24udG9wLCBscG1iLT5oSWNvbik7Ci0JCURyYXdUZXh0KGhEQywgbHBtYi0+U3RyLCAtMSwgJnJlY3QsIAotCQkJRFRfQ0FMQ1JFQ1QgfCBEVF9MRUZUIHwgRFRfVkNFTlRFUiB8IERUX1dPUkRCUkVBSyk7Ci0JCXJlY3QudG9wID0gbHBtYi0+cmVjdFN0ci5ib3R0b20gLyAyIC0gcmVjdC5ib3R0b20gLyAyOwotCQlyZWN0LmJvdHRvbSA9IGxwbWItPnJlY3RTdHIuYm90dG9tIC8gMiArIHJlY3QuYm90dG9tIC8gMjsKLQkJRHJhd1RleHQoaERDLCBscG1iLT5TdHIsIC0xLCAmcmVjdCwgRFRfTEVGVCB8IERUX1ZDRU5URVIgfCBEVF9XT1JEQlJFQUspOwotCQlTZXRUZXh0Q29sb3IoaERDLCBPbGRUZXh0Q29sb3IpOwotCQlFbmRQYWludChoV25kLCAmcHMpOwotCQlkcHJpbnRmX21zZ2JveChzdGRkZWIsICJNZXNzYWdlQm94IEVuZCBvZiBXTV9QQUlOVCAhXG4iKTsKLQkJYnJlYWs7Ci0JY2FzZSBXTV9ERVNUUk9ZOgotCSAgICBkcHJpbnRmX21zZ2JveChzdGRkZWIsICJNZXNzYWdlQm94IFdNX0RFU1RST1kgIVxuIik7Ci0JICAgIFJlbGVhc2VDYXB0dXJlKCk7Ci0JICAgIGxwbWIgPSBNc2dCb3hHZXRTdG9yYWdlSGVhZGVyKGhXbmQpOwotCQlpZiAobHBtYiA9PSBOVUxMKSBicmVhazsKLQkgICAgaWYgKGxwbWItPmhJY29uKSBEZXN0cm95SWNvbihscG1iLT5oSWNvbik7Ci0JICAgIGlmIChscG1iLT5oV25kWWVzKSBEZXN0cm95V2luZG93KGxwbWItPmhXbmRZZXMpOwotCSAgICBpZiAobHBtYi0+aFduZE5vKSBEZXN0cm95V2luZG93KGxwbWItPmhXbmRObyk7Ci0JICAgIGlmIChscG1iLT5oV25kQ2FuY2VsKSBEZXN0cm95V2luZG93KGxwbWItPmhXbmRDYW5jZWwpOwotCSAgICBkcHJpbnRmX21zZ2JveChzdGRkZWIsICJNZXNzYWdlQm94IFdNX0RFU1RST1kgZW5kICFcbiIpOwotCSAgICBscG1iLT5BY3RpdmVGbGcgPSBGQUxTRTsKLQkgICAgYnJlYWs7Ci0JY2FzZSBXTV9DT01NQU5EOgotCSAgICBscG1iID0gTXNnQm94R2V0U3RvcmFnZUhlYWRlcihoV25kKTsKLQkJaWYgKGxwbWIgPT0gTlVMTCkgYnJlYWs7Ci0JICAgIGlmICh3UGFyYW0gPCBJRE9LIHx8IHdQYXJhbSA+IElETk8pIHJldHVybigwKTsKLQkgICAgbHBtYi0+d1JldFZhbCA9IHdQYXJhbTsKLQkgICAgZHByaW50Zl9tc2dib3goc3RkZGViLCAiTWVzc2FnZUJveCBzZW5kaW5nIFdNX0NMT1NFICFcbiIpOwotCSAgICBQb3N0TWVzc2FnZShoV25kLCBXTV9DTE9TRSwgMCwgMEwpOwotCSAgICBicmVhazsKLQljYXNlIFdNX0NIQVI6Ci0JICAgIGxwbWIgPSBNc2dCb3hHZXRTdG9yYWdlSGVhZGVyKGhXbmQpOwotLyogICAgICAgICAgaWYgKHdQYXJhbSA+PSAnYScgfHwgd1BhcmFtIDw9ICd6Jykgd1BhcmFtIC09ICdhJyAtICdBJzsgKi8KLQkJd1BhcmFtID0gdG91cHBlcih3UGFyYW0pOwotCSAgICBpZiAod1BhcmFtID09IEJ1dHRvblRleHQuWWVzLkhvdGtleSkKLSAgICAgICAgICAgICAgICBscG1iLT53UmV0VmFsID0gSURZRVM7Ci0gICAgICAgICAgICBlbHNlIGlmICh3UGFyYW0gPT0gQnV0dG9uVGV4dC5Pay5Ib3RrZXkpCi0gICAgICAgICAgICAgICAgbHBtYi0+d1JldFZhbCA9IElET0s7Ci0gICAgICAgICAgICBlbHNlIGlmICh3UGFyYW0gPT0gQnV0dG9uVGV4dC5SZXRyeS5Ib3RrZXkpCi0gICAgICAgICAgICAgICAgbHBtYi0+d1JldFZhbCA9IElEUkVUUlk7Ci0gICAgICAgICAgICBlbHNlIGlmICh3UGFyYW0gPT0gQnV0dG9uVGV4dC5BYm9ydC5Ib3RrZXkpCi0gICAgICAgICAgICAgICAgbHBtYi0+d1JldFZhbCA9IElEQUJPUlQ7Ci0gICAgICAgICAgICBlbHNlIGlmICh3UGFyYW0gPT0gQnV0dG9uVGV4dC5Oby5Ib3RrZXkpCi0gICAgICAgICAgICAgICAgbHBtYi0+d1JldFZhbCA9IElETk87Ci0gICAgICAgICAgICBlbHNlIGlmICh3UGFyYW0gPT0gQnV0dG9uVGV4dC5JZ25vcmUuSG90a2V5KQotICAgICAgICAgICAgICAgICBscG1iLT53UmV0VmFsID0gSURJR05PUkU7Ci0gICAgICAgICAgICBlbHNlIGlmICgod1BhcmFtID09IEJ1dHRvblRleHQuT2suSG90a2V5KSB8fCAod1BhcmFtID09IFZLX0VTQ0FQRSkpCi0gICAgICAgICAgICAgICAgbHBtYi0+d1JldFZhbCA9IElEQ0FOQ0VMOwotCSAgICBlbHNlCi0JCXJldHVybiAwOwotCQlpZiAobHBtYiA9PSBOVUxMKSBicmVhazsKLQkJU2hvd1dpbmRvdyhoV25kLCBTV19ISURFKTsKLQkJUG9zdE1lc3NhZ2UoaFduZCwgV01fQ0xPU0UsIDAsIDBMKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkgICAgcmV0dXJuIERlZldpbmRvd1Byb2MoaFduZCwgbWVzc2FnZSwgd1BhcmFtLCBsUGFyYW0gKTsKLSAgICB9Ci1yZXR1cm4oMCk7Ci19Ci0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoJCQkiQWJvdXQgV2luZS4uLiIgRGlhbG9nIEJveAotICovCi1CT09MIEZBUiBQQVNDQUwgQWJvdXRXaW5lX1Byb2MoSFdORCBoRGxnLCBXT1JEIG1zZywgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtKQotewotICAgIEhEQyAgCWhEQzsKLSAgICBIREMJCWhNZW1EQzsKLSAgICBQQUlOVFNUUlVDVCBwczsKLSAgICBSRUNUIAlyZWN0OwotICAgIEJJVE1BUAlibTsKLSAgICBPRlNUUlVDVAlvZnN0cnVjdDsKLSAgICBIQklUTUFQICAgICBoYm1wT2xkOwotICAgIHN0YXRpYyBMUFNUUglwdHI7Ci0gICAgc3RhdGljIGNoYXIgCXN0clsyNTZdOwotICAgIHN0YXRpYyBIQklUTUFQCWhCaXRNYXAgPSAwOwotICAgIHN0YXRpYyBCT09MCQlDcmVkaXRNb2RlOwotICAgIHN0YXRpYyBIQU5ETEUJaEZpbGUgPSAwOwotICAgIHN3aXRjaCAobXNnKSB7Ci0gICAgY2FzZSBXTV9JTklURElBTE9HOgotCUNyZWRpdE1vZGUgPSBGQUxTRTsKLQlzdHJjcHkoc3RyLCAiV0lORUxPR08iKTsKLQloQml0TWFwID0gTG9hZEJpdG1hcCgoSElOU1RBTkNFKU5VTEwsIChMUFNUUilzdHIpOwotCi0Jc3RyY3B5KHN0ciwgIkxJQ0VOU0UiKTsKLQlwcmludGYoInN0ciA9ICclcydcbiIsIHN0cik7Ci0JaEZpbGUgPSBPcGVuRmlsZSgoTFBTVFIpc3RyLCAmb2ZzdHJ1Y3QsIE9GX1JFQUQpOwotCXB0ciA9IChMUFNUUiltYWxsb2MoMjA0OCk7Ci0JbHNlZWsoaEZpbGUsIDBMLCBTRUVLX1NFVCk7Ci0JX2xyZWFkKGhGaWxlLCBwdHIsIDIwMDBMKTsKLQljbG9zZShoRmlsZSk7Ci0JcmV0dXJuIFRSVUU7Ci0gICAgY2FzZSBXTV9QQUlOVDoKLQloREMgPSBCZWdpblBhaW50KGhEbGcsICZwcyk7Ci0JR2V0Q2xpZW50UmVjdChoRGxnLCAmcmVjdCk7Ci0JaWYgKENyZWRpdE1vZGUpIHsKLQkgICAgRmlsbFJlY3QoaERDLCAmcmVjdCwgR2V0U3RvY2tPYmplY3QoV0hJVEVfQlJVU0gpKTsKLQkgICAgSW5mbGF0ZVJlY3QoJnJlY3QsIC04LCAtOCk7Ci0JICAgIERyYXdUZXh0KGhEQywgcHRyLCAtMSwgJnJlY3QsIERUX0xFRlQgfCBEVF9XT1JEQlJFQUspOwotCSAgICBFbmRQYWludChoRGxnLCAmcHMpOwotCSAgICByZXR1cm4gVFJVRTsKLQkgICAgfQotCUZpbGxSZWN0KGhEQywgJnJlY3QsIEdldFN0b2NrT2JqZWN0KEdSQVlfQlJVU0gpKTsKLQlJbmZsYXRlUmVjdCgmcmVjdCwgLTMsIC0zKTsKLQlGcmFtZVJlY3QoaERDLCAmcmVjdCwgR2V0U3RvY2tPYmplY3QoQkxBQ0tfQlJVU0gpKTsKLQlJbmZsYXRlUmVjdCgmcmVjdCwgLTEwLCAtMTApOwotCWhNZW1EQyA9IENyZWF0ZUNvbXBhdGlibGVEQyhoREMpOwotCWhibXBPbGQgPSBTZWxlY3RPYmplY3QoaE1lbURDLCBoQml0TWFwKTsKLQlHZXRPYmplY3QoaEJpdE1hcCwgc2l6ZW9mKEJJVE1BUCksIChMUFNUUikmYm0pOwotCUJpdEJsdChoREMsIHJlY3QubGVmdCwgcmVjdC50b3AsIGJtLmJtV2lkdGgsIGJtLmJtSGVpZ2h0LCAKLQkJCQkJaE1lbURDLCAwLCAwLCBTUkNDT1BZKTsKLSAgICAgICAgU2VsZWN0T2JqZWN0KCBoTWVtREMsIGhibXBPbGQgKTsKLQlEZWxldGVEQyhoTWVtREMpOwotCUVuZFBhaW50KGhEbGcsICZwcyk7Ci0JcmV0dXJuIFRSVUU7Ci0gICAgY2FzZSBXTV9DT01NQU5EOgotCXN3aXRjaCAod1BhcmFtKQotCSAgICB7Ci0JICAgIGNhc2UgSURZRVM6Ci0JCWlmICghQ3JlZGl0TW9kZSkgewotCQkgICAgU2V0V2luZG93UG9zKGhEbGcsIChIV05EKU5VTEwsIDAsIDAsIDY0MCwgNDgwLCAKLQkJCQlTV1BfTk9NT1ZFIHwgU1dQX05PWk9SREVSKTsKLQkJICAgIH0KLQkJZWxzZSB7Ci0JCSAgICBTZXRXaW5kb3dQb3MoaERsZywgKEhXTkQpTlVMTCwgMCwgMCwgMzIwLCAyNTAsIAotCQkJCVNXUF9OT01PVkUgfCBTV1BfTk9aT1JERVIpOwotCQkgICAgfQotCQlDcmVkaXRNb2RlID0gIUNyZWRpdE1vZGU7Ci0JCVNob3dXaW5kb3coR2V0RGxnSXRlbShoRGxnLCBJRFlFUyksIENyZWRpdE1vZGUgPyBTV19ISURFIDogU1dfU0hPVyk7Ci0JCVNob3dXaW5kb3coR2V0RGxnSXRlbShoRGxnLCBJRE9LKSwgQ3JlZGl0TW9kZSA/IFNXX0hJREUgOiBTV19TSE9XKTsKLQkJSW52YWxpZGF0ZVJlY3QoaERsZywgKExQUkVDVClOVUxMLCBUUlVFKTsKLQkJVXBkYXRlV2luZG93KGhEbGcpOwotCQlyZXR1cm4gVFJVRTsKLQkgICAgY2FzZSBJRENBTkNFTDoKLQkgICAgY2FzZSBJRE9LOgotICAgICAgICAgICAgICAgIGlmIChoQml0TWFwICE9IDAgKSBEZWxldGVPYmplY3QoaEJpdE1hcCk7Ci0JCWlmIChwdHIgIT0gTlVMTCkgZnJlZShwdHIpOwotCQlFbmREaWFsb2coaERsZywgVFJVRSk7Ci0JCXJldHVybiBUUlVFOwotCSAgICBkZWZhdWx0OgotCQlyZXR1cm4gVFJVRTsKLQkgICAgfQotICAgIH0KLXJldHVybiBGQUxTRTsKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCQkJRmF0YWxBcHBFeGl0ICBbVVNFUi4xMzddCi0gKi8KLQotdm9pZCBGYXRhbEFwcEV4aXQoV09SRCB3QWN0aW9uLCBMUFNUUiBzdHIpCi17Ci1NZXNzYWdlQm94KChIV05EKU5VTEwsIHN0ciwgTlVMTCwgTUJfU1lTVEVNTU9EQUwgfCBNQl9PSyk7Ci1leGl0KDEpOwotfQpkaWZmIC0tZ2l0IGEvbWlzYy9wcm9maWxlLmMgYi9taXNjL3Byb2ZpbGUuYwppbmRleCA5Nzk2ZDQ5Li5hMWJjZTEyIDEwMDY0NAotLS0gYS9taXNjL3Byb2ZpbGUuYworKysgYi9taXNjL3Byb2ZpbGUuYwpAQCAtMTA2LDcgKzEwNiw3IEBACiAKIAogICAgIHN0YXRlID0gRmlyc3RCcmFjZTsKLSAgICB3aGlsZSAoKGMgPSBnZXRjIChmKSkgIT0gRU9GKXsKKyAgICB3aGlsZSAoKGMgPSBmZ2V0YyAoZikpICE9IEVPRil7CiAJaWYgKGMgPT0gJ1xyJykJCS8qIElnbm9yZSBDYXJyaWFnZSBSZXR1cm4gKi8KIAkgICAgY29udGludWU7CiAJCkBAIC0xODgsNyArMTg4LDcgQEAKIAkgICAgCiAJfSAvKiBzd2l0Y2ggKi8KIAkKLSAgICB9IC8qIHdoaWxlICgoYyA9IGdldGMgKGYpKSAhPSBFT0YpICovCisgICAgfSAvKiB3aGlsZSAoKGMgPSBmZ2V0YyAoZikpICE9IEVPRikgKi8KICAgICByZXR1cm4gU2VjSGVhZGVyOwogfQogCmRpZmYgLS1naXQgYS9taXNjL3NoZWxsLmMgYi9taXNjL3NoZWxsLmMKaW5kZXggZjZhOGRiNi4uYmFiN2IwMiAxMDA2NDQKLS0tIGEvbWlzYy9zaGVsbC5jCisrKyBiL21pc2Mvc2hlbGwuYwpAQCAtNiwxMSArNiwxMiBAQAogI2luY2x1ZGUgPHN0cmluZy5oPgogI2luY2x1ZGUgPHVuaXN0ZC5oPgogI2luY2x1ZGUgIndpbmRvd3MuaCIKLSNpbmNsdWRlICJsaWJyYXJ5LmgiCiAjaW5jbHVkZSAic2hlbGwuaCIKICNpbmNsdWRlICJuZWV4ZS5oIgogI2luY2x1ZGUgInNlbGVjdG9ycy5oIgogI2luY2x1ZGUgIi4uL3JjL3N5c3Jlcy5oIgorI2luY2x1ZGUgImRsZ3MuaCIKKyNpbmNsdWRlICJkaWFsb2cuaCIKICNpbmNsdWRlICJzdGRkZWJ1Zy5oIgogLyogI2RlZmluZSBERUJVR19SRUcgKi8KICNpbmNsdWRlICJkZWJ1Zy5oIgpAQCAtMzEyLDcgKzMxMyw3IEBACiAgKi8KIHZvaWQgRHJhZ0FjY2VwdEZpbGVzKEhXTkQgaFduZCwgQk9PTCBiKQogewotCWRwcmludGZfcmVnKHN0ZG5pbXAsICJEcmFnQWNjZXB0RmlsZXMgOiBFbXB0eSBTdHViICEhIVxuIik7CisJZnByaW50ZihzdGRuaW1wLCAiRHJhZ0FjY2VwdEZpbGVzIDogRW1wdHkgU3R1YiAhISFcbiIpOwogfQogCiAKQEAgLTMyMSw3ICszMjIsNyBAQAogICovCiB2b2lkIERyYWdRdWVyeUZpbGUoSERST1AgaCwgVUlOVCB1LCBMUFNUUiB1MiwgVUlOVCB1MykKIHsKLQlkcHJpbnRmX3JlZyhzdGRuaW1wLCAiRHJhZ1F1ZXJ5RmlsZSA6IEVtcHR5IFN0dWIgISEhXG4iKTsKKwlmcHJpbnRmKHN0ZG5pbXAsICJEcmFnUXVlcnlGaWxlIDogRW1wdHkgU3R1YiAhISFcbiIpOwogCiB9CiAKQEAgLTMzMSw4ICszMzIsNyBAQAogICovCiB2b2lkIERyYWdGaW5pc2goSERST1AgaCkKIHsKLQlkcHJpbnRmX3JlZyhzdGRuaW1wLCAiRHJhZ0ZpbmlzaCA6IEVtcHR5IFN0dWIgISEhXG4iKTsKLQorCWZwcmludGYoc3RkbmltcCwgIkRyYWdGaW5pc2ggOiBFbXB0eSBTdHViICEhIVxuIik7CiB9CiAKIApAQCAtMzQxLDcgKzM0MSw3IEBACiAgKi8KIEJPT0wgRHJhZ1F1ZXJ5UG9pbnQoSERST1AgaCwgUE9JTlQgRkFSICpwKQogewotCWRwcmludGZfcmVnKHN0ZG5pbXAsICJEcmFnUXVlcnlQb2lueXQgOiBFbXB0eSBTdHViICEhIVxuIik7CisJZnByaW50ZihzdGRuaW1wLCAiRHJhZ1F1ZXJ5UG9pbnQgOiBFbXB0eSBTdHViICEhIVxuIik7CiAgICAgICAgIHJldHVybiBGQUxTRTsKIH0KIApAQCAtMzUxLDEyICszNTEsMTQgQEAKICAqLwogSElOU1RBTkNFIFNoZWxsRXhlY3V0ZShIV05EIGhXbmQsIExQQ1NUUiBscE9wZXJhdGlvbiwgTFBDU1RSIGxwRmlsZSwgTFBDU1RSIGxwUGFyYW1ldGVycywgTFBDU1RSIGxwRGlyZWN0b3J5LCBpbnQgaVNob3dDbWQpCiB7Ci0JZHByaW50Zl9yZWcoc3RkbmltcCwgIlNoZWxsRXhlY3V0ZSAvLyBoV25kPSUwNFhcbiIsIGhXbmQpOwotCWRwcmludGZfcmVnKHN0ZG5pbXAsICJTaGVsbEV4ZWN1dGUgLy8gbHBPcGVyYXRpb249JyVzJ1xuIiwgbHBPcGVyYXRpb24pOwotCWRwcmludGZfcmVnKHN0ZG5pbXAsICJTaGVsbEV4ZWN1dGUgLy8gbHBGaWxlPSclcydcbiIsIGxwRmlsZSk7Ci0JZHByaW50Zl9yZWcoc3RkbmltcCwgIlNoZWxsRXhlY3V0ZSAvLyBscFBhcmFtZXRlcnM9JyVzJ1xuIiwgbHBQYXJhbWV0ZXJzKTsKLQlkcHJpbnRmX3JlZyhzdGRuaW1wLCAiU2hlbGxFeGVjdXRlIC8vIGxwRGlyZWN0b3J5PSclcydcbiIsIGxwRGlyZWN0b3J5KTsKLQlkcHJpbnRmX3JlZyhzdGRuaW1wLCAiU2hlbGxFeGVjdXRlIC8vIGlTaG93Q21kPSUwNFhcbiIsIGlTaG93Q21kKTsKKyAgICAgICAgZnByaW50ZihzdGRuaW1wLCAiU2hlbGxFeGVjdXRlOiBlbXB0eSBzdHViXG4iKTsKKyAgICAgICAgcmV0dXJuIDI7CisJZnByaW50ZihzdGRuaW1wLCAiU2hlbGxFeGVjdXRlIC8vIGhXbmQ9JTA0WFxuIiwgaFduZCk7ICAKKwlmcHJpbnRmKHN0ZG5pbXAsICJTaGVsbEV4ZWN1dGUgLy8gbHBPcGVyYXRpb249JyVzJ1xuIiwgbHBPcGVyYXRpb24pOworCWZwcmludGYoc3RkbmltcCwgIlNoZWxsRXhlY3V0ZSAvLyBscEZpbGU9JyVzJ1xuIiwgbHBGaWxlKTsKKwlmcHJpbnRmKHN0ZG5pbXAsICJTaGVsbEV4ZWN1dGUgLy8gbHBQYXJhbWV0ZXJzPSclcydcbiIsIGxwUGFyYW1ldGVycyk7CisJZnByaW50ZihzdGRuaW1wLCAiU2hlbGxFeGVjdXRlIC8vIGxwRGlyZWN0b3J5PSclcydcbiIsIGxwRGlyZWN0b3J5KTsKKwlmcHJpbnRmKHN0ZG5pbXAsICJTaGVsbEV4ZWN1dGUgLy8gaVNob3dDbWQ9JTA0WFxuIiwgaVNob3dDbWQpOwogCXJldHVybiAyOyAvKiBmaWxlIG5vdCBmb3VuZCAqLwogfQogCkBAIC0zNjYsNTggKzM2OCw1NyBAQAogICovCiBISU5TVEFOQ0UgRmluZEV4ZWN1dGFibGUoTFBDU1RSIGxwRmlsZSwgTFBDU1RSIGxwRGlyZWN0b3J5LCBMUFNUUiBscFJlc3VsdCkKIHsKLQlkcHJpbnRmX3JlZyhzdGRuaW1wLCAiRmluZEV4ZWN1dGFibGUgOiBFbXB0eSBTdHViICEhIVxuIik7CisJZnByaW50ZihzdGRuaW1wLCAiRmluZEV4ZWN1dGFibGUgOiBFbXB0eSBTdHViICEhIVxuIik7CiAgICAgICAgIHJldHVybiAwOwogfQogCi1jaGFyIEFwcE5hbWVbMjU2XSwgQXBwTWlzY1syNTZdOwotSU5UIEFib3V0RGxnUHJvYyhIV05EIGhXbmQsIFdPUkQgbXNnLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0pOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoJCQkJU2hlbGxBYm91dAkJW1NIRUxMLjIyXQotICovCi1JTlQgU2hlbGxBYm91dChIV05EIGhXbmQsIExQQ1NUUiBzekFwcCwgTFBDU1RSIHN6T3RoZXJTdHVmZiwgSElDT04gaEljb24pCi17Ci0vKglmcHJpbnRmKHN0ZGVyciwgIlNoZWxsQWJvdXQgISAoJXMsICVzKVxuIiwgc3pBcHAsIHN6T3RoZXJTdHVmZik7Ki8KLQotCWlmIChzekFwcCkKLQkJc3RyY3B5KEFwcE5hbWUsIHN6QXBwKTsKLQllbHNlCi0JCSpBcHBOYW1lID0gMDsKLQotCWlmIChzek90aGVyU3R1ZmYpCi0JCXN0cmNweShBcHBNaXNjLCBzek90aGVyU3R1ZmYpOwotCWVsc2UKLQkJKkFwcE1pc2MgPSAwOwotCi0JcmV0dXJuIERpYWxvZ0JveEluZGlyZWN0UHRyKCBHZXRXaW5kb3dXb3JkKGhXbmQsIEdXV19ISU5TVEFOQ0UpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5c3Jlc19ESUFMT0dfU0hFTExfQUJPVVRfTVNHQk9YLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhXbmQsIEdldFduZFByb2NFbnRyeTE2KCJBYm91dERsZ1Byb2MiKSk7Ci19Ci0KK3N0YXRpYyBjaGFyIEFwcE5hbWVbNTEyXSwgQXBwTWlzY1s1MTJdOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoJCQkJQWJvdXREbGdQcm9jCQlbU0hFTEwuMzNdCiAgKi8KIElOVCBBYm91dERsZ1Byb2MoSFdORCBoV25kLCBXT1JEIG1zZywgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtKQogewotCWNoYXIgdGVtcFsyNTZdOworICBzd2l0Y2gobXNnKSB7CisgICBjYXNlIFdNX0lOSVRESUFMT0c6CisgICAgU2VuZERsZ0l0ZW1NZXNzYWdlKGhXbmQsc3RjMSxTVE1fU0VUSUNPTixMT1dPUkQobFBhcmFtKSwwKTsKKyAgICBTZXRXaW5kb3dUZXh0KGhXbmQsIEFwcE5hbWUpOworICAgIFNldFdpbmRvd1RleHQoR2V0RGxnSXRlbShoV25kLDEwMCksIEFwcE1pc2MpOworICAgIHJldHVybiAxOworICAgIAorICAgY2FzZSBXTV9DT01NQU5EOgorICAgIHN3aXRjaCAod1BhcmFtKSB7CisgICAgIGNhc2UgSURPSzoKKyAgICAgIEVuZERpYWxvZyhoV25kLCBUUlVFKTsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKyAgICBicmVhazsKKyAgfQorICByZXR1cm4gRkFMU0U7Cit9CiAKLQlzd2l0Y2gobXNnKSB7Ci0gICAgICAgIGNhc2UgV01fSU5JVERJQUxPRzoKLQkJc3ByaW50Zih0ZW1wLCAiQWJvdXQgJXMiLCBBcHBOYW1lKTsKLQkJU2V0V2luZG93VGV4dChoV25kLCB0ZW1wKTsKLSAgICAgICAgICAgICAgICBTZXRXaW5kb3dUZXh0KEdldERsZ0l0ZW0oaFduZCwxMDApLCBBcHBNaXNjICk7Ci0JCWJyZWFrOwotCi0gICAgICAgIGNhc2UgV01fQ09NTUFORDoKLQkJc3dpdGNoICh3UGFyYW0pIHsKLQkJY2FzZSBJRE9LOgotCQkJRW5kRGlhbG9nKGhXbmQsIFRSVUUpOwotCQkJcmV0dXJuIFRSVUU7Ci0JCX0KLQl9Ci0JcmV0dXJuIEZBTFNFOworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCQkJCVNoZWxsQWJvdXQJCVtTSEVMTC4yMl0KKyAqLworSU5UIFNoZWxsQWJvdXQoSFdORCBoV25kLCBMUENTVFIgc3pBcHAsIExQQ1NUUiBzek90aGVyU3R1ZmYsIEhJQ09OIGhJY29uKQoreworICBpZiAoc3pBcHApIHsKKyAgICBzcHJpbnRmKEFwcE5hbWUsICJBYm91dCAlcyIsIHN6QXBwKTsKKyAgfSBlbHNlICB7CisgICAgKkFwcE5hbWUgPSAwOworICB9CisgIGlmIChzek90aGVyU3R1ZmYpIHsKKyAgICBzdHJjcHkoQXBwTWlzYywgc3pPdGhlclN0dWZmKTsKKyAgfSBlbHNlIHsKKyAgICAqQXBwTWlzYyA9IDA7CisgIH0KKyAgaWYgKCFoSWNvbikgeworICAgIGhJY29uID0gTG9hZEljb24oMCxNQUtFSU5UUkVTT1VSQ0UoT0lDX1dJTkVJQ09OKSk7CisgIH0KKyAgcmV0dXJuIERpYWxvZ0JveEluZGlyZWN0UGFyYW1QdHIoR2V0V2luZG93V29yZChoV25kLCBHV1dfSElOU1RBTkNFKSwKKwkJCQkgICBzeXNyZXNfRElBTE9HX1NIRUxMX0FCT1VUX01TR0JPWCwKKwkJCQkgICBoV25kLCBHZXRXbmRQcm9jRW50cnkxNigiQWJvdXREbGdQcm9jIiksCisJCQkJICAgaEljb24pOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtNDI1LDI0ICs0MjYsMjMgQEAKICAqLwogSElDT04gRXh0cmFjdEljb24oSElOU1RBTkNFIGhJbnN0LCBMUENTVFIgbHBzekV4ZUZpbGVOYW1lLCBVSU5UIG5JY29uSW5kZXgpCiB7Ci0JaW50CQljb3VudDsKIAlISUNPTgloSWNvbiA9IDA7CiAJSElOU1RBTkNFIGhJbnN0MiA9IGhJbnN0OwogCWRwcmludGZfcmVnKHN0ZGRlYiwgIkV4dHJhY3RJY29uKCUwNFgsICclcycsICVkXG4iLCAKIAkJCWhJbnN0LCBscHN6RXhlRmlsZU5hbWUsIG5JY29uSW5kZXgpOwogCWlmIChscHN6RXhlRmlsZU5hbWUgIT0gTlVMTCkgewogCQloSW5zdDIgPSBMb2FkTGlicmFyeShscHN6RXhlRmlsZU5hbWUpOwotCQl9CisJfQogCWlmIChoSW5zdDIgIT0gMCAmJiBuSWNvbkluZGV4ID09IChVSU5UKS0xKSB7CiAjaWYgMAogCQljb3VudCA9IEdldFJzcmNDb3VudChoSW5zdDIsIE5FX1JTQ1RZUEVfR1JPVVBfSUNPTik7CiAJCWRwcmludGZfcmVnKHN0ZGRlYiwgIkV4dHJhY3RJY29uIC8vICclcycgaGFzICVkIGljb25zICFcbiIsIGxwc3pFeGVGaWxlTmFtZSwgY291bnQpOwogCQlyZXR1cm4gKEhJQ09OKWNvdW50OwogI2VuZGlmCi0JCX0KKwl9CiAJaWYgKGhJbnN0MiAhPSBoSW5zdCAmJiBoSW5zdDIgIT0gMCkgewogCQlGcmVlTGlicmFyeShoSW5zdDIpOwotCQl9CisJfQogCXJldHVybiBoSWNvbjsKIH0KIApAQCAtNDUyLDggKzQ1MiwyMCBAQAogICovCiBISUNPTiBFeHRyYWN0QXNzb2NpYXRlZEljb24oSElOU1RBTkNFIGhJbnN0LExQU1RSIGxwSWNvblBhdGgsIExQV09SRCBscGlJY29uKQogewotCWRwcmludGZfcmVnKHN0ZG5pbXAsICJFeHRyYWN0QXNzb2NpYXRlZEljb24gOiBFbXB0eSBTdHViICEhIVxuIik7Ci0gICAgICAgIHJldHVybiAwOworICAgIGRwcmludGZfcmVnKHN0ZG5pbXAsICJFeHRyYWN0QXNzb2NpYXRlZEljb24gOiBFbXB0eSBTdHViICEhIVxuIik7CisgICAgcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgRG9FbnZpcm9ubWVudFN1YnN0ICAgICAgW1NIRUxMLjM3XQorICogSSBjb3VsZG4ndCBmaW5kIGFueSByZWZlcmVuY2UsIHNvIGV2ZW4gdGhlIG51bWJlciBvZiBieXRlcyBvbiB0aGUKKyAqIHN0YWNrIG1pZ2h0IGJlIHdyb25nCisgKi8KK1dPUkQgRG9FbnZpcm9ubWVudFN1YnN0KExQU1RSIGEsV09SRCBiLFdPUkQgYykKK3sKKyAgICBwcmludGYoc3RkZXJyLCAiRG9FbnZpcm9ubWVudFN1YnN0OiBVbmtub3duIGFyZ3VtZW50IGNvdW50XG4iKTsKKyAgICBkcHJpbnRmX3JlZyhzdGRuaW1wLCAiRG9FbnZpcm9ubWVudFN1YnN0ICV4ICV4ICV4XG4iLGEsYixjKTsKKyAgICByZXR1cm4gMDsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKZGlmZiAtLWdpdCBhL21pc2Mvc3B5LmMgYi9taXNjL3NweS5jCmluZGV4IGYxMjFiMTguLjUyNDM5MmMgMTAwNjQ0Ci0tLSBhL21pc2Mvc3B5LmMKKysrIGIvbWlzYy9zcHkuYwpAQCAtMTU2LDEwICsxNTYsMTIgQEAKICAgICAiV01fSU5JVE1FTlUiLCAgICAgICAgICAgICAgLyogMHgwMTE2ICovCiAgICAgIldNX0lOSVRNRU5VUE9QVVAiLCAgICAgICAgIC8qIDB4MDExNyAqLwogICAgICJXTV9TWVNUSU1FUiIsCQkvKiAweDAxMTggKi8KLSAgICBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLAorICAgIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsCisgICAgIldNX01FTlVTRUxFQ1QiLCAgICAgICAgICAgIC8qIDB4MDExZiAqLwogCi0gICAgLyogMHgwMTIwICovCi0gICAgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwKKyAgICAiV01fTUVOVUNIQVIiLCAgICAgICAgICAgICAgLyogMHgwMTIwICovCisgICAgIldNX0VOVEVSSURMRSIsICAgICAgICAgICAgIC8qIDB4MDEyMSAqLworICAgIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsCiAgICAgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwKIAogICAgIC8qIDB4MDEzMCAqLwpAQCAtMjI3LDE2ICsyMjksMjMgQEAKICAgICBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLAogCiAgICAgIldNX1BBUkVOVE5PVElGWSIsCQkvKiAweDAyMTAgKi8KLQotICAgIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsCisgICAgIldNX0VOVEVSTUVOVUxPT1AiLCAgICAgICAgIC8qIDB4MDIxMSAqLworICAgICJXTV9FWElUTUVOVUxPT1AiLCAgICAgICAgICAvKiAweDAyMTIgKi8KKyAgICBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLAogICAgIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsCiAKLSAgICAvKiAweDAyMjAgKi8KLSAgICBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLAotICAgIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsCisgICAgIldNX01ESUNSRUFURSIsICAgICAgICAgICAgIC8qIDB4MDIyMCAqLworICAgICJXTV9NRElERVNUUk9ZIiwgICAgICAgICAgICAvKiAweDAyMjEgKi8KKyAgICAiV01fTURJQUNUSVZBVEUiLCAgICAgICAgICAgLyogMHgwMjIyICovCisgICAgIldNX01ESVJFU1RPUkUiLCAgICAgICAgICAgIC8qIDB4MDIyMyAqLworICAgICJXTV9NRElORVhUIiwgICAgICAgICAgICAgICAvKiAweDAyMjQgKi8KKyAgICAiV01fTURJTUFYSU1JWkUiLCAgICAgICAgICAgLyogMHgwMjI1ICovCisgICAgIldNX01ESVRJTEUiLCAgICAgICAgICAgICAgIC8qIDB4MDIyNiAqLworICAgICJXTV9NRElDQVNDQURFIiwgICAgICAgICAgICAvKiAweDAyMjcgKi8KKyAgICAiV01fTURJSUNPTkFSUkFOR0UiLCAgICAgICAgLyogMHgwMjI4ICovCisgICAgIldNX01ESUdFVEFDVElWRSIsICAgICAgICAgIC8qIDB4MDIyOSAqLwogCi0gICAgCi0gICAgTlVMTCwJCQkvKiAweDAyMzAgKi8KKyAgICAiV01fTURJU0VUTUVOVSIsICAgICAgICAgICAgLyogMHgwMjMwICovCiAgICAgIldNX0VOVEVSU0laRU1PVkUiLAkJLyogMHgwMjMxICovCiAgICAgIldNX0VYSVRTSVpFTU9WRSIJCS8qIDB4MDIzMiAqLwogfTsKZGlmZiAtLWdpdCBhL21pc2MvdXNlci5jIGIvbWlzYy91c2VyLmMKaW5kZXggZTY4ZjQ0My4uZDliZjFkOCAxMDA2NDQKLS0tIGEvbWlzYy91c2VyLmMKKysrIGIvbWlzYy91c2VyLmMKQEAgLTkyLDE2ICs5MiwyNyBAQAogICovCiBpbnQgVVNFUl9Jbml0QXBwKGludCBoSW5zdGFuY2UpCiB7CisgICAgZXh0ZXJuIEJPT0wgV0lER0VUU19Jbml0KHZvaWQpOworCisgICAgc3RhdGljIGludCBmaXJzdFRhc2sgPSAxOwogICAgIGludCBxdWV1ZVNpemU7CiAKKyAgICBpZiAoZmlyc3RUYXNrKQorICAgIHsKKyAgICAgICAgLyogUGVyZm9ybSBnbG9iYWwgaW5pdGlhbGlzYXRpb25zIHRoYXQgbmVlZCBhIHRhc2sgY29udGV4dCAqLworCisgICAgICAgICAgLyogSW5pdGlhbGl6ZSBidWlsdC1pbiB3aW5kb3cgY2xhc3NlcyAqLworICAgICAgICBpZiAoIVdJREdFVFNfSW5pdCgpKSByZXR1cm4gMDsKKworICAgICAgICAgIC8qIENyZWF0ZSBkZXNrdG9wIHdpbmRvdyAqLworICAgICAgICBpZiAoIVdJTl9DcmVhdGVEZXNrdG9wV2luZG93KCkpIHJldHVybiAwOworCisgICAgICAgIGZpcnN0VGFzayA9IDA7CisgICAgfQorCiAgICAgICAvKiBDcmVhdGUgdGFzayBtZXNzYWdlIHF1ZXVlICovCiAgICAgcXVldWVTaXplID0gR2V0UHJvZmlsZUludCggIndpbmRvd3MiLCAiRGVmYXVsdFF1ZXVlU2l6ZSIsIDggKTsKICAgICBpZiAoIVNldE1lc3NhZ2VRdWV1ZSggcXVldWVTaXplICkpIHJldHVybiAwOwogCi0jaWZuZGVmIFdJTkVMSUIKLSAgICAvKiBJbml0aWFsaXplIERMTHMgKi8KLSAgICBJbml0aWFsaXplTG9hZGVkRExMcyhOVUxMKTsKLSNlbmRpZgotICAgICAgICAKICAgICByZXR1cm4gMTsKIH0KZGlmZiAtLWdpdCBhL21pc2Mvd2luc29ja2V0LmMgYi9taXNjL3dpbnNvY2tldC5jCmluZGV4IDU1MWFjNDEuLmVlOTUzNzUgMTAwNjQ0Ci0tLSBhL21pc2Mvd2luc29ja2V0LmMKKysrIGIvbWlzYy93aW5zb2NrZXQuYwpAQCAtMzYsNiArMzYsOSBAQAogCVdPUkQJd01zZzsKIAlMT05HCWxQYXJhbTsKIH07CisKKyNwcmFnbWEgcGFjaygxKQorCiAjZGVmaW5lIElQQ19QQUNLRVRfU0laRSAoc2l6ZW9mKHN0cnVjdCBpcGNfcGFja2V0KSAtIHNpemVvZihsb25nKSkKICNkZWZpbmUgTVRZUEUgMHhiMGIwZWIwNQogI2RlZmluZSBXSU5FX1BBQ0tFRCBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkKQEAgLTgyLDYgKzg1LDggQEAKIH07CiBzdGF0aWMgc3RydWN0IFdpblNvY2tIZWFwICpoZWFwOwogCisjcHJhZ21hIHBhY2soNCkKKwogI2RlZmluZSBkdW1wX3NvY2thZGRyKGEpIFwKIAlmcHJpbnRmKHN0ZGVyciwgInNvY2thZGRyX2luOiBmYW1pbHkgJWQsIGFkZHJlc3MgJXMsIHBvcnQgJWRcbiIsIFwKIAkJCSgoc3RydWN0IHNvY2thZGRyX2luICopYSktPnNpbl9mYW1pbHksIFwKZGlmZiAtLWdpdCBhL21pc2NlbXUvSW1ha2VmaWxlIGIvbWlzY2VtdS9JbWFrZWZpbGUKaW5kZXggYmU2NGEyNy4uMTFlMzg0MCAxMDA2NDQKLS0tIGEvbWlzY2VtdS9JbWFrZWZpbGUKKysrIGIvbWlzY2VtdS9JbWFrZWZpbGUKQEAgLTE1LDggKzE1LDcgQEAKIAlpbnQyYS5jIFwKIAlpbnQyZi5jIFwKIAlpbnQzMS5jIFwKLQlpb3BvcnRzLmMgXAotCWtlcm5lbC5jCisJaW9wb3J0cy5jCiAKIE9CSlMgPSAkKFNSQ1M6LmM9Lm8pCiAKZGlmZiAtLWdpdCBhL21pc2NlbXUvaW50MjEuYyBiL21pc2NlbXUvaW50MjEuYwppbmRleCA0NGNiMGNlLi5lNGJiOTFmIDEwMDY0NAotLS0gYS9taXNjZW11L2ludDIxLmMKKysrIGIvbWlzY2VtdS9pbnQyMS5jCkBAIC0yOTEsNiArMjkxLDggQEAKIAkJRXJyb3IgKEludmFsaWRIYW5kbGUsIEVMX1Vua25vd24sIEVDX1Vua25vd24pOwogCQlBWCA9IEludmFsaWRIYW5kbGU7CiAJCVNldENmbGFnOworICAgICAgICAJZHByaW50Zl9pbnQoc3RkZGViLAorCQkJImludDIxOiByZWFkICglZCwgdm9pZCAqLCAweCV4KSA9IEVCQURGXG4iLCBCWCwgQ1gpOwogCQlyZXR1cm47CiAJfQogCkBAIC0zMDAsOSArMzAyLDE0IEBACiAJCUVycm9yICgwLDAsMCk7CiAJCUFYID0gMTsKIAkJUmVzZXRDZmxhZzsKKyAgICAgICAgCWRwcmludGZfaW50KHN0ZGRlYiwKKwkJCSJpbnQyMTogcmVhZCAoJWQsIHZvaWQgKiwgMHgleCkgPSBFT0ZcbiIsIEJYLCBDWCk7CiAJCXJldHVybjsKIAl9IGVsc2UgewogCQlzaXplID0gcmVhZChCWCwgcHRyLCBDWCk7CisgICAgICAgIAlkcHJpbnRmX2ludChzdGRkZWIsCisJCQkiaW50MjE6IHJlYWQgKCVkLCB2b2lkICosIDB4JXgpID0gMHgleFxuIiwKKwkJCUJYLCBDWCwgc2l6ZSk7CiAJCWlmIChzaXplID09IC0xKSB7CiAJCQllcnJub190b19kb3NlcnIoKTsKIAkJCUFMID0gRXh0ZW5kZWRFcnJvcjsKQEAgLTM3Miw2ICszNzksMTAgQEAKIAkJCWJyZWFrOwogCQl9CiAgICAgICAgIHN0YXR1cyA9IGxzZWVrKEJYLCAoQ1ggPDwgMTYpICsgRFgsIGZpbGVvZmZzZXQpOworCisJZHByaW50Zl9pbnQgKHN0ZGRlYiwgImludDIxOiBzZWVrICglZCwgMHgleCwgJWQpID0gMHglbHhcbiIsCisJCQlCWCwgKENYIDw8IDE2KSArIERYLCBBTCwgc3RhdHVzKTsKKwogCWlmIChzdGF0dXMgPT0gLTEpIHsKIAkJZXJybm9fdG9fZG9zZXJyKCk7CiAJCUFMID0gRXh0ZW5kZWRFcnJvcjsJCQlTZXRDZmxhZzsKQEAgLTM4Niw2ICszOTcsOSBAQAogCiBzdGF0aWMgdm9pZCBpb2N0bEdldERldmljZUluZm8oc3RydWN0IHNpZ2NvbnRleHRfc3RydWN0ICpjb250ZXh0KQogeworCisJZHByaW50Zl9pbnQgKHN0ZGRlYiwgImludDIxOiBpb2N0bCAoJWQsIEdldERldmljZUluZm8pXG4iLCBCWCk7CisKIAlzd2l0Y2ggKEJYKSB7CiAJCWNhc2UgMDoKIAkJY2FzZSAxOgpAQCAtNDY3LDcgKzQ4MSw3IEBACiAJbHRpbWUgPSB0aW1lKE5VTEwpOwogCW5vdyA9IGxvY2FsdGltZSgmbHRpbWUpOwogCi0JQ1ggPSBub3ctPnRtX3llYXIgKyAxOTAwOworCUNYID0gbm93LT50bV95ZWFyICsgMTkwMCAtIDE5ODA7CiAJRFggPSAoKG5vdy0+dG1fbW9uICsgMSkgPDwgOCkgfCBub3ctPnRtX21kYXk7CiAJQVggPSBub3ctPnRtX3dkYXk7CiB9CkBAIC01MzcsNiArNTUxLDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPX1JET05MWSApOwogICAgICAgICAgICAgaWYoIGhhbmRsZSA9PSAtMSApCiAgICAgICAgICAgICB7CisJCWRwcmludGZfaW50IChzdGRkZWIsICJpbnQyMTogb3BlbiAoJXMsICVkKSA9IC0xXG4iLAorCQkJRE9TX0dldFVuaXhGaWxlTmFtZShQVFJfU0VHX09GRl9UT19MSU4oRFMsRFgpKSwgbW9kZSk7CiAgICAgICAgICAgICAgICAgZXJybm9fdG9fZG9zZXJyKCk7CiAgICAgICAgICAgICAgICAgQUwgPSBFeHRlbmRlZEVycm9yOwogICAgICAgICAgICAgICAgIFNldENmbGFnOwpAQCAtNTQ0LDYgKzU2MCw5IEBACiAgICAgICAgICAgICB9CiAJfQkJCiAKKwlkcHJpbnRmX2ludCAoc3RkZGViLCAiaW50MjE6IG9wZW4gKCVzLCAlZCkgPSAlZFxuIiwKKwkJRE9TX0dldFVuaXhGaWxlTmFtZShQVFJfU0VHX09GRl9UT19MSU4oRFMsRFgpKSwgbW9kZSwgaGFuZGxlKTsKKwogICAgICAgICBzd2l0Y2ggKEFYICYgMHgwMDcwKQogCXsKIAkgIGNhc2UgMHgwMDogICAgLyogY29tcGF0YWJpbGl0eSBtb2RlICovCkBAIC02MDIsNiArNjIxLDggQEAKIAogc3RhdGljIHZvaWQgQ2xvc2VGaWxlKHN0cnVjdCBzaWdjb250ZXh0X3N0cnVjdCAqY29udGV4dCkKIHsKKwlkcHJpbnRmX2ludCAoc3RkZGViLCAiaW50MjE6IGNsb3NlICglZClcbiIsIEJYKTsKKwogCWlmIChjbG9zZShCWCkgPT0gLTEpIHsKIAkJZXJybm9fdG9fZG9zZXJyKCk7CiAJCUFMID0gRXh0ZW5kZWRFcnJvcjsKQEAgLTExNjYsMTIgKzExODcsMTYgQEAKICAgaWYgKChTX0lXUklURSAmIHMuc3RfbW9kZSkgIT0gU19JV1JJVEUpCiAgICAgY3h8PTB4MDE7CiAKKyAgZHByaW50Zl9pbnQgKHN0ZGRlYiwgImludDIxOiBHZXRGaWxlQXR0cmlidXRlcyAoJXMpID0gMHgleFxuIiwKKwkJZmlsZW5hbWUsIGN4KTsKKwogICBFQ1ggPSAoRUNYICYgMHhmZmZmMDAwMCkgfCBjeDsKICAgUmVzZXRDZmxhZzsKICAgRXJyb3IgKDAsMCwwKTsgCiB9CiAKIAorZXh0ZXJuIHZvaWQgTE9DQUxfUHJpbnRIZWFwIChXT1JEIGRzKTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIApAQCAtMTI4Miw2ICsxMzA3LDcgQEAKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBUREIgKnBUYXNrID0gKFREQiAqKUdsb2JhbExvY2soIEdldEN1cnJlbnRUYXNrKCkgKTsKICAgICAgICAgICAgICAgICBwVGFzay0+ZHRhID0gTUFLRUxPTkcoIERYLCBEUyApOworICAgICAgICAgICAgICAgIGRwcmludGZfaW50KHN0ZGRlYiwgImludDIxOiBTZXQgRFRBOiAlMDhseFxuIiwgcFRhc2stPmR0YSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKIApAQCAtMTcwMSw2ICsxNzI3LDEwIEBACiAJICAgIHJldHVybiAxOwogCX0KICAgICB9CisgICAgZHByaW50Zl9pbnQoc3RkZGViLCJyZXQyMTogQVggJTA0eCwgQlggJTA0eCwgQ1ggJTA0eCwgRFggJTA0eCwgIgorICAgICAgICAgICAiU0kgJTA0eCwgREkgJTA0eCwgRFMgJTA0eCwgRVMgJTA0eCBFRkwgJTA4bHhcbiIsCisgICAgICAgICAgIEFYLCBCWCwgQ1gsIERYLCBTSSwgREksIERTLCBFUywgRUZMKTsKKwogICAgIHJldHVybiAxOwogfQogCmRpZmYgLS1naXQgYS9taXNjZW11L2ludDI1LmMgYi9taXNjZW11L2ludDI1LmMKaW5kZXggZWE1NjhlMy4uM2ZiMjVhNyAxMDA2NDQKLS0tIGEvbWlzY2VtdS9pbnQyNS5jCisrKyBiL21pc2NlbXUvaW50MjUuYwpAQCAtNiw2ICs2LDcgQEAKICNpbmNsdWRlICJsZHQuaCIKICNpbmNsdWRlICJ3aW5lLmgiCiAjaW5jbHVkZSAibWlzY2VtdS5oIgorI2luY2x1ZGUgImRvc19mcy5oIgogI2luY2x1ZGUgInN0ZGRlYnVnLmgiCiAvKiAjZGVmaW5lIERFQlVHX0lOVCAqLwogI2luY2x1ZGUgImRlYnVnLmgiCmRpZmYgLS1naXQgYS9taXNjZW11L2ludDI2LmMgYi9taXNjZW11L2ludDI2LmMKaW5kZXggMDQ2YzZiZC4uZGUwYWVjZiAxMDA2NDQKLS0tIGEvbWlzY2VtdS9pbnQyNi5jCisrKyBiL21pc2NlbXUvaW50MjYuYwpAQCAtNSw2ICs1LDcgQEAKICNpbmNsdWRlICJsZHQuaCIKICNpbmNsdWRlICJ3aW5lLmgiCiAjaW5jbHVkZSAibWlzY2VtdS5oIgorI2luY2x1ZGUgImRvc19mcy5oIgogI2luY2x1ZGUgInN0ZGRlYnVnLmgiCiAvKiAjZGVmaW5lIERFQlVHX0lOVCAqLwogI2luY2x1ZGUgImRlYnVnLmgiCmRpZmYgLS1naXQgYS9taXNjZW11L2tlcm5lbC5jIGIvbWlzY2VtdS9rZXJuZWwuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGRhYzdlZS4uMDAwMDAwMAotLS0gYS9taXNjZW11L2tlcm5lbC5jCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoKLXN0YXRpYyBjaGFyIFJDU0lkW10gPSAiJElkOiBrZXJuZWwuYyx2IDEuMiAxOTkzLzA3LzA0IDA0OjA0OjIxIHJvb3QgRXhwIHJvb3QgJCI7Ci1zdGF0aWMgY2hhciBDb3B5cmlnaHRbXSA9ICJDb3B5cmlnaHQgIFJvYmVydCBKLiBBbXN0YWR0LCAxOTkzIjsKLSovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgInByb3RvdHlwZXMuaCIKLSNpbmNsdWRlICJvcHRpb25zLmgiCi0jaW5jbHVkZSAid2luZS5oIgotI2luY2x1ZGUgInN0ZGRlYnVnLmgiCi0jaW5jbHVkZSAiZGVidWcuaCIKLQotZXh0ZXJuIHVuc2lnbmVkIHNob3J0IFdJTl9TdGFja1NpemU7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgkJCQkJS0VSTkVMX0luaXRUYXNrCi0gKi8KLXZvaWQgS0VSTkVMX0luaXRUYXNrKCBzdHJ1Y3Qgc2lnY29udGV4dF9zdHJ1Y3QgY29udGV4dCApCi17Ci0gICAgY29udGV4dC5zY19lYXggPSAxOwotICAgIGNvbnRleHQuc2NfZWJ4ID0gMHg4MTsKLSAgICBjb250ZXh0LnNjX2VjeCA9IFdJTl9TdGFja1NpemU7Ci0gICAgY29udGV4dC5zY19lZHggPSBPcHRpb25zLmNtZFNob3c7Ci0gICAgY29udGV4dC5zY19lZGkgPSAwOwotICAgIGNvbnRleHQuc2NfZWRpID0gY29udGV4dC5zY19kczsKLX0KLQpkaWZmIC0tZ2l0IGEvbXVsdGltZWRpYS9hdWRpby5jIGIvbXVsdGltZWRpYS9hdWRpby5jCmluZGV4IGRlM2M4YWQuLjJhNWZhYTQgMTAwNjQ0Ci0tLSBhL211bHRpbWVkaWEvYXVkaW8uYworKysgYi9tdWx0aW1lZGlhL2F1ZGlvLmMKQEAgLTEsNCArMSw0IEBACi0vKgorLyoJCQkJICAgCiAgKiBTYW1wbGUgV2luZSBEcml2ZXIgZm9yIExpbnV4CiAgKgogICogQ29weXJpZ2h0IDE5OTQgTWFydGluIEF5b3R0ZQpAQCAtMjMsNiArMjMsNyBAQAogI2luY2x1ZGUgImRyaXZlci5oIgogI2luY2x1ZGUgIm1tc3lzdGVtLmgiCiAjaW5jbHVkZSAibGR0LmgiCisjaW5jbHVkZSAic3RhY2tmcmFtZS5oIgogCiAjaWZkZWYgbGludXgKICNpbmNsdWRlIDxsaW51eC9zb3VuZGNhcmQuaD4KQEAgLTgyLDcgKzgzLDcgQEAKIHN0YXRpYyBMSU5VWF9NQ0lXQVZFCU1DSVdhdkRldltNQVhfTUNJV0FWRFJWXTsKICNlbmRpZgogCi1EV09SRCBXQVZFX21jaU9wZW4oRFdPUkQgZHdGbGFncywgTFBNQ0lfV0FWRV9PUEVOX1BBUk1TIGxwUGFybXMpOworRFdPUkQgV0FWRV9tY2lPcGVuKFVJTlQgd0RldklELCBEV09SRCBkd0ZsYWdzLCBMUE1DSV9XQVZFX09QRU5fUEFSTVMgbHBQYXJtcyk7CiBEV09SRCBXQVZFX21jaUNsb3NlKFVJTlQgd0RldklELCBEV09SRCBkd1BhcmFtLCBMUE1DSV9HRU5FUklDX1BBUk1TIGxwUGFybXMpOwogRFdPUkQgV0FWRV9tY2lQbGF5KFVJTlQgd0RldklELCBEV09SRCBkd0ZsYWdzLCBMUE1DSV9QTEFZX1BBUk1TIGxwUGFybXMpOwogRFdPUkQgV0FWRV9tY2lSZWNvcmQoVUlOVCB3RGV2SUQsIERXT1JEIGR3RmxhZ3MsIExQTUNJX1JFQ09SRF9QQVJNUyBscFBhcm1zKTsKQEAgLTEzMCw2ICsxMzEsOCBAQAogCQkJCQkJRFdPUkQgZHdQYXJhbTEsIERXT1JEIGR3UGFyYW0yKQogewogI2lmZGVmIGxpbnV4CisJZHByaW50Zl9tY2l3YXZlKHN0ZGRlYiwiV0FWRV9Ecml2ZXJQcm9jKCUwOGxYLCAlMDRYLCAlMDRYLCAlMDhsWCwgJTA4bFgpXG4iLCAKKwkJZHdEZXZJRCwgaERyaXYsIHdNc2csIGR3UGFyYW0xLCBkd1BhcmFtMik7CiAJc3dpdGNoKHdNc2cpIHsKIAkJY2FzZSBEUlZfTE9BRDoKIAkJCXJldHVybiAoTFJFU1VMVCkxTDsKQEAgLTE1NSw3ICsxNTgsNyBAQAogCQkJcmV0dXJuIChMUkVTVUxUKURSVkNORl9SRVNUQVJUOwogCQljYXNlIE1DSV9PUEVOX0RSSVZFUjoKIAkJY2FzZSBNQ0lfT1BFTjoKLQkJCXJldHVybiBXQVZFX21jaU9wZW4oZHdQYXJhbTEsIChMUE1DSV9XQVZFX09QRU5fUEFSTVMpUFRSX1NFR19UT19MSU4oZHdQYXJhbTIpKTsKKwkJCXJldHVybiBXQVZFX21jaU9wZW4oZHdEZXZJRCwgZHdQYXJhbTEsIChMUE1DSV9XQVZFX09QRU5fUEFSTVMpUFRSX1NFR19UT19MSU4oZHdQYXJhbTIpKTsKIAkJY2FzZSBNQ0lfQ0xPU0VfRFJJVkVSOgogCQljYXNlIE1DSV9DTE9TRToKIAkJCXJldHVybiBXQVZFX21jaUNsb3NlKGR3RGV2SUQsIGR3UGFyYW0xLCAoTFBNQ0lfR0VORVJJQ19QQVJNUylQVFJfU0VHX1RPX0xJTihkd1BhcmFtMikpOwpAQCAtMTg3LDE4ICsxOTAsMjEgQEAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIAkJCQlXQVZFX21jaU9wZW4JKi8KLURXT1JEIFdBVkVfbWNpT3BlbihEV09SRCBkd0ZsYWdzLCBMUE1DSV9XQVZFX09QRU5fUEFSTVMgbHBQYXJtcykKK0RXT1JEIFdBVkVfbWNpT3BlbihVSU5UIHdEZXZJRCwgRFdPUkQgZHdGbGFncywgTFBNQ0lfV0FWRV9PUEVOX1BBUk1TIGxwUGFybXMpCiB7CiAjaWZkZWYgbGludXgKLQlVSU5UIAkJd0RldklEOworCUhBTkRMRQkJaEZvcm1hdDsKIAlMUFBDTVdBVkVGT1JNQVQJbHBXYXZlRm9ybWF0OwotCVdBVkVPUEVOREVTQyAJV2F2ZURlc2M7CisJSEFORExFCQloRGVzYzsKKwlMUFdBVkVPUEVOREVTQyAJbHBEZXNjOworCUxQU1RSCQlscHN0ckVsZW1lbnROYW1lOwogCURXT1JECQlkd1JldDsKIAljaGFyCQlzdHJbMTI4XTsKIAotCWRwcmludGZfbWNpd2F2ZShzdGRkZWIsIldBVkVfbWNpT3BlbiglMDhsWCwgJXApXG4iLCBkd0ZsYWdzLCBscFBhcm1zKTsKKwlkcHJpbnRmX21jaXdhdmUoc3RkZGViLCJXQVZFX21jaU9wZW4oJTA0WCwgJTA4bFgsICVwKVxuIiwgCisJCQkJd0RldklELCBkd0ZsYWdzLCBscFBhcm1zKTsKIAlpZiAobHBQYXJtcyA9PSBOVUxMKSByZXR1cm4gTUNJRVJSX0lOVEVSTkFMOwotCXdEZXZJRCA9IGxwUGFybXMtPndEZXZpY2VJRDsKKwlkcHJpbnRmX21jaXdhdmUoc3RkZGViLCJXQVZFX21jaU9wZW4gLy8gd0RldklEPSUwNFhcbiIsIHdEZXZJRCk7CiAJaWYgKE1DSVdhdkRldlt3RGV2SURdLm5Vc2VDb3VudCA+IDApIHsKIAkJLyogVGhlIGRyaXZlciBhbHJlYWR5IG9wZW4gb24gdGhpcyBjaGFubmVsICovCiAJCS8qIElmIHRoZSBkcml2ZXIgd2FzIG9wZW5lZCBzaGFyZWFibGUgYmVmb3JlIGFuZCB0aGlzIG9wZW4gc3BlY2lmaWVzICovCkBAIC0yMTIsMTIgKzIxOCwxOSBAQAogCQlNQ0lXYXZEZXZbd0RldklEXS5uVXNlQ291bnQgPSAxOwogCQlNQ0lXYXZEZXZbd0RldklEXS5mU2hhcmVhYmxlID0gZHdGbGFncyAmIE1DSV9PUEVOX1NIQVJFQUJMRTsKIAkJfQotICAgIGlmIChkd0ZsYWdzICYgTUNJX09QRU5fRUxFTUVOVCkgewotICAgICAgICBkcHJpbnRmX21jaXdhdmUoc3RkZGViLCJXQVZFX21jaU9wZW4gLy8gTUNJX09QRU5fRUxFTUVOVCAnJXMnICFcbiIsCi0JCQkJCQkJCWxwUGFybXMtPmxwc3RyRWxlbWVudE5hbWUpOworCWRwcmludGZfbWNpd2F2ZShzdGRkZWIsIldBVkVfbWNpT3BlbiAvLyBiZWZvcmUgc2V0dGluZyBsUGFyYW1zLT53RGV2aWNlSUQgLy8gd2luc3RhY2s9JXAgZHM9JTA0WCBzcz0lMDRYIHNwPSUwNFhcbiIsCisJCShCWVRFICopQ1VSUkVOVF9TVEFDSzE2LT5hcmdzLCAKKwkJQ1VSUkVOVF9TVEFDSzE2LT5kcywgSUYxNjMyX1NhdmVkMTZfc3MsIElGMTYzMl9TYXZlZDE2X3NwKTsKKwlscFBhcm1zLT53RGV2aWNlSUQgPSB3RGV2SUQ7CisJZHByaW50Zl9tY2l3YXZlKHN0ZGRlYiwiV0FWRV9tY2lPcGVuIC8vIHdEZXZJRD0lMDRYXG4iLCB3RGV2SUQpOworCWRwcmludGZfbWNpd2F2ZShzdGRkZWIsIldBVkVfbWNpT3BlbiAvLyBiZWZvcmUgT1BFTl9FTEVNRU5UXG4iKTsKKwlpZiAoZHdGbGFncyAmIE1DSV9PUEVOX0VMRU1FTlQpIHsKKwkJbHBzdHJFbGVtZW50TmFtZSA9IChMUFNUUilQVFJfU0VHX1RPX0xJTihscFBhcm1zLT5scHN0ckVsZW1lbnROYW1lKTsKKwkJZHByaW50Zl9tY2l3YXZlKHN0ZGRlYiwiV0FWRV9tY2lPcGVuIC8vIE1DSV9PUEVOX0VMRU1FTlQgJyVzJyAhXG4iLAorCQkJCQkJbHBzdHJFbGVtZW50TmFtZSk7CiAvKgkJcHJpbnRmKCJXQVZFX21jaU9wZW4gLy8gY2R3PSclcydcbiIsIERPU19HZXRDdXJyZW50RGlyKERPU19HZXREZWZhdWx0RHJpdmUoKSkpOyAqLwotCQlpZiAoc3RybGVuKGxwUGFybXMtPmxwc3RyRWxlbWVudE5hbWUpID4gMCkgewotCQkJc3RyY3B5KHN0ciwgbHBQYXJtcy0+bHBzdHJFbGVtZW50TmFtZSk7CisJCWlmIChzdHJsZW4obHBzdHJFbGVtZW50TmFtZSkgPiAwKSB7CisJCQlzdHJjcHkoc3RyLCBscHN0ckVsZW1lbnROYW1lKTsKIAkJCUFuc2lVcHBlcihzdHIpOwogCQkJTUNJV2F2RGV2W3dEZXZJRF0uaEZpbGUgPSBtbWlvT3BlbihzdHIsIE5VTEwsIAogCQkJCU1NSU9fQUxMT0NCVUYgfCBNTUlPX1JFQURXUklURSB8IE1NSU9fRVhDTFVTSVZFKTsKQEAgLTIzMywxNCArMjQ2LDE3IEBACiAJbWVtY3B5KCZNQ0lXYXZEZXZbd0RldklEXS5vcGVuUGFybXMsIGxwUGFybXMsIHNpemVvZihNQ0lfV0FWRV9PUEVOX1BBUk1TKSk7CiAJTUNJV2F2RGV2W3dEZXZJRF0ud05vdGlmeURldmljZUlEID0gbHBQYXJtcy0+d0RldmljZUlEOwogCWxwV2F2ZUZvcm1hdCA9ICZNQ0lXYXZEZXZbd0RldklEXS5XYXZlRm9ybWF0OwotCVdhdmVEZXNjLmhXYXZlID0gMDsKLQlXYXZlRGVzYy5scEZvcm1hdCA9IChMUFdBVkVGT1JNQVQpbHBXYXZlRm9ybWF0OworCWhEZXNjID0gVVNFUl9IRUFQX0FMTE9DKHNpemVvZihXQVZFT1BFTkRFU0MpKTsKKwlscERlc2MgPSAoTFBXQVZFT1BFTkRFU0MpIFVTRVJfSEVBUF9MSU5fQUREUihoRGVzYyk7CisJbHBEZXNjLT5oV2F2ZSA9IDA7CisvKgogCWxwV2F2ZUZvcm1hdC0+d2Yud0Zvcm1hdFRhZyA9IFdBVkVfRk9STUFUX1BDTTsKIAlscFdhdmVGb3JtYXQtPndCaXRzUGVyU2FtcGxlID0gODsKIAlscFdhdmVGb3JtYXQtPndmLm5DaGFubmVscyA9IDE7CiAJbHBXYXZlRm9ybWF0LT53Zi5uU2FtcGxlc1BlclNlYyA9IDExMDI1OwogCWxwV2F2ZUZvcm1hdC0+d2YubkF2Z0J5dGVzUGVyU2VjID0gMTEwMjU7CiAJbHBXYXZlRm9ybWF0LT53Zi5uQmxvY2tBbGlnbiA9IDE7CisqLwogCWlmIChNQ0lXYXZEZXZbd0RldklEXS5oRmlsZSAhPSAwKSB7CiAJCU1NQ0tJTkZPCW1tY2tJbmZvOwogCQlNTUNLSU5GTwlja01haW5SSUZGOwpAQCAtMjgyLDggKzI5OCwxNCBAQAogCQl9CiAJbHBXYXZlRm9ybWF0LT53Zi5uQXZnQnl0ZXNQZXJTZWMgPSAKIAkJbHBXYXZlRm9ybWF0LT53Zi5uU2FtcGxlc1BlclNlYyAqIGxwV2F2ZUZvcm1hdC0+d2YubkJsb2NrQWxpZ247Ci0JZHdSZXQgPSB3b2RNZXNzYWdlKDAsIFdPRE1fT1BFTiwgMCwgKERXT1JEKSZXYXZlRGVzYywgQ0FMTEJBQ0tfTlVMTCk7Ci0JZHdSZXQgPSB3aWRNZXNzYWdlKDAsIFdJRE1fT1BFTiwgMCwgKERXT1JEKSZXYXZlRGVzYywgQ0FMTEJBQ0tfTlVMTCk7CisJaEZvcm1hdCA9IFVTRVJfSEVBUF9BTExPQyhzaXplb2YoUENNV0FWRUZPUk1BVCkpOworCWxwRGVzYy0+bHBGb3JtYXQgPSAoTFBXQVZFRk9STUFUKSBVU0VSX0hFQVBfTElOX0FERFIoaEZvcm1hdCk7CisJbWVtY3B5KGxwRGVzYy0+bHBGb3JtYXQsIGxwV2F2ZUZvcm1hdCwgc2l6ZW9mKFBDTVdBVkVGT1JNQVQpKTsKKwlscERlc2MgPSAoTFBXQVZFT1BFTkRFU0MpIFVTRVJfSEVBUF9TRUdfQUREUihoRGVzYyk7CisJZHdSZXQgPSB3b2RNZXNzYWdlKDAsIFdPRE1fT1BFTiwgMCwgKERXT1JEKWxwRGVzYywgQ0FMTEJBQ0tfTlVMTCk7CisJZHdSZXQgPSB3aWRNZXNzYWdlKDAsIFdJRE1fT1BFTiwgMCwgKERXT1JEKWxwRGVzYywgQ0FMTEJBQ0tfTlVMTCk7CisJVVNFUl9IRUFQX0ZSRUUoaEZvcm1hdCk7CisJVVNFUl9IRUFQX0ZSRUUoaERlc2MpOwogCXJldHVybiAwOwogI2Vsc2UKIAlyZXR1cm4gTU1TWVNFUlJfTk9URU5BQkxFRDsKQEAgLTMyMywxMCArMzQ1LDEzIEBACiBEV09SRCBXQVZFX21jaVBsYXkoVUlOVCB3RGV2SUQsIERXT1JEIGR3RmxhZ3MsIExQTUNJX1BMQVlfUEFSTVMgbHBQYXJtcykKIHsKICNpZmRlZiBsaW51eAotCWludAkJCWNvdW50OwotCWludAkJCXN0YXJ0LCBlbmQ7CisJaW50CQkJCXN0YXJ0LCBlbmQ7CisJTE9ORwkJCWJ1ZnNpemUsIGNvdW50OworCUhBTkRMRQkJCWhEYXRhOworCUhBTkRMRQkJCWhXYXZlSGRyOwogCUxQV0FWRUhEUgkJbHBXYXZlSGRyOwotCURXT1JECQlkd1JldDsKKwlMUFdBVkVIRFIJCWxwMTZXYXZlSGRyOworCURXT1JECQkJZHdSZXQ7CiAJZHByaW50Zl9tY2l3YXZlKHN0ZGRlYiwKIAkJICJXQVZFX21jaVBsYXkoJXUsICUwOGxYLCAlcCk7XG4iLCB3RGV2SUQsIGR3RmxhZ3MsIGxwUGFybXMpOwogCWlmIChNQ0lXYXZEZXZbd0RldklEXS5oRmlsZSA9PSAwKSB7CkBAIC0zNjEsMjkgKzM4NiwzOCBAQAogCQkJfQogCQl9CiAvKiovCisJYnVmc2l6ZSA9IDY0MDAwOwogCWxwV2F2ZUhkciA9ICZNQ0lXYXZEZXZbd0RldklEXS5XYXZlSGRyOwotCWxwV2F2ZUhkci0+bHBEYXRhID0gKExQU1RSKSBtYWxsb2MoNjQwMDApOwotCWxwV2F2ZUhkci0+ZHdCdWZmZXJMZW5ndGggPSAzMjAwMDsKKwloRGF0YSA9IEdsb2JhbEFsbG9jKEdNRU1fTU9WRUFCTEUsIGJ1ZnNpemUpOworCWxwV2F2ZUhkci0+bHBEYXRhID0gKExQU1RSKSBXSU4xNl9HbG9iYWxMb2NrKGhEYXRhKTsKIAlscFdhdmVIZHItPmR3VXNlciA9IDBMOwogCWxwV2F2ZUhkci0+ZHdGbGFncyA9IDBMOwogCWxwV2F2ZUhkci0+ZHdMb29wcyA9IDBMOwotCWR3UmV0ID0gd29kTWVzc2FnZSgwLCBXT0RNX1BSRVBBUkUsIDAsIChEV09SRClscFdhdmVIZHIsIHNpemVvZihXQVZFSERSKSk7Ci0vKglwcmludGYoIldBVkVfbWNpUGxheSAvLyBhZnRlciBXT0RNX1BSRVBBUkUgXG4iKTsgKi8KKwloV2F2ZUhkciA9IFVTRVJfSEVBUF9BTExPQyhzaXplb2YoV0FWRUhEUikpOworCWxwMTZXYXZlSGRyID0gKExQV0FWRUhEUikgVVNFUl9IRUFQX1NFR19BRERSKGhXYXZlSGRyKTsKKwltZW1jcHkoUFRSX1NFR19UT19MSU4obHAxNldhdmVIZHIpLCBscFdhdmVIZHIsIHNpemVvZihXQVZFSERSKSk7CisJbHBXYXZlSGRyID0gUFRSX1NFR19UT19MSU4obHAxNldhdmVIZHIpOworCWR3UmV0ID0gd29kTWVzc2FnZSgwLCBXT0RNX1BSRVBBUkUsIDAsIChEV09SRClscDE2V2F2ZUhkciwgc2l6ZW9mKFdBVkVIRFIpKTsKIAl3aGlsZShUUlVFKSB7Ci0JCWNvdW50ID0gbW1pb1JlYWQoTUNJV2F2RGV2W3dEZXZJRF0uaEZpbGUsIGxwV2F2ZUhkci0+bHBEYXRhLCBscFdhdmVIZHItPmR3QnVmZmVyTGVuZ3RoKTsKKwkJY291bnQgPSBtbWlvUmVhZChNQ0lXYXZEZXZbd0RldklEXS5oRmlsZSwgCisJCQlQVFJfU0VHX1RPX0xJTihscFdhdmVIZHItPmxwRGF0YSksIGJ1ZnNpemUpOworCQlkcHJpbnRmX21jaXdhdmUoc3RkZGViLCJXQVZFX21jaVBsYXkgLy8gbW1pb1JlYWQgYnVmc2l6ZT0lbGQgY291bnQ9JWxkXG4iLCBidWZzaXplLCBjb3VudCk7CiAJCWlmIChjb3VudCA8IDEpIGJyZWFrOwotCQlscFdhdmVIZHItPmR3Qnl0ZXNSZWNvcmRlZCA9IGNvdW50OwotCQlkcHJpbnRmX21jaXdhdmUoc3RkZGViLCJXQVZFX21jaVBsYXkgLy8gYmVmb3JlIFdPRE1fV1JJVEUgbHBXYXZlSGRyPSVwIGR3Qnl0ZXNSZWNvcmRlZD0lbHVcbiIsCi0JCQkJCWxwV2F2ZUhkciwgbHBXYXZlSGRyLT5kd0J5dGVzUmVjb3JkZWQpOwotCQlkd1JldCA9IHdvZE1lc3NhZ2UoMCwgV09ETV9XUklURSwgMCwgKERXT1JEKWxwV2F2ZUhkciwgc2l6ZW9mKFdBVkVIRFIpKTsKKwkJbHBXYXZlSGRyLT5kd0J1ZmZlckxlbmd0aCA9IGNvdW50OworLyoJCWxwV2F2ZUhkci0+ZHdCeXRlc1JlY29yZGVkID0gY291bnQ7ICovCisJCWRwcmludGZfbWNpd2F2ZShzdGRkZWIsIldBVkVfbWNpUGxheSAvLyBiZWZvcmUgV09ETV9XUklURSBscFdhdmVIZHI9JXAgZHdCdWZmZXJMZW5ndGg9JWx1IGR3Qnl0ZXNSZWNvcmRlZD0lbHVcbiIsCisJCQkJbHBXYXZlSGRyLCBscFdhdmVIZHItPmR3QnVmZmVyTGVuZ3RoLCBscFdhdmVIZHItPmR3Qnl0ZXNSZWNvcmRlZCk7CisJCWR3UmV0ID0gd29kTWVzc2FnZSgwLCBXT0RNX1dSSVRFLCAwLCAoRFdPUkQpbHAxNldhdmVIZHIsIHNpemVvZihXQVZFSERSKSk7CiAJCX0KLQlkd1JldCA9IHdvZE1lc3NhZ2UoMCwgV09ETV9VTlBSRVBBUkUsIDAsIChEV09SRClscFdhdmVIZHIsIHNpemVvZihXQVZFSERSKSk7CisJZHdSZXQgPSB3b2RNZXNzYWdlKDAsIFdPRE1fVU5QUkVQQVJFLCAwLCAoRFdPUkQpbHAxNldhdmVIZHIsIHNpemVvZihXQVZFSERSKSk7CiAJaWYgKGxwV2F2ZUhkci0+bHBEYXRhICE9IE5VTEwpIHsKLQkJZnJlZShscFdhdmVIZHItPmxwRGF0YSk7CisJCUdsb2JhbFVubG9jayhoRGF0YSk7CisJCUdsb2JhbEZyZWUoaERhdGEpOwogCQlscFdhdmVIZHItPmxwRGF0YSA9IE5VTEw7CiAJCX0KKwlVU0VSX0hFQVBfRlJFRShoV2F2ZUhkcik7CiAJaWYgKGR3RmxhZ3MgJiBNQ0lfTk9USUZZKSB7Ci0JICBkcHJpbnRmX21jaXdhdmUoc3RkZGViLCJXQVZFX21jaVBsYXkgLy8gTUNJX05PVElGWV9TVUNDRVNTRlVMICUwOGxYICFcbiIsIGxwUGFybXMtPmR3Q2FsbGJhY2spOworCQlkcHJpbnRmX21jaXdhdmUoc3RkZGViLCJXQVZFX21jaVBsYXkgLy8gTUNJX05PVElGWV9TVUNDRVNTRlVMICUwOGxYICFcbiIsIGxwUGFybXMtPmR3Q2FsbGJhY2spOwogCQltY2lEcml2ZXJOb3RpZnkoKEhXTkQpTE9XT1JEKGxwUGFybXMtPmR3Q2FsbGJhY2spLCAKIAkJCU1DSVdhdkRldlt3RGV2SURdLndOb3RpZnlEZXZpY2VJRCwgTUNJX05PVElGWV9TVUNDRVNTRlVMKTsKIAkJZXhpdCgwKTsKQEAgLTQwMSw4ICs0MzUsMTIgQEAKIERXT1JEIFdBVkVfbWNpUmVjb3JkKFVJTlQgd0RldklELCBEV09SRCBkd0ZsYWdzLCBMUE1DSV9SRUNPUkRfUEFSTVMgbHBQYXJtcykKIHsKICNpZmRlZiBsaW51eAotCWludAkJCXN0YXJ0LCBlbmQ7CisJaW50CQkJCXN0YXJ0LCBlbmQ7CisJTE9ORwkJCWJ1ZnNpemU7CisJSEFORExFCQkJaERhdGE7CisJSEFORExFCQkJaFdhdmVIZHI7CiAJTFBXQVZFSERSCQlscFdhdmVIZHI7CisJTFBXQVZFSERSCQlscDE2V2F2ZUhkcjsKIAlEV09SRAkJCWR3UmV0OwogCiAJZHByaW50Zl9tY2l3YXZlKHN0ZGRlYiwKQEAgLTQyMiwxMyArNDYwLDE5IEBACiAJCWVuZCA9IGxwUGFybXMtPmR3VG87CiAJCWRwcmludGZfbWNpd2F2ZShzdGRkZWIsIldBVkVfbWNpUmVjb3JkIC8vIE1DSV9UTz0lZCBcbiIsIGVuZCk7CiAJCX0KKwlidWZzaXplID0gNjQwMDA7CiAJbHBXYXZlSGRyID0gJk1DSVdhdkRldlt3RGV2SURdLldhdmVIZHI7Ci0JbHBXYXZlSGRyLT5scERhdGEgPSAoTFBTVFIpIG1hbGxvYyg2NDAwMCk7Ci0JbHBXYXZlSGRyLT5kd0J1ZmZlckxlbmd0aCA9IDMyMDAwOworCWhEYXRhID0gR2xvYmFsQWxsb2MoR01FTV9NT1ZFQUJMRSwgYnVmc2l6ZSk7CisJbHBXYXZlSGRyLT5scERhdGEgPSAoTFBTVFIpIFdJTjE2X0dsb2JhbExvY2soaERhdGEpOworCWxwV2F2ZUhkci0+ZHdCdWZmZXJMZW5ndGggPSBidWZzaXplOwogCWxwV2F2ZUhkci0+ZHdVc2VyID0gMEw7CiAJbHBXYXZlSGRyLT5kd0ZsYWdzID0gMEw7CiAJbHBXYXZlSGRyLT5kd0xvb3BzID0gMEw7Ci0JZHdSZXQgPSB3aWRNZXNzYWdlKDAsIFdJRE1fUFJFUEFSRSwgMCwgKERXT1JEKWxwV2F2ZUhkciwgc2l6ZW9mKFdBVkVIRFIpKTsKKwloV2F2ZUhkciA9IFVTRVJfSEVBUF9BTExPQyhzaXplb2YoV0FWRUhEUikpOworCWxwMTZXYXZlSGRyID0gKExQV0FWRUhEUikgVVNFUl9IRUFQX1NFR19BRERSKGhXYXZlSGRyKTsKKwltZW1jcHkoUFRSX1NFR19UT19MSU4obHAxNldhdmVIZHIpLCBscFdhdmVIZHIsIHNpemVvZihXQVZFSERSKSk7CisJbHBXYXZlSGRyID0gUFRSX1NFR19UT19MSU4obHAxNldhdmVIZHIpOworCWR3UmV0ID0gd2lkTWVzc2FnZSgwLCBXSURNX1BSRVBBUkUsIDAsIChEV09SRClscDE2V2F2ZUhkciwgc2l6ZW9mKFdBVkVIRFIpKTsKICAgICBkcHJpbnRmX21jaXdhdmUoc3RkZGViLCJXQVZFX21jaVJlY29yZCAvLyBhZnRlciBXSURNX1BSRVBBUkUgXG4iKTsKIAl3aGlsZShUUlVFKSB7CiAJCWxwV2F2ZUhkci0+ZHdCeXRlc1JlY29yZGVkID0gMDsKQEAgLTQzOSwxMiArNDgzLDE0IEBACiAJCWlmIChscFdhdmVIZHItPmR3Qnl0ZXNSZWNvcmRlZCA9PSAwKSBicmVhazsKIAkJfQogCWRwcmludGZfbWNpd2F2ZShzdGRkZWIsIldBVkVfbWNpUmVjb3JkIC8vIGJlZm9yZSBXSURNX1VOUFJFUEFSRSBcbiIpOwotCWR3UmV0ID0gd2lkTWVzc2FnZSgwLCBXSURNX1VOUFJFUEFSRSwgMCwgKERXT1JEKWxwV2F2ZUhkciwgc2l6ZW9mKFdBVkVIRFIpKTsKKwlkd1JldCA9IHdpZE1lc3NhZ2UoMCwgV0lETV9VTlBSRVBBUkUsIDAsIChEV09SRClscDE2V2F2ZUhkciwgc2l6ZW9mKFdBVkVIRFIpKTsKIAlkcHJpbnRmX21jaXdhdmUoc3RkZGViLCJXQVZFX21jaVJlY29yZCAvLyBhZnRlciBXSURNX1VOUFJFUEFSRSBcbiIpOwogCWlmIChscFdhdmVIZHItPmxwRGF0YSAhPSBOVUxMKSB7Ci0JCWZyZWUobHBXYXZlSGRyLT5scERhdGEpOworCQlHbG9iYWxVbmxvY2soaERhdGEpOworCQlHbG9iYWxGcmVlKGhEYXRhKTsKIAkJbHBXYXZlSGRyLT5scERhdGEgPSBOVUxMOwogCQl9CisJVVNFUl9IRUFQX0ZSRUUoaFdhdmVIZHIpOwogCWlmIChkd0ZsYWdzICYgTUNJX05PVElGWSkgewogCSAgZHByaW50Zl9tY2l3YXZlKHN0ZGRlYiwiV0FWRV9tY2lSZWNvcmQgLy8gTUNJX05PVElGWV9TVUNDRVNTRlVMICUwOGxYICFcbiIsIGxwUGFybXMtPmR3Q2FsbGJhY2spOwogCQltY2lEcml2ZXJOb3RpZnkoKEhXTkQpTE9XT1JEKGxwUGFybXMtPmR3Q2FsbGJhY2spLCAKQEAgLTQ2Myw4ICs1MDksOCBAQAogRFdPUkQgV0FWRV9tY2lTdG9wKFVJTlQgd0RldklELCBEV09SRCBkd0ZsYWdzLCBMUE1DSV9HRU5FUklDX1BBUk1TIGxwUGFybXMpCiB7CiAjaWZkZWYgbGludXgKLSAgICAgICAgZHByaW50Zl9tY2l3YXZlKHN0ZGRlYiwKLQkJICJXQVZFX21jaVN0b3AoJXUsICUwOGxYLCAlcCk7XG4iLCB3RGV2SUQsIGR3RmxhZ3MsIGxwUGFybXMpOworCWRwcmludGZfbWNpd2F2ZShzdGRkZWIsCisJCSJXQVZFX21jaVN0b3AoJXUsICUwOGxYLCAlcCk7XG4iLCB3RGV2SUQsIGR3RmxhZ3MsIGxwUGFybXMpOwogCWlmIChscFBhcm1zID09IE5VTEwpIHJldHVybiBNQ0lFUlJfSU5URVJOQUw7CiAJcmV0dXJuIDA7CiAjZWxzZQpAQCAtNDc5LDcgKzUyNSw3IEBACiBEV09SRCBXQVZFX21jaVBhdXNlKFVJTlQgd0RldklELCBEV09SRCBkd0ZsYWdzLCBMUE1DSV9HRU5FUklDX1BBUk1TIGxwUGFybXMpCiB7CiAjaWZkZWYgbGludXgKLSAgICAgICAgZHByaW50Zl9tY2l3YXZlKHN0ZGRlYiwKKwlkcHJpbnRmX21jaXdhdmUoc3RkZGViLAogCQkiV0FWRV9tY2lQYXVzZSgldSwgJTA4bFgsICVwKTtcbiIsIHdEZXZJRCwgZHdGbGFncywgbHBQYXJtcyk7CiAJaWYgKGxwUGFybXMgPT0gTlVMTCkgcmV0dXJuIE1DSUVSUl9JTlRFUk5BTDsKIAlyZXR1cm4gMDsKQEAgLTQ5NSw3ICs1NDEsNyBAQAogRFdPUkQgV0FWRV9tY2lSZXN1bWUoVUlOVCB3RGV2SUQsIERXT1JEIGR3RmxhZ3MsIExQTUNJX0dFTkVSSUNfUEFSTVMgbHBQYXJtcykKIHsKICNpZmRlZiBsaW51eAotICAgICAgICBkcHJpbnRmX21jaXdhdmUoc3RkZGViLAorCWRwcmludGZfbWNpd2F2ZShzdGRkZWIsCiAJCSJXQVZFX21jaVJlc3VtZSgldSwgJTA4bFgsICVwKTtcbiIsIHdEZXZJRCwgZHdGbGFncywgbHBQYXJtcyk7CiAJaWYgKGxwUGFybXMgPT0gTlVMTCkgcmV0dXJuIE1DSUVSUl9JTlRFUk5BTDsKIAlyZXR1cm4gMDsKQEAgLTUxMSw4ICs1NTcsOCBAQAogRFdPUkQgV0FWRV9tY2lTZXQoVUlOVCB3RGV2SUQsIERXT1JEIGR3RmxhZ3MsIExQTUNJX1NFVF9QQVJNUyBscFBhcm1zKQogewogI2lmZGVmIGxpbnV4Ci0gICAgICAgIGRwcmludGZfbWNpd2F2ZShzdGRkZWIsCi0JCSAgIldBVkVfbWNpU2V0KCV1LCAlMDhsWCwgJXApO1xuIiwgd0RldklELCBkd0ZsYWdzLCBscFBhcm1zKTsKKwlkcHJpbnRmX21jaXdhdmUoc3RkZGViLAorCQkiV0FWRV9tY2lTZXQoJXUsICUwOGxYLCAlcCk7XG4iLCB3RGV2SUQsIGR3RmxhZ3MsIGxwUGFybXMpOwogCWlmIChscFBhcm1zID09IE5VTEwpIHJldHVybiBNQ0lFUlJfSU5URVJOQUw7CiAJZHByaW50Zl9tY2l3YXZlKHN0ZGRlYiwKIAkJICJXQVZFX21jaVNldCAvLyBkd1RpbWVGb3JtYXQ9JTA4bFhcbiIsIGxwUGFybXMtPmR3VGltZUZvcm1hdCk7CkBAIC01MjEsMjAgKzU2NywxNiBAQAogCWlmIChkd0ZsYWdzICYgTUNJX1NFVF9USU1FX0ZPUk1BVCkgewogCQlzd2l0Y2ggKGxwUGFybXMtPmR3VGltZUZvcm1hdCkgewogCQkJY2FzZSBNQ0lfRk9STUFUX01JTExJU0VDT05EUzoKLQkJICAgICAgICAgICAgICAgIGRwcmludGZfbWNpd2F2ZShzdGRkZWIsCi0JCQkJICJXQVZFX21jaVNldCAvLyBNQ0lfRk9STUFUX01JTExJU0VDT05EUyAhXG4iKTsKKwkJCQlkcHJpbnRmX21jaXdhdmUoc3RkZGViLAkiV0FWRV9tY2lTZXQgLy8gTUNJX0ZPUk1BVF9NSUxMSVNFQ09ORFMgIVxuIik7CiAJCQkJYnJlYWs7CiAJCQljYXNlIE1DSV9GT1JNQVRfQllURVM6Ci0JCQkJZHByaW50Zl9tY2l3YXZlKHN0ZGRlYiwKLQkJCQkgIldBVkVfbWNpU2V0IC8vIE1DSV9GT1JNQVRfQllURVMgIVxuIik7CisJCQkJZHByaW50Zl9tY2l3YXZlKHN0ZGRlYiwgIldBVkVfbWNpU2V0IC8vIE1DSV9GT1JNQVRfQllURVMgIVxuIik7CiAJCQkJYnJlYWs7CiAJCQljYXNlIE1DSV9GT1JNQVRfU0FNUExFUzoKLQkJCQlkcHJpbnRmX21jaXdhdmUoc3RkZGViLAotCQkJCSAiV0FWRV9tY2lTZXQgLy8gTUNJX0ZPUk1BVF9TQU1QTEVTICFcbiIpOworCQkJCWRwcmludGZfbWNpd2F2ZShzdGRkZWIsCSJXQVZFX21jaVNldCAvLyBNQ0lfRk9STUFUX1NBTVBMRVMgIVxuIik7CiAJCQkJYnJlYWs7CiAJCQlkZWZhdWx0OgotCQkJCWZwcmludGYoc3RkZXJyLAotCQkJCSAiV0FWRV9tY2lTZXQgLy8gYmFkIHRpbWUgZm9ybWF0ICFcbiIpOworCQkJCWZwcmludGYoc3RkZXJyLAkiV0FWRV9tY2lTZXQgLy8gYmFkIHRpbWUgZm9ybWF0ICFcbiIpOwogCQkJCXJldHVybiBNQ0lFUlJfQkFEX1RJTUVfRk9STUFUOwogCQkJfQogCQl9CkBAIC01ODgsNyArNjMwLDcgQEAKIERXT1JEIFdBVkVfbWNpU3RhdHVzKFVJTlQgd0RldklELCBEV09SRCBkd0ZsYWdzLCBMUE1DSV9TVEFUVVNfUEFSTVMgbHBQYXJtcykKIHsKICNpZmRlZiBsaW51eAotICAgICAgICBkcHJpbnRmX21jaXdhdmUoc3RkZGViLAorCWRwcmludGZfbWNpd2F2ZShzdGRkZWIsCiAJCSJXQVZFX21jaVN0YXR1cygldSwgJTA4bFgsICVwKTtcbiIsIHdEZXZJRCwgZHdGbGFncywgbHBQYXJtcyk7CiAJaWYgKGxwUGFybXMgPT0gTlVMTCkgcmV0dXJuIE1DSUVSUl9JTlRFUk5BTDsKIAlpZiAoZHdGbGFncyAmIE1DSV9TVEFUVVNfSVRFTSkgewpAQCAtNjczLDcgKzcxNSw3IEBACiAJCQl9CiAJCX0KIAlpZiAoZHdGbGFncyAmIE1DSV9OT1RJRlkpIHsKLSAgCSAgICAgICAgZHByaW50Zl9tY2l3YXZlKHN0ZGRlYiwiV0FWRV9tY2lTdGF0dXMgLy8gTUNJX05PVElGWV9TVUNDRVNTRlVMICUwOGxYICFcbiIsIGxwUGFybXMtPmR3Q2FsbGJhY2spOworCQlkcHJpbnRmX21jaXdhdmUoc3RkZGViLCJXQVZFX21jaVN0YXR1cyAvLyBNQ0lfTk9USUZZX1NVQ0NFU1NGVUwgJTA4bFggIVxuIiwgbHBQYXJtcy0+ZHdDYWxsYmFjayk7CiAJCW1jaURyaXZlck5vdGlmeSgoSFdORClMT1dPUkQobHBQYXJtcy0+ZHdDYWxsYmFjayksIAogCQkJTUNJV2F2RGV2W3dEZXZJRF0ud05vdGlmeURldmljZUlELCBNQ0lfTk9USUZZX1NVQ0NFU1NGVUwpOwogCQl9CkBAIC02OTAsOCArNzMyLDggQEAKIAkJCQkJTFBNQ0lfR0VUREVWQ0FQU19QQVJNUyBscFBhcm1zKQogewogI2lmZGVmIGxpbnV4Ci0gICAgICAgIGRwcmludGZfbWNpd2F2ZShzdGRkZWIsCi0JICAgICJXQVZFX21jaUdldERldkNhcHMoJXUsICUwOGxYLCAlcCk7XG4iLCB3RGV2SUQsIGR3RmxhZ3MsIGxwUGFybXMpOworCWRwcmludGZfbWNpd2F2ZShzdGRkZWIsCisJCSJXQVZFX21jaUdldERldkNhcHMoJXUsICUwOGxYLCAlcCk7XG4iLCB3RGV2SUQsIGR3RmxhZ3MsIGxwUGFybXMpOwogCWlmIChscFBhcm1zID09IE5VTEwpIHJldHVybiBNQ0lFUlJfSU5URVJOQUw7CiAJaWYgKGR3RmxhZ3MgJiBNQ0lfR0VUREVWQ0FQU19JVEVNKSB7CiAJCXN3aXRjaChscFBhcm1zLT5kd0l0ZW0pIHsKQEAgLTc0NCw3ICs3ODYsNyBAQAogRFdPUkQgV0FWRV9tY2lJbmZvKFVJTlQgd0RldklELCBEV09SRCBkd0ZsYWdzLCBMUE1DSV9JTkZPX1BBUk1TIGxwUGFybXMpCiB7CiAjaWZkZWYgbGludXgKLSAgICAgICAgZHByaW50Zl9tY2l3YXZlKHN0ZGRlYiwKKwlkcHJpbnRmX21jaXdhdmUoc3RkZGViLAogCQkiV0FWRV9tY2lJbmZvKCV1LCAlMDhsWCwgJXApO1xuIiwgd0RldklELCBkd0ZsYWdzLCBscFBhcm1zKTsKIAlpZiAobHBQYXJtcyA9PSBOVUxMKSByZXR1cm4gTUNJRVJSX0lOVEVSTkFMOwogCWxwUGFybXMtPmxwc3RyUmV0dXJuID0gTlVMTDsKQEAgLTg1Nyw0OCArODk5LDQ1IEBACiAJaW50CQkJc21wbHJhdGU7CiAJaW50CQkJc2FtcGxlc2l6ZTsKIAlpbnQJCQlkc3Bfc3RlcmVvOwotICAgICAgICBMUFdBVkVGT1JNQVQgbHBGb3JtYXQ7CisJTFBXQVZFRk9STUFUIGxwRm9ybWF0OwogCiAJZHByaW50Zl9tY2l3YXZlKHN0ZGRlYiwKLQkJICAgICAid29kT3BlbigldSwgJXAsICUwOGxYKTtcbiIsIHdEZXZJRCwgbHBEZXNjLCBkd0ZsYWdzKTsKKwkJIndvZE9wZW4oJXUsICVwLCAlMDhsWCk7XG4iLCB3RGV2SUQsIGxwRGVzYywgZHdGbGFncyk7CiAJaWYgKGxwRGVzYyA9PSBOVUxMKSB7Ci0JICAgICAgICBmcHJpbnRmKHN0ZGVyciwiTGludXggJ3dvZE9wZW4nIC8vIEludmFsaWQgUGFyYW1ldGVyICFcbiIpOworCQlmcHJpbnRmKHN0ZGVyciwiTGludXggJ3dvZE9wZW4nIC8vIEludmFsaWQgUGFyYW1ldGVyICFcbiIpOwogCQlyZXR1cm4gTU1TWVNFUlJfSU5WQUxQQVJBTTsKIAkJfQogCWlmICh3RGV2SUQgPj0gTUFYX1dBVk9VVERSVikgewotCSAgICAgICAgZnByaW50ZihzdGRlcnIsIkxpbnV4ICd3b2RPcGVuJyAvLyBNQVhfV0FWT1VURFJWIHJlYWNoZWQgIVxuIik7CisJCWZwcmludGYoc3RkZXJyLCJMaW51eCAnd29kT3BlbicgLy8gTUFYX1dBVk9VVERSViByZWFjaGVkICFcbiIpOwogCQlyZXR1cm4gTU1TWVNFUlJfQUxMT0NBVEVEOwogCQl9CiAJV091dERldlt3RGV2SURdLnVuaXhkZXYgPSAwOwogCWF1ZGlvID0gb3BlbiAoU09VTkRfREVWLCBPX1dST05MWSwgMCk7CiAJaWYgKGF1ZGlvID09IC0xKSB7Ci0gICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsIkxpbnV4ICd3b2RPcGVuJyAvLyBjYW4ndCBvcGVuICFcbiIpOworCQlmcHJpbnRmKHN0ZGVyciwiTGludXggJ3dvZE9wZW4nIC8vIGNhbid0IG9wZW4gIVxuIik7CiAJCXJldHVybiBNTVNZU0VSUl9OT1RFTkFCTEVEOwogCQl9CiAJSU9DVEwoYXVkaW8sIFNORENUTF9EU1BfR0VUQkxLU0laRSwgYWJ1Zl9zaXplKTsKIAlpZiAoYWJ1Zl9zaXplIDwgNDA5NiB8fCBhYnVmX3NpemUgPiA2NTUzNikgewogCQlpZiAoYWJ1Zl9zaXplID09IC0xKQotCQkgIGZwcmludGYoc3RkZXJyLCJMaW51eCAnd29kT3BlbicgLy8gSU9DVEwgY2FuJ3QgJ1NORENUTF9EU1BfR0VUQkxLU0laRScgIVxuIik7CisJCQlmcHJpbnRmKHN0ZGVyciwiTGludXggJ3dvZE9wZW4nIC8vIElPQ1RMIGNhbid0ICdTTkRDVExfRFNQX0dFVEJMS1NJWkUnICFcbiIpOwogCQllbHNlCi0JCSAgZnByaW50ZihzdGRlcnIsIkxpbnV4ICd3b2RPcGVuJyAvLyBTTkRDVExfRFNQX0dFVEJMS1NJWkUgSW52YWxpZCBidWZzaXplICFcbiIpOworCQkJZnByaW50ZihzdGRlcnIsIkxpbnV4ICd3b2RPcGVuJyAvLyBTTkRDVExfRFNQX0dFVEJMS1NJWkUgSW52YWxpZCBidWZzaXplICFcbiIpOwogCQlyZXR1cm4gTU1TWVNFUlJfTk9URU5BQkxFRDsKIAkJfQogCVdPdXREZXZbd0RldklEXS53RmxhZ3MgPSBISVdPUkQoZHdGbGFncyAmIENBTExCQUNLX1RZUEVNQVNLKTsKIAlzd2l0Y2goV091dERldlt3RGV2SURdLndGbGFncykgewogCQljYXNlIERDQl9OVUxMOgotCSAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwiTGludXggJ3dvZE9wZW4nIC8vIENBTExCQUNLX05VTEwgIVxuIik7CisJCQlkcHJpbnRmX21jaXdhdmUoc3RkZGViLAkiTGludXggJ3dvZE9wZW4nIC8vIENBTExCQUNLX05VTEwgIVxuIik7CiAJCQlicmVhazsKIAkJY2FzZSBEQ0JfV0lORE9XOgotCQkJZHByaW50Zl9tY2l3YXZlKHN0ZGRlYiwKLQkJCQkgICAiTGludXggJ3dvZE9wZW4nIC8vIENBTExCQUNLX1dJTkRPVyAhXG4iKTsKKwkJCWRwcmludGZfbWNpd2F2ZShzdGRkZWIsCSJMaW51eCAnd29kT3BlbicgLy8gQ0FMTEJBQ0tfV0lORE9XICFcbiIpOwogCQkJYnJlYWs7CiAJCWNhc2UgRENCX1RBU0s6Ci0JCQlkcHJpbnRmX21jaXdhdmUoc3RkZGViLAotCQkJCSAgICJMaW51eCAnd29kT3BlbicgLy8gQ0FMTEJBQ0tfVEFTSyAhXG4iKTsKKwkJCWRwcmludGZfbWNpd2F2ZShzdGRkZWIsCSJMaW51eCAnd29kT3BlbicgLy8gQ0FMTEJBQ0tfVEFTSyAhXG4iKTsKIAkJCWJyZWFrOwogCQljYXNlIERDQl9GVU5DVElPTjoKLQkJCWRwcmludGZfbWNpd2F2ZShzdGRkZWIsCi0JCQkJICAgIkxpbnV4ICd3b2RPcGVuJyAvLyBDQUxMQkFDS19GVU5DVElPTiAhXG4iKTsKKwkJCWRwcmludGZfbWNpd2F2ZShzdGRkZWIsCSJMaW51eCAnd29kT3BlbicgLy8gQ0FMTEJBQ0tfRlVOQ1RJT04gIVxuIik7CiAJCQlicmVhazsKIAkJfQogCVdPdXREZXZbd0RldklEXS5scFF1ZXVlSGRyID0gTlVMTDsKQEAgLTkwNiwxNSArOTQ1LDIyIEBACiAJV091dERldlt3RGV2SURdLmR3VG90YWxQbGF5ZWQgPSAwOwogCVdPdXREZXZbd0RldklEXS5idWZzaXplID0gYWJ1Zl9zaXplOwogCW1lbWNweSgmV091dERldlt3RGV2SURdLndhdmVEZXNjLCBscERlc2MsIHNpemVvZihXQVZFT1BFTkRFU0MpKTsKLSAgICAgICAgbHBGb3JtYXQgPSAoTFBXQVZFRk9STUFUKVBUUl9TRUdfVE9fTElOKGxwRGVzYy0+bHBGb3JtYXQpOworLyoJbHBGb3JtYXQgPSAoTFBXQVZFRk9STUFUKSBQVFJfU0VHX1RPX0xJTihscERlc2MtPmxwRm9ybWF0KTsgKi8KKwlscEZvcm1hdCA9IGxwRGVzYy0+bHBGb3JtYXQ7CiAJaWYgKGxwRm9ybWF0LT53Rm9ybWF0VGFnICE9IFdBVkVfRk9STUFUX1BDTSkgewotCSAgICAgICAgZnByaW50ZihzdGRlcnIsIkxpbnV4ICd3b2RPcGVuJyAvLyBCYWQgZm9ybWF0ICUwNFggIVxuIiwKLQkJCQkJCWxwRm9ybWF0LT53Rm9ybWF0VGFnKTsKKwkJZnByaW50ZihzdGRlcnIsIkxpbnV4ICd3b2RPcGVuJyAvLyBCYWQgZm9ybWF0ICUwNFggIVxuIiwKKwkJCQlscEZvcm1hdC0+d0Zvcm1hdFRhZyk7CisJCWZwcmludGYoc3RkZXJyLCJMaW51eCAnd29kT3BlbicgLy8gQmFkIG5DaGFubmVscyAlZCAhXG4iLAorCQkJCWxwRm9ybWF0LT5uQ2hhbm5lbHMpOworCQlmcHJpbnRmKHN0ZGVyciwiTGludXggJ3dvZE9wZW4nIC8vIEJhZCBuU2FtcGxlc1BlclNlYyAlbGQgIVxuIiwKKwkJCQlscEZvcm1hdC0+blNhbXBsZXNQZXJTZWMpOwogCQlyZXR1cm4gV0FWRVJSX0JBREZPUk1BVDsKIAkJfQogCW1lbWNweSgmV091dERldlt3RGV2SURdLkZvcm1hdCwgbHBGb3JtYXQsIHNpemVvZihQQ01XQVZFRk9STUFUKSk7CiAJaWYgKFdPdXREZXZbd0RldklEXS5Gb3JtYXQud2YubkNoYW5uZWxzID09IDApIHJldHVybiBXQVZFUlJfQkFERk9STUFUOwogCWlmIChXT3V0RGV2W3dEZXZJRF0uRm9ybWF0LndmLm5TYW1wbGVzUGVyU2VjID09IDApIHJldHVybiBXQVZFUlJfQkFERk9STUFUOworCWRwcmludGZfbWNpd2F2ZShzdGRkZWIsIkxpbnV4ICd3b2RPcGVuJyAvLyB3Qml0c1BlclNhbXBsZT0ldSAhXG4iLAorCQkJCVdPdXREZXZbd0RldklEXS5Gb3JtYXQud0JpdHNQZXJTYW1wbGUpOwogCWlmIChXT3V0RGV2W3dEZXZJRF0uRm9ybWF0LndCaXRzUGVyU2FtcGxlID09IDApIHsKIAkJV091dERldlt3RGV2SURdLkZvcm1hdC53Qml0c1BlclNhbXBsZSA9IDggKgogCQkoV091dERldlt3RGV2SURdLkZvcm1hdC53Zi5uQXZnQnl0ZXNQZXJTZWMgLwpAQCAtOTI5LDEyICs5NzUsMTQgQEAKIAlJT0NUTChhdWRpbywgU05EQ1RMX0RTUF9TVEVSRU8sIGRzcF9zdGVyZW8pOwogCWRwcmludGZfbWNpd2F2ZShzdGRkZWIsIkxpbnV4ICd3b2RPcGVuJyAvLyB3Qml0c1BlclNhbXBsZT0ldSAhXG4iLAogCQkJCVdPdXREZXZbd0RldklEXS5Gb3JtYXQud0JpdHNQZXJTYW1wbGUpOworCWRwcmludGZfbWNpd2F2ZShzdGRkZWIsIkxpbnV4ICd3b2RPcGVuJyAvLyBuQXZnQnl0ZXNQZXJTZWM9JWx1ICFcbiIsCisJCQkJV091dERldlt3RGV2SURdLkZvcm1hdC53Zi5uQXZnQnl0ZXNQZXJTZWMpOwogCWRwcmludGZfbWNpd2F2ZShzdGRkZWIsIkxpbnV4ICd3b2RPcGVuJyAvLyBuU2FtcGxlc1BlclNlYz0lbHUgIVxuIiwKIAkJCQlXT3V0RGV2W3dEZXZJRF0uRm9ybWF0LndmLm5TYW1wbGVzUGVyU2VjKTsKIAlkcHJpbnRmX21jaXdhdmUoc3RkZGViLCJMaW51eCAnd29kT3BlbicgLy8gbkNoYW5uZWxzPSV1ICFcbiIsCiAJCQkJV091dERldlt3RGV2SURdLkZvcm1hdC53Zi5uQ2hhbm5lbHMpOwogCWlmIChXQVZFX05vdGlmeUNsaWVudCh3RGV2SUQsIFdPTV9PUEVOLCAwTCwgMEwpICE9IE1NU1lTRVJSX05PRVJST1IpIHsKLQkgICAgICAgIGZwcmludGYoc3RkZXJyLCJMaW51eCAnd29kT3BlbicgLy8gY2FuJ3Qgbm90aWZ5IGNsaWVudCAhXG4iKTsKKwkJZnByaW50ZihzdGRlcnIsIkxpbnV4ICd3b2RPcGVuJyAvLyBjYW4ndCBub3RpZnkgY2xpZW50ICFcbiIpOwogCQlyZXR1cm4gTU1TWVNFUlJfSU5WQUxQQVJBTTsKIAkJfQogCXJldHVybiBNTVNZU0VSUl9OT0VSUk9SOwpAQCAtOTQ5LDE2ICs5OTcsMTYgQEAKIERXT1JEIHdvZENsb3NlKFdPUkQgd0RldklEKQogewogI2lmZGVmIGxpbnV4Ci0gICAgICAgIGRwcmludGZfbWNpd2F2ZShzdGRkZWIsIndvZENsb3NlKCV1KTtcbiIsIHdEZXZJRCk7CisJZHByaW50Zl9tY2l3YXZlKHN0ZGRlYiwid29kQ2xvc2UoJXUpO1xuIiwgd0RldklEKTsKIAlpZiAoV091dERldlt3RGV2SURdLnVuaXhkZXYgPT0gMCkgewotCSAgICAgICAgZnByaW50ZihzdGRlcnIsIkxpbnV4ICd3b2RDbG9zZScgLy8gY2FuJ3QgY2xvc2UgIVxuIik7CisJCWZwcmludGYoc3RkZXJyLCJMaW51eCAnd29kQ2xvc2UnIC8vIGNhbid0IGNsb3NlICFcbiIpOwogCQlyZXR1cm4gTU1TWVNFUlJfTk9URU5BQkxFRDsKIAkJfQogCWNsb3NlKFdPdXREZXZbd0RldklEXS51bml4ZGV2KTsKIAlXT3V0RGV2W3dEZXZJRF0udW5peGRldiA9IDA7CiAJV091dERldlt3RGV2SURdLmJ1ZnNpemUgPSAwOwogCWlmIChXQVZFX05vdGlmeUNsaWVudCh3RGV2SUQsIFdPTV9DTE9TRSwgMEwsIDBMKSAhPSBNTVNZU0VSUl9OT0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsIkxpbnV4ICd3b2RDbG9zZScgLy8gY2FuJ3Qgbm90aWZ5IGNsaWVudCAhXG4iKTsKKwkJZnByaW50ZihzdGRlcnIsIkxpbnV4ICd3b2RDbG9zZScgLy8gY2FuJ3Qgbm90aWZ5IGNsaWVudCAhXG4iKTsKIAkJcmV0dXJuIE1NU1lTRVJSX0lOVkFMUEFSQU07CiAJCX0KIAlyZXR1cm4gTU1TWVNFUlJfTk9FUlJPUjsKQEAgLTk3Myw3ICsxMDIxLDkgQEAKIERXT1JEIHdvZFdyaXRlKFdPUkQgd0RldklELCBMUFdBVkVIRFIgbHBXYXZlSGRyLCBEV09SRCBkd1NpemUpCiB7CiAjaWZkZWYgbGludXgKLSAgICAgICAgZHByaW50Zl9tY2l3YXZlKHN0ZGRlYiwid29kV3JpdGUoJXUsICVwLCAlMDhsWCk7XG4iLCB3RGV2SUQsIGxwV2F2ZUhkciwgZHdTaXplKTsKKwlpbnQJCWNvdW50OworCUxQU1RSCWxwRGF0YTsKKwlkcHJpbnRmX21jaXdhdmUoc3RkZGViLCJ3b2RXcml0ZSgldSwgJXAsICUwOGxYKTtcbiIsIHdEZXZJRCwgbHBXYXZlSGRyLCBkd1NpemUpOwogCWlmIChXT3V0RGV2W3dEZXZJRF0udW5peGRldiA9PSAwKSB7CiAgICAgICAgIGZwcmludGYoc3RkZXJyLCJMaW51eCAnd29kV3JpdGUnIC8vIGNhbid0IHBsYXkgIVxuIik7CiAJCXJldHVybiBNTVNZU0VSUl9OT1RFTkFCTEVEOwpAQCAtOTgzLDE2ICsxMDMzLDIzIEBACiAJaWYgKGxwV2F2ZUhkci0+ZHdGbGFncyAmIFdIRFJfSU5RVUVVRSkgcmV0dXJuIFdBVkVSUl9TVElMTFBMQVlJTkc7CiAJbHBXYXZlSGRyLT5kd0ZsYWdzICY9IH5XSERSX0RPTkU7CiAJbHBXYXZlSGRyLT5kd0ZsYWdzIHw9IFdIRFJfSU5RVUVVRTsKLSAgICAgICAgZHByaW50Zl9tY2l3YXZlKHN0ZGRlYiwKLQkgICAid29kV3JpdGUoKSAvLyBkd0J5dGVzUmVjb3JkZWQgJWx1ICFcbiIsIGxwV2F2ZUhkci0+ZHdCeXRlc1JlY29yZGVkKTsKLQlpZiAod3JpdGUgKFdPdXREZXZbd0RldklEXS51bml4ZGV2LCBscFdhdmVIZHItPmxwRGF0YSwgCi0JCWxwV2F2ZUhkci0+ZHdCeXRlc1JlY29yZGVkKSAhPSBscFdhdmVIZHItPmR3Qnl0ZXNSZWNvcmRlZCkgeworCWRwcmludGZfbWNpd2F2ZShzdGRkZWIsCisJCSJ3b2RXcml0ZSgpIC8vIGR3QnVmZmVyTGVuZ3RoICVsdSAhXG4iLCBscFdhdmVIZHItPmR3QnVmZmVyTGVuZ3RoKTsKKwlkcHJpbnRmX21jaXdhdmUoc3RkZGViLAorCQkid29kV3JpdGUoKSAvLyBXT3V0RGV2WyV1XS51bml4ZGV2ICV1ICFcbiIsIHdEZXZJRCwgV091dERldlt3RGV2SURdLnVuaXhkZXYpOworCWxwRGF0YSA9IFBUUl9TRUdfVE9fTElOKGxwV2F2ZUhkci0+bHBEYXRhKTsKKwljb3VudCA9IHdyaXRlIChXT3V0RGV2W3dEZXZJRF0udW5peGRldiwgbHBEYXRhLCBscFdhdmVIZHItPmR3QnVmZmVyTGVuZ3RoKTsKKwlkcHJpbnRmX21jaXdhdmUoc3RkZGViLAorCQkid29kV3JpdGUoKSAvLyB3cml0ZSByZXR1cm5lZCBjb3VudCAldSAhXG4iLCBjb3VudCk7CisJaWYgKGNvdW50ICE9IGxwV2F2ZUhkci0+ZHdCdWZmZXJMZW5ndGgpIHsKKwkJZnByaW50ZihzdGRlcnIsIkxpbnV4ICd3b2RXcml0ZScgLy8gZXJyb3Igd3JpdHRpbmcgIVxuIik7CiAJCXJldHVybiBNTVNZU0VSUl9OT1RFTkFCTEVEOwogCQl9CisJV091dERldlt3RGV2SURdLmR3VG90YWxQbGF5ZWQgKz0gY291bnQ7CiAJbHBXYXZlSGRyLT5kd0ZsYWdzICY9IH5XSERSX0lOUVVFVUU7CiAJbHBXYXZlSGRyLT5kd0ZsYWdzIHw9IFdIRFJfRE9ORTsKIAlpZiAoV0FWRV9Ob3RpZnlDbGllbnQod0RldklELCBXT01fRE9ORSwgMEwsIDBMKSAhPSBNTVNZU0VSUl9OT0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsIkxpbnV4ICd3b2RXcml0ZScgLy8gY2FuJ3Qgbm90aWZ5IGNsaWVudCAhXG4iKTsKKwkJZnByaW50ZihzdGRlcnIsIkxpbnV4ICd3b2RXcml0ZScgLy8gY2FuJ3Qgbm90aWZ5IGNsaWVudCAhXG4iKTsKIAkJcmV0dXJuIE1NU1lTRVJSX0lOVkFMUEFSQU07CiAJCX0KIAlyZXR1cm4gTU1TWVNFUlJfTk9FUlJPUjsKQEAgLTEwMDcsMTQgKzEwNjQsMTQgQEAKIERXT1JEIHdvZFByZXBhcmUoV09SRCB3RGV2SUQsIExQV0FWRUhEUiBscFdhdmVIZHIsIERXT1JEIGR3U2l6ZSkKIHsKICNpZmRlZiBsaW51eAotICAgICAgICBkcHJpbnRmX21jaXdhdmUoc3RkZGViLAotCQkgICJ3b2RQcmVwYXJlKCV1LCAlcCwgJTA4bFgpO1xuIiwgd0RldklELCBscFdhdmVIZHIsIGR3U2l6ZSk7CisJZHByaW50Zl9tY2l3YXZlKHN0ZGRlYiwKKwkJIndvZFByZXBhcmUoJXUsICVwLCAlMDhsWCk7XG4iLCB3RGV2SUQsIGxwV2F2ZUhkciwgZHdTaXplKTsKIAlpZiAoV091dERldlt3RGV2SURdLnVuaXhkZXYgPT0gMCkgewotICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCJMaW51eCAnd29kUHJlcGFyZScgLy8gY2FuJ3QgcHJlcGFyZSAhXG4iKTsKKwkJZnByaW50ZihzdGRlcnIsIkxpbnV4ICd3b2RQcmVwYXJlJyAvLyBjYW4ndCBwcmVwYXJlICFcbiIpOwogCQlyZXR1cm4gTU1TWVNFUlJfTk9URU5BQkxFRDsKIAkJfQogCWlmIChXT3V0RGV2W3dEZXZJRF0ubHBRdWV1ZUhkciAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsIkxpbnV4ICd3b2RQcmVwYXJlJyAvLyBhbHJlYWR5IHByZXBhcmUgIVxuIik7CisJCWZwcmludGYoc3RkZXJyLCJMaW51eCAnd29kUHJlcGFyZScgLy8gYWxyZWFkeSBwcmVwYXJlICFcbiIpOwogCQlyZXR1cm4gTU1TWVNFUlJfTk9URU5BQkxFRDsKIAkJfQogCVdPdXREZXZbd0RldklEXS5kd1RvdGFsUGxheWVkID0gMDsKQEAgLTEwMzQsMTAgKzEwOTEsMTAgQEAKIERXT1JEIHdvZFVucHJlcGFyZShXT1JEIHdEZXZJRCwgTFBXQVZFSERSIGxwV2F2ZUhkciwgRFdPUkQgZHdTaXplKQogewogI2lmZGVmIGxpbnV4Ci0gICAgICAgIGRwcmludGZfbWNpd2F2ZShzdGRkZWIsCisJZHByaW50Zl9tY2l3YXZlKHN0ZGRlYiwKIAkJIndvZFVucHJlcGFyZSgldSwgJXAsICUwOGxYKTtcbiIsIHdEZXZJRCwgbHBXYXZlSGRyLCBkd1NpemUpOwogCWlmIChXT3V0RGV2W3dEZXZJRF0udW5peGRldiA9PSAwKSB7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCJMaW51eCAnd29kVW5wcmVwYXJlJyAvLyBjYW4ndCB1bnByZXBhcmUgIVxuIik7CisJCWZwcmludGYoc3RkZXJyLCJMaW51eCAnd29kVW5wcmVwYXJlJyAvLyBjYW4ndCB1bnByZXBhcmUgIVxuIik7CiAJCXJldHVybiBNTVNZU0VSUl9OT1RFTkFCTEVEOwogCQl9CiAJcmV0dXJuIE1NU1lTRVJSX05PRVJST1I7CkBAIC0xMDUyLDkgKzExMDksOSBAQAogRFdPUkQgd29kUmVzdGFydChXT1JEIHdEZXZJRCkKIHsKICNpZmRlZiBsaW51eAotICAgICAgICBkcHJpbnRmX21jaXdhdmUoc3RkZGViLCJ3b2RSZXN0YXJ0KCV1KTtcbiIsIHdEZXZJRCk7CisJZHByaW50Zl9tY2l3YXZlKHN0ZGRlYiwid29kUmVzdGFydCgldSk7XG4iLCB3RGV2SUQpOwogCWlmIChXT3V0RGV2W3dEZXZJRF0udW5peGRldiA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsIkxpbnV4ICd3b2RSZXN0YXJ0JyAvLyBjYW4ndCByZXN0YXJ0ICFcbiIpOworCQlmcHJpbnRmKHN0ZGVyciwiTGludXggJ3dvZFJlc3RhcnQnIC8vIGNhbid0IHJlc3RhcnQgIVxuIik7CiAJCXJldHVybiBNTVNZU0VSUl9OT1RFTkFCTEVEOwogCQl9CiAJcmV0dXJuIE1NU1lTRVJSX05PRVJST1I7CkBAIC0xMDcxLDcgKzExMjgsNyBAQAogI2lmZGVmIGxpbnV4CiAgICAgZHByaW50Zl9tY2l3YXZlKHN0ZGRlYiwid29kUmVzZXQoJXUpO1xuIiwgd0RldklEKTsKIAlpZiAoV091dERldlt3RGV2SURdLnVuaXhkZXYgPT0gMCkgewotICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCJMaW51eCAnd29kUmVzZXQnIC8vIGNhbid0IHJlc2V0ICFcbiIpOworCQlmcHJpbnRmKHN0ZGVyciwiTGludXggJ3dvZFJlc2V0JyAvLyBjYW4ndCByZXNldCAhXG4iKTsKIAkJcmV0dXJuIE1NU1lTRVJSX05PVEVOQUJMRUQ7CiAJCX0KIAlyZXR1cm4gTU1TWVNFUlJfTk9FUlJPUjsKQEAgLTEwOTAsNyArMTE0Nyw3IEBACiAJaW50CQl0aW1lOwogCWRwcmludGZfbWNpd2F2ZShzdGRkZWIsIndvZEdldFBvc2l0aW9uKCV1LCAlcCwgJWx1KTtcbiIsIHdEZXZJRCwgbHBUaW1lLCB1U2l6ZSk7CiAJaWYgKFdPdXREZXZbd0RldklEXS51bml4ZGV2ID09IDApIHsKLSAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwiTGludXggJ3dvZEdldFBvc2l0aW9uJyAvLyBjYW4ndCBnZXQgcG9zICFcbiIpOworCQlmcHJpbnRmKHN0ZGVyciwiTGludXggJ3dvZEdldFBvc2l0aW9uJyAvLyBjYW4ndCBnZXQgcG9zICFcbiIpOwogCQlyZXR1cm4gTU1TWVNFUlJfTk9URU5BQkxFRDsKIAkJfQogCWlmIChscFRpbWUgPT0gTlVMTCkJcmV0dXJuIE1NU1lTRVJSX0lOVkFMUEFSQU07CkBAIC0xMTAxLDYgKzExNTgsMTAgQEAKIAkJCWRwcmludGZfbWNpd2F2ZShzdGRkZWIsIndvZEdldFBvc2l0aW9uIC8vIFRJTUVfQllURVM9JWx1XG4iLCBscFRpbWUtPnUuY2IpOwogCQkJYnJlYWs7CiAJCWNhc2UgVElNRV9TQU1QTEVTOgorCQkJZHByaW50Zl9tY2l3YXZlKHN0ZGRlYiwid29kR2V0UG9zaXRpb24gLy8gZHdUb3RhbFBsYXllZD0lbHVcbiIsIAorCQkJCQlXT3V0RGV2W3dEZXZJRF0uZHdUb3RhbFBsYXllZCk7CisJCQlkcHJpbnRmX21jaXdhdmUoc3RkZGViLCJ3b2RHZXRQb3NpdGlvbiAvLyB3Qml0c1BlclNhbXBsZT0ldVxuIiwgCisJCQkJCVdPdXREZXZbd0RldklEXS5Gb3JtYXQud0JpdHNQZXJTYW1wbGUpOwogCQkJbHBUaW1lLT51LnNhbXBsZSA9IFdPdXREZXZbd0RldklEXS5kd1RvdGFsUGxheWVkICogOCAvCiAJCQkJCQlXT3V0RGV2W3dEZXZJRF0uRm9ybWF0LndCaXRzUGVyU2FtcGxlOwogCQkJZHByaW50Zl9tY2l3YXZlKHN0ZGRlYiwid29kR2V0UG9zaXRpb24gLy8gVElNRV9TQU1QTEVTPSVsdVxuIiwgbHBUaW1lLT51LnNhbXBsZSk7CkBAIC0xMTQ0LDEzICsxMjA1LDkgQEAKIHsKICNpZmRlZiBsaW51eAogCWludCAJbWl4ZXI7Ci0JaW50CQl2b2x1bWU7CisJaW50CQl2b2x1bWUsIGxlZnQsIHJpZ2h0OwogCWRwcmludGZfbWNpd2F2ZShzdGRkZWIsIndvZEdldFZvbHVtZSgldSwgJXApO1xuIiwgd0RldklELCBscGR3Vm9sKTsKIAlpZiAobHBkd1ZvbCA9PSBOVUxMKSByZXR1cm4gTU1TWVNFUlJfTk9URU5BQkxFRDsKLQlpZiAoV091dERldlt3RGV2SURdLnVuaXhkZXYgPT0gMCkgewotCQlmcHJpbnRmKHN0ZGVyciwiTGludXggJ3dvZEdldFZvbHVtZScgLy8gY2FuJ3QgcmVhZCB2b2x1bWUgIVxuIik7Ci0JCXJldHVybiBNTVNZU0VSUl9OT1RFTkFCTEVEOwotCQl9CiAJaWYgKChtaXhlciA9IG9wZW4oIi9kZXYvbWl4ZXIiLCBPX1JET05MWSkpIDwgMCkgewogCQlmcHJpbnRmKHN0ZGVyciwgIkxpbnV4ICd3b2RHZXRWb2x1bWUnIC8vIG1peGVyIGRldmljZSBub3QgYXZhaWxhYmxlICFcbiIpOwogCQlyZXR1cm4gTU1TWVNFUlJfTk9URU5BQkxFRDsKQEAgLTExNjAsNyArMTIxNywxMCBAQAogCQlyZXR1cm4gTU1TWVNFUlJfTk9URU5BQkxFRDsKIAkJfQogCWNsb3NlKG1peGVyKTsKLQkqbHBkd1ZvbCA9IE1BS0VMT05HKHZvbHVtZSwgdm9sdW1lKTsKKwlsZWZ0ID0gdm9sdW1lICYgMHg3RjsKKwlyaWdodCA9ICh2b2x1bWUgPj4gOCkgJiAweDdGOworCXByaW50ZigiTGludXggJ0FVWF9HZXRWb2x1bWUnIC8vIGxlZnQ9JWQgcmlnaHQ9JWQgIVxuIiwgbGVmdCwgcmlnaHQpOworCSpscGR3Vm9sID0gTUFLRUxPTkcobGVmdCA8PCA5LCByaWdodCA8PCA5KTsKIAlyZXR1cm4gTU1TWVNFUlJfTk9FUlJPUjsKICNlbHNlCiAJcmV0dXJuIE1NU1lTRVJSX05PVEVOQUJMRUQ7CkBAIC0xMTc3LDExICsxMjM3LDggQEAKIAlpbnQgCW1peGVyOwogCWludAkJdm9sdW1lOwogCWRwcmludGZfbWNpd2F2ZShzdGRkZWIsIndvZFNldFZvbHVtZSgldSwgJTA4bFgpO1xuIiwgd0RldklELCBkd1BhcmFtKTsKLQl2b2x1bWUgPSBMT1dPUkQoZHdQYXJhbSk7Ci0JaWYgKFdPdXREZXZbd0RldklEXS51bml4ZGV2ID09IDApIHsKLQkJZnByaW50ZihzdGRlcnIsIkxpbnV4ICd3b2RTZXRWb2x1bWUnIC8vIGNhbid0IHNldCB2b2x1bWUgIVxuIik7Ci0JCXJldHVybiBNTVNZU0VSUl9OT1RFTkFCTEVEOwotCQl9CisJdm9sdW1lID0gKExPV09SRChkd1BhcmFtKSA+PiA5ICYgMHg3RikgKyAKKwkJKChISVdPUkQoZHdQYXJhbSkgPj4gOSAgJiAweDdGKSA8PCA4KTsKIAlpZiAoKG1peGVyID0gb3BlbigiL2Rldi9taXhlciIsIE9fV1JPTkxZKSkgPCAwKSB7CiAJCWZwcmludGYoc3RkZXJyLAkiTGludXggJ3dvZFNldFZvbHVtZScgLy8gbWl4ZXIgZGV2aWNlIG5vdCBhdmFpbGFibGUgIVxuIik7CiAJCXJldHVybiBNTVNZU0VSUl9OT1RFTkFCTEVEOwpAQCAtMTIwNCw3ICsxMjYxLDcgQEAKIERXT1JEIHdvZE1lc3NhZ2UoV09SRCB3RGV2SUQsIFdPUkQgd01zZywgRFdPUkQgZHdVc2VyLCAKIAkJCQkJRFdPUkQgZHdQYXJhbTEsIERXT1JEIGR3UGFyYW0yKQogewotICAgICAgICBkcHJpbnRmX21jaXdhdmUoc3RkZGViLCJ3b2RNZXNzYWdlKCV1LCAlMDRYLCAlMDhsWCwgJTA4bFgsICUwOGxYKTtcbiIsCisJZHByaW50Zl9tY2l3YXZlKHN0ZGRlYiwid29kTWVzc2FnZSgldSwgJTA0WCwgJTA4bFgsICUwOGxYLCAlMDhsWCk7XG4iLAogCQkJd0RldklELCB3TXNnLCBkd1VzZXIsIGR3UGFyYW0xLCBkd1BhcmFtMik7CiAJc3dpdGNoKHdNc2cpIHsKIAkJY2FzZSBXT0RNX09QRU46CkBAIC0xMjQzLDYgKzEzMDAsOCBAQAogCQkJcmV0dXJuIHdvZFJlc3RhcnQod0RldklEKTsKIAkJY2FzZSBXT0RNX1JFU0VUOgogCQkJcmV0dXJuIHdvZFJlc2V0KHdEZXZJRCk7CisJCWRlZmF1bHQ6CisJCQlmcHJpbnRmKHN0ZGVyciwid29kTWVzc2FnZSAvLyB1bmtub3duIG1lc3NhZ2UgIVxuIik7CiAJCX0KIAlyZXR1cm4gTU1TWVNFUlJfTk9UU1VQUE9SVEVEOwogfQpAQCAtMTI2Miw3ICsxMzIxLDcgQEAKIAlpbnQJCWRzcF9zdGVyZW8gPSAxOwogCWludAkJYnl0ZXNwZXJzbXBsOwogCWRwcmludGZfbWNpd2F2ZShzdGRkZWIsCi0JCSAgIndpZEdldERldkNhcHMoJXUsICVwLCAlbHUpO1xuIiwgd0RldklELCBscENhcHMsIGR3U2l6ZSk7CisJCSJ3aWRHZXREZXZDYXBzKCV1LCAlcCwgJWx1KTtcbiIsIHdEZXZJRCwgbHBDYXBzLCBkd1NpemUpOwogCWlmIChscENhcHMgPT0gTlVMTCkgcmV0dXJuIE1NU1lTRVJSX05PVEVOQUJMRUQ7CiAJYXVkaW8gPSBvcGVuIChTT1VORF9ERVYsIE9fUkRPTkxZLCAwKTsKIAlpZiAoYXVkaW8gPT0gLTEpIHJldHVybiBNTVNZU0VSUl9OT1RFTkFCTEVEOwpAQCAtMTMwNyw3ICsxMzY2LDcgQEAKIAkJfQogCWNsb3NlKGF1ZGlvKTsKIAlkcHJpbnRmX21jaXdhdmUoc3RkZGViLAotCQkgIndpZEdldERldkNhcHMgLy8gZHdGb3JtYXRzID0gJTA4bFhcbiIsIGxwQ2Fwcy0+ZHdGb3JtYXRzKTsKKwkJIndpZEdldERldkNhcHMgLy8gZHdGb3JtYXRzID0gJTA4bFhcbiIsIGxwQ2Fwcy0+ZHdGb3JtYXRzKTsKIAlyZXR1cm4gTU1TWVNFUlJfTk9FUlJPUjsKICNlbHNlCiAJcmV0dXJuIE1NU1lTRVJSX05PVEVOQUJMRUQ7CkBAIC0xMzI2LDQ4ICsxMzg1LDQzIEBACiAJaW50CQkJc21wbHJhdGU7CiAJaW50CQkJc2FtcGxlc2l6ZTsKIAlpbnQJCQlkc3Bfc3RlcmVvOwotICAgICAgICBMUFdBVkVGT1JNQVQgIGxwRm9ybWF0OwotCWRwcmludGZfbWNpd2F2ZShzdGRkZWIsCi0JCSAid2lkT3BlbigldSwgJXAsICUwOGxYKTtcbiIsIHdEZXZJRCwgbHBEZXNjLCBkd0ZsYWdzKTsKKwlMUFdBVkVGT1JNQVQgIGxwRm9ybWF0OworCWRwcmludGZfbWNpd2F2ZShzdGRkZWIsICJ3aWRPcGVuKCV1LCAlcCwgJTA4bFgpO1xuIiwgd0RldklELCBscERlc2MsIGR3RmxhZ3MpOwogCWlmIChscERlc2MgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCJMaW51eCAnd2lkT3BlbicgLy8gSW52YWxpZCBQYXJhbWV0ZXIgIVxuIik7CisJCWZwcmludGYoc3RkZXJyLCJMaW51eCAnd2lkT3BlbicgLy8gSW52YWxpZCBQYXJhbWV0ZXIgIVxuIik7CiAJCXJldHVybiBNTVNZU0VSUl9JTlZBTFBBUkFNOwogCQl9CiAJaWYgKHdEZXZJRCA+PSBNQVhfV0FWSU5EUlYpIHsKLSAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwiTGludXggJ3dpZE9wZW4nIC8vIE1BWF9XQVZJTkRSViByZWFjaGVkICFcbiIpOworCQlmcHJpbnRmKHN0ZGVyciwiTGludXggJ3dpZE9wZW4nIC8vIE1BWF9XQVZJTkRSViByZWFjaGVkICFcbiIpOwogCQlyZXR1cm4gTU1TWVNFUlJfQUxMT0NBVEVEOwogCQl9CiAJV0luRGV2W3dEZXZJRF0udW5peGRldiA9IDA7CiAJYXVkaW8gPSBvcGVuIChTT1VORF9ERVYsIE9fUkRPTkxZLCAwKTsKIAlpZiAoYXVkaW8gPT0gLTEpIHsKLSAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwiTGludXggJ3dpZE9wZW4nIC8vIGNhbid0IG9wZW4gIVxuIik7CisJCWZwcmludGYoc3RkZXJyLCJMaW51eCAnd2lkT3BlbicgLy8gY2FuJ3Qgb3BlbiAhXG4iKTsKIAkJcmV0dXJuIE1NU1lTRVJSX05PVEVOQUJMRUQ7CiAJCX0KIAlJT0NUTChhdWRpbywgU05EQ1RMX0RTUF9HRVRCTEtTSVpFLCBhYnVmX3NpemUpOwogCWlmIChhYnVmX3NpemUgPCA0MDk2IHx8IGFidWZfc2l6ZSA+IDY1NTM2KSB7CiAJCWlmIChhYnVmX3NpemUgPT0gLTEpCi0JCSAgZnByaW50ZihzdGRlcnIsIkxpbnV4ICd3aWRPcGVuJyAvLyBJT0NUTCBjYW4ndCAnU05EQ1RMX0RTUF9HRVRCTEtTSVpFJyAhXG4iKTsKKwkJCWZwcmludGYoc3RkZXJyLCJMaW51eCAnd2lkT3BlbicgLy8gSU9DVEwgY2FuJ3QgJ1NORENUTF9EU1BfR0VUQkxLU0laRScgIVxuIik7CiAJCWVsc2UKLQkJICBmcHJpbnRmKHN0ZGVyciwiTGludXggJ3dpZE9wZW4nIC8vIFNORENUTF9EU1BfR0VUQkxLU0laRSBJbnZhbGlkIGJ1ZnNpemUgIVxuIik7CisJCQlmcHJpbnRmKHN0ZGVyciwiTGludXggJ3dpZE9wZW4nIC8vIFNORENUTF9EU1BfR0VUQkxLU0laRSBJbnZhbGlkIGJ1ZnNpemUgIVxuIik7CiAJCXJldHVybiBNTVNZU0VSUl9OT1RFTkFCTEVEOwogCQl9CiAJV0luRGV2W3dEZXZJRF0ud0ZsYWdzID0gSElXT1JEKGR3RmxhZ3MgJiBDQUxMQkFDS19UWVBFTUFTSyk7CiAJc3dpdGNoKFdJbkRldlt3RGV2SURdLndGbGFncykgewogCQljYXNlIERDQl9OVUxMOgotCSAgICAgICAgICAgICAgICBkcHJpbnRmX21jaXdhdmUoc3RkZGViLAotCQkJICAgICAgIkxpbnV4ICd3aWRPcGVuJyAvLyBDQUxMQkFDS19OVUxMICFcbiIpOworCQkJZHByaW50Zl9tY2l3YXZlKHN0ZGRlYiwJIkxpbnV4ICd3aWRPcGVuJyAvLyBDQUxMQkFDS19OVUxMICFcbiIpOwogCQkJYnJlYWs7CiAJCWNhc2UgRENCX1dJTkRPVzoKLQkJCWRwcmludGZfbWNpd2F2ZShzdGRkZWIsCi0JCQkgICAgICAiTGludXggJ3dpZE9wZW4nIC8vIENBTExCQUNLX1dJTkRPVyAhXG4iKTsKKwkJCWRwcmludGZfbWNpd2F2ZShzdGRkZWIsICJMaW51eCAnd2lkT3BlbicgLy8gQ0FMTEJBQ0tfV0lORE9XICFcbiIpOwogCQkJYnJlYWs7CiAJCWNhc2UgRENCX1RBU0s6Ci0JCQlkcHJpbnRmX21jaXdhdmUoc3RkZGViLAotCQkJICAgICAgIkxpbnV4ICd3aWRPcGVuJyAvLyBDQUxMQkFDS19UQVNLICFcbiIpOworCQkJZHByaW50Zl9tY2l3YXZlKHN0ZGRlYiwJIkxpbnV4ICd3aWRPcGVuJyAvLyBDQUxMQkFDS19UQVNLICFcbiIpOwogCQkJYnJlYWs7CiAJCWNhc2UgRENCX0ZVTkNUSU9OOgotCQkJZHByaW50Zl9tY2l3YXZlKHN0ZGRlYiwKLQkJCSAgICAgICJMaW51eCAnd2lkT3BlbicgLy8gQ0FMTEJBQ0tfRlVOQ1RJT04gIVxuIik7CisJCQlkcHJpbnRmX21jaXdhdmUoc3RkZGViLAkiTGludXggJ3dpZE9wZW4nIC8vIENBTExCQUNLX0ZVTkNUSU9OICFcbiIpOwogCQkJYnJlYWs7CiAJCX0KIAlXSW5EZXZbd0RldklEXS5scFF1ZXVlSGRyID0gTlVMTDsKQEAgLTEzNzUsMTAgKzE0MjksMTAgQEAKIAlXSW5EZXZbd0RldklEXS5idWZzaXplID0gYWJ1Zl9zaXplOwogCVdJbkRldlt3RGV2SURdLmR3VG90YWxSZWNvcmRlZCA9IDA7CiAJbWVtY3B5KCZXSW5EZXZbd0RldklEXS53YXZlRGVzYywgbHBEZXNjLCBzaXplb2YoV0FWRU9QRU5ERVNDKSk7Ci0gICAgICAgIGxwRm9ybWF0ID0gKExQV0FWRUZPUk1BVClQVFJfU0VHX1RPX0xJTihscERlc2MtPmxwRm9ybWF0KTsKKyAgICAgICAgbHBGb3JtYXQgPSBscERlc2MtPmxwRm9ybWF0OwogCWlmIChscEZvcm1hdC0+d0Zvcm1hdFRhZyAhPSBXQVZFX0ZPUk1BVF9QQ00pIHsKLQkgICAgICAgIGZwcmludGYoc3RkZXJyLCJMaW51eCAnd2lkT3BlbicgLy8gQmFkIGZvcm1hdCAlMDRYICFcbiIsCi0JCQkJCQlscEZvcm1hdC0+d0Zvcm1hdFRhZyk7CisJCWZwcmludGYoc3RkZXJyLCJMaW51eCAnd2lkT3BlbicgLy8gQmFkIGZvcm1hdCAlMDRYICFcbiIsCisJCQkJCWxwRm9ybWF0LT53Rm9ybWF0VGFnKTsKIAkJcmV0dXJuIFdBVkVSUl9CQURGT1JNQVQ7CiAJCX0KIAltZW1jcHkoJldJbkRldlt3RGV2SURdLkZvcm1hdCwgbHBGb3JtYXQsIHNpemVvZihQQ01XQVZFRk9STUFUKSk7CkBAIC0xNDA2LDcgKzE0NjAsNyBAQAogCWRwcmludGZfbWNpd2F2ZShzdGRkZWIsIkxpbnV4ICd3aWRPcGVuJyAvLyBuQXZnQnl0ZXNQZXJTZWM9JWx1XG4iLAogCQkJV0luRGV2W3dEZXZJRF0uRm9ybWF0LndmLm5BdmdCeXRlc1BlclNlYyk7IAogCWlmIChXQVZFX05vdGlmeUNsaWVudCh3RGV2SUQsIFdJTV9PUEVOLCAwTCwgMEwpICE9IE1NU1lTRVJSX05PRVJST1IpIHsKLQkgICAgICAgIGZwcmludGYoc3RkZXJyLCJMaW51eCAnd2lkT3BlbicgLy8gY2FuJ3Qgbm90aWZ5IGNsaWVudCAhXG4iKTsKKwkJZnByaW50ZihzdGRlcnIsIkxpbnV4ICd3aWRPcGVuJyAvLyBjYW4ndCBub3RpZnkgY2xpZW50ICFcbiIpOwogCQlyZXR1cm4gTU1TWVNFUlJfSU5WQUxQQVJBTTsKIAkJfQogCXJldHVybiBNTVNZU0VSUl9OT0VSUk9SOwpAQCAtMTQyMSwxNiArMTQ3NSwxNiBAQAogRFdPUkQgd2lkQ2xvc2UoV09SRCB3RGV2SUQpCiB7CiAjaWZkZWYgbGludXgKLSAgICAgICAgZHByaW50Zl9tY2l3YXZlKHN0ZGRlYiwid2lkQ2xvc2UoJXUpO1xuIiwgd0RldklEKTsKKwlkcHJpbnRmX21jaXdhdmUoc3RkZGViLCJ3aWRDbG9zZSgldSk7XG4iLCB3RGV2SUQpOwogCWlmIChXSW5EZXZbd0RldklEXS51bml4ZGV2ID09IDApIHsKLSAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwiTGludXggJ3dpZENsb3NlJyAvLyBjYW4ndCBjbG9zZSAhXG4iKTsKKwkJZnByaW50ZihzdGRlcnIsIkxpbnV4ICd3aWRDbG9zZScgLy8gY2FuJ3QgY2xvc2UgIVxuIik7CiAJCXJldHVybiBNTVNZU0VSUl9OT1RFTkFCTEVEOwogCQl9CiAJY2xvc2UoV0luRGV2W3dEZXZJRF0udW5peGRldik7CiAJV0luRGV2W3dEZXZJRF0udW5peGRldiA9IDA7CiAJV0luRGV2W3dEZXZJRF0uYnVmc2l6ZSA9IDA7CiAJaWYgKFdBVkVfTm90aWZ5Q2xpZW50KHdEZXZJRCwgV0lNX0NMT1NFLCAwTCwgMEwpICE9IE1NU1lTRVJSX05PRVJST1IpIHsKLSAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwiTGludXggJ3dpZENsb3NlJyAvLyBjYW4ndCBub3RpZnkgY2xpZW50ICFcbiIpOworCQlmcHJpbnRmKHN0ZGVyciwiTGludXggJ3dpZENsb3NlJyAvLyBjYW4ndCBub3RpZnkgY2xpZW50ICFcbiIpOwogCQlyZXR1cm4gTU1TWVNFUlJfSU5WQUxQQVJBTTsKIAkJfQogCXJldHVybiBNTVNZU0VSUl9OT0VSUk9SOwpAQCAtMTQ0OCwzMCArMTUwMiwzMCBAQAogCWludAkJCWNvdW50CT0gMTsKIAlMUFdBVkVIRFIgCWxwV0lIZHI7CiAJZHByaW50Zl9tY2l3YXZlKHN0ZGRlYiwKLQkgICAgICAgIndpZEFkZEJ1ZmZlcigldSwgJXAsICUwOGxYKTtcbiIsIHdEZXZJRCwgbHBXYXZlSGRyLCBkd1NpemUpOworCQkid2lkQWRkQnVmZmVyKCV1LCAlcCwgJTA4bFgpO1xuIiwgd0RldklELCBscFdhdmVIZHIsIGR3U2l6ZSk7CiAJaWYgKFdJbkRldlt3RGV2SURdLnVuaXhkZXYgPT0gMCkgewotCSAgICAgICAgZnByaW50ZihzdGRlcnIsIkxpbnV4ICd3aWRBZGRCdWZmZXInIC8vIGNhbid0IGRvIGl0ICFcbiIpOworCQlmcHJpbnRmKHN0ZGVyciwiTGludXggJ3dpZEFkZEJ1ZmZlcicgLy8gY2FuJ3QgZG8gaXQgIVxuIik7CiAJCXJldHVybiBNTVNZU0VSUl9OT1RFTkFCTEVEOwogCQl9Ci0JaWYgKFdJbkRldlt3RGV2SURdLmxwUXVldWVIZHIgPT0gTlVMTCB8fCAKLQkJIShscFdhdmVIZHItPmR3RmxhZ3MgJiBXSERSX1BSRVBBUkVEKSkgewotCSAgICAgICAgZnByaW50ZihzdGRlcnIsCi0JCSAgICAgICAiTGludXggJ3dpZEFkZEJ1ZmZlcicgLy8gbmV2ZXIgYmVlbiBwcmVwYXJlZCAhXG4iKTsKKwlpZiAoIShscFdhdmVIZHItPmR3RmxhZ3MgJiBXSERSX1BSRVBBUkVEKSkgeworCQlmcHJpbnRmKHN0ZGVyciwJIkxpbnV4ICd3aWRBZGRCdWZmZXInIC8vIG5ldmVyIGJlZW4gcHJlcGFyZWQgIVxuIik7CiAJCXJldHVybiBXQVZFUlJfVU5QUkVQQVJFRDsKIAkJfQotCWlmICgobHBXYXZlSGRyLT5kd0ZsYWdzICYgV0hEUl9JTlFVRVVFKSAmJgotCQkoV0luRGV2W3dEZXZJRF0ubHBRdWV1ZUhkciAhPSBscFdhdmVIZHIpKSB7Ci0JCS8qIGV4Y2VwdCBpZiBpdCdzIHRoZSBvbmUganVzdCBwcmVwYXJlZCAuLi4gKi8KLQkgICAgICAgIGZwcmludGYoc3RkZXJyLAotCQkJIkxpbnV4ICd3aWRBZGRCdWZmZXInIC8vIGhlYWRlciBhbHJlYWR5IGluIHVzZSAhXG4iKTsKKwlpZiAobHBXYXZlSGRyLT5kd0ZsYWdzICYgV0hEUl9JTlFVRVVFKSB7CisJCWZwcmludGYoc3RkZXJyLAkiTGludXggJ3dpZEFkZEJ1ZmZlcicgLy8gaGVhZGVyIGFscmVhZHkgaW4gdXNlICFcbiIpOwogCQlyZXR1cm4gV0FWRVJSX1NUSUxMUExBWUlORzsKIAkJfQogCWxwV2F2ZUhkci0+ZHdGbGFncyB8PSBXSERSX1BSRVBBUkVEOwogCWxwV2F2ZUhkci0+ZHdGbGFncyB8PSBXSERSX0lOUVVFVUU7CiAJbHBXYXZlSGRyLT5kd0ZsYWdzICY9IH5XSERSX0RPTkU7CiAJbHBXYXZlSGRyLT5kd0J5dGVzUmVjb3JkZWQgPSAwOwotCS8qIGFkZGVkIHRvIHRoZSBxdWV1ZSwgZXhjZXB0IGlmIGl0J3MgdGhlIG9uZSBqdXN0IHByZXBhcmVkIC4uLiAqLwotCWlmIChXSW5EZXZbd0RldklEXS5scFF1ZXVlSGRyICE9IGxwV2F2ZUhkcikgeworCWlmIChXSW5EZXZbd0RldklEXS5scFF1ZXVlSGRyID09IE5VTEwpIHsKKwkJLyogYmVnaW4gdGhlIHF1ZXVlIHdpdGggYSBmaXJzdCBoZWFkZXIgLi4uICovCisJCVdJbkRldlt3RGV2SURdLmxwUXVldWVIZHIgPSBscFdhdmVIZHI7CisJCVdJbkRldlt3RGV2SURdLmR3VG90YWxSZWNvcmRlZCA9IDA7CisJCX0KKwllbHNlIHsKKwkJLyogYWRkZWQgdG8gdGhlIHF1ZXVlLCBleGNlcHQgaWYgaXQncyB0aGUgb25lIGp1c3QgcHJlcGFyZWQgLi4uICovCiAJCWxwV0lIZHIgPSBXSW5EZXZbd0RldklEXS5scFF1ZXVlSGRyOwogCQl3aGlsZSAobHBXSUhkci0+bHBOZXh0ICE9IE5VTEwpIHsKIAkJCWxwV0lIZHIgPSBscFdJSGRyLT5scE5leHQ7CkBAIC0xNDgxLDcgKzE1MzUsNyBAQAogCQljb3VudCsrOwogCQl9CiAJZHByaW50Zl9tY2l3YXZlKHN0ZGRlYiwKLQkgICAgICAid2lkQWRkQnVmZmVyIC8vIGJ1ZmZlciBhZGRlZCAhIChub3cgJXUgaW4gcXVldWUpXG4iLCBjb3VudCk7CisJCSJ3aWRBZGRCdWZmZXIgLy8gYnVmZmVyIGFkZGVkICEgKG5vdyAldSBpbiBxdWV1ZSlcbiIsIGNvdW50KTsKIAlyZXR1cm4gTU1TWVNFUlJfTk9FUlJPUjsKICNlbHNlCiAJcmV0dXJuIE1NU1lTRVJSX05PVEVOQUJMRUQ7CkBAIC0xNDk3LDE4ICsxNTUxLDE2IEBACiAJZHByaW50Zl9tY2l3YXZlKHN0ZGRlYiwKIAkJIndpZFByZXBhcmUoJXUsICVwLCAlMDhsWCk7XG4iLCB3RGV2SUQsIGxwV2F2ZUhkciwgZHdTaXplKTsKIAlpZiAoV0luRGV2W3dEZXZJRF0udW5peGRldiA9PSAwKSB7Ci0JICAgICAgICBmcHJpbnRmKHN0ZGVyciwiTGludXggJ3dpZFByZXBhcmUnIC8vIGNhbid0IHByZXBhcmUgIVxuIik7CisJCWZwcmludGYoc3RkZXJyLCJMaW51eCAnd2lkUHJlcGFyZScgLy8gY2FuJ3QgcHJlcGFyZSAhXG4iKTsKIAkJcmV0dXJuIE1NU1lTRVJSX05PVEVOQUJMRUQ7CiAJCX0KIAlpZiAoV0luRGV2W3dEZXZJRF0ubHBRdWV1ZUhkciAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsIkxpbnV4ICd3aWRQcmVwYXJlJyAvLyBhbHJlYWR5IHByZXBhcmUgIVxuIik7CisJCWZwcmludGYoc3RkZXJyLCJMaW51eCAnd2lkUHJlcGFyZScgLy8gYWxyZWFkeSBwcmVwYXJlICFcbiIpOwogCQlyZXR1cm4gV0FWRVJSX0JBREZPUk1BVDsKIAkJfQotCVdJbkRldlt3RGV2SURdLmR3VG90YWxSZWNvcmRlZCA9IDA7Ci0JV0luRGV2W3dEZXZJRF0ubHBRdWV1ZUhkciA9IGxwV2F2ZUhkcjsKIAlpZiAobHBXYXZlSGRyLT5kd0ZsYWdzICYgV0hEUl9JTlFVRVVFKSByZXR1cm4gV0FWRVJSX1NUSUxMUExBWUlORzsKIAlscFdhdmVIZHItPmR3RmxhZ3MgfD0gV0hEUl9QUkVQQVJFRDsKLQlscFdhdmVIZHItPmR3RmxhZ3MgfD0gV0hEUl9JTlFVRVVFOworCWxwV2F2ZUhkci0+ZHdGbGFncyAmPSB+V0hEUl9JTlFVRVVFOwogCWxwV2F2ZUhkci0+ZHdGbGFncyAmPSB+V0hEUl9ET05FOwogCWxwV2F2ZUhkci0+ZHdCeXRlc1JlY29yZGVkID0gMDsKIAlkcHJpbnRmX21jaXdhdmUoc3RkZGViLCJMaW51eCAnd2lkUHJlcGFyZScgLy8gaGVhZGVyIHByZXBhcmVkICFcbiIpOwpAQCAtMTUyNyw3ICsxNTc5LDcgQEAKIAlkcHJpbnRmX21jaXdhdmUoc3RkZGViLAogCQkid2lkVW5wcmVwYXJlKCV1LCAlcCwgJTA4bFgpO1xuIiwgd0RldklELCBscFdhdmVIZHIsIGR3U2l6ZSk7CiAJaWYgKFdJbkRldlt3RGV2SURdLnVuaXhkZXYgPT0gMCkgewotICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCJMaW51eCAnd2lkVW5wcmVwYXJlJyAvLyBjYW4ndCB1bnByZXBhcmUgIVxuIik7CisJCWZwcmludGYoc3RkZXJyLCJMaW51eCAnd2lkVW5wcmVwYXJlJyAvLyBjYW4ndCB1bnByZXBhcmUgIVxuIik7CiAJCXJldHVybiBNTVNZU0VSUl9OT1RFTkFCTEVEOwogCQl9CiAJbHBXYXZlSGRyLT5kd0ZsYWdzICY9IH5XSERSX1BSRVBBUkVEOwpAQCAtMTUzNSw3ICsxNTg3LDcgQEAKIAlscFdhdmVIZHItPmR3RmxhZ3MgfD0gV0hEUl9ET05FOwogCVdJbkRldlt3RGV2SURdLmxwUXVldWVIZHIgPSBOVUxMOwogCWRwcmludGZfbWNpd2F2ZShzdGRkZWIsCi0JCSAgIkxpbnV4ICd3aWRVbnByZXBhcmUnIC8vIGFsbCBoZWFkZXJzIHVucHJlcGFyZWQgIVxuIik7CisJCSJMaW51eCAnd2lkVW5wcmVwYXJlJyAvLyBhbGwgaGVhZGVycyB1bnByZXBhcmVkICFcbiIpOwogCXJldHVybiBNTVNZU0VSUl9OT0VSUk9SOwogI2Vsc2UKIAlyZXR1cm4gTU1TWVNFUlJfTk9URU5BQkxFRDsKQEAgLTE1NTIsMzIgKzE2MDQsMzEgQEAKIAlMUFdBVkVIRFIgCWxwV0lIZHI7CiAJZHByaW50Zl9tY2l3YXZlKHN0ZGRlYiwid2lkU3RhcnQoJXUpO1xuIiwgd0RldklEKTsKIAlpZiAoV0luRGV2W3dEZXZJRF0udW5peGRldiA9PSAwKSB7Ci0JICAgICAgICBmcHJpbnRmKHN0ZGVyciwKLQkJICAgICAgICJMaW51eCAnd2lkU3RhcnQnIC8vIGNhbid0IHN0YXJ0IHJlY29yZGluZyAhXG4iKTsKKwkJZnByaW50ZihzdGRlcnIsCSJMaW51eCAnd2lkU3RhcnQnIC8vIGNhbid0IHN0YXJ0IHJlY29yZGluZyAhXG4iKTsKIAkJcmV0dXJuIE1NU1lTRVJSX05PVEVOQUJMRUQ7CiAJCX0KIAlpZiAoV0luRGV2W3dEZXZJRF0ubHBRdWV1ZUhkciA9PSBOVUxMIHx8IAogCQlXSW5EZXZbd0RldklEXS5scFF1ZXVlSGRyLT5scERhdGEgPT0gTlVMTCkgewotCSAgICAgICAgZnByaW50ZihzdGRlcnIsIkxpbnV4ICd3aWRTdGFydCcgLy8gbmV2ZXIgYmVlbiBwcmVwYXJlZCAhXG4iKTsKKwkJZnByaW50ZihzdGRlcnIsIkxpbnV4ICd3aWRTdGFydCcgLy8gbmV2ZXIgYmVlbiBwcmVwYXJlZCAhXG4iKTsKIAkJcmV0dXJuIFdBVkVSUl9VTlBSRVBBUkVEOwogCQl9CiAJbHBXSUhkciA9IFdJbkRldlt3RGV2SURdLmxwUXVldWVIZHI7CiAJd2hpbGUobHBXSUhkciAhPSBOVUxMKSB7CiAJCWxwV0lIZHItPmR3QnVmZmVyTGVuZ3RoICY9IDB4RkZGRjsKLSAgICAgICAgICAgICAgICBkcHJpbnRmX21jaXdhdmUoc3RkZGViLAotCQkgICAgICAgICJ3aWRTdGFydCAvLyByZWNvcmRpbmcgYnVmIyV1PSVwIHNpemU9JWx1IFxuIiwKKwkJZHByaW50Zl9tY2l3YXZlKHN0ZGRlYiwKKwkJCSJ3aWRTdGFydCAvLyByZWNvcmRpbmcgYnVmIyV1PSVwIHNpemU9JWx1IFxuIiwKIAkJCWNvdW50LCBscFdJSGRyLT5scERhdGEsIGxwV0lIZHItPmR3QnVmZmVyTGVuZ3RoKTsKIAkJZmZsdXNoKHN0ZGRlYik7Ci0JCXJlYWQgKFdJbkRldlt3RGV2SURdLnVuaXhkZXYsIGxwV0lIZHItPmxwRGF0YSwKLQkJCQkJCSAgICAgIGxwV0lIZHItPmR3QnVmZmVyTGVuZ3RoKTsKKwkJcmVhZCAoV0luRGV2W3dEZXZJRF0udW5peGRldiwgCisJCQlQVFJfU0VHX1RPX0xJTihscFdJSGRyLT5scERhdGEpLAorCQkJbHBXSUhkci0+ZHdCdWZmZXJMZW5ndGgpOwogCQlscFdJSGRyLT5kd0J5dGVzUmVjb3JkZWQgPSBscFdJSGRyLT5kd0J1ZmZlckxlbmd0aDsKIAkJV0luRGV2W3dEZXZJRF0uZHdUb3RhbFJlY29yZGVkICs9IGxwV0lIZHItPmR3Qnl0ZXNSZWNvcmRlZDsKIAkJbHBXSUhkci0+ZHdGbGFncyAmPSB+V0hEUl9JTlFVRVVFOwogCQlscFdJSGRyLT5kd0ZsYWdzIHw9IFdIRFJfRE9ORTsKIAkJaWYgKFdBVkVfTm90aWZ5Q2xpZW50KHdEZXZJRCwgV0lNX0RBVEEsIChEV09SRClscFdJSGRyLCAwTCkgIT0gCiAJCQlNTVNZU0VSUl9OT0VSUk9SKSB7Ci0JCSAgICAgICAgZnByaW50ZihzdGRlcnIsCi0JCQkgICAgICJMaW51eCAnd2lkU3RhcnQnIC8vIGNhbid0IG5vdGlmeSBjbGllbnQgIVxuIik7CisJCQlmcHJpbnRmKHN0ZGVyciwJIkxpbnV4ICd3aWRTdGFydCcgLy8gY2FuJ3Qgbm90aWZ5IGNsaWVudCAhXG4iKTsKIAkJCXJldHVybiBNTVNZU0VSUl9JTlZBTFBBUkFNOwogCQkJfQogCQlscFdJSGRyID0gbHBXSUhkci0+bHBOZXh0OwpAQCAtMTU5Nyw5ICsxNjQ4LDkgQEAKIERXT1JEIHdpZFN0b3AoV09SRCB3RGV2SUQpCiB7CiAjaWZkZWYgbGludXgKLSAgICAgICAgZHByaW50Zl9tY2l3YXZlKHN0ZGRlYiwid2lkU3RvcCgldSk7XG4iLCB3RGV2SUQpOworCWRwcmludGZfbWNpd2F2ZShzdGRkZWIsIndpZFN0b3AoJXUpO1xuIiwgd0RldklEKTsKIAlpZiAoV0luRGV2W3dEZXZJRF0udW5peGRldiA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsIkxpbnV4ICd3aWRTdG9wJyAvLyBjYW4ndCBzdG9wICFcbiIpOworCQlmcHJpbnRmKHN0ZGVyciwiTGludXggJ3dpZFN0b3AnIC8vIGNhbid0IHN0b3AgIVxuIik7CiAJCXJldHVybiBNTVNZU0VSUl9OT1RFTkFCTEVEOwogCQl9CiAJcmV0dXJuIE1NU1lTRVJSX05PRVJST1I7CkBAIC0xNjE0LDkgKzE2NjUsOSBAQAogRFdPUkQgd2lkUmVzZXQoV09SRCB3RGV2SUQpCiB7CiAjaWZkZWYgbGludXgKLSAgICAgICAgZHByaW50Zl9tY2l3YXZlKHN0ZGRlYiwid2lkUmVzZXQoJXUpO1xuIiwgd0RldklEKTsKKwlkcHJpbnRmX21jaXdhdmUoc3RkZGViLCJ3aWRSZXNldCgldSk7XG4iLCB3RGV2SUQpOwogCWlmIChXSW5EZXZbd0RldklEXS51bml4ZGV2ID09IDApIHsKLSAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwiTGludXggJ3dpZFJlc2V0JyAvLyBjYW4ndCByZXNldCAhXG4iKTsKKwkJZnByaW50ZihzdGRlcnIsIkxpbnV4ICd3aWRSZXNldCcgLy8gY2FuJ3QgcmVzZXQgIVxuIik7CiAJCXJldHVybiBNTVNZU0VSUl9OT1RFTkFCTEVEOwogCQl9CiAJcmV0dXJuIE1NU1lTRVJSX05PRVJST1I7CkBAIC0xNjMyLDEwICsxNjgzLDEwIEBACiB7CiAjaWZkZWYgbGludXgKIAlpbnQJCXRpbWU7Ci0gICAgICAgIGRwcmludGZfbWNpd2F2ZShzdGRkZWIsCisJZHByaW50Zl9tY2l3YXZlKHN0ZGRlYiwKIAkJIndpZEdldFBvc2l0aW9uKCV1LCAlcCwgJWx1KTtcbiIsIHdEZXZJRCwgbHBUaW1lLCB1U2l6ZSk7CiAJaWYgKFdJbkRldlt3RGV2SURdLnVuaXhkZXYgPT0gMCkgewotICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCJMaW51eCAnd2lkR2V0UG9zaXRpb24nIC8vIGNhbid0IGdldCBwb3MgIVxuIik7CisJCWZwcmludGYoc3RkZXJyLCJMaW51eCAnd2lkR2V0UG9zaXRpb24nIC8vIGNhbid0IGdldCBwb3MgIVxuIik7CiAJCXJldHVybiBNTVNZU0VSUl9OT1RFTkFCTEVEOwogCQl9CiAJaWYgKGxwVGltZSA9PSBOVUxMKQlyZXR1cm4gTU1TWVNFUlJfSU5WQUxQQVJBTTsKQEAgLTE3MDIsNyArMTc1Myw3IEBACiBEV09SRCB3aWRNZXNzYWdlKFdPUkQgd0RldklELCBXT1JEIHdNc2csIERXT1JEIGR3VXNlciwgCiAJCQkJCURXT1JEIGR3UGFyYW0xLCBEV09SRCBkd1BhcmFtMikKIHsKLSAgICAgICAgZHByaW50Zl9tY2l3YXZlKHN0ZGRlYiwid2lkTWVzc2FnZSgldSwgJTA0WCwgJTA4bFgsICUwOGxYLCAlMDhsWCk7XG4iLAorCWRwcmludGZfbWNpd2F2ZShzdGRkZWIsIndpZE1lc3NhZ2UoJXUsICUwNFgsICUwOGxYLCAlMDhsWCwgJTA4bFgpO1xuIiwKIAkJCXdEZXZJRCwgd01zZywgZHdVc2VyLCBkd1BhcmFtMSwgZHdQYXJhbTIpOwogCXN3aXRjaCh3TXNnKSB7CiAJCWNhc2UgV0lETV9PUEVOOgpAQCAtMTcyNyw2ICsxNzc4LDggQEAKIAkJCXJldHVybiB3aWRTdGFydCh3RGV2SUQpOwogCQljYXNlIFdJRE1fU1RPUDoKIAkJCXJldHVybiB3aWRTdG9wKHdEZXZJRCk7CisJCWRlZmF1bHQ6CisJCQlmcHJpbnRmKHN0ZGVyciwid2lkTWVzc2FnZSAvLyB1bmtub3duIG1lc3NhZ2UgIVxuIik7CiAJCX0KIAlyZXR1cm4gTU1TWVNFUlJfTk9UU1VQUE9SVEVEOwogfQpkaWZmIC0tZ2l0IGEvbXVsdGltZWRpYS9tY2lhbmltLmMgYi9tdWx0aW1lZGlhL21jaWFuaW0uYwppbmRleCA1Yjc2NGU1Li5lYmUxYmJjIDEwMDY0NAotLS0gYS9tdWx0aW1lZGlhL21jaWFuaW0uYworKysgYi9tdWx0aW1lZGlhL21jaWFuaW0uYwpAQCAtNjIsMTMgKzYyLDE0IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogCQkJCUFOSU1fbWNpT3BlbgkJCVtpbnRlcm5hbF0KICovCi1EV09SRCBBTklNX21jaU9wZW4oRFdPUkQgZHdGbGFncywgTFBNQ0lfT1BFTl9QQVJNUyBscFBhcm1zKQorRFdPUkQgQU5JTV9tY2lPcGVuKFVJTlQgd0RldklELCBEV09SRCBkd0ZsYWdzLCBMUE1DSV9PUEVOX1BBUk1TIGxwUGFybXMpCiB7CiAjaWZkZWYgbGludXgKLQlVSU5UCXdEZXZJRDsKLQlkcHJpbnRmX21jaWFuaW0oc3RkZGViLCJBTklNX21jaU9wZW4oJTA4bFgsICVwKTtcbiIsIGR3RmxhZ3MsIGxwUGFybXMpOworCUxQU1RSCQlscHN0ckVsZW1lbnROYW1lOworCWNoYXIJCXN0clsxMjhdOworCWRwcmludGZfbWNpYW5pbShzdGRkZWIsIkFOSU1fbWNpT3BlbiglMDRYLCAlMDhsWCwgJXApO1xuIiwgCisJCQkJCXdEZXZJRCwgZHdGbGFncywgbHBQYXJtcyk7CiAJaWYgKGxwUGFybXMgPT0gTlVMTCkgcmV0dXJuIE1DSUVSUl9JTlRFUk5BTDsKLQl3RGV2SUQgPSBscFBhcm1zLT53RGV2aWNlSUQ7CiAJaWYgKEFuaW1EZXZbd0RldklEXS5uVXNlQ291bnQgPiAwKSB7CiAJCS8qIFRoZSBkcml2ZXIgYWxyZWFkeSBvcGVuIG9uIHRoaXMgY2hhbm5lbCAqLwogCQkvKiBJZiB0aGUgZHJpdmVyIHdhcyBvcGVuZWQgc2hhcmVhYmxlIGJlZm9yZSBhbmQgdGhpcyBvcGVuIHNwZWNpZmllcyAqLwpAQCAtODIsMTAgKzgzLDE3IEBACiAJCUFuaW1EZXZbd0RldklEXS5uVXNlQ291bnQgPSAxOwogCQlBbmltRGV2W3dEZXZJRF0uZlNoYXJlYWJsZSA9IGR3RmxhZ3MgJiBNQ0lfT1BFTl9TSEFSRUFCTEU7CiAJCX0KKwlkcHJpbnRmX21jaWFuaW0oc3RkZGViLCJBTklNX21jaU9wZW4gLy8gd0RldklEPSUwNFhcbiIsIHdEZXZJRCk7CisJbHBQYXJtcy0+d0RldmljZUlEID0gd0RldklEOworCWRwcmludGZfbWNpYW5pbShzdGRkZWIsIkFOSU1fbWNpT3BlbiAvLyBscFBhcm1zLT53RGV2SUQ9JTA0WFxuIiwgbHBQYXJtcy0+d0RldmljZUlEKTsKICAgICBpZiAoZHdGbGFncyAmIE1DSV9PUEVOX0VMRU1FTlQpIHsKLSAgICAgICAgZHByaW50Zl9tY2lhbmltKHN0ZGRlYiwiQU5JTV9tY2lPcGVuIC8vIE1DSV9PUEVOX0VMRU1FTlQgIVxuIik7Ci0gICAgICAgIHByaW50ZigiQU5JTV9tY2lPcGVuIC8vIE1DSV9PUEVOX0VMRU1FTlQgIVxuIik7Ci0vKgkJcmV0dXJuIE1DSUVSUl9OT19FTEVNRU5UX0FMTE9XRUQ7ICovCisJCWxwc3RyRWxlbWVudE5hbWUgPSAoTFBTVFIpUFRSX1NFR19UT19MSU4obHBQYXJtcy0+bHBzdHJFbGVtZW50TmFtZSk7CisJCWRwcmludGZfbWNpYW5pbShzdGRkZWIsIkFOSU1fbWNpT3BlbiAvLyBNQ0lfT1BFTl9FTEVNRU5UICclcycgIVxuIiwKKwkJCQkJCWxwc3RyRWxlbWVudE5hbWUpOworCQlpZiAoc3RybGVuKGxwc3RyRWxlbWVudE5hbWUpID4gMCkgeworCQkJc3RyY3B5KHN0ciwgbHBzdHJFbGVtZW50TmFtZSk7CisJCQlBbnNpVXBwZXIoc3RyKTsKKwkJCX0KIAkJfQogCW1lbWNweSgmQW5pbURldlt3RGV2SURdLm9wZW5QYXJtcywgbHBQYXJtcywgc2l6ZW9mKE1DSV9PUEVOX1BBUk1TKSk7CiAJQW5pbURldlt3RGV2SURdLndOb3RpZnlEZXZpY2VJRCA9IGxwUGFybXMtPndEZXZpY2VJRDsKQEAgLTYxOCwxMiArNjI2LDEzIEBACiAJCWNhc2UgRFJWX09QRU46CiAJCWNhc2UgTUNJX09QRU5fRFJJVkVSOgogCQljYXNlIE1DSV9PUEVOOgotCQkJcmV0dXJuIEFOSU1fbWNpT3Blbihkd1BhcmFtMSwgKExQTUNJX09QRU5fUEFSTVMpZHdQYXJhbTIpOyAKKwkJCXJldHVybiBBTklNX21jaU9wZW4oZHdEZXZJRCwgZHdQYXJhbTEsIAorCQkJCQkoTFBNQ0lfT1BFTl9QQVJNUylQVFJfU0VHX1RPX0xJTihkd1BhcmFtMikpOyAKIAkJY2FzZSBEUlZfQ0xPU0U6CiAJCWNhc2UgTUNJX0NMT1NFX0RSSVZFUjoKIAkJY2FzZSBNQ0lfQ0xPU0U6CiAJCQlyZXR1cm4gQU5JTV9tY2lDbG9zZShkd0RldklELCBkd1BhcmFtMSwgCi0JCQkJCShMUE1DSV9HRU5FUklDX1BBUk1TKWR3UGFyYW0yKTsKKwkJCQkJKExQTUNJX0dFTkVSSUNfUEFSTVMpUFRSX1NFR19UT19MSU4oZHdQYXJhbTIpKTsKIAkJY2FzZSBEUlZfRU5BQkxFOgogCQkJcmV0dXJuIChMUkVTVUxUKTFMOwogCQljYXNlIERSVl9ESVNBQkxFOgpAQCAtNjQwLDMxICs2NDksMzEgQEAKIAkJCXJldHVybiAoTFJFU1VMVClEUlZDTkZfUkVTVEFSVDsKIAkJY2FzZSBNQ0lfR0VUREVWQ0FQUzoKIAkJCXJldHVybiBBTklNX21jaUdldERldkNhcHMoZHdEZXZJRCwgZHdQYXJhbTEsIAotCQkJCQkoTFBNQ0lfR0VUREVWQ0FQU19QQVJNUylkd1BhcmFtMik7CisJCQkJCShMUE1DSV9HRVRERVZDQVBTX1BBUk1TKVBUUl9TRUdfVE9fTElOKGR3UGFyYW0yKSk7CiAJCWNhc2UgTUNJX0lORk86CiAJCQlyZXR1cm4gQU5JTV9tY2lJbmZvKGR3RGV2SUQsIGR3UGFyYW0xLCAKLQkJCQkJCShMUE1DSV9JTkZPX1BBUk1TKWR3UGFyYW0yKTsKKwkJCQkJCShMUE1DSV9JTkZPX1BBUk1TKVBUUl9TRUdfVE9fTElOKGR3UGFyYW0yKSk7CiAJCWNhc2UgTUNJX1NUQVRVUzoKIAkJCXJldHVybiBBTklNX21jaVN0YXR1cyhkd0RldklELCBkd1BhcmFtMSwgCi0JCQkJCQkoTFBNQ0lfU1RBVFVTX1BBUk1TKWR3UGFyYW0yKTsKKwkJCQkJCShMUE1DSV9TVEFUVVNfUEFSTVMpUFRSX1NFR19UT19MSU4oZHdQYXJhbTIpKTsKIAkJY2FzZSBNQ0lfU0VUOgogCQkJcmV0dXJuIEFOSU1fbWNpU2V0KGR3RGV2SUQsIGR3UGFyYW0xLCAKLQkJCQkJCShMUE1DSV9TRVRfUEFSTVMpZHdQYXJhbTIpOworCQkJCQkJKExQTUNJX1NFVF9QQVJNUylQVFJfU0VHX1RPX0xJTihkd1BhcmFtMikpOwogCQljYXNlIE1DSV9QTEFZOgogCQkJcmV0dXJuIEFOSU1fbWNpUGxheShkd0RldklELCBkd1BhcmFtMSwgCi0JCQkJCQkoTFBNQ0lfUExBWV9QQVJNUylkd1BhcmFtMik7CisJCQkJCQkoTFBNQ0lfUExBWV9QQVJNUylQVFJfU0VHX1RPX0xJTihkd1BhcmFtMikpOwogCQljYXNlIE1DSV9TVE9QOgogCQkJcmV0dXJuIEFOSU1fbWNpU3RvcChkd0RldklELCBkd1BhcmFtMSwgCi0JCQkJCShMUE1DSV9HRU5FUklDX1BBUk1TKWR3UGFyYW0yKTsKKwkJCQkJKExQTUNJX0dFTkVSSUNfUEFSTVMpUFRSX1NFR19UT19MSU4oZHdQYXJhbTIpKTsKIAkJY2FzZSBNQ0lfUEFVU0U6CiAJCQlyZXR1cm4gQU5JTV9tY2lQYXVzZShkd0RldklELCBkd1BhcmFtMSwgCi0JCQkJCShMUE1DSV9HRU5FUklDX1BBUk1TKWR3UGFyYW0yKTsKKwkJCQkJKExQTUNJX0dFTkVSSUNfUEFSTVMpUFRSX1NFR19UT19MSU4oZHdQYXJhbTIpKTsKIAkJY2FzZSBNQ0lfUkVTVU1FOgogCQkJcmV0dXJuIEFOSU1fbWNpUmVzdW1lKGR3RGV2SUQsIGR3UGFyYW0xLCAKLQkJCQkJKExQTUNJX0dFTkVSSUNfUEFSTVMpZHdQYXJhbTIpOworCQkJCQkoTFBNQ0lfR0VORVJJQ19QQVJNUylQVFJfU0VHX1RPX0xJTihkd1BhcmFtMikpOwogCQljYXNlIE1DSV9TRUVLOgogCQkJcmV0dXJuIEFOSU1fbWNpU2Vlayhkd0RldklELCBkd1BhcmFtMSwgCi0JCQkJCShMUE1DSV9TRUVLX1BBUk1TKWR3UGFyYW0yKTsKKwkJCQkJKExQTUNJX1NFRUtfUEFSTVMpUFRSX1NFR19UT19MSU4oZHdQYXJhbTIpKTsKIAkJZGVmYXVsdDoKIAkJCXJldHVybiBEZWZEcml2ZXJQcm9jKGR3RGV2SUQsIGhEcml2LCB3TXNnLCBkd1BhcmFtMSwgZHdQYXJhbTIpOwogCQl9CmRpZmYgLS1naXQgYS9tdWx0aW1lZGlhL21jaWNkYS5jIGIvbXVsdGltZWRpYS9tY2ljZGEuYwppbmRleCBmNjAxNjNkLi42ZTAwMzQ1IDEwMDY0NAotLS0gYS9tdWx0aW1lZGlhL21jaWNkYS5jCisrKyBiL211bHRpbWVkaWEvbWNpY2RhLmMKQEAgLTgxLDEyICs4MSwxMSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIAkJCQlDREFVRElPX21jaU9wZW4JCQlbaW50ZXJuYWxdCiAqLwotRFdPUkQgQ0RBVURJT19tY2lPcGVuKERXT1JEIGR3RmxhZ3MsIExQTUNJX09QRU5fUEFSTVMgbHBQYXJtcykKK0RXT1JEIENEQVVESU9fbWNpT3BlbihVSU5UIHdEZXZJRCwgRFdPUkQgZHdGbGFncywgTFBNQ0lfT1BFTl9QQVJNUyBscFBhcm1zKQogewogI2lmZGVmIGxpbnV4Ci0JVUlOVAl3RGV2SUQ7Ci0gICAgCWRwcmludGZfY2RhdWRpbyhzdGRkZWIsIkNEQVVESU9fbWNpT3BlbiglMDhsWCwgJXApO1xuIiwgCi0JCWR3RmxhZ3MsIGxwUGFybXMpOworICAgIAlkcHJpbnRmX2NkYXVkaW8oc3RkZGViLCJDREFVRElPX21jaU9wZW4oJTA0WCwgJTA4bFgsICVwKTtcbiIsIAorCQkJCQl3RGV2SUQsIGR3RmxhZ3MsIGxwUGFybXMpOwogCWlmIChscFBhcm1zID09IE5VTEwpIHJldHVybiBNQ0lFUlJfSU5URVJOQUw7CiAJd0RldklEID0gbHBQYXJtcy0+d0RldmljZUlEOwogCWlmIChDREFEZXZbd0RldklEXS5uVXNlQ291bnQgPiAwKSB7CkBAIC0xMDMsMTQgKzEwMiwxNCBAQAogCQlDREFEZXZbd0RldklEXS5mU2hhcmVhYmxlID0gZHdGbGFncyAmIE1DSV9PUEVOX1NIQVJFQUJMRTsKIAkJfQogICAgIGlmIChkd0ZsYWdzICYgTUNJX09QRU5fRUxFTUVOVCkgewotICAgICAgICBkcHJpbnRmX2NkYXVkaW8oc3RkZGViLCJDREFVRElPX21jaU9wZW4gLy8gTUNJX09QRU5fRUxFTUVOVCAhXG4iKTsKKwkJZHByaW50Zl9jZGF1ZGlvKHN0ZGRlYiwiQ0RBVURJT19tY2lPcGVuIC8vIE1DSV9PUEVOX0VMRU1FTlQgIVxuIik7CiAvKgkJcmV0dXJuIE1DSUVSUl9OT19FTEVNRU5UX0FMTE9XRUQ7ICovCiAJCX0KIAltZW1jcHkoJkNEQURldlt3RGV2SURdLm9wZW5QYXJtcywgbHBQYXJtcywgc2l6ZW9mKE1DSV9PUEVOX1BBUk1TKSk7CiAJQ0RBRGV2W3dEZXZJRF0ud05vdGlmeURldmljZUlEID0gbHBQYXJtcy0+d0RldmljZUlEOwogCUNEQURldlt3RGV2SURdLnVuaXhkZXYgPSBvcGVuIChDREFVRElPX0RFViwgT19SRE9OTFksIDApOwogCWlmIChDREFEZXZbd0RldklEXS51bml4ZGV2ID09IC0xKSB7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCJDREFVRElPX21jaU9wZW4gLy8gY2FuJ3Qgb3BlbiAnJXMnICFcbiIsIENEQVVESU9fREVWKTsKKwkJZnByaW50ZihzdGRlcnIsIkNEQVVESU9fbWNpT3BlbiAvLyBjYW4ndCBvcGVuICclcycgIVxuIiwgQ0RBVURJT19ERVYpOwogCQlyZXR1cm4gTUNJRVJSX0hBUkRXQVJFOwogCQl9CiAJQ0RBRGV2W3dEZXZJRF0ubW9kZSA9IDA7CkBAIC0xMjIsNyArMTIxLDcgQEAKIAlDREFEZXZbd0RldklEXS5scGR3VHJhY2tMZW4gPSBOVUxMOwogCUNEQURldlt3RGV2SURdLmxwZHdUcmFja1BvcyA9IE5VTEw7CiAJaWYgKCFDREFVRElPX0dldFRyYWNrc0luZm8od0RldklEKSkgewotICAgICAgICBmcHJpbnRmKHN0ZGVyciwiQ0RBVURJT19tY2lPcGVuIC8vIGVycm9yIHJlYWRpbmcgVHJhY2tzSW5mbyAhXG4iKTsKKwkJZnByaW50ZihzdGRlcnIsIkNEQVVESU9fbWNpT3BlbiAvLyBlcnJvciByZWFkaW5nIFRyYWNrc0luZm8gIVxuIik7CiAvKgkJcmV0dXJuIE1DSUVSUl9JTlRFUk5BTDsgKi8KIAkJfQogCWlmIChkd0ZsYWdzICYgTUNJX05PVElGWSkgewpAQCAtMjY3LDggKzI2Niw4IEBACiAJCQkJCQl9CiAJCQkJCX0KIAkJCQlpZiAoZHdGbGFncyAmIE1DSV9UUkFDSykgewotICAgICAgICAgICAgICAgICAgICAJCQlkcHJpbnRmX2NkYXVkaW8oc3RkZGViLCJDREFVRElPX21jaVN0YXR1cyAvLyBNQ0lfVFJBQ0sgIyVsdSBMRU5HVEg9Pz8/ICFcbiIsCi0JCQkJCQkJCQkJCQkJCWxwUGFybXMtPmR3VHJhY2spOworCQkJCQlkcHJpbnRmX2NkYXVkaW8oc3RkZGViLCJDREFVRElPX21jaVN0YXR1cyAvLyBNQ0lfVFJBQ0sgIyVsdSBMRU5HVEg9Pz8/ICFcbiIsCisJCQkJCQkJbHBQYXJtcy0+ZHdUcmFjayk7CiAJCQkJCWlmIChscFBhcm1zLT5kd1RyYWNrID4gQ0RBRGV2W3dEZXZJRF0ublRyYWNrcykKIAkJCQkJCXJldHVybiBNQ0lFUlJfT1VUT0ZSQU5HRTsKIAkJCQkJbHBQYXJtcy0+ZHdSZXR1cm4gPSBDREFEZXZbd0RldklEXS5scGR3VHJhY2tMZW5bbHBQYXJtcy0+ZHdUcmFja107CkBAIC01MTQsNyArNTEzLDggQEAKIAkJCWVudHJ5LmNkdGVfYWRkci5tc2YubWludXRlICsgZW50cnkuY2R0ZV9hZGRyLm1zZi5zZWNvbmQpICsgCiAJCQllbnRyeS5jZHRlX2FkZHIubXNmLmZyYW1lOwogCQlpZiAoaSA9PSAwKSB7Ci0JCQlDREFEZXZbd0RldklEXS5kd0ZpcnN0T2Zmc2V0ID0gbGFzdF9zdGFydCA9IHN0YXJ0OworCQkJbGFzdF9zdGFydCA9IHN0YXJ0OworCQkJQ0RBRGV2W3dEZXZJRF0uZHdGaXJzdE9mZnNldCA9IHN0YXJ0OwogICAgICAgICAgICAgCQlkcHJpbnRmX2NkYXVkaW8oc3RkZGViLAogCQkJCSJDREFVRElPX0dldFRyYWNrc0luZm8gLy8gZHdGaXJzdE9mZnNldD0ldVxuIiwgCiAJCQkJc3RhcnQpOwpAQCAtNjQ4LDggKzY0OCwxMCBAQAogICAgICAgICAJZHByaW50Zl9jZGF1ZGlvKHN0ZGRlYiwKIAkJCSJDREFVRElPX21jaVBsYXkgLy8gTUNJX05PVElGWV9TVUNDRVNTRlVMICUwOGxYICFcbiIsIAogCQkJbHBQYXJtcy0+ZHdDYWxsYmFjayk7CisvKgogCQltY2lEcml2ZXJOb3RpZnkoKEhXTkQpTE9XT1JEKGxwUGFybXMtPmR3Q2FsbGJhY2spLCAKIAkJCUNEQURldlt3RGV2SURdLndOb3RpZnlEZXZpY2VJRCwgTUNJX05PVElGWV9TVUNDRVNTRlVMKTsKKyovCiAJCX0KIAlyZXR1cm4gMDsKICNlbHNlCkBAIC04NDUsNyArODQ3LDcgQEAKIAkJY2FzZSBEUlZfT1BFTjoKIAkJY2FzZSBNQ0lfT1BFTl9EUklWRVI6CiAJCWNhc2UgTUNJX09QRU46Ci0JCQlyZXR1cm4gQ0RBVURJT19tY2lPcGVuKGR3UGFyYW0xLCAoTFBNQ0lfT1BFTl9QQVJNUylkd1BhcmFtMik7IAorCQkJcmV0dXJuIENEQVVESU9fbWNpT3Blbihkd0RldklELCBkd1BhcmFtMSwgKExQTUNJX09QRU5fUEFSTVMpZHdQYXJhbTIpOyAKIAkJY2FzZSBEUlZfQ0xPU0U6CiAJCWNhc2UgTUNJX0NMT1NFX0RSSVZFUjoKIAkJY2FzZSBNQ0lfQ0xPU0U6CkBAIC04NjcsMzEgKzg2OSwzMSBAQAogCQkJcmV0dXJuIChMUkVTVUxUKURSVkNORl9SRVNUQVJUOwogCQljYXNlIE1DSV9HRVRERVZDQVBTOgogCQkJcmV0dXJuIENEQVVESU9fbWNpR2V0RGV2Q2Fwcyhkd0RldklELCBkd1BhcmFtMSwgCi0JCQkJCShMUE1DSV9HRVRERVZDQVBTX1BBUk1TKWR3UGFyYW0yKTsKKwkJCQkoTFBNQ0lfR0VUREVWQ0FQU19QQVJNUylQVFJfU0VHX1RPX0xJTihkd1BhcmFtMikpOwogCQljYXNlIE1DSV9JTkZPOgogCQkJcmV0dXJuIENEQVVESU9fbWNpSW5mbyhkd0RldklELCBkd1BhcmFtMSwgCi0JCQkJCQkoTFBNQ0lfSU5GT19QQVJNUylkd1BhcmFtMik7CisJCQkJKExQTUNJX0lORk9fUEFSTVMpUFRSX1NFR19UT19MSU4oZHdQYXJhbTIpKTsKIAkJY2FzZSBNQ0lfU1RBVFVTOgogCQkJcmV0dXJuIENEQVVESU9fbWNpU3RhdHVzKGR3RGV2SUQsIGR3UGFyYW0xLCAKLQkJCQkJCShMUE1DSV9TVEFUVVNfUEFSTVMpZHdQYXJhbTIpOworCQkJCShMUE1DSV9TVEFUVVNfUEFSTVMpUFRSX1NFR19UT19MSU4oZHdQYXJhbTIpKTsKIAkJY2FzZSBNQ0lfU0VUOgogCQkJcmV0dXJuIENEQVVESU9fbWNpU2V0KGR3RGV2SUQsIGR3UGFyYW0xLCAKLQkJCQkJCShMUE1DSV9TRVRfUEFSTVMpZHdQYXJhbTIpOworCQkJCShMUE1DSV9TRVRfUEFSTVMpUFRSX1NFR19UT19MSU4oZHdQYXJhbTIpKTsKIAkJY2FzZSBNQ0lfUExBWToKIAkJCXJldHVybiBDREFVRElPX21jaVBsYXkoZHdEZXZJRCwgZHdQYXJhbTEsIAotCQkJCQkJKExQTUNJX1BMQVlfUEFSTVMpZHdQYXJhbTIpOworCQkJCShMUE1DSV9QTEFZX1BBUk1TKVBUUl9TRUdfVE9fTElOKGR3UGFyYW0yKSk7CiAJCWNhc2UgTUNJX1NUT1A6CiAJCQlyZXR1cm4gQ0RBVURJT19tY2lTdG9wKGR3RGV2SUQsIGR3UGFyYW0xLCAKLQkJCQkJKExQTUNJX0dFTkVSSUNfUEFSTVMpZHdQYXJhbTIpOworCQkJCShMUE1DSV9HRU5FUklDX1BBUk1TKVBUUl9TRUdfVE9fTElOKGR3UGFyYW0yKSk7CiAJCWNhc2UgTUNJX1BBVVNFOgogCQkJcmV0dXJuIENEQVVESU9fbWNpUGF1c2UoZHdEZXZJRCwgZHdQYXJhbTEsIAotCQkJCQkoTFBNQ0lfR0VORVJJQ19QQVJNUylkd1BhcmFtMik7CisJCQkJKExQTUNJX0dFTkVSSUNfUEFSTVMpUFRSX1NFR19UT19MSU4oZHdQYXJhbTIpKTsKIAkJY2FzZSBNQ0lfUkVTVU1FOgogCQkJcmV0dXJuIENEQVVESU9fbWNpUmVzdW1lKGR3RGV2SUQsIGR3UGFyYW0xLCAKLQkJCQkJKExQTUNJX0dFTkVSSUNfUEFSTVMpZHdQYXJhbTIpOworCQkJCShMUE1DSV9HRU5FUklDX1BBUk1TKVBUUl9TRUdfVE9fTElOKGR3UGFyYW0yKSk7CiAJCWNhc2UgTUNJX1NFRUs6CiAJCQlyZXR1cm4gQ0RBVURJT19tY2lTZWVrKGR3RGV2SUQsIGR3UGFyYW0xLCAKLQkJCQkJKExQTUNJX1NFRUtfUEFSTVMpZHdQYXJhbTIpOworCQkJCShMUE1DSV9TRUVLX1BBUk1TKVBUUl9TRUdfVE9fTElOKGR3UGFyYW0yKSk7CiAJCWNhc2UgTUNJX1NFVF9ET09SX09QRU46CiAgICAgICAgICAgICAJCWRwcmludGZfY2RhdWRpbyhzdGRkZWIsCiAJCQkJIkNEQVVESU9fRHJpdmVyUHJvYyAvLyBNQ0lfU0VUX0RPT1JfT1BFTiAhXG4iKTsKZGlmZiAtLWdpdCBhL211bHRpbWVkaWEvbWlkaS5jIGIvbXVsdGltZWRpYS9taWRpLmMKaW5kZXggMDFlZjE3Mi4uYmUyNzA4NiAxMDA2NDQKLS0tIGEvbXVsdGltZWRpYS9taWRpLmMKKysrIGIvbXVsdGltZWRpYS9taWRpLmMKQEAgLTgzLDcgKzgzLDcgQEAKIHN0YXRpYyBMSU5VWF9NQ0lNSURJCU1DSU1pZGlEZXZbTUFYX01DSU1JRElEUlZdOwogI2VuZGlmCiAKLURXT1JEIE1JRElfbWNpT3BlbihEV09SRCBkd0ZsYWdzLCBMUE1DSV9PUEVOX1BBUk1TIGxwUGFybXMpOworRFdPUkQgTUlESV9tY2lPcGVuKFVJTlQgd0RldklELCBEV09SRCBkd0ZsYWdzLCBMUE1DSV9PUEVOX1BBUk1TIGxwUGFybXMpOwogRFdPUkQgTUlESV9tY2lDbG9zZShVSU5UIHdEZXZJRCwgRFdPUkQgZHdQYXJhbSwgTFBNQ0lfR0VORVJJQ19QQVJNUyBscFBhcm1zKTsKIERXT1JEIE1JRElfbWNpUGxheShVSU5UIHdEZXZJRCwgRFdPUkQgZHdGbGFncywgTFBNQ0lfUExBWV9QQVJNUyBscFBhcm1zKTsKIERXT1JEIE1JRElfbWNpUmVjb3JkKFVJTlQgd0RldklELCBEV09SRCBkd0ZsYWdzLCBMUE1DSV9SRUNPUkRfUEFSTVMgbHBQYXJtcyk7CkBAIC0xNjAsNyArMTYwLDcgQEAKIAkJCXJldHVybiAoTFJFU1VMVClEUlZDTkZfUkVTVEFSVDsKIAkJY2FzZSBNQ0lfT1BFTl9EUklWRVI6CiAJCWNhc2UgTUNJX09QRU46Ci0JCQlyZXR1cm4gTUlESV9tY2lPcGVuKGR3UGFyYW0xLCAoTFBNQ0lfT1BFTl9QQVJNUylQVFJfU0VHX1RPX0xJTihkd1BhcmFtMikpOworCQkJcmV0dXJuIE1JRElfbWNpT3Blbihkd0RldklELCBkd1BhcmFtMSwgKExQTUNJX09QRU5fUEFSTVMpUFRSX1NFR19UT19MSU4oZHdQYXJhbTIpKTsKIAkJY2FzZSBNQ0lfQ0xPU0VfRFJJVkVSOgogCQljYXNlIE1DSV9DTE9TRToKIAkJCXJldHVybiBNSURJX21jaUNsb3NlKGR3RGV2SUQsIGR3UGFyYW0xLCAoTFBNQ0lfR0VORVJJQ19QQVJNUylQVFJfU0VHX1RPX0xJTihkd1BhcmFtMikpOwpAQCAtMzUyLDE4ICszNTIsMTcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAJCQkJTUlESV9tY2lPcGVuCQkJW2ludGVybmFsXQkKICovCi1EV09SRCBNSURJX21jaU9wZW4oRFdPUkQgZHdGbGFncywgTFBNQ0lfT1BFTl9QQVJNUyBscFBhcm1zKQorRFdPUkQgTUlESV9tY2lPcGVuKFVJTlQgd0RldklELCBEV09SRCBkd0ZsYWdzLCBMUE1DSV9PUEVOX1BBUk1TIGxwUGFybXMpCiB7CiAjaWZkZWYgbGludXgKLQlVSU5UIAkJd0RldklEOwogCU1JRElPUEVOREVTQyAJTWlkaURlc2M7CiAJRFdPUkQJCWR3UmV0OwogCURXT1JECQlkd09mZnNldDsKKwlMUFNUUgkJbHBzdHJFbGVtZW50TmFtZTsKIAljaGFyCQlzdHJbMTI4XTsKIAogCWRwcmludGZfbWlkaSggc3RkZGViLCAiTUlESV9tY2lPcGVuKCUwOGxYLCAlcClcbiIsIGR3RmxhZ3MsIGxwUGFybXMpOwogCWlmIChscFBhcm1zID09IE5VTEwpIHJldHVybiBNQ0lFUlJfSU5URVJOQUw7Ci0Jd0RldklEID0gbHBQYXJtcy0+d0RldmljZUlEOwogCWlmIChNQ0lNaWRpRGV2W3dEZXZJRF0ublVzZUNvdW50ID4gMCkgewogCQkvKiBUaGUgZHJpdmVyIGFscmVhZHkgb3BlbiBvbiB0aGlzIGNoYW5uZWwgKi8KIAkJLyogSWYgdGhlIGRyaXZlciB3YXMgb3BlbmVkIHNoYXJlYWJsZSBiZWZvcmUgYW5kIHRoaXMgb3BlbiBzcGVjaWZpZXMgKi8KQEAgLTM3NywxMiArMzc2LDE2IEBACiAJCU1DSU1pZGlEZXZbd0RldklEXS5uVXNlQ291bnQgPSAxOwogCQlNQ0lNaWRpRGV2W3dEZXZJRF0uZlNoYXJlYWJsZSA9IGR3RmxhZ3MgJiBNQ0lfT1BFTl9TSEFSRUFCTEU7CiAJCX0KKwlkcHJpbnRmX21pZGkoc3RkZGViLCJNSURJX21jaU9wZW4gLy8gd0RldklEPSUwNFhcbiIsIHdEZXZJRCk7CisJbHBQYXJtcy0+d0RldmljZUlEID0gd0RldklEOworCWRwcmludGZfbWlkaShzdGRkZWIsIk1JRElfbWNpT3BlbiAvLyBscFBhcm1zLT53RGV2SUQ9JTA0WFxuIiwgbHBQYXJtcy0+d0RldmljZUlEKTsKKwlkcHJpbnRmX21pZGkoc3RkZGViLCJNSURJX21jaU9wZW4gLy8gYmVmb3JlIE9QRU5fRUxFTUVOVFxuIik7CiAgICAgaWYgKGR3RmxhZ3MgJiBNQ0lfT1BFTl9FTEVNRU5UKSB7Ci0JCXByaW50ZigiTUlESV9tY2lPcGVuIC8vIE1DSV9PUEVOX0VMRU1FTlQgJyVzJyAhXG4iLCAKLQkJCQkJCQkJbHBQYXJtcy0+bHBzdHJFbGVtZW50TmFtZSk7CisJCWxwc3RyRWxlbWVudE5hbWUgPSAoTFBTVFIpUFRSX1NFR19UT19MSU4obHBQYXJtcy0+bHBzdHJFbGVtZW50TmFtZSk7CisJCWRwcmludGZfbWlkaSggc3RkZGViLCAiTUlESV9tY2lPcGVuIC8vIE1DSV9PUEVOX0VMRU1FTlQgJyVzJyAhXG4iLCBscHN0ckVsZW1lbnROYW1lKTsKIC8qCQlwcmludGYoIk1JRElfbWNpT3BlbiAvLyBjZHc9JyVzJ1xuIiwgRE9TX0dldEN1cnJlbnREaXIoRE9TX0dldERlZmF1bHREcml2ZSgpKSk7ICovCi0JCWlmIChzdHJsZW4obHBQYXJtcy0+bHBzdHJFbGVtZW50TmFtZSkgPiAwKSB7Ci0JCQlzdHJjcHkoc3RyLCBscFBhcm1zLT5scHN0ckVsZW1lbnROYW1lKTsKKwkJaWYgKHN0cmxlbihscHN0ckVsZW1lbnROYW1lKSA+IDApIHsKKwkJCXN0cmNweShzdHIsIGxwc3RyRWxlbWVudE5hbWUpOwogCQkJQW5zaVVwcGVyKHN0cik7CiAJCQlNQ0lNaWRpRGV2W3dEZXZJRF0uaEZpbGUgPSBtbWlvT3BlbihzdHIsIE5VTEwsIAogCQkJCU1NSU9fQUxMT0NCVUYgfCBNTUlPX1JFQURXUklURSB8IE1NSU9fRVhDTFVTSVZFKTsKQEAgLTEwOTUsNyArMTA5OCw3IEBACiAJCWNhc2UgTUlETV9HRVRERVZDQVBTOgogCQkJcmV0dXJuIG1pZEdldERldkNhcHMod0RldklELCAoTFBNSURJSU5DQVBTKVBUUl9TRUdfVE9fTElOKGR3UGFyYW0xKSwgZHdQYXJhbTIpOwogCQljYXNlIE1JRE1fR0VUTlVNREVWUzoKLQkJCXJldHVybiAxTDsKKwkJCXJldHVybiAwTDsKIAkJY2FzZSBNSURNX1JFU0VUOgogCQkJcmV0dXJuIG1pZFJlc2V0KHdEZXZJRCk7CiAJCWNhc2UgTUlETV9TVEFSVDoKZGlmZiAtLWdpdCBhL211bHRpbWVkaWEvbW1hdXguYyBiL211bHRpbWVkaWEvbW1hdXguYwppbmRleCA3OGI5YmYxLi4wNWExYTBiIDEwMDY0NAotLS0gYS9tdWx0aW1lZGlhL21tYXV4LmMKKysrIGIvbXVsdGltZWRpYS9tbWF1eC5jCkBAIC0zNyw2ICszNyw4IEBACiAjZW5kaWYKIAogCitzdGF0aWMgaW50CU51bURldiA9IDY7CisKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCiAKQEAgLTExOCw3ICsxMjAsNyBAQAogewogI2lmZGVmIGxpbnV4CiAJaW50IAltaXhlcjsKLQlpbnQJCXZvbHVtZTsKKwlpbnQJCXZvbHVtZSwgbGVmdCwgcmlnaHQ7CiAJaW50CQljbWQ7CiAJcHJpbnRmKCJBVVhfR2V0Vm9sdW1lKCV1LCAlcCk7XG4iLCB3RGV2SUQsIGxwZHdWb2wpOwogCWlmIChscGR3Vm9sID09IE5VTEwpIHJldHVybiBNTVNZU0VSUl9OT1RFTkFCTEVEOwpAQCAtMTQ4LDE3ICsxNTAsMjIgQEAKIAkJCWNtZCA9IFNPVU5EX01JWEVSX1JFQURfTUlDOwogCQkJYnJlYWs7CiAJCWNhc2UgNToKLQkJZGVmYXVsdDoKIAkJCXByaW50ZigiTGludXggJ0FVWF9HZXRWb2x1bWUnIC8vIFNPVU5EX01JWEVSX1JFQURfVk9MVU1FICFcbiIpOwogCQkJY21kID0gU09VTkRfTUlYRVJfUkVBRF9WT0xVTUU7CiAJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWZwcmludGYoc3RkZXJyLCAiTGludXggJ0FVWF9HZXRWb2x1bWUnIC8vIGludmFsaWQgZGV2aWNlIGlkPSVkICFcbiIsIHdEZXZJRCk7CisJCQlyZXR1cm4gTU1TWVNFUlJfTk9URU5BQkxFRDsKIAkJfQogICAgIGlmIChpb2N0bChtaXhlciwgY21kLCAmdm9sdW1lKSA9PSAtMSkgewogCQlwcmludGYoIkxpbnV4ICdBVVhfR2V0Vm9sdW1lJyAvLyB1bmFibGUgcmVhZCBtaXhlciAhXG4iKTsKIAkJcmV0dXJuIE1NU1lTRVJSX05PVEVOQUJMRUQ7CiAJCX0KIAljbG9zZShtaXhlcik7Ci0JKmxwZHdWb2wgPSBNQUtFTE9ORyh2b2x1bWUsIHZvbHVtZSk7CisJbGVmdCA9IHZvbHVtZSAmIDB4N0Y7CisJcmlnaHQgPSAodm9sdW1lID4+IDgpICYgMHg3RjsKKwlwcmludGYoIkxpbnV4ICdBVVhfR2V0Vm9sdW1lJyAvLyBsZWZ0PSVkIHJpZ2h0PSVkICFcbiIsIGxlZnQsIHJpZ2h0KTsKKwkqbHBkd1ZvbCA9IE1BS0VMT05HKGxlZnQgPDwgOSwgcmlnaHQgPDwgOSk7CiAJcmV0dXJuIE1NU1lTRVJSX05PRVJST1I7CiAjZWxzZQogCXJldHVybiBNTVNZU0VSUl9OT1RFTkFCTEVEOwpAQCAtMTc0LDggKzE4MSw5IEBACiAJaW50IAltaXhlcjsKIAlpbnQJCXZvbHVtZTsKIAlpbnQJCWNtZDsKLQlwcmludGYoIkFVWF9TZXRWb2x1bWUoJXUsICUwOGxYKTtcbiIsIHdEZXZJRCwgZHdQYXJhbSk7Ci0Jdm9sdW1lID0gTE9XT1JEKGR3UGFyYW0pOworCXByaW50ZigiQVVYX1NldFZvbHVtZSgldSAoJTA0WCksICUwOGxYKTtcbiIsIHdEZXZJRCwgd0RldklELCBkd1BhcmFtKTsKKwl2b2x1bWUgPSAoTE9XT1JEKGR3UGFyYW0pID4+IDkgJiAweDdGKSArIAorCQkoKEhJV09SRChkd1BhcmFtKSA+PiA5ICAmIDB4N0YpIDw8IDgpOwogCWlmICgobWl4ZXIgPSBvcGVuKE1JWEVSX0RFViwgT19SRFdSKSkgPCAwKSB7CiAJCXByaW50ZigiTGludXggJ0FVWF9TZXRWb2x1bWUnIC8vIG1peGVyIGRldmljZSBub3QgYXZhaWxhYmxlICFcbiIpOwogCQlyZXR1cm4gTU1TWVNFUlJfTk9URU5BQkxFRDsKQEAgLTIwMiwxMCArMjEwLDEyIEBACiAJCQljbWQgPSBTT1VORF9NSVhFUl9XUklURV9NSUM7CiAJCQlicmVhazsKIAkJY2FzZSA1OgotCQlkZWZhdWx0OgogCQkJcHJpbnRmKCJMaW51eCAnQVVYX1NldFZvbHVtZScgLy8gU09VTkRfTUlYRVJfV1JJVEVfVk9MVU1FICFcbiIpOwogCQkJY21kID0gU09VTkRfTUlYRVJfV1JJVEVfVk9MVU1FOwogCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlmcHJpbnRmKHN0ZGVyciwgIkxpbnV4ICdBVVhfU2V0Vm9sdW1lJyAvLyBpbnZhbGlkIGRldmljZSBpZD0lZCAhXG4iLCB3RGV2SUQpOworCQkJcmV0dXJuIE1NU1lTRVJSX05PVEVOQUJMRUQ7CiAJCX0KICAgICBpZiAoaW9jdGwobWl4ZXIsIGNtZCwgJnZvbHVtZSkgPT0gLTEpIHsKIAkJcHJpbnRmKCJMaW51eCAnQVVYX1NldFZvbHVtZScgLy8gdW5hYmxlIHNldCBtaXhlciAhXG4iKTsKQEAgLTIyOSwxNCArMjM5LDE3IEBACiAJCQl3RGV2SUQsIHdNc2csIGR3VXNlciwgZHdQYXJhbTEsIGR3UGFyYW0yKTsKIAlzd2l0Y2god01zZykgewogCQljYXNlIEFVWERNX0dFVERFVkNBUFM6Ci0JCQlyZXR1cm4gQVVYX0dldERldkNhcHMod0RldklELCAoTFBBVVhDQVBTKWR3UGFyYW0xLCBkd1BhcmFtMik7CisJCQlyZXR1cm4gQVVYX0dldERldkNhcHMod0RldklELCAKKwkJCQkoTFBBVVhDQVBTKVBUUl9TRUdfVE9fTElOKGR3UGFyYW0xKSwgZHdQYXJhbTIpOwogCQljYXNlIEFVWERNX0dFVE5VTURFVlM6Ci0JCQlwcmludGYoIkFVWF9HZXROdW1EZXZzKCk7XG4iKTsKLQkJCXJldHVybiAxTDsKKwkJCXByaW50ZigiQVVYX0dldE51bURldnMoKSByZXR1cm4gJWQ7XG4iLCBOdW1EZXYpOworCQkJcmV0dXJuIE51bURldjsKIAkJY2FzZSBBVVhETV9HRVRWT0xVTUU6Ci0JCQlyZXR1cm4gQVVYX0dldFZvbHVtZSh3RGV2SUQsIChMUERXT1JEKWR3UGFyYW0xKTsKKwkJCXJldHVybiBBVVhfR2V0Vm9sdW1lKHdEZXZJRCwgKExQRFdPUkQpUFRSX1NFR19UT19MSU4oZHdQYXJhbTEpKTsKIAkJY2FzZSBBVVhETV9TRVRWT0xVTUU6CiAJCQlyZXR1cm4gQVVYX1NldFZvbHVtZSh3RGV2SUQsIGR3UGFyYW0xKTsKKwkJZGVmYXVsdDoKKwkJCWZwcmludGYoc3RkZXJyLCJhdXhNZXNzYWdlIC8vIHVua25vd24gbWVzc2FnZSAhXG4iKTsKIAkJfQogCXJldHVybiBNTVNZU0VSUl9OT1RTVVBQT1JURUQ7CiB9CmRpZmYgLS1naXQgYS9tdWx0aW1lZGlhL21tc3lzdGVtLmMgYi9tdWx0aW1lZGlhL21tc3lzdGVtLmMKaW5kZXggZTJhZjIyMi4uY2U4NjQyZiAxMDA2NDQKLS0tIGEvbXVsdGltZWRpYS9tbXN5c3RlbS5jCisrKyBiL211bHRpbWVkaWEvbW1zeXN0ZW0uYwpAQCAtNyw2ICs3LDcgQEAKICovCiAjaWZuZGVmIFdJTkVMSUIKIAorI2luY2x1ZGUgPHVuaXN0ZC5oPgogI2luY2x1ZGUgPHN0ZGlvLmg+CiAjaW5jbHVkZSA8c3RkbGliLmg+CiAjaW5jbHVkZSA8c3RyaW5nLmg+CkBAIC0yNyw2ICsyOCw5IEBACiAvKiAjdW5kZWYgIERFQlVHX01NSU8gICAqLwogI2luY2x1ZGUgImRlYnVnLmgiCiAKK3N0YXRpYyBpbnQJSW5zdGFsbGVkQ291bnQ7CitzdGF0aWMgaW50CUluc3RhbGxlZExpc3RMZW47CitzdGF0aWMgTFBTVFIJbHBJbnN0YWxsTmFtZXMgPSBOVUxMOwogCiBzdGF0aWMgQk9PTAkJbW1UaW1lU3RhcnRlZCA9IEZBTFNFOwogc3RhdGljIE1NVElNRQltbVN5c1RpbWVNUzsKQEAgLTgxLDEwICs4NSwxNiBAQAogCUhNTUlPCQkJaG1taW87CiAJTU1DS0lORk8JCW1tY2tJbmZvOwogCU1NQ0tJTkZPCQlja01haW5SSUZGOworCUhBTkRMRQkJCWhGb3JtYXQ7CiAJUENNV0FWRUZPUk1BVCAJcGNtV2F2ZUZvcm1hdDsKIAlpbnQJCQkJY291bnQ7Ci0JV0FWRUhEUgkJCVdhdmVIZHI7Ci0JV0FWRU9QRU5ERVNDIAlXYXZlRGVzYzsKKwlpbnQJCQkJYnVmc2l6ZTsKKwlIQU5ETEUJCQloRGVzYzsKKwlMUFdBVkVPUEVOREVTQyAJbHBXYXZlRGVzYzsKKwlIQU5ETEUJCQloV2F2ZUhkcjsKKwlMUFdBVkVIRFIJCWxwV2F2ZUhkcjsKKwlMUFdBVkVIRFIJCWxwMTZXYXZlSGRyOworCUhBTkRMRQkJCWhEYXRhOwogCURXT1JECQkJZHdSZXQ7CiAJY2hhcgkJCXN0clsxMjhdOwogCUxQU1RSCQkJcHRyOwpAQCAtMTIyLDQ2ICsxMzIsNjcgQEAKIAkJCShMUFNUUikmbW1ja0luZm8uY2tpZCwgKExQU1RSKSZtbWNrSW5mby5mY2NUeXBlLAogCQkJbW1ja0luZm8uY2tzaXplKTsKIAlpZiAobW1pb1JlYWQoaG1taW8sIChIUFNUUikgJnBjbVdhdmVGb3JtYXQsCi0JICAgIChsb25nKSBzaXplb2YoUENNV0FWRUZPUk1BVCkpICE9IChsb25nKSBzaXplb2YoUENNV0FWRUZPUk1BVCkpIGdvdG8gRXJyU05EOworCQkobG9uZykgc2l6ZW9mKFBDTVdBVkVGT1JNQVQpKSAhPSAobG9uZykgc2l6ZW9mKFBDTVdBVkVGT1JNQVQpKSBnb3RvIEVyclNORDsKKworCXByaW50Zigic25kUGxheVNvdW5kIC8vIHdGb3JtYXRUYWc9JTA0WCAhXG4iLCBwY21XYXZlRm9ybWF0LndmLndGb3JtYXRUYWcpOworCXByaW50Zigic25kUGxheVNvdW5kIC8vIG5DaGFubmVscz0lZCBcbiIsIHBjbVdhdmVGb3JtYXQud2YubkNoYW5uZWxzKTsKKwlwcmludGYoInNuZFBsYXlTb3VuZCAvLyBuU2FtcGxlc1BlclNlYz0lbGRcbiIsIHBjbVdhdmVGb3JtYXQud2YublNhbXBsZXNQZXJTZWMpOworCXByaW50Zigic25kUGxheVNvdW5kIC8vIG5BdmdCeXRlc1BlclNlYz0lbGRcbiIsIHBjbVdhdmVGb3JtYXQud2YubkF2Z0J5dGVzUGVyU2VjKTsKKwlwcmludGYoInNuZFBsYXlTb3VuZCAvLyBuQmxvY2tBbGlnbj0lZCBcbiIsIHBjbVdhdmVGb3JtYXQud2YubkJsb2NrQWxpZ24pOworCXByaW50Zigic25kUGxheVNvdW5kIC8vIHdCaXRzUGVyU2FtcGxlPSV1ICFcbiIsIHBjbVdhdmVGb3JtYXQud0JpdHNQZXJTYW1wbGUpOworCiAJbW1ja0luZm8uY2tpZCA9IG1taW9GT1VSQ0MoJ2QnLCAnYScsICd0JywgJ2EnKTsKIAlpZiAobW1pb0Rlc2NlbmQoaG1taW8sICZtbWNrSW5mbywgJmNrTWFpblJJRkYsIE1NSU9fRklORENIVU5LKSAhPSAwKSBnb3RvIEVyclNORDsKIAlwcmludGYoInNuZFBsYXlTb3VuZCAvLyBDaHVuayBGb3VuZCBja2lkPSUuNHMgZmNjVHlwZT0lLjRzIGNrc2l6ZT0lMDhsWCBcbiIsCiAJCQkoTFBTVFIpJm1tY2tJbmZvLmNraWQsIChMUFNUUikmbW1ja0luZm8uZmNjVHlwZSwKIAkJCW1tY2tJbmZvLmNrc2l6ZSk7Ci0JV2F2ZURlc2MuaFdhdmUgPSAwOwotCVdhdmVEZXNjLmxwRm9ybWF0ID0gKExQV0FWRUZPUk1BVCkmcGNtV2F2ZUZvcm1hdDsKLQlwY21XYXZlRm9ybWF0LndmLndGb3JtYXRUYWcgPSBXQVZFX0ZPUk1BVF9QQ007Ci0vKglwY21XYXZlRm9ybWF0LndCaXRzUGVyU2FtcGxlID0gODsKLQlwY21XYXZlRm9ybWF0LndmLm5DaGFubmVscyA9IDE7Ci0JcGNtV2F2ZUZvcm1hdC53Zi5uU2FtcGxlc1BlclNlYyA9IDExMDI1OyAKLQlwY21XYXZlRm9ybWF0LndmLm5CbG9ja0FsaWduID0gMTsgKi8KKwloRGVzYyA9IFVTRVJfSEVBUF9BTExPQyhzaXplb2YoV0FWRU9QRU5ERVNDKSk7CisJbHBXYXZlRGVzYyA9IChMUFdBVkVPUEVOREVTQykgVVNFUl9IRUFQX0xJTl9BRERSKGhEZXNjKTsKKwlscFdhdmVEZXNjLT5oV2F2ZSA9IDA7CiAJcGNtV2F2ZUZvcm1hdC53Zi5uQXZnQnl0ZXNQZXJTZWMgPSAKIAkJcGNtV2F2ZUZvcm1hdC53Zi5uU2FtcGxlc1BlclNlYyAqIHBjbVdhdmVGb3JtYXQud2YubkJsb2NrQWxpZ247Ci0JZHdSZXQgPSB3b2RNZXNzYWdlKDAsIFdPRE1fT1BFTiwgMCwgKERXT1JEKSZXYXZlRGVzYywgQ0FMTEJBQ0tfTlVMTCk7CisJaEZvcm1hdCA9IFVTRVJfSEVBUF9BTExPQyhzaXplb2YoUENNV0FWRUZPUk1BVCkpOworCWxwV2F2ZURlc2MtPmxwRm9ybWF0ID0gKExQV0FWRUZPUk1BVCkgVVNFUl9IRUFQX0xJTl9BRERSKGhGb3JtYXQpOworCW1lbWNweShscFdhdmVEZXNjLT5scEZvcm1hdCwgJnBjbVdhdmVGb3JtYXQsIHNpemVvZihQQ01XQVZFRk9STUFUKSk7CisJbHBXYXZlRGVzYyA9IChMUFdBVkVPUEVOREVTQykgVVNFUl9IRUFQX1NFR19BRERSKGhEZXNjKTsKKwlkd1JldCA9IHdvZE1lc3NhZ2UoMCwgV09ETV9PUEVOLCAwLCAoRFdPUkQpbHBXYXZlRGVzYywgQ0FMTEJBQ0tfTlVMTCk7CiAJaWYgKGR3UmV0ICE9IE1NU1lTRVJSX05PRVJST1IpIHsKIAkJcHJpbnRmKCJzbmRQbGF5U291bmQgLy8gY2FuJ3Qgb3BlbiBXYXZlT3V0IGRldmljZSAhXG4iKTsKIAkJZ290byBFcnJTTkQ7CiAJCX0KLQlXYXZlSGRyLmxwRGF0YSA9IChMUFNUUikgbWFsbG9jKDY0MDAwKTsKLQlXYXZlSGRyLmR3QnVmZmVyTGVuZ3RoID0gMzIwMDA7Ci0JV2F2ZUhkci5kd1VzZXIgPSAwTDsKLQlXYXZlSGRyLmR3RmxhZ3MgPSAwTDsKLQlXYXZlSGRyLmR3TG9vcHMgPSAwTDsKLQlkd1JldCA9IHdvZE1lc3NhZ2UoMCwgV09ETV9QUkVQQVJFLCAwLCAoRFdPUkQpJldhdmVIZHIsIHNpemVvZihXQVZFSERSKSk7CisJVVNFUl9IRUFQX0ZSRUUoaEZvcm1hdCk7CisJaFdhdmVIZHIgPSBVU0VSX0hFQVBfQUxMT0Moc2l6ZW9mKFdBVkVIRFIpKTsKKwlscFdhdmVIZHIgPSAoTFBXQVZFSERSKSBVU0VSX0hFQVBfTElOX0FERFIoaFdhdmVIZHIpOworCWxwMTZXYXZlSGRyID0gKExQV0FWRUhEUikgVVNFUl9IRUFQX1NFR19BRERSKGhXYXZlSGRyKTsKKwlidWZzaXplID0gNjQwMDA7CisJaERhdGEgPSBHbG9iYWxBbGxvYyhHTUVNX01PVkVBQkxFLCBidWZzaXplKTsKKwlscFdhdmVIZHItPmxwRGF0YSA9IChMUFNUUikgV0lOMTZfR2xvYmFsTG9jayhoRGF0YSk7CisJbHBXYXZlSGRyLT5kd0J1ZmZlckxlbmd0aCA9IGJ1ZnNpemU7CisJbHBXYXZlSGRyLT5kd1VzZXIgPSAwTDsKKwlscFdhdmVIZHItPmR3RmxhZ3MgPSAwTDsKKwlscFdhdmVIZHItPmR3TG9vcHMgPSAwTDsKKwlkd1JldCA9IHdvZE1lc3NhZ2UoMCwgV09ETV9QUkVQQVJFLCAwLCAoRFdPUkQpbHAxNldhdmVIZHIsIHNpemVvZihXQVZFSERSKSk7CiAJaWYgKGR3UmV0ICE9IE1NU1lTRVJSX05PRVJST1IpIHsKIAkJcHJpbnRmKCJzbmRQbGF5U291bmQgLy8gY2FuJ3QgcHJlcGFyZSBXYXZlT3V0IGRldmljZSAhXG4iKTsKLQkJZnJlZShXYXZlSGRyLmxwRGF0YSk7CisJCUdsb2JhbFVubG9jayhoRGF0YSk7CisJCUdsb2JhbEZyZWUoaERhdGEpOworCQlVU0VSX0hFQVBfRlJFRShoRGVzYyk7CisJCVVTRVJfSEVBUF9GUkVFKGhXYXZlSGRyKTsKIAkJZ290byBFcnJTTkQ7CiAJCX0KIAl3aGlsZShUUlVFKSB7Ci0JCWNvdW50ID0gbW1pb1JlYWQoaG1taW8sIFdhdmVIZHIubHBEYXRhLCBXYXZlSGRyLmR3QnVmZmVyTGVuZ3RoKTsKKwkJY291bnQgPSBtbWlvUmVhZChobW1pbywgUFRSX1NFR19UT19MSU4obHBXYXZlSGRyLT5scERhdGEpLCBidWZzaXplKTsKIAkJaWYgKGNvdW50IDwgMSkgYnJlYWs7Ci0JCVdhdmVIZHIuZHdCeXRlc1JlY29yZGVkID0gY291bnQ7Ci0JCXdvZE1lc3NhZ2UoMCwgV09ETV9XUklURSwgMCwgKERXT1JEKSZXYXZlSGRyLCBzaXplb2YoV0FWRUhEUikpOworCQlscFdhdmVIZHItPmR3QnVmZmVyTGVuZ3RoID0gY291bnQ7CisvKgkJbHBXYXZlSGRyLT5kd0J5dGVzUmVjb3JkZWQgPSBjb3VudDsgKi8KKwkJd29kTWVzc2FnZSgwLCBXT0RNX1dSSVRFLCAwLCAoRFdPUkQpbHAxNldhdmVIZHIsIHNpemVvZihXQVZFSERSKSk7CiAJCX0KLQl3b2RNZXNzYWdlKDAsIFdPRE1fVU5QUkVQQVJFLCAwLCAoRFdPUkQpJldhdmVIZHIsIHNpemVvZihXQVZFSERSKSk7CisJd29kTWVzc2FnZSgwLCBXT0RNX1VOUFJFUEFSRSwgMCwgKERXT1JEKWxwMTZXYXZlSGRyLCBzaXplb2YoV0FWRUhEUikpOwogCXdvZE1lc3NhZ2UoMCwgV09ETV9DTE9TRSwgMCwgMEwsIDBMKTsKLQlmcmVlKFdhdmVIZHIubHBEYXRhKTsKKwlHbG9iYWxVbmxvY2soaERhdGEpOworCUdsb2JhbEZyZWUoaERhdGEpOworCVVTRVJfSEVBUF9GUkVFKGhEZXNjKTsKKwlVU0VSX0hFQVBfRlJFRShoV2F2ZUhkcik7CiAJaWYgKGhtbWlvICE9IDApICAgbW1pb0Nsb3NlKGhtbWlvLCAwKTsKIAlyZXR1cm4gVFJVRTsKIH0KQEAgLTU5Niw3ICs2MjcsNyBAQAogbXNnIyA1NDMgOiB0bXNmCiAqLwogCQlkZWZhdWx0OgotCQkJbXNncHRyID0gIlVua293biBNQ0kgRXJyb3IgIVxuIjsKKwkJCW1zZ3B0ciA9ICJVbmtub3duIE1DSSBFcnJvciAhXG4iOwogCQkJYnJlYWs7CiAJCX0KIAltYXhidWYgPSBtaW4odUxlbmd0aCAtIDEsIHN0cmxlbihtc2dwdHIpKTsKQEAgLTYxMyw2ICs2NDQsNyBAQAogewogCXByaW50ZigibWNpRHJpdmVyTm90aWZ5KCUwNFgsICV1LCAlMDRYKVxuIiwgaFduZENhbGxCYWNrLCB3RGV2SUQsIHdTdGF0dXMpOwogCWlmICghSXNXaW5kb3coaFduZENhbGxCYWNrKSkgcmV0dXJuIEZBTFNFOworCXByaW50ZigibWNpRHJpdmVyTm90aWZ5IC8vIGJlZm9yZSBQb3N0TWVzc2FnZVxuIik7CiAJUG9zdE1lc3NhZ2UoaFduZENhbGxCYWNrLCBNTV9NQ0lOT1RJRlksIHdTdGF0dXMsIAogCQkJTUFLRUxPTkcobWNpRHJ2W3dEZXZJRF0ud0RldmljZUlELCAwKSk7CiAJcmV0dXJuIFRSVUU7CkBAIC02MjEsNzUgKzY1Myw4NyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIAkJCQltY2lPcGVuCQkJCQlbaW50ZXJuYWxdCiAqLwotRFdPUkQgbWNpT3BlbihEV09SRCBkd1BhcmFtLCBMUE1DSV9PUEVOX1BBUk1TIGxwUGFybXMpCitEV09SRCBtY2lPcGVuKERXT1JEIGR3UGFyYW0sIExQTUNJX09QRU5fUEFSTVMgbHAxNlBhcm1zKQogewogCWNoYXIJc3RyWzEyOF07Ci0JRFdPUkQJZHdEZXZUeXAgPSAwOwotCVVJTlQJd0RldklEID0gMTsKLQlwcmludGYoIm1jaU9wZW4oJTA4bFgsICVwKVxuIiwgZHdQYXJhbSwgbHBQYXJtcyk7Ci0JaWYgKGxwUGFybXMgPT0gTlVMTCkgcmV0dXJuIE1DSUVSUl9JTlRFUk5BTDsKKwlMUE1DSV9PUEVOX1BBUk1TIGxwUGFybXM7CisJVUlOVAl1RGV2VHlwID0gMDsKKwlVSU5UCXdEZXZJRCA9IDA7CisJbHBQYXJtcyA9IFBUUl9TRUdfVE9fTElOKGxwMTZQYXJtcyk7CisJcHJpbnRmKCJtY2lPcGVuKCUwOGxYLCAlcCAoJXApKVxuIiwgZHdQYXJhbSwgbHAxNlBhcm1zLCBscFBhcm1zKTsKKwlpZiAobHAxNlBhcm1zID09IE5VTEwpIHJldHVybiBNQ0lFUlJfSU5URVJOQUw7CiAJd2hpbGUobWNpRHJ2W3dEZXZJRF0ud1R5cGUgIT0gMCkgewogCQlpZiAoKyt3RGV2SUQgPj0gTUFYTUNJRFJJVkVSUykgewogCQkJcHJpbnRmKCJNQ0lfT1BFTiAvLyBNQVhNQ0lEUklWRVJTIHJlYWNoZWQgIVxuIik7CiAJCQlyZXR1cm4gTUNJRVJSX0lOVEVSTkFMOwogCQkJfQogCQl9CisJcHJpbnRmKCJtY2lPcGVuIC8vIHdEZXZJRD0lZCBcbiIsIHdEZXZJRCk7CisJaWYgKGR3UGFyYW0gJiBNQ0lfT1BFTl9BTElBUykgeworCQlwcmludGYoIk1DSV9PUEVOIC8vIEFsaWFzPSclcycgIVxuIiwKKwkJCShjaGFyKilQVFJfU0VHX1RPX0xJTihscFBhcm1zLT5scHN0ckFsaWFzKSk7CisJCXVEZXZUeXAgPSBNQ0lfREVWVFlQRV9XQVZFRk9STV9BVURJTzsKKyAJCX0KIAlpZiAoZHdQYXJhbSAmIE1DSV9PUEVOX1RZUEUpIHsKLQkJaWYgKGxwUGFybXMtPmxwc3RyRGV2aWNlVHlwZSA9PSBOVUxMKSByZXR1cm4gTUNJRVJSX0lOVEVSTkFMOwogCQlpZiAoZHdQYXJhbSAmIE1DSV9PUEVOX1RZUEVfSUQpIHsKIAkJCXByaW50ZigiTUNJX09QRU4gLy8gRGV2PSVwICFcbiIsIGxwUGFybXMtPmxwc3RyRGV2aWNlVHlwZSk7Ci0JCQlkd0RldlR5cCA9IChEV09SRClscFBhcm1zLT5scHN0ckRldmljZVR5cGU7CisJCQl1RGV2VHlwID0gTE9XT1JEKChEV09SRClscFBhcm1zLT5scHN0ckRldmljZVR5cGUpOwogCQkJfQogCQllbHNlIHsKKwkJCWlmIChscFBhcm1zLT5scHN0ckRldmljZVR5cGUgPT0gTlVMTCkgcmV0dXJuIE1DSUVSUl9JTlRFUk5BTDsKIAkJCXByaW50ZigiTUNJX09QRU4gLy8gRGV2PSclcycgIVxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyKilQVFJfU0VHX1RPX0xJTihscFBhcm1zLT5scHN0ckRldmljZVR5cGUpKTsKIAkJCXN0cmNweShzdHIsIFBUUl9TRUdfVE9fTElOKGxwUGFybXMtPmxwc3RyRGV2aWNlVHlwZSkpOwogCQkJQW5zaVVwcGVyKHN0cik7CiAJCQlpZiAoc3RyY21wKHN0ciwgIkNEQVVESU8iKSA9PSAwKSB7Ci0JCQkJZHdEZXZUeXAgPSBNQ0lfREVWVFlQRV9DRF9BVURJTzsKKwkJCQl1RGV2VHlwID0gTUNJX0RFVlRZUEVfQ0RfQVVESU87CiAJCQkJfQogCQkJZWxzZQogCQkJaWYgKHN0cmNtcChzdHIsICJXQVZFQVVESU8iKSA9PSAwKSB7Ci0JCQkJZHdEZXZUeXAgPSBNQ0lfREVWVFlQRV9XQVZFRk9STV9BVURJTzsKKwkJCQl1RGV2VHlwID0gTUNJX0RFVlRZUEVfV0FWRUZPUk1fQVVESU87CiAJCQkJfQogCQkJZWxzZQogCQkJaWYgKHN0cmNtcChzdHIsICJTRVFVRU5DRVIiKSA9PSAwKQl7Ci0JCQkJZHdEZXZUeXAgPSBNQ0lfREVWVFlQRV9TRVFVRU5DRVI7CisJCQkJdURldlR5cCA9IE1DSV9ERVZUWVBFX1NFUVVFTkNFUjsKIAkJCQl9CiAJCQllbHNlCiAJCQlpZiAoc3RyY21wKHN0ciwgIkFOSU1BVElPTjEiKSA9PSAwKSB7Ci0JCQkJZHdEZXZUeXAgPSBNQ0lfREVWVFlQRV9BTklNQVRJT047CisJCQkJdURldlR5cCA9IE1DSV9ERVZUWVBFX0FOSU1BVElPTjsKKwkJCQl9CisJCQllbHNlCisJCQlpZiAoc3RyY21wKHN0ciwgIkFWSVZJREVPIikgPT0gMCkgeworCQkJCXVEZXZUeXAgPSBNQ0lfREVWVFlQRV9ESUdJVEFMX1ZJREVPOwogCQkJCX0KIAkJCX0KLQkJbWNpRHJ2W3dEZXZJRF0ud1R5cGUgPSBkd0RldlR5cDsKLQkJbWNpRHJ2W3dEZXZJRF0ud0RldmljZUlEID0gMTsKLQkJbHBQYXJtcy0+d0RldmljZUlEID0gd0RldklEOwotCQlwcmludGYoIk1DSV9PUEVOIC8vIHdEZXZpY2VJRD0lMDRYICFcbiIsIGxwUGFybXMtPndEZXZpY2VJRCk7Ci0JCXN3aXRjaChkd0RldlR5cCkgewotCQkJY2FzZSBNQ0lfREVWVFlQRV9DRF9BVURJTzoKKwkJfQorCW1jaURydlt3RGV2SURdLndUeXBlID0gdURldlR5cDsKKwltY2lEcnZbd0RldklEXS53RGV2aWNlSUQgPSB3RGV2SUQ7CisJbHBQYXJtcy0+d0RldmljZUlEID0gd0RldklEOworCXByaW50ZigiTUNJX09QRU4gLy8gbWNpZGV2PSVkLCB1RGV2VHlwPSUwNFggd0RldmljZUlEPSUwNFggIVxuIiwgCisJCQkJd0RldklELCB1RGV2VHlwLCBscFBhcm1zLT53RGV2aWNlSUQpOworCXN3aXRjaCh1RGV2VHlwKSB7CisJCWNhc2UgTUNJX0RFVlRZUEVfQ0RfQVVESU86CiAjaWZkZWYgV0lORUxJQgotCQkgICAgV0lORUxJQl9VTklNUCAoIkNEQVVESU9fRHJpdmVyUHJvYyIpOworCQkJV0lORUxJQl9VTklNUCAoIkNEQVVESU9fRHJpdmVyUHJvYyIpOwogI2Vsc2UKLQkJCQlyZXR1cm4gQ0RBVURJT19Ecml2ZXJQcm9jKDAsIDAsIE1DSV9PUEVOX0RSSVZFUiwKLQotCQkJCQkJCQkJZHdQYXJhbSwgKERXT1JEKWxwUGFybXMpOworCQkJcmV0dXJuIENEQVVESU9fRHJpdmVyUHJvYygwLCAwLCBNQ0lfT1BFTl9EUklWRVIsCisJCQkJCQkJZHdQYXJhbSwgKERXT1JEKWxwMTZQYXJtcyk7CiAjZW5kaWYKIAkJY2FzZSBNQ0lfREVWVFlQRV9XQVZFRk9STV9BVURJTzoKLQkJCQlyZXR1cm4gV0FWRV9Ecml2ZXJQcm9jKDAsIDAsIE1DSV9PUEVOX0RSSVZFUiwgCi0JCQkJCQkJCQlkd1BhcmFtLCAoRFdPUkQpbHBQYXJtcyk7Ci0JCQljYXNlIE1DSV9ERVZUWVBFX1NFUVVFTkNFUjoKLQkJCQlyZXR1cm4gTUlESV9Ecml2ZXJQcm9jKDAsIDAsIE1DSV9PUEVOX0RSSVZFUiwgCi0JCQkJCQkJCQlkd1BhcmFtLCAoRFdPUkQpbHBQYXJtcyk7Ci0JCQljYXNlIE1DSV9ERVZUWVBFX0FOSU1BVElPTjoKLQkJCQlyZXR1cm4gQU5JTV9Ecml2ZXJQcm9jKDAsIDAsIE1DSV9PUEVOX0RSSVZFUiwgCi0JCQkJCQkJCQlkd1BhcmFtLCAoRFdPUkQpbHBQYXJtcyk7Ci0JCQljYXNlIE1DSV9ERVZUWVBFX0RJR0lUQUxfVklERU86Ci0JCQkJcHJpbnRmKCJNQ0lfT1BFTiAvLyBObyBESUdJVEFMX1ZJREVPIHlldCAhXG4iKTsKLQkJCQlyZXR1cm4gTUNJRVJSX0RFVklDRV9OT1RfSU5TVEFMTEVEOwotCQkJZGVmYXVsdDoKLQkJCQlwcmludGYoIk1DSV9PUEVOIC8vIEludmFsaWQgRGV2aWNlIE5hbWUgJyVwJyAhXG4iLCBscFBhcm1zLT5scHN0ckRldmljZVR5cGUpOwotCQkJCXJldHVybiBNQ0lFUlJfSU5WQUxJRF9ERVZJQ0VfTkFNRTsKLQkJCX0KKwkJCXJldHVybiBXQVZFX0RyaXZlclByb2MoMCwgMCwgTUNJX09QRU5fRFJJVkVSLCAKKwkJCQkJCQkJZHdQYXJhbSwgKERXT1JEKWxwMTZQYXJtcyk7CisJCWNhc2UgTUNJX0RFVlRZUEVfU0VRVUVOQ0VSOgorCQkJcmV0dXJuIE1JRElfRHJpdmVyUHJvYygwLCAwLCBNQ0lfT1BFTl9EUklWRVIsIAorCQkJCQkJCQlkd1BhcmFtLCAoRFdPUkQpbHAxNlBhcm1zKTsKKwkJY2FzZSBNQ0lfREVWVFlQRV9BTklNQVRJT046CisJCQlyZXR1cm4gQU5JTV9Ecml2ZXJQcm9jKDAsIDAsIE1DSV9PUEVOX0RSSVZFUiwgCisJCQkJCQkJCWR3UGFyYW0sIChEV09SRClscDE2UGFybXMpOworCQljYXNlIE1DSV9ERVZUWVBFX0RJR0lUQUxfVklERU86CisJCQlwcmludGYoIk1DSV9PUEVOIC8vIE5vIERJR0lUQUxfVklERU8geWV0ICFcbiIpOworCQkJcmV0dXJuIE1DSUVSUl9ERVZJQ0VfTk9UX0lOU1RBTExFRDsKKwkJZGVmYXVsdDoKKwkJCXByaW50ZigiTUNJX09QRU4gLy8gSW52YWxpZCBEZXZpY2UgTmFtZSAnJXAnICFcbiIsIGxwUGFybXMtPmxwc3RyRGV2aWNlVHlwZSk7CisJCQlyZXR1cm4gTUNJRVJSX0lOVkFMSURfREVWSUNFX05BTUU7CiAJCX0KIAlyZXR1cm4gTUNJRVJSX0lOVEVSTkFMOwogfQpAQCAtNzIyLDcgKzc2Niw3IEBACiAJCQkJCQlNQ0lfQ0xPU0UsIGR3UGFyYW0sIChEV09SRClscFBhcm1zKTsKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgotCQkJcHJpbnRmKCJtY2lDbG9zZSgpIC8vIHVua25vd24gdHlwZT0lMDRYICFcbiIsIG1jaURydlt3RGV2SURdLndUeXBlKTsKKwkJCXByaW50ZigibWNpQ2xvc2UoKSAvLyB1bmtub3duIGRldmljZSB0eXBlPSUwNFggIVxuIiwgbWNpRHJ2W3dEZXZJRF0ud1R5cGUpOwogCQl9CiAJbWNpRHJ2W3dEZXZJRF0ud1R5cGUgPSAwOwogCXJldHVybiBkd1JldDsKQEAgLTczMiw2ICs3NzYsNTYgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAJCQkJbWNpU291bmQJCQkJW2ludGVybmFsXQogKi8KK0RXT1JEIG1jaVN5c0luZm8oRFdPUkQgZHdGbGFncywgTFBNQ0lfU1lTSU5GT19QQVJNUyBscFBhcm1zKQoreworCWludAlsZW47CisJTFBTVFIJcHRyOworCUxQU1RSCWxwc3RyUmV0dXJuOworCURXT1JECSpscGR3UmV0OworCUxQU1RSCVN5c0ZpbGUgPSAiU1lTVEVNLklOSSI7CisJZHByaW50Zl9tY2koc3RkZGViLCAibWNpU3lzSW5mbyglMDhsWCwgJTA4bFgpXG4iLCBkd0ZsYWdzLCAoRFdPUkQpbHBQYXJtcyk7CisJbHBzdHJSZXR1cm4gPSBQVFJfU0VHX1RPX0xJTihscFBhcm1zLT5scHN0clJldHVybik7CisJc3dpdGNoKGR3RmxhZ3MpIHsKKwkJY2FzZSBNQ0lfU1lTSU5GT19RVUFOVElUWToKKwkJCWRwcmludGZfbWNpKHN0ZGRlYiwgIm1jaVN5c0luZm8gLy8gTUNJX1NZU0lORk9fUVVBTlRJVFkgXG4iKTsKKwkJCWxwZHdSZXQgPSAoRFdPUkQgKilscHN0clJldHVybjsKKwkJCSoobHBkd1JldCkgPSBJbnN0YWxsZWRDb3VudDsJCQorCQkJcmV0dXJuIDA7CisJCWNhc2UgTUNJX1NZU0lORk9fSU5TVEFMTE5BTUU6CisJCQlkcHJpbnRmX21jaShzdGRkZWIsICJtY2lTeXNJbmZvIC8vIE1DSV9TWVNJTkZPX0lOU1RBTExOQU1FIFxuIik7CisJCQlpZiAobHBJbnN0YWxsTmFtZXMgPT0gTlVMTCkgeworCQkJCUluc3RhbGxlZENvdW50ID0gMDsKKwkJCQlJbnN0YWxsZWRMaXN0TGVuID0gMDsKKwkJCQlwdHIgPSBscEluc3RhbGxOYW1lcyA9IG1hbGxvYygyMDQ4KTsKKwkJCQlHZXRQcml2YXRlUHJvZmlsZVN0cmluZygibWNpIiwgTlVMTCwgIiIsIGxwSW5zdGFsbE5hbWVzLCAyMDAwLCBTeXNGaWxlKTsKKwkJCQl3aGlsZShzdHJsZW4ocHRyKSA+IDApIHsKKwkJCQkJcHJpbnRmKCItLS0+ICclcycgXG4iLCBwdHIpOworCQkJCQlsZW4gPSBzdHJsZW4ocHRyKSArIDE7CisJCQkJCXB0ciArPSBsZW47CisJCQkJCUluc3RhbGxlZExpc3RMZW4gKz0gbGVuOworCQkJCQlJbnN0YWxsZWRDb3VudCsrOworCQkJCQl9CisJCQkJfQorCQkJaWYgKGxwUGFybXMtPmR3UmV0U2l6ZSA8IEluc3RhbGxlZExpc3RMZW4pIHsKKwkJCQlzdHJuY3B5KGxwc3RyUmV0dXJuLCBscEluc3RhbGxOYW1lcywgbHBQYXJtcy0+ZHdSZXRTaXplIC0gMik7CisJCQkJbHBzdHJSZXR1cm5bbHBQYXJtcy0+ZHdSZXRTaXplIC0gMV0gPSAnXDAnOworCQkJCX0KKwkJCWVsc2UKKwkJCQlzdHJjcHkobHBzdHJSZXR1cm4sIGxwSW5zdGFsbE5hbWVzKTsKKwkJCXJldHVybiAwOworCQljYXNlIE1DSV9TWVNJTkZPX05BTUU6CisJCQlkcHJpbnRmX21jaShzdGRkZWIsICJtY2lTeXNJbmZvIC8vIE1DSV9TWVNJTkZPX05BTUUgXG4iKTsKKwkJCXJldHVybiAwOworCQljYXNlIE1DSV9TWVNJTkZPX09QRU46CisJCQlkcHJpbnRmX21jaShzdGRkZWIsICJtY2lTeXNJbmZvIC8vIE1DSV9TWVNJTkZPX09QRU4gXG4iKTsKKwkJCXJldHVybiAwOworCQl9CisJcmV0dXJuIE1NU1lTRVJSX0lOVkFMUEFSQU07Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiAJCQkJbWNpU291bmQJCQkJW2ludGVybmFsXQorKi8KIERXT1JEIG1jaVNvdW5kKFVJTlQgd0RldklELCBEV09SRCBkd1BhcmFtLCBMUE1DSV9TT1VORF9QQVJNUyBscFBhcm1zKQogewogCWlmIChscFBhcm1zID09IE5VTEwpIHJldHVybiBNQ0lFUlJfSU5URVJOQUw7CkBAIC03NTIsOSArODQ2LDExIEBACiAJCQkJCXdEZXZJRCwgd01zZywgZHdQYXJhbTEsIGR3UGFyYW0yKTsKIAlzd2l0Y2god01zZykgewogCQljYXNlIE1DSV9PUEVOOgotCQkJcmV0dXJuIG1jaU9wZW4oZHdQYXJhbTEsIChMUE1DSV9PUEVOX1BBUk1TKVBUUl9TRUdfVE9fTElOKGR3UGFyYW0yKSk7CisJCQlyZXR1cm4gbWNpT3Blbihkd1BhcmFtMSwgKExQTUNJX09QRU5fUEFSTVMpZHdQYXJhbTIpOwogCQljYXNlIE1DSV9DTE9TRToKIAkJCXJldHVybiBtY2lDbG9zZSh3RGV2SUQsIGR3UGFyYW0xLCAoTFBNQ0lfR0VORVJJQ19QQVJNUylQVFJfU0VHX1RPX0xJTihkd1BhcmFtMikpOworCQljYXNlIE1DSV9TWVNJTkZPOgorCQkJcmV0dXJuIG1jaVN5c0luZm8oZHdQYXJhbTEsIChMUE1DSV9TWVNJTkZPX1BBUk1TKVBUUl9TRUdfVE9fTElOKGR3UGFyYW0yKSk7CiAJCWRlZmF1bHQ6CiAJCQlzd2l0Y2gobWNpRHJ2W3dEZXZJRF0ud1R5cGUpIHsKIAkJCQljYXNlIE1DSV9ERVZUWVBFX0NEX0FVRElPOgpAQCAtNzczLDcgKzg2OSw3IEBACiAJCQkJCXJldHVybiBBTklNX0RyaXZlclByb2MobWNpRHJ2W3dEZXZJRF0ud0RldmljZUlELCBoRHJ2LCAKIAkJCQkJCQkJCQkJd01zZywgZHdQYXJhbTEsIGR3UGFyYW0yKTsKIAkJCQlkZWZhdWx0OgotCQkJCQlwcmludGYoIm1jaVNlbmRDb21tYW5kKCkgLy8gdW5rbm93biB0eXBlPSUwNFggIVxuIiwgCisJCQkJCXByaW50ZigibWNpU2VuZENvbW1hbmQoKSAvLyB1bmtub3duIGRldmljZSB0eXBlPSUwNFggIVxuIiwgCiAJCQkJCQkJCQkJCW1jaURydlt3RGV2SURdLndUeXBlKTsKIAkJCQl9CiAJCX0KQEAgLTkxMSw3ICsxMDA3LDcgQEAKIG1zZyMgMzQzIDogVGhlcmUgYXJlIG5vIE1JREkgZGV2aWNlcyBpbnN0YWxsZWQgb24gdGhlIHN5c3RlbS4gVXNlIHRoZSBEcml2ZXJzIG9wdGlvbiBpbiBDb250cm9sIFBhbmVsIHRvIGluc3RhbGwgdGhlIGRyaXZlci4KICovCiAJCWRlZmF1bHQ6Ci0JCQltc2dwdHIgPSAiVW5rb3duIE1JREkgRXJyb3IgIVxuIjsKKwkJCW1zZ3B0ciA9ICJVbmtub3duIE1JREkgRXJyb3IgIVxuIjsKIAkJCWJyZWFrOwogCQl9CiAJbWF4YnVmID0gbWluKHVTaXplIC0gMSwgc3RybGVuKG1zZ3B0cikpOwpAQCAtOTI4LDYgKzEwMjQsNyBAQAogewogCUhNSURJCWhNaWRpT3V0OwogCUxQTUlESU9QRU5ERVNDCWxwRGVzYzsKKwlMUE1JRElPUEVOREVTQwlscDE2RGVzYzsKIAlEV09SRAlkd1JldCA9IDA7CiAJQk9PTAliTWFwcGVyRmxnID0gRkFMU0U7CiAJaWYgKGxwaE1pZGlPdXQgIT0gTlVMTCkgKmxwaE1pZGlPdXQgPSAwOwpAQCAtOTM4LDE2ICsxMDM1LDE3IEBACiAJCWJNYXBwZXJGbGcgPSBUUlVFOwogCQl1RGV2aWNlSUQgPSAwOwogCQl9Ci0JaE1pZGlPdXQgPSBHbG9iYWxBbGxvYyhHTUVNX01PVkVBQkxFLCBzaXplb2YoTUlESU9QRU5ERVNDKSk7CisJaE1pZGlPdXQgPSBVU0VSX0hFQVBfQUxMT0Moc2l6ZW9mKE1JRElPUEVOREVTQykpOwogCWlmIChscGhNaWRpT3V0ICE9IE5VTEwpICpscGhNaWRpT3V0ID0gaE1pZGlPdXQ7Ci0JbHBEZXNjID0gKExQTUlESU9QRU5ERVNDKSBHbG9iYWxMb2NrKGhNaWRpT3V0KTsKKwlscDE2RGVzYyA9IChMUE1JRElPUEVOREVTQykgVVNFUl9IRUFQX1NFR19BRERSKGhNaWRpT3V0KTsKKwlscERlc2MgPSAoTFBNSURJT1BFTkRFU0MpIFBUUl9TRUdfVE9fTElOKGxwMTZEZXNjKTsKIAlpZiAobHBEZXNjID09IE5VTEwpIHJldHVybiBNTVNZU0VSUl9OT01FTTsKIAlscERlc2MtPmhNaWRpID0gaE1pZGlPdXQ7CiAJbHBEZXNjLT5kd0NhbGxiYWNrID0gZHdDYWxsYmFjazsKIAlscERlc2MtPmR3SW5zdGFuY2UgPSBkd0luc3RhbmNlOwogCXdoaWxlKHVEZXZpY2VJRCA8IE1BWE1JRElEUklWRVJTKSB7CiAJCWR3UmV0ID0gbW9kTWVzc2FnZSh1RGV2aWNlSUQsIE1PRE1fT1BFTiwgCi0JCQlscERlc2MtPmR3SW5zdGFuY2UsIChEV09SRClscERlc2MsIDBMKTsKKwkJCWxwRGVzYy0+ZHdJbnN0YW5jZSwgKERXT1JEKWxwMTZEZXNjLCAwTCk7CiAJCWlmIChkd1JldCA9PSBNTVNZU0VSUl9OT0VSUk9SKSBicmVhazsKIAkJaWYgKCFiTWFwcGVyRmxnKSBicmVhazsKIAkJdURldmljZUlEKys7CkBAIC05NjMsNyArMTA2MSw3IEBACiB7CiAJTFBNSURJT1BFTkRFU0MJbHBEZXNjOwogCXByaW50ZigibWlkaU91dENsb3NlKCUwNFgpXG4iLCBoTWlkaU91dCk7Ci0JbHBEZXNjID0gKExQTUlESU9QRU5ERVNDKSBHbG9iYWxMb2NrKGhNaWRpT3V0KTsKKwlscERlc2MgPSAoTFBNSURJT1BFTkRFU0MpIFVTRVJfSEVBUF9MSU5fQUREUihoTWlkaU91dCk7CiAJaWYgKGxwRGVzYyA9PSBOVUxMKSByZXR1cm4gTU1TWVNFUlJfSU5WQUxIQU5ETEU7CiAJcmV0dXJuIG1vZE1lc3NhZ2UoMCwgTU9ETV9DTE9TRSwgbHBEZXNjLT5kd0luc3RhbmNlLCAwTCwgMEwpOwogfQpAQCAtOTc3LDcgKzEwNzUsNyBAQAogCUxQTUlESU9QRU5ERVNDCWxwRGVzYzsKIAlwcmludGYoIm1pZGlPdXRQcmVwYXJlSGVhZGVyKCUwNFgsICVwLCAlZClcbiIsIAogCQkJCQloTWlkaU91dCwgbHBNaWRpT3V0SGRyLCB1U2l6ZSk7Ci0JbHBEZXNjID0gKExQTUlESU9QRU5ERVNDKSBHbG9iYWxMb2NrKGhNaWRpT3V0KTsKKwlscERlc2MgPSAoTFBNSURJT1BFTkRFU0MpIFVTRVJfSEVBUF9MSU5fQUREUihoTWlkaU91dCk7CiAJaWYgKGxwRGVzYyA9PSBOVUxMKSByZXR1cm4gTU1TWVNFUlJfSU5WQUxIQU5ETEU7CiAJcmV0dXJuIG1vZE1lc3NhZ2UoMCwgTU9ETV9QUkVQQVJFLCBscERlc2MtPmR3SW5zdGFuY2UsIAogCQkJCQkJKERXT1JEKWxwTWlkaU91dEhkciwgKERXT1JEKXVTaXplKTsKQEAgLTk5Miw3ICsxMDkwLDcgQEAKIAlMUE1JRElPUEVOREVTQwlscERlc2M7CiAJcHJpbnRmKCJtaWRpT3V0VW5wcmVwYXJlSGVhZGVyKCUwNFgsICVwLCAlZClcbiIsIAogCQkJCQloTWlkaU91dCwgbHBNaWRpT3V0SGRyLCB1U2l6ZSk7Ci0JbHBEZXNjID0gKExQTUlESU9QRU5ERVNDKSBHbG9iYWxMb2NrKGhNaWRpT3V0KTsKKwlscERlc2MgPSAoTFBNSURJT1BFTkRFU0MpIFVTRVJfSEVBUF9MSU5fQUREUihoTWlkaU91dCk7CiAJaWYgKGxwRGVzYyA9PSBOVUxMKSByZXR1cm4gTU1TWVNFUlJfSU5WQUxIQU5ETEU7CiAJcmV0dXJuIG1vZE1lc3NhZ2UoMCwgTU9ETV9VTlBSRVBBUkUsIGxwRGVzYy0+ZHdJbnN0YW5jZSwgCiAJCQkJCQkoRFdPUkQpbHBNaWRpT3V0SGRyLCAoRFdPUkQpdVNpemUpOwpAQCAtMTAwNSw3ICsxMTAzLDcgQEAKIHsKIAlMUE1JRElPUEVOREVTQwlscERlc2M7CiAJcHJpbnRmKCJtaWRpT3V0U2hvcnRNc2coJTA0WCwgJTA4bFgpXG4iLCBoTWlkaU91dCwgZHdNc2cpOwotCWxwRGVzYyA9IChMUE1JRElPUEVOREVTQykgR2xvYmFsTG9jayhoTWlkaU91dCk7CisJbHBEZXNjID0gKExQTUlESU9QRU5ERVNDKSBVU0VSX0hFQVBfTElOX0FERFIoaE1pZGlPdXQpOwogCWlmIChscERlc2MgPT0gTlVMTCkgcmV0dXJuIE1NU1lTRVJSX0lOVkFMSEFORExFOwogCXJldHVybiBtb2RNZXNzYWdlKDAsIE1PRE1fREFUQSwgbHBEZXNjLT5kd0luc3RhbmNlLCBkd01zZywgMEwpOwogfQpAQCAtMTAxOSw3ICsxMTE3LDcgQEAKIAlMUE1JRElPUEVOREVTQwlscERlc2M7CiAJcHJpbnRmKCJtaWRpT3V0TG9uZ01zZyglMDRYLCAlcCwgJWQpXG4iLCAKIAkJCQloTWlkaU91dCwgbHBNaWRpT3V0SGRyLCB1U2l6ZSk7Ci0JbHBEZXNjID0gKExQTUlESU9QRU5ERVNDKSBHbG9iYWxMb2NrKGhNaWRpT3V0KTsKKwlscERlc2MgPSAoTFBNSURJT1BFTkRFU0MpIFVTRVJfSEVBUF9MSU5fQUREUihoTWlkaU91dCk7CiAJaWYgKGxwRGVzYyA9PSBOVUxMKSByZXR1cm4gTU1TWVNFUlJfSU5WQUxIQU5ETEU7CiAJcmV0dXJuIG1vZE1lc3NhZ2UoMCwgTU9ETV9MT05HREFUQSwgbHBEZXNjLT5kd0luc3RhbmNlLCAKIAkJCQkJCShEV09SRClscE1pZGlPdXRIZHIsIChEV09SRCl1U2l6ZSk7CkBAIC0xMDMwLDggKzExMjgsMTEgQEAKICovCiBVSU5UIFdJTkFQSSBtaWRpT3V0UmVzZXQoSE1JRElPVVQgaE1pZGlPdXQpCiB7Ci0JcHJpbnRmKCJtaWRpT3V0UmVzZXRcbiIpOwotCXJldHVybiAwOworCUxQTUlESU9QRU5ERVNDCWxwRGVzYzsKKwlwcmludGYoIm1pZGlPdXRSZXNldCglMDRYKVxuIiwgaE1pZGlPdXQpOworCWxwRGVzYyA9IChMUE1JRElPUEVOREVTQykgVVNFUl9IRUFQX0xJTl9BRERSKGhNaWRpT3V0KTsKKwlpZiAobHBEZXNjID09IE5VTEwpIHJldHVybiBNTVNZU0VSUl9JTlZBTEhBTkRMRTsKKwlyZXR1cm4gbW9kTWVzc2FnZSgwLCBNT0RNX1JFU0VULCBscERlc2MtPmR3SW5zdGFuY2UsIDBMLCAwTCk7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtMTAzOSw3ICsxMTQwLDggQEAKICovCiBVSU5UIFdJTkFQSSBtaWRpT3V0R2V0Vm9sdW1lKFVJTlQgdURldmljZUlELCBEV09SRCBGQVIqIGxwZHdWb2x1bWUpCiB7Ci0JcHJpbnRmKCJtaWRpT3V0R2V0Vm9sdW1lXG4iKTsKKwlwcmludGYoIm1pZGlPdXRHZXRWb2x1bWUoJTA0WCwgJXApO1xuIiwgdURldmljZUlELCBscGR3Vm9sdW1lKTsKKwlyZXR1cm4gbW9kTWVzc2FnZSh1RGV2aWNlSUQsIE1PRE1fR0VUVk9MVU1FLCAwTCwgKERXT1JEKWxwZHdWb2x1bWUsIDBMKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTA0OCw3ICsxMTUwLDggQEAKICovCiBVSU5UIFdJTkFQSSBtaWRpT3V0U2V0Vm9sdW1lKFVJTlQgdURldmljZUlELCBEV09SRCBkd1ZvbHVtZSkKIHsKLQlwcmludGYoIm1pZGlPdXRTZXRWb2x1bWVcbiIpOworCXByaW50ZigibWlkaU91dFNldFZvbHVtZSglMDRYLCAlMDhsWCk7XG4iLCB1RGV2aWNlSUQsIGR3Vm9sdW1lKTsKKwlyZXR1cm4gbW9kTWVzc2FnZSh1RGV2aWNlSUQsIE1PRE1fU0VUVk9MVU1FLCAwTCwgZHdWb2x1bWUsIDBMKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTA5MCw3ICsxMTkzLDcgQEAKIAlMUE1JRElPUEVOREVTQwlscERlc2M7CiAJcHJpbnRmKCJtaWRpT3V0TWVzc2FnZSglMDRYLCAlMDRYLCAlMDhsWCwgJTA4bFgpXG4iLCAKIAkJCWhNaWRpT3V0LCB1TWVzc2FnZSwgZHdQYXJhbTEsIGR3UGFyYW0yKTsKLQlscERlc2MgPSAoTFBNSURJT1BFTkRFU0MpIEdsb2JhbExvY2soaE1pZGlPdXQpOworCWxwRGVzYyA9IChMUE1JRElPUEVOREVTQykgVVNFUl9IRUFQX0xJTl9BRERSKGhNaWRpT3V0KTsKIAlpZiAobHBEZXNjID09IE5VTEwpIHJldHVybiBNTVNZU0VSUl9JTlZBTEhBTkRMRTsKIAlyZXR1cm4gbW9kTWVzc2FnZSgwLCB1TWVzc2FnZSwgbHBEZXNjLT5kd0luc3RhbmNlLCBkd1BhcmFtMSwgZHdQYXJhbTIpOwogCXJldHVybiAwOwpAQCAtMTEwMSw4ICsxMjA0LDExIEBACiAqLwogVUlOVCBXSU5BUEkgbWlkaUluR2V0TnVtRGV2cyh2b2lkKQogeworCVVJTlQJY291bnQgPSAwOwogCXByaW50ZigibWlkaUluR2V0TnVtRGV2c1xuIik7Ci0JcmV0dXJuIDA7CisJY291bnQgKz0gbWlkTWVzc2FnZSgwLCBNSURNX0dFVE5VTURFVlMsIDBMLCAwTCwgMEwpOworCXByaW50ZigibWlkaUluR2V0TnVtRGV2cyByZXR1cm4gJXUgXG4iLCBjb3VudCk7CisJcmV0dXJuIGNvdW50OwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTExMzIsNiArMTIzOCw3IEBACiB7CiAJSE1JREkJaE1pZGlJbjsKIAlMUE1JRElPUEVOREVTQwlscERlc2M7CisJTFBNSURJT1BFTkRFU0MJbHAxNkRlc2M7CiAJRFdPUkQJZHdSZXQgPSAwOwogCUJPT0wJYk1hcHBlckZsZyA9IEZBTFNFOwogCWlmIChscGhNaWRpSW4gIT0gTlVMTCkgKmxwaE1pZGlJbiA9IDA7CkBAIC0xMTQyLDkgKzEyNDksMTAgQEAKIAkJYk1hcHBlckZsZyA9IFRSVUU7CiAJCXVEZXZpY2VJRCA9IDA7CiAJCX0KLQloTWlkaUluID0gR2xvYmFsQWxsb2MoR01FTV9NT1ZFQUJMRSwgc2l6ZW9mKE1JRElPUEVOREVTQykpOworCWhNaWRpSW4gPSBVU0VSX0hFQVBfQUxMT0Moc2l6ZW9mKE1JRElPUEVOREVTQykpOwogCWlmIChscGhNaWRpSW4gIT0gTlVMTCkgKmxwaE1pZGlJbiA9IGhNaWRpSW47Ci0JbHBEZXNjID0gKExQTUlESU9QRU5ERVNDKSBHbG9iYWxMb2NrKGhNaWRpSW4pOworCWxwMTZEZXNjID0gKExQTUlESU9QRU5ERVNDKSBVU0VSX0hFQVBfU0VHX0FERFIoaE1pZGlJbik7CisJbHBEZXNjID0gKExQTUlESU9QRU5ERVNDKSBQVFJfU0VHX1RPX0xJTihscDE2RGVzYyk7CiAJaWYgKGxwRGVzYyA9PSBOVUxMKSByZXR1cm4gTU1TWVNFUlJfTk9NRU07CiAJbHBEZXNjLT5oTWlkaSA9IGhNaWRpSW47CiAJbHBEZXNjLT5kd0NhbGxiYWNrID0gZHdDYWxsYmFjazsKQEAgLTExNjcsNyArMTI3NSw3IEBACiB7CiAJTFBNSURJT1BFTkRFU0MJbHBEZXNjOwogCXByaW50ZigibWlkaUluQ2xvc2UoJTA0WClcbiIsIGhNaWRpSW4pOwotCWxwRGVzYyA9IChMUE1JRElPUEVOREVTQykgR2xvYmFsTG9jayhoTWlkaUluKTsKKwlscERlc2MgPSAoTFBNSURJT1BFTkRFU0MpIFVTRVJfSEVBUF9MSU5fQUREUihoTWlkaUluKTsKIAlpZiAobHBEZXNjID09IE5VTEwpIHJldHVybiBNTVNZU0VSUl9JTlZBTEhBTkRMRTsKIAlyZXR1cm4gbWlkTWVzc2FnZSgwLCBNSURNX0NMT1NFLCBscERlc2MtPmR3SW5zdGFuY2UsIDBMLCAwTCk7CiB9CkBAIC0xMTgxLDcgKzEyODksNyBAQAogCUxQTUlESU9QRU5ERVNDCWxwRGVzYzsKIAlwcmludGYoIm1pZGlJblByZXBhcmVIZWFkZXIoJTA0WCwgJXAsICVkKVxuIiwgCiAJCQkJCWhNaWRpSW4sIGxwTWlkaUluSGRyLCB1U2l6ZSk7Ci0JbHBEZXNjID0gKExQTUlESU9QRU5ERVNDKSBHbG9iYWxMb2NrKGhNaWRpSW4pOworCWxwRGVzYyA9IChMUE1JRElPUEVOREVTQykgVVNFUl9IRUFQX0xJTl9BRERSKGhNaWRpSW4pOwogCWlmIChscERlc2MgPT0gTlVMTCkgcmV0dXJuIE1NU1lTRVJSX0lOVkFMSEFORExFOwogCXJldHVybiBtaWRNZXNzYWdlKDAsIE1JRE1fUFJFUEFSRSwgbHBEZXNjLT5kd0luc3RhbmNlLCAKIAkJCQkJCShEV09SRClscE1pZGlJbkhkciwgKERXT1JEKXVTaXplKTsKQEAgLTExOTYsNyArMTMwNCw3IEBACiAJTFBNSURJT1BFTkRFU0MJbHBEZXNjOwogCXByaW50ZigibWlkaUluVW5wcmVwYXJlSGVhZGVyKCUwNFgsICVwLCAlZClcbiIsIAogCQkJCQloTWlkaUluLCBscE1pZGlJbkhkciwgdVNpemUpOwotCWxwRGVzYyA9IChMUE1JRElPUEVOREVTQykgR2xvYmFsTG9jayhoTWlkaUluKTsKKwlscERlc2MgPSAoTFBNSURJT1BFTkRFU0MpIFVTRVJfSEVBUF9MSU5fQUREUihoTWlkaUluKTsKIAlpZiAobHBEZXNjID09IE5VTEwpIHJldHVybiBNTVNZU0VSUl9JTlZBTEhBTkRMRTsKIAlyZXR1cm4gbWlkTWVzc2FnZSgwLCBNSURNX1VOUFJFUEFSRSwgbHBEZXNjLT5kd0luc3RhbmNlLCAKIAkJCQkJCShEV09SRClscE1pZGlJbkhkciwgKERXT1JEKXVTaXplKTsKQEAgLTEyNTcsNyArMTM2NSw3IEBACiAJTFBNSURJT1BFTkRFU0MJbHBEZXNjOwogCXByaW50ZigibWlkaUluTWVzc2FnZSglMDRYLCAlMDRYLCAlMDhsWCwgJTA4bFgpXG4iLCAKIAkJCWhNaWRpSW4sIHVNZXNzYWdlLCBkd1BhcmFtMSwgZHdQYXJhbTIpOwotCWxwRGVzYyA9IChMUE1JRElPUEVOREVTQykgR2xvYmFsTG9jayhoTWlkaUluKTsKKwlscERlc2MgPSAoTFBNSURJT1BFTkRFU0MpIFVTRVJfSEVBUF9MSU5fQUREUihoTWlkaUluKTsKIAlpZiAobHBEZXNjID09IE5VTEwpIHJldHVybiBNTVNZU0VSUl9JTlZBTEhBTkRMRTsKIAlyZXR1cm4gbWlkTWVzc2FnZSgwLCB1TWVzc2FnZSwgbHBEZXNjLT5kd0luc3RhbmNlLCBkd1BhcmFtMSwgZHdQYXJhbTIpOwogfQpAQCAtMTM1NCw3ICsxNDYyLDcgQEAKIAkJCW1zZ3B0ciA9ICJDYW5ub3Qgb3BlbiB0aGUgZGV2aWNlIHdpdGhvdXQgdXNpbmcgdGhlIFdBVkVfQUxMT1dTWU5DIGZsYWcuIFVzZSB0aGUgZmxhZywgYW5kIHRoZW4gdHJ5IGFnYWluLiI7CiAJCQlicmVhazsKIAkJZGVmYXVsdDoKLQkJCW1zZ3B0ciA9ICJVbmtvd24gTU1TWVNURU0gRXJyb3IgIVxuIjsKKwkJCW1zZ3B0ciA9ICJVbmtub3duIE1NU1lTVEVNIEVycm9yICFcbiI7CiAJCQlicmVhazsKIAkJfQogCW1heGJ1ZiA9IG1pbih1U2l6ZSAtIDEsIHN0cmxlbihtc2dwdHIpKTsKQEAgLTEzNzEsNiArMTQ3OSw3IEBACiB7CiAJSFdBVkUJaFdhdmVPdXQ7CiAJTFBXQVZFT1BFTkRFU0MJbHBEZXNjOworCUxQV0FWRU9QRU5ERVNDCWxwMTZEZXNjOwogCURXT1JECWR3UmV0ID0gMDsKIAlCT09MCWJNYXBwZXJGbGcgPSBGQUxTRTsKIAlwcmludGYoIndhdmVPdXRPcGVuKCVwLCAlZCwgJXAsICUwOGxYLCAlMDhsWCwgJTA4bFgpO1xuIiwgCkBAIC0xMzg0LDkgKzE0OTMsMTAgQEAKIAkJdURldmljZUlEID0gMDsKIAkJfQogCWlmIChscEZvcm1hdCA9PSBOVUxMKSByZXR1cm4gV0FWRVJSX0JBREZPUk1BVDsKLQloV2F2ZU91dCA9IEdsb2JhbEFsbG9jKEdNRU1fTU9WRUFCTEUsIHNpemVvZihXQVZFT1BFTkRFU0MpKTsKKwloV2F2ZU91dCA9IFVTRVJfSEVBUF9BTExPQyhzaXplb2YoV0FWRU9QRU5ERVNDKSk7CiAJaWYgKGxwaFdhdmVPdXQgIT0gTlVMTCkgKmxwaFdhdmVPdXQgPSBoV2F2ZU91dDsKLQlscERlc2MgPSAoTFBXQVZFT1BFTkRFU0MpIEdsb2JhbExvY2soaFdhdmVPdXQpOworCWxwMTZEZXNjID0gKExQV0FWRU9QRU5ERVNDKSBVU0VSX0hFQVBfU0VHX0FERFIoaFdhdmVPdXQpOworCWxwRGVzYyA9IChMUFdBVkVPUEVOREVTQykgUFRSX1NFR19UT19MSU4obHAxNkRlc2MpOwogCWlmIChscERlc2MgPT0gTlVMTCkgcmV0dXJuIE1NU1lTRVJSX05PTUVNOwogCWxwRGVzYy0+aFdhdmUgPSBoV2F2ZU91dDsKIAlscERlc2MtPmxwRm9ybWF0ID0gbHBGb3JtYXQ7CkBAIC0xMzk0LDcgKzE1MDQsNyBAQAogCWxwRGVzYy0+ZHdJbnN0YW5jZSA9IGR3SW5zdGFuY2U7CiAJd2hpbGUodURldmljZUlEIDwgTUFYV0FWRURSSVZFUlMpIHsKIAkJZHdSZXQgPSB3b2RNZXNzYWdlKHVEZXZpY2VJRCwgV09ETV9PUEVOLCAKLQkJCWxwRGVzYy0+ZHdJbnN0YW5jZSwgKERXT1JEKWxwRGVzYywgMEwpOworCQkJbHBEZXNjLT5kd0luc3RhbmNlLCAoRFdPUkQpbHAxNkRlc2MsIDBMKTsKIAkJaWYgKGR3UmV0ID09IE1NU1lTRVJSX05PRVJST1IpIGJyZWFrOwogCQlpZiAoIWJNYXBwZXJGbGcpIGJyZWFrOwogCQl1RGV2aWNlSUQrKzsKQEAgLTE0MTQsNyArMTUyNCw3IEBACiB7CiAJTFBXQVZFT1BFTkRFU0MJbHBEZXNjOwogCXByaW50Zigid2F2ZU91dENsb3NlKCUwNFgpXG4iLCBoV2F2ZU91dCk7Ci0JbHBEZXNjID0gKExQV0FWRU9QRU5ERVNDKSBHbG9iYWxMb2NrKGhXYXZlT3V0KTsKKwlscERlc2MgPSAoTFBXQVZFT1BFTkRFU0MpIFVTRVJfSEVBUF9MSU5fQUREUihoV2F2ZU91dCk7CiAJaWYgKGxwRGVzYyA9PSBOVUxMKSByZXR1cm4gTU1TWVNFUlJfSU5WQUxIQU5ETEU7CiAJcmV0dXJuIHdvZE1lc3NhZ2UoMCwgV09ETV9DTE9TRSwgbHBEZXNjLT5kd0luc3RhbmNlLCAwTCwgMEwpOwogfQpAQCAtMTQyOCw3ICsxNTM4LDcgQEAKIAlMUFdBVkVPUEVOREVTQwlscERlc2M7CiAJcHJpbnRmKCJ3YXZlT3V0UHJlcGFyZUhlYWRlciglMDRYLCAlcCwgJXUpO1xuIiwgCiAJCQkJCWhXYXZlT3V0LCBscFdhdmVPdXRIZHIsIHVTaXplKTsKLQlscERlc2MgPSAoTFBXQVZFT1BFTkRFU0MpIEdsb2JhbExvY2soaFdhdmVPdXQpOworCWxwRGVzYyA9IChMUFdBVkVPUEVOREVTQykgVVNFUl9IRUFQX0xJTl9BRERSKGhXYXZlT3V0KTsKIAlpZiAobHBEZXNjID09IE5VTEwpIHJldHVybiBNTVNZU0VSUl9JTlZBTEhBTkRMRTsKIAlyZXR1cm4gd29kTWVzc2FnZSgwLCBXT0RNX1BSRVBBUkUsIGxwRGVzYy0+ZHdJbnN0YW5jZSwgCiAJCQkJCQkJKERXT1JEKWxwV2F2ZU91dEhkciwgdVNpemUpOwpAQCAtMTQ0Myw5ICsxNTUzLDkgQEAKIAlMUFdBVkVPUEVOREVTQwlscERlc2M7CiAJcHJpbnRmKCJ3YXZlT3V0VW5wcmVwYXJlSGVhZGVyKCUwNFgsICVwLCAldSk7XG4iLCAKIAkJCQkJCWhXYXZlT3V0LCBscFdhdmVPdXRIZHIsIHVTaXplKTsKLQlscERlc2MgPSAoTFBXQVZFT1BFTkRFU0MpIEdsb2JhbExvY2soaFdhdmVPdXQpOworCWxwRGVzYyA9IChMUFdBVkVPUEVOREVTQykgVVNFUl9IRUFQX0xJTl9BRERSKGhXYXZlT3V0KTsKIAlpZiAobHBEZXNjID09IE5VTEwpIHJldHVybiBNTVNZU0VSUl9JTlZBTEhBTkRMRTsKLQlyZXR1cm4gd29kTWVzc2FnZSgwLCBXT0RNX1BSRVBBUkUsIGxwRGVzYy0+ZHdJbnN0YW5jZSwgCisJcmV0dXJuIHdvZE1lc3NhZ2UoMCwgV09ETV9VTlBSRVBBUkUsIGxwRGVzYy0+ZHdJbnN0YW5jZSwgCiAJCQkJCQkJKERXT1JEKWxwV2F2ZU91dEhkciwgdVNpemUpOwogfQogCkBAIC0xNDU2LDcgKzE1NjYsNyBAQAogewogCUxQV0FWRU9QRU5ERVNDCWxwRGVzYzsKIAlwcmludGYoIndhdmVPdXRXcml0ZSglMDRYLCAlcCwgJXUpO1xuIiwgaFdhdmVPdXQsIGxwV2F2ZU91dEhkciwgdVNpemUpOwotCWxwRGVzYyA9IChMUFdBVkVPUEVOREVTQykgR2xvYmFsTG9jayhoV2F2ZU91dCk7CisJbHBEZXNjID0gKExQV0FWRU9QRU5ERVNDKSBVU0VSX0hFQVBfTElOX0FERFIoaFdhdmVPdXQpOwogCWlmIChscERlc2MgPT0gTlVMTCkgcmV0dXJuIE1NU1lTRVJSX0lOVkFMSEFORExFOwogCXJldHVybiB3b2RNZXNzYWdlKDAsIFdPRE1fV1JJVEUsIGxwRGVzYy0+ZHdJbnN0YW5jZSwgCiAJCQkJCQkJKERXT1JEKWxwV2F2ZU91dEhkciwgdVNpemUpOwpAQCAtMTQ2Nyw4ICsxNTc3LDExIEBACiAqLwogVUlOVCBXSU5BUEkgd2F2ZU91dFBhdXNlKEhXQVZFT1VUIGhXYXZlT3V0KQogeworCUxQV0FWRU9QRU5ERVNDCWxwRGVzYzsKIAlwcmludGYoIndhdmVPdXRQYXVzZSglMDRYKVxuIiwgaFdhdmVPdXQpOwotCXJldHVybiBNTVNZU0VSUl9JTlZBTEhBTkRMRTsKKwlscERlc2MgPSAoTFBXQVZFT1BFTkRFU0MpIFVTRVJfSEVBUF9MSU5fQUREUihoV2F2ZU91dCk7CisJaWYgKGxwRGVzYyA9PSBOVUxMKSByZXR1cm4gTU1TWVNFUlJfSU5WQUxIQU5ETEU7CisJcmV0dXJuIHdvZE1lc3NhZ2UoMCwgV09ETV9QQVVTRSwgbHBEZXNjLT5kd0luc3RhbmNlLCAwTCwgMEwpOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTE0NzYsOCArMTU4OSwxMSBAQAogKi8KIFVJTlQgV0lOQVBJIHdhdmVPdXRSZXN0YXJ0KEhXQVZFT1VUIGhXYXZlT3V0KQogeworCUxQV0FWRU9QRU5ERVNDCWxwRGVzYzsKIAlwcmludGYoIndhdmVPdXRSZXN0YXJ0KCUwNFgpXG4iLCBoV2F2ZU91dCk7Ci0JcmV0dXJuIE1NU1lTRVJSX0lOVkFMSEFORExFOworCWxwRGVzYyA9IChMUFdBVkVPUEVOREVTQykgVVNFUl9IRUFQX0xJTl9BRERSKGhXYXZlT3V0KTsKKwlpZiAobHBEZXNjID09IE5VTEwpIHJldHVybiBNTVNZU0VSUl9JTlZBTEhBTkRMRTsKKwlyZXR1cm4gd29kTWVzc2FnZSgwLCBXT0RNX1JFU1RBUlQsIGxwRGVzYy0+ZHdJbnN0YW5jZSwgMEwsIDBMKTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0xNDg1LDggKzE2MDEsMTEgQEAKICovCiBVSU5UIFdJTkFQSSB3YXZlT3V0UmVzZXQoSFdBVkVPVVQgaFdhdmVPdXQpCiB7CisJTFBXQVZFT1BFTkRFU0MJbHBEZXNjOwogCXByaW50Zigid2F2ZU91dFJlc2V0KCUwNFgpXG4iLCBoV2F2ZU91dCk7Ci0JcmV0dXJuIE1NU1lTRVJSX0lOVkFMSEFORExFOworCWxwRGVzYyA9IChMUFdBVkVPUEVOREVTQykgVVNFUl9IRUFQX0xJTl9BRERSKGhXYXZlT3V0KTsKKwlpZiAobHBEZXNjID09IE5VTEwpIHJldHVybiBNTVNZU0VSUl9JTlZBTEhBTkRMRTsKKwlyZXR1cm4gd29kTWVzc2FnZSgwLCBXT0RNX1JFU0VULCBscERlc2MtPmR3SW5zdGFuY2UsIDBMLCAwTCk7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtMTQ5Niw3ICsxNjE1LDcgQEAKIHsKIAlMUFdBVkVPUEVOREVTQwlscERlc2M7CiAJcHJpbnRmKCJ3YXZlT3V0R2V0UG9zaXRpb24oJTA0WCwgJXAsICV1KTtcbiIsIGhXYXZlT3V0LCBscFRpbWUsIHVTaXplKTsKLQlscERlc2MgPSAoTFBXQVZFT1BFTkRFU0MpIEdsb2JhbExvY2soaFdhdmVPdXQpOworCWxwRGVzYyA9IChMUFdBVkVPUEVOREVTQykgVVNFUl9IRUFQX0xJTl9BRERSKGhXYXZlT3V0KTsKIAlpZiAobHBEZXNjID09IE5VTEwpIHJldHVybiBNTVNZU0VSUl9JTlZBTEhBTkRMRTsKIAlyZXR1cm4gd29kTWVzc2FnZSgwLCBXT0RNX0dFVFBPUywgbHBEZXNjLT5kd0luc3RhbmNlLCAKIAkJCQkJCQkoRFdPUkQpbHBUaW1lLCAoRFdPUkQpdVNpemUpOwpAQCAtMTUwNyw4ICsxNjI2LDEyIEBACiAqLwogVUlOVCBXSU5BUEkgd2F2ZU91dEdldFBpdGNoKEhXQVZFT1VUIGhXYXZlT3V0LCBEV09SRCBGQVIqIGxwZHdQaXRjaCkKIHsKLQlwcmludGYoIndhdmVPdXRHZXRQaXRjaFxuIik7Ci0JcmV0dXJuIE1NU1lTRVJSX0lOVkFMSEFORExFOworCUxQV0FWRU9QRU5ERVNDCWxwRGVzYzsKKwlwcmludGYoIndhdmVPdXRHZXRQaXRjaCglMDRYLCAlcCk7XG4iLCBoV2F2ZU91dCwgbHBkd1BpdGNoKTsKKwlscERlc2MgPSAoTFBXQVZFT1BFTkRFU0MpIFVTRVJfSEVBUF9MSU5fQUREUihoV2F2ZU91dCk7CisJaWYgKGxwRGVzYyA9PSBOVUxMKSByZXR1cm4gTU1TWVNFUlJfSU5WQUxIQU5ETEU7CisJcmV0dXJuIHdvZE1lc3NhZ2UoMCwgV09ETV9HRVRQSVRDSCwgbHBEZXNjLT5kd0luc3RhbmNlLCAKKwkJCQkJCQkJKERXT1JEKWxwZHdQaXRjaCwgMEwpOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTE1MTYsOCArMTYzOSwxMSBAQAogKi8KIFVJTlQgV0lOQVBJIHdhdmVPdXRTZXRQaXRjaChIV0FWRU9VVCBoV2F2ZU91dCwgRFdPUkQgZHdQaXRjaCkKIHsKLQlwcmludGYoIndhdmVPdXRTZXRQaXRjaFxuIik7Ci0JcmV0dXJuIE1NU1lTRVJSX0lOVkFMSEFORExFOworCUxQV0FWRU9QRU5ERVNDCWxwRGVzYzsKKwlwcmludGYoIndhdmVPdXRTZXRQaXRjaCglMDRYLCAlMDhsWCk7XG4iLCBoV2F2ZU91dCwgZHdQaXRjaCk7CisJbHBEZXNjID0gKExQV0FWRU9QRU5ERVNDKSBVU0VSX0hFQVBfTElOX0FERFIoaFdhdmVPdXQpOworCWlmIChscERlc2MgPT0gTlVMTCkgcmV0dXJuIE1NU1lTRVJSX0lOVkFMSEFORExFOworCXJldHVybiB3b2RNZXNzYWdlKDAsIFdPRE1fU0VUUElUQ0gsIGxwRGVzYy0+ZHdJbnN0YW5jZSwgKERXT1JEKWR3UGl0Y2gsIDBMKTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0xNTI1LDggKzE2NTEsOCBAQAogKi8KIFVJTlQgV0lOQVBJIHdhdmVPdXRHZXRWb2x1bWUoVUlOVCB1RGV2aWNlSUQsIERXT1JEIEZBUiogbHBkd1ZvbHVtZSkKIHsKLQlwcmludGYoIndhdmVPdXRHZXRWb2x1bWVcbiIpOwotCXJldHVybiBNTVNZU0VSUl9JTlZBTEhBTkRMRTsKKwlwcmludGYoIndhdmVPdXRHZXRWb2x1bWUoJTA0WCwgJXApO1xuIiwgdURldmljZUlELCBscGR3Vm9sdW1lKTsKKwlyZXR1cm4gd29kTWVzc2FnZSh1RGV2aWNlSUQsIFdPRE1fR0VUVk9MVU1FLCAwTCwgKERXT1JEKWxwZHdWb2x1bWUsIDBMKTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0xNTM0LDggKzE2NjAsOCBAQAogKi8KIFVJTlQgV0lOQVBJIHdhdmVPdXRTZXRWb2x1bWUoVUlOVCB1RGV2aWNlSUQsIERXT1JEIGR3Vm9sdW1lKQogewotCXByaW50Zigid2F2ZU91dFNldFZvbHVtZVxuIik7Ci0JcmV0dXJuIE1NU1lTRVJSX0lOVkFMSEFORExFOworCXByaW50Zigid2F2ZU91dFNldFZvbHVtZSglMDRYLCAlMDhsWCk7XG4iLCB1RGV2aWNlSUQsIGR3Vm9sdW1lKTsKKwlyZXR1cm4gd29kTWVzc2FnZSh1RGV2aWNlSUQsIFdPRE1fU0VUVk9MVU1FLCAwTCwgZHdWb2x1bWUsIDBMKTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0xNTQzLDggKzE2NjksMTIgQEAKICovCiBVSU5UIFdJTkFQSSB3YXZlT3V0R2V0UGxheWJhY2tSYXRlKEhXQVZFT1VUIGhXYXZlT3V0LCBEV09SRCBGQVIqIGxwZHdSYXRlKQogewotCXByaW50Zigid2F2ZU91dEdldFBsYXliYWNrUmF0ZVxuIik7Ci0JcmV0dXJuIE1NU1lTRVJSX0lOVkFMSEFORExFOworCUxQV0FWRU9QRU5ERVNDCWxwRGVzYzsKKwlwcmludGYoIndhdmVPdXRHZXRQbGF5YmFja1JhdGUoJTA0WCwgJXApO1xuIiwgaFdhdmVPdXQsIGxwZHdSYXRlKTsKKwlscERlc2MgPSAoTFBXQVZFT1BFTkRFU0MpIFVTRVJfSEVBUF9MSU5fQUREUihoV2F2ZU91dCk7CisJaWYgKGxwRGVzYyA9PSBOVUxMKSByZXR1cm4gTU1TWVNFUlJfSU5WQUxIQU5ETEU7CisJcmV0dXJuIHdvZE1lc3NhZ2UoMCwgV09ETV9HRVRQTEFZQkFDS1JBVEUsIGxwRGVzYy0+ZHdJbnN0YW5jZSwgCisJCQkJCQkJCShEV09SRClscGR3UmF0ZSwgMEwpOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTE1NTIsOCArMTY4MiwxMiBAQAogKi8KIFVJTlQgV0lOQVBJIHdhdmVPdXRTZXRQbGF5YmFja1JhdGUoSFdBVkVPVVQgaFdhdmVPdXQsIERXT1JEIGR3UmF0ZSkKIHsKLQlwcmludGYoIndhdmVPdXRTZXRQbGF5YmFja1JhdGVcbiIpOwotCXJldHVybiBNTVNZU0VSUl9JTlZBTEhBTkRMRTsKKwlMUFdBVkVPUEVOREVTQwlscERlc2M7CisJcHJpbnRmKCJ3YXZlT3V0U2V0UGxheWJhY2tSYXRlKCUwNFgsICUwOGxYKTtcbiIsIGhXYXZlT3V0LCBkd1JhdGUpOworCWxwRGVzYyA9IChMUFdBVkVPUEVOREVTQykgVVNFUl9IRUFQX0xJTl9BRERSKGhXYXZlT3V0KTsKKwlpZiAobHBEZXNjID09IE5VTEwpIHJldHVybiBNTVNZU0VSUl9JTlZBTEhBTkRMRTsKKwlyZXR1cm4gd29kTWVzc2FnZSgwLCBXT0RNX1NFVFBMQVlCQUNLUkFURSwgCisJCWxwRGVzYy0+ZHdJbnN0YW5jZSwgKERXT1JEKWR3UmF0ZSwgMEwpOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTE1NzAsOCArMTcwNCwxNSBAQAogKi8KIFVJTlQgV0lOQVBJIHdhdmVPdXRHZXRJRChIV0FWRU9VVCBoV2F2ZU91dCwgVUlOVCBGQVIqIGxwdURldmljZUlEKQogewotCXByaW50Zigid2F2ZU91dEdldElEXG4iKTsKLQlyZXR1cm4gTU1TWVNFUlJfSU5WQUxIQU5ETEU7CisJTFBXQVZFT1BFTkRFU0MJbHBEZXNjOworCXByaW50Zigid2F2ZU91dEdldElEKCUwNFgsICVwKTtcbiIsIGhXYXZlT3V0LCBscHVEZXZpY2VJRCk7CisJbHBEZXNjID0gKExQV0FWRU9QRU5ERVNDKSBVU0VSX0hFQVBfTElOX0FERFIoaFdhdmVPdXQpOworCWlmIChscERlc2MgPT0gTlVMTCkgcmV0dXJuIE1NU1lTRVJSX0lOVkFMSEFORExFOworCWlmIChscHVEZXZpY2VJRCA9PSBOVUxMKSByZXR1cm4gTU1TWVNFUlJfSU5WQUxIQU5ETEU7CisvKgorCSpscHVEZXZpY2VJRCA9IGxwUGFybXMtPndEZXZpY2VJRDsgCisqLworCXJldHVybiAwOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTE1ODMsNyArMTcyNCw3IEBACiAJTFBXQVZFT1BFTkRFU0MJbHBEZXNjOwogCXByaW50Zigid2F2ZU91dE1lc3NhZ2UoJTA0WCwgJTA0WCwgJTA4bFgsICUwOGxYKVxuIiwgCiAJCQloV2F2ZU91dCwgdU1lc3NhZ2UsIGR3UGFyYW0xLCBkd1BhcmFtMik7Ci0JbHBEZXNjID0gKExQV0FWRU9QRU5ERVNDKSBHbG9iYWxMb2NrKGhXYXZlT3V0KTsKKwlscERlc2MgPSAoTFBXQVZFT1BFTkRFU0MpIFVTRVJfSEVBUF9MSU5fQUREUihoV2F2ZU91dCk7CiAJaWYgKGxwRGVzYyA9PSBOVUxMKSByZXR1cm4gTU1TWVNFUlJfSU5WQUxIQU5ETEU7CiAJcmV0dXJuIHdvZE1lc3NhZ2UoMCwgdU1lc3NhZ2UsIGxwRGVzYy0+ZHdJbnN0YW5jZSwgZHdQYXJhbTEsIGR3UGFyYW0yKTsKIH0KQEAgLTE2MjksNiArMTc3MCw3IEBACiB7CiAJSFdBVkUJaFdhdmVJbjsKIAlMUFdBVkVPUEVOREVTQwlscERlc2M7CisJTFBXQVZFT1BFTkRFU0MJbHAxNkRlc2M7CiAJRFdPUkQJZHdSZXQgPSAwOwogCUJPT0wJYk1hcHBlckZsZyA9IEZBTFNFOwogCXByaW50Zigid2F2ZUluT3BlbiglcCwgJWQsICVwLCAlMDhsWCwgJTA4bFgsICUwOGxYKTtcbiIsIApAQCAtMTY0Miw5ICsxNzg0LDEwIEBACiAJCXVEZXZpY2VJRCA9IDA7CiAJCX0KIAlpZiAobHBGb3JtYXQgPT0gTlVMTCkgcmV0dXJuIFdBVkVSUl9CQURGT1JNQVQ7Ci0JaFdhdmVJbiA9IEdsb2JhbEFsbG9jKEdNRU1fTU9WRUFCTEUsIHNpemVvZihXQVZFT1BFTkRFU0MpKTsKKwloV2F2ZUluID0gVVNFUl9IRUFQX0FMTE9DKHNpemVvZihXQVZFT1BFTkRFU0MpKTsKIAlpZiAobHBoV2F2ZUluICE9IE5VTEwpICpscGhXYXZlSW4gPSBoV2F2ZUluOwotCWxwRGVzYyA9IChMUFdBVkVPUEVOREVTQykgR2xvYmFsTG9jayhoV2F2ZUluKTsKKwlscDE2RGVzYyA9IChMUFdBVkVPUEVOREVTQykgVVNFUl9IRUFQX1NFR19BRERSKGhXYXZlSW4pOworCWxwRGVzYyA9IChMUFdBVkVPUEVOREVTQykgUFRSX1NFR19UT19MSU4obHAxNkRlc2MpOwogCWlmIChscERlc2MgPT0gTlVMTCkgcmV0dXJuIE1NU1lTRVJSX05PTUVNOwogCWxwRGVzYy0+aFdhdmUgPSBoV2F2ZUluOwogCWxwRGVzYy0+bHBGb3JtYXQgPSBscEZvcm1hdDsKQEAgLTE2NTIsNyArMTc5NSw3IEBACiAJbHBEZXNjLT5kd0luc3RhbmNlID0gZHdJbnN0YW5jZTsKIAl3aGlsZSh1RGV2aWNlSUQgPCBNQVhXQVZFRFJJVkVSUykgewogCQlkd1JldCA9IHdpZE1lc3NhZ2UodURldmljZUlELCBXSURNX09QRU4sIAotCQkJbHBEZXNjLT5kd0luc3RhbmNlLCAoRFdPUkQpbHBEZXNjLCAwTCk7CisJCQlscERlc2MtPmR3SW5zdGFuY2UsIChEV09SRClscDE2RGVzYywgMEwpOwogCQlpZiAoZHdSZXQgPT0gTU1TWVNFUlJfTk9FUlJPUikgYnJlYWs7CiAJCWlmICghYk1hcHBlckZsZykgYnJlYWs7CiAJCXVEZXZpY2VJRCsrOwpAQCAtMTY3Myw3ICsxODE2LDcgQEAKIHsKIAlMUFdBVkVPUEVOREVTQwlscERlc2M7CiAJcHJpbnRmKCJ3YXZlSW5DbG9zZSglMDRYKVxuIiwgaFdhdmVJbik7Ci0JbHBEZXNjID0gKExQV0FWRU9QRU5ERVNDKSBHbG9iYWxMb2NrKGhXYXZlSW4pOworCWxwRGVzYyA9IChMUFdBVkVPUEVOREVTQykgVVNFUl9IRUFQX0xJTl9BRERSKGhXYXZlSW4pOwogCWlmIChscERlc2MgPT0gTlVMTCkgcmV0dXJuIE1NU1lTRVJSX0lOVkFMSEFORExFOwogCXJldHVybiB3aWRNZXNzYWdlKDAsIFdJRE1fQ0xPU0UsIGxwRGVzYy0+ZHdJbnN0YW5jZSwgMEwsIDBMKTsKIH0KQEAgLTE2ODYsMTUgKzE4MjksMTcgQEAKICAgICBXQVZFSERSIEZBUiogbHBXYXZlSW5IZHIsIFVJTlQgdVNpemUpCiB7CiAJTFBXQVZFT1BFTkRFU0MJbHBEZXNjOworCUxQV0FWRUhEUiAJCWxwMzJXYXZlSW5IZHI7CiAJcHJpbnRmKCJ3YXZlSW5QcmVwYXJlSGVhZGVyKCUwNFgsICVwLCAldSk7XG4iLCAKIAkJCQkJaFdhdmVJbiwgbHBXYXZlSW5IZHIsIHVTaXplKTsKLQlscERlc2MgPSAoTFBXQVZFT1BFTkRFU0MpIEdsb2JhbExvY2soaFdhdmVJbik7CisJbHBEZXNjID0gKExQV0FWRU9QRU5ERVNDKSBVU0VSX0hFQVBfTElOX0FERFIoaFdhdmVJbik7CiAJaWYgKGxwRGVzYyA9PSBOVUxMKSByZXR1cm4gTU1TWVNFUlJfSU5WQUxIQU5ETEU7CiAJaWYgKGxwV2F2ZUluSGRyID09IE5VTEwpIHJldHVybiBNTVNZU0VSUl9JTlZBTEhBTkRMRTsKLQlscFdhdmVJbkhkci0+bHBOZXh0ID0gTlVMTDsKLSAgICBscFdhdmVJbkhkci0+ZHdCeXRlc1JlY29yZGVkID0gMDsKKwlscDMyV2F2ZUluSGRyID0gUFRSX1NFR19UT19MSU4obHBXYXZlSW5IZHIpOworCWxwMzJXYXZlSW5IZHItPmxwTmV4dCA9IE5VTEw7CisgICAgbHAzMldhdmVJbkhkci0+ZHdCeXRlc1JlY29yZGVkID0gMDsKIAlwcmludGYoIndhdmVJblByZXBhcmVIZWFkZXIgLy8gbHBEYXRhPSVwIHNpemU9JWx1IFxuIiwgCi0JCWxwV2F2ZUluSGRyLT5scERhdGEsIGxwV2F2ZUluSGRyLT5kd0J1ZmZlckxlbmd0aCk7CisJCWxwMzJXYXZlSW5IZHItPmxwRGF0YSwgbHAzMldhdmVJbkhkci0+ZHdCdWZmZXJMZW5ndGgpOwogCXJldHVybiB3aWRNZXNzYWdlKDAsIFdJRE1fUFJFUEFSRSwgbHBEZXNjLT5kd0luc3RhbmNlLCAKIAkJCQkJCQkoRFdPUkQpbHBXYXZlSW5IZHIsIHVTaXplKTsKIH0KQEAgLTE3MDcsMTUgKzE4NTIsMTcgQEAKICAgICBXQVZFSERSIEZBUiogbHBXYXZlSW5IZHIsIFVJTlQgdVNpemUpCiB7CiAJTFBXQVZFT1BFTkRFU0MJbHBEZXNjOworCUxQV0FWRUhEUiAJCWxwMzJXYXZlSW5IZHI7CiAJcHJpbnRmKCJ3YXZlSW5VbnByZXBhcmVIZWFkZXIoJTA0WCwgJXAsICV1KTtcbiIsIAogCQkJCQkJaFdhdmVJbiwgbHBXYXZlSW5IZHIsIHVTaXplKTsKLQlscERlc2MgPSAoTFBXQVZFT1BFTkRFU0MpIEdsb2JhbExvY2soaFdhdmVJbik7CisJbHBEZXNjID0gKExQV0FWRU9QRU5ERVNDKSBVU0VSX0hFQVBfTElOX0FERFIoaFdhdmVJbik7CiAJaWYgKGxwRGVzYyA9PSBOVUxMKSByZXR1cm4gTU1TWVNFUlJfSU5WQUxIQU5ETEU7CiAJaWYgKGxwV2F2ZUluSGRyID09IE5VTEwpIHJldHVybiBNTVNZU0VSUl9JTlZBTEhBTkRMRTsKLQlVU0VSX0hFQVBfRlJFRShISVdPUkQoKERXT1JEKWxwV2F2ZUluSGRyLT5scERhdGEpKTsKLQlscFdhdmVJbkhkci0+bHBEYXRhID0gTlVMTDsKLQlscFdhdmVJbkhkci0+bHBOZXh0ID0gTlVMTDsKLQlyZXR1cm4gd2lkTWVzc2FnZSgwLCBXSURNX1BSRVBBUkUsIGxwRGVzYy0+ZHdJbnN0YW5jZSwgCisJbHAzMldhdmVJbkhkciA9IFBUUl9TRUdfVE9fTElOKGxwV2F2ZUluSGRyKTsKKwlVU0VSX0hFQVBfRlJFRShISVdPUkQoKERXT1JEKWxwMzJXYXZlSW5IZHItPmxwRGF0YSkpOworCWxwMzJXYXZlSW5IZHItPmxwRGF0YSA9IE5VTEw7CisJbHAzMldhdmVJbkhkci0+bHBOZXh0ID0gTlVMTDsKKwlyZXR1cm4gd2lkTWVzc2FnZSgwLCBXSURNX1VOUFJFUEFSRSwgbHBEZXNjLT5kd0luc3RhbmNlLCAKIAkJCQkJCQkoRFdPUkQpbHBXYXZlSW5IZHIsIHVTaXplKTsKIH0KIApAQCAtMTcyNywxNCArMTg3NCwxNiBAQAogICAgIFdBVkVIRFIgRkFSKiBscFdhdmVJbkhkciwgVUlOVCB1U2l6ZSkKIHsKIAlMUFdBVkVPUEVOREVTQwlscERlc2M7CisJTFBXQVZFSERSIAkJbHAzMldhdmVJbkhkcjsKIAlwcmludGYoIndhdmVJbkFkZEJ1ZmZlciglMDRYLCAlcCwgJXUpO1xuIiwgaFdhdmVJbiwgbHBXYXZlSW5IZHIsIHVTaXplKTsKLQlscERlc2MgPSAoTFBXQVZFT1BFTkRFU0MpIEdsb2JhbExvY2soaFdhdmVJbik7CisJbHBEZXNjID0gKExQV0FWRU9QRU5ERVNDKSBVU0VSX0hFQVBfTElOX0FERFIoaFdhdmVJbik7CiAJaWYgKGxwRGVzYyA9PSBOVUxMKSByZXR1cm4gTU1TWVNFUlJfSU5WQUxIQU5ETEU7CiAJaWYgKGxwV2F2ZUluSGRyID09IE5VTEwpIHJldHVybiBNTVNZU0VSUl9JTlZBTEhBTkRMRTsKLQlscFdhdmVJbkhkci0+bHBOZXh0ID0gTlVMTDsKLSAgICBscFdhdmVJbkhkci0+ZHdCeXRlc1JlY29yZGVkID0gMDsKKwlscDMyV2F2ZUluSGRyID0gUFRSX1NFR19UT19MSU4obHBXYXZlSW5IZHIpOworCWxwMzJXYXZlSW5IZHItPmxwTmV4dCA9IE5VTEw7CisgICAgbHAzMldhdmVJbkhkci0+ZHdCeXRlc1JlY29yZGVkID0gMDsKIAlwcmludGYoIndhdmVJbkFkZEJ1ZmZlciAvLyBscERhdGE9JXAgc2l6ZT0lbHUgXG4iLCAKLQkJbHBXYXZlSW5IZHItPmxwRGF0YSwgbHBXYXZlSW5IZHItPmR3QnVmZmVyTGVuZ3RoKTsKKwkJbHAzMldhdmVJbkhkci0+bHBEYXRhLCBscDMyV2F2ZUluSGRyLT5kd0J1ZmZlckxlbmd0aCk7CiAJcmV0dXJuIHdpZE1lc3NhZ2UoMCwgV0lETV9BRERCVUZGRVIsIGxwRGVzYy0+ZHdJbnN0YW5jZSwKIAkJCQkJCQkJKERXT1JEKWxwV2F2ZUluSGRyLCB1U2l6ZSk7CiB9CkBAIC0xNzQ3LDcgKzE4OTYsNyBAQAogewogCUxQV0FWRU9QRU5ERVNDCWxwRGVzYzsKIAlwcmludGYoIndhdmVJblN0YXJ0KCUwNFgpXG4iLCBoV2F2ZUluKTsKLQlscERlc2MgPSAoTFBXQVZFT1BFTkRFU0MpIEdsb2JhbExvY2soaFdhdmVJbik7CisJbHBEZXNjID0gKExQV0FWRU9QRU5ERVNDKSBVU0VSX0hFQVBfTElOX0FERFIoaFdhdmVJbik7CiAJaWYgKGxwRGVzYyA9PSBOVUxMKSByZXR1cm4gTU1TWVNFUlJfSU5WQUxIQU5ETEU7CiAJcmV0dXJuIHdpZE1lc3NhZ2UoMCwgV0lETV9TVEFSVCwgbHBEZXNjLT5kd0luc3RhbmNlLCAwTCwgMEwpOwogfQpAQCAtMTc2MCw3ICsxOTA5LDcgQEAKIHsKIAlMUFdBVkVPUEVOREVTQwlscERlc2M7CiAJcHJpbnRmKCJ3YXZlSW5TdG9wKCUwNFgpXG4iLCBoV2F2ZUluKTsKLQlscERlc2MgPSAoTFBXQVZFT1BFTkRFU0MpIEdsb2JhbExvY2soaFdhdmVJbik7CisJbHBEZXNjID0gKExQV0FWRU9QRU5ERVNDKSBVU0VSX0hFQVBfTElOX0FERFIoaFdhdmVJbik7CiAJaWYgKGxwRGVzYyA9PSBOVUxMKSByZXR1cm4gTU1TWVNFUlJfSU5WQUxIQU5ETEU7CiAJcmV0dXJuIHdpZE1lc3NhZ2UoMCwgV0lETV9TVE9QLCBscERlc2MtPmR3SW5zdGFuY2UsIDBMLCAwTCk7CiB9CkBAIC0xNzczLDcgKzE5MjIsNyBAQAogewogCUxQV0FWRU9QRU5ERVNDCWxwRGVzYzsKIAlwcmludGYoIndhdmVJblJlc2V0KCUwNFgpXG4iLCBoV2F2ZUluKTsKLQlscERlc2MgPSAoTFBXQVZFT1BFTkRFU0MpIEdsb2JhbExvY2soaFdhdmVJbik7CisJbHBEZXNjID0gKExQV0FWRU9QRU5ERVNDKSBVU0VSX0hFQVBfTElOX0FERFIoaFdhdmVJbik7CiAJaWYgKGxwRGVzYyA9PSBOVUxMKSByZXR1cm4gTU1TWVNFUlJfSU5WQUxIQU5ETEU7CiAJcmV0dXJuIHdpZE1lc3NhZ2UoMCwgV0lETV9SRVNFVCwgbHBEZXNjLT5kd0luc3RhbmNlLCAwTCwgMEwpOwogfQpAQCAtMTc4Niw3ICsxOTM1LDcgQEAKIHsKIAlMUFdBVkVPUEVOREVTQwlscERlc2M7CiAJcHJpbnRmKCJ3YXZlSW5HZXRQb3NpdGlvbiglMDRYLCAlcCwgJXUpO1xuIiwgaFdhdmVJbiwgbHBUaW1lLCB1U2l6ZSk7Ci0JbHBEZXNjID0gKExQV0FWRU9QRU5ERVNDKSBHbG9iYWxMb2NrKGhXYXZlSW4pOworCWxwRGVzYyA9IChMUFdBVkVPUEVOREVTQykgVVNFUl9IRUFQX0xJTl9BRERSKGhXYXZlSW4pOwogCWlmIChscERlc2MgPT0gTlVMTCkgcmV0dXJuIE1NU1lTRVJSX0lOVkFMSEFORExFOwogCXJldHVybiB3aWRNZXNzYWdlKDAsIFdJRE1fR0VUUE9TLCBscERlc2MtPmR3SW5zdGFuY2UsCiAJCQkJCQkJKERXT1JEKWxwVGltZSwgKERXT1JEKXVTaXplKTsKQEAgLTE4MTMsNyArMTk2Miw3IEBACiAJTFBXQVZFT1BFTkRFU0MJbHBEZXNjOwogCXByaW50Zigid2F2ZUluTWVzc2FnZSglMDRYLCAlMDRYLCAlMDhsWCwgJTA4bFgpXG4iLCAKIAkJCWhXYXZlSW4sIHVNZXNzYWdlLCBkd1BhcmFtMSwgZHdQYXJhbTIpOwotCWxwRGVzYyA9IChMUFdBVkVPUEVOREVTQykgR2xvYmFsTG9jayhoV2F2ZUluKTsKKwlscERlc2MgPSAoTFBXQVZFT1BFTkRFU0MpIFVTRVJfSEVBUF9MSU5fQUREUihoV2F2ZUluKTsKIAlpZiAobHBEZXNjID09IE5VTEwpIHJldHVybiBNTVNZU0VSUl9JTlZBTEhBTkRMRTsKIAlyZXR1cm4gd2lkTWVzc2FnZSgwLCB1TWVzc2FnZSwgbHBEZXNjLT5kd0luc3RhbmNlLCBkd1BhcmFtMSwgZHdQYXJhbTIpOwogfQpAQCAtMTgzMSw3ICsxOTgwLDcgQEAKIAkJbHBUaW1lci0+d0N1clRpbWUtLTsKIAkJaWYgKGxwVGltZXItPndDdXJUaW1lID09IDApIHsKIAkJCWxwVGltZXItPndDdXJUaW1lID0gbHBUaW1lci0+d0RlbGF5OwotCQkJaWYgKGxwVGltZXItPmxwRnVuYyAhPSBOVUxMKSB7CisJCQlpZiAobHBUaW1lci0+bHBGdW5jICE9IChGQVJQUk9DKU5VTEwpIHsKIAkJCQlkcHJpbnRmX21tdGltZShzdGRkZWIsIk1NU3lzVGltZUNhbGxiYWNrIC8vIGJlZm9yZSBDYWxsQmFjazE2ICFcbiIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYWxsVGltZUZ1bmNQcm9jKCBscFRpbWVyLT5scEZ1bmMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxwVGltZXItPndUaW1lcklELCAwLApAQCAtMTk3OSw3ICsyMTI4LDcgQEAKIEhNTUlPIFdJTkFQSSBtbWlvT3BlbihMUFNUUiBzekZpbGVOYW1lLCBNTUlPSU5GTyBGQVIqIGxwbW1pb2luZm8sIERXT1JEIGR3T3BlbkZsYWdzKQogewogCWludAkJaEZpbGU7Ci0JSEFORExFCWhtbWlvOworCUhBTkRMRQkJaG1taW87CiAJT0ZTVFJVQ1QJb2ZzOwogCUxQTU1JT0lORk8JbHBtbWluZm87CiAJcHJpbnRmKCJtbWlvT3BlbignJXMnLCAlcCwgJTA4bFgpO1xuIiwgc3pGaWxlTmFtZSwgbHBtbWlvaW5mbywgZHdPcGVuRmxhZ3MpOwpAQCAtMTk5Miw2ICsyMTQxLDcgQEAKIAlscG1taW5mby0+aG1taW8gPSBobW1pbzsKIAlscG1taW5mby0+ZHdSZXNlcnZlZDIgPSBNQUtFTE9ORyhoRmlsZSwgMCk7CiAJR2xvYmFsVW5sb2NrKGhtbWlvKTsKKwlwcmludGYoIm1taW9PcGVuIC8vIHJldHVybiBobW1pbz0lMDRYXG4iLCBobW1pbyk7CiAJcmV0dXJuIChITU1JTylobW1pbzsKIH0KIApAQCAtMjAxOSwxMyArMjE2OSwxNCBAQAogKi8KIExPTkcgV0lOQVBJIG1taW9SZWFkKEhNTUlPIGhtbWlvLCBIUFNUUiBwY2gsIExPTkcgY2NoKQogewotCWludAkJY291bnQ7CisJTE9ORwkJY291bnQ7CiAJTFBNTUlPSU5GTwlscG1taW5mbzsKIAlkcHJpbnRmX21taW8oc3RkZGViLCAibW1pb1JlYWQoJTA0WCwgJXAsICVsZCk7XG4iLCBobW1pbywgcGNoLCBjY2gpOwogCWxwbW1pbmZvID0gKExQTU1JT0lORk8pR2xvYmFsTG9jayhobW1pbyk7CiAJaWYgKGxwbW1pbmZvID09IE5VTEwpIHJldHVybiAwOwotCWNvdW50ID0gX2xyZWFkKExPV09SRChscG1taW5mby0+ZHdSZXNlcnZlZDIpLCBwY2gsIGNjaCk7CisJY291bnQgPSByZWFkKExPV09SRChscG1taW5mby0+ZHdSZXNlcnZlZDIpLCBwY2gsIGNjaCk7CiAJR2xvYmFsVW5sb2NrKGhtbWlvKTsKKwlkcHJpbnRmX21taW8oc3RkZGViLCAibW1pb1JlYWQgLy8gY291bnQ9JWxkXG4iLCBjb3VudCk7CiAJcmV0dXJuIGNvdW50OwogfQogCkBAIC0yMDM2LDcgKzIxODcsNyBAQAogKi8KIExPTkcgV0lOQVBJIG1taW9Xcml0ZShITU1JTyBobW1pbywgSFBDU1RSIHBjaCwgTE9ORyBjY2gpCiB7Ci0JaW50CQljb3VudDsKKwlMT05HCQljb3VudDsKIAlMUE1NSU9JTkZPCWxwbW1pbmZvOwogCXByaW50ZigibW1pb1dyaXRlKCUwNFgsICVwLCAlbGQpO1xuIiwgaG1taW8sIHBjaCwgY2NoKTsKIAlscG1taW5mbyA9IChMUE1NSU9JTkZPKUdsb2JhbExvY2soaG1taW8pOwpAQCAtMjA5Nyw3ICsyMjQ4LDcgQEAKIFVJTlQgV0lOQVBJIG1taW9TZXRCdWZmZXIoSE1NSU8gaG1taW8sIExQU1RSIHBjaEJ1ZmZlciwgCiAJCQkJCQlMT05HIGNjaEJ1ZmZlciwgVUlOVCB1RmxhZ3MpCiB7Ci0JcHJpbnRmKCJtbWlvU2V0QnVmZmVyXG4iKTsKKwlwcmludGYoIm1taW9TZXRCdWZmZXIgLy8gZW1wdHkgc3R1YiBcbiIpOwogCXJldHVybiAwOwogfQogCkBAIC0yMTI1LDcgKzIyNzYsNyBAQAogCWxwbW1pbmZvID0gKExQTU1JT0lORk8pR2xvYmFsTG9jayhobW1pbyk7CiAJaWYgKGxwbW1pbmZvID09IE5VTEwpIHJldHVybiAwOwogCWlmICh1RmxhZ3MgPT0gTU1JT19SRUFEKSB7Ci0JCWNvdW50ID0gX2xyZWFkKExPV09SRChscG1taW5mby0+ZHdSZXNlcnZlZDIpLCAKKwkJY291bnQgPSByZWFkKExPV09SRChscG1taW5mby0+ZHdSZXNlcnZlZDIpLCAKIAkJCWxwbW1pb2luZm8tPnBjaEJ1ZmZlciwgbHBtbWlvaW5mby0+Y2NoQnVmZmVyKTsKIAkJfQogCWlmICh1RmxhZ3MgPT0gTU1JT19XUklURSkgewpAQCAtMjE0Myw3ICsyMjk0LDcgQEAKICovCiBGT1VSQ0MgV0lOQVBJIG1taW9TdHJpbmdUb0ZPVVJDQyhMUENTVFIgc3osIFVJTlQgdUZsYWdzKQogewotCXByaW50ZigibW1pb1N0cmluZ1RvRk9VUkNDXG4iKTsKKwlwcmludGYoIm1taW9TdHJpbmdUb0ZPVVJDQyAvLyBlbXB0eSBzdHViIFxuIik7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTIxNTMsNyArMjMwNCw3IEBACiBMUE1NSU9QUk9DIFdJTkFQSSBtbWlvSW5zdGFsbElPUHJvYyhGT1VSQ0MgZmNjSU9Qcm9jLCAKIAkJCQlMUE1NSU9QUk9DIHBJT1Byb2MsIERXT1JEIGR3RmxhZ3MpCiB7Ci0JcHJpbnRmKCJtbWlvSW5zdGFsbElPUHJvY1xuIik7CisJcHJpbnRmKCJtbWlvSW5zdGFsbElPUHJvYyAvLyBlbXB0eSBzdHViIFxuIik7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTIxNjMsNyArMjMxNCw3IEBACiBMUkVTVUxUIFdJTkFQSSBtbWlvU2VuZE1lc3NhZ2UoSE1NSU8gaG1taW8sIFVJTlQgdU1lc3NhZ2UsCiAJCQkJCSAgICBMUEFSQU0gbFBhcmFtMSwgTFBBUkFNIGxQYXJhbTIpCiB7Ci0JcHJpbnRmKCJtbWlvU2VuZE1lc3NhZ2VcbiIpOworCXByaW50ZigibW1pb1NlbmRNZXNzYWdlIC8vIGVtcHR5IHN0dWIgXG4iKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMjE4MSw3ICsyMzMyLDkgQEAKIAlscG1taW5mbyA9IChMUE1NSU9JTkZPKUdsb2JhbExvY2soaG1taW8pOwogCWlmIChscG1taW5mbyA9PSBOVUxMKSByZXR1cm4gMDsKIAlkd2ZjYyA9IGxwY2stPmNraWQ7CisJZHByaW50Zl9tbWlvKHN0ZGRlYiwgIm1taW9EZXNjZW5kIC8vIGR3ZmNjPSUwOGxYXG4iLCBkd2ZjYyk7CiAJZHdPbGRQb3MgPSBfbGxzZWVrKExPV09SRChscG1taW5mby0+ZHdSZXNlcnZlZDIpLCAwLCBTRUVLX0NVUik7CisJZHByaW50Zl9tbWlvKHN0ZGRlYiwgIm1taW9EZXNjZW5kIC8vIGR3T2xkUG9zPSVsZFxuIiwgZHdPbGRQb3MpOwogCWlmIChscGNrUGFyZW50ICE9IE5VTEwpIHsKIAkJZHByaW50Zl9tbWlvKHN0ZGRlYiwgIm1taW9EZXNjZW5kIC8vIHNlZWsgaW5zaWRlIHBhcmVudCBhdCAlbGQgIVxuIiwgbHBja1BhcmVudC0+ZHdEYXRhT2Zmc2V0KTsKIAkJZHdPbGRQb3MgPSBfbGxzZWVrKExPV09SRChscG1taW5mby0+ZHdSZXNlcnZlZDIpLCAKQEAgLTIxOTEsNyArMjM0NCw3IEBACiAJCSh1RmxhZ3MgJiBNTUlPX0ZJTkRMSVNUKSkgewogCQlkcHJpbnRmX21taW8oc3RkZGViLCAibW1pb0Rlc2NlbmQgLy8gTU1JT19GSU5EeHh4eCBkd2ZjYz0lMDhsWCAhXG4iLCBkd2ZjYyk7CiAJCXdoaWxlIChUUlVFKSB7Ci0JCQlpZiAoX2xyZWFkKExPV09SRChscG1taW5mby0+ZHdSZXNlcnZlZDIpLCAoTFBTVFIpbHBjaywgCisJCQlpZiAocmVhZChMT1dPUkQobHBtbWluZm8tPmR3UmVzZXJ2ZWQyKSwgKExQU1RSKWxwY2ssIAogCQkJCQlzaXplb2YoTU1DS0lORk8pKSA8IHNpemVvZihNTUNLSU5GTykpIHsKIAkJCQlfbGxzZWVrKExPV09SRChscG1taW5mby0+ZHdSZXNlcnZlZDIpLCBkd09sZFBvcywgU0VFS19TRVQpOwogCQkJCUdsb2JhbFVubG9jayhobW1pbyk7CkBAIC0yMjA3LDE5ICsyMzYwLDE5IEBACiAJCQl9CiAJCX0KIAllbHNlIHsKLQkJaWYgKF9scmVhZChMT1dPUkQobHBtbWluZm8tPmR3UmVzZXJ2ZWQyKSwgKExQU1RSKWxwY2ssIAorCQlpZiAocmVhZChMT1dPUkQobHBtbWluZm8tPmR3UmVzZXJ2ZWQyKSwgKExQU1RSKWxwY2ssIAogCQkJCXNpemVvZihNTUNLSU5GTykpIDwgc2l6ZW9mKE1NQ0tJTkZPKSkgewogCQkJX2xsc2VlayhMT1dPUkQobHBtbWluZm8tPmR3UmVzZXJ2ZWQyKSwgZHdPbGRQb3MsIFNFRUtfU0VUKTsKIAkJCUdsb2JhbFVubG9jayhobW1pbyk7CiAJCQlyZXR1cm4gTU1JT0VSUl9DSFVOS05PVEZPVU5EOwogCQkJfQogCQl9Ci0JR2xvYmFsVW5sb2NrKGhtbWlvKTsKIAlscGNrLT5kd0RhdGFPZmZzZXQgPSBkd09sZFBvcyArIDIgKiBzaXplb2YoRFdPUkQpOwogCWlmIChscGNrLT5ja2lkID09IEZPVVJDQ19SSUZGIHx8IGxwY2stPmNraWQgPT0gRk9VUkNDX0xJU1QpIAogCQlscGNrLT5kd0RhdGFPZmZzZXQgKz0gc2l6ZW9mKERXT1JEKTsKIAlscG1taW5mby0+bERpc2tPZmZzZXQgPSBfbGxzZWVrKExPV09SRChscG1taW5mby0+ZHdSZXNlcnZlZDIpLCAKIAkJCQkJCQkJCWxwY2stPmR3RGF0YU9mZnNldCwgU0VFS19TRVQpOworCUdsb2JhbFVubG9jayhobW1pbyk7CiAJZHByaW50Zl9tbWlvKHN0ZGRlYiwgIm1taW9EZXNjZW5kIC8vIGxwY2stPmNraWQ9JTA4bFggbHBjay0+Y2tzaXplPSVsZCAhXG4iLCAKIAkJCQkJCQkJbHBjay0+Y2tpZCwgbHBjay0+Y2tzaXplKTsKIAlwcmludGYoIm1taW9EZXNjZW5kIC8vIGxwY2stPmZjY1R5cGU9JTA4bFggIVxuIiwgbHBjay0+ZmNjVHlwZSk7CkBAIC0yMjMxLDcgKzIzODQsNyBAQAogKi8KIFVJTlQgV0lOQVBJIG1taW9Bc2NlbmQoSE1NSU8gaG1taW8sIE1NQ0tJTkZPIEZBUiogbHBjaywgVUlOVCB1RmxhZ3MpCiB7Ci0JcHJpbnRmKCJtbWlvQXNjZW5kXG4iKTsKKwlwcmludGYoIm1taW9Bc2NlbmQgLy8gZW1wdHkgc3R1YiAhXG4iKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMjI0MCw3ICsyMzkzLDcgQEAKICovCiBVSU5UIFdJTkFQSSBtbWlvQ3JlYXRlQ2h1bmsoSE1NSU8gaG1taW8sIE1NQ0tJTkZPIEZBUiogbHBjaywgVUlOVCB1RmxhZ3MpCiB7Ci0JcHJpbnRmKCJtbWlvQ3JlYXRlQ2h1bmtcbiIpOworCXByaW50ZigibW1pb0NyZWF0ZUNodW5rIC8vIGVtcHR5IHN0dWIgXG4iKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMjI1MSw3ICsyNDA0LDcgQEAKIFVJTlQgV0lOQVBJIG1taW9SZW5hbWUoTFBDU1RSIHN6RmlsZU5hbWUsIExQQ1NUUiBzek5ld0ZpbGVOYW1lLAogICAgICBNTUlPSU5GTyBGQVIqIGxwbW1pb2luZm8sIERXT1JEIGR3UmVuYW1lRmxhZ3MpCiB7Ci0JcHJpbnRmKCJtbWlvUmVuYW1lKCclcycsICclcycsICVwLCAlMDhsWCk7XG4iLAorCXByaW50ZigibW1pb1JlbmFtZSgnJXMnLCAnJXMnLCAlcCwgJTA4bFgpOyAvLyBlbXB0eSBzdHViIFxuIiwKIAkJCXN6RmlsZU5hbWUsIHN6TmV3RmlsZU5hbWUsIGxwbW1pb2luZm8sIGR3UmVuYW1lRmxhZ3MpOwogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvb2JqZWN0cy9iaXRtYXAuYyBiL29iamVjdHMvYml0bWFwLmMKaW5kZXggMDc4MzAzNi4uZTM5NGNjYiAxMDA2NDQKLS0tIGEvb2JqZWN0cy9iaXRtYXAuYworKysgYi9vYmplY3RzL2JpdG1hcC5jCkBAIC0xMyw2ICsxMyw3IEBACiAjaW5jbHVkZSAiYXJjaC5oIgogI2luY2x1ZGUgImRjLmgiCiAjaW5jbHVkZSAiYml0bWFwLmgiCisjaW5jbHVkZSAicHJvdG90eXBlcy5oIgogI2luY2x1ZGUgInN0ZGRlYnVnLmgiCiAvKiAjZGVmaW5lIERFQlVHX0dESSAgICAqLwogLyogI2RlZmluZSBERUJVR19CSVRNQVAgKi8KZGlmZiAtLWdpdCBhL29iamVjdHMvY29sb3IuYyBiL29iamVjdHMvY29sb3IuYwppbmRleCBiNDU1ZTQ5Li5jMTBhNmMwIDEwMDY0NAotLS0gYS9vYmplY3RzL2NvbG9yLmMKKysrIGIvb2JqZWN0cy9jb2xvci5jCkBAIC0yNzksNyArMjc5LDcgQEAKICAgICAgICAgZWxzZSBpbmRleCA9IDA7CiAJYnJlYWs7CiAgICAgfQotICAgIGlmIChkYykKKyAgICBpZiAoZGMmJmRjLT51LngucGFsLm1hcHBpbmdTaXplKQogICAgIHsKICAgICAgICAgaWYgKGluZGV4ID49IGRjLT51LngucGFsLm1hcHBpbmdTaXplKSByZXR1cm4gMDsKICAgICAgICAgbWFwcGluZyA9IChXT1JEICopIEdESV9IRUFQX0xJTl9BRERSKCBkYy0+dS54LnBhbC5oTWFwcGluZyApOwpkaWZmIC0tZ2l0IGEvb2JqZWN0cy9kYy5jIGIvb2JqZWN0cy9kYy5jCmluZGV4IDI0M2FhZTkuLjkyYmYyNTIgMTAwNjQ0Ci0tLSBhL29iamVjdHMvZGMuYworKysgYi9vYmplY3RzL2RjLmMKQEAgLTI2MCw4ICsyNjAsMTkgQEAKICAgICBYR0NWYWx1ZXMgdmFsOwogCiAgICAgaWYgKGRjLT51LngucGVuLnN0eWxlID09IFBTX05VTEwpIHJldHVybiBGQUxTRTsKLSAgICB2YWwuZnVuY3Rpb24gICA9IERDX1hST1BmdW5jdGlvbltkYy0+dy5ST1Btb2RlLTFdOwotICAgIHZhbC5mb3JlZ3JvdW5kID0gZGMtPnUueC5wZW4ucGl4ZWw7CisKKyAgICBpZiAoKHNjcmVlbkRlcHRoIDw9IDgpICYmICAvKiBGSVhNRTogU2hvdWxkIGNoZWNrIGZvciBwYWxldHRlIGluc3RlYWQgKi8KKyAgICAgICAgKChkYy0+dy5ST1Btb2RlID09IFIyX0JMQUNLKSB8fCAoZGMtPncuUk9QbW9kZSA9PSBSMl9XSElURSkpKQorICAgIHsKKyAgICAgICAgdmFsLmZ1bmN0aW9uICAgPSBHWGNvcHk7CisgICAgICAgIHZhbC5mb3JlZ3JvdW5kID0gQ09MT1JfVG9QaHlzaWNhbCggTlVMTCwgKGRjLT53LlJPUG1vZGUgPT0gUjJfQkxBQ0spID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkdCKDAsMCwwKSA6IFJHQigyNTUsMjU1LDI1NSkgKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgdmFsLmZ1bmN0aW9uICAgPSBEQ19YUk9QZnVuY3Rpb25bZGMtPncuUk9QbW9kZS0xXTsKKyAgICAgICAgdmFsLmZvcmVncm91bmQgPSBkYy0+dS54LnBlbi5waXhlbDsKKyAgICB9CiAgICAgdmFsLmJhY2tncm91bmQgPSBkYy0+dy5iYWNrZ3JvdW5kUGl4ZWw7CiAgICAgdmFsLmZpbGxfc3R5bGUgPSBGaWxsU29saWQ7CiAgICAgaWYgKChkYy0+dS54LnBlbi5zdHlsZSE9UFNfU09MSUQpICYmIChkYy0+dS54LnBlbi5zdHlsZSE9UFNfSU5TSURFRlJBTUUpKQpkaWZmIC0tZ2l0IGEvb2JqZWN0cy9kaWIuYyBiL29iamVjdHMvZGliLmMKaW5kZXggYmI1Mzg4Yy4uYjhkNzMxMyAxMDA2NDQKLS0tIGEvb2JqZWN0cy9kaWIuYworKysgYi9vYmplY3RzL2RpYi5jCkBAIC0xMiw2ICsxMiw3IEBACiAjaW5jbHVkZSAiYml0bWFwLmgiCiAjaW5jbHVkZSAicGFsZXR0ZS5oIgogI2luY2x1ZGUgImljb24uaCIKKyNpbmNsdWRlICJzdGFja2ZyYW1lLmgiCiAjaW5jbHVkZSAic3RkZGVidWcuaCIKICNpbmNsdWRlICJjb2xvci5oIgogI2luY2x1ZGUgImRlYnVnLmgiCkBAIC01MTQsMTUgKzUxNSwzNiBAQAogCWJyZWFrOwogICAgIH0KICAgICBpZiAoY29sb3JNYXBwaW5nKSBmcmVlKGNvbG9yTWFwcGluZyk7Ci0KLSAgICBYUHV0SW1hZ2UoIGRpc3BsYXksIGRyYXdhYmxlLCBnYywgYm1wSW1hZ2UsIHhTcmMsIHlTcmMsCi0JICAgICAgIHhEZXN0LCB5RGVzdCwgd2lkdGgsIGhlaWdodCApOworICAgIHsKKyAgICAgIFdPUkQgc2F2ZWRfZHMgPSBDVVJSRU5UX0RTOworICAgICAgWFB1dEltYWdlKCBkaXNwbGF5LCBkcmF3YWJsZSwgZ2MsIGJtcEltYWdlLCB4U3JjLCB5U3JjLAorCQl4RGVzdCwgeURlc3QsIHdpZHRoLCBoZWlnaHQgKTsKKyAgICAgIGlmIChzYXZlZF9kcyAhPSBDVVJSRU5UX0RTKSB7CisJZnByaW50ZihzdGRlcnIsIlVoIG9oLiBYUHV0SW1hZ2UgY2xvYmJlcmVkIHRoZSAxNiBiaXQgc3RhY2suXG4iCisJCSJQbGVhc2UgcmVwb3J0OiAlcyBjb21wcmVzc2lvbiwgJWQgYml0cGxhbmVzISFcbiIsCisJCWluZm8tPmJtaUhlYWRlci5iaUNvbXByZXNzaW9uID8gIiIgOiAibm8iLCAKKwkJaW5mby0+Ym1pSGVhZGVyLmJpQml0Q291bnQpOworICAgICAgfQorICAgIH0KICAgICBYRGVzdHJveUltYWdlKCBibXBJbWFnZSApOwogICAgIHJldHVybiBsaW5lczsKIH0KIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBTdHJldGNoRElCaXRzICAgIAkoR0RJLjQzOSkKKyAqLworaW50IFN0cmV0Y2hESUJpdHMoIEhEQyBoZGMsIAorCVdPUkQgeERlc3QsIFdPUkQgeURlc3QsIFdPUkQgd0Rlc3RXaWR0aCwgV09SRCB3RGVzdEhlaWdodCwKKwlXT1JEIHhTcmMsIFdPUkQgeVNyYywgV09SRCB3U3JjV2lkdGgsIFdPUkQgd1NyY0hlaWdodCwKKwlMUFNUUiBiaXRzLCBMUEJJVE1BUElORk8gaW5mbywgV09SRCB3VXNhZ2UsIERXT1JEIGR3Um9wICkKK3sKKwlwcmludGYoIlN0cmV0Y2hESUJpdHMgLy8gY2FsbCBTZXRESUJpdHNUb0RldmljZSBmb3Igbm93ICEhISFcbiIpOworCXJldHVybiBTZXRESUJpdHNUb0RldmljZShoZGMsIHhEZXN0LCB5RGVzdCwgd0Rlc3RXaWR0aCwgd0Rlc3RIZWlnaHQsCisJCXhTcmMsIHlTcmMsIDEsIDEsIGJpdHMsIGluZm8sIHdVc2FnZSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIFNldERJQml0cyAgICAoR0RJLjQ0MCkKICAqLwogaW50IFNldERJQml0cyggSERDIGhkYywgSEJJVE1BUCBoYml0bWFwLCBXT1JEIHN0YXJ0c2NhbiwgV09SRCBsaW5lcywKQEAgLTU4MCw2ICs2MDIsNyBAQAogfQogCiAKKwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgR2V0RElCaXRzICAgIChHREkuNDQxKQogICovCmRpZmYgLS1naXQgYS9vYmplY3RzL2ZvbnQuYyBiL29iamVjdHMvZm9udC5jCmluZGV4IGNhZTY0ZDEuLmI2YmNhYWEgMTAwNjQ0Ci0tLSBhL29iamVjdHMvZm9udC5jCisrKyBiL29iamVjdHMvZm9udC5jCkBAIC0xNzgsNyArMTc4LDExIEBACiAgICAgICAgICAgICBoZWlnaHQgLT0gMTA7CQkKICAgICAgICAgICAgIGlmIChoZWlnaHQgPCAxMCkgewogICAgICAgICAgICAgICAgIGRwcmludGZfZm9udChzdGRkZWIsIioqKiBObyBtYXRjaCBmb3IgJXNcbiIsIHBhdHRlcm4gKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKwkJCQlpZihzbGFudCA9PSAnaScpCisJCQkJCS8qIHRyeSBvYmxpcXVlIGlmIG5vIGl0YWxpYyBmb250ICovCisJCQkJCXNsYW50ID0gJ28nOworCQkJCWVsc2UKKyAgICAgICAgICAgICAgICAJcmV0dXJuIE5VTEw7CiAgICAgICAgICAgICB9CiAgICAgfQogICAgIGRwcmludGZfZm9udChzdGRkZWIsIiAgICAgICAgRm91bmQgJyVzJ1xuIiwgKm5hbWVzICk7CkBAIC02OTQsOSArNjk4LDkgQEAKICAgaW50ICAgICAgICAgIG5SZXQ7CiAgIGludCAgICAgICAgICBpOwogICAKLSAgZHByaW50Zl9mb250KHN0ZGRlYiwiRW51bUZvbnRzKCUwNFgsICVwPSclcycsICVwLCAlcClcbiIsIAotCSAgICAgICBoREMsIGxwRmFjZU5hbWUsIGxwRmFjZU5hbWUsIGxwRW51bUZ1bmMsIGxwRGF0YSk7Ci0gIGlmIChscEVudW1GdW5jID09IE5VTEwpIHJldHVybiAwOworICBkcHJpbnRmX2ZvbnQoc3RkZGViLCJFbnVtRm9udHMoJTA0WCwgJXA9JyVzJywgJTA4bHgsICVwKVxuIiwgCisJICAgICAgIGhEQywgbHBGYWNlTmFtZSwgbHBGYWNlTmFtZSwgKExPTkcpbHBFbnVtRnVuYywgbHBEYXRhKTsKKyAgaWYgKGxwRW51bUZ1bmMgPT0gMCkgcmV0dXJuIDA7CiAgIGhMb2cgPSBHRElfSEVBUF9BTExPQyggc2l6ZW9mKExPR0ZPTlQpICsgTEZfRkFDRVNJWkUgKTsKICAgbHBMb2dGb250ID0gKExQTE9HRk9OVCkgR0RJX0hFQVBfTElOX0FERFIoaExvZyk7CiAgIGlmIChscExvZ0ZvbnQgPT0gTlVMTCkgewpAQCAtNzYzLDkgKzc2Nyw5IEBACiAgIGludAkgICAgICAgCW5SZXQ7CiAgIGludAkgICAgICAgCWk7CiAgIAotICBkcHJpbnRmX2ZvbnQoc3RkZGViLCJFbnVtRm9udEZhbWlsaWVzKCUwNFgsICVwLCAlcCwgJXApXG4iLCAKKyAgZHByaW50Zl9mb250KHN0ZGRlYiwiRW51bUZvbnRGYW1pbGllcyglMDRYLCAlcCwgJTA4bHgsICVwKVxuIiwKIAkgICAgICAgaERDLCBscHN6RmFtaWx5LCBscEVudW1GdW5jLCBscERhdGEpOwotICBpZiAobHBFbnVtRnVuYyA9PSBOVUxMKSByZXR1cm4gMDsKKyAgaWYgKGxwRW51bUZ1bmMgPT0gMCkgcmV0dXJuIDA7CiAgIGhMb2cgPSBHRElfSEVBUF9BTExPQyggc2l6ZW9mKEVOVU1MT0dGT05UKSApOwogICBscEVudW1Mb2dGb250ID0gKExQRU5VTUxPR0ZPTlQpIEdESV9IRUFQX0xJTl9BRERSKGhMb2cpOwogICBpZiAobHBFbnVtTG9nRm9udCA9PSBOVUxMKSB7CmRpZmYgLS1naXQgYS9vYmplY3RzL2dkaW9iai5jIGIvb2JqZWN0cy9nZGlvYmouYwppbmRleCBlZDg2NTgyLi5jMzRhMzc5IDEwMDY0NAotLS0gYS9vYmplY3RzL2dkaW9iai5jCisrKyBiL29iamVjdHMvZ2Rpb2JqLmMKQEAgLTE5OSw0NSArMTk5LDI3IEBACiBCT09MIEdESV9BcHBlbmRUb1BlbkJydXNoTGlzdChIQU5ETEUgaE5ld09iaikKIHsKIAlIQU5ETEUJIAkqbHBoT2JqOwotCWludAkJCWkgPSAxOworCWludAkgICAgICAgCWkgPSAxOwogCWlmIChoTmV3T2JqID09IDApIHJldHVybiBGQUxTRTsKIAlpZiAobHBQZW5CcnVzaExpc3QgPT0gTlVMTCkgewogCQlscFBlbkJydXNoTGlzdCA9IG1hbGxvYyhNQVhfT0JKICogc2l6ZW9mKEhBTkRMRSkpOwogCQlscFBlbkJydXNoTGlzdFswXSA9IDA7CiAJCWRwcmludGZfZ2RpKHN0ZGRlYiwiR0RJX0FwcGVuZFRvUGVuQnJ1c2hMaXN0KCkgbHBQZW5CcnVzaExpc3QgYWxsb2NhdGVkICFcbiIpOwotCQl9CisJfQogCWZvciAobHBoT2JqID0gbHBQZW5CcnVzaExpc3Q7IGkgPCBNQVhfT0JKOyBpKyspIHsKIAkJaWYgKCpscGhPYmogPT0gMCkgewogCQkJKmxwaE9iaiA9IGhOZXdPYmo7CiAJCQkqKGxwaE9iaiArIDEpID0gMDsKIAkJCWRwcmludGZfZ2RpKHN0ZGRlYiwiR0RJX0FwcGVuZFRvUGVuQnJ1c2hMaXN0KCUwNFgpIGFwcGVuZGVkIChjb3VudD0lZClcbiIsIGhOZXdPYmosIGkpOwogCQkJcmV0dXJuIFRSVUU7Ci0JCQl9Ci0JCWxwaE9iaisrOwogCQl9CisJCWxwaE9iaisrOworCX0KIAlyZXR1cm4gRkFMU0U7CiB9CiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgR0RJX0ZpbmRQcmV2T2JqZWN0Ci0gKgotICogUmV0dXJuIHRoZSBHREkgb2JqZWN0IHdob3NlIGhOZXh0IGZpZWxkIHBvaW50cyB0byBvYmouCi0gKi8KLUhBTkRMRSBHRElfRmluZFByZXZPYmplY3QoIEhBTkRMRSBmaXJzdCwgSEFORExFIG9iaiApCi17Ci0gICAgSEFORExFIGhhbmRsZTsKLSAgICAgICAgCi0gICAgZm9yIChoYW5kbGUgPSBmaXJzdDsgaGFuZGxlICYmIChoYW5kbGUgIT0gb2JqKTsgKQotICAgIHsKLQlHRElPQkpIRFIgKiBoZWFkZXIgPSAoR0RJT0JKSERSICopIEdESV9IRUFQX0xJTl9BRERSKCBoYW5kbGUgKTsKLQloYW5kbGUgPSBoZWFkZXItPmhOZXh0OwotICAgIH0KLSAgICByZXR1cm4gaGFuZGxlOwotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIEdESV9BbGxvY09iamVjdAogICovCiBIQU5ETEUgR0RJX0FsbG9jT2JqZWN0KCBXT1JEIHNpemUsIFdPUkQgbWFnaWMgKQpAQCAtMjUwLDkgKzIzMiw5IEBACiAgICAgb2JqLT5oTmV4dCAgID0gMDsKICAgICBvYmotPndNYWdpYyAgPSBtYWdpYzsKICAgICBvYmotPmR3Q291bnQgPSArK2NvdW50OwotCWlmIChtYWdpYyA9PSBQRU5fTUFHSUMgfHwgbWFnaWMgPT0gQlJVU0hfTUFHSUMpIHsKLQkJR0RJX0FwcGVuZFRvUGVuQnJ1c2hMaXN0KGhhbmRsZSk7Ci0JCX0KKyAgICBpZiAobWFnaWMgPT0gUEVOX01BR0lDIHx8IG1hZ2ljID09IEJSVVNIX01BR0lDKSB7CisgICAgICBHRElfQXBwZW5kVG9QZW5CcnVzaExpc3QoaGFuZGxlKTsKKyAgICB9CiAgICAgcmV0dXJuIGhhbmRsZTsKIH0KIApAQCAtNDI5LDExMCArNDExLDEwNiBAQAogICovCiBpbnQgRW51bU9iamVjdHMoSERDIGhEQywgaW50IG5PYmpUeXBlLCBGQVJQUk9DIGxwRW51bUZ1bmMsIExQU1RSIGxwRGF0YSkKIHsKLS8qICAgIEhBTkRMRSAJCWhhbmRsZTsKLSAgICBEQyAJCQkqZGM7Ki8KLQlIQU5ETEUJCSpscGhPYmo7Ci0JR0RJT0JKSERSIAkqaGVhZGVyOwotCVdPUkQgIAkJd01hZ2ljOwotCUxQU1RSCQlscExvZzsgIAkvKiBQb2ludCB0byBhIExPR0JSVVNIIG9yIExPR1BFTiBzdHJ1Y3QgKi8KLQlIQU5ETEUgCQloTG9nOwotCWludAkJCWksIG5SZXQ7Ci0JaWYgKGxwRW51bUZ1bmMgPT0gTlVMTCkgewotCQlmcHJpbnRmKHN0ZGVyciwiRW51bU9iamVjdHMgLy8gQmFkIEVudW1Qcm9jIGNhbGxiYWNrIGFkZHJlc3MgIVxuIik7Ci0JCXJldHVybiAwOwotCQl9Ci0Jc3dpdGNoIChuT2JqVHlwZSkgewotCQljYXNlIE9CSl9QRU46Ci0JCQl3TWFnaWMgPSBQRU5fTUFHSUM7Ci0JCQlkcHJpbnRmX2dkaShzdGRkZWIsIkVudW1PYmplY3RzKCUwNFgsIE9CSl9QRU4sICVwLCAlcCk7XG4iLCAKLQkJCQkJCQkJCWhEQywgbHBFbnVtRnVuYywgbHBEYXRhKTsKLQkJCWhMb2cgPSBHRElfSEVBUF9BTExPQyggc2l6ZW9mKExPR1BFTikgKTsKLQkJCWxwTG9nID0gKExQU1RSKSBHRElfSEVBUF9MSU5fQUREUihoTG9nKTsKLQkJCWlmIChscExvZyA9PSBOVUxMKSB7Ci0JCQkJZnByaW50ZihzdGRlcnIsIkVudW1PYmplY3RzIC8vIFVuYWJsZSB0byBhbGxvYyBMT0dQRU4gc3RydWN0ICFcbiIpOwotCQkJCXJldHVybiAwOwotCQkJCX0KLQkJCWJyZWFrOwotCQljYXNlIE9CSl9CUlVTSDoKLQkJCXdNYWdpYyA9IEJSVVNIX01BR0lDOwotCQkJZHByaW50Zl9nZGkoc3RkZGViLCJFbnVtT2JqZWN0cyglMDRYLCBPQkpfQlJVU0gsICVwLCAlcCk7XG4iLCAKLQkJCQkJCQkJCWhEQywgbHBFbnVtRnVuYywgbHBEYXRhKTsKLQkJCWhMb2cgPSBHRElfSEVBUF9BTExPQyggc2l6ZW9mKExPR0JSVVNIKSApOwotCQkJbHBMb2cgPSAoTFBTVFIpIEdESV9IRUFQX0xJTl9BRERSKGhMb2cpOwotCQkJaWYgKGxwTG9nID09IE5VTEwpIHsKLQkJCQlmcHJpbnRmKHN0ZGVyciwiRW51bU9iamVjdHMgLy8gVW5hYmxlIHRvIGFsbG9jIExPR0JSVVNIIHN0cnVjdCAhXG4iKTsKLQkJCQlyZXR1cm4gMDsKLQkJCQl9Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCWZwcmludGYoc3RkZXJyLCJFbnVtT2JqZWN0cyglMDRYLCAlMDRYLCAlcCwgJXApOyAvLyBVbmtub3duIE9CSiB0eXBlICFcbiIsIAotCQkJCQkJaERDLCBuT2JqVHlwZSwgbHBFbnVtRnVuYywgbHBEYXRhKTsKLQkJCXJldHVybiAwOwotCQl9CisgIC8qICAgIEhBTkRMRSAJCWhhbmRsZTsKKyAgIERDIAkJCSpkYzsqLworICBIQU5ETEUgICAgICAgCSpscGhPYmo7CisgIEdESU9CSkhEUiAJKmhlYWRlcjsKKyAgV09SRCAgICAgICAgIAl3TWFnaWM7CisgIExQU1RSCQlscExvZzsgIAkvKiBQb2ludCB0byBhIExPR0JSVVNIIG9yIExPR1BFTiBzdHJ1Y3QgKi8KKyAgSEFORExFICAgICAgIAloTG9nOworICBpbnQJICAgICAgIAlpLCBuUmV0ID0gMDsKKyAgCisgIGlmIChscEVudW1GdW5jID09IE5VTEwpIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwiRW51bU9iamVjdHMgLy8gQmFkIEVudW1Qcm9jIGNhbGxiYWNrIGFkZHJlc3MgIVxuIik7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgc3dpdGNoIChuT2JqVHlwZSkgeworICAgY2FzZSBPQkpfUEVOOgorICAgIHdNYWdpYyA9IFBFTl9NQUdJQzsKKyAgICBkcHJpbnRmX2dkaShzdGRkZWIsIkVudW1PYmplY3RzKCUwNFgsIE9CSl9QRU4sICUwOGx4LCAlcCk7XG4iLAorCQloREMsIChMT05HKWxwRW51bUZ1bmMsIGxwRGF0YSk7CisgICAgaExvZyA9IEdESV9IRUFQX0FMTE9DKCBzaXplb2YoTE9HUEVOKSApOworICAgIGxwTG9nID0gKExQU1RSKSBHRElfSEVBUF9MSU5fQUREUihoTG9nKTsKKyAgICBpZiAobHBMb2cgPT0gTlVMTCkgeworICAgICAgZnByaW50ZihzdGRlcnIsIkVudW1PYmplY3RzIC8vIFVuYWJsZSB0byBhbGxvYyBMT0dQRU4gc3RydWN0ICFcbiIpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGJyZWFrOworICAgY2FzZSBPQkpfQlJVU0g6CisgICAgd01hZ2ljID0gQlJVU0hfTUFHSUM7CisgICAgZHByaW50Zl9nZGkoc3RkZGViLCJFbnVtT2JqZWN0cyglMDRYLCBPQkpfQlJVU0gsICUwOGx4LCAlcCk7XG4iLAorCQloREMsIChMT05HKWxwRW51bUZ1bmMsIGxwRGF0YSk7CisgICAgaExvZyA9IEdESV9IRUFQX0FMTE9DKCBzaXplb2YoTE9HQlJVU0gpICk7CisgICAgbHBMb2cgPSAoTFBTVFIpIEdESV9IRUFQX0xJTl9BRERSKGhMb2cpOworICAgIGlmIChscExvZyA9PSBOVUxMKSB7CisgICAgICBmcHJpbnRmKHN0ZGVyciwiRW51bU9iamVjdHMgLy8gVW5hYmxlIHRvIGFsbG9jIExPR0JSVVNIIHN0cnVjdCAhXG4iKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBicmVhazsKKyAgIGRlZmF1bHQ6CisgICAgZnByaW50ZihzdGRlcnIsIkVudW1PYmplY3RzKCUwNFgsICUwNFgsICUwOGx4LCAlcCk7IC8vIFVua25vd24gT0JKIHR5cGUgIVxuIiwgCisJICAgIGhEQywgbk9ialR5cGUsIChMT05HKWxwRW51bUZ1bmMsIGxwRGF0YSk7CisgICAgcmV0dXJuIDA7CisgIH0KICNpZmRlZiBub3RkZWYgIC8qIEZJWE1FOiBzdG9jayBvYmplY3QgcHRyIHdvbid0IHdvcmsgaW4gY2FsbGJhY2sgKi8KLQlkcHJpbnRmX2dkaShzdGRkZWIsIkVudW1PYmplY3RzIC8vIFN0b2NrIE9iamVjdHMgZmlyc3QgIVxuIik7Ci0JZm9yIChpID0gMDsgaSA8IE5CX1NUT0NLX09CSkVDVFM7IGkrKykgewotCQloZWFkZXIgPSBTdG9ja09iamVjdHNbaV07Ci0JCWlmIChoZWFkZXItPndNYWdpYyA9PSB3TWFnaWMpIHsKLQkJCVBFTl9HZXRPYmplY3QoIChQRU5PQkogKiloZWFkZXIsIHNpemVvZihMT0dQRU4pLCBscExvZyk7Ci0JCQlCUlVTSF9HZXRPYmplY3QoIChCUlVTSE9CSiAqKWhlYWRlciwgc2l6ZW9mKExPR0JSVVNIKSxscExvZyk7Ci0JCQlkcHJpbnRmX2dkaShzdGRkZWIsIkVudW1PYmplY3RzIC8vIFN0b2NrT2JqIGxwTG9nPSVwIGxwRGF0YT0lcFxuIiwgbHBMb2csIGxwRGF0YSk7Ci0JCQlpZiAoaGVhZGVyLT53TWFnaWMgPT0gQlJVU0hfTUFHSUMpIHsKLQkJCQlkcHJpbnRmX2dkaShzdGRkZWIsIkVudW1PYmplY3RzIC8vIFN0b2NrQnJ1c2ggbGJTdHlsZT0lMDRYXG4iLCAoKExQTE9HQlJVU0gpbHBMb2cpLT5sYlN0eWxlKTsKLQkJCQlkcHJpbnRmX2dkaShzdGRkZWIsIkVudW1PYmplY3RzIC8vIFN0b2NrQnJ1c2ggbGJDb2xvcj0lMDhsWFxuIiwgKChMUExPR0JSVVNIKWxwTG9nKS0+bGJDb2xvcik7Ci0JCQkJZHByaW50Zl9nZGkoc3RkZGViLCJFbnVtT2JqZWN0cyAvLyBTdG9ja0JydXNoIGxiSGF0Y2g9JTA0WFxuIiwgKChMUExPR0JSVVNIKWxwTG9nKS0+bGJIYXRjaCk7Ci0JCQkJfQotCQkJaWYgKGhlYWRlci0+d01hZ2ljID09IFBFTl9NQUdJQykgewotCQkJCWRwcmludGZfZ2RpKHN0ZGRlYiwiRW51bU9iamVjdHMgLy8gU3RvY2tQZW4gbG9wblN0eWxlPSUwNFhcbiIsICgoTFBMT0dQRU4pbHBMb2cpLT5sb3BuU3R5bGUpOwotCQkJCWRwcmludGZfZ2RpKHN0ZGRlYiwiRW51bU9iamVjdHMgLy8gU3RvY2tQZW4gbG9wbldpZHRoPSVkXG4iLCAoKExQTE9HUEVOKWxwTG9nKS0+bG9wbldpZHRoLngpOwotCQkJCWRwcmludGZfZ2RpKHN0ZGRlYiwiRW51bU9iamVjdHMgLy8gU3RvY2tQZW4gbG9wbkNvbG9yPSUwOGxYXG4iLCAoKExQTE9HUEVOKWxwTG9nKS0+bG9wbkNvbG9yKTsKLQkJCQl9Ci0JCQluUmV0ID0gQ2FsbEVudW1PYmplY3RzUHJvYyggbHBFbnVtRnVuYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRElfSEVBUF9TRUdfQUREUihoTG9nKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KWxwRGF0YSApOwotCQkJZHByaW50Zl9nZGkoc3RkZGViLCJFbnVtT2JqZWN0cyAvLyBhZnRlciBDYWxsYmFjayFcbiIpOwotCQkJaWYgKG5SZXQgPT0gMCkgewotCQkJCUdESV9IRUFQX0ZSRUUoaExvZyk7Ci0JCQkJZHByaW50Zl9nZGkoc3RkZGViLCJFbnVtT2JqZWN0cyAvLyBFbnVtRW5kIHJlcXVlc3RlZCBieSBhcHBsaWNhdGlvbiAhXG4iKTsKLQkJCQlyZXR1cm4gMDsKLQkJCQl9Ci0JCQl9Ci0JCX0KLSNlbmRpZiAgLyogbm90ZGVmICovCi0KLQlpZiAobHBQZW5CcnVzaExpc3QgPT0gTlVMTCkgcmV0dXJuIDA7Ci0JZHByaW50Zl9nZGkoc3RkZGViLCJFbnVtT2JqZWN0cyAvLyBOb3cgREMgb3duZWQgb2JqZWN0cyAlcCAhXG4iLCBoZWFkZXIpOwotCWZvciAobHBoT2JqID0gbHBQZW5CcnVzaExpc3Q7ICpscGhPYmogIT0gMDsgKSB7Ci0JCWRwcmludGZfZ2RpKHN0ZGRlYiwiRW51bU9iamVjdHMgLy8gKmxwaE9iaj0lMDRYXG4iLCAqbHBoT2JqKTsKLQkJaGVhZGVyID0gKEdESU9CSkhEUiAqKSBHRElfSEVBUF9MSU5fQUREUigqbHBoT2JqKyspOwotCQlpZiAoaGVhZGVyLT53TWFnaWMgPT0gd01hZ2ljKSB7Ci0JCQlkcHJpbnRmX2dkaShzdGRkZWIsIkVudW1PYmplY3RzIC8vIERDX09iaiBscExvZz0lcCBscERhdGE9JXBcbiIsIGxwTG9nLCBscERhdGEpOwotCQkJaWYgKGhlYWRlci0+d01hZ2ljID09IEJSVVNIX01BR0lDKSB7Ci0JCQkJQlJVU0hfR2V0T2JqZWN0KCAoQlJVU0hPQkogKiloZWFkZXIsIHNpemVvZihMT0dCUlVTSCksIGxwTG9nKTsKLQkJCQlkcHJpbnRmX2dkaShzdGRkZWIsIkVudW1PYmplY3RzIC8vIERDX0JydXNoIGxiU3R5bGU9JTA0WFxuIiwgKChMUExPR0JSVVNIKWxwTG9nKS0+bGJTdHlsZSk7Ci0JCQkJZHByaW50Zl9nZGkoc3RkZGViLCJFbnVtT2JqZWN0cyAvLyBEQ19CcnVzaCBsYkNvbG9yPSUwOGxYXG4iLCAoKExQTE9HQlJVU0gpbHBMb2cpLT5sYkNvbG9yKTsKLQkJCQlkcHJpbnRmX2dkaShzdGRkZWIsIkVudW1PYmplY3RzIC8vIERDX0JydXNoIGxiSGF0Y2g9JTA0WFxuIiwgKChMUExPR0JSVVNIKWxwTG9nKS0+bGJIYXRjaCk7Ci0JCQkJfQotCQkJaWYgKGhlYWRlci0+d01hZ2ljID09IFBFTl9NQUdJQykgewotCQkJCVBFTl9HZXRPYmplY3QoIChQRU5PQkogKiloZWFkZXIsIHNpemVvZihMT0dQRU4pLCBscExvZyk7Ci0JCQkJZHByaW50Zl9nZGkoc3RkZGViLCJFbnVtT2JqZWN0cyAvLyBEQ19QZW4gbG9wblN0eWxlPSUwNFhcbiIsICgoTFBMT0dQRU4pbHBMb2cpLT5sb3BuU3R5bGUpOwotCQkJCWRwcmludGZfZ2RpKHN0ZGRlYiwiRW51bU9iamVjdHMgLy8gRENfUGVuIGxvcG5XaWR0aD0lZFxuIiwgKChMUExPR1BFTilscExvZyktPmxvcG5XaWR0aC54KTsKLQkJCQlkcHJpbnRmX2dkaShzdGRkZWIsIkVudW1PYmplY3RzIC8vIERDX1BlbiBsb3BuQ29sb3I9JTA4bFhcbiIsICgoTFBMT0dQRU4pbHBMb2cpLT5sb3BuQ29sb3IpOwotCQkJCX0KLQkJCW5SZXQgPSBDYWxsRW51bU9iamVjdHNQcm9jKCBscEVudW1GdW5jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdESV9IRUFQX1NFR19BRERSKGhMb2cpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpbHBEYXRhICk7Ci0JCQlkcHJpbnRmX2dkaShzdGRkZWIsIkVudW1PYmplY3RzIC8vIGFmdGVyIENhbGxiYWNrIVxuIik7Ci0JCQlpZiAoblJldCA9PSAwKSB7Ci0JCQkJR0RJX0hFQVBfRlJFRShoTG9nKTsKLQkJCQlkcHJpbnRmX2dkaShzdGRkZWIsIkVudW1PYmplY3RzIC8vIEVudW1FbmQgcmVxdWVzdGVkIGJ5IGFwcGxpY2F0aW9uICFcbiIpOwotCQkJCXJldHVybiAwOwotCQkJCX0KLQkJCX0KLQkJfQorICBkcHJpbnRmX2dkaShzdGRkZWIsIkVudW1PYmplY3RzIC8vIFN0b2NrIE9iamVjdHMgZmlyc3QgIVxuIik7CisgIGZvciAoaSA9IDA7IGkgPCBOQl9TVE9DS19PQkpFQ1RTOyBpKyspIHsKKyAgICBoZWFkZXIgPSBTdG9ja09iamVjdHNbaV07CisgICAgaWYgKGhlYWRlci0+d01hZ2ljID09IHdNYWdpYykgeworICAgICAgUEVOX0dldE9iamVjdCggKFBFTk9CSiAqKWhlYWRlciwgc2l6ZW9mKExPR1BFTiksIGxwTG9nKTsKKyAgICAgIEJSVVNIX0dldE9iamVjdCggKEJSVVNIT0JKICopaGVhZGVyLCBzaXplb2YoTE9HQlJVU0gpLGxwTG9nKTsKKyAgICAgIGRwcmludGZfZ2RpKHN0ZGRlYiwiRW51bU9iamVjdHMgLy8gU3RvY2tPYmogbHBMb2c9JXAgbHBEYXRhPSVwXG4iLCBscExvZywgbHBEYXRhKTsKKyAgICAgIGlmIChoZWFkZXItPndNYWdpYyA9PSBCUlVTSF9NQUdJQykgeworCWRwcmludGZfZ2RpKHN0ZGRlYiwiRW51bU9iamVjdHMgLy8gU3RvY2tCcnVzaCBsYlN0eWxlPSUwNFhcbiIsICgoTFBMT0dCUlVTSClscExvZyktPmxiU3R5bGUpOworCWRwcmludGZfZ2RpKHN0ZGRlYiwiRW51bU9iamVjdHMgLy8gU3RvY2tCcnVzaCBsYkNvbG9yPSUwOGxYXG4iLCAoKExQTE9HQlJVU0gpbHBMb2cpLT5sYkNvbG9yKTsKKwlkcHJpbnRmX2dkaShzdGRkZWIsIkVudW1PYmplY3RzIC8vIFN0b2NrQnJ1c2ggbGJIYXRjaD0lMDRYXG4iLCAoKExQTE9HQlJVU0gpbHBMb2cpLT5sYkhhdGNoKTsKKyAgICAgIH0KKyAgICAgIGlmIChoZWFkZXItPndNYWdpYyA9PSBQRU5fTUFHSUMpIHsKKwlkcHJpbnRmX2dkaShzdGRkZWIsIkVudW1PYmplY3RzIC8vIFN0b2NrUGVuIGxvcG5TdHlsZT0lMDRYXG4iLCAoKExQTE9HUEVOKWxwTG9nKS0+bG9wblN0eWxlKTsKKwlkcHJpbnRmX2dkaShzdGRkZWIsIkVudW1PYmplY3RzIC8vIFN0b2NrUGVuIGxvcG5XaWR0aD0lZFxuIiwgKChMUExPR1BFTilscExvZyktPmxvcG5XaWR0aC54KTsKKwlkcHJpbnRmX2dkaShzdGRkZWIsIkVudW1PYmplY3RzIC8vIFN0b2NrUGVuIGxvcG5Db2xvcj0lMDhsWFxuIiwgKChMUExPR1BFTilscExvZyktPmxvcG5Db2xvcik7CisgICAgICB9CisgICAgICBuUmV0ID0gQ2FsbEVudW1PYmplY3RzUHJvYyggbHBFbnVtRnVuYywKKwkJCQkgR0RJX0hFQVBfU0VHX0FERFIoaExvZyksCisJCQkJIChpbnQpbHBEYXRhICk7CisgICAgICBkcHJpbnRmX2dkaShzdGRkZWIsIkVudW1PYmplY3RzIC8vIGFmdGVyIENhbGxiYWNrIVxuIik7CisgICAgICBpZiAoblJldCA9PSAwKSB7CiAJR0RJX0hFQVBfRlJFRShoTG9nKTsKLQlkcHJpbnRmX2dkaShzdGRkZWIsIkVudW1PYmplY3RzIC8vIEVuZCBvZiBlbnVtZXJhdGlvbiAhXG4iKTsKKwlkcHJpbnRmX2dkaShzdGRkZWIsIkVudW1PYmplY3RzIC8vIEVudW1FbmQgcmVxdWVzdGVkIGJ5IGFwcGxpY2F0aW9uICFcbiIpOwogCXJldHVybiAwOworICAgICAgfQorICAgIH0KKyAgfQorICBkcHJpbnRmX2dkaShzdGRkZWIsIkVudW1PYmplY3RzIC8vIE5vdyBEQyBvd25lZCBvYmplY3RzICVwICFcbiIsIGhlYWRlcik7CisjZW5kaWYgIC8qIG5vdGRlZiAqLworICAKKyAgaWYgKGxwUGVuQnJ1c2hMaXN0ID09IE5VTEwpIHJldHVybiAwOworICBmb3IgKGxwaE9iaiA9IGxwUGVuQnJ1c2hMaXN0OyAqbHBoT2JqICE9IDA7ICkgeworICAgIGRwcmludGZfZ2RpKHN0ZGRlYiwiRW51bU9iamVjdHMgLy8gKmxwaE9iaj0lMDRYXG4iLCAqbHBoT2JqKTsKKyAgICBoZWFkZXIgPSAoR0RJT0JKSERSICopIEdESV9IRUFQX0xJTl9BRERSKCpscGhPYmorKyk7CisgICAgaWYgKGhlYWRlci0+d01hZ2ljID09IHdNYWdpYykgeworICAgICAgZHByaW50Zl9nZGkoc3RkZGViLCJFbnVtT2JqZWN0cyAvLyBEQ19PYmogbHBMb2c9JXAgbHBEYXRhPSVwXG4iLCBscExvZywgbHBEYXRhKTsKKyAgICAgIGlmIChoZWFkZXItPndNYWdpYyA9PSBCUlVTSF9NQUdJQykgeworCUJSVVNIX0dldE9iamVjdCggKEJSVVNIT0JKICopaGVhZGVyLCBzaXplb2YoTE9HQlJVU0gpLCBscExvZyk7CisJZHByaW50Zl9nZGkoc3RkZGViLCJFbnVtT2JqZWN0cyAvLyBEQ19CcnVzaCBsYlN0eWxlPSUwNFhcbiIsICgoTFBMT0dCUlVTSClscExvZyktPmxiU3R5bGUpOworCWRwcmludGZfZ2RpKHN0ZGRlYiwiRW51bU9iamVjdHMgLy8gRENfQnJ1c2ggbGJDb2xvcj0lMDhsWFxuIiwgKChMUExPR0JSVVNIKWxwTG9nKS0+bGJDb2xvcik7CisJZHByaW50Zl9nZGkoc3RkZGViLCJFbnVtT2JqZWN0cyAvLyBEQ19CcnVzaCBsYkhhdGNoPSUwNFhcbiIsICgoTFBMT0dCUlVTSClscExvZyktPmxiSGF0Y2gpOworICAgICAgfQorICAgICAgaWYgKGhlYWRlci0+d01hZ2ljID09IFBFTl9NQUdJQykgeworCVBFTl9HZXRPYmplY3QoIChQRU5PQkogKiloZWFkZXIsIHNpemVvZihMT0dQRU4pLCBscExvZyk7CisJZHByaW50Zl9nZGkoc3RkZGViLCJFbnVtT2JqZWN0cyAvLyBEQ19QZW4gbG9wblN0eWxlPSUwNFhcbiIsICgoTFBMT0dQRU4pbHBMb2cpLT5sb3BuU3R5bGUpOworCWRwcmludGZfZ2RpKHN0ZGRlYiwiRW51bU9iamVjdHMgLy8gRENfUGVuIGxvcG5XaWR0aD0lZFxuIiwgKChMUExPR1BFTilscExvZyktPmxvcG5XaWR0aC54KTsKKwlkcHJpbnRmX2dkaShzdGRkZWIsIkVudW1PYmplY3RzIC8vIERDX1BlbiBsb3BuQ29sb3I9JTA4bFhcbiIsICgoTFBMT0dQRU4pbHBMb2cpLT5sb3BuQ29sb3IpOworICAgICAgfQorICAgICAgblJldCA9IENhbGxFbnVtT2JqZWN0c1Byb2MobHBFbnVtRnVuYywgR0RJX0hFQVBfU0VHX0FERFIoaExvZyksCisJCQkJIChMT05HKWxwRGF0YSk7CisgICAgICBpZiAoblJldCA9PSAwKQorICAgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgR0RJX0hFQVBfRlJFRShoTG9nKTsKKyAgZHByaW50Zl9nZGkoc3RkZGViLCJFbnVtT2JqZWN0cyAvLyBFbmQgb2YgZW51bWVyYXRpb24gIVxuIik7CisgIHJldHVybiBuUmV0OwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKZGlmZiAtLWdpdCBhL29iamVjdHMvb2VtYml0bWFwLmMgYi9vYmplY3RzL29lbWJpdG1hcC5jCmluZGV4IDM4MWJlYzYuLjg3MDkzZjYgMTAwNjQ0Ci0tLSBhL29iamVjdHMvb2VtYml0bWFwLmMKKysrIGIvb2JqZWN0cy9vZW1iaXRtYXAuYwpAQCAtMTgsNiArMTgsMTEgQEAKIAogCiAgIC8qIEluY2x1ZGUgT0VNIHBpeG1hcHMgKi8KKyNpbmNsdWRlICJiaXRtYXBzL29ibV9jZHJvbSIKKyNpbmNsdWRlICJiaXRtYXBzL29ibV9oYXJkZGlzayIKKyNpbmNsdWRlICJiaXRtYXBzL29ibV9kcml2ZSIKKyNpbmNsdWRlICJiaXRtYXBzL29ibV9mb2xkZXIyIgorI2luY2x1ZGUgImJpdG1hcHMvb2JtX2ZvbGRlciIKICNpbmNsdWRlICJiaXRtYXBzL29ibV9sZmFycm93aSIKICNpbmNsdWRlICJiaXRtYXBzL29ibV9yZ2Fycm93aSIKICNpbmNsdWRlICJiaXRtYXBzL29ibV9kbmFycm93aSIKQEAgLTUzLDcgKzU4LDcgQEAKICNpbmNsdWRlICJiaXRtYXBzL29ibV9zaXplIgogI2luY2x1ZGUgImJpdG1hcHMvb2JtX29sZF9jbG9zZSIKIAotI2RlZmluZSBPQk1fRklSU1QgIE9CTV9MRkFSUk9XSSAgICAvKiBGaXJzdCBPRU0gYml0bWFwICovCisjZGVmaW5lIE9CTV9GSVJTVCAgT0JNX0NEUk9NICAgICAgLyogRmlyc3QgT0VNIGJpdG1hcCAqLwogI2RlZmluZSBPQk1fTEFTVCAgIE9CTV9PTERfQ0xPU0UgICAvKiBMYXN0IE9FTSBiaXRtYXAgKi8KIAogc3RhdGljIGNvbnN0IHN0cnVjdApAQCAtNjEsNiArNjYsMTEgQEAKICAgICBjaGFyKiogZGF0YTsgICAvKiBQb2ludGVyIHRvIGJpdG1hcCBkYXRhICovCiAgICAgQk9PTCAgIGNvbG9yOyAgLyogSXMgaXQgYSBjb2xvciBiaXRtYXA/ICAqLwogfSBPQk1fUGl4bWFwc19EYXRhW09CTV9MQVNULU9CTV9GSVJTVCsxXSA9IHsKKyAgICB7IG9ibV9jZHJvbSwgVFJVRSB9LCAgICAgICAgLyogT0JNX0NEUk9NICAgICovCisgICAgeyBvYm1faGFyZGRpc2ssIFRSVUUgfSwgICAgIC8qIE9CTV9IQVJERElTSyAqLworICAgIHsgb2JtX2RyaXZlLCBUUlVFIH0sICAgICAgICAvKiBPQk1fRFJJVkUgICAgKi8KKyAgICB7IG9ibV9mb2xkZXIyLCBUUlVFIH0sICAgICAgLyogT0JNX0ZPTERFUjIgICovCisgICAgeyBvYm1fZm9sZGVyLCBUUlVFIH0sICAgICAgIC8qIE9CTV9GT0xERVIgICAqLwogICAgIHsgb2JtX2xmYXJyb3dpLCBUUlVFIH0sICAgICAvKiBPQk1fTEZBUlJPV0kgKi8KICAgICB7IG9ibV9yZ2Fycm93aSwgVFJVRSB9LCAgICAgLyogT0JNX1JHQVJST1dJICovCiAgICAgeyBvYm1fZG5hcnJvd2ksIFRSVUUgfSwgICAgIC8qIE9CTV9ETkFSUk9XSSAqLwpAQCAtMTA0LDkgKzExNCwxMiBAQAogI2luY2x1ZGUgImJpdG1hcHMvb2ljX3F1ZXMiCiAjaW5jbHVkZSAiYml0bWFwcy9vaWNfYmFuZyIKICNpbmNsdWRlICJiaXRtYXBzL29pY19ub3RlIgorI2luY2x1ZGUgImJpdG1hcHMvb2ljX3BvcnRyYWl0IgorI2luY2x1ZGUgImJpdG1hcHMvb2ljX2xhbmRzY2FwZSIKKyNpbmNsdWRlICJiaXRtYXBzL29pY193aW5laWNvbiIKIAogI2RlZmluZSBPSUNfRklSU1QgIE9JQ19TQU1QTEUgICAgICAvKiBGaXJzdCBPRU0gaWNvbiAqLwotI2RlZmluZSBPSUNfTEFTVCAgIE9JQ19OT1RFICAgICAgICAvKiBMYXN0IE9FTSBpY29uICovCisjZGVmaW5lIE9JQ19MQVNUICAgT0lDX1dJTkVJQ09OICAgLyogTGFzdCBPRU0gaWNvbiAqLwogCiBzdGF0aWMgY2hhciAqKk9CTV9JY29uc19EYXRhW09JQ19MQVNULU9JQ19GSVJTVCsxXSA9CiB7CkBAIC0xMTQsNyArMTI3LDEwIEBACiAgICAgb2ljX2hhbmQsICAgICAgLyogT0lDX0hBTkQgKi8KICAgICBvaWNfcXVlcywgICAgICAvKiBPSUNfUVVFUyAqLwogICAgIG9pY19iYW5nLCAgICAgIC8qIE9JQ19CQU5HICovCi0gICAgb2ljX25vdGUgICAgICAgLyogT0lDX05PVEUgKi8KKyAgICBvaWNfbm90ZSwgICAgICAvKiBPSUNfTk9URSAqLworICAgIG9pY19wb3J0cmFpdCwgIC8qIE9JQ19QT1JUUkFJVCAqLworICAgIG9pY19sYW5kc2NhcGUsIC8qIE9JQ19MQU5EU0NBUEUgKi8KKyAgICBvaWNfd2luZWljb24gICAvKiBPSUNfV0lORUlDT04gKi8KIH07CiAKIApAQCAtMTM3LDYgKzE1MywxMiBAQAogICAgIHsgImdyZWVuIiwgICAgICAgICAgICBSR0IoMCwyNTUsMCkgfSwKICAgICB7ICJibHVlIiwgICAgICAgICAgICAgUkdCKDAsMCwyNTUpIH0sCiAgICAgeyAieWVsbG93IiwgICAgICAgICAgIFJHQigyNTUsMjU1LDApIH0sCisgICAgeyAiY3lhbiIsICAgICAgICAgICAgIFJHQigwLDI1NSwyNTUpIH0sICAgIAorICAgIHsgImRreWVsbG93IiwgICAgICAgICBSR0IoMTI4LDEyOCwwKSB9LAorICAgIHsgInB1cnBsZSIsICAgICAgICAgICBSR0IoMTI4LDAsMTI4KSB9LAorICAgIHsgImx0Z3JheSIsICAgICAgICAgICBSR0IoMTkyLDE5MiwxOTIpIH0sCisgICAgeyAiZGtncmF5IiwgICAgICAgICAgIFJHQigxMjgsMTI4LDEyOCkgfSwKKyAgICB7ICJmb2xkZXJjb2wiLCAgICAgICAgUkdCKDAsMTkxLDE5MSkgfSwKICAgICB7ICJidXR0b25fZmFjZSIsICAgICAgUEFMRVRURUlOREVYKENPTE9SX0JUTkZBQ0UpIH0sCiAgICAgeyAiYnV0dG9uX3NoYWRvdyIsICAgIFBBTEVUVEVJTkRFWChDT0xPUl9CVE5TSEFET1cpIH0sCiAgICAgeyAiYnV0dG9uX2hpZ2hsaWdodCIsIFBBTEVUVEVJTkRFWChDT0xPUl9CVE5ISUdITElHSFQpIH0sCmRpZmYgLS1naXQgYS9vYmplY3RzL3BhbGV0dGUuYyBiL29iamVjdHMvcGFsZXR0ZS5jCmluZGV4IGJlZTA1ZDUuLjgwYjY0YzQgMTAwNjQ0Ci0tLSBhL29iamVjdHMvcGFsZXR0ZS5jCisrKyBiL29iamVjdHMvcGFsZXR0ZS5jCkBAIC04MCw2ICs4MCwxNyBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIEdldFN5c3RlbVBhbGV0dGVVc2UgICAgKEdESS4zNzQpCisgKi8KK1dPUkQgR2V0U3lzdGVtUGFsZXR0ZVVzZSggSERDIGhkYyApCit7CisJcHJpbnRmKCJHZXRTeXN0ZW1QYWxldHRlVXNlKCUwNFgpIC8vIGVtcHR5IHN0dWIgISEhXG4iLCBoZGMpOworCS8qIEFzc3VtaW5nIHRoZXJlIGlzIHJlbWFpbmluZyBzeXN0ZW0gY29sb3JzIC4uLiAqLworCXJldHVybiBTWVNQQUxfU1RBVElDOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIEdldFN5c3RlbVBhbGV0dGVFbnRyaWVzICAgIChHREkuMzc1KQogICovCiBXT1JEIEdldFN5c3RlbVBhbGV0dGVFbnRyaWVzKCBIREMgaGRjLCBXT1JEIHN0YXJ0LCBXT1JEIGNvdW50LApkaWZmIC0tZ2l0IGEvcmMvSW1ha2VmaWxlIGIvcmMvSW1ha2VmaWxlCmluZGV4IDQyNGFkZGIuLjU2ZjllMTQgMTAwNjQ0Ci0tLSBhL3JjL0ltYWtlZmlsZQorKysgYi9yYy9JbWFrZWZpbGUKQEAgLTQ2LDkgKzQ2LDYgQEAKICNpZiBkZWZpbmVkKGkzODZCc2RBcmNoaXRlY3R1cmUpIHx8IGRlZmluZWQoaTM4NkZyZWVCc2QpIHx8IGRlZmluZWQoRnJlZUJTREFyY2hpdGVjdHVyZSkKIExPQ0FMX0xJQlJBUklFUyA9IC1sbAogI2VuZGlmCi0jaWZkZWYgTGludXhBcmNoaXRlY3R1cmUKLUxPQ0FMX0xJQlJBUklFUyA9IC1sZmwKLSNlbmRpZgogCiBOb3JtYWxQcm9ncmFtVGFyZ2V0KHdpbmVyYywkKE9CSlMpLCQoREVQTElCUyksJChMT0NBTF9MSUJSQVJJRVMpLCkKIApkaWZmIC0tZ2l0IGEvcmMvcGFyc2VyLmwgYi9yYy9wYXJzZXIubAppbmRleCAzMzhhMTNmLi4zYWRkMmI1IDEwMDY0NAotLS0gYS9yYy9wYXJzZXIubAorKysgYi9yYy9wYXJzZXIubApAQCAtNzMsMyArNzMsOSBAQAogXCdbXiddKlwnICAgeXlsdmFsLnN0cj1zdHJkdXAoeXl0ZXh0KzEpO3JldHVybiBTSU5HTEVfUVVPVEVEOwogWyBcdFxuXHJdCQk7CiAuCQkJcmV0dXJuIHl5dGV4dFswXTsKKyUlCisKKyNpZm5kZWYgeXl3cmFwCitpbnQgeXl3cmFwKHZvaWQpIHsgcmV0dXJuIDE7IH0KKyNlbmRpZgorCmRpZmYgLS1naXQgYS9yYy9zeXNyZXMucmMgYi9yYy9zeXNyZXMucmMKaW5kZXggNjc0ZGY2NS4uMmNhNTdjOCAxMDA2NDQKLS0tIGEvcmMvc3lzcmVzLnJjCisrKyBiL3JjL3N5c3Jlcy5yYwpAQCAtMTUsMzYgKzE1LDE5IEBACiAgTUVOVUlURU0gIiZBYm91dCBXSU5FIC4uLiIsIDYxNzYxCiB9CiAKLQotMiBESUFMT0cgTE9BRE9OQ0FMTCBNT1ZFQUJMRSBESVNDQVJEQUJMRSA4MCwgODAsIDE1MCwgMTcwCi1TVFlMRSBXU19QT1BVUCB8IFdTX1ZJU0lCTEUgfCBXU19ETEdGUkFNRQotewotIFBVU0hCVVRUT04gIkNyZWRpdCAmIExpY2Vuc2UiLCA2LCAzMCwgMTUwLCA0MCwgMTQsIFdTX0dST1VQIHwgV1NfVEFCU1RPUAotIFBVU0hCVVRUT04gIkNhbmNlbCIsIDIsIDYwLCAyNTAsIDQwLCAxNCwgV1NfR1JPVVAgfCBXU19UQUJTVE9QCi0gREVGUFVTSEJVVFRPTiAiT2siLCAxLCA4MCwgMTUwLCA0MCwgMTQsIEJTX0RFRlBVU0hCVVRUT04gfCBXU19HUk9VUCB8IFdTX1RBQlNUT1AKLX0KLQotCi1TVE9QX01TR0JPWCBESUFMT0cgTE9BRE9OQ0FMTCBNT1ZFQUJMRSBESVNDQVJEQUJMRSA4MCwgODAsIDE1MCwgNzUKLVNUWUxFIFdTX1BPUFVQIHwgV1NfVklTSUJMRSB8IFdTX0RMR0ZSQU1FCi17Ci0gSUNPTiAiU1lTSURJX0hBTkQiLCAtMSwgMTYsIDE2LCAwLCAwCi19Ci0KLQotUVVFU1RJT05fTVNHQk9YIERJQUxPRyBMT0FET05DQUxMIE1PVkVBQkxFIERJU0NBUkRBQkxFIDgwLCA4MCwgMTUwLCA3NQotU1RZTEUgV1NfUE9QVVAgfCBXU19WSVNJQkxFIHwgV1NfRExHRlJBTUUKLXsKLSBJQ09OICJTWVNJRElfUVVFU1RJT04iLCAtMSwgMTYsIDE2LCAwLCAwCi19Ci0KLQotRVhDTEFNQVRJT05fTVNHQk9YIERJQUxPRyBMT0FET05DQUxMIE1PVkVBQkxFIERJU0NBUkRBQkxFIDgwLCA4MCwgMTUwLCA3NQotU1RZTEUgV1NfUE9QVVAgfCBXU19WSVNJQkxFIHwgV1NfRExHRlJBTUUKLXsKLSBJQ09OICJTWVNJRElfRVhDTEFNQVRJT04iLCAtMSwgMTYsIDE2LCAwLCAwCi19Ci0KK01TR0JPWCBESUFMT0cgMTAwLCA4MCwgMjE2LCAxNjgKK1NUWUxFIERTX1NZU01PREFMIHwgRFNfTU9EQUxGUkFNRSB8IFdTX1BPUFVQIHwgV1NfVklTSUJMRSB8IFdTX0NBUFRJT04gfCBXU19TWVNNRU5VCitCRUdJTgorICAgICAgICBJQ09OICIiLCAxMDg4LCA4LCAyMCwgMTYsIDE2LCBXU19DSElMRCB8IFdTX1ZJU0lCTEUKKyAgICAgICAgTFRFWFQgIiIsIDEwMCwgMzIsIDQsIDE3NiwgNDgsIFdTX0NISUxEIHwgV1NfVklTSUJMRSB8IFdTX0dST1VQCisgICAgICAgIFBVU0hCVVRUT04gIiZPayIsIDEsIDE2LCA1NiwgNDAsIDE0LCBXU19DSElMRCB8IFdTX1ZJU0lCTEUgfCBXU19UQUJTVE9QCisgICAgICAgIFBVU0hCVVRUT04gIiZDYW5jZWwiLCAyLCA2NCwgNTYsIDQwLCAxNCwgV1NfQ0hJTEQgfCBXU19WSVNJQkxFIHwgV1NfVEFCU1RPUAorICAgICAgICBQVVNIQlVUVE9OICImQWJvcnQiLCAzLCAxMTIsIDU2LCA0MCwgMTQsIFdTX0NISUxEIHwgV1NfVklTSUJMRSB8IFdTX1RBQlNUT1AKKyAgICAgICAgUFVTSEJVVFRPTiAiJlJldHJ5IiwgNCwgMTYwLCA1NiwgNDAsIDE0LCBXU19DSElMRCB8IFdTX1ZJU0lCTEUgfCBXU19UQUJTVE9QCisgICAgICAgIFBVU0hCVVRUT04gIiZJZ25vcmUiLCA1LCAyMDgsIDU2LCA0MCwgMTQsIFdTX0NISUxEIHwgV1NfVklTSUJMRSB8IFdTX1RBQlNUT1AKKyAgICAgICAgUFVTSEJVVFRPTiAiJlllcyIsIDYsIDI1NiwgNTYsIDQwLCAxNCwgV1NfQ0hJTEQgfCBXU19WSVNJQkxFIHwgV1NfVEFCU1RPUAorICAgICAgICBQVVNIQlVUVE9OICImTm8iLCA3LCAzMDQsIDU2LCA0MCwgMTQsIFdTX0NISUxEIHwgV1NfVklTSUJMRSB8IFdTX1RBQlNUT1AKK0VORAogCiBTSEVMTF9BQk9VVF9NU0dCT1ggRElBTE9HIExPQURPTkNBTEwgTU9WRUFCTEUgRElTQ0FSREFCTEUgNTAsIDQ0LCAyMTMsIDE0OQogU1RZTEUgRFNfTE9DQUxFRElUIHwgRFNfTU9EQUxGUkFNRSB8IFdTX1BPUFVQIHwgV1NfVklTSUJMRSB8IFdTX0NBUFRJT04gfCBXU19TWVNNRU5VCkBAIC01NCw3ICszNyw3IEBACiAgREVGUFVTSEJVVFRPTiAiT0siLCAxLCA4NiwgMTMwLCA0MCwgMTQKICBDT05UUk9MICIiLCAtMSwgIlNUQVRJQyIsIFNTX0JMQUNLRlJBTUUgfCBXU19DSElMRCB8IFdTX1ZJU0lCTEUgfCBXU19ESVNBQkxFRCwgNCwgMzUsIDIwNSwgOTAKICBMVEVYVCAiVGV4dCIsIDEwMCwgMTEsIDQwLCAxOTAsIDgwLCBTU19OT1BSRUZJWCB8IFdTX0dST1VQCi0gSUNPTiAiV0lORUlDT04iLCAtMSwgMTg1LCAxMCwgMTgsIDIwCisgSUNPTiAiIiwgMTA4OCwgMTg1LCAxMCwgMTgsIDIwCiB9CiAKIApkaWZmIC0tZ2l0IGEvcmMvc3lzcmVzX0RlLnJjIGIvcmMvc3lzcmVzX0RlLnJjCmluZGV4IDAzODUyYmMuLjAwYmI0OTggMTAwNjQ0Ci0tLSBhL3JjL3N5c3Jlc19EZS5yYworKysgYi9yYy9zeXNyZXNfRGUucmMKQEAgLTEzLDM2ICsxMywxOSBAQAogIE1FTlVJVEVNICIm3GJlciBXSU5FIC4uLiIsIDYxNzYxCiB9CiAKLQotMiBESUFMT0cgTE9BRE9OQ0FMTCBNT1ZFQUJMRSBESVNDQVJEQUJMRSA4MCwgODAsIDE1MCwgMTcwCi1TVFlMRSBXU19QT1BVUCB8IFdTX1ZJU0lCTEUgfCBXU19ETEdGUkFNRQotewotIFBVU0hCVVRUT04gIktyZWRpdCAmIExpemVueiIsIDYsIDMwLCAxNTAsIDQwLCAxNCwgV1NfR1JPVVAgfCBXU19UQUJTVE9QCi0gUFVTSEJVVFRPTiAiQWJicnVjaCIsIDIsIDYwLCAyNTAsIDQwLCAxNCwgV1NfR1JPVVAgfCBXU19UQUJTVE9QCi0gREVGUFVTSEJVVFRPTiAiT2siLCAxLCA4MCwgMTUwLCA0MCwgMTQsIEJTX0RFRlBVU0hCVVRUT04gfCBXU19HUk9VUCB8IFdTX1RBQlNUT1AKLX0KLQotCi1TVE9QX01TR0JPWCBESUFMT0cgTE9BRE9OQ0FMTCBNT1ZFQUJMRSBESVNDQVJEQUJMRSA4MCwgODAsIDE1MCwgNzUKLVNUWUxFIFdTX1BPUFVQIHwgV1NfVklTSUJMRSB8IFdTX0RMR0ZSQU1FCi17Ci0gSUNPTiAiU1lTSURJX0hBTkQiLCAtMSwgMTYsIDE2LCAwLCAwCi19Ci0KLQotUVVFU1RJT05fTVNHQk9YIERJQUxPRyBMT0FET05DQUxMIE1PVkVBQkxFIERJU0NBUkRBQkxFIDgwLCA4MCwgMTUwLCA3NQotU1RZTEUgV1NfUE9QVVAgfCBXU19WSVNJQkxFIHwgV1NfRExHRlJBTUUKLXsKLSBJQ09OICJTWVNJRElfUVVFU1RJT04iLCAtMSwgMTYsIDE2LCAwLCAwCi19Ci0KLQotRVhDTEFNQVRJT05fTVNHQk9YIERJQUxPRyBMT0FET05DQUxMIE1PVkVBQkxFIERJU0NBUkRBQkxFIDgwLCA4MCwgMTUwLCA3NQotU1RZTEUgV1NfUE9QVVAgfCBXU19WSVNJQkxFIHwgV1NfRExHRlJBTUUKLXsKLSBJQ09OICJTWVNJRElfRVhDTEFNQVRJT04iLCAtMSwgMTYsIDE2LCAwLCAwCi19Ci0KK01TR0JPWCBESUFMT0cgMTAwLCA4MCwgMjE2LCAxNjgKK1NUWUxFIERTX1NZU01PREFMIHwgRFNfTU9EQUxGUkFNRSB8IFdTX1BPUFVQIHwgV1NfVklTSUJMRSB8IFdTX0NBUFRJT04gfCBXU19TWVNNRU5VCitCRUdJTgorICAgICAgICBJQ09OICIiLCAxMDg4LCA4LCAyMCwgMTYsIDE2LCBXU19DSElMRCB8IFdTX1ZJU0lCTEUKKyAgICAgICAgTFRFWFQgIiIsIDEwMCwgMzIsIDQsIDE3NiwgNDgsIFdTX0NISUxEIHwgV1NfVklTSUJMRSB8IFdTX0dST1VQCisgICAgICAgIFBVU0hCVVRUT04gIiZPayIsIDEsIDE2LCA1NiwgNDAsIDE0LCBXU19DSElMRCB8IFdTX1ZJU0lCTEUgfCBXU19UQUJTVE9QCisgICAgICAgIFBVU0hCVVRUT04gIiZBYmJydWNoIiwgMiwgNjQsIDU2LCA0MCwgMTQsIFdTX0NISUxEIHwgV1NfVklTSUJMRSB8IFdTX1RBQlNUT1AKKyAgICAgICAgUFVTSEJVVFRPTiAiJkFiYnJ1Y2giLCAzLCAxMTIsIDU2LCA0MCwgMTQsIFdTX0NISUxEIHwgV1NfVklTSUJMRSB8IFdTX1RBQlNUT1AKKyAgICAgICAgUFVTSEJVVFRPTiAiJldpZWRlcmhvbGVuIiwgNCwgMTYwLCA1NiwgNDAsIDE0LCBXU19DSElMRCB8IFdTX1ZJU0lCTEUgfCBXU19UQUJTVE9QCisgICAgICAgIFBVU0hCVVRUT04gIiZJZ25vcmllcmVuIiwgNSwgMjA4LCA1NiwgNDAsIDE0LCBXU19DSElMRCB8IFdTX1ZJU0lCTEUgfCBXU19UQUJTVE9QCisgICAgICAgIFBVU0hCVVRUT04gIiZKYSIsIDYsIDI1NiwgNTYsIDQwLCAxNCwgV1NfQ0hJTEQgfCBXU19WSVNJQkxFIHwgV1NfVEFCU1RPUAorICAgICAgICBQVVNIQlVUVE9OICImTmVpbiIsIDcsIDMwNCwgNTYsIDQwLCAxNCwgV1NfQ0hJTEQgfCBXU19WSVNJQkxFIHwgV1NfVEFCU1RPUAorRU5ECiAKIFNIRUxMX0FCT1VUX01TR0JPWCBESUFMT0cgTE9BRE9OQ0FMTCBNT1ZFQUJMRSBESVNDQVJEQUJMRSA1MCwgNDQsIDIxMywgMTQ5CiBTVFlMRSBEU19MT0NBTEVESVQgfCBEU19NT0RBTEZSQU1FIHwgV1NfUE9QVVAgfCBXU19WSVNJQkxFIHwgV1NfQ0FQVElPTiB8IFdTX1NZU01FTlUKQEAgLTUyLDcgKzM1LDcgQEAKICBERUZQVVNIQlVUVE9OICJPSyIsIDEsIDg2LCAxMzAsIDQwLCAxNAogIENPTlRST0wgIiIsIC0xLCAiU1RBVElDIiwgU1NfQkxBQ0tGUkFNRSB8IFdTX0NISUxEIHwgV1NfVklTSUJMRSB8IFdTX0RJU0FCTEVELCA0LCAzNSwgMjA1LCA5MAogIExURVhUICJUZXh0IiwgMTAwLCAxMSwgNDAsIDE5MCwgODAsIFNTX05PUFJFRklYIHwgV1NfR1JPVVAKLSBJQ09OICJXSU5FSUNPTiIsIC0xLCAxODUsIDEwLCAxOCwgMjAKKyBJQ09OICIiLCAxMDg4LCAxODUsIDEwLCAxOCwgMjAKIH0KIAogCmRpZmYgLS1naXQgYS9yYy9zeXNyZXNfTm8ucmMgYi9yYy9zeXNyZXNfTm8ucmMKaW5kZXggYWZhMmI1OC4uZWUxODliMiAxMDA2NDQKLS0tIGEvcmMvc3lzcmVzX05vLnJjCisrKyBiL3JjL3N5c3Jlc19Oby5yYwpAQCAtMTMsMzYgKzEzLDE5IEBACiAgTUVOVUlURU0gIiZPbSBXSU5FIC4uLiIsIDYxNzYxCiB9CiAKLQotMiBESUFMT0cgTE9BRE9OQ0FMTCBNT1ZFQUJMRSBESVNDQVJEQUJMRSA4MCwgODAsIDE1MCwgMTcwCi1TVFlMRSBXU19QT1BVUCB8IFdTX1ZJU0lCTEUgfCBXU19ETEdGUkFNRQotewotIFBVU0hCVVRUT04gIkxpc2VucyBvc3YuIiwgNiwgMzAsIDE1MCwgNDAsIDE0LCBXU19HUk9VUCB8IFdTX1RBQlNUT1AKLSBQVVNIQlVUVE9OICJBdmJyeXQiLCAyLCA2MCwgMjUwLCA0MCwgMTQsIFdTX0dST1VQIHwgV1NfVEFCU1RPUAotIERFRlBVU0hCVVRUT04gIk9rIiwgMSwgODAsIDE1MCwgNDAsIDE0LCBCU19ERUZQVVNIQlVUVE9OIHwgV1NfR1JPVVAgfCBXU19UQUJTVE9QCi19Ci0KLQotU1RPUF9NU0dCT1ggRElBTE9HIExPQURPTkNBTEwgTU9WRUFCTEUgRElTQ0FSREFCTEUgODAsIDgwLCAxNTAsIDc1Ci1TVFlMRSBXU19QT1BVUCB8IFdTX1ZJU0lCTEUgfCBXU19ETEdGUkFNRQotewotIElDT04gIlNZU0lESV9IQU5EIiwgLTEsIDE2LCAxNiwgMCwgMAotfQotCi0KLVFVRVNUSU9OX01TR0JPWCBESUFMT0cgTE9BRE9OQ0FMTCBNT1ZFQUJMRSBESVNDQVJEQUJMRSA4MCwgODAsIDE1MCwgNzUKLVNUWUxFIFdTX1BPUFVQIHwgV1NfVklTSUJMRSB8IFdTX0RMR0ZSQU1FCi17Ci0gSUNPTiAiU1lTSURJX1FVRVNUSU9OIiwgLTEsIDE2LCAxNiwgMCwgMAotfQotCi0KLUVYQ0xBTUFUSU9OX01TR0JPWCBESUFMT0cgTE9BRE9OQ0FMTCBNT1ZFQUJMRSBESVNDQVJEQUJMRSA4MCwgODAsIDE1MCwgNzUKLVNUWUxFIFdTX1BPUFVQIHwgV1NfVklTSUJMRSB8IFdTX0RMR0ZSQU1FCi17Ci0gSUNPTiAiU1lTSURJX0VYQ0xBTUFUSU9OIiwgLTEsIDE2LCAxNiwgMCwgMAotfQotCitNU0dCT1ggRElBTE9HIDEwMCwgODAsIDIxNiwgMTY4CitTVFlMRSBEU19TWVNNT0RBTCB8IERTX01PREFMRlJBTUUgfCBXU19QT1BVUCB8IFdTX1ZJU0lCTEUgfCBXU19DQVBUSU9OIHwgV1NfU1lTTUVOVQorQkVHSU4KKyAgICAgICAgSUNPTiAiIiwgMTA4OCwgOCwgMjAsIDE2LCAxNiwgV1NfQ0hJTEQgfCBXU19WSVNJQkxFCisgICAgICAgIExURVhUICIiLCAxMDAsIDMyLCA0LCAxNzYsIDQ4LCBXU19DSElMRCB8IFdTX1ZJU0lCTEUgfCBXU19HUk9VUAorICAgICAgICBQVVNIQlVUVE9OICImT2siLCAxLCAxNiwgNTYsIDQwLCAxNCwgV1NfQ0hJTEQgfCBXU19WSVNJQkxFIHwgV1NfVEFCU1RPUAorICAgICAgICBQVVNIQlVUVE9OICImQXZicnl0IiwgMiwgNjQsIDU2LCA0MCwgMTQsIFdTX0NISUxEIHwgV1NfVklTSUJMRSB8IFdTX1RBQlNUT1AKKyAgICAgICAgUFVTSEJVVFRPTiAiJkF2YnJ5dCIsIDMsIDExMiwgNTYsIDQwLCAxNCwgV1NfQ0hJTEQgfCBXU19WSVNJQkxFIHwgV1NfVEFCU1RPUAorICAgICAgICBQVVNIQlVUVE9OICImR2plbnRhIiwgNCwgMTYwLCA1NiwgNDAsIDE0LCBXU19DSElMRCB8IFdTX1ZJU0lCTEUgfCBXU19UQUJTVE9QCisgICAgICAgIFBVU0hCVVRUT04gIiZJZ25vcmVyIiwgNSwgMjA4LCA1NiwgNDAsIDE0LCBXU19DSElMRCB8IFdTX1ZJU0lCTEUgfCBXU19UQUJTVE9QCisgICAgICAgIFBVU0hCVVRUT04gIiZKYSIsIDYsIDI1NiwgNTYsIDQwLCAxNCwgV1NfQ0hJTEQgfCBXU19WSVNJQkxFIHwgV1NfVEFCU1RPUAorICAgICAgICBQVVNIQlVUVE9OICImTmVpIiwgNywgMzA0LCA1NiwgNDAsIDE0LCBXU19DSElMRCB8IFdTX1ZJU0lCTEUgfCBXU19UQUJTVE9QCitFTkQKIAogU0hFTExfQUJPVVRfTVNHQk9YIERJQUxPRyBMT0FET05DQUxMIE1PVkVBQkxFIERJU0NBUkRBQkxFIDUwLCA0NCwgMjEzLCAxNDkKIFNUWUxFIERTX0xPQ0FMRURJVCB8IERTX01PREFMRlJBTUUgfCBXU19QT1BVUCB8IFdTX1ZJU0lCTEUgfCBXU19DQVBUSU9OIHwgV1NfU1lTTUVOVQpAQCAtNTIsNyArMzUsNyBAQAogIERFRlBVU0hCVVRUT04gIk9LIiwgMSwgODYsIDEzMCwgNDAsIDE0CiAgQ09OVFJPTCAiIiwgLTEsICJTVEFUSUMiLCBTU19CTEFDS0ZSQU1FIHwgV1NfQ0hJTEQgfCBXU19WSVNJQkxFIHwgV1NfRElTQUJMRUQsIDQsIDM1LCAyMDUsIDkwCiAgTFRFWFQgIlRla3N0IiwgMTAwLCAxMSwgNDAsIDE5MCwgODAsIFNTX05PUFJFRklYIHwgV1NfR1JPVVAKLSBJQ09OICJXSU5FSUNPTiIsIC0xLCAxODUsIDEwLCAxOCwgMjAKKyBJQ09OICIiLCAxMDg4LCAxODUsIDEwLCAxOCwgMjAKIH0KIAogCmRpZmYgLS1naXQgYS90b29sa2l0L3N1cC5jIGIvdG9vbGtpdC9zdXAuYwppbmRleCBmMjIzNDNjLi5lZjk1MTIwIDEwMDY0NAotLS0gYS90b29sa2l0L3N1cC5jCisrKyBiL3Rvb2xraXQvc3VwLmMKQEAgLTUsOCArNSw2IEBACiAjaW5jbHVkZSAid2luZS5oIgogI2luY2x1ZGUgImFyY2guaCIKIAotLyogSEFORExFIGhTeXNSZXMgPSAxOyAqLwotCiBMT05HIENhbGxXaW5kb3dQcm9jIChXTkRQUk9DIGZ1bmMsIEhXTkQgaHduZCwgV09SRCBtZXNzYWdlLAogCQkgICAgIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSkKIHsKZGlmZiAtLWdpdCBhL3Rvb2xraXQvd2lubWFpbi5jIGIvdG9vbGtpdC93aW5tYWluLmMKaW5kZXggYTU3MThjYS4uNDFkYTNhZSAxMDA2NDQKLS0tIGEvdG9vbGtpdC93aW5tYWluLmMKKysrIGIvdG9vbGtpdC93aW5tYWluLmMKQEAgLTQsMjIgKzQsMTIgQEAKICNpbmNsdWRlICJ3aW5kb3dzLmgiCiAjaW5jbHVkZSAid2luZS5oIgogCi1leHRlcm4gSElOU1RBTkNFIGhTeXNSZXM7Ci0KIF9XaW5NYWluIChpbnQgYXJnYywgY2hhciAqYXJndiBbXSkKIHsKICAgICBpbnQgcmV0X3ZhbDsKICAgICBjaGFyIGZpbGVuYW1lIFs0MDk2XSwgKm1vZHVsZV9uYW1lLCAqcmVzb3VyY2VfZmlsZTsKICAgICBIQU5ETEUgaFRhc2tNYWluLCBoSW5zdGFuY2U7CiAgICAgCi0gICAgR2V0UHJpdmF0ZVByb2ZpbGVTdHJpbmcoIndpbmUiLCAiU3lzdGVtUmVzb3VyY2VzIiwgInN5c3Jlcy5kbGwiLCAKLQkJCSAgICBmaWxlbmFtZSwgc2l6ZW9mKGZpbGVuYW1lKSwgV0lORV9JTkkpOwotICAgIGhTeXNSZXMgPSBMb2FkSW1hZ2UoZmlsZW5hbWUpOwotICAgIGlmIChoU3lzUmVzID09IChISU5TVEFOQ0UpTlVMTCkKLQlwcmludGYoIkVycm9yIExvYWRpbmcgU3lzdGVtIFJlc291cmNlcyAhISFcbiIpOwotICAgIGVsc2UKLQlwcmludGYoIlN5c3RlbSBSZXNvdXJjZXMgTG9hZGVkIC8vIGhTeXNSZXM9JyUwNFgnXG4iLCBoU3lzUmVzKTsKLQogICAgIGlmICgobW9kdWxlX25hbWUgPSBzdHJjaHIgKGFyZ3YgWzBdLCAnLycpKSA9PSBOVUxMKXsKIAlwcmludGYgKCJFcnJvcjogQ2FuJ3QgZGV0ZXJtaW5lIGJhc2UgbmFtZSBmb3IgcmVzb3VyY2UgbG9hZGluZ1xuIik7CiAJcmV0dXJuIDA7CkBAIC0zMSw3ICsyMSw3IEBACiAKICAgICBoSW5zdGFuY2UgPSBMb2FkSW1hZ2UgKHJlc291cmNlX2ZpbGUsIDAsIDApOwogICAgIAotICAgIFVTRVJfSW5pdEFwcCAoaFN5c1Jlcyk7CisgICAgVVNFUl9Jbml0QXBwKCBoSW5zdGFuY2UgKTsKICAgICBoVGFza01haW4gPSBDcmVhdGVOZXdUYXNrICgxKTsgLyogVGhpcyBpcyBub3QgY29ycmVjdCAqLwogICAgIHJldF92YWwgPSBXaW5NYWluIChoSW5zdGFuY2UsCS8qIGhJbnN0YW5jZSAqLwogCQkgICAgICAgMCwJCS8qIGhQcmV2SW5zdGFuY2UgKi8KZGlmZiAtLWdpdCBhL3Rvb2xzL2J1aWxkLmMgYi90b29scy9idWlsZC5jCmluZGV4IGVmMGIyYjYuLmI3OWRjNTEgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2J1aWxkLmMKKysrIGIvdG9vbHMvYnVpbGQuYwpAQCAtMSw2ICsxLDcgQEAKIC8qCiAgKiBDb3B5cmlnaHQgMTk5MyBSb2JlcnQgSi4gQW1zdGFkdAogICogQ29weXJpZ2h0IDE5OTUgQWxleGFuZHJlIEp1bGxpYXJkCisgKiBDb3B5cmlnaHQgMTk5NSBNYXJ0aW4gdm9uIExvZXdpcwogICovCiAKICNpbmNsdWRlIDxzdGRpby5oPgpAQCAtMjgsNiArMjksNyBAQAogI2RlZmluZSBUWVBFX0FCUyAgICAgICAgIDcKICNkZWZpbmUgVFlQRV9SRVRVUk4gICAgICA4CiAjZGVmaW5lIFRZUEVfU1RVQiAgICAgICAgOQorI2RlZmluZSBUWVBFX1NURENBTEwgICAgMTAKIAogI2RlZmluZSBNQVhfT1JESU5BTFMJMTI5OQogCkBAIC02Nyw2ICs2OSw3IEBACiBjaGFyIFVwcGVyRExMTmFtZVs4MF07CiBpbnQgTGltaXQgPSAwOwogaW50IERMTElkOworaW50IEJhc2UgPSAwOwogRklMRSAqU3BlY0ZwOwogCiBjaGFyICpQYXJzZUJ1ZmZlciA9IE5VTEw7CkBAIC00MTAsNyArNDEzLDkgQEAKICAgICBlbHNlIGlmIChzdHJjbXAodG9rZW4sICJwYXNjYWwxNiIpID09IDApCiAJcmV0dXJuIFBhcnNlRXhwb3J0RnVuY3Rpb24ob3JkaW5hbCwgVFlQRV9QQVNDQUxfMTYpOwogICAgIGVsc2UgaWYgKHN0cmNtcCh0b2tlbiwgInJlZ2lzdGVyIikgPT0gMCkKLQlyZXR1cm4gUGFyc2VFeHBvcnRGdW5jdGlvbihvcmRpbmFsLCBUWVBFX1JFR0lTVEVSKTsKKyAgICAgICAgcmV0dXJuIFBhcnNlRXhwb3J0RnVuY3Rpb24ob3JkaW5hbCwgVFlQRV9SRUdJU1RFUik7CisgICAgZWxzZSBpZiAoc3RyY21wKHRva2VuLCAic3RkY2FsbCIpID09IDApCisgICAgICAgIHJldHVybiBQYXJzZUV4cG9ydEZ1bmN0aW9uKG9yZGluYWwsIFRZUEVfU1REQ0FMTCk7CiAgICAgZWxzZSBpZiAoc3RyY21wKHRva2VuLCAiZXF1YXRlIikgPT0gMCkKIAlyZXR1cm4gUGFyc2VFcXVhdGUob3JkaW5hbCk7CiAgICAgZWxzZSBpZiAoc3RyY21wKHRva2VuLCAicmV0dXJuIikgPT0gMCkKQEAgLTQ1MSw2ICs0NTYsMTcgQEAKIAkgICAgCiAJICAgIERMTElkID0gYXRvaSh0b2tlbik7CiAJfQorCWVsc2UgaWYgKHN0cmNtcCh0b2tlbiwgImJhc2UiKSA9PSAwKQorCXsKKwkJdG9rZW4gPSBHZXRUb2tlbigpOworCQlpZiAoIUlzTnVtYmVyU3RyaW5nKHRva2VuKSkKKwkJeworCQlmcHJpbnRmKHN0ZGVyciwgIiVkOiBFeHBlY3RlZCBudW1iZXIgYWZ0ZXIgYmFzZVxuIiwgTGluZSk7CisJCWV4aXQoMSk7CisJCX0KKworCQlCYXNlID0gYXRvaSh0b2tlbik7CisJfQogCWVsc2UgaWYgKElzTnVtYmVyU3RyaW5nKHRva2VuKSkKIAl7CiAJICAgIGludCBvcmRpbmFsOwpAQCAtNDcyLDI3ICs0ODgsMjUgQEAKIH0KIAogCi1zdGF0aWMgaW50IE91dHB1dFZhcmlhYmxlQ29kZShGSUxFICpmcCwgY2hhciAqc3RvcmFnZSwgT1JEREVGICpvZHApCitzdGF0aWMgaW50IE91dHB1dFZhcmlhYmxlQ29kZSggY2hhciAqc3RvcmFnZSwgT1JEREVGICpvZHAgKQogewogICAgIE9SRFZBUkRFRiAqdmRwOwogICAgIGludCBpOwogCiAgICAgdmRwID0gb2RwLT5hZGRpdGlvbmFsX2RhdGE7Ci0gICAgZnByaW50ZiggZnAsICJcdC5kYXRhXG4iICk7CisgICAgcHJpbnRmKCAiXHQuZGF0YVxuIiApOwogICAgIGZvciAoaSA9IDA7IGkgPCB2ZHAtPm5fdmFsdWVzOyBpKyspCiAgICAgewogCWlmICgoaSAmIDcpID09IDApCi0JICAgIGZwcmludGYoZnAsICJcdCVzXHQiLCBzdG9yYWdlKTsKKwkgICAgcHJpbnRmKCAiXHQlc1x0Iiwgc3RvcmFnZSk7CiAJICAgIAotCWZwcmludGYoZnAsICIlZCIsIHZkcC0+dmFsdWVzW2ldKTsKKwlwcmludGYoICIlZCIsIHZkcC0+dmFsdWVzW2ldKTsKIAkKLQlpZiAoKGkgJiA3KSA9PSA3IHx8IGkgPT0gdmRwLT5uX3ZhbHVlcyAtIDEpCi0JICAgIGZwcmludGYoZnAsICJcbiIpOwotCWVsc2UKLQkgICAgZnByaW50ZihmcCwgIiwgIik7CisJaWYgKChpICYgNykgPT0gNyB8fCBpID09IHZkcC0+bl92YWx1ZXMgLSAxKSBwcmludGYoICJcbiIpOworCWVsc2UgcHJpbnRmKCAiLCAiKTsKICAgICB9Ci0gICAgZnByaW50ZihmcCwgIlxuIik7Ci0gICAgZnByaW50ZiggZnAsICJcdC50ZXh0XG4iICk7CisgICAgcHJpbnRmKCAiXG4iKTsKKyAgICBwcmludGYoICJcdC50ZXh0XG4iICk7CiAgICAgcmV0dXJuIHZkcC0+bl92YWx1ZXM7CiB9CiAKQEAgLTUwMyw3ICs1MTcsNyBAQAogICogQnVpbGQgdGhlIGluLW1lbW9yeSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kdWxlLCBhbmQgZHVtcCBpdAogICogYXMgYSBieXRlIHN0cmVhbSBpbnRvIHRoZSBhc3NlbWJseSBjb2RlLgogICovCi1zdGF0aWMgdm9pZCBCdWlsZE1vZHVsZSggRklMRSAqZnAsIGludCBtYXhfY29kZV9vZmZzZXQsIGludCBtYXhfZGF0YV9vZmZzZXQgKQorc3RhdGljIHZvaWQgQnVpbGRNb2R1bGUoIGludCBtYXhfY29kZV9vZmZzZXQsIGludCBtYXhfZGF0YV9vZmZzZXQgKQogewogICAgIE9SRERFRiAqb2RwOwogICAgIGludCBpLCBzaXplOwpAQCAtNTQ5LDcgKzU2Myw3IEBACiAgICAgcE1vZHVsZS0+dHJ1ZXR5cGUgPSAwOwogICAgIHBNb2R1bGUtPm9zX2ZsYWdzID0gTkVfT1NGTEFHU19XSU5ET1dTOwogICAgIHBNb2R1bGUtPm1pc2NfZmxhZ3MgPSAwOwotICAgIHBNb2R1bGUtPnJlc2VydmVkID0gMDsKKyAgICBwTW9kdWxlLT5kbGxzX3RvX2luaXQgID0gMDsKICAgICBwTW9kdWxlLT5ucm5hbWVfaGFuZGxlID0gMDsKICAgICBwTW9kdWxlLT5taW5fc3dhcF9hcmVhID0gMDsKICAgICBwTW9kdWxlLT5leHBlY3RlZF92ZXJzaW9uID0gMHgwMzBhOwpAQCAtNjc3LDI4ICs2OTEsMTUxIEBACiAKICAgICAgIC8qIER1bXAgdGhlIG1vZHVsZSBjb250ZW50ICovCiAKLSAgICBmcHJpbnRmKCBmcCwgIlx0LmRhdGFcbiIgKTsKLSAgICBmcHJpbnRmKCBmcCwgIlx0Lmdsb2JsICIgUFJFRklYICIlc19Nb2R1bGVfU3RhcnRcbiIsIFVwcGVyRExMTmFtZSApOwotICAgIGZwcmludGYoIGZwLCBQUkVGSVggIiVzX01vZHVsZV9TdGFydDpcbiIsIFVwcGVyRExMTmFtZSApOworICAgIHByaW50ZiggIlx0LmRhdGFcbiIgKTsKKyAgICBwcmludGYoICJcdC5nbG9ibCAiIFBSRUZJWCAiJXNfTW9kdWxlX1N0YXJ0XG4iLCBVcHBlckRMTE5hbWUgKTsKKyAgICBwcmludGYoIFBSRUZJWCAiJXNfTW9kdWxlX1N0YXJ0OlxuIiwgVXBwZXJETExOYW1lICk7CiAgICAgc2l6ZSA9IChpbnQpcHN0ciAtIChpbnQpcE1vZHVsZTsKICAgICBmb3IgKGkgPSAwLCBwc3RyID0gYnVmZmVyOyBpIDwgc2l6ZTsgaSsrLCBwc3RyKyspCiAgICAgewotICAgICAgICBpZiAoIShpICYgNykpIGZwcmludGYoIGZwLCAiXHQuYnl0ZSAiICk7Ci0gICAgICAgIGZwcmludGYoIGZwLCAiJWQlYyIsICpwc3RyLCAoKGkgJiA3KSAhPSA3KSA/ICcsJyA6ICdcbicgKTsKKyAgICAgICAgaWYgKCEoaSAmIDcpKSBwcmludGYoICJcdC5ieXRlICIgKTsKKyAgICAgICAgcHJpbnRmKCAiJWQlYyIsICpwc3RyLCAoKGkgJiA3KSAhPSA3KSA/ICcsJyA6ICdcbicgKTsKICAgICB9Ci0gICAgaWYgKGkgJiA3KSBmcHJpbnRmKCBmcCwgIjBcbiIgKTsKLSAgICBmcHJpbnRmKCBmcCwgIlx0Lmdsb2JsICIgUFJFRklYICIlc19Nb2R1bGVfRW5kXG4iLCBVcHBlckRMTE5hbWUgKTsKLSAgICBmcHJpbnRmKCBmcCwgUFJFRklYICIlc19Nb2R1bGVfRW5kOlxuIiwgVXBwZXJETExOYW1lICk7CisgICAgaWYgKGkgJiA3KSBwcmludGYoICIwXG4iICk7CisgICAgcHJpbnRmKCAiXHQuZ2xvYmwgIiBQUkVGSVggIiVzX01vZHVsZV9FbmRcbiIsIFVwcGVyRExMTmFtZSApOworICAgIHByaW50ZiggUFJFRklYICIlc19Nb2R1bGVfRW5kOlxuIiwgVXBwZXJETExOYW1lICk7CiB9CiAKIAotc3RhdGljIHZvaWQgQnVpbGRTcGVjRmlsZXMoIGNoYXIgKnNwZWNuYW1lKQorc3RhdGljIHZvaWQgQnVpbGRTcGVjMzJGaWxlcyggY2hhciAqc3BlY25hbWUgKQogewogICAgIE9SRERFRiAqb2RwOwogICAgIE9SREZVTkNERUYgKmZkcDsKICAgICBPUkRSRVRERUYgKnJkcDsKLSAgICBGSUxFICpmcDsKLSAgICBjaGFyIGZpbGVuYW1lWzgwXTsKKyAgICBpbnQgaTsKKworICAgIFNwZWNGcCA9IGZvcGVuKCBzcGVjbmFtZSwgInIiKTsKKyAgICBpZiAoU3BlY0ZwID09IE5VTEwpCisgICAgeworCWZwcmludGYoc3RkZXJyLCAiQ291bGQgbm90IG9wZW4gc3BlY2lmaWNhdGlvbiBmaWxlLCAnJXMnXG4iLCBzcGVjbmFtZSk7CisJZXhpdCgxKTsKKyAgICB9CisKKyAgICBQYXJzZVRvcExldmVsKCk7CisKKyAgICBwcmludGYoICIvKiBGaWxlIGdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5LCBkbyBub3QgZWRpdCEgKi9cbiIgKTsKKyAgICBwcmludGYoICIjaW5jbHVkZSA8c3lzL3R5cGVzLmg+XG4iKTsKKyAgICBwcmludGYoICIjaW5jbHVkZSBcImRsbHMuaFwiXG4iKTsKKyAgICBwcmludGYoICIjaW5jbHVkZSBcInBlX2ltYWdlLmhcIlxuIik7CisgICAgcHJpbnRmKCAiI2luY2x1ZGUgXCJ3aW5lcnJvci5oXCJcbiIpOworICAgIHByaW50ZiggIiNpbmNsdWRlIFwic3RkZGVidWcuaFwiXG4iKTsKKyAgICBwcmludGYoICIjaW5jbHVkZSBcImRlYnVnLmhcIlxuIik7CisgICAgcHJpbnRmKCAiXG5leHRlcm4gaW50IFJFTEFZMzJfVW5pbXBsZW1lbnRlZCgpO1xuXG4iICk7CisKKyAgICBvZHAgPSBPcmRpbmFsRGVmaW5pdGlvbnM7CisgICAgZm9yIChpID0gMDsgaSA8PSBMaW1pdDsgaSsrLCBvZHArKykKKyAgICB7CisgICAgICAgIGludCBhcmdubyxhcmdjOworICAgICAgICBmZHAgPSBvZHAtPmFkZGl0aW9uYWxfZGF0YTsKKyAgICAgICAgcmRwID0gb2RwLT5hZGRpdGlvbmFsX2RhdGE7CisKKyAgICAgICAgc3dpdGNoIChvZHAtPnR5cGUpCisgICAgICAgIHsKKyAgICAgICAgY2FzZSBUWVBFX0lOVkFMSUQ6CisgICAgICAgIGNhc2UgVFlQRV9TVFVCOgorICAgICAgICAgICAgcHJpbnRmKCAiaW50ICVzXyVkKClcbntcblx0IiwgVXBwZXJETExOYW1lLCBpKTsKKyAgICAgICAgICAgIHByaW50ZiggIlJFTEFZMzJfVW5pbXBsZW1lbnRlZChcIiVzXCIsJWQpO1xuIiwgVXBwZXJETExOYW1lLCBpKTsKKyAgICAgICAgICAgIHByaW50ZiggIlx0LypOT1RSRUFDSEVEKi9cblx0cmV0dXJuIDA7XG59XG5cbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVFlQRV9TVERDQUxMOgorICAgICAgICAgICAgYXJnYz1zdHJsZW4oZmRwLT5hcmdfdHlwZXMpOworICAgICAgICAgICAgcHJpbnRmKCAidm9pZCAlc18lZCgiLCBVcHBlckRMTE5hbWUsIGkpOworICAgICAgICAgICAgZm9yKGFyZ25vPTA7YXJnbm88YXJnYzthcmdubysrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN3aXRjaChmZHAtPmFyZ190eXBlc1thcmdub10pCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgJ3AnOiBwcmludGYoICJ2b2lkICoiKTticmVhazsKKyAgICAgICAgICAgICAgICBjYXNlICdsJzogcHJpbnRmKCAiaW50ICIpO2JyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiTm90IHN1cHBvcnRlZCBhcmd1bWVudCB0eXBlICVjXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZkcC0+YXJnX3R5cGVzW2FyZ25vXSk7CisgICAgICAgICAgICAgICAgICAgIGV4aXQoMSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHB1dGNoYXIoICdhJythcmdubyApOworICAgICAgICAgICAgICAgIGlmIChhcmdubyE9YXJnYy0xKSBwdXRjaGFyKCAnLCcgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHByaW50ZiggIilcbntcbiIgKTsKKyAgICAgICAgICAgIHByaW50ZiggIlx0ZXh0ZXJuIGludCAlcygpO1xuIiwgZmRwLT5pbnRlcm5hbF9uYW1lICk7CisgICAgICAgICAgICBwcmludGYoICJcdGRwcmludGZfcmVsYXkoc3RkZGViLFwiRW50ZXJpbmcgJSVzLiUlcygiKTsKKyAgICAgICAgICAgIGZvciAoYXJnbm89MDthcmdubzxhcmdjO2FyZ25vKyspIHByaW50ZiggIiUleCAiKTsKKyAgICAgICAgICAgIHByaW50ZiggIilcXG5cIiwgXCIlc1wiLCBcIiVzXCIiLCBVcHBlckRMTE5hbWUsIG9kcC0+ZXhwb3J0X25hbWUpOworICAgICAgICAgICAgZm9yKGFyZ25vPTA7YXJnbm88YXJnYzthcmdubysrKSBwcmludGYoICIsJWMiLCAnYScrYXJnbm8pOworICAgICAgICAgICAgcHJpbnRmKCAiKTtcblx0JXMoIiwgZmRwLT5pbnRlcm5hbF9uYW1lICk7CisgICAgICAgICAgICBmb3IoYXJnbm89MDthcmdubzxhcmdjO2FyZ25vKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcHV0Y2hhcignYScrYXJnbm8pOworICAgICAgICAgICAgICAgIGlmIChhcmdubyE9YXJnYy0xKSBwdXRjaGFyKCcsJyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwcmludGYoICIpO1xuXHRfX2FzbV9fIF9fdm9sYXRpbGVfXyhcIm1vdmwgJSVlYnAsJSVlc3A7IgorICAgICAgICAgICAgICAgICAgICAicG9wbCAlJWVicDtyZXQgJCVkXCIpO1xufVxuXG4iLAorICAgICAgICAgICAgICAgICAgICA0KmFyZ2MpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVFlQRV9SRVRVUk46CisgICAgICAgICAgICBwcmludGYoICJ2b2lkICVzXyVkKClcbntcblx0IiwgVXBwZXJETExOYW1lLCBpKTsKKyAgICAgICAgICAgIHByaW50ZiggIlJFTEFZMzJfRGVidWdFbnRlcihcIiVzXCIsXCIlc1wiKTtcblx0IiwKKyAgICAgICAgICAgICAgICAgICBVcHBlckRMTE5hbWUsIG9kcC0+ZXhwb3J0X25hbWUpOworICAgICAgICAgICAgcHJpbnRmKCAiV0lOMzJfTGFzdEVycm9yPUVSUk9SX0NBTExfTk9UX0lNUExFTUVOVEVEO1xuIik7CisgICAgICAgICAgICBwcmludGYoICJcdF9fYXNtX18gX192b2xhdGlsZV9fIChcIm1vdmwgJWQsJSVlYXhcIik7XG4iLCAKKyAgICAgICAgICAgICAgICAgICByZHAtPnJldF92YWx1ZSk7CisgICAgICAgICAgICBwcmludGYoICJcdF9fYXNtX18gX192b2xhdGlsZV9fIChcIm1vdmwgJSVlYnAsJSVlc3A7cG9wbCAlJWVicDsiCisgICAgICAgICAgICAgICAgICAgICJyZXQgJCVkXCIpO1xufVxuXG4iLCByZHAtPmFyZ19zaXplKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsImJ1aWxkOiBmdW5jdGlvbiB0eXBlICVkIG5vdCBhdmFpbGFibGUgZm9yIFdpbjMyXG4iLAorICAgICAgICAgICAgICAgICAgICBvZHAtPnR5cGUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcmludGYoICJzdGF0aWMgV0lOMzJfZnVuY3Rpb24gZnVuY3Rpb25zWyVkKzFdPXtcbiIsIExpbWl0KTsKKworICAgIG9kcCA9IE9yZGluYWxEZWZpbml0aW9uczsKKyAgICBmb3IgKGkgPSAwOyBpIDw9IExpbWl0OyBpKyssIG9kcCsrKQorICAgIHsKKyAgICAgICAgZmRwID0gb2RwLT5hZGRpdGlvbmFsX2RhdGE7CisgICAgICAgIHJkcCA9IG9kcC0+YWRkaXRpb25hbF9kYXRhOworCisgICAgICAgIHN3aXRjaCAob2RwLT50eXBlKQorICAgICAgICB7CisgICAgICAgIGNhc2UgVFlQRV9JTlZBTElEOgorICAgICAgICAgICAgcHJpbnRmKCAiezAsJXNfJWR9LFxuIixVcHBlckRMTE5hbWUsIGkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVFlQRV9SRVRVUk46CisgICAgICAgIGNhc2UgVFlQRV9TVERDQUxMOgorICAgICAgICBjYXNlIFRZUEVfU1RVQjoKKyAgICAgICAgICAgIHByaW50ZiggIntcIiVzXCIsJXNfJWR9LFxuIiwgb2RwLT5leHBvcnRfbmFtZSwgVXBwZXJETExOYW1lLCBpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJidWlsZDogaW1wbGVtZW50YXRpb24gZXJyb3I6IG1pc3NpbmcgJWRcbiIsCisgICAgICAgICAgICAgICAgICAgIG9kcC0+dHlwZSk7CisgICAgICAgICAgICBleGl0KDEpOworICAgICAgICB9CisgICAgfQorICAgIHByaW50ZigifTtcblxuIik7CisKKyAgICBwcmludGYoICJzdGF0aWMgV0lOMzJfYnVpbHRpbiBkbGw9e1wiJXNcIixmdW5jdGlvbnMsJWQsMH07XG4iLAorICAgICAgICAgICAgVXBwZXJETExOYW1lLCBMaW1pdCk7CisKKyAgICBwcmludGYoICJ2b2lkICVzX0luaXQodm9pZClcbntcbiIsVXBwZXJETExOYW1lKTsKKyAgICBwcmludGYoICJcdGRsbC5uZXh0PVdJTjMyX2J1aWx0aW5fbGlzdDtcbiIpOworICAgIHByaW50ZiggIlx0V0lOMzJfYnVpbHRpbl9saXN0PSZkbGw7XG59Iik7Cit9CisKKworc3RhdGljIHZvaWQgQnVpbGRTcGVjMTZGaWxlcyggY2hhciAqc3BlY25hbWUgKQoreworICAgIE9SRERFRiAqb2RwOworICAgIE9SREZVTkNERUYgKmZkcDsKKyAgICBPUkRSRVRERUYgKnJkcDsKICAgICBpbnQgaTsKICAgICBpbnQgY29kZV9vZmZzZXQsIGRhdGFfb2Zmc2V0OwogCkBAIC03MTEsMTcgKzg0OCwxNSBAQAogCiAgICAgUGFyc2VUb3BMZXZlbCgpOwogCi0gICAgc3ByaW50ZihmaWxlbmFtZSwgImRsbF8lcy5TIiwgTG93ZXJETExOYW1lKTsKLSAgICBmcCA9IGZvcGVuKGZpbGVuYW1lLCAidyIpOwotICAgIGZwcmludGYoIGZwLCAiLyogRmlsZSBnZW5lcmF0ZWQgYXV0b21hdGljYWxseTsgZG8gbm90IGVkaXQhICovXG4iICk7Ci0gICAgZnByaW50ZiggZnAsICJcdC5kYXRhXG4iICk7Ci0gICAgZnByaW50ZiggZnAsICJcdC5nbG9ibCAiIFBSRUZJWCAiJXNfRGF0YV9TdGFydFxuIiwgVXBwZXJETExOYW1lICk7Ci0gICAgZnByaW50ZiggZnAsIFBSRUZJWCAiJXNfRGF0YV9TdGFydDpcbiIsIFVwcGVyRExMTmFtZSApOwotICAgIGZwcmludGYoIGZwLCAiXHQud29yZCAwLDAsMCwwLDAsMCwwLDBcbiIgKTsKKyAgICBwcmludGYoICIvKiBGaWxlIGdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5OyBkbyBub3QgZWRpdCEgKi9cbiIgKTsKKyAgICBwcmludGYoICJcdC5kYXRhXG4iICk7CisgICAgcHJpbnRmKCAiXHQuZ2xvYmwgIiBQUkVGSVggIiVzX0RhdGFfU3RhcnRcbiIsIFVwcGVyRExMTmFtZSApOworICAgIHByaW50ZiggUFJFRklYICIlc19EYXRhX1N0YXJ0OlxuIiwgVXBwZXJETExOYW1lICk7CisgICAgcHJpbnRmKCAiXHQud29yZCAwLDAsMCwwLDAsMCwwLDBcbiIgKTsKICAgICBkYXRhX29mZnNldCA9IDE2OwotICAgIGZwcmludGYoIGZwLCAiXHQudGV4dFxuIiApOwotICAgIGZwcmludGYoIGZwLCAiXHQuZ2xvYmwgIiBQUkVGSVggIiVzX0NvZGVfU3RhcnRcbiIsIFVwcGVyRExMTmFtZSApOwotICAgIGZwcmludGYoIGZwLCBQUkVGSVggIiVzX0NvZGVfU3RhcnQ6XG4iLCBVcHBlckRMTE5hbWUgKTsKKyAgICBwcmludGYoICJcdC50ZXh0XG4iICk7CisgICAgcHJpbnRmKCAiXHQuZ2xvYmwgIiBQUkVGSVggIiVzX0NvZGVfU3RhcnRcbiIsIFVwcGVyRExMTmFtZSApOworICAgIHByaW50ZiggUFJFRklYICIlc19Db2RlX1N0YXJ0OlxuIiwgVXBwZXJETExOYW1lICk7CiAgICAgY29kZV9vZmZzZXQgPSAwOwogCiAgICAgb2RwID0gT3JkaW5hbERlZmluaXRpb25zOwpAQCAtNzQxLDMyICs4NzYsMzIgQEAKICAgICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgICAgY2FzZSBUWVBFX0JZVEU6Ci0gICAgICAgICAgICBmcHJpbnRmKCBmcCwgIi8qICVzLiVkICovXG4iLCBVcHBlckRMTE5hbWUsIGkpOworICAgICAgICAgICAgcHJpbnRmKCAiLyogJXMuJWQgKi9cbiIsIFVwcGVyRExMTmFtZSwgaSk7CiAgICAgICAgICAgICBvZHAtPm9mZnNldCA9IGRhdGFfb2Zmc2V0OwotICAgICAgICAgICAgZGF0YV9vZmZzZXQgKz0gT3V0cHV0VmFyaWFibGVDb2RlKGZwLCAiLmJ5dGUiLCBvZHApOworICAgICAgICAgICAgZGF0YV9vZmZzZXQgKz0gT3V0cHV0VmFyaWFibGVDb2RlKCAiLmJ5dGUiLCBvZHApOwogICAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgICBjYXNlIFRZUEVfV09SRDoKLSAgICAgICAgICAgIGZwcmludGYoIGZwLCAiLyogJXMuJWQgKi9cbiIsIFVwcGVyRExMTmFtZSwgaSk7CisgICAgICAgICAgICBwcmludGYoICIvKiAlcy4lZCAqL1xuIiwgVXBwZXJETExOYW1lLCBpKTsKICAgICAgICAgICAgIG9kcC0+b2Zmc2V0ID0gZGF0YV9vZmZzZXQ7Ci0gICAgICAgICAgICBkYXRhX29mZnNldCArPSAyICogT3V0cHV0VmFyaWFibGVDb2RlKGZwLCAiLndvcmQiLCBvZHApOworICAgICAgICAgICAgZGF0YV9vZmZzZXQgKz0gMiAqIE91dHB1dFZhcmlhYmxlQ29kZSggIi53b3JkIiwgb2RwKTsKICAgICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgICAgY2FzZSBUWVBFX0xPTkc6Ci0gICAgICAgICAgICBmcHJpbnRmKCBmcCwgIi8qICVzLiVkICovXG4iLCBVcHBlckRMTE5hbWUsIGkpOworICAgICAgICAgICAgcHJpbnRmKCAiLyogJXMuJWQgKi9cbiIsIFVwcGVyRExMTmFtZSwgaSk7CiAgICAgICAgICAgICBvZHAtPm9mZnNldCA9IGRhdGFfb2Zmc2V0OwotICAgICAgICAgICAgZGF0YV9vZmZzZXQgKz0gNCAqIE91dHB1dFZhcmlhYmxlQ29kZShmcCwgIi5sb25nIiwgb2RwKTsKKyAgICAgICAgICAgIGRhdGFfb2Zmc2V0ICs9IDQgKiBPdXRwdXRWYXJpYWJsZUNvZGUoICIubG9uZyIsIG9kcCk7CiAgICAgICAgICAgICBicmVhazsKIAogICAgICAgICAgIGNhc2UgVFlQRV9SRVRVUk46Ci0gICAgICAgICAgICBmcHJpbnRmKCBmcCwgIi8qICVzLiVkICovXG4iLCBVcHBlckRMTE5hbWUsIGkpOwotICAgICAgICAgICAgZnByaW50ZiggZnAsICJcdG1vdncgJCVkLCUlYXhcbiIsIHJkcC0+cmV0X3ZhbHVlICYgMHhmZmZmICk7Ci0gICAgICAgICAgICBmcHJpbnRmKCBmcCwgIlx0bW92dyAkJWQsJSVkeFxuIiwgKHJkcC0+cmV0X3ZhbHVlID4+IDE2KSAmIDB4ZmZmZik7Ci0gICAgICAgICAgICBmcHJpbnRmKGZwLCAiXHQuYnl0ZSAweDY2XG4iKTsKKyAgICAgICAgICAgIHByaW50ZiggIi8qICVzLiVkICovXG4iLCBVcHBlckRMTE5hbWUsIGkpOworICAgICAgICAgICAgcHJpbnRmKCAiXHRtb3Z3ICQlZCwlJWF4XG4iLCByZHAtPnJldF92YWx1ZSAmIDB4ZmZmZiApOworICAgICAgICAgICAgcHJpbnRmKCAiXHRtb3Z3ICQlZCwlJWR4XG4iLCAocmRwLT5yZXRfdmFsdWUgPj4gMTYpICYgMHhmZmZmKTsKKyAgICAgICAgICAgIHByaW50ZiggIlx0LmJ5dGUgMHg2NlxuIik7CiAgICAgICAgICAgICBpZiAocmRwLT5hcmdfc2l6ZSAhPSAwKQotICAgICAgICAgICAgICAgIGZwcmludGYoZnAsICJcdGxyZXQgJCVkXG4iLCByZHAtPmFyZ19zaXplKTsKKyAgICAgICAgICAgICAgICBwcmludGYoICJcdGxyZXQgJCVkXG4iLCByZHAtPmFyZ19zaXplKTsKICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBmcHJpbnRmKGZwLCAiXHRscmV0XG4iKTsKKyAgICAgICAgICAgICAgICBwcmludGYoICJcdGxyZXRcbiIpOwogICAgICAgICAgICAgb2RwLT5vZmZzZXQgPSBjb2RlX29mZnNldDsKICAgICAgICAgICAgIGNvZGVfb2Zmc2V0ICs9IDEwOyAgLyogQXNzZW1ibHkgY29kZSBpcyAxMCBieXRlcyBsb25nICovCiAgICAgICAgICAgICBpZiAocmRwLT5hcmdfc2l6ZSAhPSAwKSBjb2RlX29mZnNldCArPSAyOwpAQCAtNzc2LDE3ICs5MTEsMjIgQEAKICAgICAgICAgICBjYXNlIFRZUEVfUEFTQ0FMOgogICAgICAgICAgIGNhc2UgVFlQRV9QQVNDQUxfMTY6CiAgICAgICAgICAgY2FzZSBUWVBFX1NUVUI6Ci0gICAgICAgICAgICBmcHJpbnRmKCBmcCwgIi8qICVzLiVkICovXG4iLCBVcHBlckRMTE5hbWUsIGkpOwotICAgICAgICAgICAgZnByaW50ZihmcCwgIlx0cHVzaHcgJSVicFxuIiApOwotICAgICAgICAgICAgZnByaW50ZihmcCwgIlx0cHVzaGwgJDB4JTA4eFxuIiwgKERMTElkIDw8IDE2KSB8IGkpOwotICAgICAgICAgICAgZnByaW50ZihmcCwgIlx0cHVzaGwgJCIgUFJFRklYICIlc1xuIiwgZmRwLT5pbnRlcm5hbF9uYW1lICk7Ci0gICAgICAgICAgICBmcHJpbnRmKGZwLCAiXHRsam1wICQweCUwNHgsICQiIFBSRUZJWCAiQ2FsbFRvMzJfJXNfJXNcblxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIFdJTkVfQ09ERV9TRUxFQ1RPUiwKLSAgICAgICAgICAgICAgICAgICAgICAgIChvZHAtPnR5cGUgPT0gVFlQRV9SRUdJU1RFUikgPyAicmVncyIgOgotICAgICAgICAgICAgICAgICAgICAgICAgKG9kcC0+dHlwZSA9PSBUWVBFX1BBU0NBTCkgPyAibG9uZyIgOiAid29yZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBmZHAtPmFyZ190eXBlcyApOworICAgICAgICAgICAgcHJpbnRmKCAiLyogJXMuJWQgKi9cbiIsIFVwcGVyRExMTmFtZSwgaSk7CisgICAgICAgICAgICBwcmludGYoICJcdHB1c2h3ICUlYnBcbiIgKTsKKyAgICAgICAgICAgIHByaW50ZiggIlx0cHVzaGwgJDB4JTA4eFxuIiwgKERMTElkIDw8IDE2KSB8IGkpOworICAgICAgICAgICAgcHJpbnRmKCAiXHRwdXNobCAkIiBQUkVGSVggIiVzXG4iLCBmZHAtPmludGVybmFsX25hbWUgKTsKKyAgICAgICAgICAgIHByaW50ZiggIlx0bGptcCAkMHglMDR4LCAkIiBQUkVGSVggIkNhbGxUbzMyXyVzXyVzXG5cbiIsCisgICAgICAgICAgICAgICAgICAgIFdJTkVfQ09ERV9TRUxFQ1RPUiwKKyAgICAgICAgICAgICAgICAgICAgKG9kcC0+dHlwZSA9PSBUWVBFX1JFR0lTVEVSKSA/ICJyZWdzIiA6CisgICAgICAgICAgICAgICAgICAgIChvZHAtPnR5cGUgPT0gVFlQRV9QQVNDQUwpID8gImxvbmciIDogIndvcmQiLAorICAgICAgICAgICAgICAgICAgICBmZHAtPmFyZ190eXBlcyApOworICAgICAgICAgICAgcHJpbnRmKCAiXHRub3BcbiIgKTsKKyAgICAgICAgICAgIHByaW50ZiggIlx0bm9wXG4iICk7CisgICAgICAgICAgICBwcmludGYoICJcdG5vcFxuIiApOworICAgICAgICAgICAgcHJpbnRmKCAiXHRub3BcbiIgKTsKKyAgICAgICAgICAgIHByaW50ZiggIlx0bm9wXG4iICk7CiAgICAgICAgICAgICBvZHAtPm9mZnNldCA9IGNvZGVfb2Zmc2V0OwotICAgICAgICAgICAgY29kZV9vZmZzZXQgKz0gMTk7ICAvKiBBc3NlbWJseSBjb2RlIGlzIDE5IGJ5dGVzIGxvbmcgKi8KKyAgICAgICAgICAgIGNvZGVfb2Zmc2V0ICs9IDI0OyAgLyogQXNzZW1ibHkgY29kZSBpcyAyNCBieXRlcyBsb25nICovCiAgICAgICAgICAgICBicmVhazsKIAkJCiAgICAgICAgICAgZGVmYXVsdDoKQEAgLTc5Nyw3NCArOTM3LDExIEBACiAKICAgICBpZiAoIWNvZGVfb2Zmc2V0KSAgLyogTWFrZSBzdXJlIHRoZSBjb2RlIHNlZ21lbnQgaXMgbm90IGVtcHR5ICovCiAgICAgewotICAgICAgICBmcHJpbnRmKCBmcCwgIlx0LmJ5dGUgMFxuIiApOworICAgICAgICBwcmludGYoICJcdC5ieXRlIDBcbiIgKTsKICAgICAgICAgY29kZV9vZmZzZXQrKzsKICAgICB9CiAKLSAgICBCdWlsZE1vZHVsZSggZnAsIGNvZGVfb2Zmc2V0LCBkYXRhX29mZnNldCApOwotCi0gICAgZmNsb3NlKGZwKTsKLQotICAgIHNwcmludGYoZmlsZW5hbWUsICJ0YWJfJXMuYyIsIExvd2VyRExMTmFtZSk7Ci0gICAgZnAgPSBmb3BlbihmaWxlbmFtZSwgInciKTsKLQotICAgIGZwcmludGYoIGZwLCAiLyogRmlsZSBnZW5lcmF0ZWQgYXV0b21hdGljYWxseTsgZG8gbm90IGVkaXQhICovXG5cbiIgKTsKLSAgICBmcHJpbnRmKCBmcCwgIiNpbmNsdWRlIFwiZGxscy5oXCJcblxuIiApOwotICAgIGZwcmludGYoIGZwLCAic3RhdGljIHN0cnVjdCBkbGxfdGFibGVfZW50cnlfcyAlc190YWJsZV9lbnRyaWVzWyVkXSA9XG57XG4iLAotICAgICAgICAgICAgICAgICBVcHBlckRMTE5hbWUsIExpbWl0ICsgMSk7Ci0gICAgb2RwID0gT3JkaW5hbERlZmluaXRpb25zOwotICAgIGZvciAoaSA9IDA7IGkgPD0gTGltaXQ7IGkrKywgb2RwKyspCi0gICAgewotICAgICAgICBpbnQgc2VsZWN0b3IgPSAwOwotCi0Jc3dpdGNoIChvZHAtPnR5cGUpCi0JewotICAgICAgICBjYXNlIFRZUEVfSU5WQUxJRDoKLSAgICAgICAgICAgIHNlbGVjdG9yID0gMDsgIC8qIEludmFsaWQgc2VsZWN0b3IgKi8KLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgVFlQRV9QQVNDQUw6Ci0gICAgICAgIGNhc2UgVFlQRV9QQVNDQUxfMTY6Ci0gICAgICAgIGNhc2UgVFlQRV9SRUdJU1RFUjoKLSAgICAgICAgY2FzZSBUWVBFX1JFVFVSTjoKLSAgICAgICAgY2FzZSBUWVBFX1NUVUI6Ci0gICAgICAgICAgICBzZWxlY3RvciA9IDE7ICAvKiBDb2RlIHNlbGVjdG9yICovCi0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIFRZUEVfQllURToKLSAgICAgICAgY2FzZSBUWVBFX1dPUkQ6Ci0gICAgICAgIGNhc2UgVFlQRV9MT05HOgotICAgICAgICAgICAgc2VsZWN0b3IgPSAyOyAgLyogRGF0YSBzZWxlY3RvciAqLwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBUWVBFX0FCUzoKLSAgICAgICAgICAgIHNlbGVjdG9yID0gMHhmZjsgIC8qIENvbnN0YW50IHNlbGVjdG9yICovCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0vKiAgICAgICAgIGZwcmludGYoZnAsICIgICAgeyAlZCwgJWQsICIsIHNlbGVjdG9yLCBvZHAtPm9mZnNldCApOyAqLwotICAgICAgICBmcHJpbnRmKCBmcCwgIiAgICB7ICIgKTsKLSAgICAgICAgZnByaW50ZihmcCwgIlwiJXNcIiAiLCBvZHAtPmV4cG9ydF9uYW1lKTsKLSNpZmRlZiBXSU5FU1RBVAotICAgICAgICBmcHJpbnRmKGZwLCAiLDAgIik7Ci0jZW5kaWYJICAgIAotICAgICAgICBmcHJpbnRmKGZwLCAifSwgXG4iKTsKLSAgICB9Ci0KLSAgICBmcHJpbnRmKGZwLCAifTtcblxuIik7Ci0KLSAgICBmcHJpbnRmKCBmcCwgImV4dGVybiBCWVRFICVzX0NvZGVfU3RhcnRbXTtcbiIsIFVwcGVyRExMTmFtZSApOwotICAgIGZwcmludGYoIGZwLCAiZXh0ZXJuIEJZVEUgJXNfRGF0YV9TdGFydFtdO1xuIiwgVXBwZXJETExOYW1lICk7Ci0gICAgZnByaW50ZiggZnAsICJleHRlcm4gQllURSAlc19Nb2R1bGVfU3RhcnRbXTtcbiIsIFVwcGVyRExMTmFtZSApOwotICAgIGZwcmludGYoIGZwLCAiZXh0ZXJuIEJZVEUgJXNfTW9kdWxlX0VuZFtdO1xuXG4iLCBVcHBlckRMTE5hbWUgKTsKLSAgICBmcHJpbnRmKCBmcCwgInN0cnVjdCBkbGxfdGFibGVfcyAlc190YWJsZSA9XG57XG4iLCBVcHBlckRMTE5hbWUgKTsKLSAgICBmcHJpbnRmKCBmcCwgIiAgJXNfdGFibGVfZW50cmllcywgJWQsICVkLFxuIiwKLSAgICAgICAgICAgICBVcHBlckRMTE5hbWUsIExpbWl0ICsgMSwgRExMSWQgKTsKLSAgICBmcHJpbnRmKCBmcCwgIiAgJXNfQ29kZV9TdGFydCwgJXNfRGF0YV9TdGFydCxcbiIsCi0gICAgICAgICAgICAgVXBwZXJETExOYW1lLCBVcHBlckRMTE5hbWUgKTsKLSAgICBmcHJpbnRmKCBmcCwgIiAgJXNfTW9kdWxlX1N0YXJ0LCAlc19Nb2R1bGVfRW5kXG59O1xuIiwKLSAgICAgICAgICAgICBVcHBlckRMTE5hbWUsIFVwcGVyRExMTmFtZSApOwotICAgIGZjbG9zZShmcCk7CisgICAgQnVpbGRNb2R1bGUoIGNvZGVfb2Zmc2V0LCBkYXRhX29mZnNldCApOwogfQogCiAKQEAgLTE0MTAsOSArMTQ4NywxMyBAQAogCiAgICAgaWYgKGFyZ2MgPD0gMikgdXNhZ2UoKTsKIAotICAgIGlmICghc3RyY21wKCBhcmd2WzFdLCAiLXNwZWMiICkpCisgICAgaWYgKCFzdHJjbXAoIGFyZ3ZbMV0sICItc3BlYzE2IiApKQogICAgIHsKLSAgICAgICAgZm9yIChpID0gMjsgaSA8IGFyZ2M7IGkrKykgQnVpbGRTcGVjRmlsZXMoIGFyZ3ZbaV0gKTsKKyAgICAgICAgZm9yIChpID0gMjsgaSA8IGFyZ2M7IGkrKykgQnVpbGRTcGVjMTZGaWxlcyggYXJndltpXSApOworICAgIH0KKyAgICBlbHNlIGlmICghc3RyY21wKCBhcmd2WzFdLCAiLXNwZWMzMiIgKSkKKyAgICB7CisgICAgICAgIGZvciAoaSA9IDI7IGkgPCBhcmdjOyBpKyspIEJ1aWxkU3BlYzMyRmlsZXMoIGFyZ3ZbaV0gKTsKICAgICB9CiAgICAgZWxzZSBpZiAoIXN0cmNtcCggYXJndlsxXSwgIi1jYWxsMzIiICkpICAvKiAzMi1iaXQgY2FsbGJhY2tzICovCiAgICAgewpkaWZmIC0tZ2l0IGEvd2luZG93cy9JbWFrZWZpbGUgYi93aW5kb3dzL0ltYWtlZmlsZQppbmRleCA0N2U2Nzk2Li45NzMyMTVmIDEwMDY0NAotLS0gYS93aW5kb3dzL0ltYWtlZmlsZQorKysgYi93aW5kb3dzL0ltYWtlZmlsZQpAQCAtMTgsNiArMTgsNyBAQAogCW1hcHBpbmcuYyBcCiAJbWRpLmMgXAogCW1lc3NhZ2UuYyBcCisJbXNnYm94LmMgXAogCW5vbmNsaWVudC5jIFwKIAlwYWludGluZy5jIFwKIAlwcm9wZXJ0eS5jIFwKZGlmZiAtLWdpdCBhL3dpbmRvd3MvY2xhc3MuYyBiL3dpbmRvd3MvY2xhc3MuYwppbmRleCA2Y2U3Y2M2Li5hNTg5YWUyIDEwMDY0NAotLS0gYS93aW5kb3dzL2NsYXNzLmMKKysrIGIvd2luZG93cy9jbGFzcy5jCkBAIC01NSw3ICs1NSwxMiBAQAogICAgIGZvciAoY2xhc3MgPSBmaXJzdENsYXNzOyAoY2xhc3MpOyBjbGFzcyA9IGNsYXNzUHRyLT5oTmV4dCkKICAgICB7CiAgICAgICAgIGNsYXNzUHRyID0gKENMQVNTICopIFVTRVJfSEVBUF9MSU5fQUREUihjbGFzcyk7Ci0gICAgICAgIGlmICghKGNsYXNzUHRyLT53Yy5zdHlsZSAmIENTX0dMT0JBTENMQVNTKSkgY29udGludWU7CisjaWYgMAorICAgICAgLyogVGhpcyBicmVha3MgQm9ybGFuZCdzIFJlc291cmNlIFdvcmtzaG9wOiBBIERMTCBjcmVhdGVzIGEgY2xhc3MsCisgICAgICAgKiBhbmQgdGhlIG1haW4gcHJvZ3JhbSB0cmllcyB0byB1c2UgaXQsIGJ1dCBwYXNzZXMgYSBkaWZmZXJlbnQKKyAgICAgICAqIGhJbnN0YW5jZSAqLworICAgICAgaWYgKCEoY2xhc3NQdHItPndjLnN0eWxlICYgQ1NfR0xPQkFMQ0xBU1MpKSBjb250aW51ZTsKKyNlbmRpZgogICAgICAgICBpZiAoY2xhc3NQdHItPmF0b21OYW1lID09IGF0b20pCiAgICAgICAgIHsKICAgICAgICAgICAgIGlmIChwdHIpICpwdHIgPSBjbGFzc1B0cjsKQEAgLTkzLDkgKzk4LDkgQEAKICAgICBpbnQgY2xhc3NFeHRyYTsKICAgICBjaGFyICpuYW1lID0gUFRSX1NFR19UT19MSU4oIGNsYXNzLT5scHN6Q2xhc3NOYW1lICk7CiAKLSAgICBkcHJpbnRmX2NsYXNzKHN0ZGRlYiwgIlJlZ2lzdGVyQ2xhc3M6IHduZHByb2M9JXAgaGluc3Q9JWQgbmFtZT0nJXMnIGJhY2tncm91bmQgJXhcbiIsIAotCSAgICBjbGFzcy0+bHBmblduZFByb2MsIGNsYXNzLT5oSW5zdGFuY2UsIG5hbWUsIGNsYXNzLT5oYnJCYWNrZ3JvdW5kICk7Ci0KKyAgICBkcHJpbnRmX2NsYXNzKHN0ZGRlYiwgIlJlZ2lzdGVyQ2xhc3M6IHduZHByb2M9JTA4bHggaGluc3Q9JWQgbmFtZT0nJXMnIGJhY2tncm91bmQgJTA0eFxuIiwKKwkgICAgKERXT1JEKWNsYXNzLT5scGZuV25kUHJvYywgY2xhc3MtPmhJbnN0YW5jZSwgbmFtZSwgY2xhc3MtPmhickJhY2tncm91bmQgKTsKKyAgICBkcHJpbnRmX2NsYXNzKHN0ZGRlYiwgIiAgICAgICAgICAgICAgIHN0eWxlICUwNHhcbiIsY2xhc3MtPnN0eWxlKTsKICAgICAgIC8qIENoZWNrIGlmIGEgY2xhc3Mgd2l0aCB0aGlzIG5hbWUgYWxyZWFkeSBleGlzdHMgKi8KIAogICAgIHByZXZDbGFzcyA9IENMQVNTX0ZpbmRDbGFzc0J5TmFtZSggbmFtZSwgY2xhc3MtPmhJbnN0YW5jZSwgJnByZXZDbGFzc1B0ciApOwpkaWZmIC0tZ2l0IGEvd2luZG93cy9jdXJzb3IuYyBiL3dpbmRvd3MvY3Vyc29yLmMKaW5kZXggNTA5ZmJmNC4uZjllOTc2ZSAxMDA2NDQKLS0tIGEvd2luZG93cy9jdXJzb3IuYworKysgYi93aW5kb3dzL2N1cnNvci5jCkBAIC0xNSw3ICsxNSw2IEBACiAjaW5jbHVkZSAid2luZG93cy5oIgogI2luY2x1ZGUgIndpbi5oIgogI2luY2x1ZGUgImdkaS5oIgotI2luY2x1ZGUgImxpYnJhcnkuaCIKICNpbmNsdWRlICJuZWV4ZS5oIgogI2luY2x1ZGUgIndpbmUuaCIKICNpbmNsdWRlICJjdXJzb3IuaCIKQEAgLTYxLDcgKzYwLDcgQEAKICAgICBDVVJTT1JERVNDUklQICpscGN1cmRlc2M7CiAgICAgQ1VSU09SQUxMT0MJICAqbHBjdXI7CiAgICAgSERDIAloZGM7Ci0gICAgaW50IGksIGltYWdlX3NpemU7CisgICAgaW50IGk7CiAgICAgdW5zaWduZWQgY2hhciAqY3AxLCpjcDI7CiAgICAgZHByaW50Zl9yZXNvdXJjZShzdGRkZWIsIkxvYWRDdXJzb3I6IGluc3RhbmNlID0gJTA0eCwgbmFtZSA9ICUwOGx4XG4iLAogCSAgIGluc3RhbmNlLCBjdXJzb3JfbmFtZSk7CkBAIC0xNDUsNyArMTQ0LDYgQEAKIAl9CiAgICAgbHBjdXJkZXNjID0gKENVUlNPUkRFU0NSSVAgKikobHAgKyAzKTsKICNpZiAwCi0gICAgZHByaW50Zl9jdXJzb3Ioc3RkZGViLCJMb2FkQ3Vyc29yIC8gaW1hZ2Vfc2l6ZT0lZFxuIiwgaW1hZ2Vfc2l6ZSk7CiAgICAgZHByaW50Zl9jdXJzb3Ioc3RkZGViLCJMb2FkQ3Vyc29yIC8gY3VyUmVzZXJ2ZWQ9JVhcbiIsICpscCk7CiAgICAgZHByaW50Zl9jdXJzb3Ioc3RkZGViLCJMb2FkQ3Vyc29yIC8gY3VyUmVzb3VyY2VUeXBlPSVYXG4iLCAqKGxwICsgMSkpOwogICAgIGRwcmludGZfY3Vyc29yKHN0ZGRlYiwiTG9hZEN1cnNvciAvIGN1clJlc291cmNlQ291bnQ9JVhcbiIsICoobHAgKyAyKSk7CmRpZmYgLS1naXQgYS93aW5kb3dzL2RlZnduZC5jIGIvd2luZG93cy9kZWZ3bmQuYwppbmRleCA3NDE3NDI5Li5iMWM5NWU2IDEwMDY0NAotLS0gYS93aW5kb3dzL2RlZnduZC5jCisrKyBiL3dpbmRvd3MvZGVmd25kLmMKQEAgLTQ0LDcgKzQ0LDYgQEAKICAqLwogTE9ORyBEZWZXaW5kb3dQcm9jKCBIV05EIGh3bmQsIFdPUkQgbXNnLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0gKQogewotICAgIE1FQVNVUkVJVEVNU1RSVUNUICptZWFzdXJlOwogICAgIENMQVNTICogY2xhc3NQdHI7CiAgICAgTFBTVFIgdGV4dFB0cjsKICAgICBpbnQgbGVuOwpAQCAtMjMzLDI2ICsyMzIsNyBAQAogCWJyZWFrOwogCiAgICAgY2FzZSBXTV9TWVNLRVlVUDoKLQkJYnJlYWs7ICAgIAkKLSAgICBjYXNlIFdNX01FQVNVUkVJVEVNOgotCQltZWFzdXJlID0gKE1FQVNVUkVJVEVNU1RSVUNUICopUFRSX1NFR19UT19MSU4obFBhcmFtKTsKLQkJc3dpdGNoKG1lYXN1cmUtPkN0bFR5cGUpIHsKLQkJCWNhc2UgT0RUX0JVVFRPTjoKLQkJCQlicmVhazsKLQkJCWNhc2UgT0RUX0NPTUJPQk9YOgotCQkJCW1lYXN1cmUtPml0ZW1IZWlnaHQgPSAxMDsKLS8qCQkJCXByaW50ZigiZGVmd25kcHJvYyBXTV9NRUFTVVJFSVRFTSAvLyBPRFRfQ09NQk9CT1ggIVxuIik7Ki8KLQkJCQlicmVhazsKLQkJCWNhc2UgT0RUX0xJU1RCT1g6Ci0JCQkJbWVhc3VyZS0+aXRlbUhlaWdodCA9IDEwOwotLyoJCQkJcHJpbnRmKCJkZWZ3bmRwcm9jIFdNX01FQVNVUkVJVEVNIC8vIE9EVF9MSVNUQk9YICFcbiIpOyovCi0JCQkJYnJlYWs7Ci0JCQljYXNlIE9EVF9NRU5VOgotCQkJCWJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCQlicmVhazsKLQkJCX0KLSAgICAJYnJlYWs7ICAgIAkKKwkJYnJlYWs7CiAgICAgfQogICAgIHJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvd2luZG93cy9kaWFsb2cuYyBiL3dpbmRvd3MvZGlhbG9nLmMKaW5kZXggYWVmOGM3Yy4uZDdjNzkyNiAxMDA2NDQKLS0tIGEvd2luZG93cy9kaWFsb2cuYworKysgYi93aW5kb3dzL2RpYWxvZy5jCkBAIC0xMyw2ICsxMyw3IEBACiAjaW5jbHVkZSAiZGlhbG9nLmgiCiAjaW5jbHVkZSAid2luLmgiCiAjaW5jbHVkZSAibGR0LmgiCisjaW5jbHVkZSAic3RhY2tmcmFtZS5oIgogI2luY2x1ZGUgInVzZXIuaCIKICNpbmNsdWRlICJtZXNzYWdlLmgiCiAjaW5jbHVkZSAic3RkZGVidWcuaCIKQEAgLTE5MSw4ICsxOTIsOCBAQAogICAgIEhHTE9CQUwgaG1lbTsKICAgICBMUENTVFIgZGF0YTsKIAotICAgIGRwcmludGZfZGlhbG9nKHN0ZGRlYiwgIkNyZWF0ZURpYWxvZ1BhcmFtOiAlZCwlMDhseCwlZCwlcCwlbGRcbiIsCi0JICAgIGhJbnN0LCBkbGdUZW1wbGF0ZSwgb3duZXIsIGRsZ1Byb2MsIHBhcmFtICk7CisgICAgZHByaW50Zl9kaWFsb2coc3RkZGViLCAiQ3JlYXRlRGlhbG9nUGFyYW06ICVkLCUwOGx4LCVkLCUwOGx4LCVsZFxuIiwKKwkgICAgaEluc3QsIGRsZ1RlbXBsYXRlLCBvd25lciwgKERXT1JEKWRsZ1Byb2MsIHBhcmFtICk7CiAgICAgIAogICAgIGlmICghKGhSc3JjID0gRmluZFJlc291cmNlKCBoSW5zdCwgZGxnVGVtcGxhdGUsIFJUX0RJQUxPRyApKSkgcmV0dXJuIDA7CiAgICAgaWYgKCEoaG1lbSA9IExvYWRSZXNvdXJjZSggaEluc3QsIGhSc3JjICkpKSByZXR1cm4gMDsKQEAgLTI1MSwxMSArMjUyLDExIEBACiAJICBicmVhazsKICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qIE5lZWQgdG8gY29weSB0aGUgbWVudSBuYW1lIHRvIGEgMTYtYml0IGFyZWEgKi8KLSAgICAgICAgICAgICAgSEFORExFIGhhbmRsZSA9IFVTRVJfSEVBUF9BTExPQyggc3RybGVuKHRlbXBsYXRlLm1lbnVOYW1lKSsxICk7Ci0gICAgICAgICAgICAgIHN0cmNweSggVVNFUl9IRUFQX0xJTl9BRERSKCBoYW5kbGUgKSwgdGVtcGxhdGUubWVudU5hbWUgKTsKLSAgICAgICAgICAgICAgaE1lbnUgPSBMb2FkTWVudSggaEluc3QsIFVTRVJfSEVBUF9TRUdfQUREUiggaGFuZGxlICkgKTsKLSAgICAgICAgICAgICAgVVNFUl9IRUFQX0ZSRUUoIGhhbmRsZSApOworICAgICAgICAgICAgICAgIC8qIE5lZWQgdG8gY29weSB0aGUgbWVudSBuYW1lIHRvIGEgMTYtYml0IGFjY2Vzc2libGUgYXJlYSAqLworICAgICAgICAgICAgICBjaGFyIG5hbWVbMjU2XTsKKyAgICAgICAgICAgICAgc3RybmNweSggbmFtZSwgdGVtcGxhdGUubWVudU5hbWUsIDI1NSApOworICAgICAgICAgICAgICBuYW1lWzI1NV0gPSAnXDAnOworICAgICAgICAgICAgICBoTWVudSA9IExvYWRNZW51KCBoSW5zdCwgTUFLRV9TRUdQVFIobmFtZSkgKTsKICAgICAgICAgICB9CiAJICBicmVhazsKICAgICB9CkBAIC0yOTgsNyArMjk5LDcgQEAKICAgICBBZGp1c3RXaW5kb3dSZWN0RXgoICZyZWN0LCB0ZW1wbGF0ZS5oZWFkZXItPnN0eWxlLCBoTWVudSwgZXhTdHlsZSApOwogCiAgICAgaHduZCA9IENyZWF0ZVdpbmRvd0V4KCBleFN0eWxlLCB0ZW1wbGF0ZS5jbGFzc05hbWUsIHRlbXBsYXRlLmNhcHRpb24sCi0JCQkgICB0ZW1wbGF0ZS5oZWFkZXItPnN0eWxlLAorCQkJICAgdGVtcGxhdGUuaGVhZGVyLT5zdHlsZSAmIH5XU19WSVNJQkxFLAogCQkJICAgcmVjdC5sZWZ0ICsgdGVtcGxhdGUuaGVhZGVyLT54ICogeFVuaXQgLyA0LAogCQkJICAgcmVjdC50b3AgKyB0ZW1wbGF0ZS5oZWFkZXItPnkgKiB5VW5pdCAvIDgsCiAJCQkgICByZWN0LnJpZ2h0IC0gcmVjdC5sZWZ0LCByZWN0LmJvdHRvbSAtIHJlY3QudG9wLApAQCAtMzk3LDcgKzM5OCw3IEBACiAJU2VuZE1lc3NhZ2UoIGh3bmQsIFdNX1NFVEZPTlQsIGRsZ0luZm8tPmhVc2VyRm9udCwgMCApOwogICAgIGlmIChTZW5kTWVzc2FnZSggaHduZCwgV01fSU5JVERJQUxPRywgZGxnSW5mby0+aHduZEZvY3VzLCBwYXJhbSApKQogCVNldEZvY3VzKCBkbGdJbmZvLT5od25kRm9jdXMgKTsKLQorICAgIFNob3dXaW5kb3coaHduZCwgU1dfU0hPVyk7CiAgICAgcmV0dXJuIGh3bmQ7CiB9CiAKQEAgLTQ1OSw4ICs0NjAsOCBAQAogewogICAgIEhXTkQgaHduZDsKICAgICAKLSAgICBkcHJpbnRmX2RpYWxvZyhzdGRkZWIsICJEaWFsb2dCb3hQYXJhbTogJWQsJTA4bHgsJWQsJXAsJWxkXG4iLAotCSAgICBoSW5zdCwgZGxnVGVtcGxhdGUsIG93bmVyLCBkbGdQcm9jLCBwYXJhbSApOworICAgIGRwcmludGZfZGlhbG9nKHN0ZGRlYiwgIkRpYWxvZ0JveFBhcmFtOiAlZCwlMDhseCwlZCwlMDhseCwlbGRcbiIsCisJICAgIGhJbnN0LCBkbGdUZW1wbGF0ZSwgb3duZXIsIChEV09SRClkbGdQcm9jLCBwYXJhbSApOwogICAgIGh3bmQgPSBDcmVhdGVEaWFsb2dQYXJhbSggaEluc3QsIGRsZ1RlbXBsYXRlLCBvd25lciwgZGxnUHJvYywgcGFyYW0gKTsKICAgICBpZiAoaHduZCkgcmV0dXJuIERJQUxPR19Eb0RpYWxvZ0JveCggaHduZCwgb3duZXIgKTsKICAgICByZXR1cm4gLTE7CkBAIC02OTAsMTQgKzY5MSwxMSBAQAogICovCiB2b2lkIFNldERsZ0l0ZW1JbnQoIEhXTkQgaHduZCwgV09SRCBpZCwgV09SRCB2YWx1ZSwgQk9PTCBmU2lnbmVkICkKIHsKLSAgICBIQU5ETEUgaFRleHQgPSBVU0VSX0hFQVBfQUxMT0MoIDEwICk7Ci0gICAgY2hhciAqIHN0ciA9IChjaGFyICopIFVTRVJfSEVBUF9MSU5fQUREUiggaFRleHQgKTsKKyAgICBjaGFyIHN0clsyMF07CiAKLSAgICBpZiAoZlNpZ25lZCkgc3ByaW50Ziggc3RyLCAiJWQiLCB2YWx1ZSApOworICAgIGlmIChmU2lnbmVkKSBzcHJpbnRmKCBzdHIsICIlZCIsIChpbnQpdmFsdWUgKTsKICAgICBlbHNlIHNwcmludGYoIHN0ciwgIiV1IiwgdmFsdWUgKTsKLSAgICBTZW5kRGxnSXRlbU1lc3NhZ2UoIGh3bmQsIGlkLCBXTV9TRVRURVhULCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgVVNFUl9IRUFQX1NFR19BRERSKGhUZXh0KSApOwotICAgIFVTRVJfSEVBUF9GUkVFKCBoVGV4dCApOworICAgIFNlbmREbGdJdGVtTWVzc2FnZSggaHduZCwgaWQsIFdNX1NFVFRFWFQsIDAsIE1BS0VfU0VHUFRSKHN0cikgKTsKIH0KIAogCkBAIC03MDYsMTggKzcwNCwxMSBAQAogICovCiBXT1JEIEdldERsZ0l0ZW1JbnQoIEhXTkQgaHduZCwgV09SRCBpZCwgQk9PTCAqIHRyYW5zbGF0ZWQsIEJPT0wgZlNpZ25lZCApCiB7Ci0gICAgaW50IGxlbjsKLSAgICBIQU5ETEUgaFRleHQ7CisgICAgY2hhciBzdHJbMzBdOwogICAgIGxvbmcgcmVzdWx0ID0gMDsKLSAgICBjaGFyICogc3RyOwogICAgIAogICAgIGlmICh0cmFuc2xhdGVkKSAqdHJhbnNsYXRlZCA9IEZBTFNFOwotICAgIGlmICghKGxlbiA9IFNlbmREbGdJdGVtTWVzc2FnZSggaHduZCwgaWQsIFdNX0dFVFRFWFRMRU5HVEgsIDAsIDAgKSkpCi0JcmV0dXJuIDA7Ci0gICAgaWYgKCEoaFRleHQgPSBVU0VSX0hFQVBfQUxMT0MoIGxlbisxICkpKSByZXR1cm4gMDsKLSAgICBzdHIgPSAoY2hhciAqKSBVU0VSX0hFQVBfTElOX0FERFIoIGhUZXh0ICk7Ci0gICAgaWYgKFNlbmREbGdJdGVtTWVzc2FnZSggaHduZCwgaWQsIFdNX0dFVFRFWFQsIGxlbisxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVTRVJfSEVBUF9TRUdfQUREUihoVGV4dCkgKSkKKyAgICBpZiAoU2VuZERsZ0l0ZW1NZXNzYWdlKCBod25kLCBpZCwgV01fR0VUVEVYVCwgMzAsIE1BS0VfU0VHUFRSKHN0cikgKSkKICAgICB7CiAJY2hhciAqIGVuZHB0cjsKIAlyZXN1bHQgPSBzdHJ0b2woIHN0ciwgJmVuZHB0ciwgMTAgKTsKQEAgLTczNSw3ICs3MjYsNiBAQAogCSAgICB9CiAJfQogICAgIH0KLSAgICBVU0VSX0hFQVBfRlJFRSggaFRleHQgKTsKICAgICByZXR1cm4gKFdPUkQpcmVzdWx0OwogfQogCkBAIC04ODgsNyArODc4LDcgQEAKIAlpZiAoIWh3bmQpIGh3bmQgPSBkbGdQdHItPmh3bmRDaGlsZDsKIAlpZiAoaHduZCA9PSBod25kQ3RybCkgYnJlYWs7CiAJd25kUHRyID0gV0lOX0ZpbmRXbmRQdHIoIGh3bmQgKTsKLQlpZiAod25kUHRyLT5kd1N0eWxlICYgV1NfVEFCU1RPUCkKKwlpZiAoKHduZFB0ci0+ZHdTdHlsZSAmIFdTX1RBQlNUT1ApICYmICh3bmRQdHItPmR3U3R5bGUgJiBXU19WSVNJQkxFKSkKIAl7CiAJICAgIGh3bmRMYXN0ID0gaHduZDsKIAkgICAgaWYgKCFmUHJldmlvdXMpIGJyZWFrOwpkaWZmIC0tZ2l0IGEvd2luZG93cy9ldmVudC5jIGIvd2luZG93cy9ldmVudC5jCmluZGV4IDYzYmI0ZTIuLjA1YzIxY2UgMTAwNjQ0Ci0tLSBhL3dpbmRvd3MvZXZlbnQuYworKysgYi93aW5kb3dzL2V2ZW50LmMKQEAgLTEsMTEgKzEsMTEgQEAKIC8qCiAgKiBYIGV2ZW50cyBoYW5kbGluZyBmdW5jdGlvbnMKLSAqCisgKiAKICAqIENvcHlyaWdodCAxOTkzIEFsZXhhbmRyZSBKdWxsaWFyZAotICoKLXN0YXRpYyBjaGFyIENvcHlyaWdodFtdID0gIkNvcHlyaWdodCAgQWxleGFuZHJlIEp1bGxpYXJkLCAxOTkzIjsKLSovCisgKiAKKyAqLwogCisjaW5jbHVkZSA8Y3R5cGUuaD4KICNpbmNsdWRlIDxzdGRsaWIuaD4KICNpbmNsdWRlIDxzdGRpby5oPgogI2luY2x1ZGUgPFgxMS9YbGliLmg+CkBAIC0zMjIsMTAgKzMyMiwxMCBAQAogICAgIH0KICAgICBlbHNlIGlmIChrZXlfdHlwZSA9PSAwKSAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNoYXJhY3RlciBrZXkgKi8KICAgICB7Ci0JaWYgKGtleSA+PSAweDYxICYmIGtleSA8PSAweDdBKQotCSAgICB2a2V5ID0ga2V5IC0gMHgyMDsgICAgICAgICAgICAgICAgIC8qIGNvbnZlcnQgbG93ZXIgdG8gdXBwZXJjYXNlICovCisJaWYgKGlzYWxudW0oa2V5KSkKKwkgICAgdmtleSA9IHRvdXBwZXIoa2V5KTsgICAgICAgICAgICAgICAgIC8qIGNvbnZlcnQgbG93ZXIgdG8gdXBwZXJjYXNlICovCiAJZWxzZQotCSAgICB2a2V5ID0ga2V5OworCSAgICB2a2V5ID0gMHhiZTsKICAgICB9CiAKICAgICBpZiAoZXZlbnQtPnR5cGUgPT0gS2V5UHJlc3MpCkBAIC01MjcsNiArNTI3LDExIEBACiAgICAgV2luZG93IHdpbjsKICAgICBIV05EIG9sZF9jYXB0dXJlX3duZCA9IGNhcHR1cmVXbmQ7CiAKKyAgICBpZiAoIWh3bmQpCisgICAgeworICAgICAgICBSZWxlYXNlQ2FwdHVyZSgpOworICAgICAgICByZXR1cm4gb2xkX2NhcHR1cmVfd25kOworICAgIH0KICAgICBpZiAoISh3aW4gPSBXSU5fR2V0WFdpbmRvdyggaHduZCApKSkgcmV0dXJuIDA7CiAgICAgaWYgKFhHcmFiUG9pbnRlcihkaXNwbGF5LCB3aW4sIEZhbHNlLCAKICAgICAgICAgICAgICAgICAgICAgIEJ1dHRvblByZXNzTWFzayB8IEJ1dHRvblJlbGVhc2VNYXNrIHwgUG9pbnRlck1vdGlvbk1hc2ssCmRpZmYgLS1naXQgYS93aW5kb3dzL21kaS5jIGIvd2luZG93cy9tZGkuYwppbmRleCBiMDNhMmUxLi41M2QzNWY0IDEwMDY0NAotLS0gYS93aW5kb3dzL21kaS5jCisrKyBiL3dpbmRvd3MvbWRpLmMKQEAgLTU4LDYgKzU4LDE5IEBACiAgICAgfQogfQogCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgkJCQkJTURJSWNvbkFycmFuZ2UKKyAqLworV09SRAorTURJSWNvbkFycmFuZ2UoSFdORCBwYXJlbnQpCit7CisgIHJldHVybiBBcnJhbmdlSWNvbmljV2luZG93cyhwYXJlbnQpOwkJLyogQW55IHJlYXNvbiB3aHkgdGhlICAgICovCisJCQkJCQkvKiBleGlzdGluZyBpY29uIGFycmFuZ2UgKi8KKwkJCQkJCS8qIGNhbid0IGJlIHVzZWQgaGVyZT8JICovCisJCQkJCQkvKiAtRFJQCQkJICovCit9CisKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgkJCQkJTURJQ3JlYXRlQ2hpbGQKICAqLwpAQCAtNjYsMTIgKzc5LDE5IEBACiB7CiAgICAgTURJQ1JFQVRFU1RSVUNUICpjcyA9IChNRElDUkVBVEVTVFJVQ1QgKilQVFJfU0VHX1RPX0xJTihsUGFyYW0pOwogICAgIEhXTkQgaHduZDsKKyAgICBpbnQgc3BhY2luZzsKIAogICAgIC8qCiAgICAgICogQ3JlYXRlIGNoaWxkIHdpbmRvdwogICAgICAqLwogICAgIGNzLT5zdHlsZSAmPSAoV1NfTUlOSU1JWkUgfCBXU19NQVhJTUlaRSB8IFdTX0hTQ1JPTEwgfCBXU19WU0NST0xMKTsKLSAgICAKKworCQkJCS8qIFRoZSBjaGlsZCB3aW5kb3dzIHNob3VsZCBwcm9iYWJseSAgKi8KKwkJCQkvKiBzdGFnZ2VyLCBzaG91bGRuJ3QgdGhleT8gLURSUCAgICAgICovCisgICAgc3BhY2luZyA9IEdldFN5c3RlbU1ldHJpY3MoU01fQ1lDQVBUSU9OKSArIEdldFN5c3RlbU1ldHJpY3MoU01fQ1lGUkFNRSk7CisgICAgY3MtPnggPSBjaS0+bkFjdGl2ZUNoaWxkcmVuICogc3BhY2luZzsgIAorICAgIGNzLT55ID0gY2ktPm5BY3RpdmVDaGlsZHJlbiAqIHNwYWNpbmc7CisKICAgICBod25kID0gQ3JlYXRlV2luZG93RXgoMCwgUFRSX1NFR19UT19MSU4oY3MtPnN6Q2xhc3MpLAogICAgICAgICAgICAgICAgICAgICAgICAgICBQVFJfU0VHX1RPX0xJTihjcy0+c3pUaXRsZSksIAogCQkJICBXU19DSElMRCB8IFdTX0JPUkRFUiB8IFdTX0NBUFRJT04gfCBXU19DTElQU0lCTElOR1MgfApAQCAtMjkzLDYgKzMxMyw3IEBACiAKICAgICBTaG93V2luZG93KGNoaWxkLCBTV19SRVNUT1JFKTsJCS8qIGRpc3BsYXkgdGhlIHdpbmRvdyAqLwogICAgIE1ESUJyaW5nQ2hpbGRUb1RvcChwYXJlbnQsIGNoaWxkLCBGQUxTRSwgRkFMU0UpOworICAgIFNlbmRNZXNzYWdlKEdldFBhcmVudChwYXJlbnQpLCBXTV9OQ1BBSU5ULCAwLCAwKTsKIAogICAgIHJldHVybiAwOwogfQpAQCAtNjEyLDggKzYzMyw3IEBACiAJCSgoTE9ORykgY2ktPmZsYWdDaGlsZE1heGltaXplZCA8PCAxNikpOwogCiAgICAgICBjYXNlIFdNX01ESUlDT05BUlJBTkdFOgotCS8qIHJldHVybiBNRElJY29uQXJyYW5nZSguLi4pICovCi0JYnJlYWs7CisJcmV0dXJuIE1ESUljb25BcnJhbmdlKGh3bmQpOwogCQogICAgICAgY2FzZSBXTV9NRElNQVhJTUlaRToKIAlyZXR1cm4gTURJTWF4aW1pemVDaGlsZChod25kLCB3UGFyYW0sIGNpKTsKZGlmZiAtLWdpdCBhL3dpbmRvd3MvbWVzc2FnZS5jIGIvd2luZG93cy9tZXNzYWdlLmMKaW5kZXggNGQxODU5NC4uYzIxOTQyNCAxMDA2NDQKLS0tIGEvd2luZG93cy9tZXNzYWdlLmMKKysrIGIvd2luZG93cy9tZXNzYWdlLmMKQEAgLTQsMTEgKzQsNiBAQAogICogQ29weXJpZ2h0IDE5OTMsIDE5OTQgQWxleGFuZHJlIEp1bGxpYXJkCiAgKi8KIAotLyoKLSAqIFRoaXMgY29kZSBhc3N1bWVzIHRoYXQgdGhlcmUgaXMgb25seSBvbmUgV2luZG93cyB0YXNrIChoZW5jZQotICogb25lIG1lc3NhZ2UgcXVldWUpLgotICovCi0KICNpbmNsdWRlIDxzdGRsaWIuaD4KICNpbmNsdWRlIDxzeXMvdGltZS5oPgogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgpAQCAtODYxLDI3ICs4NTYsMjcgQEAKICAgICBXTkQgCSp3bmRQdHI7CiAKICAgICBpZiAoaHduZCA9PSBIV05EX0JST0FEQ0FTVCkgewotCSAgICBkcHJpbnRmX21zZyhzdGRkZWIsIlBvc3RNZXNzYWdlIC8vIEhXTkRfQlJPQURDQVNUICFcbiIpOwotCSAgICBod25kID0gR2V0VG9wV2luZG93KEdldERlc2t0b3BXaW5kb3coKSk7Ci0JICAgIHdoaWxlIChod25kKSB7Ci0JICAgICAgICBpZiAoISh3bmRQdHIgPSBXSU5fRmluZFduZFB0cihod25kKSkpIGJyZWFrOwotCQkJaWYgKHduZFB0ci0+ZHdTdHlsZSAmIFdTX1BPUFVQIHx8IHduZFB0ci0+ZHdTdHlsZSAmIFdTX0NBUFRJT04pIHsKLQkJCQlkcHJpbnRmX21zZyhzdGRkZWIsIkJST0FEQ0FTVCBNZXNzYWdlIHRvIGhXbmQ9JTA0WCBtPSUwNFggdz0lMDRYIGw9JTA4bFggIVxuIiwgCi0JCQkJCQkJaHduZCwgbWVzc2FnZSwgd1BhcmFtLCBsUGFyYW0pOwotCQkJCVBvc3RNZXNzYWdlKGh3bmQsIG1lc3NhZ2UsIHdQYXJhbSwgbFBhcmFtKTsKLQkJCQl9Ci0vKgkJCQl7Ci0JCQkJY2hhcglzdHJbMTI4XTsKLQkJCQlHZXRXaW5kb3dUZXh0KGh3bmQsIHN0ciwgc2l6ZW9mKHN0cikpOwotCQkJCWRwcmludGZfbXNnKHN0ZGRlYiwgIkJST0FEQ0FTVCBHZXRXaW5kb3dUZXh0KCk9JyVzJyAhXG4iLCBzdHIpOyAKLQkJCQl9Ki8KLQkJCWh3bmQgPSB3bmRQdHItPmh3bmROZXh0OwotCQkJfQotCQlkcHJpbnRmX21zZyhzdGRkZWIsIlBvc3RNZXNzYWdlIC8vIEVuZCBvZiBIV05EX0JST0FEQ0FTVCAhXG4iKTsKLQkJcmV0dXJuIFRSVUU7Ci0JCX0KKyAgICAgIGRwcmludGZfbXNnKHN0ZGRlYiwiUG9zdE1lc3NhZ2UgLy8gSFdORF9CUk9BRENBU1QgIVxuIik7CisgICAgICBod25kID0gR2V0VG9wV2luZG93KEdldERlc2t0b3BXaW5kb3coKSk7CisgICAgICB3aGlsZSAoaHduZCkgeworCWlmICghKHduZFB0ciA9IFdJTl9GaW5kV25kUHRyKGh3bmQpKSkgYnJlYWs7CisJaWYgKHduZFB0ci0+ZHdTdHlsZSAmIFdTX1BPUFVQIHx8IHduZFB0ci0+ZHdTdHlsZSAmIFdTX0NBUFRJT04pIHsKKwkgIGRwcmludGZfbXNnKHN0ZGRlYiwiQlJPQURDQVNUIE1lc3NhZ2UgdG8gaFduZD0lMDRYIG09JTA0WCB3PSUwNFggbD0lMDhsWCAhXG4iLAorCQkgICAgICBod25kLCBtZXNzYWdlLCB3UGFyYW0sIGxQYXJhbSk7CisJICBQb3N0TWVzc2FnZShod25kLCBtZXNzYWdlLCB3UGFyYW0sIGxQYXJhbSk7CisJfQorCS8qeworCSAgY2hhcglzdHJbMTI4XTsKKwkgIEdldFdpbmRvd1RleHQoaHduZCwgc3RyLCBzaXplb2Yoc3RyKSk7CisJICBkcHJpbnRmX21zZyhzdGRkZWIsICJCUk9BRENBU1QgR2V0V2luZG93VGV4dCgpPSclcycgIVxuIiwgc3RyKTsgCisJfSovCisJaHduZCA9IHduZFB0ci0+aHduZE5leHQ7CisgICAgICB9CisgICAgICBkcHJpbnRmX21zZyhzdGRkZWIsIlBvc3RNZXNzYWdlIC8vIEVuZCBvZiBIV05EX0JST0FEQ0FTVCAhXG4iKTsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KIAotCXduZFB0ciA9IFdJTl9GaW5kV25kUHRyKCBod25kICk7CisgICAgd25kUHRyID0gV0lOX0ZpbmRXbmRQdHIoIGh3bmQgKTsKICAgICBpZiAoIXduZFB0ciB8fCAhd25kUHRyLT5obWVtVGFza1EpIHJldHVybiBGQUxTRTsKICAgICBtc2cuaHduZCAgICA9IGh3bmQ7CiAgICAgbXNnLm1lc3NhZ2UgPSBtZXNzYWdlOwpAQCAtODk0LDYgKzg4OSwyNSBAQAogICAgIHJldHVybiBNU0dfQWRkTXNnKCB3bmRQdHItPmhtZW1UYXNrUSwgJm1zZywgMCApOwogfQogCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBQb3N0QXBwTWVzc2FnZSAgIChVU0VSLjExNikKKyAqLworQk9PTCBQb3N0QXBwTWVzc2FnZSggSFRBU0sgaFRhc2ssIFdPUkQgbWVzc2FnZSwgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtICkKK3sKKyAgICBNU0cgCW1zZzsKKworICAgIGlmIChHZXRUYXNrUXVldWUoaFRhc2spID09IDApIHJldHVybiBGQUxTRTsKKyAgICBtc2cuaHduZCAgICA9IDA7CisgICAgbXNnLm1lc3NhZ2UgPSBtZXNzYWdlOworICAgIG1zZy53UGFyYW0gID0gd1BhcmFtOworICAgIG1zZy5sUGFyYW0gID0gbFBhcmFtOworICAgIG1zZy50aW1lICAgID0gR2V0VGlja0NvdW50KCk7CisgICAgbXNnLnB0LnggICAgPSAwOworICAgIG1zZy5wdC55ICAgID0gMDsKKworICAgIHJldHVybiBNU0dfQWRkTXNnKCBHZXRUYXNrUXVldWUoaFRhc2spLCAmbXNnLCAwICk7Cit9CisKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgU2VuZE1lc3NhZ2UgICAoVVNFUi4xMTEpCmRpZmYgLS1naXQgYS93aW5kb3dzL21zZ2JveC5jIGIvd2luZG93cy9tc2dib3guYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZTRhZWM0Ci0tLSAvZGV2L251bGwKKysrIGIvd2luZG93cy9tc2dib3guYwpAQCAtMCwwICsxLDE5NiBAQAorLyoKKyAqIE1lc3NhZ2UgYm94ZXMKKyAqCisgKiBDb3B5cmlnaHQgMTk5NSBCZXJuZCBTY2htaWR0CisgKgorICovCisKKyNpbmNsdWRlICJ3aW5kb3dzLmgiCisjaW5jbHVkZSAiZGxncy5oIgorI2luY2x1ZGUgImRpYWxvZy5oIgorI2luY2x1ZGUgInNlbGVjdG9ycy5oIgorI2luY2x1ZGUgIi4uL3JjL3N5c3Jlcy5oIgorI2luY2x1ZGUgInRhc2suaCIKKwordHlwZWRlZiBzdHJ1Y3QgeworICBMUFNUUgl0aXRsZTsKKyAgTFBTVFIgdGV4dDsKKyAgV09SRCAgdHlwZTsKK30gTVNHQk9YLCAqTFBNU0dCT1g7CisKK0xPTkcgU3lzdGVtTWVzc2FnZUJveFByb2MoSFdORCBod25kLCBXT1JEIG1lc3NhZ2UsIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSkKK3sKKyAgTFBNU0dCT1ggbHBtYjsKKyAgUkVDVCByZWN0LCB0ZXh0cmVjdDsKKyAgSFdORCBoSXRlbTsKKyAgSERDIGhkYzsKKyAgTE9ORyBsUmV0OworICBpbnQgaSwgYnV0dG9ucywgYndpZHRoLCBiaGVpZ2h0LCB0aGVpZ2h0LCB3d2lkdGgsIGJwb3M7CisgIGludCBib3JoZWlnaHQsIGloZWlnaHQsIHRpaGVpZ2h0OworICAKKyAgc3dpdGNoKG1lc3NhZ2UpIHsKKyAgIGNhc2UgV01fSU5JVERJQUxPRzoKKyAgICBscG1iID0gKExQTVNHQk9YKWxQYXJhbTsKKyAgICBpZiAobHBtYi0+dGl0bGUgIT0gTlVMTCkgeworICAgICAgU2V0V2luZG93VGV4dChod25kLCBscG1iLT50aXRsZSk7CisgICAgfQorICAgIFNldFdpbmRvd1RleHQoR2V0RGxnSXRlbShod25kLCAxMDApLCBscG1iLT50ZXh0KTsKKyAgICAvKiBIaWRlIG5vdCBzZWxlY3RlZCBidXR0b25zICovCisgICAgc3dpdGNoKGxwbWItPnR5cGUgJiBNQl9UWVBFTUFTSykgeworICAgICBjYXNlIE1CX09LOgorICAgICAgU2hvd1dpbmRvdyhHZXREbGdJdGVtKGh3bmQsIDIpLCBTV19ISURFKTsKKyAgICAgIC8qIGZhbGwgdGhyb3VnaCAqLworICAgICBjYXNlIE1CX09LQ0FOQ0VMOgorICAgICAgU2hvd1dpbmRvdyhHZXREbGdJdGVtKGh3bmQsIDMpLCBTV19ISURFKTsKKyAgICAgIFNob3dXaW5kb3coR2V0RGxnSXRlbShod25kLCA0KSwgU1dfSElERSk7CisgICAgICBTaG93V2luZG93KEdldERsZ0l0ZW0oaHduZCwgNSksIFNXX0hJREUpOworICAgICAgU2hvd1dpbmRvdyhHZXREbGdJdGVtKGh3bmQsIDYpLCBTV19ISURFKTsKKyAgICAgIFNob3dXaW5kb3coR2V0RGxnSXRlbShod25kLCA3KSwgU1dfSElERSk7CisgICAgICBicmVhazsKKyAgICAgY2FzZSBNQl9BQk9SVFJFVFJZSUdOT1JFOgorICAgICAgU2hvd1dpbmRvdyhHZXREbGdJdGVtKGh3bmQsIDEpLCBTV19ISURFKTsKKyAgICAgIFNob3dXaW5kb3coR2V0RGxnSXRlbShod25kLCAyKSwgU1dfSElERSk7CisgICAgICBTaG93V2luZG93KEdldERsZ0l0ZW0oaHduZCwgNiksIFNXX0hJREUpOworICAgICAgU2hvd1dpbmRvdyhHZXREbGdJdGVtKGh3bmQsIDcpLCBTV19ISURFKTsKKyAgICAgIGJyZWFrOworICAgICBjYXNlIE1CX1lFU05POgorICAgICAgU2hvd1dpbmRvdyhHZXREbGdJdGVtKGh3bmQsIDIpLCBTV19ISURFKTsKKyAgICAgIC8qIGZhbGwgdGhyb3VnaCAqLworICAgICBjYXNlIE1CX1lFU05PQ0FOQ0VMOgorICAgICAgU2hvd1dpbmRvdyhHZXREbGdJdGVtKGh3bmQsIDEpLCBTV19ISURFKTsKKyAgICAgIFNob3dXaW5kb3coR2V0RGxnSXRlbShod25kLCAzKSwgU1dfSElERSk7CisgICAgICBTaG93V2luZG93KEdldERsZ0l0ZW0oaHduZCwgNCksIFNXX0hJREUpOworICAgICAgU2hvd1dpbmRvdyhHZXREbGdJdGVtKGh3bmQsIDUpLCBTV19ISURFKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICAvKiBTZXQgdGhlIGljb24gKi8KKyAgICBzd2l0Y2gobHBtYi0+dHlwZSAmIE1CX0lDT05NQVNLKSB7CisgICAgIGNhc2UgTUJfSUNPTkVYQ0xBTUFUSU9OOgorICAgICAgU2VuZERsZ0l0ZW1NZXNzYWdlKGh3bmQsIHN0YzEsIFNUTV9TRVRJQ09OLCBMb2FkSWNvbigwLCBJRElfRVhDTEFNQVRJT04pLCAwKTsKKyAgICAgIGJyZWFrOworICAgICBjYXNlIE1CX0lDT05RVUVTVElPTjoKKyAgICAgIFNlbmREbGdJdGVtTWVzc2FnZShod25kLCBzdGMxLCBTVE1fU0VUSUNPTiwgTG9hZEljb24oMCwgSURJX1FVRVNUSU9OKSwgMCk7CisgICAgICBicmVhazsKKyAgICAgY2FzZSBNQl9JQ09OQVNURVJJU0s6CisgICAgICBTZW5kRGxnSXRlbU1lc3NhZ2UoaHduZCwgc3RjMSwgU1RNX1NFVElDT04sIExvYWRJY29uKDAsIElESV9BU1RFUklTSyksIDApOworICAgICAgYnJlYWs7CisgICAgIGNhc2UgTUJfSUNPTkhBTkQ6CisgICAgICBTZW5kRGxnSXRlbU1lc3NhZ2UoaHduZCwgc3RjMSwgU1RNX1NFVElDT04sIExvYWRJY29uKDAsIElESV9IQU5EKSwgMCk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgCisgICAgLyogUG9zaXRpb24gZXZlcnl0aGluZyAqLworICAgIEdldFdpbmRvd1JlY3QoaHduZCwgJnJlY3QpOworICAgIGJvcmhlaWdodCA9IHJlY3QuYm90dG9tIC0gcmVjdC50b3A7CisgICAgd3dpZHRoID0gcmVjdC5yaWdodCAtIHJlY3QubGVmdDsKKyAgICBHZXRDbGllbnRSZWN0KGh3bmQsICZyZWN0KTsKKyAgICBib3JoZWlnaHQgLT0gcmVjdC5ib3R0b20gLSByZWN0LnRvcDsKKworICAgIC8qIEdldCB0aGUgaWNvbiBoZWlnaHQgKi8KKyAgICBHZXRXaW5kb3dSZWN0KEdldERsZ0l0ZW0oaHduZCwgMTA4OCksICZyZWN0KTsKKyAgICBpaGVpZ2h0ID0gcmVjdC5ib3R0b20gLSByZWN0LnRvcDsKKyAgICAKKyAgICAvKiBHZXQgdGhlIG51bWJlciBvZiB2aXNpYmxlIGJ1dHRvbnMgYW5kIHRoZWlyIHdpZHRoICovCisgICAgR2V0V2luZG93UmVjdChHZXREbGdJdGVtKGh3bmQsIDIpLCAmcmVjdCk7CisgICAgYmhlaWdodCA9IHJlY3QuYm90dG9tIC0gcmVjdC50b3A7CisgICAgYndpZHRoID0gcmVjdC5sZWZ0OworICAgIEdldFdpbmRvd1JlY3QoR2V0RGxnSXRlbShod25kLCAxKSwgJnJlY3QpOworICAgIGJ3aWR0aCAtPSByZWN0LmxlZnQ7CisgICAgZm9yIChidXR0b25zID0gMCwgaSA9IDE7IGkgPCA4OyBpKyspIHsKKyAgICAgIGhJdGVtID0gR2V0RGxnSXRlbShod25kLCBpKTsKKyAgICAgIGlmIChHZXRXaW5kb3dMb25nKGhJdGVtLCBHV0xfU1RZTEUpICYgV1NfVklTSUJMRSkgeworCWJ1dHRvbnMrKzsKKyAgICAgIH0KKyAgICB9CisgICAgCisgICAgLyogR2V0IHRoZSB0ZXh0IHNpemUgKi8KKyAgICBoSXRlbSA9IEdldERsZ0l0ZW0oaHduZCwgMTAwKTsKKyAgICBHZXRXaW5kb3dSZWN0KGhJdGVtLCAmdGV4dHJlY3QpOworICAgIE1hcFdpbmRvd1BvaW50cygwLCBod25kLCAoTFBQT0lOVCkmdGV4dHJlY3QsIDIpOworICAgIAorICAgIEdldENsaWVudFJlY3QoaEl0ZW0sICZyZWN0KTsKKyAgICBoZGMgPSBHZXREQyhoSXRlbSk7CisgICAgbFJldCA9IERyYXdUZXh0KGhkYywgbHBtYi0+dGV4dCwgLTEsICZyZWN0LAorCQkgICAgRFRfTEVGVCB8IERUX0VYUEFORFRBQlMgfCBEVF9XT1JEQlJFQUsgfCBEVF9DQUxDUkVDVCk7CisgICAgdGhlaWdodCA9IHJlY3QuYm90dG9tICAtIHJlY3QudG9wOworICAgIHRpaGVpZ2h0ID0gMTYgKyBtYXgoaWhlaWdodCwgdGhlaWdodCk7CisgICAgUmVsZWFzZURDKGhJdGVtLCBoZGMpOworICAgIAorICAgIC8qIFBvc2l0aW9uIHRoZSB0ZXh0ICovCisgICAgU2V0V2luZG93UG9zKGhJdGVtLCAwLCB0ZXh0cmVjdC5sZWZ0LCAodGloZWlnaHQgLSB0aGVpZ2h0KSAvIDIsIAorCQkgcmVjdC5yaWdodCAtIHJlY3QubGVmdCwgdGhlaWdodCwKKwkJIFNXUF9OT1pPUkRFUiB8IFNXUF9OT0FDVElWQVRFIHwgU1dQX05PUkVEUkFXKTsKKyAgICAKKyAgICAvKiBQb3NpdGlvbiB0aGUgaWNvbiAqLworICAgIGhJdGVtID0gR2V0RGxnSXRlbShod25kLCAxMDg4KTsKKyAgICBHZXRXaW5kb3dSZWN0KGhJdGVtLCAmcmVjdCk7CisgICAgTWFwV2luZG93UG9pbnRzKDAsIGh3bmQsIChMUFBPSU5UKSZyZWN0LCAyKTsKKyAgICBTZXRXaW5kb3dQb3MoaEl0ZW0sIDAsIHJlY3QubGVmdCwgKHRpaGVpZ2h0IC0gaWhlaWdodCkgLyAyLCAwLCAwLAorCQkgU1dQX05PU0laRSB8IFNXUF9OT1pPUkRFUiB8IFNXUF9OT0FDVElWQVRFIHwgU1dQX05PUkVEUkFXKTsKKyAgICAKKyAgICAvKiBSZXNpemUgdGhlIHdpbmRvdyAqLworICAgIFNldFdpbmRvd1Bvcyhod25kLCAwLCAwLCAwLCB3d2lkdGgsIDggKyB0aWhlaWdodCArIGJoZWlnaHQgKyBib3JoZWlnaHQsCisJCSBTV1BfTk9NT1ZFIHwgU1dQX05PWk9SREVSIHwgU1dQX05PQUNUSVZBVEUgfCBTV1BfTk9SRURSQVcpOworICAgIAorICAgIC8qIFBvc2l0aW9uIHRoZSBidXR0b25zICovCisgICAgYnBvcyA9ICh3d2lkdGggLSBid2lkdGggKiBidXR0b25zKSAvIDI7CisgICAgR2V0V2luZG93UmVjdChHZXREbGdJdGVtKGh3bmQsIDEpLCAmcmVjdCk7CisgICAgZm9yIChidXR0b25zID0gaSA9IDA7IGkgPCA3OyBpKyspIHsKKyAgICAgIC8qIHNvbWUgYXJpdGhtZXRpYyB0byBnZXQgdGhlIHJpZ2h0IG9yZGVyIGZvciBZZXNOb0NhbmNlbCB3aW5kb3dzICovCisgICAgICBoSXRlbSA9IEdldERsZ0l0ZW0oaHduZCwgKGkgKyA1KSAlIDcgKyAxKTsKKyAgICAgIGlmIChHZXRXaW5kb3dMb25nKGhJdGVtLCBHV0xfU1RZTEUpICYgV1NfVklTSUJMRSkgeworCWlmIChidXR0b25zKysgPT0gKChscG1iLT50eXBlICYgTUJfREVGTUFTSykgPj4gOCkpIHsKKwkgIFNldEZvY3VzKGhJdGVtKTsKKwkgIFNlbmRNZXNzYWdlKGhJdGVtLCBCTV9TRVRTVFlMRSwgQlNfREVGUFVTSEJVVFRPTiwgVFJVRSk7CisJfQorCVNldFdpbmRvd1BvcyhoSXRlbSwgMCwgYnBvcywgdGloZWlnaHQsIDAsIDAsCisJCSAgICAgU1dQX05PU0laRSB8IFNXUF9OT1pPUkRFUiB8IFNXUF9OT0FDVElWQVRFIHwgU1dQX05PUkVEUkFXKTsKKwlicG9zICs9IGJ3aWR0aDsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIDA7CisgICAgYnJlYWs7CisgICAgCisgICBjYXNlIFdNX0NPTU1BTkQ6CisgICAgc3dpdGNoICh3UGFyYW0pIHsKKyAgICAgY2FzZSBJRE9LOgorICAgICBjYXNlIElEQ0FOQ0VMOgorICAgICBjYXNlIElEQUJPUlQ6CisgICAgIGNhc2UgSURSRVRSWToKKyAgICAgY2FzZSBJRElHTk9SRToKKyAgICAgY2FzZSBJRFlFUzoKKyAgICAgY2FzZSBJRE5POgorICAgICAgRW5kRGlhbG9nKGh3bmQsIHdQYXJhbSk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgYnJlYWs7CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJCQlNZXNzYWdlQm94ICBbVVNFUi4xXQorICovCisKK2ludCBNZXNzYWdlQm94KEhXTkQgaFduZCwgTFBTVFIgdGV4dCwgTFBTVFIgdGl0bGUsIFdPUkQgdHlwZSkKK3sKKyAgTVNHQk9YIG1ib3g7CisKKyAgbWJveC50aXRsZSA9IHRpdGxlOworICBtYm94LnRleHQgID0gdGV4dDsKKyAgbWJveC50eXBlICA9IHR5cGU7CisgIHJldHVybiBEaWFsb2dCb3hJbmRpcmVjdFBhcmFtUHRyKEdldFdpbmRvd1dvcmQoaFduZCwgR1dXX0hJTlNUQU5DRSksCisJCQkJICAgc3lzcmVzX0RJQUxPR19NU0dCT1gsIGhXbmQsCisJCQkJICAgR2V0V25kUHJvY0VudHJ5MTYoIlN5c3RlbU1lc3NhZ2VCb3hQcm9jIiksCisJCQkJICAgKExPTkcpJm1ib3gpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCQkJRmF0YWxBcHBFeGl0ICBbVVNFUi4xMzddCisgKi8KKwordm9pZCBGYXRhbEFwcEV4aXQoV09SRCB3QWN0aW9uLCBMUFNUUiBzdHIpCit7CisgIE1lc3NhZ2VCb3goMCwgc3RyLCBOVUxMLCBNQl9TWVNURU1NT0RBTCB8IE1CX09LKTsKKyAgVEFTS19LaWxsQ3VycmVudFRhc2soMCk7Cit9CmRpZmYgLS1naXQgYS93aW5kb3dzL25vbmNsaWVudC5jIGIvd2luZG93cy9ub25jbGllbnQuYwppbmRleCA5NjA0ZDM1Li44YWY4ZGQzIDEwMDY0NAotLS0gYS93aW5kb3dzL25vbmNsaWVudC5jCisrKyBiL3dpbmRvd3Mvbm9uY2xpZW50LmMKQEAgLTEyLDcgKzEyLDYgQEAKICNpbmNsdWRlICJ1c2VyLmgiCiAjaW5jbHVkZSAiZGlhbG9nLmgiCiAjaW5jbHVkZSAic3lzY29sb3IuaCIKLSNpbmNsdWRlICJsaWJyYXJ5LmgiCiAjaW5jbHVkZSAibWVudS5oIgogI2luY2x1ZGUgIndpbnBvcy5oIgogI2luY2x1ZGUgInNjcm9sbC5oIgpAQCAtMzMsNyArMzIsNiBAQAogc3RhdGljIEhCSVRNQVAgaGJpdG1hcFJlc3RvcmVEID0gMDsKIAogI2RlZmluZSBTQ19BQk9VVFdJTkUgICAgCShTQ19TQ1JFRU5TQVZFKzEpCi1leHRlcm4gQk9PTCBBYm91dFdpbmVfUHJvYyggSFdORCBoRGxnLCBXT1JEIG1zZywgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtICk7CiAKICAgLyogU29tZSB1c2VmdWwgbWFjcm9zICovCiAjZGVmaW5lIEhBU19ETEdGUkFNRShzdHlsZSxleFN0eWxlKSBcCkBAIC0xMzEyLDcgKzEzMTAsNyBAQAogCWJyZWFrOwogCiAgICAgY2FzZSBTQ19UQVNLTElTVDoKLQkvKiBXaW5FeGVjKCAidGFza21hbi5leGUiLCBTV19TSE9XTk9STUFMICk7ICovCisJV2luRXhlYyggInRhc2ttYW4uZXhlIiwgU1dfU0hPV05PUk1BTCApOyAKIAlicmVhazsKIAogICAgIGNhc2UgU0NfSE9US0VZOgpAQCAtMTMyMCw5ICsxMzE4LDkgQEAKIAogICAgIGNhc2UgU0NfU0NSRUVOU0FWRToKIAlpZiAod1BhcmFtID09IFNDX0FCT1VUV0lORSkKLQl7ICAgZXh0ZXJuIGNoYXIgc3lzcmVzX0RJQUxPR18yW107Ci0JICAgIERpYWxvZ0JveEluZGlyZWN0UHRyKCB3bmRQdHItPmhJbnN0YW5jZSwgc3lzcmVzX0RJQUxPR18yLAotCQkgICAgICAgaHduZCwgR2V0V25kUHJvY0VudHJ5MTYoIkFib3V0V2luZV9Qcm9jIikgKTsKKwl7ICAgCisJICBleHRlcm4gY29uc3QgY2hhciBwZW9wbGVbXTsKKwkgIFNoZWxsQWJvdXQoaHduZCwiV0lORSIscGVvcGxlLDApOwogICAgICAgICB9CiAJYnJlYWs7CiAgICAgfQpkaWZmIC0tZ2l0IGEvd2luZG93cy9wYWludGluZy5jIGIvd2luZG93cy9wYWludGluZy5jCmluZGV4IDc4MjYyNmMuLjc3NDA4MWEgMTAwNjQ0Ci0tLSBhL3dpbmRvd3MvcGFpbnRpbmcuYworKysgYi93aW5kb3dzL3BhaW50aW5nLmMKQEAgLTI1MCw3ICsyNTAsNyBAQAogICAgICAgLyogUmVjdXJzaXZlbHkgcHJvY2VzcyBjaGlsZHJlbiAqLwogCiAgICAgaWYgKCEoZmxhZ3MgJiBSRFdfTk9DSElMRFJFTikgJiYKLQkoKGZsYWdzICYmIFJEV19BTExDSElMRFJFTikgfHwgISh3bmRQdHItPmR3U3R5bGUgJiBXU19DTElQQ0hJTERSRU4pKSkKKwkoKGZsYWdzICYgUkRXX0FMTENISUxEUkVOKSB8fCAhKHduZFB0ci0+ZHdTdHlsZSAmIFdTX0NMSVBDSElMRFJFTikpKQogICAgIHsKIAlpZiAoaHJnblVwZGF0ZSkKIAl7CmRpZmYgLS1naXQgYS93aW5kb3dzL3Byb3BlcnR5LmMgYi93aW5kb3dzL3Byb3BlcnR5LmMKaW5kZXggZGZmZmMwYi4uZjNlODhiYSAxMDA2NDQKLS0tIGEvd2luZG93cy9wcm9wZXJ0eS5jCisrKyBiL3dpbmRvd3MvcHJvcGVydHkuYwpAQCAtMTE5LDcgKzExOSw3IEBACiAgICAgSEFORExFIGhQcm9wOwogICAgIFdORCAqd25kUHRyOwogCi0gICAgZHByaW50Zl9wcm9wKCBzdGRkZWIsICJFbnVtUHJvcHM6ICUwNHggJXBcbiIsIGh3bmQsIGZ1bmMgKTsKKyAgICBkcHJpbnRmX3Byb3AoIHN0ZGRlYiwgIkVudW1Qcm9wczogJTA0eCAlMDhseFxuIiwgaHduZCwgKExPTkcpZnVuYyApOwogICAgIGlmICghKHduZFB0ciA9IFdJTl9GaW5kV25kUHRyKCBod25kICkpKSByZXR1cm4gMDsKICAgICBoUHJvcCA9IHduZFB0ci0+aFByb3A7CiAgICAgd2hpbGUgKGhQcm9wKQpkaWZmIC0tZ2l0IGEvd2luZG93cy90aW1lci5jIGIvd2luZG93cy90aW1lci5jCmluZGV4IDBkMWIwYWYuLjk2ZmZmNmEgMTAwNjQ0Ci0tLSBhL3dpbmRvd3MvdGltZXIuYworKysgYi93aW5kb3dzL3RpbWVyLmMKQEAgLTIxMyw3ICsyMTMsNyBAQAogICovCiBXT1JEIFNldFRpbWVyKCBIV05EIGh3bmQsIFdPUkQgaWQsIFdPUkQgdGltZW91dCwgRkFSUFJPQyBwcm9jICkKIHsKLSAgICBkcHJpbnRmX3RpbWVyKHN0ZGRlYiwgIlNldFRpbWVyOiAlZCAlZCAlZCAlcFxuIiwgaHduZCwgaWQsIHRpbWVvdXQsIHByb2MgKTsKKyAgICBkcHJpbnRmX3RpbWVyKHN0ZGRlYiwgIlNldFRpbWVyOiAlZCAlZCAlZCAlMDhseFxuIiwgaHduZCwgaWQsIHRpbWVvdXQsIChMT05HKXByb2MgKTsKICAgICByZXR1cm4gVElNRVJfU2V0VGltZXIoIGh3bmQsIGlkLCB0aW1lb3V0LCBwcm9jLCBGQUxTRSApOwogfQogCkBAIC0yMjMsOCArMjIzLDggQEAKICAqLwogV09SRCBTZXRTeXN0ZW1UaW1lciggSFdORCBod25kLCBXT1JEIGlkLCBXT1JEIHRpbWVvdXQsIEZBUlBST0MgcHJvYyApCiB7Ci0gICAgZHByaW50Zl90aW1lcihzdGRkZWIsICJTZXRTeXN0ZW1UaW1lcjogJWQgJWQgJWQgJXBcbiIsIAotCQkgIGh3bmQsIGlkLCB0aW1lb3V0LCBwcm9jICk7CisgICAgZHByaW50Zl90aW1lcihzdGRkZWIsICJTZXRTeXN0ZW1UaW1lcjogJWQgJWQgJWQgJTA4bHhcbiIsIAorCQkgIGh3bmQsIGlkLCB0aW1lb3V0LCAoTE9ORylwcm9jICk7CiAgICAgcmV0dXJuIFRJTUVSX1NldFRpbWVyKCBod25kLCBpZCwgdGltZW91dCwgcHJvYywgVFJVRSApOwogfQogCmRpZmYgLS1naXQgYS93aW5kb3dzL3dpbi5jIGIvd2luZG93cy93aW4uYwppbmRleCBmYzYzYWU4Li4yOWRjMThhIDEwMDY0NAotLS0gYS93aW5kb3dzL3dpbi5jCisrKyBiL3dpbmRvd3Mvd2luLmMKQEAgLTIxNSw2ICsyMTUsNyBAQAogICAgIFdORCAqd25kUHRyOwogICAgIEhDTEFTUyBoY2xhc3M7CiAgICAgQ0xBU1MgKmNsYXNzUHRyOworICAgIEhEQyBoZGM7CiAKICAgICBpZiAoIShoY2xhc3MgPSBDTEFTU19GaW5kQ2xhc3NCeU5hbWUoIERFU0tUT1BfQ0xBU1NfTkFNRSwgMCwgJmNsYXNzUHRyICkpKQogCXJldHVybiBGQUxTRTsKQEAgLTI1Niw2ICsyNTcsMTIgQEAKICAgICB3bmRQdHItPmhTeXNNZW51ICAgICAgICAgID0gMDsKICAgICB3bmRQdHItPmhQcm9wCSAgICAgID0gMDsKICAgICBFVkVOVF9SZWdpc3RlcldpbmRvdyggd25kUHRyLT53aW5kb3csIGh3bmREZXNrdG9wICk7CisgICAgU2VuZE1lc3NhZ2UoIGh3bmREZXNrdG9wLCBXTV9OQ0NSRUFURSwgMCwgMCApOworICAgIGlmICgoaGRjID0gR2V0REMoIGh3bmREZXNrdG9wICkpICE9IDApCisgICAgeworICAgICAgICBTZW5kTWVzc2FnZSggaHduZERlc2t0b3AsIFdNX0VSQVNFQktHTkQsIGhkYywgMCApOworICAgICAgICBSZWxlYXNlREMoIGh3bmREZXNrdG9wLCBoZGMgKTsKKyAgICB9CiAgICAgcmV0dXJuIFRSVUU7CiB9CiAKQEAgLTI4Myw4ICsyOTAsOCBAQAogICAgIENMQVNTICpjbGFzc1B0cjsKICAgICBXTkQgKnduZFB0cjsKICAgICBQT0lOVCBtYXhTaXplLCBtYXhQb3MsIG1pblRyYWNrLCBtYXhUcmFjazsKLSAgICBDUkVBVEVTVFJVQ1QgKmNyZWF0ZVN0cnVjdDsKLSAgICBIQU5ETEUgaGNyZWF0ZVN0cnVjdCwgaHdpbk5hbWUsIGhjbGFzc05hbWU7CisgICAgQ1JFQVRFU1RSVUNUIGNyZWF0ZVN0cnVjdDsKKyAgICBIQU5ETEUgaHdpbk5hbWUsIGhjbGFzc05hbWU7CiAgICAgaW50IHdtY3JlYXRlOwogICAgIFhTZXRXaW5kb3dBdHRyaWJ1dGVzIHdpbl9hdHRyOwogCkBAIC00NTMsMzUgKzQ2MCwzMiBAQAogCiAgICAgICAvKiBTZW5kIHRoZSBXTV9DUkVBVEUgbWVzc2FnZSAqLwogCi0gICAgaGNyZWF0ZVN0cnVjdCA9IFVTRVJfSEVBUF9BTExPQyggc2l6ZW9mKENSRUFURVNUUlVDVCkgKTsKICAgICBoY2xhc3NOYW1lID0gVVNFUl9IRUFQX0FMTE9DKCBzdHJsZW4oY2xhc3NOYW1lKSsxICk7CiAgICAgc3RyY3B5KCBVU0VSX0hFQVBfTElOX0FERFIoaGNsYXNzTmFtZSksIGNsYXNzTmFtZSApOwotICAgIGNyZWF0ZVN0cnVjdCA9IChDUkVBVEVTVFJVQ1QgKikgVVNFUl9IRUFQX0xJTl9BRERSKCBoY3JlYXRlU3RydWN0ICk7Ci0gICAgY3JlYXRlU3RydWN0LT5scENyZWF0ZVBhcmFtcyA9IChMUFNUUilkYXRhOwotICAgIGNyZWF0ZVN0cnVjdC0+aEluc3RhbmNlICAgICAgPSBpbnN0YW5jZTsKLSAgICBjcmVhdGVTdHJ1Y3QtPmhNZW51ICAgICAgICAgID0gbWVudTsKLSAgICBjcmVhdGVTdHJ1Y3QtPmh3bmRQYXJlbnQgICAgID0gcGFyZW50OwotICAgIGNyZWF0ZVN0cnVjdC0+Y3ggICAgICAgICAgICAgPSB3aWR0aDsKLSAgICBjcmVhdGVTdHJ1Y3QtPmN5ICAgICAgICAgICAgID0gaGVpZ2h0OwotICAgIGNyZWF0ZVN0cnVjdC0+eCAgICAgICAgICAgICAgPSB4OwotICAgIGNyZWF0ZVN0cnVjdC0+eSAgICAgICAgICAgICAgPSB5OwotICAgIGNyZWF0ZVN0cnVjdC0+c3R5bGUgICAgICAgICAgPSBzdHlsZTsKLSAgICBjcmVhdGVTdHJ1Y3QtPmxwc3pDbGFzcyAgICAgID0gKExQU1RSKVVTRVJfSEVBUF9TRUdfQUREUihoY2xhc3NOYW1lKTsKLSAgICBjcmVhdGVTdHJ1Y3QtPmR3RXhTdHlsZSAgICAgID0gMDsKKyAgICBjcmVhdGVTdHJ1Y3QubHBDcmVhdGVQYXJhbXMgPSAoTFBTVFIpZGF0YTsKKyAgICBjcmVhdGVTdHJ1Y3QuaEluc3RhbmNlICAgICAgPSBpbnN0YW5jZTsKKyAgICBjcmVhdGVTdHJ1Y3QuaE1lbnUgICAgICAgICAgPSBtZW51OworICAgIGNyZWF0ZVN0cnVjdC5od25kUGFyZW50ICAgICA9IHBhcmVudDsKKyAgICBjcmVhdGVTdHJ1Y3QuY3ggICAgICAgICAgICAgPSB3aWR0aDsKKyAgICBjcmVhdGVTdHJ1Y3QuY3kgICAgICAgICAgICAgPSBoZWlnaHQ7CisgICAgY3JlYXRlU3RydWN0LnggICAgICAgICAgICAgID0geDsKKyAgICBjcmVhdGVTdHJ1Y3QueSAgICAgICAgICAgICAgPSB5OworICAgIGNyZWF0ZVN0cnVjdC5zdHlsZSAgICAgICAgICA9IHN0eWxlOworICAgIGNyZWF0ZVN0cnVjdC5scHN6Q2xhc3MgICAgICA9IChMUFNUUilVU0VSX0hFQVBfU0VHX0FERFIoaGNsYXNzTmFtZSk7CisgICAgY3JlYXRlU3RydWN0LmR3RXhTdHlsZSAgICAgID0gMDsKICAgICBpZiAod2luZG93TmFtZSkKICAgICB7CiAgICAgICAgIGh3aW5OYW1lID0gVVNFUl9IRUFQX0FMTE9DKCBzdHJsZW4od2luZG93TmFtZSkrMSApOwogICAgICAgICBzdHJjcHkoIFVTRVJfSEVBUF9MSU5fQUREUihod2luTmFtZSksIHdpbmRvd05hbWUgKTsKLSAgICAgICAgY3JlYXRlU3RydWN0LT5scHN6TmFtZSA9IChMUFNUUilVU0VSX0hFQVBfU0VHX0FERFIoaHdpbk5hbWUpOworICAgICAgICBjcmVhdGVTdHJ1Y3QubHBzek5hbWUgPSAoTFBTVFIpVVNFUl9IRUFQX1NFR19BRERSKGh3aW5OYW1lKTsKICAgICB9CiAgICAgZWxzZQogICAgIHsKICAgICAgICAgaHdpbk5hbWUgPSAwOwotICAgICAgICBjcmVhdGVTdHJ1Y3QtPmxwc3pOYW1lID0gTlVMTDsKKyAgICAgICAgY3JlYXRlU3RydWN0Lmxwc3pOYW1lID0gTlVMTDsKICAgICB9CiAKLSAgICB3bWNyZWF0ZSA9IFNlbmRNZXNzYWdlKCBod25kLCBXTV9OQ0NSRUFURSwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBVU0VSX0hFQVBfU0VHX0FERFIoaGNyZWF0ZVN0cnVjdCkgKTsKKyAgICB3bWNyZWF0ZSA9IFNlbmRNZXNzYWdlKCBod25kLCBXTV9OQ0NSRUFURSwgMCwgTUFLRV9TRUdQVFIoJmNyZWF0ZVN0cnVjdCkgKTsKICAgICBpZiAoIXdtY3JlYXRlKSB7CiAJCWRwcmludGZfd2luKHN0ZGRlYiwiQ3JlYXRlV2luZG93RXg6IFdNX05DQ1JFQVRFIHJldHVybiAwXG4iKTsKIAkJd21jcmVhdGUgPSAtMTsKQEAgLTQ5MCwxMSArNDk0LDkgQEAKICAgICB7CiAJV0lOUE9TX1NlbmROQ0NhbGNTaXplKCBod25kLCBGQUxTRSwgJnduZFB0ci0+cmVjdFdpbmRvdywKIAkJCSAgICAgICBOVUxMLCBOVUxMLCBOVUxMLCAmd25kUHRyLT5yZWN0Q2xpZW50ICk7Ci0Jd21jcmVhdGUgPSBTZW5kTWVzc2FnZSggaHduZCwgV01fQ1JFQVRFLCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVU0VSX0hFQVBfU0VHX0FERFIoaGNyZWF0ZVN0cnVjdCkgKTsKKwl3bWNyZWF0ZSA9IFNlbmRNZXNzYWdlKGh3bmQsIFdNX0NSRUFURSwgMCwgTUFLRV9TRUdQVFIoJmNyZWF0ZVN0cnVjdCkpOwogICAgIH0KIAotICAgIFVTRVJfSEVBUF9GUkVFKCBoY3JlYXRlU3RydWN0ICk7CiAgICAgVVNFUl9IRUFQX0ZSRUUoIGhjbGFzc05hbWUgKTsKICAgICBpZiAoaHdpbk5hbWUpIFVTRVJfSEVBUF9GUkVFKCBod2luTmFtZSApOwogCmRpZmYgLS1naXQgYS93aW5kb3dzL3dpbnBvcy5jIGIvd2luZG93cy93aW5wb3MuYwppbmRleCBiMWY3MTM5Li5iYWI4MTEzIDEwMDY0NAotLS0gYS93aW5kb3dzL3dpbnBvcy5jCisrKyBiL3dpbmRvd3Mvd2lucG9zLmMKQEAgLTgsNiArOCw3IEBACiAjaW5jbHVkZSAidXNlci5oIgogI2luY2x1ZGUgIndpbi5oIgogI2luY2x1ZGUgIm1lc3NhZ2UuaCIKKyNpbmNsdWRlICJzdGFja2ZyYW1lLmgiCiAjaW5jbHVkZSAid2lucG9zLmgiCiAjaW5jbHVkZSAibm9uY2xpZW50LmgiCiAjaW5jbHVkZSAic3RkZGVidWcuaCIKQEAgLTU5OSwyMyArNjAwLDE5IEBACiAJCQkgICAgUkVDVCAqb2xkV2luZG93UmVjdCwgUkVDVCAqb2xkQ2xpZW50UmVjdCwKIAkJCSAgICBXSU5ET1dQT1MgKndpbnBvcywgUkVDVCAqbmV3Q2xpZW50UmVjdCApCiB7Ci0gICAgTkNDQUxDU0laRV9QQVJBTVMgKnBhcmFtczsKLSAgICBIQU5ETEUgaHBhcmFtczsKKyAgICBOQ0NBTENTSVpFX1BBUkFNUyBwYXJhbXM7CiAgICAgTE9ORyByZXN1bHQ7CiAKLSAgICBpZiAoIShocGFyYW1zID0gVVNFUl9IRUFQX0FMTE9DKCBzaXplb2YoKnBhcmFtcykgKSkpIHJldHVybiAwOwotICAgIHBhcmFtcyA9IChOQ0NBTENTSVpFX1BBUkFNUyAqKSBVU0VSX0hFQVBfTElOX0FERFIoIGhwYXJhbXMgKTsKLSAgICBwYXJhbXMtPnJncmNbMF0gPSAqbmV3V2luZG93UmVjdDsKKyAgICBwYXJhbXMucmdyY1swXSA9ICpuZXdXaW5kb3dSZWN0OwogICAgIGlmIChjYWxjVmFsaWRSZWN0KQogICAgIHsKLQlwYXJhbXMtPnJncmNbMV0gPSAqb2xkV2luZG93UmVjdDsKLQlwYXJhbXMtPnJncmNbMl0gPSAqb2xkQ2xpZW50UmVjdDsKLQlwYXJhbXMtPmxwcG9zID0gd2lucG9zOworCXBhcmFtcy5yZ3JjWzFdID0gKm9sZFdpbmRvd1JlY3Q7CisJcGFyYW1zLnJncmNbMl0gPSAqb2xkQ2xpZW50UmVjdDsKKwlwYXJhbXMubHBwb3MgPSB3aW5wb3M7CiAgICAgfQogICAgIHJlc3VsdCA9IFNlbmRNZXNzYWdlKCBod25kLCBXTV9OQ0NBTENTSVpFLCBjYWxjVmFsaWRSZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICBVU0VSX0hFQVBfU0VHX0FERFIoaHBhcmFtcykgKTsKLSAgICAqbmV3Q2xpZW50UmVjdCA9IHBhcmFtcy0+cmdyY1swXTsKLSAgICBVU0VSX0hFQVBfRlJFRSggaHBhcmFtcyApOworICAgICAgICAgICAgICAgICAgICAgICAgICBNQUtFX1NFR1BUUiggJnBhcmFtcyApICk7CisgICAgKm5ld0NsaWVudFJlY3QgPSBwYXJhbXMucmdyY1swXTsKICAgICByZXR1cm4gcmVzdWx0OwogfQogCkBAIC03NjMsOCArNzYwLDcgQEAKIEJPT0wgU2V0V2luZG93UG9zKCBIV05EIGh3bmQsIEhXTkQgaHduZEluc2VydEFmdGVyLCBJTlQgeCwgSU5UIHksCiAJCSAgIElOVCBjeCwgSU5UIGN5LCBXT1JEIGZsYWdzICkKIHsKLSAgICBITE9DQUwgaFdpblBvczsKLSAgICBXSU5ET1dQT1MgKndpbnBvczsKKyAgICBXSU5ET1dQT1Mgd2lucG9zOwogICAgIFdORCAqd25kUHRyOwogICAgIFJFQ1QgbmV3V2luZG93UmVjdCwgbmV3Q2xpZW50UmVjdDsKICAgICBpbnQgcmVzdWx0OwpAQCAtODA1LDY3ICs4MDEsNjMgQEAKICAgICBpZiAoKGh3bmRJbnNlcnRBZnRlciAhPSBIV05EX1RPUCkgJiYgKGh3bmRJbnNlcnRBZnRlciAhPSBIV05EX0JPVFRPTSkgJiYKIAkoR2V0UGFyZW50KGh3bmQpICE9IEdldFBhcmVudChod25kSW5zZXJ0QWZ0ZXIpKSkgcmV0dXJuIEZBTFNFOwogCi0gICAgICAvKiBBbGxvY2F0ZSB0aGUgV0lORE9XUE9TIHN0cnVjdHVyZSAqLworICAgICAgLyogRmlsbCB0aGUgV0lORE9XUE9TIHN0cnVjdHVyZSAqLwogCi0gICAgaFdpblBvcyA9IFVTRVJfSEVBUF9BTExPQyggc2l6ZW9mKFdJTkRPV1BPUykgKTsKLSAgICBpZiAoIWhXaW5Qb3MpIHJldHVybiBGQUxTRTsKLSAgICB3aW5wb3MgPSBVU0VSX0hFQVBfTElOX0FERFIoIGhXaW5Qb3MgKTsKLSAgICB3aW5wb3MtPmh3bmQgPSBod25kOwotICAgIHdpbnBvcy0+aHduZEluc2VydEFmdGVyID0gaHduZEluc2VydEFmdGVyOwotICAgIHdpbnBvcy0+eCA9IHg7Ci0gICAgd2lucG9zLT55ID0geTsKLSAgICB3aW5wb3MtPmN4ID0gY3g7Ci0gICAgd2lucG9zLT5jeSA9IGN5OwotICAgIHdpbnBvcy0+ZmxhZ3MgPSBmbGFnczsKKyAgICB3aW5wb3MuaHduZCA9IGh3bmQ7CisgICAgd2lucG9zLmh3bmRJbnNlcnRBZnRlciA9IGh3bmRJbnNlcnRBZnRlcjsKKyAgICB3aW5wb3MueCA9IHg7CisgICAgd2lucG9zLnkgPSB5OworICAgIHdpbnBvcy5jeCA9IGN4OworICAgIHdpbnBvcy5jeSA9IGN5OworICAgIHdpbnBvcy5mbGFncyA9IGZsYWdzOwogICAgIAogICAgICAgLyogU2VuZCBXTV9XSU5ET1dQT1NDSEFOR0lORyBtZXNzYWdlICovCiAKICAgICBpZiAoIShmbGFncyAmIFNXUF9OT1NFTkRDSEFOR0lORykpCi0JU2VuZE1lc3NhZ2UoIGh3bmQsIFdNX1dJTkRPV1BPU0NIQU5HSU5HLCAwLAotICAgICAgICAgICAgICAgICAgICAgVVNFUl9IRUFQX1NFR19BRERSKGhXaW5Qb3MpICk7CisJU2VuZE1lc3NhZ2UoIGh3bmQsIFdNX1dJTkRPV1BPU0NIQU5HSU5HLCAwLCBNQUtFX1NFR1BUUigmd2lucG9zKSApOwogCiAgICAgICAvKiBDYWxjdWxhdGUgbmV3IHBvc2l0aW9uIGFuZCBzaXplICovCiAKICAgICBuZXdXaW5kb3dSZWN0ID0gd25kUHRyLT5yZWN0V2luZG93OwogICAgIG5ld0NsaWVudFJlY3QgPSB3bmRQdHItPnJlY3RDbGllbnQ7CiAKLSAgICBpZiAoISh3aW5wb3MtPmZsYWdzICYgU1dQX05PU0laRSkpCisgICAgaWYgKCEod2lucG9zLmZsYWdzICYgU1dQX05PU0laRSkpCiAgICAgewotICAgICAgICBuZXdXaW5kb3dSZWN0LnJpZ2h0ICA9IG5ld1dpbmRvd1JlY3QubGVmdCArIHdpbnBvcy0+Y3g7Ci0gICAgICAgIG5ld1dpbmRvd1JlY3QuYm90dG9tID0gbmV3V2luZG93UmVjdC50b3AgKyB3aW5wb3MtPmN5OworICAgICAgICBuZXdXaW5kb3dSZWN0LnJpZ2h0ICA9IG5ld1dpbmRvd1JlY3QubGVmdCArIHdpbnBvcy5jeDsKKyAgICAgICAgbmV3V2luZG93UmVjdC5ib3R0b20gPSBuZXdXaW5kb3dSZWN0LnRvcCArIHdpbnBvcy5jeTsKICAgICB9Ci0gICAgaWYgKCEod2lucG9zLT5mbGFncyAmIFNXUF9OT01PVkUpKQorICAgIGlmICghKHdpbnBvcy5mbGFncyAmIFNXUF9OT01PVkUpKQogICAgIHsKLSAgICAgICAgbmV3V2luZG93UmVjdC5sZWZ0ICAgID0gd2lucG9zLT54OwotICAgICAgICBuZXdXaW5kb3dSZWN0LnRvcCAgICAgPSB3aW5wb3MtPnk7Ci0gICAgICAgIG5ld1dpbmRvd1JlY3QucmlnaHQgICs9IHdpbnBvcy0+eCAtIHduZFB0ci0+cmVjdFdpbmRvdy5sZWZ0OwotICAgICAgICBuZXdXaW5kb3dSZWN0LmJvdHRvbSArPSB3aW5wb3MtPnkgLSB3bmRQdHItPnJlY3RXaW5kb3cudG9wOworICAgICAgICBuZXdXaW5kb3dSZWN0LmxlZnQgICAgPSB3aW5wb3MueDsKKyAgICAgICAgbmV3V2luZG93UmVjdC50b3AgICAgID0gd2lucG9zLnk7CisgICAgICAgIG5ld1dpbmRvd1JlY3QucmlnaHQgICs9IHdpbnBvcy54IC0gd25kUHRyLT5yZWN0V2luZG93LmxlZnQ7CisgICAgICAgIG5ld1dpbmRvd1JlY3QuYm90dG9tICs9IHdpbnBvcy55IC0gd25kUHRyLT5yZWN0V2luZG93LnRvcDsKICAgICB9CiAKICAgICAgIC8qIFJlcG9zaXRpb24gd2luZG93IGluIFogb3JkZXIgKi8KIAotICAgIGlmICghKHdpbnBvcy0+ZmxhZ3MgJiBTV1BfTk9aT1JERVIpKQorICAgIGlmICghKHdpbnBvcy5mbGFncyAmIFNXUF9OT1pPUkRFUikpCiAgICAgewogICAgICAgICBpZiAod25kUHRyLT53aW5kb3cpCiAgICAgICAgIHsKLSAgICAgICAgICAgIFdJTl9VbmxpbmtXaW5kb3coIHdpbnBvcy0+aHduZCApOwotICAgICAgICAgICAgV0lOX0xpbmtXaW5kb3coIHdpbnBvcy0+aHduZCwgaHduZEluc2VydEFmdGVyICk7CisgICAgICAgICAgICBXSU5fVW5saW5rV2luZG93KCB3aW5wb3MuaHduZCApOworICAgICAgICAgICAgV0lOX0xpbmtXaW5kb3coIHdpbnBvcy5od25kLCBod25kSW5zZXJ0QWZ0ZXIgKTsKICAgICAgICAgfQotICAgICAgICBlbHNlIFdJTlBPU19Nb3ZlV2luZG93Wk9yZGVyKCB3aW5wb3MtPmh3bmQsIGh3bmRJbnNlcnRBZnRlciApOworICAgICAgICBlbHNlIFdJTlBPU19Nb3ZlV2luZG93Wk9yZGVyKCB3aW5wb3MuaHduZCwgaHduZEluc2VydEFmdGVyICk7CiAgICAgfQogCiAgICAgICAvKiBTZW5kIFdNX05DQ0FMQ1NJWkUgbWVzc2FnZSB0byBnZXQgbmV3IGNsaWVudCBhcmVhICovCiAKLSAgICByZXN1bHQgPSBXSU5QT1NfU2VuZE5DQ2FsY1NpemUoIHdpbnBvcy0+aHduZCwgVFJVRSwgJm5ld1dpbmRvd1JlY3QsCisgICAgcmVzdWx0ID0gV0lOUE9TX1NlbmROQ0NhbGNTaXplKCB3aW5wb3MuaHduZCwgVFJVRSwgJm5ld1dpbmRvd1JlY3QsCiAJCQkJICAgICZ3bmRQdHItPnJlY3RXaW5kb3csICZ3bmRQdHItPnJlY3RDbGllbnQsCi0JCQkJICAgIHdpbnBvcywgJm5ld0NsaWVudFJlY3QgKTsKKwkJCQkgICAgJndpbnBvcywgJm5ld0NsaWVudFJlY3QgKTsKICAgICAvKiAuLi4uICBTaG91bGQgaGFuZGxlIHJlc3VsdCBoZXJlICovCiAKICAgICAgIC8qIFBlcmZvcm0gdGhlIG1vdmluZyBhbmQgcmVzaXppbmcgKi8KIAogICAgIGlmICh3bmRQdHItPndpbmRvdykKICAgICB7Ci0gICAgICAgIFdJTlBPU19TZXRYV2luZG93UG9zKCB3aW5wb3MgKTsKKyAgICAgICAgV0lOUE9TX1NldFhXaW5kb3dQb3MoICZ3aW5wb3MgKTsKICAgICAgICAgd25kUHRyLT5yZWN0V2luZG93ID0gbmV3V2luZG93UmVjdDsKICAgICAgICAgd25kUHRyLT5yZWN0Q2xpZW50ID0gbmV3Q2xpZW50UmVjdDsKICAgICB9CkBAIC04ODksNyArODgxLDcgQEAKICAgICAgICAgICAgIGlmICgob2xkV2luZG93UmVjdC5sZWZ0ICE9IHduZFB0ci0+cmVjdFdpbmRvdy5sZWZ0KSB8fAogICAgICAgICAgICAgICAgIChvbGRXaW5kb3dSZWN0LnRvcCAhPSB3bmRQdHItPnJlY3RXaW5kb3cudG9wKSkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBSZWRyYXdXaW5kb3coIHdpbnBvcy0+aHduZCwgTlVMTCwgMCwgUkRXX0lOVkFMSURBVEUgfAorICAgICAgICAgICAgICAgIFJlZHJhd1dpbmRvdyggd2lucG9zLmh3bmQsIE5VTEwsIDAsIFJEV19JTlZBTElEQVRFIHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJEV19GUkFNRSB8IFJEV19BTExDSElMRFJFTiB8IFJEV19FUkFTRSApOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgRGVsZXRlT2JqZWN0KCBocmduMSApOwpAQCAtOTA4LDcgKzkwMCw3IEBACiAgICAgICAgIGVsc2UKICAgICAgICAgewogICAgICAgICAgICAgaWYgKCEoZmxhZ3MgJiBTV1BfTk9SRURSQVcpKQotICAgICAgICAgICAgICAgIFJlZHJhd1dpbmRvdyggd2lucG9zLT5od25kLCBOVUxMLCAwLAorICAgICAgICAgICAgICAgIFJlZHJhd1dpbmRvdyggd2lucG9zLmh3bmQsIE5VTEwsIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRFdfSU5WQUxJREFURSB8IFJEV19GUkFNRSB8IFJEV19FUkFTRSApOwogICAgICAgICB9CiAgICAgfQpAQCAtOTI2LDE2ICs5MTgsMTYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJEV19JTlZBTElEQVRFIHwgUkRXX0ZSQU1FIHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJEV19BTExDSElMRFJFTiB8IFJEV19FUkFTRSApOwogICAgICAgICB9Ci0gICAgICAgIGlmICgod2lucG9zLT5od25kID09IEdldEZvY3VzKCkpIHx8IElzQ2hpbGQod2lucG9zLT5od25kLCBHZXRGb2N1cygpKSkKLSAgICAgICAgICAgIFNldEZvY3VzKCBHZXRQYXJlbnQod2lucG9zLT5od25kKSApOyAgLyogUmV2ZXJ0IGZvY3VzIHRvIHBhcmVudCAqLwotCWlmICh3aW5wb3MtPmh3bmQgPT0gaHduZEFjdGl2ZSkKKyAgICAgICAgaWYgKCh3aW5wb3MuaHduZCA9PSBHZXRGb2N1cygpKSB8fCBJc0NoaWxkKHdpbnBvcy5od25kLCBHZXRGb2N1cygpKSkKKyAgICAgICAgICAgIFNldEZvY3VzKCBHZXRQYXJlbnQod2lucG9zLmh3bmQpICk7ICAvKiBSZXZlcnQgZm9jdXMgdG8gcGFyZW50ICovCisJaWYgKHdpbnBvcy5od25kID09IGh3bmRBY3RpdmUpCiAJewogCSAgICAgIC8qIEFjdGl2YXRlIHByZXZpb3VzbHkgYWN0aXZlIHdpbmRvdyBpZiBwb3NzaWJsZSAqLwogCSAgICBIV05EIG5ld0FjdGl2ZSA9IHduZFB0ci0+aHduZFByZXZBY3RpdmU7Ci0JICAgIGlmICghSXNXaW5kb3cobmV3QWN0aXZlKSB8fCAobmV3QWN0aXZlID09IHdpbnBvcy0+aHduZCkpCisJICAgIGlmICghSXNXaW5kb3cobmV3QWN0aXZlKSB8fCAobmV3QWN0aXZlID09IHdpbnBvcy5od25kKSkKIAkgICAgewogCQluZXdBY3RpdmUgPSBHZXRUb3BXaW5kb3coR2V0RGVza3RvcFdpbmRvdygpKTsKLQkJaWYgKG5ld0FjdGl2ZSA9PSB3aW5wb3MtPmh3bmQpIG5ld0FjdGl2ZSA9IHduZFB0ci0+aHduZE5leHQ7CisJCWlmIChuZXdBY3RpdmUgPT0gd2lucG9zLmh3bmQpIG5ld0FjdGl2ZSA9IHduZFB0ci0+aHduZE5leHQ7CiAJICAgIH0JICAgIAogCSAgICBXSU5QT1NfQ2hhbmdlQWN0aXZlV2luZG93KCBuZXdBY3RpdmUsIEZBTFNFICk7CiAJfQpAQCAtOTQ2LDE0ICs5MzgsMTQgQEAKICAgICBpZiAoIShmbGFncyAmIFNXUF9OT0FDVElWQVRFKSkKICAgICB7CiAJaWYgKCEod25kUHRyLT5kd1N0eWxlICYgV1NfQ0hJTEQpKQotCSAgICBXSU5QT1NfQ2hhbmdlQWN0aXZlV2luZG93KCB3aW5wb3MtPmh3bmQsIEZBTFNFICk7CisJICAgIFdJTlBPU19DaGFuZ2VBY3RpdmVXaW5kb3coIHdpbnBvcy5od25kLCBGQUxTRSApOwogICAgIH0KICAgICAKICAgICAgIC8qIFJlcGFpbnQgdGhlIHdpbmRvdyAqLwogCiAgICAgaWYgKHduZFB0ci0+d2luZG93KSBNU0dfU3luY2hyb25pemUoKTsgIC8qIFdhaXQgZm9yIGFsbCBleHBvc2UgZXZlbnRzICovCiAgICAgaWYgKChmbGFncyAmIFNXUF9GUkFNRUNIQU5HRUQpICYmICEoZmxhZ3MgJiBTV1BfTk9SRURSQVcpKQotICAgICAgICBSZWRyYXdXaW5kb3coIHdpbnBvcy0+aHduZCwgTlVMTCwgMCwKKyAgICAgICAgUmVkcmF3V2luZG93KCB3aW5wb3MuaHduZCwgTlVMTCwgMCwKICAgICAgICAgICAgICAgICAgICAgICBSRFdfSU5WQUxJREFURSB8IFJEV19GUkFNRSB8IFJEV19FUkFTRSApOwogICAgIGlmICghKGZsYWdzICYgU1dQX0RFRkVSRVJBU0UpKQogICAgICAgICBSZWRyYXdXaW5kb3coIHduZFB0ci0+aHduZFBhcmVudCwgTlVMTCwgMCwKQEAgLTk2MSwxMSArOTUzLDEwIEBACiAKICAgICAgIC8qIEFuZCBsYXN0LCBzZW5kIHRoZSBXTV9XSU5ET1dQT1NDSEFOR0VEIG1lc3NhZ2UgKi8KIAotICAgIGlmICghKHdpbnBvcy0+ZmxhZ3MgJiBTV1BfTk9TRU5EQ0hBTkdJTkcpKQotICAgICAgICBTZW5kTWVzc2FnZSggd2lucG9zLT5od25kLCBXTV9XSU5ET1dQT1NDSEFOR0VELCAwLAotICAgICAgICAgICAgICAgICAgICAgVVNFUl9IRUFQX1NFR19BRERSKGhXaW5Qb3MpICk7CisgICAgaWYgKCEod2lucG9zLmZsYWdzICYgU1dQX05PU0VORENIQU5HSU5HKSkKKyAgICAgICAgU2VuZE1lc3NhZ2UoIHdpbnBvcy5od25kLCBXTV9XSU5ET1dQT1NDSEFOR0VELAorICAgICAgICAgICAgICAgICAgICAgMCwgTUFLRV9TRUdQVFIoJndpbnBvcykgKTsKIAotICAgIFVTRVJfSEVBUF9GUkVFKCBoV2luUG9zICk7CiAgICAgcmV0dXJuIFRSVUU7CiB9CiAKZGlmZiAtLWdpdCBhL3dpbmUuaW5pIGIvd2luZS5pbmkKaW5kZXggYjkxMzliOC4uNmFkODFkMCAxMDA2NDQKLS0tIGEvd2luZS5pbmkKKysrIGIvd2luZS5pbmkKQEAgLTExLDYgKzExLDcgQEAKIFN5c3RlbT1jOlx3aW5kb3dzXHN5c3RlbQ0KIFRlbXA9YzpcdGVtcA0KIFBhdGg9Yzpcd2luZG93cztjOlx3aW5kb3dzXHN5c3RlbTtlOlw7ZTpcdGVzdDtmOlwNCitTeW1ib2xUYWJsZUZpbGU9Li93aW5lLnN5bQ0KIA0KIFtmb250c10NCiBzeXN0ZW09Yml0c3RyZWFtLWNvdXJpZXINCg==