From mboxrd@z Thu Jan 1 00:00:00 1970 From: Dave Martin Subject: [PATCH v5 18/30] arm64/sve: Probe SVE capabilities and usable vector lengths Date: Tue, 31 Oct 2017 15:51:10 +0000 Message-ID: <1509465082-30427-19-git-send-email-Dave.Martin@arm.com> References: <1509465082-30427-1-git-send-email-Dave.Martin@arm.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from localhost (localhost [127.0.0.1]) by mm01.cs.columbia.edu (Postfix) with ESMTP id 1B85449D4F for ; Tue, 31 Oct 2017 11:50:38 -0400 (EDT) Received: from mm01.cs.columbia.edu ([127.0.0.1]) by localhost (mm01.cs.columbia.edu [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id 9MUM23Mm3pVP for ; Tue, 31 Oct 2017 11:50:36 -0400 (EDT) Received: from foss.arm.com (usa-sjc-mx-foss1.foss.arm.com [217.140.101.70]) by mm01.cs.columbia.edu (Postfix) with ESMTP id 62C9049D6E for ; Tue, 31 Oct 2017 11:50:30 -0400 (EDT) In-Reply-To: <1509465082-30427-1-git-send-email-Dave.Martin@arm.com> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: kvmarm-bounces@lists.cs.columbia.edu Sender: kvmarm-bounces@lists.cs.columbia.edu To: linux-arm-kernel@lists.infradead.org Cc: linux-arch@vger.kernel.org, Okamoto Takayuki , libc-alpha@sourceware.org, Ard Biesheuvel , Szabolcs Nagy , Catalin Marinas , Will Deacon , kvmarm@lists.cs.columbia.edu List-Id: kvmarm@lists.cs.columbia.edu VGhpcyBwYXRjaCB1c2VzIHRoZSBjcHVmZWF0dXJlcyBmcmFtZXdvcmsgdG8gZGV0ZXJtaW5lIGNv bW1vbiBTVkUKY2FwYWJpbGl0aWVzIGFuZCB2ZWN0b3IgbGVuZ3RocywgYW5kIGNvbmZpZ3VyZXMg dGhlIHJ1bnRpbWUgU1ZFCnN1cHBvcnQgY29kZSBhcHByb3ByaWF0ZWx5LgoKWkNSX0VMeCBpcyBu b3QgcmVhbGx5IGEgZmVhdHVyZSByZWdpc3RlciwgYnV0IGl0IGlzIGNvbnZlbmllbnQgdG8KdXNl IGl0IGFzIGEgdGVtcGxhdGUgZm9yIHJlY29yZGluZyB0aGUgbWF4aW11bSB2ZWN0b3IgbGVuZ3Ro CnN1cHBvcnRlZCBieSBhIENQVSwgdXNpbmcgdGhlIExFTiBmaWVsZC4gIFRoaXMgZmllbGQgaXMg c2ltaWxhciB0bwphIGZlYXR1cmUgZmllbGQgaW4gdGhhdCBpdCBpcyBhIGNvbnRpZ3VvdXMgYml0 ZmllbGQgZm9yIHdoaWNoIHdlCndhbnQgdG8gZGV0ZXJtaW5lIHRoZSBtaW5pbXVtIHN5c3RlbS13 aWRlIHZhbHVlLiAgVGhpcyBwYXRjaCBhZGRzClpDUiBhcyBhIHBzZXVkby1yZWdpc3RlciBpbiBj cHVpbmZvL2NwdWZlYXR1cmVzLCB3aXRoIGFwcHJvcHJpYXRlCmN1c3RvbSBjb2RlIHRvIHBvcHVs YXRlIGl0LiAgRmluZGluZyB0aGUgbWluaW11bSBzdXBwb3J0ZWQgdmFsdWUgb2YKdGhlIExFTiBm aWVsZCBpcyBsZWZ0IHRvIHRoZSBjcHVmZWF0dXJlcyBmcmFtZXdvcmsgaW4gdGhlIHVzdWFsCndh eS4KClRoZSBtZWFuaW5nIG9mIElEX0FBNjRaRlIwX0VMMSBpcyBub3QgYXJjaGl0ZWN0dXJhbGx5 IGRlZmluZWQgeWV0LApzbyBmb3Igbm93IHdlIGp1c3QgcmVxdWlyZSBpdCB0byBiZSB6ZXJvLgoK Tm90ZSB0aGF0IG11Y2ggb2YgdGhpcyBjb2RlIGlzIGRvcm1hbnQgYW5kIFNWRSBzdGlsbCB3b24n dCBiZSB1c2VkCnlldCwgc2luY2Ugc3lzdGVtX3N1cHBvcnRzX3N2ZSgpIHJlbWFpbnMgaGFyZHdp cmVkIHRvIGZhbHNlLgoKU2lnbmVkLW9mZi1ieTogRGF2ZSBNYXJ0aW4gPERhdmUuTWFydGluQGFy bS5jb20+ClJldmlld2VkLWJ5OiBTdXp1a2kgSyBQb3Vsb3NlIDxzdXp1a2kucG91bG9zZUBhcm0u Y29tPgpSZXZpZXdlZC1ieTogQ2F0YWxpbiBNYXJpbmFzIDxjYXRhbGluLm1hcmluYXNAYXJtLmNv bT4KQ2M6IEFsZXggQmVubsOpZSA8YWxleC5iZW5uZWVAbGluYXJvLm9yZz4KCi0tLQoKKipEcm9w cGVkIGF0IHYzKiogUmV2aWV3ZWQtYnk6IEFsZXggQmVubsOpZSA8YWxleC5iZW5uZWVAbGluYXJv Lm9yZz4KU2VlIHYzIHBvc3RpbmcgZm9yIGhpc3RvcnkuCi0tLQogYXJjaC9hcm02NC9pbmNsdWRl L2FzbS9jcHUuaCAgICAgICAgfCAgIDQgKysKIGFyY2gvYXJtNjQvaW5jbHVkZS9hc20vY3B1ZmVh dHVyZS5oIHwgIDM2ICsrKysrKysrKysrKwogYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9mcHNpbWQu aCAgICAgfCAgMTQgKysrKysKIGFyY2gvYXJtNjQva2VybmVsL2NwdWZlYXR1cmUuYyAgICAgIHwg IDUyICsrKysrKysrKysrKysrKysKIGFyY2gvYXJtNjQva2VybmVsL2NwdWluZm8uYyAgICAgICAg IHwgICA2ICsrCiBhcmNoL2FybTY0L2tlcm5lbC9mcHNpbWQuYyAgICAgICAgICB8IDExNCArKysr KysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKy0KIDYgZmlsZXMgY2hhbmdlZCwgMjIzIGlu c2VydGlvbnMoKyksIDMgZGVsZXRpb25zKC0pCgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9pbmNs dWRlL2FzbS9jcHUuaCBiL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vY3B1LmgKaW5kZXggODg5MjI2 Yi4uODgzOTIyNyAxMDA2NDQKLS0tIGEvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9jcHUuaAorKysg Yi9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2NwdS5oCkBAIC00MSw2ICs0MSw3IEBAIHN0cnVjdCBj cHVpbmZvX2FybTY0IHsKIAl1NjQJCXJlZ19pZF9hYTY0bW1mcjI7CiAJdTY0CQlyZWdfaWRfYWE2 NHBmcjA7CiAJdTY0CQlyZWdfaWRfYWE2NHBmcjE7CisJdTY0CQlyZWdfaWRfYWE2NHpmcjA7CiAK IAl1MzIJCXJlZ19pZF9kZnIwOwogCXUzMgkJcmVnX2lkX2lzYXIwOwpAQCAtNTksNiArNjAsOSBA QCBzdHJ1Y3QgY3B1aW5mb19hcm02NCB7CiAJdTMyCQlyZWdfbXZmcjA7CiAJdTMyCQlyZWdfbXZm cjE7CiAJdTMyCQlyZWdfbXZmcjI7CisKKwkvKiBwc2V1ZG8tWkNSIGZvciByZWNvcmRpbmcgbWF4 aW11bSBaQ1JfRUwxIExFTiB2YWx1ZTogKi8KKwl1NjQJCXJlZ196Y3I7CiB9OwogCiBERUNMQVJF X1BFUl9DUFUoc3RydWN0IGNwdWluZm9fYXJtNjQsIGNwdV9kYXRhKTsKZGlmZiAtLWdpdCBhL2Fy Y2gvYXJtNjQvaW5jbHVkZS9hc20vY3B1ZmVhdHVyZS5oIGIvYXJjaC9hcm02NC9pbmNsdWRlL2Fz bS9jcHVmZWF0dXJlLmgKaW5kZXggNGVhMzQ0MS4uOWIyN2U4YyAxMDA2NDQKLS0tIGEvYXJjaC9h cm02NC9pbmNsdWRlL2FzbS9jcHVmZWF0dXJlLmgKKysrIGIvYXJjaC9hcm02NC9pbmNsdWRlL2Fz bS9jcHVmZWF0dXJlLmgKQEAgLTEwLDcgKzEwLDkgQEAKICNkZWZpbmUgX19BU01fQ1BVRkVBVFVS RV9ICiAKICNpbmNsdWRlIDxhc20vY3B1Y2Fwcy5oPgorI2luY2x1ZGUgPGFzbS9mcHNpbWQuaD4K ICNpbmNsdWRlIDxhc20vaHdjYXAuaD4KKyNpbmNsdWRlIDxhc20vc2lnY29udGV4dC5oPgogI2lu Y2x1ZGUgPGFzbS9zeXNyZWcuaD4KIAogLyoKQEAgLTIyMyw2ICsyMjUsMTMgQEAgc3RhdGljIGlu bGluZSBib29sIGlkX2FhNjRwZnIwXzMyYml0X2VsMCh1NjQgcGZyMCkKIAlyZXR1cm4gdmFsID09 IElEX0FBNjRQRlIwX0VMMF8zMkJJVF82NEJJVDsKIH0KIAorc3RhdGljIGlubGluZSBib29sIGlk X2FhNjRwZnIwX3N2ZSh1NjQgcGZyMCkKK3sKKwl1MzIgdmFsID0gY3B1aWRfZmVhdHVyZV9leHRy YWN0X3Vuc2lnbmVkX2ZpZWxkKHBmcjAsIElEX0FBNjRQRlIwX1NWRV9TSElGVCk7CisKKwlyZXR1 cm4gdmFsID4gMDsKK30KKwogdm9pZCBfX2luaXQgc2V0dXBfY3B1X2ZlYXR1cmVzKHZvaWQpOwog CiB2b2lkIHVwZGF0ZV9jcHVfY2FwYWJpbGl0aWVzKGNvbnN0IHN0cnVjdCBhcm02NF9jcHVfY2Fw YWJpbGl0aWVzICpjYXBzLApAQCAtMjY3LDYgKzI3NiwzMyBAQCBzdGF0aWMgaW5saW5lIGJvb2wg c3lzdGVtX3N1cHBvcnRzX3N2ZSh2b2lkKQogCXJldHVybiBmYWxzZTsKIH0KIAorLyoKKyAqIFJl YWQgdGhlIHBzZXVkby1aQ1IgdXNlZCBieSBjcHVmZWF0dXJlcyB0byBpZGVudGlmeSB0aGUgc3Vw cG9ydGVkIFNWRQorICogdmVjdG9yIGxlbmd0aC4KKyAqCisgKiBVc2Ugb25seSBpZiBTVkUgaXMg cHJlc2VudC4KKyAqIFRoaXMgZnVuY3Rpb24gY2xvYmJlcnMgdGhlIFNWRSB2ZWN0b3IgbGVuZ3Ro LgorICovCitzdGF0aWMgaW5saW5lIHU2NCByZWFkX3pjcl9mZWF0dXJlcyh2b2lkKQoreworCXU2 NCB6Y3I7CisJdW5zaWduZWQgaW50IHZxX21heDsKKworCS8qCisJICogU2V0IHRoZSBtYXhpbXVt IHBvc3NpYmxlIFZMLCBhbmQgd3JpdGUgemVyb2VzIHRvIGFsbCBvdGhlcgorCSAqIGJpdHMgdG8g c2VlIGlmIHRoZXkgc3RpY2suCisJICovCisJc3ZlX2tlcm5lbF9lbmFibGUoTlVMTCk7CisJd3Jp dGVfc3lzcmVnX3MoWkNSX0VMeF9MRU5fTUFTSywgU1lTX1pDUl9FTDEpOworCisJemNyID0gcmVh ZF9zeXNyZWdfcyhTWVNfWkNSX0VMMSk7CisJemNyICY9IH4odTY0KVpDUl9FTHhfTEVOX01BU0s7 IC8qIGZpbmQgc3RpY2t5IDFzIG91dHNpZGUgTEVOIGZpZWxkICovCisJdnFfbWF4ID0gc3ZlX3Zx X2Zyb21fdmwoc3ZlX2dldF92bCgpKTsKKwl6Y3IgfD0gdnFfbWF4IC0gMTsgLyogc2V0IExFTiBm aWVsZCB0byBtYXhpbXVtIGVmZmVjdGl2ZSB2YWx1ZSAqLworCisJcmV0dXJuIHpjcjsKK30KKwog I2VuZGlmIC8qIF9fQVNTRU1CTFlfXyAqLwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJt NjQvaW5jbHVkZS9hc20vZnBzaW1kLmggYi9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2Zwc2ltZC5o CmluZGV4IDg2ZjU1MGMuLmQ4ZTBkYzkgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtNjQvaW5jbHVkZS9h c20vZnBzaW1kLmgKKysrIGIvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9mcHNpbWQuaApAQCAtNzgs NiArNzgsNyBAQCBleHRlcm4gdm9pZCBzdmVfc2F2ZV9zdGF0ZSh2b2lkICpzdGF0ZSwgdTMyICpw ZnBzcik7CiBleHRlcm4gdm9pZCBzdmVfbG9hZF9zdGF0ZSh2b2lkIGNvbnN0ICpzdGF0ZSwgdTMy IGNvbnN0ICpwZnBzciwKIAkJCSAgIHVuc2lnbmVkIGxvbmcgdnFfbWludXNfMSk7CiBleHRlcm4g dW5zaWduZWQgaW50IHN2ZV9nZXRfdmwodm9pZCk7CitleHRlcm4gaW50IHN2ZV9rZXJuZWxfZW5h YmxlKHZvaWQgKik7CiAKIGV4dGVybiBpbnQgX19yb19hZnRlcl9pbml0IHN2ZV9tYXhfdmw7CiAK QEAgLTkwLDEwICs5MSwyMyBAQCBleHRlcm4gdm9pZCBmcHNpbWRfcmVsZWFzZV90YXNrKHN0cnVj dCB0YXNrX3N0cnVjdCAqdGFzayk7CiBleHRlcm4gaW50IHN2ZV9zZXRfdmVjdG9yX2xlbmd0aChz dHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssCiAJCQkJIHVuc2lnbmVkIGxvbmcgdmwsIHVuc2lnbmVk IGxvbmcgZmxhZ3MpOwogCisvKgorICogUHJvYmluZyBhbmQgc2V0dXAgZnVuY3Rpb25zLgorICog Q2FsbHMgdG8gdGhlc2UgZnVuY3Rpb25zIG11c3QgYmUgc2VyaWFsaXNlZCB3aXRoIG9uZSBhbm90 aGVyLgorICovCitleHRlcm4gdm9pZCBfX2luaXQgc3ZlX2luaXRfdnFfbWFwKHZvaWQpOworZXh0 ZXJuIHZvaWQgc3ZlX3VwZGF0ZV92cV9tYXAodm9pZCk7CitleHRlcm4gaW50IHN2ZV92ZXJpZnlf dnFfbWFwKHZvaWQpOworZXh0ZXJuIHZvaWQgX19pbml0IHN2ZV9zZXR1cCh2b2lkKTsKKwogI2Vs c2UgLyogISBDT05GSUdfQVJNNjRfU1ZFICovCiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBzdmVfYWxs b2Moc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrKSB7IH0KIHN0YXRpYyBpbmxpbmUgdm9pZCBmcHNp bWRfcmVsZWFzZV90YXNrKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaykgeyB9CitzdGF0aWMgaW5s aW5lIHZvaWQgc3ZlX2luaXRfdnFfbWFwKHZvaWQpIHsgfQorc3RhdGljIGlubGluZSB2b2lkIHN2 ZV91cGRhdGVfdnFfbWFwKHZvaWQpIHsgfQorc3RhdGljIGlubGluZSBpbnQgc3ZlX3ZlcmlmeV92 cV9tYXAodm9pZCkgeyByZXR1cm4gMDsgfQorc3RhdGljIGlubGluZSB2b2lkIHN2ZV9zZXR1cCh2 b2lkKSB7IH0KIAogI2VuZGlmIC8qICEgQ09ORklHX0FSTTY0X1NWRSAqLwogCmRpZmYgLS1naXQg YS9hcmNoL2FybTY0L2tlcm5lbC9jcHVmZWF0dXJlLmMgYi9hcmNoL2FybTY0L2tlcm5lbC9jcHVm ZWF0dXJlLmMKaW5kZXggZTIyNjc5OS4uMjE1NDM3MyAxMDA2NDQKLS0tIGEvYXJjaC9hcm02NC9r ZXJuZWwvY3B1ZmVhdHVyZS5jCisrKyBiL2FyY2gvYXJtNjQva2VybmVsL2NwdWZlYXR1cmUuYwpA QCAtMjcsNiArMjcsNyBAQAogI2luY2x1ZGUgPGFzbS9jcHUuaD4KICNpbmNsdWRlIDxhc20vY3B1 ZmVhdHVyZS5oPgogI2luY2x1ZGUgPGFzbS9jcHVfb3BzLmg+CisjaW5jbHVkZSA8YXNtL2Zwc2lt ZC5oPgogI2luY2x1ZGUgPGFzbS9tbXVfY29udGV4dC5oPgogI2luY2x1ZGUgPGFzbS9wcm9jZXNz b3IuaD4KICNpbmNsdWRlIDxhc20vc3lzcmVnLmg+CkBAIC0yODcsNiArMjg4LDEyIEBAIHN0YXRp YyBjb25zdCBzdHJ1Y3QgYXJtNjRfZnRyX2JpdHMgZnRyX2lkX2RmcjBbXSA9IHsKIAlBUk02NF9G VFJfRU5ELAogfTsKIAorc3RhdGljIGNvbnN0IHN0cnVjdCBhcm02NF9mdHJfYml0cyBmdHJfemNy W10gPSB7CisJQVJNNjRfRlRSX0JJVFMoRlRSX0hJRERFTiwgRlRSX05PTlNUUklDVCwgRlRSX0xP V0VSX1NBRkUsCisJCVpDUl9FTHhfTEVOX1NISUZULCBaQ1JfRUx4X0xFTl9TSVpFLCAwKSwJLyog TEVOICovCisJQVJNNjRfRlRSX0VORCwKK307CisKIC8qCiAgKiBDb21tb24gZnRyIGJpdHMgZm9y IGEgMzJiaXQgcmVnaXN0ZXIgd2l0aCBhbGwgaGlkZGVuLCBzdHJpY3QKICAqIGF0dHJpYnV0ZXMs IHdpdGggNGJpdCBmZWF0dXJlIGZpZWxkcyBhbmQgYSBkZWZhdWx0IHNhZmUgdmFsdWUgb2YKQEAg LTM1Myw2ICszNjAsNyBAQCBzdGF0aWMgY29uc3Qgc3RydWN0IF9fZnRyX3JlZ19lbnRyeSB7CiAJ LyogT3AxID0gMCwgQ1JuID0gMCwgQ1JtID0gNCAqLwogCUFSTTY0X0ZUUl9SRUcoU1lTX0lEX0FB NjRQRlIwX0VMMSwgZnRyX2lkX2FhNjRwZnIwKSwKIAlBUk02NF9GVFJfUkVHKFNZU19JRF9BQTY0 UEZSMV9FTDEsIGZ0cl9yYXopLAorCUFSTTY0X0ZUUl9SRUcoU1lTX0lEX0FBNjRaRlIwX0VMMSwg ZnRyX3JheiksCiAKIAkvKiBPcDEgPSAwLCBDUm4gPSAwLCBDUm0gPSA1ICovCiAJQVJNNjRfRlRS X1JFRyhTWVNfSURfQUE2NERGUjBfRUwxLCBmdHJfaWRfYWE2NGRmcjApLApAQCAtMzY3LDYgKzM3 NSw5IEBAIHN0YXRpYyBjb25zdCBzdHJ1Y3QgX19mdHJfcmVnX2VudHJ5IHsKIAlBUk02NF9GVFJf UkVHKFNZU19JRF9BQTY0TU1GUjFfRUwxLCBmdHJfaWRfYWE2NG1tZnIxKSwKIAlBUk02NF9GVFJf UkVHKFNZU19JRF9BQTY0TU1GUjJfRUwxLCBmdHJfaWRfYWE2NG1tZnIyKSwKIAorCS8qIE9wMSA9 IDAsIENSbiA9IDEsIENSbSA9IDIgKi8KKwlBUk02NF9GVFJfUkVHKFNZU19aQ1JfRUwxLCBmdHJf emNyKSwKKwogCS8qIE9wMSA9IDMsIENSbiA9IDAsIENSbSA9IDAgKi8KIAl7IFNZU19DVFJfRUww LCAmYXJtNjRfZnRyX3JlZ19jdHJlbDAgfSwKIAlBUk02NF9GVFJfUkVHKFNZU19EQ1pJRF9FTDAs IGZ0cl9kY3ppZCksCkBAIC01MDQsNiArNTE1LDcgQEAgdm9pZCBfX2luaXQgaW5pdF9jcHVfZmVh dHVyZXMoc3RydWN0IGNwdWluZm9fYXJtNjQgKmluZm8pCiAJaW5pdF9jcHVfZnRyX3JlZyhTWVNf SURfQUE2NE1NRlIyX0VMMSwgaW5mby0+cmVnX2lkX2FhNjRtbWZyMik7CiAJaW5pdF9jcHVfZnRy X3JlZyhTWVNfSURfQUE2NFBGUjBfRUwxLCBpbmZvLT5yZWdfaWRfYWE2NHBmcjApOwogCWluaXRf Y3B1X2Z0cl9yZWcoU1lTX0lEX0FBNjRQRlIxX0VMMSwgaW5mby0+cmVnX2lkX2FhNjRwZnIxKTsK Kwlpbml0X2NwdV9mdHJfcmVnKFNZU19JRF9BQTY0WkZSMF9FTDEsIGluZm8tPnJlZ19pZF9hYTY0 emZyMCk7CiAKIAlpZiAoaWRfYWE2NHBmcjBfMzJiaXRfZWwwKGluZm8tPnJlZ19pZF9hYTY0cGZy MCkpIHsKIAkJaW5pdF9jcHVfZnRyX3JlZyhTWVNfSURfREZSMF9FTDEsIGluZm8tPnJlZ19pZF9k ZnIwKTsKQEAgLTUyNCw2ICs1MzYsMTAgQEAgdm9pZCBfX2luaXQgaW5pdF9jcHVfZmVhdHVyZXMo c3RydWN0IGNwdWluZm9fYXJtNjQgKmluZm8pCiAJCWluaXRfY3B1X2Z0cl9yZWcoU1lTX01WRlIy X0VMMSwgaW5mby0+cmVnX212ZnIyKTsKIAl9CiAKKwlpZiAoaWRfYWE2NHBmcjBfc3ZlKGluZm8t PnJlZ19pZF9hYTY0cGZyMCkpIHsKKwkJaW5pdF9jcHVfZnRyX3JlZyhTWVNfWkNSX0VMMSwgaW5m by0+cmVnX3pjcik7CisJCXN2ZV9pbml0X3ZxX21hcCgpOworCX0KIH0KIAogc3RhdGljIHZvaWQg dXBkYXRlX2NwdV9mdHJfcmVnKHN0cnVjdCBhcm02NF9mdHJfcmVnICpyZWcsIHU2NCBuZXcpCkBA IC02MjcsNiArNjQzLDkgQEAgdm9pZCB1cGRhdGVfY3B1X2ZlYXR1cmVzKGludCBjcHUsCiAJdGFp bnQgfD0gY2hlY2tfdXBkYXRlX2Z0cl9yZWcoU1lTX0lEX0FBNjRQRlIxX0VMMSwgY3B1LAogCQkJ CSAgICAgIGluZm8tPnJlZ19pZF9hYTY0cGZyMSwgYm9vdC0+cmVnX2lkX2FhNjRwZnIxKTsKIAor CXRhaW50IHw9IGNoZWNrX3VwZGF0ZV9mdHJfcmVnKFNZU19JRF9BQTY0WkZSMF9FTDEsIGNwdSwK KwkJCQkgICAgICBpbmZvLT5yZWdfaWRfYWE2NHpmcjAsIGJvb3QtPnJlZ19pZF9hYTY0emZyMCk7 CisKIAkvKgogCSAqIElmIHdlIGhhdmUgQUFyY2gzMiwgd2UgY2FyZSBhYm91dCAzMi1iaXQgZmVh dHVyZXMgZm9yIGNvbXBhdC4KIAkgKiBJZiB0aGUgc3lzdGVtIGRvZXNuJ3Qgc3VwcG9ydCBBQXJj aDMyLCBkb24ndCB1cGRhdGUgdGhlbS4KQEAgLTY3NCw2ICs2OTMsMTYgQEAgdm9pZCB1cGRhdGVf Y3B1X2ZlYXR1cmVzKGludCBjcHUsCiAJCQkJCWluZm8tPnJlZ19tdmZyMiwgYm9vdC0+cmVnX212 ZnIyKTsKIAl9CiAKKwlpZiAoaWRfYWE2NHBmcjBfc3ZlKGluZm8tPnJlZ19pZF9hYTY0cGZyMCkp IHsKKwkJdGFpbnQgfD0gY2hlY2tfdXBkYXRlX2Z0cl9yZWcoU1lTX1pDUl9FTDEsIGNwdSwKKwkJ CQkJaW5mby0+cmVnX3pjciwgYm9vdC0+cmVnX3pjcik7CisKKwkJLyogUHJvYmUgdmVjdG9yIGxl bmd0aHMsIHVubGVzcyB3ZSBhbHJlYWR5IGdhdmUgdXAgb24gU1ZFICovCisJCWlmIChpZF9hYTY0 cGZyMF9zdmUocmVhZF9zYW5pdGlzZWRfZnRyX3JlZyhTWVNfSURfQUE2NFBGUjBfRUwxKSkgJiYK KwkJICAgICFzeXNfY2Fwc19pbml0aWFsaXNlZCkKKwkJCXN2ZV91cGRhdGVfdnFfbWFwKCk7CisJ fQorCiAJLyoKIAkgKiBNaXNtYXRjaGVkIENQVSBmZWF0dXJlcyBhcmUgYSByZWNpcGUgZm9yIGRp c2FzdGVyLiBEb24ndCBldmVuCiAJICogcHJldGVuZCB0byBzdXBwb3J0IHRoZW0uCkBAIC0xMTA2 LDYgKzExMzUsMjMgQEAgdmVyaWZ5X2xvY2FsX2NwdV9mZWF0dXJlcyhjb25zdCBzdHJ1Y3QgYXJt NjRfY3B1X2NhcGFiaWxpdGllcyAqY2FwcykKIAl9CiB9CiAKK3N0YXRpYyB2b2lkIHZlcmlmeV9z dmVfZmVhdHVyZXModm9pZCkKK3sKKwl1NjQgc2FmZV96Y3IgPSByZWFkX3Nhbml0aXNlZF9mdHJf cmVnKFNZU19aQ1JfRUwxKTsKKwl1NjQgemNyID0gcmVhZF96Y3JfZmVhdHVyZXMoKTsKKworCXVu c2lnbmVkIGludCBzYWZlX2xlbiA9IHNhZmVfemNyICYgWkNSX0VMeF9MRU5fTUFTSzsKKwl1bnNp Z25lZCBpbnQgbGVuID0gemNyICYgWkNSX0VMeF9MRU5fTUFTSzsKKworCWlmIChsZW4gPCBzYWZl X2xlbiB8fCBzdmVfdmVyaWZ5X3ZxX21hcCgpKSB7CisJCXByX2NyaXQoIkNQVSVkOiBTVkU6IHJl cXVpcmVkIHZlY3RvciBsZW5ndGgocykgbWlzc2luZ1xuIiwKKwkJCXNtcF9wcm9jZXNzb3JfaWQo KSk7CisJCWNwdV9kaWVfZWFybHkoKTsKKwl9CisKKwkvKiBBZGQgY2hlY2tzIG9uIG90aGVyIFpD UiBiaXRzIGhlcmUgaWYgbmVjZXNzYXJ5ICovCit9CisKIC8qCiAgKiBSdW4gdGhyb3VnaCB0aGUg ZW5hYmxlZCBzeXN0ZW0gY2FwYWJpbGl0aWVzIGFuZCBlbmFibGUoKSBpdCBvbiB0aGlzIENQVS4K ICAqIFRoZSBjYXBhYmlsaXRpZXMgd2VyZSBkZWNpZGVkIGJhc2VkIG9uIHRoZSBhdmFpbGFibGUg Q1BVcyBhdCB0aGUgYm9vdCB0aW1lLgpAQCAtMTExOSw4ICsxMTY1LDEyIEBAIHN0YXRpYyB2b2lk IHZlcmlmeV9sb2NhbF9jcHVfY2FwYWJpbGl0aWVzKHZvaWQpCiAJdmVyaWZ5X2xvY2FsX2NwdV9l cnJhdGFfd29ya2Fyb3VuZHMoKTsKIAl2ZXJpZnlfbG9jYWxfY3B1X2ZlYXR1cmVzKGFybTY0X2Zl YXR1cmVzKTsKIAl2ZXJpZnlfbG9jYWxfZWxmX2h3Y2Fwcyhhcm02NF9lbGZfaHdjYXBzKTsKKwog CWlmIChzeXN0ZW1fc3VwcG9ydHNfMzJiaXRfZWwwKCkpCiAJCXZlcmlmeV9sb2NhbF9lbGZfaHdj YXBzKGNvbXBhdF9lbGZfaHdjYXBzKTsKKworCWlmIChzeXN0ZW1fc3VwcG9ydHNfc3ZlKCkpCisJ CXZlcmlmeV9zdmVfZmVhdHVyZXMoKTsKIH0KIAogdm9pZCBjaGVja19sb2NhbF9jcHVfY2FwYWJp bGl0aWVzKHZvaWQpCkBAIC0xMTk4LDYgKzEyNDgsOCBAQCB2b2lkIF9faW5pdCBzZXR1cF9jcHVf ZmVhdHVyZXModm9pZCkKIAlpZiAoc3lzdGVtX3N1cHBvcnRzXzMyYml0X2VsMCgpKQogCQlzZXR1 cF9lbGZfaHdjYXBzKGNvbXBhdF9lbGZfaHdjYXBzKTsKIAorCXN2ZV9zZXR1cCgpOworCiAJLyog QWR2ZXJ0aXNlIHRoYXQgd2UgaGF2ZSBjb21wdXRlZCB0aGUgc3lzdGVtIGNhcGFiaWxpdGllcyAq LwogCXNldF9zeXNfY2Fwc19pbml0aWFsaXNlZCgpOwogCmRpZmYgLS1naXQgYS9hcmNoL2FybTY0 L2tlcm5lbC9jcHVpbmZvLmMgYi9hcmNoL2FybTY0L2tlcm5lbC9jcHVpbmZvLmMKaW5kZXggMWZm MWM1YS4uNThkYTUwNCAxMDA2NDQKLS0tIGEvYXJjaC9hcm02NC9rZXJuZWwvY3B1aW5mby5jCisr KyBiL2FyY2gvYXJtNjQva2VybmVsL2NwdWluZm8uYwpAQCAtMTksNiArMTksNyBAQAogI2luY2x1 ZGUgPGFzbS9jcHUuaD4KICNpbmNsdWRlIDxhc20vY3B1dHlwZS5oPgogI2luY2x1ZGUgPGFzbS9j cHVmZWF0dXJlLmg+CisjaW5jbHVkZSA8YXNtL2Zwc2ltZC5oPgogCiAjaW5jbHVkZSA8bGludXgv Yml0b3BzLmg+CiAjaW5jbHVkZSA8bGludXgvYnVnLmg+CkBAIC0zMzEsNiArMzMyLDcgQEAgc3Rh dGljIHZvaWQgX19jcHVpbmZvX3N0b3JlX2NwdShzdHJ1Y3QgY3B1aW5mb19hcm02NCAqaW5mbykK IAlpbmZvLT5yZWdfaWRfYWE2NG1tZnIyID0gcmVhZF9jcHVpZChJRF9BQTY0TU1GUjJfRUwxKTsK IAlpbmZvLT5yZWdfaWRfYWE2NHBmcjAgPSByZWFkX2NwdWlkKElEX0FBNjRQRlIwX0VMMSk7CiAJ aW5mby0+cmVnX2lkX2FhNjRwZnIxID0gcmVhZF9jcHVpZChJRF9BQTY0UEZSMV9FTDEpOworCWlu Zm8tPnJlZ19pZF9hYTY0emZyMCA9IHJlYWRfY3B1aWQoSURfQUE2NFpGUjBfRUwxKTsKIAogCS8q IFVwZGF0ZSB0aGUgMzJiaXQgSUQgcmVnaXN0ZXJzIG9ubHkgaWYgQUFyY2gzMiBpcyBpbXBsZW1l bnRlZCAqLwogCWlmIChpZF9hYTY0cGZyMF8zMmJpdF9lbDAoaW5mby0+cmVnX2lkX2FhNjRwZnIw KSkgewpAQCAtMzUzLDYgKzM1NSwxMCBAQCBzdGF0aWMgdm9pZCBfX2NwdWluZm9fc3RvcmVfY3B1 KHN0cnVjdCBjcHVpbmZvX2FybTY0ICppbmZvKQogCQlpbmZvLT5yZWdfbXZmcjIgPSByZWFkX2Nw dWlkKE1WRlIyX0VMMSk7CiAJfQogCisJaWYgKElTX0VOQUJMRUQoQ09ORklHX0FSTTY0X1NWRSkg JiYKKwkgICAgaWRfYWE2NHBmcjBfc3ZlKGluZm8tPnJlZ19pZF9hYTY0cGZyMCkpCisJCWluZm8t PnJlZ196Y3IgPSByZWFkX3pjcl9mZWF0dXJlcygpOworCiAJY3B1aW5mb19kZXRlY3RfaWNhY2hl X3BvbGljeShpbmZvKTsKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9rZXJuZWwvZnBzaW1k LmMgYi9hcmNoL2FybTY0L2tlcm5lbC9mcHNpbWQuYwppbmRleCAxY2ViMDY5Li5jMTEyOTcyIDEw MDY0NAotLS0gYS9hcmNoL2FybTY0L2tlcm5lbC9mcHNpbWQuYworKysgYi9hcmNoL2FybTY0L2tl cm5lbC9mcHNpbWQuYwpAQCAtMTE0LDE5ICsxMTQsMTkgQEAKIHN0YXRpYyBERUZJTkVfUEVSX0NQ VShzdHJ1Y3QgZnBzaW1kX3N0YXRlICosIGZwc2ltZF9sYXN0X3N0YXRlKTsKIAogLyogRGVmYXVs dCBWTCBmb3IgdGFza3MgdGhhdCBkb24ndCBzZXQgaXQgZXhwbGljaXRseTogKi8KLXN0YXRpYyBp bnQgc3ZlX2RlZmF1bHRfdmwgPSBTVkVfVkxfTUlOOworc3RhdGljIGludCBzdmVfZGVmYXVsdF92 bCA9IC0xOwogCiAjaWZkZWYgQ09ORklHX0FSTTY0X1NWRQogCiAvKiBNYXhpbXVtIHN1cHBvcnRl ZCB2ZWN0b3IgbGVuZ3RoIGFjcm9zcyBhbGwgQ1BVcyAoaW5pdGlhbGx5IHBvaXNvbmVkKSAqLwog aW50IF9fcm9fYWZ0ZXJfaW5pdCBzdmVfbWF4X3ZsID0gLTE7CiAvKiBTZXQgb2YgYXZhaWxhYmxl IHZlY3RvciBsZW5ndGhzLCBhcyB2cV90b19iaXQodnEpOiAqLwotc3RhdGljIERFQ0xBUkVfQklU TUFQKHN2ZV92cV9tYXAsIFNWRV9WUV9NQVgpOworc3RhdGljIF9fcm9fYWZ0ZXJfaW5pdCBERUNM QVJFX0JJVE1BUChzdmVfdnFfbWFwLCBTVkVfVlFfTUFYKTsKIAogI2Vsc2UgLyogISBDT05GSUdf QVJNNjRfU1ZFICovCiAKIC8qIER1bW15IGRlY2xhcmF0aW9uIGZvciBjb2RlIHRoYXQgd2lsbCBi ZSBvcHRpbWlzZWQgb3V0OiAqLwotZXh0ZXJuIERFQ0xBUkVfQklUTUFQKHN2ZV92cV9tYXAsIFNW RV9WUV9NQVgpOworZXh0ZXJuIF9fcm9fYWZ0ZXJfaW5pdCBERUNMQVJFX0JJVE1BUChzdmVfdnFf bWFwLCBTVkVfVlFfTUFYKTsKIAogI2VuZGlmIC8qICEgQ09ORklHX0FSTTY0X1NWRSAqLwogCkBA IC00OTYsNiArNDk2LDExMSBAQCBpbnQgc3ZlX3NldF92ZWN0b3JfbGVuZ3RoKHN0cnVjdCB0YXNr X3N0cnVjdCAqdGFzaywKIH0KIAogLyoKKyAqIEJpdG1hcCBmb3IgdGVtcG9yYXJ5IHN0b3JhZ2Ug b2YgdGhlIHBlci1DUFUgc2V0IG9mIHN1cHBvcnRlZCB2ZWN0b3IgbGVuZ3RocworICogZHVyaW5n IHNlY29uZGFyeSBib290LgorICovCitzdGF0aWMgREVDTEFSRV9CSVRNQVAoc3ZlX3NlY29uZGFy eV92cV9tYXAsIFNWRV9WUV9NQVgpOworCitzdGF0aWMgdm9pZCBzdmVfcHJvYmVfdnFzKERFQ0xB UkVfQklUTUFQKG1hcCwgU1ZFX1ZRX01BWCkpCit7CisJdW5zaWduZWQgaW50IHZxLCB2bDsKKwl1 bnNpZ25lZCBsb25nIHpjcjsKKworCWJpdG1hcF96ZXJvKG1hcCwgU1ZFX1ZRX01BWCk7CisKKwl6 Y3IgPSBaQ1JfRUx4X0xFTl9NQVNLOworCXpjciA9IHJlYWRfc3lzcmVnX3MoU1lTX1pDUl9FTDEp ICYgfnpjcjsKKworCWZvciAodnEgPSBTVkVfVlFfTUFYOyB2cSA+PSBTVkVfVlFfTUlOOyAtLXZx KSB7CisJCXdyaXRlX3N5c3JlZ19zKHpjciB8ICh2cSAtIDEpLCBTWVNfWkNSX0VMMSk7IC8qIHNl bGYtc3luY2luZyAqLworCQl2bCA9IHN2ZV9nZXRfdmwoKTsKKwkJdnEgPSBzdmVfdnFfZnJvbV92 bCh2bCk7IC8qIHNraXAgaW50ZXJ2ZW5pbmcgbGVuZ3RocyAqLworCQlzZXRfYml0KHZxX3RvX2Jp dCh2cSksIG1hcCk7CisJfQorfQorCit2b2lkIF9faW5pdCBzdmVfaW5pdF92cV9tYXAodm9pZCkK K3sKKwlzdmVfcHJvYmVfdnFzKHN2ZV92cV9tYXApOworfQorCisvKgorICogSWYgd2UgaGF2ZW4n dCBjb21taXR0ZWQgdG8gdGhlIHNldCBvZiBzdXBwb3J0ZWQgVlFzIHlldCwgZmlsdGVyIG91dAor ICogdGhvc2Ugbm90IHN1cHBvcnRlZCBieSB0aGUgY3VycmVudCBDUFUuCisgKi8KK3ZvaWQgc3Zl X3VwZGF0ZV92cV9tYXAodm9pZCkKK3sKKwlzdmVfcHJvYmVfdnFzKHN2ZV9zZWNvbmRhcnlfdnFf bWFwKTsKKwliaXRtYXBfYW5kKHN2ZV92cV9tYXAsIHN2ZV92cV9tYXAsIHN2ZV9zZWNvbmRhcnlf dnFfbWFwLCBTVkVfVlFfTUFYKTsKK30KKworLyogQ2hlY2sgd2hldGhlciB0aGUgY3VycmVudCBD UFUgc3VwcG9ydHMgYWxsIFZRcyBpbiB0aGUgY29tbWl0dGVkIHNldCAqLworaW50IHN2ZV92ZXJp ZnlfdnFfbWFwKHZvaWQpCit7CisJaW50IHJldCA9IDA7CisKKwlzdmVfcHJvYmVfdnFzKHN2ZV9z ZWNvbmRhcnlfdnFfbWFwKTsKKwliaXRtYXBfYW5kbm90KHN2ZV9zZWNvbmRhcnlfdnFfbWFwLCBz dmVfdnFfbWFwLCBzdmVfc2Vjb25kYXJ5X3ZxX21hcCwKKwkJICAgICAgU1ZFX1ZRX01BWCk7CisJ aWYgKCFiaXRtYXBfZW1wdHkoc3ZlX3NlY29uZGFyeV92cV9tYXAsIFNWRV9WUV9NQVgpKSB7CisJ CXByX3dhcm4oIlNWRTogY3B1JWQ6IFJlcXVpcmVkIHZlY3RvciBsZW5ndGgocykgbWlzc2luZ1xu IiwKKwkJCXNtcF9wcm9jZXNzb3JfaWQoKSk7CisJCXJldCA9IC1FSU5WQUw7CisJfQorCisJcmV0 dXJuIHJldDsKK30KKworLyoKKyAqIEVuYWJsZSBTVkUgZm9yIEVMMS4KKyAqIEludGVuZGVkIGZv ciB1c2UgYnkgdGhlIGNwdWZlYXR1cmVzIGNvZGUgZHVyaW5nIENQVSBib290LgorICovCitpbnQg c3ZlX2tlcm5lbF9lbmFibGUodm9pZCAqX19hbHdheXNfdW51c2VkIHApCit7CisJd3JpdGVfc3lz cmVnKHJlYWRfc3lzcmVnKENQQUNSX0VMMSkgfCBDUEFDUl9FTDFfWkVOX0VMMUVOLCBDUEFDUl9F TDEpOworCWlzYigpOworCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgX19pbml0IHN2ZV9zZXR1cCh2 b2lkKQoreworCXU2NCB6Y3I7CisKKwlpZiAoIXN5c3RlbV9zdXBwb3J0c19zdmUoKSkKKwkJcmV0 dXJuOworCisJLyoKKwkgKiBUaGUgU1ZFIGFyY2hpdGVjdHVyZSBtYW5kYXRlcyBzdXBwb3J0IGZv ciAxMjgtYml0IHZlY3RvcnMsCisJICogc28gc3ZlX3ZxX21hcCBtdXN0IGhhdmUgYXQgbGVhc3Qg U1ZFX1ZRX01JTiBzZXQuCisJICogSWYgc29tZXRoaW5nIHdlbnQgd3JvbmcsIGF0IGxlYXN0IHRy eSB0byBwYXRjaCBpdCB1cDoKKwkgKi8KKwlpZiAoV0FSTl9PTighdGVzdF9iaXQodnFfdG9fYml0 KFNWRV9WUV9NSU4pLCBzdmVfdnFfbWFwKSkpCisJCXNldF9iaXQodnFfdG9fYml0KFNWRV9WUV9N SU4pLCBzdmVfdnFfbWFwKTsKKworCXpjciA9IHJlYWRfc2FuaXRpc2VkX2Z0cl9yZWcoU1lTX1pD Ul9FTDEpOworCXN2ZV9tYXhfdmwgPSBzdmVfdmxfZnJvbV92cSgoemNyICYgWkNSX0VMeF9MRU5f TUFTSykgKyAxKTsKKworCS8qCisJICogU2FuaXR5LWNoZWNrIHRoYXQgdGhlIG1heCBWTCB3ZSBk ZXRlcm1pbmVkIHRocm91Z2ggQ1BVIGZlYXR1cmVzCisJICogY29ycmVzcG9uZHMgcHJvcGVybHkg dG8gc3ZlX3ZxX21hcC4gIElmIG5vdCwgZG8gb3VyIGJlc3Q6CisJICovCisJaWYgKFdBUk5fT04o c3ZlX21heF92bCAhPSBmaW5kX3N1cHBvcnRlZF92ZWN0b3JfbGVuZ3RoKHN2ZV9tYXhfdmwpKSkK KwkJc3ZlX21heF92bCA9IGZpbmRfc3VwcG9ydGVkX3ZlY3Rvcl9sZW5ndGgoc3ZlX21heF92bCk7 CisKKwkvKgorCSAqIEZvciB0aGUgZGVmYXVsdCBWTCwgcGljayB0aGUgbWF4aW11bSBzdXBwb3J0 ZWQgdmFsdWUgPD0gNjQuCisJICogVkwgPT0gNjQgaXMgZ3VhcmFudGVlZCBub3QgdG8gZ3JvdyB0 aGUgc2lnbmFsIGZyYW1lLgorCSAqLworCXN2ZV9kZWZhdWx0X3ZsID0gZmluZF9zdXBwb3J0ZWRf dmVjdG9yX2xlbmd0aCg2NCk7CisKKwlwcl9pbmZvKCJTVkU6IG1heGltdW0gYXZhaWxhYmxlIHZl Y3RvciBsZW5ndGggJXUgYnl0ZXMgcGVyIHZlY3RvclxuIiwKKwkJc3ZlX21heF92bCk7CisJcHJf aW5mbygiU1ZFOiBkZWZhdWx0IHZlY3RvciBsZW5ndGggJXUgYnl0ZXMgcGVyIHZlY3RvclxuIiwK KwkJc3ZlX2RlZmF1bHRfdmwpOworfQorCisvKgogICogQ2FsbGVkIGZyb20gdGhlIHB1dF90YXNr X3N0cnVjdCgpIHBhdGgsIHdoaWNoIGNhbm5vdCBnZXQgaGVyZQogICogdW5sZXNzIGRlYWRfdGFz ayBpcyByZWFsbHkgZGVhZCBhbmQgbm90IHNjaGVkdWxhYmxlLgogICovCkBAIC02MzAsNiArNzM1 LDkgQEAgdm9pZCBmcHNpbWRfZmx1c2hfdGhyZWFkKHZvaWQpCiAJCSAqIFRoaXMgaXMgd2hlcmUg d2UgZW5zdXJlIHRoYXQgYWxsIHVzZXIgdGFza3MgaGF2ZSBhIHZhbGlkCiAJCSAqIHZlY3RvciBs ZW5ndGggY29uZmlndXJlZDogbm8ga2VybmVsIHRhc2sgY2FuIGJlY29tZSBhIHVzZXIKIAkJICog dGFzayB3aXRob3V0IGFuIGV4ZWMgYW5kIGhlbmNlIGEgY2FsbCB0byB0aGlzIGZ1bmN0aW9uLgor CQkgKiBCeSB0aGUgdGltZSB0aGUgZmlyc3QgY2FsbCB0byB0aGlzIGZ1bmN0aW9uIGlzIG1hZGUs IGFsbAorCQkgKiBlYXJseSBoYXJkd2FyZSBwcm9iaW5nIGlzIGNvbXBsZXRlLCBzbyBzdmVfZGVm YXVsdF92bAorCQkgKiBzaG91bGQgYmUgdmFsaWQuCiAJCSAqIElmIGEgYnVnIGNhdXNlcyB0aGlz IHRvIGdvIHdyb25nLCB3ZSBtYWtlIHNvbWUgbm9pc2UgYW5kCiAJCSAqIHRyeSB0byBmdWRnZSB0 aHJlYWQuc3ZlX3ZsIHRvIGEgc2FmZSB2YWx1ZSBoZXJlLgogCQkgKi8KLS0gCjIuMS40CgpfX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwprdm1hcm0gbWFpbGlu ZyBsaXN0Cmt2bWFybUBsaXN0cy5jcy5jb2x1bWJpYS5lZHUKaHR0cHM6Ly9saXN0cy5jcy5jb2x1 bWJpYS5lZHUvbWFpbG1hbi9saXN0aW5mby9rdm1hcm0K