From owner-freebsd-arch@FreeBSD.ORG Fri Aug 22 10:09:35 2008 Return-Path: Delivered-To: freebsd-arch@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 2E9F91065672; Fri, 22 Aug 2008 10:09:35 +0000 (UTC) (envelope-from bu7cher@yandex.ru) Received: from smtp13.yandex.ru (smtp13.yandex.ru [77.88.32.83]) by mx1.freebsd.org (Postfix) with ESMTP id 304938FC17; Fri, 22 Aug 2008 10:09:31 +0000 (UTC) (envelope-from bu7cher@yandex.ru) Received: from mail.kirov.so-cdu.ru ([77.72.136.145]:55528 "EHLO [127.0.0.1]" smtp-auth: "bu7cher" TLS-CIPHER: "DHE-RSA-AES256-SHA keybits 256/256 version TLSv1/SSLv3" TLS-PEER-CN1: ) by mail.yandex.ru with ESMTP id S1820100AbYHVJlw (ORCPT + 1 other); Fri, 22 Aug 2008 13:41:52 +0400 X-Yandex-Spam: 1 X-Yandex-Front: smtp13 X-Yandex-TimeMark: 1219398112 X-MsgDayCount: 4 X-Comment: RFC 2476 MSA function at smtp13.yandex.ru logged sender identity as: bu7cher Message-ID: <48AE89DC.9080408@yandex.ru> Date: Fri, 22 Aug 2008 13:41:48 +0400 From: "Andrey V. Elsukov" User-Agent: Mozilla Thunderbird 1.5 (FreeBSD/20051231) MIME-Version: 1.0 To: Luigi Rizzo References: <20080822090448.GB57441@onelab2.iet.unipi.it> In-Reply-To: <20080822090448.GB57441@onelab2.iet.unipi.it> Content-Type: multipart/mixed; boundary="------------010404020304060805040407" Cc: David Quattlebaum , Ivan Voras , freebsd-arch@freebsd.org Subject: Re: Magic symlinks redux X-BeenThere: freebsd-arch@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: Discussion related to FreeBSD architecture List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 22 Aug 2008 10:09:35 -0000 This is a multi-part message in MIME format. --------------010404020304060805040407 Content-Type: text/plain; charset=KOI8-R; format=flowed Content-Transfer-Encoding: 7bit Luigi Rizzo wrote: > interestingly simple. > > Question - is the process' ENV easily available in this part > of the kernel, so one could in principle use environment variables > as replacement strings ? > > Some comments on the code in the above patch: > > + readability it might be improved a bit: > e.g. I don't see why uma_{zalloc|zfree} are hidden behind macros, > nor why symlynk_magic() isn't simply called as > > if (vfs_magiclinks) > symlink_magic(td, cp, &linklen); > > as it cannot fail as implemented; > also, the whole MATCH/SUBSTITUTE macros are not particularly > readable -- i understand one needs macros to implement sizeof("somestring") > correctly, but apart from a wrapper I believe the core of these two > blocks should be implemented by functions (possibly inline) with > MATCH() returning the match length so one doesn't need to replicate > the string parameter in SUBSTITUTE(); > > + correctness -- > 1. termchar is not reset to '/' if a match is not found > 2. what is the intended behaviour when the replacement string overflows > the buffer ? > > + efficiency of symlink_magic() might be improved too: > e.g. the function could do a quick check for the presence of @ and return > without allocation/deallocation if not found; > getcredhostname() (and similar routines) could be called so that > they write directly to tmp, without the need for > allocating an in-stack buffer This was so long ago.. As i remember this patch is a quick port of NetBSD's implementation and uses the same code. Also there was another implementation ported from DragonFlyBSD. David Quattlebaum is working on varsyms implementation and he sent fresh patch to me in this April. I attached patch. And sorry, i am not working on this today.. -- WBR, Andrey V. Elsukov --------------010404020304060805040407 Content-Type: application/octet-stream; name="varsym.patch" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="varsym.patch" ZGlmZiAtVTMgLU4gc3JjL3N5cy9rZXJuL2tlcm5fdmFyc3ltLmMgc3JjL3N5cy9rZXJuL2tl cm5fdmFyc3ltLmMKLS0tIHNyYy9zeXMva2Vybi9rZXJuX3ZhcnN5bS5jCVdlZCBEZWMgMzEg MTk6MDA6MDAgMTk2OQorKysgc3JjL3N5cy9rZXJuL2tlcm5fdmFyc3ltLmMJVGh1IEZlYiAx NiAwOTozMTowOCAyMDA2CkBAIC0wLDAgKzEsNTYyIEBACisvKgorICogQ29weXJpZ2h0IChj KSAyMDAzLDIwMDQgVGhlIERyYWdvbkZseSBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZl ZC4KKyAqIAorICogVGhpcyBjb2RlIGlzIGRlcml2ZWQgZnJvbSBzb2Z0d2FyZSBjb250cmli dXRlZCB0byBUaGUgRHJhZ29uRmx5IFByb2plY3QKKyAqIGJ5IE1hdHRoZXcgRGlsbG9uIDxk aWxsb25AYmFja3BsYW5lLmNvbT4KKyAqIAorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBp biBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmlj YXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRp dGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3Vy Y2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2Us IHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIu CisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2Ug dGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0 aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1l bnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAg ICBkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIFRoZSBEcmFnb25G bHkgUHJvamVjdCBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgY29udHJpYnV0b3JzIG1h eSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAg ICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYywgcHJpb3Igd3JpdHRlbiBw ZXJtaXNzaW9uLgorICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBD T1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiBgYEFTIElTJycgQU5EIEFO WSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisg KiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElU WSBBTkQgRklUTkVTUworICogRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJ TUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBDT1BZUklHSFQgSE9MREVSUyBPUiBD T05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqIElO Q0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMg KElOQ0xVRElORywKKyAqIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VC U1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQ Uk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VECisgKiBB TkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNU UklDVCBMSUFCSUxJVFksCisgKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBP VEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKKyAqIE9GIFRIRSBVU0UgT0YgVEhJ UyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICog U1VDSCBEQU1BR0UuCisgKiAKKyAqICRGcmVlQlNEJAorICogJERyYWdvbkZseTogc3JjL3N5 cy9rZXJuL2tlcm5fdmFyc3ltLmMsdiAxLjYgMjAwNS8wMS8xNCAwMjoyNTowOCBqb2VyZyBF eHAgJAorICovCisKKy8qCisgKiBUaGlzIG1vZHVsZSBpbXBsZW1lbnRzIHZhcmlhYmxlIHN0 b3JhZ2UgYW5kIG1hbmFnZW1lbnQgZm9yIHZhcmlhbnQKKyAqIHN5bWxpbmtzLiAgVGhlc2Ug dmFyaWFibGVzIG1heSBhbHNvIGJlIHVzZWQgZm9yIGdlbmVyYWwgcHVycG9zZXMuCisgKi8K KworI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgorI2luY2x1ZGUgPHN5cy9zeXN0bS5oPgorI2lu Y2x1ZGUgPHN5cy9rZXJuZWwuaD4KKyNpbmNsdWRlIDxzeXMvdWNyZWQuaD4KKyNpbmNsdWRl IDxzeXMvcmVzb3VyY2V2YXIuaD4KKyNpbmNsdWRlIDxzeXMvcHJpdi5oPgorI2luY2x1ZGUg PHN5cy9wcm9jLmg+CisjaW5jbHVkZSA8c3lzL2phaWwuaD4KKyNpbmNsdWRlIDxzeXMvcXVl dWUuaD4KKyNpbmNsdWRlIDxzeXMvc3lzY3RsLmg+CisjaW5jbHVkZSA8c3lzL21hbGxvYy5o PgorI2luY2x1ZGUgPHN5cy92YXJzeW0uaD4KKyNpbmNsdWRlIDxzeXMvc3lzcHJvdG8uaD4K KworTUFMTE9DX0RFRklORShNX1ZBUlNZTSwgInZhcnN5bSIsICJ2YXJpYWJsZSBzZXRzIGZv ciB2YXJpYW50IHN5bWxpbmtzIik7CisKK3N0cnVjdCB2YXJzeW1zZXQJdmFyc3ltc2V0X3N5 czsKKworc3RhdGljIGludAkJdmFyc3ltbWFrZShpbnQgbGV2ZWwsIGNvbnN0IGNoYXIgKm5h bWUsIGNvbnN0IGNoYXIgKmRhdGEpOworc3RhdGljIHZvaWQJCXZhcnN5bWRyb3AodmFyc3lt X3QgdmFyKTsKK3N0YXRpYyBzdHJ1Y3QgdmFyc3ltZW50ICoKKwkJCXZhcnN5bWxvb2t1cChz dHJ1Y3QgdmFyc3ltc2V0ICp2c3MsIGNvbnN0IGNoYXIgKm5hbWUsIGludCBuYW1lbGVuKTsK K3N0YXRpYyB2YXJzeW1fdAkJdmFyc3ltZmluZChpbnQgbWFzaywgY29uc3QgY2hhciAqbmFt ZSwgaW50IG5hbWVsZW4pOworCitpbnQgdmFyc3ltX2NvbDFvbmx5ID0gMDsKK1NZU0NUTF9J TlQoX3ZmcywgT0lEX0FVVE8sIHZhcnN5bV9jb2wxb25seSwgQ1RMRkxBR19SVywgJnZhcnN5 bV9jb2wxb25seSwgMCwKKyAgICAiVmFyc3ltIHZhcmlhYmxlcyBzdGFydCBpbiBjb2x1bW4g MSBvbmx5Iik7CisKKy8qCisgKiBJbml0aWFsaXplIHRoZSB2YXJpYW50IHN5bWxpbmsgc3Vi c3lzdGVtCisgKi8KK3N0YXRpYyB2b2lkCit2YXJzeW1fc3lzaW5pdCh2b2lkICpkdW1teSkK K3sKKyAgICB2YXJzeW1zZXRfaW5pdCgmdmFyc3ltc2V0X3N5cywgTlVMTCk7Cit9CitTWVNJ TklUKGFubm91bmNlLCBTSV9TVUJfSU5UUklOU0lDLCBTSV9PUkRFUl9GSVJTVCwgdmFyc3lt X3N5c2luaXQsIE5VTEwpOworCisvKgorICogSW5pdGlhbGl6ZSB0aGUgdmFyc3ltc2V0IGZv ciBwcm9jMAorICovCitzdGF0aWMgdm9pZAordmFyc3ltX3AwaW5pdCh2b2lkICpkdW1teSkK K3sKKwl2YXJzeW1zZXRfaW5pdCgmcHJvYzAucF92YXJzeW1zZXQsIE5VTEwpOworfQorU1lT SU5JVChwMGluaXQsIFNJX1NVQl9JTlRSSU5TSUMsIFNJX09SREVSX1NFQ09ORCwgdmFyc3lt X3AwaW5pdCwgTlVMTCk7CisKKy8qCisgKiB2YXJzeW1yZXBsYWNlKCkgLSBjYWxsZWQgZnJv bSBuYW1laQorICoKKyAqCURvIHZhcmlhbnQgc3ltbGluayB2YXJpYWJsZSBzdWJzdGl0dXRp b24KKyAqLworaW50Cit2YXJzeW1yZXBsYWNlKGNoYXIgKmNwLCBpbnQgbGlua2xlbiwgaW50 IG1heGxlbikKK3sKKyAgICBpbnQgcmxlbjsKKyAgICBpbnQgeGxlbjsKKyAgICBpbnQgbmxl bjsKKyAgICBpbnQgaTsKKyAgICB2YXJzeW1fdCB2YXI7CisKKyAgICBybGVuID0gbGlua2xl bjsKKyAgICB3aGlsZSAobGlua2xlbiA+IDEpIHsKKwlpZiAoY3BbMF0gPT0gJyQnICYmIGNw WzFdID09ICd7JykgeworCQlmb3IgKGkgPSAyOyBpIDwgbGlua2xlbjsgKytpKSB7CisJCQlp ZiAoY3BbaV0gPT0gJ30nKQorCQkgICAgCWJyZWFrOworCQl9CisJCS8qCisJCSAqIEluIGph aWwgd2Ugc2hvdWxkIHJlc2V0IFZBUlNZTV9VU0VSX01BU0ssIHdlIGNoZWNrIGl0CisJCSAq IGludG8gdmFyc3ltZmluZC4KKwkJICovCisJICAgIGlmIChpIDwgbGlua2xlbiAmJiAoCisJ CQl2YXIgPSB2YXJzeW1maW5kKFZBUlNZTV9BTExfTUFTSywgY3AgKyAyLCBpIC0gMikpICE9 IE5VTEwpIAorCQl7CisJCQl4bGVuID0gaSArIDE7CQkJLyogYnl0ZXMgdG8gc3RyaWtlICov CisJCQlubGVuID0gc3RybGVuKHZhci0+dnNfZGF0YSk7CS8qIGJ5dGVzIHRvIGFkZCAqLwor CQkJaWYgKGxpbmtsZW4gKyBubGVuIC0geGxlbiA+PSBtYXhsZW4pIAorCQkJeworCQkgICAg CXZhcnN5bWRyb3AodmFyKTsKKwkJICAgIAlyZXR1cm4oLTEpOworCQkJfQorCQkJS0FTU0VS VChsaW5rbGVuID49IHhsZW4sICgiJXM6IGxpbmtsZW4gPCB4bGVuIixfX2Z1bmNfXykpOwor CQkJaWYgKGxpbmtsZW4gIT0geGxlbikKKwkJCQliY29weShjcCArIHhsZW4sIGNwICsgbmxl biwgbGlua2xlbiAtIHhsZW4pOworCQkJYmNvcHkodmFyLT52c19kYXRhLCBjcCwgbmxlbik7 CisJCQlsaW5rbGVuICs9IG5sZW4gLSB4bGVuOwkvKiBuZXcgcmVsYXRpdmUgbGVuZ3RoICov CisJCQlybGVuICs9IG5sZW4gLSB4bGVuOwkvKiByZXR1cm5lZCB0b3RhbCBsZW5ndGggKi8K KwkJCWNwICs9IG5sZW47CQkvKiBhZGp1c3QgcGFzdCByZXBsYWNlbWVudCAqLworCQkJbGlu a2xlbiAtPSBubGVuOwkvKiBhZGp1c3QgcGFzdCByZXBsYWNlbWVudCAqLworCQkJbWF4bGVu IC09IG5sZW47CQkvKiBhZGp1c3QgcGFzdCByZXBsYWNlbWVudCAqLworCSAgICB9IGVsc2Ug eworCQkJLyoKKwkJCSAqIEl0J3Mgb2sgaWYgaSBwb2ludHMgdG8gdGhlICd9JywgaXQgd2ls bCBzaW1wbHkgYmUKKwkJCSAqIHNraXBwZWQuICBpIGNvdWxkIGFsc28gaGF2ZSBoaXQgbGlu a2xlbi4KKwkJCSAqLworCQkJY3AgKz0gaTsKKwkJCWxpbmtsZW4gLT0gaTsKKwkJCW1heGxl biAtPSBpOworCSAgICB9CisJfSBlbHNlIHsKKwkgICAgLyoKKwkgICAgICogQnJlYWsgaWYg d2UgZGlkbid0IGhpdCBhICQgaW4gY29sLiAxIGlmIHZhcnN5bV9jb2wxb25seSAhPSAwCisJ ICAgICAqLworCSAgICBpZiAodmFyc3ltX2NvbDFvbmx5ICE9IDApCisJCWJyZWFrOworCSAg ICArK2NwOworCSAgICAtLWxpbmtsZW47CisJICAgIC0tbWF4bGVuOworCX0KKyAgICB9Cisg ICAgcmV0dXJuKHJsZW4pOworfQorCisvKgorICogdmFyc3ltX3NldCgpIHN5c3RlbSBjYWxs CisgKgorICogKGludCBsZXZlbCwgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqZGF0 YSkKKyAqLworaW50Cit2YXJzeW1fc2V0KHN0cnVjdCB0aHJlYWQgKnRkLCBzdHJ1Y3QgdmFy c3ltX3NldF9hcmdzICp1YXApCit7CisgICAgY2hhciBuYW1lW01BWFZBUlNZTV9OQU1FXTsK KyAgICBjaGFyICpidWY7CisgICAgaW50IGVycm9yOworCisgICAgaWYgKChlcnJvciA9IGNv cHlpbnN0cih1YXAtPm5hbWUsIG5hbWUsIHNpemVvZihuYW1lKSwgTlVMTCkpICE9IDApCisJ CWdvdG8gZG9uZTI7CisgICAgCisJYnVmID0gbWFsbG9jKE1BWFZBUlNZTV9EQVRBLCBNX1RF TVAsIE1fV0FJVE9LKTsKKyAgICBpZiAodWFwLT5kYXRhICYmIAorCShlcnJvciA9IGNvcHlp bnN0cih1YXAtPmRhdGEsIGJ1ZiwgTUFYVkFSU1lNX0RBVEEsIE5VTEwpKSAhPSAwKQorICAg IHsKKwkJZ290byBkb25lMTsKKyAgICB9CisgICAgCisJc3dpdGNoKHVhcC0+bGV2ZWwpIHsK KwljYXNlIFZBUlNZTV9TWVM6CisJCWlmICh0ZC0+dGRfcHJvYyAhPSBOVUxMKSAKKwkJewor CQkJLyogCisJCSAJICogT25seSByb290IGNhbiBjaGFuZ2UgU1lTVEVNJ3MgdmFyc3ltcy4g CisJCQkgKiBQcmlzb24ncyByb290IGNhbiBjaGFuZ2Ugb25seSBTWVNURU0ncyB2YXJzeW1z CisJCQkgKiBmb3Igb3duIHByaXNvbi4KKwkJCSAqLworCQkJZXJyb3IgPSBwcml2X2NoZWNr X2NyZWQodGQtPnRkX3Byb2MtPnBfdWNyZWQsIFBSSVZfQ1JFRF9TRVRVSUQsIDApOworCQkJ aWYgKGVycm9yICE9IDApCisJCQkJYnJlYWs7IC8qIGVycm9yID0gRVBFUk0gKi8KKwkJCWlm IChqYWlsZWQodGQtPnRkX3Byb2MtPnBfdWNyZWQpKQorCQkJCXVhcC0+bGV2ZWwgPSBWQVJT WU1fUFJJU09OOworCQl9IAorCQkvKiBmYWxsIHRocm91Z2ggKi8KKwljYXNlIFZBUlNZTV9V U0VSOgorCQkvKiBYWFggaW1wbGVtZW50IHBlci1qYWlsIHVzZXIgKi8KKwkJaWYgKHRkLT50 ZF9wcm9jICE9IE5VTEwgJiYgCisJCQl1YXAtPmxldmVsID09IFZBUlNZTV9VU0VSICYmCisJ CQlqYWlsZWQodGQtPnRkX3Byb2MtPnBfdWNyZWQpKSAKKwkJeworCQkJLyogCisJCQkgKiBE ZW55IGNoYW5nZSB1c2VycyB2YXJzeW1zIGZvciBqYWlsZWQgcHJvY2VzZXMuIAorCQkJICog KHdlIGRvbid0IGhhdmUgYSBwZXItamFpbGVkdXNlciB1aWRpbmZvKQorCQkJICovCisJCQll cnJvciA9IEVQRVJNOworCQkJYnJlYWs7CisJCX0KKwkJLyogZmFsbCB0aHJvdWdoICovCisJ Y2FzZSBWQVJTWU1fUFBST0M6CisJY2FzZSBWQVJTWU1fUFJPQzoKKwkJZXJyb3IgPSB2YXJz eW1tYWtlKHVhcC0+bGV2ZWwsIG5hbWUsIE5VTEwpOworCQlpZiAodWFwLT5kYXRhKSAKKwkJ CWVycm9yID0gdmFyc3ltbWFrZSh1YXAtPmxldmVsLCBuYW1lLCBidWYpOworCQlicmVhazsK KwlkZWZhdWx0OgorCQllcnJvciA9IEVJTlZBTDsKKyAgICB9Citkb25lMToKKwlmcmVlKGJ1 ZiwgTV9URU1QKTsKK2RvbmUyOgorICAgIHJldHVybihlcnJvcik7Cit9CisKKy8qCisgKiB2 YXJzeW1fZ2V0KCkgc3lzdGVtIGNhbGwKKyAqCisgKiAoaW50IG1hc2ssIGNvbnN0IGNoYXIg KndpbGQsIGNoYXIgKmJ1ZiwgaW50ICpzaXplKQorICovCitpbnQKK3ZhcnN5bV9nZXQoc3Ry dWN0IHRocmVhZCAqdGQsIHN0cnVjdCB2YXJzeW1fZ2V0X2FyZ3MgKnVhcCkKK3sKKyAgICBj aGFyIHdpbGRbTUFYVkFSU1lNX05BTUVdOworICAgIHZhcnN5bV90IHN5bTsKKyAgICBpbnQg ZXJyb3I7CisgICAgaW50IGRsZW4sIGJ1ZnNpemU7CisKKyAgICBpZiAoKGVycm9yID0gY29w eWluc3RyKHVhcC0+d2lsZCwgd2lsZCwgc2l6ZW9mKHdpbGQpLCBOVUxMKSkgIT0gMCkKKwkJ Z290byBkb25lOworICAgIGlmICgoZXJyb3IgPSBjb3B5aW4odWFwLT5zaXplLCAmYnVmc2l6 ZSwgc2l6ZW9mKGJ1ZnNpemUpKSkgIT0gMCkKKwkJZ290byBkb25lOworCWlmICh1YXAtPm1h c2sgJiAoflZBUlNZTV9BTExfTUFTSykpIHsKKwkJZXJyb3IgPSBFSU5WQUw7CisJCWdvdG8g ZG9uZTsKKwl9CisgICAgc3ltID0gdmFyc3ltZmluZCh1YXAtPm1hc2ssIHdpbGQsIHN0cmxl bih3aWxkKSk7CisgICAgaWYgKHN5bSA9PSBOVUxMKSB7CisJCWVycm9yID0gRU5PRU5UOwor CQlnb3RvIGRvbmU7CisgICAgfQorICAgIGRsZW4gPSBzdHJsZW4oc3ltLT52c19kYXRhKTsK KyAgICBpZiAoZGxlbiA8IGJ1ZnNpemUpIHsKKwkJZXJyb3IgPSBjb3B5b3V0KHN5bS0+dnNf ZGF0YSwgdWFwLT5idWYsIGRsZW4gKyAxKTsKKyAgICB9IGVsc2UgCisJCWVycm9yID0gRU9W RVJGTE9XOyAvKiBidWZmZXIgdG9vIHNtYWxsICovCisJaWYgKGVycm9yID09IDApIHsKKwkg ICAgZGxlbisrOworCQllcnJvciA9IGNvcHlvdXQoJmRsZW4sIHVhcC0+c2l6ZSwgc2l6ZW9m KGRsZW4pKTsKKwl9CisgICAgdmFyc3ltZHJvcChzeW0pOworZG9uZToKKyAgICByZXR1cm4o ZXJyb3IpOworfQorCisvKgorICogdmFyc3ltX2xpc3QoKSBzeXN0ZW0gY2FsbAorICoKKyAq IChpbnQgbGV2ZWwsIGNoYXIgKmJ1ZiwgaW50ICpzaXplLCBpbnQgKm1hcmtlcikKKyAqLwor aW50Cit2YXJzeW1fbGlzdChzdHJ1Y3QgdGhyZWFkICp0ZCwgc3RydWN0IHZhcnN5bV9saXN0 X2FyZ3MgKnVhcCkKK3sKKwlzdHJ1Y3QgdmFyc3ltc2V0ICp2c3M7CisJc3RydWN0IHZhcnN5 bWVudCAqdmU7CisJc3RydWN0IHByb2MgKnA7CisJaW50IGk7CisJaW50IGVycm9yOworCWlu dCBieXRlczsKKwlpbnQgZWFybHl0ZXJtOworCWludCBtYXJrZXI7CisJaW50IG1heHNpemU7 CisKKwkvKgorCSAqIEdldCB0aGUgbWFya2VyIGFuZCBtYXhzaXplIGZyb20gdXNlcnNwYWNl LgorCSAqLworCWlmICgoZXJyb3IgPSBjb3B5aW4odWFwLT5tYXJrZXIsICZtYXJrZXIsIHNp emVvZihtYXJrZXIpKSkgIT0gMCkKKwkJZ290byBkb25lOworCWlmICgoZXJyb3IgPSBjb3B5 aW4odWFwLT5zaXplLCAmbWF4c2l6ZSwgc2l6ZW9mKG1heHNpemUpKSkgIT0gMCkKKwkJZ290 byBkb25lOworCQorCS8qCisJICogRmlndXJlIG91dCB0aGUgdmFyc3ltIHNldC4KKwkgKi8K KwlwID0gdGQtPnRkX3Byb2M7CisJdnNzID0gTlVMTDsKKworCXN3aXRjaCAodWFwLT5sZXZl bCkgeworCWNhc2UgVkFSU1lNX1BQUk9DOgorCQlpZiAocCAmJiBwLT5wX3BwdHIpCisJCQl2 c3MgPSAmcC0+cF9wcHRyLT5wX3ZhcnN5bXNldDsKKwkJYnJlYWs7CisJY2FzZSBWQVJTWU1f UFJPQzoKKwkJaWYgKHApCisJCQl2c3MgPSAmcC0+cF92YXJzeW1zZXQ7CisJCWJyZWFrOwor CWNhc2UgVkFSU1lNX1VTRVI6CisJCWlmIChwKSB7CisJCQkvKgorCQkJICogWFhYOiBKYWls ZWQgdXNlcnMgY3VycmVudGx5IG5vdCBzdXBwb3J0ZWQuCisJCQkgKi8KKwkJCWlmIChqYWls ZWQocC0+cF91Y3JlZCkpIHsKKwkJCQllcnJvciA9IEVQRVJNOworCQkJCWdvdG8gZG9uZTsK KwkJCX0KKwkJCXZzcyA9ICZwLT5wX3VjcmVkLT5jcl91aWRpbmZvLT51aV92YXJzeW1zZXQ7 CisJCX0KKwkJYnJlYWs7CisJY2FzZSBWQVJTWU1fU1lTOgorCQlpZiAocCAhPSBOVUxMICYm IGphaWxlZChwLT5wX3VjcmVkKSkKKwkJCXZzcyA9ICZwLT5wX3VjcmVkLT5jcl9wcmlzb24t PnByX3ZhcnN5bXNldDsKKwkJZWxzZQorCQkJdnNzID0gJnZhcnN5bXNldF9zeXM7CisJfQor CWlmICh2c3MgPT0gTlVMTCkgeworCQllcnJvciA9IEVJTlZBTDsKKwkJZ290byBkb25lOwor CX0KKworCS8qCisJICogTG9vcCB0aHJvdWdoIHRoZSB2YXJpYWJsZXMgYW5kIGR1bXAgdGhl bSB0byB1YXAtPmJ1ZgorCSAqLworCWkgPSAwOworCWJ5dGVzID0gMDsKKwllYXJseXRlcm0g PSAwOworCisJVEFJTFFfRk9SRUFDSCh2ZSwgJnZzcy0+dnhfcXVldWUsIHZlX2VudHJ5KSB7 CisJCXZhcnN5bV90IHN5bSA9IHZlLT52ZV9zeW07CisJCWludCBuYW1lbGVuID0gc3RybGVu KHN5bS0+dnNfbmFtZSk7CisJCWludCBkYXRhbGVuID0gc3RybGVuKHN5bS0+dnNfZGF0YSk7 CisJCWludCB0b3RsZW4gPSBuYW1lbGVuICsgZGF0YWxlbiArIDI7CisKKwkJLyoKKwkJICog U2tpcCB0byBvdXIgaW5kZXggcG9pbnQKKwkJICovCisJCWlmIChpIDwgbWFya2VyKSB7CisJ CQkrK2k7CisJCQljb250aW51ZTsKKwkJfQorCisJCS8qCisJCSAqIFN0b3AgaWYgdGhlcmUg aXMgaW5zdWZmaWNpZW50IHNwYWNlIGluIHRoZSB1c2VyIGJ1ZmZlci4KKwkJICogSWYgd2Ug aGF2ZW4ndCBzdG9yZWQgYW55dGhpbmcgeWV0IHJldHVybiBFT1ZFUkZMT1cuIAorCQkgKiBO b3RlIHRoYXQgdGhlIG1hcmtlciBpbmRleCAoaSkgZG9lcyBub3QgY2hhbmdlLgorCQkgKi8K KwkJaWYgKGJ5dGVzICsgdG90bGVuID4gbWF4c2l6ZSkgeworCQkJaWYgKGJ5dGVzID09IDAp CisJCQkJZXJyb3IgPSBFT1ZFUkZMT1c7CisJCQllYXJseXRlcm0gPSAxOworCQkJYnJlYWs7 CisJCX0KKworCQllcnJvciA9IGNvcHlvdXQoc3ltLT52c19uYW1lLCB1YXAtPmJ1ZiArIGJ5 dGVzLCBuYW1lbGVuICsgMSk7CisJCWlmIChlcnJvciA9PSAwKSB7CisJCQlieXRlcyArPSBu YW1lbGVuICsgMTsKKwkJCWVycm9yID0gY29weW91dChzeW0tPnZzX2RhdGEsIHVhcC0+YnVm ICsgYnl0ZXMsIGRhdGFsZW4gKyAxKTsKKwkJCWlmIChlcnJvciA9PSAwKQorCQkJCWJ5dGVz ICs9IGRhdGFsZW4gKyAxOworCQkJZWxzZQorCQkJCWJ5dGVzIC09IG5hbWVsZW4gKyAxOwkv KiByZXZlcnQgaWYgZXJyb3IgKi8KKwkJfQorCQlpZiAoZXJyb3IpIHsKKwkJCWVhcmx5dGVy bSA9IDE7CisJCQlicmVhazsKKwkJfQorCQkrK2k7CisJfQorCisJLyoKKwkgKiBTYXZlIHRo ZSBtYXJrZXIgYmFjay4gIElmIG5vIGVycm9yIG9jY3VyZWQgYW5kIGVhcmx5dGVybSBpcyBj bGVhcgorCSAqIHRoZSBtYXJrZXIgaXMgc2V0IHRvIC0xIGluZGljYXRpbmcgdGhhdCB0aGUg dmFyaWFibGUgbGlzdCBoYXMgYmVlbgorCSAqIGV4aGF1c3RlZC4gIElmIG5vIGVycm9yIG9j Y3VyZWQgdGhlIG51bWJlciBvZiBieXRlcyBsb2FkZWQgaW50bworCSAqIHRoZSBidWZmZXIg d2lsbCBiZSByZXR1cm5lZCwgb3RoZXJ3aXNlIHRoZSBzeXNjYWxsIGNvZGUgcmV0dXJucyAt MS4KKwkgKi8KKwlpZiAoZXJyb3IgPT0gMCAmJiBlYXJseXRlcm0gPT0gMCkKKwkJbWFya2Vy ID0gLTE7CisJZWxzZQorCQltYXJrZXIgPSBpOworCWlmIChlcnJvciA9PSAwKQorCQllcnJv ciA9IGNvcHlvdXQoJm1hcmtlciwgdWFwLT5tYXJrZXIsIHNpemVvZihtYXJrZXIpKTsKKwlp ZiAoZXJyb3IgPT0gMCkKKwkJZXJyb3IgPSBjb3B5b3V0KCZieXRlcywgdWFwLT5zaXplLCBz aXplb2YoYnl0ZXMpKTsKK2RvbmU6CisJcmV0dXJuKGVycm9yKTsKK30KKworLyoKKyAqIExv b2t1cCBhIHZhcmlhbnQgc3ltbGluay4gIFhYWCB1c2UgYSBoYXNoIHRhYmxlLgorICovCitz dGF0aWMKK3N0cnVjdCB2YXJzeW1lbnQgKgordmFyc3ltbG9va3VwKHN0cnVjdCB2YXJzeW1z ZXQgKnZzcywgY29uc3QgY2hhciAqbmFtZSwgaW50IG5hbWVsZW4pCit7CisgICAgc3RydWN0 IHZhcnN5bWVudCAqdmU7CisKKyAgICBUQUlMUV9GT1JFQUNIKHZlLCAmdnNzLT52eF9xdWV1 ZSwgdmVfZW50cnkpIHsKKwkJdmFyc3ltX3QgdmFyID0gdmUtPnZlX3N5bTsKKwkJaWYgKHZh ci0+dnNfbmFtZWxlbiA9PSBuYW1lbGVuICYmIAorCSAgICAJYmNtcChuYW1lLCB2YXItPnZz X25hbWUsIG5hbWVsZW4pID09IDApIAorCQl7CisJICAgIAlyZXR1cm4odmUpOworCQl9Cisg ICAgfQorICAgIHJldHVybihOVUxMKTsKK30KKworc3RhdGljIHZhcnN5bV90Cit2YXJzeW1m aW5kKGludCBtYXNrLCBjb25zdCBjaGFyICpuYW1lLCBpbnQgbmFtZWxlbikKK3sKKyAgICBz dHJ1Y3QgcHJvYyAqcCA9IGN1cnByb2M7CisgICAgc3RydWN0IHZhcnN5bWVudCAqdmUgPSBO VUxMOworICAgIHZhcnN5bV90IHN5bTsKKworCS8qCisJICogcGVyLXByb2Nlc3MgdmFyaWFi bGVzIG92ZXJyaWRlIHBlci11c2VyIHZhcmlhYmxlcywKKyAgICAgICAgICogcGVyLXByb2Nl c3MgdmFyaWFibGVzIG92ZXJyaWRlIHBhcmVudCBwcm9jZXNzIHZhcmlhYmxlcywKKwkgKiBw ZXItdXNlciB2YXJpYWJsZXMgb3ZlcnJpZGUgc3lzdGVtLXdpZGUgdmFyaWFibGVzLgorCSAq IFhYWDogcGVyLXVzZXIgdmFyaWFibGVzIGN1cnJlbnRseSBub3QgYWxsb3dlZCBpbiBqYWls LgorCSAqLworICAgIGlmICgobWFzayAmIChWQVJTWU1fUFJPQ19NQVNLfFZBUlNZTV9QUFJP Q19NQVNLfFZBUlNZTV9VU0VSX01BU0spKSAmJiBwICE9IE5VTEwpIHsKKwkJaWYgKG1hc2sg JiBWQVJTWU1fUFJPQ19NQVNLKQorCQkJdmUgPSB2YXJzeW1sb29rdXAoJnAtPnBfdmFyc3lt c2V0LCBuYW1lLCBuYW1lbGVuKTsKKwkJaWYgKHZlID09IE5VTEwgJiYgbWFzayAmIFZBUlNZ TV9QUFJPQ19NQVNLKQorCQkJdmUgPSB2YXJzeW1sb29rdXAoJnAtPnBfcHB0ci0+cF92YXJz eW1zZXQsIG5hbWUsIG5hbWVsZW4pOworCQlpZiAodmUgPT0gTlVMTCAmJiAobWFzayAmIFZB UlNZTV9VU0VSX01BU0spICYmICghamFpbGVkKHAtPnBfdWNyZWQpKSkKKwkgICAJCXZlID0g dmFyc3ltbG9va3VwKCZwLT5wX3VjcmVkLT5jcl91aWRpbmZvLT51aV92YXJzeW1zZXQsIAor CQkJCQkJCW5hbWUsIG5hbWVsZW4pOworICAgIH0KKyAgICBpZiAodmUgPT0gTlVMTCAmJiAo bWFzayAmIFZBUlNZTV9TWVNfTUFTSykpIHsKKwkJaWYgKHAgIT0gTlVMTCAmJiBqYWlsZWQo cC0+cF91Y3JlZCkpIAorCSAgICAJdmUgPSB2YXJzeW1sb29rdXAoJnAtPnBfdWNyZWQtPmNy X3ByaXNvbi0+cHJfdmFyc3ltc2V0LCAKKwkJCQkJCQluYW1lLCBuYW1lbGVuKTsKKwkJZWxz ZQorCSAgICAJdmUgPSB2YXJzeW1sb29rdXAoJnZhcnN5bXNldF9zeXMsIG5hbWUsIG5hbWVs ZW4pOworICAgIH0KKyAgICBpZiAodmUpIHsKKwkJc3ltID0gdmUtPnZlX3N5bTsKKwkJKytz eW0tPnZzX3JlZnM7CisJCXJldHVybihzeW0pOworICAgIH0gCisJcmV0dXJuKE5VTEwpOwor fQorCitzdGF0aWMgaW50Cit2YXJzeW1tYWtlKGludCBsZXZlbCwgY29uc3QgY2hhciAqbmFt ZSwgY29uc3QgY2hhciAqZGF0YSkKK3sKKyAgICB2YXJzeW1fdCBzeW07CisgICAgc3RydWN0 IHZhcnN5bXNldCAqdnNzID0gTlVMTDsKKyAgICBzdHJ1Y3QgdmFyc3ltZW50ICp2ZTsKKyAg ICBzdHJ1Y3QgcHJvYyAqcCA9IGN1cnByb2M7CisgICAgaW50IG5hbWVsZW4gPSBzdHJsZW4o bmFtZSk7CisgICAgaW50IGRhdGFsZW47CisgICAgaW50IGVycm9yOworCisJc3dpdGNoKGxl dmVsKSB7CisJY2FzZSBWQVJTWU1fUFBST0M6CisJCWlmIChwICYmIHAtPnBfcHB0cikKKwkJ dnNzID0gJnAtPnBfcHB0ci0+cF92YXJzeW1zZXQ7CisJCWJyZWFrOworCWNhc2UgVkFSU1lN X1BST0M6CisJCWlmIChwKQorCSAJdnNzID0gJnAtPnBfdmFyc3ltc2V0OworCQlicmVhazsK KwljYXNlIFZBUlNZTV9VU0VSOgorCQlpZiAocCkKKwkgICAgCXZzcyA9ICZwLT5wX3VjcmVk LT5jcl91aWRpbmZvLT51aV92YXJzeW1zZXQ7CisJCWJyZWFrOworCWNhc2UgVkFSU1lNX1NZ UzoKKwkJdnNzID0gJnZhcnN5bXNldF9zeXM7CisJCWJyZWFrOworCWNhc2UgVkFSU1lNX1BS SVNPTjoKKwkJaWYgKHApCisJICAgIAl2c3MgPSAmcC0+cF91Y3JlZC0+Y3JfcHJpc29uLT5w cl92YXJzeW1zZXQ7CisJCWJyZWFrOworICAgIH0KKyAgICBpZiAodnNzID09IE5VTEwpIHsK KwkJZXJyb3IgPSBFSU5WQUw7CisgICAgfSBlbHNlIGlmIChkYXRhICYmIHZzcy0+dnhfc2V0 c2l6ZSA+PSBNQVhWQVJTWU1fU0VUKSB7CisJCWVycm9yID0gRTJCSUc7CisgICAgfSBlbHNl IGlmIChkYXRhKSB7CisJCWRhdGFsZW4gPSBzdHJsZW4oZGF0YSk7CisJCXZlID0gbWFsbG9j KHNpemVvZihzdHJ1Y3QgdmFyc3ltZW50KSwgTV9WQVJTWU0sIE1fV0FJVE9LfE1fWkVSTyk7 CisJCXN5bSA9IG1hbGxvYyhzaXplb2Yoc3RydWN0IHZhcnN5bSkgKyBuYW1lbGVuICsgZGF0 YWxlbiArIDIsCisJCQkJCSAgIAlNX1ZBUlNZTSwgTV9XQUlUT0spOworCQl2ZS0+dmVfc3lt ID0gc3ltOworCQlzeW0tPnZzX3JlZnMgPSAxOworCQlzeW0tPnZzX25hbWVsZW4gPSBuYW1l bGVuOworCQlzeW0tPnZzX25hbWUgPSAoY2hhciAqKShzeW0gKyAxKTsKKwkJc3ltLT52c19k YXRhID0gc3ltLT52c19uYW1lICsgbmFtZWxlbiArIDE7CisJCXN0cmNweShzeW0tPnZzX25h bWUsIG5hbWUpOworCQlzdHJjcHkoc3ltLT52c19kYXRhLCBkYXRhKTsKKwkJCisJCVRBSUxR X0lOU0VSVF9UQUlMKCZ2c3MtPnZ4X3F1ZXVlLCB2ZSwgdmVfZW50cnkpOworCQl2c3MtPnZ4 X3NldHNpemUgKz0gc2l6ZW9mKHN0cnVjdCB2YXJzeW1lbnQpICsgCisJCQkJc2l6ZW9mKHN0 cnVjdCB2YXJzeW0pICsgbmFtZWxlbiArIGRhdGFsZW4gKyA4OyAvKiBYWFggKi8KKworCQll cnJvciA9IDA7CisgICAgfSBlbHNlIHsKKwkJaWYgKCh2ZSA9IHZhcnN5bWxvb2t1cCh2c3Ms IG5hbWUsIG5hbWVsZW4pKSAhPSBOVUxMKSB7CisJICAgIAlUQUlMUV9SRU1PVkUoJnZzcy0+ dnhfcXVldWUsIHZlLCB2ZV9lbnRyeSk7CisJCSAgICB2c3MtPnZ4X3NldHNpemUgLT0gc2l6 ZW9mKHN0cnVjdCB2YXJzeW1lbnQpICsgCisJCQkJCQkJICAgc2l6ZW9mKHN0cnVjdCB2YXJz eW0pICsgbmFtZWxlbiArIAorCQkJCQkJCSAgIHN0cmxlbih2ZS0+dmVfc3ltLT52c19kYXRh KSArIDg7IC8qIFhYWCAqLworCQkgICAgdmFyc3ltZHJvcCh2ZS0+dmVfc3ltKTsKKwkJICAg IGZyZWUodmUsIE1fVkFSU1lNKTsKKwkgICAgCWVycm9yID0gMDsKKwkJfSBlbHNlIHsKKwkg ICAgCWVycm9yID0gRU5PRU5UOworCQl9CisgICAgfQorICAgIHJldHVybihlcnJvcik7Cit9 CisKK3N0YXRpYyB2b2lkCit2YXJzeW1kcm9wKHZhcnN5bV90IHN5bSkKK3sKKyAgICBLQVNT RVJUKHN5bS0+dnNfcmVmcyA+IDAsICgiJXM6IHN5bS0+dnNfcmVmcyA8PSAwIiwgX19mdW5j X18pKTsKKyAgICBpZiAoLS1zeW0tPnZzX3JlZnMgPT0gMCkgeworCQlmcmVlKHN5bSwgTV9W QVJTWU0pOworICAgIH0KK30KKwordm9pZAordmFyc3ltc2V0X2luaXQoc3RydWN0IHZhcnN5 bXNldCAqdnNzLCBzdHJ1Y3QgdmFyc3ltc2V0ICpjb3B5KQoreworICAgIHN0cnVjdCB2YXJz eW1lbnQgKnZlLCAqbnZlOworCisgICAgVEFJTFFfSU5JVCgmdnNzLT52eF9xdWV1ZSk7CisJ CisgICAgaWYgKGNvcHkpIHsKKwkJVEFJTFFfRk9SRUFDSCh2ZSwgJmNvcHktPnZ4X3F1ZXVl LCB2ZV9lbnRyeSkgeworCQkJbnZlID0gbWFsbG9jKHNpemVvZihzdHJ1Y3QgdmFyc3ltZW50 KSwgTV9WQVJTWU0sIE1fV0FJVE9LfE1fWkVSTyk7CisJCQludmUtPnZlX3N5bSA9IHZlLT52 ZV9zeW07CisJCQkrK252ZS0+dmVfc3ltLT52c19yZWZzOworCQkJVEFJTFFfSU5TRVJUX1RB SUwoJnZzcy0+dnhfcXVldWUsIG52ZSwgdmVfZW50cnkpOworCQl9CisJCXZzcy0+dnhfc2V0 c2l6ZSA9IGNvcHktPnZ4X3NldHNpemU7CisgICAgfQorfQorCit2b2lkCit2YXJzeW1zZXRf Y2xlYW4oc3RydWN0IHZhcnN5bXNldCAqdnNzKQoreworICAgIHN0cnVjdCB2YXJzeW1lbnQg KnZlOworCisgICAgd2hpbGUgKCh2ZSA9IFRBSUxRX0ZJUlNUKCZ2c3MtPnZ4X3F1ZXVlKSkg IT0gTlVMTCkgeworCQlUQUlMUV9SRU1PVkUoJnZzcy0+dnhfcXVldWUsIHZlLCB2ZV9lbnRy eSk7CisJCXZhcnN5bWRyb3AodmUtPnZlX3N5bSk7CisJCWZyZWUodmUsIE1fVkFSU1lNKTsK KyAgICB9CisgICAgdnNzLT52eF9zZXRzaXplID0gMDsKK30KKwpJbmRleDogc3JjL2Jpbi9s bi9sbi4xCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT0KUkNTIGZpbGU6IC9uY3ZzL3NyYy9iaW4vbG4vbG4uMSx2 CnJldHJpZXZpbmcgcmV2aXNpb24gMS4zMApkaWZmIC11IC1iIC1yMS4zMCBsbi4xCi0tLSBz cmMvYmluL2xuL2xuLjEJMTYgSmFuIDIwMDUgMTY6NDE6NTcgLTAwMDAJMS4zMAorKysgc3Jj L2Jpbi9sbi9sbi4xCTIyIEphbiAyMDA2IDIyOjU5OjM5IC0wMDAwCkBAIC0xODYsNiArMTg2 LDQ3IEBACiB3aGljaCBwZXJmb3JtcyBhCiAuWHIgbGluayAyCiBvcGVyYXRpb24gdXNpbmcg dGhlIHR3byBwYXNzZWQgYXJndW1lbnRzLgorLlNoIFZBUklBTlQgU1lNTElOS1MKKy5EeAor c3VwcG9ydHMgYSBzcGVjaWFsIGtpbmQgb2YgZHluYW1pYworc3ltYm9saWMgbGluayBjYWxs ZWQgYQorLkVtIHZhcmlhbnQgc3ltbGluayAuCitUaGUKKy5BciBzb3VyY2VfZmlsZQorb2Yg YSB2YXJpYW50IHN5bWxpbmsgbWF5IGNvbnRhaW4gb25lIG9yIG1vcmUKK3ZhcmlhYmxlIG5h bWVzLiAgRWFjaCBvZiB0aGVzZSB2YXJpYWJsZQorbmFtZXMgaXMgZW5jbG9zZWQgaW4gYnJh Y2VzIGFuZCBwcmVjZWRlZCBieSBhCitkb2xsYXIgc2lnbiBpbiB0aGUgc3R5bGUgb2YgdmFy aWFibGUgcmVmZXJlbmNlcyBpbgorLlhyIHNoIDEKK2FuZAorLlhyIGNzaCAxIC4KKy5QcAor V2hlbmV2ZXIgYSB2YXJpYW50IHN5bWxpbmsgaXMgZm9sbG93ZWQsIGVhY2gKK3ZhcmlhYmxl IGZvdW5kIGluCisuQXIgc291cmNlX2ZpbGUKK2lzIHJlcGxhY2VkIGJ5IGl0cyBhc3NvY2lh dGVkIHZhbHVlLgorSW4gdGhpcyBtYW5uZXIsIGEgdmFyaWFudCBzeW1saW5rIG1heSByZXNv bHZlIHRvIGRpZmZlcmVudAorcGF0aHMgYmFzZWQgb24gY29udGV4dC4gIFRoZSBmYWNpbGl0 eQorc3VwcG9ydHMgcGVyLXByb2Nlc3MsIHBlci11c2VyLCBhbmQgc3lzdGVtLXdpZGUgdmFy c3ltcy4KKy5QcAorVmFyc3ltIHZhcmlhYmxlcyBjYW4gYmUgc2V0IHdpdGggdGhlCisuWHIg dmFyc3ltIDEKK3V0aWxpdHkuICBSZWd1bGFyCisuWHIgZW52aXJvbiA3CitlbnZpcm9ubWVu dCB2YXJpYWJsZXMgYXJlCitub3QgdXNlZCB0byByZXNvbHZlIHZhcmlhbnQgc3ltbGlua3Mu CisuU3MgRVhBTVBMRQorLkJkIC1saXRlcmFsIC1vZmZzZXQgaW5kZW50CitzeXNjdGwgLXcg dmZzLnZhcnN5bV9lbmFibGU9MQorCitsbiAtcyAnYSR7ZnViYXJ9YicgdGVzdAorCitlY2hv ICdIZWxsbycgPiBheHhiCitlY2hvICdHb29kYnllJyA+IGF5eWIKKwordmFyc3ltIGZ1YmFy PXh4OyBjYXQgdGVzdAordmFyc3ltIGZ1YmFyPXl5OyBjYXQgdGVzdAorLkVkCiAuU2ggQ09N UEFUSUJJTElUWQogVGhlCiAuRmwgaCAsCkBAIC0yMDksNyArMjUwLDggQEAKIC5YciByZWFk bGluayAyICwKIC5YciBzdGF0IDIgLAogLlhyIHN5bWxpbmsgMiAsCi0uWHIgc3ltbGluayA3 CisuWHIgc3ltbGluayA3ICwKKy5YciB2YXJzeW0gMQogLlNoIFNUQU5EQVJEUwogVGhlCiAu Tm0KQEAgLTIyNCw0ICsyNjYsNCBAQAogQW4KIC5ObQogY29tbWFuZCBhcHBlYXJlZCBpbgot LkF0IHYxIC4KKy5BdCB2MSAuIFZhcmlhbnQgU3ltbGlua3MgYXBwZWFyZWQgaW4gRHJhZ29u Rmx5IEJTRCAuCkluZGV4OiBzcmMvaW5jbHVkZS91bmlzdGQuaAo9PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ClJD UyBmaWxlOiAvbmN2cy9zcmMvaW5jbHVkZS91bmlzdGQuaCx2CnJldHJpZXZpbmcgcmV2aXNp b24gMS43OApkaWZmIC11IC1iIC1yMS43OCB1bmlzdGQuaAotLS0gc3JjL2luY2x1ZGUvdW5p c3RkLmgJMTMgTWF5IDIwMDUgMTY6Mjc6MzAgLTAwMDAJMS43OAorKysgc3JjL2luY2x1ZGUv dW5pc3RkLmgJMjIgSmFuIDIwMDYgMjI6NTk6MzkgLTAwMDAKQEAgLTU1MCw2ICs1NTAsMTAg QEAKIGludAkgdW53aGl0ZW91dChjb25zdCBjaGFyICopOwogdm9pZAkqdmFsbG9jKHNpemVf dCk7CQkJLyogb2Jzb2xldGVkIGJ5IG1hbGxvYygpICovCiAKK2ludAkgdmFyc3ltX3NldChp bnQsIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CitpbnQJIHZhcnN5bV9nZXQoaW50LCBj b25zdCBjaGFyKiwgY2hhciosIGludCopOworaW50CSB2YXJzeW1fbGlzdChpbnQsIGNoYXIq LCBpbnQqLCBpbnQqKTsKKwogI2lmbmRlZiBfT1BUUkVTRVRfREVDTEFSRUQKICNkZWZpbmUJ X09QVFJFU0VUX0RFQ0xBUkVECiBleHRlcm4gaW50IG9wdHJlc2V0OwkJCS8qIGdldG9wdCgz KSBleHRlcm5hbCB2YXJpYWJsZSAqLwpJbmRleDogc3JjL3N5cy9jb25mL2ZpbGVzCj09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT0KUkNTIGZpbGU6IC9uY3ZzL3NyYy9zeXMvY29uZi9maWxlcyx2CnJldHJpZXZp bmcgcmV2aXNpb24gMS4xMDMxLjIuMTYKZGlmZiAtdSAtYiAtcjEuMTAzMS4yLjE2IGZpbGVz Ci0tLSBzcmMvc3lzL2NvbmYvZmlsZXMJMTMgSmFuIDIwMDYgMTQ6NTU6MTYgLTAwMDAJMS4x MDMxLjIuMTYKKysrIHNyYy9zeXMvY29uZi9maWxlcwkyMiBKYW4gMjAwNiAyMjo1OTozOSAt MDAwMApAQCAtMTI0Myw2ICsxMjQzLDcgQEAKIGtlcm4va2Vybl90aW1lb3V0LmMJCXN0YW5k YXJkCiBrZXJuL2tlcm5fdW10eC5jCQlzdGFuZGFyZAoga2Vybi9rZXJuX3V1aWQuYwkJc3Rh bmRhcmQKK2tlcm4va2Vybl92YXJzeW0uYwkJc3RhbmRhcmQKIGtlcm4va2Vybl94eHguYwkJ CXN0YW5kYXJkCiBrZXJuL2xpbmtfZWxmLmMJCQlzdGFuZGFyZAoga2Vybi9saW5rZXJfaWYu bQkJc3RhbmRhcmQKSW5kZXg6IHNyYy9zeXMvY29tcGF0L2ZyZWVic2QzMi9zeXNjYWxscy5t YXN0ZXIKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PQpSQ1MgZmlsZTogL25jdnMvc3JjL3N5cy9jb21wYXQvZnJl ZWJzZDMyL3N5c2NhbGxzLm1hc3Rlcix2CnJldHJpZXZpbmcgcmV2aXNpb24gMS41MC4yLjMK ZGlmZiAtdSAtYiAtcjEuNTAuMi4zIHN5c2NhbGxzLm1hc3RlcgotLS0gc3JjL3N5cy9jb21w YXQvZnJlZWJzZDMyL3N5c2NhbGxzLm1hc3Rlci5vcmlnCVNhdCBPY3QgMjggMTk6NDk6MDUg MjAwNgorKysgc3JjL3N5cy9jb21wYXQvZnJlZWJzZDMyL3N5c2NhbGxzLm1hc3RlcglNb24g QXVnIDI3IDIxOjA0OjE5IDIwMDcKQEAgLTc5NiwzICs3OTYsMTEgQEAKIDQ4MAlBVUVfRlRS VU5DQVRFCVNURAl7IGludCBmcmVlYnNkMzJfZnRydW5jYXRlKGludCBmZCwgXAogCQkJCSAg ICB1X2ludDMyX3QgbGVuZ3RobG8sIHVfaW50MzJfdCBsZW5ndGhoaSk7IH0KIDQ4MQlBVUVf S0lMTAlOT1BST1RPCXsgaW50IHRocl9raWxsMihwaWRfdCBwaWQsIGxvbmcgaWQsIGludCBz aWcpOyB9Cis0ODIJQVVFX05VTEwJTk9QUk9UTwl7IGludCB2YXJzeW1fc2V0KGludCBsZXZl bCwgXAorCQkJCSAgICBjb25zdCBjaGFyICpuYW1lLCBcCisJCQkJICAgIGNvbnN0IGNoYXIg KmRhdGEpOyB9Cis0ODMJQVVFX05VTEwJTk9QUk9UTwl7IGludCB2YXJzeW1fZ2V0KGludCBt YXNrLCBcCisJCQkJICAgIGNvbnN0IGNoYXIgKndpbGQsIFwKKwkJCQkgICAgY2hhciAqYnVm LCBpbnQgKnNpemUpOyB9Cis0ODQJQVVFX05VTEwJTk9QUk9UTwl7IGludCB2YXJzeW1fbGlz dChpbnQgbGV2ZWwsIFwKKwkJCQkgICAgY2hhciAqYnVmLCBpbnQgKnNpemUsIGludCAqbWFy a2VyKTsgfQpJbmRleDogc3JjL3N5cy9rZXJuL3N5c2NhbGxzLm1hc3Rlcgo9PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09ClJDUyBmaWxlOiAvbmN2cy9zcmMvc3lzL2tlcm4vc3lzY2FsbHMubWFzdGVyLHYKcmV0 cmlldmluZyByZXZpc2lvbiAxLjE5OC4yLjEKZGlmZiAtdSAtYiAtcjEuMTk4LjIuMSBzeXNj YWxscy5tYXN0ZXIKLS0tIHNyYy9zeXMva2Vybi9zeXNjYWxscy5tYXN0ZXIJMjEgTm92IDIw MDUgMDE6MTI6MzcgLTAwMDAJMS4xOTguMi4xCisrKyBzcmMvc3lzL2tlcm4vc3lzY2FsbHMu bWFzdGVyCTIyIEphbiAyMDA2IDIyOjU5OjQwIC0wMDAwCkBAIC04NDcsNSArODQ3LDEzIEBA CiA0NzkJQVVFX1RSVU5DQVRFCVNURAl7IGludCB0cnVuY2F0ZShjaGFyICpwYXRoLCBvZmZf dCBsZW5ndGgpOyB9CiA0ODAJQVVFX0ZUUlVOQ0FURQlTVEQJeyBpbnQgZnRydW5jYXRlKGlu dCBmZCwgb2ZmX3QgbGVuZ3RoKTsgfQogNDgxCUFVRV9LSUxMCVNURAl7IGludCB0aHJfa2ls bDIocGlkX3QgcGlkLCBsb25nIGlkLCBpbnQgc2lnKTsgfQorNDgyICAgICBBVUVfTlVMTCAg ICAgICAgU1RECXsgaW50IHZhcnN5bV9zZXQoaW50IGxldmVsLCBcCisJCQkJICAgICBjb25z dCBjaGFyICpuYW1lLCBcCisJCQkJICAgICBjb25zdCBjaGFyICpkYXRhKTsgfQorNDgzICAg ICBBVUVfTlVMTCAgICAgICAgU1RECXsgaW50IHZhcnN5bV9nZXQoaW50IG1hc2ssIFwKKwkJ CQkgICAgIGNvbnN0IGNoYXIgKndpbGQsIFwKKwkJCQkgICAgIGNoYXIgKmJ1ZiwgaW50ICpz aXplKTsgfQorNDg0ICAgICBBVUVfTlVMTCAgICAgICAgU1RECXsgaW50IHZhcnN5bV9saXN0 KGludCBsZXZlbCwgXAorCQkJCSAgICAgY2hhciAqYnVmLCBpbnQgKnNpemUsIGludCAqbWFy a2VyKTsgfQogOyBQbGVhc2UgY29weSBhbnkgYWRkaXRpb25zIGFuZCBjaGFuZ2VzIHRvIHRo ZSBmb2xsb3dpbmcgY29tcGF0YWJpbGl0eSB0YWJsZXM6CiA7IHN5cy9jb21wYXQvZnJlZWJz ZDMyL3N5c2NhbGxzLm1hc3RlcgpJbmRleDogc3JjL3N5cy9rZXJuL2tlcm5fZXhlYy5jCj09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT0KUkNTIGZpbGU6IC9uY3ZzL3NyYy9zeXMva2Vybi9rZXJuX2V4ZWMuYyx2 CnJldHJpZXZpbmcgcmV2aXNpb24gMS4yNzUuMi4zCmRpZmYgLXUgLWIgLXIxLjI3NS4yLjMg a2Vybl9leGVjLmMKLS0tIHNyYy9zeXMva2Vybi9rZXJuX2V4ZWMuYwkyNiBEZWMgMjAwNSAx Mzo0NzoxOSAtMDAwMAkxLjI3NS4yLjMKKysrIHNyYy9zeXMva2Vybi9rZXJuX2V4ZWMuYwky MiBKYW4gMjAwNiAyMjo1OTo0MCAtMDAwMApAQCAtNjE3LDYgKzYxNywxMSBAQAogCQljaGFu Z2Vfc3ZnaWQobmV3Y3JlZCwgbmV3Y3JlZC0+Y3JfZ2lkKTsKIAkJcC0+cF91Y3JlZCA9IG5l d2NyZWQ7CiAJCW5ld2NyZWQgPSBOVUxMOworCisJCS8qCisJCSAqIENsZWFyIGxvY2FsIHZh cnN5bSB2YXJpYWJsZXMKKwkJICovCisJCXZhcnN5bXNldF9jbGVhbigmcC0+cF92YXJzeW1z ZXQpOwogCX0gZWxzZSB7CiAJCWlmIChvbGRjcmVkLT5jcl91aWQgPT0gb2xkY3JlZC0+Y3Jf cnVpZCAmJgogCQkgICAgb2xkY3JlZC0+Y3JfZ2lkID09IG9sZGNyZWQtPmNyX3JnaWQpCklu ZGV4OiBzcmMvc3lzL2tlcm4va2Vybl9mb3JrLmMKPT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpSQ1MgZmlsZTog L25jdnMvc3JjL3N5cy9rZXJuL2tlcm5fZm9yay5jLHYKcmV0cmlldmluZyByZXZpc2lvbiAx LjI1MgpkaWZmIC11IC1iIC1yMS4yNTIga2Vybl9mb3JrLmMKLS0tIHNyYy9zeXMva2Vybi9r ZXJuX2ZvcmsuYwkxIEp1bCAyMDA1IDE2OjI4OjMwIC0wMDAwCTEuMjUyCisrKyBzcmMvc3lz L2tlcm4va2Vybl9mb3JrLmMJMjIgSmFuIDIwMDYgMjI6NTk6NDEgLTAwMDAKQEAgLTU5Niw3 ICs1OTYsNyBAQAogCUxJU1RfSU5TRVJUX0FGVEVSKHAxLCBwMiwgcF9wZ2xpc3QpOwogCVBH UlBfVU5MT0NLKHAxLT5wX3BncnApOwogCUxJU1RfSU5JVCgmcDItPnBfY2hpbGRyZW4pOwot CisJdmFyc3ltc2V0X2luaXQoJnAyLT5wX3ZhcnN5bXNldCwgJnAxLT5wX3ZhcnN5bXNldCk7 CiAJY2FsbG91dF9pbml0KCZwMi0+cF9pdGNhbGxvdXQsIENBTExPVVRfTVBTQUZFKTsKIAog I2lmZGVmIEtUUkFDRQpJbmRleDogc3JjL3N5cy9rZXJuL2tlcm5famFpbC5jCj09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT0KUkNTIGZpbGU6IC9uY3ZzL3NyYy9zeXMva2Vybi9rZXJuX2phaWwuYyx2CnJldHJp ZXZpbmcgcmV2aXNpb24gMS41MC4yLjEKZGlmZiAtdSAtYiAtcjEuNTAuMi4xIGtlcm5famFp bC5jCi0tLSBzcmMvc3lzL2tlcm4va2Vybl9qYWlsLmMJMTMgTm92IDIwMDUgMDM6MTI6MzIg LTAwMDAJMS41MC4yLjEKKysrIHNyYy9zeXMva2Vybi9rZXJuX2phaWwuYwkyMiBKYW4gMjAw NiAyMjo1OTo0MSAtMDAwMApAQCAtMTYzLDYgKzE2Myw3IEBACiAJCXByLT5wcl9zbG90cyA9 IG1hbGxvYyhzaXplb2YoKnByLT5wcl9zbG90cykgKiBwcmlzb25fc2VydmljZV9zbG90cywK IAkJICAgIE1fUFJJU09OLCBNX1pFUk8gfCBNX1dBSVRPSyk7CiAJfQorCXZhcnN5bXNldF9p bml0KCZwci0+cHJfdmFyc3ltc2V0LCBOVUxMKTsKIAogCS8qIERldGVybWluZSBuZXh0IHBy X2lkIGFuZCBhZGQgcHJpc29uIHRvIGFsbHByaXNvbiBsaXN0LiAqLwogCXN4X3hsb2NrKCZh bGxwcmlzb25fbG9jayk7CkBAIC0xNzYsNyArMTc3LDcgQEAKIAkJCWlmICh0cnlwcmlkID09 IEpBSUxfTUFYKSB7CiAJCQkJc3hfeHVubG9jaygmYWxscHJpc29uX2xvY2spOwogCQkJCWVy cm9yID0gRUFHQUlOOwotCQkJCWdvdG8gZV9kcm9wdm5yZWY7CisJCQkJZ290byBlX2NsZWFu dmFyc3ltOwogCQkJfQogCQkJZ290byBuZXh0OwogCQl9CkBAIC0yMDcsNiArMjA4LDggQEAK IAkJcHNydi0+cHNfZGVzdHJveShwc3J2LCBwcik7CiAJfQogCXN4X3N1bmxvY2soJmFsbHBy aXNvbl9sb2NrKTsKK2VfY2xlYW52YXJzeW06CisJdmFyc3ltc2V0X2NsZWFuKCZwci0+cHJf dmFyc3ltc2V0KTsKIGVfZHJvcHZucmVmOgogCXZmc2xvY2tlZCA9IFZGU19MT0NLX0dJQU5U KHByLT5wcl9yb290LT52X21vdW50KTsKIAl2cmVsZShwci0+cHJfcm9vdCk7CkBAIC0zNDMs NiArMzQ2LDcgQEAKIAl2cmVsZShwci0+cHJfcm9vdCk7CiAJVkZTX1VOTE9DS19HSUFOVCh2 ZnNsb2NrZWQpOwogCisJdmFyc3ltc2V0X2NsZWFuKCZwci0+cHJfdmFyc3ltc2V0KTsKIAlt dHhfZGVzdHJveSgmcHItPnByX210eCk7CiAJaWYgKHByLT5wcl9saW51eCAhPSBOVUxMKQog CQlGUkVFKHByLT5wcl9saW51eCwgTV9QUklTT04pOwpJbmRleDogc3JjL3N5cy9rZXJuL2tl cm5fcmVzb3VyY2UuYwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09ClJDUyBmaWxlOiAvbmN2cy9zcmMvc3lzL2tl cm4va2Vybl9yZXNvdXJjZS5jLHYKcmV0cmlldmluZyByZXZpc2lvbiAxLjE0OC4yLjEKZGlm ZiAtdSAtYiAtcjEuMTQ4LjIuMSBrZXJuX3Jlc291cmNlLmMKLS0tIHNyYy9zeXMva2Vybi9r ZXJuX3Jlc291cmNlLmMJMjggRGVjIDIwMDUgMTc6MzU6NTUgLTAwMDAJMS4xNDguMi4xCisr KyBzcmMvc3lzL2tlcm4va2Vybl9yZXNvdXJjZS5jCTIyIEphbiAyMDA2IDIyOjU5OjQxIC0w MDAwCkBAIC0xMDU1LDYgKzEwNTUsNyBAQAogCQl9IGVsc2UgewogCQkJdWlwLT51aV9tdHhw ID0gbXR4X3Bvb2xfYWxsb2MobXR4cG9vbF9zbGVlcCk7CiAJCQl1aXAtPnVpX3VpZCA9IHVp ZDsKKwkJCXZhcnN5bXNldF9pbml0KCZ1aXAtPnVpX3ZhcnN5bXNldCwgTlVMTCk7CiAJCQlM SVNUX0lOU0VSVF9IRUFEKFVJSEFTSCh1aWQpLCB1aXAsIHVpX2hhc2gpOwogCQl9CiAJfQpA QCAtMTEyNSw2ICsxMTI2LDcgQEAKIAkJaWYgKHVpcC0+dWlfcHJvY2NudCAhPSAwKQogCQkJ cHJpbnRmKCJmcmVlaW5nIHVpZGluZm86IHVpZCA9ICVkLCBwcm9jY250ID0gJWxkXG4iLAog CQkJICAgIHVpcC0+dWlfdWlkLCB1aXAtPnVpX3Byb2NjbnQpOworCQl2YXJzeW1zZXRfY2xl YW4oJnVpcC0+dWlfdmFyc3ltc2V0KTsKIAkJVUlESU5GT19VTkxPQ0sodWlwKTsKIAkJRlJF RSh1aXAsIE1fVUlESU5GTyk7CiAJCXJldHVybjsKSW5kZXg6IHNyYy9zeXMva2Vybi92ZnNf bG9va3VwLmMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PQpSQ1MgZmlsZTogL25jdnMvc3JjL3N5cy9rZXJuL3Zm c19sb29rdXAuYyx2CnJldHJpZXZpbmcgcmV2aXNpb24gMS44MC4yLjMKZGlmZiAtdSAtYiAt cjEuODAuMi4zIHZmc19sb29rdXAuYwotLS0gc3JjL3N5cy9rZXJuL3Zmc19sb29rdXAuYwky OSBTZXAgMjAwNSAxODo1MzoxMCAtMDAwMAkxLjgwLjIuMworKysgc3JjL3N5cy9rZXJuL3Zm c19sb29rdXAuYwkyMiBKYW4gMjAwNiAyMjo1OTo0MSAtMDAwMApAQCAtNjMsNiArNjMsMTAg QEAKICNkZWZpbmUJTkFNRUlfRElBR05PU1RJQyAxCiAjdW5kZWYgTkFNRUlfRElBR05PU1RJ QwogCitpbnQgdmFyc3ltX2VuYWJsZSA9IDA7CitTWVNDVExfSU5UKF92ZnMsIE9JRF9BVVRP LCB2YXJzeW1fZW5hYmxlLCBDVExGTEFHX1JXLCAmdmFyc3ltX2VuYWJsZSwgMCwKKyAgICAi RW5hYmxlIFZhcmlhbnQgU3ltbGlua3MiKTsKKwogLyoKICAqIEFsbG9jYXRpb24gem9uZSBm b3IgbmFtZWkKICAqLwpAQCAtMjYyLDYgKzI2Niw4IEBACiAJCQlicmVhazsKIAkJfQogCQls aW5rbGVuID0gTUFYUEFUSExFTiAtIGF1aW8udWlvX3Jlc2lkOworCQlpZiAodmFyc3ltX2Vu YWJsZSkKKwkJCWxpbmtsZW4gPSB2YXJzeW1yZXBsYWNlKGNwLCBsaW5rbGVuLCBNQVhQQVRI TEVOKTsKIAkJaWYgKGxpbmtsZW4gPT0gMCkgewogCQkJaWYgKG5kcC0+bmlfcGF0aGxlbiA+ IDEpCiAJCQkJdW1hX3pmcmVlKG5hbWVpX3pvbmUsIGNwKTsKSW5kZXg6IHNyYy9zeXMvc3lz L2phaWwuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09ClJDUyBmaWxlOiAvbmN2cy9zcmMvc3lzL3N5cy9qYWls LmgsdgpyZXRyaWV2aW5nIHJldmlzaW9uIDEuMjYKZGlmZiAtdSAtYiAtcjEuMjYgamFpbC5o Ci0tLSBzcmMvc3lzL3N5cy9qYWlsLmgJOSBKdW4gMjAwNSAxODo0OToxOSAtMDAwMAkxLjI2 CisrKyBzcmMvc3lzL3N5cy9qYWlsLmgJMjIgSmFuIDIwMDYgMjI6NTk6NDIgLTAwMDAKQEAg LTYxLDYgKzYxLDcgQEAKICAqICAgKGQpIHNldCBvbmx5IGR1cmluZyBkZXN0cnVjdGlvbiBv ZiBqYWlsLCBubyBtdXRleCBuZWVkZWQKICAqLwogI2lmIGRlZmluZWQoX0tFUk5FTCkgfHwg ZGVmaW5lZChfV0FOVF9QUklTT04pCisjaW5jbHVkZSA8c3lzL3ZhcnN5bS5oPgogc3RydWN0 IHByaXNvbiB7CiAJTElTVF9FTlRSWShwcmlzb24pIHByX2xpc3Q7CQkJLyogKGEpIGFsbCBw cmlzb25zICovCiAJaW50CQkgcHJfaWQ7CQkJCS8qIChjKSBwcmlzb24gaWQgKi8KQEAgLTcy LDYgKzczLDcgQEAKIAl2b2lkCQkqcHJfbGludXg7CQkJLyogKHApIGxpbnV4IGFiaSAqLwog CWludAkJIHByX3NlY3VyZWxldmVsOwkJLyogKHApIHNlY3VyZWxldmVsICovCiAJc3RydWN0 IHRhc2sJIHByX3Rhc2s7CQkJLyogKGQpIGRlc3Ryb3kgdGFzayAqLworCXN0cnVjdCB2YXJz eW1zZXQgcHJfdmFyc3ltc2V0OwkJCS8qIChwKSBwcmlzb24gdmFyc3ltcyAqLwogCXN0cnVj dCBtdHgJIHByX210eDsKIH07CiAjZW5kaWYgLyogX0tFUk5FTCB8fCBfV0FOVF9QUklTT04g Ki8KSW5kZXg6IHNyYy9zeXMvc3lzL25hbWVpLmgKPT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpSQ1MgZmlsZTog L25jdnMvc3JjL3N5cy9zeXMvbmFtZWkuaCx2CnJldHJpZXZpbmcgcmV2aXNpb24gMS40Nwpk aWZmIC11IC1iIC1yMS40NyBuYW1laS5oCi0tLSBzcmMvc3lzL3N5cy9uYW1laS5oCTI3IEFw ciAyMDA1IDA5OjAwOjQ3IC0wMDAwCTEuNDcKKysrIHNyYy9zeXMvc3lzL25hbWVpLmgJMjIg SmFuIDIwMDYgMjI6NTk6NDIgLTAwMDAKQEAgLTE3NCw2ICsxNzQsOCBAQAogCiB2b2lkIE5E RlJFRShzdHJ1Y3QgbmFtZWlkYXRhICosIGNvbnN0IHVfaW50KTsKIAorZXh0ZXJuIGludCB2 YXJzeW1fZW5hYmxlOworCiBpbnQJbmFtZWkoc3RydWN0IG5hbWVpZGF0YSAqbmRwKTsKIGlu dAlsb29rdXAoc3RydWN0IG5hbWVpZGF0YSAqbmRwKTsKIGludAlyZWxvb2t1cChzdHJ1Y3Qg dm5vZGUgKmR2cCwgc3RydWN0IHZub2RlICoqdnBwLApJbmRleDogc3JjL3N5cy9zeXMvcHJv Yy5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT0KUkNTIGZpbGU6IC9uY3ZzL3NyYy9zeXMvc3lzL3Byb2MuaCx2 CnJldHJpZXZpbmcgcmV2aXNpb24gMS40MzIuMi4yCmRpZmYgLXUgLWIgLXIxLjQzMi4yLjIg cHJvYy5oCi0tLSBzcmMvc3lzL3N5cy9wcm9jLmgJNCBPY3QgMjAwNSAwNDo0MToyNiAtMDAw MAkxLjQzMi4yLjIKKysrIHNyYy9zeXMvc3lzL3Byb2MuaAkyMiBKYW4gMjAwNiAyMjo1OTo0 MiAtMDAwMApAQCAtNjAsNiArNjAsNyBAQAogI2VuZGlmCiAjaW5jbHVkZSA8c3lzL3Vjb250 ZXh0Lmg+CiAjaW5jbHVkZSA8c3lzL3VjcmVkLmg+CisjaW5jbHVkZSA8c3lzL3ZhcnN5bS5o PgogI2luY2x1ZGUgPG1hY2hpbmUvcHJvYy5oPgkJLyogTWFjaGluZS1kZXBlbmRlbnQgcHJv YyBzdWJzdHJ1Y3QuICovCiAKIC8qCkBAIC01MTIsNiArNTEzLDcgQEAKIAlMSVNUX0VOVFJZ KHByb2MpIHBfc2libGluZzsJLyogKGUpIExpc3Qgb2Ygc2libGluZyBwcm9jZXNzZXMuICov CiAJTElTVF9IRUFEKCwgcHJvYykgcF9jaGlsZHJlbjsJLyogKGUpIFBvaW50ZXIgdG8gbGlz dCBvZiBjaGlsZHJlbi4gKi8KIAlzdHJ1Y3QgbXR4CXBfbXR4OwkJLyogKG4pIExvY2sgZm9y IHRoaXMgc3RydWN0LiAqLworCXN0cnVjdCB2YXJzeW1zZXQgcF92YXJzeW1zZXQ7CS8qIChj KSBwcm9jZXNzIHZhcnN5bXNldCAqLwogCXN0cnVjdCBrc2lnaW5mbyAqcF9rc2k7CS8qIExv Y2tlZCBieSBwYXJlbnQgcHJvYyBsb2NrICovCiAJc2lncXVldWVfdAlwX3NpZ3F1ZXVlOwkv KiAoYykgU2lncyBub3QgZGVsaXZlcmVkIHRvIGEgdGQuICovCiAjZGVmaW5lIHBfc2lnbGlz dAlwX3NpZ3F1ZXVlLnNxX3NpZ25hbHMKSW5kZXg6IHNyYy9zeXMvc3lzL3Jlc291cmNldmFy LmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PQpSQ1MgZmlsZTogL25jdnMvc3JjL3N5cy9zeXMvcmVzb3VyY2V2 YXIuaCx2CnJldHJpZXZpbmcgcmV2aXNpb24gMS40NwpkaWZmIC11IC1iIC1yMS40NyByZXNv dXJjZXZhci5oCi0tLSBzcmMvc3lzL3N5cy9yZXNvdXJjZXZhci5oCTcgSmFuIDIwMDUgMDI6 Mjk6MjMgLTAwMDAJMS40NworKysgc3JjL3N5cy9zeXMvcmVzb3VyY2V2YXIuaAkyMiBKYW4g MjAwNiAyMjo1OTo0MiAtMDAwMApAQCAtMzgsNiArMzgsNyBAQAogI2lmZGVmIF9LRVJORUwK ICNpbmNsdWRlIDxzeXMvX2xvY2suaD4KICNpbmNsdWRlIDxzeXMvX211dGV4Lmg+CisjaW5j bHVkZSA8c3lzL3ZhcnN5bS5oPgogI2VuZGlmCiAKIC8qCkBAIC05OSw2ICsxMDAsNyBAQAog CWxvbmcJdWlfcHJvY2NudDsJCS8qIChiKSBudW1iZXIgb2YgcHJvY2Vzc2VzICovCiAJdWlk X3QJdWlfdWlkOwkJCS8qIChhKSB1aWQgKi8KIAl1X2ludAl1aV9yZWY7CQkJLyogKGIpIHJl ZmVyZW5jZSBjb3VudCAqLworCXN0cnVjdCB2YXJzeW1zZXQgdWlfdmFyc3ltc2V0OwkvKiAo YikgcGVyLXVzZXIgdmFyc3ltcyAqLwogCXN0cnVjdCBtdHggKnVpX210eHA7CQkvKiBwcm90 ZWN0IGFsbCBjb3VudHMvbGltaXRzICovCiB9OwoKSW5kZXg6IHNyYy9iaW4vTWFrZWZpbGUK PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PQpSQ1MgZmlsZTogL25jdnMvc3JjL2Jpbi9NYWtlZmlsZSx2CnJldHJp ZXZpbmcgcmV2aXNpb24gMS4yNQpkaWZmIC11IC1iIC1yMS4yNSBNYWtlZmlsZQotLS0gc3Jj L2Jpbi9NYWtlZmlsZSAgICAyIE1hciAyMDA1IDExOjUzOjIxIC0wMDAwICAgICAgIDEuMjUK KysrIHNyYy9iaW4vTWFrZWZpbGUgICAgMjYgSmFuIDIwMDYgMjA6NDM6NTAgLTAwMDAKQEAg LTM1LDcgKzM1LDggQEAKCXNsZWVwIFwKCXN0dHkgXAoJc3luYyBcCi0JdGVzdAorCXRlc3Qg XAorCXZhcnN5bQoKIC5pZiAhZGVmaW5lZChOT19SQ01EUykKIF9yY3A9CXJjcAoKZGlmZiAt VTMgLU4gc3JjL3N5cy9zeXMvdmFyc3ltLmggc3JjL3N5cy9zeXMvdmFyc3ltLmgKLS0tIHNy Yy9zeXMvc3lzL3ZhcnN5bS5oCVdlZCBEZWMgMzEgMTk6MDA6MDAgMTk2OQorKysgc3JjL3N5 cy9zeXMvdmFyc3ltLmgJVGh1IEZlYiAxNiAwOTozMToxNCAyMDA2CkBAIC0wLDAgKzEsNTYg QEAKKy8qCisgKiBTWVMvVkFSU1lNLkgKKyAqCisgKglJbXBsZW1lbnRzIHN0cnVjdHVyZXMg dXNlZCBmb3IgdmFyaWFudCBzeW1saW5rIHN1cHBvcnQuCisgKiAKKyAqICRGcmVlQlNEJAor ICogJERyYWdvbkZseTogc3JjL3N5cy9zeXMvdmFyc3ltLmgsdiAxLjMgMjAwNS8wMS8xNCAw MjoyNTowOCBqb2VyZyBFeHAgJAorICovCisKKyNpZm5kZWYgX1NZU19WQVJTWU1fSF8KKyNk ZWZpbmUgX1NZU19WQVJTWU1fSF8KKyNpbmNsdWRlIDxzeXMvcXVldWUuaD4JCS8qIFRBSUxR XyogbWFjcm9zICovCisKK3N0cnVjdCB2YXJzeW0geworICAgIGludAkJdnNfcmVmczsJLyog YSBsb3Qgb2Ygc2hhcmluZyBvY2N1cnMgKi8KKyAgICBpbnQJCXZzX25hbWVsZW47CisgICAg Y2hhcgkqdnNfbmFtZTsJLyogdmFyaWFibGUgbmFtZSAqLworICAgIGNoYXIJKnZzX2RhdGE7 CS8qIHZhcmlhYmxlIGNvbnRlbnRzICovCit9OwordHlwZWRlZiBzdHJ1Y3QgdmFyc3ltCSp2 YXJzeW1fdDsKKworc3RydWN0IHZhcnN5bWVudCB7CisgICAgVEFJTFFfRU5UUlkodmFyc3lt ZW50KSB2ZV9lbnRyeTsKKyAgICB2YXJzeW1fdAl2ZV9zeW07Cit9OworCitzdHJ1Y3QgdmFy c3ltc2V0IHsKKyAgICBUQUlMUV9IRUFEKCwgdmFyc3ltZW50KSB2eF9xdWV1ZTsKKyAgICBp bnQJCXZ4X3NldHNpemU7Cit9OworCisjZGVmaW5lIFZBUlNZTV9QUk9DCTEKKyNkZWZpbmUg VkFSU1lNX1VTRVIJMgorI2RlZmluZSBWQVJTWU1fU1lTCTMKKyNkZWZpbmUgVkFSU1lNX1BS SVNPTgk0CS8qIHVzZWQgaW50ZXJuYWxseSAqLworI2RlZmluZSBWQVJTWU1fUFBST0MJNQkv KiBzZXQvZ2V0IHZhcnMgaW4gcGFyZW50IHByb2Nlc3MgKi8KKworI2RlZmluZSBWQVJTWU1f UFJPQ19NQVNLCSgxIDw8IFZBUlNZTV9QUk9DKQorI2RlZmluZSBWQVJTWU1fVVNFUl9NQVNL CSgxIDw8IFZBUlNZTV9VU0VSKQorI2RlZmluZSBWQVJTWU1fU1lTX01BU0sJCSgxIDw8IFZB UlNZTV9TWVMpCisjZGVmaW5lIFZBUlNZTV9QUFJPQ19NQVNLCSgxIDw8IFZBUlNZTV9QUFJP QykKKyNkZWZpbmUgVkFSU1lNX0FMTF9NQVNLCQkoVkFSU1lNX1BST0NfTUFTS3xWQVJTWU1f VVNFUl9NQVNLfFZBUlNZTV9TWVNfTUFTS3xWQVJTWU1fUFBST0NfTUFTSykKKworI2RlZmlu ZSBNQVhWQVJTWU1fTkFNRQk2NAorI2RlZmluZSBNQVhWQVJTWU1fREFUQQkyNTYKKyNkZWZp bmUgTUFYVkFSU1lNX1NFVAk4MTkyCisKKyNpZmRlZiBfS0VSTkVMCisKK3ZvaWQJdmFyc3lt c2V0X2luaXQoc3RydWN0IHZhcnN5bXNldCAqdmFyc3ltc2V0LCBzdHJ1Y3QgdmFyc3ltc2V0 ICpjb3B5KTsKK3ZvaWQJdmFyc3ltc2V0X2NsZWFuKHN0cnVjdCB2YXJzeW1zZXQgKnZhcnN5 bXNldCk7CitpbnQJdmFyc3ltcmVwbGFjZShjaGFyICpjcCwgaW50IGxpbmtsZW4sIGludCBt YXhsZW4pOworCisjZW5kaWYJLyogX0tFUk5FTCAqLworCisjZW5kaWYKZGlmZiAtVTMgLU4g c3JjL2Jpbi92YXJzeW0vTWFrZWZpbGUgc3JjL2Jpbi92YXJzeW0vTWFrZWZpbGUKLS0tIHNy Yy9iaW4vdmFyc3ltL01ha2VmaWxlCVdlZCBEZWMgMzEgMTk6MDA6MDAgMTk2OQorKysgc3Jj L2Jpbi92YXJzeW0vTWFrZWZpbGUJRnJpIEZlYiAgMyAxMzowNTo0NCAyMDA2CkBAIC0wLDAg KzEsNiBAQAorIyAkRnJlZUJTRCQKKyMgJERyYWdvbkZseTogc3JjL2Jpbi92YXJzeW0vTWFr ZWZpbGUsdiAxLjQgMjAwNS8wMi8wNiAwNjoxNjo0MCBva3Vtb3RvIEV4cCAkCisKK1BST0c9 CXZhcnN5bQorCisuaW5jbHVkZSA8YnNkLnByb2cubWs+CmRpZmYgLVUzIC1OIHNyYy9iaW4v dmFyc3ltL3ZhcnN5bS4xIHNyYy9iaW4vdmFyc3ltL3ZhcnN5bS4xCi0tLSBzcmMvYmluL3Zh cnN5bS92YXJzeW0uMQlXZWQgRGVjIDMxIDE5OjAwOjAwIDE5NjkKKysrIHNyYy9iaW4vdmFy c3ltL3ZhcnN5bS4xCUZyaSBGZWIgIDMgMTM6MTM6MTAgMjAwNgpAQCAtMCwwICsxLDEzMCBA QAorLlwiIENvcHlyaWdodCAoYykgMjAwMyBNYXR0aGV3IERpbGxvbiA8ZGlsbG9uQGJhY2tw bGFuZS5jb20+CisuXCIgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy5cIgorLlwiIE1vZGlmaWVk IGJ5IEFuZHJleSBWLiBFbHN1a292IDxidTdjaGVyQHlhbmRleC5ydT4KKy5cIgorLlwiIFJl ZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGgg b3Igd2l0aG91dAorLlwiIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0 aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworLlwiIGFyZSBtZXQ6CisuXCIgMS4gUmVk aXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5 cmlnaHQKKy5cIiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUg Zm9sbG93aW5nIGRpc2NsYWltZXIuCisuXCIgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFy eSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy5cIiAgICBub3Rp Y2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWlt ZXIgaW4gdGhlCisuXCIgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxz IHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy5cIgorLlwiIFRISVMgU09GVFdB UkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMn JyBBTkQKKy5cIiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElO RywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKy5cIiBJTVBMSUVEIFdBUlJBTlRJRVMgT0Yg TUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQor LlwiIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBD T05UUklCVVRPUlMgQkUgTElBQkxFCisuXCIgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJ TkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKy5cIiBE QU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0Yg U1VCU1RJVFVURSBHT09EUworLlwiIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwg T1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorLlwiIEhPV0VWRVIgQ0FV U0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFD VCwgU1RSSUNUCisuXCIgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5D RSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorLlwiIE9VVCBPRiBUSEUgVVNF IE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkg T0YKKy5cIiBTVUNIIERBTUFHRS4KKy5cIgorLlwiICRGcmVlQlNEJAorLlwiICREcmFnb25G bHk6IHNyYy9iaW4vdmFyc3ltL3ZhcnN5bS4xLHYgMS40IDIwMDUvMDgvMDEgMDE6NDk6MTYg c3dpbGRuZXIgRXhwICQKKy5cIgorLkRkIE5vdiA1LCAyMDAzCisuRHQgVkFSU1lNIDEKKy5P cworLlNoIE5BTUUKKy5ObSB2YXJzeW0KKy5OZCBnZXQgYW5kIHNldCB1c2VyIGFuZCBzeXN0 ZW0td2lkZSB2YXJpYWJsZXMgZm9yIHZhcmlhbnQgc3ltbGlua3MKKy5TaCBTWU5PUFNJUwor Lk5tCisuT3AgRmwgQWFkUHBxc3YKKy5PcCBGbCBqIEFyIHByaXNvbl9pZAorLk9wIEZsIHUg QXIgdXNlcl9uYW1lIHwgdXNlcl9pZAorLkFyIHZhcls9ZGF0YV0KKy5TaCBERVNDUklQVElP TgorVGhlCisuTm0KK3Byb2dyYW0gbWFuYWdlcyB1c2VyIGFuZCBzeXN0ZW0td2lkZSB2YXJp YWJsZXMuICBUaGVzZSB2YXJpYWJsZXMgYXJlIHR5cGljYWxseQordXNlZCBieSB0aGUgc3lz dGVtIHRvIHJlc29sdmUgdmFyaWFudCBzeW1saW5rcyBidXQgbWF5IGFsc28gYmUgdXNlZCBn ZW5lcmFsbHkuCisuUHAKK0ZvciBlYWNoIG9wZXJhbmQgc2V0LCBtb2RpZnksIHJldHJpZXZl LCBvciBkZWxldGUgdGhlIHNwZWNpZmllZCB2YXJpYWJsZS4KK0J5IGRlZmF1bHQgdmFyaWFi bGVzIHNwZWNpZmllZCB3aXRob3V0IGRhdGEgYXJlIHJldHJpZXZlZCBhbmQgdmFyaWFibGVz CitzcGVjaWZpZWQgd2l0aCBkYXRhIGFyZSBzZXQuICBWYXJpYWJsZXMgbWF5IGJlIHNldCB0 byBlbXB0eS4KKy5CbCAtdGFnIC13aWR0aCBBcgorLkl0IEZsIGEKK0xpc3QgYWxsIHZhcmlh YmxlcyBhdCB0aGUgc3BlY2lmaWVkIGxldmVsLiAgTm90ZSB0aGF0IHBlci11c2VyIHZhcmlh Ymxlcworb3ZlcnJpZGUgc3lzdGVtLXdpZGUgdmFyaWFibGVzLiAgQnkgZGVmYXVsdCwgcGVy LXVzZXIgdmFyaWFibGVzIGFyZSBsaXN0ZWQuIAorSW4gdGhlIGphaWwgb25seSBzeXN0ZW0t d2lkZSB2YXJpYWJsZXMgYXJlIGxpc3RlZC4KKy5JdCBGbCBBCitMaXN0IGFsbCB2YXJpYWJs ZXMgYXQgYWxsIGxldmVscyBpbiB0aGUgb3JkZXIgdGhleSB3b3VsZCBiZSBmb3VuZC4gVGhl CisuRmwgdgorb3B0aW9uIHdpbGwgc2hvdyB0aGUgbGV2ZWwgZnJvbSB3aGljaCBlYWNoIHZh cmlhYmxlIGNhbWUgdXNpbmcgdGhlCitQLCBwLCBzIG9yIHUgcHJlZml4IGNoYXJhY3RlcnMu CisuSXQgRmwgZAorRGVsZXRlIG1vZGUuICBUaGUgc3BlY2lmaWVkIHZhcmlhYmxlcyBhcmUg ZGVsZXRlZC4gIEFueSBzcGVjaWZpZWQgZGF0YSBpcworaWdub3JlZC4KKy5JdCBGbCBqIEFy IHByaXNvbl9pZAorVGhpcyBvcHRpb24gY2F1c2VzIHZhcmlhYmxlcyB0byBiZSBzZXQgc3lz dGV0bS13aWRlIGFuZCByZXN0cmljdHMgcmV0cmlldmFscwordG8gc3lzdGVtLXNwZWNpZmlj IHZhcmlhYmxlcyBmb3IgamFpbGVkIGVudmlyb25tZW50IHdpdGggaWQgCisuQ20gcHJpc29u X2lkIE5zIC4KK05vdGUgdGhhdCAKKy5GbCBqCitvcHRpb24gaXMgbXV0dWFsbHkgZXhjbHVz aXZlIHdpdGgKKy5GbCB1CitvcHRpb24uCisuSXQgRmwgcAorVGhpcyBvcHRpb24gY2F1c2Vz IHZhcmlhYmxlcyB0byBiZSBzZXQgb24gYSBwZXItcHJvY2VzcyBiYXNpcyBhbmQgcmVzdHJp Y3RzCityZXRyaWV2YWxzIHRvIHByb2Nlc3Mtc3BlY2lmaWMgdmFyaWFibGVzLiAgTm90ZSB0 aGF0IHNpbmNlCisuTm0KK2lzIHJ1biBhcyBpdHMgb3duIHByb2Nlc3MsIHVzaW5nIHRoaXMg b3B0aW9uIHRvIHNldCBhIHZhcmlhYmxlIHdpbGwgbm90CithZmZlY3QgeW91ciBzaGVsbCdz IG5hbWVzcGFjZS4KKy5JdCBGbCBQCitUaGlzIG9wdGlvbiBjYXVzZXMgdmFyaWFibGVzIHRv IGJlIHNldCBpbiB0aGUgcGFyZW50IHByb2Nlc3MgKGkuZS4gc2hlbGwpCisuSXQgRmwgcQor UXVpZXQgbW9kZS4gIFdoZW4gcmV0cmlldmluZyBhIHZhcmlhYmxlIG9ubHkgaXRzIGRhdGEg aXMgcHJpbnRlZC4KKy5JdCBGbCBzCitUaGlzIG9wdGlvbiBjYXVzZXMgdmFyaWFibGVzIHRv IGJlIHNldCBzeXN0ZW0td2lkZSBhbmQgcmVzdHJpY3RzIHJldHJpZXZhbHMKK3RvIHN5c3Rl bS1zcGVjaWZpYyB2YXJpYWJsZXMuIEVhY2ggamFpbCBoYXZlIG93biBgYGxvY2FsJycgc3lz dGVtLXdpZGUgCit2YXJpYWJsZXMuCisuSXQgRmwgdSBBciB1c2VyX25hbWUgfCB1c2VyX2lk CitUaGlzIG9wdGlvbiBjYXVzZXMgdmFyaWFibGVzIHRvIGJlIHNldCBvbiBhIHBlci11c2Vy LWlkIGJhc2lzIGFuZCByZXN0cmljdHMKK3JldHJpZXZhbHMgdG8gdXNlci1zcGVjaWZpYyB2 YXJpYWJsZXMgZm9yIHVzZXIgc3BlY2lmaWVkIGFzCisuQ20gdXNlcl9uYW1lIE5zIAorIG9y CisuQ20gdXNlcl9pZCBOcyAuICBVbnByaXZpbGVnZWQgdXNlciBjYW4gc2V0IG9yIHJlYWQg b25seSBvd24gdmFyaWFibGVzLCBhbmQKK2Nhbid0IHVzZSB0aGlzIG9wdGlvbi4gCisuRWwK Ky5TaCBSRVRVUk4gVkFMVUVTCitUaGUKKy5ObQordXRpbGl0eSBleGl0cyB3aXRoIG9uZSBv ZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKy5CbCAtdGFnIC13aWR0aCBEcworLkl0IDAKK05v IGVycm9ycyBvY2N1cmVkLgorLkl0IDEKK0EgcmVxdWVzdGVkIHZhcmlhYmxlIGNvdWxkIG5v dCBiZSBmb3VuZAorLkl0IDIKK0EgcmVxdWVzdGVkIHZhcmlhYmxlIGNvdWxkIG5vdCBiZSBz ZXQKKy5FbAorLlNoIEVYQU1QTEVTCisuUHAKK0NyZWF0ZSBhIHBhcmVudCB2YXJpYWJsZSBm dWJhci4gVGhpcyB2YXJpYWJsZSB3aWxsIHRoZW4gYmUgaW5oZXJpdGVkIGJ5IAorYW55IGZ1 dHVyZSBleGVjdXRpb25zIGluIHRoaXMgc2hlbGwuCisuUHAKKy5EMSBMaSAidmFyc3ltIC1Q IGZ1YmFyPXh4IgorLlBwCitDcmVhdGUgYSB1c2VyIHZhcmlhYmxlIGZ1YmFyLgorLlBwCisu RDEgTGkgInZhcnN5bSBmdWJhcj14eCIKKy5QcAorTGlzdCBhbGwgdXNlciB2YXJpYWJsZXMg ZGVmaW5lZAorLlBwCisuRDEgTGkgInZhcnN5bSAtYSIKKy5QcAorTGlzdCBhbGwgdmFyaWFi bGVzIGRlZmluZWQgYW55d2hlcmUKKy5QcAorLkQxIExpICJ2YXJzeW0gLUEiCisuUHAKK0xp c3QgdW5pcXVlIHZhcmlhYmxlcyBkZWZpbmVkCisuUHAKKy5EMSBMaSAidmFyc3ltIC1BfHNv cnQgLXUgLXQ9IC1rMSwxIgorLlNoIFNFRSBBTFNPCisuWHIgbG4gMSAsCmRpZmYgLVUzIC1O IHNyYy9iaW4vdmFyc3ltL3ZhcnN5bS5jIHNyYy9iaW4vdmFyc3ltL3ZhcnN5bS5jCi0tLSBz cmMvYmluL3ZhcnN5bS92YXJzeW0uYwlXZWQgRGVjIDMxIDE5OjAwOjAwIDE5NjkKKysrIHNy Yy9iaW4vdmFyc3ltL3ZhcnN5bS5jCUZyaSBGZWIgIDMgMTM6MDU6NDQgMjAwNgpAQCAtMCww ICsxLDI2MSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMyBNYXR0aGV3IERpbGxvbiA8 ZGlsbG9uQGJhY2twbGFuZS5jb20+CisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAq IE1vZGlmaWVkIGJ5IEFuZHJleSBWLiBFbHN1a292IDxidTdjaGVyQHlhbmRleC5ydT4KKyAq CisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1z LCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92 aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEu IFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUg Y29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0 aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmlu YXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90 aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFp bWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxz IHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJF IElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycg QU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywg QlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJD SEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBB UkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJ QlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVO VEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMg KElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElU VVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJ VFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBP TiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNU CisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVS V0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNP RlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNI IERBTUFHRS4KKyAqCisgKiAkRnJlZUJTRCQKKyAqICREcmFnb25GbHk6IHNyYy9iaW4vdmFy c3ltL3ZhcnN5bS5jLHYgMS40IDIwMDMvMTIvMTEgMjA6MzM6NDkgZGlsbG9uIEV4cCAkCisg Ki8KKworI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgorI2luY2x1ZGUgPHN5cy9qYWlsLmg+Cisj aW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3N5c2N0bC5oPgorI2luY2x1 ZGUgPHN5cy92YXJzeW0uaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxp Yi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGVyci5oPgorI2luY2x1ZGUg PHVuaXN0ZC5oPgorI2luY2x1ZGUgPHB3ZC5oPgorCitzdGF0aWMgdm9pZAl1c2FnZSh2b2lk KTsKK3N0YXRpYyB2b2lkCWR1bXB2YXJzKGNoYXIgKmJ1ZiwgaW50IGJ5dGVzLCBjb25zdCBj aGFyICpwcmVmaXgpOworc3RhdGljIGludAlsaXN0dmFycyhpbnQgbGV2ZWwsIGNvbnN0IGNo YXIgKnByZWZpeCk7CitzdGF0aWMgaW50CWphaWxlZCh2b2lkKTsKKworaW50IGlzX3Jvb3Qg PSAwOworaW50IGlzX2phaWwgPSAwOworCitpbnQKK21haW4oaW50IGFjLCBjaGFyICoqYXYp Cit7CisJaW50IGksIGVycm9yOworCXNpemVfdCBzaXplOworCWNvbnN0IGNoYXIqIG9wczsK KwlpbnQgbWFzayA9ICBWQVJTWU1fQUxMX01BU0s7CisJaW50IGxldmVsID0gVkFSU1lNX1VT RVI7CisJaW50IGRlbGV0ZU9wdCA9IDA7CisJaW50IHZlcmJvc2VPcHQgPSAwOworCWludCBh bGxPcHQgPSAwOworCWludCBqaWQgPSAwOworCisJaXNfcm9vdCA9IChnZXR1aWQoKSA9PSAw KTsKKwlpc19qYWlsID0gamFpbGVkKCk7CisKKwlpZiAoaXNfamFpbCkgeworCQkvKiAKKwkJ ICogcGVyLXVzZXIgdmFyc3ltcyBub3QgYWxsb3dlZCBpbiBqYWlsCisJCSAqIFNvIHdlIHJl bW92ZSBmcm9tIG1hc2sgVkFSU1lNX1VTRVJfTUFTSworCQkgKiBhbmQgc2V0IFZBUlNZTV9T WVMgbGV2ZWwgYXMgZGVmYXVsdC4KKwkJICovCisJCW1hc2sgJj0gflZBUlNZTV9VU0VSX01B U0s7CisJCWxldmVsID0gVkFSU1lNX1NZUzsKKwl9CisJaWYgKGlzX2phaWwgfHwgIWlzX3Jv b3QpCisJCW9wcyA9ICJBYWRoUHBxc3YiOworCWVsc2UKKwkJb3BzID0gIkFhZGhqOlBwcXN1 OnYiOworCXdoaWxlICgoaSA9IGdldG9wdChhYywgYXYsIG9wcykpICE9IC0xKSB7CisJCXN3 aXRjaCAoaSkgeworCQljYXNlICdhJzoKKwkJCWFsbE9wdCA9IDE7CisJCQlicmVhazsKKwkJ Y2FzZSAnQSc6CisJCQlhbGxPcHQgPSAyOworCQkJYnJlYWs7CisJCWNhc2UgJ2QnOgorCQkJ ZGVsZXRlT3B0ID0gMTsKKwkJCWJyZWFrOworCQljYXNlICdxJzoKKwkJCXZlcmJvc2VPcHQg PSAwOworCQkJYnJlYWs7CisJCWNhc2UgJ2onOgorCQkJamlkID0gKGludClzdHJ0b2wob3B0 YXJnLCBOVUxMLCAxMCk7CisJCQllcnJvciA9IGphaWxfYXR0YWNoKGppZCk7CisJCQlpZiAo ZXJyb3IpCisJCQkJZXJyKDIsICJqYWlsX2F0dGFjaCgpOiAlZCIsIGppZCk7CisJCWNhc2Ug J1AnOgorCQkJbGV2ZWwgPSBWQVJTWU1fUFBST0M7CisJCQltYXNrID0gVkFSU1lNX1BQUk9D X01BU0s7CisJCQlicmVhazsKKwkJY2FzZSAncCc6CisJCQlsZXZlbCA9IFZBUlNZTV9QUk9D OworCQkJbWFzayA9IFZBUlNZTV9QUk9DX01BU0s7CisJCQlicmVhazsKKwkJY2FzZSAncyc6 CisJCQltYXNrID0gVkFSU1lNX1NZU19NQVNLOworCQkJbGV2ZWwgPSBWQVJTWU1fU1lTOwor CQkJYnJlYWs7CisJCWNhc2UgJ3UnOiB7CisJCQkJdWlkX3QJdWlkOworCQkJCXN0cnVjdAlw YXNzd2QJKnB3OworCQkJCWlmIChqaWQpIHsKKwkJCQkJdXNhZ2UoKTsKKwkJCQkJcmV0dXJu KDEpOworCQkJCX0KKwkJCQlwdyA9IGdldHB3bmFtKG9wdGFyZyk7CisJCQkJaWYgKHB3ID09 IE5VTEwpCisJCQkJCXVpZCA9ICh1aWRfdClzdHJ0b2wob3B0YXJnLCBOVUxMLCAxMCk7CisJ CQkJZWxzZQorCQkJCQl1aWQgPSBwdy0+cHdfdWlkOworCQkJCWVycm9yID0gc2V0dWlkKHVp ZCk7CisJCQkJaWYgKGVycm9yKQorCQkJCQllcnIoMSwgInNldHVpZCgpIik7CisJCQkJbWFz ayA9IFZBUlNZTV9VU0VSX01BU0s7CisJCQkJbGV2ZWwgPSBWQVJTWU1fVVNFUjsKKwkJCX0K KwkJCWJyZWFrOworCQljYXNlICd2JzoKKwkJCXZlcmJvc2VPcHQgPSAxOworCQkJYnJlYWs7 CisJCWNhc2UgJ2gnOgorCQlkZWZhdWx0OgorCQkJdXNhZ2UoKTsKKwkJCXJldHVybigxKTsK KwkJfQorCX0KKwlhYyAtPSBvcHRpbmQ7CisJYXYgKz0gb3B0aW5kOworCisJaWYgKGFsbE9w dCkgeworCQlpZiAoYWxsT3B0ID4gMSkgeworCQkJLyogcHJvY2VzcyB2YXJpYWJsZXMgaW4g b3JkZXIgdGhleSBhcmUgc2VhcmNoZWQgKi8KKwkJCWVycm9yID0gbGlzdHZhcnMoVkFSU1lN X1BST0MsIHZlcmJvc2VPcHQ/InAiOiIiKTsKKwkJCWVycm9yID0gbGlzdHZhcnMoVkFSU1lN X1BQUk9DLCB2ZXJib3NlT3B0PyJQIjoiIik7CisJCQllcnJvciA9IGxpc3R2YXJzKFZBUlNZ TV9VU0VSLCB2ZXJib3NlT3B0PyJ1IjoiIik7CisJCQllcnJvciA9IGxpc3R2YXJzKFZBUlNZ TV9TWVMsIHZlcmJvc2VPcHQ/InMiOiIiKTsKKwkJfQorCQllbHNlIHsKKwkJCWVycm9yID0g bGlzdHZhcnMobGV2ZWwsICIiKTsKKwkJfQorCQlpZiAoZXJyb3IgPCAwKQorCQkJd2Fybigi dmFyc3ltX2xpc3QoKSIpOworCX0gZWxzZSBpZiAoYWMgPT0gMCkgeworCQl1c2FnZSgpOwor CQlyZXR1cm4oMSk7CisJfQorCisJd2hpbGUgKGFjID4gMCkgeworCQljaGFyICpuYW1lID0g YXZbMF07CisJCWNoYXIgKmRhdGEgPSBzdHJjaHIobmFtZSwgJz0nKTsKKwkJY2hhciBidWZb TUFYVkFSU1lNX0RBVEFdOworCisJCWlmIChkYXRhKQorCQkJKmRhdGErKyA9IDA7CisKKwkJ aWYgKGRlbGV0ZU9wdCkgeworCQkJZXJyb3IgPSB2YXJzeW1fc2V0KGxldmVsLCBuYW1lLCBO VUxMKTsKKwkJfQorCQllbHNlIGlmIChkYXRhKSB7CisJCQllcnJvciA9IHZhcnN5bV9zZXQo bGV2ZWwsIG5hbWUsIGRhdGEpOworCQl9CisJCWVsc2UgeworCQkJc2l6ZSA9IHNpemVvZihi dWYpOworCQkJZXJyb3IgPSB2YXJzeW1fZ2V0KG1hc2ssIG5hbWUsIGJ1ZiwgKGludCAqKSZz aXplKTsKKwkJCWlmIChlcnJvciA9PSAwICYmIHNpemUgPD0gKGludClzaXplb2YoYnVmKSkg eworCQkJCWlmICh2ZXJib3NlT3B0KQorCQkJCQlwcmludGYoIiVzPSIsIG5hbWUpOworCQkJ CXByaW50ZigiJXNcbiIsIGJ1Zik7CisJCQl9CisJCX0KKwkJaWYgKGVycm9yICE9IDAgJiYg dmVyYm9zZU9wdCkKKwkJCXdhcm4oIiVzIiwgbmFtZSk7CisJCWF2Kys7IGFjLS07CisJfQor CisJcmV0dXJuKDApOworfQorCitzdGF0aWMgdm9pZAorZHVtcHZhcnMoY2hhciAqYnVmLCBp bnQgYnl0ZXMsIGNvbnN0IGNoYXIgKnByZWZpeCkKK3sKKyAgICBpbnQgYjsKKyAgICBpbnQg aTsKKyAgICBjaGFyICp2bmFtZSA9IE5VTEw7CisgICAgY2hhciAqdmRhdGEgPSBOVUxMOwor CisgICAgZm9yIChiID0gaSA9IDA7IGkgPCBieXRlczsgKytpKSB7CisJaWYgKGJ1ZltpXSA9 PSAwKSB7CisJICAgIGlmICh2bmFtZSA9PSBOVUxMKSB7CisJCQl2bmFtZSA9IGJ1ZiArIGI7 CisJICAgIH0gZWxzZSB7CisJCQl2ZGF0YSA9IGJ1ZiArIGI7CisJCQlpZiAocHJlZml4ICYm ICpwcmVmaXgpCisJCQkJcHJpbnRmKCIlczolcz0lc1xuIiwgcHJlZml4LCB2bmFtZSwgdmRh dGEpOworCQkJZWxzZQorCQkJCXByaW50ZigiJXM9JXNcbiIsIHZuYW1lLCB2ZGF0YSk7CisJ CQl2bmFtZSA9IHZkYXRhID0gTlVMTDsKKwkgICAgfQorCSAgICBiID0gaSArIDE7CisJfQor ICAgIH0KK30KKworc3RhdGljIGludAorbGlzdHZhcnMoaW50IGxldmVsLCBjb25zdCBjaGFy ICpwcmVmaXgpCit7CisgICAgaW50IG1hcmtlciA9IDA7CisgICAgY2hhciBidWZbMTAyNF07 CisgICAgaW50IHNpemUgPSBzaXplb2YoYnVmKTsKKyAgICBpbnQgZXJyb3I9MDsKKworICAg IGZvciAoOzspIHsKKwlzaXplID0gc2l6ZW9mKGJ1Zik7CQorCWVycm9yID0gdmFyc3ltX2xp c3QobGV2ZWwsIGJ1ZiwgKGludCAqKSZzaXplLAorCQkmbWFya2VyKTsKKwlpZiAoZXJyb3Ig PCAwKQkJLyogZXJyb3Igb2NjdXJlZCAqLworCQlicmVhazsKKwlkdW1wdmFycyhidWYsIHNp emUsIHByZWZpeCk7CisJaWYgKG1hcmtlciA8IDApCQkvKiBubyBtb3JlIHZhcnMgKi8KKwkJ YnJlYWs7CisgICAgfQorICAgIHJldHVybihlcnJvcik7Cit9CisKK3N0YXRpYyB2b2lkCit1 c2FnZSh2b2lkKQoreworCWNvbnN0IGNoYXIgKnN0cjsKKwlpZiAoaXNfamFpbCB8fCAhaXNf cm9vdCkKKwkJc3RyID0gIlVzYWdlOiB2YXJzeW06IFstYUFwUHFkc10gdmFyWz1kYXRhXVxu IjsKKwllbHNlCisJCXN0ciA9ICJVc2FnZTogdmFyc3ltOiBbLWFBcFBxZHNdIFstdSB1c2Vy X2lkIHwgdXNlcl9uYW1lXVxuIiAKKwkJCSAgIiAgICAgICBbLWogcHJpc29uX2lkXSB2YXJb PWRhdGFdXG4iCisJCQkgICJOb3RlOiAtaiBhbmQgLXUgb3B0aW9ucyBpcyBtdXR1YWxseSBl eGNsdXNpdmVcbiI7CQorCWZwcmludGYoc3RkZXJyLCBzdHIpOworfQorCitzdGF0aWMgaW50 CQoramFpbGVkKHZvaWQpCit7CisJaW50CWosIGVycm9yOworCXNpemVfdCBzaXplID0gc2l6 ZW9mKGopOworCWVycm9yID0gc3lzY3RsYnluYW1lKCJzZWN1cml0eS5qYWlsLmphaWxlZCIs IAorCQkJCQkmaiwgJnNpemUsIE5VTEwsIDApOworCWlmIChlcnJvcikKKwkJZXJyKDIsICJz eXNjdGxieW5hbWUoKSIpOworCXJldHVybihqKTsKK30KZGlmZiAtVTMgc3JjL2V0Yy9kZWZh dWx0cy9yYy5jb25mIHNyYy9ldGMvZGVmYXVsdHMvcmMuY29uZgotLS0gc3JjL2V0Yy9kZWZh dWx0cy9yYy5jb25mCVN1biBPY3QgMTUgMTQ6MjI6MTcgMjAwNgorKysgc3JjL2V0Yy9kZWZh dWx0cy9yYy5jb25mCVRodSBBdWcgMzAgMTg6NTk6MDMgMjAwNwpAQCAtNTU5LDYgKzU1OSw4 IEBACiBuZXdzeXNsb2dfZW5hYmxlPSJZRVMiCSMgUnVuIG5ld3N5c2xvZyBhdCBzdGFydHVw LgogbmV3c3lzbG9nX2ZsYWdzPSItQ04iCSMgTmV3c3lzbG9nIGZsYWdzIHRvIGNyZWF0ZSBt YXJrZWQgZmlsZXMKIAordmFyc3ltX2VuYWJsZT0iTk8iICAgICAgIyB2YXJpYW50IHN5bWxp bmtzIGlzIGRpc2FibGVkIGJ5IGRlZmF1bHQKKwogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICMjIyBKYWlsIENvbmZp Z3VyYXRpb24gIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIwpkaWZmIC1VMyAtTiBzcmMvZXRjL3JjLmQvdmFyc3ltIHNyYy9ldGMvcmMuZC92YXJz eW0KLS0tIHNyYy9ldGMvcmMuZC92YXJzeW0JV2VkIERlYyAzMSAxOTowMDowMCAxOTY5Cisr KyBzcmMvZXRjL3JjLmQvdmFyc3ltCVRodSBBdWcgMzAgMTg6NTk6MDMgMjAwNwpAQCAtMCww ICsxLDMzIEBACisjIS9iaW4vc2gKKyMKKworIyBQUk9WSURFOiB2YXJzeW0KKworLiAvZXRj L3JjLnN1YnIKKworbmFtZT0idmFyc3ltIgorcmN2YXI9YHNldF9yY3ZhcmAKK29pZD0idmZz LnZhcnN5bV9lbmFibGUiCisKK3N0YXJ0X2NtZD0iL3NiaW4vc3lzY3RsICRvaWQ9MSIKK3N0 b3BfY21kPSIvc2Jpbi9zeXNjdGwgJG9pZD0wIgorCisjCisjIGhhbmRsZSBzdGF0dXMgaGVy ZSBzaW5jZSByYy5zdWJyIGRvZXNuJ3QgYWxsb3cgaXQKKyMKK2Nhc2UgJDEgaW4KK3N0YXR1 cykKKyAgIGNhc2UgYC9zYmluL3N5c2N0bCAtbiAkb2lkYCBpbgorICAgMSkKKyAgICAgIGVj aG8gJG5hbWUgaXMgZW5hYmxlZC4KKyAgICAgIHJldHVybiAwCisgICAgICA7OworICAgMCkK KyAgICAgIGVjaG8gJG5hbWUgaXMgZGlzYWJsZWQuCisgICBlc2FjCisgICByZXR1cm4gMQor ICAgOzsKK2VzYWMKKworbG9hZF9yY19jb25maWcgJG5hbWUKK3J1bl9yY19jb21tYW5kICIk MSIKZGlmZiAtVTMgLU4gc3JjL2V0Yy9yYy5kL01ha2VmaWxlIHNyYy9ldGMvcmMuZC9NYWtl ZmlsZQotLS0gc3JjL2V0Yy9yYy5kL01ha2VmaWxlCTIwMDgtMDQtMjQgMTc6MjY6MzMuMDAw MDAwMDAwICswMDAwCisrKyBzcmMvZXRjL3JjLmQvTWFrZWZpbGUJMjAwOC0wNC0yNCAxNzoy Njo0MS4wMDAwMDAwMDAgKzAwMDAKQEAgLTM2LDcgKzM2LDcgQEAKIAlzeXNjb25zIHN5c2N0 bCBzeXNsb2dkIFwKIAl0aW1lZCB0bXAgXAogCXVnaWRmdyBcCi0JdmFyIHZpcmVjb3ZlciBc CisJdmFyIHZhcnN5bSB2aXJlY292ZXIgXAogCXdhdGNoZG9nZCB3cGFfc3VwcGxpY2FudCBc CiAJeXBiaW5kIHlwcGFzc3dkZCB5cHNlcnYgXAogCXlwc2V0IHlwdXBkYXRlZCB5cHhmcmQg XApkaWZmIC1VMyAtTiBzcmMvbGliL2xpYmMvc3lzL1N5bWJvbC5tYXAub3JpZyBzcmMvbGli L2xpYmMvc3lzL1N5bWJvbC5tYXAKLS0tIHNyYy9saWIvbGliYy9zeXMvU3ltYm9sLm1hcC5v cmlnCTIwMDgtMDQtMjQgMTg6NDk6MTQuMDAwMDAwMDAwICswMDAwCisrKyBzcmMvbGliL2xp YmMvc3lzL1N5bWJvbC5tYXAJMjAwOC0wNC0yNCAxODo1MTo0Ni4wMDAwMDAwMDAgKzAwMDAK QEAgLTMyMiw2ICszMjIsOSBAQAogCXV0cmFjZTsKIAl1dWlkZ2VuOwogCXZhZHZpc2U7CisJ dmFyc3ltX3NldDsKKwl2YXJzeW1fZ2V0OworCXZhcnN5bV9saXN0OwogCXdhaXQ0OwogCXdy aXRlOwogCXdyaXRldjsKQEAgLTk1Niw2ICs5NTksMTIgQEAKIAlfX3N5c191dWlkZ2VuOwog CV92YWR2aXNlOwogCV9fc3lzX3ZhZHZpc2U7CisJX3ZhcnN5bV9zZXQ7CisJX19zeXNfdmFy c3ltX3NldDsKKwlfdmFyc3ltX2dldDsKKwlfX3N5c192YXJzeW1fZ2V0OworCV92YXJzeW1f bGlzdDsKKwlfX3N5c192YXJzeW1fbGlzdDsKIAlfd2FpdDQ7CiAJX19zeXNfd2FpdDQ7CiAJ X3dyaXRlOwo= --------------010404020304060805040407 Content-Type: application/octet-stream; name="Makefile" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="Makefile" IyAkSWQ6IE1ha2VmaWxlLHYgMS4xIDIwMDgvMDMvMDEgMDI6MDk6MzUgc2FzZHJxIEV4cCAk CiMKIyAKCiMgYSBsaXN0IG9mIHBhdGNoIGZpbGVzIGZvciAvdXNyIHNvdXJjZSB0cmVlClBB VENIRVMgICE9IGVjaG8gKi5wYXRjaAoKIyB3ZXJlIHdlIG5lZWQgdG8gYmUgdG8gcnVuIHRo aXMKSU5TVERJUiA9IC91c3IKQ1VSRElSICE9IHB3ZAoKbGlzdDoKCUBlY2hvICJtYWtlIHBh dGNoIiAtIHRvIHBhdGNoIHNvdXJjZSBhbmQgdXBkYXRlIHN5c2N0bC5jb25mCgpwYXRjaDog IHBhdGNoZXMgc3lzZW50CgojIHVzZSB0aGUgLXAgb3B0aW9uIG9mIHBhdGNoIHRvIGNhdXNl IGFueSBuZXcgZGlyZWN0b3JpZXMgdG8gYmUgY3JlYXRlZApwYXRjaGVzOgoJQGNkICR7SU5T VERJUn07IGxpc3Q9IiR7UEFUQ0hFU30iOyBmb3IgcGF0Y2ggaW4gJCRsaXN0OyBkbyBcCgkg ICBmaWxlPSR7Q1VSRElSfS8kJHBhdGNoOyAgICAgICAgXAoJICAgaWYgdGVzdCAtZiAkJGZp bGU7IHRoZW4gICAgICAgIFwKCSAgICAgIC91c3IvYmluL3BhdGNoIC1wIDwgJCRmaWxlOyBc CgkgICBlbHNlIDo7IGZpOyAgICAgICAgICAgICAgICAgICAgXAoJZG9uZQoKc3lzZW50OgoJ Y2QgL3Vzci9zcmMvc3lzL2tlcm4gJiYgbWFrZSBzeXNlbnQKCWNkIC91c3Ivc3JjL3N5cy9j b21wYXQvZnJlZWJzZDMyICYmIG1ha2Ugc3lzZW50Cgo= --------------010404020304060805040407--