From mboxrd@z Thu Jan 1 00:00:00 1970 From: Dave Gordon Subject: [PATCH 06/10 v5] drm/i915: Implementation of GuC submission client Date: Wed, 29 Jul 2015 18:48:34 +0100 Message-ID: <1438192118-5807-7-git-send-email-david.s.gordon@intel.com> References: <1438192118-5807-1-git-send-email-david.s.gordon@intel.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from mga14.intel.com (mga14.intel.com [192.55.52.115]) by gabe.freedesktop.org (Postfix) with ESMTP id 2A7D26E502 for ; Wed, 29 Jul 2015 10:48:56 -0700 (PDT) In-Reply-To: <1438192118-5807-1-git-send-email-david.s.gordon@intel.com> 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 QSBHdUMgY2xpZW50IGhhcyBpdHMgb3duIGRvb3JiZWxsIGFuZCB3b3JrcXVldWUuIEl0IG1haW50 YWlucyB0aGUKZG9vcmJlbGwgY2FjaGUgbGluZSwgcHJvY2VzcyBkZXNjcmlwdGlvbiBvYmplY3Qg YW5kIHdvcmsgcXVldWUgaXRlbS4KCkEgZGVmYXVsdCBndWNfY2xpZW50IGlzIGNyZWF0ZWQgZm9y IHRoZSBpOTE1IGRyaXZlciB0byB1c2UgZm9yCm5vcm1hbC1wcmlvcml0eSBpbi1vcmRlciBzdWJt aXNzaW9uLgoKTm90ZSB0aGF0IHRoZSBjcmVhdGVkIGNsaWVudCBpcyBub3QgeWV0IHJlYWR5IGZv ciB1c2U7IGRvb3JiZWxsCmFsbG9jYXRpb24gd2lsbCBmYWlsIGFzIHdlIGhhdmVuJ3QgeWV0IGxp bmtlZCB0aGUgR3VDJ3MgY29udGV4dApkZXNjcmlwdG9yIHRvIHRoZSBkZWZhdWx0IGNvbnRleHRz IGZvciBlYWNoIHJpbmcgKHNlZSBsYXRlciBwYXRjaCkuCgp2MjoKICAgIERlZmVyIGFkZGluZyBz dHJ1Y3R1cmUgbWVtYmVycyB1bnRpbCBuZWVkZWQgW0NocmlzIFdpbHNvbl0KICAgIFJhdGlvbmFs aXNlIHR5cGUgZGVjbGFyYXRpb25zIFtDaHJpcyBXaWxzb25dCgp2NToKICAgIEFkZCBHdUMgcGVy LWVuZ2luZSBzdWJtaXNzaW9uICYgc2Vxbm8gc3RhdGlzdGljcy4KICAgIE1vdmUgd3EgbG9ja2lu ZyB0byBlbmNvbXBhc3MgYm90aCBnZXRfc3BhY2UoKSBhbmQgYWRkX2l0ZW0oKS4KICAgIFRha2Ug Zm9yY2V3YWtlIGxvY2sgaW4gaG9zdDJndWNfYWN0aW9uKCkgW1RvbSBPJ1JvdXJrZV0KCklzc3Vl OiBWSVotNDg4NApTaWduZWQtb2ZmLWJ5OiBBbGV4IERhaSA8eXUuZGFpQGludGVsLmNvbT4KU2ln bmVkLW9mZi1ieTogRGF2ZSBHb3Jkb24gPGRhdmlkLnMuZ29yZG9uQGludGVsLmNvbT4KLS0tCiBk cml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2d1Y19zdWJtaXNzaW9uLmMgfCA2NTIgKysrKysrKysr KysrKysrKysrKysrKysrKysrKysKIGRyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2d1Yy5oICAg ICAgICAgICB8ICA0NiArKwogZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfZ3VjX2xvYWRlci5j ICAgIHwgIDEwICsKIDMgZmlsZXMgY2hhbmdlZCwgNzA4IGluc2VydGlvbnMoKykKCmRpZmYgLS1n aXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2d1Y19zdWJtaXNzaW9uLmMgYi9kcml2ZXJz L2dwdS9kcm0vaTkxNS9pOTE1X2d1Y19zdWJtaXNzaW9uLmMKaW5kZXggNjY5Yzg4OS4uNTQzNzk2 MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9ndWNfc3VibWlzc2lvbi5j CisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZ3VjX3N1Ym1pc3Npb24uYwpAQCAtMjcs NiArMjcsNTE3IEBACiAjaW5jbHVkZSAiaW50ZWxfZ3VjLmgiCiAKIC8qKgorICogRE9DOiBHdUMg Q2xpZW50CisgKgorICogaTkxNV9ndWNfY2xpZW50OgorICogV2UgdXNlIHRoZSB0ZXJtIGNsaWVu dCB0byBhdm9pZCBjb25mdXNpb24gd2l0aCBjb250ZXh0cy4gQSBpOTE1X2d1Y19jbGllbnQgaXMK KyAqIGVxdWl2YWxlbnQgdG8gR3VDIG9iamVjdCBndWNfY29udGV4dF9kZXNjLiBUaGlzIGNvbnRl eHQgZGVzY3JpcHRvciBpcworICogYWxsb2NhdGVkIGZyb20gYSBwb29sIG9mIDEwMjQgZW50cmll cy4gS2VybmVsIGRyaXZlciB3aWxsIGFsbG9jYXRlIGRvb3JiZWxsCisgKiBhbmQgd29ya3F1ZXVl IGZvciBpdC4gQWxzbyB0aGUgcHJvY2VzcyBkZXNjcmlwdG9yIChndWNfcHJvY2Vzc19kZXNjKSwg d2hpY2gKKyAqIGlzIG1hcHBlZCB0byBjbGllbnQgc3BhY2UuIFNvIHRoZSBjbGllbnQgY2FuIHdy aXRlIFdvcmsgSXRlbSB0aGVuIHJpbmcgdGhlCisgKiBkb29yYmVsbC4KKyAqCisgKiBUbyBzaW1w bGlmeSB0aGUgaW1wbGVtZW50YXRpb24sIHdlIGFsbG9jYXRlIG9uZSBnZW0gb2JqZWN0IHRoYXQg Y29udGFpbnMgYWxsCisgKiBwYWdlcyBmb3IgZG9vcmJlbGwsIHByb2Nlc3MgZGVzY3JpcHRvciBh bmQgd29ya3F1ZXVlLgorICoKKyAqIFRoZSBTY3JhdGNoIHJlZ2lzdGVyczoKKyAqIFRoZXJlIGFy ZSAxNiBNTUlPLWJhc2VkIHJlZ2lzdGVycyBzdGFydCBmcm9tIDB4QzE4MC4gVGhlIGtlcm5lbCBk cml2ZXIgd3JpdGVzCisgKiBhIHZhbHVlIHRvIHRoZSBhY3Rpb24gcmVnaXN0ZXIgKFNPRlRfU0NS QVRDSF8wKSBhbG9uZyB3aXRoIGFueSBkYXRhLiBJdCB0aGVuCisgKiB0cmlnZ2VycyBhbiBpbnRl cnJ1cHQgb24gdGhlIEd1QyB2aWEgYW5vdGhlciByZWdpc3RlciB3cml0ZSAoMHhDNEM4KS4KKyAq IEZpcm13YXJlIHdyaXRlcyBhIHN1Y2Nlc3MvZmFpbCBjb2RlIGJhY2sgdG8gdGhlIGFjdGlvbiBy ZWdpc3RlciBhZnRlcgorICogcHJvY2Vzc2VzIHRoZSByZXF1ZXN0LiBUaGUga2VybmVsIGRyaXZl ciBwb2xscyB3YWl0aW5nIGZvciB0aGlzIHVwZGF0ZSBhbmQKKyAqIHRoZW4gcHJvY2VlZHMuCisg KiBTZWUgaG9zdDJndWNfYWN0aW9uKCkKKyAqCisgKiBEb29yYmVsbHM6CisgKiBEb29yYmVsbHMg YXJlIGludGVycnVwdHMgdG8gdUtlcm5lbC4gQSBkb29yYmVsbCBpcyBhIHNpbmdsZSBjYWNoZSBs aW5lIChRVykKKyAqIG1hcHBlZCBpbnRvIHByb2Nlc3Mgc3BhY2UuCisgKgorICogV29yayBJdGVt czoKKyAqIFRoZXJlIGFyZSBzZXZlcmFsIHR5cGVzIG9mIHdvcmsgaXRlbXMgdGhhdCB0aGUgaG9z dCBtYXkgcGxhY2UgaW50byBhCisgKiB3b3JrcXVldWUsIGVhY2ggd2l0aCBpdHMgb3duIHJlcXVp cmVtZW50cyBhbmQgbGltaXRhdGlvbnMuIEN1cnJlbnRseSBvbmx5CisgKiBXUV9UWVBFX0lOT1JE RVIgaXMgbmVlZGVkIHRvIHN1cHBvcnQgbGVnYWN5IHN1Ym1pc3Npb24gdmlhIEd1Qywgd2hpY2gK KyAqIHJlcHJlc2VudHMgaW4tb3JkZXIgcXVldWUuIFRoZSBrZXJuZWwgZHJpdmVyIHBhY2tzIHJp bmcgdGFpbCBwb2ludGVyIGFuZCBhbgorICogRUxTUCBjb250ZXh0IGRlc2NyaXB0b3IgZHdvcmQg aW50byBXb3JrIEl0ZW0uCisgKiBTZWUgZ3VjX2FkZF93b3JrcXVldWVfaXRlbSgpCisgKgorICov CisKKy8qCisgKiBSZWFkIEd1QyBjb21tYW5kL3N0YXR1cyByZWdpc3RlciAoU09GVF9TQ1JBVENI XzApCisgKiBSZXR1cm4gdHJ1ZSBpZiBpdCBjb250YWlucyBhIHJlc3BvbnNlIHJhdGhlciB0aGFu IGEgY29tbWFuZAorICovCitzdGF0aWMgaW5saW5lIGJvb2wgaG9zdDJndWNfYWN0aW9uX3Jlc3Bv bnNlKHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiwKKwkJCQkJICAgIHUzMiAqc3Rh dHVzKQoreworCXUzMiB2YWwgPSBJOTE1X1JFQUQoU09GVF9TQ1JBVENIKDApKTsKKwkqc3RhdHVz ID0gdmFsOworCXJldHVybiBHVUMySE9TVF9JU19SRVNQT05TRSh2YWwpOworfQorCitzdGF0aWMg aW50IGhvc3QyZ3VjX2FjdGlvbihzdHJ1Y3QgaW50ZWxfZ3VjICpndWMsIHUzMiAqZGF0YSwgdTMy IGxlbikKK3sKKwlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBndWNfdG9faTkx NShndWMpOworCXUzMiBzdGF0dXM7CisJaW50IGk7CisJaW50IHJldDsKKworCWlmIChXQVJOX09O KGxlbiA8IDEgfHwgbGVuID4gMTUpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWludGVsX3VuY29y ZV9mb3JjZXdha2VfZ2V0KGRldl9wcml2LCBGT1JDRVdBS0VfQUxMKTsKKwlzcGluX2xvY2soJmRl dl9wcml2LT5ndWMuaG9zdDJndWNfbG9jayk7CisKKwlkZXZfcHJpdi0+Z3VjLmFjdGlvbl9jb3Vu dCArPSAxOworCWRldl9wcml2LT5ndWMuYWN0aW9uX2NtZCA9IGRhdGFbMF07CisKKwlmb3IgKGkg PSAwOyBpIDwgbGVuOyBpKyspCisJCUk5MTVfV1JJVEUoU09GVF9TQ1JBVENIKGkpLCBkYXRhW2ld KTsKKworCVBPU1RJTkdfUkVBRChTT0ZUX1NDUkFUQ0goaSAtIDEpKTsKKworCUk5MTVfV1JJVEUo SE9TVDJHVUNfSU5URVJSVVBULCBIT1NUMkdVQ19UUklHR0VSKTsKKworCS8qIE5vIEhPU1QyR1VD IGNvbW1hbmQgc2hvdWxkIHRha2UgbG9uZ2VyIHRoYW4gMTBtcyAqLworCXJldCA9IHdhaXRfZm9y X2F0b21pYyhob3N0Mmd1Y19hY3Rpb25fcmVzcG9uc2UoZGV2X3ByaXYsICZzdGF0dXMpLCAxMCk7 CisJaWYgKHN0YXR1cyAhPSBHVUMySE9TVF9TVEFUVVNfU1VDQ0VTUykgeworCQkvKgorCQkgKiBF aXRoZXIgdGhlIEd1QyBleHBsaWNpdGx5IHJldHVybmVkIGFuIGVycm9yICh3aGljaAorCQkgKiB3 ZSBjb252ZXJ0IHRvIC1FSU8gaGVyZSkgb3Igbm8gcmVzcG9uc2UgYXQgYWxsIHdhcworCQkgKiBy ZWNlaXZlZCB3aXRoaW4gdGhlIHRpbWVvdXQgbGltaXQgKC1FVElNRURPVVQpCisJCSAqLworCQlp ZiAocmV0ICE9IC1FVElNRURPVVQpCisJCQlyZXQgPSAtRUlPOworCisJCURSTV9FUlJPUigiR1VD OiBob3N0Mmd1YyBhY3Rpb24gMHglWCBmYWlsZWQuIHJldD0lZCAiCisJCQkJInN0YXR1cz0weCUw OFggcmVzcG9uc2U9MHglMDhYXG4iLAorCQkJCWRhdGFbMF0sIHJldCwgc3RhdHVzLAorCQkJCUk5 MTVfUkVBRChTT0ZUX1NDUkFUQ0goMTUpKSk7CisKKwkJZGV2X3ByaXYtPmd1Yy5hY3Rpb25fZmFp bCArPSAxOworCQlkZXZfcHJpdi0+Z3VjLmFjdGlvbl9lcnIgPSByZXQ7CisJfQorCWRldl9wcml2 LT5ndWMuYWN0aW9uX3N0YXR1cyA9IHN0YXR1czsKKworCXNwaW5fdW5sb2NrKCZkZXZfcHJpdi0+ Z3VjLmhvc3QyZ3VjX2xvY2spOworCWludGVsX3VuY29yZV9mb3JjZXdha2VfcHV0KGRldl9wcml2 LCBGT1JDRVdBS0VfQUxMKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBUZWxsIHRoZSBH dUMgdG8gYWxsb2NhdGUgb3IgZGVhbGxvY2F0ZSBhIHNwZWNpZmljIGRvb3JiZWxsCisgKi8KKwor c3RhdGljIGludCBob3N0Mmd1Y19hbGxvY2F0ZV9kb29yYmVsbChzdHJ1Y3QgaW50ZWxfZ3VjICpn dWMsCisJCQkJICAgICAgc3RydWN0IGk5MTVfZ3VjX2NsaWVudCAqY2xpZW50KQoreworCXUzMiBk YXRhWzJdOworCisJZGF0YVswXSA9IEhPU1QyR1VDX0FDVElPTl9BTExPQ0FURV9ET09SQkVMTDsK KwlkYXRhWzFdID0gY2xpZW50LT5jdHhfaW5kZXg7CisKKwlyZXR1cm4gaG9zdDJndWNfYWN0aW9u KGd1YywgZGF0YSwgMik7Cit9CisKK3N0YXRpYyBpbnQgaG9zdDJndWNfcmVsZWFzZV9kb29yYmVs bChzdHJ1Y3QgaW50ZWxfZ3VjICpndWMsCisJCQkJICAgICBzdHJ1Y3QgaTkxNV9ndWNfY2xpZW50 ICpjbGllbnQpCit7CisJdTMyIGRhdGFbMl07CisKKwlkYXRhWzBdID0gSE9TVDJHVUNfQUNUSU9O X0RFQUxMT0NBVEVfRE9PUkJFTEw7CisJZGF0YVsxXSA9IGNsaWVudC0+Y3R4X2luZGV4OworCisJ cmV0dXJuIGhvc3QyZ3VjX2FjdGlvbihndWMsIGRhdGEsIDIpOworfQorCisvKgorICogSW5pdGlh bGlzZSwgdXBkYXRlLCBvciBjbGVhciBkb29yYmVsbCBkYXRhIHNoYXJlZCB3aXRoIHRoZSBHdUMK KyAqCisgKiBUaGVzZSBmdW5jdGlvbnMgbW9kaWZ5IHNoYXJlZCBkYXRhIGFuZCBzbyBuZWVkIGFj Y2VzcyB0byB0aGUgbWFwcGVkCisgKiBjbGllbnQgb2JqZWN0IHdoaWNoIGNvbnRhaW5zIHRoZSBw YWdlIGJlaW5nIHVzZWQgZm9yIHRoZSBkb29yYmVsbAorICovCisKK3N0YXRpYyB2b2lkIGd1Y19p bml0X2Rvb3JiZWxsKHN0cnVjdCBpbnRlbF9ndWMgKmd1YywKKwkJCSAgICAgIHN0cnVjdCBpOTE1 X2d1Y19jbGllbnQgKmNsaWVudCkKK3sKKwlzdHJ1Y3QgZ3VjX2Rvb3JiZWxsX2luZm8gKmRvb3Ji ZWxsOworCXZvaWQgKmJhc2U7CisKKwliYXNlID0ga21hcF9hdG9taWMoaTkxNV9nZW1fb2JqZWN0 X2dldF9wYWdlKGNsaWVudC0+Y2xpZW50X29iaiwgMCkpOworCWRvb3JiZWxsID0gYmFzZSArIGNs aWVudC0+ZG9vcmJlbGxfb2Zmc2V0OworCisJZG9vcmJlbGwtPmRiX3N0YXR1cyA9IDE7CisJZG9v cmJlbGwtPmNvb2tpZSA9IDA7CisKKwlrdW5tYXBfYXRvbWljKGJhc2UpOworfQorCitzdGF0aWMg aW50IGd1Y19yaW5nX2Rvb3JiZWxsKHN0cnVjdCBpOTE1X2d1Y19jbGllbnQgKmdjKQoreworCXN0 cnVjdCBndWNfcHJvY2Vzc19kZXNjICpkZXNjOworCXVuaW9uIGd1Y19kb29yYmVsbF9xdyBkYl9j bXAsIGRiX2V4YywgZGJfcmV0OworCXVuaW9uIGd1Y19kb29yYmVsbF9xdyAqZGI7CisJdm9pZCAq YmFzZTsKKwlpbnQgYXR0ZW1wdCA9IDIsIHJldCA9IC1FQUdBSU47CisKKwliYXNlID0ga21hcF9h dG9taWMoaTkxNV9nZW1fb2JqZWN0X2dldF9wYWdlKGdjLT5jbGllbnRfb2JqLCAwKSk7CisJZGVz YyA9IGJhc2UgKyBnYy0+cHJvY19kZXNjX29mZnNldDsKKworCS8qIFVwZGF0ZSB0aGUgdGFpbCBz byBpdCBpcyB2aXNpYmxlIHRvIEd1QyAqLworCWRlc2MtPnRhaWwgPSBnYy0+d3FfdGFpbDsKKwor CS8qIGN1cnJlbnQgY29va2llICovCisJZGJfY21wLmRiX3N0YXR1cyA9IEdVQ19ET09SQkVMTF9F TkFCTEVEOworCWRiX2NtcC5jb29raWUgPSBnYy0+Y29va2llOworCisJLyogY29va2llIHRvIGJl IHVwZGF0ZWQgKi8KKwlkYl9leGMuZGJfc3RhdHVzID0gR1VDX0RPT1JCRUxMX0VOQUJMRUQ7CisJ ZGJfZXhjLmNvb2tpZSA9IGdjLT5jb29raWUgKyAxOworCWlmIChkYl9leGMuY29va2llID09IDAp CisJCWRiX2V4Yy5jb29raWUgPSAxOworCisJLyogcG9pbnRlciBvZiBjdXJyZW50IGRvb3JiZWxs IGNhY2hlbGluZSAqLworCWRiID0gYmFzZSArIGdjLT5kb29yYmVsbF9vZmZzZXQ7CisKKwl3aGls ZSAoYXR0ZW1wdC0tKSB7CisJCS8qIGxldHMgcmluZyB0aGUgZG9vcmJlbGwgKi8KKwkJZGJfcmV0 LnZhbHVlX3F3ID0gYXRvbWljNjRfY21weGNoZygoYXRvbWljNjRfdCAqKWRiLAorCQkJZGJfY21w LnZhbHVlX3F3LCBkYl9leGMudmFsdWVfcXcpOworCisJCS8qIGlmIHRoZSBleGNoYW5nZSB3YXMg c3VjY2Vzc2Z1bGx5IGV4ZWN1dGVkICovCisJCWlmIChkYl9yZXQudmFsdWVfcXcgPT0gZGJfY21w LnZhbHVlX3F3KSB7CisJCQkvKiBkYiB3YXMgc3VjY2Vzc2Z1bGx5IHJ1bmcgKi8KKwkJCWdjLT5j b29raWUgPSBkYl9leGMuY29va2llOworCQkJcmV0ID0gMDsKKwkJCWJyZWFrOworCQl9CisKKwkJ LyogWFhYOiBkb29yYmVsbCB3YXMgbG9zdCBhbmQgbmVlZCB0byBhY3F1aXJlIGl0IGFnYWluICov CisJCWlmIChkYl9yZXQuZGJfc3RhdHVzID09IEdVQ19ET09SQkVMTF9ESVNBQkxFRCkKKwkJCWJy ZWFrOworCisJCURSTV9FUlJPUigiQ29va2llIG1pc21hdGNoLiBFeHBlY3RlZCAlZCwgcmV0dXJu ZWQgJWRcbiIsCisJCQkgIGRiX2NtcC5jb29raWUsIGRiX3JldC5jb29raWUpOworCisJCS8qIHVw ZGF0ZSB0aGUgY29va2llIHRvIG5ld2x5IHJlYWQgY29va2llIGZyb20gR3VDICovCisJCWRiX2Nt cC5jb29raWUgPSBkYl9yZXQuY29va2llOworCQlkYl9leGMuY29va2llID0gZGJfcmV0LmNvb2tp ZSArIDE7CisJCWlmIChkYl9leGMuY29va2llID09IDApCisJCQlkYl9leGMuY29va2llID0gMTsK Kwl9CisKKwlrdW5tYXBfYXRvbWljKGJhc2UpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2 b2lkIGd1Y19kaXNhYmxlX2Rvb3JiZWxsKHN0cnVjdCBpbnRlbF9ndWMgKmd1YywKKwkJCQkgc3Ry dWN0IGk5MTVfZ3VjX2NsaWVudCAqY2xpZW50KQoreworCXN0cnVjdCBkcm1faTkxNV9wcml2YXRl ICpkZXZfcHJpdiA9IGd1Y190b19pOTE1KGd1Yyk7CisJc3RydWN0IGd1Y19kb29yYmVsbF9pbmZv ICpkb29yYmVsbDsKKwl2b2lkICpiYXNlOworCWludCBkcmJyZWcgPSBHRU44X0RSQlJFR0woY2xp ZW50LT5kb29yYmVsbF9pZCk7CisJaW50IHZhbHVlOworCisJYmFzZSA9IGttYXBfYXRvbWljKGk5 MTVfZ2VtX29iamVjdF9nZXRfcGFnZShjbGllbnQtPmNsaWVudF9vYmosIDApKTsKKwlkb29yYmVs bCA9IGJhc2UgKyBjbGllbnQtPmRvb3JiZWxsX29mZnNldDsKKworCWRvb3JiZWxsLT5kYl9zdGF0 dXMgPSAwOworCisJa3VubWFwX2F0b21pYyhiYXNlKTsKKworCUk5MTVfV1JJVEUoZHJicmVnLCBJ OTE1X1JFQUQoZHJicmVnKSAmIH5HRU44X0RSQl9WQUxJRCk7CisKKwl2YWx1ZSA9IEk5MTVfUkVB RChkcmJyZWcpOworCVdBUk5fT04oKHZhbHVlICYgR0VOOF9EUkJfVkFMSUQpICE9IDApOworCisJ STkxNV9XUklURShHRU44X0RSQlJFR1UoY2xpZW50LT5kb29yYmVsbF9pZCksIDApOworCUk5MTVf V1JJVEUoZHJicmVnLCAwKTsKKworCS8qIFhYWDogd2FpdCBmb3IgYW55IGludGVycnVwdHMgKi8K KwkvKiBYWFg6IHdhaXQgZm9yIHdvcmtxdWV1ZSB0byBkcmFpbiAqLworfQorCisvKgorICogU2Vs ZWN0LCBhc3NpZ24gYW5kIHJlbGFzZSBkb29yYmVsbCBjYWNoZWxpbmVzCisgKgorICogVGhlc2Ug ZnVuY3Rpb25zIHRyYWNrIHdoaWNoIGRvb3JiZWxsIGNhY2hlbGluZXMgYXJlIGluIHVzZS4KKyAq IFRoZSBkYXRhIHRoZXkgbWFuaXB1bGF0ZSBpcyBwcm90ZWN0ZWQgYnkgdGhlIGhvc3QyZ3VjIGxv Y2suCisgKi8KKworc3RhdGljIHVpbnQzMl90IHNlbGVjdF9kb29yYmVsbF9jYWNoZWxpbmUoc3Ry dWN0IGludGVsX2d1YyAqZ3VjKQoreworCWNvbnN0IHVpbnQzMl90IGNhY2hlbGluZV9zaXplID0g Ym9vdF9jcHVfZGF0YS54ODZfY2xmbHVzaF9zaXplOworCXVpbnQzMl90IG9mZnNldDsKKworCXNw aW5fbG9jaygmZ3VjLT5ob3N0Mmd1Y19sb2NrKTsKKworCS8qIERvb3JiZWxsIHVzZXMgYSBzaW5n bGUgY2FjaGUgbGluZSB3aXRoaW4gYSBwYWdlICovCisJb2Zmc2V0ID0gZ3VjLT5kYl9jYWNoZWxp bmUgJiBQQUdFX01BU0s7CisKKwkvKiBNb3ZpbmcgdG8gbmV4dCBjYWNoZSBsaW5lIHRvIHJlZHVj ZSBjb250ZW50aW9uICovCisJZ3VjLT5kYl9jYWNoZWxpbmUgKz0gY2FjaGVsaW5lX3NpemU7CisK KwlzcGluX3VubG9jaygmZ3VjLT5ob3N0Mmd1Y19sb2NrKTsKKworCXJldHVybiBvZmZzZXQ7Cit9 CisKK3N0YXRpYyB1aW50MTZfdCBhc3NpZ25fZG9vcmJlbGwoc3RydWN0IGludGVsX2d1YyAqZ3Vj LCB1aW50MzJfdCBwcmlvcml0eSkKK3sKKwkvKiBUaGUgYml0bWFwIGlzIHNwbGl0IGludG8gdHdv IGhhbHZlcyAtIGhpZ2ggYW5kIG5vcm1hbCBwcmlvcml0eS4gKi8KKwljb25zdCB1aW50MTZfdCBo YWxmID0gR1VDX01BWF9ET09SQkVMTFMgLyAyOworCWNvbnN0IHVpbnQxNl90IHN0YXJ0ID0gKHBy aW9yaXR5IDw9IEdVQ19DVFhfUFJJT1JJVFlfSElHSCkgPyBoYWxmIDogMDsKKwljb25zdCB1aW50 MTZfdCBlbmQgPSBzdGFydCArIGhhbGY7CisJdWludDE2X3QgaWQ7CisKKwlzcGluX2xvY2soJmd1 Yy0+aG9zdDJndWNfbG9jayk7CisJaWQgPSBmaW5kX25leHRfemVyb19iaXQoZ3VjLT5kb29yYmVs bF9iaXRtYXAsIGVuZCwgc3RhcnQpOworCWlmIChpZCA9PSBlbmQpCisJCWlkID0gR1VDX0lOVkFM SURfRE9PUkJFTExfSUQ7CisJZWxzZQorCQliaXRtYXBfc2V0KGd1Yy0+ZG9vcmJlbGxfYml0bWFw LCBpZCwgMSk7CisJc3Bpbl91bmxvY2soJmd1Yy0+aG9zdDJndWNfbG9jayk7CisKKwlyZXR1cm4g aWQ7Cit9CisKK3N0YXRpYyB2b2lkIHJlbGVhc2VfZG9vcmJlbGwoc3RydWN0IGludGVsX2d1YyAq Z3VjLCB1aW50MTZfdCBpZCkKK3sKKwlzcGluX2xvY2soJmd1Yy0+aG9zdDJndWNfbG9jayk7CisJ Yml0bWFwX2NsZWFyKGd1Yy0+ZG9vcmJlbGxfYml0bWFwLCBpZCwgMSk7CisJc3Bpbl91bmxvY2so Jmd1Yy0+aG9zdDJndWNfbG9jayk7Cit9CisKKy8qCisgKiBJbml0aWFsaXNlIHRoZSBwcm9jZXNz IGRlc2NyaXB0b3Igc2hhcmVkIHdpdGggdGhlIEd1QyBmaXJtd2FyZS4KKyAqLworc3RhdGljIHZv aWQgZ3VjX2luaXRfcHJvY19kZXNjKHN0cnVjdCBpbnRlbF9ndWMgKmd1YywKKwkJCSAgICAgICBz dHJ1Y3QgaTkxNV9ndWNfY2xpZW50ICpjbGllbnQpCit7CisJc3RydWN0IGd1Y19wcm9jZXNzX2Rl c2MgKmRlc2M7CisJdm9pZCAqYmFzZTsKKworCWJhc2UgPSBrbWFwX2F0b21pYyhpOTE1X2dlbV9v YmplY3RfZ2V0X3BhZ2UoY2xpZW50LT5jbGllbnRfb2JqLCAwKSk7CisJZGVzYyA9IGJhc2UgKyBj bGllbnQtPnByb2NfZGVzY19vZmZzZXQ7CisKKwltZW1zZXQoZGVzYywgMCwgc2l6ZW9mKCpkZXNj KSk7CisKKwkvKgorCSAqIFhYWDogcERvb3JiZWxsIGFuZCBXUVZCYXNlQWRkcmVzcyBhcmUgcG9p bnRlcnMgaW4gcHJvY2VzcyBhZGRyZXNzCisJICogc3BhY2UgZm9yIHJpbmczIGNsaWVudHMgKHNl dCB0aGVtIGFzIGluIG1tYXBfaW9jdGwpIG9yIGtlcm5lbAorCSAqIHNwYWNlIGZvciBrZXJuZWwg Y2xpZW50cyAobWFwIG9uIGRlbWFuZCBpbnN0ZWFkPyBNYXkgbWFrZSBkZWJ1ZworCSAqIGVhc2ll ciB0byBoYXZlIGl0IG1hcHBlZCkuCisJICovCisJZGVzYy0+d3FfYmFzZV9hZGRyID0gMDsKKwlk ZXNjLT5kYl9iYXNlX2FkZHIgPSAwOworCisJZGVzYy0+Y29udGV4dF9pZCA9IGNsaWVudC0+Y3R4 X2luZGV4OworCWRlc2MtPndxX3NpemVfYnl0ZXMgPSBjbGllbnQtPndxX3NpemU7CisJZGVzYy0+ d3Ffc3RhdHVzID0gV1FfU1RBVFVTX0FDVElWRTsKKwlkZXNjLT5wcmlvcml0eSA9IGNsaWVudC0+ cHJpb3JpdHk7CisKKwlrdW5tYXBfYXRvbWljKGJhc2UpOworfQorCisvKgorICogSW5pdGlhbGlz ZS9jbGVhciB0aGUgY29udGV4dCBkZXNjcmlwdG9yIHNoYXJlZCB3aXRoIHRoZSBHdUMgZmlybXdh cmUuCisgKgorICogVGhpcyBkZXNjcmlwdG9yIHRlbGxzIHRoZSBHdUMgd2hlcmUgKGluIEdHVFQg c3BhY2UpIHRvIGZpbmQgdGhlIGltcG9ydGFudAorICogZGF0YSBzdHJ1Y3R1cmVzIHJlbGF0aW5n IHRvIHRoaXMgY2xpZW50IChkb29yYmVsbCwgcHJvY2VzcyBkZXNjcmlwdG9yLAorICogd3JpdGUg cXVldWUsIGV0YykuCisgKi8KKworc3RhdGljIHZvaWQgZ3VjX2luaXRfY3R4X2Rlc2Moc3RydWN0 IGludGVsX2d1YyAqZ3VjLAorCQkJICAgICAgc3RydWN0IGk5MTVfZ3VjX2NsaWVudCAqY2xpZW50 KQoreworCXN0cnVjdCBndWNfY29udGV4dF9kZXNjIGRlc2M7CisJc3RydWN0IHNnX3RhYmxlICpz ZzsKKworCW1lbXNldCgmZGVzYywgMCwgc2l6ZW9mKGRlc2MpKTsKKworCWRlc2MuYXR0cmlidXRl ID0gR1VDX0NUWF9ERVNDX0FUVFJfQUNUSVZFIHwgR1VDX0NUWF9ERVNDX0FUVFJfS0VSTkVMOwor CWRlc2MuY29udGV4dF9pZCA9IGNsaWVudC0+Y3R4X2luZGV4OworCWRlc2MucHJpb3JpdHkgPSBj bGllbnQtPnByaW9yaXR5OworCWRlc2MuZW5naW5lc191c2VkID0gKDEgPDwgUkNTKSB8ICgxIDw8 IFZDUykgfCAoMSA8PCBCQ1MpIHwKKwkJCSAgICAoMSA8PCBWRUNTKSB8ICgxIDw8IFZDUzIpOyAv KiBhbGwgZW5naW5lcyAqLworCWRlc2MuZGJfaWQgPSBjbGllbnQtPmRvb3JiZWxsX2lkOworCisJ LyoKKwkgKiBUaGUgQ1BVIGFkZHJlc3MgaXMgb25seSBuZWVkZWQgYXQgY2VydGFpbiBwb2ludHMs IHNvIGttYXBfYXRvbWljIG9uCisJICogZGVtYW5kIGluc3RlYWQgb2Ygc3RvcmluZyBpdCBpbiB0 aGUgY3R4IGRlc2NyaXB0b3IuCisJICogWFhYOiBNYXkgbWFrZSBkZWJ1ZyBlYXNpZXIgdG8gaGF2 ZSBpdCBtYXBwZWQKKwkgKi8KKwlkZXNjLmRiX3RyaWdnZXJfY3B1ID0gMDsKKwlkZXNjLmRiX3Ry aWdnZXJfdWsgPSBjbGllbnQtPmRvb3JiZWxsX29mZnNldCArCisJCWk5MTVfZ2VtX29ial9nZ3R0 X29mZnNldChjbGllbnQtPmNsaWVudF9vYmopOworCWRlc2MuZGJfdHJpZ2dlcl9waHkgPSBjbGll bnQtPmRvb3JiZWxsX29mZnNldCArCisJCXNnX2RtYV9hZGRyZXNzKGNsaWVudC0+Y2xpZW50X29i ai0+cGFnZXMtPnNnbCk7CisKKwlkZXNjLnByb2Nlc3NfZGVzYyA9IGNsaWVudC0+cHJvY19kZXNj X29mZnNldCArCisJCWk5MTVfZ2VtX29ial9nZ3R0X29mZnNldChjbGllbnQtPmNsaWVudF9vYmop OworCisJZGVzYy53cV9hZGRyID0gY2xpZW50LT53cV9vZmZzZXQgKworCQlpOTE1X2dlbV9vYmpf Z2d0dF9vZmZzZXQoY2xpZW50LT5jbGllbnRfb2JqKTsKKworCWRlc2Mud3Ffc2l6ZSA9IGNsaWVu dC0+d3Ffc2l6ZTsKKworCS8qCisJICogWFhYOiBUYWtlIExSQ3MgZnJvbSBhbiBleGlzdGluZyBp bnRlbF9jb250ZXh0IGlmIHRoaXMgaXMgbm90IGFuCisJICogSXNLTURDcmVhdGVkQ29udGV4dCBj bGllbnQKKwkgKi8KKwlkZXNjLmRlc2NfcHJpdmF0ZSA9ICh1aW50cHRyX3QpY2xpZW50OworCisJ LyogUG9vbCBjb250ZXh0IGlzIHBpbm5lZCBhbHJlYWR5ICovCisJc2cgPSBndWMtPmN0eF9wb29s X29iai0+cGFnZXM7CisJc2dfcGNvcHlfZnJvbV9idWZmZXIoc2ctPnNnbCwgc2ctPm5lbnRzLCAm ZGVzYywgc2l6ZW9mKGRlc2MpLAorCQkJICAgICBzaXplb2YoZGVzYykgKiBjbGllbnQtPmN0eF9p bmRleCk7Cit9CisKK3N0YXRpYyB2b2lkIGd1Y19maW5pX2N0eF9kZXNjKHN0cnVjdCBpbnRlbF9n dWMgKmd1YywKKwkJCSAgICAgIHN0cnVjdCBpOTE1X2d1Y19jbGllbnQgKmNsaWVudCkKK3sKKwlz dHJ1Y3QgZ3VjX2NvbnRleHRfZGVzYyBkZXNjOworCXN0cnVjdCBzZ190YWJsZSAqc2c7CisKKwlt ZW1zZXQoJmRlc2MsIDAsIHNpemVvZihkZXNjKSk7CisKKwlzZyA9IGd1Yy0+Y3R4X3Bvb2xfb2Jq LT5wYWdlczsKKwlzZ19wY29weV9mcm9tX2J1ZmZlcihzZy0+c2dsLCBzZy0+bmVudHMsICZkZXNj LCBzaXplb2YoZGVzYyksCisJCQkgICAgIHNpemVvZihkZXNjKSAqIGNsaWVudC0+Y3R4X2luZGV4 KTsKK30KKworLyogR2V0IHZhbGlkIHdvcmtxdWV1ZSBpdGVtIGFuZCByZXR1cm4gaXQgYmFjayB0 byBvZmZzZXQgKi8KK3N0YXRpYyBpbnQgZ3VjX2dldF93b3JrcXVldWVfc3BhY2Uoc3RydWN0IGk5 MTVfZ3VjX2NsaWVudCAqZ2MsIHUzMiAqb2Zmc2V0KQoreworCXN0cnVjdCBndWNfcHJvY2Vzc19k ZXNjICpkZXNjOworCXZvaWQgKmJhc2U7CisJdTMyIHNpemUgPSBzaXplb2Yoc3RydWN0IGd1Y193 cV9pdGVtKTsKKwlpbnQgcmV0ID0gMCwgdGltZW91dF9jb3VudGVyID0gMjAwOworCisJYmFzZSA9 IGttYXBfYXRvbWljKGk5MTVfZ2VtX29iamVjdF9nZXRfcGFnZShnYy0+Y2xpZW50X29iaiwgMCkp OworCWRlc2MgPSBiYXNlICsgZ2MtPnByb2NfZGVzY19vZmZzZXQ7CisKKwl3aGlsZSAodGltZW91 dF9jb3VudGVyLS0gPiAwKSB7CisJCXJldCA9IHdhaXRfZm9yX2F0b21pYyhDSVJDX1NQQUNFKGdj LT53cV90YWlsLCBkZXNjLT5oZWFkLAorCQkJCWdjLT53cV9zaXplKSA+PSBzaXplLCAxKTsKKwor CQlpZiAoIXJldCkgeworCQkJKm9mZnNldCA9IGdjLT53cV90YWlsOworCisJCQkvKiBhZHZhbmNl IHRoZSB0YWlsIGZvciBuZXh0IHdvcmtxdWV1ZSBpdGVtICovCisJCQlnYy0+d3FfdGFpbCArPSBz aXplOworCQkJZ2MtPndxX3RhaWwgJj0gZ2MtPndxX3NpemUgLSAxOworCisJCQkvKiB0aGlzIHdp bGwgYnJlYWsgdGhlIGxvb3AgKi8KKwkJCXRpbWVvdXRfY291bnRlciA9IDA7CisJCX0KKwl9Owor CisJa3VubWFwX2F0b21pYyhiYXNlKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQg Z3VjX2FkZF93b3JrcXVldWVfaXRlbShzdHJ1Y3QgaTkxNV9ndWNfY2xpZW50ICpnYywKKwkJCQkg IHN0cnVjdCBkcm1faTkxNV9nZW1fcmVxdWVzdCAqcnEpCit7CisJZW51bSBpbnRlbF9yaW5nX2lk IHJpbmdfaWQgPSBycS0+cmluZy0+aWQ7CisJc3RydWN0IGd1Y193cV9pdGVtICp3cWk7CisJdm9p ZCAqYmFzZTsKKwl1MzIgdGFpbCwgd3FfbGVuLCB3cV9vZmYgPSAwOworCWludCByZXQ7CisKKwly ZXQgPSBndWNfZ2V0X3dvcmtxdWV1ZV9zcGFjZShnYywgJndxX29mZik7CisJaWYgKHJldCkKKwkJ cmV0dXJuIHJldDsKKworCS8qIEZvciBub3cgd29ya3F1ZXVlIGl0ZW0gaXMgNCBEV3M7IHdvcmtx dWV1ZSBidWZmZXIgaXMgMiBwYWdlcy4gU28gd2UKKwkgKiBzaG91bGQgbm90IGhhdmUgdGhlIGNh c2Ugd2hlcmUgc3RydWN0dXJlIHdxaSBpcyBhY3Jvc3MgcGFnZSwgbmVpdGhlcgorCSAqIHdyYXBw ZWQgdG8gdGhlIGJlZ2lubmluZy4gVGhpcyBzaW1wbGlmaWVzIHRoZSBpbXBsZW1lbnRhdGlvbiBi ZWxvdy4KKwkgKgorCSAqIFhYWDogaWYgbm90IHRoZSBjYXNlLCB3ZSBuZWVkIHNhdmUgZGF0YSB0 byBhIHRlbXAgd3FpIGFuZCBjb3B5IGl0IHRvCisJICogd29ya3F1ZXVlIGJ1ZmZlciBkdyBieSBk dy4KKwkgKi8KKwlXQVJOX09OKHNpemVvZihzdHJ1Y3QgZ3VjX3dxX2l0ZW0pICE9IDE2KTsKKwlX QVJOX09OKHdxX29mZiAmIDMpOworCisJLyogd3Egc3RhcnRzIGZyb20gdGhlIHBhZ2UgYWZ0ZXIg ZG9vcmJlbGwgLyBwcm9jZXNzX2Rlc2MgKi8KKwliYXNlID0ga21hcF9hdG9taWMoaTkxNV9nZW1f b2JqZWN0X2dldF9wYWdlKGdjLT5jbGllbnRfb2JqLAorCQkJKHdxX29mZiArIEdVQ19EQl9TSVpF KSA+PiBQQUdFX1NISUZUKSk7CisJd3Ffb2ZmICY9IFBBR0VfU0laRSAtIDE7CisJd3FpID0gKHN0 cnVjdCBndWNfd3FfaXRlbSAqKSgoY2hhciAqKWJhc2UgKyB3cV9vZmYpOworCisJLyogbGVuIGRv ZXMgbm90IGluY2x1ZGUgdGhlIGhlYWRlciAqLworCXdxX2xlbiA9IHNpemVvZihzdHJ1Y3QgZ3Vj X3dxX2l0ZW0pIC8gc2l6ZW9mKHUzMikgLSAxOworCXdxaS0+aGVhZGVyID0gV1FfVFlQRV9JTk9S REVSIHwKKwkJCSh3cV9sZW4gPDwgV1FfTEVOX1NISUZUKSB8CisJCQkocmluZ19pZCA8PCBXUV9U QVJHRVRfU0hJRlQpIHwKKwkJCVdRX05PX1dDRkxVU0hfV0FJVDsKKworCS8qIFRoZSBHdUMgd2Fu dHMgb25seSB0aGUgbG93LW9yZGVyIHdvcmQgb2YgdGhlIGNvbnRleHQgZGVzY3JpcHRvciAqLwor CXdxaS0+Y29udGV4dF9kZXNjID0gKHUzMilpbnRlbF9scl9jb250ZXh0X2Rlc2NyaXB0b3IocnEt PmN0eCwgcnEtPnJpbmcpOworCisJLyogVGhlIEd1QyBmaXJtd2FyZSB3YW50cyB0aGUgdGFpbCBp bmRleCBpbiBRV29yZHMsIG5vdCBieXRlcyAqLworCXRhaWwgPSBycS0+cmluZ2J1Zi0+dGFpbCA+ PiAzOworCXdxaS0+cmluZ190YWlsID0gdGFpbCA8PCBXUV9SSU5HX1RBSUxfU0hJRlQ7CisJd3Fp LT5mZW5jZV9pZCA9IDA7IC8qWFhYOiB3aGF0IGZlbmNlIHRvIGJlIGhlcmUgKi8KKworCWt1bm1h cF9hdG9taWMoYmFzZSk7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBpOTE1X2d1Y19zdWJt aXQoKSAtIFN1Ym1pdCBjb21tYW5kcyB0aHJvdWdoIEd1QworICogQGNsaWVudDoJdGhlIGd1YyBj bGllbnQgd2hlcmUgY29tbWFuZHMgd2lsbCBnbyB0aHJvdWdoCisgKiBAY3R4OglMUkMgd2hlcmUg Y29tbWFuZHMgY29tZSBmcm9tCisgKiBAcmluZzoJSFcgZW5naW5lIHRoYXQgd2lsbCBleGN1dGUg dGhlIGNvbW1hbmRzCisgKgorICogUmV0dXJuOgkwIGlmIHN1Y2NlZWQKKyAqLworaW50IGk5MTVf Z3VjX3N1Ym1pdChzdHJ1Y3QgaTkxNV9ndWNfY2xpZW50ICpjbGllbnQsCisJCSAgICBzdHJ1Y3Qg ZHJtX2k5MTVfZ2VtX3JlcXVlc3QgKnJxKQoreworCXN0cnVjdCBpbnRlbF9ndWMgKmd1YyA9IGNs aWVudC0+Z3VjOworCWVudW0gaW50ZWxfcmluZ19pZCByaW5nX2lkID0gcnEtPnJpbmctPmlkOwor CXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHFfcmV0LCBiX3JldDsKKworCXNwaW5fbG9ja19p cnFzYXZlKCZjbGllbnQtPndxX2xvY2ssIGZsYWdzKTsKKworCXFfcmV0ID0gZ3VjX2FkZF93b3Jr cXVldWVfaXRlbShjbGllbnQsIHJxKTsKKwlpZiAocV9yZXQgPT0gMCkKKwkJYl9yZXQgPSBndWNf cmluZ19kb29yYmVsbChjbGllbnQpOworCisJY2xpZW50LT5zdWJtaXNzaW9ucyArPSAxOworCWlm IChxX3JldCkgeworCQljbGllbnQtPnFfZmFpbCArPSAxOworCQljbGllbnQtPnJldGNvZGUgPSBx X3JldDsKKwl9IGVsc2UgaWYgKGJfcmV0KSB7CisJCWNsaWVudC0+Yl9mYWlsICs9IDE7CisJCWNs aWVudC0+cmV0Y29kZSA9IHFfcmV0ID0gYl9yZXQ7CisJfSBlbHNlIHsKKwkJY2xpZW50LT5yZXRj b2RlID0gMDsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2xpZW50LT53cV9sb2NrLCBm bGFncyk7CisKKwlzcGluX2xvY2soJmd1Yy0+aG9zdDJndWNfbG9jayk7CisJZ3VjLT5zdWJtaXNz aW9uc1tyaW5nX2lkXSArPSAxOworCWd1Yy0+bGFzdF9zZXFub1tyaW5nX2lkXSA9IHJxLT5zZXFu bzsKKwlzcGluX3VubG9jaygmZ3VjLT5ob3N0Mmd1Y19sb2NrKTsKKworCXJldHVybiBxX3JldDsK K30KKworLyoKKyAqIEV2ZXJ5dGhpbmcgYmVsb3cgaGVyZSBpcyBjb25jZXJuZWQgd2l0aCBzZXR1 cCAmIHRlYXJkb3duLCBhbmQgaXMKKyAqIHRoZXJlZm9yZSBub3QgcGFydCBvZiB0aGUgc29tZXdo YXQgdGltZS1jcml0aWNhbCBiYXRjaC1zdWJtaXNzaW9uCisgKiBwYXRoIG9mIGk5MTVfZ3VjX3N1 Ym1pdCgpIGFib3ZlLgorICovCisKKy8qKgogICogZ2VtX2FsbG9jYXRlX2d1Y19vYmooKSAtIEFs bG9jYXRlIGdlbSBvYmplY3QgZm9yIEd1QyB1c2FnZQogICogQGRldjoJZHJtIGRldmljZQogICog QHNpemU6CXNpemUgb2Ygb2JqZWN0CkBAIC03OSw2ICs1OTAsMTE5IEBAIHN0YXRpYyB2b2lkIGdl bV9yZWxlYXNlX2d1Y19vYmooc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaikKIAlkcm1f Z2VtX29iamVjdF91bnJlZmVyZW5jZSgmb2JqLT5iYXNlKTsKIH0KIAorc3RhdGljIHZvaWQgZ3Vj X2NsaWVudF9mcmVlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCisJCQkgICAgc3RydWN0IGk5MTVf Z3VjX2NsaWVudCAqY2xpZW50KQoreworCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJp diA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IGludGVsX2d1YyAqZ3VjID0gJmRldl9wcml2 LT5ndWM7CisKKwlpZiAoIWNsaWVudCkKKwkJcmV0dXJuOworCisJaWYgKGNsaWVudC0+ZG9vcmJl bGxfaWQgIT0gR1VDX0lOVkFMSURfRE9PUkJFTExfSUQpIHsKKwkJLyoKKwkJICogRmlyc3QgZGlz YWJsZSB0aGUgZG9vcmJlbGwsIHRoZW4gdGVsbCB0aGUgR3VDIHdlJ3ZlCisJCSAqIGZpbmlzaGVk IHdpdGggaXQsIGZpbmFsbHkgZGVhbGxvY2F0ZSBpdCBpbiBvdXIgYml0bWFwCisJCSAqLworCQln dWNfZGlzYWJsZV9kb29yYmVsbChndWMsIGNsaWVudCk7CisJCWhvc3QyZ3VjX3JlbGVhc2VfZG9v cmJlbGwoZ3VjLCBjbGllbnQpOworCQlyZWxlYXNlX2Rvb3JiZWxsKGd1YywgY2xpZW50LT5kb29y YmVsbF9pZCk7CisJfQorCisJLyoKKwkgKiBYWFg6IHdhaXQgZm9yIGFueSBvdXRzdGFuZGluZyBz dWJtaXNzaW9ucyBiZWZvcmUgZnJlZWluZyBtZW1vcnkuCisJICogQmUgc3VyZSB0byBkcm9wIGFu eSBsb2NrcworCSAqLworCisJZ2VtX3JlbGVhc2VfZ3VjX29iaihjbGllbnQtPmNsaWVudF9vYmop OworCisJaWYgKGNsaWVudC0+Y3R4X2luZGV4ICE9IEdVQ19JTlZBTElEX0NUWF9JRCkgeworCQln dWNfZmluaV9jdHhfZGVzYyhndWMsIGNsaWVudCk7CisJCWlkYV9zaW1wbGVfcmVtb3ZlKCZndWMt PmN0eF9pZHMsIGNsaWVudC0+Y3R4X2luZGV4KTsKKwl9CisKKwlrZnJlZShjbGllbnQpOworfQor CisvKioKKyAqIGd1Y19jbGllbnRfYWxsb2MoKSAtIEFsbG9jYXRlIGFuIGk5MTVfZ3VjX2NsaWVu dAorICogQGRldjoJZHJtIGRldmljZQorICogQHByaW9yaXR5Oglmb3VyIGxldmVscyBwcmlvcml0 eSBfQ1JJVElDQUwsIF9ISUdILCBfTk9STUFMIGFuZCBfTE9XCisgKiAJCVRoZSBrZXJuZWwgY2xp ZW50IHRvIHJlcGxhY2UgRXhlY0xpc3Qgc3VibWlzc2lvbiBpcyBjcmVhdGVkIHdpdGgKKyAqIAkJ Tk9STUFMIHByaW9yaXR5LiBQcmlvcml0eSBvZiBhIGNsaWVudCBmb3Igc2NoZWR1bGVyIGNhbiBi ZSBISUdILAorICogCQl3aGlsZSBhIHByZWVtcHRpb24gY29udGV4dCBjYW4gdXNlIENSSVRJQ0FM LgorICoKKyAqIFJldHVybjoJQW4gaTkxNV9ndWNfY2xpZW50IG9iamVjdCBpZiBzdWNjZXNzLgor ICovCitzdGF0aWMgc3RydWN0IGk5MTVfZ3VjX2NsaWVudCAqZ3VjX2NsaWVudF9hbGxvYyhzdHJ1 Y3QgZHJtX2RldmljZSAqZGV2LAorCQkJCQkJdWludDMyX3QgcHJpb3JpdHkpCit7CisJc3RydWN0 IGk5MTVfZ3VjX2NsaWVudCAqY2xpZW50OworCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZf cHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IGludGVsX2d1YyAqZ3VjID0gJmRldl9w cml2LT5ndWM7CisJc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iajsKKworCWNsaWVudCA9 IGt6YWxsb2Moc2l6ZW9mKCpjbGllbnQpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWNsaWVudCkKKwkJ cmV0dXJuIE5VTEw7CisKKwljbGllbnQtPmRvb3JiZWxsX2lkID0gR1VDX0lOVkFMSURfRE9PUkJF TExfSUQ7CisJY2xpZW50LT5wcmlvcml0eSA9IHByaW9yaXR5OworCWNsaWVudC0+Z3VjID0gZ3Vj OworCisJY2xpZW50LT5jdHhfaW5kZXggPSAodWludDMyX3QpaWRhX3NpbXBsZV9nZXQoJmd1Yy0+ Y3R4X2lkcywgMCwKKwkJCUdVQ19NQVhfR1BVX0NPTlRFWFRTLCBHRlBfS0VSTkVMKTsKKwlpZiAo Y2xpZW50LT5jdHhfaW5kZXggPj0gR1VDX01BWF9HUFVfQ09OVEVYVFMpIHsKKwkJY2xpZW50LT5j dHhfaW5kZXggPSBHVUNfSU5WQUxJRF9DVFhfSUQ7CisJCWdvdG8gZXJyOworCX0KKworCS8qIFRo ZSBmaXJzdCBwYWdlIGlzIGRvb3JiZWxsL3Byb2NfZGVzYy4gVHdvIGZvbGxvd2VkIHBhZ2VzIGFy ZSB3cS4gKi8KKwlvYmogPSBnZW1fYWxsb2NhdGVfZ3VjX29iaihkZXYsIEdVQ19EQl9TSVpFICsg R1VDX1dRX1NJWkUpOworCWlmICghb2JqKQorCQlnb3RvIGVycjsKKworCWNsaWVudC0+Y2xpZW50 X29iaiA9IG9iajsKKwljbGllbnQtPndxX29mZnNldCA9IEdVQ19EQl9TSVpFOworCWNsaWVudC0+ d3Ffc2l6ZSA9IEdVQ19XUV9TSVpFOworCXNwaW5fbG9ja19pbml0KCZjbGllbnQtPndxX2xvY2sp OworCisJY2xpZW50LT5kb29yYmVsbF9vZmZzZXQgPSBzZWxlY3RfZG9vcmJlbGxfY2FjaGVsaW5l KGd1Yyk7CisKKwkvKgorCSAqIFNpbmNlIHRoZSBkb29yYmVsbCBvbmx5IHJlcXVpcmVzIGEgc2lu Z2xlIGNhY2hlbGluZSwgd2UgY2FuIHNhdmUKKwkgKiBzcGFjZSBieSBwdXR0aW5nIHRoZSBhcHBs aWNhdGlvbiBwcm9jZXNzIGRlc2NyaXB0b3IgaW4gdGhlIHNhbWUKKwkgKiBwYWdlLiBVc2UgdGhl IGhhbGYgb2YgdGhlIHBhZ2UgdGhhdCBkb2Vzbid0IGluY2x1ZGUgdGhlIGRvb3JiZWxsLgorCSAq LworCWlmIChjbGllbnQtPmRvb3JiZWxsX29mZnNldCA+PSAoR1VDX0RCX1NJWkUgLyAyKSkKKwkJ Y2xpZW50LT5wcm9jX2Rlc2Nfb2Zmc2V0ID0gMDsKKwllbHNlCisJCWNsaWVudC0+cHJvY19kZXNj X29mZnNldCA9IChHVUNfREJfU0laRSAvIDIpOworCisJY2xpZW50LT5kb29yYmVsbF9pZCA9IGFz c2lnbl9kb29yYmVsbChndWMsIGNsaWVudC0+cHJpb3JpdHkpOworCWlmIChjbGllbnQtPmRvb3Ji ZWxsX2lkID09IEdVQ19JTlZBTElEX0RPT1JCRUxMX0lEKQorCQkvKiBYWFg6IGV2aWN0IGEgZG9v cmJlbGwgaW5zdGVhZCAqLworCQlnb3RvIGVycjsKKworCWd1Y19pbml0X3Byb2NfZGVzYyhndWMs IGNsaWVudCk7CisJZ3VjX2luaXRfY3R4X2Rlc2MoZ3VjLCBjbGllbnQpOworCWd1Y19pbml0X2Rv b3JiZWxsKGd1YywgY2xpZW50KTsKKworCS8qIFhYWDogQW55IGNhY2hlIGZsdXNoZXMgbmVlZGVk PyBHZW5lcmFsIGRvbWFpbiBtZ210IGNhbGxzPyAqLworCisJaWYgKGhvc3QyZ3VjX2FsbG9jYXRl X2Rvb3JiZWxsKGd1YywgY2xpZW50KSkKKwkJZ290byBlcnI7CisKKwlEUk1fREVCVUdfRFJJVkVS KCJuZXcgcHJpb3JpdHkgJXUgY2xpZW50ICVwOiBjdHhfaW5kZXggJXUgZGJfaWQgJXVcbiIsCisJ CXByaW9yaXR5LCBjbGllbnQsIGNsaWVudC0+Y3R4X2luZGV4LCBjbGllbnQtPmRvb3JiZWxsX2lk KTsKKworCXJldHVybiBjbGllbnQ7CisKK2VycjoKKwlndWNfY2xpZW50X2ZyZWUoZGV2LCBjbGll bnQpOworCXJldHVybiBOVUxMOworfQorCiBzdGF0aWMgdm9pZCBndWNfY3JlYXRlX2xvZyhzdHJ1 Y3QgaW50ZWxfZ3VjICpndWMpCiB7CiAJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2 ID0gZ3VjX3RvX2k5MTUoZ3VjKTsKQEAgLTE0Miw2ICs3NjYsOCBAQCBpbnQgaTkxNV9ndWNfc3Vi bWlzc2lvbl9pbml0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCiAJaWYgKCFndWMtPmN0eF9wb29s X29iaikKIAkJcmV0dXJuIC1FTk9NRU07CiAKKwlzcGluX2xvY2tfaW5pdCgmZGV2X3ByaXYtPmd1 Yy5ob3N0Mmd1Y19sb2NrKTsKKwogCWlkYV9pbml0KCZndWMtPmN0eF9pZHMpOwogCiAJZ3VjX2Ny ZWF0ZV9sb2coZ3VjKTsKQEAgLTE0OSw2ICs3NzUsMzIgQEAgaW50IGk5MTVfZ3VjX3N1Ym1pc3Np b25faW5pdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQogCXJldHVybiAwOwogfQogCitpbnQgaTkx NV9ndWNfc3VibWlzc2lvbl9lbmFibGUoc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3sKKwlzdHJ1 Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVj dCBpbnRlbF9ndWMgKmd1YyA9ICZkZXZfcHJpdi0+Z3VjOworCXN0cnVjdCBpOTE1X2d1Y19jbGll bnQgKmNsaWVudDsKKworCS8qIGNsaWVudCBmb3IgZXhlY2J1ZiBzdWJtaXNzaW9uICovCisJY2xp ZW50ID0gZ3VjX2NsaWVudF9hbGxvYyhkZXYsIEdVQ19DVFhfUFJJT1JJVFlfTk9STUFMKTsKKwlp ZiAoIWNsaWVudCkgeworCQlEUk1fRVJST1IoIkZhaWxlZCB0byBjcmVhdGUgZXhlY2J1ZiBndWNf Y2xpZW50XG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJZ3VjLT5leGVjYnVmX2NsaWVu dCA9IGNsaWVudDsKKwlyZXR1cm4gMDsKK30KKwordm9pZCBpOTE1X2d1Y19zdWJtaXNzaW9uX2Rp c2FibGUoc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0 ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBpbnRlbF9ndWMgKmd1YyA9 ICZkZXZfcHJpdi0+Z3VjOworCisJZ3VjX2NsaWVudF9mcmVlKGRldiwgZ3VjLT5leGVjYnVmX2Ns aWVudCk7CisJZ3VjLT5leGVjYnVmX2NsaWVudCA9IE5VTEw7Cit9CisKIHZvaWQgaTkxNV9ndWNf c3VibWlzc2lvbl9maW5pKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IGRybV9p OTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKZGlmZiAtLWdpdCBhL2Ry aXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2d1Yy5oIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50 ZWxfZ3VjLmgKaW5kZXggNWI1MWIwNS4uMDMyMWVlNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUv ZHJtL2k5MTUvaW50ZWxfZ3VjLmgKKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfZ3Vj LmgKQEAgLTI3LDYgKzI3LDMxIEBACiAjaW5jbHVkZSAiaW50ZWxfZ3VjX2Z3aWYuaCIKICNpbmNs dWRlICJpOTE1X2d1Y19yZWcuaCIKIAorc3RydWN0IGk5MTVfZ3VjX2NsaWVudCB7CisJc3RydWN0 IGRybV9pOTE1X2dlbV9vYmplY3QgKmNsaWVudF9vYmo7CisJc3RydWN0IGludGVsX2d1YyAqZ3Vj OworCXVpbnQzMl90IHByaW9yaXR5OworCXVpbnQzMl90IGN0eF9pbmRleDsKKworCXVpbnQzMl90 IHByb2NfZGVzY19vZmZzZXQ7CisJdWludDMyX3QgZG9vcmJlbGxfb2Zmc2V0OworCXVpbnQzMl90 IGNvb2tpZTsKKwl1aW50MTZfdCBkb29yYmVsbF9pZDsKKwl1aW50MTZfdCBwYWRkaW5nOwkJLyog TWFpbnRhaW4gYWxpZ25tZW50CQkqLworCisJdWludDMyX3Qgd3Ffb2Zmc2V0OworCXVpbnQzMl90 IHdxX3NpemU7CisKKwlzcGlubG9ja190IHdxX2xvY2s7CQkvKiBQcm90ZWN0cyBhbGwgZGF0YSBi ZWxvdwkqLworCXVpbnQzMl90IHdxX3RhaWw7CisKKwkvKiBHdUMgc3VibWlzc2lvbiBzdGF0aXN0 aWNzICYgc3RhdHVzICovCisJdWludDY0X3Qgc3VibWlzc2lvbnM7CisJdWludDMyX3QgcV9mYWls OworCXVpbnQzMl90IGJfZmFpbDsKKwlpbnQgcmV0Y29kZTsKK307CisKIGVudW0gaW50ZWxfZ3Vj X2Z3X3N0YXR1cyB7CiAJR1VDX0ZJUk1XQVJFX0ZBSUwgPSAtMSwKIAlHVUNfRklSTVdBUkVfTk9O RSA9IDAsCkBAIC02MCw2ICs4NSwyMyBAQCBzdHJ1Y3QgaW50ZWxfZ3VjIHsKIAogCXN0cnVjdCBk cm1faTkxNV9nZW1fb2JqZWN0ICpjdHhfcG9vbF9vYmo7CiAJc3RydWN0IGlkYSBjdHhfaWRzOwor CisJc3RydWN0IGk5MTVfZ3VjX2NsaWVudCAqZXhlY2J1Zl9jbGllbnQ7CisKKwlzcGlubG9ja190 IGhvc3QyZ3VjX2xvY2s7CS8qIFByb3RlY3RzIGFsbCBkYXRhIGJlbG93CSovCisKKwlERUNMQVJF X0JJVE1BUChkb29yYmVsbF9iaXRtYXAsIEdVQ19NQVhfRE9PUkJFTExTKTsKKwlpbnQgZGJfY2Fj aGVsaW5lOworCisJLyogQWN0aW9uIHN0YXR1cyAmIHN0YXRpc3RpY3MgKi8KKwl1aW50NjRfdCBh Y3Rpb25fY291bnQ7CQkvKiBUb3RhbCBjb21tYW5kcyBpc3N1ZWQJKi8KKwl1aW50MzJfdCBhY3Rp b25fY21kOwkJLyogTGFzdCBjb21tYW5kIHdvcmQJCSovCisJdWludDMyX3QgYWN0aW9uX3N0YXR1 czsJCS8qIExhc3QgcmV0dXJuIHN0YXR1cwkJKi8KKwl1aW50MzJfdCBhY3Rpb25fZmFpbDsJCS8q IFRvdGFsIG51bWJlciBvZiBmYWlsdXJlcwkqLworCWludDMyX3QgYWN0aW9uX2VycjsJCS8qIExh c3QgZXJyb3IgY29kZQkJKi8KKworCXVpbnQ2NF90IHN1Ym1pc3Npb25zW0k5MTVfTlVNX1JJTkdT XTsKKwl1aW50MzJfdCBsYXN0X3NlcW5vW0k5MTVfTlVNX1JJTkdTXTsKIH07CiAKIC8qIGludGVs X2d1Y19sb2FkZXIuYyAqLwpAQCAtNzAsNiArMTEyLDEwIEBAIGV4dGVybiBjb25zdCBjaGFyICpp bnRlbF9ndWNfZndfc3RhdHVzX3JlcHIoZW51bSBpbnRlbF9ndWNfZndfc3RhdHVzIHN0YXR1cyk7 CiAKIC8qIGk5MTVfZ3VjX3N1Ym1pc3Npb24uYyAqLwogaW50IGk5MTVfZ3VjX3N1Ym1pc3Npb25f aW5pdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKK2ludCBpOTE1X2d1Y19zdWJtaXNzaW9uX2Vu YWJsZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKK2ludCBpOTE1X2d1Y19zdWJtaXQoc3RydWN0 IGk5MTVfZ3VjX2NsaWVudCAqY2xpZW50LAorCQkgICAgc3RydWN0IGRybV9pOTE1X2dlbV9yZXF1 ZXN0ICpycSk7Cit2b2lkIGk5MTVfZ3VjX3N1Ym1pc3Npb25fZGlzYWJsZShzdHJ1Y3QgZHJtX2Rl dmljZSAqZGV2KTsKIHZvaWQgaTkxNV9ndWNfc3VibWlzc2lvbl9maW5pKHN0cnVjdCBkcm1fZGV2 aWNlICpkZXYpOwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2lu dGVsX2d1Y19sb2FkZXIuYyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2d1Y19sb2FkZXIu YwppbmRleCAwMzYwMTIwLi5iMzcxZTE1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkx NS9pbnRlbF9ndWNfbG9hZGVyLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfZ3Vj X2xvYWRlci5jCkBAIC0zNDQsNiArMzQ0LDggQEAgaW50IGludGVsX2d1Y191Y29kZV9sb2FkKHN0 cnVjdCBkcm1fZGV2aWNlICpkZXYpCiAJCWludGVsX2d1Y19md19zdGF0dXNfcmVwcihndWNfZnct Pmd1Y19md19mZXRjaF9zdGF0dXMpLAogCQlpbnRlbF9ndWNfZndfc3RhdHVzX3JlcHIoZ3VjX2Z3 LT5ndWNfZndfbG9hZF9zdGF0dXMpKTsKIAorCWk5MTVfZ3VjX3N1Ym1pc3Npb25fZGlzYWJsZShk ZXYpOworCiAJaWYgKGd1Y19mdy0+Z3VjX2Z3X2ZldGNoX3N0YXR1cyA9PSBHVUNfRklSTVdBUkVf Tk9ORSkKIAkJcmV0dXJuIDA7CiAKQEAgLTM5MSwxMiArMzkzLDIwIEBAIGludCBpbnRlbF9ndWNf dWNvZGVfbG9hZChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQogCQlpbnRlbF9ndWNfZndfc3RhdHVz X3JlcHIoZ3VjX2Z3LT5ndWNfZndfZmV0Y2hfc3RhdHVzKSwKIAkJaW50ZWxfZ3VjX2Z3X3N0YXR1 c19yZXByKGd1Y19mdy0+Z3VjX2Z3X2xvYWRfc3RhdHVzKSk7CiAKKwlpZiAoaTkxNS5lbmFibGVf Z3VjX3N1Ym1pc3Npb24pIHsKKwkJZXJyID0gaTkxNV9ndWNfc3VibWlzc2lvbl9lbmFibGUoZGV2 KTsKKwkJaWYgKGVycikKKwkJCWdvdG8gZmFpbDsKKwl9CisKIAlyZXR1cm4gMDsKIAogZmFpbDoK IAlpZiAoZ3VjX2Z3LT5ndWNfZndfbG9hZF9zdGF0dXMgPT0gR1VDX0ZJUk1XQVJFX1BFTkRJTkcp CiAJCWd1Y19mdy0+Z3VjX2Z3X2xvYWRfc3RhdHVzID0gR1VDX0ZJUk1XQVJFX0ZBSUw7CiAKKwlp OTE1X2d1Y19zdWJtaXNzaW9uX2Rpc2FibGUoZGV2KTsKKwogCXJldHVybiBlcnI7CiB9CiAKLS0g CjEuOS4xCgpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpJ bnRlbC1nZnggbWFpbGluZyBsaXN0CkludGVsLWdmeEBsaXN0cy5mcmVlZGVza3RvcC5vcmcKaHR0 cDovL2xpc3RzLmZyZWVkZXNrdG9wLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2ludGVsLWdmeAo=