ZGlmZiAtLWdpdCBhL0FOTk9VTkNFIGIvQU5OT1VOQ0UKaW5kZXggM2YyYzM1OS4uYWJhNDdkNCAxMDA2NDQKLS0tIGEvQU5OT1VOQ0UKKysrIGIvQU5OT1VOQ0UKQEAgLTEsMTYgKzEsMTMgQEAKLVRoaXMgaXMgcmVsZWFzZSA5NzEyMjEgb2YgV2luZSwgdGhlIE1TIFdpbmRvd3MgZW11bGF0b3IuICBUaGlzIGlzIHN0aWxsIGEKK1RoaXMgaXMgcmVsZWFzZSA5ODAxMDQgb2YgV2luZSwgdGhlIE1TIFdpbmRvd3MgZW11bGF0b3IuICBUaGlzIGlzIHN0aWxsIGEKIGRldmVsb3BlcidzIG9ubHkgcmVsZWFzZS4gIFRoZXJlIGFyZSBtYW55IGJ1Z3MgYW5kIG1hbnkgdW5pbXBsZW1lbnRlZCBBUEkKIGZlYXR1cmVzLiAgTW9zdCBhcHBsaWNhdGlvbnMgc3RpbGwgZG8gbm90IHdvcmsgY29ycmVjdGx5LgogCiBQYXRjaGVzIHNob3VsZCBiZSBzdWJtaXR0ZWQgdG8gImp1bGxpYXJkQGxyYy5lcGZsLmNoIi4gIFBsZWFzZSBkb24ndAogZm9yZ2V0IHRvIGluY2x1ZGUgYSBDaGFuZ2VMb2cgZW50cnkuCiAKLVdIQVQnUyBORVcgd2l0aCBXaW5lLTk3MTIyMTogKHNlZSBDaGFuZ2VMb2cgZm9yIGRldGFpbHMpCi0JLSBQcmVsaW1pbmFyeSBHREkgcGF0aHMgc3VwcG9ydC4KLQktIERyYXdGcmFtZUNvbnRyb2wgaW1wbGVtZW50YXRpb24uCi0JLSBNdWx0aW1lZGlhIHN1cHBvcnQgZm9yIHRpbWUgYW5kIGpveXN0aWNrIGZ1bmN0aW9ucy4KLQktIFdpbjMyIHNwZWMgZmlsZXMgbm93IGdlbmVyYXRlIEMgY29kZSBmb3IgV2luZWxpYi4KLQktIFRvbnMgb2YgbmV3IFdpbjMyIGZ1bmN0aW9ucyBhbmQgc3R1YnMuCitXSEFUJ1MgTkVXIHdpdGggV2luZS05ODAxMDQ6IChzZWUgQ2hhbmdlTG9nIGZvciBkZXRhaWxzKQorCS0gQmVnaW5uaW5ncyBvZiBEaXJlY3REcmF3L0RpcmVjdFNvdW5kIHN1cHBvcnQuCisJLSBQcmVsaW1pbmFyeSB0aHJlYWRpbmcgc3VwcG9ydCBiYXNlZCBvbiBjbG9uZSgpLgogCS0gTG90cyBvZiBidWcgZml4ZXMuCiAKIFNlZSB0aGUgUkVBRE1FIGZpbGUgaW4gdGhlIGRpc3RyaWJ1dGlvbiBmb3IgaW5zdGFsbGF0aW9uIGluc3RydWN0aW9ucy4KQEAgLTE5LDEwICsxNiwxMCBAQAogdGhlIHJlbGVhc2UgaXMgYXZhaWxhYmxlIGF0IHRoZSBmdHAgc2l0ZXMuICBUaGUgc291cmNlcyB3aWxsIGJlIGF2YWlsYWJsZQogZnJvbSB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczoKIAotICBmdHA6Ly9zdW5zaXRlLnVuYy5lZHUvcHViL0xpbnV4L0FMUEhBL3dpbmUvZGV2ZWxvcG1lbnQvV2luZS05NzEyMjEudGFyLmd6Ci0gIGZ0cDovL3RzeC0xMS5taXQuZWR1L3B1Yi9saW51eC9BTFBIQS9XaW5lL2RldmVsb3BtZW50L1dpbmUtOTcxMjIxLnRhci5negotICBmdHA6Ly9mdHAuaW5mb21hZ2ljLmNvbS9wdWIvbWlycm9ycy9saW51eC93aW5lL2RldmVsb3BtZW50L1dpbmUtOTcxMjIxLnRhci5negotICBmdHA6Ly9mdHAucHJvZ3NvYy51dHMuZWR1LmF1L3B1Yi9XaW5lL2RldmVsb3BtZW50L1dpbmUtOTcxMjIxLnRhci5negorICBmdHA6Ly9zdW5zaXRlLnVuYy5lZHUvcHViL0xpbnV4L0FMUEhBL3dpbmUvZGV2ZWxvcG1lbnQvV2luZS05ODAxMDQudGFyLmd6CisgIGZ0cDovL3RzeC0xMS5taXQuZWR1L3B1Yi9saW51eC9BTFBIQS9XaW5lL2RldmVsb3BtZW50L1dpbmUtOTgwMTA0LnRhci5negorICBmdHA6Ly9mdHAuaW5mb21hZ2ljLmNvbS9wdWIvbWlycm9ycy9saW51eC93aW5lL2RldmVsb3BtZW50L1dpbmUtOTgwMTA0LnRhci5negorICBmdHA6Ly9mdHAucHJvZ3NvYy51dHMuZWR1LmF1L3B1Yi9XaW5lL2RldmVsb3BtZW50L1dpbmUtOTgwMTA0LnRhci5negogCiBJdCBzaG91bGQgYWxzbyBiZSBhdmFpbGFibGUgZnJvbSBhbnkgc2l0ZSB0aGF0IG1pcnJvcnMgdHN4LTExIG9yIHN1bnNpdGUuCiAKZGlmZiAtLWdpdCBhL0NoYW5nZUxvZyBiL0NoYW5nZUxvZwppbmRleCBhYWQ2NDdkLi41N2U2ZmIyIDEwMDY0NAotLS0gYS9DaGFuZ2VMb2cKKysrIGIvQ2hhbmdlTG9nCkBAIC0xLDQgKzEsMTU1IEBACiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTYXQgSmFuICAzIDE3OjE1OjU2IDE5OTggIEFsZXhhbmRyZSBKdWxsaWFyZCAgPGp1bGxpYXJkQGxyYy5lcGZsLmNoPgorCisJKiBbZGVidWdnZXIvZGJfZGlzYXNtLmNdCisJQWRkZWQgY3B1aWQgYW5kIGNtcHhjaGcgaW5zdHJ1Y3Rpb25zLgorCisJKiBbaWYxNjMyL2J1aWx0aW4uY10gW3JlbGF5MzIvYnVpbHRpbjMyLmNdCisJRml4ZWQgYnJva2VuIC1kbGwgb3B0aW9uIHdpdGggV2luMzIgRExMcy4KKworCSogW2luY2x1ZGUvaGVhcC5oXQorCUFkZGVkIFNZU1RFTV9MT0NLL1NZU1RFTV9VTkxPQ0sgbWFjcm9zLgorCisJKiBbY29uZmlndXJlLmluXSBbbWlzYy9sc3RyLmNdCisJQWRkZWQgY2hlY2sgZm9yIHdjdHlwZS5oLgorCUNvbW1lbnRlZCBvdXQgLS1lbmFibGUtaXBjIG9wdGlvbiAoSVBDIGNvZGUgaGFzIGJlZW4gYnJva2VuIGZvciBhCisJbG9uZyB0aW1lIGFueXdheSkuCisKKwkqIFtzY2hlZHVsZXIvY3JpdHNlY3Rpb24uY10gW3NjaGVkdWxlci9ldmVudC5jXQorCSAgW3NjaGVkdWxlci9tdXRleC5jXSBbc2NoZWR1bGVyL3NlbWFwaG9yZS5jXQorCUltcGxlbWVudGVkIFdpbjMyIHN5bmNocm9uaXphdGlvbiBvYmplY3RzLgorCisJKiBbc2NoZWR1bGVyL3N5bmNocm8uY10KKwlJbXBsZW1lbnRlZCBXYWl0Rm9yTXVsdGlwbGVPYmplY3RzIGFuZCByZWxhdGVkIGZ1bmN0aW9ucy4KKworCSogW3NjaGVkdWxlci90aHJlYWQuY10KKwlJZiBwb3NzaWJsZSwgdXNlIGNsb25lKCkgaW4gQ3JlYXRlVGhyZWFkKCkuCisKKwkqIFtzY2hlZHVsZXIvdGhyZWFkLmNdIFtzY2hlZHVsZXIvcHJvY2Vzcy5jXQorCU1hZGUgdGhyZWFkIGFuZCBwcm9jZXNzIHdhaXRhYmxlIG9iamVjdHMuCisJVGhyZWFkIGFuZCBwcm9jZXNzIGlkIHZhbHVlcyBhcmUgbm93IGRpZmZlcmVudCBmcm9tIHRoZSBwb2ludGVycworCXRoZXkgcmVwcmVzZW50LgorCisJKiBbd2luMzIvazMyb2JqLmNdCisJTW92ZWQgdG8gc2NoZWR1bGVyIGRpcmVjdG9yeS4KKwlBZGRlZCBmdW5jdGlvbiB0YWJsZSBmb3Igd2FpdGluZyBvcGVyYXRpb25zIG9uIG9iamVjdHMuCisKKwkqIFtmaWxlcy9maWxlLmNdIFttZW1vcnkvdmlydHVhbC5jXQorCUFkZGVkIG5ldyBLMzJPQkogZnVuY3Rpb24gdGFibGUuCisKK1N1biBKYW4gIDEgMTY6NDg6MjMgMTk5NyAgQW5kcmVhcyBNb2hyIDwxMDAuMzA5MzZAZ2VybWFueS5uZXQ+CisKKwkqIFtmaWxlcy9maWxlLmNdCisJRml4ZWQgbXkgcGF0Y2ggZm9yIEdldFRlbXBGaWxlTmFtZTE2KCkgYXMgbmVlZGVkLgorCUl0IHdhcyAuLi5OYW1lMzJBKCkgdGhhdCBkaWRuJ3Qgd29yayBwcm9wZXJseSwgbm90IC4uLk5hbWUxNigpLgorCisJKiBbZ3JhcGhpY3MveDExZHJ2L2JydXNoLmNdCisJRml4ZWQgYSBCYWRNYXRjaCBlcnJvci4KKworCSogW21zZG9zL2ludDIxLmNdCisJRml4ZWQgSU5UMjFfRmluZE5leHRGQ0IoKSB0byBnZXQgY29ycmVjdCB2b2x1bWUgbGFiZWxzIGUuZy4KKwlpbiAiZmlsZSBvcGVuIiBkaWFsb2cuCisKKwkqIFttdWx0aW1lZGlhL2pveXN0aWNrLmNdIFtyZWxheTMyL3dpbm1tLnNwZWNdCisJU3R1YiBKb3lHZXRQb3NFeCgpLgorCisJKiBbc2NoZWR1bGVyL3Byb2Nlc3MuY10gW3JlbGF5MzIva2VybmVsMzIuc3BlY10KKwlJbXBsZW1lbnRlZCBSZWdpc3RlclNlcnZpY2VQcm9jZXNzKCkuCisKK1dlZCBEZWMgMzEgMTE6MTQ6NDMgMTk5NyAgTGF3c29uIFdoaXRuZXkgIDxsYXdzb25fd2hpdG5leUBqdW5vLmNvbT4KKworCSogW2lmMTYzMi9rZXJuZWwuc3BlY10gW2lmMTYzMi9yZWxheS5jXQorCURlZmluZSBDYWxsUHJvY0V4MzJ3IC0gVGhhbmtzIHRvIE1hcmN1cyBNZWlzc25lciBmb3IgaGlzIGV4Y2VsbGVudAorCUNhbGxQcm9jMzJXLgorCisJKiBbbG9hZGVyL21vZHVsZS5jXQorCVRha2UgYSBzaG90IGF0IGRlZmluaW5nIEZyZWVMaWJyYXJ5MzJXLgorCitTdW4gRGVjIDI4IDEyOjQ0OjA0IDE5OTcgIEthaSBNb3JpY2ggPGthaS5tb3JpY2hAcmhlaW4tbmVja2FyLm5ldHN1cmYuZGU+CisKKwkqIFtjb250cm9scy9tZW51LmNdCisJTWVudSBtb2RpZmljYXRpb24gZnJvbSBXTV9JTklUTUVOVVBPUFVQIG1lc3NhZ2UgZml4ZWQuCisJTWVudSBpdGVtcyBub3cgY2FuIGhhdmUgZGlmZmVyZW50IHdJRCBhbmQgaFN1Yk1lbnUgKFdpbjk1IGJlaGF2aW9yKS4KKworCSogW21pc2MvY3B1LmNdCisJSW1wcm92ZWQgSXNQcm9jZXNzb3JGZWF0dXJlUHJlc2VudC4KKworU3VuIERlYyAyOCAwMzoyMTowOCAxOTk3ICBPdmUgS2FhdmVuIDxvdmVrQG1haW4uYXJjdGljbmV0Lm5vPgorCisJKiBbaW5jbHVkZS93aW5zb2NrLmhdIFttaXNjL3dpbnNvY2suY10KKwlGaXhlZCBXU19TT0xfU09DS0VUIGZvciBzZXRzb2Nrb3B0KCksIGFuZCBtYWRlIHNlbGVjdCgpIHJldHVybgorCWVtcHR5IGZkX3NldHMgaWYgdGltZW91dC4KKworCSogW29iamVjdHMvcGFsZXR0ZS5jXQorCUFuaW1hdGVQYWxldHRlKCkgYmFpbGVkIG91dCBpZiBlbnRpcmUgcGFsZXR0ZSBpcyBhbmltYXRlZC4gRml4ZWQuCisKKwkqIFtvYmplY3RzL2RpYi5jXQorCUFkZGVkIHNvbWUgY29kZSB0byBTZXRESUJpdHNUb0RldmljZSgpIGFuZCBpdHMgaGVscGVycyB0byBmaXgKKwlzb21lIG9mZnNldGluZyBwcm9ibGVtcy4KKworCSogW29iamVjdHMvY3Vyc29yaWNvbi5jXQorCU1hZGUgQ3JlYXRlQ3Vyc29yMzIoKSBjb252ZXJ0IHRoZSBpbnN0YW5jZSBoYW5kbGUgcHJvcGVybHkuIE1hZGUKKwlEZXN0cm95Q3Vyc29yKCkgcmV0dXJuIGNvcnJlY3Qgc3VjY2VzcyBzdGF0dXMuCisKK1dlZCBEZWMgMjQgMTc6NTY6MzQgMTk5NyAgRGltaXRyaWUgTy4gUGF1biAgPGRpbWlAY3MudG9yb250by5lZHU+CisKKwkqIFt3aW5kb3dzL3N5c2NvbG9yLmNdCisJQWRkZWQgZGVmaW5pdGlvbiBvZiBHZXRTeXNDb2xvclBlbjE2LzMyLiBUaGlzIGZ1bmN0aW9uIGRvZXMgbm90CisJZXhpc3QgaW4gdGhlIFdpbjMyIEFQSSBidXQgaXMgYSB2ZXJ5IGNsb3NlIChhbmQgbmF0dXJhbCkgcmVsYXRpdmUKKwl0byBHZXRTeXNDb2xvckJydXNoIGZ1bmN0aW9uLiBNb3Jlb3ZlciwgaXQgaXMgKnZlcnkqIG11Y2ggdXNlZCAKKwl3aXRoaW4gV2luZSBzaW5jZSB0aGVyZSBhcmUgYSBsb3Qgb2YgcGxhY2VzIHdoZXJlIHdlIG5lZWQgdG8gZHJhdworCWxpbmVzIHdpdGggdGhlIHN0YW5kYXJkIGNvbG9ycy4KKworCSogW2NvbnRyb2xzL2J1dHRvbi5jXSBbY29udHJvbHMvY29tYm8uY10gW2NvbnRyb2xzL2ljb250aXRsZS5jXQorCSAgW2NvbnRyb2xzL21lbnUuY10gW2NvbnRyb2xzL3Byb2dyZXNzLmNdIFtjb250cm9scy9zY3JvbGwuY10KKwkgIFtjb250cm9scy91cGRvd24uY10gW2dyYXBoaWNzL3BhaW50aW5nLmNdIFttaXNjL3R3ZWFrLmNdCisJICBbd2luZG93cy9kZWZ3bmQuY10gW3dpbmRvd3MvZ3JhcGhpY3MuY10gW3dpbmRvd3Mvbm9uY2xpZW50LmNdCisJUmVwbGFjZWQgcmVmZXJlbmNlcyB0byBzeXNDb2xvck9iamVjdHMgd2l0aCB0aGUgYXBwcm9wcmlhdGUKKwljYWxsIHRvIEdldFN5c0NvbG9yQnJ1c2gzMi9HZXRTeXNDb2xvclBlbjMyLiBUaGVyZSBpcyBubyBuZWVkIHRvCisJZXhwb3NlIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGVzZSBmdW5jdGlvbnMsIGV2ZW4gd2l0aGluIFdpbmUuCisJVGhpcyBtYWtlcyB0aGUgY29kZSBlYXNpZXIgdG8gdW5kZXJzdGFuZCwgZGVidWcsIG1haW50YWluLgorCisJKiBbY29udHJvbHMvdWl0b29scy5jXQorCU1vZGlmaWVkIG1vc3Qgb2YgdGhlIGZ1bmN0aW9ucyBpbiB0aGlzIGZpbGUgdG8gdXNlIHRoZSBub3cKKwlzdGFuZGFyZCBwZW5zIChpLmUuIEdldFN5c0NvbG9yUGVuMzIpLiBUaGVzZSBmdW5jdGlvbnMgbWFkZQorCSpoZWF2eSogdXNlIG9mIHN0YW5kYXJkIHBlbnMgc28gSSBleHBlY3QgYSBsb3QgbGVzcworCUNyZWF0ZVBlbi9EZWxldGVPYmplY3QgY2FsbHMgY2FuIGRvIG9ubHkgZ29vZC4uLjopCisJUGx1cyBzb21lIG1pbm9yIG1vZGlmaWNhdGlvbnMgKCpubyogZnVuY3Rpb25hbCBjaGFuZ2VzIHRob3VnaCkuCisKKwkqIFtjb250cm9scy91cGRvd24uY10KKwlVc2VkIHRoZSBuZXcgRHJhd0ZyYW1lQ29udHJvbDMyIGZ1bmN0aW9uIHRvIHBhaW50IHRoZSBjb250cm9sLgorCUkgYWxzbyBkZWxldGVkIFVERE9XTl9EcmF3QXJyb3cgc2luY2UgaXQgd2FzIG5vIGxvbmdlciByZXF1aXJlZC4KKworVHVlIERlYyAyMyAwMDowMzozMyAxOTk3ICBTdGVpbmFyIEhhbXJlICA8c3RlaW5hcmhAc3R1ZC5maW0ubnRudS5ubz4KKworCSogW2NvbmZpZ3VyZS5pbl0KKwlBZGRlZCBjaGVjayBmb3IgLWx3LgorCisJKiBbaW5jbHVkZS93aW50eXBlcy5oXSBbdG9vbHMvYnVpbGQuY10KKwlDaGFuZ2VzIHRvIG1ha2UgdGhlIGFzc2VtYmx5IHVuZGVyc3RhbmRhYmxlIGZvciBldmVuIHN1biBhcy4KKwkiLmFzY2lpIiAtPiAiLnN0cmluZyIsICJjYWxsICVmb28iIC0+ICJjYWxsIColZm9vIiwKKwkicHVzaHcvcG9wdyAlW2NkZXNdcyIgd3JpdHRlbiBvdXQgdG8gIi5ieXRlIDB4NjZcbnB1c2hsL3BvcGwgJVtjZGVzXXMiLgorCisJKiBbbWVtb3J5L2xkdC5jXQorCSNpZmRlZiBhZGRlZCBzbyA8c3lzL3NlZy5oPiB3aWxsIG5vdCBiZSBpbmNsdWRlZCBvbiBTb2xhcmlzLgorCitNb24gRGVjIDIyIDE4OjU1OjE5IDE5OTcgIE1hcmN1cyBNZWlzc25lciA8bXNtZWlzc25AY2lwLmluZm9ybWF0aWsudW5pLWVybGFuZ2VuLmRlPgorCisJKiBbY29uZmlndXJlLmluXQorCUFkZGVkIFhGODZER0EgY2hlY2suCisKKwkqIFttdWx0aW1lZGlhL2Rzb3VuZC5jXVtyZWxheTMyL2Rzb3VuZC5zcGVjXVtpbmNsdWRlL2Rzb3VuZC5oXQorCVN0YXJ0ZWQgRGlyZWN0U291bmQuIE9ubHkgc3R1YnMgZm9yIG5vdy4KKworCSogW2dyYXBoaWNzL2RkcmF3LmNdW2luY2x1ZGUvZGRyYXcuaF1bcmVsYXkzMi9kZHJhdy5zcGVjXQorCVN0YXJ0ZWQgdG8gaW1wbGVtZW50IERpcmVjdERyYXcuIE1vc3RseSBzdHVicywgc29tZQorCXRlc3RjYXNlcyB3b3JrLiBSZXF1aXJlcyB0aGUgWEY4NkRHQSBleHRlbnNpb24gdG8gWEZyZWU4Ni4KKwkoY2hlY2sgZGVtby9ibGl6ZGVtby5leGUgZnJvbSB0aGUgRGlhYmxvIENELVJPTSkuCisKKwkqIFtmaWxlcy9kcml2ZS5jXQorCVJldHVybiBjb3JyZWN0ICJDREZTIiBmc25hbWUgc28gRGlhYmxvIGlzIGEgYml0IGhhcHBpZXIuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIEZyaSBEZWMgMTkgMTA6NTA6NDYgMTk5NyAgRG91Z2xhcyBSaWRnd2F5ICA8cmlkZ3dheUB3aW5laHEuY29tPgogCiAJKiBbTWFrZS5ydWxlcy5pbl0gW01ha2VmaWxlLmluXSBbZG9jdW1lbnRhdGlvbi9NYWtlZmlsZS5pbl0KZGlmZiAtLWdpdCBhL01ha2UucnVsZXMuaW4gYi9NYWtlLnJ1bGVzLmluCmluZGV4IDdiMWU3ZDcuLjVjYzM1YjcgMTAwNjQ0Ci0tLSBhL01ha2UucnVsZXMuaW4KKysrIGIvTWFrZS5ydWxlcy5pbgpAQCAtMjQsNyArMjQsNyBAQAogWFBNX0xJQiAgID0gLWxYcG0KIFhMSUIgICAgICA9IEBYX1BSRV9MSUJTQCAtbFhleHQgLWxYMTEgQFhfRVhUUkFfTElCU0AKIFdJTkVMSUIgICA9ICQoV0lORVNUVUIpICQoVE9QT0JKRElSKS9ATElCX1RBUkdFVEAKLUxETElCUyAgICA9IEBMRExJQlNACitMSUJTICAgICAgPSBATElCU0AKIFlBQ0MgICAgICA9IEBZQUNDQAogTEVYICAgICAgID0gQExFWEAKIExFWExJQiAgICA9IEBMRVhMSUJACmRpZmYgLS1naXQgYS9NYWtlZmlsZS5pbiBiL01ha2VmaWxlLmluCmluZGV4IGMzNGMzYjYuLmU2ZGIzMWUgMTAwNjQ0Ci0tLSBhL01ha2VmaWxlLmluCisrKyBiL01ha2VmaWxlLmluCkBAIC0xMDYsNyArMTA2LDcgQEAKIGxpYjogJChMSUJTVUJESVJTKSAkKExJQl9UQVJHRVQpCiAKIHdpbmUgd2luZS5zeW06ICQoTElCU1VCRElSUykgJChMSUJfVEFSR0VUKSAkKEVNVVNVQkRJUlMpIGR1bW15Ci0JJChDQykgLW8gd2luZSAkKEVNVU9CSlMpICQoTElCX1RBUkdFVCkgJChMRE9QVElPTlMpICQoWF9MSUJTKSAkKFhQTV9MSUIpICQoWExJQikgJChMRExJQlMpCisJJChDQykgLW8gd2luZSAkKEVNVU9CSlMpICQoTElCX1RBUkdFVCkgJChMRE9QVElPTlMpICQoWF9MSUJTKSAkKFhQTV9MSUIpICQoWExJQikgJChMSUJTKQogCW5tIC1uIHdpbmUgfCBncmVwIC12IF9jb21waWxlZCA+d2luZS5zeW0KIAogbGlid2luZS5hOiAkKExJQk9CSlMpCkBAIC0xMTUsNyArMTE1LDcgQEAKIAkkKFJBTkxJQikgJEAKIAogbGlid2luZS5zby4xLjA6ICQoTElCT0JKUykKLQkkKENDKSAtc2hhcmVkIC1XbCwtc29uYW1lLGxpYndpbmUuc28gLW8kQCAkKExJQk9CSlMpICQoTERPUFRJT05TKSAkKFhfTElCUykgJChYUE1fTElCKSAkKFhMSUIpICQoTERMSUJTKQorCSQoQ0MpIC1zaGFyZWQgLVdsLC1zb25hbWUsbGlid2luZS5zbyAtbyRAICQoTElCT0JKUykgJChMRE9QVElPTlMpICQoWF9MSUJTKSAkKFhQTV9MSUIpICQoWExJQikgJChMSUJTKQogCiBpbnN0YWxsX2VtdTogZHVtbXkKIAkkKElOU1RBTExfUFJPR1JBTSkgd2luZSAkKGJpbmRpcikvd2luZQpkaWZmIC0tZ2l0IGEvY29uZmlndXJlIGIvY29uZmlndXJlCmluZGV4IDEwMzJmZjIuLjIwNDE3YzYgMTAwNzU1Ci0tLSBhL2NvbmZpZ3VyZQorKysgYi9jb25maWd1cmUKQEAgLTE3LDggKzE3LDYgQEAKIGFjX2hlbHA9IiRhY19oZWxwCiAgIC0tZW5hYmxlLWRsbCAgICAgICAgICAgIGJ1aWxkIHRoZSBXaW5lIGxpYnJhcnkgYXMgYSBETEwiCiBhY19oZWxwPSIkYWNfaGVscAotICAtLWVuYWJsZS1pcGMgICAgICAgICAgICB1c2UgaW50ZXItcHJvY2VzcyBjb21tdW5pY2F0aW9uIGZvciBEREUiCi1hY19oZWxwPSIkYWNfaGVscAogICAtLXdpdGgteCAgICAgICAgICAgICAgICB1c2UgdGhlIFggV2luZG93IFN5c3RlbSIKIAogIyBJbml0aWFsaXplIHNvbWUgdmFyaWFibGVzIHNldCBieSBvcHRpb25zLgpAQCAtNTQ5LDcgKzU0Nyw3IEBACiAKIAogIyBXZSB3YW50IHRoZXNlIGJlZm9yZSB0aGUgY2hlY2tzLCBzbyB0aGUgY2hlY2tzIGNhbiBtb2RpZnkgdGhlaXIgdmFsdWVzLgotdGVzdCAteiAiJExETElCUyIgJiYgTERMSUJTPS1sbSAKK0xJQlM9IiRMSUJTIC1sbSIKIHRlc3QgLXogIiRQUk9HRVhUIiAmJiBQUk9HRVhUPSIiIAogCiAKQEAgLTU3MCwxMiArNTY4LDYgQEAKIGZpCiAKIAotIyBDaGVjayB3aGV0aGVyIC0td2l0aC1pcGMgb3IgLS13aXRob3V0LWlwYyB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke3dpdGhfaXBjK3NldH0iID0gc2V0OyB0aGVuCi0gIHdpdGh2YWw9IiR3aXRoX2lwYyIKLSAgaWYgdGVzdCAiJGVuYWJsZXZhbCIgPSAibm8iOyB0aGVuIDogOyBlbHNlIE9QVElPTlM9Ii1EQ09ORklHX0lQQyI7IGZpCi1maQotCiAKIAogCkBAIC01ODMsNyArNTc1LDcgQEAKIAogCiBlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyICR7TUFLRS1tYWtlfSBzZXRzIFwke01BS0V9IiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo1ODc6IGNoZWNraW5nIHdoZXRoZXIgJHtNQUtFLW1ha2V9IHNldHMgXCR7TUFLRX0iID4mNQorZWNobyAiY29uZmlndXJlOjU3OTogY2hlY2tpbmcgd2hldGhlciAke01BS0UtbWFrZX0gc2V0cyBcJHtNQUtFfSIgPiY1CiBzZXQgZHVtbXkgJHtNQUtFLW1ha2V9OyBhY19tYWtlPWBlY2hvICIkMiIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCiBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19tYWtlXyR7YWNfbWFrZX1fc2V0JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKQEAgLTYxMiw3ICs2MDQsNyBAQAogIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJnY2MiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgogc2V0IGR1bW15IGdjYzsgYWNfd29yZD0kMgogZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo2MTY6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitlY2hvICJjb25maWd1cmU6NjA4OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQogaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfQ0MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgogICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgogZWxzZQpAQCAtNjQxLDcgKzYzMyw3IEBACiAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiY2MiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgogc2V0IGR1bW15IGNjOyBhY193b3JkPSQyCiBlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjY0NTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKK2VjaG8gImNvbmZpZ3VyZTo2Mzc6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19DQycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCiAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CiBlbHNlCkBAIC02ODksNyArNjgxLDcgQEAKIGZpCiAKIGVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRMREZMQUdTKSB3b3JrcyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NjkzOiBjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgd29ya3MiID4mNQorZWNobyAiY29uZmlndXJlOjY4NTogY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIHdvcmtzIiA+JjUKIAogYWNfZXh0PWMKICMgQ0ZMQUdTIGlzIG5vdCBpbiBhY19jcHAgYmVjYXVzZSAtZywgLU8sIGV0Yy4gYXJlIG5vdCB2YWxpZCBjcHAgb3B0aW9ucy4KQEAgLTY5OSwxMSArNjkxLDExIEBACiBjcm9zc19jb21waWxpbmc9JGFjX2N2X3Byb2dfY2NfY3Jvc3MKIAogY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNzAzICJjb25maWd1cmUiCisjbGluZSA2OTUgImNvbmZpZ3VyZSIKICNpbmNsdWRlICJjb25mZGVmcy5oIgogbWFpbigpe3JldHVybigwKTt9CiBFT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NzA3OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Q7IHRoZW4KK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6Njk5OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Q7IHRoZW4KICAgYWNfY3ZfcHJvZ19jY193b3Jrcz15ZXMKICAgIyBJZiB3ZSBjYW4ndCBydW4gYSB0cml2aWFsIHByb2dyYW0sIHdlIGFyZSBwcm9iYWJseSB1c2luZyBhIGNyb3NzIGNvbXBpbGVyLgogICBpZiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGw7IHRoZW4KQEAgLTcyMywxMiArNzE1LDEyIEBACiAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogaW5zdGFsbGF0aW9uIG9yIGNvbmZpZ3VyYXRpb24gcHJvYmxlbTogQyBjb21waWxlciBjYW5ub3QgY3JlYXRlIGV4ZWN1dGFibGVzLiIgMT4mMjsgZXhpdCAxOyB9CiBmaQogZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIGlzIGEgY3Jvc3MtY29tcGlsZXIiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjcyNzogY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIGlzIGEgY3Jvc3MtY29tcGlsZXIiID4mNQorZWNobyAiY29uZmlndXJlOjcxOTogY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIGlzIGEgY3Jvc3MtY29tcGlsZXIiID4mNQogZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2NjX2Nyb3NzIiAxPiY2CiBjcm9zc19jb21waWxpbmc9JGFjX2N2X3Byb2dfY2NfY3Jvc3MKIAogZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgdXNpbmcgR05VIEMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjczMjogY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgdXNpbmcgR05VIEMiID4mNQorZWNobyAiY29uZmlndXJlOjcyNDogY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgdXNpbmcgR05VIEMiID4mNQogaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfZ2NjJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKIGVsc2UKQEAgLTczNyw3ICs3MjksNyBAQAogICB5ZXM7CiAjZW5kaWYKIEVPRgotaWYgeyBhY190cnk9JyR7Q0MtY2N9IC1FIGNvbmZ0ZXN0LmMnOyB7IChldmFsIGVjaG8gY29uZmlndXJlOjc0MTogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH07IH0gfCBlZ3JlcCB5ZXMgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCitpZiB7IGFjX3RyeT0nJHtDQy1jY30gLUUgY29uZnRlc3QuYyc7IHsgKGV2YWwgZWNobyBjb25maWd1cmU6NzMzOiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfTsgfSB8IGVncmVwIHllcyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KICAgYWNfY3ZfcHJvZ19nY2M9eWVzCiBlbHNlCiAgIGFjX2N2X3Byb2dfZ2NjPW5vCkBAIC03NTIsNyArNzQ0LDcgQEAKICAgYWNfc2F2ZV9DRkxBR1M9IiRDRkxBR1MiCiAgIENGTEFHUz0KICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciAke0NDLWNjfSBhY2NlcHRzIC1nIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo3NTY6IGNoZWNraW5nIHdoZXRoZXIgJHtDQy1jY30gYWNjZXB0cyAtZyIgPiY1CitlY2hvICJjb25maWd1cmU6NzQ4OiBjaGVja2luZyB3aGV0aGVyICR7Q0MtY2N9IGFjY2VwdHMgLWciID4mNQogaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfY2NfZycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCiAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CiBlbHNlCkBAIC03ODAsNyArNzcyLDcgQEAKIGZpCiAKIGVjaG8gJGFjX24gImNoZWNraW5nIGhvdyB0byBydW4gdGhlIEMgcHJlcHJvY2Vzc29yIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo3ODQ6IGNoZWNraW5nIGhvdyB0byBydW4gdGhlIEMgcHJlcHJvY2Vzc29yIiA+JjUKK2VjaG8gImNvbmZpZ3VyZTo3NzY6IGNoZWNraW5nIGhvdyB0byBydW4gdGhlIEMgcHJlcHJvY2Vzc29yIiA+JjUKICMgT24gU3Vucywgc29tZXRpbWVzICRDUFAgbmFtZXMgYSBkaXJlY3RvcnkuCiBpZiB0ZXN0IC1uICIkQ1BQIiAmJiB0ZXN0IC1kICIkQ1BQIjsgdGhlbgogICBDUFA9CkBAIC03OTUsMTMgKzc4NywxMyBAQAogICAjIE9uIHRoZSBOZVhULCBjYyAtRSBydW5zIHRoZSBjb2RlIHRocm91Z2ggdGhlIGNvbXBpbGVyJ3MgcGFyc2VyLAogICAjIG5vdCBqdXN0IHRocm91Z2ggY3BwLgogICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA3OTkgImNvbmZpZ3VyZSIKKyNsaW5lIDc5MSAiY29uZmlndXJlIgogI2luY2x1ZGUgImNvbmZkZWZzLmgiCiAjaW5jbHVkZSA8YXNzZXJ0Lmg+CiBTeW50YXggRXJyb3IKIEVPRgogYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6ODA1OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQoreyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo3OTc6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9CiBhY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dGAKIGlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCiAgIDoKQEAgLTgxMiwxMyArODA0LDEzIEBACiAgIHJtIC1yZiBjb25mdGVzdCoKICAgQ1BQPSIke0NDLWNjfSAtRSAtdHJhZGl0aW9uYWwtY3BwIgogICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA4MTYgImNvbmZpZ3VyZSIKKyNsaW5lIDgwOCAiY29uZmlndXJlIgogI2luY2x1ZGUgImNvbmZkZWZzLmgiCiAjaW5jbHVkZSA8YXNzZXJ0Lmg+CiBTeW50YXggRXJyb3IKIEVPRgogYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6ODIyOiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQoreyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo4MTQ6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9CiBhY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dGAKIGlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCiAgIDoKQEAgLTg0NSw3ICs4MzcsNyBAQAogIyBVc2VzIGFjXyB2YXJzIGFzIHRlbXBzIHRvIGFsbG93IGNvbW1hbmQgbGluZSB0byBvdmVycmlkZSBjYWNoZSBhbmQgY2hlY2tzLgogIyAtLXdpdGhvdXQteCBvdmVycmlkZXMgZXZlcnl0aGluZyBlbHNlLCBidXQgZG9lcyBub3QgdG91Y2ggdGhlIGNhY2hlLgogZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIFgiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjg0OTogY2hlY2tpbmcgZm9yIFgiID4mNQorZWNobyAiY29uZmlndXJlOjg0MTogY2hlY2tpbmcgZm9yIFgiID4mNQogCiAjIENoZWNrIHdoZXRoZXIgLS13aXRoLXggb3IgLS13aXRob3V0LXggd2FzIGdpdmVuLgogaWYgdGVzdCAiJHt3aXRoX3grc2V0fSIgPSBzZXQ7IHRoZW4KQEAgLTkwNywxMiArODk5LDEyIEBACiAKICAgIyBGaXJzdCwgdHJ5IHVzaW5nIHRoYXQgZmlsZSB3aXRoIG5vIHNwZWNpYWwgZGlyZWN0b3J5IHNwZWNpZmllZC4KIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDkxMSAiY29uZmlndXJlIgorI2xpbmUgOTAzICJjb25maWd1cmUiCiAjaW5jbHVkZSAiY29uZmRlZnMuaCIKICNpbmNsdWRlIDwkeF9kaXJlY3RfdGVzdF9pbmNsdWRlPgogRU9GCiBhY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo5MTY6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Cit7IChldmFsIGVjaG8gY29uZmlndXJlOjkwODogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KIGFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0YAogaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KICAgcm0gLXJmIGNvbmZ0ZXN0KgpAQCAtOTgxLDE0ICs5NzMsMTQgQEAKICAgYWNfc2F2ZV9MSUJTPSIkTElCUyIKICAgTElCUz0iLWwkeF9kaXJlY3RfdGVzdF9saWJyYXJ5ICRMSUJTIgogY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgOTg1ICJjb25maWd1cmUiCisjbGluZSA5NzcgImNvbmZpZ3VyZSIKICNpbmNsdWRlICJjb25mZGVmcy5oIgogCiBpbnQgbWFpbigpIHsKICR7eF9kaXJlY3RfdGVzdF9mdW5jdGlvbn0oKQogOyByZXR1cm4gMDsgfQogRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjk5MjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0OyB0aGVuCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjk4NDogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0OyB0aGVuCiAgIHJtIC1yZiBjb25mdGVzdCoKICAgTElCUz0iJGFjX3NhdmVfTElCUyIKICMgV2UgY2FuIGxpbmsgWCBwcm9ncmFtcyB3aXRoIG5vIHNwZWNpYWwgbGlicmFyeSBwYXRoLgpAQCAtMTA5NCwxNyArMTA4NiwxNyBAQAogICAgIGNhc2UgImAodW5hbWUgLXNyKSAyPi9kZXYvbnVsbGAiIGluCiAgICAgIlN1bk9TIDUiKikKICAgICAgIGVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgLVIgbXVzdCBiZSBmb2xsb3dlZCBieSBhIHNwYWNlIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMDk4OiBjaGVja2luZyB3aGV0aGVyIC1SIG11c3QgYmUgZm9sbG93ZWQgYnkgYSBzcGFjZSIgPiY1CitlY2hvICJjb25maWd1cmU6MTA5MDogY2hlY2tpbmcgd2hldGhlciAtUiBtdXN0IGJlIGZvbGxvd2VkIGJ5IGEgc3BhY2UiID4mNQogICAgICAgYWNfeHNhdmVfTElCUz0iJExJQlMiOyBMSUJTPSIkTElCUyAtUiR4X2xpYnJhcmllcyIKICAgICAgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDExMDEgImNvbmZpZ3VyZSIKKyNsaW5lIDEwOTMgImNvbmZpZ3VyZSIKICNpbmNsdWRlICJjb25mZGVmcy5oIgogCiBpbnQgbWFpbigpIHsKIAogOyByZXR1cm4gMDsgfQogRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjExMDg6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdDsgdGhlbgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMTAwOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Q7IHRoZW4KICAgcm0gLXJmIGNvbmZ0ZXN0KgogICBhY19SX25vc3BhY2U9eWVzCiBlbHNlCkBAIC0xMTIwLDE0ICsxMTEyLDE0IEBACiAgICAgICBlbHNlCiAJTElCUz0iJGFjX3hzYXZlX0xJQlMgLVIgJHhfbGlicmFyaWVzIgogCWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDExMjQgImNvbmZpZ3VyZSIKKyNsaW5lIDExMTYgImNvbmZpZ3VyZSIKICNpbmNsdWRlICJjb25mZGVmcy5oIgogCiBpbnQgbWFpbigpIHsKIAogOyByZXR1cm4gMDsgfQogRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjExMzE6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdDsgdGhlbgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMTIzOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Q7IHRoZW4KICAgcm0gLXJmIGNvbmZ0ZXN0KgogICBhY19SX3NwYWNlPXllcwogZWxzZQpAQCAtMTE1OSw3ICsxMTUxLDcgQEAKICAgICAjIGxpYnJhcmllcyB3ZXJlIGJ1aWx0IHdpdGggREVDbmV0IHN1cHBvcnQuICBBbmQga2FybEBjcy51bWIuZWR1IHNheXMKICAgICAjIHRoZSBBbHBoYSBuZWVkcyBkbmV0X3N0dWIgKGRuZXQgZG9lcyBub3QgZXhpc3QpLgogICAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBkbmV0X250b2EgaW4gLWxkbmV0IiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMTYzOiBjaGVja2luZyBmb3IgZG5ldF9udG9hIGluIC1sZG5ldCIgPiY1CitlY2hvICJjb25maWd1cmU6MTE1NTogY2hlY2tpbmcgZm9yIGRuZXRfbnRvYSBpbiAtbGRuZXQiID4mNQogYWNfbGliX3Zhcj1gZWNobyBkbmV0J18nZG5ldF9udG9hIHwgc2VkICd5JS4vKy0lX19wXyUnYAogaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2xpYl8kYWNfbGliX3Zhcicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCiAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CkBAIC0xMTY3LDcgKzExNTksNyBAQAogICBhY19zYXZlX0xJQlM9IiRMSUJTIgogTElCUz0iLWxkbmV0ICAkTElCUyIKIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDExNzEgImNvbmZpZ3VyZSIKKyNsaW5lIDExNjMgImNvbmZpZ3VyZSIKICNpbmNsdWRlICJjb25mZGVmcy5oIgogLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KIC8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKQEAgLTExNzgsNyArMTE3MCw3IEBACiBkbmV0X250b2EoKQogOyByZXR1cm4gMDsgfQogRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjExODI6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdDsgdGhlbgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMTc0OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Q7IHRoZW4KICAgcm0gLXJmIGNvbmZ0ZXN0KgogICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9eWVzIgogZWxzZQpAQCAtMTIwMCw3ICsxMTkyLDcgQEAKIAogICAgIGlmIHRlc3QgJGFjX2N2X2xpYl9kbmV0X2RuZXRfbnRvYSA9IG5vOyB0aGVuCiAgICAgICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgZG5ldF9udG9hIGluIC1sZG5ldF9zdHViIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMjA0OiBjaGVja2luZyBmb3IgZG5ldF9udG9hIGluIC1sZG5ldF9zdHViIiA+JjUKK2VjaG8gImNvbmZpZ3VyZToxMTk2OiBjaGVja2luZyBmb3IgZG5ldF9udG9hIGluIC1sZG5ldF9zdHViIiA+JjUKIGFjX2xpYl92YXI9YGVjaG8gZG5ldF9zdHViJ18nZG5ldF9udG9hIHwgc2VkICd5JS4vKy0lX19wXyUnYAogaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2xpYl8kYWNfbGliX3Zhcicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCiAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CkBAIC0xMjA4LDcgKzEyMDAsNyBAQAogICBhY19zYXZlX0xJQlM9IiRMSUJTIgogTElCUz0iLWxkbmV0X3N0dWIgICRMSUJTIgogY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTIxMiAiY29uZmlndXJlIgorI2xpbmUgMTIwNCAiY29uZmlndXJlIgogI2luY2x1ZGUgImNvbmZkZWZzLmgiCiAvKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwogLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgpAQCAtMTIxOSw3ICsxMjExLDcgQEAKIGRuZXRfbnRvYSgpCiA7IHJldHVybiAwOyB9CiBFT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTIyMzogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0OyB0aGVuCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjEyMTU6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdDsgdGhlbgogICBybSAtcmYgY29uZnRlc3QqCiAgIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj15ZXMiCiBlbHNlCkBAIC0xMjQ4LDEyICsxMjQwLDEyIEBACiAgICAgIyBUaGUgbnNsIGxpYnJhcnkgcHJldmVudHMgcHJvZ3JhbXMgZnJvbSBvcGVuaW5nIHRoZSBYIGRpc3BsYXkKICAgICAjIG9uIElyaXggNS4yLCBhY2NvcmRpbmcgdG8gZGlja2V5QGNsYXJrLm5ldC4KICAgICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgZ2V0aG9zdGJ5bmFtZSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTI1MjogY2hlY2tpbmcgZm9yIGdldGhvc3RieW5hbWUiID4mNQorZWNobyAiY29uZmlndXJlOjEyNDQ6IGNoZWNraW5nIGZvciBnZXRob3N0YnluYW1lIiA+JjUKIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jX2dldGhvc3RieW5hbWUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgogICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgogZWxzZQogICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxMjU3ICJjb25maWd1cmUiCisjbGluZSAxMjQ5ICJjb25maWd1cmUiCiAjaW5jbHVkZSAiY29uZmRlZnMuaCIKIC8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKICAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyIGdldGhvc3RieW5hbWUoKTsgYmVsb3cuICAqLwpAQCAtMTI3Niw3ICsxMjY4LDcgQEAKIAogOyByZXR1cm4gMDsgfQogRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjEyODA6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdDsgdGhlbgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMjcyOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Q7IHRoZW4KICAgcm0gLXJmIGNvbmZ0ZXN0KgogICBldmFsICJhY19jdl9mdW5jX2dldGhvc3RieW5hbWU9eWVzIgogZWxzZQpAQCAtMTI5Nyw3ICsxMjg5LDcgQEAKIAogICAgIGlmIHRlc3QgJGFjX2N2X2Z1bmNfZ2V0aG9zdGJ5bmFtZSA9IG5vOyB0aGVuCiAgICAgICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgZ2V0aG9zdGJ5bmFtZSBpbiAtbG5zbCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTMwMTogY2hlY2tpbmcgZm9yIGdldGhvc3RieW5hbWUgaW4gLWxuc2wiID4mNQorZWNobyAiY29uZmlndXJlOjEyOTM6IGNoZWNraW5nIGZvciBnZXRob3N0YnluYW1lIGluIC1sbnNsIiA+JjUKIGFjX2xpYl92YXI9YGVjaG8gbnNsJ18nZ2V0aG9zdGJ5bmFtZSB8IHNlZCAneSUuLystJV9fcF8lJ2AKIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9saWJfJGFjX2xpYl92YXInK3NldH0nYFwiID0gc2V0IjsgdGhlbgogICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgpAQCAtMTMwNSw3ICsxMjk3LDcgQEAKICAgYWNfc2F2ZV9MSUJTPSIkTElCUyIKIExJQlM9Ii1sbnNsICAkTElCUyIKIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDEzMDkgImNvbmZpZ3VyZSIKKyNsaW5lIDEzMDEgImNvbmZpZ3VyZSIKICNpbmNsdWRlICJjb25mZGVmcy5oIgogLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KIC8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKQEAgLTEzMTYsNyArMTMwOCw3IEBACiBnZXRob3N0YnluYW1lKCkKIDsgcmV0dXJuIDA7IH0KIEVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMzIwOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Q7IHRoZW4KK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTMxMjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0OyB0aGVuCiAgIHJtIC1yZiBjb25mdGVzdCoKICAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPXllcyIKIGVsc2UKQEAgLTEzNDYsMTIgKzEzMzgsMTIgQEAKICAgICAjIC1sc29ja2V0IG11c3QgYmUgZ2l2ZW4gYmVmb3JlIC1sbnNsIGlmIGJvdGggYXJlIG5lZWRlZC4KICAgICAjIFdlIGFzc3VtZSB0aGF0IGlmIGNvbm5lY3QgbmVlZHMgLWxuc2wsIHNvIGRvZXMgZ2V0aG9zdGJ5bmFtZS4KICAgICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgY29ubmVjdCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTM1MDogY2hlY2tpbmcgZm9yIGNvbm5lY3QiID4mNQorZWNobyAiY29uZmlndXJlOjEzNDI6IGNoZWNraW5nIGZvciBjb25uZWN0IiA+JjUKIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jX2Nvbm5lY3QnK3NldH0nYFwiID0gc2V0IjsgdGhlbgogICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgogZWxzZQogICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxMzU1ICJjb25maWd1cmUiCisjbGluZSAxMzQ3ICJjb25maWd1cmUiCiAjaW5jbHVkZSAiY29uZmRlZnMuaCIKIC8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKICAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyIGNvbm5lY3QoKTsgYmVsb3cuICAqLwpAQCAtMTM3NCw3ICsxMzY2LDcgQEAKIAogOyByZXR1cm4gMDsgfQogRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjEzNzg6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdDsgdGhlbgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMzcwOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Q7IHRoZW4KICAgcm0gLXJmIGNvbmZ0ZXN0KgogICBldmFsICJhY19jdl9mdW5jX2Nvbm5lY3Q9eWVzIgogZWxzZQpAQCAtMTM5NSw3ICsxMzg3LDcgQEAKIAogICAgIGlmIHRlc3QgJGFjX2N2X2Z1bmNfY29ubmVjdCA9IG5vOyB0aGVuCiAgICAgICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgY29ubmVjdCBpbiAtbHNvY2tldCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTM5OTogY2hlY2tpbmcgZm9yIGNvbm5lY3QgaW4gLWxzb2NrZXQiID4mNQorZWNobyAiY29uZmlndXJlOjEzOTE6IGNoZWNraW5nIGZvciBjb25uZWN0IGluIC1sc29ja2V0IiA+JjUKIGFjX2xpYl92YXI9YGVjaG8gc29ja2V0J18nY29ubmVjdCB8IHNlZCAneSUuLystJV9fcF8lJ2AKIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9saWJfJGFjX2xpYl92YXInK3NldH0nYFwiID0gc2V0IjsgdGhlbgogICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgpAQCAtMTQwMyw3ICsxMzk1LDcgQEAKICAgYWNfc2F2ZV9MSUJTPSIkTElCUyIKIExJQlM9Ii1sc29ja2V0ICRYX0VYVFJBX0xJQlMgJExJQlMiCiBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxNDA3ICJjb25maWd1cmUiCisjbGluZSAxMzk5ICJjb25maWd1cmUiCiAjaW5jbHVkZSAiY29uZmRlZnMuaCIKIC8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCiAvKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCkBAIC0xNDE0LDcgKzE0MDYsNyBAQAogY29ubmVjdCgpCiA7IHJldHVybiAwOyB9CiBFT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTQxODogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0OyB0aGVuCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE0MTA6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdDsgdGhlbgogICBybSAtcmYgY29uZnRlc3QqCiAgIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj15ZXMiCiBlbHNlCkBAIC0xNDM4LDEyICsxNDMwLDEyIEBACiAKICAgICAjIGdvbWV6QG1pLnVuaS1lcmxhbmdlbi5kZSBzYXlzIC1scG9zaXggaXMgbmVjZXNzYXJ5IG9uIEEvVVguCiAgICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHJlbW92ZSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTQ0MjogY2hlY2tpbmcgZm9yIHJlbW92ZSIgPiY1CitlY2hvICJjb25maWd1cmU6MTQzNDogY2hlY2tpbmcgZm9yIHJlbW92ZSIgPiY1CiBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY19yZW1vdmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgogICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgogZWxzZQogICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxNDQ3ICJjb25maWd1cmUiCisjbGluZSAxNDM5ICJjb25maWd1cmUiCiAjaW5jbHVkZSAiY29uZmRlZnMuaCIKIC8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKICAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyIHJlbW92ZSgpOyBiZWxvdy4gICovCkBAIC0xNDY2LDcgKzE0NTgsNyBAQAogCiA7IHJldHVybiAwOyB9CiBFT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTQ3MDogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0OyB0aGVuCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE0NjI6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdDsgdGhlbgogICBybSAtcmYgY29uZnRlc3QqCiAgIGV2YWwgImFjX2N2X2Z1bmNfcmVtb3ZlPXllcyIKIGVsc2UKQEAgLTE0ODcsNyArMTQ3OSw3IEBACiAKICAgICBpZiB0ZXN0ICRhY19jdl9mdW5jX3JlbW92ZSA9IG5vOyB0aGVuCiAgICAgICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgcmVtb3ZlIGluIC1scG9zaXgiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE0OTE6IGNoZWNraW5nIGZvciByZW1vdmUgaW4gLWxwb3NpeCIgPiY1CitlY2hvICJjb25maWd1cmU6MTQ4MzogY2hlY2tpbmcgZm9yIHJlbW92ZSBpbiAtbHBvc2l4IiA+JjUKIGFjX2xpYl92YXI9YGVjaG8gcG9zaXgnXydyZW1vdmUgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCiBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfbGliXyRhY19saWJfdmFyJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKQEAgLTE0OTUsNyArMTQ4Nyw3IEBACiAgIGFjX3NhdmVfTElCUz0iJExJQlMiCiBMSUJTPSItbHBvc2l4ICAkTElCUyIKIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDE0OTkgImNvbmZpZ3VyZSIKKyNsaW5lIDE0OTEgImNvbmZpZ3VyZSIKICNpbmNsdWRlICJjb25mZGVmcy5oIgogLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KIC8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKQEAgLTE1MDYsNyArMTQ5OCw3IEBACiByZW1vdmUoKQogOyByZXR1cm4gMDsgfQogRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE1MTA6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdDsgdGhlbgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxNTAyOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Q7IHRoZW4KICAgcm0gLXJmIGNvbmZ0ZXN0KgogICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9eWVzIgogZWxzZQpAQCAtMTUzMCwxMiArMTUyMiwxMiBAQAogCiAgICAgIyBCU0RJIEJTRC9PUyAyLjEgbmVlZHMgLWxpcGMgZm9yIFhPcGVuRGlzcGxheS4KICAgICBlY2hvICRhY19uICJjaGVja2luZyBmb3Igc2htYXQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE1MzQ6IGNoZWNraW5nIGZvciBzaG1hdCIgPiY1CitlY2hvICJjb25maWd1cmU6MTUyNjogY2hlY2tpbmcgZm9yIHNobWF0IiA+JjUKIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jX3NobWF0JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKIGVsc2UKICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTUzOSAiY29uZmlndXJlIgorI2xpbmUgMTUzMSAiY29uZmlndXJlIgogI2luY2x1ZGUgImNvbmZkZWZzLmgiCiAvKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCiAgICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciBzaG1hdCgpOyBiZWxvdy4gICovCkBAIC0xNTU4LDcgKzE1NTAsNyBAQAogCiA7IHJldHVybiAwOyB9CiBFT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTU2MjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0OyB0aGVuCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE1NTQ6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdDsgdGhlbgogICBybSAtcmYgY29uZnRlc3QqCiAgIGV2YWwgImFjX2N2X2Z1bmNfc2htYXQ9eWVzIgogZWxzZQpAQCAtMTU3OSw3ICsxNTcxLDcgQEAKIAogICAgIGlmIHRlc3QgJGFjX2N2X2Z1bmNfc2htYXQgPSBubzsgdGhlbgogICAgICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHNobWF0IGluIC1saXBjIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxNTgzOiBjaGVja2luZyBmb3Igc2htYXQgaW4gLWxpcGMiID4mNQorZWNobyAiY29uZmlndXJlOjE1NzU6IGNoZWNraW5nIGZvciBzaG1hdCBpbiAtbGlwYyIgPiY1CiBhY19saWJfdmFyPWBlY2hvIGlwYydfJ3NobWF0IHwgc2VkICd5JS4vKy0lX19wXyUnYAogaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2xpYl8kYWNfbGliX3Zhcicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCiAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CkBAIC0xNTg3LDcgKzE1NzksNyBAQAogICBhY19zYXZlX0xJQlM9IiRMSUJTIgogTElCUz0iLWxpcGMgICRMSUJTIgogY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTU5MSAiY29uZmlndXJlIgorI2xpbmUgMTU4MyAiY29uZmlndXJlIgogI2luY2x1ZGUgImNvbmZkZWZzLmgiCiAvKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwogLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgpAQCAtMTU5OCw3ICsxNTkwLDcgQEAKIHNobWF0KCkKIDsgcmV0dXJuIDA7IH0KIEVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxNjAyOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Q7IHRoZW4KK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTU5NDogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0OyB0aGVuCiAgIHJtIC1yZiBjb25mdGVzdCoKICAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPXllcyIKIGVsc2UKQEAgLTE2MzEsNyArMTYyMyw3IEBACiAgICMgbGlicmFyaWVzIHdlIGNoZWNrIGZvciBiZWxvdywgc28gdXNlIGEgZGlmZmVyZW50IHZhcmlhYmxlLgogICAjICAtLWludGVycmFuQHVsdXJ1LlN0YW5mb3JkLkVEVSwga2JAY3MudW1iLmVkdS4KICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIEljZUNvbm5lY3Rpb25OdW1iZXIgaW4gLWxJQ0UiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE2MzU6IGNoZWNraW5nIGZvciBJY2VDb25uZWN0aW9uTnVtYmVyIGluIC1sSUNFIiA+JjUKK2VjaG8gImNvbmZpZ3VyZToxNjI3OiBjaGVja2luZyBmb3IgSWNlQ29ubmVjdGlvbk51bWJlciBpbiAtbElDRSIgPiY1CiBhY19saWJfdmFyPWBlY2hvIElDRSdfJ0ljZUNvbm5lY3Rpb25OdW1iZXIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCiBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfbGliXyRhY19saWJfdmFyJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKQEAgLTE2MzksNyArMTYzMSw3IEBACiAgIGFjX3NhdmVfTElCUz0iJExJQlMiCiBMSUJTPSItbElDRSAgJExJQlMiCiBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxNjQzICJjb25maWd1cmUiCisjbGluZSAxNjM1ICJjb25maWd1cmUiCiAjaW5jbHVkZSAiY29uZmRlZnMuaCIKIC8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCiAvKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCkBAIC0xNjUwLDcgKzE2NDIsNyBAQAogSWNlQ29ubmVjdGlvbk51bWJlcigpCiA7IHJldHVybiAwOyB9CiBFT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTY1NDogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0OyB0aGVuCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE2NDY6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdDsgdGhlbgogICBybSAtcmYgY29uZnRlc3QqCiAgIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj15ZXMiCiBlbHNlCkBAIC0xNjc5LDcgKzE2NzEsNyBAQAogIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIkYWNfcHJvZyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCiBzZXQgZHVtbXkgJGFjX3Byb2c7IGFjX3dvcmQ9JDIKIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTY4MzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKK2VjaG8gImNvbmZpZ3VyZToxNjc1OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQogaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfWUFDQycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCiAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CiBlbHNlCkBAIC0xNzExLDcgKzE3MDMsNyBAQAogIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJmbGV4Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KIHNldCBkdW1teSBmbGV4OyBhY193b3JkPSQyCiBlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE3MTU6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitlY2hvICJjb25maWd1cmU6MTcwNzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0xFWCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCiAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CiBlbHNlCkBAIC0xNzQ0LDcgKzE3MzYsNyBAQAogICAqKSBhY19saWI9bCA7OwogICBlc2FjCiAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciB5eXdyYXAgaW4gLWwkYWNfbGliIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxNzQ4OiBjaGVja2luZyBmb3IgeXl3cmFwIGluIC1sJGFjX2xpYiIgPiY1CitlY2hvICJjb25maWd1cmU6MTc0MDogY2hlY2tpbmcgZm9yIHl5d3JhcCBpbiAtbCRhY19saWIiID4mNQogYWNfbGliX3Zhcj1gZWNobyAkYWNfbGliJ18neXl3cmFwIHwgc2VkICd5JS4vKy0lX19wXyUnYAogaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2xpYl8kYWNfbGliX3Zhcicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCiAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CkBAIC0xNzUyLDcgKzE3NDQsNyBAQAogICBhY19zYXZlX0xJQlM9IiRMSUJTIgogTElCUz0iLWwkYWNfbGliICAkTElCUyIKIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDE3NTYgImNvbmZpZ3VyZSIKKyNsaW5lIDE3NDggImNvbmZpZ3VyZSIKICNpbmNsdWRlICJjb25mZGVmcy5oIgogLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KIC8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKQEAgLTE3NjMsNyArMTc1NSw3IEBACiB5eXdyYXAoKQogOyByZXR1cm4gMDsgfQogRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE3Njc6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdDsgdGhlbgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxNzU5OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Q7IHRoZW4KICAgcm0gLXJmIGNvbmZ0ZXN0KgogICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9eWVzIgogZWxzZQpAQCAtMTc4OCw3ICsxNzgwLDcgQEAKICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAicmFubGliIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KIHNldCBkdW1teSByYW5saWI7IGFjX3dvcmQ9JDIKIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTc5MjogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKK2VjaG8gImNvbmZpZ3VyZToxNzg0OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQogaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfUkFOTElCJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKIGVsc2UKQEAgLTE4MjUsNyArMTgxNyw3IEBACiAjIFNWUjQgL3Vzci91Y2IvaW5zdGFsbCwgd2hpY2ggdHJpZXMgdG8gdXNlIHRoZSBub25leGlzdGVudCBncm91cCAic3RhZmYiCiAjIC4vaW5zdGFsbCwgd2hpY2ggY2FuIGJlIGVycm9uZW91c2x5IGNyZWF0ZWQgYnkgbWFrZSBmcm9tIC4vaW5zdGFsbC5zaC4KIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBhIEJTRCBjb21wYXRpYmxlIGluc3RhbGwiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE4Mjk6IGNoZWNraW5nIGZvciBhIEJTRCBjb21wYXRpYmxlIGluc3RhbGwiID4mNQorZWNobyAiY29uZmlndXJlOjE4MjE6IGNoZWNraW5nIGZvciBhIEJTRCBjb21wYXRpYmxlIGluc3RhbGwiID4mNQogaWYgdGVzdCAteiAiJElOU1RBTEwiOyB0aGVuCiBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9pbnN0YWxsJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKQEAgLTE4NzUsNyArMTg2Nyw3IEBACiB0ZXN0IC16ICIkSU5TVEFMTF9EQVRBIiAmJiBJTlNUQUxMX0RBVEE9JyR7SU5TVEFMTH0gLW0gNjQ0JwogCiBlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIGxuIC1zIHdvcmtzIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxODc5OiBjaGVja2luZyB3aGV0aGVyIGxuIC1zIHdvcmtzIiA+JjUKK2VjaG8gImNvbmZpZ3VyZToxODcxOiBjaGVja2luZyB3aGV0aGVyIGxuIC1zIHdvcmtzIiA+JjUKIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0xOX1MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgogICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgogZWxzZQpAQCAtMTg5NSw4ICsxODg3LDEwIEBACiAgIGVjaG8gIiRhY190IiJubyIgMT4mNgogZmkKIAorCisKIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBpMzg2X3NldF9sZHQgaW4gLWxpMzg2IiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxOTAwOiBjaGVja2luZyBmb3IgaTM4Nl9zZXRfbGR0IGluIC1saTM4NiIgPiY1CitlY2hvICJjb25maWd1cmU6MTg5NDogY2hlY2tpbmcgZm9yIGkzODZfc2V0X2xkdCBpbiAtbGkzODYiID4mNQogYWNfbGliX3Zhcj1gZWNobyBpMzg2J18naTM4Nl9zZXRfbGR0IHwgc2VkICd5JS4vKy0lX19wXyUnYAogaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2xpYl8kYWNfbGliX3Zhcicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCiAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CkBAIC0xOTA0LDcgKzE4OTgsNyBAQAogICBhY19zYXZlX0xJQlM9IiRMSUJTIgogTElCUz0iLWxpMzg2ICAkTElCUyIKIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDE5MDggImNvbmZpZ3VyZSIKKyNsaW5lIDE5MDIgImNvbmZpZ3VyZSIKICNpbmNsdWRlICJjb25mZGVmcy5oIgogLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KIC8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKQEAgLTE5MTUsNyArMTkwOSw3IEBACiBpMzg2X3NldF9sZHQoKQogOyByZXR1cm4gMDsgfQogRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE5MTk6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdDsgdGhlbgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxOTEzOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Q7IHRoZW4KICAgcm0gLXJmIGNvbmZ0ZXN0KgogICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9eWVzIgogZWxzZQpAQCAtMTkzMCw3ICsxOTI0LDEwOCBAQAogZmkKIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2xpYl8nJGFjX2xpYl92YXJgXCIgPSB5ZXMiOyB0aGVuCiAgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgTERMSUJTPSIkTERMSUJTIC1saTM4NiIKKyAgICBhY190cl9saWI9SEFWRV9MSUJgZWNobyBpMzg2IHwgc2VkIC1lICdzL1teYS16QS1aMC05X10vXy9nJyBcCisgICAgLWUgJ3kvYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXovQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVovJ2AKKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKKyNkZWZpbmUgJGFjX3RyX2xpYiAxCitFT0YKKworICBMSUJTPSItbGkzODYgJExJQlMiCisKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgaXN3YWxudW0gaW4gLWx3IiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxOTQxOiBjaGVja2luZyBmb3IgaXN3YWxudW0gaW4gLWx3IiA+JjUKK2FjX2xpYl92YXI9YGVjaG8gdydfJ2lzd2FsbnVtIHwgc2VkICd5JS4vKy0lX19wXyUnYAoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2xpYl8kYWNfbGliX3Zhcicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGFjX3NhdmVfTElCUz0iJExJQlMiCitMSUJTPSItbHcgICRMSUJTIgorY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMTk0OSAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisvKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLworLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgorICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCitjaGFyIGlzd2FsbnVtKCk7CisKK2ludCBtYWluKCkgeworaXN3YWxudW0oKQorOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE5NjA6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdDsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj15ZXMiCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj1ubyIKK2ZpCitybSAtZiBjb25mdGVzdCoKK0xJQlM9IiRhY19zYXZlX0xJQlMiCisKK2ZpCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9saWJfJyRhY19saWJfdmFyYFwiID0geWVzIjsgdGhlbgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CisgICAgYWNfdHJfbGliPUhBVkVfTElCYGVjaG8gdyB8IHNlZCAtZSAncy9bXmEtekEtWjAtOV9dL18vZycgXAorICAgIC1lICd5L2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6L0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaLydgCisgIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCisjZGVmaW5lICRhY190cl9saWIgMQorRU9GCisKKyAgTElCUz0iLWx3ICRMSUJTIgorCitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIFhGODZER0FRdWVyeUV4dGVuc2lvbiBpbiAtbFh4Zjg2ZGdhIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxOTg4OiBjaGVja2luZyBmb3IgWEY4NkRHQVF1ZXJ5RXh0ZW5zaW9uIGluIC1sWHhmODZkZ2EiID4mNQorYWNfbGliX3Zhcj1gZWNobyBYeGY4NmRnYSdfJ1hGODZER0FRdWVyeUV4dGVuc2lvbiB8IHNlZCAneSUuLystJV9fcF8lJ2AKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9saWJfJGFjX2xpYl92YXInK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBhY19zYXZlX0xJQlM9IiRMSUJTIgorTElCUz0iLWxYeGY4NmRnYSAtbFhleHQgLWxYMTEgJExJQlMiCitjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAxOTk2ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKy8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCisvKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCisgICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KK2NoYXIgWEY4NkRHQVF1ZXJ5RXh0ZW5zaW9uKCk7CisKK2ludCBtYWluKCkgeworWEY4NkRHQVF1ZXJ5RXh0ZW5zaW9uKCkKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMDA3OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Q7IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9eWVzIgorZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9bm8iCitmaQorcm0gLWYgY29uZnRlc3QqCitMSUJTPSIkYWNfc2F2ZV9MSUJTIgorCitmaQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfbGliXyckYWNfbGliX3ZhcmBcIiA9IHllcyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiInllcyIgMT4mNgorICAgIGFjX3RyX2xpYj1IQVZFX0xJQmBlY2hvIFh4Zjg2ZGdhIHwgc2VkIC1lICdzL1teYS16QS1aMC05X10vXy9nJyBcCisgICAgLWUgJ3kvYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXovQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVovJ2AKKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKKyNkZWZpbmUgJGFjX3RyX2xpYiAxCitFT0YKKworICBMSUJTPSItbFh4Zjg2ZGdhICRMSUJTIgorCiBlbHNlCiAgIGVjaG8gIiRhY190IiJubyIgMT4mNgogZmkKQEAgLTE5NDMsNyArMjAzOCw3IEBACiB0aGVuCiAgIENGTEFHUz0iJENGTEFHUyAtV2FsbCIKICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgImZvciBnY2Mgc3RyZW5ndGgtcmVkdWNlIGJ1ZyIiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE5NDc6IGNoZWNraW5nICJmb3IgZ2NjIHN0cmVuZ3RoLXJlZHVjZSBidWciIiA+JjUKK2VjaG8gImNvbmZpZ3VyZToyMDQyOiBjaGVja2luZyAiZm9yIGdjYyBzdHJlbmd0aC1yZWR1Y2UgYnVnIiIgPiY1CiBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfY19nY2Nfc3RyZW5ndGhfYnVnJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKIGVsc2UKQEAgLTE5NTEsNyArMjA0Niw3IEBACiAgIGFjX2N2X2NfZ2NjX3N0cmVuZ3RoX2J1Zz0ieWVzIgogZWxzZQogICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxOTU1ICJjb25maWd1cmUiCisjbGluZSAyMDUwICJjb25maWd1cmUiCiAjaW5jbHVkZSAiY29uZmRlZnMuaCIKIAogaW50IG1haW4odm9pZCkgewpAQCAtMTk2Miw3ICsyMDU3LDcgQEAKICAgZXhpdCggQXJyYXlbMV0gIT0gLTIgKTsKIH0KIEVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxOTY2OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3QgJiYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjIwNjE6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCAmJiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGwKIHRoZW4KICAgYWNfY3ZfY19nY2Nfc3RyZW5ndGhfYnVnPSJubyIKIGVsc2UKQEAgLTE5ODUsNyArMjA4MCw3IEBACiAKIAogZWNobyAkYWNfbiAiY2hlY2tpbmcgIndoZXRoZXIgZXh0ZXJuYWwgc3ltYm9scyBuZWVkIGFuIHVuZGVyc2NvcmUgcHJlZml4IiIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTk4OTogY2hlY2tpbmcgIndoZXRoZXIgZXh0ZXJuYWwgc3ltYm9scyBuZWVkIGFuIHVuZGVyc2NvcmUgcHJlZml4IiIgPiY1CitlY2hvICJjb25maWd1cmU6MjA4NDogY2hlY2tpbmcgIndoZXRoZXIgZXh0ZXJuYWwgc3ltYm9scyBuZWVkIGFuIHVuZGVyc2NvcmUgcHJlZml4IiIgPiY1CiBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfY19leHRlcm5fcHJlZml4JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKIGVsc2UKQEAgLTE5OTcsMTQgKzIwOTIsMTQgQEAKIAkubG9uZyAwCiBFT0YKIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDIwMDEgImNvbmZpZ3VyZSIKKyNsaW5lIDIwOTYgImNvbmZpZ3VyZSIKICNpbmNsdWRlICJjb25mZGVmcy5oIgogZXh0ZXJuIGludCBhY190ZXN0OwogaW50IG1haW4oKSB7CiBpZiAoYWNfdGVzdCkgcmV0dXJuIDEKIDsgcmV0dXJuIDA7IH0KIEVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMDA4OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Q7IHRoZW4KK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjEwMzogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0OyB0aGVuCiAgIHJtIC1yZiBjb25mdGVzdCoKICAgYWNfY3ZfY19leHRlcm5fcHJlZml4PSJ5ZXMiCiBlbHNlCkBAIC0yMDMxLDIxICsyMTI2LDIxIEBACiBpZiB0ZXN0ICIkTElCX1RBUkdFVCIgPSAibGlid2luZS5zby4xLjAiCiB0aGVuCiAgIGVjaG8gJGFjX24gImNoZWNraW5nICJ3aGV0aGVyIHdlIGNhbiBidWlsZCBhIGRsbCIiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIwMzU6IGNoZWNraW5nICJ3aGV0aGVyIHdlIGNhbiBidWlsZCBhIGRsbCIiID4mNQorZWNobyAiY29uZmlndXJlOjIxMzA6IGNoZWNraW5nICJ3aGV0aGVyIHdlIGNhbiBidWlsZCBhIGRsbCIiID4mNQogaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2NfZGxsJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKIGVsc2UKICAgc2F2ZWRfY2ZsYWdzPSRDRkxBR1MKICAgQ0ZMQUdTPSIkQ0ZMQUdTIC1mUElDIC1zaGFyZWQgLVdsLC1zb25hbWUsY29uZnRlc3Quc28uMS4wIgogICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyMDQyICJjb25maWd1cmUiCisjbGluZSAyMTM3ICJjb25maWd1cmUiCiAjaW5jbHVkZSAiY29uZmRlZnMuaCIKIAogaW50IG1haW4oKSB7CiByZXR1cm4gMQogOyByZXR1cm4gMDsgfQogRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjIwNDk6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdDsgdGhlbgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMTQ0OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Q7IHRoZW4KICAgcm0gLXJmIGNvbmZ0ZXN0KgogICBhY19jdl9jX2RsbD0ieWVzIgogZWxzZQpAQCAtMjA3MCwxNSArMjE2NSwxNSBAQAogCiAKIAotZm9yIGFjX2Z1bmMgaW4gbWVtbW92ZSBzdHJlcnJvciB0Y2dldGF0dHIgdXNsZWVwIHdhaXQ0IHdhaXRwaWQKK2ZvciBhY19mdW5jIGluIGNsb25lIG1lbW1vdmUgc3RyZXJyb3IgdGNnZXRhdHRyIHVzbGVlcCB3YWl0NCB3YWl0cGlkCiBkbwogZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMDc3OiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQorZWNobyAiY29uZmlndXJlOjIxNzI6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1CiBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY18kYWNfZnVuYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCiAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CiBlbHNlCiAgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDIwODIgImNvbmZpZ3VyZSIKKyNsaW5lIDIxNzcgImNvbmZpZ3VyZSIKICNpbmNsdWRlICJjb25mZGVmcy5oIgogLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAogICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMoKTsgYmVsb3cuICAqLwpAQCAtMjEwMSw3ICsyMTk2LDcgQEAKIAogOyByZXR1cm4gMDsgfQogRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjIxMDU6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdDsgdGhlbgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMjAwOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Q7IHRoZW4KICAgcm0gLXJmIGNvbmZ0ZXN0KgogICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKIGVsc2UKQEAgLTIxMjUsMTMgKzIyMjAsNTMgQEAKIGZpCiBkb25lCiAKK2ZvciBhY19oZHIgaW4gd2N0eXBlLmgKK2RvCithY19zYWZlPWBlY2hvICIkYWNfaGRyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfaGRyIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToyMjI4OiBjaGVja2luZyBmb3IgJGFjX2hkciIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMjIzMyAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8JGFjX2hkcj4KK0VPRgorYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKK3sgKGV2YWwgZWNobyBjb25maWd1cmU6MjIzODogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KK2FjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0YAoraWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9eWVzIgorZWxzZQorICBlY2hvICIkYWNfZXJyIiA+JjUKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPW5vIgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZmkKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2hlYWRlcl8nJGFjX3NhZmVgXCIgPSB5ZXMiOyB0aGVuCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKKyAgICBhY190cl9oZHI9SEFWRV9gZWNobyAkYWNfaGRyIHwgc2VkICd5JWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6Li8tJUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaX19fJSdgCisgIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCisjZGVmaW5lICRhY190cl9oZHIgMQorRU9GCisgCitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKK2RvbmUKKwogZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBzdGF0IGZpbGUtbW9kZSBtYWNyb3MgYXJlIGJyb2tlbiIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjEzMDogY2hlY2tpbmcgd2hldGhlciBzdGF0IGZpbGUtbW9kZSBtYWNyb3MgYXJlIGJyb2tlbiIgPiY1CitlY2hvICJjb25maWd1cmU6MjI2NTogY2hlY2tpbmcgd2hldGhlciBzdGF0IGZpbGUtbW9kZSBtYWNyb3MgYXJlIGJyb2tlbiIgPiY1CiBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyX3N0YXRfYnJva2VuJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKIGVsc2UKICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjEzNSAiY29uZmlndXJlIgorI2xpbmUgMjI3MCAiY29uZmlndXJlIgogI2luY2x1ZGUgImNvbmZkZWZzLmgiCiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiAjaW5jbHVkZSA8c3lzL3N0YXQuaD4KQEAgLTIxODIsMTIgKzIzMTcsMTIgQEAKIGZpCiAKIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciB3b3JraW5nIGNvbnN0IiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMTg2OiBjaGVja2luZyBmb3Igd29ya2luZyBjb25zdCIgPiY1CitlY2hvICJjb25maWd1cmU6MjMyMTogY2hlY2tpbmcgZm9yIHdvcmtpbmcgY29uc3QiID4mNQogaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2NfY29uc3QnK3NldH0nYFwiID0gc2V0IjsgdGhlbgogICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgogZWxzZQogICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyMTkxICJjb25maWd1cmUiCisjbGluZSAyMzI2ICJjb25maWd1cmUiCiAjaW5jbHVkZSAiY29uZmRlZnMuaCIKIAogaW50IG1haW4oKSB7CkBAIC0yMjM2LDcgKzIzNzEsNyBAQAogCiA7IHJldHVybiAwOyB9CiBFT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjI0MDogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMzc1OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCiAgIHJtIC1yZiBjb25mdGVzdCoKICAgYWNfY3ZfY19jb25zdD15ZXMKIGVsc2UKQEAgLTIyNTcsMTIgKzIzOTIsMTIgQEAKIGZpCiAKIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBBTlNJIEMgaGVhZGVyIGZpbGVzIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMjYxOiBjaGVja2luZyBmb3IgQU5TSSBDIGhlYWRlciBmaWxlcyIgPiY1CitlY2hvICJjb25maWd1cmU6MjM5NjogY2hlY2tpbmcgZm9yIEFOU0kgQyBoZWFkZXIgZmlsZXMiID4mNQogaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl9zdGRjJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKIGVsc2UKICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjI2NiAiY29uZmlndXJlIgorI2xpbmUgMjQwMSAiY29uZmlndXJlIgogI2luY2x1ZGUgImNvbmZkZWZzLmgiCiAjaW5jbHVkZSA8c3RkbGliLmg+CiAjaW5jbHVkZSA8c3RkYXJnLmg+CkBAIC0yMjcwLDcgKzI0MDUsNyBAQAogI2luY2x1ZGUgPGZsb2F0Lmg+CiBFT0YKIGFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjIyNzQ6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Cit7IChldmFsIGVjaG8gY29uZmlndXJlOjI0MDk6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9CiBhY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dGAKIGlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCiAgIHJtIC1yZiBjb25mdGVzdCoKQEAgLTIyODcsNyArMjQyMiw3IEBACiBpZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhlbgogICAjIFN1bk9TIDQueCBzdHJpbmcuaCBkb2VzIG5vdCBkZWNsYXJlIG1lbSosIGNvbnRyYXJ5IHRvIEFOU0kuCiBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyMjkxICJjb25maWd1cmUiCisjbGluZSAyNDI2ICJjb25maWd1cmUiCiAjaW5jbHVkZSAiY29uZmRlZnMuaCIKICNpbmNsdWRlIDxzdHJpbmcuaD4KIEVPRgpAQCAtMjMwNSw3ICsyNDQwLDcgQEAKIGlmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCiAgICMgSVNDIDIuMC4yIHN0ZGxpYi5oIGRvZXMgbm90IGRlY2xhcmUgZnJlZSwgY29udHJhcnkgdG8gQU5TSS4KIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDIzMDkgImNvbmZpZ3VyZSIKKyNsaW5lIDI0NDQgImNvbmZpZ3VyZSIKICNpbmNsdWRlICJjb25mZGVmcy5oIgogI2luY2x1ZGUgPHN0ZGxpYi5oPgogRU9GCkBAIC0yMzI2LDcgKzI0NjEsNyBAQAogICA6CiBlbHNlCiAgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDIzMzAgImNvbmZpZ3VyZSIKKyNsaW5lIDI0NjUgImNvbmZpZ3VyZSIKICNpbmNsdWRlICJjb25mZGVmcy5oIgogI2luY2x1ZGUgPGN0eXBlLmg+CiAjZGVmaW5lIElTTE9XRVIoYykgKCdhJyA8PSAoYykgJiYgKGMpIDw9ICd6JykKQEAgLTIzMzcsNyArMjQ3Miw3IEBACiBleGl0ICgwKTsgfQogCiBFT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjM0MTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0ICYmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbAoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyNDc2OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3QgJiYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsCiB0aGVuCiAgIDoKIGVsc2UKQEAgLTIzNjEsMTIgKzI0OTYsMTIgQEAKIGZpCiAKIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBzaXplX3QiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIzNjU6IGNoZWNraW5nIGZvciBzaXplX3QiID4mNQorZWNobyAiY29uZmlndXJlOjI1MDA6IGNoZWNraW5nIGZvciBzaXplX3QiID4mNQogaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3R5cGVfc2l6ZV90JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKIGVsc2UKICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjM3MCAiY29uZmlndXJlIgorI2xpbmUgMjUwNSAiY29uZmlndXJlIgogI2luY2x1ZGUgImNvbmZkZWZzLmgiCiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiAjaWYgU1REQ19IRUFERVJTCkBAIC0yNTYzLDcgKzI2OTgsNiBAQAogcyVAb2xkaW5jbHVkZWRpckAlJG9sZGluY2x1ZGVkaXIlZwogcyVAaW5mb2RpckAlJGluZm9kaXIlZwogcyVAbWFuZGlyQCUkbWFuZGlyJWcKLXMlQExETElCU0AlJExETElCUyVnCiBzJUBQUk9HRVhUQCUkUFJPR0VYVCVnCiBzJUBNQUlOX1RBUkdFVEAlJE1BSU5fVEFSR0VUJWcKIHMlQExJQl9UQVJHRVRAJSRMSUJfVEFSR0VUJWcKZGlmZiAtLWdpdCBhL2NvbmZpZ3VyZS5pbiBiL2NvbmZpZ3VyZS5pbgppbmRleCAxMWIyNmFiLi5hYmY5MTE5IDEwMDY0NAotLS0gYS9jb25maWd1cmUuaW4KKysrIGIvY29uZmlndXJlLmluCkBAIC03LDcgKzcsNyBAQAogQUNfQ09ORklHX0FVWF9ESVIodG9vbHMpCiAKICMgV2Ugd2FudCB0aGVzZSBiZWZvcmUgdGhlIGNoZWNrcywgc28gdGhlIGNoZWNrcyBjYW4gbW9kaWZ5IHRoZWlyIHZhbHVlcy4KLXRlc3QgLXogIiRMRExJQlMiICYmIExETElCUz0tbG0gQUNfU1VCU1QoTERMSUJTKQorTElCUz0iJExJQlMgLWxtIgogdGVzdCAteiAiJFBST0dFWFQiICYmIFBST0dFWFQ9IiIgQUNfU1VCU1QoUFJPR0VYVCkKIAogZG5sICoqKiogQ29tbWFuZC1saW5lIGFyZ3VtZW50cyAqKioqCkBAIC0yNCwxNSArMjQsMTUgQEAKIFsgIC0tZW5hYmxlLWRsbCAgICAgICAgICAgIGJ1aWxkIHRoZSBXaW5lIGxpYnJhcnkgYXMgYSBETExdLAogW2lmIHRlc3QgIiRlbmFibGV2YWwiID0gIm5vIjsgdGhlbiA6IDsgZWxzZSBMSUJfVEFSR0VUPSJsaWJ3aW5lLnNvLjEuMCI7IGZpXSkKIAotQUNfQVJHX1dJVEgoaXBjLAotWyAgLS1lbmFibGUtaXBjICAgICAgICAgICAgdXNlIGludGVyLXByb2Nlc3MgY29tbXVuaWNhdGlvbiBmb3IgRERFXSwKLVtpZiB0ZXN0ICIkZW5hYmxldmFsIiA9ICJubyI7IHRoZW4gOiA7IGVsc2UgT1BUSU9OUz0iLURDT05GSUdfSVBDIjsgZmldKQorZG5sIEFDX0FSR19XSVRIKGlwYywKK2RubCBbICAtLWVuYWJsZS1pcGMgICAgICAgICAgICB1c2UgaW50ZXItcHJvY2VzcyBjb21tdW5pY2F0aW9uIGZvciBEREVdLAorZG5sIFtpZiB0ZXN0ICIkZW5hYmxldmFsIiA9ICJubyI7IHRoZW4gOiA7IGVsc2UgT1BUSU9OUz0iLURDT05GSUdfSVBDIjsgZmldKQogCiBBQ19TVUJTVChNQUlOX1RBUkdFVCkKIEFDX1NVQlNUKExJQl9UQVJHRVQpCiBBQ19TVUJTVChPUFRJT05TKQogCi1kbmwgKioqKiBDaGVjayBmb3Igc29tZSBwcm9ncmFtcyBhbmQgbGlicmFyaWVzICoqKioKK2RubCAqKioqIENoZWNrIGZvciBzb21lIHByb2dyYW1zICoqKioKIAogQUNfUFJPR19NQUtFX1NFVAogQUNfUFJPR19DQwpAQCAtNDMsOCArNDMsMTUgQEAKIEFDX1BST0dfUkFOTElCCiBBQ19QUk9HX0lOU1RBTEwKIEFDX1BST0dfTE5fUworCitkbmwgKioqKiBDaGVjayBmb3Igc29tZSBsaWJyYXJpZXMgKioqKgorCiBkbmwgQ2hlY2sgZm9yIC1saTM4NiBmb3IgTmV0QlNEIGFuZCBPcGVuQlNECi1BQ19DSEVDS19MSUIoaTM4NixpMzg2X3NldF9sZHQsTERMSUJTPSIkTERMSUJTIC1saTM4NiIpCitBQ19DSEVDS19MSUIoaTM4NixpMzg2X3NldF9sZHQpCitkbmwgQ2hlY2sgZm9yIC1sdyBmb3IgU29sYXJpcworQUNfQ0hFQ0tfTElCKHcsaXN3YWxudW0pCitkbmwgQ2hlY2sgZm9yIFhGcmVlODYgREdBIGV4dGVuc2lvbgorQUNfQ0hFQ0tfTElCKFh4Zjg2ZGdhLFhGODZER0FRdWVyeUV4dGVuc2lvbiwsLC1sWGV4dCAtbFgxMSkKIAogZG5sICoqKiogSWYgbG4gLXMgZG9lc24ndCB3b3JrLCB1c2UgY3AgaW5zdGVhZCAqKioqCiBpZiB0ZXN0ICIkYWNfY3ZfcHJvZ19MTl9TIiA9ICJsbiAtcyI7IHRoZW4gOiA7IGVsc2UgTE5fUz1jcCA7IGZpCkBAIC0xMTQsNyArMTIxLDggQEAKIAogZG5sICoqKiogQ2hlY2sgZm9yIGZ1bmN0aW9ucyBhbmQgaGVhZGVyIGZpbGVzICoqKioKIAotQUNfQ0hFQ0tfRlVOQ1MobWVtbW92ZSBzdHJlcnJvciB0Y2dldGF0dHIgdXNsZWVwIHdhaXQ0IHdhaXRwaWQpCitBQ19DSEVDS19GVU5DUyhjbG9uZSBtZW1tb3ZlIHN0cmVycm9yIHRjZ2V0YXR0ciB1c2xlZXAgd2FpdDQgd2FpdHBpZCkKK0FDX0NIRUNLX0hFQURFUlMod2N0eXBlLmgpCiBBQ19IRUFERVJfU1RBVCgpCiBBQ19DX0NPTlNUKCkKIEFDX1RZUEVfU0laRV9UKCkKZGlmZiAtLWdpdCBhL2NvbnRyb2xzL2J1dHRvbi5jIGIvY29udHJvbHMvYnV0dG9uLmMKaW5kZXggODM2MDcwZC4uOWI3NGYxZiAxMDA2NDQKLS0tIGEvY29udHJvbHMvYnV0dG9uLmMKKysrIGIvY29udHJvbHMvYnV0dG9uLmMKQEAgLTYsOSArNiw5IEBACiAgKi8KIAogI2luY2x1ZGUgIndpbi5oIgotI2luY2x1ZGUgInN5c2NvbG9yLmgiCiAjaW5jbHVkZSAiZ3JhcGhpY3MuaCIKICNpbmNsdWRlICJidXR0b24uaCIKKyNpbmNsdWRlICJ3aW5kb3dzLmgiCiAKIHN0YXRpYyB2b2lkIFBCX1BhaW50KCBXTkQgKnduZFB0ciwgSERDMzIgaERDLCBXT1JEIGFjdGlvbiApOwogc3RhdGljIHZvaWQgUEJfUGFpbnRHcmF5T25HcmF5KEhEQzMyIGhEQyxIRk9OVDMyIGhGb250LFJFQ1QzMiAqcmMsY2hhciAqdGV4dCk7CkBAIC0yNjYsOCArMjY2LDggQEAKICAgICAgIC8qIFNlbmQgV01fQ1RMQ09MT1IgdG8gYWxsb3cgY2hhbmdpbmcgdGhlIGZvbnQgKHRoZSBjb2xvcnMgYXJlIGZpeGVkKSAqLwogICAgIGlmIChpbmZvUHRyLT5oRm9udCkgU2VsZWN0T2JqZWN0MzIoIGhEQywgaW5mb1B0ci0+aEZvbnQgKTsKICAgICBCVVRUT05fU0VORF9DVExDT0xPUiggd25kUHRyLCBoREMgKTsKLSAgICBoT2xkUGVuID0gKEhQRU4zMilTZWxlY3RPYmplY3QzMihoREMsIHN5c0NvbG9yT2JqZWN0cy5ocGVuV2luZG93RnJhbWUpOwotICAgIGhPbGRCcnVzaCA9IChIQlJVU0gzMilTZWxlY3RPYmplY3QzMihoREMsIHN5c0NvbG9yT2JqZWN0cy5oYnJ1c2hCdG5GYWNlKTsKKyAgICBoT2xkUGVuID0gKEhQRU4zMilTZWxlY3RPYmplY3QzMihoREMsIEdldFN5c0NvbG9yUGVuMzIoQ09MT1JfV0lORE9XRlJBTUUpKTsKKyAgICBoT2xkQnJ1c2ggPShIQlJVU0gzMilTZWxlY3RPYmplY3QzMihoREMsR2V0U3lzQ29sb3JCcnVzaDMyKENPTE9SX0JUTkZBQ0UpKTsKICAgICBTZXRCa01vZGUzMihoREMsIFRSQU5TUEFSRU5UKTsKICAgICBSZWN0YW5nbGUzMihoREMsIHJjLmxlZnQsIHJjLnRvcCwgcmMucmlnaHQsIHJjLmJvdHRvbSk7CiAgICAgaWYgKGFjdGlvbiA9PSBPREFfRFJBV0VOVElSRSkKQEAgLTI4OCw3ICsyODgsNyBAQAogICAgIGlmIChpbmZvUHRyLT5zdGF0ZSAmIEJVVFRPTl9ISUdITElHSFRFRCkKICAgICB7CiAgICAgICAgIC8qIGRyYXcgYnV0dG9uIHNoYWRvdzogKi8KLSAgICAgICAgU2VsZWN0T2JqZWN0MzIoaERDLCBzeXNDb2xvck9iamVjdHMuaGJydXNoQnRuU2hhZG93ICk7CisgICAgICAgIFNlbGVjdE9iamVjdDMyKGhEQywgR2V0U3lzQ29sb3JCcnVzaDMyKENPTE9SX0JUTlNIQURPVykpOwogICAgICAgICBQYXRCbHQzMihoREMsIHJjLmxlZnQsIHJjLnRvcCwgMSwgcmMuYm90dG9tLXJjLnRvcCwgUEFUQ09QWSApOwogICAgICAgICBQYXRCbHQzMihoREMsIHJjLmxlZnQsIHJjLnRvcCwgcmMucmlnaHQtcmMubGVmdCwgMSwgUEFUQ09QWSApOwogICAgICAgICByYy5sZWZ0ICs9IDI7ICAvKiBUbyBwb3NpdGlvbiB0aGUgdGV4dCBkb3duIGFuZCByaWdodCAqLwpAQCAtMzAwLDcgKzMwMCw3IEBACiAgICAgaWYgKHduZFB0ci0+dGV4dCAmJiB3bmRQdHItPnRleHRbMF0pCiAgICAgewogICAgICAgICBMT0dCUlVTSDE2IGxiOwotICAgICAgICBHZXRPYmplY3QxNiggc3lzQ29sb3JPYmplY3RzLmhicnVzaEJ0bkZhY2UsIHNpemVvZihsYiksICZsYiApOworICAgICAgICBHZXRPYmplY3QxNiggR2V0U3lzQ29sb3JCcnVzaDMyKENPTE9SX0JUTkZBQ0UpLCBzaXplb2YobGIpLCAmbGIgKTsKICAgICAgICAgaWYgKHduZFB0ci0+ZHdTdHlsZSAmIFdTX0RJU0FCTEVEICYmCiAgICAgICAgICAgICBHZXRTeXNDb2xvcjMyKENPTE9SX0dSQVlURVhUKT09bGIubGJDb2xvcikKICAgICAgICAgICAgIC8qIGRvbid0IHdyaXRlIGdyYXkgdGV4dCBvbiBncmF5IGJrZyAqLwpAQCAtNDk0LDcgKzQ5NCw3IEBACiAKICAgICBHZXRDbGllbnRSZWN0MTYoIHduZFB0ci0+aHduZFNlbGYsICZyYyk7CiAgICAgR1JBUEhfRHJhd1JlY3RhbmdsZSggaERDLCByYy5sZWZ0LCByYy50b3AgKyAyLCByYy5yaWdodCAtIDEsIHJjLmJvdHRvbSAtIDEsCi0JCQkJCSAgICAgc3lzQ29sb3JPYmplY3RzLmhwZW5XaW5kb3dGcmFtZSApOworCQkJIEdldFN5c0NvbG9yUGVuMzIoQ09MT1JfV0lORE9XRlJBTUUpICk7CiAgICAgaWYgKHduZFB0ci0+dGV4dCkKICAgICB7CiAJaWYgKGluZm9QdHItPmhGb250KSBTZWxlY3RPYmplY3QzMiggaERDLCBpbmZvUHRyLT5oRm9udCApOwpkaWZmIC0tZ2l0IGEvY29udHJvbHMvY29tYm8uYyBiL2NvbnRyb2xzL2NvbWJvLmMKaW5kZXggZTFjY2IxNi4uNTliNTFjYiAxMDA2NDQKLS0tIGEvY29udHJvbHMvY29tYm8uYworKysgYi9jb250cm9scy9jb21iby5jCkBAIC0xMSw3ICsxMSw2IEBACiAKICNpbmNsdWRlICJ3aW5kb3dzLmgiCiAjaW5jbHVkZSAic3lzbWV0cmljcy5oIgotI2luY2x1ZGUgInN5c2NvbG9yLmgiCiAjaW5jbHVkZSAid2luLmgiCiAjaW5jbHVkZSAic3B5LmgiCiAjaW5jbHVkZSAidXNlci5oIgpAQCAtMzY2LDcgKzM2NSw3IEBACiAgICAgaWYoIGxwaGMtPndTdGF0ZSAmIENCRl9OT1JFRFJBVyApCiAgICAgICAgIHJldHVybjsKIAotICAgIGhQcmV2QnJ1c2ggPSAoSEJSVVNIMzIpU2VsZWN0T2JqZWN0MzIoaGRjLCBzeXNDb2xvck9iamVjdHMuaGJydXNoQnRuRmFjZSk7CisgICAgaFByZXZCcnVzaD0oSEJSVVNIMzIpU2VsZWN0T2JqZWN0MzIoaGRjLEdldFN5c0NvbG9yQnJ1c2gzMihDT0xPUl9CVE5GQUNFKSk7CiAgICAgQ09OVl9SRUNUMTZUTzMyKCAmbHBoYy0+UmVjdEJ1dHRvbiwgJnIgKTsKIAogICAgIFJlY3RhbmdsZTMyKGhkYywgci5sZWZ0LCByLnRvcCwgci5yaWdodCwgci5ib3R0b20gKTsKQEAgLTQ1OSw3ICs0NTgsNyBAQAogCSAgICB7CiAJCS8qIGhpZ2hsaWdodCAqLwogCi0JCUZpbGxSZWN0MzIoIGhEQywgJnJlY3QsIHN5c0NvbG9yT2JqZWN0cy5oYnJ1c2hIaWdobGlnaHQgKTsKKwkJRmlsbFJlY3QzMiggaERDLCAmcmVjdCwgR2V0U3lzQ29sb3JCcnVzaDMyKENPTE9SX0hJR0hMSUdIVCkgKTsKICAgICAgICAgICAgICAgICBTZXRCa0NvbG9yMzIoIGhEQywgR2V0U3lzQ29sb3IzMiggQ09MT1JfSElHSExJR0hUICkgKTsKICAgICAgICAgICAgICAgICBTZXRUZXh0Q29sb3IzMiggaERDLCBHZXRTeXNDb2xvcjMyKCBDT0xPUl9ISUdITElHSFRURVhUICkgKTsKIAkJaXRlbVN0YXRlID0gT0RTX1NFTEVDVEVEIHwgT0RTX0ZPQ1VTOwpAQCAtNTM4LDkgKzUzNyw5IEBACiAJICAvKiBwYWludCB0ZXh0IGZpZWxkICovCiAKIAkgIEdSQVBIX0RyYXdSZWN0YW5nbGUoIGhEQywgbHBoYy0+UmVjdEVkaXQubGVmdCwgbHBoYy0+UmVjdEVkaXQudG9wLAotCQkJCSAgICBscGhjLT5SZWN0RWRpdC5yaWdodCAtIGxwaGMtPlJlY3RFZGl0LmxlZnQsIAotCQkJCSAgICBscGhjLT5SZWN0QnV0dG9uLmJvdHRvbSAtIGxwaGMtPlJlY3RCdXR0b24udG9wLAotCQkJCSAgICBzeXNDb2xvck9iamVjdHMuaHBlbldpbmRvd0ZyYW1lICk7IAorCQkJICAgICAgIGxwaGMtPlJlY3RFZGl0LnJpZ2h0IC0gbHBoYy0+UmVjdEVkaXQubGVmdCwgCisJCQkgICAgICAgbHBoYy0+UmVjdEJ1dHRvbi5ib3R0b20gLSBscGhjLT5SZWN0QnV0dG9uLnRvcCwKKwkJCSAgICAgICBHZXRTeXNDb2xvclBlbjMyKENPTE9SX1dJTkRPV0ZSQU1FKSApOyAKIAkgIENCUGFpbnRUZXh0KCBscGhjLCBoREMgKTsKICAgICAgIH0KICAgICAgIGlmKCBoUHJldkJydXNoICkgU2VsZWN0T2JqZWN0MzIoIGhEQywgaFByZXZCcnVzaCApOwpkaWZmIC0tZ2l0IGEvY29udHJvbHMvaWNvbnRpdGxlLmMgYi9jb250cm9scy9pY29udGl0bGUuYwppbmRleCBiNTQ4MDFlLi44YzRhNDczIDEwMDY0NAotLS0gYS9jb250cm9scy9pY29udGl0bGUuYworKysgYi9jb250cm9scy9pY29udGl0bGUuYwpAQCAtOSw3ICs5LDYgQEAKICNpbmNsdWRlIDx1bmlzdGQuaD4KICNpbmNsdWRlICJ3aW5kb3dzLmgiCiAjaW5jbHVkZSAic3lzbWV0cmljcy5oIgotI2luY2x1ZGUgInN5c2NvbG9yLmgiCiAjaW5jbHVkZSAid2luLmgiCiAjaW5jbHVkZSAiZGVza3RvcC5oIgogI2luY2x1ZGUgImdyYXBoaWNzLmgiCkBAIC0xMjgsNyArMTI3LDcgQEAKIAogICAgIGlmKCBiQWN0aXZlICkKICAgICB7Ci0JaEJydXNoID0gc3lzQ29sb3JPYmplY3RzLmhicnVzaEFjdGl2ZUNhcHRpb247CisJaEJydXNoID0gR2V0U3lzQ29sb3JCcnVzaDMyKENPTE9SX0FDVElWRUNBUFRJT04pOwogCXRleHRDb2xvciA9IEdldFN5c0NvbG9yMzIoQ09MT1JfQ0FQVElPTlRFWFQpOwogICAgIH0KICAgICBlbHNlIApkaWZmIC0tZ2l0IGEvY29udHJvbHMvbWVudS5jIGIvY29udHJvbHMvbWVudS5jCmluZGV4IDhjMmU5ODQuLmVlNWEwOTggMTAwNjQ0Ci0tLSBhL2NvbnRyb2xzL21lbnUuYworKysgYi9jb250cm9scy9tZW51LmMKQEAgLTIwLDcgKzIwLDYgQEAKICNpbmNsdWRlICJ3aW5kb3dzLmgiCiAjaW5jbHVkZSAiYml0bWFwLmgiCiAjaW5jbHVkZSAiZ2RpLmgiCi0jaW5jbHVkZSAic3lzY29sb3IuaCIKICNpbmNsdWRlICJzeXNtZXRyaWNzLmgiCiAjaW5jbHVkZSAidGFzay5oIgogI2luY2x1ZGUgIndpbi5oIgpAQCAtODc5LDcgKzg3OCw3IEBACiAJci5ib3R0b20gKz0gTUVOVV9IaWdobGlnaHRCb3R0b21OdWRnZTsKIAlyLmxlZnQgKz0gTUVOVV9IaWdobGlnaHRMZWZ0TnVkZ2U7CiAJci5yaWdodCArPSBNRU5VX0hpZ2hsaWdodFJpZ2h0TnVkZ2U7Ci0JRmlsbFJlY3QzMiggaGRjLCAmciwgc3lzQ29sb3JPYmplY3RzLmhicnVzaEhpZ2hsaWdodCApOworCUZpbGxSZWN0MzIoIGhkYywgJnIsIEdldFN5c0NvbG9yQnJ1c2gzMihDT0xPUl9ISUdITElHSFQpICk7CiAgICAgfQogICAgIGVsc2UgewogCVJFQ1QzMiAgciA9IHJlY3Q7CkBAIC04ODcsNyArODg2LDcgQEAKIAlyLmJvdHRvbSArPSBNRU5VX0hpZ2hsaWdodEJvdHRvbU51ZGdlOwogCXIubGVmdCArPSBNRU5VX0hpZ2hsaWdodExlZnROdWRnZTsKIAlyLnJpZ2h0ICs9IE1FTlVfSGlnaGxpZ2h0UmlnaHROdWRnZTsKLQlGaWxsUmVjdDMyKCBoZGMsICZyLCBzeXNDb2xvck9iamVjdHMuaGJydXNoTWVudSApOworCUZpbGxSZWN0MzIoIGhkYywgJnIsIEdldFN5c0NvbG9yQnJ1c2gzMihDT0xPUl9NRU5VKSApOwogICAgIH0KIAogICAgIFNldEJrTW9kZTMyKCBoZGMsIFRSQU5TUEFSRU5UICk7CkBAIC04OTksNyArODk4LDcgQEAKIAlpZihUV0VBS19XaW45NUxvb2spCiAJICAgIFRXRUFLX0RyYXdNZW51U2VwYXJhdG9yVmVydDk1KGhkYywgcmVjdC5sZWZ0IC0gMSwgMywgaGVpZ2h0IC0gMyk7CiAJZWxzZSB7Ci0JICAgIFNlbGVjdE9iamVjdDMyKCBoZGMsIHN5c0NvbG9yT2JqZWN0cy5ocGVuV2luZG93RnJhbWUgKTsKKwkgICAgU2VsZWN0T2JqZWN0MzIoIGhkYywgR2V0U3lzQ29sb3JQZW4zMihDT0xPUl9XSU5ET1dGUkFNRSkgKTsKIAkgICAgTW92ZVRvKCBoZGMsIHJlY3QubGVmdCwgMCApOwogCSAgICBMaW5lVG8zMiggaGRjLCByZWN0LmxlZnQsIGhlaWdodCApOwogCX0KQEAgLTkxMSw3ICs5MTAsNyBAQAogCQkJCQkgICByZWN0LnRvcCArIFNFUEFSQVRPUl9IRUlHSFQgLyAyICsgMSwKIAkJCQkJICAgcmVjdC5yaWdodCAtIDEpOwogCWVsc2UgewotCSAgICBTZWxlY3RPYmplY3QzMiggaGRjLCBzeXNDb2xvck9iamVjdHMuaHBlbldpbmRvd0ZyYW1lICk7CisJICAgIFNlbGVjdE9iamVjdDMyKCBoZGMsIEdldFN5c0NvbG9yUGVuMzIoQ09MT1JfV0lORE9XRlJBTUUpICk7CiAJICAgIE1vdmVUbyggaGRjLCByZWN0LmxlZnQsIHJlY3QudG9wICsgU0VQQVJBVE9SX0hFSUdIVC8yICk7CiAJICAgIExpbmVUbzMyKCBoZGMsIHJlY3QucmlnaHQsIHJlY3QudG9wICsgU0VQQVJBVE9SX0hFSUdIVC8yICk7CiAJfQpAQCAtMTA2Nyw3ICsxMDY2LDcgQEAKIAlyZWN0LnJpZ2h0IC09IFBPUFVQX1hTSEFERSAqIFNZU01FVFJJQ1NfQ1hCT1JERVI7CiAvKiAgICB9ICovCiAKLSAgICBpZigoaFByZXZCcnVzaCA9IFNlbGVjdE9iamVjdDMyKCBoZGMsIHN5c0NvbG9yT2JqZWN0cy5oYnJ1c2hNZW51ICkpKQorICAgIGlmKChoUHJldkJydXNoID0gU2VsZWN0T2JqZWN0MzIoIGhkYywgR2V0U3lzQ29sb3JCcnVzaDMyKENPTE9SX01FTlUpICkpKQogICAgIHsKIAlIUEVOMzIgaFByZXZQZW47CiAJCkBAIC0xMTQxLDEwICsxMTQwLDEwIEBACiAgICAgaWYoVFdFQUtfV2luOTVMb29rKQogCSsrbHByZWN0LT5ib3R0b207CiAKLSAgICBGaWxsUmVjdDMyKGhEQywgbHByZWN0LCBzeXNDb2xvck9iamVjdHMuaGJydXNoTWVudSApOworICAgIEZpbGxSZWN0MzIoaERDLCBscHJlY3QsIEdldFN5c0NvbG9yQnJ1c2gzMihDT0xPUl9NRU5VKSApOwogCiAgICAgaWYoIVRXRUFLX1dpbjk1TG9vaykgewotCVNlbGVjdE9iamVjdDMyKCBoREMsIHN5c0NvbG9yT2JqZWN0cy5ocGVuV2luZG93RnJhbWUgKTsKKwlTZWxlY3RPYmplY3QzMiggaERDLCBHZXRTeXNDb2xvclBlbjMyKENPTE9SX1dJTkRPV0ZSQU1FKSApOwogCU1vdmVUbyggaERDLCBscHJlY3QtPmxlZnQsIGxwcmVjdC0+Ym90dG9tICk7CiAJTGluZVRvMzIoIGhEQywgbHByZWN0LT5yaWdodCwgbHByZWN0LT5ib3R0b20gKTsKICAgICB9CkBAIC0xMjI5LDkgKzEyMjgsNiBAQAogCW1lbnUtPkZvY3VzZWRJdGVtID0gTk9fU0VMRUNURURfSVRFTTsKICAgICB9CiAKLSAgICBTZW5kTWVzc2FnZTE2KCBod25kT3duZXIsIFdNX0lOSVRNRU5VUE9QVVAsIChXUEFSQU0xNilobWVudSwKLSAgICAgICAgICAgICAgICAgICBNQUtFTE9ORyggaWQsIChtZW51LT53RmxhZ3MgJiBNRl9TWVNNRU5VKSA/IDEgOiAwICkpOwotCiAgICAgaWYoICh3bmRPd25lciA9IFdJTl9GaW5kV25kUHRyKCBod25kT3duZXIgKSkgKQogICAgIHsKIAlVSU5UMzIJd2lkdGgsIGhlaWdodDsKQEAgLTE0MzgsNyArMTQzNCw3IEBACiAgICAgZWxzZSBpZiAoZmxhZ3MgJiBNRl9PV05FUkRSQVcpIGl0ZW0tPnRleHQgPSAoTFBTVFIpc3RyOwogICAgIGVsc2UgaXRlbS0+dGV4dCA9IE5VTEw7CiAKLSAgICBpZiAoaXRlbS0+ZlR5cGUgJiBNRl9QT1BVUCAmJiBpdGVtLT5oU3ViTWVudSAhPSBpZCApCisgICAgaWYgKChpdGVtLT5mVHlwZSAmIE1GX1BPUFVQKSAmJiAoZmxhZ3MgJiBNRl9QT1BVUCkgJiYgKGl0ZW0tPmhTdWJNZW51ICE9IGlkKSApCiAJRGVzdHJveU1lbnUzMiggaXRlbS0+aFN1Yk1lbnUgKTsgICAvKiBNb2RpZnlNZW51KCkgc3BlYyAqLwogCiAgICAgaWYgKGZsYWdzICYgTUZfUE9QVVApCkBAIC0xNDUzLDEyICsxNDQ5LDE4IEBACiAgICAgICAgICAgICBpdGVtLT5mU3RhdGUgPSAwOwogCSAgICByZXR1cm4gRkFMU0U7CiAgICAgICAgIH0KLSAgICB9CisgICAgfSAKKworICAgIGl0ZW0tPndJRCA9IGlkOworICAgIGlmIChmbGFncyAmIE1GX1BPUFVQKQorICAgICAgaXRlbS0+aFN1Yk1lbnUgPSBpZDsKKworICAgIGlmICgoaXRlbS0+ZlR5cGUgJiBNRl9QT1BVUCkgJiYgIShmbGFncyAmIE1GX1BPUFVQKSApCisgICAgICBmbGFncyB8PSBNRl9QT1BVUDsgLyoga2VlcCBwb3B1cCAqLwogCiAgICAgaXRlbS0+ZlR5cGUgPSBmbGFncyAmIFRZUEVfTUFTSzsKICAgICBpdGVtLT5mU3RhdGUgPSAoZmxhZ3MgJiBTVEFURV9NQVNLKSAmCiAgICAgICAgIH4oTUZfSElMSVRFIHwgTUZfTU9VU0VTRUxFQ1QgfCBNRl9CWVBPU0lUSU9OKTsKLSAgICBpdGVtLT53SUQgPSBpdGVtLT5oU3ViTWVudSA9IGlkOwogCiAgICAgU2V0UmVjdEVtcHR5MzIoICZpdGVtLT5yZWN0ICk7CiAgICAgaWYgKHByZXZUZXh0KSBIZWFwRnJlZSggU3lzdGVtSGVhcCwgMCwgcHJldlRleHQgKTsKQEAgLTE3MTMsNiArMTcxNSw3IEBACiAgICAgUE9QVVBNRU5VICptZW51OwogICAgIE1FTlVJVEVNICppdGVtOwogICAgIFdORCAqd25kUHRyOworICAgIEhEQzMyIGhkYzsKIAogICAgIGlmICghKG1lbnUgPSAoUE9QVVBNRU5VICopIFVTRVJfSEVBUF9MSU5fQUREUiggaG1lbnUgKSkpIHJldHVybiBobWVudTsKIApAQCAtMTcyMiw2ICsxNzI1LDI1IEBACiAgICAgaXRlbSA9ICZtZW51LT5pdGVtc1ttZW51LT5Gb2N1c2VkSXRlbV07CiAgICAgaWYgKCEoaXRlbS0+ZlR5cGUgJiBNRl9QT1BVUCkgfHwKICAgICAgICAgIChpdGVtLT5mU3RhdGUgJiAoTUZfR1JBWUVEIHwgTUZfRElTQUJMRUQpKSkgcmV0dXJuIGhtZW51OworCisgICAgLyogbWVzc2FnZSBtdXN0IGJlIHNlbmQgYmVmb3JlIHVzaW5nIGl0ZW0sCisgICAgICAgYmVjYXVzZSBuZWFybHkgZXZlcnl0aGluZyBtYXkgYnkgY2hhbmdlZCBieSB0aGUgYXBwbGljYXRpb24gISAqLworICAgIHJlY3QgPSBpdGVtLT5yZWN0OworICAgIFNlbmRNZXNzYWdlMTYoIGh3bmRPd25lciwgV01fSU5JVE1FTlVQT1BVUCwgKFdQQVJBTTE2KWl0ZW0tPmhTdWJNZW51LAorCQkgICBNQUtFTE9ORyggbWVudS0+Rm9jdXNlZEl0ZW0sIElTX1NZU1RFTV9NRU5VKG1lbnUpICkpOworCisgICAgLyogY29ycmVjdCBpdGVtIGlmIG1vZGlmaWVkIGFzIGEgcmVhY3Rpb24gdG8gV01fSU5JVE1FTlVQT1BVUC1tZXNzYWdlICovCisgICAgaWYgKCEoaXRlbS0+ZlN0YXRlICYgTUZfSElMSVRFKSkgCisgICAgeworICAgICAgICBpZiAobWVudS0+d0ZsYWdzICYgTUZfUE9QVVApIGhkYyA9IEdldERDMzIoIG1lbnUtPmhXbmQgKTsKKyAgICAgICAgZWxzZSBoZGMgPSBHZXREQ0V4MzIoIG1lbnUtPmhXbmQsIDAsIERDWF9DQUNIRSB8IERDWF9XSU5ET1cpOworICAgICAgICBpdGVtLT5mU3RhdGUgfD0gTUZfSElMSVRFOworICAgICAgICBNRU5VX0RyYXdNZW51SXRlbSggbWVudS0+aFduZCwgaGRjLCBpdGVtLCBtZW51LT5IZWlnaHQsICEobWVudS0+d0ZsYWdzICYgTUZfUE9QVVApICk7IAorCVJlbGVhc2VEQzMyKCBtZW51LT5oV25kLCBoZGMgKTsKKyAgICB9CisgICAgaWYgKCFpdGVtLT5yZWN0LnRvcCAmJiAhaXRlbS0+cmVjdC5sZWZ0ICYmICFpdGVtLT5yZWN0LmJvdHRvbSAmJiAhaXRlbS0+cmVjdC5yaWdodCkKKyAgICAgIGl0ZW0tPnJlY3QgPSByZWN0OworCiAgICAgaXRlbS0+ZlN0YXRlIHw9IE1GX01PVVNFU0VMRUNUOwogCiAgICAgaWYgKElTX1NZU1RFTV9NRU5VKG1lbnUpKQpAQCAtMjUyNCw2ICsyNTQ2LDcgQEAKICAgICBCT09MMzIgcmV0ID0gRkFMU0U7CiAKICAgICBIaWRlQ2FyZXQzMigwKTsKKyAgICBTZW5kTWVzc2FnZTE2KCBoV25kLCBXTV9JTklUTUVOVVBPUFVQLCAoV1BBUkFNMTYpaE1lbnUsIDApOwogICAgIGlmIChNRU5VX1Nob3dQb3B1cCggaFduZCwgaE1lbnUsIDAsIHgsIHksIDAsIDAgKSkgCiAJcmV0ID0gTUVOVV9UcmFja01lbnUoIGhNZW51LCB3RmxhZ3MgJiB+VFBNX0lOVEVSTkFMLCAwLCAwLCBoV25kLCBscFJlY3QgKTsKICAgICBTaG93Q2FyZXQzMigwKTsKQEAgLTI5NDcsOCArMjk3MCw2IEBACiAKICAgICBpZiAoIShtZW51ID0gKExQUE9QVVBNRU5VKSBVU0VSX0hFQVBfTElOX0FERFIoaE1lbnUpKSkgcmV0dXJuIC0xOwogICAgIGlmICgoblBvcyA8IDApIHx8IChuUG9zID49IG1lbnUtPm5JdGVtcykpIHJldHVybiAtMTsKLSAgICAvKiBGSVhNRTogTm93IHRoYXQgc3VibWVudXMgY2FuIGhhdmUgaWRzLCBpcyB0aGlzIHN0aWxsIHJpZ2h0PyAgKi8KLSAgICBpZiAobWVudS0+aXRlbXNbblBvc10uZlR5cGUgJiBNRl9QT1BVUCkgcmV0dXJuIC0xOwogICAgIHJldHVybiBtZW51LT5pdGVtc1tuUG9zXS53SUQ7CiB9CiAKZGlmZiAtLWdpdCBhL2NvbnRyb2xzL3Byb2dyZXNzLmMgYi9jb250cm9scy9wcm9ncmVzcy5jCmluZGV4IGMwMzExZTIuLjZhNmUzODggMTAwNjQ0Ci0tLSBhL2NvbnRyb2xzL3Byb2dyZXNzLmMKKysrIGIvY29udHJvbHMvcHJvZ3Jlc3MuYwpAQCAtMTIsNyArMTIsNiBAQAogI2luY2x1ZGUgPHN0ZGxpYi5oPgogI2luY2x1ZGUgPHN0ZGlvLmg+CiAjaW5jbHVkZSAid2luZG93cy5oIgotI2luY2x1ZGUgInN5c2NvbG9yLmgiCiAjaW5jbHVkZSAic3lzbWV0cmljcy5oIgogI2luY2x1ZGUgInByb2dyZXNzLmgiCiAjaW5jbHVkZSAiZ3JhcGhpY3MuaCIKZGlmZiAtLWdpdCBhL2NvbnRyb2xzL3Njcm9sbC5jIGIvY29udHJvbHMvc2Nyb2xsLmMKaW5kZXggNGI3ODY3ZS4uYTY3OGQ4YSAxMDA2NDQKLS0tIGEvY29udHJvbHMvc2Nyb2xsLmMKKysrIGIvY29udHJvbHMvc2Nyb2xsLmMKQEAgLTEwLDcgKzEwLDYgQEAKICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KICNpbmNsdWRlIDxzeXMvc3RhdC5oPgogI2luY2x1ZGUgIndpbmRvd3MuaCIKLSNpbmNsdWRlICJzeXNjb2xvci5oIgogI2luY2x1ZGUgInN5c21ldHJpY3MuaCIKICNpbmNsdWRlICJzY3JvbGwuaCIKICNpbmNsdWRlICJncmFwaGljcy5oIgpAQCAtMzg4LDExICszODcsMTEgQEAKIAogICAgICAgLyogU2VsZWN0IHRoZSBjb3JyZWN0IGJydXNoIGFuZCBwZW4gKi8KIAotICAgIFNlbGVjdE9iamVjdDMyKCBoZGMsIHN5c0NvbG9yT2JqZWN0cy5ocGVuV2luZG93RnJhbWUgKTsKKyAgICBTZWxlY3RPYmplY3QzMiggaGRjLCBHZXRTeXNDb2xvclBlbjMyKENPTE9SX1dJTkRPV0ZSQU1FKSApOwogICAgIGlmICgoZmxhZ3MgJiBFU0JfRElTQUJMRV9CT1RIKSA9PSBFU0JfRElTQUJMRV9CT1RIKQogICAgIHsKICAgICAgICAgICAvKiBUaGlzIG91Z2h0IHRvIGJlIHRoZSBjb2xvciBvZiB0aGUgcGFyZW50IHdpbmRvdyAqLwotICAgICAgICBTZWxlY3RPYmplY3QzMiggaGRjLCBzeXNDb2xvck9iamVjdHMuaGJydXNoV2luZG93ICk7CisgICAgICAgIFNlbGVjdE9iamVjdDMyKCBoZGMsIEdldFN5c0NvbG9yQnJ1c2gzMihDT0xPUl9XSU5ET1cpICk7CiAgICAgfQogICAgIGVsc2UKICAgICB7CkBAIC00MDIsNyArNDAxLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdNX0NUTENPTE9SU0NST0xMQkFSLCBoZGMsIGh3bmQgKTsKICAgICAgICAgICAgIFNlbGVjdE9iamVjdDMyKCBoZGMsIGhicnVzaCApOwogICAgICAgICB9Ci0gICAgICAgIGVsc2UgU2VsZWN0T2JqZWN0MzIoIGhkYywgc3lzQ29sb3JPYmplY3RzLmhicnVzaFNjcm9sbGJhciApOworICAgICAgICBlbHNlIFNlbGVjdE9iamVjdDMyKCBoZGMsIEdldFN5c0NvbG9yQnJ1c2gzMihDT0xPUl9TQ1JPTExCQVIpICk7CiAgICAgfQogCiAgICAgICAvKiBDYWxjdWxhdGUgdGhlIHNjcm9sbCByZWN0YW5nbGUgKi8KQEAgLTQ2Myw3ICs0NjIsNyBAQAogCiAgICAgICAvKiBEcmF3IHRoZSB0aHVtYiAqLwogCi0gICAgU2VsZWN0T2JqZWN0MzIoIGhkYywgc3lzQ29sb3JPYmplY3RzLmhicnVzaEJ0bkZhY2UgKTsKKyAgICBTZWxlY3RPYmplY3QzMiggaGRjLCBHZXRTeXNDb2xvckJydXNoMzIoQ09MT1JfQlRORkFDRSkgKTsKICAgICBSZWN0YW5nbGUzMiggaGRjLCByLmxlZnQsIHIudG9wLCByLnJpZ2h0LCByLmJvdHRvbSApOwogICAgIEluZmxhdGVSZWN0MzIoICZyLCAtMSwgLTEgKTsKICAgICBHUkFQSF9EcmF3UmVsaWVmUmVjdCggaGRjLCAmciwgMSwgMiwgRkFMU0UgKTsKQEAgLTkwMyw3ICs5MDIsNyBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgU2V0U2Nyb2xsSW5mbzMyICAgKFVTRVIzMi41MDApCisgKiAgICAgICAgICAgU2V0U2Nyb2xsSW5mbzMyICAgKFVTRVIzMi41MDEpCiAgKi8KIElOVDMyIFdJTkFQSSBTZXRTY3JvbGxJbmZvMzIoIEhXTkQzMiBod25kLCBJTlQzMiBuQmFyLCBjb25zdCBTQ1JPTExJTkZPICppbmZvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQk9PTDMyIGJSZWRyYXcgKQpAQCAtMTA1MSw3ICsxMDUwLDcgQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIFNldFNjcm9sbFBvczMyICAgKFVTRVIzMi41MDEpCisgKiAgICAgICAgICAgU2V0U2Nyb2xsUG9zMzIgICAoVVNFUjMyLjUwMikKICAqLwogSU5UMzIgV0lOQVBJIFNldFNjcm9sbFBvczMyKCBIV05EMzIgaHduZCwgSU5UMzIgbkJhciwgSU5UMzIgblBvcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQk9PTDMyIGJSZWRyYXcgKQpAQCAtMTEwNCw3ICsxMTAzLDcgQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIFNldFNjcm9sbFJhbmdlMzIgICAoVVNFUjMyLjUwMikKKyAqICAgICAgICAgICBTZXRTY3JvbGxSYW5nZTMyICAgKFVTRVIzMi41MDMpCiAgKi8KIEJPT0wzMiBXSU5BUEkgU2V0U2Nyb2xsUmFuZ2UzMiggSFdORDMyIGh3bmQsIElOVDMyIG5CYXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVDMyIE1pblZhbCwgSU5UMzIgTWF4VmFsLCBCT09MMzIgYlJlZHJhdyApCmRpZmYgLS1naXQgYS9jb250cm9scy91aXRvb2xzLmMgYi9jb250cm9scy91aXRvb2xzLmMKaW5kZXggZTNjNjRkZS4uMTU3NzlhMSAxMDA2NDQKLS0tIGEvY29udHJvbHMvdWl0b29scy5jCisrKyBiL2NvbnRyb2xzL3VpdG9vbHMuYwpAQCAtMTY2LDggKzE2Niw4IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBpZihJbm5lckkgIT0gLTEpIElubmVyUGVuID0gQ3JlYXRlUGVuMzIoUFNfU09MSUQsIDAsIEdldFN5c0NvbG9yMzIoKGludClJbm5lckkpKTsKLSAgICBpZihPdXRlckkgIT0gLTEpIE91dGVyUGVuID0gQ3JlYXRlUGVuMzIoUFNfU09MSUQsIDAsIEdldFN5c0NvbG9yMzIoKGludClPdXRlckkpKTsKKyAgICBpZihJbm5lckkgIT0gLTEpIElubmVyUGVuID0gR2V0U3lzQ29sb3JQZW4zMihJbm5lckkpOworICAgIGlmKE91dGVySSAhPSAtMSkgT3V0ZXJQZW4gPSBHZXRTeXNDb2xvclBlbjMyKE91dGVySSk7CiAKICAgICBNb3ZlVG9FeDMyKGhkYywgMCwgMCwgJlNhdmVQb2ludCk7CiAKQEAgLTMxNSwxNyArMzE1LDE2IEBACiAgICAgaWYoKHVGbGFncyAmIEJGX01JRERMRSkgJiYgcmV0dmFsKQogICAgIHsKICAgICAgICAgSEJSVVNIMzIgaGJzYXZlOwotICAgICAgICBIQlJVU0gzMiBoYiA9IHVGbGFncyAmIEJGX01PTk8gPyBHZXRTeXNDb2xvckJydXNoMzIoQ09MT1JfV0lORE9XKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBHZXRTeXNDb2xvckJydXNoMzIoQ09MT1JfQlRORkFDRSk7CisgICAgICAgIEhCUlVTSDMyIGhiID0gR2V0U3lzQ29sb3JCcnVzaDMyKHVGbGFncyAmIEJGX01PTk8gPyBDT0xPUl9XSU5ET1cKKwkJCQkJIDpDT0xPUl9CVE5GQUNFKTsKICAgICAgICAgSFBFTjMyIGhwc2F2ZTsKLSAgICAgICAgSFBFTjMyIGhwID0gQ3JlYXRlUGVuMzIoUFNfU09MSUQsIDAsIHVGbGFncyAmIEJGX01PTk8gPyBHZXRTeXNDb2xvcjMyKENPTE9SX1dJTkRPVykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBHZXRTeXNDb2xvcjMyKENPTE9SX0JUTkZBQ0UpKTsKKyAgICAgICAgSFBFTjMyIGhwID0gR2V0U3lzQ29sb3JQZW4zMih1RmxhZ3MgJiBCRl9NT05PID8gQ09MT1JfV0lORE9XCisJCQkJICAgICA6IENPTE9SX0JUTkZBQ0UpOwogICAgICAgICBoYnNhdmUgPSAoSEJSVVNIMzIpU2VsZWN0T2JqZWN0MzIoaGRjLCBoYik7CiAgICAgICAgIGhwc2F2ZSA9IChIUEVOMzIpU2VsZWN0T2JqZWN0MzIoaGRjLCBocCk7CiAgICAgICAgIFBvbHlnb24zMihoZGMsIFBvaW50cywgNCk7CiAgICAgICAgIFNlbGVjdE9iamVjdDMyKGhkYywgaGJzYXZlKTsKICAgICAgICAgU2VsZWN0T2JqZWN0MzIoaGRjLCBocHNhdmUpOwotICAgICAgICBEZWxldGVPYmplY3QzMihocCk7CiAgICAgfQogCiAgICAgLyogQWRqdXN0IHJlY3RhbmdsZSBpZiBhc2tlZCAqLwpAQCAtMzM5LDggKzMzOCw2IEBACiAKICAgICAvKiBDbGVhbnVwICovCiAgICAgU2VsZWN0T2JqZWN0MzIoaGRjLCBTYXZlUGVuKTsKLSAgICBpZihJbm5lckkgIT0gLTEpIERlbGV0ZU9iamVjdDMyKElubmVyUGVuKTsKLSAgICBpZihPdXRlckkgIT0gLTEpIERlbGV0ZU9iamVjdDMyKE91dGVyUGVuKTsKICAgICBNb3ZlVG9FeDMyKGhkYywgU2F2ZVBvaW50LngsIFNhdmVQb2ludC55LCBOVUxMKTsKIAogICAgIHJldHVybiByZXR2YWw7CkBAIC00NzksMTUgKzQ3NiwxNSBAQAogICAgIGlmKCh1RmxhZ3MgJiBCRl9CT1RUT01SSUdIVCkgPT0gQkZfQk9UVE9NUklHSFQpIFJCcGVucGx1cyA9IDE7CiAgICAgaWYoKHVGbGFncyAmIEJGX1RPUExFRlQpID09IEJGX1RPUExFRlQpICAgICAgICAgTFRwZW5wbHVzID0gMTsKIAotICAgIGlmKExUSW5uZXJJICE9IC0xKSBMVElubmVyUGVuID0gQ3JlYXRlUGVuMzIoUFNfU09MSUQsIDAsIEdldFN5c0NvbG9yMzIoKGludClMVElubmVySSkpOwotICAgIGlmKExUT3V0ZXJJICE9IC0xKSBMVE91dGVyUGVuID0gQ3JlYXRlUGVuMzIoUFNfU09MSUQsIDAsIEdldFN5c0NvbG9yMzIoKGludClMVE91dGVySSkpOwotICAgIGlmKFJCSW5uZXJJICE9IC0xKSBSQklubmVyUGVuID0gQ3JlYXRlUGVuMzIoUFNfU09MSUQsIDAsIEdldFN5c0NvbG9yMzIoKGludClSQklubmVySSkpOwotICAgIGlmKFJCT3V0ZXJJICE9IC0xKSBSQk91dGVyUGVuID0gQ3JlYXRlUGVuMzIoUFNfU09MSUQsIDAsIEdldFN5c0NvbG9yMzIoKGludClSQk91dGVySSkpOworICAgIGlmKExUSW5uZXJJICE9IC0xKSBMVElubmVyUGVuID0gR2V0U3lzQ29sb3JQZW4zMihMVElubmVySSk7CisgICAgaWYoTFRPdXRlckkgIT0gLTEpIExUT3V0ZXJQZW4gPSBHZXRTeXNDb2xvclBlbjMyKExUT3V0ZXJJKTsKKyAgICBpZihSQklubmVySSAhPSAtMSkgUkJJbm5lclBlbiA9IEdldFN5c0NvbG9yUGVuMzIoUkJJbm5lckkpOworICAgIGlmKFJCT3V0ZXJJICE9IC0xKSBSQk91dGVyUGVuID0gR2V0U3lzQ29sb3JQZW4zMihSQk91dGVySSk7CiAKICAgICBpZigodUZsYWdzICYgQkZfTUlERExFKSAmJiByZXR2YWwpCiAgICAgewotICAgICAgICBGaWxsUmVjdDMyKGhkYywgJklubmVyUmVjdCwgKHVGbGFncyAmIEJGX01PTk8pID8gR2V0U3lzQ29sb3JCcnVzaDMyKENPTE9SX1dJTkRPVykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IEdldFN5c0NvbG9yQnJ1c2gzMihDT0xPUl9CVE5GQUNFKSk7CisgICAgICAgIEZpbGxSZWN0MzIoaGRjLCAmSW5uZXJSZWN0LCBHZXRTeXNDb2xvckJydXNoMzIodUZsYWdzICYgQkZfTU9OTyA/IAorCQkJCQkgICAgQ09MT1JfV0lORE9XIDogQ09MT1JfQlRORkFDRSkpOwogICAgIH0KIAogICAgIE1vdmVUb0V4MzIoaGRjLCAwLCAwLCAmU2F2ZVBvaW50KTsKQEAgLTU1MywxMCArNTUwLDYgQEAKIAogICAgIC8qIENsZWFudXAgKi8KICAgICBTZWxlY3RPYmplY3QzMihoZGMsIFNhdmVQZW4pOwotICAgIGlmKExUSW5uZXJJICE9IC0xKSBEZWxldGVPYmplY3QzMihMVElubmVyUGVuKTsKLSAgICBpZihMVE91dGVySSAhPSAtMSkgRGVsZXRlT2JqZWN0MzIoTFRPdXRlclBlbik7Ci0gICAgaWYoUkJJbm5lckkgIT0gLTEpIERlbGV0ZU9iamVjdDMyKFJCSW5uZXJQZW4pOwotICAgIGlmKFJCT3V0ZXJJICE9IC0xKSBEZWxldGVPYmplY3QzMihSQk91dGVyUGVuKTsKICAgICBNb3ZlVG9FeDMyKGhkYywgU2F2ZVBvaW50LngsIFNhdmVQb2ludC55LCBOVUxMKTsKICAgICByZXR1cm4gcmV0dmFsOwogfQpAQCAtNzcxLDcgKzc2NCw3IEBACiAgICAgICAgIFBPSU5UMzIgQ2hlY2tQb2ludHNbREZDX0NIRUNLUE9JTlRTTUFYXTsKICAgICAgICAgaW50IGk7CiAgICAgICAgIEhCUlVTSDMyIGhic2F2ZTsKLSAgICAgICAgSFBFTjMyIGhwLCBocHNhdmU7CisgICAgICAgIEhQRU4zMiBocHNhdmU7CiAKICAgICAgICAgLyogRklYTUU6IFRoaXMgY29tZXMgdmVyeSBjbG9zZSB0byBNJCdzIGNoZWNrbWFyaywgYnV0IG5vdCAqLwogICAgICAgICAvKiBleGFjdGx5Li4uIFdoZW4gc21hbGwgb3IgbGFyZ2UgdGhlcmUgaXMgYSBmZXcgcGl4ZWxzICovCkBAIC03OTIsMTIgKzc4NSwxMCBAQAogCiAgICAgICAgIGkgPSAodUZsYWdzICYgREZDU19JTkFDVElWRSkgfHwgKHVGbGFncyAmIDB4ZmYpID09IERGQ1NfQlVUVE9OM1NUQVRFID8gQ09MT1JfQlROU0hBRE9XIDogQ09MT1JfV0lORE9XVEVYVDsKICAgICAgICAgaGJzYXZlID0gKEhCUlVTSDMyKVNlbGVjdE9iamVjdDMyKGRjLCBHZXRTeXNDb2xvckJydXNoMzIoaSkpOwotICAgICAgICBocCA9IENyZWF0ZVBlbjMyKFBTX1NPTElELCAwLCBHZXRTeXNDb2xvcjMyKGkpKTsKLSAgICAgICAgaHBzYXZlID0gKEhQRU4zMilTZWxlY3RPYmplY3QzMihkYywgaHApOworICAgICAgICBocHNhdmUgPSAoSFBFTjMyKVNlbGVjdE9iamVjdDMyKGRjLCBHZXRTeXNDb2xvclBlbjMyKGkpKTsKICAgICAgICAgUG9seWdvbjMyKGRjLCBDaGVja1BvaW50cywgREZDX0NIRUNLUE9JTlRTTUFYKTsKICAgICAgICAgU2VsZWN0T2JqZWN0MzIoZGMsIGhwc2F2ZSk7CiAgICAgICAgIFNlbGVjdE9iamVjdDMyKGRjLCBoYnNhdmUpOwotICAgICAgICBEZWxldGVPYmplY3QzMihocCk7CiAgICAgfQogICAgIHJldHVybiBUUlVFOwogfQpAQCAtODE4LDcgKzgwOSw3IEBACiAgICAgaW50IGk7CiAgICAgaW50IFNtYWxsRGlhbSA9IFVJVE9PTFNfTWFrZVNxdWFyZVJlY3QociwgJm15cik7CiAgICAgaW50IEJvcmRlclNocmluayA9IFNtYWxsRGlhbSAvIDE2OwotICAgIEhQRU4zMiBocHNhdmUsIGhwOworICAgIEhQRU4zMiBocHNhdmU7CiAgICAgSEJSVVNIMzIgaGJzYXZlOwogICAgIGludCB4ZSwgeWU7CiAgICAgaW50IHhjLCB5YzsKQEAgLTg1Myw1MiArODQ0LDM2IEBACiAgICAgewogICAgICAgICBpZih1RmxhZ3MgJiAoREZDU19GTEFUfERGQ1NfTU9OTykpCiAgICAgICAgIHsKLSAgICAgICAgICAgIGhwID0gQ3JlYXRlUGVuMzIoUFNfU09MSUQsIDAsIEdldFN5c0NvbG9yMzIoQ09MT1JfV0lORE9XRlJBTUUpKTsKLSAgICAgICAgICAgIGhwc2F2ZSA9IChIUEVOMzIpU2VsZWN0T2JqZWN0MzIoZGMsIGhwKTsKKyAgICAgICAgICAgIGhwc2F2ZSA9IChIUEVOMzIpU2VsZWN0T2JqZWN0MzIoZGMsIEdldFN5c0NvbG9yUGVuMzIoQ09MT1JfV0lORE9XRlJBTUUpKTsKICAgICAgICAgICAgIGhic2F2ZSA9IChIQlJVU0gzMilTZWxlY3RPYmplY3QzMihkYywgR2V0U3lzQ29sb3JCcnVzaDMyKENPTE9SX1dJTkRPV0ZSQU1FKSk7CiAgICAgICAgICAgICBQaWUzMihkYywgbXlyLmxlZnQsIG15ci50b3AsIG15ci5yaWdodCwgbXlyLmJvdHRvbSwgeGUsIHllLCB4ZSwgeWUpOwogICAgICAgICAgICAgU2VsZWN0T2JqZWN0MzIoZGMsIGhic2F2ZSk7CiAgICAgICAgICAgICBTZWxlY3RPYmplY3QzMihkYywgaHBzYXZlKTsKLSAgICAgICAgICAgIERlbGV0ZU9iamVjdDMyKGhwKTsKICAgICAgICAgfQogICAgICAgICBlbHNlCiAgICAgICAgIHsKLSAgICAgICAgICAgIGhwID0gQ3JlYXRlUGVuMzIoUFNfU09MSUQsIDAsIEdldFN5c0NvbG9yMzIoQ09MT1JfQlROSElHSExJR0hUKSk7Ci0gICAgICAgICAgICBocHNhdmUgPSAoSFBFTjMyKVNlbGVjdE9iamVjdDMyKGRjLCBocCk7CisgICAgICAgICAgICBocHNhdmUgPSAoSFBFTjMyKVNlbGVjdE9iamVjdDMyKGRjLCBHZXRTeXNDb2xvclBlbjMyKENPTE9SX0JUTkhJR0hMSUdIVCkpOwogICAgICAgICAgICAgaGJzYXZlID0gKEhCUlVTSDMyKVNlbGVjdE9iamVjdDMyKGRjLCBHZXRTeXNDb2xvckJydXNoMzIoQ09MT1JfQlROSElHSExJR0hUKSk7CiAgICAgICAgICAgICBQaWUzMihkYywgbXlyLmxlZnQsIG15ci50b3AsIG15ci5yaWdodCwgbXlyLmJvdHRvbSwgbXlyLmxlZnQtMSwgbXlyLmJvdHRvbSwgbXlyLnJpZ2h0LTEsIG15ci50b3ApOwotICAgICAgICAgICAgU2VsZWN0T2JqZWN0MzIoZGMsIGhic2F2ZSk7Ci0gICAgICAgICAgICBTZWxlY3RPYmplY3QzMihkYywgaHBzYXZlKTsKLSAgICAgICAgICAgIERlbGV0ZU9iamVjdDMyKGhwKTsKIAotICAgICAgICAgICAgaHAgPSBDcmVhdGVQZW4zMihQU19TT0xJRCwgMCwgR2V0U3lzQ29sb3IzMihDT0xPUl9CVE5TSEFET1cpKTsKLSAgICAgICAgICAgIGhwc2F2ZSA9IChIUEVOMzIpU2VsZWN0T2JqZWN0MzIoZGMsIGhwKTsKLSAgICAgICAgICAgIGhic2F2ZSA9IChIQlJVU0gzMilTZWxlY3RPYmplY3QzMihkYywgR2V0U3lzQ29sb3JCcnVzaDMyKENPTE9SX0JUTlNIQURPVykpOworICAgICAgICAgICAgU2VsZWN0T2JqZWN0MzIoZGMsIEdldFN5c0NvbG9yUGVuMzIoQ09MT1JfQlROU0hBRE9XKSk7CisgICAgICAgICAgICBTZWxlY3RPYmplY3QzMihkYywgR2V0U3lzQ29sb3JCcnVzaDMyKENPTE9SX0JUTlNIQURPVykpOwogICAgICAgICAgICAgUGllMzIoZGMsIG15ci5sZWZ0LCBteXIudG9wLCBteXIucmlnaHQsIG15ci5ib3R0b20sIG15ci5yaWdodCsxLCBteXIudG9wLCBteXIubGVmdCsxLCBteXIuYm90dG9tKTsKLSAgICAgICAgICAgIFNlbGVjdE9iamVjdDMyKGRjLCBoYnNhdmUpOwotICAgICAgICAgICAgU2VsZWN0T2JqZWN0MzIoZGMsIGhwc2F2ZSk7Ci0gICAgICAgICAgICBEZWxldGVPYmplY3QzMihocCk7CiAKICAgICAgICAgICAgIG15ci5sZWZ0ICAgKz0gQm9yZGVyU2hyaW5rOwogICAgICAgICAgICAgbXlyLnJpZ2h0ICAtPSBCb3JkZXJTaHJpbms7CiAgICAgICAgICAgICBteXIudG9wICAgICs9IEJvcmRlclNocmluazsKICAgICAgICAgICAgIG15ci5ib3R0b20gLT0gQm9yZGVyU2hyaW5rOwogCi0gICAgICAgICAgICBocCA9IENyZWF0ZVBlbjMyKFBTX1NPTElELCAwLCBHZXRTeXNDb2xvcjMyKENPTE9SXzNETElHSFQpKTsKLSAgICAgICAgICAgIGhwc2F2ZSA9IChIUEVOMzIpU2VsZWN0T2JqZWN0MzIoZGMsIGhwKTsKLSAgICAgICAgICAgIGhic2F2ZSA9IChIQlJVU0gzMilTZWxlY3RPYmplY3QzMihkYywgR2V0U3lzQ29sb3JCcnVzaDMyKENPTE9SXzNETElHSFQpKTsKKyAgICAgICAgICAgIFNlbGVjdE9iamVjdDMyKGRjLCBHZXRTeXNDb2xvclBlbjMyKENPTE9SXzNETElHSFQpKTsKKyAgICAgICAgICAgIFNlbGVjdE9iamVjdDMyKGRjLCBHZXRTeXNDb2xvckJydXNoMzIoQ09MT1JfM0RMSUdIVCkpOwogICAgICAgICAgICAgUGllMzIoZGMsIG15ci5sZWZ0LCBteXIudG9wLCBteXIucmlnaHQsIG15ci5ib3R0b20sIG15ci5sZWZ0LTEsIG15ci5ib3R0b20sIG15ci5yaWdodC0xLCBteXIudG9wKTsKLSAgICAgICAgICAgIFNlbGVjdE9iamVjdDMyKGRjLCBoYnNhdmUpOwotICAgICAgICAgICAgU2VsZWN0T2JqZWN0MzIoZGMsIGhwc2F2ZSk7Ci0gICAgICAgICAgICBEZWxldGVPYmplY3QzMihocCk7CiAKLSAgICAgICAgICAgIGhwID0gQ3JlYXRlUGVuMzIoUFNfU09MSUQsIDAsIEdldFN5c0NvbG9yMzIoQ09MT1JfM0RES1NIQURPVykpOwotICAgICAgICAgICAgaHBzYXZlID0gKEhQRU4zMilTZWxlY3RPYmplY3QzMihkYywgaHApOwotICAgICAgICAgICAgaGJzYXZlID0gKEhCUlVTSDMyKVNlbGVjdE9iamVjdDMyKGRjLCBHZXRTeXNDb2xvckJydXNoMzIoQ09MT1JfM0RES1NIQURPVykpOworICAgICAgICAgICAgU2VsZWN0T2JqZWN0MzIoZGMsIEdldFN5c0NvbG9yUGVuMzIoQ09MT1JfM0RES1NIQURPVykpOworICAgICAgICAgICAgU2VsZWN0T2JqZWN0MzIoZGMsIEdldFN5c0NvbG9yQnJ1c2gzMihDT0xPUl8zRERLU0hBRE9XKSk7CiAgICAgICAgICAgICBQaWUzMihkYywgbXlyLmxlZnQsIG15ci50b3AsIG15ci5yaWdodCwgbXlyLmJvdHRvbSwgbXlyLnJpZ2h0KzEsIG15ci50b3AsIG15ci5sZWZ0KzEsIG15ci5ib3R0b20pOwogICAgICAgICAgICAgU2VsZWN0T2JqZWN0MzIoZGMsIGhic2F2ZSk7CiAgICAgICAgICAgICBTZWxlY3RPYmplY3QzMihkYywgaHBzYXZlKTsKLSAgICAgICAgICAgIERlbGV0ZU9iamVjdDMyKGhwKTsKICAgICAgICAgfQogCiAgICAgICAgIGkgPSAxMCpTbWFsbERpYW0vMTY7CkBAIC05MDcsMTMgKzg4MiwxMSBAQAogICAgICAgICBteXIudG9wICAgID0geWMgLSBpK2kvMjsKICAgICAgICAgbXlyLmJvdHRvbSA9IHljICsgaS8yOwogICAgICAgICBpPSAhKHVGbGFncyAmIChERkNTX0lOQUNUSVZFfERGQ1NfUFVTSEVEKSkgPyBDT0xPUl9XSU5ET1cgOiBDT0xPUl9CVE5GQUNFOwotICAgICAgICBocCA9IENyZWF0ZVBlbjMyKFBTX1NPTElELCAwLCBHZXRTeXNDb2xvcjMyKGkpKTsKLSAgICAgICAgaHBzYXZlID0gKEhQRU4zMilTZWxlY3RPYmplY3QzMihkYywgaHApOworICAgICAgICBocHNhdmUgPSAoSFBFTjMyKVNlbGVjdE9iamVjdDMyKGRjLCBHZXRTeXNDb2xvclBlbjMyKGkpKTsKICAgICAgICAgaGJzYXZlID0gKEhCUlVTSDMyKVNlbGVjdE9iamVjdDMyKGRjLCBHZXRTeXNDb2xvckJydXNoMzIoaSkpOwogICAgICAgICBQaWUzMihkYywgbXlyLmxlZnQsIG15ci50b3AsIG15ci5yaWdodCwgbXlyLmJvdHRvbSwgeGUsIHllLCB4ZSwgeWUpOwogICAgICAgICBTZWxlY3RPYmplY3QzMihkYywgaGJzYXZlKTsKICAgICAgICAgU2VsZWN0T2JqZWN0MzIoZGMsIGhwc2F2ZSk7Ci0gICAgICAgIERlbGV0ZU9iamVjdDMyKGhwKTsKICAgICB9CiAKICAgICBpZih1RmxhZ3MgJiBERkNTX0NIRUNLRUQpCkBAIC05MjcsMTIgKzkwMCwxMCBAQAogCiAgICAgICAgIGkgPSB1RmxhZ3MgJiBERkNTX0lOQUNUSVZFID8gQ09MT1JfQlROU0hBRE9XIDogQ09MT1JfV0lORE9XVEVYVDsKICAgICAgICAgaGJzYXZlID0gKEhCUlVTSDMyKVNlbGVjdE9iamVjdDMyKGRjLCBHZXRTeXNDb2xvckJydXNoMzIoaSkpOwotICAgICAgICBocCA9IENyZWF0ZVBlbjMyKFBTX1NPTElELCAwLCBHZXRTeXNDb2xvcjMyKGkpKTsKLSAgICAgICAgaHBzYXZlID0gKEhQRU4zMilTZWxlY3RPYmplY3QzMihkYywgaHApOworICAgICAgICBocHNhdmUgPSAoSFBFTjMyKVNlbGVjdE9iamVjdDMyKGRjLCBHZXRTeXNDb2xvclBlbjMyKGkpKTsKICAgICAgICAgUGllMzIoZGMsIG15ci5sZWZ0LCBteXIudG9wLCBteXIucmlnaHQsIG15ci5ib3R0b20sIHhlLCB5ZSwgeGUsIHllKTsKICAgICAgICAgU2VsZWN0T2JqZWN0MzIoZGMsIGhwc2F2ZSk7CiAgICAgICAgIFNlbGVjdE9iamVjdDMyKGRjLCBoYnNhdmUpOwotICAgICAgICBEZWxldGVPYmplY3QzMihocCk7CiAgICAgfQogCiAgICAgLyogRklYTUU6IE0kIGhhcyBhIHBvbHlnb24gaW4gdGhlIGNlbnRlciBhdCByZWxhdGl2ZSBwb2ludHM6ICovCkBAIC05OTIsNyArOTYzLDcgQEAKICAgICBpbnQgU21hbGxEaWFtID0gVUlUT09MU19NYWtlU3F1YXJlUmVjdChyLCAmbXlyKS0yOwogICAgIGludCBpOwogICAgIEhCUlVTSDMyIGhic2F2ZTsKLSAgICBIUEVOMzIgaHBzYXZlLCBocDsKKyAgICBIUEVOMzIgaHBzYXZlOwogICAgIEhGT05UMzIgaGZzYXZlLCBoZjsKICAgICBpbnQgeGMgPSAobXlyLmxlZnQrbXlyLnJpZ2h0KS8yOwogICAgIGludCB5YyA9IChteXIudG9wK215ci5ib3R0b20pLzI7CkBAIC0xMTE1LDE0ICsxMDg2LDEyIEBACiAgICAgewogICAgICAgICAvKiBJZiB3ZSBoYXZlIGFuIGluYWN0aXZlIGJ1dHRvbiwgdGhlbiB5b3Ugc2VlIGEgc2hhZG93ICovCiAgICAgICAgIGhic2F2ZSA9IChIQlJVU0gzMilTZWxlY3RPYmplY3QzMihkYywgR2V0U3lzQ29sb3JCcnVzaDMyKENPTE9SX0JUTkhJR0hMSUdIVCkpOwotICAgICAgICBocCA9IENyZWF0ZVBlbjMyKFBTX1NPTElELCAwLCBHZXRTeXNDb2xvcjMyKENPTE9SX0JUTkhJR0hMSUdIVCkpOwotICAgICAgICBocHNhdmUgPSAoSFBFTjMyKVNlbGVjdE9iamVjdDMyKGRjLCBocCk7CisgICAgICAgIGhwc2F2ZSA9IChIUEVOMzIpU2VsZWN0T2JqZWN0MzIoZGMsIEdldFN5c0NvbG9yUGVuMzIoQ09MT1JfQlROSElHSExJR0hUKSk7CiAgICAgICAgIFBvbHlnb24zMihkYywgTGluZTEsIExpbmUxTik7CiAgICAgICAgIGlmKExpbmUyTiA+IDApCiAgICAgICAgICAgICBQb2x5Z29uMzIoZGMsIExpbmUyLCBMaW5lMk4pOwogICAgICAgICBTZWxlY3RPYmplY3QzMihkYywgaHBzYXZlKTsKICAgICAgICAgU2VsZWN0T2JqZWN0MzIoZGMsIGhic2F2ZSk7Ci0gICAgICAgIERlbGV0ZU9iamVjdDMyKGhwKTsKICAgICB9CiAKICAgICAvKiBDb3JyZWN0IGZvciB0aGUgc2hhZG93IHNoaWZ0ICovCkBAIC0xMTM4LDIzICsxMTA3LDE1IEBACiAgICAgfQogCiAgICAgLyogTWFrZSB0aGUgZmluYWwgcGljdHVyZSAqLwotICAgIGlmKHVGbGFncyAmIERGQ1NfSU5BQ1RJVkUpCi0gICAgewotICAgICAgICBoYnNhdmUgPSAoSEJSVVNIMzIpU2VsZWN0T2JqZWN0MzIoZGMsIEdldFN5c0NvbG9yQnJ1c2gzMihDT0xPUl9CVE5TSEFET1cpKTsKLSAgICAgICAgaHAgPSBDcmVhdGVQZW4zMihQU19TT0xJRCwgMCwgR2V0U3lzQ29sb3IzMihDT0xPUl9CVE5TSEFET1cpKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgaGJzYXZlID0gKEhCUlVTSDMyKVNlbGVjdE9iamVjdDMyKGRjLCBHZXRTeXNDb2xvckJydXNoMzIoQ09MT1JfQlROVEVYVCkpOwotICAgICAgICBocCA9IENyZWF0ZVBlbjMyKFBTX1NPTElELCAwLCBHZXRTeXNDb2xvcjMyKENPTE9SX0JUTlRFWFQpKTsKLSAgICB9Ci0gICAgaHBzYXZlID0gKEhQRU4zMilTZWxlY3RPYmplY3QzMihkYywgaHApOworICAgIGkgPSB1RmxhZ3MgJiBERkNTX0lOQUNUSVZFID8gQ09MT1JfQlROU0hBRE9XIDogQ09MT1JfQlROVEVYVDsKKyAgICBoYnNhdmUgPSAoSEJSVVNIMzIpU2VsZWN0T2JqZWN0MzIoZGMsIEdldFN5c0NvbG9yQnJ1c2gzMihpKSk7CisgICAgaHBzYXZlID0gKEhQRU4zMilTZWxlY3RPYmplY3QzMihkYywgR2V0U3lzQ29sb3JQZW4zMihpKSk7CisKICAgICBQb2x5Z29uMzIoZGMsIExpbmUxLCBMaW5lMU4pOwogICAgIGlmKExpbmUyTiA+IDApCiAgICAgICAgIFBvbHlnb24zMihkYywgTGluZTIsIExpbmUyTik7CiAgICAgU2VsZWN0T2JqZWN0MzIoZGMsIGhwc2F2ZSk7CiAgICAgU2VsZWN0T2JqZWN0MzIoZGMsIGhic2F2ZSk7Ci0gICAgRGVsZXRlT2JqZWN0MzIoaHApOwogCiAgICAgcmV0dXJuIFRSVUU7CiB9CkBAIC0xMjE4LDEzICsxMTc5LDEzIEBACiAgICAgICAgIGhic2F2ZSA9IChIQlJVU0gzMilTZWxlY3RPYmplY3QzMihkYywgR2V0U3RvY2tPYmplY3QzMihOVUxMX0JSVVNIKSk7CiAgICAgICAgIGlmKHVGbGFncyAmIChERkNTX01PTk98REZDU19GTEFUKSkKICAgICAgICAgewotICAgICAgICAgICAgaHAgPSBocDIgPSBDcmVhdGVQZW4zMihQU19TT0xJRCwgMCwgR2V0U3lzQ29sb3IzMihDT0xPUl9XSU5ET1dGUkFNRSkpOworICAgICAgICAgICAgaHAgPSBocDIgPSBHZXRTeXNDb2xvclBlbjMyKENPTE9SX1dJTkRPV0ZSQU1FKTsKICAgICAgICAgICAgIGhiID0gaGIyID0gR2V0U3lzQ29sb3JCcnVzaDMyKENPTE9SX1dJTkRPV0ZSQU1FKTsKICAgICAgICAgfQogICAgICAgICBlbHNlCiAgICAgICAgIHsKLSAgICAgICAgICAgIGhwICA9IENyZWF0ZVBlbjMyKFBTX1NPTElELCAwLCBHZXRTeXNDb2xvcjMyKENPTE9SX0JUTkhJR0hMSUdIVCkpOwotICAgICAgICAgICAgaHAyID0gQ3JlYXRlUGVuMzIoUFNfU09MSUQsIDAsIEdldFN5c0NvbG9yMzIoQ09MT1JfQlROU0hBRE9XKSk7CisgICAgICAgICAgICBocCAgPSBHZXRTeXNDb2xvclBlbjMyKENPTE9SX0JUTkhJR0hMSUdIVCk7CisgICAgICAgICAgICBocDIgPSBHZXRTeXNDb2xvclBlbjMyKENPTE9SX0JUTlNIQURPVyk7CiAgICAgICAgICAgICBoYiAgPSBHZXRTeXNDb2xvckJydXNoMzIoQ09MT1JfQlROSElHSExJR0hUKTsKICAgICAgICAgICAgIGhiMiA9IEdldFN5c0NvbG9yQnJ1c2gzMihDT0xPUl9CVE5TSEFET1cpOwogICAgICAgICB9CkBAIC0xMjgzLDggKzEyNDQsNiBAQAogCiAgICAgICAgIFNlbGVjdE9iamVjdDMyKGRjLCBocHNhdmUpOwogICAgICAgICBTZWxlY3RPYmplY3QzMihkYywgaGJzYXZlKTsKLSAgICAgICAgRGVsZXRlT2JqZWN0MzIoaHApOwotICAgICAgICBEZWxldGVPYmplY3QzMihocDIpOwogICAgICAgICByZXR1cm4gVFJVRTsKIAogICAgIGRlZmF1bHQ6CkBAIC0xMjk4LDEyICsxMjU3LDEwIEBACiAgICAgaWYodUZsYWdzICYgREZDU19JTkFDVElWRSkKICAgICB7CiAgICAgICAgIGhic2F2ZSA9IChIQlJVU0gzMilTZWxlY3RPYmplY3QzMihkYywgR2V0U3lzQ29sb3JCcnVzaDMyKENPTE9SX0JUTkhJR0hMSUdIVCkpOwotICAgICAgICBocCA9IENyZWF0ZVBlbjMyKFBTX1NPTElELCAwLCBHZXRTeXNDb2xvcjMyKENPTE9SX0JUTkhJR0hMSUdIVCkpOwotICAgICAgICBocHNhdmUgPSAoSFBFTjMyKVNlbGVjdE9iamVjdDMyKGRjLCBocCk7CisgICAgICAgIGhwc2F2ZSA9IChIUEVOMzIpU2VsZWN0T2JqZWN0MzIoZGMsIEdldFN5c0NvbG9yUGVuMzIoQ09MT1JfQlROSElHSExJR0hUKSk7CiAgICAgICAgIFBvbHlnb24zMihkYywgTGluZSwgMyk7CiAgICAgICAgIFNlbGVjdE9iamVjdDMyKGRjLCBocHNhdmUpOwogICAgICAgICBTZWxlY3RPYmplY3QzMihkYywgaGJzYXZlKTsKLSAgICAgICAgRGVsZXRlT2JqZWN0MzIoaHApOwogICAgIH0KIAogICAgIGZvcihpID0gMDsgaSA8IDM7IGkrKykKQEAgLTEzMTIsMjEgKzEyNjksMTIgQEAKICAgICAgICAgTGluZVtpXS55LS07CiAgICAgfQogCi0gICAgaWYodUZsYWdzICYgREZDU19JTkFDVElWRSkKLSAgICB7Ci0gICAgICAgIGhic2F2ZSA9IChIQlJVU0gzMilTZWxlY3RPYmplY3QzMihkYywgR2V0U3lzQ29sb3JCcnVzaDMyKENPTE9SX0JUTlNIQURPVykpOwotICAgICAgICBocCA9IENyZWF0ZVBlbjMyKFBTX1NPTElELCAwLCBHZXRTeXNDb2xvcjMyKENPTE9SX0JUTlNIQURPVykpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBoYnNhdmUgPSAoSEJSVVNIMzIpU2VsZWN0T2JqZWN0MzIoZGMsIEdldFN5c0NvbG9yQnJ1c2gzMihDT0xPUl9CVE5URVhUKSk7Ci0gICAgICAgIGhwID0gQ3JlYXRlUGVuMzIoUFNfU09MSUQsIDAsIEdldFN5c0NvbG9yMzIoQ09MT1JfQlROVEVYVCkpOwotICAgIH0KLSAgICBocHNhdmUgPSAoSFBFTjMyKVNlbGVjdE9iamVjdDMyKGRjLCBocCk7CisgICAgaSA9IHVGbGFncyAmIERGQ1NfSU5BQ1RJVkUgPyBDT0xPUl9CVE5TSEFET1cgOiBDT0xPUl9CVE5URVhUOworICAgIGhic2F2ZSA9IChIQlJVU0gzMilTZWxlY3RPYmplY3QzMihkYywgR2V0U3lzQ29sb3JCcnVzaDMyKGkpKTsKKyAgICBocHNhdmUgPSAoSFBFTjMyKVNlbGVjdE9iamVjdDMyKGRjLCBHZXRTeXNDb2xvclBlbjMyKGkpKTsKICAgICBQb2x5Z29uMzIoZGMsIExpbmUsIDMpOwogICAgIFNlbGVjdE9iamVjdDMyKGRjLCBocHNhdmUpOwogICAgIFNlbGVjdE9iamVjdDMyKGRjLCBoYnNhdmUpOwotICAgIERlbGV0ZU9iamVjdDMyKGhwKTsKIAogICAgIHJldHVybiBUUlVFOwogfQpkaWZmIC0tZ2l0IGEvY29udHJvbHMvdXBkb3duLmMgYi9jb250cm9scy91cGRvd24uYwppbmRleCBiZjgxZmRiLi5jMGEyODQ4IDEwMDY0NAotLS0gYS9jb250cm9scy91cGRvd24uYworKysgYi9jb250cm9scy91cGRvd24uYwpAQCAtMzAsNyArMzAsNiBAQAogI2luY2x1ZGUgPHN0cmluZy5oPgogI2luY2x1ZGUgIndpbmRvd3MuaCIKICNpbmNsdWRlICJ3aW5ubHMuaCIKLSNpbmNsdWRlICJzeXNjb2xvci5oIgogI2luY2x1ZGUgInN5c21ldHJpY3MuaCIKICNpbmNsdWRlICJ1cGRvd24uaCIKICNpbmNsdWRlICJncmFwaGljcy5oIgpAQCAtMjY5LDc3ICsyNjgsNiBAQAogfSAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgVVBET1dOX0RyYXdBcnJhdwotICogRHJhdyB0aGUgYXJyb3dzIGZvciB0aGUgdXAtZG93biBjb250cm9sLiBUaGUgYXJyb3dzIGFyZSBkcmF3biB3aXRoIHRoZQotICogY3VycmVudCBwZW4gYW5kIGZpbGxlZCB3aXRoIHRoZSBjdXJyZW50IGJydXNoLgotICogSW5wdXQ6Ci0gKiBoZGMgICAgICAtIHRoZSBEQyB0byBkcmF3IG9uCi0gKiByZWN0ICAgICAtIHJlY3RhbmdsZSBob2xkaW5nIHRoZSBhcnJvdwotICogaW5jciAgICAgLSBUUlVFICBpZiB3ZSBkcmF3IHRoZSAiaW5jcmVtZW50IiBhcnJvdwotICogICAgICAgICAgICBGQUxTRSBpZiB3ZSBkcmF3IHRoZSAiZGVjcmVtZW50IiBhcnJvdwotICogcHJlc3NlZCAgLSBUUlVFICBpZiB0aGUgYXJyb3cgaXMgcHJlc3NlZCAoY2xpY2tlZCkKLSAqICAgICAgICAgICAgRkFMU0UgaWYgdGhlIGFycm93IGlzIG5vdCBwcmVzc2VkIChjbGlja2VkKQotICogaG9yeiAgICAgLSBUUlVFICBpZiB0aGUgYXJyb3cgaXMgaG9yaXpvbnRhbAotICogICAgICAgICAgICBGTEFTRSBpZiB0aGUgYXJyb3cgaXMgdmVydGljYWwKLSAqLwotc3RhdGljIHZvaWQgVVBET1dOX0RyYXdBcnJvdyhIREMzMiBoZGMsIFJFQ1QzMiAqcmVjdCwgQk9PTDMyIGluY3IsIAotCQkJICAgICBCT09MMzIgcHJlc3NlZCwgQk9PTDMyIGhvcnopCi17Ci0gIGNvbnN0IGludCBydyA9IHJlY3QtPnJpZ2h0IC0gcmVjdC0+bGVmdDsKLSAgY29uc3QgaW50IHJoID0gcmVjdC0+Ym90dG9tIC0gcmVjdC0+dG9wOwotICBpbnQgb2Zmc2V0ID0gcHJlc3NlZCA/IDEgOiAwOwotICBpbnQgdGgsIHgsIHksIGxlbjsKLQotICAvKiBjb21wdXRlIG1heCBleHRlbnRzIG9mIHRoZSB0cmlhbmdsZSAqLwotICBpZihob3J6KXsgLyogaG9yaXpvbnRhbCBhcnJvd3MgKi8KLSAgICB0aCA9ICgzKnJoKS81LTIqNDsKLSAgICBpZih0aCA+IHJ3LzIpCi0gICAgICB0aCA9IHJ3LzI7Ci0gICAgaWYodGggPCAyKQotICAgICAgdGggPSAyOwotCi0gICAgLyogY29tcHV0ZSB0aGUgcG9zaXRpb24gb2YgdGhlIHRpcCAqLwotICAgIHkgPSAocmVjdC0+dG9wK3JlY3QtPmJvdHRvbSsxKS8yICsgb2Zmc2V0OyAKLSAgICBpZihpbmNyKQotICAgICAgeCA9IChyZWN0LT5sZWZ0K3JlY3QtPnJpZ2h0KzEpLzIgKyAoMip0aCkvMyArIG9mZnNldDsKLSAgICBlbHNlCi0gICAgICB4ID0gKHJlY3QtPmxlZnQrcmVjdC0+cmlnaHQpLzIgKyB0aC8zICsgb2Zmc2V0OwotCi0gICAgZm9yKGxlbj0xOyB0aD4wOyB0aC0tLCBsZW4rPTIpewotICAgICAgTW92ZVRvRXgzMihoZGMsIHgsIHksIDApOwotICAgICAgTGluZVRvMzIoaGRjLCB4LCB5K2xlbik7Ci0gICAgICBpZihpbmNyKSB4LS07Ci0gICAgICBlbHNlICAgICB4Kys7Ci0gICAgICB5Kys7Ci0gICAgfSAgCi0gIH0KLSAgZWxzZXsgICAgICAgICAgICAgICAgICAgLyogdmVydGljYWwgYXJyb3dzICovCi0gICAgdGggPSAoMypydykvNS0yKjQ7Ci0gICAgaWYodGggPiByaC8yKQotICAgICAgdGggPSByaC8yOwotICAgIGlmKHRoIDwgMikKLSAgICAgIHRoID0gMjsKLQotICAgIC8qIGNvbXB1dGUgdGhlIHBvc2l0aW9uIG9mIHRoZSB0aXAgKi8KLSAgICB4ID0gKHJlY3QtPmxlZnQrcmVjdC0+cmlnaHQrMSkvMiArIG9mZnNldDsKLSAgICBpZihpbmNyKQotICAgICAgeSA9IChyZWN0LT50b3ArcmVjdC0+Ym90dG9tKzEpLzIgLSB0aC8zICsgb2Zmc2V0OwotICAgIGVsc2UKLSAgICAgIHkgPSAocmVjdC0+dG9wK3JlY3QtPmJvdHRvbSkvMiArICgyKnRoKS8zICsgb2Zmc2V0OwotCi0gICAgZm9yKGxlbj0xOyB0aD4wOyB0aC0tLCBsZW4rPTIpewotICAgICAgTW92ZVRvRXgzMihoZGMsIHgsIHksIDApOwotICAgICAgTGluZVRvMzIoaGRjLCB4K2xlbiwgeSk7Ci0gICAgICBpZihpbmNyKSB5Kys7Ci0gICAgICBlbHNlICAgICB5LS07Ci0gICAgICB4LS07Ci0gICAgfQotICAgIAotICB9Ci0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgVVBET1dOX1BhaW50CiAgKiBEcmF3IHRoZSBhcnJvd3MuIFRoZSBiYWNrZ3JvdW5kIG5lZWQgbm90IGJlIGVyYXNlZC4KICAqLwpAQCAtMzUwLDE5ICsyNzgsMTcgQEAKICAgQk9PTDMyIHByc3NlZDsKICAgUkVDVDMyIHJlY3Q7CiAgIEhEQzMyIGhkYzsKLSAgSEJSVVNIMzIgb2xkQnJ1c2g7Ci0KKyAgCisgIC8qIHN0YXJ0IHBhaW50aW5nIHRoZSBidXR0b24gKi8KICAgaGRjID0gQmVnaW5QYWludDMyKCB3bmRQdHItPmh3bmRTZWxmLCAmcHMgKTsKIAotICAvKiBGaXJzdCBzZWxlY3QgdGhlIHByb3BlciBicnVzaCAqLwotICBvbGRCcnVzaCA9IHduZFB0ci0+ZHdTdHlsZSAmIFdTX0RJU0FCTEVEID8gR1JBWV9CUlVTSCA6IEJMQUNLX0JSVVNIOwotICBvbGRCcnVzaCA9IFNlbGVjdE9iamVjdDMyKGhkYywgR2V0U3RvY2tPYmplY3QzMihvbGRCcnVzaCkpOwotCiAgIC8qIERyYXcgdGhlIGluY3IgYnV0dG9uICovCiAgIFVQRE9XTl9HZXRBcnJvd1JlY3Qod25kUHRyLCAmcmVjdCwgVFJVRSk7CiAgIHByc3NlZCA9IChpbmZvUHRyLT5GbGFncyAmIEZMQUdfSU5DUikgJiYgKGluZm9QdHItPkZsYWdzICYgRkxBR19NT1VTRUlOKTsKLSAgRHJhd0VkZ2UzMihoZGMsICZyZWN0LCBwcnNzZWQ/RURHRV9TVU5LRU46RURHRV9SQUlTRUQsIEJGX1JFQ1R8QkZfTUlERExFKTsKLSAgVVBET1dOX0RyYXdBcnJvdyhoZGMsICZyZWN0LCBUUlVFLCBwcnNzZWQsIHduZFB0ci0+ZHdTdHlsZSAmIFVEU19IT1JaKTsKKyAgRHJhd0ZyYW1lQ29udHJvbDMyKGhkYywgJnJlY3QsIERGQ19TQ1JPTEwsIAorCSh3bmRQdHItPmR3U3R5bGUgJiBVRFNfSE9SWiA/IERGQ1NfU0NST0xMTEVGVCA6IERGQ1NfU0NST0xMVVApIHwKKwkocHJzc2VkID8gREZDU19QVVNIRUQgOiAwKSB8CisJKHduZFB0ci0+ZHdTdHlsZSZXU19ESVNBQkxFRCA/IERGQ1NfSU5BQ1RJVkUgOiAwKSApOwogCiAgIC8qIERyYXcgdGhlIHNwYWNlIGJldHdlZW4gdGhlIGJ1dHRvbnMgKi8KICAgcmVjdC50b3AgPSByZWN0LmJvdHRvbTsgcmVjdC5ib3R0b20rKzsKQEAgLTM3MSwxMiArMjk3LDEzIEBACiAgIC8qIERyYXcgdGhlIGRlY3IgYnV0dG9uICovCiAgIFVQRE9XTl9HZXRBcnJvd1JlY3Qod25kUHRyLCAmcmVjdCwgRkFMU0UpOwogICBwcnNzZWQgPSAoaW5mb1B0ci0+RmxhZ3MgJiBGTEFHX0RFQ1IpICYmIChpbmZvUHRyLT5GbGFncyAmIEZMQUdfTU9VU0VJTik7Ci0gIERyYXdFZGdlMzIoaGRjLCAmcmVjdCwgcHJzc2VkID8gRURHRV9TVU5LRU4gOiBFREdFX1JBSVNFRCwgCi0JICAgQkZfUkVDVCB8IEJGX1NPRlQgfCBCRl9NSURETEUpOwotICBVUERPV05fRHJhd0Fycm93KGhkYywgJnJlY3QsIEZBTFNFLCBwcnNzZWQsIHduZFB0ci0+ZHdTdHlsZSAmIFVEU19IT1JaKTsKKyAgRHJhd0ZyYW1lQ29udHJvbDMyKGhkYywgJnJlY3QsIERGQ19TQ1JPTEwsIAorCSh3bmRQdHItPmR3U3R5bGUgJiBVRFNfSE9SWiA/IERGQ1NfU0NST0xMUklHSFQgOiBERkNTX1NDUk9MTERPV04pIHwKKwkocHJzc2VkID8gREZDU19QVVNIRUQgOiAwKSB8CisJKHduZFB0ci0+ZHdTdHlsZSZXU19ESVNBQkxFRCA/IERGQ1NfSU5BQ1RJVkUgOiAwKSApOworCiAKICAgLyogY2xlYW4tdXAgKi8gIAotICBTZWxlY3RPYmplY3QzMihoZGMsIG9sZEJydXNoKTsKICAgRW5kUGFpbnQzMiggd25kUHRyLT5od25kU2VsZiwgJnBzICk7CiB9CiAKZGlmZiAtLWdpdCBhL2RlYnVnZ2VyL2RiX2Rpc2FzbS5jIGIvZGVidWdnZXIvZGJfZGlzYXNtLmMKaW5kZXggNzE1ZGRiZS4uYmQ4ZTExZiAxMDA2NDQKLS0tIGEvZGVidWdnZXIvZGJfZGlzYXNtLmMKKysrIGIvZGVidWdnZXIvZGJfZGlzYXNtLmMKQEAgLTI2NSw3ICsyNjUsNyBAQAogc3RhdGljIGNvbnN0IHN0cnVjdCBpbnN0IGRiX2luc3RfMGZheFtdID0gewogLyphMCovCXsgInB1c2giLCAgRkFMU0UsIE5PTkUsICBvcDEoU2kpLCAgICAgMCB9LAogLyphMSovCXsgInBvcCIsICAgRkFMU0UsIE5PTkUsICBvcDEoU2kpLCAgICAgMCB9LAotLyphMiovCXsgIiIsICAgICAgRkFMU0UsIE5PTkUsICAwLAkgICAgICAwIH0sCisvKmEyKi8JeyAiY3B1aWQiLCBGQUxTRSwgTk9ORSwgIDAsCSAgICAgIDAgfSwKIC8qYTMqLwl7ICJidCIsICAgIFRSVUUsICBMT05HLCAgb3AyKEUsUiksICAgIDAgfSwKIC8qYTQqLwl7ICJzaGxkIiwgIFRSVUUsICBMT05HLCAgb3AzKEliLEUsUiksIDAgfSwKIC8qYTUqLwl7ICJzaGxkIiwgIFRSVUUsICBMT05HLCAgb3AzKENMLEUsUiksIDAgfSwKQEAgLTI4Myw4ICsyODMsOCBAQAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBpbnN0IGRiX2luc3RfMGZieFtdID0gewotLypiMCovCXsgIiIsICAgICAgRkFMU0UsIE5PTkUsICAwLAkgICAgICAwIH0sCi0vKmIxKi8JeyAiIiwgICAgICBGQUxTRSwgTk9ORSwgIDAsCSAgICAgIDAgfSwKKy8qYjAqLwl7ICJjbXB4Y2hnIixUUlVFLCBCWVRFLCAgb3AyKEUsIFIpLCAgIDAgfSwKKy8qYjEqLwl7ICJjbXB4Y2hnIixUUlVFLCBMT05HLCAgb3AyKEUsIFIpLCAgIDAgfSwKIC8qYjIqLwl7ICJsc3MiLCAgIFRSVUUsICBMT05HLCAgb3AyKEUsIFIpLCAgIDAgfSwKIC8qYjMqLwl7ICJidHMiLCAgIFRSVUUsICBMT05HLCAgb3AyKFIsIEUpLCAgIDAgfSwKIC8qYjQqLwl7ICJsZnMiLCAgIFRSVUUsICBMT05HLCAgb3AyKEUsIFIpLCAgIDAgfSwKZGlmZiAtLWdpdCBhL2RvY3VtZW50YXRpb24vbGFuZ3VhZ2VzIGIvZG9jdW1lbnRhdGlvbi9sYW5ndWFnZXMKaW5kZXggZWY0YWE2ZC4uZDM1NGYyZSAxMDA2NDQKLS0tIGEvZG9jdW1lbnRhdGlvbi9sYW5ndWFnZXMKKysrIGIvZG9jdW1lbnRhdGlvbi9sYW5ndWFnZXMKQEAgLTI0LDcgKzI0LDcgQEAKIDMuICBFZGl0IGluY2x1ZGUvb3B0aW9ucy5oIGVudW0gIldJTkVfTEFOR1VBR0UiIHRvIGhhdmUgYSBtZW1iZXIgY2FsbGVkCiAgICAgTEFOR19YWCB3aGVyZSBYWCBpcyB0aGUgbmV3IGFiYnJldmlhdGlvbi4KIAotNC4gIEVkaXQgbWlzYy9vbGUybmxzLmMgZnVuY3Rpb24gIkdldFVzZXJEZWZhdWx0TENJRCIgdG8gY29udGFpbiBhCis0LiAgRWRpdCBvbGUvb2xlMm5scy5jIGZ1bmN0aW9uICJHZXRVc2VyRGVmYXVsdExDSUQiIHRvIGNvbnRhaW4gYQogICAgIGNhc2UgZm9yIHlvdXIgbGFuZ3VhZ2UgYnkgdW5jb21tZW50aW5nIHRoZSByZXR1cm4gdmFsdWUgb2YgaXQuCiAKIDUuICBFZGl0IHJlc291cmNlcy9zeXNyZWMuYyB0byBpbmNsdWRlICJzeXNyZXNfWFguaCIgd2hlcmUgWFggaXMgdGhlCkBAIC00Nyw3ICs0Nyw3IEBACiA3LiAgRWRpdCByZXNvdXJjZXMvTWFrZWZpbGUuaW4gdG8gYWRkIHRoZSBuYW1lIG9mIHRoZSBuZXcgZmlsZSB0byB0aGUKICAgICBTWVNSRVNfU1JDUyB2YXJpYWJsZS4KIAotOC4gIEVkaXQgbWlzYy9vbGUybmxzLmMgZnVuY3Rpb24gIkdldExvY2FsZUluZm9BIiB0byBjb250YWluIGEgY2FzZSBmb3IKKzguICBFZGl0IG9sZS9vbGUybmxzLmMgZnVuY3Rpb24gIkdldExvY2FsZUluZm9BIiB0byBjb250YWluIGEgY2FzZSBmb3IKICAgICB5b3VyIGxhbmd1YWdlLgogCiA5LiAgUmUtY29uZmlndXJlLCByZS1tYWtlIGRlcGVuZGVuY2llcywgYW5kIHJlLW1ha2UgV2luZS4KZGlmZiAtLWdpdCBhL2ZpbGVzL2RyaXZlLmMgYi9maWxlcy9kcml2ZS5jCmluZGV4IDBmZDU4MmQuLmQ1YThhODYgMTAwNjQ0Ci0tLSBhL2ZpbGVzL2RyaXZlLmMKKysrIGIvZmlsZXMvZHJpdmUuYwpAQCAtNjIzLDkgKzYyMywxNiBAQAogICAgIGlmIChzaXplID4gMHg3ZmZmZmZmZikgc2l6ZSA9IDB4N2ZmZmZmZmY7CiAgICAgaWYgKGF2YWlsYWJsZSA+IDB4N2ZmZmZmZmYpIGF2YWlsYWJsZSA9IDB4N2ZmZmZmZmY7CiAKLSAgICAqc2VjdG9yX2J5dGVzICAgID0gNTEyOwotICAgIHNpemUgICAgICAgICAgICAvPSA1MTI7Ci0gICAgYXZhaWxhYmxlICAgICAgIC89IDUxMjsKKyAgICBpZiAoRFJJVkVfR2V0VHlwZShkcml2ZSk9PVRZUEVfQ0RST00pIHsKKwkqc2VjdG9yX2J5dGVzICAgID0gMjA0ODsKKwlzaXplICAgICAgICAgICAgLz0gMjA0ODsKKwlhdmFpbGFibGUgICAgICAgLz0gMjA0ODsKKyAgICB9IGVsc2UgeworCSpzZWN0b3JfYnl0ZXMgICAgPSA1MTI7CisJc2l6ZSAgICAgICAgICAgIC89IDUxMjsKKwlhdmFpbGFibGUgICAgICAgLz0gNTEyOworICAgIH0KKyAgICAvKiBmaXhtZTogcHJvYmFibHkgaGF2ZSB0byBhZGp1c3QgdGhvc2UgdmFyaWFibGVzIHRvbyBmb3IgQ0RGUyAqLwogICAgICpjbHVzdGVyX3NlY3RvcnMgPSAxOwogICAgIHdoaWxlICgqY2x1c3Rlcl9zZWN0b3JzICogNjU1MzAgPCBzaXplKSAqY2x1c3Rlcl9zZWN0b3JzICo9IDI7CiAgICAgKmZyZWVfY2x1c3RlcnMgICA9IGF2YWlsYWJsZS8gKmNsdXN0ZXJfc2VjdG9yczsKQEAgLTkyMSw3ICs5MjgsNyBAQAogICAgIGlmICghcm9vdCkgZHJpdmUgPSBEUklWRV9HZXRDdXJyZW50RHJpdmUoKTsKICAgICBlbHNlCiAgICAgewotICAgICAgICBpZiAoKHJvb3RbMV0pICYmKChyb290WzFdICE9ICc6JykgfHwgKHJvb3RbMl0gIT0gJ1xcJykpKQorICAgICAgICBpZiAoKHJvb3RbMV0pICYmIChyb290WzFdICE9ICc6JykpCiAgICAgICAgIHsKICAgICAgICAgICAgIGZwcmludGYoIHN0ZGVyciwgIkdldFZvbHVtZUluZm9ybWF0aW9uOiBpbnZhbGlkIHJvb3QgJyVzJ1xuIixyb290KTsKICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKQEAgLTkzNyw3ICs5NDQsMTMgQEAKIAogICAgIGlmIChmaWxlbmFtZV9sZW4pICpmaWxlbmFtZV9sZW4gPSAxMjsKICAgICBpZiAoZmxhZ3MpICpmbGFncyA9IDA7Ci0gICAgaWYgKGZzbmFtZSkgbHN0cmNweW4zMkEoIGZzbmFtZSwgIkZBVDE2IiwgZnNuYW1lX2xlbiApOworICAgIGlmIChmc25hbWUpIHsKKyAgICAJLyogRGlhYmxvIGNoZWNrcyB0aGF0IHJldHVybiBjb2RlIC4uLiAqLworICAgIAlpZiAoRFJJVkVfR2V0VHlwZShkcml2ZSk9PVRZUEVfQ0RST00pCisJICAgIGxzdHJjcHluMzJBKCBmc25hbWUsICJDREZTIiwgZnNuYW1lX2xlbiApOworCWVsc2UKKwkgICAgbHN0cmNweW4zMkEoIGZzbmFtZSwgIkZBVDE2IiwgZnNuYW1lX2xlbiApOworICAgIH0KICAgICByZXR1cm4gVFJVRTsKIH0KIApkaWZmIC0tZ2l0IGEvZmlsZXMvZmlsZS5jIGIvZmlsZXMvZmlsZS5jCmluZGV4IDEwMzgwZTguLjNlYWFmOGQgMTAwNjQ0Ci0tLSBhL2ZpbGVzL2ZpbGUuYworKysgYi9maWxlcy9maWxlLmMKQEAgLTM4LDYgKzM4LDE4IEBACiAjZGVmaW5lIE1BUF9BTk9OIE1BUF9BTk9OWU1PVVMKICNlbmRpZgogCitzdGF0aWMgdm9pZCBGSUxFX0Rlc3Ryb3koIEszMk9CSiAqb2JqICk7CisKK2NvbnN0IEszMk9CSl9PUFMgRklMRV9PcHMgPQoreworICAgIC8qIE9iamVjdCBjYW5ub3QgYmUgd2FpdGVkIHVwb24gKEZJWE1FOiBmb3Igbm93KSAqLworICAgIE5VTEwsICAgICAgICAgICAgICAvKiBzaWduYWxlZCAqLworICAgIE5VTEwsICAgICAgICAgICAgICAvKiBzYXRpc2ZpZWQgKi8KKyAgICBOVUxMLCAgICAgICAgICAgICAgLyogYWRkX3dhaXQgKi8KKyAgICBOVUxMLCAgICAgICAgICAgICAgLyogcmVtb3ZlX3dhaXQgKi8KKyAgICBGSUxFX0Rlc3Ryb3kgICAgICAgLyogZGVzdHJveSAqLworfTsKKwogc3RydWN0IERPU19GSUxFX0xPQ0sgewogICBzdHJ1Y3QgRE9TX0ZJTEVfTE9DSyAqCW5leHQ7CiAgIERXT1JECQkJCWJhc2U7CkBAIC03Myw2ICs4NSw3IEBACiAgICAgKCpmaWxlKS0+dHlwZSA9IEZJTEVfVFlQRV9ESVNLOwogCiAgICAgaGFuZGxlID0gUFJPQ0VTU19BbGxvY0hhbmRsZSggJigqZmlsZSktPmhlYWRlciwgMCApOworICAgIC8qIElmIHRoZSBhbGxvY2F0aW9uIGZhaWxlZCwgdGhlIG9iamVjdCBpcyBhbHJlYWR5IGRlc3Ryb3llZCAqLwogICAgIGlmIChoYW5kbGUgPT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUzMikgKmZpbGUgPSBOVUxMOwogICAgIHJldHVybiBoYW5kbGU7CiB9CkBAIC04Myw3ICs5Niw3IEBACiAgKgogICogRGVzdHJveSBhIERPUyBmaWxlLgogICovCi12b2lkIEZJTEVfRGVzdHJveSggSzMyT0JKICpwdHIgKQorc3RhdGljIHZvaWQgRklMRV9EZXN0cm95KCBLMzJPQkogKnB0ciApCiB7CiAgICAgRklMRV9PQkpFQ1QgKmZpbGUgPSAoRklMRV9PQkpFQ1QgKilwdHI7CiAgICAgYXNzZXJ0KCBwdHItPnR5cGUgPT0gSzMyT0JKX0ZJTEUgKTsKQEAgLTU0MiwxNyArNTU1LDEyIEBACiAgICAgfQogCiAgICAgaWYgKGRyaXZlICYgVEZfRk9SQ0VEUklWRSkKLSAgICB7Ci0gICAgICAgIHNwcmludGYoIHRlbXBwYXRoLCAiJWM6XFwiLCBkcml2ZSAmIH5URl9GT1JDRURSSVZFICk7Ci0JbHN0cmNweW4zMkEoIHRlbXBwYXRoICsgMywKLSAgICAgICAgICAgICAgICAgICAgIERSSVZFX0dldERvc0N3ZCggdG91cHBlcihkcml2ZSAmIH5URl9GT1JDRURSSVZFKSAtICdBJyksCi0gICAgICAgICAgICAgICAgICAgICAxMjkgKTsKLSAgICB9CisgICAgICAgIHNwcmludGYodGVtcHBhdGgsIiVjOiIsIGRyaXZlICYgflRGX0ZPUkNFRFJJVkUgKTsKICAgICBlbHNlCiAgICAgewogICAgICAgICBHZXRUZW1wUGF0aDMyQSggMTMyLCB0ZW1wcGF0aCApOworICAgICAgICBzdHJjYXQoIHRlbXBwYXRoLCAiXFwiICk7CiAgICAgfQotICAgIHN0cmNhdCggdGVtcHBhdGgsICJcXCIgKTsKICAgICByZXR1cm4gKFVJTlQxNilHZXRUZW1wRmlsZU5hbWUzMkEoIHRlbXBwYXRoLCBwcmVmaXgsIHVuaXF1ZSwgYnVmZmVyICk7CiB9CiAKQEAgLTU3Miw4ICs1ODAsMTEgQEAKIAogICAgIHN0cmNweSggYnVmZmVyLCBwYXRoICk7CiAgICAgcCA9IGJ1ZmZlciArIHN0cmxlbihidWZmZXIpOwotICAgIC8qIGFkZCBhIFwsIGlmIHRoZXJlIGlzbid0IG9uZSAuLi4gKi8KLSAgICBpZiAoKHAgPT0gYnVmZmVyKSB8fCAocFstMV0gIT0gJ1xcJykpICpwKysgPSAnXFwnOworCisgICAgLyogYWRkIGEgXCwgaWYgdGhlcmUgaXNuJ3Qgb25lIGFuZCBwYXRoIGlzIG1vcmUgdGhhbiBqdXN0IHRoZSBkcml2ZSBsZXR0ZXIgLi4uICovCisgICAgaWYgKCAhKChzdHJsZW4oYnVmZmVyKSA9PSAyKSAmJiAoYnVmZmVyWzFdID09ICc6JykpIAorCSYmICgocCA9PSBidWZmZXIpIHx8IChwWy0xXSAhPSAnXFwnKSkpICpwKysgPSAnXFwnOworCiAgICAgKnArKyA9ICd+JzsKICAgICBmb3IgKGkgPSAzOyAoaSA+IDApICYmICgqcHJlZml4KTsgaS0tKSAqcCsrID0gKnByZWZpeCsrOwogICAgIHNwcmludGYoIHAsICIlMDR4LnRtcCIsIG51bSApOwpkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvTWFrZWZpbGUuaW4gYi9ncmFwaGljcy9NYWtlZmlsZS5pbgppbmRleCAzNzg0YzUyLi41NDgxZmE1IDEwMDY0NAotLS0gYS9ncmFwaGljcy9NYWtlZmlsZS5pbgorKysgYi9ncmFwaGljcy9NYWtlZmlsZS5pbgpAQCAtOCw2ICs4LDcgQEAKIENfU1JDUyA9IFwKIAliaXRibHQuYyBcCiAJY2FjaGUuYyBcCisJZGRyYXcuYyBcCiAJZHJpdmVyLmMgXAogCWVudi5jIFwKIAllc2NhcGUuYyBcCmRpZmYgLS1naXQgYS9ncmFwaGljcy9kZHJhdy5jIGIvZ3JhcGhpY3MvZGRyYXcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MjQ4NjkwCi0tLSAvZGV2L251bGwKKysrIGIvZ3JhcGhpY3MvZGRyYXcuYwpAQCAtMCwwICsxLDkwNCBAQAorLyoJCURpcmVjdERyYXcKKyAqCisgKiBDb3B5cmlnaHQgMTk5NyBNYXJjdXMgTWVpc3NuZXIKKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxYMTEvWGxpYi5oPgorCisjaW5jbHVkZSAid2luZG93cy5oIgorI2luY2x1ZGUgIndpbmVycm9yLmgiCisjaW5jbHVkZSAiaW50ZXJmYWNlcy5oIgorI2luY2x1ZGUgImdkaS5oIgorI2luY2x1ZGUgImhlYXAuaCIKKyNpbmNsdWRlICJsZHQuaCIKKyNpbmNsdWRlICJkYy5oIgorI2luY2x1ZGUgIndpbi5oIgorI2luY2x1ZGUgImRlYnVnLmgiCisjaW5jbHVkZSAic3RkZGVidWcuaCIKKyNpbmNsdWRlICJtaXNjZW11LmgiCisjaW5jbHVkZSAibW1zeXN0ZW0uaCIKKyNpbmNsdWRlICJkZHJhdy5oIgorCisjaWZkZWYgSEFWRV9MSUJYWEY4NkRHQQorI2luY2x1ZGUgPFgxMS9leHRlbnNpb25zL3hmODZkZ2EuaD4KKyNlbmRpZgorCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkgSURpcmVjdERyYXdTdXJmYWNlX1F1ZXJ5SW50ZXJmYWNlKExQRElSRUNURFJBV1NVUkZBQ0UsUkVGSUlELExQVk9JRCopOworc3RhdGljIEhSRVNVTFQgV0lOQVBJIElEaXJlY3REcmF3X1F1ZXJ5SW50ZXJmYWNlKExQRElSRUNURFJBVyB0aGlzLFJFRklJRCByZWZpaWQsTFBWT0lEICpvYmopOworc3RhdGljIEhSRVNVTFQgV0lOQVBJIElEaXJlY3REcmF3Ml9DcmVhdGVTdXJmYWNlKCBMUERJUkVDVERSQVcyIHRoaXMsTFBERFNVUkZBQ0VERVNDIGxwZGRzZCxMUERJUkVDVERSQVdTVVJGQUNFICpscGRzZixJVW5rbm93biAqbHB1bmspOworc3RhdGljIEhSRVNVTFQgV0lOQVBJIElEaXJlY3REcmF3X0NyZWF0ZVN1cmZhY2UoIExQRElSRUNURFJBVyB0aGlzLExQRERTVVJGQUNFREVTQyAqbHBkZHNkLExQRElSRUNURFJBV1NVUkZBQ0UgKmxwZHNmLElVbmtub3duICpscHVuayk7CitzdGF0aWMgc3RydWN0IElEaXJlY3REcmF3U3VyZmFjZTJfVlRhYmxlIGRkczJ2dDsKK3N0YXRpYyBzdHJ1Y3QgSURpcmVjdERyYXdTdXJmYWNlX1ZUYWJsZSBkZHN2dDsKKworCitIUkVTVUxUIFdJTkFQSQorRGlyZWN0RHJhd0VudW1lcmF0ZTMyQShMUERERU5VTUNBTExCQUNLMzJBIGRkZW51bXByb2MsTFBWT0lEIGRhdGEpIHsKKwlmcHJpbnRmKHN0ZGVyciwiRGlyZWN0RHJhd0VudW1lcmF0ZUEoJXAsJXApLlxuIixkZGVudW1wcm9jLGRhdGEpOworCWRkZW51bXByb2MoMCwiV0lORSBEaXNwbGF5IiwiZGlzcGxheSIsZGF0YSk7CisJZGRlbnVtcHJvYygmSUlEX0lEaXJlY3REcmF3LCJXSU5FIERpcmVjdERyYXciLCJkaXJlY3RkcmF3IixkYXRhKTsKKwlkZGVudW1wcm9jKCZJSURfSURpcmVjdERyYXdQYWxldHRlLCJXSU5FIERpcmVjdFBhbGV0dGUiLCJkaXJlY3RwYWxldHRlIixkYXRhKTsKKwlyZXR1cm4gMDsKK30KKworSFJFU1VMVCBXSU5BUEkgCitEU291bmRIZWxwKERXT1JEIHgsRFdPUkQgeSxEV09SRCB6KSB7CisJZnByaW50ZihzdGRlcnIsIkRTb3VuZEhlbHAoMHglMDhseCwweCUwOGx4LDB4JTA4bHgpLHN0dWIhXG4iLHgseSx6KTsKKwlyZXR1cm4gMDsKK30KKworI2lmZGVmIEhBVkVfTElCWFhGODZER0EKKworc3RhdGljIGludCBfZ2V0cGl4ZWxmb3JtYXQoTFBESVJFQ1REUkFXIGRkcmF3LExQRERQSVhFTEZPUk1BVCBwZikgeworCXBmLT5kd0ZvdXJDQyA9IG1taW9GT1VSQ0MoJ1InLCdHJywnQicsJyAnKTsKKwlpZiAoZGRyYXctPmQuZGVwdGg9PTgpIHsKKwkJcGYtPmR3RmxhZ3MgCQk9IEREUEZfUkdCfEREUEZfUEFMRVRURUlOREVYRURUTzg7CisJCXBmLT54LmR3UkdCQml0Q291bnQJPSA4OworCQlwZi0+eS5kd1JCaXRNYXNrICAJPSAwOworCQlwZi0+ei5kd0dCaXRNYXNrICAJPSAwOworCQlwZi0+eHguZHdCQml0TWFzayAJPSAwOworCQlyZXR1cm4gMDsKKwl9CisJaWYgKGRkcmF3LT5kLmRlcHRoPT0xNikgeworCQlwZi0+ZHdGbGFncyAgICAgICA9IEREUEZfUkdCOworCQlwZi0+eC5kd1JHQkJpdENvdW50ICA9IDE2OworCQlwZi0+eS5kd1JCaXRNYXNrICA9IDB4MDAwMGY4MDA7CisJCXBmLT56LmR3R0JpdE1hc2sgID0gMHgwMDAwMDdlMDsKKwkJcGYtPnh4LmR3QkJpdE1hc2sgPSAweDAwMDAwMDFmOworCQlyZXR1cm4gMDsKKwl9CisJZnByaW50ZihzdGRlcnIsIl9nZXRwaXhlbGZvcm1hdDpvb3BzP1xuIik7CisJcmV0dXJuIERERVJSX0dFTkVSSUM7Cit9CisKKworc3RhdGljIEhSRVNVTFQgV0lOQVBJIElEaXJlY3REcmF3U3VyZmFjZV9Mb2NrKAorICAgIExQRElSRUNURFJBV1NVUkZBQ0UgdGhpcyxMUFJFQ1QzMiBscHJlY3QsTFBERFNVUkZBQ0VERVNDIGxwZGRzZCxEV09SRCBmbGFncywgSEFORExFMzIgaG5kCispIHsKKwlkcHJpbnRmX3JlbGF5KHN0ZGRlYiwiSURpcmVjdERyYXdTdXJmYWNlKCVwKS0+TG9jayglcCwlcCwlMDhseCwlMDhseClcbiIsCisJCXRoaXMsbHByZWN0LGxwZGRzZCxmbGFncywoRFdPUkQpaG5kCisJKTsKKwlmcHJpbnRmKHN0ZGVyciwiLiIpOworCWlmIChscHJlY3QpIHsKKwkJLyoKKwkJZnByaW50ZihzdGRlcnIsIglscHJlY3Q6ICVkeCVkLSVkeCVkXG4iLAorCQkJbHByZWN0LT50b3AsbHByZWN0LT5sZWZ0LGxwcmVjdC0+Ym90dG9tLGxwcmVjdC0+cmlnaHQKKwkJKTsKKwkJICovCisJCWxwZGRzZC0+bHBTdXJmYWNlID0JdGhpcy0+c3VyZmFjZSsKKwkJCQkJKGxwcmVjdC0+dG9wKnRoaXMtPmxwaXRjaCkrCisJCQkJCShscHJlY3QtPmxlZnQqKHRoaXMtPmRkcmF3LT5kLmRlcHRoLzgpKTsKKwl9IGVsc2UKKwkJbHBkZHNkLT5scFN1cmZhY2UgPSB0aGlzLT5zdXJmYWNlOworCWxwZGRzZC0+ZHdXaWR0aAkJPSB0aGlzLT53aWR0aDsKKwlscGRkc2QtPmR3SGVpZ2h0CT0gdGhpcy0+aGVpZ2h0OworCWxwZGRzZC0+bFBpdGNoCQk9IHRoaXMtPmxwaXRjaDsKKwlfZ2V0cGl4ZWxmb3JtYXQodGhpcy0+ZGRyYXcsJihscGRkc2QtPmRkcGZQaXhlbEZvcm1hdCkpOworCXJldHVybiAwOworfQorCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkgSURpcmVjdERyYXdTdXJmYWNlMl9Mb2NrKAorICAgIExQRElSRUNURFJBV1NVUkZBQ0UyIHRoaXMsTFBSRUNUMzIgbHByZWN0LExQRERTVVJGQUNFREVTQyBscGRkc2QsRFdPUkQgZmxhZ3MsIEhBTkRMRTMyIGhuZAorKSB7CisJZHByaW50Zl9yZWxheShzdGRkZWIsIklEaXJlY3REcmF3U3VyZmFjZTIoJXApLT5Mb2NrKCVwLCVwLCUwOGx4LCUwOGx4KVxuIiwKKwkJdGhpcyxscHJlY3QsbHBkZHNkLGZsYWdzLChEV09SRClobmQKKwkpOworCWZwcmludGYoc3RkZXJyLCIuIik7CisJaWYgKGxwcmVjdCkgeworCQkvKgorCQlmcHJpbnRmKHN0ZGVyciwiCWxwcmVjdDogJWR4JWQtJWR4JWRcbiIsCisJCQlscHJlY3QtPnRvcCxscHJlY3QtPmxlZnQsbHByZWN0LT5ib3R0b20sbHByZWN0LT5yaWdodAorCQkpOworCQkgKi8KKwkJbHBkZHNkLT5scFN1cmZhY2UgPQl0aGlzLT5zdXJmYWNlKworCQkJCQkobHByZWN0LT50b3AqdGhpcy0+bHBpdGNoKSsKKwkJCQkJKGxwcmVjdC0+bGVmdCoodGhpcy0+ZGRyYXctPmQuZGVwdGgvOCkpOworCX0gZWxzZQorCQlscGRkc2QtPmxwU3VyZmFjZSA9IHRoaXMtPnN1cmZhY2U7CisJbHBkZHNkLT5kd1dpZHRoCQk9IHRoaXMtPndpZHRoOworCWxwZGRzZC0+ZHdIZWlnaHQJPSB0aGlzLT5oZWlnaHQ7CisJbHBkZHNkLT5sUGl0Y2gJCT0gdGhpcy0+bHBpdGNoOworCV9nZXRwaXhlbGZvcm1hdCh0aGlzLT5kZHJhdywmKGxwZGRzZC0+ZGRwZlBpeGVsRm9ybWF0KSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBIUkVTVUxUIFdJTkFQSSBJRGlyZWN0RHJhd1N1cmZhY2VfVW5sb2NrKAorCUxQRElSRUNURFJBV1NVUkZBQ0UgdGhpcyxMUFZPSUQgc3VyZmFjZQorKSB7CisJZHByaW50Zl9yZWxheShzdGRkZWIsIklEaXJlY3REcmF3U3VyZmFjZSglcCktPlVubG9jayglcClcbiIsdGhpcyxzdXJmYWNlKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIEhSRVNVTFQgV0lOQVBJIElEaXJlY3REcmF3U3VyZmFjZV9GbGlwKAorCUxQRElSRUNURFJBV1NVUkZBQ0UgdGhpcyxMUERJUkVDVERSQVdTVVJGQUNFIGZsaXB0byxEV09SRCBkd0ZsYWdzCispIHsKKwlmcHJpbnRmKHN0ZGVyciwiSURpcmVjdERyYXdTdXJmYWNlKCVwKS0+RmxpcCglcCwlMDhseCksU1RVQlxuIix0aGlzLGZsaXB0byxkd0ZsYWdzKTsKKwlpZiAoZmxpcHRvKSB7CisJCVhGODZER0FTZXRWaWV3UG9ydChkaXNwbGF5LERlZmF1bHRTY3JlZW4oZGlzcGxheSksMCxmbGlwdG8tPmZiX2hlaWdodCk7CisJfSBlbHNlIHsKKwkJLyogRklYTUU6IGZsaXAgdGhyb3VnaCBhdHRhY2hlZCBzdXJmYWNlcyAqLworCQlYRjg2REdBU2V0Vmlld1BvcnQoZGlzcGxheSxEZWZhdWx0U2NyZWVuKGRpc3BsYXkpLDAsdGhpcy0+ZmJfaGVpZ2h0KTsKKwl9CisJd2hpbGUgKCFYRjg2REdBVmlld1BvcnRDaGFuZ2VkKGRpc3BsYXksRGVmYXVsdFNjcmVlbihkaXNwbGF5KSwxKSkgeworCX0gCisJZnByaW50ZihzdGRlcnIsImZsaXBwZWQgdG8gbmV3IGhlaWdodCAlbGRcbiIsZmxpcHRvLT5mYl9oZWlnaHQpOworCXJldHVybiAwOworfQorCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkgSURpcmVjdERyYXdTdXJmYWNlMl9VbmxvY2soCisJTFBESVJFQ1REUkFXU1VSRkFDRTIgdGhpcyxMUFZPSUQgc3VyZmFjZQorKSB7CisJZHByaW50Zl9yZWxheShzdGRkZWIsIklEaXJlY3REcmF3U3VyZmFjZTIoJXApLT5VbmxvY2soJXApXG4iLHRoaXMsc3VyZmFjZSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBIUkVTVUxUIFdJTkFQSSBJRGlyZWN0RHJhd1N1cmZhY2VfU2V0UGFsZXR0ZSgKKwlMUERJUkVDVERSQVdTVVJGQUNFIHRoaXMsTFBESVJFQ1REUkFXUEFMRVRURSBwYWwKKykgeworCWZwcmludGYoc3RkZXJyLCJJRGlyZWN0RHJhd1N1cmZhY2UoJXApLT5TZXRQYWxldHRlKCVwKVxuIix0aGlzLHBhbCk7CisJdGhpcy0+cGFsZXR0ZSA9IHBhbDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIEhSRVNVTFQgV0lOQVBJIElEaXJlY3REcmF3U3VyZmFjZTJfU2V0UGFsZXR0ZSgKKwlMUERJUkVDVERSQVdTVVJGQUNFMiB0aGlzLExQRElSRUNURFJBV1BBTEVUVEUgcGFsCispIHsKKwlmcHJpbnRmKHN0ZGVyciwiSURpcmVjdERyYXdTdXJmYWNlMiglcCktPlNldFBhbGV0dGUoJXApXG4iLHRoaXMscGFsKTsKKwl0aGlzLT5wYWxldHRlID0gcGFsOworCXJldHVybiAwOworfQorCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkgSURpcmVjdERyYXdTdXJmYWNlX0JsdCgKKwlMUERJUkVDVERSQVdTVVJGQUNFIHRoaXMsTFBSRUNUMzIgcmRzdCxMUERJUkVDVERSQVdTVVJGQUNFIHNyYyxMUFJFQ1QzMiByc3JjLERXT1JEIGR3RmxhZ3MsTFBEREJMVEZYIGxwYmx0ZngKKykgeworCWZwcmludGYoc3RkZXJyLCJJRGlyZWN0RHJhd1N1cmZhY2UoJXApLT5CbHQoJXAsJXAsJXAsJTA4bHgsJXApLHN0dWIhXG4iLAorCQl0aGlzLHJkc3Qsc3JjLHJzcmMsZHdGbGFncyxscGJsdGZ4CisJKTsKKwlpZiAocmRzdCkgZnByaW50ZihzdGRlcnIsIglkZXN0cmVjdCA6JWR4JWQtJWR4JWRcbiIscmRzdC0+bGVmdCxyZHN0LT50b3AscmRzdC0+cmlnaHQscmRzdC0+Ym90dG9tKTsKKwlpZiAocnNyYykgZnByaW50ZihzdGRlcnIsIglzcmNyZWN0ICA6JWR4JWQtJWR4JWRcbiIscnNyYy0+bGVmdCxyc3JjLT50b3AscnNyYy0+cmlnaHQscnNyYy0+Ym90dG9tKTsKKwlmcHJpbnRmKHN0ZGVyciwiCWJsaXRmeDogMHglMDhseFxuIixscGJsdGZ4LT5kd0RERlgpOworCXJldHVybiAwOworfQorCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkgSURpcmVjdERyYXdTdXJmYWNlX0JsdEZhc3QoCisJTFBESVJFQ1REUkFXU1VSRkFDRSB0aGlzLERXT1JEIGRzdHgsRFdPUkQgZHN0eSxMUERJUkVDVERSQVdTVVJGQUNFIHNyYyxMUFJFQ1QzMiByc3JjLERXT1JEIHRyYW5zCispIHsKKwlpbnQJaSxicHA7CisJZnByaW50ZihzdGRlcnIsIklEaXJlY3REcmF3U3VyZmFjZSglcCktPkJsdEZhc3QoJWxkLCVsZCwlcCwlcCwlMDhseCksc3R1YiFcbiIsCisJCXRoaXMsZHN0eCxkc3R5LHNyYyxyc3JjLHRyYW5zCisJKTsKKwlmcHJpbnRmKHN0ZGVyciwiCXNyY3JlY3Q6ICVkeCVkLSVkeCVkXG4iLHJzcmMtPmxlZnQscnNyYy0+dG9wLHJzcmMtPnJpZ2h0LHJzcmMtPmJvdHRvbSk7CisJYnBwID0gdGhpcy0+ZGRyYXctPmQuZGVwdGgvODsKKwlmb3IgKGk9MDtpPHJzcmMtPmJvdHRvbS1yc3JjLT50b3A7aSsrKSB7CisJCW1lbWNweSgJdGhpcy0+c3VyZmFjZSsoKGkrZHN0eSkqdGhpcy0+d2lkdGgqYnBwKStkc3R4KmJwcCwKKwkJCXNyYy0+c3VyZmFjZSArKHJzcmMtPnRvcCtpKSpzcmMtPndpZHRoKmJwcCtyc3JjLT5sZWZ0KmJwcCwKKwkJCShyc3JjLT5yaWdodC1yc3JjLT5sZWZ0KSpicHAKKwkJKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBIUkVTVUxUIFdJTkFQSSBJRGlyZWN0RHJhd1N1cmZhY2VfQmx0QmF0Y2goCisJTFBESVJFQ1REUkFXU1VSRkFDRSB0aGlzLExQRERCTFRCQVRDSCBkZGJsdGJhdGNoLERXT1JEIHgsRFdPUkQgeQorKSB7CisJZnByaW50ZihzdGRlcnIsIklEaXJlY3REcmF3U3VyZmFjZSglcCktPkJsdEJhdGNoKCVwLCUwOGx4LCUwOGx4KSxzdHViIVxuIiwKKwkJdGhpcyxkZGJsdGJhdGNoLHgseQorCSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBIUkVTVUxUIFdJTkFQSSBJRGlyZWN0RHJhd1N1cmZhY2VfR2V0Q2FwcygKKwlMUERJUkVDVERSQVdTVVJGQUNFIHRoaXMsTFBERFNDQVBTIGNhcHMKKykgeworCWZwcmludGYoc3RkZXJyLCJJRGlyZWN0RHJhd1N1cmZhY2UoJXApLT5HZXRDYXBzKCVwKSxzdHViIVxuIix0aGlzLGNhcHMpOworCWNhcHMtPmR3Q2FwcyA9IDA7IC8qIHdlIGNhbm5vdCBkbyBhbnl0aGluZyAqLworCXJldHVybiAwOworfQorCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkgSURpcmVjdERyYXdTdXJmYWNlX0dldFN1cmZhY2VEZXNjKAorCUxQRElSRUNURFJBV1NVUkZBQ0UgdGhpcyxMUEREU1VSRkFDRURFU0MgZGRzZAorKSB7CisJZnByaW50ZihzdGRlcnIsIklEaXJlY3REcmF3U3VyZmFjZSglcCktPkdldFN1cmZhY2VEZXNjKCVwKVxuIix0aGlzLGRkc2QpOworCWlmIChkZHNkLT5kd0ZsYWdzICYgRERTRF9DQVBTKQorCQlkZHNkLT5kZHNDYXBzLmR3Q2FwcyA9IDA7CisJaWYgKGRkc2QtPmR3RmxhZ3MgJiBERFNEX0JBQ0tCVUZGRVJDT1VOVCkKKwkJZGRzZC0+ZHdCYWNrQnVmZmVyQ291bnQgPSAxOworCWlmIChkZHNkLT5kd0ZsYWdzICYgRERTRF9IRUlHSFQpCisJCWRkc2QtPmR3SGVpZ2h0ID0gdGhpcy0+aGVpZ2h0OworCWlmIChkZHNkLT5kd0ZsYWdzICYgRERTRF9XSURUSCkKKwkJZGRzZC0+ZHdIZWlnaHQgPSB0aGlzLT53aWR0aDsKKwlkZHNkLT5kd0ZsYWdzICY9IH4oRERTRF9DQVBTfEREU0RfQkFDS0JVRkZFUkNPVU5UfEREU0RfSEVJR0hUfEREU0RfV0lEVEgpOworCWlmIChkZHNkLT5kd0ZsYWdzKQorCQlmcHJpbnRmKHN0ZGVyciwiCWRkc2QtPmZsYWdzIGlzIDB4JTA4bHhcbiIsZGRzZC0+ZHdGbGFncyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBVTE9ORyBXSU5BUEkgSURpcmVjdERyYXdTdXJmYWNlX0FkZFJlZihMUERJUkVDVERSQVdTVVJGQUNFIHRoaXMpIHsKKwlkcHJpbnRmX3JlbGF5KHN0ZGRlYiwiSURpcmVjdERyYXdTdXJmYWNlKCVwKS0+QWRkUmVmKClcbiIsdGhpcyk7CisJcmV0dXJuICsrKHRoaXMtPnJlZik7Cit9CisKK3N0YXRpYyBVTE9ORyBXSU5BUEkgSURpcmVjdERyYXdTdXJmYWNlX1JlbGVhc2UoTFBESVJFQ1REUkFXU1VSRkFDRSB0aGlzKSB7CisJZHByaW50Zl9yZWxheShzdGRkZWIsIklEaXJlY3REcmF3U3VyZmFjZSglcCktPlJlbGVhc2UoKVxuIix0aGlzKTsKKwlpZiAoIS0tKHRoaXMtPnJlZikpIHsKKwkJdGhpcy0+ZGRyYXctPmxwdnRibC0+Zm5SZWxlYXNlKHRoaXMtPmRkcmF3KTsKKwkJSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwwLHRoaXMpOworCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIHRoaXMtPnJlZjsKK30KKworc3RhdGljIFVMT05HIFdJTkFQSSBJRGlyZWN0RHJhd1N1cmZhY2UyX0FkZFJlZihMUERJUkVDVERSQVdTVVJGQUNFMiB0aGlzKSB7CisJZHByaW50Zl9yZWxheShzdGRkZWIsIklEaXJlY3REcmF3U3VyZmFjZTIoJXApLT5BZGRSZWYoKVxuIix0aGlzKTsKKwlyZXR1cm4gKysodGhpcy0+cmVmKTsKK30KKworc3RhdGljIFVMT05HIFdJTkFQSSBJRGlyZWN0RHJhd1N1cmZhY2UyX1JlbGVhc2UoTFBESVJFQ1REUkFXU1VSRkFDRTIgdGhpcykgeworCWRwcmludGZfcmVsYXkoc3RkZGViLCJJRGlyZWN0RHJhd1N1cmZhY2UyKCVwKS0+UmVsZWFzZSgpXG4iLHRoaXMpOworCWlmICghLS0odGhpcy0+cmVmKSkgeworCQl0aGlzLT5kZHJhdy0+bHB2dGJsLT5mblJlbGVhc2UodGhpcy0+ZGRyYXcpOworCQlIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLDAsdGhpcyk7CisJCXJldHVybiAwOworCX0KKwlyZXR1cm4gdGhpcy0+cmVmOworfQorCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkgSURpcmVjdERyYXdTdXJmYWNlMl9HZXRBdHRhY2hlZFN1cmZhY2UoCisJTFBESVJFQ1REUkFXU1VSRkFDRTIgdGhpcyxMUEREU0NBUFMgbHBkZHNkLExQRElSRUNURFJBV1NVUkZBQ0UyICpscGRzZgorKSB7CisJRERTVVJGQUNFREVTQwlkZHNmZDsKKwlJVW5rbm93bgl1bms7CisKKwkvKiBET0VTIE5PVCBDUkVBVEUgVEhFTSwgYnV0IHVzZXMgdGhlIG9uZXMgYWxyZWFkeSBhdHRhY2hlZCB0byB0aGlzCisJICogc3VyZmFjZSAKKwkgKi8KKwlmcHJpbnRmKHN0ZGVyciwiSURpcmVjdERyYXdTdXJmYWNlMiglcCktPkdldEF0dGFjaGVkU3VyZmFjZSglcCwlcClcbiIsdGhpcyxscGRkc2QsbHBkc2YpOworCS8qIEZJWE1FOiBub3QgY29ycmVjdCAqLworCUlEaXJlY3REcmF3Ml9DcmVhdGVTdXJmYWNlKChMUERJUkVDVERSQVcyKXRoaXMtPmRkcmF3LCZkZHNmZCwoTFBESVJFQ1REUkFXU1VSRkFDRSopbHBkc2YsJnVuayk7CisKKwlscGRkc2QtPmR3Q2FwcyA9IDA7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBIUkVTVUxUIFdJTkFQSSBJRGlyZWN0RHJhd1N1cmZhY2VfR2V0QXR0YWNoZWRTdXJmYWNlKAorCUxQRElSRUNURFJBV1NVUkZBQ0UgdGhpcyxMUEREU0NBUFMgbHBkZHNkLExQRElSRUNURFJBV1NVUkZBQ0UgKmxwZHNmCispIHsKKwlMUEREU1VSRkFDRURFU0MJbHBkZHNmZDsKKwlJVW5rbm93bgl1bms7CisKKwlmcHJpbnRmKHN0ZGVyciwiSURpcmVjdERyYXdTdXJmYWNlKCVwKS0+R2V0QXR0YWNoZWRTdXJmYWNlKCVwLCVwKVxuIix0aGlzLGxwZGRzZCxscGRzZik7CisJLyogRklYTUU6IG5vdCBjb3JyZWN0ICovCisJSURpcmVjdERyYXdfQ3JlYXRlU3VyZmFjZSh0aGlzLT5kZHJhdywmbHBkZHNmZCxscGRzZiwmdW5rKTsKKwlscGRkc2QtPmR3Q2FwcyA9IDA7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBIUkVTVUxUIFdJTkFQSSBJRGlyZWN0RHJhd1N1cmZhY2VfSW5pdGlhbGl6ZSgKKwlMUERJUkVDVERSQVdTVVJGQUNFIHRoaXMsTFBESVJFQ1REUkFXIGRkcmF3LExQRERTVVJGQUNFREVTQyBscGRzZmQKKykgeworCWZwcmludGYoc3RkZXJyLCJJRGlyZWN0RHJhd1N1cmZhY2UoJXApLT5Jbml0aWFsaXplKCVwLCVwKVxuIiwKKwkJdGhpcyxkZHJhdyxscGRzZmQKKwkpOworCWZwcmludGYoc3RkZXJyLCIJZHdGbGFncyBpcyAlMDhseFxuIixscGRzZmQtPmR3RmxhZ3MpOworCXJldHVybiAwOworfQorCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkgSURpcmVjdERyYXdTdXJmYWNlX0dldFBpeGVsRm9ybWF0KAorCUxQRElSRUNURFJBV1NVUkZBQ0UgdGhpcyxMUEREUElYRUxGT1JNQVQgcGYKKykgeworCWZwcmludGYoc3RkZXJyLCJJRGlyZWN0RHJhd1N1cmZhY2UoJXApLT5HZXRQaXhlbEZvcm1hdCglcClcbiIsdGhpcyxwZik7CisJcmV0dXJuIF9nZXRwaXhlbGZvcm1hdCh0aGlzLT5kZHJhdyxwZik7Cit9CisKK3N0YXRpYyBIUkVTVUxUIFdJTkFQSSBJRGlyZWN0RHJhd1N1cmZhY2VfR2V0Qmx0U3RhdHVzKExQRElSRUNURFJBV1NVUkZBQ0UgdGhpcyxEV09SRCBkd0ZsYWdzKSB7CisJZnByaW50ZihzdGRlcnIsIklEaXJlY3REcmF3U3VyZmFjZSglcCktPkdldEJsdFN0YXR1cygweCUwOGx4KSxzdHViIVxuIiwKKwkJdGhpcyxkd0ZsYWdzCisJKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIEhSRVNVTFQgV0lOQVBJIElEaXJlY3REcmF3U3VyZmFjZV9HZXRPdmVybGF5UG9zaXRpb24oCisJTFBESVJFQ1REUkFXU1VSRkFDRSB0aGlzLExQTE9ORyB4MSxMUExPTkcgeDIKKykgeworCWZwcmludGYoc3RkZXJyLCJJRGlyZWN0RHJhd1N1cmZhY2UoJXApLT5HZXRPdmVybGF5UG9zaXRpb24oJXAsJXApLHN0dWIhXG4iLAorCQl0aGlzLHgxLHgyCisJKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIEhSRVNVTFQgV0lOQVBJIElEaXJlY3REcmF3U3VyZmFjZV9HZXREQyhMUERJUkVDVERSQVdTVVJGQUNFIHRoaXMsSERDMzIqIGxwaGRjKSB7CisJZnByaW50ZihzdGRlcnIsIklEaXJlY3REcmF3U3VyZmFjZSglcCktPkdldERDKCVwKSxzdHViIVxuIix0aGlzLGxwaGRjKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIEhSRVNVTFQgV0lOQVBJIElEaXJlY3REcmF3U3VyZmFjZTJfRW51bUF0dGFjaGVkU3VyZmFjZXMoTFBESVJFQ1REUkFXU1VSRkFDRTIgdGhpcyxMUFZPSUQgY29udGV4dCxMUERERU5VTVNVUkZBQ0VTQ0FMTEJBQ0sgZXNmY2IpIHsKKwkvKiBub25lIHlldD8gKi8KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBJRGlyZWN0RHJhd1N1cmZhY2UyX1ZUYWJsZSBkZHMydnQgPSB7CisJMS8qSURpcmVjdERyYXdTdXJmYWNlMl9RdWVyeUludGVyZmFjZSovLAorCUlEaXJlY3REcmF3U3VyZmFjZTJfQWRkUmVmLAorCUlEaXJlY3REcmF3U3VyZmFjZTJfUmVsZWFzZSwKKwk0LAorCTUsCisJNi8qSURpcmVjdERyYXdTdXJmYWNlX0JsdCovLAorCTcvKklEaXJlY3REcmF3U3VyZmFjZV9CbHRCYXRjaCovLAorCTgsCisJOSwKKwlJRGlyZWN0RHJhd1N1cmZhY2UyX0VudW1BdHRhY2hlZFN1cmZhY2VzLAorCTExLAorCTEyLAorCUlEaXJlY3REcmF3U3VyZmFjZTJfR2V0QXR0YWNoZWRTdXJmYWNlLAorCTE0LAorCTE1LypJRGlyZWN0RHJhd1N1cmZhY2VfR2V0Q2FwcyovLAorCTE2LAorCTE3LAorCTE4LAorCTE5LAorCTIwLAorCTIxLAorCTIyLAorCTIzLypJRGlyZWN0RHJhd1N1cmZhY2VfR2V0U3VyZmFjZURlc2MqLywKKwkyNCwKKwkyNSwKKwlJRGlyZWN0RHJhd1N1cmZhY2UyX0xvY2ssCisJMjcsCisJMjgsCisJMjksCisJMzAsCisJMzEsCisJSURpcmVjdERyYXdTdXJmYWNlMl9TZXRQYWxldHRlLAorCUlEaXJlY3REcmF3U3VyZmFjZTJfVW5sb2NrLAorCTM0LAorCTM1LAorCTM2LAorCTM3LAorCTM4LAorCTM5LAorfTsKKworCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkgSURpcmVjdERyYXdTdXJmYWNlX1F1ZXJ5SW50ZXJmYWNlKExQRElSRUNURFJBV1NVUkZBQ0UgdGhpcyxSRUZJSUQgcmVmaWlkLExQVk9JRCAqb2JqKSB7CisgICAgICAgIGNoYXIgICAgeHJlZmlpZFs1MF07CisKKyAgICAgICAgU3RyaW5nRnJvbUNMU0lEKChMUENMU0lEKXJlZmlpZCx4cmVmaWlkKTsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsIklEaXJlY3REcmF3U3VyZmFjZSglcCktPlF1ZXJ5SW50ZXJmYWNlKCVzLCVwKVxuIix0aGlzLHhyZWZpaWQsb2JqKTsKKwkKKwkvKiB0aGF0cyB2ZXJzaW9uIDIgKi8KKwlpZiAoCSFtZW1jbXAoJklJRF9JRGlyZWN0RHJhd1N1cmZhY2UyLHJlZmlpZCxzaXplb2YoSUlEX0lEaXJlY3REcmF3U3VyZmFjZTIpKSkgeworCQl0aGlzLT5scHZ0YmwtPmZuQWRkUmVmKHRoaXMpOworCQl0aGlzLT5scHZ0YmwgPSAoTFBESVJFQ1REUkFXU1VSRkFDRV9WVEFCTEUpJmRkczJ2dDsKKwkJKm9iaiA9IHRoaXM7CisJCXJldHVybiAwOworCX0KKwkvKiB0aGF0cyB1cyAqLworCWlmICghbWVtY21wKCZJSURfSURpcmVjdERyYXdTdXJmYWNlLHJlZmlpZCxzaXplb2YoSUlEX0lEaXJlY3REcmF3U3VyZmFjZSkpKSB7CisJCXRoaXMtPmxwdnRibC0+Zm5BZGRSZWYodGhpcyk7CisJCSpvYmogPSB0aGlzOworCQlyZXR1cm4gMDsKKwl9CisgICAgCXJldHVybiBPTEVfRV9FTlVNX05PTU9SRTsKK30KKworc3RhdGljIHN0cnVjdCBJRGlyZWN0RHJhd1N1cmZhY2VfVlRhYmxlIGRkc3Z0ID0geworCUlEaXJlY3REcmF3U3VyZmFjZV9RdWVyeUludGVyZmFjZSwKKwlJRGlyZWN0RHJhd1N1cmZhY2VfQWRkUmVmLAorCUlEaXJlY3REcmF3U3VyZmFjZV9SZWxlYXNlLAorCTQsCisJNSwKKwlJRGlyZWN0RHJhd1N1cmZhY2VfQmx0LAorCUlEaXJlY3REcmF3U3VyZmFjZV9CbHRCYXRjaCwKKwlJRGlyZWN0RHJhd1N1cmZhY2VfQmx0RmFzdCwKKwk5LAorCTEwLAorCTExLAorCUlEaXJlY3REcmF3U3VyZmFjZV9GbGlwLAorCUlEaXJlY3REcmF3U3VyZmFjZV9HZXRBdHRhY2hlZFN1cmZhY2UsCisJSURpcmVjdERyYXdTdXJmYWNlX0dldEJsdFN0YXR1cywKKwlJRGlyZWN0RHJhd1N1cmZhY2VfR2V0Q2FwcywKKwkxNiwKKwkxNywKKwlJRGlyZWN0RHJhd1N1cmZhY2VfR2V0REMsCisJMTksCisJSURpcmVjdERyYXdTdXJmYWNlX0dldE92ZXJsYXlQb3NpdGlvbiwKKwkyMSwKKwlJRGlyZWN0RHJhd1N1cmZhY2VfR2V0UGl4ZWxGb3JtYXQsCisJSURpcmVjdERyYXdTdXJmYWNlX0dldFN1cmZhY2VEZXNjLAorCUlEaXJlY3REcmF3U3VyZmFjZV9Jbml0aWFsaXplLAorCTI1LAorCUlEaXJlY3REcmF3U3VyZmFjZV9Mb2NrLAorCTI3LAorCTI4LAorCTI5LAorCTMwLAorCTMxLAorCUlEaXJlY3REcmF3U3VyZmFjZV9TZXRQYWxldHRlLAorCUlEaXJlY3REcmF3U3VyZmFjZV9VbmxvY2ssCisJMzQsCisJMzUsCisJMzYsCit9OworCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkgSURpcmVjdERyYXdfQ3JlYXRlU3VyZmFjZSgKKwlMUERJUkVDVERSQVcgdGhpcyxMUEREU1VSRkFDRURFU0MgKmxwZGRzZCxMUERJUkVDVERSQVdTVVJGQUNFICpscGRzZixJVW5rbm93biAqbHB1bmsKKykgeworCWZwcmludGYoc3RkZXJyLCJJRGlyZWN0RHJhdyglcCktPkNyZWF0ZVN1cmZhY2UoJXAsJXAsJXApXG4iLHRoaXMsbHBkZHNkLGxwZHNmLGxwdW5rKTsKKwkqbHBkc2YgPSAoTFBESVJFQ1REUkFXU1VSRkFDRSlIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwwLHNpemVvZihJRGlyZWN0RHJhd1N1cmZhY2UpKTsKKwl0aGlzLT5scHZ0YmwtPmZuQWRkUmVmKHRoaXMpOworCSgqbHBkc2YpLT5yZWYgPSAxOworCSgqbHBkc2YpLT5scHZ0YmwgPSAmZGRzdnQ7CisJKCpscGRzZiktPnN1cmZhY2UgPSB0aGlzLT5kLmZiX2FkZHIrKHRoaXMtPmQuY3VycmVudF9oZWlnaHQqdGhpcy0+ZC5mYl93aWR0aCp0aGlzLT5kLmRlcHRoLzgpOworCSgqbHBkc2YpLT5mYl9oZWlnaHQgPSB0aGlzLT5kLmN1cnJlbnRfaGVpZ2h0OyAvKiBmb3Igc2V0dmlld3BvcnQgKi8KKwl0aGlzLT5kLmN1cnJlbnRfaGVpZ2h0ICs9IHRoaXMtPmQuZmJfaGVpZ2h0OworCSgqbHBkc2YpLT53aWR0aCA9IHRoaXMtPmQud2lkdGg7CisJKCpscGRzZiktPmhlaWdodCA9IHRoaXMtPmQuaGVpZ2h0OworCSgqbHBkc2YpLT5kZHJhdyA9IHRoaXM7CisJKCpscGRzZiktPmxwaXRjaCA9IHRoaXMtPmQuZmJfd2lkdGgqdGhpcy0+ZC5kZXB0aC84OworCSpscGRkc2QgPSAoTFBERFNVUkZBQ0VERVNDKUhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLDAsc2l6ZW9mKEREU1VSRkFDRURFU0MpKTsKKwkoKmxwZGRzZCktPmR3V2lkdGggPSB0aGlzLT5kLndpZHRoOworCSgqbHBkZHNkKS0+ZHdIZWlnaHQgPSB0aGlzLT5kLmhlaWdodDsKKwkoKmxwZGRzZCktPmxQaXRjaCA9IHRoaXMtPmQuZmJfd2lkdGgqdGhpcy0+ZC5kZXB0aC84OworCSgqbHBkZHNkKS0+ZGRzQ2Fwcy5kd0NhcHMgPSAwOworCXJldHVybiAwOworfQorCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkgSURpcmVjdERyYXdfRHVwbGljYXRlU3VyZmFjZSgKKwlMUERJUkVDVERSQVcgdGhpcyxMUERJUkVDVERSQVdTVVJGQUNFIHNyYyxMUERJUkVDVERSQVdTVVJGQUNFICpkc3QKKykgeworCWZwcmludGYoc3RkZXJyLCJJRGlyZWN0RHJhdyglcCktPkR1cGxpY2F0ZVN1cmZhY2UoJXAsJXApXG4iLHRoaXMsc3JjLGRzdCk7CisJKmRzdCA9IHNyYzsgLyogRklYTUUgKi8KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIEhSRVNVTFQgV0lOQVBJIElEaXJlY3REcmF3Ml9DcmVhdGVTdXJmYWNlKAorCUxQRElSRUNURFJBVzIgdGhpcyxMUEREU1VSRkFDRURFU0MgbHBkZHNkLExQRElSRUNURFJBV1NVUkZBQ0UgKmxwZHNmLElVbmtub3duICpscHVuaworKSB7CisJZnByaW50ZihzdGRlcnIsIklEaXJlY3REcmF3MiglcCktPkNyZWF0ZVN1cmZhY2UoJXAsJXAsJXApXG4iLHRoaXMsbHBkZHNkLGxwZHNmLGxwdW5rKTsKKwkqbHBkc2YgPSAoTFBESVJFQ1REUkFXU1VSRkFDRSlIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwwLHNpemVvZihJRGlyZWN0RHJhd1N1cmZhY2UpKTsKKwl0aGlzLT5scHZ0YmwtPmZuQWRkUmVmKHRoaXMpOworCSgqbHBkc2YpLT5yZWYgPSAxOworCSgqbHBkc2YpLT5scHZ0YmwgPSAmZGRzdnQ7CisJKCpscGRzZiktPnN1cmZhY2UgPSB0aGlzLT5kLmZiX2FkZHIrKHRoaXMtPmQuY3VycmVudF9oZWlnaHQqdGhpcy0+ZC5mYl93aWR0aCp0aGlzLT5kLmRlcHRoLzgpOworCSgqbHBkc2YpLT53aWR0aCA9IHRoaXMtPmQud2lkdGg7CisJKCpscGRzZiktPmhlaWdodCA9IHRoaXMtPmQuaGVpZ2h0OworCSgqbHBkc2YpLT5kZHJhdyA9IChMUERJUkVDVERSQVcpdGhpczsKKwkoKmxwZHNmKS0+ZmJfaGVpZ2h0ID0gdGhpcy0+ZC5jdXJyZW50X2hlaWdodDsKKwkoKmxwZHNmKS0+bHBpdGNoID0gdGhpcy0+ZC5mYl93aWR0aCp0aGlzLT5kLmRlcHRoLzg7CisJdGhpcy0+ZC5jdXJyZW50X2hlaWdodCArPSB0aGlzLT5kLmZiX2hlaWdodDsKKwlscGRkc2QtPmR3V2lkdGggPSB0aGlzLT5kLndpZHRoOworCWxwZGRzZC0+ZHdIZWlnaHQgPSB0aGlzLT5kLmhlaWdodDsKKwlscGRkc2QtPmxQaXRjaCA9IHRoaXMtPmQuZmJfd2lkdGgqdGhpcy0+ZC5kZXB0aC84OworCWxwZGRzZC0+ZGRzQ2Fwcy5kd0NhcHMgPSAwOworCXJldHVybiAwOworfQorCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkgSURpcmVjdERyYXdfU2V0Q29vcGVyYXRpdmVMZXZlbCgKKwlMUERJUkVDVERSQVcgdGhpcyxIV05EMzIgaHduZCxEV09SRCB4CispIHsKKwlmcHJpbnRmKHN0ZGVyciwiSURpcmVjdERyYXcoJXApLT5TZXRDb29wZXJhdGl2ZUxldmVsKCUwOGx4LCUwOGx4KSxzdHViIVxuIiwKKwkJdGhpcywoRFdPUkQpaHduZCx4CisJKTsKKwl0aGlzLT5kLm1haW53aW5kb3cgPSBod25kOworCXJldHVybiAwOworfQorCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkgSURpcmVjdERyYXdfU2V0RGlzcGxheU1vZGUoCisJTFBESVJFQ1REUkFXIHRoaXMsRFdPUkQgd2lkdGgsRFdPUkQgaGVpZ2h0LERXT1JEIGRlcHRoCispIHsKKwlpbnQJaSwqZGVwdGhzLGRlcGNvdW50OworCWNoYXIJYnVmWzIwMF07CisKKwlmcHJpbnRmKHN0ZGVyciwiSURpcmVjdERyYXcoJXApLT5TZXREaXNwbGF5TW9kZSglbGQsJWxkLCVsZCksc3R1YiFcbiIsdGhpcyx3aWR0aCxoZWlnaHQsZGVwdGgpOworCisJZGVwdGhzID0gWExpc3REZXB0aHMoZGlzcGxheSxEZWZhdWx0U2NyZWVuKGRpc3BsYXkpLCZkZXBjb3VudCk7CisJZm9yIChpPTA7aTxkZXBjb3VudDtpKyspCisJCWlmIChkZXB0aHNbaV09PWRlcHRoKQorCQkJYnJlYWs7CisJWEZyZWUoZGVwdGhzKTsKKwlpZiAoaT09ZGVwY291bnQpIHsvKiBub3QgZm91bmQgKi8KKwkJc3ByaW50ZihidWYsIlNldERpc3BsYXlNb2RlKHc9JWxkLGg9JWxkLGQ9JWxkKSwgdW5zdXBwb3J0ZWQgZGVwdGghIix3aWR0aCxoZWlnaHQsZGVwdGgpOworCQlNZXNzYWdlQm94MzJBKDAsYnVmLCJXSU5FIERpcmVjdERyYXciLE1CX09LfE1CX0lDT05TVE9QKTsKKwkJcmV0dXJuIERERVJSX1VOU1VQUE9SVEVETU9ERTsKKwl9CisJaWYgKHRoaXMtPmQuZmJfd2lkdGggPCB3aWR0aCkgeworCQlzcHJpbnRmKGJ1ZiwiU2V0RGlzcGxheU1vZGUodz0lbGQsaD0lbGQsZD0lbGQpLCB3aWR0aCAlbGQgZXhjZWVkcyBmcmFtZWJ1ZmZlciB3aWR0aCAlbGQiLHdpZHRoLGhlaWdodCxkZXB0aCx3aWR0aCx0aGlzLT5kLmZiX3dpZHRoKTsKKwkJTWVzc2FnZUJveDMyQSgwLGJ1ZiwiV0lORSBEaXJlY3REcmF3IixNQl9PS3xNQl9JQ09OU1RPUCk7CisJCXJldHVybiBEREVSUl9VTlNVUFBPUlRFRE1PREU7CisJfQorCXRoaXMtPmQud2lkdGgJPSB3aWR0aDsKKwl0aGlzLT5kLmhlaWdodAk9IGhlaWdodDsKKwkvKiBhZGp1c3QgZmJfaGVpZ2h0LCBzbyB3ZSBkb24ndCBvdmVybGFwICovCisJaWYgKHRoaXMtPmQuZmJfaGVpZ2h0IDwgaGVpZ2h0KQorCQl0aGlzLT5kLmZiX2hlaWdodCA9IGhlaWdodDsKKwl0aGlzLT5kLmRlcHRoCT0gZGVwdGg7CisJWEY4NkRHQURpcmVjdFZpZGVvKGRpc3BsYXksRGVmYXVsdFNjcmVlbihkaXNwbGF5KSxYRjg2REdBRGlyZWN0R3JhcGhpY3MpOworCXJldHVybiAwOworfQorc3RhdGljIEhSRVNVTFQgV0lOQVBJIElEaXJlY3REcmF3X0dldENhcHMoCisJTFBESVJFQ1REUkFXIHRoaXMsTFBERENBUFMgY2FwczEsTFBERENBUFMgY2FwczIKKykgIHsKKwlmcHJpbnRmKHN0ZGVyciwiSURpcmVjdERyYXcoJXApLT5HZXRDYXBzKCVwLCVwKSxzdHViIVxuIix0aGlzLGNhcHMxLGNhcHMyKTsKKwljYXBzMS0+ZHdWaWRNZW1Ub3RhbCA9IHRoaXMtPmQuZmJfbWVtc2l6ZTsKKwljYXBzMS0+ZHdDYXBzID0gMDsgLyogd2UgY2Fubm90IGRvIGFueXRoaW5nICovCisJY2FwczEtPmRkc0NhcHMuZHdDYXBzID0gMDsgLyogd2UgY2Fubm90IGRvIGFueXRoaW5nICovCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBIUkVTVUxUIFdJTkFQSSBJRGlyZWN0RHJhdzJfR2V0Q2FwcygKKwlMUERJUkVDVERSQVcyIHRoaXMsTFBERENBUFMgY2FwczEsTFBERENBUFMgY2FwczIKKykgIHsKKwlmcHJpbnRmKHN0ZGVyciwiSURpcmVjdERyYXcyKCVwKS0+R2V0Q2FwcyglcCwlcCksc3R1YiFcbiIsdGhpcyxjYXBzMSxjYXBzMik7CisJY2FwczEtPmR3VmlkTWVtVG90YWwgPSB0aGlzLT5kLmZiX21lbXNpemU7CisJY2FwczEtPmR3Q2FwcyA9IDA7IC8qIHdlIGNhbm5vdCBkbyBhbnl0aGluZyAqLworCWNhcHMxLT5kZHNDYXBzLmR3Q2FwcyA9IDA7CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIHN0cnVjdCBJRGlyZWN0RHJhd0NsaXBwZXJfVlRhYmxlIGRkY2xpcHZ0ID0geworCTEsMiwzLDQsNSw2LDB4MTAwMDcsOCw5Cit9OworCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkgSURpcmVjdERyYXdfQ3JlYXRlQ2xpcHBlcigKKwlMUERJUkVDVERSQVcgdGhpcyxEV09SRCB4LExQRElSRUNURFJBV0NMSVBQRVIgKmxwZGRjbGlwLExQVU5LTk9XTiBscHVuaworKSB7CisJZnByaW50ZihzdGRlcnIsIklEaXJlY3REcmF3KCVwKS0+Q3JlYXRlQ2xpcHBlciglMDhseCwlcCwlcCksc3R1YiFcbiIsCisJCXRoaXMseCxscGRkY2xpcCxscHVuaworCSk7CisJKmxwZGRjbGlwID0gKExQRElSRUNURFJBV0NMSVBQRVIpSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksMCxzaXplb2YoSURpcmVjdERyYXdDbGlwcGVyKSk7CisJKCpscGRkY2xpcCktPnJlZiA9IDE7CisJKCpscGRkY2xpcCktPmxwdnRibCA9ICZkZGNsaXB2dDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIEhSRVNVTFQgV0lOQVBJIElEaXJlY3REcmF3UGFsZXR0ZV9HZXRFbnRyaWVzKAorCUxQRElSRUNURFJBV1BBTEVUVEUgdGhpcyxEV09SRCB4LERXT1JEIHksRFdPUkQgeixMUFBBTEVUVEVFTlRSWSBwYWxlbnQKKykgeworCWZwcmludGYoc3RkZXJyLCJJRGlyZWN0RHJhd1BhbGV0dGUoJXApLT5HZXRFbnRyaWVzKCUwOGx4LCUwOGx4LCUwOGx4LCVwKSxzdHViIVxuIiwKKwkJdGhpcyx4LHkseixwYWxlbnQKKwkpOworCXJldHVybiAwOworfQorCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkgSURpcmVjdERyYXdQYWxldHRlX1NldEVudHJpZXMoCisJTFBESVJFQ1REUkFXUEFMRVRURSB0aGlzLERXT1JEIHgsRFdPUkQgc3RhcnQsRFdPUkQgZW5kLExQUEFMRVRURUVOVFJZIHBhbGVudAorKSB7CisJWENvbG9yCQl4YzsKKwlpbnQJCWk7CisKKwlmcHJpbnRmKHN0ZGVyciwiSURpcmVjdERyYXdQYWxldHRlKCVwKS0+U2V0RW50cmllcyglMDhseCwlbGQsJWxkLCVwKVxuIiwKKwkJdGhpcyx4LHN0YXJ0LGVuZCxwYWxlbnQKKwkpOworCWlmICghdGhpcy0+Y20pIC8qIHNob3VsZCBub3QgaGFwcGVuICovIHsKKwkJZnByaW50ZihzdGRlcnIsIm5vIGNvbG9ybWFwIGluIFNldEVudHJpZXM/Pz9cbiIpOworCQlyZXR1cm4gRERFUlJfR0VORVJJQzsKKwl9CisJWEZyZWVDb2xvcm1hcChkaXNwbGF5LHRoaXMtPmNtKTsKKwl0aGlzLT5jbSA9IFhDcmVhdGVDb2xvcm1hcChkaXNwbGF5LERlZmF1bHRSb290V2luZG93KGRpc3BsYXkpLERlZmF1bHRWaXN1YWwoZGlzcGxheSxEZWZhdWx0U2NyZWVuKGRpc3BsYXkpKSxBbGxvY0FsbCk7CisJeGMucmVkID0geGMuYmx1ZSA9IHhjLmdyZWVuID0gMDsgeGMuZmxhZ3MgPSBEb1JlZHxEb0dyZWVufERvQmx1ZTsgeGMucGl4ZWwgPSAwOyBYU3RvcmVDb2xvcihkaXNwbGF5LHRoaXMtPmNtLCZ4Yyk7CisJeGMucmVkID0geGMuYmx1ZSA9IHhjLmdyZWVuID0gMHhmZmZmOyB4Yy5mbGFncyA9IERvUmVkfERvR3JlZW58RG9CbHVlOyB4Yy5waXhlbCA9IDI1NTsgWFN0b3JlQ29sb3IoZGlzcGxheSx0aGlzLT5jbSwmeGMpOworCWZvciAoaT1zdGFydDtpPGVuZDtpKyspIHsKKwkJeGMucmVkID0gcGFsZW50W2ktc3RhcnRdLnBlUmVkPDw4OworCQl4Yy5ibHVlID0gcGFsZW50W2ktc3RhcnRdLnBlQmx1ZTw8ODsKKwkJeGMuZ3JlZW4gPSBwYWxlbnRbaS1zdGFydF0ucGVHcmVlbjw8ODsKKwkJeGMuZmxhZ3MgPSBEb1JlZHxEb0JsdWV8RG9HcmVlbjsKKwkJeGMucGl4ZWwgPSBpOworCQlYU3RvcmVDb2xvcihkaXNwbGF5LHRoaXMtPmNtLCZ4Yyk7CisJfQorCVhGODZER0FJbnN0YWxsQ29sb3JtYXAoZGlzcGxheSxEZWZhdWx0U2NyZWVuKGRpc3BsYXkpLHRoaXMtPmNtKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIFVMT05HIFdJTkFQSSBJRGlyZWN0RHJhd1BhbGV0dGVfUmVsZWFzZShMUERJUkVDVERSQVdQQUxFVFRFIHRoaXMpIHsKKwlmcHJpbnRmKHN0ZGVyciwiSURpcmVjdERyYXdQYWxldHRlKCVwKS0+UmVsZWFzZSgpXG4iLHRoaXMpOworCWlmICghLS0odGhpcy0+cmVmKSkgeworCQlmcHJpbnRmKHN0ZGVyciwiSURpcmVjdERyYXdQYWxldHRlKCVwKSBmcmVlZCFcbiIsdGhpcyk7CisJCWlmICh0aGlzLT5jbSkgeworCQkJWEZyZWVDb2xvcm1hcChkaXNwbGF5LHRoaXMtPmNtKTsKKwkJCXRoaXMtPmNtID0gMDsKKwkJfQorCQlIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLDAsdGhpcyk7CisJCXJldHVybiAwOworCX0KKwlyZXR1cm4gdGhpcy0+cmVmOworfQorCitzdGF0aWMgVUxPTkcgV0lOQVBJIElEaXJlY3REcmF3UGFsZXR0ZV9BZGRSZWYoTFBESVJFQ1REUkFXUEFMRVRURSB0aGlzKSB7CisJZnByaW50ZihzdGRlcnIsIklEaXJlY3REcmF3UGFsZXR0ZSglcCktPkFkZFJlZigpXG4iLHRoaXMpOworCXJldHVybiArKyh0aGlzLT5yZWYpOworfQorCitzdGF0aWMgc3RydWN0IElEaXJlY3REcmF3UGFsZXR0ZV9WVGFibGUgZGRwYWx2dCA9IHsKKwkxLAorCUlEaXJlY3REcmF3UGFsZXR0ZV9BZGRSZWYsCisJSURpcmVjdERyYXdQYWxldHRlX1JlbGVhc2UsCisJNCwKKwlJRGlyZWN0RHJhd1BhbGV0dGVfR2V0RW50cmllcywKKwk2LAorCUlEaXJlY3REcmF3UGFsZXR0ZV9TZXRFbnRyaWVzCit9OworCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkgSURpcmVjdERyYXdfQ3JlYXRlUGFsZXR0ZSgKKwlMUERJUkVDVERSQVcgdGhpcyxEV09SRCB4LExQUEFMRVRURUVOVFJZIHBhbGVudCxMUERJUkVDVERSQVdQQUxFVFRFICpscGRkcGFsLExQVU5LTk9XTiBscHVuaworKSB7CisJZnByaW50ZihzdGRlcnIsIklEaXJlY3REcmF3KCVwKS0+Q3JlYXRlUGFsZXR0ZSglMDhseCwlcCwlcCwlcCksc3R1YiFcbiIsCisJCXRoaXMseCxwYWxlbnQsbHBkZHBhbCxscHVuaworCSk7CisJKmxwZGRwYWwgPSAoTFBESVJFQ1REUkFXUEFMRVRURSlIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwwLHNpemVvZihJRGlyZWN0RHJhd1BhbGV0dGUpKTsKKwkoKmxwZGRwYWwpLT5yZWYgPSAxOworCSgqbHBkZHBhbCktPmxwdnRibCA9ICZkZHBhbHZ0OworCSgqbHBkZHBhbCktPmRkcmF3ID0gdGhpczsKKwlpZiAodGhpcy0+ZC5kZXB0aDw9OCkgeworCQkoKmxwZGRwYWwpLT5jbSA9IFhDcmVhdGVDb2xvcm1hcChkaXNwbGF5LERlZmF1bHRSb290V2luZG93KGRpc3BsYXkpLERlZmF1bHRWaXN1YWwoZGlzcGxheSxEZWZhdWx0U2NyZWVuKGRpc3BsYXkpKSxBbGxvY0FsbCk7CisJCWZwcmludGYoc3RkZXJyLCJjcmVhdGVkIGNvbG9ybWFwLi4uXG4iKTsKKwl9IGVsc2UgLyogd2UgZG9uJ3Qgd2FudCBwYWxldHRlcyBpbiBoaWNvbG9yIG9yIHRydWVjb2xvciAqLworCQkoKmxwZGRwYWwpLT5jbSA9IDA7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIEhSRVNVTFQgV0lOQVBJIElEaXJlY3REcmF3Ml9DcmVhdGVQYWxldHRlKAorCUxQRElSRUNURFJBVzIgdGhpcyxEV09SRCB4LExQUEFMRVRURUVOVFJZIHBhbGVudCxMUERJUkVDVERSQVdQQUxFVFRFICpscGRkcGFsLExQVU5LTk9XTiBscHVuaworKSB7CisJcmV0dXJuIElEaXJlY3REcmF3X0NyZWF0ZVBhbGV0dGUoKExQRElSRUNURFJBVyl0aGlzLHgscGFsZW50LGxwZGRwYWwsbHB1bmspOworfQorCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkgSURpcmVjdERyYXdfV2FpdEZvclZlcnRpY2FsQmxhbmsoCisJTFBESVJFQ1REUkFXIHRoaXMsRFdPUkQgeCxIQU5ETEUzMiBoCispIHsKKwlmcHJpbnRmKHN0ZGVyciwiSURpcmVjdERyYXcoJXApLT5XYWl0Rm9yVmVydGljYWxCbGFuaygweCUwOGx4LDB4JTA4eCksc3R1YiFcbiIsdGhpcyx4LGgpOworCXJldHVybiAwOworfQorCitzdGF0aWMgVUxPTkcgV0lOQVBJIElEaXJlY3REcmF3X0FkZFJlZihMUERJUkVDVERSQVcgdGhpcykgeworCWRwcmludGZfcmVsYXkoc3RkZGViLCJJRGlyZWN0RHJhdyglcCktPkFkZFJlZigpXG4iLHRoaXMpOworCXJldHVybiArKyh0aGlzLT5yZWYpOworfQorCitzdGF0aWMgVUxPTkcgV0lOQVBJIElEaXJlY3REcmF3X1JlbGVhc2UoTFBESVJFQ1REUkFXIHRoaXMpIHsKKwlkcHJpbnRmX3JlbGF5KHN0ZGRlYiwiSURpcmVjdERyYXcoJXApLT5SZWxlYXNlKClcbiIsdGhpcyk7CisJaWYgKCEtLSh0aGlzLT5yZWYpKSB7CisJCWZwcmludGYoc3RkZXJyLCJJRGlyZWN0RHJhdzo6UmVsZWFzZTpmcmVlaW5nIElEaXJlY3REcmF3KCVwKVxuIix0aGlzKTsKKwkJSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwwLHRoaXMpOworCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIHRoaXMtPnJlZjsKK30KKworc3RhdGljIEhSRVNVTFQgV0lOQVBJIElEaXJlY3REcmF3Ml9RdWVyeUludGVyZmFjZSgKKwlMUERJUkVDVERSQVcyIHRoaXMsUkVGSUlEIHJlZmlpZCxMUFZPSUQgKm9iagorKSB7CisJcmV0dXJuIElEaXJlY3REcmF3X1F1ZXJ5SW50ZXJmYWNlKChMUERJUkVDVERSQVcpdGhpcyxyZWZpaWQsb2JqKTsKK30KKworc3RhdGljIFVMT05HIFdJTkFQSSBJRGlyZWN0RHJhdzJfQWRkUmVmKExQRElSRUNURFJBVzIgdGhpcykgeworCXJldHVybiBJRGlyZWN0RHJhd19BZGRSZWYoKExQRElSRUNURFJBVyl0aGlzKTsKK30KKworc3RhdGljIFVMT05HIFdJTkFQSSBJRGlyZWN0RHJhdzJfUmVsZWFzZShMUERJUkVDVERSQVcyIHRoaXMpIHsKKwlyZXR1cm4gSURpcmVjdERyYXdfUmVsZWFzZSgoTFBESVJFQ1REUkFXKXRoaXMpOworfQorCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkgSURpcmVjdERyYXcyX1NldENvb3BlcmF0aXZlTGV2ZWwoCisJTFBESVJFQ1REUkFXMiB0aGlzLEhXTkQzMiBod25kLERXT1JEIHgKKykgeworCWZwcmludGYoc3RkZXJyLCJJRGlyZWN0RHJhdzIoJXApLT5TZXRDb29wZXJhdGl2ZUxldmVsKCUwOGx4LCUwOGx4KSxzdHViIVxuIiwKKwkJdGhpcywoRFdPUkQpaHduZCx4CisJKTsKKwl0aGlzLT5kLm1haW53aW5kb3cgPSBod25kOworCXJldHVybiAwOworfQorCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkgSURpcmVjdERyYXcyX1NldERpc3BsYXlNb2RlKAorCUxQRElSRUNURFJBVzIgdGhpcyxEV09SRCB3aWR0aCxEV09SRCBoZWlnaHQsRFdPUkQgZGVwdGgsRFdPUkQgeHgsRFdPUkQgeXkKKykgeworCWZwcmludGYoc3RkZXJyLCJJRGlyZWN0RHJhdzIoJXApLT5TZXREaXNwbGF5TW9kZSglbGQsJWxkLCVsZCwlMDhseCwlMDhseCksc3R1YiFcbiIsdGhpcyx3aWR0aCxoZWlnaHQsZGVwdGgseHgseXkpOworCisJcmV0dXJuIElEaXJlY3REcmF3X1NldERpc3BsYXlNb2RlKChMUERJUkVDVERSQVcpdGhpcyx3aWR0aCxoZWlnaHQsZGVwdGgpOworfQorCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkgSURpcmVjdERyYXcyX1Jlc3RvcmVEaXNwbGF5TW9kZShMUERJUkVDVERSQVcyIHRoaXMpIHsKKwlmcHJpbnRmKHN0ZGVyciwiSURpcmVjdERyYXcyKCVwKS0+UmVzdG9yZURpc3BsYXlNb2RlKCksc3R1YiFcbiIsdGhpcyk7CisJWEY4NkRHQURpcmVjdFZpZGVvKGRpc3BsYXksRGVmYXVsdFNjcmVlbihkaXNwbGF5KSwwKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIEhSRVNVTFQgV0lOQVBJIElEaXJlY3REcmF3X1Jlc3RvcmVEaXNwbGF5TW9kZShMUERJUkVDVERSQVcgdGhpcykgeworCWZwcmludGYoc3RkZXJyLCJJRGlyZWN0RHJhdyglcCktPlJlc3RvcmVEaXNwbGF5TW9kZSgpLHN0dWIhXG4iLHRoaXMpOworCVhGODZER0FEaXJlY3RWaWRlbyhkaXNwbGF5LERlZmF1bHRTY3JlZW4oZGlzcGxheSksMCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBIUkVTVUxUIFdJTkFQSSBJRGlyZWN0RHJhdzJfRW51bVN1cmZhY2VzKAorCUxQRElSRUNURFJBVzIgdGhpcyxEV09SRCB4LExQRERTVVJGQUNFREVTQyBkZHNmZCxMUFZPSUQgY29udGV4dCxMUERERU5VTVNVUkZBQ0VTQ0FMTEJBQ0sgZGRzZmNiCispIHsKKwlmcHJpbnRmKHN0ZGVyciwiSURpcmVjdERyYXcyKCVwKS0+RW51bVN1cmZhY2VzKDB4JTA4bHgsJXAsJXAsJXApLHN0dWIhXG4iLHRoaXMseCxkZHNmZCxjb250ZXh0LGRkc2ZjYik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBJRGlyZWN0RHJhdzJfVlRhYmxlIGRkMnZ0ID0geworCUlEaXJlY3REcmF3Ml9RdWVyeUludGVyZmFjZSwKKwlJRGlyZWN0RHJhdzJfQWRkUmVmLAorCUlEaXJlY3REcmF3Ml9SZWxlYXNlLAorCTQsCisJNS8qSURpcmVjdERyYXdfQ3JlYXRlQ2xpcHBlciovLAorCUlEaXJlY3REcmF3Ml9DcmVhdGVQYWxldHRlLAorCUlEaXJlY3REcmF3Ml9DcmVhdGVTdXJmYWNlLAorCTgsCisJOSwKKwlJRGlyZWN0RHJhdzJfRW51bVN1cmZhY2VzLAorCTExLAorCUlEaXJlY3REcmF3Ml9HZXRDYXBzLAorCTEzLAorCTE0LAorCTE1LAorCTE2LAorCTE3LAorCTE4LAorCTE5LAorCUlEaXJlY3REcmF3Ml9SZXN0b3JlRGlzcGxheU1vZGUsCisJSURpcmVjdERyYXcyX1NldENvb3BlcmF0aXZlTGV2ZWwsCisJSURpcmVjdERyYXcyX1NldERpc3BsYXlNb2RlLAorCTIzLypJRGlyZWN0RHJhd19XYWl0Rm9yVmVydGljYWxCbGFuayovLAorCTI0Cit9OworCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkgSURpcmVjdERyYXdfUXVlcnlJbnRlcmZhY2UoCisJTFBESVJFQ1REUkFXIHRoaXMsUkVGSUlEIHJlZmlpZCxMUFZPSUQgKm9iagorKSB7CisgICAgICAgIGNoYXIgICAgeHJlZmlpZFs1MF07CisKKyAgICAgICAgU3RyaW5nRnJvbUNMU0lEKChMUENMU0lEKXJlZmlpZCx4cmVmaWlkKTsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsIklEaXJlY3REcmF3KCVwKS0+UXVlcnlJbnRlcmZhY2UoJXMsJXApXG4iLHRoaXMseHJlZmlpZCxvYmopOworICAgICAgICBpZiAoIW1lbWNtcCgmSUlEX0lEaXJlY3REcmF3LHJlZmlpZCxzaXplb2YoSUlEX0lEaXJlY3REcmF3KSkpIHsKKyAgICAgICAgICAgICAgICAqb2JqID0gdGhpczsKKwkJdGhpcy0+bHB2dGJsLT5mbkFkZFJlZih0aGlzKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICBpZiAoIW1lbWNtcCgmSUlEX0lEaXJlY3REcmF3MixyZWZpaWQsc2l6ZW9mKElJRF9JRGlyZWN0RHJhdzIpKSkgeworCQkvKiBGSVhNRSBGSVhNRSBGSVhNRSAqLworCQl0aGlzLT5scHZ0YmwgPSAoTFBESVJFQ1REUkFXX1ZUQUJMRSkmZGQydnQ7CisJCXRoaXMtPmxwdnRibC0+Zm5BZGRSZWYodGhpcyk7CisgICAgICAgICAgICAgICAgKm9iaiA9IHRoaXM7CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIE9MRV9FX0VOVU1fTk9NT1JFOworfQorCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkgSURpcmVjdERyYXdfR2V0VmVydGljYWxCbGFua1N0YXR1cygKKwlMUERJUkVDVERSQVcgdGhpcyxCT09MMzIgKnN0YXR1cworKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCJJRGlyZWN0RHJhdyglcCktPkdldFZlcnRpY2FsQmxhbmtTYXR1cyglcClcbiIsdGhpcyxzdGF0dXMpOworCSpzdGF0dXMgPSBUUlVFOworCXJldHVybiAwOworfQorCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkgSURpcmVjdERyYXdfRW51bURpc3BsYXlNb2RlcygKKwlMUERJUkVDVERSQVcgdGhpcyxEV09SRCBkd0ZsYWdzLExQRERTVVJGQUNFREVTQyBscGRkc2ZkLExQVk9JRCBjb250ZXh0LExQRERFTlVNTU9ERVNDQUxMQkFDSyBtb2Rlc2NiCispIHsKKwlERFNVUkZBQ0VERVNDCWRkc2ZkOworCisJZnByaW50ZihzdGRlcnIsIklEaXJlY3REcmF3KCVwKS0+RW51bURpc3BsYXlNb2RlcygweCUwOGx4LCVwLCVwLCVwKSxzdHViIVxuIix0aGlzLGR3RmxhZ3MsbHBkZHNmZCxjb250ZXh0LG1vZGVzY2IpOworCWRkc2ZkLmR3U2l6ZSA9IHNpemVvZihkZHNmZCk7CisJZGRzZmQuZHdGbGFncyA9IEREU0RfSEVJR0hUfEREU0RfV0lEVEh8RERTRF9QSVRDSHxERFNEX0NBUFN8RERTRF9CQUNLQlVGRkVSQ09VTlR8RERTRF9SRUZSRVNIUkFURTsKKwlkZHNmZC5kd0hlaWdodCA9IDQ4MDsKKwlkZHNmZC5kd1dpZHRoID0gNjQwOworCWRkc2ZkLmxQaXRjaCA9IDY0MDsKKwlkZHNmZC5kZHNDYXBzLmR3Q2FwcyA9IEREU0NBUFNfUEFMRVRURXxERFNDQVBTX0ZST05UQlVGRkVSfEREU0NBUFNfQkFDS0JVRkZFUnxERFNDQVBTX0ZMSVB8RERTQ0FQU19QUklNQVJZU1VSRkFDRXxERFNDQVBTX1ZJREVPTUVNT1JZfEREU0NBUFNfWkJVRkZFUjsKKwlkZHNmZC5kd0JhY2tCdWZmZXJDb3VudCA9IDE7CisJZGRzZmQueC5kd1JlZnJlc2hSYXRlID0gNjA7CisJX2dldHBpeGVsZm9ybWF0KHRoaXMsJihkZHNmZC5kZHBmUGl4ZWxGb3JtYXQpKTsKKwlmcHJpbnRmKHN0ZGVyciwibW9kZXNjYiByZXR1cm5lZDogMHglbHhcbiIsKERXT1JEKW1vZGVzY2IoJmRkc2ZkLGNvbnRleHQpKTsKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgSURpcmVjdERyYXdfVlRhYmxlIGRkdnQgPSB7CisJSURpcmVjdERyYXdfUXVlcnlJbnRlcmZhY2UsCisJSURpcmVjdERyYXdfQWRkUmVmLAorCUlEaXJlY3REcmF3X1JlbGVhc2UsCisJNCwKKwlJRGlyZWN0RHJhd19DcmVhdGVDbGlwcGVyLAorCUlEaXJlY3REcmF3X0NyZWF0ZVBhbGV0dGUsCisJSURpcmVjdERyYXdfQ3JlYXRlU3VyZmFjZSwKKwlJRGlyZWN0RHJhd19EdXBsaWNhdGVTdXJmYWNlLAorCUlEaXJlY3REcmF3X0VudW1EaXNwbGF5TW9kZXMsCisJMTAsCisJMTEsCisJSURpcmVjdERyYXdfR2V0Q2FwcywKKwkxMywKKwkxNCwKKwkxNSwKKwkxNiwKKwkxNywKKwlJRGlyZWN0RHJhd19HZXRWZXJ0aWNhbEJsYW5rU3RhdHVzLAorCTE5LAorCUlEaXJlY3REcmF3X1Jlc3RvcmVEaXNwbGF5TW9kZSwKKwlJRGlyZWN0RHJhd19TZXRDb29wZXJhdGl2ZUxldmVsLAorCUlEaXJlY3REcmF3X1NldERpc3BsYXlNb2RlLAorCUlEaXJlY3REcmF3X1dhaXRGb3JWZXJ0aWNhbEJsYW5rLAorfTsKKworCitIUkVTVUxUIFdJTkFQSSBEaXJlY3REcmF3Q3JlYXRlKCBMUEdVSUQgbHBHVUlELCBMUERJUkVDVERSQVcgKmxwbHBERCwgTFBVTktOT1dOIHBVbmtPdXRlciApIHsKKworCWNoYXIJeGNsc2lkWzUwXTsKKwlpbnQJbWVtc2l6ZSxiYW5rc2l6ZSx3aWR0aCxldmJhc2UsZXZyZXQsbWFqb3IsbWlub3IsZmxhZ3MsaGVpZ2h0OworCWNoYXIJKmFkZHI7CisJCisKKwlpZiAobHBHVUlEKQorCQlTdHJpbmdGcm9tQ0xTSUQobHBHVUlELHhjbHNpZCk7CisJZWxzZQorCQlzdHJjcHkoeGNsc2lkLCI8bnVsbD4iKTsKKworCWZwcmludGYoc3RkZXJyLCJEaXJlY3REcmF3Q3JlYXRlKCVzLCVwLCVwKVxuIix4Y2xzaWQsbHBscERELHBVbmtPdXRlcik7CisJaWYgKGdldHVpZCgpKSB7CisJCU1lc3NhZ2VCb3gzMkEoMCwiVXNpbmcgdGhlIFhGODZER0EgZXh0ZW5zaW9ucyByZXF1aXJlcyB0aGUgcHJvZ3JhbSB0byBiZSBydW4gdXNpbmcgVUlEIDAuIiwiV0lORSBEaXJlY3REcmF3IixNQl9PS3xNQl9JQ09OU1RPUCk7CisJCXJldHVybiBFX1VORVhQRUNURUQ7CisJfQorCSpscGxwREQgPSAoTFBESVJFQ1REUkFXKUhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLDAsc2l6ZW9mKElEaXJlY3REcmF3KSk7CisJKCpscGxwREQpLT5scHZ0YmwgPSAmZGR2dDsKKwkoKmxwbHBERCktPnJlZiA9IDE7CisJaWYgKCFYRjg2REdBUXVlcnlFeHRlbnNpb24oZGlzcGxheSwmZXZiYXNlLCZldnJldCkpIHsKKwkJZnByaW50ZihzdGRlcnIsIk5vIFhGODZER0EgZGV0ZWN0ZWQuXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCVhGODZER0FRdWVyeVZlcnNpb24oZGlzcGxheSwmbWFqb3IsJm1pbm9yKTsKKwlmcHJpbnRmKHN0ZGVyciwiWEY4NkRHQSBpcyB2ZXJzaW9uICVkLiVkXG4iLG1ham9yLG1pbm9yKTsKKwlYRjg2REdBUXVlcnlEaXJlY3RWaWRlbyhkaXNwbGF5LERlZmF1bHRTY3JlZW4oZGlzcGxheSksJmZsYWdzKTsKKwlpZiAoIShmbGFncyAmIFhGODZER0FEaXJlY3RQcmVzZW50KSkKKwkJZnByaW50ZihzdGRlcnIsImRpcmVjdCB2aWRlbyBpcyBOT1QgRU5BQkxFRC5cbiIpOworCVhGODZER0FHZXRWaWRlbyhkaXNwbGF5LERlZmF1bHRTY3JlZW4oZGlzcGxheSksJmFkZHIsJndpZHRoLCZiYW5rc2l6ZSwmbWVtc2l6ZSk7CisJZnByaW50ZihzdGRlcnIsInZpZGVvIGZyYW1lYnVmZmVyOiBiZWdpbiAlcCwgd2lkdGggJWQsYmFua3NpemUgJWQsbWVtc2l6ZSAlZFxuIiwKKwkJYWRkcix3aWR0aCxiYW5rc2l6ZSxtZW1zaXplCisJKTsKKwkoKmxwbHBERCktPmQuZmJfd2lkdGggPSB3aWR0aDsKKwkoKmxwbHBERCktPmQuZmJfYWRkciA9IGFkZHI7CisJKCpscGxwREQpLT5kLmZiX21lbXNpemUgPSBtZW1zaXplOworCSgqbHBscEREKS0+ZC5mYl9iYW5rc2l6ZSA9IGJhbmtzaXplOworCisJWEY4NkRHQVNldFZpZXdQb3J0KGRpc3BsYXksRGVmYXVsdFNjcmVlbihkaXNwbGF5KSwwLDApOworCXdoaWxlICghWEY4NkRHQVZpZXdQb3J0Q2hhbmdlZChkaXNwbGF5LERlZmF1bHRTY3JlZW4oZGlzcGxheSksMSkpIHsKKwkJZnByaW50ZihzdGRlcnIsIi4iKTsKKwl9CisJWEY4NkRHQUdldFZpZXdQb3J0U2l6ZShkaXNwbGF5LERlZmF1bHRTY3JlZW4oZGlzcGxheSksJndpZHRoLCZoZWlnaHQpOworCSgqbHBscEREKS0+ZC52cF93aWR0aCA9IHdpZHRoOworCSgqbHBscEREKS0+ZC52cF9oZWlnaHQgPSBoZWlnaHQ7CisJKCpscGxwREQpLT5kLmZiX2hlaWdodCA9IGhlaWdodDsgLyogRklYTUU6IGNhbiB3ZSBmaW5kIG91dCB0aGUgdmlydHVhbAorCSAJCQkJKiBzaXplIHNvbWVob3cgZWxzZSA/CisJCQkJCSovCisJKCpscGxwREQpLT5kLmN1cnJlbnRfaGVpZ2h0ID0gMDsKKwlyZXR1cm4gMDsKK30KKyNlbHNlCisKK0hSRVNVTFQgV0lOQVBJIERpcmVjdERyYXdDcmVhdGUoIExQR1VJRCBscEdVSUQsIExQRElSRUNURFJBVyAqbHBscERELCBMUFVOS05PV04gcFVua091dGVyICkgeworCU1lc3NhZ2VCb3gzMkEoMCwiV0lORSBEaXJlY3REcmF3IG5lZWRzIHRoZSBYRjg2REdBIGV4dGVuc2lvbnMgY29tcGlsZWQgaW4uIChsaWJYeGY4NmRnYS5hKS4iLCJXSU5FIERpcmVjdERyYXciLE1CX09LfE1CX0lDT05TVE9QKTsKKwlyZXR1cm4gRV9PVVRPRk1FTU9SWTsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvcGFpbnRpbmcuYyBiL2dyYXBoaWNzL3BhaW50aW5nLmMKaW5kZXggOWIxNjllNC4uY2VjM2Q5YyAxMDA2NDQKLS0tIGEvZ3JhcGhpY3MvcGFpbnRpbmcuYworKysgYi9ncmFwaGljcy9wYWludGluZy5jCkBAIC0xOSw3ICsxOSw2IEBACiAjaW5jbHVkZSAiY2FsbGJhY2suaCIKICNpbmNsdWRlICJoZWFwLmgiCiAjaW5jbHVkZSAibWV0YWZpbGUuaCIKLSNpbmNsdWRlICJzeXNjb2xvci5oIgogI2luY2x1ZGUgInBhbGV0dGUuaCIKICNpbmNsdWRlICJjYWNoZS5oIgogI2luY2x1ZGUgImNvbG9yLmgiCkBAIC01MTMsNyArNTEyLDcgQEAKICAqLwogdm9pZCBXSU5BUEkgRHJhd0ZvY3VzUmVjdDMyKCBIREMzMiBoZGMsIGNvbnN0IFJFQ1QzMiogcmMgKQogewotICAgIEhQRU4zMiBoT2xkUGVuOworICAgIEhQRU4zMiBoT2xkUGVuLCBobmV3UGVuOwogICAgIElOVDMyIG9sZERyYXdNb2RlLCBvbGRCa01vZGU7CiAgICAgSU5UMzIgbGVmdCwgdG9wLCByaWdodCwgYm90dG9tOwogCkBAIC01MjUsNyArNTI0LDggQEAKICAgICByaWdodCAgPSBYTFBUT0RQKCBkYywgcmMtPnJpZ2h0ICk7CiAgICAgYm90dG9tID0gWUxQVE9EUCggZGMsIHJjLT5ib3R0b20gKTsKICAgICAKLSAgICBoT2xkUGVuID0gU2VsZWN0T2JqZWN0MzIoIGhkYywgc3lzQ29sb3JPYmplY3RzLmhwZW5XaW5kb3dUZXh0ICk7CisgICAgaG5ld1BlbiA9IENyZWF0ZVBlbjMyKFBTX0RPVCwgMSwgR2V0U3lzQ29sb3IzMihDT0xPUl9XSU5ET1dURVhUKSApOworICAgIGhPbGRQZW4gPSBTZWxlY3RPYmplY3QzMiggaGRjLCBobmV3UGVuICk7CiAgICAgb2xkRHJhd01vZGUgPSBTZXRST1AyMzIoaGRjLCBSMl9YT1JQRU4pOwogICAgIG9sZEJrTW9kZSA9IFNldEJrTW9kZTMyKGhkYywgVFJBTlNQQVJFTlQpOwogCkBAIC01NDAsNiArNTQwLDcgQEAKICAgICBTZXRCa01vZGUzMihoZGMsIG9sZEJrTW9kZSk7CiAgICAgU2V0Uk9QMjMyKGhkYywgb2xkRHJhd01vZGUpOwogICAgIFNlbGVjdE9iamVjdDMyKGhkYywgaE9sZFBlbik7CisgICAgRGVsZXRlT2JqZWN0MzIoaG5ld1Blbik7CiB9CiAKIApkaWZmIC0tZ2l0IGEvZ3JhcGhpY3Mvd2luMTZkcnYvaW5pdC5jIGIvZ3JhcGhpY3Mvd2luMTZkcnYvaW5pdC5jCmluZGV4IGUwMGU2MzguLmZhYWMyNmUgMTAwNjQ0Ci0tLSBhL2dyYXBoaWNzL3dpbjE2ZHJ2L2luaXQuYworKysgYi9ncmFwaGljcy93aW4xNmRydi9pbml0LmMKQEAgLTYwNCw3ICs2MDQsNyBAQAogCiAgICAgUFJPRklMRV9HZXRXaW5lSW5pU3RyaW5nKCAic3Bvb2xlciIsIHBzek91dHB1dCwgIiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc0NtZCwgc2l6ZW9mKHBzQ21kKSApOwotICAgIHByaW50ZigiR290IHByaW50ZXJTcG9vbENPbW1hbmQgXCIlc1wiXG4iLHBzQ21kKTsKKyAgICBwcmludGYoIkdvdCBwcmludGVyU3Bvb2xDb21tYW5kIFwiJXNcIlxuIixwc0NtZCk7CiAgICAgaWYgKCEqcHNDbWQpCiAgICAgICAgIHBzQ21kUCA9IHBzek91dHB1dDsKICAgICBlbHNlCkBAIC02MzUsNyArNjM1LDcgQEAKICAgICAgICAgfQogICAgICAgICBjbG9zZSAoZmRzWzBdKTsKICAgICAgICAgZmQgPSBmZHNbMV07Ci0gICAgICAgIHByaW50ZigiTmVlZCB0byBleGVjdXQgYSBjb21tYW5kIGFuZCBwaXBlIHRoZSBvdXRwdXQgdG8gaXRcbiIpOworICAgICAgICBwcmludGYoIk5lZWQgdG8gZXhlY3V0ZSBhIGNvbW1hbmQgYW5kIHBpcGUgdGhlIG91dHB1dCB0byBpdFxuIik7CiAgICAgfQogICAgIGVsc2UKICAgICB7CmRpZmYgLS1naXQgYS9ncmFwaGljcy94MTFkcnYvYnJ1c2guYyBiL2dyYXBoaWNzL3gxMWRydi9icnVzaC5jCmluZGV4IGExNjJhZDcuLjViMzhmYTYgMTAwNjQ0Ci0tLSBhL2dyYXBoaWNzL3gxMWRydi9icnVzaC5jCisrKyBiL2dyYXBoaWNzL3gxMWRydi9icnVzaC5jCkBAIC0xNjQsMTAgKzE2NCwyMiBAQAogewogICAgIEJJVE1BUE9CSiAqIGJtcCA9IChCSVRNQVBPQkogKikgR0RJX0dldE9ialB0ciggaGJpdG1hcCwgQklUTUFQX01BR0lDICk7CiAgICAgaWYgKCFibXApIHJldHVybiBGQUxTRTsKLSAgICBkYy0+dS54LmJydXNoLnBpeG1hcCA9IFhDcmVhdGVQaXhtYXAoIGRpc3BsYXksIHJvb3RXaW5kb3csCi0JCQkJCSAgOCwgOCwgYm1wLT5iaXRtYXAuYm1CaXRzUGl4ZWwgKTsKLSAgICBYQ29weUFyZWEoIGRpc3BsYXksIGJtcC0+cGl4bWFwLCBkYy0+dS54LmJydXNoLnBpeG1hcCwKLQkgICAgICAgQklUTUFQX0dDKGJtcCksIDAsIDAsIDgsIDgsIDAsIDAgKTsKKworICAgIGlmICgoZGMtPncuYml0c1BlclBpeGVsID09IDEpICYmIChibXAtPmJpdG1hcC5ibUJpdHNQaXhlbCAhPSAxKSkKKyAgICB7CisgICAgICAgIC8qIFNwZWNpYWwgY2FzZTogYSBjb2xvciBwYXR0ZXJuIG9uIGEgbW9ub2Nocm9tZSBEQyAqLworICAgICAgICBkYy0+dS54LmJydXNoLnBpeG1hcCA9IFhDcmVhdGVQaXhtYXAoIGRpc3BsYXksIHJvb3RXaW5kb3csIDgsIDgsIDEgKTsKKyAgICAgICAgLyogRklYTUU6IHNob3VsZCBwcm9iYWJseSBjb252ZXJ0IHRvIG1vbm9jaHJvbWUgaW5zdGVhZCAqLworICAgICAgICBYQ29weVBsYW5lKCBkaXNwbGF5LCBibXAtPnBpeG1hcCwgZGMtPnUueC5icnVzaC5waXhtYXAsCisgICAgICAgICAgICAgICAgICAgIEJJVE1BUF9tb25vR0MsIDAsIDAsIDgsIDgsIDAsIDAsIDEgKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgZGMtPnUueC5icnVzaC5waXhtYXAgPSBYQ3JlYXRlUGl4bWFwKCBkaXNwbGF5LCByb290V2luZG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDgsIDgsIGJtcC0+Yml0bWFwLmJtQml0c1BpeGVsICk7CisgICAgICAgIFhDb3B5QXJlYSggZGlzcGxheSwgYm1wLT5waXhtYXAsIGRjLT51LnguYnJ1c2gucGl4bWFwLAorICAgICAgICAgICAgICAgICAgIEJJVE1BUF9HQyhibXApLCAwLCAwLCA4LCA4LCAwLCAwICk7CisgICAgfQogICAgIAogICAgIGlmIChibXAtPmJpdG1hcC5ibUJpdHNQaXhlbCA+IDEpCiAgICAgewpkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MveDExZHJ2L2dyYXBoaWNzLmMgYi9ncmFwaGljcy94MTFkcnYvZ3JhcGhpY3MuYwppbmRleCA5MzQ4ZDkxLi5kNmU0MmU0IDEwMDY0NAotLS0gYS9ncmFwaGljcy94MTFkcnYvZ3JhcGhpY3MuYworKysgYi9ncmFwaGljcy94MTFkcnYvZ3JhcGhpY3MuYwpAQCAtMjUsNyArMjUsNiBAQAogI2luY2x1ZGUgImJpdG1hcC5oIgogI2luY2x1ZGUgImNhbGxiYWNrLmgiCiAjaW5jbHVkZSAibWV0YWZpbGUuaCIKLSNpbmNsdWRlICJzeXNjb2xvci5oIgogI2luY2x1ZGUgInN0ZGRlYnVnLmgiCiAjaW5jbHVkZSAicGFsZXR0ZS5oIgogI2luY2x1ZGUgImNvbG9yLmgiCmRpZmYgLS1naXQgYS9pZjE2MzIvYnVpbHRpbi5jIGIvaWYxNjMyL2J1aWx0aW4uYwppbmRleCAyNzM5MDhhLi43MDc2YjFlIDEwMDY0NAotLS0gYS9pZjE2MzIvYnVpbHRpbi5jCisrKyBiL2lmMTYzMi9idWlsdGluLmMKQEAgLTM3MCw3ICszNzAsOSBAQAogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIGlmICghZGxsLT5kZXNjcikgcmV0dXJuIEZBTFNFOworICAgICAgICBpZiAoIWRsbC0+ZGVzY3IpCisgICAgICAgICAgICBpZiAoIUJVSUxUSU4zMl9FbmFibGVETEwoIHN0ciwgKGludCkocCAtIHN0ciksIChzdHJbLTFdID09ICcrJykgKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgICAgIHN0ciA9IHA7CiAgICAgICAgIHdoaWxlICgqc3RyICYmIChpc3NwYWNlKCpzdHIpIHx8ICgqc3RyID09ICcsJykpKSBzdHIrKzsKICAgICB9CkBAIC0zODksNyArMzkxLDcgQEAKICAgICBCVUlMVElOMTZfRExMICpkbGw7CiAKICAgICBmcHJpbnRmKHN0ZGVyciwiRXhhbXBsZTogLWRsbCAtb2xlMiAgICBEbyBub3QgdXNlIGVtdWxhdGVkIE9MRTIuRExMXG4iKTsKLSAgICBmcHJpbnRmKHN0ZGVyciwiQXZhaWxhYmxlIERMTHM6XG4iKTsKKyAgICBmcHJpbnRmKHN0ZGVyciwiQXZhaWxhYmxlIFdpbjE2IERMTHM6XG4iKTsKICAgICBmb3IgKGkgPSAwLCBkbGwgPSBCdWlsdGluRExMczsgZGxsLT5kZXNjcjsgZGxsKyspCiAgICAgewogICAgICAgICBpZiAoIShkbGwtPmZsYWdzICYgRExMX0ZMQUdfQUxXQVlTX1VTRUQpKQpAQCAtMzk3LDQgKzM5OSw1IEBACiAgICAgICAgICAgICAgICAgICAgICAoKCsraSkgJSA4KSA/ICcgJyA6ICdcbicgKTsKICAgICB9CiAgICAgZnByaW50ZihzdGRlcnIsIlxuIik7CisgICAgQlVJTFRJTjMyX1ByaW50RExMcygpOwogfQpkaWZmIC0tZ2l0IGEvaWYxNjMyL2tlcm5lbC5zcGVjIGIvaWYxNjMyL2tlcm5lbC5zcGVjCmluZGV4IGRiMWRhZTIuLjY5ZWU1NWYgMTAwNjQ0Ci0tLSBhL2lmMTYzMi9rZXJuZWwuc3BlYworKysgYi9pZjE2MzIva2VybmVsLnNwZWMKQEAgLTMyNyw3ICszMjcsNyBAQAogNTE1IHBhc2NhbCAgIEdldFByb2NBZGRyZXNzMzJXKGxvbmcgc3RyKSBHZXRQcm9jQWRkcmVzczMyCiA1MTYgcGFzY2FsIEdldFZETVBvaW50ZXIzMlcoc2VncHRyIGxvbmcpIEdldFZETVBvaW50ZXIzMlcKIDUxNyBwYXNjYWwgQ2FsbFByb2MzMlcoKSBXSU4xNl9DYWxsUHJvYzMyVwotNTE4IHN0dWIgQ2FsbFByb2NFeDMyVworNTE4IHBhc2NhbCBDYWxsUHJvY0V4MzJXKCkgV0lOMTZfQ2FsbFByb2NFeDMyVyAKIDUxOSBzdHViIEtFUk5FTF81MTkKIDUyMiBzdHViIEtFUk5FTF81MjIKIDUyMyBzdHViIEtFUk5FTF81MjMKZGlmZiAtLWdpdCBhL2lmMTYzMi9yZWxheS5jIGIvaWYxNjMyL3JlbGF5LmMKaW5kZXggNjU5NmJlNS4uOGUyNDdmZiAxMDA2NDQKLS0tIGEvaWYxNjMyL3JlbGF5LmMKKysrIGIvaWYxNjMyL3JlbGF5LmMKQEAgLTMyMSwxMCArMzIxLDEzIEBACiAgICAgfQogfQogCisKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgkgICAgIENhbGxQcm9jMzJXICAgIChLRVJORUwuNTE3KQorICoJICAgICBSRUxBWV9DYWxsUHJvYzMyVworICoKKyAqIEhlbHBlciBmb3IgQ2FsbFByb2NbRXhdMzJXCiAgKi8KLURXT1JEIFdJTkFQSSBXSU4xNl9DYWxsUHJvYzMyVygpCitzdGF0aWMgRFdPUkQgUkVMQVlfQ2FsbFByb2MzMlcoaW50IEV4KQogewogCURXT1JEIG5yb2ZhcmdzLCBhcmdjb252bWFzazsKIAlGQVJQUk9DMzIgcHJvYzMyOwpAQCAtMzM2LDcgKzMzOSw3IEBACiAgICAgICAgIG5yb2ZhcmdzICAgID0gVkFfQVJHMTYoIHZhbGlzdCwgRFdPUkQgKTsKICAgICAgICAgYXJnY29udm1hc2sgPSBWQV9BUkcxNiggdmFsaXN0LCBEV09SRCApOwogICAgICAgICBwcm9jMzIgICAgICA9IFZBX0FSRzE2KCB2YWxpc3QsIEZBUlBST0MzMiApOwotCWZwcmludGYoc3RkZXJyLCJDYWxsUHJvYzMyVyglbGQsJWxkLCVwLGFyZ3NbIixucm9mYXJncyxhcmdjb252bWFzayxwcm9jMzIpOworCWZwcmludGYoc3RkZXJyLCJDYWxsUHJvYzMyVyglbGQsJWxkLCVwLCBFeCVkIGFyZ3NbIixucm9mYXJncyxhcmdjb252bWFzayxwcm9jMzIsRXgpOwogCWFyZ3MgPSAoRFdPUkQqKUhFQVBfeGFsbG9jKCBHZXRQcm9jZXNzSGVhcCgpLCAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKERXT1JEKSpucm9mYXJncyApOwogCWZvciAoaT0wO2k8bnJvZmFyZ3M7aSsrKSB7CkBAIC0zNzksOSArMzgyLDI5IEBACiAJCWJyZWFrOwogCX0KIAkvKiBQT1AgbnJvZmFyZ3MgRFdPUkQgYXJndW1lbnRzIGFuZCAzIERXT1JEIHBhcmFtZXRlcnMgKi8KLSAgICAgICAgU1RBQ0sxNl9QT1AoICgzICsgbnJvZmFyZ3MpICogc2l6ZW9mKERXT1JEKSApOworICAgICAgICBpZiAoIUV4KSBTVEFDSzE2X1BPUCggKDMgKyBucm9mYXJncykgKiBzaXplb2YoRFdPUkQpICk7CiAKIAlmcHJpbnRmKHN0ZGVyciwicmV0dXJucyAlMDhseFxuIixyZXQpOwogCUhlYXBGcmVlKCBHZXRQcm9jZXNzSGVhcCgpLCAwLCBhcmdzICk7CiAJcmV0dXJuIHJldDsKIH0KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJICAgICBDYWxsUHJvYzMyVyAgICAoS0VSTkVMLjUxNykKKyAqLworRFdPUkQgV0lOQVBJIFdJTjE2X0NhbGxQcm9jMzJXKCkKK3sKKyAgICAgICAgcmV0dXJuIFJFTEFZX0NhbGxQcm9jMzJXKDApOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqICAgICAgICAgICBDYWxsUHJvY0V4MzJXKCkgICAoS0VSTkVMLjUxOCkgICAgICAgIAorKgorKiAgICAgIEMgLSBzdHlsZSBsaW5rYWdlIHRvIENhbGxQcm9jMzJXIC0gY2FsbGVyIHBvcHMgc3RhY2suCisqLyAKK0RXT1JEIFdJTkFQSSBXSU4xNl9DYWxsUHJvY0V4MzJXKCkKK3sKKwlyZXR1cm4gUkVMQVlfQ2FsbFByb2MzMlcoVFJVRSk7Cit9CmRpZmYgLS1naXQgYS9pZjE2MzIvc2lnbmFsLmMgYi9pZjE2MzIvc2lnbmFsLmMKaW5kZXggMDAzZTA2Mi4uZDFkZjdjNSAxMDA2NDQKLS0tIGEvaWYxNjMyL3NpZ25hbC5jCisrKyBiL2lmMTYzMi9zaWduYWwuYwpAQCAtMTgwLDQ0ICsxODAsMjAgQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoJCVNJR05BTF90aWNrCi0gKgotICogVGljayBoYW5kbGVyLgotICovCi1zdGF0aWMgSEFORExFUl9ERUYoU0lHTkFMX3RpY2spCi17Ci0gICAgQ09OVEVYVCBudF9jb250ZXh0OwotICAgIFNJR05BTF9TZXRTaWdDb250ZXh0KCBIQU5ETEVSX0NPTlRFWFQsICZudF9jb250ZXh0ICk7Ci0gICAgaWYgKFRIUkVBRF9Td2l0Y2hUaHJlYWQoICZudF9jb250ZXh0ICkpCi0gICAgICAgIFNJR05BTF9HZXRTaWdDb250ZXh0KCBIQU5ETEVSX0NPTlRFWFQsICZudF9jb250ZXh0ICk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgkJU0lHTkFMX0luaXRFbXVsYXRvcgogICoKICAqIEluaXRpYWxpemUgZW11bGF0b3Igc2lnbmFscy4KICAqLwogQk9PTDMyIFNJR05BTF9Jbml0RW11bGF0b3Iodm9pZCkKIHsKLSAgICBzdHJ1Y3QgaXRpbWVydmFsIHZ0X3RpbWVyOwotCiAgICAgU0lHTkFMX1NldEhhbmRsZXIoIFNJR0lOVCwgICh2b2lkICgqKSgpKVNJR05BTF9icmVhaywgMSk7CiAgICAgU0lHTkFMX1NldEhhbmRsZXIoIFNJR1NFR1YsICh2b2lkICgqKSgpKVNJR05BTF9mYXVsdCwgMSk7CiAgICAgU0lHTkFMX1NldEhhbmRsZXIoIFNJR0lMTCwgICh2b2lkICgqKSgpKVNJR05BTF9mYXVsdCwgMSk7CiAgICAgU0lHTkFMX1NldEhhbmRsZXIoIFNJR0ZQRSwgICh2b2lkICgqKSgpKVNJR05BTF9mYXVsdCwgMSk7Ci0gICAgU0lHTkFMX1NldEhhbmRsZXIoIFNJR1ZUQUxSTSwgKHZvaWQgKCopKCkpU0lHTkFMX3RpY2ssICAwKTsKICAgICBTSUdOQUxfU2V0SGFuZGxlciggU0lHVFJBUCwgKHZvaWQgKCopKCkpU0lHTkFMX3RyYXAsICAxKTsgLyogZGVidWdnZXIgKi8KICAgICBTSUdOQUxfU2V0SGFuZGxlciggU0lHSFVQLCAgKHZvaWQgKCopKCkpU0lHTkFMX3RyYXAsICAxKTsgLyogZm9yY2VkIGJyZWFrKi8KICNpZmRlZiBTSUdCVVMKICAgICBTSUdOQUxfU2V0SGFuZGxlciggU0lHQlVTLCAgKHZvaWQgKCopKCkpU0lHTkFMX2ZhdWx0LCAxKTsKICNlbmRpZgotCi0gICAgLyogU3RhcnQgdGhlIHRpY2sgdGltZXIgKi8KLSNpZiAwCi0gICAgdnRfdGltZXIuaXRfaW50ZXJ2YWwudHZfc2VjID0gMDsKLSAgICB2dF90aW1lci5pdF9pbnRlcnZhbC50dl91c2VjID0gMTAwMDA7Ci0gICAgdnRfdGltZXIuaXRfdmFsdWUgPSB2dF90aW1lci5pdF9pbnRlcnZhbDsKLSAgICBzZXRpdGltZXIoIElUSU1FUl9WSVJUVUFMLCAmdnRfdGltZXIsIE5VTEwgKTsKLSNlbmRpZgogICAgIHJldHVybiBUUlVFOwogfQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9idWlsdGluMzIuaCBiL2luY2x1ZGUvYnVpbHRpbjMyLmgKaW5kZXggNTY1MzJhMy4uNGQzZGQzYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9idWlsdGluMzIuaAorKysgYi9pbmNsdWRlL2J1aWx0aW4zMi5oCkBAIC0yNyw1ICsyNyw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgKnR5cGVtYXNrICk7CiBleHRlcm4gdm9pZCBCVUlMVElOMzJfVW5pbXBsZW1lbnRlZCggY29uc3QgQlVJTFRJTjMyX0RFU0NSSVBUT1IgKmRlc2NyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBvcmRpbmFsICk7CitleHRlcm4gdm9pZCBCVUlMVElOMzJfUHJpbnRETExzKHZvaWQpOworZXh0ZXJuIGludCBCVUlMVElOMzJfRW5hYmxlRExMKCBjb25zdCBjaGFyICpuYW1lLCBpbnQgbGVuLCBpbnQgZW5hYmxlICk7CiAKICNlbmRpZiAvKiBfX1dJTkVfQlVJTFRJTjMyX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlnLmguaW4gYi9pbmNsdWRlL2NvbmZpZy5oLmluCmluZGV4IDJkMzAxYzcuLjQwZDQ4OWIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlnLmguaW4KKysrIGIvaW5jbHVkZS9jb25maWcuaC5pbgpAQCAtMTgsNiArMTgsOSBAQAogLyogRGVmaW5lIGlmIHN5bWJvbHMgZGVjbGFyZWQgaW4gYXNzZW1ibHkgY29kZSBuZWVkIGFuIHVuZGVyc2NvcmUgcHJlZml4ICovCiAjdW5kZWYgTkVFRF9VTkRFUlNDT1JFX1BSRUZJWAogCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIGNsb25lIGZ1bmN0aW9uLiAgKi8KKyN1bmRlZiBIQVZFX0NMT05FCisKIC8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgbWVtbW92ZSBmdW5jdGlvbi4gICovCiAjdW5kZWYgSEFWRV9NRU1NT1ZFCiAKQEAgLTM1LDMgKzM4LDE1IEBACiAKIC8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgd2FpdHBpZCBmdW5jdGlvbi4gICovCiAjdW5kZWYgSEFWRV9XQUlUUElECisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHdjdHlwZS5oPiBoZWFkZXIgZmlsZS4gICovCisjdW5kZWYgSEFWRV9XQ1RZUEVfSAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIFh4Zjg2ZGdhIGxpYnJhcnkgKC1sWHhmODZkZ2EpLiAgKi8KKyN1bmRlZiBIQVZFX0xJQlhYRjg2REdBCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgaTM4NiBsaWJyYXJ5ICgtbGkzODYpLiAgKi8KKyN1bmRlZiBIQVZFX0xJQkkzODYKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSB3IGxpYnJhcnkgKC1sdykuICAqLworI3VuZGVmIEhBVkVfTElCVwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9kZHJhdy5oIGIvaW5jbHVkZS9kZHJhdy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxOTdiODUKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2RkcmF3LmgKQEAgLTAsMCArMSw4OTggQEAKKyNpZm5kZWYgX19XSU5FX0REUkFXX0gKKyNkZWZpbmUgX19XSU5FX0REUkFXX0gKKworI2luY2x1ZGUgPFgxMS9YbGliLmg+CisKKworREVGSU5FX0dVSUQoIENMU0lEX0RpcmVjdERyYXcsCQkweEQ3QjcwRUUwLDB4NDM0MCwweDExQ0YsMHhCMCwweDYzLDB4MDAsMHgyMCwweEFGLDB4QzIsMHhDRCwweDM1ICk7CitERUZJTkVfR1VJRCggQ0xTSURfRGlyZWN0RHJhd0NsaXBwZXIsCTB4NTkzODE3QTAsMHg3REIzLDB4MTFDRiwweEEyLDB4REUsMHgwMCwweEFBLDB4MDAsMHhiOSwweDMzLDB4NTYgKTsKK0RFRklORV9HVUlEKCBJSURfSURpcmVjdERyYXcsCQkweDZDMTREQjgwLDB4QTczMywweDExQ0UsMHhBNSwweDIxLDB4MDAsMHgyMCwweEFGLDB4MEIsMHhFNSwweDYwICk7CitERUZJTkVfR1VJRCggSUlEX0lEaXJlY3REcmF3MiwJCTB4QjNBNkYzRTAsMHgyQjQzLDB4MTFDRiwweEEyLDB4REUsMHgwMCwweEFBLDB4MDAsMHhCOSwweDMzLDB4NTYgKTsKK0RFRklORV9HVUlEKCBJSURfSURpcmVjdERyYXdTdXJmYWNlLAkweDZDMTREQjgxLDB4QTczMywweDExQ0UsMHhBNSwweDIxLDB4MDAsMHgyMCwweEFGLDB4MEIsMHhFNSwweDYwICk7CitERUZJTkVfR1VJRCggSUlEX0lEaXJlY3REcmF3U3VyZmFjZTIsCTB4NTc4MDU4ODUsMHg2ZWVjLDB4MTFjZiwweDk0LDB4NDEsMHhhOCwweDIzLDB4MDMsMHhjMSwweDBlLDB4MjcgKTsKK0RFRklORV9HVUlEKCBJSURfSURpcmVjdERyYXdQYWxldHRlLAkweDZDMTREQjg0LDB4QTczMywweDExQ0UsMHhBNSwweDIxLDB4MDAsMHgyMCwweEFGLDB4MEIsMHhFNSwweDYwICk7CitERUZJTkVfR1VJRCggSUlEX0lEaXJlY3REcmF3Q2xpcHBlciwJMHg2QzE0REI4NSwweEE3MzMsMHgxMUNFLDB4QTUsMHgyMSwweDAwLDB4MjAsMHhBRiwweDBCLDB4RTUsMHg2MCApOworCit0eXBlZGVmIHN0cnVjdCBJRGlyZWN0RHJhdyBJRGlyZWN0RHJhdywqTFBESVJFQ1REUkFXOwordHlwZWRlZiBzdHJ1Y3QgSURpcmVjdERyYXcyIElEaXJlY3REcmF3MiwqTFBESVJFQ1REUkFXMjsKK3R5cGVkZWYgc3RydWN0IElEaXJlY3REcmF3Q2xpcHBlciBJRGlyZWN0RHJhd0NsaXBwZXIsKkxQRElSRUNURFJBV0NMSVBQRVI7Cit0eXBlZGVmIHN0cnVjdCBJRGlyZWN0RHJhd1BhbGV0dGUgSURpcmVjdERyYXdQYWxldHRlLCpMUERJUkVDVERSQVdQQUxFVFRFOwordHlwZWRlZiBzdHJ1Y3QgSURpcmVjdERyYXdTdXJmYWNlIElEaXJlY3REcmF3U3VyZmFjZSwqTFBESVJFQ1REUkFXU1VSRkFDRTsKK3R5cGVkZWYgc3RydWN0IElEaXJlY3REcmF3U3VyZmFjZTIgSURpcmVjdERyYXdTdXJmYWNlMiwqTFBESVJFQ1REUkFXU1VSRkFDRTI7CisKKyNkZWZpbmUgX0ZBQ0RECQkweDg3NgorI2RlZmluZSBNQUtFX0RESFJFU1VMVCggY29kZSApICBNQUtFX0hSRVNVTFQoIDEsIF9GQUNERCwgY29kZSApCisKKyNkZWZpbmUgRERFUlJfQUxSRUFEWUlOSVRJQUxJWkVECQlNQUtFX0RESFJFU1VMVCggNSApCisjZGVmaW5lIERERVJSX0NBTk5PVEFUVEFDSFNVUkZBQ0UJCU1BS0VfRERIUkVTVUxUKCAxMCApCisjZGVmaW5lIERERVJSX0NBTk5PVERFVEFDSFNVUkZBQ0UJCU1BS0VfRERIUkVTVUxUKCAyMCApCisjZGVmaW5lIERERVJSX0NVUlJFTlRMWU5PVEFWQUlMCQkJTUFLRV9EREhSRVNVTFQoIDQwICkKKyNkZWZpbmUgRERFUlJfRVhDRVBUSU9OCQkJCU1BS0VfRERIUkVTVUxUKCA1NSApCisjZGVmaW5lIERERVJSX0dFTkVSSUMJCQkJRV9GQUlMCisjZGVmaW5lIERERVJSX0hFSUdIVEFMSUdOCQkJTUFLRV9EREhSRVNVTFQoIDkwICkKKyNkZWZpbmUgRERFUlJfSU5DT01QQVRJQkxFUFJJTUFSWQkJTUFLRV9EREhSRVNVTFQoIDk1ICkKKyNkZWZpbmUgRERFUlJfSU5WQUxJRENBUFMJCQlNQUtFX0RESFJFU1VMVCggMTAwICkKKyNkZWZpbmUgRERFUlJfSU5WQUxJRENMSVBMSVNUCQkJTUFLRV9EREhSRVNVTFQoIDExMCApCisjZGVmaW5lIERERVJSX0lOVkFMSURNT0RFCQkJTUFLRV9EREhSRVNVTFQoIDEyMCApCisjZGVmaW5lIERERVJSX0lOVkFMSURPQkpFQ1QJCQlNQUtFX0RESFJFU1VMVCggMTMwICkKKyNkZWZpbmUgRERFUlJfSU5WQUxJRFBBUkFNUwkJCUVfSU5WQUxJREFSRworI2RlZmluZSBEREVSUl9JTlZBTElEUElYRUxGT1JNQVQJCU1BS0VfRERIUkVTVUxUKCAxNDUgKQorI2RlZmluZSBEREVSUl9JTlZBTElEUkVDVAkJCU1BS0VfRERIUkVTVUxUKCAxNTAgKQorI2RlZmluZSBEREVSUl9MT0NLRURTVVJGQUNFUwkJCU1BS0VfRERIUkVTVUxUKCAxNjAgKQorI2RlZmluZSBEREVSUl9OTzNECQkJCU1BS0VfRERIUkVTVUxUKCAxNzAgKQorI2RlZmluZSBEREVSUl9OT0FMUEhBSFcJCQkJTUFLRV9EREhSRVNVTFQoIDE4MCApCisjZGVmaW5lIERERVJSX05PQ0xJUExJU1QJCQlNQUtFX0RESFJFU1VMVCggMjA1ICkKKyNkZWZpbmUgRERFUlJfTk9DT0xPUkNPTlZIVwkJCU1BS0VfRERIUkVTVUxUKCAyMTAgKQorI2RlZmluZSBEREVSUl9OT0NPT1BFUkFUSVZFTEVWRUxTRVQJCU1BS0VfRERIUkVTVUxUKCAyMTIgKQorI2RlZmluZSBEREVSUl9OT0NPTE9SS0VZCQkJTUFLRV9EREhSRVNVTFQoIDIxNSApCisjZGVmaW5lIERERVJSX05PQ09MT1JLRVlIVwkJCU1BS0VfRERIUkVTVUxUKCAyMjAgKQorI2RlZmluZSBEREVSUl9OT0RJUkVDVERSQVdTVVBQT1JUCQlNQUtFX0RESFJFU1VMVCggMjIyICkKKyNkZWZpbmUgRERFUlJfTk9FWENMVVNJVkVNT0RFCQkJTUFLRV9EREhSRVNVTFQoIDIyNSApCisjZGVmaW5lIERERVJSX05PRkxJUEhXCQkJCU1BS0VfRERIUkVTVUxUKCAyMzAgKQorI2RlZmluZSBEREVSUl9OT0dESQkJCQlNQUtFX0RESFJFU1VMVCggMjQwICkKKyNkZWZpbmUgRERFUlJfTk9NSVJST1JIVwkJCU1BS0VfRERIUkVTVUxUKCAyNTAgKQorI2RlZmluZSBEREVSUl9OT1RGT1VORAkJCQlNQUtFX0RESFJFU1VMVCggMjU1ICkKKyNkZWZpbmUgRERFUlJfTk9PVkVSTEFZSFcJCQlNQUtFX0RESFJFU1VMVCggMjYwICkKKyNkZWZpbmUgRERFUlJfTk9SQVNURVJPUEhXCQkJTUFLRV9EREhSRVNVTFQoIDI4MCApCisjZGVmaW5lIERERVJSX05PUk9UQVRJT05IVwkJCU1BS0VfRERIUkVTVUxUKCAyOTAgKQorI2RlZmluZSBEREVSUl9OT1NUUkVUQ0hIVwkJCU1BS0VfRERIUkVTVUxUKCAzMTAgKQorI2RlZmluZSBEREVSUl9OT1Q0QklUQ09MT1IJCQlNQUtFX0RESFJFU1VMVCggMzE2ICkKKyNkZWZpbmUgRERFUlJfTk9UNEJJVENPTE9SSU5ERVgJCQlNQUtFX0RESFJFU1VMVCggMzE3ICkKKyNkZWZpbmUgRERFUlJfTk9UOEJJVENPTE9SCQkJTUFLRV9EREhSRVNVTFQoIDMyMCApCisjZGVmaW5lIERERVJSX05PVEVYVFVSRUhXCQkJTUFLRV9EREhSRVNVTFQoIDMzMCApCisjZGVmaW5lIERERVJSX05PVlNZTkNIVwkJCQlNQUtFX0RESFJFU1VMVCggMzM1ICkKKyNkZWZpbmUgRERFUlJfTk9aQlVGRkVSSFcJCQlNQUtFX0RESFJFU1VMVCggMzQwICkKKyNkZWZpbmUgRERFUlJfTk9aT1ZFUkxBWUhXCQkJTUFLRV9EREhSRVNVTFQoIDM1MCApCisjZGVmaW5lIERERVJSX09VVE9GQ0FQUwkJCQlNQUtFX0RESFJFU1VMVCggMzYwICkKKyNkZWZpbmUgRERFUlJfT1VUT0ZNRU1PUlkJCQlFX09VVE9GTUVNT1JZCisjZGVmaW5lIERERVJSX09VVE9GVklERU9NRU1PUlkJCQlNQUtFX0RESFJFU1VMVCggMzgwICkKKyNkZWZpbmUgRERFUlJfT1ZFUkxBWUNBTlRDTElQCQkJTUFLRV9EREhSRVNVTFQoIDM4MiApCisjZGVmaW5lIERERVJSX09WRVJMQVlDT0xPUktFWU9OTFlPTkVBQ1RJVkUJTUFLRV9EREhSRVNVTFQoIDM4NCApCisjZGVmaW5lIERERVJSX1BBTEVUVEVCVVNZCQkJTUFLRV9EREhSRVNVTFQoIDM4NyApCisjZGVmaW5lIERERVJSX0NPTE9SS0VZTk9UU0VUCQkJTUFLRV9EREhSRVNVTFQoIDQwMCApCisjZGVmaW5lIERERVJSX1NVUkZBQ0VBTFJFQURZQVRUQUNIRUQJCU1BS0VfRERIUkVTVUxUKCA0MTAgKQorI2RlZmluZSBEREVSUl9TVVJGQUNFQUxSRUFEWURFUEVOREVOVAkJTUFLRV9EREhSRVNVTFQoIDQyMCApCisjZGVmaW5lIERERVJSX1NVUkZBQ0VCVVNZCQkJTUFLRV9EREhSRVNVTFQoIDQzMCApCisjZGVmaW5lIERERVJSX0NBTlRMT0NLU1VSRkFDRQkJCU1BS0VfRERIUkVTVUxUKCA0MzUgKQorI2RlZmluZSBEREVSUl9TVVJGQUNFSVNPQlNDVVJFRAkJCU1BS0VfRERIUkVTVUxUKCA0NDAgKQorI2RlZmluZSBEREVSUl9TVVJGQUNFTE9TVAkJCU1BS0VfRERIUkVTVUxUKCA0NTAgKQorI2RlZmluZSBEREVSUl9TVVJGQUNFTk9UQVRUQUNIRUQJCU1BS0VfRERIUkVTVUxUKCA0NjAgKQorI2RlZmluZSBEREVSUl9UT09CSUdIRUlHSFQJCQlNQUtFX0RESFJFU1VMVCggNDcwICkKKyNkZWZpbmUgRERFUlJfVE9PQklHU0laRQkJCU1BS0VfRERIUkVTVUxUKCA0ODAgKQorI2RlZmluZSBEREVSUl9UT09CSUdXSURUSAkJCU1BS0VfRERIUkVTVUxUKCA0OTAgKQorI2RlZmluZSBEREVSUl9VTlNVUFBPUlRFRAkJCUVfTk9USU1QTAorI2RlZmluZSBEREVSUl9VTlNVUFBPUlRFREZPUk1BVAkJCU1BS0VfRERIUkVTVUxUKCA1MTAgKQorI2RlZmluZSBEREVSUl9VTlNVUFBPUlRFRE1BU0sJCQlNQUtFX0RESFJFU1VMVCggNTIwICkKKyNkZWZpbmUgRERFUlJfVkVSVElDQUxCTEFOS0lOUFJPR1JFU1MJCU1BS0VfRERIUkVTVUxUKCA1MzcgKQorI2RlZmluZSBEREVSUl9XQVNTVElMTERSQVdJTkcJCQlNQUtFX0RESFJFU1VMVCggNTQwICkKKyNkZWZpbmUgRERFUlJfWEFMSUdOCQkJCU1BS0VfRERIUkVTVUxUKCA1NjAgKQorI2RlZmluZSBEREVSUl9JTlZBTElERElSRUNURFJBV0dVSUQJCU1BS0VfRERIUkVTVUxUKCA1NjEgKQorI2RlZmluZSBEREVSUl9ESVJFQ1REUkFXQUxSRUFEWUNSRUFURUQJCU1BS0VfRERIUkVTVUxUKCA1NjIgKQorI2RlZmluZSBEREVSUl9OT0RJUkVDVERSQVdIVwkJCU1BS0VfRERIUkVTVUxUKCA1NjMgKQorI2RlZmluZSBEREVSUl9QUklNQVJZU1VSRkFDRUFMUkVBRFlFWElTVFMJTUFLRV9EREhSRVNVTFQoIDU2NCApCisjZGVmaW5lIERERVJSX05PRU1VTEFUSU9OCQkJTUFLRV9EREhSRVNVTFQoIDU2NSApCisjZGVmaW5lIERERVJSX1JFR0lPTlRPT1NNQUxMCQkJTUFLRV9EREhSRVNVTFQoIDU2NiApCisjZGVmaW5lIERERVJSX0NMSVBQRVJJU1VTSU5HSFdORAkJTUFLRV9EREhSRVNVTFQoIDU2NyApCisjZGVmaW5lIERERVJSX05PQ0xJUFBFUkFUVEFDSEVECQkJTUFLRV9EREhSRVNVTFQoIDU2OCApCisjZGVmaW5lIERERVJSX05PSFdORAkJCQlNQUtFX0RESFJFU1VMVCggNTY5ICkKKyNkZWZpbmUgRERFUlJfSFdORFNVQkNMQVNTRUQJCQlNQUtFX0RESFJFU1VMVCggNTcwICkKKyNkZWZpbmUgRERFUlJfSFdOREFMUkVBRFlTRVQJCQlNQUtFX0RESFJFU1VMVCggNTcxICkKKyNkZWZpbmUgRERFUlJfTk9QQUxFVFRFQVRUQUNIRUQJCQlNQUtFX0RESFJFU1VMVCggNTcyICkKKyNkZWZpbmUgRERFUlJfTk9QQUxFVFRFSFcJCQlNQUtFX0RESFJFU1VMVCggNTczICkKKyNkZWZpbmUgRERFUlJfQkxURkFTVENBTlRDTElQCQkJTUFLRV9EREhSRVNVTFQoIDU3NCApCisjZGVmaW5lIERERVJSX05PQkxUSFcJCQkJTUFLRV9EREhSRVNVTFQoIDU3NSApCisjZGVmaW5lIERERVJSX05PRERST1BTSFcJCQlNQUtFX0RESFJFU1VMVCggNTc2ICkKKyNkZWZpbmUgRERFUlJfT1ZFUkxBWU5PVFZJU0lCTEUJCQlNQUtFX0RESFJFU1VMVCggNTc3ICkKKyNkZWZpbmUgRERFUlJfTk9PVkVSTEFZREVTVAkJCU1BS0VfRERIUkVTVUxUKCA1NzggKQorI2RlZmluZSBEREVSUl9JTlZBTElEUE9TSVRJT04JCQlNQUtFX0RESFJFU1VMVCggNTc5ICkKKyNkZWZpbmUgRERFUlJfTk9UQU9WRVJMQVlTVVJGQUNFCQlNQUtFX0RESFJFU1VMVCggNTgwICkKKyNkZWZpbmUgRERFUlJfRVhDTFVTSVZFTU9ERUFMUkVBRFlTRVQJCU1BS0VfRERIUkVTVUxUKCA1ODEgKQorI2RlZmluZSBEREVSUl9OT1RGTElQUEFCTEUJCQlNQUtFX0RESFJFU1VMVCggNTgyICkKKyNkZWZpbmUgRERFUlJfQ0FOVERVUExJQ0FURQkJCU1BS0VfRERIUkVTVUxUKCA1ODMgKQorI2RlZmluZSBEREVSUl9OT1RMT0NLRUQJCQkJTUFLRV9EREhSRVNVTFQoIDU4NCApCisjZGVmaW5lIERERVJSX0NBTlRDUkVBVEVEQwkJCU1BS0VfRERIUkVTVUxUKCA1ODUgKQorI2RlZmluZSBEREVSUl9OT0RDCQkJCU1BS0VfRERIUkVTVUxUKCA1ODYgKQorI2RlZmluZSBEREVSUl9XUk9OR01PREUJCQkJTUFLRV9EREhSRVNVTFQoIDU4NyApCisjZGVmaW5lIERERVJSX0lNUExJQ0lUTFlDUkVBVEVECQkJTUFLRV9EREhSRVNVTFQoIDU4OCApCisjZGVmaW5lIERERVJSX05PVFBBTEVUVElaRUQJCQlNQUtFX0RESFJFU1VMVCggNTg5ICkKKyNkZWZpbmUgRERFUlJfVU5TVVBQT1JURURNT0RFCQkJTUFLRV9EREhSRVNVTFQoIDU5MCApCisjZGVmaW5lIERERVJSX05PTUlQTUFQSFcJCQlNQUtFX0RESFJFU1VMVCggNTkxICkKKyNkZWZpbmUgRERFUlJfSU5WQUxJRFNVUkZBQ0VUWVBFCQlNQUtFX0RESFJFU1VMVCggNTkyICkKKyNkZWZpbmUgRERFUlJfRENBTFJFQURZQ1JFQVRFRAkJCU1BS0VfRERIUkVTVUxUKCA2MjAgKQorI2RlZmluZSBEREVSUl9DQU5UUEFHRUxPQ0sJCQlNQUtFX0RESFJFU1VMVCggNjQwICkKKyNkZWZpbmUgRERFUlJfQ0FOVFBBR0VVTkxPQ0sJCQlNQUtFX0RESFJFU1VMVCggNjYwICkKKyNkZWZpbmUgRERFUlJfTk9UUEFHRUxPQ0tFRAkJCU1BS0VfRERIUkVTVUxUKCA2ODAgKQorI2RlZmluZSBEREVSUl9OT1RJTklUSUFMSVpFRAkJCUNPX0VfTk9USU5JVElBTElaRUQKKworLyogZHdGbGFncyBmb3IgQmx0KiAqLworI2RlZmluZSBEREJMVF9BTFBIQURFU1QJCQkJMHgwMDAwMDAwMQorI2RlZmluZSBEREJMVF9BTFBIQURFU1RDT05TVE9WRVJSSURFCQkweDAwMDAwMDAyCisjZGVmaW5lIEREQkxUX0FMUEhBREVTVE5FRwkJCTB4MDAwMDAwMDQKKyNkZWZpbmUgRERCTFRfQUxQSEFERVNUU1VSRkFDRU9WRVJSSURFCQkweDAwMDAwMDA4CisjZGVmaW5lIEREQkxUX0FMUEhBRURHRUJMRU5ECQkJMHgwMDAwMDAxMAorI2RlZmluZSBEREJMVF9BTFBIQVNSQwkJCQkweDAwMDAwMDIwCisjZGVmaW5lIEREQkxUX0FMUEhBU1JDQ09OU1RPVkVSUklERQkJMHgwMDAwMDA0MAorI2RlZmluZSBEREJMVF9BTFBIQVNSQ05FRwkJCTB4MDAwMDAwODAKKyNkZWZpbmUgRERCTFRfQUxQSEFTUkNTVVJGQUNFT1ZFUlJJREUJCTB4MDAwMDAxMDAKKyNkZWZpbmUgRERCTFRfQVNZTkMJCQkJMHgwMDAwMDIwMAorI2RlZmluZSBEREJMVF9DT0xPUkZJTEwJCQkJMHgwMDAwMDQwMAorI2RlZmluZSBEREJMVF9EREZYCQkJCTB4MDAwMDA4MDAKKyNkZWZpbmUgRERCTFRfRERST1BTCQkJCTB4MDAwMDEwMDAKKyNkZWZpbmUgRERCTFRfS0VZREVTVAkJCQkweDAwMDAyMDAwCisjZGVmaW5lIEREQkxUX0tFWURFU1RPVkVSUklERQkJCTB4MDAwMDQwMDAKKyNkZWZpbmUgRERCTFRfS0VZU1JDCQkJCTB4MDAwMDgwMDAKKyNkZWZpbmUgRERCTFRfS0VZU1JDT1ZFUlJJREUJCQkweDAwMDEwMDAwCisjZGVmaW5lIEREQkxUX1JPUAkJCQkweDAwMDIwMDAwCisjZGVmaW5lIEREQkxUX1JPVEFUSU9OQU5HTEUJCQkweDAwMDQwMDAwCisjZGVmaW5lIEREQkxUX1pCVUZGRVIJCQkJMHgwMDA4MDAwMAorI2RlZmluZSBEREJMVF9aQlVGRkVSREVTVENPTlNUT1ZFUlJJREUJCTB4MDAxMDAwMDAKKyNkZWZpbmUgRERCTFRfWkJVRkZFUkRFU1RPVkVSUklERQkJMHgwMDIwMDAwMAorI2RlZmluZSBEREJMVF9aQlVGRkVSU1JDQ09OU1RPVkVSUklERQkJMHgwMDQwMDAwMAorI2RlZmluZSBEREJMVF9aQlVGRkVSU1JDT1ZFUlJJREUJCTB4MDA4MDAwMDAKKyNkZWZpbmUgRERCTFRfV0FJVAkJCQkweDAxMDAwMDAwCisjZGVmaW5lIEREQkxUX0RFUFRIRklMTAkJCQkweDAyMDAwMDAwCisKKy8qIGR3VHJhbnMgZm9yIEJsdEZhc3QgKi8KKyNkZWZpbmUgRERCTFRGQVNUX05PQ09MT1JLRVkJCQkweDAwMDAwMDAwCisjZGVmaW5lIEREQkxURkFTVF9TUkNDT0xPUktFWQkJCTB4MDAwMDAwMDEKKyNkZWZpbmUgRERCTFRGQVNUX0RFU1RDT0xPUktFWQkJCTB4MDAwMDAwMDIKKyNkZWZpbmUgRERCTFRGQVNUX1dBSVQJCQkJMHgwMDAwMDAxMAorCisvKiBkd0ZsYWdzIGZvciBGbGlwICovCisjZGVmaW5lIERERkxJUF9XQUlUCQkJCTB4MDAwMDAwMDEKKworLyogZHdGbGFncyBmb3IgR2V0Qmx0U3RhdHVzICovCisjZGVmaW5lIERER0JTX0NBTkJMVAkJCQkweDAwMDAwMDAxCisjZGVmaW5lIERER0JTX0lTQkxURE9ORQkJCQkweDAwMDAwMDAyCisKKy8qIDNkIGNhcGFibGUgKG5vIG1lYW5pbmc/KSAqLworI2RlZmluZSBERFNDQVBTXzNECQkJMHgwMDAwMDAwMQorLyogc3VyZmFjZSBjb250YWlucyBhbHBoYSBpbmZvcm1hdGlvbiAqLworI2RlZmluZSBERFNDQVBTX0FMUEhBCQkJMHgwMDAwMDAwMgorLyogdGhpcyBzdXJmYWNlIGlzIGEgYmFja2J1ZmZlciAqLworI2RlZmluZSBERFNDQVBTX0JBQ0tCVUZGRVIJCTB4MDAwMDAwMDQKKy8qIGNvbXBsZXggc3VyZmFjZSBzdHJ1Y3R1cmUgKi8KKyNkZWZpbmUgRERTQ0FQU19DT01QTEVYCQkJMHgwMDAwMDAwOAorLyogcGFydCBvZiBzdXJmYWNlIGZsaXBwaW5nIHN0cnVjdHVyZSAqLworI2RlZmluZSBERFNDQVBTX0ZMSVAJCQkweDAwMDAwMDEwCisvKiB0aGlzIHN1cmZhY2UgaXMgdGhlIGZyb250YnVmZmVyIHN1cmZhY2UgKi8KKyNkZWZpbmUgRERTQ0FQU19GUk9OVEJVRkZFUgkJMHgwMDAwMDAyMAorLyogdGhpcyBpcyBhIHBsYWluIG9mZnNjcmVlbiBzdXJmYWNlICovCisjZGVmaW5lIEREU0NBUFNfT0ZGU0NSRUVOUExBSU4JCTB4MDAwMDAwNDAKKy8qIG92ZXJsYXkgKi8KKyNkZWZpbmUgRERTQ0FQU19PVkVSTEFZCQkJMHgwMDAwMDA4MAorLyogcGFsZXR0ZSBvYmplY3RzIGNhbiBiZSBjcmVhdGVkIGFuZCBhdHRhY2hlZCB0byB1cyAqLworI2RlZmluZSBERFNDQVBTX1BBTEVUVEUJCQkweDAwMDAwMTAwCisvKiBwcmltYXJ5IHN1cmZhY2UgKHRoZSBvbmUgdGhlIHVzZXIgbG9va3MgYXQgY3VycmVudGx5KShyaWdodCBleWUpKi8KKyNkZWZpbmUgRERTQ0FQU19QUklNQVJZU1VSRkFDRQkJMHgwMDAwMDIwMAorLyogcHJpbWFyeSBzdXJmYWNlIGZvciBsZWZ0IGV5ZSAqLworI2RlZmluZSBERFNDQVBTX1BSSU1BUllTVVJGQUNFTEVGVAkweDAwMDAwNDAwCisvKiBzdXJmYWNlIGV4aXN0cyBpbiBzeXN0ZW1tZW1vcnkgKi8KKyNkZWZpbmUgRERTQ0FQU19TWVNURU1NRU1PUlkJCTB4MDAwMDA4MDAKKy8qIHN1cmZhY2UgY2FuIGJlIHVzZWQgYXMgYSB0ZXh0dXJlICovCisjZGVmaW5lIEREU0NBUFNfVEVYVFVSRQkJICAgICAgICAweDAwMDAxMDAwCisvKiBzdXJmYWNlIG1heSBiZSBkZXN0aW5hdGlvbiBmb3IgM2QgcmVuZGVyaW5nICovCisjZGVmaW5lIEREU0NBUFNfM0RERVZJQ0UJCTB4MDAwMDIwMDAKKy8qIHN1cmZhY2UgZXhpc3RzIGluIHZpZGVvbWVtb3J5ICovCisjZGVmaW5lIEREU0NBUFNfVklERU9NRU1PUlkJCTB4MDAwMDQwMDAKKy8qIHN1cmZhY2UgY2hhbmdlcyBpbW1lZGlhdGVseSB2aXNpYmxlICovCisjZGVmaW5lIEREU0NBUFNfVklTSUJMRQkJCTB4MDAwMDgwMDAKKy8qIHdyaXRlIG9ubHkgc3VyZmFjZSAqLworI2RlZmluZSBERFNDQVBTX1dSSVRFT05MWQkJMHgwMDAxMDAwMAorLyogemJ1ZmZlciBzdXJmYWNlICovCisjZGVmaW5lIEREU0NBUFNfWkJVRkZFUgkJCTB4MDAwMjAwMDAKKy8qIGhhcyBpdHMgb3duIERDICovCisjZGVmaW5lIEREU0NBUFNfT1dOREMJCQkweDAwMDQwMDAwCisvKiBzdXJmYWNlIHNob3VsZCBiZSBhYmxlIHRvIHJlY2VpdmUgbGl2ZSB2aWRlbyAqLworI2RlZmluZSBERFNDQVBTX0xJVkVWSURFTwkJMHgwMDA4MDAwMAorLyogc2hvdWxkIGJlIGFibGUgdG8gaGF2ZSBhIGh3IGNvZGVjIGRlY29tcHJlc3Mgc3R1ZmYgaW50byBpdCAqLworI2RlZmluZSBERFNDQVBTX0hXQ09ERUMJCQkweDAwMTAwMDAwCisvKiBtb2RlIFggKDMyMHgyMDAgb3IgMzIweDI0MCkgc3VyZmFjZSAqLworI2RlZmluZSBERFNDQVBTX01PREVYCQkJMHgwMDIwMDAwMAorLyogb25lIG1pcG1hcCBzdXJmYWNlICgxIGxldmVsKSAqLworI2RlZmluZSBERFNDQVBTX01JUE1BUAkJCTB4MDA0MDAwMDAKKy8qIG1lbW9yeSBhbGxvY2F0aW9uIGRlbGF5ZWQgdW50aWwgTG9hZCgpICovCisjZGVmaW5lIEREU0NBUFNfQUxMT0NPTkxPQUQJCTB4MDQwMDAwMDAKKwordHlwZWRlZiBzdHJ1Y3QgX0REU0NBUFMgeworCURXT1JECWR3Q2FwczsJLyogY2FwYWJpbGl0aWVzIG9mIHN1cmZhY2Ugd2FudGVkICovCit9IEREU0NBUFMsKkxQRERTQ0FQUzsKKworI2RlZmluZQlERF9ST1BfU1BBQ0UJKDI1Ni8zMikJLyogc3BhY2UgcmVxdWlyZWQgdG8gc3RvcmUgUk9QIGFycmF5ICovCisKK3R5cGVkZWYgc3RydWN0IF9ERENBUFMKK3sKKyAgICBEV09SRAlkd1NpemU7ICAgICAgICAgICAgICAgICAvKiBzaXplIG9mIHRoZSBERERSSVZFUkNBUFMgc3RydWN0dXJlICovCisgICAgRFdPUkQJZHdDYXBzOyAgICAgICAgICAgICAgICAgLyogZHJpdmVyIHNwZWNpZmljIGNhcGFiaWxpdGllcyAqLworICAgIERXT1JECWR3Q2FwczI7ICAgICAgICAgICAgICAgIC8qIG1vcmUgZHJpdmVyIHNwZWNpZmljIGNhcGFiaWxpdGVzICovCisgICAgRFdPUkQJZHdDS2V5Q2FwczsgICAgICAgICAgICAgLyogY29sb3Iga2V5IGNhcGFiaWxpdGllcyBvZiB0aGUgc3VyZmFjZSAqLworICAgIERXT1JECWR3RlhDYXBzOyAgICAgICAgICAgICAgIC8qIGRyaXZlciBzcGVjaWZpYyBzdHJldGNoaW5nIGFuZCBlZmZlY3RzIGNhcGFiaWxpdGVzICovCisgICAgRFdPUkQJZHdGWEFscGhhQ2FwczsgICAgICAgICAgLyogYWxwaGEgZHJpdmVyIHNwZWNpZmljIGNhcGFiaWxpdGllcyAqLworICAgIERXT1JECWR3UGFsQ2FwczsgICAgICAgICAgICAgIC8qIHBhbGV0dGUgY2FwYWJpbGl0aWVzICovCisgICAgRFdPUkQJZHdTVkNhcHM7ICAgICAgICAgICAgICAgLyogc3RlcmVvIHZpc2lvbiBjYXBhYmlsaXRpZXMgKi8KKyAgICBEV09SRAlkd0FscGhhQmx0Q29uc3RCaXREZXB0aHM7ICAgICAgIC8qIEREQkRfMiw0LDggKi8KKyAgICBEV09SRAlkd0FscGhhQmx0UGl4ZWxCaXREZXB0aHM7ICAgICAgIC8qIEREQkRfMSwyLDQsOCAqLworICAgIERXT1JECWR3QWxwaGFCbHRTdXJmYWNlQml0RGVwdGhzOyAgICAgLyogRERCRF8xLDIsNCw4ICovCisgICAgRFdPUkQJZHdBbHBoYU92ZXJsYXlDb25zdEJpdERlcHRoczsgICAvKiBEREJEXzIsNCw4ICovCisgICAgRFdPUkQJZHdBbHBoYU92ZXJsYXlQaXhlbEJpdERlcHRoczsgICAvKiBEREJEXzEsMiw0LDggKi8KKyAgICBEV09SRAlkd0FscGhhT3ZlcmxheVN1cmZhY2VCaXREZXB0aHM7IC8qIEREQkRfMSwyLDQsOCAqLworICAgIERXT1JECWR3WkJ1ZmZlckJpdERlcHRoczsgICAgICAgICAgICAgLyogRERCRF84LDE2LDI0LDMyICovCisgICAgRFdPUkQJZHdWaWRNZW1Ub3RhbDsgICAgICAgICAgLyogdG90YWwgYW1vdW50IG9mIHZpZGVvIG1lbW9yeSAqLworICAgIERXT1JECWR3VmlkTWVtRnJlZTsgICAgICAgICAgIC8qIGFtb3VudCBvZiBmcmVlIHZpZGVvIG1lbW9yeSAqLworICAgIERXT1JECWR3TWF4VmlzaWJsZU92ZXJsYXlzOyAgIC8qIG1heGltdW0gbnVtYmVyIG9mIHZpc2libGUgb3ZlcmxheXMgKi8KKyAgICBEV09SRAlkd0N1cnJWaXNpYmxlT3ZlcmxheXM7ICAvKiBjdXJyZW50IG51bWJlciBvZiB2aXNpYmxlIG92ZXJsYXlzICovCisgICAgRFdPUkQJZHdOdW1Gb3VyQ0NDb2RlczsgICAgICAgLyogbnVtYmVyIG9mIGZvdXIgY2MgY29kZXMgKi8KKyAgICBEV09SRAlkd0FsaWduQm91bmRhcnlTcmM7ICAgICAvKiBzb3VyY2UgcmVjdGFuZ2xlIGFsaWdubWVudCAqLworICAgIERXT1JECWR3QWxpZ25TaXplU3JjOyAgICAgICAgIC8qIHNvdXJjZSByZWN0YW5nbGUgYnl0ZSBzaXplICovCisgICAgRFdPUkQJZHdBbGlnbkJvdW5kYXJ5RGVzdDsgICAgLyogZGVzdCByZWN0YW5nbGUgYWxpZ25tZW50ICovCisgICAgRFdPUkQJZHdBbGlnblNpemVEZXN0OyAgICAgICAgLyogZGVzdCByZWN0YW5nbGUgYnl0ZSBzaXplICovCisgICAgRFdPUkQJZHdBbGlnblN0cmlkZUFsaWduOyAgICAgLyogc3RyaWRlIGFsaWdubWVudCAqLworICAgIERXT1JECWR3Um9wc1tERF9ST1BfU1BBQ0VdOyAgIC8qIFJPUFMgc3VwcG9ydGVkICovCisgICAgRERTQ0FQUwlkZHNDYXBzOyAgICAgICAgICAgICAgICAvKiBERFNDQVBTIHN0cnVjdHVyZSBoYXMgYWxsIHRoZSBnZW5lcmFsIGNhcGFiaWxpdGllcyAqLworICAgIERXT1JECWR3TWluT3ZlcmxheVN0cmV0Y2g7ICAgIC8qIG1pbmltdW0gb3ZlcmxheSBzdHJldGNoIGZhY3RvciBtdWx0aXBsaWVkIGJ5IDEwMDAsIGVnIDEwMDAgPT0gMS4wLCAxMzAwID09IDEuMyAqLworICAgIERXT1JECWR3TWF4T3ZlcmxheVN0cmV0Y2g7ICAgIC8qIG1heGltdW0gb3ZlcmxheSBzdHJldGNoIGZhY3RvciBtdWx0aXBsaWVkIGJ5IDEwMDAsIGVnIDEwMDAgPT0gMS4wLCAxMzAwID09IDEuMyAqLworICAgIERXT1JECWR3TWluTGl2ZVZpZGVvU3RyZXRjaDsgIC8qIG1pbmltdW0gbGl2ZSB2aWRlbyBzdHJldGNoIGZhY3RvciBtdWx0aXBsaWVkIGJ5IDEwMDAsIGVnIDEwMDAgPT0gMS4wLCAxMzAwID09IDEuMyAqLworICAgIERXT1JECWR3TWF4TGl2ZVZpZGVvU3RyZXRjaDsgIC8qIG1heGltdW0gbGl2ZSB2aWRlbyBzdHJldGNoIGZhY3RvciBtdWx0aXBsaWVkIGJ5IDEwMDAsIGVnIDEwMDAgPT0gMS4wLCAxMzAwID09IDEuMyAqLworICAgIERXT1JECWR3TWluSHdDb2RlY1N0cmV0Y2g7ICAgIC8qIG1pbmltdW0gaGFyZHdhcmUgY29kZWMgc3RyZXRjaCBmYWN0b3IgbXVsdGlwbGllZCBieSAxMDAwLCBlZyAxMDAwID09IDEuMCwgMTMwMCA9PSAxLjMgKi8KKyAgICBEV09SRAlkd01heEh3Q29kZWNTdHJldGNoOyAgICAvKiBtYXhpbXVtIGhhcmR3YXJlIGNvZGVjIHN0cmV0Y2ggZmFjdG9yIG11bHRpcGxpZWQgYnkgMTAwMCwgZWcgMTAwMCA9PSAxLjAsIDEzMDAgPT0gMS4zICovCisgICAgRFdPUkQJZHdSZXNlcnZlZDE7CisgICAgRFdPUkQJZHdSZXNlcnZlZDI7CisgICAgRFdPUkQJZHdSZXNlcnZlZDM7CisgICAgRFdPUkQJZHdTVkJDYXBzOyAgICAgICAgICAgICAgLyogZHJpdmVyIHNwZWNpZmljIGNhcGFiaWxpdGllcyBmb3IgU3lzdGVtLT5WbWVtIGJsdHMgKi8KKyAgICBEV09SRAlkd1NWQkNLZXlDYXBzOyAgICAgICAgICAvKiBkcml2ZXIgY29sb3Iga2V5IGNhcGFiaWxpdGllcyBmb3IgU3lzdGVtLT5WbWVtIGJsdHMgKi8KKyAgICBEV09SRAlkd1NWQkZYQ2FwczsgICAgICAgICAgICAvKiBkcml2ZXIgRlggY2FwYWJpbGl0aWVzIGZvciBTeXN0ZW0tPlZtZW0gYmx0cyAqLworICAgIERXT1JECWR3U1ZCUm9wc1tERF9ST1BfU1BBQ0VdOy8qIFJPUFMgc3VwcG9ydGVkIGZvciBTeXN0ZW0tPlZtZW0gYmx0cyAqLworICAgIERXT1JECWR3VlNCQ2FwczsgICAgICAgICAgICAgIC8qIGRyaXZlciBzcGVjaWZpYyBjYXBhYmlsaXRpZXMgZm9yIFZtZW0tPlN5c3RlbSBibHRzICovCisgICAgRFdPUkQJZHdWU0JDS2V5Q2FwczsgICAgICAgICAgLyogZHJpdmVyIGNvbG9yIGtleSBjYXBhYmlsaXRpZXMgZm9yIFZtZW0tPlN5c3RlbSBibHRzICovCisgICAgRFdPUkQJZHdWU0JGWENhcHM7ICAgICAgICAgICAgLyogZHJpdmVyIEZYIGNhcGFiaWxpdGllcyBmb3IgVm1lbS0+U3lzdGVtIGJsdHMgKi8KKyAgICBEV09SRAlkd1ZTQlJvcHNbRERfUk9QX1NQQUNFXTsvKiBST1BTIHN1cHBvcnRlZCBmb3IgVm1lbS0+U3lzdGVtIGJsdHMgKi8KKyAgICBEV09SRAlkd1NTQkNhcHM7ICAgICAgICAgICAgICAvKiBkcml2ZXIgc3BlY2lmaWMgY2FwYWJpbGl0aWVzIGZvciBTeXN0ZW0tPlN5c3RlbSBibHRzICovCisgICAgRFdPUkQJZHdTU0JDS2V5Q2FwczsgICAgICAgICAgLyogZHJpdmVyIGNvbG9yIGtleSBjYXBhYmlsaXRpZXMgZm9yIFN5c3RlbS0+U3lzdGVtIGJsdHMgKi8KKyAgICBEV09SRAlkd1NTQkZYQ2FwczsgICAgICAgICAgICAvKiBkcml2ZXIgRlggY2FwYWJpbGl0aWVzIGZvciBTeXN0ZW0tPlN5c3RlbSBibHRzICovCisgICAgRFdPUkQJZHdTU0JSb3BzW0REX1JPUF9TUEFDRV07LyogUk9QUyBzdXBwb3J0ZWQgZm9yIFN5c3RlbS0+U3lzdGVtIGJsdHMgKi8KKyAgICBEV09SRAlkd1Jlc2VydmVkNDsKKyAgICBEV09SRAlkd1Jlc2VydmVkNTsKKyAgICBEV09SRAlkd1Jlc2VydmVkNjsKK30gRERDQVBTLCpMUEREQ0FQUzsKKworLyogaHcgaGFzIDNkIGFjY2VsICovCisjZGVmaW5lIEREQ0FQU18zRAkJCTB4MDAwMDAwMDEKKy8qIHN1cHBvcnRzIG9ubHkgYm91bmRhcnkgYWxpZ25lZCByZWN0YW5nbGVzICovCisjZGVmaW5lIEREQ0FQU19BTElHTkJPVU5EQVJZREVTVAkweDAwMDAwMDAyCisjZGVmaW5lIEREQ0FQU19BTElHTlNJWkVERVNUCQkweDAwMDAwMDA0CisjZGVmaW5lIEREQ0FQU19BTElHTkJPVU5EQVJZU1JDCQkweDAwMDAwMDA4CisjZGVmaW5lIEREQ0FQU19BTElHTlNJWkVTUkMJCTB4MDAwMDAwMTAKKyNkZWZpbmUgRERDQVBTX0FMSUdOU1RSSURFCQkweDAwMDAwMDIwCisjZGVmaW5lIEREQ0FQU19CTFQJCQkweDAwMDAwMDQwCisjZGVmaW5lIEREQ0FQU19CTFRRVUVVRQkJCTB4MDAwMDAwODAKKyNkZWZpbmUgRERDQVBTX0JMVEZPVVJDQwkJMHgwMDAwMDEwMAorI2RlZmluZSBERENBUFNfQkxUU1RSRVRDSAkJMHgwMDAwMDIwMAorI2RlZmluZSBERENBUFNfR0RJCQkJMHgwMDAwMDQwMAorI2RlZmluZSBERENBUFNfT1ZFUkxBWQkJCTB4MDAwMDA4MDAKKyNkZWZpbmUgRERDQVBTX09WRVJMQVlDQU5UQ0xJUAkJMHgwMDAwMTAwMAorI2RlZmluZSBERENBUFNfT1ZFUkxBWUZPVVJDQwkJMHgwMDAwMjAwMAorI2RlZmluZSBERENBUFNfT1ZFUkxBWVNUUkVUQ0gJCTB4MDAwMDQwMDAKKyNkZWZpbmUgRERDQVBTX1BBTEVUVEUJCQkweDAwMDA4MDAwCisjZGVmaW5lIEREQ0FQU19QQUxFVFRFVlNZTkMJCTB4MDAwMTAwMDAKKyNkZWZpbmUgRERDQVBTX1JFQURTQ0FOTElORQkJMHgwMDAyMDAwMAorI2RlZmluZSBERENBUFNfU1RFUkVPVklFVwkJMHgwMDA0MDAwMAorI2RlZmluZSBERENBUFNfVkJJCQkJMHgwMDA4MDAwMAorI2RlZmluZSBERENBUFNfWkJMVFMJCQkweDAwMTAwMDAwCisjZGVmaW5lIEREQ0FQU19aT1ZFUkxBWVMJCTB4MDAyMDAwMDAKKyNkZWZpbmUgRERDQVBTX0NPTE9SS0VZCQkJMHgwMDQwMDAwMAorI2RlZmluZSBERENBUFNfQUxQSEEJCQkweDAwODAwMDAwCisjZGVmaW5lIEREQ0FQU19DT0xPUktFWUhXQVNTSVNUCQkweDAxMDAwMDAwCisjZGVmaW5lIEREQ0FQU19OT0hBUkRXQVJFCQkweDAyMDAwMDAwCisjZGVmaW5lIEREQ0FQU19CTFRDT0xPUkZJTEwJCTB4MDQwMDAwMDAKKyNkZWZpbmUgRERDQVBTX0JBTktTV0lUQ0hFRAkJMHgwODAwMDAwMAorI2RlZmluZSBERENBUFNfQkxUREVQVEhGSUxMCQkweDEwMDAwMDAwCisjZGVmaW5lIEREQ0FQU19DQU5DTElQCQkJMHgyMDAwMDAwMAorI2RlZmluZSBERENBUFNfQ0FOQ0xJUFNUUkVUQ0hFRAkJMHg0MDAwMDAwMAorI2RlZmluZSBERENBUFNfQ0FOQkxUU1lTTUVNCQkweDgwMDAwMDAwCisKKy8qIGR3Q2FwczIgKi8KKy8qIGRyaXZlciBpcyBjZXJ0aWZpZWQgKi8KKyNkZWZpbmUgRERDQVBTMl9DRVJUSUZJRUQJCTB4MDAwMDAwMDEKKy8qIG5vIDJkIG9wZXJhdGlvbnMgaW4gM2QgbW9kZSAqLworI2RlZmluZSBERENBUFMyX05PMkREVVJJTkczRFNDRU5FICAgICAgIDB4MDAwMDAwMDIKKwordHlwZWRlZiBzdHJ1Y3QgX0REQ09MT1JLRVkKK3sKKwlEV09SRAlkd0NvbG9yU3BhY2VMb3dWYWx1ZTsvKiBsb3cgYm91bmRhcnkgb2YgY29sb3Igc3BhY2UgdGhhdCBpcyB0bworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGJlIHRyZWF0ZWQgYXMgQ29sb3IgS2V5LCBpbmNsdXNpdmUKKwkJCQkgICAgICAqLworCURXT1JECWR3Q29sb3JTcGFjZUhpZ2hWYWx1ZTsvKiBoaWdoIGJvdW5kYXJ5IG9mIGNvbG9yIHNwYWNlIHRoYXQgaXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogdG8gYmUgdHJlYXRlZCBhcyBDb2xvciBLZXksIGluY2x1c2l2ZQorCQkJCSAgICAgICAqLworfSBERENPTE9SS0VZLCpMUEREQ09MT1JLRVk7CisKKy8qIGRkQ0tFWUNBUFMgYml0cyAqLworI2RlZmluZSBERENLRVlDQVBTX0RFU1RCTFQJCQkweDAwMDAwMDAxCisjZGVmaW5lIEREQ0tFWUNBUFNfREVTVEJMVENMUlNQQUNFCQkweDAwMDAwMDAyCisjZGVmaW5lIEREQ0tFWUNBUFNfREVTVEJMVENMUlNQQUNFWVVWCQkweDAwMDAwMDA0CisjZGVmaW5lIEREQ0tFWUNBUFNfREVTVEJMVFlVVgkJCTB4MDAwMDAwMDgKKyNkZWZpbmUgRERDS0VZQ0FQU19ERVNUT1ZFUkxBWQkJCTB4MDAwMDAwMTAKKyNkZWZpbmUgRERDS0VZQ0FQU19ERVNUT1ZFUkxBWUNMUlNQQUNFCQkweDAwMDAwMDIwCisjZGVmaW5lIEREQ0tFWUNBUFNfREVTVE9WRVJMQVlDTFJTUEFDRVlVVgkweDAwMDAwMDQwCisjZGVmaW5lIEREQ0tFWUNBUFNfREVTVE9WRVJMQVlPTkVBQ1RJVkUJCTB4MDAwMDAwODAKKyNkZWZpbmUgRERDS0VZQ0FQU19ERVNUT1ZFUkxBWVlVVgkJMHgwMDAwMDEwMAorI2RlZmluZSBERENLRVlDQVBTX1NSQ0JMVAkJCTB4MDAwMDAyMDAKKyNkZWZpbmUgRERDS0VZQ0FQU19TUkNCTFRDTFJTUEFDRQkJMHgwMDAwMDQwMAorI2RlZmluZSBERENLRVlDQVBTX1NSQ0JMVENMUlNQQUNFWVVWCQkweDAwMDAwODAwCisjZGVmaW5lIEREQ0tFWUNBUFNfU1JDQkxUWVVWCQkJMHgwMDAwMTAwMAorI2RlZmluZSBERENLRVlDQVBTX1NSQ09WRVJMQVkJCQkweDAwMDAyMDAwCisjZGVmaW5lIEREQ0tFWUNBUFNfU1JDT1ZFUkxBWUNMUlNQQUNFCQkweDAwMDA0MDAwCisjZGVmaW5lIEREQ0tFWUNBUFNfU1JDT1ZFUkxBWUNMUlNQQUNFWVVWCTB4MDAwMDgwMDAKKyNkZWZpbmUgRERDS0VZQ0FQU19TUkNPVkVSTEFZT05FQUNUSVZFCQkweDAwMDEwMDAwCisjZGVmaW5lIEREQ0tFWUNBUFNfU1JDT1ZFUkxBWVlVVgkJMHgwMDAyMDAwMAorI2RlZmluZSBERENLRVlDQVBTX05PQ09TVE9WRVJMQVkJCTB4MDAwNDAwMDAKKwordHlwZWRlZiBzdHJ1Y3QgX0REUElYRUxGT1JNQVQgeworICAgIERXT1JECWR3U2l6ZTsgICAgICAgICAgICAgICAgIC8qIHNpemUgb2Ygc3RydWN0dXJlICovCisgICAgRFdPUkQJZHdGbGFnczsgICAgICAgICAgICAgICAgLyogcGl4ZWwgZm9ybWF0IGZsYWdzICovCisgICAgRFdPUkQJZHdGb3VyQ0M7ICAgICAgICAgICAgICAgLyogKEZPVVJDQyBjb2RlKSAqLworICAgIHVuaW9uIHsKKwlEV09SRAlkd1JHQkJpdENvdW50OyAgICAgICAgICAvKiBob3cgbWFueSBiaXRzIHBlciBwaXhlbCAoQkRfNCw4LDE2LDI0LDMyKSovCisJRFdPUkQJZHdZVVZCaXRDb3VudDsgICAgICAgICAgLyogaG93IG1hbnkgYml0cyBwZXIgcGl4ZWwgKEJEXzQsOCwxNiwyNCwzMikqLworCURXT1JECWR3WkJ1ZmZlckJpdERlcHRoOyAgICAgIC8qIGhvdyBtYW55IGJpdHMgZm9yIHogYnVmZmVycyAoQkRfOCwxNiwyNCwzMikqLworCURXT1JECWR3QWxwaGFCaXREZXB0aDsgICAgICAgIC8qIGhvdyBtYW55IGJpdHMgZm9yIGFscGhhIGNoYW5uZWxzIChCRF8xLDIsNCw4KSovCisgICAgfSB4OworICAgIHVuaW9uIHsKKwlEV09SRAlkd1JCaXRNYXNrOyAgICAgICAgICAgICAvKiBtYXNrIGZvciByZWQgYml0Ki8KKwlEV09SRAlkd1lCaXRNYXNrOyAgICAgICAgICAgICAvKiBtYXNrIGZvciBZIGJpdHMqLworICAgIH0geTsKKyAgICB1bmlvbiB7CisJRFdPUkQJZHdHQml0TWFzazsgICAgICAgICAgICAgLyogbWFzayBmb3IgZ3JlZW4gYml0cyovCisJRFdPUkQJZHdVQml0TWFzazsgICAgICAgICAgICAgLyogbWFzayBmb3IgVSBiaXRzKi8KKyAgICB9IHo7CisgICAgdW5pb24geworCURXT1JEICAgZHdCQml0TWFzazsgICAgICAgICAgICAgLyogbWFzayBmb3IgYmx1ZSBiaXRzKi8KKwlEV09SRCAgIGR3VkJpdE1hc2s7ICAgICAgICAgICAgIC8qIG1hc2sgZm9yIFYgYml0cyovCisgICAgfSB4eDsKKyAgICB1bmlvbiB7CisgICAgCURXT1JECWR3UkdCQWxwaGFCaXRNYXNrOwkvKiBtYXNrIGZvciBhbHBoYSBjaGFubmVsICovCisgICAgCURXT1JECWR3WVVWQWxwaGFCaXRNYXNrOwkvKiBtYXNrIGZvciBhbHBoYSBjaGFubmVsICovCisKKyAgICB9IHh5OworfSBERFBJWEVMRk9STUFULCpMUEREUElYRUxGT1JNQVQ7CisKKy8qIEREQ0FQUy5kd0ZYQ2FwcyAqLworI2RlZmluZSBEREZYQ0FQU19CTFRBUklUSFNUUkVUQ0hZCTB4MDAwMDAwMjAKKyNkZWZpbmUgRERGWENBUFNfQkxUQVJJVEhTVFJFVENIWU4JMHgwMDAwMDAxMAorI2RlZmluZSBEREZYQ0FQU19CTFRNSVJST1JMRUZUUklHSFQJMHgwMDAwMDA0MAorI2RlZmluZSBEREZYQ0FQU19CTFRNSVJST1JVUERPV04JMHgwMDAwMDA4MAorI2RlZmluZSBEREZYQ0FQU19CTFRST1RBVElPTgkJMHgwMDAwMDEwMAorI2RlZmluZSBEREZYQ0FQU19CTFRST1RBVElPTjkwCQkweDAwMDAwMjAwCisjZGVmaW5lIERERlhDQVBTX0JMVFNIUklOS1gJCTB4MDAwMDA0MDAKKyNkZWZpbmUgRERGWENBUFNfQkxUU0hSSU5LWE4JCTB4MDAwMDA4MDAKKyNkZWZpbmUgRERGWENBUFNfQkxUU0hSSU5LWQkJMHgwMDAwMTAwMAorI2RlZmluZSBEREZYQ0FQU19CTFRTSFJJTktZTgkJMHgwMDAwMjAwMAorI2RlZmluZSBEREZYQ0FQU19CTFRTVFJFVENIWAkJMHgwMDAwNDAwMAorI2RlZmluZSBEREZYQ0FQU19CTFRTVFJFVENIWE4JCTB4MDAwMDgwMDAKKyNkZWZpbmUgRERGWENBUFNfQkxUU1RSRVRDSFkJCTB4MDAwMTAwMDAKKyNkZWZpbmUgRERGWENBUFNfQkxUU1RSRVRDSFlOCQkweDAwMDIwMDAwCisjZGVmaW5lIERERlhDQVBTX09WRVJMQVlBUklUSFNUUkVUQ0hZCTB4MDAwNDAwMDAKKyNkZWZpbmUgRERGWENBUFNfT1ZFUkxBWUFSSVRIU1RSRVRDSFlOCTB4MDAwMDAwMDgKKyNkZWZpbmUgRERGWENBUFNfT1ZFUkxBWVNIUklOS1gJCTB4MDAwODAwMDAKKyNkZWZpbmUgRERGWENBUFNfT1ZFUkxBWVNIUklOS1hOCTB4MDAxMDAwMDAKKyNkZWZpbmUgRERGWENBUFNfT1ZFUkxBWVNIUklOS1kJCTB4MDAyMDAwMDAKKyNkZWZpbmUgRERGWENBUFNfT1ZFUkxBWVNIUklOS1lOCTB4MDA0MDAwMDAKKyNkZWZpbmUgRERGWENBUFNfT1ZFUkxBWVNUUkVUQ0hYCTB4MDA4MDAwMDAKKyNkZWZpbmUgRERGWENBUFNfT1ZFUkxBWVNUUkVUQ0hYTgkweDAxMDAwMDAwCisjZGVmaW5lIERERlhDQVBTX09WRVJMQVlTVFJFVENIWQkweDAyMDAwMDAwCisjZGVmaW5lIERERlhDQVBTX09WRVJMQVlTVFJFVENIWU4JMHgwNDAwMDAwMAorI2RlZmluZSBEREZYQ0FQU19PVkVSTEFZTUlSUk9STEVGVFJJR0hUCTB4MDgwMDAwMDAKKyNkZWZpbmUgRERGWENBUFNfT1ZFUkxBWU1JUlJPUlVQRE9XTgkweDEwMDAwMDAwCisKKy8qIEREQ0FQUy5kd0ZYQWxwaGFDYXBzICovCisjZGVmaW5lIERERlhBTFBIQUNBUFNfQkxUQUxQSEFFREdFQkxFTkQJCTB4MDAwMDAwMDEKKyNkZWZpbmUgRERGWEFMUEhBQ0FQU19CTFRBTFBIQVBJWEVMUwkJMHgwMDAwMDAwMgorI2RlZmluZSBEREZYQUxQSEFDQVBTX0JMVEFMUEhBUElYRUxTTkVHCQkweDAwMDAwMDA0CisjZGVmaW5lIERERlhBTFBIQUNBUFNfQkxUQUxQSEFTVVJGQUNFUwkJMHgwMDAwMDAwOAorI2RlZmluZSBEREZYQUxQSEFDQVBTX0JMVEFMUEhBU1VSRkFDRVNORUcJMHgwMDAwMDAxMAorI2RlZmluZSBEREZYQUxQSEFDQVBTX09WRVJMQVlBTFBIQUVER0VCTEVORAkweDAwMDAwMDIwCisjZGVmaW5lIERERlhBTFBIQUNBUFNfT1ZFUkxBWUFMUEhBUElYRUxTCTB4MDAwMDAwNDAKKyNkZWZpbmUgRERGWEFMUEhBQ0FQU19PVkVSTEFZQUxQSEFQSVhFTFNORUcJMHgwMDAwMDA4MAorI2RlZmluZSBEREZYQUxQSEFDQVBTX09WRVJMQVlBTFBIQVNVUkZBQ0VTCTB4MDAwMDAxMDAKKyNkZWZpbmUgRERGWEFMUEhBQ0FQU19PVkVSTEFZQUxQSEFTVVJGQUNFU05FRwkweDAwMDAwMjAwCisKKy8qIEREQ0FQUy5kd1BhbENhcHMgKi8KKyNkZWZpbmUgRERQQ0FQU180QklUCQkJMHgwMDAwMDAwMQorI2RlZmluZSBERFBDQVBTXzhCSVRFTlRSSUVTCQkweDAwMDAwMDAyCisjZGVmaW5lIEREUENBUFNfOEJJVAkJCTB4MDAwMDAwMDQKKyNkZWZpbmUgRERQQ0FQU19JTklUSUFMSVpFCQkweDAwMDAwMDA4CisjZGVmaW5lIEREUENBUFNfUFJJTUFSWVNVUkZBQ0UJCTB4MDAwMDAwMTAKKyNkZWZpbmUgRERQQ0FQU19QUklNQVJZU1VSRkFDRUxFRlQJMHgwMDAwMDAyMAorI2RlZmluZSBERFBDQVBTX0FMTE9XMjU2CQkweDAwMDAwMDQwCisjZGVmaW5lIEREUENBUFNfVlNZTkMJCQkweDAwMDAwMDgwCisjZGVmaW5lIEREUENBUFNfMUJJVAkJCTB4MDAwMDAxMDAKKyNkZWZpbmUgRERQQ0FQU18yQklUCQkJMHgwMDAwMDIwMAorCisvKiBERENBUFMuZHdTVkNhcHMgKi8KKyNkZWZpbmUgRERTVkNBUFNfRU5JR01BCQkJMHgwMDAwMDAwMWwKKyNkZWZpbmUgRERTVkNBUFNfRkxJQ0tFUgkJMHgwMDAwMDAwMmwKKyNkZWZpbmUgRERTVkNBUFNfUkVEQkxVRQkJMHgwMDAwMDAwNGwKKyNkZWZpbmUgRERTVkNBUFNfU1BMSVQJCQkweDAwMDAwMDA4bAorCisvKiBCaXREZXB0aHMgKi8KKyNkZWZpbmUgRERCRF8xCQkJCTB4MDAwMDQwMDAKKyNkZWZpbmUgRERCRF8yCQkJCTB4MDAwMDIwMDAKKyNkZWZpbmUgRERCRF80CQkJCTB4MDAwMDEwMDAKKyNkZWZpbmUgRERCRF84CQkJCTB4MDAwMDA4MDAKKyNkZWZpbmUgRERCRF8xNgkJCQkweDAwMDAwNDAwCisjZGVmaW5lIEREQkRfMjQJCQkJMHgwMDAwMDIwMAorI2RlZmluZSBEREJEXzMyCQkJCTB4MDAwMDAxMDAKKworLyogRERPVkVSTEFZRlguZHdEREZYICovCisjZGVmaW5lIERET1ZFUkZYX0FSSVRIU1RSRVRDSFkJCTB4MDAwMDAwMDEKKyNkZWZpbmUgRERPVkVSRlhfTUlSUk9STEVGVFJJR0hUCTB4MDAwMDAwMDIKKyNkZWZpbmUgRERPVkVSRlhfTUlSUk9SVVBET1dOCQkweDAwMDAwMDA0CisKKy8qIEREQ09MT1JLRVkuZHdGbGFncyAqLworI2RlZmluZSBERFBGX0FMUEhBUElYRUxTCQkweDAwMDAwMDAxCisjZGVmaW5lIEREUEZfQUxQSEEJCQkweDAwMDAwMDAyCisjZGVmaW5lIEREUEZfRk9VUkNDCQkJMHgwMDAwMDAwNAorI2RlZmluZSBERFBGX1BBTEVUVEVJTkRFWEVENAkJMHgwMDAwMDAwOAorI2RlZmluZSBERFBGX1BBTEVUVEVJTkRFWEVEVE84CQkweDAwMDAwMDEwCisjZGVmaW5lIEREUEZfUEFMRVRURUlOREVYRUQ4CQkweDAwMDAwMDIwCisjZGVmaW5lIEREUEZfUkdCCQkJMHgwMDAwMDA0MAorI2RlZmluZSBERFBGX0NPTVBSRVNTRUQJCQkweDAwMDAwMDgwCisjZGVmaW5lIEREUEZfUkdCVE9ZVVYJCQkweDAwMDAwMTAwCisjZGVmaW5lIEREUEZfWVVWCQkJMHgwMDAwMDIwMAorI2RlZmluZSBERFBGX1pCVUZGRVIJCQkweDAwMDAwNDAwCisjZGVmaW5lIEREUEZfUEFMRVRURUlOREVYRUQxCQkweDAwMDAwODAwCisjZGVmaW5lIEREUEZfUEFMRVRURUlOREVYRUQyCQkweDAwMDAxMDAwCisKKy8qIFNldENvb3BlcmF0aXZlTGV2ZWwgZHdGbGFncyAqLworI2RlZmluZSBERFNDTF9GVUxMU0NSRUVOCQkweDAwMDAwMDAxCisjZGVmaW5lIEREU0NMX0FMTE9XUkVCT09UCQkweDAwMDAwMDAyCisjZGVmaW5lIEREU0NMX05PV0lORE9XQ0hBTkdFUwkJMHgwMDAwMDAwNAorI2RlZmluZSBERFNDTF9OT1JNQUwJCQkweDAwMDAwMDA4CisjZGVmaW5lIEREU0NMX0VYQ0xVU0lWRQkJCTB4MDAwMDAwMTAKKyNkZWZpbmUgRERTQ0xfQUxMT1dNT0RFWAkJMHgwMDAwMDA0MAorCit0eXBlZGVmIHN0cnVjdCBfRERTVVJGQUNFREVTQworeworCURXT1JECWR3U2l6ZTsJLyogc2l6ZSBvZiB0aGUgRERTVVJGQUNFREVTQyBzdHJ1Y3R1cmUqLworCURXT1JECWR3RmxhZ3M7LyogZGV0ZXJtaW5lcyB3aGF0IGZpZWxkcyBhcmUgdmFsaWQqLworCURXT1JECWR3SGVpZ2h0Oy8qIGhlaWdodCBvZiBzdXJmYWNlIHRvIGJlIGNyZWF0ZWQqLworCURXT1JECWR3V2lkdGg7Lyogd2lkdGggb2YgaW5wdXQgc3VyZmFjZSovCisJTE9ORwlsUGl0Y2g7CS8qIGRpc3RhbmNlIHRvIHN0YXJ0IG9mIG5leHQgbGluZSAocmV0dXJuIHZhbHVlIG9ubHkpKi8KKwlEV09SRAlkd0JhY2tCdWZmZXJDb3VudDsJLyogbnVtYmVyIG9mIGJhY2sgYnVmZmVycyByZXF1ZXN0ZWQqLworCXVuaW9uIHsKKwkJRFdPUkQJZHdNaXBNYXBDb3VudDsJLyogbnVtYmVyIG9mIG1pcC1tYXAgbGV2ZWxzIHJlcXVlc3RlZCovCisJCURXT1JECWR3WkJ1ZmZlckJpdERlcHRoOy8qIGRlcHRoIG9mIFogYnVmZmVyIHJlcXVlc3RlZCovCisJCURXT1JECWR3UmVmcmVzaFJhdGU7CS8qIHJlZnJlc2ggcmF0ZSAodXNlZCB3aGVuIGRpc3BsYXkgbW9kZSBpcyBkZXNjcmliZWQpKi8KKwl9IHg7CisJRFdPUkQJZHdBbHBoYUJpdERlcHRoOyAgICAgICAgLyogZGVwdGggb2YgYWxwaGEgYnVmZmVyIHJlcXVlc3RlZCovCisJRFdPUkQJZHdSZXNlcnZlZDsgICAgICAgICAgICAgLyogcmVzZXJ2ZWQqLworCUxQVk9JRAlscFN1cmZhY2U7ICAgICAgICAgICAgICAvKiBwb2ludGVyIHRvIHRoZSBhc3NvY2lhdGVkIHN1cmZhY2UgbWVtb3J5Ki8KKwlERENPTE9SS0VZCWRkY2tDS0Rlc3RPdmVybGF5Oy8qIGNvbG9yIGtleSBmb3IgZGVzdGluYXRpb24gb3ZlcmxheSB1c2UqLworCUREQ09MT1JLRVkJZGRja0NLRGVzdEJsdDsvKiBjb2xvciBrZXkgZm9yIGRlc3RpbmF0aW9uIGJsdCB1c2UqLworCUREQ09MT1JLRVkJZGRja0NLU3JjT3ZlcmxheTsvKiBjb2xvciBrZXkgZm9yIHNvdXJjZSBvdmVybGF5IHVzZSovCisJRERDT0xPUktFWQlkZGNrQ0tTcmNCbHQ7LyogY29sb3Iga2V5IGZvciBzb3VyY2UgYmx0IHVzZSovCisJRERQSVhFTEZPUk1BVAlkZHBmUGl4ZWxGb3JtYXQ7LyogcGl4ZWwgZm9ybWF0IGRlc2NyaXB0aW9uIG9mIHRoZSBzdXJmYWNlKi8KKwlERFNDQVBTCQlkZHNDYXBzOy8qIGRpcmVjdCBkcmF3IHN1cmZhY2UgY2FwYWJpbGl0aWVzKi8KK30gRERTVVJGQUNFREVTQywqTFBERFNVUkZBQ0VERVNDOworCit0eXBlZGVmIEJPT0wzMiAoQ0FMTEJBQ0sgKiBMUERERU5VTUNBTExCQUNLMzJBKShHVUlEICosIExQU1RSLCBMUFNUUiwgTFBWT0lEKTsKK3R5cGVkZWYgQk9PTDMyIChDQUxMQkFDSyAqIExQRERFTlVNQ0FMTEJBQ0szMlcpKEdVSUQgKiwgTFBXU1RSLCBMUFdTVFIsIExQVk9JRCk7CitERUNMX1dJTkVMSUJfVFlQRV9BVyhMUERERU5VTUNBTExCQUNLKQorCit0eXBlZGVmIEhSRVNVTFQgKENBTExCQUNLICogTFBEREVOVU1NT0RFU0NBTExCQUNLKShMUEREU1VSRkFDRURFU0MsIExQVk9JRCk7Cit0eXBlZGVmIEhSRVNVTFQgKENBTExCQUNLICogTFBEREVOVU1TVVJGQUNFU0NBTExCQUNLKShMUERJUkVDVERSQVdTVVJGQUNFLCBMUEREU1VSRkFDRURFU0MsIExQVk9JRCk7CisKKy8qIGR3RmxhZ3MgZmllbGQuLi4gd2hpY2ggYXJlIHZhbGlkICovCisKKyNkZWZpbmUJRERTRF9DQVBTCQkweDAwMDAwMDAxCisjZGVmaW5lCUREU0RfSEVJR0hUCQkweDAwMDAwMDAyCisjZGVmaW5lCUREU0RfV0lEVEgJCTB4MDAwMDAwMDQKKyNkZWZpbmUJRERTRF9QSVRDSAkJMHgwMDAwMDAwOAorI2RlZmluZQlERFNEX0JBQ0tCVUZGRVJDT1VOVAkweDAwMDAwMDIwCisjZGVmaW5lCUREU0RfWkJVRkZFUkJJVERFUFRICTB4MDAwMDAwNDAKKyNkZWZpbmUJRERTRF9BTFBIQUJJVERFUFRICTB4MDAwMDAwODAKKyNkZWZpbmUJRERTRF9QSVhFTEZPUk1BVAkweDAwMDAxMDAwCisjZGVmaW5lCUREU0RfQ0tERVNUT1ZFUkxBWQkweDAwMDAyMDAwCisjZGVmaW5lCUREU0RfQ0tERVNUQkxUCQkweDAwMDA0MDAwCisjZGVmaW5lCUREU0RfQ0tTUkNPVkVSTEFZCTB4MDAwMDgwMDAKKyNkZWZpbmUJRERTRF9DS1NSQ0JMVAkJMHgwMDAxMDAwMAorI2RlZmluZQlERFNEX01JUE1BUENPVU5UCTB4MDAwMjAwMDAKKyNkZWZpbmUJRERTRF9SRUZSRVNIUkFURQkweDAwMDQwMDAwCisjZGVmaW5lCUREU0RfQUxMCQkweDAwMDdmOWVlCisKK3R5cGVkZWYgc3RydWN0IF9EREJMVEZYCit7CisgICAgRFdPUkQgICAgICAgZHdTaXplOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzaXplIG9mIHN0cnVjdHVyZSAqLworICAgIERXT1JEICAgICAgIGR3RERGWDsgICAgICAgICAgICAgICAgICAgICAgICAgLyogRlggb3BlcmF0aW9ucyAqLworICAgIERXT1JEICAgICAgIGR3Uk9QOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogV2luMzIgcmFzdGVyIG9wZXJhdGlvbnMgKi8KKyAgICBEV09SRCAgICAgICBkd0REUk9QOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFJhc3RlciBvcGVyYXRpb25zIG5ldyBmb3IgRGlyZWN0RHJhdyAqLworICAgIERXT1JEICAgICAgIGR3Um90YXRpb25BbmdsZTsgICAgICAgICAgICAgICAgLyogUm90YXRpb24gYW5nbGUgZm9yIGJsdCAqLworICAgIERXT1JEICAgICAgIGR3WkJ1ZmZlck9wQ29kZTsgICAgICAgICAgICAgICAgLyogWkJ1ZmZlciBjb21wYXJlcyAqLworICAgIERXT1JEICAgICAgIGR3WkJ1ZmZlckxvdzsgICAgICAgICAgICAgICAgICAgLyogTG93IGxpbWl0IG9mIFogYnVmZmVyICovCisgICAgRFdPUkQgICAgICAgZHdaQnVmZmVySGlnaDsgICAgICAgICAgICAgICAgICAvKiBIaWdoIGxpbWl0IG9mIFogYnVmZmVyICovCisgICAgRFdPUkQgICAgICAgZHdaQnVmZmVyQmFzZURlc3Q7ICAgICAgICAgICAgICAvKiBEZXN0aW5hdGlvbiBiYXNlIHZhbHVlICovCisgICAgRFdPUkQgICAgICAgZHdaRGVzdENvbnN0Qml0RGVwdGg7ICAgICAgICAgICAvKiBCaXQgZGVwdGggdXNlZCB0byBzcGVjaWZ5IFogY29uc3RhbnQgZm9yIGRlc3RpbmF0aW9uICovCisgICAgdW5pb24KKyAgICB7CisgICAgICAgIERXT1JEICAgZHdaRGVzdENvbnN0OyAgICAgICAgICAgICAgICAgICAvKiBDb25zdGFudCB0byB1c2UgYXMgWiBidWZmZXIgZm9yIGRlc3QgKi8KKyAgICAgICAgTFBESVJFQ1REUkFXU1VSRkFDRSBscEREU1pCdWZmZXJEZXN0OyAgIC8qIFN1cmZhY2UgdG8gdXNlIGFzIFogYnVmZmVyIGZvciBkZXN0ICovCisgICAgfSB4OworICAgIERXT1JEICAgICAgIGR3WlNyY0NvbnN0Qml0RGVwdGg7ICAgICAgICAgICAgLyogQml0IGRlcHRoIHVzZWQgdG8gc3BlY2lmeSBaIGNvbnN0YW50IGZvciBzb3VyY2UgKi8KKyAgICB1bmlvbgorICAgIHsKKyAgICAgICAgRFdPUkQgICBkd1pTcmNDb25zdDsgICAgICAgICAgICAgICAgICAgIC8qIENvbnN0YW50IHRvIHVzZSBhcyBaIGJ1ZmZlciBmb3Igc3JjICovCisgICAgICAgIExQRElSRUNURFJBV1NVUkZBQ0UgbHBERFNaQnVmZmVyU3JjOyAgICAvKiBTdXJmYWNlIHRvIHVzZSBhcyBaIGJ1ZmZlciBmb3Igc3JjICovCisgICAgfSB5OworICAgIERXT1JEICAgICAgIGR3QWxwaGFFZGdlQmxlbmRCaXREZXB0aDsgICAgICAgLyogQml0IGRlcHRoIHVzZWQgdG8gc3BlY2lmeSBjb25zdGFudCBmb3IgYWxwaGEgZWRnZSBibGVuZCAqLworICAgIERXT1JEICAgICAgIGR3QWxwaGFFZGdlQmxlbmQ7ICAgICAgICAgICAgICAgLyogQWxwaGEgZm9yIGVkZ2UgYmxlbmRpbmcgKi8KKyAgICBEV09SRCAgICAgICBkd1Jlc2VydmVkOworICAgIERXT1JEICAgICAgIGR3QWxwaGFEZXN0Q29uc3RCaXREZXB0aDsgICAgICAgLyogQml0IGRlcHRoIHVzZWQgdG8gc3BlY2lmeSBhbHBoYSBjb25zdGFudCBmb3IgZGVzdGluYXRpb24gKi8KKyAgICB1bmlvbgorICAgIHsKKyAgICAgICAgRFdPUkQgICBkd0FscGhhRGVzdENvbnN0OyAgICAgICAgICAgICAgIC8qIENvbnN0YW50IHRvIHVzZSBhcyBBbHBoYSBDaGFubmVsICovCisgICAgICAgIExQRElSRUNURFJBV1NVUkZBQ0UgbHBERFNBbHBoYURlc3Q7ICAgICAvKiBTdXJmYWNlIHRvIHVzZSBhcyBBbHBoYSBDaGFubmVsICovCisgICAgfSB6OworICAgIERXT1JEICAgICAgIGR3QWxwaGFTcmNDb25zdEJpdERlcHRoOyAgICAgICAgLyogQml0IGRlcHRoIHVzZWQgdG8gc3BlY2lmeSBhbHBoYSBjb25zdGFudCBmb3Igc291cmNlICovCisgICAgdW5pb24KKyAgICB7CisgICAgICAgIERXT1JEICAgZHdBbHBoYVNyY0NvbnN0OyAgICAgICAgICAgICAgICAvKiBDb25zdGFudCB0byB1c2UgYXMgQWxwaGEgQ2hhbm5lbCAqLworICAgICAgICBMUERJUkVDVERSQVdTVVJGQUNFIGxwRERTQWxwaGFTcmM7ICAgICAgLyogU3VyZmFjZSB0byB1c2UgYXMgQWxwaGEgQ2hhbm5lbCAqLworICAgIH0gYTsKKyAgICB1bmlvbgorICAgIHsKKyAgICAgICAgRFdPUkQgICBkd0ZpbGxDb2xvcjsgICAgICAgICAgICAgICAgICAgIC8qIGNvbG9yIGluIFJHQiBvciBQYWxldHRpemVkICovCisgICAgICAgIERXT1JEICAgZHdGaWxsRGVwdGg7ICAgICAgICAgICAgICAgICAgICAvKiBkZXB0aCB2YWx1ZSBmb3Igei1idWZmZXIgKi8KKyAgICAgICAgTFBESVJFQ1REUkFXU1VSRkFDRSBscEREU1BhdHRlcm47ICAgICAgIC8qIFN1cmZhY2UgdG8gdXNlIGFzIHBhdHRlcm4gKi8KKyAgICB9IGI7CisgICAgRERDT0xPUktFWSAgZGRja0Rlc3RDb2xvcmtleTsgICAgICAgICAgICAgICAvKiBEZXN0Q29sb3JrZXkgb3ZlcnJpZGUgKi8KKyAgICBERENPTE9SS0VZICBkZGNrU3JjQ29sb3JrZXk7ICAgICAgICAgICAgICAgIC8qIFNyY0NvbG9ya2V5IG92ZXJyaWRlICovCit9IEREQkxURlgsKkxQRERCTFRGWDsKKworLyogZHdEREZYICovCisvKiBhcml0aG1ldGljIHN0cmV0Y2hpbmcgYWxvbmcgeSBheGlzICovCisjZGVmaW5lIEREQkxURlhfQVJJVEhTVFJFVENIWQkJCTB4MDAwMDAwMDEKKy8qIG1pcnJvciBvbiB5IGF4aXMgKi8KKyNkZWZpbmUgRERCTFRGWF9NSVJST1JMRUZUUklHSFQJCQkweDAwMDAwMDAyCisvKiBtaXJyb3Igb24geCBheGlzICovCisjZGVmaW5lIEREQkxURlhfTUlSUk9SVVBET1dOCQkJMHgwMDAwMDAwNAorLyogZG8gbm90IHRlYXIgKi8KKyNkZWZpbmUgRERCTFRGWF9OT1RFQVJJTkcJCQkweDAwMDAwMDA4CisvKiAxODAgZGVncmVlcyBjbG9ja3dpc2Ugcm90YXRpb24gKi8KKyNkZWZpbmUgRERCTFRGWF9ST1RBVEUxODAJCQkweDAwMDAwMDEwCisvKiAyNzAgZGVncmVlcyBjbG9ja3dpc2Ugcm90YXRpb24gKi8KKyNkZWZpbmUgRERCTFRGWF9ST1RBVEUyNzAJCQkweDAwMDAwMDIwCisvKiA5MCBkZWdyZWVzIGNsb2Nrd2lzZSByb3RhdGlvbiAqLworI2RlZmluZSBEREJMVEZYX1JPVEFURTkwCQkJMHgwMDAwMDA0MAorLyogZHdaQnVmZmVyTG93IGFuZCBkd1pCdWZmZXJIaWdoIHNwZWNpZnkgbGltaXRzIHRvIHRoZSBjb3BpZWQgWiB2YWx1ZXMgKi8KKyNkZWZpbmUgRERCTFRGWF9aQlVGRkVSUkFOR0UJCQkweDAwMDAwMDgwCisvKiBhZGQgZHdaQnVmZmVyQmFzZURlc3QgdG8gZXZlcnkgc291cmNlIHogdmFsdWUgYmVmb3JlIGNvbXBhcmUgKi8KKyNkZWZpbmUgRERCTFRGWF9aQlVGRkVSQkFTRURFU1QJCQkweDAwMDAwMTAwCisKK3R5cGVkZWYgc3RydWN0IF9ERE9WRVJMQVlGWAoreworICAgIERXT1JEICAgICAgIGR3U2l6ZTsgICAgICAgICAgICAgICAgICAgICAgICAgLyogc2l6ZSBvZiBzdHJ1Y3R1cmUgKi8KKyAgICBEV09SRCAgICAgICBkd0FscGhhRWRnZUJsZW5kQml0RGVwdGg7ICAgICAgIC8qIEJpdCBkZXB0aCB1c2VkIHRvIHNwZWNpZnkgY29uc3RhbnQgZm9yIGFscGhhIGVkZ2UgYmxlbmQgKi8KKyAgICBEV09SRCAgICAgICBkd0FscGhhRWRnZUJsZW5kOyAgICAgICAgICAgICAgIC8qIENvbnN0YW50IHRvIHVzZSBhcyBhbHBoYSBmb3IgZWRnZSBibGVuZCAqLworICAgIERXT1JEICAgICAgIGR3UmVzZXJ2ZWQ7CisgICAgRFdPUkQgICAgICAgZHdBbHBoYURlc3RDb25zdEJpdERlcHRoOyAgICAgICAvKiBCaXQgZGVwdGggdXNlZCB0byBzcGVjaWZ5IGFscGhhIGNvbnN0YW50IGZvciBkZXN0aW5hdGlvbiAqLworICAgIHVuaW9uCisgICAgeworICAgICAgICBEV09SRCAgIGR3QWxwaGFEZXN0Q29uc3Q7ICAgICAgICAgICAgICAgLyogQ29uc3RhbnQgdG8gdXNlIGFzIGFscGhhIGNoYW5uZWwgZm9yIGRlc3QgKi8KKyAgICAgICAgTFBESVJFQ1REUkFXU1VSRkFDRSBscEREU0FscGhhRGVzdDsgICAgIC8qIFN1cmZhY2UgdG8gdXNlIGFzIGFscGhhIGNoYW5uZWwgZm9yIGRlc3QgKi8KKyAgICB9IHg7CisgICAgRFdPUkQgICAgICAgZHdBbHBoYVNyY0NvbnN0Qml0RGVwdGg7ICAgICAgICAvKiBCaXQgZGVwdGggdXNlZCB0byBzcGVjaWZ5IGFscGhhIGNvbnN0YW50IGZvciBzb3VyY2UgKi8KKyAgICB1bmlvbgorICAgIHsKKyAgICAgICAgRFdPUkQgICBkd0FscGhhU3JjQ29uc3Q7ICAgICAgICAgICAgICAgIC8qIENvbnN0YW50IHRvIHVzZSBhcyBhbHBoYSBjaGFubmVsIGZvciBzcmMgKi8KKyAgICAgICAgTFBESVJFQ1REUkFXU1VSRkFDRSBscEREU0FscGhhU3JjOyAgICAgIC8qIFN1cmZhY2UgdG8gdXNlIGFzIGFscGhhIGNoYW5uZWwgZm9yIHNyYyAqLworICAgIH0geTsKKyAgICBERENPTE9SS0VZICBkY2tEZXN0Q29sb3JrZXk7ICAgICAgICAgICAgICAgIC8qIERlc3RDb2xvcmtleSBvdmVycmlkZSAqLworICAgIEREQ09MT1JLRVkgIGRja1NyY0NvbG9ya2V5OyAgICAgICAgICAgICAgICAgLyogRGVzdENvbG9ya2V5IG92ZXJyaWRlICovCisgICAgRFdPUkQgICAgICAgZHdEREZYOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBPdmVybGF5IEZYICovCisgICAgRFdPUkQgICAgICAgZHdGbGFnczsgICAgICAgICAgICAgICAgICAgICAgICAvKiBmbGFncyAqLworfSBERE9WRVJMQVlGWCwqTFBERE9WRVJMQVlGWDsKKwordHlwZWRlZiBzdHJ1Y3QgX0REQkxUQkFUQ0gKK3sKKyAgICBMUFJFQ1QzMgkJbHByRGVzdDsKKyAgICBMUERJUkVDVERSQVdTVVJGQUNFCWxwRERTU3JjOworICAgIExQUkVDVDMyCQlscHJTcmM7CisgICAgRFdPUkQJCWR3RmxhZ3M7CisgICAgTFBEREJMVEZYCQlscEREQmx0Rng7Cit9IEREQkxUQkFUQ0gsKkxQRERCTFRCQVRDSDsKKworI2RlZmluZSBTVERNRVRIT0QoeGZuKSBIUkVTVUxUIChDQUxMQkFDSyAqZm4jI3hmbikKKyNkZWZpbmUgU1RETUVUSE9EXyhyZXQseGZuKSByZXQgKENBTExCQUNLICpmbiMjeGZuKQorI2RlZmluZSBQVVJFCisjZGVmaW5lIEZBUgorI2RlZmluZSBVTE9ORyBEV09SRAorI2RlZmluZSBUSElTXyBUSElTICwKKworI2RlZmluZSBUSElTIExQRElSRUNURFJBV1BBTEVUVEUgdGhpcworCit0eXBlZGVmIHN0cnVjdCBJRGlyZWN0RHJhd1BhbGV0dGVfVlRhYmxlIHsKKyAgICAvKioqIElVbmtub3duIG1ldGhvZHMgKioqLworICAgIFNURE1FVEhPRChRdWVyeUludGVyZmFjZSkgKFRISVNfIFJFRklJRCByaWlkLCBMUFZPSUQgRkFSICogcHB2T2JqKSBQVVJFOworICAgIFNURE1FVEhPRF8oVUxPTkcsQWRkUmVmKSAoVEhJUykgIFBVUkU7CisgICAgU1RETUVUSE9EXyhVTE9ORyxSZWxlYXNlKSAoVEhJUykgUFVSRTsKKyAgICAvKioqIElEaXJlY3REcmF3UGFsZXR0ZSBtZXRob2RzICoqKi8KKyAgICBTVERNRVRIT0QoR2V0Q2FwcykoVEhJU18gTFBEV09SRCkgUFVSRTsKKyAgICBTVERNRVRIT0QoR2V0RW50cmllcykoVEhJU18gRFdPUkQsRFdPUkQsRFdPUkQsTFBQQUxFVFRFRU5UUlkpIFBVUkU7CisgICAgU1RETUVUSE9EKEluaXRpYWxpemUpKFRISVNfIExQRElSRUNURFJBVywgRFdPUkQsIExQUEFMRVRURUVOVFJZKSBQVVJFOworICAgIFNURE1FVEhPRChTZXRFbnRyaWVzKShUSElTXyBEV09SRCxEV09SRCxEV09SRCxMUFBBTEVUVEVFTlRSWSkgUFVSRTsKK30gKkxQRElSRUNURFJBV1BBTEVUVEVfVlRBQkxFLElEaXJlY3REcmF3UGFsZXR0ZV9WVGFibGU7CisKK3N0cnVjdCBJRGlyZWN0RHJhd1BhbGV0dGUgeworICAgIExQRElSRUNURFJBV1BBTEVUVEVfVlRBQkxFCWxwdnRibDsKKyAgICBEV09SRAkJCXJlZjsKKyAgICBMUERJUkVDVERSQVcJCWRkcmF3OworICAgIENvbG9ybWFwCQkJY207Cit9OworI3VuZGVmIFRISVMKKworI2RlZmluZSBUSElTIExQRElSRUNURFJBV0NMSVBQRVIgdGhpcwordHlwZWRlZiBzdHJ1Y3QgSURpcmVjdERyYXdDbGlwcGVyX1ZUYWJsZSB7CisgICAgLyoqKiBJVW5rbm93biBtZXRob2RzICoqKi8KKyAgICBTVERNRVRIT0QoUXVlcnlJbnRlcmZhY2UpIChUSElTXyBSRUZJSUQgcmlpZCwgTFBWT0lEIEZBUiAqIHBwdk9iaikgUFVSRTsKKyAgICBTVERNRVRIT0RfKFVMT05HLEFkZFJlZikgKFRISVMpICBQVVJFOworICAgIFNURE1FVEhPRF8oVUxPTkcsUmVsZWFzZSkgKFRISVMpIFBVUkU7CisgICAgLyoqKiBJRGlyZWN0RHJhd0NsaXBwZXIgbWV0aG9kcyAqKiovCisgICAgU1RETUVUSE9EKEdldENsaXBMaXN0KShUSElTXyBMUFJFQ1QzMiwgTFBSR05EQVRBLCBMUERXT1JEKSBQVVJFOworICAgIFNURE1FVEhPRChHZXRIV25kKShUSElTXyBIV05EMzIgRkFSICopIFBVUkU7CisgICAgU1RETUVUSE9EKEluaXRpYWxpemUpKFRISVNfIExQRElSRUNURFJBVywgRFdPUkQpIFBVUkU7CisgICAgU1RETUVUSE9EKElzQ2xpcExpc3RDaGFuZ2VkKShUSElTXyBCT09MMzIgRkFSICopIFBVUkU7CisgICAgU1RETUVUSE9EKFNldENsaXBMaXN0KShUSElTXyBMUFJHTkRBVEEsRFdPUkQpIFBVUkU7CisgICAgU1RETUVUSE9EKFNldEhXbmQpKFRISVNfIERXT1JELCBIV05EMzIgKSBQVVJFOworfSAqTFBESVJFQ1REUkFXQ0xJUFBFUl9WVEFCTEUsSURpcmVjdERyYXdDbGlwcGVyX1ZUYWJsZTsKKworc3RydWN0IElEaXJlY3REcmF3Q2xpcHBlciB7CisgICBMUERJUkVDVERSQVdDTElQUEVSX1ZUQUJMRSBscHZ0Ymw7CisgICBEV09SRCByZWY7Cit9OworI3VuZGVmIFRISVMKKworI2RlZmluZSBUSElTIExQRElSRUNURFJBVyB0aGlzCit0eXBlZGVmIHN0cnVjdCBJRGlyZWN0RHJhd19WVGFibGUgeworICAgIC8qKiogSVVua25vd24gbWV0aG9kcyAqKiovCisgICAgU1RETUVUSE9EKFF1ZXJ5SW50ZXJmYWNlKSAoVEhJU18gUkVGSUlEIHJpaWQsIExQVk9JRCBGQVIgKiBwcHZPYmopIFBVUkU7CisgICAgU1RETUVUSE9EXyhVTE9ORyxBZGRSZWYpIChUSElTKSAgUFVSRTsKKyAgICBTVERNRVRIT0RfKFVMT05HLFJlbGVhc2UpIChUSElTKSBQVVJFOworICAgIC8qKiogSURpcmVjdERyYXcgbWV0aG9kcyAqKiovCisgICAgU1RETUVUSE9EKENvbXBhY3QpKFRISVMpIFBVUkU7CisgICAgU1RETUVUSE9EKENyZWF0ZUNsaXBwZXIpKFRISVNfIERXT1JELCBMUERJUkVDVERSQVdDTElQUEVSIEZBUiosIElVbmtub3duIEZBUiAqICkgUFVSRTsKKyAgICBTVERNRVRIT0QoQ3JlYXRlUGFsZXR0ZSkoVEhJU18gRFdPUkQsIExQUEFMRVRURUVOVFJZLCBMUERJUkVDVERSQVdQQUxFVFRFIEZBUiosIElVbmtub3duIEZBUiAqICkgUFVSRTsKKyAgICBTVERNRVRIT0QoQ3JlYXRlU3VyZmFjZSkoVEhJU18gIExQRERTVVJGQUNFREVTQyAqbHBkZHNkLCBMUERJUkVDVERSQVdTVVJGQUNFIEZBUiAqLAorSVVua25vd24gRkFSICopIFBVUkU7CisgICAgU1RETUVUSE9EKER1cGxpY2F0ZVN1cmZhY2UpKCBUSElTXyBMUERJUkVDVERSQVdTVVJGQUNFLCBMUERJUkVDVERSQVdTVVJGQUNFCitGQVIgKiApIFBVUkU7CisgICAgU1RETUVUSE9EKEVudW1EaXNwbGF5TW9kZXMpKCBUSElTXyBEV09SRCwgTFBERFNVUkZBQ0VERVNDLCBMUFZPSUQsIExQRERFTlVNTU9ERVNDQUxMQkFDSyApIFBVUkU7CisgICAgU1RETUVUSE9EKEVudW1TdXJmYWNlcykoVEhJU18gRFdPUkQsIExQRERTVVJGQUNFREVTQywgTFBWT0lELExQRERFTlVNU1VSRkFDRVNDQUxMQkFDSyApIFBVUkU7CisgICAgU1RETUVUSE9EKEZsaXBUb0dESVN1cmZhY2UpKFRISVMpIFBVUkU7CisgICAgU1RETUVUSE9EKEdldENhcHMpKCBUSElTXyBMUEREQ0FQUywgTFBERENBUFMpIFBVUkU7CisgICAgU1RETUVUSE9EKEdldERpc3BsYXlNb2RlKSggVEhJU18gTFBERFNVUkZBQ0VERVNDKSBQVVJFOworICAgIFNURE1FVEhPRChHZXRGb3VyQ0NDb2RlcykoVEhJU18gIExQRFdPUkQsIExQRFdPUkQgKSBQVVJFOworICAgIFNURE1FVEhPRChHZXRHRElTdXJmYWNlKShUSElTXyBMUERJUkVDVERSQVdTVVJGQUNFIEZBUiAqKSBQVVJFOworICAgIFNURE1FVEhPRChHZXRNb25pdG9yRnJlcXVlbmN5KShUSElTXyBMUERXT1JEKSBQVVJFOworICAgIFNURE1FVEhPRChHZXRTY2FuTGluZSkoVEhJU18gTFBEV09SRCkgUFVSRTsKKyAgICBTVERNRVRIT0QoR2V0VmVydGljYWxCbGFua1N0YXR1cykoVEhJU18gQk9PTDMyKiApIFBVUkU7CisgICAgU1RETUVUSE9EKEluaXRpYWxpemUpKFRISVNfIEdVSUQgRkFSICopIFBVUkU7CisgICAgU1RETUVUSE9EKFJlc3RvcmVEaXNwbGF5TW9kZSkoVEhJUykgUFVSRTsKKyAgICBTVERNRVRIT0QoU2V0Q29vcGVyYXRpdmVMZXZlbCkoVEhJU18gSFdORDMyLCBEV09SRCkgUFVSRTsKKyAgICBTVERNRVRIT0QoU2V0RGlzcGxheU1vZGUpKFRISVNfIERXT1JEIHdpZHRoLCBEV09SRCBoZWlnaHQsRFdPUkQgZGVwdGgpIFBVUkU7CisgICAgU1RETUVUSE9EKFdhaXRGb3JWZXJ0aWNhbEJsYW5rKShUSElTXyBEV09SRCwgSEFORExFMzIgKSBQVVJFOworfSAqTFBESVJFQ1REUkFXX1ZUQUJMRSxJRGlyZWN0RHJhd19WVGFibGU7CisKK3N0cnVjdCBfZGlyZWN0ZHJhd2RhdGEgeworICAgIERXT1JECQkJZGVwdGg7CisgICAgRFdPUkQJCQl2cF93aWR0aCx2cF9oZWlnaHQ7IC8qIHZpZXdwb3J0IGRpbWVuc2lvbiAqLworICAgIERXT1JECQkJaGVpZ2h0LHdpZHRoOwkvKiBTZXREaXNwbGF5TW9kZSAqLworICAgIERXT1JECQkJY3VycmVudF9oZWlnaHQsZmJfd2lkdGgsZmJfaGVpZ2h0LGZiX2JhbmtzaXplLGZiX21lbXNpemU7CisgICAgSFdORDMyCQkJbWFpbndpbmRvdzsKKyAgICB2b2lkCQkJKmZiX2FkZHI7Cit9OworCisKK3N0cnVjdCBJRGlyZWN0RHJhdyB7CisJTFBESVJFQ1REUkFXX1ZUQUJMRQlscHZ0Ymw7CisJRFdPUkQJCQlyZWY7CisJc3RydWN0IF9kaXJlY3RkcmF3ZGF0YQlkOworfTsKKworLyogZmxhZ3MgZm9yIExvY2soKSAqLworLyogVGhlIGRlZmF1bHQuICBTZXQgdG8gaW5kaWNhdGUgdGhhdCBMb2NrIHNob3VsZCByZXR1cm4gYSB2YWxpZCBtZW1vcnkgcG9pbnRlcgorICogdG8gdGhlIHRvcCBvZiB0aGUgc3BlY2lmaWVkIHJlY3RhbmdsZS4gIElmIG5vIHJlY3RhbmdsZSBpcyBzcGVjaWZpZWQgdGhlbiBhCisgKiBwb2ludGVyIHRvIHRoZSB0b3Agb2YgdGhlIHN1cmZhY2UgaXMgcmV0dXJuZWQuCisgKi8KKyNkZWZpbmUgRERMT0NLX1NVUkZBQ0VNRU1PUllQVFIJMHgwMDAwMDAwMEwKKy8qIFNldCB0byBpbmRpY2F0ZSB0aGF0IExvY2sgc2hvdWxkIHdhaXQgdW50aWwgaXQgY2FuIG9idGFpbiBhIHZhbGlkIG1lbW9yeQorICogcG9pbnRlciBiZWZvcmUgcmV0dXJuaW5nLiAgSWYgdGhpcyBiaXQgaXMgc2V0LCBMb2NrIHdpbGwgbmV2ZXIgcmV0dXJuCisgKiBEREVSUl9XQVNTVElMTERSQVdJTkcuCisgKi8KKyNkZWZpbmUgRERMT0NLX1dBSVQJCTB4MDAwMDAwMDFMCisvKiBTZXQgaWYgYW4gZXZlbnQgaGFuZGxlIGlzIGJlaW5nIHBhc3NlZCB0byBMb2NrLiAgTG9jayB3aWxsIHRyaWdnZXIgdGhlIGV2ZW50CisgKiB3aGVuIGl0IGNhbiByZXR1cm4gdGhlIHN1cmZhY2UgbWVtb3J5IHBvaW50ZXIgcmVxdWVzdGVkLgorICovCisjZGVmaW5lIERETE9DS19FVkVOVAkJMHgwMDAwMDAwMkwKKy8qIEluZGljYXRlcyB0aGF0IHRoZSBzdXJmYWNlIGJlaW5nIGxvY2tlZCB3aWxsIG9ubHkgYmUgcmVhZCBmcm9tLiAgKi8KKyNkZWZpbmUgRERMT0NLX1JFQURPTkxZCQkweDAwMDAwMDEwTAorLyogSW5kaWNhdGVzIHRoYXQgdGhlIHN1cmZhY2UgYmVpbmcgbG9ja2VkIHdpbGwgb25seSBiZSB3cml0dGVuIHRvICovCisjZGVmaW5lIERETE9DS19XUklURU9OTFkJMHgwMDAwMDAyMEwKKworI3VuZGVmIFRISVMKKworI2RlZmluZSBUSElTIExQRElSRUNURFJBVzIgdGhpcwordHlwZWRlZiBzdHJ1Y3QgSURpcmVjdERyYXcyX1ZUYWJsZQoreworICAgIC8qKiogSVVua25vd24gbWV0aG9kcyAqKiovCisgICAgU1RETUVUSE9EKFF1ZXJ5SW50ZXJmYWNlKSAoVEhJU18gUkVGSUlEIHJpaWQsIExQVk9JRCBGQVIgKiBwcHZPYmopIFBVUkU7CisgICAgU1RETUVUSE9EXyhVTE9ORyxBZGRSZWYpIChUSElTKSAgUFVSRTsKKyAgICBTVERNRVRIT0RfKFVMT05HLFJlbGVhc2UpIChUSElTKSBQVVJFOworICAgIC8qKiogSURpcmVjdERyYXcgbWV0aG9kcyAqKiovCisgICAgU1RETUVUSE9EKENvbXBhY3QpKFRISVMpIFBVUkU7CisgICAgU1RETUVUSE9EKENyZWF0ZUNsaXBwZXIpKFRISVNfIERXT1JELCBMUERJUkVDVERSQVdDTElQUEVSIEZBUiosIElVbmtub3duIEZBUiAqICkgUFVSRTsKKyAgICBTVERNRVRIT0QoQ3JlYXRlUGFsZXR0ZSkoVEhJU18gRFdPUkQsIExQUEFMRVRURUVOVFJZLCBMUERJUkVDVERSQVdQQUxFVFRFIEZBUiosIElVbmtub3duIEZBUiAqICkgUFVSRTsKKyAgICBTVERNRVRIT0QoQ3JlYXRlU3VyZmFjZSkoVEhJU18gIExQRERTVVJGQUNFREVTQywgTFBESVJFQ1REUkFXU1VSRkFDRSBGQVIgKiwKK0lVbmtub3duIEZBUiAqKSBQVVJFOworICAgIFNURE1FVEhPRChEdXBsaWNhdGVTdXJmYWNlKSggVEhJU18gTFBESVJFQ1REUkFXU1VSRkFDRSwgTFBESVJFQ1REUkFXU1VSRkFDRQorRkFSICogKSBQVVJFOworICAgIFNURE1FVEhPRChFbnVtRGlzcGxheU1vZGVzKSggVEhJU18gRFdPUkQsIExQRERTVVJGQUNFREVTQywgTFBWT0lELCBMUERERU5VTU1PREVTQ0FMTEJBQ0sgKSBQVVJFOworICAgIFNURE1FVEhPRChFbnVtU3VyZmFjZXMpKFRISVNfIERXT1JELCBMUEREU1VSRkFDRURFU0MsIExQVk9JRCxMUERERU5VTVNVUkZBQ0VTQ0FMTEJBQ0sgKSBQVVJFOworICAgIFNURE1FVEhPRChGbGlwVG9HRElTdXJmYWNlKShUSElTKSBQVVJFOworICAgIFNURE1FVEhPRChHZXRDYXBzKSggVEhJU18gTFBERENBUFMsIExQRERDQVBTKSBQVVJFOworICAgIFNURE1FVEhPRChHZXREaXNwbGF5TW9kZSkoIFRISVNfIExQRERTVVJGQUNFREVTQykgUFVSRTsKKyAgICBTVERNRVRIT0QoR2V0Rm91ckNDQ29kZXMpKFRISVNfICBMUERXT1JELCBMUERXT1JEICkgUFVSRTsKKyAgICBTVERNRVRIT0QoR2V0R0RJU3VyZmFjZSkoVEhJU18gTFBESVJFQ1REUkFXU1VSRkFDRSBGQVIgKikgUFVSRTsKKyAgICBTVERNRVRIT0QoR2V0TW9uaXRvckZyZXF1ZW5jeSkoVEhJU18gTFBEV09SRCkgUFVSRTsKKyAgICBTVERNRVRIT0QoR2V0U2NhbkxpbmUpKFRISVNfIExQRFdPUkQpIFBVUkU7CisgICAgU1RETUVUSE9EKEdldFZlcnRpY2FsQmxhbmtTdGF0dXMpKFRISVNfIEJPT0wzMiogKSBQVVJFOworICAgIFNURE1FVEhPRChJbml0aWFsaXplKShUSElTXyBHVUlEIEZBUiAqKSBQVVJFOworICAgIFNURE1FVEhPRChSZXN0b3JlRGlzcGxheU1vZGUpKFRISVMpIFBVUkU7CisgICAgU1RETUVUSE9EKFNldENvb3BlcmF0aXZlTGV2ZWwpKFRISVNfIEhXTkQzMiwgRFdPUkQpIFBVUkU7CisgICAgU1RETUVUSE9EKFNldERpc3BsYXlNb2RlKShUSElTXyBEV09SRCwgRFdPUkQsRFdPUkQsIERXT1JELCBEV09SRCkgUFVSRTsKKyAgICBTVERNRVRIT0QoV2FpdEZvclZlcnRpY2FsQmxhbmspKFRISVNfIERXT1JELCBIQU5ETEUzMiApIFBVUkU7CisgICAgLyoqKiBBZGRlZCBpbiB0aGUgdjIgaW50ZXJmYWNlICoqKi8KKyAgICBTVERNRVRIT0QoR2V0QXZhaWxhYmxlVmlkTWVtKShUSElTXyBMUEREU0NBUFMsIExQRFdPUkQsIExQRFdPUkQpIFBVUkU7Cit9IElEaXJlY3REcmF3Ml9WVGFibGUsKkxQRElSRUNURFJBVzJfVlRBQkxFOworLyogTVVTVCBIQVZFIFRIRSBTQU1FIExBWU9VVCBBUyBzdHJ1Y3QgSURpcmVjdERyYXcgKi8KKworc3RydWN0IElEaXJlY3REcmF3MiB7CisgICAgTFBESVJFQ1REUkFXMl9WVEFCTEUJbHB2dGJsOworICAgIERXT1JECQkJcmVmOworICAgIHN0cnVjdCBfZGlyZWN0ZHJhd2RhdGEJZDsKK307CisjdW5kZWYgVEhJUworCisjZGVmaW5lIFRISVMgTFBESVJFQ1REUkFXU1VSRkFDRSB0aGlzCit0eXBlZGVmIHN0cnVjdCBJRGlyZWN0RHJhd1N1cmZhY2VfVlRhYmxlIHsKKyAgICAvKioqIElVbmtub3duIG1ldGhvZHMgKioqLworICAgIFNURE1FVEhPRChRdWVyeUludGVyZmFjZSkgKFRISVNfIFJFRklJRCByaWlkLCBMUFZPSUQgRkFSICogcHB2T2JqKSBQVVJFOworICAgIFNURE1FVEhPRF8oVUxPTkcsQWRkUmVmKSAoVEhJUykgIFBVUkU7CisgICAgU1RETUVUSE9EXyhVTE9ORyxSZWxlYXNlKSAoVEhJUykgUFVSRTsKKyAgICAvKioqIElEaXJlY3REcmF3U3VyZmFjZSBtZXRob2RzICoqKi8KKyAgICBTVERNRVRIT0QoQWRkQXR0YWNoZWRTdXJmYWNlKShUSElTXyBMUERJUkVDVERSQVdTVVJGQUNFKSBQVVJFOworICAgIFNURE1FVEhPRChBZGRPdmVybGF5RGlydHlSZWN0KShUSElTXyBMUFJFQ1QzMikgUFVSRTsKKyAgICBTVERNRVRIT0QoQmx0KShUSElTXyBMUFJFQ1QzMixMUERJUkVDVERSQVdTVVJGQUNFLCBMUFJFQ1QzMixEV09SRCwgTFBEREJMVEZYKSBQVVJFOworICAgIFNURE1FVEhPRChCbHRCYXRjaCkoVEhJU18gTFBEREJMVEJBVENILCBEV09SRCwgRFdPUkQgKSBQVVJFOworICAgIFNURE1FVEhPRChCbHRGYXN0KShUSElTXyBEV09SRCxEV09SRCxMUERJUkVDVERSQVdTVVJGQUNFLCBMUFJFQ1QzMixEV09SRCkgUFVSRTsKKyAgICBTVERNRVRIT0QoRGVsZXRlQXR0YWNoZWRTdXJmYWNlKShUSElTXyBEV09SRCxMUERJUkVDVERSQVdTVVJGQUNFKSBQVVJFOworICAgIFNURE1FVEhPRChFbnVtQXR0YWNoZWRTdXJmYWNlcykoVEhJU18gTFBWT0lELExQRERFTlVNU1VSRkFDRVNDQUxMQkFDSykgUFVSRTsgICAgU1RETUVUSE9EKEVudW1PdmVybGF5Wk9yZGVycykoVEhJU18gRFdPUkQsTFBWT0lELExQRERFTlVNU1VSRkFDRVNDQUxMQkFDSykgUFVSRTsKKyAgICBTVERNRVRIT0QoRmxpcCkoVEhJU18gTFBESVJFQ1REUkFXU1VSRkFDRSwgRFdPUkQpIFBVUkU7CisgICAgU1RETUVUSE9EKEdldEF0dGFjaGVkU3VyZmFjZSkoVEhJU18gTFBERFNDQVBTLCBMUERJUkVDVERSQVdTVVJGQUNFIEZBUiAqKSBQVVJFOworICAgIFNURE1FVEhPRChHZXRCbHRTdGF0dXMpKFRISVNfIERXT1JEKSBQVVJFOworICAgIFNURE1FVEhPRChHZXRDYXBzKShUSElTXyBMUEREU0NBUFMpIFBVUkU7CisgICAgU1RETUVUSE9EKEdldENsaXBwZXIpKFRISVNfIExQRElSRUNURFJBV0NMSVBQRVIgRkFSKikgUFVSRTsKKyAgICBTVERNRVRIT0QoR2V0Q29sb3JLZXkpKFRISVNfIERXT1JELCBMUEREQ09MT1JLRVkpIFBVUkU7CisgICAgU1RETUVUSE9EKEdldERDKShUSElTXyBIREMzMiBGQVIgKikgUFVSRTsKKyAgICBTVERNRVRIT0QoR2V0RmxpcFN0YXR1cykoVEhJU18gRFdPUkQpIFBVUkU7CisgICAgU1RETUVUSE9EKEdldE92ZXJsYXlQb3NpdGlvbikoVEhJU18gTFBMT05HLCBMUExPTkcgKSBQVVJFOworICAgIFNURE1FVEhPRChHZXRQYWxldHRlKShUSElTXyBMUERJUkVDVERSQVdQQUxFVFRFIEZBUiopIFBVUkU7CisgICAgU1RETUVUSE9EKEdldFBpeGVsRm9ybWF0KShUSElTXyBMUEREUElYRUxGT1JNQVQpIFBVUkU7CisgICAgU1RETUVUSE9EKEdldFN1cmZhY2VEZXNjKShUSElTXyBMUEREU1VSRkFDRURFU0MpIFBVUkU7CisgICAgU1RETUVUSE9EKEluaXRpYWxpemUpKFRISVNfIExQRElSRUNURFJBVywgTFBERFNVUkZBQ0VERVNDKSBQVVJFOworICAgIFNURE1FVEhPRChJc0xvc3QpKFRISVMpIFBVUkU7CisgICAgU1RETUVUSE9EKExvY2spKFRISVNfIExQUkVDVDMyLExQRERTVVJGQUNFREVTQyxEV09SRCBmbGFncyxIQU5ETEUzMikgUFVSRTsKKyAgICBTVERNRVRIT0QoUmVsZWFzZURDKShUSElTXyBIREMzMikgUFVSRTsKKyAgICBTVERNRVRIT0QoUmVzdG9yZSkoVEhJUykgUFVSRTsKKyAgICBTVERNRVRIT0QoU2V0Q2xpcHBlcikoVEhJU18gTFBESVJFQ1REUkFXQ0xJUFBFUikgUFVSRTsKKyAgICBTVERNRVRIT0QoU2V0Q29sb3JLZXkpKFRISVNfIERXT1JELCBMUEREQ09MT1JLRVkpIFBVUkU7CisgICAgU1RETUVUSE9EKFNldE92ZXJsYXlQb3NpdGlvbikoVEhJU18gTE9ORywgTE9ORyApIFBVUkU7CisgICAgU1RETUVUSE9EKFNldFBhbGV0dGUpKFRISVNfIExQRElSRUNURFJBV1BBTEVUVEUpIFBVUkU7CisgICAgU1RETUVUSE9EKFVubG9jaykoVEhJU18gTFBWT0lEKSBQVVJFOworICAgIFNURE1FVEhPRChVcGRhdGVPdmVybGF5KShUSElTXyBMUFJFQ1QzMiwgTFBESVJFQ1REUkFXU1VSRkFDRSxMUFJFQ1QzMixEV09SRCwgTFBERE9WRVJMQVlGWCkgUFVSRTsKKyAgICBTVERNRVRIT0QoVXBkYXRlT3ZlcmxheURpc3BsYXkpKFRISVNfIERXT1JEKSBQVVJFOworICAgIFNURE1FVEhPRChVcGRhdGVPdmVybGF5Wk9yZGVyKShUSElTXyBEV09SRCwgTFBESVJFQ1REUkFXU1VSRkFDRSkgUFVSRTsKK30gKkxQRElSRUNURFJBV1NVUkZBQ0VfVlRBQkxFLElEaXJlY3REcmF3U3VyZmFjZV9WVGFibGU7CisKK3N0cnVjdCBJRGlyZWN0RHJhd1N1cmZhY2UgeworICAgIExQRElSRUNURFJBV1NVUkZBQ0VfVlRBQkxFIGxwdnRibDsKKyAgICBEV09SRAkJcmVmOworICAgIExQVk9JRAkJc3VyZmFjZTsKKyAgICBMUERJUkVDVERSQVdQQUxFVFRFCXBhbGV0dGU7CisgICAgRFdPUkQJCWZiX2hlaWdodCxscGl0Y2gsd2lkdGgsaGVpZ2h0OworICAgIExQRElSRUNURFJBVwlkZHJhdzsKK307CisjdW5kZWYgVEhJUworI2RlZmluZSBUSElTIExQRElSRUNURFJBV1NVUkZBQ0UyIHRoaXMKKwordHlwZWRlZiBzdHJ1Y3QgSURpcmVjdERyYXdTdXJmYWNlMl9WVGFibGUgeworICAgIC8qKiogSVVua25vd24gbWV0aG9kcyAqKiovCisgICAgU1RETUVUSE9EKFF1ZXJ5SW50ZXJmYWNlKSAoVEhJU18gUkVGSUlEIHJpaWQsIExQVk9JRCBGQVIgKiBwcHZPYmopIFBVUkU7CisgICAgU1RETUVUSE9EXyhVTE9ORyxBZGRSZWYpIChUSElTKSAgUFVSRTsKKyAgICBTVERNRVRIT0RfKFVMT05HLFJlbGVhc2UpIChUSElTKSBQVVJFOworICAgIC8qKiogSURpcmVjdERyYXdTdXJmYWNlIG1ldGhvZHMgKioqLworICAgIFNURE1FVEhPRChBZGRBdHRhY2hlZFN1cmZhY2UpKFRISVNfIExQRElSRUNURFJBV1NVUkZBQ0UyKSBQVVJFOworICAgIFNURE1FVEhPRChBZGRPdmVybGF5RGlydHlSZWN0KShUSElTXyBMUFJFQ1QzMikgUFVSRTsKKyAgICBTVERNRVRIT0QoQmx0KShUSElTXyBMUFJFQ1QzMixMUERJUkVDVERSQVdTVVJGQUNFMiwgTFBSRUNUMzIsRFdPUkQsIExQRERCTFRGWCkgUFVSRTsKKyAgICBTVERNRVRIT0QoQmx0QmF0Y2gpKFRISVNfIExQRERCTFRCQVRDSCwgRFdPUkQsIERXT1JEICkgUFVSRTsKKyAgICBTVERNRVRIT0QoQmx0RmFzdCkoVEhJU18gRFdPUkQsRFdPUkQsTFBESVJFQ1REUkFXU1VSRkFDRTIsIExQUkVDVDMyLERXT1JEKSBQVVJFOworICAgIFNURE1FVEhPRChEZWxldGVBdHRhY2hlZFN1cmZhY2UpKFRISVNfIERXT1JELExQRElSRUNURFJBV1NVUkZBQ0UyKSBQVVJFOworICAgIFNURE1FVEhPRChFbnVtQXR0YWNoZWRTdXJmYWNlcykoVEhJU18gTFBWT0lELExQRERFTlVNU1VSRkFDRVNDQUxMQkFDSykgUFVSRTsgICAgU1RETUVUSE9EKEVudW1PdmVybGF5Wk9yZGVycykoVEhJU18gRFdPUkQsTFBWT0lELExQRERFTlVNU1VSRkFDRVNDQUxMQkFDSykgUFVSRTsKKyAgICBTVERNRVRIT0QoRmxpcCkoVEhJU18gTFBESVJFQ1REUkFXU1VSRkFDRTIsIERXT1JEKSBQVVJFOworICAgIFNURE1FVEhPRChHZXRBdHRhY2hlZFN1cmZhY2UpKFRISVNfIExQRERTQ0FQUywgTFBESVJFQ1REUkFXU1VSRkFDRTIgRkFSICopIFBVUkU7CisgICAgU1RETUVUSE9EKEdldEJsdFN0YXR1cykoVEhJU18gRFdPUkQpIFBVUkU7CisgICAgU1RETUVUSE9EKEdldENhcHMpKFRISVNfIExQRERTQ0FQUykgUFVSRTsKKyAgICBTVERNRVRIT0QoR2V0Q2xpcHBlcikoVEhJU18gTFBESVJFQ1REUkFXQ0xJUFBFUiBGQVIqKSBQVVJFOworICAgIFNURE1FVEhPRChHZXRDb2xvcktleSkoVEhJU18gRFdPUkQsIExQRERDT0xPUktFWSkgUFVSRTsKKyAgICBTVERNRVRIT0QoR2V0REMpKFRISVNfIEhEQzMyIEZBUiAqKSBQVVJFOworICAgIFNURE1FVEhPRChHZXRGbGlwU3RhdHVzKShUSElTXyBEV09SRCkgUFVSRTsKKyAgICBTVERNRVRIT0QoR2V0T3ZlcmxheVBvc2l0aW9uKShUSElTXyBMUExPTkcsIExQTE9ORyApIFBVUkU7CisgICAgU1RETUVUSE9EKEdldFBhbGV0dGUpKFRISVNfIExQRElSRUNURFJBV1BBTEVUVEUgRkFSKikgUFVSRTsKKyAgICBTVERNRVRIT0QoR2V0UGl4ZWxGb3JtYXQpKFRISVNfIExQRERQSVhFTEZPUk1BVCkgUFVSRTsKKyAgICBTVERNRVRIT0QoR2V0U3VyZmFjZURlc2MpKFRISVNfIExQRERTVVJGQUNFREVTQykgUFVSRTsKKyAgICBTVERNRVRIT0QoSW5pdGlhbGl6ZSkoVEhJU18gTFBESVJFQ1REUkFXLCBMUEREU1VSRkFDRURFU0MpIFBVUkU7CisgICAgU1RETUVUSE9EKElzTG9zdCkoVEhJUykgUFVSRTsKKyAgICBTVERNRVRIT0QoTG9jaykoVEhJU18gTFBSRUNUMzIsTFBERFNVUkZBQ0VERVNDLERXT1JELEhBTkRMRTMyKSBQVVJFOworICAgIFNURE1FVEhPRChSZWxlYXNlREMpKFRISVNfIEhEQzMyKSBQVVJFOworICAgIFNURE1FVEhPRChSZXN0b3JlKShUSElTKSBQVVJFOworICAgIFNURE1FVEhPRChTZXRDbGlwcGVyKShUSElTXyBMUERJUkVDVERSQVdDTElQUEVSKSBQVVJFOworICAgIFNURE1FVEhPRChTZXRDb2xvcktleSkoVEhJU18gRFdPUkQsIExQRERDT0xPUktFWSkgUFVSRTsKKyAgICBTVERNRVRIT0QoU2V0T3ZlcmxheVBvc2l0aW9uKShUSElTXyBMT05HLCBMT05HICkgUFVSRTsKKyAgICBTVERNRVRIT0QoU2V0UGFsZXR0ZSkoVEhJU18gTFBESVJFQ1REUkFXUEFMRVRURSkgUFVSRTsKKyAgICBTVERNRVRIT0QoVW5sb2NrKShUSElTXyBMUFZPSUQpIFBVUkU7CisgICAgU1RETUVUSE9EKFVwZGF0ZU92ZXJsYXkpKFRISVNfIExQUkVDVDMyLCBMUERJUkVDVERSQVdTVVJGQUNFMixMUFJFQ1QzMixEV09SRCwgTFBERE9WRVJMQVlGWCkgUFVSRTsKKyAgICBTVERNRVRIT0QoVXBkYXRlT3ZlcmxheURpc3BsYXkpKFRISVNfIERXT1JEKSBQVVJFOworICAgIFNURE1FVEhPRChVcGRhdGVPdmVybGF5Wk9yZGVyKShUSElTXyBEV09SRCwgTFBESVJFQ1REUkFXU1VSRkFDRTIpIFBVUkU7CisgICAgLyoqKiBBZGRlZCBpbiB0aGUgdjIgaW50ZXJmYWNlICoqKi8KKyAgICBTVERNRVRIT0QoR2V0RERJbnRlcmZhY2UpKFRISVNfIExQVk9JRCBGQVIgKikgUFVSRTsKKyAgICBTVERNRVRIT0QoUGFnZUxvY2spKFRISVNfIERXT1JEKSBQVVJFOworICAgIFNURE1FVEhPRChQYWdlVW5sb2NrKShUSElTXyBEV09SRCkgUFVSRTsKK30gKkxQRElSRUNURFJBV1NVUkZBQ0UyX1ZUQUJMRSxJRGlyZWN0RHJhd1N1cmZhY2UyX1ZUYWJsZTsKKworc3RydWN0IElEaXJlY3REcmF3U3VyZmFjZTIgeworICAgIExQRElSRUNURFJBV1NVUkZBQ0UyX1ZUQUJMRQlscHZ0Ymw7CisgICAgRFdPUkQJCXJlZjsKKyAgICBMUFZPSUQJCXN1cmZhY2U7CisgICAgTFBESVJFQ1REUkFXUEFMRVRURQlwYWxldHRlOworICAgIERXT1JECQlmYl9oZWlnaHQsbHBpdGNoLHdpZHRoLGhlaWdodDsKKyAgICBMUERJUkVDVERSQVcJZGRyYXc7Cit9OworI3VuZGVmIFRISVMKKworI3VuZGVmIFRISVNfCisjdW5kZWYgUFVSRQorI3VuZGVmIEZBUgorI3VuZGVmIFNURE1FVEhPRAorI3VuZGVmIFNURE1FVEhPRF8KKworZXh0ZXJuIEhSRVNVTFQgV0lOQVBJIERpcmVjdERyYXdDcmVhdGUoIExQR1VJRCBscEdVSUQsTFBESVJFQ1REUkFXICpscGxwREQsTFBVTktOT1dOIHBVbmtPdXRlciApOworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2Rzb3VuZC5oIGIvaW5jbHVkZS9kc291bmQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MWQwNDJiCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9kc291bmQuaApAQCAtMCwwICsxLDE4NyBAQAorI2lmbmRlZiBfX1dJTkVfRFNPVU5EX0gKKyNkZWZpbmUgX19XSU5FX0RTT1VORF9ICisKKyNpbmNsdWRlICJtbXN5c3RlbS5oIgorCisvKiBEaXJlY3QgU291bmQgQ29tcG9uZW50IEdVSUQgICAgezQ3RDREOTQ2LTYyRTgtMTFjZi05M0JDLTQ0NDU1MzU0MDAwMH0gKi8KK0RFRklORV9HVUlEKENMU0lEX0RpcmVjdFNvdW5kLDB4NDdkNGQ5NDYsIDB4NjJlOCwgMHgxMWNmLCAweDkzLCAweGJjLCAweDQ0LCAweDQ1LCAweDUzLCAweDU0LCAweDAsIDB4MCk7CisKKy8qIERpcmVjdFNvdW5kIDI3OWFmYTgzLTQ5ODEtMTFjZS1hNTIxLTAwMjBhZjBiZTU2MCAqLworREVGSU5FX0dVSUQoSUlEX0lEaXJlY3RTb3VuZCwweDI3OUFGQTgzLDB4NDk4MSwweDExQ0UsMHhBNSwweDIxLDB4MDAsMHgyMCwweEFGLDB4MEIsMHhFNSwweDYwKTsKKy8qIERpcmVjdFNvdW5kQnVmZmVyIDI3OWFmYTg1LTQ5ODEtMTFjZS1hNTIxLTAwMjBhZjBiZTU2MCAqLworREVGSU5FX0dVSUQoSUlEX0lEaXJlY3RTb3VuZEJ1ZmZlciwweDI3OUFGQTg1LDB4NDk4MSwweDExQ0UsMHhBNSwweDIxLDB4MDAsMHgyMCwweEFGLDB4MEIsMHhFNSwweDYwKTsgCisKK3R5cGVkZWYgc3RydWN0IElEaXJlY3RTb3VuZCBJRGlyZWN0U291bmQsKkxQRElSRUNUU09VTkQ7Cit0eXBlZGVmIHN0cnVjdCBJRGlyZWN0U291bmRCdWZmZXIgSURpcmVjdFNvdW5kQnVmZmVyLCpMUERJUkVDVFNPVU5EQlVGRkVSLCoqTFBMUERJUkVDVFNPVU5EQlVGRkVSOworCisjZGVmaW5lIERTQ0FQU19QUklNQVJZTU9OTyAgICAgICAgICAweDAwMDAwMDAxCisjZGVmaW5lIERTQ0FQU19QUklNQVJZU1RFUkVPICAgICAgICAweDAwMDAwMDAyCisjZGVmaW5lIERTQ0FQU19QUklNQVJZOEJJVCAgICAgICAgICAweDAwMDAwMDA0CisjZGVmaW5lIERTQ0FQU19QUklNQVJZMTZCSVQgICAgICAgICAweDAwMDAwMDA4CisjZGVmaW5lIERTQ0FQU19DT05USU5VT1VTUkFURSAgICAgICAweDAwMDAwMDEwCisjZGVmaW5lIERTQ0FQU19FTVVMRFJJVkVSICAgICAgICAgICAweDAwMDAwMDIwCisjZGVmaW5lIERTQ0FQU19DRVJUSUZJRUQgICAgICAgICAgICAweDAwMDAwMDQwCisjZGVmaW5lIERTQ0FQU19TRUNPTkRBUllNT05PICAgICAgICAweDAwMDAwMTAwCisjZGVmaW5lIERTQ0FQU19TRUNPTkRBUllTVEVSRU8gICAgICAweDAwMDAwMjAwCisjZGVmaW5lIERTQ0FQU19TRUNPTkRBUlk4QklUICAgICAgICAweDAwMDAwNDAwCisjZGVmaW5lIERTQ0FQU19TRUNPTkRBUlkxNkJJVCAgICAgICAweDAwMDAwODAwCisKK3R5cGVkZWYgc3RydWN0IF9EU0NBUFMKK3sKKyAgICBEV09SRAlkd1NpemU7CisgICAgRFdPUkQJZHdGbGFnczsKKyAgICBEV09SRAlkd01pblNlY29uZGFyeVNhbXBsZVJhdGU7CisgICAgRFdPUkQJZHdNYXhTZWNvbmRhcnlTYW1wbGVSYXRlOworICAgIERXT1JECWR3UHJpbWFyeUJ1ZmZlcnM7CisgICAgRFdPUkQJZHdNYXhId01peGluZ0FsbEJ1ZmZlcnM7CisgICAgRFdPUkQJZHdNYXhId01peGluZ1N0YXRpY0J1ZmZlcnM7CisgICAgRFdPUkQJZHdNYXhId01peGluZ1N0cmVhbWluZ0J1ZmZlcnM7CisgICAgRFdPUkQJZHdGcmVlSHdNaXhpbmdBbGxCdWZmZXJzOworICAgIERXT1JECWR3RnJlZUh3TWl4aW5nU3RhdGljQnVmZmVyczsKKyAgICBEV09SRAlkd0ZyZWVId01peGluZ1N0cmVhbWluZ0J1ZmZlcnM7CisgICAgRFdPUkQJZHdNYXhIdzNEQWxsQnVmZmVyczsKKyAgICBEV09SRAlkd01heEh3M0RTdGF0aWNCdWZmZXJzOworICAgIERXT1JECWR3TWF4SHczRFN0cmVhbWluZ0J1ZmZlcnM7CisgICAgRFdPUkQJZHdGcmVlSHczREFsbEJ1ZmZlcnM7CisgICAgRFdPUkQJZHdGcmVlSHczRFN0YXRpY0J1ZmZlcnM7CisgICAgRFdPUkQJZHdGcmVlSHczRFN0cmVhbWluZ0J1ZmZlcnM7CisgICAgRFdPUkQJZHdUb3RhbEh3TWVtQnl0ZXM7CisgICAgRFdPUkQJZHdGcmVlSHdNZW1CeXRlczsKKyAgICBEV09SRAlkd01heENvbnRpZ0ZyZWVId01lbUJ5dGVzOworICAgIERXT1JECWR3VW5sb2NrVHJhbnNmZXJSYXRlSHdCdWZmZXJzOworICAgIERXT1JECWR3UGxheUNwdU92ZXJoZWFkU3dCdWZmZXJzOworICAgIERXT1JECWR3UmVzZXJ2ZWQxOworICAgIERXT1JECWR3UmVzZXJ2ZWQyOworfSBEU0NBUFMsKkxQRFNDQVBTOworCisjZGVmaW5lIERTQlBMQVlfTE9PUElORyAgICAgICAgIDB4MDAwMDAwMDEKKworI2RlZmluZSBEU0JTVEFUVVNfUExBWUlORyAgICAgICAgICAgMHgwMDAwMDAwMQorI2RlZmluZSBEU0JTVEFUVVNfQlVGRkVSTE9TVCAgICAgICAgMHgwMDAwMDAwMgorI2RlZmluZSBEU0JTVEFUVVNfTE9PUElORyAgICAgICAgICAgMHgwMDAwMDAwNAorCisKKyNkZWZpbmUgRFNCTE9DS19GUk9NV1JJVEVDVVJTT1IgICAgICAgICAweDAwMDAwMDAxCisKKyNkZWZpbmUgRFNCQ0FQU19QUklNQVJZQlVGRkVSICAgICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgRFNCQ0FQU19TVEFUSUMgICAgICAgICAgICAgIDB4MDAwMDAwMDIKKyNkZWZpbmUgRFNCQ0FQU19MT0NIQVJEV0FSRSAgICAgICAgIDB4MDAwMDAwMDQKKyNkZWZpbmUgRFNCQ0FQU19MT0NTT0ZUV0FSRSAgICAgICAgIDB4MDAwMDAwMDgKKyNkZWZpbmUgRFNCQ0FQU19DVFJMRlJFUVVFTkNZICAgICAgIDB4MDAwMDAwMjAKKyNkZWZpbmUgRFNCQ0FQU19DVFJMUEFOICAgICAgICAgICAgIDB4MDAwMDAwNDAKKyNkZWZpbmUgRFNCQ0FQU19DVFJMVk9MVU1FICAgICAgICAgIDB4MDAwMDAwODAKKyNkZWZpbmUgRFNCQ0FQU19DVFJMREVGQVVMVCAgICAgICAgIDB4MDAwMDAwRTAgIC8qIFBhbiArIHZvbHVtZSArIGZyZXF1ZW5jeS4gKi8KKyNkZWZpbmUgRFNCQ0FQU19DVFJMQUxMICAgICAgICAgICAgIDB4MDAwMDAwRTAgIC8qIEFsbCBjb250cm9sIGNhcGFiaWxpdGllcyAqLworI2RlZmluZSBEU0JDQVBTX1NUSUNLWUZPQ1VTICAgICAgICAgMHgwMDAwNDAwMAorI2RlZmluZSBEU0JDQVBTX0dFVENVUlJFTlRQT1NJVElPTjIgMHgwMDAxMDAwMCAgLyogTW9yZSBhY2N1cmF0ZSBwbGF5IGN1cnNvciB1bmRlciBlbXVsYXRpb24qLworCit0eXBlZGVmIHN0cnVjdCBfRFNCQ0FQUworeworICAgIERXT1JECWR3U2l6ZTsKKyAgICBEV09SRAlkd0ZsYWdzOworICAgIERXT1JECWR3QnVmZmVyQnl0ZXM7CisgICAgRFdPUkQJZHdVbmxvY2tUcmFuc2ZlclJhdGU7CisgICAgRFdPUkQJZHdQbGF5Q3B1T3ZlcmhlYWQ7Cit9IERTQkNBUFMsKkxQRFNCQ0FQUzsKKworI2RlZmluZSBEU1NDTF9OT1JNQUwgICAgICAgICAgICAgICAgMQorI2RlZmluZSBEU1NDTF9QUklPUklUWSAgICAgICAgICAgICAgMgorI2RlZmluZSBEU1NDTF9FWENMVVNJVkUgICAgICAgICAgICAgMworI2RlZmluZSBEU1NDTF9XUklURVBSSU1BUlkgICAgICAgICAgNAorCit0eXBlZGVmIHN0cnVjdCBfRFNCVUZGRVJERVNDCit7CisgICAgRFdPUkQJCWR3U2l6ZTsKKyAgICBEV09SRAkJZHdGbGFnczsKKyAgICBEV09SRAkJZHdCdWZmZXJCeXRlczsKKyAgICBEV09SRAkJZHdSZXNlcnZlZDsKKyAgICBMUFdBVkVGT1JNQVRFWAlscHdmeEZvcm1hdDsKK30gRFNCVUZGRVJERVNDLCpMUERTQlVGRkVSREVTQzsKKworCisKKyNkZWZpbmUgRFNTUEVBS0VSX0hFQURQSE9ORSAgICAgMQorI2RlZmluZSBEU1NQRUFLRVJfTU9OTyAgICAgICAgICAyCisjZGVmaW5lIERTU1BFQUtFUl9RVUFEICAgICAgICAgIDMKKyNkZWZpbmUgRFNTUEVBS0VSX1NURVJFTyAgICAgICAgNAorI2RlZmluZSBEU1NQRUFLRVJfU1VSUk9VTkQgICAgICA1CisKKworCit0eXBlZGVmIExQVk9JRCogTFBMUFZPSUQ7CisKK3R5cGVkZWYgQk9PTDMyIChDQUxMQkFDSyAqTFBEU0VOVU1DQUxMQkFDSzMyVykoTFBHVUlELExQV1NUUixMUFdTVFIsTFBWT0lEKTsKK3R5cGVkZWYgQk9PTDMyIChDQUxMQkFDSyAqTFBEU0VOVU1DQUxMQkFDSzMyQSkoTFBHVUlELExQU1RSLExQU1RSLExQVk9JRCk7CisKK2V4dGVybiBIUkVTVUxUIFdJTkFQSSBEaXJlY3RTb3VuZENyZWF0ZShMUEdVSUQgbHBHVUlELExQRElSRUNUU09VTkQgKiBwcERTLElVbmtub3duICpwVW5rT3V0ZXIgKTsKKworI2RlZmluZSBTVERNRVRIT0QoeGZuKSBIUkVTVUxUIChDQUxMQkFDSyAqZm4jI3hmbikKKyNkZWZpbmUgU1RETUVUSE9EXyhyZXQseGZuKSByZXQgKENBTExCQUNLICpmbiMjeGZuKQorI2RlZmluZSBQVVJFCisjZGVmaW5lIEZBUgorI2RlZmluZSBVTE9ORyBEV09SRAorCisjZGVmaW5lIFRISVMgTFBESVJFQ1RTT1VORCB0aGlzCisjZGVmaW5lIFRISVNfIExQRElSRUNUU09VTkQgdGhpcywKKwordHlwZWRlZiBzdHJ1Y3QgdGFnTFBESVJFQ1RTT1VORF9WVEFCTEUKK3sKKyAgICAvKioqIElVbmtub3duIG1ldGhvZHMgKioqLworICAgIFNURE1FVEhPRChRdWVyeUludGVyZmFjZSkgKFRISVNfIFJFRklJRCByaWlkLCBMUFZPSUQgKiBwcHZPYmopIFBVUkU7CisgICAgU1RETUVUSE9EXyhVTE9ORyxBZGRSZWYpIChUSElTKSAgUFVSRTsKKyAgICBTVERNRVRIT0RfKFVMT05HLFJlbGVhc2UpIChUSElTKSBQVVJFOworICAgIC8qKiogSURpcmVjdFNvdW5kIG1ldGhvZHMgKioqLworCisgICAgU1RETUVUSE9EKCBDcmVhdGVTb3VuZEJ1ZmZlcikoVEhJU18gTFBEU0JVRkZFUkRFU0MsIExQTFBESVJFQ1RTT1VOREJVRkZFUiwgSVVua25vd24gRkFSICopIFBVUkU7CisgICAgU1RETUVUSE9EKCBHZXRDYXBzKShUSElTXyBMUERTQ0FQUyApIFBVUkU7CisgICAgU1RETUVUSE9EKCBEdXBsaWNhdGVTb3VuZEJ1ZmZlcikoVEhJU18gTFBESVJFQ1RTT1VOREJVRkZFUiwgTFBMUERJUkVDVFNPVU5EQlVGRkVSICkgUFVSRTsKKyAgICBTVERNRVRIT0QoIFNldENvb3BlcmF0aXZlTGV2ZWwpKFRISVNfIEhXTkQzMiwgRFdPUkQgKSBQVVJFOworICAgIFNURE1FVEhPRCggQ29tcGFjdCkoVEhJUyApIFBVUkU7CisgICAgU1RETUVUSE9EKCBHZXRTcGVha2VyQ29uZmlnKShUSElTXyBMUERXT1JEICkgUFVSRTsKKyAgICBTVERNRVRIT0QoIFNldFNwZWFrZXJDb25maWcpKFRISVNfIERXT1JEICkgUFVSRTsKKyAgICBTVERNRVRIT0QoIEluaXRpYWxpemUpKFRISVNfIEdVSUQgRkFSICogKSBQVVJFOworfSAqTFBESVJFQ1RTT1VORF9WVEFCTEU7CisKK3N0cnVjdCBJRGlyZWN0U291bmQgeworCUxQRElSRUNUU09VTkRfVlRBQkxFCWxwdnRibDsKKwlEV09SRAkJCXJlZjsKK307CisKKyN1bmRlZiBUSElTCisjdW5kZWYgVEhJU18KKyNkZWZpbmUgVEhJUyBMUERJUkVDVFNPVU5EQlVGRkVSIHRoaXMKKyNkZWZpbmUgVEhJU18gTFBESVJFQ1RTT1VOREJVRkZFUiB0aGlzLAordHlwZWRlZiBzdHJ1Y3QgdGFnTFBESVJFQ1RTT1VOREJVRkZFUl9WVEFCTEUKK3sKKyAgICAvKioqIElVbmtub3duIG1ldGhvZHMgKioqLworICAgIFNURE1FVEhPRChRdWVyeUludGVyZmFjZSkgKFRISVNfIFJFRklJRCByaWlkLCBMUFZPSUQgKiBwcHZPYmopIFBVUkU7CisgICAgU1RETUVUSE9EXyhVTE9ORyxBZGRSZWYpIChUSElTKSAgUFVSRTsKKyAgICBTVERNRVRIT0RfKFVMT05HLFJlbGVhc2UpIChUSElTKSBQVVJFOworICAgIC8qKiogSURpcmVjdFNvdW5kQnVmZmVyIG1ldGhvZHMgKioqLworCisgICAgU1RETUVUSE9EKCAgICAgICAgICAgR2V0Q2FwcykoVEhJU18gTFBEU0JDQVBTICkgUFVSRTsKKyAgICBTVERNRVRIT0QoR2V0Q3VycmVudFBvc2l0aW9uKShUSElTXyBMUERXT1JELExQRFdPUkQgKSBQVVJFOworICAgIFNURE1FVEhPRCggICAgICAgICBHZXRGb3JtYXQpKFRISVNfIExQV0FWRUZPUk1BVEVYLCBEV09SRCwgTFBEV09SRCApIFBVUkU7CisgICAgU1RETUVUSE9EKCAgICAgICAgIEdldFZvbHVtZSkoVEhJU18gTFBMT05HICkgUFVSRTsKKyAgICBTVERNRVRIT0QoICAgICAgICAgICAgR2V0UGFuKShUSElTXyBMUExPTkcgKSBQVVJFOworICAgIFNURE1FVEhPRCggICAgICBHZXRGcmVxdWVuY3kpKFRISVNfIExQRFdPUkQgKSBQVVJFOworICAgIFNURE1FVEhPRCggICAgICAgICBHZXRTdGF0dXMpKFRISVNfIExQRFdPUkQgKSBQVVJFOworICAgIFNURE1FVEhPRCggICAgICAgIEluaXRpYWxpemUpKFRISVNfIExQRElSRUNUU09VTkQsIExQRFNCVUZGRVJERVNDICkgUFVSRTsKKyAgICBTVERNRVRIT0QoICAgICAgICAgICAgICBMb2NrKShUSElTXyBEV09SRCxEV09SRCxMUFZPSUQsTFBEV09SRCxMUFZPSUQsTFBEV09SRCxEV09SRCApIFBVUkU7CisgICAgU1RETUVUSE9EKCAgICAgICAgICAgICAgUGxheSkoVEhJU18gRFdPUkQsRFdPUkQsRFdPUkQgKSBQVVJFOworICAgIFNURE1FVEhPRChTZXRDdXJyZW50UG9zaXRpb24pKFRISVNfIERXT1JEICkgUFVSRTsKKyAgICBTVERNRVRIT0QoICAgICAgICAgU2V0Rm9ybWF0KShUSElTXyBMUFdBVkVGT1JNQVRFWCApIFBVUkU7CisgICAgU1RETUVUSE9EKCAgICAgICAgIFNldFZvbHVtZSkoVEhJU18gTE9ORyApIFBVUkU7CisgICAgU1RETUVUSE9EKCAgICAgICAgICAgIFNldFBhbikoVEhJU18gTE9ORyApIFBVUkU7CisgICAgU1RETUVUSE9EKCAgICAgIFNldEZyZXF1ZW5jeSkoVEhJU18gRFdPUkQgKSBQVVJFOworICAgIFNURE1FVEhPRCggICAgICAgICAgICAgIFN0b3ApKFRISVMgICkgUFVSRTsKKyAgICBTVERNRVRIT0QoICAgICAgICAgICAgVW5sb2NrKShUSElTXyBMUFZPSUQsRFdPUkQsTFBWT0lELERXT1JEICkgUFVSRTsKKyAgICBTVERNRVRIT0QoICAgICAgICAgICBSZXN0b3JlKShUSElTICApIFBVUkU7Cit9ICpMUERJUkVDVFNPVU5EQlVGRkVSX1ZUQUJMRTsKKworc3RydWN0IElEaXJlY3RTb3VuZEJ1ZmZlciB7CisJTFBESVJFQ1RTT1VOREJVRkZFUl9WVEFCTEUJbHB2dGJsOworCURXT1JECQkJCXJlZjsKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9maWxlLmggYi9pbmNsdWRlL2ZpbGUuaAppbmRleCBiYWRjNjdhLi5kZTQzZTFiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2ZpbGUuaAorKysgYi9pbmNsdWRlL2ZpbGUuaApAQCAtOSw3ICs5LDcgQEAKIAogI2luY2x1ZGUgPHRpbWUuaD4KICNpbmNsdWRlICJ3aW5kb3dzLmgiCi0jaW5jbHVkZSAiaGFuZGxlMzIuaCIKKyNpbmNsdWRlICJrMzJvYmouaCIKIAogI2RlZmluZSBNQVhfUEFUSE5BTUVfTEVOICAgMTAyNAogCkBAIC0zNSw3ICszNSw2IEBACiAKIAogLyogZmlsZXMvZmlsZS5jICovCi1leHRlcm4gdm9pZCBGSUxFX0Rlc3Ryb3koIEszMk9CSiAqcHRyICk7CiBleHRlcm4gdm9pZCBGSUxFX1NldERvc0Vycm9yKHZvaWQpOwogZXh0ZXJuIEhGSUxFMzIgRklMRV9EdXBVbml4SGFuZGxlKCBpbnQgZmQgKTsKIGV4dGVybiBCT09MMzIgRklMRV9TdGF0KCBMUENTVFIgdW5peE5hbWUsIEJZX0hBTkRMRV9GSUxFX0lORk9STUFUSU9OICppbmZvICk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2hhbmRsZTMyLmggYi9pbmNsdWRlL2hhbmRsZTMyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllNWZjYTAuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9oYW5kbGUzMi5oCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoKLSAqIEtFUk5FTDMyIG9iamVjdHMKLSAqCi0gKiBDb3B5cmlnaHQgMTk5NiBBbGV4YW5kcmUgSnVsbGlhcmQKLSAqLwotCi0jaWZuZGVmIF9fV0lORV9IQU5ETEUzMl9ICi0jZGVmaW5lIF9fV0lORV9IQU5ETEUzMl9ICi0KLSNpbmNsdWRlICJ3aW50eXBlcy5oIgotCi0vKiBPYmplY3QgdHlwZXMgKi8KLXR5cGVkZWYgZW51bQotewotICAgIEszMk9CSl9VTktOT1dOID0gMCwKLSAgICBLMzJPQkpfU0VNQVBIT1JFLAotICAgIEszMk9CSl9FVkVOVCwKLSAgICBLMzJPQkpfTVVURVgsCi0gICAgSzMyT0JKX0NSSVRJQ0FMX1NFQ1RJT04sCi0gICAgSzMyT0JKX1BST0NFU1MsCi0gICAgSzMyT0JKX1RIUkVBRCwKLSAgICBLMzJPQkpfRklMRSwKLSAgICBLMzJPQkpfQ0hBTkdFLAotICAgIEszMk9CSl9DT05TT0xFLAotICAgIEszMk9CSl9TQ1JFRU5fQlVGRkVSLAotICAgIEszMk9CSl9NRU1fTUFQUEVEX0ZJTEUsCi0gICAgSzMyT0JKX1NFUklBTCwKLSAgICBLMzJPQkpfREVWSUNFX0lPQ1RMLAotICAgIEszMk9CSl9QSVBFLAotICAgIEszMk9CSl9NQUlMU0xPVCwKLSAgICBLMzJPQkpfVE9PTEhFTFBfU05BUFNIT1QsCi0gICAgSzMyT0JKX1NPQ0tFVCwKLSAgICBLMzJPQkpfTkJPQkpFQ1RTCi19IEszMk9CSl9UWVBFOwotCi0vKiBLZXJuZWwgb2JqZWN0ICovCi10eXBlZGVmIHN0cnVjdAotewotICAgIEszMk9CSl9UWVBFICAgdHlwZTsKLSAgICBEV09SRCAgICAgICAgIHJlZmNvdW50OwotfSBLMzJPQko7Ci0KLS8qIEtlcm5lbCBvYmplY3QgbGlzdCBlbnRyeSAqLwotdHlwZWRlZiBzdHJ1Y3QgX0szMk9CSl9FTlRSWQotewotICAgIEszMk9CSiAgICAgICAgICAgICAgICpvYmo7Ci0gICAgc3RydWN0IF9LMzJPQkpfRU5UUlkgKm5leHQ7Ci0gICAgc3RydWN0IF9LMzJPQkpfRU5UUlkgKnByZXY7Ci19IEszMk9CSl9FTlRSWTsKLQotLyogS2VybmVsIG9iamVjdCBsaXN0ICovCi10eXBlZGVmIHN0cnVjdAotewotICAgIEszMk9CSl9FTlRSWSAqaGVhZDsKLSAgICBLMzJPQkpfRU5UUlkgKnRhaWw7Ci19IEszMk9CSl9MSVNUOwotCi1leHRlcm4gdm9pZCBLMzJPQkpfSW5jQ291bnQoIEszMk9CSiAqcHRyICk7Ci1leHRlcm4gdm9pZCBLMzJPQkpfRGVjQ291bnQoIEszMk9CSiAqcHRyICk7Ci1leHRlcm4gdm9pZCBLMzJPQkpfQWRkSGVhZCggSzMyT0JKX0xJU1QgKmxpc3QsIEszMk9CSiAqcHRyICk7Ci1leHRlcm4gdm9pZCBLMzJPQkpfQWRkVGFpbCggSzMyT0JKX0xJU1QgKmxpc3QsIEszMk9CSiAqcHRyICk7Ci1leHRlcm4gdm9pZCBLMzJPQkpfUmVtb3ZlKCBLMzJPQkpfTElTVCAqbGlzdCwgSzMyT0JKICpwdHIgKTsKLWV4dGVybiBLMzJPQkogKkszMk9CSl9SZW1vdmVIZWFkKCBLMzJPQkpfTElTVCAqbGlzdCApOwotZXh0ZXJuIEJPT0wzMiBLMzJPQkpfQWRkTmFtZSggSzMyT0JKICpvYmosIExQQ1NUUiBuYW1lICk7Ci1leHRlcm4gSzMyT0JKICpLMzJPQkpfRmluZE5hbWUoIExQQ1NUUiBuYW1lICk7Ci1leHRlcm4gSzMyT0JKICpLMzJPQkpfRmluZE5hbWVUeXBlKCBMUENTVFIgbmFtZSwgSzMyT0JKX1RZUEUgdHlwZSApOwotCi0jZW5kaWYgLyogX19XSU5FX0hBTkRMRTMyX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvaGVhcC5oIGIvaW5jbHVkZS9oZWFwLmgKaW5kZXggODQ1OWViYS4uODJmMjZlMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9oZWFwLmgKKysrIGIvaW5jbHVkZS9oZWFwLmgKQEAgLTEyLDYgKzEyLDcgQEAKIAogZXh0ZXJuIEhBTkRMRTMyIFN5c3RlbUhlYXA7CiBleHRlcm4gSEFORExFMzIgU2VncHRySGVhcDsKK2V4dGVybiBDUklUSUNBTF9TRUNUSU9OICpIRUFQX1N5c3RlbUxvY2s7CiAKIGV4dGVybiBpbnQgSEVBUF9Jc0luc2lkZUhlYXAoIEhBTkRMRTMyIGhlYXAsIERXT1JEIGZsYWdzLCBMUENWT0lEIHB0ciApOwogZXh0ZXJuIFNFR1BUUiBIRUFQX0dldFNlZ3B0ciggSEFORExFMzIgaGVhcCwgRFdPUkQgZmxhZ3MsIExQQ1ZPSUQgcHRyICk7CkBAIC0zNiw0ICszNywxMSBAQAogI2RlZmluZSBTRUdQVFJfRlJFRShwdHIpIFwKICAgICAgICAgIChISVdPUkQocHRyKSA/IEhlYXBGcmVlKCBTZWdwdHJIZWFwLCAwLCAocHRyKSApIDogMCkKIAorLyogU3lzdGVtIGhlYXAgbG9ja2luZyBtYWNyb3MgKi8KKworI2RlZmluZSBTWVNURU1fTE9DSygpICAgICAgIChFbnRlckNyaXRpY2FsU2VjdGlvbihIRUFQX1N5c3RlbUxvY2spKQorI2RlZmluZSBTWVNURU1fVU5MT0NLKCkgICAgIChMZWF2ZUNyaXRpY2FsU2VjdGlvbihIRUFQX1N5c3RlbUxvY2spKQorLyogVXNlIHRoaXMgb25lIG9ubHkgd2hlbiB5b3Ugb3duIHRoZSBsb2NrISAqLworI2RlZmluZSBTWVNURU1fTE9DS19DT1VOVCgpIChIRUFQX1N5c3RlbUxvY2stPlJlY3Vyc2lvbkNvdW50KQorCiAjZW5kaWYgIC8qIF9fV0lORV9IRUFQX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvazMyb2JqLmggYi9pbmNsdWRlL2szMm9iai5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmZTNjOTQKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2szMm9iai5oCkBAIC0wLDAgKzEsNjYgQEAKKy8qCisgKiBLRVJORUwzMiBvYmplY3RzCisgKgorICogQ29weXJpZ2h0IDE5OTYsIDE5OTggQWxleGFuZHJlIEp1bGxpYXJkCisgKi8KKworI2lmbmRlZiBfX1dJTkVfSzMyT0JKX0gKKyNkZWZpbmUgX19XSU5FX0szMk9CSl9ICisKKyNpbmNsdWRlICJ3aW50eXBlcy5oIgorCisvKiBPYmplY3QgdHlwZXMgKi8KK3R5cGVkZWYgZW51bQoreworICAgIEszMk9CSl9VTktOT1dOID0gMCwKKyAgICBLMzJPQkpfU0VNQVBIT1JFLAorICAgIEszMk9CSl9FVkVOVCwKKyAgICBLMzJPQkpfTVVURVgsCisgICAgSzMyT0JKX0NSSVRJQ0FMX1NFQ1RJT04sCisgICAgSzMyT0JKX1BST0NFU1MsCisgICAgSzMyT0JKX1RIUkVBRCwKKyAgICBLMzJPQkpfRklMRSwKKyAgICBLMzJPQkpfQ0hBTkdFLAorICAgIEszMk9CSl9DT05TT0xFLAorICAgIEszMk9CSl9TQ1JFRU5fQlVGRkVSLAorICAgIEszMk9CSl9NRU1fTUFQUEVEX0ZJTEUsCisgICAgSzMyT0JKX1NFUklBTCwKKyAgICBLMzJPQkpfREVWSUNFX0lPQ1RMLAorICAgIEszMk9CSl9QSVBFLAorICAgIEszMk9CSl9NQUlMU0xPVCwKKyAgICBLMzJPQkpfVE9PTEhFTFBfU05BUFNIT1QsCisgICAgSzMyT0JKX1NPQ0tFVCwKKyAgICBLMzJPQkpfTkJPQkpFQ1RTCit9IEszMk9CSl9UWVBFOworCisvKiBLZXJuZWwgb2JqZWN0ICovCit0eXBlZGVmIHN0cnVjdAoreworICAgIEszMk9CSl9UWVBFICAgdHlwZTsKKyAgICBMT05HICAgICAgICAgIHJlZmNvdW50OworfSBLMzJPQko7CisKKy8qIEtlcm5lbCBvYmplY3Qgb3BlcmF0aW9ucyAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBCT09MMzIgKCpzaWduYWxlZCkoSzMyT0JKKixEV09SRCk7ICAgIC8qIElzIG9iamVjdCBzaWduYWxlZD8gKi8KKyAgICB2b2lkICAgKCpzYXRpc2ZpZWQpKEszMk9CSiosRFdPUkQpOyAgIC8qIFdhaXQgb24gb2JqZWN0IGlzIHNhdGlzZmllZCAqLworICAgIHZvaWQgICAoKmFkZF93YWl0KShLMzJPQkoqLERXT1JEKTsgICAgLyogQWRkIHRocmVhZCB0byB3YWl0IHF1ZXVlICovCisgICAgdm9pZCAgICgqcmVtb3ZlX3dhaXQpKEszMk9CSiosRFdPUkQpOyAvKiBSZW1vdmUgdGhyZWFkIGZyb20gd2FpdCBxdWV1ZSAqLworICAgIHZvaWQgICAoKmRlc3Ryb3kpKEszMk9CSiAqKTsgICAgICAgICAgLyogRGVzdHJveSBvYmplY3Qgb24gcmVmY291bnQ9PTAgKi8KK30gSzMyT0JKX09QUzsKKworZXh0ZXJuIGNvbnN0IEszMk9CSl9PUFMgKiBjb25zdCBLMzJPQkpfT3BzW0szMk9CSl9OQk9CSkVDVFNdOworCisjZGVmaW5lIEszMk9CSl9PUFMob2JqKSAoSzMyT0JKX09wc1sob2JqKS0+dHlwZV0pCisKK2V4dGVybiB2b2lkIEszMk9CSl9JbmNDb3VudCggSzMyT0JKICpwdHIgKTsKK2V4dGVybiB2b2lkIEszMk9CSl9EZWNDb3VudCggSzMyT0JKICpwdHIgKTsKK2V4dGVybiBCT09MMzIgSzMyT0JKX0lzVmFsaWQoIEszMk9CSiAqcHRyLCBLMzJPQkpfVFlQRSB0eXBlICk7CitleHRlcm4gQk9PTDMyIEszMk9CSl9BZGROYW1lKCBLMzJPQkogKm9iaiwgTFBDU1RSIG5hbWUgKTsKK2V4dGVybiBLMzJPQkogKkszMk9CSl9DcmVhdGUoIEszMk9CSl9UWVBFIHR5cGUsIERXT1JEIHNpemUsIExQQ1NUUiBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFMzIgKmhhbmRsZSApOworZXh0ZXJuIEszMk9CSiAqSzMyT0JKX0ZpbmROYW1lKCBMUENTVFIgbmFtZSApOworZXh0ZXJuIEszMk9CSiAqSzMyT0JKX0ZpbmROYW1lVHlwZSggTFBDU1RSIG5hbWUsIEszMk9CSl9UWVBFIHR5cGUgKTsKKworI2VuZGlmIC8qIF9fV0lORV9LMzJPQkpfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tbXN5c3RlbS5oIGIvaW5jbHVkZS9tbXN5c3RlbS5oCmluZGV4IDY4NDVmMzUuLjQ5M2I3YWMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbW1zeXN0ZW0uaAorKysgYi9pbmNsdWRlL21tc3lzdGVtLmgKQEAgLTg3NSw4ICs4NzUsOCBAQAogICAgIFdDSEFSIHN6UmVnS2V5W01BWFBOQU1FTEVOXTsKICAgICBXQ0hBUiBzek9FTVZ4RFtNQVhfSk9ZU1RJQ0tPRU1WWEROQU1FXTsKIH0gSk9ZQ0FQUzMyVywgKkxQSk9ZQ0FQUzMyVzsKLURFQ0xfV0lORUxJQl9UWVBFX0FXKEpPWUNBUFMpCi1ERUNMX1dJTkVMSUJfVFlQRV9BVyhMUEpPWUNBUFMpCitERUNMX1dJTkVMSUJfVFlQRV9BVyhKT1lDQVBTKTsKK0RFQ0xfV0lORUxJQl9UWVBFX0FXKExQSk9ZQ0FQUyk7CiAKIHR5cGVkZWYgc3RydWN0IHsKICAgICBVSU5UMTYgd1hwb3M7ICAgICAgICAgICAgICAgICAvKiB4IHBvc2l0aW9uICovCkBAIC04OTIsOCArODkyLDggQEAKICAgICBVSU5UMzIgd0J1dHRvbnM7CiB9IEpPWUlORk8zMiwgKkxQSk9ZSU5GTzMyOwogCi1ERUNMX1dJTkVMSUJfVFlQRShKT1lJTkZPKQotREVDTF9XSU5FTElCX1RZUEUoTFBKT1lJTkZPKQorREVDTF9XSU5FTElCX1RZUEUoSk9ZSU5GTyk7CitERUNMX1dJTkVMSUJfVFlQRShMUEpPWUlORk8pOwogCiBNTVJFU1VMVDE2IFdJTkFQSSBqb3lHZXREZXZDYXBzMTYgKFVJTlQxNixMUEpPWUNBUFMxNiAsVUlOVDE2KTsKIE1NUkVTVUxUMzIgV0lOQVBJIGpveUdldERldkNhcHMzMkEoVUlOVDMyLExQSk9ZQ0FQUzMyQSxVSU5UMzIpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9wcm9jZXNzLmggYi9pbmNsdWRlL3Byb2Nlc3MuaAppbmRleCAzY2JkMTRjLi5jYTAwMTRmIDEwMDY0NAotLS0gYS9pbmNsdWRlL3Byb2Nlc3MuaAorKysgYi9pbmNsdWRlL3Byb2Nlc3MuaApAQCAtMTAsNyArMTAsNyBAQAogI2luY2x1ZGUgIndpbmRvd3MuaCIKICNpbmNsdWRlICJ3aW5iYXNlLmgiCiAjaW5jbHVkZSAid2lubnQuaCIKLSNpbmNsdWRlICJoYW5kbGUzMi5oIgorI2luY2x1ZGUgImszMm9iai5oIgogI2luY2x1ZGUgInBlX2ltYWdlLmgiCiAjaW5jbHVkZSAidGFzay5oIgogCkBAIC05OCwxMyArOTgsMjAgQEAKICAgICBMQ0lEICAgICAgICAgICAgIGxvY2FsZTsgICAgICAgICAgIC8qIGM0IExvY2FsZSB0byBiZSBxdWVyaWVkIGJ5IEdldFRocmVhZExvY2FsZSAoTlQpICovCiB9IFBEQjMyOwogCisvKiBQREIgPC0+IFByb2Nlc3MgaWQgY29udmVyc2lvbiBtYWNyb3MgKi8KKyNkZWZpbmUgUFJPQ0VTU19PQkZVU0NBVE9SICAgICAoKERXT1JEKTB4ZGVhZGJlZWYpCisjZGVmaW5lIFBST0NFU1NfSURfVE9fUERCKGlkKSAgKChQREIzMiAqKSgoaWQpIF4gUFJPQ0VTU19PQkZVU0NBVE9SKSkKKyNkZWZpbmUgUERCX1RPX1BST0NFU1NfSUQocGRiKSAoKERXT1JEKShwZGIpIF4gUFJPQ0VTU19PQkZVU0NBVE9SKQorCisvKiBzY2hlZHVsZXIvcHJvY2Vzcy5jICovCiBleHRlcm4gSEFORExFMzIgUFJPQ0VTU19BbGxvY0hhbmRsZSggSzMyT0JKICpwdHIsIERXT1JEIGZsYWdzKTsKIGV4dGVybiBLMzJPQkogKlBST0NFU1NfR2V0T2JqUHRyKCBIQU5ETEUzMiBoYW5kbGUsIEszMk9CSl9UWVBFIHR5cGUgKTsKIGV4dGVybiBCT09MMzIgUFJPQ0VTU19TZXRPYmpQdHIoIEhBTkRMRTMyIGhhbmRsZSwgSzMyT0JKICpwdHIsIERXT1JEIGZsYWdzICk7Ci0KIGV4dGVybiBQREIzMiAqUFJPQ0VTU19DcmVhdGUoIFREQiAqcFRhc2ssIExQQ1NUUiBjbWRfbGluZSApOwotZXh0ZXJuIHZvaWQgUFJPQ0VTU19EZXN0cm95KCBLMzJPQkogKnB0ciApOwotCiBleHRlcm4gUERCMzIgKnBDdXJyZW50UHJvY2VzczsKIAorLyogc2NoZWR1bGVyL2V2ZW50LmMgKi8KK2V4dGVybiB2b2lkIEVWRU5UX1NldCggSzMyT0JKICpvYmogKTsKK2V4dGVybiBLMzJPQkogKkVWRU5UX0NyZWF0ZSggQk9PTDMyIG1hbnVhbF9yZXNldCwgQk9PTDMyIGluaXRpYWxfc3RhdGUgKTsKKwogI2VuZGlmICAvKiBfX1dJTkVfUFJPQ0VTU19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3NobG9iai5oIGIvaW5jbHVkZS9zaGxvYmouaAppbmRleCBkNTFhMTkwLi4zNWIyM2NjIDEwMDY0NAotLS0gYS9pbmNsdWRlL3NobG9iai5oCisrKyBiL2luY2x1ZGUvc2hsb2JqLmgKQEAgLTE5Nyw3ICsxOTcsNyBAQAogdHlwZWRlZiBzdHJ1Y3QgSVNoZWxsTGluayBJU2hlbGxMaW5rLCpMUFNIRUxMTElOSzsKIHR5cGVkZWYgc3RydWN0IElTaGVsbExpbmtfVlRhYmxlCiB7Ci0gICAgLy8gKioqIElVbmtub3duIG1ldGhvZHMgKioqCisgICAgLyogKioqIElVbmtub3duIG1ldGhvZHMgKioqICovCiAgICAgU1RETUVUSE9EKFF1ZXJ5SW50ZXJmYWNlKSAoVEhJU18gUkVGSUlEIHJpaWQsIExQVk9JRCAqIHBwdk9iaikgUFVSRTsKICAgICBTVERNRVRIT0RfKFVMT05HLEFkZFJlZikgKFRISVMpICBQVVJFOwogICAgIFNURE1FVEhPRF8oVUxPTkcsUmVsZWFzZSkgKFRISVMpIFBVUkU7CmRpZmYgLS1naXQgYS9pbmNsdWRlL3N0cnVjdDMyLmggYi9pbmNsdWRlL3N0cnVjdDMyLmgKaW5kZXggNzA4NzViZi4uNzlmMWI1ZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9zdHJ1Y3QzMi5oCisrKyBiL2luY2x1ZGUvc3RydWN0MzIuaApAQCAtMSw3ICsxLDcgQEAKIC8qIFN0cnVjdHVyZSBkZWZpbml0aW9ucyBmb3IgV2luMzIgLS0gdXNlZCBvbmx5IGludGVybmFsbHkgKi8KICNpZm5kZWYgX19XSU5FX19TVFJVQ1QzMl9ICiAjZGVmaW5lIF9fV0lORV9fU1RSVUNUMzJfSAotI2luY2x1ZGUgImhhbmRsZTMyLmgiCisjaW5jbHVkZSAid2luZG93cy5oIgogCiBleHRlcm4gdm9pZCBTVFJVQ1QzMl9NSU5NQVhJTkZPMzJ0bzE2KCBjb25zdCBNSU5NQVhJTkZPMzIqLCBNSU5NQVhJTkZPMTYqICk7CiBleHRlcm4gdm9pZCBTVFJVQ1QzMl9NSU5NQVhJTkZPMTZ0bzMyKCBjb25zdCBNSU5NQVhJTkZPMTYqLCBNSU5NQVhJTkZPMzIqICk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL3N5c2NvbG9yLmggYi9pbmNsdWRlL3N5c2NvbG9yLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4NDU4NTguLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9zeXNjb2xvci5oCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoKLSAqIFN5c3RlbSBjb2xvciBvYmplY3RzCi0gKgotICogQ29weXJpZ2h0ICBBbGV4YW5kcmUgSnVsbGlhcmQsIDE5OTQKLSAqLwotCi0jaWZuZGVmIF9fV0lORV9TWVNDT0xPUl9ICi0jZGVmaW5lIF9fV0lORV9TWVNDT0xPUl9ICi0KLSNpbmNsdWRlICJ3aW5kb3dzLmgiCi0KLXN0cnVjdCBTeXNDb2xvck9iamVjdHMKLXsKLSAgICBIQlJVU0gzMiBoYnJ1c2hTY3JvbGxiYXI7ICAgICAgICAvKiBDT0xPUl9TQ1JPTExCQVIgICAgICAgICAgICovCi0gICAgSEJSVVNIMzIgaGJydXNoQmFja2dyb3VuZDsgICAgICAgLyogQ09MT1JfQkFDS0dST1VORCAgICAgICAgICAqLwotICAgIEhCUlVTSDMyIGhicnVzaEFjdGl2ZUNhcHRpb247ICAgIC8qIENPTE9SX0FDVElWRUNBUFRJT04gICAgICAgKi8KLSAgICBIQlJVU0gzMiBoYnJ1c2hJbmFjdGl2ZUNhcHRpb247ICAvKiBDT0xPUl9JTkFDVElWRUNBUFRJT04gICAgICovCi0gICAgSEJSVVNIMzIgaGJydXNoTWVudTsgICAgICAgICAgICAgLyogQ09MT1JfTUVOVSAgICAgICAgICAgICAgICAqLwotICAgIEhCUlVTSDMyIGhicnVzaFdpbmRvdzsgICAgICAgICAgIC8qIENPTE9SX1dJTkRPVyAgICAgICAgICAgICAgKi8KLSAgICBIQlJVU0gzMiBoYnJ1c2hXaW5kb3dGcmFtZTsgICAgICAvKiBDT0xPUl9XSU5ET1dGUkFNRSAgICAgICAgICovCi0gICAgSEJSVVNIMzIgaGJydXNoTWVudVRleHQ7ICAgICAgICAgLyogQ09MT1JfTUVOVVRFWFQgICAgICAgICAgICAqLwotICAgIEhCUlVTSDMyIGhicnVzaFdpbmRvd1RleHQ7ICAgICAgIC8qIENPTE9SX1dJTkRPV1RFWFQgICAgICAgICAgKi8KLSAgICBIQlJVU0gzMiBoYnJ1c2hDYXB0aW9uVGV4dDsgICAgICAvKiBDT0xPUl9DQVBUSU9OVEVYVCAgICAgICAgICovCi0gICAgSEJSVVNIMzIgaGJydXNoQWN0aXZlQm9yZGVyOyAgICAgLyogQ09MT1JfQUNUSVZFQk9SREVSICAgICAgICAqLwotICAgIEhCUlVTSDMyIGhicnVzaEluYWN0aXZlQm9yZGVyOyAgIC8qIENPTE9SX0lOQUNUSVZFQk9SREVSICAgICAgKi8KLSAgICBIQlJVU0gzMiBoYnJ1c2hBcHBXb3Jrc3BhY2U7ICAgICAvKiBDT0xPUl9BUFBXT1JLU1BBQ0UgICAgICAgICovCi0gICAgSEJSVVNIMzIgaGJydXNoSGlnaGxpZ2h0OyAgICAgICAgLyogQ09MT1JfSElHSExJR0hUICAgICAgICAgICAqLwotICAgIEhCUlVTSDMyIGhicnVzaEhpZ2hsaWdodFRleHQ7ICAgIC8qIENPTE9SX0hJR0hMSUdIVFRFWFQgICAgICAgKi8KLSAgICBIQlJVU0gzMiBoYnJ1c2hCdG5GYWNlOyAgICAgICAgICAvKiBDT0xPUl9CVE5GQUNFICAgICAgICAgICAgICovCi0gICAgSEJSVVNIMzIgaGJydXNoQnRuU2hhZG93OyAgICAgICAgLyogQ09MT1JfQlROU0hBRE9XICAgICAgICAgICAqLwotICAgIEhCUlVTSDMyIGhicnVzaEdyYXlUZXh0OyAgICAgICAgIC8qIENPTE9SX0dSQVlURVhUICAgICAgICAgICAgKi8KLSAgICBIQlJVU0gzMiBoYnJ1c2hCdG5UZXh0OyAgICAgICAgICAvKiBDT0xPUl9CVE5URVhUICAgICAgICAgICAgICovCi0gICAgSEJSVVNIMzIgaGJydXNoSW5hY3RpdmVDYXB0aW9uVGV4dDsgLyogQ09MT1JfSU5BQ1RJVkVDQVBUSU9OVEVYVCAqLwotICAgIEhCUlVTSDMyIGhicnVzaEJ0bkhpZ2hsaWdodDsgICAgIC8qIENPTE9SX0JUTkhJR0hMSUdIVCAgICAgICAgKi8KLSAgICBIQlJVU0gzMiBoYnJ1c2gzRERrU2hhZG93OyAgICAgICAvKiBDT0xPUl8zRERLU0hBRE9XICAgICAgICAgICovCi0gICAgSEJSVVNIMzIgaGJydXNoM0RMaWdodDsgICAgICAgICAgLyogQ09MT1JfM0RMSUdIVCAgICAgICAgICAgICAqLwotICAgIEhCUlVTSDMyIGhicnVzaEluZm9UZXh0OyAgICAgICAgIC8qIENPTE9SX0lORk9URVhUICAgICAgICAgICAgKi8KLSAgICBIQlJVU0gzMiBoYnJ1c2hJbmZvQms7ICAgICAgICAgICAvKiBDT0xPUl9JTkZPQksgICAgICAgICAgICAgICovCi0KLSAgICBIUEVOMzIgICBocGVuV2luZG93RnJhbWU7ICAgICAgICAvKiBDT0xPUl9XSU5ET1dGUkFNRSAgICAgICAgICovCi0gICAgSFBFTjMyICAgaHBlbldpbmRvd1RleHQ7ICAgICAgICAgLyogQ09MT1JfV0lORE9XVEVYVCAgICAgICAgICAqLwotfTsKLQotZXh0ZXJuIHZvaWQgU1lTQ09MT1JfSW5pdCh2b2lkKTsKLWV4dGVybiBzdHJ1Y3QgU3lzQ29sb3JPYmplY3RzIHN5c0NvbG9yT2JqZWN0czsKLQotI2VuZGlmICAvKiBfX1dJTkVfU1lTQ09MT1JfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zeXNtZXRyaWNzLmggYi9pbmNsdWRlL3N5c21ldHJpY3MuaAppbmRleCBiMmY3ZTM1Li5hMzk4MjM1IDEwMDY0NAotLS0gYS9pbmNsdWRlL3N5c21ldHJpY3MuaAorKysgYi9pbmNsdWRlL3N5c21ldHJpY3MuaApAQCAtMTI5LDcgKzEyOSw5IEBACiAjZGVmaW5lIFNZU01FVFJJQ1NfTUlERUFTVEVOQUJMRUQgICAgICAgc3lzTWV0cmljc1tTTV9NSURFQVNURU5BQkxFRF0gICAgICAgLyogNzQgKi8KICNkZWZpbmUgU1lTTUVUUklDU19NT1VTRVdIRUVMUFJFU0VOVCAgICBzeXNNZXRyaWNzW1NNX01PVVNFV0hFRUxQUkVTRU5UXSAgICAvKiA3NSAqLwogCi1leHRlcm4gdm9pZCBTWVNNRVRSSUNTX0luaXQodm9pZCk7CitleHRlcm4gdm9pZCBTWVNNRVRSSUNTX0luaXQodm9pZCk7ICAvKiBzeXNtZXRyaWNzLmMgKi8KIGV4dGVybiBzaG9ydCBzeXNNZXRyaWNzW1NNX0NNRVRSSUNTKzFdOwogCitleHRlcm4gdm9pZCBTWVNDT0xPUl9Jbml0KHZvaWQpOyAgLyogc3lzY29sb3IuYyAqLworCiAjZW5kaWYgIC8qIF9fV0lORV9TWVNNRVRSSUNTX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvdGhyZWFkLmggYi9pbmNsdWRlL3RocmVhZC5oCmluZGV4IDM0NzAxOWUuLjRlOWI2MWYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvdGhyZWFkLmgKKysrIGIvaW5jbHVkZS90aHJlYWQuaApAQCAtNyw4ICs3LDEwIEBACiAjaWZuZGVmIF9fV0lORV9USFJFQURfSAogI2RlZmluZSBfX1dJTkVfVEhSRUFEX0gKIAotI2luY2x1ZGUgInByb2Nlc3MuaCIKKyNpbmNsdWRlICJrMzJvYmouaCIKKyNpbmNsdWRlICJ3aW5kb3dzLmgiCiAjaW5jbHVkZSAid2lubnQuaCIKKyNpbmNsdWRlICJzZWxlY3RvcnMuaCIgIC8qIGZvciBTRVRfRlMgKi8KIAogLyogVGhyZWFkIGV4Y2VwdGlvbiBibG9jayAqLwogdHlwZWRlZiBzdHJ1Y3QgX1RFQgpAQCAtMzAsNTggKzMyLDEwMCBAQAogICAgIExQVk9JRCAgICAgICp0bHNfcHRyOyAgICAgICAgLyogMmMgUG9pbnRlciB0byBUTFMgYXJyYXkgKi8KIH0gVEVCOwogCisvKiBFdmVudCB3YWl0aW5nIHN0cnVjdHVyZSAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBEV09SRCAgICAgICAgIGNvdW50OyAgICAgLyogQ291bnQgb2YgdmFsaWQgb2JqZWN0cyAqLworICAgIERXT1JEICAgICAgICAgc2lnbmFsZWQ7ICAvKiBJbmRleCBvZiBzaWduYWxlZCBvYmplY3QgKG9yIFdBSVRfRkFJTEVEKSovCisgICAgQk9PTDMyICAgICAgICB3YWl0X2FsbDsgIC8qIFdhaXQgZm9yIGFsbCBvYmplY3RzIGZsYWcgKi8KKyAgICBLMzJPQkogICAgICAgKm9ianNbTUFYSU1VTV9XQUlUX09CSkVDVFNdOyAgLyogT2JqZWN0IHBvaW50ZXJzICovCit9IFdBSVRfU1RSVUNUOworCitzdHJ1Y3QgX1BEQjMyOworCiAvKiBUaHJlYWQgZGF0YWJhc2UgKi8KIHR5cGVkZWYgc3RydWN0IF9USERCCiB7Ci0gICAgSzMyT0JKICAgICAgIGhlYWRlcjsgICAgICAgICAvKiAgMDAgS2VybmVsIG9iamVjdCBoZWFkZXIgKi8KLSAgICBQREIzMiAgICAgICAqcHJvY2VzczsgICAgICAgIC8qICAwOCBQcm9jZXNzIG93bmluZyB0aGlzIHRocmVhZCAqLwotICAgIEszMk9CSiAgICAgICpldmVudDsgICAgICAgICAgLyogIDBjIFRocmVhZCBldmVudCAqLwotICAgIFRFQiAgICAgICAgICB0ZWI7ICAgICAgICAgICAgLyogIDEwIFRocmVhZCBleGNlcHRpb24gYmxvY2sgKi8KLSAgICBQREIzMiAgICAgICAqcHJvY2VzczI7ICAgICAgIC8qICA0MCBTYW1lIGFzIG9mZnNldCAwOCAoPykgKi8KLSAgICBEV09SRCAgICAgICAgZmxhZ3M7ICAgICAgICAgIC8qICA0NCBGbGFncyAqLwotICAgIERXT1JEICAgICAgICBleGl0X2NvZGU7ICAgICAgLyogIDQ4IFRlcm1pbmF0aW9uIHN0YXR1cyAqLwotICAgIFdPUkQgICAgICAgICB0ZWJfc2VsOyAgICAgICAgLyogIDRjIFNlbGVjdG9yIHRvIFRFQiAqLwotICAgIFdPUkQgICAgICAgICBlbXVfc2VsOyAgICAgICAgLyogIDRlIDgwMzg3IGVtdWxhdG9yIHNlbGVjdG9yICovCi0gICAgRFdPUkQgICAgICAgIHVua25vd24xOyAgICAgICAvKiAgNTAgVW5rbm93biAqLwotICAgIHZvaWQgICAgICAgICp3YWl0X2xpc3Q7ICAgICAgLyogIDU0IEV2ZW50IHdhaXRpbmcgbGlzdCAqLwotICAgIERXT1JEICAgICAgICB1bmtub3duMjsgICAgICAgLyogIDU4IFVua25vd24gKi8KLSAgICB2b2lkICAgICAgICAqcmluZzBfdGhyZWFkOyAgIC8qICA1YyBQb2ludGVyIHRvIHJpbmcgMCB0aHJlYWQgKi8KLSAgICB2b2lkICAgICAgICAqcHRkYng7ICAgICAgICAgIC8qICA2MCBQb2ludGVyIHRvIFREQlggc3RydWN0dXJlICovCi0gICAgdm9pZCAgICAgICAgKnN0YWNrX2Jhc2U7ICAgICAvKiAgNjQgQmFzZSBvZiB0aGUgc3RhY2sgKi8KLSAgICB2b2lkICAgICAgICAqZXhpdF9zdGFjazsgICAgIC8qICA2OCBTdGFjayBwb2ludGVyIG9uIHRocmVhZCBleGl0ICovCi0gICAgdm9pZCAgICAgICAgKmVtdV9kYXRhOyAgICAgICAvKiAgNmMgUmVsYXRlZCB0byA4MDM4NyBlbXVsYXRpb24gKi8KLSAgICBEV09SRCAgICAgICAgbGFzdF9lcnJvcjsgICAgIC8qICA3MCBMYXN0IGVycm9yIGNvZGUgKi8KLSAgICB2b2lkICAgICAgICAqZGVidWdnZXJfQ0I7ICAgIC8qICA3NCBEZWJ1Z2dlciBjb250ZXh0IGJsb2NrICovCi0gICAgRFdPUkQgICAgICAgIGRlYnVnX3RocmVhZDsgICAvKiAgNzggVGhyZWFkIGRlYnVnZ2luZyB0aGlzIG9uZSAoPykgKi8KLSAgICB2b2lkICAgICAgICAqcGNvbnRleHQ7ICAgICAgIC8qICA3YyBUaHJlYWQgcmVnaXN0ZXIgY29udGV4dCAqLwotICAgIERXT1JEICAgICAgICB1bmtub3duM1szXTsgICAgLyogIDgwIFVua25vd24gKi8KLSAgICBXT1JEICAgICAgICAgY3VycmVudF9zczsgICAgIC8qICA4YyBBbm90aGVyIDE2LWJpdCBzdGFjayBzZWxlY3RvciAqLwotICAgIFdPUkQgICAgICAgICBwYWQyOyAgICAgICAgICAgLyogIDhlICovCi0gICAgdm9pZCAgICAgICAgKnNzX3RhYmxlOyAgICAgICAvKiAgOTAgUG9pbnRlciB0byBpbmZvIGFib3V0IDE2LWJpdCBzdGFjayAqLwotICAgIFdPUkQgICAgICAgICB0aHVua19zczsgICAgICAgLyogIDk0IFlldCBhbm90aGVyIDE2LWJpdCBzdGFjayBzZWxlY3RvciAqLwotICAgIFdPUkQgICAgICAgICBwYWQzOyAgICAgICAgICAgLyogIDk2ICovCi0gICAgTFBWT0lEICAgICAgIHRsc19hcnJheVs2NF07ICAvKiAgOTggVGhyZWFkIGxvY2FsIHN0b3JhZ2UgKi8KLSAgICBEV09SRCAgICAgICAgZGVsdGFfcHJpb3JpdHk7IC8qIDE5OCBQcmlvcml0eSBkZWx0YSAqLwotICAgIERXT1JEICAgICAgICB1bmtub3duNFs3XTsgICAgLyogMTljIFVua25vd24gKi8KLSAgICB2b2lkICAgICAgICAqY3JlYXRlX2RhdGE7ICAgIC8qIDFiOCBQb2ludGVyIHRvIGNyZWF0aW9uIHN0cnVjdHVyZSAqLwotICAgIERXT1JEICAgICAgICBzdXNwZW5kX2NvdW50OyAgLyogMWJjIFN1c3BlbmRUaHJlYWQoKSBjb3VudGVyICovCi0gICAgRFdPUkQgICAgICAgIHVua25vd241WzldOyAgICAvKiAxYzAgVW5rbm93biAqLwotICAgIEszMk9CSiAgICAgICpjcml0X3NlY3Rpb247ICAgLyogMWU0IFNvbWUgY3JpdGljYWwgc2VjdGlvbiAqLwotICAgIEszMk9CSiAgICAgICp3aW4xNl9tdXRleDsgICAgLyogMWU4IFBvaW50ZXIgdG8gV2luMTYgbXV0ZXggKi8KLSAgICBLMzJPQkogICAgICAqd2luMzJfbXV0ZXg7ICAgIC8qIDFlYyBQb2ludGVyIHRvIEtFUk5FTDMyIG11dGV4ICovCi0gICAgSzMyT0JKICAgICAgKmNyaXRfc2VjdGlvbjI7ICAvKiAxZjAgQW5vdGhlciBjcml0aWNhbCBzZWN0aW9uICovCi0gICAgRFdPUkQgICAgICAgIHVua25vd242WzNdOyAgICAvKiAxZjQgVW5rbm93biAqLworICAgIEszMk9CSiAgICAgICAgIGhlYWRlcjsgICAgICAgICAvKiAgMDAgS2VybmVsIG9iamVjdCBoZWFkZXIgKi8KKyAgICBzdHJ1Y3QgX1BEQjMyICpwcm9jZXNzOyAgICAgICAgLyogIDA4IFByb2Nlc3Mgb3duaW5nIHRoaXMgdGhyZWFkICovCisgICAgSzMyT0JKICAgICAgICAqZXZlbnQ7ICAgICAgICAgIC8qICAwYyBUaHJlYWQgZXZlbnQgKi8KKyAgICBURUIgICAgICAgICAgICB0ZWI7ICAgICAgICAgICAgLyogIDEwIFRocmVhZCBleGNlcHRpb24gYmxvY2sgKi8KKyAgICBzdHJ1Y3QgX1BEQjMyICpwcm9jZXNzMjsgICAgICAgLyogIDQwIFNhbWUgYXMgb2Zmc2V0IDA4ICg/KSAqLworICAgIERXT1JEICAgICAgICAgIGZsYWdzOyAgICAgICAgICAvKiAgNDQgRmxhZ3MgKi8KKyAgICBEV09SRCAgICAgICAgICBleGl0X2NvZGU7ICAgICAgLyogIDQ4IFRlcm1pbmF0aW9uIHN0YXR1cyAqLworICAgIFdPUkQgICAgICAgICAgIHRlYl9zZWw7ICAgICAgICAvKiAgNGMgU2VsZWN0b3IgdG8gVEVCICovCisgICAgV09SRCAgICAgICAgICAgZW11X3NlbDsgICAgICAgIC8qICA0ZSA4MDM4NyBlbXVsYXRvciBzZWxlY3RvciAqLworICAgIERXT1JEICAgICAgICAgIHVua25vd24xOyAgICAgICAvKiAgNTAgVW5rbm93biAqLworICAgIFdBSVRfU1RSVUNUICAgKndhaXRfbGlzdDsgICAgICAvKiAgNTQgRXZlbnQgd2FpdGluZyBsaXN0ICovCisgICAgRFdPUkQgICAgICAgICAgdW5rbm93bjI7ICAgICAgIC8qICA1OCBVbmtub3duICovCisgICAgdm9pZCAgICAgICAgICAqcmluZzBfdGhyZWFkOyAgIC8qICA1YyBQb2ludGVyIHRvIHJpbmcgMCB0aHJlYWQgKi8KKyAgICB2b2lkICAgICAgICAgICpwdGRieDsgICAgICAgICAgLyogIDYwIFBvaW50ZXIgdG8gVERCWCBzdHJ1Y3R1cmUgKi8KKyAgICB2b2lkICAgICAgICAgICpzdGFja19iYXNlOyAgICAgLyogIDY0IEJhc2Ugb2YgdGhlIHN0YWNrICovCisgICAgdm9pZCAgICAgICAgICAqZXhpdF9zdGFjazsgICAgIC8qICA2OCBTdGFjayBwb2ludGVyIG9uIHRocmVhZCBleGl0ICovCisgICAgdm9pZCAgICAgICAgICAqZW11X2RhdGE7ICAgICAgIC8qICA2YyBSZWxhdGVkIHRvIDgwMzg3IGVtdWxhdGlvbiAqLworICAgIERXT1JEICAgICAgICAgIGxhc3RfZXJyb3I7ICAgICAvKiAgNzAgTGFzdCBlcnJvciBjb2RlICovCisgICAgdm9pZCAgICAgICAgICAqZGVidWdnZXJfQ0I7ICAgIC8qICA3NCBEZWJ1Z2dlciBjb250ZXh0IGJsb2NrICovCisgICAgRFdPUkQgICAgICAgICAgZGVidWdfdGhyZWFkOyAgIC8qICA3OCBUaHJlYWQgZGVidWdnaW5nIHRoaXMgb25lICg/KSAqLworICAgIHZvaWQgICAgICAgICAgKnBjb250ZXh0OyAgICAgICAvKiAgN2MgVGhyZWFkIHJlZ2lzdGVyIGNvbnRleHQgKi8KKyAgICBEV09SRCAgICAgICAgICB1bmtub3duM1szXTsgICAgLyogIDgwIFVua25vd24gKi8KKyAgICBXT1JEICAgICAgICAgICBjdXJyZW50X3NzOyAgICAgLyogIDhjIEFub3RoZXIgMTYtYml0IHN0YWNrIHNlbGVjdG9yICovCisgICAgV09SRCAgICAgICAgICAgcGFkMjsgICAgICAgICAgIC8qICA4ZSAqLworICAgIHZvaWQgICAgICAgICAgKnNzX3RhYmxlOyAgICAgICAvKiAgOTAgUG9pbnRlciB0byBpbmZvIGFib3V0IDE2LWJpdCBzdGFjayAqLworICAgIFdPUkQgICAgICAgICAgIHRodW5rX3NzOyAgICAgICAvKiAgOTQgWWV0IGFub3RoZXIgMTYtYml0IHN0YWNrIHNlbGVjdG9yICovCisgICAgV09SRCAgICAgICAgICAgcGFkMzsgICAgICAgICAgIC8qICA5NiAqLworICAgIExQVk9JRCAgICAgICAgIHRsc19hcnJheVs2NF07ICAvKiAgOTggVGhyZWFkIGxvY2FsIHN0b3JhZ2UgKi8KKyAgICBEV09SRCAgICAgICAgICBkZWx0YV9wcmlvcml0eTsgLyogMTk4IFByaW9yaXR5IGRlbHRhICovCisgICAgRFdPUkQgICAgICAgICAgdW5rbm93bjRbN107ICAgIC8qIDE5YyBVbmtub3duICovCisgICAgdm9pZCAgICAgICAgICAqY3JlYXRlX2RhdGE7ICAgIC8qIDFiOCBQb2ludGVyIHRvIGNyZWF0aW9uIHN0cnVjdHVyZSAqLworICAgIERXT1JEICAgICAgICAgIHN1c3BlbmRfY291bnQ7ICAvKiAxYmMgU3VzcGVuZFRocmVhZCgpIGNvdW50ZXIgKi8KKyAgICB2b2lkICAgICAgICAgICplbnRyeV9wb2ludDsgICAgLyogMWMwIFRocmVhZCBlbnRyeSBwb2ludCAod2FzOiB1bmtub3duKSAqLworICAgIHZvaWQgICAgICAgICAgKmVudHJ5X2FyZzsgICAgICAvKiAxYzQgRW50cnkgcG9pbnQgYXJnICh3YXM6IHVua25vd24pICovCisgICAgaW50ICAgICAgICAgICAgdW5peF9waWQ7ICAgICAgIC8qIDFjOCBVbml4IHRocmVhZCBwaWQgKHdhczogdW5rbm93bikgKi8KKyAgICBEV09SRCAgICAgICAgICB1bmtub3duNVs2XTsgICAgLyogMWNjIFVua25vd24gKi8KKyAgICBLMzJPQkogICAgICAgICpjcml0X3NlY3Rpb247ICAgLyogMWU0IFNvbWUgY3JpdGljYWwgc2VjdGlvbiAqLworICAgIEszMk9CSiAgICAgICAgKndpbjE2X211dGV4OyAgICAvKiAxZTggUG9pbnRlciB0byBXaW4xNiBtdXRleCAqLworICAgIEszMk9CSiAgICAgICAgKndpbjMyX211dGV4OyAgICAvKiAxZWMgUG9pbnRlciB0byBLRVJORUwzMiBtdXRleCAqLworICAgIEszMk9CSiAgICAgICAgKmNyaXRfc2VjdGlvbjI7ICAvKiAxZjAgQW5vdGhlciBjcml0aWNhbCBzZWN0aW9uICovCisgICAgRFdPUkQgICAgICAgICAgdW5rbm93bjZbM107ICAgIC8qIDFmNCBVbmtub3duICovCiAgICAgLyogVGhlIGZvbGxvd2luZyBhcmUgV2luZS1zcGVjaWZpYyBmaWVsZHMgKi8KLSAgICBDT05URVhUICAgICAgY29udGV4dDsgICAgICAgIC8qIDIwMCBUaHJlYWQgY29udGV4dCAqLworICAgIENPTlRFWFQgICAgICAgIGNvbnRleHQ7ICAgICAgICAvKiAyMDAgVGhyZWFkIGNvbnRleHQgKi8KKyAgICBXQUlUX1NUUlVDVCAgICB3YWl0X3N0cnVjdDsgICAgLyogICAgIEV2ZW50IHdhaXQgc3RydWN0dXJlICovCiB9IFRIREI7CiAKKy8qIFRocmVhZCBxdWV1ZSBlbnRyeSAqLwordHlwZWRlZiBzdHJ1Y3QgX1RIUkVBRF9FTlRSWQoreworICAgIFRIREIgICAgICAgICAgICAgICAgICp0aHJlYWQ7CisgICAgc3RydWN0IF9USFJFQURfRU5UUlkgKm5leHQ7Cit9IFRIUkVBRF9FTlRSWTsKIAotZXh0ZXJuIFRIREIgKlRIUkVBRF9DcmVhdGUoIFBEQjMyICpwZGIsIERXT1JEIHN0YWNrX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBUSFJFQURfU1RBUlRfUk9VVElORSBzdGFydF9hZGRyICk7Ci1leHRlcm4gdm9pZCBUSFJFQURfRGVzdHJveSggSzMyT0JKICpwdHIgKTsKLWV4dGVybiBUSERCICpUSFJFQURfQ3VycmVudCh2b2lkKTsKLWV4dGVybiBUSERCICpUSFJFQURfU3dpdGNoVGhyZWFkKCBDT05URVhUICpjb250ZXh0ICk7CisvKiBBIHRocmVhZCBxdWV1ZSBpcyBhIGNpcmN1bGFyIGxpc3Q7IGEgVEhSRUFEX1FVRVVFIGlzIGEgcG9pbnRlciAqLworLyogdG8gdGhlIGVuZCBvZiB0aGUgcXVldWUgKGkuZS4gd2hlcmUgd2UgYWRkIGVsZW1lbnRzKSAqLwordHlwZWRlZiBUSFJFQURfRU5UUlkgKlRIUkVBRF9RVUVVRTsKIAorLyogVEhEQiA8LT4gVGhyZWFkIGlkIGNvbnZlcnNpb24gbWFjcm9zICovCisjZGVmaW5lIFRIUkVBRF9PQkZVU0NBVE9SICAgICAgICgoRFdPUkQpMHhkZWFkYmVlZikKKyNkZWZpbmUgVEhSRUFEX0lEX1RPX1RIREIoaWQpICAgKChUSERCICopKChpZCkgXiBUSFJFQURfT0JGVVNDQVRPUikpCisjZGVmaW5lIFRIREJfVE9fVEhSRUFEX0lEKHRoZGIpICgoRFdPUkQpKHRoZGIpIF4gVEhSRUFEX09CRlVTQ0FUT1IpCisKKyNpZmRlZiBfX2kzODZfXworLyogT24gdGhlIGkzODYsIHRoZSBjdXJyZW50IHRocmVhZCBpcyBpbiB0aGUgJWZzIHJlZ2lzdGVyICovCisjIGRlZmluZSBTRVRfQ1VSX1RIUkVBRCh0aGRiKSBTRVRfRlMoKHRoZGIpLT50ZWJfc2VsKQorI2Vsc2UKIGV4dGVybiBUSERCICpwQ3VycmVudFRocmVhZDsKKyMgZGVmaW5lIFNFVF9DVVJfVEhSRUFEKHRoZGIpIChwQ3VycmVudFRocmVhZCA9ICh0aGRiKSkKKyNlbmRpZiAgLyogX19pMzg2X18gKi8KKworCisvKiBzY2hlZHVsZXIvdGhyZWFkLmMgKi8KK2V4dGVybiBUSERCICpUSFJFQURfQ3JlYXRlKCBzdHJ1Y3QgX1BEQjMyICpwZGIsIERXT1JEIHN0YWNrX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBUSFJFQURfU1RBUlRfUk9VVElORSBzdGFydF9hZGRyLCBMUFZPSUQgcGFyYW0gKTsKK2V4dGVybiBUSERCICpUSFJFQURfQ3VycmVudCh2b2lkKTsKK2V4dGVybiB2b2lkIFRIUkVBRF9BZGRRdWV1ZSggVEhSRUFEX1FVRVVFICpxdWV1ZSwgVEhEQiAqdGhyZWFkICk7CitleHRlcm4gdm9pZCBUSFJFQURfUmVtb3ZlUXVldWUoIFRIUkVBRF9RVUVVRSAqcXVldWUsIFRIREIgKnRocmVhZCApOworCisvKiBzY2hlZHVsZXIvc3luY2hyby5jICovCitleHRlcm4gdm9pZCBTWU5DX1dhaXRGb3JDb25kaXRpb24oIFdBSVRfU1RSVUNUICp3YWl0LCBEV09SRCB0aW1lb3V0ICk7CitleHRlcm4gdm9pZCBTWU5DX1dha2VVcCggVEhSRUFEX1FVRVVFICpxdWV1ZSwgRFdPUkQgbWF4ICk7CiAKICNlbmRpZiAgLyogX19XSU5FX1RIUkVBRF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3ZlcnNpb24uaCBiL2luY2x1ZGUvdmVyc2lvbi5oCmluZGV4IGQzNDEzZTIuLmJiNjRlZTYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvdmVyc2lvbi5oCisrKyBiL2luY2x1ZGUvdmVyc2lvbi5oCkBAIC0xICsxIEBACi0jZGVmaW5lIFdJTkVfUkVMRUFTRV9JTkZPICJXaW5lIHJlbGVhc2UgOTcxMjIxIgorI2RlZmluZSBXSU5FX1JFTEVBU0VfSU5GTyAiV2luZSByZWxlYXNlIDk4MDEwNCIKZGlmZiAtLWdpdCBhL2luY2x1ZGUvd2luZG93cy5oIGIvaW5jbHVkZS93aW5kb3dzLmgKaW5kZXggODZjYjViOC4uZDlmZTQ3ZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS93aW5kb3dzLmgKKysrIGIvaW5jbHVkZS93aW5kb3dzLmgKQEAgLTU0NjMsNyArNTQ2Myw4IEBACiAgICAgRFdPUkQJZHdMYW5ndWFnZUlkOwogfSBNU0dCT1hQQVJBTVMzMlcsKkxQTVNHQk9YUEFSQU1TMzJXOwogCi1ERUNMX1dJTkVMSUJfVFlQRV9BVyhNU0dCT1hQQVJBTVMpCitERUNMX1dJTkVMSUJfVFlQRV9BVyhNU0dCT1hQQVJBTVMpOworREVDTF9XSU5FTElCX1RZUEVfQVcoTFBNU0dCT1hQQVJBTVMpOwogCiAjcHJhZ21hIHBhY2soNCkKIApAQCAtNTY4Miw3ICs1NjgzLDggQEAKIEJPT0wzMiAgICAgIFdJTkFQSSBFbnVtU3lzdGVtTG9jYWxlczMyVyhMT0NBTEVfRU5VTVBST0MzMlcsRFdPUkQpOwogI2RlZmluZSAgICAgRW51bVN5c3RlbUxvY2FsZXMgV0lORUxJQl9OQU1FX0FXKEVudW1TeXN0ZW1Mb2NhbGVzKQogQk9PTDMyICAgICAgV0lOQVBJIEVudW1UaHJlYWRXaW5kb3dzKERXT1JELFdOREVOVU1QUk9DMzIsTFBBUkFNKTsKLXZvaWQgICAgICAgIFdJTkFQSSBFeGl0UHJvY2VzcyhEV09SRCk7CitWT0lEICAgICAgICBXSU5BUEkgRXhpdFByb2Nlc3MoRFdPUkQpOworVk9JRCAgICAgICAgV0lOQVBJIEV4aXRUaHJlYWQoRFdPUkQpOwogQk9PTDMyICAgICAgV0lOQVBJIEV4aXRXaW5kb3dzRXgoVUlOVDMyLERXT1JEKTsKIERXT1JEICAgICAgIFdJTkFQSSBFeHBhbmRFbnZpcm9ubWVudFN0cmluZ3MzMkEoTFBDU1RSLExQU1RSLERXT1JEKTsKIERXT1JEICAgICAgIFdJTkFQSSBFeHBhbmRFbnZpcm9ubWVudFN0cmluZ3MzMlcoTFBDV1NUUixMUFdTVFIsRFdPUkQpOwpAQCAtNTc4Myw2ICs1Nzg1LDkgQEAKIERXT1JEICAgICAgIFdJTkFQSSBIZWFwU2l6ZShIQU5ETEUzMixEV09SRCxMUFZPSUQpOwogQk9PTDMyICAgICAgV0lOQVBJIEhlYXBVbmxvY2soSEFORExFMzIpOwogQk9PTDMyICAgICAgV0lOQVBJIEhlYXBWYWxpZGF0ZShIQU5ETEUzMixEV09SRCxMUENWT0lEKTsKK0xPTkcgICAgICAgIFdJTkFQSSBJbnRlcmxvY2tlZERlY3JlbWVudChMUExPTkcpOworTE9ORyAgICAgICAgV0lOQVBJIEludGVybG9ja2VkRXhjaGFuZ2UoTFBMT05HLExPTkcpOworTE9ORyAgICAgICAgV0lOQVBJIEludGVybG9ja2VkSW5jcmVtZW50KExQTE9ORyk7CiBCT09MMzIgICAgICBXSU5BUEkgSXNEQkNTTGVhZEJ5dGVFeChVSU5UMzIsQllURSk7CiBCT09MMzIgICAgICBXSU5BUEkgSXNQcm9jZXNzb3JGZWF0dXJlUHJlc2VudChEV09SRCk7CiBCT09MMzIgICAgICBXSU5BUEkgSXNXaW5kb3dVbmljb2RlKEhXTkQzMik7CkBAIC01ODAyLDYgKzU4MDcsNyBAQAogQk9PTDMyICAgICAgV0lOQVBJIE1vdmVGaWxlRXgzMkEoTFBDU1RSLExQQ1NUUixEV09SRCk7CiBCT09MMzIgICAgICBXSU5BUEkgTW92ZUZpbGVFeDMyVyhMUENXU1RSLExQQ1dTVFIsRFdPUkQpOwogI2RlZmluZSAgICAgTW92ZUZpbGVFeCBXSU5FTElCX05BTUVfQVcoTW92ZUZpbGVFeCkKK0RXT1JEICAgICAgIFdJTkFQSSBNc2dXYWl0Rm9yTXVsdGlwbGVPYmplY3RzKERXT1JELEhBTkRMRTMyKixCT09MMzIsRFdPUkQsRFdPUkQpOwogSEFORExFMzIgICAgV0lOQVBJIE9wZW5FdmVudDMyQShEV09SRCxCT09MMzIsTFBDU1RSKTsKIEhBTkRMRTMyICAgIFdJTkFQSSBPcGVuRXZlbnQzMlcoRFdPUkQsQk9PTDMyLExQQ1dTVFIpOwogI2RlZmluZSAgICAgT3BlbkV2ZW50IFdJTkVMSUJfTkFNRV9BVyhPcGVuRXZlbnQpCkBAIC01ODExLDkgKzU4MTcsMTEgQEAKIEhBTkRMRTMyICAgIFdJTkFQSSBPcGVuTXV0ZXgzMkEoRFdPUkQsQk9PTDMyLExQQ1NUUik7CiBIQU5ETEUzMiAgICBXSU5BUEkgT3Blbk11dGV4MzJXKERXT1JELEJPT0wzMixMUENXU1RSKTsKICNkZWZpbmUgICAgIE9wZW5NdXRleCBXSU5FTElCX05BTUVfQVcoT3Blbk11dGV4KQorSEFORExFMzIgICAgV0lOQVBJIE9wZW5Qcm9jZXNzKERXT1JELEJPT0wzMixEV09SRCk7CiBIQU5ETEUzMiAgICBXSU5BUEkgT3BlblNlbWFwaG9yZTMyQShEV09SRCxCT09MMzIsTFBDU1RSKTsKIEhBTkRMRTMyICAgIFdJTkFQSSBPcGVuU2VtYXBob3JlMzJXKERXT1JELEJPT0wzMixMUENXU1RSKTsKICNkZWZpbmUgICAgIE9wZW5TZW1hcGhvcmUgV0lORUxJQl9OQU1FX0FXKE9wZW5TZW1hcGhvcmUpCitCT09MMzIgICAgICBXSU5BUEkgUHVsc2VFdmVudChIQU5ETEUzMik7CiBEV09SRCAgICAgICBXSU5BUEkgUXVlcnlEb3NEZXZpY2UzMkEoTFBDU1RSLExQU1RSLERXT1JEKTsKIERXT1JEICAgICAgIFdJTkFQSSBRdWVyeURvc0RldmljZTMyVyhMUENXU1RSLExQV1NUUixEV09SRCk7CiAjZGVmaW5lICAgICBRdWVyeURvc0RldmljZSBXSU5FTElCX05BTUVfQVcoUXVlcnlEb3NEZXZpY2UpCkBAIC01ODQzLDYgKzU4NTEsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUERXT1JELExQRklMRVRJTUUpOwogI2RlZmluZSAgICAgUmVnUXVlcnlJbmZvS2V5IFdJTkVMSUJfTkFNRV9BVyhSZWdRdWVyeUluZm9LZXkpCiBCT09MMzIgICAgICBXSU5BUEkgUmVsZWFzZVNlbWFwaG9yZShIQU5ETEUzMixMT05HLExQTE9ORyk7CitCT09MMzIgICAgICBXSU5BUEkgUmVzZXRFdmVudChIQU5ETEUzMik7CiBWT0lEICAgICAgICBXSU5BUEkgUnRsRmlsbE1lbW9yeShMUFZPSUQsVUlOVDMyLFVJTlQzMik7CiBWT0lEICAgICAgICBXSU5BUEkgUnRsTW92ZU1lbW9yeShMUFZPSUQsTFBDVk9JRCxVSU5UMzIpOwogVk9JRCAgICAgICAgV0lOQVBJIFJ0bFplcm9NZW1vcnkoTFBWT0lELFVJTlQzMik7CkBAIC01ODYwLDYgKzU4NjksNyBAQAogQk9PTDMyICAgICAgV0lOQVBJIFNldEVudmlyb25tZW50VmFyaWFibGUzMkEoTFBDU1RSLExQQ1NUUik7CiBCT09MMzIgICAgICBXSU5BUEkgU2V0RW52aXJvbm1lbnRWYXJpYWJsZTMyVyhMUENXU1RSLExQQ1dTVFIpOwogI2RlZmluZSAgICAgU2V0RW52aXJvbm1lbnRWYXJpYWJsZSBXSU5FTElCX05BTUVfQVcoU2V0RW52aXJvbm1lbnRWYXJpYWJsZSkKK0JPT0wzMiAgICAgIFdJTkFQSSBTZXRFdmVudChIQU5ETEUzMik7CiBWT0lEICAgICAgICBXSU5BUEkgU2V0RmlsZUFwaXNUb0FOU0kodm9pZCk7CiBWT0lEICAgICAgICBXSU5BUEkgU2V0RmlsZUFwaXNUb09FTSh2b2lkKTsKIERXT1JEICAgICAgIFdJTkFQSSBTZXRGaWxlUG9pbnRlcihIRklMRTMyLExPTkcsTFBMT05HLERXT1JEKTsKQEAgLTU4OTQsNiArNTkwNCwxMCBAQAogQk9PTDMyICAgICAgV0lOQVBJIFZpcnR1YWxRdWVyeShMUENWT0lELExQTUVNT1JZX0JBU0lDX0lORk9STUFUSU9OLERXT1JEKTsKIEJPT0wzMiAgICAgIFdJTkFQSSBWaXJ0dWFsUXVlcnlFeChIQU5ETEUzMixMUENWT0lELExQTUVNT1JZX0JBU0lDX0lORk9STUFUSU9OLERXT1JEKTsKIEJPT0wzMiAgICAgIFdJTkFQSSBWaXJ0dWFsVW5sb2NrKExQVk9JRCxEV09SRCk7CitEV09SRCAgICAgICBXSU5BUEkgV2FpdEZvck11bHRpcGxlT2JqZWN0cyhEV09SRCxjb25zdCBIQU5ETEUzMiosQk9PTDMyLERXT1JEKTsKK0RXT1JEICAgICAgIFdJTkFQSSBXYWl0Rm9yTXVsdGlwbGVPYmplY3RzRXgoRFdPUkQsY29uc3QgSEFORExFMzIqLEJPT0wzMixEV09SRCxCT09MMzIpOworRFdPUkQgICAgICAgV0lOQVBJIFdhaXRGb3JTaW5nbGVPYmplY3QoSEFORExFMzIsRFdPUkQpOworRFdPUkQgICAgICAgV0lOQVBJIFdhaXRGb3JTaW5nbGVPYmplY3RFeChIQU5ETEUzMixEV09SRCxCT09MMzIpOwogQk9PTDMyICAgICAgV0lOQVBJIFdyaXRlQ29uc29sZTMyQShIQU5ETEUzMixMUENWT0lELERXT1JELExQRFdPUkQsTFBWT0lEKTsKIEJPT0wzMiAgICAgIFdJTkFQSSBXcml0ZUNvbnNvbGUzMlcoSEFORExFMzIsTFBDVk9JRCxEV09SRCxMUERXT1JELExQVk9JRCk7CiAjZGVmaW5lICAgICBXcml0ZUNvbnNvbGUgV0lORUxJQl9OQU1FX0FXKFdyaXRlQ29uc29sZSkKQEAgLTgxNjAsNiArODE3NCw4IEBACiAKIC8qIEV4dHJhIGZ1bmN0aW9ucyB0aGF0IGRvbid0IGV4aXN0IGluIHRoZSBXaW5kb3dzIEFQSSAqLwogCitIUEVOMTYgICAgICBXSU5BUEkgR2V0U3lzQ29sb3JQZW4xNihJTlQxNik7CitIUEVOMzIgICAgICBXSU5BUEkgR2V0U3lzQ29sb3JQZW4zMihJTlQzMik7CiBJTlQzMiAgICAgICBXSU5BUEkgTG9hZE1lc3NhZ2UzMkEoSElOU1RBTkNFMzIsVUlOVDMyLFdPUkQsTFBTVFIsSU5UMzIpOwogSU5UMzIgICAgICAgV0lOQVBJIExvYWRNZXNzYWdlMzJXKEhJTlNUQU5DRTMyLFVJTlQzMixXT1JELExQV1NUUixJTlQzMik7CiBTRUdQVFIgICAgICBXSU5BUEkgV0lOMTZfR2xvYmFsTG9jazE2KEhHTE9CQUwxNik7CmRpZmYgLS1naXQgYS9pbmNsdWRlL3dpbmVycm9yLmggYi9pbmNsdWRlL3dpbmVycm9yLmgKaW5kZXggZGQyZjNmMy4uYTBhOTk2ZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS93aW5lcnJvci5oCisrKyBiL2luY2x1ZGUvd2luZXJyb3IuaApAQCAtNCw2ICs0LDEyIEBACiAKIGV4dGVybiBpbnQgV0lOMzJfTGFzdEVycm9yOwogCisjZGVmaW5lIE1BS0VfSFJFU1VMVChzZXYsZmFjLGNvZGUpIFwKKyAgICAoKEhSRVNVTFQpICgoKHVuc2lnbmVkIGxvbmcpKHNldik8PDMxKSB8ICgodW5zaWduZWQgbG9uZykoZmFjKTw8MTYpIHwgKCh1bnNpZ25lZCBsb25nKShjb2RlKSkpICkKKyNkZWZpbmUgTUFLRV9TQ09ERShzZXYsZmFjLGNvZGUpIFwKKyAgICAgICAgKChTQ09ERSkgKCgodW5zaWduZWQgbG9uZykoc2V2KTw8MzEpIHwgKCh1bnNpZ25lZCBsb25nKShmYWMpPDwxNikgfCAoKHVuc2lnbmVkIGxvbmcpKGNvZGUpKSkgKQorCisKIC8qIEVSUk9SX1VOS05PV04gaXMgYSBwbGFjZWhvbGRlciBmb3IgZXJyb3IgY29uZGl0aW9ucyB3aGljaCBoYXZlbid0CiAgKiBiZWVuIHRlc3RlZCB5ZXQgc28gd2UncmUgbm90IGV4YWN0bHkgc3VyZSB3aGF0IHdpbGwgYmUgcmV0dXJuZWQuCiAgKiBBbGwgaW5zdGFuY2VzIG9mIEVSUk9SX1VOS05PV04gc2hvdWxkIGJlIHRlc3RlZCB1bmRlciBXaW45NS9OVApAQCAtMzcsNiArNDMsOCBAQAogI2RlZmluZSBFUlJPUl9GSUxFTkFNRV9FWENFRF9SQU5HRSAgMjA2CiAjZGVmaW5lIEVSUk9SX01PUkVfREFUQSAgICAgICAgICAgICAyMzQKICNkZWZpbmUgRVJST1JfTk9fTU9SRV9JVEVNUyAgICAgICAgIDI1OQorI2RlZmluZSBFUlJPUl9OT1RfT1dORVIgICAgICAgICAgICAgMjg4CisjZGVmaW5lIEVSUk9SX1RPT19NQU5ZX1BPU1RTICAgICAgICAyOTgKICNkZWZpbmUgRVJST1JfSU5WQUxJRF9BRERSRVNTICAgICAgIDQ4NwogI2RlZmluZSBFUlJPUl9DQU5fTk9UX0NPTVBMRVRFICAgICAgMTAwMwogI2RlZmluZSBFUlJPUl9JT19ERVZJQ0UgICAgICAgICAgICAgMTExNwpAQCAtNDgsMTEgKzU2LDEzIEBACiAvKiBIUkVTVUxUIHZhbHVlcyBmb3IgT0xFLCBTSEVMTCBhbmQgb3RoZXIgSW50ZXJmYWNlIHN0dWZmICovCiAjZGVmaW5lCU5PRVJST1IJCQkJMAogI2RlZmluZQlTX09LCQkJCTAKKyNkZWZpbmUJRV9GQUlMCQkJCTB4ODAwMDAwMDgKICNkZWZpbmUJRV9VTkVYUEVDVEVECQkJMHg4MDAwRkZGRgotI2RlZmluZQlFX09VVE9GTUVNT1JZCQkJMHg4MDA3MDAwRQotI2RlZmluZQlFX0lOVkFMSURBUkcJCQkweDgwMDcwMDU3CiAKICNkZWZpbmUJT0xFX0VfRU5VTV9OT01PUkUJCTB4ODAwNDAwMDIKICNkZWZpbmUJQ0xBU1NfRV9DTEFTU05PVEFWQUlMQUJMRQkweDgwMDQwMTExCiAKKyNkZWZpbmUJRV9PVVRPRk1FTU9SWQkJCTB4ODAwNzAwMEUKKyNkZWZpbmUJRV9JTlZBTElEQVJHCQkJMHg4MDA3MDA1NworCiAjZW5kaWYgIC8qIF9fV0lORV9XSU5FUlJPUl9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3dpbm50LmggYi9pbmNsdWRlL3dpbm50LmgKaW5kZXggMGQ1MzI5OS4uYmUwMDc4NCAxMDA2NDQKLS0tIGEvaW5jbHVkZS93aW5udC5oCisrKyBiL2luY2x1ZGUvd2lubnQuaApAQCAtMTk0LDYgKzE5NCwxMCBAQAogI2RlZmluZSBFWENFUFRJT05fUFJJVl9JTlNUUlVDVElPTiAgICAgIFNUQVRVU19QUklWSUxFR0VEX0lOU1RSVUNUSU9OCiAjZGVmaW5lIEVYQ0VQVElPTl9JTl9QQUdFX0VSUk9SICAgICAgICAgU1RBVFVTX0lOX1BBR0VfRVJST1IKIAorI2RlZmluZSBNQVhJTVVNX1dBSVRfT0JKRUNUUyA2NAorI2RlZmluZSBNQVhJTVVNX1NVU1BFTkRfQ09VTlQgMTI3CisKKwogLyoKICAqIFJldHVybiB2YWx1ZXMgZnJvbSB0aGUgYWN0dWFsIGV4Y2VwdGlvbiBoYW5kbGVycwogICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3dpbnNvY2suaCBiL2luY2x1ZGUvd2luc29jay5oCmluZGV4IGVkZWUyNTAuLmNhNzM1N2MgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvd2luc29jay5oCisrKyBiL2luY2x1ZGUvd2luc29jay5oCkBAIC0xNzYsNyArMTc2LDcgQEAKICNkZWZpbmUgV1NfU09DS19SRE0gICAgICAgIDQgICAgICAgICAgICAgICAvKiByZWxpYWJseS1kZWxpdmVyZWQgbWVzc2FnZSAqLwogI2RlZmluZSBXU19TT0NLX1NFUVBBQ0tFVCAgNSAgICAgICAgICAgICAgIC8qIHNlcXVlbmNlZCBwYWNrZXQgc3RyZWFtICovCiAKLSNkZWZpbmUgV1NfU09MX1NPQ0tFVAkJKC0xKQorI2RlZmluZSBXU19TT0xfU09DS0VUCQkweGZmZmYKICNkZWZpbmUgV1NfSVBQUk9UT19UQ1AJCTYKIAogLyoKZGlmZiAtLWdpdCBhL2luY2x1ZGUvd2ludHlwZXMuaCBiL2luY2x1ZGUvd2ludHlwZXMuaAppbmRleCBhNWFiNTU2Li41MjdmYmNiIDEwMDY0NAotLS0gYS9pbmNsdWRlL3dpbnR5cGVzLmgKKysrIGIvaW5jbHVkZS93aW50eXBlcy5oCkBAIC01OSw3ICs1OSw3IEBACiAjIGlmIGRlZmluZWQoX19HTlVDX18pICYmIChfX0dOVUNfXyA9PSAyKSAmJiAoX19HTlVDX01JTk9SX18gPj0gNykKICMgIGRlZmluZSBfX3N0ZGNhbGwgX19hdHRyaWJ1dGVfXygoX19zdGRjYWxsX18pKQogIyAgZGVmaW5lIF9fY2RlY2wgICBfX2F0dHJpYnV0ZV9fKChfX2NkZWNsX18pKQotIyAgZGVmaW5lIF9fUkVTVE9SRV9FUyAgX19hc21fXyBfX3ZvbGF0aWxlX18oInB1c2h3ICVkc1xuXHRwb3B3ICVlcyIpCisjICBkZWZpbmUgX19SRVNUT1JFX0VTICBfX2FzbV9fIF9fdm9sYXRpbGVfXygicHVzaGwgJWRzXG5cdHBvcGwgJWVzIikKICMgZWxzZQogIyAgZXJyb3IgWW91IG5lZWQgZ2NjID49IDIuNyB0byBidWlsZCBXaW5lIG9uIGEgMzg2CiAjIGVuZGlmICAvKiBfX0dOVUNfXyAqLwpkaWZmIC0tZ2l0IGEvbGlidGVzdC9NYWtlZmlsZS5pbiBiL2xpYnRlc3QvTWFrZWZpbGUuaW4KaW5kZXggM2E4NTEwOS4uMTFkZWVlYSAxMDA2NDQKLS0tIGEvbGlidGVzdC9NYWtlZmlsZS5pbgorKysgYi9saWJ0ZXN0L01ha2VmaWxlLmluCkBAIC01LDcgKzUsNyBAQAogTU9EVUxFICAgID0gbm9uZQogUkNGTEFHUyAgID0gLXcxNiAtaAogUFJPR1JBTVMgID0gZXhwYW5kIGhlbGxvIGhlbGxvMiBoZWxsbzMgaGVsbG80IG5ldyByb2xleAotQUxMX0xJQlMgID0gJChXSU5FTElCKSAkKFhfTElCUykgJChYUE1fTElCKSAkKFhMSUIpICQoTERMSUJTKQorQUxMX0xJQlMgID0gJChXSU5FTElCKSAkKFhfTElCUykgJChYUE1fTElCKSAkKFhMSUIpICQoTElCUykKIAogQ19TUkNTID0gXAogCWV4cGFuZC5jIFwKZGlmZiAtLWdpdCBhL2xvYWRlci9tYWluLmMgYi9sb2FkZXIvbWFpbi5jCmluZGV4IGVkNzVjMTEuLmI1OTZiZTIgMTAwNjQ0Ci0tLSBhL2xvYWRlci9tYWluLmMKKysrIGIvbG9hZGVyL21haW4uYwpAQCAtMjEsNyArMjEsNiBAQAogI2luY2x1ZGUgImRpYWxvZy5oIgogI2luY2x1ZGUgImRyaXZlLmgiCiAjaW5jbHVkZSAicXVldWUuaCIKLSNpbmNsdWRlICJzeXNjb2xvci5oIgogI2luY2x1ZGUgInN5c21ldHJpY3MuaCIKICNpbmNsdWRlICJmaWxlLmgiCiAjaW5jbHVkZSAiZ2RpLmgiCkBAIC00MywxMCArNDIsNiBAQAogCiBpbnQgX193aW5lbGliID0gMTsgIC8qIFdpbmVsaWIgcnVuLXRpbWUgZmxhZyAqLwogCi1IQU5ETEUzMiBTeXN0ZW1IZWFwID0gMDsKLUhBTkRMRTMyIFNlZ3B0ckhlYXAgPSAwOwotCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIEtlcm5lbCBpbml0aWFsaXNhdGlvbiByb3V0aW5lCiAgKi8KZGlmZiAtLWdpdCBhL2xvYWRlci9tb2R1bGUuYyBiL2xvYWRlci9tb2R1bGUuYwppbmRleCBjZWJhZWEwLi42Y2VhNmM1IDEwMDY0NAotLS0gYS9sb2FkZXIvbW9kdWxlLmMKKysrIGIvbG9hZGVyL21vZHVsZS5jCkBAIC0xOSw2ICsxOSw3IEBACiAjaW5jbHVkZSAiaG9vay5oIgogI2luY2x1ZGUgIm1vZHVsZS5oIgogI2luY2x1ZGUgIm5lZXhlLmgiCisjaW5jbHVkZSAicHJvY2Vzcy5oIgogI2luY2x1ZGUgInJlc291cmNlLmgiCiAjaW5jbHVkZSAic2VsZWN0b3JzLmgiCiAjaW5jbHVkZSAic3RhY2tmcmFtZS5oIgpAQCAtMTQzNiw3ICsxNDM3LDcgQEAKIAlobW9kID0gUEVfTG9hZExpYnJhcnlFeDMyQShidWZmZXIsaGZpbGUsZmxhZ3MpOwogICAgIH0KICAgICAvKiBpbml0aWFsaXplIGFsbCBETExzLCB3aGljaCBoYXZlbid0IGJlZW4gaW5pdGlhbGl6ZWQgeWV0LiAqLwotICAgIFBFX0luaXRpYWxpemVETExzKCBHZXRDdXJyZW50UHJvY2Vzc0lkKCksIERMTF9QUk9DRVNTX0FUVEFDSCwgTlVMTCk7CisgICAgUEVfSW5pdGlhbGl6ZURMTHMoIHBDdXJyZW50UHJvY2VzcywgRExMX1BST0NFU1NfQVRUQUNILCBOVUxMKTsKICAgICByZXR1cm4gaG1vZDsKIH0KIApAQCAtMTQ3Miw4ICsxNDczLDkgQEAKICAqLwogQk9PTDMyIFdJTkFQSSBGcmVlTGlicmFyeTMyKEhJTlNUQU5DRTMyIGhMaWJNb2R1bGUpCiB7Ci0JZnByaW50ZihzdGRlcnIsIkZyZWVMaWJyYXJ5OiBlbXB0eSBzdHViXG4iKTsKLQlyZXR1cm4gVFJVRTsKKwlkcHJpbnRmX21vZHVsZShzdGRkZWIsIkZyZWVMaWJyYXJ5OiBoTGliTW9kdWxlOiAlMDh4XG4iLCBoTGliTW9kdWxlKTsKKwlyZXR1cm4gTU9EVUxFX0ZyZWVNb2R1bGUoaExpYk1vZHVsZSwgCisJICAgICAgICAgICAgICAgICAgICAgICAgIEdsb2JhbExvY2sxNihHZXRDdXJyZW50VGFzaygpKSApOwogfQogCiAKZGlmZiAtLWdpdCBhL2xvYWRlci9wZV9pbWFnZS5jIGIvbG9hZGVyL3BlX2ltYWdlLmMKaW5kZXggNjY5M2ZlMi4uMDQzNDA0ZCAxMDA2NDQKLS0tIGEvbG9hZGVyL3BlX2ltYWdlLmMKKysrIGIvbG9hZGVyL3BlX2ltYWdlLmMKQEAgLTk3LDcgKzk3LDcgQEAKIAl1X2xvbmcJCQkJKiBmdW5jdGlvbjsKIAl1X2NoYXIJCQkJKiogbmFtZSwgKmVuYW1lOwogCWludAkJCQlpOwotCVBEQjMyCQkJCSpwcm9jZXNzPShQREIzMiopR2V0Q3VycmVudFByb2Nlc3NJZCgpOworCVBEQjMyCQkJCSpwcm9jZXNzPXBDdXJyZW50UHJvY2VzczsKIAlQRV9NT0RSRUYJCQkqcGVtOwogCXVfbG9uZwkJCQlydmFfc3RhcnQsIHJ2YV9lbmQsIGFkZHI7CiAJY2hhcgkJCQkqIGZvcndhcmQ7CkBAIC02OTAsMTQgKzY5MCwxNCBAQAogCQlpZiAoIUhJV09SRChoTW9kdWxlKSkgLyogaW50ZXJuYWwgKG9yIGJhZCkgKi8KIAkJCXJldHVybiBoTW9kdWxlOwogCQkvKiBjaGVjayBpZiB0aGlzIG1vZHVsZSBpcyBhbHJlYWR5IG1hcHBlZCAqLwotCQlwZW0gCT0gKChQREIzMiopR2V0Q3VycmVudFByb2Nlc3NJZCgpKS0+bW9kcmVmX2xpc3Q7CisJCXBlbSAJPSBwQ3VycmVudFByb2Nlc3MtPm1vZHJlZl9saXN0OwogCQl3aGlsZSAocGVtKSB7CiAJCQlpZiAocGVtLT5tb2R1bGUgPT0gaE1vZHVsZSkgcmV0dXJuIGhNb2R1bGU7CiAJCQlwZW0gPSBwZW0tPm5leHQ7CiAJCX0KIAkJcE1vZHVsZSA9IE1PRFVMRV9HZXRQdHIoaE1vZHVsZSk7CiAJCWlmIChwTW9kdWxlLT5mbGFncyAmIE5FX0ZGTEFHU19CVUlMVElOKSB7Ci0JCQlQREIzMgkqcHJvY2VzcyA9IChQREIzMiopR2V0Q3VycmVudFByb2Nlc3NJZCgpOworCQkJUERCMzIJKnByb2Nlc3MgPSBwQ3VycmVudFByb2Nlc3M7CiAJCQlJTUFHRV9ET1NfSEVBREVSCSpkaDsKIAkJCUlNQUdFX05UX0hFQURFUlMJKm5oOwogCQkJSU1BR0VfU0VDVElPTl9IRUFERVIJKnNoOwpAQCAtNzQzLDggKzc0Myw3IEBACiAJCWlmIChwTW9kdWxlLT5tb2R1bGUzMiA8IDMyKSByZXR1cm4gMjE7CiAJfQogCS8qIHJlY3Vyc2UgKi8KLQlwTW9kdWxlLT5tb2R1bGUzMiA9IFBFX01hcEltYWdlKCBwTW9kdWxlLT5tb2R1bGUzMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFBEQjMyKilHZXRDdXJyZW50UHJvY2Vzc0lkKCksCisJcE1vZHVsZS0+bW9kdWxlMzIgPSBQRV9NYXBJbWFnZSggcE1vZHVsZS0+bW9kdWxlMzIsIHBDdXJyZW50UHJvY2VzcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm9mcyxmbGFncyk7CiAJcmV0dXJuIHBNb2R1bGUtPm1vZHVsZTMyOwogfQpAQCAtNzc3LDggKzc3Niw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgKExQU1RSKVBUUl9TRUdfVE9fTElOKCBwYXJhbXMtPmNtZExpbmUgKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAqKChXT1JEKilQVFJfU0VHX1RPX0xJTihwYXJhbXMtPnNob3dDbWQpICsgMSkgKTsKICAgICB9Ci0gICAgcE1vZHVsZS0+bW9kdWxlMzIgPSBQRV9NYXBJbWFnZSggaE1vZHVsZTMyLCAoUERCMzIqKUdldEN1cnJlbnRQcm9jZXNzSWQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZnMsIDAgKTsKKyAgICBwTW9kdWxlLT5tb2R1bGUzMiA9IFBFX01hcEltYWdlKCBoTW9kdWxlMzIsIHBDdXJyZW50UHJvY2Vzcywgb2ZzLCAwICk7CiAgICAgcmV0dXJuIGhJbnN0YW5jZTsKIH0KIApAQCAtODEyLDcgKzgxMCw3IEBACiAgICAgKSB7CiAgICAgICAgIEZBUlBST0MzMiBlbnRyeSA9IChGQVJQUk9DMzIpUlZBX1BUUiggcGVtLT5tb2R1bGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcHRpb25hbEhlYWRlci5BZGRyZXNzT2ZFbnRyeVBvaW50ICk7Ci0gICAgICAgIGRwcmludGZfcmVsYXkoIHN0ZGRlYiwgIkNhbGxUbzMyKGVudHJ5cHJvYz0lcCxtb2R1bGU9JWQsdHlwZT0lbGQscmVzPSVwKVxuIiwKKyAgICAgICAgZHByaW50Zl9yZWxheSggc3RkZGViLCAiQ2FsbFRvMzIoZW50cnlwcm9jPSVwLG1vZHVsZT0lMDh4LHR5cGU9JWxkLHJlcz0lcClcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5LCBwZW0tPm1vZHVsZSwgdHlwZSwgbHBSZXNlcnZlZCApOwogICAgICAgICBlbnRyeSggcGVtLT5tb2R1bGUsIHR5cGUsIGxwUmVzZXJ2ZWQgKTsKICAgICB9CkBAIC04NzcsNyArODc1LDcgQEAKICAqLwogQk9PTDMyIFdJTkFQSSBEaXNhYmxlVGhyZWFkTGlicmFyeUNhbGxzKEhNT0RVTEUzMiBoTW9kdWxlKQogewotCVBEQjMyCSpwcm9jZXNzID0gKFBEQjMyKilHZXRDdXJyZW50UHJvY2Vzc0lkKCk7CisJUERCMzIJKnByb2Nlc3MgPSBwQ3VycmVudFByb2Nlc3M7CiAJUEVfTU9EUkVGCSpwZW0gPSBwcm9jZXNzLT5tb2RyZWZfbGlzdDsKIAogCXdoaWxlIChwZW0pIHsKZGlmZiAtLWdpdCBhL2xvYWRlci9wZV9yZXNvdXJjZS5jIGIvbG9hZGVyL3BlX3Jlc291cmNlLmMKaW5kZXggMDEzOTYzMy4uNGU0MDk4YyAxMDA2NDQKLS0tIGEvbG9hZGVyL3BlX3Jlc291cmNlLmMKKysrIGIvbG9hZGVyL3BlX3Jlc291cmNlLmMKQEAgLTMzLDcgKzMzLDcgQEAKIHN0YXRpYyBQRV9NT0RSRUYqCiBITU9EVUxFMzJ0b1BFX01PRFJFRihITU9EVUxFMzIgaG1vZCkgewogCU5FX01PRFVMRQkqcE1vZHVsZTsKLQlQREIzMgkJKnBkYiA9IChQREIzMiopR2V0Q3VycmVudFByb2Nlc3NJZCgpOworCVBEQjMyCQkqcGRiID0gcEN1cnJlbnRQcm9jZXNzOwogCVBFX01PRFJFRgkqcGVtOwogCiAJaWYgKCFobW9kKSBobW9kID0gR2V0VGFza0RTKCk7IC8qIEZJWE1FOiBjb3JyZWN0PyAqLwpkaWZmIC0tZ2l0IGEvbG9hZGVyL3NpZ25hbC5jIGIvbG9hZGVyL3NpZ25hbC5jCmluZGV4IGQ5OWRlZGMuLjY2ZGVmNWQgMTAwNjQ0Ci0tLSBhL2xvYWRlci9zaWduYWwuYworKysgYi9sb2FkZXIvc2lnbmFsLmMKQEAgLTE0OSw2ICsxNDksOCBAQAogICovCiBCT09MMzIgU0lHTkFMX0luaXQodm9pZCkKIHsKKyAgICBleHRlcm4gdm9pZCBTWU5DX1NldHVwU2lnbmFscyh2b2lkKTsKKwogI2lmIGRlZmluZWQoX19OZXRCU0RfXykgfHwgZGVmaW5lZChfX0ZyZWVCU0RfXykgfHwgZGVmaW5lZChfX09wZW5CU0RfXykgfHwgZGVmaW5lZCAoX19zdnI0X18pIHx8IGRlZmluZWQoX1NDT19EUykKICAgICBzdHJ1Y3Qgc2lnYWx0c3RhY2sgc3M7CiAgICAgc3Muc3Nfc3AgICAgPSBTSUdOQUxfU3RhY2s7CkBAIC0xNjgsNiArMTcwLDcgQEAKICNpZmRlZiBTSUdJTwogICAgIFNJR05BTF9TZXRIYW5kbGVyKCBTSUdJTywgICAodm9pZCAoKikoKSlXSU5TT0NLX3NpZ2lvLCAwKTsgCiAjZW5kaWYKKyAgICBTWU5DX1NldHVwU2lnbmFscygpOwogICAgIHJldHVybiBUUlVFOwogfQogCmRpZmYgLS1naXQgYS9sb2FkZXIvdGFzay5jIGIvbG9hZGVyL3Rhc2suYwppbmRleCAwODg4MWQ2Li4xMTBhNzk5IDEwMDY0NAotLS0gYS9sb2FkZXIvdGFzay5jCisrKyBiL2xvYWRlci90YXNrLmMKQEAgLTM0MCw3ICszNDAsNyBAQAogICAgIFNFR1RBQkxFRU5UUlkgKnBTZWdUYWJsZSA9IE5FX1NFR19UQUJMRSggcE1vZHVsZSApOwogCiAgICAgSUYxNjMyX1NhdmVkMTZfc3Nfc3AgPSBwVGFzay0+c3Nfc3A7Ci0gICAgU0VUX0ZTKCBwQ3VycmVudFRocmVhZC0+dGViX3NlbCApOworICAgIFNFVF9DVVJfVEhSRUFEKCBwVGFzay0+dGhkYiApOwogICAgIGlmIChwTW9kdWxlLT5mbGFncyAmIE5FX0ZGTEFHU19XSU4zMikKICAgICB7CiAgICAgICAgIC8qIEZJWE1FOiBhbGwgdGhpcyBpcyBhbiB1Z2x5IGhhY2sgKi8KQEAgLTUyNiwxNSArNTI2LDE2IEBACiAJCXBDdXJyZW50UHJvY2Vzcy0+ZXhlX21vZHJlZi0+cGVfbW9kdWxlLT5wZV9oZWFkZXItPk9wdGlvbmFsSGVhZGVyLkFkZHJlc3NPZkVudHJ5UG9pbnQpOwogICAgICAqLwogICAgICAgICBwVGFzay0+dGhkYiA9IFRIUkVBRF9DcmVhdGUoIHBkYjMyLAotICAgICAgICAgIFBFX0hFQURFUihwTW9kdWxlLT5tb2R1bGUzMiktPk9wdGlvbmFsSGVhZGVyLlNpemVPZlN0YWNrUmVzZXJ2ZSwgMCApOworICAgICAgICAgIFBFX0hFQURFUihwTW9kdWxlLT5tb2R1bGUzMiktPk9wdGlvbmFsSGVhZGVyLlNpemVPZlN0YWNrUmVzZXJ2ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBOVUxMICk7CiAgICAgICAgIC8qIEZJWE1FOiBzaG91bGQgbm90IGJlIGRvbmUgaGVyZSAqLwotICAgICAgICBwQ3VycmVudFRocmVhZCA9IHBUYXNrLT50aGRiOwogICAgICAgICBQRV9Jbml0VGxzKCBwZGIzMiApOwogICAgIH0KICAgICBlbHNlCi0gICAgICAgIHBUYXNrLT50aGRiID0gVEhSRUFEX0NyZWF0ZSggcGRiMzIsIDAsIE5VTEwgKTsKKyAgICAgICAgcFRhc2stPnRoZGIgPSBUSFJFQURfQ3JlYXRlKCBwZGIzMiwgMCwgTlVMTCwgTlVMTCApOwogCiAgICAgLyogRklYTUU6IGNoZWNrIGZvciBwVGFzay0+dGhkYiA9PSBOVUxMLiAgKi8KKyAgICBTRVRfQ1VSX1RIUkVBRCggcFRhc2stPnRoZGIgKTsKIAogICAgIC8qIENyZWF0ZSB0aGUgMzItYml0IHN0YWNrIGZyYW1lICovCiAKQEAgLTU5Niw4ICs1OTcsOCBAQAogCiAgICAgLyogRGVsZXRlIHRoZSBXaW4zMiBwYXJ0IG9mIHRoZSB0YXNrICovCiAKLSAgICBQUk9DRVNTX0Rlc3Ryb3koICZwVGFzay0+dGhkYi0+cHJvY2Vzcy0+aGVhZGVyICk7Ci0gICAgVEhSRUFEX0Rlc3Ryb3koICZwVGFzay0+dGhkYi0+aGVhZGVyICk7CisgICAgSzMyT0JKX0RlY0NvdW50KCAmcFRhc2stPnRoZGItPnByb2Nlc3MtPmhlYWRlciApOworICAgIEszMk9CSl9EZWNDb3VudCggJnBUYXNrLT50aGRiLT5oZWFkZXIgKTsKIAogICAgIC8qIEZyZWUgdGhlIHRhc2sgbW9kdWxlICovCiAKQEAgLTc4OCw4ICs3ODksOCBAQAogICAgIC8qIFN3aXRjaCB0byB0aGUgbmV3IHN0YWNrICovCiAKICAgICBoQ3VycmVudFRhc2sgPSBoVGFzazsKLSAgICBwQ3VycmVudFRocmVhZCA9IHBOZXdUYXNrLT50aGRiOwotICAgIHBDdXJyZW50UHJvY2VzcyA9IHBDdXJyZW50VGhyZWFkLT5wcm9jZXNzOworICAgIFNFVF9DVVJfVEhSRUFEKCBwTmV3VGFzay0+dGhkYiApOworICAgIHBDdXJyZW50UHJvY2VzcyA9IHBOZXdUYXNrLT50aGRiLT5wcm9jZXNzOwogICAgIElGMTYzMl9TYXZlZDE2X3NzX3NwID0gcE5ld1Rhc2stPnNzX3NwOwogfQogCmRpZmYgLS1naXQgYS9tZW1vcnkvZ2xvYmFsLmMgYi9tZW1vcnkvZ2xvYmFsLmMKaW5kZXggNDQ5MGI4YS4uMDgzMGMxNCAxMDA2NDQKLS0tIGEvbWVtb3J5L2dsb2JhbC5jCisrKyBiL21lbW9yeS9nbG9iYWwuYwpAQCAtOTk0LDcgKzk5NCw3IEBACiAgICBIR0xPQkFMMzIgICAgICAgICAgICBobmV3OwogICAgUEdMT0JBTDMyX0lOVEVSTiAgICAgcGludGVybjsKIAotICAgaG5ldz1OVUxMOworICAgaG5ldyA9IDA7CiAgICAvKiBIZWFwTG9jayhHZXRQcm9jZXNzSGVhcCgpKTsgKi8KICAgIGlmKGZsYWdzICYgR01FTV9NT0RJRlkpIC8qIG1vZGlmeSBmbGFncyAqLwogICAgewpAQCAtMTAyMCw3ICsxMDIwLDcgQEAKICAgICAgIGVsc2UKICAgICAgIHsKIAkgU2V0TGFzdEVycm9yKEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSKTsKLQkgaG5ldz1OVUxMOworCSBobmV3ID0gMDsKICAgICAgIH0KICAgIH0KICAgIGVsc2UKQEAgLTEwNzQsMTIgKzEwNzQsMTEgQEAKIEhHTE9CQUwzMiBXSU5BUEkgR2xvYmFsRnJlZTMyKEhHTE9CQUwzMiBobWVtKQogewogICAgUEdMT0JBTDMyX0lOVEVSTiBwaW50ZXJuOwotICAgSEdMT0JBTDMyICAgICAgICBocmV0dXJuZWQ9TlVMTDsKKyAgIEhHTE9CQUwzMiAgICAgICAgaHJldHVybmVkID0gMDsKICAgIAogICAgaWYoSVNQT0lOVEVSKGhtZW0pKSAvKiBQT0lOVEVSICovCiAgICB7Ci0gICAgICBpZighSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgKExQVk9JRCkgaG1lbSkpCi0gICAgICAgICBobWVtPU5VTEw7CisgICAgICBpZighSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgKExQVk9JRCkgaG1lbSkpIGhtZW0gPSAwOwogICAgfQogICAgZWxzZSAgLyogSEFORExFICovCiAgICB7CmRpZmYgLS1naXQgYS9tZW1vcnkvaGVhcC5jIGIvbWVtb3J5L2hlYXAuYwppbmRleCAxZDRhZWUyLi45OTA0YjNkIDEwMDY0NAotLS0gYS9tZW1vcnkvaGVhcC5jCisrKyBiL21lbW9yeS9oZWFwLmMKQEAgLTEzLDYgKzEzLDcgQEAKICNpbmNsdWRlICJ3aW5iYXNlLmgiCiAjaW5jbHVkZSAid2luZXJyb3IuaCIKICNpbmNsdWRlICJ3aW5udC5oIgorI2luY2x1ZGUgImhlYXAuaCIKICNpbmNsdWRlICJzdGRkZWJ1Zy5oIgogI2luY2x1ZGUgImRlYnVnLmgiCiAKQEAgLTkyLDYgKzkzLDEwIEBACiAjZGVmaW5lIEhFQVBfREVGX1NJWkUgICAgICAgIDB4MTEwMDAwICAgLyogRGVmYXVsdCBoZWFwIHNpemUgPSAxTWIgKyA2NEtiICovCiAjZGVmaW5lIEhFQVBfTUlOX0JMT0NLX1NJWkUgICg4K3NpemVvZihBUkVOQV9GUkVFKSkgIC8qIE1pbi4gaGVhcCBibG9jayBzaXplICovCiAKK0hBTkRMRTMyIFN5c3RlbUhlYXAgPSAwOworSEFORExFMzIgU2VncHRySGVhcCA9IDA7CitDUklUSUNBTF9TRUNUSU9OICpIRUFQX1N5c3RlbUxvY2sgPSBOVUxMOworCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIEhFQVBfRHVtcApAQCAtODA4LDcgKzgxMyw2IEBACiAgICAgaGVhcC0+bmV4dCAgICAgICAgICA9IE5VTEw7CiAgICAgaGVhcC0+ZmxhZ3MgICAgICAgICA9IGZsYWdzOwogICAgIGhlYXAtPm1hZ2ljICAgICAgICAgPSBIRUFQX01BR0lDOwotICAgIEluaXRpYWxpemVDcml0aWNhbFNlY3Rpb24oICZoZWFwLT5jcml0U2VjdGlvbiApOwogCiAgICAgLyogQnVpbGQgdGhlIGZyZWUgbGlzdHMgKi8KIApAQCAtODI4LDkgKzgzMiwxMyBAQAogCiAgICAgSEVBUF9DcmVhdGVGcmVlQmxvY2soIHN1YmhlYXAsIGhlYXAgKyAxLCBzdWJoZWFwLT5zaXplIC0gc2l6ZW9mKCpoZWFwKSApOwogCisgICAgLyogSW5pdGlhbGl6ZSBjcml0aWNhbCBzZWN0aW9uICovCisKKyAgICBJbml0aWFsaXplQ3JpdGljYWxTZWN0aW9uKCAmaGVhcC0+Y3JpdFNlY3Rpb24gKTsKKyAgICBpZiAoIVN5c3RlbUhlYXApIEhFQVBfU3lzdGVtTG9jayA9ICZoZWFwLT5jcml0U2VjdGlvbjsKKwogICAgIC8qIFdlIGFyZSBkb25lICovCiAKLSAgICBTZXRMYXN0RXJyb3IoIDAgKTsKICAgICByZXR1cm4gKEhBTkRMRTMyKWhlYXA7CiB9CiAKQEAgLTEwODgsNyArMTA5Niw2IEBACiBCT09MMzIgV0lOQVBJIEhlYXBMb2NrKCBIQU5ETEUzMiBoZWFwICkKIHsKICAgICBIRUFQICpoZWFwUHRyID0gSEVBUF9HZXRQdHIoIGhlYXAgKTsKLQogICAgIGlmICghaGVhcFB0cikgcmV0dXJuIEZBTFNFOwogICAgIEVudGVyQ3JpdGljYWxTZWN0aW9uKCAmaGVhcFB0ci0+Y3JpdFNlY3Rpb24gKTsKICAgICByZXR1cm4gVFJVRTsKQEAgLTExMDEsNyArMTEwOCw2IEBACiBCT09MMzIgV0lOQVBJIEhlYXBVbmxvY2soIEhBTkRMRTMyIGhlYXAgKQogewogICAgIEhFQVAgKmhlYXBQdHIgPSBIRUFQX0dldFB0ciggaGVhcCApOwotCiAgICAgaWYgKCFoZWFwUHRyKSByZXR1cm4gRkFMU0U7CiAgICAgTGVhdmVDcml0aWNhbFNlY3Rpb24oICZoZWFwUHRyLT5jcml0U2VjdGlvbiApOwogICAgIHJldHVybiBUUlVFOwpkaWZmIC0tZ2l0IGEvbWVtb3J5L2xkdC5jIGIvbWVtb3J5L2xkdC5jCmluZGV4IDYyZmQxYjAuLjEyNmUzMGIgMTAwNjQ0Ci0tLSBhL21lbW9yeS9sZHQuYworKysgYi9tZW1vcnkvbGR0LmMKQEAgLTYxLDggKzYxLDEwIEBACiAKICNpZiBkZWZpbmVkKF9fc3ZyNF9fKSB8fCBkZWZpbmVkKF9TQ09fRFMpCiAjaW5jbHVkZSA8c3lzL3N5c2k4Ni5oPgorI2lmbmRlZiBfX3N1bl9fCiAjaW5jbHVkZSA8c3lzL3NlZy5oPgogI2VuZGlmCisjZW5kaWYKIAogI2lmIGRlZmluZWQoX19OZXRCU0RfXykgfHwgZGVmaW5lZChfX0ZyZWVCU0RfXykgfHwgZGVmaW5lZChfX09wZW5CU0RfXykKICNpbmNsdWRlIDxtYWNoaW5lL3NlZ21lbnRzLmg+CmRpZmYgLS1naXQgYS9tZW1vcnkvdmlydHVhbC5jIGIvbWVtb3J5L3ZpcnR1YWwuYwppbmRleCA4MmQ0ODQ1Li45ZmZkZTgyIDEwMDY0NAotLS0gYS9tZW1vcnkvdmlydHVhbC5jCisrKyBiL21lbW9yeS92aXJ0dWFsLmMKQEAgLTk1LDYgKzk1LDE3IEBACiAjZGVmaW5lIFJPVU5EX1NJWkUoYWRkcixzaXplKSBcCiAgICAoKChVSU5UMzIpKHNpemUpICsgKChVSU5UMzIpKGFkZHIpICYgcGFnZV9tYXNrKSArIHBhZ2VfbWFzaykgJiB+cGFnZV9tYXNrKQogCitzdGF0aWMgdm9pZCBWSVJUVUFMX0Rlc3Ryb3lNYXBwaW5nKCBLMzJPQkogKm9iaiApOworCitjb25zdCBLMzJPQkpfT1BTIE1FTV9NQVBQRURfRklMRV9PcHMgPQoreworICAgIC8qIE9iamVjdCBjYW5ub3QgYmUgd2FpdGVkIHVwb24sIHNvIHdlIGRvbid0IG5lZWQgdGhlc2UgKGV4Y2VwdCBkZXN0cm95KSAqLworICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgIC8qIHNpZ25hbGVkICovCisgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgLyogc2F0aXNmaWVkICovCisgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgLyogYWRkX3dhaXQgKi8KKyAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAvKiByZW1vdmVfd2FpdCAqLworICAgIFZJUlRVQUxfRGVzdHJveU1hcHBpbmcgICAgIC8qIGRlc3Ryb3kgKi8KK307CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIFZJUlRVQUxfR2V0UHJvdFN0cgpAQCAtODY0LDEwICs4NzUsMTUgQEAKICAgICAgICAgaWYgKG9iai0+dHlwZSA9PSBLMzJPQkpfTUVNX01BUFBFRF9GSUxFKQogICAgICAgICB7CiAgICAgICAgICAgICBTZXRMYXN0RXJyb3IoIEVSUk9SX0FMUkVBRFlfRVhJU1RTICk7Ci0gICAgICAgICAgICByZXR1cm4gUFJPQ0VTU19BbGxvY0hhbmRsZSggb2JqLCAwICk7CisgICAgICAgICAgICBoYW5kbGUgPSBQUk9DRVNTX0FsbG9jSGFuZGxlKCBvYmosIDAgKTsKICAgICAgICAgfQotICAgICAgICBTZXRMYXN0RXJyb3IoIEVSUk9SX0RVUF9OQU1FICk7Ci0gICAgICAgIHJldHVybiAwOworICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIFNldExhc3RFcnJvciggRVJST1JfRFVQX05BTUUgKTsKKyAgICAgICAgICAgIGhhbmRsZSA9IDA7CisgICAgICAgIH0KKyAgICAgICAgSzMyT0JKX0RlY0NvdW50KCBvYmogKTsKKyAgICAgICAgcmV0dXJuIGhhbmRsZTsKICAgICB9CiAKICAgICAvKiBDaGVjayBwYXJhbWV0ZXJzICovCkBAIC05MjQsMTUgKzk0MCwxNyBAQAogICAgIC8qIEFsbG9jYXRlIHRoZSBtYXBwaW5nIG9iamVjdCAqLwogCiAgICAgaWYgKCEobWFwcGluZyA9IEhlYXBBbGxvYyggU3lzdGVtSGVhcCwgMCwgc2l6ZW9mKCptYXBwaW5nKSApKSkgZ290byBlcnJvcjsKLSAgICBtYXBwaW5nLT5oZWFkZXIudHlwZSA9IEszMk9CSl9NRU1fTUFQUEVEX0ZJTEU7CisgICAgbWFwcGluZy0+aGVhZGVyLnR5cGUgICAgID0gSzMyT0JKX01FTV9NQVBQRURfRklMRTsKICAgICBtYXBwaW5nLT5oZWFkZXIucmVmY291bnQgPSAxOwotICAgIG1hcHBpbmctPnByb3RlY3QgICA9IHZwcm90OwotICAgIG1hcHBpbmctPnNpemVfaGlnaCA9IHNpemVfaGlnaDsKLSAgICBtYXBwaW5nLT5zaXplX2xvdyAgPSBST1VORF9TSVpFKCAwLCBzaXplX2xvdyApOwotICAgIG1hcHBpbmctPmZpbGUgICAgICA9IChGSUxFX09CSkVDVCAqKW9iajsKKyAgICBtYXBwaW5nLT5wcm90ZWN0ICAgICAgICAgPSB2cHJvdDsKKyAgICBtYXBwaW5nLT5zaXplX2hpZ2ggICAgICAgPSBzaXplX2hpZ2g7CisgICAgbWFwcGluZy0+c2l6ZV9sb3cgICAgICAgID0gUk9VTkRfU0laRSggMCwgc2l6ZV9sb3cgKTsKKyAgICBtYXBwaW5nLT5maWxlICAgICAgICAgICAgPSAoRklMRV9PQkpFQ1QgKilvYmo7CiAKLSAgICBoYW5kbGUgPSBQUk9DRVNTX0FsbG9jSGFuZGxlKCAmbWFwcGluZy0+aGVhZGVyLCAwICk7Ci0gICAgaWYgKGhhbmRsZSAhPSBJTlZBTElEX0hBTkRMRV9WQUxVRTMyKSByZXR1cm4gaGFuZGxlOworICAgIGlmICghSzMyT0JKX0FkZE5hbWUoICZtYXBwaW5nLT5oZWFkZXIsIG5hbWUgKSkgaGFuZGxlID0gMDsKKyAgICBlbHNlIGhhbmRsZSA9IFBST0NFU1NfQWxsb2NIYW5kbGUoICZtYXBwaW5nLT5oZWFkZXIsIDAgKTsKKyAgICBLMzJPQkpfRGVjQ291bnQoICZtYXBwaW5nLT5oZWFkZXIgKTsKKyAgICByZXR1cm4gaGFuZGxlOwogCiBlcnJvcjoKICAgICBpZiAob2JqKSBLMzJPQkpfRGVjQ291bnQoIG9iaiApOwpAQCAtOTYxLDkgKzk3OSwxNiBAQAogICovCiBIQU5ETEUzMiBXSU5BUEkgT3BlbkZpbGVNYXBwaW5nMzJBKCBEV09SRCBhY2Nlc3MsIEJPT0wzMiBpbmhlcml0LCBMUENTVFIgbmFtZSApCiB7Ci0gICAgSzMyT0JKICpvYmogPSBLMzJPQkpfRmluZE5hbWVUeXBlKCBuYW1lLCBLMzJPQkpfTUVNX01BUFBFRF9GSUxFICk7Ci0gICAgaWYgKCFvYmopIHJldHVybiAwOwotICAgIHJldHVybiBQUk9DRVNTX0FsbG9jSGFuZGxlKCBvYmosIDAgKTsKKyAgICBIQU5ETEUzMiBoYW5kbGUgPSAwOworICAgIEszMk9CSiAqb2JqOworICAgIFNZU1RFTV9MT0NLKCk7CisgICAgaWYgKChvYmogPSBLMzJPQkpfRmluZE5hbWVUeXBlKCBuYW1lLCBLMzJPQkpfTUVNX01BUFBFRF9GSUxFICkpKQorICAgIHsKKyAgICAgICAgaGFuZGxlID0gUFJPQ0VTU19BbGxvY0hhbmRsZSggb2JqLCAwICk7CisgICAgICAgIEszMk9CSl9EZWNDb3VudCggb2JqICk7CisgICAgfQorICAgIFNZU1RFTV9VTkxPQ0soKTsKKyAgICByZXR1cm4gaGFuZGxlOwogfQogCiAKQEAgLTk4NCw3ICsxMDA5LDcgQEAKICAqCiAgKiBEZXN0cm95IGEgRklMRV9NQVBQSU5HIG9iamVjdC4KICAqLwotdm9pZCBWSVJUVUFMX0Rlc3Ryb3lNYXBwaW5nKCBLMzJPQkogKnB0ciApCitzdGF0aWMgdm9pZCBWSVJUVUFMX0Rlc3Ryb3lNYXBwaW5nKCBLMzJPQkogKnB0ciApCiB7CiAgICAgRklMRV9NQVBQSU5HICptYXBwaW5nID0gKEZJTEVfTUFQUElORyAqKXB0cjsKICAgICBhc3NlcnQoIHB0ci0+dHlwZSA9PSBLMzJPQkpfTUVNX01BUFBFRF9GSUxFICk7CmRpZmYgLS1naXQgYS9taXNjL2NvbW0uYyBiL21pc2MvY29tbS5jCmluZGV4IDA4Zjk2NzUuLjczNjgxZDkgMTAwNjQ0Ci0tLSBhL21pc2MvY29tbS5jCisrKyBiL21pc2MvY29tbS5jCkBAIC0zNiw3ICszNiw2IEBACiAjaW5jbHVkZSAib3B0aW9ucy5oIgogI2luY2x1ZGUgInN0ZGRlYnVnLmgiCiAjaW5jbHVkZSAiZGVidWcuaCIKLSNpbmNsdWRlICJoYW5kbGUzMi5oIgogCiAjaWZuZGVmIFRJT0NJTlEKICNkZWZpbmUJVElPQ0lOUSBGSU9OUkVBRApkaWZmIC0tZ2l0IGEvbWlzYy9jcHUuYyBiL21pc2MvY3B1LmMKaW5kZXggZmZiYmJiZi4uNmE3OTA5NyAxMDA2NDQKLS0tIGEvbWlzYy9jcHUuYworKysgYi9taXNjL2NwdS5jCkBAIC0xMSw2ICsxMSw5IEBACiAjaW5jbHVkZSAid2luZG93cy5oIgogI2luY2x1ZGUgIndpbm50LmgiCiAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogCQkJR2V0U3lzdGVtSW5mbyAgICAgICAgICAgIAlbS0VSTkVMTDMyLjQwNF0KKyAqLwogVk9JRCBXSU5BUEkgR2V0U3lzdGVtSW5mbyhMUFNZU1RFTV9JTkZPIHNpKQogewogCXN0YXRpYyBpbnQgY2FjaGUgPSAwOwpAQCAtMTAxLDIzICsxMDQsNDggQEAKICNlbmRpZiAgLyogbGludXggKi8KIH0KIAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICBDUFVfVGVzdFByb2Nlc3NvckZlYXR1cmUKKyAqLworc3RhdGljIEJPT0wzMiBDUFVfVGVzdFByb2Nlc3NvckZlYXR1cmUoY29uc3QgY2hhciogcXVlcnlfaW5mbywgY29uc3QgY2hhciogcXVlcnlfdmFsdWUpCit7CisgICAgQk9PTDMyIGZsYWc9RkFMU0U7CisjaWZkZWYgbGludXgKKyAgICBjaGFyIGxpbmVbMjAwXSxpbmZvWzIwMF0sdmFsdWVbMjAwXSxqdW5rWzIwMF07CisgICAgRklMRSAqZiA9IGZvcGVuICgiL3Byb2MvY3B1aW5mbyIsICJyIik7CisgICAgCisgICAgaWYgKCFmKQorICAgICAgcmV0dXJuIDA7CisgICAgd2hpbGUgKGZnZXRzKGxpbmUsMjAwLGYpIT1OVUxMKSB7CisgICAgICBpZiAoc3NjYW5mKGxpbmUsIiVzJVsgXHQ6XSVzIixpbmZvLGp1bmssdmFsdWUpIT0zKQorCWNvbnRpbnVlOworICAgICAgaWYgKHN0cmNtcChpbmZvLHF1ZXJ5X2luZm8pPT0wKQorCWZsYWcgPSBzdHJzdHIodmFsdWUscXVlcnlfdmFsdWUpIT1OVUxMOworICAgIH0KKyAgICBmY2xvc2UgKGYpOworI2Vsc2UgIC8qIGxpbnV4ICovCisgICAgLyogRklYTUU6IGhvdyBkbyB3ZSBkbyB0aGlzIG9uIG90aGVyIHN5c3RlbXM/ICovCisjZW5kaWYgIC8qIGxpbnV4ICovCisgICAgcmV0dXJuIGZsYWc7Cit9CiAKLS8qIElzUHJvY2Vzc29yRmVhdHVyZVByZXNlbnQgW0tFUk5FTDMyLjg4MF0gKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogCQkJSXNQcm9jZXNzb3JGZWF0dXJlUHJlc2VudAlbS0VSTkVMTDMyLjg4MF0KKyAqLwogQk9PTDMyIFdJTkFQSSBJc1Byb2Nlc3NvckZlYXR1cmVQcmVzZW50IChEV09SRCBmZWF0dXJlKQogewogICBTWVNURU1fSU5GTyBzaTsKICAgR2V0U3lzdGVtSW5mbyAoJnNpKTsKLSAgLyogRklYTUU6IHRoZXNlIGFyZSByZWxhdGl2ZWx5IHN0dXBpZCBhcHByb3hpbWF0aW9ucy4gICovCiAgIHN3aXRjaCAoZmVhdHVyZSkKICAgICB7Ci0gICAgY2FzZSBQRl9GTE9BVElOR19QT0lOVF9QUkVDSVNJT05fRVJSQVRBOgorICAgIGNhc2UgUEZfRkxPQVRJTkdfUE9JTlRfUFJFQ0lTSU9OX0VSUkFUQTogCiAgICAgICByZXR1cm4gc2kud1Byb2Nlc3NvckxldmVsID09IDU7CiAgICAgY2FzZSBQRl9GTE9BVElOR19QT0lOVF9FTVVMQVRFRDoKLSAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgIHJldHVybiBDUFVfVGVzdFByb2Nlc3NvckZlYXR1cmUoImZwdSIsIm5vIik7IGJyZWFrOwogICAgIGNhc2UgUEZfQ09NUEFSRV9FWENIQU5HRV9ET1VCTEU6CiAgICAgICByZXR1cm4gc2kud1Byb2Nlc3NvckxldmVsID49IDU7CiAgICAgY2FzZSBQRl9NTVhfSU5TVFJVQ1RJT05TX0FWQUlMQUJMRToKLSAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgIHJldHVybiBDUFVfVGVzdFByb2Nlc3NvckZlYXR1cmUoImZsYWdzIiwibW14Iik7IGJyZWFrOwogICAgIGRlZmF1bHQ6CiAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQpkaWZmIC0tZ2l0IGEvbWlzYy9jcnRkbGwuYyBiL21pc2MvY3J0ZGxsLmMKaW5kZXggM2ExMmM5Yi4uMjQxNWMzOSAxMDA2NDQKLS0tIGEvbWlzYy9jcnRkbGwuYworKysgYi9taXNjL2NydGRsbC5jCkBAIC0yNSw2ICsyNSw3IEBACiAjaW5jbHVkZSA8c3RkYXJnLmg+CiAjaW5jbHVkZSA8c3RyaW5nLmg+CiAjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzeXMvdGltZXMuaD4KICNpbmNsdWRlIDx1bmlzdGQuaD4KICNpbmNsdWRlIDx0aW1lLmg+CiAjaW5jbHVkZSA8Y3R5cGUuaD4KQEAgLTQyMSw2ICs0MjIsMjUgQEAKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgKENSVERMTC4zNTApCisgKi8KK2Nsb2NrX3QgX19jZGVjbCBDUlRETExfY2xvY2sodm9pZCkKK3sKKwlzdHJ1Y3QgdG1zIGFsbHRpbWVzOworCWNsb2NrX3QgcmVzOworCisJdGltZXMoJmFsbHRpbWVzKTsKKwlyZXMgPSBhbGx0aW1lcy50bXNfdXRpbWUgKyBhbGx0aW1lcy50bXNfc3RpbWUrCisgICAgICAgICAgICAgICBhbGx0aW1lcy50bXNfY3V0aW1lICsgYWxsdGltZXMudG1zX2NzdGltZTsKKwkvKiBGaXhtZTogV2UgbmVlZCBzb21lIHN5bWJvbGljIHJlcHJlc2VudGF0aW9uCisJICAgZm9yIChIb3N0c3lzdGVtXylDTE9DS1NfUEVSX1NFQyAKKwkgICBhbmQgKEVtdWxhdGVkX3N5c3RlbV8pQ0xPQ0tTX1BFUl9TRUMKKwkgICAxMCBob2xkcyBvbmx5IGZvciBXaW5kb3dzL0xpbnV4X2k4NikKKwkgICAqLworCXJldHVybiAxMCpyZXM7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICAgICAgICAgX2lzYXR0eSAgICAgICAoQ1JURExMLjEzNykKICAqLwogQk9PTDMyIF9fY2RlY2wgQ1JURExMX19pc2F0dHkoRFdPUkQgeCkKZGlmZiAtLWdpdCBhL21pc2MvbHN0ci5jIGIvbWlzYy9sc3RyLmMKaW5kZXggY2U4MDQ3Ni4uMjM0ZWMwNyAxMDA2NDQKLS0tIGEvbWlzYy9sc3RyLmMKKysrIGIvbWlzYy9sc3RyLmMKQEAgLTEwLDcgKzEwLDYgQEAKICNpbmNsdWRlIDxzdGRsaWIuaD4KICNpbmNsdWRlIDxzdHJpbmcuaD4KICNpbmNsdWRlIDxjdHlwZS5oPgotI2luY2x1ZGUgPHdjdHlwZS5oPgogCiAjaW5jbHVkZSAid2luZG93cy5oIgogI2luY2x1ZGUgIndpbm50LmgiCS8qIEhFQVBfIG1hY3JvcyAqLwpAQCAtMjIsNiArMjEsMTYgQEAKICNpbmNsdWRlICJzdGRkZWJ1Zy5oIgogI2luY2x1ZGUgImRlYnVnLmgiCiAKKyNpZmRlZiBIQVZFX1dDVFlQRV9ICisjIGluY2x1ZGUgPHdjdHlwZS5oPgorI2Vsc2UKKyMgZGVmaW5lIHRvd2xvd2VyKGMpIHRvbG93ZXIoYykKKyMgZGVmaW5lIHRvd3VwcGVyKGMpIHRvdXBwZXIoYykKKyMgZGVmaW5lIGlzd2FsbnVtKGMpIGlzYWxudW0oYykKKyMgZGVmaW5lIGlzd2FscGhhKGMpIGlzYWxwaGEoYykKKyMgZGVmaW5lIGlzd3VwcGVyKGMpIGlzdXBwZXIoYykKKyMgZGVmaW5lIGlzd2xvd2VyKGMpIGlzbG93ZXIoYykKKyNlbmRpZiAgLyogSEFWRV9XQ1RZUEVfSCAqLwogCiAvKiBGdW5ueSB0byBkaXZpZGUgdGhlbSBiZXR3ZWVuIHVzZXIgYW5kIGtlcm5lbC4gKi8KIApkaWZmIC0tZ2l0IGEvbWlzYy9tYWluLmMgYi9taXNjL21haW4uYwppbmRleCBiZGExNzc5Li5jYmM1NTFiIDEwMDY0NAotLS0gYS9taXNjL21haW4uYworKysgYi9taXNjL21haW4uYwpAQCAtNTIyLDYgKzUyMiw4IEBACiAgICAgTUFJTl9SZXN0b3JlU2V0dXAoKTsKICAgICBDT0xPUl9DbGVhbnVwKCk7CiAgICAgV0lOU09DS19TaHV0ZG93bigpOworICAgIC8qIEZJWE1FOiBzaG91bGQgY2hlY2sgZm9yIG90aGVyIHByb2Nlc3NlcyBvciB0aHJlYWRzICovCisgICAgRGVsZXRlQ3JpdGljYWxTZWN0aW9uKCBIRUFQX1N5c3RlbUxvY2sgKTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCmRpZmYgLS1naXQgYS9taXNjL3JlZ2lzdHJ5LmMgYi9taXNjL3JlZ2lzdHJ5LmMKaW5kZXggZmE2M2M4MC4uOTBlMjMzYyAxMDA2NDQKLS0tIGEvbWlzYy9yZWdpc3RyeS5jCisrKyBiL21pc2MvcmVnaXN0cnkuYwpAQCAtMiw2ICsyLDEwIEBACiAgKiAJUmVnaXN0cnkgRnVuY3Rpb25zCiAgKgogICogQ29weXJpZ2h0IDE5OTYgTWFyY3VzIE1laXNzbmVyCisgKgorICogRGVjZW1iZXIgMjEsIDE5OTcgLSBLZXZpbiBDb3plbnMKKyAqIEZpeGVkIGJ1Z3MgaW4gdGhlIF93OTVfbG9hZHJlZygpIGZ1bmN0aW9uLiBBZGRlZCBleHRyYSBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIHRoZSBmb3JtYXQgb2YgdGhlIFdpbmRvd3MgJzk1IHJlZ2lzdHJ5IGZpbGVzLgogICovCiAKICNpbmNsdWRlIDxzdGRsaWIuaD4KQEAgLTI1LDYgKzI5LDggQEAKICNpbmNsdWRlICJ4bWFsbG9jLmgiCiAjaW5jbHVkZSAid2lucmVnLmgiCiAKKyNkZWZpbmUJREVCVUdfVzk1X0xPQURSRUcJMAorCiAvKiBGSVhNRTogZm9sbG93aW5nIGRlZmluZXMgc2hvdWxkIGJlIGNvbmZpZ3VyZWQgZ2xvYmFsIC4uLiAqLwogCiAvKiBOT1RFOiBkbyBub3QgYXBwZW5kIGEgLy4gbGludXgnIG1rZGlyKCkgV0lMTCBGQUlMIGlmIHlvdSBkbyB0aGF0ICovCkBAIC04OTQsMTIgKzkwMCwxOSBAQAogICogMCA6CSJDUkVHIgktIG1hZ2ljCiAgKiA0IDoJRFdPUkQgdmVyc2lvbgogICogOCA6CURXT1JEIG9mZnNldF9vZl9SR0RCX3BhcnQKLSAqIDBDLi4xRjoJPyAoc29tZW9uZSBmaWxsIGluIHBsZWFzZSkKKyAqIDBDLi4wRjoJPyAoc29tZW9uZSBmaWxsIGluIHBsZWFzZSkKKyAqIDEwOiAgV09SRAludW1iZXIgb2YgUkdEQiBibG9ja3MKKyAqIDEyOiAgV09SRAk/CisgKiAxNDogIFdPUkQJYWx3YXlzIDAwMDA/CisgKiAxNjogIFdPUkQJYWx3YXlzIDAwMDE/CisgKiAxOC4uMUY6CT8gKHNvbWVvbmUgZmlsbCBpbiBwbGVhc2UpCiAgKgogICogMjA6IFJHS05fc2VjdGlvbjoKICAqICAgaGVhZGVyOgogICogCTAgOgkJIlJHS04iCS0gbWFnaWMKLSAqIAk0Li4weDFCOiAJPyAoZmlsbCBpbikKKyAqICAgICAgNCA6IERXT1JECW9mZnNldCB0byBmaXJzdCBSR0RCIHNlY3Rpb24KKyAqICAgICAgOCA6IERXT1JECW9mZnNldCB0byA/CisgKiAJQy4uMHgxQjogCT8gKGZpbGwgaW4pCiAgKiAgICAgIDB4MjAgLi4uIG9mZnNldF9vZl9SR0RCX3BhcnQ6IERpc2sgS2V5IEVudHJ5IHN0cnVjdHVyZXMKICAqCiAgKiAgIERpc2sgS2V5IEVudHJ5IFN0cnVjdHVyZToKQEAgLTkyOCw4ICs5NDEsMTIgQEAKICAqCiAgKiBSR0RCX3NlY3Rpb246CiAgKiAJMDA6CQkiUkdEQiIJLSBtYWdpYwotICoJMDQ6IERXT1JECW9mZnNldCB0byBuZXh0IFJHREIgc2VjdGlvbiAocGVyaGFwcyBXT1JEKQotICoJMDguLi4xRjoJPworICoJMDQ6IERXT1JECW9mZnNldCB0byBuZXh0IFJHREIgc2VjdGlvbgorICoJMDg6IERXT1JECT8KKyAqCTBDOiBXT1JECWFsd2F5cyAwMDBkPworICoJMEU6IFdPUkQJUkdEQiBibG9jayBudW1iZXIKKyAqCTEwOglEV09SRAk/IChlcXVhbHMgdmFsdWUgYXQgb2Zmc2V0IDQgLSB2YWx1ZSBhdCBvZmZzZXQgOCkKKyAqCTE0Li4xRjoJCT8KICAqCTIwLi4uLi46CWRpc2sga2V5cwogICoKICAqIGRpc2sga2V5OgpAQCAtOTU3LDYgKzk3NCwxMCBAQAogICogc3RydWN0dXJlKSBhbmQgcmVhZGluZyBhbm90aGVyIFJHREJfc2VjdGlvbi4KICAqIHJlcGVhdCB1bnRpbCBlbmQgb2YgZmlsZS4KICAqCisgKiBBbiBpbnRlcmVzdGluZyByZWxhdGlvbnNoaXAgZXhpc3RzIGluIFJHREJfc2VjdGlvbi4gVGhlIHZhbHVlIGF0IG9mZnNldAorICogMTAgZXF1YWxzIHRoZSB2YWx1ZSBhdCBvZmZzZXQgNCBtaW51cyB0aGUgdmFsdWUgYXQgb2Zmc2V0IDguIEkgaGF2ZSBubworICogaWRlYSBhdCB0aGUgbW9tZW50IHdoYXQgdGhpcyBtZWFucy4gIChLZXZpbiBDb3plbnMpCisgKgogICogRklYTUU6IHRoaXMgZGVzY3JpcHRpb24gbmVlZHMgc29tZSBzZXJpb3VzIGhlbHAsIHllcy4KICAqLwogCkBAIC05ODQsOSArMTAwNSwxMCBAQAogfTsKIAogLyogZmFzdCBsb29rdXAgdGFibGUgZGtlYWRkci0+bnIgKi8KLXN0cnVjdAlfdzk1bnIyZGEgeworc3RydWN0IAlfdzk1bnIyZGEgewogCXVuc2lnbmVkIGxvbmcJCWRrZWFkZHI7CiAJdW5zaWduZWQgbG9uZwkJbnI7CisJc3RydWN0IF93OTVrZXkJCSprZXk7CiB9OwogCiAKQEAgLTEwNjksMjcgKzEwOTEsMjcgQEAKIAogc3RhdGljIHN0cnVjdCBfdzk1a2V5KgogX3c5NWRrZWxvb2t1cCh1bnNpZ25lZCBsb25nIGRrZWFkZHIsaW50IG4sc3RydWN0IF93OTVucjJkYSAqbnIyZGEsc3RydWN0IF93OTVrZXkgKmtleXMpIHsKLQlpbnQJaTsKLSAgICAgICAgaW50ICAgICBsZWZ0LCByaWdodDsKK2ludAlpOworaW50IGxlZnQsIHJpZ2h0OwogCiAJaWYgKGRrZWFkZHIgPT0gMHhGRkZGRkZGRikKIAkJcmV0dXJuIE5VTEw7CiAJaWYgKGRrZWFkZHI8MHgyMCkKIAkJcmV0dXJuIE5VTEw7CiAJZGtlYWRkcj1fdzk1X2Fkal9kYShka2VhZGRyKzB4MWMpOwotICAgICAgICBsZWZ0PTA7Ci0gICAgICAgIHJpZ2h0PW4tMTsKLSAgICAgICAgd2hpbGUobGVmdDw9cmlnaHQpCi0gICAgICAgIHsKLSAgICAgICAgICAgaT0obGVmdCtyaWdodCkvMjsKLSAgICAgICAgICAgCi0gICAgICAgICAgIGlmKG5yMmRhW2ldLmRrZWFkZHIgPT0gZGtlYWRkcikKLSAgICAgICAgICAgICAgcmV0dXJuIGtleXMrbnIyZGFbaV0ubnI7Ci0gICAgICAgICAgIGVsc2UgaWYobnIyZGFbaV0uZGtlYWRkciA8IGRrZWFkZHIpCi0gICAgICAgICAgICAgIGxlZnQ9aSsxOwotICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgIHJpZ2h0PWktMTsKLSAgICAgICAgfQorCWxlZnQ9MDsKKwlyaWdodD1uLTE7CisJd2hpbGUobGVmdDw9cmlnaHQpCisJeworCQlpPShsZWZ0K3JpZ2h0KS8yOworCisJCWlmKG5yMmRhW2ldLmRrZWFkZHIgPT0gZGtlYWRkcikKKwkJCXJldHVybiBucjJkYVtpXS5rZXk7CisJCWVsc2UgaWYobnIyZGFbaV0uZGtlYWRkciA8IGRrZWFkZHIpCisJCQlsZWZ0PWkrMTsKKwkJZWxzZQorCQkJcmlnaHQ9aS0xOworCX0KIAkvKiAweDNDIGhhcHBlbnMgb2Z0ZW4sIGp1c3QgcmVwb3J0IHVudXN1YWwgdmFsdWVzICovCiAJaWYgKGRrZWFkZHIhPTB4M2MpCiAJCWRwcmludGZfcmVnKHN0ZGRlYiwic2VhcmNoIGhhc24ndCBmb3VuZCBka2VhZGRyICVseD9cbiIsZGtlYWRkcik7CkBAIC0xMTI5LDEzICsxMTUxLDEzIEBACiAJCXVuc2lnbmVkIHNob3J0CQl2YWxkYXRhbGVuOwogCQkvKiB2YWxuYW1lLCB2YWxkYXRhICovCiAJfTsKLQlzdHJ1Y3QJX3c5NW5yMmRhIAkqbnIyZGE7CisgICAgc3RydWN0ICBfdzk1bnIyZGEgICAqbnIyZGE7CiAKIAlIRklMRTMyCQloZmQ7CiAJaW50CQlsYXN0bW9kaWZpZWQ7CiAJY2hhcgkJbWFnaWNbNV07Ci0JdW5zaWduZWQgbG9uZwlucixwb3MsaSx3aGVyZSx2ZXJzaW9uLHJnZGJzZWN0aW9uLGVuZCxvZmZfbmV4dF9yZ2RiOwotCXN0cnVjdAlfdzk1a2V5CSprZXlzOworCXVuc2lnbmVkIGxvbmcJbnIscG9zLGksaix3aGVyZSx2ZXJzaW9uLHJnZGJzZWN0aW9uLGVuZCxvZmZfbmV4dF9yZ2RiOworCXN0cnVjdAlfdzk1a2V5CSprZXlzLCprZXk7CiAJaW50CQlucm9mZGtlczsKIAl1bnNpZ25lZCBjaGFyCSpkYXRhLCpjdXJkYXRhLCpuZXh0cmdkYjsKIAlPRlNUUlVDVAlvZnM7CkBAIC0xMTcxLDcgKzExOTMsMTMgQEAKIAl3aGVyZQk9IDB4NDA7CiAJZW5kCT0gcmdkYnNlY3Rpb247CiAKLQlucm9mZGtlcyA9IChlbmQtd2hlcmUpL3NpemVvZihzdHJ1Y3QgZGtlKSsxMDA7CisJLyogSSByZW1vdmVkIHRoZSAnKzEwMCcgdGhhdCB3YXMgaGVyZS4gVGhlIGFkanVzdG1lbnRzIHRvIGRrZWFkZHIgICAqLworCS8qIGltcGx5IGFsaWdubWVudHMgdG8gdGhlIGRhdGEgaW4gJ2RhdGEnIHdoaWNoIHdvdWxkIG1lYW4gaXQgaXMgICAgKi8KKwkvKiBsYXJnZXIgdGhhbiB0aGUgbnVtYmVyIG9mIGRrZSBlbnRyaWVzIGl0IGhvbGRzIHRoZXJlZm9yZSBucm9mZGtlcyovCisJLyogd291bGQgYmUgZXF1YWwgdG8gb3IgbGFyZ2VyIHRoYW4gaXQgbmVlZHMgdG8gYmUgd2l0aG91dCB0aGUgbmVlZCAqLworCS8qIGZvciB0aGUgKzEwMCAtIGtjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKwlucm9mZGtlcyA9IChlbmQtd2hlcmUpL3NpemVvZihzdHJ1Y3QgZGtlKTsKKwogCWRhdGEgPSAoY2hhciopeG1hbGxvYyhlbmQtd2hlcmUpOwogCWlmICgoZW5kLXdoZXJlKSE9X2xyZWFkMzIoaGZkLGRhdGEsZW5kLXdoZXJlKSkKIAkJcmV0dXJuOwpAQCAtMTE3OSw5ICsxMjA3LDEyIEBACiAKIAlrZXlzID0gKHN0cnVjdCBfdzk1a2V5Kil4bWFsbG9jKG5yb2Zka2VzICogc2l6ZW9mKHN0cnVjdCBfdzk1a2V5KSk7CiAJbWVtc2V0KGtleXMsJ1wwJyxucm9mZGtlcypzaXplb2Yoc3RydWN0IF93OTVrZXkpKTsKLQlucjJkYT0gKHN0cnVjdCBfdzk1bnIyZGEqKXhtYWxsb2MobnJvZmRrZXMgKiBzaXplb2Yoc3RydWN0IF93OTVucjJkYSkpOwotCW1lbXNldChucjJkYSwnXDAnLG5yb2Zka2VzKnNpemVvZihzdHJ1Y3QgX3c5NW5yMmRhKSk7CisgICAgbnIyZGE9IChzdHJ1Y3QgX3c5NW5yMmRhKil4bWFsbG9jKG5yb2Zka2VzICogc2l6ZW9mKHN0cnVjdCBfdzk1bnIyZGEpKTsKKyAgICBtZW1zZXQobnIyZGEsJ1wwJyxucm9mZGtlcypzaXplb2Yoc3RydWN0IF93OTVucjJkYSkpOwogCisjaWYgREVCVUdfVzk1X0xPQURSRUcKKwlkcHJpbnRmX3JlZyhzdGRkZWIsIm5yb2Zka2VzID0gJWRcbiIsIG5yb2Zka2VzKTsKKyNlbmRpZgogCWZvciAoaT0wO2k8bnJvZmRrZXM7aSsrKSB7CiAJCXN0cnVjdAlka2UJZGtlOwogCQl1bnNpZ25lZCBsb25nIAlka2VhZGRyOwpAQCAtMTE5MCw2ICsxMjIxLDEwIEBACiAJCW1lbWNweSgmZGtlLGN1cmRhdGEsc2l6ZW9mKGRrZSkpOwogCQljdXJkYXRhKz1zaXplb2YoZGtlKTsKIAkJbnIgPSBka2UubnJMUyArIChka2UubnJNUzw8OCk7CisjaWYgREVCVUdfVzk1X0xPQURSRUcKKwkJZHByaW50Zl9yZWcoc3RkZGViLCIlbGQ6IG5yID0gJWxkLCBuck1TOm5yTFMgPSAlMDRYOiVYXG4iLAorCQkJCQlpLG5yLGRrZS5uck1TLGRrZS5uckxTKTsKKyNlbmRpZgogCQlka2VhZGRyPXBvcy00OwogCQlpZiAoKGRrZWFkZHImMHhGRkYpPDB4MDE4KSB7CiAJCQlpbnQJZGlmZjsKQEAgLTExOTksNiArMTIzNCwxMCBAQAogCQkJY3VyZGF0YSs9ZGlmZi1zaXplb2YoZGtlKTsKIAkJCW1lbWNweSgmZGtlLGN1cmRhdGEsc2l6ZW9mKGRrZSkpOwogCQkJbnIgPSBka2UubnJMUyArIChka2UubnJNUzw8OCk7CisjaWYgREVCVUdfVzk1X0xPQURSRUcKKwkJCWRwcmludGZfcmVnKHN0ZGRlYiwiPiBuciA9ICVsdSwgbnJNUzpuckxTID0gJTA0WDolWFxuIiwKKwkJCQkJCW5yLGRrZS5uck1TLGRrZS5uckxTKTsKKyNlbmRpZgogCQkJY3VyZGF0YSs9c2l6ZW9mKGRrZSk7CiAJCX0KIAkJaWYgKCgoZGtlYWRkcisweDFDKSYweEZGRik8MHgxQykgewpAQCAtMTIwNiw0NiArMTI0NSw2MyBAQAogCQkJICogYnV0IE9OTFkgaWYgd2UgYXJlID4weDEwMDAgYWxyZWFkeQogCQkJICovCiAJCQlpZiAoZGtlYWRkciAmIH4weEZGRikKLQkJCQlka2VhZGRyID0gZGtlYWRkciAmIH4weEZGRjsKKwkJCQlka2VhZGRyICY9IH4weEZGRjsKIAkJfQotCQlpZiAobnI+bnJvZmRrZXMpIHsKLQkJCS8qIDB4RkZGRkZGRkYgaGFwcGVucyBvZnRlbiwganVzdCByZXBvcnQgdW51c3VhbCB2YWx1ZXMgKi8KLQkJCWlmIChuciE9MHhGRkZGRkZGRikKLQkJCQlkcHJpbnRmX3JlZyhzdGRkZWIsIm5yICVsZCBleGNlZWRzIG5yb2Zka2VzICVkLCBza2lwcGluZy5cbiIsbnIsbnJvZmRrZXMpOworCQkvKiBGb3IgdGhlIHRpbWUgYmVpbmcgd2Ugd2lsbCBhc3N1bWUgdGhhdCBhbGwgdmFsdWVzIG9mICovCisJCS8qIG5yIGFyZSB2YWxpZCB1bmxlc3MgdGhlIGZvbGxvd2luZyBjb25kaXRpb24gaXMgdHJ1ZS4gKi8KKwkJLyogVGhpcyB2YWx1ZSBpcyBvYnRhaW5lZCB3aGVuIGRrZS5uckxTIGFuZCBka2UubnJNUyBhcmUqLworCQkvKiBib3RoIEZGRkYgYXMgZGtlLm5yTVMgaXMgb25seSBzaGlmdGVkIGJ5IDggYmVmb3JlIHRoZSovCisJCS8qIGFkZCBhbmQgbm90IDE2LiAta2MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKwkJaWYgKG5yPT0weDAxMDBGRUZGKQogCQkJY29udGludWU7CisJCWZvciAoaiA9IDA7IGogPCBpOyArK2opIHsKKwkJCWlmIChucjJkYVtqXS5uciA9PSBucikKKwkJCQlicmVhazsKIAkJfQotCQlpZiAoa2V5c1tucl0uZGtlYWRkcikgewotCQkJaW50CXg7CisJCWlmIChqIDwgaSkgeworCQkJa2V5ID0gbnIyZGFbal0ua2V5OworCQkJaWYgKGtleSAmJiBrZXktPmRrZWFkZHIpIHsKKwkJCQlpbnQJeDsKIAotCQkJZm9yICh4PXNpemVvZihka2UpO3gtLTspCi0JCQkJaWYgKCgoY2hhciopJmRrZSlbeF0pCi0JCQkJCWJyZWFrOwotCQkJaWYgKHg9PS0xKQotCQkJCWJyZWFrOyAvKiBmaW5pc2hlZCByZWFkaW5nIGlmIHdlIGdvdCBvbmx5IDAgKi8KLQkJCWlmIChucikgewotCQkJCWlmICgJKGRrZS5uZXh0IT0obG9uZylrZXlzW25yXS5uZXh0KQl8fAotCQkJCQkoZGtlLm5leHRzdWIhPShsb25nKWtleXNbbnJdLm5leHRzdWIpCXx8Ci0JCQkJCShka2UucHJldmx2bCE9KGxvbmcpa2V5c1tucl0ucHJldmx2bCkgCi0JCQkJKQotCQkJCQlkcHJpbnRmX3JlZyhzdGRkZWIsImtleSBkb3VibGVkPyBucj0lbGQsa2V5LT5ka2VhZGRyPSVseCxka2VhZGRyPSVseFxuIixucixrZXlzW25yXS5ka2VhZGRyLGRrZWFkZHIpOworCQkJCWZvciAoeD1zaXplb2YoZGtlKTt4LS07KQorCQkJCQlpZiAoKChjaGFyKikmZGtlKVt4XSkKKwkJCQkJCWJyZWFrOworCQkJCWlmICh4PT0tMSkKKwkJCQkJYnJlYWs7CS8qIGZpbmlzaGVkIHJlYWRpbmcgaWYgd2UgZ290IG9ubHkgMCAqLworCQkJCWlmIChucikgeworCQkJCQlpZiAoKGRrZS5uZXh0IT0obG9uZylrZXktPm5leHQpIHx8CisJCQkJCQkoZGtlLm5leHRzdWIhPShsb25nKWtleS0+bmV4dHN1YikgfHwKKwkJCQkJCShka2UucHJldmx2bCE9KGxvbmcpa2V5LT5wcmV2bHZsKSAKKwkJCQkJKQorCQkJCQkJZHByaW50Zl9yZWcoc3RkZGViLCJrZXkgZG91YmxlZD8gbnI9JWx1LGtleS0+ZGtlYWRkcj0lbHgsZGtlYWRkcj0lbHhcbiIsbnIsa2V5LT5ka2VhZGRyLGRrZWFkZHIpOworCQkJCX0KKwkJCQljb250aW51ZTsKIAkJCX0KLQkJCWNvbnRpbnVlOwogCQl9Ci0JCW5yMmRhW2ldLm5yCSA9IG5yOworI2lmIERFQlVHX1c5NV9MT0FEUkVHCisJCWRwcmludGZfcmVnKHN0ZGRlYiwiLSBucj0lbHUsZGtlYWRkcj0lbHhcbiIsbnIsZGtlYWRkcik7CisjZW5kaWYKKwkJbnIyZGFbaV0ubnIgPSBucjsKIAkJbnIyZGFbaV0uZGtlYWRkciA9IGRrZWFkZHI7CisJCW5yMmRhW2ldLmtleSA9ICZrZXlzW2ldOwogCi0JCWtleXNbbnJdLmRrZWFkZHIgPSBka2VhZGRyOwotCQlrZXlzW25yXS54MSA9IGRrZS54MTsKLQkJa2V5c1tucl0ueDIgPSBka2UueDI7Ci0JCWtleXNbbnJdLngzID0gZGtlLngzOwotCQlrZXlzW25yXS5wcmV2bHZsPSAoc3RydWN0IF93OTVrZXkqKWRrZS5wcmV2bHZsOwotCQlrZXlzW25yXS5uZXh0c3ViPSAoc3RydWN0IF93OTVrZXkqKWRrZS5uZXh0c3ViOwotCQlrZXlzW25yXS5uZXh0IAk9IChzdHJ1Y3QgX3c5NWtleSopZGtlLm5leHQ7CisJCWtleXNbaV0uZGtlYWRkciA9IGRrZWFkZHI7CisJCWtleXNbaV0ueDEgPSBka2UueDE7CisJCWtleXNbaV0ueDIgPSBka2UueDI7CisJCWtleXNbaV0ueDMgPSBka2UueDM7CisJCWtleXNbaV0ucHJldmx2bD0gKHN0cnVjdCBfdzk1a2V5Kilka2UucHJldmx2bDsKKwkJa2V5c1tpXS5uZXh0c3ViPSAoc3RydWN0IF93OTVrZXkqKWRrZS5uZXh0c3ViOworCQlrZXlzW2ldLm5leHQgCT0gKHN0cnVjdCBfdzk1a2V5Kilka2UubmV4dDsKIAl9CiAJZnJlZShkYXRhKTsKIAorCW5yb2Zka2VzID0gaTsJLyogVGhpcyBpcyB0aGUgcmVhbCBudW1iZXIgb2YgZGtlIGVudHJpZXMgKi8KKyNpZiBERUJVR19XOTVfTE9BRFJFRworCWRwcmludGZfcmVnKHN0ZGRlYiwibnJvZmRrZXMgPSAlZFxuIiwgbnJvZmRrZXMpOworI2VuZGlmCisKIAlxc29ydChucjJkYSxucm9mZGtlcyxzaXplb2YobnIyZGFbMF0pLAotICAgICAgICAgICAgICAoaW50KCopKGNvbnN0IHZvaWQgKixjb25zdCB2b2lkKikpX3c5NWRrZWNvbXApOworICAgICAgICAgICAgICAoaW50KCopKGNvbnN0IHZvaWQgKixjb25zdCB2b2lkICopKV93OTVka2Vjb21wKTsKIAogCS8qIFNURVAgMjoga2V5ZGF0YSAmIHZhbHVlcyAqLwogCWlmICghR2V0RmlsZUluZm9ybWF0aW9uQnlIYW5kbGUoaGZkLCZoZmRpbmZvKSkKQEAgLTEyNjcsMTEgKzEzMjMsMTIgQEAKIAkJZHByaW50Zl9yZWcoc3RkZGViLCJ0aGlyZCBJRkYgaGVhZGVyIG5vdCBSR0RCLCBidXQgJXNcbiIsbWFnaWMpOwogCQlyZXR1cm47CiAJfQorCiAJY3VyZGF0YT1kYXRhKzB4MjA7CiAJd2hpbGUgKDEpIHsKIAkJc3RydWN0CWRraCBka2g7Ci0JCWludAlieXRlc3JlYWQ7Ci0JCXN0cnVjdAlfdzk1a2V5CSprZXkseGtleTsKKwkJaW50CQlieXRlc3JlYWQ7CisJCXN0cnVjdAlfdzk1a2V5CXhrZXk7CS8qIFVzZWQgaW5zaWRlIHNlY29uZCBtYWluIGxvb3AgKi8KIAogCQlieXRlc3JlYWQgPSAwOwogCQlpZiAoY3VyZGF0YT49bmV4dHJnZGIpIHsKQEAgLTEyOTQsMTkgKzEzNTEsMjYgQEAKIAogCQlYUkVBRCgmZGtoLHNpemVvZihka2gpKTsKIAkJbnIgPSBka2gubnJMUyArIChka2gubnJNUzw8OCk7Ci0JCWlmICgobnI+bnJvZmRrZXMpIHx8IChka2gubnJMUyA9PSAweEZGRkYpKSB7Ci0JCQlpZiAoZGtoLm5yTFMgPT0gMHhGRkZGKSB7CisJCWlmIChka2gubnJMUyA9PSAweEZGRkYpIHsKIAkJCQkvKiBza2lwIG92ZXIga2V5IHVzaW5nIG5leHRrZXlvZmYgKi8KICAJCQkJY3VyZGF0YSs9ZGtoLm5leHRrZXlvZmYtc2l6ZW9mKHN0cnVjdCBka2gpOwogCQkJCWNvbnRpbnVlOworCQl9IAorCQlmb3IgKGkgPSAwOyBpIDwgbnJvZmRrZXM7ICsraSkgeworCQkJaWYgKG5yMmRhW2ldLm5yID09IG5yICYmIG5yMmRhW2ldLmRrZWFkZHIpIHsKKwkJCQlrZXkgPSBucjJkYVtpXS5rZXk7CisJCQkJYnJlYWs7CiAJCQl9Ci0JCQlkcHJpbnRmX3JlZyhzdGRkZWIsImhhdmVuJ3QgZm91bmQgbnIgJWxkLlxuIixucik7CisJCX0KKwkJaWYgKGkgPj0gbnJvZmRrZXMpIHsKKwkJCS8qIE1vdmUgdGhlIG5leHQgc3RhdGVtZW50IHRvIGp1c3QgYmVmb3JlIHRoZSBwcmV2aW91cyBmb3IgKi8KKwkJCS8qIGxvb3AgdG8gcHJldmVudCB0aGUgY29tcGlsZXIgZnJvbSBpc3N1aW5nIGEgd2FybmluZyAta2MgKi8KIAkJCWtleSA9ICZ4a2V5OwogCQkJbWVtc2V0KGtleSwnXDAnLHNpemVvZih4a2V5KSk7CisJCQlkcHJpbnRmX3JlZyhzdGRkZWIsImhhdmVuJ3QgZm91bmQgbnIgJWx1LlxuIixucik7CiAJCX0gZWxzZSB7Ci0JCQlrZXkgPSBrZXlzK25yOwogCQkJaWYgKCFrZXktPmRrZWFkZHIpCi0JCQkJZHByaW50Zl9yZWcoc3RkZGViLCJrZXkgd2l0aCBucj0lbGQgaGFzIG5vIGRrZWFkZHI/XG4iLG5yKTsKKwkJCQlkcHJpbnRmX3JlZyhzdGRkZWIsImtleSB3aXRoIG5yPSVsdSBoYXMgbm8gZGtlYWRkcj9cbiIsbnIpOwogCQl9CiAJCWtleS0+bnJvZnZhbHMJPSBka2gudmFsdWVzOwogCQlrZXktPm5hbWUJPSAoY2hhciopeG1hbGxvYyhka2gua2V5bmFtZWxlbisxKTsKQEAgLTEzNDAsNyArMTQwNCw3IEBACiAJCWlmIChieXRlc3JlYWQgIT0gZGtoLm5leHRrZXlvZmYpIHsKIAkJCWlmIChka2guYnl0ZXN1c2VkICE9IGJ5dGVzcmVhZCkKIAkJCQlkcHJpbnRmX3JlZyhzdGRkZWIsCi0JCQkJCSJyZWFkIGhhcyBkaWZmZXJlbmNlIGluIHJlYWQgYnl0ZXMgKCVkKSBhbmQgbmV4dG9mZnNldCAoJWxkKSAoYnl0ZXN1c2VkPSVsZClcbiIsYnl0ZXNyZWFkLGRraC5uZXh0a2V5b2ZmLAorCQkJCQkicmVhZCBoYXMgZGlmZmVyZW5jZSBpbiByZWFkIGJ5dGVzICglZCkgYW5kIG5leHRvZmZzZXQgKCVsdSkgKGJ5dGVzdXNlZD0lbHUpXG4iLGJ5dGVzcmVhZCxka2gubmV4dGtleW9mZiwKIAkJCQkJZGtoLmJ5dGVzdXNlZAogCQkJCSk7CiAJCQljdXJkYXRhICs9IGRraC5uZXh0a2V5b2ZmLWJ5dGVzcmVhZDsKQEAgLTEzNTMsNiArMTQxNyw3IEBACiAJfQogCWZyZWUoZGF0YSk7CiAJX3c5NV93YWxrX3RyZWUobHBrZXksa2V5cyk7CisJZnJlZShucjJkYSk7CiAJZnJlZShrZXlzKTsKIH0KIApkaWZmIC0tZ2l0IGEvbWlzYy9zaGVsbG9yZC5jIGIvbWlzYy9zaGVsbG9yZC5jCmluZGV4IDNhMWE2ZGMuLjFkNGY4NTcgMTAwNjQ0Ci0tLSBhL21pc2Mvc2hlbGxvcmQuYworKysgYi9taXNjL3NoZWxsb3JkLmMKQEAgLTgzLDcgKzgzLDcgQEAKICAqCSAJCSBTSEVMTDMyXzMwICAgCQkJW1NIRUxMMzIuMzBdCiAgKiBnZXRfcm9vdGRpcihjaGFyKnBhdGgsaW50IGRyaXZlKQogICovCi1EV09SRCBXSU5BUEkgU0hFTEwzMl8zMChMUFNUUiByb290LEJZVEUgZHJpdmUpIHsKK0xQU1RSIFdJTkFQSSBTSEVMTDMyXzMwKExQU1RSIHJvb3QsQllURSBkcml2ZSkgewogCXN0cmNweShyb290LCJBOlxcIik7CiAJcm9vdFswXSs9ZHJpdmU7CiAJcmV0dXJuIHJvb3Q7CmRpZmYgLS1naXQgYS9taXNjL3R3ZWFrLmMgYi9taXNjL3R3ZWFrLmMKaW5kZXggMGQ4OGQwYi4uM2ZhMjc4MiAxMDA2NDQKLS0tIGEvbWlzYy90d2Vhay5jCisrKyBiL21pc2MvdHdlYWsuYwpAQCAtMzMsNyArMzMsNiBAQAogI2luY2x1ZGUgImdyYXBoaWNzLmgiCiAjaW5jbHVkZSAib3B0aW9ucy5oIgogI2luY2x1ZGUgInN0YWNrZnJhbWUuaCIKLSNpbmNsdWRlICJzeXNjb2xvci5oIgogI2luY2x1ZGUgInR3ZWFrLmgiCiAjaW5jbHVkZSAid2luZG93cy5oIgogCmRpZmYgLS1naXQgYS9taXNjL3Zlci5jIGIvbWlzYy92ZXIuYwppbmRleCA4ODNhZjBkLi40MGMzMjQxIDEwMDY0NAotLS0gYS9taXNjL3Zlci5jCisrKyBiL21pc2MvdmVyLmMKQEAgLTg0Myw4ICs4NDMsMTMgQEAKIAlMUFNUUiBjdXJkaXIsVUlOVDMyICpwY3VyZGlybGVuLExQU1RSIGRlc3RkaXIsVUlOVDMyICpwZGVzdGRpcmxlbiApCiB7CiAgICAgVUlOVDE2IGN1cmRpcmxlbiwgZGVzdGRpcmxlbjsKLSAgICBEV09SRCByZXQgPSBWZXJGaW5kRmlsZTE2KGZsYWdzLGZpbGVuYW1lLHdpbmRpcixhcHBkaXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJkaXIsJmN1cmRpcmxlbixkZXN0ZGlyLCZkZXN0ZGlybGVuKTsKKyAgICBEV09SRCByZXQ7CisgICAgCisgICAgY3VyZGlybGVuID0gKFVJTlQxNikqcGN1cmRpcmxlbjsKKyAgICBkZXN0ZGlybGVuPSAoVUlOVDE2KSpwZGVzdGRpcmxlbjsKKworICAgIHJldCA9IFZlckZpbmRGaWxlMTYoZmxhZ3MsZmlsZW5hbWUsd2luZGlyLGFwcGRpciwKKyAgICAgICAgICAgICAgICAgICAgICAgIGN1cmRpciwmY3VyZGlybGVuLGRlc3RkaXIsJmRlc3RkaXJsZW4pOwogICAgICpwY3VyZGlybGVuID0gY3VyZGlybGVuOwogICAgICpwZGVzdGRpcmxlbiA9IGRlc3RkaXJsZW47CiAgICAgcmV0dXJuIHJldDsKZGlmZiAtLWdpdCBhL21pc2Mvd2luc29jay5jIGIvbWlzYy93aW5zb2NrLmMKaW5kZXggYjk0YmIzYy4uODhjNzQwYyAxMDA2NDQKLS0tIGEvbWlzYy93aW5zb2NrLmMKKysrIGIvbWlzYy93aW5zb2NrLmMKQEAgLTE3MCw2ICsxNzAsMTAgQEAKIAkJICAgIEZEX1NFVChwd3MtPmZkLCBmZHMpOwogCSAgICAgfQogCX0KKwlpZiAoYjMyKQorCSAgICAgd3NmZHMzMi0+ZmRfY291bnQgPSAwOworCWVsc2UKKwkgICAgIHdzZmRzMTYtPmZkX2NvdW50ID0gMDsKICN1bmRlZiB3c2ZkczMyCiAjdW5kZWYgd3NmZHMxNgogCXJldHVybiBmZHM7CkBAIC03OTEsNyArNzk1LDcgQEAKICAgICBJTlQzMiAqcCA9ICZvcHRsZW4zMjsKICAgICBJTlQzMiByZXRWYWw7CiAgICAgaWYoIG9wdGxlbiApIG9wdGxlbjMyID0gKm9wdGxlbjsgZWxzZSBwID0gTlVMTDsKLSAgICByZXRWYWwgPSBXSU5TT0NLX2dldHNvY2tvcHQzMiggcywgbGV2ZWwsIG9wdG5hbWUsIG9wdHZhbCwgcCApOworICAgIHJldFZhbCA9IFdJTlNPQ0tfZ2V0c29ja29wdDMyKCBzLCAoVUlOVDE2KWxldmVsLCBvcHRuYW1lLCBvcHR2YWwsIHAgKTsKICAgICBpZiggb3B0bGVuICkgKm9wdGxlbiA9IG9wdGxlbjMyOwogICAgIHJldHVybiAoSU5UMTYpcmV0VmFsOwogfQpAQCAtMTIyNiw3ICsxMjMwLDcgQEAKIAlvcHR2YWwgPSAoY2hhciopJmxpbmdlcjMyOwogCW9wdGxlbiA9IHNpemVvZihsaW5nZXIzMik7CiAgICAgfQotICAgIHJldHVybiAoSU5UMTYpV0lOU09DS19zZXRzb2Nrb3B0MzIoIHMsIGxldmVsLCBvcHRuYW1lLCBvcHR2YWwsIG9wdGxlbiApOworICAgIHJldHVybiAoSU5UMTYpV0lOU09DS19zZXRzb2Nrb3B0MzIoIHMsIChVSU5UMTYpbGV2ZWwsIG9wdG5hbWUsIG9wdHZhbCwgb3B0bGVuICk7CiB9CiAKIApkaWZmIC0tZ2l0IGEvbWlzYy93c3ByaW50Zi5jIGIvbWlzYy93c3ByaW50Zi5jCmluZGV4IDdkNTcyMDkuLjkzNmFmZDAgMTAwNjQ0Ci0tLSBhL21pc2Mvd3NwcmludGYuYworKysgYi9taXNjL3dzcHJpbnRmLmMKQEAgLTQwLDYgKzQwLDggQEAKICAgICBXUFJJTlRGX1RZUEUgICB0eXBlOwogfSBXUFJJTlRGX0ZPUk1BVDsKIAorc3RhdGljIGNvbnN0IENIQVIgbnVsbF9zdHJpbmdBW10gPSAiKG51bGwpIjsKK3N0YXRpYyBjb25zdCBXQ0hBUiBudWxsX3N0cmluZ1dbXSA9IHsgJygnLCAnbicsICd1JywgJ2wnLCAnbCcsICcpJywgMCB9OwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBXUFJJTlRGX1BhcnNlRm9ybWF0QQpAQCAtMjAxLDExICsyMDMsMTMgQEAKICAgICBjYXNlIFdQUl9XQ0hBUjoKICAgICAgICAgcmV0dXJuIChmb3JtYXQtPnByZWNpc2lvbiA9IDEpOwogICAgIGNhc2UgV1BSX1NUUklORzoKKyAgICAgICAgaWYgKCEqKExQQ1NUUiAqKWFyZykgKihMUENTVFIgKilhcmcgPSBudWxsX3N0cmluZ0E7CiAgICAgICAgIGZvciAobGVuID0gMDsgIWZvcm1hdC0+cHJlY2lzaW9uIHx8IChsZW4gPCBmb3JtYXQtPnByZWNpc2lvbik7IGxlbisrKQogICAgICAgICAgICAgaWYgKCEqKCooTFBDU1RSICopYXJnICsgbGVuKSkgYnJlYWs7CiAgICAgICAgIGlmIChsZW4gPiBtYXhsZW4pIGxlbiA9IG1heGxlbjsKICAgICAgICAgcmV0dXJuIChmb3JtYXQtPnByZWNpc2lvbiA9IGxlbik7CiAgICAgY2FzZSBXUFJfV1NUUklORzoKKyAgICAgICAgaWYgKCEqKExQQ1dTVFIgKilhcmcpICooTFBDV1NUUiAqKWFyZyA9IG51bGxfc3RyaW5nVzsKICAgICAgICAgZm9yIChsZW4gPSAwOyAhZm9ybWF0LT5wcmVjaXNpb24gfHwgKGxlbiA8IGZvcm1hdC0+cHJlY2lzaW9uKTsgbGVuKyspCiAgICAgICAgICAgICBpZiAoISooKihMUENXU1RSICopYXJnICsgbGVuKSkgYnJlYWs7CiAgICAgICAgIGlmIChsZW4gPiBtYXhsZW4pIGxlbiA9IG1heGxlbjsKZGlmZiAtLWdpdCBhL21zZG9zL2ludDIxLmMgYi9tc2Rvcy9pbnQyMS5jCmluZGV4IGI2NTRlNWYuLmFlMDMzMDggMTAwNjQ0Ci0tLSBhL21zZG9zL2ludDIxLmMKKysrIGIvbXNkb3MvaW50MjEuYwpAQCAtNjk2LDcgKzY5Niw3IEBACiAgICAgQllURSBhdHRyOwogICAgIGludCBjb3VudDsKIAotICAgIGlmICgqZmNiID09IDB4ZmYpCisgICAgaWYgKCpmY2IgPT0gMHhmZikgLyogZXh0ZW5kZWQgRkNCID8gKi8KICAgICB7CiAgICAgICAgIGF0dHIgPSBmY2JbNl07CiAgICAgICAgIHBGQ0IgPSAoRklOREZJTEVfRkNCICopKGZjYiArIDcpOwpAQCAtNzE4LDYgKzcxOCwxNCBAQAogICAgIH0KICAgICBwRkNCLT5jb3VudCArPSBjb3VudDsKIAorICAgIGlmICgqZmNiID09IDB4ZmYpIHsgLyogcGxhY2UgZXh0ZW5kZWQgRkNCIGhlYWRlciBiZWZvcmUgcFJlc3VsdCBpZiBjYWxsZWQgd2l0aCBleHRlbmRlZCBGQ0IgKi8KKwkqKEJZVEUgKilwUmVzdWx0ID0gMHhmZjsKKwkoQllURSAqKXBSZXN1bHQgKz02OyAvKiBsZWF2ZSByZXNlcnZlZCBmaWVsZCBiZWhpbmQgKi8KKwkqKEJZVEUgKilwUmVzdWx0ID0gZW50cnkuZHdGaWxlQXR0cmlidXRlczsKKwkoKEJZVEUgKilwUmVzdWx0KSsrOworICAgIH0KKyAgICAqKEJZVEUgKilwUmVzdWx0ID0gRE9TX0dFVF9EUklWRSggcEZDQi0+ZHJpdmUgKTsgLyogRE9TX0RJUkVOVFJZX0xBWU9VVCBhZnRlciBjdXJyZW50IGRyaXZlIG51bWJlciAqLworICAgICgoQllURSAqKXBSZXN1bHQpKys7CiAgICAgcFJlc3VsdC0+ZmlsZWF0dHIgPSBlbnRyeS5kd0ZpbGVBdHRyaWJ1dGVzOwogICAgIHBSZXN1bHQtPmNsdXN0ZXIgID0gMDsgIC8qIHdoYXQgZWxzZT8gKi8KICAgICBwUmVzdWx0LT5maWxlc2l6ZSA9IGVudHJ5Lm5GaWxlU2l6ZUxvdzsKZGlmZiAtLWdpdCBhL21zZG9zL2ludDJmLmMgYi9tc2Rvcy9pbnQyZi5jCmluZGV4IDJmNGQ1NmUuLjc1NWUwNWIgMTAwNjQ0Ci0tLSBhL21zZG9zL2ludDJmLmMKKysrIGIvbXNkb3MvaW50MmYuYwpAQCAtNTcsNiArNTcsOSBAQAogICAgIGNhc2UgMHhiNzogIC8qIGFwcGVuZCAqLwogICAgICAgICBBTF9yZWcoY29udGV4dCkgPSAwOyAvKiBub3QgaW5zdGFsbGVkICovCiAgICAgICAgIGJyZWFrOworICAgIGNhc2UgMHhiZDogIC8qIHNvbWUgTm92ZWxsIG5ldHdvcmsgaW5zdGFsbCBjaGVjayA/Pz8gKi8KKyAgICAgICAgQVhfcmVnKGNvbnRleHQpID0gMHhhNWE1OyAvKiBwcmV0ZW5kIHRvIGhhdmUgTm92ZWxsIElQWCBpbnN0YWxsZWQgKi8KKwlicmVhazsKICAgICBkZWZhdWx0OgogICAgICAgICBJTlRfQkFSRiggY29udGV4dCwgMHgyZiApOwogICAgICAgICBicmVhazsKZGlmZiAtLWdpdCBhL211bHRpbWVkaWEvTWFrZWZpbGUuaW4gYi9tdWx0aW1lZGlhL01ha2VmaWxlLmluCmluZGV4IDJmMmYxNTcuLmY0YTI4OGYgMTAwNjQ0Ci0tLSBhL211bHRpbWVkaWEvTWFrZWZpbGUuaW4KKysrIGIvbXVsdGltZWRpYS9NYWtlZmlsZS5pbgpAQCAtNyw2ICs3LDcgQEAKIAogQ19TUkNTID0gXAogCWF1ZGlvLmMgXAorCWRzb3VuZC5jIFwKIAlqb3lzdGljay5jIFwKIAltY2lhbmltLmMgXAogCW1jaWNkYS5jIFwKZGlmZiAtLWdpdCBhL211bHRpbWVkaWEvZHNvdW5kLmMgYi9tdWx0aW1lZGlhL2Rzb3VuZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViMzk4M2IKLS0tIC9kZXYvbnVsbAorKysgYi9tdWx0aW1lZGlhL2Rzb3VuZC5jCkBAIC0wLDAgKzEsMTc3IEBACisvKiAgCQkJRFMKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJ3aW5kb3dzLmgiCisjaW5jbHVkZSAiaW50ZXJmYWNlcy5oIgorI2luY2x1ZGUgIm1tc3lzdGVtLmgiCisjaW5jbHVkZSAiZHNvdW5kLmgiCisKK0hSRVNVTFQgV0lOQVBJIERpcmVjdFNvdW5kRW51bWVyYXRlMzJBKExQRFNFTlVNQ0FMTEJBQ0szMkEgZW51bWNiLExQVk9JRCBjb250ZXh0KSB7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBIUkVTVUxUIFdJTkFQSSBJRGlyZWN0U291bmRCdWZmZXJfU2V0Rm9ybWF0KAorCUxQRElSRUNUU09VTkRCVUZGRVIgdGhpcyxMUFdBVkVGT1JNQVRFWCB3ZmV4CispIHsKKwlmcHJpbnRmKHN0ZGVyciwiSURpcmVjdFNvdW5kQnVmZmVyKCVwKS0+U2V0Rm9ybWF0KCVwKSxzdHViIVxuIix0aGlzLHdmZXgpOworCXJldHVybiAwOworfQorCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkgSURpcmVjdFNvdW5kQnVmZmVyX1NldFZvbHVtZSgKKwlMUERJUkVDVFNPVU5EQlVGRkVSIHRoaXMsTE9ORyB2b2wKKykgeworCWZwcmludGYoc3RkZXJyLCJJRGlyZWN0U291bmRCdWZmZXIoJXApLT5TZXRWb2x1bWUoJTA4bHgpLHN0dWIhXG4iLHRoaXMsdm9sKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIEhSRVNVTFQgV0lOQVBJIElEaXJlY3RTb3VuZEJ1ZmZlcl9HZXRWb2x1bWUoCisJTFBESVJFQ1RTT1VOREJVRkZFUiB0aGlzLExQTE9ORyB2b2wKKykgeworCWZwcmludGYoc3RkZXJyLCJJRGlyZWN0U291bmRCdWZmZXIoJXApLT5HZXRWb2x1bWUoJXApLHN0dWIhXG4iLHRoaXMsdm9sKTsKKwkqdm9sID0gMTAwOworCXJldHVybiAwOworfQorCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkgSURpcmVjdFNvdW5kQnVmZmVyX1NldEZyZXF1ZW5jeSgKKwlMUERJUkVDVFNPVU5EQlVGRkVSIHRoaXMsRFdPUkQgZnJlcQorKSB7CisJZnByaW50ZihzdGRlcnIsIklEaXJlY3RTb3VuZEJ1ZmZlciglcCktPlNldEZyZXF1ZW5jeSglMDhseCksc3R1YiFcbiIsdGhpcyxmcmVxKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIEhSRVNVTFQgV0lOQVBJIElEaXJlY3RTb3VuZEJ1ZmZlcl9QbGF5KAorCUxQRElSRUNUU09VTkRCVUZGRVIgdGhpcyxEV09SRCB4LERXT1JEIHksRFdPUkQgegorKSB7CisJZnByaW50ZihzdGRlcnIsIklEaXJlY3RTb3VuZEJ1ZmZlciglcCktPlBsYXkoJTA4bHgsJTA4bHgsJTA4bHgpLHN0dWIhXG4iLAorCQl0aGlzLHgseSx6CisJKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIEhSRVNVTFQgV0lOQVBJIElEaXJlY3RTb3VuZEJ1ZmZlcl9TdG9wKExQRElSRUNUU09VTkRCVUZGRVIgdGhpcykgeworCWZwcmludGYoc3RkZXJyLCJJRGlyZWN0U291bmRCdWZmZXIoJXApLT5TdG9wKClcbiIsdGhpcyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBEV09SRCBXSU5BUEkgSURpcmVjdFNvdW5kQnVmZmVyX0FkZFJlZihMUERJUkVDVFNPVU5EQlVGRkVSIHRoaXMpIHsKKwlmcHJpbnRmKHN0ZGVyciwiSURpcmVjdFNvdW5kQnVmZmVyKCVwKS0+QWRkUmVmKClcbiIsdGhpcyk7CisJcmV0dXJuICsrKHRoaXMtPnJlZik7Cit9CitzdGF0aWMgRFdPUkQgV0lOQVBJIElEaXJlY3RTb3VuZEJ1ZmZlcl9SZWxlYXNlKExQRElSRUNUU09VTkRCVUZGRVIgdGhpcykgeworCWZwcmludGYoc3RkZXJyLCJJRGlyZWN0U291bmRCdWZmZXIoJXApLT5SZWxlYXNlKCksc3R1YiFcbiIsdGhpcyk7CisJaWYgKC0tdGhpcy0+cmVmKQorCQlyZXR1cm4gdGhpcy0+cmVmOworCWZwcmludGYoc3RkZXJyLCIJLT4gSURpcmVjdFNvdW5kQnVmZmVyKCVwKSBmcmVlZC5cbiIsdGhpcyk7CisJSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwwLHRoaXMpOworCXJldHVybiAwOworfQorCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkgSURpcmVjdFNvdW5kQnVmZmVyX0dldEN1cnJlbnRQb3NpdGlvbigKKwlMUERJUkVDVFNPVU5EQlVGRkVSIHRoaXMsTFBEV09SRCBwbGF5cG9zLExQRFdPUkQgd3JpdGVwb3MKKykgeworCWZwcmludGYoc3RkZXJyLCJJRGlyZWN0U291bmRCdWZmZXIoJXApLT5HZXRDdXJyZW50UG9zaXRpb24oJXAsJXApLHN0dWIhXG4iLHRoaXMscGxheXBvcyx3cml0ZXBvcyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBIUkVTVUxUIFdJTkFQSSBJRGlyZWN0U291bmRCdWZmZXJfR2V0U3RhdHVzKAorCUxQRElSRUNUU09VTkRCVUZGRVIgdGhpcyxMUERXT1JEIHN0YXR1cworKSB7CisJZnByaW50ZihzdGRlcnIsIklEaXJlY3RTb3VuZEJ1ZmZlciglcCktPkdldFN0YXR1cyglcCksc3R1YiFcbiIsdGhpcyxzdGF0dXMpOworCSpzdGF0dXMgPSAwOyAvKiBobW0uIHNldCBwbGF5aW5nPyBvciBub3QgPyAqLworCXJldHVybiAwOworfQorCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkgSURpcmVjdFNvdW5kQnVmZmVyX0xvY2soCisJTFBESVJFQ1RTT1VOREJVRkZFUiB0aGlzLERXT1JEIHgxLERXT1JEIHgyLExQVk9JRCBwMSxMUERXT1JEIHgzLExQVk9JRCBwMixMUERXT1JEIHg0LERXT1JEIHg1CispIHsKKwlmcHJpbnRmKHN0ZGVyciwiSURpcmVjdFNvdW5kQnVmZmVyKCVwKS0+TG9jaygweCUwOGx4LDB4JTA4bHgsJXAsJXAsJXAsJXAsMHglMDhseCwpLHN0dWIhXG4iLHRoaXMseDEseDIscDEseDMscDIseDQseDUpOworCXJldHVybiAweDgwMDAwMDAwOworfQorCisKK3N0YXRpYyBzdHJ1Y3QgdGFnTFBESVJFQ1RTT1VOREJVRkZFUl9WVEFCTEUgZHNidnQgPSB7CisJKHZvaWQgKikxLAorCUlEaXJlY3RTb3VuZEJ1ZmZlcl9BZGRSZWYsCisJSURpcmVjdFNvdW5kQnVmZmVyX1JlbGVhc2UsCisJKHZvaWQgKik0LAorCUlEaXJlY3RTb3VuZEJ1ZmZlcl9HZXRDdXJyZW50UG9zaXRpb24sCisJKHZvaWQgKik2LAorCUlEaXJlY3RTb3VuZEJ1ZmZlcl9HZXRWb2x1bWUsCisJKHZvaWQgKik4LAorICAgICAgICAodm9pZCAqKTksCisJSURpcmVjdFNvdW5kQnVmZmVyX0dldFN0YXR1cywKKwkodm9pZCAqKTExLAorCUlEaXJlY3RTb3VuZEJ1ZmZlcl9Mb2NrLAorCUlEaXJlY3RTb3VuZEJ1ZmZlcl9QbGF5LAorCSh2b2lkICopMTQsCisJSURpcmVjdFNvdW5kQnVmZmVyX1NldEZvcm1hdCwKKwlJRGlyZWN0U291bmRCdWZmZXJfU2V0Vm9sdW1lLAorCSh2b2lkICopMTcsCisJSURpcmVjdFNvdW5kQnVmZmVyX1NldEZyZXF1ZW5jeSwKKwlJRGlyZWN0U291bmRCdWZmZXJfU3RvcCwKKwkodm9pZCAqKTIwCit9OworCisKKworc3RhdGljIEhSRVNVTFQgV0lOQVBJIElEaXJlY3RTb3VuZF9TZXRDb29wZXJhdGl2ZUxldmVsKAorCUxQRElSRUNUU09VTkQgdGhpcyxIV05EMzIgaHduZCxEV09SRCBsZXZlbAorKSB7CisJZnByaW50ZihzdGRlcnIsIklEaXJlY3RTb3VuZCglcCktPlNldENvb3BlcmF0aXZlTGV2ZWwoJTA4bHgsJWxkKSxzdHViIVxuIiwKKwkJdGhpcywoRFdPUkQpaHduZCxsZXZlbAorCSk7CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIEhSRVNVTFQgV0lOQVBJIElEaXJlY3RTb3VuZF9DcmVhdGVTb3VuZEJ1ZmZlcigKKwlMUERJUkVDVFNPVU5EIHRoaXMsTFBEU0JVRkZFUkRFU0MgZHNiZCxMUExQRElSRUNUU09VTkRCVUZGRVIgcHBkc2IsTFBVTktOT1dOIGxwdW5rCispIHsKKwlmcHJpbnRmKHN0ZGVyciwiSURpcmVjdFNvdW5kKCVwKS0+Q3JlYXRlQnVmZmVyKCVwLCVwLCVwKSxzdHViIVxuIix0aGlzLGRzYmQscHBkc2IsbHB1bmspOworCSpwcGRzYiA9IChMUERJUkVDVFNPVU5EQlVGRkVSKUhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLDAsc2l6ZW9mKElEaXJlY3RTb3VuZEJ1ZmZlcikpOworCSgqcHBkc2IpLT5yZWYgPTE7CisJKCpwcGRzYiktPmxwdnRibCA9ICZkc2J2dDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIEhSRVNVTFQgV0lOQVBJIElEaXJlY3RTb3VuZF9HZXRDYXBzKExQRElSRUNUU09VTkQgdGhpcyxMUERTQ0FQUyBkc2NhcHMpIHsKKwlmcHJpbnRmKHN0ZGVyciwiSURpcmVjdFNvdW5kKCVwKS0+R2V0Q2FwcyglcCksc3R1YiFcbiIsdGhpcyxkc2NhcHMpOworCXJldHVybiAwOworfQorCitzdGF0aWMgVUxPTkcgV0lOQVBJIElEaXJlY3RTb3VuZF9BZGRSZWYoTFBESVJFQ1RTT1VORCB0aGlzKSB7CisJZnByaW50ZihzdGRlcnIsIklEaXJlY3RTb3VuZCglcCktPkFkZFJlZigpXG4iLHRoaXMpOworCXJldHVybiArKyh0aGlzLT5yZWYpOworfQorCitzdGF0aWMgVUxPTkcgV0lOQVBJIElEaXJlY3RTb3VuZF9SZWxlYXNlKExQRElSRUNUU09VTkQgdGhpcykgeworCWZwcmludGYoc3RkZXJyLCJJRGlyZWN0U291bmQoJXApLT5SZWxlYXNlKClcbiIsdGhpcyk7CisJaWYgKCEtLSh0aGlzLT5yZWYpKSB7CisJCUhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksMCx0aGlzKTsKKwkJcmV0dXJuIDA7CisJfQorCXJldHVybiB0aGlzLT5yZWY7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdGFnTFBESVJFQ1RTT1VORF9WVEFCTEUgZHN2dCA9IHsKKwkodm9pZCAqKTEsCisJSURpcmVjdFNvdW5kX0FkZFJlZiwKKwlJRGlyZWN0U291bmRfUmVsZWFzZSwKKwlJRGlyZWN0U291bmRfQ3JlYXRlU291bmRCdWZmZXIsCisJSURpcmVjdFNvdW5kX0dldENhcHMsCisJKHZvaWQgKik2LAorCUlEaXJlY3RTb3VuZF9TZXRDb29wZXJhdGl2ZUxldmVsLAorCSh2b2lkICopOCwKKyAgICAgICAgKHZvaWQgKik5LAorICAgICAgICAodm9pZCAqKTEwLAorICAgICAgICAodm9pZCAqKTExCit9OworCitIUkVTVUxUIFdJTkFQSSBEaXJlY3RTb3VuZENyZWF0ZShMUEdVSUQgbHBHVUlELExQRElSRUNUU09VTkQgKnBwRFMsSVVua25vd24gKnBVbmtPdXRlciApIHsKKwlmcHJpbnRmKHN0ZGVyciwiRGlyZWN0U291bmRDcmVhdGUoJXAsJXAsJXApXG4iLGxwR1VJRCxwcERTLHBVbmtPdXRlcik7CisJKnBwRFMgPSAoTFBESVJFQ1RTT1VORClIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwwLHNpemVvZihJRGlyZWN0U291bmQpKTsKKwkoKnBwRFMpLT5yZWYgPSAxOworCSgqcHBEUyktPmxwdnRibCA9ICZkc3Z0OworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvbXVsdGltZWRpYS9qb3lzdGljay5jIGIvbXVsdGltZWRpYS9qb3lzdGljay5jCmluZGV4IDk3ZjQwMTYuLmU1OWVmNjUgMTAwNjQ0Ci0tLSBhL211bHRpbWVkaWEvam95c3RpY2suYworKysgYi9tdWx0aW1lZGlhL2pveXN0aWNrLmMKQEAgLTIsNiArMiwxNSBAQAogICogam95c3RpY2sgZnVuY3Rpb25zCiAgKgogICogQ29weXJpZ2h0IDE5OTcgQW5kcmVhcyBNb2hyCisgKgorICogbmVhcmx5IGFsbCBqb3lzdGljayBmdW5jdGlvbnMgY2FuIGJlIHJlZ2FyZGVkIGFzIG9ic29sZXRlLAorICogYXMgTGludXggKDIuMS54KSBub3cgc3VwcG9ydHMgZXh0ZW5kZWQgam95c3RpY2tzCisgKiB3aXRoIGEgY29tcGxldGVseSBuZXcgam95c3RpY2sgZHJpdmVyIGludGVyZmFjZQorICogbmV3IGRyaXZlcidzIGRvY3Ugc2F5czoKKyAqICJGb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSB0aGUgb2xkIGludGVyZmFjZSBpcyBzdGlsbCBpbmNsdWRlZCwKKyAqIGJ1dCB3aWxsIGJlIGRyb3BwZWQgaW4gdGhlIGZ1dHVyZS4iCisgKiBUaHVzIHdlIHNob3VsZCBpbXBsZW1lbnQgdGhlIG5ldyBpbnRlcmZhY2UgYW5kIGF0IG1vc3Qga2VlcCB0aGUgb2xkCisgKiByb3V0aW5lcyBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eS4KICAqLwogCiAjaW5jbHVkZSA8dW5pc3RkLmg+CkBAIC0yNTAsNiArMjU5LDE1IEBACiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKb3lHZXRQb3NFeCAgICAgICAgICAgICBbV0lOTU0uMzFdCisgKi8KK01NUkVTVUxUMzIgV0lOQVBJIGpveUdldFBvc0V4KFVJTlQzMiB3SUQsIExQSk9ZSU5GTzMyIGxwSW5mbykKK3sKKwkvKiBGSVhNRTogaW1wbGVtZW50IGl0ICovCisJcmV0dXJuIE1NU1lTRVJSX05PRFJJVkVSOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIAkJCQlKb3lHZXRQb3MJICAgICAgIAlbV0lOTU0uMzBdCiAgKi8KIE1NUkVTVUxUMzIgV0lOQVBJIGpveUdldFBvczMyKFVJTlQzMiB3SUQsIExQSk9ZSU5GTzMyIGxwSW5mbykKZGlmZiAtLWdpdCBhL29iamVjdHMvYnJ1c2guYyBiL29iamVjdHMvYnJ1c2guYwppbmRleCA4ZjJlYjgzLi4xODRlZWVhIDEwMDY0NAotLS0gYS9vYmplY3RzL2JydXNoLmMKKysrIGIvb2JqZWN0cy9icnVzaC5jCkBAIC03LDcgKzcsNiBAQAogI2luY2x1ZGUgPHN0ZGxpYi5oPgogI2luY2x1ZGUgImJydXNoLmgiCiAjaW5jbHVkZSAiYml0bWFwLmgiCi0jaW5jbHVkZSAic3lzY29sb3IuaCIKICNpbmNsdWRlICJtZXRhZmlsZS5oIgogI2luY2x1ZGUgImNvbG9yLmgiCiAjaW5jbHVkZSAic3RkZGVidWcuaCIKQEAgLTI0Nyw4MCArMjQ2LDYgQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBHZXRTeXNDb2xvckJydXNoMTYgICAgKFVTRVIuMjgxKQotICovCi1IQlJVU0gxNiBXSU5BUEkgR2V0U3lzQ29sb3JCcnVzaDE2KCBJTlQxNiBpbmRleCApCi17Ci0gICAgcmV0dXJuIChIQlJVU0gxNilHZXRTeXNDb2xvckJydXNoMzIoaW5kZXgpOwotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIEdldFN5c0NvbG9yQnJ1c2gzMiAgICAoVVNFUjMyLjI4OSkKLSAqLwotSEJSVVNIMzIgV0lOQVBJIEdldFN5c0NvbG9yQnJ1c2gzMiggSU5UMzIgaW5kZXggKQotewotICBzd2l0Y2goaW5kZXgpewotICBjYXNlIENPTE9SX1NDUk9MTEJBUjoKLSAgICByZXR1cm4gc3lzQ29sb3JPYmplY3RzLmhicnVzaFNjcm9sbGJhcjsKLSAgY2FzZSBDT0xPUl9CQUNLR1JPVU5EOiAKLSAgICByZXR1cm4gc3lzQ29sb3JPYmplY3RzLmhicnVzaEJhY2tncm91bmQ7IAotICBjYXNlIENPTE9SX0FDVElWRUNBUFRJT046Ci0gICAgcmV0dXJuIHN5c0NvbG9yT2JqZWN0cy5oYnJ1c2hBY3RpdmVDYXB0aW9uOwotICBjYXNlIENPTE9SX0lOQUNUSVZFQ0FQVElPTjoKLSAgICByZXR1cm4gc3lzQ29sb3JPYmplY3RzLmhicnVzaEluYWN0aXZlQ2FwdGlvbjsKLSAgY2FzZSBDT0xPUl9NRU5VOgotICAgIHJldHVybiBzeXNDb2xvck9iamVjdHMuaGJydXNoTWVudTsKLSAgY2FzZSBDT0xPUl9XSU5ET1c6Ci0gICAgcmV0dXJuIHN5c0NvbG9yT2JqZWN0cy5oYnJ1c2hXaW5kb3c7Ci0gIGNhc2UgQ09MT1JfV0lORE9XRlJBTUU6Ci0gICAgcmV0dXJuIHN5c0NvbG9yT2JqZWN0cy5oYnJ1c2hXaW5kb3dGcmFtZTsKLSAgY2FzZSBDT0xPUl9NRU5VVEVYVDoKLSAgICByZXR1cm4gc3lzQ29sb3JPYmplY3RzLmhicnVzaE1lbnVUZXh0OwotICBjYXNlIENPTE9SX1dJTkRPV1RFWFQ6Ci0gICAgcmV0dXJuIHN5c0NvbG9yT2JqZWN0cy5oYnJ1c2hXaW5kb3dUZXh0OwotICBjYXNlIENPTE9SX0NBUFRJT05URVhUOgotICAgIHJldHVybiBzeXNDb2xvck9iamVjdHMuaGJydXNoQ2FwdGlvblRleHQ7Ci0gIGNhc2UgQ09MT1JfQUNUSVZFQk9SREVSOgotICAgIHJldHVybiBzeXNDb2xvck9iamVjdHMuaGJydXNoQWN0aXZlQm9yZGVyOwotICBjYXNlIENPTE9SX0lOQUNUSVZFQk9SREVSOgotICAgIHJldHVybiBzeXNDb2xvck9iamVjdHMuaGJydXNoSW5hY3RpdmVCb3JkZXI7Ci0gIGNhc2UgQ09MT1JfQVBQV09SS1NQQUNFOgotICAgIHJldHVybiBzeXNDb2xvck9iamVjdHMuaGJydXNoQXBwV29ya3NwYWNlOyAKLSAgY2FzZSBDT0xPUl9ISUdITElHSFQ6Ci0gICAgcmV0dXJuIHN5c0NvbG9yT2JqZWN0cy5oYnJ1c2hIaWdobGlnaHQ7Ci0gIGNhc2UgQ09MT1JfSElHSExJR0hUVEVYVDoKLSAgICByZXR1cm4gc3lzQ29sb3JPYmplY3RzLmhicnVzaEhpZ2hsaWdodFRleHQ7Ci0gIGNhc2UgQ09MT1JfQlRORkFDRTogLyogc2FtZSBhcyBDT0xPUl8zREZBQ0UgKi8KLSAgICByZXR1cm4gc3lzQ29sb3JPYmplY3RzLmhicnVzaEJ0bkZhY2U7Ci0gIGNhc2UgQ09MT1JfQlROU0hBRE9XOiAvKiBzYW1lIGFzIENPTE9SXzNEU0hBRE9XICovCi0gICAgcmV0dXJuIHN5c0NvbG9yT2JqZWN0cy5oYnJ1c2hCdG5TaGFkb3c7Ci0gIGNhc2UgQ09MT1JfR1JBWVRFWFQ6Ci0gICAgcmV0dXJuIHN5c0NvbG9yT2JqZWN0cy5oYnJ1c2hHcmF5VGV4dDsKLSAgY2FzZSBDT0xPUl9CVE5URVhUOgotICAgIHJldHVybiBzeXNDb2xvck9iamVjdHMuaGJydXNoQnRuVGV4dDsKLSAgY2FzZSBDT0xPUl9JTkFDVElWRUNBUFRJT05URVhUOgotICAgIHJldHVybiBzeXNDb2xvck9iamVjdHMuaGJydXNoSW5hY3RpdmVDYXB0aW9uVGV4dDsKLSAgY2FzZSBDT0xPUl9CVE5ISUdITElHSFQ6IC8qIHNhbWUgYXMgQ09MT1JfKDNESElHSHwzREhJfEJUTkhJKUxJR0hUICovCi0gICAgcmV0dXJuIHN5c0NvbG9yT2JqZWN0cy5oYnJ1c2hCdG5IaWdobGlnaHQ7Ci0gIGNhc2UgQ09MT1JfM0RES1NIQURPVzoKLSAgICByZXR1cm4gc3lzQ29sb3JPYmplY3RzLmhicnVzaDNERGtTaGFkb3c7Ci0gIGNhc2UgQ09MT1JfM0RMSUdIVDoKLSAgICByZXR1cm4gc3lzQ29sb3JPYmplY3RzLmhicnVzaDNETGlnaHQ7Ci0gIGNhc2UgQ09MT1JfSU5GT1RFWFQ6Ci0gICAgcmV0dXJuIHN5c0NvbG9yT2JqZWN0cy5oYnJ1c2hJbmZvVGV4dDsKLSAgY2FzZSBDT0xPUl9JTkZPQks6Ci0gICAgcmV0dXJuIHN5c0NvbG9yT2JqZWN0cy5oYnJ1c2hJbmZvQms7Ci0gIGRlZmF1bHQ6Ci0gICAgZnByaW50Ziggc3RkZXJyLCAiR2V0U3lzQ29sb3JCcnVzaDMyOiBVbmtub3duIGluZGV4KCVkKVxuIiwgaW5kZXggKTsKLSAgfQotCi0gIHJldHVybiBHZXRTdG9ja09iamVjdDMyKExUR1JBWV9CUlVTSCk7Ci0KLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBCUlVTSF9EZWxldGVPYmplY3QKICAqLwogQk9PTDMyIEJSVVNIX0RlbGV0ZU9iamVjdCggSEJSVVNIMTYgaGJydXNoLCBCUlVTSE9CSiAqIGJydXNoICkKZGlmZiAtLWdpdCBhL29iamVjdHMvY3Vyc29yaWNvbi5jIGIvb2JqZWN0cy9jdXJzb3JpY29uLmMKaW5kZXggZDc3YTVmNy4uMmVjM2I1OSAxMDA2NDQKLS0tIGEvb2JqZWN0cy9jdXJzb3JpY29uLmMKKysrIGIvb2JqZWN0cy9jdXJzb3JpY29uLmMKQEAgLTc2MSw3ICs3NjEsOCBAQAogCiAgICAgZHByaW50Zl9jdXJzb3IoIHN0ZGRlYiwgIkNyZWF0ZUN1cnNvcjogJWR4JWQgc3BvdD0lZCwlZCB4b3I9JXAgYW5kPSVwXG4iLAogICAgICAgICAgICAgICAgICAgICBuV2lkdGgsIG5IZWlnaHQsIHhIb3RTcG90LCB5SG90U3BvdCwgbHBYT1JiaXRzLCBscEFORGJpdHMpOwotICAgIHJldHVybiBDcmVhdGVDdXJzb3JJY29uSW5kaXJlY3QoIGhJbnN0YW5jZSwgJmluZm8sIGxwQU5EYml0cywgbHBYT1JiaXRzICk7CisgICAgcmV0dXJuIENyZWF0ZUN1cnNvckljb25JbmRpcmVjdCggTU9EVUxFX0hBTkRMRXRvSE1PRFVMRTE2KCBoSW5zdGFuY2UgKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5mbywgbHBBTkRiaXRzLCBscFhPUmJpdHMgKTsKIH0KIAogCkBAIC03OTEsNyArNzkyLDggQEAKIAogICAgIGRwcmludGZfaWNvbiggc3RkZGViLCAiQ3JlYXRlSWNvbjogJWR4JWR4JWQsIHhvcj0lcCwgYW5kPSVwXG4iLAogICAgICAgICAgICAgICAgICAgbldpZHRoLCBuSGVpZ2h0LCBiUGxhbmVzICogYkJpdHNQaXhlbCwgbHBYT1JiaXRzLCBscEFORGJpdHMpOwotICAgIHJldHVybiBDcmVhdGVDdXJzb3JJY29uSW5kaXJlY3QoIGhJbnN0YW5jZSwgJmluZm8sIGxwQU5EYml0cywgbHBYT1JiaXRzICk7CisgICAgcmV0dXJuIENyZWF0ZUN1cnNvckljb25JbmRpcmVjdCggTU9EVUxFX0hBTkRMRXRvSE1PRFVMRTE2KCBoSW5zdGFuY2UgKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5mbywgbHBBTkRiaXRzLCBscFhPUmJpdHMgKTsKIH0KIAogCkBAIC04OTIsNyArODk0LDcgQEAKIHsKICAgICBkcHJpbnRmX2N1cnNvciggc3RkZGViLCAiRGVzdHJveUN1cnNvcjogJTA0eFxuIiwgaEN1cnNvciApOwogICAgIC8qIEZJWE1FOiBzaG91bGQgY2hlY2sgZm9yIE9FTSBjdXJzb3IgaGVyZSAqLwotICAgIHJldHVybiAoRnJlZVJlc291cmNlMTYoIGhDdXJzb3IgKSAhPSAwKTsKKyAgICByZXR1cm4gKEZyZWVSZXNvdXJjZTE2KCBoQ3Vyc29yICkgPT0gMCk7CiB9CiAKIApkaWZmIC0tZ2l0IGEvb2JqZWN0cy9kaWIuYyBiL29iamVjdHMvZGliLmMKaW5kZXggYjVkMWNmMi4uMGYxZWYxNyAxMDA2NDQKLS0tIGEvb2JqZWN0cy9kaWIuYworKysgYi9vYmplY3RzL2RpYi5jCkBAIC0yNDAsMTMgKzI0MCwxNiBAQAogICoKICAqIEhhbmRsZXMgYSBzaW5nbGUgbGluZSBvZiAxIGJpdCBkYXRhLgogICovCi1zdGF0aWMgdm9pZCBESUJfU2V0SW1hZ2VCaXRzXzFfTGluZShEV09SRCBkc3R3aWR0aCwgaW50ICpjb2xvcnMsCitzdGF0aWMgdm9pZCBESUJfU2V0SW1hZ2VCaXRzXzFfTGluZShEV09SRCBkc3R3aWR0aCwgaW50IGxlZnQsIGludCAqY29sb3JzLAogCQkJCSAgICBYSW1hZ2UgKmJtcEltYWdlLCBpbnQgaCwgY29uc3QgQllURSAqYml0cykKIHsKICAgICBCWVRFIHBpeDsKICAgICBEV09SRCBpLCB4OwogCi0gICAgZm9yIChpID0gZHN0d2lkdGgvOCwgeCA9IDA7IChpID4gMCk7IGktLSkKKyAgICBkc3R3aWR0aCArPSBsZWZ0OyBiaXRzICs9IGxlZnQgPj4gMzsKKworICAgIC8qIEZJWE1FOiBzaG91bGQgYXZvaWQgcHV0dGluZyB4PGxlZnQgcGl4ZWxzIChtaW5vciBzcGVlZCBpc3N1ZSkgKi8KKyAgICBmb3IgKGkgPSBkc3R3aWR0aC84LCB4ID0gbGVmdCZ+NzsgKGkgPiAwKTsgaS0tKQogICAgIHsKIAlwaXggPSAqYml0cysrOwogCVhQdXRQaXhlbCggYm1wSW1hZ2UsIHgrKywgaCwgY29sb3JzW3BpeCA+PiA3XSApOwpAQCAtMjc3LDcgKzI4MCw3IEBACiAgKiBTZXRESUJpdHMgZm9yIGEgMS1iaXQgZGVlcCBESUIuCiAgKi8KIHN0YXRpYyB2b2lkIERJQl9TZXRJbWFnZUJpdHNfMSggaW50IGxpbmVzLCBjb25zdCBCWVRFICpzcmNiaXRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBzcmN3aWR0aCwgRFdPUkQgZHN0d2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIHNyY3dpZHRoLCBEV09SRCBkc3R3aWR0aCwgaW50IGxlZnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqY29sb3JzLCBYSW1hZ2UgKmJtcEltYWdlICkKIHsKICAgICBpbnQgaDsKQEAgLTI4NywxMyArMjkwLDEzIEBACiAKICAgICBpZiAobGluZXMgPiAwKSB7CiAJZm9yIChoID0gbGluZXMtMTsgaCA+PTA7IGgtLSkgewotCSAgICBESUJfU2V0SW1hZ2VCaXRzXzFfTGluZShkc3R3aWR0aCwgY29sb3JzLCBibXBJbWFnZSwgaCwgc3JjYml0cyk7CisJICAgIERJQl9TZXRJbWFnZUJpdHNfMV9MaW5lKGRzdHdpZHRoLCBsZWZ0LCBjb2xvcnMsIGJtcEltYWdlLCBoLCBzcmNiaXRzKTsKIAkgICAgc3JjYml0cyArPSBsaW5lYnl0ZXM7CiAJfQogICAgIH0gZWxzZSB7CiAJbGluZXMgPSAtbGluZXM7CiAJZm9yIChoID0gMDsgaCA8IGxpbmVzOyBoKyspIHsKLQkgICAgRElCX1NldEltYWdlQml0c18xX0xpbmUoZHN0d2lkdGgsIGNvbG9ycywgYm1wSW1hZ2UsIGgsIHNyY2JpdHMpOworCSAgICBESUJfU2V0SW1hZ2VCaXRzXzFfTGluZShkc3R3aWR0aCwgbGVmdCwgY29sb3JzLCBibXBJbWFnZSwgaCwgc3JjYml0cyk7CiAJICAgIHNyY2JpdHMgKz0gbGluZWJ5dGVzOwogCX0KICAgICB9CkBAIC0zMDYsMzggKzMwOSw0MSBAQAogICogU2V0RElCaXRzIGZvciBhIDQtYml0IGRlZXAgRElCLgogICovCiBzdGF0aWMgdm9pZCBESUJfU2V0SW1hZ2VCaXRzXzQoIGludCBsaW5lcywgY29uc3QgQllURSAqc3JjYml0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgc3Jjd2lkdGgsIERXT1JEIGRzdHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBzcmN3aWR0aCwgRFdPUkQgZHN0d2lkdGgsIGludCBsZWZ0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmNvbG9ycywgWEltYWdlICpibXBJbWFnZSApCiB7CiAgICAgRFdPUkQgaSwgeDsKICAgICBpbnQgaDsKLSAgICBjb25zdCBCWVRFICpiaXRzID0gc3JjYml0czsKKyAgICBjb25zdCBCWVRFICpiaXRzID0gc3JjYml0cyArIChsZWZ0ID4+IDEpOwogICAKICAgICAvKiAzMiBiaXQgYWxpZ25lZCAqLwogICAgIERXT1JEIGxpbmVieXRlcyA9ICgoc3Jjd2lkdGgrNykmfjcpLzI7CiAKKyAgICBkc3R3aWR0aCArPSBsZWZ0OworCisgICAgLyogRklYTUU6IHNob3VsZCBhdm9pZCBwdXR0aW5nIHg8bGVmdCBwaXhlbHMgKG1pbm9yIHNwZWVkIGlzc3VlKSAqLwogICAgIGlmIChsaW5lcyA+IDApIHsKIAlmb3IgKGggPSBsaW5lcy0xOyBoID49IDA7IGgtLSkgewotCSAgICBmb3IgKGkgPSBkc3R3aWR0aC8yLCB4ID0gMDsgaSA+IDA7IGktLSkgeworCSAgICBmb3IgKGkgPSBkc3R3aWR0aC8yLCB4ID0gbGVmdCZ+MTsgaSA+IDA7IGktLSkgewogCQlCWVRFIHBpeCA9ICpiaXRzKys7CiAJCVhQdXRQaXhlbCggYm1wSW1hZ2UsIHgrKywgaCwgY29sb3JzW3BpeCA+PiA0XSApOwogCQlYUHV0UGl4ZWwoIGJtcEltYWdlLCB4KyssIGgsIGNvbG9yc1twaXggJiAweDBmXSApOwogCSAgICB9CiAJICAgIGlmIChkc3R3aWR0aCAmIDEpIFhQdXRQaXhlbCggYm1wSW1hZ2UsIHgsIGgsIGNvbG9yc1sqYml0cyA+PiA0XSApOwogCSAgICBzcmNiaXRzICs9IGxpbmVieXRlczsKLQkgICAgYml0cwkgPSBzcmNiaXRzOworCSAgICBiaXRzCSA9IHNyY2JpdHMgKyAobGVmdCA+PiAxKTsKIAl9CiAgICAgfSBlbHNlIHsKIAlsaW5lcyA9IC1saW5lczsKIAlmb3IgKGggPSAwOyBoIDwgbGluZXM7IGgrKykgewotCSAgICBmb3IgKGkgPSBkc3R3aWR0aC8yLCB4ID0gMDsgaSA+IDA7IGktLSkgeworCSAgICBmb3IgKGkgPSBkc3R3aWR0aC8yLCB4ID0gbGVmdCZ+MTsgaSA+IDA7IGktLSkgewogCQlCWVRFIHBpeCA9ICpiaXRzKys7CiAJCVhQdXRQaXhlbCggYm1wSW1hZ2UsIHgrKywgaCwgY29sb3JzW3BpeCA+PiA0XSApOwogCQlYUHV0UGl4ZWwoIGJtcEltYWdlLCB4KyssIGgsIGNvbG9yc1twaXggJiAweDBmXSApOwogCSAgICB9CiAJICAgIGlmIChkc3R3aWR0aCAmIDEpIFhQdXRQaXhlbCggYm1wSW1hZ2UsIHgsIGgsIGNvbG9yc1sqYml0cyA+PiA0XSApOwogCSAgICBzcmNiaXRzICs9IGxpbmVieXRlczsKLQkgICAgYml0cwkgPSBzcmNiaXRzOworCSAgICBiaXRzCSA9IHNyY2JpdHMgKyAobGVmdCA+PiAxKTsKIAl9CiAgICAgfQogfQpAQCAtMzU1LDExICszNjEsMTMgQEAKICAqIFNldERJQml0cyBmb3IgYSA0LWJpdCBkZWVwIGNvbXByZXNzZWQgRElCLgogICovCiBzdGF0aWMgdm9pZCBESUJfU2V0SW1hZ2VCaXRzX1JMRTQoIGludCBsaW5lcywgY29uc3QgQllURSAqYml0cywgRFdPUkQgd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIGRzdHdpZHRoLCBpbnQgKmNvbG9ycywgWEltYWdlICpibXBJbWFnZSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIGRzdHdpZHRoLCBpbnQgbGVmdCwgaW50ICpjb2xvcnMsIFhJbWFnZSAqYm1wSW1hZ2UgKQogewogCWludCB4ID0gMCwgYywgbGVuZ3RoOwogCWNvbnN0IEJZVEUgKmJlZ2luID0gYml0czsKIAorICAgICAgICBkc3R3aWR0aCArPSBsZWZ0OyAvKiBGSVhNRTogYXZvaWQgcHV0dGluZyB4PGxlZnQgcGl4ZWxzICovCisKICAgICAgICAgbGluZXMtLTsKIAl3aGlsZSAoKGludClsaW5lcyA+PSAwKQogICAgICAgICB7CkBAIC00MTUsMzAgKzQyMywzMiBAQAogICogU2V0RElCaXRzIGZvciBhbiA4LWJpdCBkZWVwIERJQi4KICAqLwogc3RhdGljIHZvaWQgRElCX1NldEltYWdlQml0c184KCBpbnQgbGluZXMsIGNvbnN0IEJZVEUgKnNyY2JpdHMsCi0JCQkJRFdPUkQgc3Jjd2lkdGgsIERXT1JEIGRzdHdpZHRoLAorCQkJCURXT1JEIHNyY3dpZHRoLCBEV09SRCBkc3R3aWR0aCwgaW50IGxlZnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqY29sb3JzLCBYSW1hZ2UgKmJtcEltYWdlICkKIHsKICAgICBEV09SRCB4OwogICAgIGludCBoOwotICAgIGNvbnN0IEJZVEUgKmJpdHMgPSBzcmNiaXRzOworICAgIGNvbnN0IEJZVEUgKmJpdHMgPSBzcmNiaXRzICsgbGVmdDsKIAogICAgIC8qIGFsaWduIHRvIDMyIGJpdCAqLwogICAgIERXT1JEIGxpbmVieXRlcyA9IChzcmN3aWR0aCArIDMpICYgfjM7CiAKKyAgICBkc3R3aWR0aCs9bGVmdDsKKwogICAgIGlmIChsaW5lcyA+IDApIHsKIAlmb3IgKGggPSBsaW5lcyAtIDE7IGggPj0gMDsgaC0tKSB7Ci0JICAgIGZvciAoeCA9IDA7IHggPCBkc3R3aWR0aDsgeCsrLCBiaXRzKyspIHsKKwkgICAgZm9yICh4ID0gbGVmdDsgeCA8IGRzdHdpZHRoOyB4KyssIGJpdHMrKykgewogCQlYUHV0UGl4ZWwoIGJtcEltYWdlLCB4LCBoLCBjb2xvcnNbKmJpdHNdICk7CiAJICAgIH0KLQkgICAgYml0cyA9IChzcmNiaXRzICs9IGxpbmVieXRlcyk7CisJICAgIGJpdHMgPSAoc3JjYml0cyArPSBsaW5lYnl0ZXMpICsgbGVmdDsKIAl9CiAgICAgfSBlbHNlIHsKIAlsaW5lcyA9IC1saW5lczsKIAlmb3IgKGggPSAwOyBoIDwgbGluZXM7IGgrKykgewotCSAgICBmb3IgKHggPSAwOyB4IDwgZHN0d2lkdGg7IHgrKywgYml0cysrKSB7CisJICAgIGZvciAoeCA9IGxlZnQ7IHggPCBkc3R3aWR0aDsgeCsrLCBiaXRzKyspIHsKIAkJWFB1dFBpeGVsKCBibXBJbWFnZSwgeCwgaCwgY29sb3JzWypiaXRzXSApOwogCSAgICB9Ci0JICAgIGJpdHMgPSAoc3JjYml0cyArPSBsaW5lYnl0ZXMpOworCSAgICBiaXRzID0gKHNyY2JpdHMgKz0gbGluZWJ5dGVzKSArIGxlZnQ7CiAJfQogICAgIH0KIH0KQEAgLTQ3NSw3ICs0ODUsNyBAQAogfTsKICAgCiBzdGF0aWMgdm9pZCBESUJfU2V0SW1hZ2VCaXRzX1JMRTgoIGludCBsaW5lcywgY29uc3QgQllURSAqYml0cywgRFdPUkQgd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIGRzdHdpZHRoLCBpbnQgKmNvbG9ycywgWEltYWdlICpibXBJbWFnZSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIGRzdHdpZHRoLCBpbnQgbGVmdCwgaW50ICpjb2xvcnMsIFhJbWFnZSAqYm1wSW1hZ2UgKQogewogICAgIGludCB4OwkJCS8qIFgtcG9zaXRvbiBvbiBlYWNoIGxpbmUuICBJbmNyZWFzZXMuICovCiAgICAgaW50IGxpbmU7CQkJLyogTGluZSAjLiAgU3RhcnRzIGF0IGxpbmVzLTEsIGRlY3JlYXNlcyAqLwpAQCAtNDg4LDYgKzQ5OCw4IEBACiAgICAgaWYgKGxpbmVzID09IDApCQkvKiBMZXQncyBob3BlIHRoaXMgZG9lc24ndCBoYXBwZW4uICovCiAgICAgICByZXR1cm47CiAgICAgCisgICAgZHN0d2lkdGggKz0gbGVmdDsgLyogRklYTUU6IGF2b2lkIHB1dHRpbmcgeDxsZWZ0IHBpeGVscyAqLworCiAgICAgLyoKICAgICAgKiBOb3RlIHRoYXQgdGhlIGJpdG1hcCBkYXRhIGlzIHN0b3JlZCBieSBXaW5kb3dzIHN0YXJ0aW5nIGF0IHRoZQogICAgICAqIGJvdHRvbSBsaW5lIG9mIHRoZSBiaXRtYXAgYW5kIGdvaW5nIHVwd2FyZHMuICBXaXRoaW4gZWFjaCBsaW5lLApAQCAtNjI4LDcgKzY0MCw3IEBACiAgKiBTZXRESUJpdHMgZm9yIGEgMTYtYml0IGRlZXAgRElCLgogICovCiBzdGF0aWMgdm9pZCBESUJfU2V0SW1hZ2VCaXRzXzE2KCBpbnQgbGluZXMsIGNvbnN0IEJZVEUgKnNyY2JpdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBzcmN3aWR0aCwgRFdPUkQgZHN0d2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBzcmN3aWR0aCwgRFdPUkQgZHN0d2lkdGgsIGludCBsZWZ0LAogCQkJCSBEQyAqZGMsIFhJbWFnZSAqYm1wSW1hZ2UgKQogewogICAgIERXT1JEIHg7CkBAIC02NDAsMTAgKzY1MiwxMiBAQAogICAgIC8qIGFsaWduIHRvIDMyIGJpdCAqLwogICAgIERXT1JEIGxpbmVieXRlcyA9IChzcmN3aWR0aCAqIDIgKyAzKSAmIH4zOwogCi0gICAgcHRyID0gKExQV09SRCkgc3JjYml0czsKKyAgICBkc3R3aWR0aCArPSBsZWZ0OworCisgICAgcHRyID0gKExQV09SRCkgc3JjYml0cyArIGxlZnQ7CiAgICAgaWYgKGxpbmVzID4gMCkgewogCWZvciAoaCA9IGxpbmVzIC0gMTsgaCA+PSAwOyBoLS0pIHsKLQkgICAgZm9yICh4ID0gMDsgeCA8IGRzdHdpZHRoOyB4KyssIHB0cisrKSB7CisJICAgIGZvciAoeCA9IGxlZnQ7IHggPCBkc3R3aWR0aDsgeCsrLCBwdHIrKykgewogCQl2YWwgPSAqcHRyOwogCQlyID0gKEJZVEUpICgodmFsICYgMHg3YzAwKSA+PiA3KTsKIAkJZyA9IChCWVRFKSAoKHZhbCAmIDB4MDNlMCkgPj4gMik7CkBAIC02NTEsMTIgKzY2NSwxMiBAQAogCQlYUHV0UGl4ZWwoIGJtcEltYWdlLCB4LCBoLAogCQkJICAgQ09MT1JfVG9QaHlzaWNhbChkYywgUkdCKHIsZyxiKSkgKTsKIAkgICAgfQotCSAgICBwdHIgPSAoTFBXT1JEKSAoc3JjYml0cyArPSBsaW5lYnl0ZXMpOworCSAgICBwdHIgPSAoTFBXT1JEKSAoc3JjYml0cyArPSBsaW5lYnl0ZXMpICsgbGVmdDsKIAl9CiAgICAgfSBlbHNlIHsKIAlsaW5lcyA9IC1saW5lczsKIAlmb3IgKGggPSAwOyBoIDwgbGluZXM7IGgrKykgewotCSAgICBmb3IgKHggPSAwOyB4IDwgZHN0d2lkdGg7IHgrKywgcHRyKyspIHsKKwkgICAgZm9yICh4ID0gbGVmdDsgeCA8IGRzdHdpZHRoOyB4KyssIHB0cisrKSB7CiAJCXZhbCA9ICpwdHI7CiAJCXIgPSAoQllURSkgKCh2YWwgJiAweDdjMDApID4+IDcpOwogCQlnID0gKEJZVEUpICgodmFsICYgMHgwM2UwKSA+PiAyKTsKQEAgLTY2NCw3ICs2NzgsNyBAQAogCQlYUHV0UGl4ZWwoIGJtcEltYWdlLCB4LCBoLAogCQkJICAgQ09MT1JfVG9QaHlzaWNhbChkYywgUkdCKHIsZyxiKSkgKTsKIAkgICAgfQotCSAgICBwdHIgPSAoTFBXT1JEKSAoc3JjYml0cyArPSBsaW5lYnl0ZXMpOworCSAgICBwdHIgPSAoTFBXT1JEKSAoc3JjYml0cyArPSBsaW5lYnl0ZXMpICsgbGVmdDsKIAl9CiAgICAgfQogfQpAQCAtNjc2LDM0ICs2OTAsMzYgQEAKICAqIFNldERJQml0cyBmb3IgYSAyNC1iaXQgZGVlcCBESUIuCiAgKi8KIHN0YXRpYyB2b2lkIERJQl9TZXRJbWFnZUJpdHNfMjQoIGludCBsaW5lcywgY29uc3QgQllURSAqc3JjYml0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIHNyY3dpZHRoLCBEV09SRCBkc3R3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIHNyY3dpZHRoLCBEV09SRCBkc3R3aWR0aCwgaW50IGxlZnQsCiAJCQkJIERDICpkYywgWEltYWdlICpibXBJbWFnZSApCiB7CiAgICAgRFdPUkQgeDsKLSAgICBjb25zdCBCWVRFICpiaXRzID0gc3JjYml0czsKKyAgICBjb25zdCBCWVRFICpiaXRzID0gc3JjYml0cyArIGxlZnQgKiAzOwogICAgIGludCBoOwogICAKICAgICAvKiBhbGlnbiB0byAzMiBiaXQgKi8KICAgICBEV09SRCBsaW5lYnl0ZXMgPSAoc3Jjd2lkdGggKiAzICsgMykgJiB+MzsKIAorICAgIGRzdHdpZHRoICs9IGxlZnQ7CisKICAgICAvKiAiYml0cyIgb3JkZXIgaXMgcmV2ZXJzZWQgZm9yIHNvbWUgcmVhc29uICovCiAKICAgICBpZiAobGluZXMgPiAwKSB7CiAJZm9yIChoID0gbGluZXMgLSAxOyBoID49IDA7IGgtLSkgewotCSAgICBmb3IgKHggPSAwOyB4IDwgZHN0d2lkdGg7IHgrKywgYml0cyArPSAzKSB7CisJICAgIGZvciAoeCA9IGxlZnQ7IHggPCBkc3R3aWR0aDsgeCsrLCBiaXRzICs9IDMpIHsKIAkJWFB1dFBpeGVsKCBibXBJbWFnZSwgeCwgaCwgCiAJCQkgICBDT0xPUl9Ub1BoeXNpY2FsKGRjLCBSR0IoYml0c1syXSxiaXRzWzFdLGJpdHNbMF0pKSk7CiAJICAgIH0KLQkgICAgYml0cyA9IChzcmNiaXRzICs9IGxpbmVieXRlcyk7CisJICAgIGJpdHMgPSAoc3JjYml0cyArPSBsaW5lYnl0ZXMpICsgbGVmdCAqIDM7CiAJfQogICAgIH0gZWxzZSB7CiAJbGluZXMgPSAtbGluZXM7CiAJZm9yIChoID0gMDsgaCA8IGxpbmVzOyBoKyspIHsKLQkgICAgZm9yICh4ID0gMDsgeCA8IGRzdHdpZHRoOyB4KyssIGJpdHMgKz0gMykgeworCSAgICBmb3IgKHggPSBsZWZ0OyB4IDwgZHN0d2lkdGg7IHgrKywgYml0cyArPSAzKSB7CiAJCVhQdXRQaXhlbCggYm1wSW1hZ2UsIHgsIGgsCiAJCQkgICBDT0xPUl9Ub1BoeXNpY2FsKGRjLCBSR0IoYml0c1syXSxiaXRzWzFdLGJpdHNbMF0pKSk7CiAJICAgIH0KLQkgICAgYml0cyA9IChzcmNiaXRzICs9IGxpbmVieXRlcyk7CisJICAgIGJpdHMgPSAoc3JjYml0cyArPSBsaW5lYnl0ZXMpICsgbGVmdCAqIDM7CiAJfQogICAgIH0KIH0KQEAgLTcxNSwzMSArNzMxLDMzIEBACiAgKiBTZXRESUJpdHMgZm9yIGEgMzItYml0IGRlZXAgRElCLgogICovCiBzdGF0aWMgdm9pZCBESUJfU2V0SW1hZ2VCaXRzXzMyKCBpbnQgbGluZXMsIGNvbnN0IEJZVEUgKnNyY2JpdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBzcmN3aWR0aCwgRFdPUkQgZHN0d2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBzcmN3aWR0aCwgRFdPUkQgZHN0d2lkdGgsIGludCBsZWZ0LAogCQkJCSBEQyAqZGMsIFhJbWFnZSAqYm1wSW1hZ2UgKQogewogICAgIERXT1JEIHg7Ci0gICAgY29uc3QgQllURSAqYml0cyA9IHNyY2JpdHM7CisgICAgY29uc3QgQllURSAqYml0cyA9IHNyY2JpdHMgKyBsZWZ0ICogNDsKICAgICBpbnQgaDsKICAgCiAgICAgRFdPUkQgbGluZWJ5dGVzID0gKHNyY3dpZHRoICogNCk7CiAKKyAgICBkc3R3aWR0aCArPSBsZWZ0OworCiAgICAgaWYgKGxpbmVzID4gMCkgewogCWZvciAoaCA9IGxpbmVzIC0gMTsgaCA+PSAwOyBoLS0pIHsKLQkgICAgZm9yICh4ID0gMDsgeCA8IGRzdHdpZHRoOyB4KyssIGJpdHMgKz0gNCkgeworCSAgICBmb3IgKHggPSBsZWZ0OyB4IDwgZHN0d2lkdGg7IHgrKywgYml0cyArPSA0KSB7CiAJCVhQdXRQaXhlbCggYm1wSW1hZ2UsIHgsIGgsIAogCQkJICAgQ09MT1JfVG9QaHlzaWNhbChkYywgUkdCKGJpdHNbMl0sYml0c1sxXSxiaXRzWzBdKSkpOwogCSAgICB9Ci0JICAgIGJpdHMgPSAoc3JjYml0cyArPSBsaW5lYnl0ZXMpOworCSAgICBiaXRzID0gKHNyY2JpdHMgKz0gbGluZWJ5dGVzKSArIGxlZnQgKiA0OwogCX0KICAgICB9IGVsc2UgewogCWxpbmVzID0gLWxpbmVzOwogCWZvciAoaCA9IDA7IGggPCBsaW5lczsgaCsrKSB7Ci0JICAgIGZvciAoeCA9IDA7IHggPCBkc3R3aWR0aDsgeCsrLCBiaXRzICs9IDQpIHsKKwkgICAgZm9yICh4ID0gbGVmdDsgeCA8IGRzdHdpZHRoOyB4KyssIGJpdHMgKz0gNCkgewogCQlYUHV0UGl4ZWwoIGJtcEltYWdlLCB4LCBoLAogCQkJICAgQ09MT1JfVG9QaHlzaWNhbChkYywgUkdCKGJpdHNbMl0sYml0c1sxXSxiaXRzWzBdKSkpOwogCSAgICB9Ci0JICAgIGJpdHMgPSAoc3JjYml0cyArPSBsaW5lYnl0ZXMpOworCSAgICBiaXRzID0gKHNyY2JpdHMgKz0gbGluZWJ5dGVzKSArIGxlZnQgKiA0OwogCX0KICAgICB9CiB9CkBAIC03NzksMzQgKzc5NywzNCBAQAogICAgIHsKICAgICBjYXNlIDE6CiAJRElCX1NldEltYWdlQml0c18xKCBkZXNjci0+bGluZXMsIGRlc2NyLT5iaXRzLCBkZXNjci0+aW5mb1dpZHRoLAotCQkJICAgIGRlc2NyLT53aWR0aCwgY29sb3JNYXBwaW5nLCBibXBJbWFnZSApOworCQkJICAgIGRlc2NyLT53aWR0aCwgZGVzY3ItPnhTcmMsIGNvbG9yTWFwcGluZywgYm1wSW1hZ2UgKTsKIAlicmVhazsKICAgICBjYXNlIDQ6CiAJaWYgKGNvbXByZXNzaW9uKSBESUJfU2V0SW1hZ2VCaXRzX1JMRTQoIGRlc2NyLT5saW5lcywgZGVzY3ItPmJpdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjci0+aW5mb1dpZHRoLCBkZXNjci0+d2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjci0+aW5mb1dpZHRoLCBkZXNjci0+d2lkdGgsIGRlc2NyLT54U3JjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3JNYXBwaW5nLCBibXBJbWFnZSApOwogCWVsc2UgRElCX1NldEltYWdlQml0c180KCBkZXNjci0+bGluZXMsIGRlc2NyLT5iaXRzLCBkZXNjci0+aW5mb1dpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3ItPndpZHRoLCBjb2xvck1hcHBpbmcsIGJtcEltYWdlICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjci0+d2lkdGgsIGRlc2NyLT54U3JjLCBjb2xvck1hcHBpbmcsIGJtcEltYWdlICk7CiAJYnJlYWs7CiAgICAgY2FzZSA4OgogCWlmIChjb21wcmVzc2lvbikgRElCX1NldEltYWdlQml0c19STEU4KCBkZXNjci0+bGluZXMsIGRlc2NyLT5iaXRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3ItPmluZm9XaWR0aCwgZGVzY3ItPndpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3ItPmluZm9XaWR0aCwgZGVzY3ItPndpZHRoLCBkZXNjci0+eFNyYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yTWFwcGluZywgYm1wSW1hZ2UgKTsKIAllbHNlIERJQl9TZXRJbWFnZUJpdHNfOCggZGVzY3ItPmxpbmVzLCBkZXNjci0+Yml0cywgZGVzY3ItPmluZm9XaWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyLT53aWR0aCwgY29sb3JNYXBwaW5nLCBibXBJbWFnZSApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3ItPndpZHRoLCBkZXNjci0+eFNyYywgY29sb3JNYXBwaW5nLCBibXBJbWFnZSApOwogCWJyZWFrOwogICAgIGNhc2UgMTU6CiAgICAgY2FzZSAxNjoKIAlESUJfU2V0SW1hZ2VCaXRzXzE2KCBkZXNjci0+bGluZXMsIGRlc2NyLT5iaXRzLCBkZXNjci0+aW5mb1dpZHRoLAotCQkJICAgICBkZXNjci0+d2lkdGgsIGRlc2NyLT5kYywgYm1wSW1hZ2UpOworCQkJICAgICBkZXNjci0+d2lkdGgsIGRlc2NyLT54U3JjLCBkZXNjci0+ZGMsIGJtcEltYWdlKTsKIAlicmVhazsKICAgICBjYXNlIDI0OgogCURJQl9TZXRJbWFnZUJpdHNfMjQoIGRlc2NyLT5saW5lcywgZGVzY3ItPmJpdHMsIGRlc2NyLT5pbmZvV2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyLT53aWR0aCwgZGVzY3ItPmRjLCBibXBJbWFnZSApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjci0+d2lkdGgsIGRlc2NyLT54U3JjLCBkZXNjci0+ZGMsIGJtcEltYWdlICk7CiAJYnJlYWs7CiAgICAgY2FzZSAzMjoKIAlESUJfU2V0SW1hZ2VCaXRzXzMyKCBkZXNjci0+bGluZXMsIGRlc2NyLT5iaXRzLCBkZXNjci0+aW5mb1dpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjci0+d2lkdGgsIGRlc2NyLT5kYywgYm1wSW1hZ2UpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjci0+d2lkdGgsIGRlc2NyLT54U3JjLCBkZXNjci0+ZGMsIGJtcEltYWdlKTsKIAlicmVhazsKICAgICBkZWZhdWx0OgogICAgICAgICBmcHJpbnRmKCBzdGRlcnIsICJJbnZhbGlkIGRlcHRoICVkIGZvciBTZXRESUJpdHMhXG4iLCBkZXNjci0+aW5mb0JwcCApOwpAQCAtOTU2LDcgKzk3NCw3IEBACiB7CiAgICAgRElCX1NFVElNQUdFQklUU19ERVNDUiBkZXNjcjsKICAgICBEQyAqIGRjOwotICAgIERXT1JEIHdpZHRoOworICAgIERXT1JEIHdpZHRoLCBvbGRjeSA9IGN5OwogICAgIGludCBoZWlnaHQsIHRtcGhlaWdodDsKIAogICAgICAgLyogQ2hlY2sgcGFyYW1ldGVycyAqLwpAQCAtOTk0LDkgKzEwMTIsOSBAQAogICAgIGRlc2NyLmRyYXdhYmxlICA9IGRjLT51LnguZHJhd2FibGU7CiAgICAgZGVzY3IuZ2MgICAgICAgID0gZGMtPnUueC5nYzsKICAgICBkZXNjci54U3JjICAgICAgPSB4U3JjOwotICAgIGRlc2NyLnlTcmMgICAgICA9IHlTcmMgLSBzdGFydHNjYW47CisgICAgZGVzY3IueVNyYyAgICAgID0gdG1waGVpZ2h0ID49IDAgPyBsaW5lcy0oeVNyYy1zdGFydHNjYW4pLWN5KyhvbGRjeS1jeSkgOiB5U3JjIC0gc3RhcnRzY2FuOwogICAgIGRlc2NyLnhEZXN0ICAgICA9IGRjLT53LkRDT3JnWCArIFhMUFRPRFAoIGRjLCB4RGVzdCApOwotICAgIGRlc2NyLnlEZXN0ICAgICA9IGRjLT53LkRDT3JnWSArIFlMUFRPRFAoIGRjLCB5RGVzdCApOworICAgIGRlc2NyLnlEZXN0ICAgICA9IGRjLT53LkRDT3JnWSArIFlMUFRPRFAoIGRjLCB5RGVzdCApICsgKHRtcGhlaWdodCA+PSAwID8gb2xkY3ktY3kgOiAwKTsKICAgICBkZXNjci53aWR0aCAgICAgPSBjeDsKICAgICBkZXNjci5oZWlnaHQgICAgPSBjeTsKIApAQCAtMTQwOSwxMyArMTQyNywxNCBAQAogICAgICAgQklUTUFQMzIgYm1wOwogICAgICAgaWYgKEdldE9iamVjdDMyQSAocmVzLCBzaXplb2YgKGJtcCksICZibXApKQogCXsKLQkgICpiaXRzID0gYm1wLmJtQml0czsKLQkgIHJldHVybiByZXM7CisgICAgICAgICAgICAvKiBGSVhNRTogdGhpcyBpcyB3cm9uZyEgKGJtQml0cyBpcyBhbHdheXMgTlVMTCkgKi8KKyAgICAgICAgICAgIGlmIChiaXRzKSAqYml0cyA9IGJtcC5ibUJpdHM7CisgICAgICAgICAgICByZXR1cm4gcmVzOwogCX0KICAgICB9CiAKICAgLyogRXJyb3IuICAqLwogICBpZiAocmVzKSBEZWxldGVPYmplY3QzMiAocmVzKTsKLSAgKmJpdHMgPSBOVUxMOwotCXJldHVybiAwOworICBpZiAoYml0cykgKmJpdHMgPSBOVUxMOworICByZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL29iamVjdHMvcGFsZXR0ZS5jIGIvb2JqZWN0cy9wYWxldHRlLmMKaW5kZXggZjdmNGEwNC4uYTFmNjE1MyAxMDA2NDQKLS0tIGEvb2JqZWN0cy9wYWxldHRlLmMKKysrIGIvb2JqZWN0cy9wYWxldHRlLmMKQEAgLTI4NCw3ICsyODQsNyBAQAogICAgIHsKICAgICAgICAgUEFMRVRURU9CSiogcGFsUHRyID0gKFBBTEVUVEVPQkogKilHRElfR2V0T2JqUHRyKGhQYWwsIFBBTEVUVEVfTUFHSUMpOwogCi0JaWYoIChTdGFydEluZGV4ICsgTnVtRW50cmllcykgPCBwYWxQdHItPmxvZ3BhbGV0dGUucGFsTnVtRW50cmllcyApCisJaWYoIChTdGFydEluZGV4ICsgTnVtRW50cmllcykgPD0gcGFsUHRyLT5sb2dwYWxldHRlLnBhbE51bUVudHJpZXMgKQogCXsKIAkgICAgVUlOVDMyIHU7CiAJICAgIGZvciggdSA9IDA7IHUgPCBOdW1FbnRyaWVzOyB1KysgKQpkaWZmIC0tZ2l0IGEvb2JqZWN0cy9yZWdpb24uYyBiL29iamVjdHMvcmVnaW9uLmMKaW5kZXggNjU5NTFlYS4uYzY4Njg2ZiAxMDA2NDQKLS0tIGEvb2JqZWN0cy9yZWdpb24uYworKysgYi9vYmplY3RzL3JlZ2lvbi5jCkBAIC03OTYsMyArNzk2LDEzIEBACiAgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgR2V0UmVnaW9uRGF0YSAgIChHREkzMi4yMTcpCisgKiAKKyAqIFRoaXMgc2VlbXMgdG8gYmUgcmF0aGVyIGltcG9zc2libGUgd2l0aCB0aGUgY3VycmVudCByZWdpb24gaW1wbGVtZW50YXRpb24KKyAqIGZvciBpdCBzZWVtcyB5b3UgY2Fubm90IHF1ZXJ5IFggcmVnaW9ucy4KKyAqLworRFdPUkQgV0lOQVBJIEdldFJlZ2lvbkRhdGEoSFJHTjMyIGhyZ24sRFdPUkQgeCxMUFJHTkRBVEEgcmduZGF0YSkgeworCWZwcmludGYoc3RkZXJyLCJHZXRSZWdpb25EYXRhKCUwNHgsJTA4bHgsJXApLCBTVFVCIVxuIixocmduLHgscmduZGF0YSk7CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9vbGUvY29tcG9iai5jIGIvb2xlL2NvbXBvYmouYwppbmRleCA3Mjg3YmZlLi45NmEzMDBlIDEwMDY0NAotLS0gYS9vbGUvY29tcG9iai5jCisrKyBiL29sZS9jb21wb2JqLmMKQEAgLTE4LDYgKzE4LDggQEAKICNpbmNsdWRlICJjb21wb2JqLmgiCiAjaW5jbHVkZSAiaW50ZXJmYWNlcy5oIgogI2luY2x1ZGUgInNobG9iai5oIgorI2luY2x1ZGUgImRkcmF3LmgiCisjaW5jbHVkZSAiZHNvdW5kLmgiCiAKIERXT1JEIGN1cnJlbnRNYWxsb2M9MDsKIApkaWZmIC0tZ2l0IGEvb2xlL2ZvbGRlcnMuYyBiL29sZS9mb2xkZXJzLmMKaW5kZXggY2YwZGVmNS4uNDVkNTQ2NiAxMDA2NDQKLS0tIGEvb2xlL2ZvbGRlcnMuYworKysgYi9vbGUvZm9sZGVycy5jCkBAIC00NSwxMSArNDUsMTMgQEAKIH0KIAogc3RhdGljIElFbnVtSURMaXN0X1ZUYWJsZSBlaWRsdnQgPSB7Ci0JMSwKKwkodm9pZCAqKTEsCiAJSUVudW1JRExpc3RfQWRkUmVmLAogCUlFbnVtSURMaXN0X1JlbGVhc2UsCiAJSUVudW1JRExpc3RfTmV4dCwKLQk1LDYsNworCSh2b2lkICopNSwKKyAgICAgICAgKHZvaWQgKik2LAorICAgICAgICAodm9pZCAqKTcKIH07CiAKIExQRU5VTUlETElTVCBJRW51bUlETGlzdF9Db25zdHJ1Y3RvcigpIHsKQEAgLTEwOSw3ICsxMTEsNyBAQAogCWZwcmludGYoc3RkZXJyLCJJU2hlbGxGb2xkZXIoJXApLT5QYXJzZURpc3BsYXlOYW1lKCUwOHgsJXAsJXMsJXAsJXAsJXApLHN0dWIhXG4iLAogCQl0aGlzLGh3bmRPd25lcixwYmNSZXNlcnZlZCxscHN6RGlzcGxheU5hbWUscGNoRWF0ZW4scHBpZGwscGR3QXR0cmlidXRlcwogCSk7Ci0JKihEV09SRCopcGJjUmVzZXJ2ZWQgPSBOVUxMOworCSooRFdPUkQqKXBiY1Jlc2VydmVkID0gMDsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTMzLDIyICsxMzUsMjUgQEAKIAlmcHJpbnRmKHN0ZGVyciwiSVNoZWxsRm9sZGVyKCVwKS0+Q3JlYXRlVmlld09iamVjdCgweCUwNHgsJXMsJXApLHN0dWIhXG4iLAogCQl0aGlzLGh3bmRPd25lcix4Y2xzaWQscHB2CiAJKTsKLQkqKERXT1JEKilwcHYgPSBOVUxMOworCSooRFdPUkQqKXBwdiA9IDA7CiAJcmV0dXJuIDA7CiB9CiAKIAogc3RhdGljIHN0cnVjdCBJU2hlbGxGb2xkZXJfVlRhYmxlIHNmdnQgPSB7Ci0JMSwKKyAgICAgICAgKHZvaWQgKikxLAogCUlTaGVsbEZvbGRlcl9BZGRSZWYsCiAJSVNoZWxsRm9sZGVyX1JlbGVhc2UsCiAJSVNoZWxsRm9sZGVyX1BhcnNlRGlzcGxheU5hbWUsCiAJSVNoZWxsRm9sZGVyX0VudW1PYmplY3RzLAogCUlTaGVsbEZvbGRlcl9CaW5kVG9PYmplY3QsCi0JNyw4LAorICAgICAgICAodm9pZCAqKTcsCisgICAgICAgICh2b2lkICopOCwKIAlJU2hlbGxGb2xkZXJfQ3JlYXRlVmlld09iamVjdCwKIAlJU2hlbGxGb2xkZXJfR2V0QXR0cmlidXRlc09mLAotCTExLDEyLDEzCisgICAgICAgICh2b2lkICopMTEsCisgICAgICAgICh2b2lkICopMTIsCisgICAgICAgICh2b2lkICopMTMKIH07CiAKIExQU0hFTExGT0xERVIgSVNoZWxsRm9sZGVyX0NvbnN0cnVjdG9yKCkgewpAQCAtMTYxLDcgKzE2NiwyNyBAQAogfQogCiBzdGF0aWMgc3RydWN0IElTaGVsbExpbmtfVlRhYmxlIHNsdnQgPSB7Ci0JMSwyLDMsNCw1LDYsNyw4LDksMTAsMTEsMTIsMTMsMTQsMTUsMTYsMTcsMTgsMTksMjAsMjEKKyAgICAodm9pZCAqKTEsCisgICAgKHZvaWQgKikyLAorICAgICh2b2lkICopMywKKyAgICAodm9pZCAqKTQsCisgICAgKHZvaWQgKik1LAorICAgICh2b2lkICopNiwKKyAgICAodm9pZCAqKTcsCisgICAgKHZvaWQgKik4LAorICAgICh2b2lkICopOSwKKyAgICAodm9pZCAqKTEwLAorICAgICh2b2lkICopMTEsCisgICAgKHZvaWQgKikxMiwKKyAgICAodm9pZCAqKTEzLAorICAgICh2b2lkICopMTQsCisgICAgKHZvaWQgKikxNSwKKyAgICAodm9pZCAqKTE2LAorICAgICh2b2lkICopMTcsCisgICAgKHZvaWQgKikxOCwKKyAgICAodm9pZCAqKTE5LAorICAgICh2b2lkICopMjAsCisgICAgKHZvaWQgKikyMQogfTsKIAogTFBTSEVMTExJTksgSVNoZWxsTGlua19Db25zdHJ1Y3RvcigpIHsKZGlmZiAtLWdpdCBhL3Byb2dyYW1zL25vdGVwYWQvQ2hhbmdlTG9nIGIvcHJvZ3JhbXMvbm90ZXBhZC9DaGFuZ2VMb2cKaW5kZXggYWNhNWZhMC4uMGExM2FmOSAxMDA2NDQKLS0tIGEvcHJvZ3JhbXMvbm90ZXBhZC9DaGFuZ2VMb2cKKysrIGIvcHJvZ3JhbXMvbm90ZXBhZC9DaGFuZ2VMb2cKQEAgLTEsMyArMSw4IEBACitUdWUgRGVjIDIzIDIzOjM1OjA0IDE5OTcgIE1hcmNlbCBCYXVyIDxtYmF1ckBnMjYuZXRoei5jaD4KKyAgICAgICAqIEZpeGVkIGxvdHMgb2YgYnVncyB3LyByZXNvdXJjZXMgaW4gKi5yYworICAgICAgICogbW92ZWQgW25vdGVwYWQuY10gaW50byBbbWFpbi5jXQorICAgICAgICogbW92ZWQgW25vdGVwYWQuaF0gaW50byBbbWFpbi5oXQorICAgICAgIAogRnJpIERlYyAwNSAyMDo1MTo1NSAxOTk3ICBNYXJjZWwgQmF1ciA8bWJhdXJAZzI2LmV0aHouY2g+CiAgICAgICAgKiBbbm90ZXBhZC5jXSBbbm90ZXBhZC5oXSBbbm90ZXBhZC5yY10gW0VuLnJjXSBbRGUucmNdCiAgICAgICAgICBbbGljZW5zZS5jXSBbbGljZW5zZS5oXSBbTGljZW5zZV9Fbi5jXQpkaWZmIC0tZ2l0IGEvcHJvZ3JhbXMvbm90ZXBhZC9EZS5yYyBiL3Byb2dyYW1zL25vdGVwYWQvRGUucmMKaW5kZXggY2EyYTEwOS4uMzMxMzliNiAxMDA2NDQKLS0tIGEvcHJvZ3JhbXMvbm90ZXBhZC9EZS5yYworKysgYi9wcm9ncmFtcy9ub3RlcGFkL0RlLnJjCkBAIC01OSw3ICs1OSw3IEBACiAjZGVmaW5lIERJQUxPR19QQUdFU0VUVVBfVEFJTCAgICAgICAgIiZGdd96ZWlsZToiCiAjZGVmaW5lIERJQUxPR19QQUdFU0VUVVBfQk9SREVSUyAgICAgIlLkbmRlciIKICNkZWZpbmUgRElBTE9HX1BBR0VTRVRVUF9MRUZUICAgICAgICAiJkxpbmtzOiIKLSNkZWZpbmUgRElBTE9HX1BBR0VTRVRVUF9SSUdIVCAgICAgICAiJlJpZ2h0OiIKKyNkZWZpbmUgRElBTE9HX1BBR0VTRVRVUF9SSUdIVCAgICAgICAiJlJlY2h0czoiCiAjZGVmaW5lIERJQUxPR19QQUdFU0VUVVBfVE9QICAgICAgICAgIiZPYmVuOiIKICNkZWZpbmUgRElBTE9HX1BBR0VTRVRVUF9CT1RUT00gICAgICAiJlVudGVuOiIKIApAQCAtNzMsNyArNzMsNyBAQAogI2RlZmluZSBTVFJJTkdfVU5USVRMRUQgICAgICAgICAgICAgICIodW5iZW5hbm50KSIKIAogI2RlZmluZSBTVFJJTkdfQUxMRklMRVMgICAgICAgICAgICAgICJBbGxlIERhdGVpZW4gKCouKikiCi0jZGVmaW5lIFNUUklOR19URVhURklMRVMgICAgICAgICAgICAgIlRleHRkYXRlaWVuICgqLlRYVCkiCisjZGVmaW5lIFNUUklOR19URVhURklMRVMgICAgICAgICAgICAgIlRleHRkYXRlaWVuICgqLnR4dCkiCiAKICNkZWZpbmUgU1RSSU5HX1RPT0xBUkdFICAgICAgICInJXMnIGlzdCB6dSBncm9zcyBm/HIgZGVuIEVkaXRvclxuIFwKIEJlbnV0emVuIFNpZSBiaXR0ZSBlaW5lbiBhbmRlcmVuIEVkaXRvciwgdW0gZGllc2UgRGF0ZWkgenUgYmVhcmJlaXRlbi4iCkBAIC04OCw0ICs4OCw0IEBACiB1bSBkaWVzZSBGdW5rdGlvbiBcbmFienVzY2hsaWXfZW4uIEJlZW5kZW4gU2llIGVpbmUgb2RlciBtZWhyZXJlIFwKIFxuQW53ZW5kdW5nZW4sIHVtIGRlbiB2ZXJm/GdiYXJlbiBBcmJlaXRzc3BlaWNoZXIgenUgXG5lcmj2aGVuLiIKIAotCisjaW5jbHVkZSAibm90ZXBhZC5yYyIKZGlmZiAtLWdpdCBhL3Byb2dyYW1zL25vdGVwYWQvRW4ucmMgYi9wcm9ncmFtcy9ub3RlcGFkL0VuLnJjCmluZGV4IDM1YWI5OGEuLmU0ZWJjOWUgMTAwNjQ0Ci0tLSBhL3Byb2dyYW1zL25vdGVwYWQvRW4ucmMKKysrIGIvcHJvZ3JhbXMvbm90ZXBhZC9Fbi5yYwpAQCAtNzMsNyArNzMsNyBAQAogI2RlZmluZSBTVFJJTkdfVU5USVRMRUQgICAgICAgICAgICAgICIodW50aXRsZWQpIgogCiAjZGVmaW5lIFNUUklOR19BTExGSUxFUyAgICAgICAgICAgICAgIkFsbCBmaWxlcyAoKi4qKSIKLSNkZWZpbmUgU1RSSU5HX1RFWFRGSUxFUyAgICAgICAgICAgICAiVGV4dCBmaWxlcyAoKi4qKSIKKyNkZWZpbmUgU1RSSU5HX1RFWFRGSUxFUyAgICAgICAgICAgICAiVGV4dCBmaWxlcyAoKi50eHQpIgogCiAjZGVmaW5lIFNUUklOR19UT09MQVJHRSAgICAgICAgICJGaWxlICclcycgaXN0IHRvbyBsYXJnZSBmb3Igbm90ZXBhZC5cbiBcCiBQbGVhc2UgdXNlIGEgZGlmZmVyZW50IGVkaXRvci4iCkBAIC04Nyw1ICs4Nyw1IEBACiB0YXNrLiBcbkNsb3NlIG9uZSBvciBtb3JlIGFwcGxpY2F0aW9ucyB0byBpbmNyZWFzZSB0aGUgYW1vdW50IG9mIFxuZnJlZSBcCiBtZW1vcnkuIgogCi0KKyNpbmNsdWRlICJub3RlcGFkLnJjIgogCmRpZmYgLS1naXQgYS9wcm9ncmFtcy9ub3RlcGFkL01ha2VmaWxlLmluIGIvcHJvZ3JhbXMvbm90ZXBhZC9NYWtlZmlsZS5pbgppbmRleCBmOGE4M2Q2Li5lZDVmZmUxIDEwMDY0NAotLS0gYS9wcm9ncmFtcy9ub3RlcGFkL01ha2VmaWxlLmluCisrKyBiL3Byb2dyYW1zL25vdGVwYWQvTWFrZWZpbGUuaW4KQEAgLTUsNyArNSw3IEBACiBWUEFUSCAgICAgPSBAc3JjZGlyQAogTU9EVUxFICAgID0gbm9uZQogUFJPR1JBTVMgID0gbm90ZXBhZAotQUxMX0xJQlMgID0gJChXSU5FTElCKSAkKFhfTElCUykgJChYUE1fTElCKSAkKFhMSUIpICQoTERMSUJTKQorQUxMX0xJQlMgID0gJChXSU5FTElCKSAkKFhfTElCUykgJChYUE1fTElCKSAkKFhMSUIpICQoTElCUykKIFJDRkxBR1MgICA9IC13MzIgLWgKIAogTEFOR1VBR0VTICAgPSBFbiBEZQpAQCAtMTMsMTUgKzEzLDEzIEBACiAKIE1PU1RTUkNTID0gXAogCWxpY2Vuc2UuYyBcCi0Jbm90ZXBhZC5jCisJbWFpbi5jCiAKICMgU29tZSBzdHJpbmdzIG5lZWQgYWRkcmVzc2VzID49IDB4MTAwMDAKIFNUUklOR1NSQ1MgPSBcCiAJJChMSUNFTlNFTEFORzolPUxpY2Vuc2VfJS5jKQogCi1SQ19TUkNTID0gXAotCW5vdGVwYWQucmMgXAotCSQoTEFOR1VBR0VTOiU9JS5yYykKK1JDX1NSQ1MgPSAkKExBTkdVQUdFUzolPSUucmMpCiAKIENfU1JDUyA9ICQoTU9TVFNSQ1MpICQoU1RSSU5HU1JDUykKIApkaWZmIC0tZ2l0IGEvcHJvZ3JhbXMvbm90ZXBhZC9tYWluLmMgYi9wcm9ncmFtcy9ub3RlcGFkL21haW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMjM2YzA5Ci0tLSAvZGV2L251bGwKKysrIGIvcHJvZ3JhbXMvbm90ZXBhZC9tYWluLmMKQEAgLTAsMCArMSwyNDUgQEAKKy8qCisgKiBOb3RlcGFkCisgKgorICogQ29weXJpZ2h0IDE5OTcgTWFyY2VsIEJhdXIgPG1iYXVyQGcyNi5ldGh6LmNoPgorICovCisKKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisKKyNpbmNsdWRlICJtYWluLmgiCisjaW5jbHVkZSAibGljZW5zZS5oIgorCitOT1RFUEFEX0dMT0JBTFMgR2xvYmFsczsKKworQ0hBUiBTVFJJTkdfTUVOVV9YeFtdICAgICAgPSAiTUVOVV9FbiI7CitDSEFSIFNUUklOR19QQUdFU0VUVVBfWHhbXSA9ICJESUFMT0dfUEFHRVNFVFVQX0VuIjsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogICAgICAgICAgIE5PVEVQQURfUmVnaXN0ZXJMYW5ndWFnZXMKKyAqCisgKiAgSGFuZGxlIGxhbmd1YWdlIHN0dWZmIGF0IHN0YXJ0dXAKKyAqLworCit2b2lkIE5PVEVQQURfUmVnaXN0ZXJMYW5ndWFnZXModm9pZCkgeworCisgIExQQ1NUUiBvcHRfbGFuZyA9ICJFbiI7CisgIENIQVIgbGFuZ1szXTsKKyAgSU5UIGxhbmdudW07CisgIAorIC8qIEZpbmQgbGFuZ3VhZ2Ugc3BlY2lmaWMgc3RyaW5nIHRhYmxlICovCisgIGZvciAobGFuZ251bSA9IDA7IGxhbmdudW0gPD0gTUFYX0xBTkdVQUdFX05VTUJFUjsgbGFuZ251bSsrKQorICAgIHsKKyAgICAgIEdsb2JhbHMud1N0cmluZ1RhYmxlT2Zmc2V0ID0gbGFuZ251bSAqIDB4MTAwOworICAgICAgaWYgKExvYWRTdHJpbmcoR2xvYmFscy5oSW5zdGFuY2UsIElEU19MQU5HVUFHRV9JRCwgbGFuZywgCisgICAgICAgICAgICBzaXplb2YobGFuZykpICYmICFsc3RyY21wKG9wdF9sYW5nLCBsYW5nKSkKKyAgICAgIGJyZWFrOworICAgIH0KKyAgaWYgKGxhbmdudW0gPiBNQVhfTEFOR1VBR0VfTlVNQkVSKQorICAgIHsKKyAgICAgIC8qIEZpbmQgZmFsbGJhY2sgbGFuZ3VhZ2UgKi8KKyAgICAgIGZvciAobGFuZ251bSA9IDA7IGxhbmdudW0gPD0gTUFYX0xBTkdVQUdFX05VTUJFUjsgbGFuZ251bSsrKQorCXsKKwkgIEdsb2JhbHMud1N0cmluZ1RhYmxlT2Zmc2V0ID0gbGFuZ251bSAqIDB4MTAwOworCSAgaWYgKExvYWRTdHJpbmcoR2xvYmFscy5oSW5zdGFuY2UsIElEU19MQU5HVUFHRV9JRCwgbGFuZywgc2l6ZW9mKGxhbmcpKSkKKyAgICAgICAgICBicmVhazsKKwl9CisgICAgICBpZiAobGFuZ251bSA+IE1BWF9MQU5HVUFHRV9OVU1CRVIpCisJeworCU1lc3NhZ2VCb3goMCwgIk5vIGxhbmd1YWdlIGZvdW5kIiwgIkZBVEFMIEVSUk9SIiwgTUJfT0spOworCXJldHVybigxKTsKKwl9CisgICAgfQorCisgIC8qIENoYW5nZSBSZXNvdXJjZSBuYW1lcyAqLworICBsc3RyY3B5bihTVFJJTkdfTUVOVV9YeCArIGxzdHJsZW4oU1RSSU5HX01FTlVfWHgpIC0gMiwgbGFuZywgMyk7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogICAgICAgICAgIE5PVEVQQURfTWVudUNvbW1hbmQKKyAqCisgKiAgQWxsIGhhbmRsaW5nIG9mIG1haW4gbWVudSBldmVudHMKKyAqLworCitpbnQgTk9URVBBRF9NZW51Q29tbWFuZCAoV1BBUkFNIHdQYXJhbSkKK3sgIAorICAgcHJpbnRmKCJOT1RFUEFEX01lbnVDb21tYW5kKClcbiIpOworCisgICBzd2l0Y2ggKHdQYXJhbSkgeworICAgICBjYXNlIE5QX0ZJTEVfTkVXOiAgICAgICAgICBicmVhazsKKyAgICAgY2FzZSBOUF9GSUxFX1NBVkU6ICAgICAgICAgYnJlYWs7CisgICAgIGNhc2UgTlBfRklMRV9TQVZFQVM6ICAgICAgIGJyZWFrOworICAgICBjYXNlIE5QX0ZJTEVfUFJJTlQ6ICAgICAgICBicmVhazsKKyAgICAgY2FzZSBOUF9GSUxFX1BBR0VTRVRVUDogICAgYnJlYWs7CisgICAgIGNhc2UgTlBfRklMRV9QUklOVFNFVFVQOiAgIGJyZWFrOworCisgICAgIGNhc2UgTlBfRklMRV9FWElUOiAgICAgICAgIAorICAgICAgICBQb3N0UXVpdE1lc3NhZ2UoMCk7CisgICAgICAgIGJyZWFrOworCisgICAgIGNhc2UgTlBfRURJVF9VTkRPOiAgICAgICAgIGJyZWFrOworICAgICBjYXNlIE5QX0VESVRfQ1VUOiAgICAgICAgICBicmVhazsKKyAgICAgY2FzZSBOUF9FRElUX0NPUFk6ICAgICAgICAgYnJlYWs7CisgICAgIGNhc2UgTlBfRURJVF9QQVNURTogICAgICAgIGJyZWFrOworICAgICBjYXNlIE5QX0VESVRfREVMRVRFOiAgICAgICBicmVhazsKKyAgICAgY2FzZSBOUF9FRElUX1RJTUVEQVRFOiAgICAgYnJlYWs7CisgICAgIGNhc2UgTlBfRURJVF9XUkFQOiAgICAgICAgIGJyZWFrOworCisgICAgIGNhc2UgTlBfU0VBUkNIX1NFQVJDSDogICAgIGJyZWFrOworICAgICBjYXNlIE5QX1NFQVJDSF9ORVhUOiAgICAgICBicmVhazsKKworICAgICBjYXNlIE5QX0hFTFBfQ09OVEVOVFM6ICAgICAKKyAgICAgICAgcHJpbnRmKCJOUF9IRUxQX0NPTlRFTlRTXG4iKTsKKyAgICAgICAgV2luSGVscChHbG9iYWxzLmhNYWluV25kLCBIRUxQRklMRSwgSEVMUF9JTkRFWCwgMCk7CisgICAgICAgIGJyZWFrOworCisgICAgIGNhc2UgTlBfSEVMUF9TRUFSQ0g6ICAgICAgIGJyZWFrOworCisgICAgIGNhc2UgTlBfSEVMUF9PTl9IRUxQOiAgICAgIAorICAgICAgICBwcmludGYoIk5QX0hFTFBfT05fSEVMUFxuIik7CisgICAgICAgIFdpbkhlbHAoR2xvYmFscy5oTWFpblduZCwgSEVMUEZJTEUsIEhFTFBfSEVMUE9OSEVMUCwgMCk7CisgICAgICAgIGJyZWFrOworCQorICAgICBjYXNlIE5QX0hFTFBfTElDRU5TRToKKyAgICAgICAgV2luZUxpY2Vuc2UoR2xvYmFscy5oTWFpblduZCwgR2xvYmFscy5scHN6TGFuZ3VhZ2UpOworICAgICAgICBicmVhazsKKwkKKyAgICAgY2FzZSBOUF9IRUxQX05PX1dBUlJBTlRZOiAKKyAgICAgICAgcHJpbnRmKCJOUF9BQk9VVF9OT19XQVJSQU5UWVxuIik7CisgICAgICAgIFdpbmVXYXJyYW50eShHbG9iYWxzLmhNYWluV25kLCBHbG9iYWxzLmxwc3pMYW5ndWFnZSk7CisgICAgICAgIGJyZWFrOworCisgICAgIGNhc2UgTlBfSEVMUF9BQk9VVF9XSU5FOgorICAgICAgICBwcmludGYoIk5QX0FCT1VUX1dJTkVcbiIpOworICAgICAgICBTaGVsbEFib3V0KEdsb2JhbHMuaE1haW5XbmQsICJXSU5FIiwgIk5vdGVwYWQiLCAwKTsKKyAgICAgICAgYnJlYWs7CisKKyAgIH0KKyAgIHJldHVybiAwOworfQorCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogICAgICAgICAgIE5PVEVQQURfV25kUHJvYworICovCisKK0xSRVNVTFQgTk9URVBBRF9XbmRQcm9jIChIV05EIGhXbmQsIFVJTlQgbXNnLCBXUEFSQU0gd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQoreworICAgIFBBSU5UU1RSVUNUIHBzOworCisgICAgc3dpdGNoIChtc2cpIHsKKworICAgICAgIGNhc2UgV01fQ1JFQVRFOgorICAgICAgICBwcmludGYoIldNX0NSRUFURVxuIik7CisgICAJYnJlYWs7CisKKyAgICAgICAgY2FzZSBXTV9QQUlOVDoKKwkgIHByaW50ZigiV01fUEFJTlRcbiIpOworICAgICAgICAgIEJlZ2luUGFpbnQoaFduZCwgJnBzKTsKKyAgICAgICAgICBFbmRQYWludChoV25kLCAmcHMpOworICAgCWJyZWFrOworCisgICAgICAgY2FzZSBXTV9DT01NQU5EOgorICAgICAgICAgIHByaW50ZigiV01fQ09NTUFORFxuIik7CisgICAgICAgICAgTk9URVBBRF9NZW51Q29tbWFuZCh3UGFyYW0pOworICAgICAgICAgIGJyZWFrOworCisgICAgICAgY2FzZSBXTV9ERVNUUk9ZOgorICAgICAgICAgIHByaW50ZigiV01fREVTVFJPWVxuIik7CisgICAgICAgICAgUG9zdFF1aXRNZXNzYWdlICgwKTsKKyAgICAgICAgICBicmVhazsKKworICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgcmV0dXJuIERlZldpbmRvd1Byb2MgKGhXbmQsIG1zZywgd1BhcmFtLCBsUGFyYW0pOworICAgIH0KKyAgICByZXR1cm4gMGw7Cit9CisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgICAgICAgICAgV2luTWFpbgorICovCisKK3ZvaWQgRHVtcEdsb2JhbHModm9pZCkgeworCisgICAgcHJpbnRmKCJEdW1wR2xvYmFscygpIik7CisgICAgcHJpbnRmKCIgR2xvYmFscy5scHN6SW5pRmlsZTogJXNcbiIsIEdsb2JhbHMubHBzekluaUZpbGUpOyAKKyAgICBwcmludGYoIiBHbG9iYWxzLmxwc3pJY29GaWxlOiAlc1xuIiwgR2xvYmFscy5scHN6SWNvRmlsZSk7CisgICAgcHJpbnRmKCJHbG9iYWxzLmxwc3pMYW5ndWFnZTogJXNcbiIsIEdsb2JhbHMubHBzekxhbmd1YWdlKTsKKyAgICBwcmludGYoIiAgIEdsb2JhbHMuaEluc3RhbmNlOiAlaVxuIiwgR2xvYmFscy5oSW5zdGFuY2UpOworICAgIHByaW50ZigiICAgR2xvYmFscy5oTWFpbk1lbnU6ICVpXG4iLCBHbG9iYWxzLmhNYWluTWVudSk7CisgICAgCit9CisgCitpbnQgUEFTQ0FMIFdpbk1haW4gKEhBTkRMRSBoSW5zdGFuY2UsIEhBTkRMRSBwcmV2LCBMUFNUUiBjbWRsaW5lLCBpbnQgc2hvdykKK3sKKyAgICBNU0cgICAgICBtc2c7CisgICAgV05EQ0xBU1MgY2xhc3M7CisgICAgY2hhciBjbGFzc05hbWVbXSA9ICJOUENsYXNzIjsgIC8qIFRvIG1ha2Ugc3VyZSBjbGFzc05hbWUgPj0gMHgxMDAwMCAqLworICAgIGNoYXIgd2luTmFtZVtdICAgPSAiTm90ZXBhZCI7CisKKyAgICBwcmludGYoIldpbk1haW4oKVxuIik7CisgICAgCisgICAgLyogU2V0dXAgR2xvYmFscyAqLworCisgICAgR2xvYmFscy5scHN6SW5pRmlsZSAgID0gIm5vdGVwYWQuaW5pIjsKKyAgICBHbG9iYWxzLmxwc3pJY29GaWxlICAgPSAibm90ZXBhZC5pY28iOworICAgIEdsb2JhbHMubHBzekxhbmd1YWdlICA9ICJFbiI7CisgICAgR2xvYmFscy5oSW5zdGFuY2UgICAgID0gaEluc3RhbmNlOworICAgIEdsb2JhbHMuaE1haW5NZW51ICAgICA9IExvYWRNZW51KEdsb2JhbHMuaEluc3RhbmNlLCBTVFJJTkdfTUVOVV9YeCk7CisgICAgR2xvYmFscy5oRmlsZU1lbnUgICAgID0gR2V0U3ViTWVudShHbG9iYWxzLmhNYWluTWVudSwgMCk7CisgICAgR2xvYmFscy5oRWRpdE1lbnUgICAgID0gR2V0U3ViTWVudShHbG9iYWxzLmhNYWluTWVudSwgMSk7CisgICAgR2xvYmFscy5oU2VhcmNoTWVudSAgID0gR2V0U3ViTWVudShHbG9iYWxzLmhNYWluTWVudSwgMik7CisgICAgR2xvYmFscy5oTGFuZ3VhZ2VNZW51ID0gR2V0U3ViTWVudShHbG9iYWxzLmhNYWluTWVudSwgMyk7CisgICAgR2xvYmFscy5oSGVscE1lbnUgICAgID0gR2V0U3ViTWVudShHbG9iYWxzLmhNYWluTWVudSwgNCk7CisgICAgR2xvYmFscy5oTWFpbkljb24gICAgID0gRXh0cmFjdEljb24oR2xvYmFscy5oSW5zdGFuY2UsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdsb2JhbHMubHBzekljb0ZpbGUsIDApOworICAgIGlmICghR2xvYmFscy5oTWFpbkljb24pIEdsb2JhbHMuaE1haW5JY29uID0gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9hZEljb24oMCwgTUFLRUlOVFJFU09VUkNFKERFRkFVTFRJQ09OKSk7CisgICAgCisgICAgRHVtcEdsb2JhbHMoKTsJCQkJICAKKwkJCQkgIAorICAgIGlmICghcHJldil7CisJY2xhc3Muc3R5bGUgPSBDU19IUkVEUkFXIHwgQ1NfVlJFRFJBVzsKKwljbGFzcy5scGZuV25kUHJvYyA9IE5PVEVQQURfV25kUHJvYzsKKwljbGFzcy5jYkNsc0V4dHJhID0gMDsKKwljbGFzcy5jYlduZEV4dHJhID0gMDsKKwljbGFzcy5oSW5zdGFuY2UgID0gR2xvYmFscy5oSW5zdGFuY2U7CisJY2xhc3MuaEljb24gICAgICA9IExvYWRJY29uICgwLCBJRElfQVBQTElDQVRJT04pOworCWNsYXNzLmhDdXJzb3IgICAgPSBMb2FkQ3Vyc29yICgwLCBJRENfQVJST1cpOworCWNsYXNzLmhickJhY2tncm91bmQgPSBHZXRTdG9ja09iamVjdCAoV0hJVEVfQlJVU0gpOworCWNsYXNzLmxwc3pNZW51TmFtZSA9ICJibGFcMCI7CisJY2xhc3MubHBzekNsYXNzTmFtZSA9IChTRUdQVFIpY2xhc3NOYW1lOworICAgIH0KKyAgICBpZiAoIVJlZ2lzdGVyQ2xhc3MgKCZjbGFzcykpCisJcmV0dXJuIEZBTFNFOworCisgICAgR2xvYmFscy5oTWFpblduZCA9IENyZWF0ZVdpbmRvdyAoY2xhc3NOYW1lLCB3aW5OYW1lLCBXU19PVkVSTEFQUEVEV0lORE9XLAorCQkJQ1dfVVNFREVGQVVMVCwgMCwgQ1dfVVNFREVGQVVMVCwgMCwgMCwgCisJCQlMb2FkTWVudShHbG9iYWxzLmhJbnN0YW5jZSwgU1RSSU5HX01FTlVfWHgpLAorCQkJR2xvYmFscy5oSW5zdGFuY2UsIDApOworCisgICAgU2V0TWVudShHbG9iYWxzLmhNYWluV25kLCBHbG9iYWxzLmhNYWluTWVudSk7CQkKKwkJCQorICAgIFNob3dXaW5kb3cgKEdsb2JhbHMuaE1haW5XbmQsIHNob3cpOworICAgIFVwZGF0ZVdpbmRvdyAoR2xvYmFscy5oTWFpblduZCk7CisKKyAgICB3aGlsZSAoR2V0TWVzc2FnZSAoJm1zZywgMCwgMCwgMCkpIHsKKyAgICAgICAgVHJhbnNsYXRlTWVzc2FnZSAoJm1zZyk7CisgICAgICAgIERpc3BhdGNoTWVzc2FnZSAoJm1zZyk7CisgICAgfQorICAgIHJldHVybiAwOworfQorCisKKworCisvKiBMb2NhbCBWYXJpYWJsZXM6ICAgICovCisvKiBjLWZpbGUtc3R5bGU6ICJHTlUiICovCisvKiBFbmQ6ICAgICAgICAgICAgICAgICovCmRpZmYgLS1naXQgYS9wcm9ncmFtcy9ub3RlcGFkL21haW4uaCBiL3Byb2dyYW1zL25vdGVwYWQvbWFpbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjNzAxYjUKLS0tIC9kZXYvbnVsbAorKysgYi9wcm9ncmFtcy9ub3RlcGFkL21haW4uaApAQCAtMCwwICsxLDk5IEBACisvKgorICogTm90ZXBhZCAobm90ZXBhZC5oKQorICoKKyAqIENvcHlyaWdodCAxOTk3IE1hcmNlbCBCYXVyIDxtYmF1ckBnMjYuZXRoei5jaD4KKyAqLworCisjZGVmaW5lIE1BWF9TVFJJTkdfTEVOICAgICAgMjU1CisjZGVmaW5lIE1BWF9QQVRITkFNRV9MRU4gICAgMTAyNAorI2RlZmluZSBNQVhfTEFOR1VBR0VfTlVNQkVSIChOUF9MQVNUX0xBTkdVQUdFIC0gTlBfRklSU1RfTEFOR1VBR0UpCisKKyNkZWZpbmUgSEVMUEZJTEUgIm5vdGVwYWQuaGxwIgorI2RlZmluZSBERUZBVUxUSUNPTiBPSUNfV0lORUlDT04KKworLyogaGlkZSB0aGUgZm9sbG93aW5nIGZyb20gd2luZXJjICovCisjaWZuZGVmIFJDX0lOVk9LRUQKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgSEFORExFICBoSW5zdGFuY2U7CisgIEhXTkQgICAgaE1haW5XbmQ7CisgIEhJQ09OICAgaE1haW5JY29uOworICBISUNPTiAgIGhEZWZhdWx0SWNvbjsKKyAgSE1FTlUgICBoTWFpbk1lbnU7CisgIEhNRU5VICAgaEZpbGVNZW51OworICBITUVOVSAgIGhFZGl0TWVudTsKKyAgSE1FTlUgICBoU2VhcmNoTWVudTsKKyAgSE1FTlUgICBoTGFuZ3VhZ2VNZW51OworICBITUVOVSAgIGhIZWxwTWVudTsKKyAgTFBDU1RSICBscHN6SW5pRmlsZTsKKyAgTFBDU1RSICBscHN6SWNvRmlsZTsKKyAgTFBDU1RSICBscHN6TGFuZ3VhZ2U7CisgIFVJTlQgICAgd1N0cmluZ1RhYmxlT2Zmc2V0OworfSBOT1RFUEFEX0dMT0JBTFM7CisKK2V4dGVybiBOT1RFUEFEX0dMT0JBTFMgR2xvYmFsczsKKworLyogZnVuY3Rpb24gcHJvdG90eXBlcyAqLworCisvKiBjbGFzcyBuYW1lcyAqLworCisvKiByZXNvdXJjZSBuYW1lcyAqLworLy8gZXh0ZXJuIENIQVJbXSBTVFJJTkdfTUVOVV9YeDsKKworICAgI2RlZmluZSBTVFJJTkdJRChpZCkgKDB4IyNpZCArIEdsb2JhbHMud1N0cmluZ1RhYmxlT2Zmc2V0KQorICAgCisjZWxzZSAgLyogUkNfSU5WT0tFRCAqLworCisgICAjZGVmaW5lIFNUUklOR0lEKGlkKSBpZAorICAgCisjZW5kaWYKKworLyogc3RyaW5nIHRhYmxlIGluZGV4ICovCisjZGVmaW5lIElEU19MQU5HVUFHRV9JRCBTVFJJTkdJRCgwMCkKKworLyogbWFpbiBtZW51ICovCisKKyNkZWZpbmUgTlBfRklMRV9ORVcgICAgICAgICAgICAgIDEwMAorI2RlZmluZSBOUF9GSUxFX09QRU4gICAgICAgICAgICAgMTAxCisjZGVmaW5lIE5QX0ZJTEVfU0FWRSAgICAgICAgICAgICAxMDIKKyNkZWZpbmUgTlBfRklMRV9TQVZFQVMgICAgICAgICAgIDEwMworI2RlZmluZSBOUF9GSUxFX1BSSU5UICAgICAgICAgICAgMTA0CisjZGVmaW5lIE5QX0ZJTEVfUEFHRVNFVFVQICAgICAgICAxMDUKKyNkZWZpbmUgTlBfRklMRV9QUklOVFNFVFVQICAgICAgIDEwNgorI2RlZmluZSBOUF9GSUxFX0VYSVQgICAgICAgICAgICAgMTA3CisKKyNkZWZpbmUgTlBfRURJVF9VTkRPICAgICAgICAgICAgIDIwMAorI2RlZmluZSBOUF9FRElUX0NVVCAgICAgICAgICAgICAgMjAxCisjZGVmaW5lIE5QX0VESVRfQ09QWSAgICAgICAgICAgICAyMDIKKyNkZWZpbmUgTlBfRURJVF9QQVNURSAgICAgICAgICAgIDIwMworI2RlZmluZSBOUF9FRElUX0RFTEVURSAgICAgICAgICAgMjA0CisjZGVmaW5lIE5QX0VESVRfU0VMRUNUQUxMICAgICAgICAyMDUKKyNkZWZpbmUgTlBfRURJVF9USU1FREFURSAgICAgICAgIDIwNgorI2RlZmluZSBOUF9FRElUX1dSQVAgICAgICAgICAgICAgMjA3CisKKyNkZWZpbmUgTlBfU0VBUkNIX1NFQVJDSCAgICAgICAgIDMwMAorI2RlZmluZSBOUF9TRUFSQ0hfTkVYVCAgICAgICAgICAgMzAxCisKKyNkZWZpbmUgTlBfRklSU1RfTEFOR1VBR0UgICAgICAgIDQwMAorI2RlZmluZSBOUF9MQVNUX0xBTkdVQUdFICAgICAgICAgNDk5CisKKyNkZWZpbmUgTlBfSEVMUF9DT05URU5UUyAgICAgICAgIDUwMAorI2RlZmluZSBOUF9IRUxQX1NFQVJDSCAgICAgICAgICAgNTAxCisjZGVmaW5lIE5QX0hFTFBfT05fSEVMUCAgICAgICAgICA1MDIKKyNkZWZpbmUgTlBfSEVMUF9MSUNFTlNFICAgICAgICAgIDUwMworI2RlZmluZSBOUF9IRUxQX05PX1dBUlJBTlRZICAgICAgNTA0CisjZGVmaW5lIE5QX0hFTFBfQUJPVVRfV0lORSAgICAgICA1MDUKKworCisvKiBEaWFsb2cgYFBhZ2UgU2V0dXAnICovCisKKyNkZWZpbmUgTlBfUEFHRVNFVFVQX0xFRlQgICAgICAgMTAwMAorI2RlZmluZSBOUF9QQUdFU0VUVVBfUklHSFQgICAgICAxMDAxCisjZGVmaW5lIE5QX1BBR0VTRVRVUF9UT1AgICAgICAgIDEwMDIKKyNkZWZpbmUgTlBfUEFHRVNFVFVQX0JPVFRPTSAgICAgMTAwMworCisKKy8qIExvY2FsIFZhcmlhYmxlczogICAgKi8KKy8qIGMtZmlsZS1zdHlsZTogIkdOVSIgKi8KKy8qIEVuZDogICAgICAgICAgICAgICAgKi8KZGlmZiAtLWdpdCBhL3Byb2dyYW1zL25vdGVwYWQvbm90ZXBhZC5yYyBiL3Byb2dyYW1zL25vdGVwYWQvbm90ZXBhZC5yYwppbmRleCAwMDc5YWY1Li5jM2Q0NzQ4IDEwMDY0NAotLS0gYS9wcm9ncmFtcy9ub3RlcGFkL25vdGVwYWQucmMKKysrIGIvcHJvZ3JhbXMvbm90ZXBhZC9ub3RlcGFkLnJjCkBAIC00LDIyICs0LDI1IEBACiAgKiBDb3B5cmlnaHQgMTk5NyBNYXJjZWwgQmF1ciA8bWJhdXJAZzI2LmV0aHouY2g+CiAgKi8KIAotI2RlZmluZSBDT05DQVQoYSwgYikgYSMjYgorI2luY2x1ZGUgIm1haW4uaCIKKyAKKyNkZWZpbmUgQ09OQ0FUKGEsIGIpIENPTkNBVDEoYSwgYikKKyNkZWZpbmUgQ09OQ0FUMShhLCBiKSBhIyNiCiAKIC8qIE1haW4gTWVudSAqLwogCiBDT05DQVQoTUVOVV8sIExBTkdVQUdFX0lEKSBNRU5VCiB7CiAgUE9QVVAgTUVOVV9GSUxFIHsKLSAgIE1FTlVJVEVNIE1FTlVfRklMRV9ORVcsICAgICAgICAgICAgICBOUF9ORVcgCi0gICBNRU5VSVRFTSBNRU5VX0ZJTEVfT1BFTiwgICAgICAgICAgICAgTlBfT1BFTgotICAgTUVOVUlURU0gTUVOVV9GSUxFX1NBVkUsICAgICAgICAgICAgIE5QX1NBVkUKLSAgIE1FTlVJVEVNIE1FTlVfRklMRV9TQVZFQVMsICAgICAgICAgICBOUF9TQVZFQVMKLSAgIE1FTlVJVEVNIE1FTlVfRklMRV9QUklOVCwgICAgICAgICAgICBOUF9QUklOVAotICAgTUVOVUlURU0gTUVOVV9GSUxFX1BBR0VTRVRVUCwgICAgICAgIE5QX1BBR0VTRVRVUAotICAgTUVOVUlURU0gTUVOVV9GSUxFX1BSSU5UU0VUVVAsICAgICAgIE5QX1BSSU5UU0VUVVAKKyAgIE1FTlVJVEVNIE1FTlVfRklMRV9ORVcsICAgICAgICAgICAgICBOUF9GSUxFX05FVyAKKyAgIE1FTlVJVEVNIE1FTlVfRklMRV9PUEVOLCAgICAgICAgICAgICBOUF9GSUxFX09QRU4KKyAgIE1FTlVJVEVNIE1FTlVfRklMRV9TQVZFLCAgICAgICAgICAgICBOUF9GSUxFX1NBVkUKKyAgIE1FTlVJVEVNIE1FTlVfRklMRV9TQVZFQVMsICAgICAgICAgICBOUF9GSUxFX1NBVkVBUworICAgTUVOVUlURU0gTUVOVV9GSUxFX1BSSU5ULCAgICAgICAgICAgIE5QX0ZJTEVfUFJJTlQKKyAgIE1FTlVJVEVNIE1FTlVfRklMRV9QQUdFU0VUVVAsICAgICAgICBOUF9GSUxFX1BBR0VTRVRVUAorICAgTUVOVUlURU0gTUVOVV9GSUxFX1BSSU5UU0VUVVAsICAgICAgIE5QX0ZJTEVfUFJJTlRTRVRVUAogICAgTUVOVUlURU0gU0VQQVJBVE9SICAgCi0gICBNRU5VSVRFTSBNRU5VX0ZJTEVfRVhJVCwgICAgICAgICAgICAgTlBfRVhJVAorICAgTUVOVUlURU0gTUVOVV9GSUxFX0VYSVQsICAgICAgICAgICAgIE5QX0ZJTEVfRVhJVAogIH0KICBQT1BVUCBNRU5VX0VESVQgewogICAgTUVOVUlURU0gTUVOVV9FRElUX1VORE8sICAgICAgICAgICAgIE5QX0VESVRfVU5ETwpAQCAtNDMsMTYgKzQ2LDE1IEBACiAgICBNRU5VSVRFTSBTRVBBUkFUT1IKICB9CiAgUE9QVVAgTUVOVV9IRUxQIHsKLSAgIE1FTlVJVEVNIE1FTlVfSEVMUF9DT05URU5UUywgICAgICAgICBQTV9DT05URU5UUwotICAgTUVOVUlURU0gTUVOVV9IRUxQX1NFQVJDSCwgICAgICAgICAgIFBNX1NFQVJDSAotICAgTUVOVUlURU0gTUVOVV9IRUxQX0hFTFBfT05fSEVMUCwgICAgIFBNX0hFTFBPTkhFTFAKKyAgIE1FTlVJVEVNIE1FTlVfSEVMUF9DT05URU5UUywgICAgICAgICBOUF9IRUxQX0NPTlRFTlRTCisgICBNRU5VSVRFTSBNRU5VX0hFTFBfU0VBUkNILCAgICAgICAgICAgTlBfSEVMUF9TRUFSQ0gKKyAgIE1FTlVJVEVNIE1FTlVfSEVMUF9IRUxQX09OX0hFTFAsICAgICBOUF9IRUxQX09OX0hFTFAKICAgIE1FTlVJVEVNIFNFUEFSQVRPUgogCiAgUE9QVVAgTUVOVV9JTkZPIHsKLSAgIE1FTlVJVEVNIE1FTlVfSU5GT19MSUNFTlNFLCAgICAgICAgUE1fTElDRU5TRQotICAgTUVOVUlURU0gTUVOVV9JTkZPX05PX1dBUlJBTlRZLCAgICBQTV9OT19XQVJSQU5UWQotICAgTUVOVUlURU0gTUVOVV9JTkZPX0FCT1VUX1dJTkUsICAgICBQTV9BQk9VVF9XSU5FCi0gIH0KLX0KKyAgIE1FTlVJVEVNIE1FTlVfSU5GT19MSUNFTlNFLCAgICAgICAgICBOUF9IRUxQX0xJQ0VOU0UKKyAgIE1FTlVJVEVNIE1FTlVfSU5GT19OT19XQVJSQU5UWSwgICAgICBOUF9IRUxQX05PX1dBUlJBTlRZCisgICBNRU5VSVRFTSBNRU5VX0lORk9fQUJPVVRfV0lORSwgICAgICAgTlBfSEVMUF9BQk9VVF9XSU5FCisgfQogfQogCmRpZmYgLS1naXQgYS9wcm9ncmFtcy9wcm9nbWFuL01ha2VmaWxlLmluIGIvcHJvZ3JhbXMvcHJvZ21hbi9NYWtlZmlsZS5pbgppbmRleCAzOWU3MmZkLi4yMjJmOTZjIDEwMDY0NAotLS0gYS9wcm9ncmFtcy9wcm9nbWFuL01ha2VmaWxlLmluCisrKyBiL3Byb2dyYW1zL3Byb2dtYW4vTWFrZWZpbGUuaW4KQEAgLTUsNyArNSw3IEBACiBWUEFUSCAgICAgPSBAc3JjZGlyQAogTU9EVUxFICAgID0gbm9uZQogUFJPR1JBTVMgID0gcHJvZ21hbgotQUxMX0xJQlMgID0gJChXSU5FTElCKSAkKFhfTElCUykgJChYUE1fTElCKSAkKFhMSUIpICQoTERMSUJTKQorQUxMX0xJQlMgID0gJChXSU5FTElCKSAkKFhfTElCUykgJChYUE1fTElCKSAkKFhMSUIpICQoTElCUykKIFJDRkxBR1MgICA9IC13MzIgLWgKIAogTEFOR1VBR0VTICAgPSBFbiBEYSBEZSBGciBGaSBLbyBIdSBJdCBWYQpkaWZmIC0tZ2l0IGEvcHJvZ3JhbXMvcHJvZ21hbi9WYS5yYyBiL3Byb2dyYW1zL3Byb2dtYW4vVmEucmMKaW5kZXggM2Q1OTYzYy4uYjFhOGQwYiAxMDA2NDQKLS0tIGEvcHJvZ3JhbXMvcHJvZ21hbi9WYS5yYworKysgYi9wcm9ncmFtcy9wcm9nbWFuL1ZhLnJjCkBAIC0zLDEyICszLDEyIEBACiAgKgogICogQ29weXJpZ2h0IDE5OTYgVWxyaWNoIFNjaG1pZAogICoKLSAqIFJ1bWFudHNjaCBMYWRpbiAoVmFsbGFkZXIpIGFkZGVkIGJ5IG1iYXVyQGcyNi5ldGh6LmNoCisgKiBSdW1hbnRzY2ggTGFkaW4gKFZhbGxhZGVyKSBhZGRlZCBieSBNYXJjZWwgQmF1ciA8bWJhdXJAZzI2LmV0aHouY2g+CiAgKgogICovCiAKLSNkZWZpbmUgTEFOR1VBR0VfSUQgICAgICAgICAgICAgICAgICBSbAotI2RlZmluZSBMQU5HVUFHRV9OVU1CRVIgICAgICAgICAgICAgIDIKKyNkZWZpbmUgTEFOR1VBR0VfSUQgICAgICAgICAgICAgICAgICBWYQorI2RlZmluZSBMQU5HVUFHRV9OVU1CRVIgICAgICAgICAgICAgIEMKICNkZWZpbmUgTEFOR1VBR0VfTUVOVV9JVEVNICAgICAgICAgICAiJlZhbGxhZGVyIgogCiAvKiBNZW51ICovCmRpZmYgLS1naXQgYS9wcm9ncmFtcy9wcm9nbWFuL2xpY2Vuc2UuYyBiL3Byb2dyYW1zL3Byb2dtYW4vbGljZW5zZS5jCmluZGV4IGM3M2RjMjYuLmI3ODFiNjUgMTAwNjQ0Ci0tLSBhL3Byb2dyYW1zL3Byb2dtYW4vbGljZW5zZS5jCisrKyBiL3Byb2dyYW1zL3Byb2dtYW4vbGljZW5zZS5jCkBAIC00LDEzICs0LDIxIEBACiBzdGF0aWMgTElDRU5TRSogU2VsZWN0TGFuZ3VhZ2UoTFBDU1RSIExhbmd1YWdlKQogewogI2lmIDAKLSAgaWYgKCFsc3RyY21wKExhbmd1YWdlLCAiRGEiKSkgcmV0dXJuKCZXaW5lTGljZW5zZV9Deik7CisgIGlmICghbHN0cmNtcChMYW5ndWFnZSwgIkN6IikpIHJldHVybigmV2luZUxpY2Vuc2VfQ3opOwogICBpZiAoIWxzdHJjbXAoTGFuZ3VhZ2UsICJEYSIpKSByZXR1cm4oJldpbmVMaWNlbnNlX0RhKTsKICAgaWYgKCFsc3RyY21wKExhbmd1YWdlLCAiRGUiKSkgcmV0dXJuKCZXaW5lTGljZW5zZV9EZSk7CisgIGlmICghbHN0cmNtcChMYW5ndWFnZSwgIkVuIikpIHJldHVybigmV2luZUxpY2Vuc2VfRW4pOworICBpZiAoIWxzdHJjbXAoTGFuZ3VhZ2UsICJFbyIpKSByZXR1cm4oJldpbmVMaWNlbnNlX0VvKTsKICAgaWYgKCFsc3RyY21wKExhbmd1YWdlLCAiRXMiKSkgcmV0dXJuKCZXaW5lTGljZW5zZV9Fcyk7CiAgIGlmICghbHN0cmNtcChMYW5ndWFnZSwgIkZpIikpIHJldHVybigmV2luZUxpY2Vuc2VfRmkpOwogICBpZiAoIWxzdHJjbXAoTGFuZ3VhZ2UsICJGciIpKSByZXR1cm4oJldpbmVMaWNlbnNlX0ZyKTsKKyAgaWYgKCFsc3RyY21wKExhbmd1YWdlLCAiSHUiKSkgcmV0dXJuKCZXaW5lTGljZW5zZV9IdSk7CisgIGlmICghbHN0cmNtcChMYW5ndWFnZSwgIkl0IikpIHJldHVybigmV2luZUxpY2Vuc2VfSXQpOworICBpZiAoIWxzdHJjbXAoTGFuZ3VhZ2UsICJLbyIpKSByZXR1cm4oJldpbmVMaWNlbnNlX0tvKTsKICAgaWYgKCFsc3RyY21wKExhbmd1YWdlLCAiTm8iKSkgcmV0dXJuKCZXaW5lTGljZW5zZV9Obyk7CisgIGlmICghbHN0cmNtcChMYW5ndWFnZSwgIlBsIikpIHJldHVybigmV2luZUxpY2Vuc2VfUGwpOworICBpZiAoIWxzdHJjbXAoTGFuZ3VhZ2UsICJQbyIpKSByZXR1cm4oJldpbmVMaWNlbnNlX1BvKTsKKyAgaWYgKCFsc3RyY21wKExhbmd1YWdlLCAiVmEiKSkgcmV0dXJuKCZXaW5lTGljZW5zZV9WYSk7CiAjZW5kaWYKICAgcmV0dXJuKCZXaW5lTGljZW5zZV9Fbik7CiB9CmRpZmYgLS1naXQgYS9wcm9ncmFtcy9wcm9nbWFuL2xpY2Vuc2UuaCBiL3Byb2dyYW1zL3Byb2dtYW4vbGljZW5zZS5oCmluZGV4IDk3ZmE5YmEuLjExMmUzOGYgMTAwNjQ0Ci0tLSBhL3Byb2dyYW1zL3Byb2dtYW4vbGljZW5zZS5oCisrKyBiL3Byb2dyYW1zL3Byb2dtYW4vbGljZW5zZS5oCkBAIC03LDUgKzcsMTggQEAKICAgTFBDU1RSIFdhcnJhbnR5LCBXYXJyYW50eUNhcHRpb247CiB9IExJQ0VOU0U7CiAKLWV4dGVybiBMSUNFTlNFIFdpbmVMaWNlbnNlX0N6LCBXaW5lTGljZW5zZV9EYSwgV2luZUxpY2Vuc2VfRGUsIFdpbmVMaWNlbnNlX0VuOwotZXh0ZXJuIExJQ0VOU0UgV2luZUxpY2Vuc2VfRXMsIFdpbmVMaWNlbnNlX0ZpLCBXaW5lTGljZW5zZV9GciwgV2luZUxpY2Vuc2VfTm87CitleHRlcm4gTElDRU5TRSBXaW5lTGljZW5zZV9DejsKK2V4dGVybiBMSUNFTlNFIFdpbmVMaWNlbnNlX0RhOworZXh0ZXJuIExJQ0VOU0UgV2luZUxpY2Vuc2VfRGU7CitleHRlcm4gTElDRU5TRSBXaW5lTGljZW5zZV9FbjsKK2V4dGVybiBMSUNFTlNFIFdpbmVMaWNlbnNlX0VvOworZXh0ZXJuIExJQ0VOU0UgV2luZUxpY2Vuc2VfRXM7CitleHRlcm4gTElDRU5TRSBXaW5lTGljZW5zZV9GaTsKK2V4dGVybiBMSUNFTlNFIFdpbmVMaWNlbnNlX0ZyOworZXh0ZXJuIExJQ0VOU0UgV2luZUxpY2Vuc2VfSHU7CitleHRlcm4gTElDRU5TRSBXaW5lTGljZW5zZV9JdDsKK2V4dGVybiBMSUNFTlNFIFdpbmVMaWNlbnNlX0tvOworZXh0ZXJuIExJQ0VOU0UgV2luZUxpY2Vuc2VfTm87CitleHRlcm4gTElDRU5TRSBXaW5lTGljZW5zZV9QbDsKK2V4dGVybiBMSUNFTlNFIFdpbmVMaWNlbnNlX1BvOworZXh0ZXJuIExJQ0VOU0UgV2luZUxpY2Vuc2VfVmE7CmRpZmYgLS1naXQgYS9wcm9ncmFtcy93aW5oZWxwL01ha2VmaWxlLmluIGIvcHJvZ3JhbXMvd2luaGVscC9NYWtlZmlsZS5pbgppbmRleCA2MTJhMzYyLi5kYmUwZGFmIDEwMDY0NAotLS0gYS9wcm9ncmFtcy93aW5oZWxwL01ha2VmaWxlLmluCisrKyBiL3Byb2dyYW1zL3dpbmhlbHAvTWFrZWZpbGUuaW4KQEAgLTUsNyArNSw3IEBACiBWUEFUSCAgICAgPSBAc3JjZGlyQAogTU9EVUxFICAgID0gbm9uZQogUFJPR1JBTVMgID0gd2luaGVscCBobHAyc2dtbAotQUxMX0xJQlMgID0gJChXSU5FTElCKSAkKFhfTElCUykgJChYUE1fTElCKSAkKFhMSUIpICQoTERMSUJTKQorQUxMX0xJQlMgID0gJChXSU5FTElCKSAkKFhfTElCUykgJChYUE1fTElCKSAkKFhMSUIpICQoTElCUykKIFJDRkxBR1MgICA9IC13MzIgLWgKIAogTEFOR1VBR0VTICAgPSBFbiBEYSBEZSBGciBGaSBLbyBIdSBJdCBWYQpAQCAtMjUsNyArMjUsNyBAQAogCiBDX1NSQ1MgPSAkKE1PU1RTUkNTKSAkKFNUUklOR1NSQ1MpCiAKLU1PU1RPQkpTID0gJChNT1NUU1JDUzouYz0ubykKK01PU1RPQkpTID0gJChNT1NUU1JDUzouYz0ubykgJChFWFRSQV9PQkpTKQogU1RSSU5HT0JKUyA9ICQoU1RSSU5HU1JDUzouYz0ubykgJChSQ19TUkNTOi5yYz0ubykKIAogYWxsOiBjaGVja193aW5lcmMgJChQUk9HUkFNUykKZGlmZiAtLWdpdCBhL3Byb2dyYW1zL3dpbnZlci9NYWtlZmlsZS5pbiBiL3Byb2dyYW1zL3dpbnZlci9NYWtlZmlsZS5pbgppbmRleCAyMDhjYTA0Li5hNDRjYTg0IDEwMDY0NAotLS0gYS9wcm9ncmFtcy93aW52ZXIvTWFrZWZpbGUuaW4KKysrIGIvcHJvZ3JhbXMvd2ludmVyL01ha2VmaWxlLmluCkBAIC01LDcgKzUsNyBAQAogVlBBVEggICAgID0gQHNyY2RpckAKIE1PRFVMRSAgICA9IG5vbmUKIFBST0dSQU1TICA9IHdpbnZlcgotQUxMX0xJQlMgID0gJChXSU5FTElCKSAkKFhfTElCUykgJChYUE1fTElCKSAkKFhMSUIpICQoTERMSUJTKQorQUxMX0xJQlMgID0gJChXSU5FTElCKSAkKFhfTElCUykgJChYUE1fTElCKSAkKFhMSUIpICQoTElCUykKIFJDRkxBR1MgICA9IC13MzIgLWgKIAogQ19TUkNTID0gd2ludmVyLmMKZGlmZiAtLWdpdCBhL3JjL3dpbmVyYy5jIGIvcmMvd2luZXJjLmMKaW5kZXggMDU4MzQzYi4uNGE5ZmEzZiAxMDA2NDQKLS0tIGEvcmMvd2luZXJjLmMKKysrIGIvcmMvd2luZXJjLmMKQEAgLTk3LDYgKzk3LDEyIEBACiAJCXJldD15eXBhcnNlKCk7CiAJaWYgKGhlYWRlcikgZmNsb3NlKGhlYWRlcik7CiAJZmNsb3NlKGNvZGUpOworICAgICAgICBpZiAocmV0KSAvKiBUaGVyZSB3YXMgYW4gZXJyb3IgKi8KKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGhlYWRlcikgdW5saW5rKCBvdXRwdXRfbmFtZSApOworICAgICAgICAgICAgb3V0cHV0X25hbWVbc3RybGVuKG91dHB1dF9uYW1lKS0xXSA9ICdjJzsKKyAgICAgICAgICAgIHVubGluayggb3V0cHV0X25hbWUgKTsKKyAgICAgICAgfQogCXJldHVybiByZXQ7CiB9CiAKZGlmZiAtLWdpdCBhL3JlbGF5MzIvTWFrZWZpbGUuaW4gYi9yZWxheTMyL01ha2VmaWxlLmluCmluZGV4IDc0NjAzZTYuLjM5ODgwY2UgMTAwNjQ0Ci0tLSBhL3JlbGF5MzIvTWFrZWZpbGUuaW4KKysrIGIvcmVsYXkzMi9NYWtlZmlsZS5pbgpAQCAtMTEsNiArMTEsOCBAQAogCWNvbWRsZzMyLnNwZWMgXAogCWNydGRsbC5zcGVjIFwKIAlkY2ltYW4zMi5zcGVjIFwKKwlkZHJhdy5zcGVjIFwKKwlkc291bmQuc3BlYyBcCiAJZ2RpMzIuc3BlYyBcCiAJa2VybmVsMzIuc3BlYyBcCiAJbHozMi5zcGVjIFwKZGlmZiAtLWdpdCBhL3JlbGF5MzIvYnVpbHRpbjMyLmMgYi9yZWxheTMyL2J1aWx0aW4zMi5jCmluZGV4IDhiZGYzZWIuLjc2NGFjYWQgMTAwNjQ0Ci0tLSBhL3JlbGF5MzIvYnVpbHRpbjMyLmMKKysrIGIvcmVsYXkzMi9idWlsdGluMzIuYwpAQCAtNDQsNiArNDQsOCBAQAogZXh0ZXJuIGNvbnN0IEJVSUxUSU4zMl9ERVNDUklQVE9SIENPTURMRzMyX0Rlc2NyaXB0b3I7CiBleHRlcm4gY29uc3QgQlVJTFRJTjMyX0RFU0NSSVBUT1IgQ1JURExMX0Rlc2NyaXB0b3I7CiBleHRlcm4gY29uc3QgQlVJTFRJTjMyX0RFU0NSSVBUT1IgRENJTUFOMzJfRGVzY3JpcHRvcjsKK2V4dGVybiBjb25zdCBCVUlMVElOMzJfREVTQ1JJUFRPUiBERFJBV19EZXNjcmlwdG9yOworZXh0ZXJuIGNvbnN0IEJVSUxUSU4zMl9ERVNDUklQVE9SIERTT1VORF9EZXNjcmlwdG9yOwogZXh0ZXJuIGNvbnN0IEJVSUxUSU4zMl9ERVNDUklQVE9SIEdESTMyX0Rlc2NyaXB0b3I7CiBleHRlcm4gY29uc3QgQlVJTFRJTjMyX0RFU0NSSVBUT1IgS0VSTkVMMzJfRGVzY3JpcHRvcjsKIGV4dGVybiBjb25zdCBCVUlMVElOMzJfREVTQ1JJUFRPUiBMWjMyX0Rlc2NyaXB0b3I7CkBAIC03MCw2ICs3Miw4IEBACiAgICAgeyAmQ09NRExHMzJfRGVzY3JpcHRvciwgTlVMTCwgVFJVRSAgfSwKICAgICB7ICZDUlRETExfRGVzY3JpcHRvciwgICBOVUxMLCBUUlVFICB9LAogICAgIHsgJkRDSU1BTjMyX0Rlc2NyaXB0b3IsIE5VTEwsIFRSVUUgIH0sCisgICAgeyAmRERSQVdfRGVzY3JpcHRvciwgICAgTlVMTCwgVFJVRSAgfSwKKyAgICB7ICZEU09VTkRfRGVzY3JpcHRvciwgICBOVUxMLCBUUlVFICB9LAogICAgIHsgJkdESTMyX0Rlc2NyaXB0b3IsICAgIE5VTEwsIFRSVUUgIH0sCiAgICAgeyAmS0VSTkVMMzJfRGVzY3JpcHRvciwgTlVMTCwgVFJVRSAgfSwKICAgICB7ICZMWjMyX0Rlc2NyaXB0b3IsICAgICBOVUxMLCBUUlVFICB9LApAQCAtMzc3LDMgKzM4MSw0MyBAQAogICAgIGZwcmludGYoIHN0ZGVyciwgIlxuIiApOwogICAgIFRBU0tfS2lsbEN1cnJlbnRUYXNrKDEpOwogfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIEJVSUxUSU4zMl9FbmFibGVETEwKKyAqCisgKiBFbmFibGUgb3IgZGlzYWJsZSBhIGJ1aWx0LWluIERMTC4KKyAqLworaW50IEJVSUxUSU4zMl9FbmFibGVETEwoIGNvbnN0IGNoYXIgKm5hbWUsIGludCBsZW4sIGludCBlbmFibGUgKQoreworICAgIGludCBpOworICAgIEJVSUxUSU4zMl9ETEwgKmRsbDsKKworICAgIGZvciAoaSA9IDAsIGRsbCA9IEJ1aWx0aW5ETExzOyBkbGwtPmRlc2NyOyBkbGwrKykKKyAgICB7CisgICAgICAgIGlmICghbHN0cm5jbXBpMzJBKCBuYW1lLCBkbGwtPmRlc2NyLT5uYW1lLCBsZW4gKSkKKyAgICAgICAgeworICAgICAgICAgICAgZGxsLT51c2VkID0gZW5hYmxlOworICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIEZBTFNFOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIEJVSUxUSU4zMl9QcmludERMTHMKKyAqCisgKiBQcmludCB0aGUgbGlzdCBvZiBidWlsdC1pbiBETExzIHRoYXQgY2FuIGJlIGRpc2FibGVkLgorICovCit2b2lkIEJVSUxUSU4zMl9QcmludERMTHModm9pZCkKK3sKKyAgICBpbnQgaTsKKyAgICBCVUlMVElOMzJfRExMICpkbGw7CisKKyAgICBmcHJpbnRmKHN0ZGVyciwiQXZhaWxhYmxlIFdpbjMyIERMTHM6XG4iKTsKKyAgICBmb3IgKGkgPSAwLCBkbGwgPSBCdWlsdGluRExMczsgZGxsLT5kZXNjcjsgZGxsKyspCisgICAgICAgIGZwcmludGYoIHN0ZGVyciwgIiUtOXMlYyIsIGRsbC0+ZGVzY3ItPm5hbWUsCisgICAgICAgICAgICAgICAgICgoKytpKSAlIDgpID8gJyAnIDogJ1xuJyApOworICAgIGZwcmludGYoc3RkZXJyLCJcbiIpOworfQpkaWZmIC0tZ2l0IGEvcmVsYXkzMi9jcnRkbGwuc3BlYyBiL3JlbGF5MzIvY3J0ZGxsLnNwZWMKaW5kZXggYTQxYWY3Ny4uZDFiZGQzNCAxMDA2NDQKLS0tIGEvcmVsYXkzMi9jcnRkbGwuc3BlYworKysgYi9yZWxheTMyL2NydGRsbC5zcGVjCkBAIC0zNTQsNyArMzU0LDcgQEAKIDM1MCBjZGVjbCBjYWxsb2MobG9uZyBsb25nKSBDUlRETExfY2FsbG9jCiAzNTEgc3R1YiBjZWlsCiAzNTIgc3R1YiBjbGVhcmVycgotMzUzIGNkZWNsIGNsb2NrKCkgY2xvY2sKKzM1MyBjZGVjbCBjbG9jaygpIENSVERMTF9jbG9jawogMzU0IGNkZWNsIGNvcyhkb3VibGUpIGNvcwogMzU1IGNkZWNsIGNvc2goZG91YmxlKSBjb3NoCiAzNTYgY2RlY2wgY3RpbWUocHRyKSBjdGltZQpkaWZmIC0tZ2l0IGEvcmVsYXkzMi9kZHJhdy5zcGVjIGIvcmVsYXkzMi9kZHJhdy5zcGVjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1MWExYzMKLS0tIC9kZXYvbnVsbAorKysgYi9yZWxheTMyL2RkcmF3LnNwZWMKQEAgLTAsMCArMSwyOCBAQAorbmFtZSBkZHJhdwordHlwZSB3aW4zMgorCisgICAxICBzdHViIERESEFMMzJfVmlkTWVtQWxsb2MKKyAgIDIgIHN0dWIgRERIQUwzMl9WaWRNZW1GcmVlCisgICAzICBzdHViIERESW50ZXJuYWxMb2NrCisgICA0ICBzdHViIERESW50ZXJuYWxVbmxvY2sKKyAgIDUgIHN0ZGNhbGwgRFNvdW5kSGVscChsb25nIGxvbmcgbG9uZykgRFNvdW5kSGVscAorICAgNiAgc3RkY2FsbCBEaXJlY3REcmF3Q3JlYXRlKHB0ciBwdHIgcHRyKSBEaXJlY3REcmF3Q3JlYXRlCisgICA3ICBzdHViIERpcmVjdERyYXdDcmVhdGVDbGlwcGVyCisgICA4ICBzdGRjYWxsIERpcmVjdERyYXdFbnVtZXJhdGVBKHB0ciBwdHIpIERpcmVjdERyYXdFbnVtZXJhdGUzMkEKKyAgIDkgIHN0dWIgRGlyZWN0RHJhd0VudW1lcmF0ZVcKKyAgMTAgIHN0dWIgRGxsQ2FuVW5sb2FkTm93CisgIDExICBzdHViIERsbEdldENsYXNzT2JqZWN0CisgIDEyICBzdHViIEdldE5leHRNaXBNYXAKKyAgMTMgIHN0dWIgR2V0U3VyZmFjZUZyb21EQworICAxNCAgc3R1YiBIZWFwVmlkTWVtQWxsb2NBbGlnbmVkCisgIDE1ICBzdHViIEludGVybmFsTG9jaworICAxNiAgc3R1YiBJbnRlcm5hbFVubG9jaworICAxNyAgc3R1YiBMYXRlQWxsb2NhdGVTdXJmYWNlTWVtCisgIDE4ICBzdHViIFZpZE1lbUFsbG9jCisgIDE5ICBzdHViIFZpZE1lbUFtb3VudEZyZWUKKyAgMjAgIHN0dWIgVmlkTWVtRmluaQorICAyMSAgc3R1YiBWaWRNZW1GcmVlCisgIDIyICBzdHViIFZpZE1lbUluaXQKKyAgMjMgIHN0dWIgVmlkTWVtTGFyZ2VzdEZyZWUKKyAgMjQgIHN0dWIgdGhrMTYzMl9UaHVua0RhdGEzMgorICAyNSAgc3R1YiB0aGszMjE2X1RodW5rRGF0YTMyCmRpZmYgLS1naXQgYS9yZWxheTMyL2Rzb3VuZC5zcGVjIGIvcmVsYXkzMi9kc291bmQuc3BlYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZmIxOWE3Ci0tLSAvZGV2L251bGwKKysrIGIvcmVsYXkzMi9kc291bmQuc3BlYwpAQCAtMCwwICsxLDExIEBACituYW1lIGRzb3VuZAordHlwZSB3aW4zMgorCiswIHN0ZGNhbGwgRGlyZWN0U291bmRDcmVhdGUocHRyIHB0ciBwdHIpIERpcmVjdFNvdW5kQ3JlYXRlCisxIHN0ZGNhbGwgRGlyZWN0U291bmRFbnVtZXJhdGVBKHB0ciBwdHIpIERpcmVjdFNvdW5kRW51bWVyYXRlMzJBCisyIHN0dWIgRGlyZWN0U291bmRFbnVtZXJhdGVXCiszIHN0dWIgRGxsQ2FuVW5sb2FkTm93Cis0IHN0dWIgRGxsR2V0Q2xhc3NPYmplY3QKKzUgc3R1YiBEaXJlY3RTb3VuZENhcHR1cmVDcmVhdGUKKzYgc3R1YiBEaXJlY3RTb3VuZENhcHR1cmVFbnVtZXJhdGVBCis3IHN0dWIgRGlyZWN0U291bmRDYXB0dXJlRW51bWVyYXRlVwpkaWZmIC0tZ2l0IGEvcmVsYXkzMi9nZGkzMi5zcGVjIGIvcmVsYXkzMi9nZGkzMi5zcGVjCmluZGV4IGUwNjgyNzkuLmZhZDIwOWYgMTAwNjQ0Ci0tLSBhL3JlbGF5MzIvZ2RpMzIuc3BlYworKysgYi9yZWxheTMyL2dkaTMyLnNwZWMKQEAgLTIyMSw3ICsyMjEsNyBAQAogMjE0IHN0ZGNhbGwgR2V0Uk9QMihsb25nKSBHZXRST1AyMzIKIDIxNSBzdHViIEdldFJhbmRvbVJnbgogMjE2IHN0ZGNhbGwgR2V0UmFzdGVyaXplckNhcHMocHRyIGxvbmcpIEdldFJhc3Rlcml6ZXJDYXBzMzIKLTIxNyBzdHViIEdldFJlZ2lvbkRhdGEKKzIxNyBzdGRjYWxsIEdldFJlZ2lvbkRhdGEobG9uZyBsb25nIHB0cikgR2V0UmVnaW9uRGF0YQogMjE4IHN0ZGNhbGwgR2V0UmVsQWJzKGxvbmcpIEdldFJlbEFiczMyCiAyMTkgc3RkY2FsbCBHZXRSZ25Cb3gobG9uZyBwdHIpIEdldFJnbkJveDMyCiAyMjAgc3RkY2FsbCBHZXRTdG9ja09iamVjdChsb25nKSBHZXRTdG9ja09iamVjdDMyCmRpZmYgLS1naXQgYS9yZWxheTMyL2tlcm5lbDMyLnNwZWMgYi9yZWxheTMyL2tlcm5lbDMyLnNwZWMKaW5kZXggN2RkZTZiNC4uMWQyOWNmMiAxMDA2NDQKLS0tIGEvcmVsYXkzMi9rZXJuZWwzMi5zcGVjCisrKyBiL3JlbGF5MzIva2VybmVsMzIuc3BlYwpAQCAtMTczLDcgKzE3Myw3IEBACiAxODIgc3R1YiBEZWZpbmVEb3NEZXZpY2VBCiAxODMgc3R1YiBEZWZpbmVEb3NEZXZpY2VXCiAxODQgc3RkY2FsbCBEZWxldGVBdG9tKGxvbmcpIERlbGV0ZUF0b20zMgotMTg1IHN0ZGNhbGwgRGVsZXRlQ3JpdGljYWxTZWN0aW9uKHB0cikJRGVsZXRlQ3JpdGljYWxTZWN0aW9uCisxODUgc3RkY2FsbCBEZWxldGVDcml0aWNhbFNlY3Rpb24ocHRyKSBEZWxldGVDcml0aWNhbFNlY3Rpb24KIDE4NiBzdGRjYWxsIERlbGV0ZUZpbGVBKHN0cikgRGVsZXRlRmlsZTMyQQogMTg3IHN0ZGNhbGwgRGVsZXRlRmlsZVcod3N0cikgRGVsZXRlRmlsZTMyVwogMTg4IHN0ZGNhbGwgRGV2aWNlSW9Db250cm9sKGxvbmcgbG9uZyBwdHIgbG9uZyBwdHIgbG9uZyBwdHIgcHRyKSBEZXZpY2VJb0NvbnRyb2wKQEAgLTE4Myw3ICsxODMsNyBAQAogMTkyIHN0ZGNhbGwgRHVwbGljYXRlSGFuZGxlKGxvbmcgbG9uZyBsb25nIHB0ciBsb25nIGxvbmcgbG9uZykgRHVwbGljYXRlSGFuZGxlCiAxOTMgc3R1YiBFbmRVcGRhdGVSZXNvdXJjZUEKIDE5NCBzdHViIEVuZFVwZGF0ZVJlc291cmNlVwotMTk1IHN0ZGNhbGwgRW50ZXJDcml0aWNhbFNlY3Rpb24ocHRyKQlFbnRlckNyaXRpY2FsU2VjdGlvbgorMTk1IHN0ZGNhbGwgRW50ZXJDcml0aWNhbFNlY3Rpb24ocHRyKSBFbnRlckNyaXRpY2FsU2VjdGlvbgogMTk2IHN0dWIgRW51bUNhbGVuZGFySW5mb0EKIDE5NyBzdHViIEVudW1DYWxlbmRhckluZm9XCiAxOTggc3R1YiBFbnVtRGF0ZUZvcm1hdHNBCkBAIC0yMDMsNyArMjAzLDcgQEAKIDIxMiBzdHViIEVyYXNlVGFwZQogMjEzIHN0ZGNhbGwgRXNjYXBlQ29tbUZ1bmN0aW9uKGxvbmcgbG9uZykgRXNjYXBlQ29tbUZ1bmN0aW9uMzIKIDIxNCBzdGRjYWxsIEV4aXRQcm9jZXNzKGxvbmcpIEV4aXRQcm9jZXNzCi0yMTUgc3R1YiBFeGl0VGhyZWFkCisyMTUgc3RkY2FsbCBFeGl0VGhyZWFkKGxvbmcpIEV4aXRUaHJlYWQKIDIxNiBzdGRjYWxsIEV4cGFuZEVudmlyb25tZW50U3RyaW5nc0Eoc3RyIHB0ciBsb25nKSBFeHBhbmRFbnZpcm9ubWVudFN0cmluZ3MzMkEKIDIxNyBzdGRjYWxsIEV4cGFuZEVudmlyb25tZW50U3RyaW5nc1cod3N0ciBwdHIgbG9uZykgRXhwYW5kRW52aXJvbm1lbnRTdHJpbmdzMzJXCiAyMTggc3R1YiBGVF9FeGl0MApAQCAtMzgzLDcgKzM4Myw3IEBACiAzOTIgc3RkY2FsbCBHZXRTaG9ydFBhdGhOYW1lVyh3c3RyIHB0ciBsb25nKSBHZXRTaG9ydFBhdGhOYW1lMzJXCiAzOTMgc3RkY2FsbCBHZXRTdGFydHVwSW5mb0EocHRyKSBHZXRTdGFydHVwSW5mbzMyQQogMzk0IHN0ZGNhbGwgR2V0U3RhcnR1cEluZm9XKHB0cikgR2V0U3RhcnR1cEluZm8zMlcKLTM5NSBzdGRjYWxsIEdldFN0ZEhhbmRsZShsb25nKQlHZXRTdGRIYW5kbGUKKzM5NSBzdGRjYWxsIEdldFN0ZEhhbmRsZShsb25nKSBHZXRTdGRIYW5kbGUKIDM5NiBzdGRjYWxsIEdldFN0cmluZ1R5cGVBKGxvbmcgbG9uZyBzdHIgbG9uZyBwdHIpIEdldFN0cmluZ1R5cGUzMkEKIDM5NyBzdGRjYWxsIEdldFN0cmluZ1R5cGVFeEEobG9uZyBsb25nIHN0ciBsb25nIHB0cikgR2V0U3RyaW5nVHlwZUV4MzJBCiAzOTggc3RkY2FsbCBHZXRTdHJpbmdUeXBlRXhXKGxvbmcgbG9uZyB3c3RyIGxvbmcgcHRyKSBHZXRTdHJpbmdUeXBlRXgzMlcKQEAgLTQ0OSw3ICs0NDksNyBAQAogNDU4IHN0dWIgSGVhcDMyTmV4dAogNDU5IHN0ZGNhbGwgSGVhcEFsbG9jKGxvbmcgbG9uZyBsb25nKSBIZWFwQWxsb2MKIDQ2MCBzdGRjYWxsIEhlYXBDb21wYWN0KGxvbmcgbG9uZykgSGVhcENvbXBhY3QKLTQ2MSBzdGRjYWxsIEhlYXBDcmVhdGUobG9uZyBsb25nIGxvbmcpCUhlYXBDcmVhdGUKKzQ2MSBzdGRjYWxsIEhlYXBDcmVhdGUobG9uZyBsb25nIGxvbmcpIEhlYXBDcmVhdGUKIDQ2MiBzdGRjYWxsIEhlYXBEZXN0cm95KGxvbmcpIEhlYXBEZXN0cm95CiA0NjMgc3RkY2FsbCBIZWFwRnJlZShsb25nIGxvbmcgcHRyKSBIZWFwRnJlZQogNDY0IHN0ZGNhbGwgSGVhcExvY2sobG9uZykgSGVhcExvY2sKQEAgLTQ4Miw3ICs0ODIsNyBAQAogNDkxIHN0dWIgSzMyVGhrMTYzMlByb2xvZwogNDkyIHN0ZGNhbGwgTENNYXBTdHJpbmdBKGxvbmcgbG9uZyBzdHIgbG9uZyBwdHIgbG9uZykgTENNYXBTdHJpbmczMkEKIDQ5MyBzdGRjYWxsIExDTWFwU3RyaW5nVyhsb25nIGxvbmcgd3N0ciBsb25nIHB0ciBsb25nKSBMQ01hcFN0cmluZzMyVwotNDk0IHN0ZGNhbGwgTGVhdmVDcml0aWNhbFNlY3Rpb24ocHRyKQlMZWF2ZUNyaXRpY2FsU2VjdGlvbgorNDk0IHN0ZGNhbGwgTGVhdmVDcml0aWNhbFNlY3Rpb24ocHRyKSBMZWF2ZUNyaXRpY2FsU2VjdGlvbgogNDk1IHN0ZGNhbGwgTG9hZExpYnJhcnlBKHN0cikgTG9hZExpYnJhcnkzMkEKIDQ5NiBzdGRjYWxsIExvYWRMaWJyYXJ5RXhBKHN0ciBsb25nIGxvbmcpIExvYWRMaWJyYXJ5RXgzMkEKIDQ5NyBzdHViIExvYWRMaWJyYXJ5RXhXCkBAIC01MzEsNyArNTMxLDcgQEAKIDU0MCBzdGRjYWxsIE9wZW5GaWxlTWFwcGluZ1cobG9uZyBsb25nIHdzdHIpIE9wZW5GaWxlTWFwcGluZzMyVwogNTQxIHN0ZGNhbGwgT3Blbk11dGV4QShsb25nIGxvbmcgc3RyKSBPcGVuTXV0ZXgzMkEKIDU0MiBzdGRjYWxsIE9wZW5NdXRleFcobG9uZyBsb25nIHdzdHIpIE9wZW5NdXRleDMyVwotNTQzIHN0ZGNhbGwgT3BlblByb2Nlc3MobG9uZyBsb25nIGxvbmcpIE9wZW5Qcm9jZXNzMzIKKzU0MyBzdGRjYWxsIE9wZW5Qcm9jZXNzKGxvbmcgbG9uZyBsb25nKSBPcGVuUHJvY2VzcwogNTQ0IHN0dWIgT3BlblByb2ZpbGVVc2VyTWFwcGluZwogNTQ1IHN0ZGNhbGwgT3BlblNlbWFwaG9yZUEobG9uZyBsb25nIHN0cikgT3BlblNlbWFwaG9yZTMyQQogNTQ2IHN0ZGNhbGwgT3BlblNlbWFwaG9yZVcobG9uZyBsb25nIHdzdHIpIE9wZW5TZW1hcGhvcmUzMlcKQEAgLTU0NSw3ICs1NDUsNyBAQAogNTU0IHN0dWIgUHJlcGFyZVRhcGUKIDU1NSBzdHViIFByb2Nlc3MzMkZpcnN0CiA1NTYgc3R1YiBQcm9jZXNzMzJOZXh0Ci01NTcgc3R1YiBQdWxzZUV2ZW50Cis1NTcgc3RkY2FsbCBQdWxzZUV2ZW50KGxvbmcpIFB1bHNlRXZlbnQKIDU1OCBzdGRjYWxsIFB1cmdlQ29tbShsb25nIGxvbmcpIFB1cmdlQ29tbQogNTU5IHJlZ2lzdGVyIFFUX1RodW5rKCkgUVRfVGh1bmsKIDU2MCBzdGRjYWxsIFF1ZXJ5RG9zRGV2aWNlQShzdHIgcHRyIGxvbmcpIFF1ZXJ5RG9zRGV2aWNlMzJBCkBAIC01NjgsNyArNTY4LDcgQEAKIDU3NyBzdGRjYWxsIFJlYWRGaWxlKGxvbmcgcHRyIGxvbmcgcHRyIHB0cikgUmVhZEZpbGUKIDU3OCBzdGRjYWxsIFJlYWRGaWxlRXgobG9uZyBwdHIgbG9uZyBwdHIgcHRyKSBSZWFkRmlsZUV4CiA1Nzkgc3RkY2FsbCBSZWFkUHJvY2Vzc01lbW9yeShsb25nIHB0ciBwdHIgbG9uZyBwdHIpIFJlYWRQcm9jZXNzTWVtb3J5Ci01ODAgc3R1YiBSZWdpc3RlclNlcnZpY2VQcm9jZXNzCis1ODAgc3RkY2FsbCBSZWdpc3RlclNlcnZpY2VQcm9jZXNzKGxvbmcgbG9uZykgUmVnaXN0ZXJTZXJ2aWNlUHJvY2VzcwogNTgxIHN0ZGNhbGwgUmVpbml0aWFsaXplQ3JpdGljYWxTZWN0aW9uKHB0cikgUmVpbml0aWFsaXplQ3JpdGljYWxTZWN0aW9uCiA1ODIgc3RkY2FsbCBSZWxlYXNlTXV0ZXgobG9uZykgUmVsZWFzZU11dGV4CiA1ODMgc3RkY2FsbCBSZWxlYXNlU2VtYXBob3JlKGxvbmcgbG9uZyBwdHIpIFJlbGVhc2VTZW1hcGhvcmUKQEAgLTY1Nyw3ICs2NTcsNyBAQAogNjY2IHN0dWIgU2V0U3lzdGVtVGltZUFkanVzdG1lbnQKIDY2NyBzdHViIFNldFRhcGVQYXJhbWV0ZXJzCiA2Njggc3R1YiBTZXRUYXBlUG9zaXRpb24KLTY2OSBzdGRjYWxsIFNldFRocmVhZEFmZmluaXR5TWFzayhsb25nIGxvbmcpCVNldFRocmVhZEFmZmluaXR5TWFzaworNjY5IHN0ZGNhbGwgU2V0VGhyZWFkQWZmaW5pdHlNYXNrKGxvbmcgbG9uZykgU2V0VGhyZWFkQWZmaW5pdHlNYXNrCiA2NzAgc3R1YiBTZXRUaHJlYWRDb250ZXh0CiA2NzEgc3R1YiBTZXRUaHJlYWRMb2NhbGUKIDY3MiBzdGRjYWxsIFNldFRocmVhZFByaW9yaXR5KGxvbmcgbG9uZykgU2V0VGhyZWFkUHJpb3JpdHkKQEAgLTY3Nyw3ICs2NzcsNyBAQAogNjg2IHN0dWIgVGhyZWFkMzJGaXJzdAogNjg3IHN0dWIgVGhyZWFkMzJOZXh0CiA2ODggc3RkY2FsbCBUaHVua0Nvbm5lY3QzMihwdHIgc3RyIHN0ciBzdHIgcHRyIHB0cikgVGh1bmtDb25uZWN0MzIKLTY4OSBzdGRjYWxsIFRsc0FsbG9jKCkJVGxzQWxsb2MKKzY4OSBzdGRjYWxsIFRsc0FsbG9jKCkgVGxzQWxsb2MKIDY5MCBzdHViIFRsc0FsbG9jSW50ZXJuYWwKIDY5MSBzdGRjYWxsIFRsc0ZyZWUobG9uZykgVGxzRnJlZQogNjkyIHN0dWIgVGxzRnJlZUludGVybmFsCkBAIC03MTAsMTIgKzcxMCwxMiBAQAogNzE5IHN0dWIgV2FpdENvbW1FdmVudAogNzIwIHN0dWIgV2FpdEZvckRlYnVnRXZlbnQKIDcyMSBzdGRjYWxsIFdhaXRGb3JNdWx0aXBsZU9iamVjdHMobG9uZyBwdHIgbG9uZyBsb25nKSBXYWl0Rm9yTXVsdGlwbGVPYmplY3RzCi03MjIgc3R1YiBXYWl0Rm9yTXVsdGlwbGVPYmplY3RzRXgKKzcyMiBzdGRjYWxsIFdhaXRGb3JNdWx0aXBsZU9iamVjdHNFeChsb25nIHB0ciBsb25nIGxvbmcgbG9uZykgV2FpdEZvck11bHRpcGxlT2JqZWN0c0V4CiA3MjMgc3RkY2FsbCBXYWl0Rm9yU2luZ2xlT2JqZWN0KGxvbmcgbG9uZykgV2FpdEZvclNpbmdsZU9iamVjdAogNzI0IHN0ZGNhbGwgV2FpdEZvclNpbmdsZU9iamVjdEV4KGxvbmcgbG9uZyBsb25nKSBXYWl0Rm9yU2luZ2xlT2JqZWN0RXgKIDcyNSBzdHViIFdhaXROYW1lZFBpcGVBCiA3MjYgc3R1YiBXYWl0TmFtZWRQaXBlVwotNzI3IHN0ZGNhbGwgV2lkZUNoYXJUb011bHRpQnl0ZShsb25nIGxvbmcgd3N0ciBsb25nIHB0ciBsb25nIHB0ciBwdHIpCVdpZGVDaGFyVG9NdWx0aUJ5dGUKKzcyNyBzdGRjYWxsIFdpZGVDaGFyVG9NdWx0aUJ5dGUobG9uZyBsb25nIHdzdHIgbG9uZyBwdHIgbG9uZyBwdHIgcHRyKSBXaWRlQ2hhclRvTXVsdGlCeXRlCiA3Mjggc3RkY2FsbCBXaW5FeGVjKHN0ciBsb25nKSBXaW5FeGVjMzIKIDcyOSBzdGRjYWxsIFdyaXRlQ29uc29sZUEobG9uZyBwdHIgbG9uZyBwdHIgcHRyKSBXcml0ZUNvbnNvbGUzMkEKIDczMCBzdHViIFdyaXRlQ29uc29sZUlucHV0QQpAQCAtODg2LDcgKzg4Niw3IEBACiA4OTUgc3R1YiBTaWduYWxPYmplY3RBbmRXYWl0CiA4OTYgc3R1YiBTd2l0Y2hUb0ZpYmVyCiA4OTcgc3R1YiBTd2l0Y2hUb1RocmVhZAotODk4IHN0dWIgVHJ5RW50ZXJDcml0aWNhbFNlY3Rpb24KKzg5OCBzdGRjYWxsIFRyeUVudGVyQ3JpdGljYWxTZWN0aW9uKHB0cikgVHJ5RW50ZXJDcml0aWNhbFNlY3Rpb24KIDg5OSBzdHViIFZpcnR1YWxBbGxvY0V4CiA5MDAgc3R1YiBWaXJ0dWFsRnJlZUV4CiA5MDEgc3R1YiBXcml0ZUZpbGVHYXRoZXIKZGlmZiAtLWdpdCBhL3JlbGF5MzIvbnRkbGwuc3BlYyBiL3JlbGF5MzIvbnRkbGwuc3BlYwppbmRleCA0Mjk1ZWNjLi41MzFlZjgwIDEwMDY0NAotLS0gYS9yZWxheTMyL250ZGxsLnNwZWMKKysrIGIvcmVsYXkzMi9udGRsbC5zcGVjCkBAIC04OSw3ICs4OSw3IEBACiAwODYgc3R1YiBOdENyZWF0ZVRocmVhZAogMDg3IHN0dWIgTnRDcmVhdGVUaW1lcgogMDg4IHN0dWIgTnRDcmVhdGVUb2tlbgotMDg5IHJlZ2lzdGVyIE50Q3VycmVudFRlYigpIE50Q3VycmVudFRlYgorMDg5IHN0ZGNhbGwgTnRDdXJyZW50VGViKCkgTnRDdXJyZW50VGViCiAwOTAgc3R1YiBOdERlbGF5RXhlY3V0aW9uCiAwOTEgc3R1YiBOdERlbGV0ZUZpbGUKIDA5MiBzdHViIE50RGVsZXRlS2V5CkBAIC0zMjcsNyArMzI3LDcgQEAKIDMyNCBzdHViIFJ0bERlY29tcHJlc3NGcmFnbWVudAogMzI1IHN0dWIgUnRsRGVsZXRlCiAzMjYgc3R1YiBSdGxEZWxldGVBY2UKLTMyNyBzdHViIFJ0bERlbGV0ZUNyaXRpY2FsU2VjdGlvbgorMzI3IHN0ZGNhbGwgUnRsRGVsZXRlQ3JpdGljYWxTZWN0aW9uKHB0cikgRGVsZXRlQ3JpdGljYWxTZWN0aW9uCiAzMjggc3R1YiBSdGxEZWxldGVFbGVtZW50R2VuZXJpY1RhYmxlCiAzMjkgc3R1YiBSdGxEZWxldGVSZWdpc3RyeVZhbHVlCiAzMzAgc3R1YiBSdGxEZWxldGVSZXNvdXJjZQpAQCAtOTcxLDMgKzk3MSw0IEBACiA5NjYgc3R1YiBSdGxJc1ZhbGlkSGFuZGxlCiA5Njcgc3R1YiBSdGxMb29rdXBBdG9tSW5BdG9tVGFibGUKIDk2OCBzdHViIFJ0bFF1ZXJ5QXRvbUluQXRvbVRhYmxlCis5Njkgc3RkY2FsbCBSdGxUcnlFbnRlckNyaXRpY2FsU2VjdGlvbihwdHIpIFRyeUVudGVyQ3JpdGljYWxTZWN0aW9uCmRpZmYgLS1naXQgYS9yZWxheTMyL3JlbGF5Mzg2LmMgYi9yZWxheTMyL3JlbGF5Mzg2LmMKaW5kZXggMTUzMWU0YS4uNzUyYTU4MiAxMDA2NDQKLS0tIGEvcmVsYXkzMi9yZWxheTM4Ni5jCisrKyBiL3JlbGF5MzIvcmVsYXkzODYuYwpAQCAtMTAsNiArMTAsNyBAQAogI2luY2x1ZGUgIndpbm50LmgiCiAjaW5jbHVkZSAid2luZG93cy5oIgogI2luY2x1ZGUgImJ1aWx0aW4zMi5oIgorI2luY2x1ZGUgInNlbGVjdG9ycy5oIgogI2luY2x1ZGUgInN0ZGRlYnVnLmgiCiAjaW5jbHVkZSAiZGVidWcuaCIKIApAQCAtMzAsNiArMzEsNyBAQAogICAgIGNoYXIgYnVmZmVyWzgwXTsKICAgICBGQVJQUk9DMzIgZnVuYzsKICAgICB1bnNpZ25lZCBpbnQgbWFzaywgdHlwZW1hc2s7CisgICAgV09SRCBmczsKIAogICAgIGludCAqYXJncyA9ICZyZXRfYWRkcjsKICAgICAvKiBSZWxheSBhZGRyIGlzIHRoZSByZXR1cm4gYWRkcmVzcyBmb3IgdGhpcyBmdW5jdGlvbiAqLwpAQCAtNTYsNyArNTgsOCBAQAogCX0KICAgICAgICAgZWxzZSBwcmludGYoICIlMDh4IiwgYXJnc1tpXSApOwogICAgIH0KLSAgICBwcmludGYoICIpIHJldD0lMDh4XG4iLCByZXRfYWRkciApOworICAgIEdFVF9GUyggZnMgKTsKKyAgICBwcmludGYoICIpIHJldD0lMDh4IGZzPSUwNHhcbiIsIHJldF9hZGRyLCBmcyApOwogICAgIGlmICgqcmVsYXlfYWRkciA9PSAweGMzKSAvKiBjZGVjbCAqLwogICAgIHsKICAgICAgICAgTFJFU1VMVCAoKmNmdW5jKSgpID0gKExSRVNVTFQoKikoKSlmdW5jOwpAQCAtMTM4LDcgKzE0MSw4IEBACiAgICAgICAgICAgICBhc3NlcnQoRkFMU0UpOwogICAgICAgICB9CiAgICAgfQotICAgIHByaW50ZiggIlJldCAgJXMoKSByZXR2YWw9JTA4eCByZXQ9JTA4eFxuIiwgYnVmZmVyLCByZXQsIHJldF9hZGRyICk7CisgICAgcHJpbnRmKCAiUmV0ICAlcygpIHJldHZhbD0lMDh4IHJldD0lMDh4IGZzPSUwNHhcbiIsCisgICAgICAgICAgICBidWZmZXIsIHJldCwgcmV0X2FkZHIsIGZzICk7CiAgICAgcmV0dXJuIHJldDsKIH0KIApkaWZmIC0tZ2l0IGEvcmVsYXkzMi91c2VyMzIuc3BlYyBiL3JlbGF5MzIvdXNlcjMyLnNwZWMKaW5kZXggNWMwOTliYS4uMDZjZTJiMSAxMDA2NDQKLS0tIGEvcmVsYXkzMi91c2VyMzIuc3BlYworKysgYi9yZWxheTMyL3VzZXIzMi5zcGVjCkBAIC00NjIsNyArNDYyLDcgQEAKIDQ1NyBzdGRjYWxsIFNlbmRNZXNzYWdlVGltZW91dEEobG9uZyBsb25nIGxvbmcgbG9uZyBwdHIgcHRyKSBTZW5kTWVzc2FnZVRpbWVvdXQzMkEKIDQ1OCBzdGRjYWxsIFNlbmRNZXNzYWdlVGltZW91dFcobG9uZyBsb25nIGxvbmcgbG9uZyBwdHIgcHRyKSBTZW5kTWVzc2FnZVRpbWVvdXQzMlcKIDQ1OSBzdGRjYWxsIFNlbmRNZXNzYWdlVyhsb25nIGxvbmcgbG9uZyBsb25nKSBTZW5kTWVzc2FnZTMyVwotNDYwIHN0dWIgU2VuZE5vdGlmeU1lc3NhZ2VBCis0NjAgc3RkY2FsbCBTZW5kTm90aWZ5TWVzc2FnZUEobG9uZyBsb25nIGxvbmcgbG9uZykgU2VuZE5vdGlmeU1lc3NhZ2UzMkEKIDQ2MSBzdHViIFNlbmROb3RpZnlNZXNzYWdlVwogNDYyIHN0dWIgU2VydmVyU2V0RnVuY3Rpb25Qb2ludGVycwogNDYzIHN0ZGNhbGwgU2V0QWN0aXZlV2luZG93KGxvbmcpIFNldEFjdGl2ZVdpbmRvdzMyCmRpZmYgLS1naXQgYS9yZWxheTMyL3dpbm1tLnNwZWMgYi9yZWxheTMyL3dpbm1tLnNwZWMKaW5kZXggZGUxYTRlNS4uYTQyMTA4OCAxMDA2NDQKLS0tIGEvcmVsYXkzMi93aW5tbS5zcGVjCisrKyBiL3JlbGF5MzIvd2lubW0uc3BlYwpAQCAtMzEsNyArMzEsNyBAQAogIDI4IHN0ZGNhbGwgam95R2V0RGV2Q2Fwc1cobG9uZyBwdHIgbG9uZykgam95R2V0RGV2Q2FwczMyVwogIDI5IHN0ZGNhbGwgam95R2V0TnVtRGV2cygpIGpveUdldE51bURldnMzMgogIDMwIHN0ZGNhbGwgam95R2V0UG9zKGxvbmcgcHRyKSBqb3lHZXRQb3MzMgotIDMxIHN0dWIgam95R2V0UG9zRXgKKyAzMSBzdGRjYWxsIGpveUdldFBvc0V4KGxvbmcgcHRyKSBqb3lHZXRQb3NFeAogIDMyIHN0ZGNhbGwgam95R2V0VGhyZXNob2xkKGxvbmcgcHRyKSBqb3lHZXRUaHJlc2hvbGQzMgogIDMzIHN0dWIgam95UmVsZWFzZUNhcHR1cmUKICAzNCBzdHViIGpveVNldENhcHR1cmUKZGlmZiAtLWdpdCBhL3JlbGF5MzIvd293MzIuc3BlYyBiL3JlbGF5MzIvd293MzIuc3BlYwppbmRleCAyZjViNTQ4Li40YTM3NzI4IDEwMDY0NAotLS0gYS9yZWxheTMyL3dvdzMyLnNwZWMKKysrIGIvcmVsYXkzMi93b3czMi5zcGVjCkBAIC0xLDcgKzEsNyBAQAogbmFtZQl3b3czMgogdHlwZQl3aW4zMgogCi0jICAxCisgIDEgc3R1YiAgICBXT1dfMQogICAyIHN0dWIgICAgV09XQ2FsbGJhY2sxNgogICAzIHN0dWIgICAgV09XQ2FsbGJhY2sxNkV4CiAgIDQgc3R1YiAgICBXT1dEaXJlY3RlZFlpZWxkMTYKZGlmZiAtLWdpdCBhL3NjaGVkdWxlci9NYWtlZmlsZS5pbiBiL3NjaGVkdWxlci9NYWtlZmlsZS5pbgppbmRleCA3NWZmMDgwLi42MzJmMDQ2IDEwMDY0NAotLS0gYS9zY2hlZHVsZXIvTWFrZWZpbGUuaW4KKysrIGIvc2NoZWR1bGVyL01ha2VmaWxlLmluCkBAIC02LDcgKzYsMTMgQEAKIE1PRFVMRSAgICA9IHNjaGVkdWxlcgogCiBDX1NSQ1MgPSBcCisJY3JpdHNlY3Rpb24uYyBcCisJZXZlbnQuYyBcCisJazMyb2JqLmMgXAorCW11dGV4LmMgXAogCXByb2Nlc3MuYyBcCisJc2VtYXBob3JlLmMgXAorCXN5bmNocm8uYyBcCiAJdGhyZWFkLmMKIAogYWxsOiAkKE1PRFVMRSkubwpkaWZmIC0tZ2l0IGEvc2NoZWR1bGVyL2NyaXRzZWN0aW9uLmMgYi9zY2hlZHVsZXIvY3JpdHNlY3Rpb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZjVjNWI5Ci0tLSAvZGV2L251bGwKKysrIGIvc2NoZWR1bGVyL2NyaXRzZWN0aW9uLmMKQEAgLTAsMCArMSwyODYgQEAKKy8qCisgKiBXaW4zMiBjcml0aWNhbCBzZWN0aW9ucworICoKKyAqIENvcHlyaWdodCAxOTk4IEFsZXhhbmRyZSBKdWxsaWFyZAorICovCisKKy8qIE5vdGU6IGNyaXRpY2FsIHNlY3Rpb25zIGFyZSBub3QgaW1wbGVtZW50ZWQgZXhhY3RseSB0aGUgc2FtZSB3YXkKKyAqIHRoYW4gdW5kZXIgTlQgKExvY2tTZW1hcGhvcmUgc2hvdWxkIGJlIGEgcmVhbCBzZW1hcGhvcmUgaGFuZGxlKS4KKyAqIEJ1dCBzaW5jZSB0aGV5IGFyZSBldmVuIG1vcmUgZGlmZmVyZW50IHVuZGVyIFdpbjk1LCBpdCBwcm9iYWJseQorICogZG9lc24ndCBtYXR0ZXIuLi4gCisgKi8KKworI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzeXMvc2VtLmg+CisjaW5jbHVkZSAid2luZG93cy5oIgorI2luY2x1ZGUgIndpbmVycm9yLmgiCisjaW5jbHVkZSAid2luYmFzZS5oIgorI2luY2x1ZGUgImhlYXAuaCIKKyNpbmNsdWRlICJrMzJvYmouaCIKKyNpbmNsdWRlICJ0aHJlYWQuaCIKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBLMzJPQkogICAgICAgIGhlYWRlcjsKKyAgICBUSFJFQURfUVVFVUUgIHdhaXRfcXVldWU7CisgICAgQk9PTDMyICAgICAgICBzaWduYWxlZDsKK30gQ1JJVF9TRUNUSU9OOworCisKK3N0YXRpYyBCT09MMzIgQ1JJVF9TRUNUSU9OX1NpZ25hbGVkKCBLMzJPQkogKm9iaiwgRFdPUkQgdGhyZWFkX2lkICk7CitzdGF0aWMgdm9pZCBDUklUX1NFQ1RJT05fU2F0aXNmaWVkKCBLMzJPQkogKm9iaiwgRFdPUkQgdGhyZWFkX2lkICk7CitzdGF0aWMgdm9pZCBDUklUX1NFQ1RJT05fQWRkV2FpdCggSzMyT0JKICpvYmosIERXT1JEIHRocmVhZF9pZCApOworc3RhdGljIHZvaWQgQ1JJVF9TRUNUSU9OX1JlbW92ZVdhaXQoIEszMk9CSiAqb2JqLCBEV09SRCB0aHJlYWRfaWQgKTsKK3N0YXRpYyB2b2lkIENSSVRfU0VDVElPTl9EZXN0cm95KCBLMzJPQkogKm9iaiApOworCitjb25zdCBLMzJPQkpfT1BTIENSSVRJQ0FMX1NFQ1RJT05fT3BzID0KK3sKKyAgICBDUklUX1NFQ1RJT05fU2lnbmFsZWQsICAgICAvKiBzaWduYWxlZCAqLworICAgIENSSVRfU0VDVElPTl9TYXRpc2ZpZWQsICAgIC8qIHNhdGlzZmllZCAqLworICAgIENSSVRfU0VDVElPTl9BZGRXYWl0LCAgICAgIC8qIGFkZF93YWl0ICovCisgICAgQ1JJVF9TRUNUSU9OX1JlbW92ZVdhaXQsICAgLyogcmVtb3ZlX3dhaXQgKi8KKyAgICBDUklUX1NFQ1RJT05fRGVzdHJveSAgICAgICAvKiBkZXN0cm95ICovCit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBJbml0aWFsaXplQ3JpdGljYWxTZWN0aW9uICAgKEtFUk5FTDMyLjQ3MikgKE5URExMLjQwNikKKyAqLwordm9pZCBXSU5BUEkgSW5pdGlhbGl6ZUNyaXRpY2FsU2VjdGlvbiggQ1JJVElDQUxfU0VDVElPTiAqY3JpdCApCit7CisgICAgQ1JJVF9TRUNUSU9OICpvYmo7CisKKyAgICBjcml0LT5Mb2NrQ291bnQgICAgICA9IC0xOworICAgIGNyaXQtPlJlY3Vyc2lvbkNvdW50ID0gMDsKKyAgICBjcml0LT5Pd25pbmdUaHJlYWQgICA9IDA7CisgICAgY3JpdC0+TG9ja1NlbWFwaG9yZSAgPSAwOworICAgIGlmIChTeXN0ZW1IZWFwKQorICAgIHsKKyAgICAgICAgaWYgKCEob2JqID0gKENSSVRfU0VDVElPTiAqKUhlYXBBbGxvYyggU3lzdGVtSGVhcCwgMCwgc2l6ZW9mKCpvYmopICkpKQorICAgICAgICAgICAgcmV0dXJuOyAgLyogTm8gd2F5IHRvIHJldHVybiBhbiBlcnJvci4uLiAqLworICAgICAgICBvYmotPmhlYWRlci50eXBlICAgICA9IEszMk9CSl9DUklUSUNBTF9TRUNUSU9OOworICAgICAgICBvYmotPmhlYWRlci5yZWZjb3VudCA9IDE7CisgICAgICAgIG9iai0+d2FpdF9xdWV1ZSAgICAgID0gTlVMTDsKKyAgICAgICAgb2JqLT5zaWduYWxlZCAgICAgICAgPSBGQUxTRTsKKyAgICAgICAgY3JpdC0+TG9ja1NlbWFwaG9yZSAgPSAoSEFORExFMzIpb2JqOworICAgICAgICBjcml0LT5SZXNlcnZlZCAgICAgICA9IChEV09SRCktMTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgdW5pb24gc2VtdW4gdmFsOworICAgICAgICBjcml0LT5SZXNlcnZlZCA9IChEV09SRClzZW1nZXQoIElQQ19QUklWQVRFLCAxLCBJUENfQ1JFQVQgfCAwNzc3ICk7CisgICAgICAgIGlmIChjcml0LT5SZXNlcnZlZCA9PSAoRFdPUkQpLTEpCisgICAgICAgIHsKKyAgICAgICAgICAgIHBlcnJvciggInNlbWdldCIgKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICB2YWwudmFsID0gMDsKKyAgICAgICAgc2VtY3RsKCAoaW50KWNyaXQtPlJlc2VydmVkLCAwLCBTRVRWQUwsIHZhbCApOworICAgIH0KK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBEZWxldGVDcml0aWNhbFNlY3Rpb24gICAoS0VSTkVMMzIuMTg1KSAoTlRETEwuMzI3KQorICovCit2b2lkIFdJTkFQSSBEZWxldGVDcml0aWNhbFNlY3Rpb24oIENSSVRJQ0FMX1NFQ1RJT04gKmNyaXQgKQoreworICAgIENSSVRfU0VDVElPTiAqb2JqID0gKENSSVRfU0VDVElPTiAqKWNyaXQtPkxvY2tTZW1hcGhvcmU7CisKKyAgICBpZiAob2JqKQorICAgIHsKKyAgICAgICAgaWYgKGNyaXQtPlJlY3Vyc2lvbkNvdW50KSAgLyogU2hvdWxkIG5vdCBoYXBwZW4gKi8KKyAgICAgICAgICAgIGZwcmludGYoIHN0ZGVyciwgIkRlbGV0aW5nIG93bmVkIGNyaXRpY2FsIHNlY3Rpb24gKCVwKVxuIiwgY3JpdCApOworICAgICAgICBjcml0LT5Mb2NrQ291bnQgICAgICA9IC0xOworICAgICAgICBjcml0LT5SZWN1cnNpb25Db3VudCA9IDA7CisgICAgICAgIGNyaXQtPk93bmluZ1RocmVhZCAgID0gMDsKKyAgICAgICAgY3JpdC0+TG9ja1NlbWFwaG9yZSAgPSAwOworICAgICAgICBLMzJPQkpfRGVjQ291bnQoICZvYmotPmhlYWRlciApOworICAgIH0KKyAgICBlbHNlIGlmIChjcml0LT5SZXNlcnZlZCAhPSAoRFdPUkQpLTEpCisgICAgeworICAgICAgICBzZW1jdGwoIChpbnQpY3JpdC0+UmVzZXJ2ZWQsIDAsIElQQ19STUlELCAodW5pb24gc2VtdW4pMCApOworICAgIH0KK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBFbnRlckNyaXRpY2FsU2VjdGlvbiAgIChLRVJORUwzMi4xOTUpIChOVERMTC4zNDQpCisgKi8KK3ZvaWQgV0lOQVBJIEVudGVyQ3JpdGljYWxTZWN0aW9uKCBDUklUSUNBTF9TRUNUSU9OICpjcml0ICkKK3sKKyAgICBpZiAoSW50ZXJsb2NrZWRJbmNyZW1lbnQoICZjcml0LT5Mb2NrQ291bnQgKSkKKyAgICB7CisgICAgICAgIGlmIChjcml0LT5Pd25pbmdUaHJlYWQgPT0gR2V0Q3VycmVudFRocmVhZElkKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNyaXQtPlJlY3Vyc2lvbkNvdW50Kys7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgLyogTm93IHdhaXQgZm9yIGl0ICovCisgICAgICAgIGlmIChjcml0LT5Mb2NrU2VtYXBob3JlKQorICAgICAgICB7CisgICAgICAgICAgICBXQUlUX1NUUlVDVCAqd2FpdCA9ICZUSFJFQURfQ3VycmVudCgpLT53YWl0X3N0cnVjdDsKKyAgICAgICAgICAgIFNZU1RFTV9MT0NLKCk7CisgICAgICAgICAgICB3YWl0LT5jb3VudCAgICA9IDE7CisgICAgICAgICAgICB3YWl0LT5zaWduYWxlZCA9IFdBSVRfRkFJTEVEOworICAgICAgICAgICAgd2FpdC0+d2FpdF9hbGwgPSBGQUxTRTsKKyAgICAgICAgICAgIHdhaXQtPm9ianNbMF0gPSAoSzMyT0JKICopY3JpdC0+TG9ja1NlbWFwaG9yZTsKKyAgICAgICAgICAgIEszMk9CSl9JbmNDb3VudCggd2FpdC0+b2Jqc1swXSApOworICAgICAgICAgICAgU1lOQ19XYWl0Rm9yQ29uZGl0aW9uKCB3YWl0LCBJTkZJTklURTMyICk7CisgICAgICAgICAgICBLMzJPQkpfRGVjQ291bnQoIHdhaXQtPm9ianNbMF0gKTsKKyAgICAgICAgICAgIFNZU1RFTV9VTkxPQ0soKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChjcml0LT5SZXNlcnZlZCAhPSAoRFdPUkQpLTEpCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCByZXQ7CisgICAgICAgICAgICBzdHJ1Y3Qgc2VtYnVmIHNvcDsKKyAgICAgICAgICAgIHNvcC5zZW1fbnVtID0gMDsKKyAgICAgICAgICAgIHNvcC5zZW1fb3AgID0gLTE7CisgICAgICAgICAgICBzb3Auc2VtX2ZsZyA9IFNFTV9VTkRPOworICAgICAgICAgICAgZG8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXQgPSBzZW1vcCggKGludCljcml0LT5SZXNlcnZlZCwgJnNvcCwgMSApOworICAgICAgICAgICAgfSB3aGlsZSAoKHJldCA9PSAtMSkgJiYgKGVycm5vID09IEVJTlRSKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBmcHJpbnRmKCBzdGRlcnIsICJVbmluaXRpYWxpemVkIGNyaXRpY2FsIHNlY3Rpb24gKCVwKVxuIiwgY3JpdCApOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorICAgIGNyaXQtPk93bmluZ1RocmVhZCAgID0gR2V0Q3VycmVudFRocmVhZElkKCk7CisgICAgY3JpdC0+UmVjdXJzaW9uQ291bnQgPSAxOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIFRyeUVudGVyQ3JpdGljYWxTZWN0aW9uICAgKEtFUk5FTDMyLjg5OCkgKE5URExMLjk2OSkKKyAqLworQk9PTDMyIFdJTkFQSSBUcnlFbnRlckNyaXRpY2FsU2VjdGlvbiggQ1JJVElDQUxfU0VDVElPTiAqY3JpdCApCit7CisgICAgaWYgKEludGVybG9ja2VkSW5jcmVtZW50KCAmY3JpdC0+TG9ja0NvdW50ICkpCisgICAgeworICAgICAgICBpZiAoY3JpdC0+T3duaW5nVGhyZWFkID09IEdldEN1cnJlbnRUaHJlYWRJZCgpKQorICAgICAgICB7CisgICAgICAgICAgICBjcml0LT5SZWN1cnNpb25Db3VudCsrOworICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIH0KKyAgICAgICAgLyogRklYTUU6IHRoaXMgZG9lc24ndCB3b3JrICovCisgICAgICAgIEludGVybG9ja2VkRGVjcmVtZW50KCAmY3JpdC0+TG9ja0NvdW50ICk7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgICAgY3JpdC0+T3duaW5nVGhyZWFkICAgPSBHZXRDdXJyZW50VGhyZWFkSWQoKTsKKyAgICBjcml0LT5SZWN1cnNpb25Db3VudCA9IDE7CisgICAgcmV0dXJuIFRSVUU7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgTGVhdmVDcml0aWNhbFNlY3Rpb24gICAoS0VSTkVMMzIuNDk0KSAoTlRETEwuNDI2KQorICovCit2b2lkIFdJTkFQSSBMZWF2ZUNyaXRpY2FsU2VjdGlvbiggQ1JJVElDQUxfU0VDVElPTiAqY3JpdCApCit7CisgICAgaWYgKGNyaXQtPk93bmluZ1RocmVhZCAhPSBHZXRDdXJyZW50VGhyZWFkSWQoKSkgcmV0dXJuOworICAgICAgIAorICAgIGlmICgtLWNyaXQtPlJlY3Vyc2lvbkNvdW50KQorICAgIHsKKyAgICAgICAgSW50ZXJsb2NrZWREZWNyZW1lbnQoICZjcml0LT5Mb2NrQ291bnQgKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBjcml0LT5Pd25pbmdUaHJlYWQgPSAwOworICAgIGlmIChJbnRlcmxvY2tlZERlY3JlbWVudCggJmNyaXQtPkxvY2tDb3VudCApID49IDApCisgICAgeworICAgICAgICAvKiBTb21lb25lIGlzIHdhaXRpbmcgKi8KKyAgICAgICAgaWYgKGNyaXQtPkxvY2tTZW1hcGhvcmUpCisgICAgICAgIHsKKyAgICAgICAgICAgIENSSVRfU0VDVElPTiAqb2JqID0gKENSSVRfU0VDVElPTiAqKWNyaXQtPkxvY2tTZW1hcGhvcmU7CisgICAgICAgICAgICBTWVNURU1fTE9DSygpOworICAgICAgICAgICAgb2JqLT5zaWduYWxlZCA9IFRSVUU7CisgICAgICAgICAgICBTWU5DX1dha2VVcCggJm9iai0+d2FpdF9xdWV1ZSwgMSApOworICAgICAgICAgICAgU1lTVEVNX1VOTE9DSygpOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKGNyaXQtPlJlc2VydmVkICE9IChEV09SRCktMSkKKyAgICAgICAgeworICAgICAgICAgICAgc3RydWN0IHNlbWJ1ZiBzb3A7CisgICAgICAgICAgICBzb3Auc2VtX251bSA9IDA7CisgICAgICAgICAgICBzb3Auc2VtX29wICA9IDE7CisgICAgICAgICAgICBzb3Auc2VtX2ZsZyA9IFNFTV9VTkRPOworICAgICAgICAgICAgc2Vtb3AoIChpbnQpY3JpdC0+UmVzZXJ2ZWQsICZzb3AsIDEgKTsKKyAgICAgICAgfQorICAgIH0KK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBNYWtlQ3JpdGljYWxTZWN0aW9uR2xvYmFsICAgKEtFUk5FTDMyLjUxNSkKKyAqLwordm9pZCBXSU5BUEkgTWFrZUNyaXRpY2FsU2VjdGlvbkdsb2JhbCggQ1JJVElDQUxfU0VDVElPTiAqY3JpdCApCit7CisgICAgLyogTm90aGluZyB0byBkbzogYSBjcml0aWNhbCBzZWN0aW9uIGlzIGFsd2F5cyBnbG9iYWwgKi8KK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBDUklUX1NFQ1RJT05fU2lnbmFsZWQKKyAqLworc3RhdGljIEJPT0wzMiBDUklUX1NFQ1RJT05fU2lnbmFsZWQoIEszMk9CSiAqb2JqLCBEV09SRCB0aHJlYWRfaWQgKQoreworICAgIENSSVRfU0VDVElPTiAqY3JpdCA9IChDUklUX1NFQ1RJT04gKilvYmo7CisgICAgYXNzZXJ0KCBvYmotPnR5cGUgPT0gSzMyT0JKX0NSSVRJQ0FMX1NFQ1RJT04gKTsKKyAgICByZXR1cm4gY3JpdC0+c2lnbmFsZWQ7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgQ1JJVF9TRUNUSU9OX1NhdGlzZmllZAorICoKKyAqIFdhaXQgb24gdGhpcyBvYmplY3QgaGFzIGJlZW4gc2F0aXNmaWVkLgorICovCitzdGF0aWMgdm9pZCBDUklUX1NFQ1RJT05fU2F0aXNmaWVkKCBLMzJPQkogKm9iaiwgRFdPUkQgdGhyZWFkX2lkICkKK3sKKyAgICBDUklUX1NFQ1RJT04gKmNyaXQgPSAoQ1JJVF9TRUNUSU9OICopb2JqOworICAgIGFzc2VydCggb2JqLT50eXBlID09IEszMk9CSl9DUklUSUNBTF9TRUNUSU9OICk7CisgICAgLyogT25seSBvbmUgdGhyZWFkIGlzIGFsbG93ZWQgdG8gd2FrZSB1cCAqLworICAgIGNyaXQtPnNpZ25hbGVkID0gRkFMU0U7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgQ1JJVF9TRUNUSU9OX0FkZFdhaXQKKyAqCisgKiBBZGQgdGhyZWFkIHRvIG9iamVjdCB3YWl0IHF1ZXVlLgorICovCitzdGF0aWMgdm9pZCBDUklUX1NFQ1RJT05fQWRkV2FpdCggSzMyT0JKICpvYmosIERXT1JEIHRocmVhZF9pZCApCit7CisgICAgQ1JJVF9TRUNUSU9OICpjcml0ID0gKENSSVRfU0VDVElPTiAqKW9iajsKKyAgICBhc3NlcnQoIG9iai0+dHlwZSA9PSBLMzJPQkpfQ1JJVElDQUxfU0VDVElPTiApOworICAgIFRIUkVBRF9BZGRRdWV1ZSggJmNyaXQtPndhaXRfcXVldWUsIFRIUkVBRF9JRF9UT19USERCKHRocmVhZF9pZCkgKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBDUklUX1NFQ1RJT05fUmVtb3ZlV2FpdAorICoKKyAqIFJlbW92ZSBjdXJyZW50IHRocmVhZCBmcm9tIG9iamVjdCB3YWl0IHF1ZXVlLgorICovCitzdGF0aWMgdm9pZCBDUklUX1NFQ1RJT05fUmVtb3ZlV2FpdCggSzMyT0JKICpvYmosIERXT1JEIHRocmVhZF9pZCApCit7CisgICAgQ1JJVF9TRUNUSU9OICpjcml0ID0gKENSSVRfU0VDVElPTiAqKW9iajsKKyAgICBhc3NlcnQoIG9iai0+dHlwZSA9PSBLMzJPQkpfQ1JJVElDQUxfU0VDVElPTiApOworICAgIFRIUkVBRF9SZW1vdmVRdWV1ZSggJmNyaXQtPndhaXRfcXVldWUsIFRIUkVBRF9JRF9UT19USERCKHRocmVhZF9pZCkgKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBDUklUX1NFQ1RJT05fRGVzdHJveQorICovCitzdGF0aWMgdm9pZCBDUklUX1NFQ1RJT05fRGVzdHJveSggSzMyT0JKICpvYmogKQoreworICAgIENSSVRfU0VDVElPTiAqY3JpdCA9IChDUklUX1NFQ1RJT04gKilvYmo7CisgICAgYXNzZXJ0KCBvYmotPnR5cGUgPT0gSzMyT0JKX0NSSVRJQ0FMX1NFQ1RJT04gKTsKKyAgICAvKiBUaGVyZSBjYW5ub3QgYmUgYW55IHRocmVhZCBvbiB0aGUgbGlzdCBzaW5jZSB0aGUgcmVmIGNvdW50IGlzIDAgKi8KKyAgICBhc3NlcnQoIGNyaXQtPndhaXRfcXVldWUgPT0gTlVMTCApOworICAgIG9iai0+dHlwZSA9IEszMk9CSl9VTktOT1dOOworICAgIEhlYXBGcmVlKCBTeXN0ZW1IZWFwLCAwLCBjcml0ICk7Cit9CmRpZmYgLS1naXQgYS9zY2hlZHVsZXIvZXZlbnQuYyBiL3NjaGVkdWxlci9ldmVudC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlYjVlMGMKLS0tIC9kZXYvbnVsbAorKysgYi9zY2hlZHVsZXIvZXZlbnQuYwpAQCAtMCwwICsxLDI2OCBAQAorLyoKKyAqIFdpbjMyIGV2ZW50cworICoKKyAqIENvcHlyaWdodCAxOTk4IEFsZXhhbmRyZSBKdWxsaWFyZAorICovCisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlICJ3aW5kb3dzLmgiCisjaW5jbHVkZSAid2luZXJyb3IuaCIKKyNpbmNsdWRlICJrMzJvYmouaCIKKyNpbmNsdWRlICJwcm9jZXNzLmgiCisjaW5jbHVkZSAidGhyZWFkLmgiCisjaW5jbHVkZSAiaGVhcC5oIgorCit0eXBlZGVmIHN0cnVjdAoreworICAgIEszMk9CSiAgICAgICAgaGVhZGVyOworICAgIFRIUkVBRF9RVUVVRSAgd2FpdF9xdWV1ZTsKKyAgICBCT09MMzIgICAgICAgIG1hbnVhbF9yZXNldDsKKyAgICBCT09MMzIgICAgICAgIHNpZ25hbGVkOworfSBFVkVOVDsKKworc3RhdGljIEJPT0wzMiBFVkVOVF9TaWduYWxlZCggSzMyT0JKICpvYmosIERXT1JEIHRocmVhZF9pZCApOworc3RhdGljIHZvaWQgRVZFTlRfU2F0aXNmaWVkKCBLMzJPQkogKm9iaiwgRFdPUkQgdGhyZWFkX2lkICk7CitzdGF0aWMgdm9pZCBFVkVOVF9BZGRXYWl0KCBLMzJPQkogKm9iaiwgRFdPUkQgdGhyZWFkX2lkICk7CitzdGF0aWMgdm9pZCBFVkVOVF9SZW1vdmVXYWl0KCBLMzJPQkogKm9iaiwgRFdPUkQgdGhyZWFkX2lkICk7CitzdGF0aWMgdm9pZCBFVkVOVF9EZXN0cm95KCBLMzJPQkogKm9iaiApOworCitjb25zdCBLMzJPQkpfT1BTIEVWRU5UX09wcyA9Cit7CisgICAgRVZFTlRfU2lnbmFsZWQsICAgICAvKiBzaWduYWxlZCAqLworICAgIEVWRU5UX1NhdGlzZmllZCwgICAgLyogc2F0aXNmaWVkICovCisgICAgRVZFTlRfQWRkV2FpdCwgICAgICAvKiBhZGRfd2FpdCAqLworICAgIEVWRU5UX1JlbW92ZVdhaXQsICAgLyogcmVtb3ZlX3dhaXQgKi8KKyAgICBFVkVOVF9EZXN0cm95ICAgICAgIC8qIGRlc3Ryb3kgKi8KK307CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgRVZFTlRfU2V0CisgKgorICogSW1wbGVtZW50YXRpb24gb2YgU2V0RXZlbnQuIFVzZWQgYnkgRXhpdFRocmVhZCBhbmQgRXhpdFByb2Nlc3MuCisgKi8KK3ZvaWQgRVZFTlRfU2V0KCBLMzJPQkogKm9iaiApCit7CisgICAgRVZFTlQgKmV2ZW50ID0gKEVWRU5UICopb2JqOworICAgIGFzc2VydCggb2JqLT50eXBlID09IEszMk9CSl9FVkVOVCApOworICAgIFNZU1RFTV9MT0NLKCk7CisgICAgZXZlbnQtPnNpZ25hbGVkID0gVFJVRTsKKyAgICBTWU5DX1dha2VVcCggJmV2ZW50LT53YWl0X3F1ZXVlLCBldmVudC0+bWFudWFsX3Jlc2V0ID8gSU5GSU5JVEUzMiA6IDEgKTsKKyAgICBTWVNURU1fVU5MT0NLKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIEVWRU5UX0NyZWF0ZQorICoKKyAqIFBhcnRpYWwgaW1wbGVtZW50YXRpb24gb2YgQ3JlYXRlRXZlbnQuCisgKiBVc2VkIGludGVybmFsbHkgYnkgcHJvY2Vzc2VzIGFuZCB0aHJlYWRzLgorICovCitLMzJPQkogKkVWRU5UX0NyZWF0ZSggQk9PTDMyIG1hbnVhbF9yZXNldCwgQk9PTDMyIGluaXRpYWxfc3RhdGUgKQoreworICAgIEVWRU5UICpldmVudDsKKworICAgIFNZU1RFTV9MT0NLKCk7CisgICAgaWYgKChldmVudCA9IEhlYXBBbGxvYyggU3lzdGVtSGVhcCwgMCwgc2l6ZW9mKCpldmVudCkgKSkpCisgICAgeworICAgICAgICBldmVudC0+aGVhZGVyLnR5cGUgICAgID0gSzMyT0JKX0VWRU5UOworICAgICAgICBldmVudC0+aGVhZGVyLnJlZmNvdW50ID0gMTsKKyAgICAgICAgZXZlbnQtPndhaXRfcXVldWUgICAgICA9IE5VTEw7CisgICAgICAgIGV2ZW50LT5tYW51YWxfcmVzZXQgICAgPSBtYW51YWxfcmVzZXQ7CisgICAgICAgIGV2ZW50LT5zaWduYWxlZCAgICAgICAgPSBpbml0aWFsX3N0YXRlOworICAgIH0KKyAgICBTWVNURU1fVU5MT0NLKCk7CisgICAgcmV0dXJuIGV2ZW50ID8gJmV2ZW50LT5oZWFkZXIgOiBOVUxMOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIENyZWF0ZUV2ZW50MzJBICAgIChLRVJORUwzMi4xNTYpCisgKi8KK0hBTkRMRTMyIFdJTkFQSSBDcmVhdGVFdmVudDMyQSggU0VDVVJJVFlfQVRUUklCVVRFUyAqc2EsIEJPT0wzMiBtYW51YWxfcmVzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJPT0wzMiBpbml0aWFsX3N0YXRlLCBMUENTVFIgbmFtZSApCit7CisgICAgSEFORExFMzIgaGFuZGxlOworICAgIEVWRU5UICpldmVudDsKKworICAgIFNZU1RFTV9MT0NLKCk7CisgICAgZXZlbnQgPSAoRVZFTlQgKilLMzJPQkpfQ3JlYXRlKCBLMzJPQkpfRVZFTlQsIHNpemVvZigqZXZlbnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwgJmhhbmRsZSApOworICAgIGlmIChldmVudCkKKyAgICB7CisgICAgICAgIC8qIEZpbmlzaCBpbml0aWFsaXppbmcgaXQgKi8KKyAgICAgICAgZXZlbnQtPndhaXRfcXVldWUgICA9IE5VTEw7CisgICAgICAgIGV2ZW50LT5tYW51YWxfcmVzZXQgPSBtYW51YWxfcmVzZXQ7CisgICAgICAgIGV2ZW50LT5zaWduYWxlZCAgICAgPSBpbml0aWFsX3N0YXRlOworICAgICAgICBLMzJPQkpfRGVjQ291bnQoICZldmVudC0+aGVhZGVyICk7CisgICAgfQorICAgIFNZU1RFTV9VTkxPQ0soKTsKKyAgICByZXR1cm4gaGFuZGxlOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIENyZWF0ZUV2ZW50MzJXICAgIChLRVJORUwzMi4xNTcpCisgKi8KK0hBTkRMRTMyIFdJTkFQSSBDcmVhdGVFdmVudDMyVyggU0VDVVJJVFlfQVRUUklCVVRFUyAqc2EsIEJPT0wzMiBtYW51YWxfcmVzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJPT0wzMiBpbml0aWFsX3N0YXRlLCBMUENXU1RSIG5hbWUgKQoreworICAgIExQU1RSIG5hbWVBID0gSEVBUF9zdHJkdXBXdG9BKCBHZXRQcm9jZXNzSGVhcCgpLCAwLCBuYW1lICk7CisgICAgSEFORExFMzIgcmV0ID0gQ3JlYXRlRXZlbnQzMkEoIHNhLCBtYW51YWxfcmVzZXQsIGluaXRpYWxfc3RhdGUsIG5hbWVBICk7CisgICAgaWYgKG5hbWVBKSBIZWFwRnJlZSggR2V0UHJvY2Vzc0hlYXAoKSwgMCwgbmFtZUEgKTsKKyAgICByZXR1cm4gcmV0OworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIE9wZW5FdmVudDMyQSAgICAoS0VSTkVMMzIuNTM2KQorICovCitIQU5ETEUzMiBXSU5BUEkgT3BlbkV2ZW50MzJBKCBEV09SRCBhY2Nlc3MsIEJPT0wzMiBpbmhlcml0LCBMUENTVFIgbmFtZSApCit7CisgICAgSEFORExFMzIgaGFuZGxlID0gMDsKKyAgICBLMzJPQkogKm9iajsKKyAgICBTWVNURU1fTE9DSygpOworICAgIGlmICgob2JqID0gSzMyT0JKX0ZpbmROYW1lVHlwZSggbmFtZSwgSzMyT0JKX0VWRU5UICkpICE9IE5VTEwpCisgICAgeworICAgICAgICBoYW5kbGUgPSBQUk9DRVNTX0FsbG9jSGFuZGxlKCBvYmosIDAgKTsKKyAgICAgICAgSzMyT0JKX0RlY0NvdW50KCBvYmogKTsKKyAgICB9CisgICAgU1lTVEVNX1VOTE9DSygpOworICAgIHJldHVybiBoYW5kbGU7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgT3BlbkV2ZW50MzJXICAgIChLRVJORUwzMi41MzcpCisgKi8KK0hBTkRMRTMyIFdJTkFQSSBPcGVuRXZlbnQzMlcoIERXT1JEIGFjY2VzcywgQk9PTDMyIGluaGVyaXQsIExQQ1dTVFIgbmFtZSApCit7CisgICAgTFBTVFIgbmFtZUEgPSBIRUFQX3N0cmR1cFd0b0EoIEdldFByb2Nlc3NIZWFwKCksIDAsIG5hbWUgKTsKKyAgICBIQU5ETEUzMiByZXQgPSBPcGVuRXZlbnQzMkEoIGFjY2VzcywgaW5oZXJpdCwgbmFtZUEgKTsKKyAgICBpZiAobmFtZUEpIEhlYXBGcmVlKCBHZXRQcm9jZXNzSGVhcCgpLCAwLCBuYW1lQSApOworICAgIHJldHVybiByZXQ7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgUHVsc2VFdmVudCAgICAoS0VSTkVMMzIuNTU3KQorICovCitCT09MMzIgV0lOQVBJIFB1bHNlRXZlbnQoIEhBTkRMRTMyIGhhbmRsZSApCit7CisgICAgRVZFTlQgKmV2ZW50OworICAgIFNZU1RFTV9MT0NLKCk7CisgICAgaWYgKCEoZXZlbnQgPSAoRVZFTlQgKilQUk9DRVNTX0dldE9ialB0ciggaGFuZGxlLCBLMzJPQkpfRVZFTlQgKSkpCisgICAgeworICAgICAgICBTWVNURU1fVU5MT0NLKCk7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgICAgZXZlbnQtPnNpZ25hbGVkID0gVFJVRTsKKyAgICBTWU5DX1dha2VVcCggJmV2ZW50LT53YWl0X3F1ZXVlLCBldmVudC0+bWFudWFsX3Jlc2V0ID8gSU5GSU5JVEUzMiA6IDEgKTsKKyAgICBldmVudC0+c2lnbmFsZWQgPSBGQUxTRTsKKyAgICBLMzJPQkpfRGVjQ291bnQoICZldmVudC0+aGVhZGVyICk7CisgICAgU1lTVEVNX1VOTE9DSygpOworICAgIHJldHVybiBUUlVFOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIFNldEV2ZW50ICAgIChLRVJORUwzMi42NDQpCisgKi8KK0JPT0wzMiBXSU5BUEkgU2V0RXZlbnQoIEhBTkRMRTMyIGhhbmRsZSApCit7CisgICAgRVZFTlQgKmV2ZW50OworICAgIFNZU1RFTV9MT0NLKCk7CisgICAgaWYgKCEoZXZlbnQgPSAoRVZFTlQgKilQUk9DRVNTX0dldE9ialB0ciggaGFuZGxlLCBLMzJPQkpfRVZFTlQgKSkpCisgICAgeworICAgICAgICBTWVNURU1fVU5MT0NLKCk7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgICAgZXZlbnQtPnNpZ25hbGVkID0gVFJVRTsKKyAgICBTWU5DX1dha2VVcCggJmV2ZW50LT53YWl0X3F1ZXVlLCBldmVudC0+bWFudWFsX3Jlc2V0ID8gSU5GSU5JVEUzMiA6IDEgKTsKKyAgICBLMzJPQkpfRGVjQ291bnQoICZldmVudC0+aGVhZGVyICk7CisgICAgU1lTVEVNX1VOTE9DSygpOworICAgIHJldHVybiBUUlVFOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIFJlc2V0RXZlbnQgICAgKEtFUk5FTDMyLjU4NikKKyAqLworQk9PTDMyIFdJTkFQSSBSZXNldEV2ZW50KCBIQU5ETEUzMiBoYW5kbGUgKQoreworICAgIEVWRU5UICpldmVudDsKKyAgICBTWVNURU1fTE9DSygpOworICAgIGlmICghKGV2ZW50ID0gKEVWRU5UICopUFJPQ0VTU19HZXRPYmpQdHIoIGhhbmRsZSwgSzMyT0JKX0VWRU5UICkpKQorICAgIHsKKyAgICAgICAgU1lTVEVNX1VOTE9DSygpOworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICAgIGV2ZW50LT5zaWduYWxlZCA9IEZBTFNFOworICAgIEszMk9CSl9EZWNDb3VudCggJmV2ZW50LT5oZWFkZXIgKTsKKyAgICBTWVNURU1fVU5MT0NLKCk7CisgICAgcmV0dXJuIFRSVUU7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgRVZFTlRfU2lnbmFsZWQKKyAqLworc3RhdGljIEJPT0wzMiBFVkVOVF9TaWduYWxlZCggSzMyT0JKICpvYmosIERXT1JEIHRocmVhZF9pZCApCit7CisgICAgRVZFTlQgKmV2ZW50ID0gKEVWRU5UICopb2JqOworICAgIGFzc2VydCggb2JqLT50eXBlID09IEszMk9CSl9FVkVOVCApOworICAgIHJldHVybiBldmVudC0+c2lnbmFsZWQ7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgRVZFTlRfU2F0aXNmaWVkCisgKgorICogV2FpdCBvbiB0aGlzIG9iamVjdCBoYXMgYmVlbiBzYXRpc2ZpZWQuCisgKi8KK3N0YXRpYyB2b2lkIEVWRU5UX1NhdGlzZmllZCggSzMyT0JKICpvYmosIERXT1JEIHRocmVhZF9pZCApCit7CisgICAgRVZFTlQgKmV2ZW50ID0gKEVWRU5UICopb2JqOworICAgIGFzc2VydCggb2JqLT50eXBlID09IEszMk9CSl9FVkVOVCApOworICAgIC8qIFJlc2V0IGlmIGl0J3MgYW4gYXV0by1yZXNldCBldmVudCAqLworICAgIGlmICghZXZlbnQtPm1hbnVhbF9yZXNldCkgZXZlbnQtPnNpZ25hbGVkID0gRkFMU0U7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgRVZFTlRfQWRkV2FpdAorICoKKyAqIEFkZCB0aHJlYWQgdG8gb2JqZWN0IHdhaXQgcXVldWUuCisgKi8KK3N0YXRpYyB2b2lkIEVWRU5UX0FkZFdhaXQoIEszMk9CSiAqb2JqLCBEV09SRCB0aHJlYWRfaWQgKQoreworICAgIEVWRU5UICpldmVudCA9IChFVkVOVCAqKW9iajsKKyAgICBhc3NlcnQoIG9iai0+dHlwZSA9PSBLMzJPQkpfRVZFTlQgKTsKKyAgICBUSFJFQURfQWRkUXVldWUoICZldmVudC0+d2FpdF9xdWV1ZSwgVEhSRUFEX0lEX1RPX1RIREIodGhyZWFkX2lkKSApOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIEVWRU5UX1JlbW92ZVdhaXQKKyAqCisgKiBSZW1vdmUgdGhyZWFkIGZyb20gb2JqZWN0IHdhaXQgcXVldWUuCisgKi8KK3N0YXRpYyB2b2lkIEVWRU5UX1JlbW92ZVdhaXQoIEszMk9CSiAqb2JqLCBEV09SRCB0aHJlYWRfaWQgKQoreworICAgIEVWRU5UICpldmVudCA9IChFVkVOVCAqKW9iajsKKyAgICBhc3NlcnQoIG9iai0+dHlwZSA9PSBLMzJPQkpfRVZFTlQgKTsKKyAgICBUSFJFQURfUmVtb3ZlUXVldWUoICZldmVudC0+d2FpdF9xdWV1ZSwgVEhSRUFEX0lEX1RPX1RIREIodGhyZWFkX2lkKSApOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIEVWRU5UX0Rlc3Ryb3kKKyAqLworc3RhdGljIHZvaWQgRVZFTlRfRGVzdHJveSggSzMyT0JKICpvYmogKQoreworICAgIEVWRU5UICpldmVudCA9IChFVkVOVCAqKW9iajsKKyAgICBhc3NlcnQoIG9iai0+dHlwZSA9PSBLMzJPQkpfRVZFTlQgKTsKKyAgICAvKiBUaGVyZSBjYW5ub3QgYmUgYW55IHRocmVhZCBvbiB0aGUgbGlzdCBzaW5jZSB0aGUgcmVmIGNvdW50IGlzIDAgKi8KKyAgICBhc3NlcnQoIGV2ZW50LT53YWl0X3F1ZXVlID09IE5VTEwgKTsKKyAgICBvYmotPnR5cGUgPSBLMzJPQkpfVU5LTk9XTjsKKyAgICBIZWFwRnJlZSggU3lzdGVtSGVhcCwgMCwgZXZlbnQgKTsKK30KZGlmZiAtLWdpdCBhL3NjaGVkdWxlci9rMzJvYmouYyBiL3NjaGVkdWxlci9rMzJvYmouYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMjU4OWNlCi0tLSAvZGV2L251bGwKKysrIGIvc2NoZWR1bGVyL2szMm9iai5jCkBAIC0wLDAgKzEsMjYwIEBACisvKgorICogS0VSTkVMMzIgb2JqZWN0cworICoKKyAqIENvcHlyaWdodCAxOTk2IEFsZXhhbmRyZSBKdWxsaWFyZAorICovCisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlICJ3aW5lcnJvci5oIgorI2luY2x1ZGUgImszMm9iai5oIgorI2luY2x1ZGUgImhlYXAuaCIKKyNpbmNsdWRlICJwcm9jZXNzLmgiCisKKworLyogVGhlIGRlY2xhcmF0aW9ucyBhcmUgaGVyZSB0byBhdm9pZCBpbmNsdWRpbmcgYSBsb3Qgb2YgdW5uZWNlc3NhcnkgZmlsZXMgKi8KK2V4dGVybiBjb25zdCBLMzJPQkpfT1BTIFNFTUFQSE9SRV9PcHM7CitleHRlcm4gY29uc3QgSzMyT0JKX09QUyBFVkVOVF9PcHM7CitleHRlcm4gY29uc3QgSzMyT0JKX09QUyBNVVRFWF9PcHM7CitleHRlcm4gY29uc3QgSzMyT0JKX09QUyBDUklUSUNBTF9TRUNUSU9OX09wczsKK2V4dGVybiBjb25zdCBLMzJPQkpfT1BTIFBST0NFU1NfT3BzOworZXh0ZXJuIGNvbnN0IEszMk9CSl9PUFMgVEhSRUFEX09wczsKK2V4dGVybiBjb25zdCBLMzJPQkpfT1BTIEZJTEVfT3BzOworZXh0ZXJuIGNvbnN0IEszMk9CSl9PUFMgTUVNX01BUFBFRF9GSUxFX09wczsKKworc3RhdGljIGNvbnN0IEszMk9CSl9PUFMgSzMyT0JKX051bGxPcHMgPQoreworICAgIE5VTEwsICAgIC8qIHNpZ25hbGVkICovCisgICAgTlVMTCwgICAgLyogc2F0aXNmaWVkICovCisgICAgTlVMTCwgICAgLyogYWRkX3dhaXQgKi8KKyAgICBOVUxMLCAgICAvKiByZW1vdmVfd2FpdCAqLworICAgIE5VTEwgICAgIC8qIGRlc3Ryb3kgKi8KK307CisKK2NvbnN0IEszMk9CSl9PUFMgKiBjb25zdCBLMzJPQkpfT3BzW0szMk9CSl9OQk9CSkVDVFNdID0KK3sKKyAgICBOVUxMLAorICAgICZTRU1BUEhPUkVfT3BzLCAgICAgICAgIC8qIEszMk9CSl9TRU1BUEhPUkUgKi8KKyAgICAmRVZFTlRfT3BzLCAgICAgICAgICAgICAvKiBLMzJPQkpfRVZFTlQgKi8KKyAgICAmTVVURVhfT3BzLCAgICAgICAgICAgICAvKiBLMzJPQkpfTVVURVggKi8KKyAgICAmQ1JJVElDQUxfU0VDVElPTl9PcHMsICAvKiBLMzJPQkpfQ1JJVElDQUxfU0VDVElPTiAqLworICAgICZQUk9DRVNTX09wcywgICAgICAgICAgIC8qIEszMk9CSl9QUk9DRVNTICovCisgICAgJlRIUkVBRF9PcHMsICAgICAgICAgICAgLyogSzMyT0JKX1RIUkVBRCAqLworICAgICZGSUxFX09wcywgICAgICAgICAgICAgIC8qIEszMk9CSl9GSUxFICovCisgICAgJkszMk9CSl9OdWxsT3BzLCAgICAgICAgLyogSzMyT0JKX0NIQU5HRSAqLworICAgICZLMzJPQkpfTnVsbE9wcywgICAgICAgIC8qIEszMk9CSl9DT05TT0xFICovCisgICAgJkszMk9CSl9OdWxsT3BzLCAgICAgICAgLyogSzMyT0JKX1NDUkVFTl9CVUZGRVIgKi8KKyAgICAmTUVNX01BUFBFRF9GSUxFX09wcywgICAvKiBLMzJPQkpfTUVNX01BUFBFRF9GSUxFICovCisgICAgJkszMk9CSl9OdWxsT3BzLCAgICAgICAgLyogSzMyT0JKX1NFUklBTCAqLworICAgICZLMzJPQkpfTnVsbE9wcywgICAgICAgIC8qIEszMk9CSl9ERVZJQ0VfSU9DVEwgKi8KKyAgICAmSzMyT0JKX051bGxPcHMsICAgICAgICAvKiBLMzJPQkpfUElQRSAqLworICAgICZLMzJPQkpfTnVsbE9wcywgICAgICAgIC8qIEszMk9CSl9NQUlMU0xPVCAqLworICAgICZLMzJPQkpfTnVsbE9wcywgICAgICAgIC8qIEszMk9CSl9UT09MSEVMUF9TTkFQU0hPVCAqLworICAgICZLMzJPQkpfTnVsbE9wcyAgICAgICAgIC8qIEszMk9CSl9TT0NLRVQgKi8KK307CisKK3R5cGVkZWYgc3RydWN0IF9ORQoreworICAgIHN0cnVjdCBfTkUgKm5leHQ7CisgICAgSzMyT0JKICAgICAqb2JqOworICAgIFVJTlQzMiAgICAgIGxlbjsKKyAgICBjaGFyICAgICAgICBuYW1lWzFdOworfSBOQU1FX0VOVFJZOworCitzdGF0aWMgTkFNRV9FTlRSWSAqSzMyT0JKX0ZpcnN0RW50cnkgPSBOVUxMOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIEszMk9CSl9JbmNDb3VudAorICovCit2b2lkIEszMk9CSl9JbmNDb3VudCggSzMyT0JKICpwdHIgKQoreworICAgIGFzc2VydCggcHRyLT50eXBlICYmICgodW5zaWduZWQpcHRyLT50eXBlIDwgSzMyT0JKX05CT0JKRUNUUykgKTsKKyAgICBTWVNURU1fTE9DSygpOworICAgIHB0ci0+cmVmY291bnQrKzsKKyAgICBTWVNURU1fVU5MT0NLKCk7CisgICAgYXNzZXJ0KCBwdHItPnJlZmNvdW50ID4gMCApOyAgLyogTm8gd3JhcC1hcm91bmQgYWxsb3dlZCAqLworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIEszMk9CSl9EZWNDb3VudAorICovCit2b2lkIEszMk9CSl9EZWNDb3VudCggSzMyT0JKICpwdHIgKQoreworICAgIE5BTUVfRU5UUlkgKipwcHRyOworCisgICAgYXNzZXJ0KCBwdHItPnR5cGUgJiYgKCh1bnNpZ25lZClwdHItPnR5cGUgPCBLMzJPQkpfTkJPQkpFQ1RTKSApOworICAgIGFzc2VydCggcHRyLT5yZWZjb3VudCA+IDAgKTsKKyAgICBTWVNURU1fTE9DSygpOworICAgIGlmICgtLXB0ci0+cmVmY291bnQpCisgICAgeworICAgICAgICBTWVNURU1fVU5MT0NLKCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvKiBDaGVjayBpZiB0aGUgb2JqZWN0IGhhcyBhIG5hbWUgZW50cnkgYW5kIGZyZWUgaXQgKi8KKworICAgIHBwdHIgPSAmSzMyT0JKX0ZpcnN0RW50cnk7CisgICAgd2hpbGUgKCpwcHRyICYmICgoKnBwdHIpLT5vYmogIT0gcHRyKSkgcHB0ciA9ICYoKnBwdHIpLT5uZXh0OworICAgIGlmICgqcHB0cikKKyAgICB7CisgICAgICAgIE5BTUVfRU5UUlkgKmVudHJ5ID0gKnBwdHI7CisgICAgICAgICpwcHRyID0gZW50cnktPm5leHQ7CisgICAgICAgIEhlYXBGcmVlKCBTeXN0ZW1IZWFwLCAwLCBlbnRyeSApOworICAgIH0KKworICAgIC8qIEZyZWUgdGhlIG9iamVjdCAqLworCisgICAgaWYgKEszMk9CSl9PcHNbcHRyLT50eXBlXS0+ZGVzdHJveSkgSzMyT0JKX09wc1twdHItPnR5cGVdLT5kZXN0cm95KCBwdHIgKTsKKyAgICBTWVNURU1fVU5MT0NLKCk7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgSzMyT0JKX0lzVmFsaWQKKyAqCisgKiBDaGVjayBpZiBhIHBvaW50ZXIgaXMgYSB2YWxpZCBrZXJuZWwgb2JqZWN0CisgKi8KK0JPT0wzMiBLMzJPQkpfSXNWYWxpZCggSzMyT0JKICpwdHIsIEszMk9CSl9UWVBFIHR5cGUgKQoreworICAgIGlmIChJc0JhZFJlYWRQdHIzMiggcHRyLCBzaXplb2YoKnB0cikgKSkgcmV0dXJuIEZBTFNFOworICAgIHJldHVybiAocHRyLT50eXBlID09IHR5cGUpOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIEszMk9CSl9BZGROYW1lCisgKgorICogQWRkIGEgbmFtZSBlbnRyeSBmb3IgYW4gb2JqZWN0LiBXZSBkb24ndCBjaGVjayBmb3IgZHVwbGljYXRlcyBoZXJlLgorICogRklYTUU6IHNob3VsZCB1c2Ugc29tZSBzb3J0IG9mIGhhc2hpbmcuCisgKi8KK0JPT0wzMiBLMzJPQkpfQWRkTmFtZSggSzMyT0JKICpvYmosIExQQ1NUUiBuYW1lICkKK3sKKyAgICBOQU1FX0VOVFJZICplbnRyeTsKKyAgICBVSU5UMzIgbGVuOworCisgICAgaWYgKCFuYW1lKSByZXR1cm4gVFJVRTsgIC8qIEFub255bW91cyBvYmplY3QgKi8KKyAgICBsZW4gPSBzdHJsZW4oIG5hbWUgKTsKKyAgICBTWVNURU1fTE9DSygpOworICAgIGlmICghKGVudHJ5ID0gSGVhcEFsbG9jKCBTeXN0ZW1IZWFwLCAwLCBzaXplb2YoTkFNRV9FTlRSWSkgKyBsZW4gKSkpCisgICAgeworICAgICAgICBTWVNURU1fVU5MT0NLKCk7CisgICAgICAgIFNldExhc3RFcnJvciggRVJST1JfT1VUT0ZNRU1PUlkgKTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgICBlbnRyeS0+bmV4dCA9IEszMk9CSl9GaXJzdEVudHJ5OworICAgIGVudHJ5LT5vYmogPSBvYmo7CisgICAgbHN0cmNweTMyQSggZW50cnktPm5hbWUsIG5hbWUgKTsKKyAgICBLMzJPQkpfRmlyc3RFbnRyeSA9IGVudHJ5OworICAgIFNZU1RFTV9VTkxPQ0soKTsKKyAgICByZXR1cm4gVFJVRTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBLMzJPQkpfQ3JlYXRlCisgKgorICogQ3JlYXRlIGEgbmFtZWQga2VybmVsIG9iamVjdC4KKyAqIFJldHVybnMgTlVMTCBpZiB0aGVyZSB3YXMgYW4gZXJyb3IgX29yXyBpZiB0aGUgb2JqZWN0IGFscmVhZHkgZXhpc3RlZC4KKyAqIFRoZSByZWZjb3VudCBvZiB0aGUgb2JqZWN0IG11c3QgYmUgZGVjcmVtZW50ZWQgb25jZSBpdCBpcyBpbml0aWFsaXplZC4KKyAqLworSzMyT0JKICpLMzJPQkpfQ3JlYXRlKCBLMzJPQkpfVFlQRSB0eXBlLCBEV09SRCBzaXplLCBMUENTVFIgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgSEFORExFMzIgKmhhbmRsZSApCit7CisgICAgLyogQ2hlY2sgaWYgdGhlIG5hbWUgYWxyZWFkeSBleGlzdHMgKi8KKworICAgIEszMk9CSiAqb2JqID0gSzMyT0JKX0ZpbmROYW1lKCBuYW1lICk7CisgICAgaWYgKG9iaikKKyAgICB7CisgICAgICAgIGlmIChvYmotPnR5cGUgPT0gdHlwZSkKKyAgICAgICAgeworICAgICAgICAgICAgU2V0TGFzdEVycm9yKCBFUlJPUl9BTFJFQURZX0VYSVNUUyApOworICAgICAgICAgICAgKmhhbmRsZSA9IFBST0NFU1NfQWxsb2NIYW5kbGUoIG9iaiwgMCApOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgU2V0TGFzdEVycm9yKCBFUlJPUl9EVVBfTkFNRSApOworICAgICAgICAgICAgKmhhbmRsZSA9IElOVkFMSURfSEFORExFX1ZBTFVFMzI7CisgICAgICAgIH0KKyAgICAgICAgSzMyT0JKX0RlY0NvdW50KCBvYmogKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgLyogQ3JlYXRlIHRoZSBvYmplY3QgKi8KKworICAgIFNZU1RFTV9MT0NLKCk7CisgICAgaWYgKCEob2JqID0gSGVhcEFsbG9jKCBTeXN0ZW1IZWFwLCAwLCBzaXplICkpKQorICAgIHsKKyAgICAgICAgU1lTVEVNX1VOTE9DSygpOworICAgICAgICAqaGFuZGxlID0gSU5WQUxJRF9IQU5ETEVfVkFMVUUzMjsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIG9iai0+dHlwZSAgICAgPSB0eXBlOworICAgIG9iai0+cmVmY291bnQgPSAxOworCisgICAgLyogQWRkIGEgbmFtZSBmb3IgaXQgKi8KKworICAgIGlmICghSzMyT0JKX0FkZE5hbWUoIG9iaiwgbmFtZSApKQorICAgIHsKKyAgICAgICAgLyogRG9uJ3QgY2FsbCB0aGUgZGVzdHJveSBmdW5jdGlvbiwgYXMgdGhlIG9iamVjdCB3YXNuJ3QKKyAgICAgICAgICogaW5pdGlhbGl6ZWQgcHJvcGVybHkgKi8KKyAgICAgICAgSGVhcEZyZWUoIFN5c3RlbUhlYXAsIDAsIG9iaiApOworICAgICAgICBTWVNURU1fVU5MT0NLKCk7CisgICAgICAgICpoYW5kbGUgPSBJTlZBTElEX0hBTkRMRV9WQUxVRTMyOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICAvKiBBbGxvY2F0ZSBhIGhhbmRsZSAqLworCisgICAgKmhhbmRsZSA9IFBST0NFU1NfQWxsb2NIYW5kbGUoIG9iaiwgMCApOworICAgIFNZU1RFTV9VTkxPQ0soKTsKKyAgICByZXR1cm4gb2JqOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIEszMk9CSl9GaW5kTmFtZQorICoKKyAqIEZpbmQgdGhlIG9iamVjdCByZWZlcmVuY2VkIGJ5IGEgZ2l2ZW4gbmFtZS4KKyAqIFRoZSByZWZlcmVuY2UgY291bnQgaXMgaW5jcmVtZW50ZWQuCisgKi8KK0szMk9CSiAqSzMyT0JKX0ZpbmROYW1lKCBMUENTVFIgbmFtZSApCit7CisgICAgTkFNRV9FTlRSWSAqZW50cnk7CisgICAgVUlOVDMyIGxlbjsKKworICAgIGlmICghbmFtZSkgcmV0dXJuIE5VTEw7ICAvKiBBbm9ueW1vdXMgb2JqZWN0ICovCisgICAgbGVuID0gc3RybGVuKCBuYW1lICk7CisgICAgU1lTVEVNX0xPQ0soKTsKKyAgICBlbnRyeSA9IEszMk9CSl9GaXJzdEVudHJ5OworICAgIHdoaWxlIChlbnRyeSkKKyAgICB7CisgICAgICAgIGlmICgobGVuID09IGVudHJ5LT5sZW4pICYmICFsc3RyY21wMzJBKCBuYW1lLCBlbnRyeS0+bmFtZSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIEszMk9CSiAqb2JqID0gZW50cnktPm9iajsKKyAgICAgICAgICAgIEszMk9CSl9JbmNDb3VudCggb2JqICk7CisgICAgICAgICAgICBTWVNURU1fVU5MT0NLKCk7CisgICAgICAgICAgICByZXR1cm4gZW50cnktPm9iajsKKyAgICAgICAgfQorICAgICAgICBlbnRyeSA9IGVudHJ5LT5uZXh0OworICAgIH0KKyAgICBTWVNURU1fVU5MT0NLKCk7CisgICAgcmV0dXJuIE5VTEw7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgSzMyT0JKX0ZpbmROYW1lVHlwZQorICoKKyAqIEZpbmQgYW4gb2JqZWN0IGJ5IG5hbWUgYW5kIGNoZWNrIGl0cyB0eXBlLgorICogVGhlIHJlZmVyZW5jZSBjb3VudCBpcyBpbmNyZW1lbnRlZC4KKyAqLworSzMyT0JKICpLMzJPQkpfRmluZE5hbWVUeXBlKCBMUENTVFIgbmFtZSwgSzMyT0JKX1RZUEUgdHlwZSApCit7CisgICAgSzMyT0JKICpvYmogPSBLMzJPQkpfRmluZE5hbWUoIG5hbWUgKTsKKyAgICBpZiAoIW9iaikgcmV0dXJuIE5VTEw7CisgICAgaWYgKG9iai0+dHlwZSA9PSB0eXBlKSByZXR1cm4gb2JqOworICAgIFNldExhc3RFcnJvciggRVJST1JfRFVQX05BTUUgKTsKKyAgICBLMzJPQkpfRGVjQ291bnQoIG9iaiApOworICAgIHJldHVybiBOVUxMOworfQpkaWZmIC0tZ2l0IGEvc2NoZWR1bGVyL211dGV4LmMgYi9zY2hlZHVsZXIvbXV0ZXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Mzc3ODlhCi0tLSAvZGV2L251bGwKKysrIGIvc2NoZWR1bGVyL211dGV4LmMKQEAgLTAsMCArMSwyMDcgQEAKKy8qCisgKiBXaW4zMiBtdXRleGVzCisgKgorICogQ29weXJpZ2h0IDE5OTggQWxleGFuZHJlIEp1bGxpYXJkCisgKi8KKworI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgIndpbmRvd3MuaCIKKyNpbmNsdWRlICJ3aW5lcnJvci5oIgorI2luY2x1ZGUgImszMm9iai5oIgorI2luY2x1ZGUgInByb2Nlc3MuaCIKKyNpbmNsdWRlICJ0aHJlYWQuaCIKKyNpbmNsdWRlICJoZWFwLmgiCisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgSzMyT0JKICAgICAgICBoZWFkZXI7CisgICAgVEhSRUFEX1FVRVVFICB3YWl0X3F1ZXVlOworICAgIERXT1JEICAgICAgICAgb3duZXI7CisgICAgRFdPUkQgICAgICAgICBjb3VudDsKK30gTVVURVg7CisKK3N0YXRpYyBCT09MMzIgTVVURVhfU2lnbmFsZWQoIEszMk9CSiAqb2JqLCBEV09SRCB0aHJlYWRfaWQgKTsKK3N0YXRpYyB2b2lkIE1VVEVYX1NhdGlzZmllZCggSzMyT0JKICpvYmosIERXT1JEIHRocmVhZF9pZCApOworc3RhdGljIHZvaWQgTVVURVhfQWRkV2FpdCggSzMyT0JKICpvYmosIERXT1JEIHRocmVhZF9pZCApOworc3RhdGljIHZvaWQgTVVURVhfUmVtb3ZlV2FpdCggSzMyT0JKICpvYmosIERXT1JEIHRocmVhZF9pZCApOworc3RhdGljIHZvaWQgTVVURVhfRGVzdHJveSggSzMyT0JKICpvYmogKTsKKworY29uc3QgSzMyT0JKX09QUyBNVVRFWF9PcHMgPQoreworICAgIE1VVEVYX1NpZ25hbGVkLCAgICAvKiBzaWduYWxlZCAqLworICAgIE1VVEVYX1NhdGlzZmllZCwgICAvKiBzYXRpc2ZpZWQgKi8KKyAgICBNVVRFWF9BZGRXYWl0LCAgICAgLyogYWRkX3dhaXQgKi8KKyAgICBNVVRFWF9SZW1vdmVXYWl0LCAgLyogcmVtb3ZlX3dhaXQgKi8KKyAgICBNVVRFWF9EZXN0cm95ICAgICAgLyogZGVzdHJveSAqLworfTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBDcmVhdGVNdXRleDMyQSAgIChLRVJORUwzMi4xNjYpCisgKi8KK0hBTkRMRTMyIFdJTkFQSSBDcmVhdGVNdXRleDMyQSggU0VDVVJJVFlfQVRUUklCVVRFUyAqc2EsIEJPT0wzMiBvd25lciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBDU1RSIG5hbWUgKQoreworICAgIEhBTkRMRTMyIGhhbmRsZTsKKyAgICBNVVRFWCAqbXV0ZXg7CisKKyAgICBTWVNURU1fTE9DSygpOworICAgIG11dGV4ID0gKE1VVEVYICopSzMyT0JKX0NyZWF0ZSggSzMyT0JKX01VVEVYLCBzaXplb2YoKm11dGV4KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsICZoYW5kbGUgKTsKKyAgICBpZiAobXV0ZXgpCisgICAgeworICAgICAgICAvKiBGaW5pc2ggaW5pdGlhbGl6aW5nIGl0ICovCisgICAgICAgIG11dGV4LT53YWl0X3F1ZXVlID0gTlVMTDsKKyAgICAgICAgaWYgKG93bmVyKQorICAgICAgICB7CisgICAgICAgICAgICBtdXRleC0+b3duZXIgPSBHZXRDdXJyZW50VGhyZWFkSWQoKTsKKyAgICAgICAgICAgIG11dGV4LT5jb3VudCA9IDE7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBtdXRleC0+b3duZXIgPSAwOworICAgICAgICAgICAgbXV0ZXgtPmNvdW50ID0gMDsKKyAgICAgICAgfQorICAgICAgICBLMzJPQkpfRGVjQ291bnQoICZtdXRleC0+aGVhZGVyICk7CisgICAgfQorICAgIFNZU1RFTV9VTkxPQ0soKTsKKyAgICByZXR1cm4gaGFuZGxlOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIENyZWF0ZU11dGV4MzJXICAgKEtFUk5FTDMyLjE2NykKKyAqLworSEFORExFMzIgV0lOQVBJIENyZWF0ZU11dGV4MzJXKCBTRUNVUklUWV9BVFRSSUJVVEVTICpzYSwgQk9PTDMyIG93bmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUENXU1RSIG5hbWUgKQoreworICAgIExQU1RSIG5hbWVBID0gSEVBUF9zdHJkdXBXdG9BKCBHZXRQcm9jZXNzSGVhcCgpLCAwLCBuYW1lICk7CisgICAgSEFORExFMzIgcmV0ID0gQ3JlYXRlTXV0ZXgzMkEoIHNhLCBvd25lciwgbmFtZUEgKTsKKyAgICBpZiAobmFtZUEpIEhlYXBGcmVlKCBHZXRQcm9jZXNzSGVhcCgpLCAwLCBuYW1lQSApOworICAgIHJldHVybiByZXQ7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgT3Blbk11dGV4MzJBICAgKEtFUk5FTDMyLjU0MSkKKyAqLworSEFORExFMzIgV0lOQVBJIE9wZW5NdXRleDMyQSggRFdPUkQgYWNjZXNzLCBCT09MMzIgaW5oZXJpdCwgTFBDU1RSIG5hbWUgKQoreworICAgIEhBTkRMRTMyIGhhbmRsZSA9IDA7CisgICAgSzMyT0JKICpvYmo7CisgICAgU1lTVEVNX0xPQ0soKTsKKyAgICBpZiAoKG9iaiA9IEszMk9CSl9GaW5kTmFtZVR5cGUoIG5hbWUsIEszMk9CSl9NVVRFWCApKSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaGFuZGxlID0gUFJPQ0VTU19BbGxvY0hhbmRsZSggb2JqLCAwICk7CisgICAgICAgIEszMk9CSl9EZWNDb3VudCggb2JqICk7CisgICAgfQorICAgIFNZU1RFTV9VTkxPQ0soKTsKKyAgICByZXR1cm4gaGFuZGxlOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIE9wZW5NdXRleDMyVyAgIChLRVJORUwzMi41NDIpCisgKi8KK0hBTkRMRTMyIFdJTkFQSSBPcGVuTXV0ZXgzMlcoIERXT1JEIGFjY2VzcywgQk9PTDMyIGluaGVyaXQsIExQQ1dTVFIgbmFtZSApCit7CisgICAgTFBTVFIgbmFtZUEgPSBIRUFQX3N0cmR1cFd0b0EoIEdldFByb2Nlc3NIZWFwKCksIDAsIG5hbWUgKTsKKyAgICBIQU5ETEUzMiByZXQgPSBPcGVuTXV0ZXgzMkEoIGFjY2VzcywgaW5oZXJpdCwgbmFtZUEgKTsKKyAgICBpZiAobmFtZUEpIEhlYXBGcmVlKCBHZXRQcm9jZXNzSGVhcCgpLCAwLCBuYW1lQSApOworICAgIHJldHVybiByZXQ7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgUmVsZWFzZU11dGV4ICAgKEtFUk5FTDMyLjU4MikKKyAqLworQk9PTDMyIFdJTkFQSSBSZWxlYXNlTXV0ZXgoIEhBTkRMRTMyIGhhbmRsZSApCit7CisgICAgTVVURVggKm11dGV4OworICAgIFNZU1RFTV9MT0NLKCk7CisgICAgaWYgKCEobXV0ZXggPSAoTVVURVggKilQUk9DRVNTX0dldE9ialB0ciggaGFuZGxlLCBLMzJPQkpfTVVURVggKSkpCisgICAgeworICAgICAgICBTWVNURU1fVU5MT0NLKCk7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgICAgaWYgKCFtdXRleC0+Y291bnQgfHwgKG11dGV4LT5vd25lciAhPSBHZXRDdXJyZW50VGhyZWFkSWQoKSkpCisgICAgeworICAgICAgICBTWVNURU1fVU5MT0NLKCk7CisgICAgICAgIFNldExhc3RFcnJvciggRVJST1JfTk9UX09XTkVSICk7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgICAgaWYgKCEtLW11dGV4LT5jb3VudCkKKyAgICB7CisgICAgICAgIG11dGV4LT5vd25lciA9IDA7CisgICAgICAgIFNZTkNfV2FrZVVwKCAmbXV0ZXgtPndhaXRfcXVldWUsIElORklOSVRFMzIgKTsKKyAgICB9CisgICAgSzMyT0JKX0RlY0NvdW50KCAmbXV0ZXgtPmhlYWRlciApOworICAgIFNZU1RFTV9VTkxPQ0soKTsKKyAgICByZXR1cm4gVFJVRTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBNVVRFWF9TaWduYWxlZAorICovCitzdGF0aWMgQk9PTDMyIE1VVEVYX1NpZ25hbGVkKCBLMzJPQkogKm9iaiwgRFdPUkQgdGhyZWFkX2lkICkKK3sKKyAgICBNVVRFWCAqbXV0ZXggPSAoTVVURVggKilvYmo7CisgICAgYXNzZXJ0KCBvYmotPnR5cGUgPT0gSzMyT0JKX01VVEVYICk7CisgICAgcmV0dXJuICghbXV0ZXgtPmNvdW50IHx8IChtdXRleC0+b3duZXIgPT0gdGhyZWFkX2lkKSk7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgTVVURVhfU2F0aXNmaWVkCisgKgorICogV2FpdCBvbiB0aGlzIG9iamVjdCBoYXMgYmVlbiBzYXRpc2ZpZWQuCisgKi8KK3N0YXRpYyB2b2lkIE1VVEVYX1NhdGlzZmllZCggSzMyT0JKICpvYmosIERXT1JEIHRocmVhZF9pZCApCit7CisgICAgTVVURVggKm11dGV4ID0gKE1VVEVYICopb2JqOworICAgIGFzc2VydCggb2JqLT50eXBlID09IEszMk9CSl9NVVRFWCApOworICAgIGFzc2VydCggIW11dGV4LT5jb3VudCB8fCAobXV0ZXgtPm93bmVyID09IHRocmVhZF9pZCkgKTsKKyAgICBtdXRleC0+b3duZXIgPSB0aHJlYWRfaWQ7CisgICAgbXV0ZXgtPmNvdW50Kys7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgTVVURVhfQWRkV2FpdAorICoKKyAqIEFkZCBhIHRocmVhZCB0byB0aGUgb2JqZWN0IHdhaXQgcXVldWUuCisgKi8KK3N0YXRpYyB2b2lkIE1VVEVYX0FkZFdhaXQoIEszMk9CSiAqb2JqLCBEV09SRCB0aHJlYWRfaWQgKQoreworICAgIE1VVEVYICptdXRleCA9IChNVVRFWCAqKW9iajsKKyAgICBhc3NlcnQoIG9iai0+dHlwZSA9PSBLMzJPQkpfTVVURVggKTsKKyAgICBUSFJFQURfQWRkUXVldWUoICZtdXRleC0+d2FpdF9xdWV1ZSwgVEhSRUFEX0lEX1RPX1RIREIodGhyZWFkX2lkKSApOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIE1VVEVYX1JlbW92ZVdhaXQKKyAqCisgKiBSZW1vdmUgYSB0aHJlYWQgZnJvbSB0aGUgb2JqZWN0IHdhaXQgcXVldWUuCisgKi8KK3N0YXRpYyB2b2lkIE1VVEVYX1JlbW92ZVdhaXQoIEszMk9CSiAqb2JqLCBEV09SRCB0aHJlYWRfaWQgKQoreworICAgIE1VVEVYICptdXRleCA9IChNVVRFWCAqKW9iajsKKyAgICBhc3NlcnQoIG9iai0+dHlwZSA9PSBLMzJPQkpfTVVURVggKTsKKyAgICBUSFJFQURfUmVtb3ZlUXVldWUoICZtdXRleC0+d2FpdF9xdWV1ZSwgVEhSRUFEX0lEX1RPX1RIREIodGhyZWFkX2lkKSApOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIE1VVEVYX0Rlc3Ryb3kKKyAqLworc3RhdGljIHZvaWQgTVVURVhfRGVzdHJveSggSzMyT0JKICpvYmogKQoreworICAgIE1VVEVYICptdXRleCA9IChNVVRFWCAqKW9iajsKKyAgICBhc3NlcnQoIG9iai0+dHlwZSA9PSBLMzJPQkpfTVVURVggKTsKKyAgICAvKiBUaGVyZSBjYW5ub3QgYmUgYW55IHRocmVhZCBvbiB0aGUgbGlzdCBzaW5jZSB0aGUgcmVmIGNvdW50IGlzIDAgKi8KKyAgICBhc3NlcnQoIG11dGV4LT53YWl0X3F1ZXVlID09IE5VTEwgKTsKKyAgICBvYmotPnR5cGUgPSBLMzJPQkpfVU5LTk9XTjsKKyAgICBIZWFwRnJlZSggU3lzdGVtSGVhcCwgMCwgbXV0ZXggKTsKK30KZGlmZiAtLWdpdCBhL3NjaGVkdWxlci9wcm9jZXNzLmMgYi9zY2hlZHVsZXIvcHJvY2Vzcy5jCmluZGV4IGI4MTkwODAuLjIyNWRkMTQgMTAwNjQ0Ci0tLSBhL3NjaGVkdWxlci9wcm9jZXNzLmMKKysrIGIvc2NoZWR1bGVyL3Byb2Nlc3MuYwpAQCAtMjUsNiArMjUsMjEgQEAKIAogI2RlZmluZSBCT09UX0hUQUJMRV9TSVpFICAxMAogCitzdGF0aWMgQk9PTDMyIFBST0NFU1NfU2lnbmFsZWQoIEszMk9CSiAqb2JqLCBEV09SRCB0aHJlYWRfaWQgKTsKK3N0YXRpYyB2b2lkIFBST0NFU1NfU2F0aXNmaWVkKCBLMzJPQkogKm9iaiwgRFdPUkQgdGhyZWFkX2lkICk7CitzdGF0aWMgdm9pZCBQUk9DRVNTX0FkZFdhaXQoIEszMk9CSiAqb2JqLCBEV09SRCB0aHJlYWRfaWQgKTsKK3N0YXRpYyB2b2lkIFBST0NFU1NfUmVtb3ZlV2FpdCggSzMyT0JKICpvYmosIERXT1JEIHRocmVhZF9pZCApOworc3RhdGljIHZvaWQgUFJPQ0VTU19EZXN0cm95KCBLMzJPQkogKm9iaiApOworCitjb25zdCBLMzJPQkpfT1BTIFBST0NFU1NfT3BzID0KK3sKKyAgICBQUk9DRVNTX1NpZ25hbGVkLCAgICAvKiBzaWduYWxlZCAqLworICAgIFBST0NFU1NfU2F0aXNmaWVkLCAgIC8qIHNhdGlzZmllZCAqLworICAgIFBST0NFU1NfQWRkV2FpdCwgICAgIC8qIGFkZF93YWl0ICovCisgICAgUFJPQ0VTU19SZW1vdmVXYWl0LCAgLyogcmVtb3ZlX3dhaXQgKi8KKyAgICBQUk9DRVNTX0Rlc3Ryb3kgICAgICAvKiBkZXN0cm95ICovCit9OworCiBzdGF0aWMgSEFORExFX0VOVFJZIGJvb3RfaGFuZGxlc1tCT09UX0hUQUJMRV9TSVpFXTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC00NiwxNCArNjEsMjAgQEAKICAqLwogc3RhdGljIEJPT0wzMiBQUk9DRVNTX0dyb3dIYW5kbGVUYWJsZSggUERCMzIgKnByb2Nlc3MgKQogewotICAgIEhBTkRMRV9UQUJMRSAqdGFibGUgPSBwcm9jZXNzLT5oYW5kbGVfdGFibGU7Ci0gICAgdGFibGUgPSBIZWFwUmVBbGxvYyggcHJvY2Vzcy0+c3lzdGVtX2hlYXAsIEhFQVBfWkVST19NRU1PUlksIHRhYmxlLAorICAgIEhBTkRMRV9UQUJMRSAqdGFibGU7CisgICAgU1lTVEVNX0xPQ0soKTsKKyAgICB0YWJsZSA9IHByb2Nlc3MtPmhhbmRsZV90YWJsZTsKKyAgICB0YWJsZSA9IEhlYXBSZUFsbG9jKCBwcm9jZXNzLT5zeXN0ZW1faGVhcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBIRUFQX1pFUk9fTUVNT1JZIHwgSEVBUF9OT19TRVJJQUxJWkUsIHRhYmxlLAogICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihIQU5ETEVfVEFCTEUpICsKICAgICAgICAgICAgICAgICAgICAgICAgICAodGFibGUtPmNvdW50K0hUQUJMRV9JTkMtMSkgKiBzaXplb2YoSEFORExFX0VOVFJZKSApOwotICAgIGlmICghdGFibGUpIHJldHVybiBGQUxTRTsKLSAgICB0YWJsZS0+Y291bnQgKz0gSFRBQkxFX0lOQzsKLSAgICBwcm9jZXNzLT5oYW5kbGVfdGFibGUgPSB0YWJsZTsKLSAgICByZXR1cm4gVFJVRTsKKyAgICBpZiAodGFibGUpCisgICAgeworICAgICAgICB0YWJsZS0+Y291bnQgKz0gSFRBQkxFX0lOQzsKKyAgICAgICAgcHJvY2Vzcy0+aGFuZGxlX3RhYmxlID0gdGFibGU7CisgICAgfQorICAgIFNZU1RFTV9VTkxPQ0soKTsKKyAgICByZXR1cm4gKHRhYmxlICE9IE5VTEwpOwogfQogCiAKQEAgLTY1LDEyICs4NiwxNCBAQAogc3RhdGljIEhBTkRMRTMyIFBST0NFU1NfQWxsb2NCb290SGFuZGxlKCBLMzJPQkogKnB0ciwgRFdPUkQgZmxhZ3MgKQogewogICAgIEhBTkRMRTMyIGg7CisgICAgU1lTVEVNX0xPQ0soKTsKICAgICBmb3IgKGggPSAwOyBoIDwgQk9PVF9IVEFCTEVfU0laRTsgaCsrKQogICAgICAgICBpZiAoIWJvb3RfaGFuZGxlc1toXS5wdHIpIGJyZWFrOwogICAgIGFzc2VydCggaCA8IEJPT1RfSFRBQkxFX1NJWkUgKTsKICAgICBLMzJPQkpfSW5jQ291bnQoIHB0ciApOwogICAgIGJvb3RfaGFuZGxlc1toXS5mbGFncyA9IGZsYWdzOwogICAgIGJvb3RfaGFuZGxlc1toXS5wdHIgICA9IHB0cjsKKyAgICBTWVNURU1fVU5MT0NLKCk7CiAgICAgcmV0dXJuIGggKyAxOyAgLyogQXZvaWQgaGFuZGxlIDAgKi8KIH0KIApAQCAtODIsMTIgKzEwNSwxNiBAQAogICovCiBzdGF0aWMgQk9PTDMyIFBST0NFU1NfQ2xvc2VCb290SGFuZGxlKCBIQU5ETEUzMiBoYW5kbGUgKQogeworICAgIEszMk9CSiAqcHRyOwogICAgIEhBTkRMRV9FTlRSWSAqZW50cnkgPSAmYm9vdF9oYW5kbGVzW2hhbmRsZSAtIDFdOwogICAgIGFzc2VydCggKGhhbmRsZSA+IDApICYmIChoYW5kbGUgPD0gQk9PVF9IVEFCTEVfU0laRSkgKTsKKyAgICBTWVNURU1fTE9DSygpOwogICAgIGFzc2VydCggZW50cnktPnB0ciApOwotICAgIEszMk9CSl9EZWNDb3VudCggZW50cnktPnB0ciApOworICAgIHB0ciA9IGVudHJ5LT5wdHI7CiAgICAgZW50cnktPmZsYWdzID0gMDsKICAgICBlbnRyeS0+cHRyICAgPSBOVUxMOworICAgIEszMk9CSl9EZWNDb3VudCggcHRyICk7CisgICAgU1lTVEVNX1VOTE9DSygpOwogICAgIHJldHVybiBUUlVFOwogfQogCkBAIC0xMDIsOSArMTI5LDExIEBACiAgICAgSzMyT0JKICpwdHI7CiAKICAgICBhc3NlcnQoIChoYW5kbGUgPiAwKSAmJiAoaGFuZGxlIDw9IEJPT1RfSFRBQkxFX1NJWkUpICk7CisgICAgU1lTVEVNX0xPQ0soKTsKICAgICBwdHIgPSBib290X2hhbmRsZXNbaGFuZGxlIC0gMV0ucHRyOwogICAgIGFzc2VydCAocHRyICYmIChwdHItPnR5cGUgPT0gdHlwZSkpOwogICAgIEszMk9CSl9JbmNDb3VudCggcHRyICk7CisgICAgU1lTVEVNX1VOTE9DSygpOwogICAgIHJldHVybiBwdHI7CiB9CiAKQEAgLTExOSwxMCArMTQ4LDEzIEBACiAgICAgSzMyT0JKICpvbGRfcHRyOwogCiAgICAgYXNzZXJ0KCAoaGFuZGxlID4gMCkgJiYgKGhhbmRsZSA8PSBCT09UX0hUQUJMRV9TSVpFKSApOworICAgIFNZU1RFTV9MT0NLKCk7CiAgICAgSzMyT0JKX0luY0NvdW50KCBwdHIgKTsKLSAgICBpZiAoKG9sZF9wdHIgPSBib290X2hhbmRsZXNbaGFuZGxlIC0gMV0ucHRyKSkgSzMyT0JKX0RlY0NvdW50KCBvbGRfcHRyICk7CisgICAgb2xkX3B0ciA9IGJvb3RfaGFuZGxlc1toYW5kbGUgLSAxXS5wdHI7CiAgICAgYm9vdF9oYW5kbGVzW2hhbmRsZSAtIDFdLmZsYWdzID0gZmxhZ3M7CiAgICAgYm9vdF9oYW5kbGVzW2hhbmRsZSAtIDFdLnB0ciAgID0gcHRyOworICAgIGlmIChvbGRfcHRyKSBLMzJPQkpfRGVjQ291bnQoIG9sZF9wdHIgKTsKKyAgICBTWVNURU1fVU5MT0NLKCk7CiAgICAgcmV0dXJuIFRSVUU7CiB9CiAKQEAgLTEzOSw3ICsxNzEsNyBAQAogCiAgICAgYXNzZXJ0KCBwdHIgKTsKICAgICBpZiAoIXBDdXJyZW50UHJvY2VzcykgcmV0dXJuIFBST0NFU1NfQWxsb2NCb290SGFuZGxlKCBwdHIsIGZsYWdzICk7Ci0gICAgRW50ZXJDcml0aWNhbFNlY3Rpb24oICZwQ3VycmVudFByb2Nlc3MtPmNyaXRfc2VjdGlvbiApOworICAgIFNZU1RFTV9MT0NLKCk7CiAgICAgSzMyT0JKX0luY0NvdW50KCBwdHIgKTsKICAgICBlbnRyeSA9IHBDdXJyZW50UHJvY2Vzcy0+aGFuZGxlX3RhYmxlLT5lbnRyaWVzOwogICAgIGZvciAoaCA9IDA7IGggPCBwQ3VycmVudFByb2Nlc3MtPmhhbmRsZV90YWJsZS0+Y291bnQ7IGgrKywgZW50cnkrKykKQEAgLTE1MCwxMiArMTgyLDEyIEBACiAgICAgICAgIGVudHJ5ID0gJnBDdXJyZW50UHJvY2Vzcy0+aGFuZGxlX3RhYmxlLT5lbnRyaWVzW2hdOwogICAgICAgICBlbnRyeS0+ZmxhZ3MgPSBmbGFnczsKICAgICAgICAgZW50cnktPnB0ciAgID0gcHRyOwotICAgICAgICBMZWF2ZUNyaXRpY2FsU2VjdGlvbiggJnBDdXJyZW50UHJvY2Vzcy0+Y3JpdF9zZWN0aW9uICk7CisgICAgICAgIFNZU1RFTV9VTkxPQ0soKTsKICAgICAgICAgcmV0dXJuIGggKyAxOyAgLyogQXZvaWQgaGFuZGxlIDAgKi8KICAgICB9Ci0gICAgTGVhdmVDcml0aWNhbFNlY3Rpb24oICZwQ3VycmVudFByb2Nlc3MtPmNyaXRfc2VjdGlvbiApOwotICAgIFNldExhc3RFcnJvciggRVJST1JfT1VUT0ZNRU1PUlkgKTsKICAgICBLMzJPQkpfRGVjQ291bnQoIHB0ciApOworICAgIFNZU1RFTV9VTkxPQ0soKTsKKyAgICBTZXRMYXN0RXJyb3IoIEVSUk9SX09VVE9GTUVNT1JZICk7CiAgICAgcmV0dXJuIElOVkFMSURfSEFORExFX1ZBTFVFMzI7CiB9CiAKQEAgLTE3MCw3ICsyMDIsNyBAQAogewogICAgIEszMk9CSiAqcHRyID0gTlVMTDsKICAgICBpZiAoIXBDdXJyZW50UHJvY2VzcykgcmV0dXJuIFBST0NFU1NfR2V0Qm9vdE9ialB0ciggaGFuZGxlLCB0eXBlICk7Ci0gICAgRW50ZXJDcml0aWNhbFNlY3Rpb24oICZwQ3VycmVudFByb2Nlc3MtPmNyaXRfc2VjdGlvbiApOworICAgIFNZU1RFTV9MT0NLKCk7CiAKICAgICBpZiAoKGhhbmRsZSA+IDApICYmIChoYW5kbGUgPD0gcEN1cnJlbnRQcm9jZXNzLT5oYW5kbGVfdGFibGUtPmNvdW50KSkKICAgICAgICAgcHRyID0gcEN1cnJlbnRQcm9jZXNzLT5oYW5kbGVfdGFibGUtPmVudHJpZXNbaGFuZGxlIC0gMV0ucHRyOwpAQCAtMTgwLDcgKzIxMiw3IEBACiAgICAgICAgIEszMk9CSl9JbmNDb3VudCggcHRyICk7CiAgICAgZWxzZSBwdHIgPSBOVUxMOwogCi0gICAgTGVhdmVDcml0aWNhbFNlY3Rpb24oICZwQ3VycmVudFByb2Nlc3MtPmNyaXRfc2VjdGlvbiApOworICAgIFNZU1RFTV9VTkxPQ0soKTsKICAgICBpZiAoIXB0cikgU2V0TGFzdEVycm9yKCBFUlJPUl9JTlZBTElEX0hBTkRMRSApOwogICAgIHJldHVybiBwdHI7CiB9CkBAIC0xOTgsNyArMjMwLDcgQEAKICAgICBLMzJPQkogKm9sZF9wdHIgPSBOVUxMOwogCiAgICAgaWYgKCFwQ3VycmVudFByb2Nlc3MpIHJldHVybiBQUk9DRVNTX1NldEJvb3RPYmpQdHIoIGhhbmRsZSwgcHRyLCBmbGFncyApOwotICAgIEVudGVyQ3JpdGljYWxTZWN0aW9uKCAmcEN1cnJlbnRQcm9jZXNzLT5jcml0X3NlY3Rpb24gKTsKKyAgICBTWVNURU1fTE9DSygpOwogICAgIGlmICgoaGFuZGxlID4gMCkgJiYgKGhhbmRsZSA8PSBwQ3VycmVudFByb2Nlc3MtPmhhbmRsZV90YWJsZS0+Y291bnQpKQogICAgIHsKICAgICAgICAgSEFORExFX0VOVFJZKmVudHJ5ID0gJnBDdXJyZW50UHJvY2Vzcy0+aGFuZGxlX3RhYmxlLT5lbnRyaWVzW2hhbmRsZS0xXTsKQEAgLTIxMiw4ICsyNDQsOCBAQAogICAgICAgICBTZXRMYXN0RXJyb3IoIEVSUk9SX0lOVkFMSURfSEFORExFICk7CiAgICAgICAgIHJldCA9IEZBTFNFOwogICAgIH0KLSAgICBMZWF2ZUNyaXRpY2FsU2VjdGlvbiggJnBDdXJyZW50UHJvY2Vzcy0+Y3JpdF9zZWN0aW9uICk7CiAgICAgaWYgKG9sZF9wdHIpIEszMk9CSl9EZWNDb3VudCggb2xkX3B0ciApOworICAgIFNZU1RFTV9VTkxPQ0soKTsKICAgICByZXR1cm4gcmV0OwogfQogCkBAIC0yMjcsNyArMjU5LDcgQEAKICAgICBLMzJPQkogKnB0ciA9IE5VTEw7CiAKICAgICBpZiAoIXBDdXJyZW50UHJvY2VzcykgcmV0dXJuIFBST0NFU1NfQ2xvc2VCb290SGFuZGxlKCBoYW5kbGUgKTsKLSAgICBFbnRlckNyaXRpY2FsU2VjdGlvbiggJnBDdXJyZW50UHJvY2Vzcy0+Y3JpdF9zZWN0aW9uICk7CisgICAgU1lTVEVNX0xPQ0soKTsKICAgICBpZiAoKGhhbmRsZSA+IDApICYmIChoYW5kbGUgPD0gcEN1cnJlbnRQcm9jZXNzLT5oYW5kbGVfdGFibGUtPmNvdW50KSkKICAgICB7CiAgICAgICAgIEhBTkRMRV9FTlRSWSplbnRyeSA9ICZwQ3VycmVudFByb2Nlc3MtPmhhbmRsZV90YWJsZS0+ZW50cmllc1toYW5kbGUtMV07CkBAIC0yMzgsOSArMjcwLDkgQEAKICAgICAgICAgICAgIHJldCA9IFRSVUU7CiAgICAgICAgIH0KICAgICB9Ci0gICAgTGVhdmVDcml0aWNhbFNlY3Rpb24oICZwQ3VycmVudFByb2Nlc3MtPmNyaXRfc2VjdGlvbiApOwotICAgIGlmICghcmV0KSBTZXRMYXN0RXJyb3IoIEVSUk9SX0lOVkFMSURfSEFORExFICk7CiAgICAgaWYgKHB0cikgSzMyT0JKX0RlY0NvdW50KCBwdHIgKTsKKyAgICBTWVNURU1fVU5MT0NLKCk7CisgICAgaWYgKCFyZXQpIFNldExhc3RFcnJvciggRVJST1JfSU5WQUxJRF9IQU5ETEUgKTsKICAgICByZXR1cm4gcmV0OwogfQogCkBAIC0zMjMsMTAgKzM1NSwxNCBAQAogICAgIHBkYi0+cGFyZW50ICAgICAgICAgID0gcEN1cnJlbnRQcm9jZXNzOwogICAgIHBkYi0+Z3JvdXAgICAgICAgICAgID0gcGRiOwogICAgIHBkYi0+cHJpb3JpdHkgICAgICAgID0gODsgIC8qIE5vcm1hbCAqLwotICAgIHBkYi0+aGVhcF9saXN0ICAgICAgID0gcGRiLT5oZWFwOwogCiAgICAgSW5pdGlhbGl6ZUNyaXRpY2FsU2VjdGlvbiggJnBkYi0+Y3JpdF9zZWN0aW9uICk7CiAKKyAgICAvKiBBbGxvY2F0ZSB0aGUgZXZlbnRzICovCisKKyAgICBpZiAoIShwZGItPmV2ZW50ID0gRVZFTlRfQ3JlYXRlKCBUUlVFLCBGQUxTRSApKSkgZ290byBlcnJvcjsKKyAgICBpZiAoIShwZGItPmxvYWRfZG9uZV9ldnQgPSBFVkVOVF9DcmVhdGUoIFRSVUUsIEZBTFNFICkpKSBnb3RvIGVycm9yOworCiAgICAgLyogQ3JlYXRlIHRoZSBoZWFwICovCiAKICAgICBpZiAocE1vZHVsZS0+bW9kdWxlMzIpCkBAIC0zNDAsNiArMzc2LDcgQEAKIAljb21taXQgPSAwOwogICAgIH0KICAgICBpZiAoIShwZGItPmhlYXAgPSBIZWFwQ3JlYXRlKCBIRUFQX0dST1dBQkxFLCBzaXplLCBjb21taXQgKSkpIGdvdG8gZXJyb3I7CisgICAgcGRiLT5oZWFwX2xpc3QgPSBwZGItPmhlYXA7CiAKICAgICBpZiAoIShwZGItPmVudl9kYiA9IEhlYXBBbGxvYyhwZGItPmhlYXAsIEhFQVBfWkVST19NRU1PUlksIHNpemVvZihFTlZEQikpKSkKICAgICAgICAgZ290byBlcnJvcjsKQEAgLTM1MSw2ICszODgsOCBAQAogICAgIGlmIChwZGItPmVudl9kYikgSGVhcEZyZWUoIHBkYi0+aGVhcCwgMCwgcGRiLT5lbnZfZGIgKTsKICAgICBpZiAocGRiLT5oYW5kbGVfdGFibGUpIEhlYXBGcmVlKCBwZGItPnN5c3RlbV9oZWFwLCAwLCBwZGItPmhhbmRsZV90YWJsZSApOwogICAgIGlmIChwZGItPmhlYXApIEhlYXBEZXN0cm95KCBwZGItPmhlYXAgKTsKKyAgICBpZiAocGRiLT5sb2FkX2RvbmVfZXZ0KSBLMzJPQkpfRGVjQ291bnQoIHBkYi0+bG9hZF9kb25lX2V2dCApOworICAgIGlmIChwZGItPmV2ZW50KSBLMzJPQkpfRGVjQ291bnQoIHBkYi0+ZXZlbnQgKTsKICAgICBEZWxldGVDcml0aWNhbFNlY3Rpb24oICZwZGItPmNyaXRfc2VjdGlvbiApOwogICAgIEhlYXBGcmVlKCBTeXN0ZW1IZWFwLCAwLCBwZGIgKTsKICAgICByZXR1cm4gTlVMTDsKQEAgLTM1OCw5ICszOTcsNTkgQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBQUk9DRVNTX1NpZ25hbGVkCisgKi8KK3N0YXRpYyBCT09MMzIgUFJPQ0VTU19TaWduYWxlZCggSzMyT0JKICpvYmosIERXT1JEIHRocmVhZF9pZCApCit7CisgICAgUERCMzIgKnBkYiA9IChQREIzMiAqKW9iajsKKyAgICBhc3NlcnQoIG9iai0+dHlwZSA9PSBLMzJPQkpfUFJPQ0VTUyApOworICAgIHJldHVybiBLMzJPQkpfT1BTKCBwZGItPmV2ZW50ICktPnNpZ25hbGVkKCBwZGItPmV2ZW50LCB0aHJlYWRfaWQgKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBQUk9DRVNTX1NhdGlzZmllZAorICoKKyAqIFdhaXQgb24gdGhpcyBvYmplY3QgaGFzIGJlZW4gc2F0aXNmaWVkLgorICovCitzdGF0aWMgdm9pZCBQUk9DRVNTX1NhdGlzZmllZCggSzMyT0JKICpvYmosIERXT1JEIHRocmVhZF9pZCApCit7CisgICAgUERCMzIgKnBkYiA9IChQREIzMiAqKW9iajsKKyAgICBhc3NlcnQoIG9iai0+dHlwZSA9PSBLMzJPQkpfUFJPQ0VTUyApOworICAgIHJldHVybiBLMzJPQkpfT1BTKCBwZGItPmV2ZW50ICktPnNhdGlzZmllZCggcGRiLT5ldmVudCwgdGhyZWFkX2lkICk7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgUFJPQ0VTU19BZGRXYWl0CisgKgorICogQWRkIHRocmVhZCB0byBvYmplY3Qgd2FpdCBxdWV1ZS4KKyAqLworc3RhdGljIHZvaWQgUFJPQ0VTU19BZGRXYWl0KCBLMzJPQkogKm9iaiwgRFdPUkQgdGhyZWFkX2lkICkKK3sKKyAgICBQREIzMiAqcGRiID0gKFBEQjMyICopb2JqOworICAgIGFzc2VydCggb2JqLT50eXBlID09IEszMk9CSl9QUk9DRVNTICk7CisgICAgcmV0dXJuIEszMk9CSl9PUFMoIHBkYi0+ZXZlbnQgKS0+YWRkX3dhaXQoIHBkYi0+ZXZlbnQsIHRocmVhZF9pZCApOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIFBST0NFU1NfUmVtb3ZlV2FpdAorICoKKyAqIFJlbW92ZSB0aHJlYWQgZnJvbSBvYmplY3Qgd2FpdCBxdWV1ZS4KKyAqLworc3RhdGljIHZvaWQgUFJPQ0VTU19SZW1vdmVXYWl0KCBLMzJPQkogKm9iaiwgRFdPUkQgdGhyZWFkX2lkICkKK3sKKyAgICBQREIzMiAqcGRiID0gKFBEQjMyICopb2JqOworICAgIGFzc2VydCggb2JqLT50eXBlID09IEszMk9CSl9QUk9DRVNTICk7CisgICAgcmV0dXJuIEszMk9CSl9PUFMoIHBkYi0+ZXZlbnQgKS0+cmVtb3ZlX3dhaXQoIHBkYi0+ZXZlbnQsIHRocmVhZF9pZCApOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIFBST0NFU1NfRGVzdHJveQogICovCi12b2lkIFBST0NFU1NfRGVzdHJveSggSzMyT0JKICpwdHIgKQorc3RhdGljIHZvaWQgUFJPQ0VTU19EZXN0cm95KCBLMzJPQkogKnB0ciApCiB7CiAgICAgUERCMzIgKnBkYiA9IChQREIzMiAqKXB0cjsKICAgICBIQU5ETEUzMiBoYW5kbGU7CkBAIC0zNzYsNiArNDY1LDggQEAKICAgICBIZWFwRnJlZSggcGRiLT5oZWFwLCAwLCBwZGItPmVudl9kYiApOwogICAgIEhlYXBGcmVlKCBwZGItPnN5c3RlbV9oZWFwLCAwLCBwZGItPmhhbmRsZV90YWJsZSApOwogICAgIEhlYXBEZXN0cm95KCBwZGItPmhlYXAgKTsKKyAgICBLMzJPQkpfRGVjQ291bnQoIHBkYi0+bG9hZF9kb25lX2V2dCApOworICAgIEszMk9CSl9EZWNDb3VudCggcGRiLT5ldmVudCApOwogICAgIERlbGV0ZUNyaXRpY2FsU2VjdGlvbiggJnBkYi0+Y3JpdF9zZWN0aW9uICk7CiAgICAgSGVhcEZyZWUoIFN5c3RlbUhlYXAsIDAsIHBkYiApOwogfQpAQCAtMzg3LDYgKzQ3OCw5IEBACiB2b2lkIFdJTkFQSSBFeGl0UHJvY2VzcyggRFdPUkQgc3RhdHVzICkKIHsKICAgICBfX1JFU1RPUkVfRVM7ICAvKiBOZWNlc3NhcnkgZm9yIFBpZXRyZWsncyBzaG93c2VoIGV4YW1wbGUgcHJvZ3JhbSAqLworICAgIC8qIEZJWE1FOiBzaG91bGQga2lsbCBhbGwgcnVubmluZyB0aHJlYWRzIG9mIHRoaXMgcHJvY2VzcyAqLworICAgIHBDdXJyZW50UHJvY2Vzcy0+ZXhpdF9jb2RlID0gc3RhdHVzOworICAgIEVWRU5UX1NldCggcEN1cnJlbnRQcm9jZXNzLT5ldmVudCApOwogICAgIFRBU0tfS2lsbEN1cnJlbnRUYXNrKCBzdGF0dXMgKTsKIH0KIApAQCAtNDAxLDI2ICs0OTUsMjYgQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKglPcGVuUHJvY2VzcwkJCQlbS0VSTkVMMzIuNTQzXQotICoKKyAqICAgICAgICAgICBPcGVuUHJvY2VzcyAgIChLRVJORUwzMi41NDMpCiAgKi8KLUhBTkRMRTMyIFdJTkFQSSBPcGVuUHJvY2VzczMyKERXT1JEIGZkd0FjY2VzcyxCT09MMzIgYkluaGVyaXQsRFdPUkQgSURQcm9jZXNzKQorSEFORExFMzIgV0lOQVBJIE9wZW5Qcm9jZXNzKCBEV09SRCBhY2Nlc3MsIEJPT0wzMiBpbmhlcml0LCBEV09SRCBpZCApCiB7Ci0JaWYgKElEUHJvY2VzcyAhPSAoRFdPUkQpcEN1cnJlbnRQcm9jZXNzKSB7Ci0JCWZwcmludGYoc3RkZXJyLCJPcGVuUHJvY2VzczMyKCVsZCwlZCwlbGQpXG4iLGZkd0FjY2VzcyxiSW5oZXJpdCxJRFByb2Nlc3MpOwotCQkvKiBYWFg6IG1pZ2h0IG5vdCBiZSB0aGUgY29ycmVjdCBlcnJvciB2YWx1ZSAqLwotCQlTZXRMYXN0RXJyb3IoIEVSUk9SX0lOVkFMSURfSEFORExFICk7Ci0JCXJldHVybiAwOwotCX0KLQlyZXR1cm4gR2V0Q3VycmVudFByb2Nlc3MoKTsKKyAgICBQREIzMiAqcGRiID0gUFJPQ0VTU19JRF9UT19QREIoaWQpOworICAgIGlmICghSzMyT0JKX0lzVmFsaWQoICZwZGItPmhlYWRlciwgSzMyT0JKX1BST0NFU1MgKSkKKyAgICB7CisgICAgICAgIFNldExhc3RFcnJvciggRVJST1JfSU5WQUxJRF9IQU5ETEUgKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHJldHVybiBQUk9DRVNTX0FsbG9jSGFuZGxlKCAmcGRiLT5oZWFkZXIsIDAgKTsKIH0JCQkgICAgICAKIAorCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBHZXRDdXJyZW50UHJvY2Vzc0lkICAgKEtFUk5FTDMyLjE5OSkKICAqLwogRFdPUkQgV0lOQVBJIEdldEN1cnJlbnRQcm9jZXNzSWQodm9pZCkKIHsKLSAgICByZXR1cm4gKERXT1JEKXBDdXJyZW50UHJvY2VzczsKKyAgICByZXR1cm4gUERCX1RPX1BST0NFU1NfSUQocEN1cnJlbnRQcm9jZXNzKTsKIH0KIAogCkBAIC04NTksMjAgKzk1MywyNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgR2V0UHJvY2Vzc1ZlcnNpb24gICAgKEtFUk5FTDMyKQogICovCi1EV09SRCBXSU5BUEkgR2V0UHJvY2Vzc1ZlcnNpb24oRFdPUkQgcHJvY2Vzc2lkKQorRFdPUkQgV0lOQVBJIEdldFByb2Nlc3NWZXJzaW9uKCBEV09SRCBwcm9jZXNzaWQgKQogewotCVBEQjMyCSpwcm9jZXNzOwotCVREQgkqcFRhc2s7CisgICAgUERCMzIgKnByb2Nlc3M7CisgICAgVERCICpwVGFzazsKIAotCWlmICghcHJvY2Vzc2lkKSB7Ci0JCXByb2Nlc3M9cEN1cnJlbnRQcm9jZXNzOwotCQkvKiBjaGVjayBpZiB2YWxpZCBwcm9jZXNzICovCi0JfSBlbHNlCi0JCXByb2Nlc3M9KFBEQjMyKilwQ3VycmVudFByb2Nlc3M7IC8qIGRlY3J5cHQgdG9vLCBpZiBuZWVkZWQgKi8KLQlwVGFzayA9IChUREIqKUdsb2JhbExvY2sxNihwcm9jZXNzLT50YXNrKTsKLQlpZiAoIXBUYXNrKQotCQlyZXR1cm4gMDsKLQlyZXR1cm4gKHBUYXNrLT52ZXJzaW9uJjB4ZmYpIHwgKCgocFRhc2stPnZlcnNpb24gPj44KSAmIDB4ZmYpPDwxNik7CisgICAgaWYgKCFwcm9jZXNzaWQpIHByb2Nlc3MgPSBwQ3VycmVudFByb2Nlc3M7CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcHJvY2VzcyA9IFBST0NFU1NfSURfVE9fUERCKHByb2Nlc3NpZCk7CisgICAgICAgIGlmICghSzMyT0JKX0lzVmFsaWQoICZwcm9jZXNzLT5oZWFkZXIsIEszMk9CSl9QUk9DRVNTICkpCisgICAgICAgIHsKKyAgICAgICAgICAgIFNldExhc3RFcnJvciggRVJST1JfSU5WQUxJRF9QQVJBTUVURVIgKTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgfQorICAgIHBUYXNrID0gKFREQiopR2xvYmFsTG9jazE2KHByb2Nlc3MtPnRhc2spOworICAgIGlmICghcFRhc2spCisgICAgICAgIHJldHVybiAwOworICAgIHJldHVybiAocFRhc2stPnZlcnNpb24mMHhmZikgfCAoKChwVGFzay0+dmVyc2lvbiA+PjgpICYgMHhmZik8PDE2KTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC04ODAsMTQgKzk3OSwxOSBAQAogICovCiBEV09SRCBXSU5BUEkgR2V0UHJvY2Vzc0ZsYWdzKERXT1JEIHByb2Nlc3NpZCkKIHsKLQlQREIzMgkqcHJvY2VzczsKKyAgICBQREIzMiAqcHJvY2VzczsKIAotCWlmICghcHJvY2Vzc2lkKSB7Ci0JCXByb2Nlc3M9cEN1cnJlbnRQcm9jZXNzOwotCQkvKiBjaGVjayBpZiB2YWxpZCBwcm9jZXNzICovCi0JfSBlbHNlCi0JCXByb2Nlc3M9KFBEQjMyKilwQ3VycmVudFByb2Nlc3M7IC8qIGRlY3J5cHQgdG9vLCBpZiBuZWVkZWQgKi8KLQlyZXR1cm4gcHJvY2Vzcy0+ZmxhZ3M7CisgICAgaWYgKCFwcm9jZXNzaWQpIHByb2Nlc3MgPSBwQ3VycmVudFByb2Nlc3M7CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcHJvY2VzcyA9IFBST0NFU1NfSURfVE9fUERCKHByb2Nlc3NpZCk7CisgICAgICAgIGlmICghSzMyT0JKX0lzVmFsaWQoICZwcm9jZXNzLT5oZWFkZXIsIEszMk9CSl9QUk9DRVNTICkpCisgICAgICAgIHsKKyAgICAgICAgICAgIFNldExhc3RFcnJvciggRVJST1JfSU5WQUxJRF9QQVJBTUVURVIgKTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBwcm9jZXNzLT5mbGFnczsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC05NTEsMyArMTA1NSwxNSBAQAogCWZwcmludGYoc3RkZXJyLCJDb252ZXJ0VG9HbG9iYWxIYW5kbGUoJWQpLHN0dWIhXG4iLGgpOwogCXJldHVybiBoOwogfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBSZWdpc3RlclNlcnZpY2VQcm9jZXNzICAgICAgICAgICAgIChLRVJORUwzMikKKyAqCisgKiBBIHNlcnZpY2UgcHJvY2VzcyBjYWxscyB0aGlzIGZ1bmN0aW9uIHRvIGVuc3VyZSB0aGF0IGl0IGNvbnRpbnVlcyB0byBydW4KKyAqIGV2ZW4gYWZ0ZXIgYSB1c2VyIGxvZ2dlZCBvZmYuCisgKi8KK0RXT1JEIFJlZ2lzdGVyU2VydmljZVByb2Nlc3MoRFdPUkQgZHdQcm9jZXNzSWQsIERXT1JEIGR3VHlwZSkKK3sKKwkvKiBJIGRvbid0IHRoaW5rIHRoYXQgV2luZSBuZWVkcyB0byBkbyBhbnl0aGluZyBpbiB0aGF0IGZ1bmN0aW9uICovCisJcmV0dXJuIDE7IC8qIHN1Y2Nlc3MgKi8KK30KZGlmZiAtLWdpdCBhL3NjaGVkdWxlci9zZW1hcGhvcmUuYyBiL3NjaGVkdWxlci9zZW1hcGhvcmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOGMxNTM1Ci0tLSAvZGV2L251bGwKKysrIGIvc2NoZWR1bGVyL3NlbWFwaG9yZS5jCkBAIC0wLDAgKzEsMjE0IEBACisvKgorICogV2luMzIgc2VtYXBob3JlcworICoKKyAqIENvcHlyaWdodCAxOTk4IEFsZXhhbmRyZSBKdWxsaWFyZAorICovCisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlICJ3aW5kb3dzLmgiCisjaW5jbHVkZSAid2luZXJyb3IuaCIKKyNpbmNsdWRlICJrMzJvYmouaCIKKyNpbmNsdWRlICJwcm9jZXNzLmgiCisjaW5jbHVkZSAidGhyZWFkLmgiCisjaW5jbHVkZSAiaGVhcC5oIgorCit0eXBlZGVmIHN0cnVjdAoreworICAgIEszMk9CSiAgICAgICAgaGVhZGVyOworICAgIFRIUkVBRF9RVUVVRSAgd2FpdF9xdWV1ZTsKKyAgICBMT05HICAgICAgICAgIGNvdW50OworICAgIExPTkcgICAgICAgICAgbWF4OworfSBTRU1BUEhPUkU7CisKK3N0YXRpYyBCT09MMzIgU0VNQVBIT1JFX1NpZ25hbGVkKCBLMzJPQkogKm9iaiwgRFdPUkQgdGhyZWFkX2lkICk7CitzdGF0aWMgdm9pZCBTRU1BUEhPUkVfU2F0aXNmaWVkKCBLMzJPQkogKm9iaiwgRFdPUkQgdGhyZWFkX2lkICk7CitzdGF0aWMgdm9pZCBTRU1BUEhPUkVfQWRkV2FpdCggSzMyT0JKICpvYmosIERXT1JEIHRocmVhZF9pZCApOworc3RhdGljIHZvaWQgU0VNQVBIT1JFX1JlbW92ZVdhaXQoIEszMk9CSiAqb2JqLCBEV09SRCB0aHJlYWRfaWQgKTsKK3N0YXRpYyB2b2lkIFNFTUFQSE9SRV9EZXN0cm95KCBLMzJPQkogKm9iaiApOworCitjb25zdCBLMzJPQkpfT1BTIFNFTUFQSE9SRV9PcHMgPQoreworICAgIFNFTUFQSE9SRV9TaWduYWxlZCwgICAgLyogc2lnbmFsZWQgKi8KKyAgICBTRU1BUEhPUkVfU2F0aXNmaWVkLCAgIC8qIHNhdGlzZmllZCAqLworICAgIFNFTUFQSE9SRV9BZGRXYWl0LCAgICAgLyogYWRkX3dhaXQgKi8KKyAgICBTRU1BUEhPUkVfUmVtb3ZlV2FpdCwgIC8qIHJlbW92ZV93YWl0ICovCisgICAgU0VNQVBIT1JFX0Rlc3Ryb3kgICAgICAvKiBkZXN0cm95ICovCit9OworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIENyZWF0ZVNlbWFwaG9yZTMyQSAgIChLRVJORUwzMi4xNzQpCisgKi8KK0hBTkRMRTMyIFdJTkFQSSBDcmVhdGVTZW1hcGhvcmUzMkEoIFNFQ1VSSVRZX0FUVFJJQlVURVMgKnNhLCBMT05HIGluaXRpYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT05HIG1heCwgTFBDU1RSIG5hbWUgKQoreworICAgIEhBTkRMRTMyIGhhbmRsZTsKKyAgICBTRU1BUEhPUkUgKnNlbTsKKworICAgIC8qIENoZWNrIHBhcmFtZXRlcnMgKi8KKworICAgIGlmICgobWF4IDw9IDApIHx8IChpbml0aWFsIDwgMCkgfHwgKGluaXRpYWwgPiBtYXgpKQorICAgIHsKKyAgICAgICAgU2V0TGFzdEVycm9yKCBFUlJPUl9JTlZBTElEX1BBUkFNRVRFUiApOworICAgICAgICByZXR1cm4gSU5WQUxJRF9IQU5ETEVfVkFMVUUzMjsKKyAgICB9CisKKyAgICBTWVNURU1fTE9DSygpOworICAgIHNlbSA9IChTRU1BUEhPUkUgKilLMzJPQkpfQ3JlYXRlKCBLMzJPQkpfU0VNQVBIT1JFLCBzaXplb2YoKnNlbSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsICZoYW5kbGUgKTsKKyAgICBpZiAoc2VtKQorICAgIHsKKyAgICAgICAgLyogRmluaXNoIGluaXRpYWxpemluZyBpdCAqLworICAgICAgICBzZW0tPndhaXRfcXVldWUgPSBOVUxMOworICAgICAgICBzZW0tPmNvdW50ICAgICAgPSBpbml0aWFsOworICAgICAgICBzZW0tPm1heCAgICAgICAgPSBtYXg7CisgICAgICAgIEszMk9CSl9EZWNDb3VudCggJnNlbS0+aGVhZGVyICk7CisgICAgfQorICAgIFNZU1RFTV9VTkxPQ0soKTsKKyAgICByZXR1cm4gaGFuZGxlOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIENyZWF0ZVNlbWFwaG9yZTMyVyAgIChLRVJORUwzMi4xNzUpCisgKi8KK0hBTkRMRTMyIFdJTkFQSSBDcmVhdGVTZW1hcGhvcmUzMlcoIFNFQ1VSSVRZX0FUVFJJQlVURVMgKnNhLCBMT05HIGluaXRpYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT05HIG1heCwgTFBDV1NUUiBuYW1lICkKK3sKKyAgICBMUFNUUiBuYW1lQSA9IEhFQVBfc3RyZHVwV3RvQSggR2V0UHJvY2Vzc0hlYXAoKSwgMCwgbmFtZSApOworICAgIEhBTkRMRTMyIHJldCA9IENyZWF0ZVNlbWFwaG9yZTMyQSggc2EsIGluaXRpYWwsIG1heCwgbmFtZUEgKTsKKyAgICBpZiAobmFtZUEpIEhlYXBGcmVlKCBHZXRQcm9jZXNzSGVhcCgpLCAwLCBuYW1lQSApOworICAgIHJldHVybiByZXQ7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgT3BlblNlbWFwaG9yZTMyQSAgIChLRVJORUwzMi41NDUpCisgKi8KK0hBTkRMRTMyIFdJTkFQSSBPcGVuU2VtYXBob3JlMzJBKCBEV09SRCBhY2Nlc3MsIEJPT0wzMiBpbmhlcml0LCBMUENTVFIgbmFtZSApCit7CisgICAgSEFORExFMzIgaGFuZGxlID0gMDsKKyAgICBLMzJPQkogKm9iajsKKyAgICBTWVNURU1fTE9DSygpOworICAgIGlmICgob2JqID0gSzMyT0JKX0ZpbmROYW1lVHlwZSggbmFtZSwgSzMyT0JKX1NFTUFQSE9SRSApKSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgaGFuZGxlID0gUFJPQ0VTU19BbGxvY0hhbmRsZSggb2JqLCAwICk7CisgICAgICAgIEszMk9CSl9EZWNDb3VudCggb2JqICk7CisgICAgfQorICAgIFNZU1RFTV9VTkxPQ0soKTsKKyAgICByZXR1cm4gaGFuZGxlOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIE9wZW5TZW1hcGhvcmUzMlcgICAoS0VSTkVMMzIuNTQ2KQorICovCitIQU5ETEUzMiBXSU5BUEkgT3BlblNlbWFwaG9yZTMyVyggRFdPUkQgYWNjZXNzLCBCT09MMzIgaW5oZXJpdCwgTFBDV1NUUiBuYW1lICkKK3sKKyAgICBMUFNUUiBuYW1lQSA9IEhFQVBfc3RyZHVwV3RvQSggR2V0UHJvY2Vzc0hlYXAoKSwgMCwgbmFtZSApOworICAgIEhBTkRMRTMyIHJldCA9IE9wZW5TZW1hcGhvcmUzMkEoIGFjY2VzcywgaW5oZXJpdCwgbmFtZUEgKTsKKyAgICBpZiAobmFtZUEpIEhlYXBGcmVlKCBHZXRQcm9jZXNzSGVhcCgpLCAwLCBuYW1lQSApOworICAgIHJldHVybiByZXQ7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgUmVsZWFzZVNlbWFwaG9yZSAgIChLRVJORUwzMi41ODMpCisgKi8KK0JPT0wzMiBXSU5BUEkgUmVsZWFzZVNlbWFwaG9yZSggSEFORExFMzIgaGFuZGxlLCBMT05HIGNvdW50LCBMT05HICpwcmV2aW91cyApCit7CisgICAgU0VNQVBIT1JFICpzZW07CisKKyAgICBTWVNURU1fTE9DSygpOworICAgIGlmICghKHNlbSA9IChTRU1BUEhPUkUgKilQUk9DRVNTX0dldE9ialB0ciggaGFuZGxlLCBLMzJPQkpfU0VNQVBIT1JFICkpKQorICAgIHsKKyAgICAgICAgU1lTVEVNX1VOTE9DSygpOworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICAgIGlmIChwcmV2aW91cykgKnByZXZpb3VzID0gc2VtLT5jb3VudDsKKyAgICBpZiAoc2VtLT5jb3VudCArIGNvdW50ID4gc2VtLT5tYXgpCisgICAgeworICAgICAgICBTWVNURU1fVU5MT0NLKCk7CisgICAgICAgIFNldExhc3RFcnJvciggRVJST1JfVE9PX01BTllfUE9TVFMgKTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgICBpZiAoc2VtLT5jb3VudCA+IDApCisgICAgeworICAgICAgICAvKiBUaGVyZSBjYW5ub3QgYmUgYW55IHRocmVhZCB3YWl0aW5nIGlmIHRoZSBjb3VudCBpcyA+IDAgKi8KKyAgICAgICAgYXNzZXJ0KCBzZW0tPndhaXRfcXVldWUgPT0gTlVMTCApOworICAgICAgICBzZW0tPmNvdW50ICs9IGNvdW50OworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBzZW0tPmNvdW50ID0gY291bnQ7CisgICAgICAgIFNZTkNfV2FrZVVwKCAmc2VtLT53YWl0X3F1ZXVlLCBjb3VudCApOworICAgIH0KKyAgICBLMzJPQkpfRGVjQ291bnQoICZzZW0tPmhlYWRlciApOworICAgIFNZU1RFTV9VTkxPQ0soKTsKKyAgICByZXR1cm4gVFJVRTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBTRU1BUEhPUkVfU2lnbmFsZWQKKyAqLworc3RhdGljIEJPT0wzMiBTRU1BUEhPUkVfU2lnbmFsZWQoIEszMk9CSiAqb2JqLCBEV09SRCB0aHJlYWRfaWQgKQoreworICAgIFNFTUFQSE9SRSAqc2VtID0gKFNFTUFQSE9SRSAqKW9iajsKKyAgICBhc3NlcnQoIG9iai0+dHlwZSA9PSBLMzJPQkpfU0VNQVBIT1JFICk7CisgICAgcmV0dXJuIChzZW0tPmNvdW50ID4gMCk7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgU0VNQVBIT1JFX1NhdGlzZmllZAorICoKKyAqIFdhaXQgb24gdGhpcyBvYmplY3QgaGFzIGJlZW4gc2F0aXNmaWVkLgorICovCitzdGF0aWMgdm9pZCBTRU1BUEhPUkVfU2F0aXNmaWVkKCBLMzJPQkogKm9iaiwgRFdPUkQgdGhyZWFkX2lkICkKK3sKKyAgICBTRU1BUEhPUkUgKnNlbSA9IChTRU1BUEhPUkUgKilvYmo7CisgICAgYXNzZXJ0KCBvYmotPnR5cGUgPT0gSzMyT0JKX1NFTUFQSE9SRSApOworICAgIGFzc2VydCggc2VtLT5jb3VudCA+IDAgKTsKKyAgICBzZW0tPmNvdW50LS07Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgU0VNQVBIT1JFX0FkZFdhaXQKKyAqCisgKiBBZGQgY3VycmVudCB0aHJlYWQgdG8gb2JqZWN0IHdhaXQgcXVldWUuCisgKi8KK3N0YXRpYyB2b2lkIFNFTUFQSE9SRV9BZGRXYWl0KCBLMzJPQkogKm9iaiwgRFdPUkQgdGhyZWFkX2lkICkKK3sKKyAgICBTRU1BUEhPUkUgKnNlbSA9IChTRU1BUEhPUkUgKilvYmo7CisgICAgYXNzZXJ0KCBvYmotPnR5cGUgPT0gSzMyT0JKX1NFTUFQSE9SRSApOworICAgIFRIUkVBRF9BZGRRdWV1ZSggJnNlbS0+d2FpdF9xdWV1ZSwgVEhSRUFEX0lEX1RPX1RIREIodGhyZWFkX2lkKSApOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIFNFTUFQSE9SRV9SZW1vdmVXYWl0CisgKgorICogUmVtb3ZlIHRocmVhZCBmcm9tIG9iamVjdCB3YWl0IHF1ZXVlLgorICovCitzdGF0aWMgdm9pZCBTRU1BUEhPUkVfUmVtb3ZlV2FpdCggSzMyT0JKICpvYmosIERXT1JEIHRocmVhZF9pZCApCit7CisgICAgU0VNQVBIT1JFICpzZW0gPSAoU0VNQVBIT1JFICopb2JqOworICAgIGFzc2VydCggb2JqLT50eXBlID09IEszMk9CSl9TRU1BUEhPUkUgKTsKKyAgICBUSFJFQURfUmVtb3ZlUXVldWUoICZzZW0tPndhaXRfcXVldWUsIFRIUkVBRF9JRF9UT19USERCKHRocmVhZF9pZCkgKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBTRU1BUEhPUkVfRGVzdHJveQorICovCitzdGF0aWMgdm9pZCBTRU1BUEhPUkVfRGVzdHJveSggSzMyT0JKICpvYmogKQoreworICAgIFNFTUFQSE9SRSAqc2VtID0gKFNFTUFQSE9SRSAqKW9iajsKKyAgICBhc3NlcnQoIG9iai0+dHlwZSA9PSBLMzJPQkpfU0VNQVBIT1JFICk7CisgICAgLyogVGhlcmUgY2Fubm90IGJlIGFueSB0aHJlYWQgb24gdGhlIGxpc3Qgc2luY2UgdGhlIHJlZiBjb3VudCBpcyAwICovCisgICAgYXNzZXJ0KCBzZW0tPndhaXRfcXVldWUgPT0gTlVMTCApOworICAgIG9iai0+dHlwZSA9IEszMk9CSl9VTktOT1dOOworICAgIEhlYXBGcmVlKCBTeXN0ZW1IZWFwLCAwLCBzZW0gKTsKK30KZGlmZiAtLWdpdCBhL3NjaGVkdWxlci9zeW5jaHJvLmMgYi9zY2hlZHVsZXIvc3luY2hyby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwMDAyMTcKLS0tIC9kZXYvbnVsbAorKysgYi9zY2hlZHVsZXIvc3luY2hyby5jCkBAIC0wLDAgKzEsMzE1IEBACisvKgorICogV2luMzIgcHJvY2VzcyBhbmQgdGhyZWFkIHN5bmNocm9uaXNhdGlvbgorICoKKyAqIENvcHlyaWdodCAxOTk3IEFsZXhhbmRyZSBKdWxsaWFyZAorICovCisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSAiazMyb2JqLmgiCisjaW5jbHVkZSAiaGVhcC5oIgorI2luY2x1ZGUgInByb2Nlc3MuaCIKKyNpbmNsdWRlICJ0aHJlYWQuaCIKKyNpbmNsdWRlICJ3aW5lcnJvci5oIgorI2luY2x1ZGUgInN0ZGRlYnVnLmgiCisjaW5jbHVkZSAiZGVidWcuaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgU1lOQ19CdWlsZFdhaXRTdHJ1Y3QKKyAqLworc3RhdGljIEJPT0wzMiBTWU5DX0J1aWxkV2FpdFN0cnVjdCggRFdPUkQgY291bnQsIGNvbnN0IEhBTkRMRTMyICpoYW5kbGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQk9PTDMyIHdhaXRfYWxsLCBXQUlUX1NUUlVDVCAqd2FpdCApCit7CisgICAgRFdPUkQgaTsKKyAgICBLMzJPQkogKipwdHI7CisKKyAgICB3YWl0LT5jb3VudCAgICA9IGNvdW50OworICAgIHdhaXQtPnNpZ25hbGVkID0gV0FJVF9GQUlMRUQ7CisgICAgd2FpdC0+d2FpdF9hbGwgPSB3YWl0X2FsbDsKKyAgICBTWVNURU1fTE9DSygpOworICAgIGZvciAoaSA9IDAsIHB0ciA9IHdhaXQtPm9ianM7IGkgPCBjb3VudDsgaSsrLCBwdHIrKykKKyAgICB7CisgICAgICAgIGlmICghKCpwdHIgPSBQUk9DRVNTX0dldE9ialB0ciggaGFuZGxlc1tpXSwgSzMyT0JKX1VOS05PV04gKSkpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgaWYgKCFLMzJPQkpfT1BTKCAqcHRyICktPnNpZ25hbGVkKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBUaGlzIG9iamVjdCB0eXBlIGNhbm5vdCBiZSB3YWl0ZWQgdXBvbiAqLworICAgICAgICAgICAgSzMyT0JKX0RlY0NvdW50KCAqcHRyICk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgfQorICAgIGlmIChpICE9IGNvdW50KQorICAgIHsKKyAgICAgICAgLyogVGhlcmUgd2FzIGFuIGVycm9yICovCisgICAgICAgIHdoaWxlIChpLS0pIEszMk9CSl9EZWNDb3VudCggd2FpdC0+b2Jqc1tpXSApOworICAgIH0KKyAgICBTWVNURU1fVU5MT0NLKCk7CisgICAgcmV0dXJuIChpID09IGNvdW50KTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBTWU5DX0ZyZWVXYWl0U3RydWN0CisgKi8KK3N0YXRpYyB2b2lkIFNZTkNfRnJlZVdhaXRTdHJ1Y3QoIFdBSVRfU1RSVUNUICp3YWl0ICkKK3sKKyAgICBEV09SRCBpOworICAgIEszMk9CSiAqKnB0cjsKKyAgICBTWVNURU1fTE9DSygpOworICAgIGZvciAoaSA9IDAsIHB0ciA9IHdhaXQtPm9ianM7IGkgPCB3YWl0LT5jb3VudDsgaSsrLCBwdHIrKykKKyAgICAgICAgSzMyT0JKX0RlY0NvdW50KCAqcHRyICk7CisgICAgU1lTVEVNX1VOTE9DSygpOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIFNZTkNfQ2hlY2tDb25kaXRpb24KKyAqLworc3RhdGljIEJPT0wzMiBTWU5DX0NoZWNrQ29uZGl0aW9uKCBXQUlUX1NUUlVDVCAqd2FpdCwgRFdPUkQgdGhyZWFkX2lkICkKK3sKKyAgICBEV09SRCBpOworICAgIEszMk9CSiAqKnB0cjsKKworICAgIFNZU1RFTV9MT0NLKCk7CisgICAgaWYgKHdhaXQtPndhaXRfYWxsKQorICAgIHsKKyAgICAgICAgZm9yIChpID0gMCwgcHRyID0gd2FpdC0+b2JqczsgaSA8IHdhaXQtPmNvdW50OyBpKyssIHB0cisrKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIUszMk9CSl9PUFMoICpwdHIgKS0+c2lnbmFsZWQoICpwdHIsIHRocmVhZF9pZCApKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFNZU1RFTV9VTkxPQ0soKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLyogV2FpdCBzYXRpc2ZpZWQ6IHRlbGwgaXQgdG8gYWxsIG9iamVjdHMgKi8KKyAgICAgICAgd2FpdC0+c2lnbmFsZWQgPSBXQUlUX09CSkVDVF8wOworICAgICAgICBmb3IgKGkgPSAwLCBwdHIgPSB3YWl0LT5vYmpzOyBpIDwgd2FpdC0+Y291bnQ7IGkrKywgcHRyKyspCisgICAgICAgICAgICBLMzJPQkpfT1BTKCAqcHRyICktPnNhdGlzZmllZCggKnB0ciwgdGhyZWFkX2lkICk7CisgICAgICAgIFNZU1RFTV9VTkxPQ0soKTsKKyAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGZvciAoaSA9IDAsIHB0ciA9IHdhaXQtPm9ianM7IGkgPCB3YWl0LT5jb3VudDsgaSsrLCBwdHIrKykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKEszMk9CSl9PUFMoICpwdHIgKS0+c2lnbmFsZWQoICpwdHIsIHRocmVhZF9pZCApKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIFdhaXQgc2F0aXNmaWVkOiB0ZWxsIGl0IHRvIHRoZSBvYmplY3QgKi8KKyAgICAgICAgICAgICAgICB3YWl0LT5zaWduYWxlZCA9IFdBSVRfT0JKRUNUXzAgKyBpOworICAgICAgICAgICAgICAgIEszMk9CSl9PUFMoICpwdHIgKS0+c2F0aXNmaWVkKCAqcHRyLCB0aHJlYWRfaWQgKTsKKyAgICAgICAgICAgICAgICBTWVNURU1fVU5MT0NLKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgU1lTVEVNX1VOTE9DSygpOworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIFNZTkNfV2FpdEZvckNvbmRpdGlvbgorICovCit2b2lkIFNZTkNfV2FpdEZvckNvbmRpdGlvbiggV0FJVF9TVFJVQ1QgKndhaXQsIERXT1JEIHRpbWVvdXQgKQoreworICAgIERXT1JEIGksIHRocmVhZF9pZCA9IEdldEN1cnJlbnRUaHJlYWRJZCgpOworICAgIExPTkcgY291bnQ7CisgICAgSzMyT0JKICoqcHRyOworICAgIHNpZ3NldF90IHNldDsKKworICAgIFNZU1RFTV9MT0NLKCk7CisgICAgaWYgKFNZTkNfQ2hlY2tDb25kaXRpb24oIHdhaXQsIHRocmVhZF9pZCApKQorICAgICAgICBnb3RvIGRvbmU7ICAvKiBDb25kaXRpb24gYWxyZWFkeSBzYXRpc2ZpZWQgKi8KKyAgICBpZiAoIXRpbWVvdXQpCisgICAgeworICAgICAgICAvKiBObyBuZWVkIHRvIHdhaXQgKi8KKyAgICAgICAgd2FpdC0+c2lnbmFsZWQgPSBXQUlUX1RJTUVPVVQ7CisgICAgICAgIGdvdG8gZG9uZTsKKyAgICB9CisKKyAgICAvKiBBZGQgb3Vyc2VsdmVzIHRvIHRoZSB3YWl0aW5nIGxpc3Qgb2YgYWxsIG9iamVjdHMgKi8KKworICAgIGZvciAoaSA9IDAsIHB0ciA9IHdhaXQtPm9ianM7IGkgPCB3YWl0LT5jb3VudDsgaSsrLCBwdHIrKykKKyAgICAgICAgSzMyT0JKX09QUyggKnB0ciApLT5hZGRfd2FpdCggKnB0ciwgdGhyZWFkX2lkICk7CisKKyAgICAvKiBSZWxlYXNlIHRoZSBzeXN0ZW0gbG9jayBjb21wbGV0ZWx5ICovCisKKyAgICBjb3VudCA9IFNZU1RFTV9MT0NLX0NPVU5UKCk7CisgICAgZm9yIChpID0gY291bnQ7IGkgPiAwOyBpLS0pIFNZU1RFTV9VTkxPQ0soKTsKKworICAgIC8qIE5vdyB3YWl0IGZvciBpdCAqLworCisgICAgZHByaW50Zl93aW4zMiggc3RkZGViLCAiU1lOQzogc3RhcnRpbmcgd2FpdCAoJXAgJTA0eClcbiIsCisgICAgICAgICAgICAgICAgICAgVEhSRUFEX0N1cnJlbnQoKSwgVEhSRUFEX0N1cnJlbnQoKS0+dGViX3NlbCApOworCisgICAgc2lncHJvY21hc2soIFNJR19TRVRNQVNLLCBOVUxMLCAmc2V0ICk7CisgICAgc2lnZGVsc2V0KCAmc2V0LCBTSUdVU1IxICk7CisgICAgc2lnZGVsc2V0KCAmc2V0LCBTSUdBTFJNICk7CisgICAgaWYgKHRpbWVvdXQgIT0gSU5GSU5JVEUzMikKKyAgICB7CisgICAgICAgIHdoaWxlICh3YWl0LT5zaWduYWxlZCA9PSBXQUlUX0ZBSUxFRCkKKyAgICAgICAgeworICAgICAgICAgICAgc3RydWN0IGl0aW1lcnZhbCB0aW1lcjsKKyAgICAgICAgICAgIERXT1JEIHN0YXJ0X3RpY2tzLCBlbGFwc2VkOworICAgICAgICAgICAgdGltZXIuaXRfaW50ZXJ2YWwudHZfc2VjID0gdGltZXIuaXRfaW50ZXJ2YWwudHZfdXNlYyA9IDA7CisgICAgICAgICAgICB0aW1lci5pdF92YWx1ZS50dl9zZWMgPSB0aW1lb3V0IC8gMTAwMDsKKyAgICAgICAgICAgIHRpbWVyLml0X3ZhbHVlLnR2X3VzZWMgPSAodGltZW91dCAlIDEwMDApICogMTAwMDsKKyAgICAgICAgICAgIHN0YXJ0X3RpY2tzID0gR2V0VGlja0NvdW50KCk7CisgICAgICAgICAgICBzZXRpdGltZXIoIElUSU1FUl9SRUFMLCAmdGltZXIsIE5VTEwgKTsKKyAgICAgICAgICAgIHNpZ3N1c3BlbmQoICZzZXQgKTsKKyAgICAgICAgICAgIGlmICh3YWl0LT5zaWduYWxlZCAhPSBXQUlUX0ZBSUxFRCkgYnJlYWs7CisgICAgICAgICAgICAvKiBSZWNvbXB1dGUgdGhlIHRpbWVyIHZhbHVlICovCisgICAgICAgICAgICBlbGFwc2VkID0gR2V0VGlja0NvdW50KCkgLSBzdGFydF90aWNrczsKKyAgICAgICAgICAgIGlmIChlbGFwc2VkID49IHRpbWVvdXQpIHdhaXQtPnNpZ25hbGVkID0gV0FJVF9USU1FT1VUOworICAgICAgICAgICAgZWxzZSB0aW1lb3V0IC09IGVsYXBzZWQ7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgd2hpbGUgKHdhaXQtPnNpZ25hbGVkID09IFdBSVRfRkFJTEVEKQorICAgICAgICB7CisgICAgICAgICAgICBzaWdzdXNwZW5kKCAmc2V0ICk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBHcmFiIHRoZSBzeXN0ZW0gbG9jayBhZ2FpbiAqLworCisgICAgd2hpbGUgKGNvdW50LS0pIFNZU1RFTV9MT0NLKCk7CisgICAgZHByaW50Zl93aW4zMiggc3RkZGViLCAiU1lOQzogd2FpdCBmaW5pc2hlZCAoJXAgJTA0eClcbiIsCisgICAgICAgICAgICAgICAgICAgVEhSRUFEX0N1cnJlbnQoKSwgVEhSRUFEX0N1cnJlbnQoKS0+dGViX3NlbCApOworCisgICAgLyogUmVtb3ZlIG91cnNlbHZlcyBmcm9tIHRoZSBsaXN0cyAqLworCisgICAgZm9yIChpID0gMCwgcHRyID0gd2FpdC0+b2JqczsgaSA8IHdhaXQtPmNvdW50OyBpKyssIHB0cisrKQorICAgICAgICBLMzJPQkpfT1BTKCAqcHRyICktPnJlbW92ZV93YWl0KCAqcHRyLCB0aHJlYWRfaWQgKTsKKworZG9uZToKKyAgICBTWVNURU1fVU5MT0NLKCk7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgU1lOQ19EdW1teVNpZ0hhbmRsZXIKKyAqCisgKiBEdW1teSBzaWduYWwgaGFuZGxlcgorICovCitzdGF0aWMgdm9pZCBTWU5DX0R1bW15U2lnSGFuZGxlcih2b2lkKQoreworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIFNZTkNfU2V0dXBTaWduYWxzCisgKgorICogU2V0dXAgc2lnbmFsIGhhbmRsZXJzIGZvciBhIG5ldyB0aHJlYWQuCisgKiBGSVhNRTogc2hvdWxkIG1lcmdlIHdpdGggU0lHTkFMX0luaXQuCisgKi8KK3ZvaWQgU1lOQ19TZXR1cFNpZ25hbHModm9pZCkKK3sKKyAgICBzaWdzZXRfdCBzZXQ7CisgICAgU0lHTkFMX1NldEhhbmRsZXIoIFNJR1VTUjEsIFNZTkNfRHVtbXlTaWdIYW5kbGVyLCAwICk7CisgICAgLyogRklYTUU6IGNvbmZsaWN0cyB3aXRoIHN5c3RlbSB0aW1lcnMgKi8KKyAgICBTSUdOQUxfU2V0SGFuZGxlciggU0lHQUxSTSwgU1lOQ19EdW1teVNpZ0hhbmRsZXIsIDAgKTsKKyAgICBzaWdlbXB0eXNldCggJnNldCApOworICAgIC8qIE1ha2Ugc3VyZSB0aGVzZSBhcmUgYmxvY2tlZCBieSBkZWZhdWx0ICovCisgICAgc2lnYWRkc2V0KCAmc2V0LCBTSUdVU1IxICk7CisgICAgc2lnYWRkc2V0KCAmc2V0LCBTSUdBTFJNICk7CisgICAgc2lncHJvY21hc2soIFNJR19CTE9DSyAsICZzZXQsIE5VTEwpOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIFNZTkNfV2FrZVVwCisgKi8KK3ZvaWQgU1lOQ19XYWtlVXAoIFRIUkVBRF9RVUVVRSAqd2FpdF9xdWV1ZSwgRFdPUkQgbWF4ICkKK3sKKyAgICBUSFJFQURfRU5UUlkgKmVudHJ5OworCisgICAgaWYgKCFtYXgpIG1heCA9IElORklOSVRFMzI7CisgICAgU1lTVEVNX0xPQ0soKTsKKyAgICBpZiAoISp3YWl0X3F1ZXVlKQorICAgIHsKKyAgICAgICAgU1lTVEVNX1VOTE9DSygpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGVudHJ5ID0gKCp3YWl0X3F1ZXVlKS0+bmV4dDsKKyAgICBmb3IgKDs7KQorICAgIHsKKyAgICAgICAgVEhEQiAqdGhkYiA9IGVudHJ5LT50aHJlYWQ7CisgICAgICAgIGlmIChTWU5DX0NoZWNrQ29uZGl0aW9uKCAmdGhkYi0+d2FpdF9zdHJ1Y3QsIFRIREJfVE9fVEhSRUFEX0lEKHRoZGIpICkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGRwcmludGZfd2luMzIoIHN0ZGRlYiwgIlNZTkM6IHdha2luZyB1cCAlMDR4XG4iLCB0aGRiLT50ZWJfc2VsICk7CisgICAgICAgICAgICBraWxsKCB0aGRiLT51bml4X3BpZCwgU0lHVVNSMSApOworICAgICAgICAgICAgaWYgKCEtLW1heCkgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGVudHJ5ID09ICp3YWl0X3F1ZXVlKSBicmVhazsKKyAgICAgICAgZW50cnkgPSBlbnRyeS0+bmV4dDsKKyAgICB9CisgICAgU1lTVEVNX1VOTE9DSygpOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIFdhaXRGb3JTaW5nbGVPYmplY3QgICAoS0VSTkVMMzIuNzIzKQorICovCitEV09SRCBXSU5BUEkgV2FpdEZvclNpbmdsZU9iamVjdCggSEFORExFMzIgaGFuZGxlLCBEV09SRCB0aW1lb3V0ICkKK3sKKyAgICByZXR1cm4gV2FpdEZvck11bHRpcGxlT2JqZWN0c0V4KCAxLCAmaGFuZGxlLCBGQUxTRSwgdGltZW91dCwgRkFMU0UgKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBXYWl0Rm9yU2luZ2xlT2JqZWN0RXggICAoS0VSTkVMMzIuNzI0KQorICovCitEV09SRCBXSU5BUEkgV2FpdEZvclNpbmdsZU9iamVjdEV4KCBIQU5ETEUzMiBoYW5kbGUsIERXT1JEIHRpbWVvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT09MMzIgYWxlcnRhYmxlICkKK3sKKyAgICByZXR1cm4gV2FpdEZvck11bHRpcGxlT2JqZWN0c0V4KCAxLCAmaGFuZGxlLCBGQUxTRSwgdGltZW91dCwgYWxlcnRhYmxlICk7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgV2FpdEZvck11bHRpcGxlT2JqZWN0cyAgIChLRVJORUwzMi43MjEpCisgKi8KK0RXT1JEIFdJTkFQSSBXYWl0Rm9yTXVsdGlwbGVPYmplY3RzKCBEV09SRCBjb3VudCwgY29uc3QgSEFORExFMzIgKmhhbmRsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQk9PTDMyIHdhaXRfYWxsLCBEV09SRCB0aW1lb3V0ICkKK3sKKyAgICByZXR1cm4gV2FpdEZvck11bHRpcGxlT2JqZWN0c0V4KGNvdW50LCBoYW5kbGVzLCB3YWl0X2FsbCwgdGltZW91dCwgRkFMU0UpOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIFdhaXRGb3JNdWx0aXBsZU9iamVjdHNFeCAgIChLRVJORUwzMi43MjIpCisgKi8KK0RXT1JEIFdJTkFQSSBXYWl0Rm9yTXVsdGlwbGVPYmplY3RzRXgoIERXT1JEIGNvdW50LCBjb25zdCBIQU5ETEUzMiAqaGFuZGxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJPT0wzMiB3YWl0X2FsbCwgRFdPUkQgdGltZW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJPT0wzMiBhbGVydGFibGUgKQoreworICAgIFdBSVRfU1RSVUNUICp3YWl0ID0gJlRIUkVBRF9DdXJyZW50KCktPndhaXRfc3RydWN0OworCisgICAgaWYgKGNvdW50ID4gTUFYSU1VTV9XQUlUX09CSkVDVFMpCisgICAgeworICAgICAgICBTZXRMYXN0RXJyb3IoIEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSICk7CisgICAgICAgIHJldHVybiBXQUlUX0ZBSUxFRDsKKyAgICB9CisKKyAgICBpZiAoYWxlcnRhYmxlKQorICAgICAgICBmcHJpbnRmKCBzdGRlcnIsCisgICAgICAgICAgICAgICAgICJXYWl0Rm9yTXVsdGlwbGVPYmplY3RFeDogYWxlcnRhYmxlIG5vdCBpbXBsZW1lbnRlZFxuIiApOworCisgICAgU1lTVEVNX0xPQ0soKTsKKyAgICBpZiAoIVNZTkNfQnVpbGRXYWl0U3RydWN0KCBjb3VudCwgaGFuZGxlcywgd2FpdF9hbGwsIHdhaXQgKSkKKyAgICAgICAgd2FpdC0+c2lnbmFsZWQgPSBXQUlUX0ZBSUxFRDsKKyAgICBlbHNlCisgICAgeworICAgICAgICAvKiBOb3cgd2FpdCBmb3IgaXQgKi8KKyAgICAgICAgU1lOQ19XYWl0Rm9yQ29uZGl0aW9uKCB3YWl0LCB0aW1lb3V0ICk7CisgICAgICAgIFNZTkNfRnJlZVdhaXRTdHJ1Y3QoIHdhaXQgKTsKKyAgICB9CisgICAgU1lTVEVNX1VOTE9DSygpOworICAgIHJldHVybiB3YWl0LT5zaWduYWxlZDsKK30KZGlmZiAtLWdpdCBhL3NjaGVkdWxlci90aHJlYWQuYyBiL3NjaGVkdWxlci90aHJlYWQuYwppbmRleCA5NzQwMDg2Li43Mzk1OWQwIDEwMDY0NAotLS0gYS9zY2hlZHVsZXIvdGhyZWFkLmMKKysrIGIvc2NoZWR1bGVyL3RocmVhZC5jCkBAIC02LDcgKzYsMTAgQEAKIAogI2luY2x1ZGUgPGFzc2VydC5oPgogI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CiAjaW5jbHVkZSAidGhyZWFkLmgiCisjaW5jbHVkZSAicHJvY2Vzcy5oIgogI2luY2x1ZGUgIndpbmVycm9yLmgiCiAjaW5jbHVkZSAiaGVhcC5oIgogI2luY2x1ZGUgInNlbGVjdG9ycy5oIgpAQCAtMTUsOCArMTgsNDAgQEAKICNpbmNsdWRlICJkZWJ1Zy5oIgogI2luY2x1ZGUgInN0ZGRlYnVnLmgiCiAKLVRIREIgKnBDdXJyZW50VGhyZWFkID0gTlVMTDsKLXN0YXRpYyBLMzJPQkpfTElTVCBUSFJFQURfTGlzdDsKKyNpZmRlZiBIQVZFX0NMT05FCisjIGlmZGVmIEhBVkVfU0NIRURfSAorIyAgaW5jbHVkZSA8c2NoZWQuaD4KKyMgZW5kaWYKKyMgaWZuZGVmIENMT05FX1ZNCisjICBkZWZpbmUgQ0xPTkVfVk0gICAgICAweDAwMDAwMTAwCisjICBkZWZpbmUgQ0xPTkVfRlMgICAgICAweDAwMDAwMjAwCisjICBkZWZpbmUgQ0xPTkVfRklMRVMgICAweDAwMDAwNDAwCisjICBkZWZpbmUgQ0xPTkVfU0lHSEFORCAweDAwMDAwODAwCisjICBkZWZpbmUgQ0xPTkVfUElEICAgICAweDAwMDAxMDAwCisvKiBJZiB3ZSBkaWRuJ3QgZ2V0IHRoZSBmbGFncywgd2UgcHJvYmFibHkgZGlkbid0IGdldCB0aGUgcHJvdG90eXBlIGVpdGhlciAqLworZXh0ZXJuIGludCBjbG9uZSggaW50ICgqZm4pKHZvaWQgKmFyZyksIHZvaWQgKnN0YWNrLCBpbnQgZmxhZ3MsIHZvaWQgKmFyZyApOworIyBlbmRpZiAgLyogQ0xPTkVfVk0gKi8KKyNlbmRpZiAgLyogSEFWRV9DTE9ORSAqLworCisjaWZuZGVmIF9faTM4Nl9fCitUSERCICpwQ3VycmVudFRocmVhZDsKKyNlbmRpZgorCitzdGF0aWMgQk9PTDMyIFRIUkVBRF9TaWduYWxlZCggSzMyT0JKICpvYmosIERXT1JEIHRocmVhZF9pZCApOworc3RhdGljIHZvaWQgVEhSRUFEX1NhdGlzZmllZCggSzMyT0JKICpvYmosIERXT1JEIHRocmVhZF9pZCApOworc3RhdGljIHZvaWQgVEhSRUFEX0FkZFdhaXQoIEszMk9CSiAqb2JqLCBEV09SRCB0aHJlYWRfaWQgKTsKK3N0YXRpYyB2b2lkIFRIUkVBRF9SZW1vdmVXYWl0KCBLMzJPQkogKm9iaiwgRFdPUkQgdGhyZWFkX2lkICk7CitzdGF0aWMgdm9pZCBUSFJFQURfRGVzdHJveSggSzMyT0JKICpvYmogKTsKKworY29uc3QgSzMyT0JKX09QUyBUSFJFQURfT3BzID0KK3sKKyAgICBUSFJFQURfU2lnbmFsZWQsICAgIC8qIHNpZ25hbGVkICovCisgICAgVEhSRUFEX1NhdGlzZmllZCwgICAvKiBzYXRpc2ZpZWQgKi8KKyAgICBUSFJFQURfQWRkV2FpdCwgICAgIC8qIGFkZF93YWl0ICovCisgICAgVEhSRUFEX1JlbW92ZVdhaXQsICAvKiByZW1vdmVfd2FpdCAqLworICAgIFRIUkVBRF9EZXN0cm95ICAgICAgLyogZGVzdHJveSAqLworfTsKKwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBUSFJFQURfR2V0UHRyCkBAIC0zOCw2ICs3MywyOCBAQAogfQogCiAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgTnRDdXJyZW50VGViICAgKE5URExMLjg5KQorICovCitURUIgKiBXSU5BUEkgTnRDdXJyZW50VGViKHZvaWQpCit7CisjaWZkZWYgX19pMzg2X18KKyAgICBURUIgKnRlYjsKKyAgICBXT1JEIGRzLCBmczsKKworICAgIC8qIENoZWNrIGlmIHdlIGhhdmUgYSBjdXJyZW50IHRocmVhZCAqLworICAgIEdFVF9EUyggZHMgKTsKKyAgICBHRVRfRlMoIGZzICk7CisgICAgaWYgKGZzID09IGRzKSByZXR1cm4gTlVMTDsgLyogRklYTUU6IHNob3VsZCBiZSBhbiBhc3NlcnQgKi8KKyAgICBfX2FzbV9fKCAibW92bCAlJWZzOigyNCksJTAiIDogIj1yIiAodGViKSApOworICAgIHJldHVybiB0ZWI7CisjZWxzZQorICAgIGlmICghcEN1cnJlbnRUaHJlYWQpIHJldHVybiBOVUxMOworICAgIHJldHVybiAmcEN1cnJlbnRUaHJlYWQtPnRlYjsKKyNlbmRpZiAgLyogX19pMzg2X18gKi8KK30KKworCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBUSFJFQURfQ3VycmVudAogICoKQEAgLTQ1LDkgKzEwMiw2MiBAQAogICovCiBUSERCICpUSFJFQURfQ3VycmVudCh2b2lkKQogewotICAgIC8qIEZJWE1FOiBzaG91bGQgcHJvYmFibHkgdXNlICVmcyByZWdpc3RlciBoZXJlICovCi0gICAgYXNzZXJ0KCBwQ3VycmVudFRocmVhZCApOwotICAgIHJldHVybiBwQ3VycmVudFRocmVhZDsKKyAgICBURUIgKnRlYiA9IE50Q3VycmVudFRlYigpOworICAgIGlmICghdGViKSByZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gKFRIREIgKikoKGNoYXIgKil0ZWIgLSAoaW50KSYoKFRIREIgKikwKS0+dGViKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBUSFJFQURfQWRkUXVldWUKKyAqCisgKiBBZGQgYSB0aHJlYWQgdG8gYSBxdWV1ZS4KKyAqLwordm9pZCBUSFJFQURfQWRkUXVldWUoIFRIUkVBRF9RVUVVRSAqcXVldWUsIFRIREIgKnRocmVhZCApCit7CisgICAgVEhSRUFEX0VOVFJZICplbnRyeSA9IEhlYXBBbGxvYyggU3lzdGVtSGVhcCwgSEVBUF9OT19TRVJJQUxJWkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKCplbnRyeSkgKTsKKyAgICBhc3NlcnQoZW50cnkpOworICAgIFNZU1RFTV9MT0NLKCk7CisgICAgZW50cnktPnRocmVhZCA9IHRocmVhZDsKKyAgICBpZiAoKnF1ZXVlKQorICAgIHsKKyAgICAgICAgZW50cnktPm5leHQgPSAoKnF1ZXVlKS0+bmV4dDsKKyAgICAgICAgKCpxdWV1ZSktPm5leHQgPSBlbnRyeTsKKyAgICB9CisgICAgZWxzZSBlbnRyeS0+bmV4dCA9IGVudHJ5OworICAgICpxdWV1ZSA9IGVudHJ5OworICAgIFNZU1RFTV9VTkxPQ0soKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgVEhSRUFEX1JlbW92ZVF1ZXVlCisgKgorICogUmVtb3ZlIGEgdGhyZWFkIGZyb20gYSBxdWV1ZS4KKyAqLwordm9pZCBUSFJFQURfUmVtb3ZlUXVldWUoIFRIUkVBRF9RVUVVRSAqcXVldWUsIFRIREIgKnRocmVhZCApCit7CisgICAgVEhSRUFEX0VOVFJZICplbnRyeSA9ICpxdWV1ZTsKKyAgICBTWVNURU1fTE9DSygpOworICAgIGlmIChlbnRyeS0+bmV4dCA9PSBlbnRyeSkgIC8qIE9ubHkgb25lIGVsZW1lbnQgaW4gdGhlIHF1ZXVlICovCisgICAgeworICAgICAgICBhc3NlcnQoIGVudHJ5LT50aHJlYWQgPT0gdGhyZWFkICk7CisgICAgICAgICpxdWV1ZSA9IE5VTEw7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIFRIUkVBRF9FTlRSWSAqbmV4dDsKKyAgICAgICAgd2hpbGUgKGVudHJ5LT5uZXh0LT50aHJlYWQgIT0gdGhyZWFkKQorICAgICAgICB7CisgICAgICAgICAgICBlbnRyeSA9IGVudHJ5LT5uZXh0OworICAgICAgICAgICAgYXNzZXJ0KCBlbnRyeSAhPSAqcXVldWUgKTsgIC8qIEhhdmUgd2UgY29tZSBhbGwgdGhlIHdheSBhcm91bmQ/ICovCisgICAgICAgIH0KKyAgICAgICAgaWYgKChuZXh0ID0gZW50cnktPm5leHQpID09ICpxdWV1ZSkgKnF1ZXVlID0gZW50cnk7CisgICAgICAgIGVudHJ5LT5uZXh0ID0gZW50cnktPm5leHQtPm5leHQ7CisgICAgICAgIGVudHJ5ID0gbmV4dDsgIC8qIFRoaXMgaXMgdGhlIG9uZSB3ZSB3YW50IHRvIGZyZWUgKi8KKyAgICB9CisgICAgSGVhcEZyZWUoIFN5c3RlbUhlYXAsIDAsIGVudHJ5ICk7CisgICAgU1lTVEVNX1VOTE9DSygpOwogfQogCiAKQEAgLTU1LDEwICsxNjUsMTEgQEAKICAqICAgICAgICAgICBUSFJFQURfQ3JlYXRlCiAgKi8KIFRIREIgKlRIUkVBRF9DcmVhdGUoIFBEQjMyICpwZGIsIERXT1JEIHN0YWNrX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICBMUFRIUkVBRF9TVEFSVF9ST1VUSU5FIHN0YXJ0X2FkZHIgKQorICAgICAgICAgICAgICAgICAgICAgTFBUSFJFQURfU1RBUlRfUk9VVElORSBzdGFydF9hZGRyLCBMUFZPSUQgcGFyYW0gKQogewogICAgIERXT1JEIG9sZF9wcm90OwogICAgIFdPUkQgY3MsIGRzOworCiAgICAgVEhEQiAqdGhkYiA9IEhlYXBBbGxvYyggU3lzdGVtSGVhcCwgSEVBUF9aRVJPX01FTU9SWSwgc2l6ZW9mKFRIREIpICk7CiAgICAgaWYgKCF0aGRiKSByZXR1cm4gTlVMTDsKICAgICB0aGRiLT5oZWFkZXIudHlwZSAgICAgPSBLMzJPQkpfVEhSRUFEOwpAQCAtNjksOCArMTgwLDExIEBACiAgICAgdGhkYi0+dGViLnN0YWNrX3NlbCAgID0gMDsgLyogRklYTUUgKi8KICAgICB0aGRiLT50ZWIuc2VsZiAgICAgICAgPSAmdGhkYi0+dGViOwogICAgIHRoZGItPnRlYi50bHNfcHRyICAgICA9IHRoZGItPnRsc19hcnJheTsKKyAgICB0aGRiLT53YWl0X2xpc3QgICAgICAgPSAmdGhkYi0+d2FpdF9zdHJ1Y3Q7CiAgICAgdGhkYi0+cHJvY2VzczIgICAgICAgID0gcGRiOwogICAgIHRoZGItPmV4aXRfY29kZSAgICAgICA9IDB4MTAzOyAvKiBTVElMTF9BQ1RJVkUgKi8KKyAgICB0aGRiLT5lbnRyeV9wb2ludCAgICAgPSBzdGFydF9hZGRyOworICAgIHRoZGItPmVudHJ5X2FyZyAgICAgICA9IHBhcmFtOwogCiAgICAgLyogQWxsb2NhdGUgdGhlIHN0YWNrICovCiAKQEAgLTkxLDYgKzIwNSwxMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUlVFLCBGQUxTRSApOwogICAgIGlmICghdGhkYi0+dGViX3NlbCkgZ290byBlcnJvcjsKIAorICAgIC8qIEFsbG9jYXRlIHRoZSBldmVudCAqLworCisgICAgaWYgKCEodGhkYi0+ZXZlbnQgPSBFVkVOVF9DcmVhdGUoIFRSVUUsIEZBTFNFICkpKSBnb3RvIGVycm9yOworCiAgICAgLyogSW5pdGlhbGl6ZSB0aGUgdGhyZWFkIGNvbnRleHQgKi8KIAogICAgIEdFVF9DUyhjcyk7CkBAIC0xMDQsMTQgKzIyMiwxMCBAQAogICAgIHRoZGItPmNvbnRleHQuU2VnRnMgICA9IHRoZGItPnRlYl9zZWw7CiAgICAgdGhkYi0+Y29udGV4dC5FaXAgICAgID0gKERXT1JEKXN0YXJ0X2FkZHI7CiAgICAgdGhkYi0+Y29udGV4dC5Fc3AgICAgID0gKERXT1JEKXRoZGItPnRlYi5zdGFja190b3A7Ci0KLSAgICAvKiBBZGQgdGhlIHRocmVhZCB0byB0aGUgbGlua2VkIGxpc3QgKi8KLQotICAgIEszMk9CSl9BZGRUYWlsKCAmVEhSRUFEX0xpc3QsICZ0aGRiLT5oZWFkZXIgKTsKLQogICAgIHJldHVybiB0aGRiOwogCiBlcnJvcjoKKyAgICBpZiAodGhkYi0+ZXZlbnQpIEszMk9CSl9EZWNDb3VudCggdGhkYi0+ZXZlbnQgKTsKICAgICBpZiAodGhkYi0+dGViX3NlbCkgU0VMRUNUT1JfRnJlZUJsb2NrKCB0aGRiLT50ZWJfc2VsLCAxICk7CiAgICAgaWYgKHRoZGItPnN0YWNrX2Jhc2UpIFZpcnR1YWxGcmVlKCB0aGRiLT5zdGFja19iYXNlLCAwLCBNRU1fUkVMRUFTRSApOwogICAgIEhlYXBGcmVlKCBTeXN0ZW1IZWFwLCAwLCB0aGRiICk7CkBAIC0xMjAsMTggKzIzNCw3OSBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIFRIUkVBRF9TdGFydAorICoKKyAqIFN0YXJ0dXAgcm91dGluZSBmb3IgYSBuZXcgdGhyZWFkLgorICovCitzdGF0aWMgdm9pZCBUSFJFQURfU3RhcnQoIFRIREIgKnRoZGIgKQoreworICAgIExQVEhSRUFEX1NUQVJUX1JPVVRJTkUgZnVuYyA9IChMUFRIUkVBRF9TVEFSVF9ST1VUSU5FKXRoZGItPmVudHJ5X3BvaW50OworICAgIHRoZGItPnVuaXhfcGlkID0gZ2V0cGlkKCk7CisgICAgU0VUX0ZTKCB0aGRiLT50ZWJfc2VsICk7CisgICAgRXhpdFRocmVhZCggZnVuYyggdGhkYi0+ZW50cnlfYXJnICkgKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBUSFJFQURfU2lnbmFsZWQKKyAqLworc3RhdGljIEJPT0wzMiBUSFJFQURfU2lnbmFsZWQoIEszMk9CSiAqb2JqLCBEV09SRCB0aHJlYWRfaWQgKQoreworICAgIFRIREIgKnRoZGIgPSAoVEhEQiAqKW9iajsKKyAgICBhc3NlcnQoIG9iai0+dHlwZSA9PSBLMzJPQkpfVEhSRUFEICk7CisgICAgcmV0dXJuIEszMk9CSl9PUFMoIHRoZGItPmV2ZW50ICktPnNpZ25hbGVkKCB0aGRiLT5ldmVudCwgdGhyZWFkX2lkICk7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgVEhSRUFEX1NhdGlzZmllZAorICoKKyAqIFdhaXQgb24gdGhpcyBvYmplY3QgaGFzIGJlZW4gc2F0aXNmaWVkLgorICovCitzdGF0aWMgdm9pZCBUSFJFQURfU2F0aXNmaWVkKCBLMzJPQkogKm9iaiwgRFdPUkQgdGhyZWFkX2lkICkKK3sKKyAgICBUSERCICp0aGRiID0gKFRIREIgKilvYmo7CisgICAgYXNzZXJ0KCBvYmotPnR5cGUgPT0gSzMyT0JKX1RIUkVBRCApOworICAgIHJldHVybiBLMzJPQkpfT1BTKCB0aGRiLT5ldmVudCApLT5zYXRpc2ZpZWQoIHRoZGItPmV2ZW50LCB0aHJlYWRfaWQgKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBUSFJFQURfQWRkV2FpdAorICoKKyAqIEFkZCB0aHJlYWQgdG8gb2JqZWN0IHdhaXQgcXVldWUuCisgKi8KK3N0YXRpYyB2b2lkIFRIUkVBRF9BZGRXYWl0KCBLMzJPQkogKm9iaiwgRFdPUkQgdGhyZWFkX2lkICkKK3sKKyAgICBUSERCICp0aGRiID0gKFRIREIgKilvYmo7CisgICAgYXNzZXJ0KCBvYmotPnR5cGUgPT0gSzMyT0JKX1RIUkVBRCApOworICAgIHJldHVybiBLMzJPQkpfT1BTKCB0aGRiLT5ldmVudCApLT5hZGRfd2FpdCggdGhkYi0+ZXZlbnQsIHRocmVhZF9pZCApOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIFRIUkVBRF9SZW1vdmVXYWl0CisgKgorICogUmVtb3ZlIHRocmVhZCBmcm9tIG9iamVjdCB3YWl0IHF1ZXVlLgorICovCitzdGF0aWMgdm9pZCBUSFJFQURfUmVtb3ZlV2FpdCggSzMyT0JKICpvYmosIERXT1JEIHRocmVhZF9pZCApCit7CisgICAgVEhEQiAqdGhkYiA9IChUSERCICopb2JqOworICAgIGFzc2VydCggb2JqLT50eXBlID09IEszMk9CSl9USFJFQUQgKTsKKyAgICByZXR1cm4gSzMyT0JKX09QUyggdGhkYi0+ZXZlbnQgKS0+cmVtb3ZlX3dhaXQoIHRoZGItPmV2ZW50LCB0aHJlYWRfaWQgKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBUSFJFQURfRGVzdHJveQogICovCi12b2lkIFRIUkVBRF9EZXN0cm95KCBLMzJPQkogKnB0ciApCitzdGF0aWMgdm9pZCBUSFJFQURfRGVzdHJveSggSzMyT0JKICpwdHIgKQogewogICAgIFRIREIgKnRoZGIgPSAoVEhEQiAqKXB0cjsKIAogICAgIGFzc2VydCggcHRyLT50eXBlID09IEszMk9CSl9USFJFQUQgKTsKICAgICBwdHItPnR5cGUgPSBLMzJPQkpfVU5LTk9XTjsKIAotICAgIC8qIE5vdGU6IHdoZW4gd2UgZ2V0IGhlcmUsIHRoZSB0aHJlYWQgaGFzIGFscmVhZHkgYmVlbiByZW1vdmVkICovCi0gICAgLyogZnJvbSB0aGUgdGhyZWFkIGxpc3QgKi8KLQogICAgIC8qIEZyZWUgdGhlIGFzc29jaWF0ZWQgbWVtb3J5ICovCiAKICNpZmRlZiBfX2kzODZfXwpAQCAtMTQ2LDYgKzMyMSw3IEBACiAgICAgICAgIH0KICAgICB9CiAjZW5kaWYKKyAgICBLMzJPQkpfRGVjQ291bnQoIHRoZGItPmV2ZW50ICk7CiAgICAgU0VMRUNUT1JfRnJlZUJsb2NrKCB0aGRiLT50ZWJfc2VsLCAxICk7CiAgICAgSGVhcEZyZWUoIFN5c3RlbUhlYXAsIDAsIHRoZGIgKTsKIApAQCAtMTUzLDU0ICszMjksNTcgQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBUSFJFQURfU3dpdGNoVGhyZWFkCi0gKgotICogUmV0dXJuIHRoZSB0aHJlYWQgd2Ugd2FudCB0byBzd2l0Y2ggdG8sIGFuZCBzd2l0Y2ggdGhlIGNvbnRleHRzLgotICovCi1USERCICpUSFJFQURfU3dpdGNoVGhyZWFkKCBDT05URVhUICpjb250ZXh0ICkKLXsKLSAgICBLMzJPQkogKmN1cjsKLSAgICBUSERCICpuZXh0OwotICAgIGlmICghcEN1cnJlbnRUaHJlYWQpIHJldHVybiBOVUxMOwotICAgIGN1ciA9IEszMk9CSl9SZW1vdmVIZWFkKCAmVEhSRUFEX0xpc3QgKTsKLSAgICBLMzJPQkpfQWRkVGFpbCggJlRIUkVBRF9MaXN0LCBjdXIgKTsKLSAgICBLMzJPQkpfRGVjQ291bnQoIGN1ciApOwotICAgIG5leHQgPSAoVEhEQiAqKVRIUkVBRF9MaXN0LmhlYWQ7Ci0gICAgaWYgKG5leHQgIT0gcEN1cnJlbnRUaHJlYWQpCi0gICAgewotICAgICAgICBwQ3VycmVudFRocmVhZC0+Y29udGV4dCA9ICpjb250ZXh0OwotICAgICAgICBwQ3VycmVudFRocmVhZCA9IG5leHQ7Ci0gICAgICAgICpjb250ZXh0ID0gcEN1cnJlbnRUaHJlYWQtPmNvbnRleHQ7Ci0gICAgfQotICAgIHJldHVybiBwQ3VycmVudFRocmVhZDsKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBDcmVhdGVUaHJlYWQgICAoS0VSTkVMMzIuNjMpCi0gKgotICogVGhlIG9ubHkgdGhpbmcgbWlzc2luZyBoZXJlIGlzIGFjdHVhbGx5IGdldHRpbmcgdGhlIHRocmVhZCB0byBydW4gOy0pCiAgKi8KIEhBTkRMRTMyIFdJTkFQSSBDcmVhdGVUaHJlYWQoIExQU0VDVVJJVFlfQVRUUklCVVRFUyBhdHRyaWJzLCBEV09SRCBzdGFjaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQVEhSRUFEX1NUQVJUX1JPVVRJTkUgc3RhcnQsIExQVk9JRCBwYXJhbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIGZsYWdzLCBMUERXT1JEIGlkICkKIHsKICAgICBIQU5ETEUzMiBoYW5kbGU7Ci0gICAgVEhEQiAqdGhyZWFkID0gVEhSRUFEX0NyZWF0ZSggcEN1cnJlbnRQcm9jZXNzLCBzdGFjaywgc3RhcnQgKTsKKyAgICBUSERCICp0aHJlYWQgPSBUSFJFQURfQ3JlYXRlKCBwQ3VycmVudFByb2Nlc3MsIHN0YWNrLCBzdGFydCwgcGFyYW0gKTsKICAgICBpZiAoIXRocmVhZCkgcmV0dXJuIElOVkFMSURfSEFORExFX1ZBTFVFMzI7CiAgICAgaGFuZGxlID0gUFJPQ0VTU19BbGxvY0hhbmRsZSggJnRocmVhZC0+aGVhZGVyLCAwICk7CiAgICAgaWYgKGhhbmRsZSA9PSBJTlZBTElEX0hBTkRMRV9WQUxVRTMyKQogICAgIHsKLSAgICAgICAgVEhSRUFEX0Rlc3Ryb3koICZ0aHJlYWQtPmhlYWRlciApOworICAgICAgICBLMzJPQkpfRGVjQ291bnQoICZ0aHJlYWQtPmhlYWRlciApOwogICAgICAgICByZXR1cm4gSU5WQUxJRF9IQU5ETEVfVkFMVUUzMjsKICAgICB9Ci0gICAgKmlkID0gKERXT1JEKXRocmVhZDsKKyNpZmRlZiBIQVZFX0NMT05FCisgICAgaWYgKGNsb25lKCAoaW50ICgqKSh2b2lkICopKVRIUkVBRF9TdGFydCwgdGhyZWFkLT50ZWIuc3RhY2tfdG9wLAorICAgICAgICAgICAgICAgQ0xPTkVfVk0gfCBDTE9ORV9GUyB8IENMT05FX0ZJTEVTIHwgU0lHQ0hMRCwgdGhyZWFkICkgPCAwKQorICAgIHsKKyAgICAgICAgSzMyT0JKX0RlY0NvdW50KCAmdGhyZWFkLT5oZWFkZXIgKTsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfSEFORExFX1ZBTFVFMzI7CisgICAgfQorI2Vsc2UKICAgICBmcHJpbnRmKCBzdGRlcnIsICJDcmVhdGVUaHJlYWQ6IHN0dWJcbiIgKTsKKyNlbmRpZiAgLyogX19saW51eF9fICovCisgICAgKmlkID0gVEhEQl9UT19USFJFQURfSUQoIHRocmVhZCApOwogICAgIHJldHVybiBoYW5kbGU7CiB9CiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgRXhpdFRocmVhZCAgIChLRVJORUwzMi4yMTUpCisgKi8KK3ZvaWQgV0lOQVBJIEV4aXRUaHJlYWQoIERXT1JEIGNvZGUgKQoreworICAgIFRIREIgKnRoZGIgPSBUSFJFQURfQ3VycmVudCgpOworICAgIExPTkcgY291bnQ7CisKKyAgICBTWVNURU1fTE9DSygpOworICAgIHRoZGItPmV4aXRfY29kZSA9IGNvZGU7CisgICAgRVZFTlRfU2V0KCB0aGRiLT5ldmVudCApOworICAgIC8qIEZJWE1FOiBzaG91bGQgZnJlZSB0aGUgc3RhY2sgc29tZWhvdyAqLworICAgIEszMk9CSl9EZWNDb3VudCggJnRoZGItPmhlYWRlciApOworICAgIC8qIENvbXBsZXRlbHkgdW5sb2NrIHRoZSBzeXN0ZW0gbG9jayBqdXN0IGluIGNhc2UgKi8KKyAgICBjb3VudCA9IFNZU1RFTV9MT0NLX0NPVU5UKCk7CisgICAgd2hpbGUgKGNvdW50LS0pIFNZU1RFTV9VTkxPQ0soKTsKKyAgICBfZXhpdCggMCApOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIEdldEN1cnJlbnRUaHJlYWQgICAoS0VSTkVMMzIuMjAwKQogICovCiBIQU5ETEUzMiBXSU5BUEkgR2V0Q3VycmVudFRocmVhZCh2b2lkKQpAQCAtMjExLDExICszOTAsMTAgQEAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgR2V0Q3VycmVudFRocmVhZElkICAgKEtFUk5FTDMyLjIwMSkKLSAqIFJldHVybnMgY3J5cHRlZCAoeG9yJ2VkKSBwb2ludGVyIHRvIFRIREIgaW4gV2luOTUuCiAgKi8KIERXT1JEIFdJTkFQSSBHZXRDdXJyZW50VGhyZWFkSWQodm9pZCkKIHsKLSAgICByZXR1cm4gKERXT1JEKVRIUkVBRF9DdXJyZW50KCk7CisgICAgcmV0dXJuIFRIREJfVE9fVEhSRUFEX0lEKCBUSFJFQURfQ3VycmVudCgpICk7CiB9CiAKIApAQCAtMjM0LDEwICs0MTIsOSBAQAogICovCiB2b2lkIFdJTkFQSSBTZXRMYXN0RXJyb3IoIERXT1JEIGVycm9yICkKIHsKLSAgICBUSERCICp0aHJlYWQ7Ci0gICAgaWYgKCFwQ3VycmVudFRocmVhZCkgcmV0dXJuOyAgLyogRklYTUUgKi8KLSAgICB0aHJlYWQgPSBUSFJFQURfQ3VycmVudCgpOwotICAgIHRocmVhZC0+bGFzdF9lcnJvciA9IGVycm9yOworICAgIFRIREIgKnRocmVhZCA9IFRIUkVBRF9DdXJyZW50KCk7CisgICAgLyogVGhpcyBvbmUgbXVzdCB3b3JrIGJlZm9yZSB3ZSBoYXZlIGEgdGhyZWFkIChGSVhNRSkgKi8KKyAgICBpZiAodGhyZWFkKSB0aHJlYWQtPmxhc3RfZXJyb3IgPSBlcnJvcjsKIH0KIAogCkBAIC0zNTQsMTUgKzUzMSw2IEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBOdEN1cnJlbnRUZWIgICAoTlRETEwuODkpCi0gKi8KLXZvaWQgV0lOQVBJIE50Q3VycmVudFRlYiggQ09OVEVYVCAqY29udGV4dCApCi17Ci0gICAgRUFYX3JlZyhjb250ZXh0KSA9IEdldFNlbGVjdG9yQmFzZSggRlNfcmVnKGNvbnRleHQpICk7Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBHZXRUaHJlYWRQcmlvcml0eSAgIChLRVJORUwzMi4yOTYpCiAgKi8KIElOVDMyIFdJTkFQSSBHZXRUaHJlYWRQcmlvcml0eShIQU5ETEUzMiBodGhyZWFkKQpAQCAtMzkzLDkgKzU2MSw5IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIFRlcm1pbmF0ZVRocmVhZCAgIChLRVJORUwzMikKICAqLwotQk9PTDMyIFdJTkFQSSBUZXJtaW5hdGVUaHJlYWQoRFdPUkQgdGhyZWFkaWQsRFdPUkQgZXhpdGNvZGUpCitCT09MMzIgV0lOQVBJIFRlcm1pbmF0ZVRocmVhZChIQU5ETEUzMiBoYW5kbGUsRFdPUkQgZXhpdGNvZGUpCiB7Ci0gICAgZnByaW50ZihzdGRuaW1wLCJUZXJtaW5hdGVUaHJlYWQoMHglMDhseCwlbGQpLCBTVFVCIVxuIix0aHJlYWRpZCxleGl0Y29kZSk7CisgICAgZnByaW50ZihzdGRuaW1wLCJUZXJtaW5hdGVUaHJlYWQoMHglMDh4LCVsZCksIFNUVUIhXG4iLGhhbmRsZSxleGl0Y29kZSk7CiAgICAgcmV0dXJuIFRSVUU7CiB9CiAKQEAgLTQxNSwxNyArNTgzLDE3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIFJlc3VtZVRocmVhZCAgIChLRVJORUwzMikKICAqLwotQk9PTDMyIFdJTkFQSSBSZXN1bWVUaHJlYWQoRFdPUkQgdGhyZWFkaWQpCitCT09MMzIgV0lOQVBJIFJlc3VtZVRocmVhZCggSEFORExFMzIgaGFuZGxlICkKIHsKLSAgICBmcHJpbnRmKHN0ZG5pbXAsIlJlc3VtZVRocmVhZCgweCUwOGx4KSwgU1RVQiFcbiIsdGhyZWFkaWQpOworICAgIGZwcmludGYoc3RkbmltcCwiUmVzdW1lVGhyZWFkKDB4JTA4eCksIFNUVUIhXG4iLGhhbmRsZSk7CiAgICAgcmV0dXJuIFRSVUU7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgU3VzcGVuZFRocmVhZCAgIChLRVJORUwzMikKICAqLwotQk9PTDMyIFdJTkFQSSBTdXNwZW5kVGhyZWFkKERXT1JEIHRocmVhZGlkKQorQk9PTDMyIFdJTkFQSSBTdXNwZW5kVGhyZWFkKCBIQU5ETEUzMiBoYW5kbGUgKQogewotICAgIGZwcmludGYoc3RkbmltcCwiU3VzcGVuZFRocmVhZCgweCUwOGx4KSwgU1RVQiFcbiIsdGhyZWFkaWQpOworICAgIGZwcmludGYoc3RkbmltcCwiU3VzcGVuZFRocmVhZCgweCUwOHgpLCBTVFVCIVxuIixoYW5kbGUpOwogICAgIHJldHVybiBUUlVFOwogfQpkaWZmIC0tZ2l0IGEvdG9vbHMvYnVpbGQuYyBiL3Rvb2xzL2J1aWxkLmMKaW5kZXggYzY5MmE0MS4uYWQ0ZGI3NCAxMDA2NDQKLS0tIGEvdG9vbHMvYnVpbGQuYworKysgYi90b29scy9idWlsZC5jCkBAIC0xMjQwLDcgKzEyNDAsNyBAQAogICAgIC8qIE91dHB1dCB0aGUgRExMIGRlc2NyaXB0b3IgKi8KIAogICAgIGZwcmludGYoIG91dGZpbGUsICJcdC50ZXh0XG4iICk7Ci0gICAgZnByaW50Ziggb3V0ZmlsZSwgIkRMTE5hbWU6XHQuYXNjaWkgXCIlc1xcMFwiXG4iLCBETExOYW1lICk7CisgICAgZnByaW50Ziggb3V0ZmlsZSwgIkRMTE5hbWU6XHQuc3RyaW5nIFwiJXNcXDBcIlxuIiwgRExMTmFtZSApOwogICAgIGZwcmludGYoIG91dGZpbGUsICJcdC5hbGlnbiA0XG4iICk7CiAgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0Lmdsb2JsICIgUFJFRklYICIlc19EZXNjcmlwdG9yXG4iLCBETExOYW1lICk7CiAgICAgZnByaW50Ziggb3V0ZmlsZSwgUFJFRklYICIlc19EZXNjcmlwdG9yOlxuIiwgRExMTmFtZSApOwpAQCAtMTQ1OSw5ICsxNDU5LDkgQEAKICAgICAgICAgICAgICBDT05URVhUT0ZGU0VUKFNlZ0NzKSAtIHNpemVvZihDT05URVhUKSApOwogICAgIGZwcmludGYoIG91dGZpbGUsICJcdHB1c2h3ICVkKCUlZWJ4KVxuIiwgIC8qIFB1c2ggbmV3IGlwICovCiAgICAgICAgICAgICAgQ09OVEVYVE9GRlNFVChFaXApIC0gc2l6ZW9mKENPTlRFWFQpICk7Ci0gICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0cHVzaHcgJWQoJSVlYngpXG4iLCAgLyogUHVzaCBuZXcgZHMgKi8KKyAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHRwdXNobCAlZCglJWVieClcbiIsICAvKiBQdXNoIG5ldyBkcyAqLwogICAgICAgICAgICAgIENPTlRFWFRPRkZTRVQoU2VnRHMpIC0gc2l6ZW9mKENPTlRFWFQpICk7Ci0gICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0cHVzaHcgJWQoJSVlYngpXG4iLCAgLyogUHVzaCBuZXcgZXMgKi8KKyAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHRwdXNobCAlZCglJWVieClcbiIsICAvKiBQdXNoIG5ldyBlcyAqLwogICAgICAgICAgICAgIENPTlRFWFRPRkZTRVQoU2VnRXMpIC0gc2l6ZW9mKENPTlRFWFQpICk7CiAgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0cHVzaGwgJWQoJSVlYngpXG4iLAogICAgICAgICAgICAgIENPTlRFWFRPRkZTRVQoRUZsYWdzKSAtIHNpemVvZihDT05URVhUKSApOwpAQCAtMTQ3MCw4ICsxNDcwLDggQEAKICAgICAgICAgICAgICBDT05URVhUT0ZGU0VUKEVheCkgLSBzaXplb2YoQ09OVEVYVCkgKTsKICAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHRtb3ZsICVkKCUlZWJ4KSwlJWVieFxuIiwKICAgICAgICAgICAgICBDT05URVhUT0ZGU0VUKEVieCkgLSBzaXplb2YoQ09OVEVYVCkgKTsKLSAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHRwb3B3ICUlZXNcbiIgKTsgIC8qIFNldCBlcyAqLwotICAgIGZwcmludGYoIG91dGZpbGUsICJcdHBvcHcgJSVkc1xuIiApOyAgLyogU2V0IGRzICovCisgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0cG9wbCAlJWVzXG4iICk7ICAvKiBTZXQgZXMgKi8KKyAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHRwb3BsICUlZHNcbiIgKTsgIC8qIFNldCBkcyAqLwogfQogCiAKQEAgLTE1NDcsOCArMTU0Nyw4IEBACiAgICAgLyogUmVzdG9yZSAzMi1iaXQgZHMgYW5kIGVzICovCiAKICAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHRwdXNobCAkMHglMDR4JTA0eFxuIiwgRGF0YV9TZWxlY3RvciwgRGF0YV9TZWxlY3RvciApOwotICAgIGZwcmludGYoIG91dGZpbGUsICJcdHBvcHcgJSVkc1xuIiApOwotICAgIGZwcmludGYoIG91dGZpbGUsICJcdHBvcHcgJSVlc1xuIiApOworICAgIGZwcmludGYoIG91dGZpbGUsICJcdC5ieXRlIDB4NjZcblx0cG9wbCAlJWRzXG4iICk7CisgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0LmJ5dGUgMHg2NlxuXHRwb3BsICUlZXNcbiIgKTsKIAogCiAgICAgLyogU2F2ZSB0aGUgMTYtYml0IHN0YWNrICovCkBAIC0xNTc3LDggKzE1NzcsOCBAQAogICAgIC8qIFN3aXRjaCB0byB0aGUgMzItYml0IHN0YWNrICovCiAKICAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHRtb3ZsICIgUFJFRklYICJDQUxMVE8xNl9TYXZlZDMyX2VzcCwlJWVicFxuIiApOwotICAgIGZwcmludGYoIG91dGZpbGUsICJcdHB1c2h3ICUlZHNcbiIgKTsKLSAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHRwb3B3ICUlc3NcbiIgKTsKKyAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHRwdXNobCAlJWRzXG4iICk7CisgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0cG9wbCAlJXNzXG4iICk7CiAgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0bGVhbCAtJWQoJSVlYnApLCUlZXNwXG4iLAogICAgICAgICAgICAgIHJlZ19mdW5jID8gc2l6ZW9mKENPTlRFWFQpIDogNCAqIHN0cmxlbihhcmdzKSApOwogICAgIGlmIChyZWdfZnVuYykgIC8qIFB1c2ggdGhlIGFkZHJlc3Mgb2YgdGhlIGNvbnRleHQgc3RydWN0ICovCkBAIC0xNjAzLDcgKzE2MDMsNyBAQAogCiAgICAgLyogQ2FsbCB0aGUgZW50cnkgcG9pbnQgKi8KIAotICAgIGZwcmludGYoIG91dGZpbGUsICJcdGNhbGwgJSVlYXhcbiIgKTsKKyAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHRjYWxsIColJWVheFxuIiApOwogCiAgICAgLyogUHJpbnQgdGhlIGRlYnVnIGluZm9ybWF0aW9uIGFmdGVyIHRoZSBjYWxsICovCiAKQEAgLTE2NzUsNyArMTY3NSw3IEBACiAgICAgICAgIGZwcmludGYoIG91dGZpbGUsICJcdGluY2wgJSVlc3BcbiIgKTsKICAgICAgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0cG9wbCAlJWVkeFxuIiApOyAgICAgIC8qIFJlbW92ZSBjcyBhbmQgZHMgKi8KICAgICAgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0bW92dyAlJWR4LCUlZHNcbiIgKTsgIC8qIGFuZCByZXN0b3JlIGRzICovCi0gICAgICAgIGZwcmludGYoIG91dGZpbGUsICJcdHBvcHcgJSVlc1xuIiApOyAgICAgICAvKiBSZXN0b3JlIGVzICovCisgICAgICAgIGZwcmludGYoIG91dGZpbGUsICJcdC5ieXRlIDB4NjZcblx0cG9wbCAlJWVzXG4iICk7ICAgICAgIC8qIFJlc3RvcmUgZXMgKi8KIAogICAgICAgICBpZiAoc2hvcnRfcmV0KSBmcHJpbnRmKCBvdXRmaWxlLCAiXHRwb3BsICUlZWR4XG4iICk7ICAvKiBSZXN0b3JlIGVkeCAqLwogICAgICAgICBlbHNlCkBAIC0xNzU3LDggKzE3NTcsNyBAQAogCiAgICAgLyogQ2FsbCB0aGUgYWN0dWFsIENhbGxUbzE2IHJvdXRpbmUgKHNpbXVsYXRlIGEgbGNhbGwpICovCiAKLSAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHRwdXNodyAkMFxuIiApOwotICAgIGZwcmludGYoIG91dGZpbGUsICJcdHB1c2h3ICUlY3NcbiIgKTsKKyAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHRwdXNobCAlJWNzXG4iICk7CiAgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0Y2FsbCBkb19jYWxsdG8xNl8lc1xuIiwgcHJvZmlsZSApOwogCiAgICAgLyogRXhpdCBjb2RlICovCkBAIC0xODUwLDEwICsxODQ5LDEwIEBACiAKICAgICAgICAgLyogR2V0IHRoZSAxNi1iaXQgZHMgKi8KIAotICAgICAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHRwdXNodyAlZCglJWVieClcbiIsIENPTlRFWFRPRkZTRVQoU2VnRHMpICk7CisgICAgICAgIGZwcmludGYoIG91dGZpbGUsICJcdHB1c2hsICVkKCUlZWJ4KVxuIiwgQ09OVEVYVE9GRlNFVChTZWdEcykgKTsKICAgICAgICAgLyogR2V0IGVieCBmcm9tIHRoZSAzMi1iaXQgc3RhY2sgKi8KICAgICAgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0bW92bCAlZCglJWVieCksJSVlYnhcbiIsIENPTlRFWFRPRkZTRVQoRWJ4KSApOwotICAgICAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHRwb3B3ICUlZHNcbiIgKTsKKyAgICAgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0cG9wbCAlJWRzXG4iICk7CiAgICAgfQogICAgIGVsc2UgIC8qIG5vdCBhIHJlZ2lzdGVyIGZ1bmN0aW9uICovCiAgICAgewpAQCAtMjA0Niw3ICsyMDQ1LDcgQEAKICAgICAvKiBUcmFuc2ZlciB0aGUgYXJndW1lbnQgYW5kIGNhbGwgdGhlIGZ1bmN0aW9uICovCiAKICAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHRwdXNobCAxMiglJWVicClcbiIgKTsKLSAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHRjYWxsIDgoJSVlYnApXG4iICk7CisgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0Y2FsbCAqOCglJWVicClcbiIgKTsKIAogICAgIC8qIFJlc3RvcmUgcmVnaXN0ZXJzIGFuZCByZXR1cm4gKi8KIApAQCAtMjA4OCwxMSArMjA4NywxMSBAQAogICAgIC8qIEJ1aWxkIHRoZSBjb250ZXh0IHN0cnVjdHVyZSAqLwogCiAgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0cHVzaHcgJDBcbiIgKTsKLSAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHRwdXNodyAlJXNzXG4iICk7CisgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0LmJ5dGUgMHg2NlxuXHRwdXNobCAlJXNzXG4iICk7CiAgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0cHVzaGwgJSVlYXhcbiIgKTsgIC8qICVlc3AgcGxhY2UgaG9sZGVyICovCiAgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0cHVzaGZsXG4iICk7CiAgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0cHVzaHcgJDBcbiIgKTsKLSAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHRwdXNodyAlJWNzXG4iICk7CisgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0LmJ5dGUgMHg2NlxuXHRwdXNobCAlJWNzXG4iICk7CiAgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0cHVzaGwgMjAoJSVlc3ApXG4iICk7ICAvKiAlZWlwIGF0IHRpbWUgb2YgY2FsbCAqLwogICAgIGZwcmludGYoIG91dGZpbGUsICJcdHB1c2hsICUlZWJwXG4iICk7CiAKQEAgLTIyMTgsNyArMjIxNyw3IEBACiAgICAgICAgIGZvciAoaSA9IDI7IGkgPCBhcmdjOyBpKyspCiAgICAgICAgIHsKICAgICAgICAgICAgIGZwcmludGYoIG91dGZpbGUsICJQcm9maWxlXyVzOlxuIiwgYXJndltpXSApOwotICAgICAgICAgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0LmFzY2lpIFwiJXNcXDBcIlxuIiwgYXJndltpXSArIDUgKTsKKyAgICAgICAgICAgIGZwcmludGYoIG91dGZpbGUsICJcdC5zdHJpbmcgXCIlc1xcMFwiXG4iLCBhcmd2W2ldICsgNSApOwogICAgICAgICB9CiAgICAgfQogCmRpZmYgLS1naXQgYS90b29scy9mbnQyYmRmLmMgYi90b29scy9mbnQyYmRmLmMKaW5kZXggZDk5NGE5OS4uODA1MzdiZSAxMDA2NDQKLS0tIGEvdG9vbHMvZm50MmJkZi5jCisrKyBiL3Rvb2xzL2ZudDJiZGYuYwpAQCAtMTkxLDcgKzE5MSw4IEBACiAgICAgICByZXR1cm4gRVJST1JfRklMRTsKICAgICB9CiAKLSAgICBkdW1wX2JkZl9oZHIoZnAsIGNwZV9mb250X3N0cnVjdCwgZmlsZV9idWZmZXIpOworICAgIGljID0gZHVtcF9iZGZfaGRyKGZwLCBjcGVfZm9udF9zdHJ1Y3QsIGZpbGVfYnVmZmVyKTsKKyAgICBpZiAoaWMpIHJldHVybiAoaWMpOwogCiAgICAgLyogTk9XLCBjb252ZXJ0IGFsbCBjaGFycyB0byBVTklYIChsdG9uKSBub3RhdGlvbi4uLiAqLwogCkBAIC01NjMsNDcgKzU2NCw2NiBAQAogCQkgICAgaWYoICEobHBmb250ID0gKHVuc2lnbmVkIGNoYXIqKSByZWFsbG9jKCBscGZvbnQsIGxlbmd0aCApKSApCiAJCSAgICB7CiAJCQlmcHJpbnRmKHN0ZGVyciwgZXJyb3JNZW1vcnkgKTsKLQkJCWZyZWUobHBkYXRhKTsKLQkJCXJldHVybiAtMTsKKwkJCWV4aXQoMSk7CiAJCSAgICB9CiAKIAkJICAgIGxzZWVrKCBmZCwgb2Zmc2V0LCBTRUVLX1NFVCApOwogCQkgICAgaWYoIHJlYWQoZmQsIGxwZm9udCwgbGVuZ3RoKSAhPSBsZW5ndGggKQogCQkgICAgewogCQkJZnByaW50ZihzdGRlcnIsIGVycm9yRExMUmVhZCApOwotCQkJZnJlZShscGRhdGEpOyBmcmVlKGxwZm9udCk7Ci0JCQlyZXR1cm4gLTE7CisJCQlleGl0KDEpOwogCQkgICAgfQogCiAJCSAgICBpZiggKGkgPSBwYXJzZV9mbnRfZGF0YSggbHBmb250LCBsZW5ndGggKSkgKQorCQkgICAgewogCQkJZnByaW50ZihzdGRlcnIsICIlcyVkXG4iLCBlcnJvckZvbnREYXRhLCBpICk7CisJCQlleGl0KDEpOworCQkgICAgfQogCQkgfQogCQkgZnJlZShscGZvbnQpOyBmcmVlKGxwZGF0YSk7Ci0JCSByZXR1cm4gMDsKKwkJIGV4aXQoMCk7CiAJICAgICAgIH0KLQkgICAgICAgZWxzZSBmcHJpbnRmKHN0ZGVyciwgZXJyb3JFbXB0eSApOworCSAgICAgICBlbHNlCisJICAgICAgIHsKKwkJIGZwcmludGYoc3RkZXJyLCBlcnJvckVtcHR5ICk7CisJCSBleGl0KDEpOworCSAgICAgICB9CiAJICAgICAgIGZyZWUoIGxwZGF0YSApOwogCSAgICAgfQotCSAgICAgZWxzZSBmcHJpbnRmKHN0ZGVyciwgZXJyb3JETExSZWFkKTsKKwkgICAgIGVsc2UKKwkgICAgIHsKKwkgICAgICAgZnByaW50ZihzdGRlcnIsIGVycm9yRExMUmVhZCk7CisJICAgICAgIGV4aXQoMSk7CisJICAgICB9CiAJICAgICBicmVhazsKIAogCWNhc2UgRklMRV9GTlQ6CiAJICAgICBpZiggbHBkYXRhICkKIAkgICAgIHsKIAkgICAgICAgaWYoIChpID0gcGFyc2VfZm50X2RhdGEoIGxwZGF0YSwgZmlsZV9zdGF0LnN0X3NpemUgKSkgKQorCSAgICAgICB7CiAJCSAgIGZwcmludGYoc3RkZXJyLCAiJXMlZFxuIiwgZXJyb3JGb250RGF0YSwgaSApOwotCisJCSAgIGV4aXQoMSk7CisJICAgICAgIH0KIAkgICAgICAgZnJlZSggbHBkYXRhICk7CiAJICAgICB9Ci0JICAgICBlbHNlIGZwcmludGYoc3RkZXJyLCBlcnJvckZOVFJlYWQpOworCSAgICAgZWxzZQorCSAgICAgeworCSAgICAgICBmcHJpbnRmKHN0ZGVyciwgZXJyb3JGTlRSZWFkKTsKKwkgICAgICAgZXhpdCgxKTsKKwkgICAgIH0KIAkgICAgIGJyZWFrOwogCiAJY2FzZSBGSUxFX0VSUk9SOgogCSAgICAgZnByaW50ZihzdGRlcnIsIGVycm9yRmlsZSApOwotIAorCSAgICAgZXhpdCgxKTsKICAgICB9CiAgICAgY2xvc2UoZmQpOworICAgIGV4aXQoMCk7CiAgIH0KLSAgZWxzZSBmcHJpbnRmKHN0ZGVyciwgZXJyb3JPcGVuRmlsZSApOwotICByZXR1cm4gLTE7CisgIGVsc2UKKyAgeworICAgIGZwcmludGYoc3RkZXJyLCBlcnJvck9wZW5GaWxlICk7CisgICAgZXhpdCgxKTsKKyAgfQogfQpkaWZmIC0tZ2l0IGEvd2luMzIvTWFrZWZpbGUuaW4gYi93aW4zMi9NYWtlZmlsZS5pbgppbmRleCA3YzY4M2UxLi5iOWFjZGI5IDEwMDY0NAotLS0gYS93aW4zMi9NYWtlZmlsZS5pbgorKysgYi93aW4zMi9NYWtlZmlsZS5pbgpAQCAtMTQsNyArMTQsNiBAQAogCWV4Y2VwdC5jIFwKIAlmaWxlLmMgXAogCWluaXQuYyBcCi0JazMyb2JqLmMgXAogCWtlcm5lbDMyLmMgXAogCW5ld2Zucy5jIFwKIAlvcmRpbmFscy5jIFwKZGlmZiAtLWdpdCBhL3dpbjMyL2ZpbGUuYyBiL3dpbjMyL2ZpbGUuYwppbmRleCBhMGQ5YWI5Li5mNjM0ZGNlIDEwMDY0NAotLS0gYS93aW4zMi9maWxlLmMKKysrIGIvd2luMzIvZmlsZS5jCkBAIC0xOSw3ICsxOSw2IEBACiAjaW5jbHVkZSAid2luZXJyb3IuaCIKICNpbmNsdWRlICJmaWxlLmgiCiAjaW5jbHVkZSAiaGVhcC5oIgotI2luY2x1ZGUgImhhbmRsZTMyLmgiCiAjaW5jbHVkZSAic3RkZGVidWcuaCIKICNkZWZpbmUgREVCVUdfV0lOMzIKICNpbmNsdWRlICJkZWJ1Zy5oIgpkaWZmIC0tZ2l0IGEvd2luMzIvaW5pdC5jIGIvd2luMzIvaW5pdC5jCmluZGV4IDBlMTlhMWUuLjUwYTQ0Y2QgMTAwNjQ0Ci0tLSBhL3dpbjMyL2luaXQuYworKysgYi93aW4zMi9pbml0LmMKQEAgLTEwLDcgKzEwLDYgQEAKICNpbmNsdWRlIDxzdGRsaWIuaD4KICNpbmNsdWRlICJ3aW5kb3dzLmgiCiAjaW5jbHVkZSAid2luZXJyb3IuaCIKLSNpbmNsdWRlICJoYW5kbGUzMi5oIgogI2luY2x1ZGUgImV4Y2VwdC5oIgogI2luY2x1ZGUgImhlYXAuaCIKICNpbmNsdWRlICJ0YXNrLmgiCmRpZmYgLS1naXQgYS93aW4zMi9rMzJvYmouYyBiL3dpbjMyL2szMm9iai5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZWIxYjhjLi4wMDAwMDAwCi0tLSBhL3dpbjMyL2szMm9iai5jCisrKyAvZGV2L251bGwKQEAgLTEsMjI2ICswLDAgQEAKLS8qCi0gKiBLRVJORUwzMiBvYmplY3RzCi0gKgotICogQ29weXJpZ2h0IDE5OTYgQWxleGFuZHJlIEp1bGxpYXJkCi0gKi8KLQotI2luY2x1ZGUgPGFzc2VydC5oPgotI2luY2x1ZGUgIndpbmVycm9yLmgiCi0jaW5jbHVkZSAiaGFuZGxlMzIuaCIKLSNpbmNsdWRlICJoZWFwLmgiCi0jaW5jbHVkZSAiZmlsZS5oIgotI2luY2x1ZGUgInByb2Nlc3MuaCIKLSNpbmNsdWRlICJ0aHJlYWQuaCIKLQotdHlwZWRlZiB2b2lkICgqZGVzdHJveV9vYmplY3QpKEszMk9CSiAqKTsKLQotZXh0ZXJuIHZvaWQgVklSVFVBTF9EZXN0cm95TWFwcGluZyggSzMyT0JKICpvYmogKTsKLQotc3RhdGljIGNvbnN0IGRlc3Ryb3lfb2JqZWN0IEszMk9CSl9EZXN0cm95W0szMk9CSl9OQk9CSkVDVFNdID0KLXsKLSAgICBOVUxMLAotICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgLyogSzMyT0JKX1NFTUFQSE9SRSAqLwotICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgLyogSzMyT0JKX0VWRU5UICovCi0gICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAvKiBLMzJPQkpfTVVURVggKi8KLSAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgIC8qIEszMk9CSl9DUklUSUNBTF9TRUNUSU9OICovCi0gICAgUFJPQ0VTU19EZXN0cm95LCAgICAgICAgICAvKiBLMzJPQkpfUFJPQ0VTUyAqLwotICAgIFRIUkVBRF9EZXN0cm95LCAgICAgICAgICAgLyogSzMyT0JKX1RIUkVBRCAqLwotICAgIEZJTEVfRGVzdHJveSwgICAgICAgICAgICAgLyogSzMyT0JKX0ZJTEUgKi8KLSAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgIC8qIEszMk9CSl9DSEFOR0UgKi8KLSAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgIC8qIEszMk9CSl9DT05TT0xFICovCi0gICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAvKiBLMzJPQkpfU0NSRUVOX0JVRkZFUiAqLwotICAgIFZJUlRVQUxfRGVzdHJveU1hcHBpbmcsICAgLyogSzMyT0JKX01FTV9NQVBQRURfRklMRSAqLwotICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgLyogSzMyT0JKX1NFUklBTCAqLwotICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgLyogSzMyT0JKX0RFVklDRV9JT0NUTCAqLwotICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgLyogSzMyT0JKX1BJUEUgKi8KLSAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgIC8qIEszMk9CSl9NQUlMU0xPVCAqLwotICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgLyogSzMyT0JKX1RPT0xIRUxQX1NOQVBTSE9UICovCi0gICAgTlVMTCAgICAgICAgICAgICAgICAgICAgICAvKiBLMzJPQkpfU09DS0VUICovCi19OwotCi10eXBlZGVmIHN0cnVjdCBfTkUKLXsKLSAgICBzdHJ1Y3QgX05FICpuZXh0OwotICAgIEszMk9CSiAgICAgKm9iajsKLSAgICBVSU5UMzIgICAgICBsZW47Ci0gICAgY2hhciAgICAgICAgbmFtZVsxXTsKLX0gTkFNRV9FTlRSWTsKLQotc3RhdGljIE5BTUVfRU5UUlkgKkszMk9CSl9GaXJzdEVudHJ5ID0gTlVMTDsKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBLMzJPQkpfSW5jQ291bnQKLSAqLwotdm9pZCBLMzJPQkpfSW5jQ291bnQoIEszMk9CSiAqcHRyICkKLXsKLSAgICAvKiBGSVhNRTogbm90IGF0b21pYyAqLwotICAgIGFzc2VydCggcHRyLT50eXBlICYmICgodW5zaWduZWQpcHRyLT50eXBlIDwgSzMyT0JKX05CT0JKRUNUUykgKTsKLSAgICBwdHItPnJlZmNvdW50Kys7Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgSzMyT0JKX0RlY0NvdW50Ci0gKi8KLXZvaWQgSzMyT0JKX0RlY0NvdW50KCBLMzJPQkogKnB0ciApCi17Ci0gICAgTkFNRV9FTlRSWSAqKnBwdHI7Ci0KLSAgICAvKiBGSVhNRTogbm90IGF0b21pYyAqLwotICAgIGFzc2VydCggcHRyLT50eXBlICYmICgodW5zaWduZWQpcHRyLT50eXBlIDwgSzMyT0JKX05CT0JKRUNUUykgKTsKLSAgICBhc3NlcnQoIHB0ci0+cmVmY291bnQgKTsKLSAgICBpZiAoLS1wdHItPnJlZmNvdW50KSByZXR1cm47Ci0KLSAgICAvKiBDaGVjayBpZiB0aGUgb2JqZWN0IGhhcyBhIG5hbWUgZW50cnkgYW5kIGZyZWUgaXQgKi8KLQotICAgIHBwdHIgPSAmSzMyT0JKX0ZpcnN0RW50cnk7Ci0gICAgd2hpbGUgKCpwcHRyICYmICgoKnBwdHIpLT5vYmogIT0gcHRyKSkgcHB0ciA9ICYoKnBwdHIpLT5uZXh0OwotICAgIGlmICgqcHB0cikKLSAgICB7Ci0gICAgICAgIE5BTUVfRU5UUlkgKmVudHJ5ID0gKnBwdHI7Ci0gICAgICAgICpwcHRyID0gZW50cnktPm5leHQ7Ci0gICAgICAgIEhlYXBGcmVlKCBTeXN0ZW1IZWFwLCAwLCBlbnRyeSApOwotICAgIH0KLQotICAgIC8qIEZyZWUgdGhlIG9iamVjdCAqLwotCi0gICAgaWYgKEszMk9CSl9EZXN0cm95W3B0ci0+dHlwZV0pIEszMk9CSl9EZXN0cm95W3B0ci0+dHlwZV0oIHB0ciApOwotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIEszMk9CSl9BZGRIZWFkCi0gKgotICogQWRkIGFuIG9iamVjdCBhdCB0aGUgaGVhZCBvZiB0aGUgbGlzdCBhbmQgaW5jcmVtZW50IGl0cyByZWYgY291bnQuCi0gKi8KLXZvaWQgSzMyT0JKX0FkZEhlYWQoIEszMk9CSl9MSVNUICpsaXN0LCBLMzJPQkogKnB0ciApCi17Ci0gICAgSzMyT0JKX0VOVFJZICplbnRyeSA9IEhlYXBBbGxvYyggU3lzdGVtSGVhcCwgMCwgc2l6ZW9mKCplbnRyeSkgKTsKLSAgICBhc3NlcnQoZW50cnkpOwotICAgIEszMk9CSl9JbmNDb3VudCggcHRyICk7Ci0gICAgZW50cnktPm9iaiA9IHB0cjsKLSAgICBpZiAoKGVudHJ5LT5uZXh0ID0gbGlzdC0+aGVhZCkgIT0gTlVMTCkgZW50cnktPm5leHQtPnByZXYgPSBlbnRyeTsKLSAgICBlbHNlIGxpc3QtPnRhaWwgPSBlbnRyeTsKLSAgICBlbnRyeS0+cHJldiA9IE5VTEw7Ci0gICAgbGlzdC0+aGVhZCA9IGVudHJ5OwotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIEszMk9CSl9BZGRUYWlsCi0gKgotICogQWRkIGFuIG9iamVjdCBhdCB0aGUgdGFpbCBvZiB0aGUgbGlzdCBhbmQgaW5jcmVtZW50IGl0cyByZWYgY291bnQuCi0gKi8KLXZvaWQgSzMyT0JKX0FkZFRhaWwoIEszMk9CSl9MSVNUICpsaXN0LCBLMzJPQkogKnB0ciApCi17Ci0gICAgSzMyT0JKX0VOVFJZICplbnRyeSA9IEhlYXBBbGxvYyggU3lzdGVtSGVhcCwgMCwgc2l6ZW9mKCplbnRyeSkgKTsKLSAgICBhc3NlcnQoZW50cnkpOwotICAgIEszMk9CSl9JbmNDb3VudCggcHRyICk7Ci0gICAgZW50cnktPm9iaiA9IHB0cjsKLSAgICBpZiAoKGVudHJ5LT5wcmV2ID0gbGlzdC0+dGFpbCkgIT0gTlVMTCkgZW50cnktPnByZXYtPm5leHQgPSBlbnRyeTsKLSAgICBlbHNlIGxpc3QtPmhlYWQgPSBlbnRyeTsKLSAgICBlbnRyeS0+bmV4dCA9IE5VTEw7Ci0gICAgbGlzdC0+dGFpbCA9IGVudHJ5OwotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIEszMk9CSl9SZW1vdmUKLSAqCi0gKiBSZW1vdmUgYW4gb2JqZWN0IGZyb20gdGhlIGxpc3QgYW5kIGRlY3JlbWVudCBpdHMgcmVmIGNvdW50LgotICovCi12b2lkIEszMk9CSl9SZW1vdmUoIEszMk9CSl9MSVNUICpsaXN0LCBLMzJPQkogKnB0ciApCi17Ci0gICAgSzMyT0JKX0VOVFJZICplbnRyeSA9IGxpc3QtPmhlYWQ7Ci0gICAgd2hpbGUgKChlbnRyeSAmJiAoZW50cnktPm9iaiAhPSBwdHIpKSkgZW50cnkgPSBlbnRyeS0+bmV4dDsKLSAgICBhc3NlcnQoZW50cnkpOwotICAgIGlmIChlbnRyeS0+bmV4dCkgZW50cnktPm5leHQtPnByZXYgPSBlbnRyeS0+cHJldjsKLSAgICBlbHNlIGxpc3QtPnRhaWwgPSBlbnRyeS0+cHJldjsKLSAgICBpZiAoZW50cnktPnByZXYpIGVudHJ5LT5wcmV2LT5uZXh0ID0gZW50cnktPm5leHQ7Ci0gICAgZWxzZSBsaXN0LT5oZWFkID0gZW50cnktPm5leHQ7Ci0gICAgSGVhcEZyZWUoIFN5c3RlbUhlYXAsIDAsIGVudHJ5ICk7Ci0gICAgSzMyT0JKX0RlY0NvdW50KCBwdHIgKTsKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBLMzJPQkpfUmVtb3ZlSGVhZAotICoKLSAqIFJlbW92ZSB0aGUgaGVhZCBvZiB0aGUgbGlzdDsgaXRzIHJlZiBjb3VudCBpcyBOT1QgZGVjcmVtZW50ZWQuCi0gKi8KLUszMk9CSiAqSzMyT0JKX1JlbW92ZUhlYWQoIEszMk9CSl9MSVNUICpsaXN0ICkKLXsKLSAgICBLMzJPQkogKnB0cjsKLSAgICBLMzJPQkpfRU5UUlkgKmVudHJ5ID0gbGlzdC0+aGVhZDsKLSAgICBhc3NlcnQoZW50cnkpOwotICAgIGFzc2VydCghZW50cnktPnByZXYpOwotICAgIGlmICgobGlzdC0+aGVhZCA9IGVudHJ5LT5uZXh0KSAhPSBOVUxMKSBlbnRyeS0+bmV4dC0+cHJldiA9IE5VTEw7Ci0gICAgZWxzZSBsaXN0LT50YWlsID0gTlVMTDsKLSAgICBwdHIgPSBlbnRyeS0+b2JqOwotICAgIEhlYXBGcmVlKCBTeXN0ZW1IZWFwLCAwLCBlbnRyeSApOwotICAgIHJldHVybiBwdHI7Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgSzMyT0JKX0FkZE5hbWUKLSAqCi0gKiBBZGQgYSBuYW1lIGVudHJ5IGZvciBhbiBvYmplY3QuIFdlIGRvbid0IGNoZWNrIGZvciBkdXBsaWNhdGVzIGhlcmUuCi0gKiBGSVhNRTogc2hvdWxkIHVzZSBzb21lIHNvcnQgb2YgaGFzaGluZy4KLSAqLwotQk9PTDMyIEszMk9CSl9BZGROYW1lKCBLMzJPQkogKm9iaiwgTFBDU1RSIG5hbWUgKQotewotICAgIE5BTUVfRU5UUlkgKmVudHJ5OwotICAgIFVJTlQzMiBsZW4gPSBzdHJsZW4oIG5hbWUgKTsKLQotICAgIGlmICghKGVudHJ5ID0gSGVhcEFsbG9jKCBTeXN0ZW1IZWFwLCAwLCBzaXplb2YoTkFNRV9FTlRSWSkgKyBsZW4gKSkpCi0gICAgewotICAgICAgICBTZXRMYXN0RXJyb3IoIEVSUk9SX09VVE9GTUVNT1JZICk7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgZW50cnktPm5leHQgPSBLMzJPQkpfRmlyc3RFbnRyeTsKLSAgICBlbnRyeS0+b2JqID0gb2JqOwotICAgIGxzdHJjcHkzMkEoIGVudHJ5LT5uYW1lLCBuYW1lICk7Ci0gICAgSzMyT0JKX0ZpcnN0RW50cnkgPSBlbnRyeTsKLSAgICByZXR1cm4gVFJVRTsKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBLMzJPQkpfRmluZE5hbWUKLSAqCi0gKiBGaW5kIHRoZSBvYmplY3QgcmVmZXJlbmNlZCBieSBhIGdpdmVuIG5hbWUuCi0gKiBUaGUgcmVmZXJlbmNlIGNvdW50IGlzIG5vdCBpbmNyZW1lbnRlZC4KLSAqLwotSzMyT0JKICpLMzJPQkpfRmluZE5hbWUoIExQQ1NUUiBuYW1lICkKLXsKLSAgICBOQU1FX0VOVFJZICplbnRyeSA9IEszMk9CSl9GaXJzdEVudHJ5OwotICAgIFVJTlQzMiBsZW47Ci0KLSAgICBpZiAoIW5hbWUpIHJldHVybiBOVUxMOyAgLyogQW5vbnltb3VzIG9iamVjdCAqLwotICAgIGxlbiA9IHN0cmxlbiggbmFtZSApOwotICAgIHdoaWxlIChlbnRyeSkKLSAgICB7Ci0gICAgICAgIGlmICgobGVuID09IGVudHJ5LT5sZW4pICYmICFsc3RyY21wMzJBKCBuYW1lLCBlbnRyeS0+bmFtZSkpCi0gICAgICAgICAgICByZXR1cm4gZW50cnktPm9iajsKLSAgICAgICAgZW50cnkgPSBlbnRyeS0+bmV4dDsKLSAgICB9Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgSzMyT0JKX0ZpbmROYW1lVHlwZQotICoKLSAqIEZpbmQgYW4gb2JqZWN0IGJ5IG5hbWUgYW5kIGNoZWNrIGl0cyB0eXBlLgotICogVGhlIHJlZmVyZW5jZSBjb3VudCBpcyBub3QgaW5jcmVtZW50ZWQuCi0gKi8KLUszMk9CSiAqSzMyT0JKX0ZpbmROYW1lVHlwZSggTFBDU1RSIG5hbWUsIEszMk9CSl9UWVBFIHR5cGUgKQotewotICAgIEszMk9CSiAqb2JqID0gSzMyT0JKX0ZpbmROYW1lKCBuYW1lICk7Ci0gICAgaWYgKCFvYmopIHJldHVybiBOVUxMOwotICAgIGlmIChvYmotPnR5cGUgPT0gdHlwZSkgcmV0dXJuIG9iajsKLSAgICBTZXRMYXN0RXJyb3IoIEVSUk9SX0RVUF9OQU1FICk7Ci0gICAgcmV0dXJuIE5VTEw7Ci19CmRpZmYgLS1naXQgYS93aW4zMi9rZXJuZWwzMi5jIGIvd2luMzIva2VybmVsMzIuYwppbmRleCBhNTNlMDRlLi4wYTY1MWM3IDEwMDY0NAotLS0gYS93aW4zMi9rZXJuZWwzMi5jCisrKyBiL3dpbjMyL2tlcm5lbDMyLmMKQEAgLTEyLDYgKzEyLDcgQEAKICNpbmNsdWRlICJ1c2VyLmgiCiAjaW5jbHVkZSAiaGVhcC5oIgogI2luY2x1ZGUgIm1vZHVsZS5oIgorI2luY2x1ZGUgInByb2Nlc3MuaCIKICNpbmNsdWRlICJzdGFja2ZyYW1lLmgiCiAjaW5jbHVkZSAic2VsZWN0b3JzLmgiCiAjaW5jbHVkZSAidGFzay5oIgpAQCAtNTY4LDcgKzU2OSw3IEBACiAJKngrKz0weDY2Oyp4Kys9MHg1MjsJCQkJLyogcHVzaGwgZWR4ICovCiAJKngrKz0weGVhOyooRFdPUkQqKXg9Y2FsbGJhY2s7eCs9NDsJCS8qIGptcGYgY2FsbGJhY2sgKi8KIAotCSooRFdPUkQqKSh0aHVuaysxOCkgPSBHZXRDdXJyZW50UHJvY2Vzc0lkKCk7CisJKihQREIzMioqKSh0aHVuaysxOCkgPSBwQ3VycmVudFByb2Nlc3M7CiAKIAlzZWwgPSBTRUxFQ1RPUl9BbGxvY0Jsb2NrKCB0aHVuayAsIDMyLCBTRUdNRU5UX0NPREUsIEZBTFNFLCBGQUxTRSApOwogCXJldHVybiAoc2VsPDwxNil8MDsKZGlmZiAtLWdpdCBhL3dpbjMyL29yZGluYWxzLmMgYi93aW4zMi9vcmRpbmFscy5jCmluZGV4IDEwYWY2M2IuLjU2ZDJmOWYgMTAwNjQ0Ci0tLSBhL3dpbjMyL29yZGluYWxzLmMKKysrIGIvd2luMzIvb3JkaW5hbHMuYwpAQCAtMTEsNiArMTEsNyBAQAogI2luY2x1ZGUgInNlbGVjdG9ycy5oIgogI2luY2x1ZGUgIm1pc2NlbXUuaCIKICNpbmNsdWRlICJ3aW5udC5oIgorI2luY2x1ZGUgInByb2Nlc3MuaCIKICNpbmNsdWRlICJtb2R1bGUuaCIKICNpbmNsdWRlICJjYWxsYmFjay5oIgogI2luY2x1ZGUgImRlYnVnLmgiCkBAIC03NSw3ICs3Niw3IEBACiAJCQlyZXR1cm4gMDsKIAkJcmV0dXJuIHBUYXNrLT52ZXJzaW9uOwogCWNhc2UgMTY6LyogcmV0dXJuIHVuY3J5cHRlZCBwb2ludGVyIHRvIGN1cnJlbnQgdGhyZWFkICovCi0JCXJldHVybiAoRFdPUkQpcEN1cnJlbnRUaHJlYWQ7CisJCXJldHVybiAoRFdPUkQpVEhSRUFEX0N1cnJlbnQoKTsKIAljYXNlIDIwOi8qIHJldHVybiB1bmNyeXB0ZWQgcG9pbnRlciB0byBwcm9jZXNzICovCiAJCXJldHVybiAoRFdPUkQpcHJvY2VzczsKIAljYXNlIDI0Oi8qIHJldHVybiBzdGRvdXRwdXQgaGFuZGxlIGZyb20gc3RhcnR1cGluZm8gKi8KZGlmZiAtLWdpdCBhL3dpbjMyL3Byb2Nlc3MuYyBiL3dpbjMyL3Byb2Nlc3MuYwppbmRleCBmZDdkMTAyLi5hMDA4NWM5IDEwMDY0NAotLS0gYS93aW4zMi9wcm9jZXNzLmMKKysrIGIvd2luMzIvcHJvY2Vzcy5jCkBAIC0xMiwzMzIgKzEyLDEyIEBACiAjaW5jbHVkZSAid2luZXJyb3IuaCIKICNpbmNsdWRlICJoZWFwLmgiCiAjaW5jbHVkZSAidGhyZWFkLmgiCi0jaW5jbHVkZSAiaGFuZGxlMzIuaCIKKyNpbmNsdWRlICJwcm9jZXNzLmgiCiAjaW5jbHVkZSAicGVfaW1hZ2UuaCIKICNpbmNsdWRlICJmaWxlLmgiCiAjaW5jbHVkZSAic3RkZGVidWcuaCIKICNpbmNsdWRlICJkZWJ1Zy5oIgogCi10eXBlZGVmIHN0cnVjdCB7Ci0JSzMyT0JKCWhlYWRlcjsKLQlEV09SRAltYXhjb3VudDsKLQlEV09SRAljb3VudDsKLQlEV09SRAlpbml0aWFsOwotfSBLMzJTRU1BUEhPUkU7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLQlLMzJPQkoJaGVhZGVyOwotCVRIREIJKm93bmluZ190aHJlYWQ7IC8qIHdlIGFyZSBsb2NrZWQgYnkgdGhpcyB0aHJlYWQgKi8KLX0gSzMyTVVURVg7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLQlLMzJPQkoJaGVhZGVyOwotfSBLMzJFVkVOVDsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgQ3JlYXRlTXV0ZXhBICAgIChLRVJORUwzMi41MikKLSAqLwotSEFORExFMzIgV0lOQVBJIENyZWF0ZU11dGV4MzJBKFNFQ1VSSVRZX0FUVFJJQlVURVMgKnNhLEJPT0wzMiBvbixMUENTVFIgbmFtZSkKLXsKLQlLMzJNVVRFWAkqbXV0OwotCUhBTkRMRTMyCWhhbmRsZTsKLQlLMzJPQkogCQkqb2JqID0gSzMyT0JKX0ZpbmROYW1lKCBuYW1lICk7Ci0KLQlpZiAob2JqKSB7Ci0JCWlmIChvYmotPnR5cGUgPT0gSzMyT0JKX01VVEVYKSB7Ci0JCQlTZXRMYXN0RXJyb3IoIEVSUk9SX0FMUkVBRFlfRVhJU1RTICk7Ci0JCQlyZXR1cm4gUFJPQ0VTU19BbGxvY0hhbmRsZSggb2JqLDAgKTsKLQkJfQotCQlTZXRMYXN0RXJyb3IoIEVSUk9SX0RVUF9OQU1FICk7Ci0JCXJldHVybiAwOwotCX0KLQltdXQgPSAoSzMyTVVURVgqKUhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLDAsc2l6ZW9mKEszMk1VVEVYKSk7Ci0JbXV0LT5oZWFkZXIudHlwZSA9IEszMk9CSl9NVVRFWDsKLQltdXQtPmhlYWRlci5yZWZjb3VudCAgPSAxOwotCW11dC0+b3duaW5nX3RocmVhZCA9IE5VTEw7Ci0JaWYgKG5hbWUpCi0JCUszMk9CSl9BZGROYW1lKCYobXV0LT5oZWFkZXIpLG5hbWUpOwotCWhhbmRsZSA9IFBST0NFU1NfQWxsb2NIYW5kbGUoJihtdXQtPmhlYWRlciksMCk7Ci0JaWYgKGhhbmRsZSAhPSBJTlZBTElEX0hBTkRMRV9WQUxVRTMyKSB7Ci0JCWlmIChvbikKLQkJCW11dC0+b3duaW5nX3RocmVhZCA9IChUSERCICopR2V0Q3VycmVudFRocmVhZElkKCk7Ci0JCXJldHVybiBoYW5kbGU7Ci0JfQotCUszMk9CSl9EZWNDb3VudCgmKG11dC0+aGVhZGVyKSk7IC8qIGFsc28gZnJlZXMgbmFtZSAqLwotCUhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksMCxtdXQpOwotCXJldHVybiAwOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBDcmVhdGVNdXRleFcgICAgKEtFUk5FTDMyLjUzKQotICovCi1IQU5ETEUzMiBXSU5BUEkgQ3JlYXRlTXV0ZXgzMlcoU0VDVVJJVFlfQVRUUklCVVRFUyAqc2EsIEJPT0wzMiBvbiwgTFBDV1NUUiBhKQotewotCUxQU1RSCQluYW1lID0gYT9IRUFQX3N0cmR1cFd0b0EoR2V0UHJvY2Vzc0hlYXAoKSwwLGEpOk5VTEw7Ci0JSEFORExFMzIJcmV0OwotCi0JcmV0ID0gQ3JlYXRlTXV0ZXgzMkEoc2Esb24sbmFtZSk7Ci0JaWYgKG5hbWUpIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksMCxuYW1lKTsKLQlyZXR1cm4gcmV0OwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBDcmVhdGVTZW1hcGhvcmVBICAgIChLRVJORUwzMi42MCkKLSAqLwotSEFORExFMzIgV0lOQVBJIENyZWF0ZVNlbWFwaG9yZTMyQSggTFBTRUNVUklUWV9BVFRSSUJVVEVTIHNhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE9ORyBpbml0aWFsLExPTkcgbWF4LExQQ1NUUiBuYW1lICkKLXsKLQlLMzJTRU1BUEhPUkUJKnNlbTsKLQlIQU5ETEUzMgloYW5kbGU7Ci0JSzMyT0JKIAkJKm9iaiA9IEszMk9CSl9GaW5kTmFtZSggbmFtZSApOwotCi0JaWYgKG9iaikgewotCQlpZiAob2JqLT50eXBlID09IEszMk9CSl9TRU1BUEhPUkUpIHsKLQkJCVNldExhc3RFcnJvciggRVJST1JfQUxSRUFEWV9FWElTVFMgKTsKLQkJCXJldHVybiBQUk9DRVNTX0FsbG9jSGFuZGxlKCBvYmosMCApOwotCQl9Ci0JCVNldExhc3RFcnJvciggRVJST1JfRFVQX05BTUUgKTsKLQkJcmV0dXJuIDA7Ci0JfQotCXNlbSA9IChLMzJTRU1BUEhPUkUqKUhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLDAsc2l6ZW9mKEszMlNFTUFQSE9SRSkpOwotCXNlbS0+aGVhZGVyLnR5cGUgPSBLMzJPQkpfU0VNQVBIT1JFOwotCXNlbS0+aGVhZGVyLnJlZmNvdW50ICA9IDE7Ci0KLQlzZW0tPm1heGNvdW50IAk9IG1heDsKLQlzZW0tPmNvdW50CT0gaW5pdGlhbDsKLQlzZW0tPmluaXRpYWwJPSBpbml0aWFsOwotCWlmIChuYW1lKQotCQlLMzJPQkpfQWRkTmFtZSgmKHNlbS0+aGVhZGVyKSxuYW1lKTsKLQloYW5kbGUgPSBQUk9DRVNTX0FsbG9jSGFuZGxlKCYoc2VtLT5oZWFkZXIpLDApOwotCWlmIChoYW5kbGUgIT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUzMikKLQkJcmV0dXJuIGhhbmRsZTsKLQlLMzJPQkpfRGVjQ291bnQoJihzZW0tPmhlYWRlcikpOyAvKiBhbHNvIGZyZWVzIG5hbWUgKi8KLQlIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLDAsc2VtKTsKLQlyZXR1cm4gMDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgQ3JlYXRlU2VtYXBob3JlVyAgICAoS0VSTkVMMzIuNjEpCi0gKi8KLUhBTkRMRTMyIFdJTkFQSSBDcmVhdGVTZW1hcGhvcmUzMlcoU0VDVVJJVFlfQVRUUklCVVRFUyAqc2EsTE9ORyBpbml0aWFsLExPTkcgbWF4LExQQ1dTVFIgYSkKLXsKLQlMUFNUUgkJbmFtZSA9YT9IRUFQX3N0cmR1cFd0b0EoR2V0UHJvY2Vzc0hlYXAoKSwwLGEpOk5VTEw7Ci0JSEFORExFMzIJcmV0OwotCi0JcmV0ID0gQ3JlYXRlU2VtYXBob3JlMzJBKHNhLGluaXRpYWwsbWF4LG5hbWUpOwotCWlmIChhKSBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLDAsbmFtZSk7Ci0JcmV0dXJuIHJldDsKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBPcGVuU2VtYXBob3JlQSAgICAoS0VSTkVMMzIuNDAzKQotICovCi1IQU5ETEUzMiBXSU5BUEkgT3BlblNlbWFwaG9yZTMyQShEV09SRCBkZXNpcmVkLEJPT0wzMiBpbmhlcml0LExQQ1NUUiBuYW1lKQotewotCUszMk9CSiAJCSpvYmogPSBLMzJPQkpfRmluZE5hbWUoIG5hbWUgKTsKLQotCWlmIChvYmopIHsKLQkJaWYgKG9iai0+dHlwZSA9PSBLMzJPQkpfU0VNQVBIT1JFKQotCQkJcmV0dXJuIFBST0NFU1NfQWxsb2NIYW5kbGUoIG9iaiwwICk7Ci0JCVNldExhc3RFcnJvciggRVJST1JfRFVQX05BTUUgKTsKLQkJcmV0dXJuIDA7Ci0JfQotCXJldHVybiAwOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBPcGVuU2VtYXBob3JlQSAgICAoS0VSTkVMMzIuNDA0KQotICovCi1IQU5ETEUzMiBXSU5BUEkgT3BlblNlbWFwaG9yZTMyVyhEV09SRCBkZXNpcmVkLEJPT0wzMiBpbmhlcml0LExQQ1dTVFIgbmFtZSkKLXsKLQlMUFNUUgluYW1lQSA9IG5hbWU/SEVBUF9zdHJkdXBXdG9BKEdldFByb2Nlc3NIZWFwKCksMCxuYW1lKTpOVUxMOwotCUhBTkRMRTMyCXJldCA9IE9wZW5TZW1hcGhvcmUzMkEoZGVzaXJlZCxpbmhlcml0LG5hbWVBKTsKLQotCWlmIChuYW1lKSBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLDAsbmFtZUEpOwotCXJldHVybiByZXQ7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIFJlbGVhc2VTZW1hcGhvcmUgICAgKEtFUk5FTDMyLjQwMykKLSAqLwotQk9PTDMyIFdJTkFQSSBSZWxlYXNlU2VtYXBob3JlKEhBTkRMRTMyIGhTZW1hcGhvcmUsTE9ORyBsUmVsZWFzZUNvdW50LExQTE9ORyBscFByZXZpb3VzQ291bnQpCi17Ci0JSzMyU0VNQVBIT1JFCSpzZW07Ci0KLQlzZW0gPSAoSzMyU0VNQVBIT1JFKilQUk9DRVNTX0dldE9ialB0cihoU2VtYXBob3JlLEszMk9CSl9TRU1BUEhPUkUpOwotCWlmICghc2VtKQotCQlyZXR1cm4gRkFMU0U7Ci0JaWYgKGxwUHJldmlvdXNDb3VudCkgKmxwUHJldmlvdXNDb3VudCA9IHNlbS0+Y291bnQ7Ci0Jc2VtLT5jb3VudCArPSBsUmVsZWFzZUNvdW50OwotCWlmIChzZW0tPmNvdW50PnNlbS0+bWF4Y291bnQpIHsKLQkJZnByaW50ZihzdGRlcnIsIlJlbGVhc2VTZW1hcGhvcmUoJWQsJWxkLC4pLCByZWxlYXNlZCBtb3JlIHRoZW4gcG9zc2libGU/P1xuIixoU2VtYXBob3JlLGxSZWxlYXNlQ291bnQpOwotCQlzZW0tPmNvdW50ID0gc2VtLT5tYXhjb3VudDsKLQl9Ci0KLQkvKiBGSVhNRTogd2FrZSB1cCBhbGwgdGhyZWFkcyBibG9ja2VkIG9uIHRoYXQgc2VtYXBob3JlICovCi0KLQlLMzJPQkpfRGVjQ291bnQoJihzZW0tPmhlYWRlcikpOwotCXJldHVybiBUUlVFOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBPcGVuTXV0ZXhBICAgIChLRVJORUwzMi4zOTkpCi0gKi8KLUhBTkRMRTMyIFdJTkFQSSBPcGVuTXV0ZXgzMkEoRFdPUkQgZGVzaXJlZGFjY2VzcywgQk9PTDMyIGluaGVyaXRoYW5kbGUsIExQQ1NUUiBuYW1lKQotewotCUszMk9CSiAJCSpvYmogPSBLMzJPQkpfRmluZE5hbWUoIG5hbWUgKTsKLQotCWlmIChvYmopIHsKLQkJaWYgKG9iai0+dHlwZSA9PSBLMzJPQkpfTVVURVgpCi0JCQlyZXR1cm4gUFJPQ0VTU19BbGxvY0hhbmRsZSggb2JqLDAgKTsKLQkJU2V0TGFzdEVycm9yKCBFUlJPUl9EVVBfTkFNRSApOwotCQlyZXR1cm4gMDsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIE9wZW5NdXRleFcgICAgKEtFUk5FTDMyLjQwMCkKLSAqLwotSEFORExFMzIgV0lOQVBJIE9wZW5NdXRleDMyVyhEV09SRCBkZXNpcmVkYWNjZXNzLCBCT09MMzIgaW5oZXJpdGhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBDV1NUUiBuYW1lKQotewotCUxQU1RSCQluYW1lQT1uYW1lP0hFQVBfc3RyZHVwV3RvQShHZXRQcm9jZXNzSGVhcCgpLDAsbmFtZSk6TlVMTDsKLQlIQU5ETEUzMglyZXQgPSBPcGVuTXV0ZXgzMkEoZGVzaXJlZGFjY2Vzcyxpbmhlcml0aGFuZGxlLG5hbWVBKTsKLQotCWlmIChuYW1lKSBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLDAsbmFtZUEpOwotCXJldHVybiByZXQ7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIFJlbGVhc2VNdXRleCAgICAoS0VSTkVMMzIuNDM1KQotICovCi1CT09MMzIgV0lOQVBJIFJlbGVhc2VNdXRleCAoSEFORExFMzIgaCkKLXsKLQlLMzJNVVRFWAkqbXV0ID0gKEszMk1VVEVYKilQUk9DRVNTX0dldE9ialB0cihoLEszMk9CSl9NVVRFWCk7Ci0KLQlpZiAoIW11dCkKLQkJcmV0dXJuIDA7Ci0JaWYgKG11dC0+b3duaW5nX3RocmVhZCAhPSAoVEhEQiAqKUdldEN1cnJlbnRUaHJlYWRJZCgpKSB7Ci0JCS8qIHNldCBlcnJvciAuLi4gKi8KLQkJSzMyT0JKX0RlY0NvdW50KCYobXV0LT5oZWFkZXIpKTsKLQkJcmV0dXJuIDA7Ci0JfQotCW11dC0+b3duaW5nX3RocmVhZCA9IE5VTEw7Ci0KLQkvKiBGSVhNRTogd2FrZSB1cCBhbGwgdGhyZWFkcyBibG9ja2VkIG9uIHRoaXMgbXV0ZXggKi8KLQotCUszMk9CSl9EZWNDb3VudCgmKG11dC0+aGVhZGVyKSk7Ci0JcmV0dXJuIFRSVUU7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIENyZWF0ZUV2ZW50QSAgICAoS0VSTkVMMzIuNDMpCi0gKi8KLUhBTkRMRTMyIFdJTkFQSSBDcmVhdGVFdmVudDMyQShTRUNVUklUWV9BVFRSSUJVVEVTICpzYSxCT09MMzIgYXUsQk9PTDMyIG9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQQ1NUUiBuYW1lKQotewotCUszMkVWRU5UCSpldnQ7Ci0JSEFORExFMzIJaGFuZGxlOwotCUszMk9CSiAJCSpvYmogPSBLMzJPQkpfRmluZE5hbWUoIG5hbWUgKTsKLQotCWlmIChvYmopIHsKLQkJaWYgKG9iai0+dHlwZSA9PSBLMzJPQkpfRVZFTlQpIHsKLQkJCVNldExhc3RFcnJvciggRVJST1JfQUxSRUFEWV9FWElTVFMgKTsKLQkJCXJldHVybiBQUk9DRVNTX0FsbG9jSGFuZGxlKCBvYmosMCApOwotCQl9Ci0JCVNldExhc3RFcnJvciggRVJST1JfRFVQX05BTUUgKTsKLQkJcmV0dXJuIDA7Ci0JfQotCWV2dCA9IChLMzJFVkVOVCopSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksMCxzaXplb2YoSzMyRVZFTlQpKTsKLQlldnQtPmhlYWRlci50eXBlID0gSzMyT0JKX0VWRU5UOwotCWV2dC0+aGVhZGVyLnJlZmNvdW50ICA9IDE7Ci0JaWYgKG5hbWUpCi0JCUszMk9CSl9BZGROYW1lKCYoZXZ0LT5oZWFkZXIpLG5hbWUpOwotCWhhbmRsZSA9IFBST0NFU1NfQWxsb2NIYW5kbGUoJihldnQtPmhlYWRlciksMCk7Ci0JaWYgKGhhbmRsZSAhPSBJTlZBTElEX0hBTkRMRV9WQUxVRTMyKQotCQlyZXR1cm4gaGFuZGxlOwotCUszMk9CSl9EZWNDb3VudCgmKGV2dC0+aGVhZGVyKSk7IC8qIGFsc28gZnJlZXMgbmFtZSAqLwotCUhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksMCxldnQpOwotCXJldHVybiAwOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBDcmVhdGVFdmVudFcgICAgKEtFUk5FTDMyLjQzKQotICovCi1IQU5ETEUzMiBXSU5BUEkgQ3JlYXRlRXZlbnQzMlcoU0VDVVJJVFlfQVRUUklCVVRFUyAqc2EsIEJPT0wzMiBhdSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT09MMzIgb24sTFBDV1NUUiBuYW1lKQotewotCUxQU1RSIG5hbWVBPW5hbWU/SEVBUF9zdHJkdXBXdG9BKEdldFByb2Nlc3NIZWFwKCksMCxuYW1lKTpOVUxMOwotCUhBTkRMRTMyIHJldCA9IENyZWF0ZUV2ZW50MzJBKHNhLGF1LG9uLG5hbWVBKTsKLQotCWlmIChuYW1lKSBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLDAsbmFtZUEpOwotCXJldHVybiByZXQ7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIE9wZW5FdmVudEEgICAgKEtFUk5FTDMyLjM5NCkKLSAqLwotSEFORExFMzIgV0lOQVBJIE9wZW5FdmVudDMyQShEV09SRCBkZXNpcmVkYWNjZXNzLEJPT0wzMiBpbmhlcml0aGFuZGxlLExQQ1NUUiBuYW1lKQotewotCUszMk9CSiAJCSpvYmogPSBLMzJPQkpfRmluZE5hbWUoIG5hbWUgKTsKLQotCWlmIChvYmopIHsKLQkJaWYgKG9iai0+dHlwZSA9PSBLMzJPQkpfRVZFTlQpCi0JCQlyZXR1cm4gUFJPQ0VTU19BbGxvY0hhbmRsZSggb2JqLDAgKTsKLQkJU2V0TGFzdEVycm9yKCBFUlJPUl9EVVBfTkFNRSApOwotCQlyZXR1cm4gMDsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIE9wZW5FdmVudFcgICAgKEtFUk5FTDMyLjM5NSkKLSAqLwotSEFORExFMzIgV0lOQVBJIE9wZW5FdmVudDMyVyhEV09SRCBkZXNpcmVkYWNjZXNzLEJPT0wzMiBpbmhlcml0aGFuZGxlLExQQ1dTVFIgbmFtZSkKLXsKLQlMUFNUUgluYW1lQSA9IG5hbWU/SEVBUF9zdHJkdXBXdG9BKEdldFByb2Nlc3NIZWFwKCksMCxuYW1lKTpOVUxMOwotCUhBTkRMRTMyCXJldCA9IE9wZW5FdmVudDMyQShkZXNpcmVkYWNjZXNzLGluaGVyaXRoYW5kbGUsbmFtZUEpOwotCi0JaWYgKG5hbWUpIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksMCxuYW1lQSk7Ci0JcmV0dXJuIHJldDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgU2V0RXZlbnQgICAgKEtFUk5FTDMyLjQ4NykKLSAqLwotQk9PTDMyIFdJTkFQSSBTZXRFdmVudCAoSEFORExFMzIgaCkKLXsKLQlmcHJpbnRmKHN0ZGVyciwiU2V0RXZlbnQoJWQpIHN0dWJcbiIsaCk7Ci0JcmV0dXJuIDA7Ci19Ci0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBSZXNldEV2ZW50ICAgIChLRVJORUwzMi40MzkpCi0gKi8KLUJPT0wzMiBXSU5BUEkgUmVzZXRFdmVudCAoSEFORExFMzIgaCkKLXsKLQlmcHJpbnRmKHN0ZGVyciwiUmVzZXRFdmVudCglZCkgc3R1YlxuIixoKTsKLQlyZXR1cm4gMDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgV2FpdEZvclNpbmdsZU9iamVjdCAgICAoS0VSTkVMMzIuNTYxKQotICovCi1EV09SRCBXSU5BUEkgV2FpdEZvclNpbmdsZU9iamVjdChIQU5ETEUzMiBoLCBEV09SRCB0aW1lb3V0KQotewotCWZwcmludGYoc3RkZXJyLCJXYWl0Rm9yU2luZ2xlT2JqZWN0KCVkLCVsZCkgc3R1YlxuIixoLHRpbWVvdXQpOwotCXJldHVybiAwOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBXYWl0Rm9yU2luZ2xlT2JqZWN0RXggICAgKEtFUk5FTDMyKQotICovCi1EV09SRCBXSU5BUEkgV2FpdEZvclNpbmdsZU9iamVjdEV4KEhBTkRMRTMyIGgsRFdPUkQgdGltZW91dCxCT09MMzIgYkFsZXJ0YWJsZSkKLXsKLQlmcHJpbnRmKHN0ZGVyciwiV2FpdEZvclNpbmdsZU9iamVjdEV4KCVkLCVsZCwlZCkgc3R1YlxuIixoLHRpbWVvdXQsYkFsZXJ0YWJsZSk7Ci0JcmV0dXJuIDA7Ci19CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIE1zZ1dhaXRGb3JNdWx0aXBsZU9iamVjdHMgICAgKFVTRVIzMi4zOTkpCkBAIC0zNTUsMTUgKzM1LDYgQEAKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgV2FpdEZvck11bHRpcGxlT2JqZWN0cyAgICAoS0VSTkVMMzIpCi0gKi8KLURXT1JEIFdJTkFQSSBXYWl0Rm9yTXVsdGlwbGVPYmplY3RzKAotCURXT1JEIG5Db3VudCxIQU5ETEUzMiAqcEhhbmRsZXMsQk9PTDMyIGZXYWl0QWxsLERXT1JEIGR3TWlsbGlzZWNvbmRzCi0pIHsKLQlyZXR1cm4gTXNnV2FpdEZvck11bHRpcGxlT2JqZWN0cyhuQ291bnQscEhhbmRsZXMsZldhaXRBbGwsZHdNaWxsaXNlY29uZHMsMCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIER1cGxpY2F0ZUhhbmRsZSAgICAoS0VSTkVMMzIuNzgpCiAgKi8KIEJPT0wzMiBXSU5BUEkgRHVwbGljYXRlSGFuZGxlKEhBTkRMRTMyIGEsIEhBTkRMRTMyIGIsIEhBTkRMRTMyIGMsIEhBTkRMRTMyICogZCwgRFdPUkQgZSwgQk9PTDMyIGYsIERXT1JEIGcpCmRpZmYgLS1naXQgYS93aW4zMi90aHJlYWQuYyBiL3dpbjMyL3RocmVhZC5jCmluZGV4IGU5NzRjMjkuLmJjZDRkNGEgMTAwNjQ0Ci0tLSBhL3dpbjMyL3RocmVhZC5jCisrKyBiL3dpbjMyL3RocmVhZC5jCkBAIC0xMTQsMTMgKzExNCw5IEBACiB7CiAjaWYgZGVmaW5lZChfX2kzODZfXykmJmRlZmluZWQoX19HTlVDX18pCQogCUxPTkcgcmV0OwotCV9fYXNtX18KLQkoCSAgCSAKLQotICAgICAgICAgICAiXHRsb2NrXG4iCS8qIGZvciBTTVAgc3lzdGVtcyAqLwotCSAgICJcdHhjaGdsCSUwLCglMSlcbiIJICAgCSAgCi0JICAgOiI9ciIgKHJldCk6InIiICh0YXJnZXQpLCAiMCIgKHZhbHVlKToibWVtb3J5IgotCSk7CisJX19hc21fXyAoIC8qIGxvY2sgZm9yIFNNUCBzeXN0ZW1zICovCisgICAgICAgICAgICAgICAgICAibG9ja1xuXHR4Y2hnbCAlMCwoJTEpIgorICAgICAgICAgICAgICAgICAgOiI9ciIgKHJldCk6InIiICh0YXJnZXQpLCAiMCIgKHZhbHVlKToibWVtb3J5IiApOwogCXJldHVybiByZXQ7CiAjZWxzZQogCUxPTkcgcmV0OwpAQCAtMTM0LDExMiArMTMwLDYgQEAKICNlbmRpZgkKIH0KIAotLyogQUFBUkdISCBzb21lIENyaXRpY2FsU2VjdGlvbiBmdW5jdGlvbnMgZ2V0IGNhbGxlZCBiZWZvcmUgd2UgCi0gKiBoYXZlIGEgdGhyZWFkaWQKLSAqLwotIAotI2RlZmluZSBHZXRDdXJyZW50VGhyZWFkSWQoKQkoLTEpCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogICAgICAgICAgIEluaXRpYWxpemVDcml0aWNhbFNlY3Rpb24JCQlbS0VSTkVMMzJdCSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotdm9pZCBXSU5BUEkgSW5pdGlhbGl6ZUNyaXRpY2FsU2VjdGlvbihDUklUSUNBTF9TRUNUSU9OICpwY3JpdGljYWwpCi17Ci0gICBwY3JpdGljYWwtPkxvY2tDb3VudD0tMTsKLSAgIHBjcml0aWNhbC0+UmVjdXJzaW9uQ291bnQ9MDsKLSAgIHBjcml0aWNhbC0+TG9ja1NlbWFwaG9yZT0oSEFORExFMzIpIHNlbWdldChJUENfUFJJVkFURSwxLElQQ19DUkVBVCk7Ci0gICBwY3JpdGljYWwtPk93bmluZ1RocmVhZD0oSEFORExFMzIpIC0xOwotICAgcGNyaXRpY2FsLT5SZXNlcnZlZD0wOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qICAgICAgICAgICBEZWxldGVDcml0aWNhbFNlY3Rpb24JCQlbS0VSTkVMMzJdCSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotdm9pZCBXSU5BUEkgRGVsZXRlQ3JpdGljYWxTZWN0aW9uKENSSVRJQ0FMX1NFQ1RJT04gKnBjcml0aWNhbCkKLXsKLSAgIHNlbWN0bCgoaW50KSBwY3JpdGljYWwtPkxvY2tTZW1hcGhvcmUsMCxJUENfUk1JRCwgKHZvaWQgKikwKTsKLSAgIHBjcml0aWNhbC0+UmVzZXJ2ZWQ9LTE7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogICAgICAgICAgIEVudGVyQ3JpdGljYWxTZWN0aW9uCQkJW0tFUk5FTDMyXQkqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXZvaWQgV0lOQVBJIEVudGVyQ3JpdGljYWxTZWN0aW9uIChDUklUSUNBTF9TRUNUSU9OICpwY3JpdGljYWwpCi17Ci0gICBpZiggSW50ZXJsb2NrZWRJbmNyZW1lbnQoJihwY3JpdGljYWwtPkxvY2tDb3VudCkpKQotICAgeyAgIAotICAgICAgaWYoIHBjcml0aWNhbC0+T3duaW5nVGhyZWFkIT0gKEhBTkRMRTMyKSBHZXRDdXJyZW50VGhyZWFkSWQoKSApCi0gICAgICB7ICAgICAgICAgICAgICAgICAKLSAgICAgICAgIHN0cnVjdCBzZW1idWYgc29wOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICBzb3Auc2VtX251bT0wOwotICAgICAgICAgc29wLnNlbV9vcD0wOwotICAgICAgICAgc29wLnNlbV9mbGc9MDsgICAgICAgICAgICAKLSAgICAgICAgIHNlbW9wKChpbnQpIHBjcml0aWNhbC0+TG9ja1NlbWFwaG9yZSwmc29wLDApOwotICAgICAgICAgICAgCi0gICAgICAgICBwY3JpdGljYWwtPk93bmluZ1RocmVhZCA9IChIQU5ETEUzMikgR2V0Q3VycmVudFRocmVhZElkKCk7ICAgICAgICAgICAgICAgIAotICAgICAgfQotICAgfQotICAgZWxzZQotICAgeyAgICAgIAotICAgICAgcGNyaXRpY2FsLT5Pd25pbmdUaHJlYWQgPShIQU5ETEUzMikgR2V0Q3VycmVudFRocmVhZElkKCk7Ci0gICB9Ci0gICBwY3JpdGljYWwtPlJlY3Vyc2lvbkNvdW50Kys7ICAgICAgICAgICAgIAotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qICAgICAgICAgICBUcnlFbnRlckNyaXRpY2FsU2VjdGlvbgkJCVtLRVJORUwzMl0JKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1CT09MMzIgV0lOQVBJIFRyeUVudGVyQ3JpdGljYWxTZWN0aW9uIChDUklUSUNBTF9TRUNUSU9OICpwY3JpdGljYWwpCi17Ci0gICBpZiggSW50ZXJsb2NrZWRJbmNyZW1lbnQoJihwY3JpdGljYWwtPkxvY2tDb3VudCkpKQotICAgewotICAgICAgaWYoIHBjcml0aWNhbC0+T3duaW5nVGhyZWFkIT0gKEhBTkRMRTMyKSBHZXRDdXJyZW50VGhyZWFkSWQoKSApCi0gICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICB9Ci0gICBlbHNlCi0gICB7ICAgICAgCi0gICAgICBwY3JpdGljYWwtPk93bmluZ1RocmVhZCA9KEhBTkRMRTMyKSBHZXRDdXJyZW50VGhyZWFkSWQoKTsKLSAgIH0KLSAgIHBjcml0aWNhbC0+UmVjdXJzaW9uQ291bnQrKzsgICAgICAgICAgICAgCi0gICAKLSAgIHJldHVybiBUUlVFOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qICAgICAgICAgICBMZWF2ZUNyaXRpY2FsU2VjdGlvbgkJCVtLRVJORUwzMl0JKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi12b2lkIFdJTkFQSSBMZWF2ZUNyaXRpY2FsU2VjdGlvbihDUklUSUNBTF9TRUNUSU9OICpwY3JpdGljYWwpCi17Ci0gICAvKiBkbyB3ZSBhY3R1YWxseSBvd24gdGhpcyBjcml0aWNhbCBzZWN0aW9uID8/PyAqLwotICAgaWYoIHBjcml0aWNhbC0+T3duaW5nVGhyZWFkIT0gKEhBTkRMRTMyKSBHZXRDdXJyZW50VGhyZWFkSWQoKSkKLSAgICAgIHJldHVybjsKLSAgICAgICAKLSAgIHBjcml0aWNhbC0+UmVjdXJzaW9uQ291bnQtLTsKLSAgIGlmKCBwY3JpdGljYWwtPlJlY3Vyc2lvbkNvdW50PT0wKQotICAgewotICAgICAgcGNyaXRpY2FsLT5Pd25pbmdUaHJlYWQ9KEhBTkRMRTMyKS0xOwotICAgICAgaWYoSW50ZXJsb2NrZWREZWNyZW1lbnQoJihwY3JpdGljYWwtPkxvY2tDb3VudCkpPj0wKQotICAgICAgeyAgICAgICAgIAotICAgICAgICAgc3RydWN0IHNlbWJ1ZiBzb3A7Ci0gICAgICAgICAKLSAgICAgICAgIHNvcC5zZW1fbnVtPTA7Ci0gICAgICAgICBzb3Auc2VtX29wPTE7Ci0gICAgICAgICBzb3Auc2VtX2ZsZz0wOwotICAgICAgICAgc2Vtb3AoKGludCkgcGNyaXRpY2FsLT5Mb2NrU2VtYXBob3JlLCZzb3AsMCk7Ci0gICAgICB9Ci0gICB9Ci0gICBlbHNlCi0gICB7Ci0gICAgICAgSW50ZXJsb2NrZWREZWNyZW1lbnQoJihwY3JpdGljYWwtPkxvY2tDb3VudCkpOwotICAgfSAgCi19Ci0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgIFJlaW5pdGlhbGl6ZUNyaXRpY2FsU2VjdGlvbgkJCVtLRVJORUwzMl0JKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtMjQ4LDE0ICsxMzgsMyBAQAogewogICAgLyogaG1tID8/Pz8/PyAqLwkKIH0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiAgICAgICAgICAgTWFrZUNyaXRpY2FsU2VjdGlvbkdsb2JhbAkJCVtLRVJORUwzMl0JKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi12b2lkIFdJTkFQSSBNYWtlQ3JpdGljYWxTZWN0aW9uR2xvYmFsKENSSVRJQ0FMX1NFQ1RJT04gKmxwQ3JpdCkKLXsKLSAgIC8qIG5vdGhpbmcgKFN5c1YgU2VtYXBob3JlcyBhcmUgYWxyZWFkeSBnbG9iYWwpICovCi0gICByZXR1cm47CQotfQotCmRpZmYgLS1naXQgYS93aW4zMi91c2VyMzIuYyBiL3dpbjMyL3VzZXIzMi5jCmluZGV4IDMwODA1OTYuLmRhZWI4YzkgMTAwNjQ0Ci0tLSBhL3dpbjMyL3VzZXIzMi5jCisrKyBiL3dpbjMyL3VzZXIzMi5jCkBAIC0xMyw3ICsxMyw2IEBACiAjaW5jbHVkZSAid2luZG93cy5oIgogI2luY2x1ZGUgIndpbmVycm9yLmgiCiAjaW5jbHVkZSAiaGVhcC5oIgotI2luY2x1ZGUgImhhbmRsZTMyLmgiCiAjaW5jbHVkZSAic3RydWN0MzIuaCIKICNpbmNsdWRlICJ3aW4uaCIKICNpbmNsdWRlICJkZWJ1Zy5oIgpkaWZmIC0tZ2l0IGEvd2luZG93cy9kY2UuYyBiL3dpbmRvd3MvZGNlLmMKaW5kZXggNmZiNmQ1Ni4uYjgyYmM5NSAxMDA2NDQKLS0tIGEvd2luZG93cy9kY2UuYworKysgYi93aW5kb3dzL2RjZS5jCkBAIC03NzQsMTEgKzc3NCwxMiBAQAogICAgICAgICAgICAgV05EKiAgICB3bmQgPSB3bmRQdHItPnBhcmVudC0+Y2hpbGQ7CiAJICAgIFJFQ1QzMiAgcmVjdDsKIAkKLQkgICAgZm9yKCA7IHduZCAhPSB3bmRQdHI7IHduZCA9IHduZC0+bmV4dCApCisJICAgIGZvciggOyB3bmQgJiYgKHduZCAhPSB3bmRQdHIpOyB3bmQgPSB3bmQtPm5leHQgKSB7CiAJCWlmKCB3bmQtPmNsYXNzLT5zdHlsZSAmIENTX1NBVkVCSVRTICYmIAogCQkgICAgd25kLT5kd1N0eWxlICYgV1NfVklTSUJMRSAmJgogCQkgICAgSW50ZXJzZWN0UmVjdDMyKCZyZWN0LCAmd25kUHRyLT5yZWN0Q2xpZW50LCAmd25kLT5yZWN0Q2xpZW50KSApCiAgICAgICAgICAgICAgICAgICAgIHduZC0+ZmxhZ3MgfD0gV0lOX1NBVkVVTkRFUl9PVkVSUklERTsKKwkgICAgfQogCX0KIAlkYy0+dy5mbGFncyAmPSB+RENfRElSVFk7CiAJZGNlLT5EQ1hmbGFncyAmPSB+RENYX0RDRURJUlRZOwpkaWZmIC0tZ2l0IGEvd2luZG93cy9kZWZ3bmQuYyBiL3dpbmRvd3MvZGVmd25kLmMKaW5kZXggMDAyODY4YS4uNjQ0ZjYzNCAxMDA2NDQKLS0tIGEvd2luZG93cy9kZWZ3bmQuYworKysgYi93aW5kb3dzL2RlZnduZC5jCkBAIC0xMyw3ICsxMyw2IEBACiAjaW5jbHVkZSAibm9uY2xpZW50LmgiCiAjaW5jbHVkZSAid2lucG9zLmgiCiAjaW5jbHVkZSAiZGNlLmgiCi0jaW5jbHVkZSAic3lzY29sb3IuaCIKICNpbmNsdWRlICJzeXNtZXRyaWNzLmgiCiAjaW5jbHVkZSAic3RkZGVidWcuaCIKICNpbmNsdWRlICJkZWJ1Zy5oIgpAQCAtNzksMTUgKzc4LDE2IEBACiB7CiAgICAgaWYoIGN0bFR5cGUgPT0gQ1RMQ09MT1JfU0NST0xMQkFSKQogICAgIHsKKyAgICAgICAgSEJSVVNIMzIgaGIgPSBHZXRTeXNDb2xvckJydXNoMzIoQ09MT1JfU0NST0xMQkFSKTsKIAlTZXRCa0NvbG9yMzIoIGhEQywgUkdCKDI1NSwgMjU1LCAyNTUpICk7CiAJU2V0VGV4dENvbG9yMzIoIGhEQywgUkdCKDAsIDAsIDApICk7Ci0JVW5yZWFsaXplT2JqZWN0MzIoIHN5c0NvbG9yT2JqZWN0cy5oYnJ1c2hTY3JvbGxiYXIgKTsKLSAgICAgICAgcmV0dXJuIHN5c0NvbG9yT2JqZWN0cy5oYnJ1c2hTY3JvbGxiYXI7CisJVW5yZWFsaXplT2JqZWN0MzIoIGhiICk7CisgICAgICAgIHJldHVybiBoYjsKICAgICB9CiAKICAgICBTZXRCa0NvbG9yMzIoIGhEQywgR2V0U3lzQ29sb3IzMihDT0xPUl9XSU5ET1cpICk7CiAgICAgU2V0VGV4dENvbG9yMzIoIGhEQywgR2V0U3lzQ29sb3IzMihDT0xPUl9XSU5ET1dURVhUKSk7Ci0gICAgcmV0dXJuIHN5c0NvbG9yT2JqZWN0cy5oYnJ1c2hXaW5kb3c7CisgICAgcmV0dXJuIEdldFN5c0NvbG9yQnJ1c2gzMihDT0xPUl9XSU5ET1cpOwogfQogCiAKZGlmZiAtLWdpdCBhL3dpbmRvd3MvZXZlbnQuYyBiL3dpbmRvd3MvZXZlbnQuYwppbmRleCA2OWM0MGVjLi5hNjg4OGFjIDEwMDY0NAotLS0gYS93aW5kb3dzL2V2ZW50LmMKKysrIGIvd2luZG93cy9ldmVudC5jCkBAIC02NjYsOCArNjY2LDggQEAKIAogICAgIGlmIChidXR0b25OdW0gPj0gTkJfQlVUVE9OUykgcmV0dXJuOwogICAgIGlmIChTd2FwcGVkQnV0dG9ucykgYnV0dG9uTnVtID0gTkJfQlVUVE9OUyAtIDEgLSBidXR0b25OdW07Ci0gICAgTW91c2VCdXR0b25zU3RhdGVzW2J1dHRvbk51bV0gPSAweDgwMDA7Ci0gICAgQXN5bmNNb3VzZUJ1dHRvbnNTdGF0ZXNbYnV0dG9uTnVtXSA9IDB4ODAwMDsKKyAgICBNb3VzZUJ1dHRvbnNTdGF0ZXNbYnV0dG9uTnVtXSA9IFRSVUU7CisgICAgQXN5bmNNb3VzZUJ1dHRvbnNTdGF0ZXNbYnV0dG9uTnVtXSA9IFRSVUU7CiAgICAgaGFyZHdhcmVfZXZlbnQoIG1lc3NhZ2VzW2J1dHRvbk51bV0sCiAJCSAgICBFVkVOVF9YU3RhdGVUb0tleVN0YXRlKCBldmVudC0+c3RhdGUgKSwgMEwsCiAgICAgICAgICAgICAgICAgICAgIHBXbmQtPnJlY3RXaW5kb3cubGVmdCArIGV2ZW50LT54LApAQCAtNjg3LDcgKzY4Nyw3IEBACiAKICAgICBpZiAoYnV0dG9uTnVtID49IE5CX0JVVFRPTlMpIHJldHVybjsgICAgCiAgICAgaWYgKFN3YXBwZWRCdXR0b25zKSBidXR0b25OdW0gPSBOQl9CVVRUT05TIC0gMSAtIGJ1dHRvbk51bTsKLSAgICBNb3VzZUJ1dHRvbnNTdGF0ZXNbYnV0dG9uTnVtXSA9IDA7CisgICAgTW91c2VCdXR0b25zU3RhdGVzW2J1dHRvbk51bV0gPSBGQUxTRTsKICAgICBoYXJkd2FyZV9ldmVudCggbWVzc2FnZXNbYnV0dG9uTnVtXSwKIAkJICAgIEVWRU5UX1hTdGF0ZVRvS2V5U3RhdGUoIGV2ZW50LT5zdGF0ZSApLCAwTCwKICAgICAgICAgICAgICAgICAgICAgcFduZC0+cmVjdFdpbmRvdy5sZWZ0ICsgZXZlbnQtPngsCmRpZmYgLS1naXQgYS93aW5kb3dzL2dyYXBoaWNzLmMgYi93aW5kb3dzL2dyYXBoaWNzLmMKaW5kZXggZjkyNGE4Zi4uYTQ5NTNjNiAxMDA2NDQKLS0tIGEvd2luZG93cy9ncmFwaGljcy5jCisrKyBiL3dpbmRvd3MvZ3JhcGhpY3MuYwpAQCAtMTUsNyArMTUsNiBAQAogI2luY2x1ZGUgImJpdG1hcC5oIgogI2luY2x1ZGUgImdkaS5oIgogI2luY2x1ZGUgImRjLmgiCi0jaW5jbHVkZSAic3lzY29sb3IuaCIKIAogI2RlZmluZSBNQVhfRFJBV0xJTkVTIDgKIApAQCAtMTI5LDEyICsxMjgsMTIgQEAKIHsKICAgICBpZihwcmVzc2VkKQogCUdSQVBIX0RyYXdHZW5lcmljUmVsaWVmUmVjdChoZGMsIHJlY3QsIGhpZ2hsaWdodF9zaXplLCBzaGFkb3dfc2l6ZSwKLQkJCQkgICAgc3lzQ29sb3JPYmplY3RzLmhicnVzaEJ0blNoYWRvdywKLQkJCQkgICAgc3lzQ29sb3JPYmplY3RzLmhicnVzaEJ0bkhpZ2hsaWdodCk7CisJCQkJICAgIEdldFN5c0NvbG9yQnJ1c2gzMihDT0xPUl9CVE5TSEFET1cpLAorCQkJCSAgICBHZXRTeXNDb2xvckJydXNoMzIoQ09MT1JfQlROSElHSExJR0hUKSk7CiAgICAgZWxzZQogCUdSQVBIX0RyYXdHZW5lcmljUmVsaWVmUmVjdChoZGMsIHJlY3QsIGhpZ2hsaWdodF9zaXplLCBzaGFkb3dfc2l6ZSwKLQkJCQkgICAgc3lzQ29sb3JPYmplY3RzLmhicnVzaEJ0bkhpZ2hsaWdodCwKLQkJCQkgICAgc3lzQ29sb3JPYmplY3RzLmhicnVzaEJ0blNoYWRvdyk7CisJCQkJICAgIEdldFN5c0NvbG9yQnJ1c2gzMihDT0xPUl9CVE5ISUdITElHSFQpLAorCQkJCSAgICBHZXRTeXNDb2xvckJydXNoMzIoQ09MT1JfQlROU0hBRE9XKSk7CiAKICAgICByZXR1cm47CiB9CmRpZmYgLS1naXQgYS93aW5kb3dzL2tleWJvYXJkLmMgYi93aW5kb3dzL2tleWJvYXJkLmMKaW5kZXggNzVhODQzOC4uMmYyZjU5NCAxMDA2NDQKLS0tIGEvd2luZG93cy9rZXlib2FyZC5jCisrKyBiL3dpbmRvd3Mva2V5Ym9hcmQuYwpAQCAtNTExLDEzICs1MTEsMTMgQEAKICAgICBzd2l0Y2ggKHZrZXkpCiAJewogCWNhc2UgVktfTEJVVFRPTiA6IC8qIFZLX0xCVVRUT04gaXMgMSAqLwotCSAgICByZXR2YWwgPSBNb3VzZUJ1dHRvbnNTdGF0ZXNbMF07CisJICAgIHJldHZhbCA9IE1vdXNlQnV0dG9uc1N0YXRlc1swXSA/IDB4ODAwMCA6IDA7CiAJICAgIGJyZWFrOwogCWNhc2UgVktfTUJVVFRPTiA6IC8qIFZLX01CVVRUT04gaXMgNCAqLwotCSAgICByZXR2YWwgPSBNb3VzZUJ1dHRvbnNTdGF0ZXNbMV07CisJICAgIHJldHZhbCA9IE1vdXNlQnV0dG9uc1N0YXRlc1sxXSA/IDB4ODAwMCA6IDA7CiAJICAgIGJyZWFrOwogCWNhc2UgVktfUkJVVFRPTiA6IC8qIFZLX1JCVVRUT04gaXMgMiAqLwotCSAgICByZXR2YWwgPSBNb3VzZUJ1dHRvbnNTdGF0ZXNbMl07CisJICAgIHJldHZhbCA9IE1vdXNlQnV0dG9uc1N0YXRlc1syXSA/IDB4ODAwMCA6IDA7CiAJICAgIGJyZWFrOwogCWRlZmF1bHQgOgogCSAgICBpZiAodmtleSA+PSAnYScgJiYgdmtleSA8PSAneicpCkBAIC01MzksOSArNTM5LDkgQEAKIHsKICAgICBkcHJpbnRmX2tleShzdGRkZWIsICJHZXRLZXlib2FyZFN0YXRlKClcbiIpOwogICAgIGlmIChscEtleVN0YXRlICE9IE5VTEwpIHsKLQlRdWV1ZUtleVN0YXRlVGFibGVbVktfTEJVVFRPTl0gPSBNb3VzZUJ1dHRvbnNTdGF0ZXNbMF0gPj4gODsKLQlRdWV1ZUtleVN0YXRlVGFibGVbVktfTUJVVFRPTl0gPSBNb3VzZUJ1dHRvbnNTdGF0ZXNbMV0gPj4gODsKLQlRdWV1ZUtleVN0YXRlVGFibGVbVktfUkJVVFRPTl0gPSBNb3VzZUJ1dHRvbnNTdGF0ZXNbMl0gPj4gODsKKwlRdWV1ZUtleVN0YXRlVGFibGVbVktfTEJVVFRPTl0gPSBNb3VzZUJ1dHRvbnNTdGF0ZXNbMF0gPyAweDgwIDogMDsKKwlRdWV1ZUtleVN0YXRlVGFibGVbVktfTUJVVFRPTl0gPSBNb3VzZUJ1dHRvbnNTdGF0ZXNbMV0gPyAweDgwIDogMDsKKwlRdWV1ZUtleVN0YXRlVGFibGVbVktfUkJVVFRPTl0gPSBNb3VzZUJ1dHRvbnNTdGF0ZXNbMl0gPyAweDgwIDogMDsKIAltZW1jcHkobHBLZXlTdGF0ZSwgUXVldWVLZXlTdGF0ZVRhYmxlLCAyNTYpOwogICAgIH0KIH0KQEAgLTU1NCw5ICs1NTQsOSBAQAogICAgIGRwcmludGZfa2V5KHN0ZGRlYiwgIlNldEtleWJvYXJkU3RhdGUoKVxuIik7CiAgICAgaWYgKGxwS2V5U3RhdGUgIT0gTlVMTCkgewogCW1lbWNweShRdWV1ZUtleVN0YXRlVGFibGUsIGxwS2V5U3RhdGUsIDI1Nik7Ci0JTW91c2VCdXR0b25zU3RhdGVzWzBdID0gUXVldWVLZXlTdGF0ZVRhYmxlW1ZLX0xCVVRUT05dPyAweDgwMDA6IDA7Ci0JTW91c2VCdXR0b25zU3RhdGVzWzFdID0gUXVldWVLZXlTdGF0ZVRhYmxlW1ZLX01CVVRUT05dPyAweDgwMDA6IDA7Ci0JTW91c2VCdXR0b25zU3RhdGVzWzJdID0gUXVldWVLZXlTdGF0ZVRhYmxlW1ZLX1JCVVRUT05dPyAweDgwMDA6IDA7CisJTW91c2VCdXR0b25zU3RhdGVzWzBdID0gKFF1ZXVlS2V5U3RhdGVUYWJsZVtWS19MQlVUVE9OXSAhPSAwKTsKKwlNb3VzZUJ1dHRvbnNTdGF0ZXNbMV0gPSAoUXVldWVLZXlTdGF0ZVRhYmxlW1ZLX01CVVRUT05dICE9IDApOworCU1vdXNlQnV0dG9uc1N0YXRlc1syXSA9IChRdWV1ZUtleVN0YXRlVGFibGVbVktfUkJVVFRPTl0gIT0gMCk7CiAgICAgfQogfQogCkBAIC01NzksMTYgKzU3OSwxNiBAQAogCiAgICAgc3dpdGNoIChuS2V5KSB7CiAgICAgIGNhc2UgVktfTEJVVFRPTjoKLQlyZXR2YWwgPSBBc3luY01vdXNlQnV0dG9uc1N0YXRlc1swXSB8IAotCU1vdXNlQnV0dG9uc1N0YXRlc1swXT8gMHgwMDAxOiAwOworCXJldHZhbCA9IChBc3luY01vdXNlQnV0dG9uc1N0YXRlc1swXSA/IDB4MDAwMSA6IDApIHwgCisgICAgICAgICAgICAgICAgIChNb3VzZUJ1dHRvbnNTdGF0ZXNbMF0gPyAweDgwMDAgOiAwKTsKIAlicmVhazsKICAgICAgY2FzZSBWS19NQlVUVE9OOgotCXJldHZhbCA9IEFzeW5jTW91c2VCdXR0b25zU3RhdGVzWzFdIHwKLQlNb3VzZUJ1dHRvbnNTdGF0ZXNbMV0/IDB4MDAwMTogMDsKKwlyZXR2YWwgPSAoQXN5bmNNb3VzZUJ1dHRvbnNTdGF0ZXNbMV0gPyAweDAwMDEgOiAwKSB8IAorICAgICAgICAgICAgICAgICAoTW91c2VCdXR0b25zU3RhdGVzWzFdID8gMHg4MDAwIDogMCk7CiAJYnJlYWs7CiAgICAgIGNhc2UgVktfUkJVVFRPTjoKLQlyZXR2YWwgPSBBc3luY01vdXNlQnV0dG9uc1N0YXRlc1syXSB8Ci0JTW91c2VCdXR0b25zU3RhdGVzWzJdPyAweDAwMDE6IDA7CisJcmV0dmFsID0gKEFzeW5jTW91c2VCdXR0b25zU3RhdGVzWzJdID8gMHgwMDAxIDogMCkgfCAKKyAgICAgICAgICAgICAgICAgKE1vdXNlQnV0dG9uc1N0YXRlc1syXSA/IDB4ODAwMCA6IDApOwogCWJyZWFrOwogICAgICBkZWZhdWx0OgogCXJldHZhbCA9IEFzeW5jS2V5U3RhdGVUYWJsZVtuS2V5XSB8IApAQCAtNTk2LDggKzU5Niw5IEBACiAJYnJlYWs7CiAgICAgfQogCi0gICAgbWVtc2V0KCBBc3luY01vdXNlQnV0dG9uc1N0YXRlcywgMCwgMyApOyAgLyogYWxsIHN0YXRlcyB0byBmYWxzZSAqLwotICAgIG1lbXNldCggQXN5bmNLZXlTdGF0ZVRhYmxlLCAwLCAyNTYgKTsKKyAgICAvKiBhbGwgc3RhdGVzIHRvIGZhbHNlICovCisgICAgbWVtc2V0KCBBc3luY01vdXNlQnV0dG9uc1N0YXRlcywgMCwgc2l6ZW9mKEFzeW5jTW91c2VCdXR0b25zU3RhdGVzKSApOworICAgIG1lbXNldCggQXN5bmNLZXlTdGF0ZVRhYmxlLCAwLCBzaXplb2YoQXN5bmNLZXlTdGF0ZVRhYmxlKSApOwogCiAgICAgZHByaW50Zl9rZXkoc3RkZGViLCAiR2V0QXN5bmNLZXlTdGF0ZSgleCkgLT4gJXhcbiIsIG5LZXksIHJldHZhbCk7CiAgICAgcmV0dXJuIHJldHZhbDsKZGlmZiAtLWdpdCBhL3dpbmRvd3MvbWVzc2FnZS5jIGIvd2luZG93cy9tZXNzYWdlLmMKaW5kZXggYTYyY2E4Ny4uMDhhNGQ3ZCAxMDA2NDQKLS0tIGEvd2luZG93cy9tZXNzYWdlLmMKKysrIGIvd2luZG93cy9tZXNzYWdlLmMKQEAgLTM5MSwxNiArMzkxLDIyIEBACiAgICAgewogICAgICBzd2l0Y2ggKHRtcE1zZy0+bWVzc2FnZSkKICAgICAgewotICAgICAgY2FzZSBXTV9MQlVUVE9ORE9XTjpNb3VzZUJ1dHRvbnNTdGF0ZXNbMF09QXN5bmNNb3VzZUJ1dHRvbnNTdGF0ZXNbMF09MTticmVhazsKLSAgICAgIGNhc2UgV01fTEJVVFRPTlVQOiAgTW91c2VCdXR0b25zU3RhdGVzWzBdPUFzeW5jTW91c2VCdXR0b25zU3RhdGVzWzBdPTA7YnJlYWs7Ci0gICAgICBjYXNlIFdNX01CVVRUT05ET1dOOk1vdXNlQnV0dG9uc1N0YXRlc1sxXT1Bc3luY01vdXNlQnV0dG9uc1N0YXRlc1sxXT0xO2JyZWFrOwotICAgICAgY2FzZSBXTV9NQlVUVE9OVVA6ICBNb3VzZUJ1dHRvbnNTdGF0ZXNbMV09QXN5bmNNb3VzZUJ1dHRvbnNTdGF0ZXNbMV09MDticmVhazsKLSAgICAgIGNhc2UgV01fUkJVVFRPTkRPV046TW91c2VCdXR0b25zU3RhdGVzWzJdPUFzeW5jTW91c2VCdXR0b25zU3RhdGVzWzJdPTE7YnJlYWs7Ci0gICAgICBjYXNlIFdNX1JCVVRUT05VUDogIE1vdXNlQnV0dG9uc1N0YXRlc1syXT1Bc3luY01vdXNlQnV0dG9uc1N0YXRlc1syXT0wO2JyZWFrOyAgICAgIAorICAgICAgY2FzZSBXTV9MQlVUVE9ORE9XTjoKKyAgICAgICAgICBNb3VzZUJ1dHRvbnNTdGF0ZXNbMF09QXN5bmNNb3VzZUJ1dHRvbnNTdGF0ZXNbMF09VFJVRTticmVhazsKKyAgICAgIGNhc2UgV01fTEJVVFRPTlVQOgorICAgICAgICAgIE1vdXNlQnV0dG9uc1N0YXRlc1swXT1Bc3luY01vdXNlQnV0dG9uc1N0YXRlc1swXT1GQUxTRTticmVhazsKKyAgICAgIGNhc2UgV01fTUJVVFRPTkRPV046CisgICAgICAgICAgTW91c2VCdXR0b25zU3RhdGVzWzFdPUFzeW5jTW91c2VCdXR0b25zU3RhdGVzWzFdPVRSVUU7YnJlYWs7CisgICAgICBjYXNlIFdNX01CVVRUT05VUDoKKyAgICAgICAgICBNb3VzZUJ1dHRvbnNTdGF0ZXNbMV09QXN5bmNNb3VzZUJ1dHRvbnNTdGF0ZXNbMV09RkFMU0U7YnJlYWs7CisgICAgICBjYXNlIFdNX1JCVVRUT05ET1dOOgorICAgICAgICAgIE1vdXNlQnV0dG9uc1N0YXRlc1syXT1Bc3luY01vdXNlQnV0dG9uc1N0YXRlc1syXT1UUlVFO2JyZWFrOworICAgICAgY2FzZSBXTV9SQlVUVE9OVVA6CisgICAgICAgICAgTW91c2VCdXR0b25zU3RhdGVzWzJdPUFzeW5jTW91c2VCdXR0b25zU3RhdGVzWzJdPUZBTFNFO2JyZWFrOyAgICAgIAogICAgICB9Ci0gICAgIEFzeW5jS2V5U3RhdGVUYWJsZVtWS19MQlVUVE9OXT0gSW5wdXRLZXlTdGF0ZVRhYmxlW1ZLX0xCVVRUT05dID0gTW91c2VCdXR0b25zU3RhdGVzWzBdIDw8IDg7Ci0gICAgIEFzeW5jS2V5U3RhdGVUYWJsZVtWS19NQlVUVE9OXT0gSW5wdXRLZXlTdGF0ZVRhYmxlW1ZLX01CVVRUT05dID0gTW91c2VCdXR0b25zU3RhdGVzWzFdIDw8IDg7Ci0gICAgIEFzeW5jS2V5U3RhdGVUYWJsZVtWS19SQlVUVE9OXT0gSW5wdXRLZXlTdGF0ZVRhYmxlW1ZLX1JCVVRUT05dID0gTW91c2VCdXR0b25zU3RhdGVzWzJdIDw8IDg7CisgICAgIEFzeW5jS2V5U3RhdGVUYWJsZVtWS19MQlVUVE9OXT0gSW5wdXRLZXlTdGF0ZVRhYmxlW1ZLX0xCVVRUT05dID0gTW91c2VCdXR0b25zU3RhdGVzWzBdID8gMHg4MCA6IDA7CisgICAgIEFzeW5jS2V5U3RhdGVUYWJsZVtWS19NQlVUVE9OXT0gSW5wdXRLZXlTdGF0ZVRhYmxlW1ZLX01CVVRUT05dID0gTW91c2VCdXR0b25zU3RhdGVzWzFdID8gMHg4MCA6IDA7CisgICAgIEFzeW5jS2V5U3RhdGVUYWJsZVtWS19SQlVUVE9OXT0gSW5wdXRLZXlTdGF0ZVRhYmxlW1ZLX1JCVVRUT05dID0gTW91c2VCdXR0b25zU3RhdGVzWzJdID8gMHg4MCA6IDA7CiAgICAgIFNldEN1cnNvclBvczMyKHRtcE1zZy0+cGFyYW1MLHRtcE1zZy0+cGFyYW1IKTsKICAgICAgbFBhcmFtPU1BS0VMT05HKHRtcE1zZy0+cGFyYW1MLHRtcE1zZy0+cGFyYW1IKTsKICAgICAgd1BhcmFtPTA7ICAgICAgICAgICAgIApAQCAtMTcwNywzICsxNzEzLDE0IEBACiAJKTsKIAlyZXR1cm4gMDsKIH0KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgU2VuZE5vdGlmeU1lc3NhZ2VBICAgIChVU0VSMzIuNDYwKQorICovCitMT05HIFdJTkFQSSBTZW5kTm90aWZ5TWVzc2FnZTMyQShIV05EMzIgaHduZCxVSU5UMzIgbXNnLFdQQVJBTTMyIHdQYXJhbSxMUEFSQU0gbFBhcmFtKQoreworCWZwcmludGYoc3RkZXJyLCJTZW5kTm90aWZ5TWVzc2FnZTMyQSglMDR4LCUwOGx4LCUwOGx4LCUwOGx4KSxzdHViIVxuIiwKKwkJaHduZCwobG9uZyltc2csKGxvbmcpd1BhcmFtLGxQYXJhbQorCSk7CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS93aW5kb3dzL25vbmNsaWVudC5jIGIvd2luZG93cy9ub25jbGllbnQuYwppbmRleCA3YmRiY2U0Li43MjBjMmFiIDEwMDY0NAotLS0gYS93aW5kb3dzL25vbmNsaWVudC5jCisrKyBiL3dpbmRvd3Mvbm9uY2xpZW50LmMKQEAgLTEzLDcgKzEzLDYgQEAKICNpbmNsdWRlICJoZWFwLmgiCiAjaW5jbHVkZSAiY3Vyc29yaWNvbi5oIgogI2luY2x1ZGUgImRpYWxvZy5oIgotI2luY2x1ZGUgInN5c2NvbG9yLmgiCiAjaW5jbHVkZSAibWVudS5oIgogI2luY2x1ZGUgIndpbnBvcy5oIgogI2luY2x1ZGUgImhvb2suaCIKQEAgLTY3OCwxNSArNjc3LDE1IEBACiAgICAgewogCXdpZHRoID0gU1lTTUVUUklDU19DWERMR0ZSQU1FIC0gMTsKIAloZWlnaHQgPSBTWVNNRVRSSUNTX0NZRExHRlJBTUUgLSAxOwotICAgICAgICBTZWxlY3RPYmplY3QzMiggaGRjLCBhY3RpdmUgPyBzeXNDb2xvck9iamVjdHMuaGJydXNoQWN0aXZlQ2FwdGlvbiA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5c0NvbG9yT2JqZWN0cy5oYnJ1c2hJbmFjdGl2ZUNhcHRpb24gKTsKKyAgICAgICAgU2VsZWN0T2JqZWN0MzIoIGhkYywgR2V0U3lzQ29sb3JCcnVzaDMyKGFjdGl2ZSA/IENPTE9SX0FDVElWRUNBUFRJT04gOgorCQkJCQkJQ09MT1JfSU5BQ1RJVkVDQVBUSU9OKSApOwogICAgIH0KICAgICBlbHNlCiAgICAgewogCXdpZHRoID0gU1lTTUVUUklDU19DWEZSQU1FIC0gMTsKIAloZWlnaHQgPSBTWVNNRVRSSUNTX0NZRlJBTUUgLSAxOwotICAgICAgICBTZWxlY3RPYmplY3QzMiggaGRjLCBhY3RpdmUgPyBzeXNDb2xvck9iamVjdHMuaGJydXNoQWN0aXZlQm9yZGVyIDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3lzQ29sb3JPYmplY3RzLmhicnVzaEluYWN0aXZlQm9yZGVyICk7CisgICAgICAgIFNlbGVjdE9iamVjdDMyKCBoZGMsIEdldFN5c0NvbG9yQnJ1c2gzMihhY3RpdmUgPyBDT0xPUl9BQ1RJVkVCT1JERVIgOgorCQkJCQkJQ09MT1JfSU5BQ1RJVkVCT1JERVIpICk7CiAgICAgfQogCiAgICAgICAvKiBEcmF3IGZyYW1lICovCkBAIC03ODMsMTUgKzc4MiwxNSBAQAogICAgIHsKIAl3aWR0aCA9IFNZU01FVFJJQ1NfQ1hETEdGUkFNRSAtIDE7CiAJaGVpZ2h0ID0gU1lTTUVUUklDU19DWURMR0ZSQU1FIC0gMTsKLSAgICAgICAgU2VsZWN0T2JqZWN0MzIoIGhkYywgYWN0aXZlID8gc3lzQ29sb3JPYmplY3RzLmhicnVzaEFjdGl2ZUNhcHRpb24gOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeXNDb2xvck9iamVjdHMuaGJydXNoSW5hY3RpdmVDYXB0aW9uICk7CisgICAgICAgIFNlbGVjdE9iamVjdDMyKCBoZGMsIEdldFN5c0NvbG9yQnJ1c2gzMihhY3RpdmUgPyBDT0xPUl9BQ1RJVkVDQVBUSU9OIDoKKwkJCQkJCUNPTE9SX0lOQUNUSVZFQ0FQVElPTikgKTsKICAgICB9CiAgICAgZWxzZQogICAgIHsKIAl3aWR0aCA9IHN5c01ldHJpY3NbU01fQ1hGUkFNRV0gLSBzeXNNZXRyaWNzW1NNX0NYRURHRV0gLSAxOwogCWhlaWdodCA9IHN5c01ldHJpY3NbU01fQ1lGUkFNRV0gLSBzeXNNZXRyaWNzW1NNX0NZRURHRV0gLSAxOwotICAgICAgICBTZWxlY3RPYmplY3QzMiggaGRjLCBhY3RpdmUgPyBzeXNDb2xvck9iamVjdHMuaGJydXNoQWN0aXZlQm9yZGVyIDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3lzQ29sb3JPYmplY3RzLmhicnVzaEluYWN0aXZlQm9yZGVyICk7CisgICAgICAgIFNlbGVjdE9iamVjdDMyKCBoZGMsIEdldFN5c0NvbG9yQnJ1c2gzMihhY3RpdmUgPyBDT0xPUl9BQ1RJVkVCT1JERVIgOgorCQkJCQkJQ09MT1JfSU5BQ1RJVkVCT1JERVIpICk7CiAgICAgfQogCiAgICAgLyogRHJhdyBmcmFtZSAqLwpAQCAtODY4LDcgKzg2Nyw3IEBACiAgICAgCiAgICAgaWYgKHduZFB0ci0+ZHdFeFN0eWxlICYgV1NfRVhfRExHTU9EQUxGUkFNRSkKICAgICB7Ci0JSEJSVVNIMzIgaGJydXNoT2xkID0gU2VsZWN0T2JqZWN0MzIoaGRjLCBzeXNDb2xvck9iamVjdHMuaGJydXNoV2luZG93KTsKKyAgICAgICAgSEJSVVNIMzIgaGJydXNoT2xkID0gU2VsZWN0T2JqZWN0MzIoaGRjLCBHZXRTeXNDb2xvckJydXNoMzIoQ09MT1JfV0lORE9XKSApOwogCVBhdEJsdDMyKCBoZGMsIHIubGVmdCwgci50b3AsIDEsIHIuYm90dG9tLXIudG9wKzEsUEFUQ09QWSApOwogCVBhdEJsdDMyKCBoZGMsIHIucmlnaHQtMSwgci50b3AsIDEsIHIuYm90dG9tLXIudG9wKzEsIFBBVENPUFkgKTsKIAlQYXRCbHQzMiggaGRjLCByLmxlZnQsIHIudG9wLTEsIHIucmlnaHQtci5sZWZ0LCAxLCBQQVRDT1BZICk7CkBAIC04OTgsOCArODk3LDggQEAKIAlyLnJpZ2h0IC09IFNZU01FVFJJQ1NfQ1hTSVpFICsgMTsKICAgICB9CiAKLSAgICBGaWxsUmVjdDMyKCBoZGMsICZyLCBhY3RpdmUgPyBzeXNDb2xvck9iamVjdHMuaGJydXNoQWN0aXZlQ2FwdGlvbiA6IAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgc3lzQ29sb3JPYmplY3RzLmhicnVzaEluYWN0aXZlQ2FwdGlvbiApOworICAgIEZpbGxSZWN0MzIoIGhkYywgJnIsIEdldFN5c0NvbG9yQnJ1c2gzMihhY3RpdmUgPyBDT0xPUl9BQ1RJVkVDQVBUSU9OIDoKKwkJCQkJICAgIENPTE9SX0lOQUNUSVZFQ0FQVElPTikgKTsKIAogICAgIGlmIChHZXRXaW5kb3dUZXh0MzJBKCBod25kLCBidWZmZXIsIHNpemVvZihidWZmZXIpICkpCiAgICAgewpAQCAtOTQ4LDggKzk0Nyw4IEBACiAKICAgICBpZiAod25kUHRyLT5mbGFncyAmIFdJTl9NQU5BR0VEKSByZXR1cm47CiAKLSAgICBGaWxsUmVjdDMyKCBoZGMsICZyLCBhY3RpdmUgPyBzeXNDb2xvck9iamVjdHMuaGJydXNoQWN0aXZlQ2FwdGlvbiA6IAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgc3lzQ29sb3JPYmplY3RzLmhicnVzaEluYWN0aXZlQ2FwdGlvbiApOworICAgIEZpbGxSZWN0MzIoIGhkYywgJnIsIEdldFN5c0NvbG9yQnJ1c2gzMihhY3RpdmUgPyBDT0xPUl9BQ1RJVkVDQVBUSU9OIDoKKwkJCQkJICAgIENPTE9SX0lOQUNUSVZFQ0FQVElPTikgKTsKIAogICAgIGlmICghaGJpdG1hcENsb3NlKSB7CiAJaWYgKCEoaGJpdG1hcENsb3NlID0gTG9hZEJpdG1hcDE2KCAwLCBNQUtFSU5UUkVTT1VSQ0UoT0JNX0NMT1NFKSApKSkKQEAgLTk2Myw3ICs5NjIsNyBAQAogICAgIH0KICAgICAKICAgICBpZiAod25kUHRyLT5kd0V4U3R5bGUgJiBXU19FWF9ETEdNT0RBTEZSQU1FKSB7Ci0JSEJSVVNIMzIgaGJydXNoT2xkID0gU2VsZWN0T2JqZWN0MzIoaGRjLCBzeXNDb2xvck9iamVjdHMuaGJydXNoV2luZG93KTsKKwlIQlJVU0gzMiBoYnJ1c2hPbGQgPSBTZWxlY3RPYmplY3QzMihoZGMsIEdldFN5c0NvbG9yQnJ1c2gzMihDT0xPUl9XSU5ET1cpICk7CiAJUGF0Qmx0MzIoIGhkYywgci5sZWZ0LCByLnRvcCwgMSwgci5ib3R0b20tci50b3ArMSxQQVRDT1BZICk7CiAJUGF0Qmx0MzIoIGhkYywgci5yaWdodC0xLCByLnRvcCwgMSwgci5ib3R0b20tci50b3ArMSwgUEFUQ09QWSApOwogCVBhdEJsdDMyKCBoZGMsIHIubGVmdCwgci50b3AtMSwgci5yaWdodC1yLmxlZnQsIDEsIFBBVENPUFkgKTsKQEAgLTEwMzIsNyArMTAzMSw3IEBACiAgICAgcmVjdC5yaWdodCAgPSB3bmRQdHItPnJlY3RXaW5kb3cucmlnaHQgLSB3bmRQdHItPnJlY3RXaW5kb3cubGVmdDsKICAgICByZWN0LmJvdHRvbSA9IHduZFB0ci0+cmVjdFdpbmRvdy5ib3R0b20gLSB3bmRQdHItPnJlY3RXaW5kb3cudG9wOwogCi0gICAgU2VsZWN0T2JqZWN0MzIoIGhkYywgc3lzQ29sb3JPYmplY3RzLmhwZW5XaW5kb3dGcmFtZSApOworICAgIFNlbGVjdE9iamVjdDMyKCBoZGMsIEdldFN5c0NvbG9yUGVuMzIoQ09MT1JfV0lORE9XRlJBTUUpICk7CiAKICAgICBpZiAoISh3bmRQdHItPmZsYWdzICYgV0lOX01BTkFHRUQpKQogICAgIHsKQEAgLTEwNzksNyArMTA3OCw3IEBACiAgICAgICAgIFJFQ1QzMiByID0gcmVjdDsKICAgICAgICAgci5sZWZ0ID0gci5yaWdodCAtIFNZU01FVFJJQ1NfQ1hWU0NST0xMICsgMTsKICAgICAgICAgci50b3AgID0gci5ib3R0b20gLSBTWVNNRVRSSUNTX0NZSFNDUk9MTCArIDE7Ci0gICAgICAgIEZpbGxSZWN0MzIoIGhkYywgJnIsIHN5c0NvbG9yT2JqZWN0cy5oYnJ1c2hTY3JvbGxiYXIgKTsKKyAgICAgICAgRmlsbFJlY3QzMiggaGRjLCAmciwgR2V0U3lzQ29sb3JCcnVzaDMyKENPTE9SX1NDUk9MTEJBUikgKTsKICAgICB9ICAgIAogCiAgICAgUmVsZWFzZURDMzIoIGh3bmQsIGhkYyApOwpAQCAtMTEzOSw3ICsxMTM4LDcgQEAKICAgICByZWN0LnJpZ2h0ICA9IHduZFB0ci0+cmVjdFdpbmRvdy5yaWdodCAtIHduZFB0ci0+cmVjdFdpbmRvdy5sZWZ0OwogICAgIHJlY3QuYm90dG9tID0gd25kUHRyLT5yZWN0V2luZG93LmJvdHRvbSAtIHduZFB0ci0+cmVjdFdpbmRvdy50b3A7CiAKLSAgICBTZWxlY3RPYmplY3QzMiggaGRjLCBzeXNDb2xvck9iamVjdHMuaHBlbldpbmRvd0ZyYW1lICk7CisgICAgU2VsZWN0T2JqZWN0MzIoIGhkYywgR2V0U3lzQ29sb3JQZW4zMihDT0xPUl9XSU5ET1dGUkFNRSkgKTsKIAogICAgIGlmKCEod25kUHRyLT5mbGFncyAmIFdJTl9NQU5BR0VEKSkgewogICAgICAgICBpZigod25kUHRyLT5kd1N0eWxlICYgV1NfQk9SREVSKSB8fCAod25kUHRyLT5kd1N0eWxlICYgV1NfRExHRlJBTUUpIHx8CkBAIC0xMjA2LDcgKzEyMDUsNyBAQAogICAgICAgICBSRUNUMzIgciA9IHJlY3Q7CiAgICAgICAgIHIubGVmdCA9IHIucmlnaHQgLSBTWVNNRVRSSUNTX0NYVlNDUk9MTCArIDE7CiAgICAgICAgIHIudG9wICA9IHIuYm90dG9tIC0gU1lTTUVUUklDU19DWUhTQ1JPTEwgKyAxOwotICAgICAgICBGaWxsUmVjdDMyKCBoZGMsICZyLCBzeXNDb2xvck9iamVjdHMuaGJydXNoU2Nyb2xsYmFyICk7CisgICAgICAgIEZpbGxSZWN0MzIoIGhkYywgJnIsICBHZXRTeXNDb2xvckJydXNoMzIoQ09MT1JfU0NST0xMQkFSKSApOwogICAgIH0gICAgCiAKICAgICBSZWxlYXNlREMzMiggaHduZCwgaGRjICk7CmRpZmYgLS1naXQgYS93aW5kb3dzL3Byb3BlcnR5LmMgYi93aW5kb3dzL3Byb3BlcnR5LmMKaW5kZXggMDllZWJlZC4uYzQ0Zjg3MSAxMDA2NDQKLS0tIGEvd2luZG93cy9wcm9wZXJ0eS5jCisrKyBiL3dpbmRvd3MvcHJvcGVydHkuYwpAQCAtMjQsMjEgKzI0LDM0IEBACiAgKi8KIHN0YXRpYyBQUk9QRVJUWSAqUFJPUF9GaW5kUHJvcCggSFdORDMyIGh3bmQsIExQQ1NUUiBzdHIgKQogeworICAgIEFUT00gYXRvbTsKICAgICBQUk9QRVJUWSAqcHJvcDsKICAgICBXTkQgKnBXbmQgPSBXSU5fRmluZFduZFB0ciggaHduZCApOwogCiAgICAgaWYgKCFwV25kKSByZXR1cm4gTlVMTDsKICAgICBpZiAoSElXT1JEKHN0cikpCiAgICAgeworICAgICAgICBhdG9tID0gR2xvYmFsRmluZEF0b20zMkEoIHN0ciApOwogICAgICAgICBmb3IgKHByb3AgPSBwV25kLT5wUHJvcDsgcHJvcDsgcHJvcCA9IHByb3AtPm5leHQpCi0gICAgICAgICAgICBpZiAoSElXT1JEKHByb3AtPnN0cmluZykgJiYgIWxzdHJjbXBpMzJBKCBwcm9wLT5zdHJpbmcsIHN0ciApKQotICAgICAgICAgICAgICAgIHJldHVybiBwcm9wOworICAgICAgICB7CisgICAgICAgICAgICBpZiAoSElXT1JEKHByb3AtPnN0cmluZykpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFsc3RyY21waTMyQSggcHJvcC0+c3RyaW5nLCBzdHIgKSkgcmV0dXJuIHByb3A7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChMT1dPUkQocHJvcC0+c3RyaW5nKSA9PSBhdG9tKSByZXR1cm4gcHJvcDsKKyAgICAgICAgfQogICAgIH0KICAgICBlbHNlICAvKiBhdG9tICovCiAgICAgeworICAgICAgICBhdG9tID0gTE9XT1JEKHN0cik7CiAgICAgICAgIGZvciAocHJvcCA9IHBXbmQtPnBQcm9wOyAocHJvcCk7IHByb3AgPSBwcm9wLT5uZXh0KQotICAgICAgICAgICAgaWYgKCFISVdPUkQocHJvcC0+c3RyaW5nKSAmJiAoTE9XT1JEKHByb3AtPnN0cmluZykgPT0gTE9XT1JEKHN0cikpKQotICAgICAgICAgICAgICAgIHJldHVybiBwcm9wOworICAgICAgICB7CisgICAgICAgICAgICBpZiAoSElXT1JEKHByb3AtPnN0cmluZykpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKEdsb2JhbEZpbmRBdG9tMzJBKCBwcm9wLT5zdHJpbmcgKSA9PSBhdG9tKSByZXR1cm4gcHJvcDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKExPV09SRChwcm9wLT5zdHJpbmcpID09IGF0b20pIHJldHVybiBwcm9wOworICAgICAgICB9CiAgICAgfQogICAgIHJldHVybiBOVUxMOwogfQpAQCAtMTU5LDYgKzE3Miw3IEBACiAgKi8KIEhBTkRMRTMyIFdJTkFQSSBSZW1vdmVQcm9wMzJBKCBIV05EMzIgaHduZCwgTFBDU1RSIHN0ciApCiB7CisgICAgQVRPTSBhdG9tOwogICAgIEhBTkRMRTMyIGhhbmRsZTsKICAgICBQUk9QRVJUWSAqKnBwcm9wLCAqcHJvcDsKICAgICBXTkQgKnBXbmQgPSBXSU5fRmluZFduZFB0ciggaHduZCApOwpAQCAtMTcyLDE1ICsxODYsMjcgQEAKICAgICBpZiAoIXBXbmQpIHJldHVybiBOVUxMOwogICAgIGlmIChISVdPUkQoc3RyKSkKICAgICB7CisgICAgICAgIGF0b20gPSBHbG9iYWxGaW5kQXRvbTMyQSggc3RyICk7CiAgICAgICAgIGZvciAocHByb3A9KFBST1BFUlRZKiopJnBXbmQtPnBQcm9wOyAoKnBwcm9wKTsgcHByb3AgPSAmKCpwcHJvcCktPm5leHQpCi0gICAgICAgICAgICBpZiAoSElXT1JEKCgqcHByb3ApLT5zdHJpbmcpICYmCi0gICAgICAgICAgICAgICAgIWxzdHJjbXBpMzJBKCAoKnBwcm9wKS0+c3RyaW5nLCBzdHIgKSkgYnJlYWs7CisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChISVdPUkQoKCpwcHJvcCktPnN0cmluZykpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFsc3RyY21waTMyQSggKCpwcHJvcCktPnN0cmluZywgc3RyICkpIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoTE9XT1JEKCgqcHByb3ApLT5zdHJpbmcpID09IGF0b20pIGJyZWFrOworICAgICAgICB9CiAgICAgfQogICAgIGVsc2UgIC8qIGF0b20gKi8KICAgICB7CisgICAgICAgIGF0b20gPSBMT1dPUkQoc3RyKTsKICAgICAgICAgZm9yIChwcHJvcD0oUFJPUEVSVFkqKikmcFduZC0+cFByb3A7ICgqcHByb3ApOyBwcHJvcCA9ICYoKnBwcm9wKS0+bmV4dCkKLSAgICAgICAgICAgIGlmICghSElXT1JEKCgqcHByb3ApLT5zdHJpbmcpICYmCi0gICAgICAgICAgICAgICAgKExPV09SRCgoKnBwcm9wKS0+c3RyaW5nKSA9PSBMT1dPUkQoc3RyKSkpIGJyZWFrOworICAgICAgICB7CisgICAgICAgICAgICBpZiAoSElXT1JEKCgqcHByb3ApLT5zdHJpbmcpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChHbG9iYWxGaW5kQXRvbTMyQSggKCpwcHJvcCktPnN0cmluZyApID09IGF0b20pIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoTE9XT1JEKCgqcHByb3ApLT5zdHJpbmcpID09IGF0b20pIGJyZWFrOworICAgICAgICB9CiAgICAgfQogICAgIGlmICghKnBwcm9wKSByZXR1cm4gMDsKICAgICBwcm9wICAgPSAqcHByb3A7CmRpZmYgLS1naXQgYS93aW5kb3dzL3N5c2NvbG9yLmMgYi93aW5kb3dzL3N5c2NvbG9yLmMKaW5kZXggNDVkMmY3My4uZGQ0OTBhOSAxMDA2NDQKLS0tIGEvd2luZG93cy9zeXNjb2xvci5jCisrKyBiL3dpbmRvd3Mvc3lzY29sb3IuYwpAQCAtNiwxNiArNiwxMSBAQAogICoKICAqLwogCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CiAjaW5jbHVkZSA8c3RkaW8uaD4KICNpbmNsdWRlIDxzdGRsaWIuaD4KICNpbmNsdWRlICJnZGkuaCIKLSNpbmNsdWRlICJzeXNjb2xvci5oIgotI2luY2x1ZGUgInN0ZGRlYnVnLmgiCiAjaW5jbHVkZSAidHdlYWsuaCIKLS8qICNkZWZpbmUgREVCVUdfU1lTQ09MT1IgKi8KLSNpbmNsdWRlICJkZWJ1Zy5oIgotCi1zdHJ1Y3QgU3lzQ29sb3JPYmplY3RzIHN5c0NvbG9yT2JqZWN0czsKIAogc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBEZWZTeXNDb2xvcnNbXSA9CiB7CkBAIC03OSw2ICs3NCw4IEBACiAjZGVmaW5lIE5VTV9TWVNfQ09MT1JTICAgICAoQ09MT1JfSU5GT0JLKzEpCiAKIHN0YXRpYyBDT0xPUlJFRiBTeXNDb2xvcnNbTlVNX1NZU19DT0xPUlNdOworc3RhdGljIEhCUlVTSDMyIFN5c0NvbG9yQnJ1c2hlc1tOVU1fU1lTX0NPTE9SU107CitzdGF0aWMgSFBFTjMyICAgU3lzQ29sb3JQZW5zW05VTV9TWVNfQ09MT1JTXTsKIAogI2RlZmluZSBNQUtFX1NPTElEKGNvbG9yKSBcCiAgICAgICAgKFBBTEVUVEVJTkRFWChHZXROZWFyZXN0UGFsZXR0ZUluZGV4MzIoU1RPQ0tfREVGQVVMVF9QQUxFVFRFLChjb2xvcikpKSkKQEAgLTkwLDExNCArODcsMTAgQEAKIHsKICAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IE5VTV9TWVNfQ09MT1JTKSByZXR1cm47CiAgICAgU3lzQ29sb3JzW2luZGV4XSA9IGNvbG9yOwotICAgIHN3aXRjaChpbmRleCkKLSAgICB7Ci0gICAgY2FzZSBDT0xPUl9TQ1JPTExCQVI6Ci0JRGVsZXRlT2JqZWN0MzIoIHN5c0NvbG9yT2JqZWN0cy5oYnJ1c2hTY3JvbGxiYXIgKTsKLQlzeXNDb2xvck9iamVjdHMuaGJydXNoU2Nyb2xsYmFyID0gQ3JlYXRlU29saWRCcnVzaDMyKCBjb2xvciApOwotCWJyZWFrOwotICAgIGNhc2UgQ09MT1JfQkFDS0dST1VORDoKLQlEZWxldGVPYmplY3QzMiggc3lzQ29sb3JPYmplY3RzLmhicnVzaEJhY2tncm91bmQgKTsKLQlzeXNDb2xvck9iamVjdHMuaGJydXNoQmFja2dyb3VuZCA9IENyZWF0ZVNvbGlkQnJ1c2gzMiggY29sb3IgKTsKLQlicmVhazsKLSAgICBjYXNlIENPTE9SX0FDVElWRUNBUFRJT046Ci0JRGVsZXRlT2JqZWN0MzIoIHN5c0NvbG9yT2JqZWN0cy5oYnJ1c2hBY3RpdmVDYXB0aW9uICk7Ci0Jc3lzQ29sb3JPYmplY3RzLmhicnVzaEFjdGl2ZUNhcHRpb24gPSBDcmVhdGVTb2xpZEJydXNoMzIoIGNvbG9yICk7Ci0JYnJlYWs7Ci0gICAgY2FzZSBDT0xPUl9JTkFDVElWRUNBUFRJT046Ci0JRGVsZXRlT2JqZWN0MzIoIHN5c0NvbG9yT2JqZWN0cy5oYnJ1c2hJbmFjdGl2ZUNhcHRpb24gKTsKLQlzeXNDb2xvck9iamVjdHMuaGJydXNoSW5hY3RpdmVDYXB0aW9uID0gQ3JlYXRlU29saWRCcnVzaDMyKCBjb2xvciApOwotCWJyZWFrOwotICAgIGNhc2UgQ09MT1JfTUVOVToKLQlEZWxldGVPYmplY3QzMiggc3lzQ29sb3JPYmplY3RzLmhicnVzaE1lbnUgKTsKLQlzeXNDb2xvck9iamVjdHMuaGJydXNoTWVudSA9IENyZWF0ZVNvbGlkQnJ1c2gzMiggTUFLRV9TT0xJRChjb2xvcikgKTsKLQlicmVhazsKLSAgICBjYXNlIENPTE9SX1dJTkRPVzoKLQlEZWxldGVPYmplY3QzMiggc3lzQ29sb3JPYmplY3RzLmhicnVzaFdpbmRvdyApOwotCXN5c0NvbG9yT2JqZWN0cy5oYnJ1c2hXaW5kb3cgPSBDcmVhdGVTb2xpZEJydXNoMzIoIGNvbG9yICk7Ci0JYnJlYWs7Ci0gICAgY2FzZSBDT0xPUl9XSU5ET1dGUkFNRToKLQlEZWxldGVPYmplY3QzMiggc3lzQ29sb3JPYmplY3RzLmhicnVzaFdpbmRvd0ZyYW1lICk7Ci0Jc3lzQ29sb3JPYmplY3RzLmhicnVzaFdpbmRvd0ZyYW1lID0gQ3JlYXRlU29saWRCcnVzaDMyKCBjb2xvciApOwotCS8qIEZJWE1FOiB3ZSBzaG91bGQgbm90IG5lZWQgdGhpcyBwZW4gKi8KLQlEZWxldGVPYmplY3QzMiggc3lzQ29sb3JPYmplY3RzLmhwZW5XaW5kb3dGcmFtZSApOyAKLQlzeXNDb2xvck9iamVjdHMuaHBlbldpbmRvd0ZyYW1lID0gQ3JlYXRlUGVuMzIoIFBTX1NPTElELCAxLCBjb2xvciApOwotCWJyZWFrOwotICAgIGNhc2UgQ09MT1JfTUVOVVRFWFQ6Ci0JRGVsZXRlT2JqZWN0MzIoIHN5c0NvbG9yT2JqZWN0cy5oYnJ1c2hNZW51VGV4dCApOwotCXN5c0NvbG9yT2JqZWN0cy5oYnJ1c2hNZW51VGV4dCA9IENyZWF0ZVNvbGlkQnJ1c2gzMiggY29sb3IgKTsKLQlicmVhazsKLSAgICBjYXNlIENPTE9SX1dJTkRPV1RFWFQ6Ci0JRGVsZXRlT2JqZWN0MzIoIHN5c0NvbG9yT2JqZWN0cy5oYnJ1c2hXaW5kb3dUZXh0ICk7Ci0Jc3lzQ29sb3JPYmplY3RzLmhicnVzaFdpbmRvd1RleHQgPSBDcmVhdGVTb2xpZEJydXNoMzIoIGNvbG9yICk7Ci0JLyogRklYTUU6IHdlIHNob3VsZCBub3QgbmVlZCB0aGlzIHBlbiAqLwotCURlbGV0ZU9iamVjdDMyKCBzeXNDb2xvck9iamVjdHMuaHBlbldpbmRvd1RleHQgKTsKLQlzeXNDb2xvck9iamVjdHMuaHBlbldpbmRvd1RleHQgPSBDcmVhdGVQZW4zMiggUFNfRE9ULCAxLCBjb2xvciApOwotCWJyZWFrOwotICAgIGNhc2UgQ09MT1JfQ0FQVElPTlRFWFQ6Ci0JRGVsZXRlT2JqZWN0MzIoIHN5c0NvbG9yT2JqZWN0cy5oYnJ1c2hDYXB0aW9uVGV4dCApOwotCXN5c0NvbG9yT2JqZWN0cy5oYnJ1c2hDYXB0aW9uVGV4dCA9IENyZWF0ZVNvbGlkQnJ1c2gzMiggY29sb3IgKTsKLQlicmVhazsKLSAgICBjYXNlIENPTE9SX0FDVElWRUJPUkRFUjoKLQlEZWxldGVPYmplY3QzMiggc3lzQ29sb3JPYmplY3RzLmhicnVzaEFjdGl2ZUJvcmRlciApOwotCXN5c0NvbG9yT2JqZWN0cy5oYnJ1c2hBY3RpdmVCb3JkZXIgPSBDcmVhdGVTb2xpZEJydXNoMzIoIGNvbG9yICk7Ci0JYnJlYWs7Ci0gICAgY2FzZSBDT0xPUl9JTkFDVElWRUJPUkRFUjoKLQlEZWxldGVPYmplY3QzMiggc3lzQ29sb3JPYmplY3RzLmhicnVzaEluYWN0aXZlQm9yZGVyICk7Ci0Jc3lzQ29sb3JPYmplY3RzLmhicnVzaEluYWN0aXZlQm9yZGVyID0gQ3JlYXRlU29saWRCcnVzaDMyKCBjb2xvciApOwotCWJyZWFrOwotICAgIGNhc2UgQ09MT1JfQVBQV09SS1NQQUNFOgotCURlbGV0ZU9iamVjdDMyKCBzeXNDb2xvck9iamVjdHMuaGJydXNoQXBwV29ya3NwYWNlICk7Ci0Jc3lzQ29sb3JPYmplY3RzLmhicnVzaEFwcFdvcmtzcGFjZSA9IENyZWF0ZVNvbGlkQnJ1c2gzMiggY29sb3IgKTsKLQlicmVhazsKLSAgICBjYXNlIENPTE9SX0hJR0hMSUdIVDoKLQlEZWxldGVPYmplY3QzMiggc3lzQ29sb3JPYmplY3RzLmhicnVzaEhpZ2hsaWdodCApOwotCXN5c0NvbG9yT2JqZWN0cy5oYnJ1c2hIaWdobGlnaHQgPSBDcmVhdGVTb2xpZEJydXNoMzIoIGNvbG9yICk7Ci0JYnJlYWs7Ci0gICAgY2FzZSBDT0xPUl9ISUdITElHSFRURVhUOgotCURlbGV0ZU9iamVjdDMyKCBzeXNDb2xvck9iamVjdHMuaGJydXNoSGlnaGxpZ2h0VGV4dCApOwotCXN5c0NvbG9yT2JqZWN0cy5oYnJ1c2hIaWdobGlnaHRUZXh0ID0gQ3JlYXRlU29saWRCcnVzaDMyKCBjb2xvciApOwotCWJyZWFrOwotICAgIGNhc2UgQ09MT1JfQlRORkFDRToKLQlEZWxldGVPYmplY3QzMiggc3lzQ29sb3JPYmplY3RzLmhicnVzaEJ0bkZhY2UgKTsKLQlzeXNDb2xvck9iamVjdHMuaGJydXNoQnRuRmFjZSA9IENyZWF0ZVNvbGlkQnJ1c2gzMiggY29sb3IgKTsKLQlicmVhazsKLSAgICBjYXNlIENPTE9SX0JUTlNIQURPVzoKLQlEZWxldGVPYmplY3QzMiggc3lzQ29sb3JPYmplY3RzLmhicnVzaEJ0blNoYWRvdyApOwotCXN5c0NvbG9yT2JqZWN0cy5oYnJ1c2hCdG5TaGFkb3cgPSBDcmVhdGVTb2xpZEJydXNoMzIoIGNvbG9yICk7Ci0JYnJlYWs7Ci0gICAgY2FzZSBDT0xPUl9HUkFZVEVYVDoKLQlEZWxldGVPYmplY3QzMiggc3lzQ29sb3JPYmplY3RzLmhicnVzaEdyYXlUZXh0ICk7Ci0Jc3lzQ29sb3JPYmplY3RzLmhicnVzaEdyYXlUZXh0ID0gQ3JlYXRlU29saWRCcnVzaDMyKCBjb2xvciApOwotICAgIGNhc2UgQ09MT1JfQlROVEVYVDoKLQlEZWxldGVPYmplY3QzMiggc3lzQ29sb3JPYmplY3RzLmhicnVzaEJ0blRleHQgKTsKLQlzeXNDb2xvck9iamVjdHMuaGJydXNoQnRuVGV4dCA9IENyZWF0ZVNvbGlkQnJ1c2gzMiggY29sb3IgKTsKLQlicmVhazsKLSAgICBjYXNlIENPTE9SX0lOQUNUSVZFQ0FQVElPTlRFWFQ6Ci0JRGVsZXRlT2JqZWN0MzIoIHN5c0NvbG9yT2JqZWN0cy5oYnJ1c2hJbmFjdGl2ZUNhcHRpb25UZXh0ICk7Ci0Jc3lzQ29sb3JPYmplY3RzLmhicnVzaEluYWN0aXZlQ2FwdGlvblRleHQgPSBDcmVhdGVTb2xpZEJydXNoMzIoY29sb3IpOwotCWJyZWFrOwotICAgIGNhc2UgQ09MT1JfQlROSElHSExJR0hUOgotCURlbGV0ZU9iamVjdDMyKCBzeXNDb2xvck9iamVjdHMuaGJydXNoQnRuSGlnaGxpZ2h0ICk7Ci0Jc3lzQ29sb3JPYmplY3RzLmhicnVzaEJ0bkhpZ2hsaWdodCA9IENyZWF0ZVNvbGlkQnJ1c2gzMiggY29sb3IgKTsKLQlicmVhazsKLSAgICBjYXNlIENPTE9SXzNEREtTSEFET1c6Ci0JRGVsZXRlT2JqZWN0MzIoIHN5c0NvbG9yT2JqZWN0cy5oYnJ1c2gzRERrU2hhZG93ICk7Ci0Jc3lzQ29sb3JPYmplY3RzLmhicnVzaDNERGtTaGFkb3cgPSBDcmVhdGVTb2xpZEJydXNoMzIoIGNvbG9yICk7Ci0JYnJlYWs7Ci0gICAgY2FzZSBDT0xPUl8zRExJR0hUOgotCURlbGV0ZU9iamVjdDMyKCBzeXNDb2xvck9iamVjdHMuaGJydXNoM0RMaWdodCApOwotCXN5c0NvbG9yT2JqZWN0cy5oYnJ1c2gzRExpZ2h0ID0gQ3JlYXRlU29saWRCcnVzaDMyKCBjb2xvciApOwotCWJyZWFrOwotICAgIGNhc2UgQ09MT1JfSU5GT1RFWFQ6Ci0JRGVsZXRlT2JqZWN0MzIoIHN5c0NvbG9yT2JqZWN0cy5oYnJ1c2hJbmZvVGV4dCApOwotCXN5c0NvbG9yT2JqZWN0cy5oYnJ1c2hJbmZvVGV4dCA9IENyZWF0ZVNvbGlkQnJ1c2gzMiggY29sb3IgKTsKLQlicmVhazsKLSAgICBjYXNlIENPTE9SX0lORk9CSzoKLQlEZWxldGVPYmplY3QzMiggc3lzQ29sb3JPYmplY3RzLmhicnVzaEluZm9CayApOwotCXN5c0NvbG9yT2JqZWN0cy5oYnJ1c2hJbmZvQmsgPSBDcmVhdGVTb2xpZEJydXNoMzIoIGNvbG9yICk7Ci0JYnJlYWs7Ci0gICAgfQorICAgIGlmIChTeXNDb2xvckJydXNoZXNbaW5kZXhdKSBEZWxldGVPYmplY3QzMiggU3lzQ29sb3JCcnVzaGVzW2luZGV4XSApOworICAgIFN5c0NvbG9yQnJ1c2hlc1tpbmRleF0gPSBDcmVhdGVTb2xpZEJydXNoMzIoIGNvbG9yICk7CisgICAgaWYgKFN5c0NvbG9yUGVuc1tpbmRleF0pIERlbGV0ZU9iamVjdDMyKCBTeXNDb2xvclBlbnNbaW5kZXhdICk7IAorICAgIFN5c0NvbG9yUGVuc1tpbmRleF0gPSBDcmVhdGVQZW4zMiggUFNfU09MSUQsIDEsIGNvbG9yICk7CiB9CiAKIApAQCAtMjg4LDMgKzE4MSw0OSBAQAogICAgICAgICAgICAgICAgIFJEV19JTlZBTElEQVRFIHwgUkRXX0VSQVNFIHwgUkRXX1VQREFURU5PVyB8IFJEV19BTExDSElMRFJFTiApOwogICAgIHJldHVybiBUUlVFOwogfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIEdldFN5c0NvbG9yQnJ1c2gxNiAgICAoVVNFUi4yODEpCisgKi8KK0hCUlVTSDE2IFdJTkFQSSBHZXRTeXNDb2xvckJydXNoMTYoIElOVDE2IGluZGV4ICkKK3sKKyAgICByZXR1cm4gKEhCUlVTSDE2KUdldFN5c0NvbG9yQnJ1c2gzMihpbmRleCk7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgR2V0U3lzQ29sb3JCcnVzaDMyICAgIChVU0VSMzIuMjg5KQorICovCitIQlJVU0gzMiBXSU5BUEkgR2V0U3lzQ29sb3JCcnVzaDMyKCBJTlQzMiBpbmRleCApCit7CisgICAgaWYgKDAgPD0gaW5kZXggJiYgaW5kZXggPCBOVU1fU1lTX0NPTE9SUykKKyAgICAgICAgcmV0dXJuIFN5c0NvbG9yQnJ1c2hlc1tpbmRleF07CisgICAgZnByaW50Ziggc3RkZXJyLCAiR2V0U3lzQ29sb3JCcnVzaDMyOiBVbmtub3duIGluZGV4KCVkKVxuIiwgaW5kZXggKTsKKyAgICByZXR1cm4gR2V0U3RvY2tPYmplY3QzMihMVEdSQVlfQlJVU0gpOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIEdldFN5c0NvbG9yUGVuMTYgICAgKE5vdCBhIFdpbmRvd3MgQVBJKQorICovCitIUEVOMTYgV0lOQVBJIEdldFN5c0NvbG9yUGVuMTYoIElOVDE2IGluZGV4ICkKK3sKKyAgICByZXR1cm4gKEhQRU4xNilHZXRTeXNDb2xvclBlbjMyKGluZGV4KTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBHZXRTeXNDb2xvclBlbjMyICAgIChOb3QgYSBXaW5kb3dzIEFQSSkKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIG5ldyB0byB0aGUgV2luZSBsaWIgLS0gaXQgZG9lcyBub3QgZXhpc3QgaW4gCisgKiBXaW5kb3dzLiBIb3dldmVyLCBpdCBpcyBhIG5hdHVyYWwgY29tcGxlbWVudCBmb3IgR2V0U3lzQ29sb3JCcnVzaAorICogaW4gdGhlIFdpbjMyIEFQSSBhbmQgaXMgbmVlZGVkIHF1aXRlIGEgYml0IGluc2lkZSBXaW5lLgorICovCitIUEVOMzIgV0lOQVBJIEdldFN5c0NvbG9yUGVuMzIoIElOVDMyIGluZGV4ICkKK3sKKyAgICAvKiBXZSBjYW4gYXNzZXJ0IGhlcmUsIGJlY2F1c2UgdGhpcyBmdW5jdGlvbiBpcyBpbnRlcm5hbCB0byBXaW5lICovCisgICAgYXNzZXJ0ICgwIDw9IGluZGV4ICYmIGluZGV4IDwgTlVNX1NZU19DT0xPUlMpOworICAgIHJldHVybiBTeXNDb2xvclBlbnNbaW5kZXhdOworCit9Cg==