From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by sourceware.org (Postfix) with ESMTP id 5B0873858D39 for ; Fri, 1 Jul 2022 10:25:46 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 5B0873858D39 Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 405B11424; Fri, 1 Jul 2022 03:25:46 -0700 (PDT) Received: from [10.1.31.130] (E121495.arm.com [10.1.31.130]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id CE0A93F66F; Fri, 1 Jul 2022 03:25:44 -0700 (PDT) Content-Type: multipart/mixed; boundary="------------eGBpDtmg7QnCKweBp7wUigku" Message-ID: <6e40034d-4474-aef4-9226-7f8ccb9f1e30@arm.com> Date: Fri, 1 Jul 2022 11:25:39 +0100 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:91.0) Gecko/20100101 Thunderbird/91.10.0 Subject: Re: [PATCH][AArch64] Implement ACLE Data Intrinsics Content-Language: en-US To: "gcc-patches@gcc.gnu.org" , Kyrylo Tkachov , richard.sandiford@arm.com References: <11918543-8a40-211d-771d-4e2dbaeb9eb6@arm.com> From: "Andre Vieira (lists)" In-Reply-To: X-Spam-Status: No, score=-27.4 required=5.0 tests=BAYES_00, GIT_PATCH_0, KAM_DMARC_NONE, KAM_DMARC_STATUS, KAM_LAZY_DOMAIN_SECURITY, KAM_LOTSOFHASH, KAM_SHORT, NICE_REPLY_A, SPF_HELO_NONE, SPF_NONE, TXREP, T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org X-BeenThere: gcc-patches@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gcc-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 01 Jul 2022 10:25:49 -0000 This is a multi-part message in MIME format. --------------eGBpDtmg7QnCKweBp7wUigku Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit On 29/06/2022 08:18, Richard Sandiford wrote: >> + break; >> + case AARCH64_RBIT: >> + case AARCH64_RBITL: >> + case AARCH64_RBITLL: >> + if (mode == SImode) >> + icode = CODE_FOR_aarch64_rbitsi; >> + else >> + icode = CODE_FOR_aarch64_rbitdi; >> + break; >> + default: >> + gcc_unreachable (); >> + } >> + expand_insn (icode, 2, ops); >> + return target; > This needs to return ops[0].value instead, since "target" just suggests > a possible location. > > Could you add tests for a memory source and memory destination, e.g.: > > void test_clz_mem (uint32_t *a) > { > *a = __clz (*a); > } > > Without tests like that, these comments probably just sound like a paper > exercise, but they should make a difference for memory sources (previous > review) and memory destinations (this round). I had locally tested it (with rev though because clz doesn't use that code) and strangely it does seem to work for the memory destinations, but that's just a simple test. It could very well go wrong with some more complex codegen, so I'll just take your word and use ops[0].value. And yeah I didn't add the tests at the time, don't really know why, I'll chuck it down to laziness :P > >> diff --git a/gcc/config/aarch64/arm_acle.h b/gcc/config/aarch64/arm_acle.h >> index 9775a48c65825b424d3eb442384f5ab87b734fd7..a044bc74553fcf2a49b71290083f3f072fd5a2ce 100644 >> --- a/gcc/config/aarch64/arm_acle.h >> +++ b/gcc/config/aarch64/arm_acle.h >> @@ -28,6 +28,7 @@ >> #define _GCC_ARM_ACLE_H >> >> #include >> +#include >> >> #pragma GCC aarch64 "arm_acle.h" >> >> @@ -35,6 +36,58 @@ >> extern "C" { >> #endif >> >> +#define _GCC_ARM_ACLE_ROR_FN(NAME, TYPE) \ >> +__extension__ extern __inline TYPE \ >> +__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) \ >> +NAME (TYPE __value, uint32_t __rotate) \ >> +{ \ >> + size_t __size = sizeof (TYPE) * __CHAR_BIT__; \ >> + __rotate = __rotate % __size; \ >> + return __value >> __rotate | __value << ((__size - __rotate) % __size); \ >> +} >> + >> +_GCC_ARM_ACLE_ROR_FN (__ror, uint32_t) >> +_GCC_ARM_ACLE_ROR_FN (__rorl, unsigned long) >> +_GCC_ARM_ACLE_ROR_FN (__rorll, uint64_t) >> + >> +#undef _GCC_ARM_ACLE_ROR_FN >> + >> +#define _GCC_ARM_ACLE_DATA_FN(NAME, BUILTIN, ITYPE, RTYPE) \ >> +__extension__ extern __inline RTYPE \ >> +__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) \ >> +__##NAME (ITYPE __value) \ >> +{ \ >> + return __builtin_##BUILTIN (__value); \ >> +} >> + >> +_GCC_ARM_ACLE_DATA_FN (clz, clz, uint32_t, unsigned int) >> +_GCC_ARM_ACLE_DATA_FN (clzl, clzl, unsigned long, unsigned int) >> +_GCC_ARM_ACLE_DATA_FN (clzll, clzll, uint64_t, unsigned int) >> +_GCC_ARM_ACLE_DATA_FN (cls, clrsb, uint32_t, unsigned int) >> +_GCC_ARM_ACLE_DATA_FN (clsl, clrsbl, unsigned long, unsigned int) >> +_GCC_ARM_ACLE_DATA_FN (clsll, clrsbll, uint64_t, unsigned int) >> +_GCC_ARM_ACLE_DATA_FN (rev16, aarch64_rev16, uint32_t, uint32_t) >> +_GCC_ARM_ACLE_DATA_FN (rev16l, aarch64_rev16l, unsigned long, unsigned long) >> +_GCC_ARM_ACLE_DATA_FN (rev16ll, aarch64_rev16ll, uint64_t, uint64_t) >> +_GCC_ARM_ACLE_DATA_FN (rbit, aarch64_rbit, uint32_t, uint32_t) >> +_GCC_ARM_ACLE_DATA_FN (rbitl, aarch64_rbitl, unsigned long, unsigned long) >> +_GCC_ARM_ACLE_DATA_FN (rbitll, aarch64_rbitll, uint64_t, uint64_t) >> +_GCC_ARM_ACLE_DATA_FN (revsh, bswap16, int16_t, uint16_t) > The return type should be int16_t. Nice catch! > The clz and cls tests have the old return types (same as the argument > types), but I guess that's a good thing, since it shows that we avoid > the redundant zero-extend in clzll and clsll. Yeah I noticed that too when I was adding the mem tests, but I did change them though because at the time it just felt like an oversight, though I too was pleasantly surprised GCC was managing to avoid the zero-extending :) I then saw your comment and made me wonder whether I should keep the wrong return types in... I haven't but happy to change them back if you think it's a nice 'test' to have. Regards, Andre --------------eGBpDtmg7QnCKweBp7wUigku Content-Type: text/plain; charset=UTF-8; name="data_intrinsicsv3.patch" Content-Disposition: attachment; filename="data_intrinsicsv3.patch" Content-Transfer-Encoding: base64 ZGlmZiAtLWdpdCBhL2djYy9jb25maWcvYWFyY2g2NC9hYXJjaDY0LWJ1aWx0aW5zLmNjIGIv Z2NjL2NvbmZpZy9hYXJjaDY0L2FhcmNoNjQtYnVpbHRpbnMuY2MKaW5kZXggZTBhNzQxYWM2 NjMxODg3MTNlMjFmNDU3YWZmYTU3MjE3ZDA3NDc4My4uYmI1ZDk3YzhmYzY0MDI2MzUyNzBk Zjg1MWE5NDljYWJlZWNhYTVlOCAxMDA2NDQKLS0tIGEvZ2NjL2NvbmZpZy9hYXJjaDY0L2Fh cmNoNjQtYnVpbHRpbnMuY2MKKysrIGIvZ2NjL2NvbmZpZy9hYXJjaDY0L2FhcmNoNjQtYnVp bHRpbnMuY2MKQEAgLTYxMyw2ICs2MTMsMTIgQEAgZW51bSBhYXJjaDY0X2J1aWx0aW5zCiAg IEFBUkNINjRfTFM2NF9CVUlMVElOX1NUNjRCLAogICBBQVJDSDY0X0xTNjRfQlVJTFRJTl9T VDY0QlYsCiAgIEFBUkNINjRfTFM2NF9CVUlMVElOX1NUNjRCVjAsCisgIEFBUkNINjRfUkVW MTYsCisgIEFBUkNINjRfUkVWMTZMLAorICBBQVJDSDY0X1JFVjE2TEwsCisgIEFBUkNINjRf UkJJVCwKKyAgQUFSQ0g2NF9SQklUTCwKKyAgQUFSQ0g2NF9SQklUTEwsCiAgIEFBUkNINjRf QlVJTFRJTl9NQVgKIH07CiAKQEAgLTE2NjQsMTAgKzE2NzAsNDEgQEAgYWFyY2g2NF9pbml0 X2xzNjRfYnVpbHRpbnMgKHZvaWQpCiAgICAgICA9IGFhcmNoNjRfZ2VuZXJhbF9hZGRfYnVp bHRpbiAoZGF0YVtpXS5uYW1lLCBkYXRhW2ldLnR5cGUsIGRhdGFbaV0uY29kZSk7CiB9CiAK K3N0YXRpYyB2b2lkCithYXJjaDY0X2luaXRfZGF0YV9pbnRyaW5zaWNzICh2b2lkKQorewor ICB0cmVlIHVpbnQzMl9mbnR5cGUgPSBidWlsZF9mdW5jdGlvbl90eXBlX2xpc3QgKHVpbnQz Ml90eXBlX25vZGUsCisJCQkJCQkgdWludDMyX3R5cGVfbm9kZSwgTlVMTF9UUkVFKTsKKyAg dHJlZSB1bG9uZ19mbnR5cGUgPSBidWlsZF9mdW5jdGlvbl90eXBlX2xpc3QgKGxvbmdfdW5z aWduZWRfdHlwZV9ub2RlLAorCQkJCQkJbG9uZ191bnNpZ25lZF90eXBlX25vZGUsCisJCQkJ CQlOVUxMX1RSRUUpOworICB0cmVlIHVpbnQ2NF9mbnR5cGUgPSBidWlsZF9mdW5jdGlvbl90 eXBlX2xpc3QgKHVpbnQ2NF90eXBlX25vZGUsCisJCQkJCQkgdWludDY0X3R5cGVfbm9kZSwg TlVMTF9UUkVFKTsKKyAgYWFyY2g2NF9idWlsdGluX2RlY2xzW0FBUkNINjRfUkVWMTZdCisg ICAgPSBhYXJjaDY0X2dlbmVyYWxfYWRkX2J1aWx0aW4gKCJfX2J1aWx0aW5fYWFyY2g2NF9y ZXYxNiIsIHVpbnQzMl9mbnR5cGUsCisJCQkJICAgQUFSQ0g2NF9SRVYxNik7CisgIGFhcmNo NjRfYnVpbHRpbl9kZWNsc1tBQVJDSDY0X1JFVjE2TF0KKyAgICA9IGFhcmNoNjRfZ2VuZXJh bF9hZGRfYnVpbHRpbiAoIl9fYnVpbHRpbl9hYXJjaDY0X3JldjE2bCIsIHVsb25nX2ZudHlw ZSwKKwkJCQkgICBBQVJDSDY0X1JFVjE2TCk7CisgIGFhcmNoNjRfYnVpbHRpbl9kZWNsc1tB QVJDSDY0X1JFVjE2TExdCisgICAgPSBhYXJjaDY0X2dlbmVyYWxfYWRkX2J1aWx0aW4gKCJf X2J1aWx0aW5fYWFyY2g2NF9yZXYxNmxsIiwgdWludDY0X2ZudHlwZSwKKwkJCQkgICBBQVJD SDY0X1JFVjE2TEwpOworICBhYXJjaDY0X2J1aWx0aW5fZGVjbHNbQUFSQ0g2NF9SQklUXQor ICAgID0gYWFyY2g2NF9nZW5lcmFsX2FkZF9idWlsdGluICgiX19idWlsdGluX2FhcmNoNjRf cmJpdCIsIHVpbnQzMl9mbnR5cGUsCisJCQkJICAgQUFSQ0g2NF9SQklUKTsKKyAgYWFyY2g2 NF9idWlsdGluX2RlY2xzW0FBUkNINjRfUkJJVExdCisgICAgPSBhYXJjaDY0X2dlbmVyYWxf YWRkX2J1aWx0aW4gKCJfX2J1aWx0aW5fYWFyY2g2NF9yYml0bCIsIHVsb25nX2ZudHlwZSwK KwkJCQkgICBBQVJDSDY0X1JCSVRMKTsKKyAgYWFyY2g2NF9idWlsdGluX2RlY2xzW0FBUkNI NjRfUkJJVExMXQorICAgID0gYWFyY2g2NF9nZW5lcmFsX2FkZF9idWlsdGluICgiX19idWls dGluX2FhcmNoNjRfcmJpdGxsIiwgdWludDY0X2ZudHlwZSwKKwkJCQkgICBBQVJDSDY0X1JC SVRMTCk7Cit9CisKIC8qIEltcGxlbWVudCAjcHJhZ21hIEdDQyBhYXJjaDY0ICJhcm1fYWNs ZS5oIi4gICovCiB2b2lkCiBoYW5kbGVfYXJtX2FjbGVfaCAodm9pZCkKIHsKKyAgYWFyY2g2 NF9pbml0X2RhdGFfaW50cmluc2ljcyAoKTsKICAgaWYgKFRBUkdFVF9MUzY0KQogICAgIGFh cmNoNjRfaW5pdF9sczY0X2J1aWx0aW5zICgpOwogfQpAQCAtMjM5NCw2ICsyNDMxLDM3IEBA IGFhcmNoNjRfZXhwYW5kX2J1aWx0aW5fbWVtdGFnIChpbnQgZmNvZGUsIHRyZWUgZXhwLCBy dHggdGFyZ2V0KQogICByZXR1cm4gdGFyZ2V0OwogfQogCisvKiBGdW5jdGlvbiB0byBleHBh bmQgYW4gZXhwcmVzc2lvbiBFWFAgd2hpY2ggY2FsbHMgb25lIG9mIHRoZSBBQ0xFIERhdGEK KyAgIEludHJpbnNpYyBidWlsdGlucyBGQ09ERSB3aXRoIHRoZSByZXN1bHQgZ29pbmcgdG8g VEFSR0VULiAgKi8KK3N0YXRpYyBydHgKK2FhcmNoNjRfZXhwYW5kX2J1aWx0aW5fZGF0YV9p bnRyaW5zaWMgKHVuc2lnbmVkIGludCBmY29kZSwgdHJlZSBleHAsIHJ0eCB0YXJnZXQpCit7 CisgIGV4cGFuZF9vcGVyYW5kIG9wc1syXTsKKyAgbWFjaGluZV9tb2RlIG1vZGUgPSBHRVRf TU9ERSAodGFyZ2V0KTsKKyAgY3JlYXRlX291dHB1dF9vcGVyYW5kICgmb3BzWzBdLCB0YXJn ZXQsIG1vZGUpOworICBjcmVhdGVfaW5wdXRfb3BlcmFuZCAoJm9wc1sxXSwgZXhwYW5kX25v cm1hbCAoQ0FMTF9FWFBSX0FSRyAoZXhwLCAwKSksIG1vZGUpOworICBlbnVtIGluc25fY29k ZSBpY29kZTsKKworICBzd2l0Y2ggKGZjb2RlKQorICAgIHsKKyAgICBjYXNlIEFBUkNINjRf UkVWMTY6CisgICAgY2FzZSBBQVJDSDY0X1JFVjE2TDoKKyAgICBjYXNlIEFBUkNINjRfUkVW MTZMTDoKKyAgICAgIGljb2RlID0gY29kZV9mb3JfYWFyY2g2NF9yZXYxNiAobW9kZSk7Cisg ICAgICBicmVhazsKKyAgICBjYXNlIEFBUkNINjRfUkJJVDoKKyAgICBjYXNlIEFBUkNINjRf UkJJVEw6CisgICAgY2FzZSBBQVJDSDY0X1JCSVRMTDoKKyAgICAgIGljb2RlID0gY29kZV9m b3JfYWFyY2g2NF9yYml0IChtb2RlKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6Cisg ICAgICBnY2NfdW5yZWFjaGFibGUgKCk7CisgICAgfQorCisgIGV4cGFuZF9pbnNuIChpY29k ZSwgMiwgb3BzKTsKKyAgcmV0dXJuIG9wc1swXS52YWx1ZTsKK30KKwogLyogRXhwYW5kIGFu IGV4cHJlc3Npb24gRVhQIGFzIGZwc3Igb3IgZnBjciBzZXR0ZXIgKGRlcGVuZGluZyBvbgog ICAgVU5TUEVDKSB1c2luZyBNT0RFLiAgKi8KIHN0YXRpYyB2b2lkCkBAIC0yNTUxLDYgKzI2 MTksOSBAQCBhYXJjaDY0X2dlbmVyYWxfZXhwYW5kX2J1aWx0aW4gKHVuc2lnbmVkIGludCBm Y29kZSwgdHJlZSBleHAsIHJ0eCB0YXJnZXQsCiAgIGlmIChmY29kZSA+PSBBQVJDSDY0X01F TVRBR19CVUlMVElOX1NUQVJUCiAgICAgICAmJiBmY29kZSA8PSBBQVJDSDY0X01FTVRBR19C VUlMVElOX0VORCkKICAgICByZXR1cm4gYWFyY2g2NF9leHBhbmRfYnVpbHRpbl9tZW10YWcg KGZjb2RlLCBleHAsIHRhcmdldCk7CisgIGlmIChmY29kZSA+PSBBQVJDSDY0X1JFVjE2Cisg ICAgICAmJiBmY29kZSA8PSBBQVJDSDY0X1JCSVRMTCkKKyAgICByZXR1cm4gYWFyY2g2NF9l eHBhbmRfYnVpbHRpbl9kYXRhX2ludHJpbnNpYyAoZmNvZGUsIGV4cCwgdGFyZ2V0KTsKIAog ICBnY2NfdW5yZWFjaGFibGUgKCk7CiB9CmRpZmYgLS1naXQgYS9nY2MvY29uZmlnL2FhcmNo NjQvYWFyY2g2NC5tZCBiL2djYy9jb25maWcvYWFyY2g2NC9hYXJjaDY0Lm1kCmluZGV4IGFj ZWM4YzExNDY3NjVjMGZhYzczYzE1MzUxODUzMzI0YjhmMDMyMDkuLmVmMGFlZDI1YzZiMjZl ZmY2MWY5ZjYwMzBkYzU5MjFhNTM0ZTNkMTkgMTAwNjQ0Ci0tLSBhL2djYy9jb25maWcvYWFy Y2g2NC9hYXJjaDY0Lm1kCisrKyBiL2djYy9jb25maWcvYWFyY2g2NC9hYXJjaDY0Lm1kCkBA IC00OTUwLDcgKzQ5NTAsNyBAQCAoZGVmaW5lX2V4cGFuZCAiZmZzPG1vZGU+MiIKICAgICBy dHggY2NyZWcgPSBhYXJjaDY0X2dlbl9jb21wYXJlX3JlZyAoRVEsIG9wZXJhbmRzWzFdLCBj b25zdDBfcnR4KTsKICAgICBydHggeCA9IGdlbl9ydHhfTkUgKFZPSURtb2RlLCBjY3JlZywg Y29uc3QwX3J0eCk7CiAKLSAgICBlbWl0X2luc24gKGdlbl9yYml0PG1vZGU+MiAob3BlcmFu ZHNbMF0sIG9wZXJhbmRzWzFdKSk7CisgICAgZW1pdF9pbnNuIChnZW5fYWFyY2g2NF9yYml0 ICg8TU9ERT5tb2RlLCBvcGVyYW5kc1swXSwgb3BlcmFuZHNbMV0pKTsKICAgICBlbWl0X2lu c24gKGdlbl9jbHo8bW9kZT4yIChvcGVyYW5kc1swXSwgb3BlcmFuZHNbMF0pKTsKICAgICBl bWl0X2luc24gKGdlbl9jc2luYzM8bW9kZT5faW5zbiAob3BlcmFuZHNbMF0sIHgsIG9wZXJh bmRzWzBdLCBjb25zdDBfcnR4KSk7CiAgICAgRE9ORTsKQEAgLTQ5OTYsNyArNDk5Niw3IEBA IChkZWZpbmVfaW5zbiAiY2xyc2I8bW9kZT4yIgogICBbKHNldF9hdHRyICJ0eXBlIiAiY2x6 IildCiApCiAKLShkZWZpbmVfaW5zbiAicmJpdDxtb2RlPjIiCisoZGVmaW5lX2luc24gIkBh YXJjaDY0X3JiaXQ8bW9kZT4iCiAgIFsoc2V0IChtYXRjaF9vcGVyYW5kOkdQSSAwICJyZWdp c3Rlcl9vcGVyYW5kIiAiPXIiKQogCSh1bnNwZWM6R1BJIFsobWF0Y2hfb3BlcmFuZDpHUEkg MSAicmVnaXN0ZXJfb3BlcmFuZCIgInIiKV0gVU5TUEVDX1JCSVQpKV0KICAgIiIKQEAgLTUw MTcsNyArNTAxNyw3IEBAIChkZWZpbmVfaW5zbl9hbmRfc3BsaXQgImN0ejxtb2RlPjIiCiAg ICJyZWxvYWRfY29tcGxldGVkIgogICBbKGNvbnN0X2ludCAwKV0KICAgIgotICBlbWl0X2lu c24gKGdlbl9yYml0PG1vZGU+MiAob3BlcmFuZHNbMF0sIG9wZXJhbmRzWzFdKSk7CisgIGVt aXRfaW5zbiAoZ2VuX2FhcmNoNjRfcmJpdCAoPE1PREU+bW9kZSwgb3BlcmFuZHNbMF0sIG9w ZXJhbmRzWzFdKSk7CiAgIGVtaXRfaW5zbiAoZ2VuX2Nsejxtb2RlPjIgKG9wZXJhbmRzWzBd LCBvcGVyYW5kc1swXSkpOwogICBET05FOwogIikKQEAgLTYwMjIsNiArNjAyMiwxMyBAQCAo ZGVmaW5lX2luc24gImJzd2FwaGkyIgogICBbKHNldF9hdHRyICJ0eXBlIiAicmV2IildCiAp CiAKKyhkZWZpbmVfaW5zbiAiQGFhcmNoNjRfcmV2MTY8bW9kZT4iCisgIFsoc2V0IChtYXRj aF9vcGVyYW5kOkdQSSAwICJyZWdpc3Rlcl9vcGVyYW5kIiAiPXIiKQorCSh1bnNwZWM6R1BJ IFsobWF0Y2hfb3BlcmFuZDpHUEkgMSAicmVnaXN0ZXJfb3BlcmFuZCIgInIiKV0gVU5TUEVD X1JFVikpXQorICAiIgorICAicmV2MTZcXHQlPHc+MCwgJTx3PjEiCisgIFsoc2V0X2F0dHIg InR5cGUiICJyZXYiKV0pCisKIChkZWZpbmVfaW5zbiAiKmFhcmNoNjRfYmZ4aWw8bW9kZT4i CiAgIFsoc2V0IChtYXRjaF9vcGVyYW5kOkdQSSAwICJyZWdpc3Rlcl9vcGVyYW5kIiAiPXIs ciIpCiAgICAgKGlvcjpHUEkgKGFuZDpHUEkgKG1hdGNoX29wZXJhbmQ6R1BJIDEgInJlZ2lz dGVyX29wZXJhbmQiICJyLDAiKQpkaWZmIC0tZ2l0IGEvZ2NjL2NvbmZpZy9hYXJjaDY0L2Fy bV9hY2xlLmggYi9nY2MvY29uZmlnL2FhcmNoNjQvYXJtX2FjbGUuaAppbmRleCA5Nzc1YTQ4 YzY1ODI1YjQyNGQzZWI0NDIzODRmNWFiODdiNzM0ZmQ3Li5kMjZlMjY5Y2I4NDNmZTM3YmE3 ODlkYjA5YzQwZDA2ZjUzNDM4Y2RhIDEwMDY0NAotLS0gYS9nY2MvY29uZmlnL2FhcmNoNjQv YXJtX2FjbGUuaAorKysgYi9nY2MvY29uZmlnL2FhcmNoNjQvYXJtX2FjbGUuaApAQCAtMjgs NiArMjgsNyBAQAogI2RlZmluZSBfR0NDX0FSTV9BQ0xFX0gKIAogI2luY2x1ZGUgPHN0ZGlu dC5oPgorI2luY2x1ZGUgPHN0ZGRlZi5oPgogCiAjcHJhZ21hIEdDQyBhYXJjaDY0ICJhcm1f YWNsZS5oIgogCkBAIC0zNSw2ICszNiw1OCBAQAogZXh0ZXJuICJDIiB7CiAjZW5kaWYKIAor I2RlZmluZSBfR0NDX0FSTV9BQ0xFX1JPUl9GTihOQU1FLCBUWVBFKQkJCQkgIFwKK19fZXh0 ZW5zaW9uX18gZXh0ZXJuIF9faW5saW5lIFRZUEUJCQkJCSAgXAorX19hdHRyaWJ1dGVfXyAo KF9fYWx3YXlzX2lubGluZV9fLCBfX2dudV9pbmxpbmVfXywgX19hcnRpZmljaWFsX18pKQkg IFwKK05BTUUgKFRZUEUgX192YWx1ZSwgdWludDMyX3QgX19yb3RhdGUpCQkJCQkgIFwKK3sJ CQkJCQkJCQkgIFwKKyAgc2l6ZV90IF9fc2l6ZSA9IHNpemVvZiAoVFlQRSkgKiBfX0NIQVJf QklUX187CQkJCSAgXAorICBfX3JvdGF0ZSA9IF9fcm90YXRlICUgX19zaXplOwkJCQkJCSAg XAorICByZXR1cm4gX192YWx1ZSA+PiBfX3JvdGF0ZSB8IF9fdmFsdWUgPDwgKChfX3NpemUg LSBfX3JvdGF0ZSkgJSBfX3NpemUpOyBcCit9CisKK19HQ0NfQVJNX0FDTEVfUk9SX0ZOIChf X3JvciwgdWludDMyX3QpCitfR0NDX0FSTV9BQ0xFX1JPUl9GTiAoX19yb3JsLCB1bnNpZ25l ZCBsb25nKQorX0dDQ19BUk1fQUNMRV9ST1JfRk4gKF9fcm9ybGwsIHVpbnQ2NF90KQorCisj dW5kZWYgX0dDQ19BUk1fQUNMRV9ST1JfRk4KKworI2RlZmluZSBfR0NDX0FSTV9BQ0xFX0RB VEFfRk4oTkFNRSwgQlVJTFRJTiwgSVRZUEUsIFJUWVBFKQkgICAgXAorX19leHRlbnNpb25f XyBleHRlcm4gX19pbmxpbmUgUlRZUEUJCQkJICAgIFwKK19fYXR0cmlidXRlX18gKChfX2Fs d2F5c19pbmxpbmVfXywgX19nbnVfaW5saW5lX18sIF9fYXJ0aWZpY2lhbF9fKSkgXAorX18j I05BTUUgKElUWVBFIF9fdmFsdWUpCQkJCQkgICAgXAorewkJCQkJCQkJICAgIFwKKyAgcmV0 dXJuIF9fYnVpbHRpbl8jI0JVSUxUSU4gKF9fdmFsdWUpOwkJCQkgICAgXAorfQorCitfR0ND X0FSTV9BQ0xFX0RBVEFfRk4gKGNseiwgY2x6LCB1aW50MzJfdCwgdW5zaWduZWQgaW50KQor X0dDQ19BUk1fQUNMRV9EQVRBX0ZOIChjbHpsLCBjbHpsLCB1bnNpZ25lZCBsb25nLCB1bnNp Z25lZCBpbnQpCitfR0NDX0FSTV9BQ0xFX0RBVEFfRk4gKGNsemxsLCBjbHpsbCwgdWludDY0 X3QsIHVuc2lnbmVkIGludCkKK19HQ0NfQVJNX0FDTEVfREFUQV9GTiAoY2xzLCBjbHJzYiwg dWludDMyX3QsIHVuc2lnbmVkIGludCkKK19HQ0NfQVJNX0FDTEVfREFUQV9GTiAoY2xzbCwg Y2xyc2JsLCB1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBpbnQpCitfR0NDX0FSTV9BQ0xFX0RB VEFfRk4gKGNsc2xsLCBjbHJzYmxsLCB1aW50NjRfdCwgdW5zaWduZWQgaW50KQorX0dDQ19B Uk1fQUNMRV9EQVRBX0ZOIChyZXYxNiwgYWFyY2g2NF9yZXYxNiwgdWludDMyX3QsIHVpbnQz Ml90KQorX0dDQ19BUk1fQUNMRV9EQVRBX0ZOIChyZXYxNmwsIGFhcmNoNjRfcmV2MTZsLCB1 bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBsb25nKQorX0dDQ19BUk1fQUNMRV9EQVRBX0ZOIChy ZXYxNmxsLCBhYXJjaDY0X3JldjE2bGwsIHVpbnQ2NF90LCB1aW50NjRfdCkKK19HQ0NfQVJN X0FDTEVfREFUQV9GTiAocmJpdCwgYWFyY2g2NF9yYml0LCB1aW50MzJfdCwgdWludDMyX3Qp CitfR0NDX0FSTV9BQ0xFX0RBVEFfRk4gKHJiaXRsLCBhYXJjaDY0X3JiaXRsLCB1bnNpZ25l ZCBsb25nLCB1bnNpZ25lZCBsb25nKQorX0dDQ19BUk1fQUNMRV9EQVRBX0ZOIChyYml0bGws IGFhcmNoNjRfcmJpdGxsLCB1aW50NjRfdCwgdWludDY0X3QpCitfR0NDX0FSTV9BQ0xFX0RB VEFfRk4gKHJldnNoLCBic3dhcDE2LCBpbnQxNl90LCBpbnQxNl90KQorX0dDQ19BUk1fQUNM RV9EQVRBX0ZOIChyZXYsIGJzd2FwMzIsIHVpbnQzMl90LCB1aW50MzJfdCkKK19HQ0NfQVJN X0FDTEVfREFUQV9GTiAocmV2bGwsIGJzd2FwNjQsIHVpbnQ2NF90LCB1aW50NjRfdCkKKwor I3VuZGVmIF9HQ0NfQVJNX0FDTEVfREFUQV9GTgorCitfX2V4dGVuc2lvbl9fIGV4dGVybiBf X2lubGluZSB1bnNpZ25lZCBsb25nCitfX2F0dHJpYnV0ZV9fICgoX19hbHdheXNfaW5saW5l X18sIF9fZ251X2lubGluZV9fLCBfX2FydGlmaWNpYWxfXykpCitfX3JldmwgKHVuc2lnbmVk IGxvbmcgX192YWx1ZSkKK3sKKyAgaWYgKHNpemVvZiAodW5zaWduZWQgbG9uZykgPT0gOCkK KyAgICByZXR1cm4gX19yZXZsbCAoX192YWx1ZSk7CisgIGVsc2UKKyAgICByZXR1cm4gX19y ZXYgKF9fdmFsdWUpOworfQorCiAjcHJhZ21hIEdDQyBwdXNoX29wdGlvbnMKICNwcmFnbWEg R0NDIHRhcmdldCAoImFyY2g9YXJtdjguMy1hIikKIF9fZXh0ZW5zaW9uX18gZXh0ZXJuIF9f aW5saW5lIGludDMyX3QKZGlmZiAtLWdpdCBhL2djYy90ZXN0c3VpdGUvZ2NjLnRhcmdldC9h YXJjaDY0L2FjbGUvZGF0YS1pbnRyaW5zaWNzLmMgYi9nY2MvdGVzdHN1aXRlL2djYy50YXJn ZXQvYWFyY2g2NC9hY2xlL2RhdGEtaW50cmluc2ljcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0 CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLmUwNjdl ZjIwYmJkYzg5OTM4NjViNTQxYWE5OWRjY2FjNmIwM2U2YTAKLS0tIC9kZXYvbnVsbAorKysg Yi9nY2MvdGVzdHN1aXRlL2djYy50YXJnZXQvYWFyY2g2NC9hY2xlL2RhdGEtaW50cmluc2lj cy5jCkBAIC0wLDAgKzEsNDY4IEBACisvKiBUZXN0IHRoZSBBQ0xFIGRhdGEgaW50cmluc2lj cy4gICovCisvKiB7IGRnLWRvIGFzc2VtYmxlIH0gKi8KKy8qIHsgZGctYWRkaXRpb25hbC1v cHRpb25zICItLXNhdmUtdGVtcHMgLU8xIiB9ICovCisvKiB7IGRnLWZpbmFsIHsgY2hlY2st ZnVuY3Rpb24tYm9kaWVzICIqKiIgIiIgIiIgfSB9ICovCisKKyNpbmNsdWRlICJhcm1fYWNs ZS5oIgorCisvKgorKiogdGVzdF9jbHo6CisqKgljbHoJdzAsIHcwCisqKglyZXQKKyovCisK K3Vuc2lnbmVkIGludCB0ZXN0X2NseiAodWludDMyX3QgYSkKK3sKKyAgcmV0dXJuIF9fY2x6 IChhKTsKK30KKworLyoKKyoqIHRlc3RfY2x6bDoKKyoqCWNseglbd3hdMCwgW3d4XTAKKyoq CXJldAorKi8KKwordW5zaWduZWQgaW50IHRlc3RfY2x6bCAodW5zaWduZWQgbG9uZyBhKQor eworICByZXR1cm4gX19jbHpsIChhKTsKK30KKworLyoKKyoqIHRlc3RfY2x6bGw6CisqKglj bHoJeDAsIHgwCisqKglyZXQKKyovCisKK3Vuc2lnbmVkIGludCB0ZXN0X2NsemxsICh1aW50 NjRfdCBhKQoreworICByZXR1cm4gX19jbHpsbCAoYSk7Cit9CisKKy8qCisqKiB0ZXN0X2Ns czoKKyoqCWNscwl3MCwgdzAKKyoqCXJldAorKi8KKwordW5zaWduZWQgaW50IHRlc3RfY2xz ICh1aW50MzJfdCBhKQoreworICByZXR1cm4gX19jbHMgKGEpOworfQorCisvKgorKiogdGVz dF9jbHNsOgorKioJY2xzCVt3eF0wLCBbd3hdMAorKioJcmV0CisqLworCit1bnNpZ25lZCBp bnQgdGVzdF9jbHNsICh1bnNpZ25lZCBsb25nIGEpCit7CisgIHJldHVybiBfX2Nsc2wgKGEp OworfQorCisvKgorKiogdGVzdF9jbHNsbDoKKyoqCWNscwl4MCwgeDAKKyoqCXJldAorKi8K KwordW5zaWduZWQgaW50IHRlc3RfY2xzbGwgKHVpbnQ2NF90IGEpCit7CisgIHJldHVybiBf X2Nsc2xsIChhKTsKK30KKworLyoKKyoqIHRlc3RfcmJpdDoKKyoqCXJiaXQJdzAsIHcwCisq KglyZXQKKyovCisKK3VpbnQzMl90IHRlc3RfcmJpdCAodWludDMyX3QgYSkKK3sKKyAgcmV0 dXJuIF9fcmJpdCAoYSk7Cit9CisKKy8qCisqKiB0ZXN0X3JiaXRsOgorKioJcmJpdAlbd3hd MCwgW3d4XTAKKyoqCXJldAorKi8KKwordW5zaWduZWQgbG9uZyB0ZXN0X3JiaXRsICh1bnNp Z25lZCBsb25nIGEpCit7CisgIHJldHVybiBfX3JiaXRsIChhKTsKK30KKworLyoKKyoqIHRl c3RfcmJpdGxsOgorKioJcmJpdAl4MCwgeDAKKyoqCXJldAorKi8KKwordWludDY0X3QgdGVz dF9yYml0bGwgKHVpbnQ2NF90IGEpCit7CisgIHJldHVybiBfX3JiaXRsbCAoYSk7Cit9CisK Ky8qCisqKiB0ZXN0X3JldjoKKyoqCXJldgl3MCwgdzAKKyoqCXJldAorKi8KKwordWludDMy X3QgdGVzdF9yZXYgKHVpbnQzMl90IGEpCit7CisgIHJldHVybiBfX3JldiAoYSk7Cit9CisK Ky8qCisqKiB0ZXN0X3Jldmw6CisqKglyZXYJW3d4XTAsIFt3eF0wCisqKglyZXQKKyovCisK K3Vuc2lnbmVkIGxvbmcgdGVzdF9yZXZsICh1bnNpZ25lZCBsb25nIGEpCit7CisgIHJldHVy biBfX3JldmwgKGEpOworfQorCisvKgorKiogdGVzdF9yZXZsbDoKKyoqCXJldgl4MCwgeDAK KyoqCXJldAorKi8KKwordWludDY0X3QgdGVzdF9yZXZsbCAodWludDY0X3QgYSkKK3sKKyAg cmV0dXJuIF9fcmV2bGwgKGEpOworfQorCisvKgorKiogdGVzdF9yZXYxNjoKKyoqCXJldjE2 CXcwLCB3MAorKioJcmV0CisqLworCit1aW50MzJfdCB0ZXN0X3JldjE2ICh1aW50MzJfdCBh KQoreworICByZXR1cm4gX19yZXYxNiAoYSk7Cit9CisKKy8qCisqKiB0ZXN0X3JldjE2bDoK KyoqCXJldjE2CVt3eF0wLCBbd3hdMAorKioJcmV0CisqLworCit1bnNpZ25lZCBsb25nIHRl c3RfcmV2MTZsICh1bnNpZ25lZCBsb25nIGEpCit7CisgIHJldHVybiBfX3JldjE2bCAoYSk7 Cit9CisKKy8qCisqKiB0ZXN0X3JldjE2bGw6CisqKglyZXYxNgl4MCwgeDAKKyoqCXJldAor Ki8KKwordWludDY0X3QgdGVzdF9yZXYxNmxsICh1aW50NjRfdCBhKQoreworICByZXR1cm4g X19yZXYxNmxsIChhKTsKK30KKworLyoKKyoqIHRlc3Rfcm9yOgorKioJcm9yCXcwLCB3MCwg dzEKKyoqCXJldAorKi8KKwordWludDMyX3QgdGVzdF9yb3IgKHVpbnQzMl90IGEsIHVpbnQz Ml90IHIpCit7CisgIHJldHVybiBfX3JvciAoYSwgcik7Cit9CisKKy8qCisqKiB0ZXN0X3Jv cmw6CisqKglyb3IJW3d4XTAsIFt3eF0wLCBbd3hdMQorKioJcmV0CisqLworCit1bnNpZ25l ZCBsb25nIHRlc3Rfcm9ybCAodW5zaWduZWQgbG9uZyBhLCB1aW50MzJfdCByKQoreworICBy ZXR1cm4gX19yb3JsIChhLCByKTsKK30KKworLyoKKyoqIHRlc3Rfcm9ybGw6CisqKglyb3IJ eDAsIHgwLCB4MQorKioJcmV0CisqLworCit1aW50NjRfdCB0ZXN0X3JvcmxsICh1aW50NjRf dCBhLCB1aW50MzJfdCByKQoreworICByZXR1cm4gX19yb3JsbCAoYSwgcik7Cit9CisKKy8q CisqKiB0ZXN0X3JldnNoOgorKioJcmV2MTYJdzAsIHcwCisqKglyZXQKKyovCisKK2ludDE2 X3QgdGVzdF9yZXZzaCAoaW50MTZfdCBhKQoreworICByZXR1cm4gX19yZXZzaCAoYSk7Cit9 CisKK3VpbnQzMl90ICpnMzI7Cit1bnNpZ25lZCBsb25nICpndWw7Cit1aW50NjRfdCAqZzY0 OwordW5zaWduZWQgaW50ICpndWk7CitpbnQxNl90ICpnMTY7CisKKy8qCisqKiB0ZXN0X2Ns el9tZW06CisqKgkuLi4KKyoqCWNsegl3WzAtOV0rLCB3WzAtOV0rCisqKgkuLi4KKyoqCXJl dAorKi8KKwordm9pZCB0ZXN0X2Nsel9tZW0gKHVpbnQzMl90ICphKQoreworICAqZ3VpID0g X19jbHogKCphKTsKK30KKworLyoKKyoqIHRlc3RfY2x6bF9tZW06CisqKgkuLi4KKyoqCWNs eglbd3hdWzAtOV0rLCBbd3hdWzAtOV0rCisqKgkuLi4KKyoqCXJldAorKi8KKwordm9pZCB0 ZXN0X2NsemxfbWVtICh1bnNpZ25lZCBsb25nICphKQoreworICAqZ3VpID0gX19jbHpsICgq YSk7Cit9CisKKy8qCisqKiB0ZXN0X2NsemxsX21lbToKKyoqCS4uLgorKioJY2x6CXhbMC05 XSssIHhbMC05XSsKKyoqCS4uLgorKioJcmV0CisqLworCit2b2lkIHRlc3RfY2x6bGxfbWVt ICh1aW50NjRfdCAqYSkKK3sKKyAgKmd1aSA9IF9fY2x6bGwgKCphKTsKK30KKworLyoKKyoq IHRlc3RfY2xzX21lbToKKyoqCS4uLgorKioJY2xzCXdbMC05XSssIHdbMC05XSsKKyoqCS4u LgorKioJcmV0CisqLworCit2b2lkIHRlc3RfY2xzX21lbSAodWludDMyX3QgKmEpCit7Cisg ICpndWkgPSBfX2NscyAoKmEpOworfQorCisvKgorKiogdGVzdF9jbHNsX21lbToKKyoqCS4u LgorKioJY2xzCVt3eF1bMC05XSssIFt3eF1bMC05XSsKKyoqCS4uLgorKioJcmV0CisqLwor Cit2b2lkIHRlc3RfY2xzbF9tZW0gKHVuc2lnbmVkIGxvbmcgKmEpCit7CisgICpndWkgPSBf X2Nsc2wgKCphKTsKK30KKworLyoKKyoqIHRlc3RfY2xzbGxfbWVtOgorKioJLi4uCisqKglj bHMJeFswLTldKywgeFswLTldKworKioJLi4uCisqKglyZXQKKyovCisKK3ZvaWQgdGVzdF9j bHNsbF9tZW0gKHVpbnQ2NF90ICphKQoreworICAqZ3VpID0gX19jbHNsbCAoKmEpOworfQor CisvKgorKiogdGVzdF9yYml0X21lbToKKyoqCS4uLgorKioJcmJpdAl3WzAtOV0rLCB3WzAt OV0rCisqKgkuLi4KKyoqCXJldAorKi8KKwordm9pZCB0ZXN0X3JiaXRfbWVtICh1aW50MzJf dCAqYSkKK3sKKyAgKmczMiA9IF9fcmJpdCAoKmEpOworfQorCisvKgorKiogdGVzdF9yYml0 bF9tZW06CisqKgkuLi4KKyoqCXJiaXQJW3d4XVswLTldKywgW3d4XVswLTldKworKioJLi4u CisqKglyZXQKKyovCisKK3ZvaWQgdGVzdF9yYml0bF9tZW0gKHVuc2lnbmVkIGxvbmcgKmEp Cit7CisgICpndWwgPSBfX3JiaXRsICgqYSk7Cit9CisKKy8qCisqKiB0ZXN0X3JiaXRsbF9t ZW06CisqKgkuLi4KKyoqCXJiaXQJeFswLTldKywgeFswLTldKworKioJLi4uCisqKglyZXQK KyovCisKK3ZvaWQgdGVzdF9yYml0bGxfbWVtICh1aW50NjRfdCAqYSkKK3sKKyAgKmc2NCA9 IF9fcmJpdGxsICgqYSk7Cit9CisKKy8qCisqKiB0ZXN0X3Jldl9tZW06CisqKgkuLi4KKyoq CXJldgl3WzAtOV0rLCB3WzAtOV0rCisqKgkuLi4KKyoqCXJldAorKi8KKwordm9pZCB0ZXN0 X3Jldl9tZW0gKHVpbnQzMl90ICphKQoreworICAqZzMyID0gX19yZXYgKCphKTsKK30KKwor LyoKKyoqIHRlc3RfcmV2bF9tZW06CisqKgkuLi4KKyoqCXJldglbd3hdWzAtOV0rLCBbd3hd WzAtOV0rCisqKgkuLi4KKyoqCXJldAorKi8KKwordm9pZCB0ZXN0X3JldmxfbWVtICh1bnNp Z25lZCBsb25nICphKQoreworICAqZ3VsID0gX19yZXZsICgqYSk7Cit9CisKKy8qCisqKiB0 ZXN0X3JldmxsX21lbToKKyoqCS4uLgorKioJcmV2CXhbMC05XSssIHhbMC05XSsKKyoqCS4u LgorKioJcmV0CisqLworCit2b2lkIHRlc3RfcmV2bGxfbWVtICh1aW50NjRfdCAqYSkKK3sK KyAgKmc2NCA9IF9fcmV2bGwgKCphKTsKK30KKworLyoKKyoqIHRlc3RfcmV2MTZfbWVtOgor KioJLi4uCisqKglyZXYxNgl3WzAtOV0rLCB3WzAtOV0rCisqKgkuLi4KKyoqCXJldAorKi8K Kwordm9pZCB0ZXN0X3JldjE2X21lbSAodWludDMyX3QgKmEpCit7CisgICpnMzIgPSBfX3Jl djE2ICgqYSk7Cit9CisKKy8qCisqKiB0ZXN0X3JldjE2bF9tZW06CisqKgkuLi4KKyoqCXJl djE2CVt3eF1bMC05XSssIFt3eF1bMC05XSsKKyoqCS4uLgorKioJcmV0CisqLworCit2b2lk IHRlc3RfcmV2MTZsX21lbSAodW5zaWduZWQgbG9uZyAqYSkKK3sKKyAgKmd1bCA9IF9fcmV2 MTZsICgqYSk7Cit9CisKKy8qCisqKiB0ZXN0X3JldjE2bGxfbWVtOgorKioJLi4uCisqKgly ZXYxNgl4WzAtOV0rLCB4WzAtOV0rCisqKgkuLi4KKyoqCXJldAorKi8KKwordm9pZCB0ZXN0 X3JldjE2bGxfbWVtICh1aW50NjRfdCAqYSkKK3sKKyAgKmc2NCA9IF9fcmV2MTZsbCAoKmEp OworfQorCisvKgorKiogdGVzdF9yb3JfbWVtOgorKioJLi4uCisqKglyb3IJd1swLTldKywg d1swLTldKywgd1swLTldKworKioJLi4uCisqKglyZXQKKyovCisKK3ZvaWQgdGVzdF9yb3Jf bWVtICh1aW50MzJfdCAqYSwgdWludDMyX3QgKnIpCit7CisgICpnMzIgPSBfX3JvciAoKmEs ICpyKTsKK30KKworLyoKKyoqIHRlc3Rfcm9ybF9tZW06CisqKgkuLi4KKyoqCXJvcglbd3hd WzAtOV0rLCBbd3hdWzAtOV0rLCBbd3hdWzAtOV0rCisqKgkuLi4KKyoqCXJldAorKi8KKwor dm9pZCB0ZXN0X3JvcmxfbWVtICh1bnNpZ25lZCBsb25nICphLCB1aW50MzJfdCAqcikKK3sK KyAgKmd1bCA9IF9fcm9ybCAoKmEsICpyKTsKK30KKworLyoKKyoqIHRlc3Rfcm9ybGxfbWVt OgorKioJLi4uCisqKglyb3IJeFswLTldKywgeFswLTldKywgeFswLTldKworKioJLi4uCisq KglyZXQKKyovCisKK3ZvaWQgdGVzdF9yb3JsbF9tZW0gKHVpbnQ2NF90ICphLCB1aW50MzJf dCAqcikKK3sKKyAgKmc2NCA9IF9fcm9ybGwgKCphLCAqcik7Cit9CisKKy8qCisqKiB0ZXN0 X3JldnNoX21lbToKKyoqCS4uLgorKioJcmV2MTYJd1swLTldKywgd1swLTldKworKioJLi4u CisqKglyZXQKKyovCisKK3ZvaWQgdGVzdF9yZXZzaF9tZW0gKGludDE2X3QgKmEpCit7Cisg ICpnMTYgPSBfX3JldnNoICgqYSk7Cit9Cg== --------------eGBpDtmg7QnCKweBp7wUigku--