From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1757386AbYAHKjg (ORCPT ); Tue, 8 Jan 2008 05:39:36 -0500 Received: (majordomo@vger.kernel.org) by vger.kernel.org id S1754404AbYAHKge (ORCPT ); Tue, 8 Jan 2008 05:36:34 -0500 Received: from ms0.nttdata.co.jp ([163.135.193.231]:42183 "EHLO ms0.nttdata.co.jp" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753865AbYAHKgO (ORCPT ); Tue, 8 Jan 2008 05:36:14 -0500 Message-Id: <20080108094959.648038906@nttdata.co.jp> References: <20080108094903.484613061@nttdata.co.jp> User-Agent: quilt/0.46-1 Date: Tue, 08 Jan 2008 18:49:11 +0900 From: Kentaro Takeda To: akpm@linux-foundation.org Cc: linux-kernel@vger.kernel.org, linux-security-module@vger.kernel.org, Kentaro Takeda , Tetsuo Handa Subject: [TOMOYO #6 08/21] Utility functions and policy manipulation interface. X-OriginalArrivalTime: 08 Jan 2008 09:50:00.0240 (UTC) FILETIME=[D58AF300:01C851DB] MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="boundary-1" Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org --boundary-1 Content-Disposition: inline; filename="tomoyo-common.patch" Content-Type: application/octect-stream Content-Transfer-Encoding: base64 Q29tbW9uIGZ1bmN0aW9ucyBmb3IgVE9NT1lPIExpbnV4Lg0KDQpUT01PWU8gTGludXggdXNlcyAv c3lzL2tlcm5lbC9zZWN1cml0eS90b21veW8gaW50ZXJmYWNlIGZvciBjb25maWd1cmF0aW9uLg0K DQovc3lzL2tlcm5lbC9zZWN1cml0eS90b21veW8vZG9tYWluX3BvbGljeSBpcyB0aGUgZG9tYWlu LWJhc2VkIGFjY2VzcyBwb2xpY3kuDQpBY2Nlc3MgY29udHJvbCBsaXN0IGZvciBmaWxlcywgbmV0 d29ya3MsIGFyZ3ZbMF0sIGVudmlyb25tZW50IHZhcmlhYmxlIG5hbWVzLA0KY2FwYWJpbGl0aWVz IGFuZCBzaWduYWwgaXMgc3RvcmVkIGluIGRvbWFpbl9wb2xpY3kuDQoNCi9zeXMva2VybmVsL3Nl Y3VyaXR5L3RvbW95by9zeXN0ZW1fcG9saWN5IGlzIHRoZSBzeXN0ZW0td2lkZSBhY2Nlc3MgcG9s aWN5Lg0KQWNjZXNzIGNvbnRyb2wgbGlzdCBmb3IgbW91bnQsIHVtb3VudCBhbmQgcGl2b3Rfcm9v dCBpcyBzdG9yZWQgaW4gc3lzdGVtX3BvbGljeS4NCg0KL3N5cy9rZXJuZWwvc2VjdXJpdHkvdG9t b3lvL2V4Y2VwdGlvbl9wb2xpY3kgaXMgdGhlIG90aGVyIHNldHRpbmdzIHN1Y2ggYXMNCmdsb2Jh bGx5IHJlYWRhYmxlIGZpbGVzLCBnbG9iYWxseSB1c2FibGUgZW52aXJvbm1lbnQgdmFyaWFibGUg bmFtZXMsDQpkb21haW4gdHJhbnNpdGlvbiBjb25maWd1cmF0aW9ucyBhbmQgcHJlLWRlZmluZWQg cGF0dGVybmVkIHBhdGhuYW1lcy4NCg0KL3N5cy9rZXJuZWwvc2VjdXJpdHkvdG9tb3lvL3Byb2Zp bGUgaGFzIHNvbWUgcHJvZmlsZXMsIHdoaWNoIGNvbmZpZ3VyZQ0KdGhlIGFjY2VzcyBjb250cm9s IGxldmVsIG9mIFRPTU9ZTyBMaW51eC4gQSBwcm9maWxlIGlzIGFzc2lnbmVkIHRvIGEgZG9tYWlu Lg0KDQpTaWduZWQtb2ZmLWJ5OiBLZW50YXJvIFRha2VkYSA8dGFrZWRha25AbnR0ZGF0YS5jby5q cD4NClNpZ25lZC1vZmYtYnk6IFRldHN1byBIYW5kYSA8cGVuZ3Vpbi1rZXJuZWxASS1sb3ZlLlNB S1VSQS5uZS5qcD4NCi0tLQ0KIHNlY3VyaXR5L3RvbW95by9jb21tb24uYyB8IDI0NTAgKysrKysr KysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysNCiAxIGZpbGUgY2hhbmdl ZCwgMjQ1MCBpbnNlcnRpb25zKCspDQoNCi0tLSAvZGV2L251bGwNCisrKyBsaW51eC0yLjYtbW0v c2VjdXJpdHkvdG9tb3lvL2NvbW1vbi5jDQpAQCAtMCwwICsxLDI0NTAgQEANCisvKg0KKyAqIHNl Y3VyaXR5L3RvbW95by9jb21tb24uYw0KKyAqDQorICogQ29tbW9uIGZ1bmN0aW9ucyBmb3IgVE9N T1lPIExpbnV4Lg0KKyAqLw0KKw0KKyNpbmNsdWRlICJ0b21veW8uaCINCisjaW5jbHVkZSAicmVh bHBhdGguaCINCisNCisjZGVmaW5lIE1BWF9BQ0NFUFRfRU5UUlkgMjA0OA0KKw0KK3N0YXRpYyBp bnQgdG15X3JlYWRfY29udHJvbChzdHJ1Y3QgZmlsZSAqZmlsZSwNCisJCQkgICAgY2hhciBfX3Vz ZXIgKmJ1ZmZlciwNCisJCQkgICAgY29uc3QgaW50IGJ1ZmZlcl9sZW4pOw0KKw0KKy8qKioqKioq KioqKioqKioqKioqKioqKioqICBWQVJJQUJMRVMgICoqKioqKioqKioqKioqKioqKioqKioqKiov DQorDQorLyogL3NiaW4vaW5pdCBzdGFydGVkPyAqLw0KK2Jvb2wgc2Jpbl9pbml0X3N0YXJ0ZWQ7 DQorDQorc3RhdGljIHN0cnVjdCB7DQorCWNvbnN0IGNoYXIgKmtleXdvcmQ7DQorCXVuc2lnbmVk IGludCBjdXJyZW50X3ZhbHVlOw0KKwljb25zdCB1bnNpZ25lZCBpbnQgbWF4X3ZhbHVlOw0KK30g dG15X2NvbnRyb2xbVE1ZX01BWF9DT05UUk9MX0lOREVYXSA9IHsNCisJW1RNWV9DT01NRU5UXSAg ICAgICAgICAgICA9IHsgIkNPTU1FTlQiLCAgICAgICAgICAgICAwLCAwIH0sDQorCVtUTVlfTUFD X0ZPUl9GSUxFXSAgICAgICAgPSB7ICJNQUNfRk9SX0ZJTEUiLCAgICAgICAgMCwgMyB9LA0KKwlb VE1ZX01BQ19GT1JfQVJHVjBdICAgICAgID0geyAiTUFDX0ZPUl9BUkdWMCIsICAgICAgIDAsIDMg fSwNCisJW1RNWV9NQUNfRk9SX0VOVl0gICAgICAgICA9IHsgIk1BQ19GT1JfRU5WIiwgICAgICAg ICAwLCAzIH0sDQorCVtUTVlfTUFDX0ZPUl9ORVRXT1JLXSAgICAgPSB7ICJNQUNfRk9SX05FVFdP UksiLCAgICAgMCwgMyB9LA0KKwlbVE1ZX01BQ19GT1JfU0lHTkFMXSAgICAgID0geyAiTUFDX0ZP Ul9TSUdOQUwiLCAgICAgIDAsIDMgfSwNCisJW1RNWV9ERU5ZX0NPTkNFQUxfTU9VTlRdICA9IHsg IkRFTllfQ09OQ0VBTF9NT1VOVCIsICAwLCAzIH0sDQorCVtUTVlfUkVTVFJJQ1RfTU9VTlRdICAg ICAgPSB7ICJSRVNUUklDVF9NT1VOVCIsICAgICAgMCwgMyB9LA0KKwlbVE1ZX1JFU1RSSUNUX1VN T1VOVF0gICAgID0geyAiUkVTVFJJQ1RfVU5NT1VOVCIsICAgIDAsIDMgfSwNCisJW1RNWV9SRVNU UklDVF9QSVZPVF9ST09UXSA9IHsgIlJFU1RSSUNUX1BJVk9UX1JPT1QiLCAwLCAzIH0sDQorCVtU TVlfTUFYX0FDQ0VQVF9FTlRSWV0gICAgPQ0KKwl7ICJNQVhfQUNDRVBUX0VOVFJZIiwgTUFYX0FD Q0VQVF9FTlRSWSwgSU5UX01BWCB9LA0KKwlbVE1ZX01BWF9HUkFOVF9MT0ddICAgICAgID0geyAi TUFYX0dSQU5UX0xPRyIsICAgICAgIDEwMjQsIElOVF9NQVggfSwNCisJW1RNWV9NQVhfUkVKRUNU X0xPR10gICAgICA9IHsgIk1BWF9SRUpFQ1RfTE9HIiwgICAgICAxMDI0LCBJTlRfTUFYIH0sDQor CVtUTVlfVkVSQk9TRV0gICAgICAgICAgICAgPSB7ICJUT01PWU9fVkVSQk9TRSIsICAgICAgMSwg MSB9LA0KKwlbVE1ZX0FMTE9XX0VORk9SQ0VfR1JBQ0VdID0geyAiQUxMT1dfRU5GT1JDRV9HUkFD RSIsIDAsIDEgfSwNCit9Ow0KKw0KK3N0cnVjdCBwcm9maWxlIHsNCisJdW5zaWduZWQgaW50IHZh bHVlW1RNWV9NQVhfQ09OVFJPTF9JTkRFWF07DQorCWNvbnN0IHN0cnVjdCBwYXRoX2luZm8gKmNv bW1lbnQ7DQorfTsNCisNCitzdGF0aWMgc3RydWN0IHByb2ZpbGUgKnByb2ZpbGVfcHRyW1RNWV9N QVhfUFJPRklMRVNdOw0KKw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqICBVVElMSVRZIEZV TkNUSU9OUyAgKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisNCisvKiBJcyB0aGUgY3VycmVu dCBwcm9jZXNzIHJ1bm5pbmcgYXMgcm9vdD8gKi8NCitzdGF0aWMgaW50IHRteV9pc19yb290KHZv aWQpDQorew0KKwlyZXR1cm4gIWN1cnJlbnQtPnVpZCAmJiAhY3VycmVudC0+ZXVpZDsNCit9DQor DQorLyoqDQorICogdG15X25vcm1hbGl6ZV9saW5lIC0gbWFrZSBhIGxpbmUgdGlkeS4NCisgKiBA YnVmZmVyOiB0aGUgbGluZSB0byBtYWtlIHRpZHkuDQorICoNCisgKiBBbGwgdG9rZW5zIChzdWNo IGFzIHBhdGhuYW1lcykgdXNlZCBpbiBUT01PWU8gTGludXggY29udGFpbnMNCisgKiBvbmx5IEFT Q0lJIHByaW50YWJsZSAoaS5lLiAweDIxLTB4N0UpIHJhbmdlIGNoYXJhY3RlcnMuDQorICogVGhp cyBhbGxvd3MgcG9saWN5IGZpbGVzIGFuZCBhdWRpdGluZyBsb2dzIHNwbGl0IG1vbm90b25pY2Fs bHkNCisgKiB1c2luZyBzcGFjZSAoaS5lLiAnICcpIGFuZCBuZXcgbGluZSAoaS5lLiAnXG4nKSBj aGFyYWN0ZXJzLg0KKyAqDQorICogUmVtb3ZlIGxlYWRpbmcgYW5kIHRyYWlsaW5nIG5vbiBBU0NJ SSBwcmludGFibGUgY2hyYWN0ZXJzIGFuZA0KKyAqIHJlcGxhY2Ugb25lIG9yIG1vcmUgbm9uIEFT Q0lJIHByaW50YWJsZSBjaHJhY3RlcnMgd2l0aCBzaW5nbGUgc3BhY2UuDQorICovDQorc3RhdGlj IHZvaWQgdG15X25vcm1hbGl6ZV9saW5lKHVuc2lnbmVkIGNoYXIgKmJ1ZmZlcikNCit7DQorCXVu c2lnbmVkIGNoYXIgKnNwID0gYnVmZmVyOw0KKwl1bnNpZ25lZCBjaGFyICpkcCA9IGJ1ZmZlcjsN CisJYm9vbCBmaXJzdCA9IDE7DQorDQorCXdoaWxlICgqc3AgJiYgKCpzcCA8PSAweDIwIHx8ICpz cCA+PSAweDdGKSkNCisJCXNwKys7DQorDQorCXdoaWxlICgqc3ApIHsNCisJCWlmICghZmlyc3Qp DQorCQkJKmRwKysgPSAnICc7DQorCQlmaXJzdCA9IDA7DQorCQl3aGlsZSAoKnNwID4gMHgyMCAm JiAqc3AgPCAweDdGKQ0KKwkJCSpkcCsrID0gKnNwKys7DQorCQl3aGlsZSAoKnNwICYmICgqc3Ag PD0gMHgyMCB8fCAqc3AgPj0gMHg3RikpDQorCQkJc3ArKzsNCisJfQ0KKw0KKwkqZHAgPSAnXDAn Ow0KK30NCisNCisvKiBJcyBAYyB0aGUgZmlyc3QgbGV0dGVyIG9mICJcb29vIiBleHByZXNzaW9u PyAqLw0KK3N0YXRpYyBpbnQgdG15X2NoYXJfaXNfMHRvMyhjb25zdCB1bnNpZ25lZCBjaGFyIGMp DQorew0KKwlyZXR1cm4gYyA+PSAnMCcgJiYgYyA8PSAnMyc7DQorfQ0KKw0KKy8qIElzIEBjIHRo ZSBzZWNvbmQgb3IgdGhpcmQgbGV0dGVyIG9mICJcb29vIiBleHByZXNzaW9uPyAqLw0KK3N0YXRp YyBpbnQgdG15X2NoYXJfaXNfMHRvNyhjb25zdCB1bnNpZ25lZCBjaGFyIGMpDQorew0KKwlyZXR1 cm4gYyA+PSAnMCcgJiYgYyA8PSAnNyc7DQorfQ0KKw0KKy8qIElzIEBjIGEgZGVjaW1hbCBsZXR0 ZXI/ICovDQorc3RhdGljIGludCB0bXlfY2hhcl9pc18wdG85KGNvbnN0IHVuc2lnbmVkIGNoYXIg YykNCit7DQorCXJldHVybiBjID49ICcwJyAmJiBjIDw9ICc5JzsNCit9DQorDQorLyogSXMgQGMg YSBoZXhhZGVjaW1hbCBsZXR0ZXI/ICovDQorc3RhdGljIGludCB0bXlfY2hhcl9pc19oZXgoY29u c3QgdW5zaWduZWQgY2hhciBjKQ0KK3sNCisJcmV0dXJuIChjID49ICcwJyAmJiBjIDw9ICc5Jykg fHwgKGMgPj0gJ0EnICYmIGMgPD0gJ0YnKQ0KKwkJfHwgKGMgPj0gJ2EnICYmIGMgPD0gJ2YnKTsN Cit9DQorDQorLyogSXMgQGMgYW4gYWxwaGFiZXQgbGV0dGVyPyAqLw0KK3N0YXRpYyBpbnQgdG15 X2NoYXJfaXNfYWxwaGEoY29uc3QgdW5zaWduZWQgY2hhciBjKQ0KK3sNCisJcmV0dXJuIChjID49 ICdBJyAmJiBjIDw9ICdaJykgfHwgKGMgPj0gJ2EnICYmIGMgPD0gJ3onKTsNCit9DQorDQorLyog Q29udmVydCBcb29vIHN0eWxlIGV4cHJlc3Npb24gdG8gYSBieXRlLiAqLw0KK3N0YXRpYyB1bnNp Z25lZCBjaGFyIHRteV9zdHIyY2hyKGNvbnN0IHVuc2lnbmVkIGNoYXIgYywNCisJCQkJIGNvbnN0 IHVuc2lnbmVkIGNoYXIgZCwNCisJCQkJIGNvbnN0IHVuc2lnbmVkIGNoYXIgZSkNCit7DQorCXJl dHVybiAoKCh1bnNpZ25lZCBjaGFyKSAoYyAtICcwJykpIDw8IDYpICsNCisJCSgoKHVuc2lnbmVk IGNoYXIpIChkIC0gJzAnKSkgPDwgMykgKw0KKwkJKCgodW5zaWduZWQgY2hhcikgKGUgLSAnMCcp KSk7DQorfQ0KKw0KKy8qIERvZXMgdGhlIEBzcmMgc3RhcnRzIHdpdGggQGZpbmQ/ICovDQorc3Rh dGljIGludCB0bXlfc3Ryc3RhcnRzKGNoYXIgKipzcmMsIGNvbnN0IGNoYXIgKmZpbmQpDQorew0K Kwljb25zdCBpbnQgbGVuID0gc3RybGVuKGZpbmQpOw0KKwljaGFyICp0bXAgPSAqc3JjOw0KKw0K KwlpZiAoc3RybmNtcCh0bXAsIGZpbmQsIGxlbikgPT0gMCkgew0KKwkJdG1wICs9IGxlbjsNCisJ CSpzcmMgPSB0bXA7DQorCQlyZXR1cm4gMTsNCisJfQ0KKw0KKwlyZXR1cm4gMDsNCit9DQorDQor LyoqDQorICogdG15X2NvcnJlY3RfcGF0aCAtIHZhbGlkYXRlIGEgcGF0aG5hbWUuDQorICogQGZp bGVuYW1lOiAgICAgdGhlIHBhdGhuYW1lIHRvIGNoZWNrDQorICogQHN0YXJ0X3R5cGU6ICAgMSBp ZiB0aGUgcGF0aG5hbWUgbXVzdCBzdGFydCB3aXRoICcvJw0KKyAqICAgICAgICAgICAgICAgIC0x IGlmIHRoZSBwYXRobmFtZSBtdXN0IG5vdCBzdGFydCB3aXRoICcvJw0KKyAqICAgICAgICAgICAg ICAgIDAgaWYgaXQgZG9lcyBub3QgbWF0dGVyDQorICogQHBhdHRlcm5fdHlwZTogMSBpZiB0aGUg cGF0aG5hbWUgbXVzdCBjb250YWluIHBhdHRlcm5zDQorICogICAgICAgICAgICAgICAgLTEgaWYg dGhlIHBhdGhuYW1lIG11c3Qgbm90IGNvbnRhaW4gcGF0dGVybnMNCisgKiAgICAgICAgICAgICAg ICAwIGlmIGl0IGRvZXMgbm90IG1hdHRlcg0KKyAqIEBlbmRfdHlwZTogICAgIDEgaWYgdGhlIHBh dGhuYW1lIG11c3QgZW5kIHdpdGggJy8nDQorICogICAgICAgICAgICAgICAgLTEgaWYgdGhlIHBh dGhuYW1lIG11c3Qgbm90IGVuZCB3aXRoICcvJw0KKyAqICAgICAgICAgICAgICAgIDAgaWYgaXQg ZG9lcyBub3QgbWF0dGVyDQorICogQGZ1bmN0aW9uOiAgICAgc3RyaW5nIHRvIGRpc3BsYXkgaWYg dGhlIEBmaWxlbmFtZSBpcyBpbnZhbGlkDQorICoNCisgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHBh dGhuYW1lIGlzIHZhbGlkLg0KKyAqIFJldHVybnMgZmFsc2Ugb3RoZXJ3aXNlLg0KKyAqDQorICog Q2hlY2sgd2hldGhlciB0aGUgZ2l2ZW4gcGF0aG5hbWUgZm9sbG93cyB0aGUgbmFtaW5nIHJ1bGVz Lg0KKyAqLw0KK2Jvb2wgdG15X2NvcnJlY3RfcGF0aChjb25zdCBjaGFyICpmaWxlbmFtZSwNCisJ CSAgICAgY29uc3QgaW50IHN0YXJ0X3R5cGUsDQorCQkgICAgIGNvbnN0IGludCBwYXR0ZXJuX3R5 cGUsDQorCQkgICAgIGNvbnN0IGludCBlbmRfdHlwZSwNCisJCSAgICAgY29uc3QgY2hhciAqZnVu Y3Rpb24pDQorew0KKwlib29sIGNvbnRhaW5zX3BhdHRlcm4gPSAwOw0KKwljaGFyIGM7DQorCWNo YXIgZDsNCisJY2hhciBlOw0KKwljb25zdCBjaGFyICpvcmlnaW5hbF9maWxlbmFtZSA9IGZpbGVu YW1lOw0KKw0KKwlpZiAoIWZpbGVuYW1lKQ0KKwkJZ290byBvdXQ7DQorDQorCWMgPSAqZmlsZW5h bWU7DQorCWlmIChzdGFydF90eXBlID09IDEpIHsNCisJCS8qIE11c3Qgc3RhcnQgd2l0aCAnLycg Ki8NCisJCWlmIChjICE9ICcvJykNCisJCQlnb3RvIG91dDsNCisJfSBlbHNlIGlmIChzdGFydF90 eXBlID09IC0xKSB7DQorCQkvKiBNdXN0IG5vdCBzdGFydCB3aXRoICcvJyAqLw0KKwkJaWYgKGMg PT0gJy8nKQ0KKwkJCWdvdG8gb3V0Ow0KKwl9DQorDQorCWlmIChjKQ0KKwkJYyA9ICooc3RyY2hy KGZpbGVuYW1lLCAnXDAnKSAtIDEpOw0KKwlpZiAoZW5kX3R5cGUgPT0gMSkgew0KKwkJLyogTXVz dCBlbmQgd2l0aCAnLycgKi8NCisJCWlmIChjICE9ICcvJykNCisJCQlnb3RvIG91dDsNCisJfSBl bHNlIGlmIChlbmRfdHlwZSA9PSAtMSkgew0KKwkJLyogTXVzdCBub3QgZW5kIHdpdGggJy8nICov DQorCQlpZiAoYyA9PSAnLycpDQorCQkJZ290byBvdXQ7DQorCX0NCisNCisJd2hpbGUgKChjID0g KmZpbGVuYW1lKyspICE9ICdcMCcpIHsNCisJCWlmIChjID09ICdcXCcpIHsNCisJCQl1bnNpZ25l ZCBjaGFyIGY7DQorCQkJc3dpdGNoICgoYyA9ICpmaWxlbmFtZSsrKSkgew0KKwkJCWNhc2UgJ1xc JzogIC8qICJcXCIgKi8NCisJCQkJY29udGludWU7DQorCQkJY2FzZSAnJCc6ICAgLyogIlwkIiAq Lw0KKwkJCWNhc2UgJysnOiAgIC8qICJcKyIgKi8NCisJCQljYXNlICc/JzogICAvKiAiXD8iICov DQorCQkJY2FzZSAnKic6ICAgLyogIlwqIiAqLw0KKwkJCWNhc2UgJ0AnOiAgIC8qICJcQCIgKi8N CisJCQljYXNlICd4JzogICAvKiAiXHgiICovDQorCQkJY2FzZSAnWCc6ICAgLyogIlxYIiAqLw0K KwkJCWNhc2UgJ2EnOiAgIC8qICJcYSIgKi8NCisJCQljYXNlICdBJzogICAvKiAiXEEiICovDQor CQkJY2FzZSAnLSc6ICAgLyogIlwtIiAqLw0KKwkJCQlpZiAocGF0dGVybl90eXBlID09IC0xKQ0K KwkJCQkJZ290byBvdXQ7IC8qIE11c3Qgbm90IGNvbnRhaW4gcGF0dGVybiAqLw0KKwkJCQljb250 YWluc19wYXR0ZXJuID0gMTsNCisJCQkJY29udGludWU7DQorCQkJY2FzZSAnMCc6ICAgLyogIlxv b28iICovDQorCQkJY2FzZSAnMSc6DQorCQkJY2FzZSAnMic6DQorCQkJY2FzZSAnMyc6DQorCQkJ CWQgPSAqZmlsZW5hbWUrKzsNCisJCQkJaWYgKCF0bXlfY2hhcl9pc18wdG83KGQpKQ0KKwkJCQkJ Z290byBvdXQ7DQorCQkJCWUgPSAqZmlsZW5hbWUrKzsNCisJCQkJaWYgKCF0bXlfY2hhcl9pc18w dG83KGUpKQ0KKwkJCQkJZ290byBvdXQ7DQorCQkJCWYgPSB0bXlfc3RyMmNocihjLCBkLCBlKTsN CisJCQkJaWYgKGYgJiYgKGYgPD0gMHgyMCB8fCBmID49IDB4N0YpKQ0KKwkJCQkJLyogdmFsaWQg XG9vbyBleHByZXNzaW9uICovDQorCQkJCQljb250aW51ZTsNCisJCQl9DQorCQkJZ290byBvdXQ7 DQorCQl9IGVsc2UgaWYgKGMgPD0gMHgyMCB8fCBjID49IDB4N0YpDQorCQkJZ290byBvdXQ7DQor CX0NCisNCisJaWYgKHBhdHRlcm5fdHlwZSA9PSAxKSB7DQorCQkvKiBNdXN0IGNvbnRhaW4gcGF0 dGVybiAqLw0KKwkJaWYgKCFjb250YWluc19wYXR0ZXJuKQ0KKwkJCWdvdG8gb3V0Ow0KKwl9DQor DQorCXJldHVybiAxOw0KKw0KK291dDogOw0KKwlwcmludGsoS0VSTl9ERUJVRyAiJXM6IEludmFs aWQgcGF0aG5hbWUgJyVzJ1xuIiwNCisJICAgICAgIGZ1bmN0aW9uLCBvcmlnaW5hbF9maWxlbmFt ZSk7DQorCXJldHVybiAwOw0KK30NCisNCisvKioNCisgKiB0bXlfaXNfY29ycmVjdF9kb21haW4g LSB2YWxpZGF0ZSBhIGRvbWFpbm5hbWUuDQorICogQGRvbWFpbm5hbWU6IHRoZSBkb21haW5uYW1l IHRvIGNoZWNrLg0KKyAqIEBmdW5jdGlvbjogICBzdHJpbmcgdG8gZGlzcGxheSBpZiB0aGUgQGRv bWFpbm5hbWUgaXMgaW52YWxpZC4NCisgKg0KKyAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZG9tYWlu bmFtZSBpcyB2YWxpZC4NCisgKiBSZXR1cm5zIGZhbHNlIG90aGVyd2lzZS4NCisgKg0KKyAqIENo ZWNrIHdoZXRoZXIgdGhlIGdpdmVuIGRvbWFpbm5hbWUgZm9sbG93cyB0aGUgbmFtaW5nIHJ1bGVz Lg0KKyAqLw0KK2Jvb2wgdG15X2lzX2NvcnJlY3RfZG9tYWluKGNvbnN0IHVuc2lnbmVkIGNoYXIg KmRvbWFpbm5hbWUsDQorCQkJICBjb25zdCBjaGFyICpmdW5jdGlvbikNCit7DQorCXVuc2lnbmVk IGNoYXIgYzsNCisJdW5zaWduZWQgY2hhciBkOw0KKwl1bnNpZ25lZCBjaGFyIGU7DQorCWNvbnN0 IGNoYXIgKm9yZ19kb21haW5uYW1lID0gZG9tYWlubmFtZTsNCisNCisJaWYgKCFkb21haW5uYW1l IHx8ICF0bXlfc3Ryc3RhcnRzKChjaGFyICoqKSAmZG9tYWlubmFtZSwgVE1ZX1JPT1RfTkFNRSkp DQorCQlnb3RvIG91dDsNCisNCisJaWYgKCEqZG9tYWlubmFtZSkNCisJCXJldHVybiAxOw0KKw0K KwlkbyB7DQorCQkvKiAweDIwIGlzIGEgZG9tYWlubmFtZSBzZXBhcmF0b3IuICovDQorCQlpZiAo KmRvbWFpbm5hbWUrKyAhPSAnICcpDQorCQkJZ290byBvdXQ7DQorCQkvKiBNdXN0IHN0YXJ0cyB3 aXRoICcvJy4gKi8NCisJCWlmICgqZG9tYWlubmFtZSsrICE9ICcvJykNCisJCQlnb3RvIG91dDsN CisJCXdoaWxlICgoYyA9ICpkb21haW5uYW1lKSAhPSAnXDAnICYmIGMgIT0gJyAnKSB7DQorCQkJ ZG9tYWlubmFtZSsrOw0KKwkJCWlmIChjID09ICdcXCcpIHsNCisJCQkJdW5zaWduZWQgY2hhciBm Ow0KKwkJCQlzd2l0Y2ggKChjID0gKmRvbWFpbm5hbWUrKykpIHsNCisJCQkJY2FzZSAnXFwnOiAg LyogIlxcIiAqLw0KKwkJCQkJY29udGludWU7DQorCQkJCWNhc2UgJzAnOiAgIC8qICJcb29vIiAq Lw0KKwkJCQljYXNlICcxJzoNCisJCQkJY2FzZSAnMic6DQorCQkJCWNhc2UgJzMnOg0KKwkJCQkJ ZCA9ICpkb21haW5uYW1lKys7DQorCQkJCQlpZiAoIXRteV9jaGFyX2lzXzB0bzcoZCkpDQorCQkJ CQkJZ290byBvdXQ7DQorCQkJCQllID0gKmRvbWFpbm5hbWUrKzsNCisJCQkJCWlmICghdG15X2No YXJfaXNfMHRvNyhlKSkNCisJCQkJCQlnb3RvIG91dDsNCisJCQkJCWYgPSB0bXlfc3RyMmNocihj LCBkLCBlKTsNCisJCQkJCWlmIChmICYmIChmIDw9IDB4MjAgfHwgZiA+PSAweDdGKSkNCisJCQkJ CQljb250aW51ZTsNCisJCQkJfQ0KKwkJCQlnb3RvIG91dDsNCisJCQl9IGVsc2UgaWYgKGMgPCAw eDIwIHx8IGMgPj0gMHg3RikNCisJCQkJLyogMHgyMCBpcyBhIGRvbWFpbm5hbWUgc2VwYXJhdG9y LiAqLw0KKwkJCQlnb3RvIG91dDsNCisJCX0NCisJfSB3aGlsZSAoKmRvbWFpbm5hbWUpOw0KKw0K KwlyZXR1cm4gMTsNCisNCitvdXQ6IDsNCisJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBJbnZhbGlk IGRvbWFpbm5hbWUgJyVzJ1xuIiwNCisJICAgICAgIGZ1bmN0aW9uLCBvcmdfZG9tYWlubmFtZSk7 DQorCXJldHVybiAwOw0KK30NCisNCisvKioNCisgKiB0bXlfcGF0aF9kZXB0aCAtIGV2YWx1YXRl IHRoZSBudW1iZXIgb2YgJy8nIGNoYXJhY3RlcnMgaW4gYSB0b2tlbi4NCisgKiBAcGF0aG5hbWU6 IHRoZSB0b2tlbiB0byBldmFsdWF0ZS4NCisgKg0KKyAqIEVhY2ggJy8nIGNoYXJhY3RlciBidXQg dGhlIHRyYWlsaW5nICcvJyBzY29yZXMgMi4NCisgKiBUaGUgdHJhaWxpbmcgJy8nIHNjb3JlcyAx Lg0KKyAqDQorICogSWYgQHBhdGhuYW1lIGVuZHMgd2l0aCAnLycsIHRoZSByZXR1cm4gdmFsdWUg aXMgYW4gb2RkIGludGVnZXIuDQorICogSWYgQHBhdGhuYW1lIGRvZXMgbm90IGVuZCB3aXRoICcv JywgdGhlIHJldHVybiB2YWx1ZSBpcyBhbiBldmVuIGludGVnZXIuDQorICovDQorc3RhdGljIGlu dCB0bXlfcGF0aF9kZXB0aChjb25zdCBjaGFyICpwYXRobmFtZSkNCit7DQorCWludCBpID0gMDsN CisNCisJaWYgKHBhdGhuYW1lKSB7DQorCQljaGFyICplcCA9IHN0cmNocihwYXRobmFtZSwgJ1ww Jyk7DQorDQorCQlpZiAocGF0aG5hbWUgPCBlcC0tKSB7DQorCQkJaWYgKCplcCAhPSAnLycpDQor CQkJCWkrKzsNCisJCQl3aGlsZSAocGF0aG5hbWUgPD0gZXApDQorCQkJCWlmICgqZXAtLSA9PSAn LycpDQorCQkJCQlpICs9IDI7DQorCQl9DQorCX0NCisNCisJcmV0dXJuIGk7DQorfQ0KKw0KKy8q Kg0KKyAqIHRteV9jb25zdF9wYXJ0X2xlbmd0aCAtIGNhbGN1bGF0ZSB0aGUgY29uc3RhbnQgcGFy dCBpbiBhIHRva2VuLg0KKyAqIEBmaWxlbmFtZTogdGhlIHRva2VuIHRvIGNhbGN1bGF0ZS4NCisg Kg0KKyAqIFJldHVybnMgbGVhZGluZyBsZW5ndGggb2YgQGZpbGVuYW1lIHRoYXQgY2FuIGJlIGNv bXBhcmVkIHVzaW5nIHN0cm5jbXAoKS4NCisgKi8NCitzdGF0aWMgaW50IHRteV9jb25zdF9wYXJ0 X2xlbmd0aChjb25zdCBjaGFyICpmaWxlbmFtZSkNCit7DQorCWludCBsZW4gPSAwOw0KKw0KKwlp ZiAoZmlsZW5hbWUpIHsNCisJCWNoYXIgYzsNCisNCisJCXdoaWxlICgoYyA9ICpmaWxlbmFtZSsr KSAhPSAnXDAnKSB7DQorCQkJaWYgKGMgIT0gJ1xcJykgew0KKwkJCQlsZW4rKzsNCisJCQkJY29u dGludWU7DQorCQkJfQ0KKwkJCXN3aXRjaCAoYyA9ICpmaWxlbmFtZSsrKSB7DQorCQkJY2FzZSAn XFwnOiAgLyogIlxcIiAqLw0KKwkJCQlsZW4gKz0gMjsNCisJCQkJY29udGludWU7DQorCQkJY2Fz ZSAnMCc6ICAgLyogIlxvb28iICovDQorCQkJY2FzZSAnMSc6DQorCQkJY2FzZSAnMic6DQorCQkJ Y2FzZSAnMyc6DQorCQkJCWlmICghdG15X2NoYXJfaXNfMHRvNygqZmlsZW5hbWUrKykpDQorCQkJ CQlicmVhazsNCisJCQkJaWYgKCF0bXlfY2hhcl9pc18wdG83KCpmaWxlbmFtZSsrKSkNCisJCQkJ CWJyZWFrOw0KKwkJCQlsZW4gKz0gNDsNCisJCQkJY29udGludWU7DQorCQkJfQ0KKwkJCWJyZWFr Ow0KKwkJfQ0KKwl9DQorDQorCXJldHVybiBsZW47DQorfQ0KKw0KKy8qKg0KKyAqIHRteV9maWxs X3BhdGhfaW5mbyAtIGZpbGwgInN0cnVjdCBwYXRoX2luZm8iIGVudHJ5Lg0KKyAqIEBwdHI6IHBv aW50ZXIgdG8gInN0cnVjdCBwYXRoX2luZm8iLg0KKyAqDQorICogQ2FsbGVyIHN0b3JlcyBhIHRv a2VuIGluICJzdHJ1Y3QgcGF0aF9pbmZvIi0+bmFtZSAuDQorICogVGhpcyBmdW5jdGlvbiB3aWxs IGZpbGwgcmVzdCBvZiAic3RydWN0IHBhdGhfaW5mbyIgbWVtYmVycy4NCisgKi8NCit2b2lkIHRt eV9maWxsX3BhdGhfaW5mbyhzdHJ1Y3QgcGF0aF9pbmZvICpwdHIpDQorew0KKwljb25zdCBjaGFy ICpuYW1lID0gcHRyLT5uYW1lOw0KKwljb25zdCBpbnQgbGVuID0gc3RybGVuKG5hbWUpOw0KKwlw dHItPnRvdGFsX2xlbiA9IGxlbjsNCisJcHRyLT5jb25zdF9sZW4gPSB0bXlfY29uc3RfcGFydF9s ZW5ndGgobmFtZSk7DQorCXB0ci0+aXNfZGlyID0gbGVuICYmIChuYW1lW2xlbiAtIDFdID09ICcv Jyk7DQorCXB0ci0+aXNfcGF0dGVybmVkID0gKHB0ci0+Y29uc3RfbGVuIDwgbGVuKTsNCisJcHRy LT5oYXNoID0gZnVsbF9uYW1lX2hhc2gobmFtZSwgbGVuKTsNCisJcHRyLT5kZXB0aCA9IHRteV9w YXRoX2RlcHRoKG5hbWUpOw0KK30NCisNCisvKioNCisgKiB0bXlfZmlsZV9tYXRjaDIgLSBpbnRl cm5hbCBmdW5jdGlvbiBmb3IgdG15X3BhdGhfbWF0Y2goKS4NCisgKiBAZmlsZW5hbWU6ICAgICBz dGFydCBhZGRyZXNzIG9mIHRoZSB0b2tlbi4NCisgKiBAZmlsZW5hbWVfZW5kOiBlbmQgYWRkcmVz cyBvZiB0aGUgdG9rZW4uDQorICogQHBhdHRlcm46ICAgICAgc3RhcnQgYWRkcmVzcyBvZiB0aGUg cGF0dGVybi4NCisgKiBAcGF0dGVybl9lbmQ6ICBlbmQgYWRkcmVzcyBvZiB0aGUgcGF0dGVybi4N CisgKg0KKyAqIEhhbmRsZSBhbGwgcGF0dGVybnMgb3RoZXIgdGhhbiAnXC0nIHBhdHRlcm4uDQor ICogUmV0dXJucyB0cnVlIGlmIG1hdGNoZXMuDQorICogUmV0dXJucyBmYWxzZSBvdGhlcndpc2Uu DQorICoNCisgKiBAZmlsZW5hbWUgYW5kIEBwYXR0ZXJuIGRvIG5vdCBjb250YWluICcvJy4NCisg KiBAZmlsZW5hbWUgYW5kIEBwYXR0ZXJuIGFyZSBub3QgJ1wwJy10ZXJtaW5hdGVkLg0KKyAqIEBw YXR0ZXJuIGRvZXMgbm90IGNvbnRhaW4gJ1wtJy4NCisgKi8NCitzdGF0aWMgYm9vbCB0bXlfZmls ZV9tYXRjaDIoY29uc3QgY2hhciAqZmlsZW5hbWUsDQorCQkJICAgY29uc3QgY2hhciAqZmlsZW5h bWVfZW5kLA0KKwkJCSAgIGNvbnN0IGNoYXIgKnBhdHRlcm4sDQorCQkJICAgY29uc3QgY2hhciAq cGF0dGVybl9lbmQpDQorew0KKwl3aGlsZSAoZmlsZW5hbWUgPCBmaWxlbmFtZV9lbmQgJiYgcGF0 dGVybiA8IHBhdHRlcm5fZW5kKSB7DQorCQljaGFyIGM7DQorCQlpbnQgaTsNCisJCWludCBqOw0K Kw0KKwkJaWYgKCpwYXR0ZXJuICE9ICdcXCcpIHsNCisJCQlpZiAoKmZpbGVuYW1lKysgIT0gKnBh dHRlcm4rKykNCisJCQkJZ290byBvdXQ7DQorCQkJY29udGludWU7DQorCQl9DQorDQorCQljID0g KmZpbGVuYW1lOw0KKwkJcGF0dGVybisrOw0KKw0KKwkJc3dpdGNoICgqcGF0dGVybikgew0KKwkJ Y2FzZSAnPyc6DQorCQkJaWYgKGMgPT0gJy8nKQ0KKwkJCQlnb3RvIG91dDsNCisJCQlpZiAoYyAh PSAnXFwnKQ0KKwkJCQlicmVhazsNCisJCQkvKiBmaWxlbmFtZVswXSAhPSAnXDAnICovDQorCQkJ YyA9IGZpbGVuYW1lWzFdOw0KKwkJCWlmIChjID09ICdcXCcpDQorCQkJCWZpbGVuYW1lKys7DQor CQkJZWxzZSBpZiAodG15X2NoYXJfaXNfMHRvMyhjKSAmJg0KKwkJCQkgLyogZmlsZW5hbWVbMV0g IT0gJ1wwJyAqLw0KKwkJCQkgdG15X2NoYXJfaXNfMHRvNyhmaWxlbmFtZVsyXSkgJiYNCisJCQkJ IC8qIGZpbGVuYW1lWzJdICE9ICdcMCcgKi8NCisJCQkJIHRteV9jaGFyX2lzXzB0bzcoZmlsZW5h bWVbM10pKQ0KKwkJCQkvKiBmaWxlbmFtZVszXSAhPSAnXDAnICovDQorCQkJCWZpbGVuYW1lICs9 IDM7DQorCQkJCS8qDQorCQkJCSAqIFdoeSBub3QgImZpbGVuYW1lICs9IDQ7IiBoZXJlDQorCQkJ CSAqIGJlY2F1c2UgaXQgcHJvY2Vzc2VkIDQgKGkuZS4gIlxvb28iKSBieXRlcz8NCisJCQkJICog LSBCZWNhdXNlICJmaWxlbmFtZSsrOyIgaXMgZG9uZQ0KKwkJCQkgKiBhZnRlciAiYnJlYWs7Ii4N CisJCQkJICovDQorCQkJZWxzZQ0KKwkJCQlnb3RvIG91dDsNCisJCQlicmVhazsNCisJCWNhc2Ug J1xcJzoNCisJCQlpZiAoYyAhPSAnXFwnKQ0KKwkJCQlnb3RvIG91dDsNCisJCQkvKiBmaWxlbmFt ZVswXSAhPSAnXDAnICovDQorCQkJaWYgKCorK2ZpbGVuYW1lICE9ICdcXCcpDQorCQkJCWdvdG8g b3V0Ow0KKwkJCWJyZWFrOw0KKwkJY2FzZSAnKyc6DQorCQkJaWYgKCF0bXlfY2hhcl9pc18wdG85 KGMpKQ0KKwkJCQlnb3RvIG91dDsNCisJCQlicmVhazsNCisJCWNhc2UgJ3gnOg0KKwkJCWlmICgh dG15X2NoYXJfaXNfaGV4KGMpKQ0KKwkJCQlnb3RvIG91dDsNCisJCQlicmVhazsNCisJCWNhc2Ug J2EnOg0KKwkJCWlmICghdG15X2NoYXJfaXNfYWxwaGEoYykpDQorCQkJCWdvdG8gb3V0Ow0KKwkJ CWJyZWFrOw0KKwkJY2FzZSAnMCc6DQorCQljYXNlICcxJzoNCisJCWNhc2UgJzInOg0KKwkJY2Fz ZSAnMyc6DQorCQkJaWYgKGMgIT0gJ1xcJykNCisJCQkJZ290byBvdXQ7DQorCQkJLyogZmlsZW5h bWVbMF0gIT0gJ1wwJyAqLw0KKwkJCWMgPSBmaWxlbmFtZVsxXTsNCisJCQlpZiAoIXRteV9jaGFy X2lzXzB0bzMoYykgfHwgYyAhPSAqcGF0dGVybikNCisJCQkJZ290byBvdXQ7DQorCQkJLyogZmls ZW5hbWVbMV0gIT0gJ1wwJyAqLw0KKwkJCWMgPSBmaWxlbmFtZVsyXTsNCisJCQkvKiBwYXR0ZXJu WzBdICE9ICdcMCcgKi8NCisJCQlpZiAoIXRteV9jaGFyX2lzXzB0bzcoYykgfHwgYyAhPSBwYXR0 ZXJuWzFdKQ0KKwkJCQlnb3RvIG91dDsNCisJCQkvKiBmaWxlbmFtZVsyXSAhPSAnXDAnICovDQor CQkJYyA9IGZpbGVuYW1lWzNdOw0KKwkJCS8qIHBhdHRlcm5bMV0gIT0gJ1wwJyAqLw0KKwkJCWlm ICghdG15X2NoYXJfaXNfMHRvNyhjKSB8fCBjICE9IHBhdHRlcm5bMl0pDQorCQkJCWdvdG8gb3V0 Ow0KKwkJCS8qIGZpbGVuYW1lWzNdICE9ICdcMCcgKi8NCisJCQlmaWxlbmFtZSArPSAzOw0KKwkJ CS8qIHBhdHRlcm5bMl0gIT0gJ1wwJyAqLw0KKwkJCXBhdHRlcm4gKz0gMjsNCisJCQlicmVhazsN CisJCWNhc2UgJyonOg0KKwkJY2FzZSAnQCc6DQorCQkJZm9yIChpID0gMDsgaSA8PSBmaWxlbmFt ZV9lbmQgLSBmaWxlbmFtZTsgaSsrKSB7DQorCQkJCWlmICh0bXlfZmlsZV9tYXRjaDIoZmlsZW5h bWUgKyBpLA0KKwkJCQkJCSAgICBmaWxlbmFtZV9lbmQsDQorCQkJCQkJICAgIHBhdHRlcm4gKyAx LA0KKwkJCQkJCSAgICBwYXR0ZXJuX2VuZCkpDQorCQkJCQlyZXR1cm4gMTsNCisJCQkJYyA9IGZp bGVuYW1lW2ldOw0KKwkJCQlpZiAoYyA9PSAnLicgJiYgKnBhdHRlcm4gPT0gJ0AnKQ0KKwkJCQkJ YnJlYWs7DQorCQkJCWlmIChjICE9ICdcXCcpDQorCQkJCQljb250aW51ZTsNCisJCQkJLyogZmls ZW5hbWVbaV0gIT0gJ1wwJyAqLw0KKwkJCQljID0gZmlsZW5hbWVbaSArIDFdOw0KKwkJCQlpZiAo YyA9PSAnXFwnKQ0KKwkJCQkJLyogZmlsZW5hbWVbaSArIDFdICE9ICdcMCcgKi8NCisJCQkJCWkr KzsNCisJCQkJZWxzZSBpZiAodG15X2NoYXJfaXNfMHRvMyhjKSAmJg0KKwkJCQkJIC8qIGZpbGVu YW1lW2kgKyAxXSAhPSAnXDAnICovDQorCQkJCQkgdG15X2NoYXJfaXNfMHRvNyhmaWxlbmFtZVtp ICsgMl0pICYmDQorCQkJCQkgLyogZmlsZW5hbWVbaSArIDJdICE9ICdcMCcgKi8NCisJCQkJCSB0 bXlfY2hhcl9pc18wdG83KGZpbGVuYW1lW2kgKyAzXSkpDQorCQkJCQkgLyogZmlsZW5hbWVbaSAr IDNdICE9ICdcMCcgKi8NCisJCQkJCWkgKz0gMzsNCisJCQkJZWxzZQ0KKwkJCQkJYnJlYWs7IC8q IEJhZCBwYXR0ZXJuLiAqLw0KKwkJCX0NCisJCQlnb3RvIG91dDsNCisJCWRlZmF1bHQ6DQorCQkJ aiA9IDA7DQorCQkJLyoNCisJCQkgKiBJZiBqID09IDAsIGZvcigpIGxvb3AgZG9lcyBub3RoaW5n Lg0KKwkJCSAqIFNvIEkgY2FuIHVzZSB3aGlsZSgpIHdpdGhvdXQgY2hlY2tpbmcgZmlyc3QgbGV0 dGVyLg0KKwkJCSAqLw0KKwkJCWMgPSAqcGF0dGVybjsNCisJCQlpZiAoYyA9PSAnJCcpDQorCQkJ CXdoaWxlICh0bXlfY2hhcl9pc18wdG85KGZpbGVuYW1lW2pdKSkNCisJCQkJCWorKzsNCisJCQll bHNlIGlmIChjID09ICdYJykNCisJCQkJd2hpbGUgKHRteV9jaGFyX2lzX2hleChmaWxlbmFtZVtq XSkpDQorCQkJCQlqKys7DQorCQkJZWxzZSBpZiAoYyA9PSAnQScpDQorCQkJCXdoaWxlICh0bXlf Y2hhcl9pc19hbHBoYShmaWxlbmFtZVtqXSkpDQorCQkJCQlqKys7DQorCQkJZm9yIChpID0gMTsg aSA8PSBqOyBpKyspDQorCQkJCWlmICh0bXlfZmlsZV9tYXRjaDIoZmlsZW5hbWUgKyBpLA0KKwkJ CQkJCSAgICBmaWxlbmFtZV9lbmQsDQorCQkJCQkJICAgIHBhdHRlcm4gKyAxLA0KKwkJCQkJCSAg ICBwYXR0ZXJuX2VuZCkpDQorCQkJCQlyZXR1cm4gMTsNCisJCQlnb3RvIG91dDsgLyogTm90IG1h dGNoZWQgb3IgYmFkIHBhdHRlcm4uICovDQorCQl9DQorCQlmaWxlbmFtZSsrOyAvKiBmaWxlbmFt ZVswXSAhPSAnXDAnICovDQorCQlwYXR0ZXJuKys7IC8qIHBhdHRlcm5bMF0gIT0gJ1wwJyAqLw0K Kwl9DQorDQorCS8qIFNraXAgdHJhaWxpbmcgIlwqIiBhbmQgIlxAIiBwYXR0ZXJucy4gKi8NCisJ d2hpbGUgKCpwYXR0ZXJuID09ICdcXCcgJiYNCisJICAgICAgICgqKHBhdHRlcm4gKyAxKSA9PSAn KicgfHwNCisJCSoocGF0dGVybiArIDEpID09ICdAJykpDQorCQlwYXR0ZXJuICs9IDI7DQorDQor CS8qIElmIGJvdGggYXJlIGF0IGVuZGluZyBwb3NpdGlvbiwgdGhleSBhcmUgZXF1YWxzLiAqLw0K KwlyZXR1cm4gKGZpbGVuYW1lID09IGZpbGVuYW1lX2VuZCAmJiBwYXR0ZXJuID09IHBhdHRlcm5f ZW5kKTsNCitvdXQ6IDsNCisJcmV0dXJuIDA7DQorfQ0KKw0KKy8qKg0KKyAqIHRteV9maWxlX21h dGNoIC0gaW50ZXJuYWwgZnVuY3Rpb24gZm9yIHRteV9wYXRoX21hdGNoKCkuDQorICogQGZpbGVu YW1lOiAgICAgc3RhcnQgYWRkcmVzcyBvZiB0aGUgdG9rZW4uDQorICogQGZpbGVuYW1lX2VuZDog ZW5kIGFkZHJlc3Mgb2YgdGhlIHRva2VuLg0KKyAqIEBwYXR0ZXJuOiAgICAgIHN0YXJ0IGFkZHJl c3Mgb2YgdGhlIHBhdHRlcm4uDQorICogQHBhdHRlcm5fZW5kOiAgZW5kIGFkZHJlc3Mgb2YgdGhl IHBhdHRlcm4uDQorICoNCisgKiBIYW5kbGUgcGF0dGVybnMgY29udGFpbmluZyAnXC0nIHBhdHRl cm4uDQorICogUmV0dXJucyB0cnVlIGlmIG1hdGNoZXMuDQorICogUmV0dXJucyBmYWxzZSBvdGhl cndpc2UuDQorICoNCisgKiBAZmlsZW5hbWUgYW5kIEBwYXR0ZXJuIGRvIG5vdCBjb250YWluICcv Jy4NCisgKiBAZmlsZW5hbWUgYW5kIEBwYXR0ZXJuIGFyZSBub3QgJ1wwJy10ZXJtaW5hdGVkLg0K KyAqLw0KK3N0YXRpYyBib29sIHRteV9maWxlX21hdGNoKGNvbnN0IGNoYXIgKmZpbGVuYW1lLA0K KwkJCSAgY29uc3QgY2hhciAqZmlsZW5hbWVfZW5kLA0KKwkJCSAgY29uc3QgY2hhciAqcGF0dGVy biwNCisJCQkgIGNvbnN0IGNoYXIgKnBhdHRlcm5fZW5kKQ0KK3sNCisJY29uc3QgY2hhciAqcGF0 dGVybl9zdGFydCA9IHBhdHRlcm47DQorCWJvb2wgZmlyc3QgPSAxOw0KKwlib29sIHJlc3VsdDsN CisNCisJd2hpbGUgKHBhdHRlcm4gPCBwYXR0ZXJuX2VuZCAtIDEpIHsNCisJCS8qIFNwbGl0IGF0 ICJcLSIgcGF0dGVybi4gKi8NCisJCWlmICgqcGF0dGVybisrICE9ICdcXCcgfHwgKnBhdHRlcm4r KyAhPSAnLScpDQorCQkJY29udGludWU7DQorCQlyZXN1bHQgPSB0bXlfZmlsZV9tYXRjaDIoZmls ZW5hbWUsDQorCQkJCQkgZmlsZW5hbWVfZW5kLA0KKwkJCQkJIHBhdHRlcm5fc3RhcnQsDQorCQkJ CQkgcGF0dGVybiAtIDIpOw0KKwkJLyogSWYgYmVmb3JlICJcLSIgcGF0dGVybiwgaW52ZXJ0IHRo ZSByZXN1bHQuICovDQorCQlpZiAoZmlyc3QpDQorCQkJcmVzdWx0ID0gIXJlc3VsdDsNCisJCS8q DQorCQkgKiBJZiBub3QgbWF0Y2hlZCBiZWZvcmUgZmlyc3QgIlwtIiBwYXR0ZXJuLCByZXR1cm4g MC4NCisJCSAqIElmIG1hdGNoZWQgYWZ0ZXIgZmlyc3QgIlwtIiBwYXR0ZXJuLCByZXR1cm4gMC4N CisJCSAqLw0KKwkJaWYgKHJlc3VsdCkNCisJCQlyZXR1cm4gMDsNCisJCWZpcnN0ID0gMDsNCisJ CXBhdHRlcm5fc3RhcnQgPSBwYXR0ZXJuOw0KKwl9DQorDQorCXJlc3VsdCA9IHRteV9maWxlX21h dGNoMihmaWxlbmFtZSwNCisJCQkJIGZpbGVuYW1lX2VuZCwgcGF0dGVybl9zdGFydCwgcGF0dGVy bl9lbmQpOw0KKwkvKiBJZiBhZnRlciBmaXJzdCAiXC0iIHBhdHRlcm4sIGludmVydCB0aGUgcmVz dWx0LiAqLw0KKwlyZXR1cm4gZmlyc3QgPyByZXN1bHQgOiAhcmVzdWx0Ow0KK30NCisNCisvKioN CisgKiB0bXlfcGF0aF9tYXRjaCAtIGRvIGEgcGF0dGVybiBtYXRjaGluZy4NCisgKiBAcGF0aG5h bWUwOiBwb2ludGVyIHRvIGEgdG9rZW4gdG8gY29tcGFyZS4NCisgKiBAcGF0dGVybjA6ICBwb2lu dGVyIHRvIGEgcGF0dGVybiB0byBjb21wYXJlLg0KKyAqDQorICogUmV0dXJucyB0cnVlIGlmIEBw YXRobmFtZTAgbWF0Y2hlcyB0byBAcGF0dGVybjAgLg0KKyAqIFJldHVybnMgZmFsc2Ugb3RoZXJ3 aXNlLg0KKyAqDQorICoNCisgKiAgQ2hlY2sgd2hldGhlciB0aGUgZ2l2ZW4gdG9rZW4gbWF0Y2hl cyB0byB0aGUgZ2l2ZW4gcGF0dGVybi4NCisgKg0KKyAqICBUaGUgZm9sbG93aW5nIHBhdHRlcm5z IGFyZSBhdmFpbGFibGUuDQorICogICAgXFwgICAgIFwgaXRzZWxmLg0KKyAqICAgIFxvb28gICBP Y3RhbCByZXByZXNlbnRhdGlvbiBvZiBhIGJ5dGUuDQorICogICAgXCogICAgIE1vcmUgdGhhbiBv ciBlcXVhbHMgdG8gMCBjaGFyYWN0ZXIgb3RoZXIgdGhhbiAnLycuDQorICogICAgXEAgICAgIE1v cmUgdGhhbiBvciBlcXVhbHMgdG8gMCBjaGFyYWN0ZXIgb3RoZXIgdGhhbiAnLycgb3IgJy4nLg0K KyAqICAgIFw/ICAgICAxIGJ5dGUgY2hhcmFjdGVyIG90aGVyIHRoYW4gJy8nLg0KKyAqICAgIFwk ICAgICBNb3JlIHRoYW4gb3IgZXF1YWxzIHRvIDEgZGVjaW1hbCBkaWdpdC4NCisgKiAgICBcKyAg ICAgMSBkZWNpbWFsIGRpZ2l0Lg0KKyAqICAgIFxYICAgICBNb3JlIHRoYW4gb3IgZXF1YWxzIHRv IDEgaGV4YWRlY2ltYWwgZGlnaXQuDQorICogICAgXHggICAgIDEgaGV4YWRlY2ltYWwgZGlnaXQu DQorICogICAgXEEgICAgIE1vcmUgdGhhbiBvciBlcXVhbHMgdG8gMSBhbHBoYWJldCBjaGFyYWN0 ZXIuDQorICogICAgXGEgICAgIDEgYWxwaGFiZXQgY2hhcmFjdGVyLg0KKyAqICAgIFwtICAgICBT dWJ0cmFjdGlvbiBvcGVyYXRvci4NCisgKi8NCitib29sIHRteV9wYXRoX21hdGNoKGNvbnN0IHN0 cnVjdCBwYXRoX2luZm8gKnBhdGhuYW1lMCwNCisJCSAgIGNvbnN0IHN0cnVjdCBwYXRoX2luZm8g KnBhdHRlcm4wKQ0KK3sNCisJY29uc3QgY2hhciAqcGF0aG5hbWUgPSBwYXRobmFtZTAtPm5hbWU7 DQorCWNvbnN0IGNoYXIgKnBhdHRlcm4gPSBwYXR0ZXJuMC0+bmFtZTsNCisJY29uc3QgaW50IGxl biA9IHBhdHRlcm4wLT5jb25zdF9sZW47DQorDQorCS8qIElmIGl0IGRvZXNuJ3QgY29udGFpbnMg cGF0dGVybnMsIEkgY2FuIHVzZSB0bXlfcGF0aGNtcCgpICovDQorCWlmICghcGF0dGVybjAtPmlz X3BhdHRlcm5lZCkNCisJCXJldHVybiAhdG15X3BhdGhjbXAocGF0aG5hbWUwLCBwYXR0ZXJuMCk7 DQorCS8qIENoZWNrIHRoZSBkZXB0aCBvZiBkaXJlY3RvcnkuICovDQorCWlmIChwYXRobmFtZTAt PmRlcHRoICE9IHBhdHRlcm4wLT5kZXB0aCkNCisJCXJldHVybiAwOw0KKwkvKiBVc2Ugc3RybmNt cCgpIGZvciBjb25zdGFudCBwYXJ0LiAqLw0KKwlpZiAoc3RybmNtcChwYXRobmFtZSwgcGF0dGVy biwgbGVuKSkNCisJCXJldHVybiAwOw0KKw0KKwlwYXRobmFtZSArPSBsZW47DQorCXBhdHRlcm4g Kz0gbGVuOw0KKw0KKwkvKiBTcGxpdCBhdCAnLycgY2hhcmFjdGVyLCBhbmQgY29tcGFyZS4gKi8N CisJd2hpbGUgKCpwYXRobmFtZSAmJiAqcGF0dGVybikgew0KKwkJY29uc3QgY2hhciAqcGF0aG5h bWVfZGVsaW1pdGVyID0gc3RyY2hyKHBhdGhuYW1lLCAnLycpOw0KKwkJY29uc3QgY2hhciAqcGF0 dGVybl9kZWxpbWl0ZXIgPSBzdHJjaHIocGF0dGVybiwgJy8nKTsNCisNCisJCWlmICghcGF0aG5h bWVfZGVsaW1pdGVyKQ0KKwkJCXBhdGhuYW1lX2RlbGltaXRlciA9IHN0cmNocihwYXRobmFtZSwg J1wwJyk7DQorCQlpZiAoIXBhdHRlcm5fZGVsaW1pdGVyKQ0KKwkJCXBhdHRlcm5fZGVsaW1pdGVy ID0gc3RyY2hyKHBhdHRlcm4sICdcMCcpOw0KKwkJaWYgKCF0bXlfZmlsZV9tYXRjaChwYXRobmFt ZSwNCisJCQkJICAgIHBhdGhuYW1lX2RlbGltaXRlciwNCisJCQkJICAgIHBhdHRlcm4sDQorCQkJ CSAgICBwYXR0ZXJuX2RlbGltaXRlcikpDQorCQkJcmV0dXJuIDA7DQorDQorCQlwYXRobmFtZSA9 ICpwYXRobmFtZV9kZWxpbWl0ZXIgPw0KKwkJCXBhdGhuYW1lX2RlbGltaXRlciArIDEgOg0KKwkJ CXBhdGhuYW1lX2RlbGltaXRlcjsNCisJCXBhdHRlcm4gPSAqcGF0dGVybl9kZWxpbWl0ZXIgPw0K KwkJCXBhdHRlcm5fZGVsaW1pdGVyICsgMSA6DQorCQkJcGF0dGVybl9kZWxpbWl0ZXI7DQorCX0N CisNCisJLyogU2tpcCB0cmFpbGluZyAiXCoiIGFuZCAiXEAiIHBhdHRlcm5zLiAqLw0KKwl3aGls ZSAoKnBhdHRlcm4gPT0gJ1xcJyAmJg0KKwkgICAgICAgKCoocGF0dGVybiArIDEpID09ICcqJyB8 fA0KKwkJKihwYXR0ZXJuICsgMSkgPT0gJ0AnKSkNCisJCXBhdHRlcm4gKz0gMjsNCisNCisJLyog SWYgYm90aCBhcmUgYXQgJ1wwJyBwb3NpdGlvbiwgdGhleSBhcmUgZXF1YWxzLiAqLw0KKwlyZXR1 cm4gKCEqcGF0aG5hbWUgJiYgISpwYXR0ZXJuKTsNCit9DQorDQorLyoqDQorICogdG15X2lvX3By aW50ZiAtIHRyYW5zYWN0aW9uYWwgcHJpbnRmKCkgZm9yICJzdHJ1Y3QgaW9fYnVmZmVyIi4NCisg KiBAaGVhZDogcG9pbnRlciB0byAic3RydWN0IGlvX2J1ZmZlciIuDQorICogQGZtdDogIGZvcm1h dCBzdHJpbmdzIGZvciBwcmludGYoKS4NCisgKg0KKyAqIFJldHVybnMgemVybyBvbiBzdWNjZXNz Lg0KKyAqIFJldHVybnMgbm9uemVybyBvdGhlcndpc2UuDQorICoNCisgKiBUcmFuc2FjdGlvbmFs IHByaW50ZigpIHRvICJzdHJ1Y3QgaW9fYnVmZmVyIiBzdHJ1Y3R1cmUuDQorICogc25wcmludGYo KSB3aWxsIHRydW5jYXRlLCBidXQgdG15X2lvX3ByaW50ZigpIHdvbid0Lg0KKyAqIFRoaXMgaXMg bmVlZGVkIGJlY2F1c2UgZHVtcGluZyBwYXJ0aWFsbHkgdHJ1bmNhdGVkIHRva2Vucw0KKyAqIGlz IG5vdCBhY2NlcHRhYmxlIGZvciBUT01PWU8gTGludXguDQorICovDQoraW50IHRteV9pb19wcmlu dGYoc3RydWN0IGlvX2J1ZmZlciAqaGVhZCwgY29uc3QgY2hhciAqZm10LCAuLi4pDQorew0KKwl2 YV9saXN0IGFyZ3M7DQorCWludCBsZW47DQorCWludCBwb3MgPSBoZWFkLT5yZWFkX2F2YWlsOw0K KwlpbnQgc2l6ZSA9IGhlYWQtPnJlYWRidWZfc2l6ZSAtIHBvczsNCisNCisJaWYgKHNpemUgPD0g MCkNCisJCXJldHVybiAtRU5PTUVNOw0KKw0KKwl2YV9zdGFydChhcmdzLCBmbXQpOw0KKwlsZW4g PSB2c25wcmludGYoaGVhZC0+cmVhZF9idWYgKyBwb3MsIHNpemUsIGZtdCwgYXJncyk7DQorCXZh X2VuZChhcmdzKTsNCisNCisJaWYgKHBvcyArIGxlbiA+PSBoZWFkLT5yZWFkYnVmX3NpemUpDQor CQlyZXR1cm4gLUVOT01FTTsNCisNCisJaGVhZC0+cmVhZF9hdmFpbCArPSBsZW47DQorDQorCXJl dHVybiAwOw0KK30NCisNCisvKioNCisgKiB0bXlfc25jYXRwcmludGYgLSBhcHBlbmQgdmVyc2lv biBvZiBzbnByaW50ZigpLg0KKyAqIEBidWY6IHBvaW50ZXIgdG8gYnVmZmVyLg0KKyAqIEBsZW46 IHNpemVvZihidWZmZXIpLg0KKyAqDQorICogVGhpcyBmdW5jdGlvbiBpcyBlcXVpdmFsZW50IHRv DQorICogICBzbnByaW50ZihidWYgKyBzdHJsZW4oYnVmKSwgbGVuIC0gc3RybGVuKGJ1ZiksIGZt dCwgLi4uKSBpZiAoKmJ1ZikuDQorICogICBzbnByaW50ZihidWYsIGxlbiwgZm10LCAuLi4pIGlm ICghKmJ1ZikuDQorICovDQoraW50IHRteV9zbmNhdHByaW50ZihjaGFyICpidWYsIGludCBsZW4s IGNvbnN0IGNoYXIgKmZtdCwgLi4uKQ0KK3sNCisJdmFfbGlzdCBhcmdzOw0KKwljaGFyICpwID0g bWVtY2hyKGJ1ZiwgJ1wwJywgbGVuKTsNCisJaWYgKHApIHsNCisJCWxlbiAtPSAocCAtIGJ1Zik7 DQorCQlidWYgPSBwOw0KKwl9DQorCXZhX3N0YXJ0KGFyZ3MsIGZtdCk7DQorCWxlbiA9IHZzbnBy aW50ZihidWYsIGxlbiwgZm10LCBhcmdzKTsNCisJdmFfZW5kKGFyZ3MpOw0KKwlyZXR1cm4gbGVu Ow0KK30NCisNCisvKioNCisgKiB0bXlfZ2V0X2V4ZSAtIGdldCByZWFscGF0aCBvZiBjdXJyZW50 IHByb2Nlc3MuDQorICoNCisgKiBSZXR1cm5zIHJlYWxwYXRoKDMpIG9mIGN1cnJlbnQgcHJvY2Vz cyBvbiBzdWNjZXNzLg0KKyAqIFJldHVybnMgTlVMTCBvbiBmYWlsdXJlLg0KKyAqDQorICogVGhp cyBmdW5jdGlvbiB1c2VzIHRteV9hbGxvYygpLCBzbyBjYWxsZXIgbXVzdCB0bXlfZnJlZSgpDQor ICogaWYgdGhpcyBmdW5jdGlvbiBkaWRuJ3QgcmV0dXJuIE5VTEwuDQorICovDQorY29uc3QgY2hh ciAqdG15X2dldF9leGUodm9pZCkNCit7DQorCXN0cnVjdCBtbV9zdHJ1Y3QgKm1tID0gY3VycmVu dC0+bW07DQorCXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hOw0KKwljb25zdCBjaGFyICpjcCA9 IE5VTEw7DQorCWlmICghbW0pDQorCQlyZXR1cm4gTlVMTDsNCisJZG93bl9yZWFkKCZtbS0+bW1h cF9zZW0pOw0KKwlmb3IgKHZtYSA9IG1tLT5tbWFwOyB2bWE7IHZtYSA9IHZtYS0+dm1fbmV4dCkN CisJCWlmICgodm1hLT52bV9mbGFncyAmIFZNX0VYRUNVVEFCTEUpICYmIHZtYS0+dm1fZmlsZSkg ew0KKwkJCWNwID0gdG15X3JlYWxwYXRoX2RlbnRyeSh2bWEtPnZtX2ZpbGUtPmZfZGVudHJ5LA0K KwkJCQkJCSB2bWEtPnZtX2ZpbGUtPmZfdmZzbW50KTsNCisJCQlicmVhazsNCisJCX0NCisJdXBf cmVhZCgmbW0tPm1tYXBfc2VtKTsNCisJcmV0dXJuIGNwOw0KK30NCisNCisvKioNCisgKiB0bXlf bGFzdG5hbWUgLSBnZXQgbGFzdCBwYXJ0IG9mIGRvbWFpbm5hbWUuDQorICoNCisgKiBSZXR1cm5z IGxhc3QgcGFydCBvZiBkb21haW5uYW1lLg0KKyAqLw0KK2NvbnN0IGNoYXIgKnRteV9sYXN0bmFt ZShjb25zdCBzdHJ1Y3QgZG9tYWluX2luZm8gKmRvbWFpbikNCit7DQorCWNvbnN0IGNoYXIgKmNw MCA9IGRvbWFpbi0+ZG9tYWlubmFtZS0+bmFtZTsNCisJY29uc3QgY2hhciAqY3AxID0gc3RycmNo cihjcDAsICcgJyk7DQorCWlmIChjcDEpDQorCQlyZXR1cm4gY3AxICsgMTsNCisJcmV0dXJuIGNw MDsNCit9DQorDQorLyoqDQorICogdG15X2dldF9tc2cgLSBnZXQgbWVzc2FnZSBmcm9tIG1vZGUu DQorICogQGlzX2VuZm9yY2U6IGVuZm9yY2luZyBmbGFnLg0KKyAqDQorICogUmV0dXJucyAiRVJS T1IiIGlmIGVuZm9yY2luZywgIldBUk5JTkciIG90aGVyd2lzZS4NCisgKi8NCitjb25zdCBjaGFy ICp0bXlfZ2V0bXNnKGJvb2wgaXNfZW5mb3JjZSkNCit7DQorCXJldHVybiBpc19lbmZvcmNlID8g IkVSUk9SIiA6ICJXQVJOSU5HIjsNCit9DQorDQorLyoqKioqKioqKioqKioqKioqKioqKioqKiog IERPTUFJTiBQT0xJQ1kgSEFORExFUiAgKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisNCisv KioNCisgKiB0bXlfZmxhZ3MgLSBnZXQgZmxhZ3Mgb2YgZ2l2ZW4gYWNjZXNzIGNvbnRyb2wuDQor ICogQGluZGV4OiBpbmRleCB0byByZXRyaWV2ZSBmbGFncy4NCisgKg0KKyAqIFJldHVybnMgY3Vy cmVudCB2YWx1ZSBvZiBnaXZlbiBhY2Nlc3MgY29udHJvbC4NCisgKi8NCit1bnNpZ25lZCBpbnQg dG15X2ZsYWdzKGNvbnN0IHVuc2lnbmVkIGludCBpbmRleCkNCit7DQorCWNvbnN0IHU4IHByb2Zp bGUgPQ0KKwkJVE1ZX1NFQ1VSSVRZLT5kb21haW4tPnByb2ZpbGU7DQorDQorCS8qIEFsbCBvcGVy YXRpb25zIG1pZ2h0IHNsZWVwLiBTZWUgdG15X3N1cGVydmlzb3IoKS4gKi8NCisJbWlnaHRfc2xl ZXAoKTsNCisJaWYgKGluX2ludGVycnVwdCgpKQ0KKwkJcmV0dXJuIDA7DQorCXJldHVybiBzYmlu X2luaXRfc3RhcnRlZCAmJiBpbmRleCA8IFRNWV9NQVhfQ09OVFJPTF9JTkRFWA0KKwkJJiYgcHJv ZmlsZV9wdHJbcHJvZmlsZV0gPw0KKwkJcHJvZmlsZV9wdHJbcHJvZmlsZV0tPnZhbHVlW2luZGV4 XSA6DQorCQkwOw0KK30NCisNCisvKioNCisgKiB0bXlfcXVvdGEgLSBjaGVjayBxdW90YS4NCisg Kg0KKyAqIFJldHVybnMgdHJ1ZSBpZiBub3QgcXVvdGEgaGFzIG5vdCBleGNlZWRlZC4NCisgKiBS ZXR1cm5zIGZhbHNlIG90aGVyd2lzZS4NCisgKg0KKyAqIFRoaXMgaXMgYSBzYWZlZ3VhcmQgZm9y ICJsZWFybmluZyBtb2RlIiwgZm9yIGFwcGVuZGluZyBlbnRyaWVzDQorICogd2l0aG91dCBsaW1p dCBkdWxscyB0aGUgc3lzdGVtIHJlc3BvbnNlIGFuZCBjb25zdW1lcyBtdWNoIG1lbW9yeS4NCisg Ki8NCitib29sIHRteV9xdW90YSh2b2lkKQ0KK3sNCisJdW5zaWduZWQgaW50IGNvdW50ID0gMDsN CisJc3RydWN0IGFjbF9pbmZvICpwdHI7DQorCXN0cnVjdCBkb21haW5faW5mbyAqIGNvbnN0IGRv bWFpbiA9IFRNWV9TRUNVUklUWS0+ZG9tYWluOw0KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHB0ciwg JmRvbWFpbi0+YWNsX2luZm9fbGlzdCwgbGlzdCkgew0KKwkJaWYgKCFwdHItPmlzX2RlbGV0ZWQp DQorCQkJY291bnQrKzsNCisJfQ0KKwkvKiBJZiB0aGVyZSBhcmUgc28gbWFueSBlbnRyaWVzLCBk b24ndCBhcHBlbmQgYW55IG1vcmUuICovDQorCWlmIChjb3VudCA8IHRteV9mbGFncyhUTVlfTUFY X0FDQ0VQVF9FTlRSWSkpDQorCQlyZXR1cm4gMTsNCisJaWYgKCFkb21haW4tPnF1b3RhX3dhcm5l ZCkgew0KKwkJZG9tYWluLT5xdW90YV93YXJuZWQgPSAxOw0KKwkJcHJpbnRrKEtFUk5fSU5GTw0K KwkJICAgICAgICJUT01PWU8tV0FSTklORzogRG9tYWluICclcycgaGFzIHNvIG1hbnkgQUNMcyAi DQorCQkgICAgICAgInRvIGhvbGQuIFN0b3BwZWQgbGVhcm5pbmcgbW9kZS5cbiIsDQorCQkgICAg ICAgZG9tYWluLT5kb21haW5uYW1lLT5uYW1lKTsNCisJfQ0KKwlyZXR1cm4gMDsNCit9DQorDQor LyogQ3JlYXRlIGEgbmV3IHByb2ZpbGUuICovDQorc3RhdGljIHN0cnVjdCBwcm9maWxlICp0bXlf ZmluZF9uZXdfcHJvZmlsZShjb25zdCB1bnNpZ25lZCBpbnQgcHJvZmlsZSkNCit7DQorCXN0YXRp YyBERUZJTkVfTVVURVgocHJvZmlsZV9sb2NrKTsNCisJc3RydWN0IHByb2ZpbGUgKnB0ciA9IE5V TEw7DQorDQorCW11dGV4X2xvY2soJnByb2ZpbGVfbG9jayk7DQorDQorCXB0ciA9IHByb2ZpbGVf cHRyW3Byb2ZpbGVdOw0KKwlpZiAocHJvZmlsZSA8IFRNWV9NQVhfUFJPRklMRVMgJiYgcHRyID09 IE5VTEwpIHsNCisJCXB0ciA9IHRteV9hbGxvY19lbGVtZW50KHNpemVvZigqcHRyKSk7DQorCQlp ZiAocHRyICE9IE5VTEwpIHsNCisJCQlpbnQgaTsNCisJCQlmb3IgKGkgPSAwOyBpIDwgVE1ZX01B WF9DT05UUk9MX0lOREVYOyBpKyspDQorCQkJCXB0ci0+dmFsdWVbaV0gPSB0bXlfY29udHJvbFtp XS5jdXJyZW50X3ZhbHVlOw0KKwkJCW1iKCk7IC8qIEluc3RlYWQgb2YgdXNpbmcgc3BpbmxvY2su ICovDQorCQkJcHJvZmlsZV9wdHJbcHJvZmlsZV0gPSBwdHI7DQorCQl9DQorCX0NCisNCisJbXV0 ZXhfdW5sb2NrKCZwcm9maWxlX2xvY2spOw0KKw0KKwlyZXR1cm4gcHRyOw0KK30NCisNCisvKiBM b2FkaW5nIHBvbGljeSBkb25lPyAqLw0KK3N0YXRpYyBpbnQgcHJvZmlsZV9sb2FkZWQ7DQorDQor LyogVXBkYXRlIHByb2ZpbGUgdmFsdWVzLiAqLw0KK3N0YXRpYyBpbnQgdG15X3NldF9wcm9maWxl KHN0cnVjdCBpb19idWZmZXIgKmhlYWQpDQorew0KKwljaGFyICpkYXRhID0gaGVhZC0+d3JpdGVf YnVmOw0KKwl1bnNpZ25lZCBpbnQgaTsNCisJdW5zaWduZWQgaW50IHZhbHVlOw0KKwljaGFyICpj cDsNCisJc3RydWN0IHByb2ZpbGUgKnByb2ZpbGU7DQorDQorCWlmICghdG15X2lzX3Jvb3QoKSkN CisJCXJldHVybiAtRVBFUk07DQorDQorCS8qIElmIHByb2ZpbGUgaW5kZXggaXMgbm90IGdpdmVu LCBhc3N1bWUgMC4gKi8NCisJaSA9IHNpbXBsZV9zdHJ0b3VsKGRhdGEsICZjcCwgMTApOw0KKwlp ZiAoZGF0YSAhPSBjcCkgew0KKwkJaWYgKCpjcCAhPSAnLScpDQorCQkJcmV0dXJuIC1FSU5WQUw7 DQorCQlkYXRhID0gY3AgKyAxOw0KKwl9DQorDQorCXByb2ZpbGUgPSB0bXlfZmluZF9uZXdfcHJv ZmlsZShpKTsNCisJaWYgKCFwcm9maWxlKQ0KKwkJcmV0dXJuIC1FSU5WQUw7DQorCWNwID0gc3Ry Y2hyKGRhdGEsICc9Jyk7DQorCWlmICghY3ApDQorCQlyZXR1cm4gLUVJTlZBTDsNCisNCisJKmNw ID0gJ1wwJzsNCisJcHJvZmlsZV9sb2FkZWQgPSAxOw0KKwl0bXlfdXBkYXRlX2NvdW50ZXIoVE1Z X1VQREFURV9QUk9GSUxFKTsNCisJaWYgKHN0cmNtcChkYXRhLCB0bXlfY29udHJvbFtUTVlfQ09N TUVOVF0ua2V5d29yZCkgPT0gMCkgew0KKwkJcHJvZmlsZS0+Y29tbWVudCA9IHRteV9zYXZlX25h bWUoY3AgKyAxKTsNCisJCXJldHVybiAwOw0KKwl9DQorDQorCWlmIChzc2NhbmYoY3AgKyAxLCAi JXUiLCAmdmFsdWUpICE9IDEpDQorCQlyZXR1cm4gLUVJTlZBTDsNCisNCisJaWYgKHRteV9zdHJz dGFydHMoJmRhdGEsIFRNWV9NQUNfRk9SX0NBUEFCSUxJVFkpKQ0KKwkJcmV0dXJuIHRteV9zZXRf Y2FwYWJpbGl0eV9wcm9maWxlKGRhdGEsIHZhbHVlLCBpKTsNCisNCisJZm9yIChpID0gMDsgaSA8 IFRNWV9NQVhfQ09OVFJPTF9JTkRFWDsgaSsrKSB7DQorCQlpZiAoc3RyY21wKGRhdGEsIHRteV9j b250cm9sW2ldLmtleXdvcmQpKQ0KKwkJCWNvbnRpbnVlOw0KKwkJaWYgKHZhbHVlID4gdG15X2Nv bnRyb2xbaV0ubWF4X3ZhbHVlKQ0KKwkJCXZhbHVlID0gdG15X2NvbnRyb2xbaV0ubWF4X3ZhbHVl Ow0KKwkJcHJvZmlsZS0+dmFsdWVbaV0gPSB2YWx1ZTsNCisJCXJldHVybiAwOw0KKwl9DQorDQor CXJldHVybiAtRUlOVkFMOw0KK30NCisNCisvKiBSZWFkIHByb2ZpbGUgdmFsdWVzLiAqLw0KK3N0 YXRpYyBpbnQgdG15X3JlYWRfcHJvZmlsZShzdHJ1Y3QgaW9fYnVmZmVyICpoZWFkKQ0KK3sNCisJ aW50IHN0ZXA7DQorDQorCWlmIChoZWFkLT5yZWFkX2VvZikNCisJCXJldHVybiAwOw0KKwlpZiAo IXRteV9pc19yb290KCkpDQorCQlyZXR1cm4gLUVQRVJNOw0KKw0KKwlpZiAoaGVhZC0+cmVhZF92 YXIxKQ0KKwkJZ290byBjYXBhYmlsaXR5Ow0KKw0KKwlmb3IgKHN0ZXAgPSBoZWFkLT5yZWFkX3N0 ZXA7DQorCSAgICAgc3RlcCA8IFRNWV9NQVhfUFJPRklMRVMgKiBUTVlfTUFYX0NPTlRST0xfSU5E RVg7DQorCSAgICAgc3RlcCsrKSB7DQorCQljb25zdCBpbnQgaSA9IHN0ZXAgLyBUTVlfTUFYX0NP TlRST0xfSU5ERVg7DQorCQljb25zdCBpbnQgaiA9IHN0ZXAgJSBUTVlfTUFYX0NPTlRST0xfSU5E RVg7DQorCQljb25zdCBzdHJ1Y3QgcHJvZmlsZSAqcHJvZmlsZSA9IHByb2ZpbGVfcHRyW2ldOw0K Kw0KKwkJaGVhZC0+cmVhZF9zdGVwID0gc3RlcDsNCisJCWlmICghcHJvZmlsZSkNCisJCQljb250 aW51ZTsNCisJCWlmIChqICE9IFRNWV9DT01NRU5UKQ0KKwkJCWdvdG8gbm9uX2NvbW1lbnQ7DQor CQlpZiAodG15X2lvX3ByaW50ZihoZWFkLCAiJXUtJXM9JXNcbiIsDQorCQkJCSAgaSwgdG15X2Nv bnRyb2xbVE1ZX0NPTU1FTlRdLmtleXdvcmQsDQorCQkJCSAgcHJvZmlsZS0+Y29tbWVudCA/DQor CQkJCSAgcHJvZmlsZS0+Y29tbWVudC0+bmFtZSA6ICIiKSkNCisJCQlicmVhazsNCisJCWdvdG8g Y29tbWVudF9vazsNCitub25fY29tbWVudDogOw0KKwkJaWYgKHRteV9pb19wcmludGYoaGVhZCwg IiV1LSVzPSV1XG4iLA0KKwkJCQkgIGksIHRteV9jb250cm9sW2pdLmtleXdvcmQsDQorCQkJCSAg cHJvZmlsZS0+dmFsdWVbal0pKQ0KKwkJCWJyZWFrOw0KK2NvbW1lbnRfb2s6IDsNCisJfQ0KKw0K KwlpZiAoc3RlcCA9PSBUTVlfTUFYX1BST0ZJTEVTICogVE1ZX01BWF9DT05UUk9MX0lOREVYKSB7 DQorCQloZWFkLT5yZWFkX3ZhcjEgPSAodm9pZCAqKSAiIjsNCisJCWhlYWQtPnJlYWRfc3RlcCA9 IDA7DQorCQlnb3RvIGNhcGFiaWxpdHk7DQorCX0NCisJcmV0dXJuIDA7DQorY2FwYWJpbGl0eTog Ow0KKwlpZiAodG15X3JlYWRfY2FwYWJpbGl0eV9wcm9maWxlKGhlYWQpID09IDApDQorCQloZWFk LT5yZWFkX2VvZiA9IDE7DQorCXJldHVybiAwOw0KK30NCisNCisvKioqKioqKioqKioqKioqKioq KioqKioqKiAgUE9MSUNZIE1BTkFHRVIgSEFORExFUiAgKioqKioqKioqKioqKioqKioqKioqKioq Ki8NCisNCitzdHJ1Y3QgcG9saWN5X21hbmFnZXJfZW50cnkgew0KKwlzdHJ1Y3QgbGlzdF9oZWFk IGxpc3Q7DQorCWNvbnN0IHN0cnVjdCBwYXRoX2luZm8gKm1hbmFnZXI7DQorCWJvb2wgaXNfZG9t YWluOw0KKwlib29sIGlzX2RlbGV0ZWQ7DQorfTsNCisNCitzdGF0aWMgTElTVF9IRUFEKHBvbGlj eV9tYW5hZ2VyX2xpc3QpOw0KKw0KKy8qIFVwZGF0ZSBtYW5hZ2VyIGxpc3QuICovDQorc3RhdGlj IGludCB0bXlfYWRkX21hbmFnZXJfZW50cnkoY29uc3QgY2hhciAqbWFuYWdlciwgY29uc3QgYm9v bCBpc19kZWxldGUpDQorew0KKwlzdHJ1Y3QgcG9saWN5X21hbmFnZXJfZW50cnkgKm5ld19lbnRy eTsNCisJc3RydWN0IHBvbGljeV9tYW5hZ2VyX2VudHJ5ICpwdHI7DQorCXN0YXRpYyBERUZJTkVf TVVURVgobXV0ZXgpOw0KKwljb25zdCBzdHJ1Y3QgcGF0aF9pbmZvICpzYXZlZF9tYW5hZ2VyOw0K KwlpbnQgZXJyb3IgPSAtRU5PTUVNOw0KKw0KKwlib29sIGlzX2RvbWFpbiA9IDA7DQorCWlmICgh dG15X2lzX3Jvb3QoKSkNCisJCXJldHVybiAtRVBFUk07DQorCWlmICh0bXlfaXNfZG9tYWluX2Rl ZihtYW5hZ2VyKSkgew0KKwkJaWYgKCF0bXlfaXNfY29ycmVjdF9kb21haW4obWFuYWdlciwgX19G VU5DVElPTl9fKSkNCisJCQlyZXR1cm4gLUVJTlZBTDsNCisJCWlzX2RvbWFpbiA9IDE7DQorCX0g ZWxzZSB7DQorCQlpZiAoIXRteV9jb3JyZWN0X3BhdGgobWFuYWdlciwgMSwgLTEsIC0xLCBfX0ZV TkNUSU9OX18pKQ0KKwkJCXJldHVybiAtRUlOVkFMOw0KKwl9DQorDQorCXNhdmVkX21hbmFnZXIg PSB0bXlfc2F2ZV9uYW1lKG1hbmFnZXIpOw0KKwlpZiAoc2F2ZWRfbWFuYWdlciA9PSBOVUxMKQ0K KwkJcmV0dXJuIC1FTk9NRU07DQorDQorCW11dGV4X2xvY2soJm11dGV4KTsNCisNCisJbGlzdF9m b3JfZWFjaF9lbnRyeShwdHIsICZwb2xpY3lfbWFuYWdlcl9saXN0LCBsaXN0KSB7DQorCQlpZiAo cHRyLT5tYW5hZ2VyID09IHNhdmVkX21hbmFnZXIpIHsNCisJCQlwdHItPmlzX2RlbGV0ZWQgPSBp c19kZWxldGU7DQorCQkJZXJyb3IgPSAwOw0KKwkJCWdvdG8gb3V0Ow0KKwkJfQ0KKwl9DQorDQor CWlmIChpc19kZWxldGUpIHsNCisJCWVycm9yID0gLUVOT0VOVDsNCisJCWdvdG8gb3V0Ow0KKwl9 DQorDQorCW5ld19lbnRyeSA9IHRteV9hbGxvY19lbGVtZW50KHNpemVvZigqbmV3X2VudHJ5KSk7 DQorCWlmIChuZXdfZW50cnkgPT0gTlVMTCkNCisJCWdvdG8gb3V0Ow0KKwluZXdfZW50cnktPm1h bmFnZXIgPSBzYXZlZF9tYW5hZ2VyOw0KKwluZXdfZW50cnktPmlzX2RvbWFpbiA9IGlzX2RvbWFp bjsNCisJbGlzdF9hZGRfdGFpbF9tYigmbmV3X2VudHJ5LT5saXN0LCAmcG9saWN5X21hbmFnZXJf bGlzdCk7DQorCWVycm9yID0gMDsNCitvdXQ6IDsNCisNCisJbXV0ZXhfdW5sb2NrKCZtdXRleCk7 DQorDQorCWlmICghZXJyb3IpDQorCQl0bXlfdXBkYXRlX2NvdW50ZXIoVE1ZX1VQREFURV9NQU5B R0VSKTsNCisJcmV0dXJuIGVycm9yOw0KK30NCisNCisvKiBVcGRhdGUgbWFuYWdlciBsaXN0LiAq Lw0KK3N0YXRpYyBpbnQgdG15X2FkZF9tYW5hZ2VyX3BvbGljeShzdHJ1Y3QgaW9fYnVmZmVyICpo ZWFkKQ0KK3sNCisJY2hhciAqZGF0YSA9IGhlYWQtPndyaXRlX2J1ZjsNCisJYm9vbCBpc19kZWxl dGUgPSAwOw0KKw0KKwlpZiAoIXRteV9pc19yb290KCkpDQorCQlyZXR1cm4gLUVQRVJNOw0KKwlp ZiAodG15X3N0cnN0YXJ0cygmZGF0YSwgVE1ZX0RFTEVURSkpDQorCQlpc19kZWxldGUgPSAxOw0K KwlyZXR1cm4gdG15X2FkZF9tYW5hZ2VyX2VudHJ5KGRhdGEsIGlzX2RlbGV0ZSk7DQorfQ0KKw0K Ky8qIFJlYWQgbWFuYWdlciBsaXN0LiovDQorc3RhdGljIGludCB0bXlfcmVhZF9tYW5hZ2VyX3Bv bGljeShzdHJ1Y3QgaW9fYnVmZmVyICpoZWFkKQ0KK3sNCisJc3RydWN0IGxpc3RfaGVhZCAqcG9z Ow0KKwlpZiAoaGVhZC0+cmVhZF9lb2YpDQorCQlyZXR1cm4gMDsNCisJaWYgKCF0bXlfaXNfcm9v dCgpKQ0KKwkJcmV0dXJuIC1FUEVSTTsNCisJbGlzdF9mb3JfZWFjaF9jb29raWUocG9zLCBoZWFk LT5yZWFkX3ZhcjIsICZwb2xpY3lfbWFuYWdlcl9saXN0KSB7DQorCQlzdHJ1Y3QgcG9saWN5X21h bmFnZXJfZW50cnkgKnB0cjsNCisJCXB0ciA9IGxpc3RfZW50cnkocG9zLCBzdHJ1Y3QgcG9saWN5 X21hbmFnZXJfZW50cnksIGxpc3QpOw0KKwkJaWYgKCFwdHItPmlzX2RlbGV0ZWQgJiYNCisJCSAg ICB0bXlfaW9fcHJpbnRmKGhlYWQsICIlc1xuIiwgcHRyLT5tYW5hZ2VyLT5uYW1lKSkNCisJCQli cmVhazsNCisJfQ0KKwlpZiAoIWhlYWQtPnJlYWRfdmFyMikNCisJCWhlYWQtPnJlYWRfZW9mID0g MTsNCisJcmV0dXJuIDA7DQorfQ0KKw0KKy8qKg0KKyAqIHRteV9pc19wb2xpY3lfbWFuYWdlciAt IGNoZWNrIHdoZXRoZXIgbW9kaWZ5aW5nIHBvbGljeSBpcyBwZXJtaXR0ZWQuDQorICoNCisgKiBS ZXR1cm5zIG5vbnplcm8gaWYgbW9kaWZ5aW5nIHBvbGljeSBpcyBwZXJtaXR0ZWQuDQorICogUmV0 dXJucyB6ZXJvIG90aGVyd2lzZS4NCisgKg0KKyAqIE9ubHkgcHJvZ3JhbXMgb3IgZG9tYWlucyBy ZWdpc3RlcnMgYXMgbWFuYWdlciBhcmUgcGVybWl0dGVkIHRvIG1vZGlmeQ0KKyAqIHBvbGljeSB2 aWEgL3N5cy9rZXJuZWwvc2VjdXJpdHkvdG9tb3lvLyBpbnRlcmZhY2UuDQorICogVGhpcyBmdW5j dGlvbiBjaGVja3Mgd2hldGhlciB0aGUgY3VycmVudCBwcm9jZXNzIGlzIGEgcG9saWN5IG1hbmFn ZXIuDQorICogQnV0IHBvbGljeSBtYW5hZ2VyIGlzIG5vdCB0aGUgb25seSBwcm9jZXNzZXMgdGhh dCBjYW4gbW9kaWZ5IHBvbGljeTsNCisgKiBvdGhlciBwcm9jZXNzIGFyZSBwZXJtaXR0ZWQgdG8g YWRkIHBvbGljeQ0KKyAqIGlmIHRoZWlyIGRvbWFpbnMgYXJlIGFzc2lnbmVkIGEgcHJvZmlsZSBm b3IgbGVhcm5pbmcgbW9kZS4NCisgKi8NCitzdGF0aWMgaW50IHRteV9pc19wb2xpY3lfbWFuYWdl cih2b2lkKQ0KK3sNCisJc3RydWN0IHBvbGljeV9tYW5hZ2VyX2VudHJ5ICpwdHI7DQorCWNvbnN0 IGNoYXIgKmV4ZTsNCisJY29uc3Qgc3RydWN0IHBhdGhfaW5mbyAqZG9tYWlubmFtZSA9DQorCQlU TVlfU0VDVVJJVFktPmRvbWFpbi0+ZG9tYWlubmFtZTsNCisJYm9vbCBmb3VuZCA9IDA7DQorDQor CS8qIEV2ZXJ5b25lIGNhbiBtb2RpZnkgcG9saWN5IGJlZm9yZSAvc2Jpbi9pbml0IHN0YXJ0cy4g Ki8NCisJaWYgKCFzYmluX2luaXRfc3RhcnRlZCkNCisJCXJldHVybiAxOw0KKw0KKwlsaXN0X2Zv cl9lYWNoX2VudHJ5KHB0ciwgJnBvbGljeV9tYW5hZ2VyX2xpc3QsIGxpc3QpIHsNCisJCWlmICgh cHRyLT5pc19kZWxldGVkICYmDQorCQkgICAgcHRyLT5pc19kb21haW4gJiYNCisJCSAgICAhdG15 X3BhdGhjbXAoZG9tYWlubmFtZSwgcHRyLT5tYW5hZ2VyKSkNCisJCQlyZXR1cm4gMTsNCisJfQ0K Kw0KKwlleGUgPSB0bXlfZ2V0X2V4ZSgpOw0KKwlpZiAoIWV4ZSkNCisJCXJldHVybiAwOw0KKw0K KwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHB0ciwgJnBvbGljeV9tYW5hZ2VyX2xpc3QsIGxpc3QpIHsN CisJCWlmICghcHRyLT5pc19kZWxldGVkICYmDQorCQkgICAgIXB0ci0+aXNfZG9tYWluICYmDQor CQkgICAgIXN0cmNtcChleGUsIHB0ci0+bWFuYWdlci0+bmFtZSkpIHsNCisJCQlmb3VuZCA9IDE7 DQorCQkJYnJlYWs7DQorCQl9DQorCX0NCisNCisJaWYgKCFmb3VuZCkgew0KKwkJLyogUmVkdWNl IGVycm9yIG1lc3NhZ2VzLiAqLw0KKwkJc3RhdGljIHBpZF90IGxhc3RfcGlkOw0KKwkJY29uc3Qg cGlkX3QgcGlkID0gY3VycmVudC0+cGlkOw0KKwkJaWYgKGxhc3RfcGlkICE9IHBpZCkgew0KKwkJ CXByaW50ayhLRVJOX0lORk8NCisJCQkgICAgICAgIiVzIGlzIG5vdCBwZXJtaXR0ZWQgdG8gdXBk YXRlIHBvbGljaWVzLlxuIiwNCisJCQkgICAgICAgZXhlKTsNCisJCQlsYXN0X3BpZCA9IHBpZDsN CisJCX0NCisJfQ0KKw0KKwl0bXlfZnJlZShleGUpOw0KKwlyZXR1cm4gZm91bmQ7DQorfQ0KKw0K Ky8qKioqKioqKioqKioqKioqKioqKioqKioqICBET01BSU4gUE9MSUNZIEhBTkRMRVIgICoqKioq KioqKioqKioqKioqKioqKioqKiovDQorDQorLyogVXBkYXRlIGRvbWFpbiBwb2xpY3kuICovDQor c3RhdGljIGludCB0bXlfYWRkX2RvbWFpbl9wb2xpY3koc3RydWN0IGlvX2J1ZmZlciAqaGVhZCkN Cit7DQorCWNoYXIgKmRhdGEgPSBoZWFkLT53cml0ZV9idWY7DQorCWNoYXIgKmNwOw0KKwljb25z dCBzdHJ1Y3QgY29uZGl0aW9uX2xpc3QgKmNvbmQgPSBOVUxMOw0KKwlzdHJ1Y3QgZG9tYWluX2lu Zm8gKmRvbWFpbiA9IGhlYWQtPndyaXRlX3ZhcjE7DQorCWJvb2wgaXNfZGVsZXRlID0gMDsNCisJ Ym9vbCBpc19zZWxlY3QgPSAwOw0KKwlib29sIGlzX3VuZGVsZXRlID0gMDsNCisJdW5zaWduZWQg aW50IHByb2ZpbGU7DQorDQorCWlmICghdG15X2lzX3Jvb3QoKSkNCisJCXJldHVybiAtRVBFUk07 DQorDQorCWlmICh0bXlfc3Ryc3RhcnRzKCZkYXRhLCBUTVlfREVMRVRFKSkNCisJCWlzX2RlbGV0 ZSA9IDE7DQorCWVsc2UgaWYgKHRteV9zdHJzdGFydHMoJmRhdGEsIFRNWV9TRUxFQ1QpKQ0KKwkJ aXNfc2VsZWN0ID0gMTsNCisJZWxzZSBpZiAodG15X3N0cnN0YXJ0cygmZGF0YSwgVE1ZX1VOREVM RVRFKSkNCisJCWlzX3VuZGVsZXRlID0gMTsNCisNCisJdG15X3VwZGF0ZV9jb3VudGVyKFRNWV9V UERBVEVfRE9NQUlOUE9MSUNZKTsNCisNCisJaWYgKHRteV9pc19kb21haW5fZGVmKGRhdGEpKSB7 DQorCQlpZiAoaXNfZGVsZXRlKSB7DQorCQkJdG15X2RlbGV0ZV9kb21haW4oZGF0YSk7DQorCQkJ ZG9tYWluID0gTlVMTDsNCisJCX0gZWxzZSBpZiAoaXNfc2VsZWN0KQ0KKwkJCWRvbWFpbiA9IHRt eV9maW5kX2RvbWFpbihkYXRhKTsNCisJCWVsc2UgaWYgKGlzX3VuZGVsZXRlKQ0KKwkJCWRvbWFp biA9IHRteV91bmRlbGV0ZV9kb21haW4oZGF0YSk7DQorCQllbHNlDQorCQkJZG9tYWluID0gdG15 X25ld19kb21haW4oZGF0YSwgMCk7DQorCQloZWFkLT53cml0ZV92YXIxID0gZG9tYWluOw0KKwkJ cmV0dXJuIDA7DQorCX0NCisNCisJaWYgKCFkb21haW4pDQorCQlyZXR1cm4gLUVJTlZBTDsNCisN CisJaWYgKHNzY2FuZihkYXRhLCBUTVlfVVNFX1BST0ZJTEUgIiV1IiwgJnByb2ZpbGUpID09IDEg JiYNCisJICAgIHByb2ZpbGUgPCBUTVlfTUFYX1BST0ZJTEVTKSB7DQorCQlpZiAocHJvZmlsZV9w dHJbcHJvZmlsZV0gfHwgIXNiaW5faW5pdF9zdGFydGVkKQ0KKwkJCWRvbWFpbi0+cHJvZmlsZSA9 ICh1OCkgcHJvZmlsZTsNCisJCXJldHVybiAwOw0KKwl9DQorCWNwID0gdG15X2ZpbmRfY29uZGl0 aW9uX3BhcnQoZGF0YSk7DQorCWlmIChjcCkgew0KKwkJY29uZCA9IHRteV9hc3NpZ25fY29uZGl0 aW9uKGNwKTsNCisJCWlmICghY29uZCkNCisJCQlyZXR1cm4gLUVJTlZBTDsNCisJfQ0KKwlpZiAo dG15X3N0cnN0YXJ0cygmZGF0YSwgVE1ZX0FMTE9XX05FVFdPUkspKQ0KKwkJcmV0dXJuIHRteV9h ZGRfbmV0d29ya19wb2xpY3koZGF0YSwgZG9tYWluLCBjb25kLCBpc19kZWxldGUpOw0KKwllbHNl IGlmICh0bXlfc3Ryc3RhcnRzKCZkYXRhLCBUTVlfQUxMT1dfQVJHVjApKQ0KKwkJcmV0dXJuIHRt eV9hZGRfYXJndjBfcG9saWN5KGRhdGEsIGRvbWFpbiwgY29uZCwgaXNfZGVsZXRlKTsNCisJZWxz ZSBpZiAodG15X3N0cnN0YXJ0cygmZGF0YSwgVE1ZX0FMTE9XX0VOVikpDQorCQlyZXR1cm4gdG15 X2FkZF9lbnZfcG9saWN5KGRhdGEsIGRvbWFpbiwgY29uZCwgaXNfZGVsZXRlKTsNCisJZWxzZSBp ZiAodG15X3N0cnN0YXJ0cygmZGF0YSwgVE1ZX0FMTE9XX1NJR05BTCkpDQorCQlyZXR1cm4gdG15 X2FkZF9zaWduYWxfcG9saWN5KGRhdGEsIGRvbWFpbiwgY29uZCwgaXNfZGVsZXRlKTsNCisJZWxz ZSBpZiAodG15X3N0cnN0YXJ0cygmZGF0YSwgVE1ZX0FMTE9XX0NBUEFCSUxJVFkpKQ0KKwkJcmV0 dXJuIHRteV9hZGRfY2FwYWJpbGl0eV9wb2xpY3koZGF0YSwgZG9tYWluLCBjb25kLCBpc19kZWxl dGUpOw0KKwllbHNlDQorCQlyZXR1cm4gdG15X2FkZF9maWxlX3BvbGljeShkYXRhLCBkb21haW4s IGNvbmQsIGlzX2RlbGV0ZSk7DQorDQorCXJldHVybiAtRUlOVkFMOw0KK30NCisNCisvKiBEdW1w IGZpbGUncyBvcGVuIEFDTC4gKi8NCitzdGF0aWMgaW5saW5lIGludCBwcmludF9maWxlX3J3eF9h Y2woc3RydWN0IGlvX2J1ZmZlciAqaGVhZCwNCisJCQkJICAgICBzdHJ1Y3QgYWNsX2luZm8gKnB0 cikNCit7DQorCXN0cnVjdCBmaWxlX2FjbCAqcHRyMiA9IGNvbnRhaW5lcl9vZihwdHIsIHN0cnVj dCBmaWxlX2FjbCwgaGVhZCk7DQorCWNvbnN0IHVuc2lnbmVkIGNoYXIgYiA9IHB0cjItPnVfaXNf Z3JvdXA7DQorDQorCWlmICh0bXlfaW9fcHJpbnRmKGhlYWQsICIlZCAlcyVzIiwNCisJCQkgIHB0 cjItPnBlcm0sIGIgPyAiQCIgOiAiIiwNCisJCQkgIGIgPyBwdHIyLT51Lmdyb3VwLT5ncm91cF9u YW1lLT5uYW1lIDoNCisJCQkgIHB0cjItPnUuZmlsZW5hbWUtPm5hbWUpKQ0KKwkJcmV0dXJuIC1F Tk9NRU07DQorCXJldHVybiAwOw0KK30NCisNCisvKiBEdW1wIGFyZ3ZbMF0ncyBBQ0wuICovDQor c3RhdGljIGlubGluZSBpbnQgcHJpbnRfYXJndjBfYWNsKHN0cnVjdCBpb19idWZmZXIgKmhlYWQs DQorCQkJCSAgc3RydWN0IGFjbF9pbmZvICpwdHIpDQorew0KKwlzdHJ1Y3QgYXJndjBfYWNsICpw dHIyID0gY29udGFpbmVyX29mKHB0ciwgc3RydWN0IGFyZ3YwX2FjbCwgaGVhZCk7DQorDQorCWlm ICh0bXlfaW9fcHJpbnRmKGhlYWQsIFRNWV9BTExPV19BUkdWMCAiJXMgJXMiLA0KKwkJCSAgcHRy Mi0+ZmlsZW5hbWUtPm5hbWUsIHB0cjItPmFyZ3YwLT5uYW1lKSkNCisJCXJldHVybiAtRU5PTUVN Ow0KKwlyZXR1cm4gMDsNCit9DQorDQorLyogRHVtcCBlbnZpcm9ubWVudCB2YXJpYWJsZSdzIEFD TC4gKi8NCitzdGF0aWMgaW5saW5lIGludCBwcmludF9lbnZfYWNsKHN0cnVjdCBpb19idWZmZXIg KmhlYWQsDQorCQkJCXN0cnVjdCBhY2xfaW5mbyAqcHRyKQ0KK3sNCisJc3RydWN0IGVudl9hY2wg KnB0cjIgPSBjb250YWluZXJfb2YocHRyLCBzdHJ1Y3QgZW52X2FjbCwgaGVhZCk7DQorDQorCWlm ICh0bXlfaW9fcHJpbnRmKGhlYWQsIFRNWV9BTExPV19FTlYgIiVzIiwgcHRyMi0+ZW52LT5uYW1l KSkNCisJCXJldHVybiAtRU5PTUVNOw0KKwlyZXR1cm4gMDsNCit9DQorDQorLyogRHVtcCBuZXR3 b3JrJ3MgQUNMLiAqLw0KK3N0YXRpYyBpbmxpbmUgaW50IHByaW50X25ldHdvcmtfYWNsKHN0cnVj dCBpb19idWZmZXIgKmhlYWQsDQorCQkJCSAgICBzdHJ1Y3QgYWNsX2luZm8gKnB0cikNCit7DQor CXN0cnVjdCBuZXRfYWNsICpwdHIyID0gY29udGFpbmVyX29mKHB0ciwgc3RydWN0IG5ldF9hY2ws IGhlYWQpOw0KKwl1OCByZWNvcmRfdHlwZSA9IHB0cjItPnJlY29yZF90eXBlOw0KKwl1MzIgbWlu X2FkZHJlc3M7DQorCXUzMiBtYXhfYWRkcmVzczsNCisJY2hhciBidWZbNjRdOw0KKwljb25zdCBz dHJ1Y3QgaW42X2FkZHIgKm1pbl9hZGRyZXNzX3B0cjsNCisJY29uc3Qgc3RydWN0IGluNl9hZGRy ICptYXhfYWRkcmVzc19wdHI7DQorCXUxNiBtaW5fcG9ydDsNCisJdTE2IG1heF9wb3J0Ow0KKw0K KwlpZiAodG15X2lvX3ByaW50ZihoZWFkLCBUTVlfQUxMT1dfTkVUV09SSyAiJXMgIiwNCisJCQkg IHRteV9uZXR3b3JrMmtleXdvcmQocHRyMi0+b3BlcmF0aW9uX3R5cGUpKSkNCisJCWdvdG8gb3V0 Ow0KKwlpZiAocmVjb3JkX3R5cGUgIT0gVE1ZX1RZUEVfQUREUkVTU19HUk9VUCkNCisJCWdvdG8g bm9uX2FkZHJlc3NfZ3JvdXA7DQorDQorCWlmICh0bXlfaW9fcHJpbnRmKGhlYWQsICJAJXMiLCBw dHIyLT51Lmdyb3VwLT5ncm91cF9uYW1lLT5uYW1lKSkNCisJCWdvdG8gb3V0Ow0KKwlnb3RvIHBy aW50X3BvcnQ7DQorDQorbm9uX2FkZHJlc3NfZ3JvdXA6IDsNCisJaWYgKHJlY29yZF90eXBlICE9 IFRNWV9UWVBFX0lQdjQpDQorCQlnb3RvIGlwdjZfYWRkcmVzczsNCisNCisJbWluX2FkZHJlc3Mg PSBwdHIyLT51LmlwdjQubWluOw0KKwltYXhfYWRkcmVzcyA9IHB0cjItPnUuaXB2NC5tYXg7DQor CWlmICh0bXlfaW9fcHJpbnRmKGhlYWQsIE5JUFFVQURfRk1ULCBISVBRVUFEKG1pbl9hZGRyZXNz KSkpDQorCQlnb3RvIG91dDsNCisJaWYgKG1pbl9hZGRyZXNzICE9IG1heF9hZGRyZXNzICYmDQor CSAgICB0bXlfaW9fcHJpbnRmKGhlYWQsICItIiBOSVBRVUFEX0ZNVCwgSElQUVVBRChtYXhfYWRk cmVzcykpKQ0KKwkJZ290byBvdXQ7DQorCWdvdG8gcHJpbnRfcG9ydDsNCisNCitpcHY2X2FkZHJl c3M6IDsNCisJbWluX2FkZHJlc3NfcHRyID0gcHRyMi0+dS5pcHY2Lm1pbjsNCisJbWF4X2FkZHJl c3NfcHRyID0gcHRyMi0+dS5pcHY2Lm1heDsNCisJdG15X3ByaW50X2lwdjYoYnVmLCBzaXplb2Yo YnVmKSwgbWluX2FkZHJlc3NfcHRyKTsNCisJaWYgKHRteV9pb19wcmludGYoaGVhZCwgIiVzIiwg YnVmKSkNCisJCWdvdG8gb3V0Ow0KKwlpZiAobWVtY21wKG1pbl9hZGRyZXNzX3B0ciwgbWF4X2Fk ZHJlc3NfcHRyLCAxNikpIHsNCisJCXRteV9wcmludF9pcHY2KGJ1Ziwgc2l6ZW9mKGJ1ZiksIG1h eF9hZGRyZXNzX3B0cik7DQorCQlpZiAodG15X2lvX3ByaW50ZihoZWFkLCAiLSVzIiwgYnVmKSkN CisJCQlnb3RvIG91dDsNCisJfQ0KKw0KK3ByaW50X3BvcnQ6IDsNCisJbWluX3BvcnQgPSBwdHIy LT5taW5fcG9ydDsNCisJbWF4X3BvcnQgPSBwdHIyLT5tYXhfcG9ydDsNCisJaWYgKHRteV9pb19w cmludGYoaGVhZCwgIiAldSIsIG1pbl9wb3J0KSkNCisJCWdvdG8gb3V0Ow0KKwlpZiAobWluX3Bv cnQgIT0gbWF4X3BvcnQgJiYgdG15X2lvX3ByaW50ZihoZWFkLCAiLSV1IiwgbWF4X3BvcnQpKQ0K KwkJZ290byBvdXQ7DQorCXJldHVybiAwOw0KK291dDogOw0KKwlyZXR1cm4gLUVOT01FTTsNCit9 DQorDQorLyogRHVtcCBzaWduYWwncyBBQ0wuICovDQorc3RhdGljIGlubGluZSBpbnQgcHJpbnRf c2lnbmFsX2FjbChzdHJ1Y3QgaW9fYnVmZmVyICpoZWFkLA0KKwkJCQkgICBzdHJ1Y3QgYWNsX2lu Zm8gKnB0cikNCit7DQorCXN0cnVjdCBzaWduYWxfYWNsICpwdHIyID0gY29udGFpbmVyX29mKHB0 ciwgc3RydWN0IHNpZ25hbF9hY2wsIGhlYWQpOw0KKw0KKwlpZiAodG15X2lvX3ByaW50ZihoZWFk LCBUTVlfQUxMT1dfU0lHTkFMICIldSAlcyIsDQorCQkJICBwdHIyLT5zaWcsIHB0cjItPmRvbWFp bm5hbWUtPm5hbWUpKQ0KKwkJcmV0dXJuIC1FTk9NRU07DQorCXJldHVybiAwOw0KK30NCisNCisv KiBEdW1wIGNhcGFiaWxpdHkncyBBQ0wuICovDQorc3RhdGljIGlubGluZSBpbnQgcHJpbnRfY2Fw YWJpbGl0eV9hY2woc3RydWN0IGlvX2J1ZmZlciAqaGVhZCwNCisJCQkJICAgICAgIHN0cnVjdCBh Y2xfaW5mbyAqcHRyKQ0KK3sNCisJc3RydWN0IGNhcGFiaWxpdHlfYWNsICpwdHIyID0NCisJCWNv bnRhaW5lcl9vZihwdHIsIHN0cnVjdCBjYXBhYmlsaXR5X2FjbCwgaGVhZCk7DQorDQorCWlmICh0 bXlfaW9fcHJpbnRmKGhlYWQsIFRNWV9BTExPV19DQVBBQklMSVRZICIlcyIsDQorCQkJICB0bXlf Y2FwYWJpbGl0eTJrZXl3b3JkKHB0cjItPmNhcGFiaWxpdHkpKSkNCisJCXJldHVybiAtRU5PTUVN Ow0KKwlyZXR1cm4gMDsNCit9DQorDQorLyogRHVtcCBmaWxlJ3Mgbm9uLW9wZW4gQUNMLiAqLw0K K3N0YXRpYyBpbmxpbmUgaW50IHByaW50X2ZpbGVfb3RoZXJfYWNsKHN0cnVjdCBpb19idWZmZXIg KmhlYWQsDQorCQkJCSAgICAgICBzdHJ1Y3QgYWNsX2luZm8gKnB0cikNCit7DQorCWNvbnN0IHU4 IGFjbF90eXBlID0gcHRyLT50eXBlOw0KKwljb25zdCBjaGFyICprZXl3b3JkID0gdG15X2FjbHR5 cGUya2V5d29yZChhY2xfdHlwZSk7DQorDQorCWlmICgha2V5d29yZCkNCisJCXJldHVybiAwOyAv KiBUaGlzIG11c3Qgbm90IGhhcHBlbi4gKi8NCisNCisJaWYgKHRteV9hY2x0eXBlMnBhdGhzKGFj bF90eXBlKSA9PSAyKSB7DQorCQlzdHJ1Y3QgZG91YmxlX2FjbCAqcHRyMiA9DQorCQkJY29udGFp bmVyX29mKHB0ciwgc3RydWN0IGRvdWJsZV9hY2wsIGhlYWQpOw0KKwkJY29uc3QgYm9vbCBiMSA9 IHB0cjItPnUxX2lzX2dyb3VwOw0KKwkJY29uc3QgYm9vbCBiMiA9IHB0cjItPnUyX2lzX2dyb3Vw Ow0KKw0KKwkJaWYgKHRteV9pb19wcmludGYoaGVhZCwNCisJCQkJICAiYWxsb3dfJXMgJXMlcyAl cyVzIiwNCisJCQkJICBrZXl3b3JkLA0KKwkJCQkgIGIxID8gIkAiIDogIiIsDQorCQkJCSAgYjEg PyBwdHIyLT51MS5ncm91cDEtPmdyb3VwX25hbWUtPm5hbWUgOg0KKwkJCQkgIHB0cjItPnUxLmZp bGVuYW1lMS0+bmFtZSwNCisJCQkJICBiMiA/ICJAIiA6ICIiLA0KKwkJCQkgIGIyID8gcHRyMi0+ dTIuZ3JvdXAyLT5ncm91cF9uYW1lLT5uYW1lIDoNCisJCQkJICBwdHIyLT51Mi5maWxlbmFtZTIt Pm5hbWUpKQ0KKwkJCXJldHVybiAtRU5PTUVNOw0KKwl9IGVsc2Ugew0KKwkJc3RydWN0IHNpbmds ZV9hY2wgKnB0cjINCisJCQk9IGNvbnRhaW5lcl9vZihwdHIsIHN0cnVjdCBzaW5nbGVfYWNsLCBo ZWFkKTsNCisJCWNvbnN0IGJvb2wgYiA9IHB0cjItPnVfaXNfZ3JvdXA7DQorDQorCQlpZiAodG15 X2lvX3ByaW50ZihoZWFkLA0KKwkJCQkgICJhbGxvd18lcyAlcyVzIiwNCisJCQkJICBrZXl3b3Jk LA0KKwkJCQkgIGIgPyAiQCIgOiAiIiwNCisJCQkJICBiID8gcHRyMi0+dS5ncm91cC0+Z3JvdXBf bmFtZS0+bmFtZSA6DQorCQkJCSAgcHRyMi0+dS5maWxlbmFtZS0+bmFtZSkpDQorCQkJcmV0dXJu IC1FTk9NRU07DQorCX0NCisJcmV0dXJuIDA7DQorfQ0KKw0KKy8qIFJlYWQgZG9tYWluIHBvbGlj eS4gKi8NCitzdGF0aWMgaW50IHRteV9yZWFkX2RvbWFpbl9wb2xpY3koc3RydWN0IGlvX2J1ZmZl ciAqaGVhZCkNCit7DQorCXN0cnVjdCBsaXN0X2hlYWQgKmRwb3M7DQorCXN0cnVjdCBsaXN0X2hl YWQgKmFwb3M7DQorDQorCWlmIChoZWFkLT5yZWFkX2VvZikNCisJCXJldHVybiAwOw0KKw0KKwlp ZiAoaGVhZC0+cmVhZF9zdGVwID09IDApIHsNCisJCWlmICghdG15X2lzX3Jvb3QoKSkNCisJCQly ZXR1cm4gLUVQRVJNOw0KKwkJaGVhZC0+cmVhZF9zdGVwID0gMTsNCisJfQ0KKwlsaXN0X2Zvcl9l YWNoX2Nvb2tpZShkcG9zLCBoZWFkLT5yZWFkX3ZhcjEsICZkb21haW5fbGlzdCkgew0KKwkJc3Ry dWN0IGRvbWFpbl9pbmZvICpkb21haW47DQorCQlkb21haW4gPSBsaXN0X2VudHJ5KGRwb3MsIHN0 cnVjdCBkb21haW5faW5mbywgbGlzdCk7DQorCQlpZiAoaGVhZC0+cmVhZF9zdGVwICE9IDEpDQor CQkJZ290byBhY2xfbG9vcDsNCisJCWlmIChkb21haW4tPmlzX2RlbGV0ZWQpDQorCQkJY29udGlu dWU7DQorCQlpZiAodG15X2lvX3ByaW50ZihoZWFkLA0KKwkJCQkgICIlc1xuIiBUTVlfVVNFX1BS T0ZJTEUgIiV1XG4lc1xuIiwNCisJCQkJICBkb21haW4tPmRvbWFpbm5hbWUtPm5hbWUsDQorCQkJ CSAgZG9tYWluLT5wcm9maWxlLA0KKwkJCQkgIGRvbWFpbi0+cXVvdGFfd2FybmVkID8NCisJCQkJ ICAicXVvdGFfZXhjZWVkZWRcbiIgOiAiIikpDQorCQkJcmV0dXJuIDA7DQorCQloZWFkLT5yZWFk X3N0ZXAgPSAyOw0KK2FjbF9sb29wOiA7DQorCQlpZiAoaGVhZC0+cmVhZF9zdGVwID09IDMpDQor CQkJZ290byB0YWlsX21hcms7DQorCQlsaXN0X2Zvcl9lYWNoX2Nvb2tpZShhcG9zLCBoZWFkLT5y ZWFkX3ZhcjIsDQorCQkJCSAgICAgJmRvbWFpbi0+YWNsX2luZm9fbGlzdCkgew0KKwkJCXN0cnVj dCBhY2xfaW5mbyAqcHRyOw0KKwkJCWludCBwb3M7DQorCQkJdTggYWNsX3R5cGU7DQorCQkJcHRy ID0gbGlzdF9lbnRyeShhcG9zLCBzdHJ1Y3QgYWNsX2luZm8sIGxpc3QpOw0KKwkJCWlmIChwdHIt PmlzX2RlbGV0ZWQpDQorCQkJCWNvbnRpbnVlOw0KKwkJCXBvcyA9IGhlYWQtPnJlYWRfYXZhaWw7 DQorCQkJYWNsX3R5cGUgPSBwdHItPnR5cGU7DQorCQkJaWYgKGFjbF90eXBlID09IFRNWV9UWVBF X0ZJTEVfQUNMKSB7DQorCQkJCWlmIChwcmludF9maWxlX3J3eF9hY2woaGVhZCwgcHRyKSkNCisJ CQkJCWdvdG8gcHJpbnRfYWNsX3JvbGxiYWNrOw0KKwkJCX0gZWxzZSBpZiAoYWNsX3R5cGUgPT0g VE1ZX1RZUEVfQVJHVjBfQUNMKSB7DQorCQkJCWlmIChwcmludF9hcmd2MF9hY2woaGVhZCwgcHRy KSkNCisJCQkJCWdvdG8gcHJpbnRfYWNsX3JvbGxiYWNrOw0KKwkJCX0gZWxzZSBpZiAoYWNsX3R5 cGUgPT0gVE1ZX1RZUEVfRU5WX0FDTCkgew0KKwkJCQlpZiAocHJpbnRfZW52X2FjbChoZWFkLCBw dHIpKQ0KKwkJCQkJZ290byBwcmludF9hY2xfcm9sbGJhY2s7DQorCQkJfSBlbHNlIGlmIChhY2xf dHlwZSA9PSBUTVlfVFlQRV9JUF9ORVRXT1JLX0FDTCkgew0KKwkJCQlpZiAocHJpbnRfbmV0d29y a19hY2woaGVhZCwgcHRyKSkNCisJCQkJCWdvdG8gcHJpbnRfYWNsX3JvbGxiYWNrOw0KKwkJCX0g ZWxzZSBpZiAoYWNsX3R5cGUgPT0gVE1ZX1RZUEVfU0lHTkFMX0FDTCkgew0KKwkJCQlpZiAocHJp bnRfc2lnbmFsX2FjbChoZWFkLCBwdHIpKQ0KKwkJCQkJZ290byBwcmludF9hY2xfcm9sbGJhY2s7 DQorCQkJfSBlbHNlIGlmIChhY2xfdHlwZSA9PSBUTVlfVFlQRV9DQVBBQklMSVRZX0FDTCkgew0K KwkJCQlpZiAocHJpbnRfY2FwYWJpbGl0eV9hY2woaGVhZCwgcHRyKSkNCisJCQkJCWdvdG8gcHJp bnRfYWNsX3JvbGxiYWNrOw0KKwkJCX0gZWxzZQ0KKwkJCQlpZiAocHJpbnRfZmlsZV9vdGhlcl9h Y2woaGVhZCwgcHRyKSkNCisJCQkJCWdvdG8gcHJpbnRfYWNsX3JvbGxiYWNrOw0KKwkJCWlmICh0 bXlfZHVtcF9jb25kaXRpb24oaGVhZCwgcHRyLT5jb25kKSkgew0KK3ByaW50X2FjbF9yb2xsYmFj azogOw0KKwkJCQloZWFkLT5yZWFkX2F2YWlsID0gcG9zOw0KKwkJCQlyZXR1cm4gMDsNCisJCQl9 DQorCQl9DQorCQloZWFkLT5yZWFkX3N0ZXAgPSAzOw0KK3RhaWxfbWFyazogOw0KKwkJaWYgKHRt eV9pb19wcmludGYoaGVhZCwgIlxuIikpDQorCQkJcmV0dXJuIDA7DQorCQloZWFkLT5yZWFkX3N0 ZXAgPSAxOw0KKwl9DQorCWhlYWQtPnJlYWRfZW9mID0gMTsNCisJcmV0dXJuIDA7DQorfQ0KKw0K Ky8qIFJlYWQgZG9tYWlubmFtZSBhbmQgaXRzIHByb2ZpbGUgdmFsdWVzLiAqLw0KK3N0YXRpYyBp bnQgdG15X3JlYWRfZG9tYWluX3Byb2ZpbGUoc3RydWN0IGlvX2J1ZmZlciAqaGVhZCkNCit7DQor CXN0cnVjdCBsaXN0X2hlYWQgKnBvczsNCisJaWYgKGhlYWQtPnJlYWRfZW9mKQ0KKwkJcmV0dXJu IDA7DQorCWlmICghdG15X2lzX3Jvb3QoKSkNCisJCXJldHVybiAtRVBFUk07DQorCWxpc3RfZm9y X2VhY2hfY29va2llKHBvcywgaGVhZC0+cmVhZF92YXIxLCAmZG9tYWluX2xpc3QpIHsNCisJCXN0 cnVjdCBkb21haW5faW5mbyAqZG9tYWluOw0KKwkJZG9tYWluID0gbGlzdF9lbnRyeShwb3MsIHN0 cnVjdCBkb21haW5faW5mbywgbGlzdCk7DQorCQlpZiAoZG9tYWluLT5pc19kZWxldGVkKQ0KKwkJ CWNvbnRpbnVlOw0KKwkJaWYgKHRteV9pb19wcmludGYoaGVhZCwgIiV1ICVzXG4iLA0KKwkJCQkg IGRvbWFpbi0+cHJvZmlsZSwgZG9tYWluLT5kb21haW5uYW1lLT5uYW1lKSkNCisJCQlyZXR1cm4g MDsNCisJfQ0KKwloZWFkLT5yZWFkX2VvZiA9IDE7DQorCXJldHVybiAwOw0KK30NCisNCisvKiBT ZXQgUElEIHRvIHJlcG9ydC4gTm9uIG1hbmFnZXIgcHJvY2VzcyBpcyBwZXJtaXR0ZWQgdG8gY2Fs bCB0aGlzIGZ1bmN0aW9uLiAqLw0KK3N0YXRpYyBpbnQgdG15X3dyaXRlX3BpZChzdHJ1Y3QgaW9f YnVmZmVyICpoZWFkKQ0KK3sNCisJaGVhZC0+cmVhZF9zdGVwID0gKGludCkgc2ltcGxlX3N0cnRv dWwoaGVhZC0+d3JpdGVfYnVmLCBOVUxMLCAxMCk7DQorCWhlYWQtPnJlYWRfZW9mID0gMDsNCisJ cmV0dXJuIDA7DQorfQ0KKw0KKy8qIFJlYWQgZG9tYWlubmFtZSBhbmQgaXRzIHByb2ZpbGUgdmFs dWVzLiAqLw0KK3N0YXRpYyBpbnQgdG15X3JlYWRfcGlkKHN0cnVjdCBpb19idWZmZXIgKmhlYWQp DQorew0KKwljb25zdCBpbnQgcGlkID0gaGVhZC0+cmVhZF9zdGVwOw0KKwlzdHJ1Y3QgdGFza19z dHJ1Y3QgKnA7DQorCXN0cnVjdCBkb21haW5faW5mbyAqZG9tYWluID0gTlVMTDsNCisNCisJLyog SWYgUElEIGlzIG5vdCBzZXQgdmlhIHRteV93cml0ZV9waWQoKSwgZG8gbm90aGluZy4gKi8NCisJ aWYgKGhlYWQtPnJlYWRfYXZhaWwgfHwgaGVhZC0+cmVhZF9lb2YpDQorCQlyZXR1cm4gMDsNCisN CisJLyoqKioqIENSSVRJQ0FMIFNFQ1RJT04gU1RBUlQgKioqKiovDQorCXJlYWRfbG9jaygmdGFz a2xpc3RfbG9jayk7DQorCXAgPSBmaW5kX3Rhc2tfYnlfcGlkKHBpZCk7DQorCWlmIChwKSB7DQor CQkvKiAic3RydWN0IHRhc2tfc3RydWN0Ii0+c2VjdXJpdHkgaXMgbm90IE5VTEwuICovDQorCQlk b21haW4gPSAoKHN0cnVjdCB0bXlfc2VjdXJpdHkgKikgcC0+c2VjdXJpdHkpLT5kb21haW47DQor CX0NCisJcmVhZF91bmxvY2soJnRhc2tsaXN0X2xvY2spOw0KKwkvKioqKiogQ1JJVElDQUwgU0VD VElPTiBFTkQgKioqKiovDQorDQorCWlmIChkb21haW4pDQorCQl0bXlfaW9fcHJpbnRmKGhlYWQs ICIlZCAldSAlcyIsDQorCQkJICAgICAgcGlkLCBkb21haW4tPnByb2ZpbGUsIGRvbWFpbi0+ZG9t YWlubmFtZS0+bmFtZSk7DQorCWhlYWQtPnJlYWRfZW9mID0gMTsNCisNCisJcmV0dXJuIDA7DQor fQ0KKw0KKy8qIFVwZGF0ZSBwcm9maWxlIHZhbHVlcyBmb3IgZG9tYWlucy4gKi8NCitzdGF0aWMg aW50IHRteV91cGRhdGVfZG9tYWluX3Byb2ZpbGUoc3RydWN0IGlvX2J1ZmZlciAqaGVhZCkNCit7 DQorCWNoYXIgKmRhdGEgPSBoZWFkLT53cml0ZV9idWY7DQorCWNoYXIgKmNwID0gc3RyY2hyKGRh dGEsICcgJyk7DQorCXN0cnVjdCBkb21haW5faW5mbyAqZG9tYWluOw0KKwl1bnNpZ25lZCBpbnQg cHJvZmlsZTsNCisNCisJaWYgKCF0bXlfaXNfcm9vdCgpKQ0KKwkJcmV0dXJuIC1FUEVSTTsNCisJ aWYgKCFjcCkNCisJCXJldHVybiAtRUlOVkFMOw0KKw0KKwkqY3AgPSAnXDAnOw0KKwlkb21haW4g PSB0bXlfZmluZF9kb21haW4oY3AgKyAxKTsNCisJcHJvZmlsZSA9IHNpbXBsZV9zdHJ0b3VsKGRh dGEsIE5VTEwsIDEwKTsNCisJaWYgKGRvbWFpbiAmJiBwcm9maWxlIDwgVE1ZX01BWF9QUk9GSUxF UyAmJg0KKwkgICAgKHByb2ZpbGVfcHRyW3Byb2ZpbGVdIHx8ICFzYmluX2luaXRfc3RhcnRlZCkp DQorCQlkb21haW4tPnByb2ZpbGUgPSAodTgpIHByb2ZpbGU7DQorCXRteV91cGRhdGVfY291bnRl cihUTVlfVVBEQVRFX0RPTUFJTlBPTElDWSk7DQorDQorCXJldHVybiAwOw0KK30NCisNCisvKioq KioqKioqKioqKioqKioqKioqKioqKiAgU1lTVEVNIFBPTElDWSBIQU5ETEVSICAqKioqKioqKioq KioqKioqKioqKioqKioqLw0KKw0KKy8qIFVwZGF0ZSBzeXN0ZW0gcG9saWN5LiAqLw0KK3N0YXRp YyBpbnQgdG15X2FkZF9zeXN0ZW1fcG9saWN5KHN0cnVjdCBpb19idWZmZXIgKmhlYWQpDQorew0K KwljaGFyICpkYXRhID0gaGVhZC0+d3JpdGVfYnVmOw0KKwlib29sIGlzX2RlbGV0ZSA9IDA7DQor DQorCWlmICghdG15X2lzX3Jvb3QoKSkNCisJCXJldHVybiAtRVBFUk07DQorDQorCXRteV91cGRh dGVfY291bnRlcihUTVlfVVBEQVRFX1NZU1RFTVBPTElDWSk7DQorDQorCWlmICh0bXlfc3Ryc3Rh cnRzKCZkYXRhLCBUTVlfREVMRVRFKSkNCisJCWlzX2RlbGV0ZSA9IDE7DQorCWlmICh0bXlfc3Ry c3RhcnRzKCZkYXRhLCBUTVlfQUxMT1dfTU9VTlQpKQ0KKwkJcmV0dXJuIHRteV9hZGRfbW91bnRf cG9saWN5KGRhdGEsIGlzX2RlbGV0ZSk7DQorCWlmICh0bXlfc3Ryc3RhcnRzKCZkYXRhLCBUTVlf REVOWV9VTk1PVU5UKSkNCisJCXJldHVybiB0bXlfYWRkX25vX3Vtb3VudF9wb2xpY3koZGF0YSwg aXNfZGVsZXRlKTsNCisJaWYgKHRteV9zdHJzdGFydHMoJmRhdGEsIFRNWV9BTExPV19QSVZPVF9S T09UKSkNCisJCXJldHVybiB0bXlfYWRkX3Bpdm90X3Jvb3RfcG9saWN5KGRhdGEsIGlzX2RlbGV0 ZSk7DQorDQorCXJldHVybiAtRUlOVkFMOw0KK30NCisNCisvKiBSZWFkIHN5c3RlbSBwb2xpY3ku ICovDQorc3RhdGljIGludCB0bXlfcmVhZF9zeXN0ZW1fcG9saWN5KHN0cnVjdCBpb19idWZmZXIg KmhlYWQpDQorew0KKwlpZiAoaGVhZC0+cmVhZF9lb2YpDQorCQlyZXR1cm4gMDsNCisJc3dpdGNo IChoZWFkLT5yZWFkX3N0ZXApIHsNCisJY2FzZSAwOg0KKwkJaWYgKCF0bXlfaXNfcm9vdCgpKQ0K KwkJCXJldHVybiAtRVBFUk07DQorCQloZWFkLT5yZWFkX3N0ZXAgPSAxOw0KKwljYXNlIDE6DQor CQlpZiAodG15X3JlYWRfbW91bnRfcG9saWN5KGhlYWQpKQ0KKwkJCWJyZWFrOw0KKwkJaGVhZC0+ cmVhZF9zdGVwID0gMjsNCisJY2FzZSAyOg0KKwkJaWYgKHRteV9yZWFkX25vX3Vtb3VudF9wb2xp Y3koaGVhZCkpDQorCQkJYnJlYWs7DQorCQloZWFkLT5yZWFkX3N0ZXAgPSAzOw0KKwljYXNlIDM6 DQorCQlpZiAodG15X3JlYWRfcGl2b3Rfcm9vdF9wb2xpY3koaGVhZCkpDQorCQkJYnJlYWs7DQor CQloZWFkLT5yZWFkX2VvZiA9IDE7DQorCQlicmVhazsNCisJZGVmYXVsdDoNCisJCXJldHVybiAt RUlOVkFMOw0KKwl9DQorCXJldHVybiAwOw0KK30NCisNCisvKioqKioqKioqKioqKioqKioqKioq KioqKiAgRVhDRVBUSU9OIFBPTElDWSBIQU5ETEVSICAqKioqKioqKioqKioqKioqKioqKioqKioq Lw0KKy8qIFVwZGF0ZSBleGNlcHRpb24gcG9saWN5LiAqLw0KK3N0YXRpYyBpbnQgdG15X2FkZF9l eGNlcHRpb25fcG9saWN5KHN0cnVjdCBpb19idWZmZXIgKmhlYWQpDQorew0KKwljaGFyICpkYXRh ID0gaGVhZC0+d3JpdGVfYnVmOw0KKwlib29sIGlzX2RlbGV0ZSA9IDA7DQorDQorCWlmICghdG15 X2lzX3Jvb3QoKSkNCisJCXJldHVybiAtRVBFUk07DQorDQorCXRteV91cGRhdGVfY291bnRlcihU TVlfVVBEQVRFX0VYQ0VQVElPTlBPTElDWSk7DQorDQorCWlmICh0bXlfc3Ryc3RhcnRzKCZkYXRh LCBUTVlfREVMRVRFKSkNCisJCWlzX2RlbGV0ZSA9IDE7DQorCWlmICh0bXlfc3Ryc3RhcnRzKCZk YXRhLCBUTVlfS0VFUF9ET01BSU4pKQ0KKwkJcmV0dXJuIHRteV9hZGRfZG9tYWluX2tlZXBlcl9w b2xpY3koZGF0YSwgMCwgaXNfZGVsZXRlKTsNCisJaWYgKHRteV9zdHJzdGFydHMoJmRhdGEsIFRN WV9OT19LRUVQX0RPTUFJTikpDQorCQlyZXR1cm4gdG15X2FkZF9kb21haW5fa2VlcGVyX3BvbGlj eShkYXRhLCAxLCBpc19kZWxldGUpOw0KKwlpZiAodG15X3N0cnN0YXJ0cygmZGF0YSwgVE1ZX0lO SVRJQUxJWkVfRE9NQUlOKSkNCisJCXJldHVybiB0bXlfYWRkX2RvbWFpbl9pbml0aWFsaXplcl9w b2xpY3koZGF0YSwgMCwgaXNfZGVsZXRlKTsNCisJaWYgKHRteV9zdHJzdGFydHMoJmRhdGEsIFRN WV9OT19JTklUSUFMSVpFX0RPTUFJTikpDQorCQlyZXR1cm4gdG15X2FkZF9kb21haW5faW5pdGlh bGl6ZXJfcG9saWN5KGRhdGEsIDEsIGlzX2RlbGV0ZSk7DQorCWlmICh0bXlfc3Ryc3RhcnRzKCZk YXRhLCBUTVlfQUxJQVMpKQ0KKwkJcmV0dXJuIHRteV9hZGRfYWxpYXNfcG9saWN5KGRhdGEsIGlz X2RlbGV0ZSk7DQorCWlmICh0bXlfc3Ryc3RhcnRzKCZkYXRhLCBUTVlfQUdHUkVHQVRPUikpDQor CQlyZXR1cm4gdG15X2FkZF9hZ2dyZWdhdG9yX3BvbGljeShkYXRhLCBpc19kZWxldGUpOw0KKwlp ZiAodG15X3N0cnN0YXJ0cygmZGF0YSwgVE1ZX0FMTE9XX1JFQUQpKQ0KKwkJcmV0dXJuIHRteV9h ZGRfZ2xvYmFsbHlfcmVhZGFibGVfcG9saWN5KGRhdGEsIGlzX2RlbGV0ZSk7DQorCWlmICh0bXlf c3Ryc3RhcnRzKCZkYXRhLCBUTVlfQUxMT1dfRU5WKSkNCisJCXJldHVybiB0bXlfYWRkX2dsb2Jh bGx5X3VzYWJsZV9lbnZfcG9saWN5KGRhdGEsIGlzX2RlbGV0ZSk7DQorCWlmICh0bXlfc3Ryc3Rh cnRzKCZkYXRhLCBUTVlfRklMRV9QQVRURVJOKSkNCisJCXJldHVybiB0bXlfYWRkX3BhdHRlcm5f cG9saWN5KGRhdGEsIGlzX2RlbGV0ZSk7DQorCWlmICh0bXlfc3Ryc3RhcnRzKCZkYXRhLCBUTVlf UEFUSF9HUk9VUCkpDQorCQlyZXR1cm4gdG15X2FkZF9ncm91cF9wb2xpY3koZGF0YSwgaXNfZGVs ZXRlKTsNCisJaWYgKHRteV9zdHJzdGFydHMoJmRhdGEsIFRNWV9ERU5ZX1JFV1JJVEUpKQ0KKwkJ cmV0dXJuIHRteV9hZGRfbm9fcmV3cml0ZV9wb2xpY3koZGF0YSwgaXNfZGVsZXRlKTsNCisJaWYg KHRteV9zdHJzdGFydHMoJmRhdGEsIFRNWV9BRERSRVNTX0dST1VQKSkNCisJCXJldHVybiB0bXlf YWRkX2FkZHJlc3NfZ3JvdXBfcG9saWN5KGRhdGEsIGlzX2RlbGV0ZSk7DQorDQorCXJldHVybiAt RUlOVkFMOw0KK30NCisNCisvKiBSZWFkIGV4Y2VwdGlvbiBwb2xpY3kuICovDQorc3RhdGljIGlu dCB0bXlfcmVhZF9leGNlcHRpb25fcG9saWN5KHN0cnVjdCBpb19idWZmZXIgKmhlYWQpDQorew0K KwlpZiAoaGVhZC0+cmVhZF9lb2YpDQorCQlyZXR1cm4gMDsNCisJc3dpdGNoIChoZWFkLT5yZWFk X3N0ZXApIHsNCisJY2FzZSAwOg0KKwkJaWYgKCF0bXlfaXNfcm9vdCgpKQ0KKwkJCXJldHVybiAt RVBFUk07DQorCQloZWFkLT5yZWFkX3N0ZXAgPSAxOw0KKwljYXNlIDE6DQorCQlpZiAodG15X3Jl YWRfZG9tYWluX2tlZXBlcl9wb2xpY3koaGVhZCkpDQorCQkJYnJlYWs7DQorCQloZWFkLT5yZWFk X3N0ZXAgPSAyOw0KKwljYXNlIDI6DQorCQlpZiAodG15X3JlYWRfZ2xvYmFsbHlfcmVhZGFibGVf cG9saWN5KGhlYWQpKQ0KKwkJCWJyZWFrOw0KKwkJaGVhZC0+cmVhZF9zdGVwID0gMzsNCisJY2Fz ZSAzOg0KKwkJaWYgKHRteV9yZWFkX2dsb2JhbGx5X3VzYWJsZV9lbnZfcG9saWN5KGhlYWQpKQ0K KwkJCWJyZWFrOw0KKwkJaGVhZC0+cmVhZF9zdGVwID0gNDsNCisJY2FzZSA0Og0KKwkJaWYgKHRt eV9yZWFkX2RvbWFpbl9pbml0aWFsaXplcl9wb2xpY3koaGVhZCkpDQorCQkJYnJlYWs7DQorCQlo ZWFkLT5yZWFkX3N0ZXAgPSA1Ow0KKwljYXNlIDU6DQorCQlpZiAodG15X3JlYWRfYWxpYXNfcG9s aWN5KGhlYWQpKQ0KKwkJCWJyZWFrOw0KKwkJaGVhZC0+cmVhZF9zdGVwID0gNjsNCisJY2FzZSA2 Og0KKwkJaWYgKHRteV9yZWFkX2FnZ3JlZ2F0b3JfcG9saWN5KGhlYWQpKQ0KKwkJCWJyZWFrOw0K KwkJaGVhZC0+cmVhZF9zdGVwID0gNzsNCisJY2FzZSA3Og0KKwkJaWYgKHRteV9yZWFkX3BhdHRl cm5fcG9saWN5KGhlYWQpKQ0KKwkJCWJyZWFrOw0KKwkJaGVhZC0+cmVhZF9zdGVwID0gODsNCisJ Y2FzZSA4Og0KKwkJaWYgKHRteV9yZWFkX25vX3Jld3JpdGVfcG9saWN5KGhlYWQpKQ0KKwkJCWJy ZWFrOw0KKwkJaGVhZC0+cmVhZF9zdGVwID0gOTsNCisJY2FzZSA5Og0KKwkJaWYgKHRteV9yZWFk X3BhdGhfZ3JvdXBfcG9saWN5KGhlYWQpKQ0KKwkJCWJyZWFrOw0KKwkJaGVhZC0+cmVhZF9zdGVw ID0gMTA7DQorCWNhc2UgMTA6DQorCQlpZiAodG15X3JlYWRfYWRkcmVzc19ncm91cF9wb2xpY3ko aGVhZCkpDQorCQkJYnJlYWs7DQorCQloZWFkLT5yZWFkX2VvZiA9IDE7DQorCQlicmVhazsNCisJ ZGVmYXVsdDoNCisJCXJldHVybiAtRUlOVkFMOw0KKwl9DQorCXJldHVybiAwOw0KK30NCisNCisv KioqKioqKioqKioqKioqKioqKioqKioqKiAgUE9MSUNZIExPQURFUiAgKioqKioqKioqKioqKioq KioqKioqKioqKi8NCisNCisvKioNCisgKiB0bXlfbG9hZF9wb2xpY3kgLSBsb2FkIHBvbGljeSBh bmQgYWN0aXZhdGUgYWNjZXNzIGNvbnRyb2wuDQorICogQGZpbGVuYW1lOiBwcm9ncmFtIHRvIGJl IGV4ZWN1dGVkLg0KKyAqDQorICogVGhpcyBmdW5jdGlvbiBjYWxscyAvc2Jpbi90b21veW8taW5p dCB1c2luZyBjYWxsX3VzZXJtb2RlaGVscGVyKCkNCisgKiB0byBsb2FkIHBvbGljeQ0KKyAqIGlm ICJleGVjdXRpb24gb2YgL3NiaW4vaW5pdCBpcyByZXF1ZXN0ZWQiIGFuZCAiL3NiaW4vdG9tb3lv LWluaXQgZXhpc3RzIi4NCisgKi8NCit2b2lkIHRteV9sb2FkX3BvbGljeShjb25zdCBjaGFyICpm aWxlbmFtZSkNCit7DQorCWlmIChzYmluX2luaXRfc3RhcnRlZCkNCisJCXJldHVybjsNCisJaWYg KHN0cmNtcChmaWxlbmFtZSwgIi9zYmluL2luaXQiKSAhPSAwKQ0KKwkJcmV0dXJuOw0KKw0KKwkv Kg0KKwkgKiBEb24ndCBhY3RpdmF0ZSBNQUMgaWYgdGhlIHBhdGggJy9zYmluL3RvbW95by1pbml0 JyBkb2Vzbid0IGV4aXN0Lg0KKwkgKiBJZiBpbml0cmQuaW1nIGluY2x1ZGVzIC9zYmluL2luaXQg YnV0IHJlYWwtcm9vdC1kZXYgaGFzIG5vdA0KKwkgKiBtb3VudGVkIG9uIC8geWV0LCBhY3RpdmF0 aW5nIE1BQyB3aWxsIGJsb2NrIHRoZSBzeXN0ZW0NCisJICogc2luY2UgcG9saWNpZXMgYXJlIG5v dCBsb2FkZWQgeWV0Lg0KKwkgKiBTbyBsZXQgZG9fZXhlY3ZlKCkgY2FsbCB0aGlzIGZ1bmN0aW9u IGV2ZXJ5dGltZS4NCisJICovDQorCWlmICghcHJvZmlsZV9sb2FkZWQpIHsNCisJCWNvbnN0IGNo YXIgKnRteV9sb2FkZXIgPSAiL3NiaW4vdG9tb3lvLWluaXQiOw0KKwkJc3RydWN0IG5hbWVpZGF0 YSBuZDsNCisJCWNoYXIgKmFyZ3ZbMl07DQorCQljaGFyICplbnZwWzNdOw0KKw0KKwkJaWYgKHBh dGhfbG9va3VwKHRteV9sb2FkZXIsIExPT0tVUF9GT0xMT1csICZuZCkpIHsNCisJCQlwcmludGso IlRPTU9ZTzogTm90IGFjdGl2YXRpbmcgTWFuZGF0b3J5IEFjY2VzcyBDb250cm9sIg0KKwkJCSAg ICAgICAiIG5vdyBzaW5jZSAlcyBkb2Vzbid0IGV4aXN0LlxuIiwgdG15X2xvYWRlcik7DQorCQkJ cmV0dXJuOw0KKwkJfQ0KKwkJcGF0aF9wdXQoJm5kLnBhdGgpOw0KKwkJYXJndlswXSA9IChjaGFy ICopIHRteV9sb2FkZXI7DQorCQlhcmd2WzFdID0gTlVMTDsNCisJCWVudnBbMF0gPSAiSE9NRT0v IjsNCisJCWVudnBbMV0gPSAiUEFUSD0vc2JpbjovYmluOi91c3Ivc2JpbjovdXNyL2JpbiI7DQor CQllbnZwWzJdID0gTlVMTDsNCisJCWNhbGxfdXNlcm1vZGVoZWxwZXIoYXJndlswXSwgYXJndiwg ZW52cCwgMSk7DQorCX0NCisNCisJcHJpbnRrKEtFUk5fSU5GTyAiVE9NT1lPOiAlcyAgIDIwMDcv MTIvMjhcbiIsIFRPTU9ZT19WRVJTSU9OX0NPREUpOw0KKw0KKwlpZiAoIXByb2ZpbGVfbG9hZGVk KQ0KKwkJcGFuaWMoIlRPTU9ZTzogTm8gcHJvZmlsZXMgbG9hZGVkLlxuIik7DQorDQorCXByaW50 ayhLRVJOX0lORk8gIlRPTU9ZTzogTWFuZGF0b3J5IEFjY2VzcyBDb250cm9sIGFjdGl2YXRlZC5c biIpOw0KKwlzYmluX2luaXRfc3RhcnRlZCA9IDE7DQorDQorCXsgLyogQ2hlY2sgYWxsIHByb2Zp bGVzIGN1cnJlbnRseSBhc3NpZ25lZCB0byBkb21haW5zIGFyZSBkZWZpbmVkLiAqLw0KKwkJc3Ry dWN0IGRvbWFpbl9pbmZvICpkb21haW47DQorCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGRvbWFpbiwg JmRvbWFpbl9saXN0LCBsaXN0KSB7DQorCQkJY29uc3QgdTggcHJvZmlsZSA9IGRvbWFpbi0+cHJv ZmlsZTsNCisJCQlpZiAocHJvZmlsZV9wdHJbcHJvZmlsZV0pDQorCQkJCWNvbnRpbnVlOw0KKwkJ CXBhbmljKCJUT01PWU86IFByb2ZpbGUgJXUgKHVzZWQgYnkgJyVzJykgIg0KKwkJCSAgICAgICJu b3QgZGVmaW5lZC5cbiIsDQorCQkJICAgICAgcHJvZmlsZSwNCisJCQkgICAgICBkb21haW4tPmRv bWFpbm5hbWUtPm5hbWUpOw0KKwkJfQ0KKwl9DQorfQ0KKw0KKw0KKy8qKioqKioqKioqKioqKioq KioqKioqKioqICBNQUMgRGVjaXNpb24gRGVsYXllciAgKioqKioqKioqKioqKioqKioqKioqKioq Ki8NCisNCitzdGF0aWMgREVDTEFSRV9XQUlUX1FVRVVFX0hFQUQocXVlcnlfd2FpdCk7DQorDQor c3RhdGljIERFRklORV9TUElOTE9DSyhxdWVyeV9sb2NrKTsNCisNCitzdHJ1Y3QgcXVlcnlfZW50 cnkgew0KKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7DQorCWNoYXIgKnF1ZXJ5Ow0KKwlpbnQgcXVl cnlfbGVuOw0KKwl1bnNpZ25lZCBpbnQgc2VyaWFsOw0KKwlpbnQgdGltZXI7DQorCWludCBhbnN3 ZXI7DQorfTsNCisNCitzdGF0aWMgTElTVF9IRUFEKHF1ZXJ5X2xpc3QpOw0KK3N0YXRpYyBhdG9t aWNfdCBxdWVyeWRfd2F0Y2hlciA9IEFUT01JQ19JTklUKDApOw0KKw0KKy8qKg0KKyAqIHRteV9z dXBlcnZpc29yIC0gYXNrIGZvciBzdXBlcnZpc29ycyBkZWNpc2lvbi4NCisgKiBAZm10OiBmb3Jt YXQgc3RyaW5ncyBmb3IgcHJpbnRmKCkuDQorICoNCisgKiBSZXR1cm5zIHplcm8gaWYgYWRtaW5p c3RyYXRvciBhbGxvd2VkLg0KKyAqIFJldHVybnMgbm9uemVybyBvdGhlcndpc2UuDQorICoNCisg KiBUaGlzIGlzIG9uZSBvZiBUT01PWU8gTGludXgncyBmZWF0dXJlLg0KKyAqIE5vcm1hbGx5LCBh Y2Nlc3MgcmVxdWVzdHMgdGhhdCB2aW9sYXRlcyBwb2xpY3kgaXMgcmVqZWN0ZWQgaW1tZWRpYXRl bHkuDQorICogQnV0IHRoaXMgYmVoYXZpb3IgaXMgaW5jb252ZW5pZW50IHdoZW4gZGV2ZWxvcGlu ZyBwb2xpY3kuDQorICogVE9NT1lPIExpbnV4IGFsbG93cyBhZG1pbmlzdHJhdG9ycyBoYW5kbGUg YWNjZXNzIHJlcXVlc3RzIHRoYXQgdmlvbGF0ZWQNCisgKiBwb2xpY3kgaW4gZW5mb3JjZSBtb2Rl IHRvIGFkanVzdCBwb2xpY3kuDQorICoNCisgKiBUaGlzIGZ1bmN0aW9uIGJsb2NrcyBhIHByb2Nl c3Mgd2hvIGlzIHJlcXVlc3RpbmcgYWNjZXNzIHRoYXQgdmlvbGF0ZWQgcG9saWN5DQorICogYW5k IHRlbGwgaXQgdmlhIC9zeXMva2VybmVsL3NlY3VyaXR5L3RvbW95by9xdWVyeSBhbmQgd2FpdCBm b3Igc3VwZXJ2aXNvcidzDQorICogZGVjaXNpb24uDQorICovDQoraW50IHRteV9zdXBlcnZpc29y KGNvbnN0IGNoYXIgKmZtdCwgLi4uKQ0KK3sNCisJdmFfbGlzdCBhcmdzOw0KKwlpbnQgZXJyb3Ig PSAtRVBFUk07DQorCWludCBwb3M7DQorCWludCBsZW47DQorCXN0YXRpYyB1bnNpZ25lZCBpbnQg c2VyaWFsOw0KKwlzdHJ1Y3QgcXVlcnlfZW50cnkgKnF1ZXJ5X2VudHJ5Ow0KKw0KKwlpZiAoIXRt eV9mbGFncyhUTVlfQUxMT1dfRU5GT1JDRV9HUkFDRSkpDQorCQlyZXR1cm4gLUVQRVJNOw0KKwlp ZiAoIWF0b21pY19yZWFkKCZxdWVyeWRfd2F0Y2hlcikpDQorCQlyZXR1cm4gLUVQRVJNOw0KKw0K Kwl2YV9zdGFydChhcmdzLCBmbXQpOw0KKwlsZW4gPSB2c25wcmludGYoKGNoYXIgKikgJnBvcywg c2l6ZW9mKHBvcykgLSAxLCBmbXQsIGFyZ3MpICsgMzI7DQorCXZhX2VuZChhcmdzKTsNCisNCisJ cXVlcnlfZW50cnkgPSB0bXlfYWxsb2Moc2l6ZW9mKCpxdWVyeV9lbnRyeSkpOw0KKwlpZiAoIXF1 ZXJ5X2VudHJ5KQ0KKwkJZ290byBvdXQ7DQorCXF1ZXJ5X2VudHJ5LT5xdWVyeSA9IHRteV9hbGxv YyhsZW4pOw0KKwlpZiAoIXF1ZXJ5X2VudHJ5LT5xdWVyeSkNCisJCWdvdG8gb3V0Ow0KKw0KKwlJ TklUX0xJU1RfSEVBRCgmcXVlcnlfZW50cnktPmxpc3QpOw0KKw0KKwkvKioqKiogQ1JJVElDQUwg U0VDVElPTiBTVEFSVCAqKioqKi8NCisJc3Bpbl9sb2NrKCZxdWVyeV9sb2NrKTsNCisJcXVlcnlf ZW50cnktPnNlcmlhbCA9IHNlcmlhbCsrOw0KKwlzcGluX3VubG9jaygmcXVlcnlfbG9jayk7DQor CS8qKioqKiBDUklUSUNBTCBTRUNUSU9OIEVORCAqKioqKi8NCisNCisJcG9zID0gc25wcmludGYo cXVlcnlfZW50cnktPnF1ZXJ5LCBsZW4gLSAxLA0KKwkJICAgICAgICJRJXVcbiIsIHF1ZXJ5X2Vu dHJ5LT5zZXJpYWwpOw0KKwl2YV9zdGFydChhcmdzLCBmbXQpOw0KKwl2c25wcmludGYocXVlcnlf ZW50cnktPnF1ZXJ5ICsgcG9zLCBsZW4gLSAxIC0gcG9zLCBmbXQsIGFyZ3MpOw0KKwlxdWVyeV9l bnRyeS0+cXVlcnlfbGVuID0gc3RybGVuKHF1ZXJ5X2VudHJ5LT5xdWVyeSkgKyAxOw0KKwl2YV9l bmQoYXJncyk7DQorDQorCS8qKioqKiBDUklUSUNBTCBTRUNUSU9OIFNUQVJUICoqKioqLw0KKwlz cGluX2xvY2soJnF1ZXJ5X2xvY2spOw0KKwlsaXN0X2FkZF90YWlsKCZxdWVyeV9lbnRyeS0+bGlz dCwgJnF1ZXJ5X2xpc3QpOw0KKwlzcGluX3VubG9jaygmcXVlcnlfbG9jayk7DQorCS8qKioqKiBD UklUSUNBTCBTRUNUSU9OIEVORCAqKioqKi8NCisNCisJdG15X3VwZGF0ZV9jb3VudGVyKFRNWV9V UERBVEVfUVVFUlkpOw0KKw0KKwkvKiBHaXZlIDEwIHNlY29uZHMgZm9yIHN1cGVydmlzb3IncyBv cGluaW9uLiAqLw0KKwlmb3IgKHF1ZXJ5X2VudHJ5LT50aW1lciA9IDA7DQorCSAgICAgYXRvbWlj X3JlYWQoJnF1ZXJ5ZF93YXRjaGVyKSAmJg0KKwkJICAgICB0bXlfZmxhZ3MoVE1ZX0FMTE9XX0VO Rk9SQ0VfR1JBQ0UpICYmDQorCQkgICAgIHF1ZXJ5X2VudHJ5LT50aW1lciA8IDEwMDsNCisJICAg ICBxdWVyeV9lbnRyeS0+dGltZXIrKykgew0KKwkJd2FrZV91cCgmcXVlcnlfd2FpdCk7DQorCQlz ZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOw0KKwkJc2NoZWR1bGVfdGltZW91 dChIWiAvIDEwKTsNCisJCWlmIChxdWVyeV9lbnRyeS0+YW5zd2VyKQ0KKwkJCWJyZWFrOw0KKwl9 DQorDQorCXRteV91cGRhdGVfY291bnRlcihUTVlfVVBEQVRFX1FVRVJZKTsNCisNCisJLyoqKioq IENSSVRJQ0FMIFNFQ1RJT04gU1RBUlQgKioqKiovDQorCXNwaW5fbG9jaygmcXVlcnlfbG9jayk7 DQorCWxpc3RfZGVsKCZxdWVyeV9lbnRyeS0+bGlzdCk7DQorCXNwaW5fdW5sb2NrKCZxdWVyeV9s b2NrKTsNCisJLyoqKioqIENSSVRJQ0FMIFNFQ1RJT04gRU5EICoqKioqLw0KKw0KKwlzd2l0Y2gg KHF1ZXJ5X2VudHJ5LT5hbnN3ZXIpIHsNCisJY2FzZSAxOg0KKwkJLyogR3JhbnRlZCBieSBhZG1p bmlzdHJhdG9yLiAqLw0KKwkJZXJyb3IgPSAwOw0KKwkJYnJlYWs7DQorCWNhc2UgMDoNCisJCS8q IFRpbWVkIG91dC4gKi8NCisJCWJyZWFrOw0KKwlkZWZhdWx0Og0KKwkJLyogUmVqZWN0ZWQgYnkg YWRtaW5pc3RyYXRvci4gKi8NCisJCWJyZWFrOw0KKwl9DQorDQorb3V0OiA7DQorCWlmIChxdWVy eV9lbnRyeSkNCisJCXRteV9mcmVlKHF1ZXJ5X2VudHJ5LT5xdWVyeSk7DQorCXRteV9mcmVlKHF1 ZXJ5X2VudHJ5KTsNCisJcmV0dXJuIGVycm9yOw0KK30NCisNCisvKiBDaGVjayBmb3IgcGVuZGlu ZyBhY2Nlc3MgcmVxdWVzdHMuICovDQorc3RhdGljIGludCB0bXlfcG9sbF9xdWVyeShzdHJ1Y3Qg ZmlsZSAqZmlsZSwgcG9sbF90YWJsZSAqd2FpdCkNCit7DQorCWJvb2wgZm91bmQ7DQorDQorCS8q KioqKiBDUklUSUNBTCBTRUNUSU9OIFNUQVJUICoqKioqLw0KKwlzcGluX2xvY2soJnF1ZXJ5X2xv Y2spOw0KKwlmb3VuZCA9ICFsaXN0X2VtcHR5KCZxdWVyeV9saXN0KTsNCisJc3Bpbl91bmxvY2so JnF1ZXJ5X2xvY2spOw0KKwkvKioqKiogQ1JJVElDQUwgU0VDVElPTiBFTkQgKioqKiovDQorDQor CWlmIChmb3VuZCkNCisJCXJldHVybiBQT0xMSU4gfCBQT0xMUkROT1JNOw0KKwlwb2xsX3dhaXQo ZmlsZSwgJnF1ZXJ5X3dhaXQsIHdhaXQpOw0KKw0KKwkvKioqKiogQ1JJVElDQUwgU0VDVElPTiBT VEFSVCAqKioqKi8NCisJc3Bpbl9sb2NrKCZxdWVyeV9sb2NrKTsNCisJZm91bmQgPSAhbGlzdF9l bXB0eSgmcXVlcnlfbGlzdCk7DQorCXNwaW5fdW5sb2NrKCZxdWVyeV9sb2NrKTsNCisJLyoqKioq IENSSVRJQ0FMIFNFQ1RJT04gRU5EICoqKioqLw0KKw0KKwlpZiAoZm91bmQpDQorCQlyZXR1cm4g UE9MTElOIHwgUE9MTFJETk9STTsNCisJcmV0dXJuIDA7DQorfQ0KKw0KKy8qIFJlYWQgcGVuZGlu ZyBhY2Nlc3MgcmVxdWVzdHMuICovDQorc3RhdGljIGludCB0bXlfcmVhZF9xdWVyeShzdHJ1Y3Qg aW9fYnVmZmVyICpoZWFkKQ0KK3sNCisJc3RydWN0IGxpc3RfaGVhZCAqdG1wOw0KKwlpbnQgcG9z ID0gMDsNCisJaW50IGxlbiA9IDA7DQorCWNoYXIgKmJ1ZjsNCisNCisJaWYgKGhlYWQtPnJlYWRf YXZhaWwpDQorCQlyZXR1cm4gMDsNCisJaWYgKGhlYWQtPnJlYWRfYnVmKSB7DQorCQl0bXlfZnJl ZShoZWFkLT5yZWFkX2J1Zik7DQorCQloZWFkLT5yZWFkX2J1ZiA9IE5VTEw7DQorCQloZWFkLT5y ZWFkYnVmX3NpemUgPSAwOw0KKwl9DQorDQorCS8qKioqKiBDUklUSUNBTCBTRUNUSU9OIFNUQVJU ICoqKioqLw0KKwlzcGluX2xvY2soJnF1ZXJ5X2xvY2spOw0KKwlsaXN0X2Zvcl9lYWNoKHRtcCwg JnF1ZXJ5X2xpc3QpIHsNCisJCXN0cnVjdCBxdWVyeV9lbnRyeSAqcHRyDQorCQkJPSBsaXN0X2Vu dHJ5KHRtcCwgc3RydWN0IHF1ZXJ5X2VudHJ5LCBsaXN0KTsNCisJCWlmIChwb3MrKyA9PSBoZWFk LT5yZWFkX3N0ZXApIHsNCisJCQlsZW4gPSBwdHItPnF1ZXJ5X2xlbjsNCisJCQlicmVhazsNCisJ CX0NCisJfQ0KKwlzcGluX3VubG9jaygmcXVlcnlfbG9jayk7DQorCS8qKioqKiBDUklUSUNBTCBT RUNUSU9OIEVORCAqKioqKi8NCisNCisJaWYgKCFsZW4pIHsNCisJCWhlYWQtPnJlYWRfc3RlcCA9 IDA7DQorCQlyZXR1cm4gMDsNCisJfQ0KKwlidWYgPSB0bXlfYWxsb2MobGVuKTsNCisJaWYgKGJ1 Zikgew0KKwkJcG9zID0gMDsNCisNCisJCS8qKioqKiBDUklUSUNBTCBTRUNUSU9OIFNUQVJUICoq KioqLw0KKwkJc3Bpbl9sb2NrKCZxdWVyeV9sb2NrKTsNCisJCWxpc3RfZm9yX2VhY2godG1wLCAm cXVlcnlfbGlzdCkgew0KKwkJCXN0cnVjdCBxdWVyeV9lbnRyeSAqcHRyDQorCQkJCT0gbGlzdF9l bnRyeSh0bXAsIHN0cnVjdCBxdWVyeV9lbnRyeSwgbGlzdCk7DQorCQkJaWYgKHBvcysrID09IGhl YWQtPnJlYWRfc3RlcCkgew0KKwkJCQkvKiBTb21lIHF1ZXJ5IGNhbiBiZSBza2lpcHBlZCBiZWNh dXNlDQorCQkJCSAqIHF1ZXJ5X2xpc3QgY2FuIGNoYW5nZSwgYnV0IEkgZG9uJ3QgY2FyZS4NCisJ CQkJICovDQorCQkJCWlmIChsZW4gPT0gcHRyLT5xdWVyeV9sZW4pDQorCQkJCQltZW1tb3ZlKGJ1 ZiwgcHRyLT5xdWVyeSwgbGVuKTsNCisJCQkJYnJlYWs7DQorCQkJfQ0KKwkJfQ0KKwkJc3Bpbl91 bmxvY2soJnF1ZXJ5X2xvY2spOw0KKwkJLyoqKioqIENSSVRJQ0FMIFNFQ1RJT04gRU5EICoqKioq Lw0KKw0KKwkJaWYgKGJ1ZlswXSkgew0KKwkJCWhlYWQtPnJlYWRidWZfc2l6ZSA9IGxlbjsNCisJ CQloZWFkLT5yZWFkX2F2YWlsID0gbGVuOw0KKwkJCWhlYWQtPnJlYWRfYnVmID0gYnVmOw0KKwkJ CWhlYWQtPnJlYWRfc3RlcCsrOw0KKwkJfSBlbHNlDQorCQkJdG15X2ZyZWUoYnVmKTsNCisJfQ0K Kw0KKwlyZXR1cm4gMDsNCit9DQorDQorLyogUmVwbHkgdG8gcGVuZGluZyBhY2Nlc3MgcmVxdWVz dHMuICovDQorc3RhdGljIGludCB0bXlfd3JpdGVfYW5zd2VyKHN0cnVjdCBpb19idWZmZXIgKmhl YWQpDQorew0KKwljaGFyICpkYXRhID0gaGVhZC0+d3JpdGVfYnVmOw0KKwlzdHJ1Y3QgbGlzdF9o ZWFkICp0bXA7DQorCXVuc2lnbmVkIGludCBzZXJpYWw7DQorCXVuc2lnbmVkIGludCBhbnN3ZXI7 DQorDQorCS8qKioqKiBDUklUSUNBTCBTRUNUSU9OIFNUQVJUICoqKioqLw0KKwlzcGluX2xvY2so JnF1ZXJ5X2xvY2spOw0KKwlsaXN0X2Zvcl9lYWNoKHRtcCwgJnF1ZXJ5X2xpc3QpIHsNCisJCXN0 cnVjdCBxdWVyeV9lbnRyeSAqcHRyDQorCQkJPSBsaXN0X2VudHJ5KHRtcCwgc3RydWN0IHF1ZXJ5 X2VudHJ5LCBsaXN0KTsNCisJCXB0ci0+dGltZXIgPSAwOw0KKwl9DQorCXNwaW5fdW5sb2NrKCZx dWVyeV9sb2NrKTsNCisJLyoqKioqIENSSVRJQ0FMIFNFQ1RJT04gRU5EICoqKioqLw0KKw0KKwlp ZiAoc3NjYW5mKGRhdGEsICJBJXU9JXUiLCAmc2VyaWFsLCAmYW5zd2VyKSAhPSAyKQ0KKwkJcmV0 dXJuIC1FSU5WQUw7DQorDQorCS8qKioqKiBDUklUSUNBTCBTRUNUSU9OIFNUQVJUICoqKioqLw0K KwlzcGluX2xvY2soJnF1ZXJ5X2xvY2spOw0KKwlsaXN0X2Zvcl9lYWNoKHRtcCwgJnF1ZXJ5X2xp c3QpIHsNCisJCXN0cnVjdCBxdWVyeV9lbnRyeSAqcHRyDQorCQkJPSBsaXN0X2VudHJ5KHRtcCwg c3RydWN0IHF1ZXJ5X2VudHJ5LCBsaXN0KTsNCisJCWlmIChwdHItPnNlcmlhbCAhPSBzZXJpYWwp DQorCQkJY29udGludWU7DQorCQlpZiAoIXB0ci0+YW5zd2VyKQ0KKwkJCXB0ci0+YW5zd2VyID0g YW5zd2VyOw0KKwkJYnJlYWs7DQorCX0NCisJc3Bpbl91bmxvY2soJnF1ZXJ5X2xvY2spOw0KKwkv KioqKiogQ1JJVElDQUwgU0VDVElPTiBFTkQgKioqKiovDQorDQorCXJldHVybiAwOw0KK30NCisN CisvKioqKioqKioqKioqKioqKioqICAvc3lzL2tlcm5lbC9zZWN1cml0eSBJTlRFUkZBQ0UgSEFO RExFUiAgKioqKioqKioqKioqKioqKioqLw0KKw0KKy8qIFBvbGljeSB1cGRhdGVzIGNvdW50ZXIu ICovDQorc3RhdGljIHVuc2lnbmVkIGludCB1cGRhdGVzX2NvdW50ZXJbVE1ZX01BWF9VUERBVEVT X0NPVU5URVJdOw0KK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0sodXBkYXRlc19jb3VudGVyX2xvY2sp Ow0KKw0KKy8qKg0KKyAqIHRteV91cGRhdGVfY291bnRlciAtIG5vdGlmeSB1c2VybGFuZCB0aGF0 IHBvbGljeSBpcyBjaGFuZ2VkLg0KKyAqIEBpbmRleDogaW5kZXggdG8gdXBkYXRlIGNvdW50ZXIu DQorICoNCisgKiBUaGlzIGlzIGZvciB1c2VybGFuZCBwcm9jZXNzIHdobyBpcyBtb25pdG9yaW5n IHBvbGljeSBjaGFuZ2VzLg0KKyAqLw0KK3ZvaWQgdG15X3VwZGF0ZV9jb3VudGVyKGNvbnN0IHVu c2lnbmVkIGNoYXIgaW5kZXgpDQorew0KKwkvKioqKiogQ1JJVElDQUwgU0VDVElPTiBTVEFSVCAq KioqKi8NCisJc3Bpbl9sb2NrKCZ1cGRhdGVzX2NvdW50ZXJfbG9jayk7DQorCWlmIChpbmRleCA8 IFRNWV9NQVhfVVBEQVRFU19DT1VOVEVSKQ0KKwkJdXBkYXRlc19jb3VudGVyW2luZGV4XSsrOw0K KwlzcGluX3VubG9jaygmdXBkYXRlc19jb3VudGVyX2xvY2spOw0KKwkvKioqKiogQ1JJVElDQUwg U0VDVElPTiBFTkQgKioqKiovDQorfQ0KKw0KKy8qIFJlYWQgcG9saWN5IHVwZGF0ZSBjb3VudGVy LiAqLw0KK3N0YXRpYyBpbnQgdG15X3JlYWRfdXBkYXRlc19jb3VudGVyKHN0cnVjdCBpb19idWZm ZXIgKmhlYWQpDQorew0KKwl1bnNpZ25lZCBpbnQgY291bnRlcltUTVlfTUFYX1VQREFURVNfQ09V TlRFUl07DQorCWlmIChoZWFkLT5yZWFkX2VvZikNCisJCXJldHVybiAwOw0KKw0KKwkvKioqKiog Q1JJVElDQUwgU0VDVElPTiBTVEFSVCAqKioqKi8NCisJc3Bpbl9sb2NrKCZ1cGRhdGVzX2NvdW50 ZXJfbG9jayk7DQorCW1lbW1vdmUoY291bnRlciwgdXBkYXRlc19jb3VudGVyLCBzaXplb2YodXBk YXRlc19jb3VudGVyKSk7DQorCW1lbXNldCh1cGRhdGVzX2NvdW50ZXIsIDAsIHNpemVvZih1cGRh dGVzX2NvdW50ZXIpKTsNCisJc3Bpbl91bmxvY2soJnVwZGF0ZXNfY291bnRlcl9sb2NrKTsNCisJ LyoqKioqIENSSVRJQ0FMIFNFQ1RJT04gRU5EICoqKioqLw0KKw0KKwl0bXlfaW9fcHJpbnRmKGhl YWQsDQorCQkgICAgICAiL3N5cy9rZXJuZWwvc2VjdXJpdHkvdG9tb3lvL3N5c3RlbV9wb2xpY3k6 ICAgICUxMHVcbiINCisJCSAgICAgICIvc3lzL2tlcm5lbC9zZWN1cml0eS90b21veW8vZG9tYWlu X3BvbGljeTogICAgJTEwdVxuIg0KKwkJICAgICAgIi9zeXMva2VybmVsL3NlY3VyaXR5L3RvbW95 by9leGNlcHRpb25fcG9saWN5OiAlMTB1XG4iDQorCQkgICAgICAiL3N5cy9rZXJuZWwvc2VjdXJp dHkvdG9tb3lvL3Byb2ZpbGU6ICAgICAgICAgICUxMHVcbiINCisJCSAgICAgICIvc3lzL2tlcm5l bC9zZWN1cml0eS90b21veW8vcXVlcnk6ICAgICAgICAgICAgJTEwdVxuIg0KKwkJICAgICAgIi9z eXMva2VybmVsL3NlY3VyaXR5L3RvbW95by9tYW5hZ2VyOiAgICAgICAgICAlMTB1XG4iDQorCQkg ICAgICAiL3N5cy9rZXJuZWwvc2VjdXJpdHkvdG9tb3lvL2dyYW50X2xvZzogICAgICAgICUxMHVc biINCisJCSAgICAgICIvc3lzL2tlcm5lbC9zZWN1cml0eS90b21veW8vcmVqZWN0X2xvZzogICAg ICAgJTEwdVxuIiwNCisJCSAgICAgIGNvdW50ZXJbVE1ZX1VQREFURV9TWVNURU1QT0xJQ1ldLA0K KwkJICAgICAgY291bnRlcltUTVlfVVBEQVRFX0RPTUFJTlBPTElDWV0sDQorCQkgICAgICBjb3Vu dGVyW1RNWV9VUERBVEVfRVhDRVBUSU9OUE9MSUNZXSwNCisJCSAgICAgIGNvdW50ZXJbVE1ZX1VQ REFURV9QUk9GSUxFXSwNCisJCSAgICAgIGNvdW50ZXJbVE1ZX1VQREFURV9RVUVSWV0sDQorCQkg ICAgICBjb3VudGVyW1RNWV9VUERBVEVfTUFOQUdFUl0sDQorCQkgICAgICBjb3VudGVyW1RNWV9V UERBVEVfR1JBTlRfTE9HXSwNCisJCSAgICAgIGNvdW50ZXJbVE1ZX1VQREFURV9SRUpFQ1RfTE9H XSk7DQorDQorCWhlYWQtPnJlYWRfZW9mID0gMTsNCisNCisJcmV0dXJuIDA7DQorfQ0KKw0KKy8q IFJlYWQgaG93IG11Y2ggbWVtb3J5IGlzIHVzZWQuICovDQorc3RhdGljIGludCB0bXlfcmVhZF9t ZW1vcnlfY291bnRlcihzdHJ1Y3QgaW9fYnVmZmVyICpoZWFkKQ0KK3sNCisJaW50IHNoYXJlZDsN CisJaW50IHByaXZhdGU7DQorCWludCBkeW5hbWljOw0KKw0KKwlpZiAoaGVhZC0+cmVhZF9lb2Yp DQorCQlyZXR1cm4gMDsNCisJc2hhcmVkID0gdG15X2dldF9tZW1vcnlfdXNlZF9mb3Jfc2F2ZV9u YW1lKCk7DQorCXByaXZhdGUgPSB0bXlfZ2V0X21lbW9yeV91c2VkX2Zvcl9lbGVtZW50cygpOw0K KwlkeW5hbWljID0gdG15X2dldF9tZW1vcnlfdXNlZF9mb3JfZHluYW1pYygpOw0KKwlpZiAodG15 X2lvX3ByaW50ZihoZWFkLA0KKwkJCSAgIlNoYXJlZDogICUxMHVcbiINCisJCQkgICJQcml2YXRl OiAlMTB1XG4iDQorCQkJICAiRHluYW1pYzogJTEwdVxuIg0KKwkJCSAgIlRvdGFsOiAgICUxMHVc biIsDQorCQkJICBzaGFyZWQsDQorCQkJICBwcml2YXRlLA0KKwkJCSAgZHluYW1pYywNCisJCQkg IHNoYXJlZCArIHByaXZhdGUgKyBkeW5hbWljKSA9PSAwKQ0KKwkJaGVhZC0+cmVhZF9lb2YgPSAx Ow0KKwlyZXR1cm4gMDsNCit9DQorDQorLyogUmVhZCBUT01PWU8gTGludXgncyB2ZXJzaW9uLiAq Lw0KK3N0YXRpYyBpbnQgdG15X3JlYWRfdmVyc2lvbihzdHJ1Y3QgaW9fYnVmZmVyICpoZWFkKQ0K K3sNCisJaWYgKCFoZWFkLT5yZWFkX2VvZikgew0KKwkJdG15X2lvX3ByaW50ZihoZWFkLCBUT01P WU9fVkVSU0lPTl9DT0RFICJcbiIpOw0KKwkJaGVhZC0+cmVhZF9lb2YgPSAxOw0KKwl9DQorCXJl dHVybiAwOw0KK30NCisNCisvKiBSZWFkIGN1cnJlbnQgcHJvY2VzcydzIGRvbWFpbm5hbWUuICov DQorc3RhdGljIGludCB0bXlfcmVhZF9zZWxmX2RvbWFpbihzdHJ1Y3QgaW9fYnVmZmVyICpoZWFk KQ0KK3sNCisJaWYgKCFoZWFkLT5yZWFkX2VvZikgew0KKwkJdG15X2lvX3ByaW50ZihoZWFkLA0K KwkJCSAgICAgICIlcyIsDQorCQkJICAgICAgVE1ZX1NFQ1VSSVRZLT5kb21haW4tPmRvbWFpbm5h bWUtPm5hbWUpOw0KKwkJaGVhZC0+cmVhZF9lb2YgPSAxOw0KKwl9DQorDQorCXJldHVybiAwOw0K K30NCisNCisvKiBUaGlzIGlzIC9zeXMva2VybmVsL3NlY3VyaXR5L3RvbW95by8gaW50ZXJmYWNl LiAqLw0KK3N0YXRpYyBpbnQgdG15X29wZW5fY29udHJvbChjb25zdCBpbnQgdHlwZSwgc3RydWN0 IGZpbGUgKmZpbGUpDQorew0KKwlzdHJ1Y3QgaW9fYnVmZmVyICpoZWFkID0gdG15X2FsbG9jKHNp emVvZigqaGVhZCkpOw0KKw0KKwlpZiAoIWhlYWQpDQorCQlyZXR1cm4gLUVOT01FTTsNCisJbXV0 ZXhfaW5pdCgmaGVhZC0+cmVhZF9tdXRleCk7DQorCW11dGV4X2luaXQoJmhlYWQtPndyaXRlX211 dGV4KTsNCisNCisJc3dpdGNoICh0eXBlKSB7DQorCWNhc2UgVE1ZX0RPTUFJTlBPTElDWToNCisJ CWhlYWQtPndyaXRlID0gdG15X2FkZF9kb21haW5fcG9saWN5Ow0KKwkJaGVhZC0+cmVhZCA9IHRt eV9yZWFkX2RvbWFpbl9wb2xpY3k7DQorCQlicmVhazsNCisJY2FzZSBUTVlfU1lTVEVNUE9MSUNZ Og0KKwkJaGVhZC0+d3JpdGUgPSB0bXlfYWRkX3N5c3RlbV9wb2xpY3k7DQorCQloZWFkLT5yZWFk ID0gdG15X3JlYWRfc3lzdGVtX3BvbGljeTsNCisJCWJyZWFrOw0KKwljYXNlIFRNWV9FWENFUFRJ T05QT0xJQ1k6DQorCQloZWFkLT53cml0ZSA9IHRteV9hZGRfZXhjZXB0aW9uX3BvbGljeTsNCisJ CWhlYWQtPnJlYWQgPSB0bXlfcmVhZF9leGNlcHRpb25fcG9saWN5Ow0KKwkJYnJlYWs7DQorCWNh c2UgVE1ZX0RPTUFJTl9TVEFUVVM6DQorCQloZWFkLT53cml0ZSA9IHRteV91cGRhdGVfZG9tYWlu X3Byb2ZpbGU7DQorCQloZWFkLT5yZWFkID0gdG15X3JlYWRfZG9tYWluX3Byb2ZpbGU7DQorCQli cmVhazsNCisJY2FzZSBUTVlfUFJPQ0VTU19TVEFUVVM6DQorCQloZWFkLT53cml0ZSA9IHRteV93 cml0ZV9waWQ7DQorCQloZWFkLT5yZWFkID0gdG15X3JlYWRfcGlkOw0KKwkJYnJlYWs7DQorCWNh c2UgVE1ZX1NFTEZET01BSU46DQorCQloZWFkLT5yZWFkID0gdG15X3JlYWRfc2VsZl9kb21haW47 DQorCQlicmVhazsNCisJY2FzZSBUTVlfTUVNSU5GTzoNCisJCWhlYWQtPnJlYWQgPSB0bXlfcmVh ZF9tZW1vcnlfY291bnRlcjsNCisJCWhlYWQtPnJlYWRidWZfc2l6ZSA9IDEyODsNCisJCWJyZWFr Ow0KKwljYXNlIFRNWV9QUk9GSUxFOg0KKwkJaGVhZC0+d3JpdGUgPSB0bXlfc2V0X3Byb2ZpbGU7 DQorCQloZWFkLT5yZWFkID0gdG15X3JlYWRfcHJvZmlsZTsNCisJCWJyZWFrOw0KKwljYXNlIFRN WV9RVUVSWToNCisJCWhlYWQtPnBvbGwgPSB0bXlfcG9sbF9xdWVyeTsNCisJCWhlYWQtPndyaXRl ID0gdG15X3dyaXRlX2Fuc3dlcjsNCisJCWhlYWQtPnJlYWQgPSB0bXlfcmVhZF9xdWVyeTsNCisJ CWJyZWFrOw0KKwljYXNlIFRNWV9NQU5BR0VSOg0KKwkJaGVhZC0+d3JpdGUgPSB0bXlfYWRkX21h bmFnZXJfcG9saWN5Ow0KKwkJaGVhZC0+cmVhZCA9IHRteV9yZWFkX21hbmFnZXJfcG9saWN5Ow0K KwkJYnJlYWs7DQorCWNhc2UgVE1ZX1VQREFURVNDT1VOVEVSOg0KKwkJaGVhZC0+cmVhZCA9IHRt eV9yZWFkX3VwZGF0ZXNfY291bnRlcjsNCisJCWJyZWFrOw0KKwljYXNlIFRNWV9WRVJTSU9OOg0K KwkJaGVhZC0+cmVhZCA9IHRteV9yZWFkX3ZlcnNpb247DQorCQlicmVhazsNCisJY2FzZSBUTVlf R1JBTlRfTE9HOg0KKwkJaGVhZC0+cmVhZCA9IHRteV9yZWFkX2dyYW50X2xvZzsNCisJCWhlYWQt PnBvbGwgPSB0bXlfcG9sbF9ncmFudF9sb2c7DQorCQlicmVhazsNCisJY2FzZSBUTVlfUkVKRUNU X0xPRzoNCisJCWhlYWQtPnJlYWQgPSB0bXlfcmVhZF9yZWplY3RfbG9nOw0KKwkJaGVhZC0+cG9s bCA9IHRteV9wb2xsX3JlamVjdF9sb2c7DQorCQlicmVhazsNCisJfQ0KKw0KKwlpZiAodHlwZSAh PSBUTVlfUVVFUlkpIHsNCisJCWlmICghaGVhZC0+cmVhZGJ1Zl9zaXplKQ0KKwkJCWhlYWQtPnJl YWRidWZfc2l6ZSA9IFBBR0VfU0laRSAqIDI7DQorCQloZWFkLT5yZWFkX2J1ZiA9IHRteV9hbGxv YyhoZWFkLT5yZWFkYnVmX3NpemUpOw0KKwkJaWYgKCFoZWFkLT5yZWFkX2J1Zikgew0KKwkJCXRt eV9mcmVlKGhlYWQpOw0KKwkJCXJldHVybiAtRU5PTUVNOw0KKwkJfQ0KKwl9DQorDQorCWlmICho ZWFkLT53cml0ZSkgew0KKwkJaGVhZC0+d3JpdGVidWZfc2l6ZSA9IFBBR0VfU0laRSAqIDI7DQor CQloZWFkLT53cml0ZV9idWYgPSB0bXlfYWxsb2MoaGVhZC0+d3JpdGVidWZfc2l6ZSk7DQorCQlp ZiAoIWhlYWQtPndyaXRlX2J1Zikgew0KKwkJCXRteV9mcmVlKGhlYWQtPnJlYWRfYnVmKTsNCisJ CQl0bXlfZnJlZShoZWFkKTsNCisJCQlyZXR1cm4gLUVOT01FTTsNCisJCX0NCisJfQ0KKw0KKwlm aWxlLT5wcml2YXRlX2RhdGEgPSBoZWFkOw0KKw0KKwlpZiAodHlwZSA9PSBUTVlfU0VMRkRPTUFJ TikNCisJCXRteV9yZWFkX2NvbnRyb2woZmlsZSwgTlVMTCwgMCk7DQorCWVsc2UgaWYgKGhlYWQt PndyaXRlID09IHRteV93cml0ZV9hbnN3ZXIpDQorCQlhdG9taWNfaW5jKCZxdWVyeWRfd2F0Y2hl cik7DQorDQorCXJldHVybiAwOw0KK30NCisNCisvKiBDb3B5IHJlYWQgZGF0YSB0byB1c2VybGFu ZCBidWZmZXIuICovDQorc3RhdGljIGludCB0bXlfY29weV90b191c2VyKHN0cnVjdCBpb19idWZm ZXIgKmhlYWQsIGNoYXIgX191c2VyICpidWZmZXIsDQorCQkJICAgIGludCBidWZmZXJfbGVuKQ0K K3sNCisJaW50IGxlbiA9IGhlYWQtPnJlYWRfYXZhaWw7DQorCWNoYXIgKmNwID0gaGVhZC0+cmVh ZF9idWY7DQorDQorCWlmIChsZW4gPiBidWZmZXJfbGVuKQ0KKwkJbGVuID0gYnVmZmVyX2xlbjsN CisJaWYgKGxlbikgew0KKwkJaWYgKGNvcHlfdG9fdXNlcihidWZmZXIsIGNwLCBsZW4pKQ0KKwkJ CXJldHVybiAtRUZBVUxUOw0KKwkJaGVhZC0+cmVhZF9hdmFpbCAtPSBsZW47DQorCQltZW1tb3Zl KGNwLCBjcCArIGxlbiwgaGVhZC0+cmVhZF9hdmFpbCk7DQorCX0NCisNCisJcmV0dXJuIGxlbjsN Cit9DQorDQorLyogQ2hlY2sgZm9yIHBlbmRpbmcgcmVxdWVzdHMuICovDQorc3RhdGljIGludCB0 bXlfcG9sbF9jb250cm9sKHN0cnVjdCBmaWxlICpmaWxlLCBwb2xsX3RhYmxlICp3YWl0KQ0KK3sN CisJc3RydWN0IGlvX2J1ZmZlciAqaGVhZCA9IChzdHJ1Y3QgaW9fYnVmZmVyICopIGZpbGUtPnBy aXZhdGVfZGF0YTsNCisJaWYgKCFoZWFkLT5wb2xsKQ0KKwkJcmV0dXJuIC1FTk9TWVM7DQorCXJl dHVybiBoZWFkLT5wb2xsKGZpbGUsIHdhaXQpOw0KK30NCisNCisvKiBSZWFkIHBvbGljeS4gKi8N CitzdGF0aWMgaW50IHRteV9yZWFkX2NvbnRyb2woc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191 c2VyICpidWZmZXIsDQorCQkJICAgIGNvbnN0IGludCBidWZmZXJfbGVuKQ0KK3sNCisJaW50IGxl biA9IDA7DQorCXN0cnVjdCBpb19idWZmZXIgKmhlYWQgPSAoc3RydWN0IGlvX2J1ZmZlciAqKSBm aWxlLT5wcml2YXRlX2RhdGE7DQorDQorCWlmICghaGVhZC0+cmVhZCkNCisJCXJldHVybiAtRU5P U1lTOw0KKwlpZiAoIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsIGJ1ZmZlciwgYnVmZmVyX2xlbikp DQorCQlyZXR1cm4gLUVGQVVMVDsNCisJaWYgKG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmaGVh ZC0+cmVhZF9tdXRleCkpDQorCQlyZXR1cm4gLUVJTlRSOw0KKwlsZW4gPSBoZWFkLT5yZWFkKGhl YWQpOw0KKwlpZiAobGVuID49IDApDQorCQlsZW4gPSB0bXlfY29weV90b191c2VyKGhlYWQsIGJ1 ZmZlciwgYnVmZmVyX2xlbik7DQorCW11dGV4X3VubG9jaygmaGVhZC0+cmVhZF9tdXRleCk7DQor DQorCXJldHVybiBsZW47DQorfQ0KKw0KKy8qIFVwZGF0ZSBwb2xpY3kuICovDQorc3RhdGljIGlu dCB0bXlfd3JpdGVfY29udHJvbChzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIg KmJ1ZmZlciwNCisJCQkgICAgIGNvbnN0IGludCBidWZmZXJfbGVuKQ0KK3sNCisJc3RydWN0IGlv X2J1ZmZlciAqaGVhZCA9IChzdHJ1Y3QgaW9fYnVmZmVyICopIGZpbGUtPnByaXZhdGVfZGF0YTsN CisJaW50IGVycm9yID0gYnVmZmVyX2xlbjsNCisJaW50IGF2YWlsX2xlbiA9IGJ1ZmZlcl9sZW47 DQorCWNoYXIgKmNwMCA9IGhlYWQtPndyaXRlX2J1ZjsNCisNCisJaWYgKCFoZWFkLT53cml0ZSkN CisJCXJldHVybiAtRU5PU1lTOw0KKwlpZiAoIWFjY2Vzc19vayhWRVJJRllfUkVBRCwgYnVmZmVy LCBidWZmZXJfbGVuKSkNCisJCXJldHVybiAtRUZBVUxUOw0KKwlpZiAoIXRteV9pc19yb290KCkp DQorCQlyZXR1cm4gLUVQRVJNOw0KKwlpZiAoaGVhZC0+d3JpdGUgIT0gdG15X3dyaXRlX3BpZCAm JiAhdG15X2lzX3BvbGljeV9tYW5hZ2VyKCkpDQorCQkvKiBGb3JiaWQgdXBkYXRpbmcgcG9saWNp ZXMgZm9yIG5vbiBtYW5hZ2VyIHByb2dyYW1zLiAqLw0KKwkJcmV0dXJuIC1FUEVSTTsNCisNCisJ aWYgKG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmaGVhZC0+d3JpdGVfbXV0ZXgpKQ0KKwkJcmV0 dXJuIC1FSU5UUjsNCisJd2hpbGUgKGF2YWlsX2xlbiA+IDApIHsNCisJCWNoYXIgYzsNCisJCWlm IChoZWFkLT53cml0ZV9hdmFpbCA+PSBoZWFkLT53cml0ZWJ1Zl9zaXplIC0gMSkgew0KKwkJCWVy cm9yID0gLUVOT01FTTsNCisJCQlicmVhazsNCisJCX0gZWxzZSBpZiAoZ2V0X3VzZXIoYywgYnVm ZmVyKSkgew0KKwkJCWVycm9yID0gLUVGQVVMVDsNCisJCQlicmVhazsNCisJCX0NCisJCWJ1ZmZl cisrOw0KKwkJYXZhaWxfbGVuLS07DQorCQljcDBbaGVhZC0+d3JpdGVfYXZhaWwrK10gPSBjOw0K KwkJaWYgKGMgIT0gJ1xuJykNCisJCQljb250aW51ZTsNCisJCWNwMFtoZWFkLT53cml0ZV9hdmFp bCAtIDFdID0gJ1wwJzsNCisJCWhlYWQtPndyaXRlX2F2YWlsID0gMDsNCisJCXRteV9ub3JtYWxp emVfbGluZShjcDApOw0KKwkJaGVhZC0+d3JpdGUoaGVhZCk7DQorCX0NCisJbXV0ZXhfdW5sb2Nr KCZoZWFkLT53cml0ZV9tdXRleCk7DQorDQorCXJldHVybiBlcnJvcjsNCit9DQorDQorLyogQ2xv c2UgL3N5cy9rZXJuZWwvc2VjdXJpdHkvdG9tb3lvLyBpbnRlcmZhY2UuICovDQorc3RhdGljIGlu dCB0bXlfY2xvc2VfY29udHJvbChzdHJ1Y3QgZmlsZSAqZmlsZSkNCit7DQorCXN0cnVjdCBpb19i dWZmZXIgKmhlYWQgPSBmaWxlLT5wcml2YXRlX2RhdGE7DQorDQorCWlmIChoZWFkLT53cml0ZSA9 PSB0bXlfd3JpdGVfYW5zd2VyKQ0KKwkJYXRvbWljX2RlYygmcXVlcnlkX3dhdGNoZXIpOw0KKw0K Kwl0bXlfZnJlZShoZWFkLT5yZWFkX2J1Zik7DQorCWhlYWQtPnJlYWRfYnVmID0gTlVMTDsNCisJ dG15X2ZyZWUoaGVhZC0+d3JpdGVfYnVmKTsNCisJaGVhZC0+d3JpdGVfYnVmID0gTlVMTDsNCisJ dG15X2ZyZWUoaGVhZCk7DQorCWhlYWQgPSBOVUxMOw0KKwlmaWxlLT5wcml2YXRlX2RhdGEgPSBO VUxMOw0KKwlyZXR1cm4gMDsNCit9DQorDQorLyogb3BlbigpIG9wZXJhdGlvbiBmb3IgL3N5cy9r ZXJuZWwvc2VjdXJpdHkvdG9tb3lvLyBpbnRlcmZhY2UuICovDQorc3RhdGljIGludCB0bXlfb3Bl bihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkNCit7DQorCXJldHVybiB0 bXlfb3Blbl9jb250cm9sKCgodTggKikgZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUtPmlfcHJpdmF0 ZSkNCisJCQkJLSAoKHU4ICopIE5VTEwpLCBmaWxlKTsNCit9DQorDQorLyogY2xvc2UoKSBvcGVy YXRpb24gZm9yIC9zeXMva2VybmVsL3NlY3VyaXR5L3RvbW95by8gaW50ZXJmYWNlLiAqLw0KK3N0 YXRpYyBpbnQgdG15X3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZp bGUpDQorew0KKwlyZXR1cm4gdG15X2Nsb3NlX2NvbnRyb2woZmlsZSk7DQorfQ0KKw0KKy8qIHBv bGwoKSBvcGVyYXRpb24gZm9yIC9zeXMva2VybmVsL3NlY3VyaXR5L3RvbW95by8gaW50ZXJmYWNl LiAqLw0KK3N0YXRpYyB1bnNpZ25lZCBpbnQgdG15X3BvbGwoc3RydWN0IGZpbGUgKmZpbGUsIHBv bGxfdGFibGUgKndhaXQpDQorew0KKwlyZXR1cm4gdG15X3BvbGxfY29udHJvbChmaWxlLCB3YWl0 KTsNCit9DQorDQorLyogcmVhZCgpIG9wZXJhdGlvbiBmb3IgL3N5cy9rZXJuZWwvc2VjdXJpdHkv dG9tb3lvLyBpbnRlcmZhY2UuICovDQorc3RhdGljIHNzaXplX3QgdG15X3JlYWQoc3RydWN0IGZp bGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsDQorCQkJc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBw b3MpDQorew0KKwlyZXR1cm4gdG15X3JlYWRfY29udHJvbChmaWxlLCBidWYsIGNvdW50KTsNCit9 DQorDQorLyogd3JpdGUoKSBvcGVyYXRpb24gZm9yIC9zeXMva2VybmVsL3NlY3VyaXR5L3RvbW95 by8gaW50ZXJmYWNlLiAqLw0KK3N0YXRpYyBzc2l6ZV90IHRteV93cml0ZShzdHJ1Y3QgZmlsZSAq ZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZiwNCisJCQkgc2l6ZV90IGNvdW50LCBsb2ZmX3Qg KnBwb3MpDQorew0KKwlyZXR1cm4gdG15X3dyaXRlX2NvbnRyb2woZmlsZSwgYnVmLCBjb3VudCk7 DQorfQ0KKw0KK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHRteV9vcGVyYXRpb25zID0g ew0KKwkub3BlbiAJID0gdG15X29wZW4sDQorCS5yZWxlYXNlID0gdG15X3JlbGVhc2UsDQorCS5w b2xsIAkgPSB0bXlfcG9sbCwNCisJLnJlYWQgCSA9IHRteV9yZWFkLA0KKwkud3JpdGUgCSA9IHRt eV93cml0ZQ0KK307DQorDQorLyogQXNzb2NpYXRlIC9zeXMva2VybmVsL3NlY3VyaXR5L3RvbW95 by8gaW50ZXJmYWNlIHdpdGgga2V5LiAqLw0KK3N0YXRpYyB2b2lkIF9faW5pdCB0bXlfY3JlYXRl X2VudHJ5KGNvbnN0IGNoYXIgKm5hbWUsDQorCQkJICAgICBjb25zdCBtb2RlX3QgbW9kZSwNCisJ CQkgICAgIHN0cnVjdCBkZW50cnkgKnBhcmVudCwNCisJCQkgICAgIGNvbnN0IGludCBrZXkpDQor ew0KKwlzZWN1cml0eWZzX2NyZWF0ZV9maWxlKG5hbWUsIG1vZGUsIHBhcmVudCwgKCh1OCAqKSBO VUxMKSArIGtleSwNCisJCQkgICAgICAgJnRteV9vcGVyYXRpb25zKTsNCit9DQorDQorLyoqDQor ICogdG15X2ludGVyZmFjZV9pbml0IC0gaW5pdGlhbGl6ZSAvc3lzL2tlcm5lbC9zZWN1cml0eS90 b21veW8vIGludGVyZmFjZS4NCisgKi8NCitzdGF0aWMgaW50IF9faW5pdCB0bXlfaW50ZXJmYWNl X2luaXQodm9pZCkNCit7DQorCXN0cnVjdCBkZW50cnkgKnRteV9kaXI7DQorCXRteV9kaXIgPSBz ZWN1cml0eWZzX2NyZWF0ZV9kaXIoInRvbW95byIsIE5VTEwpOw0KKwl0bXlfY3JlYXRlX2VudHJ5 KCJxdWVyeSIsICAgICAgICAgICAgMDYwMCwgdG15X2RpciwNCisJCQkgVE1ZX1FVRVJZKTsNCisJ dG15X2NyZWF0ZV9lbnRyeSgiZG9tYWluX3BvbGljeSIsICAgIDA2MDAsIHRteV9kaXIsDQorCQkJ IFRNWV9ET01BSU5QT0xJQ1kpOw0KKwl0bXlfY3JlYXRlX2VudHJ5KCJzeXN0ZW1fcG9saWN5Iiwg ICAgMDYwMCwgdG15X2RpciwNCisJCQkgVE1ZX1NZU1RFTVBPTElDWSk7DQorCXRteV9jcmVhdGVf ZW50cnkoImV4Y2VwdGlvbl9wb2xpY3kiLCAwNjAwLCB0bXlfZGlyLA0KKwkJCSBUTVlfRVhDRVBU SU9OUE9MSUNZKTsNCisJdG15X2NyZWF0ZV9lbnRyeSgiLmRvbWFpbl9zdGF0dXMiLCAgIDA2MDAs IHRteV9kaXIsDQorCQkJIFRNWV9ET01BSU5fU1RBVFVTKTsNCisJdG15X2NyZWF0ZV9lbnRyeSgi LnByb2Nlc3Nfc3RhdHVzIiwgIDA0MDAsIHRteV9kaXIsDQorCQkJIFRNWV9QUk9DRVNTX1NUQVRV Uyk7DQorCXRteV9jcmVhdGVfZW50cnkoInNlbGZfZG9tYWluIiwgICAgICAwNDAwLCB0bXlfZGly LA0KKwkJCSBUTVlfU0VMRkRPTUFJTik7DQorCXRteV9jcmVhdGVfZW50cnkoIm1lbWluZm8iLCAg ICAgICAgICAwNDAwLCB0bXlfZGlyLA0KKwkJCSBUTVlfTUVNSU5GTyk7DQorCXRteV9jcmVhdGVf ZW50cnkoInByb2ZpbGUiLCAgICAgICAgICAwNjAwLCB0bXlfZGlyLA0KKwkJCSBUTVlfUFJPRklM RSk7DQorCXRteV9jcmVhdGVfZW50cnkoIm1hbmFnZXIiLCAgICAgICAgICAwNjAwLCB0bXlfZGly LA0KKwkJCSBUTVlfTUFOQUdFUik7DQorCXRteV9jcmVhdGVfZW50cnkoIi51cGRhdGVzX2NvdW50 ZXIiLCAwNDAwLCB0bXlfZGlyLA0KKwkJCSBUTVlfVVBEQVRFU0NPVU5URVIpOw0KKwl0bXlfY3Jl YXRlX2VudHJ5KCJ2ZXJzaW9uIiwgICAgICAgICAgMDQwMCwgdG15X2RpciwNCisJCQkgVE1ZX1ZF UlNJT04pOw0KKwl0bXlfY3JlYXRlX2VudHJ5KCJncmFudF9sb2ciLCAgICAgICAgMDQwMCwgdG15 X2RpciwNCisJCQkgVE1ZX0dSQU5UX0xPRyk7DQorCXRteV9jcmVhdGVfZW50cnkoInJlamVjdF9s b2ciLCAgICAgICAwNDAwLCB0bXlfZGlyLA0KKwkJCSBUTVlfUkVKRUNUX0xPRyk7DQorCXJldHVy biAwOw0KK30NCisNCitwb3N0Y29yZV9pbml0Y2FsbCh0bXlfaW50ZXJmYWNlX2luaXQpOw0KDQot LSANCg== --boundary-1--