From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 102872 invoked by alias); 19 Jul 2019 12:47:18 -0000 Mailing-List: contact elfutils-devel-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Post: List-Help: List-Subscribe: Sender: elfutils-devel-owner@sourceware.org Received: (qmail 102858 invoked by uid 89); 19 Jul 2019 12:47:18 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Checked: by ClamAV 0.100.3 on sourceware.org X-Virus-Found: No X-Spam-SWARE-Status: No, score=-19.2 required=5.0 tests=AWL,BAYES_00,GIT_PATCH_0,GIT_PATCH_1,GIT_PATCH_2,GIT_PATCH_3,KAM_SHORT,SPF_PASS autolearn=ham version=3.3.1 spammy=roland, bre X-Spam-Status: No, score=-19.2 required=5.0 tests=AWL,BAYES_00,GIT_PATCH_0,GIT_PATCH_1,GIT_PATCH_2,GIT_PATCH_3,KAM_SHORT,SPF_PASS autolearn=ham version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on sourceware.org X-Spam-Level: X-HELO: gnu.wildebeest.org Received: from wildebeest.demon.nl (HELO gnu.wildebeest.org) (212.238.236.112) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Fri, 19 Jul 2019 12:47:13 +0000 Received: from tarox.wildebeest.org (tarox.wildebeest.org [172.31.17.39]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by gnu.wildebeest.org (Postfix) with ESMTPSA id C04A2300073F; Fri, 19 Jul 2019 14:47:09 +0200 (CEST) Received: by tarox.wildebeest.org (Postfix, from userid 1000) id 3B3754000AA8; Fri, 19 Jul 2019 14:47:09 +0200 (CEST) Message-ID: Subject: Re: [PATCH] elfclassify tool From: Mark Wielaard To: Florian Weimer Cc: elfutils-devel@sourceware.org, Panu Matilainen Date: Fri, 19 Jul 2019 12:47:00 -0000 In-Reply-To: <8736mfzhob.fsf@oldenburg2.str.redhat.com> References: <87k1fz8c9q.fsf@oldenburg2.str.redhat.com> <2e6a27c552ae5e365db54ca6b432c77c9ad5b041.camel@klomp.org> <871s22yybt.fsf@oldenburg2.str.redhat.com> <8736mfzhob.fsf@oldenburg2.str.redhat.com> Content-Type: multipart/mixed; boundary="=-b4y68IWdRwDmNt8amqKr" X-Mailer: Evolution 3.28.5 (3.28.5-2.el7) Mime-Version: 1.0 X-Spam-Flag: NO X-IsSubscribed: yes X-SW-Source: 2019-q3/txt/msg00062.txt.bz2 --=-b4y68IWdRwDmNt8amqKr Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable Content-length: 2147 Hi, Sorry, this took way too long. But I really like this code. On Thu, 2019-04-18 at 13:17 +0200, Florian Weimer wrote: > * Florian Weimer: >=20 > > > BTW. Florian, the extra options are certainly not required for you to > > > implement to get eu-elfclassify accepted. They are just suggestions, > > > which we might decide not to do/add. Or they can be added by others if > > > they think they are useful. > >=20 > > Understood. I would rather fix the command line syntax as a priority, > > implement --unstripped, and add a test suite. >=20 > The patch below, also available here: >=20 > >=20 > reworks the command line parser, implements filtering of file lists, and > adds the --unstripped option. That looks really good. I went ahead an fixed a couple of nits and added some of my suggestions. I'll respond to your other email explaining some of my reasoning. The changes I made are: elfclassify: Fix bre -> be typo in "unstripped" option help text. elfclassify: When reading stdin make sure paths don't include newline. elfclassify: Allow inspecting compressed or (kernel) image files with -z. elfclassify: Always clean up ELF file and descriptor if one is still open. elfclassify: Don't treat errors in elf_open or run_classify as fatal. elfclassify: Add --quiet/-q to suppress error messages. elfclassify: Add \n to fputs debug output. elfclassify: Add --file/-f for testing just regular files. elfclassify: Require --elf by default. Add more classifications. elfclassify: Add elf_kind and elf_type strings for verbose output. elfclassify: Require PT_LOAD for loadable classification. elfclassify: Add --program classification. elfclassify: Don't use ARGP_NO_EXIT and document exit code expectation. elfclassify: Add --linux-kernel-module classification. elfclassify: Add --debug-only classification. Attached is the new version. The individual commits can be found here: https://code.wildebeest.org/git/user/mjw/elfutils/log/?h=3Delfclassify Please let me know if any of this looks bad or unusual. I'll write some testcases. Thanks, Mark --=-b4y68IWdRwDmNt8amqKr Content-Disposition: inline; filename="elfclassify.patch" Content-Type: text/x-patch; name="elfclassify.patch"; charset="UTF-8" Content-Transfer-Encoding: base64 Content-length: 41554 ZGlmZiAtLWdpdCBhL3NyYy9NYWtlZmlsZS5hbSBiL3NyYy9NYWtlZmlsZS5h bQppbmRleCAyYjFjMGRjYi4uNjlhYzRkYmUgMTAwNjQ0Ci0tLSBhL3NyYy9N YWtlZmlsZS5hbQorKysgYi9zcmMvTWFrZWZpbGUuYW0KQEAgLTI2LDcgKzI2 LDggQEAgQU1fQ1BQRkxBR1MgKz0gLUkkKHNyY2RpcikvLi4vbGliZWxmIC1J JChzcmNkaXIpLy4uL2xpYmVibCBcCiBBTV9MREZMQUdTID0gLVdsLC1ycGF0 aC1saW5rLC4uL2xpYmVsZjouLi9saWJkdwogCiBiaW5fUFJPR1JBTVMgPSBy ZWFkZWxmIG5tIHNpemUgc3RyaXAgZWxmbGludCBmaW5kdGV4dHJlbCBhZGRy MmxpbmUgXAotCSAgICAgICBlbGZjbXAgb2JqZHVtcCByYW5saWIgc3RyaW5n cyBhciB1bnN0cmlwIHN0YWNrIGVsZmNvbXByZXNzCisJICAgICAgIGVsZmNt cCBvYmpkdW1wIHJhbmxpYiBzdHJpbmdzIGFyIHVuc3RyaXAgc3RhY2sgZWxm Y29tcHJlc3MgXAorCSAgICAgICBlbGZjbGFzc2lmeQogCiBub2luc3RfTElC UkFSSUVTID0gbGliYXIuYQogCkBAIC04Myw2ICs4NCw3IEBAIGFyX0xEQURE ID0gbGliYXIuYSAkKGxpYmVsZikgJChsaWJldSkgJChhcmdwX0xEQUREKQog dW5zdHJpcF9MREFERCA9ICQobGliZWJsKSAkKGxpYmVsZikgJChsaWJkdykg JChsaWJldSkgJChhcmdwX0xEQUREKSAtbGRsCiBzdGFja19MREFERCA9ICQo bGliZWJsKSAkKGxpYmVsZikgJChsaWJkdykgJChsaWJldSkgJChhcmdwX0xE QUREKSAtbGRsICQoZGVtYW5nbGVsaWIpCiBlbGZjb21wcmVzc19MREFERCA9 ICQobGliZWJsKSAkKGxpYmVsZikgJChsaWJkdykgJChsaWJldSkgJChhcmdw X0xEQUREKQorZWxmY2xhc3NpZnlfTERBREQgPSAkKGxpYmVsZikgJChsaWJk dykgJChsaWJldSkgJChhcmdwX0xEQUREKQogCiBpbnN0YWxsY2hlY2stYmlu UFJPR1JBTVM6ICQoYmluX1BST0dSQU1TKQogCWJhZD0wOyBwaWQ9JCQkJDsg bGlzdD0iJChiaW5fUFJPR1JBTVMpIjsgZm9yIHAgaW4gJCRsaXN0OyBkbyBc CmRpZmYgLS1naXQgYS9zcmMvZWxmY2xhc3NpZnkuYyBiL3NyYy9lbGZjbGFz c2lmeS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwLi44 M2E5N2Q0NwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9lbGZjbGFzc2lmeS5j CkBAIC0wLDAgKzEsOTg5IEBACisvKiBDbGFzc2lmaWNhdGlvbiBvZiBFTEYg ZmlsZXMuCisgICBDb3B5cmlnaHQgKEMpIDIwMTkgUmVkIEhhdCwgSW5jLgor ICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgZWxmdXRpbHMuCisKKyAgIFRoaXMg ZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBp dCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhl IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQor ICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNp b24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyAgIChhdCB5b3VyIG9wdGlvbikg YW55IGxhdGVyIHZlcnNpb24uCisKKyAgIGVsZnV0aWxzIGlzIGRpc3RyaWJ1 dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAor ICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1w bGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5F U1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05V IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKwor ICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05V IEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGggdGhpcyBw cm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNl bnNlcy8+LiAgKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorCisjaW5jbHVk ZSA8YXJncC5oPgorI2luY2x1ZGUgPGVycm9yLmg+CisjaW5jbHVkZSA8ZmNu dGwuaD4KKyNpbmNsdWRlIDxnZWxmLmg+CisjaW5jbHVkZSA8c3RkYm9vbC5o PgorI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+Cisj aW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5j bHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2lu Y2x1ZGUgRUxGVVRJTFNfSEVBREVSKGVsZikKKyNpbmNsdWRlIEVMRlVUSUxT X0hFQURFUihkd2VsZikKKyNpbmNsdWRlICJwcmludHZlcnNpb24uaCIKKwor LyogTmFtZSBhbmQgdmVyc2lvbiBvZiBwcm9ncmFtLiAgKi8KK0FSR1BfUFJP R1JBTV9WRVJTSU9OX0hPT0tfREVGID0gcHJpbnRfdmVyc2lvbjsKKworLyog QnVnIHJlcG9ydCBhZGRyZXNzLiAgKi8KK0FSR1BfUFJPR1JBTV9CVUdfQURE UkVTU19ERUYgPSBQQUNLQUdFX0JVR1JFUE9SVDsKKworLyogU2V0IGJ5IHBh cnNlX29wdC4gICovCitzdGF0aWMgaW50IHZlcmJvc2U7CisKKy8qIFNldCBi eSB0aGUgbWFpbiBmdW5jdGlvbi4gICovCitzdGF0aWMgY29uc3QgY2hhciAq Y3VycmVudF9wYXRoOworCisvKiBTZXQgYnkgb3Blbl9maWxlLiAgKi8KK3N0 YXRpYyBpbnQgZmlsZV9mZCA9IC0xOworCisvKiBTZXQgYnkgaXNzdWUgb3Ig ZWxmX2lzc3VlLiAgKi8KK3N0YXRpYyBib29sIGlzc3VlX2ZvdW5kOworCisv KiBOb24tZmF0YWwgaXNzdWUgb2NjdXJlZCB3aGlsZSBwcm9jZXNzaW5nIHRo ZSBjdXJyZW50X3BhdGguICAqLworc3RhdGljIHZvaWQKK2lzc3VlIChpbnQg ZSwgY29uc3QgY2hhciAqbXNnKQoreworICBpZiAodmVyYm9zZSA+PSAwKQor ICAgIHsKKyAgICAgIGlmIChjdXJyZW50X3BhdGggPT0gTlVMTCkKKwllcnJv ciAoMCwgZSwgIiVzIiwgbXNnKTsKKyAgICAgIGVsc2UKKwllcnJvciAoMCwg ZSwgIiVzICclcyciLCBtc2csIGN1cnJlbnRfcGF0aCk7CisgICAgfQorICBp c3N1ZV9mb3VuZCA9IHRydWU7Cit9CisKKy8qIE5vbi1mYXRhbCBpc3N1ZSBv Y2N1cmVkIHdoaWxlIHByb2Nlc3NpbmcgdGhlIGN1cnJlbnQgRUxGLiAgKi8K K3N0YXRpYyB2b2lkCitlbGZfaXNzdWUgKGNvbnN0IGNoYXIgKm1zZykKK3sK KyAgaWYgKHZlcmJvc2UgPj0gMCkKKyAgICBlcnJvciAoMCwgMCwgIiVzOiAl czogJyVzJyIsIG1zZywgZWxmX2Vycm1zZyAoLTEpLCBjdXJyZW50X3BhdGgp OworICBpc3N1ZV9mb3VuZCA9IHRydWU7Cit9CisKKy8qIFNldCBieSBwYXJz ZV9vcHQuICAqLworc3RhdGljIGJvb2wgZmxhZ19vbmx5X3JlZ3VsYXJfZmls ZXM7CisKK3N0YXRpYyBib29sCitvcGVuX2ZpbGUgKHZvaWQpCit7CisgIGlm ICh2ZXJib3NlID4gMSkKKyAgICBmcHJpbnRmIChzdGRlcnIsICJkZWJ1Zzog cHJvY2Vzc2luZyBmaWxlOiAlc1xuIiwgY3VycmVudF9wYXRoKTsKKworICBm aWxlX2ZkID0gb3BlbiAoY3VycmVudF9wYXRoLCBPX1JET05MWSB8IChmbGFn X29ubHlfcmVndWxhcl9maWxlcworCQkJCQkgICAgPyBPX05PRk9MTE9XIDog MCkpOworICBpZiAoZmlsZV9mZCA8IDApCisgICAgeworICAgICAgaWYgKCFm bGFnX29ubHlfcmVndWxhcl9maWxlcyB8fCBlcnJubyAhPSBFTE9PUCkKKwlp c3N1ZSAoZXJybm8sIE5fKCJvcGVuaW5nIikpOworICAgICAgcmV0dXJuIGZh bHNlOworICAgIH0KKworICBzdHJ1Y3Qgc3RhdCBzdDsKKyAgaWYgKGZzdGF0 IChmaWxlX2ZkLCAmc3QpICE9IDApCisgICAgeworICAgICAgaXNzdWUgKGVy cm5vLCBOXygicmVhZGluZyIpKTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAg ICB9CisKKyAgLyogRG9uJ3QgZXZlbiBib3RoZXIgd2l0aCBkaXJlY3Rvcmll cy4gICovCisgIGlmIChTX0lTRElSIChzdC5zdF9tb2RlKQorICAgICAgfHwg KGZsYWdfb25seV9yZWd1bGFyX2ZpbGVzICYmICFTX0lTUkVHIChzdC5zdF9t b2RlKSkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIHJldHVybiB0cnVlOwor fQorCitzdGF0aWMgdm9pZAorY2xvc2VfZmlsZSAodm9pZCkKK3sKKyAgaWYg KGZpbGVfZmQgPj0gMCkKKyAgICB7CisgICAgICBjbG9zZSAoZmlsZV9mZCk7 CisgICAgICBmaWxlX2ZkID0gLTE7CisgICAgfQorfQorCisvKiBTZXQgYnkg b3Blbl9lbGYuICAqLworc3RhdGljIEVsZiAqZWxmOworCisvKiBTZXQgYnkg cGFyc2Vfb3B0LiAgKi8KK3N0YXRpYyBib29sIGZsYWdfY29tcHJlc3NlZDsK Kworc3RhdGljIGJvb2wKK29wZW5fZWxmICh2b2lkKQoreworICBpZiAoIW9w ZW5fZmlsZSAoKSkKKyAgICB7CisgICAgICAvKiBNYWtlIHN1cmUgdGhlIGZp bGUgZGVzY3JpcHRvciBpcyBnb25lLiAgKi8KKyAgICAgIGNsb3NlX2ZpbGUg KCk7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgIGlmIChmbGFn X2NvbXByZXNzZWQpCisgICAgZWxmID0gZHdlbGZfZWxmX2JlZ2luIChmaWxl X2ZkKTsKKyAgZWxzZQorICAgIGVsZiA9IGVsZl9iZWdpbiAoZmlsZV9mZCwg RUxGX0NfUkVBRCwgTlVMTCk7CisKKyAgaWYgKGVsZiA9PSBOVUxMKQorICAg IHsKKyAgICAgIC8qIFRoaXMgbGlrZWx5IG1lYW5zIGl0IGp1c3QgaXNuJ3Qg YW4gRUxGIGZpbGUsIHByb2JhYmx5IG5vdCBhCisJIHJlYWwgaXNzdWUsIGJ1 dCB3YXJuIGlmIHZlcmJvc2UgcmVwb3J0aW5nLiAgKi8KKyAgICAgIGlmICh2 ZXJib3NlID4gMCkKKwlmcHJpbnRmIChzdGRlcnIsICJ3YXJuaW5nOiAlczog JXNcbiIsIGN1cnJlbnRfcGF0aCwgZWxmX2Vycm1zZyAoLTEpKTsKKyAgICAg IHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgcmV0dXJuIHRydWU7Cit9CisK K3N0YXRpYyB2b2lkCitjbG9zZV9lbGYgKHZvaWQpCit7CisgIGlmIChlbGYg IT0gTlVMTCkKKyAgICB7CisgICAgICBlbGZfZW5kIChlbGYpOworICAgICAg ZWxmID0gTlVMTDsKKyAgICB9CisKKyAgY2xvc2VfZmlsZSAoKTsKK30KKwor c3RhdGljIGNvbnN0IGNoYXIgKgorZWxmX2tpbmRfc3RyaW5nIChpbnQga2lu ZCkKK3sKKyAgc3dpdGNoIChraW5kKQorICAgIHsKKyAgICBjYXNlIEVMRl9L X05PTkU6CisgICAgICByZXR1cm4gIkVMRl9LX05PTkUiOworICAgIGNhc2Ug RUxGX0tfQVI6CisgICAgICByZXR1cm4gIkVMRl9LX0FSIjsKKyAgICBjYXNl IEVMRl9LX0NPRkY6CisgICAgICByZXR1cm4gIkVMRl9LX0NPRkYiOyAvKiBs aWJlbGYgZG9lc24ndCByZWFsbHkgc3VwcG9ydCB0aGlzLiAgKi8KKyAgICBj YXNlIEVMRl9LX0VMRjoKKyAgICAgIHJldHVybiAiRUxGX0tfRUxGIjsKKyAg ICBkZWZhdWx0OgorICAgICAgcmV0dXJuICI8dW5rbm93bj4iOworICAgIH0K K30KKworc3RhdGljIGNvbnN0IGNoYXIgKgorZWxmX3R5cGVfc3RyaW5nIChp bnQgdHlwZSkKK3sKKyAgc3dpdGNoICh0eXBlKQorICAgIHsKKyAgICBjYXNl IEVUX05PTkU6CisgICAgICByZXR1cm4gIkVUX05PTkUiOworICAgIGNhc2Ug RVRfUkVMOgorICAgICAgcmV0dXJuICJFVF9SRUwiOworICAgIGNhc2UgRVRf RVhFQzoKKyAgICAgIHJldHVybiAiRVRfRVhFQyI7CisgICAgY2FzZSBFVF9E WU46CisgICAgICByZXR1cm4gIkVUX0RZTiI7CisgICAgY2FzZSBFVF9DT1JF OgorICAgICAgcmV0dXJuICJFVF9DT1JFIjsKKyAgICBkZWZhdWx0OgorICAg ICAgcmV0dXJuICI8dW5rbm93bj4iOworICAgIH0KK30KKworc3RhdGljIGlu dCBlbGZfdHlwZTsKK3N0YXRpYyBib29sIGhhc19wcm9ncmFtX2xvYWQ7Citz dGF0aWMgYm9vbCBoYXNfcHJvZ2JpdHNfYWxsb2M7CitzdGF0aWMgYm9vbCBo YXNfcHJvZ3JhbV9pbnRlcnByZXRlcjsKK3N0YXRpYyBib29sIGhhc19keW5h bWljOworc3RhdGljIGJvb2wgaGFzX3NvbmFtZTsKK3N0YXRpYyBib29sIGhh c19waWVfZmxhZzsKK3N0YXRpYyBib29sIGhhc19kdF9kZWJ1ZzsKK3N0YXRp YyBib29sIGhhc19zeW10YWI7CitzdGF0aWMgYm9vbCBoYXNfZGVidWdfc2Vj dGlvbnM7CitzdGF0aWMgYm9vbCBoYXNfbW9kaW5mbzsKK3N0YXRpYyBib29s IGhhc19nbnVfbGlua29uY2VfdGhpc19tb2R1bGU7CisKK3N0YXRpYyBib29s CitydW5fY2xhc3NpZnkgKHZvaWQpCit7CisgIC8qIFJlc2V0IHRvIHVuYW5h bHl6ZWQgZGVmYXVsdC4gICovCisgIGVsZl90eXBlID0gMDsKKyAgaGFzX3By b2dyYW1fbG9hZCA9IGZhbHNlOworICBoYXNfcHJvZ2JpdHNfYWxsb2MgPSBm YWxzZTsKKyAgaGFzX3Byb2dyYW1faW50ZXJwcmV0ZXIgPSBmYWxzZTsKKyAg aGFzX2R5bmFtaWMgPSBmYWxzZTsKKyAgaGFzX3NvbmFtZSA9IGZhbHNlOwor ICBoYXNfcGllX2ZsYWcgPSBmYWxzZTsKKyAgaGFzX2R0X2RlYnVnID0gZmFs c2U7CisgIGhhc19zeW10YWIgPSBmYWxzZTsKKyAgaGFzX2RlYnVnX3NlY3Rp b25zID0gZmFsc2U7CisgIGhhc19tb2RpbmZvID0gZmFsc2U7CisgIGhhc19n bnVfbGlua29uY2VfdGhpc19tb2R1bGUgPSBmYWxzZTsKKworICBpbnQga2lu ZCA9IGVsZl9raW5kIChlbGYpOworICBpZiAodmVyYm9zZSA+IDApCisgICAg ZnByaW50ZiAoc3RkZXJyLCAiaW5mbzogJXM6IEVMRiBraW5kOiAlcyAoMHgl eClcbiIsIGN1cnJlbnRfcGF0aCwKKwkgICAgIGVsZl9raW5kX3N0cmluZyAo a2luZCksIGtpbmQpOworICBpZiAoa2luZCAhPSBFTEZfS19FTEYpCisgICAg cmV0dXJuIHRydWU7CisKKyAgR0VsZl9FaGRyIGVoZHJfc3RvcmFnZTsKKyAg R0VsZl9FaGRyICplaGRyID0gZ2VsZl9nZXRlaGRyIChlbGYsICZlaGRyX3N0 b3JhZ2UpOworICBpZiAoZWhkciA9PSBOVUxMKQorICAgIHsKKyAgICAgIGVs Zl9pc3N1ZSAoTl8oIkVMRiBoZWFkZXIiKSk7CisgICAgICByZXR1cm4gZmFs c2U7CisgICAgfQorICBlbGZfdHlwZSA9IGVoZHItPmVfdHlwZTsKKworICAv KiBFeGFtaW5lIHByb2dyYW0gaGVhZGVycy4gICovCisgIHsKKyAgICBzaXpl X3QgbnBoZHJzOworICAgIGlmIChlbGZfZ2V0cGhkcm51bSAoZWxmLCAmbnBo ZHJzKSAhPSAwKQorICAgICAgeworCWVsZl9pc3N1ZSAoTl8oInByb2dyYW0g aGVhZGVycyIpKTsKKwlyZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgZm9y IChzaXplX3QgcGhkcl9pZHggPSAwOyBwaGRyX2lkeCA8IG5waGRyczsgKytw aGRyX2lkeCkKKyAgICAgIHsKKwlHRWxmX1BoZHIgcGhkcl9zdG9yYWdlOwor CUdFbGZfUGhkciAqcGhkciA9IGdlbGZfZ2V0cGhkciAoZWxmLCBwaGRyX2lk eCwgJnBoZHJfc3RvcmFnZSk7CisJaWYgKHBoZHIgPT0gTlVMTCkKKwkgIHsK KwkgICAgZWxmX2lzc3VlIChOXygicHJvZ3JhbSBoZWFkZXIiKSk7CisJICAg IHJldHVybiBmYWxzZTsKKwkgIH0KKwlpZiAocGhkci0+cF90eXBlID09IFBU X0RZTkFNSUMpCisJICBoYXNfZHluYW1pYyA9IHRydWU7CisJaWYgKHBoZHIt PnBfdHlwZSA9PSBQVF9JTlRFUlApCisJICBoYXNfcHJvZ3JhbV9pbnRlcnBy ZXRlciA9IHRydWU7CisJaWYgKHBoZHItPnBfdHlwZSA9PSBQVF9MT0FEKQor CSAgaGFzX3Byb2dyYW1fbG9hZCA9IHRydWU7CisgICAgICB9CisgIH0KKwor ICBFbGZfU2NuICpkeW5fc2VjdGlvbiA9IE5VTEw7CisgIHsKKyAgICBzaXpl X3Qgc2hzdHJuZHg7CisgICAgaWYgKHVubGlrZWx5IChlbGZfZ2V0c2hkcnN0 cm5keCAoZWxmLCAmc2hzdHJuZHgpIDwgMCkpCisgICAgICB7CisJZWxmX2lz c3VlIChOXygic2VjdGlvbiBoZWFkZXIgc3RyaW5nIHRhYmxlIGluZGV4Iikp OworCXJldHVybiBmYWxzZTsKKyAgICAgIH0KKworICAgIEVsZl9TY24gKnNj biA9IE5VTEw7CisgICAgd2hpbGUgKHRydWUpCisgICAgICB7CisgICAgICAg IHNjbiA9IGVsZl9uZXh0c2NuIChlbGYsIHNjbik7CisgICAgICAgIGlmIChz Y24gPT0gTlVMTCkKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgR0VsZl9T aGRyIHNoZHJfc3RvcmFnZTsKKyAgICAgICAgR0VsZl9TaGRyICpzaGRyID0g Z2VsZl9nZXRzaGRyIChzY24sICZzaGRyX3N0b3JhZ2UpOworICAgICAgICBp ZiAoc2hkciA9PSBOVUxMKQorCSAgeworICAgICAgICAgICAgZWxmX2lzc3Vl IChOXygiY291bGQgbm90IG9idGFpbiBzZWN0aW9uIGhlYWRlciIpKTsKKwkg ICAgcmV0dXJuIGZhbHNlOworCSAgfQorICAgICAgICBjb25zdCBjaGFyICpz ZWN0aW9uX25hbWUgPSBlbGZfc3RycHRyIChlbGYsIHNoc3RybmR4LCBzaGRy LT5zaF9uYW1lKTsKKyAgICAgICAgaWYgKHNlY3Rpb25fbmFtZSA9PSBOVUxM KQorCSAgeworICAgICAgICAgICAgZWxmX2lzc3VlKE5fKCJjb3VsZCBub3Qg b2J0YWluIHNlY3Rpb24gbmFtZSIpKTsKKwkgICAgcmV0dXJuIGZhbHNlOwor CSAgfQorICAgICAgICBpZiAodmVyYm9zZSA+IDIpCisgICAgICAgICAgZnBy aW50ZiAoc3RkZXJyLCAiZGVidWc6IHNlY3Rpb24gaGVhZGVyICVzICh0eXBl ICVkKSBmb3VuZFxuIiwKKyAgICAgICAgICAgICAgICAgICBzZWN0aW9uX25h bWUsIHNoZHItPnNoX3R5cGUpOworICAgICAgICBpZiAoc2hkci0+c2hfdHlw ZSA9PSBTSFRfRFlOQU1JQykKKyAgICAgICAgICB7CisgICAgICAgICAgICBp ZiAodmVyYm9zZSA+IDEpCisgICAgICAgICAgICAgIGZwdXRzICgiZGVidWc6 IGR5bmFtaWMgc2VjdGlvbiBmb3VuZFxuIiwgc3RkZXJyKTsKKyAgICAgICAg ICAgIGR5bl9zZWN0aW9uID0gc2NuOworICAgICAgICAgIH0KKyAgICAgICAg aWYgKHNoZHItPnNoX3R5cGUgPT0gU0hUX1NZTVRBQikKKyAgICAgICAgICB7 CisgICAgICAgICAgICBpZiAodmVyYm9zZSA+IDEpCisgICAgICAgICAgICAg IGZwdXRzICgiZGVidWc6IHN5bXRhYiBzZWN0aW9uIGZvdW5kXG4iLCBzdGRl cnIpOworICAgICAgICAgICAgaGFzX3N5bXRhYiA9IHRydWU7CisgICAgICAg ICAgfQorCWlmIChzaGRyLT5zaF90eXBlID09IFNIVF9QUk9HQklUUyAmJiAo c2hkci0+c2hfZmxhZ3MgJiBTSEZfQUxMT0MpICE9IDApCisJICB7CisJICAg IGlmICh2ZXJib3NlID4gMSAmJiAhaGFzX3Byb2diaXRzX2FsbG9jKQorCSAg ICAgIGZwdXRzICgiZGVidWc6IGFsbG9jYXRlZCBQUk9HQklUUyBzZWN0aW9u IGZvdW5kXG4iLCBzdGRlcnIpOworCSAgICBoYXNfcHJvZ2JpdHNfYWxsb2Mg PSB0cnVlOworCSAgfQorICAgICAgICBjb25zdCBjaGFyICpkZWJ1Z19wcmVm aXggPSAiLmRlYnVnXyI7CisgICAgICAgIGlmIChzdHJuY21wIChzZWN0aW9u X25hbWUsIGRlYnVnX3ByZWZpeCwgc3RybGVuIChkZWJ1Z19wcmVmaXgpKSA9 PSAwKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICh2ZXJib3NlID4g MSAmJiAhaGFzX2RlYnVnX3NlY3Rpb25zKQorICAgICAgICAgICAgICBmcHV0 cyAoImRlYnVnOiAuZGVidWdfKiBzZWN0aW9uIGZvdW5kXG4iLCBzdGRlcnIp OworICAgICAgICAgICAgaGFzX2RlYnVnX3NlY3Rpb25zID0gdHJ1ZTsKKyAg ICAgICAgICB9CisJaWYgKHN0cmNtcCAoc2VjdGlvbl9uYW1lLCAiLm1vZGlu Zm8iKSA9PSAwKQorCSAgeworCSAgICBpZiAodmVyYm9zZSA+IDEpCisJICAg ICAgZnB1dHMgKCJkZWJ1ZzogLm1vZGluZm8gc2VjdGlvbiBmb3VuZFxuIiwg c3RkZXJyKTsKKwkgICAgaGFzX21vZGluZm8gPSB0cnVlOworCSAgfQorCWlm IChzdHJjbXAgKHNlY3Rpb25fbmFtZSwgIi5nbnUubGlua29uY2UudGhpc19t b2R1bGUiKSA9PSAwKQorCSAgeworCSAgICBpZiAodmVyYm9zZSA+IDEpCisJ ICAgICAgZnB1dHMgKCJkZWJ1ZzogLmdudS5saW5rb25jZS50aGlzX21vZHVs ZSBzZWN0aW9uIGZvdW5kXG4iLAorCQkgICAgIHN0ZGVycik7CisJICAgIGhh c19nbnVfbGlua29uY2VfdGhpc19tb2R1bGUgPSB0cnVlOworCSAgfQorICAg ICAgfQorICB9CisKKyAgLyogRXhhbWluZSB0aGUgZHluYW1pYyBzZWN0aW9u LiAgKi8KKyAgaWYgKGhhc19keW5hbWljKQorICAgIHsKKyAgICAgIGlmIChk eW5fc2VjdGlvbiAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgRWxm X0RhdGEgKmRhdGEgPSBlbGZfZ2V0ZGF0YSAoZHluX3NlY3Rpb24sIE5VTEwp OworICAgICAgICAgIGlmICh2ZXJib3NlID4gMikKKyAgICAgICAgICAgIGZw cmludGYgKHN0ZGVyciwgImRlYnVnOiBFbGZfRGF0YSBmb3IgZHluYW1pYyBz ZWN0aW9uOiAlcFxuIiwKKyAgICAgICAgICAgICAgICAgICAgIGRhdGEpOwor CisgICAgICAgICAgaWYgKGRhdGEgIT0gTlVMTCkKKyAgICAgICAgICAgIGZv ciAoaW50IGR5bl9pZHggPSAwOyA7ICsrZHluX2lkeCkKKyAgICAgICAgICAg ICAgeworICAgICAgICAgICAgICAgIEdFbGZfRHluIGR5bl9zdG9yYWdlOwor ICAgICAgICAgICAgICAgIEdFbGZfRHluICpkeW4gPSBnZWxmX2dldGR5biAo ZGF0YSwgZHluX2lkeCwgJmR5bl9zdG9yYWdlKTsKKyAgICAgICAgICAgICAg ICBpZiAoZHluID09IE5VTEwpCisgICAgICAgICAgICAgICAgICBicmVhazsK KyAgICAgICAgICAgICAgICBpZiAodmVyYm9zZSA+IDIpCisgICAgICAgICAg ICAgICAgICBmcHJpbnRmIChzdGRlcnIsICJkZWJ1ZzogZHluYW1pYyBlbnRy eSAlZCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIgd2l0aCB0YWcg JWxsdSBmb3VuZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGR5 bl9pZHgsICh1bnNpZ25lZCBsb25nIGxvbmcgaW50KSBkeW4tPmRfdGFnKTsK KyAgICAgICAgICAgICAgICBpZiAoZHluLT5kX3RhZyA9PSBEVF9TT05BTUUp CisgICAgICAgICAgICAgICAgICBoYXNfc29uYW1lID0gdHJ1ZTsKKyAgICAg ICAgICAgICAgICBpZiAoZHluLT5kX3RhZyA9PSBEVF9GTEFHU18xICYmIChk eW4tPmRfdW4uZF92YWwgJiBERl8xX1BJRSkpCisgICAgICAgICAgICAgICAg ICBoYXNfcGllX2ZsYWcgPSB0cnVlOworICAgICAgICAgICAgICAgIGlmIChk eW4tPmRfdGFnID09IERUX0RFQlVHKQorICAgICAgICAgICAgICAgICAgaGFz X2R0X2RlYnVnID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBpZiAoZHluLT5k X3RhZyA9PSBEVF9OVUxMKQorICAgICAgICAgICAgICAgICAgYnJlYWs7Cisg ICAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICBpZiAodmVy Ym9zZSA+IDApCisgICAgeworICAgICAgZnByaW50ZiAoc3RkZXJyLCAiaW5m bzogJXM6IEVMRiB0eXBlOiAlcyAoMHgleClcbiIsIGN1cnJlbnRfcGF0aCwK KwkgICAgICAgZWxmX3R5cGVfc3RyaW5nIChlbGZfdHlwZSksIGVsZl90eXBl KTsKKyAgICAgIGlmIChoYXNfcHJvZ3JhbV9sb2FkKQorICAgICAgICBmcHJp bnRmIChzdGRlcnIsICJpbmZvOiAlczogUFRfTE9BRCBmb3VuZFxuIiwgY3Vy cmVudF9wYXRoKTsKKyAgICAgIGlmIChoYXNfcHJvZ2JpdHNfYWxsb2MpCisJ ZnByaW50ZiAoc3RkZXJyLCAiaW5mbzogJXM6IGFsbG9jYXRlZCBQUk9HQklU UyBzZWN0aW9uIGZvdW5kXG4iLAorCQkgY3VycmVudF9wYXRoKTsKKyAgICAg IGlmIChoYXNfcHJvZ3JhbV9pbnRlcnByZXRlcikKKyAgICAgICAgZnByaW50 ZiAoc3RkZXJyLCAiaW5mbzogJXM6IHByb2dyYW0gaW50ZXJwcmV0ZXIgZm91 bmRcbiIsCisgICAgICAgICAgICAgICAgIGN1cnJlbnRfcGF0aCk7CisgICAg ICBpZiAoaGFzX2R5bmFtaWMpCisgICAgICAgIGZwcmludGYgKHN0ZGVyciwg ImluZm86ICVzOiBkeW5hbWljIHNlZ21lbnQgZm91bmRcbiIsIGN1cnJlbnRf cGF0aCk7CisgICAgICBpZiAoaGFzX3NvbmFtZSkKKyAgICAgICAgZnByaW50 ZiAoc3RkZXJyLCAiaW5mbzogJXM6IHNvbmFtZSBmb3VuZFxuIiwgY3VycmVu dF9wYXRoKTsKKyAgICAgIGlmIChoYXNfcGllX2ZsYWcpCisgICAgICAgIGZw cmludGYgKHN0ZGVyciwgImluZm86ICVzOiBERl8xX1BJRSBmbGFnIGZvdW5k XG4iLCBjdXJyZW50X3BhdGgpOworICAgICAgaWYgKGhhc19kdF9kZWJ1ZykK KyAgICAgICAgZnByaW50ZiAoc3RkZXJyLCAiaW5mbzogJXM6IERUX0RFQlVH IGZvdW5kXG4iLCBjdXJyZW50X3BhdGgpOworICAgICAgaWYgKGhhc19zeW10 YWIpCisgICAgICAgIGZwcmludGYgKHN0ZGVyciwgImluZm86ICVzOiBzeW1i b2wgdGFibGUgZm91bmRcbiIsIGN1cnJlbnRfcGF0aCk7CisgICAgICBpZiAo aGFzX2RlYnVnX3NlY3Rpb25zKQorICAgICAgICBmcHJpbnRmIChzdGRlcnIs ICJpbmZvOiAlczogLmRlYnVnXyogc2VjdGlvbiBmb3VuZFxuIiwgY3VycmVu dF9wYXRoKTsKKyAgICAgIGlmIChoYXNfbW9kaW5mbykKKyAgICAgICAgZnBy aW50ZiAoc3RkZXJyLCAiaW5mbzogJXM6IC5tb2RpbmZvIHNlY3Rpb24gZm91 bmRcbiIsIGN1cnJlbnRfcGF0aCk7CisgICAgICBpZiAoaGFzX2dudV9saW5r b25jZV90aGlzX21vZHVsZSkKKyAgICAgICAgZnByaW50ZiAoc3RkZXJyLAor CQkgImluZm86ICVzOiAuZ251LmxpbmtvbmNlLnRoaXNfbW9kdWxlIHNlY3Rp b24gZm91bmRcbiIsCisJCSBjdXJyZW50X3BhdGgpOworICAgIH0KKworICBy ZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIGJvb2wKK2lzX2VsZiAodm9pZCkK K3sKKyAgcmV0dXJuIGVsZl9raW5kIChlbGYpICE9IEVMRl9LX05PTkU7Cit9 CisKK3N0YXRpYyBib29sCitpc19lbGZfZmlsZSAodm9pZCkKK3sKKyAgcmV0 dXJuIGVsZl9raW5kIChlbGYpID09IEVMRl9LX0VMRjsKK30KKworc3RhdGlj IGJvb2wKK2lzX2VsZl9hcmNoaXZlICh2b2lkKQoreworICByZXR1cm4gZWxm X2tpbmQgKGVsZikgPT0gRUxGX0tfQVI7Cit9CisKK3N0YXRpYyBib29sCitp c19jb3JlICh2b2lkKQoreworICByZXR1cm4gZWxmX2tpbmQgKGVsZikgPT0g RUxGX0tfRUxGICYmIGVsZl90eXBlID09IEVUX0NPUkU7Cit9CisKKy8qIFJl dHVybiB0cnVlIGlmIHRoZSBmaWxlIGlzIGEgbG9hZGFibGUgb2JqZWN0LCB3 aGljaCBiYXNpY2FsbHkgbWVhbnMKKyAgIGl0IGlzIGFuIEVMRiBmaWxlLCBi dXQgbm90IGEgcmVsb2NhdGFibGUgb2JqZWN0IG9yIGEgY29yZSBkdW1wCisg ICBmaWxlLiAgKFRoZSBrZXJuZWwgYW5kIHZhcmlvdXMgdXNlcnNwYWNlIGNv bXBvbmVudHMgY2FuIGxvYWQgRVRfUkVMCisgICBmaWxlcywgYnV0IHdlIGRp c3JlZ2FyZCB0aGF0IGZvciBvdXIgY2xhc3NpZmljYXRpb24gcHVycG9zZXMu KSAgKi8KK3N0YXRpYyBib29sCitpc19sb2FkYWJsZSAodm9pZCkKK3sKKyAg cmV0dXJuIGVsZl9raW5kIChlbGYpID09IEVMRl9LX0VMRgorICAgICYmIChl bGZfdHlwZSA9PSBFVF9FWEVDIHx8IGVsZl90eXBlID09IEVUX0RZTikKKyAg ICAmJiBoYXNfcHJvZ3JhbV9sb2FkOworfQorCisvKiBSZXR1cm4gdHJ1ZSBp ZiB0aGUgZmlsZSBpcyBhbiBFTEYgZmlsZSB3aGljaCBoYXMgYSBzeW1ib2wg dGFibGUgb3IKKyAgIC5kZWJ1Z18qIHNlY3Rpb25zIChhbmQgdGh1cyBjYW4g YmUgc3RyaXBwZWQgZnV0aGVyKS4gICovCitzdGF0aWMgYm9vbAoraXNfdW5z dHJpcHBlZCAodm9pZCkKK3sKKyAgcmV0dXJuIGVsZl9raW5kIChlbGYpICE9 IEVMRl9LX05PTkUKKyAgICAmJiAoZWxmX3R5cGUgPT0gRVRfUkVMIHx8IGVs Zl90eXBlID09IEVUX0VYRUMgfHwgZWxmX3R5cGUgPT0gRVRfRFlOKQorICAg ICYmIChoYXNfc3ltdGFiIHx8IGhhc19kZWJ1Z19zZWN0aW9ucyk7Cit9CisK Ky8qIFJldHVybiB0cnVlIGlmIHRoZSBmaWxlIGNvbnRhaW5zIG9ubHkgZGVi dWdpbmZvLCBidXQgbm8gbG9hZGFibGUKKyAgIHByb2dyYW0gYml0cy4gIFRo ZW4gaXQgaXMgbW9zdCBsaWtlbHkgYSBzZXBhcmF0ZSAuZGVidWcgZmlsZSwg YSBkd3oKKyAgIG11bHRpLWZpbGUgb3IgYSAuZHdvIGZpbGUuICBOb3RlIHRo YXQgaXQgY2FuIHN0aWxsIGJlIGxvYWRhYmxlLAorICAgYnV0IGluIHRoYXQg Y2FzZSB0aGUgcGhkcnMgc2hvdWxkbid0IGJlIHRydXN0ZWQuICAqLworc3Rh dGljIGJvb2wKK2lzX2RlYnVnX29ubHkgKHZvaWQpCit7CisgIHJldHVybiBl bGZfa2luZCAoZWxmKSAhPSBFTEZfS19OT05FCisgICAgJiYgKGVsZl90eXBl ID09IEVUX1JFTCB8fCBlbGZfdHlwZSA9PSBFVF9FWEVDIHx8IGVsZl90eXBl ID09IEVUX0RZTikKKyAgICAmJiBoYXNfZGVidWdfc2VjdGlvbnMKKyAgICAm JiAhaGFzX3Byb2diaXRzX2FsbG9jOworfQorCitzdGF0aWMgYm9vbAoraXNf c2hhcmVkICh2b2lkKQoreworICBpZiAoIWlzX2xvYWRhYmxlICgpKQorICAg IHJldHVybiBmYWxzZTsKKworICAvKiBUaGUgRUxGIHR5cGUgaXMgdmVyeSBj bGVhcjogdGhpcyBpcyBhbiBleGVjdXRhYmxlLiAgKi8KKyAgaWYgKGVsZl90 eXBlID09IEVUX0VYRUMpCisgICAgcmV0dXJuIGZhbHNlOworCisgIC8qIElm IHRoZSBvYmplY3QgaXMgbWFya2VkIGFzIFBJRSwgaXQgaXMgZGVmaW5pdGVs eSBhbiBleGVjdXRhYmxlLAorICAgICBhbmQgbm90IGEgbG9hZGxhYmxlIHNo YXJlZCBvYmplY3QuICAqLworICBpZiAoaGFzX3BpZV9mbGFnKQorICAgIHJl dHVybiBmYWxzZTsKKworICAvKiBUcmVhdCBhIERUX1NPTkFNRSB0YWcgYXMg YSBzdHJvbmcgaW5kaWNhdG9yIHRoYXQgdGhpcyBpcyBhIHNoYXJlZAorICAg ICBvYmplY3QuICAqLworICBpZiAoaGFzX3NvbmFtZSkKKyAgICByZXR1cm4g dHJ1ZTsKKworICAvKiBUaGlzIGlzIHByb2JhYmx5IGEgUElFIHByb2dyYW06 IHRoZXJlIGlzIG5vIHNvbmFtZSwgYnV0IGEgcHJvZ3JhbQorICAgICBpbnRl cnByZXRlci4gIEluIHRoZW9yeSwgdGhpcyBmaWxlIGNvdWxkIGJlIGFsc28g YSBEU08gd2l0aCBhCisgICAgIHNvbmFtZSBpbXBsaWVkIGJ5IGl0cyBmaWxl IG5hbWUgdGhhdCBjYW4gYmUgcnVuIGFzIGEgcHJvZ3JhbS4KKyAgICAgVGhp cyBzaXR1YXRpb24gaXMgaW1wb3NzaWJsZSB0byByZXNvbHZlIGluIHRoZSBn ZW5lcmFsIGNhc2UuICovCisgIGlmIChoYXNfcHJvZ3JhbV9pbnRlcnByZXRl cikKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgLyogUm9sYW5kIE1jR3JhdGgg bWVudGlvbnMgaW4KKyAgICAgPGh0dHBzOi8vd3d3LnNvdXJjZXdhcmUub3Jn L21sL2xpYmMtYWxwaGEvMjAxNS0wMy9tc2cwMDYwNS5odG1sPiwKKyAgICAg dGhhdCDigJx3ZSBkZWZpbmVkIGEgUElFIGFzIGFuIEVUX0RZTiB3aXRoIGEg RFRfREVCVUfigJ0uICBUaGlzCisgICAgIG1hdGNoZXMgY3VycmVudCBiaW51 dGlscyBiZWhhdmlvciAodmVyc2lvbiAyLjMyKS4gIERUX0RFQlVHIGlzCisg ICAgIGFkZGVkIGlmIGJmZF9saW5rX2V4ZWN1dGFibGUgcmV0dXJucyB0cnVl IG9yIGlmIGJmZF9saW5rX3BpYworICAgICByZXR1cm5zIGZhbHNlLCBkZXBl bmRpbmcgb24gdGhlIGFyY2hpdGVjdHVyZXMuICBIb3dldmVyLCBEVF9ERUJV RworICAgICBpcyBub3QgZG9jdW1lbnRlZCBhcyBiZWluZyBzcGVjaWZpYyB0 byBleGVjdXRhYmxlcywgdGhlcmVmb3JlIHVzZQorICAgICBpdCBvbmx5IGFz IGEgbG93LXByaW9yaXR5IGRpc2NyaW1pbmF0b3IuICAqLworICBpZiAoaGFz X2R0X2RlYnVnKQorICAgIHJldHVybiBmYWxzZTsKKworICAvKiBJZiB0aGVy ZSBpcyBubyBkeW5hbWljIHNlY3Rpb24sIHRoZSBmaWxlIGNhbm5vdCBiZSBs b2FkZWQgYXMgYQorICAgICBzaGFyZWQgb2JqZWN0LiAgKi8KKyAgaWYgKCFo YXNfZHluYW1pYykKKyAgICByZXR1cm4gZmFsc2U7CisgIHJldHVybiB0cnVl OworfQorCitzdGF0aWMgYm9vbAoraXNfZXhlY3V0YWJsZSAodm9pZCkKK3sK KyAgaWYgKCFpc19sb2FkYWJsZSAoKSkKKyAgICByZXR1cm4gZmFsc2U7CisK KyAgLyogQSBsb2FkYWJsZSBvYmplY3Qgd2hpY2ggaXMgbm90IGEgc2hhcmVk IG9iamVjdCBpcyB0cmVhdGVkIGFzIGFuCisgICAgIGV4ZWN1dGFibGUuICAq LworICByZXR1cm4gIWlzX3NoYXJlZCAoKTsKK30KKworLyogTGlrZSBpc19l eGVjdXRhYmxlLCBidXQgdGhlIG9iamVjdCBjYW4gYWxzbyBiZSBhIHNoYXJl ZCBsaWJyYXJ5IGF0CisgICB0aGUgc2FtZSB0aW1lLiAgKi8KK3N0YXRpYyBi b29sCitpc19wcm9ncmFtICh2b2lkKQoreworICBpZiAoIWlzX2xvYWRhYmxl ICgpKQorICAgIHJldHVybiBmYWxzZTsKKworICAvKiBUaGUgRUxGIHR5cGUg aXMgdmVyeSBjbGVhcjogdGhpcyBpcyBhbiBleGVjdXRhYmxlLiAgKi8KKyAg aWYgKGVsZl90eXBlID09IEVUX0VYRUMpCisgICAgcmV0dXJuIHRydWU7CisK KyAgLyogSWYgdGhlIG9iamVjdCBpcyBtYXJrZWQgYXMgUElFLCBpdCBpcyBk ZWZpbml0ZWx5IGFuIGV4ZWN1dGFibGUsCisgICAgIGFuZCBub3QgYSBsb2Fk bGFibGUgc2hhcmVkIG9iamVjdC4gICovCisgIGlmIChoYXNfcGllX2ZsYWcp CisgICAgcmV0dXJuIHRydWU7CisKKyAgLyogVGhpcyBpcyBwcm9iYWJseSBh IFBJRSBwcm9ncmFtLiBJdCBpc24ndCBFVF9FWEVDLCBidXQgaGFzIGEKKyAg ICAgcHJvZ3JhbSBpbnRlcnByZXRlci4gSW4gdGhlb3J5LCB0aGlzIGZpbGUg Y291bGQgYmUgYWxzbyBhIERTTworICAgICB3aXRoIGEgc29uYW1lLiBUaGlz IHNpdHVhdGlvbiBpcyBpbXBvc3NpYmxlIHRvIHJlc29sdmUgaW4gdGhlCisg ICAgIGdlbmVyYWwgY2FzZS4gU2VlIGlzX3NoYXJlZC4gVGhpcyBpcyBkaWZm ZXJlbnQgZnJvbQorICAgICBpc19leGVjdXRhYmxlLiAgKi8KKyAgaWYgKGhh c19wcm9ncmFtX2ludGVycHJldGVyKQorICAgIHJldHVybiB0cnVlOworCisg IC8qIFJvbGFuZCBNY0dyYXRoIG1lbnRpb25zIGluCisgICAgIDxodHRwczov L3d3dy5zb3VyY2V3YXJlLm9yZy9tbC9saWJjLWFscGhhLzIwMTUtMDMvbXNn MDA2MDUuaHRtbD4sCisgICAgIHRoYXQg4oCcd2UgZGVmaW5lZCBhIFBJRSBh cyBhbiBFVF9EWU4gd2l0aCBhIERUX0RFQlVH4oCdLiAgVGhpcworICAgICBt YXRjaGVzIGN1cnJlbnQgYmludXRpbHMgYmVoYXZpb3IgKHZlcnNpb24gMi4z MikuICBEVF9ERUJVRyBpcworICAgICBhZGRlZCBpZiBiZmRfbGlua19leGVj dXRhYmxlIHJldHVybnMgdHJ1ZSBvciBpZiBiZmRfbGlua19waWMKKyAgICAg cmV0dXJucyBmYWxzZSwgZGVwZW5kaW5nIG9uIHRoZSBhcmNoaXRlY3R1cmVz LiAgSG93ZXZlciwgRFRfREVCVUcKKyAgICAgaXMgbm90IGRvY3VtZW50ZWQg YXMgYmVpbmcgc3BlY2lmaWMgdG8gZXhlY3V0YWJsZXMsIHRoZXJlZm9yZSB1 c2UKKyAgICAgaXQgb25seSBhcyBhIGxvdy1wcmlvcml0eSBkaXNjcmltaW5h dG9yLiAgKi8KKyAgaWYgKGhhc19kdF9kZWJ1ZykKKyAgICByZXR1cm4gdHJ1 ZTsKKworICByZXR1cm4gZmFsc2U7Cit9CisKKy8qIFJldHVybnMgdHJ1ZSBp ZiB0aGUgZmlsZSBpcyBhIGxpbnV4IGtlcm5lbCBtb2R1bGUgKGlzIEVUX1JF TCBhbmQKKyAgIGhhcyB0aGUgdHdvIG1hZ2ljIHNlY3Rpb25zIC5tb2RpbmZv IGFuZCAuZ251LmxpbmtvbmNlLnRoaXNfbW9kdWxlKS4gICovCitzdGF0aWMg Ym9vbAoraXNfbGludXhfa2VybmVsX21vZHVsZSAodm9pZCkKK3sKKyAgcmV0 dXJuIChlbGZfa2luZCAoZWxmKSA9PSBFTEZfS19FTEYKKwkgICYmIGVsZl90 eXBlID09IEVUX1JFTAorCSAgJiYgaGFzX21vZGluZm8KKwkgICYmIGhhc19n bnVfbGlua29uY2VfdGhpc19tb2R1bGUpOworfQorCitlbnVtIGNsYXNzaWZ5 X3JlcXVpcmVtZW50IHsgZG9fbm90X2NhcmUsIHJlcXVpcmVkLCBmb3JiaWRk ZW4gfTsKKworZW51bSBjbGFzc2lmeV9jaGVjaworeworICBjbGFzc2lmeV9l bGYsCisgIGNsYXNzaWZ5X2VsZl9maWxlLAorICBjbGFzc2lmeV9lbGZfYXJj aGl2ZSwKKyAgY2xhc3NpZnlfY29yZSwKKyAgY2xhc3NpZnlfdW5zdHJpcHBl ZCwKKyAgY2xhc3NpZnlfZXhlY3V0YWJsZSwKKyAgY2xhc3NpZnlfcHJvZ3Jh bSwKKyAgY2xhc3NpZnlfc2hhcmVkLAorICBjbGFzc2lmeV9saW51eF9rZXJu ZWxfbW9kdWxlLAorICBjbGFzc2lmeV9kZWJ1Z19vbmx5LAorICBjbGFzc2lm eV9sb2FkYWJsZSwKKworICBjbGFzc2lmeV9jaGVja19sYXN0ID0gY2xhc3Np ZnlfbG9hZGFibGUKK307CisKK2VudW0KK3sKKyAgY2xhc3NpZnlfY2hlY2tf b2Zmc2V0ID0gMTAwMCwKKyAgY2xhc3NpZnlfY2hlY2tfbm90X29mZnNldCA9 IDIwMDAsCisKKyAgY2xhc3NpZnlfZmxhZ19zdGRpbiA9IDMwMDAsCisgIGNs YXNzaWZ5X2ZsYWdfc3RkaW4wLAorICBjbGFzc2lmeV9mbGFnX25vX3N0ZGlu LAorICBjbGFzc2lmeV9mbGFnX3ByaW50LAorICBjbGFzc2lmeV9mbGFnX3By aW50MCwKKyAgY2xhc3NpZnlfZmxhZ19ub19wcmludCwKKyAgY2xhc3NpZnlf ZmxhZ19tYXRjaGluZywKKyAgY2xhc3NpZnlfZmxhZ19ub3RfbWF0Y2hpbmcs Cit9OworCitzdGF0aWMgYm9vbAorY2xhc3NpZnlfY2hlY2tfcG9zaXRpdmUg KGludCBrZXkpCit7CisgIHJldHVybiBrZXkgPj0gY2xhc3NpZnlfY2hlY2tf b2Zmc2V0CisgICAgJiYga2V5IDw9IGNsYXNzaWZ5X2NoZWNrX29mZnNldCAr IGNsYXNzaWZ5X2NoZWNrX2xhc3Q7Cit9CisKK3N0YXRpYyBib29sCitjbGFz c2lmeV9jaGVja19uZWdhdGl2ZSAoaW50IGtleSkKK3sKKyAgcmV0dXJuIGtl eSA+PSBjbGFzc2lmeV9jaGVja19ub3Rfb2Zmc2V0CisgICAgJiYga2V5IDw9 IGNsYXNzaWZ5X2NoZWNrX25vdF9vZmZzZXQgKyBjbGFzc2lmeV9jaGVja19s YXN0OworfQorCisvKiBTZXQgYnkgcGFyc2Vfb3B0LiAgKi8KK3N0YXRpYyBl bnVtIGNsYXNzaWZ5X3JlcXVpcmVtZW50IHJlcXVpcmVtZW50c1tjbGFzc2lm eV9jaGVja19sYXN0ICsgMV07CitzdGF0aWMgZW51bSB7IG5vX3N0ZGluLCBk b19zdGRpbiwgZG9fc3RkaW4wIH0gZmxhZ19zdGRpbjsKK3N0YXRpYyBlbnVt IHsgbm9fcHJpbnQsIGRvX3ByaW50LCBkb19wcmludDAgfSBmbGFnX3ByaW50 Oworc3RhdGljIGJvb2wgZmxhZ19wcmludF9tYXRjaGluZyA9IHRydWU7CisK K3N0YXRpYyBlcnJvcl90CitwYXJzZV9vcHQgKGludCBrZXksIGNoYXIgKmFy ZyBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSksCisgICAgICAgICAgIHN0cnVj dCBhcmdwX3N0YXRlICpzdGF0ZSBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSkp Cit7CisgIGlmIChjbGFzc2lmeV9jaGVja19wb3NpdGl2ZSAoa2V5KSkKKyAg ICByZXF1aXJlbWVudHNba2V5IC0gY2xhc3NpZnlfY2hlY2tfb2Zmc2V0XSA9 IHJlcXVpcmVkOworICBlbHNlIGlmIChjbGFzc2lmeV9jaGVja19uZWdhdGl2 ZSAoa2V5KSkKKyAgICByZXF1aXJlbWVudHNba2V5IC0gY2xhc3NpZnlfY2hl Y2tfbm90X29mZnNldF0gPSBmb3JiaWRkZW47CisgIGVsc2UKKyAgICBzd2l0 Y2ggKGtleSkKKyAgICAgIHsKKyAgICAgIGNhc2UgJ3YnOgorICAgICAgICAr K3ZlcmJvc2U7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlICdxJzoK KwktLXZlcmJvc2U7CisJYnJlYWs7CisKKyAgICAgIGNhc2UgJ3onOgorCWZs YWdfY29tcHJlc3NlZCA9IHRydWU7CisJYnJlYWs7CisKKyAgICAgIGNhc2Ug J2YnOgorCWZsYWdfb25seV9yZWd1bGFyX2ZpbGVzID0gdHJ1ZTsKKwlicmVh azsKKworICAgICAgY2FzZSBjbGFzc2lmeV9mbGFnX3N0ZGluOgorICAgICAg ICBmbGFnX3N0ZGluID0gZG9fc3RkaW47CisgICAgICAgIGJyZWFrOworCisg ICAgICBjYXNlIGNsYXNzaWZ5X2ZsYWdfc3RkaW4wOgorICAgICAgICBmbGFn X3N0ZGluID0gZG9fc3RkaW4wOworICAgICAgICBicmVhazsKKworICAgICAg Y2FzZSBjbGFzc2lmeV9mbGFnX25vX3N0ZGluOgorICAgICAgICBmbGFnX3N0 ZGluID0gbm9fc3RkaW47CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNl IGNsYXNzaWZ5X2ZsYWdfcHJpbnQ6CisgICAgICAgIGZsYWdfcHJpbnQgPSBk b19wcmludDsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgY2xhc3Np ZnlfZmxhZ19wcmludDA6CisgICAgICAgIGZsYWdfcHJpbnQgPSBkb19wcmlu dDA7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIGNsYXNzaWZ5X2Zs YWdfbm9fcHJpbnQ6CisgICAgICAgIGZsYWdfcHJpbnQgPSBub19wcmludDsK KyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgY2xhc3NpZnlfZmxhZ19t YXRjaGluZzoKKyAgICAgICAgZmxhZ19wcmludF9tYXRjaGluZyA9IHRydWU7 CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIGNsYXNzaWZ5X2ZsYWdf bm90X21hdGNoaW5nOgorICAgICAgICBmbGFnX3ByaW50X21hdGNoaW5nID0g ZmFsc2U7CisgICAgICAgIGJyZWFrOworCisgICAgICBkZWZhdWx0OgorICAg ICAgICByZXR1cm4gQVJHUF9FUlJfVU5LTk9XTjsKKyAgICAgIH0KKworICBy ZXR1cm4gMDsKK30KKworLyogUGVyZm9ybSByZXF1ZXN0ZWQgY2hlY2tzIGFn YWluc3QgdGhlIGZpbGUgYXQgY3VycmVudF9wYXRoLiAgSWYKKyAgIG5lY2Vz c2FyeSwgc2V0cyAqU1RBVFVTIHRvIDEgaWYgY2hlY2tzIGZhaWxlZC4gICov CitzdGF0aWMgdm9pZAorcHJvY2Vzc19jdXJyZW50X3BhdGggKGludCAqc3Rh dHVzKQoreworICBib29sIGNoZWNrc19wYXNzZWQgPSB0cnVlOworCisgIGlm IChvcGVuX2VsZiAoKSAmJiBydW5fY2xhc3NpZnkgKCkpCisgICAgeworICAg ICAgYm9vbCBjaGVja3NbXSA9CisgICAgICAgIHsKKwkgW2NsYXNzaWZ5X2Vs Zl0gPSBpc19lbGYgKCksCisJIFtjbGFzc2lmeV9lbGZfZmlsZV0gPSBpc19l bGZfZmlsZSAoKSwKKwkgW2NsYXNzaWZ5X2VsZl9hcmNoaXZlXSA9IGlzX2Vs Zl9hcmNoaXZlICgpLAorCSBbY2xhc3NpZnlfY29yZV0gPSBpc19jb3JlICgp LAorCSBbY2xhc3NpZnlfdW5zdHJpcHBlZF0gPSBpc191bnN0cmlwcGVkICgp LAorCSBbY2xhc3NpZnlfZXhlY3V0YWJsZV0gPSBpc19leGVjdXRhYmxlICgp LAorCSBbY2xhc3NpZnlfcHJvZ3JhbV0gPSBpc19wcm9ncmFtICgpLAorCSBb Y2xhc3NpZnlfc2hhcmVkXSA9IGlzX3NoYXJlZCAoKSwKKwkgW2NsYXNzaWZ5 X2xpbnV4X2tlcm5lbF9tb2R1bGVdID0gaXNfbGludXhfa2VybmVsX21vZHVs ZSAoKSwKKwkgW2NsYXNzaWZ5X2RlYnVnX29ubHldID0gaXNfZGVidWdfb25s eSAoKSwKKwkgW2NsYXNzaWZ5X2xvYWRhYmxlXSA9IGlzX2xvYWRhYmxlICgp LAorCX07CisKKyAgICAgIGlmICh2ZXJib3NlID4gMSkKKyAgICAgICAgewor CSAgaWYgKGNoZWNrc1tjbGFzc2lmeV9lbGZdKQorCSAgICBmcHJpbnRmIChz dGRlcnIsICJkZWJ1ZzogJXM6IGVsZlxuIiwgY3VycmVudF9wYXRoKTsKKwkg IGlmIChjaGVja3NbY2xhc3NpZnlfZWxmX2ZpbGVdKQorCSAgICBmcHJpbnRm IChzdGRlcnIsICJkZWJ1ZzogJXM6IGVsZl9maWxlXG4iLCBjdXJyZW50X3Bh dGgpOworCSAgaWYgKGNoZWNrc1tjbGFzc2lmeV9lbGZfYXJjaGl2ZV0pCisJ ICAgIGZwcmludGYgKHN0ZGVyciwgImRlYnVnOiAlczogZWxmX2FyY2hpdmVc biIsIGN1cnJlbnRfcGF0aCk7CisJICBpZiAoY2hlY2tzW2NsYXNzaWZ5X2Nv cmVdKQorCSAgICBmcHJpbnRmIChzdGRlcnIsICJkZWJ1ZzogJXM6IGNvcmVc biIsIGN1cnJlbnRfcGF0aCk7CisgICAgICAgICAgaWYgKGNoZWNrc1tjbGFz c2lmeV91bnN0cmlwcGVkXSkKKyAgICAgICAgICAgIGZwcmludGYgKHN0ZGVy ciwgImRlYnVnOiAlczogdW5zdHJpcHBlZFxuIiwgY3VycmVudF9wYXRoKTsK KyAgICAgICAgICBpZiAoY2hlY2tzW2NsYXNzaWZ5X2V4ZWN1dGFibGVdKQor ICAgICAgICAgICAgZnByaW50ZiAoc3RkZXJyLCAiZGVidWc6ICVzOiBleGVj dXRhYmxlXG4iLCBjdXJyZW50X3BhdGgpOworICAgICAgICAgIGlmIChjaGVj a3NbY2xhc3NpZnlfcHJvZ3JhbV0pCisgICAgICAgICAgICBmcHJpbnRmIChz dGRlcnIsICJkZWJ1ZzogJXM6IHByb2dyYW1cbiIsIGN1cnJlbnRfcGF0aCk7 CisgICAgICAgICAgaWYgKGNoZWNrc1tjbGFzc2lmeV9zaGFyZWRdKQorICAg ICAgICAgICAgZnByaW50ZiAoc3RkZXJyLCAiZGVidWc6ICVzOiBzaGFyZWRc biIsIGN1cnJlbnRfcGF0aCk7CisJICBpZiAoY2hlY2tzW2NsYXNzaWZ5X2xp bnV4X2tlcm5lbF9tb2R1bGVdKQorCSAgICBmcHJpbnRmIChzdGRlcnIsICJk ZWJ1ZzogJXM6IGxpbnV4IGtlcm5lbCBtb2R1bGVcbiIsIGN1cnJlbnRfcGF0 aCk7CisJICBpZiAoY2hlY2tzW2NsYXNzaWZ5X2RlYnVnX29ubHldKQorCSAg ICBmcHJpbnRmIChzdGRlcnIsICJkZWJ1ZzogJXM6IGRlYnVnLW9ubHlcbiIs IGN1cnJlbnRfcGF0aCk7CisgICAgICAgICAgaWYgKGNoZWNrc1tjbGFzc2lm eV9sb2FkYWJsZV0pCisgICAgICAgICAgICBmcHJpbnRmIChzdGRlcnIsICJk ZWJ1ZzogJXM6IGxvYWRhYmxlXG4iLCBjdXJyZW50X3BhdGgpOworICAgICAg ICB9CisKKyAgICAgIGZvciAoZW51bSBjbGFzc2lmeV9jaGVjayBjaGVjayA9 IDA7CisgICAgICAgICAgIGNoZWNrIDw9IGNsYXNzaWZ5X2NoZWNrX2xhc3Q7 ICsrY2hlY2spCisgICAgICAgIHN3aXRjaCAocmVxdWlyZW1lbnRzW2NoZWNr XSkKKyAgICAgICAgICB7CisgICAgICAgICAgY2FzZSByZXF1aXJlZDoKKyAg ICAgICAgICAgIGlmICghY2hlY2tzW2NoZWNrXSkKKyAgICAgICAgICAgICAg Y2hlY2tzX3Bhc3NlZCA9IGZhbHNlOworICAgICAgICAgICAgYnJlYWs7Cisg ICAgICAgICAgY2FzZSBmb3JiaWRkZW46CisgICAgICAgICAgICBpZiAoY2hl Y2tzW2NoZWNrXSkKKyAgICAgICAgICAgICAgY2hlY2tzX3Bhc3NlZCA9IGZh bHNlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSBkb19u b3RfY2FyZToKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAg ICB9CisgIGVsc2UgaWYgKGZpbGVfZmQgPT0gLTEpCisgICAgY2hlY2tzX3Bh c3NlZCA9IGZhbHNlOyAvKiBUaGVyZSBpcyBub3RoaW5nIHRvIGNoZWNrLCBi YWQgZmlsZS4gICovCisgIGVsc2UKKyAgICB7CisgICAgICBmb3IgKGVudW0g Y2xhc3NpZnlfY2hlY2sgY2hlY2sgPSAwOworICAgICAgICAgICBjaGVjayA8 PSBjbGFzc2lmeV9jaGVja19sYXN0OyArK2NoZWNrKQorICAgICAgICBpZiAo cmVxdWlyZW1lbnRzW2NoZWNrXSA9PSByZXF1aXJlZCkKKyAgICAgICAgICBj aGVja3NfcGFzc2VkID0gZmFsc2U7CisgICAgfQorCisgIGNsb3NlX2VsZiAo KTsKKworICBzd2l0Y2ggKGZsYWdfcHJpbnQpCisgICAgeworICAgIGNhc2Ug ZG9fcHJpbnQ6CisgICAgICBpZiAoY2hlY2tzX3Bhc3NlZCA9PSBmbGFnX3By aW50X21hdGNoaW5nKQorICAgICAgICBwdXRzIChjdXJyZW50X3BhdGgpOwor ICAgICAgYnJlYWs7CisgICAgY2FzZSBkb19wcmludDA6CisgICAgICBpZiAo Y2hlY2tzX3Bhc3NlZCA9PSBmbGFnX3ByaW50X21hdGNoaW5nKQorICAgICAg ICBmd3JpdGUgKGN1cnJlbnRfcGF0aCwgc3RybGVuIChjdXJyZW50X3BhdGgp ICsgMSwgMSwgc3Rkb3V0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2Ugbm9f cHJpbnQ6CisgICAgICBpZiAoIWNoZWNrc19wYXNzZWQpCisgICAgICAgICpz dGF0dXMgPSAxOworICAgICAgYnJlYWs7CisgICAgfQorfQorCisvKiBDYWxs ZWQgdG8gcHJvY2VzcyBzdGFuZGFyZCBpbnB1dCBpZiBmbGFnX3N0ZGluIGlz IG5vdCBub19zdGRpbi4gICovCitzdGF0aWMgdm9pZAorcHJvY2Vzc19zdGRp biAoaW50ICpzdGF0dXMpCit7CisgIGNoYXIgZGVsaW07CisgIGlmIChmbGFn X3N0ZGluID09IGRvX3N0ZGluMCkKKyAgICBkZWxpbSA9ICdcMCc7CisgIGVs c2UKKyAgICBkZWxpbSA9ICdcbic7CisKKyAgY2hhciAqYnVmZmVyID0gTlVM TDsKKyAgc2l6ZV90IGJ1ZmZlcl9zaXplID0gMDsKKyAgd2hpbGUgKHRydWUp CisgICAgeworICAgICAgc3NpemVfdCByZXQgPSBnZXRkZWxpbSAoJmJ1ZmZl ciwgJmJ1ZmZlcl9zaXplLCBkZWxpbSwgc3RkaW4pOworICAgICAgaWYgKGZl cnJvciAoc3RkaW4pKQorCXsKKwkgIGN1cnJlbnRfcGF0aCA9IE5VTEw7CisJ ICBpc3N1ZSAoZXJybm8sIE5fKCJyZWFkaW5nIGZyb20gc3RhbmRhcmQgaW5w dXQiKSk7CisJICBicmVhazsKKwl9CisgICAgICBpZiAoZmVvZiAoc3RkaW4p KQorICAgICAgICBicmVhazsKKyAgICAgIGlmIChyZXQgPCAwKQorICAgICAg ICBhYm9ydCAoKTsgICAgICAgICAgIC8qIENhbm5vdCBoYXBwZW4gZHVlIHRv IGVycm9yIGNoZWNrcyBhYm92ZS4gICovCisgICAgICBpZiAoZGVsaW0gIT0g J1wwJyAmJiByZXQgPiAwKQorICAgICAgICBidWZmZXJbcmV0IC0gMV0gPSAn XDAnOworICAgICAgY3VycmVudF9wYXRoID0gYnVmZmVyOworICAgICAgcHJv Y2Vzc19jdXJyZW50X3BhdGggKHN0YXR1cyk7CisgICAgfQorCisgIGZyZWUg KGJ1ZmZlcik7Cit9CisKK2ludAorbWFpbiAoaW50IGFyZ2MsIGNoYXIgKiph cmd2KQoreworICBjb25zdCBzdHJ1Y3QgYXJncF9vcHRpb24gb3B0aW9uc1td ID0KKyAgICB7CisgICAgICB7IE5VTEwsIDAsIE5VTEwsIE9QVElPTl9ET0Ms IE5fKCJDbGFzc2lmaWNhdGlvbiBvcHRpb25zIiksIDEgfSwKKyAgICAgIHsg ImVsZiIsIGNsYXNzaWZ5X2NoZWNrX29mZnNldCArIGNsYXNzaWZ5X2VsZiwg TlVMTCwgMCwKKyAgICAgICAgTl8oIkZpbGUgbG9va3MgbGlrZSBhbiBFTEYg b2JqZWN0IG9yIGFyY2hpdmUvc3RhdGljIGxpYnJhcnkgKGRlZmF1bHQpIikK KwksIDEgfSwKKyAgICAgIHsgImVsZi1maWxlIiwgY2xhc3NpZnlfY2hlY2tf b2Zmc2V0ICsgY2xhc3NpZnlfZWxmX2ZpbGUsIE5VTEwsIDAsCisgICAgICAg IE5fKCJGaWxlIGlzIGFuIHJlZ3VsYXIgRUxGIG9iamVjdCAobm90IGFuIGFy Y2hpdmUvc3RhdGljIGxpYnJhcnkiKQorCSwgMSB9LAorICAgICAgeyAiZWxm LWFyY2hpdmUiLCBjbGFzc2lmeV9jaGVja19vZmZzZXQgKyBjbGFzc2lmeV9l bGZfYXJjaGl2ZSwgTlVMTCwgMCwKKyAgICAgICAgTl8oIkZpbGUgaXMgYW4g RUxGIGFyY2hpdmUgb3Igc3RhdGljIGxpYnJhcnkiKQorCSwgMSB9LAorICAg ICAgeyAiY29yZSIsIGNsYXNzaWZ5X2NoZWNrX29mZnNldCArIGNsYXNzaWZ5 X2NvcmUsIE5VTEwsIDAsCisgICAgICAgIE5fKCJGaWxlIGlzIGFuIEVMRiBj b3JlIGR1bXAgZmlsZSIpCisJLCAxIH0sCisgICAgICB7ICJ1bnN0cmlwcGVk IiwgY2xhc3NpZnlfY2hlY2tfb2Zmc2V0ICsgY2xhc3NpZnlfdW5zdHJpcHBl ZCwgTlVMTCwgMCwKKyAgICAgICAgTl8oIkZpbGUgaXMgYW4gRUxGIGZpbGUg d2l0aCBzeW1ib2wgdGFibGUgb3IgLmRlYnVnXyogc2VjdGlvbnMgXAorYW5k IGNhbiBiZSBzdHJpcHBlZCBmdXJ0aGVyIiksIDEgfSwKKyAgICAgIHsgImV4 ZWN1dGFibGUiLCBjbGFzc2lmeV9jaGVja19vZmZzZXQgKyBjbGFzc2lmeV9l eGVjdXRhYmxlLCBOVUxMLCAwLAorICAgICAgICBOXygiRmlsZSBpcyBhbiBF TEYgcHJvZ3JhbSBleGVjdXRhYmxlIFwKKyhhbmQgbm90IGFsc28gYSBzaGFy ZWQgbGlicmFyeSkiKSwgMSB9LAorICAgICAgeyAicHJvZ3JhbSIsIGNsYXNz aWZ5X2NoZWNrX29mZnNldCArIGNsYXNzaWZ5X3Byb2dyYW0sIE5VTEwsIDAs CisgICAgICAgIE5fKCJGaWxlIGlzIGFuIEVMRiBwcm9ncmFtIGV4ZWN1dGFi bGUgXAorKG1pZ2h0IGFsc28gYmUgYSBzaGFyZWQgbGlicmFyeSkiKSwgMSB9 LAorICAgICAgeyAic2hhcmVkIiwgY2xhc3NpZnlfY2hlY2tfb2Zmc2V0ICsg Y2xhc3NpZnlfc2hhcmVkLCBOVUxMLCAwLAorICAgICAgICBOXygiRmlsZSBp cyBhbiBFTEYgc2hhcmVkIG9iamVjdCAoRFNPKSIpLCAxIH0sCisgICAgICB7 ICJsaW51eC1rZXJuZWwtbW9kdWxlIiwgKGNsYXNzaWZ5X2NoZWNrX29mZnNl dAorCQkJCSsgY2xhc3NpZnlfbGludXhfa2VybmVsX21vZHVsZSksIE5VTEws IDAsCisgICAgICAgIE5fKCJGaWxlIGlzIGEgbGludXgga2VybmVsIG1vZHVs ZSIpLCAxIH0sCisgICAgICB7ICJkZWJ1Zy1vbmx5IiwgKGNsYXNzaWZ5X2No ZWNrX29mZnNldCArIGNsYXNzaWZ5X2RlYnVnX29ubHkpLCBOVUxMLCAwLAor ICAgICAgICBOXygiRmlsZSBpcyBhIGRlYnVnIG9ubHkgRUxGIGZpbGUgXAor KHNlcGFyYXRlIC5kZWJ1ZywgLmR3byBvciBkd3ogbXVsdGktZmlsZSkiKSwg MSB9LAorICAgICAgeyAibG9hZGFibGUiLCBjbGFzc2lmeV9jaGVja19vZmZz ZXQgKyBjbGFzc2lmeV9sb2FkYWJsZSwgTlVMTCwgMCwKKyAgICAgICAgTl8o IkZpbGUgaXMgYSBsb2FkYWJsZSBFTEYgb2JqZWN0IChwcm9ncmFtIG9yIHNo YXJlZCBvYmplY3QpIiksIDEgfSwKKworICAgICAgLyogTmVnYXRlZCB2ZXJz aW9ucyBvZiB0aGUgYWJvdmUuICAqLworICAgICAgeyAibm90LWVsZiIsIGNs YXNzaWZ5X2NoZWNrX25vdF9vZmZzZXQgKyBjbGFzc2lmeV9lbGYsCisgICAg ICAgIE5VTEwsIE9QVElPTl9ISURERU4sIE5VTEwsIDEgfSwKKyAgICAgIHsg Im5vdC1lbGYtZmlsZSIsIGNsYXNzaWZ5X2NoZWNrX25vdF9vZmZzZXQgKyBj bGFzc2lmeV9lbGZfZmlsZSwKKyAgICAgICAgTlVMTCwgT1BUSU9OX0hJRERF TiwgTlVMTCwgMSB9LAorICAgICAgeyAibm90LWVsZi1hcmNoaXZlIiwgY2xh c3NpZnlfY2hlY2tfbm90X29mZnNldCArIGNsYXNzaWZ5X2VsZl9hcmNoaXZl LAorICAgICAgICBOVUxMLCBPUFRJT05fSElEREVOLCBOVUxMLCAxIH0sCisg ICAgICB7ICJub3QtY29yZSIsIGNsYXNzaWZ5X2NoZWNrX25vdF9vZmZzZXQg KyBjbGFzc2lmeV9jb3JlLAorICAgICAgICBOVUxMLCBPUFRJT05fSElEREVO LCBOVUxMLCAxIH0sCisgICAgICB7ICJub3QtdW5zdHJpcHBlZCIsIGNsYXNz aWZ5X2NoZWNrX25vdF9vZmZzZXQgKyBjbGFzc2lmeV91bnN0cmlwcGVkLAor ICAgICAgICBOVUxMLCBPUFRJT05fSElEREVOLCBOVUxMLCAxIH0sCisgICAg ICB7ICJub3QtZXhlY3V0YWJsZSIsIGNsYXNzaWZ5X2NoZWNrX25vdF9vZmZz ZXQgKyBjbGFzc2lmeV9leGVjdXRhYmxlLAorICAgICAgICBOVUxMLCBPUFRJ T05fSElEREVOLCBOVUxMLCAxIH0sCisgICAgICB7ICJub3QtcHJvZ3JhbSIs IGNsYXNzaWZ5X2NoZWNrX25vdF9vZmZzZXQgKyBjbGFzc2lmeV9wcm9ncmFt LAorICAgICAgICBOVUxMLCBPUFRJT05fSElEREVOLCBOVUxMLCAxIH0sCisg ICAgICB7ICJub3Qtc2hhcmVkIiwgY2xhc3NpZnlfY2hlY2tfbm90X29mZnNl dCArIGNsYXNzaWZ5X3NoYXJlZCwKKyAgICAgICAgTlVMTCwgT1BUSU9OX0hJ RERFTiwgTlVMTCwgMSB9LAorICAgICAgeyAibm90LWxpbnV4LWtlcm5lbC1t b2R1bGUiLCAoY2xhc3NpZnlfY2hlY2tfbm90X29mZnNldAorCQkJCSAgICAr IGNsYXNzaWZ5X2xpbnV4X2tlcm5lbF9tb2R1bGUpLAorICAgICAgICBOVUxM LCBPUFRJT05fSElEREVOLCBOVUxMLCAxIH0sCisgICAgICB7ICJub3QtZGVi dWctb25seSIsIChjbGFzc2lmeV9jaGVja19ub3Rfb2Zmc2V0ICsgY2xhc3Np ZnlfZGVidWdfb25seSksCisgICAgICAgIE5VTEwsIE9QVElPTl9ISURERU4s IE5VTEwsIDEgfSwKKyAgICAgIHsgIm5vdC1sb2FkYWJsZSIsIGNsYXNzaWZ5 X2NoZWNrX25vdF9vZmZzZXQgKyBjbGFzc2lmeV9sb2FkYWJsZSwKKyAgICAg ICAgTlVMTCwgT1BUSU9OX0hJRERFTiwgTlVMTCwgMSB9LAorCisgICAgICB7 IE5VTEwsIDAsIE5VTEwsIE9QVElPTl9ET0MsIE5fKCJJbnB1dCBmbGFncyIp LCAyIH0sCisgICAgICB7ICJmaWxlIiwgJ2YnLCBOVUxMLCAwLAorICAgICAg ICBOXygiT25seSBjbGFzc2lmeSByZWd1bGFyIChub3Qgc3ltbGluayBub3Ig c3BlY2lhbCBkZXZpY2UpIGZpbGVzIiksIDIgfSwKKyAgICAgIHsgInN0ZGlu IiwgY2xhc3NpZnlfZmxhZ19zdGRpbiwgTlVMTCwgMCwKKyAgICAgICAgTl8o IkFsc28gcmVhZCBmaWxlIG5hbWVzIHRvIHByb2Nlc3MgZnJvbSBzdGFuZGFy ZCBpbnB1dCwgXAorc2VwYXJhdGVkIGJ5IG5ld2xpbmVzIiksIDIgfSwKKyAg ICAgIHsgInN0ZGluMCIsIGNsYXNzaWZ5X2ZsYWdfc3RkaW4wLCBOVUxMLCAw LAorICAgICAgICBOXygiQWxzbyByZWFkIGZpbGUgbmFtZXMgdG8gcHJvY2Vz cyBmcm9tIHN0YW5kYXJkIGlucHV0LCBcCitzZXBhcmF0ZWQgYnkgQVNDSUkg TlVMIGJ5dGVzIiksIDIgfSwKKyAgICAgIHsgIm5vLXN0ZGluIiwgY2xhc3Np ZnlfZmxhZ19zdGRpbiwgTlVMTCwgMCwKKyAgICAgICAgTl8oIkRvIG5vdCBy ZWFkIGZpbGVzIGZyb20gc3RhbmRhcmQgaW5wdXQgKGRlZmF1bHQpIiksIDIg fSwKKyAgICAgIHsgImNvbXByZXNzZWQiLCAneicsIE5VTEwsIDAsCisJTl8o IlRyeSB0byBvcGVuIGNvbXByZXNzZWQgZmlsZXMgb3IgZW1iZWRkZWQgKGtl cm5lbCkgRUxGIGltYWdlcyIpLAorCTIgfSwKKworICAgICAgeyBOVUxMLCAw LCBOVUxMLCBPUFRJT05fRE9DLCBOXygiT3V0cHV0IGZsYWdzIiksIDMgfSwK KyAgICAgIHsgInByaW50IiwgY2xhc3NpZnlfZmxhZ19wcmludCwgTlVMTCwg MCwKKyAgICAgICAgTl8oIk91dHB1dCBuYW1lcyBvZiBmaWxlcywgc2VwYXJh dGVkIGJ5IG5ld2xpbmUiKSwgMyB9LAorICAgICAgeyAicHJpbnQwIiwgY2xh c3NpZnlfZmxhZ19wcmludDAsIE5VTEwsIDAsCisgICAgICAgIE5fKCJPdXRw dXQgbmFtZXMgb2YgZmlsZXMsIHNlcGFyYXRlZCBieSBBU0NJSSBOVUwiKSwg MyB9LAorICAgICAgeyAibm8tcHJpbnQiLCBjbGFzc2lmeV9mbGFnX25vX3By aW50LCBOVUxMLCAwLAorICAgICAgICBOXygiRG8gbm90IG91dHB1dCBmaWxl IG5hbWVzIiksIDMgfSwKKyAgICAgIHsgIm1hdGNoaW5nIiwgY2xhc3NpZnlf ZmxhZ19tYXRjaGluZywgTlVMTCwgMCwKKyAgICAgICAgTl8oIklmIHByaW50 aW5nIGZpbGUgbmFtZXMsIHByaW50IG1hdGNoaW5nIGZpbGVzIChkZWZhdWx0 KSIpLCAzIH0sCisgICAgICB7ICJub3QtbWF0Y2hpbmciLCBjbGFzc2lmeV9m bGFnX25vdF9tYXRjaGluZywgTlVMTCwgMCwKKyAgICAgICAgTl8oIklmIHBy aW50aW5nIGZpbGUgbmFtZXMsIHByaW50IGZpbGVzIHRoYXQgZG8gbm90IG1h dGNoIiksIDMgfSwKKworICAgICAgeyBOVUxMLCAwLCBOVUxMLCBPUFRJT05f RE9DLCBOXygiQWRkaXRpb25hbCBmbGFncyIpLCA0IH0sCisgICAgICB7ICJ2 ZXJib3NlIiwgJ3YnLCBOVUxMLCAwLAorICAgICAgICBOXygiT3V0cHV0IGFk ZGl0aW9uYWwgaW5mb3JtYXRpb24gKGNhbiBiZSBzcGVjaWZpZWQgbXVsdGlw bGUgdGltZXMpIiksIDQgfSwKKyAgICAgIHsgInF1aWV0IiwgJ3EnLCBOVUxM LCAwLAorICAgICAgICBOXygiU3VwcHJlc3Mgc29tZSBlcnJvciBvdXRwdXQg KGNvdW50ZXJwYXJ0IHRvIC0tdmVyYm9zZSkiKSwgNCB9LAorICAgICAgeyBO VUxMLCAwLCBOVUxMLCAwLCBOVUxMLCAwIH0KKyAgICB9OworCisgIGNvbnN0 IHN0cnVjdCBhcmdwIGFyZ3AgPQorICAgIHsKKyAgICAgIC5vcHRpb25zID0g b3B0aW9ucywKKyAgICAgIC5wYXJzZXIgPSBwYXJzZV9vcHQsCisgICAgICAu YXJnc19kb2MgPSBOXygiRklMRS4uLiIpLAorICAgICAgLmRvYyA9IE5fKCJc CitEZXRlcm1pbmUgdGhlIHR5cGUgb2YgYW4gRUxGIGZpbGUuXAorXG5cblwK K0FsbCBvZiB0aGUgY2xhc3NpZmljYXRpb24gb3B0aW9ucyBtdXN0IGFwcGx5 IGF0IHRoZSBzYW1lIHRpbWUgdG8gYSBcCitwYXJ0aWN1bGFyIGZpbGUuICBD bGFzc2lmaWNhdGlvbiBvcHRpb25zIGNhbiBiZSBuZWdhdGVkIHVzaW5nIGEg XAorXCItLW5vdC1cIiBwcmVmaXguXAorXG5cblwKK1NpbmNlIG1vZGVybiBF TEYgZG9lcyBub3QgY2xlYXJseSBkaXN0aW5ndWlzaCBiZXR3ZWVuIHByb2dy YW1zIGFuZCBcCitkeW5hbWljIHNoYXJlZCBvYmplY3RzLCB5b3Ugc2hvdWxk IG5vcm1hbGx5IHVzZSBlaXRoZXIgLS1leGVjdXRhYmxlIG9yIFwKKy0tc2hh cmVkIHRvIGlkZW50aWZ5IHRoZSBwcmltYXJ5IHB1cnBvc2Ugb2YgYSBmaWxl LiAgXAorT25seSBvbmUgb2YgdGhlIC0tc2hhcmVkIGFuZCAtLWV4ZWN1dGFi bGUgY2hlY2tzIGNhbiBwYXNzIGZvciBhIGZpbGUuICBcCitJZiB5b3Ugd2Fu dCB0byBrbm93IHdoZXRoZXIgYW4gRUxGIG9iamVjdCBtaWdodCBiZSBib3Ro IGEgcHJvZ3JhbSBhbmQgYSBcCitzaGFyZWQgbGlicmFyeSBhdCB0aGUgc2Ft ZSB0aW1lIHVzZSAtLXByb2dyYW0gLS1zaGFyZWQuICBcCistLWV4ZWN1dGFi bGUgaXMgZWZmZWN0aXZlbHkgdGhlIHNhbWUgYXMgLS1wcm9ncmFtIC0tbm90 LXNoYXJlZC5cCitcblxuXAorV2l0aG91dCBhbnkgb2YgdGhlIC0tcHJpbnQg b3B0aW9ucywgdGhlIHByb2dyYW0gZXhpdHMgd2l0aCBzdGF0dXMgMCBcCitp ZiB0aGUgcmVxdWVzdGVkIGNoZWNrcyBwYXNzIGZvciBhbGwgaW5wdXQgZmls ZXMsIHdpdGggMSBpZiBhIGNoZWNrIFwKK2ZhaWxzIGZvciBhbnkgZmlsZSwg YW5kIDIgaWYgdGhlcmUgaXMgYW4gZW52aXJvbm1lbnRhbCBpc3N1ZSAoc3Vj aCBcCithcyBhIGZpbGUgcmVhZCBlcnJvciBvciBhIG1lbW9yeSBhbGxvY2F0 aW9uIGVycm9yKS5cCitcblxuXAorV2hlbiBwcmludGluZyBmaWxlIG5hbWVz LCB0aGUgcHJvZ3JhbSBleGl0cyB3aXRoIHN0YXR1cyAwIGV2ZW4gaWYgXAor bm8gZmlsZSBuYW1lcyBhcmUgcHJpbnRlZCwgYW5kIGV4aXRzIHdpdGggc3Rh dHVzIDIgaWYgdGhlcmUgaXMgYW4gXAorZW52aXJvbm1lbnRhbCBpc3N1ZS5c CitcblxuXAorT24gdXNhZ2UgZXJyb3IgKGUuZy4gYSBiYWQgb3B0aW9uIHdh cyBnaXZlbiksIHRoZSBwcm9ncmFtIGV4aXRzIHdpdGggXAorYSBzdGF0dXMg Y29kZSBvZiA2NC5cCitcblxuXAorVGhlIC0tcXVpZXQgb3IgLXEgb3B0aW9u IHN1cHByZXNzZXMgc29tZSBlcnJvciB3YXJuaW5nIG91dHB1dCwgYnV0IFwK K2RvZXNuJ3QgY2hhbmdlIHRoZSBleGl0IHN0YXR1cy5cCisiKQorICAgIH07 CisKKyAgLyogUmVxdWlyZSB0aGF0IHRoZSBmaWxlIGlzIGFuIEVMRiBmaWxl IGJ5IGRlZmF1bHQuICBVc2VyIGNhbgorICAgICBkaXNhYmxlIHdpdGggLS1u b3QtZWxmLiAgKi8KKyAgcmVxdWlyZW1lbnRzW2NsYXNzaWZ5X2VsZl0gPSBy ZXF1aXJlZDsKKworICBpbnQgcmVtYWluaW5nOworICBpZiAoYXJncF9wYXJz ZSAoJmFyZ3AsIGFyZ2MsIGFyZ3YsIDAsICZyZW1haW5pbmcsIE5VTEwpICE9 IDApCisgICAgcmV0dXJuIDI7CisKKyAgZWxmX3ZlcnNpb24gKEVWX0NVUlJF TlQpOworCisgIGludCBzdGF0dXMgPSAwOworCisgIGZvciAoaW50IGkgPSBy ZW1haW5pbmc7IGkgPCBhcmdjOyArK2kpCisgICAgeworICAgICAgY3VycmVu dF9wYXRoID0gYXJndltpXTsKKyAgICAgIHByb2Nlc3NfY3VycmVudF9wYXRo ICgmc3RhdHVzKTsKKyAgICB9CisKKyAgaWYgKGZsYWdfc3RkaW4gIT0gbm9f c3RkaW4pCisgICAgcHJvY2Vzc19zdGRpbiAoJnN0YXR1cyk7CisKKyAgaWYg KGlzc3VlX2ZvdW5kKQorICAgIHJldHVybiAyOworCisgIHJldHVybiBzdGF0 dXM7Cit9Cg== --=-b4y68IWdRwDmNt8amqKr--