From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by master.gitmailbox.com (Postfix) with ESMTP id 243FA452CD for ; Tue, 17 Jan 2023 13:46:12 +0000 (UTC) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 2E30D68A5F8; Tue, 17 Jan 2023 15:46:11 +0200 (EET) Received: from mail.hhi.fraunhofer.de (mail.HHI.FRAUNHOFER.DE [193.174.67.45]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id D025268A5F8 for ; Tue, 17 Jan 2023 15:46:04 +0200 (EET) Received: from mail.hhi.fraunhofer.de (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 29BF67C088 for ; Tue, 17 Jan 2023 14:46:04 +0100 (CET) X-IMSS-DKIM-Authentication-Result: mail.hhi.fraunhofer.de; sigcount=0 Received: from mail.hhi.fraunhofer.de (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 12C277C07A for ; Tue, 17 Jan 2023 14:46:04 +0100 (CET) Received: from mx.fe.hhi.de (unknown [172.16.0.105]) by mail.hhi.fraunhofer.de (Postfix) with ESMTPS for ; Tue, 17 Jan 2023 14:46:04 +0100 (CET) Received: from mxsrv2.fe.hhi.de (172.16.0.105) by mxsrv2.fe.hhi.de (172.16.0.105) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.2.1118.21; Tue, 17 Jan 2023 14:46:03 +0100 Received: from mxsrv2.fe.hhi.de ([fe80::a6ac:c6a3:8cbe:4317]) by mxsrv2.fe.hhi.de ([fe80::a6ac:c6a3:8cbe:4317%6]) with mapi id 15.02.1118.021; Tue, 17 Jan 2023 14:46:03 +0100 From: "Helmrich, Christian" To: FFmpeg development discussions and patches Thread-Topic: [FFmpeg-devel] [PATCH] Request for adding XPSNR avfilter Thread-Index: AQHZJSrwOOZOGq7jyUGmIcLheMkTf66YDTMAgAEKYbr///KxAIAAAT8AgABiAvuAAA3jgIAAG/b1gAkRhyk= Date: Tue, 17 Jan 2023 13:46:03 +0000 Message-ID: <9253f80c790940da98d393efbe664cf6@hhi.fraunhofer.de> References: <4a40a9d140aa477fb34cf5704034bd4c@hhi.fraunhofer.de> , , <92d85f933bb4448b904bda17d9541e65@hhi.fraunhofer.de> In-Reply-To: <92d85f933bb4448b904bda17d9541e65@hhi.fraunhofer.de> Accept-Language: de-DE, en-US Content-Language: de-DE X-MS-Has-Attach: yes X-MS-TNEF-Correlator: x-originating-ip: [192.168.22.100] Content-Type: multipart/mixed; boundary="_004_9253f80c790940da98d393efbe664cf6hhifraunhoferde_" MIME-Version: 1.0 X-TM-AS-GCONF: 00 X-Content-Filtered-By: Mailman/MimeDel 2.1.29 Subject: Re: [FFmpeg-devel] [PATCH] Request for adding XPSNR avfilter X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: FFmpeg development discussions and patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: FFmpeg development discussions and patches Cc: "Stoffers, Christian" Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Archived-At: List-Archive: List-Post: --_004_9253f80c790940da98d393efbe664cf6hhifraunhoferde_ Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable > just attach patch with proper authorship, made with git format-patch. Small update, replacing our own MAX( ) define with FFmpeg's existing FFMAX(= ) and adding a v2 to the patch so that, hopefully, the fate pipeline is triggered= now. Best, Christian Helmrich Fraunhofer HHI, Video Coding and Analytics Department ________________________________ Von: ffmpeg-devel im Auftrag von Helmrich= , Christian Gesendet: Mittwoch, 11. Januar 2023 20:15 An: FFmpeg development discussions and patches Cc: Stoffers, Christian Betreff: Re: [FFmpeg-devel] [PATCH] Request for adding XPSNR avfilter Hi, > just attach patch with proper authorship, made with git fformat-patch. Done, attached. Best, Christian Helmrich Fraunhofer HHI, Video Coding and Analytics Department ________________________________ Von: ffmpeg-devel im Auftrag von Paul B M= ahol Gesendet: Mittwoch, 11. Januar 2023 19:33 An: FFmpeg development discussions and patches Cc: Stoffers, Christian Betreff: Re: [FFmpeg-devel] [PATCH] Request for adding XPSNR avfilter On 1/11/23, Helmrich, Christian wrot= e: > Hi, > > >> Also please fix style of code, ... example vf_psnr.c filter ... "for () >> {\n" instead of "for () \n{\n}" > > > Done, I aligned block encapsulation, indentation, and some other things w= ith > those in vf_psnr.c > > >> Compare clang compiled ffmpeg without this asm code and with it, and tel= l >> if any difference. > >> I'might do it anyway later. > > Strange, the asm code is now only barely (a few percent at most) faster t= han > the C-loop code on > our side. Maybe the compilers or CPUs have improved since we last tested? > Anway, we decided > to make a new patch without the asm file, but keep the function pointers = in > case we manage to > write better SIMD for the highds, diff1st, and diff2nd function later (fo= r a > smaller patch then). > > I prepared a new avfilter_xpsnr_v2.patch. Do I need to change the email > (thread) title somehow > so that a new pipeline is being triggered? Not needed, just attach patch with proper authorship, made with git format-patch. > > > Best, > > > Christian Helmrich > > Fraunhofer HHI, Video Coding and Analytics Department > > > ________________________________ > Von: ffmpeg-devel im Auftrag von Paul B > Mahol > Gesendet: Mittwoch, 11. Januar 2023 12:53 > An: FFmpeg development discussions and patches > Cc: Stoffers, Christian > Betreff: Re: [FFmpeg-devel] [PATCH] Request for adding XPSNR avfilter > > On 1/11/23, Paul B Mahol wrote: >> On 1/11/23, Helmrich, Christian >> wrote: >>> Hi, >>> >>> >>>> So its better to use that instead of human written assembly? Does clan= g >>>> generate faster code without this asm? >>> >>> >>> I'm not sure I fully understand your questions, but I hope the followin= g >>> answers it. The reason why we auto-converted our intrinsics code to asm >>> is >>> not a technical one, we unfortunately just don't have the knowledge or >>> resources to manually write asm code. If I remember correctly, the SIMD >>> optimized code runs about twice as fast as the C code, especially on UH= D >>> input. >> >> Compare clang compiled ffmpeg without this asm code and with it, and >> tell if any difference. >> I'might do it anyway later. > > Also please fix style of code, look at other filters in codebase, for > example vf_psnr.c filter > > Use "for () {\n" instead of "for () \n{\n}" > >> >>> >>> >>>> Please remove SLICE_THREADS related flag as there is no call to execut= e >>>> to >>>> filter in slices. Please remove stdbool.h header and adapt code to >>>> compile >>>> without it. >>> >>> >>> Done, please find attached a second version (v1) of the XPSNR avfilter >>> patch. >>> >>> >>> Thanks and best, >>> >>> >>> Christian Helmrich >>> >>> Fraunhofer HHI, Video Coding and Analytics Department >>> >>> >>> ________________________________ >>> Von: ffmpeg-devel im Auftrag von Paul >>> B >>> Mahol >>> Gesendet: Dienstag, 10. Januar 2023 21:43 >>> An: FFmpeg development discussions and patches >>> Cc: Stoffers, Christian >>> Betreff: Re: [FFmpeg-devel] [PATCH] Request for adding XPSNR avfilter >>> >>> On 1/10/23, Helmrich, Christian >>> wrote: >>>> Hi, >>>> >>>> please find attached a patch (relative to FFmpeg master as of early >>>> January >>>> 10, 2023) >>>> adding avfilter support for extended perceptually weighted peak >>>> signal-to-noise ratio >>>> (XPSNR) measurements for videos, as described in the related addition >>>> to >>>> filters.texi. >>>> >>>> The XPSNR code was originally vectorized using SIMD intrinsics, but we >>>> concluded that >>>> FFmpeg code requires asm instead of such intrinsics, so we let gcc >>>> auto-convert these >>> >>> So its better to use that instead of human written assembly? >>> Does clang generate faster code without this asm? >>> >>>> instructions to pure assembly; see the vf_xpsnr.asm file. If the added >>>> asm >>>> code is too >>>> lengthy, intrinsics would be possible, or something else is missing, >>>> please >>>> let us know. >>>> >>> >>> Please remove SLICE_THREADS related flag as there is no call to >>> execute to filter in slices. >>> Please remove stdbool.h header and adapt code to compile without it. >>> >>>> Best, >>>> >>>> Christian Helmrich and Christian Stoffers >>>> Fraunhofer HHI >>>> >>> _______________________________________________ >>> ffmpeg-devel mailing list >>> ffmpeg-devel@ffmpeg.org >>> https://ffmpeg.org/mailman/listinfo/ffmpeg-devel >>> >>> To unsubscribe, visit link above, or email >>> ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe". >>> >> > _______________________________________________ > ffmpeg-devel mailing list > ffmpeg-devel@ffmpeg.org > https://ffmpeg.org/mailman/listinfo/ffmpeg-devel > > To unsubscribe, visit link above, or email > ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe". > _______________________________________________ > ffmpeg-devel mailing list > ffmpeg-devel@ffmpeg.org > https://ffmpeg.org/mailman/listinfo/ffmpeg-devel > > To unsubscribe, visit link above, or email > ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe". > _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe". --_004_9253f80c790940da98d393efbe664cf6hhifraunhoferde_ Content-Type: text/plain; name="v2-0001-avfilter-add-XPSNR-filter.patch" Content-Description: v2-0001-avfilter-add-XPSNR-filter.patch Content-Disposition: attachment; filename="v2-0001-avfilter-add-XPSNR-filter.patch"; size=43961; creation-date="Tue, 17 Jan 2023 13:46:00 GMT"; modification-date="Tue, 17 Jan 2023 13:46:00 GMT" Content-Transfer-Encoding: base64 RnJvbSBmNjM0OWQxNTI0MWY3MDU2ZmU0ZjA4OTlhMzgxOGYwYmUxMDlkOTliIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBDaHJpc3RpYW4gSGVsbXJpY2ggPGNocmlzdGlhbi5oZWxtcmlj aEBoaGkuZnJhdW5ob2Zlci5kZT4KRGF0ZTogVHVlLCAxNyBKYW4gMjAyMyAxNDowMDowMCArMDEw MApTdWJqZWN0OiBbUEFUQ0ggdjJdIGF2ZmlsdGVyOiBhZGQgWFBTTlIgZmlsdGVyCgotLS0KIENo YW5nZWxvZyAgICAgICAgICAgICAgICAgICAgICAgfCAgIDEgKwogZG9jL2ZpbHRlcnMudGV4aSAg ICAgICAgICAgICAgICB8ICA2NyArKysKIGxpYmF2ZmlsdGVyL01ha2VmaWxlICAgICAgICAgICAg fCAgIDEgKwogbGliYXZmaWx0ZXIvYWxsZmlsdGVycy5jICAgICAgICB8ICAgMSArCiBsaWJhdmZp bHRlci92ZXJzaW9uLmggICAgICAgICAgIHwgICAyICstCiBsaWJhdmZpbHRlci92Zl94cHNuci5j ICAgICAgICAgIHwgNzQxICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrCiBsaWJhdmZp bHRlci94ODYvTWFrZWZpbGUgICAgICAgIHwgICAxICsKIGxpYmF2ZmlsdGVyL3g4Ni92Zl94cHNu cl9pbml0LmMgfCAgNDMgKysKIGxpYmF2ZmlsdGVyL3hwc25yLmggICAgICAgICAgICAgfCAgNDcg KysKIDkgZmlsZXMgY2hhbmdlZCwgOTAzIGluc2VydGlvbnMoKyksIDEgZGVsZXRpb24oLSkKIGNy ZWF0ZSBtb2RlIDEwMDY0NCBsaWJhdmZpbHRlci92Zl94cHNuci5jCiBjcmVhdGUgbW9kZSAxMDA2 NDQgbGliYXZmaWx0ZXIveDg2L3ZmX3hwc25yX2luaXQuYwogY3JlYXRlIG1vZGUgMTAwNjQ0IGxp YmF2ZmlsdGVyL3hwc25yLmgKCmRpZmYgLS1naXQgYS9DaGFuZ2Vsb2cgYi9DaGFuZ2Vsb2cKaW5k ZXggNWMwMWU4MzY1ZS4uY2Y5ZDZhYjUxNiAxMDA2NDQKLS0tIGEvQ2hhbmdlbG9nCisrKyBiL0No YW5nZWxvZwpAQCAtMjksNiArMjksNyBAQCB2ZXJzaW9uIDxuZXh0PjoKIC0gY29yciB2aWRlbyBm aWx0ZXIKIC0gYWRyYyBhdWRpbyBmaWx0ZXIKIC0gYWZkZWxheXNyYyBhdWRpbyBmaWx0ZXIKKy0g WFBTTlIgdmlkZW8gZmlsdGVyCiAKIAogdmVyc2lvbiA1LjE6CmRpZmYgLS1naXQgYS9kb2MvZmls dGVycy50ZXhpIGIvZG9jL2ZpbHRlcnMudGV4aQppbmRleCBiZTcwYTIzOTZiLi5kMDUzZGI0YzVj IDEwMDY0NAotLS0gYS9kb2MvZmlsdGVycy50ZXhpCisrKyBiL2RvYy9maWx0ZXJzLnRleGkKQEAg LTE5MTY4LDYgKzE5MTY4LDcgQEAgcHNldWRvY29sb3I9IidpZihiZXR3ZWVuKHZhbCx5bWF4LGFt YXgpLGxlcnAoeW1pbix5bWF4LCh2YWwteW1heCkvKGFtYXgteW1heCkpLC0KIEBlbmQgZXhhbXBs ZQogQGVuZCBpdGVtaXplCiAKK0BhbmNob3J7cHNucn0KIEBzZWN0aW9uIHBzbnIKIAogT2J0YWlu IHRoZSBhdmVyYWdlLCBtYXhpbXVtIGFuZCBtaW5pbXVtIFBTTlIgKFBlYWsgU2lnbmFsIHRvIE5v aXNlCkBAIC0yNDg0Nyw2ICsyNDg0OCw3MiBAQCBtaW5pbXVtIHZhbHVlcywgYW5kIEBjb2RlezF9 IG1heGltdW0gdmFsdWVzLgogCiBUaGlzIGZpbHRlciBzdXBwb3J0cyBhbGwgYWJvdmUgb3B0aW9u cyBhcyBAcmVme2NvbW1hbmRzfSwgZXhjbHVkaW5nIG9wdGlvbiBAY29kZXtpbnB1dHN9LgogCitA c2VjdGlvbiB4cHNucgorCitPYnRhaW4gdGhlIGF2ZXJhZ2UgKGFjcm9zcyBhbGwgaW5wdXQgZnJh bWVzKSBhbmQgbWluaW11bSAoYWNyb3NzIGFsbCBjb2xvciBwbGFuZSBhdmVyYWdlcykKK2VYdGVu ZGVkIFBlcmNlcHR1YWxseSB3ZWlnaHRlZCBwZWFrIFNpZ25hbC10by1Ob2lzZSBSYXRpbyAoWFBT TlIpIGJldHdlZW4gdHdvIGlucHV0IHZpZGVvcy4KKworVGhlIFhQU05SIGlzIGEgbG93LWNvbXBs ZXhpdHkgcHN5Y2hvdmlzdWFsbHkgbW90aXZhdGVkIGRpc3RvcnRpb24gbWVhc3VyZW1lbnQgYWxn b3JpdGhtIGZvcgorYXNzZXNzaW5nIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdHdvIHZpZGVvIHN0 cmVhbXMgb3IgaW1hZ2VzLiBUaGlzIGlzIGVzcGVjaWFsbHkgdXNlZnVsIGZvcgorb2JqZWN0aXZl bHkgcXVhbnRpZnlpbmcgdGhlIGRpc3RvcnRpb25zIGNhdXNlZCBieSB2aWRlbyBhbmQgaW1hZ2Ug Y29kZWNzLCBhcyBhbiBhbHRlcm5hdGl2ZQordG8gYSBmb3JtYWwgc3ViamVjdGl2ZSB0ZXN0LiBU aGUgbG9nYXJpdGhtaWMgWFBTTlIgb3V0cHV0IHZhbHVlcyBhcmUgaW4gYSBzaW1pbGFyIHJhbmdl IGFzCit0aG9zZSBvZiB0cmFkaXRpb25hbCBAcmVme3BzbnJ9IGFzc2Vzc21lbnRzIGJ1dCBiZXR0 ZXIgcmVmbGVjdCBodW1hbiBpbXByZXNzaW9ucyBvZiB2aXN1YWwKK2NvZGluZyBxdWFsaXR5LiBN b3JlIGRldGFpbHMgb24gdGhlIFhQU05SIG1lYXN1cmUsIHdoaWNoIGVzc2VudGlhbGx5IHJlcHJl c2VudHMgYSBibG9ja3dpc2UKK3dlaWdodGVkIHZhcmlhbnQgb2YgdGhlIFBTTlIgbWVhc3VyZSwg Y2FuIGJlIGZvdW5kIGluIHRoZSBmb2xsb3dpbmcgZnJlZWx5IGF2YWlsYWJsZSBwYXBlcnM6CisK K0BpdGVtaXplCitAaXRlbQorQy4gUi4gSGVsbXJpY2gsIE0uIFNpZWttYW5uLCBTLiBCZWNrZXIs IFMuIEJvc3NlLCBELiBNYXJwZSwgYW5kIFQuIFdpZWdhbmQsICJYUFNOUjogQQorTG93LUNvbXBs ZXhpdHkgRXh0ZW5zaW9uIG9mIHRoZSBQZXJjZXB0dWFsbHkgV2VpZ2h0ZWQgUGVhayBTaWduYWwt dG8tTm9pc2UgUmF0aW8gZm9yCitIaWdoLVJlc29sdXRpb24gVmlkZW8gUXVhbGl0eSBBc3Nlc3Nt ZW50LCIgaW4gUHJvYy4gSUVFRSBJbnQuIENvbmYuIEFjb3VzdGljcywgU3BlZWNoLAorU2lnLiBQ cm9jZXNzLiAoSUNBU1NQKSwgdmlydC4vb25saW5lLCBNYXkgMjAyMC4gQHVybHt3d3cuZWNvZGlz LmRlL3hwc25yLmh0bX0KKworQGl0ZW0KK0MuIFIuIEhlbG1yaWNoLCBTLiBCb3NzZSwgSC4gU2No d2FyeiwgRC4gTWFycGUsIGFuZCBULiBXaWVnYW5kLCAiQSBTdHVkeSBvZiB0aGUKK0V4dGVuZGVk IFBlcmNlcHR1YWxseSBXZWlnaHRlZCBQZWFrIFNpZ25hbC10by1Ob2lzZSBSYXRpbyAoWFBTTlIp IGZvciBWaWRlbyBDb21wcmVzc2lvbgord2l0aCBEaWZmZXJlbnQgUmVzb2x1dGlvbnMgYW5kIEJp dCBEZXB0aHMsIiBJVFUgSm91cm5hbDogSUNUIERpc2NvdmVyaWVzLCB2b2wuIDMsIG5vLgorMSwg cHAuIDY1IC0gNzIsIE1heSAyMDIwLiBAdXJse2h0dHA6Ly9oYW5kbGUuaXR1LmludC8xMS4xMDAy L3B1Yi84MTUzZDc4Yi1lbn0KK0BlbmQgaXRlbWl6ZQorCitXaGVuIHB1Ymxpc2hpbmcgdGhlIHJl c3VsdHMgb2YgWFBTTlIgYXNzZXNzbWVudHMgb2J0YWluZWQgdXNpbmcsIGUuZy4sIHRoaXMgRkZt cGVnIGZpbHRlciwgYQorcmVmZXJlbmNlIHRvIHRoZSBhYm92ZSBwYXBlcnMgYXMgYSBtZWFucyBv ZiBkb2N1bWVudGF0aW9uIGlzIHN0cm9uZ2x5IGVuY291cmFnZWQuIFRoZSBmaWx0ZXIKK3JlcXVp cmVzIHR3byBpbnB1dCB2aWRlb3MuIFRoZSBmaXJzdCBpbnB1dCBpcyBjb25zaWRlcmVkIGEgKHVz dWFsbHkgbm90IGRpc3RvcnRlZCkgcmVmZXJlbmNlCitzb3VyY2UgYW5kIGlzIHBhc3NlZCB1bmNo YW5nZWQgdG8gdGhlIG91dHB1dCwgd2hlcmVhcyB0aGUgc2Vjb25kIGlucHV0IGlzIGEgKGRpc3Rv cnRlZCkgdGVzdAorc2lnbmFsLiBFeGNlcHQgZm9yIHRoZSBiaXQgZGVwdGgsIHRoZXNlIHR3byB2 aWRlbyBpbnB1dHMgbXVzdCBoYXZlIHRoZSBzYW1lIHBpeGVsIGZvcm1hdC4gSW4KK2FkZGl0aW9u LCBmb3IgYmVzdCBwZXJmb3JtYW5jZSwgYm90aCBjb21wYXJlZCBpbnB1dCB2aWRlb3Mgc2hvdWxk IGJlIGluIFlDYkNyIGNvbG9yIGZvcm1hdC4KKworVGhlIG9idGFpbmVkIG92ZXJhbGwgWFBTTlIg dmFsdWVzIG1lbnRpb25lZCBhYm92ZSBhcmUgcHJpbnRlZCB0aHJvdWdoIHRoZSBsb2dnaW5nIHN5 c3RlbS4gSW4KK2Nhc2Ugb2YgaW5wdXQgd2l0aCBtdWx0aXBsZSBjb2xvciBwbGFuZXMsIHdlIHN1 Z2dlc3QgcmVwb3J0aW5nIG9mIHRoZSBtaW5pbXVtIFhQU05SIGF2ZXJhZ2UuCisKK1RoZSBmb2xs b3dpbmcgcGFyYW1ldGVyLCB3aGljaCBiZWhhdmVzIGxpa2UgdGhlIG9uZSBmb3IgdGhlIEByZWZ7 cHNucn0gZmlsdGVyLCBpcyBhY2NlcHRlZDoKKworQHRhYmxlIEBvcHRpb24KK0BpdGVtIHN0YXRz X2ZpbGUsIGYKK0lmIHNwZWNpZmllZCwgdGhlIGZpbHRlciB3aWxsIHVzZSB0aGUgbmFtZWQgZmls ZSB0byBzYXZlIHRoZSBYUFNOUiB2YWx1ZSBvZiBlYWNoIGluZGl2aWR1YWwKK2ZyYW1lIGFuZCBj b2xvciBwbGFuZS4gV2hlbiB0aGUgZmlsZSBuYW1lIGVxdWFscyAiLSIsIHRoYXQgZGF0YSBpcyBz ZW50IHRvIHN0YW5kYXJkIG91dHB1dC4KK0BlbmQgdGFibGUKKworVGhpcyBmaWx0ZXIgYWxzbyBz dXBwb3J0cyB0aGUgQHJlZntmcmFtZXN5bmN9IG9wdGlvbnMuCisKK0BzdWJzZWN0aW9uIEV4YW1w bGVzCitAaXRlbWl6ZQorQGl0ZW0KK1hQU05SIGFuYWx5c2lzIG9mIHR3byAxMDgwcCBIRCB2aWRl b3MsIHJlZl9zb3VyY2UueXV2IGFuZCB0ZXN0X3ZpZGVvLnl1diwgYm90aCBhdCAyNCBmcmFtZXMK K3BlciBzZWNvbmQsIHdpdGggY29sb3IgZm9ybWF0IDQ6MjowLCBiaXQgZGVwdGggOCwgYW5kIG91 dHB1dCBvZiBhIGxvZ2ZpbGUgbmFtZWQgInhwc25yLmxvZyI6CitAZXhhbXBsZQorZmZtcGVnIC1z IDE5MjB4MTA4MCAtZnJhbWVyYXRlIDI0IC1waXhfZm10IHl1djQyMHAgLWkgcmVmX3NvdXJjZS55 dXYgLXMgMTkyMHgxMDgwIC1mcmFtZXJhdGUKKzI0IC1waXhfZm10IHl1djQyMHAgLWkgdGVzdF92 aWRlby55dXYgLWxhdmZpIHhwc25yPSJzdGF0c19maWxlPXhwc25yLmxvZyIgLWYgbnVsbCAtCitA ZW5kIGV4YW1wbGUKKworQGl0ZW0KK1hQU05SIGFuYWx5c2lzIG9mIHR3byAyMTYwcCBVSEQgdmlk ZW9zLCByZWZfc291cmNlLnl1diB3aXRoIGJpdCBkZXB0aCA4IGFuZCB0ZXN0X3ZpZGVvLnl1dgor d2l0aCBiaXQgZGVwdGggMTAsIGJvdGggYXQgNjAgZnJhbWVzIHBlciBzZWNvbmQgd2l0aCBjb2xv ciBmb3JtYXQgNDoyOjAsIG5vIGxvZ2ZpbGUgb3V0cHV0OgorQGV4YW1wbGUKK2ZmbXBlZyAtcyAz ODQweDIxNjAgLWZyYW1lcmF0ZSA2MCAtcGl4X2ZtdCB5dXY0MjBwIC1pIHJlZl9zb3VyY2UueXV2 IC1zIDM4NDB4MjE2MCAtZnJhbWVyYXRlCis2MCAtcGl4X2ZtdCB5dXY0MjBwMTBsZSAtaSB0ZXN0 X3ZpZGVvLnl1diAtbGF2ZmkgeHBzbnI9InN0YXRzX2ZpbGU9LSIgLWYgbnVsbCAtCitAZW5kIGV4 YW1wbGUKK0BlbmQgaXRlbWl6ZQorCiBAc2VjdGlvbiB4c3RhY2sKIFN0YWNrIHZpZGVvIGlucHV0 cyBpbnRvIGN1c3RvbSBsYXlvdXQuCiAKZGlmZiAtLWdpdCBhL2xpYmF2ZmlsdGVyL01ha2VmaWxl IGIvbGliYXZmaWx0ZXIvTWFrZWZpbGUKaW5kZXggMjExZmY0ZGFhYS4uZjJhZTU0NzY5OSAxMDA2 NDQKLS0tIGEvbGliYXZmaWx0ZXIvTWFrZWZpbGUKKysrIGIvbGliYXZmaWx0ZXIvTWFrZWZpbGUK QEAgLTU0NSw2ICs1NDUsNyBAQCBPQkpTLSQoQ09ORklHX1hDT1JSRUxBVEVfRklMVEVSKSAgICAg ICAgICAgICArPSB2Zl9jb252b2x2ZS5vIGZyYW1lc3luYy5vCiBPQkpTLSQoQ09ORklHX1hGQURF X0ZJTFRFUikgICAgICAgICAgICAgICAgICArPSB2Zl94ZmFkZS5vCiBPQkpTLSQoQ09ORklHX1hG QURFX09QRU5DTF9GSUxURVIpICAgICAgICAgICArPSB2Zl94ZmFkZV9vcGVuY2wubyBvcGVuY2wu byBvcGVuY2wveGZhZGUubwogT0JKUy0kKENPTkZJR19YTUVESUFOX0ZJTFRFUikgICAgICAgICAg ICAgICAgKz0gdmZfeG1lZGlhbi5vIGZyYW1lc3luYy5vCitPQkpTLSQoQ09ORklHX1hQU05SX0ZJ TFRFUikgICAgICAgICAgICAgICAgICArPSB2Zl94cHNuci5vIGZyYW1lc3luYy5vCiBPQkpTLSQo Q09ORklHX1hTVEFDS19GSUxURVIpICAgICAgICAgICAgICAgICArPSB2Zl9zdGFjay5vIGZyYW1l c3luYy5vCiBPQkpTLSQoQ09ORklHX1lBRElGX0ZJTFRFUikgICAgICAgICAgICAgICAgICArPSB2 Zl95YWRpZi5vIHlhZGlmX2NvbW1vbi5vCiBPQkpTLSQoQ09ORklHX1lBRElGX0NVREFfRklMVEVS KSAgICAgICAgICAgICArPSB2Zl95YWRpZl9jdWRhLm8gdmZfeWFkaWZfY3VkYS5wdHgubyBcCmRp ZmYgLS1naXQgYS9saWJhdmZpbHRlci9hbGxmaWx0ZXJzLmMgYi9saWJhdmZpbHRlci9hbGxmaWx0 ZXJzLmMKaW5kZXggMWFiM2M4MzE5YS4uY2RlYTdkYjIxMSAxMDA2NDQKLS0tIGEvbGliYXZmaWx0 ZXIvYWxsZmlsdGVycy5jCisrKyBiL2xpYmF2ZmlsdGVyL2FsbGZpbHRlcnMuYwpAQCAtNTE0LDYg KzUxNCw3IEBAIGV4dGVybiBjb25zdCBBVkZpbHRlciBmZl92Zl94Y29ycmVsYXRlOwogZXh0ZXJu IGNvbnN0IEFWRmlsdGVyIGZmX3ZmX3hmYWRlOwogZXh0ZXJuIGNvbnN0IEFWRmlsdGVyIGZmX3Zm X3hmYWRlX29wZW5jbDsKIGV4dGVybiBjb25zdCBBVkZpbHRlciBmZl92Zl94bWVkaWFuOworZXh0 ZXJuIGNvbnN0IEFWRmlsdGVyIGZmX3ZmX3hwc25yOwogZXh0ZXJuIGNvbnN0IEFWRmlsdGVyIGZm X3ZmX3hzdGFjazsKIGV4dGVybiBjb25zdCBBVkZpbHRlciBmZl92Zl95YWRpZjsKIGV4dGVybiBj b25zdCBBVkZpbHRlciBmZl92Zl95YWRpZl9jdWRhOwpkaWZmIC0tZ2l0IGEvbGliYXZmaWx0ZXIv dmVyc2lvbi5oIGIvbGliYXZmaWx0ZXIvdmVyc2lvbi5oCmluZGV4IGE1NmJhM2JiNmQuLjA5Yjk5 NTQ1OTcgMTAwNjQ0Ci0tLSBhL2xpYmF2ZmlsdGVyL3ZlcnNpb24uaAorKysgYi9saWJhdmZpbHRl ci92ZXJzaW9uLmgKQEAgLTMxLDcgKzMxLDcgQEAKIAogI2luY2x1ZGUgInZlcnNpb25fbWFqb3Iu aCIKIAotI2RlZmluZSBMSUJBVkZJTFRFUl9WRVJTSU9OX01JTk9SICA1NAorI2RlZmluZSBMSUJB VkZJTFRFUl9WRVJTSU9OX01JTk9SICA1NQogI2RlZmluZSBMSUJBVkZJTFRFUl9WRVJTSU9OX01J Q1JPIDEwMAogCiAKZGlmZiAtLWdpdCBhL2xpYmF2ZmlsdGVyL3ZmX3hwc25yLmMgYi9saWJhdmZp bHRlci92Zl94cHNuci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAuLjI0 YTgxYzhhZTYKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhdmZpbHRlci92Zl94cHNuci5jCkBAIC0w LDAgKzEsNzQxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDIzIENocmlzdGlhbiBSLiBIZWxt cmljaAorICogQ29weXJpZ2h0IChjKSAyMDIzIENocmlzdGlhbiBTdG9mZmVycworICoKKyAqIFRo aXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2Fy ZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhl IHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1 Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNp b24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJz aW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdp bGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4g dGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZP UiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQ dWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSBy ZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vu c2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUK KyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJv c3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBDYWxjdWxh dGUgdGhlIGV4dGVuZGVkIHBlcmNlcHR1YWxseSB3ZWlnaHRlZCBQU05SIChYUFNOUikgYmV0d2Vl biB0d28gaW5wdXQgdmlkZW9zLgorICoKKyAqIEF1dGhvcnM6IENocmlzdGlhbiBIZWxtcmljaCBh bmQgQ2hyaXN0aWFuIFN0b2ZmZXJzLCBGcmF1bmhvZmVyIEhISSwgQmVybGluLCBHZXJtYW55Cisg Ki8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9hdnN0cmluZy5oIgorI2luY2x1ZGUgImxpYmF2dXRp bC9maWxlX29wZW4uaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCisjaW5jbHVkZSAibGli YXZ1dGlsL3BpeGRlc2MuaCIKKyNpbmNsdWRlICJhdmZpbHRlci5oIgorI2luY2x1ZGUgImRyYXd1 dGlscy5oIgorI2luY2x1ZGUgImZyYW1lc3luYy5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisj aW5jbHVkZSAieHBzbnIuaCIKKworLyogWFBTTlIgc3RydWN0dXJlIGRlZmluaXRpb24gKi8KKwor dHlwZWRlZiBzdHJ1Y3QgWFBTTlJDb250ZXh0IHsKKyAgICAvKiByZXF1aXJlZCBiYXNpYyB2YXJp YWJsZXMgKi8KKyAgICBjb25zdCBBVkNsYXNzICAgKmNsYXNzOworICAgIGludCAgICAgICAgICAg ICBicHA7IC8qIHVucGFja2VkICovCisgICAgaW50ICAgICAgICAgICAgIGRlcHRoOyAvKiBwYWNr ZWQgKi8KKyAgICBjaGFyICAgICAgICAgICAgY29tcHNbNF07CisgICAgaW50ICAgICAgICAgICAg IG51bV9jb21wczsKKyAgICB1aW50NjRfdCAgICAgICAgbnVtX2ZyYW1lc182NDsKKyAgICB1bnNp Z25lZCAgICAgICAgZnJhbWVfcmF0ZTsKKyAgICBGRkZyYW1lU3luYyAgICAgZnM7CisgICAgaW50 ICAgICAgICAgICAgIGxpbmVfc2l6ZXNbNF07CisgICAgaW50ICAgICAgICAgICAgIHBsYW5lX2hl aWdodFs0XTsKKyAgICBpbnQgICAgICAgICAgICAgcGxhbmVfd2lkdGhbNF07CisgICAgdWludDhf dCAgICAgICAgIHJnYmFfbWFwWzRdOworICAgIEZJTEUgICAgICAgICAgICAqc3RhdHNfZmlsZTsK KyAgICBjaGFyICAgICAgICAgICAgKnN0YXRzX2ZpbGVfc3RyOworICAgIC8qIFhQU05SIHNwZWNp ZmljIHZhcmlhYmxlcyAqLworICAgIGRvdWJsZSAgICAgICAgICAqc3NlX2x1bWE7CisgICAgZG91 YmxlICAgICAgICAgICp3ZWlnaHRzOworICAgIEFWQnVmZmVyUmVmKiAgICBidWZfb3JnICAgWzNd OworICAgIEFWQnVmZmVyUmVmKiAgICBidWZfb3JnX20xWzNdOworICAgIEFWQnVmZmVyUmVmKiAg ICBidWZfb3JnX20yWzNdOworICAgIEFWQnVmZmVyUmVmKiAgICBidWZfcmVjICAgWzNdOworICAg IHVpbnQ2NF90ICAgICAgICBtYXhfZXJyb3JfNjQ7CisgICAgZG91YmxlICAgICAgICAgIHN1bV93 ZGlzdCBbM107CisgICAgZG91YmxlICAgICAgICAgIHN1bV94cHNuciBbM107CisgICAgaW50ICAg ICAgICAgICAgIGFuZF9pc19pbmZbM107CisgICAgaW50ICAgICAgICAgICAgIGlzX3JnYjsKKyAg ICBQU05SRFNQQ29udGV4dCAgZHNwOworfSBYUFNOUkNvbnRleHQ7CisKKy8qIHJlcXVpcmVkIG1h Y3JvIGRlZmluaXRpb25zICovCisKKyNkZWZpbmUgRkxBR1MgICAgIEFWX09QVF9GTEFHX0ZJTFRF UklOR19QQVJBTSB8IEFWX09QVF9GTEFHX1ZJREVPX1BBUkFNCisjZGVmaW5lIE9GRlNFVCh4KSBv ZmZzZXRvZihYUFNOUkNvbnRleHQsIHgpCisjZGVmaW5lIFhQU05SX0dBTU1BIDIKKworc3RhdGlj IGNvbnN0IEFWT3B0aW9uIHhwc25yX29wdGlvbnNbXSA9IHsKKyAgICB7InN0YXRzX2ZpbGUiLCAi U2V0IGZpbGUgd2hlcmUgdG8gc3RvcmUgcGVyLWZyYW1lIFhQU05SIGluZm9ybWF0aW9uIiwgT0ZG U0VUKHN0YXRzX2ZpbGVfc3RyKSwgQVZfT1BUX1RZUEVfU1RSSU5HLCB7LnN0ciA9IE5VTEx9LCAw LCAwLCBGTEFHU30sCisgICAgeyJmIiwgICAgICAgICAgIlNldCBmaWxlIHdoZXJlIHRvIHN0b3Jl IHBlci1mcmFtZSBYUFNOUiBpbmZvcm1hdGlvbiIsIE9GRlNFVChzdGF0c19maWxlX3N0ciksIEFW X09QVF9UWVBFX1NUUklORywgey5zdHIgPSBOVUxMfSwgMCwgMCwgRkxBR1N9LAorICAgIHsgTlVM TCB9Cit9OworCitGUkFNRVNZTkNfREVGSU5FX0NMQVNTKHhwc25yLCBYUFNOUkNvbnRleHQsIGZz KTsKKworLyogWFBTTlIgZnVuY3Rpb24gZGVmaW5pdGlvbnMgKi8KKworc3RhdGljIHVpbnQ2NF90 IGhpZ2hkcyhjb25zdCBpbnQgeF9hY3QsIGNvbnN0IGludCB5X2FjdCwgY29uc3QgaW50IHdfYWN0 LCBjb25zdCBpbnQgaF9hY3QsIGNvbnN0IGludDE2X3QgKm9fbTAsIGNvbnN0IGludCBvKQorewor ICAgIHVpbnQ2NF90IHNhX2FjdCA9IDA7CisKKyAgICBmb3IgKGludCB5ID0geV9hY3Q7IHkgPCBo X2FjdDsgeSArPSAyKSB7CisgICAgICAgIGZvciAoaW50IHggPSB4X2FjdDsgeCA8IHdfYWN0OyB4 ICs9IDIpIHsKKyAgICAgICAgICAgIGNvbnN0IGludCBmID0gMTIgKiAoKGludClvX20wWyB5ICAg Km8gKyB4ICBdICsgKGludClvX20wWyB5ICAgKm8gKyB4KzFdICsgKGludClvX20wWyh5KzEpKm8g KyB4ICBdICsgKGludClvX20wWyh5KzEpKm8gKyB4KzFdKQorICAgICAgICAgICAgICAgICAgICAg ICAgIC0gMyAqICgoaW50KW9fbTBbKHktMSkqbyArIHggIF0gKyAoaW50KW9fbTBbKHktMSkqbyAr IHgrMV0gKyAoaW50KW9fbTBbKHkrMikqbyArIHggIF0gKyAoaW50KW9fbTBbKHkrMikqbyArIHgr MV0pCisgICAgICAgICAgICAgICAgICAgICAgICAgLSAzICogKChpbnQpb19tMFsgeSAgICpvICsg eC0xXSArIChpbnQpb19tMFsgeSAgICpvICsgeCsyXSArIChpbnQpb19tMFsoeSsxKSpvICsgeC0x XSArIChpbnQpb19tMFsoeSsxKSpvICsgeCsyXSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAt IDIgKiAoKGludClvX20wWyh5LTEpKm8gKyB4LTFdICsgKGludClvX20wWyh5LTEpKm8gKyB4KzJd ICsgKGludClvX20wWyh5KzIpKm8gKyB4LTFdICsgKGludClvX20wWyh5KzIpKm8gKyB4KzJdKQor ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtICgoaW50KW9fbTBbKHktMikqbyArIHgtMV0g KyAoaW50KW9fbTBbKHktMikqbyArIHggIF0gKyAoaW50KW9fbTBbKHktMikqbyArIHgrMV0gKyAo aW50KW9fbTBbKHktMikqbyArIHgrMl0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsg KGludClvX20wWyh5KzMpKm8gKyB4LTFdICsgKGludClvX20wWyh5KzMpKm8gKyB4ICBdICsgKGlu dClvX20wWyh5KzMpKm8gKyB4KzFdICsgKGludClvX20wWyh5KzMpKm8gKyB4KzJdCisgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICArIChpbnQpb19tMFsoeS0xKSpvICsgeC0yXSArIChpbnQp b19tMFsgeSAgICpvICsgeC0yXSArIChpbnQpb19tMFsoeSsxKSpvICsgeC0yXSArIChpbnQpb19t MFsoeSsyKSpvICsgeC0yXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAoaW50KW9f bTBbKHktMSkqbyArIHgrM10gKyAoaW50KW9fbTBbIHkgICAqbyArIHgrM10gKyAoaW50KW9fbTBb KHkrMSkqbyArIHgrM10gKyAoaW50KW9fbTBbKHkrMikqbyArIHgrM10pOworICAgICAgICAgICAg c2FfYWN0ICs9ICh1aW50NjRfdCkgYWJzKGYpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVy biBzYV9hY3Q7Cit9CisKK3N0YXRpYyB1aW50NjRfdCBkaWZmMXN0KGNvbnN0IHVpbnQzMl90IHdf YWN0LCBjb25zdCB1aW50MzJfdCBoX2FjdCwgY29uc3QgaW50MTZfdCAqb19tMCwgaW50MTZfdCAq b19tMSwgY29uc3QgaW50IG8pCit7CisgICAgdWludDY0X3QgdGFfYWN0ID0gMDsKKworICAgIGZv ciAodWludDMyX3QgeSA9IDA7IHkgPCBoX2FjdDsgeSArPSAyKSB7CisgICAgICAgIGZvciAodWlu dDMyX3QgeCA9IDA7IHggPCB3X2FjdDsgeCArPSAyKSB7CisgICAgICAgICAgICBjb25zdCBpbnQg dCA9IChpbnQpb19tMFt5Km8gKyB4XSArIChpbnQpb19tMFt5Km8gKyB4KzFdICsgKGludClvX20w Wyh5KzEpKm8gKyB4XSArIChpbnQpb19tMFsoeSsxKSpvICsgeCsxXQorICAgICAgICAgICAgICAg ICAgICAgICAtICgoaW50KW9fbTFbeSpvICsgeF0gKyAoaW50KW9fbTFbeSpvICsgeCsxXSArIChp bnQpb19tMVsoeSsxKSpvICsgeF0gKyAoaW50KW9fbTFbKHkrMSkqbyArIHgrMV0pOworICAgICAg ICAgICAgdGFfYWN0ICs9ICh1aW50NjRfdCkgYWJzKHQpOworICAgICAgICAgICAgb19tMVt5Km8g KyB4ICBdID0gb19tMFt5Km8gKyB4ICBdOyAgb19tMVsoeSsxKSpvICsgeCAgXSA9IG9fbTBbKHkr MSkqbyArIHggIF07CisgICAgICAgICAgICBvX20xW3kqbyArIHgrMV0gPSBvX20wW3kqbyArIHgr MV07ICBvX20xWyh5KzEpKm8gKyB4KzFdID0gb19tMFsoeSsxKSpvICsgeCsxXTsKKyAgICAgICAg fQorICAgIH0KKyAgICByZXR1cm4gKHRhX2FjdCAqIFhQU05SX0dBTU1BKTsKK30KKworc3RhdGlj IHVpbnQ2NF90IGRpZmYybmQoY29uc3QgdWludDMyX3Qgd19hY3QsIGNvbnN0IHVpbnQzMl90IGhf YWN0LCBjb25zdCBpbnQxNl90ICpvX20wLCBpbnQxNl90ICpvX20xLCBpbnQxNl90ICpvX20yLCBj b25zdCBpbnQgbykKK3sKKyAgICB1aW50NjRfdCB0YV9hY3QgPSAwOworCisgICAgZm9yICh1aW50 MzJfdCB5ID0gMDsgeSA8IGhfYWN0OyB5ICs9IDIpIHsKKyAgICAgICAgZm9yICh1aW50MzJfdCB4 ID0gMDsgeCA8IHdfYWN0OyB4ICs9IDIpIHsKKyAgICAgICAgICAgIGNvbnN0IGludCB0ID0gKGlu dClvX20wW3kqbyArIHhdICsgKGludClvX20wW3kqbyArIHgrMV0gKyAoaW50KW9fbTBbKHkrMSkq byArIHhdICsgKGludClvX20wWyh5KzEpKm8gKyB4KzFdCisgICAgICAgICAgICAgICAgICAgLSAy ICogKChpbnQpb19tMVt5Km8gKyB4XSArIChpbnQpb19tMVt5Km8gKyB4KzFdICsgKGludClvX20x Wyh5KzEpKm8gKyB4XSArIChpbnQpb19tMVsoeSsxKSpvICsgeCsxXSkKKyAgICAgICAgICAgICAg ICAgICAgICAgICsgKGludClvX20yW3kqbyArIHhdICsgKGludClvX20yW3kqbyArIHgrMV0gKyAo aW50KW9fbTJbKHkrMSkqbyArIHhdICsgKGludClvX20yWyh5KzEpKm8gKyB4KzFdOworICAgICAg ICAgICAgdGFfYWN0ICs9ICh1aW50NjRfdCkgYWJzKHQpOworICAgICAgICAgICAgb19tMlt5Km8g KyB4ICBdID0gb19tMVt5Km8gKyB4ICBdOyAgb19tMlsoeSsxKSpvICsgeCAgXSA9IG9fbTFbKHkr MSkqbyArIHggIF07CisgICAgICAgICAgICBvX20yW3kqbyArIHgrMV0gPSBvX20xW3kqbyArIHgr MV07ICBvX20yWyh5KzEpKm8gKyB4KzFdID0gb19tMVsoeSsxKSpvICsgeCsxXTsKKyAgICAgICAg ICAgIG9fbTFbeSpvICsgeCAgXSA9IG9fbTBbeSpvICsgeCAgXTsgIG9fbTFbKHkrMSkqbyArIHgg IF0gPSBvX20wWyh5KzEpKm8gKyB4ICBdOworICAgICAgICAgICAgb19tMVt5Km8gKyB4KzFdID0g b19tMFt5Km8gKyB4KzFdOyAgb19tMVsoeSsxKSpvICsgeCsxXSA9IG9fbTBbKHkrMSkqbyArIHgr MV07CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuICh0YV9hY3QgKiBYUFNOUl9HQU1NQSk7 Cit9CisKK3N0YXRpYyB1aW50NjRfdCBzc2VfbGluZV8xNmJpdChjb25zdCB1aW50OF90ICpibGtf b3JnOCwgY29uc3QgdWludDhfdCAqYmxrX3JlYzgsIGludCBibG9ja193aWR0aCkKK3sKKyAgICBj b25zdCB1aW50MTZfdCAqYmxrX29yZyA9IChjb25zdCB1aW50MTZfdCopIGJsa19vcmc4OworICAg IGNvbnN0IHVpbnQxNl90ICpibGtfcmVjID0gKGNvbnN0IHVpbnQxNl90KikgYmxrX3JlYzg7Cisg ICAgdWludDY0X3Qgc3NlID0gMDsgLyogc3VtIGZvciBvbmUgcGl4ZWwgbGluZSAqLworCisgICAg Zm9yIChpbnQgeCA9IDA7IHggPCBibG9ja193aWR0aDsgeCsrKSB7CisgICAgICAgIGNvbnN0IGlu dDY0X3QgZXJyb3IgPSAoaW50NjRfdCkgYmxrX29yZ1t4XSAtIChpbnQ2NF90KSBibGtfcmVjW3hd OworCisgICAgICAgIHNzZSArPSBlcnJvciAqIGVycm9yOworICAgIH0KKworICAgIC8qIHN1bSBv ZiBzcXVhcmVkIGVycm9ycyBmb3IgdGhlIHBpeGVsIGxpbmUgKi8KKyAgICByZXR1cm4gc3NlOwor fQorCitzdGF0aWMgaW5saW5lIHVpbnQ2NF90IGNhbGNfc3F1YXJlZF9lcnJvcihYUFNOUkNvbnRl eHQgY29uc3QgKnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBj b25zdCBpbnQxNl90ICpibGtfb3JnLCAgICAgY29uc3QgdWludDMyX3Qgc3RyaWRlX29yZywKKyAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDE2X3QgKmJs a19yZWMsICAgICBjb25zdCB1aW50MzJfdCBzdHJpZGVfcmVjLAorICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3QgYmxvY2tfd2lkdGgsIGNvbnN0 IHVpbnQzMl90IGJsb2NrX2hlaWdodCkKK3sKKyAgICB1aW50NjRfdCBzc2UgPSAwOyAgLyogc3Vt IG9mIHNxdWFyZWQgZXJyb3JzICovCisKKyAgICBmb3IgKHVpbnQzMl90IHkgPSAwOyB5IDwgYmxv Y2tfaGVpZ2h0OyB5KyspIHsKKyAgICAgICAgc3NlICs9IHMtPmRzcC5zc2VfbGluZSgoY29uc3Qg dWludDhfdCopIGJsa19vcmcsIChjb25zdCB1aW50OF90KikgYmxrX3JlYywgKGludCkgYmxvY2tf d2lkdGgpOworICAgICAgICBibGtfb3JnICs9IHN0cmlkZV9vcmc7CisgICAgICAgIGJsa19yZWMg Kz0gc3RyaWRlX3JlYzsKKyAgICB9CisKKyAgICAvKiByZXR1cm4gbm9ud2VpZ2h0ZWQgc3VtIG9m IHNxdWFyZWQgZXJyb3JzICovCisgICAgcmV0dXJuIHNzZTsKK30KKworc3RhdGljIGlubGluZSBk b3VibGUgY2FsY19zcXVhcmVkX2Vycm9yX2FuZF93ZWlnaHQgKFhQU05SQ29udGV4dCBjb25zdCAq cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBj b25zdCBpbnQxNl90ICpwaWNfb3JnLCAgICAgY29uc3QgdWludDMyX3Qgc3RyaWRlX29yZywKKyAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90 ICAgICAgICpwaWNfb3JnX20xLCAgaW50MTZfdCAgICAgICAqcGljX29yZ19tMiwKKyAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQxNl90 ICpwaWNfcmVjLCAgICAgY29uc3QgdWludDMyX3Qgc3RyaWRlX3JlYywKKyAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCBvZmZz ZXRfeCwgICAgY29uc3QgdWludDMyX3Qgb2Zmc2V0X3ksCisgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3QgYmxvY2tfd2lkdGgs IGNvbnN0IHVpbnQzMl90IGJsb2NrX2hlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCBiaXRfZGVwdGgsICAgY29u c3QgdWludDMyX3QgaW50X2ZyYW1lX3JhdGUsIGRvdWJsZSAqbXNfYWN0KQoreworICAgIGNvbnN0 IGludCAgICAgICAgIG8gPSAoaW50KSBzdHJpZGVfb3JnOworICAgIGNvbnN0IGludCAgICAgICAg IHIgPSAoaW50KSBzdHJpZGVfcmVjOworICAgIGNvbnN0IGludDE2X3QgKm9fbTAgPSBwaWNfb3Jn ICAgICsgb2Zmc2V0X3kqbyArIG9mZnNldF94OworICAgIGludDE2X3QgICAgICAgKm9fbTEgPSBw aWNfb3JnX20xICsgb2Zmc2V0X3kqbyArIG9mZnNldF94OworICAgIGludDE2X3QgICAgICAgKm9f bTIgPSBwaWNfb3JnX20yICsgb2Zmc2V0X3kqbyArIG9mZnNldF94OworICAgIGNvbnN0IGludDE2 X3QgKnJfbTAgPSBwaWNfcmVjICAgICsgb2Zmc2V0X3kqciArIG9mZnNldF94OworICAgIGNvbnN0 IGludCAgICAgYl92YWwgPSAocy0+cGxhbmVfd2lkdGhbMF0gKiBzLT5wbGFuZV9oZWlnaHRbMF0g PiAyMDQ4ICogMTE1MiA/IDIgOiAxKTsgLyogdGhyZXNob2xkIGlzIGEgYml0IG1vcmUgdGhhbiBI RCByZXNvbHV0aW9uICovCisgICAgY29uc3QgaW50ICAgICB4X2FjdCA9IChvZmZzZXRfeCA+IDAg PyAwIDogYl92YWwpOworICAgIGNvbnN0IGludCAgICAgeV9hY3QgPSAob2Zmc2V0X3kgPiAwID8g MCA6IGJfdmFsKTsKKyAgICBjb25zdCBpbnQgICAgIHdfYWN0ID0gKG9mZnNldF94ICsgYmxvY2tf d2lkdGggIDwgKHVpbnQzMl90KSBzLT5wbGFuZV93aWR0aCBbMF0gPyAoaW50KSBibG9ja193aWR0 aCAgOiAoaW50KSBibG9ja193aWR0aCAgLSBiX3ZhbCk7CisgICAgY29uc3QgaW50ICAgICBoX2Fj dCA9IChvZmZzZXRfeSArIGJsb2NrX2hlaWdodCA8ICh1aW50MzJfdCkgcy0+cGxhbmVfaGVpZ2h0 WzBdID8gKGludCkgYmxvY2tfaGVpZ2h0IDogKGludCkgYmxvY2tfaGVpZ2h0IC0gYl92YWwpOwor CisgICAgY29uc3QgZG91YmxlIHNzZSA9IChkb3VibGUpIGNhbGNfc3F1YXJlZF9lcnJvciAocywg b19tMCwgc3RyaWRlX29yZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICByX20wLCBzdHJpZGVfcmVjLAorICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrX3dpZHRoLCBibG9ja19oZWlnaHQpOwor ICAgIHVpbnQ2NF90IHNhX2FjdCA9IDA7ICAvKiBzcGF0aWFsIGFicy4gYWN0aXZpdHkgKi8KKyAg ICB1aW50NjRfdCB0YV9hY3QgPSAwOyAvKiB0ZW1wb3JhbCBhYnMuIGFjdGl2aXR5ICovCisKKyAg ICBpZiAod19hY3QgPD0geF9hY3QgfHwgaF9hY3QgPD0geV9hY3QpIC8qIHNtYWxsICovCisgICAg ICAgIHJldHVybiBzc2U7CisKKyAgICBpZiAoYl92YWwgPiAxKSB7IC8qIGhpZ2hwYXNzIHdpdGgg ZG93bnNhbXBsaW5nICovCisgICAgICAgIGlmICh3X2FjdCA+IDEyKSB7CisgICAgICAgICAgICBz YV9hY3QgPSBzLT5kc3AuaGlnaGRzX2Z1bmMoeF9hY3QsIHlfYWN0LCB3X2FjdCwgaF9hY3QsIG9f bTAsIG8pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaGlnaGRzKHhfYWN0LCB5X2Fj dCwgd19hY3QsIGhfYWN0LCBvX20wLCBvKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7IC8qIDw9 SEQgaGlnaHBhc3Mgd2l0aG91dCBkb3duc2FtcGxpbmcgKi8KKyAgICAgICAgZm9yIChpbnQgeSA9 IHlfYWN0OyB5IDwgaF9hY3Q7IHkrKykgeworICAgICAgICAgICAgZm9yIChpbnQgeCA9IHhfYWN0 OyB4IDwgd19hY3Q7IHgrKykgeworICAgICAgICAgICAgICAgIGNvbnN0IGludCBmID0gMTIgKiAo aW50KW9fbTBbeSpvICsgeF0gLSAyICogKChpbnQpb19tMFt5Km8gKyB4LTFdICsgKGludClvX20w W3kqbyArIHgrMV0gKyAoaW50KW9fbTBbKHktMSkqbyArIHhdICsgKGludClvX20wWyh5KzEpKm8g KyB4XSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAoKGludClvX20wWyh5LTEp Km8gKyB4LTFdICsgKGludClvX20wWyh5LTEpKm8gKyB4KzFdICsgKGludClvX20wWyh5KzEpKm8g KyB4LTFdICsgKGludClvX20wWyh5KzEpKm8gKyB4KzFdKTsKKyAgICAgICAgICAgICAgICBzYV9h Y3QgKz0gKHVpbnQ2NF90KSBhYnMoZik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9 CisKKyAgICAvKiBjYWxjdWxhdGUgd2VpZ2h0IChhdmVyYWdlIHNxdWFyZWQgYWN0aXZpdHkpICov CisgICAgKm1zX2FjdCA9IChkb3VibGUpIHNhX2FjdCAvICgoZG91YmxlKSAod19hY3QgLSB4X2Fj dCkgKiAoZG91YmxlKSAoaF9hY3QgLSB5X2FjdCkpOworCisgICAgaWYgKGJfdmFsID4gMSkgeyAv KiBoaWdocGFzcyB3aXRoIGRvd25zYW1wbGluZyAqLworICAgICAgICBpZiAoaW50X2ZyYW1lX3Jh dGUgPCAzMikgeyAvKiAxc3Qtb3JkZXIgZGlmZiAqLworICAgICAgICAgICAgdGFfYWN0ID0gcy0+ ZHNwLmRpZmYxc3RfZnVuYyhibG9ja193aWR0aCwgYmxvY2tfaGVpZ2h0LCBvX20wLCBvX20xLCBv KTsKKyAgICAgICAgfSBlbHNlIHsgLyogMm5kLW9yZGVyIGRpZmYgKGRpZmYgb2YgMiBkaWZmcykg Ki8KKyAgICAgICAgICAgIHRhX2FjdCA9IHMtPmRzcC5kaWZmMm5kX2Z1bmMoYmxvY2tfd2lkdGgs IGJsb2NrX2hlaWdodCwgb19tMCwgb19tMSwgb19tMiwgbyk7CisgICAgICAgIH0KKyAgICB9IGVs c2UgeyAvKiA8PUhEIGhpZ2hwYXNzIHdpdGhvdXQgZG93bnNhbXBsaW5nICovCisgICAgICAgIGlm IChpbnRfZnJhbWVfcmF0ZSA8IDMyKSB7IC8qIDFzdC1vcmRlciBkaWZmICovCisgICAgICAgICAg ICBmb3IgKHVpbnQzMl90IHkgPSAwOyB5IDwgYmxvY2tfaGVpZ2h0OyB5KyspIHsKKyAgICAgICAg ICAgICAgICBmb3IgKHVpbnQzMl90IHggPSAwOyB4IDwgYmxvY2tfd2lkdGg7IHgrKykgeworICAg ICAgICAgICAgICAgICAgICBjb25zdCBpbnQgdCA9IChpbnQpb19tMFt5Km8gKyB4XSAtIChpbnQp b19tMVt5Km8gKyB4XTsKKworICAgICAgICAgICAgICAgICAgICB0YV9hY3QgKz0gWFBTTlJfR0FN TUEgKiAodWludDY0X3QpIGFicyh0KTsKKyAgICAgICAgICAgICAgICAgICAgb19tMVt5Km8gKyB4 XSA9IG9fbTBbeSpvICsgeF07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAg ICAgICB9IGVsc2UgeyAvKiAybmQtb3JkZXIgZGlmZiAoZGlmZiBvZiAyIGRpZmZzKSAqLworICAg ICAgICAgICAgZm9yICh1aW50MzJfdCB5ID0gMDsgeSA8IGJsb2NrX2hlaWdodDsgeSsrKSB7Cisg ICAgICAgICAgICAgICAgZm9yICh1aW50MzJfdCB4ID0gMDsgeCA8IGJsb2NrX3dpZHRoOyB4Kysp IHsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IHQgPSAoaW50KW9fbTBbeSpvICsgeF0g LSAyICogKGludClvX20xW3kqbyArIHhdICsgKGludClvX20yW3kqbyArIHhdOworCisgICAgICAg ICAgICAgICAgICAgIHRhX2FjdCArPSBYUFNOUl9HQU1NQSAqICh1aW50NjRfdCkgYWJzKHQpOwor ICAgICAgICAgICAgICAgICAgICBvX20yW3kqbyArIHhdID0gb19tMVt5Km8gKyB4XTsKKyAgICAg ICAgICAgICAgICAgICAgb19tMVt5Km8gKyB4XSA9IG9fbTBbeSpvICsgeF07CisgICAgICAgICAg ICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyogd2VpZ2h0 ICs9IG1lYW4gc3F1YXJlZCB0ZW1wb3JhbCBhY3Rpdml0eSAqLworICAgICptc19hY3QgKz0gKGRv dWJsZSkgdGFfYWN0IC8gKChkb3VibGUpIGJsb2NrX3dpZHRoICogKGRvdWJsZSkgYmxvY2tfaGVp Z2h0KTsKKworICAgIC8qIGxvd2VyIGxpbWl0LCBhY2NvdW50cyBmb3IgaGlnaC1wYXNzIGdhaW4g Ki8KKyAgICBpZiAoKm1zX2FjdCA8IChkb3VibGUpICgxIDw8IChiaXRfZGVwdGggLSA2KSkpIHsK KyAgICAgICAgKm1zX2FjdCA9IChkb3VibGUpICgxIDw8IChiaXRfZGVwdGggLSA2KSk7CisgICAg fQorICAgICptc19hY3QgKj0gKm1zX2FjdDsgLyogc2luY2UgU1NFIGlzIHNxdWFyZWQgKi8KKwor ICAgIC8qIHJldHVybiBub253ZWlnaHRlZCBzdW0gb2Ygc3F1YXJlZCBlcnJvcnMgKi8KKyAgICBy ZXR1cm4gc3NlOworfQorCitzdGF0aWMgaW5saW5lIGRvdWJsZSBnZXRfYXZnX3hwc25yIChjb25z dCBkb3VibGUgc3FydF93c3NlX3ZhbCwgIGNvbnN0IGRvdWJsZSBzdW1feHBzbnJfdmFsLAorICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3QgaW1hZ2Vfd2lk dGgsICBjb25zdCB1aW50MzJfdCBpbWFnZV9oZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICBjb25zdCB1aW50NjRfdCBtYXhfZXJyb3JfNjQsIGNvbnN0IHVpbnQ2NF90 IG51bV9mcmFtZXNfNjQpCit7CisgICAgaWYgKG51bV9mcmFtZXNfNjQgPT0gMCkKKyAgICAgICAg cmV0dXJuIElORklOSVRZOworCisgICAgaWYgKHNxcnRfd3NzZV92YWwgPj0gKGRvdWJsZSkgbnVt X2ZyYW1lc182NCkgeyAvKiBzcXVhcmUtbWVhbi1yb290IGF2ZXJhZ2UgKi8KKyAgICAgICAgY29u c3QgZG91YmxlIGF2Z19kaXN0ID0gc3FydF93c3NlX3ZhbCAvIChkb3VibGUpIG51bV9mcmFtZXNf NjQ7CisgICAgICAgIGNvbnN0IHVpbnQ2NF90ICBudW02NCA9ICh1aW50NjRfdCkgaW1hZ2Vfd2lk dGggKiAodWludDY0X3QpIGltYWdlX2hlaWdodCAqIG1heF9lcnJvcl82NDsKKworICAgICAgICBy ZXR1cm4gMTAuMCAqIGxvZzEwKChkb3VibGUpIG51bTY0IC8gKChkb3VibGUpIGF2Z19kaXN0ICog KGRvdWJsZSkgYXZnX2Rpc3QpKTsKKyAgICB9CisKKyAgICByZXR1cm4gc3VtX3hwc25yX3ZhbCAv IChkb3VibGUpIG51bV9mcmFtZXNfNjQ7IC8qIG9sZGVyIGxvZy1kb21haW4gYXZlcmFnZSAqLwor fQorCitzdGF0aWMgaW50IGdldF93c3NlKEFWRmlsdGVyQ29udGV4dCAqY3R4LCBpbnQxNl90ICoq b3JnLCBpbnQxNl90ICoqb3JnX20xLCBpbnQxNl90ICoqb3JnX20yLCBpbnQxNl90ICoqcmVjLCB1 aW50NjRfdCogY29uc3Qgd3NzZTY0KQoreworICAgIFhQU05SQ29udGV4dCogY29uc3QgIHMgPSBj dHgtPnByaXY7CisgICAgY29uc3QgdWludDMyX3QgICAgICAgdyA9IHMtPnBsYW5lX3dpZHRoIFsw XTsgLyogbHVtYSBpbWFnZSB3aWR0aCBpbiBwaXhlbHMgKi8KKyAgICBjb25zdCB1aW50MzJfdCAg ICAgICBoID0gcy0+cGxhbmVfaGVpZ2h0WzBdOy8qIGx1bWEgaW1hZ2UgaGVpZ2h0IGluIHBpeGVs cyAqLworICAgIGNvbnN0IGRvdWJsZSAgICAgICAgIHIgPSAoZG91YmxlKSh3ICogaCkgLyAoMzg0 MC4wICogMjE2MC4wKTsgLyogVUhEIHJhdGlvICovCisgICAgY29uc3QgdWludDMyX3QgICAgICAg YiA9IEZGTUFYKDAsIDQgKiAoaW50MzJfdCkgKDMyLjAgKiBzcXJ0KHIpICsgMC41KSk7IC8qIGJs b2NrIHNpemUsIGludGVnZXIgbXVsdGlwbGUgb2YgNCBmb3IgU0lNRCAqLworICAgIGNvbnN0IHVp bnQzMl90ICAgd19ibGsgPSAodyArIGIgLSAxKSAvIGI7IC8qIGx1bWEgd2lkdGggaW4gdW5pdHMg b2YgYmxvY2tzICovCisgICAgY29uc3QgZG91YmxlICAgYXZnX2FjdCA9IHNxcnQoMTYuMCAqIChk b3VibGUpICgxIDw8ICgyICogcy0+ZGVwdGggLSA5KSkgLyBzcXJ0KEZGTUFYKDAuMDAwMDEsIHIp KSk7IC8qIHRoZSBzcXJ0KGFfcGljKSAqLworICAgIGNvbnN0IGludCogIHN0cmlkZV9vcmcgPSAo cy0+YnBwID09IDEgPyBzLT5wbGFuZV93aWR0aCA6IHMtPmxpbmVfc2l6ZXMpOworICAgIHVpbnQz Ml90IHgsIHksIGlkeF9ibGsgPSAwOyAvKiB0aGUgIjE2LjAiIGFib3ZlIGlzIGR1ZSB0byBmaXhl ZC1wb2ludCBjb2RlICovCisgICAgZG91YmxlKiBjb25zdCBzc2VfbHVtYSA9IHMtPnNzZV9sdW1h OworICAgIGRvdWJsZSogY29uc3QgIHdlaWdodHMgPSBzLT53ZWlnaHRzOworICAgIGludCBjOwor CisgICAgaWYgKCh3c3NlNjQgPT0gTlVMTCkgfHwgKHMtPmRlcHRoIDwgNikgfHwgKHMtPmRlcHRo ID4gMTYpIHx8IChzLT5udW1fY29tcHMgPD0gMCkgfHwgKHMtPm51bV9jb21wcyA+IDMpIHx8ICh3 ID09IDApIHx8IChoID09IDApKSB7CisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwg IkVycm9yIGluIFhQU05SIHJvdXRpbmU6IGludmFsaWQgYXJndW1lbnQocykuXG4iKTsKKworICAg ICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKworICAgIGlmICgod2VpZ2h0cyA9 PSBOVUxMKSB8fCAoYiA+PSA0ICYmIHNzZV9sdW1hID09IE5VTEwpKSB7CisgICAgICAgIGF2X2xv ZyhjdHgsIEFWX0xPR19FUlJPUiwgIkZhaWxlZCB0byBhbGxvY2F0ZSB0ZW1wb3JhcnkgYmxvY2sg bWVtb3J5LlxuIik7CisKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICB9CisK KyAgICBpZiAoYiA+PSA0KSB7CisgICAgICAgIGNvbnN0IGludDE2X3QgKnBfb3JnID0gb3JnWzBd OworICAgICAgICBjb25zdCB1aW50MzJfdCBzX29yZyA9IHN0cmlkZV9vcmdbMF0gLyBzLT5icHA7 CisgICAgICAgIGNvbnN0IGludDE2X3QgKnBfcmVjID0gcmVjWzBdOworICAgICAgICBjb25zdCB1 aW50MzJfdCBzX3JlYyA9IHMtPnBsYW5lX3dpZHRoWzBdOworICAgICAgICBpbnQxNl90ICAgICpw X29yZ19tMSA9IG9yZ19tMVswXTsgLyogcGl4ZWwgICovCisgICAgICAgIGludDE2X3QgICAgKnBf b3JnX20yID0gb3JnX20yWzBdOyAvKiBtZW1vcnkgKi8KKyAgICAgICAgZG91YmxlICAgICB3c3Nl X2x1bWEgPSAwLjA7CisKKyAgICAgICAgZm9yICh5ID0gMDsgeSA8IGg7IHkgKz0gYikgeyAvKiBj YWxjdWxhdGUgYmxvY2sgU1NFIGFuZCBwZXJjZXB0dWFsIHdlaWdodHMgKi8KKyAgICAgICAgICAg IGNvbnN0IHVpbnQzMl90IGJsb2NrX2hlaWdodCA9ICh5ICsgYiA+IGggPyBoIC0geSA6IGIpOwor CisgICAgICAgICAgICBmb3IgKHggPSAwOyB4IDwgdzsgeCArPSBiLCBpZHhfYmxrKyspIHsKKyAg ICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCBibG9ja193aWR0aCA9ICh4ICsgYiA+IHcgPyB3 IC0geCA6IGIpOworICAgICAgICAgICAgICAgIGRvdWJsZSBtc19hY3QgPSAxLjAsIG1zX2FjdF9w cmV2ID0gMC4wOworCisgICAgICAgICAgICAgICAgc3NlX2x1bWFbaWR4X2Jsa10gPSBjYWxjX3Nx dWFyZWRfZXJyb3JfYW5kX3dlaWdodChzLCBwX29yZywgc19vcmcsCisgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX29yZ19t MSwgcF9vcmdfbTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICBwX3JlYywgc19yZWMsCisgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4LCB5LAorICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgYmxvY2tfd2lkdGgsIGJsb2NrX2hlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmRlcHRoLCBzLT5m cmFtZV9yYXRlLCAmbXNfYWN0KTsKKyAgICAgICAgICAgICAgICB3ZWlnaHRzW2lkeF9ibGtdID0g MS4wIC8gc3FydChtc19hY3QpOworCisgICAgICAgICAgICAgICAgaWYgKHcgKiBoIDw9IDY0MHUg KiA0ODB1KSB7IC8qIGluLWxpbmUgIm1pbi1zbW9vdGhpbmciIGFzIGluIHBhcGVyICovCisgICAg ICAgICAgICAgICAgICAgIGlmICh4ID09IDApIHsgIC8qIGZpcnN0IGNvbHVtbiAqLworICAgICAg ICAgICAgICAgICAgICAgICAgbXNfYWN0X3ByZXYgPSAoaWR4X2JsayA+IDEgPyB3ZWlnaHRzW2lk eF9ibGsgLSAyXSA6IDApOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeyAvKiBhZnRlciBm aXJzdCBjb2x1bW4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIG1zX2FjdF9wcmV2ID0gKHgg PiBiID8gRkZNQVgod2VpZ2h0c1tpZHhfYmxrIC0gMl0sIHdlaWdodHNbaWR4X2Jsa10pIDogd2Vp Z2h0c1tpZHhfYmxrXSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAg ICAgaWYgKGlkeF9ibGsgPiB3X2JsaykgeyAvKiBhZnRlciB0aGUgZmlyc3Qgcm93IGFuZCBmaXJz dCBjb2x1bW4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIG1zX2FjdF9wcmV2ID0gRkZNQVgo bXNfYWN0X3ByZXYsIHdlaWdodHNbaWR4X2JsayAtIDEgLSB3X2Jsa10pOyAvKiBtaW4obGVmdCwg dG9wKSAqLworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmICgo aWR4X2JsayA+IDApICYmICh3ZWlnaHRzW2lkeF9ibGsgLSAxXSA+IG1zX2FjdF9wcmV2KSkgewor ICAgICAgICAgICAgICAgICAgICAgICAgd2VpZ2h0c1tpZHhfYmxrIC0gMV0gPSBtc19hY3RfcHJl djsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoKHggKyBi ID49IHcpICYmICh5ICsgYiA+PSBoKSAmJiAoaWR4X2JsayA+IHdfYmxrKSkgeyAvKiBsYXN0IGJs b2NrIGluIHBpY3R1cmUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIG1zX2FjdF9wcmV2ID0g RkZNQVgod2VpZ2h0c1tpZHhfYmxrIC0gMV0sIHdlaWdodHNbaWR4X2JsayAtIHdfYmxrXSk7Cisg ICAgICAgICAgICAgICAgICAgICAgICBpZiAod2VpZ2h0c1tpZHhfYmxrXSA+IG1zX2FjdF9wcmV2 KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2VpZ2h0c1tpZHhfYmxrXSA9IG1zX2Fj dF9wcmV2OworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9 CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSAvKiBmb3IgeCAqLworICAgICAgICB9 IC8qIGZvciB5ICovCisKKyAgICAgICAgZm9yICh5ID0gaWR4X2JsayA9IDA7IHkgPCBoOyB5ICs9 IGIpIHsgLyogY2FsY3VsYXRlIHN1bSBmb3IgbHVtYSAoWSkgWFBTTlIgKi8KKyAgICAgICAgICAg IGZvciAoeCA9IDA7IHggPCB3OyB4ICs9IGIsIGlkeF9ibGsrKykgeworICAgICAgICAgICAgICAg IHdzc2VfbHVtYSArPSBzc2VfbHVtYVtpZHhfYmxrXSAqIHdlaWdodHNbaWR4X2Jsa107CisgICAg ICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgd3NzZTY0WzBdID0gKHdzc2VfbHVtYSA8PSAw LjAgPyAwIDogKHVpbnQ2NF90KSAod3NzZV9sdW1hICogYXZnX2FjdCArIDAuNSkpOworICAgIH0g LyogYiA+PSA0ICovCisKKyAgICBmb3IgKGMgPSAwOyBjIDwgcy0+bnVtX2NvbXBzOyBjKyspIHsg LyogZmluYWxpemUgV1NTRSB2YWx1ZSBmb3IgZWFjaCBjb21wb25lbnQgKi8KKyAgICAgICAgY29u c3QgaW50MTZfdCAqcF9vcmcgPSBvcmdbY107CisgICAgICAgIGNvbnN0IHVpbnQzMl90IHNfb3Jn ID0gc3RyaWRlX29yZ1tjXSAvIHMtPmJwcDsKKyAgICAgICAgY29uc3QgaW50MTZfdCAqcF9yZWMg PSByZWNbY107CisgICAgICAgIGNvbnN0IHVpbnQzMl90IHNfcmVjID0gcy0+cGxhbmVfd2lkdGhb Y107CisgICAgICAgIGNvbnN0IHVpbnQzMl90IHdfcGxuID0gcy0+cGxhbmVfd2lkdGhbY107Cisg ICAgICAgIGNvbnN0IHVpbnQzMl90IGhfcGxuID0gcy0+cGxhbmVfaGVpZ2h0W2NdOworCisgICAg ICAgIGlmIChiIDwgNCkgeyAvKiBwaWN0dXJlIGlzIHRvbyBzbWFsbCBmb3IgWFBTTlIsIGNhbGN1 bGF0ZSBub253ZWlnaHRlZCBQU05SICovCisgICAgICAgICAgICB3c3NlNjRbY10gPSBjYWxjX3Nx dWFyZWRfZXJyb3IgKHMsIHBfb3JnLCBzX29yZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgcF9yZWMsIHNfcmVjLAorICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICB3X3BsbiwgaF9wbG4pOworICAgICAgICB9IGVsc2UgaWYgKGMg PiAwKSB7IC8qIGIgPj0gNCBzbyBZIFhQU05SIGhhcyBhbHJlYWR5IGJlZW4gY2FsY3VsYXRlZCBh Ym92ZSAqLworICAgICAgICAgICAgY29uc3QgdWludDMyX3QgIGJ4ID0gKGIgKiB3X3BsbikgLyB3 OworICAgICAgICAgICAgY29uc3QgdWludDMyX3QgIGJ5ID0gKGIgKiBoX3BsbikgLyBoOyAgLyog dXAgdG8gY2hyb21hIGRvd25zYW1wbGluZyBieSA0ICovCisgICAgICAgICAgICBkb3VibGUgd3Nz ZV9jaHJvbWEgPSAwLjA7CisKKyAgICAgICAgICAgIGZvciAoeSA9IGlkeF9ibGsgPSAwOyB5IDwg aF9wbG47IHkgKz0gYnkpIHsgLyogY2FsYyBjaHJvbWEgKENiL0NyKSBYUFNOUiAqLworICAgICAg ICAgICAgICAgIGNvbnN0IHVpbnQzMl90IGJsb2NrX2hlaWdodCA9ICh5ICsgYnkgPiBoX3BsbiA/ IGhfcGxuIC0geSA6IGJ5KTsKKworICAgICAgICAgICAgICAgIGZvciAoeCA9IDA7IHggPCB3X3Bs bjsgeCArPSBieCwgaWR4X2JsaysrKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQz Ml90IGJsb2NrX3dpZHRoID0gKHggKyBieCA+IHdfcGxuID8gd19wbG4gLSB4IDogYngpOworCisg ICAgICAgICAgICAgICAgICAgIHdzc2VfY2hyb21hICs9IChkb3VibGUpIGNhbGNfc3F1YXJlZF9l cnJvciAocywgcF9vcmcgKyB5KnNfb3JnICsgeCwgc19vcmcsCisgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9yZWMgKyB5KnNf cmVjICsgeCwgc19yZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2tfd2lkdGgsIGJsb2NrX2hlaWdodCkgKiB3ZWln aHRzW2lkeF9ibGtdOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAg ICAgIHdzc2U2NFtjXSA9ICh3c3NlX2Nocm9tYSA8PSAwLjAgPyAwIDogKHVpbnQ2NF90KSAod3Nz ZV9jaHJvbWEgKiBhdmdfYWN0ICsgMC41KSk7CisgICAgICAgIH0KKyAgICB9IC8qIGZvciBjICov CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkb194cHNucihGRkZyYW1lU3luYyAq ZnMpCit7CisgICAgQVZGaWx0ZXJDb250ZXh0ICAqY3R4ID0gZnMtPnBhcmVudDsKKyAgICBYUFNO UkNvbnRleHQqIGNvbnN0IHMgPSBjdHgtPnByaXY7CisgICAgY29uc3QgdWludDMyX3QgICAgICB3 ID0gcy0+cGxhbmVfd2lkdGggWzBdOyAgLyogbHVtYSBpbWFnZSB3aWR0aCBpbiBwaXhlbHMgKi8K KyAgICBjb25zdCB1aW50MzJfdCAgICAgIGggPSBzLT5wbGFuZV9oZWlnaHRbMF07IC8qIGx1bWEg aW1hZ2UgaGVpZ2h0IGluIHBpeGVscyAqLworICAgIGNvbnN0IHVpbnQzMl90ICAgICAgYiA9IEZG TUFYKDAsIDQgKiAoaW50MzJfdCkgKDMyLjAgKiBzcXJ0KChkb3VibGUpICh3ICogaCkgLyAoMzg0 MC4wICogMjE2MC4wKSkgKyAwLjUpKTsgLyogYmxvY2sgc2l6ZSAqLworICAgIGNvbnN0IHVpbnQz Ml90ICB3X2JsayA9ICh3ICsgYiAtIDEpIC8gYjsgIC8qIGx1bWEgd2lkdGggaW4gdW5pdHMgb2Yg YmxvY2tzICovCisgICAgY29uc3QgdWludDMyX3QgIGhfYmxrID0gKGggKyBiIC0gMSkgLyBiOyAv KiBsdW1hIGhlaWdodCBpbiB1bml0cyBvZiBibG9ja3MgKi8KKyAgICBBVkZyYW1lICptYXN0ZXIs ICpyZWYgPSBOVUxMOworICAgIGludDE2X3QgKnBvcmcgICBbM107CisgICAgaW50MTZfdCAqcG9y Z19tMVszXTsKKyAgICBpbnQxNl90ICpwb3JnX20yWzNdOworICAgIGludDE2X3QgKnByZWMgICBb M107CisgICAgdWludDY0X3Qgd3NzZTY0IFszXSA9IHswLCAwLCAwfTsKKyAgICBkb3VibGUgY3Vy X3hwc25yWzNdID0ge0lORklOSVRZLCBJTkZJTklUWSwgSU5GSU5JVFl9OworICAgIGludCBjLCBy ZXRfdmFsdWU7CisKKyAgICBpZiAoKHJldF92YWx1ZSA9IGZmX2ZyYW1lc3luY19kdWFsaW5wdXRf Z2V0KGZzLCAmbWFzdGVyLCAmcmVmKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0X3ZhbHVlOwor ICAgIGlmIChyZWYgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIGZmX2ZpbHRlcl9mcmFtZShjdHgt Pm91dHB1dHNbMF0sIG1hc3Rlcik7CisKKyAgICAvKiBwcmVwYXJlIFhQU05SIGNhbGN1bGF0aW9u czogYWxsb2NhdGUgdGVtcG9yYXJ5IHBpY3R1cmUgYW5kIGJsb2NrIG1lbW9yeSAqLworICAgIGlm IChzLT5zc2VfbHVtYSA9PSBOVUxMKSBzLT5zc2VfbHVtYSA9IChkb3VibGUqKSBhdl9tYWxsb2N6 KHdfYmxrICogaF9ibGsgKiBzaXplb2YoZG91YmxlKSk7CisgICAgaWYgKHMtPndlaWdodHMgID09 IE5VTEwpIHMtPndlaWdodHMgID0gKGRvdWJsZSopIGF2X21hbGxvY3ood19ibGsgKiBoX2JsayAq IHNpemVvZihkb3VibGUpKTsKKworICAgIGZvciAoYyA9IDA7IGMgPCBzLT5udW1fY29tcHM7IGMr KykgeyAgLyogY3JlYXRlIHRlbXBvcmFsIG9yZyBidWZmZXIgbWVtb3J5ICovCisgICAgICAgIHMt PmxpbmVfc2l6ZXNbY10gPSBtYXN0ZXItPmxpbmVzaXplW2NdOworCisgICAgICAgIGlmIChjID09 IDApIHsgLyogbHVtYSBjaC4gKi8KKyAgICAgICAgICAgIGNvbnN0IGludCBzdHJpZGVfb3JnX2Jw cCA9IChzLT5icHAgPT0gMSA/IHMtPnBsYW5lX3dpZHRoW2NdIDogcy0+bGluZV9zaXplc1tjXSAv IHMtPmJwcCk7CisKKyAgICAgICAgICAgIGlmIChzLT5idWZfb3JnX20xW2NdID09IE5VTEwpIHMt PmJ1Zl9vcmdfbTFbY10gPSBhdl9idWZmZXJfYWxsb2N6KHN0cmlkZV9vcmdfYnBwICogcy0+cGxh bmVfaGVpZ2h0W2NdICogc2l6ZW9mKGludDE2X3QpKTsKKyAgICAgICAgICAgIGlmIChzLT5idWZf b3JnX20yW2NdID09IE5VTEwpIHMtPmJ1Zl9vcmdfbTJbY10gPSBhdl9idWZmZXJfYWxsb2N6KHN0 cmlkZV9vcmdfYnBwICogcy0+cGxhbmVfaGVpZ2h0W2NdICogc2l6ZW9mKGludDE2X3QpKTsKKwor ICAgICAgICAgICAgcG9yZ19tMVtjXSA9IChpbnQxNl90Kikgcy0+YnVmX29yZ19tMVtjXS0+ZGF0 YTsKKyAgICAgICAgICAgIHBvcmdfbTJbY10gPSAoaW50MTZfdCopIHMtPmJ1Zl9vcmdfbTJbY10t PmRhdGE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAocy0+YnBwID09IDEpIHsgLyogOCBi aXQgKi8KKyAgICAgICAgZm9yIChjID0gMDsgYyA8IHMtPm51bV9jb21wczsgYysrKSB7IC8qIGFs bG9jYXRlIG9yZy9yZWMgYnVmZmVyIG1lbW9yeSAqLworICAgICAgICAgICAgY29uc3QgaW50IG0g PSBzLT5saW5lX3NpemVzW2NdOyAvKiBtYXN0ZXIgc3RyaWRlICovCisgICAgICAgICAgICBjb25z dCBpbnQgbyA9IHMtPnBsYW5lX3dpZHRoW2NdOyAvKiBYUFNOUiBzdHJpZGUgKi8KKworICAgICAg ICAgICAgaWYgKHMtPmJ1Zl9vcmdbY10gPT0gTlVMTCkgcy0+YnVmX29yZ1tjXSA9IGF2X2J1ZmZl cl9hbGxvY3oocy0+cGxhbmVfd2lkdGhbY10gKiBzLT5wbGFuZV9oZWlnaHRbY10gKiBzaXplb2Yo aW50MTZfdCkpOworICAgICAgICAgICAgaWYgKHMtPmJ1Zl9yZWNbY10gPT0gTlVMTCkgcy0+YnVm X3JlY1tjXSA9IGF2X2J1ZmZlcl9hbGxvY3oocy0+cGxhbmVfd2lkdGhbY10gKiBzLT5wbGFuZV9o ZWlnaHRbY10gKiBzaXplb2YoaW50MTZfdCkpOworCisgICAgICAgICAgICBwb3JnW2NdID0gKGlu dDE2X3QqKSBzLT5idWZfb3JnW2NdLT5kYXRhOworICAgICAgICAgICAgcHJlY1tjXSA9IChpbnQx Nl90Kikgcy0+YnVmX3JlY1tjXS0+ZGF0YTsKKworICAgICAgICAgICAgZm9yIChpbnQgeSA9IDA7 IHkgPCBzLT5wbGFuZV9oZWlnaHRbY107IHkrKykgeworICAgICAgICAgICAgICAgIGZvciAoaW50 IHggPSAwOyB4IDwgcy0+cGxhbmVfd2lkdGhbY107IHgrKykgeworICAgICAgICAgICAgICAgICAg ICBwb3JnW2NdW3kqbyArIHhdID0gKGludDE2X3QpIG1hc3Rlci0+ZGF0YVtjXVt5Km0gKyB4XTsK KyAgICAgICAgICAgICAgICAgICAgcHJlY1tjXVt5Km8gKyB4XSA9IChpbnQxNl90KSAgICByZWYt PmRhdGFbY11beSpvICsgeF07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAg ICAgICB9CisgICAgfSBlbHNlIHsgIC8qIDEwLCAxMiwgMTQgYml0ICovCisgICAgICAgIGZvciAo YyA9IDA7IGMgPCBzLT5udW1fY29tcHM7IGMrKykgeworICAgICAgICAgICAgcG9yZ1tjXSA9IChp bnQxNl90KikgbWFzdGVyLT5kYXRhW2NdOworICAgICAgICAgICAgcHJlY1tjXSA9IChpbnQxNl90 KikgICAgcmVmLT5kYXRhW2NdOworICAgICAgICB9CisgICAgfQorCisgICAgLyogZXh0ZW5kZWQg cGVyY2VwdHVhbGx5IHdlaWdodGVkIHBlYWsgc2lnbmFsLXRvLW5vaXNlIHJhdGlvIChYUFNOUikg dmFsdWUgKi8KKworICAgIGlmICgocmV0X3ZhbHVlID0gZ2V0X3dzc2UoY3R4LCAoaW50MTZfdCAq KikgJnBvcmcsIChpbnQxNl90ICoqKSAmcG9yZ19tMSwgKGludDE2X3QgKiopICZwb3JnX20yLCAo aW50MTZfdCAqKikgJnByZWMsIHdzc2U2NCkpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldF92YWx1 ZTsgLyogYW4gZXJyb3IgaGVyZSBtZWFucyBzb21ldGhpbmcgd2VudCB3cm9uZyBlYXJsaWVyISAq LworCisgICAgZm9yIChjID0gMDsgYyA8IHMtPm51bV9jb21wczsgYysrKSB7CisgICAgICAgIGNv bnN0IGRvdWJsZSBzcXJ0X3dzc2UgPSBzcXJ0KChkb3VibGUpIHdzc2U2NFtjXSk7CisKKyAgICAg ICAgY3VyX3hwc25yW2NdID0gZ2V0X2F2Z194cHNuciAoc3FydF93c3NlLCBJTkZJTklUWSwKKyAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+cGxhbmVfd2lkdGhbY10sIHMt PnBsYW5lX2hlaWdodFtjXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg cy0+bWF4X2Vycm9yXzY0LCAxIC8qIHNpbmdsZSBmcmFtZSAqLyk7CisgICAgICAgIHMtPnN1bV93 ZGlzdFtjXSArPSBzcXJ0X3dzc2U7CisgICAgICAgIHMtPnN1bV94cHNucltjXSArPSBjdXJfeHBz bnJbY107CisgICAgICAgIHMtPmFuZF9pc19pbmZbY10gJj0gaXNpbmYoY3VyX3hwc25yW2NdKTsK KyAgICB9CisgICAgcy0+bnVtX2ZyYW1lc182NCsrOworCisgICAgaWYgKHMtPnN0YXRzX2ZpbGUp IHsgLyogcHJpbnQgb3V0IGZyYW1lLSBhbmQgY29tcG9uZW50LXdpc2UgWFBTTlIgYXZlcmFnZXMg Ki8KKyAgICAgICAgZnByaW50ZihzLT5zdGF0c19maWxlLCAibjogJTQiUFJJZDY0IiIsIHMtPm51 bV9mcmFtZXNfNjQpOworCisgICAgICAgIGZvciAoYyA9IDA7IGMgPCBzLT5udW1fY29tcHM7IGMr KykgeworICAgICAgICAgICAgZnByaW50ZihzLT5zdGF0c19maWxlLCAiICBYUFNOUiAlYzogJTMu NGYiLCBzLT5jb21wc1tjXSwgY3VyX3hwc25yW2NdKTsKKyAgICAgICAgfQorICAgICAgICBmcHJp bnRmKHMtPnN0YXRzX2ZpbGUsICJcbiIpOworICAgIH0KKworICAgIHJldHVybiBmZl9maWx0ZXJf ZnJhbWUoY3R4LT5vdXRwdXRzWzBdLCBtYXN0ZXIpOworfQorCitzdGF0aWMgYXZfY29sZCBpbnQg aW5pdChBVkZpbHRlckNvbnRleHQgKmN0eCkKK3sKKyAgICBYUFNOUkNvbnRleHQqIGNvbnN0IHMg PSBjdHgtPnByaXY7CisgICAgaW50IGM7CisKKyAgICBpZiAocy0+c3RhdHNfZmlsZV9zdHIpIHsK KyAgICAgICAgaWYgKCFzdHJjbXAocy0+c3RhdHNfZmlsZV9zdHIsICItIikpIHsgLyogbm8gc3Rh dHMgZmlsZSwgc28gdXNlIHN0ZG91dCAqLworICAgICAgICAgICAgcy0+c3RhdHNfZmlsZSA9IHN0 ZG91dDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHMtPnN0YXRzX2ZpbGUgPSBhdnBy aXZfZm9wZW5fdXRmOChzLT5zdGF0c19maWxlX3N0ciwgInciKTsKKworICAgICAgICAgICAgaWYg KHMtPnN0YXRzX2ZpbGUgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGNvbnN0IGludCBlcnIg PSBBVkVSUk9SKGVycm5vKTsKKyAgICAgICAgICAgICAgICBjaGFyIGJ1ZlsxMjhdOworCisgICAg ICAgICAgICAgICAgYXZfc3RyZXJyb3IoZXJyLCBidWYsIHNpemVvZihidWYpKTsKKyAgICAgICAg ICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJDb3VsZCBub3Qgb3BlbiBzdGF0aXN0 aWNzIGZpbGUgJXM6ICVzXG4iLCBzLT5zdGF0c19maWxlX3N0ciwgYnVmKTsKKworICAgICAgICAg ICAgICAgIHJldHVybiBlcnI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAg ICBzLT5zc2VfbHVtYSA9IE5VTEw7CisgICAgcy0+d2VpZ2h0cyAgPSBOVUxMOworCisgICAgZm9y IChjID0gMDsgYyA8IDM7IGMrKykgeyAvKiBpbml0aWFsaXplIFhQU05SIGRhdGEgb2YgZWFjaCBj b2xvciBjb21wb25lbnQgKi8KKyAgICAgICAgcy0+YnVmX29yZyAgIFtjXSA9IE5VTEw7CisgICAg ICAgIHMtPmJ1Zl9vcmdfbTFbY10gPSBOVUxMOworICAgICAgICBzLT5idWZfb3JnX20yW2NdID0g TlVMTDsKKyAgICAgICAgcy0+YnVmX3JlYyAgIFtjXSA9IE5VTEw7CisgICAgICAgIHMtPnN1bV93 ZGlzdCBbY10gPSAwLjA7CisgICAgICAgIHMtPnN1bV94cHNuciBbY10gPSAwLjA7CisgICAgICAg IHMtPmFuZF9pc19pbmZbY10gPSAxOworICAgIH0KKworICAgIHMtPmZzLm9uX2V2ZW50ID0gZG9f eHBzbnI7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IGVudW0gQVZQaXhlbEZv cm1hdCBwaXhfZm10c1tdID0KK3sKKyAgICBBVl9QSVhfRk1UX0dSQVk4LCBBVl9QSVhfRk1UX0dS QVk5LCBBVl9QSVhfRk1UX0dSQVkxMCwgQVZfUElYX0ZNVF9HUkFZMTIsIEFWX1BJWF9GTVRfR1JB WTE0LCBBVl9QSVhfRk1UX0dSQVkxNiwKKyNkZWZpbmUgUEZfTk9BTFBIQShzdWYpIEFWX1BJWF9G TVRfWVVWNDIwIyNzdWYsICBBVl9QSVhfRk1UX1lVVjQyMiMjc3VmLCAgQVZfUElYX0ZNVF9ZVVY0 NDQjI3N1ZgorI2RlZmluZSBQRl9BTFBIQShzdWYpICAgQVZfUElYX0ZNVF9ZVVZBNDIwIyNzdWYs IEFWX1BJWF9GTVRfWVVWQTQyMiMjc3VmLCBBVl9QSVhfRk1UX1lVVkE0NDQjI3N1ZgorI2RlZmlu ZSBQRihzdWYpICAgICAgICAgUEZfTk9BTFBIQShzdWYpLCBQRl9BTFBIQShzdWYpCisgICAgUEYo UCksIFBGKFA5KSwgUEYoUDEwKSwgUEZfTk9BTFBIQShQMTIpLCBQRl9OT0FMUEhBKFAxNCksIFBG KFAxNiksCisgICAgQVZfUElYX0ZNVF9ZVVY0NDBQLCBBVl9QSVhfRk1UX1lVVjQxMVAsIEFWX1BJ WF9GTVRfWVVWNDEwUCwKKyAgICBBVl9QSVhfRk1UX1lVVko0MTFQLCBBVl9QSVhfRk1UX1lVVko0 MjBQLCBBVl9QSVhfRk1UX1lVVko0MjJQLAorICAgIEFWX1BJWF9GTVRfWVVWSjQ0MFAsIEFWX1BJ WF9GTVRfWVVWSjQ0NFAsCisgICAgQVZfUElYX0ZNVF9HQlJQLCBBVl9QSVhfRk1UX0dCUlA5LCBB Vl9QSVhfRk1UX0dCUlAxMCwKKyAgICBBVl9QSVhfRk1UX0dCUlAxMiwgQVZfUElYX0ZNVF9HQlJQ MTQsIEFWX1BJWF9GTVRfR0JSUDE2LAorICAgIEFWX1BJWF9GTVRfR0JSQVAsIEFWX1BJWF9GTVRf R0JSQVAxMCwgQVZfUElYX0ZNVF9HQlJBUDEyLCBBVl9QSVhfRk1UX0dCUkFQMTYsCisgICAgQVZf UElYX0ZNVF9OT05FCit9OworCitzdGF0aWMgaW50IGNvbmZpZ19pbnB1dF9yZWYoQVZGaWx0ZXJM aW5rICppbmxpbmspCit7CisgICAgY29uc3QgQVZQaXhGbXREZXNjcmlwdG9yICpkZXNjID0gYXZf cGl4X2ZtdF9kZXNjX2dldChpbmxpbmstPmZvcm1hdCk7CisgICAgQVZGaWx0ZXJDb250ZXh0ICAq Y3R4ID0gaW5saW5rLT5kc3Q7CisgICAgWFBTTlJDb250ZXh0KiBjb25zdCBzID0gY3R4LT5wcml2 OworCisgICAgaWYgKChjdHgtPmlucHV0c1swXS0+dyAhPSBjdHgtPmlucHV0c1sxXS0+dykgfHwK KyAgICAgICAgKGN0eC0+aW5wdXRzWzBdLT5oICE9IGN0eC0+aW5wdXRzWzFdLT5oKSkgeworICAg ICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJXaWR0aCBhbmQgaGVpZ2h0IG9mIHRoZSBp bnB1dCB2aWRlb3MgbXVzdCBtYXRjaC5cbiIpOworCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJ TlZBTCk7CisgICAgfQorCisgICAgaWYgKGN0eC0+aW5wdXRzWzBdLT5mb3JtYXQgIT0gY3R4LT5p bnB1dHNbMV0tPmZvcm1hdCkgeworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJU aGUgaW5wdXQgdmlkZW9zIG11c3QgYmUgb2YgdGhlIHNhbWUgcGl4ZWwgZm9ybWF0LlxuIik7CisK KyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisKKyAgICBzLT5icHAgPSAg KGRlc2MtPmNvbXBbMF0uZGVwdGggPD0gOCA/IDEgOiAyKTsKKyAgICBzLT5kZXB0aCA9IGRlc2Mt PmNvbXBbMF0uZGVwdGg7CisjaWYgMQorICAgIHMtPm1heF9lcnJvcl82NCA9ICgxIDw8IHMtPmRl cHRoKSAtIDE7IC8qIGNvbnZlbnRpb25hbCBsaW1pdCAqLworI2Vsc2UKKyAgICBzLT5tYXhfZXJy b3JfNjQgPSAyNTUgKiAoMSA8PCAocy0+ZGVwdGggLSA4KSk7IC8qIEpWRVQgc3R5bGUgKi8KKyNl bmRpZgorICAgIHMtPm1heF9lcnJvcl82NCAqPSBzLT5tYXhfZXJyb3JfNjQ7CisKKyAgICBzLT5m cmFtZV9yYXRlID0gaW5saW5rLT5mcmFtZV9yYXRlLm51bSAvIGlubGluay0+ZnJhbWVfcmF0ZS5k ZW47CisKKyAgICBzLT5udW1fY29tcHMgPSAoZGVzYy0+bmJfY29tcG9uZW50cyA+IDMgPyAzIDog ZGVzYy0+bmJfY29tcG9uZW50cyk7CisKKyAgICBzLT5pc19yZ2IgPSAoZmZfZmlsbF9yZ2JhX21h cChzLT5yZ2JhX21hcCwgaW5saW5rLT5mb3JtYXQpID49IDApOworICAgIHMtPmNvbXBzWzBdID0g KHMtPmlzX3JnYiA/ICdSJyA6ICdZJyk7CisgICAgcy0+Y29tcHNbMV0gPSAocy0+aXNfcmdiID8g J0cnIDogJ1UnKTsKKyAgICBzLT5jb21wc1syXSA9IChzLT5pc19yZ2IgPyAnQicgOiAnVicpOwor ICAgIHMtPmNvbXBzWzNdID0gJ0EnOworCisgICAgcy0+cGxhbmVfd2lkdGggWzFdID0gcy0+cGxh bmVfd2lkdGggWzJdID0gQVZfQ0VJTF9SU0hJRlQoaW5saW5rLT53LCBkZXNjLT5sb2cyX2Nocm9t YV93KTsKKyAgICBzLT5wbGFuZV93aWR0aCBbMF0gPSBzLT5wbGFuZV93aWR0aCBbM10gPSBpbmxp bmstPnc7CisgICAgcy0+cGxhbmVfaGVpZ2h0WzFdID0gcy0+cGxhbmVfaGVpZ2h0WzJdID0gQVZf Q0VJTF9SU0hJRlQoaW5saW5rLT5oLCBkZXNjLT5sb2cyX2Nocm9tYV9oKTsKKyAgICBzLT5wbGFu ZV9oZWlnaHRbMF0gPSBzLT5wbGFuZV9oZWlnaHRbM10gPSBpbmxpbmstPmg7CisKKyAgICBzLT5k c3Auc3NlX2xpbmUgPSBzc2VfbGluZV8xNmJpdDsKKyAgICBzLT5kc3AuaGlnaGRzX2Z1bmMgPSBo aWdoZHM7IC8qIGluaXRpYWxpemUgZmlsdGVyaW5nIG1ldGhvZHMgKi8KKyAgICBzLT5kc3AuZGlm ZjFzdF9mdW5jID0gZGlmZjFzdDsKKyAgICBzLT5kc3AuZGlmZjJuZF9mdW5jID0gZGlmZjJuZDsK KyNpZiBBUkNIX1g4NgorICAgIGZmX3hwc25yX2luaXRfeDg2KCZzLT5kc3AsIDE1KTsgLyogaW5p dGlhbGl6ZSB4ODYgU1NFIG1ldGhvZCAqLworI2VuZGlmCisKKyAgICByZXR1cm4gMDsKK30KKwor c3RhdGljIGludCBjb25maWdfb3V0cHV0KEFWRmlsdGVyTGluayAqb3V0bGluaykKK3sKKyAgICBB VkZpbHRlckNvbnRleHQgKmN0eCA9IG91dGxpbmstPnNyYzsKKyAgICBBVkZpbHRlckxpbmsgKmlu bGluayA9IGN0eC0+aW5wdXRzWzBdOworICAgIFhQU05SQ29udGV4dCAqcyA9IGN0eC0+cHJpdjsK KyAgICBpbnQgcmV0X3ZhbHVlOworCisgICAgaWYgKChyZXRfdmFsdWUgPSBmZl9mcmFtZXN5bmNf aW5pdF9kdWFsaW5wdXQoJnMtPmZzLCBjdHgpKSA8IDApCisgICAgICAgIHJldHVybiByZXRfdmFs dWU7CisKKyAgICBvdXRsaW5rLT53ID0gaW5saW5rLT53OworICAgIG91dGxpbmstPmggPSBpbmxp bmstPmg7CisgICAgb3V0bGluay0+ZnJhbWVfcmF0ZSA9IGlubGluay0+ZnJhbWVfcmF0ZTsKKyAg ICBvdXRsaW5rLT5zYW1wbGVfYXNwZWN0X3JhdGlvID0gaW5saW5rLT5zYW1wbGVfYXNwZWN0X3Jh dGlvOworICAgIG91dGxpbmstPnRpbWVfYmFzZSA9IGlubGluay0+dGltZV9iYXNlOworCisgICAg aWYgKChyZXRfdmFsdWUgPSBmZl9mcmFtZXN5bmNfY29uZmlndXJlKCZzLT5mcykpIDwgMCkKKyAg ICAgICAgcmV0dXJuIHJldF92YWx1ZTsKKworICAgIG91dGxpbmstPnRpbWVfYmFzZSA9IHMtPmZz LnRpbWVfYmFzZTsKKworICAgIGlmIChhdl9jbXBfcShpbmxpbmstPnRpbWVfYmFzZSwgb3V0bGlu ay0+dGltZV9iYXNlKSB8fAorICAgICAgICBhdl9jbXBfcShjdHgtPmlucHV0c1sxXS0+dGltZV9i YXNlLCBvdXRsaW5rLT50aW1lX2Jhc2UpKSB7CisgICAgICAgIGF2X2xvZyAoY3R4LCBBVl9MT0df V0FSTklORywgIk5vdCBtYXRjaGluZyB0aW1lYmFzZXMgZm91bmQgYmV0d2VlbiBmaXJzdCBpbnB1 dDogJWQvJWQgYW5kIHNlY29uZCBpbnB1dCAlZC8lZCwgcmVzdWx0cyBtYXkgYmUgaW5jb3JyZWN0 IVxuIiwKKyAgICAgICAgICAgICAgICBpbmxpbmstPnRpbWVfYmFzZS5udW0sIGlubGluay0+dGlt ZV9iYXNlLmRlbiwKKyAgICAgICAgICAgICAgICBjdHgtPmlucHV0c1sxXS0+dGltZV9iYXNlLm51 bSwgY3R4LT5pbnB1dHNbMV0tPnRpbWVfYmFzZS5kZW4pOworICAgIH0KKworICAgIHJldHVybiAw OworfQorCitzdGF0aWMgaW50IGFjdGl2YXRlKEFWRmlsdGVyQ29udGV4dCAqY3R4KQoreworICAg IFhQU05SQ29udGV4dCAqcyA9IGN0eC0+cHJpdjsKKworICAgIHJldHVybiBmZl9mcmFtZXN5bmNf YWN0aXZhdGUoJnMtPmZzKTsKK30KKworc3RhdGljIGF2X2NvbGQgdm9pZCB1bmluaXQoQVZGaWx0 ZXJDb250ZXh0ICpjdHgpCit7CisgICAgWFBTTlJDb250ZXh0KiBjb25zdCBzID0gY3R4LT5wcml2 OworICAgIGludCBjOworCisgICAgaWYgKHMtPm51bV9mcmFtZXNfNjQgPiAwKSB7IC8qIHByaW50 IG91dCBvdmVyYWxsIGNvbXBvbmVudC13aXNlIG1lYW4gWFBTTlIgKi8KKyAgICAgICAgY29uc3Qg ZG91YmxlIHhwc25yX2x1bWEgPSBnZXRfYXZnX3hwc25yKHMtPnN1bV93ZGlzdFswXSwgICBzLT5z dW1feHBzbnJbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICBzLT5wbGFuZV93aWR0aFswXSwgcy0+cGxhbmVfaGVpZ2h0WzBdLAorICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+bWF4X2Vycm9yXzY0LCAgIHMt Pm51bV9mcmFtZXNfNjQpOworICAgICAgICBkb3VibGUgeHBzbnJfbWluID0geHBzbnJfbHVtYTsK KworICAgICAgICAvKiBsdW1hICovCisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19JTkZPLCAi WFBTTlIgICVjOiAlMy40ZiIsIHMtPmNvbXBzWzBdLCB4cHNucl9sdW1hKTsKKyAgICAgICAgaWYg KHMtPnN0YXRzX2ZpbGUpIHsKKyAgICAgICAgICAgIGZwcmludGYocy0+c3RhdHNfZmlsZSwgIlxu WFBTTlIgYXZlcmFnZSwgJSJQUklkNjQiIGZyYW1lcyIsIHMtPm51bV9mcmFtZXNfNjQpOworICAg ICAgICAgICAgZnByaW50ZihzLT5zdGF0c19maWxlLCAiICAlYzogJTMuNGYiLCBzLT5jb21wc1sw XSwgeHBzbnJfbHVtYSk7CisgICAgICAgIH0KKyAgICAgICAgLyogY2hyb21hICovCisgICAgICAg IGZvciAoYyA9IDE7IGMgPCBzLT5udW1fY29tcHM7IGMrKykgeworICAgICAgICAgICAgY29uc3Qg ZG91YmxlIHhwc25yX2Nocm9tYSA9IGdldF9hdmdfeHBzbnIocy0+c3VtX3dkaXN0W2NdLCAgIHMt PnN1bV94cHNucltjXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIHMtPnBsYW5lX3dpZHRoW2NdLCBzLT5wbGFuZV9oZWlnaHRbY10sCisgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5tYXhf ZXJyb3JfNjQsICAgcy0+bnVtX2ZyYW1lc182NCk7CisgICAgICAgICAgICBpZiAoeHBzbnJfbWlu ID4geHBzbnJfY2hyb21hKSB7CisgICAgICAgICAgICAgICAgeHBzbnJfbWluID0geHBzbnJfY2hy b21hOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfSU5G TywgIiAgJWM6ICUzLjRmIiwgcy0+Y29tcHNbY10sIHhwc25yX2Nocm9tYSk7CisgICAgICAgICAg ICBpZiAocy0+c3RhdHNfZmlsZSAmJiBzLT5zdGF0c19maWxlICE9IHN0ZG91dCkgeworICAgICAg ICAgICAgICAgIGZwcmludGYocy0+c3RhdHNfZmlsZSwgIiAgJWM6ICUzLjRmIiwgcy0+Y29tcHNb Y10sIHhwc25yX2Nocm9tYSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLyog cHJpbnQgb3V0IGxpbmUgYnJlYWssIGFuZCBtaW5pbXVtIFhQU05SIGFjcm9zcyB0aGUgY29sb3Ig Y29tcG9uZW50cyAqLworICAgICAgICBpZiAocy0+bnVtX2NvbXBzID4gMSkgeworICAgICAgICAg ICAgYXZfbG9nKGN0eCwgQVZfTE9HX0lORk8sICIgIChtaW5pbXVtOiAlMy40ZilcbiIsIHhwc25y X21pbik7CisgICAgICAgICAgICBpZiAocy0+c3RhdHNfZmlsZSAmJiBzLT5zdGF0c19maWxlICE9 IHN0ZG91dCkgeworICAgICAgICAgICAgICAgIGZwcmludGYocy0+c3RhdHNfZmlsZSwgIiAgKG1p bmltdW06ICUzLjRmKVxuIiwgeHBzbnJfbWluKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBl bHNlIHsKKyAgICAgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19JTkZPLCAiXG4iKTsKKyAgICAg ICAgICAgIGlmIChzLT5zdGF0c19maWxlICYmIHMtPnN0YXRzX2ZpbGUgIT0gc3Rkb3V0KSB7Cisg ICAgICAgICAgICAgICAgZnByaW50ZihzLT5zdGF0c19maWxlLCAiXG4iKTsKKyAgICAgICAgICAg IH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGZmX2ZyYW1lc3luY191bmluaXQoJnMtPmZzKTsg LyogZnJlZSB0ZW1wb3JhcnkgcGljdHVyZSBvciBibG9jayBidWYgbWVtb3J5ICovCisKKyAgICBp ZiAocy0+c3RhdHNfZmlsZSAmJiBzLT5zdGF0c19maWxlICE9IHN0ZG91dCkKKyAgICAgICAgZmNs b3NlKHMtPnN0YXRzX2ZpbGUpOworCisgICAgaWYgKHMtPnNzZV9sdW1hKSBhdl9mcmVlcCgmcy0+ c3NlX2x1bWEpOworICAgIGlmIChzLT53ZWlnaHRzICkgYXZfZnJlZXAoJnMtPndlaWdodHMgKTsK KworICAgIGZvciAoYyA9IDA7IGMgPCBzLT5udW1fY29tcHM7IGMrKykgeyAvKiBmcmVlIGV4dHJh IHRlbXBvcmFsIG9yZyBidWYgbWVtb3J5ICovCisgICAgICAgIGlmIChzLT5idWZfb3JnX20xW2Nd KSBhdl9mcmVlcCgmcy0+YnVmX29yZ19tMVtjXSk7CisgICAgICAgIGlmIChzLT5idWZfb3JnX20y W2NdKSBhdl9mcmVlcCgmcy0+YnVmX29yZ19tMltjXSk7CisgICAgfQorICAgIGlmIChzLT5icHAg PT0gMSkgeyAvKiA4IGJpdCAqLworICAgICAgICBmb3IgKGMgPSAwOyBjIDwgcy0+bnVtX2NvbXBz OyBjKyspIHsgLyogYW5kIG9yZy9yZWMgcGljdHVyZSBidWYgbWVtb3J5ICovCisgICAgICAgICAg ICBpZiAoJnMtPmJ1Zl9vcmdbY10pIGF2X2ZyZWVwKCZzLT5idWZfb3JnW2NdKTsKKyAgICAgICAg ICAgIGlmICgmcy0+YnVmX3JlY1tjXSkgYXZfZnJlZXAoJnMtPmJ1Zl9yZWNbY10pOworICAgICAg ICB9CisgICAgfQorfQorCitzdGF0aWMgY29uc3QgQVZGaWx0ZXJQYWQgeHBzbnJfaW5wdXRzW10g PSB7CisgICAgeworICAgICAgICAubmFtZSAgICAgICAgID0gIm1haW4iLAorICAgICAgICAudHlw ZSAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgIH0sIHsKKyAgICAgICAgLm5hbWUg ICAgICAgICA9ICJyZWZlcmVuY2UiLAorICAgICAgICAudHlwZSAgICAgICAgID0gQVZNRURJQV9U WVBFX1ZJREVPLAorICAgICAgICAuY29uZmlnX3Byb3BzID0gY29uZmlnX2lucHV0X3JlZiwKKyAg ICB9Cit9OworCitzdGF0aWMgY29uc3QgQVZGaWx0ZXJQYWQgeHBzbnJfb3V0cHV0c1tdID0gewor ICAgIHsKKyAgICAgICAgLm5hbWUgICAgICAgICA9ICJkZWZhdWx0IiwKKyAgICAgICAgLnR5cGUg ICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAgICAgLmNvbmZpZ19wcm9wcyA9IGNv bmZpZ19vdXRwdXQsCisgICAgfQorfTsKKworY29uc3QgQVZGaWx0ZXIgZmZfdmZfeHBzbnIgPSB7 CisgICAgLm5hbWUgICAgICAgICA9ICJ4cHNuciIsCisgICAgLmRlc2NyaXB0aW9uICA9IE5VTExf SUZfQ09ORklHX1NNQUxMKCJDYWxjdWxhdGUgdGhlIGV4dGVuZGVkIHBlcmNlcHR1YWxseSB3ZWln aHRlZCBwZWFrIHNpZ25hbC10by1ub2lzZSByYXRpbyAoWFBTTlIpIGJldHdlZW4gdHdvIHZpZGVv IHN0cmVhbXMuIiksCisgICAgLnByZWluaXQgICAgICA9IHhwc25yX2ZyYW1lc3luY19wcmVpbml0 LAorICAgIC5pbml0ICAgICAgICAgPSBpbml0LAorICAgIC51bmluaXQgICAgICAgPSB1bmluaXQs CisgICAgLmFjdGl2YXRlICAgICA9IGFjdGl2YXRlLAorICAgIC5wcml2X3NpemUgICAgPSBzaXpl b2YoWFBTTlJDb250ZXh0KSwKKyAgICAucHJpdl9jbGFzcyAgID0gJnhwc25yX2NsYXNzLAorICAg IEZJTFRFUl9JTlBVVFMgKHhwc25yX2lucHV0cyksCisgICAgRklMVEVSX09VVFBVVFMoeHBzbnJf b3V0cHV0cyksCisgICAgRklMVEVSX1BJWEZNVFNfQVJSQVkocGl4X2ZtdHMpLAorICAgIC5mbGFn cyAgICAgICAgPSBBVkZJTFRFUl9GTEFHX1NVUFBPUlRfVElNRUxJTkVfSU5URVJOQUwgfAorICAg ICAgICAgICAgICAgICAgICBBVkZJTFRFUl9GTEFHX01FVEFEQVRBX09OTFkKK307CmRpZmYgLS1n aXQgYS9saWJhdmZpbHRlci94ODYvTWFrZWZpbGUgYi9saWJhdmZpbHRlci94ODYvTWFrZWZpbGUK aW5kZXggZTg3NDgxYmQ3YS4uYjFmYWM3NjljNiAxMDA2NDQKLS0tIGEvbGliYXZmaWx0ZXIveDg2 L01ha2VmaWxlCisrKyBiL2xpYmF2ZmlsdGVyL3g4Ni9NYWtlZmlsZQpAQCAtMzgsNiArMzgsNyBA QCBPQkpTLSQoQ09ORklHX1RSQU5TUE9TRV9GSUxURVIpICAgICAgICAgICAgICArPSB4ODYvdmZf dHJhbnNwb3NlX2luaXQubwogT0JKUy0kKENPTkZJR19WT0xVTUVfRklMVEVSKSAgICAgICAgICAg ICAgICAgKz0geDg2L2FmX3ZvbHVtZV9pbml0Lm8KIE9CSlMtJChDT05GSUdfVjM2MF9GSUxURVIp ICAgICAgICAgICAgICAgICAgICs9IHg4Ni92Zl92MzYwX2luaXQubwogT0JKUy0kKENPTkZJR19X M0ZESUZfRklMVEVSKSAgICAgICAgICAgICAgICAgKz0geDg2L3ZmX3czZmRpZl9pbml0Lm8KK09C SlMtJChDT05GSUdfWFBTTlJfRklMVEVSKSAgICAgICAgICAgICAgICAgICs9IHg4Ni92Zl94cHNu cl9pbml0Lm8KIE9CSlMtJChDT05GSUdfWUFESUZfRklMVEVSKSAgICAgICAgICAgICAgICAgICs9 IHg4Ni92Zl95YWRpZl9pbml0Lm8KIAogWDg2QVNNLU9CSlMtJChDT05GSUdfU0NFTkVfU0FEKSAg ICAgICAgICAgICAgKz0geDg2L3NjZW5lX3NhZC5vCmRpZmYgLS1naXQgYS9saWJhdmZpbHRlci94 ODYvdmZfeHBzbnJfaW5pdC5jIGIvbGliYXZmaWx0ZXIveDg2L3ZmX3hwc25yX2luaXQuYwpuZXcg ZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwLi5lMWU0ZGYyYzA2Ci0tLSAvZGV2L251 bGwKKysrIGIvbGliYXZmaWx0ZXIveDg2L3ZmX3hwc25yX2luaXQuYwpAQCAtMCwwICsxLDQzIEBA CisvKgorICogQ29weXJpZ2h0IChjKSAyMDIzIENocmlzdGlhbiBSLiBIZWxtcmljaAorICogQ29w eXJpZ2h0IChjKSAyMDIzIENocmlzdGlhbiBTdG9mZmVycworICoKKyAqIFRoaXMgZmlsZSBpcyBw YXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiBy ZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRo ZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0 aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRo ZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAq IEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVs LAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQg d2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VM QVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5z ZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNv cHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0 aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRp b24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIx MTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBTSU1EIGluaXRpYWxpemF0aW9u IGZvciBjYWxjdWxhdGlvbiBvZiBleHRlbmRlZCBwZXJjZXB0dWFsbHkgd2VpZ2h0ZWQgUFNOUiAo WFBTTlIpLgorICoKKyAqIEF1dGhvcnM6IENocmlzdGlhbiBIZWxtcmljaCBhbmQgQ2hyaXN0aWFu IFN0b2ZmZXJzLCBGcmF1bmhvZmVyIEhISSwgQmVybGluLCBHZXJtYW55CisgKi8KKworI2luY2x1 ZGUgImxpYmF2dXRpbC94ODYvY3B1LmgiCisjaW5jbHVkZSAibGliYXZmaWx0ZXIveHBzbnIuaCIK KwordWludDY0X3QgZmZfc3NlX2xpbmVfMTZiaXRfc3NlMihjb25zdCB1aW50OF90ICpidWYsIGNv bnN0IHVpbnQ4X3QgKnJlZiwgY29uc3QgaW50IHcpOworCit2b2lkIGZmX3hwc25yX2luaXRfeDg2 KFBTTlJEU1BDb250ZXh0ICpkc3AsIGNvbnN0IGludCBicHApCit7CisgICAgaWYgKGJwcCA8PSAx NSkgeyAvKiBYUFNOUiBhbHdheXMgb3BlcmF0ZXMgd2l0aCAxNi1iaXQgaW50ZXJuYWwgcHJlY2lz aW9uICovCisgICAgICAgIGNvbnN0IGludCBjcHVfZmxhZ3MgPSBhdl9nZXRfY3B1X2ZsYWdzKCk7 CisKKyAgICAgICAgaWYgKEVYVEVSTkFMX1NTRTIoY3B1X2ZsYWdzKSkgeworICAgICAgICAgICAg ZHNwLT5zc2VfbGluZSA9IGZmX3NzZV9saW5lXzE2Yml0X3NzZTI7CisgICAgICAgIH0KKyAgICB9 Cit9CmRpZmYgLS1naXQgYS9saWJhdmZpbHRlci94cHNuci5oIGIvbGliYXZmaWx0ZXIveHBzbnIu aApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwLi5iZWQ3N2JhNDVkCi0tLSAv ZGV2L251bGwKKysrIGIvbGliYXZmaWx0ZXIveHBzbnIuaApAQCAtMCwwICsxLDQ3IEBACisvKgor ICogQ29weXJpZ2h0IChjKSAyMDIzIENocmlzdGlhbiBSLiBIZWxtcmljaAorICogQ29weXJpZ2h0 IChjKSAyMDIzIENocmlzdGlhbiBTdG9mZmVycworICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9m IEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3Ry aWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUg TGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJl ZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNl bnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBl ZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICog YnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFu dHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVS UE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3Ig bW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2Yg dGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1w ZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIElu Yy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMw MSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBQdWJsaWMgZGVjbGFyYXRpb24gb2YgRFNQ IGNvbnRleHQgc3RydWN0dXJlIG9mIFhQU05SIG1lYXN1cmVtZW50IGZpbHRlciBmb3IgRkZtcGVn LgorICoKKyAqIEF1dGhvcnM6IENocmlzdGlhbiBIZWxtcmljaCBhbmQgQ2hyaXN0aWFuIFN0b2Zm ZXJzLCBGcmF1bmhvZmVyIEhISSwgQmVybGluLCBHZXJtYW55CisgKi8KKworI2lmbmRlZiBBVkZJ TFRFUl9YUFNOUl9ICisjZGVmaW5lIEFWRklMVEVSX1hQU05SX0gKKworI2luY2x1ZGUgPHN0ZGRl Zi5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgImxpYmF2dXRpbC94ODYvY3B1Lmgi CisKKy8qIHB1YmxpYyBYUFNOUiBEU1Agc3RydWN0dXJlIGRlZmluaXRpb24gKi8KKwordHlwZWRl ZiBzdHJ1Y3QgWFBTTlJEU1BDb250ZXh0IHsKKyAgICB1aW50NjRfdCAoKnNzZV9saW5lKSAoY29u c3QgdWludDhfdCAqYnVmLCBjb25zdCB1aW50OF90ICpyZWYsIGNvbnN0IGludCB3KTsKKyAgICB1 aW50NjRfdCAoKmhpZ2hkc19mdW5jKSAoY29uc3QgaW50IHhfYWN0LCBjb25zdCBpbnQgeV9hY3Qs IGNvbnN0IGludCB3X2FjdCwgY29uc3QgaW50IGhfYWN0LCBjb25zdCBpbnQxNl90ICpvX20wLCBj b25zdCBpbnQgbyk7CisgICAgdWludDY0X3QgKCpkaWZmMXN0X2Z1bmMpKGNvbnN0IHVpbnQzMl90 IHdfYWN0LCBjb25zdCB1aW50MzJfdCBoX2FjdCwgY29uc3QgaW50MTZfdCAqb19tMCwgaW50MTZf dCAqb19tMSwgY29uc3QgaW50IG8pOworICAgIHVpbnQ2NF90ICgqZGlmZjJuZF9mdW5jKShjb25z dCB1aW50MzJfdCB3X2FjdCwgY29uc3QgdWludDMyX3QgaF9hY3QsIGNvbnN0IGludDE2X3QgKm9f bTAsIGludDE2X3QgKm9fbTEsIGludDE2X3QgKm9fbTIsIGNvbnN0IGludCBvKTsKK30gUFNOUkRT UENvbnRleHQ7CisKK3ZvaWQgZmZfeHBzbnJfaW5pdF94ODYoUFNOUkRTUENvbnRleHQgKmRzcCwg Y29uc3QgaW50IGJwcCk7CisKKyNlbmRpZiAvKiBBVkZJTFRFUl9YUFNOUl9IICovCi0tIAoyLjM0 LjAud2luZG93cy4xCgo= --_004_9253f80c790940da98d393efbe664cf6hhifraunhoferde_ Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Disposition: inline _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe". --_004_9253f80c790940da98d393efbe664cf6hhifraunhoferde_--