Re: Build dlz_ldap_driver under Windows
Roman Volkov <[email protected]> Thu, 20 Jun 2013 22:46:51 +1000
| Newsgroups | gmane.network.dns.bind9.dlz |
|---|---|
| Message-ID | <CADkhqTn=UYTCedzZSUA-mfMV_RX1agJdzeEWf+a6A4zdH6H14Q@mail.gmail.com> |
--047d7b6dcf5220190004df9557f0 Content-Type: multipart/alternative; boundary=047d7b6dcf522018fd04df9557ee --047d7b6dcf522018fd04df9557ee Content-Type: text/plain; charset=ISO-8859-1 Hi Evan, I successfully built old dlz-ldap driver (which should be compiled into bind) without OpenLDAP library (OpenLDAP doesn't support native windows build for several years already, this was a real pain, only with cygwin or mingw evironment). I patched dlz_ldap_driver.c to use native Windows WinLDAP which is available in every Windows (at least on my Win 7). Also I was able to build named+dlz-ldap natively under Windows with Visual Studio Express. It works - I tested several direct and reverse zones and AXFR calls with dlz-ldap (with openldap as a server). Changes only in dlz_ldap_driver.c, to enable it you need to install pre-processor directives /D DLZ /D DLZ_LDAP /D CONTRIB_DLZ Code is ugly, I had to copy several functions from openldap library. Don't wish to spend too much time for deprecated branch, will try to repeat all the same for bind 10 and for dynamically loadable dlz. But may be somebody will find this file useful. Regards, Roman --047d7b6dcf522018fd04df9557ee Content-Type: text/html; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable <div dir=3D"ltr">Hi Evan,<div><br></div><div>I successfully built old dlz-l= dap driver (which should be compiled into bind) without OpenLDAP library (O= penLDAP doesn't support native windows build for several years already,= this was a real pain, only with cygwin or mingw evironment).</div> <div>I patched dlz_ldap_driver.c to use native Windows WinLDAP which is ava= ilable in every Windows (at least on my Win 7). Also I was able to build na= med+dlz-ldap natively under Windows with Visual Studio Express. It works - = I tested several direct and reverse zones and AXFR calls with dlz-ldap (wit= h openldap as a server).</div> <div><div class=3D"gmail_extra" style>Changes only in dlz_ldap_driver.c, to= enable it you need to install pre-processor directives /D DLZ /D DLZ_LDAP = /D CONTRIB_DLZ </div></div><div class=3D"gmail_extra" style>Code is ugly, I had to copy se= veral functions from openldap library.</div><div class=3D"gmail_extra" styl= e>Don't wish to spend too much time for deprecated branch, will try to = repeat all the same for bind 10 and for dynamically loadable dlz.</div> <div class=3D"gmail_extra" style><br></div><div class=3D"gmail_extra" style= >But may be somebody will find this file useful.</div><div class=3D"gmail_e= xtra" style><br></div><div class=3D"gmail_extra" style>Regards,</div><div c= lass=3D"gmail_extra" style> Roman</div><div class=3D"gmail_extra"><br></div></div> --047d7b6dcf522018fd04df9557ee-- --047d7b6dcf5220190004df9557f0 Content-Type: text/x-csrc; charset=US-ASCII; name="dlz_ldap_driver.c" Content-Disposition: attachment; filename="dlz_ldap_driver.c" Content-Transfer-Encoding: base64 X-Attachment-Id: f_hi5xlt460 LyoNCiAqIENvcHlyaWdodCAoQykgMjAwMiBTdGljaHRpbmcgTkxuZXQsIE5ldGhlcmxhbmRzLCBz dGljaHRpbmdAbmxuZXQubmwuDQogKg0KICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlm eSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55DQogKiBwdXJwb3NlIHdpdGgg b3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlDQogKiBh Ym92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBp biBhbGwNCiAqIGNvcGllcy4NCiAqDQogKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElT IiBBTkQgU1RJQ0hUSU5HIE5MTkVUDQogKiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSCBS RUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMDQogKiBJTVBMSUVEIFdBUlJBTlRJ RVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTA0KICog U1RJQ0hUSU5HIE5MTkVUIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJF Q1QsIE9SDQogKiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZF UiBSRVNVTFRJTkcgRlJPTSBMT1NTDQogKiBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhF UiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UNCiAqIE9SIE9USEVSIFRPUlRJ T1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRQ0KICog VVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuDQogKg0KICogVGhlIGRldmVsb3Bt ZW50IG9mIER5bmFtaWNhbGx5IExvYWRhYmxlIFpvbmVzIChETFopIGZvciBCSU5EIDkgd2FzDQog KiBjb25jZWl2ZWQgYW5kIGNvbnRyaWJ1dGVkIGJ5IFJvYiBCdXRsZXIuDQogKg0KICogUGVybWlz c2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBm b3IgYW55DQogKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQs IHByb3ZpZGVkIHRoYXQgdGhlDQogKiBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBl cm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwNCiAqIGNvcGllcy4NCiAqDQogKiBUSEUgU09G VFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgUk9CIEJVVExFUg0KICogRElTQ0xBSU1TIEFM TCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTA0K ICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4g Tk8gRVZFTlQgU0hBTEwNCiAqIFJPQiBCVVRMRVIgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwg RElSRUNULCBJTkRJUkVDVCwgT1INCiAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFN QUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MNCiAqIE9GIFVTRSwgREFUQSBPUiBQ Uk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRQ0KICog T1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9O IFdJVEggVEhFDQogKiBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4NCiAqLw0K DQovKg0KICogQ29weXJpZ2h0IChDKSAxOTk5LTIwMDEgIEludGVybmV0IFNvZnR3YXJlIENvbnNv cnRpdW0uDQogKg0KICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3Ry aWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55DQogKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBm ZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlDQogKiBjb3B5cmln aHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVz Lg0KICoNCiAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBJTlRFUk5FVCBT T0ZUV0FSRSBDT05TT1JUSVVNDQogKiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdB UkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMDQogKiBJTVBMSUVEIFdBUlJBTlRJRVMg T0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTA0KICogSU5U RVJORVQgU09GVFdBUkUgQ09OU09SVElVTSBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJF Q1QsDQogKiBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VT IFdIQVRTT0VWRVIgUkVTVUxUSU5HDQogKiBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJ VFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULA0KICogTkVHTElHRU5DRSBPUiBP VEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04NCiAq IFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLg0KICovDQoNCiNp ZmRlZiBETFpfTERBUA0KDQojaW5jbHVkZSA8Y29uZmlnLmg+DQojaW5jbHVkZSA8c3RkaW8uaD4N CiNpbmNsdWRlIDxzdHJpbmcuaD4NCiNpbmNsdWRlIDxzdGRsaWIuaD4NCiNpbmNsdWRlIDxhc3Nl cnQuaD4NCg0KI2luY2x1ZGUgPGRucy9sb2cuaD4NCiNpbmNsdWRlIDxkbnMvc2Rsei5oPg0KI2lu Y2x1ZGUgPGRucy9yZXN1bHQuaD4NCg0KI2luY2x1ZGUgPGlzYy9tZW0uaD4NCiNpbmNsdWRlIDxp c2MvcGxhdGZvcm0uaD4NCiNpbmNsdWRlIDxpc2MvcHJpbnQuaD4NCiNpbmNsdWRlIDxpc2MvcmVz dWx0Lmg+DQojaW5jbHVkZSA8aXNjL3N0cmluZy5oPg0KI2luY2x1ZGUgPGlzYy91dGlsLmg+DQoN CiNpbmNsdWRlIDxuYW1lZC9nbG9iYWxzLmg+DQoNCiNpbmNsdWRlIDxkbHovc2Rsel9oZWxwZXIu aD4NCiNpbmNsdWRlIDxkbHovZGx6X2xkYXBfZHJpdmVyLmg+DQoNCi8qDQogKiBOZWVkIG9sZGVy IEFQSSBmdW5jdGlvbnMgZnJvbSBsZGFwLmguDQogKi8NCiNkZWZpbmUgTERBUF9ERVBSRUNBVEVE IDENCg0KI2lmZGVmIF9XSU4zMg0KI2luY2x1ZGUgIndpbmRvd3MuaCINCiNpbmNsdWRlICJ3aW5s ZGFwLmgiDQojaW5jbHVkZSAid2luYmVyLmgiDQojZGVmaW5lIHRpbWV2YWwgbF90aW1ldmFsDQp0 eXBlZGVmIFVMT05HIGxkYXBpX3Q7DQoNCi8vdHlwZWRlZiBzdHJ1Y3QgYmVydmFsIHsKLy8JYmVy X2xlbl90CWJ2X2xlbjsKLy8JY2hhcgkJKmJ2X3ZhbDsKLy99IEJlclZhbHVlOwovL3R5cGVkZWYg QmVyVmFsdWUgKkJlclZhcnJheTsJLyogVG8gZGlzdGluZ3Vpc2ggZnJvbSBhIHNpbmdsZSBidiAq Lw0KDQoNCnR5cGVkZWYgc3RydWN0IGxkYXBfdXJsX2Rlc2Mgew0KICAgIGNoYXIgKiAgICAgIGx1 ZF9zY2hlbWU7ICAgICAvKiBVUkkgc2NoZW1lICovDQogICAgY2hhciAqICAgICAgbHVkX2hvc3Q7 ICAgICAgIC8qIExEQVAgaG9zdCB0byBjb250YWN0ICovDQogICAgaW50ICAgICAgICAgbHVkX3Bv cnQ7ICAgICAgIC8qIHBvcnQgb24gaG9zdCAqLw0KICAgIGNoYXIgKiAgICAgIGx1ZF9kbjsgICAg ICAgICAvKiBiYXNlIGZvciBzZWFyY2ggKi8NCiAgICBjaGFyICoqICAgICBsdWRfYXR0cnM7ICAg ICAgLyogbGlzdCBvZiBhdHRyaWJ1dGVzICovDQogICAgaW50ICAgICAgICAgbHVkX3Njb3BlOyAg ICAgIC8qIGEgTERBUF9TQ09QRV8uLi4gdmFsdWUgKi8NCiAgICBjaGFyICogICAgICBsdWRfZmls dGVyOyAgICAgLyogTERBUCBzZWFyY2ggZmlsdGVyICovDQogICAgY2hhciAqKiAgICAgbHVkX2V4 dHM7ICAgICAgIC8qIExEQVAgZXh0ZW5zaW9ucyAqLw0KICAgIGludCAgICAgICAgIGx1ZF9jcml0 X2V4dHM7ICAvKiB0cnVlIGlmIGFueSBleHRlbnNpb24gaXMgY3JpdGljYWwgKi8NCiAgICAvKiBt YXkgY29udGFpbiBhZGRpdGlvbmFsIGZpZWxkcyBmb3IgaW50ZXJuYWwgdXNlICovDQp9IExEQVBV UkxEZXNjOw0KI2RlZmluZSBMREFQX0FVVEhfS1JCVjQxIDk5DQojZGVmaW5lIExEQVBfQVVUSF9L UkJWNDIgOTkNCg0KI2RlZmluZSBMREFQX1VSTF9TVUNDRVNTCQkweDAwCS8qIFN1Y2Nlc3MgKi8N CiNkZWZpbmUgTERBUF9VUkxfRVJSX01FTQkJMHgwMQkvKiBjYW4ndCBhbGxvY2F0ZSBtZW1vcnkg c3BhY2UgKi8NCiNkZWZpbmUgTERBUF9VUkxfRVJSX1BBUkFNCQkweDAyCS8qIHBhcmFtZXRlciBp cyBiYWQgKi8NCg0KI2RlZmluZSBMREFQX1VSTF9FUlJfQkFEU0NIRU1FCTB4MDMJLyogVVJMIGRv ZXNuJ3QgYmVnaW4gd2l0aCAibGRhcFtzaV06Ly8iICovDQojZGVmaW5lIExEQVBfVVJMX0VSUl9C QURFTkNMT1NVUkUgMHgwNAkvKiBVUkwgaXMgbWlzc2luZyB0cmFpbGluZyAiPiIgKi8NCiNkZWZp bmUgTERBUF9VUkxfRVJSX0JBRFVSTAkJMHgwNQkvKiBVUkwgaXMgYmFkICovDQojZGVmaW5lIExE QVBfVVJMX0VSUl9CQURIT1NUCTB4MDYJLyogaG9zdCBwb3J0IGlzIGJhZCAqLw0KI2RlZmluZSBM REFQX1VSTF9FUlJfQkFEQVRUUlMJMHgwNwkvKiBiYWQgKG9yIG1pc3NpbmcpIGF0dHJpYnV0ZXMg Ki8NCiNkZWZpbmUgTERBUF9VUkxfRVJSX0JBRFNDT1BFCTB4MDgJLyogc2NvcGUgc3RyaW5nIGlz IGludmFsaWQgKG9yIG1pc3NpbmcpICovDQojZGVmaW5lIExEQVBfVVJMX0VSUl9CQURGSUxURVIJ MHgwOQkvKiBiYWQgb3IgbWlzc2luZyBmaWx0ZXIgKi8NCiNkZWZpbmUgTERBUF9VUkxfRVJSX0JB REVYVFMJMHgwYQkvKiBiYWQgb3IgbWlzc2luZyBleHRlbnNpb25zICovDQoNCiNkZWZpbmUgU1RS TEVOT0YocykJKHNpemVvZihzKS0xKQ0KDQoNCnZvaWQgKg0KYmVyX21lbWFsbG9jX3goIGJlcl9s ZW5fdCBzLCB2b2lkICpjdHggKQ0Kew0KCXZvaWQgKm5uZXc7DQoJbm5ldyA9IG1hbGxvYyhzKTsN CglyZXR1cm4gbm5ldzsNCn0NCg0Kdm9pZCAqDQogYmVyX21lbWNhbGxvY194KCBiZXJfbGVuX3Qg biwgYmVyX2xlbl90IHMsIHZvaWQgKmN0eCkNCiAgew0KICAgICAgdm9pZCAqbm5ldzsNCgkgIG5u ZXcgPSBjYWxsb2MoIG4sIHMgKTsNCiAgICAgIHJldHVybiBubmV3Ow0KICB9DQojZGVmaW5lIFNB RkVNRU1DUFkoIGQsIHMsIG4gKSAJbWVtbW92ZSgoZCksIChzKSwgKG4pKQ0KI2RlZmluZSBBQ19N RU1DUFkoIGQsIHMsIG4gKSAoU0FGRU1FTUNQWSgoZCksKHMpLChuKSkpDQpjaGFyICoKYmVyX3N0 cmR1cF94KCBjb25zdCBjaGFyICpzLCB2b2lkICpjdHggKQp7CgljaGFyICAgICpwOwoJc2l6ZV90 CWxlbjsKCWlmKCBzID09IE5VTEwgKSB7CgkJcmV0dXJuIE5VTEw7Cgl9CgoJbGVuID0gc3RybGVu KCBzICkgKyAxOwoJaWYgKCAocCA9IChjaGFyKikgYmVyX21lbWFsbG9jX3goIGxlbiwgY3R4ICkp ICE9IE5VTEwgKSB7CgkJQUNfTUVNQ1BZKCBwLCBzLCBsZW4gKTsKCX0KCglyZXR1cm4gcDsKfQ0K DQp2b2lkDQpiZXJfbWVtZnJlZV94KCB2b2lkICpwLCB2b2lkICpjdHggKQ0Kew0KCWlmKCBwID09 IE5VTEwgKSB7DQoJCXJldHVybjsNCgl9DQoJCWZyZWUoIHAgKTsNCgkJcmV0dXJuOw0KfQ0KDQp2 b2lkCmJlcl9tZW12ZnJlZV94KCB2b2lkICoqdmVjLCB2b2lkICpjdHggKQp7CglpbnQJaTsKCglp ZiggdmVjID09IE5VTEwgKSB7CgkJcmV0dXJuOwoJfQoKCglmb3IgKCBpID0gMDsgdmVjW2ldICE9 IE5VTEw7IGkrKyApIHsKCQliZXJfbWVtZnJlZV94KCB2ZWNbaV0sIGN0eCApOwoJfQoKCWJlcl9t ZW1mcmVlX3goIHZlYywgY3R4ICk7Cn0NCg0KI2RlZmluZSBMREFQX1VSTF9QUkVGSVggICAgICAg ICAibGRhcDovLyINCiNkZWZpbmUgTERBUF9VUkxfUFJFRklYX0xFTiAgICAgU1RSTEVOT0YoTERB UF9VUkxfUFJFRklYKQ0KI2RlZmluZSBMREFQU19VUkxfUFJFRklYCSJsZGFwczovLyINCiNkZWZp bmUgTERBUFNfVVJMX1BSRUZJWF9MRU4JU1RSTEVOT0YoTERBUFNfVVJMX1BSRUZJWCkNCiNkZWZp bmUgTERBUElfVVJMX1BSRUZJWAkibGRhcGk6Ly8iDQojZGVmaW5lIExEQVBJX1VSTF9QUkVGSVhf TEVOCVNUUkxFTk9GKExEQVBJX1VSTF9QUkVGSVgpDQojZGVmaW5lIExEQVBfVVJMX1VSTENPTE9O CSJVUkw6Ig0KI2RlZmluZSBMREFQX1VSTF9VUkxDT0xPTl9MRU4JU1RSTEVOT0YoTERBUF9VUkxf VVJMQ09MT04pDQoNCiNkZWZpbmUgTERBUF9SRUZfU1RSCQkiUmVmZXJyYWw6XG4iDQojZGVmaW5l IExEQVBfUkVGX1NUUl9MRU4JU1RSTEVOT0YoTERBUF9SRUZfU1RSKQ0KI2RlZmluZSBMREFQX0xE QVBfUkVGX1NUUglMREFQX1VSTF9QUkVGSVgNCiNkZWZpbmUgTERBUF9MREFQX1JFRl9TVFJfTEVO CUxEQVBfVVJMX1BSRUZJWF9MRU4NCg0KI2RlZmluZSBMREFQX0RFRkFVTFRfUkVGSE9QTElNSVQg NQ0KDQojZGVmaW5lIExEQVBfQk9PTF9SRUZFUlJBTFMJCTANCiNkZWZpbmUgTERBUF9CT09MX1JF U1RBUlQJCTENCiNkZWZpbmUgTERBUF9CT09MX1RMUwkJCTMNCiNkZWZpbmUJTERBUF9CT09MX0NP Tk5FQ1RfQVNZTkMJCTQNCiNkZWZpbmUJTERBUF9CT09MX1NBU0xfTk9DQU5PTgkJNQ0KDQojZGVm aW5lIExEQVBfQk9PTEVBTlMJdW5zaWduZWQgbG9uZw0KI2RlZmluZSBMREFQX0JPT0wobikJKChM REFQX0JPT0xFQU5TKTEgPDwgKG4pKQ0KI2RlZmluZSBMREFQX0JPT0xfR0VUKGxvLCBib29sKQlc DQoJKChsbyktPmxkb19ib29sZWFucyAmIExEQVBfQk9PTChib29sKSA/IC0xIDogMCkNCiNkZWZp bmUgTERBUF9CT09MX1NFVChsbywgYm9vbCkgKChsbyktPmxkb19ib29sZWFucyB8PSBMREFQX0JP T0woYm9vbCkpDQojZGVmaW5lIExEQVBfQk9PTF9DTFIobG8sIGJvb2wpICgobG8pLT5sZG9fYm9v bGVhbnMgJj0gfkxEQVBfQk9PTChib29sKSkNCiNkZWZpbmUgTERBUF9CT09MX1pFUk8obG8pICgo bG8pLT5sZG9fYm9vbGVhbnMgPSAwKQ0KDQojZGVmaW5lIExEQVBfUFZUX1VSTF9QQVJTRV9OT05F CQkJKDB4MDBVKQ0KI2RlZmluZSBMREFQX1BWVF9VUkxfUEFSU0VfTk9FTVBUWV9IT1NUCQkoMHgw MVUpDQojZGVmaW5lIExEQVBfUFZUX1VSTF9QQVJTRV9ERUZfUE9SVAkJKDB4MDJVKQ0KI2RlZmlu ZSBMREFQX1BWVF9VUkxfUEFSU0VfTk9FTVBUWV9ETgkJKDB4MDRVKQ0KI2RlZmluZSBMREFQX1BW VF9VUkxfUEFSU0VfTk9ERUZfU0NPUEUJCSgweDA4VSkNCiNkZWZpbmUJTERBUF9QVlRfVVJMX1BB UlNFX0hJU1RPUklDCQkoTERBUF9QVlRfVVJMX1BBUlNFX05PREVGX1NDT1BFIHwgXA0KCQkJCQkJ IExEQVBfUFZUX1VSTF9QQVJTRV9OT0VNUFRZX0hPU1QgfCBcDQoJCQkJCQkgTERBUF9QVlRfVVJM X1BBUlNFX0RFRl9QT1JUKQ0KDQojZGVmaW5lIExEQVBfTUFMTE9DKHMpCQkoYmVyX21lbWFsbG9j X3goKHMpLE5VTEwpKQ0KI2RlZmluZSBMREFQX0NBTExPQyhuLHMpCShiZXJfbWVtY2FsbG9jX3go KG4pLChzKSxOVUxMKSkNCiNkZWZpbmUgTERBUF9SRUFMTE9DKHAscykJKGJlcl9tZW1yZWFsbG9j X3goKHApLChzKSxOVUxMKSkNCiNkZWZpbmUgTERBUF9GUkVFKHApCQkoYmVyX21lbWZyZWVfeCgo cCksTlVMTCkpDQojZGVmaW5lIExEQVBfVkZSRUUodikJCShiZXJfbWVtdmZyZWVfeCgodm9pZCAq KikodiksTlVMTCkpDQojZGVmaW5lIExEQVBfU1RSRFVQKHMpCQkoYmVyX3N0cmR1cF94KChzKSxO VUxMKSkNCiNkZWZpbmUgTERBUF9TVFJORFVQKHMsbCkJKGJlcl9zdHJuZHVwX3goKHMpLChsKSxO VUxMKSkNCg0KI2RlZmluZSBMREFQX01BTExPQ1gocyx4KQkoYmVyX21lbWFsbG9jX3goKHMpLCh4 KSkpDQojZGVmaW5lIExEQVBfQ0FMTE9DWChuLHMseCkJKGJlcl9tZW1jYWxsb2NfeCgobiksKHMp LCh4KSkpDQojZGVmaW5lIExEQVBfUkVBTExPQ1gocCxzLHgpCShiZXJfbWVtcmVhbGxvY194KChw KSwocyksKHgpKSkNCiNkZWZpbmUgTERBUF9GUkVFWChwLHgpCQkoYmVyX21lbWZyZWVfeCgocCks KHgpKSkNCiNkZWZpbmUgTERBUF9WRlJFRVgodix4KQkoYmVyX21lbXZmcmVlX3goKHZvaWQgKiop KHYpLCh4KSkpDQojZGVmaW5lIExEQVBfU1RSRFVQWChzLHgpCShiZXJfc3RyZHVwX3goKHMpLCh4 KSkpDQojZGVmaW5lIExEQVBfU1RSTkRVUFgocyxsLHgpCShiZXJfc3RybmR1cF94KChzKSwobCks KHgpKSkNCg0KI2RlZmluZSBMREFQX1BST1RPX1RDUCAxIC8qIGxkYXA6Ly8gICovDQojZGVmaW5l IExEQVBfUFJPVE9fVURQIDIgLyogcmVzZXJ2ZWQgKi8NCiNkZWZpbmUgTERBUF9QUk9UT19JUEMg MyAvKiBsZGFwaTovLyAqLw0KI2RlZmluZSBMREFQX1BST1RPX0VYVCA0IC8qIHVzZXItZGVmaW5l ZCBzb2NrZXQvc29ja2J1ZiAqLw0KDQojZGVmaW5lIExEQVBfU0NPUEVfREVGQVVMVAkJKChiZXJf aW50X3QpIC0xKQkgLyogT3BlbkxEQVAgZXh0ZW5zaW9uICovDQoNCnN0YXRpYyBjb25zdCBjaGFy Kg0Kc2tpcF91cmxfcHJlZml4KA0KCWNvbnN0IGNoYXIgKnVybCwNCglpbnQgKmVuY2xvc2VkcCwN Cgljb25zdCBjaGFyICoqc2NoZW1lICkNCnsNCgkvKg0KIAkgKiByZXR1cm4gbm9uLXplcm8gaWYg dGhpcyBsb29rcyBsaWtlIGEgTERBUCBVUkw7IHplcm8gaWYgbm90DQogCSAqIGlmIG5vbi16ZXJv IHJldHVybmVkLCAqdXJscCB3aWxsIGJlIG1vdmVkIHBhc3QgImxkYXA6Ly8iIHBhcnQgb2YgVVJM DQogCSAqLw0KCWNvbnN0IGNoYXIgKnA7DQoJaWYgKCB1cmwgPT0gTlVMTCApIHsNCgkJcmV0dXJu KCBOVUxMICk7DQoJfQ0KCXAgPSB1cmw7DQoJLyogc2tpcCBsZWFkaW5nICc8JyAoaWYgYW55KSAq Lw0KCWlmICggKnAgPT0gJzwnICkgew0KCQkqZW5jbG9zZWRwID0gMTsNCgkJKytwOw0KCX0gZWxz ZSB7DQoJCSplbmNsb3NlZHAgPSAwOw0KCX0NCgkvKiBza2lwIGxlYWRpbmcgIlVSTDoiIChpZiBh bnkpICovDQoJaWYgKCBzdHJuY2FzZWNtcCggcCwgTERBUF9VUkxfVVJMQ09MT04sIExEQVBfVVJM X1VSTENPTE9OX0xFTiApID09IDAgKSB7DQoJCXAgKz0gTERBUF9VUkxfVVJMQ09MT05fTEVOOw0K CX0NCgkvKiBjaGVjayBmb3IgImxkYXA6Ly8iIHByZWZpeCAqLw0KCWlmICggc3RybmNhc2VjbXAo IHAsIExEQVBfVVJMX1BSRUZJWCwgTERBUF9VUkxfUFJFRklYX0xFTiApID09IDAgKSB7DQoJCS8q IHNraXAgb3ZlciAibGRhcDovLyIgcHJlZml4IGFuZCByZXR1cm4gc3VjY2VzcyAqLw0KCQlwICs9 IExEQVBfVVJMX1BSRUZJWF9MRU47DQoJCSpzY2hlbWUgPSAibGRhcCI7DQoJCXJldHVybiggcCAp Ow0KCX0NCgkvKiBjaGVjayBmb3IgImxkYXBzOi8vIiBwcmVmaXggKi8NCglpZiAoIHN0cm5jYXNl Y21wKCBwLCBMREFQU19VUkxfUFJFRklYLCBMREFQU19VUkxfUFJFRklYX0xFTiApID09IDAgKSB7 DQoJCS8qIHNraXAgb3ZlciAibGRhcHM6Ly8iIHByZWZpeCBhbmQgcmV0dXJuIHN1Y2Nlc3MgKi8N CgkJcCArPSBMREFQU19VUkxfUFJFRklYX0xFTjsNCgkJKnNjaGVtZSA9ICJsZGFwcyI7DQoJCXJl dHVybiggcCApOw0KCX0NCgkvKiBjaGVjayBmb3IgImxkYXBpOi8vIiBwcmVmaXggKi8NCglpZiAo IHN0cm5jYXNlY21wKCBwLCBMREFQSV9VUkxfUFJFRklYLCBMREFQSV9VUkxfUFJFRklYX0xFTiAp ID09IDAgKSB7DQoJCS8qIHNraXAgb3ZlciAibGRhcGk6Ly8iIHByZWZpeCBhbmQgcmV0dXJuIHN1 Y2Nlc3MgKi8NCgkJcCArPSBMREFQSV9VUkxfUFJFRklYX0xFTjsNCgkJKnNjaGVtZSA9ICJsZGFw aSI7DQoJCXJldHVybiggcCApOw0KCX0NCglyZXR1cm4oIE5VTEwgKTsNCn0NCg0KaW50DQpsZGFw X2lzX2xkYXBfdXJsKGNoYXIgKnVybCApDQp7DQoJaW50CWVuY2xvc2VkOw0KCWNvbnN0IGNoYXIg KiBzY2hlbWU7DQoJaWYoIHVybCA9PSBOVUxMICkgew0KCQlyZXR1cm4gMDsNCgl9DQoJaWYoIHNr aXBfdXJsX3ByZWZpeCggdXJsLCAmZW5jbG9zZWQsICZzY2hlbWUgKSA9PSBOVUxMICkgew0KCQly ZXR1cm4gMDsNCgl9DQoJcmV0dXJuIDE7DQp9DQoNCmludCBsZGFwX3B2dF91cmxfc2NoZW1lMnBy b3RvKCBjb25zdCBjaGFyICpzY2hlbWUgKQ0Kew0KCWFzc2VydCggc2NoZW1lICE9IE5VTEwgKTsN CglpZiggc2NoZW1lID09IE5VTEwgKSB7DQoJCXJldHVybiAtMTsNCgl9DQoJaWYoIHN0cmNtcCgi bGRhcCIsIHNjaGVtZSkgPT0gMCApIHsNCgkJcmV0dXJuIExEQVBfUFJPVE9fVENQOw0KCX0NCglp Ziggc3RyY21wKCJsZGFwaSIsIHNjaGVtZSkgPT0gMCApIHsNCgkJcmV0dXJuIExEQVBfUFJPVE9f SVBDOw0KCX0NCglpZiggc3RyY21wKCJsZGFwcyIsIHNjaGVtZSkgPT0gMCApIHsNCgkJcmV0dXJu IExEQVBfUFJPVE9fVENQOw0KCX0NCglyZXR1cm4gLTE7DQp9DQoNCiNkZWZpbmUgTERBUF9VVEY4 X0lTQVNDSUkocCkgKCAhKCooY29uc3QgdW5zaWduZWQgY2hhciAqKShwKSAmIDB4ODAgKSApDQoN CnR5cGVkZWYgYmVyX2ludF90IGxkYXBfdWNzNF90Ow0KI2RlZmluZSBMREFQX1VDUzRfSU5WQUxJ RCAoMHg4MDAwMDAwMFUpDQojdW5kZWYgYw0KI2RlZmluZSBjIGNvbnN0IGNoYXINCmMgbGRhcF91 dGY4X21pbnRhYltdID0gew0KCShjKTB4MjAsIChjKTB4ODAsIChjKTB4ODAsIChjKTB4ODAsIChj KTB4ODAsIChjKTB4ODAsIChjKTB4ODAsIChjKTB4ODAsDQoJKGMpMHg4MCwgKGMpMHg4MCwgKGMp MHg4MCwgKGMpMHg4MCwgKGMpMHg4MCwgKGMpMHg4MCwgKGMpMHg4MCwgKGMpMHg4MCwNCgkoYykw eDMwLCAoYykweDgwLCAoYykweDgwLCAoYykweDgwLCAoYykweDgwLCAoYykweDgwLCAoYykweDgw LCAoYykweDgwLA0KCShjKTB4MzgsIChjKTB4ODAsIChjKTB4ODAsIChjKTB4ODAsIChjKTB4M2Ms IChjKTB4ODAsIChjKTB4MDAsIChjKTB4MDAgfTsNCiN1bmRlZiBjDQpjb25zdCBjaGFyIGxkYXBf dXRmOF9sZW50YWJbXSA9IHsNCgkwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAw LCAwLCAwLCAwLA0KCTAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAs IDAsDQoJMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwNCgkw LCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLA0KCTAsIDAsIDIs IDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsDQoJMiwgMiwgMiwgMiwgMiwg MiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwNCgkzLCAzLCAzLCAzLCAzLCAzLCAzLCAz LCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLA0KCTQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDUsIDUs IDUsIDUsIDYsIDYsIDAsIDAgfTsNCg0KI2RlZmluZSBMREFQX1VURjhfQ0hBUkxFTihwKSAoIExE QVBfVVRGOF9JU0FTQ0lJKHApIFwNCgk/IDEgOiBsZGFwX3V0ZjhfbGVudGFiWyooY29uc3QgdW5z aWduZWQgY2hhciAqKShwKSBeIDB4ODBdICkNCiNkZWZpbmUgTERBUF9VVEY4X0NIQVJMRU4yKHAs IGwpICggKCAoIGwgPSBMREFQX1VURjhfQ0hBUkxFTiggcCApKSA8IDMgfHwgXA0KCSggbGRhcF91 dGY4X21pbnRhYlsqKGNvbnN0IHVuc2lnbmVkIGNoYXIgKikocCkgJiAweDFmXSAmIChwKVsxXSAp ICkgPyBcDQoJbCA6IDAgKQ0KDQpsZGFwX3VjczRfdCBsZGFwX3hfdXRmOF90b191Y3M0KCBjb25z dCBjaGFyICogcCApDQp7DQogICAgY29uc3QgdW5zaWduZWQgY2hhciAqYyA9IChjb25zdCB1bnNp Z25lZCBjaGFyICopIHA7DQogICAgbGRhcF91Y3M0X3QgY2g7DQoJaW50IGxlbiwgaTsNCglzdGF0 aWMgdW5zaWduZWQgY2hhciBtYXNrW10gPSB7DQoJCTAsIDB4N2YsIDB4MWYsIDB4MGYsIDB4MDcs IDB4MDMsIDB4MDEgfTsNCg0KCWxlbiA9IExEQVBfVVRGOF9DSEFSTEVOMihwLCBsZW4pOw0KDQoJ aWYoIGxlbiA9PSAwICkgcmV0dXJuIExEQVBfVUNTNF9JTlZBTElEOw0KDQoJY2ggPSBjWzBdICYg bWFza1tsZW5dOw0KDQoJZm9yKGk9MTsgaSA8IGxlbjsgaSsrKSB7DQoJCWlmICgoY1tpXSAmIDB4 YzApICE9IDB4ODApIHsNCgkJCXJldHVybiBMREFQX1VDUzRfSU5WQUxJRDsNCgkJfQ0KDQoJCWNo IDw8PSA2Ow0KCQljaCB8PSBjW2ldICYgMHgzZjsNCgl9DQoNCglyZXR1cm4gY2g7DQp9DQoNCmNo YXIqIGxkYXBfdXRmOF9uZXh0KCBjb25zdCBjaGFyICogcCApDQp7DQoJaW50IGk7DQoJY29uc3Qg dW5zaWduZWQgY2hhciAqdSA9IChjb25zdCB1bnNpZ25lZCBjaGFyICopIHA7DQoNCglpZiggTERB UF9VVEY4X0lTQVNDSUkodSkgKSB7DQoJCXJldHVybiAoY2hhciAqKSAmcFsxXTsNCgl9DQoNCglm b3IoIGk9MTsgaTw2OyBpKysgKSB7DQoJCWlmICggKCB1W2ldICYgMHhjMCApICE9IDB4ODAgKSB7 DQoJCQlyZXR1cm4gKGNoYXIgKikgJnBbaV07DQoJCX0NCgl9DQoNCglyZXR1cm4gKGNoYXIgKikg JnBbaV07DQp9DQojZGVmaW5lIExEQVBfVVRGOF9ORVhUKHApICgJTERBUF9VVEY4X0lTQVNDSUko cCkgXA0KCT8gKGNoYXIgKikocCkrMSA6IGxkYXBfdXRmOF9uZXh0KChwKSkgKQ0KI2RlZmluZSBM REFQX1VURjhfSU5DUihwKSAoKHApID0gTERBUF9VVEY4X05FWFQocCkpDQpjaGFyICoobGRhcF91 dGY4X3N0cnBicmspKCBjb25zdCBjaGFyICpzdHIsIGNvbnN0IGNoYXIgKnNldCApDQp7DQoJZm9y KCA7ICpzdHIgIT0gJ1wwJzsgTERBUF9VVEY4X0lOQ1Ioc3RyKSApIHsNCgkJY29uc3QgY2hhciAq Y3NldDsNCg0KCQlmb3IoIGNzZXQgPSBzZXQ7ICpjc2V0ICE9ICdcMCc7IExEQVBfVVRGOF9JTkNS KGNzZXQpICkgew0KCQkJaWYoIGxkYXBfeF91dGY4X3RvX3VjczQoIHN0ciApID09IGxkYXBfeF91 dGY4X3RvX3VjczQoIGNzZXQgKSApIHsNCgkJCQlyZXR1cm4gKGNoYXIgKikgc3RyOw0KCQkJfSAN CgkJfQ0KCX0NCg0KCXJldHVybiBOVUxMOw0KfQ0KDQoNCmJlcl9sZW5fdCAobGRhcF91dGY4X3N0 cnNwbikoIGNvbnN0IGNoYXIgKnN0ciwgY29uc3QgY2hhciAqc2V0ICkNCnsNCgljb25zdCBjaGFy ICpjc3RyOw0KCWNvbnN0IGNoYXIgKmNzZXQ7DQoNCglmb3IoIGNzdHIgPSBzdHI7ICpjc3RyICE9 ICdcMCc7IExEQVBfVVRGOF9JTkNSKGNzdHIpICkgew0KCQlmb3IoIGNzZXQgPSBzZXQ7IDsgTERB UF9VVEY4X0lOQ1IoY3NldCkgKSB7DQoJCQlpZiggKmNzZXQgPT0gJ1wwJyApIHsNCgkJCQlyZXR1 cm4gY3N0ciAtIHN0cjsNCgkJCX0NCg0KCQkJaWYoIGxkYXBfeF91dGY4X3RvX3VjczQoIGNzdHIg KSA9PSBsZGFwX3hfdXRmOF90b191Y3M0KCBjc2V0ICkgKSB7DQoJCQkJYnJlYWs7DQoJCQl9IA0K CQl9DQoJfQ0KDQoJcmV0dXJuIGNzdHIgLSBzdHI7DQp9DQoNCg0KYmVyX2xlbl90IChsZGFwX3V0 Zjhfc3RyY3NwbikoIGNvbnN0IGNoYXIgKnN0ciwgY29uc3QgY2hhciAqc2V0ICkNCnsNCgljb25z dCBjaGFyICpjc3RyOw0KCWNvbnN0IGNoYXIgKmNzZXQ7DQoNCglmb3IoIGNzdHIgPSBzdHI7ICpj c3RyICE9ICdcMCc7IExEQVBfVVRGOF9JTkNSKGNzdHIpICkgew0KCQlmb3IoIGNzZXQgPSBzZXQ7 ICpjc2V0ICE9ICdcMCc7IExEQVBfVVRGOF9JTkNSKGNzZXQpICkgew0KCQkJaWYoIGxkYXBfeF91 dGY4X3RvX3VjczQoIGNzdHIgKSA9PSBsZGFwX3hfdXRmOF90b191Y3M0KCBjc2V0ICkgKSB7DQoJ CQkJcmV0dXJuIGNzdHIgLSBzdHI7DQoJCQl9IA0KCQl9DQoJfQ0KDQoJcmV0dXJuIGNzdHIgLSBz dHI7DQp9DQoNCmNoYXIgKihsZGFwX3V0Zjhfc3RydG9rKShjaGFyICpzdHIsIGNvbnN0IGNoYXIg KnNlcCwgY2hhciAqKmxhc3QpDQp7DQoJY2hhciAqYmVnaW47DQoJY2hhciAqZW5kOw0KDQoJaWYo IGxhc3QgPT0gTlVMTCApIHJldHVybiBOVUxMOw0KDQoJYmVnaW4gPSBzdHIgPyBzdHIgOiAqbGFz dDsNCg0KCWJlZ2luICs9IGxkYXBfdXRmOF9zdHJzcG4oIGJlZ2luLCBzZXAgKTsNCg0KCWlmKCAq YmVnaW4gPT0gJ1wwJyApIHsNCgkJKmxhc3QgPSBOVUxMOw0KCQlyZXR1cm4gTlVMTDsNCgl9DQoN CgllbmQgPSAmYmVnaW5bIGxkYXBfdXRmOF9zdHJjc3BuKCBiZWdpbiwgc2VwICkgXTsNCg0KCWlm KCAqZW5kICE9ICdcMCcgKSB7DQoJCWNoYXIgKm5leHQgPSBMREFQX1VURjhfTkVYVCggZW5kICk7 DQoJCSplbmQgPSAnXDAnOw0KCQllbmQgPSBuZXh0Ow0KCX0NCg0KCSpsYXN0ID0gZW5kOw0KCXJl dHVybiBiZWdpbjsNCn0NCg0Kc3RydWN0IGJlcnZhbCAqDQpiZXJfc3RyMmJ2X3goY29uc3QgY2hh ciAqcywgYmVyX2xlbl90IGxlbiwgaW50IGR1cCwgc3RydWN0IGJlcnZhbCAqYnYsIHZvaWQgKmN0 eCkgDQp7DQoJc3RydWN0IGJlcnZhbCAqYW5ldzsNCglpZiggcyA9PSBOVUxMICkgew0KCQkvL2Jl cl9lcnJubyA9IExCRVJfRVJST1JfUEFSQU07DQoJCXJldHVybiBOVUxMOw0KCX0NCglpZiggYnYg KSB7DQoJCWFuZXcgPSBidjsNCgl9IGVsc2Ugew0KCQlpZigoIGFuZXcgPSAoc3RydWN0IGJlcnZh bCopYmVyX21lbWFsbG9jX3goIHNpemVvZihzdHJ1Y3QgYmVydmFsKSwgY3R4ICkpID09IE5VTEwg KSB7DQoJCQlyZXR1cm4gTlVMTDsNCgkJfQ0KCX0NCglhbmV3LT5idl9sZW4gPSBsZW4gPyBsZW4g OiBzdHJsZW4oIHMgKTsNCglpZiAoIGR1cCApIHsNCgkJaWYgKCAoYW5ldy0+YnZfdmFsID0gKGNo YXIqKWJlcl9tZW1hbGxvY194KCBhbmV3LT5idl9sZW4rMSwgY3R4ICkpID09IE5VTEwgKSB7DQoJ CQlpZiAoICFidiApDQoJCQkJYmVyX21lbWZyZWVfeCggYW5ldywgY3R4ICk7DQoJCQlyZXR1cm4g TlVMTDsNCgkJfQ0KCQlBQ19NRU1DUFkoIGFuZXctPmJ2X3ZhbCwgcywgYW5ldy0+YnZfbGVuICk7 DQoJCWFuZXctPmJ2X3ZhbFthbmV3LT5idl9sZW5dID0gJ1wwJzsNCgl9IGVsc2Ugew0KCQlhbmV3 LT5idl92YWwgPSAoY2hhciAqKSBzOw0KCX0NCglyZXR1cm4oIGFuZXcgKTsNCn0NCg0Kc3RydWN0 IGJlcnZhbCAqDQpiZXJfc3RyMmJ2KGNvbnN0IGNoYXIgKnMsIGJlcl9sZW5fdCBsZW4sIGludCBk dXAsIHN0cnVjdCBiZXJ2YWwgKmJ2KQ0Kew0KCXJldHVybiBiZXJfc3RyMmJ2X3goIHMsIGxlbiwg ZHVwLCBidiwgTlVMTCApOw0KfQ0KDQpjaGFyICoqDQpsZGFwX3N0cjJjaGFycmF5KCBjb25zdCBj aGFyICpzdHJfaW4sIGNvbnN0IGNoYXIgKmJya3N0ciApDQp7DQoJY2hhcgkqKnJlczsNCgljaGFy CSpzdHIsICpzOw0KCWNoYXIJKmxhc3RzOw0KCWludAlpOw0KCS8qIHByb3RlY3QgdGhlIGlucHV0 IHN0cmluZyBmcm9tIHN0cnRvayAqLw0KCXN0ciA9IExEQVBfU1RSRFVQKCBzdHJfaW4gKTsNCglp Ziggc3RyID09IE5VTEwgKSB7DQoJCXJldHVybiBOVUxMOw0KCX0NCglpID0gMTsNCglmb3IgKCBz ID0gc3RyOyA7IExEQVBfVVRGOF9JTkNSKHMpICkgew0KCQlzID0gbGRhcF91dGY4X3N0cnBicmso IHMsIGJya3N0ciApOw0KCQlpZiAoICFzICkgYnJlYWs7DQoJCWkrKzsNCgl9DQoJcmVzID0gKGNo YXIgKiopIExEQVBfTUFMTE9DKCAoaSArIDEpICogc2l6ZW9mKGNoYXIgKikgKTsNCglpZiggcmVz ID09IE5VTEwgKSB7DQoJCUxEQVBfRlJFRSggc3RyICk7DQoJCXJldHVybiBOVUxMOw0KCX0NCglp ID0gMDsNCglmb3IgKCBzID0gbGRhcF91dGY4X3N0cnRvayggc3RyLCBicmtzdHIsICZsYXN0cyAp Ow0KCQlzICE9IE5VTEw7DQoJCXMgPSBsZGFwX3V0Zjhfc3RydG9rKCBOVUxMLCBicmtzdHIsICZs YXN0cyApICkNCgl7DQoJCXJlc1tpXSA9IExEQVBfU1RSRFVQKCBzICk7DQoJCWlmKHJlc1tpXSA9 PSBOVUxMKSB7DQoJCQlmb3IoIC0taSA7IGkgPj0gMCA7IGktLSApIHsNCgkJCQlMREFQX0ZSRUUo IHJlc1tpXSApOw0KCQkJfQ0KCQkJLy9MREFQX0ZSRUUoIHJlcyApOyAgDQoJCQlmcmVlKHJlcyk7 DQoJCQlMREFQX0ZSRUUoIHN0ciApOw0KCQkJcmV0dXJuIE5VTEw7DQoJCX0NCgkJaSsrOw0KCX0N CglyZXNbaV0gPSBOVUxMOw0KCUxEQVBfRlJFRSggc3RyICk7DQoJcmV0dXJuKCByZXMgKTsNCn0N Cg0Kc3RhdGljIGludApsZGFwX2ludF9pc19oZXhwYWlyKCBjaGFyICpzICkKewoJaW50CWk7CgoJ Zm9yICggaSA9IDA7IGkgPCAyOyBpKysgKSB7CgkJaWYgKCBzW2ldID49ICcwJyAmJiBzW2ldIDw9 ICc5JyApIHsKCQkJY29udGludWU7CgkJfQoKCQlpZiAoIHNbaV0gPj0gJ0EnICYmIHNbaV0gPD0g J0YnICkgewoJCQljb250aW51ZTsKCQl9CgoJCWlmICggc1tpXSA+PSAnYScgJiYgc1tpXSA8PSAn ZicgKSB7CgkJCWNvbnRpbnVlOwoJCX0KCgkJcmV0dXJuIDA7Cgl9CgkKCXJldHVybiAxOwkKfQ0K DQpzdGF0aWMgaW50CmxkYXBfaW50X3VuaGV4KCBpbnQgYyApCnsKCXJldHVybiggYyA+PSAnMCcg JiYgYyA8PSAnOScgPyBjIC0gJzAnCgkgICAgOiBjID49ICdBJyAmJiBjIDw9ICdGJyA/IGMgLSAn QScgKyAxMAoJICAgIDogYyAtICdhJyArIDEwICk7Cn0NCg0Kdm9pZA0KbGRhcF9wdnRfaGV4X3Vu ZXNjYXBlKCBjaGFyICpzICkNCnsNCgkvKg0KCSAqIFJlbW92ZSBVUkwgaGV4IGVzY2FwZXMgZnJv bSBzLi4uIGRvbmUgaW4gcGxhY2UuICBUaGUgYmFzaWMgY29uY2VwdCBmb3INCgkgKiB0aGlzIHJv dXRpbmUgaXMgYm9ycm93ZWQgZnJvbSB0aGUgV1dXIGxpYnJhcnkgSFRVbkVzY2FwZSgpIHJvdXRp bmUuDQoJICovDQoJY2hhcgkqcCwNCgkJKnNhdmVfcyA9IHM7DQoJZm9yICggcCA9IHM7ICpzICE9 ICdcMCc7ICsrcyApIHsNCgkJaWYgKCAqcyA9PSAnJScgKSB7DQoJCQkvKg0KCQkJICogRklYTUU6 IHdoYXQgaWYgJyUnIGlzIGZvbGxvd2VkDQoJCQkgKiBieSBub24taGV4cGFpciBjaGFycz8NCgkJ CSAqLw0KCQkJaWYgKCAhbGRhcF9pbnRfaXNfaGV4cGFpciggcyArIDEgKSApIHsNCgkJCQlwID0g c2F2ZV9zOw0KCQkJCWJyZWFrOw0KCQkJfQ0KCQkJaWYgKCAqKytzID09ICdcMCcgKSB7DQoJCQkJ YnJlYWs7DQoJCQl9DQoJCQkqcCA9IGxkYXBfaW50X3VuaGV4KCAqcyApIDw8IDQ7DQoJCQlpZiAo ICorK3MgPT0gJ1wwJyApIHsNCgkJCQlicmVhazsNCgkJCX0NCgkJCSpwKysgKz0gbGRhcF9pbnRf dW5oZXgoICpzICk7DQoJCX0gZWxzZSB7DQoJCQkqcCsrID0gKnM7DQoJCX0NCgl9DQoJKnAgPSAn XDAnOw0KfQ0KDQoNCiNkZWZpbmUgQkVSX0JWQyhzKQkJeyBTVFJMRU5PRihzKSwgKGNoYXIgKiko cykgfQ0KI2RlZmluZSBCRVJfQlZOVUxMCQl7IDBMLCBOVUxMIH0NCiNkZWZpbmUgTERBUF9TQ09Q RV9TVUJPUkRJTkFURQkoKGJlcl9pbnRfdCkgMHgwMDAzKSAvKiBPcGVuTERBUCBleHRlbnNpb24g Ki8NCiNkZWZpbmUgYmVyX2J2c3RyY2FzZWNtcCh2MSx2MikgXA0KCSgodjEpLT5idl9sZW4gPCAo djIpLT5idl9sZW4gXA0KCQk/IC0xIDogKCh2MSktPmJ2X2xlbiA+ICh2MiktPmJ2X2xlbiBcDQoJ CQk/IDEgOiBzdHJuY2FzZWNtcCgodjEpLT5idl92YWwsICh2MiktPmJ2X3ZhbCwgKHYxKS0+YnZf bGVuKSApKQ0KDQppbnQNCmxkYXBfcHZ0X2J2MnNjb3BlKCBzdHJ1Y3QgYmVydmFsICpidiApDQp7 DQoJc3RhdGljIHN0cnVjdCB7DQoJCXN0cnVjdCBiZXJ2YWwJYnY7DQoJCWludAkJc2NvcGU7DQoJ fQl2W10gPSB7DQoJCXsgQkVSX0JWQyggIm9uZSIgKSwJCUxEQVBfU0NPUEVfT05FTEVWRUwgfSwN CgkJeyBCRVJfQlZDKCAib25lbGV2ZWwiICksCUxEQVBfU0NPUEVfT05FTEVWRUwgfSwNCgkJeyBC RVJfQlZDKCAiYmFzZSIgKSwJCUxEQVBfU0NPUEVfQkFTRSB9LA0KCQl7IEJFUl9CVkMoICJzdWIi ICksCQlMREFQX1NDT1BFX1NVQlRSRUUgfSwNCgkJeyBCRVJfQlZDKCAic3VidHJlZSIgKSwJCUxE QVBfU0NPUEVfU1VCVFJFRSB9LA0KCQl7IEJFUl9CVkMoICJzdWJvcmQiICksCQlMREFQX1NDT1BF X1NVQk9SRElOQVRFIH0sDQoJCXsgQkVSX0JWQyggInN1Ym9yZGluYXRlIiApLAlMREFQX1NDT1BF X1NVQk9SRElOQVRFIH0sDQoJCXsgQkVSX0JWQyggImNoaWxkcmVuIiApLAlMREFQX1NDT1BFX1NV Qk9SRElOQVRFIH0sDQoJCXsgQkVSX0JWTlVMTCwJCQktMSB9DQoJfTsNCglpbnQJaTsNCg0KCWZv ciAoIGkgPSAwOyB2WyBpIF0uc2NvcGUgIT0gLTE7IGkrKyApIHsNCgkJaWYgKCBiZXJfYnZzdHJj YXNlY21wKCBidiwgJnZbIGkgXS5idiApID09IDAgKSB7DQoJCQlyZXR1cm4gdlsgaSBdLnNjb3Bl Ow0KCQl9DQoJfQ0KDQoJcmV0dXJuKCAtMSApOw0KfQ0KDQoNCmludA0KbGRhcF9wdnRfc3RyMnNj b3BlKCBjb25zdCBjaGFyICpwICkNCnsNCglzdHJ1Y3QgYmVydmFsCWJ2Ow0KDQoJYmVyX3N0cjJi diggcCwgMCwgMCwgJmJ2ICk7DQoNCglyZXR1cm4gbGRhcF9wdnRfYnYyc2NvcGUoICZidiApOw0K fQ0KDQp2b2lkDQpsZGFwX2ZyZWVfdXJsZGVzYyggTERBUFVSTERlc2MgKmx1ZHAgKQ0Kew0KCWlm ICggbHVkcCA9PSBOVUxMICkgew0KCQlyZXR1cm47DQoJfQ0KCQ0KCWlmICggbHVkcC0+bHVkX3Nj aGVtZSAhPSBOVUxMICkgew0KCQlMREFQX0ZSRUUoIGx1ZHAtPmx1ZF9zY2hlbWUgKTsNCgl9DQoN CglpZiAoIGx1ZHAtPmx1ZF9ob3N0ICE9IE5VTEwgKSB7DQoJCUxEQVBfRlJFRSggbHVkcC0+bHVk X2hvc3QgKTsNCgl9DQoNCglpZiAoIGx1ZHAtPmx1ZF9kbiAhPSBOVUxMICkgew0KCQlMREFQX0ZS RUUoIGx1ZHAtPmx1ZF9kbiApOw0KCX0NCg0KCWlmICggbHVkcC0+bHVkX2ZpbHRlciAhPSBOVUxM ICkgew0KCQlMREFQX0ZSRUUoIGx1ZHAtPmx1ZF9maWx0ZXIpOw0KCX0NCg0KCWlmICggbHVkcC0+ bHVkX2F0dHJzICE9IE5VTEwgKSB7DQoJCUxEQVBfVkZSRUUoIGx1ZHAtPmx1ZF9hdHRycyApOw0K CX0NCg0KCWlmICggbHVkcC0+bHVkX2V4dHMgIT0gTlVMTCApIHsNCgkJTERBUF9WRlJFRSggbHVk cC0+bHVkX2V4dHMgKTsNCgl9DQoNCgkvL0xEQVBfRlJFRSggbHVkcCApOw0KCWZyZWUobHVkcCk7 DQp9DQoNCmludA0KbGRhcF91cmxfcGFyc2VfZXh0KCBjaGFyICp1cmxfaW4sIExEQVBVUkxEZXNj ICoqbHVkcHAsIHVuc2lnbmVkIGZsYWdzICkNCnsNCi8qDQogKiAgUGljayBhcGFydCB0aGUgcGll Y2VzIG9mIGFuIExEQVAgVVJMLg0KICovDQoNCglMREFQVVJMRGVzYwkqbHVkcDsNCgljaGFyCSpw LCAqcSwgKnI7DQoJaW50CQlpLCBlbmNsb3NlZCwgcHJvdG8sIGlzX3Y2ID0gMDsNCgljb25zdCBj aGFyICpzY2hlbWUgPSBOVUxMOw0KCWNvbnN0IGNoYXIgKnVybF90bXA7DQoJY2hhciAqdXJsOw0K DQoJaW50CWNoZWNrX2RuID0gMTsNCg0KCWlmKCB1cmxfaW4gPT0gTlVMTCB8fCBsdWRwcCA9PSBO VUxMICkgew0KCQlyZXR1cm4gTERBUF9VUkxfRVJSX1BBUkFNOw0KCX0NCg0KCSpsdWRwcCA9IE5V TEw7CS8qIHBlc3NpbWlzdGljICovDQoNCgl1cmxfdG1wID0gc2tpcF91cmxfcHJlZml4KCB1cmxf aW4sICZlbmNsb3NlZCwgJnNjaGVtZSApOw0KDQoJaWYgKCB1cmxfdG1wID09IE5VTEwgKSB7DQoJ CXJldHVybiBMREFQX1VSTF9FUlJfQkFEU0NIRU1FOw0KCX0NCg0KCWFzc2VydCggc2NoZW1lICE9 IE5VTEwgKTsNCg0KCXByb3RvID0gbGRhcF9wdnRfdXJsX3NjaGVtZTJwcm90byggc2NoZW1lICk7 DQoJaWYgKCBwcm90byA9PSAtMSApIHsNCgkJcmV0dXJuIExEQVBfVVJMX0VSUl9CQURTQ0hFTUU7 DQoJfQ0KDQoJLyogbWFrZSB3b3JraW5nIGNvcHkgb2YgdGhlIHJlbWFpbmRlciBvZiB0aGUgVVJM ICovDQoJdXJsID0gTERBUF9TVFJEVVAoIHVybF90bXAgKTsNCglpZiAoIHVybCA9PSBOVUxMICkg ew0KCQlyZXR1cm4gTERBUF9VUkxfRVJSX01FTTsNCgl9DQoNCglpZiAoIGVuY2xvc2VkICkgew0K CQlwID0gJnVybFtzdHJsZW4odXJsKS0xXTsNCg0KCQlpZiggKnAgIT0gJz4nICkgew0KCQkJTERB UF9GUkVFKCB1cmwgKTsNCgkJCXJldHVybiBMREFQX1VSTF9FUlJfQkFERU5DTE9TVVJFOw0KCQl9 DQoNCgkJKnAgPSAnXDAnOw0KCX0NCg0KCS8qIGFsbG9jYXRlIHJldHVybiBzdHJ1Y3QgKi8NCgls dWRwID0gKExEQVBVUkxEZXNjICopTERBUF9DQUxMT0MoIDEsIHNpemVvZiggTERBUFVSTERlc2Mg KSk7DQoNCglpZiAoIGx1ZHAgPT0gTlVMTCApIHsNCgkJTERBUF9GUkVFKCB1cmwgKTsNCgkJcmV0 dXJuIExEQVBfVVJMX0VSUl9NRU07DQoJfQ0KDQoJLy9sdWRwLT5sdWRfbmV4dCA9IE5VTEw7DQoJ bHVkcC0+bHVkX2hvc3QgPSBOVUxMOw0KCWx1ZHAtPmx1ZF9wb3J0ID0gMDsNCglsdWRwLT5sdWRf ZG4gPSBOVUxMOw0KCWx1ZHAtPmx1ZF9hdHRycyA9IE5VTEw7DQoJbHVkcC0+bHVkX3Njb3BlID0g KCBmbGFncyAmIExEQVBfUFZUX1VSTF9QQVJTRV9OT0RFRl9TQ09QRSApID8gTERBUF9TQ09QRV9C QVNFIDogTERBUF9TQ09QRV9ERUZBVUxUOw0KCWx1ZHAtPmx1ZF9maWx0ZXIgPSBOVUxMOw0KCWx1 ZHAtPmx1ZF9leHRzID0gTlVMTDsNCg0KCWx1ZHAtPmx1ZF9zY2hlbWUgPSBMREFQX1NUUkRVUCgg c2NoZW1lICk7DQoNCglpZiAoIGx1ZHAtPmx1ZF9zY2hlbWUgPT0gTlVMTCApIHsNCgkJTERBUF9G UkVFKCB1cmwgKTsNCgkJbGRhcF9mcmVlX3VybGRlc2MoIGx1ZHAgKTsNCgkJcmV0dXJuIExEQVBf VVJMX0VSUl9NRU07DQoJfQ0KDQoJLyogc2NhbiBmb3J3YXJkIGZvciAnLycgdGhhdCBtYXJrcyBl bmQgb2YgaG9zdHBvcnQgYW5kIGJlZ2luLiBvZiBkbiAqLw0KCXAgPSBzdHJjaHIoIHVybCwgJy8n ICk7DQoJcSA9IE5VTEw7DQoNCglpZiggcCAhPSBOVUxMICkgew0KCQkvKiB0ZXJtaW5hdGUgaG9z dHBvcnQ7IHBvaW50IHRvIHN0YXJ0IG9mIGRuICovDQoJCSpwKysgPSAnXDAnOw0KCX0gZWxzZSB7 DQoJCS8qIGNoZWNrIGZvciBOb3ZlbGwga2x1ZGdlLCBzZWUgYmVsb3cgKi8NCgkJcCA9IHN0cmNo ciggdXJsLCAnPycgKTsNCgkJaWYgKCBwICkgew0KCQkJKnArKyA9ICdcMCc7DQoJCQlxID0gcDsN CgkJCXAgPSBOVUxMOw0KCQl9DQoJfQ0KDQoJaWYgKCBwcm90byAhPSBMREFQX1BST1RPX0lQQyAp IHsNCgkJLyogSVB2NiBzeW50YXggd2l0aCBbaXAgYWRkcmVzc106cG9ydCAqLw0KCQlpZiAoICp1 cmwgPT0gJ1snICkgew0KCQkJciA9IHN0cmNociggdXJsLCAnXScgKTsNCgkJCWlmICggciA9PSBO VUxMICkgew0KCQkJCUxEQVBfRlJFRSggdXJsICk7DQoJCQkJbGRhcF9mcmVlX3VybGRlc2MoIGx1 ZHAgKTsNCgkJCQlyZXR1cm4gTERBUF9VUkxfRVJSX0JBRFVSTDsNCgkJCX0NCgkJCSpyKysgPSAn XDAnOw0KCQkJcSA9IHN0cmNociggciwgJzonICk7DQoJCQlpZiAoIHEgJiYgcSAhPSByICkgew0K CQkJCUxEQVBfRlJFRSggdXJsICk7DQoJCQkJbGRhcF9mcmVlX3VybGRlc2MoIGx1ZHAgKTsNCgkJ CQlyZXR1cm4gTERBUF9VUkxfRVJSX0JBRFVSTDsNCgkJCX0NCgkJCWlzX3Y2ID0gMTsNCgkJfSBl bHNlIHsNCgkJCXEgPSBzdHJjaHIoIHVybCwgJzonICk7DQoJCX0NCg0KCQlpZiAoIHEgIT0gTlVM TCApIHsNCgkJCWNoYXIJKm5leHQ7DQoNCgkJCSpxKysgPSAnXDAnOw0KCQkJbGRhcF9wdnRfaGV4 X3VuZXNjYXBlKCBxICk7DQoNCgkJCWlmKCAqcSA9PSAnXDAnICkgew0KCQkJCUxEQVBfRlJFRSgg dXJsICk7DQoJCQkJbGRhcF9mcmVlX3VybGRlc2MoIGx1ZHAgKTsNCgkJCQlyZXR1cm4gTERBUF9V UkxfRVJSX0JBRFVSTDsNCgkJCX0NCg0KCQkJbHVkcC0+bHVkX3BvcnQgPSBzdHJ0b2woIHEsICZu ZXh0LCAxMCApOw0KCQkJaWYgKCBuZXh0ID09IHEgfHwgbmV4dFswXSAhPSAnXDAnICkgew0KCQkJ CUxEQVBfRlJFRSggdXJsICk7DQoJCQkJbGRhcF9mcmVlX3VybGRlc2MoIGx1ZHAgKTsNCgkJCQly ZXR1cm4gTERBUF9VUkxfRVJSX0JBRFVSTDsNCgkJCX0NCgkJCS8qIGNoZWNrIGZvciBOb3ZlbGwg a2x1ZGdlICovDQoJCQlpZiAoICFwICkgew0KCQkJCWlmICggKm5leHQgIT0gJ1wwJyApIHsNCgkJ CQkJcSA9ICZuZXh0WzFdOw0KCQkJCX0gZWxzZSB7DQoJCQkJCXEgPSBOVUxMOw0KCQkJCX0NCgkJ CX0NCgkJfQ0KDQoJCWlmICggKCBmbGFncyAmIExEQVBfUFZUX1VSTF9QQVJTRV9ERUZfUE9SVCAp ICYmIGx1ZHAtPmx1ZF9wb3J0ID09IDAgKSB7DQoJCS8vCWlmICggc3RyY21wKCBsdWRwLT5sdWRf c2NoZW1lLCAibGRhcHMiICkgPT0gMCApIHsNCgkJLy8JCWx1ZHAtPmx1ZF9wb3J0ID0gTERBUFNf UE9SVDsNCgkJLy8JfSBlbHNlIHsNCgkJCQlsdWRwLT5sdWRfcG9ydCA9IExEQVBfUE9SVDsNCgkJ Ly8JfQ0KCQl9DQoJfQ0KDQoJbGRhcF9wdnRfaGV4X3VuZXNjYXBlKCB1cmwgKTsNCg0KCS8qIElm IFtpcCBhZGRyZXNzXTpwb3J0IHN5bnRheCwgdXJsIGlzIFtpcCBhbmQgd2Ugc2tpcCB0aGUgWyAq Lw0KCWx1ZHAtPmx1ZF9ob3N0ID0gTERBUF9TVFJEVVAoIHVybCArIGlzX3Y2ICk7DQoNCglpZigg bHVkcC0+bHVkX2hvc3QgPT0gTlVMTCApIHsNCgkJTERBUF9GUkVFKCB1cmwgKTsNCgkJbGRhcF9m cmVlX3VybGRlc2MoIGx1ZHAgKTsNCgkJcmV0dXJuIExEQVBfVVJMX0VSUl9NRU07DQoJfQ0KDQoJ aWYgKCAoIGZsYWdzICYgTERBUF9QVlRfVVJMX1BBUlNFX05PRU1QVFlfSE9TVCApDQoJCSYmIGx1 ZHAtPmx1ZF9ob3N0ICE9IE5VTEwNCgkJJiYgKmx1ZHAtPmx1ZF9ob3N0ID09ICdcMCcgKQ0KCXsN CgkJTERBUF9GUkVFKCBsdWRwLT5sdWRfaG9zdCApOw0KCQlsdWRwLT5sdWRfaG9zdCA9IE5VTEw7 DQoJfQ0KDQoJLyoNCgkgKiBLbHVkZ2UuICBsZGFwOi8vMTExLjIyMi4zMzMuNDQ0OjM4OT8/Y249 YWJjLG89Y29tcGFueQ0KCSAqDQoJICogT24gZWFybHkgTm92ZWxsIHJlbGVhc2VzLCBzZWFyY2gg cmVmZXJlbmNlcy9yZWZlcnJhbHMgd2VyZSByZXR1cm5lZA0KCSAqIGluIHRoaXMgZm9ybWF0LCBp LmUuLCB0aGUgZG4gd2FzIGtpbmQgb2YgaW4gdGhlIHNjb3BlIHBvc2l0aW9uLA0KCSAqIGJ1dCB0 aGUgcmVxdWlyZWQgc2xhc2ggaXMgbWlzc2luZy4gVGhlIHdob2xlIHRoaW5nIGlzIGlsbGVnYWwg c3ludGF4LA0KCSAqIGJ1dCB3ZSBuZWVkIHRvIGFjY291bnQgZm9yIGl0LiBGb3J0dW5hdGVseSBp dCBjYW4ndCBiZSBjb25mdXNlZCB3aXRoDQoJICogYW55dGhpbmcgcmVhbC4NCgkgKi8NCglpZigg KHAgPT0gTlVMTCkgJiYgKHEgIT0gTlVMTCkgJiYgKCpxID09ICc/JykgKSB7DQoJCS8qID8gaW1t ZWRpYXRlbHkgZm9sbG93ZWQgYnkgcXVlc3Rpb24gKi8NCgkJcSsrOw0KCQlpZiggKnEgIT0gJ1ww JyApIHsNCgkJCS8qIHBhcnNlIGRuIHBhcnQgKi8NCgkJCWxkYXBfcHZ0X2hleF91bmVzY2FwZSgg cSApOw0KCQkJbHVkcC0+bHVkX2RuID0gTERBUF9TVFJEVVAoIHEgKTsNCg0KCQl9IGVsc2UgaWYg KCAhKCBmbGFncyAmIExEQVBfUFZUX1VSTF9QQVJTRV9OT0VNUFRZX0ROICkgKSB7DQoJCQlsdWRw LT5sdWRfZG4gPSBMREFQX1NUUkRVUCggIiIgKTsNCg0KCQl9IGVsc2Ugew0KCQkJY2hlY2tfZG4g PSAwOw0KCQl9DQoNCgkJaWYgKCBjaGVja19kbiAmJiBsdWRwLT5sdWRfZG4gPT0gTlVMTCApIHsN CgkJCUxEQVBfRlJFRSggdXJsICk7DQoJCQlsZGFwX2ZyZWVfdXJsZGVzYyggbHVkcCApOw0KCQkJ cmV0dXJuIExEQVBfVVJMX0VSUl9NRU07DQoJCX0NCgl9DQoNCglpZiggcCA9PSBOVUxMICkgew0K CQlMREFQX0ZSRUUoIHVybCApOw0KCQkqbHVkcHAgPSBsdWRwOw0KCQlyZXR1cm4gTERBUF9VUkxf U1VDQ0VTUzsNCgl9DQoNCgkvKiBzY2FuIGZvcndhcmQgZm9yICc/JyB0aGF0IG1heSBtYXJrcyBl bmQgb2YgZG4gKi8NCglxID0gc3RyY2hyKCBwLCAnPycgKTsNCg0KCWlmKCBxICE9IE5VTEwgKSB7 DQoJCS8qIHRlcm1pbmF0ZSBkbiBwYXJ0ICovDQoJCSpxKysgPSAnXDAnOw0KCX0NCg0KCWlmKCAq cCAhPSAnXDAnICkgew0KCQkvKiBwYXJzZSBkbiBwYXJ0ICovDQoJCWxkYXBfcHZ0X2hleF91bmVz Y2FwZSggcCApOw0KCQlsdWRwLT5sdWRfZG4gPSBMREFQX1NUUkRVUCggcCApOw0KDQoJfSBlbHNl IGlmICggISggZmxhZ3MgJiBMREFQX1BWVF9VUkxfUEFSU0VfTk9FTVBUWV9ETiApICkgew0KCQls dWRwLT5sdWRfZG4gPSBMREFQX1NUUkRVUCggIiIgKTsNCg0KCX0gZWxzZSB7DQoJCWNoZWNrX2Ru ID0gMDsNCgl9DQoNCglpZiggY2hlY2tfZG4gJiYgbHVkcC0+bHVkX2RuID09IE5VTEwgKSB7DQoJ CUxEQVBfRlJFRSggdXJsICk7DQoJCWxkYXBfZnJlZV91cmxkZXNjKCBsdWRwICk7DQoJCXJldHVy biBMREFQX1VSTF9FUlJfTUVNOw0KCX0NCg0KCWlmKCBxID09IE5VTEwgKSB7DQoJCS8qIG5vIG1v cmUgKi8NCgkJTERBUF9GUkVFKCB1cmwgKTsNCgkJKmx1ZHBwID0gbHVkcDsNCgkJcmV0dXJuIExE QVBfVVJMX1NVQ0NFU1M7DQoJfQ0KDQoJLyogc2NhbiBmb3J3YXJkIGZvciAnPycgdGhhdCBtYXkg bWFya3MgZW5kIG9mIGF0dHJpYnV0ZXMgKi8NCglwID0gcTsNCglxID0gc3RyY2hyKCBwLCAnPycg KTsNCg0KCWlmKCBxICE9IE5VTEwgKSB7DQoJCS8qIHRlcm1pbmF0ZSBhdHRyaWJ1dGVzIHBhcnQg Ki8NCgkJKnErKyA9ICdcMCc7DQoJfQ0KDQoJaWYoICpwICE9ICdcMCcgKSB7DQoJCS8qIHBhcnNl IGF0dHJpYnV0ZXMgKi8NCgkJbGRhcF9wdnRfaGV4X3VuZXNjYXBlKCBwICk7DQoJCWx1ZHAtPmx1 ZF9hdHRycyA9IGxkYXBfc3RyMmNoYXJyYXkoIHAsICIsIiApOw0KDQoJCWlmKCBsdWRwLT5sdWRf YXR0cnMgPT0gTlVMTCApIHsNCgkJCUxEQVBfRlJFRSggdXJsICk7DQoJCQlsZGFwX2ZyZWVfdXJs ZGVzYyggbHVkcCApOw0KCQkJcmV0dXJuIExEQVBfVVJMX0VSUl9CQURBVFRSUzsNCgkJfQ0KCX0N Cg0KCWlmICggcSA9PSBOVUxMICkgew0KCQkvKiBubyBtb3JlICovDQoJCUxEQVBfRlJFRSggdXJs ICk7DQoJCSpsdWRwcCA9IGx1ZHA7DQoJCXJldHVybiBMREFQX1VSTF9TVUNDRVNTOw0KCX0NCg0K CS8qIHNjYW4gZm9yd2FyZCBmb3IgJz8nIHRoYXQgbWF5IG1hcmtzIGVuZCBvZiBzY29wZSAqLw0K CXAgPSBxOw0KCXEgPSBzdHJjaHIoIHAsICc/JyApOw0KDQoJaWYoIHEgIT0gTlVMTCApIHsNCgkJ LyogdGVybWluYXRlIHRoZSBzY29wZSBwYXJ0ICovDQoJCSpxKysgPSAnXDAnOw0KCX0NCg0KCWlm KCAqcCAhPSAnXDAnICkgew0KCQkvKiBwYXJzZSB0aGUgc2NvcGUgKi8NCgkJbGRhcF9wdnRfaGV4 X3VuZXNjYXBlKCBwICk7DQoJCWx1ZHAtPmx1ZF9zY29wZSA9IGxkYXBfcHZ0X3N0cjJzY29wZSgg cCApOw0KDQoJCWlmKCBsdWRwLT5sdWRfc2NvcGUgPT0gLTEgKSB7DQoJCQlMREFQX0ZSRUUoIHVy bCApOw0KCQkJbGRhcF9mcmVlX3VybGRlc2MoIGx1ZHAgKTsNCgkJCXJldHVybiBMREFQX1VSTF9F UlJfQkFEU0NPUEU7DQoJCX0NCgl9DQoNCglpZiAoIHEgPT0gTlVMTCApIHsNCgkJLyogbm8gbW9y ZSAqLw0KCQlMREFQX0ZSRUUoIHVybCApOw0KCQkqbHVkcHAgPSBsdWRwOw0KCQlyZXR1cm4gTERB UF9VUkxfU1VDQ0VTUzsNCgl9DQoNCgkvKiBzY2FuIGZvcndhcmQgZm9yICc/JyB0aGF0IG1heSBt YXJrcyBlbmQgb2YgZmlsdGVyICovDQoJcCA9IHE7DQoJcSA9IHN0cmNociggcCwgJz8nICk7DQoN CglpZiggcSAhPSBOVUxMICkgew0KCQkvKiB0ZXJtaW5hdGUgdGhlIGZpbHRlciBwYXJ0ICovDQoJ CSpxKysgPSAnXDAnOw0KCX0NCg0KCWlmKCAqcCAhPSAnXDAnICkgew0KCQkvKiBwYXJzZSB0aGUg ZmlsdGVyICovDQoJCWxkYXBfcHZ0X2hleF91bmVzY2FwZSggcCApOw0KDQoJCWlmKCAhICpwICkg ew0KCQkJLyogbWlzc2luZyBmaWx0ZXIgKi8NCgkJCUxEQVBfRlJFRSggdXJsICk7DQoJCQlsZGFw X2ZyZWVfdXJsZGVzYyggbHVkcCApOw0KCQkJcmV0dXJuIExEQVBfVVJMX0VSUl9CQURGSUxURVI7 DQoJCX0NCg0KCQlsdWRwLT5sdWRfZmlsdGVyID0gTERBUF9TVFJEVVAoIHAgKTsNCg0KCQlpZigg bHVkcC0+bHVkX2ZpbHRlciA9PSBOVUxMICkgew0KCQkJTERBUF9GUkVFKCB1cmwgKTsNCgkJCWxk YXBfZnJlZV91cmxkZXNjKCBsdWRwICk7DQoJCQlyZXR1cm4gTERBUF9VUkxfRVJSX01FTTsNCgkJ fQ0KCX0NCg0KCWlmICggcSA9PSBOVUxMICkgew0KCQkvKiBubyBtb3JlICovDQoJCUxEQVBfRlJF RSggdXJsICk7DQoJCSpsdWRwcCA9IGx1ZHA7DQoJCXJldHVybiBMREFQX1VSTF9TVUNDRVNTOw0K CX0NCg0KCS8qIHNjYW4gZm9yd2FyZCBmb3IgJz8nIHRoYXQgbWF5IG1hcmtzIGVuZCBvZiBleHRl bnNpb25zICovDQoJcCA9IHE7DQoJcSA9IHN0cmNociggcCwgJz8nICk7DQoNCglpZiggcSAhPSBO VUxMICkgew0KCQkvKiBleHRyYSAnPycgKi8NCgkJTERBUF9GUkVFKCB1cmwgKTsNCgkJbGRhcF9m cmVlX3VybGRlc2MoIGx1ZHAgKTsNCgkJcmV0dXJuIExEQVBfVVJMX0VSUl9CQURVUkw7DQoJfQ0K DQoJLyogcGFyc2UgdGhlIGV4dGVuc2lvbnMgKi8NCglsdWRwLT5sdWRfZXh0cyA9IGxkYXBfc3Ry MmNoYXJyYXkoIHAsICIsIiApOw0KDQoJaWYoIGx1ZHAtPmx1ZF9leHRzID09IE5VTEwgKSB7DQoJ CUxEQVBfRlJFRSggdXJsICk7DQoJCWxkYXBfZnJlZV91cmxkZXNjKCBsdWRwICk7DQoJCXJldHVy biBMREFQX1VSTF9FUlJfQkFERVhUUzsNCgl9DQoNCglmb3IoIGk9MDsgbHVkcC0+bHVkX2V4dHNb aV0gIT0gTlVMTDsgaSsrICkgew0KCQlsZGFwX3B2dF9oZXhfdW5lc2NhcGUoIGx1ZHAtPmx1ZF9l eHRzW2ldICk7DQoNCgkJaWYoICpsdWRwLT5sdWRfZXh0c1tpXSA9PSAnIScgKSB7DQoJCQkvKiBj b3VudCB0aGUgbnVtYmVyIG9mIGNyaXRpY2FsIGV4dGVuc2lvbnMgKi8NCgkJCWx1ZHAtPmx1ZF9j cml0X2V4dHMrKzsNCgkJfQ0KCX0NCg0KCWlmKCBpID09IDAgKSB7DQoJCS8qIG11c3QgaGF2ZSAx IG9yIG1vcmUgKi8NCgkJTERBUF9GUkVFKCB1cmwgKTsNCgkJbGRhcF9mcmVlX3VybGRlc2MoIGx1 ZHAgKTsNCgkJcmV0dXJuIExEQVBfVVJMX0VSUl9CQURFWFRTOw0KCX0NCg0KCS8qIG5vIG1vcmUg Ki8NCgkqbHVkcHAgPSBsdWRwOw0KCUxEQVBfRlJFRSggdXJsICk7DQoJcmV0dXJuIExEQVBfVVJM X1NVQ0NFU1M7DQp9DQoNCmludA0KbGRhcF91cmxfcGFyc2UoIGNoYXIgKnVybF9pbiwgTERBUFVS TERlc2MgKipsdWRwcCApDQp7DQoJcmV0dXJuIGxkYXBfdXJsX3BhcnNlX2V4dCggdXJsX2luLCBs dWRwcCwgTERBUF9QVlRfVVJMX1BBUlNFX0hJU1RPUklDICk7DQp9DQoNCg0KDQojZWxzZQ0KI2lu Y2x1ZGUgPGxkYXAuaD4NCiNlbmRpZg0KDQojZGVmaW5lIFNJTVBMRSAic2ltcGxlIg0KI2RlZmlu ZSBLUkI0MSAia3JiNDEiDQojZGVmaW5lIEtSQjQyICJrcmI0MiINCiNkZWZpbmUgVjIgInYyIg0K I2RlZmluZSBWMyAidjMiDQoNCnN0YXRpYyBkbnNfc2RsemltcGxlbWVudGF0aW9uX3QgKmRsel9s ZGFwID0gTlVMTDsNCg0KI2RlZmluZSBkYmNfc2VhcmNoX2xpbWl0IDMwDQojZGVmaW5lIEFMTE5P REVTIDENCiNkZWZpbmUgQUxMT1dYRlIgMg0KI2RlZmluZSBBVVRIT1JJVFkgMw0KI2RlZmluZSBG SU5EWk9ORSA0DQojZGVmaW5lIExPT0tVUCA1DQoNCi8qJQ0KICogU3RydWN0dXJlIHRvIGhvbGQg ZXZlcnRoaW5nIG5lZWRlZCBieSB0aGlzICJpbnN0YW5jZSIgb2YgdGhlIExEQVANCiAqIGRyaXZl ciByZW1lbWJlciwgdGhlIGRyaXZlciBjb2RlIGlzIG9ubHkgbG9hZGVkIG9uY2UsIGJ1dCBtYXkg aGF2ZQ0KICogbWFueSBzZXBhcmF0ZSBpbnN0YW5jZXMuDQogKi8NCg0KdHlwZWRlZiBzdHJ1Y3Qg ew0KI2lmZGVmIElTQ19QTEFURk9STV9VU0VUSFJFQURTDQoJZGJfbGlzdF90ICAgICpkYjsgLyol PCBoYW5kbGUgdG8gYSBsaXN0IG9mIERCICovDQojZWxzZQ0KCWRiaW5zdGFuY2VfdCAqZGI7IC8q JTwgaGFuZGxlIHRvIGRiICovDQojZW5kaWYNCglpbnQgbWV0aG9kOwkvKiU8IHNlY3VyaXR5IGF1 dGhlbnRpY2F0aW9uIG1ldGhvZCAqLw0KCWNoYXIgKnVzZXI7CS8qJTwgd2hvIGlzIGF1dGhlbnRp Y2F0aW5nICovDQoJY2hhciAqY3JlZDsJLyolPCBwYXNzd29yZCBmb3Igc2ltcGxlIGF1dGhlbnRp Y2F0aW9uIG1ldGhvZCAqLw0KCWludCBwcm90b2NvbDsJLyolPCBMREFQIGNvbW11bmljYXRpb24g cHJvdG9jb2wgdmVyc2lvbiAqLw0KCWNoYXIgKmhvc3RzOwkvKiU8IExEQVAgc2VydmVyIGhvc3Rz ICovDQp9IGxkYXBfaW5zdGFuY2VfdDsNCg0KLyogZm9yd2FyZCByZWZlcmVuY2VzICovDQoNCnN0 YXRpYyBpc2NfcmVzdWx0X3QNCmRsel9sZGFwX2ZpbmR6b25lKHZvaWQgKmRyaXZlcmFyZywgdm9p ZCAqZGJkYXRhLCBjb25zdCBjaGFyICpuYW1lKTsNCg0Kc3RhdGljIHZvaWQNCmRsel9sZGFwX2Rl c3Ryb3kodm9pZCAqZHJpdmVyYXJnLCB2b2lkICpkYmRhdGEpOw0KDQovKg0KICogUHJpdmF0ZSBt ZXRob2RzDQogKi8NCg0KLyolIGNoZWNrcyB0aGF0IHRoZSBMREFQIFVSTCBwYXJhbWV0ZXJzIG1h a2Ugc2Vuc2UgKi8NCnN0YXRpYyBpc2NfcmVzdWx0X3QNCmRsel9sZGFwX2NoZWNrVVJMKGNoYXIg KlVSTCwgaW50IGF0dHJDbnQsIGNvbnN0IGNoYXIgKm1zZykgew0KCWlzY19yZXN1bHRfdCByZXN1 bHQgPSBJU0NfUl9TVUNDRVNTOw0KCWludCBsZGFwX3Jlc3VsdDsNCglMREFQVVJMRGVzYyAqbGRh cF91cmwgPSBOVUxMOw0KDQoJaWYgKCFsZGFwX2lzX2xkYXBfdXJsKFVSTCkpIHsNCgkJaXNjX2xv Z193cml0ZShkbnNfbGN0eCwgRE5TX0xPR0NBVEVHT1JZX0RBVEFCQVNFLA0KCQkJICAgICAgRE5T X0xPR01PRFVMRV9ETFosIElTQ19MT0dfRVJST1IsDQoJCQkgICAgICAiJXMgcXVlcnkgaXMgbm90 IGEgdmFsaWQgTERBUCBVUkwiLCBtc2cpOw0KCQlyZXN1bHQgPSBJU0NfUl9GQUlMVVJFOw0KCQln b3RvIGNsZWFudXA7DQoJfQ0KDQoJbGRhcF9yZXN1bHQgPSBsZGFwX3VybF9wYXJzZShVUkwsICZs ZGFwX3VybCk7DQoJaWYgKGxkYXBfcmVzdWx0ICE9IExEQVBfU1VDQ0VTUyB8fCBsZGFwX3VybCA9 PSBOVUxMKSB7DQoJCWlzY19sb2dfd3JpdGUoZG5zX2xjdHgsIEROU19MT0dDQVRFR09SWV9EQVRB QkFTRSwNCgkJCSAgICAgIEROU19MT0dNT0RVTEVfRExaLCBJU0NfTE9HX0VSUk9SLA0KCQkJICAg ICAgInBhcnNpbmcgJXMgcXVlcnkgZmFpbGVkIiwgbXNnKTsNCgkJcmVzdWx0ID0gSVNDX1JfRkFJ TFVSRTsNCgkJZ290byBjbGVhbnVwOw0KCX0NCg0KCWlmIChsZGFwX2NvdW50X3ZhbHVlcyhsZGFw X3VybC0+bHVkX2F0dHJzKSA8IGF0dHJDbnQpIHsNCgkJaXNjX2xvZ193cml0ZShkbnNfbGN0eCwg RE5TX0xPR0NBVEVHT1JZX0RBVEFCQVNFLA0KCQkJICAgICAgRE5TX0xPR01PRFVMRV9ETFosIElT Q19MT0dfRVJST1IsDQoJCQkgICAgICAiJXMgcXVlcnkgbXVzdCBzcGVjaWZ5IGF0IGxlYXN0ICIN CgkJCSAgICAgICIlZCBhdHRyaWJ1dGVzIHRvIHJldHVybiIsDQoJCQkgICAgICBtc2csIGF0dHJD bnQpOw0KCQlyZXN1bHQgPSBJU0NfUl9GQUlMVVJFOw0KCQlnb3RvIGNsZWFudXA7DQoJfQ0KDQoJ aWYgKGxkYXBfdXJsLT5sdWRfaG9zdCAhPSBOVUxMKSB7DQoJCWlzY19sb2dfd3JpdGUoZG5zX2xj dHgsIEROU19MT0dDQVRFR09SWV9EQVRBQkFTRSwNCgkJCSAgICAgIEROU19MT0dNT0RVTEVfRExa LCBJU0NfTE9HX0VSUk9SLA0KCQkJICAgICAgIiVzIHF1ZXJ5IG11c3Qgbm90IHNwZWNpZnkgYSBo b3N0IiwgbXNnKTsNCgkJcmVzdWx0ID0gSVNDX1JfRkFJTFVSRTsNCgkJZ290byBjbGVhbnVwOw0K CX0NCg0KCWlmIChsZGFwX3VybC0+bHVkX3BvcnQgIT0gMzg5KSB7DQoJCWlzY19sb2dfd3JpdGUo ZG5zX2xjdHgsIEROU19MT0dDQVRFR09SWV9EQVRBQkFTRSwNCgkJCSAgICAgIEROU19MT0dNT0RV TEVfRExaLCBJU0NfTE9HX0VSUk9SLA0KCQkJICAgICAgIiVzIHF1ZXJ5IG11c3Qgbm90IHNwZWNp ZnkgYSBwb3J0IiwgbXNnKTsNCgkJcmVzdWx0ID0gSVNDX1JfRkFJTFVSRTsNCgkJZ290byBjbGVh bnVwOw0KCX0NCg0KCWlmIChsZGFwX3VybC0+bHVkX2RuID09IE5VTEwgfHwgc3RybGVuIChsZGFw X3VybC0+bHVkX2RuKSA8IDEpIHsNCgkJaXNjX2xvZ193cml0ZShkbnNfbGN0eCwgRE5TX0xPR0NB VEVHT1JZX0RBVEFCQVNFLA0KCQkJICAgICAgRE5TX0xPR01PRFVMRV9ETFosIElTQ19MT0dfRVJS T1IsDQoJCQkgICAgICAiJXMgcXVlcnkgbXVzdCBzcGVjaWZ5IGEgc2VhcmNoIGJhc2UiLCBtc2cp Ow0KCQlyZXN1bHQgPSBJU0NfUl9GQUlMVVJFOw0KCQlnb3RvIGNsZWFudXA7DQoJfQ0KDQoJaWYg KGxkYXBfdXJsLT5sdWRfZXh0cyAhPSBOVUxMIHx8IGxkYXBfdXJsLT5sdWRfY3JpdF9leHRzICE9 IDApIHsNCgkJaXNjX2xvZ193cml0ZShkbnNfbGN0eCwgRE5TX0xPR0NBVEVHT1JZX0RBVEFCQVNF LA0KCQkJICAgICAgRE5TX0xPR01PRFVMRV9ETFosIElTQ19MT0dfRVJST1IsDQoJCQkgICAgICAi JXMgdXNlcyBleHRlbnNpb25zLiAiDQoJCQkgICAgICAiVGhlIGRyaXZlciBkb2VzIG5vdCBzdXBw b3J0IExEQVAgZXh0ZW5zaW9ucy4iLA0KCQkJICAgICAgbXNnKTsNCgkJcmVzdWx0ID0gSVNDX1Jf RkFJTFVSRTsNCgkJZ290byBjbGVhbnVwOw0KCX0NCg0KY2xlYW51cDoNCglpZiAobGRhcF91cmwg IT0gTlVMTCkNCgkJbGRhcF9mcmVlX3VybGRlc2MobGRhcF91cmwpOw0KCXJldHVybiAocmVzdWx0 KTsNCn0NCg0KLyolIENvbm5lY3RzIC8gcmVjb25uZWN0cyB0byBMREFQIHNlcnZlciAqLw0Kc3Rh dGljIGlzY19yZXN1bHRfdA0KZGx6X2xkYXBfY29ubmVjdChsZGFwX2luc3RhbmNlX3QgKmRiaSwg ZGJpbnN0YW5jZV90ICpkYmMpIHsNCglpc2NfcmVzdWx0X3QgcmVzdWx0Ow0KCWludCBsZGFwX3Jl c3VsdDsNCg0KCS8qIGlmIHdlIGhhdmUgYSBjb25uZWN0aW9uLCBnZXQgcmlkZSBvZiBpdC4gKi8N CglpZiAoZGJjLT5kYmNvbm4gIT0gTlVMTCkgew0KCQlsZGFwX3VuYmluZF9zKChMREFQICopIGRi Yy0+ZGJjb25uKTsNCgkJZGJjLT5kYmNvbm4gPSBOVUxMOw0KCX0NCg0KCS8qIG5vdyBjb25uZWN0 IC8gcmVjb25uZWN0LiAqLw0KDQoJLyogaW5pdGlhbGl6ZS4gKi8NCglkYmMtPmRiY29ubiA9IGxk YXBfaW5pdChkYmktPmhvc3RzLCBMREFQX1BPUlQpOw0KCWlmIChkYmMtPmRiY29ubiA9PSBOVUxM KQ0KCQlyZXR1cm4gKElTQ19SX05PTUVNT1JZKTsNCg0KCS8qIHNldCBwcm90b2NvbCB2ZXJzaW9u LiAqLw0KCWxkYXBfcmVzdWx0ID0gbGRhcF9zZXRfb3B0aW9uKChMREFQICopIGRiYy0+ZGJjb25u LA0KCQkJCSAgICAgIExEQVBfT1BUX1BST1RPQ09MX1ZFUlNJT04sDQoJCQkJICAgICAgJihkYmkt PnByb3RvY29sKSk7DQoJaWYgKGxkYXBfcmVzdWx0ICE9IExEQVBfU1VDQ0VTUykgew0KCQlyZXN1 bHQgPSBJU0NfUl9OT1BFUk07DQoJCWdvdG8gY2xlYW51cDsNCgl9DQoNCgkvKiAiYmluZCIgdG8g c2VydmVyLiAgaS5lLiBzZW5kIHVzZXJuYW1lIC8gcGFzcyAqLw0KCWxkYXBfcmVzdWx0ID0gbGRh cF9iaW5kX3MoKExEQVAgKikgZGJjLT5kYmNvbm4sIGRiaS0+dXNlciwNCgkJCQkgIGRiaS0+Y3Jl ZCwgZGJpLT5tZXRob2QpOw0KCWlmIChsZGFwX3Jlc3VsdCAhPSBMREFQX1NVQ0NFU1MpIHsNCgkJ cmVzdWx0ID0gSVNDX1JfRkFJTFVSRTsNCgkJZ290byBjbGVhbnVwOw0KCX0NCg0KCXJldHVybiAo SVNDX1JfU1VDQ0VTUyk7DQoNCiBjbGVhbnVwOg0KDQoJLyogY2xlYW51cCBpZiBmYWlsdXJlLiAq Lw0KCWlmIChkYmMtPmRiY29ubiAhPSBOVUxMKSB7DQoJCWxkYXBfdW5iaW5kX3MoKExEQVAgKikg ZGJjLT5kYmNvbm4pOw0KCQlkYmMtPmRiY29ubiA9IE5VTEw7DQoJfQ0KDQoJcmV0dXJuIChyZXN1 bHQpOw0KfQ0KDQojaWZkZWYgSVNDX1BMQVRGT1JNX1VTRVRIUkVBRFMNCg0KDQovKiUNCiAqIFBy b3Blcmx5IGNsZWFucyB1cCBhIGxpc3Qgb2YgZGF0YWJhc2UgaW5zdGFuY2VzLg0KICogVGhpcyBm dW5jdGlvbiBpcyBvbmx5IHVzZWQgd2hlbiB0aGUgZHJpdmVyIGlzIGNvbXBpbGVkIGZvcg0KICog bXVsdGl0aHJlYWRlZCBvcGVyYXRpb24uDQogKi8NCnN0YXRpYyB2b2lkDQpsZGFwX2Rlc3Ryb3lf ZGJsaXN0KGRiX2xpc3RfdCAqZGJsaXN0KSB7DQoJZGJpbnN0YW5jZV90ICpuZGJpID0gTlVMTDsN CglkYmluc3RhbmNlX3QgKmRiaSA9IE5VTEw7DQoNCgkvKiBnZXQgdGhlIGZpcnN0IERCSSBpbiB0 aGUgbGlzdCAqLw0KCW5kYmkgPSBJU0NfTElTVF9IRUFEKCpkYmxpc3QpOw0KDQoJLyogbG9vcCB0 aHJvdWdoIHRoZSBsaXN0ICovDQoJd2hpbGUgKG5kYmkgIT0gTlVMTCkgew0KCQlkYmkgPSBuZGJp Ow0KCQkvKiBnZXQgdGhlIG5leHQgREJJIGluIHRoZSBsaXN0ICovDQoJCW5kYmkgPSBJU0NfTElT VF9ORVhUKGRiaSwgbGluayk7DQoJCS8qIHJlbGVhc2UgREIgY29ubmVjdGlvbiAqLw0KCQlpZiAo ZGJpLT5kYmNvbm4gIT0gTlVMTCkNCgkJCWxkYXBfdW5iaW5kX3MoKExEQVAgKikgZGJpLT5kYmNv bm4pOw0KCQkvKiByZWxlYXNlIGFsbCBtZW1vcnkgdGhhdCBjb21wcmlzZWQgYSBEQkkgKi8NCgkJ ZGVzdHJveV9zcWxkYmluc3RhbmNlKGRiaSk7DQoJfQ0KCS8qIHJlbGVhc2UgbWVtb3J5IGZvciB0 aGUgbGlzdCBzdHJ1Y3R1cmUgKi8NCglpc2NfbWVtX3B1dChuc19nX21jdHgsIGRibGlzdCwgc2l6 ZW9mKGRiX2xpc3RfdCkpOw0KfQ0KDQovKiUNCiAqIExvb3BzIHRocm91Z2ggdGhlIGxpc3Qgb2Yg REIgaW5zdGFuY2VzLCBhdHRlbXB0aW5nIHRvIGxvY2sNCiAqIG9uIHRoZSBtdXRleC4gIElmIHN1 Y2Nlc3NmdWwsIHRoZSBEQkkgaXMgcmVzZXJ2ZWQgZm9yIHVzZQ0KICogYW5kIHRoZSB0aHJlYWQg Y2FuIHBlcmZvcm0gcXVlcmllcyBhZ2FpbnN0IHRoZSBkYXRhYmFzZS4NCiAqIElmIHRoZSBsb2Nr IGZhaWxzLCB0aGUgbmV4dCBvbmUgaW4gdGhlIGxpc3QgaXMgdHJpZWQuDQogKiBsb29waW5nIGNv bnRpbnVlcyB1bnRpbCBhIGxvY2sgaXMgb2J0YWluZWQsIG9yIHVudGlsDQogKiB0aGUgbGlzdCBo YXMgYmVlbiBzZWFyY2hlZCBkYmNfc2VhcmNoX2xpbWl0IHRpbWVzLg0KICogVGhpcyBmdW5jdGlv biBpcyBvbmx5IHVzZWQgd2hlbiB0aGUgZHJpdmVyIGlzIGNvbXBpbGVkIGZvcg0KICogbXVsdGl0 aHJlYWRlZCBvcGVyYXRpb24uDQogKi8NCnN0YXRpYyBkYmluc3RhbmNlX3QgKg0KbGRhcF9maW5k X2F2YWlsX2Nvbm4oZGJfbGlzdF90ICpkYmxpc3QpIHsNCglkYmluc3RhbmNlX3QgKmRiaSA9IE5V TEw7DQoJZGJpbnN0YW5jZV90ICpoZWFkOw0KCWludCBjb3VudCA9IDA7DQoNCgkvKiBnZXQgdG9w IG9mIGxpc3QgKi8NCgloZWFkID0gZGJpID0gSVNDX0xJU1RfSEVBRCgqZGJsaXN0KTsNCg0KCS8q IGxvb3AgdGhyb3VnaCBsaXN0ICovDQoJd2hpbGUgKGNvdW50IDwgZGJjX3NlYXJjaF9saW1pdCkg ew0KCQkvKiB0cnkgdG8gbG9jayBvbiB0aGUgbXV0ZXggKi8NCgkJaWYgKGlzY19tdXRleF90cnls b2NrKCZkYmktPmluc3RhbmNlX2xvY2spID09IElTQ19SX1NVQ0NFU1MpDQoJCQlyZXR1cm4gKGRi aSk7IC8qIHN1Y2Nlc3MsIHJldHVybiB0aGUgREJJIGZvciB1c2UuICovDQoNCgkJLyogbm90IHN1 Y2Nlc3NmdWwsIGtlZXAgdHJ5aW5nICovDQoJCWRiaSA9IElTQ19MSVNUX05FWFQoZGJpLCBsaW5r KTsNCg0KCQkvKiBjaGVjayB0byBzZWUgaWYgd2UgaGF2ZSBnb25lIHRvIHRoZSB0b3Agb2YgdGhl IGxpc3QuICovDQoJCWlmIChkYmkgPT0gTlVMTCkgew0KCQkJY291bnQrKzsNCgkJCWRiaSA9IGhl YWQ7DQoJCX0NCgl9DQoJaXNjX2xvZ193cml0ZShkbnNfbGN0eCwgRE5TX0xPR0NBVEVHT1JZX0RB VEFCQVNFLA0KCQkgICAgICBETlNfTE9HTU9EVUxFX0RMWiwgSVNDX0xPR19JTkZPLA0KCQkgICAg ICAiTERBUCBkcml2ZXIgdW5hYmxlIHRvIGZpbmQgYXZhaWxhYmxlIGNvbm5lY3Rpb24gIg0KCQkg ICAgICAiYWZ0ZXIgc2VhcmNoaW5nICVkIHRpbWVzIiwNCgkJICAgICAgY291bnQpOw0KCXJldHVy biAoTlVMTCk7DQp9DQojZW5kaWYgLyogSVNDX1BMQVRGT1JNX1VTRVRIUkVBRFMgKi8NCg0Kc3Rh dGljIGlzY19yZXN1bHRfdA0KbGRhcF9wcm9jZXNzX3Jlc3VsdHMoTERBUCAqZGJjLCBMREFQTWVz c2FnZSAqbXNnLCBjaGFyICoqIGF0dHJzLA0KCQkgICAgIHZvaWQgKnB0ciwgaXNjX2Jvb2xlYW5f dCBhbGxub2RlcykNCnsNCglpc2NfcmVzdWx0X3QgcmVzdWx0ID0gSVNDX1JfU1VDQ0VTUzsNCglp bnQgaSA9IDA7DQoJaW50IGo7DQoJaW50IGxlbjsNCgljaGFyICphdHRyaWJ1dGUgPSBOVUxMOw0K CUxEQVBNZXNzYWdlICplbnRyeTsNCgljaGFyICplbmRwID0gTlVMTDsNCgljaGFyICpob3N0ID0g TlVMTDsNCgljaGFyICp0eXBlID0gTlVMTDsNCgljaGFyICpkYXRhID0gTlVMTDsNCgljaGFyICoq dmFscyA9IE5VTEw7DQoJaW50IHR0bDsNCg0KCS8qIG1ha2Ugc3VyZSB0aGVyZSBhcmUgYXQgbGVh c3Qgc29tZSBhdHRyaWJ1dGVzIHRvIHByb2Nlc3MuICovDQoJUkVRVUlSRShhdHRycyAhPSBOVUxM IHx8IGF0dHJzWzBdICE9IE5VTEwpOw0KDQoJLyogZ2V0IHRoZSBmaXJzdCBlbnRyeSB0byBwcm9j ZXNzICovDQoJZW50cnkgPSBsZGFwX2ZpcnN0X2VudHJ5KGRiYywgbXNnKTsNCglpZiAoZW50cnkg PT0gTlVMTCkgew0KCQlpc2NfbG9nX3dyaXRlKGRuc19sY3R4LCBETlNfTE9HQ0FURUdPUllfREFU QUJBU0UsDQoJCQkgICAgICBETlNfTE9HTU9EVUxFX0RMWiwgSVNDX0xPR19JTkZPLA0KCQkJICAg ICAgIkxEQVAgbm8gZW50cmllcyB0byBwcm9jZXNzLiIpOw0KCQlyZXR1cm4gKElTQ19SX0ZBSUxV UkUpOw0KCX0NCg0KCS8qIGxvb3AgdGhyb3VnaCBhbGwgZW50cmllcyByZXR1cm5lZCAqLw0KCXdo aWxlIChlbnRyeSAhPSBOVUxMKSB7DQoJCS8qIHJlc2V0IGZvciB0aGlzIGxvb3AgKi8NCgkJdHRs ID0gMDsNCgkJbGVuID0gMDsNCgkJaSA9IDA7DQoJCWF0dHJpYnV0ZSA9IGF0dHJzW2ldOw0KDQoJ CS8qIGRldGVybWluZSBob3cgbXVjaCBzcGFjZSB3ZSBuZWVkIGZvciBkYXRhIHN0cmluZyAqLw0K CQlmb3IgKGogPSAwOyBhdHRyc1tqXSAhPSBOVUxMOyBqKyspIHsNCgkJCS8qIGdldCB0aGUgbGlz dCBvZiB2YWx1ZXMgZm9yIHRoaXMgYXR0cmlidXRlLiAqLw0KCQkJdmFscyA9IGxkYXBfZ2V0X3Zh bHVlcyhkYmMsIGVudHJ5LCBhdHRyc1tqXSk7DQoJCQkvKiBza2lwIGVtcHR5IGF0dHJpYnV0ZXMu ICovDQoJCQlpZiAodmFscyA9PSBOVUxMIHx8IGxkYXBfY291bnRfdmFsdWVzKHZhbHMpIDwgMSkN CgkJCQljb250aW51ZTsNCgkJCS8qDQoJCQkgKiB3ZSBvbmx5IHVzZSB0aGUgZmlyc3QgdmFsdWUu ICB0aGlzIGRyaXZlcg0KCQkJICogZG9lcyBub3Qgc3VwcG9ydCBtdWx0aS12YWx1ZWQgYXR0cmli dXRlcy4NCgkJCSAqLw0KCQkJbGVuID0gbGVuICsgc3RybGVuKHZhbHNbMF0pICsgMTsNCgkJCS8q IGZyZWUgdmFscyBmb3IgbmV4dCBsb29wICovDQoJCQlsZGFwX3ZhbHVlX2ZyZWUodmFscyk7DQoJ CX0gLyogZW5kIGZvciAoaiA9IDA7IGF0dHJzW2pdICE9IE5VTEwsIGorKykgbG9vcCAqLw0KDQoJ CS8qIGFsbG9jYXRlIG1lbW9yeSBmb3IgZGF0YSBzdHJpbmcgKi8NCgkJZGF0YSA9IGlzY19tZW1f YWxsb2NhdGUobnNfZ19tY3R4LCBsZW4gKyAxKTsNCgkJaWYgKGRhdGEgPT0gTlVMTCkgew0KCQkJ aXNjX2xvZ193cml0ZShkbnNfbGN0eCwgRE5TX0xPR0NBVEVHT1JZX0RBVEFCQVNFLA0KCQkJCSAg ICAgIEROU19MT0dNT0RVTEVfRExaLCBJU0NfTE9HX0VSUk9SLA0KCQkJCSAgICAgICJMREFQIGRy aXZlciB1bmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5ICINCgkJCQkgICAgICAid2hpbGUgcHJvY2Vz c2luZyByZXN1bHRzIik7DQoJCQlyZXN1bHQgPSBJU0NfUl9GQUlMVVJFOw0KCQkJZ290byBjbGVh bnVwOw0KCQl9DQoNCgkJLyoNCgkJICogTWFrZSBzdXJlIGRhdGEgaXMgbnVsbCB0ZXJtZWQgYXQg dGhlIGJlZ2lubmluZyBzbw0KCQkgKiB3ZSBjYW4gY2hlY2sgaWYgYW55IGRhdGEgd2FzIHN0b3Jl ZCB0byBpdCBsYXRlci4NCgkJICovDQoJCWRhdGFbMF0gPSAnXDAnOw0KDQoJCS8qIHJlc2V0IGog dG8gcmUtdXNlIGJlbG93ICovDQoJCWogPSAwOw0KDQoJCS8qIGxvb3AgdGhyb3VnaCB0aGUgYXR0 cmlidXRlcyBpbiB0aGUgb3JkZXIgc3BlY2lmaWVkLiAqLw0KCQl3aGlsZSAoYXR0cmlidXRlICE9 IE5VTEwpIHsNCgkJCS8qIGdldCB0aGUgbGlzdCBvZiB2YWx1ZXMgZm9yIHRoaXMgYXR0cmlidXRl LiAqLw0KCQkJdmFscyA9IGxkYXBfZ2V0X3ZhbHVlcyhkYmMsIGVudHJ5LCBhdHRyaWJ1dGUpOw0K DQoJCQkvKiBza2lwIGVtcHR5IGF0dHJpYnV0ZXMuICovDQoJCQlpZiAodmFscyA9PSBOVUxMIHx8 IHZhbHNbMF0gPT0gTlVMTCkgew0KCQkJCS8qIGluY3JlbWVudCBhdHRpYnV0ZSBwb2ludGVyICov DQoJCQkJYXR0cmlidXRlID0gYXR0cnNbKytpXTsNCgkJCQkvKiBzdGFydCBsb29wIG92ZXIgKi8N CgkJCQljb250aW51ZTsNCgkJCX0NCg0KCQkJLyoNCgkJCSAqIGogaW5pdGlhbGx5ID0gMC4gIElu Y3JlbWVudCBqIGVhY2ggdGltZSB3ZQ0KCQkJICogc2V0IGEgZmllbGQgdGhhdCB3YXkgbmV4dCBs b29wIHdpbGwgc2V0DQoJCQkgKiBuZXh0IGZpZWxkLg0KCQkJICovDQoJCQlzd2l0Y2goaikgew0K CQkJY2FzZSAwOg0KCQkJCWorKzsNCgkJCQkvKg0KCQkJCSAqIGNvbnZlcnQgdGV4dCB0byBpbnQs IG1ha2Ugc3VyZSBpdA0KCQkJCSAqIHdvcmtlZCByaWdodA0KCQkJCSAqLw0KCQkJCXR0bCA9IHN0 cnRvbCh2YWxzWzBdLCAmZW5kcCwgMTApOw0KCQkJCWlmICgqZW5kcCAhPSAnXDAnIHx8IHR0bCA8 IDApIHsNCgkJCQkJaXNjX2xvZ193cml0ZShkbnNfbGN0eCwNCgkJCQkJCSAgICAgIEROU19MT0dD QVRFR09SWV9EQVRBQkFTRSwNCgkJCQkJCSAgICAgIEROU19MT0dNT0RVTEVfRExaLA0KCQkJCQkJ ICAgICAgSVNDX0xPR19FUlJPUiwNCgkJCQkJCSAgICAgICJMREFQIGRyaXZlciB0dGwgbXVzdCAi DQoJCQkJCQkgICAgICAiYmUgYSBwb3N0aXZlIG51bWJlciIpOw0KCQkJCQlnb3RvIGNsZWFudXA7 DQoJCQkJfQ0KCQkJCWJyZWFrOw0KCQkJY2FzZSAxOg0KCQkJCWorKzsNCgkJCQl0eXBlID0gaXNj X21lbV9zdHJkdXAobnNfZ19tY3R4LCB2YWxzWzBdKTsNCgkJCQlicmVhazsNCgkJCWNhc2UgMjoN CgkJCQlqKys7DQoJCQkJaWYgKGFsbG5vZGVzKQ0KCQkJCQlob3N0ID0gaXNjX21lbV9zdHJkdXAo bnNfZ19tY3R4LA0KCQkJCQkJCSAgICAgIHZhbHNbMF0pOw0KCQkJCWVsc2UNCgkJCQkJc3RyY3B5 KGRhdGEsIHZhbHNbMF0pOw0KCQkJCWJyZWFrOw0KCQkJY2FzZSAzOg0KCQkJCWorKzsNCgkJCQlp ZiAoYWxsbm9kZXMpDQoJCQkJCXN0cmNweShkYXRhLCB2YWxzWzBdKTsNCgkJCQllbHNlIHsNCgkJ CQkJc3RyY2F0KGRhdGEsICIgIik7DQoJCQkJCXN0cmNhdChkYXRhLCB2YWxzWzBdKTsNCgkJCQl9 DQoJCQkJYnJlYWs7DQoJCQlkZWZhdWx0Og0KCQkJCXN0cmNhdChkYXRhLCAiICIpOw0KCQkJCXN0 cmNhdChkYXRhLCB2YWxzWzBdKTsNCgkJCQlicmVhazsNCgkJCX0gLyogZW5kIHN3aXRjaChqKSAq Lw0KDQoJCQkvKiBmcmVlIHZhbHVlcyAqLw0KCQkJbGRhcF92YWx1ZV9mcmVlKHZhbHMpOw0KCQkJ dmFscyA9IE5VTEw7DQoNCgkJCS8qIGluY3JlbWVudCBhdHRpYnV0ZSBwb2ludGVyICovDQoJCQlh dHRyaWJ1dGUgPSBhdHRyc1srK2ldOw0KCQl9CS8qIGVuZCB3aGlsZSAoYXR0cmlidXRlICE9IE5V TEwpICovDQoNCgkJaWYgKHR5cGUgPT0gTlVMTCkgew0KCQkJaXNjX2xvZ193cml0ZShkbnNfbGN0 eCwgRE5TX0xPR0NBVEVHT1JZX0RBVEFCQVNFLA0KCQkJCSAgICAgIEROU19MT0dNT0RVTEVfRExa LCBJU0NfTE9HX0VSUk9SLA0KCQkJCSAgICAgICJMREFQIGRyaXZlciB1bmFibGUgIg0KCQkJCSAg ICAgICJ0byByZXRyaWV2ZSBETlMgdHlwZSIpOw0KCQkJcmVzdWx0ID0gSVNDX1JfRkFJTFVSRTsN CgkJCWdvdG8gY2xlYW51cDsNCgkJfQ0KDQoJCWlmIChzdHJsZW4oZGF0YSkgPCAxKSB7DQoJCQlp c2NfbG9nX3dyaXRlKGRuc19sY3R4LCBETlNfTE9HQ0FURUdPUllfREFUQUJBU0UsDQoJCQkJICAg ICAgRE5TX0xPR01PRFVMRV9ETFosIElTQ19MT0dfRVJST1IsDQoJCQkJICAgICAgIkxEQVAgZHJp dmVyIHVuYWJsZSAiDQoJCQkJICAgICAgInRvIHJldHJpZXZlIEROUyBkYXRhIik7DQoJCQlyZXN1 bHQgPSBJU0NfUl9GQUlMVVJFOw0KCQkJZ290byBjbGVhbnVwOw0KCQl9DQoNCgkJaWYgKGFsbG5v ZGVzICYmIGhvc3QgIT0gTlVMTCkgew0KCQkJaWYgKHN0cmNhc2VjbXAoaG9zdCwgIn4iKSA9PSAw KQ0KCQkJCXJlc3VsdCA9IGRuc19zZGx6X3B1dG5hbWVkcnIoDQoJCQkJCQkoZG5zX3NkbHphbGxu b2Rlc190ICopIHB0ciwNCgkJCQkJCSIqIiwgdHlwZSwgdHRsLCBkYXRhKTsNCgkJCWVsc2UNCgkJ CQlyZXN1bHQgPSBkbnNfc2Rsel9wdXRuYW1lZHJyKA0KCQkJCQkJKGRuc19zZGx6YWxsbm9kZXNf dCAqKSBwdHIsDQoJCQkJCQlob3N0LCB0eXBlLCB0dGwsIGRhdGEpOw0KCQkJaWYgKHJlc3VsdCAh PSBJU0NfUl9TVUNDRVNTKQ0KCQkJCWlzY19sb2dfd3JpdGUoZG5zX2xjdHgsDQoJCQkJCUROU19M T0dDQVRFR09SWV9EQVRBQkFTRSwNCgkJCQkJRE5TX0xPR01PRFVMRV9ETFosIElTQ19MT0dfRVJS T1IsDQoJCQkJCSJkbHotbGRhcDogcHV0bmFtZWRyciBmYWlsZWQgIg0KCQkJCQkiZm9yIFwiJXMg JXMgJXUgJXNcIiwgJXMiLA0KCQkJCQlob3N0LCB0eXBlLCB0dGwsIGRhdGEsDQoJCQkJCWlzY19y ZXN1bHRfdG90ZXh0KHJlc3VsdCkpOw0KCQl9IGVsc2Ugew0KCQkJcmVzdWx0ID0gZG5zX3NkbHpf cHV0cnIoKGRuc19zZGx6bG9va3VwX3QgKikgcHRyLA0KCQkJCQkJdHlwZSwgdHRsLCBkYXRhKTsN CgkJCWlmIChyZXN1bHQgIT0gSVNDX1JfU1VDQ0VTUykNCgkJCQlpc2NfbG9nX3dyaXRlKGRuc19s Y3R4LA0KCQkJCQlETlNfTE9HQ0FURUdPUllfREFUQUJBU0UsDQoJCQkJCUROU19MT0dNT0RVTEVf RExaLCBJU0NfTE9HX0VSUk9SLA0KCQkJCQkiZGx6LWxkYXA6IHB1dHJyIGZhaWxlZCAiDQoJCQkJ CSJmb3IgXCIlcyAldSAlc1wiLCAlcyIsDQoJCQkJCXR5cGUsIHR0bCwgZGF0YSwNCgkJCQkJaXNj X3Jlc3VsdF90b3RleHQocmVzdWx0KSk7DQoJCX0NCg0KCQlpZiAocmVzdWx0ICE9IElTQ19SX1NV Q0NFU1MpIHsNCgkJCWlzY19sb2dfd3JpdGUoZG5zX2xjdHgsIEROU19MT0dDQVRFR09SWV9EQVRB QkFTRSwNCgkJCQkgICAgICBETlNfTE9HTU9EVUxFX0RMWiwgSVNDX0xPR19FUlJPUiwNCgkJCQkg ICAgICAiTERBUCBkcml2ZXIgZmFpbGVkICINCgkJCQkgICAgICAid2hpbGUgc2VuZGluZyBkYXRh IHRvIEJJTkQuIik7DQoJCQlnb3RvIGNsZWFudXA7DQoJCX0NCg0KCQkvKiBmcmVlIG1lbW9yeSBm b3IgdHlwZSwgZGF0YSBhbmQgaG9zdCBmb3IgbmV4dCBsb29wICovDQoJCWlzY19tZW1fZnJlZShu c19nX21jdHgsIHR5cGUpOw0KCQlpc2NfbWVtX2ZyZWUobnNfZ19tY3R4LCBkYXRhKTsNCgkJaWYg KGhvc3QgIT0gTlVMTCkNCgkJCWlzY19tZW1fZnJlZShuc19nX21jdHgsIGhvc3QpOw0KDQoJCS8q IGdldCB0aGUgbmV4dCBlbnRyeSB0byBwcm9jZXNzICovDQoJCWVudHJ5ID0gbGRhcF9uZXh0X2Vu dHJ5KGRiYywgZW50cnkpOw0KCX0gLyogZW5kIHdoaWxlIChlbnRyeSAhPSBOVUxMKSAqLw0KDQog Y2xlYW51cDoNCgkvKiBkZS1hbGxvY2F0ZSBtZW1vcnkgKi8NCglpZiAodmFscyAhPSBOVUxMKQ0K CQlsZGFwX3ZhbHVlX2ZyZWUodmFscyk7DQoJaWYgKGhvc3QgIT0gTlVMTCkNCgkJaXNjX21lbV9m cmVlKG5zX2dfbWN0eCwgaG9zdCk7DQoJaWYgKHR5cGUgIT0gTlVMTCkNCgkJaXNjX21lbV9mcmVl KG5zX2dfbWN0eCwgdHlwZSk7DQoJaWYgKGRhdGEgIT0gTlVMTCkNCgkJaXNjX21lbV9mcmVlKG5z X2dfbWN0eCwgZGF0YSk7DQoNCglyZXR1cm4gKHJlc3VsdCk7DQp9DQoNCi8qJQ0KICogVGhpcyBm dW5jdGlvbiBpcyB0aGUgcmVhbCBjb3JlIG9mIHRoZSBkcml2ZXIuICAgWm9uZSwgcmVjb3JkDQog KiBhbmQgY2xpZW50IHN0cmluZ3MgYXJlIHBhc3NlZCBpbiAob3IgTlVMTCBpcyBwYXNzZWQgaWYg dGhlDQogKiBzdHJpbmcgaXMgbm90IGF2YWlsYWJsZSkuICBUaGUgdHlwZSBvZiBxdWVyeSB3ZSB3 YW50IHRvIHJ1bg0KICogaXMgaW5kaWNhdGVkIGJ5IHRoZSBxdWVyeSBmbGFnLCBhbmQgdGhlIGRi ZGF0YSBvYmplY3QgaXMgcGFzc2VkDQogKiBwYXNzZWQgaW4gdG8uICBkYmRhdGEgcmVhbGx5IGhv bGRzIGVpdGhlcjoNCiAqCQkxKSBhIGxpc3Qgb2YgZGF0YWJhc2UgaW5zdGFuY2VzIChpbiBtdWx0 aXRocmVhZGVkIG1vZGUpIE9SDQogKgkJMikgYSBzaW5nbGUgZGF0YWJhc2UgaW5zdGFuY2UgKGlu IHNpbmdsZSB0aHJlYWRlZCBtb2RlKQ0KICogVGhlIGZ1bmN0aW9uIHdpbGwgY29uc3RydWN0IHRo ZSBxdWVyeSBhbmQgb2J0YWluIGFuIGF2YWlsYWJsZQ0KICogZGF0YWJhc2UgaW5zdGFuY2UgKERC SSkuICBJdCB3aWxsIHRoZW4gcnVuIHRoZSBxdWVyeSBhbmQgaG9wZWZ1bGx5DQogKiBvYnRhaW4g YSByZXN1bHQgc2V0Lg0KICovDQpzdGF0aWMgaXNjX3Jlc3VsdF90DQpsZGFwX2dldF9yZXN1bHRz KGNvbnN0IGNoYXIgKnpvbmUsIGNvbnN0IGNoYXIgKnJlY29yZCwNCgkJIGNvbnN0IGNoYXIgKmNs aWVudCwgdW5zaWduZWQgaW50IHF1ZXJ5LA0KCQkgdm9pZCAqZGJkYXRhLCB2b2lkICpwdHIpDQp7 DQoJaXNjX3Jlc3VsdF90IHJlc3VsdDsNCglkYmluc3RhbmNlX3QgKmRiaSA9IE5VTEw7DQoJY2hh ciAqcXVlcnlzdHJpbmcgPSBOVUxMOw0KCUxEQVBVUkxEZXNjICpsZGFwX3VybCA9IE5VTEw7DQoJ aW50IGxkYXBfcmVzdWx0ID0gMDsNCglMREFQTWVzc2FnZSAqbGRhcF9tc2cgPSBOVUxMOw0KCWlu dCBpOw0KCWludCBlbnRyaWVzOw0KDQoJLyogZ2V0IGRiIGluc3RhbmNlIC8gY29ubmVjdGlvbiAq Lw0KI2lmZGVmIElTQ19QTEFURk9STV9VU0VUSFJFQURTDQoNCgkvKiBmaW5kIGFuIGF2YWlsYWJs ZSBEQkkgZnJvbSB0aGUgbGlzdCAqLw0KCWRiaSA9IGxkYXBfZmluZF9hdmFpbF9jb25uKChkYl9s aXN0X3QgKikNCgkJCQkgICAoKGxkYXBfaW5zdGFuY2VfdCAqKWRiZGF0YSktPmRiKTsNCg0KI2Vs c2UgLyogSVNDX1BMQVRGT1JNX1VTRVRIUkVBRFMgKi8NCg0KCS8qDQoJICogb25seSAxIERCSSAt IG5vIG5lZWQgdG8gbG9jayBpbnN0YW5jZSBsb2NrIGVpdGhlcg0KCSAqIG9ubHkgMSB0aHJlYWQg aW4gdGhlIHdob2xlIHByb2Nlc3MsIG5vIHBvc3NpYmxlIGNvbnRlbnRpb24uDQoJICovDQoJZGJp ID0gIChkYmluc3RhbmNlX3QgKikgKChsZGFwX2luc3RhbmNlX3QgKilkYmRhdGEpLT5kYjsNCg0K I2VuZGlmIC8qIElTQ19QTEFURk9STV9VU0VUSFJFQURTICovDQoNCgkvKiBpZiBEQkkgaXMgbnVs bCwgY2FuJ3QgZG8gYW55dGhpbmcgZWxzZSAqLw0KCWlmIChkYmkgPT0gTlVMTCkNCgkJcmV0dXJu IChJU0NfUl9GQUlMVVJFKTsNCg0KCS8qIHNldCBmaWVsZHMgKi8NCglpZiAoem9uZSAhPSBOVUxM KSB7DQoJCWRiaS0+em9uZSA9IGlzY19tZW1fc3RyZHVwKG5zX2dfbWN0eCwgem9uZSk7DQoJCWlm IChkYmktPnpvbmUgPT0gTlVMTCkgew0KCQkJcmVzdWx0ID0gSVNDX1JfTk9NRU1PUlk7DQoJCQln b3RvIGNsZWFudXA7DQoJCX0NCgl9IGVsc2Ugew0KCQlkYmktPnpvbmUgPSBOVUxMOw0KCX0NCglp ZiAocmVjb3JkICE9IE5VTEwpIHsNCgkJZGJpLT5yZWNvcmQgPSBpc2NfbWVtX3N0cmR1cChuc19n X21jdHgsIHJlY29yZCk7DQoJCWlmIChkYmktPnJlY29yZCA9PSBOVUxMKSB7DQoJCQlyZXN1bHQg PSBJU0NfUl9OT01FTU9SWTsNCgkJCWdvdG8gY2xlYW51cDsNCgkJfQ0KCX0gZWxzZSB7DQoJCWRi aS0+cmVjb3JkID0gTlVMTDsNCgl9DQoJaWYgKGNsaWVudCAhPSBOVUxMKSB7DQoJCWRiaS0+Y2xp ZW50ID0gaXNjX21lbV9zdHJkdXAobnNfZ19tY3R4LCBjbGllbnQpOw0KCQlpZiAoZGJpLT5jbGll bnQgPT0gTlVMTCkgew0KCQkJcmVzdWx0ID0gSVNDX1JfTk9NRU1PUlk7DQoJCQlnb3RvIGNsZWFu dXA7DQoJCX0NCgl9IGVsc2Ugew0KCQlkYmktPmNsaWVudCA9IE5VTEw7DQoJfQ0KDQoJLyogd2hh dCB0eXBlIG9mIHF1ZXJ5IGFyZSB3ZSBnb2luZyB0byBydW4/ICovDQoJc3dpdGNoKHF1ZXJ5KSB7 DQoJY2FzZSBBTExOT0RFUzoNCgkJLyoNCgkJICogaWYgdGhlIHF1ZXJ5IHdhcyBub3QgcGFzc2Vk IGluIGZyb20gdGhlIGNvbmZpZyBmaWxlDQoJCSAqIHRoZW4gd2UgY2FuJ3QgcnVuIGl0LiAgcmV0 dXJuIG5vdF9pbXBsZW1lbnRlZCwgc28NCgkJICogaXQncyBsaWtlIHRoZSBjb2RlIGZvciB0aGF0 IG9wZXJhdGlvbiB3YXMgbmV2ZXINCgkJICogYnVpbHQgaW50byB0aGUgZHJpdmVyLi4uLiBBSEhI IGZsZXhpYmlsaXR5ISEhDQoJCSAqLw0KCQlpZiAoZGJpLT5hbGxub2Rlc19xID09IE5VTEwpIHsN CgkJCXJlc3VsdCA9IElTQ19SX05PVElNUExFTUVOVEVEOw0KCQkJZ290byBjbGVhbnVwOw0KCQl9 IGVsc2Ugew0KCQkJcXVlcnlzdHJpbmcgPSBidWlsZF9xdWVyeXN0cmluZyhuc19nX21jdHgsDQoJ CQlkYmktPmFsbG5vZGVzX3EpOw0KCQl9DQoJCWJyZWFrOw0KCWNhc2UgQUxMT1dYRlI6DQoJCS8q IHNhbWUgYXMgY29tbWVudHMgYXMgQUxMTk9ERVMgKi8NCgkJaWYgKGRiaS0+YWxsb3d4ZnJfcSA9 PSBOVUxMKSB7DQoJCQlyZXN1bHQgPSBJU0NfUl9OT1RJTVBMRU1FTlRFRDsNCgkJCWdvdG8gY2xl YW51cDsNCgkJfSBlbHNlIHsNCgkJCXF1ZXJ5c3RyaW5nID0gYnVpbGRfcXVlcnlzdHJpbmcobnNf Z19tY3R4LA0KCQkJZGJpLT5hbGxvd3hmcl9xKTsNCgkJfQ0KCQlicmVhazsNCgljYXNlIEFVVEhP UklUWToNCgkJLyogc2FtZSBhcyBjb21tZW50cyBhcyBBTExOT0RFUyAqLw0KCQlpZiAoZGJpLT5h dXRob3JpdHlfcSA9PSBOVUxMKSB7DQoJCQlyZXN1bHQgPSBJU0NfUl9OT1RJTVBMRU1FTlRFRDsN CgkJCWdvdG8gY2xlYW51cDsNCgkJfSBlbHNlIHsNCgkJCXF1ZXJ5c3RyaW5nID0gYnVpbGRfcXVl cnlzdHJpbmcobnNfZ19tY3R4LA0KCQkJZGJpLT5hdXRob3JpdHlfcSk7DQoJCX0NCgkJYnJlYWs7 DQoJY2FzZSBGSU5EWk9ORToNCgkJLyogdGhpcyBpcyByZXF1aXJlZC4gIEl0J3MgdGhlIHdob2xl IHBvaW50IG9mIERMWiEgKi8NCgkJaWYgKGRiaS0+ZmluZHpvbmVfcSA9PSBOVUxMKSB7DQoJCQlp c2NfbG9nX3dyaXRlKGRuc19sY3R4LCBETlNfTE9HQ0FURUdPUllfREFUQUJBU0UsDQoJCQkJICAg ICAgRE5TX0xPR01PRFVMRV9ETFosIElTQ19MT0dfREVCVUcoMiksDQoJCQkJICAgICAgIk5vIHF1 ZXJ5IHNwZWNpZmllZCBmb3IgZmluZHpvbmUuICAiDQoJCQkJICAgICAgIkZpbmR6b25lIHJlcXVp cmVzIGEgcXVlcnkiKTsNCgkJCXJlc3VsdCA9IElTQ19SX0ZBSUxVUkU7DQoJCQlnb3RvIGNsZWFu dXA7DQoJCX0gZWxzZSB7DQoJCQlxdWVyeXN0cmluZyA9IGJ1aWxkX3F1ZXJ5c3RyaW5nKG5zX2df bWN0eCwNCgkJCWRiaS0+ZmluZHpvbmVfcSk7DQoJCX0NCgkJYnJlYWs7DQoJY2FzZSBMT09LVVA6 DQoJCS8qIHRoaXMgaXMgcmVxdWlyZWQuICBJdCdzIGFsc28gYSBtYWpvciBwb2ludCBvZiBETFoh ICovDQoJCWlmIChkYmktPmxvb2t1cF9xID09IE5VTEwpIHsNCgkJCWlzY19sb2dfd3JpdGUoZG5z X2xjdHgsIEROU19MT0dDQVRFR09SWV9EQVRBQkFTRSwNCgkJCQkgICAgICBETlNfTE9HTU9EVUxF X0RMWiwgSVNDX0xPR19ERUJVRygyKSwNCgkJCQkgICAgICAiTm8gcXVlcnkgc3BlY2lmaWVkIGZv ciBsb29rdXAuICAiDQoJCQkJICAgICAgIkxvb2t1cCByZXF1aXJlcyBhIHF1ZXJ5Iik7DQoJCQly ZXN1bHQgPSBJU0NfUl9GQUlMVVJFOw0KCQkJZ290byBjbGVhbnVwOw0KCQl9IGVsc2Ugew0KCQkJ cXVlcnlzdHJpbmcgPSBidWlsZF9xdWVyeXN0cmluZyhuc19nX21jdHgsDQoJCQkJCQkJZGJpLT5s b29rdXBfcSk7DQoJCX0NCgkJYnJlYWs7DQoJZGVmYXVsdDoNCgkJLyoNCgkJICogdGhpcyBzaG91 bGQgbmV2ZXIgaGFwcGVuLiAgSWYgaXQgZG9lcywgdGhlIGNvZGUgaXMNCgkJICogc2NyZXdlZCB1 cCENCgkJICovDQoJCVVORVhQRUNURURfRVJST1IoX19GSUxFX18sIF9fTElORV9fLA0KCQkJCSAi SW5jb3JyZWN0IHF1ZXJ5IGZsYWcgcGFzc2VkIHRvICINCgkJCQkgImxkYXBfZ2V0X3Jlc3VsdHMi KTsNCgkJcmVzdWx0ID0gSVNDX1JfVU5FWFBFQ1RFRDsNCgkJZ290byBjbGVhbnVwOw0KCX0NCg0K CS8qIGlmIHRoZSBxdWVyeXN0cmluZyBpcyBudWxsLCBCdW1tZXIsIG91dHRhIFJBTS4gIFVQR1JB REUgVElNRSEhISAgICovDQoJaWYgKHF1ZXJ5c3RyaW5nICA9PSBOVUxMKSB7DQoJCXJlc3VsdCA9 IElTQ19SX05PTUVNT1JZOw0KCQlnb3RvIGNsZWFudXA7DQoJfQ0KDQoJLyoNCgkgKiBvdXRwdXQg dGhlIGZ1bGwgcXVlcnkgc3RyaW5nIGR1cmluZyBkZWJ1ZyBzbyB3ZSBjYW4gc2VlDQoJICogd2hh dCBsYW1lIGVycm9yIHRoZSBxdWVyeSBoYXMuDQoJICovDQoJaXNjX2xvZ193cml0ZShkbnNfbGN0 eCwgRE5TX0xPR0NBVEVHT1JZX0RBVEFCQVNFLA0KCQkgICAgICBETlNfTE9HTU9EVUxFX0RMWiwg SVNDX0xPR19ERUJVRygxKSwNCgkJICAgICAgIlxuUXVlcnkgU3RyaW5nOiAlc1xuIiwgcXVlcnlz dHJpbmcpOw0KDQogICAgICAgIC8qIGJyZWFrIFVSTCBkb3duIGludG8gaXQncyBjb21wb25lbnQg cGFydHMsIGlmIGVycm9yIGNsZWFudXAgKi8NCglsZGFwX3Jlc3VsdCA9IGxkYXBfdXJsX3BhcnNl KHF1ZXJ5c3RyaW5nLCAmbGRhcF91cmwpOw0KCWlmIChsZGFwX3Jlc3VsdCAhPSBMREFQX1NVQ0NF U1MgfHwgbGRhcF91cmwgPT0gTlVMTCkgew0KCQlyZXN1bHQgPSBJU0NfUl9GQUlMVVJFOw0KCQln b3RvIGNsZWFudXA7DQoJfQ0KCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsNCg0KCQkvKg0KCQkg KiBkYmktPmRiY29ubiBtYXkgYmUgbnVsbCBpZiB0cnlpbmcgdG8gcmVjb25uZWN0IG9uIGENCgkJ ICogcHJldmlvdXMgcXVlcnkgZmFpbGVkLg0KCQkgKi8NCgkJaWYgKGRiaS0+ZGJjb25uID09IE5V TEwpIHsNCgkJCWlzY19sb2dfd3JpdGUoZG5zX2xjdHgsIEROU19MT0dDQVRFR09SWV9EQVRBQkFT RSwNCgkJCQkgICAgICBETlNfTE9HTU9EVUxFX0RMWiwgSVNDX0xPR19JTkZPLA0KCQkJCSAgICAg ICJMREFQIGRyaXZlciBhdHRlbXB0aW5nIHRvIHJlLWNvbm5lY3QiKTsNCg0KCQkJcmVzdWx0ID0g ZGx6X2xkYXBfY29ubmVjdCgobGRhcF9pbnN0YW5jZV90ICopIGRiZGF0YSwNCgkJCQkJCSAgZGJp KTsNCgkJCWlmIChyZXN1bHQgIT0gSVNDX1JfU1VDQ0VTUykgew0KCQkJCXJlc3VsdCA9IElTQ19S X0ZBSUxVUkU7DQoJCQkJY29udGludWU7DQoJCQl9DQoJCX0NCg0KCQkvKiBwZXJmb3JtIGxkYXAg c2VhcmNoIHN5bmNyb25vdXNseSAqLw0KCQlsZGFwX3Jlc3VsdCA9IGxkYXBfc2VhcmNoX3MoKExE QVAgKikgZGJpLT5kYmNvbm4sDQoJCQkJCSAgICBsZGFwX3VybC0+bHVkX2RuLA0KCQkJCQkgICAg bGRhcF91cmwtPmx1ZF9zY29wZSwNCgkJCQkJICAgIGxkYXBfdXJsLT5sdWRfZmlsdGVyLA0KCQkJ CQkgICAgbGRhcF91cmwtPmx1ZF9hdHRycywgMCwgJmxkYXBfbXNnKTsNCg0KCQkvKg0KCQkgKiBj aGVjayByZXR1cm4gY29kZS4gIE5vIHN1Y2ggb2JqZWN0IGlzIG9rLCBqdXN0DQoJCSAqIGRpZG4n dCBmaW5kIHdoYXQgd2Ugd2FudGVkDQoJCSAqLw0KCQlzd2l0Y2gobGRhcF9yZXN1bHQpIHsNCgkJ Y2FzZSBMREFQX05PX1NVQ0hfT0JKRUNUOg0KICAgIAkJCWlzY19sb2dfd3JpdGUoZG5zX2xjdHgs IEROU19MT0dDQVRFR09SWV9EQVRBQkFTRSwNCgkJCQkgICAgICBETlNfTE9HTU9EVUxFX0RMWiwg SVNDX0xPR19ERUJVRygxKSwNCgkJCQkgICAgICAiTm8gb2JqZWN0IGZvdW5kIG1hdGNoaW5nICIN CgkJCQkgICAgICAicXVlcnkgcmVxdWlyZW1lbnRzIik7DQoJCQlyZXN1bHQgPSBJU0NfUl9OT1RG T1VORDsNCgkJCWdvdG8gY2xlYW51cDsNCgkJCWJyZWFrOw0KCQljYXNlIExEQVBfU1VDQ0VTUzoJ Lyogb24gc3VjY2VzcyBkbyBub3RoaW5nICovDQoJCQlyZXN1bHQgPSBJU0NfUl9TVUNDRVNTOw0K CQkJaSA9IDM7DQoJCQlicmVhazsNCgkJY2FzZSBMREFQX1NFUlZFUl9ET1dOOg0KCQkJaXNjX2xv Z193cml0ZShkbnNfbGN0eCwgRE5TX0xPR0NBVEVHT1JZX0RBVEFCQVNFLA0KCQkJCSAgICAgIERO U19MT0dNT0RVTEVfRExaLCBJU0NfTE9HX0lORk8sDQoJCQkJICAgICAgIkxEQVAgZHJpdmVyIGF0 dGVtcHRpbmcgdG8gcmUtY29ubmVjdCIpOw0KCQkJcmVzdWx0ID0gZGx6X2xkYXBfY29ubmVjdCgo bGRhcF9pbnN0YW5jZV90ICopIGRiZGF0YSwNCgkJCQkJCSAgZGJpKTsNCgkJCWlmIChyZXN1bHQg IT0gSVNDX1JfU1VDQ0VTUykNCgkJCQlyZXN1bHQgPSBJU0NfUl9GQUlMVVJFOw0KCQkJYnJlYWs7 DQoJCWRlZmF1bHQ6DQoJCQkvKg0KCQkJICogb3RoZXIgZXJyb3JzIG5vdCBvay4gIExvZyBlcnJv ciBtZXNzYWdlIGFuZA0KCQkJICogZ2V0IG91dA0KCQkJICovDQogICAgCQkJaXNjX2xvZ193cml0 ZShkbnNfbGN0eCwgRE5TX0xPR0NBVEVHT1JZX0RBVEFCQVNFLA0KCQkJCSAgICAgIEROU19MT0dN T0RVTEVfRExaLCBJU0NfTE9HX0VSUk9SLA0KCQkJCSAgICAgICJMREFQIGVycm9yOiAlcyIsDQoJ CQkJICAgICAgbGRhcF9lcnIyc3RyaW5nKGxkYXBfcmVzdWx0KSk7DQoJCQlyZXN1bHQgPSBJU0Nf Ul9GQUlMVVJFOw0KCQkJZ290byBjbGVhbnVwOw0KCQkJYnJlYWs7DQoJCX0gLyogY2xvc2Ugc3dp dGNoKGxkYXBfcmVzdWx0KSAqLw0KCX0gLyogZW5kIGZvciAoaW50IGkgPSAwIGkgPCAzOyBpKysp ICovDQoNCglpZiAocmVzdWx0ICE9IElTQ19SX1NVQ0NFU1MpDQoJCWdvdG8gY2xlYW51cDsNCg0K CXN3aXRjaChxdWVyeSkgew0KCWNhc2UgQUxMTk9ERVM6DQoJCXJlc3VsdCA9IGxkYXBfcHJvY2Vz c19yZXN1bHRzKChMREFQICopIGRiaS0+ZGJjb25uLCBsZGFwX21zZywNCgkJCQkJICAgICAgbGRh cF91cmwtPmx1ZF9hdHRycywNCgkJCQkJICAgICAgcHRyLCBpc2NfYm9vbGVhbl90cnVlKTsNCgkJ YnJlYWs7DQoJY2FzZSBBVVRIT1JJVFk6DQoJY2FzZSBMT09LVVA6DQoJCXJlc3VsdCA9IGxkYXBf cHJvY2Vzc19yZXN1bHRzKChMREFQICopIGRiaS0+ZGJjb25uLCBsZGFwX21zZywNCgkJCQkJICAg ICAgbGRhcF91cmwtPmx1ZF9hdHRycywNCgkJCQkJICAgICAgcHRyLCBpc2NfYm9vbGVhbl9mYWxz ZSk7DQoJCWJyZWFrOw0KCWNhc2UgQUxMT1dYRlI6DQoJCWVudHJpZXMgPSBsZGFwX2NvdW50X2Vu dHJpZXMoKExEQVAgKikgZGJpLT5kYmNvbm4sIGxkYXBfbXNnKTsNCgkJaWYgKGVudHJpZXMgPT0g MCkNCgkJCXJlc3VsdCA9IElTQ19SX05PUEVSTTsNCgkJZWxzZSBpZiAoZW50cmllcyA+IDApDQoJ CQlyZXN1bHQgPSBJU0NfUl9TVUNDRVNTOw0KCQllbHNlDQoJCQlyZXN1bHQgPSBJU0NfUl9GQUlM VVJFOw0KCQlicmVhazsNCgljYXNlIEZJTkRaT05FOg0KCQllbnRyaWVzID0gbGRhcF9jb3VudF9l bnRyaWVzKChMREFQICopIGRiaS0+ZGJjb25uLCBsZGFwX21zZyk7DQoJCWlmIChlbnRyaWVzID09 IDApDQoJCQlyZXN1bHQgPSBJU0NfUl9OT1RGT1VORDsNCgkJZWxzZSBpZiAoZW50cmllcyA+IDAp DQoJCQlyZXN1bHQgPSBJU0NfUl9TVUNDRVNTOw0KCQllbHNlDQoJCQlyZXN1bHQgPSBJU0NfUl9G QUlMVVJFOw0KCQlicmVhazsNCglkZWZhdWx0Og0KCQkvKg0KCQkgKiB0aGlzIHNob3VsZCBuZXZl ciBoYXBwZW4uICBJZiBpdCBkb2VzLCB0aGUgY29kZSBpcw0KCQkgKiBzY3Jld2VkIHVwIQ0KCQkg Ki8NCgkJVU5FWFBFQ1RFRF9FUlJPUihfX0ZJTEVfXywgX19MSU5FX18sDQoJCQkJICJJbmNvcnJl Y3QgcXVlcnkgZmxhZyBwYXNzZWQgdG8gIg0KCQkJCSAibGRhcF9nZXRfcmVzdWx0cyIpOw0KCQly ZXN1bHQgPSBJU0NfUl9VTkVYUEVDVEVEOw0KCX0NCg0KIGNsZWFudXA6DQoJLyogaXQncyBhbHdh eXMgZ29vZCB0byBjbGVhbnVwIGFmdGVyIHlvdXJzZWxmICovDQoNCiAgICAgICAgLyogaWYgd2Ug cmV0cmlldmVkIHJlc3VsdHMsIGZyZWUgdGhlbSAqLw0KCWlmIChsZGFwX21zZyAhPSBOVUxMKQ0K CQlsZGFwX21zZ2ZyZWUobGRhcF9tc2cpOw0KCWlmIChsZGFwX3VybCAhPSBOVUxMKQ0KCQlsZGFw X2ZyZWVfdXJsZGVzYyhsZGFwX3VybCk7DQoJLyogY2xlYW51cCAqLw0KCWlmIChkYmktPnpvbmUg IT0gTlVMTCkNCgkJaXNjX21lbV9mcmVlKG5zX2dfbWN0eCwgZGJpLT56b25lKTsNCglpZiAoZGJp LT5yZWNvcmQgIT0gTlVMTCkNCgkJaXNjX21lbV9mcmVlKG5zX2dfbWN0eCwgZGJpLT5yZWNvcmQp Ow0KCWlmIChkYmktPmNsaWVudCAhPSBOVUxMKQ0KCQlpc2NfbWVtX2ZyZWUobnNfZ19tY3R4LCBk YmktPmNsaWVudCk7DQoNCiNpZmRlZiBJU0NfUExBVEZPUk1fVVNFVEhSRUFEUw0KDQoJLyogcmVs ZWFzZSB0aGUgbG9jayBzbyBhbm90aGVyIHRocmVhZCBjYW4gdXNlIHRoaXMgZGJpICovDQoJaXNj X211dGV4X3VubG9jaygmZGJpLT5pbnN0YW5jZV9sb2NrKTsNCg0KI2VuZGlmIC8qIElTQ19QTEFU Rk9STV9VU0VUSFJFQURTICovDQoNCiAgICAgICAgLyogcmVsZWFzZSBxdWVyeSBzdHJpbmcgKi8N CglpZiAocXVlcnlzdHJpbmcgICE9IE5VTEwpDQoJCWlzY19tZW1fZnJlZShuc19nX21jdHgsIHF1 ZXJ5c3RyaW5nICk7DQoNCgkvKiByZXR1cm4gcmVzdWx0ICovDQoJcmV0dXJuIChyZXN1bHQpOw0K fQ0KDQovKg0KICogRExaIG1ldGhvZHMNCiAqLw0Kc3RhdGljIGlzY19yZXN1bHRfdA0KZGx6X2xk YXBfYWxsb3d6b25leGZyKHZvaWQgKmRyaXZlcmFyZywgdm9pZCAqZGJkYXRhLCBjb25zdCBjaGFy ICpuYW1lLA0KCQkgICAgICBjb25zdCBjaGFyICpjbGllbnQpDQp7DQoJaXNjX3Jlc3VsdF90IHJl c3VsdDsNCg0KCVVOVVNFRChkcml2ZXJhcmcpOw0KDQoJLyogY2hlY2sgdG8gc2VlIGlmIHdlIGFy ZSBhdXRob3JpdGF0aXZlIGZvciB0aGUgem9uZSBmaXJzdCAqLw0KCXJlc3VsdCA9IGRsel9sZGFw X2ZpbmR6b25lKGRyaXZlcmFyZywgZGJkYXRhLCBuYW1lKTsNCglpZiAocmVzdWx0ICE9IElTQ19S X1NVQ0NFU1MpIHsNCgkJcmV0dXJuIChyZXN1bHQpOw0KCX0NCg0KICAgICAgICAvKiBnZXQgYWxs IHRoZSB6b25lIGRhdGEgKi8NCglyZXN1bHQgPSBsZGFwX2dldF9yZXN1bHRzKG5hbWUsIE5VTEws IGNsaWVudCwgQUxMT1dYRlIsIGRiZGF0YSwgTlVMTCk7DQoJcmV0dXJuIChyZXN1bHQpOw0KfQ0K DQpzdGF0aWMgaXNjX3Jlc3VsdF90DQpkbHpfbGRhcF9hbGxub2Rlcyhjb25zdCBjaGFyICp6b25l LCB2b2lkICpkcml2ZXJhcmcsIHZvaWQgKmRiZGF0YSwNCgkJICBkbnNfc2RsemFsbG5vZGVzX3Qg KmFsbG5vZGVzKQ0Kew0KCVVOVVNFRChkcml2ZXJhcmcpOw0KCXJldHVybiAobGRhcF9nZXRfcmVz dWx0cyh6b25lLCBOVUxMLCBOVUxMLCBBTExOT0RFUywgZGJkYXRhLCBhbGxub2RlcykpOw0KfQ0K DQpzdGF0aWMgaXNjX3Jlc3VsdF90DQpkbHpfbGRhcF9hdXRob3JpdHkoY29uc3QgY2hhciAqem9u ZSwgdm9pZCAqZHJpdmVyYXJnLCB2b2lkICpkYmRhdGEsDQoJCSAgIGRuc19zZGx6bG9va3VwX3Qg Kmxvb2t1cCkNCnsNCglVTlVTRUQoZHJpdmVyYXJnKTsNCglyZXR1cm4gKGxkYXBfZ2V0X3Jlc3Vs dHMoem9uZSwgTlVMTCwgTlVMTCwgQVVUSE9SSVRZLCBkYmRhdGEsIGxvb2t1cCkpOw0KfQ0KDQpz dGF0aWMgaXNjX3Jlc3VsdF90DQpkbHpfbGRhcF9maW5kem9uZSh2b2lkICpkcml2ZXJhcmcsIHZv aWQgKmRiZGF0YSwgY29uc3QgY2hhciAqbmFtZSkgew0KCVVOVVNFRChkcml2ZXJhcmcpOw0KCXJl dHVybiAobGRhcF9nZXRfcmVzdWx0cyhuYW1lLCBOVUxMLCBOVUxMLCBGSU5EWk9ORSwgZGJkYXRh LCBOVUxMKSk7DQp9DQoNCnN0YXRpYyBpc2NfcmVzdWx0X3QNCmRsel9sZGFwX2xvb2t1cChjb25z dCBjaGFyICp6b25lLCBjb25zdCBjaGFyICpuYW1lLCB2b2lkICpkcml2ZXJhcmcsDQoJCXZvaWQg KmRiZGF0YSwgZG5zX3NkbHpsb29rdXBfdCAqbG9va3VwKQ0Kew0KCWlzY19yZXN1bHRfdCByZXN1 bHQ7DQoJVU5VU0VEKGRyaXZlcmFyZyk7DQoNCglpZiAoc3RyY21wKG5hbWUsICIqIikgPT0gMCkN CgkJcmVzdWx0ID0gbGRhcF9nZXRfcmVzdWx0cyh6b25lLCAifiIsIE5VTEwsIExPT0tVUCwNCgkJ CQkJICBkYmRhdGEsIGxvb2t1cCk7DQoJZWxzZQ0KCQlyZXN1bHQgPSBsZGFwX2dldF9yZXN1bHRz KHpvbmUsIG5hbWUsIE5VTEwsIExPT0tVUCwNCgkJCQkJICBkYmRhdGEsIGxvb2t1cCk7DQoJcmV0 dXJuIChyZXN1bHQpOw0KfQ0KDQoNCnN0YXRpYyBpc2NfcmVzdWx0X3QNCmRsel9sZGFwX2NyZWF0 ZShjb25zdCBjaGFyICpkbHpuYW1lLCB1bnNpZ25lZCBpbnQgYXJnYywgY2hhciAqYXJndltdLA0K CQl2b2lkICpkcml2ZXJhcmcsIHZvaWQgKipkYmRhdGEpDQp7DQoJaXNjX3Jlc3VsdF90IHJlc3Vs dDsNCglsZGFwX2luc3RhbmNlX3QgKmxkYXBfaW5zdCA9IE5VTEw7DQoJZGJpbnN0YW5jZV90ICpk YmkgPSBOVUxMOw0KCWludCBwcm90b2NvbDsNCglpbnQgbWV0aG9kOw0KDQojaWZkZWYgSVNDX1BM QVRGT1JNX1VTRVRIUkVBRFMNCgkvKiBpZiBtdWx0aS10aHJlYWRlZCwgd2UgbmVlZCBhIGZldyBl eHRyYSB2YXJpYWJsZXMuICovDQoJaW50IGRiY291bnQ7DQoJY2hhciAqZW5kcDsNCi8qIGRiX2xp c3RfdCAqZGJsaXN0ID0gTlVMTDsgKi8NCglpbnQgaTsNCg0KI2VuZGlmIC8qIElTQ19QTEFURk9S TV9VU0VUSFJFQURTICovDQoNCglVTlVTRUQoZGx6bmFtZSk7DQoJVU5VU0VEKGRyaXZlcmFyZyk7 DQoNCiNpZmRlZiBJU0NfUExBVEZPUk1fVVNFVEhSRUFEUw0KCS8qIGlmIGRlYnVnZ2luZywgbGV0 IHVzZXIga25vdyB3ZSBhcmUgbXVsdGl0aHJlYWRlZC4gKi8NCglpc2NfbG9nX3dyaXRlKGRuc19s Y3R4LCBETlNfTE9HQ0FURUdPUllfREFUQUJBU0UsDQoJCSAgICAgIEROU19MT0dNT0RVTEVfRExa LCBJU0NfTE9HX0RFQlVHKDEpLA0KCQkgICAgICAiTERBUCBkcml2ZXIgcnVubmluZyBtdWx0aXRo cmVhZGVkIik7DQojZWxzZSAvKiBJU0NfUExBVEZPUk1fVVNFVEhSRUFEUyAqLw0KCS8qIGlmIGRl YnVnZ2luZywgbGV0IHVzZXIga25vdyB3ZSBhcmUgc2luZ2xlIHRocmVhZGVkLiAqLw0KCWlzY19s b2dfd3JpdGUoZG5zX2xjdHgsIEROU19MT0dDQVRFR09SWV9EQVRBQkFTRSwNCgkJICAgICAgRE5T X0xPR01PRFVMRV9ETFosIElTQ19MT0dfREVCVUcoMSksDQoJCSAgICAgICJMREFQIGRyaXZlciBy dW5uaW5nIHNpbmdsZSB0aHJlYWRlZCIpOw0KI2VuZGlmIC8qIElTQ19QTEFURk9STV9VU0VUSFJF QURTICovDQoNCglpZiAoYXJnYyA8IDkpIHsNCgkJaXNjX2xvZ193cml0ZShkbnNfbGN0eCwgRE5T X0xPR0NBVEVHT1JZX0RBVEFCQVNFLA0KCQkJICAgICAgRE5TX0xPR01PRFVMRV9ETFosIElTQ19M T0dfRVJST1IsDQoJCQkgICAgICAiTERBUCBkcml2ZXIgcmVxdWlyZXMgYXQgbGVhc3QgIg0KCQkJ ICAgICAgIjggY29tbWFuZCBsaW5lIGFyZ3MuIik7DQoJCXJldHVybiAoSVNDX1JfRkFJTFVSRSk7 DQoJfQ0KDQoJLyogbm8gbW9yZSB0aGFuIDEzIGFyZydzIHNob3VsZCBiZSBwYXNzZWQgdG8gdGhl IGRyaXZlciAqLw0KCWlmIChhcmdjID4gMTIpIHsNCgkJaXNjX2xvZ193cml0ZShkbnNfbGN0eCwg RE5TX0xPR0NBVEVHT1JZX0RBVEFCQVNFLA0KCQkJICAgICAgRE5TX0xPR01PRFVMRV9ETFosIElT Q19MT0dfRVJST1IsDQoJCQkgICAgICAiTERBUCBkcml2ZXIgY2Fubm90IGFjY2VwdCBtb3JlIHRo YW4gIg0KCQkJICAgICAgIjExIGNvbW1hbmQgbGluZSBhcmdzLiIpOw0KCQlyZXR1cm4gKElTQ19S X0ZBSUxVUkUpOw0KCX0NCg0KCS8qIGRldGVybWluZSBwcm90b2NvbCB2ZXJzaW9uLiAqLw0KCWlm IChzdHJuY2FzZWNtcChhcmd2WzJdLCBWMiwgc3RybGVuKFYyKSkgPT0gMCkgew0KCQlwcm90b2Nv bCA9IDI7DQoJfSBlbHNlIGlmIChzdHJuY2FzZWNtcChhcmd2WzJdLCBWMywgc3RybGVuKFYzKSkg PT0gMCkgew0KCQlwcm90b2NvbCA9IDM7DQoJfSBlbHNlIHsNCgkJaXNjX2xvZ193cml0ZShkbnNf bGN0eCwgRE5TX0xPR0NBVEVHT1JZX0RBVEFCQVNFLA0KCQkJICAgICAgRE5TX0xPR01PRFVMRV9E TFosIElTQ19MT0dfRVJST1IsDQoJCQkgICAgICAiTERBUCBkcml2ZXIgcHJvdG9jb2wgbXVzdCBi ZSBlaXRoZXIgJXMgb3IgJXMiLA0KCQkJICAgICAgVjIsIFYzKTsNCgkJcmV0dXJuIChJU0NfUl9G QUlMVVJFKTsNCgl9DQoNCgkvKiBkZXRlcm1pbmUgY29ubmVjdGlvbiBtZXRob2QuICovDQoJaWYg KHN0cm5jYXNlY21wKGFyZ3ZbM10sIFNJTVBMRSwgc3RybGVuKFNJTVBMRSkpID09IDApIHsNCgkJ bWV0aG9kID0gTERBUF9BVVRIX1NJTVBMRTsNCgl9IGVsc2UgaWYgKHN0cm5jYXNlY21wKGFyZ3Zb M10sIEtSQjQxLCBzdHJsZW4oS1JCNDEpKSA9PSAwKSB7DQoJCW1ldGhvZCA9IExEQVBfQVVUSF9L UkJWNDE7DQoJfSBlbHNlIGlmIChzdHJuY2FzZWNtcChhcmd2WzNdLCBLUkI0Miwgc3RybGVuKEtS QjQyKSkgPT0gMCkgew0KCQltZXRob2QgPSBMREFQX0FVVEhfS1JCVjQyOw0KCX0gZWxzZSB7DQoJ CWlzY19sb2dfd3JpdGUoZG5zX2xjdHgsIEROU19MT0dDQVRFR09SWV9EQVRBQkFTRSwNCgkJCSAg ICAgIEROU19MT0dNT0RVTEVfRExaLCBJU0NfTE9HX0VSUk9SLA0KCQkJICAgICAgIkxEQVAgZHJp dmVyIGF1dGhlbnRpY2F0aW9uIG1ldGhvZCBtdXN0IGJlICINCgkJCSAgICAgICJvbmUgb2YgJXMs ICVzIG9yICVzIiwNCgkJCSAgICAgIFNJTVBMRSwgS1JCNDEsIEtSQjQyKTsNCgkJcmV0dXJuIChJ U0NfUl9GQUlMVVJFKTsNCgl9DQoNCgkvKiBtdWx0aXRocmVhZGVkIGJ1aWxkIGNhbiBoYXZlIG11 bHRpcGxlIERCIGNvbm5lY3Rpb25zICovDQojaWZkZWYgSVNDX1BMQVRGT1JNX1VTRVRIUkVBRFMN Cg0KCS8qIGNoZWNrIGhvdyBtYW55IGRiIGNvbm5lY3Rpb25zIHdlIHNob3VsZCBjcmVhdGUgKi8N CglkYmNvdW50ID0gc3RydG9sKGFyZ3ZbMV0sICZlbmRwLCAxMCk7DQoJaWYgKCplbmRwICE9ICdc MCcgfHwgZGJjb3VudCA8IDApIHsNCgkJaXNjX2xvZ193cml0ZShkbnNfbGN0eCwgRE5TX0xPR0NB VEVHT1JZX0RBVEFCQVNFLA0KCQkJICAgICAgRE5TX0xPR01PRFVMRV9ETFosIElTQ19MT0dfRVJS T1IsDQoJCQkgICAgICAiTERBUCBkcml2ZXIgZGF0YWJhc2UgY29ubmVjdGlvbiBjb3VudCAiDQoJ CQkgICAgICAibXVzdCBiZSBwb3NpdGl2ZS4iKTsNCgkJcmV0dXJuIChJU0NfUl9GQUlMVVJFKTsN Cgl9DQojZW5kaWYNCg0KCS8qIGNoZWNrIHRoYXQgTERBUCBVUkwgcGFyYW1ldGVycyBtYWtlIHNl bnNlICovDQoJc3dpdGNoKGFyZ2MpIHsNCgljYXNlIDEyOg0KCQlyZXN1bHQgPSBkbHpfbGRhcF9j aGVja1VSTChhcmd2WzExXSwgMCwgImFsbG93IHpvbmUgdHJhbnNmZXIiKTsNCgkJaWYgKHJlc3Vs dCAhPSBJU0NfUl9TVUNDRVNTKQ0KCQkJcmV0dXJuIChyZXN1bHQpOw0KCWNhc2UgMTE6DQoJCXJl c3VsdCA9IGRsel9sZGFwX2NoZWNrVVJMKGFyZ3ZbMTBdLCAzLCAiYWxsIG5vZGVzIik7DQoJCWlm IChyZXN1bHQgIT0gSVNDX1JfU1VDQ0VTUykNCgkJCXJldHVybiAocmVzdWx0KTsNCgljYXNlIDEw Og0KCQlpZiAoc3RybGVuKGFyZ3ZbOV0pID4gMCkgew0KCQkJcmVzdWx0ID0gZGx6X2xkYXBfY2hl Y2tVUkwoYXJndls5XSwgMywgImF1dGhvcml0eSIpOw0KCQkJaWYgKHJlc3VsdCAhPSBJU0NfUl9T VUNDRVNTKQ0KCQkJCXJldHVybiAocmVzdWx0KTsNCgkJfQ0KCWNhc2UgOToNCgkJcmVzdWx0ID0g ZGx6X2xkYXBfY2hlY2tVUkwoYXJndls4XSwgMywgImxvb2t1cCIpOw0KCQlpZiAocmVzdWx0ICE9 IElTQ19SX1NVQ0NFU1MpDQoJCQlyZXR1cm4gKHJlc3VsdCk7DQoJCXJlc3VsdCA9IGRsel9sZGFw X2NoZWNrVVJMKGFyZ3ZbN10sIDAsICJmaW5kIHpvbmUiKTsNCgkJaWYgKHJlc3VsdCAhPSBJU0Nf Ul9TVUNDRVNTKQ0KCQkJcmV0dXJuIChyZXN1bHQpOw0KCQlicmVhazsNCglkZWZhdWx0Og0KCQkv KiBub3QgcmVhbGx5IG5lZWRlZCwgc2hvdWxkIHNodXQgdXAgY29tcGlsZXIuICovDQoJCXJlc3Vs dCA9IElTQ19SX0ZBSUxVUkU7DQoJfQ0KDQoJLyogYWxsb2NhdGUgbWVtb3J5IGZvciBMREFQIGlu c3RhbmNlICovDQoJbGRhcF9pbnN0ID0gaXNjX21lbV9nZXQobnNfZ19tY3R4LCBzaXplb2YobGRh cF9pbnN0YW5jZV90KSk7DQoJaWYgKGxkYXBfaW5zdCA9PSBOVUxMKQ0KCQlyZXR1cm4gKElTQ19S X05PTUVNT1JZKTsNCgltZW1zZXQobGRhcF9pbnN0LCAwLCBzaXplb2YobGRhcF9pbnN0YW5jZV90 KSk7DQoNCgkvKiBzdG9yZSBpbmZvIG5lZWRlZCB0byBhdXRvbWF0aWNhbGx5IHJlLWNvbm5lY3Qu ICovDQoJbGRhcF9pbnN0LT5wcm90b2NvbCA9IHByb3RvY29sOw0KCWxkYXBfaW5zdC0+bWV0aG9k ID0gbWV0aG9kOw0KCWxkYXBfaW5zdC0+aG9zdHMgPSBpc2NfbWVtX3N0cmR1cChuc19nX21jdHgs IGFyZ3ZbNl0pOw0KCWlmIChsZGFwX2luc3QtPmhvc3RzID09IE5VTEwpIHsNCgkJcmVzdWx0ID0g SVNDX1JfTk9NRU1PUlk7DQoJCWdvdG8gY2xlYW51cDsNCgl9DQoJbGRhcF9pbnN0LT51c2VyID0g aXNjX21lbV9zdHJkdXAobnNfZ19tY3R4LCBhcmd2WzRdKTsNCglpZiAobGRhcF9pbnN0LT51c2Vy ID09IE5VTEwpIHsNCgkJcmVzdWx0ID0gSVNDX1JfTk9NRU1PUlk7DQoJCWdvdG8gY2xlYW51cDsN Cgl9DQoJbGRhcF9pbnN0LT5jcmVkID0gaXNjX21lbV9zdHJkdXAobnNfZ19tY3R4LCBhcmd2WzVd KTsNCglpZiAobGRhcF9pbnN0LT5jcmVkID09IE5VTEwpIHsNCgkJcmVzdWx0ID0gSVNDX1JfTk9N RU1PUlk7DQoJCWdvdG8gY2xlYW51cDsNCgl9DQoNCiNpZmRlZiBJU0NfUExBVEZPUk1fVVNFVEhS RUFEUw0KCS8qIGFsbG9jYXRlIG1lbW9yeSBmb3IgZGF0YWJhc2UgY29ubmVjdGlvbiBsaXN0ICov DQoJbGRhcF9pbnN0LT5kYiA9IGlzY19tZW1fZ2V0KG5zX2dfbWN0eCwgc2l6ZW9mKGRiX2xpc3Rf dCkpOw0KCWlmIChsZGFwX2luc3QtPmRiID09IE5VTEwpIHsNCgkJcmVzdWx0ID0gSVNDX1JfTk9N RU1PUlk7DQoJCWdvdG8gY2xlYW51cDsNCgl9DQoNCgkvKiBpbml0aWFsaXplIERCIGNvbm5lY3Rp b24gbGlzdCAqLw0KCUlTQ19MSVNUX0lOSVQoKihsZGFwX2luc3QtPmRiKSk7DQoNCgkvKg0KCSAq IGNyZWF0ZSB0aGUgYXBwcm9wcmlhdGUgbnVtYmVyIG9mIGRhdGFiYXNlIGluc3RhbmNlcyAoREJJ KQ0KCSAqIGFwcGVuZCBlYWNoIG5ldyBEQkkgdG8gdGhlIGVuZCBvZiB0aGUgbGlzdA0KCSAqLw0K CWZvciAoaSA9IDA7IGkgPCBkYmNvdW50OyBpKyspIHsNCg0KI2VuZGlmIC8qIElTQ19QTEFURk9S TV9VU0VUSFJFQURTICovDQoNCgkJLyogaG93IG1hbnkgcXVlcmllcyB3ZXJlIHBhc3NlZCBpbiBm cm9tIGNvbmZpZyBmaWxlPyAqLw0KCQlzd2l0Y2goYXJnYykgew0KCQljYXNlIDk6DQoJCQlyZXN1 bHQgPSBidWlsZF9zcWxkYmluc3RhbmNlKG5zX2dfbWN0eCwgTlVMTCwgTlVMTCwNCgkJCQkJCSAg ICAgTlVMTCwgYXJndls3XSwgYXJndls4XSwNCgkJCQkJCSAgICAgTlVMTCwgJmRiaSk7DQoJCQli cmVhazsNCgkJY2FzZSAxMDoNCgkJCXJlc3VsdCA9IGJ1aWxkX3NxbGRiaW5zdGFuY2UobnNfZ19t Y3R4LCBOVUxMLCBOVUxMLA0KCQkJCQkJICAgICBhcmd2WzldLCBhcmd2WzddLCBhcmd2WzhdLA0K CQkJCQkJICAgICBOVUxMLCAmZGJpKTsNCgkJCWJyZWFrOw0KCQljYXNlIDExOg0KCQkJcmVzdWx0 ID0gYnVpbGRfc3FsZGJpbnN0YW5jZShuc19nX21jdHgsIGFyZ3ZbMTBdLCBOVUxMLA0KCQkJCQkJ ICAgICBhcmd2WzldLCBhcmd2WzddLCBhcmd2WzhdLA0KCQkJCQkJICAgICBOVUxMLCAmZGJpKTsN CgkJCWJyZWFrOw0KCQljYXNlIDEyOg0KCQkJcmVzdWx0ID0gYnVpbGRfc3FsZGJpbnN0YW5jZShu c19nX21jdHgsIGFyZ3ZbMTBdLA0KCQkJCQkJICAgICBhcmd2WzExXSwgYXJndls5XSwNCgkJCQkJ CSAgICAgYXJndls3XSwgYXJndls4XSwNCgkJCQkJCSAgICAgTlVMTCwgJmRiaSk7DQoJCQlicmVh azsNCgkJZGVmYXVsdDoNCgkJCS8qIG5vdCByZWFsbHkgbmVlZGVkLCBzaG91bGQgc2h1dCB1cCBj b21waWxlci4gKi8NCgkJCXJlc3VsdCA9IElTQ19SX0ZBSUxVUkU7DQoJCX0NCg0KCQlpZiAocmVz dWx0ID09IElTQ19SX1NVQ0NFU1MpIHsNCgkJCWlzY19sb2dfd3JpdGUoZG5zX2xjdHgsIEROU19M T0dDQVRFR09SWV9EQVRBQkFTRSwNCgkJCQkgICAgICBETlNfTE9HTU9EVUxFX0RMWiwgSVNDX0xP R19ERUJVRygyKSwNCgkJCQkgICAgICAiTERBUCBkcml2ZXIgY3JlYXRlZCAiDQoJCQkJICAgICAg ImRhdGFiYXNlIGluc3RhbmNlIG9iamVjdC4iKTsNCgkJfSBlbHNlIHsgLyogdW5zdWNjZXNzZnVs PywgbG9nIGVyciBtc2cgYW5kIGNsZWFudXAuICovDQoJCQlpc2NfbG9nX3dyaXRlKGRuc19sY3R4 LCBETlNfTE9HQ0FURUdPUllfREFUQUJBU0UsDQoJCQkJICAgICAgRE5TX0xPR01PRFVMRV9ETFos IElTQ19MT0dfRVJST1IsDQoJCQkJICAgICAgIkxEQVAgZHJpdmVyIGNvdWxkIG5vdCBjcmVhdGUg Ig0KCQkJCSAgICAgICJkYXRhYmFzZSBpbnN0YW5jZSBvYmplY3QuIik7DQoJCQlnb3RvIGNsZWFu dXA7DQoJCX0NCg0KI2lmZGVmIElTQ19QTEFURk9STV9VU0VUSFJFQURTDQoJCS8qIHdoZW4gbXVs dGl0aHJlYWRlZCwgYnVpbGQgYSBsaXN0IG9mIERCSSdzICovDQoJCUlTQ19MSU5LX0lOSVQoZGJp LCBsaW5rKTsNCgkJSVNDX0xJU1RfQVBQRU5EKCoobGRhcF9pbnN0LT5kYiksIGRiaSwgbGluayk7 DQojZWxzZQ0KCQkvKg0KCQkgKiB3aGVuIHNpbmdsZSB0aHJlYWRlZCwgaG9sZCBvbnRvIHRoZSBv bmUgY29ubmVjdGlvbg0KCQkgKiBpbnN0YW5jZS4NCgkJICovDQoJCWxkYXBfaW5zdC0+ZGIgPSBk Ymk7DQoNCiNlbmRpZg0KCQkvKiBhdHRlbXB0IHRvIGNvbm5lY3QgKi8NCgkJcmVzdWx0ID0gZGx6 X2xkYXBfY29ubmVjdChsZGFwX2luc3QsIGRiaSk7DQoNCgkJLyoNCgkJICogaWYgZGIgY29ubmVj dGlvbiBjYW5ub3QgYmUgY3JlYXRlZCwgbG9nIGVyciBtc2cgYW5kDQoJCSAqIGNsZWFudXAuDQoJ CSAqLw0KCQlzd2l0Y2gocmVzdWx0KSB7DQoJCQkvKiBzdWNjZXNzLCBkbyBub3RoaW5nICovDQoJ CWNhc2UgSVNDX1JfU1VDQ0VTUzoNCgkJCWJyZWFrOw0KCQkJLyoNCgkJCSAqIG5vIG1lbW9yeSBt ZWFucyBsZGFwX2luaXQgY291bGQgbm90DQoJCQkgKiBhbGxvY2F0ZSBtZW1vcnkNCgkJCSAqLw0K CQljYXNlIElTQ19SX05PTUVNT1JZOg0KI2lmZGVmIElTQ19QTEFURk9STV9VU0VUSFJFQURTDQoJ CQlpc2NfbG9nX3dyaXRlKGRuc19sY3R4LCBETlNfTE9HQ0FURUdPUllfREFUQUJBU0UsDQoJCQkJ ICAgICAgRE5TX0xPR01PRFVMRV9ETFosIElTQ19MT0dfRVJST1IsDQoJCQkJICAgICAgIkxEQVAg ZHJpdmVyIGNvdWxkIG5vdCBhbGxvY2F0ZSBtZW1vcnkgIg0KCQkJCSAgICAgICJmb3IgY29ubmVj dGlvbiBudW1iZXIgJXUiLA0KCQkJCSAgICAgIGkrMSk7DQojZWxzZQ0KCQkJaXNjX2xvZ193cml0 ZShkbnNfbGN0eCwgRE5TX0xPR0NBVEVHT1JZX0RBVEFCQVNFLA0KCQkJCSAgICAgIEROU19MT0dN T0RVTEVfRExaLCBJU0NfTE9HX0VSUk9SLA0KCQkJCSAgICAgICJMREFQIGRyaXZlciBjb3VsZCBu b3QgYWxsb2NhdGUgbWVtb3J5ICINCgkJCQkgICAgICAiZm9yIGNvbm5lY3Rpb24iKTsNCiNlbmRp Zg0KCQkJZ290byBjbGVhbnVwOw0KCQkJYnJlYWs7DQoJCQkvKg0KCQkJICogbm8gcGVybSBtZWFu cyBsZGFwX3NldF9vcHRpb24gY291bGQgbm90IHNldA0KCQkJICogcHJvdG9jb2wgdmVyc2lvbg0K CQkJICovDQoJCWNhc2UgSVNDX1JfTk9QRVJNOg0KCQkJaXNjX2xvZ193cml0ZShkbnNfbGN0eCwg RE5TX0xPR0NBVEVHT1JZX0RBVEFCQVNFLA0KCQkJCSAgICAgIEROU19MT0dNT0RVTEVfRExaLCBJ U0NfTE9HX0VSUk9SLA0KCQkJCSAgICAgICJMREFQIGRyaXZlciBjb3VsZCBub3QgIg0KCQkJCSAg ICAgICJzZXQgcHJvdG9jb2wgdmVyc2lvbi4iKTsNCgkJCXJlc3VsdCA9IElTQ19SX0ZBSUxVUkU7 DQoJCQlnb3RvIGNsZWFudXA7DQoJCQlicmVhazsNCgkJCS8qIGZhaWx1cmUgbWVhbnMgY291bGRu J3QgY29ubmVjdCB0byBsZGFwIHNlcnZlciAqLw0KCQljYXNlIElTQ19SX0ZBSUxVUkU6DQojaWZk ZWYgSVNDX1BMQVRGT1JNX1VTRVRIUkVBRFMNCgkJCWlzY19sb2dfd3JpdGUoZG5zX2xjdHgsIERO U19MT0dDQVRFR09SWV9EQVRBQkFTRSwNCgkJCQkgICAgICBETlNfTE9HTU9EVUxFX0RMWiwgSVND X0xPR19FUlJPUiwNCgkJCQkgICAgICAiTERBUCBkcml2ZXIgY291bGQgbm90ICINCgkJCQkgICAg ICAiYmluZCBjb25uZWN0aW9uIG51bWJlciAldSB0byBzZXJ2ZXIuIiwNCgkJCQkgICAgICBpKzEp Ow0KI2Vsc2UNCgkJCWlzY19sb2dfd3JpdGUoZG5zX2xjdHgsIEROU19MT0dDQVRFR09SWV9EQVRB QkFTRSwNCgkJCQkgICAgICBETlNfTE9HTU9EVUxFX0RMWiwgSVNDX0xPR19FUlJPUiwNCgkJCQkg ICAgICAiTERBUCBkcml2ZXIgY291bGQgbm90ICINCgkJCQkgICAgICAiYmluZCBjb25uZWN0aW9u IHRvIHNlcnZlci4iKTsNCiNlbmRpZg0KCQkJZ290byBjbGVhbnVwOw0KCQkJYnJlYWs7DQoJCQkv Kg0KCQkJICogZGVmYXVsdCBzaG91bGQgbmV2ZXIgaGFwcGVuLiAgSWYgaXQgZG9lcywNCgkJCSAq IG1ham9yIGVycm9ycy4NCgkJCSAqLw0KCQlkZWZhdWx0Og0KCQkJVU5FWFBFQ1RFRF9FUlJPUihf X0ZJTEVfXywgX19MSU5FX18sDQoJCQkJCSAiZGx6X2xkYXBfY3JlYXRlKCkgZmFpbGVkOiAlcyIs DQoJCQkJCSBpc2NfcmVzdWx0X3RvdGV4dChyZXN1bHQpKTsNCgkJCXJlc3VsdCA9IElTQ19SX1VO RVhQRUNURUQ7DQoJCQlnb3RvIGNsZWFudXA7DQoJCQlicmVhazsNCgkJfSAvKiBlbmQgc3dpdGNo KHJlc3VsdCkgKi8NCg0KDQojaWZkZWYgSVNDX1BMQVRGT1JNX1VTRVRIUkVBRFMNCg0KCQkvKiBz ZXQgREJJID0gbnVsbCBmb3IgbmV4dCBsb29wIHRocm91Z2guICovDQoJCWRiaSA9IE5VTEw7DQoJ fQkvKiBlbmQgZm9yIGxvb3AgKi8NCg0KI2VuZGlmIC8qIElTQ19QTEFURk9STV9VU0VUSFJFQURT ICovDQoNCg0KCS8qIHNldCBkYmRhdGEgdG8gdGhlIGxkYXBfaW5zdGFuY2Ugd2UgY3JlYXRlZC4g Ki8NCgkqZGJkYXRhID0gbGRhcF9pbnN0Ow0KDQoJLyogaGV5LCB3ZSBnb3QgdGhyb3VnaCBhbGwg b2YgdGhhdCBvaywgcmV0dXJuIHN1Y2Nlc3MuICovDQoJcmV0dXJuKElTQ19SX1NVQ0NFU1MpOw0K DQogY2xlYW51cDoNCglkbHpfbGRhcF9kZXN0cm95KE5VTEwsIGxkYXBfaW5zdCk7DQoNCglyZXR1 cm4oSVNDX1JfRkFJTFVSRSk7DQp9DQoNCnZvaWQNCmRsel9sZGFwX2Rlc3Ryb3kodm9pZCAqZHJp dmVyYXJnLCB2b2lkICpkYmRhdGEpIHsNCglVTlVTRUQoZHJpdmVyYXJnKTsNCg0KCWlmIChkYmRh dGEgIT0gTlVMTCkgew0KI2lmZGVmIElTQ19QTEFURk9STV9VU0VUSFJFQURTDQoJCS8qIGNsZWFu dXAgdGhlIGxpc3Qgb2YgREJJJ3MgKi8NCgkJbGRhcF9kZXN0cm95X2RibGlzdCgoZGJfbGlzdF90 ICopDQoJCQkJICAgICgobGRhcF9pbnN0YW5jZV90ICopZGJkYXRhKS0+ZGIpOw0KDQojZWxzZSAv KiBJU0NfUExBVEZPUk1fVVNFVEhSRUFEUyAqLw0KCQlpZiAoKChsZGFwX2luc3RhbmNlX3QgKilk YmRhdGEpLT5kYi0+ZGJjb25uICE9IE5VTEwpDQoJCQlsZGFwX3VuYmluZF9zKChMREFQICopDQoJ CQkJICAgICAgKChsZGFwX2luc3RhbmNlX3QgKilkYmRhdGEpLT5kYi0+ZGJjb25uKTsNCg0KCQkv KiBkZXN0cm95IHNpbmdsZSBEQiBpbnN0YW5jZSAqLw0KCQlkZXN0cm95X3NxbGRiaW5zdGFuY2Uo KChsZGFwX2luc3RhbmNlX3QgKilkYmRhdGEpLT5kYik7DQojZW5kaWYgLyogSVNDX1BMQVRGT1JN X1VTRVRIUkVBRFMgKi8NCg0KCQlpZiAoKChsZGFwX2luc3RhbmNlX3QgKilkYmRhdGEpLT5ob3N0 cyAhPSBOVUxMKQ0KCQkJaXNjX21lbV9mcmVlKG5zX2dfbWN0eCwNCgkJCQkgICAgICgobGRhcF9p bnN0YW5jZV90ICopZGJkYXRhKS0+aG9zdHMpOw0KDQoJCWlmICgoKGxkYXBfaW5zdGFuY2VfdCAq KWRiZGF0YSktPnVzZXIgIT0gTlVMTCkNCgkJCWlzY19tZW1fZnJlZShuc19nX21jdHgsDQoJCQkJ ICAgICAoKGxkYXBfaW5zdGFuY2VfdCAqKWRiZGF0YSktPnVzZXIpOw0KDQoJCWlmICgoKGxkYXBf aW5zdGFuY2VfdCAqKWRiZGF0YSktPmNyZWQgIT0gTlVMTCkNCgkJCWlzY19tZW1fZnJlZShuc19n X21jdHgsDQoJCQkJICAgICAoKGxkYXBfaW5zdGFuY2VfdCAqKWRiZGF0YSktPmNyZWQpOw0KDQoJ CWlzY19tZW1fcHV0KG5zX2dfbWN0eCwgZGJkYXRhLCBzaXplb2YobGRhcF9pbnN0YW5jZV90KSk7 DQoJfQ0KfQ0KDQpzdGF0aWMgZG5zX3NkbHptZXRob2RzX3QgZGx6X2xkYXBfbWV0aG9kcyA9IHsN CglkbHpfbGRhcF9jcmVhdGUsDQoJZGx6X2xkYXBfZGVzdHJveSwNCglkbHpfbGRhcF9maW5kem9u ZSwNCglkbHpfbGRhcF9sb29rdXAsDQoJZGx6X2xkYXBfYXV0aG9yaXR5LA0KCWRsel9sZGFwX2Fs bG5vZGVzLA0KCWRsel9sZGFwX2FsbG93em9uZXhmciwNCglOVUxMLA0KCU5VTEwsDQoJTlVMTCwN CglOVUxMLA0KCU5VTEwsDQoJTlVMTCwNCglOVUxMLA0KfTsNCg0KLyolDQogKiBXcmFwcGVyIGFy b3VuZCBkbnNfc2RsenJlZ2lzdGVyKCkuDQogKi8NCmlzY19yZXN1bHRfdA0KZGx6X2xkYXBfaW5p dCh2b2lkKSB7DQoJaXNjX3Jlc3VsdF90IHJlc3VsdDsNCg0KCS8qDQoJICogV3JpdGUgZGVidWdn aW5nIG1lc3NhZ2UgdG8gbG9nDQoJICovDQoJaXNjX2xvZ193cml0ZShkbnNfbGN0eCwgRE5TX0xP R0NBVEVHT1JZX0RBVEFCQVNFLA0KCQkgICAgICBETlNfTE9HTU9EVUxFX0RMWiwgSVNDX0xPR19E RUJVRygyKSwNCgkJICAgICAgIlJlZ2lzdGVyaW5nIERMWiBsZGFwIGRyaXZlci4iKTsNCg0KCXJl c3VsdCA9IGRuc19zZGx6cmVnaXN0ZXIoImxkYXAiLCAmZGx6X2xkYXBfbWV0aG9kcywgTlVMTCwN CgkJCQkgIEROU19TRExaRkxBR19SRUxBVElWRU9XTkVSIHwNCgkJCQkgIEROU19TRExaRkxBR19S RUxBVElWRVJEQVRBLA0KCQkJCSAgbnNfZ19tY3R4LCAmZGx6X2xkYXApOw0KCWlmIChyZXN1bHQg IT0gSVNDX1JfU1VDQ0VTUykgew0KCQlVTkVYUEVDVEVEX0VSUk9SKF9fRklMRV9fLCBfX0xJTkVf XywNCgkJCQkgImRuc19zZGx6cmVnaXN0ZXIoKSBmYWlsZWQ6ICVzIiwNCgkJCQkgaXNjX3Jlc3Vs dF90b3RleHQocmVzdWx0KSk7DQoJCXJlc3VsdCA9IElTQ19SX1VORVhQRUNURUQ7DQoJfQ0KDQoJ cmV0dXJuIChyZXN1bHQpOw0KfQ0KDQovKiUNCiAqIFdyYXBwZXIgYXJvdW5kIGRuc19zZGx6dW5y ZWdpc3RlcigpLg0KICovDQp2b2lkDQpkbHpfbGRhcF9jbGVhcih2b2lkKSB7DQoJLyoNCgkgKiBX cml0ZSBkZWJ1Z2dpbmcgbWVzc2FnZSB0byBsb2cNCgkgKi8NCglpc2NfbG9nX3dyaXRlKGRuc19s Y3R4LCBETlNfTE9HQ0FURUdPUllfREFUQUJBU0UsDQoJCSAgICAgIEROU19MT0dNT0RVTEVfRExa LCBJU0NfTE9HX0RFQlVHKDIpLA0KCQkgICAgICAiVW5yZWdpc3RlcmluZyBETFogbGRhcCBkcml2 ZXIuIik7DQoNCglpZiAoZGx6X2xkYXAgIT0gTlVMTCkNCgkJZG5zX3NkbHp1bnJlZ2lzdGVyKCZk bHpfbGRhcCk7DQp9DQoNCiNlbmRpZg0K --047d7b6dcf5220190004df9557f0 Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Disposition: inline ------------------------------------------------------------------------------ This SF.net email is sponsored by Windows: Build for Windows Store. http://p.sf.net/sfu/windows-dev2dev --047d7b6dcf5220190004df9557f0 Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Disposition: inline _______________________________________________ Bind-dlz-testers mailing list [email protected] https://lists.sourceforge.net/lists/listinfo/bind-dlz-testers --047d7b6dcf5220190004df9557f0--