From mboxrd@z Thu Jan 1 00:00:00 1970 From: Chris Wilson Subject: [PATCH 21/42] drm/i915: Implement pwrite without struct-mutex Date: Fri, 7 Oct 2016 10:46:14 +0100 Message-ID: <20161007094635.28319-22-chris@chris-wilson.co.uk> References: <20161007094635.28319-1-chris@chris-wilson.co.uk> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from mail-wm0-x242.google.com (mail-wm0-x242.google.com [IPv6:2a00:1450:400c:c09::242]) by gabe.freedesktop.org (Postfix) with ESMTPS id D1B996EB3E for ; Fri, 7 Oct 2016 09:47:05 +0000 (UTC) Received: by mail-wm0-x242.google.com with SMTP id 123so2084860wmb.3 for ; Fri, 07 Oct 2016 02:47:05 -0700 (PDT) In-Reply-To: <20161007094635.28319-1-chris@chris-wilson.co.uk> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: intel-gfx-bounces@lists.freedesktop.org Sender: "Intel-gfx" To: intel-gfx@lists.freedesktop.org List-Id: intel-gfx@lists.freedesktop.org V2Ugb25seSBuZWVkIHN0cnVjdF9tdXRleCB3aXRoaW4gcHdyaXRlIGZvciBhIGJyaWVmIHdpbmRv dyB3aGVyZSB3ZSBuZWVkCnRvIHNlcmlhbGlzZSB3aXRoIHJlbmRlcmluZyBhbmQgY29udHJvbCBv dXIgY2FjaGUgZG9tYWlucy4gRWxzZXdoZXJlIHdlCmNhbiByZWx5IG9uIHRoZSBiYWNraW5nIHN0 b3JhZ2UgYmVpbmcgcGlubmVkLCBhbmQgZm9yZ2l2ZSB1c2Vyc3BhY2UgYW55CnJhY2VzIGFnYWlu c3QgdXMuCgpTaWduZWQtb2ZmLWJ5OiBDaHJpcyBXaWxzb24gPGNocmlzQGNocmlzLXdpbHNvbi5j by51az4KLS0tCiBkcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2dlbS5jIHwgMzQ2ICsrKysrKysr KysrKysrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIDEgZmlsZSBjaGFuZ2VkLCAxMjAgaW5z ZXJ0aW9ucygrKSwgMjI2IGRlbGV0aW9ucygtKQoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2Ry bS9pOTE1L2k5MTVfZ2VtLmMgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2dlbS5jCmluZGV4 IDI3ZjkxNzE0ZTgyZS4uODFmODgxMDNlNmY1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0v aTkxNS9pOTE1X2dlbS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZ2VtLmMKQEAg LTExMjEsMTAgKzExMjEsMTAgQEAgb3V0OgogICovCiAKIHN0YXRpYyBpbmxpbmUgaW50Ci1mYXN0 X3VzZXJfd3JpdGUoc3RydWN0IGlvX21hcHBpbmcgKm1hcHBpbmcsCi0JCWxvZmZfdCBwYWdlX2Jh c2UsIGludCBwYWdlX29mZnNldCwKLQkJY2hhciBfX3VzZXIgKnVzZXJfZGF0YSwKLQkJaW50IGxl bmd0aCkKK2dndHRfd3JpdGUoc3RydWN0IGlvX21hcHBpbmcgKm1hcHBpbmcsCisJICAgbG9mZl90 IHBhZ2VfYmFzZSwgaW50IHBhZ2Vfb2Zmc2V0LAorCSAgIGNoYXIgX191c2VyICp1c2VyX2RhdGEs CisJICAgaW50IGxlbmd0aCkKIHsKIAl2b2lkIF9faW9tZW0gKnZhZGRyX2F0b21pYzsKIAl2b2lk ICp2YWRkcjsKQEAgLTExMzIsNjAgKzExMzIsNDIgQEAgZmFzdF91c2VyX3dyaXRlKHN0cnVjdCBp b19tYXBwaW5nICptYXBwaW5nLAogCiAJdmFkZHJfYXRvbWljID0gaW9fbWFwcGluZ19tYXBfYXRv bWljX3djKG1hcHBpbmcsIHBhZ2VfYmFzZSk7CiAJLyogV2UgY2FuIHVzZSB0aGUgY3B1IG1lbSBj b3B5IGZ1bmN0aW9uIGJlY2F1c2UgdGhpcyBpcyBYODYuICovCi0JdmFkZHIgPSAodm9pZCBfX2Zv cmNlKil2YWRkcl9hdG9taWMgKyBwYWdlX29mZnNldDsKKwl2YWRkciA9ICh2b2lkIF9fZm9yY2Ug Kil2YWRkcl9hdG9taWMgKyBwYWdlX29mZnNldDsKIAl1bndyaXR0ZW4gPSBfX2NvcHlfZnJvbV91 c2VyX2luYXRvbWljX25vY2FjaGUodmFkZHIsCiAJCQkJCQkgICAgICB1c2VyX2RhdGEsIGxlbmd0 aCk7CiAJaW9fbWFwcGluZ191bm1hcF9hdG9taWModmFkZHJfYXRvbWljKTsKLQlyZXR1cm4gdW53 cml0dGVuOwotfQogCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcKLXNsb3dfdXNlcl9hY2Nl c3Moc3RydWN0IGlvX21hcHBpbmcgKm1hcHBpbmcsCi0JCSB1bnNpZ25lZCBsb25nIHBhZ2VfYmFz ZSwgaW50IHBhZ2Vfb2Zmc2V0LAotCQkgY2hhciBfX3VzZXIgKnVzZXJfZGF0YSwKLQkJIHVuc2ln bmVkIGxvbmcgbGVuZ3RoLCBib29sIHB3cml0ZSkKLXsKLQl2b2lkIF9faW9tZW0gKmlvYWRkcjsK LQl2b2lkICp2YWRkcjsKLQl1bnNpZ25lZCBsb25nIHVud3JpdHRlbjsKLQotCWlvYWRkciA9IGlv X21hcHBpbmdfbWFwX3djKG1hcHBpbmcsIHBhZ2VfYmFzZSwgUEFHRV9TSVpFKTsKLQkvKiBXZSBj YW4gdXNlIHRoZSBjcHUgbWVtIGNvcHkgZnVuY3Rpb24gYmVjYXVzZSB0aGlzIGlzIFg4Ni4gKi8K LQl2YWRkciA9ICh2b2lkIF9fZm9yY2UgKilpb2FkZHIgKyBwYWdlX29mZnNldDsKLQlpZiAocHdy aXRlKQotCQl1bndyaXR0ZW4gPSBfX2NvcHlfZnJvbV91c2VyKHZhZGRyLCB1c2VyX2RhdGEsIGxl bmd0aCk7Ci0JZWxzZQotCQl1bndyaXR0ZW4gPSBfX2NvcHlfdG9fdXNlcih1c2VyX2RhdGEsIHZh ZGRyLCBsZW5ndGgpOworCWlmICh1bndyaXR0ZW4pIHsKKwkJdmFkZHJfYXRvbWljID0gaW9fbWFw cGluZ19tYXBfd2MobWFwcGluZywgcGFnZV9iYXNlLCBQQUdFX1NJWkUpOworCQkvKiBXZSBjYW4g dXNlIHRoZSBjcHUgbWVtIGNvcHkgZnVuY3Rpb24gYmVjYXVzZSB0aGlzIGlzIFg4Ni4gKi8KKwkJ dmFkZHIgPSAodm9pZCBfX2ZvcmNlICopdmFkZHJfYXRvbWljICsgcGFnZV9vZmZzZXQ7CisJCXVu d3JpdHRlbiA9IGNvcHlfZnJvbV91c2VyKHZhZGRyLCB1c2VyX2RhdGEsIGxlbmd0aCk7CisJCWlv X21hcHBpbmdfdW5tYXAodmFkZHJfYXRvbWljKTsKKwl9CiAKLQlpb19tYXBwaW5nX3VubWFwKGlv YWRkcik7CiAJcmV0dXJuIHVud3JpdHRlbjsKIH0KIAogLyoqCiAgKiBUaGlzIGlzIHRoZSBmYXN0 IHB3cml0ZSBwYXRoLCB3aGVyZSB3ZSBjb3B5IHRoZSBkYXRhIGRpcmVjdGx5IGZyb20gdGhlCiAg KiB1c2VyIGludG8gdGhlIEdUVCwgdW5jYWNoZWQuCi0gKiBAaTkxNTogaTkxNSBkZXZpY2UgcHJp dmF0ZSBkYXRhCi0gKiBAb2JqOiBpOTE1IGdlbSBvYmplY3QKKyAqIEBvYmo6IGk5MTUgR0VNIG9i amVjdAogICogQGFyZ3M6IHB3cml0ZSBhcmd1bWVudHMgc3RydWN0dXJlCi0gKiBAZmlsZTogZHJt IGZpbGUgcG9pbnRlcgogICovCiBzdGF0aWMgaW50Ci1pOTE1X2dlbV9ndHRfcHdyaXRlX2Zhc3Qo c3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmk5MTUsCi0JCQkgc3RydWN0IGRybV9pOTE1X2dlbV9v YmplY3QgKm9iaiwKLQkJCSBzdHJ1Y3QgZHJtX2k5MTVfZ2VtX3B3cml0ZSAqYXJncywKLQkJCSBz dHJ1Y3QgZHJtX2ZpbGUgKmZpbGUpCitpOTE1X2dlbV9ndHRfcHdyaXRlX2Zhc3Qoc3RydWN0IGRy bV9pOTE1X2dlbV9vYmplY3QgKm9iaiwKKwkJCSBjb25zdCBzdHJ1Y3QgZHJtX2k5MTVfZ2VtX3B3 cml0ZSAqYXJncykKIHsKLQlzdHJ1Y3QgaTkxNV9nZ3R0ICpnZ3R0ID0gJmk5MTUtPmdndHQ7Ci0J c3RydWN0IGRybV9kZXZpY2UgKmRldiA9IG9iai0+YmFzZS5kZXY7Ci0Jc3RydWN0IGk5MTVfdm1h ICp2bWE7CisJc3RydWN0IGk5MTVfZ2d0dCAqZ2d0dCA9ICZ0b19pOTE1KG9iai0+YmFzZS5kZXYp LT5nZ3R0OwogCXN0cnVjdCBkcm1fbW1fbm9kZSBub2RlOwotCXVpbnQ2NF90IHJlbWFpbiwgb2Zm c2V0OwotCWNoYXIgX191c2VyICp1c2VyX2RhdGE7CisJc3RydWN0IGk5MTVfdm1hICp2bWE7CisJ dTY0IHJlbWFpbiwgb2Zmc2V0OworCXZvaWQgX191c2VyICp1c2VyX2RhdGE7CiAJaW50IHJldDsK LQlib29sIGhpdF9zbG93X3BhdGggPSBmYWxzZTsKIAotCWlmIChpOTE1X2dlbV9vYmplY3RfaXNf dGlsZWQob2JqKSkKLQkJcmV0dXJuIC1FRkFVTFQ7CisJcmV0ID0gbXV0ZXhfbG9ja19pbnRlcnJ1 cHRpYmxlKCZvYmotPmJhc2UuZGV2LT5zdHJ1Y3RfbXV0ZXgpOworCWlmIChyZXQpCisJCXJldHVy biByZXQ7CiAKIAl2bWEgPSBpOTE1X2dlbV9vYmplY3RfZ2d0dF9waW4ob2JqLCBOVUxMLCAwLCAw LAogCQkJCSAgICAgICBQSU5fTUFQUEFCTEUgfCBQSU5fTk9OQkxPQ0spOwpAQCAtMTIwMSwyMSAr MTE4MywxNyBAQCBpOTE1X2dlbV9ndHRfcHdyaXRlX2Zhc3Qoc3RydWN0IGRybV9pOTE1X3ByaXZh dGUgKmk5MTUsCiAJaWYgKElTX0VSUih2bWEpKSB7CiAJCXJldCA9IGluc2VydF9tYXBwYWJsZV9u b2RlKGdndHQsICZub2RlLCBQQUdFX1NJWkUpOwogCQlpZiAocmV0KQotCQkJZ290byBvdXQ7Ci0K LQkJcmV0ID0gaTkxNV9nZW1fb2JqZWN0X3Bpbl9wYWdlcyhvYmopOwotCQlpZiAocmV0KSB7Ci0J CQlyZW1vdmVfbWFwcGFibGVfbm9kZSgmbm9kZSk7Ci0JCQlnb3RvIG91dDsKLQkJfQorCQkJZ290 byBvdXRfdW5sb2NrOworCQlHRU1fQlVHX09OKCFub2RlLmFsbG9jYXRlZCk7CiAJfQogCiAJcmV0 ID0gaTkxNV9nZW1fb2JqZWN0X3NldF90b19ndHRfZG9tYWluKG9iaiwgdHJ1ZSk7CiAJaWYgKHJl dCkKIAkJZ290byBvdXRfdW5waW47CiAKKwltdXRleF91bmxvY2soJm9iai0+YmFzZS5kZXYtPnN0 cnVjdF9tdXRleCk7CisKIAlpbnRlbF9mYl9vYmpfaW52YWxpZGF0ZShvYmosIE9SSUdJTl9DUFUp OwotCW9iai0+bW0uZGlydHkgPSB0cnVlOwogCiAJdXNlcl9kYXRhID0gdTY0X3RvX3VzZXJfcHRy KGFyZ3MtPmRhdGFfcHRyKTsKIAlvZmZzZXQgPSBhcmdzLT5vZmZzZXQ7CkBAIC0xMjQ2LDkyICsx MjI0LDM2IEBAIGk5MTVfZ2VtX2d0dF9wd3JpdGVfZmFzdChzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0 ZSAqaTkxNSwKIAkJICogSWYgdGhlIG9iamVjdCBpcyBub24tc2htZW0gYmFja2VkLCB3ZSByZXRy eSBhZ2FpbiB3aXRoIHRoZQogCQkgKiBwYXRoIHRoYXQgaGFuZGxlcyBwYWdlIGZhdWx0LgogCQkg Ki8KLQkJaWYgKGZhc3RfdXNlcl93cml0ZSgmZ2d0dC0+bWFwcGFibGUsIHBhZ2VfYmFzZSwKLQkJ CQkgICAgcGFnZV9vZmZzZXQsIHVzZXJfZGF0YSwgcGFnZV9sZW5ndGgpKSB7Ci0JCQloaXRfc2xv d19wYXRoID0gdHJ1ZTsKLQkJCW11dGV4X3VubG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOwotCQkJ aWYgKHNsb3dfdXNlcl9hY2Nlc3MoJmdndHQtPm1hcHBhYmxlLAotCQkJCQkgICAgIHBhZ2VfYmFz ZSwKLQkJCQkJICAgICBwYWdlX29mZnNldCwgdXNlcl9kYXRhLAotCQkJCQkgICAgIHBhZ2VfbGVu Z3RoLCB0cnVlKSkgewotCQkJCXJldCA9IC1FRkFVTFQ7Ci0JCQkJbXV0ZXhfbG9jaygmZGV2LT5z dHJ1Y3RfbXV0ZXgpOwotCQkJCWdvdG8gb3V0X2ZsdXNoOwotCQkJfQotCi0JCQltdXRleF9sb2Nr KCZkZXYtPnN0cnVjdF9tdXRleCk7CisJCWlmIChnZ3R0X3dyaXRlKCZnZ3R0LT5tYXBwYWJsZSwg cGFnZV9iYXNlLCBwYWdlX29mZnNldCwKKwkJCSAgICAgICB1c2VyX2RhdGEsIHBhZ2VfbGVuZ3Ro KSkgeworCQkJcmV0ID0gLUVGQVVMVDsKKwkJCWJyZWFrOwogCQl9CiAKIAkJcmVtYWluIC09IHBh Z2VfbGVuZ3RoOwogCQl1c2VyX2RhdGEgKz0gcGFnZV9sZW5ndGg7CiAJCW9mZnNldCArPSBwYWdl X2xlbmd0aDsKIAl9Ci0KLW91dF9mbHVzaDoKLQlpZiAoaGl0X3Nsb3dfcGF0aCkgewotCQlpZiAo cmV0ID09IDAgJiYKLQkJICAgIChvYmotPmJhc2UucmVhZF9kb21haW5zICYgSTkxNV9HRU1fRE9N QUlOX0dUVCkgPT0gMCkgewotCQkJLyogVGhlIHVzZXIgaGFzIG1vZGlmaWVkIHRoZSBvYmplY3Qg d2hpbHN0IHdlIHRyaWVkCi0JCQkgKiByZWFkaW5nIGZyb20gaXQsIGFuZCB3ZSBub3cgaGF2ZSBu byBpZGVhIHdoYXQgZG9tYWluCi0JCQkgKiB0aGUgcGFnZXMgc2hvdWxkIGJlIGluLiBBcyB3ZSBo YXZlIGp1c3QgYmVlbiB0b3VjaGluZwotCQkJICogdGhlbSBkaXJlY3RseSwgZmx1c2ggZXZlcnl0 aGluZyBiYWNrIHRvIHRoZSBHVFQKLQkJCSAqIGRvbWFpbi4KLQkJCSAqLwotCQkJcmV0ID0gaTkx NV9nZW1fb2JqZWN0X3NldF90b19ndHRfZG9tYWluKG9iaiwgZmFsc2UpOwotCQl9Ci0JfQotCiAJ aW50ZWxfZmJfb2JqX2ZsdXNoKG9iaiwgZmFsc2UsIE9SSUdJTl9DUFUpOworCisJbXV0ZXhfbG9j aygmb2JqLT5iYXNlLmRldi0+c3RydWN0X211dGV4KTsKIG91dF91bnBpbjoKIAlpZiAobm9kZS5h bGxvY2F0ZWQpIHsKIAkJd21iKCk7CiAJCWdndHQtPmJhc2UuY2xlYXJfcmFuZ2UoJmdndHQtPmJh c2UsCiAJCQkJICAgICAgIG5vZGUuc3RhcnQsIG5vZGUuc2l6ZSwKIAkJCQkgICAgICAgdHJ1ZSk7 Ci0JCWk5MTVfZ2VtX29iamVjdF91bnBpbl9wYWdlcyhvYmopOwogCQlyZW1vdmVfbWFwcGFibGVf bm9kZSgmbm9kZSk7CiAJfSBlbHNlIHsKIAkJaTkxNV92bWFfdW5waW4odm1hKTsKIAl9Ci1vdXQ6 CitvdXRfdW5sb2NrOgorCW11dGV4X3VubG9jaygmb2JqLT5iYXNlLmRldi0+c3RydWN0X211dGV4 KTsKIAlyZXR1cm4gcmV0OwogfQogCi0vKiBQZXItcGFnZSBjb3B5IGZ1bmN0aW9uIGZvciB0aGUg c2htZW0gcHdyaXRlIGZhc3RwYXRoLgotICogRmx1c2hlcyBpbnZhbGlkIGNhY2hlbGluZXMgYmVm b3JlIHdyaXRpbmcgdG8gdGhlIHRhcmdldCBpZgotICogbmVlZHNfY2xmbHVzaF9iZWZvcmUgaXMg c2V0IGFuZCBmbHVzaGVzIG91dCBhbnkgd3JpdHRlbiBjYWNoZWxpbmVzIGFmdGVyCi0gKiB3cml0 aW5nIGlmIG5lZWRzX2NsZmx1c2ggaXMgc2V0LiAqLwotc3RhdGljIGludAotc2htZW1fcHdyaXRl X2Zhc3Qoc3RydWN0IHBhZ2UgKnBhZ2UsIGludCBzaG1lbV9wYWdlX29mZnNldCwgaW50IHBhZ2Vf bGVuZ3RoLAotCQkgIGNoYXIgX191c2VyICp1c2VyX2RhdGEsCi0JCSAgYm9vbCBwYWdlX2RvX2Jp dDE3X3N3aXp6bGluZywKLQkJICBib29sIG5lZWRzX2NsZmx1c2hfYmVmb3JlLAotCQkgIGJvb2wg bmVlZHNfY2xmbHVzaF9hZnRlcikKLXsKLQljaGFyICp2YWRkcjsKLQlpbnQgcmV0OwotCi0JaWYg KHVubGlrZWx5KHBhZ2VfZG9fYml0MTdfc3dpenpsaW5nKSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0K LQl2YWRkciA9IGttYXBfYXRvbWljKHBhZ2UpOwotCWlmIChuZWVkc19jbGZsdXNoX2JlZm9yZSkK LQkJZHJtX2NsZmx1c2hfdmlydF9yYW5nZSh2YWRkciArIHNobWVtX3BhZ2Vfb2Zmc2V0LAotCQkJ CSAgICAgICBwYWdlX2xlbmd0aCk7Ci0JcmV0ID0gX19jb3B5X2Zyb21fdXNlcl9pbmF0b21pYyh2 YWRkciArIHNobWVtX3BhZ2Vfb2Zmc2V0LAotCQkJCQl1c2VyX2RhdGEsIHBhZ2VfbGVuZ3RoKTsK LQlpZiAobmVlZHNfY2xmbHVzaF9hZnRlcikKLQkJZHJtX2NsZmx1c2hfdmlydF9yYW5nZSh2YWRk ciArIHNobWVtX3BhZ2Vfb2Zmc2V0LAotCQkJCSAgICAgICBwYWdlX2xlbmd0aCk7Ci0Ja3VubWFw X2F0b21pYyh2YWRkcik7Ci0KLQlyZXR1cm4gcmV0ID8gLUVGQVVMVCA6IDA7Ci19Ci0KLS8qIE9u bHkgZGlmZmVyZW5jZSB0byB0aGUgZmFzdC1wYXRoIGZ1bmN0aW9uIGlzIHRoYXQgdGhpcyBjYW4g aGFuZGxlIGJpdDE3Ci0gKiBhbmQgdXNlcyBub24tYXRvbWljIGNvcHkgYW5kIGttYXAgZnVuY3Rp b25zLiAqLwogc3RhdGljIGludAotc2htZW1fcHdyaXRlX3Nsb3coc3RydWN0IHBhZ2UgKnBhZ2Us IGludCBzaG1lbV9wYWdlX29mZnNldCwgaW50IHBhZ2VfbGVuZ3RoLAorc2htZW1fcHdyaXRlX3Ns b3coc3RydWN0IHBhZ2UgKnBhZ2UsIGludCBvZmZzZXQsIGludCBsZW5ndGgsCiAJCSAgY2hhciBf X3VzZXIgKnVzZXJfZGF0YSwKIAkJICBib29sIHBhZ2VfZG9fYml0MTdfc3dpenpsaW5nLAogCQkg IGJvb2wgbmVlZHNfY2xmbHVzaF9iZWZvcmUsCkBAIC0xMzQyLDEyNCArMTI2NCwxMTMgQEAgc2ht ZW1fcHdyaXRlX3Nsb3coc3RydWN0IHBhZ2UgKnBhZ2UsIGludCBzaG1lbV9wYWdlX29mZnNldCwg aW50IHBhZ2VfbGVuZ3RoLAogCiAJdmFkZHIgPSBrbWFwKHBhZ2UpOwogCWlmICh1bmxpa2VseShu ZWVkc19jbGZsdXNoX2JlZm9yZSB8fCBwYWdlX2RvX2JpdDE3X3N3aXp6bGluZykpCi0JCXNobWVt X2NsZmx1c2hfc3dpenpsZWRfcmFuZ2UodmFkZHIgKyBzaG1lbV9wYWdlX29mZnNldCwKLQkJCQkJ ICAgICBwYWdlX2xlbmd0aCwKKwkJc2htZW1fY2xmbHVzaF9zd2l6emxlZF9yYW5nZSh2YWRkciAr IG9mZnNldCwgbGVuZ3RoLAogCQkJCQkgICAgIHBhZ2VfZG9fYml0MTdfc3dpenpsaW5nKTsKIAlp ZiAocGFnZV9kb19iaXQxN19zd2l6emxpbmcpCi0JCXJldCA9IF9fY29weV9mcm9tX3VzZXJfc3dp enpsZWQodmFkZHIsIHNobWVtX3BhZ2Vfb2Zmc2V0LAotCQkJCQkJdXNlcl9kYXRhLAotCQkJCQkJ cGFnZV9sZW5ndGgpOworCQlyZXQgPSBfX2NvcHlfZnJvbV91c2VyX3N3aXp6bGVkKHZhZGRyLCBv ZmZzZXQsIHVzZXJfZGF0YSwKKwkJCQkJCWxlbmd0aCk7CiAJZWxzZQotCQlyZXQgPSBfX2NvcHlf ZnJvbV91c2VyKHZhZGRyICsgc2htZW1fcGFnZV9vZmZzZXQsCi0JCQkJICAgICAgIHVzZXJfZGF0 YSwKLQkJCQkgICAgICAgcGFnZV9sZW5ndGgpOworCQlyZXQgPSBfX2NvcHlfZnJvbV91c2VyKHZh ZGRyICsgb2Zmc2V0LCB1c2VyX2RhdGEsIGxlbmd0aCk7CiAJaWYgKG5lZWRzX2NsZmx1c2hfYWZ0 ZXIpCi0JCXNobWVtX2NsZmx1c2hfc3dpenpsZWRfcmFuZ2UodmFkZHIgKyBzaG1lbV9wYWdlX29m ZnNldCwKLQkJCQkJICAgICBwYWdlX2xlbmd0aCwKKwkJc2htZW1fY2xmbHVzaF9zd2l6emxlZF9y YW5nZSh2YWRkciArIG9mZnNldCwgbGVuZ3RoLAogCQkJCQkgICAgIHBhZ2VfZG9fYml0MTdfc3dp enpsaW5nKTsKIAlrdW5tYXAocGFnZSk7CiAKIAlyZXR1cm4gcmV0ID8gLUVGQVVMVCA6IDA7CiB9 CiAKKy8qIFBlci1wYWdlIGNvcHkgZnVuY3Rpb24gZm9yIHRoZSBzaG1lbSBwd3JpdGUgZmFzdHBh dGguCisgKiBGbHVzaGVzIGludmFsaWQgY2FjaGVsaW5lcyBiZWZvcmUgd3JpdGluZyB0byB0aGUg dGFyZ2V0IGlmCisgKiBuZWVkc19jbGZsdXNoX2JlZm9yZSBpcyBzZXQgYW5kIGZsdXNoZXMgb3V0 IGFueSB3cml0dGVuIGNhY2hlbGluZXMgYWZ0ZXIKKyAqIHdyaXRpbmcgaWYgbmVlZHNfY2xmbHVz aCBpcyBzZXQuCisgKi8KIHN0YXRpYyBpbnQKLWk5MTVfZ2VtX3NobWVtX3B3cml0ZShzdHJ1Y3Qg ZHJtX2RldmljZSAqZGV2LAotCQkgICAgICBzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2Jq LAotCQkgICAgICBzdHJ1Y3QgZHJtX2k5MTVfZ2VtX3B3cml0ZSAqYXJncywKLQkJICAgICAgc3Ry dWN0IGRybV9maWxlICpmaWxlKQorc2htZW1fcHdyaXRlKHN0cnVjdCBwYWdlICpwYWdlLCBpbnQg b2Zmc2V0LCBpbnQgbGVuLCBjaGFyIF9fdXNlciAqdXNlcl9kYXRhLAorCSAgICAgYm9vbCBwYWdl X2RvX2JpdDE3X3N3aXp6bGluZywKKwkgICAgIGJvb2wgbmVlZHNfY2xmbHVzaF9iZWZvcmUsCisJ ICAgICBib29sIG5lZWRzX2NsZmx1c2hfYWZ0ZXIpCiB7Ci0Jc3NpemVfdCByZW1haW47Ci0JbG9m Zl90IG9mZnNldDsKLQljaGFyIF9fdXNlciAqdXNlcl9kYXRhOwotCWludCBzaG1lbV9wYWdlX29m ZnNldCwgcGFnZV9sZW5ndGgsIHJldCA9IDA7Ci0JaW50IG9ial9kb19iaXQxN19zd2l6emxpbmcs IHBhZ2VfZG9fYml0MTdfc3dpenpsaW5nOwotCWludCBoaXRfc2xvd3BhdGggPSAwOworCWludCBy ZXQ7CisKKwlyZXQgPSAtRU5PREVWOworCWlmICghcGFnZV9kb19iaXQxN19zd2l6emxpbmcpIHsK KwkJY2hhciAqdmFkZHIgPSBrbWFwX2F0b21pYyhwYWdlKTsKKworCQlpZiAobmVlZHNfY2xmbHVz aF9iZWZvcmUpCisJCQlkcm1fY2xmbHVzaF92aXJ0X3JhbmdlKHZhZGRyICsgb2Zmc2V0LCBsZW4p OworCQlyZXQgPSBfX2NvcHlfZnJvbV91c2VyX2luYXRvbWljKHZhZGRyICsgb2Zmc2V0LCB1c2Vy X2RhdGEsIGxlbik7CisJCWlmIChuZWVkc19jbGZsdXNoX2FmdGVyKQorCQkJZHJtX2NsZmx1c2hf dmlydF9yYW5nZSh2YWRkciArIG9mZnNldCwgbGVuKTsKKworCQlrdW5tYXBfYXRvbWljKHZhZGRy KTsKKwl9CisJaWYgKHJldCA9PSAwKQorCQlyZXR1cm4gcmV0OworCisJcmV0dXJuIHNobWVtX3B3 cml0ZV9zbG93KHBhZ2UsIG9mZnNldCwgbGVuLCB1c2VyX2RhdGEsCisJCQkJIHBhZ2VfZG9fYml0 MTdfc3dpenpsaW5nLAorCQkJCSBuZWVkc19jbGZsdXNoX2JlZm9yZSwKKwkJCQkgbmVlZHNfY2xm bHVzaF9hZnRlcik7Cit9CisKK3N0YXRpYyBpbnQKK2k5MTVfZ2VtX3NobWVtX3B3cml0ZShzdHJ1 Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqLAorCQkgICAgICBjb25zdCBzdHJ1Y3QgZHJtX2k5 MTVfZ2VtX3B3cml0ZSAqYXJncykKK3sKKwl2b2lkIF9fdXNlciAqdXNlcl9kYXRhOworCXU2NCBy ZW1haW47CisJdW5zaWduZWQgaW50IG9ial9kb19iaXQxN19zd2l6emxpbmc7CisJdW5zaWduZWQg aW50IHBhcnRpYWxfY2FjaGVsaW5lX3dyaXRlOwogCXVuc2lnbmVkIGludCBuZWVkc19jbGZsdXNo OwotCXN0cnVjdCBzZ19wYWdlX2l0ZXIgc2dfaXRlcjsKKwl1bnNpZ25lZCBpbnQgb2Zmc2V0LCBp ZHg7CisJaW50IHJldDsKIAotCXJldCA9IGk5MTVfZ2VtX29ial9wcmVwYXJlX3NobWVtX3dyaXRl KG9iaiwgJm5lZWRzX2NsZmx1c2gpOworCXJldCA9IG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgm b2JqLT5iYXNlLmRldi0+c3RydWN0X211dGV4KTsKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0Owog Ci0Jb2JqX2RvX2JpdDE3X3N3aXp6bGluZyA9IGk5MTVfZ2VtX29iamVjdF9uZWVkc19iaXQxN19z d2l6emxlKG9iaik7Ci0JdXNlcl9kYXRhID0gdTY0X3RvX3VzZXJfcHRyKGFyZ3MtPmRhdGFfcHRy KTsKLQlvZmZzZXQgPSBhcmdzLT5vZmZzZXQ7Ci0JcmVtYWluID0gYXJncy0+c2l6ZTsKKwlyZXQg PSBpOTE1X2dlbV9vYmpfcHJlcGFyZV9zaG1lbV93cml0ZShvYmosICZuZWVkc19jbGZsdXNoKTsK KwltdXRleF91bmxvY2soJm9iai0+YmFzZS5kZXYtPnN0cnVjdF9tdXRleCk7CisJaWYgKHJldCkK KwkJcmV0dXJuIHJldDsKIAotCWZvcl9lYWNoX3NnX3BhZ2Uob2JqLT5tbS5wYWdlcy0+c2dsLCAm c2dfaXRlciwgb2JqLT5tbS5wYWdlcy0+bmVudHMsCi0JCQkgb2Zmc2V0ID4+IFBBR0VfU0hJRlQp IHsKLQkJc3RydWN0IHBhZ2UgKnBhZ2UgPSBzZ19wYWdlX2l0ZXJfcGFnZSgmc2dfaXRlcik7Ci0J CWludCBwYXJ0aWFsX2NhY2hlbGluZV93cml0ZTsKKwlvYmpfZG9fYml0MTdfc3dpenpsaW5nID0g MDsKKwlpZiAoaTkxNV9nZW1fb2JqZWN0X25lZWRzX2JpdDE3X3N3aXp6bGUob2JqKSkKKwkJb2Jq X2RvX2JpdDE3X3N3aXp6bGluZyA9IDEgPDwgMTc7CiAKLQkJaWYgKHJlbWFpbiA8PSAwKQotCQkJ YnJlYWs7CisJLyogSWYgd2UgZG9uJ3Qgb3ZlcndyaXRlIGEgY2FjaGVsaW5lIGNvbXBsZXRlbHkg d2UgbmVlZCB0byBiZQorCSAqIGNhcmVmdWwgdG8gaGF2ZSB1cC10by1kYXRlIGRhdGEgYnkgZmly c3QgY2xmbHVzaGluZy4gRG9uJ3QKKwkgKiBvdmVyY29tcGxpY2F0ZSB0aGluZ3MgYW5kIGZsdXNo IHRoZSBlbnRpcmUgcGF0Y2guCisJICovCisJcGFydGlhbF9jYWNoZWxpbmVfd3JpdGUgPSAwOwor CWlmIChuZWVkc19jbGZsdXNoICYgQ0xGTFVTSF9CRUZPUkUpCisJCXBhcnRpYWxfY2FjaGVsaW5l X3dyaXRlID0gYm9vdF9jcHVfZGF0YS54ODZfY2xmbHVzaF9zaXplIC0gMTsKIAotCQkvKiBPcGVy YXRpb24gaW4gdGhpcyBwYWdlCi0JCSAqCi0JCSAqIHNobWVtX3BhZ2Vfb2Zmc2V0ID0gb2Zmc2V0 IHdpdGhpbiBwYWdlIGluIHNobWVtIGZpbGUKLQkJICogcGFnZV9sZW5ndGggPSBieXRlcyB0byBj b3B5IGZvciB0aGlzIHBhZ2UKLQkJICovCi0JCXNobWVtX3BhZ2Vfb2Zmc2V0ID0gb2Zmc2V0X2lu X3BhZ2Uob2Zmc2V0KTsKLQotCQlwYWdlX2xlbmd0aCA9IHJlbWFpbjsKLQkJaWYgKChzaG1lbV9w YWdlX29mZnNldCArIHBhZ2VfbGVuZ3RoKSA+IFBBR0VfU0laRSkKLQkJCXBhZ2VfbGVuZ3RoID0g UEFHRV9TSVpFIC0gc2htZW1fcGFnZV9vZmZzZXQ7Ci0KLQkJLyogSWYgd2UgZG9uJ3Qgb3Zlcndy aXRlIGEgY2FjaGVsaW5lIGNvbXBsZXRlbHkgd2UgbmVlZCB0byBiZQotCQkgKiBjYXJlZnVsIHRv IGhhdmUgdXAtdG8tZGF0ZSBkYXRhIGJ5IGZpcnN0IGNsZmx1c2hpbmcuIERvbid0Ci0JCSAqIG92 ZXJjb21wbGljYXRlIHRoaW5ncyBhbmQgZmx1c2ggdGhlIGVudGlyZSBwYXRjaC4gKi8KLQkJcGFy dGlhbF9jYWNoZWxpbmVfd3JpdGUgPSBuZWVkc19jbGZsdXNoICYgQ0xGTFVTSF9CRUZPUkUgJiYK LQkJCSgoc2htZW1fcGFnZV9vZmZzZXQgfCBwYWdlX2xlbmd0aCkKLQkJCQkmIChib290X2NwdV9k YXRhLng4Nl9jbGZsdXNoX3NpemUgLSAxKSk7Ci0KLQkJcGFnZV9kb19iaXQxN19zd2l6emxpbmcg PSBvYmpfZG9fYml0MTdfc3dpenpsaW5nICYmCi0JCQkocGFnZV90b19waHlzKHBhZ2UpICYgKDEg PDwgMTcpKSAhPSAwOwotCi0JCXJldCA9IHNobWVtX3B3cml0ZV9mYXN0KHBhZ2UsIHNobWVtX3Bh Z2Vfb2Zmc2V0LCBwYWdlX2xlbmd0aCwKLQkJCQkJdXNlcl9kYXRhLCBwYWdlX2RvX2JpdDE3X3N3 aXp6bGluZywKLQkJCQkJcGFydGlhbF9jYWNoZWxpbmVfd3JpdGUsCi0JCQkJCW5lZWRzX2NsZmx1 c2ggJiBDTEZMVVNIX0FGVEVSKTsKLQkJaWYgKHJldCA9PSAwKQotCQkJZ290byBuZXh0X3BhZ2U7 Ci0KLQkJaGl0X3Nsb3dwYXRoID0gMTsKLQkJbXV0ZXhfdW5sb2NrKCZkZXYtPnN0cnVjdF9tdXRl eCk7Ci0JCXJldCA9IHNobWVtX3B3cml0ZV9zbG93KHBhZ2UsIHNobWVtX3BhZ2Vfb2Zmc2V0LCBw YWdlX2xlbmd0aCwKLQkJCQkJdXNlcl9kYXRhLCBwYWdlX2RvX2JpdDE3X3N3aXp6bGluZywKLQkJ CQkJcGFydGlhbF9jYWNoZWxpbmVfd3JpdGUsCi0JCQkJCW5lZWRzX2NsZmx1c2ggJiBDTEZMVVNI X0FGVEVSKTsKKwl1c2VyX2RhdGEgPSB1NjRfdG9fdXNlcl9wdHIoYXJncy0+ZGF0YV9wdHIpOwor CXJlbWFpbiA9IGFyZ3MtPnNpemU7CisJb2Zmc2V0ID0gb2Zmc2V0X2luX3BhZ2UoYXJncy0+b2Zm c2V0KTsKKwlmb3IgKGlkeCA9IGFyZ3MtPm9mZnNldCA+PiBQQUdFX1NISUZUOyByZW1haW47IGlk eCsrKSB7CisJCXN0cnVjdCBwYWdlICpwYWdlID0gaTkxNV9nZW1fb2JqZWN0X2dldF9wYWdlKG9i aiwgaWR4KTsKKwkJaW50IGxlbmd0aDsKIAotCQltdXRleF9sb2NrKCZkZXYtPnN0cnVjdF9tdXRl eCk7CisJCWxlbmd0aCA9IHJlbWFpbjsKKwkJaWYgKG9mZnNldCArIGxlbmd0aCA+IFBBR0VfU0la RSkKKwkJCWxlbmd0aCA9IFBBR0VfU0laRSAtIG9mZnNldDsKIAorCQlyZXQgPSBzaG1lbV9wd3Jp dGUocGFnZSwgb2Zmc2V0LCBsZW5ndGgsIHVzZXJfZGF0YSwKKwkJCQkgICBwYWdlX3RvX3BoeXMo cGFnZSkgJiBvYmpfZG9fYml0MTdfc3dpenpsaW5nLAorCQkJCSAgIChvZmZzZXQgfCBsZW5ndGgp ICYgcGFydGlhbF9jYWNoZWxpbmVfd3JpdGUsCisJCQkJICAgbmVlZHNfY2xmbHVzaCAmIENMRkxV U0hfQUZURVIpOwogCQlpZiAocmV0KQotCQkJZ290byBvdXQ7Ci0KLW5leHRfcGFnZToKLQkJcmVt YWluIC09IHBhZ2VfbGVuZ3RoOwotCQl1c2VyX2RhdGEgKz0gcGFnZV9sZW5ndGg7Ci0JCW9mZnNl dCArPSBwYWdlX2xlbmd0aDsKLQl9Ci0KLW91dDoKLQlpOTE1X2dlbV9vYmpfZmluaXNoX3NobWVt X2FjY2VzcyhvYmopOworCQkJYnJlYWs7CiAKLQlpZiAoaGl0X3Nsb3dwYXRoKSB7Ci0JCS8qCi0J CSAqIEZpeHVwOiBGbHVzaCBjcHUgY2FjaGVzIGluIGNhc2Ugd2UgZGlkbid0IGZsdXNoIHRoZSBk aXJ0eQotCQkgKiBjYWNoZWxpbmVzIGluLWxpbmUgd2hpbGUgd3JpdGluZyBhbmQgdGhlIG9iamVj dCBtb3ZlZAotCQkgKiBvdXQgb2YgdGhlIGNwdSB3cml0ZSBkb21haW4gd2hpbGUgd2UndmUgZHJv cHBlZCB0aGUgbG9jay4KLQkJICovCi0JCWlmICghKG5lZWRzX2NsZmx1c2ggJiBDTEZMVVNIX0FG VEVSKSAmJgotCQkgICAgb2JqLT5iYXNlLndyaXRlX2RvbWFpbiAhPSBJOTE1X0dFTV9ET01BSU5f Q1BVKSB7Ci0JCQlpZiAoaTkxNV9nZW1fY2xmbHVzaF9vYmplY3Qob2JqLCBvYmotPnBpbl9kaXNw bGF5KSkKLQkJCQluZWVkc19jbGZsdXNoIHw9IENMRkxVU0hfQUZURVI7Ci0JCX0KKwkJcmVtYWlu IC09IGxlbmd0aDsKKwkJdXNlcl9kYXRhICs9IGxlbmd0aDsKKwkJb2Zmc2V0ID0gMDsKIAl9CiAK LQlpZiAobmVlZHNfY2xmbHVzaCAmIENMRkxVU0hfQUZURVIpCi0JCWk5MTVfZ2VtX2NoaXBzZXRf Zmx1c2godG9faTkxNShkZXYpKTsKLQogCWludGVsX2ZiX29ial9mbHVzaChvYmosIGZhbHNlLCBP UklHSU5fQ1BVKTsKKwlpOTE1X2dlbV9vYmpfZmluaXNoX3NobWVtX2FjY2VzcyhvYmopOwogCXJl dHVybiByZXQ7CiB9CiAKQEAgLTE0NzUsNyArMTM4Niw2IEBAIGludAogaTkxNV9nZW1fcHdyaXRl X2lvY3RsKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEsCiAJCSAgICAgIHN0cnVj dCBkcm1fZmlsZSAqZmlsZSkKIHsKLQlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYg PSB0b19pOTE1KGRldik7CiAJc3RydWN0IGRybV9pOTE1X2dlbV9wd3JpdGUgKmFyZ3MgPSBkYXRh OwogCXN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmo7CiAJaW50IHJldDsKQEAgLTE0ODgs MTMgKzEzOTgsNiBAQCBpOTE1X2dlbV9wd3JpdGVfaW9jdGwoc3RydWN0IGRybV9kZXZpY2UgKmRl diwgdm9pZCAqZGF0YSwKIAkJICAgICAgIGFyZ3MtPnNpemUpKQogCQlyZXR1cm4gLUVGQVVMVDsK IAotCWlmIChsaWtlbHkoIWk5MTUucHJlZmF1bHRfZGlzYWJsZSkpIHsKLQkJcmV0ID0gZmF1bHRf aW5fbXVsdGlwYWdlc19yZWFkYWJsZSh1NjRfdG9fdXNlcl9wdHIoYXJncy0+ZGF0YV9wdHIpLAot CQkJCQkJICAgYXJncy0+c2l6ZSk7Ci0JCWlmIChyZXQpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQl9 Ci0KIAlvYmogPSBpOTE1X2dlbV9vYmplY3RfbG9va3VwKGZpbGUsIGFyZ3MtPmhhbmRsZSk7CiAJ aWYgKCFvYmopCiAJCXJldHVybiAtRU5PRU5UOwpAQCAtMTUxNiwxMSArMTQxOSw5IEBAIGk5MTVf Z2VtX3B3cml0ZV9pb2N0bChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB2b2lkICpkYXRhLAogCWlm IChyZXQpCiAJCWdvdG8gZXJyOwogCi0JaW50ZWxfcnVudGltZV9wbV9nZXQoZGV2X3ByaXYpOwot Ci0JcmV0ID0gaTkxNV9tdXRleF9sb2NrX2ludGVycnVwdGlibGUoZGV2KTsKKwlyZXQgPSBpOTE1 X2dlbV9vYmplY3RfcGluX3BhZ2VzKG9iaik7CiAJaWYgKHJldCkKLQkJZ290byBlcnJfcnBtOwor CQlnb3RvIGVycjsKIAogCXJldCA9IC1FRkFVTFQ7CiAJLyogV2UgY2FuIG9ubHkgZG8gdGhlIEdU VCBwd3JpdGUgb24gdW50aWxlZCBidWZmZXJzLCBhcyBvdGhlcndpc2UKQEAgLTE1MzEsNyArMTQz Miw3IEBAIGk5MTVfZ2VtX3B3cml0ZV9pb2N0bChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB2b2lk ICpkYXRhLAogCSAqLwogCWlmICghaTkxNV9nZW1fb2JqZWN0X2hhc19zdHJ1Y3RfcGFnZShvYmop IHx8CiAJICAgIGNwdV93cml0ZV9uZWVkc19jbGZsdXNoKG9iaikpIHsKLQkJcmV0ID0gaTkxNV9n ZW1fZ3R0X3B3cml0ZV9mYXN0KGRldl9wcml2LCBvYmosIGFyZ3MsIGZpbGUpOworCQlyZXQgPSBp OTE1X2dlbV9ndHRfcHdyaXRlX2Zhc3Qob2JqLCBhcmdzKTsKIAkJLyogTm90ZSB0aGF0IHRoZSBn dHQgcGF0aHMgbWlnaHQgZmFpbCB3aXRoIG5vbi1wYWdlLWJhY2tlZCB1c2VyCiAJCSAqIHBvaW50 ZXJzIChlLmcuIGd0dCBtYXBwaW5ncyB3aGVuIG1vdmluZyBkYXRhIGJldHdlZW4KIAkJICogdGV4 dHVyZXMpLiBGYWxsYmFjayB0byB0aGUgc2htZW0gcGF0aCBpbiB0aGF0IGNhc2UuICovCkBAIC0x NTQxLDE3ICsxNDQyLDEwIEBAIGk5MTVfZ2VtX3B3cml0ZV9pb2N0bChzdHJ1Y3QgZHJtX2Rldmlj ZSAqZGV2LCB2b2lkICpkYXRhLAogCQlpZiAob2JqLT5waHlzX2hhbmRsZSkKIAkJCXJldCA9IGk5 MTVfZ2VtX3BoeXNfcHdyaXRlKG9iaiwgYXJncywgZmlsZSk7CiAJCWVsc2UKLQkJCXJldCA9IGk5 MTVfZ2VtX3NobWVtX3B3cml0ZShkZXYsIG9iaiwgYXJncywgZmlsZSk7CisJCQlyZXQgPSBpOTE1 X2dlbV9zaG1lbV9wd3JpdGUob2JqLCBhcmdzKTsKIAl9CiAKLQlpOTE1X2dlbV9vYmplY3RfcHV0 KG9iaik7Ci0JbXV0ZXhfdW5sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7Ci0JaW50ZWxfcnVudGlt ZV9wbV9wdXQoZGV2X3ByaXYpOwotCi0JcmV0dXJuIHJldDsKLQotZXJyX3JwbToKLQlpbnRlbF9y dW50aW1lX3BtX3B1dChkZXZfcHJpdik7CisJaTkxNV9nZW1fb2JqZWN0X3VucGluX3BhZ2VzKG9i aik7CiBlcnI6CiAJaTkxNV9nZW1fb2JqZWN0X3B1dF91bmxvY2tlZChvYmopOwogCXJldHVybiBy ZXQ7Ci0tIAoyLjkuMwoKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX18KSW50ZWwtZ2Z4IG1haWxpbmcgbGlzdApJbnRlbC1nZnhAbGlzdHMuZnJlZWRlc2t0b3Au b3JnCmh0dHBzOi8vbGlzdHMuZnJlZWRlc2t0b3Aub3JnL21haWxtYW4vbGlzdGluZm8vaW50ZWwt Z2Z4Cg==