From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from esa2.mentor.iphmx.com (esa2.mentor.iphmx.com [68.232.141.98]) by sourceware.org (Postfix) with ESMTPS id A1B7B3858C2C for ; Tue, 4 Jan 2022 15:32:24 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org A1B7B3858C2C Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=codesourcery.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=mentor.com IronPort-SDR: ZKp+//47FmAOwFuHlprD8GvomsUfQbyUHS5ejEGsCxbslkVU34Bcp6lADRt3DY9WIKkQuvEM3X X8eW1sSLRSNBTlQaUZIMscWxXuqDlmTNt5RhH4gIA9ZeqYIvvYjmpEI2ROMGUvqZ4bsd3ia2+/ sHqPN5tOJK9n1DFfGW/OB8iNVswMOV2mqcmIQ/k9pA+waIsIi2sk7Hl75b0gDp20GMQoxNAR9b DIK6UfWzYg2CCcl+RNyxlKgm1/COOtCWdiUpkVpBX0s9jxeA3T9S2g8n92ciMfYDZy17Y3uTya tH1mGVvByg+P7M2KW0IocW6O X-IronPort-AV: E=Sophos;i="5.88,261,1635235200"; d="scan'208";a="70358568" Received: from orw-gwy-02-in.mentorg.com ([192.94.38.167]) by esa2.mentor.iphmx.com with ESMTP; 04 Jan 2022 07:32:22 -0800 IronPort-SDR: tz2NrUaqk8x8Tk6W3MohAMLFqBVFH9FBt5NyhOfah9HJ3UeX+lh2h7Jj63IshsmhWCmKXcm4h9 5gZbvBuiXKfWmZp2ujsdJ7nVC2+tewQ/nit6GWF4sCn/08neAfT6taqgw/K7tWKn93XpZbFc67 Tb2N+tyhEOrHXmRLUPta5JW/+OP9SgGc1xT58UIxqlLkrBeOr6jHmaxLZkFU1opAekl238xm/R 7nqy7B2/M1JG4nEEG/4Hv7GR/Tpu3MZMAsGlgHR51rVzbpUHi06Um4aEDX3bojqSpGeXAOC/ux bqI= Content-Type: multipart/mixed; boundary="------------sxqmft3kcn5YbkS21mKgQ0Ij" Message-ID: Date: Tue, 4 Jan 2022 15:32:17 +0000 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:91.0) Gecko/20100101 Thunderbird/91.4.1 Content-Language: en-GB From: Andrew Stubbs Subject: [PATCH] libgomp, openmp: pinned memory To: "gcc-patches@gcc.gnu.org" X-Originating-IP: [137.202.0.90] X-ClientProxiedBy: SVR-IES-MBX-07.mgc.mentorg.com (139.181.222.7) To svr-ies-mbx-01.mgc.mentorg.com (139.181.222.1) X-Spam-Status: No, score=-11.6 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.4 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) 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: Tue, 04 Jan 2022 15:32:28 -0000 --------------sxqmft3kcn5YbkS21mKgQ0Ij Content-Type: text/plain; charset="UTF-8"; format=flowed Content-Transfer-Encoding: 7bit This patch implements the OpenMP pinned memory trait for Linux hosts. On other hosts and on devices the trait becomes a no-op (instead of being rejected). The memory is locked via the mlock syscall, which is both the "correct" way to do it on Linux, and a problem because the default ulimit for pinned memory is very small (and most users don't have permission to increase it (much?)). Therefore the code emits a non-fatal warning message if locking fails. Another approach might be to use cudaHostAlloc to allocate the memory in the first place, which bypasses the ulimit somehow, but this would not help non-NVidia users. The tests work on Linux and will xfail on other hosts; neither libgomp nor the test knows how to allocate or query pinned memory elsewhere. The patch applies on top of the text of my previously submitted patches, but does not actually depend on the functionality of those patches. OK for stage 1? I'll commit a backport to OG11 shortly. Andrew --------------sxqmft3kcn5YbkS21mKgQ0Ij Content-Type: text/plain; charset="UTF-8"; name="220104-pinned-trait.patch" Content-Disposition: attachment; filename="220104-pinned-trait.patch" Content-Transfer-Encoding: base64 bGliZ29tcDogcGlubmVkIG1lbW9yeQoKSW1wbGVtZW50IHRoZSBPcGVuTVAgcGlubmVkIG1l bW9yeSB0cmFpdCBvbiBMaW51eCBob3N0cyB1c2luZyB0aGUgbWxvY2sKc3lzY2FsbC4KCmxp YmdvbXAvQ2hhbmdlTG9nOgoKCSogYWxsb2NhdG9yLmMgKE1FTVNQQUNFX1BJTik6IE5ldyBt YWNyby4KCSh4bWxvY2spOiBOZXcgZnVuY3Rpb24uCgkob21wX2luaXRfYWxsb2NhdG9yKTog RG9uJ3QgZGlzYWxsb3cgdGhlIHBpbm5lZCB0cmFpdC4KCShvbXBfYWxpZ25lZF9hbGxvYyk6 IEFkZCBwaW5uaW5nIHZpYSBNRU1TUEFDRV9QSU4uCgkob21wX2FsaWduZWRfY2FsbG9jKTog TGlrZXdpc2UuCgkob21wX3JlYWxsb2MpOiBMaWtld2lzZS4KCSogdGVzdHN1aXRlL2xpYmdv bXAuYy9hbGxvYy1waW5uZWQtMS5jOiBOZXcgdGVzdC4KCSogdGVzdHN1aXRlL2xpYmdvbXAu Yy9hbGxvYy1waW5uZWQtMi5jOiBOZXcgdGVzdC4KCmRpZmYgLS1naXQgYS9saWJnb21wL2Fs bG9jYXRvci5jIGIvbGliZ29tcC9hbGxvY2F0b3IuYwppbmRleCBiMWY1ZmUwYTVlMi4uNjcx YjkxZTdmZjggMTAwNjQ0Ci0tLSBhL2xpYmdvbXAvYWxsb2NhdG9yLmMKKysrIGIvbGliZ29t cC9hbGxvY2F0b3IuYwpAQCAtNTEsNiArNTEsMjUgQEAKICNkZWZpbmUgTUVNU1BBQ0VfRlJF RShNRU1TUEFDRSwgQUREUiwgU0laRSkgXAogICAoKHZvaWQpTUVNU1BBQ0UsICh2b2lkKVNJ WkUsIGZyZWUgKEFERFIpKQogI2VuZGlmCisjaWZuZGVmIE1FTVNQQUNFX1BJTgorLyogT25s eSBkZWZpbmUgdGhpcyBvbiBzdXBwb3J0ZWQgaG9zdCBwbGF0Zm9ybXMuICAqLworI2lmZGVm IF9fbGludXhfXworI2RlZmluZSBNRU1TUEFDRV9QSU4oTUVNU1BBQ0UsIEFERFIsIFNJWkUp IFwKKyAgKCh2b2lkKU1FTVNQQUNFLCB4bWxvY2sgKEFERFIsIFNJWkUpKQorCisjaW5jbHVk ZSA8c3lzL21tYW4uaD4KKyNpbmNsdWRlIDxzdGRpby5oPgordm9pZAoreG1sb2NrICh2b2lk ICphZGRyLCBzaXplX3Qgc2l6ZSkKK3sKKyAgaWYgKG1sb2NrIChhZGRyLCBzaXplKSkKKyAg ICAgIHBlcnJvciAoImxpYmdvbXA6IGZhaWxlZCB0byBwaW4gbWVtb3J5ICh1bGltaXQgdG9v IGxvdz8pIik7Cit9CisjZWxzZQorI2RlZmluZSBNRU1TUEFDRV9QSU4oTUVNU1BBQ0UsIEFE RFIsIFNJWkUpIFwKKyAgKCh2b2lkKU1FTVNQQUNFLCAodm9pZClBRERSLCAodm9pZClTSVpF KQorI2VuZGlmCisjZW5kaWYKIAogLyogTWFwIHRoZSBwcmVkZWZpbmVkIGFsbG9jYXRvcnMg dG8gdGhlIGNvcnJlY3QgbWVtb3J5IHNwYWNlLgogICAgVGhlIGluZGV4IHRvIHRoaXMgdGFi bGUgaXMgdGhlIG9tcF9hbGxvY2F0b3JfaGFuZGxlX3QgZW51bSB2YWx1ZS4gICovCkBAIC0y MTIsNyArMjMxLDcgQEAgb21wX2luaXRfYWxsb2NhdG9yIChvbXBfbWVtc3BhY2VfaGFuZGxl X3QgbWVtc3BhY2UsIGludCBudHJhaXRzLAogICAgIGRhdGEuYWxpZ25tZW50ID0gc2l6ZW9m ICh2b2lkICopOwogCiAgIC8qIE5vIHN1cHBvcnQgZm9yIHRoZXNlIHNvIGZhciAoZm9yIGhi dyB3aWxsIHVzZSBtZW1raW5kKS4gICovCi0gIGlmIChkYXRhLnBpbm5lZCB8fCBkYXRhLm1l bXNwYWNlID09IG9tcF9oaWdoX2J3X21lbV9zcGFjZSkKKyAgaWYgKGRhdGEubWVtc3BhY2Ug PT0gb21wX2hpZ2hfYndfbWVtX3NwYWNlKQogICAgIHJldHVybiBvbXBfbnVsbF9hbGxvY2F0 b3I7CiAKICAgcmV0ID0gZ29tcF9tYWxsb2MgKHNpemVvZiAoc3RydWN0IG9tcF9hbGxvY2F0 b3JfZGF0YSkpOwpAQCAtMzI2LDYgKzM0NSw5IEBAIHJldHJ5OgogI2VuZGlmCiAJICBnb3Rv IGZhaWw7CiAJfQorCisgICAgICBpZiAoYWxsb2NhdG9yX2RhdGEtPnBpbm5lZCkKKwlNRU1T UEFDRV9QSU4gKGFsbG9jYXRvcl9kYXRhLT5tZW1zcGFjZSwgcHRyLCBuZXdfc2l6ZSk7CiAg ICAgfQogICBlbHNlCiAgICAgewpAQCAtMzM1LDYgKzM1Nyw5IEBAIHJldHJ5OgogICAgICAg cHRyID0gTUVNU1BBQ0VfQUxMT0MgKG1lbXNwYWNlLCBuZXdfc2l6ZSk7CiAgICAgICBpZiAo cHRyID09IE5VTEwpCiAJZ290byBmYWlsOworCisgICAgICBpZiAoYWxsb2NhdG9yX2RhdGEg JiYgYWxsb2NhdG9yX2RhdGEtPnBpbm5lZCkKKwlNRU1TUEFDRV9QSU4gKGFsbG9jYXRvcl9k YXRhLT5tZW1zcGFjZSwgcHRyLCBuZXdfc2l6ZSk7CiAgICAgfQogCiAgIGlmIChuZXdfYWxp Z25tZW50ID4gc2l6ZW9mICh2b2lkICopKQpAQCAtNTM5LDYgKzU2NCw5IEBAIHJldHJ5Ogog I2VuZGlmCiAJICBnb3RvIGZhaWw7CiAJfQorCisgICAgICBpZiAoYWxsb2NhdG9yX2RhdGEt PnBpbm5lZCkKKwlNRU1TUEFDRV9QSU4gKGFsbG9jYXRvcl9kYXRhLT5tZW1zcGFjZSwgcHRy LCBuZXdfc2l6ZSk7CiAgICAgfQogICBlbHNlCiAgICAgewpAQCAtNTQ4LDYgKzU3Niw5IEBA IHJldHJ5OgogICAgICAgcHRyID0gTUVNU1BBQ0VfQ0FMTE9DIChtZW1zcGFjZSwgbmV3X3Np emUpOwogICAgICAgaWYgKHB0ciA9PSBOVUxMKQogCWdvdG8gZmFpbDsKKworICAgICAgaWYg KGFsbG9jYXRvcl9kYXRhICYmIGFsbG9jYXRvcl9kYXRhLT5waW5uZWQpCisJTUVNU1BBQ0Vf UElOIChhbGxvY2F0b3JfZGF0YS0+bWVtc3BhY2UsIHB0ciwgbmV3X3NpemUpOwogICAgIH0K IAogICBpZiAobmV3X2FsaWdubWVudCA+IHNpemVvZiAodm9pZCAqKSkKQEAgLTcyNyw3ICs3 NTgsMTEgQEAgcmV0cnk6CiAjZW5kaWYKIAkgIGdvdG8gZmFpbDsKIAl9Ci0gICAgICBlbHNl IGlmIChwcmV2X3NpemUpCisKKyAgICAgIGlmIChhbGxvY2F0b3JfZGF0YS0+cGlubmVkKQor CU1FTVNQQUNFX1BJTiAoYWxsb2NhdG9yX2RhdGEtPm1lbXNwYWNlLCBuZXdfcHRyLCBuZXdf c2l6ZSk7CisKKyAgICAgIGlmIChwcmV2X3NpemUpCiAJewogCSAgcmV0ID0gKGNoYXIgKikg bmV3X3B0ciArIHNpemVvZiAoc3RydWN0IG9tcF9tZW1faGVhZGVyKTsKIAkgICgoc3RydWN0 IG9tcF9tZW1faGVhZGVyICopIHJldClbLTFdLnB0ciA9IG5ld19wdHI7CkBAIC03NDcsNiAr NzgyLDEwIEBAIHJldHJ5OgogICAgICAgbmV3X3B0ciA9IE1FTVNQQUNFX1JFQUxMT0MgKG1l bXNwYWNlLCBkYXRhLT5wdHIsIGRhdGEtPnNpemUsIG5ld19zaXplKTsKICAgICAgIGlmIChu ZXdfcHRyID09IE5VTEwpCiAJZ290byBmYWlsOworCisgICAgICBpZiAoYWxsb2NhdG9yX2Rh dGEgJiYgYWxsb2NhdG9yX2RhdGEtPnBpbm5lZCkKKwlNRU1TUEFDRV9QSU4gKGFsbG9jYXRv cl9kYXRhLT5tZW1zcGFjZSwgcHRyLCBuZXdfc2l6ZSk7CisKICAgICAgIHJldCA9IChjaGFy ICopIG5ld19wdHIgKyBzaXplb2YgKHN0cnVjdCBvbXBfbWVtX2hlYWRlcik7CiAgICAgICAo KHN0cnVjdCBvbXBfbWVtX2hlYWRlciAqKSByZXQpWy0xXS5wdHIgPSBuZXdfcHRyOwogICAg ICAgKChzdHJ1Y3Qgb21wX21lbV9oZWFkZXIgKikgcmV0KVstMV0uc2l6ZSA9IG5ld19zaXpl OwpkaWZmIC0tZ2l0IGEvbGliZ29tcC90ZXN0c3VpdGUvbGliZ29tcC5jL2FsbG9jLXBpbm5l ZC0xLmMgYi9saWJnb21wL3Rlc3RzdWl0ZS9saWJnb21wLmMvYWxsb2MtcGlubmVkLTEuYwpu ZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMC4uMGE2MzYwY2RhMjkKLS0t IC9kZXYvbnVsbAorKysgYi9saWJnb21wL3Rlc3RzdWl0ZS9saWJnb21wLmMvYWxsb2MtcGlu bmVkLTEuYwpAQCAtMCwwICsxLDgxIEBACisvKiB7IGRnLWRvIHJ1biB9ICovCisKKy8qIHsg ZGcteGZhaWwtcnVuLWlmICJQaW5uaW5nIG5vdCBpbXBsZW1lbnRlZCBvbiB0aGlzIGhvc3Qi IHsgISAqLSotbGludXgtZ251IH0gfSAqLworCisvKiBUZXN0IHRoYXQgcGlubmVkIG1lbW9y eSB3b3Jrcy4gICovCisKKyNpZmRlZiBfX2xpbnV4X18KKyNpbmNsdWRlIDxzeXMvdHlwZXMu aD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUg PHN0ZGxpYi5oPgorCisjaW5jbHVkZSA8c3lzL21tYW4uaD4KKworaW50CitnZXRfcGlubmVk X21lbSAoKQoreworICBpbnQgcGlkID0gZ2V0cGlkICgpOworICBjaGFyIGJ1ZlsxMDBdOwor ICBzcHJpbnRmIChidWYsICIvcHJvYy8lZC9zdGF0dXMiLCBwaWQpOworCisgIEZJTEUgKnBy b2MgPSBmb3BlbiAoYnVmLCAiciIpOworICBpZiAoIXByb2MpCisgICAgYWJvcnQgKCk7Cisg IHdoaWxlIChmZ2V0cyAoYnVmLCAxMDAsIHByb2MpKQorICAgIHsKKyAgICAgIGludCB2YWw7 CisgICAgICBpZiAoc3NjYW5mIChidWYsICJWbUxjazogJWQiLCAmdmFsKSkKKwl7CisJICBm Y2xvc2UgKHByb2MpOworCSAgcmV0dXJuIHZhbDsKKwl9CisgICAgfQorICBhYm9ydCAoKTsK K30KKyNlbHNlCitpbnQKK2dldF9waW5uZWRfbWVtICgpCit7CisgIHJldHVybiAwOworfQor I2VuZGlmCisKKyNpbmNsdWRlIDxvbXAuaD4KKworLyogQWxsb2NhdGUgbW9yZSB0aGFuIGEg cGFnZSBlYWNoIHRpbWUsIGJ1dCBzdGF5IHdpdGhpbiB0aGUgdWxpbWl0LiAgKi8KKyNkZWZp bmUgU0laRSAxMCoxMDI0CisKK2ludAorbWFpbiAoKQoreworICBjb25zdCBvbXBfYWxsb2N0 cmFpdF90IHRyYWl0c1tdID0geworICAgICAgeyBvbXBfYXRrX3Bpbm5lZCwgMSB9CisgIH07 CisgIG9tcF9hbGxvY2F0b3JfaGFuZGxlX3QgYWxsb2NhdG9yID0gb21wX2luaXRfYWxsb2Nh dG9yIChvbXBfZGVmYXVsdF9tZW1fc3BhY2UsIDEsIHRyYWl0cyk7CisKKyAgLy8gU2FuaXR5 IGNoZWNrCisgIGlmIChnZXRfcGlubmVkX21lbSAoKSAhPSAwKQorICAgIGFib3J0ICgpOwor CisgIHZvaWQgKnAgPSBvbXBfYWxsb2MgKFNJWkUsIGFsbG9jYXRvcik7CisgIGlmICghcCkK KyAgICBhYm9ydCAoKTsKKworICBpbnQgYW1vdW50ID0gZ2V0X3Bpbm5lZF9tZW0gKCk7Cisg IGlmIChhbW91bnQgPT0gMCkKKyAgICBhYm9ydCAoKTsKKworICBwID0gb21wX3JlYWxsb2Mg KHAsIFNJWkUqMiwgYWxsb2NhdG9yLCBhbGxvY2F0b3IpOworCisgIGludCBhbW91bnQyID0g Z2V0X3Bpbm5lZF9tZW0gKCk7CisgIGlmIChhbW91bnQyIDw9IGFtb3VudCkKKyAgICBhYm9y dCAoKTsKKworICBwID0gb21wX2NhbGxvYyAoMSwgU0laRSwgYWxsb2NhdG9yKTsKKworICBp ZiAoZ2V0X3Bpbm5lZF9tZW0gKCkgPD0gYW1vdW50MikKKyAgICBhYm9ydCAoKTsKKworICBy ZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2xpYmdvbXAvdGVzdHN1aXRlL2xpYmdvbXAuYy9h bGxvYy1waW5uZWQtMi5jIGIvbGliZ29tcC90ZXN0c3VpdGUvbGliZ29tcC5jL2FsbG9jLXBp bm5lZC0yLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAuLjhmZGI0 ZmY1Y2ZkCi0tLSAvZGV2L251bGwKKysrIGIvbGliZ29tcC90ZXN0c3VpdGUvbGliZ29tcC5j L2FsbG9jLXBpbm5lZC0yLmMKQEAgLTAsMCArMSw4NyBAQAorLyogeyBkZy1kbyBydW4gfSAq LworCisvKiB7IGRnLXhmYWlsLXJ1bi1pZiAiUGlubmluZyBub3QgaW1wbGVtZW50ZWQgb24g dGhpcyBob3N0IiB7ICEgKi0qLWxpbnV4LWdudSB9IH0gKi8KKworLyogVGVzdCB0aGF0IHBp bm5lZCBtZW1vcnkgd29ya3MgKHBvb2xfc2l6ZSBjb2RlIHBhdGgpLiAgKi8KKworI2lmZGVm IF9fbGludXhfXworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5o PgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKKyNpbmNsdWRl IDxzeXMvbW1hbi5oPgorCitpbnQKK2dldF9waW5uZWRfbWVtICgpCit7CisgIGludCBwaWQg PSBnZXRwaWQgKCk7CisgIGNoYXIgYnVmWzEwMF07CisgIHNwcmludGYgKGJ1ZiwgIi9wcm9j LyVkL3N0YXR1cyIsIHBpZCk7CisKKyAgRklMRSAqcHJvYyA9IGZvcGVuIChidWYsICJyIik7 CisgIGlmICghcHJvYykKKyAgICBhYm9ydCAoKTsKKyAgd2hpbGUgKGZnZXRzIChidWYsIDEw MCwgcHJvYykpCisgICAgeworICAgICAgaW50IHZhbDsKKyAgICAgIGlmIChzc2NhbmYgKGJ1 ZiwgIlZtTGNrOiAlZCIsICZ2YWwpKQorCXsKKwkgIGZjbG9zZSAocHJvYyk7CisJICByZXR1 cm4gdmFsOworCX0KKyAgICB9CisgIGFib3J0ICgpOworfQorI2Vsc2UKK2ludAorZ2V0X3Bp bm5lZF9tZW0gKCkKK3sKKyAgcmV0dXJuIDA7Cit9CisjZW5kaWYKKworI2luY2x1ZGUgPG9t cC5oPgorCisvKiBBbGxvY2F0ZSBtb3JlIHRoYW4gYSBwYWdlIGVhY2ggdGltZSwgYnV0IHN0 YXkgd2l0aGluIHRoZSB1bGltaXQuICAqLworI2RlZmluZSBTSVpFIDEwKjEwMjQKKworaW50 CittYWluICgpCit7CisgIGNvbnN0IG9tcF9hbGxvY3RyYWl0X3QgdHJhaXRzW10gPSB7Cisg ICAgICB7IG9tcF9hdGtfcGlubmVkLCAxIH0sCisgICAgICB7IG9tcF9hdGtfcG9vbF9zaXpl LCBTSVpFKjggfQorICB9OworICBvbXBfYWxsb2NhdG9yX2hhbmRsZV90IGFsbG9jYXRvciA9 IG9tcF9pbml0X2FsbG9jYXRvciAob21wX2RlZmF1bHRfbWVtX3NwYWNlLAorCQkJCQkJCSAy LCB0cmFpdHMpOworCisgIC8vIFNhbml0eSBjaGVjaworICBpZiAoZ2V0X3Bpbm5lZF9tZW0g KCkgIT0gMCkKKyAgICBhYm9ydCAoKTsKKworICB2b2lkICpwID0gb21wX2FsbG9jIChTSVpF LCBhbGxvY2F0b3IpOworICBpZiAoIXApCisgICAgYWJvcnQgKCk7CisKKyAgaW50IGFtb3Vu dCA9IGdldF9waW5uZWRfbWVtICgpOworICBpZiAoYW1vdW50ID09IDApCisgICAgYWJvcnQg KCk7CisKKyAgcCA9IG9tcF9yZWFsbG9jIChwLCBTSVpFKjIsIGFsbG9jYXRvciwgYWxsb2Nh dG9yKTsKKyAgaWYgKCFwKQorICAgIGFib3J0ICgpOworCisgIGludCBhbW91bnQyID0gZ2V0 X3Bpbm5lZF9tZW0gKCk7CisgIGlmIChhbW91bnQyIDw9IGFtb3VudCkKKyAgICBhYm9ydCAo KTsKKworICBwID0gb21wX2NhbGxvYyAoMSwgU0laRSwgYWxsb2NhdG9yKTsKKyAgaWYgKCFw KQorICAgIGFib3J0ICgpOworCisgIGlmIChnZXRfcGlubmVkX21lbSAoKSA8PSBhbW91bnQy KQorICAgIGFib3J0ICgpOworCisgIHJldHVybiAwOworfQo= --------------sxqmft3kcn5YbkS21mKgQ0Ij--