From mboxrd@z Thu Jan 1 00:00:00 1970 From: Joonas Lahtinen Subject: [PATCH v4] drm/i915: Split out i915_vma.c Date: Fri, 11 Nov 2016 12:43:54 +0200 Message-ID: <1478861034-30643-1-git-send-email-joonas.lahtinen@linux.intel.com> References: <1478768144-11087-1-git-send-email-joonas.lahtinen@linux.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 ESMTPS id B9A296E8B8 for ; Fri, 11 Nov 2016 10:44:00 +0000 (UTC) In-Reply-To: <1478768144-11087-1-git-send-email-joonas.lahtinen@linux.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 graphics driver community testing & development List-Id: intel-gfx@lists.freedesktop.org QXMgYSBzaWRlIHByb2R1Y3QsIGhhZCB0byBzcGxpdCB0d28gb3RoZXIgZmlsZXM7Ci0gaTkxNV9n ZW1fZmVuY2VfcmVnLmgKLSBpOTE1X2dlbV9vYmplY3QuaCAob25seSBwYXJ0cyB0aGF0IG5lZWRl ZCBpbW1lZGlhdGUgdW50YW5nbGVtZW50KQoKSSB0cmllZCB0byBtb3ZlIGNvZGUgaW4gYXMgYmln IGNodW5rcyBhcyBwb3NzaWJsZSwgdG8gbWFrZSByZXZpZXcKZWFzaWVyLiBpOTE1X3ZtYV9jb21w YXJlIHdhcyBtb3ZlZCB0byBhIGhlYWRlciB0ZW1wb3JhcmlseS4KCnYyOgotIFVzZSBpOTE1X2dl bV9mZW5jZV9yZWcue2MsaH0KCnYzOgotIFJlYmFzZWQKCnY0OgotIEZpeCBidWlsZGluZyB3aGVu IERFQlVHX0dFTSBpcyBlbmFibGVkIGJ5IHJlb3JkZXJpbmcgYSBiaXQuCgpDYzogVHZydGtvIFVy c3VsaW4gPHR2cnRrby51cnN1bGluQGludGVsLmNvbT4KQ2M6IENocmlzIFdpbHNvbiA8Y2hyaXNA Y2hyaXMtd2lsc29uLmNvLnVrPgpBY2tlZC1ieTogQ2hyaXMgV2lsc29uIDxjaHJpc0BjaHJpcy13 aWxzb24uY28udWs+ClJldmlld2VkLWJ5OiBUdnJ0a28gVXJzdWxpbiA8dHZydGtvLnVyc3VsaW5A aW50ZWwuY29tPgpTaWduZWQtb2ZmLWJ5OiBKb29uYXMgTGFodGluZW4gPGpvb25hcy5sYWh0aW5l bkBsaW51eC5pbnRlbC5jb20+Ci0tLQogZHJpdmVycy9ncHUvZHJtL2k5MTUvTWFrZWZpbGUgICAg ICAgICAgICAgfCAgIDMgKy0KIGRyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZHJ2LmggICAgICAg ICAgIHwgMzg1ICstLS0tLS0tLS0tLS0tLS0KIGRyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZ2Vt LmMgICAgICAgICAgIHwgMzcxIC0tLS0tLS0tLS0tLS0tLS0KIGRyaXZlcnMvZ3B1L2RybS9pOTE1 L2k5MTVfZ2VtX2ZlbmNlLmMgICAgIHwgNzE2IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LQogZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9nZW1fZmVuY2VfcmVnLmMgfCA3MTYgKysrKysr KysrKysrKysrKysrKysrKysrKysrKysrCiBkcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2dlbV9m ZW5jZV9yZWcuaCB8ICA1MSArKysKIGRyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZ2VtX2d0dC5j ICAgICAgIHwgMjc3ICstLS0tLS0tLS0tLQogZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9nZW1f Z3R0LmggICAgICAgfCAyMjUgKy0tLS0tLS0tLQogZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9n ZW1fb2JqZWN0LmggICAgfCAzMzcgKysrKysrKysrKysrKysKIGRyaXZlcnMvZ3B1L2RybS9pOTE1 L2k5MTVfZ2VtX3JlcXVlc3QuaCAgIHwgICAzICsKIGRyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVf dm1hLmMgICAgICAgICAgIHwgNjUwICsrKysrKysrKysrKysrKysrKysrKysrKysrKwogZHJpdmVy cy9ncHUvZHJtL2k5MTUvaTkxNV92bWEuaCAgICAgICAgICAgfCAzNDIgKysrKysrKysrKysrKysK IDEyIGZpbGVzIGNoYW5nZWQsIDIxMjAgaW5zZXJ0aW9ucygrKSwgMTk1NiBkZWxldGlvbnMoLSkK IGRlbGV0ZSBtb2RlIDEwMDY0NCBkcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2dlbV9mZW5jZS5j CiBjcmVhdGUgbW9kZSAxMDA2NDQgZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9nZW1fZmVuY2Vf cmVnLmMKIGNyZWF0ZSBtb2RlIDEwMDY0NCBkcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2dlbV9m ZW5jZV9yZWcuaAogY3JlYXRlIG1vZGUgMTAwNjQ0IGRyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVf Z2VtX29iamVjdC5oCiBjcmVhdGUgbW9kZSAxMDA2NDQgZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkx NV92bWEuYwogY3JlYXRlIG1vZGUgMTAwNjQ0IGRyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfdm1h LmgKCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9NYWtlZmlsZSBiL2RyaXZlcnMv Z3B1L2RybS9pOTE1L01ha2VmaWxlCmluZGV4IDA4NTdlNTAuLjNkZWE0NmEgMTAwNjQ0Ci0tLSBh L2RyaXZlcnMvZ3B1L2RybS9pOTE1L01ha2VmaWxlCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1 L01ha2VmaWxlCkBAIC0zMyw3ICszMyw3IEBAIGk5MTUteSArPSBpOTE1X2NtZF9wYXJzZXIubyBc CiAJICBpOTE1X2dlbV9kbWFidWYubyBcCiAJICBpOTE1X2dlbV9ldmljdC5vIFwKIAkgIGk5MTVf Z2VtX2V4ZWNidWZmZXIubyBcCi0JICBpOTE1X2dlbV9mZW5jZS5vIFwKKwkgIGk5MTVfZ2VtX2Zl bmNlX3JlZy5vIFwKIAkgIGk5MTVfZ2VtX2d0dC5vIFwKIAkgIGk5MTVfZ2VtX2ludGVybmFsLm8g XAogCSAgaTkxNV9nZW0ubyBcCkBAIC00NSw2ICs0NSw3IEBAIGk5MTUteSArPSBpOTE1X2NtZF9w YXJzZXIubyBcCiAJICBpOTE1X2dlbV90aW1lbGluZS5vIFwKIAkgIGk5MTVfZ2VtX3VzZXJwdHIu byBcCiAJICBpOTE1X3RyYWNlX3BvaW50cy5vIFwKKwkgIGk5MTVfdm1hLm8gXAogCSAgaW50ZWxf YnJlYWRjcnVtYnMubyBcCiAJICBpbnRlbF9lbmdpbmVfY3MubyBcCiAJICBpbnRlbF9oYW5nY2hl Y2subyBcCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2Rydi5oIGIvZHJp dmVycy9ncHUvZHJtL2k5MTUvaTkxNV9kcnYuaAppbmRleCAzMDc3N2RlLi5jY2QwMzYxIDEwMDY0 NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2Rydi5oCisrKyBiL2RyaXZlcnMvZ3B1 L2RybS9pOTE1L2k5MTVfZHJ2LmgKQEAgLTYwLDExICs2MCwxNSBAQAogI2luY2x1ZGUgImludGVs X3JpbmdidWZmZXIuaCIKIAogI2luY2x1ZGUgImk5MTVfZ2VtLmgiCisjaW5jbHVkZSAiaTkxNV9n ZW1fZmVuY2VfcmVnLmgiCisjaW5jbHVkZSAiaTkxNV9nZW1fb2JqZWN0LmgiCiAjaW5jbHVkZSAi aTkxNV9nZW1fZ3R0LmgiCiAjaW5jbHVkZSAiaTkxNV9nZW1fcmVuZGVyX3N0YXRlLmgiCiAjaW5j bHVkZSAiaTkxNV9nZW1fcmVxdWVzdC5oIgogI2luY2x1ZGUgImk5MTVfZ2VtX3RpbWVsaW5lLmgi CiAKKyNpbmNsdWRlICJpOTE1X3ZtYS5oIgorCiAjaW5jbHVkZSAiaW50ZWxfZ3Z0LmgiCiAKIC8q IEdlbmVyYWwgY3VzdG9taXphdGlvbjoKQEAgLTQ1OSwyMyArNDYzLDYgQEAgc3RydWN0IGludGVs X29wcmVnaW9uIHsKIHN0cnVjdCBpbnRlbF9vdmVybGF5Owogc3RydWN0IGludGVsX292ZXJsYXlf ZXJyb3Jfc3RhdGU7CiAKLXN0cnVjdCBkcm1faTkxNV9mZW5jZV9yZWcgewotCXN0cnVjdCBsaXN0 X2hlYWQgbGluazsKLQlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqaTkxNTsKLQlzdHJ1Y3QgaTkx NV92bWEgKnZtYTsKLQlpbnQgcGluX2NvdW50OwotCWludCBpZDsKLQkvKioKLQkgKiBXaGV0aGVy IHRoZSB0aWxpbmcgcGFyYW1ldGVycyBmb3IgdGhlIGN1cnJlbnRseQotCSAqIGFzc29jaWF0ZWQg ZmVuY2UgcmVnaXN0ZXIgaGF2ZSBjaGFuZ2VkLiBOb3RlIHRoYXQKLQkgKiBmb3IgdGhlIHB1cnBv c2VzIG9mIHRyYWNraW5nIHRpbGluZyBjaGFuZ2VzIHdlIGFsc28KLQkgKiB0cmVhdCB0aGUgdW5m ZW5jZWQgcmVnaXN0ZXIsIHRoZSByZWdpc3RlciBzbG90IHRoYXQKLQkgKiB0aGUgb2JqZWN0IG9j Y3VwaWVzIHdoaWxzdCBpdCBleGVjdXRlcyBhIGZlbmNlZAotCSAqIGNvbW1hbmQgKHN1Y2ggYXMg QkxUIG9uIGdlbjIvMyksIGFzIGEgImZlbmNlIi4KLQkgKi8KLQlib29sIGRpcnR5OwotfTsKLQog c3RydWN0IHNkdm9fZGV2aWNlX21hcHBpbmcgewogCXU4IGluaXRpYWxpemVkOwogCXU4IGR2b19w b3J0OwpAQCAtMjE3OSwzMSArMjE2Niw2IEBAIGVudW0gaGRtaV9mb3JjZV9hdWRpbyB7CiAKICNk ZWZpbmUgSTkxNV9HVFRfT0ZGU0VUX05PTkUgKCh1MzIpLTEpCiAKLXN0cnVjdCBkcm1faTkxNV9n ZW1fb2JqZWN0X29wcyB7Ci0JdW5zaWduZWQgaW50IGZsYWdzOwotI2RlZmluZSBJOTE1X0dFTV9P QkpFQ1RfSEFTX1NUUlVDVF9QQUdFIDB4MQotI2RlZmluZSBJOTE1X0dFTV9PQkpFQ1RfSVNfU0hS SU5LQUJMRSAgIDB4MgotCi0JLyogSW50ZXJmYWNlIGJldHdlZW4gdGhlIEdFTSBvYmplY3QgYW5k IGl0cyBiYWNraW5nIHN0b3JhZ2UuCi0JICogZ2V0X3BhZ2VzKCkgaXMgY2FsbGVkIG9uY2UgcHJp b3IgdG8gdGhlIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBzZXQKLQkgKiBvZiBwYWdlcyBiZWZvcmUg dG8gYmluZGluZyB0aGVtIGludG8gdGhlIEdUVCwgYW5kIHB1dF9wYWdlcygpIGlzCi0JICogY2Fs bGVkIGFmdGVyIHdlIG5vIGxvbmdlciBuZWVkIHRoZW0uIEFzIHdlIGV4cGVjdCB0aGVyZSB0byBi ZQotCSAqIGFzc29jaWF0ZWQgY29zdCB3aXRoIG1pZ3JhdGluZyBwYWdlcyBiZXR3ZWVuIHRoZSBi YWNraW5nIHN0b3JhZ2UKLQkgKiBhbmQgbWFraW5nIHRoZW0gYXZhaWxhYmxlIGZvciB0aGUgR1BV IChlLmcuIGNsZmx1c2gpLCB3ZSBtYXkgaG9sZAotCSAqIG9udG8gdGhlIHBhZ2VzIGFmdGVyIHRo ZXkgYXJlIG5vIGxvbmdlciByZWZlcmVuY2VkIGJ5IHRoZSBHUFUKLQkgKiBpbiBjYXNlIHRoZXkg bWF5IGJlIHVzZWQgYWdhaW4gc2hvcnRseSAoZm9yIGV4YW1wbGUgbWlncmF0aW5nIHRoZQotCSAq IHBhZ2VzIHRvIGEgZGlmZmVyZW50IG1lbW9yeSBkb21haW4gd2l0aGluIHRoZSBHVFQpLiBwdXRf cGFnZXMoKQotCSAqIHdpbGwgdGhlcmVmb3JlIG1vc3QgbGlrZWx5IGJlIGNhbGxlZCB3aGVuIHRo ZSBvYmplY3QgaXRzZWxmIGlzCi0JICogYmVpbmcgcmVsZWFzZWQgb3IgdW5kZXIgbWVtb3J5IHBy ZXNzdXJlICh3aGVyZSB3ZSBhdHRlbXB0IHRvCi0JICogcmVhcCBwYWdlcyBmb3IgdGhlIHNocmlu a2VyKS4KLQkgKi8KLQlzdHJ1Y3Qgc2dfdGFibGUgKigqZ2V0X3BhZ2VzKShzdHJ1Y3QgZHJtX2k5 MTVfZ2VtX29iamVjdCAqKTsKLQl2b2lkICgqcHV0X3BhZ2VzKShzdHJ1Y3QgZHJtX2k5MTVfZ2Vt X29iamVjdCAqLCBzdHJ1Y3Qgc2dfdGFibGUgKik7Ci0KLQlpbnQgKCpkbWFidWZfZXhwb3J0KShz dHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqKTsKLQl2b2lkICgqcmVsZWFzZSkoc3RydWN0IGRy bV9pOTE1X2dlbV9vYmplY3QgKik7Ci19OwotCiAvKgogICogRnJvbnRidWZmZXIgdHJhY2tpbmcg Yml0cy4gU2V0IGluIG9iai0+ZnJvbnRidWZmZXJfYml0cyB3aGlsZSBhIGdlbSBibyBpcwogICog Y29uc2lkZXJlZCB0byBiZSB0aGUgZnJvbnRidWZmZXIgZm9yIHRoZSBnaXZlbiBwbGFuZSBpbnRl cmZhY2Utd2lzZS4gVGhpcwpAQCAtMjIyNSwyOTIgKzIxODcsNiBAQCBzdHJ1Y3QgZHJtX2k5MTVf Z2VtX29iamVjdF9vcHMgewogI2RlZmluZSBJTlRFTF9GUk9OVEJVRkZFUl9BTExfTUFTSyhwaXBl KSBcCiAJKDB4ZmYgPDwgKElOVEVMX0ZST05UQlVGRkVSX0JJVFNfUEVSX1BJUEUgKiAocGlwZSkp KQogCi1zdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCB7Ci0Jc3RydWN0IGRybV9nZW1fb2JqZWN0 IGJhc2U7Ci0KLQljb25zdCBzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdF9vcHMgKm9wczsKLQot CS8qKiBMaXN0IG9mIFZNQXMgYmFja2VkIGJ5IHRoaXMgb2JqZWN0ICovCi0Jc3RydWN0IGxpc3Rf aGVhZCB2bWFfbGlzdDsKLQlzdHJ1Y3QgcmJfcm9vdCB2bWFfdHJlZTsKLQotCS8qKiBTdG9sZW4g bWVtb3J5IGZvciB0aGlzIG9iamVjdCwgaW5zdGVhZCBvZiBiZWluZyBiYWNrZWQgYnkgc2htZW0u ICovCi0Jc3RydWN0IGRybV9tbV9ub2RlICpzdG9sZW47Ci0Jc3RydWN0IGxpc3RfaGVhZCBnbG9i YWxfbGluazsKLQl1bmlvbiB7Ci0JCXN0cnVjdCByY3VfaGVhZCByY3U7Ci0JCXN0cnVjdCBsbGlz dF9ub2RlIGZyZWVkOwotCX07Ci0KLQkvKioKLQkgKiBXaGV0aGVyIHRoZSBvYmplY3QgaXMgY3Vy cmVudGx5IGluIHRoZSBHR1RUIG1tYXAuCi0JICovCi0Jc3RydWN0IGxpc3RfaGVhZCB1c2VyZmF1 bHRfbGluazsKLQotCS8qKiBVc2VkIGluIGV4ZWNidWYgdG8gdGVtcG9yYXJpbHkgaG9sZCBhIHJl ZiAqLwotCXN0cnVjdCBsaXN0X2hlYWQgb2JqX2V4ZWNfbGluazsKLQotCXN0cnVjdCBsaXN0X2hl YWQgYmF0Y2hfcG9vbF9saW5rOwotCi0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCS8qKgotCSAq IEhhdmUgd2UgdGFrZW4gYSByZWZlcmVuY2UgZm9yIHRoZSBvYmplY3QgZm9yIGluY29tcGxldGUg R1BVCi0JICogYWN0aXZpdHk/Ci0JICovCi0jZGVmaW5lIEk5MTVfQk9fQUNUSVZFX1JFRiAwCi0K LQkvKgotCSAqIElzIHRoZSBvYmplY3QgdG8gYmUgbWFwcGVkIGFzIHJlYWQtb25seSB0byB0aGUg R1BVCi0JICogT25seSBob25vdXJlZCBpZiBoYXJkd2FyZSBoYXMgcmVsZXZhbnQgcHRlIGJpdAot CSAqLwotCXVuc2lnbmVkIGxvbmcgZ3Rfcm86MTsKLQl1bnNpZ25lZCBpbnQgY2FjaGVfbGV2ZWw6 MzsKLQl1bnNpZ25lZCBpbnQgY2FjaGVfZGlydHk6MTsKLQotCWF0b21pY190IGZyb250YnVmZmVy X2JpdHM7Ci0JdW5zaWduZWQgaW50IGZyb250YnVmZmVyX2dndHRfb3JpZ2luOyAvKiB3cml0ZSBv bmNlICovCi0KLQkvKiogQ3VycmVudCB0aWxpbmcgc3RyaWRlIGZvciB0aGUgb2JqZWN0LCBpZiBp dCdzIHRpbGVkLiAqLwotCXVuc2lnbmVkIGludCB0aWxpbmdfYW5kX3N0cmlkZTsKLSNkZWZpbmUg RkVOQ0VfTUlOSU1VTV9TVFJJREUgMTI4IC8qIFNlZSBpOTE1X3RpbGluZ19vaygpICovCi0jZGVm aW5lIFRJTElOR19NQVNLIChGRU5DRV9NSU5JTVVNX1NUUklERS0xKQotI2RlZmluZSBTVFJJREVf TUFTSyAoflRJTElOR19NQVNLKQotCi0JLyoqIENvdW50IG9mIFZNQSBhY3R1YWxseSBib3VuZCBi eSB0aGlzIG9iamVjdCAqLwotCXVuc2lnbmVkIGludCBiaW5kX2NvdW50OwotCXVuc2lnbmVkIGlu dCBhY3RpdmVfY291bnQ7Ci0JdW5zaWduZWQgaW50IHBpbl9kaXNwbGF5OwotCi0Jc3RydWN0IHsK LQkJc3RydWN0IG11dGV4IGxvY2s7IC8qIHByb3RlY3RzIHRoZSBwYWdlcyBhbmQgdGhlaXIgdXNl ICovCi0JCWF0b21pY190IHBhZ2VzX3Bpbl9jb3VudDsKLQotCQlzdHJ1Y3Qgc2dfdGFibGUgKnBh Z2VzOwotCQl2b2lkICptYXBwaW5nOwotCi0JCXN0cnVjdCBpOTE1X2dlbV9vYmplY3RfcGFnZV9p dGVyIHsKLQkJCXN0cnVjdCBzY2F0dGVybGlzdCAqc2dfcG9zOwotCQkJdW5zaWduZWQgaW50IHNn X2lkeDsgLyogaW4gcGFnZXMsIGJ1dCAzMmJpdCBlZWshICovCi0KLQkJCXN0cnVjdCByYWRpeF90 cmVlX3Jvb3QgcmFkaXg7Ci0JCQlzdHJ1Y3QgbXV0ZXggbG9jazsgLyogcHJvdGVjdHMgdGhpcyBj YWNoZSAqLwotCQl9IGdldF9wYWdlOwotCi0JCS8qKgotCQkgKiBBZHZpY2U6IGFyZSB0aGUgYmFj a2luZyBwYWdlcyBwdXJnZWFibGU/Ci0JCSAqLwotCQl1bnNpZ25lZCBpbnQgbWFkdjoyOwotCi0J CS8qKgotCQkgKiBUaGlzIGlzIHNldCBpZiB0aGUgb2JqZWN0IGhhcyBiZWVuIHdyaXR0ZW4gdG8g c2luY2UgdGhlCi0JCSAqIHBhZ2VzIHdlcmUgbGFzdCBhY3F1aXJlZC4KLQkJICovCi0JCWJvb2wg ZGlydHk6MTsKLQotCQkvKioKLQkJICogVGhpcyBpcyBzZXQgaWYgdGhlIG9iamVjdCBoYXMgYmVl biBwaW5uZWQgZHVlIHRvIHVua25vd24KLQkJICogc3dpenpsaW5nLgotCQkgKi8KLQkJYm9vbCBx dWlya2VkOjE7Ci0JfSBtbTsKLQotCS8qKiBCcmVhZGNydW1iIG9mIGxhc3QgcmVuZGVyaW5nIHRv IHRoZSBidWZmZXIuCi0JICogVGhlcmUgY2FuIG9ubHkgYmUgb25lIHdyaXRlciwgYnV0IHdlIGFs bG93IGZvciBtdWx0aXBsZSByZWFkZXJzLgotCSAqIElmIHRoZXJlIGlzIGEgd3JpdGVyIHRoYXQg bmVjZXNzYXJpbHkgaW1wbGllcyB0aGF0IGFsbCBvdGhlcgotCSAqIHJlYWQgcmVxdWVzdHMgYXJl IGNvbXBsZXRlIC0gYnV0IHdlIG1heSBvbmx5IGJlIGxhemlseSBjbGVhcmluZwotCSAqIHRoZSBy ZWFkIHJlcXVlc3RzLiBBIHJlYWQgcmVxdWVzdCBpcyBuYXR1cmFsbHkgdGhlIG1vc3QgcmVjZW50 Ci0JICogcmVxdWVzdCBvbiBhIHJpbmcsIHNvIHdlIG1heSBoYXZlIHR3byBkaWZmZXJlbnQgd3Jp dGUgYW5kIHJlYWQKLQkgKiByZXF1ZXN0cyBvbiBvbmUgcmluZyB3aGVyZSB0aGUgd3JpdGUgcmVx dWVzdCBpcyBvbGRlciB0aGFuIHRoZQotCSAqIHJlYWQgcmVxdWVzdC4gVGhpcyBhbGxvd3MgZm9y IHRoZSBDUFUgdG8gcmVhZCBmcm9tIGFuIGFjdGl2ZQotCSAqIGJ1ZmZlciBieSBvbmx5IHdhaXRp bmcgZm9yIHRoZSB3cml0ZSB0byBjb21wbGV0ZS4KLQkgKi8KLQlzdHJ1Y3QgcmVzZXJ2YXRpb25f b2JqZWN0ICpyZXN2OwotCi0JLyoqIFJlZmVyZW5jZXMgZnJvbSBmcmFtZWJ1ZmZlcnMsIGxvY2tz IG91dCB0aWxpbmcgY2hhbmdlcy4gKi8KLQl1bnNpZ25lZCBsb25nIGZyYW1lYnVmZmVyX3JlZmVy ZW5jZXM7Ci0KLQkvKiogUmVjb3JkIG9mIGFkZHJlc3MgYml0IDE3IG9mIGVhY2ggcGFnZSBhdCBs YXN0IHVuYmluZC4gKi8KLQl1bnNpZ25lZCBsb25nICpiaXRfMTc7Ci0KLQlzdHJ1Y3QgaTkxNV9n ZW1fdXNlcnB0ciB7Ci0JCXVpbnRwdHJfdCBwdHI7Ci0JCXVuc2lnbmVkIHJlYWRfb25seSA6MTsK LQotCQlzdHJ1Y3QgaTkxNV9tbV9zdHJ1Y3QgKm1tOwotCQlzdHJ1Y3QgaTkxNV9tbXVfb2JqZWN0 ICptbXVfb2JqZWN0OwotCQlzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcms7Ci0JfSB1c2VycHRyOwot Ci0JLyoqIGZvciBwaHlzIGFsbG9jYXRlZCBvYmplY3RzICovCi0Jc3RydWN0IGRybV9kbWFfaGFu ZGxlICpwaHlzX2hhbmRsZTsKLQotCXN0cnVjdCByZXNlcnZhdGlvbl9vYmplY3QgX19idWlsdGlu X3Jlc3Y7Ci19OwotCi1zdGF0aWMgaW5saW5lIHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICoK LXRvX2ludGVsX2JvKHN0cnVjdCBkcm1fZ2VtX29iamVjdCAqZ2VtKQotewotCS8qIEFzc2VydCB0 aGF0IHRvX2ludGVsX2JvKE5VTEwpID09IE5VTEwgKi8KLQlCVUlMRF9CVUdfT04ob2Zmc2V0b2Yo c3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QsIGJhc2UpKTsKLQotCXJldHVybiBjb250YWluZXJf b2YoZ2VtLCBzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCwgYmFzZSk7Ci19Ci0KLS8qKgotICog aTkxNV9nZW1fb2JqZWN0X2xvb2t1cF9yY3UgLSBsb29rIHVwIGEgdGVtcG9yYXJ5IEdFTSBvYmpl Y3QgZnJvbSBpdHMgaGFuZGxlCi0gKiBAZmlscDogRFJNIGZpbGUgcHJpdmF0ZSBkYXRlCi0gKiBA aGFuZGxlOiB1c2Vyc3BhY2UgaGFuZGxlCi0gKgotICogUmV0dXJuczoKLSAqCi0gKiBBIHBvaW50 ZXIgdG8gdGhlIG9iamVjdCBuYW1lZCBieSB0aGUgaGFuZGxlIGlmIHN1Y2ggZXhpc3RzIG9uIEBm aWxwLCBOVUxMCi0gKiBvdGhlcndpc2UuIFRoaXMgb2JqZWN0IGlzIG9ubHkgdmFsaWQgd2hpbHN0 IHVuZGVyIHRoZSBSQ1UgcmVhZCBsb2NrLCBhbmQKLSAqIG5vdGUgY2FyZWZ1bGx5IHRoZSBvYmpl Y3QgbWF5IGJlIGluIHRoZSBwcm9jZXNzIG9mIGJlaW5nIGRlc3Ryb3llZC4KLSAqLwotc3RhdGlj IGlubGluZSBzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqCi1pOTE1X2dlbV9vYmplY3RfbG9v a3VwX3JjdShzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGUsIHUzMiBoYW5kbGUpCi17Ci0jaWZkZWYgQ09O RklHX0xPQ0tERVAKLQlXQVJOX09OKGRlYnVnX2xvY2tzICYmICFsb2NrX2lzX2hlbGQoJnJjdV9s b2NrX21hcCkpOwotI2VuZGlmCi0JcmV0dXJuIGlkcl9maW5kKCZmaWxlLT5vYmplY3RfaWRyLCBo YW5kbGUpOwotfQotCi1zdGF0aWMgaW5saW5lIHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICoK LWk5MTVfZ2VtX29iamVjdF9sb29rdXAoc3RydWN0IGRybV9maWxlICpmaWxlLCB1MzIgaGFuZGxl KQotewotCXN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmo7Ci0KLQlyY3VfcmVhZF9sb2Nr KCk7Ci0Jb2JqID0gaTkxNV9nZW1fb2JqZWN0X2xvb2t1cF9yY3UoZmlsZSwgaGFuZGxlKTsKLQlp ZiAob2JqICYmICFrcmVmX2dldF91bmxlc3NfemVybygmb2JqLT5iYXNlLnJlZmNvdW50KSkKLQkJ b2JqID0gTlVMTDsKLQlyY3VfcmVhZF91bmxvY2soKTsKLQotCXJldHVybiBvYmo7Ci19Ci0KLV9f ZGVwcmVjYXRlZAotZXh0ZXJuIHN0cnVjdCBkcm1fZ2VtX29iamVjdCAqCi1kcm1fZ2VtX29iamVj dF9sb29rdXAoc3RydWN0IGRybV9maWxlICpmaWxlLCB1MzIgaGFuZGxlKTsKLQotX19hdHRyaWJ1 dGVfXygobm9ubnVsbCkpCi1zdGF0aWMgaW5saW5lIHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0 ICoKLWk5MTVfZ2VtX29iamVjdF9nZXQoc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaikK LXsKLQlkcm1fZ2VtX29iamVjdF9yZWZlcmVuY2UoJm9iai0+YmFzZSk7Ci0JcmV0dXJuIG9iajsK LX0KLQotX19kZXByZWNhdGVkCi1leHRlcm4gdm9pZCBkcm1fZ2VtX29iamVjdF9yZWZlcmVuY2Uo c3RydWN0IGRybV9nZW1fb2JqZWN0ICopOwotCi1fX2F0dHJpYnV0ZV9fKChub25udWxsKSkKLXN0 YXRpYyBpbmxpbmUgdm9pZAotaTkxNV9nZW1fb2JqZWN0X3B1dChzdHJ1Y3QgZHJtX2k5MTVfZ2Vt X29iamVjdCAqb2JqKQotewotCV9fZHJtX2dlbV9vYmplY3RfdW5yZWZlcmVuY2UoJm9iai0+YmFz ZSk7Ci19Ci0KLV9fZGVwcmVjYXRlZAotZXh0ZXJuIHZvaWQgZHJtX2dlbV9vYmplY3RfdW5yZWZl cmVuY2Uoc3RydWN0IGRybV9nZW1fb2JqZWN0ICopOwotCi1fX2RlcHJlY2F0ZWQKLWV4dGVybiB2 b2lkIGRybV9nZW1fb2JqZWN0X3VucmVmZXJlbmNlX3VubG9ja2VkKHN0cnVjdCBkcm1fZ2VtX29i amVjdCAqKTsKLQotc3RhdGljIGlubGluZSBib29sCi1pOTE1X2dlbV9vYmplY3RfaXNfZGVhZChj b25zdCBzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqKQotewotCXJldHVybiBhdG9taWNf cmVhZCgmb2JqLT5iYXNlLnJlZmNvdW50LnJlZmNvdW50KSA9PSAwOwotfQotCi1zdGF0aWMgaW5s aW5lIGJvb2wKLWk5MTVfZ2VtX29iamVjdF9oYXNfc3RydWN0X3BhZ2UoY29uc3Qgc3RydWN0IGRy bV9pOTE1X2dlbV9vYmplY3QgKm9iaikKLXsKLQlyZXR1cm4gb2JqLT5vcHMtPmZsYWdzICYgSTkx NV9HRU1fT0JKRUNUX0hBU19TVFJVQ1RfUEFHRTsKLX0KLQotc3RhdGljIGlubGluZSBib29sCi1p OTE1X2dlbV9vYmplY3RfaXNfc2hyaW5rYWJsZShjb25zdCBzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29i amVjdCAqb2JqKQotewotCXJldHVybiBvYmotPm9wcy0+ZmxhZ3MgJiBJOTE1X0dFTV9PQkpFQ1Rf SVNfU0hSSU5LQUJMRTsKLX0KLQotc3RhdGljIGlubGluZSBib29sCi1pOTE1X2dlbV9vYmplY3Rf aXNfYWN0aXZlKGNvbnN0IHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmopCi17Ci0JcmV0 dXJuIG9iai0+YWN0aXZlX2NvdW50OwotfQotCi1zdGF0aWMgaW5saW5lIGJvb2wKLWk5MTVfZ2Vt X29iamVjdF9oYXNfYWN0aXZlX3JlZmVyZW5jZShjb25zdCBzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29i amVjdCAqb2JqKQotewotCXJldHVybiB0ZXN0X2JpdChJOTE1X0JPX0FDVElWRV9SRUYsICZvYmot PmZsYWdzKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkCi1pOTE1X2dlbV9vYmplY3Rfc2V0X2Fj dGl2ZV9yZWZlcmVuY2Uoc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaikKLXsKLQlsb2Nr ZGVwX2Fzc2VydF9oZWxkKCZvYmotPmJhc2UuZGV2LT5zdHJ1Y3RfbXV0ZXgpOwotCV9fc2V0X2Jp dChJOTE1X0JPX0FDVElWRV9SRUYsICZvYmotPmZsYWdzKTsKLX0KLQotc3RhdGljIGlubGluZSB2 b2lkCi1pOTE1X2dlbV9vYmplY3RfY2xlYXJfYWN0aXZlX3JlZmVyZW5jZShzdHJ1Y3QgZHJtX2k5 MTVfZ2VtX29iamVjdCAqb2JqKQotewotCWxvY2tkZXBfYXNzZXJ0X2hlbGQoJm9iai0+YmFzZS5k ZXYtPnN0cnVjdF9tdXRleCk7Ci0JX19jbGVhcl9iaXQoSTkxNV9CT19BQ1RJVkVfUkVGLCAmb2Jq LT5mbGFncyk7Ci19Ci0KLXZvaWQgX19pOTE1X2dlbV9vYmplY3RfcmVsZWFzZV91bmxlc3NfYWN0 aXZlKHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmopOwotCi1zdGF0aWMgaW5saW5lIHVu c2lnbmVkIGludAotaTkxNV9nZW1fb2JqZWN0X2dldF90aWxpbmcoc3RydWN0IGRybV9pOTE1X2dl bV9vYmplY3QgKm9iaikKLXsKLQlyZXR1cm4gb2JqLT50aWxpbmdfYW5kX3N0cmlkZSAmIFRJTElO R19NQVNLOwotfQotCi1zdGF0aWMgaW5saW5lIGJvb2wKLWk5MTVfZ2VtX29iamVjdF9pc190aWxl ZChzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqKQotewotCXJldHVybiBpOTE1X2dlbV9v YmplY3RfZ2V0X3RpbGluZyhvYmopICE9IEk5MTVfVElMSU5HX05PTkU7Ci19Ci0KLXN0YXRpYyBp bmxpbmUgdW5zaWduZWQgaW50Ci1pOTE1X2dlbV9vYmplY3RfZ2V0X3N0cmlkZShzdHJ1Y3QgZHJt X2k5MTVfZ2VtX29iamVjdCAqb2JqKQotewotCXJldHVybiBvYmotPnRpbGluZ19hbmRfc3RyaWRl ICYgU1RSSURFX01BU0s7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgc3RydWN0IGludGVsX2VuZ2luZV9j cyAqCi1pOTE1X2dlbV9vYmplY3RfbGFzdF93cml0ZV9lbmdpbmUoc3RydWN0IGRybV9pOTE1X2dl bV9vYmplY3QgKm9iaikKLXsKLQlzdHJ1Y3QgaW50ZWxfZW5naW5lX2NzICplbmdpbmUgPSBOVUxM OwotCXN0cnVjdCBkbWFfZmVuY2UgKmZlbmNlOwotCi0JcmN1X3JlYWRfbG9jaygpOwotCWZlbmNl ID0gcmVzZXJ2YXRpb25fb2JqZWN0X2dldF9leGNsX3JjdShvYmotPnJlc3YpOwotCXJjdV9yZWFk X3VubG9jaygpOwotCi0JaWYgKGZlbmNlICYmIGRtYV9mZW5jZV9pc19pOTE1KGZlbmNlKSAmJiAh ZG1hX2ZlbmNlX2lzX3NpZ25hbGVkKGZlbmNlKSkKLQkJZW5naW5lID0gdG9fcmVxdWVzdChmZW5j ZSktPmVuZ2luZTsKLQlkbWFfZmVuY2VfcHV0KGZlbmNlKTsKLQotCXJldHVybiBlbmdpbmU7Ci19 Ci0KLXN0YXRpYyBpbmxpbmUgc3RydWN0IGk5MTVfdm1hICppOTE1X3ZtYV9nZXQoc3RydWN0IGk5 MTVfdm1hICp2bWEpCi17Ci0JaTkxNV9nZW1fb2JqZWN0X2dldCh2bWEtPm9iaik7Ci0JcmV0dXJu IHZtYTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIGk5MTVfdm1hX3B1dChzdHJ1Y3QgaTkxNV92 bWEgKnZtYSkKLXsKLQlpOTE1X2dlbV9vYmplY3RfcHV0KHZtYS0+b2JqKTsKLX0KLQogLyoKICAq IE9wdGltaXNlZCBTR0wgaXRlcmF0b3IgZm9yIEdFTSBvYmplY3RzCiAgKi8KQEAgLTMyMjIsMTMg KzI4OTgsNiBAQCBpOTE1X2dlbV9vYmplY3RfZ2d0dF9waW4oc3RydWN0IGRybV9pOTE1X2dlbV9v YmplY3QgKm9iaiwKIAkJCSB1NjQgYWxpZ25tZW50LAogCQkJIHU2NCBmbGFncyk7CiAKLWludCBp OTE1X3ZtYV9iaW5kKHN0cnVjdCBpOTE1X3ZtYSAqdm1hLCBlbnVtIGk5MTVfY2FjaGVfbGV2ZWwg Y2FjaGVfbGV2ZWwsCi0JCSAgdTMyIGZsYWdzKTsKLXZvaWQgX19pOTE1X3ZtYV9zZXRfbWFwX2Fu ZF9mZW5jZWFibGUoc3RydWN0IGk5MTVfdm1hICp2bWEpOwotaW50IF9fbXVzdF9jaGVjayBpOTE1 X3ZtYV91bmJpbmQoc3RydWN0IGk5MTVfdm1hICp2bWEpOwotdm9pZCBpOTE1X3ZtYV9jbG9zZShz dHJ1Y3QgaTkxNV92bWEgKnZtYSk7Ci12b2lkIGk5MTVfdm1hX2Rlc3Ryb3koc3RydWN0IGk5MTVf dm1hICp2bWEpOwotCiBpbnQgaTkxNV9nZW1fb2JqZWN0X3VuYmluZChzdHJ1Y3QgZHJtX2k5MTVf Z2VtX29iamVjdCAqb2JqKTsKIHZvaWQgaTkxNV9nZW1fcmVsZWFzZV9tbWFwKHN0cnVjdCBkcm1f aTkxNV9nZW1fb2JqZWN0ICpvYmopOwogCkBAIC0zNDc4LDU0ICszMTQ3LDEwIEBAIGk5MTVfZ2Vt X29iamVjdF9nZ3R0X29mZnNldChzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqbywKIAlyZXR1 cm4gaTkxNV9nZ3R0X29mZnNldChpOTE1X2dlbV9vYmplY3RfdG9fZ2d0dChvLCB2aWV3KSk7CiB9 CiAKLS8qIGk5MTVfZ2VtX2ZlbmNlLmMgKi8KKy8qIGk5MTVfZ2VtX2ZlbmNlX3JlZy5jICovCiBp bnQgX19tdXN0X2NoZWNrIGk5MTVfdm1hX2dldF9mZW5jZShzdHJ1Y3QgaTkxNV92bWEgKnZtYSk7 CiBpbnQgX19tdXN0X2NoZWNrIGk5MTVfdm1hX3B1dF9mZW5jZShzdHJ1Y3QgaTkxNV92bWEgKnZt YSk7CiAKLS8qKgotICogaTkxNV92bWFfcGluX2ZlbmNlIC0gcGluIGZlbmNpbmcgc3RhdGUKLSAq IEB2bWE6IHZtYSB0byBwaW4gZmVuY2luZyBmb3IKLSAqCi0gKiBUaGlzIHBpbnMgdGhlIGZlbmNp bmcgc3RhdGUgKHdoZXRoZXIgdGlsZWQgb3IgdW50aWxlZCkgdG8gbWFrZSBzdXJlIHRoZQotICog dm1hIChhbmQgaXRzIG9iamVjdCkgaXMgcmVhZHkgdG8gYmUgdXNlZCBhcyBhIHNjYW5vdXQgdGFy Z2V0LiBGZW5jaW5nCi0gKiBzdGF0dXMgbXVzdCBiZSBzeW5jaHJvbml6ZSBmaXJzdCBieSBjYWxs aW5nIGk5MTVfdm1hX2dldF9mZW5jZSgpOgotICoKLSAqIFRoZSByZXN1bHRpbmcgZmVuY2UgcGlu IHJlZmVyZW5jZSBtdXN0IGJlIHJlbGVhc2VkIGFnYWluIHdpdGgKLSAqIGk5MTVfdm1hX3VucGlu X2ZlbmNlKCkuCi0gKgotICogUmV0dXJuczoKLSAqCi0gKiBUcnVlIGlmIHRoZSB2bWEgaGFzIGEg ZmVuY2UsIGZhbHNlIG90aGVyd2lzZS4KLSAqLwotc3RhdGljIGlubGluZSBib29sCi1pOTE1X3Zt YV9waW5fZmVuY2Uoc3RydWN0IGk5MTVfdm1hICp2bWEpCi17Ci0JbG9ja2RlcF9hc3NlcnRfaGVs ZCgmdm1hLT52bS0+ZGV2LT5zdHJ1Y3RfbXV0ZXgpOwotCWlmICh2bWEtPmZlbmNlKSB7Ci0JCXZt YS0+ZmVuY2UtPnBpbl9jb3VudCsrOwotCQlyZXR1cm4gdHJ1ZTsKLQl9IGVsc2UKLQkJcmV0dXJu IGZhbHNlOwotfQotCi0vKioKLSAqIGk5MTVfdm1hX3VucGluX2ZlbmNlIC0gdW5waW4gZmVuY2lu ZyBzdGF0ZQotICogQHZtYTogdm1hIHRvIHVucGluIGZlbmNpbmcgZm9yCi0gKgotICogVGhpcyBy ZWxlYXNlcyB0aGUgZmVuY2UgcGluIHJlZmVyZW5jZSBhY3F1aXJlZCB0aHJvdWdoCi0gKiBpOTE1 X3ZtYV9waW5fZmVuY2UuIEl0IHdpbGwgaGFuZGxlIGJvdGggb2JqZWN0cyB3aXRoIGFuZCB3aXRo b3V0IGFuCi0gKiBhdHRhY2hlZCBmZW5jZSBjb3JyZWN0bHksIGNhbGxlcnMgZG8gbm90IG5lZWQg dG8gZGlzdGluZ3Vpc2ggdGhpcy4KLSAqLwotc3RhdGljIGlubGluZSB2b2lkCi1pOTE1X3ZtYV91 bnBpbl9mZW5jZShzdHJ1Y3QgaTkxNV92bWEgKnZtYSkKLXsKLQlsb2NrZGVwX2Fzc2VydF9oZWxk KCZ2bWEtPnZtLT5kZXYtPnN0cnVjdF9tdXRleCk7Ci0JaWYgKHZtYS0+ZmVuY2UpIHsKLQkJR0VN X0JVR19PTih2bWEtPmZlbmNlLT5waW5fY291bnQgPD0gMCk7Ci0JCXZtYS0+ZmVuY2UtPnBpbl9j b3VudC0tOwotCX0KLX0KLQogdm9pZCBpOTE1X2dlbV9yZXN0b3JlX2ZlbmNlcyhzdHJ1Y3QgZHJt X2RldmljZSAqZGV2KTsKIAogdm9pZCBpOTE1X2dlbV9kZXRlY3RfYml0XzZfc3dpenpsZShzdHJ1 Y3QgZHJtX2RldmljZSAqZGV2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5 MTVfZ2VtLmMgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2dlbS5jCmluZGV4IDFjMjBlZGIu LmQ1MWZiNWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZ2VtLmMKKysr IGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9nZW0uYwpAQCAtMjkxOSwxMTcgKzI5MTksNiBA QCBpOTE1X2dlbV93YWl0X2lvY3RsKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEs IHN0cnVjdCBkcm1fZmlsZSAqZmlsZSkKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgdm9pZCBf X2k5MTVfdm1hX2lvdW5tYXAoc3RydWN0IGk5MTVfdm1hICp2bWEpCi17Ci0JR0VNX0JVR19PTihp OTE1X3ZtYV9pc19waW5uZWQodm1hKSk7Ci0KLQlpZiAodm1hLT5pb21hcCA9PSBOVUxMKQotCQly ZXR1cm47Ci0KLQlpb19tYXBwaW5nX3VubWFwKHZtYS0+aW9tYXApOwotCXZtYS0+aW9tYXAgPSBO VUxMOwotfQotCi1pbnQgaTkxNV92bWFfdW5iaW5kKHN0cnVjdCBpOTE1X3ZtYSAqdm1hKQotewot CXN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmogPSB2bWEtPm9iajsKLQl1bnNpZ25lZCBs b25nIGFjdGl2ZTsKLQlpbnQgcmV0OwotCi0JbG9ja2RlcF9hc3NlcnRfaGVsZCgmb2JqLT5iYXNl LmRldi0+c3RydWN0X211dGV4KTsKLQotCS8qIEZpcnN0IHdhaXQgdXBvbiBhbnkgYWN0aXZpdHkg YXMgcmV0aXJpbmcgdGhlIHJlcXVlc3QgbWF5Ci0JICogaGF2ZSBzaWRlLWVmZmVjdHMgc3VjaCBh cyB1bnBpbm5pbmcgb3IgZXZlbiB1bmJpbmRpbmcgdGhpcyB2bWEuCi0JICovCi0JYWN0aXZlID0g aTkxNV92bWFfZ2V0X2FjdGl2ZSh2bWEpOwotCWlmIChhY3RpdmUpIHsKLQkJaW50IGlkeDsKLQot CQkvKiBXaGVuIGEgY2xvc2VkIFZNQSBpcyByZXRpcmVkLCBpdCBpcyB1bmJvdW5kIC0gZWVrLgot CQkgKiBJbiBvcmRlciB0byBwcmV2ZW50IGl0IGZyb20gYmVpbmcgcmVjdXJzaXZlbHkgY2xvc2Vk LAotCQkgKiB0YWtlIGEgcGluIG9uIHRoZSB2bWEgc28gdGhhdCB0aGUgc2Vjb25kIHVuYmluZCBp cwotCQkgKiBhYm9ydGVkLgotCQkgKgotCQkgKiBFdmVuIG1vcmUgc2NhcnkgaXMgdGhhdCB0aGUg cmV0aXJlIGNhbGxiYWNrIG1heSBmcmVlCi0JCSAqIHRoZSBvYmplY3QgKGxhc3QgYWN0aXZlIHZt YSkuIFRvIHByZXZlbnQgdGhlIGV4cGxvc2lvbgotCQkgKiB3ZSBkZWZlciB0aGUgYWN0dWFsIG9i amVjdCBmcmVlIHRvIGEgd29ya2VyIHRoYXQgY2FuCi0JCSAqIG9ubHkgcHJvY2VlZCBvbmNlIGl0 IGFjcXVpcmVzIHRoZSBzdHJ1Y3RfbXV0ZXggKHdoaWNoCi0JCSAqIHdlIGN1cnJlbnRseSBob2xk LCB0aGVyZWZvcmUgaXQgY2Fubm90IGZyZWUgdGhpcyBvYmplY3QKLQkJICogYmVmb3JlIHdlIGFy ZSBmaW5pc2hlZCkuCi0JCSAqLwotCQlfX2k5MTVfdm1hX3Bpbih2bWEpOwotCi0JCWZvcl9lYWNo X2FjdGl2ZShhY3RpdmUsIGlkeCkgewotCQkJcmV0ID0gaTkxNV9nZW1fYWN0aXZlX3JldGlyZSgm dm1hLT5sYXN0X3JlYWRbaWR4XSwKLQkJCQkJCSAgICZ2bWEtPnZtLT5kZXYtPnN0cnVjdF9tdXRl eCk7Ci0JCQlpZiAocmV0KQotCQkJCWJyZWFrOwotCQl9Ci0KLQkJX19pOTE1X3ZtYV91bnBpbih2 bWEpOwotCQlpZiAocmV0KQotCQkJcmV0dXJuIHJldDsKLQotCQlHRU1fQlVHX09OKGk5MTVfdm1h X2lzX2FjdGl2ZSh2bWEpKTsKLQl9Ci0KLQlpZiAoaTkxNV92bWFfaXNfcGlubmVkKHZtYSkpCi0J CXJldHVybiAtRUJVU1k7Ci0KLQlpZiAoIWRybV9tbV9ub2RlX2FsbG9jYXRlZCgmdm1hLT5ub2Rl KSkKLQkJZ290byBkZXN0cm95OwotCi0JR0VNX0JVR19PTihvYmotPmJpbmRfY291bnQgPT0gMCk7 Ci0JR0VNX0JVR19PTighaTkxNV9nZW1fb2JqZWN0X2hhc19waW5uZWRfcGFnZXMob2JqKSk7Ci0K LQlpZiAoaTkxNV92bWFfaXNfbWFwX2FuZF9mZW5jZWFibGUodm1hKSkgewotCQkvKiByZWxlYXNl IHRoZSBmZW5jZSByZWcgX2FmdGVyXyBmbHVzaGluZyAqLwotCQlyZXQgPSBpOTE1X3ZtYV9wdXRf ZmVuY2Uodm1hKTsKLQkJaWYgKHJldCkKLQkJCXJldHVybiByZXQ7Ci0KLQkJLyogRm9yY2UgYSBw YWdlZmF1bHQgZm9yIGRvbWFpbiB0cmFja2luZyBvbiBuZXh0IHVzZXIgYWNjZXNzICovCi0JCWk5 MTVfZ2VtX3JlbGVhc2VfbW1hcChvYmopOwotCi0JCV9faTkxNV92bWFfaW91bm1hcCh2bWEpOwot CQl2bWEtPmZsYWdzICY9IH5JOTE1X1ZNQV9DQU5fRkVOQ0U7Ci0JfQotCi0JaWYgKGxpa2VseSgh dm1hLT52bS0+Y2xvc2VkKSkgewotCQl0cmFjZV9pOTE1X3ZtYV91bmJpbmQodm1hKTsKLQkJdm1h LT52bS0+dW5iaW5kX3ZtYSh2bWEpOwotCX0KLQl2bWEtPmZsYWdzICY9IH4oSTkxNV9WTUFfR0xP QkFMX0JJTkQgfCBJOTE1X1ZNQV9MT0NBTF9CSU5EKTsKLQotCWRybV9tbV9yZW1vdmVfbm9kZSgm dm1hLT5ub2RlKTsKLQlsaXN0X21vdmVfdGFpbCgmdm1hLT52bV9saW5rLCAmdm1hLT52bS0+dW5i b3VuZF9saXN0KTsKLQotCWlmICh2bWEtPnBhZ2VzICE9IG9iai0+bW0ucGFnZXMpIHsKLQkJR0VN X0JVR19PTighdm1hLT5wYWdlcyk7Ci0JCXNnX2ZyZWVfdGFibGUodm1hLT5wYWdlcyk7Ci0JCWtm cmVlKHZtYS0+cGFnZXMpOwotCX0KLQl2bWEtPnBhZ2VzID0gTlVMTDsKLQotCS8qIFNpbmNlIHRo ZSB1bmJvdW5kIGxpc3QgaXMgZ2xvYmFsLCBvbmx5IG1vdmUgdG8gdGhhdCBsaXN0IGlmCi0JICog bm8gbW9yZSBWTUFzIGV4aXN0LiAqLwotCWlmICgtLW9iai0+YmluZF9jb3VudCA9PSAwKQotCQls aXN0X21vdmVfdGFpbCgmb2JqLT5nbG9iYWxfbGluaywKLQkJCSAgICAgICAmdG9faTkxNShvYmot PmJhc2UuZGV2KS0+bW0udW5ib3VuZF9saXN0KTsKLQotCS8qIEFuZCBmaW5hbGx5IG5vdyB0aGUg b2JqZWN0IGlzIGNvbXBsZXRlbHkgZGVjb3VwbGVkIGZyb20gdGhpcyB2bWEsCi0JICogd2UgY2Fu IGRyb3AgaXRzIGhvbGQgb24gdGhlIGJhY2tpbmcgc3RvcmFnZSBhbmQgYWxsb3cgaXQgdG8gYmUK LQkgKiByZWFwZWQgYnkgdGhlIHNocmlua2VyLgotCSAqLwotCWk5MTVfZ2VtX29iamVjdF91bnBp bl9wYWdlcyhvYmopOwotCi1kZXN0cm95OgotCWlmICh1bmxpa2VseShpOTE1X3ZtYV9pc19jbG9z ZWQodm1hKSkpCi0JCWk5MTVfdm1hX2Rlc3Ryb3kodm1hKTsKLQotCXJldHVybiAwOwotfQotCiBz dGF0aWMgaW50IHdhaXRfZm9yX3RpbWVsaW5lKHN0cnVjdCBpOTE1X2dlbV90aW1lbGluZSAqdGws IHVuc2lnbmVkIGludCBmbGFncykKIHsKIAlpbnQgcmV0LCBpOwpAQCAtMzA1NywxNzIgKzI5NDYs NiBAQCBpbnQgaTkxNV9nZW1fd2FpdF9mb3JfaWRsZShzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAq aTkxNSwgdW5zaWduZWQgaW50IGZsYWdzKQogCXJldHVybiAwOwogfQogCi1zdGF0aWMgYm9vbCBp OTE1X2dlbV92YWxpZF9ndHRfc3BhY2Uoc3RydWN0IGk5MTVfdm1hICp2bWEsCi0JCQkJICAgICB1 bnNpZ25lZCBsb25nIGNhY2hlX2xldmVsKQotewotCXN0cnVjdCBkcm1fbW1fbm9kZSAqZ3R0X3Nw YWNlID0gJnZtYS0+bm9kZTsKLQlzdHJ1Y3QgZHJtX21tX25vZGUgKm90aGVyOwotCi0JLyoKLQkg KiBPbiBzb21lIG1hY2hpbmVzIHdlIGhhdmUgdG8gYmUgY2FyZWZ1bCB3aGVuIHB1dHRpbmcgZGlm ZmVyaW5nIHR5cGVzCi0JICogb2Ygc25vb3BhYmxlIG1lbW9yeSB0b2dldGhlciB0byBhdm9pZCB0 aGUgcHJlZmV0Y2hlciBjcm9zc2luZyBtZW1vcnkKLQkgKiBkb21haW5zIGFuZCBkeWluZy4gRHVy aW5nIHZtIGluaXRpYWxpc2F0aW9uLCB3ZSBkZWNpZGUgd2hldGhlciBvciBub3QKLQkgKiB0aGVz ZSBjb25zdHJhaW50cyBhcHBseSBhbmQgc2V0IHRoZSBkcm1fbW0uY29sb3JfYWRqdXN0Ci0JICog YXBwcm9wcmlhdGVseS4KLQkgKi8KLQlpZiAodm1hLT52bS0+bW0uY29sb3JfYWRqdXN0ID09IE5V TEwpCi0JCXJldHVybiB0cnVlOwotCi0JaWYgKCFkcm1fbW1fbm9kZV9hbGxvY2F0ZWQoZ3R0X3Nw YWNlKSkKLQkJcmV0dXJuIHRydWU7Ci0KLQlpZiAobGlzdF9lbXB0eSgmZ3R0X3NwYWNlLT5ub2Rl X2xpc3QpKQotCQlyZXR1cm4gdHJ1ZTsKLQotCW90aGVyID0gbGlzdF9lbnRyeShndHRfc3BhY2Ut Pm5vZGVfbGlzdC5wcmV2LCBzdHJ1Y3QgZHJtX21tX25vZGUsIG5vZGVfbGlzdCk7Ci0JaWYgKG90 aGVyLT5hbGxvY2F0ZWQgJiYgIW90aGVyLT5ob2xlX2ZvbGxvd3MgJiYgb3RoZXItPmNvbG9yICE9 IGNhY2hlX2xldmVsKQotCQlyZXR1cm4gZmFsc2U7Ci0KLQlvdGhlciA9IGxpc3RfZW50cnkoZ3R0 X3NwYWNlLT5ub2RlX2xpc3QubmV4dCwgc3RydWN0IGRybV9tbV9ub2RlLCBub2RlX2xpc3QpOwot CWlmIChvdGhlci0+YWxsb2NhdGVkICYmICFndHRfc3BhY2UtPmhvbGVfZm9sbG93cyAmJiBvdGhl ci0+Y29sb3IgIT0gY2FjaGVfbGV2ZWwpCi0JCXJldHVybiBmYWxzZTsKLQotCXJldHVybiB0cnVl OwotfQotCi0vKioKLSAqIGk5MTVfdm1hX2luc2VydCAtIGZpbmRzIGEgc2xvdCBmb3IgdGhlIHZt YSBpbiBpdHMgYWRkcmVzcyBzcGFjZQotICogQHZtYTogdGhlIHZtYQotICogQHNpemU6IHJlcXVl c3RlZCBzaXplIGluIGJ5dGVzIChjYW4gYmUgbGFyZ2VyIHRoYW4gdGhlIFZNQSkKLSAqIEBhbGln bm1lbnQ6IHJlcXVpcmVkIGFsaWdubWVudAotICogQGZsYWdzOiBtYXNrIG9mIFBJTl8qIGZsYWdz IHRvIHVzZQotICoKLSAqIEZpcnN0IHdlIHRyeSB0byBhbGxvY2F0ZSBzb21lIGZyZWUgc3BhY2Ug dGhhdCBtZWV0cyB0aGUgcmVxdWlyZW1lbnRzIGZvcgotICogdGhlIFZNQS4gRmFpbGlpbmcgdGhh dCwgaWYgdGhlIGZsYWdzIHBlcm1pdCwgaXQgd2lsbCBldmljdCBhbiBvbGQgVk1BLAotICogcHJl ZmVycmFibHkgdGhlIG9sZGVzdCBpZGxlIGVudHJ5IHRvIG1ha2Ugcm9vbSBmb3IgdGhlIG5ldyBW TUEuCi0gKgotICogUmV0dXJuczoKLSAqIDAgb24gc3VjY2VzcywgbmVnYXRpdmUgZXJyb3IgY29k ZSBvdGhlcndpc2UuCi0gKi8KLXN0YXRpYyBpbnQKLWk5MTVfdm1hX2luc2VydChzdHJ1Y3QgaTkx NV92bWEgKnZtYSwgdTY0IHNpemUsIHU2NCBhbGlnbm1lbnQsIHU2NCBmbGFncykKLXsKLQlzdHJ1 Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSB0b19pOTE1KHZtYS0+dm0tPmRldik7Ci0J c3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaiA9IHZtYS0+b2JqOwotCXU2NCBzdGFydCwg ZW5kOwotCWludCByZXQ7Ci0KLQlHRU1fQlVHX09OKHZtYS0+ZmxhZ3MgJiAoSTkxNV9WTUFfR0xP QkFMX0JJTkQgfCBJOTE1X1ZNQV9MT0NBTF9CSU5EKSk7Ci0JR0VNX0JVR19PTihkcm1fbW1fbm9k ZV9hbGxvY2F0ZWQoJnZtYS0+bm9kZSkpOwotCi0Jc2l6ZSA9IG1heChzaXplLCB2bWEtPnNpemUp OwotCWlmIChmbGFncyAmIFBJTl9NQVBQQUJMRSkKLQkJc2l6ZSA9IGk5MTVfZ2VtX2dldF9nZ3R0 X3NpemUoZGV2X3ByaXYsIHNpemUsCi0JCQkJCSAgICAgIGk5MTVfZ2VtX29iamVjdF9nZXRfdGls aW5nKG9iaikpOwotCi0JYWxpZ25tZW50ID0gbWF4KG1heChhbGlnbm1lbnQsIHZtYS0+ZGlzcGxh eV9hbGlnbm1lbnQpLAotCQkJaTkxNV9nZW1fZ2V0X2dndHRfYWxpZ25tZW50KGRldl9wcml2LCBz aXplLAotCQkJCQkJICAgIGk5MTVfZ2VtX29iamVjdF9nZXRfdGlsaW5nKG9iaiksCi0JCQkJCQkg ICAgZmxhZ3MgJiBQSU5fTUFQUEFCTEUpKTsKLQotCXN0YXJ0ID0gZmxhZ3MgJiBQSU5fT0ZGU0VU X0JJQVMgPyBmbGFncyAmIFBJTl9PRkZTRVRfTUFTSyA6IDA7Ci0KLQllbmQgPSB2bWEtPnZtLT50 b3RhbDsKLQlpZiAoZmxhZ3MgJiBQSU5fTUFQUEFCTEUpCi0JCWVuZCA9IG1pbl90KHU2NCwgZW5k LCBkZXZfcHJpdi0+Z2d0dC5tYXBwYWJsZV9lbmQpOwotCWlmIChmbGFncyAmIFBJTl9aT05FXzRH KQotCQllbmQgPSBtaW5fdCh1NjQsIGVuZCwgKDFVTEwgPDwgMzIpIC0gUEFHRV9TSVpFKTsKLQot CS8qIElmIGJpbmRpbmcgdGhlIG9iamVjdC9HR1RUIHZpZXcgcmVxdWlyZXMgbW9yZSBzcGFjZSB0 aGFuIHRoZSBlbnRpcmUKLQkgKiBhcGVydHVyZSBoYXMsIHJlamVjdCBpdCBlYXJseSBiZWZvcmUg ZXZpY3RpbmcgZXZlcnl0aGluZyBpbiBhIHZhaW4KLQkgKiBhdHRlbXB0IHRvIGZpbmQgc3BhY2Uu Ci0JICovCi0JaWYgKHNpemUgPiBlbmQpIHsKLQkJRFJNX0RFQlVHKCJBdHRlbXB0aW5nIHRvIGJp bmQgYW4gb2JqZWN0IGxhcmdlciB0aGFuIHRoZSBhcGVydHVyZTogcmVxdWVzdD0lbGx1IFtvYmpl Y3Q9JXpkXSA+ICVzIGFwZXJ0dXJlPSVsbHVcbiIsCi0JCQkgIHNpemUsIG9iai0+YmFzZS5zaXpl LAotCQkJICBmbGFncyAmIFBJTl9NQVBQQUJMRSA/ICJtYXBwYWJsZSIgOiAidG90YWwiLAotCQkJ ICBlbmQpOwotCQlyZXR1cm4gLUUyQklHOwotCX0KLQotCXJldCA9IGk5MTVfZ2VtX29iamVjdF9w aW5fcGFnZXMob2JqKTsKLQlpZiAocmV0KQotCQlyZXR1cm4gcmV0OwotCi0JaWYgKGZsYWdzICYg UElOX09GRlNFVF9GSVhFRCkgewotCQl1NjQgb2Zmc2V0ID0gZmxhZ3MgJiBQSU5fT0ZGU0VUX01B U0s7Ci0JCWlmIChvZmZzZXQgJiAoYWxpZ25tZW50IC0gMSkgfHwgb2Zmc2V0ID4gZW5kIC0gc2l6 ZSkgewotCQkJcmV0ID0gLUVJTlZBTDsKLQkJCWdvdG8gZXJyX3VucGluOwotCQl9Ci0KLQkJdm1h LT5ub2RlLnN0YXJ0ID0gb2Zmc2V0OwotCQl2bWEtPm5vZGUuc2l6ZSA9IHNpemU7Ci0JCXZtYS0+ bm9kZS5jb2xvciA9IG9iai0+Y2FjaGVfbGV2ZWw7Ci0JCXJldCA9IGRybV9tbV9yZXNlcnZlX25v ZGUoJnZtYS0+dm0tPm1tLCAmdm1hLT5ub2RlKTsKLQkJaWYgKHJldCkgewotCQkJcmV0ID0gaTkx NV9nZW1fZXZpY3RfZm9yX3ZtYSh2bWEpOwotCQkJaWYgKHJldCA9PSAwKQotCQkJCXJldCA9IGRy bV9tbV9yZXNlcnZlX25vZGUoJnZtYS0+dm0tPm1tLCAmdm1hLT5ub2RlKTsKLQkJCWlmIChyZXQp Ci0JCQkJZ290byBlcnJfdW5waW47Ci0JCX0KLQl9IGVsc2UgewotCQl1MzIgc2VhcmNoX2ZsYWcs IGFsbG9jX2ZsYWc7Ci0KLQkJaWYgKGZsYWdzICYgUElOX0hJR0gpIHsKLQkJCXNlYXJjaF9mbGFn ID0gRFJNX01NX1NFQVJDSF9CRUxPVzsKLQkJCWFsbG9jX2ZsYWcgPSBEUk1fTU1fQ1JFQVRFX1RP UDsKLQkJfSBlbHNlIHsKLQkJCXNlYXJjaF9mbGFnID0gRFJNX01NX1NFQVJDSF9ERUZBVUxUOwot CQkJYWxsb2NfZmxhZyA9IERSTV9NTV9DUkVBVEVfREVGQVVMVDsKLQkJfQotCi0JCS8qIFdlIG9u bHkgYWxsb2NhdGUgaW4gUEFHRV9TSVpFL0dUVF9QQUdFX1NJWkUgKDQwOTYpIGNodW5rcywKLQkJ ICogc28gd2Uga25vdyB0aGF0IHdlIGFsd2F5cyBoYXZlIGEgbWluaW11bSBhbGlnbm1lbnQgb2Yg NDA5Ni4KLQkJICogVGhlIGRybV9tbSByYW5nZSBtYW5hZ2VyIGlzIG9wdGltaXNlZCB0byByZXR1 cm4gcmVzdWx0cwotCQkgKiB3aXRoIHplcm8gYWxpZ25tZW50LCBzbyB3aGVyZSBwb3NzaWJsZSB1 c2UgdGhlIG9wdGltYWwKLQkJICogcGF0aC4KLQkJICovCi0JCWlmIChhbGlnbm1lbnQgPD0gNDA5 NikKLQkJCWFsaWdubWVudCA9IDA7Ci0KLXNlYXJjaF9mcmVlOgotCQlyZXQgPSBkcm1fbW1faW5z ZXJ0X25vZGVfaW5fcmFuZ2VfZ2VuZXJpYygmdm1hLT52bS0+bW0sCi0JCQkJCQkJICAmdm1hLT5u b2RlLAotCQkJCQkJCSAgc2l6ZSwgYWxpZ25tZW50LAotCQkJCQkJCSAgb2JqLT5jYWNoZV9sZXZl bCwKLQkJCQkJCQkgIHN0YXJ0LCBlbmQsCi0JCQkJCQkJICBzZWFyY2hfZmxhZywKLQkJCQkJCQkg IGFsbG9jX2ZsYWcpOwotCQlpZiAocmV0KSB7Ci0JCQlyZXQgPSBpOTE1X2dlbV9ldmljdF9zb21l dGhpbmcodm1hLT52bSwgc2l6ZSwgYWxpZ25tZW50LAotCQkJCQkJICAgICAgIG9iai0+Y2FjaGVf bGV2ZWwsCi0JCQkJCQkgICAgICAgc3RhcnQsIGVuZCwKLQkJCQkJCSAgICAgICBmbGFncyk7Ci0J CQlpZiAocmV0ID09IDApCi0JCQkJZ290byBzZWFyY2hfZnJlZTsKLQotCQkJZ290byBlcnJfdW5w aW47Ci0JCX0KLQotCQlHRU1fQlVHX09OKHZtYS0+bm9kZS5zdGFydCA8IHN0YXJ0KTsKLQkJR0VN X0JVR19PTih2bWEtPm5vZGUuc3RhcnQgKyB2bWEtPm5vZGUuc2l6ZSA+IGVuZCk7Ci0JfQotCUdF TV9CVUdfT04oIWk5MTVfZ2VtX3ZhbGlkX2d0dF9zcGFjZSh2bWEsIG9iai0+Y2FjaGVfbGV2ZWwp KTsKLQotCWxpc3RfbW92ZV90YWlsKCZvYmotPmdsb2JhbF9saW5rLCAmZGV2X3ByaXYtPm1tLmJv dW5kX2xpc3QpOwotCWxpc3RfbW92ZV90YWlsKCZ2bWEtPnZtX2xpbmssICZ2bWEtPnZtLT5pbmFj dGl2ZV9saXN0KTsKLQlvYmotPmJpbmRfY291bnQrKzsKLQlHRU1fQlVHX09OKGF0b21pY19yZWFk KCZvYmotPm1tLnBhZ2VzX3Bpbl9jb3VudCkgPCBvYmotPmJpbmRfY291bnQpOwotCi0JcmV0dXJu IDA7Ci0KLWVycl91bnBpbjoKLQlpOTE1X2dlbV9vYmplY3RfdW5waW5fcGFnZXMob2JqKTsKLQly ZXR1cm4gcmV0OwotfQotCiB2b2lkIGk5MTVfZ2VtX2NsZmx1c2hfb2JqZWN0KHN0cnVjdCBkcm1f aTkxNV9nZW1fb2JqZWN0ICpvYmosCiAJCQkgICAgIGJvb2wgZm9yY2UpCiB7CkBAIC0zODE4LDEw MCArMzU0MSw2IEBAIGk5MTVfZ2VtX3JpbmdfdGhyb3R0bGUoc3RydWN0IGRybV9kZXZpY2UgKmRl diwgc3RydWN0IGRybV9maWxlICpmaWxlKQogCXJldHVybiByZXQgPCAwID8gcmV0IDogMDsKIH0K IAotc3RhdGljIGJvb2wKLWk5MTVfdm1hX21pc3BsYWNlZChzdHJ1Y3QgaTkxNV92bWEgKnZtYSwg dTY0IHNpemUsIHU2NCBhbGlnbm1lbnQsIHU2NCBmbGFncykKLXsKLQlpZiAoIWRybV9tbV9ub2Rl X2FsbG9jYXRlZCgmdm1hLT5ub2RlKSkKLQkJcmV0dXJuIGZhbHNlOwotCi0JaWYgKHZtYS0+bm9k ZS5zaXplIDwgc2l6ZSkKLQkJcmV0dXJuIHRydWU7Ci0KLQlpZiAoYWxpZ25tZW50ICYmIHZtYS0+ bm9kZS5zdGFydCAmIChhbGlnbm1lbnQgLSAxKSkKLQkJcmV0dXJuIHRydWU7Ci0KLQlpZiAoZmxh Z3MgJiBQSU5fTUFQUEFCTEUgJiYgIWk5MTVfdm1hX2lzX21hcF9hbmRfZmVuY2VhYmxlKHZtYSkp Ci0JCXJldHVybiB0cnVlOwotCi0JaWYgKGZsYWdzICYgUElOX09GRlNFVF9CSUFTICYmCi0JICAg IHZtYS0+bm9kZS5zdGFydCA8IChmbGFncyAmIFBJTl9PRkZTRVRfTUFTSykpCi0JCXJldHVybiB0 cnVlOwotCi0JaWYgKGZsYWdzICYgUElOX09GRlNFVF9GSVhFRCAmJgotCSAgICB2bWEtPm5vZGUu c3RhcnQgIT0gKGZsYWdzICYgUElOX09GRlNFVF9NQVNLKSkKLQkJcmV0dXJuIHRydWU7Ci0KLQly ZXR1cm4gZmFsc2U7Ci19Ci0KLXZvaWQgX19pOTE1X3ZtYV9zZXRfbWFwX2FuZF9mZW5jZWFibGUo c3RydWN0IGk5MTVfdm1hICp2bWEpCi17Ci0Jc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9i aiA9IHZtYS0+b2JqOwotCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IHRvX2k5 MTUob2JqLT5iYXNlLmRldik7Ci0JYm9vbCBtYXBwYWJsZSwgZmVuY2VhYmxlOwotCXUzMiBmZW5j ZV9zaXplLCBmZW5jZV9hbGlnbm1lbnQ7Ci0KLQlmZW5jZV9zaXplID0gaTkxNV9nZW1fZ2V0X2dn dHRfc2l6ZShkZXZfcHJpdiwKLQkJCQkJICAgIHZtYS0+c2l6ZSwKLQkJCQkJICAgIGk5MTVfZ2Vt X29iamVjdF9nZXRfdGlsaW5nKG9iaikpOwotCWZlbmNlX2FsaWdubWVudCA9IGk5MTVfZ2VtX2dl dF9nZ3R0X2FsaWdubWVudChkZXZfcHJpdiwKLQkJCQkJCSAgICAgIHZtYS0+c2l6ZSwKLQkJCQkJ CSAgICAgIGk5MTVfZ2VtX29iamVjdF9nZXRfdGlsaW5nKG9iaiksCi0JCQkJCQkgICAgICB0cnVl KTsKLQotCWZlbmNlYWJsZSA9ICh2bWEtPm5vZGUuc2l6ZSA9PSBmZW5jZV9zaXplICYmCi0JCSAg ICAgKHZtYS0+bm9kZS5zdGFydCAmIChmZW5jZV9hbGlnbm1lbnQgLSAxKSkgPT0gMCk7Ci0KLQlt YXBwYWJsZSA9ICh2bWEtPm5vZGUuc3RhcnQgKyBmZW5jZV9zaXplIDw9Ci0JCSAgICBkZXZfcHJp di0+Z2d0dC5tYXBwYWJsZV9lbmQpOwotCi0JLyoKLQkgKiBFeHBsaWNpdGx5IGRpc2FibGUgZm9y IHJvdGF0ZWQgVk1BIHNpbmNlIHRoZSBkaXNwbGF5IGRvZXMgbm90Ci0JICogbmVlZCB0aGUgZmVu Y2UgYW5kIHRoZSBWTUEgaXMgbm90IGFjY2Vzc2libGUgdG8gb3RoZXIgdXNlcnMuCi0JICovCi0J aWYgKG1hcHBhYmxlICYmIGZlbmNlYWJsZSAmJgotCSAgICB2bWEtPmdndHRfdmlldy50eXBlICE9 IEk5MTVfR0dUVF9WSUVXX1JPVEFURUQpCi0JCXZtYS0+ZmxhZ3MgfD0gSTkxNV9WTUFfQ0FOX0ZF TkNFOwotCWVsc2UKLQkJdm1hLT5mbGFncyAmPSB+STkxNV9WTUFfQ0FOX0ZFTkNFOwotfQotCi1p bnQgX19pOTE1X3ZtYV9kb19waW4oc3RydWN0IGk5MTVfdm1hICp2bWEsCi0JCSAgICAgIHU2NCBz aXplLCB1NjQgYWxpZ25tZW50LCB1NjQgZmxhZ3MpCi17Ci0JdW5zaWduZWQgaW50IGJvdW5kID0g dm1hLT5mbGFnczsKLQlpbnQgcmV0OwotCi0JbG9ja2RlcF9hc3NlcnRfaGVsZCgmdm1hLT52bS0+ ZGV2LT5zdHJ1Y3RfbXV0ZXgpOwotCUdFTV9CVUdfT04oKGZsYWdzICYgKFBJTl9HTE9CQUwgfCBQ SU5fVVNFUikpID09IDApOwotCUdFTV9CVUdfT04oKGZsYWdzICYgUElOX0dMT0JBTCkgJiYgIWk5 MTVfdm1hX2lzX2dndHQodm1hKSk7Ci0KLQlpZiAoV0FSTl9PTihib3VuZCAmIEk5MTVfVk1BX1BJ Tl9PVkVSRkxPVykpIHsKLQkJcmV0ID0gLUVCVVNZOwotCQlnb3RvIGVycjsKLQl9Ci0KLQlpZiAo KGJvdW5kICYgSTkxNV9WTUFfQklORF9NQVNLKSA9PSAwKSB7Ci0JCXJldCA9IGk5MTVfdm1hX2lu c2VydCh2bWEsIHNpemUsIGFsaWdubWVudCwgZmxhZ3MpOwotCQlpZiAocmV0KQotCQkJZ290byBl cnI7Ci0JfQotCi0JcmV0ID0gaTkxNV92bWFfYmluZCh2bWEsIHZtYS0+b2JqLT5jYWNoZV9sZXZl bCwgZmxhZ3MpOwotCWlmIChyZXQpCi0JCWdvdG8gZXJyOwotCi0JaWYgKChib3VuZCBeIHZtYS0+ ZmxhZ3MpICYgSTkxNV9WTUFfR0xPQkFMX0JJTkQpCi0JCV9faTkxNV92bWFfc2V0X21hcF9hbmRf ZmVuY2VhYmxlKHZtYSk7Ci0KLQlHRU1fQlVHX09OKGk5MTVfdm1hX21pc3BsYWNlZCh2bWEsIHNp emUsIGFsaWdubWVudCwgZmxhZ3MpKTsKLQlyZXR1cm4gMDsKLQotZXJyOgotCV9faTkxNV92bWFf dW5waW4odm1hKTsKLQlyZXR1cm4gcmV0OwotfQotCiBzdHJ1Y3QgaTkxNV92bWEgKgogaTkxNV9n ZW1fb2JqZWN0X2dndHRfcGluKHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmosCiAJCQkg Y29uc3Qgc3RydWN0IGk5MTVfZ2d0dF92aWV3ICp2aWV3LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9n cHUvZHJtL2k5MTUvaTkxNV9nZW1fZmVuY2UuYyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVf Z2VtX2ZlbmNlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkNTlkYmMuLjAwMDAw MDAKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9nZW1fZmVuY2UuYworKysgL2Rldi9u dWxsCkBAIC0xLDcxNiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IMKpIDIwMDgtMjAxNSBJbnRl bCBDb3Jwb3JhdGlvbgotICoKLSAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUg b2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCi0gKiBjb3B5IG9mIHRoaXMgc29m dHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIp LAotICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVk aW5nIHdpdGhvdXQgbGltaXRhdGlvbgotICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlm eSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCi0gKiBhbmQvb3Igc2Vs bCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0 aGUKLSAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9s bG93aW5nIGNvbmRpdGlvbnM6Ci0gKgotICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5k IHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAotICogcGFyYWdyYXBo KSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25z IG9mIHRoZQotICogU29mdHdhcmUuCi0gKgotICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJB UyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKLSAqIElNUExJ RUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hB TlRBQklMSVRZLAotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklO RlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCi0gKiBUSEUgQVVUSE9SUyBPUiBDT1BZUklH SFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgotICog TElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhF UldJU0UsIEFSSVNJTkcKLSAqIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhF IFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MKLSAqIElOIFRIRSBTT0ZUV0FS RS4KLSAqLwotCi0jaW5jbHVkZSA8ZHJtL2RybVAuaD4KLSNpbmNsdWRlIDxkcm0vaTkxNV9kcm0u aD4KLSNpbmNsdWRlICJpOTE1X2Rydi5oIgotCi0vKioKLSAqIERPQzogZmVuY2UgcmVnaXN0ZXIg aGFuZGxpbmcKLSAqCi0gKiBJbXBvcnRhbnQgdG8gYXZvaWQgY29uZnVzaW9uczogImZlbmNlcyIg aW4gdGhlIGk5MTUgZHJpdmVyIGFyZSBub3QgZXhlY3V0aW9uCi0gKiBmZW5jZXMgdXNlZCB0byB0 cmFjayBjb21tYW5kIGNvbXBsZXRpb24gYnV0IGhhcmR3YXJlIGRldGlsZXIgb2JqZWN0cyB3aGlj aAotICogd3JhcCBhIGdpdmVuIHJhbmdlIG9mIHRoZSBnbG9iYWwgR1RULiBFYWNoIHBsYXRmb3Jt IGhhcyBvbmx5IGEgZmFpcmx5IGxpbWl0ZWQKLSAqIHNldCBvZiB0aGVzZSBvYmplY3RzLgotICoK LSAqIEZlbmNlcyBhcmUgdXNlZCB0byBkZXRpbGUgR1RUIG1lbW9yeSBtYXBwaW5ncy4gVGhleSdy ZSBhbHNvIGNvbm5lY3RlZCB0byB0aGUKLSAqIGhhcmR3YXJlIGZyb250YnVmZmVyIHJlbmRlciB0 cmFja2luZyBhbmQgaGVuY2UgaW50ZXJhY3Qgd2l0aCBmcm9udGJ1ZmZlcgotICogY29tcHJlc3Np b24uIEZ1cnRoZXJtb3JlIG9uIG9sZGVyIHBsYXRmb3JtcyBmZW5jZXMgYXJlIHJlcXVpcmVkIGZv ciB0aWxlZAotICogb2JqZWN0cyB1c2VkIGJ5IHRoZSBkaXNwbGF5IGVuZ2luZS4gVGhleSBjYW4g YWxzbyBiZSB1c2VkIGJ5IHRoZSByZW5kZXIKLSAqIGVuZ2luZSAtIHRoZXkncmUgcmVxdWlyZWQg Zm9yIGJsaXR0ZXIgY29tbWFuZHMgYW5kIGFyZSBvcHRpb25hbCBmb3IgcmVuZGVyCi0gKiBjb21t YW5kcy4gQnV0IG9uIGdlbjQrIGJvdGggZGlzcGxheSAod2l0aCB0aGUgZXhjZXB0aW9uIG9mIGZi YykgYW5kIHJlbmRlcmluZwotICogaGF2ZSB0aGVpciBvd24gdGlsaW5nIHN0YXRlIGJpdHMgYW5k IGRvbid0IG5lZWQgZmVuY2VzLgotICoKLSAqIEFsc28gbm90ZSB0aGF0IGZlbmNlcyBvbmx5IHN1 cHBvcnQgWCBhbmQgWSB0aWxpbmcgYW5kIGhlbmNlIGNhbid0IGJlIHVzZWQgZm9yCi0gKiB0aGUg ZmFuY2llciBuZXcgdGlsaW5nIGZvcm1hdHMgbGlrZSBXLCBZcyBhbmQgWWYuCi0gKgotICogRmlu YWxseSBub3RlIHRoYXQgYmVjYXVzZSBmZW5jZXMgYXJlIHN1Y2ggYSByZXN0cmljdGVkIHJlc291 cmNlIHRoZXkncmUKLSAqIGR5bmFtaWNhbGx5IGFzc29jaWF0ZWQgd2l0aCBvYmplY3RzLiBGdXJ0 aGVybW9yZSBmZW5jZSBzdGF0ZSBpcyBjb21taXR0ZWQgdG8KLSAqIHRoZSBoYXJkd2FyZSBsYXpp bHkgdG8gYXZvaWQgdW5uZWNlc3Nhcnkgc3RhbGxzIG9uIGdlbjIvMy4gVGhlcmVmb3JlIGNvZGUg bXVzdAotICogZXhwbGljaXRseSBjYWxsIGk5MTVfZ2VtX29iamVjdF9nZXRfZmVuY2UoKSB0byBz eW5jaHJvbml6ZSBmZW5jaW5nIHN0YXR1cwotICogZm9yIGNwdSBhY2Nlc3MuIEFsc28gbm90ZSB0 aGF0IHNvbWUgY29kZSB3YW50cyBhbiB1bmZlbmNlZCB2aWV3LCBmb3IgdGhvc2UKLSAqIGNhc2Vz IHRoZSBmZW5jZSBjYW4gYmUgcmVtb3ZlZCBmb3JjZWZ1bGx5IHdpdGggaTkxNV9nZW1fb2JqZWN0 X3B1dF9mZW5jZSgpLgotICoKLSAqIEludGVybmFsbHkgdGhlc2UgZnVuY3Rpb25zIHdpbGwgc3lu Y2hyb25pemUgd2l0aCB1c2Vyc3BhY2UgYWNjZXNzIGJ5IHJlbW92aW5nCi0gKiBDUFUgcHRlcyBp bnRvIEdUVCBtbWFwcyAobm90IHRoZSBHVFQgcHRlcyB0aGVtc2VsdmVzKSBhcyBuZWVkZWQuCi0g Ki8KLQotI2RlZmluZSBwaXBlbGluZWQgMAotCi1zdGF0aWMgdm9pZCBpOTY1X3dyaXRlX2ZlbmNl X3JlZyhzdHJ1Y3QgZHJtX2k5MTVfZmVuY2VfcmVnICpmZW5jZSwKLQkJCQkgc3RydWN0IGk5MTVf dm1hICp2bWEpCi17Ci0JaTkxNV9yZWdfdCBmZW5jZV9yZWdfbG8sIGZlbmNlX3JlZ19oaTsKLQlp bnQgZmVuY2VfcGl0Y2hfc2hpZnQ7Ci0JdTY0IHZhbDsKLQotCWlmIChJTlRFTF9JTkZPKGZlbmNl LT5pOTE1KS0+Z2VuID49IDYpIHsKLQkJZmVuY2VfcmVnX2xvID0gRkVOQ0VfUkVHX0dFTjZfTE8o ZmVuY2UtPmlkKTsKLQkJZmVuY2VfcmVnX2hpID0gRkVOQ0VfUkVHX0dFTjZfSEkoZmVuY2UtPmlk KTsKLQkJZmVuY2VfcGl0Y2hfc2hpZnQgPSBHRU42X0ZFTkNFX1BJVENIX1NISUZUOwotCi0JfSBl bHNlIHsKLQkJZmVuY2VfcmVnX2xvID0gRkVOQ0VfUkVHXzk2NV9MTyhmZW5jZS0+aWQpOwotCQlm ZW5jZV9yZWdfaGkgPSBGRU5DRV9SRUdfOTY1X0hJKGZlbmNlLT5pZCk7Ci0JCWZlbmNlX3BpdGNo X3NoaWZ0ID0gSTk2NV9GRU5DRV9QSVRDSF9TSElGVDsKLQl9Ci0KLQl2YWwgPSAwOwotCWlmICh2 bWEpIHsKLQkJdW5zaWduZWQgaW50IHRpbGluZyA9IGk5MTVfZ2VtX29iamVjdF9nZXRfdGlsaW5n KHZtYS0+b2JqKTsKLQkJYm9vbCBpc195X3RpbGVkID0gdGlsaW5nID09IEk5MTVfVElMSU5HX1k7 Ci0JCXVuc2lnbmVkIGludCBzdHJpZGUgPSBpOTE1X2dlbV9vYmplY3RfZ2V0X3N0cmlkZSh2bWEt Pm9iaik7Ci0JCXUzMiByb3dfc2l6ZSA9IHN0cmlkZSAqIChpc195X3RpbGVkID8gMzIgOiA4KTsK LQkJdTMyIHNpemUgPSByb3VuZGRvd24oKHUzMil2bWEtPm5vZGUuc2l6ZSwgcm93X3NpemUpOwot Ci0JCXZhbCA9ICgodm1hLT5ub2RlLnN0YXJ0ICsgc2l6ZSAtIDQwOTYpICYgMHhmZmZmZjAwMCkg PDwgMzI7Ci0JCXZhbCB8PSB2bWEtPm5vZGUuc3RhcnQgJiAweGZmZmZmMDAwOwotCQl2YWwgfD0g KHU2NCkoKHN0cmlkZSAvIDEyOCkgLSAxKSA8PCBmZW5jZV9waXRjaF9zaGlmdDsKLQkJaWYgKGlz X3lfdGlsZWQpCi0JCQl2YWwgfD0gQklUKEk5NjVfRkVOQ0VfVElMSU5HX1lfU0hJRlQpOwotCQl2 YWwgfD0gSTk2NV9GRU5DRV9SRUdfVkFMSUQ7Ci0JfQotCi0JaWYgKCFwaXBlbGluZWQpIHsKLQkJ c3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZmVuY2UtPmk5MTU7Ci0KLQkJLyog VG8gdy9hIGluY29oZXJlbmN5IHdpdGggbm9uLWF0b21pYyA2NC1iaXQgcmVnaXN0ZXIgdXBkYXRl cywKLQkJICogd2Ugc3BsaXQgdGhlIDY0LWJpdCB1cGRhdGUgaW50byB0d28gMzItYml0IHdyaXRl cy4gSW4gb3JkZXIKLQkJICogZm9yIGEgcGFydGlhbCBmZW5jZSBub3QgdG8gYmUgZXZhbHVhdGVk IGJldHdlZW4gd3JpdGVzLCB3ZQotCQkgKiBwcmVjZWRlIHRoZSB1cGRhdGUgd2l0aCB3cml0ZSB0 byB0dXJuIG9mZiB0aGUgZmVuY2UgcmVnaXN0ZXIsCi0JCSAqIGFuZCBvbmx5IGVuYWJsZSB0aGUg ZmVuY2UgYXMgdGhlIGxhc3Qgc3RlcC4KLQkJICoKLQkJICogRm9yIGV4dHJhIGxldmVscyBvZiBw YXJhbm9pYSwgd2UgbWFrZSBzdXJlIGVhY2ggc3RlcCBsYW5kcwotCQkgKiBiZWZvcmUgYXBwbHlp bmcgdGhlIG5leHQgc3RlcC4KLQkJICovCi0JCUk5MTVfV1JJVEUoZmVuY2VfcmVnX2xvLCAwKTsK LQkJUE9TVElOR19SRUFEKGZlbmNlX3JlZ19sbyk7Ci0KLQkJSTkxNV9XUklURShmZW5jZV9yZWdf aGksIHVwcGVyXzMyX2JpdHModmFsKSk7Ci0JCUk5MTVfV1JJVEUoZmVuY2VfcmVnX2xvLCBsb3dl cl8zMl9iaXRzKHZhbCkpOwotCQlQT1NUSU5HX1JFQUQoZmVuY2VfcmVnX2xvKTsKLQl9Ci19Ci0K LXN0YXRpYyB2b2lkIGk5MTVfd3JpdGVfZmVuY2VfcmVnKHN0cnVjdCBkcm1faTkxNV9mZW5jZV9y ZWcgKmZlbmNlLAotCQkJCSBzdHJ1Y3QgaTkxNV92bWEgKnZtYSkKLXsKLQl1MzIgdmFsOwotCi0J dmFsID0gMDsKLQlpZiAodm1hKSB7Ci0JCXVuc2lnbmVkIGludCB0aWxpbmcgPSBpOTE1X2dlbV9v YmplY3RfZ2V0X3RpbGluZyh2bWEtPm9iaik7Ci0JCWJvb2wgaXNfeV90aWxlZCA9IHRpbGluZyA9 PSBJOTE1X1RJTElOR19ZOwotCQl1bnNpZ25lZCBpbnQgc3RyaWRlID0gaTkxNV9nZW1fb2JqZWN0 X2dldF9zdHJpZGUodm1hLT5vYmopOwotCQlpbnQgcGl0Y2hfdmFsOwotCQlpbnQgdGlsZV93aWR0 aDsKLQotCQlXQVJOKCh2bWEtPm5vZGUuc3RhcnQgJiB+STkxNV9GRU5DRV9TVEFSVF9NQVNLKSB8 fAotCQkgICAgICFpc19wb3dlcl9vZl8yKHZtYS0+bm9kZS5zaXplKSB8fAotCQkgICAgICh2bWEt Pm5vZGUuc3RhcnQgJiAodm1hLT5ub2RlLnNpemUgLSAxKSksCi0JCSAgICAgIm9iamVjdCAweCUw OGxseCBbZmVuY2VhYmxlPyAlZF0gbm90IDFNIG9yIHBvdC1zaXplICgweCUwOGxseCkgYWxpZ25l ZFxuIiwKLQkJICAgICB2bWEtPm5vZGUuc3RhcnQsCi0JCSAgICAgaTkxNV92bWFfaXNfbWFwX2Fu ZF9mZW5jZWFibGUodm1hKSwKLQkJICAgICB2bWEtPm5vZGUuc2l6ZSk7Ci0KLQkJaWYgKGlzX3lf dGlsZWQgJiYgSEFTXzEyOF9CWVRFX1lfVElMSU5HKGZlbmNlLT5pOTE1KSkKLQkJCXRpbGVfd2lk dGggPSAxMjg7Ci0JCWVsc2UKLQkJCXRpbGVfd2lkdGggPSA1MTI7Ci0KLQkJLyogTm90ZTogcGl0 Y2ggYmV0dGVyIGJlIGEgcG93ZXIgb2YgdHdvIHRpbGUgd2lkdGhzICovCi0JCXBpdGNoX3ZhbCA9 IHN0cmlkZSAvIHRpbGVfd2lkdGg7Ci0JCXBpdGNoX3ZhbCA9IGZmcyhwaXRjaF92YWwpIC0gMTsK LQotCQl2YWwgPSB2bWEtPm5vZGUuc3RhcnQ7Ci0JCWlmIChpc195X3RpbGVkKQotCQkJdmFsIHw9 IEJJVChJODMwX0ZFTkNFX1RJTElOR19ZX1NISUZUKTsKLQkJdmFsIHw9IEk5MTVfRkVOQ0VfU0la RV9CSVRTKHZtYS0+bm9kZS5zaXplKTsKLQkJdmFsIHw9IHBpdGNoX3ZhbCA8PCBJODMwX0ZFTkNF X1BJVENIX1NISUZUOwotCQl2YWwgfD0gSTgzMF9GRU5DRV9SRUdfVkFMSUQ7Ci0JfQotCi0JaWYg KCFwaXBlbGluZWQpIHsKLQkJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZmVu Y2UtPmk5MTU7Ci0JCWk5MTVfcmVnX3QgcmVnID0gRkVOQ0VfUkVHKGZlbmNlLT5pZCk7Ci0KLQkJ STkxNV9XUklURShyZWcsIHZhbCk7Ci0JCVBPU1RJTkdfUkVBRChyZWcpOwotCX0KLX0KLQotc3Rh dGljIHZvaWQgaTgzMF93cml0ZV9mZW5jZV9yZWcoc3RydWN0IGRybV9pOTE1X2ZlbmNlX3JlZyAq ZmVuY2UsCi0JCQkJIHN0cnVjdCBpOTE1X3ZtYSAqdm1hKQotewotCXUzMiB2YWw7Ci0KLQl2YWwg PSAwOwotCWlmICh2bWEpIHsKLQkJdW5zaWduZWQgaW50IHRpbGluZyA9IGk5MTVfZ2VtX29iamVj dF9nZXRfdGlsaW5nKHZtYS0+b2JqKTsKLQkJYm9vbCBpc195X3RpbGVkID0gdGlsaW5nID09IEk5 MTVfVElMSU5HX1k7Ci0JCXVuc2lnbmVkIGludCBzdHJpZGUgPSBpOTE1X2dlbV9vYmplY3RfZ2V0 X3N0cmlkZSh2bWEtPm9iaik7Ci0JCXUzMiBwaXRjaF92YWw7Ci0KLQkJV0FSTigodm1hLT5ub2Rl LnN0YXJ0ICYgfkk4MzBfRkVOQ0VfU1RBUlRfTUFTSykgfHwKLQkJICAgICAhaXNfcG93ZXJfb2Zf Mih2bWEtPm5vZGUuc2l6ZSkgfHwKLQkJICAgICAodm1hLT5ub2RlLnN0YXJ0ICYgKHZtYS0+bm9k ZS5zaXplIC0gMSkpLAotCQkgICAgICJvYmplY3QgMHglMDhsbHggbm90IDUxMksgb3IgcG90LXNp emUgMHglMDhsbHggYWxpZ25lZFxuIiwKLQkJICAgICB2bWEtPm5vZGUuc3RhcnQsIHZtYS0+bm9k ZS5zaXplKTsKLQotCQlwaXRjaF92YWwgPSBzdHJpZGUgLyAxMjg7Ci0JCXBpdGNoX3ZhbCA9IGZm cyhwaXRjaF92YWwpIC0gMTsKLQotCQl2YWwgPSB2bWEtPm5vZGUuc3RhcnQ7Ci0JCWlmIChpc195 X3RpbGVkKQotCQkJdmFsIHw9IEJJVChJODMwX0ZFTkNFX1RJTElOR19ZX1NISUZUKTsKLQkJdmFs IHw9IEk4MzBfRkVOQ0VfU0laRV9CSVRTKHZtYS0+bm9kZS5zaXplKTsKLQkJdmFsIHw9IHBpdGNo X3ZhbCA8PCBJODMwX0ZFTkNFX1BJVENIX1NISUZUOwotCQl2YWwgfD0gSTgzMF9GRU5DRV9SRUdf VkFMSUQ7Ci0JfQotCi0JaWYgKCFwaXBlbGluZWQpIHsKLQkJc3RydWN0IGRybV9pOTE1X3ByaXZh dGUgKmRldl9wcml2ID0gZmVuY2UtPmk5MTU7Ci0JCWk5MTVfcmVnX3QgcmVnID0gRkVOQ0VfUkVH KGZlbmNlLT5pZCk7Ci0KLQkJSTkxNV9XUklURShyZWcsIHZhbCk7Ci0JCVBPU1RJTkdfUkVBRChy ZWcpOwotCX0KLX0KLQotc3RhdGljIHZvaWQgZmVuY2Vfd3JpdGUoc3RydWN0IGRybV9pOTE1X2Zl bmNlX3JlZyAqZmVuY2UsCi0JCQlzdHJ1Y3QgaTkxNV92bWEgKnZtYSkKLXsKLQkvKiBQcmV2aW91 cyBhY2Nlc3MgdGhyb3VnaCB0aGUgZmVuY2UgcmVnaXN0ZXIgaXMgbWFyc2hhbGxlZCBieQotCSAq IHRoZSBtYigpIGluc2lkZSB0aGUgZmF1bHQgaGFuZGxlcnMgKGk5MTVfZ2VtX3JlbGVhc2VfbW1h cHMpCi0JICogYW5kIGV4cGxpY2l0bHkgbWFuYWdlZCBmb3IgaW50ZXJuYWwgdXNlcnMuCi0JICov Ci0KLQlpZiAoSVNfR0VOMihmZW5jZS0+aTkxNSkpCi0JCWk4MzBfd3JpdGVfZmVuY2VfcmVnKGZl bmNlLCB2bWEpOwotCWVsc2UgaWYgKElTX0dFTjMoZmVuY2UtPmk5MTUpKQotCQlpOTE1X3dyaXRl X2ZlbmNlX3JlZyhmZW5jZSwgdm1hKTsKLQllbHNlCi0JCWk5NjVfd3JpdGVfZmVuY2VfcmVnKGZl bmNlLCB2bWEpOwotCi0JLyogQWNjZXNzIHRocm91Z2ggdGhlIGZlbmNlZCByZWdpb24gYWZ0ZXJ3 YXJkcyBpcwotCSAqIG9yZGVyZWQgYnkgdGhlIHBvc3RpbmcgcmVhZHMgd2hpbHN0IHdyaXRpbmcg dGhlIHJlZ2lzdGVycy4KLQkgKi8KLQotCWZlbmNlLT5kaXJ0eSA9IGZhbHNlOwotfQotCi1zdGF0 aWMgaW50IGZlbmNlX3VwZGF0ZShzdHJ1Y3QgZHJtX2k5MTVfZmVuY2VfcmVnICpmZW5jZSwKLQkJ CXN0cnVjdCBpOTE1X3ZtYSAqdm1hKQotewotCWludCByZXQ7Ci0KLQlpZiAodm1hKSB7Ci0JCWlm ICghaTkxNV92bWFfaXNfbWFwX2FuZF9mZW5jZWFibGUodm1hKSkKLQkJCXJldHVybiAtRUlOVkFM OwotCi0JCWlmIChXQVJOKCFpOTE1X2dlbV9vYmplY3RfZ2V0X3N0cmlkZSh2bWEtPm9iaikgfHwK LQkJCSAhaTkxNV9nZW1fb2JqZWN0X2dldF90aWxpbmcodm1hLT5vYmopLAotCQkJICJib2d1cyBm ZW5jZSBzZXR1cCB3aXRoIHN0cmlkZTogMHgleCwgdGlsaW5nIG1vZGU6ICVpXG4iLAotCQkJIGk5 MTVfZ2VtX29iamVjdF9nZXRfc3RyaWRlKHZtYS0+b2JqKSwKLQkJCSBpOTE1X2dlbV9vYmplY3Rf Z2V0X3RpbGluZyh2bWEtPm9iaikpKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQkJcmV0ID0gaTkx NV9nZW1fYWN0aXZlX3JldGlyZSgmdm1hLT5sYXN0X2ZlbmNlLAotCQkJCQkgICAgICZ2bWEtPm9i ai0+YmFzZS5kZXYtPnN0cnVjdF9tdXRleCk7Ci0JCWlmIChyZXQpCi0JCQlyZXR1cm4gcmV0Owot CX0KLQotCWlmIChmZW5jZS0+dm1hKSB7Ci0JCXJldCA9IGk5MTVfZ2VtX2FjdGl2ZV9yZXRpcmUo JmZlbmNlLT52bWEtPmxhc3RfZmVuY2UsCi0JCQkJICAgICAgJmZlbmNlLT52bWEtPm9iai0+YmFz ZS5kZXYtPnN0cnVjdF9tdXRleCk7Ci0JCWlmIChyZXQpCi0JCQlyZXR1cm4gcmV0OwotCX0KLQot CWlmIChmZW5jZS0+dm1hICYmIGZlbmNlLT52bWEgIT0gdm1hKSB7Ci0JCS8qIEVuc3VyZSB0aGF0 IGFsbCB1c2Vyc3BhY2UgQ1BVIGFjY2VzcyBpcyBjb21wbGV0ZWQgYmVmb3JlCi0JCSAqIHN0ZWFs aW5nIHRoZSBmZW5jZS4KLQkJICovCi0JCWk5MTVfZ2VtX3JlbGVhc2VfbW1hcChmZW5jZS0+dm1h LT5vYmopOwotCi0JCWZlbmNlLT52bWEtPmZlbmNlID0gTlVMTDsKLQkJZmVuY2UtPnZtYSA9IE5V TEw7Ci0KLQkJbGlzdF9tb3ZlKCZmZW5jZS0+bGluaywgJmZlbmNlLT5pOTE1LT5tbS5mZW5jZV9s aXN0KTsKLQl9Ci0KLQlmZW5jZV93cml0ZShmZW5jZSwgdm1hKTsKLQotCWlmICh2bWEpIHsKLQkJ aWYgKGZlbmNlLT52bWEgIT0gdm1hKSB7Ci0JCQl2bWEtPmZlbmNlID0gZmVuY2U7Ci0JCQlmZW5j ZS0+dm1hID0gdm1hOwotCQl9Ci0KLQkJbGlzdF9tb3ZlX3RhaWwoJmZlbmNlLT5saW5rLCAmZmVu Y2UtPmk5MTUtPm1tLmZlbmNlX2xpc3QpOwotCX0KLQotCXJldHVybiAwOwotfQotCi0vKioKLSAq IGk5MTVfdm1hX3B1dF9mZW5jZSAtIGZvcmNlLXJlbW92ZSBmZW5jZSBmb3IgYSBWTUEKLSAqIEB2 bWE6IHZtYSB0byBtYXAgbGluZWFybHkgKG5vdCB0aHJvdWdoIGEgZmVuY2UgcmVnKQotICoKLSAq IFRoaXMgZnVuY3Rpb24gZm9yY2UtcmVtb3ZlcyBhbnkgZmVuY2UgZnJvbSB0aGUgZ2l2ZW4gb2Jq ZWN0LCB3aGljaCBpcyB1c2VmdWwKLSAqIGlmIHRoZSBrZXJuZWwgd2FudHMgdG8gZG8gdW50aWxl ZCBHVFQgYWNjZXNzLgotICoKLSAqIFJldHVybnM6Ci0gKgotICogMCBvbiBzdWNjZXNzLCBuZWdh dGl2ZSBlcnJvciBjb2RlIG9uIGZhaWx1cmUuCi0gKi8KLWludAotaTkxNV92bWFfcHV0X2ZlbmNl KHN0cnVjdCBpOTE1X3ZtYSAqdm1hKQotewotCXN0cnVjdCBkcm1faTkxNV9mZW5jZV9yZWcgKmZl bmNlID0gdm1hLT5mZW5jZTsKLQotCWFzc2VydF9ycG1fd2FrZWxvY2tfaGVsZCh0b19pOTE1KHZt YS0+dm0tPmRldikpOwotCi0JaWYgKCFmZW5jZSkKLQkJcmV0dXJuIDA7Ci0KLQlpZiAoZmVuY2Ut PnBpbl9jb3VudCkKLQkJcmV0dXJuIC1FQlVTWTsKLQotCXJldHVybiBmZW5jZV91cGRhdGUoZmVu Y2UsIE5VTEwpOwotfQotCi1zdGF0aWMgc3RydWN0IGRybV9pOTE1X2ZlbmNlX3JlZyAqZmVuY2Vf ZmluZChzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYpCi17Ci0Jc3RydWN0IGRybV9p OTE1X2ZlbmNlX3JlZyAqZmVuY2U7Ci0KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGZlbmNlLCAmZGV2 X3ByaXYtPm1tLmZlbmNlX2xpc3QsIGxpbmspIHsKLQkJaWYgKGZlbmNlLT5waW5fY291bnQpCi0J CQljb250aW51ZTsKLQotCQlyZXR1cm4gZmVuY2U7Ci0JfQotCi0JLyogV2FpdCBmb3IgY29tcGxl dGlvbiBvZiBwZW5kaW5nIGZsaXBzIHdoaWNoIGNvbnN1bWUgZmVuY2VzICovCi0JaWYgKGludGVs X2hhc19wZW5kaW5nX2ZiX3VucGluKCZkZXZfcHJpdi0+ZHJtKSkKLQkJcmV0dXJuIEVSUl9QVFIo LUVBR0FJTik7Ci0KLQlyZXR1cm4gRVJSX1BUUigtRURFQURMSyk7Ci19Ci0KLS8qKgotICogaTkx NV92bWFfZ2V0X2ZlbmNlIC0gc2V0IHVwIGZlbmNpbmcgZm9yIGEgdm1hCi0gKiBAdm1hOiB2bWEg dG8gbWFwIHRocm91Z2ggYSBmZW5jZSByZWcKLSAqCi0gKiBXaGVuIG1hcHBpbmcgb2JqZWN0cyB0 aHJvdWdoIHRoZSBHVFQsIHVzZXJzcGFjZSB3YW50cyB0byBiZSBhYmxlIHRvIHdyaXRlCi0gKiB0 byB0aGVtIHdpdGhvdXQgaGF2aW5nIHRvIHdvcnJ5IGFib3V0IHN3aXp6bGluZyBpZiB0aGUgb2Jq ZWN0IGlzIHRpbGVkLgotICogVGhpcyBmdW5jdGlvbiB3YWxrcyB0aGUgZmVuY2UgcmVncyBsb29r aW5nIGZvciBhIGZyZWUgb25lIGZvciBAb2JqLAotICogc3RlYWxpbmcgb25lIGlmIGl0IGNhbid0 IGZpbmQgYW55LgotICoKLSAqIEl0IHRoZW4gc2V0cyB1cCB0aGUgcmVnIGJhc2VkIG9uIHRoZSBv YmplY3QncyBwcm9wZXJ0aWVzOiBhZGRyZXNzLCBwaXRjaAotICogYW5kIHRpbGluZyBmb3JtYXQu Ci0gKgotICogRm9yIGFuIHVudGlsZWQgc3VyZmFjZSwgdGhpcyByZW1vdmVzIGFueSBleGlzdGlu ZyBmZW5jZS4KLSAqCi0gKiBSZXR1cm5zOgotICoKLSAqIDAgb24gc3VjY2VzcywgbmVnYXRpdmUg ZXJyb3IgY29kZSBvbiBmYWlsdXJlLgotICovCi1pbnQKLWk5MTVfdm1hX2dldF9mZW5jZShzdHJ1 Y3QgaTkxNV92bWEgKnZtYSkKLXsKLQlzdHJ1Y3QgZHJtX2k5MTVfZmVuY2VfcmVnICpmZW5jZTsK LQlzdHJ1Y3QgaTkxNV92bWEgKnNldCA9IGk5MTVfZ2VtX29iamVjdF9pc190aWxlZCh2bWEtPm9i aikgPyB2bWEgOiBOVUxMOwotCi0JLyogTm90ZSB0aGF0IHdlIHJldm9rZSBmZW5jZXMgb24gcnVu dGltZSBzdXNwZW5kLiBUaGVyZWZvcmUgdGhlIHVzZXIKLQkgKiBtdXN0IGtlZXAgdGhlIGRldmlj ZSBhd2FrZSB3aGlsc3QgdXNpbmcgdGhlIGZlbmNlLgotCSAqLwotCWFzc2VydF9ycG1fd2FrZWxv Y2tfaGVsZCh0b19pOTE1KHZtYS0+dm0tPmRldikpOwotCi0JLyogSnVzdCB1cGRhdGUgb3VyIHBs YWNlIGluIHRoZSBMUlUgaWYgb3VyIGZlbmNlIGlzIGdldHRpbmcgcmV1c2VkLiAqLwotCWlmICh2 bWEtPmZlbmNlKSB7Ci0JCWZlbmNlID0gdm1hLT5mZW5jZTsKLQkJaWYgKCFmZW5jZS0+ZGlydHkp IHsKLQkJCWxpc3RfbW92ZV90YWlsKCZmZW5jZS0+bGluaywKLQkJCQkgICAgICAgJmZlbmNlLT5p OTE1LT5tbS5mZW5jZV9saXN0KTsKLQkJCXJldHVybiAwOwotCQl9Ci0JfSBlbHNlIGlmIChzZXQp IHsKLQkJZmVuY2UgPSBmZW5jZV9maW5kKHRvX2k5MTUodm1hLT52bS0+ZGV2KSk7Ci0JCWlmIChJ U19FUlIoZmVuY2UpKQotCQkJcmV0dXJuIFBUUl9FUlIoZmVuY2UpOwotCX0gZWxzZQotCQlyZXR1 cm4gMDsKLQotCXJldHVybiBmZW5jZV91cGRhdGUoZmVuY2UsIHNldCk7Ci19Ci0KLS8qKgotICog aTkxNV9nZW1fcmVzdG9yZV9mZW5jZXMgLSByZXN0b3JlIGZlbmNlIHN0YXRlCi0gKiBAZGV2OiBE Uk0gZGV2aWNlCi0gKgotICogUmVzdG9yZSB0aGUgaHcgZmVuY2Ugc3RhdGUgdG8gbWF0Y2ggdGhl IHNvZnR3YXJlIHRyYWNraW5nIGFnYWluLCB0byBiZSBjYWxsZWQKLSAqIGFmdGVyIGEgZ3B1IHJl c2V0IGFuZCBvbiByZXN1bWUuIE5vdGUgdGhhdCBvbiBydW50aW1lIHN1c3BlbmQgd2Ugb25seSBj YW5jZWwKLSAqIHRoZSBmZW5jZXMsIHRvIGJlIHJlYWNxdWlyZWQgYnkgdGhlIHVzZXIgbGF0ZXIu Ci0gKi8KLXZvaWQgaTkxNV9nZW1fcmVzdG9yZV9mZW5jZXMoc3RydWN0IGRybV9kZXZpY2UgKmRl dikKLXsKLQlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSB0b19pOTE1KGRldik7 Ci0JaW50IGk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgZGV2X3ByaXYtPm51bV9mZW5jZV9yZWdzOyBp KyspIHsKLQkJc3RydWN0IGRybV9pOTE1X2ZlbmNlX3JlZyAqcmVnID0gJmRldl9wcml2LT5mZW5j ZV9yZWdzW2ldOwotCQlzdHJ1Y3QgaTkxNV92bWEgKnZtYSA9IHJlZy0+dm1hOwotCi0JCS8qCi0J CSAqIENvbW1pdCBkZWxheWVkIHRpbGluZyBjaGFuZ2VzIGlmIHdlIGhhdmUgYW4gb2JqZWN0IHN0 aWxsCi0JCSAqIGF0dGFjaGVkIHRvIHRoZSBmZW5jZSwgb3RoZXJ3aXNlIGp1c3QgY2xlYXIgdGhl IGZlbmNlLgotCQkgKi8KLQkJaWYgKHZtYSAmJiAhaTkxNV9nZW1fb2JqZWN0X2lzX3RpbGVkKHZt YS0+b2JqKSkgewotCQkJR0VNX0JVR19PTighcmVnLT5kaXJ0eSk7Ci0JCQlHRU1fQlVHX09OKCFs aXN0X2VtcHR5KCZ2bWEtPm9iai0+dXNlcmZhdWx0X2xpbmspKTsKLQotCQkJbGlzdF9tb3ZlKCZy ZWctPmxpbmssICZkZXZfcHJpdi0+bW0uZmVuY2VfbGlzdCk7Ci0JCQl2bWEtPmZlbmNlID0gTlVM TDsKLQkJCXZtYSA9IE5VTEw7Ci0JCX0KLQotCQlmZW5jZV93cml0ZShyZWcsIHZtYSk7Ci0JCXJl Zy0+dm1hID0gdm1hOwotCX0KLX0KLQotLyoqCi0gKiBET0M6IHRpbGluZyBzd2l6emxpbmcgZGV0 YWlscwotICoKLSAqIFRoZSBpZGVhIGJlaGluZCB0aWxpbmcgaXMgdG8gaW5jcmVhc2UgY2FjaGUg aGl0IHJhdGVzIGJ5IHJlYXJyYW5naW5nCi0gKiBwaXhlbCBkYXRhIHNvIHRoYXQgYSBncm91cCBv ZiBwaXhlbCBhY2Nlc3NlcyBhcmUgaW4gdGhlIHNhbWUgY2FjaGVsaW5lLgotICogUGVyZm9ybWFu Y2UgaW1wcm92ZW1lbnQgZnJvbSBkb2luZyB0aGlzIG9uIHRoZSBiYWNrL2RlcHRoIGJ1ZmZlciBh cmUgb24KLSAqIHRoZSBvcmRlciBvZiAzMCUuCi0gKgotICogSW50ZWwgYXJjaGl0ZWN0dXJlcyBt YWtlIHRoaXMgc29tZXdoYXQgbW9yZSBjb21wbGljYXRlZCwgdGhvdWdoLCBieQotICogYWRqdXN0 bWVudHMgbWFkZSB0byBhZGRyZXNzaW5nIG9mIGRhdGEgd2hlbiB0aGUgbWVtb3J5IGlzIGluIGlu dGVybGVhdmVkCi0gKiBtb2RlIChtYXRjaGVkIHBhaXJzIG9mIERJTU1TKSB0byBpbXByb3ZlIG1l bW9yeSBiYW5kd2lkdGguCi0gKiBGb3IgaW50ZXJsZWF2ZWQgbWVtb3J5LCB0aGUgQ1BVIHNlbmRz IGV2ZXJ5IHNlcXVlbnRpYWwgNjQgYnl0ZXMKLSAqIHRvIGFuIGFsdGVybmF0ZSBtZW1vcnkgY2hh bm5lbCBzbyBpdCBjYW4gZ2V0IHRoZSBiYW5kd2lkdGggZnJvbSBib3RoLgotICoKLSAqIFRoZSBH UFUgYWxzbyByZWFycmFuZ2VzIGl0cyBhY2Nlc3NlcyBmb3IgaW5jcmVhc2VkIGJhbmR3aWR0aCB0 byBpbnRlcmxlYXZlZAotICogbWVtb3J5LCBhbmQgaXQgbWF0Y2hlcyB3aGF0IHRoZSBDUFUgZG9l cyBmb3Igbm9uLXRpbGVkLiAgSG93ZXZlciwgd2hlbiB0aWxlZAotICogaXQgZG9lcyBpdCBhIGxp dHRsZSBkaWZmZXJlbnRseSwgc2luY2Ugb25lIHdhbGtzIGFkZHJlc3NlcyBub3QganVzdCBpbiB0 aGUKLSAqIFggZGlyZWN0aW9uIGJ1dCBhbHNvIFkuICBTbywgYWxvbmcgd2l0aCBhbHRlcm5hdGlu ZyBjaGFubmVscyB3aGVuIGJpdAotICogNiBvZiB0aGUgYWRkcmVzcyBmbGlwcywgaXQgYWxzbyBh bHRlcm5hdGVzIHdoZW4gb3RoZXIgYml0cyBmbGlwIC0tICBCaXRzIDkKLSAqIChldmVyeSA1MTIg Ynl0ZXMsIGFuIFggdGlsZSBzY2FubGluZSkgYW5kIDEwIChldmVyeSB0d28gWCB0aWxlIHNjYW5s aW5lcykKLSAqIGFyZSBjb21tb24gdG8gYm90aCB0aGUgOTE1IGFuZCA5NjUtY2xhc3MgaGFyZHdh cmUuCi0gKgotICogVGhlIENQVSBhbHNvIHNvbWV0aW1lcyBYT1JzIGluIGhpZ2hlciBiaXRzIGFz IHdlbGwsIHRvIGltcHJvdmUKLSAqIGJhbmR3aWR0aCBkb2luZyBzdHJpZGVkIGFjY2VzcyBsaWtl IHdlIGRvIHNvIGZyZXF1ZW50bHkgaW4gZ3JhcGhpY3MuICBUaGlzCi0gKiBpcyBjYWxsZWQgIkNo YW5uZWwgWE9SIFJhbmRvbWl6YXRpb24iIGluIHRoZSBNQ0ggZG9jdW1lbnRhdGlvbi4gIFRoZSBy ZXN1bHQKLSAqIGlzIHRoYXQgdGhlIENQVSBpcyBYT1JpbmcgaW4gZWl0aGVyIGJpdCAxMSBvciBi aXQgMTcgdG8gYml0IDYgb2YgaXRzIGFkZHJlc3MKLSAqIGRlY29kZS4KLSAqCi0gKiBBbGwgb2Yg dGhpcyBiaXQgNiBYT1JpbmcgaGFzIGFuIGVmZmVjdCBvbiBvdXIgbWVtb3J5IG1hbmFnZW1lbnQs Ci0gKiBhcyB3ZSBuZWVkIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSAzZCBkcml2ZXIgY2FuIGNvcnJl Y3RseSBhZGRyZXNzIG9iamVjdAotICogY29udGVudHMuCi0gKgotICogSWYgd2UgZG9uJ3QgaGF2 ZSBpbnRlcmxlYXZlZCBtZW1vcnksIGFsbCB0aWxpbmcgaXMgc2FmZSBhbmQgbm8gc3dpenpsaW5n IGlzCi0gKiByZXF1aXJlZC4KLSAqCi0gKiBXaGVuIGJpdCAxNyBpcyBYT1JlZCBpbiwgd2Ugc2lt cGx5IHJlZnVzZSB0byB0aWxlIGF0IGFsbC4gIEJpdAotICogMTcgaXMgbm90IGp1c3QgYSBwYWdl IG9mZnNldCwgc28gYXMgd2UgcGFnZSBhbiBvYmplY3Qgb3V0IGFuZCBiYWNrIGluLAotICogaW5k aXZpZHVhbCBwYWdlcyBpbiBpdCB3aWxsIGhhdmUgZGlmZmVyZW50IGJpdCAxNyBhZGRyZXNzZXMs IHJlc3VsdGluZyBpbgotICogZWFjaCA2NCBieXRlcyBiZWluZyBzd2FwcGVkIHdpdGggaXRzIG5l aWdoYm9yIQotICoKLSAqIE90aGVyd2lzZSwgaWYgaW50ZXJsZWF2ZWQsIHdlIGhhdmUgdG8gdGVs bCB0aGUgM2QgZHJpdmVyIHdoYXQgdGhlIGFkZHJlc3MKLSAqIHN3aXp6bGluZyBpdCBuZWVkcyB0 byBkbyBpcywgc2luY2UgaXQncyB3cml0aW5nIHdpdGggdGhlIENQVSB0byB0aGUgcGFnZXMKLSAq IChiaXQgNiBhbmQgcG90ZW50aWFsbHkgYml0IDExIFhPUmVkIGluKSwgYW5kIHRoZSBHUFUgaXMg cmVhZGluZyBmcm9tIHRoZQotICogcGFnZXMgKGJpdCA2LCA5LCBhbmQgMTAgWE9SZWQgaW4pLCBy ZXN1bHRpbmcgaW4gYSBjdW11bGF0aXZlIGJpdCBzd2l6emxpbmcKLSAqIHJlcXVpcmVkIGJ5IHRo ZSBDUFUgb2YgWE9SaW5nIGluIGJpdCA2LCA5LCAxMCwgYW5kIHBvdGVudGlhbGx5IDExLCBpbiBv cmRlcgotICogdG8gbWF0Y2ggd2hhdCB0aGUgR1BVIGV4cGVjdHMuCi0gKi8KLQotLyoqCi0gKiBp OTE1X2dlbV9kZXRlY3RfYml0XzZfc3dpenpsZSAtIGRldGVjdCBiaXQgNiBzd2l6emxpbmcgcGF0 dGVybgotICogQGRldjogRFJNIGRldmljZQotICoKLSAqIERldGVjdHMgYml0IDYgc3dpenpsaW5n IG9mIGFkZHJlc3MgbG9va3VwIGJldHdlZW4gSUdEIGFjY2VzcyBhbmQgQ1BVCi0gKiBhY2Nlc3Mg dGhyb3VnaCBtYWluIG1lbW9yeS4KLSAqLwotdm9pZAotaTkxNV9nZW1fZGV0ZWN0X2JpdF82X3N3 aXp6bGUoc3RydWN0IGRybV9kZXZpY2UgKmRldikKLXsKLQlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0 ZSAqZGV2X3ByaXYgPSB0b19pOTE1KGRldik7Ci0JdWludDMyX3Qgc3dpenpsZV94ID0gSTkxNV9C SVRfNl9TV0laWkxFX1VOS05PV047Ci0JdWludDMyX3Qgc3dpenpsZV95ID0gSTkxNV9CSVRfNl9T V0laWkxFX1VOS05PV047Ci0KLQlpZiAoSU5URUxfR0VOKGRldl9wcml2KSA+PSA4IHx8IElTX1ZB TExFWVZJRVcoZGV2X3ByaXYpKSB7Ci0JCS8qCi0JCSAqIE9uIEJEVyssIHN3aXp6bGluZyBpcyBu b3QgdXNlZC4gV2UgbGVhdmUgdGhlIENQVSBtZW1vcnkKLQkJICogY29udHJvbGxlciBpbiBjaGFy Z2Ugb2Ygb3B0aW1pemluZyBtZW1vcnkgYWNjZXNzZXMgd2l0aG91dAotCQkgKiB0aGUgZXh0cmEg YWRkcmVzcyBtYW5pcHVsYXRpb24gR1BVIHNpZGUuCi0JCSAqCi0JCSAqIFZMViBhbmQgQ0hWIGRv bid0IGhhdmUgR1BVIHN3aXp6bGluZy4KLQkJICovCi0JCXN3aXp6bGVfeCA9IEk5MTVfQklUXzZf U1dJWlpMRV9OT05FOwotCQlzd2l6emxlX3kgPSBJOTE1X0JJVF82X1NXSVpaTEVfTk9ORTsKLQl9 IGVsc2UgaWYgKElOVEVMX0lORk8oZGV2KS0+Z2VuID49IDYpIHsKLQkJaWYgKGRldl9wcml2LT5w cmVzZXJ2ZV9iaW9zX3N3aXp6bGUpIHsKLQkJCWlmIChJOTE1X1JFQUQoRElTUF9BUkJfQ1RMKSAm Ci0JCQkgICAgRElTUF9USUxFX1NVUkZBQ0VfU1dJWlpMSU5HKSB7Ci0JCQkJc3dpenpsZV94ID0g STkxNV9CSVRfNl9TV0laWkxFXzlfMTA7Ci0JCQkJc3dpenpsZV95ID0gSTkxNV9CSVRfNl9TV0la WkxFXzk7Ci0JCQl9IGVsc2UgewotCQkJCXN3aXp6bGVfeCA9IEk5MTVfQklUXzZfU1dJWlpMRV9O T05FOwotCQkJCXN3aXp6bGVfeSA9IEk5MTVfQklUXzZfU1dJWlpMRV9OT05FOwotCQkJfQotCQl9 IGVsc2UgewotCQkJdWludDMyX3QgZGltbV9jMCwgZGltbV9jMTsKLQkJCWRpbW1fYzAgPSBJOTE1 X1JFQUQoTUFEX0RJTU1fQzApOwotCQkJZGltbV9jMSA9IEk5MTVfUkVBRChNQURfRElNTV9DMSk7 Ci0JCQlkaW1tX2MwICY9IE1BRF9ESU1NX0FfU0laRV9NQVNLIHwgTUFEX0RJTU1fQl9TSVpFX01B U0s7Ci0JCQlkaW1tX2MxICY9IE1BRF9ESU1NX0FfU0laRV9NQVNLIHwgTUFEX0RJTU1fQl9TSVpF X01BU0s7Ci0JCQkvKiBFbmFibGUgc3dpenpsaW5nIHdoZW4gdGhlIGNoYW5uZWxzIGFyZSBwb3B1 bGF0ZWQKLQkJCSAqIHdpdGggaWRlbnRpY2FsbHkgc2l6ZWQgZGltbXMuIFdlIGRvbid0IG5lZWQg dG8gY2hlY2sKLQkJCSAqIHRoZSAzcmQgY2hhbm5lbCBiZWNhdXNlIG5vIGNwdSB3aXRoIGdwdSBh dHRhY2hlZAotCQkJICogc2hpcHMgaW4gdGhhdCBjb25maWd1cmF0aW9uLiBBbHNvLCBzd2l6emxp bmcgb25seQotCQkJICogbWFrZXMgc2Vuc2UgZm9yIDIgY2hhbm5lbHMgYW55d2F5LiAqLwotCQkJ aWYgKGRpbW1fYzAgPT0gZGltbV9jMSkgewotCQkJCXN3aXp6bGVfeCA9IEk5MTVfQklUXzZfU1dJ WlpMRV85XzEwOwotCQkJCXN3aXp6bGVfeSA9IEk5MTVfQklUXzZfU1dJWlpMRV85OwotCQkJfSBl bHNlIHsKLQkJCQlzd2l6emxlX3ggPSBJOTE1X0JJVF82X1NXSVpaTEVfTk9ORTsKLQkJCQlzd2l6 emxlX3kgPSBJOTE1X0JJVF82X1NXSVpaTEVfTk9ORTsKLQkJCX0KLQkJfQotCX0gZWxzZSBpZiAo SVNfR0VONShkZXZfcHJpdikpIHsKLQkJLyogT24gSXJvbmxha2Ugd2hhdGV2ZXIgRFJBTSBjb25m aWcsIEdQVSBhbHdheXMgZG8KLQkJICogc2FtZSBzd2l6emxpbmcgc2V0dXAuCi0JCSAqLwotCQlz d2l6emxlX3ggPSBJOTE1X0JJVF82X1NXSVpaTEVfOV8xMDsKLQkJc3dpenpsZV95ID0gSTkxNV9C SVRfNl9TV0laWkxFXzk7Ci0JfSBlbHNlIGlmIChJU19HRU4yKGRldl9wcml2KSkgewotCQkvKiBB cyBmYXIgYXMgd2Uga25vdywgdGhlIDg2NSBkb2Vzbid0IGhhdmUgdGhlc2UgYml0IDYKLQkJICog c3dpenpsaW5nIGlzc3Vlcy4KLQkJICovCi0JCXN3aXp6bGVfeCA9IEk5MTVfQklUXzZfU1dJWlpM RV9OT05FOwotCQlzd2l6emxlX3kgPSBJOTE1X0JJVF82X1NXSVpaTEVfTk9ORTsKLQl9IGVsc2Ug aWYgKElTX01PQklMRShkZXZfcHJpdikgfHwgKElTX0dFTjMoZGV2X3ByaXYpICYmCi0JCSAgICFJ U19HMzMoZGV2X3ByaXYpKSkgewotCQl1aW50MzJfdCBkY2M7Ci0KLQkJLyogT24gOXh4IGNoaXBz ZXRzLCBjaGFubmVsIGludGVybGVhdmUgYnkgdGhlIENQVSBpcwotCQkgKiBkZXRlcm1pbmVkIGJ5 IERDQy4gIEZvciBzaW5nbGUtY2hhbm5lbCwgbmVpdGhlciB0aGUgQ1BVCi0JCSAqIG5vciB0aGUg R1BVIGRvIHN3aXp6bGluZy4gIEZvciBkdWFsIGNoYW5uZWwgaW50ZXJsZWF2ZWQsCi0JCSAqIHRo ZSBHUFUncyBpbnRlcmxlYXZlIGlzIGJpdCA5IGFuZCAxMCBmb3IgWCB0aWxlZCwgYW5kIGJpdAot CQkgKiA5IGZvciBZIHRpbGVkLiAgVGhlIENQVSdzIGludGVybGVhdmUgaXMgaW5kZXBlbmRlbnQs IGFuZAotCQkgKiBjYW4gYmUgYmFzZWQgb24gZWl0aGVyIGJpdCAxMSAoaGF2ZW4ndCBzZWVuIHRo aXMgeWV0KSBvcgotCQkgKiBiaXQgMTcgKGNvbW1vbikuCi0JCSAqLwotCQlkY2MgPSBJOTE1X1JF QUQoRENDKTsKLQkJc3dpdGNoIChkY2MgJiBEQ0NfQUREUkVTU0lOR19NT0RFX01BU0spIHsKLQkJ Y2FzZSBEQ0NfQUREUkVTU0lOR19NT0RFX1NJTkdMRV9DSEFOTkVMOgotCQljYXNlIERDQ19BRERS RVNTSU5HX01PREVfRFVBTF9DSEFOTkVMX0FTWU1NRVRSSUM6Ci0JCQlzd2l6emxlX3ggPSBJOTE1 X0JJVF82X1NXSVpaTEVfTk9ORTsKLQkJCXN3aXp6bGVfeSA9IEk5MTVfQklUXzZfU1dJWlpMRV9O T05FOwotCQkJYnJlYWs7Ci0JCWNhc2UgRENDX0FERFJFU1NJTkdfTU9ERV9EVUFMX0NIQU5ORUxf SU5URVJMRUFWRUQ6Ci0JCQlpZiAoZGNjICYgRENDX0NIQU5ORUxfWE9SX0RJU0FCTEUpIHsKLQkJ CQkvKiBUaGlzIGlzIHRoZSBiYXNlIHN3aXp6bGluZyBieSB0aGUgR1BVIGZvcgotCQkJCSAqIHRp bGVkIGJ1ZmZlcnMuCi0JCQkJICovCi0JCQkJc3dpenpsZV94ID0gSTkxNV9CSVRfNl9TV0laWkxF XzlfMTA7Ci0JCQkJc3dpenpsZV95ID0gSTkxNV9CSVRfNl9TV0laWkxFXzk7Ci0JCQl9IGVsc2Ug aWYgKChkY2MgJiBEQ0NfQ0hBTk5FTF9YT1JfQklUXzE3KSA9PSAwKSB7Ci0JCQkJLyogQml0IDEx IHN3aXp6bGluZyBieSB0aGUgQ1BVIGluIGFkZGl0aW9uLiAqLwotCQkJCXN3aXp6bGVfeCA9IEk5 MTVfQklUXzZfU1dJWlpMRV85XzEwXzExOwotCQkJCXN3aXp6bGVfeSA9IEk5MTVfQklUXzZfU1dJ WlpMRV85XzExOwotCQkJfSBlbHNlIHsKLQkJCQkvKiBCaXQgMTcgc3dpenpsaW5nIGJ5IHRoZSBD UFUgaW4gYWRkaXRpb24uICovCi0JCQkJc3dpenpsZV94ID0gSTkxNV9CSVRfNl9TV0laWkxFXzlf MTBfMTc7Ci0JCQkJc3dpenpsZV95ID0gSTkxNV9CSVRfNl9TV0laWkxFXzlfMTc7Ci0JCQl9Ci0J CQlicmVhazsKLQkJfQotCi0JCS8qIGNoZWNrIGZvciBMLXNoYXBlZCBtZW1vcnkgYWthIG1vZGlm aWVkIGVuaGFuY2VkIGFkZHJlc3NpbmcgKi8KLQkJaWYgKElTX0dFTjQoZGV2X3ByaXYpICYmCi0J CSAgICAhKEk5MTVfUkVBRChEQ0MyKSAmIERDQzJfTU9ESUZJRURfRU5IQU5DRURfRElTQUJMRSkp IHsKLQkJCXN3aXp6bGVfeCA9IEk5MTVfQklUXzZfU1dJWlpMRV9VTktOT1dOOwotCQkJc3dpenps ZV95ID0gSTkxNV9CSVRfNl9TV0laWkxFX1VOS05PV047Ci0JCX0KLQotCQlpZiAoZGNjID09IDB4 ZmZmZmZmZmYpIHsKLQkJCURSTV9FUlJPUigiQ291bGRuJ3QgcmVhZCBmcm9tIE1DSEJBUi4gICIK LQkJCQkgICJEaXNhYmxpbmcgdGlsaW5nLlxuIik7Ci0JCQlzd2l6emxlX3ggPSBJOTE1X0JJVF82 X1NXSVpaTEVfVU5LTk9XTjsKLQkJCXN3aXp6bGVfeSA9IEk5MTVfQklUXzZfU1dJWlpMRV9VTktO T1dOOwotCQl9Ci0JfSBlbHNlIHsKLQkJLyogVGhlIDk2NSwgRzMzLCBhbmQgbmV3ZXIsIGhhdmUg YSB2ZXJ5IGZsZXhpYmxlIG1lbW9yeQotCQkgKiBjb25maWd1cmF0aW9uLiAgSXQgd2lsbCBlbmFi bGUgZHVhbC1jaGFubmVsIG1vZGUKLQkJICogKGludGVybGVhdmluZykgb24gYXMgbXVjaCBtZW1v cnkgYXMgaXQgY2FuLCBhbmQgdGhlIEdQVQotCQkgKiB3aWxsIGFkZGl0aW9uYWxseSBzb21ldGlt ZXMgZW5hYmxlIGRpZmZlcmVudCBiaXQgNgotCQkgKiBzd2l6emxpbmcgZm9yIHRpbGVkIG9iamVj dHMgZnJvbSB0aGUgQ1BVLgotCQkgKgotCQkgKiBIZXJlJ3Mgd2hhdCBJIGZvdW5kIG9uIHRoZSBH OTY1OgotCQkgKiAgICBzbG90IGZpbGwgICAgICAgICBtZW1vcnkgc2l6ZSAgc3dpenpsaW5nCi0J CSAqIDBBICAgMEIgICAxQSAgIDFCICAgIDEtY2ggICAyLWNoCi0JCSAqIDUxMiAgMCAgICAwICAg IDAgICAgIDUxMiAgICAwICAgICBPCi0JCSAqIDUxMiAgMCAgICA1MTIgIDAgICAgIDE2ICAgICAx MDA4ICBYCi0JCSAqIDUxMiAgMCAgICAwICAgIDUxMiAgIDE2ICAgICAxMDA4ICBYCi0JCSAqIDAg ICAgNTEyICAwICAgIDUxMiAgIDE2ICAgICAxMDA4ICBYCi0JCSAqIDEwMjQgMTAyNCAxMDI0IDAg ICAgIDIwNDggICAxMDI0ICBPCi0JCSAqCi0JCSAqIFdlIGNvdWxkIHByb2JhYmx5IGRldGVjdCB0 aGlzIGJhc2VkIG9uIGVpdGhlciB0aGUgRFJCCi0JCSAqIG1hdGNoaW5nLCB3aGljaCB3YXMgdGhl IGNhc2UgZm9yIHRoZSBzd2l6emxpbmcgcmVxdWlyZWQgaW4KLQkJICogdGhlIHRhYmxlIGFib3Zl LCBvciBmcm9tIHRoZSAxLWNoIHZhbHVlIGJlaW5nIGxlc3MgdGhhbgotCQkgKiB0aGUgbWluaW11 bSBzaXplIG9mIGEgcmFuay4KLQkJICoKLQkJICogUmVwb3J0cyBpbmRpY2F0ZSB0aGF0IHRoZSBz d2l6emxpbmcgYWN0dWFsbHkKLQkJICogdmFyaWVzIGRlcGVuZGluZyB1cG9uIHBhZ2UgcGxhY2Vt ZW50IGluc2lkZSB0aGUKLQkJICogY2hhbm5lbHMsIGkuZS4gd2Ugc2VlIHN3aXp6bGVkIHBhZ2Vz IHdoZXJlIHRoZQotCQkgKiBiYW5rcyBvZiBtZW1vcnkgYXJlIHBhaXJlZCBhbmQgdW5zd2l6emxl ZCBvbiB0aGUKLQkJICogdW5ldmVuIHBvcnRpb24sIHNvIGxlYXZlIHRoYXQgYXMgdW5rbm93bi4K LQkJICovCi0JCWlmIChJOTE1X1JFQUQxNihDMERSQjMpID09IEk5MTVfUkVBRDE2KEMxRFJCMykp IHsKLQkJCXN3aXp6bGVfeCA9IEk5MTVfQklUXzZfU1dJWlpMRV85XzEwOwotCQkJc3dpenpsZV95 ID0gSTkxNV9CSVRfNl9TV0laWkxFXzk7Ci0JCX0KLQl9Ci0KLQlpZiAoc3dpenpsZV94ID09IEk5 MTVfQklUXzZfU1dJWlpMRV9VTktOT1dOIHx8Ci0JICAgIHN3aXp6bGVfeSA9PSBJOTE1X0JJVF82 X1NXSVpaTEVfVU5LTk9XTikgewotCQkvKiBVc2Vyc3BhY2UgbGlrZXMgdG8gZXhwbG9kZSBpZiBp dCBzZWVzIHVua25vd24gc3dpenpsaW5nLAotCQkgKiBzbyBsaWUuIFdlIHdpbGwgZmluaXNoIHRo ZSBsaWUgd2hlbiByZXBvcnRpbmcgdGhyb3VnaAotCQkgKiB0aGUgZ2V0LXRpbGluZy1pb2N0bCBi eSByZXBvcnRpbmcgdGhlIHBoeXNpY2FsIHN3aXp6bGUKLQkJICogbW9kZSBhcyB1bmtub3duIGlu c3RlYWQuCi0JCSAqCi0JCSAqIEFzIHdlIGRvbid0IHN0cmljdGx5IGtub3cgd2hhdCB0aGUgc3dp enpsaW5nIGlzLCBpdCBtYXkgYmUKLQkJICogYml0MTcgZGVwZW5kZW50LCBhbmQgc28gd2UgbmVl ZCB0byBhbHNvIHByZXZlbnQgdGhlIHBhZ2VzCi0JCSAqIGZyb20gYmVpbmcgbW92ZWQuCi0JCSAq LwotCQlkZXZfcHJpdi0+cXVpcmtzIHw9IFFVSVJLX1BJTl9TV0laWkxFRF9QQUdFUzsKLQkJc3dp enpsZV94ID0gSTkxNV9CSVRfNl9TV0laWkxFX05PTkU7Ci0JCXN3aXp6bGVfeSA9IEk5MTVfQklU XzZfU1dJWlpMRV9OT05FOwotCX0KLQotCWRldl9wcml2LT5tbS5iaXRfNl9zd2l6emxlX3ggPSBz d2l6emxlX3g7Ci0JZGV2X3ByaXYtPm1tLmJpdF82X3N3aXp6bGVfeSA9IHN3aXp6bGVfeTsKLX0K LQotLyoKLSAqIFN3YXAgZXZlcnkgNjQgYnl0ZXMgb2YgdGhpcyBwYWdlIGFyb3VuZCwgdG8gYWNj b3VudCBmb3IgaXQgaGF2aW5nIGEgbmV3Ci0gKiBiaXQgMTcgb2YgaXRzIHBoeXNpY2FsIGFkZHJl c3MgYW5kIHRoZXJlZm9yZSBiZWluZyBpbnRlcnByZXRlZCBkaWZmZXJlbnRseQotICogYnkgdGhl IEdQVS4KLSAqLwotc3RhdGljIHZvaWQKLWk5MTVfZ2VtX3N3aXp6bGVfcGFnZShzdHJ1Y3QgcGFn ZSAqcGFnZSkKLXsKLQljaGFyIHRlbXBbNjRdOwotCWNoYXIgKnZhZGRyOwotCWludCBpOwotCi0J dmFkZHIgPSBrbWFwKHBhZ2UpOwotCi0JZm9yIChpID0gMDsgaSA8IFBBR0VfU0laRTsgaSArPSAx MjgpIHsKLQkJbWVtY3B5KHRlbXAsICZ2YWRkcltpXSwgNjQpOwotCQltZW1jcHkoJnZhZGRyW2ld LCAmdmFkZHJbaSArIDY0XSwgNjQpOwotCQltZW1jcHkoJnZhZGRyW2kgKyA2NF0sIHRlbXAsIDY0 KTsKLQl9Ci0KLQlrdW5tYXAocGFnZSk7Ci19Ci0KLS8qKgotICogaTkxNV9nZW1fb2JqZWN0X2Rv X2JpdF8xN19zd2l6emxlIC0gZml4dXAgYml0IDE3IHN3aXp6bGluZwotICogQG9iajogaTkxNSBH RU0gYnVmZmVyIG9iamVjdAotICogQHBhZ2VzOiB0aGUgc2NhdHRlcmdhdGhlciBsaXN0IG9mIHBo eXNpY2FsIHBhZ2VzCi0gKgotICogVGhpcyBmdW5jdGlvbiBmaXhlcyB1cCB0aGUgc3dpenpsaW5n IGluIGNhc2UgYW55IHBhZ2UgZnJhbWUgbnVtYmVyIGZvciB0aGlzCi0gKiBvYmplY3QgaGFzIGNo YW5nZWQgaW4gYml0IDE3IHNpbmNlIHRoYXQgc3RhdGUgaGFzIGJlZW4gc2F2ZWQgd2l0aAotICog aTkxNV9nZW1fb2JqZWN0X3NhdmVfYml0XzE3X3N3aXp6bGUoKS4KLSAqCi0gKiBUaGlzIGlzIGNh bGxlZCB3aGVuIHBpbm5pbmcgYmFja2luZyBzdG9yYWdlIGFnYWluLCBzaW5jZSB0aGUga2VybmVs IGlzIGZyZWUKLSAqIHRvIG1vdmUgdW5waW5uZWQgYmFja2luZyBzdG9yYWdlIGFyb3VuZCAoZWl0 aGVyIGJ5IGRpcmVjdGx5IG1vdmluZyBwYWdlcyBvcgotICogYnkgc3dhcHBpbmcgdGhlbSBvdXQg YW5kIGJhY2sgaW4gYWdhaW4pLgotICovCi12b2lkCi1pOTE1X2dlbV9vYmplY3RfZG9fYml0XzE3 X3N3aXp6bGUoc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaiwKLQkJCQkgIHN0cnVjdCBz Z190YWJsZSAqcGFnZXMpCi17Ci0Jc3RydWN0IHNndF9pdGVyIHNndF9pdGVyOwotCXN0cnVjdCBw YWdlICpwYWdlOwotCWludCBpOwotCi0JaWYgKG9iai0+Yml0XzE3ID09IE5VTEwpCi0JCXJldHVy bjsKLQotCWkgPSAwOwotCWZvcl9lYWNoX3NndF9wYWdlKHBhZ2UsIHNndF9pdGVyLCBwYWdlcykg ewotCQljaGFyIG5ld19iaXRfMTcgPSBwYWdlX3RvX3BoeXMocGFnZSkgPj4gMTc7Ci0JCWlmICgo bmV3X2JpdF8xNyAmIDB4MSkgIT0gKHRlc3RfYml0KGksIG9iai0+Yml0XzE3KSAhPSAwKSkgewot CQkJaTkxNV9nZW1fc3dpenpsZV9wYWdlKHBhZ2UpOwotCQkJc2V0X3BhZ2VfZGlydHkocGFnZSk7 Ci0JCX0KLQkJaSsrOwotCX0KLX0KLQotLyoqCi0gKiBpOTE1X2dlbV9vYmplY3Rfc2F2ZV9iaXRf MTdfc3dpenpsZSAtIHNhdmUgYml0IDE3IHN3aXp6bGluZwotICogQG9iajogaTkxNSBHRU0gYnVm ZmVyIG9iamVjdAotICogQHBhZ2VzOiB0aGUgc2NhdHRlcmdhdGhlciBsaXN0IG9mIHBoeXNpY2Fs IHBhZ2VzCi0gKgotICogVGhpcyBmdW5jdGlvbiBzYXZlcyB0aGUgYml0IDE3IG9mIGVhY2ggcGFn ZSBmcmFtZSBudW1iZXIgc28gdGhhdCBzd2l6emxpbmcKLSAqIGNhbiBiZSBmaXhlZCB1cCBsYXRl ciBvbiB3aXRoIGk5MTVfZ2VtX29iamVjdF9kb19iaXRfMTdfc3dpenpsZSgpLiBUaGlzIG11c3QK LSAqIGJlIGNhbGxlZCBiZWZvcmUgdGhlIGJhY2tpbmcgc3RvcmFnZSBjYW4gYmUgdW5waW5uZWQu Ci0gKi8KLXZvaWQKLWk5MTVfZ2VtX29iamVjdF9zYXZlX2JpdF8xN19zd2l6emxlKHN0cnVjdCBk cm1faTkxNV9nZW1fb2JqZWN0ICpvYmosCi0JCQkJICAgIHN0cnVjdCBzZ190YWJsZSAqcGFnZXMp Ci17Ci0JY29uc3QgdW5zaWduZWQgaW50IHBhZ2VfY291bnQgPSBvYmotPmJhc2Uuc2l6ZSA+PiBQ QUdFX1NISUZUOwotCXN0cnVjdCBzZ3RfaXRlciBzZ3RfaXRlcjsKLQlzdHJ1Y3QgcGFnZSAqcGFn ZTsKLQlpbnQgaTsKLQotCWlmIChvYmotPmJpdF8xNyA9PSBOVUxMKSB7Ci0JCW9iai0+Yml0XzE3 ID0ga2NhbGxvYyhCSVRTX1RPX0xPTkdTKHBhZ2VfY291bnQpLAotCQkJCSAgICAgIHNpemVvZihs b25nKSwgR0ZQX0tFUk5FTCk7Ci0JCWlmIChvYmotPmJpdF8xNyA9PSBOVUxMKSB7Ci0JCQlEUk1f RVJST1IoIkZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIGJpdCAxNyAiCi0JCQkJICAicmVj b3JkXG4iKTsKLQkJCXJldHVybjsKLQkJfQotCX0KLQotCWkgPSAwOwotCi0JZm9yX2VhY2hfc2d0 X3BhZ2UocGFnZSwgc2d0X2l0ZXIsIHBhZ2VzKSB7Ci0JCWlmIChwYWdlX3RvX3BoeXMocGFnZSkg JiAoMSA8PCAxNykpCi0JCQlfX3NldF9iaXQoaSwgb2JqLT5iaXRfMTcpOwotCQllbHNlCi0JCQlf X2NsZWFyX2JpdChpLCBvYmotPmJpdF8xNyk7Ci0JCWkrKzsKLQl9Ci19CmRpZmYgLS1naXQgYS9k cml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2dlbV9mZW5jZV9yZWcuYyBiL2RyaXZlcnMvZ3B1L2Ry bS9pOTE1L2k5MTVfZ2VtX2ZlbmNlX3JlZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAw MDAwMDAuLmNkNTlkYmMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9p OTE1X2dlbV9mZW5jZV9yZWcuYwpAQCAtMCwwICsxLDcxNiBAQAorLyoKKyAqIENvcHlyaWdodCDC qSAyMDA4LTIwMTUgSW50ZWwgQ29ycG9yYXRpb24KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVi eSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICog Y29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMg KHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVz dHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8g dXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNl LAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBw ZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1 YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5 cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5l eHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJz dGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FS RSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBS RVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJS QU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQ VVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFV VEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFH RVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJB Q1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiBGUk9NLCBPVVQgT0YgT1IgSU4gQ09O TkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTCisg KiBJTiBUSEUgU09GVFdBUkUuCisgKi8KKworI2luY2x1ZGUgPGRybS9kcm1QLmg+CisjaW5jbHVk ZSA8ZHJtL2k5MTVfZHJtLmg+CisjaW5jbHVkZSAiaTkxNV9kcnYuaCIKKworLyoqCisgKiBET0M6 IGZlbmNlIHJlZ2lzdGVyIGhhbmRsaW5nCisgKgorICogSW1wb3J0YW50IHRvIGF2b2lkIGNvbmZ1 c2lvbnM6ICJmZW5jZXMiIGluIHRoZSBpOTE1IGRyaXZlciBhcmUgbm90IGV4ZWN1dGlvbgorICog ZmVuY2VzIHVzZWQgdG8gdHJhY2sgY29tbWFuZCBjb21wbGV0aW9uIGJ1dCBoYXJkd2FyZSBkZXRp bGVyIG9iamVjdHMgd2hpY2gKKyAqIHdyYXAgYSBnaXZlbiByYW5nZSBvZiB0aGUgZ2xvYmFsIEdU VC4gRWFjaCBwbGF0Zm9ybSBoYXMgb25seSBhIGZhaXJseSBsaW1pdGVkCisgKiBzZXQgb2YgdGhl c2Ugb2JqZWN0cy4KKyAqCisgKiBGZW5jZXMgYXJlIHVzZWQgdG8gZGV0aWxlIEdUVCBtZW1vcnkg bWFwcGluZ3MuIFRoZXkncmUgYWxzbyBjb25uZWN0ZWQgdG8gdGhlCisgKiBoYXJkd2FyZSBmcm9u dGJ1ZmZlciByZW5kZXIgdHJhY2tpbmcgYW5kIGhlbmNlIGludGVyYWN0IHdpdGggZnJvbnRidWZm ZXIKKyAqIGNvbXByZXNzaW9uLiBGdXJ0aGVybW9yZSBvbiBvbGRlciBwbGF0Zm9ybXMgZmVuY2Vz IGFyZSByZXF1aXJlZCBmb3IgdGlsZWQKKyAqIG9iamVjdHMgdXNlZCBieSB0aGUgZGlzcGxheSBl bmdpbmUuIFRoZXkgY2FuIGFsc28gYmUgdXNlZCBieSB0aGUgcmVuZGVyCisgKiBlbmdpbmUgLSB0 aGV5J3JlIHJlcXVpcmVkIGZvciBibGl0dGVyIGNvbW1hbmRzIGFuZCBhcmUgb3B0aW9uYWwgZm9y IHJlbmRlcgorICogY29tbWFuZHMuIEJ1dCBvbiBnZW40KyBib3RoIGRpc3BsYXkgKHdpdGggdGhl IGV4Y2VwdGlvbiBvZiBmYmMpIGFuZCByZW5kZXJpbmcKKyAqIGhhdmUgdGhlaXIgb3duIHRpbGlu ZyBzdGF0ZSBiaXRzIGFuZCBkb24ndCBuZWVkIGZlbmNlcy4KKyAqCisgKiBBbHNvIG5vdGUgdGhh dCBmZW5jZXMgb25seSBzdXBwb3J0IFggYW5kIFkgdGlsaW5nIGFuZCBoZW5jZSBjYW4ndCBiZSB1 c2VkIGZvcgorICogdGhlIGZhbmNpZXIgbmV3IHRpbGluZyBmb3JtYXRzIGxpa2UgVywgWXMgYW5k IFlmLgorICoKKyAqIEZpbmFsbHkgbm90ZSB0aGF0IGJlY2F1c2UgZmVuY2VzIGFyZSBzdWNoIGEg cmVzdHJpY3RlZCByZXNvdXJjZSB0aGV5J3JlCisgKiBkeW5hbWljYWxseSBhc3NvY2lhdGVkIHdp dGggb2JqZWN0cy4gRnVydGhlcm1vcmUgZmVuY2Ugc3RhdGUgaXMgY29tbWl0dGVkIHRvCisgKiB0 aGUgaGFyZHdhcmUgbGF6aWx5IHRvIGF2b2lkIHVubmVjZXNzYXJ5IHN0YWxscyBvbiBnZW4yLzMu IFRoZXJlZm9yZSBjb2RlIG11c3QKKyAqIGV4cGxpY2l0bHkgY2FsbCBpOTE1X2dlbV9vYmplY3Rf Z2V0X2ZlbmNlKCkgdG8gc3luY2hyb25pemUgZmVuY2luZyBzdGF0dXMKKyAqIGZvciBjcHUgYWNj ZXNzLiBBbHNvIG5vdGUgdGhhdCBzb21lIGNvZGUgd2FudHMgYW4gdW5mZW5jZWQgdmlldywgZm9y IHRob3NlCisgKiBjYXNlcyB0aGUgZmVuY2UgY2FuIGJlIHJlbW92ZWQgZm9yY2VmdWxseSB3aXRo IGk5MTVfZ2VtX29iamVjdF9wdXRfZmVuY2UoKS4KKyAqCisgKiBJbnRlcm5hbGx5IHRoZXNlIGZ1 bmN0aW9ucyB3aWxsIHN5bmNocm9uaXplIHdpdGggdXNlcnNwYWNlIGFjY2VzcyBieSByZW1vdmlu ZworICogQ1BVIHB0ZXMgaW50byBHVFQgbW1hcHMgKG5vdCB0aGUgR1RUIHB0ZXMgdGhlbXNlbHZl cykgYXMgbmVlZGVkLgorICovCisKKyNkZWZpbmUgcGlwZWxpbmVkIDAKKworc3RhdGljIHZvaWQg aTk2NV93cml0ZV9mZW5jZV9yZWcoc3RydWN0IGRybV9pOTE1X2ZlbmNlX3JlZyAqZmVuY2UsCisJ CQkJIHN0cnVjdCBpOTE1X3ZtYSAqdm1hKQoreworCWk5MTVfcmVnX3QgZmVuY2VfcmVnX2xvLCBm ZW5jZV9yZWdfaGk7CisJaW50IGZlbmNlX3BpdGNoX3NoaWZ0OworCXU2NCB2YWw7CisKKwlpZiAo SU5URUxfSU5GTyhmZW5jZS0+aTkxNSktPmdlbiA+PSA2KSB7CisJCWZlbmNlX3JlZ19sbyA9IEZF TkNFX1JFR19HRU42X0xPKGZlbmNlLT5pZCk7CisJCWZlbmNlX3JlZ19oaSA9IEZFTkNFX1JFR19H RU42X0hJKGZlbmNlLT5pZCk7CisJCWZlbmNlX3BpdGNoX3NoaWZ0ID0gR0VONl9GRU5DRV9QSVRD SF9TSElGVDsKKworCX0gZWxzZSB7CisJCWZlbmNlX3JlZ19sbyA9IEZFTkNFX1JFR185NjVfTE8o ZmVuY2UtPmlkKTsKKwkJZmVuY2VfcmVnX2hpID0gRkVOQ0VfUkVHXzk2NV9ISShmZW5jZS0+aWQp OworCQlmZW5jZV9waXRjaF9zaGlmdCA9IEk5NjVfRkVOQ0VfUElUQ0hfU0hJRlQ7CisJfQorCisJ dmFsID0gMDsKKwlpZiAodm1hKSB7CisJCXVuc2lnbmVkIGludCB0aWxpbmcgPSBpOTE1X2dlbV9v YmplY3RfZ2V0X3RpbGluZyh2bWEtPm9iaik7CisJCWJvb2wgaXNfeV90aWxlZCA9IHRpbGluZyA9 PSBJOTE1X1RJTElOR19ZOworCQl1bnNpZ25lZCBpbnQgc3RyaWRlID0gaTkxNV9nZW1fb2JqZWN0 X2dldF9zdHJpZGUodm1hLT5vYmopOworCQl1MzIgcm93X3NpemUgPSBzdHJpZGUgKiAoaXNfeV90 aWxlZCA/IDMyIDogOCk7CisJCXUzMiBzaXplID0gcm91bmRkb3duKCh1MzIpdm1hLT5ub2RlLnNp emUsIHJvd19zaXplKTsKKworCQl2YWwgPSAoKHZtYS0+bm9kZS5zdGFydCArIHNpemUgLSA0MDk2 KSAmIDB4ZmZmZmYwMDApIDw8IDMyOworCQl2YWwgfD0gdm1hLT5ub2RlLnN0YXJ0ICYgMHhmZmZm ZjAwMDsKKwkJdmFsIHw9ICh1NjQpKChzdHJpZGUgLyAxMjgpIC0gMSkgPDwgZmVuY2VfcGl0Y2hf c2hpZnQ7CisJCWlmIChpc195X3RpbGVkKQorCQkJdmFsIHw9IEJJVChJOTY1X0ZFTkNFX1RJTElO R19ZX1NISUZUKTsKKwkJdmFsIHw9IEk5NjVfRkVOQ0VfUkVHX1ZBTElEOworCX0KKworCWlmICgh cGlwZWxpbmVkKSB7CisJCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGZlbmNl LT5pOTE1OworCisJCS8qIFRvIHcvYSBpbmNvaGVyZW5jeSB3aXRoIG5vbi1hdG9taWMgNjQtYml0 IHJlZ2lzdGVyIHVwZGF0ZXMsCisJCSAqIHdlIHNwbGl0IHRoZSA2NC1iaXQgdXBkYXRlIGludG8g dHdvIDMyLWJpdCB3cml0ZXMuIEluIG9yZGVyCisJCSAqIGZvciBhIHBhcnRpYWwgZmVuY2Ugbm90 IHRvIGJlIGV2YWx1YXRlZCBiZXR3ZWVuIHdyaXRlcywgd2UKKwkJICogcHJlY2VkZSB0aGUgdXBk YXRlIHdpdGggd3JpdGUgdG8gdHVybiBvZmYgdGhlIGZlbmNlIHJlZ2lzdGVyLAorCQkgKiBhbmQg b25seSBlbmFibGUgdGhlIGZlbmNlIGFzIHRoZSBsYXN0IHN0ZXAuCisJCSAqCisJCSAqIEZvciBl eHRyYSBsZXZlbHMgb2YgcGFyYW5vaWEsIHdlIG1ha2Ugc3VyZSBlYWNoIHN0ZXAgbGFuZHMKKwkJ ICogYmVmb3JlIGFwcGx5aW5nIHRoZSBuZXh0IHN0ZXAuCisJCSAqLworCQlJOTE1X1dSSVRFKGZl bmNlX3JlZ19sbywgMCk7CisJCVBPU1RJTkdfUkVBRChmZW5jZV9yZWdfbG8pOworCisJCUk5MTVf V1JJVEUoZmVuY2VfcmVnX2hpLCB1cHBlcl8zMl9iaXRzKHZhbCkpOworCQlJOTE1X1dSSVRFKGZl bmNlX3JlZ19sbywgbG93ZXJfMzJfYml0cyh2YWwpKTsKKwkJUE9TVElOR19SRUFEKGZlbmNlX3Jl Z19sbyk7CisJfQorfQorCitzdGF0aWMgdm9pZCBpOTE1X3dyaXRlX2ZlbmNlX3JlZyhzdHJ1Y3Qg ZHJtX2k5MTVfZmVuY2VfcmVnICpmZW5jZSwKKwkJCQkgc3RydWN0IGk5MTVfdm1hICp2bWEpCit7 CisJdTMyIHZhbDsKKworCXZhbCA9IDA7CisJaWYgKHZtYSkgeworCQl1bnNpZ25lZCBpbnQgdGls aW5nID0gaTkxNV9nZW1fb2JqZWN0X2dldF90aWxpbmcodm1hLT5vYmopOworCQlib29sIGlzX3lf dGlsZWQgPSB0aWxpbmcgPT0gSTkxNV9USUxJTkdfWTsKKwkJdW5zaWduZWQgaW50IHN0cmlkZSA9 IGk5MTVfZ2VtX29iamVjdF9nZXRfc3RyaWRlKHZtYS0+b2JqKTsKKwkJaW50IHBpdGNoX3ZhbDsK KwkJaW50IHRpbGVfd2lkdGg7CisKKwkJV0FSTigodm1hLT5ub2RlLnN0YXJ0ICYgfkk5MTVfRkVO Q0VfU1RBUlRfTUFTSykgfHwKKwkJICAgICAhaXNfcG93ZXJfb2ZfMih2bWEtPm5vZGUuc2l6ZSkg fHwKKwkJICAgICAodm1hLT5ub2RlLnN0YXJ0ICYgKHZtYS0+bm9kZS5zaXplIC0gMSkpLAorCQkg ICAgICJvYmplY3QgMHglMDhsbHggW2ZlbmNlYWJsZT8gJWRdIG5vdCAxTSBvciBwb3Qtc2l6ZSAo MHglMDhsbHgpIGFsaWduZWRcbiIsCisJCSAgICAgdm1hLT5ub2RlLnN0YXJ0LAorCQkgICAgIGk5 MTVfdm1hX2lzX21hcF9hbmRfZmVuY2VhYmxlKHZtYSksCisJCSAgICAgdm1hLT5ub2RlLnNpemUp OworCisJCWlmIChpc195X3RpbGVkICYmIEhBU18xMjhfQllURV9ZX1RJTElORyhmZW5jZS0+aTkx NSkpCisJCQl0aWxlX3dpZHRoID0gMTI4OworCQllbHNlCisJCQl0aWxlX3dpZHRoID0gNTEyOwor CisJCS8qIE5vdGU6IHBpdGNoIGJldHRlciBiZSBhIHBvd2VyIG9mIHR3byB0aWxlIHdpZHRocyAq LworCQlwaXRjaF92YWwgPSBzdHJpZGUgLyB0aWxlX3dpZHRoOworCQlwaXRjaF92YWwgPSBmZnMo cGl0Y2hfdmFsKSAtIDE7CisKKwkJdmFsID0gdm1hLT5ub2RlLnN0YXJ0OworCQlpZiAoaXNfeV90 aWxlZCkKKwkJCXZhbCB8PSBCSVQoSTgzMF9GRU5DRV9USUxJTkdfWV9TSElGVCk7CisJCXZhbCB8 PSBJOTE1X0ZFTkNFX1NJWkVfQklUUyh2bWEtPm5vZGUuc2l6ZSk7CisJCXZhbCB8PSBwaXRjaF92 YWwgPDwgSTgzMF9GRU5DRV9QSVRDSF9TSElGVDsKKwkJdmFsIHw9IEk4MzBfRkVOQ0VfUkVHX1ZB TElEOworCX0KKworCWlmICghcGlwZWxpbmVkKSB7CisJCXN0cnVjdCBkcm1faTkxNV9wcml2YXRl ICpkZXZfcHJpdiA9IGZlbmNlLT5pOTE1OworCQlpOTE1X3JlZ190IHJlZyA9IEZFTkNFX1JFRyhm ZW5jZS0+aWQpOworCisJCUk5MTVfV1JJVEUocmVnLCB2YWwpOworCQlQT1NUSU5HX1JFQUQocmVn KTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGk4MzBfd3JpdGVfZmVuY2VfcmVnKHN0cnVjdCBkcm1f aTkxNV9mZW5jZV9yZWcgKmZlbmNlLAorCQkJCSBzdHJ1Y3QgaTkxNV92bWEgKnZtYSkKK3sKKwl1 MzIgdmFsOworCisJdmFsID0gMDsKKwlpZiAodm1hKSB7CisJCXVuc2lnbmVkIGludCB0aWxpbmcg PSBpOTE1X2dlbV9vYmplY3RfZ2V0X3RpbGluZyh2bWEtPm9iaik7CisJCWJvb2wgaXNfeV90aWxl ZCA9IHRpbGluZyA9PSBJOTE1X1RJTElOR19ZOworCQl1bnNpZ25lZCBpbnQgc3RyaWRlID0gaTkx NV9nZW1fb2JqZWN0X2dldF9zdHJpZGUodm1hLT5vYmopOworCQl1MzIgcGl0Y2hfdmFsOworCisJ CVdBUk4oKHZtYS0+bm9kZS5zdGFydCAmIH5JODMwX0ZFTkNFX1NUQVJUX01BU0spIHx8CisJCSAg ICAgIWlzX3Bvd2VyX29mXzIodm1hLT5ub2RlLnNpemUpIHx8CisJCSAgICAgKHZtYS0+bm9kZS5z dGFydCAmICh2bWEtPm5vZGUuc2l6ZSAtIDEpKSwKKwkJICAgICAib2JqZWN0IDB4JTA4bGx4IG5v dCA1MTJLIG9yIHBvdC1zaXplIDB4JTA4bGx4IGFsaWduZWRcbiIsCisJCSAgICAgdm1hLT5ub2Rl LnN0YXJ0LCB2bWEtPm5vZGUuc2l6ZSk7CisKKwkJcGl0Y2hfdmFsID0gc3RyaWRlIC8gMTI4Owor CQlwaXRjaF92YWwgPSBmZnMocGl0Y2hfdmFsKSAtIDE7CisKKwkJdmFsID0gdm1hLT5ub2RlLnN0 YXJ0OworCQlpZiAoaXNfeV90aWxlZCkKKwkJCXZhbCB8PSBCSVQoSTgzMF9GRU5DRV9USUxJTkdf WV9TSElGVCk7CisJCXZhbCB8PSBJODMwX0ZFTkNFX1NJWkVfQklUUyh2bWEtPm5vZGUuc2l6ZSk7 CisJCXZhbCB8PSBwaXRjaF92YWwgPDwgSTgzMF9GRU5DRV9QSVRDSF9TSElGVDsKKwkJdmFsIHw9 IEk4MzBfRkVOQ0VfUkVHX1ZBTElEOworCX0KKworCWlmICghcGlwZWxpbmVkKSB7CisJCXN0cnVj dCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGZlbmNlLT5pOTE1OworCQlpOTE1X3JlZ190 IHJlZyA9IEZFTkNFX1JFRyhmZW5jZS0+aWQpOworCisJCUk5MTVfV1JJVEUocmVnLCB2YWwpOwor CQlQT1NUSU5HX1JFQUQocmVnKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGZlbmNlX3dyaXRlKHN0 cnVjdCBkcm1faTkxNV9mZW5jZV9yZWcgKmZlbmNlLAorCQkJc3RydWN0IGk5MTVfdm1hICp2bWEp Cit7CisJLyogUHJldmlvdXMgYWNjZXNzIHRocm91Z2ggdGhlIGZlbmNlIHJlZ2lzdGVyIGlzIG1h cnNoYWxsZWQgYnkKKwkgKiB0aGUgbWIoKSBpbnNpZGUgdGhlIGZhdWx0IGhhbmRsZXJzIChpOTE1 X2dlbV9yZWxlYXNlX21tYXBzKQorCSAqIGFuZCBleHBsaWNpdGx5IG1hbmFnZWQgZm9yIGludGVy bmFsIHVzZXJzLgorCSAqLworCisJaWYgKElTX0dFTjIoZmVuY2UtPmk5MTUpKQorCQlpODMwX3dy aXRlX2ZlbmNlX3JlZyhmZW5jZSwgdm1hKTsKKwllbHNlIGlmIChJU19HRU4zKGZlbmNlLT5pOTE1 KSkKKwkJaTkxNV93cml0ZV9mZW5jZV9yZWcoZmVuY2UsIHZtYSk7CisJZWxzZQorCQlpOTY1X3dy aXRlX2ZlbmNlX3JlZyhmZW5jZSwgdm1hKTsKKworCS8qIEFjY2VzcyB0aHJvdWdoIHRoZSBmZW5j ZWQgcmVnaW9uIGFmdGVyd2FyZHMgaXMKKwkgKiBvcmRlcmVkIGJ5IHRoZSBwb3N0aW5nIHJlYWRz IHdoaWxzdCB3cml0aW5nIHRoZSByZWdpc3RlcnMuCisJICovCisKKwlmZW5jZS0+ZGlydHkgPSBm YWxzZTsKK30KKworc3RhdGljIGludCBmZW5jZV91cGRhdGUoc3RydWN0IGRybV9pOTE1X2ZlbmNl X3JlZyAqZmVuY2UsCisJCQlzdHJ1Y3QgaTkxNV92bWEgKnZtYSkKK3sKKwlpbnQgcmV0OworCisJ aWYgKHZtYSkgeworCQlpZiAoIWk5MTVfdm1hX2lzX21hcF9hbmRfZmVuY2VhYmxlKHZtYSkpCisJ CQlyZXR1cm4gLUVJTlZBTDsKKworCQlpZiAoV0FSTighaTkxNV9nZW1fb2JqZWN0X2dldF9zdHJp ZGUodm1hLT5vYmopIHx8CisJCQkgIWk5MTVfZ2VtX29iamVjdF9nZXRfdGlsaW5nKHZtYS0+b2Jq KSwKKwkJCSAiYm9ndXMgZmVuY2Ugc2V0dXAgd2l0aCBzdHJpZGU6IDB4JXgsIHRpbGluZyBtb2Rl OiAlaVxuIiwKKwkJCSBpOTE1X2dlbV9vYmplY3RfZ2V0X3N0cmlkZSh2bWEtPm9iaiksCisJCQkg aTkxNV9nZW1fb2JqZWN0X2dldF90aWxpbmcodm1hLT5vYmopKSkKKwkJCXJldHVybiAtRUlOVkFM OworCisJCXJldCA9IGk5MTVfZ2VtX2FjdGl2ZV9yZXRpcmUoJnZtYS0+bGFzdF9mZW5jZSwKKwkJ CQkJICAgICAmdm1hLT5vYmotPmJhc2UuZGV2LT5zdHJ1Y3RfbXV0ZXgpOworCQlpZiAocmV0KQor CQkJcmV0dXJuIHJldDsKKwl9CisKKwlpZiAoZmVuY2UtPnZtYSkgeworCQlyZXQgPSBpOTE1X2dl bV9hY3RpdmVfcmV0aXJlKCZmZW5jZS0+dm1hLT5sYXN0X2ZlbmNlLAorCQkJCSAgICAgICZmZW5j ZS0+dm1hLT5vYmotPmJhc2UuZGV2LT5zdHJ1Y3RfbXV0ZXgpOworCQlpZiAocmV0KQorCQkJcmV0 dXJuIHJldDsKKwl9CisKKwlpZiAoZmVuY2UtPnZtYSAmJiBmZW5jZS0+dm1hICE9IHZtYSkgewor CQkvKiBFbnN1cmUgdGhhdCBhbGwgdXNlcnNwYWNlIENQVSBhY2Nlc3MgaXMgY29tcGxldGVkIGJl Zm9yZQorCQkgKiBzdGVhbGluZyB0aGUgZmVuY2UuCisJCSAqLworCQlpOTE1X2dlbV9yZWxlYXNl X21tYXAoZmVuY2UtPnZtYS0+b2JqKTsKKworCQlmZW5jZS0+dm1hLT5mZW5jZSA9IE5VTEw7CisJ CWZlbmNlLT52bWEgPSBOVUxMOworCisJCWxpc3RfbW92ZSgmZmVuY2UtPmxpbmssICZmZW5jZS0+ aTkxNS0+bW0uZmVuY2VfbGlzdCk7CisJfQorCisJZmVuY2Vfd3JpdGUoZmVuY2UsIHZtYSk7CisK KwlpZiAodm1hKSB7CisJCWlmIChmZW5jZS0+dm1hICE9IHZtYSkgeworCQkJdm1hLT5mZW5jZSA9 IGZlbmNlOworCQkJZmVuY2UtPnZtYSA9IHZtYTsKKwkJfQorCisJCWxpc3RfbW92ZV90YWlsKCZm ZW5jZS0+bGluaywgJmZlbmNlLT5pOTE1LT5tbS5mZW5jZV9saXN0KTsKKwl9CisKKwlyZXR1cm4g MDsKK30KKworLyoqCisgKiBpOTE1X3ZtYV9wdXRfZmVuY2UgLSBmb3JjZS1yZW1vdmUgZmVuY2Ug Zm9yIGEgVk1BCisgKiBAdm1hOiB2bWEgdG8gbWFwIGxpbmVhcmx5IChub3QgdGhyb3VnaCBhIGZl bmNlIHJlZykKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGZvcmNlLXJlbW92ZXMgYW55IGZlbmNlIGZy b20gdGhlIGdpdmVuIG9iamVjdCwgd2hpY2ggaXMgdXNlZnVsCisgKiBpZiB0aGUga2VybmVsIHdh bnRzIHRvIGRvIHVudGlsZWQgR1RUIGFjY2Vzcy4KKyAqCisgKiBSZXR1cm5zOgorICoKKyAqIDAg b24gc3VjY2VzcywgbmVnYXRpdmUgZXJyb3IgY29kZSBvbiBmYWlsdXJlLgorICovCitpbnQKK2k5 MTVfdm1hX3B1dF9mZW5jZShzdHJ1Y3QgaTkxNV92bWEgKnZtYSkKK3sKKwlzdHJ1Y3QgZHJtX2k5 MTVfZmVuY2VfcmVnICpmZW5jZSA9IHZtYS0+ZmVuY2U7CisKKwlhc3NlcnRfcnBtX3dha2Vsb2Nr X2hlbGQodG9faTkxNSh2bWEtPnZtLT5kZXYpKTsKKworCWlmICghZmVuY2UpCisJCXJldHVybiAw OworCisJaWYgKGZlbmNlLT5waW5fY291bnQpCisJCXJldHVybiAtRUJVU1k7CisKKwlyZXR1cm4g ZmVuY2VfdXBkYXRlKGZlbmNlLCBOVUxMKTsKK30KKworc3RhdGljIHN0cnVjdCBkcm1faTkxNV9m ZW5jZV9yZWcgKmZlbmNlX2ZpbmQoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2KQor eworCXN0cnVjdCBkcm1faTkxNV9mZW5jZV9yZWcgKmZlbmNlOworCisJbGlzdF9mb3JfZWFjaF9l bnRyeShmZW5jZSwgJmRldl9wcml2LT5tbS5mZW5jZV9saXN0LCBsaW5rKSB7CisJCWlmIChmZW5j ZS0+cGluX2NvdW50KQorCQkJY29udGludWU7CisKKwkJcmV0dXJuIGZlbmNlOworCX0KKworCS8q IFdhaXQgZm9yIGNvbXBsZXRpb24gb2YgcGVuZGluZyBmbGlwcyB3aGljaCBjb25zdW1lIGZlbmNl cyAqLworCWlmIChpbnRlbF9oYXNfcGVuZGluZ19mYl91bnBpbigmZGV2X3ByaXYtPmRybSkpCisJ CXJldHVybiBFUlJfUFRSKC1FQUdBSU4pOworCisJcmV0dXJuIEVSUl9QVFIoLUVERUFETEspOwor fQorCisvKioKKyAqIGk5MTVfdm1hX2dldF9mZW5jZSAtIHNldCB1cCBmZW5jaW5nIGZvciBhIHZt YQorICogQHZtYTogdm1hIHRvIG1hcCB0aHJvdWdoIGEgZmVuY2UgcmVnCisgKgorICogV2hlbiBt YXBwaW5nIG9iamVjdHMgdGhyb3VnaCB0aGUgR1RULCB1c2Vyc3BhY2Ugd2FudHMgdG8gYmUgYWJs ZSB0byB3cml0ZQorICogdG8gdGhlbSB3aXRob3V0IGhhdmluZyB0byB3b3JyeSBhYm91dCBzd2l6 emxpbmcgaWYgdGhlIG9iamVjdCBpcyB0aWxlZC4KKyAqIFRoaXMgZnVuY3Rpb24gd2Fsa3MgdGhl IGZlbmNlIHJlZ3MgbG9va2luZyBmb3IgYSBmcmVlIG9uZSBmb3IgQG9iaiwKKyAqIHN0ZWFsaW5n IG9uZSBpZiBpdCBjYW4ndCBmaW5kIGFueS4KKyAqCisgKiBJdCB0aGVuIHNldHMgdXAgdGhlIHJl ZyBiYXNlZCBvbiB0aGUgb2JqZWN0J3MgcHJvcGVydGllczogYWRkcmVzcywgcGl0Y2gKKyAqIGFu ZCB0aWxpbmcgZm9ybWF0LgorICoKKyAqIEZvciBhbiB1bnRpbGVkIHN1cmZhY2UsIHRoaXMgcmVt b3ZlcyBhbnkgZXhpc3RpbmcgZmVuY2UuCisgKgorICogUmV0dXJuczoKKyAqCisgKiAwIG9uIHN1 Y2Nlc3MsIG5lZ2F0aXZlIGVycm9yIGNvZGUgb24gZmFpbHVyZS4KKyAqLworaW50CitpOTE1X3Zt YV9nZXRfZmVuY2Uoc3RydWN0IGk5MTVfdm1hICp2bWEpCit7CisJc3RydWN0IGRybV9pOTE1X2Zl bmNlX3JlZyAqZmVuY2U7CisJc3RydWN0IGk5MTVfdm1hICpzZXQgPSBpOTE1X2dlbV9vYmplY3Rf aXNfdGlsZWQodm1hLT5vYmopID8gdm1hIDogTlVMTDsKKworCS8qIE5vdGUgdGhhdCB3ZSByZXZv a2UgZmVuY2VzIG9uIHJ1bnRpbWUgc3VzcGVuZC4gVGhlcmVmb3JlIHRoZSB1c2VyCisJICogbXVz dCBrZWVwIHRoZSBkZXZpY2UgYXdha2Ugd2hpbHN0IHVzaW5nIHRoZSBmZW5jZS4KKwkgKi8KKwlh c3NlcnRfcnBtX3dha2Vsb2NrX2hlbGQodG9faTkxNSh2bWEtPnZtLT5kZXYpKTsKKworCS8qIEp1 c3QgdXBkYXRlIG91ciBwbGFjZSBpbiB0aGUgTFJVIGlmIG91ciBmZW5jZSBpcyBnZXR0aW5nIHJl dXNlZC4gKi8KKwlpZiAodm1hLT5mZW5jZSkgeworCQlmZW5jZSA9IHZtYS0+ZmVuY2U7CisJCWlm ICghZmVuY2UtPmRpcnR5KSB7CisJCQlsaXN0X21vdmVfdGFpbCgmZmVuY2UtPmxpbmssCisJCQkJ ICAgICAgICZmZW5jZS0+aTkxNS0+bW0uZmVuY2VfbGlzdCk7CisJCQlyZXR1cm4gMDsKKwkJfQor CX0gZWxzZSBpZiAoc2V0KSB7CisJCWZlbmNlID0gZmVuY2VfZmluZCh0b19pOTE1KHZtYS0+dm0t PmRldikpOworCQlpZiAoSVNfRVJSKGZlbmNlKSkKKwkJCXJldHVybiBQVFJfRVJSKGZlbmNlKTsK Kwl9IGVsc2UKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gZmVuY2VfdXBkYXRlKGZlbmNlLCBzZXQp OworfQorCisvKioKKyAqIGk5MTVfZ2VtX3Jlc3RvcmVfZmVuY2VzIC0gcmVzdG9yZSBmZW5jZSBz dGF0ZQorICogQGRldjogRFJNIGRldmljZQorICoKKyAqIFJlc3RvcmUgdGhlIGh3IGZlbmNlIHN0 YXRlIHRvIG1hdGNoIHRoZSBzb2Z0d2FyZSB0cmFja2luZyBhZ2FpbiwgdG8gYmUgY2FsbGVkCisg KiBhZnRlciBhIGdwdSByZXNldCBhbmQgb24gcmVzdW1lLiBOb3RlIHRoYXQgb24gcnVudGltZSBz dXNwZW5kIHdlIG9ubHkgY2FuY2VsCisgKiB0aGUgZmVuY2VzLCB0byBiZSByZWFjcXVpcmVkIGJ5 IHRoZSB1c2VyIGxhdGVyLgorICovCit2b2lkIGk5MTVfZ2VtX3Jlc3RvcmVfZmVuY2VzKHN0cnVj dCBkcm1fZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2 ID0gdG9faTkxNShkZXYpOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IGRldl9wcml2LT5u dW1fZmVuY2VfcmVnczsgaSsrKSB7CisJCXN0cnVjdCBkcm1faTkxNV9mZW5jZV9yZWcgKnJlZyA9 ICZkZXZfcHJpdi0+ZmVuY2VfcmVnc1tpXTsKKwkJc3RydWN0IGk5MTVfdm1hICp2bWEgPSByZWct PnZtYTsKKworCQkvKgorCQkgKiBDb21taXQgZGVsYXllZCB0aWxpbmcgY2hhbmdlcyBpZiB3ZSBo YXZlIGFuIG9iamVjdCBzdGlsbAorCQkgKiBhdHRhY2hlZCB0byB0aGUgZmVuY2UsIG90aGVyd2lz ZSBqdXN0IGNsZWFyIHRoZSBmZW5jZS4KKwkJICovCisJCWlmICh2bWEgJiYgIWk5MTVfZ2VtX29i amVjdF9pc190aWxlZCh2bWEtPm9iaikpIHsKKwkJCUdFTV9CVUdfT04oIXJlZy0+ZGlydHkpOwor CQkJR0VNX0JVR19PTighbGlzdF9lbXB0eSgmdm1hLT5vYmotPnVzZXJmYXVsdF9saW5rKSk7CisK KwkJCWxpc3RfbW92ZSgmcmVnLT5saW5rLCAmZGV2X3ByaXYtPm1tLmZlbmNlX2xpc3QpOworCQkJ dm1hLT5mZW5jZSA9IE5VTEw7CisJCQl2bWEgPSBOVUxMOworCQl9CisKKwkJZmVuY2Vfd3JpdGUo cmVnLCB2bWEpOworCQlyZWctPnZtYSA9IHZtYTsKKwl9Cit9CisKKy8qKgorICogRE9DOiB0aWxp bmcgc3dpenpsaW5nIGRldGFpbHMKKyAqCisgKiBUaGUgaWRlYSBiZWhpbmQgdGlsaW5nIGlzIHRv IGluY3JlYXNlIGNhY2hlIGhpdCByYXRlcyBieSByZWFycmFuZ2luZworICogcGl4ZWwgZGF0YSBz byB0aGF0IGEgZ3JvdXAgb2YgcGl4ZWwgYWNjZXNzZXMgYXJlIGluIHRoZSBzYW1lIGNhY2hlbGlu ZS4KKyAqIFBlcmZvcm1hbmNlIGltcHJvdmVtZW50IGZyb20gZG9pbmcgdGhpcyBvbiB0aGUgYmFj ay9kZXB0aCBidWZmZXIgYXJlIG9uCisgKiB0aGUgb3JkZXIgb2YgMzAlLgorICoKKyAqIEludGVs IGFyY2hpdGVjdHVyZXMgbWFrZSB0aGlzIHNvbWV3aGF0IG1vcmUgY29tcGxpY2F0ZWQsIHRob3Vn aCwgYnkKKyAqIGFkanVzdG1lbnRzIG1hZGUgdG8gYWRkcmVzc2luZyBvZiBkYXRhIHdoZW4gdGhl IG1lbW9yeSBpcyBpbiBpbnRlcmxlYXZlZAorICogbW9kZSAobWF0Y2hlZCBwYWlycyBvZiBESU1N UykgdG8gaW1wcm92ZSBtZW1vcnkgYmFuZHdpZHRoLgorICogRm9yIGludGVybGVhdmVkIG1lbW9y eSwgdGhlIENQVSBzZW5kcyBldmVyeSBzZXF1ZW50aWFsIDY0IGJ5dGVzCisgKiB0byBhbiBhbHRl cm5hdGUgbWVtb3J5IGNoYW5uZWwgc28gaXQgY2FuIGdldCB0aGUgYmFuZHdpZHRoIGZyb20gYm90 aC4KKyAqCisgKiBUaGUgR1BVIGFsc28gcmVhcnJhbmdlcyBpdHMgYWNjZXNzZXMgZm9yIGluY3Jl YXNlZCBiYW5kd2lkdGggdG8gaW50ZXJsZWF2ZWQKKyAqIG1lbW9yeSwgYW5kIGl0IG1hdGNoZXMg d2hhdCB0aGUgQ1BVIGRvZXMgZm9yIG5vbi10aWxlZC4gIEhvd2V2ZXIsIHdoZW4gdGlsZWQKKyAq IGl0IGRvZXMgaXQgYSBsaXR0bGUgZGlmZmVyZW50bHksIHNpbmNlIG9uZSB3YWxrcyBhZGRyZXNz ZXMgbm90IGp1c3QgaW4gdGhlCisgKiBYIGRpcmVjdGlvbiBidXQgYWxzbyBZLiAgU28sIGFsb25n IHdpdGggYWx0ZXJuYXRpbmcgY2hhbm5lbHMgd2hlbiBiaXQKKyAqIDYgb2YgdGhlIGFkZHJlc3Mg ZmxpcHMsIGl0IGFsc28gYWx0ZXJuYXRlcyB3aGVuIG90aGVyIGJpdHMgZmxpcCAtLSAgQml0cyA5 CisgKiAoZXZlcnkgNTEyIGJ5dGVzLCBhbiBYIHRpbGUgc2NhbmxpbmUpIGFuZCAxMCAoZXZlcnkg dHdvIFggdGlsZSBzY2FubGluZXMpCisgKiBhcmUgY29tbW9uIHRvIGJvdGggdGhlIDkxNSBhbmQg OTY1LWNsYXNzIGhhcmR3YXJlLgorICoKKyAqIFRoZSBDUFUgYWxzbyBzb21ldGltZXMgWE9ScyBp biBoaWdoZXIgYml0cyBhcyB3ZWxsLCB0byBpbXByb3ZlCisgKiBiYW5kd2lkdGggZG9pbmcgc3Ry aWRlZCBhY2Nlc3MgbGlrZSB3ZSBkbyBzbyBmcmVxdWVudGx5IGluIGdyYXBoaWNzLiAgVGhpcwor ICogaXMgY2FsbGVkICJDaGFubmVsIFhPUiBSYW5kb21pemF0aW9uIiBpbiB0aGUgTUNIIGRvY3Vt ZW50YXRpb24uICBUaGUgcmVzdWx0CisgKiBpcyB0aGF0IHRoZSBDUFUgaXMgWE9SaW5nIGluIGVp dGhlciBiaXQgMTEgb3IgYml0IDE3IHRvIGJpdCA2IG9mIGl0cyBhZGRyZXNzCisgKiBkZWNvZGUu CisgKgorICogQWxsIG9mIHRoaXMgYml0IDYgWE9SaW5nIGhhcyBhbiBlZmZlY3Qgb24gb3VyIG1l bW9yeSBtYW5hZ2VtZW50LAorICogYXMgd2UgbmVlZCB0byBtYWtlIHN1cmUgdGhhdCB0aGUgM2Qg ZHJpdmVyIGNhbiBjb3JyZWN0bHkgYWRkcmVzcyBvYmplY3QKKyAqIGNvbnRlbnRzLgorICoKKyAq IElmIHdlIGRvbid0IGhhdmUgaW50ZXJsZWF2ZWQgbWVtb3J5LCBhbGwgdGlsaW5nIGlzIHNhZmUg YW5kIG5vIHN3aXp6bGluZyBpcworICogcmVxdWlyZWQuCisgKgorICogV2hlbiBiaXQgMTcgaXMg WE9SZWQgaW4sIHdlIHNpbXBseSByZWZ1c2UgdG8gdGlsZSBhdCBhbGwuICBCaXQKKyAqIDE3IGlz IG5vdCBqdXN0IGEgcGFnZSBvZmZzZXQsIHNvIGFzIHdlIHBhZ2UgYW4gb2JqZWN0IG91dCBhbmQg YmFjayBpbiwKKyAqIGluZGl2aWR1YWwgcGFnZXMgaW4gaXQgd2lsbCBoYXZlIGRpZmZlcmVudCBi aXQgMTcgYWRkcmVzc2VzLCByZXN1bHRpbmcgaW4KKyAqIGVhY2ggNjQgYnl0ZXMgYmVpbmcgc3dh cHBlZCB3aXRoIGl0cyBuZWlnaGJvciEKKyAqCisgKiBPdGhlcndpc2UsIGlmIGludGVybGVhdmVk LCB3ZSBoYXZlIHRvIHRlbGwgdGhlIDNkIGRyaXZlciB3aGF0IHRoZSBhZGRyZXNzCisgKiBzd2l6 emxpbmcgaXQgbmVlZHMgdG8gZG8gaXMsIHNpbmNlIGl0J3Mgd3JpdGluZyB3aXRoIHRoZSBDUFUg dG8gdGhlIHBhZ2VzCisgKiAoYml0IDYgYW5kIHBvdGVudGlhbGx5IGJpdCAxMSBYT1JlZCBpbiks IGFuZCB0aGUgR1BVIGlzIHJlYWRpbmcgZnJvbSB0aGUKKyAqIHBhZ2VzIChiaXQgNiwgOSwgYW5k IDEwIFhPUmVkIGluKSwgcmVzdWx0aW5nIGluIGEgY3VtdWxhdGl2ZSBiaXQgc3dpenpsaW5nCisg KiByZXF1aXJlZCBieSB0aGUgQ1BVIG9mIFhPUmluZyBpbiBiaXQgNiwgOSwgMTAsIGFuZCBwb3Rl bnRpYWxseSAxMSwgaW4gb3JkZXIKKyAqIHRvIG1hdGNoIHdoYXQgdGhlIEdQVSBleHBlY3RzLgor ICovCisKKy8qKgorICogaTkxNV9nZW1fZGV0ZWN0X2JpdF82X3N3aXp6bGUgLSBkZXRlY3QgYml0 IDYgc3dpenpsaW5nIHBhdHRlcm4KKyAqIEBkZXY6IERSTSBkZXZpY2UKKyAqCisgKiBEZXRlY3Rz IGJpdCA2IHN3aXp6bGluZyBvZiBhZGRyZXNzIGxvb2t1cCBiZXR3ZWVuIElHRCBhY2Nlc3MgYW5k IENQVQorICogYWNjZXNzIHRocm91Z2ggbWFpbiBtZW1vcnkuCisgKi8KK3ZvaWQKK2k5MTVfZ2Vt X2RldGVjdF9iaXRfNl9zd2l6emxlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJc3RydWN0 IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gdG9faTkxNShkZXYpOworCXVpbnQzMl90IHN3 aXp6bGVfeCA9IEk5MTVfQklUXzZfU1dJWlpMRV9VTktOT1dOOworCXVpbnQzMl90IHN3aXp6bGVf eSA9IEk5MTVfQklUXzZfU1dJWlpMRV9VTktOT1dOOworCisJaWYgKElOVEVMX0dFTihkZXZfcHJp dikgPj0gOCB8fCBJU19WQUxMRVlWSUVXKGRldl9wcml2KSkgeworCQkvKgorCQkgKiBPbiBCRFcr LCBzd2l6emxpbmcgaXMgbm90IHVzZWQuIFdlIGxlYXZlIHRoZSBDUFUgbWVtb3J5CisJCSAqIGNv bnRyb2xsZXIgaW4gY2hhcmdlIG9mIG9wdGltaXppbmcgbWVtb3J5IGFjY2Vzc2VzIHdpdGhvdXQK KwkJICogdGhlIGV4dHJhIGFkZHJlc3MgbWFuaXB1bGF0aW9uIEdQVSBzaWRlLgorCQkgKgorCQkg KiBWTFYgYW5kIENIViBkb24ndCBoYXZlIEdQVSBzd2l6emxpbmcuCisJCSAqLworCQlzd2l6emxl X3ggPSBJOTE1X0JJVF82X1NXSVpaTEVfTk9ORTsKKwkJc3dpenpsZV95ID0gSTkxNV9CSVRfNl9T V0laWkxFX05PTkU7CisJfSBlbHNlIGlmIChJTlRFTF9JTkZPKGRldiktPmdlbiA+PSA2KSB7CisJ CWlmIChkZXZfcHJpdi0+cHJlc2VydmVfYmlvc19zd2l6emxlKSB7CisJCQlpZiAoSTkxNV9SRUFE KERJU1BfQVJCX0NUTCkgJgorCQkJICAgIERJU1BfVElMRV9TVVJGQUNFX1NXSVpaTElORykgewor CQkJCXN3aXp6bGVfeCA9IEk5MTVfQklUXzZfU1dJWlpMRV85XzEwOworCQkJCXN3aXp6bGVfeSA9 IEk5MTVfQklUXzZfU1dJWlpMRV85OworCQkJfSBlbHNlIHsKKwkJCQlzd2l6emxlX3ggPSBJOTE1 X0JJVF82X1NXSVpaTEVfTk9ORTsKKwkJCQlzd2l6emxlX3kgPSBJOTE1X0JJVF82X1NXSVpaTEVf Tk9ORTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXVpbnQzMl90IGRpbW1fYzAsIGRpbW1fYzE7CisJ CQlkaW1tX2MwID0gSTkxNV9SRUFEKE1BRF9ESU1NX0MwKTsKKwkJCWRpbW1fYzEgPSBJOTE1X1JF QUQoTUFEX0RJTU1fQzEpOworCQkJZGltbV9jMCAmPSBNQURfRElNTV9BX1NJWkVfTUFTSyB8IE1B RF9ESU1NX0JfU0laRV9NQVNLOworCQkJZGltbV9jMSAmPSBNQURfRElNTV9BX1NJWkVfTUFTSyB8 IE1BRF9ESU1NX0JfU0laRV9NQVNLOworCQkJLyogRW5hYmxlIHN3aXp6bGluZyB3aGVuIHRoZSBj aGFubmVscyBhcmUgcG9wdWxhdGVkCisJCQkgKiB3aXRoIGlkZW50aWNhbGx5IHNpemVkIGRpbW1z LiBXZSBkb24ndCBuZWVkIHRvIGNoZWNrCisJCQkgKiB0aGUgM3JkIGNoYW5uZWwgYmVjYXVzZSBu byBjcHUgd2l0aCBncHUgYXR0YWNoZWQKKwkJCSAqIHNoaXBzIGluIHRoYXQgY29uZmlndXJhdGlv bi4gQWxzbywgc3dpenpsaW5nIG9ubHkKKwkJCSAqIG1ha2VzIHNlbnNlIGZvciAyIGNoYW5uZWxz IGFueXdheS4gKi8KKwkJCWlmIChkaW1tX2MwID09IGRpbW1fYzEpIHsKKwkJCQlzd2l6emxlX3gg PSBJOTE1X0JJVF82X1NXSVpaTEVfOV8xMDsKKwkJCQlzd2l6emxlX3kgPSBJOTE1X0JJVF82X1NX SVpaTEVfOTsKKwkJCX0gZWxzZSB7CisJCQkJc3dpenpsZV94ID0gSTkxNV9CSVRfNl9TV0laWkxF X05PTkU7CisJCQkJc3dpenpsZV95ID0gSTkxNV9CSVRfNl9TV0laWkxFX05PTkU7CisJCQl9CisJ CX0KKwl9IGVsc2UgaWYgKElTX0dFTjUoZGV2X3ByaXYpKSB7CisJCS8qIE9uIElyb25sYWtlIHdo YXRldmVyIERSQU0gY29uZmlnLCBHUFUgYWx3YXlzIGRvCisJCSAqIHNhbWUgc3dpenpsaW5nIHNl dHVwLgorCQkgKi8KKwkJc3dpenpsZV94ID0gSTkxNV9CSVRfNl9TV0laWkxFXzlfMTA7CisJCXN3 aXp6bGVfeSA9IEk5MTVfQklUXzZfU1dJWlpMRV85OworCX0gZWxzZSBpZiAoSVNfR0VOMihkZXZf cHJpdikpIHsKKwkJLyogQXMgZmFyIGFzIHdlIGtub3csIHRoZSA4NjUgZG9lc24ndCBoYXZlIHRo ZXNlIGJpdCA2CisJCSAqIHN3aXp6bGluZyBpc3N1ZXMuCisJCSAqLworCQlzd2l6emxlX3ggPSBJ OTE1X0JJVF82X1NXSVpaTEVfTk9ORTsKKwkJc3dpenpsZV95ID0gSTkxNV9CSVRfNl9TV0laWkxF X05PTkU7CisJfSBlbHNlIGlmIChJU19NT0JJTEUoZGV2X3ByaXYpIHx8IChJU19HRU4zKGRldl9w cml2KSAmJgorCQkgICAhSVNfRzMzKGRldl9wcml2KSkpIHsKKwkJdWludDMyX3QgZGNjOworCisJ CS8qIE9uIDl4eCBjaGlwc2V0cywgY2hhbm5lbCBpbnRlcmxlYXZlIGJ5IHRoZSBDUFUgaXMKKwkJ ICogZGV0ZXJtaW5lZCBieSBEQ0MuICBGb3Igc2luZ2xlLWNoYW5uZWwsIG5laXRoZXIgdGhlIENQ VQorCQkgKiBub3IgdGhlIEdQVSBkbyBzd2l6emxpbmcuICBGb3IgZHVhbCBjaGFubmVsIGludGVy bGVhdmVkLAorCQkgKiB0aGUgR1BVJ3MgaW50ZXJsZWF2ZSBpcyBiaXQgOSBhbmQgMTAgZm9yIFgg dGlsZWQsIGFuZCBiaXQKKwkJICogOSBmb3IgWSB0aWxlZC4gIFRoZSBDUFUncyBpbnRlcmxlYXZl IGlzIGluZGVwZW5kZW50LCBhbmQKKwkJICogY2FuIGJlIGJhc2VkIG9uIGVpdGhlciBiaXQgMTEg KGhhdmVuJ3Qgc2VlbiB0aGlzIHlldCkgb3IKKwkJICogYml0IDE3IChjb21tb24pLgorCQkgKi8K KwkJZGNjID0gSTkxNV9SRUFEKERDQyk7CisJCXN3aXRjaCAoZGNjICYgRENDX0FERFJFU1NJTkdf TU9ERV9NQVNLKSB7CisJCWNhc2UgRENDX0FERFJFU1NJTkdfTU9ERV9TSU5HTEVfQ0hBTk5FTDoK KwkJY2FzZSBEQ0NfQUREUkVTU0lOR19NT0RFX0RVQUxfQ0hBTk5FTF9BU1lNTUVUUklDOgorCQkJ c3dpenpsZV94ID0gSTkxNV9CSVRfNl9TV0laWkxFX05PTkU7CisJCQlzd2l6emxlX3kgPSBJOTE1 X0JJVF82X1NXSVpaTEVfTk9ORTsKKwkJCWJyZWFrOworCQljYXNlIERDQ19BRERSRVNTSU5HX01P REVfRFVBTF9DSEFOTkVMX0lOVEVSTEVBVkVEOgorCQkJaWYgKGRjYyAmIERDQ19DSEFOTkVMX1hP Ul9ESVNBQkxFKSB7CisJCQkJLyogVGhpcyBpcyB0aGUgYmFzZSBzd2l6emxpbmcgYnkgdGhlIEdQ VSBmb3IKKwkJCQkgKiB0aWxlZCBidWZmZXJzLgorCQkJCSAqLworCQkJCXN3aXp6bGVfeCA9IEk5 MTVfQklUXzZfU1dJWlpMRV85XzEwOworCQkJCXN3aXp6bGVfeSA9IEk5MTVfQklUXzZfU1dJWlpM RV85OworCQkJfSBlbHNlIGlmICgoZGNjICYgRENDX0NIQU5ORUxfWE9SX0JJVF8xNykgPT0gMCkg eworCQkJCS8qIEJpdCAxMSBzd2l6emxpbmcgYnkgdGhlIENQVSBpbiBhZGRpdGlvbi4gKi8KKwkJ CQlzd2l6emxlX3ggPSBJOTE1X0JJVF82X1NXSVpaTEVfOV8xMF8xMTsKKwkJCQlzd2l6emxlX3kg PSBJOTE1X0JJVF82X1NXSVpaTEVfOV8xMTsKKwkJCX0gZWxzZSB7CisJCQkJLyogQml0IDE3IHN3 aXp6bGluZyBieSB0aGUgQ1BVIGluIGFkZGl0aW9uLiAqLworCQkJCXN3aXp6bGVfeCA9IEk5MTVf QklUXzZfU1dJWlpMRV85XzEwXzE3OworCQkJCXN3aXp6bGVfeSA9IEk5MTVfQklUXzZfU1dJWlpM RV85XzE3OworCQkJfQorCQkJYnJlYWs7CisJCX0KKworCQkvKiBjaGVjayBmb3IgTC1zaGFwZWQg bWVtb3J5IGFrYSBtb2RpZmllZCBlbmhhbmNlZCBhZGRyZXNzaW5nICovCisJCWlmIChJU19HRU40 KGRldl9wcml2KSAmJgorCQkgICAgIShJOTE1X1JFQUQoRENDMikgJiBEQ0MyX01PRElGSUVEX0VO SEFOQ0VEX0RJU0FCTEUpKSB7CisJCQlzd2l6emxlX3ggPSBJOTE1X0JJVF82X1NXSVpaTEVfVU5L Tk9XTjsKKwkJCXN3aXp6bGVfeSA9IEk5MTVfQklUXzZfU1dJWlpMRV9VTktOT1dOOworCQl9CisK KwkJaWYgKGRjYyA9PSAweGZmZmZmZmZmKSB7CisJCQlEUk1fRVJST1IoIkNvdWxkbid0IHJlYWQg ZnJvbSBNQ0hCQVIuICAiCisJCQkJICAiRGlzYWJsaW5nIHRpbGluZy5cbiIpOworCQkJc3dpenps ZV94ID0gSTkxNV9CSVRfNl9TV0laWkxFX1VOS05PV047CisJCQlzd2l6emxlX3kgPSBJOTE1X0JJ VF82X1NXSVpaTEVfVU5LTk9XTjsKKwkJfQorCX0gZWxzZSB7CisJCS8qIFRoZSA5NjUsIEczMywg YW5kIG5ld2VyLCBoYXZlIGEgdmVyeSBmbGV4aWJsZSBtZW1vcnkKKwkJICogY29uZmlndXJhdGlv bi4gIEl0IHdpbGwgZW5hYmxlIGR1YWwtY2hhbm5lbCBtb2RlCisJCSAqIChpbnRlcmxlYXZpbmcp IG9uIGFzIG11Y2ggbWVtb3J5IGFzIGl0IGNhbiwgYW5kIHRoZSBHUFUKKwkJICogd2lsbCBhZGRp dGlvbmFsbHkgc29tZXRpbWVzIGVuYWJsZSBkaWZmZXJlbnQgYml0IDYKKwkJICogc3dpenpsaW5n IGZvciB0aWxlZCBvYmplY3RzIGZyb20gdGhlIENQVS4KKwkJICoKKwkJICogSGVyZSdzIHdoYXQg SSBmb3VuZCBvbiB0aGUgRzk2NToKKwkJICogICAgc2xvdCBmaWxsICAgICAgICAgbWVtb3J5IHNp emUgIHN3aXp6bGluZworCQkgKiAwQSAgIDBCICAgMUEgICAxQiAgICAxLWNoICAgMi1jaAorCQkg KiA1MTIgIDAgICAgMCAgICAwICAgICA1MTIgICAgMCAgICAgTworCQkgKiA1MTIgIDAgICAgNTEy ICAwICAgICAxNiAgICAgMTAwOCAgWAorCQkgKiA1MTIgIDAgICAgMCAgICA1MTIgICAxNiAgICAg MTAwOCAgWAorCQkgKiAwICAgIDUxMiAgMCAgICA1MTIgICAxNiAgICAgMTAwOCAgWAorCQkgKiAx MDI0IDEwMjQgMTAyNCAwICAgICAyMDQ4ICAgMTAyNCAgTworCQkgKgorCQkgKiBXZSBjb3VsZCBw cm9iYWJseSBkZXRlY3QgdGhpcyBiYXNlZCBvbiBlaXRoZXIgdGhlIERSQgorCQkgKiBtYXRjaGlu Zywgd2hpY2ggd2FzIHRoZSBjYXNlIGZvciB0aGUgc3dpenpsaW5nIHJlcXVpcmVkIGluCisJCSAq IHRoZSB0YWJsZSBhYm92ZSwgb3IgZnJvbSB0aGUgMS1jaCB2YWx1ZSBiZWluZyBsZXNzIHRoYW4K KwkJICogdGhlIG1pbmltdW0gc2l6ZSBvZiBhIHJhbmsuCisJCSAqCisJCSAqIFJlcG9ydHMgaW5k aWNhdGUgdGhhdCB0aGUgc3dpenpsaW5nIGFjdHVhbGx5CisJCSAqIHZhcmllcyBkZXBlbmRpbmcg dXBvbiBwYWdlIHBsYWNlbWVudCBpbnNpZGUgdGhlCisJCSAqIGNoYW5uZWxzLCBpLmUuIHdlIHNl ZSBzd2l6emxlZCBwYWdlcyB3aGVyZSB0aGUKKwkJICogYmFua3Mgb2YgbWVtb3J5IGFyZSBwYWly ZWQgYW5kIHVuc3dpenpsZWQgb24gdGhlCisJCSAqIHVuZXZlbiBwb3J0aW9uLCBzbyBsZWF2ZSB0 aGF0IGFzIHVua25vd24uCisJCSAqLworCQlpZiAoSTkxNV9SRUFEMTYoQzBEUkIzKSA9PSBJOTE1 X1JFQUQxNihDMURSQjMpKSB7CisJCQlzd2l6emxlX3ggPSBJOTE1X0JJVF82X1NXSVpaTEVfOV8x MDsKKwkJCXN3aXp6bGVfeSA9IEk5MTVfQklUXzZfU1dJWlpMRV85OworCQl9CisJfQorCisJaWYg KHN3aXp6bGVfeCA9PSBJOTE1X0JJVF82X1NXSVpaTEVfVU5LTk9XTiB8fAorCSAgICBzd2l6emxl X3kgPT0gSTkxNV9CSVRfNl9TV0laWkxFX1VOS05PV04pIHsKKwkJLyogVXNlcnNwYWNlIGxpa2Vz IHRvIGV4cGxvZGUgaWYgaXQgc2VlcyB1bmtub3duIHN3aXp6bGluZywKKwkJICogc28gbGllLiBX ZSB3aWxsIGZpbmlzaCB0aGUgbGllIHdoZW4gcmVwb3J0aW5nIHRocm91Z2gKKwkJICogdGhlIGdl dC10aWxpbmctaW9jdGwgYnkgcmVwb3J0aW5nIHRoZSBwaHlzaWNhbCBzd2l6emxlCisJCSAqIG1v ZGUgYXMgdW5rbm93biBpbnN0ZWFkLgorCQkgKgorCQkgKiBBcyB3ZSBkb24ndCBzdHJpY3RseSBr bm93IHdoYXQgdGhlIHN3aXp6bGluZyBpcywgaXQgbWF5IGJlCisJCSAqIGJpdDE3IGRlcGVuZGVu dCwgYW5kIHNvIHdlIG5lZWQgdG8gYWxzbyBwcmV2ZW50IHRoZSBwYWdlcworCQkgKiBmcm9tIGJl aW5nIG1vdmVkLgorCQkgKi8KKwkJZGV2X3ByaXYtPnF1aXJrcyB8PSBRVUlSS19QSU5fU1dJWlpM RURfUEFHRVM7CisJCXN3aXp6bGVfeCA9IEk5MTVfQklUXzZfU1dJWlpMRV9OT05FOworCQlzd2l6 emxlX3kgPSBJOTE1X0JJVF82X1NXSVpaTEVfTk9ORTsKKwl9CisKKwlkZXZfcHJpdi0+bW0uYml0 XzZfc3dpenpsZV94ID0gc3dpenpsZV94OworCWRldl9wcml2LT5tbS5iaXRfNl9zd2l6emxlX3kg PSBzd2l6emxlX3k7Cit9CisKKy8qCisgKiBTd2FwIGV2ZXJ5IDY0IGJ5dGVzIG9mIHRoaXMgcGFn ZSBhcm91bmQsIHRvIGFjY291bnQgZm9yIGl0IGhhdmluZyBhIG5ldworICogYml0IDE3IG9mIGl0 cyBwaHlzaWNhbCBhZGRyZXNzIGFuZCB0aGVyZWZvcmUgYmVpbmcgaW50ZXJwcmV0ZWQgZGlmZmVy ZW50bHkKKyAqIGJ5IHRoZSBHUFUuCisgKi8KK3N0YXRpYyB2b2lkCitpOTE1X2dlbV9zd2l6emxl X3BhZ2Uoc3RydWN0IHBhZ2UgKnBhZ2UpCit7CisJY2hhciB0ZW1wWzY0XTsKKwljaGFyICp2YWRk cjsKKwlpbnQgaTsKKworCXZhZGRyID0ga21hcChwYWdlKTsKKworCWZvciAoaSA9IDA7IGkgPCBQ QUdFX1NJWkU7IGkgKz0gMTI4KSB7CisJCW1lbWNweSh0ZW1wLCAmdmFkZHJbaV0sIDY0KTsKKwkJ bWVtY3B5KCZ2YWRkcltpXSwgJnZhZGRyW2kgKyA2NF0sIDY0KTsKKwkJbWVtY3B5KCZ2YWRkcltp ICsgNjRdLCB0ZW1wLCA2NCk7CisJfQorCisJa3VubWFwKHBhZ2UpOworfQorCisvKioKKyAqIGk5 MTVfZ2VtX29iamVjdF9kb19iaXRfMTdfc3dpenpsZSAtIGZpeHVwIGJpdCAxNyBzd2l6emxpbmcK KyAqIEBvYmo6IGk5MTUgR0VNIGJ1ZmZlciBvYmplY3QKKyAqIEBwYWdlczogdGhlIHNjYXR0ZXJn YXRoZXIgbGlzdCBvZiBwaHlzaWNhbCBwYWdlcworICoKKyAqIFRoaXMgZnVuY3Rpb24gZml4ZXMg dXAgdGhlIHN3aXp6bGluZyBpbiBjYXNlIGFueSBwYWdlIGZyYW1lIG51bWJlciBmb3IgdGhpcwor ICogb2JqZWN0IGhhcyBjaGFuZ2VkIGluIGJpdCAxNyBzaW5jZSB0aGF0IHN0YXRlIGhhcyBiZWVu IHNhdmVkIHdpdGgKKyAqIGk5MTVfZ2VtX29iamVjdF9zYXZlX2JpdF8xN19zd2l6emxlKCkuCisg KgorICogVGhpcyBpcyBjYWxsZWQgd2hlbiBwaW5uaW5nIGJhY2tpbmcgc3RvcmFnZSBhZ2Fpbiwg c2luY2UgdGhlIGtlcm5lbCBpcyBmcmVlCisgKiB0byBtb3ZlIHVucGlubmVkIGJhY2tpbmcgc3Rv cmFnZSBhcm91bmQgKGVpdGhlciBieSBkaXJlY3RseSBtb3ZpbmcgcGFnZXMgb3IKKyAqIGJ5IHN3 YXBwaW5nIHRoZW0gb3V0IGFuZCBiYWNrIGluIGFnYWluKS4KKyAqLwordm9pZAoraTkxNV9nZW1f b2JqZWN0X2RvX2JpdF8xN19zd2l6emxlKHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmos CisJCQkJICBzdHJ1Y3Qgc2dfdGFibGUgKnBhZ2VzKQoreworCXN0cnVjdCBzZ3RfaXRlciBzZ3Rf aXRlcjsKKwlzdHJ1Y3QgcGFnZSAqcGFnZTsKKwlpbnQgaTsKKworCWlmIChvYmotPmJpdF8xNyA9 PSBOVUxMKQorCQlyZXR1cm47CisKKwlpID0gMDsKKwlmb3JfZWFjaF9zZ3RfcGFnZShwYWdlLCBz Z3RfaXRlciwgcGFnZXMpIHsKKwkJY2hhciBuZXdfYml0XzE3ID0gcGFnZV90b19waHlzKHBhZ2Up ID4+IDE3OworCQlpZiAoKG5ld19iaXRfMTcgJiAweDEpICE9ICh0ZXN0X2JpdChpLCBvYmotPmJp dF8xNykgIT0gMCkpIHsKKwkJCWk5MTVfZ2VtX3N3aXp6bGVfcGFnZShwYWdlKTsKKwkJCXNldF9w YWdlX2RpcnR5KHBhZ2UpOworCQl9CisJCWkrKzsKKwl9Cit9CisKKy8qKgorICogaTkxNV9nZW1f b2JqZWN0X3NhdmVfYml0XzE3X3N3aXp6bGUgLSBzYXZlIGJpdCAxNyBzd2l6emxpbmcKKyAqIEBv Ymo6IGk5MTUgR0VNIGJ1ZmZlciBvYmplY3QKKyAqIEBwYWdlczogdGhlIHNjYXR0ZXJnYXRoZXIg bGlzdCBvZiBwaHlzaWNhbCBwYWdlcworICoKKyAqIFRoaXMgZnVuY3Rpb24gc2F2ZXMgdGhlIGJp dCAxNyBvZiBlYWNoIHBhZ2UgZnJhbWUgbnVtYmVyIHNvIHRoYXQgc3dpenpsaW5nCisgKiBjYW4g YmUgZml4ZWQgdXAgbGF0ZXIgb24gd2l0aCBpOTE1X2dlbV9vYmplY3RfZG9fYml0XzE3X3N3aXp6 bGUoKS4gVGhpcyBtdXN0CisgKiBiZSBjYWxsZWQgYmVmb3JlIHRoZSBiYWNraW5nIHN0b3JhZ2Ug Y2FuIGJlIHVucGlubmVkLgorICovCit2b2lkCitpOTE1X2dlbV9vYmplY3Rfc2F2ZV9iaXRfMTdf c3dpenpsZShzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqLAorCQkJCSAgICBzdHJ1Y3Qg c2dfdGFibGUgKnBhZ2VzKQoreworCWNvbnN0IHVuc2lnbmVkIGludCBwYWdlX2NvdW50ID0gb2Jq LT5iYXNlLnNpemUgPj4gUEFHRV9TSElGVDsKKwlzdHJ1Y3Qgc2d0X2l0ZXIgc2d0X2l0ZXI7CisJ c3RydWN0IHBhZ2UgKnBhZ2U7CisJaW50IGk7CisKKwlpZiAob2JqLT5iaXRfMTcgPT0gTlVMTCkg eworCQlvYmotPmJpdF8xNyA9IGtjYWxsb2MoQklUU19UT19MT05HUyhwYWdlX2NvdW50KSwKKwkJ CQkgICAgICBzaXplb2YobG9uZyksIEdGUF9LRVJORUwpOworCQlpZiAob2JqLT5iaXRfMTcgPT0g TlVMTCkgeworCQkJRFJNX0VSUk9SKCJGYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBiaXQg MTcgIgorCQkJCSAgInJlY29yZFxuIik7CisJCQlyZXR1cm47CisJCX0KKwl9CisKKwlpID0gMDsK KworCWZvcl9lYWNoX3NndF9wYWdlKHBhZ2UsIHNndF9pdGVyLCBwYWdlcykgeworCQlpZiAocGFn ZV90b19waHlzKHBhZ2UpICYgKDEgPDwgMTcpKQorCQkJX19zZXRfYml0KGksIG9iai0+Yml0XzE3 KTsKKwkJZWxzZQorCQkJX19jbGVhcl9iaXQoaSwgb2JqLT5iaXRfMTcpOworCQlpKys7CisJfQor fQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9nZW1fZmVuY2VfcmVnLmgg Yi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2dlbV9mZW5jZV9yZWcuaApuZXcgZmlsZSBtb2Rl IDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMmM0YTJkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVy cy9ncHUvZHJtL2k5MTUvaTkxNV9nZW1fZmVuY2VfcmVnLmgKQEAgLTAsMCArMSw1MSBAQAorLyoK KyAqIENvcHlyaWdodCDCqSAyMDE2IEludGVsIENvcnBvcmF0aW9uCisgKgorICogUGVybWlzc2lv biBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWlu aW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0 aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3 aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUg cmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwg c3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0 byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRv IGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUg YWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVk aW5nIHRoZSBuZXh0CisgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3Bp ZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCisgKiBTb2Z0d2FyZS4KKyAqCisgKiBU SEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkg S0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBU TyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBB UlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwK KyAqIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENM QUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9O IE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogRlJPTSwgT1VUIE9G IE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBE RUFMSU5HUworICogSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqLworCisjaWZuZGVmIF9fSTkxNV9G RU5DRV9SRUdfSF9fCisjZGVmaW5lIF9fSTkxNV9GRU5DRV9SRUdfSF9fCisKKyNpbmNsdWRlIDxs aW51eC9saXN0Lmg+CisKK3N0cnVjdCBkcm1faTkxNV9wcml2YXRlOworc3RydWN0IGk5MTVfdm1h OworCitzdHJ1Y3QgZHJtX2k5MTVfZmVuY2VfcmVnIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpbms7 CisJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmk5MTU7CisJc3RydWN0IGk5MTVfdm1hICp2bWE7 CisJaW50IHBpbl9jb3VudDsKKwlpbnQgaWQ7CisJLyoqCisJICogV2hldGhlciB0aGUgdGlsaW5n IHBhcmFtZXRlcnMgZm9yIHRoZSBjdXJyZW50bHkKKwkgKiBhc3NvY2lhdGVkIGZlbmNlIHJlZ2lz dGVyIGhhdmUgY2hhbmdlZC4gTm90ZSB0aGF0CisJICogZm9yIHRoZSBwdXJwb3NlcyBvZiB0cmFj a2luZyB0aWxpbmcgY2hhbmdlcyB3ZSBhbHNvCisJICogdHJlYXQgdGhlIHVuZmVuY2VkIHJlZ2lz dGVyLCB0aGUgcmVnaXN0ZXIgc2xvdCB0aGF0CisJICogdGhlIG9iamVjdCBvY2N1cGllcyB3aGls c3QgaXQgZXhlY3V0ZXMgYSBmZW5jZWQKKwkgKiBjb21tYW5kIChzdWNoIGFzIEJMVCBvbiBnZW4y LzMpLCBhcyBhICJmZW5jZSIuCisJICovCisJYm9vbCBkaXJ0eTsKK307CisKKyNlbmRpZgorCmRp ZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2dlbV9ndHQuYyBiL2RyaXZlcnMv Z3B1L2RybS9pOTE1L2k5MTVfZ2VtX2d0dC5jCmluZGV4IGE1ZmFmYTMuLmY2MGU1YTcgMTAwNjQ0 Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZ2VtX2d0dC5jCisrKyBiL2RyaXZlcnMv Z3B1L2RybS9pOTE1L2k5MTVfZ2VtX2d0dC5jCkBAIC05NiwxMyArOTYsNiBAQAogICoKICAqLwog Ci1zdGF0aWMgaW5saW5lIHN0cnVjdCBpOTE1X2dndHQgKgotaTkxNV92bV90b19nZ3R0KHN0cnVj dCBpOTE1X2FkZHJlc3Nfc3BhY2UgKnZtKQotewotCUdFTV9CVUdfT04oIWk5MTVfaXNfZ2d0dCh2 bSkpOwotCXJldHVybiBjb250YWluZXJfb2Yodm0sIHN0cnVjdCBpOTE1X2dndHQsIGJhc2UpOwot fQotCiBzdGF0aWMgaW50CiBpOTE1X2dldF9nZ3R0X3ZtYV9wYWdlcyhzdHJ1Y3QgaTkxNV92bWEg KnZtYSk7CiAKQEAgLTMzNDgsMTc2ICszMzQxLDYgQEAgdm9pZCBpOTE1X2dlbV9yZXN0b3JlX2d0 dF9tYXBwaW5ncyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQogCWk5MTVfZ2d0dF9mbHVzaChkZXZf cHJpdik7CiB9CiAKLXN0YXRpYyB2b2lkCi1pOTE1X3ZtYV9yZXRpcmUoc3RydWN0IGk5MTVfZ2Vt X2FjdGl2ZSAqYWN0aXZlLAotCQlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX3JlcXVlc3QgKnJxKQotewot CWNvbnN0IHVuc2lnbmVkIGludCBpZHggPSBycS0+ZW5naW5lLT5pZDsKLQlzdHJ1Y3QgaTkxNV92 bWEgKnZtYSA9Ci0JCWNvbnRhaW5lcl9vZihhY3RpdmUsIHN0cnVjdCBpOTE1X3ZtYSwgbGFzdF9y ZWFkW2lkeF0pOwotCXN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmogPSB2bWEtPm9iajsK LQotCUdFTV9CVUdfT04oIWk5MTVfdm1hX2hhc19hY3RpdmVfZW5naW5lKHZtYSwgaWR4KSk7Ci0K LQlpOTE1X3ZtYV9jbGVhcl9hY3RpdmUodm1hLCBpZHgpOwotCWlmIChpOTE1X3ZtYV9pc19hY3Rp dmUodm1hKSkKLQkJcmV0dXJuOwotCi0JbGlzdF9tb3ZlX3RhaWwoJnZtYS0+dm1fbGluaywgJnZt YS0+dm0tPmluYWN0aXZlX2xpc3QpOwotCWlmICh1bmxpa2VseShpOTE1X3ZtYV9pc19jbG9zZWQo dm1hKSAmJiAhaTkxNV92bWFfaXNfcGlubmVkKHZtYSkpKQotCQlXQVJOX09OKGk5MTVfdm1hX3Vu YmluZCh2bWEpKTsKLQotCUdFTV9CVUdfT04oIWk5MTVfZ2VtX29iamVjdF9pc19hY3RpdmUob2Jq KSk7Ci0JaWYgKC0tb2JqLT5hY3RpdmVfY291bnQpCi0JCXJldHVybjsKLQotCS8qIEJ1bXAgb3Vy IHBsYWNlIG9uIHRoZSBib3VuZCBsaXN0IHRvIGtlZXAgaXQgcm91Z2hseSBpbiBMUlUgb3JkZXIK LQkgKiBzbyB0aGF0IHdlIGRvbid0IHN0ZWFsIGZyb20gcmVjZW50bHkgdXNlZCBidXQgaW5hY3Rp dmUgb2JqZWN0cwotCSAqICh1bmxlc3Mgd2UgYXJlIGZvcmNlZCB0byBvZmMhKQotCSAqLwotCWlm IChvYmotPmJpbmRfY291bnQpCi0JCWxpc3RfbW92ZV90YWlsKCZvYmotPmdsb2JhbF9saW5rLCAm cnEtPmk5MTUtPm1tLmJvdW5kX2xpc3QpOwotCi0Jb2JqLT5tbS5kaXJ0eSA9IHRydWU7IC8qIGJl IHBhcmFub2lkICAqLwotCi0JaWYgKGk5MTVfZ2VtX29iamVjdF9oYXNfYWN0aXZlX3JlZmVyZW5j ZShvYmopKSB7Ci0JCWk5MTVfZ2VtX29iamVjdF9jbGVhcl9hY3RpdmVfcmVmZXJlbmNlKG9iaik7 Ci0JCWk5MTVfZ2VtX29iamVjdF9wdXQob2JqKTsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkCi1pOTE1 X2dndHRfcmV0aXJlX193cml0ZShzdHJ1Y3QgaTkxNV9nZW1fYWN0aXZlICphY3RpdmUsCi0JCQlz dHJ1Y3QgZHJtX2k5MTVfZ2VtX3JlcXVlc3QgKnJlcXVlc3QpCi17Ci0Jc3RydWN0IGk5MTVfdm1h ICp2bWEgPQotCQljb250YWluZXJfb2YoYWN0aXZlLCBzdHJ1Y3QgaTkxNV92bWEsIGxhc3Rfd3Jp dGUpOwotCi0JaW50ZWxfZmJfb2JqX2ZsdXNoKHZtYS0+b2JqLCB0cnVlLCBPUklHSU5fQ1MpOwot fQotCi12b2lkIGk5MTVfdm1hX2Rlc3Ryb3koc3RydWN0IGk5MTVfdm1hICp2bWEpCi17Ci0JR0VN X0JVR19PTih2bWEtPm5vZGUuYWxsb2NhdGVkKTsKLQlHRU1fQlVHX09OKGk5MTVfdm1hX2lzX2Fj dGl2ZSh2bWEpKTsKLQlHRU1fQlVHX09OKCFpOTE1X3ZtYV9pc19jbG9zZWQodm1hKSk7Ci0JR0VN X0JVR19PTih2bWEtPmZlbmNlKTsKLQotCWxpc3RfZGVsKCZ2bWEtPnZtX2xpbmspOwotCWlmICgh aTkxNV92bWFfaXNfZ2d0dCh2bWEpKQotCQlpOTE1X3BwZ3R0X3B1dChpOTE1X3ZtX3RvX3BwZ3R0 KHZtYS0+dm0pKTsKLQotCWttZW1fY2FjaGVfZnJlZSh0b19pOTE1KHZtYS0+b2JqLT5iYXNlLmRl diktPnZtYXMsIHZtYSk7Ci19Ci0KLXZvaWQgaTkxNV92bWFfY2xvc2Uoc3RydWN0IGk5MTVfdm1h ICp2bWEpCi17Ci0JR0VNX0JVR19PTihpOTE1X3ZtYV9pc19jbG9zZWQodm1hKSk7Ci0Jdm1hLT5m bGFncyB8PSBJOTE1X1ZNQV9DTE9TRUQ7Ci0KLQlsaXN0X2RlbCgmdm1hLT5vYmpfbGluayk7Ci0J cmJfZXJhc2UoJnZtYS0+b2JqX25vZGUsICZ2bWEtPm9iai0+dm1hX3RyZWUpOwotCi0JaWYgKCFp OTE1X3ZtYV9pc19hY3RpdmUodm1hKSAmJiAhaTkxNV92bWFfaXNfcGlubmVkKHZtYSkpCi0JCVdB Uk5fT04oaTkxNV92bWFfdW5iaW5kKHZtYSkpOwotfQotCi1zdGF0aWMgaW5saW5lIGxvbmcgdm1h X2NvbXBhcmUoc3RydWN0IGk5MTVfdm1hICp2bWEsCi0JCQkgICAgICAgc3RydWN0IGk5MTVfYWRk cmVzc19zcGFjZSAqdm0sCi0JCQkgICAgICAgY29uc3Qgc3RydWN0IGk5MTVfZ2d0dF92aWV3ICp2 aWV3KQotewotCUdFTV9CVUdfT04odmlldyAmJiAhaTkxNV9pc19nZ3R0KHZtKSk7Ci0KLQlpZiAo dm1hLT52bSAhPSB2bSkKLQkJcmV0dXJuIHZtYS0+dm0gLSB2bTsKLQotCWlmICghdmlldykKLQkJ cmV0dXJuIHZtYS0+Z2d0dF92aWV3LnR5cGU7Ci0KLQlpZiAodm1hLT5nZ3R0X3ZpZXcudHlwZSAh PSB2aWV3LT50eXBlKQotCQlyZXR1cm4gdm1hLT5nZ3R0X3ZpZXcudHlwZSAtIHZpZXctPnR5cGU7 Ci0KLQlyZXR1cm4gbWVtY21wKCZ2bWEtPmdndHRfdmlldy5wYXJhbXMsCi0JCSAgICAgICZ2aWV3 LT5wYXJhbXMsCi0JCSAgICAgIHNpemVvZih2aWV3LT5wYXJhbXMpKTsKLX0KLQotc3RhdGljIHN0 cnVjdCBpOTE1X3ZtYSAqCi1fX2k5MTVfdm1hX2NyZWF0ZShzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29i amVjdCAqb2JqLAotCQkgIHN0cnVjdCBpOTE1X2FkZHJlc3Nfc3BhY2UgKnZtLAotCQkgIGNvbnN0 IHN0cnVjdCBpOTE1X2dndHRfdmlldyAqdmlldykKLXsKLQlzdHJ1Y3QgaTkxNV92bWEgKnZtYTsK LQlzdHJ1Y3QgcmJfbm9kZSAqcmIsICoqcDsKLQlpbnQgaTsKLQotCUdFTV9CVUdfT04odm0tPmNs b3NlZCk7Ci0KLQl2bWEgPSBrbWVtX2NhY2hlX3phbGxvYyh0b19pOTE1KG9iai0+YmFzZS5kZXYp LT52bWFzLCBHRlBfS0VSTkVMKTsKLQlpZiAodm1hID09IE5VTEwpCi0JCXJldHVybiBFUlJfUFRS KC1FTk9NRU0pOwotCi0JSU5JVF9MSVNUX0hFQUQoJnZtYS0+ZXhlY19saXN0KTsKLQlmb3IgKGkg PSAwOyBpIDwgQVJSQVlfU0laRSh2bWEtPmxhc3RfcmVhZCk7IGkrKykKLQkJaW5pdF9yZXF1ZXN0 X2FjdGl2ZSgmdm1hLT5sYXN0X3JlYWRbaV0sIGk5MTVfdm1hX3JldGlyZSk7Ci0JaW5pdF9yZXF1 ZXN0X2FjdGl2ZSgmdm1hLT5sYXN0X3dyaXRlLAotCQkJICAgIGk5MTVfaXNfZ2d0dCh2bSkgPyBp OTE1X2dndHRfcmV0aXJlX193cml0ZSA6IE5VTEwpOwotCWluaXRfcmVxdWVzdF9hY3RpdmUoJnZt YS0+bGFzdF9mZW5jZSwgTlVMTCk7Ci0JbGlzdF9hZGQoJnZtYS0+dm1fbGluaywgJnZtLT51bmJv dW5kX2xpc3QpOwotCXZtYS0+dm0gPSB2bTsKLQl2bWEtPm9iaiA9IG9iajsKLQl2bWEtPnNpemUg PSBvYmotPmJhc2Uuc2l6ZTsKLQotCWlmICh2aWV3KSB7Ci0JCXZtYS0+Z2d0dF92aWV3ID0gKnZp ZXc7Ci0JCWlmICh2aWV3LT50eXBlID09IEk5MTVfR0dUVF9WSUVXX1BBUlRJQUwpIHsKLQkJCXZt YS0+c2l6ZSA9IHZpZXctPnBhcmFtcy5wYXJ0aWFsLnNpemU7Ci0JCQl2bWEtPnNpemUgPDw9IFBB R0VfU0hJRlQ7Ci0JCX0gZWxzZSBpZiAodmlldy0+dHlwZSA9PSBJOTE1X0dHVFRfVklFV19ST1RB VEVEKSB7Ci0JCQl2bWEtPnNpemUgPQotCQkJCWludGVsX3JvdGF0aW9uX2luZm9fc2l6ZSgmdmll dy0+cGFyYW1zLnJvdGF0ZWQpOwotCQkJdm1hLT5zaXplIDw8PSBQQUdFX1NISUZUOwotCQl9Ci0J fQotCi0JaWYgKGk5MTVfaXNfZ2d0dCh2bSkpIHsKLQkJdm1hLT5mbGFncyB8PSBJOTE1X1ZNQV9H R1RUOwotCQlsaXN0X2FkZCgmdm1hLT5vYmpfbGluaywgJm9iai0+dm1hX2xpc3QpOwotCX0gZWxz ZSB7Ci0JCWk5MTVfcHBndHRfZ2V0KGk5MTVfdm1fdG9fcHBndHQodm0pKTsKLQkJbGlzdF9hZGRf dGFpbCgmdm1hLT5vYmpfbGluaywgJm9iai0+dm1hX2xpc3QpOwotCX0KLQotCXJiID0gTlVMTDsK LQlwID0gJm9iai0+dm1hX3RyZWUucmJfbm9kZTsKLQl3aGlsZSAoKnApIHsKLQkJc3RydWN0IGk5 MTVfdm1hICpwb3M7Ci0KLQkJcmIgPSAqcDsKLQkJcG9zID0gcmJfZW50cnkocmIsIHN0cnVjdCBp OTE1X3ZtYSwgb2JqX25vZGUpOwotCQlpZiAodm1hX2NvbXBhcmUocG9zLCB2bSwgdmlldykgPCAw KQotCQkJcCA9ICZyYi0+cmJfcmlnaHQ7Ci0JCWVsc2UKLQkJCXAgPSAmcmItPnJiX2xlZnQ7Ci0J fQotCXJiX2xpbmtfbm9kZSgmdm1hLT5vYmpfbm9kZSwgcmIsIHApOwotCXJiX2luc2VydF9jb2xv cigmdm1hLT5vYmpfbm9kZSwgJm9iai0+dm1hX3RyZWUpOwotCi0JcmV0dXJuIHZtYTsKLX0KLQot c3RydWN0IGk5MTVfdm1hICoKLWk5MTVfdm1hX2NyZWF0ZShzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29i amVjdCAqb2JqLAotCQlzdHJ1Y3QgaTkxNV9hZGRyZXNzX3NwYWNlICp2bSwKLQkJY29uc3Qgc3Ry dWN0IGk5MTVfZ2d0dF92aWV3ICp2aWV3KQotewotCWxvY2tkZXBfYXNzZXJ0X2hlbGQoJm9iai0+ YmFzZS5kZXYtPnN0cnVjdF9tdXRleCk7Ci0JR0VNX0JVR19PTih2aWV3ICYmICFpOTE1X2lzX2dn dHQodm0pKTsKLQlHRU1fQlVHX09OKGk5MTVfZ2VtX29ial90b192bWEob2JqLCB2bSwgdmlldykp OwotCi0JcmV0dXJuIF9faTkxNV92bWFfY3JlYXRlKG9iaiwgdm0sIHZpZXcpOwotfQotCiBzdHJ1 Y3QgaTkxNV92bWEgKgogaTkxNV9nZW1fb2JqX3RvX3ZtYShzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29i amVjdCAqb2JqLAogCQkgICAgc3RydWN0IGk5MTVfYWRkcmVzc19zcGFjZSAqdm0sCkBAIC0zNTMw LDcgKzMzNTMsNyBAQCBpOTE1X2dlbV9vYmpfdG9fdm1hKHN0cnVjdCBkcm1faTkxNV9nZW1fb2Jq ZWN0ICpvYmosCiAJCXN0cnVjdCBpOTE1X3ZtYSAqdm1hID0gcmJfZW50cnkocmIsIHN0cnVjdCBp OTE1X3ZtYSwgb2JqX25vZGUpOwogCQlsb25nIGNtcDsKIAotCQljbXAgPSB2bWFfY29tcGFyZSh2 bWEsIHZtLCB2aWV3KTsKKwkJY21wID0gaTkxNV92bWFfY29tcGFyZSh2bWEsIHZtLCB2aWV3KTsK IAkJaWYgKGNtcCA9PSAwKQogCQkJcmV0dXJuIHZtYTsKIApAQCAtMzU1NSw3ICszMzc4LDcgQEAg aTkxNV9nZW1fb2JqX2xvb2t1cF9vcl9jcmVhdGVfdm1hKHN0cnVjdCBkcm1faTkxNV9nZW1fb2Jq ZWN0ICpvYmosCiAKIAl2bWEgPSBpOTE1X2dlbV9vYmpfdG9fdm1hKG9iaiwgdm0sIHZpZXcpOwog CWlmICghdm1hKSB7Ci0JCXZtYSA9IF9faTkxNV92bWFfY3JlYXRlKG9iaiwgdm0sIHZpZXcpOwor CQl2bWEgPSBpOTE1X3ZtYV9jcmVhdGUob2JqLCB2bSwgdmlldyk7CiAJCUdFTV9CVUdfT04odm1h ICE9IGk5MTVfZ2VtX29ial90b192bWEob2JqLCB2bSwgdmlldykpOwogCX0KIApAQCAtMzc0Nyw5 OSArMzU3MCwzIEBAIGk5MTVfZ2V0X2dndHRfdm1hX3BhZ2VzKHN0cnVjdCBpOTE1X3ZtYSAqdm1h KQogCXJldHVybiByZXQ7CiB9CiAKLS8qKgotICogaTkxNV92bWFfYmluZCAtIFNldHMgdXAgUFRF cyBmb3IgYW4gVk1BIGluIGl0J3MgY29ycmVzcG9uZGluZyBhZGRyZXNzIHNwYWNlLgotICogQHZt YTogVk1BIHRvIG1hcAotICogQGNhY2hlX2xldmVsOiBtYXBwaW5nIGNhY2hlIGxldmVsCi0gKiBA ZmxhZ3M6IGZsYWdzIGxpa2UgZ2xvYmFsIG9yIGxvY2FsIG1hcHBpbmcKLSAqCi0gKiBETUEgYWRk cmVzc2VzIGFyZSB0YWtlbiBmcm9tIHRoZSBzY2F0dGVyLWdhdGhlciB0YWJsZSBvZiB0aGlzIG9i amVjdCAob3Igb2YKLSAqIHRoaXMgVk1BIGluIGNhc2Ugb2Ygbm9uLWRlZmF1bHQgR0dUVCB2aWV3 cykgYW5kIFBURSBlbnRyaWVzIHNldCB1cC4KLSAqIE5vdGUgdGhhdCBETUEgYWRkcmVzc2VzIGFy ZSBhbHNvIHRoZSBvbmx5IHBhcnQgb2YgdGhlIFNHIHRhYmxlIHdlIGNhcmUgYWJvdXQuCi0gKi8K LWludCBpOTE1X3ZtYV9iaW5kKHN0cnVjdCBpOTE1X3ZtYSAqdm1hLCBlbnVtIGk5MTVfY2FjaGVf bGV2ZWwgY2FjaGVfbGV2ZWwsCi0JCSAgdTMyIGZsYWdzKQotewotCXUzMiBiaW5kX2ZsYWdzOwot CXUzMiB2bWFfZmxhZ3M7Ci0JaW50IHJldDsKLQotCWlmIChXQVJOX09OKGZsYWdzID09IDApKQot CQlyZXR1cm4gLUVJTlZBTDsKLQotCWJpbmRfZmxhZ3MgPSAwOwotCWlmIChmbGFncyAmIFBJTl9H TE9CQUwpCi0JCWJpbmRfZmxhZ3MgfD0gSTkxNV9WTUFfR0xPQkFMX0JJTkQ7Ci0JaWYgKGZsYWdz ICYgUElOX1VTRVIpCi0JCWJpbmRfZmxhZ3MgfD0gSTkxNV9WTUFfTE9DQUxfQklORDsKLQotCXZt YV9mbGFncyA9IHZtYS0+ZmxhZ3MgJiAoSTkxNV9WTUFfR0xPQkFMX0JJTkQgfCBJOTE1X1ZNQV9M T0NBTF9CSU5EKTsKLQlpZiAoZmxhZ3MgJiBQSU5fVVBEQVRFKQotCQliaW5kX2ZsYWdzIHw9IHZt YV9mbGFnczsKLQllbHNlCi0JCWJpbmRfZmxhZ3MgJj0gfnZtYV9mbGFnczsKLQlpZiAoYmluZF9m bGFncyA9PSAwKQotCQlyZXR1cm4gMDsKLQotCWlmICh2bWFfZmxhZ3MgPT0gMCAmJiB2bWEtPnZt LT5hbGxvY2F0ZV92YV9yYW5nZSkgewotCQl0cmFjZV9pOTE1X3ZhX2FsbG9jKHZtYSk7Ci0JCXJl dCA9IHZtYS0+dm0tPmFsbG9jYXRlX3ZhX3JhbmdlKHZtYS0+dm0sCi0JCQkJCQkgdm1hLT5ub2Rl LnN0YXJ0LAotCQkJCQkJIHZtYS0+bm9kZS5zaXplKTsKLQkJaWYgKHJldCkKLQkJCXJldHVybiBy ZXQ7Ci0JfQotCi0JcmV0ID0gdm1hLT52bS0+YmluZF92bWEodm1hLCBjYWNoZV9sZXZlbCwgYmlu ZF9mbGFncyk7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLQotCXZtYS0+ZmxhZ3MgfD0gYmlu ZF9mbGFnczsKLQlyZXR1cm4gMDsKLX0KLQotdm9pZCBfX2lvbWVtICppOTE1X3ZtYV9waW5faW9t YXAoc3RydWN0IGk5MTVfdm1hICp2bWEpCi17Ci0Jdm9pZCBfX2lvbWVtICpwdHI7Ci0KLQkvKiBB Y2Nlc3MgdGhyb3VnaCB0aGUgR1RUIHJlcXVpcmVzIHRoZSBkZXZpY2UgdG8gYmUgYXdha2UuICov Ci0JYXNzZXJ0X3JwbV93YWtlbG9ja19oZWxkKHRvX2k5MTUodm1hLT52bS0+ZGV2KSk7Ci0KLQls b2NrZGVwX2Fzc2VydF9oZWxkKCZ2bWEtPnZtLT5kZXYtPnN0cnVjdF9tdXRleCk7Ci0JaWYgKFdB Uk5fT04oIWk5MTVfdm1hX2lzX21hcF9hbmRfZmVuY2VhYmxlKHZtYSkpKQotCQlyZXR1cm4gSU9f RVJSX1BUUigtRU5PREVWKTsKLQotCUdFTV9CVUdfT04oIWk5MTVfdm1hX2lzX2dndHQodm1hKSk7 Ci0JR0VNX0JVR19PTigodm1hLT5mbGFncyAmIEk5MTVfVk1BX0dMT0JBTF9CSU5EKSA9PSAwKTsK LQotCXB0ciA9IHZtYS0+aW9tYXA7Ci0JaWYgKHB0ciA9PSBOVUxMKSB7Ci0JCXB0ciA9IGlvX21h cHBpbmdfbWFwX3djKCZpOTE1X3ZtX3RvX2dndHQodm1hLT52bSktPm1hcHBhYmxlLAotCQkJCQl2 bWEtPm5vZGUuc3RhcnQsCi0JCQkJCXZtYS0+bm9kZS5zaXplKTsKLQkJaWYgKHB0ciA9PSBOVUxM KQotCQkJcmV0dXJuIElPX0VSUl9QVFIoLUVOT01FTSk7Ci0KLQkJdm1hLT5pb21hcCA9IHB0cjsK LQl9Ci0KLQlfX2k5MTVfdm1hX3Bpbih2bWEpOwotCXJldHVybiBwdHI7Ci19Ci0KLXZvaWQgaTkx NV92bWFfdW5waW5fYW5kX3JlbGVhc2Uoc3RydWN0IGk5MTVfdm1hICoqcF92bWEpCi17Ci0Jc3Ry dWN0IGk5MTVfdm1hICp2bWE7Ci0Jc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iajsKLQot CXZtYSA9IGZldGNoX2FuZF96ZXJvKHBfdm1hKTsKLQlpZiAoIXZtYSkKLQkJcmV0dXJuOwotCi0J b2JqID0gdm1hLT5vYmo7Ci0KLQlpOTE1X3ZtYV91bnBpbih2bWEpOwotCWk5MTVfdm1hX2Nsb3Nl KHZtYSk7Ci0KLQlfX2k5MTVfZ2VtX29iamVjdF9yZWxlYXNlX3VubGVzc19hY3RpdmUob2JqKTsK LX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZ2VtX2d0dC5oIGIvZHJp dmVycy9ncHUvZHJtL2k5MTUvaTkxNV9nZW1fZ3R0LmgKaW5kZXggYzIzZWY5ZC4uNTdiNTg0OSAx MDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9nZW1fZ3R0LmgKKysrIGIvZHJp dmVycy9ncHUvZHJtL2k5MTUvaTkxNV9nZW1fZ3R0LmgKQEAgLTM1LDcgKzM1LDkgQEAKICNkZWZp bmUgX19JOTE1X0dFTV9HVFRfSF9fCiAKICNpbmNsdWRlIDxsaW51eC9pby1tYXBwaW5nLmg+Cisj aW5jbHVkZSA8bGludXgvbW0uaD4KIAorI2luY2x1ZGUgImk5MTVfZ2VtX3RpbWVsaW5lLmgiCiAj aW5jbHVkZSAiaTkxNV9nZW1fcmVxdWVzdC5oIgogCiAjZGVmaW5lIEk5MTVfRkVOQ0VfUkVHX05P TkUgLTEKQEAgLTEzOCw2ICsxNDAsOCBAQCB0eXBlZGVmIHVpbnQ2NF90IGdlbjhfcHBndHRfcG1s NGVfdDsKICNkZWZpbmUgR0VOOF9QUEFUX0VMTENfT1ZFUlJJREUJCSgwPDwyKQogI2RlZmluZSBH RU44X1BQQVQoaSwgeCkJCQkoKHVpbnQ2NF90KSAoeCkgPDwgKChpKSAqIDgpKQogCitzdHJ1Y3Qg c2dfdGFibGU7CisKIGVudW0gaTkxNV9nZ3R0X3ZpZXdfdHlwZSB7CiAJSTkxNV9HR1RUX1ZJRVdf Tk9STUFMID0gMCwKIAlJOTE1X0dHVFRfVklFV19ST1RBVEVELApAQCAtMTY4LDEzNSArMTcyLDcg QEAgZXh0ZXJuIGNvbnN0IHN0cnVjdCBpOTE1X2dndHRfdmlldyBpOTE1X2dndHRfdmlld19yb3Rh dGVkOwogCiBlbnVtIGk5MTVfY2FjaGVfbGV2ZWw7CiAKLS8qKgotICogQSBWTUEgcmVwcmVzZW50 cyBhIEdFTSBCTyB0aGF0IGlzIGJvdW5kIGludG8gYW4gYWRkcmVzcyBzcGFjZS4gVGhlcmVmb3Jl LCBhCi0gKiBWTUEncyBwcmVzZW5jZSBjYW5ub3QgYmUgZ3VhcmFudGVlZCBiZWZvcmUgYmluZGlu Zywgb3IgYWZ0ZXIgdW5iaW5kaW5nIHRoZQotICogb2JqZWN0IGludG8vZnJvbSB0aGUgYWRkcmVz cyBzcGFjZS4KLSAqCi0gKiBUbyBtYWtlIHRoaW5ncyBhcyBzaW1wbGUgYXMgcG9zc2libGUgKGll LiBubyByZWZjb3VudGluZyksIGEgVk1BJ3MgbGlmZXRpbWUKLSAqIHdpbGwgYWx3YXlzIGJlIDw9 IGFuIG9iamVjdHMgbGlmZXRpbWUuIFNvIG9iamVjdCByZWZjb3VudGluZyBzaG91bGQgY292ZXIg dXMuCi0gKi8KLXN0cnVjdCBpOTE1X3ZtYSB7Ci0Jc3RydWN0IGRybV9tbV9ub2RlIG5vZGU7Ci0J c3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iajsKLQlzdHJ1Y3QgaTkxNV9hZGRyZXNzX3Nw YWNlICp2bTsKLQlzdHJ1Y3QgZHJtX2k5MTVfZmVuY2VfcmVnICpmZW5jZTsKLQlzdHJ1Y3Qgc2df dGFibGUgKnBhZ2VzOwotCXZvaWQgX19pb21lbSAqaW9tYXA7Ci0JdTY0IHNpemU7Ci0JdTY0IGRp c3BsYXlfYWxpZ25tZW50OwotCi0JdW5zaWduZWQgaW50IGZsYWdzOwotCS8qKgotCSAqIEhvdyBt YW55IHVzZXJzIGhhdmUgcGlubmVkIHRoaXMgb2JqZWN0IGluIEdUVCBzcGFjZS4gVGhlIGZvbGxv d2luZwotCSAqIHVzZXJzIGNhbiBlYWNoIGhvbGQgYXQgbW9zdCBvbmUgcmVmZXJlbmNlOiBwd3Jp dGUvcHJlYWQsIGV4ZWNidWZmZXIKLQkgKiAob2JqZWN0cyBhcmUgbm90IGFsbG93ZWQgbXVsdGlw bGUgdGltZXMgZm9yIHRoZSBzYW1lIGJhdGNoYnVmZmVyKSwKLQkgKiBhbmQgdGhlIGZyYW1lYnVm ZmVyIGNvZGUuIFdoZW4gc3dpdGNoaW5nL3BhZ2VmbGlwcGluZywgdGhlCi0JICogZnJhbWVidWZm ZXIgY29kZSBoYXMgYXQgbW9zdCB0d28gYnVmZmVycyBwaW5uZWQgcGVyIGNydGMuCi0JICoKLQkg KiBJbiB0aGUgd29yc3QgY2FzZSB0aGlzIGlzIDEgKyAxICsgMSArIDIqMiA9IDcuIFRoYXQgd291 bGQgZml0IGludG8gMwotCSAqIGJpdHMgd2l0aCBhYnNvbHV0ZWx5IG5vIGhlYWRyb29tLiBTbyB1 c2UgNCBiaXRzLgotCSAqLwotI2RlZmluZSBJOTE1X1ZNQV9QSU5fTUFTSyAweGYKLSNkZWZpbmUg STkxNV9WTUFfUElOX09WRVJGTE9XCUJJVCg1KQotCi0JLyoqIEZsYWdzIGFuZCBhZGRyZXNzIHNw YWNlIHRoaXMgVk1BIGlzIGJvdW5kIHRvICovCi0jZGVmaW5lIEk5MTVfVk1BX0dMT0JBTF9CSU5E CUJJVCg2KQotI2RlZmluZSBJOTE1X1ZNQV9MT0NBTF9CSU5ECUJJVCg3KQotI2RlZmluZSBJOTE1 X1ZNQV9CSU5EX01BU0sgKEk5MTVfVk1BX0dMT0JBTF9CSU5EIHwgSTkxNV9WTUFfTE9DQUxfQklO RCB8IEk5MTVfVk1BX1BJTl9PVkVSRkxPVykKLQotI2RlZmluZSBJOTE1X1ZNQV9HR1RUCQlCSVQo OCkKLSNkZWZpbmUgSTkxNV9WTUFfQ0FOX0ZFTkNFCUJJVCg5KQotI2RlZmluZSBJOTE1X1ZNQV9D TE9TRUQJCUJJVCgxMCkKLQotCXVuc2lnbmVkIGludCBhY3RpdmU7Ci0Jc3RydWN0IGk5MTVfZ2Vt X2FjdGl2ZSBsYXN0X3JlYWRbSTkxNV9OVU1fRU5HSU5FU107Ci0Jc3RydWN0IGk5MTVfZ2VtX2Fj dGl2ZSBsYXN0X3dyaXRlOwotCXN0cnVjdCBpOTE1X2dlbV9hY3RpdmUgbGFzdF9mZW5jZTsKLQot CS8qKgotCSAqIFN1cHBvcnQgZGlmZmVyZW50IEdHVFQgdmlld3MgaW50byB0aGUgc2FtZSBvYmpl Y3QuCi0JICogVGhpcyBtZWFucyB0aGVyZSBjYW4gYmUgbXVsdGlwbGUgVk1BIG1hcHBpbmdzIHBl ciBvYmplY3QgYW5kIHBlciBWTS4KLQkgKiBpOTE1X2dndHRfdmlld190eXBlIGlzIHVzZWQgdG8g ZGlzdGluZ3Vpc2ggYmV0d2VlbiB0aG9zZSBlbnRyaWVzLgotCSAqIFRoZSBkZWZhdWx0IG9uZSBv ZiB6ZXJvIChJOTE1X0dHVFRfVklFV19OT1JNQUwpIGlzIGRlZmF1bHQgYW5kIGFsc28KLQkgKiBh c3N1bWVkIGluIEdFTSBmdW5jdGlvbnMgd2hpY2ggdGFrZSBubyBnZ3R0IHZpZXcgcGFyYW1ldGVy LgotCSAqLwotCXN0cnVjdCBpOTE1X2dndHRfdmlldyBnZ3R0X3ZpZXc7Ci0KLQkvKiogVGhpcyBv YmplY3QncyBwbGFjZSBvbiB0aGUgYWN0aXZlL2luYWN0aXZlIGxpc3RzICovCi0Jc3RydWN0IGxp c3RfaGVhZCB2bV9saW5rOwotCi0Jc3RydWN0IGxpc3RfaGVhZCBvYmpfbGluazsgLyogTGluayBp biB0aGUgb2JqZWN0J3MgVk1BIGxpc3QgKi8KLQlzdHJ1Y3QgcmJfbm9kZSBvYmpfbm9kZTsKLQot CS8qKiBUaGlzIHZtYSdzIHBsYWNlIGluIHRoZSBiYXRjaGJ1ZmZlciBvciBvbiB0aGUgZXZpY3Rp b24gbGlzdCAqLwotCXN0cnVjdCBsaXN0X2hlYWQgZXhlY19saXN0OwotCi0JLyoqCi0JICogVXNl ZCBmb3IgcGVyZm9ybWluZyByZWxvY2F0aW9ucyBkdXJpbmcgZXhlY2J1ZmZlciBpbnNlcnRpb24u Ci0JICovCi0Jc3RydWN0IGhsaXN0X25vZGUgZXhlY19ub2RlOwotCXVuc2lnbmVkIGxvbmcgZXhl Y19oYW5kbGU7Ci0Jc3RydWN0IGRybV9pOTE1X2dlbV9leGVjX29iamVjdDIgKmV4ZWNfZW50cnk7 Ci19OwotCi1zdHJ1Y3QgaTkxNV92bWEgKgotaTkxNV92bWFfY3JlYXRlKHN0cnVjdCBkcm1faTkx NV9nZW1fb2JqZWN0ICpvYmosCi0JCXN0cnVjdCBpOTE1X2FkZHJlc3Nfc3BhY2UgKnZtLAotCQlj b25zdCBzdHJ1Y3QgaTkxNV9nZ3R0X3ZpZXcgKnZpZXcpOwotdm9pZCBpOTE1X3ZtYV91bnBpbl9h bmRfcmVsZWFzZShzdHJ1Y3QgaTkxNV92bWEgKipwX3ZtYSk7Ci0KLXN0YXRpYyBpbmxpbmUgYm9v bCBpOTE1X3ZtYV9pc19nZ3R0KGNvbnN0IHN0cnVjdCBpOTE1X3ZtYSAqdm1hKQotewotCXJldHVy biB2bWEtPmZsYWdzICYgSTkxNV9WTUFfR0dUVDsKLX0KLQotc3RhdGljIGlubGluZSBib29sIGk5 MTVfdm1hX2lzX21hcF9hbmRfZmVuY2VhYmxlKGNvbnN0IHN0cnVjdCBpOTE1X3ZtYSAqdm1hKQot ewotCXJldHVybiB2bWEtPmZsYWdzICYgSTkxNV9WTUFfQ0FOX0ZFTkNFOwotfQotCi1zdGF0aWMg aW5saW5lIGJvb2wgaTkxNV92bWFfaXNfY2xvc2VkKGNvbnN0IHN0cnVjdCBpOTE1X3ZtYSAqdm1h KQotewotCXJldHVybiB2bWEtPmZsYWdzICYgSTkxNV9WTUFfQ0xPU0VEOwotfQotCi1zdGF0aWMg aW5saW5lIHVuc2lnbmVkIGludCBpOTE1X3ZtYV9nZXRfYWN0aXZlKGNvbnN0IHN0cnVjdCBpOTE1 X3ZtYSAqdm1hKQotewotCXJldHVybiB2bWEtPmFjdGl2ZTsKLX0KLQotc3RhdGljIGlubGluZSBi b29sIGk5MTVfdm1hX2lzX2FjdGl2ZShjb25zdCBzdHJ1Y3QgaTkxNV92bWEgKnZtYSkKLXsKLQly ZXR1cm4gaTkxNV92bWFfZ2V0X2FjdGl2ZSh2bWEpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQg aTkxNV92bWFfc2V0X2FjdGl2ZShzdHJ1Y3QgaTkxNV92bWEgKnZtYSwKLQkJCQkgICAgICAgdW5z aWduZWQgaW50IGVuZ2luZSkKLXsKLQl2bWEtPmFjdGl2ZSB8PSBCSVQoZW5naW5lKTsKLX0KLQot c3RhdGljIGlubGluZSB2b2lkIGk5MTVfdm1hX2NsZWFyX2FjdGl2ZShzdHJ1Y3QgaTkxNV92bWEg KnZtYSwKLQkJCQkJIHVuc2lnbmVkIGludCBlbmdpbmUpCi17Ci0Jdm1hLT5hY3RpdmUgJj0gfkJJ VChlbmdpbmUpOwotfQotCi1zdGF0aWMgaW5saW5lIGJvb2wgaTkxNV92bWFfaGFzX2FjdGl2ZV9l bmdpbmUoY29uc3Qgc3RydWN0IGk5MTVfdm1hICp2bWEsCi0JCQkJCSAgICAgIHVuc2lnbmVkIGlu dCBlbmdpbmUpCi17Ci0JcmV0dXJuIHZtYS0+YWN0aXZlICYgQklUKGVuZ2luZSk7Ci19Ci0KLXN0 YXRpYyBpbmxpbmUgdTMyIGk5MTVfZ2d0dF9vZmZzZXQoY29uc3Qgc3RydWN0IGk5MTVfdm1hICp2 bWEpCi17Ci0JR0VNX0JVR19PTighaTkxNV92bWFfaXNfZ2d0dCh2bWEpKTsKLQlHRU1fQlVHX09O KCF2bWEtPm5vZGUuYWxsb2NhdGVkKTsKLQlHRU1fQlVHX09OKHVwcGVyXzMyX2JpdHModm1hLT5u b2RlLnN0YXJ0KSk7Ci0JR0VNX0JVR19PTih1cHBlcl8zMl9iaXRzKHZtYS0+bm9kZS5zdGFydCAr IHZtYS0+bm9kZS5zaXplIC0gMSkpOwotCXJldHVybiBsb3dlcl8zMl9iaXRzKHZtYS0+bm9kZS5z dGFydCk7Ci19CitzdHJ1Y3QgaTkxNV92bWE7CiAKIHN0cnVjdCBpOTE1X3BhZ2VfZG1hIHsKIAlz dHJ1Y3QgcGFnZSAqcGFnZTsKQEAgLTYwNiw2ICs0ODIsMTMgQEAgaTkxNV9wYWdlX2Rpcl9kbWFf YWRkcihjb25zdCBzdHJ1Y3QgaTkxNV9od19wcGd0dCAqcHBndHQsIGNvbnN0IHVuc2lnbmVkIG4p CiAJCXB4X2RtYShwcGd0dC0+YmFzZS5zY3JhdGNoX3BkKTsKIH0KIAorc3RhdGljIGlubGluZSBz dHJ1Y3QgaTkxNV9nZ3R0ICoKK2k5MTVfdm1fdG9fZ2d0dChzdHJ1Y3QgaTkxNV9hZGRyZXNzX3Nw YWNlICp2bSkKK3sKKwlHRU1fQlVHX09OKCFpOTE1X2lzX2dndHQodm0pKTsKKwlyZXR1cm4gY29u dGFpbmVyX29mKHZtLCBzdHJ1Y3QgaTkxNV9nZ3R0LCBiYXNlKTsKK30KKwogaW50IGk5MTVfZ2d0 dF9wcm9iZV9odyhzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYpOwogaW50IGk5MTVf Z2d0dF9pbml0X2h3KHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdik7CiBpbnQgaTkx NV9nZ3R0X2VuYWJsZV9odyhzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYpOwpAQCAt NjUzLDg4ICs1MzYsNCBAQCB2b2lkIGk5MTVfZ2VtX2d0dF9maW5pc2hfcGFnZXMoc3RydWN0IGRy bV9pOTE1X2dlbV9vYmplY3QgKm9iaiwKICNkZWZpbmUgUElOX09GRlNFVF9GSVhFRAlCSVQoMTEp CiAjZGVmaW5lIFBJTl9PRkZTRVRfTUFTSwkJKH40MDk1KQogCi1pbnQgX19pOTE1X3ZtYV9kb19w aW4oc3RydWN0IGk5MTVfdm1hICp2bWEsCi0JCSAgICAgIHU2NCBzaXplLCB1NjQgYWxpZ25tZW50 LCB1NjQgZmxhZ3MpOwotc3RhdGljIGlubGluZSBpbnQgX19tdXN0X2NoZWNrCi1pOTE1X3ZtYV9w aW4oc3RydWN0IGk5MTVfdm1hICp2bWEsIHU2NCBzaXplLCB1NjQgYWxpZ25tZW50LCB1NjQgZmxh Z3MpCi17Ci0JQlVJTERfQlVHX09OKFBJTl9NQlogIT0gSTkxNV9WTUFfUElOX09WRVJGTE9XKTsK LQlCVUlMRF9CVUdfT04oUElOX0dMT0JBTCAhPSBJOTE1X1ZNQV9HTE9CQUxfQklORCk7Ci0JQlVJ TERfQlVHX09OKFBJTl9VU0VSICE9IEk5MTVfVk1BX0xPQ0FMX0JJTkQpOwotCi0JLyogUGluIGVh cmx5IHRvIHByZXZlbnQgdGhlIHNocmlua2VyL2V2aWN0aW9uIGxvZ2ljIGZyb20gZGVzdHJveWlu ZwotCSAqIG91ciB2bWEgYXMgd2UgaW5zZXJ0IGFuZCBiaW5kLgotCSAqLwotCWlmIChsaWtlbHko KCgrK3ZtYS0+ZmxhZ3MgXiBmbGFncykgJiBJOTE1X1ZNQV9CSU5EX01BU0spID09IDApKQotCQly ZXR1cm4gMDsKLQotCXJldHVybiBfX2k5MTVfdm1hX2RvX3Bpbih2bWEsIHNpemUsIGFsaWdubWVu dCwgZmxhZ3MpOwotfQotCi1zdGF0aWMgaW5saW5lIGludCBpOTE1X3ZtYV9waW5fY291bnQoY29u c3Qgc3RydWN0IGk5MTVfdm1hICp2bWEpCi17Ci0JcmV0dXJuIHZtYS0+ZmxhZ3MgJiBJOTE1X1ZN QV9QSU5fTUFTSzsKLX0KLQotc3RhdGljIGlubGluZSBib29sIGk5MTVfdm1hX2lzX3Bpbm5lZChj b25zdCBzdHJ1Y3QgaTkxNV92bWEgKnZtYSkKLXsKLQlyZXR1cm4gaTkxNV92bWFfcGluX2NvdW50 KHZtYSk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBfX2k5MTVfdm1hX3BpbihzdHJ1Y3QgaTkx NV92bWEgKnZtYSkKLXsKLQl2bWEtPmZsYWdzKys7Ci0JR0VNX0JVR19PTih2bWEtPmZsYWdzICYg STkxNV9WTUFfUElOX09WRVJGTE9XKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIF9faTkxNV92 bWFfdW5waW4oc3RydWN0IGk5MTVfdm1hICp2bWEpCi17Ci0JR0VNX0JVR19PTighaTkxNV92bWFf aXNfcGlubmVkKHZtYSkpOwotCXZtYS0+ZmxhZ3MtLTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lk IGk5MTVfdm1hX3VucGluKHN0cnVjdCBpOTE1X3ZtYSAqdm1hKQotewotCUdFTV9CVUdfT04oIWRy bV9tbV9ub2RlX2FsbG9jYXRlZCgmdm1hLT5ub2RlKSk7Ci0JX19pOTE1X3ZtYV91bnBpbih2bWEp OwotfQotCi0vKioKLSAqIGk5MTVfdm1hX3Bpbl9pb21hcCAtIGNhbGxzIGlvcmVtYXBfd2MgdG8g bWFwIHRoZSBHR1RUIFZNQSB2aWEgdGhlIGFwZXJ0dXJlCi0gKiBAdm1hOiBWTUEgdG8gaW9tYXAK LSAqCi0gKiBUaGUgcGFzc2VkIGluIFZNQSBoYXMgdG8gYmUgcGlubmVkIGluIHRoZSBnbG9iYWwg R1RUIG1hcHBhYmxlIHJlZ2lvbi4KLSAqIEFuIGV4dHJhIHBpbm5pbmcgb2YgdGhlIFZNQSBpcyBh Y3F1aXJlZCBmb3IgdGhlIHJldHVybiBpb21hcHBpbmcsCi0gKiB0aGUgY2FsbGVyIG11c3QgY2Fs bCBpOTE1X3ZtYV91bnBpbl9pb21hcCB0byByZWxpbnF1aXNoIHRoZSBwaW5uaW5nCi0gKiBhZnRl ciB0aGUgaW9tYXBwaW5nIGlzIG5vIGxvbmdlciByZXF1aXJlZC4KLSAqCi0gKiBDYWxsZXJzIG11 c3QgaG9sZCB0aGUgc3RydWN0X211dGV4LgotICoKLSAqIFJldHVybnMgYSB2YWxpZCBpb21hcHBl ZCBwb2ludGVyIG9yIEVSUl9QVFIuCi0gKi8KLXZvaWQgX19pb21lbSAqaTkxNV92bWFfcGluX2lv bWFwKHN0cnVjdCBpOTE1X3ZtYSAqdm1hKTsKLSNkZWZpbmUgSU9fRVJSX1BUUih4KSAoKHZvaWQg X19pb21lbSAqKUVSUl9QVFIoeCkpCi0KLS8qKgotICogaTkxNV92bWFfdW5waW5faW9tYXAgLSB1 bnBpbnMgdGhlIG1hcHBpbmcgcmV0dXJuZWQgZnJvbSBpOTE1X3ZtYV9pb21hcAotICogQHZtYTog Vk1BIHRvIHVucGluCi0gKgotICogVW5waW5zIHRoZSBwcmV2aW91c2x5IGlvbWFwcGVkIFZNQSBm cm9tIGk5MTVfdm1hX3Bpbl9pb21hcCgpLgotICoKLSAqIENhbGxlcnMgbXVzdCBob2xkIHRoZSBz dHJ1Y3RfbXV0ZXguIFRoaXMgZnVuY3Rpb24gaXMgb25seSB2YWxpZCB0byBiZQotICogY2FsbGVk IG9uIGEgVk1BIHByZXZpb3VzbHkgaW9tYXBwZWQgYnkgdGhlIGNhbGxlciB3aXRoIGk5MTVfdm1h X3Bpbl9pb21hcCgpLgotICovCi1zdGF0aWMgaW5saW5lIHZvaWQgaTkxNV92bWFfdW5waW5faW9t YXAoc3RydWN0IGk5MTVfdm1hICp2bWEpCi17Ci0JbG9ja2RlcF9hc3NlcnRfaGVsZCgmdm1hLT52 bS0+ZGV2LT5zdHJ1Y3RfbXV0ZXgpOwotCUdFTV9CVUdfT04odm1hLT5pb21hcCA9PSBOVUxMKTsK LQlpOTE1X3ZtYV91bnBpbih2bWEpOwotfQotCi1zdGF0aWMgaW5saW5lIHN0cnVjdCBwYWdlICpp OTE1X3ZtYV9maXJzdF9wYWdlKHN0cnVjdCBpOTE1X3ZtYSAqdm1hKQotewotCUdFTV9CVUdfT04o IXZtYS0+cGFnZXMpOwotCXJldHVybiBzZ19wYWdlKHZtYS0+cGFnZXMtPnNnbCk7Ci19Ci0KICNl bmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9nZW1fb2JqZWN0Lmgg Yi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2dlbV9vYmplY3QuaApuZXcgZmlsZSBtb2RlIDEw MDY0NAppbmRleCAwMDAwMDAwLi4wMTRmODAzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9n cHUvZHJtL2k5MTUvaTkxNV9nZW1fb2JqZWN0LmgKQEAgLTAsMCArMSwzMzcgQEAKKy8qCisgKiBD b3B5cmlnaHQgwqkgMjAxNiBJbnRlbCBDb3Jwb3JhdGlvbgorICoKKyAqIFBlcm1pc3Npb24gaXMg aGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBh CisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBm aWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91 dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0 cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1Ymxp Y2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVy bWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBz bywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3Zl IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0 aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9y IHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNP RlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQs IEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhF IFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNV TEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBU SEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwg REFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBD T05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqIEZST00sIE9VVCBPRiBPUiBJ TiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElO R1MKKyAqIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKi8KKworI2lmbmRlZiBfX0k5MTVfR0VNX09C SkVDVF9IX18KKyNkZWZpbmUgX19JOTE1X0dFTV9PQkpFQ1RfSF9fCisKKyNpbmNsdWRlIDxsaW51 eC9yZXNlcnZhdGlvbi5oPgorCisjaW5jbHVkZSA8ZHJtL2RybV92bWFfbWFuYWdlci5oPgorI2lu Y2x1ZGUgPGRybS9kcm1fZ2VtLmg+CisjaW5jbHVkZSA8ZHJtL2RybVAuaD4KKworI2luY2x1ZGUg PGRybS9pOTE1X2RybS5oPgorCitzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdF9vcHMgeworCXVu c2lnbmVkIGludCBmbGFnczsKKyNkZWZpbmUgSTkxNV9HRU1fT0JKRUNUX0hBU19TVFJVQ1RfUEFH RSAweDEKKyNkZWZpbmUgSTkxNV9HRU1fT0JKRUNUX0lTX1NIUklOS0FCTEUgICAweDIKKworCS8q IEludGVyZmFjZSBiZXR3ZWVuIHRoZSBHRU0gb2JqZWN0IGFuZCBpdHMgYmFja2luZyBzdG9yYWdl LgorCSAqIGdldF9wYWdlcygpIGlzIGNhbGxlZCBvbmNlIHByaW9yIHRvIHRoZSB1c2Ugb2YgdGhl IGFzc29jaWF0ZWQgc2V0CisJICogb2YgcGFnZXMgYmVmb3JlIHRvIGJpbmRpbmcgdGhlbSBpbnRv IHRoZSBHVFQsIGFuZCBwdXRfcGFnZXMoKSBpcworCSAqIGNhbGxlZCBhZnRlciB3ZSBubyBsb25n ZXIgbmVlZCB0aGVtLiBBcyB3ZSBleHBlY3QgdGhlcmUgdG8gYmUKKwkgKiBhc3NvY2lhdGVkIGNv c3Qgd2l0aCBtaWdyYXRpbmcgcGFnZXMgYmV0d2VlbiB0aGUgYmFja2luZyBzdG9yYWdlCisJICog YW5kIG1ha2luZyB0aGVtIGF2YWlsYWJsZSBmb3IgdGhlIEdQVSAoZS5nLiBjbGZsdXNoKSwgd2Ug bWF5IGhvbGQKKwkgKiBvbnRvIHRoZSBwYWdlcyBhZnRlciB0aGV5IGFyZSBubyBsb25nZXIgcmVm ZXJlbmNlZCBieSB0aGUgR1BVCisJICogaW4gY2FzZSB0aGV5IG1heSBiZSB1c2VkIGFnYWluIHNo b3J0bHkgKGZvciBleGFtcGxlIG1pZ3JhdGluZyB0aGUKKwkgKiBwYWdlcyB0byBhIGRpZmZlcmVu dCBtZW1vcnkgZG9tYWluIHdpdGhpbiB0aGUgR1RUKS4gcHV0X3BhZ2VzKCkKKwkgKiB3aWxsIHRo ZXJlZm9yZSBtb3N0IGxpa2VseSBiZSBjYWxsZWQgd2hlbiB0aGUgb2JqZWN0IGl0c2VsZiBpcwor CSAqIGJlaW5nIHJlbGVhc2VkIG9yIHVuZGVyIG1lbW9yeSBwcmVzc3VyZSAod2hlcmUgd2UgYXR0 ZW1wdCB0bworCSAqIHJlYXAgcGFnZXMgZm9yIHRoZSBzaHJpbmtlcikuCisJICovCisJc3RydWN0 IHNnX3RhYmxlICooKmdldF9wYWdlcykoc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKik7CisJ dm9pZCAoKnB1dF9wYWdlcykoc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKiwgc3RydWN0IHNn X3RhYmxlICopOworCisJaW50ICgqZG1hYnVmX2V4cG9ydCkoc3RydWN0IGRybV9pOTE1X2dlbV9v YmplY3QgKik7CisJdm9pZCAoKnJlbGVhc2UpKHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICop OworfTsKKworc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgeworCXN0cnVjdCBkcm1fZ2VtX29i amVjdCBiYXNlOworCisJY29uc3Qgc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3Rfb3BzICpvcHM7 CisKKwkvKiogTGlzdCBvZiBWTUFzIGJhY2tlZCBieSB0aGlzIG9iamVjdCAqLworCXN0cnVjdCBs aXN0X2hlYWQgdm1hX2xpc3Q7CisJc3RydWN0IHJiX3Jvb3Qgdm1hX3RyZWU7CisKKwkvKiogU3Rv bGVuIG1lbW9yeSBmb3IgdGhpcyBvYmplY3QsIGluc3RlYWQgb2YgYmVpbmcgYmFja2VkIGJ5IHNo bWVtLiAqLworCXN0cnVjdCBkcm1fbW1fbm9kZSAqc3RvbGVuOworCXN0cnVjdCBsaXN0X2hlYWQg Z2xvYmFsX2xpbms7CisJdW5pb24geworCQlzdHJ1Y3QgcmN1X2hlYWQgcmN1OworCQlzdHJ1Y3Qg bGxpc3Rfbm9kZSBmcmVlZDsKKwl9OworCisJLyoqCisJICogV2hldGhlciB0aGUgb2JqZWN0IGlz IGN1cnJlbnRseSBpbiB0aGUgR0dUVCBtbWFwLgorCSAqLworCXN0cnVjdCBsaXN0X2hlYWQgdXNl cmZhdWx0X2xpbms7CisKKwkvKiogVXNlZCBpbiBleGVjYnVmIHRvIHRlbXBvcmFyaWx5IGhvbGQg YSByZWYgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIG9ial9leGVjX2xpbms7CisKKwlzdHJ1Y3QgbGlz dF9oZWFkIGJhdGNoX3Bvb2xfbGluazsKKworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwkvKioK KwkgKiBIYXZlIHdlIHRha2VuIGEgcmVmZXJlbmNlIGZvciB0aGUgb2JqZWN0IGZvciBpbmNvbXBs ZXRlIEdQVQorCSAqIGFjdGl2aXR5PworCSAqLworI2RlZmluZSBJOTE1X0JPX0FDVElWRV9SRUYg MAorCisJLyoKKwkgKiBJcyB0aGUgb2JqZWN0IHRvIGJlIG1hcHBlZCBhcyByZWFkLW9ubHkgdG8g dGhlIEdQVQorCSAqIE9ubHkgaG9ub3VyZWQgaWYgaGFyZHdhcmUgaGFzIHJlbGV2YW50IHB0ZSBi aXQKKwkgKi8KKwl1bnNpZ25lZCBsb25nIGd0X3JvOjE7CisJdW5zaWduZWQgaW50IGNhY2hlX2xl dmVsOjM7CisJdW5zaWduZWQgaW50IGNhY2hlX2RpcnR5OjE7CisKKwlhdG9taWNfdCBmcm9udGJ1 ZmZlcl9iaXRzOworCXVuc2lnbmVkIGludCBmcm9udGJ1ZmZlcl9nZ3R0X29yaWdpbjsgLyogd3Jp dGUgb25jZSAqLworCisJLyoqIEN1cnJlbnQgdGlsaW5nIHN0cmlkZSBmb3IgdGhlIG9iamVjdCwg aWYgaXQncyB0aWxlZC4gKi8KKwl1bnNpZ25lZCBpbnQgdGlsaW5nX2FuZF9zdHJpZGU7CisjZGVm aW5lIEZFTkNFX01JTklNVU1fU1RSSURFIDEyOCAvKiBTZWUgaTkxNV90aWxpbmdfb2soKSAqLwor I2RlZmluZSBUSUxJTkdfTUFTSyAoRkVOQ0VfTUlOSU1VTV9TVFJJREUtMSkKKyNkZWZpbmUgU1RS SURFX01BU0sgKH5USUxJTkdfTUFTSykKKworCS8qKiBDb3VudCBvZiBWTUEgYWN0dWFsbHkgYm91 bmQgYnkgdGhpcyBvYmplY3QgKi8KKwl1bnNpZ25lZCBpbnQgYmluZF9jb3VudDsKKwl1bnNpZ25l ZCBpbnQgYWN0aXZlX2NvdW50OworCXVuc2lnbmVkIGludCBwaW5fZGlzcGxheTsKKworCXN0cnVj dCB7CisJCXN0cnVjdCBtdXRleCBsb2NrOyAvKiBwcm90ZWN0cyB0aGUgcGFnZXMgYW5kIHRoZWly IHVzZSAqLworCQlhdG9taWNfdCBwYWdlc19waW5fY291bnQ7CisKKwkJc3RydWN0IHNnX3RhYmxl ICpwYWdlczsKKwkJdm9pZCAqbWFwcGluZzsKKworCQlzdHJ1Y3QgaTkxNV9nZW1fb2JqZWN0X3Bh Z2VfaXRlciB7CisJCQlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnX3BvczsKKwkJCXVuc2lnbmVkIGlu dCBzZ19pZHg7IC8qIGluIHBhZ2VzLCBidXQgMzJiaXQgZWVrISAqLworCisJCQlzdHJ1Y3QgcmFk aXhfdHJlZV9yb290IHJhZGl4OworCQkJc3RydWN0IG11dGV4IGxvY2s7IC8qIHByb3RlY3RzIHRo aXMgY2FjaGUgKi8KKwkJfSBnZXRfcGFnZTsKKworCQkvKioKKwkJICogQWR2aWNlOiBhcmUgdGhl IGJhY2tpbmcgcGFnZXMgcHVyZ2VhYmxlPworCQkgKi8KKwkJdW5zaWduZWQgaW50IG1hZHY6MjsK KworCQkvKioKKwkJICogVGhpcyBpcyBzZXQgaWYgdGhlIG9iamVjdCBoYXMgYmVlbiB3cml0dGVu IHRvIHNpbmNlIHRoZQorCQkgKiBwYWdlcyB3ZXJlIGxhc3QgYWNxdWlyZWQuCisJCSAqLworCQli b29sIGRpcnR5OjE7CisKKwkJLyoqCisJCSAqIFRoaXMgaXMgc2V0IGlmIHRoZSBvYmplY3QgaGFz IGJlZW4gcGlubmVkIGR1ZSB0byB1bmtub3duCisJCSAqIHN3aXp6bGluZy4KKwkJICovCisJCWJv b2wgcXVpcmtlZDoxOworCX0gbW07CisKKwkvKiogQnJlYWRjcnVtYiBvZiBsYXN0IHJlbmRlcmlu ZyB0byB0aGUgYnVmZmVyLgorCSAqIFRoZXJlIGNhbiBvbmx5IGJlIG9uZSB3cml0ZXIsIGJ1dCB3 ZSBhbGxvdyBmb3IgbXVsdGlwbGUgcmVhZGVycy4KKwkgKiBJZiB0aGVyZSBpcyBhIHdyaXRlciB0 aGF0IG5lY2Vzc2FyaWx5IGltcGxpZXMgdGhhdCBhbGwgb3RoZXIKKwkgKiByZWFkIHJlcXVlc3Rz IGFyZSBjb21wbGV0ZSAtIGJ1dCB3ZSBtYXkgb25seSBiZSBsYXppbHkgY2xlYXJpbmcKKwkgKiB0 aGUgcmVhZCByZXF1ZXN0cy4gQSByZWFkIHJlcXVlc3QgaXMgbmF0dXJhbGx5IHRoZSBtb3N0IHJl Y2VudAorCSAqIHJlcXVlc3Qgb24gYSByaW5nLCBzbyB3ZSBtYXkgaGF2ZSB0d28gZGlmZmVyZW50 IHdyaXRlIGFuZCByZWFkCisJICogcmVxdWVzdHMgb24gb25lIHJpbmcgd2hlcmUgdGhlIHdyaXRl IHJlcXVlc3QgaXMgb2xkZXIgdGhhbiB0aGUKKwkgKiByZWFkIHJlcXVlc3QuIFRoaXMgYWxsb3dz IGZvciB0aGUgQ1BVIHRvIHJlYWQgZnJvbSBhbiBhY3RpdmUKKwkgKiBidWZmZXIgYnkgb25seSB3 YWl0aW5nIGZvciB0aGUgd3JpdGUgdG8gY29tcGxldGUuCisJICovCisJc3RydWN0IHJlc2VydmF0 aW9uX29iamVjdCAqcmVzdjsKKworCS8qKiBSZWZlcmVuY2VzIGZyb20gZnJhbWVidWZmZXJzLCBs b2NrcyBvdXQgdGlsaW5nIGNoYW5nZXMuICovCisJdW5zaWduZWQgbG9uZyBmcmFtZWJ1ZmZlcl9y ZWZlcmVuY2VzOworCisJLyoqIFJlY29yZCBvZiBhZGRyZXNzIGJpdCAxNyBvZiBlYWNoIHBhZ2Ug YXQgbGFzdCB1bmJpbmQuICovCisJdW5zaWduZWQgbG9uZyAqYml0XzE3OworCisJc3RydWN0IGk5 MTVfZ2VtX3VzZXJwdHIgeworCQl1aW50cHRyX3QgcHRyOworCQl1bnNpZ25lZCByZWFkX29ubHkg OjE7CisKKwkJc3RydWN0IGk5MTVfbW1fc3RydWN0ICptbTsKKwkJc3RydWN0IGk5MTVfbW11X29i amVjdCAqbW11X29iamVjdDsKKwkJc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrOworCX0gdXNlcnB0 cjsKKworCS8qKiBmb3IgcGh5cyBhbGxvY2F0ZWQgb2JqZWN0cyAqLworCXN0cnVjdCBkcm1fZG1h X2hhbmRsZSAqcGh5c19oYW5kbGU7CisKKwlzdHJ1Y3QgcmVzZXJ2YXRpb25fb2JqZWN0IF9fYnVp bHRpbl9yZXN2OworfTsKKworc3RhdGljIGlubGluZSBzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVj dCAqCit0b19pbnRlbF9ibyhzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKmdlbSkKK3sKKwkvKiBBc3Nl cnQgdGhhdCB0b19pbnRlbF9ibyhOVUxMKSA9PSBOVUxMICovCisJQlVJTERfQlVHX09OKG9mZnNl dG9mKHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0LCBiYXNlKSk7CisKKwlyZXR1cm4gY29udGFp bmVyX29mKGdlbSwgc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QsIGJhc2UpOworfQorCisvKioK KyAqIGk5MTVfZ2VtX29iamVjdF9sb29rdXBfcmN1IC0gbG9vayB1cCBhIHRlbXBvcmFyeSBHRU0g b2JqZWN0IGZyb20gaXRzIGhhbmRsZQorICogQGZpbHA6IERSTSBmaWxlIHByaXZhdGUgZGF0ZQor ICogQGhhbmRsZTogdXNlcnNwYWNlIGhhbmRsZQorICoKKyAqIFJldHVybnM6CisgKgorICogQSBw b2ludGVyIHRvIHRoZSBvYmplY3QgbmFtZWQgYnkgdGhlIGhhbmRsZSBpZiBzdWNoIGV4aXN0cyBv biBAZmlscCwgTlVMTAorICogb3RoZXJ3aXNlLiBUaGlzIG9iamVjdCBpcyBvbmx5IHZhbGlkIHdo aWxzdCB1bmRlciB0aGUgUkNVIHJlYWQgbG9jaywgYW5kCisgKiBub3RlIGNhcmVmdWxseSB0aGUg b2JqZWN0IG1heSBiZSBpbiB0aGUgcHJvY2VzcyBvZiBiZWluZyBkZXN0cm95ZWQuCisgKi8KK3N0 YXRpYyBpbmxpbmUgc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKgoraTkxNV9nZW1fb2JqZWN0 X2xvb2t1cF9yY3Uoc3RydWN0IGRybV9maWxlICpmaWxlLCB1MzIgaGFuZGxlKQoreworI2lmZGVm IENPTkZJR19MT0NLREVQCisJV0FSTl9PTihkZWJ1Z19sb2NrcyAmJiAhbG9ja19pc19oZWxkKCZy Y3VfbG9ja19tYXApKTsKKyNlbmRpZgorCXJldHVybiBpZHJfZmluZCgmZmlsZS0+b2JqZWN0X2lk ciwgaGFuZGxlKTsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVj dCAqCitpOTE1X2dlbV9vYmplY3RfbG9va3VwKHN0cnVjdCBkcm1fZmlsZSAqZmlsZSwgdTMyIGhh bmRsZSkKK3sKKwlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqOworCisJcmN1X3JlYWRf bG9jaygpOworCW9iaiA9IGk5MTVfZ2VtX29iamVjdF9sb29rdXBfcmN1KGZpbGUsIGhhbmRsZSk7 CisJaWYgKG9iaiAmJiAha3JlZl9nZXRfdW5sZXNzX3plcm8oJm9iai0+YmFzZS5yZWZjb3VudCkp CisJCW9iaiA9IE5VTEw7CisJcmN1X3JlYWRfdW5sb2NrKCk7CisKKwlyZXR1cm4gb2JqOworfQor CitfX2RlcHJlY2F0ZWQKK2V4dGVybiBzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKgorZHJtX2dlbV9v YmplY3RfbG9va3VwKHN0cnVjdCBkcm1fZmlsZSAqZmlsZSwgdTMyIGhhbmRsZSk7CisKK19fYXR0 cmlidXRlX18oKG5vbm51bGwpKQorc3RhdGljIGlubGluZSBzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29i amVjdCAqCitpOTE1X2dlbV9vYmplY3RfZ2V0KHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpv YmopCit7CisJZHJtX2dlbV9vYmplY3RfcmVmZXJlbmNlKCZvYmotPmJhc2UpOworCXJldHVybiBv Ymo7Cit9CisKK19fZGVwcmVjYXRlZAorZXh0ZXJuIHZvaWQgZHJtX2dlbV9vYmplY3RfcmVmZXJl bmNlKHN0cnVjdCBkcm1fZ2VtX29iamVjdCAqKTsKKworX19hdHRyaWJ1dGVfXygobm9ubnVsbCkp CitzdGF0aWMgaW5saW5lIHZvaWQKK2k5MTVfZ2VtX29iamVjdF9wdXQoc3RydWN0IGRybV9pOTE1 X2dlbV9vYmplY3QgKm9iaikKK3sKKwlfX2RybV9nZW1fb2JqZWN0X3VucmVmZXJlbmNlKCZvYmot PmJhc2UpOworfQorCitfX2RlcHJlY2F0ZWQKK2V4dGVybiB2b2lkIGRybV9nZW1fb2JqZWN0X3Vu cmVmZXJlbmNlKHN0cnVjdCBkcm1fZ2VtX29iamVjdCAqKTsKKworX19kZXByZWNhdGVkCitleHRl cm4gdm9pZCBkcm1fZ2VtX29iamVjdF91bnJlZmVyZW5jZV91bmxvY2tlZChzdHJ1Y3QgZHJtX2dl bV9vYmplY3QgKik7CisKK3N0YXRpYyBpbmxpbmUgYm9vbAoraTkxNV9nZW1fb2JqZWN0X2lzX2Rl YWQoY29uc3Qgc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaikKK3sKKwlyZXR1cm4gYXRv bWljX3JlYWQoJm9iai0+YmFzZS5yZWZjb3VudC5yZWZjb3VudCkgPT0gMDsKK30KKworc3RhdGlj IGlubGluZSBib29sCitpOTE1X2dlbV9vYmplY3RfaGFzX3N0cnVjdF9wYWdlKGNvbnN0IHN0cnVj dCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmopCit7CisJcmV0dXJuIG9iai0+b3BzLT5mbGFncyAm IEk5MTVfR0VNX09CSkVDVF9IQVNfU1RSVUNUX1BBR0U7Cit9CisKK3N0YXRpYyBpbmxpbmUgYm9v bAoraTkxNV9nZW1fb2JqZWN0X2lzX3Nocmlua2FibGUoY29uc3Qgc3RydWN0IGRybV9pOTE1X2dl bV9vYmplY3QgKm9iaikKK3sKKwlyZXR1cm4gb2JqLT5vcHMtPmZsYWdzICYgSTkxNV9HRU1fT0JK RUNUX0lTX1NIUklOS0FCTEU7Cit9CisKK3N0YXRpYyBpbmxpbmUgYm9vbAoraTkxNV9nZW1fb2Jq ZWN0X2lzX2FjdGl2ZShjb25zdCBzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqKQorewor CXJldHVybiBvYmotPmFjdGl2ZV9jb3VudDsKK30KKworc3RhdGljIGlubGluZSBib29sCitpOTE1 X2dlbV9vYmplY3RfaGFzX2FjdGl2ZV9yZWZlcmVuY2UoY29uc3Qgc3RydWN0IGRybV9pOTE1X2dl bV9vYmplY3QgKm9iaikKK3sKKwlyZXR1cm4gdGVzdF9iaXQoSTkxNV9CT19BQ1RJVkVfUkVGLCAm b2JqLT5mbGFncyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAoraTkxNV9nZW1fb2JqZWN0X3Nl dF9hY3RpdmVfcmVmZXJlbmNlKHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmopCit7CisJ bG9ja2RlcF9hc3NlcnRfaGVsZCgmb2JqLT5iYXNlLmRldi0+c3RydWN0X211dGV4KTsKKwlfX3Nl dF9iaXQoSTkxNV9CT19BQ1RJVkVfUkVGLCAmb2JqLT5mbGFncyk7Cit9CisKK3N0YXRpYyBpbmxp bmUgdm9pZAoraTkxNV9nZW1fb2JqZWN0X2NsZWFyX2FjdGl2ZV9yZWZlcmVuY2Uoc3RydWN0IGRy bV9pOTE1X2dlbV9vYmplY3QgKm9iaikKK3sKKwlsb2NrZGVwX2Fzc2VydF9oZWxkKCZvYmotPmJh c2UuZGV2LT5zdHJ1Y3RfbXV0ZXgpOworCV9fY2xlYXJfYml0KEk5MTVfQk9fQUNUSVZFX1JFRiwg Jm9iai0+ZmxhZ3MpOworfQorCit2b2lkIF9faTkxNV9nZW1fb2JqZWN0X3JlbGVhc2VfdW5sZXNz X2FjdGl2ZShzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqKTsKKworc3RhdGljIGlubGlu ZSB1bnNpZ25lZCBpbnQKK2k5MTVfZ2VtX29iamVjdF9nZXRfdGlsaW5nKHN0cnVjdCBkcm1faTkx NV9nZW1fb2JqZWN0ICpvYmopCit7CisJcmV0dXJuIG9iai0+dGlsaW5nX2FuZF9zdHJpZGUgJiBU SUxJTkdfTUFTSzsKK30KKworc3RhdGljIGlubGluZSBib29sCitpOTE1X2dlbV9vYmplY3RfaXNf dGlsZWQoc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaikKK3sKKwlyZXR1cm4gaTkxNV9n ZW1fb2JqZWN0X2dldF90aWxpbmcob2JqKSAhPSBJOTE1X1RJTElOR19OT05FOworfQorCitzdGF0 aWMgaW5saW5lIHVuc2lnbmVkIGludAoraTkxNV9nZW1fb2JqZWN0X2dldF9zdHJpZGUoc3RydWN0 IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaikKK3sKKwlyZXR1cm4gb2JqLT50aWxpbmdfYW5kX3N0 cmlkZSAmIFNUUklERV9NQVNLOworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBpbnRlbF9lbmdp bmVfY3MgKgoraTkxNV9nZW1fb2JqZWN0X2xhc3Rfd3JpdGVfZW5naW5lKHN0cnVjdCBkcm1faTkx NV9nZW1fb2JqZWN0ICpvYmopCit7CisJc3RydWN0IGludGVsX2VuZ2luZV9jcyAqZW5naW5lID0g TlVMTDsKKwlzdHJ1Y3QgZG1hX2ZlbmNlICpmZW5jZTsKKworCXJjdV9yZWFkX2xvY2soKTsKKwlm ZW5jZSA9IHJlc2VydmF0aW9uX29iamVjdF9nZXRfZXhjbF9yY3Uob2JqLT5yZXN2KTsKKwlyY3Vf cmVhZF91bmxvY2soKTsKKworCWlmIChmZW5jZSAmJiBkbWFfZmVuY2VfaXNfaTkxNShmZW5jZSkg JiYgIWRtYV9mZW5jZV9pc19zaWduYWxlZChmZW5jZSkpCisJCWVuZ2luZSA9IHRvX3JlcXVlc3Qo ZmVuY2UpLT5lbmdpbmU7CisJZG1hX2ZlbmNlX3B1dChmZW5jZSk7CisKKwlyZXR1cm4gZW5naW5l OworfQorCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9n ZW1fcmVxdWVzdC5oIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9nZW1fcmVxdWVzdC5oCmlu ZGV4IDBmNjlmYWQuLmE1NjU1OWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5 MTVfZ2VtX3JlcXVlc3QuaAorKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2dlbV9yZXF1 ZXN0LmgKQEAgLTMwLDYgKzMwLDkgQEAKICNpbmNsdWRlICJpOTE1X2dlbS5oIgogI2luY2x1ZGUg Imk5MTVfc3dfZmVuY2UuaCIKIAorc3RydWN0IGRybV9maWxlOworc3RydWN0IGRybV9pOTE1X2dl bV9vYmplY3Q7CisKIHN0cnVjdCBpbnRlbF93YWl0IHsKIAlzdHJ1Y3QgcmJfbm9kZSBub2RlOwog CXN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5 MTUvaTkxNV92bWEuYyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfdm1hLmMKbmV3IGZpbGUg bW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzM4ZmYzYQotLS0gL2Rldi9udWxsCisrKyBiL2Ry aXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfdm1hLmMKQEAgLTAsMCArMSw2NTAgQEAKKy8qCisgKiBD b3B5cmlnaHQgwqkgMjAxNiBJbnRlbCBDb3Jwb3JhdGlvbgorICoKKyAqIFBlcm1pc3Npb24gaXMg aGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBh CisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBm aWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91 dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0 cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1Ymxp Y2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVy bWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBz bywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3Zl IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0 aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9y IHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNP RlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQs IEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhF IFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNV TEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBU SEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwg REFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBD T05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqIEZST00sIE9VVCBPRiBPUiBJ TiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElO R1MKKyAqIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKi8KKyAKKyNpbmNsdWRlICJpOTE1X3ZtYS5o IgorCisjaW5jbHVkZSAiaTkxNV9kcnYuaCIKKyNpbmNsdWRlICJpbnRlbF9yaW5nYnVmZmVyLmgi CisjaW5jbHVkZSAiaW50ZWxfZnJvbnRidWZmZXIuaCIKKworI2luY2x1ZGUgPGRybS9kcm1fZ2Vt Lmg+CisKK3N0YXRpYyB2b2lkCitpOTE1X3ZtYV9yZXRpcmUoc3RydWN0IGk5MTVfZ2VtX2FjdGl2 ZSAqYWN0aXZlLAorCQlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX3JlcXVlc3QgKnJxKQoreworCWNvbnN0 IHVuc2lnbmVkIGludCBpZHggPSBycS0+ZW5naW5lLT5pZDsKKwlzdHJ1Y3QgaTkxNV92bWEgKnZt YSA9CisJCWNvbnRhaW5lcl9vZihhY3RpdmUsIHN0cnVjdCBpOTE1X3ZtYSwgbGFzdF9yZWFkW2lk eF0pOworCXN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmogPSB2bWEtPm9iajsKKworCUdF TV9CVUdfT04oIWk5MTVfdm1hX2hhc19hY3RpdmVfZW5naW5lKHZtYSwgaWR4KSk7CisKKwlpOTE1 X3ZtYV9jbGVhcl9hY3RpdmUodm1hLCBpZHgpOworCWlmIChpOTE1X3ZtYV9pc19hY3RpdmUodm1h KSkKKwkJcmV0dXJuOworCisJbGlzdF9tb3ZlX3RhaWwoJnZtYS0+dm1fbGluaywgJnZtYS0+dm0t PmluYWN0aXZlX2xpc3QpOworCWlmICh1bmxpa2VseShpOTE1X3ZtYV9pc19jbG9zZWQodm1hKSAm JiAhaTkxNV92bWFfaXNfcGlubmVkKHZtYSkpKQorCQlXQVJOX09OKGk5MTVfdm1hX3VuYmluZCh2 bWEpKTsKKworCUdFTV9CVUdfT04oIWk5MTVfZ2VtX29iamVjdF9pc19hY3RpdmUob2JqKSk7CisJ aWYgKC0tb2JqLT5hY3RpdmVfY291bnQpCisJCXJldHVybjsKKworCS8qIEJ1bXAgb3VyIHBsYWNl IG9uIHRoZSBib3VuZCBsaXN0IHRvIGtlZXAgaXQgcm91Z2hseSBpbiBMUlUgb3JkZXIKKwkgKiBz byB0aGF0IHdlIGRvbid0IHN0ZWFsIGZyb20gcmVjZW50bHkgdXNlZCBidXQgaW5hY3RpdmUgb2Jq ZWN0cworCSAqICh1bmxlc3Mgd2UgYXJlIGZvcmNlZCB0byBvZmMhKQorCSAqLworCWlmIChvYmot PmJpbmRfY291bnQpCisJCWxpc3RfbW92ZV90YWlsKCZvYmotPmdsb2JhbF9saW5rLCAmcnEtPmk5 MTUtPm1tLmJvdW5kX2xpc3QpOworCisJb2JqLT5tbS5kaXJ0eSA9IHRydWU7IC8qIGJlIHBhcmFu b2lkICAqLworCisJaWYgKGk5MTVfZ2VtX29iamVjdF9oYXNfYWN0aXZlX3JlZmVyZW5jZShvYmop KSB7CisJCWk5MTVfZ2VtX29iamVjdF9jbGVhcl9hY3RpdmVfcmVmZXJlbmNlKG9iaik7CisJCWk5 MTVfZ2VtX29iamVjdF9wdXQob2JqKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkCitpOTE1X2dndHRf cmV0aXJlX193cml0ZShzdHJ1Y3QgaTkxNV9nZW1fYWN0aXZlICphY3RpdmUsCisJCQlzdHJ1Y3Qg ZHJtX2k5MTVfZ2VtX3JlcXVlc3QgKnJlcXVlc3QpCit7CisJc3RydWN0IGk5MTVfdm1hICp2bWEg PQorCQljb250YWluZXJfb2YoYWN0aXZlLCBzdHJ1Y3QgaTkxNV92bWEsIGxhc3Rfd3JpdGUpOwor CisJaW50ZWxfZmJfb2JqX2ZsdXNoKHZtYS0+b2JqLCB0cnVlLCBPUklHSU5fQ1MpOworfQorCitz dGF0aWMgc3RydWN0IGk5MTVfdm1hICoKK19faTkxNV92bWFfY3JlYXRlKHN0cnVjdCBkcm1faTkx NV9nZW1fb2JqZWN0ICpvYmosCisJCSAgc3RydWN0IGk5MTVfYWRkcmVzc19zcGFjZSAqdm0sCisJ CSAgY29uc3Qgc3RydWN0IGk5MTVfZ2d0dF92aWV3ICp2aWV3KQoreworCXN0cnVjdCBpOTE1X3Zt YSAqdm1hOworCXN0cnVjdCByYl9ub2RlICpyYiwgKipwOworCWludCBpOworCisJR0VNX0JVR19P Tih2bS0+Y2xvc2VkKTsKKworCXZtYSA9IGttZW1fY2FjaGVfemFsbG9jKHRvX2k5MTUob2JqLT5i YXNlLmRldiktPnZtYXMsIEdGUF9LRVJORUwpOworCWlmICh2bWEgPT0gTlVMTCkKKwkJcmV0dXJu IEVSUl9QVFIoLUVOT01FTSk7CisKKwlJTklUX0xJU1RfSEVBRCgmdm1hLT5leGVjX2xpc3QpOwor CWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHZtYS0+bGFzdF9yZWFkKTsgaSsrKQorCQlpbml0 X3JlcXVlc3RfYWN0aXZlKCZ2bWEtPmxhc3RfcmVhZFtpXSwgaTkxNV92bWFfcmV0aXJlKTsKKwlp bml0X3JlcXVlc3RfYWN0aXZlKCZ2bWEtPmxhc3Rfd3JpdGUsCisJCQkgICAgaTkxNV9pc19nZ3R0 KHZtKSA/IGk5MTVfZ2d0dF9yZXRpcmVfX3dyaXRlIDogTlVMTCk7CisJaW5pdF9yZXF1ZXN0X2Fj dGl2ZSgmdm1hLT5sYXN0X2ZlbmNlLCBOVUxMKTsKKwlsaXN0X2FkZCgmdm1hLT52bV9saW5rLCAm dm0tPnVuYm91bmRfbGlzdCk7CisJdm1hLT52bSA9IHZtOworCXZtYS0+b2JqID0gb2JqOworCXZt YS0+c2l6ZSA9IG9iai0+YmFzZS5zaXplOworCisJaWYgKHZpZXcpIHsKKwkJdm1hLT5nZ3R0X3Zp ZXcgPSAqdmlldzsKKwkJaWYgKHZpZXctPnR5cGUgPT0gSTkxNV9HR1RUX1ZJRVdfUEFSVElBTCkg eworCQkJdm1hLT5zaXplID0gdmlldy0+cGFyYW1zLnBhcnRpYWwuc2l6ZTsKKwkJCXZtYS0+c2l6 ZSA8PD0gUEFHRV9TSElGVDsKKwkJfSBlbHNlIGlmICh2aWV3LT50eXBlID09IEk5MTVfR0dUVF9W SUVXX1JPVEFURUQpIHsKKwkJCXZtYS0+c2l6ZSA9CisJCQkJaW50ZWxfcm90YXRpb25faW5mb19z aXplKCZ2aWV3LT5wYXJhbXMucm90YXRlZCk7CisJCQl2bWEtPnNpemUgPDw9IFBBR0VfU0hJRlQ7 CisJCX0KKwl9CisKKwlpZiAoaTkxNV9pc19nZ3R0KHZtKSkgeworCQl2bWEtPmZsYWdzIHw9IEk5 MTVfVk1BX0dHVFQ7CisJCWxpc3RfYWRkKCZ2bWEtPm9ial9saW5rLCAmb2JqLT52bWFfbGlzdCk7 CisJfSBlbHNlIHsKKwkJaTkxNV9wcGd0dF9nZXQoaTkxNV92bV90b19wcGd0dCh2bSkpOworCQls aXN0X2FkZF90YWlsKCZ2bWEtPm9ial9saW5rLCAmb2JqLT52bWFfbGlzdCk7CisJfQorCisJcmIg PSBOVUxMOworCXAgPSAmb2JqLT52bWFfdHJlZS5yYl9ub2RlOworCXdoaWxlICgqcCkgeworCQlz dHJ1Y3QgaTkxNV92bWEgKnBvczsKKworCQlyYiA9ICpwOworCQlwb3MgPSByYl9lbnRyeShyYiwg c3RydWN0IGk5MTVfdm1hLCBvYmpfbm9kZSk7CisJCWlmIChpOTE1X3ZtYV9jb21wYXJlKHBvcywg dm0sIHZpZXcpIDwgMCkKKwkJCXAgPSAmcmItPnJiX3JpZ2h0OworCQllbHNlCisJCQlwID0gJnJi LT5yYl9sZWZ0OworCX0KKwlyYl9saW5rX25vZGUoJnZtYS0+b2JqX25vZGUsIHJiLCBwKTsKKwly Yl9pbnNlcnRfY29sb3IoJnZtYS0+b2JqX25vZGUsICZvYmotPnZtYV90cmVlKTsKKworCXJldHVy biB2bWE7Cit9CisKK3N0cnVjdCBpOTE1X3ZtYSAqCitpOTE1X3ZtYV9jcmVhdGUoc3RydWN0IGRy bV9pOTE1X2dlbV9vYmplY3QgKm9iaiwKKwkJc3RydWN0IGk5MTVfYWRkcmVzc19zcGFjZSAqdm0s CisJCWNvbnN0IHN0cnVjdCBpOTE1X2dndHRfdmlldyAqdmlldykKK3sKKwlsb2NrZGVwX2Fzc2Vy dF9oZWxkKCZvYmotPmJhc2UuZGV2LT5zdHJ1Y3RfbXV0ZXgpOworCUdFTV9CVUdfT04odmlldyAm JiAhaTkxNV9pc19nZ3R0KHZtKSk7CisJR0VNX0JVR19PTihpOTE1X2dlbV9vYmpfdG9fdm1hKG9i aiwgdm0sIHZpZXcpKTsKKworCXJldHVybiBfX2k5MTVfdm1hX2NyZWF0ZShvYmosIHZtLCB2aWV3 KTsKK30KKworLyoqCisgKiBpOTE1X3ZtYV9iaW5kIC0gU2V0cyB1cCBQVEVzIGZvciBhbiBWTUEg aW4gaXQncyBjb3JyZXNwb25kaW5nIGFkZHJlc3Mgc3BhY2UuCisgKiBAdm1hOiBWTUEgdG8gbWFw CisgKiBAY2FjaGVfbGV2ZWw6IG1hcHBpbmcgY2FjaGUgbGV2ZWwKKyAqIEBmbGFnczogZmxhZ3Mg bGlrZSBnbG9iYWwgb3IgbG9jYWwgbWFwcGluZworICoKKyAqIERNQSBhZGRyZXNzZXMgYXJlIHRh a2VuIGZyb20gdGhlIHNjYXR0ZXItZ2F0aGVyIHRhYmxlIG9mIHRoaXMgb2JqZWN0IChvciBvZgor ICogdGhpcyBWTUEgaW4gY2FzZSBvZiBub24tZGVmYXVsdCBHR1RUIHZpZXdzKSBhbmQgUFRFIGVu dHJpZXMgc2V0IHVwLgorICogTm90ZSB0aGF0IERNQSBhZGRyZXNzZXMgYXJlIGFsc28gdGhlIG9u bHkgcGFydCBvZiB0aGUgU0cgdGFibGUgd2UgY2FyZSBhYm91dC4KKyAqLworaW50IGk5MTVfdm1h X2JpbmQoc3RydWN0IGk5MTVfdm1hICp2bWEsIGVudW0gaTkxNV9jYWNoZV9sZXZlbCBjYWNoZV9s ZXZlbCwKKwkJICB1MzIgZmxhZ3MpCit7CisJdTMyIGJpbmRfZmxhZ3M7CisJdTMyIHZtYV9mbGFn czsKKwlpbnQgcmV0OworCisJaWYgKFdBUk5fT04oZmxhZ3MgPT0gMCkpCisJCXJldHVybiAtRUlO VkFMOworCisJYmluZF9mbGFncyA9IDA7CisJaWYgKGZsYWdzICYgUElOX0dMT0JBTCkKKwkJYmlu ZF9mbGFncyB8PSBJOTE1X1ZNQV9HTE9CQUxfQklORDsKKwlpZiAoZmxhZ3MgJiBQSU5fVVNFUikK KwkJYmluZF9mbGFncyB8PSBJOTE1X1ZNQV9MT0NBTF9CSU5EOworCisJdm1hX2ZsYWdzID0gdm1h LT5mbGFncyAmIChJOTE1X1ZNQV9HTE9CQUxfQklORCB8IEk5MTVfVk1BX0xPQ0FMX0JJTkQpOwor CWlmIChmbGFncyAmIFBJTl9VUERBVEUpCisJCWJpbmRfZmxhZ3MgfD0gdm1hX2ZsYWdzOworCWVs c2UKKwkJYmluZF9mbGFncyAmPSB+dm1hX2ZsYWdzOworCWlmIChiaW5kX2ZsYWdzID09IDApCisJ CXJldHVybiAwOworCisJaWYgKHZtYV9mbGFncyA9PSAwICYmIHZtYS0+dm0tPmFsbG9jYXRlX3Zh X3JhbmdlKSB7CisJCXRyYWNlX2k5MTVfdmFfYWxsb2Modm1hKTsKKwkJcmV0ID0gdm1hLT52bS0+ YWxsb2NhdGVfdmFfcmFuZ2Uodm1hLT52bSwKKwkJCQkJCSB2bWEtPm5vZGUuc3RhcnQsCisJCQkJ CQkgdm1hLT5ub2RlLnNpemUpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKwl9CisKKwly ZXQgPSB2bWEtPnZtLT5iaW5kX3ZtYSh2bWEsIGNhY2hlX2xldmVsLCBiaW5kX2ZsYWdzKTsKKwlp ZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJdm1hLT5mbGFncyB8PSBiaW5kX2ZsYWdzOworCXJl dHVybiAwOworfQorCit2b2lkIF9faW9tZW0gKmk5MTVfdm1hX3Bpbl9pb21hcChzdHJ1Y3QgaTkx NV92bWEgKnZtYSkKK3sKKwl2b2lkIF9faW9tZW0gKnB0cjsKKworCS8qIEFjY2VzcyB0aHJvdWdo IHRoZSBHVFQgcmVxdWlyZXMgdGhlIGRldmljZSB0byBiZSBhd2FrZS4gKi8KKwlhc3NlcnRfcnBt X3dha2Vsb2NrX2hlbGQodG9faTkxNSh2bWEtPnZtLT5kZXYpKTsKKworCWxvY2tkZXBfYXNzZXJ0 X2hlbGQoJnZtYS0+dm0tPmRldi0+c3RydWN0X211dGV4KTsKKwlpZiAoV0FSTl9PTighaTkxNV92 bWFfaXNfbWFwX2FuZF9mZW5jZWFibGUodm1hKSkpCisJCXJldHVybiBJT19FUlJfUFRSKC1FTk9E RVYpOworCisJR0VNX0JVR19PTighaTkxNV92bWFfaXNfZ2d0dCh2bWEpKTsKKwlHRU1fQlVHX09O KCh2bWEtPmZsYWdzICYgSTkxNV9WTUFfR0xPQkFMX0JJTkQpID09IDApOworCisJcHRyID0gdm1h LT5pb21hcDsKKwlpZiAocHRyID09IE5VTEwpIHsKKwkJcHRyID0gaW9fbWFwcGluZ19tYXBfd2Mo Jmk5MTVfdm1fdG9fZ2d0dCh2bWEtPnZtKS0+bWFwcGFibGUsCisJCQkJCXZtYS0+bm9kZS5zdGFy dCwKKwkJCQkJdm1hLT5ub2RlLnNpemUpOworCQlpZiAocHRyID09IE5VTEwpCisJCQlyZXR1cm4g SU9fRVJSX1BUUigtRU5PTUVNKTsKKworCQl2bWEtPmlvbWFwID0gcHRyOworCX0KKworCV9faTkx NV92bWFfcGluKHZtYSk7CisJcmV0dXJuIHB0cjsKK30KKwordm9pZCBpOTE1X3ZtYV91bnBpbl9h bmRfcmVsZWFzZShzdHJ1Y3QgaTkxNV92bWEgKipwX3ZtYSkKK3sKKwlzdHJ1Y3QgaTkxNV92bWEg KnZtYTsKKwlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqOworCisJdm1hID0gZmV0Y2hf YW5kX3plcm8ocF92bWEpOworCWlmICghdm1hKQorCQlyZXR1cm47CisKKwlvYmogPSB2bWEtPm9i ajsKKworCWk5MTVfdm1hX3VucGluKHZtYSk7CisJaTkxNV92bWFfY2xvc2Uodm1hKTsKKworCV9f aTkxNV9nZW1fb2JqZWN0X3JlbGVhc2VfdW5sZXNzX2FjdGl2ZShvYmopOworfQorCitib29sCitp OTE1X3ZtYV9taXNwbGFjZWQoc3RydWN0IGk5MTVfdm1hICp2bWEsIHU2NCBzaXplLCB1NjQgYWxp Z25tZW50LCB1NjQgZmxhZ3MpCit7CisJaWYgKCFkcm1fbW1fbm9kZV9hbGxvY2F0ZWQoJnZtYS0+ bm9kZSkpCisJCXJldHVybiBmYWxzZTsKKworCWlmICh2bWEtPm5vZGUuc2l6ZSA8IHNpemUpCisJ CXJldHVybiB0cnVlOworCisJaWYgKGFsaWdubWVudCAmJiB2bWEtPm5vZGUuc3RhcnQgJiAoYWxp Z25tZW50IC0gMSkpCisJCXJldHVybiB0cnVlOworCisJaWYgKGZsYWdzICYgUElOX01BUFBBQkxF ICYmICFpOTE1X3ZtYV9pc19tYXBfYW5kX2ZlbmNlYWJsZSh2bWEpKQorCQlyZXR1cm4gdHJ1ZTsK KworCWlmIChmbGFncyAmIFBJTl9PRkZTRVRfQklBUyAmJgorCSAgICB2bWEtPm5vZGUuc3RhcnQg PCAoZmxhZ3MgJiBQSU5fT0ZGU0VUX01BU0spKQorCQlyZXR1cm4gdHJ1ZTsKKworCWlmIChmbGFn cyAmIFBJTl9PRkZTRVRfRklYRUQgJiYKKwkgICAgdm1hLT5ub2RlLnN0YXJ0ICE9IChmbGFncyAm IFBJTl9PRkZTRVRfTUFTSykpCisJCXJldHVybiB0cnVlOworCisJcmV0dXJuIGZhbHNlOworfQor Cit2b2lkIF9faTkxNV92bWFfc2V0X21hcF9hbmRfZmVuY2VhYmxlKHN0cnVjdCBpOTE1X3ZtYSAq dm1hKQoreworCXN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmogPSB2bWEtPm9iajsKKwlz dHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSB0b19pOTE1KG9iai0+YmFzZS5kZXYp OworCWJvb2wgbWFwcGFibGUsIGZlbmNlYWJsZTsKKwl1MzIgZmVuY2Vfc2l6ZSwgZmVuY2VfYWxp Z25tZW50OworCisJZmVuY2Vfc2l6ZSA9IGk5MTVfZ2VtX2dldF9nZ3R0X3NpemUoZGV2X3ByaXYs CisJCQkJCSAgICB2bWEtPnNpemUsCisJCQkJCSAgICBpOTE1X2dlbV9vYmplY3RfZ2V0X3RpbGlu ZyhvYmopKTsKKwlmZW5jZV9hbGlnbm1lbnQgPSBpOTE1X2dlbV9nZXRfZ2d0dF9hbGlnbm1lbnQo ZGV2X3ByaXYsCisJCQkJCQkgICAgICB2bWEtPnNpemUsCisJCQkJCQkgICAgICBpOTE1X2dlbV9v YmplY3RfZ2V0X3RpbGluZyhvYmopLAorCQkJCQkJICAgICAgdHJ1ZSk7CisKKwlmZW5jZWFibGUg PSAodm1hLT5ub2RlLnNpemUgPT0gZmVuY2Vfc2l6ZSAmJgorCQkgICAgICh2bWEtPm5vZGUuc3Rh cnQgJiAoZmVuY2VfYWxpZ25tZW50IC0gMSkpID09IDApOworCisJbWFwcGFibGUgPSAodm1hLT5u b2RlLnN0YXJ0ICsgZmVuY2Vfc2l6ZSA8PQorCQkgICAgZGV2X3ByaXYtPmdndHQubWFwcGFibGVf ZW5kKTsKKworCS8qCisJICogRXhwbGljaXRseSBkaXNhYmxlIGZvciByb3RhdGVkIFZNQSBzaW5j ZSB0aGUgZGlzcGxheSBkb2VzIG5vdAorCSAqIG5lZWQgdGhlIGZlbmNlIGFuZCB0aGUgVk1BIGlz IG5vdCBhY2Nlc3NpYmxlIHRvIG90aGVyIHVzZXJzLgorCSAqLworCWlmIChtYXBwYWJsZSAmJiBm ZW5jZWFibGUgJiYKKwkgICAgdm1hLT5nZ3R0X3ZpZXcudHlwZSAhPSBJOTE1X0dHVFRfVklFV19S T1RBVEVEKQorCQl2bWEtPmZsYWdzIHw9IEk5MTVfVk1BX0NBTl9GRU5DRTsKKwllbHNlCisJCXZt YS0+ZmxhZ3MgJj0gfkk5MTVfVk1BX0NBTl9GRU5DRTsKK30KKworYm9vbCBpOTE1X2dlbV92YWxp ZF9ndHRfc3BhY2Uoc3RydWN0IGk5MTVfdm1hICp2bWEsCisJCQkgICAgICB1bnNpZ25lZCBsb25n IGNhY2hlX2xldmVsKQoreworCXN0cnVjdCBkcm1fbW1fbm9kZSAqZ3R0X3NwYWNlID0gJnZtYS0+ bm9kZTsKKwlzdHJ1Y3QgZHJtX21tX25vZGUgKm90aGVyOworCisJLyoKKwkgKiBPbiBzb21lIG1h Y2hpbmVzIHdlIGhhdmUgdG8gYmUgY2FyZWZ1bCB3aGVuIHB1dHRpbmcgZGlmZmVyaW5nIHR5cGVz CisJICogb2Ygc25vb3BhYmxlIG1lbW9yeSB0b2dldGhlciB0byBhdm9pZCB0aGUgcHJlZmV0Y2hl ciBjcm9zc2luZyBtZW1vcnkKKwkgKiBkb21haW5zIGFuZCBkeWluZy4gRHVyaW5nIHZtIGluaXRp YWxpc2F0aW9uLCB3ZSBkZWNpZGUgd2hldGhlciBvciBub3QKKwkgKiB0aGVzZSBjb25zdHJhaW50 cyBhcHBseSBhbmQgc2V0IHRoZSBkcm1fbW0uY29sb3JfYWRqdXN0CisJICogYXBwcm9wcmlhdGVs eS4KKwkgKi8KKwlpZiAodm1hLT52bS0+bW0uY29sb3JfYWRqdXN0ID09IE5VTEwpCisJCXJldHVy biB0cnVlOworCisJaWYgKCFkcm1fbW1fbm9kZV9hbGxvY2F0ZWQoZ3R0X3NwYWNlKSkKKwkJcmV0 dXJuIHRydWU7CisKKwlpZiAobGlzdF9lbXB0eSgmZ3R0X3NwYWNlLT5ub2RlX2xpc3QpKQorCQly ZXR1cm4gdHJ1ZTsKKworCW90aGVyID0gbGlzdF9lbnRyeShndHRfc3BhY2UtPm5vZGVfbGlzdC5w cmV2LCBzdHJ1Y3QgZHJtX21tX25vZGUsIG5vZGVfbGlzdCk7CisJaWYgKG90aGVyLT5hbGxvY2F0 ZWQgJiYgIW90aGVyLT5ob2xlX2ZvbGxvd3MgJiYgb3RoZXItPmNvbG9yICE9IGNhY2hlX2xldmVs KQorCQlyZXR1cm4gZmFsc2U7CisKKwlvdGhlciA9IGxpc3RfZW50cnkoZ3R0X3NwYWNlLT5ub2Rl X2xpc3QubmV4dCwgc3RydWN0IGRybV9tbV9ub2RlLCBub2RlX2xpc3QpOworCWlmIChvdGhlci0+ YWxsb2NhdGVkICYmICFndHRfc3BhY2UtPmhvbGVfZm9sbG93cyAmJiBvdGhlci0+Y29sb3IgIT0g Y2FjaGVfbGV2ZWwpCisJCXJldHVybiBmYWxzZTsKKworCXJldHVybiB0cnVlOworfQorCisvKioK KyAqIGk5MTVfdm1hX2luc2VydCAtIGZpbmRzIGEgc2xvdCBmb3IgdGhlIHZtYSBpbiBpdHMgYWRk cmVzcyBzcGFjZQorICogQHZtYTogdGhlIHZtYQorICogQHNpemU6IHJlcXVlc3RlZCBzaXplIGlu IGJ5dGVzIChjYW4gYmUgbGFyZ2VyIHRoYW4gdGhlIFZNQSkKKyAqIEBhbGlnbm1lbnQ6IHJlcXVp cmVkIGFsaWdubWVudAorICogQGZsYWdzOiBtYXNrIG9mIFBJTl8qIGZsYWdzIHRvIHVzZQorICoK KyAqIEZpcnN0IHdlIHRyeSB0byBhbGxvY2F0ZSBzb21lIGZyZWUgc3BhY2UgdGhhdCBtZWV0cyB0 aGUgcmVxdWlyZW1lbnRzIGZvcgorICogdGhlIFZNQS4gRmFpbGlpbmcgdGhhdCwgaWYgdGhlIGZs YWdzIHBlcm1pdCwgaXQgd2lsbCBldmljdCBhbiBvbGQgVk1BLAorICogcHJlZmVycmFibHkgdGhl IG9sZGVzdCBpZGxlIGVudHJ5IHRvIG1ha2Ugcm9vbSBmb3IgdGhlIG5ldyBWTUEuCisgKgorICog UmV0dXJuczoKKyAqIDAgb24gc3VjY2VzcywgbmVnYXRpdmUgZXJyb3IgY29kZSBvdGhlcndpc2Uu CisgKi8KK3N0YXRpYyBpbnQKK2k5MTVfdm1hX2luc2VydChzdHJ1Y3QgaTkxNV92bWEgKnZtYSwg dTY0IHNpemUsIHU2NCBhbGlnbm1lbnQsIHU2NCBmbGFncykKK3sKKwlzdHJ1Y3QgZHJtX2k5MTVf cHJpdmF0ZSAqZGV2X3ByaXYgPSB0b19pOTE1KHZtYS0+dm0tPmRldik7CisJc3RydWN0IGRybV9p OTE1X2dlbV9vYmplY3QgKm9iaiA9IHZtYS0+b2JqOworCXU2NCBzdGFydCwgZW5kOworCWludCBy ZXQ7CisKKwlHRU1fQlVHX09OKHZtYS0+ZmxhZ3MgJiAoSTkxNV9WTUFfR0xPQkFMX0JJTkQgfCBJ OTE1X1ZNQV9MT0NBTF9CSU5EKSk7CisJR0VNX0JVR19PTihkcm1fbW1fbm9kZV9hbGxvY2F0ZWQo JnZtYS0+bm9kZSkpOworCisJc2l6ZSA9IG1heChzaXplLCB2bWEtPnNpemUpOworCWlmIChmbGFn cyAmIFBJTl9NQVBQQUJMRSkKKwkJc2l6ZSA9IGk5MTVfZ2VtX2dldF9nZ3R0X3NpemUoZGV2X3By aXYsIHNpemUsCisJCQkJCSAgICAgIGk5MTVfZ2VtX29iamVjdF9nZXRfdGlsaW5nKG9iaikpOwor CisJYWxpZ25tZW50ID0gbWF4KG1heChhbGlnbm1lbnQsIHZtYS0+ZGlzcGxheV9hbGlnbm1lbnQp LAorCQkJaTkxNV9nZW1fZ2V0X2dndHRfYWxpZ25tZW50KGRldl9wcml2LCBzaXplLAorCQkJCQkJ ICAgIGk5MTVfZ2VtX29iamVjdF9nZXRfdGlsaW5nKG9iaiksCisJCQkJCQkgICAgZmxhZ3MgJiBQ SU5fTUFQUEFCTEUpKTsKKworCXN0YXJ0ID0gZmxhZ3MgJiBQSU5fT0ZGU0VUX0JJQVMgPyBmbGFn cyAmIFBJTl9PRkZTRVRfTUFTSyA6IDA7CisKKwllbmQgPSB2bWEtPnZtLT50b3RhbDsKKwlpZiAo ZmxhZ3MgJiBQSU5fTUFQUEFCTEUpCisJCWVuZCA9IG1pbl90KHU2NCwgZW5kLCBkZXZfcHJpdi0+ Z2d0dC5tYXBwYWJsZV9lbmQpOworCWlmIChmbGFncyAmIFBJTl9aT05FXzRHKQorCQllbmQgPSBt aW5fdCh1NjQsIGVuZCwgKDFVTEwgPDwgMzIpIC0gUEFHRV9TSVpFKTsKKworCS8qIElmIGJpbmRp bmcgdGhlIG9iamVjdC9HR1RUIHZpZXcgcmVxdWlyZXMgbW9yZSBzcGFjZSB0aGFuIHRoZSBlbnRp cmUKKwkgKiBhcGVydHVyZSBoYXMsIHJlamVjdCBpdCBlYXJseSBiZWZvcmUgZXZpY3RpbmcgZXZl cnl0aGluZyBpbiBhIHZhaW4KKwkgKiBhdHRlbXB0IHRvIGZpbmQgc3BhY2UuCisJICovCisJaWYg KHNpemUgPiBlbmQpIHsKKwkJRFJNX0RFQlVHKCJBdHRlbXB0aW5nIHRvIGJpbmQgYW4gb2JqZWN0 IGxhcmdlciB0aGFuIHRoZSBhcGVydHVyZTogcmVxdWVzdD0lbGx1IFtvYmplY3Q9JXpkXSA+ICVz IGFwZXJ0dXJlPSVsbHVcbiIsCisJCQkgIHNpemUsIG9iai0+YmFzZS5zaXplLAorCQkJICBmbGFn cyAmIFBJTl9NQVBQQUJMRSA/ICJtYXBwYWJsZSIgOiAidG90YWwiLAorCQkJICBlbmQpOworCQly ZXR1cm4gLUUyQklHOworCX0KKworCXJldCA9IGk5MTVfZ2VtX29iamVjdF9waW5fcGFnZXMob2Jq KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJaWYgKGZsYWdzICYgUElOX09GRlNFVF9G SVhFRCkgeworCQl1NjQgb2Zmc2V0ID0gZmxhZ3MgJiBQSU5fT0ZGU0VUX01BU0s7CisJCWlmIChv ZmZzZXQgJiAoYWxpZ25tZW50IC0gMSkgfHwgb2Zmc2V0ID4gZW5kIC0gc2l6ZSkgeworCQkJcmV0 ID0gLUVJTlZBTDsKKwkJCWdvdG8gZXJyX3VucGluOworCQl9CisKKwkJdm1hLT5ub2RlLnN0YXJ0 ID0gb2Zmc2V0OworCQl2bWEtPm5vZGUuc2l6ZSA9IHNpemU7CisJCXZtYS0+bm9kZS5jb2xvciA9 IG9iai0+Y2FjaGVfbGV2ZWw7CisJCXJldCA9IGRybV9tbV9yZXNlcnZlX25vZGUoJnZtYS0+dm0t Pm1tLCAmdm1hLT5ub2RlKTsKKwkJaWYgKHJldCkgeworCQkJcmV0ID0gaTkxNV9nZW1fZXZpY3Rf Zm9yX3ZtYSh2bWEpOworCQkJaWYgKHJldCA9PSAwKQorCQkJCXJldCA9IGRybV9tbV9yZXNlcnZl X25vZGUoJnZtYS0+dm0tPm1tLCAmdm1hLT5ub2RlKTsKKwkJCWlmIChyZXQpCisJCQkJZ290byBl cnJfdW5waW47CisJCX0KKwl9IGVsc2UgeworCQl1MzIgc2VhcmNoX2ZsYWcsIGFsbG9jX2ZsYWc7 CisKKwkJaWYgKGZsYWdzICYgUElOX0hJR0gpIHsKKwkJCXNlYXJjaF9mbGFnID0gRFJNX01NX1NF QVJDSF9CRUxPVzsKKwkJCWFsbG9jX2ZsYWcgPSBEUk1fTU1fQ1JFQVRFX1RPUDsKKwkJfSBlbHNl IHsKKwkJCXNlYXJjaF9mbGFnID0gRFJNX01NX1NFQVJDSF9ERUZBVUxUOworCQkJYWxsb2NfZmxh ZyA9IERSTV9NTV9DUkVBVEVfREVGQVVMVDsKKwkJfQorCisJCS8qIFdlIG9ubHkgYWxsb2NhdGUg aW4gUEFHRV9TSVpFL0dUVF9QQUdFX1NJWkUgKDQwOTYpIGNodW5rcywKKwkJICogc28gd2Uga25v dyB0aGF0IHdlIGFsd2F5cyBoYXZlIGEgbWluaW11bSBhbGlnbm1lbnQgb2YgNDA5Ni4KKwkJICog VGhlIGRybV9tbSByYW5nZSBtYW5hZ2VyIGlzIG9wdGltaXNlZCB0byByZXR1cm4gcmVzdWx0cwor CQkgKiB3aXRoIHplcm8gYWxpZ25tZW50LCBzbyB3aGVyZSBwb3NzaWJsZSB1c2UgdGhlIG9wdGlt YWwKKwkJICogcGF0aC4KKwkJICovCisJCWlmIChhbGlnbm1lbnQgPD0gNDA5NikKKwkJCWFsaWdu bWVudCA9IDA7CisKK3NlYXJjaF9mcmVlOgorCQlyZXQgPSBkcm1fbW1faW5zZXJ0X25vZGVfaW5f cmFuZ2VfZ2VuZXJpYygmdm1hLT52bS0+bW0sCisJCQkJCQkJICAmdm1hLT5ub2RlLAorCQkJCQkJ CSAgc2l6ZSwgYWxpZ25tZW50LAorCQkJCQkJCSAgb2JqLT5jYWNoZV9sZXZlbCwKKwkJCQkJCQkg IHN0YXJ0LCBlbmQsCisJCQkJCQkJICBzZWFyY2hfZmxhZywKKwkJCQkJCQkgIGFsbG9jX2ZsYWcp OworCQlpZiAocmV0KSB7CisJCQlyZXQgPSBpOTE1X2dlbV9ldmljdF9zb21ldGhpbmcodm1hLT52 bSwgc2l6ZSwgYWxpZ25tZW50LAorCQkJCQkJICAgICAgIG9iai0+Y2FjaGVfbGV2ZWwsCisJCQkJ CQkgICAgICAgc3RhcnQsIGVuZCwKKwkJCQkJCSAgICAgICBmbGFncyk7CisJCQlpZiAocmV0ID09 IDApCisJCQkJZ290byBzZWFyY2hfZnJlZTsKKworCQkJZ290byBlcnJfdW5waW47CisJCX0KKwor CQlHRU1fQlVHX09OKHZtYS0+bm9kZS5zdGFydCA8IHN0YXJ0KTsKKwkJR0VNX0JVR19PTih2bWEt Pm5vZGUuc3RhcnQgKyB2bWEtPm5vZGUuc2l6ZSA+IGVuZCk7CisJfQorCUdFTV9CVUdfT04oIWk5 MTVfZ2VtX3ZhbGlkX2d0dF9zcGFjZSh2bWEsIG9iai0+Y2FjaGVfbGV2ZWwpKTsKKworCWxpc3Rf bW92ZV90YWlsKCZvYmotPmdsb2JhbF9saW5rLCAmZGV2X3ByaXYtPm1tLmJvdW5kX2xpc3QpOwor CWxpc3RfbW92ZV90YWlsKCZ2bWEtPnZtX2xpbmssICZ2bWEtPnZtLT5pbmFjdGl2ZV9saXN0KTsK KwlvYmotPmJpbmRfY291bnQrKzsKKwlHRU1fQlVHX09OKGF0b21pY19yZWFkKCZvYmotPm1tLnBh Z2VzX3Bpbl9jb3VudCkgPCBvYmotPmJpbmRfY291bnQpOworCisJcmV0dXJuIDA7CisKK2Vycl91 bnBpbjoKKwlpOTE1X2dlbV9vYmplY3RfdW5waW5fcGFnZXMob2JqKTsKKwlyZXR1cm4gcmV0Owor fQorCitpbnQgX19pOTE1X3ZtYV9kb19waW4oc3RydWN0IGk5MTVfdm1hICp2bWEsCisJCSAgICAg IHU2NCBzaXplLCB1NjQgYWxpZ25tZW50LCB1NjQgZmxhZ3MpCit7CisJdW5zaWduZWQgaW50IGJv dW5kID0gdm1hLT5mbGFnczsKKwlpbnQgcmV0OworCisJbG9ja2RlcF9hc3NlcnRfaGVsZCgmdm1h LT52bS0+ZGV2LT5zdHJ1Y3RfbXV0ZXgpOworCUdFTV9CVUdfT04oKGZsYWdzICYgKFBJTl9HTE9C QUwgfCBQSU5fVVNFUikpID09IDApOworCUdFTV9CVUdfT04oKGZsYWdzICYgUElOX0dMT0JBTCkg JiYgIWk5MTVfdm1hX2lzX2dndHQodm1hKSk7CisKKwlpZiAoV0FSTl9PTihib3VuZCAmIEk5MTVf Vk1BX1BJTl9PVkVSRkxPVykpIHsKKwkJcmV0ID0gLUVCVVNZOworCQlnb3RvIGVycjsKKwl9CisK KwlpZiAoKGJvdW5kICYgSTkxNV9WTUFfQklORF9NQVNLKSA9PSAwKSB7CisJCXJldCA9IGk5MTVf dm1hX2luc2VydCh2bWEsIHNpemUsIGFsaWdubWVudCwgZmxhZ3MpOworCQlpZiAocmV0KQorCQkJ Z290byBlcnI7CisJfQorCisJcmV0ID0gaTkxNV92bWFfYmluZCh2bWEsIHZtYS0+b2JqLT5jYWNo ZV9sZXZlbCwgZmxhZ3MpOworCWlmIChyZXQpCisJCWdvdG8gZXJyOworCisJaWYgKChib3VuZCBe IHZtYS0+ZmxhZ3MpICYgSTkxNV9WTUFfR0xPQkFMX0JJTkQpCisJCV9faTkxNV92bWFfc2V0X21h cF9hbmRfZmVuY2VhYmxlKHZtYSk7CisKKwlHRU1fQlVHX09OKGk5MTVfdm1hX21pc3BsYWNlZCh2 bWEsIHNpemUsIGFsaWdubWVudCwgZmxhZ3MpKTsKKwlyZXR1cm4gMDsKKworZXJyOgorCV9faTkx NV92bWFfdW5waW4odm1hKTsKKwlyZXR1cm4gcmV0OworfQorCit2b2lkIGk5MTVfdm1hX2Rlc3Ry b3koc3RydWN0IGk5MTVfdm1hICp2bWEpCit7CisJR0VNX0JVR19PTih2bWEtPm5vZGUuYWxsb2Nh dGVkKTsKKwlHRU1fQlVHX09OKGk5MTVfdm1hX2lzX2FjdGl2ZSh2bWEpKTsKKwlHRU1fQlVHX09O KCFpOTE1X3ZtYV9pc19jbG9zZWQodm1hKSk7CisJR0VNX0JVR19PTih2bWEtPmZlbmNlKTsKKwor CWxpc3RfZGVsKCZ2bWEtPnZtX2xpbmspOworCWlmICghaTkxNV92bWFfaXNfZ2d0dCh2bWEpKQor CQlpOTE1X3BwZ3R0X3B1dChpOTE1X3ZtX3RvX3BwZ3R0KHZtYS0+dm0pKTsKKworCWttZW1fY2Fj aGVfZnJlZSh0b19pOTE1KHZtYS0+b2JqLT5iYXNlLmRldiktPnZtYXMsIHZtYSk7Cit9CisKK3Zv aWQgaTkxNV92bWFfY2xvc2Uoc3RydWN0IGk5MTVfdm1hICp2bWEpCit7CisJR0VNX0JVR19PTihp OTE1X3ZtYV9pc19jbG9zZWQodm1hKSk7CisJdm1hLT5mbGFncyB8PSBJOTE1X1ZNQV9DTE9TRUQ7 CisKKwlsaXN0X2RlbCgmdm1hLT5vYmpfbGluayk7CisJcmJfZXJhc2UoJnZtYS0+b2JqX25vZGUs ICZ2bWEtPm9iai0+dm1hX3RyZWUpOworCisJaWYgKCFpOTE1X3ZtYV9pc19hY3RpdmUodm1hKSAm JiAhaTkxNV92bWFfaXNfcGlubmVkKHZtYSkpCisJCVdBUk5fT04oaTkxNV92bWFfdW5iaW5kKHZt YSkpOworfQorCitzdGF0aWMgdm9pZCBfX2k5MTVfdm1hX2lvdW5tYXAoc3RydWN0IGk5MTVfdm1h ICp2bWEpCit7CisJR0VNX0JVR19PTihpOTE1X3ZtYV9pc19waW5uZWQodm1hKSk7CisKKwlpZiAo dm1hLT5pb21hcCA9PSBOVUxMKQorCQlyZXR1cm47CisKKwlpb19tYXBwaW5nX3VubWFwKHZtYS0+ aW9tYXApOworCXZtYS0+aW9tYXAgPSBOVUxMOworfQorCitpbnQgaTkxNV92bWFfdW5iaW5kKHN0 cnVjdCBpOTE1X3ZtYSAqdm1hKQoreworCXN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmog PSB2bWEtPm9iajsKKwl1bnNpZ25lZCBsb25nIGFjdGl2ZTsKKwlpbnQgcmV0OworCisJbG9ja2Rl cF9hc3NlcnRfaGVsZCgmb2JqLT5iYXNlLmRldi0+c3RydWN0X211dGV4KTsKKworCS8qIEZpcnN0 IHdhaXQgdXBvbiBhbnkgYWN0aXZpdHkgYXMgcmV0aXJpbmcgdGhlIHJlcXVlc3QgbWF5CisJICog aGF2ZSBzaWRlLWVmZmVjdHMgc3VjaCBhcyB1bnBpbm5pbmcgb3IgZXZlbiB1bmJpbmRpbmcgdGhp cyB2bWEuCisJICovCisJYWN0aXZlID0gaTkxNV92bWFfZ2V0X2FjdGl2ZSh2bWEpOworCWlmIChh Y3RpdmUpIHsKKwkJaW50IGlkeDsKKworCQkvKiBXaGVuIGEgY2xvc2VkIFZNQSBpcyByZXRpcmVk LCBpdCBpcyB1bmJvdW5kIC0gZWVrLgorCQkgKiBJbiBvcmRlciB0byBwcmV2ZW50IGl0IGZyb20g YmVpbmcgcmVjdXJzaXZlbHkgY2xvc2VkLAorCQkgKiB0YWtlIGEgcGluIG9uIHRoZSB2bWEgc28g dGhhdCB0aGUgc2Vjb25kIHVuYmluZCBpcworCQkgKiBhYm9ydGVkLgorCQkgKgorCQkgKiBFdmVu IG1vcmUgc2NhcnkgaXMgdGhhdCB0aGUgcmV0aXJlIGNhbGxiYWNrIG1heSBmcmVlCisJCSAqIHRo ZSBvYmplY3QgKGxhc3QgYWN0aXZlIHZtYSkuIFRvIHByZXZlbnQgdGhlIGV4cGxvc2lvbgorCQkg KiB3ZSBkZWZlciB0aGUgYWN0dWFsIG9iamVjdCBmcmVlIHRvIGEgd29ya2VyIHRoYXQgY2FuCisJ CSAqIG9ubHkgcHJvY2VlZCBvbmNlIGl0IGFjcXVpcmVzIHRoZSBzdHJ1Y3RfbXV0ZXggKHdoaWNo CisJCSAqIHdlIGN1cnJlbnRseSBob2xkLCB0aGVyZWZvcmUgaXQgY2Fubm90IGZyZWUgdGhpcyBv YmplY3QKKwkJICogYmVmb3JlIHdlIGFyZSBmaW5pc2hlZCkuCisJCSAqLworCQlfX2k5MTVfdm1h X3Bpbih2bWEpOworCisJCWZvcl9lYWNoX2FjdGl2ZShhY3RpdmUsIGlkeCkgeworCQkJcmV0ID0g aTkxNV9nZW1fYWN0aXZlX3JldGlyZSgmdm1hLT5sYXN0X3JlYWRbaWR4XSwKKwkJCQkJCSAgICZ2 bWEtPnZtLT5kZXYtPnN0cnVjdF9tdXRleCk7CisJCQlpZiAocmV0KQorCQkJCWJyZWFrOworCQl9 CisKKwkJX19pOTE1X3ZtYV91bnBpbih2bWEpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsK KworCQlHRU1fQlVHX09OKGk5MTVfdm1hX2lzX2FjdGl2ZSh2bWEpKTsKKwl9CisKKwlpZiAoaTkx NV92bWFfaXNfcGlubmVkKHZtYSkpCisJCXJldHVybiAtRUJVU1k7CisKKwlpZiAoIWRybV9tbV9u b2RlX2FsbG9jYXRlZCgmdm1hLT5ub2RlKSkKKwkJZ290byBkZXN0cm95OworCisJR0VNX0JVR19P TihvYmotPmJpbmRfY291bnQgPT0gMCk7CisJR0VNX0JVR19PTighaTkxNV9nZW1fb2JqZWN0X2hh c19waW5uZWRfcGFnZXMob2JqKSk7CisKKwlpZiAoaTkxNV92bWFfaXNfbWFwX2FuZF9mZW5jZWFi bGUodm1hKSkgeworCQkvKiByZWxlYXNlIHRoZSBmZW5jZSByZWcgX2FmdGVyXyBmbHVzaGluZyAq LworCQlyZXQgPSBpOTE1X3ZtYV9wdXRfZmVuY2Uodm1hKTsKKwkJaWYgKHJldCkKKwkJCXJldHVy biByZXQ7CisKKwkJLyogRm9yY2UgYSBwYWdlZmF1bHQgZm9yIGRvbWFpbiB0cmFja2luZyBvbiBu ZXh0IHVzZXIgYWNjZXNzICovCisJCWk5MTVfZ2VtX3JlbGVhc2VfbW1hcChvYmopOworCisJCV9f aTkxNV92bWFfaW91bm1hcCh2bWEpOworCQl2bWEtPmZsYWdzICY9IH5JOTE1X1ZNQV9DQU5fRkVO Q0U7CisJfQorCisJaWYgKGxpa2VseSghdm1hLT52bS0+Y2xvc2VkKSkgeworCQl0cmFjZV9pOTE1 X3ZtYV91bmJpbmQodm1hKTsKKwkJdm1hLT52bS0+dW5iaW5kX3ZtYSh2bWEpOworCX0KKwl2bWEt PmZsYWdzICY9IH4oSTkxNV9WTUFfR0xPQkFMX0JJTkQgfCBJOTE1X1ZNQV9MT0NBTF9CSU5EKTsK KworCWRybV9tbV9yZW1vdmVfbm9kZSgmdm1hLT5ub2RlKTsKKwlsaXN0X21vdmVfdGFpbCgmdm1h LT52bV9saW5rLCAmdm1hLT52bS0+dW5ib3VuZF9saXN0KTsKKworCWlmICh2bWEtPnBhZ2VzICE9 IG9iai0+bW0ucGFnZXMpIHsKKwkJR0VNX0JVR19PTighdm1hLT5wYWdlcyk7CisJCXNnX2ZyZWVf dGFibGUodm1hLT5wYWdlcyk7CisJCWtmcmVlKHZtYS0+cGFnZXMpOworCX0KKwl2bWEtPnBhZ2Vz ID0gTlVMTDsKKworCS8qIFNpbmNlIHRoZSB1bmJvdW5kIGxpc3QgaXMgZ2xvYmFsLCBvbmx5IG1v dmUgdG8gdGhhdCBsaXN0IGlmCisJICogbm8gbW9yZSBWTUFzIGV4aXN0LiAqLworCWlmICgtLW9i ai0+YmluZF9jb3VudCA9PSAwKQorCQlsaXN0X21vdmVfdGFpbCgmb2JqLT5nbG9iYWxfbGluaywK KwkJCSAgICAgICAmdG9faTkxNShvYmotPmJhc2UuZGV2KS0+bW0udW5ib3VuZF9saXN0KTsKKwor CS8qIEFuZCBmaW5hbGx5IG5vdyB0aGUgb2JqZWN0IGlzIGNvbXBsZXRlbHkgZGVjb3VwbGVkIGZy b20gdGhpcyB2bWEsCisJICogd2UgY2FuIGRyb3AgaXRzIGhvbGQgb24gdGhlIGJhY2tpbmcgc3Rv cmFnZSBhbmQgYWxsb3cgaXQgdG8gYmUKKwkgKiByZWFwZWQgYnkgdGhlIHNocmlua2VyLgorCSAq LworCWk5MTVfZ2VtX29iamVjdF91bnBpbl9wYWdlcyhvYmopOworCitkZXN0cm95OgorCWlmICh1 bmxpa2VseShpOTE1X3ZtYV9pc19jbG9zZWQodm1hKSkpCisJCWk5MTVfdm1hX2Rlc3Ryb3kodm1h KTsKKworCXJldHVybiAwOworfQorCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9p OTE1X3ZtYS5oIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV92bWEuaApuZXcgZmlsZSBtb2Rl IDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMjliM2ZlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVy cy9ncHUvZHJtL2k5MTUvaTkxNV92bWEuaApAQCAtMCwwICsxLDM0MiBAQAorLyoKKyAqIENvcHly aWdodCDCqSAyMDE2IEludGVsIENvcnBvcmF0aW9uCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJl YnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAq IGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVz ICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJl c3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRv IHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5z ZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQg cGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBz dWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29w eXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBu ZXh0CisgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vi c3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCisgKiBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdB UkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQ UkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FS UkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIg UFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBB VVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1B R0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRS QUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogRlJPTSwgT1VUIE9GIE9SIElOIENP Tk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUwor ICogSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqLworCisjaWZuZGVmIF9fSTkxNV9WTUFfSF9fCisj ZGVmaW5lIF9fSTkxNV9WTUFfSF9fCisKKyNpbmNsdWRlIDxsaW51eC9pby1tYXBwaW5nLmg+CisK KyNpbmNsdWRlIDxkcm0vZHJtX21tLmg+CisKKyNpbmNsdWRlICJpOTE1X2dlbV9ndHQuaCIKKyNp bmNsdWRlICJpOTE1X2dlbV9mZW5jZV9yZWcuaCIKKyNpbmNsdWRlICJpOTE1X2dlbV9vYmplY3Qu aCIKKyNpbmNsdWRlICJpOTE1X2dlbV9yZXF1ZXN0LmgiCisKKworZW51bSBpOTE1X2NhY2hlX2xl dmVsOworCisvKioKKyAqIEEgVk1BIHJlcHJlc2VudHMgYSBHRU0gQk8gdGhhdCBpcyBib3VuZCBp bnRvIGFuIGFkZHJlc3Mgc3BhY2UuIFRoZXJlZm9yZSwgYQorICogVk1BJ3MgcHJlc2VuY2UgY2Fu bm90IGJlIGd1YXJhbnRlZWQgYmVmb3JlIGJpbmRpbmcsIG9yIGFmdGVyIHVuYmluZGluZyB0aGUK KyAqIG9iamVjdCBpbnRvL2Zyb20gdGhlIGFkZHJlc3Mgc3BhY2UuCisgKgorICogVG8gbWFrZSB0 aGluZ3MgYXMgc2ltcGxlIGFzIHBvc3NpYmxlIChpZS4gbm8gcmVmY291bnRpbmcpLCBhIFZNQSdz IGxpZmV0aW1lCisgKiB3aWxsIGFsd2F5cyBiZSA8PSBhbiBvYmplY3RzIGxpZmV0aW1lLiBTbyBv YmplY3QgcmVmY291bnRpbmcgc2hvdWxkIGNvdmVyIHVzLgorICovCitzdHJ1Y3QgaTkxNV92bWEg eworCXN0cnVjdCBkcm1fbW1fbm9kZSBub2RlOworCXN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0 ICpvYmo7CisJc3RydWN0IGk5MTVfYWRkcmVzc19zcGFjZSAqdm07CisJc3RydWN0IGRybV9pOTE1 X2ZlbmNlX3JlZyAqZmVuY2U7CisJc3RydWN0IHNnX3RhYmxlICpwYWdlczsKKwl2b2lkIF9faW9t ZW0gKmlvbWFwOworCXU2NCBzaXplOworCXU2NCBkaXNwbGF5X2FsaWdubWVudDsKKworCXVuc2ln bmVkIGludCBmbGFnczsKKwkvKioKKwkgKiBIb3cgbWFueSB1c2VycyBoYXZlIHBpbm5lZCB0aGlz IG9iamVjdCBpbiBHVFQgc3BhY2UuIFRoZSBmb2xsb3dpbmcKKwkgKiB1c2VycyBjYW4gZWFjaCBo b2xkIGF0IG1vc3Qgb25lIHJlZmVyZW5jZTogcHdyaXRlL3ByZWFkLCBleGVjYnVmZmVyCisJICog KG9iamVjdHMgYXJlIG5vdCBhbGxvd2VkIG11bHRpcGxlIHRpbWVzIGZvciB0aGUgc2FtZSBiYXRj aGJ1ZmZlciksCisJICogYW5kIHRoZSBmcmFtZWJ1ZmZlciBjb2RlLiBXaGVuIHN3aXRjaGluZy9w YWdlZmxpcHBpbmcsIHRoZQorCSAqIGZyYW1lYnVmZmVyIGNvZGUgaGFzIGF0IG1vc3QgdHdvIGJ1 ZmZlcnMgcGlubmVkIHBlciBjcnRjLgorCSAqCisJICogSW4gdGhlIHdvcnN0IGNhc2UgdGhpcyBp cyAxICsgMSArIDEgKyAyKjIgPSA3LiBUaGF0IHdvdWxkIGZpdCBpbnRvIDMKKwkgKiBiaXRzIHdp dGggYWJzb2x1dGVseSBubyBoZWFkcm9vbS4gU28gdXNlIDQgYml0cy4KKwkgKi8KKyNkZWZpbmUg STkxNV9WTUFfUElOX01BU0sgMHhmCisjZGVmaW5lIEk5MTVfVk1BX1BJTl9PVkVSRkxPVwlCSVQo NSkKKworCS8qKiBGbGFncyBhbmQgYWRkcmVzcyBzcGFjZSB0aGlzIFZNQSBpcyBib3VuZCB0byAq LworI2RlZmluZSBJOTE1X1ZNQV9HTE9CQUxfQklORAlCSVQoNikKKyNkZWZpbmUgSTkxNV9WTUFf TE9DQUxfQklORAlCSVQoNykKKyNkZWZpbmUgSTkxNV9WTUFfQklORF9NQVNLIChJOTE1X1ZNQV9H TE9CQUxfQklORCB8IEk5MTVfVk1BX0xPQ0FMX0JJTkQgfCBJOTE1X1ZNQV9QSU5fT1ZFUkZMT1cp CisKKyNkZWZpbmUgSTkxNV9WTUFfR0dUVAkJQklUKDgpCisjZGVmaW5lIEk5MTVfVk1BX0NBTl9G RU5DRQlCSVQoOSkKKyNkZWZpbmUgSTkxNV9WTUFfQ0xPU0VECQlCSVQoMTApCisKKwl1bnNpZ25l ZCBpbnQgYWN0aXZlOworCXN0cnVjdCBpOTE1X2dlbV9hY3RpdmUgbGFzdF9yZWFkW0k5MTVfTlVN X0VOR0lORVNdOworCXN0cnVjdCBpOTE1X2dlbV9hY3RpdmUgbGFzdF93cml0ZTsKKwlzdHJ1Y3Qg aTkxNV9nZW1fYWN0aXZlIGxhc3RfZmVuY2U7CisKKwkvKioKKwkgKiBTdXBwb3J0IGRpZmZlcmVu dCBHR1RUIHZpZXdzIGludG8gdGhlIHNhbWUgb2JqZWN0LgorCSAqIFRoaXMgbWVhbnMgdGhlcmUg Y2FuIGJlIG11bHRpcGxlIFZNQSBtYXBwaW5ncyBwZXIgb2JqZWN0IGFuZCBwZXIgVk0uCisJICog aTkxNV9nZ3R0X3ZpZXdfdHlwZSBpcyB1c2VkIHRvIGRpc3Rpbmd1aXNoIGJldHdlZW4gdGhvc2Ug ZW50cmllcy4KKwkgKiBUaGUgZGVmYXVsdCBvbmUgb2YgemVybyAoSTkxNV9HR1RUX1ZJRVdfTk9S TUFMKSBpcyBkZWZhdWx0IGFuZCBhbHNvCisJICogYXNzdW1lZCBpbiBHRU0gZnVuY3Rpb25zIHdo aWNoIHRha2Ugbm8gZ2d0dCB2aWV3IHBhcmFtZXRlci4KKwkgKi8KKwlzdHJ1Y3QgaTkxNV9nZ3R0 X3ZpZXcgZ2d0dF92aWV3OworCisJLyoqIFRoaXMgb2JqZWN0J3MgcGxhY2Ugb24gdGhlIGFjdGl2 ZS9pbmFjdGl2ZSBsaXN0cyAqLworCXN0cnVjdCBsaXN0X2hlYWQgdm1fbGluazsKKworCXN0cnVj dCBsaXN0X2hlYWQgb2JqX2xpbms7IC8qIExpbmsgaW4gdGhlIG9iamVjdCdzIFZNQSBsaXN0ICov CisJc3RydWN0IHJiX25vZGUgb2JqX25vZGU7CisKKwkvKiogVGhpcyB2bWEncyBwbGFjZSBpbiB0 aGUgYmF0Y2hidWZmZXIgb3Igb24gdGhlIGV2aWN0aW9uIGxpc3QgKi8KKwlzdHJ1Y3QgbGlzdF9o ZWFkIGV4ZWNfbGlzdDsKKworCS8qKgorCSAqIFVzZWQgZm9yIHBlcmZvcm1pbmcgcmVsb2NhdGlv bnMgZHVyaW5nIGV4ZWNidWZmZXIgaW5zZXJ0aW9uLgorCSAqLworCXN0cnVjdCBobGlzdF9ub2Rl IGV4ZWNfbm9kZTsKKwl1bnNpZ25lZCBsb25nIGV4ZWNfaGFuZGxlOworCXN0cnVjdCBkcm1faTkx NV9nZW1fZXhlY19vYmplY3QyICpleGVjX2VudHJ5OworfTsKKworc3RydWN0IGk5MTVfdm1hICoK K2k5MTVfdm1hX2NyZWF0ZShzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqLAorCQlzdHJ1 Y3QgaTkxNV9hZGRyZXNzX3NwYWNlICp2bSwKKwkJY29uc3Qgc3RydWN0IGk5MTVfZ2d0dF92aWV3 ICp2aWV3KTsKKwordm9pZCBpOTE1X3ZtYV91bnBpbl9hbmRfcmVsZWFzZShzdHJ1Y3QgaTkxNV92 bWEgKipwX3ZtYSk7CisKK3N0YXRpYyBpbmxpbmUgYm9vbCBpOTE1X3ZtYV9pc19nZ3R0KGNvbnN0 IHN0cnVjdCBpOTE1X3ZtYSAqdm1hKQoreworCXJldHVybiB2bWEtPmZsYWdzICYgSTkxNV9WTUFf R0dUVDsKK30KKworc3RhdGljIGlubGluZSBib29sIGk5MTVfdm1hX2lzX21hcF9hbmRfZmVuY2Vh YmxlKGNvbnN0IHN0cnVjdCBpOTE1X3ZtYSAqdm1hKQoreworCXJldHVybiB2bWEtPmZsYWdzICYg STkxNV9WTUFfQ0FOX0ZFTkNFOworfQorCitzdGF0aWMgaW5saW5lIGJvb2wgaTkxNV92bWFfaXNf Y2xvc2VkKGNvbnN0IHN0cnVjdCBpOTE1X3ZtYSAqdm1hKQoreworCXJldHVybiB2bWEtPmZsYWdz ICYgSTkxNV9WTUFfQ0xPU0VEOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBpOTE1 X3ZtYV9nZXRfYWN0aXZlKGNvbnN0IHN0cnVjdCBpOTE1X3ZtYSAqdm1hKQoreworCXJldHVybiB2 bWEtPmFjdGl2ZTsKK30KKworc3RhdGljIGlubGluZSBib29sIGk5MTVfdm1hX2lzX2FjdGl2ZShj b25zdCBzdHJ1Y3QgaTkxNV92bWEgKnZtYSkKK3sKKwlyZXR1cm4gaTkxNV92bWFfZ2V0X2FjdGl2 ZSh2bWEpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgaTkxNV92bWFfc2V0X2FjdGl2ZShzdHJ1 Y3QgaTkxNV92bWEgKnZtYSwKKwkJCQkgICAgICAgdW5zaWduZWQgaW50IGVuZ2luZSkKK3sKKwl2 bWEtPmFjdGl2ZSB8PSBCSVQoZW5naW5lKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGk5MTVf dm1hX2NsZWFyX2FjdGl2ZShzdHJ1Y3QgaTkxNV92bWEgKnZtYSwKKwkJCQkJIHVuc2lnbmVkIGlu dCBlbmdpbmUpCit7CisJdm1hLT5hY3RpdmUgJj0gfkJJVChlbmdpbmUpOworfQorCitzdGF0aWMg aW5saW5lIGJvb2wgaTkxNV92bWFfaGFzX2FjdGl2ZV9lbmdpbmUoY29uc3Qgc3RydWN0IGk5MTVf dm1hICp2bWEsCisJCQkJCSAgICAgIHVuc2lnbmVkIGludCBlbmdpbmUpCit7CisJcmV0dXJuIHZt YS0+YWN0aXZlICYgQklUKGVuZ2luZSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyIGk5MTVfZ2d0 dF9vZmZzZXQoY29uc3Qgc3RydWN0IGk5MTVfdm1hICp2bWEpCit7CisJR0VNX0JVR19PTighaTkx NV92bWFfaXNfZ2d0dCh2bWEpKTsKKwlHRU1fQlVHX09OKCF2bWEtPm5vZGUuYWxsb2NhdGVkKTsK KwlHRU1fQlVHX09OKHVwcGVyXzMyX2JpdHModm1hLT5ub2RlLnN0YXJ0KSk7CisJR0VNX0JVR19P Tih1cHBlcl8zMl9iaXRzKHZtYS0+bm9kZS5zdGFydCArIHZtYS0+bm9kZS5zaXplIC0gMSkpOwor CXJldHVybiBsb3dlcl8zMl9iaXRzKHZtYS0+bm9kZS5zdGFydCk7Cit9CisKK3N0YXRpYyBpbmxp bmUgc3RydWN0IGk5MTVfdm1hICppOTE1X3ZtYV9nZXQoc3RydWN0IGk5MTVfdm1hICp2bWEpCit7 CisJaTkxNV9nZW1fb2JqZWN0X2dldCh2bWEtPm9iaik7CisJcmV0dXJuIHZtYTsKK30KKworc3Rh dGljIGlubGluZSB2b2lkIGk5MTVfdm1hX3B1dChzdHJ1Y3QgaTkxNV92bWEgKnZtYSkKK3sKKwlp OTE1X2dlbV9vYmplY3RfcHV0KHZtYS0+b2JqKTsKK30KKworc3RhdGljIGlubGluZSBsb25nCitp OTE1X3ZtYV9jb21wYXJlKHN0cnVjdCBpOTE1X3ZtYSAqdm1hLAorCQkgc3RydWN0IGk5MTVfYWRk cmVzc19zcGFjZSAqdm0sCisJCSBjb25zdCBzdHJ1Y3QgaTkxNV9nZ3R0X3ZpZXcgKnZpZXcpCit7 CisJR0VNX0JVR19PTih2aWV3ICYmICFpOTE1X3ZtYV9pc19nZ3R0KHZtYSkpOworCisJaWYgKHZt YS0+dm0gIT0gdm0pCisJCXJldHVybiB2bWEtPnZtIC0gdm07CisKKwlpZiAoIXZpZXcpCisJCXJl dHVybiB2bWEtPmdndHRfdmlldy50eXBlOworCisJaWYgKHZtYS0+Z2d0dF92aWV3LnR5cGUgIT0g dmlldy0+dHlwZSkKKwkJcmV0dXJuIHZtYS0+Z2d0dF92aWV3LnR5cGUgLSB2aWV3LT50eXBlOwor CisJcmV0dXJuIG1lbWNtcCgmdm1hLT5nZ3R0X3ZpZXcucGFyYW1zLAorCQkgICAgICAmdmlldy0+ cGFyYW1zLAorCQkgICAgICBzaXplb2Yodmlldy0+cGFyYW1zKSk7Cit9CisKK2ludCBpOTE1X3Zt YV9iaW5kKHN0cnVjdCBpOTE1X3ZtYSAqdm1hLCBlbnVtIGk5MTVfY2FjaGVfbGV2ZWwgY2FjaGVf bGV2ZWwsCisJCSAgdTMyIGZsYWdzKTsKK2Jvb2wgaTkxNV9nZW1fdmFsaWRfZ3R0X3NwYWNlKHN0 cnVjdCBpOTE1X3ZtYSAqdm1hLCB1bnNpZ25lZCBsb25nIGNhY2hlX2xldmVsKTsKK2Jvb2wKK2k5 MTVfdm1hX21pc3BsYWNlZChzdHJ1Y3QgaTkxNV92bWEgKnZtYSwgdTY0IHNpemUsIHU2NCBhbGln bm1lbnQsIHU2NCBmbGFncyk7Cit2b2lkIF9faTkxNV92bWFfc2V0X21hcF9hbmRfZmVuY2VhYmxl KHN0cnVjdCBpOTE1X3ZtYSAqdm1hKTsKK2ludCBfX211c3RfY2hlY2sgaTkxNV92bWFfdW5iaW5k KHN0cnVjdCBpOTE1X3ZtYSAqdm1hKTsKK3ZvaWQgaTkxNV92bWFfY2xvc2Uoc3RydWN0IGk5MTVf dm1hICp2bWEpOwordm9pZCBpOTE1X3ZtYV9kZXN0cm95KHN0cnVjdCBpOTE1X3ZtYSAqdm1hKTsK KworaW50IF9faTkxNV92bWFfZG9fcGluKHN0cnVjdCBpOTE1X3ZtYSAqdm1hLAorCQkgICAgICB1 NjQgc2l6ZSwgdTY0IGFsaWdubWVudCwgdTY0IGZsYWdzKTsKK3N0YXRpYyBpbmxpbmUgaW50IF9f bXVzdF9jaGVjaworaTkxNV92bWFfcGluKHN0cnVjdCBpOTE1X3ZtYSAqdm1hLCB1NjQgc2l6ZSwg dTY0IGFsaWdubWVudCwgdTY0IGZsYWdzKQoreworCUJVSUxEX0JVR19PTihQSU5fTUJaICE9IEk5 MTVfVk1BX1BJTl9PVkVSRkxPVyk7CisJQlVJTERfQlVHX09OKFBJTl9HTE9CQUwgIT0gSTkxNV9W TUFfR0xPQkFMX0JJTkQpOworCUJVSUxEX0JVR19PTihQSU5fVVNFUiAhPSBJOTE1X1ZNQV9MT0NB TF9CSU5EKTsKKworCS8qIFBpbiBlYXJseSB0byBwcmV2ZW50IHRoZSBzaHJpbmtlci9ldmljdGlv biBsb2dpYyBmcm9tIGRlc3Ryb3lpbmcKKwkgKiBvdXIgdm1hIGFzIHdlIGluc2VydCBhbmQgYmlu ZC4KKwkgKi8KKwlpZiAobGlrZWx5KCgoKyt2bWEtPmZsYWdzIF4gZmxhZ3MpICYgSTkxNV9WTUFf QklORF9NQVNLKSA9PSAwKSkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gX19pOTE1X3ZtYV9kb19w aW4odm1hLCBzaXplLCBhbGlnbm1lbnQsIGZsYWdzKTsKK30KKworc3RhdGljIGlubGluZSBpbnQg aTkxNV92bWFfcGluX2NvdW50KGNvbnN0IHN0cnVjdCBpOTE1X3ZtYSAqdm1hKQoreworCXJldHVy biB2bWEtPmZsYWdzICYgSTkxNV9WTUFfUElOX01BU0s7Cit9CisKK3N0YXRpYyBpbmxpbmUgYm9v bCBpOTE1X3ZtYV9pc19waW5uZWQoY29uc3Qgc3RydWN0IGk5MTVfdm1hICp2bWEpCit7CisJcmV0 dXJuIGk5MTVfdm1hX3Bpbl9jb3VudCh2bWEpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgX19p OTE1X3ZtYV9waW4oc3RydWN0IGk5MTVfdm1hICp2bWEpCit7CisJdm1hLT5mbGFncysrOworCUdF TV9CVUdfT04odm1hLT5mbGFncyAmIEk5MTVfVk1BX1BJTl9PVkVSRkxPVyk7Cit9CisKK3N0YXRp YyBpbmxpbmUgdm9pZCBfX2k5MTVfdm1hX3VucGluKHN0cnVjdCBpOTE1X3ZtYSAqdm1hKQorewor CUdFTV9CVUdfT04oIWk5MTVfdm1hX2lzX3Bpbm5lZCh2bWEpKTsKKwl2bWEtPmZsYWdzLS07Cit9 CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBpOTE1X3ZtYV91bnBpbihzdHJ1Y3QgaTkxNV92bWEgKnZt YSkKK3sKKwlHRU1fQlVHX09OKCFkcm1fbW1fbm9kZV9hbGxvY2F0ZWQoJnZtYS0+bm9kZSkpOwor CV9faTkxNV92bWFfdW5waW4odm1hKTsKK30KKworLyoqCisgKiBpOTE1X3ZtYV9waW5faW9tYXAg LSBjYWxscyBpb3JlbWFwX3djIHRvIG1hcCB0aGUgR0dUVCBWTUEgdmlhIHRoZSBhcGVydHVyZQor ICogQHZtYTogVk1BIHRvIGlvbWFwCisgKgorICogVGhlIHBhc3NlZCBpbiBWTUEgaGFzIHRvIGJl IHBpbm5lZCBpbiB0aGUgZ2xvYmFsIEdUVCBtYXBwYWJsZSByZWdpb24uCisgKiBBbiBleHRyYSBw aW5uaW5nIG9mIHRoZSBWTUEgaXMgYWNxdWlyZWQgZm9yIHRoZSByZXR1cm4gaW9tYXBwaW5nLAor ICogdGhlIGNhbGxlciBtdXN0IGNhbGwgaTkxNV92bWFfdW5waW5faW9tYXAgdG8gcmVsaW5xdWlz aCB0aGUgcGlubmluZworICogYWZ0ZXIgdGhlIGlvbWFwcGluZyBpcyBubyBsb25nZXIgcmVxdWly ZWQuCisgKgorICogQ2FsbGVycyBtdXN0IGhvbGQgdGhlIHN0cnVjdF9tdXRleC4KKyAqCisgKiBS ZXR1cm5zIGEgdmFsaWQgaW9tYXBwZWQgcG9pbnRlciBvciBFUlJfUFRSLgorICovCit2b2lkIF9f aW9tZW0gKmk5MTVfdm1hX3Bpbl9pb21hcChzdHJ1Y3QgaTkxNV92bWEgKnZtYSk7CisjZGVmaW5l IElPX0VSUl9QVFIoeCkgKCh2b2lkIF9faW9tZW0gKilFUlJfUFRSKHgpKQorCisvKioKKyAqIGk5 MTVfdm1hX3VucGluX2lvbWFwIC0gdW5waW5zIHRoZSBtYXBwaW5nIHJldHVybmVkIGZyb20gaTkx NV92bWFfaW9tYXAKKyAqIEB2bWE6IFZNQSB0byB1bnBpbgorICoKKyAqIFVucGlucyB0aGUgcHJl dmlvdXNseSBpb21hcHBlZCBWTUEgZnJvbSBpOTE1X3ZtYV9waW5faW9tYXAoKS4KKyAqCisgKiBD YWxsZXJzIG11c3QgaG9sZCB0aGUgc3RydWN0X211dGV4LiBUaGlzIGZ1bmN0aW9uIGlzIG9ubHkg dmFsaWQgdG8gYmUKKyAqIGNhbGxlZCBvbiBhIFZNQSBwcmV2aW91c2x5IGlvbWFwcGVkIGJ5IHRo ZSBjYWxsZXIgd2l0aCBpOTE1X3ZtYV9waW5faW9tYXAoKS4KKyAqLworc3RhdGljIGlubGluZSB2 b2lkIGk5MTVfdm1hX3VucGluX2lvbWFwKHN0cnVjdCBpOTE1X3ZtYSAqdm1hKQoreworCWxvY2tk ZXBfYXNzZXJ0X2hlbGQoJnZtYS0+dm0tPmRldi0+c3RydWN0X211dGV4KTsKKwlHRU1fQlVHX09O KHZtYS0+aW9tYXAgPT0gTlVMTCk7CisJaTkxNV92bWFfdW5waW4odm1hKTsKK30KKworc3RhdGlj IGlubGluZSBzdHJ1Y3QgcGFnZSAqaTkxNV92bWFfZmlyc3RfcGFnZShzdHJ1Y3QgaTkxNV92bWEg KnZtYSkKK3sKKwlHRU1fQlVHX09OKCF2bWEtPnBhZ2VzKTsKKwlyZXR1cm4gc2dfcGFnZSh2bWEt PnBhZ2VzLT5zZ2wpOworfQorCisvKioKKyAqIGk5MTVfdm1hX3Bpbl9mZW5jZSAtIHBpbiBmZW5j aW5nIHN0YXRlCisgKiBAdm1hOiB2bWEgdG8gcGluIGZlbmNpbmcgZm9yCisgKgorICogVGhpcyBw aW5zIHRoZSBmZW5jaW5nIHN0YXRlICh3aGV0aGVyIHRpbGVkIG9yIHVudGlsZWQpIHRvIG1ha2Ug c3VyZSB0aGUKKyAqIHZtYSAoYW5kIGl0cyBvYmplY3QpIGlzIHJlYWR5IHRvIGJlIHVzZWQgYXMg YSBzY2Fub3V0IHRhcmdldC4gRmVuY2luZworICogc3RhdHVzIG11c3QgYmUgc3luY2hyb25pemUg Zmlyc3QgYnkgY2FsbGluZyBpOTE1X3ZtYV9nZXRfZmVuY2UoKToKKyAqCisgKiBUaGUgcmVzdWx0 aW5nIGZlbmNlIHBpbiByZWZlcmVuY2UgbXVzdCBiZSByZWxlYXNlZCBhZ2FpbiB3aXRoCisgKiBp OTE1X3ZtYV91bnBpbl9mZW5jZSgpLgorICoKKyAqIFJldHVybnM6CisgKgorICogVHJ1ZSBpZiB0 aGUgdm1hIGhhcyBhIGZlbmNlLCBmYWxzZSBvdGhlcndpc2UuCisgKi8KK3N0YXRpYyBpbmxpbmUg Ym9vbAoraTkxNV92bWFfcGluX2ZlbmNlKHN0cnVjdCBpOTE1X3ZtYSAqdm1hKQoreworCWxvY2tk ZXBfYXNzZXJ0X2hlbGQoJnZtYS0+dm0tPmRldi0+c3RydWN0X211dGV4KTsKKwlpZiAodm1hLT5m ZW5jZSkgeworCQl2bWEtPmZlbmNlLT5waW5fY291bnQrKzsKKwkJcmV0dXJuIHRydWU7CisJfSBl bHNlCisJCXJldHVybiBmYWxzZTsKK30KKworLyoqCisgKiBpOTE1X3ZtYV91bnBpbl9mZW5jZSAt IHVucGluIGZlbmNpbmcgc3RhdGUKKyAqIEB2bWE6IHZtYSB0byB1bnBpbiBmZW5jaW5nIGZvcgor ICoKKyAqIFRoaXMgcmVsZWFzZXMgdGhlIGZlbmNlIHBpbiByZWZlcmVuY2UgYWNxdWlyZWQgdGhy b3VnaAorICogaTkxNV92bWFfcGluX2ZlbmNlLiBJdCB3aWxsIGhhbmRsZSBib3RoIG9iamVjdHMg d2l0aCBhbmQgd2l0aG91dCBhbgorICogYXR0YWNoZWQgZmVuY2UgY29ycmVjdGx5LCBjYWxsZXJz IGRvIG5vdCBuZWVkIHRvIGRpc3Rpbmd1aXNoIHRoaXMuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9p ZAoraTkxNV92bWFfdW5waW5fZmVuY2Uoc3RydWN0IGk5MTVfdm1hICp2bWEpCit7CisJbG9ja2Rl cF9hc3NlcnRfaGVsZCgmdm1hLT52bS0+ZGV2LT5zdHJ1Y3RfbXV0ZXgpOworCWlmICh2bWEtPmZl bmNlKSB7CisJCUdFTV9CVUdfT04odm1hLT5mZW5jZS0+cGluX2NvdW50IDw9IDApOworCQl2bWEt PmZlbmNlLT5waW5fY291bnQtLTsKKwl9Cit9CisKKyNlbmRpZgorCi0tIAoyLjcuNAoKX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KSW50ZWwtZ2Z4IG1haWxp bmcgbGlzdApJbnRlbC1nZnhAbGlzdHMuZnJlZWRlc2t0b3Aub3JnCmh0dHBzOi8vbGlzdHMuZnJl ZWRlc2t0b3Aub3JnL21haWxtYW4vbGlzdGluZm8vaW50ZWwtZ2Z4Cg==