From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: with ECARTIS (v1.0.0; list xfs); Sun, 27 May 2007 22:19:37 -0700 (PDT) Received: from larry.melbourne.sgi.com (larry.melbourne.sgi.com [134.14.52.130]) by oss.sgi.com (8.12.10/8.12.10/SuSE Linux 0.7) with SMTP id l4S5JQWt025246 for ; Sun, 27 May 2007 22:19:28 -0700 Date: Mon, 28 May 2007 15:22:52 +1000 Subject: [PATCH 1/3] XFS metadump utility From: "Barry Naujok" Content-Type: multipart/mixed; boundary=----------k9x39jGsayoNr3EUsJAZe6 MIME-Version: 1.0 Message-ID: Sender: xfs-bounce@oss.sgi.com Errors-to: xfs-bounce@oss.sgi.com List-Id: xfs To: "xfs@oss.sgi.com" , xfs-dev ------------k9x39jGsayoNr3EUsJAZe6 Content-Type: text/plain; format=flowed; delsp=yes; charset=iso-8859-15 Content-Transfer-Encoding: 7bit Back in February, I posted a patch to xfs_db to capture metadata from a filesystem into a file http://oss.sgi.com/archives/xfs/2007-02/msg00072.html . I have now updated it with the following changes: - obfuscates directory names and attribute names - zeros attribute values - better support of stdin/stdout for redirection. - separated the restore tool to it's own binary. This was required as making it part of xfs_db required an already valid filesystem to overwrite with the restore operation. It's also a very small compact piece of code. - now has man pages. Part 1 contains the changes for metadump. Part 2 contains the changes for the restore. Part 3 contains the man pages. ------------k9x39jGsayoNr3EUsJAZe6 Content-Disposition: attachment; filename=xfs_metadump.patch Content-Type: application/octet-stream; name=xfs_metadump.patch Content-Transfer-Encoding: Base64 Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQp4ZnNwcm9ncy9kYi9N YWtlZmlsZQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCi0tLSBh L3hmc3Byb2dzL2RiL01ha2VmaWxlCTIwMDctMDUtMjggMTU6MDk6NTkuMDAw MDAwMDAwICsxMDAwCisrKyBiL3hmc3Byb2dzL2RiL01ha2VmaWxlCTIwMDct MDUtMTcgMTQ6NDE6MTguNzgwNzU2NzI5ICsxMDAwCkBAIC0xMSwxMSArMTEs MTEgQEAgSEZJTEVTID0gYWRkci5oIGFnZi5oIGFnZmwuaCBhZ2kuaCBhdHRy LgogCWJtYXBidC5oIGJtcm9vdC5oIGJub2J0LmggY2hlY2suaCBjbnRidC5o IGNvbW1hbmQuaCBjb252ZXJ0LmggXAogCWRicmVhZC5oIGRlYnVnLmggZGly LmggZGlyMi5oIGRpcjJzZi5oIGRpcnNob3J0LmggZHF1b3QuaCBlY2hvLmgg XAogCWZhZGRyLmggZmllbGQuaCBmbGlzdC5oIGZwcmludC5oIGZyYWcuaCBm cmVlc3AuaCBoYXNoLmggaGVscC5oIFwKLQlpbml0LmggaW5vYnQuaCBpbm9k ZS5oIGlucHV0LmggaW8uaCBtYWxsb2MuaCBvdXRwdXQuaCBcCisJaW5pdC5o IGlub2J0LmggaW5vZGUuaCBpbnB1dC5oIGlvLmggbWFsbG9jLmggbWV0YWR1 bXAuaCBvdXRwdXQuaCBcCiAJcHJpbnQuaCBxdWl0Lmggc2IuaCBzaWcuaCBz dHJ2ZWMuaCB0ZXh0LmggdHlwZS5oIHdyaXRlLmggXAogCWF0dHJzZXQuaAog Q0ZJTEVTID0gJChIRklMRVM6Lmg9LmMpCi1MU1JDRklMRVMgPSB4ZnNfYWRt aW4uc2ggeGZzX2NoZWNrLnNoIHhmc19uY2hlY2suc2gKK0xTUkNGSUxFUyA9 IHhmc19hZG1pbi5zaCB4ZnNfY2hlY2suc2ggeGZzX25jaGVjay5zaCB4ZnNf bWV0YWR1bXAuc2gKIExMRExJQlMJPSAkKExJQlhGUykgJChMSUJYTE9HKSAk KExJQlVVSUQpICQoTElCUlQpCiBMVERFUEVOREVOQ0lFUyA9ICQoTElCWEZT KSAkKExJQlhMT0cpCiBMTERGTEFHUyArPSAtc3RhdGljCkBAIC00MCw0ICs0 MCw1IEBAIGluc3RhbGw6IGRlZmF1bHQKIAkkKElOU1RBTEwpIC1tIDc1NSB4 ZnNfYWRtaW4uc2ggJChQS0dfQklOX0RJUikveGZzX2FkbWluCiAJJChJTlNU QUxMKSAtbSA3NTUgeGZzX2NoZWNrLnNoICQoUEtHX0JJTl9ESVIpL3hmc19j aGVjawogCSQoSU5TVEFMTCkgLW0gNzU1IHhmc19uY2hlY2suc2ggJChQS0df QklOX0RJUikveGZzX25jaGVjaworCSQoSU5TVEFMTCkgLW0gNzU1IHhmc19t ZXRhZHVtcC5zaCAkKFBLR19CSU5fRElSKS94ZnNfbWV0YWR1bXAKIGluc3Rh bGwtZGV2OgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cnhmc3By b2dzL2RiL2NvbW1hbmQuYwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT0KCi0tLSBhL3hmc3Byb2dzL2RiL2NvbW1hbmQuYwkyMDA3LTA1LTI4IDE1 OjA5OjU5LjAwMDAwMDAwMCArMTAwMAorKysgYi94ZnNwcm9ncy9kYi9jb21t YW5kLmMJMjAwNy0wNS0xOCAxMjozMDozMS44NzY0NTc1OTkgKzEwMDAKQEAg LTQwLDYgKzQwLDcgQEAKICNpbmNsdWRlICJpbm9kZS5oIgogI2luY2x1ZGUg ImlucHV0LmgiCiAjaW5jbHVkZSAiaW8uaCIKKyNpbmNsdWRlICJtZXRhZHVt cC5oIgogI2luY2x1ZGUgIm91dHB1dC5oIgogI2luY2x1ZGUgInByaW50Lmgi CiAjaW5jbHVkZSAicXVpdC5oIgpAQCAtMTMxLDYgKzEzMiw3IEBAIGluaXRf Y29tbWFuZHModm9pZCkKIAlpbm9kZV9pbml0KCk7CiAJaW5wdXRfaW5pdCgp OwogCWlvX2luaXQoKTsKKwltZXRhZHVtcF9pbml0KCk7CiAJb3V0cHV0X2lu aXQoKTsKIAlwcmludF9pbml0KCk7CiAJcXVpdF9pbml0KCk7Cgo9PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT0KeGZzcHJvZ3MvZGIvaW5pdC5jCj09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKLS0tIGEveGZzcHJvZ3Mv ZGIvaW5pdC5jCTIwMDctMDUtMjggMTU6MDk6NTkuMDAwMDAwMDAwICsxMDAw CisrKyBiL3hmc3Byb2dzL2RiL2luaXQuYwkyMDA3LTA1LTE3IDE0OjQxOjE5 LjA2NDcxOTMxNyArMTAwMApAQCAtMTA3LDggKzEwNyw4IEBAIGluaXQoCiAJ fQogCiAJaWYgKHJlYWRfYmJzKFhGU19TQl9EQUREUiwgMSwgJmJ1ZnAsIE5V TEwpKSB7Ci0JCWRicHJpbnRmKF8oIiVzOiAlcyBpcyBpbnZhbGlkIChjYW5u b3QgcmVhZCBmaXJzdCA1MTIgYnl0ZXMpXG4iKSwKLQkJCXByb2duYW1lLCBm c2RldmljZSk7CisJCWZwcmludGYoc3RkZXJyLCBfKCIlczogJXMgaXMgaW52 YWxpZCAoY2Fubm90IHJlYWQgZmlyc3QgNTEyICIKKwkJCSJieXRlcylcbiIp LCBwcm9nbmFtZSwgZnNkZXZpY2UpOwogCQlleGl0KDEpOwogCX0KIApAQCAt MTE4LDcgKzExOCw3IEBAIGluaXQoCiAKIAlzYnAgPSAmeG1vdW50Lm1fc2I7 CiAJaWYgKHNicC0+c2JfbWFnaWNudW0gIT0gWEZTX1NCX01BR0lDKSB7Ci0J CWRicHJpbnRmKF8oIiVzOiB1bmV4cGVjdGVkIFhGUyBTQiBtYWdpYyBudW1i ZXIgMHglMDh4XG4iKSwKKwkJZnByaW50ZihzdGRlcnIsIF8oIiVzOiB1bmV4 cGVjdGVkIFhGUyBTQiBtYWdpYyBudW1iZXIgMHglMDh4XG4iKSwKIAkJCXBy b2duYW1lLCBzYnAtPnNiX21hZ2ljbnVtKTsKIAl9CiAKQEAgLTEyOCw4ICsx MjgsOCBAQCBpbml0KAogCQltcCA9IGxpYnhmc19tb3VudCgmeG1vdW50LCBz YnAsIHguZGRldiwgeC5sb2dkZXYsIHgucnRkZXYsCiAJCQkJTElCWEZTX01P VU5UX0RFQlVHR0VSKTsKIAkJaWYgKCFtcCkgewotCQkJZGJwcmludGYoXygi JXM6IGRldmljZSAlcyB1bnVzYWJsZSAobm90IGFuIFhGUyBmaWxlc3lzdGVt PylcbiIpLAotCQkJcHJvZ25hbWUsIGZzZGV2aWNlKTsKKwkJCWZwcmludGYo c3RkZXJyLCBfKCIlczogZGV2aWNlICVzIHVudXNhYmxlIChub3QgYW4gWEZT ICIKKwkJCQkiZmlsZXN5c3RlbT8pXG4iKSwgcHJvZ25hbWUsIGZzZGV2aWNl KTsKIAkJCWV4aXQoMSk7CiAJCX0KIAl9Cgo9PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT0KeGZzcHJvZ3MvZGIvbWV0YWR1bXAuYwo9PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT0KCi0tLSBhL3hmc3Byb2dzL2RiL21ldGFk dW1wLmMJMjAwNi0wNi0xNyAwMDo1ODoyNC4wMDAwMDAwMDAgKzEwMDAKKysr IGIveGZzcHJvZ3MvZGIvbWV0YWR1bXAuYwkyMDA3LTA1LTI1IDE2OjE2OjA0 Ljc4MzIxOTgyOSArMTAwMApAQCAtMCwwICsxLDE1NTQgQEAKKy8qCisgKiBD b3B5cmlnaHQgKGMpIDIwMDcgU2lsaWNvbiBHcmFwaGljcywgSW5jLgorICog QWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMg ZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29y CisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2Vu ZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBG cmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFt IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUg dXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0 IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJ TElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNl ZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3Jl IGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEg Y29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFs b25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVl IFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCAgNTEgRnJhbmtsaW4g U3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EK KyAqLworCisjaW5jbHVkZSA8bGlieGZzLmg+CisjaW5jbHVkZSAiYm1hcC5o IgorI2luY2x1ZGUgImNvbW1hbmQuaCIKKyNpbmNsdWRlICJtZXRhZHVtcC5o IgorI2luY2x1ZGUgImlvLmgiCisjaW5jbHVkZSAib3V0cHV0LmgiCisjaW5j bHVkZSAidHlwZS5oIgorI2luY2x1ZGUgImluaXQuaCIKKyNpbmNsdWRlICJz aWcuaCIKKyNpbmNsdWRlICJ4ZnNfbWV0YWR1bXAuaCIKKworLyogY29weSBh bGwgbWV0YWRhdGEgc3RydWN0dXJlcyB0by9mcm9tIGEgZmlsZSAqLworCitz dGF0aWMgaW50CW1ldGFkdW1wX2YoaW50IGFyZ2MsIGNoYXIgKiphcmd2KTsK K3N0YXRpYyB2b2lkCW1ldGFkdW1wX2hlbHAodm9pZCk7CisKKy8qCisgKiBt ZXRhZHVtcCBjb21tYW5kcyBpc3N1ZSBpbmZvL3dvcm5pbmdzL2Vycm9ycyB0 byBzdGFuZGFyZCBlcnJvciBhcworICogbWV0YWR1bXAgc3VwcG9ydHMgc3Rk b3V0IGFzIGEgZGVzdGluYXRpb24uCisgKgorICogQWxsIHN0YXRpYyBmdW5j dGlvbnMgcmV0dXJuIHplcm8gb24gZmFpbHVyZSwgd2hpbGUgdGhlIHB1Ymxp YyBmdW5jdGlvbnMKKyAqIHJldHVybiB6ZXJvIG9uIHN1Y2Nlc3MuCisgKi8K Kworc3RhdGljIGNvbnN0IGNtZGluZm9fdAltZXRhZHVtcF9jbWQgPQorCXsg Im1ldGFkdW1wIiwgTlVMTCwgbWV0YWR1bXBfZiwgMCwgLTEsIDAsCisJCSJb LWVdIFstZ10gWy13XSBbLW9dIGZpbGVuYW1lIiwKKwkJImR1bXAgbWV0YWRh dGEgdG8gYSBmaWxlIiwgbWV0YWR1bXBfaGVscCB9OworCitzdGF0aWMgRklM RQkJKm91dGY7CQkvKiBtZXRhZHVtcCBmaWxlICovCisKK3N0YXRpYyB4ZnNf bWV0YWJsb2NrX3QgCSptZXRhYmxvY2s7CS8qIGhlYWRlciArIGluZGV4ICsg YnVmZmVycyAqLworc3RhdGljIF9fYmU2NAkJKmJsb2NrX2luZGV4Oworc3Rh dGljIGNoYXIJCSpibG9ja19idWZmZXI7CisKK3N0YXRpYyBpbnQJCW51bV9p bmRpY2llczsKK3N0YXRpYyBpbnQJCWN1cl9pbmRleDsKKworc3RhdGljIHhm c19pbm9fdAljdXJfaW5vOworCitzdGF0aWMgaW50CQlzaG93X3Byb2dyZXNz ID0gMDsKK3N0YXRpYyBpbnQJCXN0b3Bfb25fcmVhZF9lcnJvciA9IDA7Citz dGF0aWMgaW50CQlkb250X29iZnVzY2F0ZSA9IDA7CitzdGF0aWMgaW50CQlz aG93X3dhcm5pbmdzID0gMDsKK3N0YXRpYyBpbnQJCXByb2dyZXNzX3NpbmNl X3dhcm5pbmcgPSAwOworCit2b2lkCittZXRhZHVtcF9pbml0KHZvaWQpCit7 CisJYWRkX2NvbW1hbmQoJm1ldGFkdW1wX2NtZCk7Cit9CisKK3N0YXRpYyB2 b2lkCittZXRhZHVtcF9oZWxwKHZvaWQpCit7CisJZGJwcmludGYoCisiXG4i CisiIFRoZSAnbWV0YWR1bXAnIGNvbW1hbmQgZHVtcHMgdGhlIGtub3duIG1l dGFkYXRhIHRvIGEgY29tcGFjdCBmaWxlIHN1aXRhYmxlXG4iCisiIGZvciBj b21wcmVzc2luZyBhbmQgc2VuZGluZyB0byBhbiBYRlMgbWFpbnRhaW5lciBm b3IgY29ycnVwdGlvbiBhbmFseXNpcyBcbiIKKyIgb3IgeGZzX3JlcGFpciBm YWlsdXJlcy5cblxuIgorIiBUaGVyZSBhcmUgMyBvcHRpb25zOlxuIgorIiAg IC1lIC0tIElnbm9yZSByZWFkIGVycm9ycyBhbmQga2VlcCBnb2luZ1xuIgor IiAgIC1nIC0tIERpc3BsYXkgZHVtcCBwcm9ncmVzc1xuIgorIiAgIC1vIC0t IERvbid0IG9iZnVzY2F0ZSBuYW1lcyBhbmQgZXh0ZW5kZWQgYXR0cmlidXRl c1xuIgorIiAgIC13IC0tIFNob3cgd2FybmluZ3Mgb2YgYmFkIG1ldGFkYXRh IGluZm9ybWF0aW9uXG4iCisiXG4iKTsKK30KKworc3RhdGljIHZvaWQKK3By aW50X3dhcm5pbmcoY29uc3QgY2hhciAqZm10LCAuLi4pCit7CisJY2hhcgkJ YnVmWzIwMF07CisJdmFfbGlzdAkJYXA7CisKKwlpZiAoc2VlbmludCgpKQor CQlyZXR1cm47CisKKwl2YV9zdGFydChhcCwgZm10KTsKKwl2c25wcmludGYo YnVmLCBzaXplb2YoYnVmKSwgZm10LCBhcCk7CisJdmFfZW5kKGFwKTsKKwli dWZbc2l6ZW9mKGJ1ZiktMV0gPSAnXDAnOworCisJZnByaW50ZihzdGRlcnIs ICIlcyVzOiAlc1xuIiwgcHJvZ3Jlc3Nfc2luY2Vfd2FybmluZyA/ICJcbiIg OiAiIiwKKwkJCXByb2duYW1lLCBidWYpOworCXByb2dyZXNzX3NpbmNlX3dh cm5pbmcgPSAwOworfQorCitzdGF0aWMgdm9pZAorcHJpbnRfcHJvZ3Jlc3Mo Y29uc3QgY2hhciAqZm10LCAuLi4pCit7CisJY2hhcgkJYnVmWzYwXTsKKwl2 YV9saXN0CQlhcDsKKwlGSUxFCQkqZjsKKworCWlmIChzZWVuaW50KCkpCisJ CXJldHVybjsKKworCXZhX3N0YXJ0KGFwLCBmbXQpOworCXZzbnByaW50Zihi dWYsIHNpemVvZihidWYpLCBmbXQsIGFwKTsKKwl2YV9lbmQoYXApOworCWJ1 ZltzaXplb2YoYnVmKS0xXSA9ICdcMCc7CisKKwlmID0gKG91dGYgPT0gc3Rk b3V0KSA/IHN0ZGVyciA6IHN0ZG91dDsKKwlmcHJpbnRmKGYsICJcciUtNTlz IiwgYnVmKTsKKwlmZmx1c2goZik7CisJcHJvZ3Jlc3Nfc2luY2Vfd2Fybmlu ZyA9IDE7Cit9CisKKy8qCisgKiBBIGNvbXBsZXRlIGR1bXAgZmlsZSB3aWxs IGhhdmUgYSAiemVybyIgZW50cnkgaW4gdGhlIGxhc3QgaW5kZXggYmxvY2ss CisgKiBldmVuIGlmIHRoZSBkdW1wIGlzIGV4YWN0bHkgYWxpZ25lZCwgdGhl IGxhc3QgaW5kZXggd2lsbCBiZSBmdWxsIG9mCisgKiB6ZXJvcy4gSWYgdGhl IGxhc3QgaW5kZXggZW50cnkgaXMgbm9uLXplcm8sIHRoZSBkdW1wIGlzIGlu Y29tcGxldGUuCisgKiBDb3JyZXNwb25kaW5nbHksIHRoZSBsYXN0IGNodW5r IHdpbGwgaGF2ZSBhIGNvdW50IDwgbnVtX2luZGljaWVzLgorICovCisKK3N0 YXRpYyBpbnQKK3dyaXRlX2luZGV4KHZvaWQpCit7CisJLyoKKwkgKiB3cml0 ZSBpbmRleCBibG9jayBhbmQgZm9sbG93aW5nIGRhdGEgYmxvY2tzIChzdHJl YW1pbmcpCisJICovCisJbWV0YWJsb2NrLT5tYl9jb3VudCA9IGNwdV90b19i ZTE2KGN1cl9pbmRleCk7CisJaWYgKGZ3cml0ZShtZXRhYmxvY2ssIChjdXJf aW5kZXggKyAxKSA8PCBCQlNISUZULCAxLCBvdXRmKSAhPSAxKSB7CisJCXBy aW50X3dhcm5pbmcoImVycm9yIHdyaXRpbmcgdG8gZmlsZTogJXMiLCBzdHJl cnJvcihlcnJubykpOworCQlyZXR1cm4gMDsKKwl9CisKKwltZW1zZXQoYmxv Y2tfaW5kZXgsIDAsIG51bV9pbmRpY2llcyAqIHNpemVvZihfX2JlNjQpKTsK KwljdXJfaW5kZXggPSAwOworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50 Cit3cml0ZV9idWYoCisJaW9jdXJfdAkJKmJ1ZikKK3sKKwljaGFyCQkqZGF0 YTsKKwlfX2ludDY0X3QJb2ZmOworCWludAkJaTsKKworCWZvciAoaSA9IDAs IG9mZiA9IGJ1Zi0+YmIsIGRhdGEgPSBidWYtPmRhdGE7CisJCQlpIDwgYnVm LT5ibGVuOworCQkJaSsrLCBvZmYrKywgZGF0YSArPSBCQlNJWkUpIHsKKwkJ YmxvY2tfaW5kZXhbY3VyX2luZGV4XSA9IGNwdV90b19iZTY0KG9mZik7CisJ CW1lbWNweSgmYmxvY2tfYnVmZmVyW2N1cl9pbmRleCA8PCBCQlNISUZUXSwg ZGF0YSwgQkJTSVpFKTsKKwkJaWYgKCsrY3VyX2luZGV4ID09IG51bV9pbmRp Y2llcykgeworCQkJaWYgKCF3cml0ZV9pbmRleCgpKQorCQkJCXJldHVybiAw OworCQl9CisJfQorCXJldHVybiAhc2VlbmludCgpOworfQorCisKK3N0YXRp YyBpbnQKK3NjYW5fYnRyZWUoCisJeGZzX2FnbnVtYmVyX3QJYWdubywKKwl4 ZnNfYWdibG9ja190CWFnYm5vLAorCWludAkJbGV2ZWwsCisJdHlwbm1fdAkJ YnR5cGUsCisJdm9pZAkJKmFyZywKKwlpbnQJCSgqZnVuYykoeGZzX2J0cmVl X2hkcl90CQkqYnRoZHIsCisJCQkJeGZzX2FnbnVtYmVyX3QJCWFnbm8sCisJ CQkJeGZzX2FnYmxvY2tfdAkJYWdibm8sCisJCQkJaW50CQkJbGV2ZWwsCisJ CQkJdHlwbm1fdAkJCWJ0eXBlLAorCQkJCXZvaWQJCQkqYXJnKSkKK3sKKwlw dXNoX2N1cigpOworCXNldF9jdXIoJnR5cHRhYltidHlwZV0sIFhGU19BR0Jf VE9fREFERFIobXAsIGFnbm8sIGFnYm5vKSwgYmxrYmIsCisJCQlEQl9SSU5H X0lHTiwgTlVMTCk7CisJaWYgKGlvY3VyX3RvcC0+ZGF0YSA9PSBOVUxMKSB7 CisJCXByaW50X3dhcm5pbmcoImNhbm5vdCByZWFkICVzIGJsb2NrICV1LyV1 IiwgdHlwdGFiW2J0eXBlXS5uYW1lLAorCQkJCWFnbm8sIGFnYm5vKTsKKwkJ cmV0dXJuICFzdG9wX29uX3JlYWRfZXJyb3I7CisJfQorCWlmICghd3JpdGVf YnVmKGlvY3VyX3RvcCkpCisJCXJldHVybiAwOworCisJaWYgKCEoKmZ1bmMp KGlvY3VyX3RvcC0+ZGF0YSwgYWdubywgYWdibm8sIGxldmVsIC0gMSwgYnR5 cGUsIGFyZykpCisJCXJldHVybiAwOworCisJcG9wX2N1cigpOworCXJldHVy biAxOworfQorCisvKiBmcmVlIHNwYWNlIHRyZWUgY29weSByb3V0aW5lcyAq LworCitzdGF0aWMgaW50Cit2YWxpZF9ibm8oCisJeGZzX2FnYmxvY2tfdAkJ Ym5vLAorCXhmc19hZ251bWJlcl90CQlhZ25vLAorCXhmc19hZ2Jsb2NrX3QJ CWFnYm5vLAorCXR5cG5tX3QJCQlidHlwZSkKK3sKKwlpZiAoYm5vID4gMCAm JiBibm8gPD0gbXAtPm1fc2Iuc2JfYWdibG9ja3MpCisJCXJldHVybiAxOwor CisJaWYgKHNob3dfd2FybmluZ3MpCisJCXByaW50X3dhcm5pbmcoImludmFs aWQgYmxvY2sgbnVtYmVyICgldSkgaW4gJXMgYmxvY2sgJXUvJXUiLAorCQkJ CWJubywgdHlwdGFiW2J0eXBlXS5uYW1lLCBhZ25vLCBhZ2Jubyk7CisJcmV0 dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK3NjYW5mdW5jX2ZyZWVzcCgKKwl4 ZnNfYnRyZWVfaGRyX3QJCSpidGhkciwKKwl4ZnNfYWdudW1iZXJfdAkJYWdu bywKKwl4ZnNfYWdibG9ja190CQlhZ2JubywKKwlpbnQJCQlsZXZlbCwKKwl0 eXBubV90CQkJYnR5cGUsCisJdm9pZAkJCSphcmcpCit7CisJeGZzX2FsbG9j X3B0cl90CQkqcHA7CisJaW50CQkJaTsKKwlpbnQJCQlucmVjczsKKworCWlm IChsZXZlbCA9PSAwKQorCQlyZXR1cm4gMTsKKworCW5yZWNzID0gYmUxNl90 b19jcHUoYnRoZHItPmJiX251bXJlY3MpOworCWlmIChucmVjcyA+IG1wLT5t X2FsbG9jX214clsxXSkgeworCQlpZiAoc2hvd193YXJuaW5ncykKKwkJCXBy aW50X3dhcm5pbmcoImludmFsaWQgbnJlY3MgKCV1KSBpbiAlcyBibG9jayAl dS8ldSIsCisJCQkJCW5yZWNzLCB0eXB0YWJbYnR5cGVdLm5hbWUsIGFnbm8s IGFnYm5vKTsKKwkJcmV0dXJuIDE7CisJfQorCisJcHAgPSBYRlNfQlRSRUVf UFRSX0FERFIobXAtPm1fc2Iuc2JfYmxvY2tzaXplLCB4ZnNfYWxsb2MsIGJ0 aGRyLCAxLAorCQkJbXAtPm1fYWxsb2NfbXhyWzFdKTsKKwlmb3IgKGkgPSAw OyBpIDwgbnJlY3M7IGkrKykgeworCQlpZiAoIXZhbGlkX2JubyhiZTMyX3Rv X2NwdShwcFtpXSksIGFnbm8sIGFnYm5vLCBidHlwZSkpCisJCQljb250aW51 ZTsKKwkJaWYgKCFzY2FuX2J0cmVlKGFnbm8sIGJlMzJfdG9fY3B1KHBwW2ld KSwgbGV2ZWwsIGJ0eXBlLCBhcmcsCisJCQkJc2NhbmZ1bmNfZnJlZXNwKSkK KwkJCXJldHVybiAwOworCX0KKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGlu dAorY29weV9mcmVlX2Jub19idHJlZSgKKwl4ZnNfYWdudW1iZXJfdAlhZ25v LAorCXhmc19hZ2ZfdAkqYWdmKQoreworCXhmc19hZ2Jsb2NrX3QJcm9vdDsK KwlpbnQJCWxldmVsczsKKworCXJvb3QgPSBiZTMyX3RvX2NwdShhZ2YtPmFn Zl9yb290c1tYRlNfQlROVU1fQk5PXSk7CisJbGV2ZWxzID0gYmUzMl90b19j cHUoYWdmLT5hZ2ZfbGV2ZWxzW1hGU19CVE5VTV9CTk9dKTsKKworCS8qIHZh bGlkYXRlIHJvb3QgYW5kIGxldmVscyBiZWZvcmUgcHJvY2Vzc2luZyB0aGUg dHJlZSAqLworCWlmIChyb290ID09IDAgfHwgcm9vdCA+IG1wLT5tX3NiLnNi X2FnYmxvY2tzKSB7CisJCWlmIChzaG93X3dhcm5pbmdzKQorCQkJcHJpbnRf d2FybmluZygiaW52YWxpZCBibG9jayBudW1iZXIgKCV1KSBpbiBibm9idCAi CisJCQkJCSJyb290IGluIGFnZiAldSIsIHJvb3QsIGFnbm8pOworCQlyZXR1 cm4gMTsKKwl9CisJaWYgKGxldmVscyA+PSBYRlNfQlRSRUVfTUFYTEVWRUxT KSB7CisJCWlmIChzaG93X3dhcm5pbmdzKQorCQkJcHJpbnRfd2FybmluZygi aW52YWxpZCBsZXZlbCAoJXUpIGluIGJub2J0IHJvb3QgIgorCQkJCQkiaW4g YWdmICV1IiwgbGV2ZWxzLCBhZ25vKTsKKwkJcmV0dXJuIDE7CisJfQorCisJ cmV0dXJuIHNjYW5fYnRyZWUoYWdubywgcm9vdCwgbGV2ZWxzLCBUWVBfQk5P QlQsIGFnZiwgc2NhbmZ1bmNfZnJlZXNwKTsKK30KKworc3RhdGljIGludAor Y29weV9mcmVlX2NudF9idHJlZSgKKwl4ZnNfYWdudW1iZXJfdAlhZ25vLAor CXhmc19hZ2ZfdAkqYWdmKQoreworCXhmc19hZ2Jsb2NrX3QJcm9vdDsKKwlp bnQJCWxldmVsczsKKworCXJvb3QgPSBiZTMyX3RvX2NwdShhZ2YtPmFnZl9y b290c1tYRlNfQlROVU1fQ05UXSk7CisJbGV2ZWxzID0gYmUzMl90b19jcHUo YWdmLT5hZ2ZfbGV2ZWxzW1hGU19CVE5VTV9DTlRdKTsKKworCS8qIHZhbGlk YXRlIHJvb3QgYW5kIGxldmVscyBiZWZvcmUgcHJvY2Vzc2luZyB0aGUgdHJl ZSAqLworCWlmIChyb290ID09IDAgfHwgcm9vdCA+IG1wLT5tX3NiLnNiX2Fn YmxvY2tzKSB7CisJCWlmIChzaG93X3dhcm5pbmdzKQorCQkJcHJpbnRfd2Fy bmluZygiaW52YWxpZCBibG9jayBudW1iZXIgKCV1KSBpbiBjbnRidCAiCisJ CQkJCSJyb290IGluIGFnZiAldSIsIHJvb3QsIGFnbm8pOworCQlyZXR1cm4g MTsKKwl9CisJaWYgKGxldmVscyA+PSBYRlNfQlRSRUVfTUFYTEVWRUxTKSB7 CisJCWlmIChzaG93X3dhcm5pbmdzKQorCQkJcHJpbnRfd2FybmluZygiaW52 YWxpZCBsZXZlbCAoJXUpIGluIGNudGJ0IHJvb3QgIgorCQkJCQkiaW4gYWdm ICV1IiwgbGV2ZWxzLCBhZ25vKTsKKwkJcmV0dXJuIDE7CisJfQorCisJcmV0 dXJuIHNjYW5fYnRyZWUoYWdubywgcm9vdCwgbGV2ZWxzLCBUWVBfQ05UQlQs IGFnZiwgc2NhbmZ1bmNfZnJlZXNwKTsKK30KKworLyogZmlsZW5hbWUgYW5k IGV4dGVuZGVkIGF0dHJpYnV0ZSBvYmZ1c2NhdGlvbiByb3V0aW5lcyAqLwor Cit0eXBlZGVmIHN0cnVjdCBuYW1lX2VudCB7CisJc3RydWN0IG5hbWVfZW50 CQkqbmV4dDsKKwl4ZnNfZGFoYXNoX3QJCWhhc2g7CisJaW50CSAgCSAgICAJ bmFtZWxlbjsKKwl1Y2hhcl90ICAgIAkgICAgCW5hbWVbMV07Cit9IG5hbWVf ZW50X3Q7CisKKyNkZWZpbmUgTkFNRV9UQUJMRV9TSVpFCQk0MDk2CisKK3N0 YXRpYyBuYW1lX2VudF90IAkJKipuYW1ldGFibGU7CisKK3N0YXRpYyBpbnQK K2NyZWF0ZV9uYW1ldGFibGUodm9pZCkKK3sKKwluYW1ldGFibGUgPSBjYWxs b2MoTkFNRV9UQUJMRV9TSVpFLCBzaXplb2YobmFtZV9lbnRfdCkpOworCXJl dHVybiBuYW1ldGFibGUgIT0gTlVMTDsKK30KKworc3RhdGljIHZvaWQKK2Ns ZWFyX25hbWV0YWJsZSh2b2lkKQoreworCWludAkJCWk7CisJbmFtZV9lbnRf dAkJKnA7CisKKwlmb3IgKGkgPSAwOyBpIDwgTkFNRV9UQUJMRV9TSVpFOyBp KyspIHsKKwkJd2hpbGUgKG5hbWV0YWJsZVtpXSkgeworCQkJcCA9IG5hbWV0 YWJsZVtpXTsKKwkJCW5hbWV0YWJsZVtpXSA9IHAtPm5leHQ7CisJCQlmcmVl KHApOworCQl9CisJfQorfQorCisKKyNkZWZpbmUgaXNfaW52YWxpZF9jaGFy KGMpCSgoYykgPT0gJy8nIHx8IChjKSA9PSAnXDAnKQorI2RlZmluZSByb2wz Mih4LHkpCQkoKCh4KSA8PCAoeSkpIHwgKCh4KSA+PiAoMzIgLSAoeSkpKSkK Kworc3RhdGljIGlubGluZSB1Y2hhcl90CityYW5kb21fZmlsZW5hbWVfY2hh cih2b2lkKQoreworCXVjaGFyX3QJCQljOworCisJZG8geworCQljID0gcmFu ZG9tKCkgJSAxMjcgKyAxOworCX0gd2hpbGUgKGMgPT0gJy8nKTsKKwlyZXR1 cm4gYzsKK30KKworc3RhdGljIGludAoraXNfc3BlY2lhbF9kaXJlbnQoCisJ eGZzX2lub190CQlpbm8sCisJaW50CQkJbmFtZWxlbiwKKwl1Y2hhcl90CQkJ Km5hbWUpCit7CisJc3RhdGljIHhmc19pbm9fdAlvcnBoYW5hZ2VfaW5vID0g MDsKKwljaGFyCQkJc1szMl07CisJaW50CQkJc2xlbjsKKworCS8qCisJICog ZHVlIHRvIHRoZSBYRlMgbmFtZSBoYXNoaW5nIGFsZ29yaXRobSwgd2UgY2Fu bm90IG9iZnVzY2F0ZQorCSAqIG5hbWVzIHdpdGggNCBjaGFycyBvciBsZXNz LgorCSAqLworCWlmIChuYW1lbGVuIDw9IDQpCisJCXJldHVybiAxOworCisJ aWYgKGlubyA9PSAwKQorCQlyZXR1cm4gMDsKKworCS8qCisJICogZG9uJ3Qg b2JmdXNjYXRlIGxvc3QrZm91bmQgbm9yIGFueSBpbm9kZXMgd2l0aGluIGxv c3QrZm91bmQgd2l0aAorCSAqIHRoZSBpbm9kZSBudW1iZXIKKwkgKi8KKwlp ZiAoY3VyX2lubyA9PSBtcC0+bV9zYi5zYl9yb290aW5vICYmIG5hbWVsZW4g PT0gMTAgJiYKKwkJCW1lbWNtcChuYW1lLCAibG9zdCtmb3VuZCIsIDEwKSA9 PSAwKSB7CisJCW9ycGhhbmFnZV9pbm8gPSBpbm87CisJCXJldHVybiAxOwor CX0KKwlpZiAoY3VyX2lubyAhPSBvcnBoYW5hZ2VfaW5vKQorCQlyZXR1cm4g MDsKKworCXNsZW4gPSBzcHJpbnRmKHMsICIlbGxkIiwgKGxvbmcgbG9uZylp bm8pOworCXJldHVybiAoc2xlbiA9PSBuYW1lbGVuICYmIG1lbWNtcChuYW1l LCBzLCBuYW1lbGVuKSA9PSAwKTsKK30KKworc3RhdGljIHZvaWQKK2dlbmVy YXRlX29iZnVzY2F0ZWRfbmFtZSgKKwl4ZnNfaW5vX3QJCWlubywKKwlpbnQJ CQluYW1lbGVuLAorCXVjaGFyX3QJCQkqbmFtZSkKK3sKKwl4ZnNfZGFoYXNo X3QJCWhhc2g7CisJbmFtZV9lbnRfdAkJKnA7CisJaW50CQkJaTsKKwlpbnQJ CQlkdXA7CisJeGZzX2RhaGFzaF90CQluZXdoYXNoOworCXVjaGFyX3QJCQlu ZXduYW1lW25hbWVsZW5dOworCisJaWYgKGlzX3NwZWNpYWxfZGlyZW50KGlu bywgbmFtZWxlbiwgbmFtZSkpCisJCXJldHVybjsKKworCWhhc2ggPSBsaWJ4 ZnNfZGFfaGFzaG5hbWUobmFtZSwgbmFtZWxlbik7CisKKwkvKiBjcmVhdGUg YSByYW5kb20gbmFtZSB3aXRoIHRoZSBzYW1lIGhhc2ggdmFsdWUgKi8KKwor CWRvIHsKKwkJZHVwID0gMDsKKwkJbmV3bmFtZVswXSA9ICcvJzsKKworCQlm b3IgKDs7KSB7CisJCQkvKiBpZiB0aGUgZmlyc3QgY2hhciBpcyBhICIvIiwg cHJlc2VydmUgaXQgKi8KKwkJCWkgPSAobmFtZVswXSA9PSAnLycpOworCisJ CQlmb3IgKG5ld2hhc2ggPSAwOyBpIDwgbmFtZWxlbiAtIDU7IGkrKykgewor CQkJCW5ld25hbWVbaV0gPSByYW5kb21fZmlsZW5hbWVfY2hhcigpOworCQkJ CW5ld2hhc2ggPSBuZXduYW1lW2ldIF4gcm9sMzIobmV3aGFzaCwgNyk7CisJ CQl9CisJCQluZXdoYXNoID0gcm9sMzIobmV3aGFzaCwgMykgXiBoYXNoOwor CQkJaWYgKG5hbWVbMF0gIT0gJy8nIHx8IG5hbWVsZW4gPiA1KSB7CisJCQkJ bmV3bmFtZVtuYW1lbGVuIC0gNV0gPSAobmV3aGFzaCA+PiAyOCkgfAorCQkJ CQkJKHJhbmRvbV9maWxlbmFtZV9jaGFyKCkgJiAweGYwKTsKKwkJCQlpZiAo aXNfaW52YWxpZF9jaGFyKG5ld25hbWVbbmFtZWxlbiAtIDVdKSkKKwkJCQkJ Y29udGludWU7CisJCQl9CisJCQluZXduYW1lW25hbWVsZW4gLSA0XSA9IChu ZXdoYXNoID4+IDIxKSAmIDB4N2Y7CisJCQlpZiAoaXNfaW52YWxpZF9jaGFy KG5ld25hbWVbbmFtZWxlbiAtIDRdKSkKKwkJCQljb250aW51ZTsKKwkJCW5l d25hbWVbbmFtZWxlbiAtIDNdID0gKG5ld2hhc2ggPj4gMTQpICYgMHg3ZjsK KwkJCWlmIChpc19pbnZhbGlkX2NoYXIobmV3bmFtZVtuYW1lbGVuIC0gM10p KQorCQkJCWNvbnRpbnVlOworCQkJbmV3bmFtZVtuYW1lbGVuIC0gMl0gPSAo bmV3aGFzaCA+PiA3KSAmIDB4N2Y7CisJCQlpZiAoaXNfaW52YWxpZF9jaGFy KG5ld25hbWVbbmFtZWxlbiAtIDJdKSkKKwkJCQljb250aW51ZTsKKwkJCW5l d25hbWVbbmFtZWxlbiAtIDFdID0gKChuZXdoYXNoID4+IDApIF4KKwkJCQkJ KG5ld25hbWVbbmFtZWxlbiAtIDVdID4+IDQpKSAmIDB4N2Y7CisJCQlpZiAo aXNfaW52YWxpZF9jaGFyKG5ld25hbWVbbmFtZWxlbiAtIDFdKSkKKwkJCQlj b250aW51ZTsKKwkJCWJyZWFrOworCQl9CisKKwkJQVNTRVJUKGxpYnhmc19k YV9oYXNobmFtZShuZXduYW1lLCBuYW1lbGVuKSA9PSBoYXNoKTsKKworCQlm b3IgKHAgPSBuYW1ldGFibGVbaGFzaCAlIE5BTUVfVEFCTEVfU0laRV07IHA7 IHAgPSBwLT5uZXh0KSB7CisJCQlpZiAocC0+aGFzaCA9PSBoYXNoICYmIHAt Pm5hbWVsZW4gPT0gbmFtZWxlbiAmJgorCQkJCQltZW1jbXAocC0+bmFtZSwg bmV3bmFtZSwgbmFtZWxlbikgPT0gMCl7CisJCQkJZHVwID0gMTsKKwkJCQli cmVhazsKKwkJCX0KKwkJfQorCX0gd2hpbGUgKGR1cCk7CisKKwltZW1jcHko bmFtZSwgbmV3bmFtZSwgbmFtZWxlbik7CisKKwlwID0gbWFsbG9jKHNpemVv ZihuYW1lX2VudF90KSArIG5hbWVsZW4pOworCWlmIChwID09IE5VTEwpCisJ CXJldHVybjsKKworCXAtPm5leHQgPSBuYW1ldGFibGVbaGFzaCAlIE5BTUVf VEFCTEVfU0laRV07CisJcC0+aGFzaCA9IGhhc2g7CisJcC0+bmFtZWxlbiA9 IG5hbWVsZW47CisJbWVtY3B5KHAtPm5hbWUsIG5hbWUsIG5hbWVsZW4pOwor CisJbmFtZXRhYmxlW2hhc2ggJSBOQU1FX1RBQkxFX1NJWkVdID0gcDsKK30K Kworc3RhdGljIHZvaWQKK29iZnVzY2F0ZV9zZl9kaXIoCisJeGZzX2Rpbm9k ZV90CQkqZGlwKQoreworCXhmc19kaXIyX3NmX3QJCSpzZnA7CisJeGZzX2Rp cjJfc2ZfZW50cnlfdAkqc2ZlcDsKKwlpbnQJCQlpbm9fZGlyX3NpemU7CisJ aW50CQkJaTsKKworCXNmcCA9ICZkaXAtPmRpX3UuZGlfZGlyMnNmOworCWlu b19kaXJfc2l6ZSA9IGRpcC0+ZGlfY29yZS5kaV9zaXplOworCWlmIChpbm9f ZGlyX3NpemUgPiBYRlNfREZPUktfRFNJWkUoZGlwLCBtcCkpIHsKKwkJaW5v X2Rpcl9zaXplID0gWEZTX0RGT1JLX0RTSVpFKGRpcCwgbXApOworCQlpZiAo c2hvd193YXJuaW5ncykKKwkJCXByaW50X3dhcm5pbmcoImludmFsaWQgc2l6 ZSBmb3IgZGlyIGlub2RlICVsbHUiLAorCQkJCQkobG9uZyBsb25nKWN1cl9p bm8pOworCX0KKworCXNmZXAgPSBYRlNfRElSMl9TRl9GSVJTVEVOVFJZKHNm cCk7CisJZm9yIChpID0gMDsgKGkgPCBzZnAtPmhkci5jb3VudCkgJiYKKwkJ CSgoY2hhciAqKXNmZXAgLSAoY2hhciAqKXNmcCA8IGlub19kaXJfc2l6ZSk7 IGkrKykgeworCisJCS8qCisJCSAqIGZpcnN0IGNoZWNrIGZvciBiYWQgbmFt ZSBsZW5ndGhzLiBJZiB0aGV5IGFyZSBiYWQsIHdlCisJCSAqIGhhdmUgbGlt aXRhdGlvbnMgdG8gaG93IG11Y2ggY2FuIGJlIG9iZnVzY2F0ZWQuCisJCSAq LworCQlpbnQJbmFtZWxlbiA9IHNmZXAtPm5hbWVsZW47CisKKwkJaWYgKG5h bWVsZW4gPT0gMCkgeworCQkJaWYgKHNob3dfd2FybmluZ3MpCisJCQkJcHJp bnRfd2FybmluZygiemVybyBsZW5ndGggZW50cnkgaW4gZGlyIGlub2RlICIK KwkJCQkJCSIlbGx1IiwgKGxvbmcgbG9uZyljdXJfaW5vKTsKKwkJCWlmIChp ICE9IHNmcC0+aGRyLmNvdW50IC0gMSkKKwkJCQlicmVhazsKKwkJCW5hbWVs ZW4gPSBpbm9fZGlyX3NpemUgLSAoKGNoYXIgKikmc2ZlcC0+bmFtZVswXSAt CisJCQkJCSAoY2hhciAqKXNmcCk7CisJCX0gZWxzZSBpZiAoKGNoYXIgKilz ZmVwIC0gKGNoYXIgKilzZnAgKworCQkJCVhGU19ESVIyX1NGX0VOVFNJWkVf QllFTlRSWShzZnAsIHNmZXApID4KKwkJCQlpbm9fZGlyX3NpemUpIHsKKwkJ CWlmIChzaG93X3dhcm5pbmdzKQorCQkJCXByaW50X3dhcm5pbmcoImVudHJ5 IGxlbmd0aCBpbiBkaXIgaW5vZGUgJWxsdSAiCisJCQkJCSJvdmVyZmxvd3Mg c3BhY2UiLCAobG9uZyBsb25nKWN1cl9pbm8pOworCQkJaWYgKGkgIT0gc2Zw LT5oZHIuY291bnQgLSAxKQorCQkJCWJyZWFrOworCQkJbmFtZWxlbiA9IGlu b19kaXJfc2l6ZSAtICgoY2hhciAqKSZzZmVwLT5uYW1lWzBdIC0KKwkJCQkJ IChjaGFyICopc2ZwKTsKKwkJfQorCisJCWdlbmVyYXRlX29iZnVzY2F0ZWRf bmFtZShYRlNfRElSMl9TRl9HRVRfSU5VTUJFUihzZnAsCisJCQkJWEZTX0RJ UjJfU0ZfSU5VTUJFUlAoc2ZlcCkpLCBuYW1lbGVuLAorCQkJCSZzZmVwLT5u YW1lWzBdKTsKKworCQlzZmVwID0gKHhmc19kaXIyX3NmX2VudHJ5X3QgKiko KGNoYXIgKilzZmVwICsKKwkJCQlYRlNfRElSMl9TRl9FTlRTSVpFX0JZTkFN RShzZnAsIG5hbWVsZW4pKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkCitvYmZ1 c2NhdGVfc2Zfc3ltbGluaygKKwl4ZnNfZGlub2RlX3QJCSpkaXApCit7CisJ aW50CQkJaTsKKworCWZvciAoaSA9IDA7IGkgPCBkaXAtPmRpX2NvcmUuZGlf c2l6ZTsgaSsrKQorCQlkaXAtPmRpX3UuZGlfc3ltbGlua1tpXSA9IHJhbmRv bSgpICUgMTI3ICsgMTsKK30KKworc3RhdGljIHZvaWQKK29iZnVzY2F0ZV9z Zl9hdHRyKAorCXhmc19kaW5vZGVfdAkJKmRpcCkKK3sKKwkvKgorCSAqIHdp dGggZXh0ZW5kZWQgYXR0cmlidXRlcywgb2JmdXNjYXRlIHRoZSBuYW1lcyBh bmQgemVybyB0aGUgYWN0dWFsCisJICogdmFsdWVzLgorCSAqLworCisJeGZz X2F0dHJfc2hvcnRmb3JtX3QJKmFzZnA7CisJeGZzX2F0dHJfc2ZfZW50cnlf dAkqYXNmZXA7CisJaW50CQkJaW5vX2F0dHJfc2l6ZTsKKwlpbnQJCQlpOwor CisJYXNmcCA9ICh4ZnNfYXR0cl9zaG9ydGZvcm1fdCAqKVhGU19ERk9SS19B UFRSKGRpcCk7CisJaWYgKGFzZnAtPmhkci5jb3VudCA9PSAwKQorCQlyZXR1 cm47CisKKwlpbm9fYXR0cl9zaXplID0gYmUxNl90b19jcHUoYXNmcC0+aGRy LnRvdHNpemUpOworCWlmIChpbm9fYXR0cl9zaXplID4gWEZTX0RGT1JLX0FT SVpFKGRpcCwgbXApKSB7CisJCWlub19hdHRyX3NpemUgPSBYRlNfREZPUktf QVNJWkUoZGlwLCBtcCk7CisJCWlmIChzaG93X3dhcm5pbmdzKQorCQkJcHJp bnRfd2FybmluZygiaW52YWxpZCBhdHRyIHNpemUgaW4gaW5vZGUgJWxsdSIs CisJCQkJCShsb25nIGxvbmcpY3VyX2lubyk7CisJfQorCisJYXNmZXAgPSAm YXNmcC0+bGlzdFswXTsKKwlmb3IgKGkgPSAwOyAoaSA8IGFzZnAtPmhkci5j b3VudCkgJiYKKwkJCSgoY2hhciAqKWFzZmVwIC0gKGNoYXIgKilhc2ZwIDwg aW5vX2F0dHJfc2l6ZSk7IGkrKykgeworCisJCWludAluYW1lbGVuID0gYXNm ZXAtPm5hbWVsZW47CisKKwkJaWYgKG5hbWVsZW4gPT0gMCkgeworCQkJaWYg KHNob3dfd2FybmluZ3MpCisJCQkJcHJpbnRfd2FybmluZygiemVybyBsZW5n dGggYXR0ciBlbnRyeSBpbiBpbm9kZSAiCisJCQkJCQkiJWxsdSIsIChsb25n IGxvbmcpY3VyX2lubyk7CisJCQlicmVhazsKKwkJfSBlbHNlIGlmICgoY2hh ciAqKWFzZmVwIC0gKGNoYXIgKilhc2ZwICsKKwkJCQlYRlNfQVRUUl9TRl9F TlRTSVpFKGFzZmVwKSA+IGlub19hdHRyX3NpemUpIHsKKwkJCWlmIChzaG93 X3dhcm5pbmdzKQorCQkJCXByaW50X3dhcm5pbmcoImF0dHIgZW50cnkgbGVu Z3RoIGluIGlub2RlICVsbHUgIgorCQkJCQkib3ZlcmZsb3dzIHNwYWNlIiwg KGxvbmcgbG9uZyljdXJfaW5vKTsKKwkJCWJyZWFrOworCQl9CisKKwkJZ2Vu ZXJhdGVfb2JmdXNjYXRlZF9uYW1lKDAsIGFzZmVwLT5uYW1lbGVuLCAmYXNm ZXAtPm5hbWV2YWxbMF0pOworCQltZW1zZXQoJmFzZmVwLT5uYW1ldmFsW2Fz ZmVwLT5uYW1lbGVuXSwgMCwgYXNmZXAtPnZhbHVlbGVuKTsKKworCQlhc2Zl cCA9ICh4ZnNfYXR0cl9zZl9lbnRyeV90ICopKChjaGFyICopYXNmZXAgKwor CQkJCVhGU19BVFRSX1NGX0VOVFNJWkUoYXNmZXApKTsKKwl9Cit9CisKKy8q CisgKiBkaXJfZGF0YSBzdHJ1Y3R1cmUgaXMgdXNlZCB0byB0cmFjayBtdWx0 aS1mc2Jsb2NrIGRpcjIgYmxvY2tzIGJldHdlZW4gZXh0ZW50CisgKiBwcm9j ZXNzaW5nIGNhbGxzLgorICovCisKK3N0YXRpYyBzdHJ1Y3QgZGlyX2RhdGFf cyB7CisJaW50CQkJZW5kX29mX2RhdGE7CisJaW50CQkJYmxvY2tfaW5kZXg7 CisJaW50CQkJb2Zmc2V0X3RvX2VudHJ5OworCWludAkJCWJhZF9ibG9jazsK K30gZGlyX2RhdGE7CisKK3N0YXRpYyB2b2lkCitvYmZ1c2NhdGVfZGlyX2Rh dGFfYmxvY2tzKAorCWNoYXIJCQkqYmxvY2ssCisJeGZzX2RmaWxvZmZfdAkJ b2Zmc2V0LAorCXhmc19kZmlsYmxrc190CQljb3VudCwKKwlpbnQJCQlpc19i bG9ja19mb3JtYXQpCit7CisJLyoKKwkgKiB3ZSBoYXZlIHRvIHJlbHkgb24g dGhlIGZpbGVvZmZzZXQgYW5kIHNpZ25hdHVyZSBvZiB0aGUgYmxvY2sgdG8K KwkgKiBoYW5kbGUgaXQncyBjb250ZW50cy4gSWYgaXQncyBpbnZhbGlkLCBs ZWF2ZSBpdCBhbG9uZS4KKwkgKiBmb3IgbXVsdGktZnNibG9jayBkaXIgYmxv Y2tzLCBpZiBhIG5hbWUgY3Jvc3NlcyBhbiBleHRlbnQgYm91bmRhcnksCisJ ICogaWdub3JlIGl0IGFuZCBjb250aW51ZS4KKwkgKi8KKwlpbnQJCQljOwor CWludAkJCWRpcl9vZmZzZXQ7CisJY2hhcgkJCSpwdHI7CisJY2hhcgkJCSpl bmRwdHI7CisKKwlpZiAoaXNfYmxvY2tfZm9ybWF0ICYmIGNvdW50ICE9IG1w LT5tX2RpcmJsa2ZzYnMpCisJCXJldHVybjsgLyogdG9vIGNvbXBsZXggdG8g aGFuZGxlIHRoaXMgcmFyZSBjYXNlICovCisKKwlmb3IgKGMgPSAwLCBlbmRw dHIgPSBibG9jazsgYyA8IGNvdW50OyBjKyspIHsKKworCQlpZiAoZGlyX2Rh dGEuYmxvY2tfaW5kZXggPT0gMCkgeworCQkJaW50CQl3YW50bWFnaWM7CisK KwkJCWlmIChvZmZzZXQgJSBtcC0+bV9kaXJibGtmc2JzICE9IDApCisJCQkJ cmV0dXJuOwkvKiBjb3JydXB0ZWQsIGxlYXZlIGl0IGFsb25lICovCisKKwkJ CWRpcl9kYXRhLmJhZF9ibG9jayA9IDA7CisKKwkJCWlmIChpc19ibG9ja19m b3JtYXQpIHsKKwkJCQl4ZnNfZGlyMl9sZWFmX2VudHJ5X3QJKmJscDsKKwkJ CQl4ZnNfZGlyMl9ibG9ja190YWlsX3QJKmJ0cDsKKworCQkJCWJ0cCA9IFhG U19ESVIyX0JMT0NLX1RBSUxfUChtcCwKKwkJCQkJCSh4ZnNfZGlyMl9ibG9j a190ICopYmxvY2spOworCQkJCWJscCA9IFhGU19ESVIyX0JMT0NLX0xFQUZf UChidHApOworCQkJCWlmICgoY2hhciAqKWJscCA+IChjaGFyICopYnRwKQor CQkJCQlibHAgPSAoeGZzX2RpcjJfbGVhZl9lbnRyeV90ICopYnRwOworCisJ CQkJZGlyX2RhdGEuZW5kX29mX2RhdGEgPSAoY2hhciAqKWJscCAtIGJsb2Nr OworCQkJCXdhbnRtYWdpYyA9IFhGU19ESVIyX0JMT0NLX01BR0lDOworCQkJ fSBlbHNlIHsgLyogbGVhZi9ub2RlIGZvcm1hdCAqLworCQkJCWRpcl9kYXRh LmVuZF9vZl9kYXRhID0gbXAtPm1fZGlyYmxrZnNicyA8PAorCQkJCQkJbXAt Pm1fc2Iuc2JfYmxvY2tsb2c7CisJCQkJd2FudG1hZ2ljID0gWEZTX0RJUjJf REFUQV9NQUdJQzsKKwkJCX0KKwkJCWRpcl9kYXRhLm9mZnNldF90b19lbnRy eSA9IG9mZnNldG9mKHhmc19kaXIyX2RhdGFfdCwgdSk7CisKKwkJCWlmIChi ZTMyX3RvX2NwdSgoKHhmc19kaXIyX2RhdGFfaGRyX3QqKWJsb2NrKS0+bWFn aWMpICE9CisJCQkJCXdhbnRtYWdpYykgeworCQkJCWlmIChzaG93X3dhcm5p bmdzKQorCQkJCQlwcmludF93YXJuaW5nKCJpbnZhbGlkIG1hZ2ljIGluIGRp ciAiCisJCQkJCQkiaW5vZGUgJWxsdSBibG9jayAlbGQiLAorCQkJCQkJKGxv bmcgbG9uZyljdXJfaW5vLAorCQkJCQkJKGxvbmcpb2Zmc2V0KTsKKwkJCQlk aXJfZGF0YS5iYWRfYmxvY2sgPSAxOworCQkJfQorCQl9CisJCWRpcl9kYXRh LmJsb2NrX2luZGV4Kys7CisJCWlmIChkaXJfZGF0YS5ibG9ja19pbmRleCA9 PSBtcC0+bV9kaXJibGtmc2JzKQorCQkJZGlyX2RhdGEuYmxvY2tfaW5kZXgg PSAwOworCisJCWlmIChkaXJfZGF0YS5iYWRfYmxvY2spCisJCQljb250aW51 ZTsKKworCQlkaXJfb2Zmc2V0ID0gKGRpcl9kYXRhLmJsb2NrX2luZGV4IDw8 IG1wLT5tX3NiLnNiX2Jsb2NrbG9nKSArCisJCQkJZGlyX2RhdGEub2Zmc2V0 X3RvX2VudHJ5OworCisJCXB0ciA9IGVuZHB0ciArIGRpcl9kYXRhLm9mZnNl dF90b19lbnRyeTsKKwkJZW5kcHRyICs9IG1wLT5tX3NiLnNiX2Jsb2Nrc2l6 ZTsKKworCQl3aGlsZSAocHRyIDwgZW5kcHRyICYmIGRpcl9vZmZzZXQgPCBk aXJfZGF0YS5lbmRfb2ZfZGF0YSkgeworCQkJeGZzX2RpcjJfZGF0YV9lbnRy eV90CSpkZXA7CisJCQl4ZnNfZGlyMl9kYXRhX3VudXNlZF90CSpkdXA7CisJ CQlpbnQJCQlsZW5ndGg7CisKKwkJCWR1cCA9ICh4ZnNfZGlyMl9kYXRhX3Vu dXNlZF90ICopcHRyOworCisJCQlpZiAoYmUxNl90b19jcHUoZHVwLT5mcmVl dGFnKSA9PSBYRlNfRElSMl9EQVRBX0ZSRUVfVEFHKSB7CisJCQkJaW50CWxl bmd0aCA9IGJlMTZfdG9fY3B1KGR1cC0+bGVuZ3RoKTsKKwkJCQlpZiAoZGly X29mZnNldCArIGxlbmd0aCA+IGRpcl9kYXRhLmVuZF9vZl9kYXRhIHx8CisJ CQkJCQlsZW5ndGggPT0gMCB8fCAobGVuZ3RoICYKKwkJCQkJCSAoWEZTX0RJ UjJfREFUQV9BTElHTiAtIDEpKSkgeworCQkJCQlpZiAoc2hvd193YXJuaW5n cykKKwkJCQkJCXByaW50X3dhcm5pbmcoImludmFsaWQgbGVuZ3RoICIKKwkJ CQkJCQkiZm9yIGRpciBmcmVlIHNwYWNlIGluICIKKwkJCQkJCQkiaW5vZGUg JWxsdSIsCisJCQkJCQkJKGxvbmcgbG9uZyljdXJfaW5vKTsKKwkJCQkJZGly X2RhdGEuYmFkX2Jsb2NrID0gMTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJ CWlmIChiZTE2X3RvX2NwdSgqWEZTX0RJUjJfREFUQV9VTlVTRURfVEFHX1Ao ZHVwKSkgIT0KKwkJCQkJCWRpcl9vZmZzZXQpIHsKKwkJCQkJZGlyX2RhdGEu YmFkX2Jsb2NrID0gMTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCWRpcl9v ZmZzZXQgKz0gbGVuZ3RoOworCQkJCXB0ciArPSBsZW5ndGg7CisJCQkJaWYg KGRpcl9vZmZzZXQgPj0gZGlyX2RhdGEuZW5kX29mX2RhdGEgfHwKKwkJCQkJ CXB0ciA+PSBlbmRwdHIpCisJCQkJCWJyZWFrOworCQkJfQorCisJCQlkZXAg PSAoeGZzX2RpcjJfZGF0YV9lbnRyeV90ICopcHRyOworCQkJbGVuZ3RoID0g WEZTX0RJUjJfREFUQV9FTlRTSVpFKGRlcC0+bmFtZWxlbik7CisKKwkJCWlm IChkaXJfb2Zmc2V0ICsgbGVuZ3RoID4gZGlyX2RhdGEuZW5kX29mX2RhdGEg fHwKKwkJCQkJcHRyICsgbGVuZ3RoID4gZW5kcHRyKSB7CisJCQkJaWYgKHNo b3dfd2FybmluZ3MpCisJCQkJCXByaW50X3dhcm5pbmcoImludmFsaWQgbGVu Z3RoIGZvciAiCisJCQkJCQkiZGlyIGVudHJ5IG5hbWUgaW4gaW5vZGUgJWxs dSIsCisJCQkJCQkobG9uZyBsb25nKWN1cl9pbm8pOworCQkJCWJyZWFrOwor CQkJfQorCQkJaWYgKGJlMTZfdG9fY3B1KCpYRlNfRElSMl9EQVRBX0VOVFJZ X1RBR19QKGRlcCkpICE9CisJCQkJCWRpcl9vZmZzZXQpIHsKKwkJCQlkaXJf ZGF0YS5iYWRfYmxvY2sgPSAxOworCQkJCWJyZWFrOworCQkJfQorCQkJZ2Vu ZXJhdGVfb2JmdXNjYXRlZF9uYW1lKGJlNjRfdG9fY3B1KGRlcC0+aW51bWJl ciksCisJCQkJCWRlcC0+bmFtZWxlbiwgJmRlcC0+bmFtZVswXSk7CisJCQlk aXJfb2Zmc2V0ICs9IGxlbmd0aDsKKwkJCXB0ciArPSBsZW5ndGg7CisJCX0K KwkJZGlyX2RhdGEub2Zmc2V0X3RvX2VudHJ5ID0gZGlyX29mZnNldCAmCisJ CQkJCQkobXAtPm1fc2Iuc2JfYmxvY2tzaXplIC0gMSk7CisJfQorfQorCitz dGF0aWMgdm9pZAorb2JmdXNjYXRlX3N5bWxpbmtfYmxvY2tzKAorCWNoYXIJ CQkqYmxvY2ssCisJeGZzX2RmaWxibGtzX3QJCWNvdW50KQoreworCWludCAJ CQlpOworCisJY291bnQgPDw9IG1wLT5tX3NiLnNiX2Jsb2NrbG9nOworCWZv ciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKQorCQlibG9ja1tpXSA9IHJhbmRv bSgpICUgMTI3ICsgMTsKK30KKworI2RlZmluZSBNQVhfUkVNT1RFX1ZBTFMJ CTQwOTUKKworc3RhdGljIHN0cnVjdCBhdHRyX2RhdGFfcyB7CisJaW50CQkJ cmVtb3RlX3ZhbF9jb3VudDsKKwl4ZnNfZGFibGtfdAkJcmVtb3RlX3ZhbHNb TUFYX1JFTU9URV9WQUxTXTsKK30gYXR0cl9kYXRhOworCitzdGF0aWMgaW5s aW5lIHZvaWQKK2FkZF9yZW1vdGVfdmFscygKKwl4ZnNfZGFibGtfdCAJCWJs b2NraWR4LAorCWludAkJCWxlbmd0aCkKK3sKKwl3aGlsZSAobGVuZ3RoID4g MCAmJiBhdHRyX2RhdGEucmVtb3RlX3ZhbF9jb3VudCA8IE1BWF9SRU1PVEVf VkFMUykgeworCQlhdHRyX2RhdGEucmVtb3RlX3ZhbHNbYXR0cl9kYXRhLnJl bW90ZV92YWxfY291bnRdID0gYmxvY2tpZHg7CisJCWF0dHJfZGF0YS5yZW1v dGVfdmFsX2NvdW50Kys7CisJCWJsb2NraWR4Kys7CisJCWxlbmd0aCAtPSBY RlNfTEJTSVpFKG1wKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkCitvYmZ1c2Nh dGVfYXR0cl9ibG9ja3MoCisJY2hhcgkJCSpibG9jaywKKwl4ZnNfZGZpbG9m Zl90CQlvZmZzZXQsCisJeGZzX2RmaWxibGtzX3QJCWNvdW50KQoreworCXhm c19hdHRyX2xlYWZibG9ja190CSpsZWFmOworCWludAkJCWM7CisJaW50CQkJ aTsKKwlpbnQJCQluZW50cmllczsKKwl4ZnNfYXR0cl9sZWFmX2VudHJ5X3Qg CSplbnRyeTsKKwl4ZnNfYXR0cl9sZWFmX25hbWVfbG9jYWxfdCAqbG9jYWw7 CisJeGZzX2F0dHJfbGVhZl9uYW1lX3JlbW90ZV90ICpyZW1vdGU7CisKKwlm b3IgKGMgPSAwOyBjIDwgY291bnQ7IGMrKywgb2Zmc2V0KyssIGJsb2NrICs9 IFhGU19MQlNJWkUobXApKSB7CisKKwkJbGVhZiA9ICh4ZnNfYXR0cl9sZWFm YmxvY2tfdCAqKWJsb2NrOworCisJCWlmIChiZTE2X3RvX2NwdShsZWFmLT5o ZHIuaW5mby5tYWdpYykgIT0gWEZTX0FUVFJfTEVBRl9NQUdJQykgeworCQkJ Zm9yIChpID0gMDsgaSA8IGF0dHJfZGF0YS5yZW1vdGVfdmFsX2NvdW50OyBp KyspIHsKKwkJCQlpZiAoYXR0cl9kYXRhLnJlbW90ZV92YWxzW2ldID09IG9m ZnNldCkKKwkJCQkJbWVtc2V0KGJsb2NrLCAwLCBYRlNfTEJTSVpFKG1wKSk7 CisJCQl9CisJCQljb250aW51ZTsKKwkJfQorCisJCW5lbnRyaWVzID0gYmUx Nl90b19jcHUobGVhZi0+aGRyLmNvdW50KTsKKwkJaWYgKG5lbnRyaWVzICog c2l6ZW9mKHhmc19hdHRyX2xlYWZfZW50cnlfdCkgKworCQkJCXNpemVvZih4 ZnNfYXR0cl9sZWFmX2hkcl90KSA+IFhGU19MQlNJWkUobXApKSB7CisJCQlp ZiAoc2hvd193YXJuaW5ncykKKwkJCQlwcmludF93YXJuaW5nKCJpbnZhbGlk IGF0dHIgY291bnQgaW4gaW5vZGUgJWxsdSIsCisJCQkJCQkobG9uZyBsb25n KWN1cl9pbm8pOworCQkJY29udGludWU7CisJCX0KKworCQlmb3IgKGkgPSAw LCBlbnRyeSA9ICZsZWFmLT5lbnRyaWVzWzBdOyBpIDwgbmVudHJpZXM7CisJ CQkJaSsrLCBlbnRyeSsrKSB7CisJCQlpZiAoYmUxNl90b19jcHUoZW50cnkt Pm5hbWVpZHgpID4gWEZTX0xCU0laRShtcCkpIHsKKwkJCQlpZiAoc2hvd193 YXJuaW5ncykKKwkJCQkJcHJpbnRfd2FybmluZygiaW52YWxpZCBhdHRyIG5h bWVpZHggIgorCQkJCQkJCSJpbiBpbm9kZSAlbGx1IiwKKwkJCQkJCQkobG9u ZyBsb25nKWN1cl9pbm8pOworCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKGVu dHJ5LT5mbGFncyAmIFhGU19BVFRSX0xPQ0FMKSB7CisJCQkJbG9jYWwgPSBY RlNfQVRUUl9MRUFGX05BTUVfTE9DQUwobGVhZiwgaSk7CisJCQkJaWYgKGxv Y2FsLT5uYW1lbGVuID09IDApIHsKKwkJCQkJaWYgKHNob3dfd2FybmluZ3Mp CisJCQkJCQlwcmludF93YXJuaW5nKCJ6ZXJvIGxlbmd0aCBmb3IgIgorCQkJ CQkJCSJhdHRyIG5hbWUgaW4gaW5vZGUgJWxsdSIsCisJCQkJCQkJKGxvbmcg bG9uZyljdXJfaW5vKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCWdlbmVy YXRlX29iZnVzY2F0ZWRfbmFtZSgwLCBsb2NhbC0+bmFtZWxlbiwKKwkJCQkJ JmxvY2FsLT5uYW1ldmFsWzBdKTsKKwkJCQltZW1zZXQoJmxvY2FsLT5uYW1l dmFsW2xvY2FsLT5uYW1lbGVuXSwgMCwKKwkJCQkJYmUxNl90b19jcHUobG9j YWwtPnZhbHVlbGVuKSk7CisJCQl9IGVsc2UgeworCQkJCXJlbW90ZSA9IFhG U19BVFRSX0xFQUZfTkFNRV9SRU1PVEUobGVhZiwgaSk7CisJCQkJaWYgKHJl bW90ZS0+bmFtZWxlbiA9PSAwIHx8CisJCQkJCQlyZW1vdGUtPnZhbHVlYmxr ID09IDApIHsKKwkJCQkJaWYgKHNob3dfd2FybmluZ3MpCisJCQkJCQlwcmlu dF93YXJuaW5nKCJpbnZhbGlkIGF0dHIgIgorCQkJCQkJCSJlbnRyeSBpbiBp bm9kZSAlbGx1IiwKKwkJCQkJCQkobG9uZyBsb25nKWN1cl9pbm8pOworCQkJ CQlicmVhazsKKwkJCQl9CisJCQkJZ2VuZXJhdGVfb2JmdXNjYXRlZF9uYW1l KDAsIHJlbW90ZS0+bmFtZWxlbiwKKwkJCQkJJnJlbW90ZS0+bmFtZVswXSk7 CisJCQkJYWRkX3JlbW90ZV92YWxzKGJlMzJfdG9fY3B1KHJlbW90ZS0+dmFs dWVibGspLAorCQkJCQliZTMyX3RvX2NwdShyZW1vdGUtPnZhbHVlbGVuKSk7 CisJCQl9CisJCX0KKwl9Cit9CisKKy8qIGlub2RlIGNvcHkgcm91dGluZXMg Ki8KKworc3RhdGljIGludAorcHJvY2Vzc19ibWJ0X3JlY2xpc3QoCisJeGZz X2JtYnRfcmVjX3QgCQkqcnAsCisJaW50IAkJCW51bXJlY3MsCisJdHlwbm1f dAkJCWJ0eXBlKQoreworCWludAkJCWk7CisJeGZzX2RmaWxvZmZfdAkJbzsK Kwl4ZnNfZGZzYm5vX3QJCXM7CisJeGZzX2RmaWxibGtzX3QJCWM7CisJaW50 CQkJZjsKKwl4ZnNfZGZpbG9mZl90CQlsYXN0OworCisJaWYgKGJ0eXBlID09 IFRZUF9EQVRBKQorCQlyZXR1cm4gMTsKKworCWNvbnZlcnRfZXh0ZW50KCZy cFtudW1yZWNzIC0gMV0sICZvLCAmcywgJmMsICZmKTsKKwlsYXN0ID0gbyAr IGM7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnVtcmVjczsgaSsrLCBycCsrKSB7 CisJCWNvbnZlcnRfZXh0ZW50KHJwLCAmbywgJnMsICZjLCAmZik7CisKKwkJ cHVzaF9jdXIoKTsKKwkJc2V0X2N1cigmdHlwdGFiW2J0eXBlXSwgWEZTX0ZT Ql9UT19EQUREUihtcCwgcyksIGMgKiBibGtiYiwKKwkJCQlEQl9SSU5HX0lH TiwgTlVMTCk7CisJCWlmIChpb2N1cl90b3AtPmRhdGEgPT0gTlVMTCkgewor CQkJcHJpbnRfd2FybmluZygiY2Fubm90IHJlYWQgJXMgYmxvY2sgJXUvJXUi LAorCQkJCQl0eXB0YWJbYnR5cGVdLm5hbWUsCisJCQkJCVhGU19GU0JfVE9f QUdOTyhtcCwgcyksCisJCQkJCVhGU19GU0JfVE9fQUdCTk8obXAsIHMpKTsK KwkJCWlmIChzdG9wX29uX3JlYWRfZXJyb3IpCisJCQkJcmV0dXJuIDA7CisJ CX0gZWxzZSB7CisJCQlpZiAoIWRvbnRfb2JmdXNjYXRlKQorCQkJICAgIHN3 aXRjaCAoYnR5cGUpIHsKKwkJCQljYXNlIFRZUF9ESVIyOgorCQkJCQlpZiAo byA8IG1wLT5tX2RpcmxlYWZibGspCisJCQkJCQlvYmZ1c2NhdGVfZGlyX2Rh dGFfYmxvY2tzKAorCQkJCQkJCWlvY3VyX3RvcC0+ZGF0YSwgbywgYywKKwkJ CQkJCQlsYXN0ID09IG1wLT5tX2RpcmJsa2ZzYnMpOworCQkJCQlicmVhazsK KworCQkJCWNhc2UgVFlQX1NZTUxJTks6CisJCQkJCW9iZnVzY2F0ZV9zeW1s aW5rX2Jsb2NrcygKKwkJCQkJCWlvY3VyX3RvcC0+ZGF0YSwgYyk7CisJCQkJ CWJyZWFrOworCisJCQkJY2FzZSBUWVBfQVRUUjoKKwkJCQkJb2JmdXNjYXRl X2F0dHJfYmxvY2tzKGlvY3VyX3RvcC0+ZGF0YSwKKwkJCQkJCW8sIGMpOwor CQkJCQlicmVhazsKKworCQkJCWRlZmF1bHQ6IDsKKwkJCSAgICB9CisJCQlp ZiAoIXdyaXRlX2J1Zihpb2N1cl90b3ApKQorCQkJCXJldHVybiAwOworCQl9 CisJCXBvcF9jdXIoKTsKKwl9CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGlj IGludAorc2NhbmZ1bmNfYm1hcCgKKwl4ZnNfYnRyZWVfaGRyX3QJCSpidGhk ciwKKwl4ZnNfYWdudW1iZXJfdAkJYWdubywKKwl4ZnNfYWdibG9ja190CQlh Z2JubywKKwlpbnQJCQlsZXZlbCwKKwl0eXBubV90CQkJYnR5cGUsCisJdm9p ZAkJCSphcmcpCS8qIHB0ciB0byBpdHlwZSAqLworeworCWludAkJCWk7CisJ eGZzX2JtYnRfcHRyX3QJCSpwcDsKKwl4ZnNfYm1idF9yZWNfdAkJKnJwOwor CWludAkJCW5yZWNzOworCisJbnJlY3MgPSBiZTE2X3RvX2NwdShidGhkci0+ YmJfbnVtcmVjcyk7CisKKwlpZiAobGV2ZWwgPT0gMCkgeworCQlpZiAobnJl Y3MgPiBtcC0+bV9ibWFwX2RteHJbMF0pIHsKKwkJCWlmIChzaG93X3dhcm5p bmdzKQorCQkJCXByaW50X3dhcm5pbmcoImludmFsaWQgbnVtcmVjcyAoJXUp IGluICVzICIKKwkJCQkJImJsb2NrICV1LyV1IiwgbnJlY3MsCisJCQkJCXR5 cHRhYltidHlwZV0ubmFtZSwgYWdubywgYWdibm8pOworCQkJcmV0dXJuIDE7 CisJCX0KKwkJcnAgPSBYRlNfQlRSRUVfUkVDX0FERFIobXAtPm1fc2Iuc3Fi X2Jsb2Nrc2l6ZSwgeGZzX2JtYnQsIGJ0aGRyLAorCQkJCQkxLCBtcC0+bV9i bWFwX2RteHJbMF0pOworCisJCXJldHVybiBwcm9jZXNzX2JtYnRfcmVjbGlz dChycCwgbnJlY3MsICoodHlwbm1fdCopYXJnKTsKKwl9CisKKwlpZiAobnJl Y3MgPiBtcC0+bV9ibWFwX2RteHJbMV0pIHsKKwkJaWYgKHNob3dfd2Fybmlu Z3MpCisJCQlwcmludF93YXJuaW5nKCJpbnZhbGlkIG51bXJlY3MgKCV1KSBp biAlcyBibG9jayAldS8ldSIsCisJCQkJCW5yZWNzLCB0eXB0YWJbYnR5cGVd Lm5hbWUsIGFnbm8sIGFnYm5vKTsKKwkJcmV0dXJuIDE7CisJfQorCXBwID0g WEZTX0JUUkVFX1BUUl9BRERSKG1wLT5tX3NiLnNiX2Jsb2Nrc2l6ZSwgeGZz X2JtYnQsIGJ0aGRyLCAxLAorCQkJCW1wLT5tX2JtYXBfZG14clsxXSk7CisJ Zm9yIChpID0gMDsgaSA8IG5yZWNzOyBpKyspIHsKKwkJeGZzX2FnbnVtYmVy X3QJYWc7CisJCXhmc19hZ2Jsb2NrX3QJYm5vOworCisJCWFnID0gWEZTX0ZT Ql9UT19BR05PKG1wLCBiZTY0X3RvX2NwdShwcFtpXSkpOworCQlibm8gPSBY RlNfRlNCX1RPX0FHQk5PKG1wLCBiZTY0X3RvX2NwdShwcFtpXSkpOworCisJ CWlmIChibm8gPT0gMCB8fCBibm8gPiBtcC0+bV9zYi5zYl9hZ2Jsb2NrcyB8 fAorCQkJCWFnID4gbXAtPm1fc2Iuc2JfYWdjb3VudCkgeworCQkJaWYgKHNo b3dfd2FybmluZ3MpCisJCQkJcHJpbnRfd2FybmluZygiaW52YWxpZCBibG9j ayBudW1iZXIgKCV1LyV1KSAiCisJCQkJCSJpbiAlcyBibG9jayAldS8ldSIs IGFnLCBibm8sCisJCQkJCXR5cHRhYltidHlwZV0ubmFtZSwgYWdubywgYWdi bm8pOworCQkJY29udGludWU7CisJCX0KKworCQlpZiAoIXNjYW5fYnRyZWUo YWcsIGJubywgbGV2ZWwsIGJ0eXBlLCBhcmcsIHNjYW5mdW5jX2JtYXApKQor CQkJcmV0dXJuIDA7CisJfQorCXJldHVybiAxOworfQorCitzdGF0aWMgaW50 Citwcm9jZXNzX2J0aW5vZGUoCisJeGZzX2Rpbm9kZV90IAkJKmRpcCwKKwl0 eXBubV90CQkJaXR5cGUpCit7CisJeGZzX2JtZHJfYmxvY2tfdAkqZGliOwor CWludAkJCWk7CisJeGZzX2JtYnRfcHRyX3QJCSpwcDsKKwl4ZnNfYm1idF9y ZWNfdAkJKnJwOworCWludAkJCWxldmVsOworCWludAkJCW5yZWNzOworCWlu dAkJCW1heHJlY3M7CisJaW50CQkJd2hpY2hmb3JrOworCXR5cG5tX3QJCQli dHlwZTsKKworCXdoaWNoZm9yayA9IChpdHlwZSA9PSBUWVBfQVRUUikgPyBY RlNfQVRUUl9GT1JLIDogWEZTX0RBVEFfRk9SSzsKKwlidHlwZSA9IChpdHlw ZSA9PSBUWVBfQVRUUikgPyBUWVBfQk1BUEJUQSA6IFRZUF9CTUFQQlREOwor CisJZGliID0gKHhmc19ibWRyX2Jsb2NrX3QgKilYRlNfREZPUktfUFRSKGRp cCwgd2hpY2hmb3JrKTsKKwlsZXZlbCA9IGJlMTZfdG9fY3B1KGRpYi0+YmJf bGV2ZWwpOworCW5yZWNzID0gYmUxNl90b19jcHUoZGliLT5iYl9udW1yZWNz KTsKKworCWlmIChsZXZlbCA+IFhGU19CTV9NQVhMRVZFTFMobXAsIHdoaWNo Zm9yaykpIHsKKwkJaWYgKHNob3dfd2FybmluZ3MpCisJCQlwcmludF93YXJu aW5nKCJpbnZhbGlkIGxldmVsICgldSkgaW4gaW5vZGUgJWxsZCAlcyAiCisJ CQkJCSJyb290IiwgbGV2ZWwsIChsb25nIGxvbmcpY3VyX2lubywKKwkJCQkJ dHlwdGFiW2J0eXBlXS5uYW1lKTsKKwkJcmV0dXJuIDE7CisJfQorCisJaWYg KGxldmVsID09IDApIHsKKwkJcnAgPSBYRlNfQlRSRUVfUkVDX0FERFIoWEZT X0RGT1JLX1NJWkUoZGlwLCBtcCwgd2hpY2hmb3JrKSwKKwkJCQl4ZnNfYm1k ciwgZGliLCAxLCBYRlNfQlRSRUVfQkxPQ0tfTUFYUkVDUygKKwkJCQkJWEZT X0RGT1JLX1NJWkUoZGlwLCBtcCwgd2hpY2hmb3JrKSwKKwkJCQkJeGZzX2Jt ZHIsIDEpKTsKKworCQlyZXR1cm4gcHJvY2Vzc19ibWJ0X3JlY2xpc3QocnAs IG5yZWNzLCBpdHlwZSk7CisJfQorCisJbWF4cmVjcyA9IFhGU19CVFJFRV9C TE9DS19NQVhSRUNTKFhGU19ERk9SS19TSVpFKGRpcCwgbXAsIHdoaWNoZm9y ayksCisJCQl4ZnNfYm1kciwgMCk7CisJaWYgKG5yZWNzID4gbWF4cmVjcykg eworCQlpZiAoc2hvd193YXJuaW5ncykKKwkJCXByaW50X3dhcm5pbmcoImlu dmFsaWQgbnVtcmVjcyAoJXUpIGluIGlub2RlICVsbGQgJXMgIgorCQkJCQki cm9vdCIsIG5yZWNzLCAobG9uZyBsb25nKWN1cl9pbm8sCisJCQkJCXR5cHRh YltidHlwZV0ubmFtZSk7CisJCXJldHVybiAxOworCX0KKworCXBwID0gWEZT X0JUUkVFX1BUUl9BRERSKFhGU19ERk9SS19TSVpFKGRpcCwgbXAsIHdoaWNo Zm9yayksIHhmc19ibWRyLAorCQkJZGliLCAxLCBtYXhyZWNzKTsKKwlmb3Ig KGkgPSAwOyBpIDwgbnJlY3M7IGkrKykgeworCQl4ZnNfYWdudW1iZXJfdAlh ZzsKKwkJeGZzX2FnYmxvY2tfdAlibm87CisKKwkJYWcgPSBYRlNfRlNCX1RP X0FHTk8obXAsIGJlNjRfdG9fY3B1KHBwW2ldKSk7CisJCWJubyA9IFhGU19G U0JfVE9fQUdCTk8obXAsIGJlNjRfdG9fY3B1KHBwW2ldKSk7CisKKwkJaWYg KGJubyA9PSAwIHx8IGJubyA+IG1wLT5tX3NiLnNiX2FnYmxvY2tzIHx8CisJ CQkJYWcgPiBtcC0+bV9zYi5zYl9hZ2NvdW50KSB7CisJCQlpZiAoc2hvd193 YXJuaW5ncykKKwkJCQlwcmludF93YXJuaW5nKCJpbnZhbGlkIGJsb2NrIG51 bWJlciAoJXUvJXUpICIKKwkJCQkJCSJpbiBpbm9kZSAlbGx1ICVzIHJvb3Qi LCBhZywKKwkJCQkJCWJubywgKGxvbmcgbG9uZyljdXJfaW5vLAorCQkJCQkJ dHlwdGFiW2J0eXBlXS5uYW1lKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJ aWYgKCFzY2FuX2J0cmVlKGFnLCBibm8sIGxldmVsLCBidHlwZSwgJml0eXBl LCBzY2FuZnVuY19ibWFwKSkKKwkJCXJldHVybiAwOworCX0KKwlyZXR1cm4g MTsKK30KKworc3RhdGljIGludAorcHJvY2Vzc19leGlub2RlKAorCXhmc19k aW5vZGVfdCAJCSpkaXAsCisJdHlwbm1fdAkJCWl0eXBlKQoreworCWludAkJ CXdoaWNoZm9yazsKKworCXdoaWNoZm9yayA9IChpdHlwZSA9PSBUWVBfQVRU UikgPyBYRlNfQVRUUl9GT1JLIDogWEZTX0RBVEFfRk9SSzsKKworCXJldHVy biBwcm9jZXNzX2JtYnRfcmVjbGlzdCgKKwkJCSh4ZnNfYm1idF9yZWNfdCAq KVhGU19ERk9SS19QVFIoZGlwLCB3aGljaGZvcmspLAorCQkJWEZTX0RGT1JL X05FWFRFTlRTX0hPU1QoZGlwLCB3aGljaGZvcmspLCBpdHlwZSk7Cit9CisK K3N0YXRpYyBpbnQKK3Byb2Nlc3NfaW5vZGVfZGF0YSgKKwl4ZnNfZGlub2Rl X3QJCSpkaXAsCisJdHlwbm1fdAkJCWl0eXBlKQoreworCXN3aXRjaCAoZGlw LT5kaV9jb3JlLmRpX2Zvcm1hdCkgeworCQljYXNlIFhGU19ESU5PREVfRk1U X0xPQ0FMOgorCQkJaWYgKCFkb250X29iZnVzY2F0ZSkKKwkJCQlzd2l0Y2gg KGl0eXBlKSB7CisJCQkJCWNhc2UgVFlQX0RJUjI6CisJCQkJCQlvYmZ1c2Nh dGVfc2ZfZGlyKGRpcCk7CisJCQkJCQlicmVhazsKKworCQkJCQljYXNlIFRZ UF9TWU1MSU5LOgorCQkJCQkJb2JmdXNjYXRlX3NmX3N5bWxpbmsoZGlwKTsK KwkJCQkJCWJyZWFrOworCisJCQkJCWRlZmF1bHQ6IDsKKwkJCQl9CisJCQli cmVhazsKKworCQljYXNlIFhGU19ESU5PREVfRk1UX0VYVEVOVFM6CisJCQly ZXR1cm4gcHJvY2Vzc19leGlub2RlKGRpcCwgaXR5cGUpOworCisJCWNhc2Ug WEZTX0RJTk9ERV9GTVRfQlRSRUU6CisJCQlyZXR1cm4gcHJvY2Vzc19idGlu b2RlKGRpcCwgaXR5cGUpOworCX0KKwlyZXR1cm4gMTsKK30KKworc3RhdGlj IGludAorcHJvY2Vzc19pbm9kZSgKKwl4ZnNfYWdudW1iZXJfdAkJYWdubywK Kwl4ZnNfYWdpbm9fdCAJCWFnaW5vLAorCXhmc19kaW5vZGVfdCAJCSpkaXAp Cit7CisJeGZzX2Rpbm9kZV9jb3JlX3QgICAgICAgb2RpYzsKKwlpbnQJCQlz dWNjZXNzOworCisJLyogY29udmVydCB0aGUgY29yZSAqLworCW1lbWNweSgm b2RpYywgJmRpcC0+ZGlfY29yZSwgc2l6ZW9mKHhmc19kaW5vZGVfY29yZV90 KSk7CisJbGlieGZzX3hsYXRlX2Rpbm9kZV9jb3JlKCh4ZnNfY2FkZHJfdCkm b2RpYywgJmRpcC0+ZGlfY29yZSwgMSk7CisKKwlzdWNjZXNzID0gMTsKKwlj dXJfaW5vID0gWEZTX0FHSU5PX1RPX0lOTyhtcCwgYWdubywgYWdpbm8pOwor CisKKwkvKiBjb3B5IGFwcHJvcHJpYXRlIGRhdGEgZm9yayBtZXRhZGF0YSAq LworCXN3aXRjaCAoZGlwLT5kaV9jb3JlLmRpX21vZGUgJiBTX0lGTVQpIHsK KwkJY2FzZSBTX0lGRElSOgorCQkJbWVtc2V0KCZkaXJfZGF0YSwgMCwgc2l6 ZW9mKGRpcl9kYXRhKSk7CisJCQlzdWNjZXNzID0gcHJvY2Vzc19pbm9kZV9k YXRhKGRpcCwgVFlQX0RJUjIpOworCQkJYnJlYWs7CisJCWNhc2UgU19JRkxO SzoKKwkJCXN1Y2Nlc3MgPSBwcm9jZXNzX2lub2RlX2RhdGEoZGlwLCBUWVBf U1lNTElOSyk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXN1Y2Nlc3Mg PSBwcm9jZXNzX2lub2RlX2RhdGEoZGlwLCBUWVBfREFUQSk7CisJfQorCWNs ZWFyX25hbWV0YWJsZSgpOworCisJLyogY29weSBleHRlbmRlZCBhdHRyaWJ1 dGVzIGlmIHRoZXkgZXhpc3QgKi8KKwlpZiAoc3VjY2VzcyAmJiBkaXAtPmRp X2NvcmUuZGlfZm9ya29mZikgeworCQlhdHRyX2RhdGEucmVtb3RlX3ZhbF9j b3VudCA9IDA7CisJCXN3aXRjaCAoZGlwLT5kaV9jb3JlLmRpX2Fmb3JtYXQp IHsKKwkJCWNhc2UgWEZTX0RJTk9ERV9GTVRfTE9DQUw6CisJCQkJaWYgKCFk b250X29iZnVzY2F0ZSkKKwkJCQkJb2JmdXNjYXRlX3NmX2F0dHIoZGlwKTsK KwkJCQlicmVhazsKKworCQkJY2FzZSBYRlNfRElOT0RFX0ZNVF9FWFRFTlRT OgorCQkJCXN1Y2Nlc3MgPSBwcm9jZXNzX2V4aW5vZGUoZGlwLCBUWVBfQVRU Uik7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgWEZTX0RJTk9ERV9GTVRfQlRS RUU6CisJCQkJc3VjY2VzcyA9IHByb2Nlc3NfYnRpbm9kZShkaXAsIFRZUF9B VFRSKTsKKwkJCQlicmVhazsKKwkJfQorCQljbGVhcl9uYW1ldGFibGUoKTsK Kwl9CisKKwkvKiByZXN0b3JlIHRoZSBjb3JlIGJhY2sgdG8gaXQncyBvcmln aW5hbCBlbmRpYW5lc3MgKi8KKwltZW1jcHkoJmRpcC0+ZGlfY29yZSwgJm9k aWMsIHNpemVvZih4ZnNfZGlub2RlX2NvcmVfdCkpOworCisJcmV0dXJuIHN1 Y2Nlc3M7Cit9CisKK3N0YXRpYyBfX3VpbnQzMl90CWlub2Rlc19jb3BpZWQg PSAwOworCitzdGF0aWMgaW50Citjb3B5X2lub2RlX2NodW5rKAorCXhmc19h Z251bWJlcl90IAkJYWdubywKKwl4ZnNfaW5vYnRfcmVjX3QgCSpycCkKK3sK Kwl4ZnNfYWdpbm9fdCAJCWFnaW5vOworCWludAkJCW9mZjsKKwl4ZnNfYWdi bG9ja190CQlhZ2JubzsKKwlpbnQJCQlpOworCisJYWdpbm8gPSBiZTMyX3Rv X2NwdShycC0+aXJfc3RhcnRpbm8pOworCWFnYm5vID0gWEZTX0FHSU5PX1RP X0FHQk5PKG1wLCBhZ2lubyk7CisJb2ZmID0gWEZTX0lOT19UT19PRkZTRVQo bXAsIGFnaW5vKTsKKworCXB1c2hfY3VyKCk7CisJc2V0X2N1cigmdHlwdGFi W1RZUF9JTk9ERV0sIFhGU19BR0JfVE9fREFERFIobXAsIGFnbm8sIGFnYm5v KSwKKwkJCVhGU19GU0JfVE9fQkIobXAsIFhGU19JQUxMT0NfQkxPQ0tTKG1w KSksCisJCQlEQl9SSU5HX0lHTiwgTlVMTCk7CisJaWYgKGlvY3VyX3RvcC0+ ZGF0YSA9PSBOVUxMKSB7CisJCXByaW50X3dhcm5pbmcoImNhbm5vdCByZWFk IGlub2RlIGJsb2NrICV1LyV1IiwgYWdubywgYWdibm8pOworCQlyZXR1cm4g IXN0b3Bfb25fcmVhZF9lcnJvcjsKKwl9CisKKwkvKgorCSAqIHNjYW4gdGhy b3VnaCBpbm9kZXMgYW5kIGNvcHkgYW55IGJ0cmVlIGV4dGVudCBsaXN0cywg ZGlyZWN0b3J5CisJICogY29udGVudHMgYW5kIGV4dGVuZGVkIGF0dHJpYnV0 ZXMuCisJICovCisKKwlmb3IgKGkgPSAwOyBpIDwgWEZTX0lOT0RFU19QRVJf Q0hVTks7IGkrKykgeworCQl4ZnNfZGlub2RlX3QgICAgICAgICAgICAqZGlw OworCisJCWlmIChYRlNfSU5PQlRfSVNfRlJFRV9ESVNLKHJwLCBpKSkKKwkJ CWNvbnRpbnVlOworCisJCWRpcCA9ICh4ZnNfZGlub2RlX3QgKikoKGNoYXIg Kilpb2N1cl90b3AtPmRhdGEgKworCQkJCSgob2ZmICsgaSkgPDwgbXAtPm1f c2Iuc2JfaW5vZGVsb2cpKTsKKworCQlpZiAoIXByb2Nlc3NfaW5vZGUoYWdu bywgYWdpbm8gKyBpLCBkaXApKQorCQkJcmV0dXJuIDA7CisJfQorCisJaWYg KCF3cml0ZV9idWYoaW9jdXJfdG9wKSkKKwkJcmV0dXJuIDA7CisKKwlpbm9k ZXNfY29waWVkICs9IFhGU19JTk9ERVNfUEVSX0NIVU5LOworCisJaWYgKHNo b3dfcHJvZ3Jlc3MpCisJCXByaW50X3Byb2dyZXNzKCJDb3BpZWQgJXUgb2Yg JXUgaW5vZGVzICgldSBvZiAldSBBR3MpIiwKKwkJCQlpbm9kZXNfY29waWVk LCBtcC0+bV9zYi5zYl9pY291bnQsIGFnbm8sCisJCQkJbXAtPm1fc2Iuc2Jf YWdjb3VudCk7CisKKwlwb3BfY3VyKCk7CisKKwlyZXR1cm4gMTsKK30KKwor c3RhdGljIGludAorc2NhbmZ1bmNfaW5vKAorCXhmc19idHJlZV9oZHJfdAkJ KmJ0aGRyLAorCXhmc19hZ251bWJlcl90CQlhZ25vLAorCXhmc19hZ2Jsb2Nr X3QJCWFnYm5vLAorCWludAkJCWxldmVsLAorCXR5cG5tX3QJCQlidHlwZSwK Kwl2b2lkCQkJKmFyZykKK3sKKwl4ZnNfaW5vYnRfcmVjX3QJCSpycDsKKwl4 ZnNfaW5vYnRfcHRyX3QJCSpwcDsKKwlpbnQJCQlpOworCisJaWYgKGxldmVs ID09IDApIHsKKwkJcnAgPSBYRlNfQlRSRUVfUkVDX0FERFIobXAtPm1fc2Iu c2JfYmxvY2tzaXplLCB4ZnNfaW5vYnQsCisJCQkJYnRoZHIsIDEsIG1wLT5t X2lub2J0X214clswXSk7CisJCWZvciAoaSA9IDA7IGkgPCBiZTE2X3RvX2Nw dShidGhkci0+YmJfbnVtcmVjcyk7IGkrKywgcnArKykgeworCQkJaWYgKCFj b3B5X2lub2RlX2NodW5rKGFnbm8sIHJwKSkKKwkJCQlyZXR1cm4gMDsKKwkJ fQorCX0gZWxzZSB7CisJCXBwID0gWEZTX0JUUkVFX1BUUl9BRERSKG1wLT5t X3NiLnNiX2Jsb2Nrc2l6ZSwgeGZzX2lub2J0LAorCQkJCWJ0aGRyLCAxLCBt cC0+bV9pbm9idF9teHJbMV0pOworCQlmb3IgKGkgPSAwOyBpIDwgYmUxNl90 b19jcHUoYnRoZHItPmJiX251bXJlY3MpOyBpKyspIHsKKwkJCWlmICghdmFs aWRfYm5vKGJlMzJfdG9fY3B1KHBwW2ldKSwgYWdubywgYWdibm8sIGJ0eXBl KSkKKwkJCQljb250aW51ZTsKKwkJCWlmICghc2Nhbl9idHJlZShhZ25vLCBi ZTMyX3RvX2NwdShwcFtpXSksIGxldmVsLAorCQkJCQlidHlwZSwgYXJnLCBz Y2FuZnVuY19pbm8pKQorCQkJCXJldHVybiAwOworCQl9CisJfQorCXJldHVy biAxOworfQorCitzdGF0aWMgaW50Citjb3B5X2lub2RlcygKKwl4ZnNfYWdu dW1iZXJfdAkJYWdubywKKwl4ZnNfYWdpX3QJCSphZ2kpCit7CisJeGZzX2Fn YmxvY2tfdAkJcm9vdDsKKwlpbnQJCQlsZXZlbHM7CisKKwlyb290ID0gYmUz Ml90b19jcHUoYWdpLT5hZ2lfcm9vdCk7CisJbGV2ZWxzID0gYmUzMl90b19j cHUoYWdpLT5hZ2lfbGV2ZWwpOworCisJLyogdmFsaWRhdGUgcm9vdCBhbmQg bGV2ZWxzIGJlZm9yZSBwcm9jZXNzaW5nIHRoZSB0cmVlICovCisJaWYgKHJv b3QgPT0gMCB8fCByb290ID4gbXAtPm1fc2Iuc2JfYWdibG9ja3MpIHsKKwkJ aWYgKHNob3dfd2FybmluZ3MpCisJCQlwcmludF93YXJuaW5nKCJpbnZhbGlk IGJsb2NrIG51bWJlciAoJXUpIGluIGlub2J0ICIKKwkJCQkJInJvb3QgaW4g YWdpICV1Iiwgcm9vdCwgYWdubyk7CisJCXJldHVybiAxOworCX0KKwlpZiAo bGV2ZWxzID49IFhGU19CVFJFRV9NQVhMRVZFTFMpIHsKKwkJaWYgKHNob3df d2FybmluZ3MpCisJCQlwcmludF93YXJuaW5nKCJpbnZhbGlkIGxldmVsICgl dSkgaW4gaW5vYnQgcm9vdCAiCisJCQkJCSJpbiBhZ2kgJXUiLCBsZXZlbHMs IGFnbm8pOworCQlyZXR1cm4gMTsKKwl9CisKKwlyZXR1cm4gc2Nhbl9idHJl ZShhZ25vLCByb290LCBsZXZlbHMsIFRZUF9JTk9CVCwgYWdpLCBzY2FuZnVu Y19pbm8pOworfQorCitzdGF0aWMgaW50CitzY2FuX2FnKAorCXhmc19hZ251 bWJlcl90CWFnbm8pCit7CisJeGZzX2FnZl90CSphZ2Y7CisJeGZzX2FnaV90 CSphZ2k7CisKKwkvKiBjb3B5IHRoZSBzdXBlcmJsb2NrIG9mIHRoZSBBRyAq LworCXB1c2hfY3VyKCk7CisJc2V0X2N1cigmdHlwdGFiW1RZUF9TQl0sIFhG U19BR19EQUREUihtcCwgYWdubywgWEZTX1NCX0RBRERSKSwKKwkJCVhGU19G U1NfVE9fQkIobXAsIDEpLCBEQl9SSU5HX0lHTiwgTlVMTCk7CisJaWYgKCFp b2N1cl90b3AtPmRhdGEpIHsKKwkJcHJpbnRfd2FybmluZygiY2Fubm90IHJl YWQgc3VwZXJibG9jayBmb3IgYWcgJXUiLCBhZ25vKTsKKwkJaWYgKHN0b3Bf b25fcmVhZF9lcnJvcikKKwkJCXJldHVybiAwOworCX0gZWxzZSB7CisJCWlm ICghd3JpdGVfYnVmKGlvY3VyX3RvcCkpCisJCQlyZXR1cm4gMDsKKwl9CisK KwkvKiBjb3B5IHRoZSBBRyBmcmVlIHNwYWNlIGJ0cmVlIHJvb3QgKi8KKwlw dXNoX2N1cigpOworCXNldF9jdXIoJnR5cHRhYltUWVBfQUdGXSwgWEZTX0FH X0RBRERSKG1wLCBhZ25vLCBYRlNfQUdGX0RBRERSKG1wKSksCisJCQlYRlNf RlNTX1RPX0JCKG1wLCAxKSwgREJfUklOR19JR04sIE5VTEwpOworCWFnZiA9 IGlvY3VyX3RvcC0+ZGF0YTsKKwlpZiAoaW9jdXJfdG9wLT5kYXRhID09IE5V TEwpIHsKKwkJcHJpbnRfd2FybmluZygiY2Fubm90IHJlYWQgYWdmIGJsb2Nr IGZvciBhZyAldSIsIGFnbm8pOworCQlpZiAoc3RvcF9vbl9yZWFkX2Vycm9y KQorCQkJcmV0dXJuIDA7CisJfSBlbHNlIHsKKwkJaWYgKCF3cml0ZV9idWYo aW9jdXJfdG9wKSkKKwkJCXJldHVybiAwOworCX0KKworCS8qIGNvcHkgdGhl IEFHIGlub2RlIGJ0cmVlIHJvb3QgKi8KKwlwdXNoX2N1cigpOworCXNldF9j dXIoJnR5cHRhYltUWVBfQUdJXSwgWEZTX0FHX0RBRERSKG1wLCBhZ25vLCBY RlNfQUdJX0RBRERSKG1wKSksCisJCQlYRlNfRlNTX1RPX0JCKG1wLCAxKSwg REJfUklOR19JR04sIE5VTEwpOworCWFnaSA9IGlvY3VyX3RvcC0+ZGF0YTsK KwlpZiAoaW9jdXJfdG9wLT5kYXRhID09IE5VTEwpIHsKKwkJcHJpbnRfd2Fy bmluZygiY2Fubm90IHJlYWQgYWdpIGJsb2NrIGZvciBhZyAldSIsIGFnbm8p OworCQlpZiAoc3RvcF9vbl9yZWFkX2Vycm9yKQorCQkJcmV0dXJuIDA7CisJ fSBlbHNlIHsKKwkJaWYgKCF3cml0ZV9idWYoaW9jdXJfdG9wKSkKKwkJCXJl dHVybiAwOworCX0KKworCS8qIGNvcHkgdGhlIEFHIGZyZWUgbGlzdCBoZWFk ZXIgKi8KKwlwdXNoX2N1cigpOworCXNldF9jdXIoJnR5cHRhYltUWVBfQUdG TF0sIFhGU19BR19EQUREUihtcCwgYWdubywgWEZTX0FHRkxfREFERFIobXAp KSwKKwkJCVhGU19GU1NfVE9fQkIobXAsIDEpLCBEQl9SSU5HX0lHTiwgTlVM TCk7CisJaWYgKGlvY3VyX3RvcC0+ZGF0YSA9PSBOVUxMKSB7CisJCXByaW50 X3dhcm5pbmcoImNhbm5vdCByZWFkIGFnZmwgYmxvY2sgZm9yIGFnICV1Iiwg YWdubyk7CisJCWlmIChzdG9wX29uX3JlYWRfZXJyb3IpCisJCQlyZXR1cm4g MDsKKwl9IGVsc2UgeworCQlpZiAoIXdyaXRlX2J1Zihpb2N1cl90b3ApKQor CQkJcmV0dXJuIDA7CisJfQorCXBvcF9jdXIoKTsKKworCS8qIGNvcHkgQUcg ZnJlZSBzcGFjZSBidHJlZXMgKi8KKwlpZiAoYWdmKSB7CisJCWlmIChzaG93 X3Byb2dyZXNzKQorCQkJcHJpbnRfcHJvZ3Jlc3MoIkNvcHlpbmcgZnJlZSBz cGFjZSB0cmVlcyBvZiBBRyAldSIsCisJCQkJCWFnbm8pOworCQlpZiAoIWNv cHlfZnJlZV9ibm9fYnRyZWUoYWdubywgYWdmKSkKKwkJCXJldHVybiAwOwor CQlpZiAoIWNvcHlfZnJlZV9jbnRfYnRyZWUoYWdubywgYWdmKSkKKwkJCXJl dHVybiAwOworCX0KKworCS8qIGNvcHkgaW5vZGUgYnRyZWVzIGFuZCB0aGUg aW5vZGVzIGFuZCB0aGVpciBhc3NvY2lhdGVkIG1ldGFkYXRhICovCisJaWYg KGFnaSkgeworCQlpZiAoIWNvcHlfaW5vZGVzKGFnbm8sIGFnaSkpCisJCQly ZXR1cm4gMDsKKwl9CisKKwlwb3BfY3VyKCk7CisJcG9wX2N1cigpOworCXBv cF9jdXIoKTsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50Citjb3B5 X2lubygKKwl4ZnNfaW5vX3QJCWlubywKKwl0eXBubV90CQkJaXR5cGUpCit7 CisJeGZzX2FnbnVtYmVyX3QJCWFnbm87CisJeGZzX2FnYmxvY2tfdAkJYWdi bm87CisJeGZzX2FnaW5vX3QJCWFnaW5vOworCXhmc19kaW5vZGVfdAkJKmRp cDsKKwl4ZnNfZGlub2RlX2NvcmVfdAl0ZGljOworCWludAkJCW9mZnNldDsK KworCWlmIChpbm8gPT0gMCkKKwkJcmV0dXJuIDE7CisKKwlhZ25vID0gWEZT X0lOT19UT19BR05PKG1wLCBpbm8pOworCWFnaW5vID0gWEZTX0lOT19UT19B R0lOTyhtcCwgaW5vKTsKKwlhZ2JubyA9IFhGU19BR0lOT19UT19BR0JOTyht cCwgYWdpbm8pOworCW9mZnNldCA9IFhGU19BR0lOT19UT19PRkZTRVQobXAs IGFnaW5vKTsKKworCWlmIChhZ25vID49IG1wLT5tX3NiLnNiX2FnY291bnQg fHwgYWdibm8gPj0gbXAtPm1fc2Iuc2JfYWdibG9ja3MgfHwKKwkJCW9mZnNl dCA+PSBtcC0+bV9zYi5zYl9pbm9wYmxvY2spIHsKKwkJaWYgKHNob3dfd2Fy bmluZ3MpCisJCQlwcmludF93YXJuaW5nKCJpbnZhbGlkICVzIGlub2RlIG51 bWJlciAoJWxsZCkiLAorCQkJCQl0eXB0YWJbaXR5cGVdLm5hbWUsIChsb25n IGxvbmcpaW5vKTsKKwkJcmV0dXJuIDE7CisJfQorCisJcHVzaF9jdXIoKTsK KwlzZXRfY3VyKCZ0eXB0YWJbVFlQX0lOT0RFXSwgWEZTX0FHQl9UT19EQURE UihtcCwgYWdubywgYWdibm8pLAorCQkJYmxrYmIsIERCX1JJTkdfSUdOLCBO VUxMKTsKKwlpZiAoaW9jdXJfdG9wLT5kYXRhID09IE5VTEwpIHsKKwkJcHJp bnRfd2FybmluZygiY2Fubm90IHJlYWQgJXMgaW5vZGUgJWxsZCIsCisJCQkJ dHlwdGFiW2l0eXBlXS5uYW1lLCAobG9uZyBsb25nKWlubyk7CisJCXJldHVy biAhc3RvcF9vbl9yZWFkX2Vycm9yOworCX0KKwlvZmZfY3VyKG9mZnNldCA8 PCBtcC0+bV9zYi5zYl9pbm9kZWxvZywgbXAtPm1fc2Iuc2JfaW5vZGVzaXpl KTsKKworCWRpcCA9IGlvY3VyX3RvcC0+ZGF0YTsKKwlsaWJ4ZnNfeGxhdGVf ZGlub2RlX2NvcmUoKHhmc19jYWRkcl90KSZkaXAtPmRpX2NvcmUsICZ0ZGlj LCAxKTsKKwltZW1jcHkoJmRpcC0+ZGlfY29yZSwgJnRkaWMsIHNpemVvZih4 ZnNfZGlub2RlX2NvcmVfdCkpOworCisJY3VyX2lubyA9IGlubzsKKwlyZXR1 cm4gcHJvY2Vzc19pbm9kZV9kYXRhKGRpcCwgaXR5cGUpOworfQorCisKK3N0 YXRpYyBpbnQKK2NvcHlfc2JfaW5vZGVzKHZvaWQpCit7CisJaWYgKCFjb3B5 X2lubyhtcC0+bV9zYi5zYl9yYm1pbm8sIFRZUF9SVEJJVE1BUCkpCisJCXJl dHVybiAwOworCisJaWYgKCFjb3B5X2lubyhtcC0+bV9zYi5zYl9yc3VtaW5v LCBUWVBfUlRTVU1NQVJZKSkKKwkJcmV0dXJuIDA7CisKKwlpZiAoIWNvcHlf aW5vKG1wLT5tX3NiLnNiX3VxdW90aW5vLCBUWVBfRFFCTEspKQorCQlyZXR1 cm4gMDsKKworCXJldHVybiBjb3B5X2lubyhtcC0+bV9zYi5zYl9ncXVvdGlu bywgVFlQX0RRQkxLKTsKK30KKworc3RhdGljIGludAorY29weV9sb2codm9p ZCkKK3sKKwlpZiAoc2hvd19wcm9ncmVzcykKKwkJcHJpbnRfcHJvZ3Jlc3Mo IkNvcHlpbmcgbG9nIik7CisKKwlwdXNoX2N1cigpOworCXNldF9jdXIoJnR5 cHRhYltUWVBfTE9HXSwgWEZTX0ZTQl9UT19EQUREUihtcCwgbXAtPm1fc2Iu c2JfbG9nc3RhcnQpLAorCQkJbXAtPm1fc2Iuc2JfbG9nYmxvY2tzICogYmxr YmIsIERCX1JJTkdfSUdOLCBOVUxMKTsKKwlpZiAoaW9jdXJfdG9wLT5kYXRh ID09IE5VTEwpIHsKKwkJcHJpbnRfd2FybmluZygiY2Fubm90IHJlYWQgbG9n Iik7CisJCXJldHVybiAhc3RvcF9vbl9yZWFkX2Vycm9yOworCX0KKwlyZXR1 cm4gd3JpdGVfYnVmKGlvY3VyX3RvcCk7Cit9CisKK3N0YXRpYyBpbnQKK21l dGFkdW1wX2YoCisJaW50IAkJYXJnYywKKwljaGFyIAkJKiphcmd2KQorewor CXhmc19hZ251bWJlcl90CWFnbm87CisJaW50CQljOworCWludAkJc3RhcnRf aW9jdXJfc3A7CisKKwlleGl0Y29kZSA9IDE7CisJc2hvd19wcm9ncmVzcyA9 IDA7CisJc2hvd193YXJuaW5ncyA9IDA7CisJc3RvcF9vbl9yZWFkX2Vycm9y ID0gMDsKKworCWlmIChtcC0+bV9zYi5zYl9tYWdpY251bSAhPSBYRlNfU0Jf TUFHSUMpIHsKKwkJcHJpbnRfd2FybmluZygiYmFkIHN1cGVyYmxvY2sgbWFn aWMgbnVtYmVyICV4LCBnaXZpbmcgdXAiLAorCQkJCW1wLT5tX3NiLnNiX21h Z2ljbnVtKTsKKwkJcmV0dXJuIDA7CisJfQorCisJd2hpbGUgKChjID0gZ2V0 b3B0KGFyZ2MsIGFyZ3YsICJlZ293IikpICE9IEVPRikgeworCQlzd2l0Y2gg KGMpIHsKKwkJCWNhc2UgJ2UnOgorCQkJCXN0b3Bfb25fcmVhZF9lcnJvciA9 IDE7CisJCQkJYnJlYWs7CisJCQljYXNlICdnJzoKKwkJCQlzaG93X3Byb2dy ZXNzID0gMTsKKwkJCQlicmVhazsKKwkJCWNhc2UgJ28nOgorCQkJCWRvbnRf b2JmdXNjYXRlID0gMTsKKwkJCQlicmVhazsKKwkJCWNhc2UgJ3cnOgorCQkJ CXNob3dfd2FybmluZ3MgPSAxOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoK KwkJCQlwcmludF93YXJuaW5nKCJiYWQgb3B0aW9uIGZvciBtZXRhZHVtcCBj b21tYW5kIik7CisJCQkJcmV0dXJuIDA7CisJCX0KKwl9CisKKwlpZiAob3B0 aW5kICE9IGFyZ2MgLSAxKSB7CisJCXByaW50X3dhcm5pbmcoInRvbyBmZXcg b3B0aW9ucyBmb3IgbWV0YWR1bXAgKG5vIGZpbGVuYW1lIGdpdmVuKSIpOwor CQlyZXR1cm4gMDsKKwl9CisKKwltZXRhYmxvY2sgPSAoeGZzX21ldGFibG9j a190ICopY2FsbG9jKEJCU0laRSArIDEsIEJCU0laRSk7CisJaWYgKG1ldGFi bG9jayA9PSBOVUxMKSB7CisJCXByaW50X3dhcm5pbmcoIm1lbW9yeSBhbGxv Y2F0aW9uIGZhaWx1cmUiKTsKKwkJcmV0dXJuIDA7CisJfQorCW1ldGFibG9j ay0+bWJfYmxvY2tsb2cgPSBCQlNISUZUOworCW1ldGFibG9jay0+bWJfbWFn aWMgPSBjcHVfdG9fYmUzMihYRlNfTURfTUFHSUMpOworCisJaWYgKCFjcmVh dGVfbmFtZXRhYmxlKCkpIHsKKwkJcHJpbnRfd2FybmluZygibWVtb3J5IGFs bG9jYXRpb24gZmFpbHVyZSIpOworCQlmcmVlKG1ldGFibG9jayk7CisJCXJl dHVybiAwOworCX0KKworCWJsb2NrX2luZGV4ID0gKF9fYmU2NCAqKSgoY2hh ciAqKW1ldGFibG9jayArIHNpemVvZih4ZnNfbWV0YWJsb2NrX3QpKTsKKwli bG9ja19idWZmZXIgPSAoY2hhciAqKW1ldGFibG9jayArIEJCU0laRTsKKwlu dW1faW5kaWNpZXMgPSAoQkJTSVpFIC0gc2l6ZW9mKHhmc19tZXRhYmxvY2tf dCkpIC8gc2l6ZW9mKF9fYmU2NCk7CisJY3VyX2luZGV4ID0gMDsKKwlzdGFy dF9pb2N1cl9zcCA9IGlvY3VyX3NwOworCisJaWYgKHN0cmNtcChhcmd2W29w dGluZF0sICItIikgPT0gMCkgeworCQlpZiAoaXNhdHR5KGZpbGVubyhzdGRv dXQpKSkgeworCQkJcHJpbnRfd2FybmluZygiY2Fubm90IHdyaXRlIHRvIGEg dGVybWluYWwiKTsKKwkJCWZyZWUobmFtZXRhYmxlKTsKKwkJCWZyZWUobWV0 YWJsb2NrKTsKKwkJCXJldHVybiAwOworCQl9CisJCW91dGYgPSBzdGRvdXQ7 CisJfSBlbHNlIHsKKwkJb3V0ZiA9IGZvcGVuKGFyZ3Zbb3B0aW5kXSwgIndi Iik7CisJCWlmIChvdXRmID09IE5VTEwpIHsKKwkJCXByaW50X3dhcm5pbmco ImNhbm5vdCBjcmVhdGUgZHVtcCBmaWxlIik7CisJCQlmcmVlKG5hbWV0YWJs ZSk7CisJCQlmcmVlKG1ldGFibG9jayk7CisJCQlyZXR1cm4gMDsKKwkJfQor CX0KKworCWV4aXRjb2RlID0gMDsKKworCWZvciAoYWdubyA9IDA7IGFnbm8g PCBtcC0+bV9zYi5zYl9hZ2NvdW50OyBhZ25vKyspIHsKKwkJaWYgKCFzY2Fu X2FnKGFnbm8pKSB7CisJCQlleGl0Y29kZSA9IDE7CisJCQlicmVhazsKKwkJ fQorCX0KKworCS8qIGNvcHkgcmVhbHRpbWUgYW5kIHF1b3RhIGlub2RlIGNv bnRlbnRzICovCisJaWYgKCFleGl0Y29kZSkKKwkJZXhpdGNvZGUgPSAhY29w eV9zYl9pbm9kZXMoKTsKKworCS8qIGNvcHkgbG9nIGlmIGl0J3MgaW50ZXJu YWwgKi8KKwlpZiAoKG1wLT5tX3NiLnNiX2xvZ3N0YXJ0ICE9IDApICYmICFl eGl0Y29kZSkKKwkJZXhpdGNvZGUgPSAhY29weV9sb2coKTsKKworCS8qIHdy aXRlIHRoZSByZW1haW5pbmcgaW5kZXggKi8KKwlpZiAoIWV4aXRjb2RlKQor CQlleGl0Y29kZSA9ICF3cml0ZV9pbmRleCgpOworCisJaWYgKHByb2dyZXNz X3NpbmNlX3dhcm5pbmcpCisJCWZwdXRjKCdcbicsIChvdXRmID09IHN0ZG91 dCkgPyBzdGRlcnIgOiBzdGRvdXQpOworCisJaWYgKG91dGYgIT0gc3Rkb3V0 KQorCQlmY2xvc2Uob3V0Zik7CisKKwkvKiBjbGVhbnVwIGlvY3VyIHN0YWNr ICovCisJd2hpbGUgKGlvY3VyX3NwID4gc3RhcnRfaW9jdXJfc3ApCisJCXBv cF9jdXIoKTsKKworCWZyZWUobmFtZXRhYmxlKTsKKwlmcmVlKG1ldGFibG9j ayk7CisKKwlyZXR1cm4gMDsKK30KCj09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PQp4ZnNwcm9ncy9kYi9tZXRhZHVtcC5oCj09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PQoKLS0tIGEveGZzcHJvZ3MvZGIvbWV0YWR1bXAu aAkyMDA2LTA2LTE3IDAwOjU4OjI0LjAwMDAwMDAwMCArMTAwMAorKysgYi94 ZnNwcm9ncy9kYi9tZXRhZHVtcC5oCTIwMDctMDUtMTggMTI6MDc6NTcuMzE0 MDIzNzc4ICsxMDAwCkBAIC0wLDAgKzEsMTkgQEAKKy8qCisgKiBDb3B5cmln aHQgKGMpIDIwMDcgU2lsaWNvbiBHcmFwaGljcywgSW5jLgorICogQWxsIFJp Z2h0cyBSZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBz b2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBt b2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQ dWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNv ZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRp c3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVs LAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4g dGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBv ciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUK KyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFp bHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBv ZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdp dGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3 YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCAgNTEgRnJhbmtsaW4gU3QsIEZp ZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqLwor CitleHRlcm4gdm9pZAltZXRhZHVtcF9pbml0KHZvaWQpOwoKPT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09Cnhmc3Byb2dzL2RiL3hmc19tZXRhZHVt cC5zaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCi0tLSBhL3hm c3Byb2dzL2RiL3hmc19tZXRhZHVtcC5zaAkyMDA2LTA2LTE3IDAwOjU4OjI0 LjAwMDAwMDAwMCArMTAwMAorKysgYi94ZnNwcm9ncy9kYi94ZnNfbWV0YWR1 bXAuc2gJMjAwNy0wNS0yOCAxNDo1OToxMi44MTc4NTA5MjEgKzEwMDAKQEAg LTAsMCArMSwzOCBAQAorIyEvYmluL3NoIC1mCisjCisjIENvcHlyaWdodCAo YykgMjAwNyBTaWxpY29uIEdyYXBoaWNzLCBJbmMuICBBbGwgUmlnaHRzIFJl c2VydmVkLgorIworCitPUFRTPSIgIgorREJPUFRTPSIgIgorVVNBR0U9IlVz YWdlOiB4ZnNfbWV0YWR1bXAgWy1lZm9nd1ZdIFstbCBsb2dkZXZdIHNvdXJj ZSB0YXJnZXQiCisKK3doaWxlIGdldG9wdHMgImVmZ2w6b3dWIiBjCitkbwor CWNhc2UgJGMgaW4KKwllKQlPUFRTPSRPUFRTIi1lICI7OworCWcpCU9QVFM9 JE9QVFMiLWcgIjs7CisJbykJT1BUUz0kT1BUUyItbyAiOzsKKwl3KQlPUFRT PSRPUFRTIi13ICI7OworCWYpCURCT1BUUz0kREJPUFRTIiAtZiI7OworCWwp CURCT1BUUz0kREJPUFRTIiAtbCAiJE9QVEFSRyIgIjs7CisJVikJeGZzX2Ri IC1wIHhmc19tZXRhZHVtcCAtVgorCQlzdGF0dXM9JD8KKwkJZXhpdCAkc3Rh dHVzCisJCTs7CisJXD8pCWVjaG8gJFVTQUdFIDE+JjIKKwkJZXhpdCAyCisJ CTs7CisJZXNhYworZG9uZQorc2V0IC0tIGV4dHJhICRACitzaGlmdCAkT1BU SU5ECitjYXNlICQjIGluCisJMikJeGZzX2RiJERCT1BUUyAtaSAtcCB4ZnNf bWV0YWR1bXAgLWMgIm1ldGFkdW1wJE9QVFMgJDIiICQxCisJCXN0YXR1cz0k PworCQk7OworCSopCWVjaG8gJFVTQUdFIDE+JjIKKwkJZXhpdCAyCisJCTs7 Citlc2FjCitleGl0ICRzdGF0dXMKCj09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PQp4ZnNwcm9ncy9pbmNsdWRlL3hmc19tZXRhZHVtcC5oCj09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PQoKLS0tIGEveGZzcHJvZ3MvaW5j bHVkZS94ZnNfbWV0YWR1bXAuaAkyMDA2LTA2LTE3IDAwOjU4OjI0LjAwMDAw MDAwMCArMTAwMAorKysgYi94ZnNwcm9ncy9pbmNsdWRlL3hmc19tZXRhZHVt cC5oCTIwMDctMDUtMTggMTI6MzE6MDAuODQwNjM1NzgzICsxMDAwCkBAIC0w LDAgKzEsMzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcgU2lsaWNv biBHcmFwaGljcywgSW5jLgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAq CisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiBy ZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhl IHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwor ICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24u CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBo b3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQg QU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFu dHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBB UlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1 YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNo b3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwg UHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBp ZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisg KiBJbmMuLCAgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24s IE1BICAwMjExMC0xMzAxICBVU0EKKyAqLworCisjaWZuZGVmIF9YRlNfTUVU QURVTVBfSF8KKyNkZWZpbmUgX1hGU19NRVRBRFVNUF9IXworCisjZGVmaW5l CVhGU19NRF9NQUdJQwkJMHg1ODQ2NTM0ZAkvKiAnWEZTTScgKi8KKwordHlw ZWRlZiBzdHJ1Y3QgeGZzX21ldGFibG9jayB7CisJX19iZTMyCQltYl9tYWdp YzsKKwlfX2JlMTYJCW1iX2NvdW50OworCV9fdWludDhfdAltYl9ibG9ja2xv ZzsKKwlfX3VpbnQ4X3QJbWJfcmVzZXJ2ZWQ7CisJLyogZm9sbG93ZWQgYnkg YW4gYXJyYXkgb2YgeGZzX2RhZGRyX3QgKi8KK30geGZzX21ldGFibG9ja190 OworCisjZW5kaWYgLyogX1hGU19NRVRBRFVNUF9IXyAqLwo= ------------k9x39jGsayoNr3EUsJAZe6--