Received: from localhost (unknown [200.46.204.183]) by developer.postgresql.org (Postfix) with ESMTP id 23B482E005F for ; Sat, 17 May 2008 09:28:39 -0300 (ADT) Received: from developer.postgresql.org ([200.46.204.71]) by localhost (mx1.hub.org [200.46.204.183]) (amavisd-maia, port 10024) with ESMTP id 73413-06 for ; Sat, 17 May 2008 09:28:26 -0300 (ADT) X-Greylist: from auto-whitelisted by SQLgrey-1.7.6 Received: from mail.esilo.com (updates.esilo.com [63.150.152.211]) by developer.postgresql.org (Postfix) with ESMTP id 791412E005E for ; Sat, 17 May 2008 09:28:29 -0300 (ADT) Received: from [10.0.0.84] (fwext-esilo-jupiter.esilo.com [64.135.45.146]) (authenticated bits=0) by mail.esilo.com (8.13.1/8.13.1) with ESMTP id m4HCSLTJ022636; Sat, 17 May 2008 08:28:22 -0400 Message-ID: <482ECF62.7010901@esilo.com> Date: Sat, 17 May 2008 08:28:18 -0400 From: Andrew Chernow User-Agent: Thunderbird 2.0.0.14 (Windows/20080421) MIME-Version: 1.0 To: Merlin Moncure CC: Tom Lane , Andrew Dunstan , Alvaro Herrera , "Patches (PostgreSQL)" Subject: Re: libpq object hooks (libpq events) References: <482A58D8.2030205@dunslane.net> <20080514043313.GS6966@alvh.no-ip.org> <482AD896.4000504@dunslane.net> <19342.1210776271@sss.pgh.pa.us> <482B1480.1070705@esilo.com> <482B2AC5.7000503@esilo.com> In-Reply-To: <482B2AC5.7000503@esilo.com> Content-Type: multipart/mixed; boundary="------------070602030304010406090308" X-Virus-Scanned: Maia Mailguard 1.0.1 X-Archive-Number: 200805/349 X-Sequence-Number: 6375 This is a multi-part message in MIME format. --------------070602030304010406090308 Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit Here is an updated patch for what was called object hooks. This is now called libpq events. If someone has a better name or hates ours, let us know. I am continuing to use the object hooks thread to avoid confusing anyone. Terminology: I got rid of calling it object events because it is possible to add other non-object-related events in the future; maybe a query event. This system can be used for any type of event, I think it is pretty generic. event proc - the callback procedure/function implemented outside of libpq ... PGEventProc. The address of the event proc is used as a lookup key for getting a conn/result's event data. event data - the state data managed by the event proc but tracked by libpq. This allows the event proc implementor to basically add a dynamic struct member to a conn or result. This is an instance based value, unlike the "arg pointer". arg pointer - this is the passthrough/user pointer. I called it 'arg' as other libpq callbacks used this term for this type of value. This value can be retrieved via PQeventData, PQresultEventData ... its an optional double pointer argument. event state - an internal structure, PGEventState, which contains the event data, event proc and the 'arg' pointer. Internally, PGconn and PGresult contain arrays of event states. event id - PGEventId enum values, PGEVT_xxx. This tells the event proc which event has occurred. event info - These are the structures for event ids, like PGEVT_RESULTDESTROY has a corresponding PGEventResultDestroy structure. The PGEventProc function's 2nd argument is "void *info". The first argument is an event id which tells the proc implementor how to cast the void *. This replaced the initial va_arg idea. -- Andrew Chernow eSilo, LLC every bit counts http://www.esilo.com/ --------------070602030304010406090308 Content-Type: text/plain; name="libpq_events.patch" Content-Transfer-Encoding: base64 Content-Disposition: inline; filename="libpq_events.patch" SW5kZXg6IGV4cG9ydHMudHh0Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KUkNTIGZpbGU6IC9wcm9qZWN0cy9j dnNyb290L3Bnc3FsL3NyYy9pbnRlcmZhY2VzL2xpYnBxL2V4cG9ydHMudHh0LHYKcmV0cmll dmluZyByZXZpc2lvbiAxLjE5CmRpZmYgLUM2IC1yMS4xOSBleHBvcnRzLnR4dAoqKiogZXhw b3J0cy50eHQJMTkgTWFyIDIwMDggMDA6Mzk6MzMgLTAwMDAJMS4xOQotLS0gZXhwb3J0cy50 eHQJMTcgTWF5IDIwMDggMTI6MDY6MTAgLTAwMDAKKioqKioqKioqKioqKioqCioqKiAxMzgs MTQzICoqKioKLS0tIDEzOCwxNDkgLS0tLQogIFBRc2VuZERlc2NyaWJlUG9ydGFsICAgICAg MTM2CiAgbG9fdHJ1bmNhdGUgICAgICAgICAgICAgICAxMzcKICBQUWNvbm5lY3Rpb25Vc2Vk UGFzc3dvcmQgIDEzOAogIHBnX3ZhbGlkX3NlcnZlcl9lbmNvZGluZ19pZCAxMzkKICBQUWNv bm5lY3Rpb25OZWVkc1Bhc3N3b3JkIDE0MAogIGxvX2ltcG9ydF93aXRoX29pZAkJICAxNDEK KyBQUWNvcHlSZXN1bHQgICAgICAgICAgICAgIDE0MgorIFBRc2V0dmFsdWUgICAgICAgICAg ICAgICAgMTQzCisgUFFyZXN1bHRBbGxvYyAgICAgICAgICAgICAxNDQKKyBQUXJlZ2lzdGVy RXZlbnRQcm9jICAgICAgIDE0NQorIFBRZXZlbnREYXRhICAgICAgICAgICAgICAgMTQ2Cisg UFFyZXN1bHRFdmVudERhdGEgICAgICAgICAxNDcKSW5kZXg6IGZlLWNvbm5lY3QuYwo9PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09ClJDUyBmaWxlOiAvcHJvamVjdHMvY3Zzcm9vdC9wZ3NxbC9zcmMvaW50ZXJm YWNlcy9saWJwcS9mZS1jb25uZWN0LmMsdgpyZXRyaWV2aW5nIHJldmlzaW9uIDEuMzU4CmRp ZmYgLUM2IC1yMS4zNTggZmUtY29ubmVjdC5jCioqKiBmZS1jb25uZWN0LmMJMTYgTWF5IDIw MDggMTg6MzA6NTMgLTAwMDAJMS4zNTgKLS0tIGZlLWNvbm5lY3QuYwkxNyBNYXkgMjAwOCAx MjowNjoxMSAtMDAwMAoqKioqKioqKioqKioqKioKKioqIDk5OCwxMDA5ICoqKioKLS0tIDk5 OCwxMDE0IC0tLS0KICAJCQkgKiBXZSByZWFsbHkgc2hvdWxkbid0IGhhdmUgYmVlbiBwb2xs ZWQgaW4gdGhlc2UgdHdvIGNhc2VzLCBidXQgd2UKICAJCQkgKiBjYW4gaGFuZGxlIGl0Lgog IAkJCSAqLwogIAkJY2FzZSBDT05ORUNUSU9OX0JBRDoKICAJCQlyZXR1cm4gUEdSRVNfUE9M TElOR19GQUlMRUQ7CiAgCQljYXNlIENPTk5FQ1RJT05fT0s6CisgCQkJaWYoIXBxUmVnaXN0 ZXJHbG9iYWxFdmVudHMoY29ubikpCisgCQkJeworIAkJCQljb25uLT5zdGF0dXMgPSBDT05O RUNUSU9OX0JBRDsKKyAJCQkJcmV0dXJuIFBHUkVTX1BPTExJTkdfRkFJTEVEOworIAkJCX0K ICAJCQlyZXR1cm4gUEdSRVNfUE9MTElOR19PSzsKICAKICAJCQkvKiBUaGVzZSBhcmUgcmVh ZGluZyBzdGF0ZXMgKi8KICAJCWNhc2UgQ09OTkVDVElPTl9BV0FJVElOR19SRVNQT05TRToK ICAJCWNhc2UgQ09OTkVDVElPTl9BVVRIX09LOgogIAkJCXsKKioqKioqKioqKioqKioqCioq KiAxODE2LDE4MjcgKioqKgotLS0gMTgyMSwxODM3IC0tLS0KICAJCQkJCWNvbm4tPm5leHRf ZW8gPSBFbnZpcm9ubWVudE9wdGlvbnM7CiAgCQkJCQlyZXR1cm4gUEdSRVNfUE9MTElOR19X UklUSU5HOwogIAkJCQl9CiAgCiAgCQkJCS8qIE90aGVyd2lzZSwgd2UgYXJlIG9wZW4gZm9y IGJ1c2luZXNzISAqLwogIAkJCQljb25uLT5zdGF0dXMgPSBDT05ORUNUSU9OX09LOworIAkJ CQlpZighcHFSZWdpc3Rlckdsb2JhbEV2ZW50cyhjb25uKSkKKyAJCQkJeworIAkJCQkJY29u bi0+c3RhdHVzID0gQ09OTkVDVElPTl9CQUQ7CisgCQkJCQlyZXR1cm4gUEdSRVNfUE9MTElO R19GQUlMRUQ7CisgCQkJCX0KICAJCQkJcmV0dXJuIFBHUkVTX1BPTExJTkdfT0s7CiAgCQkJ fQogIAogIAkJY2FzZSBDT05ORUNUSU9OX1NFVEVOVjoKICAKICAJCQkvKgoqKioqKioqKioq KioqKioKKioqIDE4NDgsMTg1OSAqKioqCi0tLSAxODU4LDE4NzQgLS0tLQogIAkJCQlkZWZh dWx0OgogIAkJCQkJZ290byBlcnJvcl9yZXR1cm47CiAgCQkJfQogIAogIAkJCS8qIFdlIGFy ZSBvcGVuIGZvciBidXNpbmVzcyEgKi8KICAJCQljb25uLT5zdGF0dXMgPSBDT05ORUNUSU9O X09LOworIAkJCWlmKCFwcVJlZ2lzdGVyR2xvYmFsRXZlbnRzKGNvbm4pKQorIAkJCXsKKyAJ CQkJY29ubi0+c3RhdHVzID0gQ09OTkVDVElPTl9CQUQ7CisgCQkJCXJldHVybiBQR1JFU19Q T0xMSU5HX0ZBSUxFRDsKKyAJCQl9CiAgCQkJcmV0dXJuIFBHUkVTX1BPTExJTkdfT0s7CiAg CiAgCQlkZWZhdWx0OgogIAkJCXByaW50ZlBRRXhwQnVmZmVyKCZjb25uLT5lcnJvck1lc3Nh Z2UsCiAgCQkJCQkJCSAgbGlicHFfZ2V0dGV4dCgKICAJCQkJCQkJCQkJCSJpbnZhbGlkIGNv bm5lY3Rpb24gc3RhdGUgJWMsICIKKioqKioqKioqKioqKioqCioqKiAxOTcwLDE5ODEgKioq KgotLS0gMTk4NSwyMDE2IC0tLS0KICAgKiByZWxlYXNlIGRhdGEgdGhhdCBpcyB0byBiZSBo ZWxkIGZvciB0aGUgbGlmZSBvZiB0aGUgUEdjb25uIHN0cnVjdHVyZS4KICAgKiBJZiBhIHZh bHVlIG91Z2h0IHRvIGJlIGNsZWFyZWQvZnJlZWQgZHVyaW5nIFBRcmVzZXQoKSwgZG8gaXQg dGhlcmUgbm90IGhlcmUuCiAgICovCiAgc3RhdGljIHZvaWQKICBmcmVlUEdjb25uKFBHY29u biAqY29ubikKICB7CisgCWludCBpOworIAlQR0V2ZW50Q29ubkRlc3Ryb3kgaW5mbzsKKyAK KyAJLyogTGV0IHRoZSBldmVudCBwcm9jcyBjbGVhbnVwIHRoZWlyIHN0YXRlIGRhdGEgKi8K KyAJZm9yKGk9MDsgaSA8IGNvbm4tPmV2dFN0YXRlQ291bnQ7IGkrKykKKyAJeworIAkJaW5m by5jb25uID0gY29ubjsKKyAJCWluZm8uZGF0YSA9IGNvbm4tPmV2dFN0YXRlc1tpXS5kYXRh OworIAkJKHZvaWQpY29ubi0+ZXZ0U3RhdGVzW2ldLnByb2MoUEdFVlRfQ09OTkRFU1RST1ks CisgCQkJJmluZm8sIGNvbm4tPmV2dFN0YXRlc1tpXS5hcmcpOworIAl9CisgCisgCS8qIGZy ZWUgdGhlIFBHRXZlbnRTdGF0ZSBhcnJheSAqLworIAlpZihjb25uLT5ldnRTdGF0ZXMpCisg CXsKKyAJCWZyZWUoY29ubi0+ZXZ0U3RhdGVzKTsKKyAJCWNvbm4tPmV2dFN0YXRlcyA9IE5V TEw7CisgCQljb25uLT5ldnRTdGF0ZUNvdW50ID0gY29ubi0+ZXZ0U3RhdGVTaXplID0gMDsK KyAJfQorIAogIAlpZiAoY29ubi0+cGdob3N0KQogIAkJZnJlZShjb25uLT5wZ2hvc3QpOwog IAlpZiAoY29ubi0+cGdob3N0YWRkcikKICAJCWZyZWUoY29ubi0+cGdob3N0YWRkcik7CiAg CWlmIChjb25uLT5wZ3BvcnQpCiAgCQlmcmVlKGNvbm4tPnBncG9ydCk7CioqKioqKioqKioq KioqKgoqKiogMjE1MSwyMTY0ICoqKioKICBQUXJlc2V0KFBHY29ubiAqY29ubikKICB7CiAg CWlmIChjb25uKQogIAl7CiAgCQljbG9zZVBHY29ubihjb25uKTsKICAKISAJCWlmIChjb25u ZWN0REJTdGFydChjb25uKSkKISAJCQkodm9pZCkgY29ubmVjdERCQ29tcGxldGUoY29ubik7 CiAgCX0KICB9CiAgCiAgCiAgLyoKICAgKiBQUXJlc2V0U3RhcnQ6Ci0tLSAyMTg2LDIyMTgg LS0tLQogIFBRcmVzZXQoUEdjb25uICpjb25uKQogIHsKICAJaWYgKGNvbm4pCiAgCXsKICAJ CWNsb3NlUEdjb25uKGNvbm4pOwogIAohIAkJaWYgKGNvbm5lY3REQlN0YXJ0KGNvbm4pICYm IGNvbm5lY3REQkNvbXBsZXRlKGNvbm4pKQohIAkJewohIAkJCWludCBpOwohIAkJCVBHRXZl bnRDb25uUmVzZXQgaW5mbzsKISAKISAJCQlmb3IoaT0wOyBpIDwgY29ubi0+ZXZ0U3RhdGVD b3VudDsgaSsrKQohIAkJCXsKISAJCQkJaW5mby5jb25uID0gY29ubjsKISAJCQkJaW5mby5k YXRhID0gY29ubi0+ZXZ0U3RhdGVzW2ldLmRhdGE7CiEgCiEgCQkJCWlmKCFjb25uLT5ldnRT dGF0ZXNbaV0ucHJvYyhQR0VWVF9DT05OUkVTRVQsICZpbmZvLAohIAkJCQkJY29ubi0+ZXZ0 U3RhdGVzW2ldLmFyZykpCiEgCQkJCXsKISAJCQkJCWNvbm4tPnN0YXR1cyA9IENPTk5FQ1RJ T05fQkFEOwohIAkJCQkJcHJpbnRmUFFFeHBCdWZmZXIoJmNvbm4tPmVycm9yTWVzc2FnZSwK ISAJCQkJCQlsaWJwcV9nZXR0ZXh0KCJQR0V2ZW50UHJvYyAlcCBmYWlsZWQgZHVyaW5nIFBH RVZUX0NPTk5SRVNFVCBldmVudFxuIiksCiEgCQkJCQkJY29ubi0+ZXZ0U3RhdGVzW2ldLnBy b2MpOwohIAkJCQkJYnJlYWs7CiEgCQkJCX0KISAJCQl9CiEgCQl9CiAgCX0KICB9CiAgCiAg CiAgLyoKICAgKiBQUXJlc2V0U3RhcnQ6CioqKioqKioqKioqKioqKgoqKiogMjE4NiwyMTk4 ICoqKioKICAgKiBjbG9zZXMgdGhlIGV4aXN0aW5nIGNvbm5lY3Rpb24gYW5kIG1ha2VzIGEg bmV3IG9uZQogICAqLwogIFBvc3RncmVzUG9sbGluZ1N0YXR1c1R5cGUKICBQUXJlc2V0UG9s bChQR2Nvbm4gKmNvbm4pCiAgewogIAlpZiAoY29ubikKISAJCXJldHVybiBQUWNvbm5lY3RQ b2xsKGNvbm4pOwogIAogIAlyZXR1cm4gUEdSRVNfUE9MTElOR19GQUlMRUQ7CiAgfQogIAog IC8qCiAgICogUFFjYW5jZWxHZXQ6IGdldCBhIFBHY2FuY2VsIHN0cnVjdHVyZSBjb3JyZXNw b25kaW5nIHRvIGEgY29ubmVjdGlvbi4KLS0tIDIyNDAsMjI3OCAtLS0tCiAgICogY2xvc2Vz IHRoZSBleGlzdGluZyBjb25uZWN0aW9uIGFuZCBtYWtlcyBhIG5ldyBvbmUKICAgKi8KICBQ b3N0Z3Jlc1BvbGxpbmdTdGF0dXNUeXBlCiAgUFFyZXNldFBvbGwoUEdjb25uICpjb25uKQog IHsKICAJaWYgKGNvbm4pCiEgCXsKISAJCVBvc3RncmVzUG9sbGluZ1N0YXR1c1R5cGUgc3Rh dHVzID0gUFFjb25uZWN0UG9sbChjb25uKTsKISAKISAJCWlmKHN0YXR1cyA9PSBQR1JFU19Q T0xMSU5HX09LKQohIAkJewohIAkJCWludCBpOwohIAkJCVBHRXZlbnRDb25uUmVzZXQgaW5m bzsKISAKISAJCQlmb3IoaT0wOyBpIDwgY29ubi0+ZXZ0U3RhdGVDb3VudDsgaSsrKQohIAkJ CXsKISAJCQkJaW5mby5jb25uID0gY29ubjsKISAJCQkJaW5mby5kYXRhID0gY29ubi0+ZXZ0 U3RhdGVzW2ldLmRhdGE7CiEgCiEgCQkJCWlmKCFjb25uLT5ldnRTdGF0ZXNbaV0ucHJvYyhQ R0VWVF9DT05OUkVTRVQsICZpbmZvLAohIAkJCQkJY29ubi0+ZXZ0U3RhdGVzW2ldLmFyZykp CiEgCQkJCXsKISAJCQkJCWNvbm4tPnN0YXR1cyA9IENPTk5FQ1RJT05fQkFEOwohIAkJCQkJ cHJpbnRmUFFFeHBCdWZmZXIoJmNvbm4tPmVycm9yTWVzc2FnZSwKISAJCQkJCQlsaWJwcV9n ZXR0ZXh0KCJQR0V2ZW50UHJvYyAlcCBmYWlsZWQgZHVyaW5nIFBHRVZUX0NPTk5SRVNFVCBl dmVudFxuIiksCiEgCQkJCQkJY29ubi0+ZXZ0U3RhdGVzW2ldLnByb2MpOwohIAkJCQkJcmV0 dXJuIFBHUkVTX1BPTExJTkdfRkFJTEVEOwohIAkJCQl9CiEgCQkJfQohIAkJfQohIAohIAkJ cmV0dXJuIHN0YXR1czsKISAJfQogIAogIAlyZXR1cm4gUEdSRVNfUE9MTElOR19GQUlMRUQ7 CiAgfQogIAogIC8qCiAgICogUFFjYW5jZWxHZXQ6IGdldCBhIFBHY2FuY2VsIHN0cnVjdHVy ZSBjb3JyZXNwb25kaW5nIHRvIGEgY29ubmVjdGlvbi4KSW5kZXg6IGZlLWV4ZWMuYwo9PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09ClJDUyBmaWxlOiAvcHJvamVjdHMvY3Zzcm9vdC9wZ3NxbC9zcmMvaW50ZXJm YWNlcy9saWJwcS9mZS1leGVjLmMsdgpyZXRyaWV2aW5nIHJldmlzaW9uIDEuMTk0CmRpZmYg LUM2IC1yMS4xOTQgZmUtZXhlYy5jCioqKiBmZS1leGVjLmMJMSBKYW4gMjAwOCAxOTo0Njow MCAtMDAwMAkxLjE5NAotLS0gZmUtZXhlYy5jCTE3IE1heSAyMDA4IDEyOjA2OjEyIC0wMDAw CioqKioqKioqKioqKioqKgoqKiogNjAsNzIgKioqKgogIAkJCQlpbnQgcmVzdWx0Rm9ybWF0 KTsKICBzdGF0aWMgdm9pZCBwYXJzZUlucHV0KFBHY29ubiAqY29ubik7CiAgc3RhdGljIGJv b2wgUFFleGVjU3RhcnQoUEdjb25uICpjb25uKTsKICBzdGF0aWMgUEdyZXN1bHQgKlBRZXhl Y0ZpbmlzaChQR2Nvbm4gKmNvbm4pOwogIHN0YXRpYyBpbnQgUFFzZW5kRGVzY3JpYmUoUEdj b25uICpjb25uLCBjaGFyIGRlc2NfdHlwZSwKICAJCQkgICBjb25zdCBjaGFyICpkZXNjX3Rh cmdldCk7CiEgCiAgCiAgLyogLS0tLS0tLS0tLS0tLS0tLQogICAqIFNwYWNlIG1hbmFnZW1l bnQgZm9yIFBHcmVzdWx0LgogICAqCiAgICogRm9ybWVybHksIGxpYnBxIGRpZCBhIHNlcGFy YXRlIG1hbGxvYygpIGZvciBlYWNoIGZpZWxkIG9mIGVhY2ggdHVwbGUKICAgKiByZXR1cm5l ZCBieSBhIHF1ZXJ5LiAgVGhpcyB3YXMgcmVtYXJrYWJseSBleHBlbnNpdmUgLS0tIG1hbGxv Yy9mcmVlCi0tLSA2MCw3MiAtLS0tCiAgCQkJCWludCByZXN1bHRGb3JtYXQpOwogIHN0YXRp YyB2b2lkIHBhcnNlSW5wdXQoUEdjb25uICpjb25uKTsKICBzdGF0aWMgYm9vbCBQUWV4ZWNT dGFydChQR2Nvbm4gKmNvbm4pOwogIHN0YXRpYyBQR3Jlc3VsdCAqUFFleGVjRmluaXNoKFBH Y29ubiAqY29ubik7CiAgc3RhdGljIGludCBQUXNlbmREZXNjcmliZShQR2Nvbm4gKmNvbm4s IGNoYXIgZGVzY190eXBlLAogIAkJCSAgIGNvbnN0IGNoYXIgKmRlc2NfdGFyZ2V0KTsKISBz dGF0aWMgaW50IGNoZWNrX2ZpZWxkX251bWJlcihjb25zdCBQR3Jlc3VsdCAqcmVzLCBpbnQg ZmllbGRfbnVtKTsKICAKICAvKiAtLS0tLS0tLS0tLS0tLS0tCiAgICogU3BhY2UgbWFuYWdl bWVudCBmb3IgUEdyZXN1bHQuCiAgICoKICAgKiBGb3JtZXJseSwgbGlicHEgZGlkIGEgc2Vw YXJhdGUgbWFsbG9jKCkgZm9yIGVhY2ggZmllbGQgb2YgZWFjaCB0dXBsZQogICAqIHJldHVy bmVkIGJ5IGEgcXVlcnkuICBUaGlzIHdhcyByZW1hcmthYmx5IGV4cGVuc2l2ZSAtLS0gbWFs bG9jL2ZyZWUKKioqKioqKioqKioqKioqCioqKiAxMjEsMTQxICoqKioKLS0tIDEyMSwxNjcg LS0tLQogICNkZWZpbmUgUEdSRVNVTFRfREFUQV9CTE9DS1NJWkUJCTIwNDgKICAjZGVmaW5l IFBHUkVTVUxUX0FMSUdOX0JPVU5EQVJZCQlNQVhJTVVNX0FMSUdOT0YJCS8qIGZyb20gY29u ZmlndXJlICovCiAgI2RlZmluZSBQR1JFU1VMVF9CTE9DS19PVkVSSEVBRAkJTWF4KHNpemVv ZihQR3Jlc3VsdF9kYXRhKSwgUEdSRVNVTFRfQUxJR05fQk9VTkRBUlkpCiAgI2RlZmluZSBQ R1JFU1VMVF9TRVBfQUxMT0NfVEhSRVNIT0xECShQR1JFU1VMVF9EQVRBX0JMT0NLU0laRSAv IDIpCiAgCiAgCisgLyogRG9lcyBub3QgZHVwbGljYXRlIHRoZSBwcml2YXRlIHN0YXRlIGRh dGEsIHNldHMgdGhpcyB0byBOVUxMICovCisgc3RhdGljIFBHRXZlbnRTdGF0ZSAqCisgZHVw RXZlbnRTdGF0ZXMoUEdFdmVudFN0YXRlICpzdGF0ZXMsIGludCBjb3VudCkKKyB7CisgCWlu dCBpOworIAlQR0V2ZW50U3RhdGUgKm5ld1N0YXRlczsKKyAKKyAJaWYoIXN0YXRlcyB8fCBj b3VudCA8PSAwKQorIAkJcmV0dXJuIE5VTEw7CisgCisgCW5ld1N0YXRlcyA9IChQR0V2ZW50 U3RhdGUgKiltYWxsb2MoY291bnQgKiBzaXplb2YoUEdFdmVudFN0YXRlKSk7CisgCWlmKCFu ZXdTdGF0ZXMpCisgCQlyZXR1cm4gTlVMTDsKKyAKKyAJbWVtY3B5KG5ld1N0YXRlcywgc3Rh dGVzLCBjb3VudCAqIHNpemVvZihQR0V2ZW50U3RhdGUpKTsKKyAKKyAJLyogTlVMTCBvdXQg dGhlIGRhdGEgcG9pbnRlciAqLworIAlmb3IoaT0wOyBpIDwgY291bnQ7IGkrKykKKyAJCW5l d1N0YXRlc1tpXS5kYXRhID0gTlVMTDsKKyAKKyAJcmV0dXJuIG5ld1N0YXRlczsKKyB9Cisg CiAgLyoKICAgKiBQUW1ha2VFbXB0eVBHcmVzdWx0CiAgICoJIHJldHVybnMgYSBuZXdseSBh bGxvY2F0ZWQsIGluaXRpYWxpemVkIFBHcmVzdWx0IHdpdGggZ2l2ZW4gc3RhdHVzLgogICAq CSBJZiBjb25uIGlzIG5vdCBOVUxMIGFuZCBzdGF0dXMgaW5kaWNhdGVzIGFuIGVycm9yLCB0 aGUgY29ubidzCiAgICoJIGVycm9yTWVzc2FnZSBpcyBjb3BpZWQuCiAgICoKICAgKiBOb3Rl IHRoaXMgaXMgZXhwb3J0ZWQgLS0tIHlvdSB3b3VsZG4ndCB0aGluayBhbiBhcHBsaWNhdGlv biB3b3VsZCBuZWVkCiAgICogdG8gYnVpbGQgaXRzIG93biBQR3Jlc3VsdHMsIGJ1dCB0aGlz IGhhcyBwcm92ZW4gdXNlZnVsIGluIGJvdGggbGlicGd0Y2wKICAgKiBhbmQgdGhlIFBlcmw1 IGludGVyZmFjZSwgc28gbWF5YmUgaXQncyBub3Qgc28gdW5yZWFzb25hYmxlLgorICAqCisg ICogVXBkYXRlZCBBcHJpbCAyMDA4IC0gSWYgY29ubiBpcyBub3QgTlVMTCwgZXZlbnQgc3Rh dGVzIHdpbGwgYmUgY29waWVkCisgICogZnJvbSB0aGUgUEdjb25uIHRvIHRoZSBjcmVhdGVk IFBHcmVzdWx0LgogICAqLwogIAogIFBHcmVzdWx0ICoKICBQUW1ha2VFbXB0eVBHcmVzdWx0 KFBHY29ubiAqY29ubiwgRXhlY1N0YXR1c1R5cGUgc3RhdHVzKQogIHsKICAJUEdyZXN1bHQg ICAqcmVzdWx0OwoqKioqKioqKioqKioqKioKKioqIDE1NywxNzUgKioqKgotLS0gMTgzLDIx OCAtLS0tCiAgCXJlc3VsdC0+ZXJyTXNnID0gTlVMTDsKICAJcmVzdWx0LT5lcnJGaWVsZHMg PSBOVUxMOwogIAlyZXN1bHQtPm51bGxfZmllbGRbMF0gPSAnXDAnOwogIAlyZXN1bHQtPmN1 ckJsb2NrID0gTlVMTDsKICAJcmVzdWx0LT5jdXJPZmZzZXQgPSAwOwogIAlyZXN1bHQtPnNw YWNlTGVmdCA9IDA7CisgCXJlc3VsdC0+ZXZ0U3RhdGVDb3VudCA9IDA7CisgCXJlc3VsdC0+ ZXZ0U3RhdGVzID0gTlVMTDsKICAKICAJaWYgKGNvbm4pCiAgCXsKICAJCS8qIGNvcHkgY29u bmVjdGlvbiBkYXRhIHdlIG1pZ2h0IG5lZWQgZm9yIG9wZXJhdGlvbnMgb24gUEdyZXN1bHQg Ki8KICAJCXJlc3VsdC0+bm90aWNlSG9va3MgPSBjb25uLT5ub3RpY2VIb29rczsKICAJCXJl c3VsdC0+Y2xpZW50X2VuY29kaW5nID0gY29ubi0+Y2xpZW50X2VuY29kaW5nOwogIAorIAkJ LyogY29weSBldmVudCBzdGF0ZXMgZnJvbSBjb25uZWN0aW9uICovCisgCQlpZihjb25uLT5l dnRTdGF0ZUNvdW50ID4gMCkKKyAJCXsKKyAJCQlyZXN1bHQtPmV2dFN0YXRlcyA9IGR1cEV2 ZW50U3RhdGVzKAorIAkJCQljb25uLT5ldnRTdGF0ZXMsIGNvbm4tPmV2dFN0YXRlQ291bnQp OworIAorIAkJCWlmKCFyZXN1bHQtPmV2dFN0YXRlcykKKyAJCQl7CisgCQkJCVBRY2xlYXIo cmVzdWx0KTsKKyAJCQkJcmV0dXJuIE5VTEw7CisgCQkJfQorIAorIAkJCXJlc3VsdC0+ZXZ0 U3RhdGVDb3VudCA9IGNvbm4tPmV2dFN0YXRlQ291bnQ7CisgCQl9CisgCiAgCQkvKiBjb25z aWRlciBjb3B5aW5nIGNvbm4ncyBlcnJvck1lc3NhZ2UgKi8KICAJCXN3aXRjaCAoc3RhdHVz KQogIAkJewogIAkJCWNhc2UgUEdSRVNfRU1QVFlfUVVFUlk6CiAgCQkJY2FzZSBQR1JFU19D T01NQU5EX09LOgogIAkJCWNhc2UgUEdSRVNfVFVQTEVTX09LOgoqKioqKioqKioqKioqKioK KioqIDE5MywyMDQgKioqKgotLS0gMjM2LDQ5MCAtLS0tCiAgCX0KICAKICAJcmV0dXJuIHJl c3VsdDsKICB9CiAgCiAgLyoKKyAgKiBQUWNvcHlSZXN1bHQKKyAgKiBSZXR1cm5zIGEgZGVl cCBjb3B5IG9mIHRoZSBwcm92aWRlZCAnc3JjJyBQR3Jlc3VsdCwgd2hpY2ggY2Fubm90IGJl IE5VTEwuCisgICogVGhlICdvcHRpb25zJyBhcmd1bWVudCBjb250cm9scyB3aGljaCBwb3J0 aW9ucyBvZiB0aGUgcmVzdWx0IHdpbGwgb3Igd2lsbAorICAqIE5PVCBiZSBjb3BpZWQuICBJ ZiB0aGlzIHZhbHVlIGlzIDAsIHRoZSBlbnRpcmUgcmVzdWx0IGlzIGRlZXAgY29waWVkLgor ICAqIFRoZSBjcmVhdGVkIHJlc3VsdCBpcyBhbHdheXMgcHV0IGludG8gdGhlIFBHUkVTX1RV UExFU19PSyBzdGF0dXMuICBUaGUKKyAgKiBzb3VyY2UgcmVzdWx0IGVycm9yIG1lc3NhZ2Ug aXMgbm90IGNvcGllZCwgYWx0aG91Z2ggY21kU3RhdHVzIGlzLgorICAqCisgICogT3B0aW9u czoKKyAgKiAgIFBHX0NPUFlSRVNfTk9fVFVQTEVTIC0gRG8gbm90IGNvcHkgdGhlIHR1cGxl cy4gIFRoaXMgb3B0aW9uIGlzCisgICogICBhdXRvbWF0aWNhbGx5IGVuYWJsZWQgd2hlbiBQ R19DT1BZUkVTX1VTRV9BVFRSUyBpcyBzZXQuCisgICoKKyAgKiAgIFBHX0NPUFlSRVNfVVNF X0FUVFJTIC0gSW5kaWNhdGVzIHRoYXQgdGhlICdudW1BdHRyaWJ1dGVzJyBhbmQgJ2F0dERl c2NzJworICAqICAgYXJndW1lbnRzIHNob3VsZCBiZSB1c2VkIGFzIHRoZSBmaWVsZHMgZm9y IHRoZSBjcmVhdGVkIHJlc3VsdCwgcmF0aGVyCisgICogICB0aGFuIGNvcHlpbmcgdGhlbSBm cm9tIHRoZSBzb3VyY2UgcmVzdWx0LiAgV2hlbiB0aGlzIG9wdGlvbiBpcyBzZXQsCisgICog ICB0aGUgdHVwbGVzIHdpbGwgTk9UIGJlIGNvcGllZDsgYmVoYXZpbmcgaWRlbnRpY2FsbHkg dG8gc2V0dGluZyB0aGUKKyAgKiAgIFBHX0NPUFlSRVNfTk9fVFVQTEVTIG9wdGlvbi4gIE9u ZSBtdXN0IHVzZSBQUXNldHZhbHVlIHRvIG1hbnVhbGx5CisgICogICBhZGQgdHVwbGVzIHRv IHRoZSByZXR1cm5lZCByZXN1bHQuICBOT1RFOiBudW1BdHRyaWJ1dGVzIGFuZCBhdHREZXNj cworICAqICAgYXJndW1lbnRzIGFyZSBpZ25vcmVkIHVubGVzcyB0aGlzIG9wdGlvbiBpcyBz ZXQhCisgICoKKyAgKiAgIFBHX0NPUFlSRVNfTk9fRVZFTlRQUk9DUyAtIEluZGljYXRlcyB0 aGF0IHRoZSBzb3VyY2UgcmVzdWx0J3MKKyAgKiAgIFBHRXZlbnRQcm9jcyBzaG91bGQgTk9U IGJlIGNvcGllZCB0byB0aGUgY3JlYXRlZCByZXN1bHQuCisgICoKKyAgKiAgIFBHX0NPUFlS RVNfTk9fTk9USUNFSE9PS1MgLSBJbmRpY2F0ZXMgdGhhdCB0aGUgc291cmNlIHJlc3VsdCdz CisgICogICBOb3RpY2VIb29rcyBzaG91bGQgTk9UIGJlIGNvcGllZCB0byB0aGUgY3JlYXRl ZCByZXN1bHQuCisgICovCisgCisgUEdyZXN1bHQgKgorIFBRY29weVJlc3VsdChjb25zdCBQ R3Jlc3VsdCAqc3JjLCBpbnQgbnVtQXR0cmlidXRlcywKKyAJUEdyZXNBdHREZXNjICphdHRE ZXNjcywgaW50IG9wdGlvbnMpCisgeworIAlpbnQgaTsKKyAJUEdyZXN1bHQgKmRlc3Q7Cisg CVBHRXZlbnRSZXN1bHRDb3B5IGluZm87CisgCisgCWlmKCFzcmMpCisgCQlyZXR1cm4gTlVM TDsKKyAKKyAJLyogQXV0b21hdGljYWxseSB0dXJuIG9uIG5vX3R1cGxlcyBzaW5jZSB1c2Vf YXR0cnMgaXMgc2V0LiAgSXQgbWFrZXMKKyAJICogbm8gc2Vuc2UgdG8gY29weSB0dXBsZXMg aW50byBhbiB1bmtub3duIHNldCBvZiBjb2x1bW5zLgorIAkgKi8KKyAJaWYob3B0aW9ucyAm IFBHX0NPUFlSRVNfVVNFX0FUVFJTKQorIAkJb3B0aW9ucyB8PSBQR19DT1BZUkVTX05PX1RV UExFUzsKKyAKKyAJLyogSWYgdXNlX2F0dHJzIGlzIHNldCwgdmVyaWZ5IGF0dHIgYXJndW1l bnRzLiAqLworIAlpZigob3B0aW9ucyAmIFBHX0NPUFlSRVNfVVNFX0FUVFJTKSAmJiAobnVt QXR0cmlidXRlcyA8PSAwIHx8ICFhdHREZXNjcykpCisgCQlyZXR1cm4gTlVMTDsKKyAKKyAJ ZGVzdCA9IFBRbWFrZUVtcHR5UEdyZXN1bHQoKFBHY29ubiAqKU5VTEwsIFBHUkVTX1RVUExF U19PSyk7CisgCWlmKCFkZXN0KQorIAkJcmV0dXJuIE5VTEw7CisgCisgCS8qIGFsd2F5cyBj b3B5IHRoZXNlIG92ZXIuICBJcyBjbWRTdGF0dXMgdXNlZnVsIGhlcmU/ICovCisgCWRlc3Qt PmNsaWVudF9lbmNvZGluZyA9IHNyYy0+Y2xpZW50X2VuY29kaW5nOworIAlzdHJjcHkoZGVz dC0+Y21kU3RhdHVzLCBzcmMtPmNtZFN0YXR1cyk7CisgCisgCS8qIFdhbnRzIHRvIGNvcHkg bm90aWNlIGhvb2tzICovCisgCWlmKCEob3B0aW9ucyAmIFBHX0NPUFlSRVNfTk9fTk9USUNF SE9PS1MpKQorIAkJZGVzdC0+bm90aWNlSG9va3MgPSBzcmMtPm5vdGljZUhvb2tzOworIAor IAkvKiBDb3B5IGZyb20gc3JjIHJlc3VsdCB3aGVuIG5vdCBzdXBwbHlpbmcgYXR0cnMgKi8K KyAJaWYoIShvcHRpb25zICYgUEdfQ09QWVJFU19VU0VfQVRUUlMpICYmIHNyYy0+bnVtQXR0 cmlidXRlcyA+IDApCisgCXsKKyAJCW51bUF0dHJpYnV0ZXMgPSBzcmMtPm51bUF0dHJpYnV0 ZXM7CisgCQlhdHREZXNjcyA9IHNyYy0+YXR0RGVzY3M7CisgCX0KKyAKKyAJLyogY29weSBh dHRycyAqLworIAlpZihudW1BdHRyaWJ1dGVzID4gMCkKKyAJeworIAkJZGVzdC0+YXR0RGVz Y3MgPSAoUEdyZXNBdHREZXNjICopUFFyZXN1bHRBbGxvYyhkZXN0LAorIAkJCW51bUF0dHJp YnV0ZXMgKiBzaXplb2YoUEdyZXNBdHREZXNjKSk7CisgCisgCQlpZighZGVzdC0+YXR0RGVz Y3MpCisgCQl7CisgCQkJUFFjbGVhcihkZXN0KTsKKyAJCQlyZXR1cm4gTlVMTDsKKyAJCX0K KyAKKyAJCWRlc3QtPm51bUF0dHJpYnV0ZXMgPSBudW1BdHRyaWJ1dGVzOworIAkJbWVtY3B5 KGRlc3QtPmF0dERlc2NzLCBhdHREZXNjcywgbnVtQXR0cmlidXRlcyAqIHNpemVvZihQR3Jl c0F0dERlc2MpKTsKKyAKKyAJCS8qIHJlc3VsdGFsbG9jIHRoZSBhdHRyaWJ1dGUgbmFtZXMu ICBUaGUgYWJvdmUgbWVtY3B5IGhhcyB0aGUgYXR0cgorIAkJICogbmFtZXMgcG9pbnRpbmcg YXQgdGhlIHNvdXJjZSByZXN1bHQncyBwcml2YXRlIG1lbW9yeSAob3IgYXQgdGhlCisgCQkg KiBjYWxsZXJzIHByb3ZpZGVkIGF0dERlc2NzIG1lbW9yeSkuCisgCQkgKi8KKyAJCWRlc3Qt PmJpbmFyeSA9IDE7CisgCQlmb3IoaT0wOyBpIDwgbnVtQXR0cmlidXRlczsgaSsrKQorIAkJ eworIAkJCWlmKGF0dERlc2NzW2ldLm5hbWUpCisgCQkJCWRlc3QtPmF0dERlc2NzW2ldLm5h bWUgPSBwcVJlc3VsdFN0cmR1cChkZXN0LCBhdHREZXNjc1tpXS5uYW1lKTsKKyAJCQllbHNl CisgCQkJCWRlc3QtPmF0dERlc2NzW2ldLm5hbWUgPSBkZXN0LT5udWxsX2ZpZWxkOworIAor IAkJCWlmKCFkZXN0LT5hdHREZXNjc1tpXS5uYW1lKQorIAkJCXsKKyAJCQkJUFFjbGVhcihk ZXN0KTsKKyAJCQkJcmV0dXJuIE5VTEw7CisgCQkJfQorIAorIAkJCS8qIEFsdGhvdWdoIGRl cHJlY2F0ZWQsIGJlY2F1c2UgcmVzdWx0cyBjYW4gaGF2ZSB0ZXh0K2JpbmFyeSBjb2x1bW5z LAorIAkJCSAqIGl0cyBlYXN5IGVub3VnaCB0byBkZWR1Y2Ugc28gc2V0IGl0IGZvciBjb21w bGV0ZW5lc3MuCisgCQkJICovCisgCQkJaWYoZGVzdC0+YXR0RGVzY3NbaV0uZm9ybWF0ID09 IDApCisgCQkJCWRlc3QtPmJpbmFyeSA9IDA7CisgCQl9CisgCX0KKyAKKyAJLyogV2FudHMg dG8gY29weSByZXN1bHQgdHVwbGVzOiB1c2UgUFFzZXR2YWx1ZSgpLiAqLworIAlpZighKG9w dGlvbnMgJiBQR19DT1BZUkVTX05PX1RVUExFUykgJiYgc3JjLT5udHVwcyA+IDApCisgCXsK KyAJCWludCB0dXAsIGZpZWxkOworIAkJZm9yKHR1cD0wOyB0dXAgPCBzcmMtPm50dXBzOyB0 dXArKykKKyAJCQlmb3IoZmllbGQ9MDsgZmllbGQgPCBzcmMtPm51bUF0dHJpYnV0ZXM7IGZp ZWxkKyspCisgCQkJCVBRc2V0dmFsdWUoZGVzdCwgdHVwLCBmaWVsZCwgc3JjLT50dXBsZXNb dHVwXVtmaWVsZF0udmFsdWUsCisgCQkJCQlzcmMtPnR1cGxlc1t0dXBdW2ZpZWxkXS5sZW4p OworIAl9CisgCisgCS8qIFdhbnRzIHRvIGNvcHkgUEdFdmVudFByb2NzLiAqLworIAlpZigh KG9wdGlvbnMgJiBQR19DT1BZUkVTX05PX0VWRU5UUFJPQ1MpICYmIHNyYy0+ZXZ0U3RhdGVD b3VudCA+IDApCisgCXsKKyAJCWRlc3QtPmV2dFN0YXRlcyA9IGR1cEV2ZW50U3RhdGVzKHNy Yy0+ZXZ0U3RhdGVzLCBzcmMtPmV2dFN0YXRlQ291bnQpOworIAorIAkJaWYoIWRlc3QtPmV2 dFN0YXRlcykKKyAJCXsKKyAJCQlQUWNsZWFyKGRlc3QpOworIAkJCXJldHVybiBOVUxMOwor IAkJfQorIAorIAkJZGVzdC0+ZXZ0U3RhdGVDb3VudCA9IHNyYy0+ZXZ0U3RhdGVDb3VudDsK KyAJfQorIAorIAkvKiBUcmlnZ2VyIFBHRVZUX1JFU1VMVENPUFkgZXZlbnQgZm9yIGVhY2gg ZXZlbnQgcHJvYyAqLworIAlmb3IoaT0wOyBpIDwgZGVzdC0+ZXZ0U3RhdGVDb3VudDsgaSsr KQorIAl7CisgCQlpbmZvLnNyYyA9IHNyYzsKKyAJCWluZm8uc3JjRGF0YSA9IHNyYy0+ZXZ0 U3RhdGVzW2ldLmRhdGE7CisgCQlpbmZvLmRlc3QgPSBkZXN0OworIAkJaW5mby5kZXN0RGF0 YSA9IE5VTEw7CisgCisgCQlpZighc3JjLT5ldnRTdGF0ZXNbaV0ucHJvYyhQR0VWVF9SRVNV TFRDT1BZLCAmaW5mbywKKyAJCQlzcmMtPmV2dFN0YXRlc1tpXS5hcmcpKQorIAkJeworIAkJ CVBRY2xlYXIoZGVzdCk7CisgCQkJcmV0dXJuIE5VTEw7CisgCQl9CisgCisgCQlkZXN0LT5l dnRTdGF0ZXNbaV0uZGF0YSA9IGluZm8uZGVzdERhdGE7CisgCX0KKyAKKyAJcmV0dXJuIGRl c3Q7CisgfQorIAorIGludAorIFBRc2V0dmFsdWUoUEdyZXN1bHQgKnJlcywgaW50IHR1cF9u dW0sIGludCBmaWVsZF9udW0sCisgCWNoYXIgKnZhbHVlLCBpbnQgbGVuKQorIHsKKyAJUEdy ZXNBdHRWYWx1ZSAqYXR0dmFsOworIAorIAlpZighY2hlY2tfZmllbGRfbnVtYmVyKHJlcywg ZmllbGRfbnVtKSkKKyAJCXJldHVybiBGQUxTRTsKKyAKKyAJLyogSW52YWxpZCB0dXBfbnVt LCBtdXN0IGJlIDw9IG50dXBzICovCisgCWlmKHR1cF9udW0gPiByZXMtPm50dXBzKQorIAkJ cmV0dXJuIEZBTFNFOworIAorIAkvKiBuZWVkIHRvIGdyb3cgdGhlIHR1cGxlIHRhYmxlICov CisgCWlmKHJlcy0+bnR1cHMgPj0gcmVzLT50dXBBcnJTaXplKQorIAl7CisgCQlpbnQgbiA9 IHJlcy0+dHVwQXJyU2l6ZSA/IChyZXMtPnR1cEFyclNpemUqMykvMiA6IDY0OworIAkJUEdy ZXNBdHRWYWx1ZSAqKnR1cHMgPSAoUEdyZXNBdHRWYWx1ZSAqKikKKyAJCQkocmVzLT50dXBs ZXMgPyByZWFsbG9jKHJlcy0+dHVwbGVzLCBuKnNpemVvZihQR3Jlc0F0dFZhbHVlICopKSA6 CisgCQkJIG1hbGxvYyhuKnNpemVvZihQR3Jlc0F0dFZhbHVlICopKSk7CisgCisgCQlpZigh dHVwcykKKyAJCQlyZXR1cm4gRkFMU0U7CisgCisgCQltZW1zZXQodHVwcyArIHJlcy0+dHVw QXJyU2l6ZSwgMCwKKyAJCQkobiAtIHJlcy0+dHVwQXJyU2l6ZSkgKiBzaXplb2YoUEdyZXNB dHRWYWx1ZSAqKSk7CisgCQlyZXMtPnR1cGxlcyA9IHR1cHM7CisgCQlyZXMtPnR1cEFyclNp emUgPSBuOworIAl9CisgCisgCS8qIG5lZWQgdG8gYWxsb2NhdGUgYSBuZXcgdHVwbGUgKi8K KyAJaWYodHVwX251bSA9PSByZXMtPm50dXBzICYmICFyZXMtPnR1cGxlc1t0dXBfbnVtXSkK KyAJeworIAkJaW50IGk7CisgCQlQR3Jlc0F0dFZhbHVlICp0dXAgPSAoUEdyZXNBdHRWYWx1 ZSAqKVBRcmVzdWx0QWxsb2MoCisgCQkJcmVzLCByZXMtPm51bUF0dHJpYnV0ZXMgKiBzaXpl b2YoUEdyZXNBdHRWYWx1ZSkpOworIAorIAkJaWYoIXR1cCkKKyAJCQlyZXR1cm4gRkFMU0U7 CisgCisgCQkvKiBpbml0aWFsaXplIGVhY2ggY29sdW1uIHRvIE5VTEwgKi8KKyAJCWZvcihp PTA7IGkgPCByZXMtPm51bUF0dHJpYnV0ZXM7IGkrKykKKyAJCXsKKyAJCQl0dXBbaV0ubGVu ID0gTlVMTF9MRU47CisgCQkJdHVwW2ldLnZhbHVlID0gcmVzLT5udWxsX2ZpZWxkOworIAkJ fQorIAorIAkJcmVzLT50dXBsZXNbdHVwX251bV0gPSB0dXA7CisgCQlyZXMtPm50dXBzKys7 CisgCX0KKyAKKyAJYXR0dmFsID0gJnJlcy0+dHVwbGVzW3R1cF9udW1dW2ZpZWxkX251bV07 CisgCisgCS8qIE9uIHRvcCBvZiBOVUxMX0xFTiwgdHJlYXQgYSBOVUxMIHZhbHVlIGFzIGEg TlVMTCBmaWVsZCAqLworIAlpZihsZW4gPT0gTlVMTF9MRU4gfHwgdmFsdWUgPT0gTlVMTCkK KyAJeworIAkJYXR0dmFsLT5sZW4gPSBOVUxMX0xFTjsKKyAJCWF0dHZhbC0+dmFsdWUgPSBy ZXMtPm51bGxfZmllbGQ7CisgCX0KKyAJZWxzZQorIAl7CisgCQlpZihsZW4gPCAwKQorIAkJ CWxlbiA9IDA7CisgCisgCQlpZihsZW4gPT0gMCkKKyAJCXsKKyAJCQlhdHR2YWwtPmxlbiA9 IDA7CisgCQkJYXR0dmFsLT52YWx1ZSA9IHJlcy0+bnVsbF9maWVsZDsKKyAJCX0KKyAJCWVs c2UKKyAJCXsKKyAJCQlhdHR2YWwtPnZhbHVlID0gKGNoYXIgKilQUXJlc3VsdEFsbG9jKHJl cywgbGVuICsgMSk7CisgCQkJaWYoIWF0dHZhbC0+dmFsdWUpCisgCQkJCXJldHVybiBGQUxT RTsKKyAKKyAJCQlhdHR2YWwtPmxlbiA9IGxlbjsKKyAJCQltZW1jcHkoYXR0dmFsLT52YWx1 ZSwgdmFsdWUsIGxlbik7CisgCQkJYXR0dmFsLT52YWx1ZVtsZW5dID0gJ1wwJzsKKyAJCX0K KyAJfQorIAorIAlyZXR1cm4gVFJVRTsKKyB9CisgCisgdm9pZCAqCisgUFFyZXN1bHRBbGxv YyhQR3Jlc3VsdCAqcmVzLCBzaXplX3QgbkJ5dGVzKQorIHsKKyAJcmV0dXJuIHBxUmVzdWx0 QWxsb2MocmVzLCBuQnl0ZXMsIFRSVUUpOworIH0KKyAKKyAvKgogICAqIHBxUmVzdWx0QWxs b2MgLQogICAqCQlBbGxvY2F0ZSBzdWJzaWRpYXJ5IHN0b3JhZ2UgZm9yIGEgUEdyZXN1bHQu CiAgICoKICAgKiBuQnl0ZXMgaXMgdGhlIGFtb3VudCBvZiBzcGFjZSBuZWVkZWQgZm9yIHRo ZSBvYmplY3QuCiAgICogSWYgaXNCaW5hcnkgaXMgdHJ1ZSwgd2UgYXNzdW1lIHRoYXQgd2Ug bmVlZCB0byBhbGlnbiB0aGUgb2JqZWN0IG9uCiAgICogYSBtYWNoaW5lIGFsbG9jYXRpb24g Ym91bmRhcnkuCioqKioqKioqKioqKioqKgoqKiogMzQ5LDM2NSAqKioqCi0tLSA2MzUsNjY5 IC0tLS0KICAgKiBQUWNsZWFyIC0KICAgKgkgIGZyZWUncyB0aGUgbWVtb3J5IGFzc29jaWF0 ZWQgd2l0aCBhIFBHcmVzdWx0CiAgICovCiAgdm9pZAogIFBRY2xlYXIoUEdyZXN1bHQgKnJl cykKICB7CisgCWludCBpOwogIAlQR3Jlc3VsdF9kYXRhICpibG9jazsKKyAJUEdFdmVudFJl c3VsdERlc3Ryb3kgaW5mbzsKICAKICAJaWYgKCFyZXMpCiAgCQlyZXR1cm47CiAgCisgCWZv cihpPTA7IGkgPCByZXMtPmV2dFN0YXRlQ291bnQ7IGkrKykKKyAJeworIAkJaW5mby5yZXN1 bHQgPSByZXM7CisgCQlpbmZvLmRhdGEgPSByZXMtPmV2dFN0YXRlc1tpXS5kYXRhOworIAor IAkJKHZvaWQpcmVzLT5ldnRTdGF0ZXNbaV0ucHJvYyhQR0VWVF9SRVNVTFRERVNUUk9ZLCAm aW5mbywKKyAJCQlyZXMtPmV2dFN0YXRlc1tpXS5hcmcpOworIAl9CisgCisgCWlmKHJlcy0+ ZXZ0U3RhdGVzKQorIAl7CisgCQlmcmVlKHJlcy0+ZXZ0U3RhdGVzKTsKKyAJCXJlcy0+ZXZ0 U3RhdGVzID0gTlVMTDsKKyAJCXJlcy0+ZXZ0U3RhdGVDb3VudCA9IDA7CisgCX0KKyAKICAJ LyogRnJlZSBhbGwgdGhlIHN1YnNpZGlhcnkgYmxvY2tzICovCiAgCXdoaWxlICgoYmxvY2sg PSByZXMtPmN1ckJsb2NrKSAhPSBOVUxMKQogIAl7CiAgCQlyZXMtPmN1ckJsb2NrID0gYmxv Y2stPm5leHQ7CiAgCQlmcmVlKGJsb2NrKTsKICAJfQoqKioqKioqKioqKioqKioKKioqIDEx OTAsMTIwMiAqKioqCiAgICoJICBtZW1vcnkpLgogICAqLwogIAogIFBHcmVzdWx0ICoKICBQ UWdldFJlc3VsdChQR2Nvbm4gKmNvbm4pCiAgewohIAlQR3Jlc3VsdCAgICpyZXM7CiAgCiAg CWlmICghY29ubikKICAJCXJldHVybiBOVUxMOwogIAogIAkvKiBQYXJzZSBhbnkgYXZhaWxh YmxlIGRhdGEsIGlmIG91ciBzdGF0ZSBwZXJtaXRzLiAqLwogIAlwYXJzZUlucHV0KGNvbm4p OwotLS0gMTQ5NCwxNTA2IC0tLS0KICAgKgkgIG1lbW9yeSkuCiAgICovCiAgCiAgUEdyZXN1 bHQgKgogIFBRZ2V0UmVzdWx0KFBHY29ubiAqY29ubikKICB7CiEgCVBHcmVzdWx0ICAgKnJl cz1OVUxMOwogIAogIAlpZiAoIWNvbm4pCiAgCQlyZXR1cm4gTlVMTDsKICAKICAJLyogUGFy c2UgYW55IGF2YWlsYWJsZSBkYXRhLCBpZiBvdXIgc3RhdGUgcGVybWl0cy4gKi8KICAJcGFy c2VJbnB1dChjb25uKTsKKioqKioqKioqKioqKioqCioqKiAxMjY1LDEyNzYgKioqKgotLS0g MTU2OSwxNjExIC0tLS0KICAJCQkJCQkJICBsaWJwcV9nZXR0ZXh0KCJ1bmV4cGVjdGVkIGFz eW5jU3RhdHVzOiAlZFxuIiksCiAgCQkJCQkJCSAgKGludCkgY29ubi0+YXN5bmNTdGF0dXMp OwogIAkJCXJlcyA9IFBRbWFrZUVtcHR5UEdyZXN1bHQoY29ubiwgUEdSRVNfRkFUQUxfRVJS T1IpOwogIAkJCWJyZWFrOwogIAl9CiAgCisgCWlmKHJlcyAmJiAocmVzLT5yZXN1bHRTdGF0 dXMgPT0gUEdSRVNfQ09NTUFORF9PSyB8fAorIAkJIHJlcy0+cmVzdWx0U3RhdHVzID09IFBH UkVTX1RVUExFU19PSyB8fAorIAkJIHJlcy0+cmVzdWx0U3RhdHVzID09IFBHUkVTX0VNUFRZ X1FVRVJZKSkKKyAJeworIAkJaW50IGk7CisgCQlQR0V2ZW50UmVzdWx0Q3JlYXRlIGluZm87 CisgCisgCQlpbmZvLmNvbm4gPSBjb25uOworIAkJaW5mby5yZXN1bHQgPSByZXM7CisgCisg CQlmb3IoaT0wOyBpIDwgcmVzLT5ldnRTdGF0ZUNvdW50OyBpKyspCisgCQl7CisgCQkJaW5m by5jb25uRGF0YSA9IGNvbm4tPmV2dFN0YXRlc1tpXS5kYXRhOworIAkJCWluZm8ucmVzdWx0 RGF0YSA9IE5VTEw7CisgCisgCQkJaWYoIXJlcy0+ZXZ0U3RhdGVzW2ldLnByb2MoUEdFVlRf UkVTVUxUQ1JFQVRFLAorIAkJCQkmaW5mbywgcmVzLT5ldnRTdGF0ZXNbaV0uYXJnKSkKKyAJ CQl7CisgCQkJCWNoYXIgbXNnWzI1Nl07CisgCQkJCXNwcmludGYobXNnLAorIAkJCQkJIlBH RXZlbnRQcm9jICVwIGZhaWxlZCBkdXJpbmcgUEdFVlRfUkVTVUxUQ1JFQVRFIGV2ZW50IiwK KyAJCQkJCXJlcy0+ZXZ0U3RhdGVzW2ldLnByb2MpOworIAkJCQlwcVNldFJlc3VsdEVycm9y KHJlcywgbXNnKTsKKyAJCQkJcmVzLT5yZXN1bHRTdGF0dXMgPSBQR1JFU19GQVRBTF9FUlJP UjsKKyAJCQkJYnJlYWs7CisgCQkJfQorIAorIAkJCXJlcy0+ZXZ0U3RhdGVzW2ldLmRhdGEg PSBpbmZvLnJlc3VsdERhdGE7CisgCQl9CisgCX0KKyAKICAJcmV0dXJuIHJlczsKICB9CiAg CiAgCiAgLyoKICAgKiBQUWV4ZWMKSW5kZXg6IGZlLW1pc2MuYwo9PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ClJD UyBmaWxlOiAvcHJvamVjdHMvY3Zzcm9vdC9wZ3NxbC9zcmMvaW50ZXJmYWNlcy9saWJwcS9m ZS1taXNjLmMsdgpyZXRyaWV2aW5nIHJldmlzaW9uIDEuMTMzCmRpZmYgLUM2IC1yMS4xMzMg ZmUtbWlzYy5jCioqKiBmZS1taXNjLmMJMSBKYW4gMjAwOCAxOTo0NjowMCAtMDAwMAkxLjEz MwotLS0gZmUtbWlzYy5jCTE3IE1heSAyMDA4IDEyOjA2OjEyIC0wMDAwCioqKioqKioqKioq KioqKgoqKiogMTE1MiwxMTU3ICoqKioKLS0tIDExNTIsMTMwMSAtLS0tCiAgCX0KICAKICAJ cmV0dXJuIGRnZXR0ZXh0KCJsaWJwcSIsIG1zZ2lkKTsKICB9CiAgCiAgI2VuZGlmICAgLyog RU5BQkxFX05MUyAqLworIAorIAorIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAqIEV2 ZW50cworICAqLworIAorIHN0YXRpYyBpbnQgZ19ldnRTdGF0ZUNvdW50ID0gMDsKKyBzdGF0 aWMgaW50IGdfZXZ0U3RhdGVTaXplID0gMDsKKyBzdGF0aWMgUEdFdmVudFN0YXRlICpnX2V2 dFN0YXRlcyA9IE5VTEw7CisgCisgaW50CisgUFFyZWdpc3RlckV2ZW50UHJvYyhQR2Nvbm4g KmNvbm4sIFBHRXZlbnRQcm9jIHByb2MsIHZvaWQgKmFyZykKKyB7CisgCWludCBpOworIAlp bnQgKmNvdW50OworIAlpbnQgKnNpemU7CisgCVBHRXZlbnRTdGF0ZSAqKnN0YXRlczsKKyAK KyAJaWYoIXByb2MpCisgCQlyZXR1cm4gRkFMU0U7CisgCisgCS8qIGdsb2JhbCByZWdpc3Rl ciAqLworIAlpZighY29ubikKKyAJeworIAkJY291bnQgPSAmZ19ldnRTdGF0ZUNvdW50Owor IAkJc2l6ZSA9ICZnX2V2dFN0YXRlU2l6ZTsKKyAJCXN0YXRlcyA9ICZnX2V2dFN0YXRlczsK KyAJfQorIAkvKiBwZXItY29ubiAqLworIAllbHNlCisgCXsKKyAJCWNvdW50ID0gJmNvbm4t PmV2dFN0YXRlQ291bnQ7CisgCQlzaXplID0gJmNvbm4tPmV2dFN0YXRlU2l6ZTsKKyAJCXN0 YXRlcyA9ICZjb25uLT5ldnRTdGF0ZXM7CisgCX0KKyAKKyAJZm9yKGk9MDsgaSA8ICpjb3Vu dDsgaSsrKQorIAkJaWYoKCpzdGF0ZXMpW2ldLnByb2MgPT0gcHJvYykKKyAJCQlyZXR1cm4g RkFMU0U7IC8qIGFscmVhZHkgcmVnaXN0ZXJlZCAqLworIAorIAlpZigqY291bnQgPj0gKnNp emUpCisgCXsKKyAJCVBHRXZlbnRTdGF0ZSAqZTsKKyAJCWludCBuZXdTaXplID0gKnNpemUg PyAoKnNpemUgKiAzKSAvIDIgOiA4OworIAorIAkJaWYoKnN0YXRlcykKKyAJCQllID0gKFBH RXZlbnRTdGF0ZSAqKXJlYWxsb2MoKnN0YXRlcywgbmV3U2l6ZSpzaXplb2YoUEdFdmVudFN0 YXRlKSk7CisgCQllbHNlCisgCQkJZSA9IChQR0V2ZW50U3RhdGUgKiltYWxsb2MobmV3U2l6 ZSpzaXplb2YoUEdFdmVudFN0YXRlKSk7CisgCisgCQlpZighZSkKKyAJCQlyZXR1cm4gRkFM U0U7CisgCisgCQkqc2l6ZSA9IG5ld1NpemU7CisgCQkqc3RhdGVzID0gZTsKKyAJfQorIAor IAkoKnN0YXRlcylbKmNvdW50XS5hcmcgID0gYXJnOworIAkoKnN0YXRlcylbKmNvdW50XS5k YXRhID0gTlVMTDsKKyAJKCpzdGF0ZXMpWypjb3VudF0ucHJvYyA9IHByb2M7CisgCisgCS8q IHBlci1jb25uIHJlZ2lzdGVyIHJlcXVpcmVzIHRyaWdnZXJpbmcgYW4gaW5pdHN0YXRlIGV2 ZW50ICovCisgCWlmKGNvbm4pCisgCXsKKyAJCVBHRXZlbnRJbml0U3RhdGUgaW5pdFN0YXRl OworIAkJaW5pdFN0YXRlLmRhdGEgPSBOVUxMOworIAkJaW5pdFN0YXRlLmNvbm4gPSBjb25u OworIAkJaWYoIXByb2MoUEdFVlRfSU5JVFNUQVRFLCAmaW5pdFN0YXRlLCBhcmcpKQorIAkJ CXJldHVybiBGQUxTRTsKKyAJCSgqc3RhdGVzKVsqY291bnRdLmRhdGEgPSBpbml0U3RhdGUu ZGF0YTsKKyAJfQorIAorIAkoKmNvdW50KSsrOworIAlyZXR1cm4gVFJVRTsKKyB9CisgCisg dm9pZCAqCisgUFFldmVudERhdGEoY29uc3QgUEdjb25uICpjb25uLCBQR0V2ZW50UHJvYyBw cm9jLCB2b2lkICoqYXJnKQorIHsKKyAJaW50IGk7CisgCisgCWlmKGFyZykKKyAJCSphcmcg PSBOVUxMOworIAorIAlpZighY29ubiB8fCAhcHJvYykKKyAJCXJldHVybiBOVUxMOworIAor IAlmb3IoaT0wOyBpIDwgY29ubi0+ZXZ0U3RhdGVDb3VudDsgaSsrKQorIAl7CisgCQlpZihj b25uLT5ldnRTdGF0ZXNbaV0ucHJvYyA9PSBwcm9jKQorIAkJeworIAkJCWlmKGFyZykKKyAJ CQkJKmFyZyA9IGNvbm4tPmV2dFN0YXRlc1tpXS5hcmc7CisgCQkJcmV0dXJuIGNvbm4tPmV2 dFN0YXRlc1tpXS5kYXRhOworIAkJfQorIAl9CisgCisgCXJldHVybiBOVUxMOworIH0KKyAK KyB2b2lkICoKKyBQUXJlc3VsdEV2ZW50RGF0YShjb25zdCBQR3Jlc3VsdCAqcmVzdWx0LCBQ R0V2ZW50UHJvYyBwcm9jLCB2b2lkICoqYXJnKQorIHsKKyAJaW50IGk7CisgCisgCWlmKGFy ZykKKyAJCSphcmcgPSBOVUxMOworIAorIAlpZighcmVzdWx0IHx8ICFwcm9jKQorIAkJcmV0 dXJuIE5VTEw7CisgCisgCWZvcihpPTA7IGkgPCByZXN1bHQtPmV2dFN0YXRlQ291bnQ7IGkr KykKKyAJeworIAkJaWYocmVzdWx0LT5ldnRTdGF0ZXNbaV0ucHJvYyA9PSBwcm9jKQorIAkJ eworIAkJCWlmKGFyZykKKyAJCQkJKmFyZyA9IHJlc3VsdC0+ZXZ0U3RhdGVzW2ldLmFyZzsK KyAJCQlyZXR1cm4gcmVzdWx0LT5ldnRTdGF0ZXNbaV0uZGF0YTsKKyAJCX0KKyAJfQorIAor IAlyZXR1cm4gTlVMTDsKKyB9CisgCisgLyogUmVnaXN0ZXJzIHRoZSBnbG9iYWwgZXZlbnRz IHByb2NzIGZvciBhIGNvbm4gb2JqZWN0LiAgSWYgdGhlIHByb2NzCisgICogd2VyZSBhbHJl YWR5IHJlZ2lzdGVyZWQsIHRoZSByZXF1ZXN0IGlzIGlnbm9yZWQgYW5kIGEgc3VjY2VzcyB2 YWx1ZQorICAqIGlzIHJldHVybmVkLiAgVGhpcyB3aWxsIGhhcHBlbiBkdXJpbmcgYSBQUXJl c2V0IGFuZCBQUXJlc2V0UG9sbC4KKyAgKiBSZXR1cm5zIG5vbi16ZXJvIGZvciBzdWNjZXNz IGFuZCB6ZXJvIG9uIGVycm9yLgorICAqLworIGludAorIHBxUmVnaXN0ZXJHbG9iYWxFdmVu dHMoUEdjb25uICpjb25uKQorIHsKKyAJaW50IGk7CisgCisgCS8qIEFscmVhZHkgcmVnaXN0 ZXJlZCwgb2NjdXJzIG9uIFBRcmVzZXQgYW5kIFBRcmVzZXRQb2xsICovCisgCWlmKGNvbm4t PmV2dFN0YXRlQ291bnQgPiAwKQorIAkJcmV0dXJuIFRSVUU7CisgCisgCWZvcihpPTA7IGkg PCBnX2V2dFN0YXRlQ291bnQ7IGkrKykKKyAJCWlmKCFQUXJlZ2lzdGVyRXZlbnRQcm9jKGNv bm4sIGdfZXZ0U3RhdGVzW2ldLnByb2MsIGdfZXZ0U3RhdGVzW2ldLmFyZykpCisgCQkJcmV0 dXJuIEZBTFNFOworIAorIAlyZXR1cm4gVFJVRTsKKyB9CkluZGV4OiBsaWJwcS1mZS5oCj09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT0KUkNTIGZpbGU6IC9wcm9qZWN0cy9jdnNyb290L3Bnc3FsL3NyYy9pbnRl cmZhY2VzL2xpYnBxL2xpYnBxLWZlLmgsdgpyZXRyaWV2aW5nIHJldmlzaW9uIDEuMTQyCmRp ZmYgLUM2IC1yMS4xNDIgbGlicHEtZmUuaAoqKiogbGlicHEtZmUuaAkxOSBNYXIgMjAwOCAw MDozOTozMyAtMDAwMAkxLjE0MgotLS0gbGlicHEtZmUuaAkxNyBNYXkgMjAwOCAxMjowNjox MiAtMDAwMAoqKioqKioqKioqKioqKioKKioqIDI1LDM2ICoqKioKLS0tIDI1LDQ1IC0tLS0K ICAvKgogICAqIHBvc3RncmVzX2V4dC5oIGRlZmluZXMgdGhlIGJhY2tlbmQncyBleHRlcm5h bGx5IHZpc2libGUgdHlwZXMsCiAgICogc3VjaCBhcyBPaWQuCiAgICovCiAgI2luY2x1ZGUg InBvc3RncmVzX2V4dC5oIgogIAorIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICog T3B0aW9ucyBmb3IgUFFjb3B5UmVzdWx0CisgICovCisgCisgI2RlZmluZSBQR19DT1BZUkVT X05PX1RVUExFUyAgICAgIDB4MDEKKyAjZGVmaW5lIFBHX0NPUFlSRVNfVVNFX0FUVFJTICAg ICAgMHgwMgorICNkZWZpbmUgUEdfQ09QWVJFU19OT19FVkVOVFBST0NTICAweDA0CisgI2Rl ZmluZSBQR19DT1BZUkVTX05PX05PVElDRUhPT0tTIDB4MDgKKyAKICAvKiBBcHBsaWNhdGlv bi12aXNpYmxlIGVudW0gdHlwZXMgKi8KICAKICB0eXBlZGVmIGVudW0KICB7CiAgCS8qCiAg CSAqIEFsdGhvdWdoIGl0IGlzIG9rYXkgdG8gYWRkIHRvIHRoaXMgbGlzdCwgdmFsdWVzIHdo aWNoIGJlY29tZSB1bnVzZWQKKioqKioqKioqKioqKioqCioqKiAxOTAsMjAxICoqKioKLS0t IDE5OSwyODMgLS0tLQogIAkJaW50CQkgICAqcHRyOwkJLyogY2FuJ3QgdXNlIHZvaWQgKGRl YyBjb21waWxlciBiYXJmcykJICovCiAgCQlpbnQJCQlpbnRlZ2VyOwogIAl9CQkJdTsKICB9 IFBRQXJnQmxvY2s7CiAgCiAgLyogLS0tLS0tLS0tLS0tLS0tLQorICAqIFBHcmVzQXR0RGVz YyAtLSBEYXRhIGFib3V0IGEgc2luZ2xlIGF0dHJpYnV0ZSAoY29sdW1uKSBvZiBhIHF1ZXJ5 IHJlc3VsdAorICAqIC0tLS0tLS0tLS0tLS0tLS0KKyAgKi8KKyB0eXBlZGVmIHN0cnVjdCBw Z3Jlc0F0dERlc2MKKyB7CisgCWNoYXIJICAgKm5hbWU7CQkJLyogY29sdW1uIG5hbWUgKi8K KyAJT2lkCQkJdGFibGVpZDsJCS8qIHNvdXJjZSB0YWJsZSwgaWYga25vd24gKi8KKyAJaW50 CQkJY29sdW1uaWQ7CQkvKiBzb3VyY2UgY29sdW1uLCBpZiBrbm93biAqLworIAlpbnQJCQlm b3JtYXQ7CQkJLyogZm9ybWF0IGNvZGUgZm9yIHZhbHVlICh0ZXh0L2JpbmFyeSkgKi8KKyAJ T2lkCQkJdHlwaWQ7CQkJLyogdHlwZSBpZCAqLworIAlpbnQJCQl0eXBsZW47CQkJLyogdHlw ZSBzaXplICovCisgCWludAkJCWF0dHR5cG1vZDsgIC8qIHR5cGUtc3BlY2lmaWMgbW9kaWZp ZXIgaW5mbyAqLworIH0gUEdyZXNBdHREZXNjOworIAorIC8qIC0tLS0tLS0tLS0tLS0tLS0K KyAgKiBFdmVudHMgLSBBbGxvd3MgcmVjZWl2aW5nIGV2ZW50cyBmcm9tIGxpYnBxLgorICAq IC0tLS0tLS0tLS0tLS0tLS0KKyAgKi8KKyAKKyAvKiBFdmVudCBJZHMgKi8KKyB0eXBlZGVm IGVudW0KKyB7CisgCVBHRVZUX0lOSVRTVEFURSwKKyAJUEdFVlRfQ09OTlJFU0VULAorIAlQ R0VWVF9DT05OREVTVFJPWSwKKyAJUEdFVlRfUkVTVUxUQ1JFQVRFLAorIAlQR0VWVF9SRVNV TFRDT1BZLAorIAlQR0VWVF9SRVNVTFRERVNUUk9ZCisgfSBQR0V2ZW50SWQ7CisgCisgdHlw ZWRlZiBzdHJ1Y3QKKyB7CisgCXZvaWQgKmRhdGE7IC8qIGNyZWF0ZS9hc3NpZ24gZHVyaW5n IHRoaXMgZXZlbnQgaWYgbmVlZGVkICovCisgCWNvbnN0IFBHY29ubiAqY29ubjsKKyB9IFBH RXZlbnRJbml0U3RhdGU7CisgCisgdHlwZWRlZiBzdHJ1Y3QKKyB7CisgCXZvaWQgKmRhdGE7 CisgCWNvbnN0IFBHY29ubiAqY29ubjsKKyB9IFBHRXZlbnRDb25uUmVzZXQ7CisgCisgdHlw ZWRlZiBzdHJ1Y3QKKyB7CisgCXZvaWQgKmRhdGE7CisgCWNvbnN0IFBHY29ubiAqY29ubjsK KyB9IFBHRXZlbnRDb25uRGVzdHJveTsKKyAKKyB0eXBlZGVmIHN0cnVjdAorIHsKKyAJdm9p ZCAqY29ubkRhdGE7IC8qIGNvbm4ncyBldmVudCBkYXRhICovCisgCWNvbnN0IFBHY29ubiAq Y29ubjsKKyAJdm9pZCAqcmVzdWx0RGF0YTsgLyogY3JlYXRlL2Fzc2lnbiBkdXJpbmcgdGhp cyBldmVudCBpZiBuZWVkZWQgKi8KKyAJY29uc3QgUEdyZXN1bHQgKnJlc3VsdDsKKyB9IFBH RXZlbnRSZXN1bHRDcmVhdGU7CisgCisgdHlwZWRlZiBzdHJ1Y3QKKyB7CisgCXZvaWQgKnNy Y0RhdGE7IC8qIHNyYyByZXN1bHQncyBldmVudCBkYXRhICovCisgCWNvbnN0IFBHcmVzdWx0 ICpzcmM7CisgCXZvaWQgKmRlc3REYXRhOyAvKiBjcmVhdGUvYXNzaWduIGR1cmluZyB0aGlz IGV2ZW50IGlmIG5lZWRlZCAqLworIAlQR3Jlc3VsdCAqZGVzdDsKKyB9IFBHRXZlbnRSZXN1 bHRDb3B5OworIAorIHR5cGVkZWYgc3RydWN0CisgeworIAl2b2lkICpkYXRhOworIAljb25z dCBQR3Jlc3VsdCAqcmVzdWx0OworIH0gUEdFdmVudFJlc3VsdERlc3Ryb3k7CisgCisgdHlw ZWRlZiBpbnQgKCpQR0V2ZW50UHJvYykoUEdFdmVudElkIGV2dElkLCB2b2lkICpldnRJbmZv LCB2b2lkICphcmcpOworIAorIC8qIC0tLS0tLS0tLS0tLS0tLS0KICAgKiBFeHBvcnRlZCBm dW5jdGlvbnMgb2YgbGlicHEKICAgKiAtLS0tLS0tLS0tLS0tLS0tCiAgICovCiAgCiAgLyog PT09CWluIGZlLWNvbm5lY3QuYyA9PT0gKi8KICAKKioqKioqKioqKioqKioqCioqKiA0MzQs NDQ1ICoqKioKLS0tIDUxNiw1NDYgLS0tLQogICAqIE1ha2UgYW4gZW1wdHkgUEdyZXN1bHQg d2l0aCBnaXZlbiBzdGF0dXMgKHNvbWUgYXBwcyBmaW5kIHRoaXMKICAgKiB1c2VmdWwpLiBJ ZiBjb25uIGlzIG5vdCBOVUxMIGFuZCBzdGF0dXMgaW5kaWNhdGVzIGFuIGVycm9yLCB0aGUK ICAgKiBjb25uJ3MgZXJyb3JNZXNzYWdlIGlzIGNvcGllZC4KICAgKi8KICBleHRlcm4gUEdy ZXN1bHQgKlBRbWFrZUVtcHR5UEdyZXN1bHQoUEdjb25uICpjb25uLCBFeGVjU3RhdHVzVHlw ZSBzdGF0dXMpOwogIAorIGV4dGVybiBQR3Jlc3VsdCAqCisgUFFjb3B5UmVzdWx0KGNvbnN0 IFBHcmVzdWx0ICpzcmMsIGludCBudW1BdHRyaWJ1dGVzLAorIAlQR3Jlc0F0dERlc2MgKmF0 dERlc2NzLCBpbnQgb3B0aW9ucyk7CisgCisgZXh0ZXJuIHZvaWQgKgorIFBRcmVzdWx0QWxs b2MoUEdyZXN1bHQgKnJlcywgc2l6ZV90IG5CeXRlcyk7CisgCisgLyoKKyAgKiBTZXRzIHRo ZSB2YWx1ZSBmb3IgYSB0dXBsZSBmaWVsZC4gIFRoZSB0dXBfbnVtIG11c3QgYmUgbGVzcyB0 aGFuIG9yCisgICogZXF1YWwgdG8gUFFudHVwbGVzKHJlcykuICBUaGlzIGZ1bmN0aW9uIHdp bGwgZ2VuZXJhdGUgdHVwbGVzIGFzIG5lZWRlZC4KKyAgKiBBIG5ldyB0dXBsZSBpcyBnZW5l cmF0ZWQgd2hlbiB0dXBfbnVtIGVxdWFscyBQUW50dXBsZXMocmVzKSBhbmQgdGhlcmUKKyAg KiBhcmUgbm8gZmllbGRzIGRlZmluZWQgZm9yIHRoYXQgdHVwbGUuCisgICoKKyAgKiBSZXR1 cm5zIGEgbm9uLXplcm8gdmFsdWUgZm9yIHN1Y2Nlc3MgYW5kIHplcm8gZm9yIGZhaWx1cmUu CisgICovCisgZXh0ZXJuIGludAorIFBRc2V0dmFsdWUoUEdyZXN1bHQgKnJlcywgaW50IHR1 cF9udW0sIGludCBmaWVsZF9udW0sCisgCWNoYXIgKnZhbHVlLCBpbnQgbGVuKTsKKyAKICAK ICAvKiBRdW90aW5nIHN0cmluZ3MgYmVmb3JlIGluY2x1c2lvbiBpbiBxdWVyaWVzLiAqLwog IGV4dGVybiBzaXplX3QgUFFlc2NhcGVTdHJpbmdDb25uKFBHY29ubiAqY29ubiwKICAJCQkJ ICAgY2hhciAqdG8sIGNvbnN0IGNoYXIgKmZyb20sIHNpemVfdCBsZW5ndGgsCiAgCQkJCSAg IGludCAqZXJyb3IpOwogIGV4dGVybiB1bnNpZ25lZCBjaGFyICpQUWVzY2FwZUJ5dGVhQ29u bihQR2Nvbm4gKmNvbm4sCioqKioqKioqKioqKioqKgoqKiogNTA2LDUxNyAqKioqCi0tLSA2 MDcsNjYxIC0tLS0KICAvKiBEZXRlcm1pbmUgZGlzcGxheSBsZW5ndGggb2YgbXVsdGlieXRl IGVuY29kZWQgY2hhciBhdCAqcyAqLwogIGV4dGVybiBpbnQJUFFkc3BsZW4oY29uc3QgY2hh ciAqcywgaW50IGVuY29kaW5nKTsKICAKICAvKiBHZXQgZW5jb2RpbmcgaWQgZnJvbSBlbnZp cm9ubWVudCB2YXJpYWJsZSBQR0NMSUVOVEVOQ09ESU5HICovCiAgZXh0ZXJuIGludAlQUWVu djJlbmNvZGluZyh2b2lkKTsKICAKKyAvKgorICAqIFJlZ2lzdGVycyBhbiBldmVudCBwcm9j IHdpdGggdGhlIGdpdmVuIFBHY29ubi4gIFRoZSBhcmcgcGFyYW1ldGVyCisgICogaXMgYW4g YXBwbGljYXRpb24gc3BlY2lmaWMgcG9pbnRlciBhbmQgY2FuIGJlIHNldCB0byBOVUxMIGlm IG5vdAorICAqIHJlcXVpcmVkLiAgVGhlIGFyZyBwYXJhbWV0ZXIgd2lsbCBiZSBwYXNzZWQg dG8gdGhlIGV2ZW50IHByb2MgYW5kCisgICogaXMgcHVibGljYWxseSByZXRyaWV2ZWFibGUg dmlhIFBRZXZlbnREYXRhIG9yIFBRcmVzdWx0RXZlbnREYXRhLgorICAqCisgICogVGhlIHBy b2MgcGFyYW1ldGVyIGNhbm5vdCBiZSBOVUxMLgorICAqCisgICogSWYgdGhlIGNvbm4gaXMg TlVMTCwgdGhpcyB3aWxsIHJlZ2lzdGVyIGEgZ2xvYmFsIGV2ZW50IHByb2MuCisgICogR2xv YmFsIGV2ZW50IHByb2NzIGFyZSBhdXRvbWF0aWNhbGx5IHJlZ2lzdGVyZWQgb24gZXZlcnkg UEdjb25uCisgICogY3JlYXRlZCwgcmVtb3ZpbmcgdGhlIG5lZWQgZm9yIHBlci1jb25uIHJl Z2lzdHJhdGlvbi4KKyAgKgorICAqIFdBUk5JTkc6IEdsb2JhbCByZWdpc3RyYXRpb25zIHNo b3VsZCBvbmx5IGJlIGNhbGxlZCBmcm9tIHRoZSBhcHBsaWNhdGlvbidzCisgICogbWFpbiB0 aHJlYWQsIHByaW9yIHRvIHVzaW5nIGFueSBsaWJwcSBmdW5jdGlvbnMgYW5kIGNyZWF0aW5n CisgICogYW55IGFwcGxpY2F0aW9uIHRocmVhZHMuICBHbG9iYWwgcmVnaXN0cmF0aW9uIHNo b3VsZCBiZSB0cmVhdGVkIGFzIGFuCisgICogaW5pdCBmdW5jdGlvbi4KKyAgKgorICAqIFRo ZSBmdW5jdGlvbiByZXR1cm5zIGEgbm9uLXplcm8gaWYgc3VjY2Vzc2Z1bC4gIElmIHRoZSBm dW5jdGlvbgorICAqIGZhaWxzLCB6ZXJvIGlzIHJldHVybmVkLgorICAqLworIGV4dGVybiBp bnQKKyBQUXJlZ2lzdGVyRXZlbnRQcm9jKFBHY29ubiAqY29ubiwgUEdFdmVudFByb2MgcHJv Yywgdm9pZCAqYXJnKTsKKyAKKyAvKgorICAqIEdldHMgdGhlIGV2ZW50IGRhdGEgY3JlYXRl ZCBieSB0aGUgcHJvdmlkZWQgZXZlbnQgcHJvYyBmb3IgdGhlIGdpdmVuCisgICogY29ubi4g IFRoZSBldmVudCBkYXRhIGlzIHJldHVybmVkLCB3aGljaCBtYXkgYmUgTlVMTCBpZiB0aGUg ZXZlbnQgcHJvYworICAqIGRvZXMgbm90IGNyZWF0ZSBhbnkgZXZlbnQgZGF0YS4gIFRoZSBh cmcgcGFyYW1ldGVyIGNhbiBiZSB1c2VkIHRvCisgICogZ2V0IHRoZSBhcHBsaWNhdGlvbiBz cGVjaWZpYyBwb2ludGVyIHByb3ZpZGVkIGR1cmluZyBldmVudCBwcm9jCisgICogcmVnaXN0 cmF0aW9uLiAgSWYgYXJnIGlzIG5vdCBuZWVkZWQsIGl0IGNhbiBiZSBzZXQgdG8gTlVMTC4K KyAgKi8KKyBleHRlcm4gdm9pZCAqCisgUFFldmVudERhdGEoY29uc3QgUEdjb25uICpjb25u LCBQR0V2ZW50UHJvYyBwcm9jLCB2b2lkICoqYXJnKTsKKyAKKyAvKgorICAqIEdldHMgdGhl IGV2ZW50IGRhdGEgY3JlYXRlZCBieSB0aGUgcHJvdmlkZWQgZXZlbnQgcHJvYyBmb3IgdGhl IGdpdmVuCisgICogcmVzdWx0LiAgVGhlIGV2ZW50IGRhdGEgaXMgcmV0dXJuZWQsIHdoaWNo IG1heSBiZSBOVUxMIGlmIHRoZSBldmVudCBwcm9jCisgICogZG9lcyBub3QgY3JlYXRlIGFu eSBldmVudCBkYXRhLiAgVGhlIGFyZyBwYXJhbWV0ZXIgY2FuIGJlIHVzZWQgdG8KKyAgKiBn ZXQgdGhlIGFwcGxpY2F0aW9uIHNwZWNpZmljIHBvaW50ZXIgcHJvdmlkZWQgZHVyaW5nIGV2 ZW50IHByb2MKKyAgKiByZWdpc3RyYXRpb24uICBJZiBhcmcgaXMgbm90IG5lZWRlZCwgaXQg Y2FuIGJlIHNldCB0byBOVUxMLgorICAqLworIGV4dGVybiB2b2lkICoKKyBQUXJlc3VsdEV2 ZW50RGF0YShjb25zdCBQR3Jlc3VsdCAqcmVzLCBQR0V2ZW50UHJvYyBwcm9jLCB2b2lkICoq YXJnKTsKKyAKICAvKiA9PT0gaW4gZmUtYXV0aC5jID09PSAqLwogIAogIGV4dGVybiBjaGFy ICpQUWVuY3J5cHRQYXNzd29yZChjb25zdCBjaGFyICpwYXNzd2QsIGNvbnN0IGNoYXIgKnVz ZXIpOwogIAogIC8qID09PSBpbiBlbmNuYW1lcy5jID09PSAqLwogIApJbmRleDogbGlicHEt aW50LmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PQpSQ1MgZmlsZTogL3Byb2plY3RzL2N2c3Jvb3QvcGdzcWwv c3JjL2ludGVyZmFjZXMvbGlicHEvbGlicHEtaW50LmgsdgpyZXRyaWV2aW5nIHJldmlzaW9u IDEuMTMwCmRpZmYgLUM2IC1yMS4xMzAgbGlicHEtaW50LmgKKioqIGxpYnBxLWludC5oCTE2 IE1heSAyMDA4IDE4OjMwOjUzIC0wMDAwCTEuMTMwCi0tLSBsaWJwcS1pbnQuaAkxNyBNYXkg MjAwOCAxMjowNjoxMiAtMDAwMAoqKioqKioqKioqKioqKioKKioqIDk3LDEyMSAqKioqCiAg dW5pb24gcGdyZXN1bHRfZGF0YQogIHsKICAJUEdyZXN1bHRfZGF0YSAqbmV4dDsJCS8qIGxp bmsgdG8gbmV4dCBibG9jaywgb3IgTlVMTCAqLwogIAljaGFyCQlzcGFjZVsxXTsJCS8qIGR1 bW15IGZvciBhY2Nlc3NpbmcgYmxvY2sgYXMgYnl0ZXMgKi8KICB9OwogIAotIC8qIERhdGEg YWJvdXQgYSBzaW5nbGUgYXR0cmlidXRlIChjb2x1bW4pIG9mIGEgcXVlcnkgcmVzdWx0ICov Ci0gCi0gdHlwZWRlZiBzdHJ1Y3QgcGdyZXNBdHREZXNjCi0gewotIAljaGFyCSAgICpuYW1l OwkJCS8qIGNvbHVtbiBuYW1lICovCi0gCU9pZAkJCXRhYmxlaWQ7CQkvKiBzb3VyY2UgdGFi bGUsIGlmIGtub3duICovCi0gCWludAkJCWNvbHVtbmlkOwkJLyogc291cmNlIGNvbHVtbiwg aWYga25vd24gKi8KLSAJaW50CQkJZm9ybWF0OwkJCS8qIGZvcm1hdCBjb2RlIGZvciB2YWx1 ZSAodGV4dC9iaW5hcnkpICovCi0gCU9pZAkJCXR5cGlkOwkJCS8qIHR5cGUgaWQgKi8KLSAJ aW50CQkJdHlwbGVuOwkJCS8qIHR5cGUgc2l6ZSAqLwotIAlpbnQJCQlhdHR0eXBtb2Q7CQkv KiB0eXBlLXNwZWNpZmljIG1vZGlmaWVyIGluZm8gKi8KLSB9IFBHcmVzQXR0RGVzYzsKLSAK ICAvKiBEYXRhIGFib3V0IGEgc2luZ2xlIHBhcmFtZXRlciBvZiBhIHByZXBhcmVkIHN0YXRl bWVudCAqLwogIHR5cGVkZWYgc3RydWN0IHBncmVzUGFyYW1EZXNjCiAgewogIAlPaWQJCQl0 eXBpZDsJCQkvKiB0eXBlIGlkICovCiAgfSBQR3Jlc1BhcmFtRGVzYzsKICAKLS0tIDk3LDEw OCAtLS0tCioqKioqKioqKioqKioqKgoqKiogMTU5LDE3MCAqKioqCi0tLSAxNDYsMTY2IC0t LS0KICAJUFFub3RpY2VSZWNlaXZlciBub3RpY2VSZWM7IC8qIG5vdGljZSBtZXNzYWdlIHJl Y2VpdmVyICovCiAgCXZvaWQJICAgKm5vdGljZVJlY0FyZzsKICAJUFFub3RpY2VQcm9jZXNz b3Igbm90aWNlUHJvYzsJCS8qIG5vdGljZSBtZXNzYWdlIHByb2Nlc3NvciAqLwogIAl2b2lk CSAgICpub3RpY2VQcm9jQXJnOwogIH0gUEdOb3RpY2VIb29rczsKICAKKyB0eXBlZGVmIHN0 cnVjdAorIHsKKyAJLyogcG9pbnRlciBzdXBwbGllZCBieSB1c2VyICovCisgCXZvaWQgKmFy ZzsKKyAJLyogc3RhdGUgZGF0YSwgb3B0aW9uYWxseSBnZW5lcmF0ZWQgYnkgZXZlbnQgcHJv YyAqLworIAl2b2lkICpkYXRhOworIAlQR0V2ZW50UHJvYyBwcm9jOworIH0gUEdFdmVudFN0 YXRlOworIAogIHN0cnVjdCBwZ19yZXN1bHQKICB7CiAgCWludAkJCW50dXBzOwogIAlpbnQJ CQludW1BdHRyaWJ1dGVzOwogIAlQR3Jlc0F0dERlc2MgKmF0dERlc2NzOwogIAlQR3Jlc0F0 dFZhbHVlICoqdHVwbGVzOwkJLyogZWFjaCBQR3Jlc1R1cGxlIGlzIGFuIGFycmF5IG9mCioq KioqKioqKioqKioqKgoqKiogMTgxLDE5MiAqKioqCi0tLSAxNzcsMTkyIC0tLS0KICAJICog VGhlc2UgZmllbGRzIGFyZSBjb3BpZWQgZnJvbSB0aGUgb3JpZ2luYXRpbmcgUEdjb25uLCBz byB0aGF0IG9wZXJhdGlvbnMKICAJICogb24gdGhlIFBHcmVzdWx0IGRvbid0IGhhdmUgdG8g cmVmZXJlbmNlIHRoZSBQR2Nvbm4uCiAgCSAqLwogIAlQR05vdGljZUhvb2tzIG5vdGljZUhv b2tzOwogIAlpbnQJCQljbGllbnRfZW5jb2Rpbmc7CS8qIGVuY29kaW5nIGlkICovCiAgCisg CS8qIEV2ZW50IHN0YXRlcyAqLworIAlpbnQgZXZ0U3RhdGVDb3VudDsKKyAJUEdFdmVudFN0 YXRlICpldnRTdGF0ZXM7CisgCiAgCS8qCiAgCSAqIEVycm9yIGluZm9ybWF0aW9uIChhbGwg TlVMTCBpZiBub3QgYW4gZXJyb3IgcmVzdWx0KS4gIGVyck1zZyBpcyB0aGUKICAJICogIm92 ZXJhbGwiIGVycm9yIG1lc3NhZ2UgcmV0dXJuZWQgYnkgUFFyZXN1bHRFcnJvck1lc3NhZ2Uu ICBJZiB3ZSBoYXZlCiAgCSAqIHBlci1maWVsZCBpbmZvIHRoZW4gaXQgaXMgc3RvcmVkIGlu IGEgbGlua2VkIGxpc3QuCiAgCSAqLwogIAljaGFyCSAgICplcnJNc2c7CQkJLyogZXJyb3Ig bWVzc2FnZSwgb3IgTlVMTCBpZiBubyBlcnJvciAqLwoqKioqKioqKioqKioqKioKKioqIDMw MCwzMTEgKioqKgotLS0gMzAwLDMxNiAtLS0tCiAgCS8qIE9wdGlvbmFsIGZpbGUgdG8gd3Jp dGUgdHJhY2UgaW5mbyB0byAqLwogIAlGSUxFCSAgICpQZmRlYnVnOwogIAogIAkvKiBDYWxs YmFjayBwcm9jZWR1cmVzIGZvciBub3RpY2UgbWVzc2FnZSBwcm9jZXNzaW5nICovCiAgCVBH Tm90aWNlSG9va3Mgbm90aWNlSG9va3M7CiAgCisgCS8qIEV2ZW50IHN0YXRlcyAqLworIAlp bnQgZXZ0U3RhdGVDb3VudDsKKyAJaW50IGV2dFN0YXRlU2l6ZTsKKyAJUEdFdmVudFN0YXRl ICpldnRTdGF0ZXM7CisgCiAgCS8qIFN0YXR1cyBpbmRpY2F0b3JzICovCiAgCUNvbm5TdGF0 dXNUeXBlIHN0YXR1czsKICAJUEdBc3luY1N0YXR1c1R5cGUgYXN5bmNTdGF0dXM7CiAgCVBH VHJhbnNhY3Rpb25TdGF0dXNUeXBlIHhhY3RTdGF0dXM7IC8qIG5ldmVyIGNoYW5nZXMgdG8g QUNUSVZFICovCiAgCVBHUXVlcnlDbGFzcyBxdWVyeWNsYXNzOwogIAljaGFyCSAgICpsYXN0 X3F1ZXJ5OwkJLyogbGFzdCBTUUwgY29tbWFuZCwgb3IgTlVMTCBpZiB1bmtub3duICovCioq KioqKioqKioqKioqKgoqKiogNTI3LDUzOCAqKioqCi0tLSA1MzIsNTQ0IC0tLS0KICBleHRl cm4gaW50CXBxRmx1c2goUEdjb25uICpjb25uKTsKICBleHRlcm4gaW50CXBxV2FpdChpbnQg Zm9yUmVhZCwgaW50IGZvcldyaXRlLCBQR2Nvbm4gKmNvbm4pOwogIGV4dGVybiBpbnQgcHFX YWl0VGltZWQoaW50IGZvclJlYWQsIGludCBmb3JXcml0ZSwgUEdjb25uICpjb25uLAogIAkJ CXRpbWVfdCBmaW5pc2hfdGltZSk7CiAgZXh0ZXJuIGludAlwcVJlYWRSZWFkeShQR2Nvbm4g KmNvbm4pOwogIGV4dGVybiBpbnQJcHFXcml0ZVJlYWR5KFBHY29ubiAqY29ubik7CisgZXh0 ZXJuIGludCBwcVJlZ2lzdGVyR2xvYmFsRXZlbnRzKFBHY29ubiAqY29ubik7CiAgCiAgLyog PT09IGluIGZlLXNlY3VyZS5jID09PSAqLwogIAogIGV4dGVybiBpbnQJcHFzZWN1cmVfaW5p dGlhbGl6ZShQR2Nvbm4gKik7CiAgZXh0ZXJuIHZvaWQgcHFzZWN1cmVfZGVzdHJveSh2b2lk KTsKICBleHRlcm4gUG9zdGdyZXNQb2xsaW5nU3RhdHVzVHlwZSBwcXNlY3VyZV9vcGVuX2Ns aWVudChQR2Nvbm4gKik7Cg== --------------070602030304010406090308--