From mboxrd@z Thu Jan 1 00:00:00 1970 From: Chris Wilson Subject: [PATCH 5/5] drm/i915/execlists: Flush pending preemption events during reset Date: Tue, 20 Mar 2018 00:18:48 +0000 Message-ID: <20180320001848.4405-5-chris@chris-wilson.co.uk> References: <20180320001848.4405-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 fireflyinternet.com (mail.fireflyinternet.com [109.228.58.192]) by gabe.freedesktop.org (Postfix) with ESMTPS id 858596E669 for ; Tue, 20 Mar 2018 00:19:08 +0000 (UTC) In-Reply-To: <20180320001848.4405-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 Q2F0Y2ggdXAgd2l0aCB0aGUgaW5mbGlnaHQgQ1NCIGV2ZW50cywgYWZ0ZXIgZGlzYWJsaW5nIHRo ZSB0YXNrbGV0CmJlZm9yZSBkZWNpZGluZyB3aGljaCByZXF1ZXN0IHdhcyB0cnVseSBndWlsdHkg b2YgaGFuZ2luZyB0aGUgR1BVLgoKU2lnbmVkLW9mZi1ieTogQ2hyaXMgV2lsc29uIDxjaHJpc0Bj aHJpcy13aWxzb24uY28udWs+CkNjOiBNaWNoYcWCIFdpbmlhcnNraSA8bWljaGFsLndpbmlhcnNr aUBpbnRlbC5jb20+CkNDOiBNaWNoZWwgVGhpZXJyeSA8bWljaGVsLnRoaWVycnlAaW50ZWwuY29t PgpDYzogSmVmZiBNY0dlZSA8amVmZi5tY2dlZUBpbnRlbC5jb20+Ci0tLQogZHJpdmVycy9ncHUv ZHJtL2k5MTUvaW50ZWxfbHJjLmMgfCAzNTUgKysrKysrKysrKysrKysrKysrKysrKy0tLS0tLS0t LS0tLS0tLS0tCiAxIGZpbGUgY2hhbmdlZCwgMTk3IGluc2VydGlvbnMoKyksIDE1OCBkZWxldGlv bnMoLSkKCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9scmMuYyBiL2Ry aXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2xyYy5jCmluZGV4IGU1YTNmZmJjMjczYS4uYmViODFm MTNhM2NjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9scmMuYworKysg Yi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9scmMuYwpAQCAtODI4LDE4NiArODI4LDE5MiBA QCBzdGF0aWMgdm9pZCBleGVjbGlzdHNfY2FuY2VsX3JlcXVlc3RzKHN0cnVjdCBpbnRlbF9lbmdp bmVfY3MgKmVuZ2luZSkKIAlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CiB9CiAKLS8qCi0gKiBD aGVjayB0aGUgdW5yZWFkIENvbnRleHQgU3RhdHVzIEJ1ZmZlcnMgYW5kIG1hbmFnZSB0aGUgc3Vi bWlzc2lvbiBvZiBuZXcKLSAqIGNvbnRleHRzIHRvIHRoZSBFTFNQIGFjY29yZGluZ2x5LgotICov Ci1zdGF0aWMgdm9pZCBleGVjbGlzdHNfc3VibWlzc2lvbl90YXNrbGV0KHVuc2lnbmVkIGxvbmcg ZGF0YSkKK3N0YXRpYyB2b2lkIHByb2Nlc3NfY3NiKHN0cnVjdCBpbnRlbF9lbmdpbmVfY3MgKmVu Z2luZSkKIHsKLQlzdHJ1Y3QgaW50ZWxfZW5naW5lX2NzICogY29uc3QgZW5naW5lID0gKHN0cnVj dCBpbnRlbF9lbmdpbmVfY3MgKilkYXRhOwogCXN0cnVjdCBpbnRlbF9lbmdpbmVfZXhlY2xpc3Rz ICogY29uc3QgZXhlY2xpc3RzID0gJmVuZ2luZS0+ZXhlY2xpc3RzOwogCXN0cnVjdCBleGVjbGlz dF9wb3J0ICogY29uc3QgcG9ydCA9IGV4ZWNsaXN0cy0+cG9ydDsKLQlzdHJ1Y3QgZHJtX2k5MTVf cHJpdmF0ZSAqZGV2X3ByaXYgPSBlbmdpbmUtPmk5MTU7CisJc3RydWN0IGRybV9pOTE1X3ByaXZh dGUgKmk5MTUgPSBlbmdpbmUtPmk5MTU7CisJdW5zaWduZWQgaW50IGhlYWQsIHRhaWw7CisJY29u c3QgdTMyICpidWY7CiAJYm9vbCBmdyA9IGZhbHNlOwogCi0JLyogV2UgY2FuIHNraXAgYWNxdWly aW5nIGludGVsX3J1bnRpbWVfcG1fZ2V0KCkgaGVyZSBhcyBpdCB3YXMgdGFrZW4KLQkgKiBvbiBv dXIgYmVoYWxmIGJ5IHRoZSByZXF1ZXN0IChzZWUgaTkxNV9nZW1fbWFya19idXN5KCkpIGFuZCBp dCB3aWxsCi0JICogbm90IGJlIHJlbGlucXVpc2hlZCB1bnRpbCB0aGUgZGV2aWNlIGlzIGlkbGUg KHNlZQotCSAqIGk5MTVfZ2VtX2lkbGVfd29ya19oYW5kbGVyKCkpLiBBcyBhIHByZWNhdXRpb24s IHdlIG1ha2Ugc3VyZQotCSAqIHRoYXQgYWxsIEVMU1AgYXJlIGRyYWluZWQgaS5lLiB3ZSBoYXZl IHByb2Nlc3NlZCB0aGUgQ1NCLAotCSAqIGJlZm9yZSBhbGxvd2luZyBvdXJzZWx2ZXMgdG8gaWRs ZSBhbmQgY2FsbGluZyBpbnRlbF9ydW50aW1lX3BtX3B1dCgpLgotCSAqLwotCUdFTV9CVUdfT04o IWRldl9wcml2LT5ndC5hd2FrZSk7CisJaWYgKHVubGlrZWx5KGV4ZWNsaXN0cy0+Y3NiX3VzZV9t bWlvKSkgeworCQlidWYgPSAodTMyICogX19mb3JjZSkKKwkJCShpOTE1LT5yZWdzICsgaTkxNV9t bWlvX3JlZ19vZmZzZXQoUklOR19DT05URVhUX1NUQVRVU19CVUZfTE8oZW5naW5lLCAwKSkpOwor CQlleGVjbGlzdHMtPmNzYl9oZWFkID0gLTE7IC8qIGZvcmNlIG1taW8gcmVhZCBvZiBDU0IgcHRy cyAqLworCX0gZWxzZSB7CisJCS8qIFRoZSBIV1NQIGNvbnRhaW5zIGEgKGNhY2hlYWJsZSkgbWly cm9yIG9mIHRoZSBDU0IgKi8KKwkJYnVmID0gJmVuZ2luZS0+c3RhdHVzX3BhZ2UucGFnZV9hZGRy W0k5MTVfSFdTX0NTQl9CVUYwX0lOREVYXTsKKwl9CiAKLQkvKiBQcmVmZXIgZG9pbmcgdGVzdF9h bmRfY2xlYXJfYml0KCkgYXMgYSB0d28gc3RhZ2Ugb3BlcmF0aW9uIHRvIGF2b2lkCi0JICogaW1w b3NpbmcgdGhlIGNvc3Qgb2YgYSBsb2NrZWQgYXRvbWljIHRyYW5zYWN0aW9uIHdoZW4gc3VibWl0 dGluZyBhCi0JICogbmV3IHJlcXVlc3QgKG91dHNpZGUgb2YgdGhlIGNvbnRleHQtc3dpdGNoIGlu dGVycnVwdCkuCisJLyoKKwkgKiBUaGUgd3JpdGUgd2lsbCBiZSBvcmRlcmVkIGJ5IHRoZSB1bmNh Y2hlZCByZWFkIChpdHNlbGYKKwkgKiBhIG1lbW9yeSBiYXJyaWVyKSwgc28gd2UgZG8gbm90IG5l ZWQgYW5vdGhlciBpbiB0aGUgZm9ybQorCSAqIG9mIGEgbG9ja2VkIGluc3RydWN0aW9uLiBUaGUg cmFjZSBiZXR3ZWVuIHRoZSBpbnRlcnJ1cHQKKwkgKiBoYW5kbGVyIGFuZCB0aGUgc3BsaXQgdGVz dC9jbGVhciBpcyBoYXJtbGVzcyBhcyB3ZSBvcmRlcgorCSAqIG91ciBjbGVhciBiZWZvcmUgdGhl IENTQiByZWFkLiBJZiB0aGUgaW50ZXJydXB0IGFycml2ZWQKKwkgKiBmaXJzdCBiZXR3ZWVuIHRo ZSB0ZXN0IGFuZCB0aGUgY2xlYXIsIHdlIHJlYWQgdGhlIHVwZGF0ZWQKKwkgKiBDU0IgYW5kIGNs ZWFyIHRoZSBiaXQuIElmIHRoZSBpbnRlcnJ1cHQgYXJyaXZlcyBhcyB3ZSByZWFkCisJICogdGhl IENTQiBvciBsYXRlciAoaS5lLiBhZnRlciB3ZSBoYWQgY2xlYXJlZCB0aGUgYml0KSB0aGUgYml0 CisJICogaXMgc2V0IGFuZCB3ZSBkbyBhIG5ldyBsb29wLgogCSAqLwotCXdoaWxlICh0ZXN0X2Jp dChFTkdJTkVfSVJRX0VYRUNMSVNULCAmZW5naW5lLT5pcnFfcG9zdGVkKSkgewotCQkvKiBUaGUg SFdTUCBjb250YWlucyBhIChjYWNoZWFibGUpIG1pcnJvciBvZiB0aGUgQ1NCICovCi0JCWNvbnN0 IHUzMiAqYnVmID0KLQkJCSZlbmdpbmUtPnN0YXR1c19wYWdlLnBhZ2VfYWRkcltJOTE1X0hXU19D U0JfQlVGMF9JTkRFWF07Ci0JCXVuc2lnbmVkIGludCBoZWFkLCB0YWlsOwotCi0JCWlmICh1bmxp a2VseShleGVjbGlzdHMtPmNzYl91c2VfbW1pbykpIHsKLQkJCWJ1ZiA9ICh1MzIgKiBfX2ZvcmNl KQotCQkJCShkZXZfcHJpdi0+cmVncyArIGk5MTVfbW1pb19yZWdfb2Zmc2V0KFJJTkdfQ09OVEVY VF9TVEFUVVNfQlVGX0xPKGVuZ2luZSwgMCkpKTsKLQkJCWV4ZWNsaXN0cy0+Y3NiX2hlYWQgPSAt MTsgLyogZm9yY2UgbW1pbyByZWFkIG9mIENTQiBwdHJzICovCi0JCX0KKwlfX2NsZWFyX2JpdChF TkdJTkVfSVJRX0VYRUNMSVNULCAmZW5naW5lLT5pcnFfcG9zdGVkKTsKKwlpZiAodW5saWtlbHko ZXhlY2xpc3RzLT5jc2JfaGVhZCA9PSAtMSkpIHsgLyogZm9sbG93aW5nIGEgcmVzZXQgKi8KKwkJ aW50ZWxfdW5jb3JlX2ZvcmNld2FrZV9nZXQoaTkxNSwgZXhlY2xpc3RzLT5md19kb21haW5zKTsK KwkJZncgPSB0cnVlOworCisJCWhlYWQgPSByZWFkbChpOTE1LT5yZWdzICsgaTkxNV9tbWlvX3Jl Z19vZmZzZXQoUklOR19DT05URVhUX1NUQVRVU19QVFIoZW5naW5lKSkpOworCQl0YWlsID0gR0VO OF9DU0JfV1JJVEVfUFRSKGhlYWQpOworCQloZWFkID0gR0VOOF9DU0JfUkVBRF9QVFIoaGVhZCk7 CisJCWV4ZWNsaXN0cy0+Y3NiX2hlYWQgPSBoZWFkOworCX0gZWxzZSB7CisJCWNvbnN0IGludCB3 cml0ZV9pZHggPQorCQkJaW50ZWxfaHdzX2NzYl93cml0ZV9pbmRleChpOTE1KSAtCisJCQlJOTE1 X0hXU19DU0JfQlVGMF9JTkRFWDsKKworCQloZWFkID0gZXhlY2xpc3RzLT5jc2JfaGVhZDsKKwkJ dGFpbCA9IFJFQURfT05DRShidWZbd3JpdGVfaWR4XSk7CisJfQorCUdFTV9UUkFDRSgiJXMgY3Mt aXJxIGhlYWQ9JWQgWyVkJXNdLCB0YWlsPSVkIFslZCVzXVxuIiwKKwkJICBlbmdpbmUtPm5hbWUs CisJCSAgaGVhZCwgR0VOOF9DU0JfUkVBRF9QVFIocmVhZGwoaTkxNS0+cmVncyArIGk5MTVfbW1p b19yZWdfb2Zmc2V0KFJJTkdfQ09OVEVYVF9TVEFUVVNfUFRSKGVuZ2luZSkpKSksIGZ3ID8gIiIg OiAiPyIsCisJCSAgdGFpbCwgR0VOOF9DU0JfV1JJVEVfUFRSKHJlYWRsKGk5MTUtPnJlZ3MgKyBp OTE1X21taW9fcmVnX29mZnNldChSSU5HX0NPTlRFWFRfU1RBVFVTX1BUUihlbmdpbmUpKSkpLCBm dyA/ICIiIDogIj8iKTsKKworCXdoaWxlIChoZWFkICE9IHRhaWwpIHsKKwkJc3RydWN0IGk5MTVf cmVxdWVzdCAqcnE7CisJCXVuc2lnbmVkIGludCBzdGF0dXM7CisJCXVuc2lnbmVkIGludCBjb3Vu dDsKKworCQlpZiAoKytoZWFkID09IEdFTjhfQ1NCX0VOVFJJRVMpCisJCQloZWFkID0gMDsKIAot CQkvKiBUaGUgd3JpdGUgd2lsbCBiZSBvcmRlcmVkIGJ5IHRoZSB1bmNhY2hlZCByZWFkIChpdHNl bGYKLQkJICogYSBtZW1vcnkgYmFycmllciksIHNvIHdlIGRvIG5vdCBuZWVkIGFub3RoZXIgaW4g dGhlIGZvcm0KLQkJICogb2YgYSBsb2NrZWQgaW5zdHJ1Y3Rpb24uIFRoZSByYWNlIGJldHdlZW4g dGhlIGludGVycnVwdAotCQkgKiBoYW5kbGVyIGFuZCB0aGUgc3BsaXQgdGVzdC9jbGVhciBpcyBo YXJtbGVzcyBhcyB3ZSBvcmRlcgotCQkgKiBvdXIgY2xlYXIgYmVmb3JlIHRoZSBDU0IgcmVhZC4g SWYgdGhlIGludGVycnVwdCBhcnJpdmVkCi0JCSAqIGZpcnN0IGJldHdlZW4gdGhlIHRlc3QgYW5k IHRoZSBjbGVhciwgd2UgcmVhZCB0aGUgdXBkYXRlZAotCQkgKiBDU0IgYW5kIGNsZWFyIHRoZSBi aXQuIElmIHRoZSBpbnRlcnJ1cHQgYXJyaXZlcyBhcyB3ZSByZWFkCi0JCSAqIHRoZSBDU0Igb3Ig bGF0ZXIgKGkuZS4gYWZ0ZXIgd2UgaGFkIGNsZWFyZWQgdGhlIGJpdCkgdGhlIGJpdAotCQkgKiBp cyBzZXQgYW5kIHdlIGRvIGEgbmV3IGxvb3AuCisJCS8qCisJCSAqIFdlIGFyZSBmbHlpbmcgbmVh ciBkcmFnb25zIGFnYWluLgorCQkgKgorCQkgKiBXZSBob2xkIGEgcmVmZXJlbmNlIHRvIHRoZSBy ZXF1ZXN0IGluIGV4ZWNsaXN0X3BvcnRbXQorCQkgKiBidXQgbm8gbW9yZSB0aGFuIHRoYXQuIFdl IGFyZSBvcGVyYXRpbmcgaW4gc29mdGlycQorCQkgKiBjb250ZXh0IGFuZCBzbyBjYW5ub3QgaG9s ZCBhbnkgbXV0ZXggb3Igc2xlZXAuIFRoYXQKKwkJICogcHJldmVudHMgdXMgc3RvcHBpbmcgdGhl IHJlcXVlc3RzIHdlIGFyZSBwcm9jZXNzaW5nCisJCSAqIGluIHBvcnRbXSBmcm9tIGJlaW5nIHJl dGlyZWQgc2ltdWx0YW5lb3VzbHkgKHRoZQorCQkgKiBicmVhZGNydW1iIHdpbGwgYmUgY29tcGxl dGUgYmVmb3JlIHdlIHNlZSB0aGUKKwkJICogY29udGV4dC1zd2l0Y2gpLiBBcyB3ZSBvbmx5IGhv bGQgdGhlIHJlZmVyZW5jZSB0byB0aGUKKwkJICogcmVxdWVzdCwgYW55IHBvaW50ZXIgY2hhc2lu ZyB1bmRlcm5lYXRoIHRoZSByZXF1ZXN0CisJCSAqIGlzIHN1YmplY3QgdG8gYSBwb3RlbnRpYWwg dXNlLWFmdGVyLWZyZWUuIFRodXMgd2UKKwkJICogc3RvcmUgYWxsIG9mIHRoZSBib29ra2VlcGlu ZyB3aXRoaW4gcG9ydFtdIGFzCisJCSAqIHJlcXVpcmVkLCBhbmQgYXZvaWQgdXNpbmcgdW5ndWFy ZGVkIHBvaW50ZXJzIGJlbmVhdGgKKwkJICogcmVxdWVzdCBpdHNlbGYuIFRoZSBzYW1lIGFwcGxp ZXMgdG8gdGhlIGF0b21pYworCQkgKiBzdGF0dXMgbm90aWZpZXIuCiAJCSAqLwotCQlfX2NsZWFy X2JpdChFTkdJTkVfSVJRX0VYRUNMSVNULCAmZW5naW5lLT5pcnFfcG9zdGVkKTsKLQkJaWYgKHVu bGlrZWx5KGV4ZWNsaXN0cy0+Y3NiX2hlYWQgPT0gLTEpKSB7IC8qIGZvbGxvd2luZyBhIHJlc2V0 ICovCi0JCQlpZiAoIWZ3KSB7Ci0JCQkJaW50ZWxfdW5jb3JlX2ZvcmNld2FrZV9nZXQoZGV2X3By aXYsCi0JCQkJCQkJICAgZXhlY2xpc3RzLT5md19kb21haW5zKTsKLQkJCQlmdyA9IHRydWU7Ci0J CQl9CiAKLQkJCWhlYWQgPSByZWFkbChkZXZfcHJpdi0+cmVncyArIGk5MTVfbW1pb19yZWdfb2Zm c2V0KFJJTkdfQ09OVEVYVF9TVEFUVVNfUFRSKGVuZ2luZSkpKTsKLQkJCXRhaWwgPSBHRU44X0NT Ql9XUklURV9QVFIoaGVhZCk7Ci0JCQloZWFkID0gR0VOOF9DU0JfUkVBRF9QVFIoaGVhZCk7Ci0J CQlleGVjbGlzdHMtPmNzYl9oZWFkID0gaGVhZDsKLQkJfSBlbHNlIHsKLQkJCWNvbnN0IGludCB3 cml0ZV9pZHggPQotCQkJCWludGVsX2h3c19jc2Jfd3JpdGVfaW5kZXgoZGV2X3ByaXYpIC0KLQkJ CQlJOTE1X0hXU19DU0JfQlVGMF9JTkRFWDsKKwkJc3RhdHVzID0gUkVBRF9PTkNFKGJ1ZlsyICog aGVhZF0pOyAvKiBtYXliZSBtbWlvISAqLworCQlHRU1fVFJBQ0UoIiVzIGNzYlslZF06IHN0YXR1 cz0weCUwOHg6MHglMDh4LCBhY3RpdmU9MHgleFxuIiwKKwkJCSAgZW5naW5lLT5uYW1lLCBoZWFk LAorCQkJICBzdGF0dXMsIGJ1ZlsyKmhlYWQgKyAxXSwKKwkJCSAgZXhlY2xpc3RzLT5hY3RpdmUp OworCisJCWlmIChzdGF0dXMgJiAoR0VOOF9DVFhfU1RBVFVTX0lETEVfQUNUSVZFIHwKKwkJCSAg ICAgIEdFTjhfQ1RYX1NUQVRVU19QUkVFTVBURUQpKQorCQkJZXhlY2xpc3RzX3NldF9hY3RpdmUo ZXhlY2xpc3RzLAorCQkJCQkgICAgIEVYRUNMSVNUU19BQ1RJVkVfSFdBQ0spOworCQlpZiAoc3Rh dHVzICYgR0VOOF9DVFhfU1RBVFVTX0FDVElWRV9JRExFKQorCQkJZXhlY2xpc3RzX2NsZWFyX2Fj dGl2ZShleGVjbGlzdHMsCisJCQkJCSAgICAgICBFWEVDTElTVFNfQUNUSVZFX0hXQUNLKTsKKwor CQlpZiAoIShzdGF0dXMgJiBHRU44X0NUWF9TVEFUVVNfQ09NUExFVEVEX01BU0spKQorCQkJY29u dGludWU7CiAKLQkJCWhlYWQgPSBleGVjbGlzdHMtPmNzYl9oZWFkOwotCQkJdGFpbCA9IFJFQURf T05DRShidWZbd3JpdGVfaWR4XSk7Ci0JCX0KLQkJR0VNX1RSQUNFKCIlcyBjcy1pcnEgaGVhZD0l ZCBbJWQlc10sIHRhaWw9JWQgWyVkJXNdXG4iLAotCQkJICBlbmdpbmUtPm5hbWUsCi0JCQkgIGhl YWQsIEdFTjhfQ1NCX1JFQURfUFRSKHJlYWRsKGRldl9wcml2LT5yZWdzICsgaTkxNV9tbWlvX3Jl Z19vZmZzZXQoUklOR19DT05URVhUX1NUQVRVU19QVFIoZW5naW5lKSkpKSwgZncgPyAiIiA6ICI/ IiwKLQkJCSAgdGFpbCwgR0VOOF9DU0JfV1JJVEVfUFRSKHJlYWRsKGRldl9wcml2LT5yZWdzICsg aTkxNV9tbWlvX3JlZ19vZmZzZXQoUklOR19DT05URVhUX1NUQVRVU19QVFIoZW5naW5lKSkpKSwg ZncgPyAiIiA6ICI/Iik7CisJCS8qIFdlIHNob3VsZCBuZXZlciBnZXQgYSBDT01QTEVURUQgfCBJ RExFX0FDVElWRSEgKi8KKwkJR0VNX0JVR19PTihzdGF0dXMgJiBHRU44X0NUWF9TVEFUVVNfSURM RV9BQ1RJVkUpOwogCi0JCXdoaWxlIChoZWFkICE9IHRhaWwpIHsKLQkJCXN0cnVjdCBpOTE1X3Jl cXVlc3QgKnJxOwotCQkJdW5zaWduZWQgaW50IHN0YXR1czsKLQkJCXVuc2lnbmVkIGludCBjb3Vu dDsKKwkJaWYgKHN0YXR1cyAmIEdFTjhfQ1RYX1NUQVRVU19DT01QTEVURSAmJgorCQkgICAgYnVm WzIqaGVhZCArIDFdID09IGV4ZWNsaXN0cy0+cHJlZW1wdF9jb21wbGV0ZV9zdGF0dXMpIHsKKwkJ CUdFTV9UUkFDRSgiJXMgcHJlZW1wdC1pZGxlXG4iLCBlbmdpbmUtPm5hbWUpOworCQkJY29tcGxl dGVfcHJlZW1wdF9jb250ZXh0KGV4ZWNsaXN0cyk7CisJCQljb250aW51ZTsKKwkJfQogCi0JCQlp ZiAoKytoZWFkID09IEdFTjhfQ1NCX0VOVFJJRVMpCi0JCQkJaGVhZCA9IDA7CisJCWlmIChzdGF0 dXMgJiBHRU44X0NUWF9TVEFUVVNfUFJFRU1QVEVEICYmCisJCSAgICBleGVjbGlzdHNfaXNfYWN0 aXZlKGV4ZWNsaXN0cywKKwkJCQkJRVhFQ0xJU1RTX0FDVElWRV9QUkVFTVBUKSkKKwkJCWNvbnRp bnVlOwogCi0JCQkvKiBXZSBhcmUgZmx5aW5nIG5lYXIgZHJhZ29ucyBhZ2Fpbi4KLQkJCSAqCi0J CQkgKiBXZSBob2xkIGEgcmVmZXJlbmNlIHRvIHRoZSByZXF1ZXN0IGluIGV4ZWNsaXN0X3BvcnRb XQotCQkJICogYnV0IG5vIG1vcmUgdGhhbiB0aGF0LiBXZSBhcmUgb3BlcmF0aW5nIGluIHNvZnRp cnEKLQkJCSAqIGNvbnRleHQgYW5kIHNvIGNhbm5vdCBob2xkIGFueSBtdXRleCBvciBzbGVlcC4g VGhhdAotCQkJICogcHJldmVudHMgdXMgc3RvcHBpbmcgdGhlIHJlcXVlc3RzIHdlIGFyZSBwcm9j ZXNzaW5nCi0JCQkgKiBpbiBwb3J0W10gZnJvbSBiZWluZyByZXRpcmVkIHNpbXVsdGFuZW91c2x5 ICh0aGUKLQkJCSAqIGJyZWFkY3J1bWIgd2lsbCBiZSBjb21wbGV0ZSBiZWZvcmUgd2Ugc2VlIHRo ZQotCQkJICogY29udGV4dC1zd2l0Y2gpLiBBcyB3ZSBvbmx5IGhvbGQgdGhlIHJlZmVyZW5jZSB0 byB0aGUKLQkJCSAqIHJlcXVlc3QsIGFueSBwb2ludGVyIGNoYXNpbmcgdW5kZXJuZWF0aCB0aGUg cmVxdWVzdAotCQkJICogaXMgc3ViamVjdCB0byBhIHBvdGVudGlhbCB1c2UtYWZ0ZXItZnJlZS4g VGh1cyB3ZQotCQkJICogc3RvcmUgYWxsIG9mIHRoZSBib29ra2VlcGluZyB3aXRoaW4gcG9ydFtd IGFzCi0JCQkgKiByZXF1aXJlZCwgYW5kIGF2b2lkIHVzaW5nIHVuZ3VhcmRlZCBwb2ludGVycyBi ZW5lYXRoCi0JCQkgKiByZXF1ZXN0IGl0c2VsZi4gVGhlIHNhbWUgYXBwbGllcyB0byB0aGUgYXRv bWljCi0JCQkgKiBzdGF0dXMgbm90aWZpZXIuCi0JCQkgKi8KKwkJR0VNX0JVR19PTighZXhlY2xp c3RzX2lzX2FjdGl2ZShleGVjbGlzdHMsCisJCQkJCQlFWEVDTElTVFNfQUNUSVZFX1VTRVIpKTsK IAotCQkJc3RhdHVzID0gUkVBRF9PTkNFKGJ1ZlsyICogaGVhZF0pOyAvKiBtYXliZSBtbWlvISAq LwotCQkJR0VNX1RSQUNFKCIlcyBjc2JbJWRdOiBzdGF0dXM9MHglMDh4OjB4JTA4eCwgYWN0aXZl PTB4JXhcbiIsCi0JCQkJICBlbmdpbmUtPm5hbWUsIGhlYWQsCi0JCQkJICBzdGF0dXMsIGJ1Zlsy KmhlYWQgKyAxXSwKLQkJCQkgIGV4ZWNsaXN0cy0+YWN0aXZlKTsKLQotCQkJaWYgKHN0YXR1cyAm IChHRU44X0NUWF9TVEFUVVNfSURMRV9BQ1RJVkUgfAotCQkJCSAgICAgIEdFTjhfQ1RYX1NUQVRV U19QUkVFTVBURUQpKQotCQkJCWV4ZWNsaXN0c19zZXRfYWN0aXZlKGV4ZWNsaXN0cywKLQkJCQkJ CSAgICAgRVhFQ0xJU1RTX0FDVElWRV9IV0FDSyk7Ci0JCQlpZiAoc3RhdHVzICYgR0VOOF9DVFhf U1RBVFVTX0FDVElWRV9JRExFKQotCQkJCWV4ZWNsaXN0c19jbGVhcl9hY3RpdmUoZXhlY2xpc3Rz LAotCQkJCQkJICAgICAgIEVYRUNMSVNUU19BQ1RJVkVfSFdBQ0spOwotCi0JCQlpZiAoIShzdGF0 dXMgJiBHRU44X0NUWF9TVEFUVVNfQ09NUExFVEVEX01BU0spKQotCQkJCWNvbnRpbnVlOworCQly cSA9IHBvcnRfdW5wYWNrKHBvcnQsICZjb3VudCk7CisJCUdFTV9UUkFDRSgiJXMgb3V0WzBdOiBj dHg9JWQuJWQsIHNlcW5vPSV4LCBwcmlvPSVkXG4iLAorCQkJICBlbmdpbmUtPm5hbWUsCisJCQkg IHBvcnQtPmNvbnRleHRfaWQsIGNvdW50LAorCQkJICBycSA/IHJxLT5nbG9iYWxfc2Vxbm8gOiAw LAorCQkJICBycSA/IHJxX3ByaW8ocnEpIDogMCk7CisKKwkJLyogQ2hlY2sgdGhlIGNvbnRleHQv ZGVzYyBpZCBmb3IgdGhpcyBldmVudCBtYXRjaGVzICovCisJCUdFTV9ERUJVR19CVUdfT04oYnVm WzIgKiBoZWFkICsgMV0gIT0gcG9ydC0+Y29udGV4dF9pZCk7CisKKwkJR0VNX0JVR19PTihjb3Vu dCA9PSAwKTsKKwkJaWYgKC0tY291bnQgPT0gMCkgeworCQkJR0VNX0JVR19PTihzdGF0dXMgJiBH RU44X0NUWF9TVEFUVVNfUFJFRU1QVEVEKTsKKwkJCUdFTV9CVUdfT04ocG9ydF9pc3NldCgmcG9y dFsxXSkgJiYKKwkJCQkgICAhKHN0YXR1cyAmIEdFTjhfQ1RYX1NUQVRVU19FTEVNRU5UX1NXSVRD SCkpOworCQkJR0VNX0JVR19PTighaTkxNV9yZXF1ZXN0X2NvbXBsZXRlZChycSkpOworCQkJZXhl Y2xpc3RzX2NvbnRleHRfc2NoZWR1bGVfb3V0KHJxKTsKKwkJCXRyYWNlX2k5MTVfcmVxdWVzdF9v dXQocnEpOworCQkJaTkxNV9yZXF1ZXN0X3B1dChycSk7CisKKwkJCUdFTV9UUkFDRSgiJXMgY29t cGxldGVkIGN0eD0lZFxuIiwKKwkJCQkgIGVuZ2luZS0+bmFtZSwgcG9ydC0+Y29udGV4dF9pZCk7 CisKKwkJCWV4ZWNsaXN0c19wb3J0X2NvbXBsZXRlKGV4ZWNsaXN0cywgcG9ydCk7CisJCX0gZWxz ZSB7CisJCQlwb3J0X3NldChwb3J0LCBwb3J0X3BhY2socnEsIGNvdW50KSk7CisJCX0KIAotCQkJ LyogV2Ugc2hvdWxkIG5ldmVyIGdldCBhIENPTVBMRVRFRCB8IElETEVfQUNUSVZFISAqLwotCQkJ R0VNX0JVR19PTihzdGF0dXMgJiBHRU44X0NUWF9TVEFUVVNfSURMRV9BQ1RJVkUpOworCQkvKiBB ZnRlciB0aGUgZmluYWwgZWxlbWVudCwgdGhlIGh3IHNob3VsZCBiZSBpZGxlICovCisJCUdFTV9C VUdfT04ocG9ydF9jb3VudChwb3J0KSA9PSAwICYmCisJCQkgICAhKHN0YXR1cyAmIEdFTjhfQ1RY X1NUQVRVU19BQ1RJVkVfSURMRSkpOworCQlpZiAocG9ydF9jb3VudChwb3J0KSA9PSAwKQorCQkJ ZXhlY2xpc3RzX2NsZWFyX2FjdGl2ZShleGVjbGlzdHMsCisJCQkJCSAgICAgICBFWEVDTElTVFNf QUNUSVZFX1VTRVIpOworCX0KIAotCQkJaWYgKHN0YXR1cyAmIEdFTjhfQ1RYX1NUQVRVU19DT01Q TEVURSAmJgotCQkJICAgIGJ1ZlsyKmhlYWQgKyAxXSA9PSBleGVjbGlzdHMtPnByZWVtcHRfY29t cGxldGVfc3RhdHVzKSB7Ci0JCQkJR0VNX1RSQUNFKCIlcyBwcmVlbXB0LWlkbGVcbiIsIGVuZ2lu ZS0+bmFtZSk7Ci0JCQkJY29tcGxldGVfcHJlZW1wdF9jb250ZXh0KGV4ZWNsaXN0cyk7Ci0JCQkJ Y29udGludWU7Ci0JCQl9CisJaWYgKGhlYWQgIT0gZXhlY2xpc3RzLT5jc2JfaGVhZCkgeworCQll eGVjbGlzdHMtPmNzYl9oZWFkID0gaGVhZDsKKwkJd3JpdGVsKF9NQVNLRURfRklFTEQoR0VOOF9D U0JfUkVBRF9QVFJfTUFTSywgaGVhZCA8PCA4KSwKKwkJICAgICAgIGk5MTUtPnJlZ3MgKyBpOTE1 X21taW9fcmVnX29mZnNldChSSU5HX0NPTlRFWFRfU1RBVFVTX1BUUihlbmdpbmUpKSk7CisJfQog Ci0JCQlpZiAoc3RhdHVzICYgR0VOOF9DVFhfU1RBVFVTX1BSRUVNUFRFRCAmJgotCQkJICAgIGV4 ZWNsaXN0c19pc19hY3RpdmUoZXhlY2xpc3RzLAotCQkJCQkJRVhFQ0xJU1RTX0FDVElWRV9QUkVF TVBUKSkKLQkJCQljb250aW51ZTsKKwlpZiAodW5saWtlbHkoZncpKQorCQlpbnRlbF91bmNvcmVf Zm9yY2V3YWtlX3B1dChpOTE1LCBleGVjbGlzdHMtPmZ3X2RvbWFpbnMpOworfQogCi0JCQlHRU1f QlVHX09OKCFleGVjbGlzdHNfaXNfYWN0aXZlKGV4ZWNsaXN0cywKLQkJCQkJCQlFWEVDTElTVFNf QUNUSVZFX1VTRVIpKTsKLQotCQkJcnEgPSBwb3J0X3VucGFjayhwb3J0LCAmY291bnQpOwotCQkJ R0VNX1RSQUNFKCIlcyBvdXRbMF06IGN0eD0lZC4lZCwgc2Vxbm89JXgsIHByaW89JWRcbiIsCi0J CQkJICBlbmdpbmUtPm5hbWUsCi0JCQkJICBwb3J0LT5jb250ZXh0X2lkLCBjb3VudCwKLQkJCQkg IHJxID8gcnEtPmdsb2JhbF9zZXFubyA6IDAsCi0JCQkJICBycSA/IHJxX3ByaW8ocnEpIDogMCk7 Ci0KLQkJCS8qIENoZWNrIHRoZSBjb250ZXh0L2Rlc2MgaWQgZm9yIHRoaXMgZXZlbnQgbWF0Y2hl cyAqLwotCQkJR0VNX0RFQlVHX0JVR19PTihidWZbMiAqIGhlYWQgKyAxXSAhPSBwb3J0LT5jb250 ZXh0X2lkKTsKLQotCQkJR0VNX0JVR19PTihjb3VudCA9PSAwKTsKLQkJCWlmICgtLWNvdW50ID09 IDApIHsKLQkJCQlHRU1fQlVHX09OKHN0YXR1cyAmIEdFTjhfQ1RYX1NUQVRVU19QUkVFTVBURUQp OwotCQkJCUdFTV9CVUdfT04ocG9ydF9pc3NldCgmcG9ydFsxXSkgJiYKLQkJCQkJICAgIShzdGF0 dXMgJiBHRU44X0NUWF9TVEFUVVNfRUxFTUVOVF9TV0lUQ0gpKTsKLQkJCQlHRU1fQlVHX09OKCFp OTE1X3JlcXVlc3RfY29tcGxldGVkKHJxKSk7Ci0JCQkJZXhlY2xpc3RzX2NvbnRleHRfc2NoZWR1 bGVfb3V0KHJxKTsKLQkJCQl0cmFjZV9pOTE1X3JlcXVlc3Rfb3V0KHJxKTsKLQkJCQlpOTE1X3Jl cXVlc3RfcHV0KHJxKTsKLQotCQkJCUdFTV9UUkFDRSgiJXMgY29tcGxldGVkIGN0eD0lZFxuIiwK LQkJCQkJICBlbmdpbmUtPm5hbWUsIHBvcnQtPmNvbnRleHRfaWQpOwotCi0JCQkJZXhlY2xpc3Rz X3BvcnRfY29tcGxldGUoZXhlY2xpc3RzLCBwb3J0KTsKLQkJCX0gZWxzZSB7Ci0JCQkJcG9ydF9z ZXQocG9ydCwgcG9ydF9wYWNrKHJxLCBjb3VudCkpOwotCQkJfQorLyoKKyAqIENoZWNrIHRoZSB1 bnJlYWQgQ29udGV4dCBTdGF0dXMgQnVmZmVycyBhbmQgbWFuYWdlIHRoZSBzdWJtaXNzaW9uIG9m IG5ldworICogY29udGV4dHMgdG8gdGhlIEVMU1AgYWNjb3JkaW5nbHkuCisgKi8KK3N0YXRpYyB2 b2lkIGV4ZWNsaXN0c19zdWJtaXNzaW9uX3Rhc2tsZXQodW5zaWduZWQgbG9uZyBkYXRhKQorewor CXN0cnVjdCBpbnRlbF9lbmdpbmVfY3MgKiBjb25zdCBlbmdpbmUgPSAoc3RydWN0IGludGVsX2Vu Z2luZV9jcyAqKWRhdGE7CiAKLQkJCS8qIEFmdGVyIHRoZSBmaW5hbCBlbGVtZW50LCB0aGUgaHcg c2hvdWxkIGJlIGlkbGUgKi8KLQkJCUdFTV9CVUdfT04ocG9ydF9jb3VudChwb3J0KSA9PSAwICYm Ci0JCQkJICAgIShzdGF0dXMgJiBHRU44X0NUWF9TVEFUVVNfQUNUSVZFX0lETEUpKTsKLQkJCWlm IChwb3J0X2NvdW50KHBvcnQpID09IDApCi0JCQkJZXhlY2xpc3RzX2NsZWFyX2FjdGl2ZShleGVj bGlzdHMsCi0JCQkJCQkgICAgICAgRVhFQ0xJU1RTX0FDVElWRV9VU0VSKTsKLQkJfQorCS8qCisJ ICogV2UgY2FuIHNraXAgYWNxdWlyaW5nIGludGVsX3J1bnRpbWVfcG1fZ2V0KCkgaGVyZSBhcyBp dCB3YXMgdGFrZW4KKwkgKiBvbiBvdXIgYmVoYWxmIGJ5IHRoZSByZXF1ZXN0IChzZWUgaTkxNV9n ZW1fbWFya19idXN5KCkpIGFuZCBpdCB3aWxsCisJICogbm90IGJlIHJlbGlucXVpc2hlZCB1bnRp bCB0aGUgZGV2aWNlIGlzIGlkbGUgKHNlZQorCSAqIGk5MTVfZ2VtX2lkbGVfd29ya19oYW5kbGVy KCkpLiBBcyBhIHByZWNhdXRpb24sIHdlIG1ha2Ugc3VyZQorCSAqIHRoYXQgYWxsIEVMU1AgYXJl IGRyYWluZWQgaS5lLiB3ZSBoYXZlIHByb2Nlc3NlZCB0aGUgQ1NCLAorCSAqIGJlZm9yZSBhbGxv d2luZyBvdXJzZWx2ZXMgdG8gaWRsZSBhbmQgY2FsbGluZyBpbnRlbF9ydW50aW1lX3BtX3B1dCgp LgorCSAqLworCUdFTV9CVUdfT04oIWVuZ2luZS0+aTkxNS0+Z3QuYXdha2UpOwogCi0JCWlmICho ZWFkICE9IGV4ZWNsaXN0cy0+Y3NiX2hlYWQpIHsKLQkJCWV4ZWNsaXN0cy0+Y3NiX2hlYWQgPSBo ZWFkOwotCQkJd3JpdGVsKF9NQVNLRURfRklFTEQoR0VOOF9DU0JfUkVBRF9QVFJfTUFTSywgaGVh ZCA8PCA4KSwKLQkJCSAgICAgICBkZXZfcHJpdi0+cmVncyArIGk5MTVfbW1pb19yZWdfb2Zmc2V0 KFJJTkdfQ09OVEVYVF9TVEFUVVNfUFRSKGVuZ2luZSkpKTsKLQkJfQotCX0KKwkvKgorCSAqIFBy ZWZlciBkb2luZyB0ZXN0X2FuZF9jbGVhcl9iaXQoKSBhcyBhIHR3byBzdGFnZSBvcGVyYXRpb24g dG8gYXZvaWQKKwkgKiBpbXBvc2luZyB0aGUgY29zdCBvZiBhIGxvY2tlZCBhdG9taWMgdHJhbnNh Y3Rpb24gd2hlbiBzdWJtaXR0aW5nIGEKKwkgKiBuZXcgcmVxdWVzdCAob3V0c2lkZSBvZiB0aGUg Y29udGV4dC1zd2l0Y2ggaW50ZXJydXB0KS4KKwkgKi8KKwlpZiAodGVzdF9iaXQoRU5HSU5FX0lS UV9FWEVDTElTVCwgJmVuZ2luZS0+aXJxX3Bvc3RlZCkpCisJCXByb2Nlc3NfY3NiKGVuZ2luZSk7 CiAKLQlpZiAoIWV4ZWNsaXN0c19pc19hY3RpdmUoZXhlY2xpc3RzLCBFWEVDTElTVFNfQUNUSVZF X1BSRUVNUFQpKQorCWlmICghZXhlY2xpc3RzX2lzX2FjdGl2ZSgmZW5naW5lLT5leGVjbGlzdHMs IEVYRUNMSVNUU19BQ1RJVkVfUFJFRU1QVCkpCiAJCWV4ZWNsaXN0c19kZXF1ZXVlKGVuZ2luZSk7 Ci0KLQlpZiAoZncpCi0JCWludGVsX3VuY29yZV9mb3JjZXdha2VfcHV0KGRldl9wcml2LCBleGVj bGlzdHMtPmZ3X2RvbWFpbnMpOwogfQogCiBzdGF0aWMgdm9pZCBxdWV1ZV9yZXF1ZXN0KHN0cnVj dCBpbnRlbF9lbmdpbmVfY3MgKmVuZ2luZSwKQEAgLTE2NjcsNiArMTY3Myw3IEBAIHN0YXRpYyBz dHJ1Y3QgaTkxNV9yZXF1ZXN0ICoKIGV4ZWNsaXN0c19yZXNldF9wcmVwYXJlKHN0cnVjdCBpbnRl bF9lbmdpbmVfY3MgKmVuZ2luZSkKIHsKIAlzdHJ1Y3QgaW50ZWxfZW5naW5lX2V4ZWNsaXN0cyAq IGNvbnN0IGV4ZWNsaXN0cyA9ICZlbmdpbmUtPmV4ZWNsaXN0czsKKwlzdHJ1Y3QgaTkxNV9yZXF1 ZXN0ICpyZXF1ZXN0LCAqYWN0aXZlOwogCiAJLyoKIAkgKiBQcmV2ZW50IHJlcXVlc3Qgc3VibWlz c2lvbiB0byB0aGUgaGFyZHdhcmUgdW50aWwgd2UgaGF2ZQpAQCAtMTY4OCw3ICsxNjk1LDM5IEBA IGV4ZWNsaXN0c19yZXNldF9wcmVwYXJlKHN0cnVjdCBpbnRlbF9lbmdpbmVfY3MgKmVuZ2luZSkK IAkJdGFza2xldF9raWxsKCZleGVjbGlzdHMtPnRhc2tsZXQpOwogCXRhc2tsZXRfZGlzYWJsZSgm ZXhlY2xpc3RzLT50YXNrbGV0KTsKIAotCXJldHVybiBpOTE1X2dlbV9maW5kX2FjdGl2ZV9yZXF1 ZXN0KGVuZ2luZSk7CisJLyoKKwkgKiBXZSB3YW50IHRvIGZsdXNoIHRoZSBwZW5kaW5nIGNvbnRl eHQgc3dpdGNoZXMsIGhhdmluZyBkaXNhYmxlZAorCSAqIHRoZSB0YXNrbGV0IGFib3ZlLCB3ZSBj YW4gYXNzdW1lIGV4Y2x1c2l2ZSBhY2Nlc3MgdG8gdGhlIGV4ZWNsaXN0cy4KKwkgKiBGb3IgdGhp cyBhbGxvd3MgdXMgdG8gY2F0Y2ggdXAgd2l0aCBhbiBpbmZsaWdodCBwcmVlbXB0aW9uIGV2ZW50 LAorCSAqIGFuZCBhdm9pZCBibGFtaW5nIGFuIGlubm9jZW50IHJlcXVlc3QgaWYgdGhlIHN0YWxs IHdhcyBkdWUgdG8gdGhlCisJICogcHJlZW1wdGlvbiBpdHNlbGYuCisJICovCisJcHJvY2Vzc19j c2IoZW5naW5lKTsKKworCS8qCisJICogVGhlIGxhc3QgYWN0aXZlIHJlcXVlc3QgY2FuIHRoZW4g YmUgbm8gbGF0ZXIgdGhhbiB0aGUgbGFzdCByZXF1ZXN0CisJICogbm93IGluIEVMU1BbMF0uIFNv IHNlYXJjaCBiYWNrd2FyZHMgZnJvbSB0aGVyZSwgc28gdGhhdCBpcyB0aGUgR1BVCisJICogaGFz IGFkdmFuY2VkIGJleW9uZCB0aGUgbGFzdCBDU0IgdXBkYXRlLCBpdCB3aWxsIGJlIHBhcmRvbmVk LgorCSAqLworCWFjdGl2ZSA9IE5VTEw7CisJcmVxdWVzdCA9IHBvcnRfcmVxdWVzdChleGVjbGlz dHMtPnBvcnQpOworCWlmIChyZXF1ZXN0KSB7CisJCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwkJ c3Bpbl9sb2NrX2lycXNhdmUoJmVuZ2luZS0+dGltZWxpbmUtPmxvY2ssIGZsYWdzKTsKKwkJbGlz dF9mb3JfZWFjaF9lbnRyeV9mcm9tX3JldmVyc2UocmVxdWVzdCwKKwkJCQkJCSAmZW5naW5lLT50 aW1lbGluZS0+cmVxdWVzdHMsCisJCQkJCQkgbGluaykgeworCQkJaWYgKF9faTkxNV9yZXF1ZXN0 X2NvbXBsZXRlZChyZXF1ZXN0LAorCQkJCQkJICAgICByZXF1ZXN0LT5nbG9iYWxfc2Vxbm8pKQor CQkJCWJyZWFrOworCisJCQlhY3RpdmUgPSByZXF1ZXN0OworCQl9CisJCXNwaW5fdW5sb2NrX2ly cXJlc3RvcmUoJmVuZ2luZS0+dGltZWxpbmUtPmxvY2ssIGZsYWdzKTsKKwl9CisKKwlyZXR1cm4g YWN0aXZlOwogfQogCiBzdGF0aWMgdm9pZCByZXNldF9pcnEoc3RydWN0IGludGVsX2VuZ2luZV9j cyAqZW5naW5lKQotLSAKMi4xNi4yCgpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fXwpJbnRlbC1nZnggbWFpbGluZyBsaXN0CkludGVsLWdmeEBsaXN0cy5mcmVl ZGVza3RvcC5vcmcKaHR0cHM6Ly9saXN0cy5mcmVlZGVza3RvcC5vcmcvbWFpbG1hbi9saXN0aW5m by9pbnRlbC1nZngK