From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from esa4.mentor.iphmx.com (esa4.mentor.iphmx.com [68.232.137.252]) by sourceware.org (Postfix) with ESMTPS id 9A7583858C78; Fri, 17 Feb 2023 11:14:01 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 9A7583858C78 Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=codesourcery.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=mentor.com X-IronPort-AV: E=Sophos;i="5.97,304,1669104000"; d="diff'?scan'208";a="97337220" Received: from orw-gwy-02-in.mentorg.com ([192.94.38.167]) by esa4.mentor.iphmx.com with ESMTP; 17 Feb 2023 03:14:00 -0800 IronPort-SDR: gclGWfbdXtSE9dsl+DXbVpc+0x8+7XPcr3LPirxty1vEN3lub9qsn73bkFPiXaE3Tegdp2j3T4 HgqbX4R+Ytzf49lXh30TuI8vJxGmJOE5tsl9y3XgvxP5JU4sz+fX8tmE7itqw1Laji6RYAXrpA 7vGsbW/bVV0DGXi6zZBTaItk0554krJQEyFfQ4VSa2S3244TIvv/qgv6m93E9kRHoJo1syN4ji UT2hGo6igTrtJM9nJojNJzGEpMVitt3ELKgb47Y+q8xzXbcKmTcDVwF5Ql8vN77HnuM/jOfawB eWM= Content-Type: multipart/mixed; boundary="------------p9bb2A0KiLebOdKESiml2PsR" Message-ID: <27cd606a-f019-60b2-a9c8-0a570433b5eb@codesourcery.com> Date: Fri, 17 Feb 2023 12:13:52 +0100 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Thunderbird/102.7.2 Content-Language: en-US To: gcc-patches , fortran CC: Paul Richard Thomas From: Tobias Burnus Subject: [Patch] Fortran: Avoid SAVE_EXPR for deferred-len char types X-Originating-IP: [137.202.0.90] X-ClientProxiedBy: svr-ies-mbx-15.mgc.mentorg.com (139.181.222.15) To svr-ies-mbx-12.mgc.mentorg.com (139.181.222.12) X-Spam-Status: No, score=-11.4 required=5.0 tests=BAYES_00,GIT_PATCH_0,HEADER_FROM_DIFFERENT_DOMAINS,KAM_DMARC_STATUS,SPF_HELO_PASS,SPF_PASS,TXREP autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org List-Id: --------------p9bb2A0KiLebOdKESiml2PsR Content-Type: text/plain; charset="UTF-8"; format=flowed Content-Transfer-Encoding: quoted-printable Short version: This fixes potential and real bugs related to 'len=3D:' character variables as for the length/byte size an old/saved expression is used instead of the current value. - That's fine but not for allocatable/pointer with 'len= =3D:'. Main part of the patch: Strip the SAVE_EXPR from the size expression: if (len && deferred && TREE_CODE (TYPE_SIZE (type)) =3D=3D SAVE_EXPR) { gcc_assert (TREE_CODE (TYPE_SIZE_UNIT (type)) =3D=3D SAVE_EXPR); TYPE_SIZE (type) =3D TREE_OPERAND (TYPE_SIZE (type), 0); TYPE_SIZE_UNIT (type) =3D TREE_OPERAND (TYPE_SIZE_UNIT (type), 0); } OK for mainline? * * * Long version: BACKGROUND: (A) VLA / EXPLICIT-SIZE ARRAYS + LEN=3D STRINGS C knows something like VLA (variable length arrays), likewise Fortran knows explicit size array and character length where the length/size depends on an variable set before the current scoping unit. Examples: void f(int N) { int vla[N*5]; } subroutine foo(n) integer :: n integer :: array(n*5) integer :: my_len ... my_len =3D 5 block character(len=3Dmy_len, kind=3D4) :: str my_len =3D 99 print *, len(str) ! still shows 5 - not 99 end block end In all cases, the size / length is not known at compile time but it won't c= hange. Thus, expressions like (pseudo code) byte_size =3D n * 5 * sizeof(integer) can be saved and re-used and do not have to be re-calculated every time the TYPE_SIZE or TYPE_UNIT_SIZE is used. In particular, the 'my_len' example shows that just using the current value= of 'my_len' would be wrong as it can be overridden. * * * (B) DEFERRED-LENGTH STRINGS ('character(len=3D:), pointer/allocatable') But with deferred-length strings, such as character(len=3D:), pointer :: pstr(:) ... allocate(character(len=3D2) :: pstr(5)) ... !$omp target enter data map(alloc: pstr(2:5)) this leads to code like: integer(kind=3D8) .pstr; struct array01_character(kind=3D1) pstr; D.4302 =3D (sizetype) NON_LVALUE_EXPR <.pstr>; pstr.dtype =3D {.elem_len=3D(unsigned long) .pstr, .rank=3D1, .type=3D6}= ; ... .pstr =3D 2; // during allocation/pointer assignment ... parm.1.data =3D pstr.data + (sizetype) ((~pstr.dim[0].lbound * D.428= 7) * (integer(kind=3D8)) SAVE_EXPR ); And here D.4302 is the pre-calculated value instead of the current value, which can be either 0 or some random value. Such code happens when using code like: elemsz =3D TYPE_SIZE_UNIT (gfc_get_element_type (type)); Of course, there are various ways to avoid this =E2=80=93 like obtaining so= mehow the string length directly - either from the expression or from the type such a= s TYPE_DOMAIN (type) but it can easily go wrong. * * * IDEAL SOLUTION: I think from the middle-end perspective, we should do: build_range_type (type, 0, NULL_TREE) leaving the upper bound unspecified =E2=80=93 which should also help with type-is-the-same middle-end analysis. PRACTICAL SOLUTION: But as code like TYPE_SIZE_UNIT is very widely used - and we currently lack a place to store the tree decl for the length, I propose the following as d= iscussed with Jakub yesterday: We just remove SAVE_EXPR after generating the type. Side note: In some cases, the type is already constructed with len =3D NULL= ; I have not checked when. In that case, using TYPE_SIZE will fail at compile time. (That remains unchanged by this patch.) * * * OK for mainline? Tobias * * * PS: I have no real opinion whether we want to have any backports, thoughts? PPS: I don't have any real example I want to add as most cases have been wo= rk-around fixed in the meanwhile. If you want to test it, the following fails. I inte= nt to add an extended tests as part of a larger follow-up patch which fixes more Open= MP issues: character(len=3D:), pointer :: pstr(:) allocate(character(len=3D2) :: pstr(5)) !$omp target enter data map(alloc: pstr(2:5)) end Compile with -fopenmp -fdump-tree-original (or a later dump). BEFORE the patch: integer(kind=3D8) .pstr; ... D.4291 =3D (sizetype) NON_LVALUE_EXPR <.pstr>; pstr.dtype =3D {.elem_len=3D(unsigned long) .pstr, .rank=3D1, .type=3D6}= ; ... .pstr =3D 2; ... pstr.data =3D __builtin_malloc (10); ... parm.1.data =3D pstr.data + (sizetype) (((2 - pstr.dim[0].lbound) * = D.4287) * (integer(kind=3D8)) SAVE_EXPR ); AFTER the patch: ..... parm.1.data =3D pstr.data + (sizetype) (((2 - pstr.dim[0].lbound) * = D.4287) * NON_LVALUE_EXPR <.pstr>); ----------------- Siemens Electronic Design Automation GmbH; Anschrift: Arnulfstra=C3=9Fe 201= , 80634 M=C3=BCnchen; Gesellschaft mit beschr=C3=A4nkter Haftung; Gesch=C3= =A4ftsf=C3=BChrer: Thomas Heurung, Frank Th=C3=BCrauf; Sitz der Gesellschaf= t: M=C3=BCnchen; Registergericht M=C3=BCnchen, HRB 106955 --------------p9bb2A0KiLebOdKESiml2PsR Content-Type: text/x-patch; charset="UTF-8"; name="fix-deferred-len.diff" Content-Disposition: attachment; filename="fix-deferred-len.diff" Content-Transfer-Encoding: base64 Rm9ydHJhbjogQXZvaWQgU0FWRV9FWFBSIGZvciBkZWZlcnJlZC1sZW4gY2hhciB0eXBlcwoK VXNpbmcgVFlQRV9TSVpFL1RZUEVfU0laRV9VTklUIHdpdGggZGVmZXJyZWQtbGVuZ3RoIGNo YXJhY3RlciB2YXJpYWJsZXMsCmkuZS4gJ2NoYXJhY3RlcihsZW49OiksIGFsbG9jYXRhYmxl L3BvaW50ZXInIHVzZWQgYSBTQVZFX0VYUFIsIGkuZS4gdGhlCnZhbHVlIG9uIGVudHJ5IHRv IHRoZSBzY29wZSBpbnN0ZWFkIG9mIHRoZSBsYXRlc3QgdmFsdWUuCgpTb2x1dGlvbjogUmVt b3ZlIHRoZSBTQVZFX0VYUFIgYWdhaW4gaW4gdGhpcyBjYXNlLgoKZ2NjL2ZvcnRyYW4vQ2hh bmdlTG9nOgoKCSogdHJhbnMtdHlwZXMuaCAoZ2ZjX2dldF9jaGFyYWN0ZXJfdHlwZSwgZ2Zj X2dldF9jaGFyYWN0ZXJfdHlwZV9sZW4sCgkoZ2ZjX2dldF9jaGFyYWN0ZXJfdHlwZV9sZW5f Zm9yX2VsdHlwZSk6IEFkZCBhcmd1bWVudCAnYm9vbCBkZWZlcnJlZCcuCgkqIHRyYW5zLXR5 cGVzLmNjIChnZmNfZ2V0X2NoYXJhY3Rlcl90eXBlX2xlbl9mb3JfZWx0eXBlKTogTGlrZXdp c2U7CglyZW1vdmUgdGhlIFNBVkVfRVhQUiBmb3IgdGhlIHR5cGUgc2l6ZSBmb3IgZGVmZXJy ZWQgc3RyaW5nIGxlbmd0aHMuCgkoZ2ZjX2dldF9jaGFyYWN0ZXJfdHlwZV9sZW4sIGdmY19n ZXRfY2hhcmFjdGVyX3R5cGUpOiBBZGQgYXJnCglhbmQgcGFzcyBvbi4KCShnZmNfdHlwZW5v ZGVfZm9yX3NwZWMpOiBVcGRhdGUgY2FsbC4KCSogdHJhbnMtYXJyYXkuY2MgKGdmY190cmFu c19jcmVhdGVfdGVtcF9hcnJheSwKCXRyYW5zX2FycmF5X2NvbnN0cnVjdG9yLCBnZmNfY29u dl9sb29wX3NldHVwLCBnZmNfYXJyYXlfaW5pdF9zaXplLAoJZ2ZjX2FsbG9jX2FsbG9jYXRh YmxlX2Zvcl9hc3NpZ25tZW50KTogTGlrZXdpc2UuCgkqIHRyYW5zLWV4cHIuY2MgKGdmY19j b252X3N1YnN0cmluZywgZ2ZjX2NvbnZfY29uY2F0X29wLAoJZ2ZjX2FkZF9pbnRlcmZhY2Vf bWFwcGluZywgZ2ZjX2NvbnZfcHJvY2VkdXJlX2NhbGwsCglnZmNfY29udl9zdGF0ZW1lbnRf ZnVuY3Rpb24sIGdmY19jb252X3N0cmluZ19wYXJhbWV0ZXIpOiBMaWtld2lzZS4KCSogdHJh bnMtaW50cmluc2ljLmNjIChnZmNfY29udl9pbnRyaW5zaWNfdHJhbnNmZXIsCglnZmNfY29u dl9pbnRyaW5zaWNfcmVwZWF0KTogTGlrZXdpc2UuCgkqIHRyYW5zLXN0bXQuY2MgKGZvcmFs bF9tYWtlX3ZhcmlhYmxlX3RlbXAsCglnZmNfdHJhbnNfYXNzaWduX25lZWRfdGVtcCk6IExp a2V3aXNlLgoKIGdjYy9mb3J0cmFuL3RyYW5zLWFycmF5LmNjICAgICB8IDExICsrKysrKy0t LS0tCiBnY2MvZm9ydHJhbi90cmFucy1leHByLmNjICAgICAgfCAxNSArKysrKysrKy0tLS0t LS0KIGdjYy9mb3J0cmFuL3RyYW5zLWludHJpbnNpYy5jYyB8ICA1ICsrKy0tCiBnY2MvZm9y dHJhbi90cmFucy1zdG10LmNjICAgICAgfCAgNyArKysrLS0tCiBnY2MvZm9ydHJhbi90cmFu cy10eXBlcy5jYyAgICAgfCAzOSArKysrKysrKysrKysrKysrKysrKysrKysrKysrKystLS0t LS0tLS0KIGdjYy9mb3J0cmFuL3RyYW5zLXR5cGVzLmggICAgICB8ICA2ICsrKy0tLQogNiBm aWxlcyBjaGFuZ2VkLCA1NCBpbnNlcnRpb25zKCspLCAyOSBkZWxldGlvbnMoLSkKCmRpZmYg LS1naXQgYS9nY2MvZm9ydHJhbi90cmFucy1hcnJheS5jYyBiL2djYy9mb3J0cmFuL3RyYW5z LWFycmF5LmNjCmluZGV4IDYzYmQxYWM1NzNhLi5iMGFiZGFkYzNmNSAxMDA2NDQKLS0tIGEv Z2NjL2ZvcnRyYW4vdHJhbnMtYXJyYXkuY2MKKysrIGIvZ2NjL2ZvcnRyYW4vdHJhbnMtYXJy YXkuY2MKQEAgLTE0ODAsNyArMTQ4MCw3IEBAIGdmY190cmFuc19jcmVhdGVfdGVtcF9hcnJh eSAoc3RtdGJsb2NrX3QgKiBwcmUsIHN0bXRibG9ja190ICogcG9zdCwgZ2ZjX3NzICogc3Ms CiAgICAgICBlbGVtc2l6ZSA9IGdmY19yZXNpemVfY2xhc3Nfc2l6ZV93aXRoX2xlbiAocHJl LCBjbGFzc19leHByLCBlbGVtc2l6ZSk7CiAgICAgICAvKiBDYXN0aW5nIHRoZSBkYXRhIGFz IGEgY2hhcmFjdGVyIG9mIHRoZSBkeW5hbWljIGxlbmd0aCBlbnN1cmVzIHRoYXQKIAkgYXNz aWdubWVudCBvZiBlbGVtZW50cyB3b3JrcyB3aGVuIG5lZWRlZC4gICovCi0gICAgICBlbHR5 cGUgPSBnZmNfZ2V0X2NoYXJhY3Rlcl90eXBlX2xlbiAoMSwgZWxlbXNpemUpOworICAgICAg ZWx0eXBlID0gZ2ZjX2dldF9jaGFyYWN0ZXJfdHlwZV9sZW4gKDEsIGVsZW1zaXplLCB0cnVl KTsKICAgICB9CiAKICAgbWVtc2V0IChmcm9tLCAwLCBzaXplb2YgKGZyb20pKTsKQEAgLTI4 MjMsNyArMjgyMyw4IEBAIHRyYW5zX2FycmF5X2NvbnN0cnVjdG9yIChnZmNfc3MgKiBzcywg bG9jdXMgKiB3aGVyZSkKIAogICAgICAgc3RvcmVfYmFja2VuZF9kZWNsICgmZXhwci0+dHMu dS5jbCwgc3NfaW5mby0+c3RyaW5nX2xlbmd0aCwgZm9yY2VfbmV3X2NsKTsKIAotICAgICAg dHlwZSA9IGdmY19nZXRfY2hhcmFjdGVyX3R5cGVfbGVuIChleHByLT50cy5raW5kLCBzc19p bmZvLT5zdHJpbmdfbGVuZ3RoKTsKKyAgICAgIHR5cGUgPSBnZmNfZ2V0X2NoYXJhY3Rlcl90 eXBlX2xlbiAoZXhwci0+dHMua2luZCwgc3NfaW5mby0+c3RyaW5nX2xlbmd0aCwKKwkJCQkJ IGV4cHItPnRzLmRlZmVycmVkKTsKICAgICAgIGlmIChjb25zdF9zdHJpbmcpCiAJdHlwZSA9 IGJ1aWxkX3BvaW50ZXJfdHlwZSAodHlwZSk7CiAgICAgfQpAQCAtNTQ5Miw3ICs1NDkzLDcg QEAgZ2ZjX2NvbnZfbG9vcF9zZXR1cCAoZ2ZjX2xvb3BpbmZvICogbG9vcCwgbG9jdXMgKiB3 aGVyZSkKIAl0bXBfc3NfaW5mby0+ZGF0YS50ZW1wLnR5cGUKIAkJPSBnZmNfZ2V0X2NoYXJh Y3Rlcl90eXBlX2xlbl9mb3JfZWx0eXBlCiAJCQkoVFJFRV9UWVBFICh0bXBfc3NfaW5mby0+ ZGF0YS50ZW1wLnR5cGUpLAotCQkJIHRtcF9zc19pbmZvLT5zdHJpbmdfbGVuZ3RoKTsKKwkJ CSB0bXBfc3NfaW5mby0+c3RyaW5nX2xlbmd0aCwgZmFsc2UpOwogCiAgICAgICB0bXAgPSB0 bXBfc3NfaW5mby0+ZGF0YS50ZW1wLnR5cGU7CiAgICAgICBtZW1zZXQgKCZ0bXBfc3NfaW5m by0+ZGF0YS5hcnJheSwgMCwgc2l6ZW9mIChnZmNfYXJyYXlfaW5mbykpOwpAQCAtNTczNyw3 ICs1NzM4LDcgQEAgZ2ZjX2FycmF5X2luaXRfc2l6ZSAodHJlZSBkZXNjcmlwdG9yLCBpbnQg cmFuaywgaW50IGNvcmFuaywgdHJlZSAqIHBvZmZzZXQsCiAgICAgICB0bXAgPSBmb2xkX2J1 aWxkM19sb2MgKGlucHV0X2xvY2F0aW9uLCBDT01QT05FTlRfUkVGLCBUUkVFX1RZUEUgKHRt cCksCiAJCQkgICAgIFRSRUVfT1BFUkFORCAoZGVzY3JpcHRvciwgMCksIHRtcCwgTlVMTF9U UkVFKTsKICAgICAgIHRtcCA9IGZvbGRfY29udmVydCAoZ2ZjX2NoYXJsZW5fdHlwZV9ub2Rl LCB0bXApOwotICAgICAgdHlwZSA9IGdmY19nZXRfY2hhcmFjdGVyX3R5cGVfbGVuIChleHBy LT50cy5raW5kLCB0bXApOworICAgICAgdHlwZSA9IGdmY19nZXRfY2hhcmFjdGVyX3R5cGVf bGVuIChleHByLT50cy5raW5kLCB0bXAsIGV4cHItPnRzLmRlZmVycmVkKTsKICAgICAgIHRt cCA9IGdmY19jb252X2Rlc2NyaXB0b3JfZHR5cGUgKGRlc2NyaXB0b3IpOwogICAgICAgZ2Zj X2FkZF9tb2RpZnkgKHBibG9jaywgdG1wLCBnZmNfZ2V0X2R0eXBlX3JhbmtfdHlwZSAocmFu aywgdHlwZSkpOwogICAgIH0KQEAgLTEwOTA4LDcgKzEwOTA5LDcgQEAgZ2ZjX2FsbG9jX2Fs bG9jYXRhYmxlX2Zvcl9hc3NpZ25tZW50IChnZmNfbG9vcGluZm8gKmxvb3AsCiAgICAgICBp ZiAoZXhwcjItPnRzLnR5cGUgIT0gQlRfQ0xBU1MpCiAJdHlwZSA9IGdmY190eXBlbm9kZV9m b3Jfc3BlYyAoJmV4cHIyLT50cyk7CiAgICAgICBlbHNlCi0JdHlwZSA9IGdmY19nZXRfY2hh cmFjdGVyX3R5cGVfbGVuICgxLCBlbGVtc2l6ZTIpOworCXR5cGUgPSBnZmNfZ2V0X2NoYXJh Y3Rlcl90eXBlX2xlbiAoMSwgZWxlbXNpemUyLCB0cnVlKTsKIAogICAgICAgZ2ZjX2FkZF9t b2RpZnkgKCZmYmxvY2ssIHRtcCwKIAkJICAgICAgZ2ZjX2dldF9kdHlwZV9yYW5rX3R5cGUg KGV4cHIyLT5yYW5rLHR5cGUpKTsKZGlmZiAtLWdpdCBhL2djYy9mb3J0cmFuL3RyYW5zLWV4 cHIuY2MgYi9nY2MvZm9ydHJhbi90cmFucy1leHByLmNjCmluZGV4IGU4NWI1M2ZhZTg1Li41 MGY4MWVhODg4MSAxMDA2NDQKLS0tIGEvZ2NjL2ZvcnRyYW4vdHJhbnMtZXhwci5jYworKysg Yi9nY2MvZm9ydHJhbi90cmFucy1leHByLmNjCkBAIC0yNTg5LDcgKzI1ODksNyBAQCBnZmNf Y29udl9zdWJzdHJpbmcgKGdmY19zZSAqIHNlLCBnZmNfcmVmICogcmVmLCBpbnQga2luZCwK ICAgY2hhciAqbXNnOwogICBtcHpfdCBsZW5ndGg7CiAKLSAgdHlwZSA9IGdmY19nZXRfY2hh cmFjdGVyX3R5cGUgKGtpbmQsIHJlZi0+dS5zcy5sZW5ndGgpOworICB0eXBlID0gZ2ZjX2dl dF9jaGFyYWN0ZXJfdHlwZSAoa2luZCwgcmVmLT51LnNzLmxlbmd0aCwgZmFsc2UpOwogICB0 eXBlID0gYnVpbGRfcG9pbnRlcl90eXBlICh0eXBlKTsKIAogICBnZmNfaW5pdF9zZSAoJnN0 YXJ0LCBzZSk7CkBAIC0zNzA5LDcgKzM3MDksNyBAQCBnZmNfY29udl9jb25jYXRfb3AgKGdm Y19zZSAqIHNlLCBnZmNfZXhwciAqIGV4cHIpCiAgIGdmY19hZGRfYmxvY2tfdG9fYmxvY2sg KCZzZS0+cHJlLCAmbHNlLnByZSk7CiAgIGdmY19hZGRfYmxvY2tfdG9fYmxvY2sgKCZzZS0+ cHJlLCAmcnNlLnByZSk7CiAKLSAgdHlwZSA9IGdmY19nZXRfY2hhcmFjdGVyX3R5cGUgKGV4 cHItPnRzLmtpbmQsIGV4cHItPnRzLnUuY2wpOworICB0eXBlID0gZ2ZjX2dldF9jaGFyYWN0 ZXJfdHlwZSAoZXhwci0+dHMua2luZCwgZXhwci0+dHMudS5jbCwgZmFsc2UpOwogICBsZW4g PSBUWVBFX01BWF9WQUxVRSAoVFlQRV9ET01BSU4gKHR5cGUpKTsKICAgaWYgKGxlbiA9PSBO VUxMX1RSRUUpCiAgICAgewpAQCAtNDQ3NCw3ICs0NDc0LDcgQEAgZ2ZjX2FkZF9pbnRlcmZh Y2VfbWFwcGluZyAoZ2ZjX2ludGVyZmFjZV9tYXBwaW5nICogbWFwcGluZywKICAgICAgY29u dmVydCBpdCB0byBhIGJvdW5kbGVzcyBjaGFyYWN0ZXIgdHlwZS4gICovCiAgIGVsc2UgaWYg KCFzeW0tPmF0dHIuZGltZW5zaW9uICYmIHN5bS0+dHMudHlwZSA9PSBCVF9DSEFSQUNURVIp CiAgICAgewotICAgICAgdG1wID0gZ2ZjX2dldF9jaGFyYWN0ZXJfdHlwZV9sZW4gKHN5bS0+ dHMua2luZCwgTlVMTCk7CisgICAgICB0bXAgPSBnZmNfZ2V0X2NoYXJhY3Rlcl90eXBlX2xl biAoc3ltLT50cy5raW5kLCBOVUxMLCBzeW0tPnRzLmRlZmVycmVkKTsKICAgICAgIHRtcCA9 IGJ1aWxkX3BvaW50ZXJfdHlwZSAodG1wKTsKICAgICAgIGlmIChzeW0tPmF0dHIucG9pbnRl cikKICAgICAgICAgdmFsdWUgPSBidWlsZF9mb2xkX2luZGlyZWN0X3JlZl9sb2MgKGlucHV0 X2xvY2F0aW9uLApAQCAtNzYxNCw3ICs3NjE0LDcgQEAgZ2ZjX2NvbnZfcHJvY2VkdXJlX2Nh bGwgKGdmY19zZSAqIHNlLCBnZmNfc3ltYm9sICogc3ltLAogICAgICAgZWxzZSBpZiAodHMu dHlwZSA9PSBCVF9DSEFSQUNURVIpCiAJewogCSAgLyogUGFzcyB0aGUgc3RyaW5nIGxlbmd0 aC4gICovCi0JICB0eXBlID0gZ2ZjX2dldF9jaGFyYWN0ZXJfdHlwZSAodHMua2luZCwgdHMu dS5jbCk7CisJICB0eXBlID0gZ2ZjX2dldF9jaGFyYWN0ZXJfdHlwZSAodHMua2luZCwgdHMu dS5jbCwgZmFsc2UpOwogCSAgdHlwZSA9IGJ1aWxkX3BvaW50ZXJfdHlwZSAodHlwZSk7CiAK IAkgIC8qIEVtaXQgYSBERUNMX0VYUFIgZm9yIHRoZSBWTEEgdHlwZS4gICovCkBAIC04MjQw LDcgKzgyNDAsNyBAQCBnZmNfY29udl9zdGF0ZW1lbnRfZnVuY3Rpb24gKGdmY19zZSAqIHNl LCBnZmNfZXhwciAqIGV4cHIpCiAJICAgICBmc3ltLT50cy51LmNsLT5iYWNrZW5kX2RlY2wK IAkJPSBnZmNfY29udl9jb25zdGFudF90b190cmVlIChmc3ltLT50cy51LmNsLT5sZW5ndGgp OwogCi0JICB0eXBlID0gZ2ZjX2dldF9jaGFyYWN0ZXJfdHlwZSAoZnN5bS0+dHMua2luZCwg ZnN5bS0+dHMudS5jbCk7CisJICB0eXBlID0gZ2ZjX2dldF9jaGFyYWN0ZXJfdHlwZSAoZnN5 bS0+dHMua2luZCwgZnN5bS0+dHMudS5jbCwgZmFsc2UpOwogCSAgdGVtcF92YXJzW25dID0g Z2ZjX2NyZWF0ZV92YXIgKHR5cGUsIGZzeW0tPm5hbWUpOwogCiAJICBhcmdsZW4gPSBUWVBF X01BWF9WQUxVRSAoVFlQRV9ET01BSU4gKHR5cGUpKTsKQEAgLTgyODksNyArODI4OSw3IEBA IGdmY19jb252X3N0YXRlbWVudF9mdW5jdGlvbiAoZ2ZjX3NlICogc2UsIGdmY19leHByICog ZXhwcikKIAkgIHx8IHRyZWVfaW50X2NzdF9sdCAoc2UtPnN0cmluZ19sZW5ndGgsCiAJCQkg ICAgICBzeW0tPnRzLnUuY2wtPmJhY2tlbmRfZGVjbCkpCiAJewotCSAgdHlwZSA9IGdmY19n ZXRfY2hhcmFjdGVyX3R5cGUgKHN5bS0+dHMua2luZCwgc3ltLT50cy51LmNsKTsKKwkgIHR5 cGUgPSBnZmNfZ2V0X2NoYXJhY3Rlcl90eXBlIChzeW0tPnRzLmtpbmQsIHN5bS0+dHMudS5j bCwgZmFsc2UpOwogCSAgdG1wID0gZ2ZjX2NyZWF0ZV92YXIgKHR5cGUsIHN5bS0+bmFtZSk7 CiAJICB0bXAgPSBnZmNfYnVpbGRfYWRkcl9leHByIChidWlsZF9wb2ludGVyX3R5cGUgKHR5 cGUpLCB0bXApOwogCSAgZ2ZjX3RyYW5zX3N0cmluZ19jb3B5ICgmc2UtPnByZSwgc3ltLT50 cy51LmNsLT5iYWNrZW5kX2RlY2wsIHRtcCwKQEAgLTEwMzkxLDcgKzEwMzkxLDggQEAgZ2Zj X2NvbnZfc3RyaW5nX3BhcmFtZXRlciAoZ2ZjX3NlICogc2UpCiAJICBpZiAoVFJFRV9DT0RF ICh0eXBlKSA9PSBBUlJBWV9UWVBFKQogCSAgICB0eXBlID0gVFJFRV9UWVBFICh0eXBlKTsK IAkgIHR5cGUgPSBnZmNfZ2V0X2NoYXJhY3Rlcl90eXBlX2xlbl9mb3JfZWx0eXBlICh0eXBl LAotCQkJCQkJCXNlLT5zdHJpbmdfbGVuZ3RoKTsKKwkJCQkJCQlzZS0+c3RyaW5nX2xlbmd0 aCwKKwkJCQkJCQlmYWxzZSk7CiAJICB0eXBlID0gYnVpbGRfcG9pbnRlcl90eXBlICh0eXBl KTsKIAkgIHNlLT5leHByID0gZ2ZjX2J1aWxkX2FkZHJfZXhwciAodHlwZSwgc2UtPmV4cHIp OwogCX0KZGlmZiAtLWdpdCBhL2djYy9mb3J0cmFuL3RyYW5zLWludHJpbnNpYy5jYyBiL2dj Yy9mb3J0cmFuL3RyYW5zLWludHJpbnNpYy5jYwppbmRleCAyMWVlYjEyY2E4OS4uYmFiZTMw ODk4YTAgMTAwNjQ0Ci0tLSBhL2djYy9mb3J0cmFuL3RyYW5zLWludHJpbnNpYy5jYworKysg Yi9nY2MvZm9ydHJhbi90cmFucy1pbnRyaW5zaWMuY2MKQEAgLTg1NDgsNyArODU0OCw4IEBA IGdmY19jb252X2ludHJpbnNpY190cmFuc2ZlciAoZ2ZjX3NlICogc2UsIGdmY19leHByICog ZXhwcikKICAgICBjYXNlIEJUX0NIQVJBQ1RFUjoKICAgICAgIHRtcCA9IHNpemVfb2Zfc3Ry aW5nX2luX2J5dGVzIChhcmctPmV4cHItPnRzLmtpbmQsIGFyZ3NlLnN0cmluZ19sZW5ndGgp OwogICAgICAgbW9sZF90eXBlID0gZ2ZjX2dldF9jaGFyYWN0ZXJfdHlwZV9sZW4gKGFyZy0+ ZXhwci0+dHMua2luZCwKLQkJCQkJICAgICAgYXJnc2Uuc3RyaW5nX2xlbmd0aCk7CisJCQkJ CSAgICAgIGFyZ3NlLnN0cmluZ19sZW5ndGgsCisJCQkJCSAgICAgIGFyZy0+ZXhwci0+dHMu ZGVmZXJyZWQpOwogICAgICAgYnJlYWs7CiAgICAgY2FzZSBCVF9DTEFTUzoKICAgICAgIHRt cCA9IGdmY19jbGFzc192dGFiX3NpemVfZ2V0IChhcmdzZS5leHByKTsKQEAgLTkzMjUsNyAr OTMyNiw3IEBAIGdmY19jb252X2ludHJpbnNpY19yZXBlYXQgKGdmY19zZSAqIHNlLCBnZmNf ZXhwciAqIGV4cHIpCiAgIGRsZW4gPSBmb2xkX2J1aWxkMl9sb2MgKGlucHV0X2xvY2F0aW9u LCBNVUxUX0VYUFIsIGdmY19jaGFybGVuX3R5cGVfbm9kZSwKIAkJCSAgZm9sZF9jb252ZXJ0 IChnZmNfY2hhcmxlbl90eXBlX25vZGUsIHNsZW4pLAogCQkJICBmb2xkX2NvbnZlcnQgKGdm Y19jaGFybGVuX3R5cGVfbm9kZSwgbmNvcGllcykpOwotICB0eXBlID0gZ2ZjX2dldF9jaGFy YWN0ZXJfdHlwZSAoZXhwci0+dHMua2luZCwgZXhwci0+dHMudS5jbCk7CisgIHR5cGUgPSBn ZmNfZ2V0X2NoYXJhY3Rlcl90eXBlIChleHByLT50cy5raW5kLCBleHByLT50cy51LmNsLCBm YWxzZSk7CiAgIGRlc3QgPSBnZmNfY29udl9zdHJpbmdfdG1wIChzZSwgYnVpbGRfcG9pbnRl cl90eXBlICh0eXBlKSwgZGxlbik7CiAKICAgLyogR2VuZXJhdGUgdGhlIGNvZGUgdG8gZG8g dGhlIHJlcGVhdCBvcGVyYXRpb246CmRpZmYgLS1naXQgYS9nY2MvZm9ydHJhbi90cmFucy1z dG10LmNjIGIvZ2NjL2ZvcnRyYW4vdHJhbnMtc3RtdC5jYwppbmRleCAyYjQyNzhiZTc0OC4u OWExY2FmNTZiY2IgMTAwNjQ0Ci0tLSBhL2djYy9mb3J0cmFuL3RyYW5zLXN0bXQuY2MKKysr IGIvZ2NjL2ZvcnRyYW4vdHJhbnMtc3RtdC5jYwpAQCAtMzg5NSw3ICszODk1LDcgQEAgZm9y YWxsX21ha2VfdmFyaWFibGVfdGVtcCAoZ2ZjX2NvZGUgKmMsIHN0bXRibG9ja190ICpwcmUs IHN0bXRibG9ja190ICpwb3N0KQogCXsKIAkgIHRzZS5zdHJpbmdfbGVuZ3RoID0gcnNlLnN0 cmluZ19sZW5ndGg7CiAJICB0bXAgPSBnZmNfZ2V0X2NoYXJhY3Rlcl90eXBlX2xlbiAoZ2Zj X2RlZmF1bHRfY2hhcmFjdGVyX2tpbmQsCi0JCQkJCSAgICB0c2Uuc3RyaW5nX2xlbmd0aCk7 CisJCQkJCSAgICB0c2Uuc3RyaW5nX2xlbmd0aCwgZS0+dHMuZGVmZXJyZWQpOwogCSAgdHNl LmV4cHIgPSBnZmNfY29udl9zdHJpbmdfdG1wICgmdHNlLCBidWlsZF9wb2ludGVyX3R5cGUg KHRtcCksCiAJCQkJCSAgcnNlLnN0cmluZ19sZW5ndGgpOwogCSAgZ2ZjX2FkZF9ibG9ja190 b19ibG9jayAocHJlLCAmdHNlLnByZSk7CkBAIC00Njc2LDcgKzQ2NzYsNyBAQCBnZmNfdHJh bnNfYXNzaWduX25lZWRfdGVtcCAoZ2ZjX2V4cHIgKiBleHByMSwgZ2ZjX2V4cHIgKiBleHBy MiwKIAkgIGdmY19pbml0X3NlICgmc3NzZSwgTlVMTCk7CiAJICBnZmNfY29udl9leHByICgm c3NzZSwgZXhwcjEpOwogCSAgdHlwZSA9IGdmY19nZXRfY2hhcmFjdGVyX3R5cGVfbGVuIChn ZmNfZGVmYXVsdF9jaGFyYWN0ZXJfa2luZCwKLQkJCQkJICAgICBzc3NlLnN0cmluZ19sZW5n dGgpOworCQkJCQkgICAgIHNzc2Uuc3RyaW5nX2xlbmd0aCwgZmFsc2UpOwogCX0KICAgICAg IGVsc2UKIAl7CkBAIC00Njg5LDcgKzQ2ODksOCBAQCBnZmNfdHJhbnNfYXNzaWduX25lZWRf dGVtcCAoZ2ZjX2V4cHIgKiBleHByMSwgZ2ZjX2V4cHIgKiBleHByMiwKIAkgICAgICBleHBy MS0+dHMudS5jbC0+YmFja2VuZF9kZWNsID0gdHNlLmV4cHI7CiAJICAgIH0KIAkgIHR5cGUg PSBnZmNfZ2V0X2NoYXJhY3Rlcl90eXBlX2xlbiAoZ2ZjX2RlZmF1bHRfY2hhcmFjdGVyX2tp bmQsCi0JCQkJCSAgICAgZXhwcjEtPnRzLnUuY2wtPmJhY2tlbmRfZGVjbCk7CisJCQkJCSAg ICAgZXhwcjEtPnRzLnUuY2wtPmJhY2tlbmRfZGVjbCwKKwkJCQkJICAgICBmYWxzZSk7CiAJ fQogICAgIH0KICAgZWxzZQpkaWZmIC0tZ2l0IGEvZ2NjL2ZvcnRyYW4vdHJhbnMtdHlwZXMu Y2MgYi9nY2MvZm9ydHJhbi90cmFucy10eXBlcy5jYwppbmRleCA5Yzk0ODlhNDJiZC4uNTkx NjYxYzc2MzAgMTAwNjQ0Ci0tLSBhL2djYy9mb3J0cmFuL3RyYW5zLXR5cGVzLmNjCisrKyBi L2djYy9mb3J0cmFuL3RyYW5zLXR5cGVzLmNjCkBAIC0xMTEyLDMyICsxMTEyLDUyIEBAIGdm Y19nZXRfcGNoYXJfdHlwZSAoaW50IGtpbmQpCiB9CiAKIAwKLS8qIENyZWF0ZSBhIGNoYXJh Y3RlciB0eXBlIHdpdGggdGhlIGdpdmVuIGtpbmQgYW5kIGxlbmd0aC4gICovCisvKiBDcmVh dGUgYSBjaGFyYWN0ZXIgdHlwZSB3aXRoIHRoZSBnaXZlbiBraW5kIGFuZCBsZW5ndGg7ICdk ZWZlcnJlZCcgYWZmZWN0cworICAgdGhlIGZvbGxvd2luZzogSWYgJ2xlbicgaXMgYSB2YXJp YWJsZS9ub24tY29uc3RhbnQgZXhwcmVzc2lvbiwgaXQgY2FuIGJlCisgICBlaXRoZXIgZm9y CisKKyAgICogYSBzdGFjay1hbGxvY2F0ZWQgdmFyaWFibGUgd2hlcmUgdGhlIGxlbmd0aCBp cyB0YWtlbiBmcm9tIHRoZSBvdXRzaWRlCisgICAoJ1ZMQScpIChnbG9iYWwgdmFyaWFibGUs IGR1bW15IGFyZ3VtZW50LCB2YXJpYWJsZSBmcm9tIGJlZm9yZSBhIEJMT0NLKSAtIGluCisg ICB0aGlzIGNhc2UsIHRoZSB2YWx1ZSBvbiBlbnRyeSBuZWVkcyB0byBiZSBwcmVzZXJ2ZWQg LT4gU0FWRV9FWFBSLgorCisgICAqIG9yLCAnbGVuJyBpcyB0aGUgaGlkZGVuIHZhcmlhYmxl IG9mIGEgZGVmZXJyZWQtbGVuZ3RoICgnbGVuPTonKSB2YXJpYWJsZSwKKyAgIHN1Y2ggdGhh dCB0aGUgY3VycmVudCB2YWx1ZSBhZnRlciB0aGUgbGFzdCBwb2ludGVyLWFzc2lnbm1lbnQg b3IgYWxsb2NhdGlvbgorICAgbXVzdCBiZSB1c2VkLiBJbiB0aGlzIGNhc2UsIHRoZXJlIHNo YWxsIG5vdCBiZSBhIFNBVkVfRVhQUi4gICovCiAKIHRyZWUKLWdmY19nZXRfY2hhcmFjdGVy X3R5cGVfbGVuX2Zvcl9lbHR5cGUgKHRyZWUgZWx0eXBlLCB0cmVlIGxlbikKK2dmY19nZXRf Y2hhcmFjdGVyX3R5cGVfbGVuX2Zvcl9lbHR5cGUgKHRyZWUgZWx0eXBlLCB0cmVlIGxlbiwg Ym9vbCBkZWZlcnJlZCkKIHsKICAgdHJlZSBib3VuZHMsIHR5cGU7CiAKICAgYm91bmRzID0g YnVpbGRfcmFuZ2VfdHlwZSAoZ2ZjX2NoYXJsZW5fdHlwZV9ub2RlLCBnZmNfaW5kZXhfb25l X25vZGUsIGxlbik7CiAgIHR5cGUgPSBidWlsZF9hcnJheV90eXBlIChlbHR5cGUsIGJvdW5k cyk7CiAgIFRZUEVfU1RSSU5HX0ZMQUcgKHR5cGUpID0gMTsKLQorICBpZiAobGVuICYmIGRl ZmVycmVkICYmIFRSRUVfQ09ERSAoVFlQRV9TSVpFICh0eXBlKSkgPT0gU0FWRV9FWFBSKQor ICAgIHsKKyAgICAgIC8qIFRPRE86IEEgbW9yZSBtaWRkbGUtZW5kIGZyaWVuZGx5IGFsdGVy bmF0aXZlIHdvdWxkIGJlIHRvIHVzZSBOVUxMX1RSRUUKKwkgYXMgdXBwZXIgYm91bmQgYW5k IHN0b3JlIHRoZSB2YWx1ZSBlbHNld2hlcmU7IGNhdmVhdDogdGhpcyByZXF1aXJlcworCSBz b21lIGNsZWFudXAgdGhyb3VnaG91dCB0aGUgY29kZSB0byBjb25zaXN0ZW50bHkgdXNlIHNv bWUgd3JhcHBlcgorCSBmdW5jdGlvbi4gICovCisgICAgICBnY2NfYXNzZXJ0IChUUkVFX0NP REUgKFRZUEVfU0laRV9VTklUICh0eXBlKSkgPT0gU0FWRV9FWFBSKTsKKyAgICAgIFRZUEVf U0laRSAodHlwZSkgPSBUUkVFX09QRVJBTkQgKFRZUEVfU0laRSAodHlwZSksIDApOworICAg ICAgVFlQRV9TSVpFX1VOSVQgKHR5cGUpID0gVFJFRV9PUEVSQU5EIChUWVBFX1NJWkVfVU5J VCAodHlwZSksIDApOworICAgIH0KICAgcmV0dXJuIHR5cGU7CiB9CiAKIHRyZWUKLWdmY19n ZXRfY2hhcmFjdGVyX3R5cGVfbGVuIChpbnQga2luZCwgdHJlZSBsZW4pCitnZmNfZ2V0X2No YXJhY3Rlcl90eXBlX2xlbiAoaW50IGtpbmQsIHRyZWUgbGVuLCBib29sIGRlZmVycmVkKQog ewogICBnZmNfdmFsaWRhdGVfa2luZCAoQlRfQ0hBUkFDVEVSLCBraW5kLCBmYWxzZSk7Ci0g IHJldHVybiBnZmNfZ2V0X2NoYXJhY3Rlcl90eXBlX2xlbl9mb3JfZWx0eXBlIChnZmNfZ2V0 X2NoYXJfdHlwZSAoa2luZCksIGxlbik7CisgIHJldHVybiBnZmNfZ2V0X2NoYXJhY3Rlcl90 eXBlX2xlbl9mb3JfZWx0eXBlIChnZmNfZ2V0X2NoYXJfdHlwZSAoa2luZCksIGxlbiwKKwkJ CQkJCWRlZmVycmVkKTsKIH0KIAogCiAvKiBHZXQgYSB0eXBlIG5vZGUgZm9yIGEgY2hhcmFj dGVyIGtpbmQuICAqLwogCiB0cmVlCi1nZmNfZ2V0X2NoYXJhY3Rlcl90eXBlIChpbnQga2lu ZCwgZ2ZjX2NoYXJsZW4gKiBjbCkKK2dmY19nZXRfY2hhcmFjdGVyX3R5cGUgKGludCBraW5k LCBnZmNfY2hhcmxlbiAqIGNsLCBib29sIGRlZmVycmVkKQogewogICB0cmVlIGxlbjsKIApA QCAtMTE0NSw3ICsxMTY1LDcgQEAgZ2ZjX2dldF9jaGFyYWN0ZXJfdHlwZSAoaW50IGtpbmQs IGdmY19jaGFybGVuICogY2wpCiAgIGlmIChsZW4gJiYgUE9JTlRFUl9UWVBFX1AgKFRSRUVf VFlQRSAobGVuKSkpCiAgICAgbGVuID0gYnVpbGRfZm9sZF9pbmRpcmVjdF9yZWYgKGxlbik7 CiAKLSAgcmV0dXJuIGdmY19nZXRfY2hhcmFjdGVyX3R5cGVfbGVuIChraW5kLCBsZW4pOwor ICByZXR1cm4gZ2ZjX2dldF9jaGFyYWN0ZXJfdHlwZV9sZW4gKGtpbmQsIGxlbiwgZGVmZXJy ZWQpOwogfQogDAogLyogQ29udmVydCBhIGJhc2ljIHR5cGUuICBUaGlzIHdpbGwgYmUgYW4g YXJyYXkgZm9yIGNoYXJhY3RlciB0eXBlcy4gICovCkBAIC0xMTg5LDEzICsxMjA5LDE0IEBA IGdmY190eXBlbm9kZV9mb3Jfc3BlYyAoZ2ZjX3R5cGVzcGVjICogc3BlYywgaW50IGNvZGlt KQogICAgICAgYnJlYWs7CiAKICAgICBjYXNlIEJUX0NIQVJBQ1RFUjoKLSAgICAgIGJhc2V0 eXBlID0gZ2ZjX2dldF9jaGFyYWN0ZXJfdHlwZSAoc3BlYy0+a2luZCwgc3BlYy0+dS5jbCk7 CisgICAgICBiYXNldHlwZSA9IGdmY19nZXRfY2hhcmFjdGVyX3R5cGUgKHNwZWMtPmtpbmQs IHNwZWMtPnUuY2wsCisJCQkJCSBzcGVjLT5kZWZlcnJlZCk7CiAgICAgICBicmVhazsKIAog ICAgIGNhc2UgQlRfSE9MTEVSSVRIOgogICAgICAgLyogU2luY2UgdGhpcyBjYW5ub3QgYmUg dXNlZCwgcmV0dXJuIGEgbGVuZ3RoIG9uZSBjaGFyYWN0ZXIuICAqLwogICAgICAgYmFzZXR5 cGUgPSBnZmNfZ2V0X2NoYXJhY3Rlcl90eXBlX2xlbiAoZ2ZjX2RlZmF1bHRfY2hhcmFjdGVy X2tpbmQsCi0JCQkJCSAgICAgZ2ZjX2luZGV4X29uZV9ub2RlKTsKKwkJCQkJICAgICBnZmNf aW5kZXhfb25lX25vZGUsIGZhbHNlKTsKICAgICAgIGJyZWFrOwogCiAgICAgY2FzZSBCVF9V TklPTjoKZGlmZiAtLWdpdCBhL2djYy9mb3J0cmFuL3RyYW5zLXR5cGVzLmggYi9nY2MvZm9y dHJhbi90cmFucy10eXBlcy5oCmluZGV4IDJkYzY5MjMyNWNmLi5iMmEwMzc1ZGRmYSAxMDA2 NDQKLS0tIGEvZ2NjL2ZvcnRyYW4vdHJhbnMtdHlwZXMuaAorKysgYi9nY2MvZm9ydHJhbi90 cmFucy10eXBlcy5oCkBAIC04MSw5ICs4MSw5IEBAIHRyZWUgZ2ZjX2dldF9jb21wbGV4X3R5 cGUgKGludCk7CiB0cmVlIGdmY19nZXRfbG9naWNhbF90eXBlIChpbnQpOwogdHJlZSBnZmNf Z2V0X2NoYXJfdHlwZSAoaW50KTsKIHRyZWUgZ2ZjX2dldF9wY2hhcl90eXBlIChpbnQpOwot dHJlZSBnZmNfZ2V0X2NoYXJhY3Rlcl90eXBlIChpbnQsIGdmY19jaGFybGVuICopOwotdHJl ZSBnZmNfZ2V0X2NoYXJhY3Rlcl90eXBlX2xlbiAoaW50LCB0cmVlKTsKLXRyZWUgZ2ZjX2dl dF9jaGFyYWN0ZXJfdHlwZV9sZW5fZm9yX2VsdHlwZSAodHJlZSwgdHJlZSk7Cit0cmVlIGdm Y19nZXRfY2hhcmFjdGVyX3R5cGUgKGludCwgZ2ZjX2NoYXJsZW4gKiwgYm9vbCk7Cit0cmVl IGdmY19nZXRfY2hhcmFjdGVyX3R5cGVfbGVuIChpbnQsIHRyZWUsIGJvb2wpOwordHJlZSBn ZmNfZ2V0X2NoYXJhY3Rlcl90eXBlX2xlbl9mb3JfZWx0eXBlICh0cmVlLCB0cmVlLCBib29s KTsKIAogdHJlZSBnZmNfc3ltX3R5cGUgKGdmY19zeW1ib2wgKiwgYm9vbCBpc19iaW5kX2Nf YXJnID0gZmFsc2UpOwogdHJlZSBnZmNfZ2V0X2NmaV90eXBlIChpbnQgZGltZW4sIGJvb2wg cmVzdHJpY3RlZCk7Cg== --------------p9bb2A0KiLebOdKESiml2PsR--