From mboxrd@z Thu Jan 1 00:00:00 1970 From: Chris Wilson Subject: [PATCH 34/43] drm/i915: Move mmap and friends to its own file Date: Wed, 6 Mar 2019 14:25:08 +0000 Message-ID: <20190306142517.22558-35-chris@chris-wilson.co.uk> References: <20190306142517.22558-1-chris@chris-wilson.co.uk> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from fireflyinternet.com (mail.fireflyinternet.com [109.228.58.192]) by gabe.freedesktop.org (Postfix) with ESMTPS id 25D4F6E099 for ; Wed, 6 Mar 2019 14:25:45 +0000 (UTC) In-Reply-To: <20190306142517.22558-1-chris@chris-wilson.co.uk> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: intel-gfx-bounces@lists.freedesktop.org Sender: "Intel-gfx" To: intel-gfx@lists.freedesktop.org Cc: matthew.auld@intel.com List-Id: intel-gfx@lists.freedesktop.org Q29udGludWluZyB0aGUgZGVjbHV0dGVyaW5nIG9mIGk5MTVfZ2VtLmMKClNpZ25lZC1vZmYtYnk6 IENocmlzIFdpbHNvbiA8Y2hyaXNAY2hyaXMtd2lsc29uLmNvLnVrPgotLS0KIGRyaXZlcnMvZ3B1 L2RybS9pOTE1L01ha2VmaWxlICAgICAgICAgICAgICAgICB8ICAgMSArCiBkcml2ZXJzL2dwdS9k cm0vaTkxNS9nZW0vaTkxNV9nZW1fbW1hbi5jICAgICAgfCA1MTQgKysrKysrKysrKysrKysrKwog ZHJpdmVycy9ncHUvZHJtL2k5MTUvZ2VtL2k5MTVfZ2VtX29iamVjdC5jICAgIHwgIDU2ICsrCiBk cml2ZXJzL2dwdS9kcm0vaTkxNS9nZW0vaTkxNV9nZW1fb2JqZWN0LmggICAgfCAgIDcgKwogLi4u L2RybS9pOTE1L2dlbS9zZWxmdGVzdHMvaTkxNV9nZW1fbW1hbi5jICAgIHwgNTA3ICsrKysrKysr KysrKysrKysKIGRyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZHJ2LmggICAgICAgICAgICAgICB8 ICAgMSAtCiBkcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2dlbS5jICAgICAgICAgICAgICAgfCA1 NzAgKy0tLS0tLS0tLS0tLS0tLS0tCiBkcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2dlbV90aWxp bmcuYyAgICAgICAgfCAgIDIgKy0KIC4uLi9ncHUvZHJtL2k5MTUvc2VsZnRlc3RzL2k5MTVfZ2Vt X29iamVjdC5jICB8IDQ4OSAtLS0tLS0tLS0tLS0tLS0KIC4uLi9kcm0vaTkxNS9zZWxmdGVzdHMv aTkxNV9saXZlX3NlbGZ0ZXN0cy5oICB8ICAgMSArCiAxMCBmaWxlcyBjaGFuZ2VkLCAxMTAxIGlu c2VydGlvbnMoKyksIDEwNDcgZGVsZXRpb25zKC0pCiBjcmVhdGUgbW9kZSAxMDA2NDQgZHJpdmVy cy9ncHUvZHJtL2k5MTUvZ2VtL2k5MTVfZ2VtX21tYW4uYwogY3JlYXRlIG1vZGUgMTAwNjQ0IGRy aXZlcnMvZ3B1L2RybS9pOTE1L2dlbS9zZWxmdGVzdHMvaTkxNV9nZW1fbW1hbi5jCgpkaWZmIC0t Z2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvTWFrZWZpbGUgYi9kcml2ZXJzL2dwdS9kcm0vaTkx NS9NYWtlZmlsZQppbmRleCA4ZTZlZjU0ZjI0OTcuLmMyODA0ZWZlNGU1YSAxMDA2NDQKLS0tIGEv ZHJpdmVycy9ncHUvZHJtL2k5MTUvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUv TWFrZWZpbGUKQEAgLTcyLDYgKzcyLDcgQEAgaTkxNS0kKENPTkZJR19EUk1fSTkxNV9XRVJST1Ip ICs9IFwKICMgR0VNIGNvZGUKIGk5MTUteSArPSBcCiAJICBnZW0vaTkxNV9nZW1fb2JqZWN0Lm8g XAorCSAgZ2VtL2k5MTVfZ2VtX21tYW4ubyBcCiAJICBnZW0vaTkxNV9nZW1fcGFnZXMubyBcCiAJ ICBnZW0vaTkxNV9nZW1fcGh5cy5vIFwKIAkgIGdlbS9pOTE1X2dlbV9zaG1lbS5vIFwKZGlmZiAt LWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2dlbS9pOTE1X2dlbV9tbWFuLmMgYi9kcml2ZXJz L2dwdS9kcm0vaTkxNS9nZW0vaTkxNV9nZW1fbW1hbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0Cmlu ZGV4IDAwMDAwMDAwMDAwMC4uOTJhMmI5Y2Q4NzljCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVy cy9ncHUvZHJtL2k5MTUvZ2VtL2k5MTVfZ2VtX21tYW4uYwpAQCAtMCwwICsxLDUxNCBAQAorLyoK KyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBNSVQKKyAqCisgKiBDb3B5cmlnaHQgwqkgMjAx NC0yMDE2IEludGVsIENvcnBvcmF0aW9uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21tYW4uaD4K KyNpbmNsdWRlIDxsaW51eC9zaXplcy5oPgorCisjaW5jbHVkZSAiaTkxNV9nZW1faW9jdGxzLmgi CisjaW5jbHVkZSAiaTkxNV9nZW1fb2JqZWN0LmgiCisKKyNpbmNsdWRlICIuLi9pOTE1X2dlbV9n dHQuaCIKKyNpbmNsdWRlICIuLi9pOTE1X3ZtYS5oIgorI2luY2x1ZGUgIi4uL2k5MTVfZHJ2Lmgi CisjaW5jbHVkZSAiLi4vaW50ZWxfZHJ2LmgiCisKK3N0YXRpYyBpbmxpbmUgYm9vbAorX192bWFf bWF0Y2hlcyhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgc3RydWN0IGZpbGUgKmZpbHAsCisJ ICAgICAgdW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBsb25nIHNpemUpCit7CisJaWYgKHZt YS0+dm1fZmlsZSAhPSBmaWxwKQorCQlyZXR1cm4gZmFsc2U7CisKKwlyZXR1cm4gdm1hLT52bV9z dGFydCA9PSBhZGRyICYmCisJICAgICAgICh2bWEtPnZtX2VuZCAtIHZtYS0+dm1fc3RhcnQpID09 IFBBR0VfQUxJR04oc2l6ZSk7Cit9CisKKy8qKgorICogaTkxNV9nZW1fbW1hcF9pb2N0bCAtIE1h cHMgdGhlIGNvbnRlbnRzIG9mIGFuIG9iamVjdCwgcmV0dXJuaW5nIHRoZSBhZGRyZXNzCisgKgkJ CSBpdCBpcyBtYXBwZWQgdG8uCisgKiBAZGV2OiBkcm0gZGV2aWNlCisgKiBAZGF0YTogaW9jdGwg ZGF0YSBibG9iCisgKiBAZmlsZTogZHJtIGZpbGUKKyAqCisgKiBXaGlsZSB0aGUgbWFwcGluZyBo b2xkcyBhIHJlZmVyZW5jZSBvbiB0aGUgY29udGVudHMgb2YgdGhlIG9iamVjdCwgaXQgZG9lc24n dAorICogaW1wbHkgYSByZWYgb24gdGhlIG9iamVjdCBpdHNlbGYuCisgKgorICogSU1QT1JUQU5U OgorICoKKyAqIERSTSBkcml2ZXIgd3JpdGVycyB3aG8gbG9vayBhIHRoaXMgZnVuY3Rpb24gYXMg YW4gZXhhbXBsZSBmb3IgaG93IHRvIGRvIEdFTQorICogbW1hcCBzdXBwb3J0LCBwbGVhc2UgZG9u J3QgaW1wbGVtZW50IG1tYXAgc3VwcG9ydCBsaWtlIGhlcmUuIFRoZSBtb2Rlcm4gd2F5CisgKiB0 byBpbXBsZW1lbnQgRFJNIG1tYXAgc3VwcG9ydCBpcyB3aXRoIGFuIG1tYXAgb2Zmc2V0IGlvY3Rs IChsaWtlCisgKiBpOTE1X2dlbV9tbWFwX2d0dCkgYW5kIHRoZW4gdXNpbmcgdGhlIG1tYXAgc3lz Y2FsbCBvbiB0aGUgRFJNIGZkIGRpcmVjdGx5LgorICogVGhhdCB3YXkgZGVidWcgdG9vbGluZyBs aWtlIHZhbGdyaW5kIHdpbGwgdW5kZXJzdGFuZCB3aGF0J3MgZ29pbmcgb24sIGhpZGluZworICog dGhlIG1tYXAgY2FsbCBpbiBhIGRyaXZlciBwcml2YXRlIGlvY3RsIHdpbGwgYnJlYWsgdGhhdC4g VGhlIGk5MTUgZHJpdmVyIG9ubHkKKyAqIGRvZXMgY3B1IG1tYXBzIHRoaXMgd2F5IGJlY2F1c2Ug d2UgZGlkbid0IGtub3cgYmV0dGVyLgorICovCitpbnQKK2k5MTVfZ2VtX21tYXBfaW9jdGwoc3Ry dWN0IGRybV9kZXZpY2UgKmRldiwgdm9pZCAqZGF0YSwKKwkJICAgIHN0cnVjdCBkcm1fZmlsZSAq ZmlsZSkKK3sKKwlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX21tYXAgKmFyZ3MgPSBkYXRhOworCXN0cnVj dCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmo7CisJdW5zaWduZWQgbG9uZyBhZGRyOworCisJaWYg KGFyZ3MtPmZsYWdzICYgfihJOTE1X01NQVBfV0MpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlm IChhcmdzLT5mbGFncyAmIEk5MTVfTU1BUF9XQyAmJiAhYm9vdF9jcHVfaGFzKFg4Nl9GRUFUVVJF X1BBVCkpCisJCXJldHVybiAtRU5PREVWOworCisJb2JqID0gaTkxNV9nZW1fb2JqZWN0X2xvb2t1 cChmaWxlLCBhcmdzLT5oYW5kbGUpOworCWlmICghb2JqKQorCQlyZXR1cm4gLUVOT0VOVDsKKwor CS8qIHByaW1lIG9iamVjdHMgaGF2ZSBubyBiYWNraW5nIGZpbHAgdG8gR0VNIG1tYXAKKwkgKiBw YWdlcyBmcm9tLgorCSAqLworCWlmICghb2JqLT5iYXNlLmZpbHApIHsKKwkJaTkxNV9nZW1fb2Jq ZWN0X3B1dChvYmopOworCQlyZXR1cm4gLUVOWElPOworCX0KKworCWFkZHIgPSB2bV9tbWFwKG9i ai0+YmFzZS5maWxwLCAwLCBhcmdzLT5zaXplLAorCQkgICAgICAgUFJPVF9SRUFEIHwgUFJPVF9X UklURSwgTUFQX1NIQVJFRCwKKwkJICAgICAgIGFyZ3MtPm9mZnNldCk7CisJaWYgKElTX0VSUl9W QUxVRShhZGRyKSkKKwkJZ290byBlcnI7CisKKwlpZiAoYXJncy0+ZmxhZ3MgJiBJOTE1X01NQVBf V0MpIHsKKwkJc3RydWN0IG1tX3N0cnVjdCAqbW0gPSBjdXJyZW50LT5tbTsKKwkJc3RydWN0IHZt X2FyZWFfc3RydWN0ICp2bWE7CisKKwkJaWYgKGRvd25fd3JpdGVfa2lsbGFibGUoJm1tLT5tbWFw X3NlbSkpIHsKKwkJCWk5MTVfZ2VtX29iamVjdF9wdXQob2JqKTsKKwkJCXJldHVybiAtRUlOVFI7 CisJCX0KKwkJdm1hID0gZmluZF92bWEobW0sIGFkZHIpOworCQlpZiAodm1hICYmIF9fdm1hX21h dGNoZXModm1hLCBvYmotPmJhc2UuZmlscCwgYWRkciwgYXJncy0+c2l6ZSkpCisJCQl2bWEtPnZt X3BhZ2VfcHJvdCA9CisJCQkJcGdwcm90X3dyaXRlY29tYmluZSh2bV9nZXRfcGFnZV9wcm90KHZt YS0+dm1fZmxhZ3MpKTsKKwkJZWxzZQorCQkJYWRkciA9IC1FTk9NRU07CisJCXVwX3dyaXRlKCZt bS0+bW1hcF9zZW0pOworCQlpZiAoSVNfRVJSX1ZBTFVFKGFkZHIpKQorCQkJZ290byBlcnI7CisK KwkJLyogVGhpcyBtYXkgcmFjZSwgYnV0IHRoYXQncyBvaywgaXQgb25seSBnZXRzIHNldCAqLwor CQlXUklURV9PTkNFKG9iai0+ZnJvbnRidWZmZXJfZ2d0dF9vcmlnaW4sIE9SSUdJTl9DUFUpOwor CX0KKwlpOTE1X2dlbV9vYmplY3RfcHV0KG9iaik7CisKKwlhcmdzLT5hZGRyX3B0ciA9ICh1NjQp YWRkcjsKKworCXJldHVybiAwOworCitlcnI6CisJaTkxNV9nZW1fb2JqZWN0X3B1dChvYmopOwor CisJcmV0dXJuIGFkZHI7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgdGlsZV9yb3dfcGFnZXMo Y29uc3Qgc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaikKK3sKKwlyZXR1cm4gaTkxNV9n ZW1fb2JqZWN0X2dldF90aWxlX3Jvd19zaXplKG9iaikgPj4gUEFHRV9TSElGVDsKK30KKworLyoq CisgKiBpOTE1X2dlbV9tbWFwX2d0dF92ZXJzaW9uIC0gcmVwb3J0IHRoZSBjdXJyZW50IGZlYXR1 cmUgc2V0IGZvciBHVFQgbW1hcHMKKyAqCisgKiBBIGhpc3Rvcnkgb2YgdGhlIEdUVCBtbWFwIGlu dGVyZmFjZToKKyAqCisgKiAwIC0gRXZlcnl0aGluZyBoYWQgdG8gZml0IGludG8gdGhlIEdUVC4g Qm90aCBwYXJ0aWVzIG9mIGEgbWVtY3B5IGhhZCB0bworICogICAgIGFsaWduZWQgYW5kIHN1aXRh YmxlIGZvciBmZW5jaW5nLCBhbmQgc3RpbGwgZml0IGludG8gdGhlIGF2YWlsYWJsZQorICogICAg IG1hcHBhYmxlIHNwYWNlIGxlZnQgYnkgdGhlIHBpbm5lZCBkaXNwbGF5IG9iamVjdHMuIEEgY2xh c3NpYyBwcm9ibGVtCisgKiAgICAgd2UgY2FsbGVkIHRoZSBwYWdlLWZhdWx0LW9mLWRvb20gd2hl cmUgd2Ugd291bGQgcGluZy1wb25nIGJldHdlZW4KKyAqICAgICB0d28gb2JqZWN0cyB0aGF0IGNv dWxkIG5vdCBmaXQgaW5zaWRlIHRoZSBHVFQgYW5kIHNvIHRoZSBtZW1jcHkKKyAqICAgICB3b3Vs ZCBwYWdlIG9uZSBvYmplY3QgaW4gYXQgdGhlIGV4cGVuc2Ugb2YgdGhlIG90aGVyIGJldHdlZW4g ZXZlcnkKKyAqICAgICBzaW5nbGUgYnl0ZS4KKyAqCisgKiAxIC0gT2JqZWN0cyBjYW4gYmUgYW55 IHNpemUsIGFuZCBoYXZlIGFueSBjb21wYXRpYmxlIGZlbmNpbmcgKFggWSwgb3Igbm9uZQorICog ICAgIGFzIHNldCB2aWEgaTkxNV9nZW1fc2V0X3RpbGluZygpIFtEUk1fSTkxNV9HRU1fU0VUX1RJ TElOR10pLiBJZiB0aGUKKyAqICAgICBvYmplY3QgaXMgdG9vIGxhcmdlIGZvciB0aGUgYXZhaWxh YmxlIHNwYWNlIChvciBzaW1wbHkgdG9vIGxhcmdlCisgKiAgICAgZm9yIHRoZSBtYXBwYWJsZSBh cGVydHVyZSEpLCBhIHZpZXcgaXMgY3JlYXRlZCBpbnN0ZWFkIGFuZCBmYXVsdGVkCisgKiAgICAg aW50byB1c2Vyc3BhY2UuIChUaGlzIHZpZXcgaXMgYWxpZ25lZCBhbmQgc2l6ZWQgYXBwcm9wcmlh dGVseSBmb3IKKyAqICAgICBmZW5jZWQgYWNjZXNzLikKKyAqCisgKiAyIC0gUmVjb2duaXNlIFdD IGFzIGEgc2VwYXJhdGUgY2FjaGUgZG9tYWluIHNvIHRoYXQgd2UgY2FuIGZsdXNoIHRoZQorICog ICAgIGRlbGF5ZWQgd3JpdGVzIHZpYSBHVFQgYmVmb3JlIHBlcmZvcm1pbmcgZGlyZWN0IGFjY2Vz cyB2aWEgV0MuCisgKgorICogUmVzdHJpY3Rpb25zOgorICoKKyAqICAqIHNub29wYWJsZSBvYmpl Y3RzIGNhbm5vdCBiZSBhY2Nlc3NlZCB2aWEgdGhlIEdUVC4gSXQgY2FuIGNhdXNlIG1hY2hpbmUK KyAqICAgIGhhbmdzIG9uIHNvbWUgYXJjaGl0ZWN0dXJlcywgY29ycnVwdGlvbiBvbiBvdGhlcnMu IEFuIGF0dGVtcHQgdG8gc2VydmljZQorICogICAgYSBHVFQgcGFnZSBmYXVsdCBmcm9tIGEgc25v b3BhYmxlIG9iamVjdCB3aWxsIGdlbmVyYXRlIGEgU0lHQlVTLgorICoKKyAqICAqIHRoZSBvYmpl Y3QgbXVzdCBiZSBhYmxlIHRvIGZpdCBpbnRvIFJBTSAocGh5c2ljYWwgbWVtb3J5LCB0aG91Z2gg bm8KKyAqICAgIGxpbWl0ZWQgdG8gdGhlIG1hcHBhYmxlIGFwZXJ0dXJlKS4KKyAqCisgKgorICog Q2F2ZWF0czoKKyAqCisgKiAgKiBhIG5ldyBHVFQgcGFnZSBmYXVsdCB3aWxsIHN5bmNocm9uaXpl IHJlbmRlcmluZyBmcm9tIHRoZSBHUFUgYW5kIGZsdXNoCisgKiAgICBhbGwgZGF0YSB0byBzeXN0 ZW0gbWVtb3J5LiBTdWJzZXF1ZW50IGFjY2VzcyB3aWxsIG5vdCBiZSBzeW5jaHJvbml6ZWQuCisg KgorICogICogYWxsIG1hcHBpbmdzIGFyZSByZXZva2VkIG9uIHJ1bnRpbWUgZGV2aWNlIHN1c3Bl bmQuCisgKgorICogICogdGhlcmUgYXJlIG9ubHkgOCwgMTYgb3IgMzIgZmVuY2UgcmVnaXN0ZXJz IHRvIHNoYXJlIGJldHdlZW4gYWxsIHVzZXJzCisgKiAgICAob2xkZXIgbWFjaGluZXMgcmVxdWly ZSBmZW5jZSByZWdpc3RlciBmb3IgZGlzcGxheSBhbmQgYmxpdHRlciBhY2Nlc3MKKyAqICAgIGFz IHdlbGwpLiBDb250ZW50aW9uIG9mIHRoZSBmZW5jZSByZWdpc3RlcnMgd2lsbCBjYXVzZSB0aGUg cHJldmlvdXMgdXNlcnMKKyAqICAgIHRvIGJlIHVubWFwcGVkIGFuZCBhbnkgbmV3IGFjY2VzcyB3 aWxsIGdlbmVyYXRlIG5ldyBwYWdlIGZhdWx0cy4KKyAqCisgKiAgKiBydW5uaW5nIG91dCBvZiBt ZW1vcnkgd2hpbGUgc2VydmljaW5nIGEgZmF1bHQgbWF5IGdlbmVyYXRlIGEgU0lHQlVTLAorICog ICAgcmF0aGVyIHRoYW4gdGhlIGV4cGVjdGVkIFNJR1NFR1YuCisgKi8KK2ludCBpOTE1X2dlbV9t bWFwX2d0dF92ZXJzaW9uKHZvaWQpCit7CisJcmV0dXJuIDI7Cit9CisKK3N0YXRpYyBpbmxpbmUg c3RydWN0IGk5MTVfZ2d0dF92aWV3Citjb21wdXRlX3BhcnRpYWxfdmlldyhjb25zdCBzdHJ1Y3Qg ZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqLAorCQkgICAgIHBnb2ZmX3QgcGFnZV9vZmZzZXQsCisJ CSAgICAgdW5zaWduZWQgaW50IGNodW5rKQoreworCXN0cnVjdCBpOTE1X2dndHRfdmlldyB2aWV3 OworCisJaWYgKGk5MTVfZ2VtX29iamVjdF9pc190aWxlZChvYmopKQorCQljaHVuayA9IHJvdW5k dXAoY2h1bmssIHRpbGVfcm93X3BhZ2VzKG9iaikpOworCisJdmlldy50eXBlID0gSTkxNV9HR1RU X1ZJRVdfUEFSVElBTDsKKwl2aWV3LnBhcnRpYWwub2Zmc2V0ID0gcm91bmRkb3duKHBhZ2Vfb2Zm c2V0LCBjaHVuayk7CisJdmlldy5wYXJ0aWFsLnNpemUgPQorCQltaW5fdCh1bnNpZ25lZCBpbnQs IGNodW5rLAorCQkgICAgICAob2JqLT5iYXNlLnNpemUgPj4gUEFHRV9TSElGVCkgLSB2aWV3LnBh cnRpYWwub2Zmc2V0KTsKKworCS8qIElmIHRoZSBwYXJ0aWFsIGNvdmVycyB0aGUgZW50aXJlIG9i amVjdCwganVzdCBjcmVhdGUgYSBub3JtYWwgVk1BLiAqLworCWlmIChjaHVuayA+PSBvYmotPmJh c2Uuc2l6ZSA+PiBQQUdFX1NISUZUKQorCQl2aWV3LnR5cGUgPSBJOTE1X0dHVFRfVklFV19OT1JN QUw7CisKKwlyZXR1cm4gdmlldzsKK30KKworLyoqCisgKiBpOTE1X2dlbV9mYXVsdCAtIGZhdWx0 IGEgcGFnZSBpbnRvIHRoZSBHVFQKKyAqIEB2bWY6IGZhdWx0IGluZm8KKyAqCisgKiBUaGUgZmF1 bHQgaGFuZGxlciBpcyBzZXQgdXAgYnkgZHJtX2dlbV9tbWFwKCkgd2hlbiBhIG9iamVjdCBpcyBH VFQgbWFwcGVkCisgKiBmcm9tIHVzZXJzcGFjZS4gIFRoZSBmYXVsdCBoYW5kbGVyIHRha2VzIGNh cmUgb2YgYmluZGluZyB0aGUgb2JqZWN0IHRvCisgKiB0aGUgR1RUIChpZiBuZWVkZWQpLCBhbGxv Y2F0aW5nIGFuZCBwcm9ncmFtbWluZyBhIGZlbmNlIHJlZ2lzdGVyIChhZ2FpbiwKKyAqIG9ubHkg aWYgbmVlZGVkIGJhc2VkIG9uIHdoZXRoZXIgdGhlIG9sZCByZWcgaXMgc3RpbGwgdmFsaWQgb3Ig dGhlIG9iamVjdAorICogaXMgdGlsZWQpIGFuZCBpbnNlcnRpbmcgYSBuZXcgUFRFIGludG8gdGhl IGZhdWx0aW5nIHByb2Nlc3MuCisgKgorICogTm90ZSB0aGF0IHRoZSBmYXVsdGluZyBwcm9jZXNz IG1heSBpbnZvbHZlIGV2aWN0aW5nIGV4aXN0aW5nIG9iamVjdHMKKyAqIGZyb20gdGhlIEdUVCBh bmQvb3IgZmVuY2UgcmVnaXN0ZXJzIHRvIG1ha2Ugcm9vbS4gIFNvIHBlcmZvcm1hbmNlIG1heQor ICogc3VmZmVyIGlmIHRoZSBHVFQgd29ya2luZyBzZXQgaXMgbGFyZ2Ugb3IgdGhlcmUgYXJlIGZl dyBmZW5jZSByZWdpc3RlcnMKKyAqIGxlZnQuCisgKgorICogVGhlIGN1cnJlbnQgZmVhdHVyZSBz ZXQgc3VwcG9ydGVkIGJ5IGk5MTVfZ2VtX2ZhdWx0KCkgYW5kIHRodXMgR1RUIG1tYXBzCisgKiBp cyBleHBvc2VkIHZpYSBJOTE1X1BBUkFNX01NQVBfR1RUX1ZFUlNJT04gKHNlZSBpOTE1X2dlbV9t bWFwX2d0dF92ZXJzaW9uKS4KKyAqLwordm1fZmF1bHRfdCBpOTE1X2dlbV9mYXVsdChzdHJ1Y3Qg dm1fZmF1bHQgKnZtZikKK3sKKyNkZWZpbmUgTUlOX0NIVU5LX1BBR0VTIChTWl8xTSA+PiBQQUdF X1NISUZUKQorCXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqYXJlYSA9IHZtZi0+dm1hOworCXN0cnVj dCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmogPSB0b19pbnRlbF9ibyhhcmVhLT52bV9wcml2YXRl X2RhdGEpOworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBvYmotPmJhc2UuZGV2OworCXN0cnVj dCBkcm1faTkxNV9wcml2YXRlICppOTE1ID0gdG9faTkxNShkZXYpOworCXN0cnVjdCBpOTE1X2dn dHQgKmdndHQgPSAmaTkxNS0+Z2d0dDsKKwlib29sIHdyaXRlID0gYXJlYS0+dm1fZmxhZ3MgJiBW TV9XUklURTsKKwlpbnRlbF93YWtlcmVmX3Qgd2FrZXJlZjsKKwlzdHJ1Y3QgaTkxNV92bWEgKnZt YTsKKwlwZ29mZl90IHBhZ2Vfb2Zmc2V0OworCWludCBzcmN1OworCWludCByZXQ7CisKKwkvKiBT YW5pdHkgY2hlY2sgdGhhdCB3ZSBhbGxvdyB3cml0aW5nIGludG8gdGhpcyBvYmplY3QgKi8KKwlp ZiAoaTkxNV9nZW1fb2JqZWN0X2lzX3JlYWRvbmx5KG9iaikgJiYgd3JpdGUpCisJCXJldHVybiBW TV9GQVVMVF9TSUdCVVM7CisKKwkvKiBXZSBkb24ndCB1c2Ugdm1mLT5wZ29mZiBzaW5jZSB0aGF0 IGhhcyB0aGUgZmFrZSBvZmZzZXQgKi8KKwlwYWdlX29mZnNldCA9ICh2bWYtPmFkZHJlc3MgLSBh cmVhLT52bV9zdGFydCkgPj4gUEFHRV9TSElGVDsKKworCXRyYWNlX2k5MTVfZ2VtX29iamVjdF9m YXVsdChvYmosIHBhZ2Vfb2Zmc2V0LCB0cnVlLCB3cml0ZSk7CisKKwkvKiBUcnkgdG8gZmx1c2gg dGhlIG9iamVjdCBvZmYgdGhlIEdQVSBmaXJzdCB3aXRob3V0IGhvbGRpbmcgdGhlIGxvY2suCisJ ICogVXBvbiBhY3F1aXJpbmcgdGhlIGxvY2ssIHdlIHdpbGwgcGVyZm9ybSBvdXIgc2FuaXR5IGNo ZWNrcyBhbmQgdGhlbgorCSAqIHJlcGVhdCB0aGUgZmx1c2ggaG9sZGluZyB0aGUgbG9jayBpbiB0 aGUgbm9ybWFsIG1hbm5lciB0byBjYXRjaCBjYXNlcworCSAqIHdoZXJlIHdlIGFyZSBnYXp1bXBl ZC4KKwkgKi8KKwlyZXQgPSBpOTE1X2dlbV9vYmplY3Rfd2FpdChvYmosCisJCQkJICAgSTkxNV9X QUlUX0lOVEVSUlVQVElCTEUsCisJCQkJICAgTUFYX1NDSEVEVUxFX1RJTUVPVVQpOworCWlmIChy ZXQpCisJCWdvdG8gZXJyOworCisJcmV0ID0gaTkxNV9nZW1fb2JqZWN0X3Bpbl9wYWdlcyhvYmop OworCWlmIChyZXQpCisJCWdvdG8gZXJyOworCisJd2FrZXJlZiA9IGludGVsX3J1bnRpbWVfcG1f Z2V0KGk5MTUpOworCisJc3JjdSA9IGk5MTVfcmVzZXRfdHJ5bG9jayhpOTE1KTsKKwlpZiAoc3Jj dSA8IDApIHsKKwkJcmV0ID0gc3JjdTsKKwkJZ290byBlcnJfcnBtOworCX0KKworCXJldCA9IGk5 MTVfbXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKGRldik7CisJaWYgKHJldCkKKwkJZ290byBlcnJf cmVzZXQ7CisKKwkvKiBBY2Nlc3MgdG8gc25vb3BhYmxlIHBhZ2VzIHRocm91Z2ggdGhlIEdUVCBp cyBpbmNvaGVyZW50LiAqLworCWlmIChvYmotPmNhY2hlX2xldmVsICE9IEk5MTVfQ0FDSEVfTk9O RSAmJiAhSEFTX0xMQyhpOTE1KSkgeworCQlyZXQgPSAtRUZBVUxUOworCQlnb3RvIGVycl91bmxv Y2s7CisJfQorCisJLyogTm93IHBpbiBpdCBpbnRvIHRoZSBHVFQgYXMgbmVlZGVkICovCisJdm1h ID0gaTkxNV9nZW1fb2JqZWN0X2dndHRfcGluKG9iaiwgTlVMTCwgMCwgMCwKKwkJCQkgICAgICAg UElOX01BUFBBQkxFIHwKKwkJCQkgICAgICAgUElOX05PTkJMT0NLIHwKKwkJCQkgICAgICAgUElO X05PTkZBVUxUKTsKKwlpZiAoSVNfRVJSKHZtYSkpIHsKKwkJLyogVXNlIGEgcGFydGlhbCB2aWV3 IGlmIGl0IGlzIGJpZ2dlciB0aGFuIGF2YWlsYWJsZSBzcGFjZSAqLworCQlzdHJ1Y3QgaTkxNV9n Z3R0X3ZpZXcgdmlldyA9CisJCQljb21wdXRlX3BhcnRpYWxfdmlldyhvYmosIHBhZ2Vfb2Zmc2V0 LCBNSU5fQ0hVTktfUEFHRVMpOworCQl1bnNpZ25lZCBpbnQgZmxhZ3M7CisKKwkJZmxhZ3MgPSBQ SU5fTUFQUEFCTEU7CisJCWlmICh2aWV3LnR5cGUgPT0gSTkxNV9HR1RUX1ZJRVdfTk9STUFMKQor CQkJZmxhZ3MgfD0gUElOX05PTkJMT0NLOyAvKiBhdm9pZCB3YXJuaW5ncyBmb3IgcGlubmVkICov CisKKwkJLyoKKwkJICogVXNlcnNwYWNlIGlzIG5vdyB3cml0aW5nIHRocm91Z2ggYW4gdW50cmFj a2VkIFZNQSwgYWJhbmRvbgorCQkgKiBhbGwgaG9wZSB0aGF0IHRoZSBoYXJkd2FyZSBpcyBhYmxl IHRvIHRyYWNrIGZ1dHVyZSB3cml0ZXMuCisJCSAqLworCQlvYmotPmZyb250YnVmZmVyX2dndHRf b3JpZ2luID0gT1JJR0lOX0NQVTsKKworCQl2bWEgPSBpOTE1X2dlbV9vYmplY3RfZ2d0dF9waW4o b2JqLCAmdmlldywgMCwgMCwgZmxhZ3MpOworCQlpZiAoSVNfRVJSKHZtYSkgJiYgIXZpZXcudHlw ZSkgeworCQkJZmxhZ3MgPSBQSU5fTUFQUEFCTEU7CisJCQl2aWV3LnR5cGUgPSBJOTE1X0dHVFRf VklFV19QQVJUSUFMOworCQkJdm1hID0gaTkxNV9nZW1fb2JqZWN0X2dndHRfcGluKG9iaiwgJnZp ZXcsIDAsIDAsIGZsYWdzKTsKKwkJfQorCX0KKwlpZiAoSVNfRVJSKHZtYSkpIHsKKwkJcmV0ID0g UFRSX0VSUih2bWEpOworCQlnb3RvIGVycl91bmxvY2s7CisJfQorCisJcmV0ID0gaTkxNV9nZW1f b2JqZWN0X3NldF90b19ndHRfZG9tYWluKG9iaiwgd3JpdGUpOworCWlmIChyZXQpCisJCWdvdG8g ZXJyX3VucGluOworCisJcmV0ID0gaTkxNV92bWFfcGluX2ZlbmNlKHZtYSk7CisJaWYgKHJldCkK KwkJZ290byBlcnJfdW5waW47CisKKwkvKiBGaW5hbGx5LCByZW1hcCBpdCB1c2luZyB0aGUgbmV3 IEdUVCBvZmZzZXQgKi8KKwlyZXQgPSByZW1hcF9pb19tYXBwaW5nKGFyZWEsCisJCQkgICAgICAg YXJlYS0+dm1fc3RhcnQgKyAodm1hLT5nZ3R0X3ZpZXcucGFydGlhbC5vZmZzZXQgPDwgUEFHRV9T SElGVCksCisJCQkgICAgICAgKGdndHQtPmdtYWRyLnN0YXJ0ICsgdm1hLT5ub2RlLnN0YXJ0KSA+ PiBQQUdFX1NISUZULAorCQkJICAgICAgIG1pbl90KHU2NCwgdm1hLT5zaXplLCBhcmVhLT52bV9l bmQgLSBhcmVhLT52bV9zdGFydCksCisJCQkgICAgICAgJmdndHQtPmlvbWFwKTsKKwlpZiAocmV0 KQorCQlnb3RvIGVycl9mZW5jZTsKKworCS8qIE1hcmsgYXMgYmVpbmcgbW1hcHBlZCBpbnRvIHVz ZXJzcGFjZSBmb3IgbGF0ZXIgcmV2b2NhdGlvbiAqLworCWFzc2VydF9ycG1fd2FrZWxvY2tfaGVs ZChpOTE1KTsKKwlpZiAoIWk5MTVfdm1hX3NldF91c2VyZmF1bHQodm1hKSAmJiAhb2JqLT51c2Vy ZmF1bHRfY291bnQrKykKKwkJbGlzdF9hZGQoJm9iai0+dXNlcmZhdWx0X2xpbmssICZpOTE1LT5t bS51c2VyZmF1bHRfbGlzdCk7CisJR0VNX0JVR19PTighb2JqLT51c2VyZmF1bHRfY291bnQpOwor CisJaTkxNV92bWFfc2V0X2dndHRfd3JpdGUodm1hKTsKKworZXJyX2ZlbmNlOgorCWk5MTVfdm1h X3VucGluX2ZlbmNlKHZtYSk7CitlcnJfdW5waW46CisJX19pOTE1X3ZtYV91bnBpbih2bWEpOwor ZXJyX3VubG9jazoKKwltdXRleF91bmxvY2soJmRldi0+c3RydWN0X211dGV4KTsKK2Vycl9yZXNl dDoKKwlpOTE1X3Jlc2V0X3VubG9jayhpOTE1LCBzcmN1KTsKK2Vycl9ycG06CisJaW50ZWxfcnVu dGltZV9wbV9wdXQoaTkxNSwgd2FrZXJlZik7CisJaTkxNV9nZW1fb2JqZWN0X3VucGluX3BhZ2Vz KG9iaik7CitlcnI6CisJc3dpdGNoIChyZXQpIHsKKwljYXNlIC1FSU86CisJCS8qCisJCSAqIFdl IGVhdCBlcnJvcnMgd2hlbiB0aGUgZ3B1IGlzIHRlcm1pbmFsbHkgd2VkZ2VkIHRvIGF2b2lkCisJ CSAqIHVzZXJzcGFjZSB1bmR1bHkgY3Jhc2hpbmcgKGdsIGhhcyBubyBwcm92aXNpb25zIGZvciBt bWFwcyB0bworCQkgKiBmYWlsKS4gQnV0IGFueSBvdGhlciAtRUlPIGlzbid0IG91cnMgKGUuZy4g c3dhcCBpbiBmYWlsdXJlKQorCQkgKiBhbmQgc28gbmVlZHMgdG8gYmUgcmVwb3J0ZWQuCisJCSAq LworCQlpZiAoIWk5MTVfdGVybWluYWxseV93ZWRnZWQoaTkxNSkpCisJCQlyZXR1cm4gVk1fRkFV TFRfU0lHQlVTOworCQkvKiBlbHNlOiBmYWxsIHRocm91Z2ggKi8KKwljYXNlIC1FQUdBSU46CisJ CS8qCisJCSAqIEVBR0FJTiBtZWFucyB0aGUgZ3B1IGlzIGh1bmcgYW5kIHdlJ2xsIHdhaXQgZm9y IHRoZSBlcnJvcgorCQkgKiBoYW5kbGVyIHRvIHJlc2V0IGV2ZXJ5dGhpbmcgd2hlbiByZS1mYXVs dGluZyBpbgorCQkgKiBpOTE1X211dGV4X2xvY2tfaW50ZXJydXB0aWJsZS4KKwkJICovCisJY2Fz ZSAwOgorCWNhc2UgLUVSRVNUQVJUU1lTOgorCWNhc2UgLUVJTlRSOgorCWNhc2UgLUVCVVNZOgor CQkvKgorCQkgKiBFQlVTWSBpcyBvazogdGhpcyBqdXN0IG1lYW5zIHRoYXQgYW5vdGhlciB0aHJl YWQKKwkJICogYWxyZWFkeSBkaWQgdGhlIGpvYi4KKwkJICovCisJCXJldHVybiBWTV9GQVVMVF9O T1BBR0U7CisJY2FzZSAtRU5PTUVNOgorCQlyZXR1cm4gVk1fRkFVTFRfT09NOworCWNhc2UgLUVO T1NQQzoKKwljYXNlIC1FRkFVTFQ6CisJCXJldHVybiBWTV9GQVVMVF9TSUdCVVM7CisJZGVmYXVs dDoKKwkJV0FSTl9PTkNFKHJldCwgInVuaGFuZGxlZCBlcnJvciBpbiAlczogJWlcbiIsIF9fZnVu Y19fLCByZXQpOworCQlyZXR1cm4gVk1fRkFVTFRfU0lHQlVTOworCX0KK30KKwordm9pZCBfX2k5 MTVfZ2VtX29iamVjdF9yZWxlYXNlX21tYXAoc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9i aikKK3sKKwlzdHJ1Y3QgaTkxNV92bWEgKnZtYTsKKworCUdFTV9CVUdfT04oIW9iai0+dXNlcmZh dWx0X2NvdW50KTsKKworCW9iai0+dXNlcmZhdWx0X2NvdW50ID0gMDsKKwlsaXN0X2RlbCgmb2Jq LT51c2VyZmF1bHRfbGluayk7CisJZHJtX3ZtYV9ub2RlX3VubWFwKCZvYmotPmJhc2Uudm1hX25v ZGUsCisJCQkgICBvYmotPmJhc2UuZGV2LT5hbm9uX2lub2RlLT5pX21hcHBpbmcpOworCisJZm9y X2VhY2hfZ2d0dF92bWEodm1hLCBvYmopCisJCWk5MTVfdm1hX3Vuc2V0X3VzZXJmYXVsdCh2bWEp OworfQorCisvKioKKyAqIGk5MTVfZ2VtX29iamVjdF9yZWxlYXNlX21tYXAgLSByZW1vdmUgcGh5 c2ljYWwgcGFnZSBtYXBwaW5ncworICogQG9iajogb2JqIGluIHF1ZXN0aW9uCisgKgorICogUHJl c2VydmUgdGhlIHJlc2VydmF0aW9uIG9mIHRoZSBtbWFwcGluZyB3aXRoIHRoZSBEUk0gY29yZSBj b2RlLCBidXQKKyAqIHJlbGlucXVpc2ggb3duZXJzaGlwIG9mIHRoZSBwYWdlcyBiYWNrIHRvIHRo ZSBzeXN0ZW0uCisgKgorICogSXQgaXMgdml0YWwgdGhhdCB3ZSByZW1vdmUgdGhlIHBhZ2UgbWFw cGluZyBpZiB3ZSBoYXZlIG1hcHBlZCBhIHRpbGVkCisgKiBvYmplY3QgdGhyb3VnaCB0aGUgR1RU IGFuZCB0aGVuIGxvc2UgdGhlIGZlbmNlIHJlZ2lzdGVyIGR1ZSB0bworICogcmVzb3VyY2UgcHJl c3N1cmUuIFNpbWlsYXJseSBpZiB0aGUgb2JqZWN0IGhhcyBiZWVuIG1vdmVkIG91dCBvZiB0aGUK KyAqIGFwZXJ0dXJlLCB0aGFuIHBhZ2VzIG1hcHBlZCBpbnRvIHVzZXJzcGFjZSBtdXN0IGJlIHJl dm9rZWQuIFJlbW92aW5nIHRoZQorICogbWFwcGluZyB3aWxsIHRoZW4gdHJpZ2dlciBhIHBhZ2Ug ZmF1bHQgb24gdGhlIG5leHQgdXNlciBhY2Nlc3MsIGFsbG93aW5nCisgKiBmaXh1cCBieSBpOTE1 X2dlbV9mYXVsdCgpLgorICovCit2b2lkIGk5MTVfZ2VtX29iamVjdF9yZWxlYXNlX21tYXAoc3Ry dWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaikKK3sKKwlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0 ZSAqaTkxNSA9IHRvX2k5MTUob2JqLT5iYXNlLmRldik7CisJaW50ZWxfd2FrZXJlZl90IHdha2Vy ZWY7CisKKwkvKiBTZXJpYWxpc2F0aW9uIGJldHdlZW4gdXNlciBHVFQgYWNjZXNzIGFuZCBvdXIg Y29kZSBkZXBlbmRzIHVwb24KKwkgKiByZXZva2luZyB0aGUgQ1BVJ3MgUFRFIHdoaWxzdCB0aGUg bXV0ZXggaXMgaGVsZC4gVGhlIG5leHQgdXNlcgorCSAqIHBhZ2VmYXVsdCB0aGVuIGhhcyB0byB3 YWl0IHVudGlsIHdlIHJlbGVhc2UgdGhlIG11dGV4LgorCSAqCisJICogTm90ZSB0aGF0IFJQTSBj b21wbGljYXRlcyBzb21ld2hhdCBieSBhZGRpbmcgYW4gYWRkaXRpb25hbAorCSAqIHJlcXVpcmVt ZW50IHRoYXQgb3BlcmF0aW9ucyB0byB0aGUgR0dUVCBiZSBtYWRlIGhvbGRpbmcgdGhlIFJQTQor CSAqIHdha2VyZWYuCisJICovCisJbG9ja2RlcF9hc3NlcnRfaGVsZCgmaTkxNS0+ZHJtLnN0cnVj dF9tdXRleCk7CisJd2FrZXJlZiA9IGludGVsX3J1bnRpbWVfcG1fZ2V0KGk5MTUpOworCisJaWYg KCFvYmotPnVzZXJmYXVsdF9jb3VudCkKKwkJZ290byBvdXQ7CisKKwlfX2k5MTVfZ2VtX29iamVj dF9yZWxlYXNlX21tYXAob2JqKTsKKworCS8qIEVuc3VyZSB0aGF0IHRoZSBDUFUncyBQVEUgYXJl IHJldm9rZWQgYW5kIHRoZXJlIGFyZSBub3Qgb3V0c3RhbmRpbmcKKwkgKiBtZW1vcnkgdHJhbnNh Y3Rpb25zIGZyb20gdXNlcnNwYWNlIGJlZm9yZSB3ZSByZXR1cm4uIFRoZSBUTEIKKwkgKiBmbHVz aGluZyBpbXBsaWVkIGFib3ZlIGJ5IGNoYW5naW5nIHRoZSBQVEUgYWJvdmUgKnNob3VsZCogYmUK KwkgKiBzdWZmaWNpZW50LCBhbiBleHRyYSBiYXJyaWVyIGhlcmUganVzdCBwcm92aWRlcyB1cyB3 aXRoIGEgYml0CisJICogb2YgcGFyYW5vaWQgZG9jdW1lbnRhdGlvbiBhYm91dCBvdXIgcmVxdWly ZW1lbnQgdG8gc2VyaWFsaXNlCisJICogbWVtb3J5IHdyaXRlcyBiZWZvcmUgdG91Y2hpbmcgcmVn aXN0ZXJzIC8gR1NNLgorCSAqLworCXdtYigpOworCitvdXQ6CisJaW50ZWxfcnVudGltZV9wbV9w dXQoaTkxNSwgd2FrZXJlZik7Cit9CisKK3N0YXRpYyBpbnQgY3JlYXRlX21tYXBfb2Zmc2V0KHN0 cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmopCit7CisJc3RydWN0IGRybV9pOTE1X3ByaXZh dGUgKmk5MTUgPSB0b19pOTE1KG9iai0+YmFzZS5kZXYpOworCWludCBlcnI7CisKKwllcnIgPSBk cm1fZ2VtX2NyZWF0ZV9tbWFwX29mZnNldCgmb2JqLT5iYXNlKTsKKwlpZiAobGlrZWx5KCFlcnIp KQorCQlyZXR1cm4gMDsKKworCS8qIEF0dGVtcHQgdG8gcmVhcCBzb21lIG1tYXAgc3BhY2UgZnJv bSBkZWFkIG9iamVjdHMgKi8KKwlkbyB7CisJCWVyciA9IGk5MTVfZ2VtX3dhaXRfZm9yX2lkbGUo aTkxNSwKKwkJCQkJICAgICBJOTE1X1dBSVRfSU5URVJSVVBUSUJMRSwKKwkJCQkJICAgICBNQVhf U0NIRURVTEVfVElNRU9VVCk7CisJCWlmIChlcnIpCisJCQlicmVhazsKKworCQlpOTE1X2dlbV9k cmFpbl9mcmVlZF9vYmplY3RzKGk5MTUpOworCQllcnIgPSBkcm1fZ2VtX2NyZWF0ZV9tbWFwX29m ZnNldCgmb2JqLT5iYXNlKTsKKwkJaWYgKCFlcnIpCisJCQlicmVhazsKKworCX0gd2hpbGUgKGZs dXNoX2RlbGF5ZWRfd29yaygmaTkxNS0+Z3QucmV0aXJlX3dvcmspKTsKKworCXJldHVybiBlcnI7 Cit9CisKK2ludAoraTkxNV9nZW1fbW1hcF9ndHQoc3RydWN0IGRybV9maWxlICpmaWxlLAorCQkg IHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCisJCSAgdTMyIGhhbmRsZSwKKwkJICB1NjQgKm9mZnNl dCkKK3sKKwlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqOworCWludCByZXQ7CisKKwlv YmogPSBpOTE1X2dlbV9vYmplY3RfbG9va3VwKGZpbGUsIGhhbmRsZSk7CisJaWYgKCFvYmopCisJ CXJldHVybiAtRU5PRU5UOworCisJcmV0ID0gY3JlYXRlX21tYXBfb2Zmc2V0KG9iaik7CisJaWYg KHJldCA9PSAwKQorCQkqb2Zmc2V0ID0gZHJtX3ZtYV9ub2RlX29mZnNldF9hZGRyKCZvYmotPmJh c2Uudm1hX25vZGUpOworCisJaTkxNV9nZW1fb2JqZWN0X3B1dChvYmopOworCXJldHVybiByZXQ7 Cit9CisKKy8qKgorICogaTkxNV9nZW1fbW1hcF9ndHRfaW9jdGwgLSBwcmVwYXJlIGFuIG9iamVj dCBmb3IgR1RUIG1tYXAnaW5nCisgKiBAZGV2OiBEUk0gZGV2aWNlCisgKiBAZGF0YTogR1RUIG1h cHBpbmcgaW9jdGwgZGF0YQorICogQGZpbGU6IEdFTSBvYmplY3QgaW5mbworICoKKyAqIFNpbXBs eSByZXR1cm5zIHRoZSBmYWtlIG9mZnNldCB0byB1c2Vyc3BhY2Ugc28gaXQgY2FuIG1tYXAgaXQu CisgKiBUaGUgbW1hcCBjYWxsIHdpbGwgZW5kIHVwIGluIGRybV9nZW1fbW1hcCgpLCB3aGljaCB3 aWxsIHNldCB0aGluZ3MKKyAqIHVwIHNvIHdlIGNhbiBnZXQgZmF1bHRzIGluIHRoZSBoYW5kbGVy IGFib3ZlLgorICoKKyAqIFRoZSBmYXVsdCBoYW5kbGVyIHdpbGwgdGFrZSBjYXJlIG9mIGJpbmRp bmcgdGhlIG9iamVjdCBpbnRvIHRoZSBHVFQKKyAqIChzaW5jZSBpdCBtYXkgaGF2ZSBiZWVuIGV2 aWN0ZWQgdG8gbWFrZSByb29tIGZvciBzb21ldGhpbmcpLCBhbGxvY2F0aW5nCisgKiBhIGZlbmNl IHJlZ2lzdGVyLCBhbmQgbWFwcGluZyB0aGUgYXBwcm9wcmlhdGUgYXBlcnR1cmUgYWRkcmVzcyBp bnRvCisgKiB1c2Vyc3BhY2UuCisgKi8KK2ludAoraTkxNV9nZW1fbW1hcF9ndHRfaW9jdGwoc3Ry dWN0IGRybV9kZXZpY2UgKmRldiwgdm9pZCAqZGF0YSwKKwkJCXN0cnVjdCBkcm1fZmlsZSAqZmls ZSkKK3sKKwlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX21tYXBfZ3R0ICphcmdzID0gZGF0YTsKKworCXJl dHVybiBpOTE1X2dlbV9tbWFwX2d0dChmaWxlLCBkZXYsIGFyZ3MtPmhhbmRsZSwgJmFyZ3MtPm9m ZnNldCk7Cit9CisKKyNpZiBJU19FTkFCTEVEKENPTkZJR19EUk1fSTkxNV9TRUxGVEVTVCkKKyNp bmNsdWRlICJzZWxmdGVzdHMvaTkxNV9nZW1fbW1hbi5jIgorI2VuZGlmCmRpZmYgLS1naXQgYS9k cml2ZXJzL2dwdS9kcm0vaTkxNS9nZW0vaTkxNV9nZW1fb2JqZWN0LmMgYi9kcml2ZXJzL2dwdS9k cm0vaTkxNS9nZW0vaTkxNV9nZW1fb2JqZWN0LmMKaW5kZXggMDVlZmNlODg1OTYxLi40YTZjNWRk ZDEyNjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2dlbS9pOTE1X2dlbV9vYmpl Y3QuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9nZW0vaTkxNV9nZW1fb2JqZWN0LmMKQEAg LTI2LDYgKzI2LDcgQEAKIAogI2luY2x1ZGUgIi4uL2k5MTVfZHJ2LmgiCiAjaW5jbHVkZSAiLi4v aTkxNV9nbG9iYWxzLmgiCisjaW5jbHVkZSAiLi4vaTkxNV9nZW1fY2xmbHVzaC5oIgogI2luY2x1 ZGUgIi4uL2ludGVsX2Zyb250YnVmZmVyLmgiCiAKIHN0YXRpYyBzdHJ1Y3QgaTkxNV9nbG9iYWxf b2JqZWN0IHsKQEAgLTM1Nyw2ICszNTgsNjEgQEAgdm9pZCBfX2k5MTVfZ2VtX29iamVjdF9yZWxl YXNlX3VubGVzc19hY3RpdmUoc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaikKIAkJaTkx NV9nZW1fb2JqZWN0X3B1dChvYmopOwogfQogCitzdGF0aWMgaW5saW5lIGVudW0gZmJfb3Bfb3Jp Z2luCitmYl93cml0ZV9vcmlnaW4oc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaiwgdW5z aWduZWQgaW50IGRvbWFpbikKK3sKKwlyZXR1cm4gKGRvbWFpbiA9PSBJOTE1X0dFTV9ET01BSU5f R1RUID8KKwkJb2JqLT5mcm9udGJ1ZmZlcl9nZ3R0X29yaWdpbiA6IE9SSUdJTl9DUFUpOworfQor CitzdGF0aWMgYm9vbCBncHVfd3JpdGVfbmVlZHNfY2xmbHVzaChzdHJ1Y3QgZHJtX2k5MTVfZ2Vt X29iamVjdCAqb2JqKQoreworCXJldHVybiAhKG9iai0+Y2FjaGVfbGV2ZWwgPT0gSTkxNV9DQUNI RV9OT05FIHx8CisJCSBvYmotPmNhY2hlX2xldmVsID09IEk5MTVfQ0FDSEVfV1QpOworfQorCit2 b2lkCitpOTE1X2dlbV9vYmplY3RfZmx1c2hfd3JpdGVfZG9tYWluKHN0cnVjdCBkcm1faTkxNV9n ZW1fb2JqZWN0ICpvYmosCisJCQkJICAgdW5zaWduZWQgaW50IGZsdXNoX2RvbWFpbnMpCit7CisJ c3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gdG9faTkxNShvYmotPmJhc2UuZGV2 KTsKKwlzdHJ1Y3QgaTkxNV92bWEgKnZtYTsKKworCWlmICghKG9iai0+d3JpdGVfZG9tYWluICYg Zmx1c2hfZG9tYWlucykpCisJCXJldHVybjsKKworCXN3aXRjaCAob2JqLT53cml0ZV9kb21haW4p IHsKKwljYXNlIEk5MTVfR0VNX0RPTUFJTl9HVFQ6CisJCWk5MTVfZ2VtX2ZsdXNoX2dndHRfd3Jp dGVzKGRldl9wcml2KTsKKworCQlpbnRlbF9mYl9vYmpfZmx1c2gob2JqLAorCQkJCSAgIGZiX3dy aXRlX29yaWdpbihvYmosIEk5MTVfR0VNX0RPTUFJTl9HVFQpKTsKKworCQlmb3JfZWFjaF9nZ3R0 X3ZtYSh2bWEsIG9iaikgeworCQkJaWYgKHZtYS0+aW9tYXApCisJCQkJY29udGludWU7CisKKwkJ CWk5MTVfdm1hX3Vuc2V0X2dndHRfd3JpdGUodm1hKTsKKwkJfQorCQlicmVhazsKKworCWNhc2Ug STkxNV9HRU1fRE9NQUlOX1dDOgorCQl3bWIoKTsKKwkJYnJlYWs7CisKKwljYXNlIEk5MTVfR0VN X0RPTUFJTl9DUFU6CisJCWk5MTVfZ2VtX2NsZmx1c2hfb2JqZWN0KG9iaiwgSTkxNV9DTEZMVVNI X1NZTkMpOworCQlicmVhazsKKworCWNhc2UgSTkxNV9HRU1fRE9NQUlOX1JFTkRFUjoKKwkJaWYg KGdwdV93cml0ZV9uZWVkc19jbGZsdXNoKG9iaikpCisJCQlvYmotPmNhY2hlX2RpcnR5ID0gdHJ1 ZTsKKwkJYnJlYWs7CisJfQorCisJb2JqLT53cml0ZV9kb21haW4gPSAwOworfQorCiB2b2lkIGk5 MTVfZ2VtX2luaXRfX29iamVjdHMoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmk5MTUpCiB7CiAJ SU5JVF9XT1JLKCZpOTE1LT5tbS5mcmVlX3dvcmssIF9faTkxNV9nZW1fZnJlZV93b3JrKTsKZGlm ZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2dlbS9pOTE1X2dlbV9vYmplY3QuaCBiL2Ry aXZlcnMvZ3B1L2RybS9pOTE1L2dlbS9pOTE1X2dlbV9vYmplY3QuaAppbmRleCBlYmFiMzUwNWU1 MWQuLjIwYjcyYzE2YzQ4NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvZ2VtL2k5 MTVfZ2VtX29iamVjdC5oCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2dlbS9pOTE1X2dlbV9v YmplY3QuaApAQCAtMzM3LDYgKzMzNywxMyBAQCBzdGF0aWMgaW5saW5lIHZvaWQgaTkxNV9nZW1f b2JqZWN0X3VucGluX21hcChzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqKQogCWk5MTVf Z2VtX29iamVjdF91bnBpbl9wYWdlcyhvYmopOwogfQogCit2b2lkIF9faTkxNV9nZW1fb2JqZWN0 X3JlbGVhc2VfbW1hcChzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqKTsKK3ZvaWQgaTkx NV9nZW1fb2JqZWN0X3JlbGVhc2VfbW1hcChzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2Jq KTsKKwordm9pZAoraTkxNV9nZW1fb2JqZWN0X2ZsdXNoX3dyaXRlX2RvbWFpbihzdHJ1Y3QgZHJt X2k5MTVfZ2VtX29iamVjdCAqb2JqLAorCQkJCSAgIHVuc2lnbmVkIGludCBmbHVzaF9kb21haW5z KTsKKwogc3RhdGljIGlubGluZSBzdHJ1Y3QgaW50ZWxfZW5naW5lX2NzICoKIGk5MTVfZ2VtX29i amVjdF9sYXN0X3dyaXRlX2VuZ2luZShzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqKQog ewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvZ2VtL3NlbGZ0ZXN0cy9pOTE1X2dl bV9tbWFuLmMgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9nZW0vc2VsZnRlc3RzL2k5MTVfZ2VtX21t YW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAuLmE5OWE1MWE5M2Rj YgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2dlbS9zZWxmdGVzdHMv aTkxNV9nZW1fbW1hbi5jCkBAIC0wLDAgKzEsNTA3IEBACisvKgorICogU1BEWC1MaWNlbnNlLUlk ZW50aWZpZXI6IE1JVAorICoKKyAqIENvcHlyaWdodCDCqSAyMDE2IEludGVsIENvcnBvcmF0aW9u CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3ByaW1lX251bWJlcnMuaD4KKworI2luY2x1ZGUgIi4u Ly4uL2k5MTVfc2VsZnRlc3QuaCIKKyNpbmNsdWRlICIuLi8uLi9zZWxmdGVzdHMvaHVnZV9nZW1f b2JqZWN0LmgiCisKK3N0cnVjdCB0aWxlIHsKKwl1bnNpZ25lZCBpbnQgd2lkdGg7CisJdW5zaWdu ZWQgaW50IGhlaWdodDsKKwl1bnNpZ25lZCBpbnQgc3RyaWRlOworCXVuc2lnbmVkIGludCBzaXpl OworCXVuc2lnbmVkIGludCB0aWxpbmc7CisJdW5zaWduZWQgaW50IHN3aXp6bGU7Cit9OworCitz dGF0aWMgdTY0IHN3aXp6bGVfYml0KHVuc2lnbmVkIGludCBiaXQsIHU2NCBvZmZzZXQpCit7CisJ cmV0dXJuIChvZmZzZXQgJiBCSVRfVUxMKGJpdCkpID4+IChiaXQgLSA2KTsKK30KKworc3RhdGlj IHU2NCB0aWxlZF9vZmZzZXQoY29uc3Qgc3RydWN0IHRpbGUgKnRpbGUsIHU2NCB2KQoreworCXU2 NCB4LCB5OworCisJaWYgKHRpbGUtPnRpbGluZyA9PSBJOTE1X1RJTElOR19OT05FKQorCQlyZXR1 cm4gdjsKKworCXkgPSBkaXY2NF91NjRfcmVtKHYsIHRpbGUtPnN0cmlkZSwgJngpOworCXYgPSBk aXY2NF91NjRfcmVtKHksIHRpbGUtPmhlaWdodCwgJnkpICogdGlsZS0+c3RyaWRlICogdGlsZS0+ aGVpZ2h0OworCisJaWYgKHRpbGUtPnRpbGluZyA9PSBJOTE1X1RJTElOR19YKSB7CisJCXYgKz0g eSAqIHRpbGUtPndpZHRoOworCQl2ICs9IGRpdjY0X3U2NF9yZW0oeCwgdGlsZS0+d2lkdGgsICZ4 KSA8PCB0aWxlLT5zaXplOworCQl2ICs9IHg7CisJfSBlbHNlIGlmICh0aWxlLT53aWR0aCA9PSAx MjgpIHsKKwkJY29uc3QgdW5zaWduZWQgaW50IHl0aWxlX3NwYW4gPSAxNjsKKwkJY29uc3QgdW5z aWduZWQgaW50IHl0aWxlX2hlaWdodCA9IDUxMjsKKworCQl2ICs9IHkgKiB5dGlsZV9zcGFuOwor CQl2ICs9IGRpdjY0X3U2NF9yZW0oeCwgeXRpbGVfc3BhbiwgJngpICogeXRpbGVfaGVpZ2h0Owor CQl2ICs9IHg7CisJfSBlbHNlIHsKKwkJY29uc3QgdW5zaWduZWQgaW50IHl0aWxlX3NwYW4gPSAz MjsKKwkJY29uc3QgdW5zaWduZWQgaW50IHl0aWxlX2hlaWdodCA9IDI1NjsKKworCQl2ICs9IHkg KiB5dGlsZV9zcGFuOworCQl2ICs9IGRpdjY0X3U2NF9yZW0oeCwgeXRpbGVfc3BhbiwgJngpICog eXRpbGVfaGVpZ2h0OworCQl2ICs9IHg7CisJfQorCisJc3dpdGNoICh0aWxlLT5zd2l6emxlKSB7 CisJY2FzZSBJOTE1X0JJVF82X1NXSVpaTEVfOToKKwkJdiBePSBzd2l6emxlX2JpdCg5LCB2KTsK KwkJYnJlYWs7CisJY2FzZSBJOTE1X0JJVF82X1NXSVpaTEVfOV8xMDoKKwkJdiBePSBzd2l6emxl X2JpdCg5LCB2KSBeIHN3aXp6bGVfYml0KDEwLCB2KTsKKwkJYnJlYWs7CisJY2FzZSBJOTE1X0JJ VF82X1NXSVpaTEVfOV8xMToKKwkJdiBePSBzd2l6emxlX2JpdCg5LCB2KSBeIHN3aXp6bGVfYml0 KDExLCB2KTsKKwkJYnJlYWs7CisJY2FzZSBJOTE1X0JJVF82X1NXSVpaTEVfOV8xMF8xMToKKwkJ diBePSBzd2l6emxlX2JpdCg5LCB2KSBeIHN3aXp6bGVfYml0KDEwLCB2KSBeIHN3aXp6bGVfYml0 KDExLCB2KTsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIHY7Cit9CisKK3N0YXRpYyBpbnQgY2hl Y2tfcGFydGlhbF9tYXBwaW5nKHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmosCisJCQkJ IGNvbnN0IHN0cnVjdCB0aWxlICp0aWxlLAorCQkJCSB1bnNpZ25lZCBsb25nIGVuZF90aW1lKQor eworCWNvbnN0IHVuc2lnbmVkIGludCBucmVhbCA9IG9iai0+c2NyYXRjaCAvIFBBR0VfU0laRTsK Kwljb25zdCB1bnNpZ25lZCBsb25nIG5wYWdlcyA9IG9iai0+YmFzZS5zaXplIC8gUEFHRV9TSVpF OworCXN0cnVjdCBpOTE1X3ZtYSAqdm1hOworCXVuc2lnbmVkIGxvbmcgcGFnZTsKKwlpbnQgZXJy OworCisJaWYgKGlndF90aW1lb3V0KGVuZF90aW1lLAorCQkJIiVzOiB0aW1lZCBvdXQgYmVmb3Jl IHRpbGluZz0lZCBzdHJpZGU9JWRcbiIsCisJCQlfX2Z1bmNfXywgdGlsZS0+dGlsaW5nLCB0aWxl LT5zdHJpZGUpKQorCQlyZXR1cm4gLUVJTlRSOworCisJZXJyID0gaTkxNV9nZW1fb2JqZWN0X3Nl dF90aWxpbmcob2JqLCB0aWxlLT50aWxpbmcsIHRpbGUtPnN0cmlkZSk7CisJaWYgKGVycikgewor CQlwcl9lcnIoIkZhaWxlZCB0byBzZXQgdGlsaW5nIG1vZGU9JXUsIHN0cmlkZT0ldSwgZXJyPSVk XG4iLAorCQkgICAgICAgdGlsZS0+dGlsaW5nLCB0aWxlLT5zdHJpZGUsIGVycik7CisJCXJldHVy biBlcnI7CisJfQorCisJR0VNX0JVR19PTihpOTE1X2dlbV9vYmplY3RfZ2V0X3RpbGluZyhvYmop ICE9IHRpbGUtPnRpbGluZyk7CisJR0VNX0JVR19PTihpOTE1X2dlbV9vYmplY3RfZ2V0X3N0cmlk ZShvYmopICE9IHRpbGUtPnN0cmlkZSk7CisKKwlmb3JfZWFjaF9wcmltZV9udW1iZXJfZnJvbShw YWdlLCAxLCBucGFnZXMpIHsKKwkJc3RydWN0IGk5MTVfZ2d0dF92aWV3IHZpZXcgPQorCQkJY29t cHV0ZV9wYXJ0aWFsX3ZpZXcob2JqLCBwYWdlLCBNSU5fQ0hVTktfUEFHRVMpOworCQl1MzIgX19p b21lbSAqaW87CisJCXN0cnVjdCBwYWdlICpwOworCQl1bnNpZ25lZCBpbnQgbjsKKwkJdTY0IG9m ZnNldDsKKwkJdTMyICpjcHU7CisKKwkJR0VNX0JVR19PTih2aWV3LnBhcnRpYWwuc2l6ZSA+IG5y ZWFsKTsKKwkJY29uZF9yZXNjaGVkKCk7CisKKwkJZXJyID0gaTkxNV9nZW1fb2JqZWN0X3NldF90 b19ndHRfZG9tYWluKG9iaiwgdHJ1ZSk7CisJCWlmIChlcnIpIHsKKwkJCXByX2VycigiRmFpbGVk IHRvIGZsdXNoIHRvIEdUVCB3cml0ZSBkb21haW47IGVycj0lZFxuIiwKKwkJCSAgICAgICBlcnIp OworCQkJcmV0dXJuIGVycjsKKwkJfQorCisJCXZtYSA9IGk5MTVfZ2VtX29iamVjdF9nZ3R0X3Bp bihvYmosICZ2aWV3LCAwLCAwLCBQSU5fTUFQUEFCTEUpOworCQlpZiAoSVNfRVJSKHZtYSkpIHsK KwkJCXByX2VycigiRmFpbGVkIHRvIHBpbiBwYXJ0aWFsIHZpZXc6IG9mZnNldD0lbHU7IGVycj0l ZFxuIiwKKwkJCSAgICAgICBwYWdlLCAoaW50KVBUUl9FUlIodm1hKSk7CisJCQlyZXR1cm4gUFRS X0VSUih2bWEpOworCQl9CisKKwkJbiA9IHBhZ2UgLSB2aWV3LnBhcnRpYWwub2Zmc2V0OworCQlH RU1fQlVHX09OKG4gPj0gdmlldy5wYXJ0aWFsLnNpemUpOworCisJCWlvID0gaTkxNV92bWFfcGlu X2lvbWFwKHZtYSk7CisJCWk5MTVfdm1hX3VucGluKHZtYSk7CisJCWlmIChJU19FUlIoaW8pKSB7 CisJCQlwcl9lcnIoIkZhaWxlZCB0byBpb21hcCBwYXJ0aWFsIHZpZXc6IG9mZnNldD0lbHU7IGVy cj0lZFxuIiwKKwkJCSAgICAgICBwYWdlLCAoaW50KVBUUl9FUlIoaW8pKTsKKwkJCXJldHVybiBQ VFJfRVJSKGlvKTsKKwkJfQorCisJCWlvd3JpdGUzMihwYWdlLCBpbyArIG4gKiBQQUdFX1NJWkUg LyBzaXplb2YoKmlvKSk7CisJCWk5MTVfdm1hX3VucGluX2lvbWFwKHZtYSk7CisKKwkJb2Zmc2V0 ID0gdGlsZWRfb2Zmc2V0KHRpbGUsIHBhZ2UgPDwgUEFHRV9TSElGVCk7CisJCWlmIChvZmZzZXQg Pj0gb2JqLT5iYXNlLnNpemUpCisJCQljb250aW51ZTsKKworCQlpOTE1X2dlbV9vYmplY3RfZmx1 c2hfd3JpdGVfZG9tYWluKG9iaiwgfkk5MTVfR0VNX0RPTUFJTl9DUFUpOworCisJCXAgPSBpOTE1 X2dlbV9vYmplY3RfZ2V0X3BhZ2Uob2JqLCBvZmZzZXQgPj4gUEFHRV9TSElGVCk7CisJCWNwdSA9 IGttYXAocCkgKyBvZmZzZXRfaW5fcGFnZShvZmZzZXQpOworCQlkcm1fY2xmbHVzaF92aXJ0X3Jh bmdlKGNwdSwgc2l6ZW9mKCpjcHUpKTsKKwkJaWYgKCpjcHUgIT0gKHUzMilwYWdlKSB7CisJCQlw cl9lcnIoIlBhcnRpYWwgdmlldyBmb3IgJWx1IFsldV0gKG9mZnNldD0lbGx1LCBzaXplPSV1IFsl bGx1LCByb3cgc2l6ZSAldV0sIGZlbmNlPSVkLCB0aWxpbmc9JWQsIHN0cmlkZT0lZCkgbWlzYWxp Z25tZW50LCBleHBlY3RlZCB3cml0ZSB0byBwYWdlICglbGx1ICsgJXUgWzB4JWxseF0pIG9mIDB4 JXgsIGZvdW5kIDB4JXhcbiIsCisJCQkgICAgICAgcGFnZSwgbiwKKwkJCSAgICAgICB2aWV3LnBh cnRpYWwub2Zmc2V0LAorCQkJICAgICAgIHZpZXcucGFydGlhbC5zaXplLAorCQkJICAgICAgIHZt YS0+c2l6ZSA+PiBQQUdFX1NISUZULAorCQkJICAgICAgIHRpbGUtPnRpbGluZyA/IHRpbGVfcm93 X3BhZ2VzKG9iaikgOiAwLAorCQkJICAgICAgIHZtYS0+ZmVuY2UgPyB2bWEtPmZlbmNlLT5pZCA6 IC0xLCB0aWxlLT50aWxpbmcsIHRpbGUtPnN0cmlkZSwKKwkJCSAgICAgICBvZmZzZXQgPj4gUEFH RV9TSElGVCwKKwkJCSAgICAgICAodW5zaWduZWQgaW50KW9mZnNldF9pbl9wYWdlKG9mZnNldCks CisJCQkgICAgICAgb2Zmc2V0LAorCQkJICAgICAgICh1MzIpcGFnZSwgKmNwdSk7CisJCQllcnIg PSAtRUlOVkFMOworCQl9CisJCSpjcHUgPSAwOworCQlkcm1fY2xmbHVzaF92aXJ0X3JhbmdlKGNw dSwgc2l6ZW9mKCpjcHUpKTsKKwkJa3VubWFwKHApOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIGVy cjsKKworCQlpOTE1X3ZtYV9kZXN0cm95KHZtYSk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0 YXRpYyBpbnQgaWd0X3BhcnRpYWxfdGlsaW5nKHZvaWQgKmFyZykKK3sKKwljb25zdCB1bnNpZ25l ZCBpbnQgbnJlYWwgPSAxIDw8IDEyOyAvKiBsYXJnZXN0IHRpbGUgcm93IHgyICovCisJc3RydWN0 IGRybV9pOTE1X3ByaXZhdGUgKmk5MTUgPSBhcmc7CisJc3RydWN0IGRybV9pOTE1X2dlbV9vYmpl Y3QgKm9iajsKKwlpbnRlbF93YWtlcmVmX3Qgd2FrZXJlZjsKKwlpbnQgdGlsaW5nOworCWludCBl cnI7CisKKwkvKiBXZSB3YW50IHRvIGNoZWNrIHRoZSBwYWdlIG1hcHBpbmcgYW5kIGZlbmNpbmcg b2YgYSBsYXJnZSBvYmplY3QKKwkgKiBtbWFwcGVkIHRocm91Z2ggdGhlIEdUVC4gVGhlIG9iamVj dCB3ZSBjcmVhdGUgaXMgbGFyZ2VyIHRoYW4gY2FuCisJICogcG9zc2libHkgYmUgbW1hcGVkIGFz IGEgd2hvbGUsIGFuZCBzbyB3ZSBtdXN0IHVzZSBwYXJ0aWFsIEdHVFQgdm1hLgorCSAqIFdlIHRo ZW4gY2hlY2sgdGhhdCBhIHdyaXRlIHRocm91Z2ggZWFjaCBwYXJ0aWFsIEdHVFQgdm1hIGVuZHMg dXAKKwkgKiBpbiB0aGUgcmlnaHQgc2V0IG9mIHBhZ2VzIHdpdGhpbiB0aGUgb2JqZWN0LCBhbmQg d2l0aCB0aGUgZXhwZWN0ZWQKKwkgKiB0aWxpbmcsIHdoaWNoIHdlIHZlcmlmeSBieSBtYW51YWwg c3dpenpsaW5nLgorCSAqLworCisJb2JqID0gaHVnZV9nZW1fb2JqZWN0KGk5MTUsCisJCQkgICAg ICBucmVhbCA8PCBQQUdFX1NISUZULAorCQkJICAgICAgKDEgKyBuZXh0X3ByaW1lX251bWJlcihp OTE1LT5nZ3R0LnZtLnRvdGFsID4+IFBBR0VfU0hJRlQpKSA8PCBQQUdFX1NISUZUKTsKKwlpZiAo SVNfRVJSKG9iaikpCisJCXJldHVybiBQVFJfRVJSKG9iaik7CisKKwllcnIgPSBpOTE1X2dlbV9v YmplY3RfcGluX3BhZ2VzKG9iaik7CisJaWYgKGVycikgeworCQlwcl9lcnIoIkZhaWxlZCB0byBh bGxvY2F0ZSAldSBwYWdlcyAoJWx1IHRvdGFsKSwgZXJyPSVkXG4iLAorCQkgICAgICAgbnJlYWws IG9iai0+YmFzZS5zaXplIC8gUEFHRV9TSVpFLCBlcnIpOworCQlnb3RvIG91dDsKKwl9CisKKwlt dXRleF9sb2NrKCZpOTE1LT5kcm0uc3RydWN0X211dGV4KTsKKwl3YWtlcmVmID0gaW50ZWxfcnVu dGltZV9wbV9nZXQoaTkxNSk7CisKKwlpZiAoMSkgeworCQlJR1RfVElNRU9VVChlbmQpOworCQlz dHJ1Y3QgdGlsZSB0aWxlOworCisJCXRpbGUuaGVpZ2h0ID0gMTsKKwkJdGlsZS53aWR0aCA9IDE7 CisJCXRpbGUuc2l6ZSA9IDA7CisJCXRpbGUuc3RyaWRlID0gMDsKKwkJdGlsZS5zd2l6emxlID0g STkxNV9CSVRfNl9TV0laWkxFX05PTkU7CisJCXRpbGUudGlsaW5nID0gSTkxNV9USUxJTkdfTk9O RTsKKworCQllcnIgPSBjaGVja19wYXJ0aWFsX21hcHBpbmcob2JqLCAmdGlsZSwgZW5kKTsKKwkJ aWYgKGVyciAmJiBlcnIgIT0gLUVJTlRSKQorCQkJZ290byBvdXRfdW5sb2NrOworCX0KKworCWZv ciAodGlsaW5nID0gSTkxNV9USUxJTkdfWDsgdGlsaW5nIDw9IEk5MTVfVElMSU5HX1k7IHRpbGlu ZysrKSB7CisJCUlHVF9USU1FT1VUKGVuZCk7CisJCXVuc2lnbmVkIGludCBtYXhfcGl0Y2g7CisJ CXVuc2lnbmVkIGludCBwaXRjaDsKKwkJc3RydWN0IHRpbGUgdGlsZTsKKworCQlpZiAoaTkxNS0+ cXVpcmtzICYgUVVJUktfUElOX1NXSVpaTEVEX1BBR0VTKQorCQkJLyoKKwkJCSAqIFRoZSBzd2l6 emxpbmcgcGF0dGVybiBpcyBhY3R1YWxseSB1bmtub3duIGFzIGl0CisJCQkgKiB2YXJpZXMgYmFz ZWQgb24gcGh5c2ljYWwgYWRkcmVzcyBvZiBlYWNoIHBhZ2UuCisJCQkgKiBTZWUgaTkxNV9nZW1f ZGV0ZWN0X2JpdF82X3N3aXp6bGUoKS4KKwkJCSAqLworCQkJYnJlYWs7CisKKwkJdGlsZS50aWxp bmcgPSB0aWxpbmc7CisJCXN3aXRjaCAodGlsaW5nKSB7CisJCWNhc2UgSTkxNV9USUxJTkdfWDoK KwkJCXRpbGUuc3dpenpsZSA9IGk5MTUtPm1tLmJpdF82X3N3aXp6bGVfeDsKKwkJCWJyZWFrOwor CQljYXNlIEk5MTVfVElMSU5HX1k6CisJCQl0aWxlLnN3aXp6bGUgPSBpOTE1LT5tbS5iaXRfNl9z d2l6emxlX3k7CisJCQlicmVhazsKKwkJfQorCisJCUdFTV9CVUdfT04odGlsZS5zd2l6emxlID09 IEk5MTVfQklUXzZfU1dJWlpMRV9VTktOT1dOKTsKKwkJaWYgKHRpbGUuc3dpenpsZSA9PSBJOTE1 X0JJVF82X1NXSVpaTEVfOV8xNyB8fAorCQkgICAgdGlsZS5zd2l6emxlID09IEk5MTVfQklUXzZf U1dJWlpMRV85XzEwXzE3KQorCQkJY29udGludWU7CisKKwkJaWYgKElOVEVMX0dFTihpOTE1KSA8 PSAyKSB7CisJCQl0aWxlLmhlaWdodCA9IDE2OworCQkJdGlsZS53aWR0aCA9IDEyODsKKwkJCXRp bGUuc2l6ZSA9IDExOworCQl9IGVsc2UgaWYgKHRpbGUudGlsaW5nID09IEk5MTVfVElMSU5HX1kg JiYKKwkJCSAgIEhBU18xMjhfQllURV9ZX1RJTElORyhpOTE1KSkgeworCQkJdGlsZS5oZWlnaHQg PSAzMjsKKwkJCXRpbGUud2lkdGggPSAxMjg7CisJCQl0aWxlLnNpemUgPSAxMjsKKwkJfSBlbHNl IHsKKwkJCXRpbGUuaGVpZ2h0ID0gODsKKwkJCXRpbGUud2lkdGggPSA1MTI7CisJCQl0aWxlLnNp emUgPSAxMjsKKwkJfQorCisJCWlmIChJTlRFTF9HRU4oaTkxNSkgPCA0KQorCQkJbWF4X3BpdGNo ID0gODE5MiAvIHRpbGUud2lkdGg7CisJCWVsc2UgaWYgKElOVEVMX0dFTihpOTE1KSA8IDcpCisJ CQltYXhfcGl0Y2ggPSAxMjggKiBJOTY1X0ZFTkNFX01BWF9QSVRDSF9WQUwgLyB0aWxlLndpZHRo OworCQllbHNlCisJCQltYXhfcGl0Y2ggPSAxMjggKiBHRU43X0ZFTkNFX01BWF9QSVRDSF9WQUwg LyB0aWxlLndpZHRoOworCisJCWZvciAocGl0Y2ggPSBtYXhfcGl0Y2g7IHBpdGNoOyBwaXRjaCA+ Pj0gMSkgeworCQkJdGlsZS5zdHJpZGUgPSB0aWxlLndpZHRoICogcGl0Y2g7CisJCQllcnIgPSBj aGVja19wYXJ0aWFsX21hcHBpbmcob2JqLCAmdGlsZSwgZW5kKTsKKwkJCWlmIChlcnIgPT0gLUVJ TlRSKQorCQkJCWdvdG8gbmV4dF90aWxpbmc7CisJCQlpZiAoZXJyKQorCQkJCWdvdG8gb3V0X3Vu bG9jazsKKworCQkJaWYgKHBpdGNoID4gMiAmJiBJTlRFTF9HRU4oaTkxNSkgPj0gNCkgeworCQkJ CXRpbGUuc3RyaWRlID0gdGlsZS53aWR0aCAqIChwaXRjaCAtIDEpOworCQkJCWVyciA9IGNoZWNr X3BhcnRpYWxfbWFwcGluZyhvYmosICZ0aWxlLCBlbmQpOworCQkJCWlmIChlcnIgPT0gLUVJTlRS KQorCQkJCQlnb3RvIG5leHRfdGlsaW5nOworCQkJCWlmIChlcnIpCisJCQkJCWdvdG8gb3V0X3Vu bG9jazsKKwkJCX0KKworCQkJaWYgKHBpdGNoIDwgbWF4X3BpdGNoICYmIElOVEVMX0dFTihpOTE1 KSA+PSA0KSB7CisJCQkJdGlsZS5zdHJpZGUgPSB0aWxlLndpZHRoICogKHBpdGNoICsgMSk7CisJ CQkJZXJyID0gY2hlY2tfcGFydGlhbF9tYXBwaW5nKG9iaiwgJnRpbGUsIGVuZCk7CisJCQkJaWYg KGVyciA9PSAtRUlOVFIpCisJCQkJCWdvdG8gbmV4dF90aWxpbmc7CisJCQkJaWYgKGVycikKKwkJ CQkJZ290byBvdXRfdW5sb2NrOworCQkJfQorCQl9CisKKwkJaWYgKElOVEVMX0dFTihpOTE1KSA+ PSA0KSB7CisJCQlmb3JfZWFjaF9wcmltZV9udW1iZXIocGl0Y2gsIG1heF9waXRjaCkgeworCQkJ CXRpbGUuc3RyaWRlID0gdGlsZS53aWR0aCAqIHBpdGNoOworCQkJCWVyciA9IGNoZWNrX3BhcnRp YWxfbWFwcGluZyhvYmosICZ0aWxlLCBlbmQpOworCQkJCWlmIChlcnIgPT0gLUVJTlRSKQorCQkJ CQlnb3RvIG5leHRfdGlsaW5nOworCQkJCWlmIChlcnIpCisJCQkJCWdvdG8gb3V0X3VubG9jazsK KwkJCX0KKwkJfQorCituZXh0X3RpbGluZzogOworCX0KKworb3V0X3VubG9jazoKKwlpbnRlbF9y dW50aW1lX3BtX3B1dChpOTE1LCB3YWtlcmVmKTsKKwltdXRleF91bmxvY2soJmk5MTUtPmRybS5z dHJ1Y3RfbXV0ZXgpOworCWk5MTVfZ2VtX29iamVjdF91bnBpbl9wYWdlcyhvYmopOworb3V0Ogor CWk5MTVfZ2VtX29iamVjdF9wdXQob2JqKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50 IG1ha2Vfb2JqX2J1c3koc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaikKK3sKKwlzdHJ1 Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqaTkxNSA9IHRvX2k5MTUob2JqLT5iYXNlLmRldik7CisJc3Ry dWN0IGk5MTVfcmVxdWVzdCAqcnE7CisJc3RydWN0IGk5MTVfdm1hICp2bWE7CisJaW50IGVycjsK KworCXZtYSA9IGk5MTVfdm1hX2luc3RhbmNlKG9iaiwgJmk5MTUtPmdndHQudm0sIE5VTEwpOwor CWlmIChJU19FUlIodm1hKSkKKwkJcmV0dXJuIFBUUl9FUlIodm1hKTsKKworCWVyciA9IGk5MTVf dm1hX3Bpbih2bWEsIDAsIDAsIFBJTl9VU0VSKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOwor CisJcnEgPSBpOTE1X3JlcXVlc3RfYWxsb2MoaTkxNS0+ZW5naW5lW1JDUzBdLCBpOTE1LT5rZXJu ZWxfY29udGV4dCk7CisJaWYgKElTX0VSUihycSkpIHsKKwkJaTkxNV92bWFfdW5waW4odm1hKTsK KwkJcmV0dXJuIFBUUl9FUlIocnEpOworCX0KKworCWVyciA9IGk5MTVfdm1hX21vdmVfdG9fYWN0 aXZlKHZtYSwgcnEsIEVYRUNfT0JKRUNUX1dSSVRFKTsKKworCWk5MTVfcmVxdWVzdF9hZGQocnEp OworCisJX19pOTE1X2dlbV9vYmplY3RfcmVsZWFzZV91bmxlc3NfYWN0aXZlKG9iaik7CisJaTkx NV92bWFfdW5waW4odm1hKTsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBib29sIGFzc2Vy dF9tbWFwX29mZnNldChzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqaTkxNSwKKwkJCSAgICAgICB1 bnNpZ25lZCBsb25nIHNpemUsCisJCQkgICAgICAgaW50IGV4cGVjdGVkKQoreworCXN0cnVjdCBk cm1faTkxNV9nZW1fb2JqZWN0ICpvYmo7CisJaW50IGVycjsKKworCW9iaiA9IGk5MTVfZ2VtX29i amVjdF9jcmVhdGVfaW50ZXJuYWwoaTkxNSwgc2l6ZSk7CisJaWYgKElTX0VSUihvYmopKQorCQly ZXR1cm4gUFRSX0VSUihvYmopOworCisJZXJyID0gY3JlYXRlX21tYXBfb2Zmc2V0KG9iaik7CisJ aTkxNV9nZW1fb2JqZWN0X3B1dChvYmopOworCisJcmV0dXJuIGVyciA9PSBleHBlY3RlZDsKK30K Kworc3RhdGljIHZvaWQgZGlzYWJsZV9yZXRpcmVfd29ya2VyKHN0cnVjdCBkcm1faTkxNV9wcml2 YXRlICppOTE1KQoreworCWk5MTVfZ2VtX3Nocmlua2VyX3VucmVnaXN0ZXIoaTkxNSk7CisKKwlt dXRleF9sb2NrKCZpOTE1LT5kcm0uc3RydWN0X211dGV4KTsKKwlpZiAoIWk5MTUtPmd0LmFjdGl2 ZV9yZXF1ZXN0cysrKSB7CisJCWludGVsX3dha2VyZWZfdCB3YWtlcmVmOworCisJCXdpdGhfaW50 ZWxfcnVudGltZV9wbShpOTE1LCB3YWtlcmVmKQorCQkJaTkxNV9nZW1fdW5wYXJrKGk5MTUpOwor CX0KKwltdXRleF91bmxvY2soJmk5MTUtPmRybS5zdHJ1Y3RfbXV0ZXgpOworCisJY2FuY2VsX2Rl bGF5ZWRfd29ya19zeW5jKCZpOTE1LT5ndC5yZXRpcmVfd29yayk7CisJY2FuY2VsX2RlbGF5ZWRf d29ya19zeW5jKCZpOTE1LT5ndC5pZGxlX3dvcmspOworfQorCitzdGF0aWMgaW50IGlndF9tbWFw X29mZnNldF9leGhhdXN0aW9uKHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0 ZSAqaTkxNSA9IGFyZzsKKwlzdHJ1Y3QgZHJtX21tICptbSA9ICZpOTE1LT5kcm0udm1hX29mZnNl dF9tYW5hZ2VyLT52bV9hZGRyX3NwYWNlX21tOworCXN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0 ICpvYmo7CisJc3RydWN0IGRybV9tbV9ub2RlIHJlc3YsICpob2xlOworCXU2NCBob2xlX3N0YXJ0 LCBob2xlX2VuZDsKKwlpbnQgbG9vcCwgZXJyOworCisJLyogRGlzYWJsZSBiYWNrZ3JvdW5kIHJl YXBlciAqLworCWRpc2FibGVfcmV0aXJlX3dvcmtlcihpOTE1KTsKKwlHRU1fQlVHX09OKCFpOTE1 LT5ndC5hd2FrZSk7CisKKwkvKiBUcmltIHRoZSBkZXZpY2UgbW1hcCBzcGFjZSB0byBvbmx5IGEg cGFnZSAqLworCW1lbXNldCgmcmVzdiwgMCwgc2l6ZW9mKHJlc3YpKTsKKwlkcm1fbW1fZm9yX2Vh Y2hfaG9sZShob2xlLCBtbSwgaG9sZV9zdGFydCwgaG9sZV9lbmQpIHsKKwkJcmVzdi5zdGFydCA9 IGhvbGVfc3RhcnQ7CisJCXJlc3Yuc2l6ZSA9IGhvbGVfZW5kIC0gaG9sZV9zdGFydCAtIDE7IC8q IFBBR0VfU0laRSB1bml0cyAqLworCQllcnIgPSBkcm1fbW1fcmVzZXJ2ZV9ub2RlKG1tLCAmcmVz dik7CisJCWlmIChlcnIpIHsKKwkJCXByX2VycigiRmFpbGVkIHRvIHRyaW0gVk1BIG1hbmFnZXIs IGVycj0lZFxuIiwgZXJyKTsKKwkJCWdvdG8gb3V0X3Bhcms7CisJCX0KKwkJYnJlYWs7CisJfQor CisJLyogSnVzdCBmaXRzISAqLworCWlmICghYXNzZXJ0X21tYXBfb2Zmc2V0KGk5MTUsIFBBR0Vf U0laRSwgMCkpIHsKKwkJcHJfZXJyKCJVbmFibGUgdG8gaW5zZXJ0IG9iamVjdCBpbnRvIHNpbmds ZSBwYWdlIGhvbGVcbiIpOworCQllcnIgPSAtRUlOVkFMOworCQlnb3RvIG91dDsKKwl9CisKKwkv KiBUb28gbGFyZ2UgKi8KKwlpZiAoIWFzc2VydF9tbWFwX29mZnNldChpOTE1LCAyICogUEFHRV9T SVpFLCAtRU5PU1BDKSkgeworCQlwcl9lcnIoIlVuZXhwZWN0ZWRseSBzdWNjZWVkZWQgaW4gaW5z ZXJ0aW5nIHRvbyBsYXJnZSBvYmplY3QgaW50byBzaW5nbGUgcGFnZSBob2xlXG4iKTsKKwkJZXJy ID0gLUVJTlZBTDsKKwkJZ290byBvdXQ7CisJfQorCisJLyogRmlsbCB0aGUgaG9sZSwgZnVydGhl ciBhbGxvY2F0aW9uIGF0dGVtcHRzIHNob3VsZCB0aGVuIGZhaWwgKi8KKwlvYmogPSBpOTE1X2dl bV9vYmplY3RfY3JlYXRlX2ludGVybmFsKGk5MTUsIFBBR0VfU0laRSk7CisJaWYgKElTX0VSUihv YmopKSB7CisJCWVyciA9IFBUUl9FUlIob2JqKTsKKwkJZ290byBvdXQ7CisJfQorCisJZXJyID0g Y3JlYXRlX21tYXBfb2Zmc2V0KG9iaik7CisJaWYgKGVycikgeworCQlwcl9lcnIoIlVuYWJsZSB0 byBpbnNlcnQgb2JqZWN0IGludG8gcmVjbGFpbWVkIGhvbGVcbiIpOworCQlnb3RvIGVycl9vYmo7 CisJfQorCisJaWYgKCFhc3NlcnRfbW1hcF9vZmZzZXQoaTkxNSwgUEFHRV9TSVpFLCAtRU5PU1BD KSkgeworCQlwcl9lcnIoIlVuZXhwZWN0ZWRseSBzdWNjZWVkZWQgaW4gaW5zZXJ0aW5nIG9iamVj dCBpbnRvIG5vIGhvbGVzIVxuIik7CisJCWVyciA9IC1FSU5WQUw7CisJCWdvdG8gZXJyX29iajsK Kwl9CisKKwlpOTE1X2dlbV9vYmplY3RfcHV0KG9iaik7CisKKwkvKiBOb3cgZmlsbCB3aXRoIGJ1 c3kgZGVhZCBvYmplY3RzIHRoYXQgd2UgZXhwZWN0IHRvIHJlYXAgKi8KKwlmb3IgKGxvb3AgPSAw OyBsb29wIDwgMzsgbG9vcCsrKSB7CisJCWludGVsX3dha2VyZWZfdCB3YWtlcmVmOworCisJCWlm IChpOTE1X3Rlcm1pbmFsbHlfd2VkZ2VkKGk5MTUpKQorCQkJYnJlYWs7CisKKwkJb2JqID0gaTkx NV9nZW1fb2JqZWN0X2NyZWF0ZV9pbnRlcm5hbChpOTE1LCBQQUdFX1NJWkUpOworCQlpZiAoSVNf RVJSKG9iaikpIHsKKwkJCWVyciA9IFBUUl9FUlIob2JqKTsKKwkJCWdvdG8gb3V0OworCQl9CisK KwkJZXJyID0gMDsKKwkJbXV0ZXhfbG9jaygmaTkxNS0+ZHJtLnN0cnVjdF9tdXRleCk7CisJCXdp dGhfaW50ZWxfcnVudGltZV9wbShpOTE1LCB3YWtlcmVmKQorCQkJZXJyID0gbWFrZV9vYmpfYnVz eShvYmopOworCQltdXRleF91bmxvY2soJmk5MTUtPmRybS5zdHJ1Y3RfbXV0ZXgpOworCQlpZiAo ZXJyKSB7CisJCQlwcl9lcnIoIltsb29wICVkXSBGYWlsZWQgdG8gYnVzeSB0aGUgb2JqZWN0XG4i LCBsb29wKTsKKwkJCWdvdG8gZXJyX29iajsKKwkJfQorCisJCS8qIE5CIHdlIHJlbHkgb24gdGhl IF9hY3RpdmVfIHJlZmVyZW5jZSB0byBhY2Nlc3Mgb2JqIG5vdyAqLworCQlHRU1fQlVHX09OKCFp OTE1X2dlbV9vYmplY3RfaXNfYWN0aXZlKG9iaikpOworCQllcnIgPSBjcmVhdGVfbW1hcF9vZmZz ZXQob2JqKTsKKwkJaWYgKGVycikgeworCQkJcHJfZXJyKCJbbG9vcCAlZF0gY3JlYXRlX21tYXBf b2Zmc2V0IGZhaWxlZCB3aXRoIGVycj0lZFxuIiwKKwkJCSAgICAgICBsb29wLCBlcnIpOworCQkJ Z290byBvdXQ7CisJCX0KKwl9CisKK291dDoKKwlkcm1fbW1fcmVtb3ZlX25vZGUoJnJlc3YpOwor b3V0X3Bhcms6CisJbXV0ZXhfbG9jaygmaTkxNS0+ZHJtLnN0cnVjdF9tdXRleCk7CisJaWYgKC0t aTkxNS0+Z3QuYWN0aXZlX3JlcXVlc3RzKQorCQlxdWV1ZV9kZWxheWVkX3dvcmsoaTkxNS0+d3Es ICZpOTE1LT5ndC5yZXRpcmVfd29yaywgMCk7CisJZWxzZQorCQlxdWV1ZV9kZWxheWVkX3dvcmso aTkxNS0+d3EsICZpOTE1LT5ndC5pZGxlX3dvcmssIDApOworCW11dGV4X3VubG9jaygmaTkxNS0+ ZHJtLnN0cnVjdF9tdXRleCk7CisJaTkxNV9nZW1fc2hyaW5rZXJfcmVnaXN0ZXIoaTkxNSk7CisJ cmV0dXJuIGVycjsKK2Vycl9vYmo6CisJaTkxNV9nZW1fb2JqZWN0X3B1dChvYmopOworCWdvdG8g b3V0OworfQorCitpbnQgaTkxNV9nZW1fbW1hbl9saXZlX3NlbGZ0ZXN0cyhzdHJ1Y3QgZHJtX2k5 MTVfcHJpdmF0ZSAqaTkxNSkKK3sKKwlzdGF0aWMgY29uc3Qgc3RydWN0IGk5MTVfc3VidGVzdCB0 ZXN0c1tdID0geworCQlTVUJURVNUKGlndF9wYXJ0aWFsX3RpbGluZyksCisJCVNVQlRFU1QoaWd0 X21tYXBfb2Zmc2V0X2V4aGF1c3Rpb24pLAorCX07CisKKwlyZXR1cm4gaTkxNV9zdWJ0ZXN0cyh0 ZXN0cywgaTkxNSk7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2Ry di5oIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9kcnYuaAppbmRleCAyZDlhYWE0NWY5NTAu LjA5NWUwZGE0NDhkMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9kcnYu aAorKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2Rydi5oCkBAIC0yNzg4LDcgKzI3ODgs NiBAQCBpOTE1X2dlbV9vYmplY3RfZ2d0dF9waW4oc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3Qg Km9iaiwKIAkJCSB1NjQgZmxhZ3MpOwogCiBpbnQgaTkxNV9nZW1fb2JqZWN0X3VuYmluZChzdHJ1 Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqKTsKLXZvaWQgaTkxNV9nZW1fcmVsZWFzZV9tbWFw KHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmopOwogCiB2b2lkIGk5MTVfZ2VtX3J1bnRp bWVfc3VzcGVuZChzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYpOwogCmRpZmYgLS1n aXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2dlbS5jIGIvZHJpdmVycy9ncHUvZHJtL2k5 MTUvaTkxNV9nZW0uYwppbmRleCA2OWExZjNjZTE5ZjUuLmI3OGRjMzRlZmJhZiAxMDA2NDQKLS0t IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9nZW0uYworKysgYi9kcml2ZXJzL2dwdS9kcm0v aTkxNS9pOTE1X2dlbS5jCkBAIC00NzQsMTIgKzQ3NCw2IEBAIGk5MTVfZ2VtX2R1bWJfY3JlYXRl KHN0cnVjdCBkcm1fZmlsZSAqZmlsZSwKIAkJCSAgICAgICBhcmdzLT5zaXplLCAmYXJncy0+aGFu ZGxlKTsKIH0KIAotc3RhdGljIGJvb2wgZ3B1X3dyaXRlX25lZWRzX2NsZmx1c2goc3RydWN0IGRy bV9pOTE1X2dlbV9vYmplY3QgKm9iaikKLXsKLQlyZXR1cm4gIShvYmotPmNhY2hlX2xldmVsID09 IEk5MTVfQ0FDSEVfTk9ORSB8fAotCQkgb2JqLT5jYWNoZV9sZXZlbCA9PSBJOTE1X0NBQ0hFX1dU KTsKLX0KLQogLyoqCiAgKiBDcmVhdGVzIGEgbmV3IG1tIG9iamVjdCBhbmQgcmV0dXJucyBhIGhh bmRsZSB0byBpdC4KICAqIEBkZXY6IGRybSBkZXZpY2UgcG9pbnRlcgpAQCAtNDk5LDEzICs0OTMs NiBAQCBpOTE1X2dlbV9jcmVhdGVfaW9jdGwoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdm9pZCAq ZGF0YSwKIAkJCSAgICAgICBhcmdzLT5zaXplLCAmYXJncy0+aGFuZGxlKTsKIH0KIAotc3RhdGlj IGlubGluZSBlbnVtIGZiX29wX29yaWdpbgotZmJfd3JpdGVfb3JpZ2luKHN0cnVjdCBkcm1faTkx NV9nZW1fb2JqZWN0ICpvYmosIHVuc2lnbmVkIGludCBkb21haW4pCi17Ci0JcmV0dXJuIChkb21h aW4gPT0gSTkxNV9HRU1fRE9NQUlOX0dUVCA/Ci0JCW9iai0+ZnJvbnRidWZmZXJfZ2d0dF9vcmln aW4gOiBPUklHSU5fQ1BVKTsKLX0KLQogdm9pZCBpOTE1X2dlbV9mbHVzaF9nZ3R0X3dyaXRlcyhz dHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYpCiB7CiAJaW50ZWxfd2FrZXJlZl90IHdh a2VyZWY7CkBAIC01NDUsNDcgKzUzMiw2IEBAIHZvaWQgaTkxNV9nZW1fZmx1c2hfZ2d0dF93cml0 ZXMoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2KQogCX0KIH0KIAotc3RhdGljIHZv aWQKLWZsdXNoX3dyaXRlX2RvbWFpbihzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqLCB1 bnNpZ25lZCBpbnQgZmx1c2hfZG9tYWlucykKLXsKLQlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAq ZGV2X3ByaXYgPSB0b19pOTE1KG9iai0+YmFzZS5kZXYpOwotCXN0cnVjdCBpOTE1X3ZtYSAqdm1h OwotCi0JaWYgKCEob2JqLT53cml0ZV9kb21haW4gJiBmbHVzaF9kb21haW5zKSkKLQkJcmV0dXJu OwotCi0Jc3dpdGNoIChvYmotPndyaXRlX2RvbWFpbikgewotCWNhc2UgSTkxNV9HRU1fRE9NQUlO X0dUVDoKLQkJaTkxNV9nZW1fZmx1c2hfZ2d0dF93cml0ZXMoZGV2X3ByaXYpOwotCi0JCWludGVs X2ZiX29ial9mbHVzaChvYmosCi0JCQkJICAgZmJfd3JpdGVfb3JpZ2luKG9iaiwgSTkxNV9HRU1f RE9NQUlOX0dUVCkpOwotCi0JCWZvcl9lYWNoX2dndHRfdm1hKHZtYSwgb2JqKSB7Ci0JCQlpZiAo dm1hLT5pb21hcCkKLQkJCQljb250aW51ZTsKLQotCQkJaTkxNV92bWFfdW5zZXRfZ2d0dF93cml0 ZSh2bWEpOwotCQl9Ci0JCWJyZWFrOwotCi0JY2FzZSBJOTE1X0dFTV9ET01BSU5fV0M6Ci0JCXdt YigpOwotCQlicmVhazsKLQotCWNhc2UgSTkxNV9HRU1fRE9NQUlOX0NQVToKLQkJaTkxNV9nZW1f Y2xmbHVzaF9vYmplY3Qob2JqLCBJOTE1X0NMRkxVU0hfU1lOQyk7Ci0JCWJyZWFrOwotCi0JY2Fz ZSBJOTE1X0dFTV9ET01BSU5fUkVOREVSOgotCQlpZiAoZ3B1X3dyaXRlX25lZWRzX2NsZmx1c2go b2JqKSkKLQkJCW9iai0+Y2FjaGVfZGlydHkgPSB0cnVlOwotCQlicmVhazsKLQl9Ci0KLQlvYmot PndyaXRlX2RvbWFpbiA9IDA7Ci19Ci0KIC8qCiAgKiBQaW5zIHRoZSBzcGVjaWZpZWQgb2JqZWN0 J3MgcGFnZXMgYW5kIHN5bmNocm9uaXplcyB0aGUgb2JqZWN0IHdpdGgKICAqIEdQVSBhY2Nlc3Nl cy4gU2V0cyBuZWVkc19jbGZsdXNoIHRvIG5vbi16ZXJvIGlmIHRoZSBjYWxsZXIgc2hvdWxkCkBA IC02MjIsNyArNTY4LDcgQEAgaW50IGk5MTVfZ2VtX29ial9wcmVwYXJlX3NobWVtX3JlYWQoc3Ry dWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaiwKIAkJCWdvdG8gb3V0OwogCX0KIAotCWZsdXNo X3dyaXRlX2RvbWFpbihvYmosIH5JOTE1X0dFTV9ET01BSU5fQ1BVKTsKKwlpOTE1X2dlbV9vYmpl Y3RfZmx1c2hfd3JpdGVfZG9tYWluKG9iaiwgfkk5MTVfR0VNX0RPTUFJTl9DUFUpOwogCiAJLyog SWYgd2UncmUgbm90IGluIHRoZSBjcHUgcmVhZCBkb21haW4sIHNldCBvdXJzZWxmIGludG8gdGhl IGd0dAogCSAqIHJlYWQgZG9tYWluIGFuZCBtYW51YWxseSBmbHVzaCBjYWNoZWxpbmVzIChpZiBy ZXF1aXJlZCkuIFRoaXMKQEAgLTY3NCw3ICs2MjAsNyBAQCBpbnQgaTkxNV9nZW1fb2JqX3ByZXBh cmVfc2htZW1fd3JpdGUoc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaiwKIAkJCWdvdG8g b3V0OwogCX0KIAotCWZsdXNoX3dyaXRlX2RvbWFpbihvYmosIH5JOTE1X0dFTV9ET01BSU5fQ1BV KTsKKwlpOTE1X2dlbV9vYmplY3RfZmx1c2hfd3JpdGVfZG9tYWluKG9iaiwgfkk5MTVfR0VNX0RP TUFJTl9DUFUpOwogCiAJLyogSWYgd2UncmUgbm90IGluIHRoZSBjcHUgd3JpdGUgZG9tYWluLCBz ZXQgb3Vyc2VsZiBpbnRvIHRoZQogCSAqIGd0dCB3cml0ZSBkb21haW4gYW5kIG1hbnVhbGx5IGZs dXNoIGNhY2hlbGluZXMgKGFzIHJlcXVpcmVkKS4KQEAgLTEyNzcsNiArMTIyMywxMyBAQCBzdGF0 aWMgdm9pZCBpOTE1X2dlbV9vYmplY3RfYnVtcF9pbmFjdGl2ZV9nZ3R0KHN0cnVjdCBkcm1faTkx NV9nZW1fb2JqZWN0ICpvYmopCiAJc3Bpbl91bmxvY2soJmk5MTUtPm1tLm9ial9sb2NrKTsKIH0K IAorc3RhdGljIGlubGluZSBlbnVtIGZiX29wX29yaWdpbgorZmJfd3JpdGVfb3JpZ2luKHN0cnVj dCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmosIHVuc2lnbmVkIGludCBkb21haW4pCit7CisJcmV0 dXJuIChkb21haW4gPT0gSTkxNV9HRU1fRE9NQUlOX0dUVCA/CisJCW9iai0+ZnJvbnRidWZmZXJf Z2d0dF9vcmlnaW4gOiBPUklHSU5fQ1BVKTsKK30KKwogLyoqCiAgKiBDYWxsZWQgd2hlbiB1c2Vy IHNwYWNlIHByZXBhcmVzIHRvIHVzZSBhbiBvYmplY3Qgd2l0aCB0aGUgQ1BVLCBlaXRoZXIKICAq IHRocm91Z2ggdGhlIG1tYXAgaW9jdGwncyBtYXBwaW5nIG9yIGEgR1RUIG1hcHBpbmcuCkBAIC0x NDAwLDQyOSArMTM1Myw2IEBAIGk5MTVfZ2VtX3N3X2ZpbmlzaF9pb2N0bChzdHJ1Y3QgZHJtX2Rl dmljZSAqZGV2LCB2b2lkICpkYXRhLAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW5saW5lIGJv b2wKLV9fdm1hX21hdGNoZXMoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHN0cnVjdCBmaWxl ICpmaWxwLAotCSAgICAgIHVuc2lnbmVkIGxvbmcgYWRkciwgdW5zaWduZWQgbG9uZyBzaXplKQot ewotCWlmICh2bWEtPnZtX2ZpbGUgIT0gZmlscCkKLQkJcmV0dXJuIGZhbHNlOwotCi0JcmV0dXJu IHZtYS0+dm1fc3RhcnQgPT0gYWRkciAmJgotCSAgICAgICAodm1hLT52bV9lbmQgLSB2bWEtPnZt X3N0YXJ0KSA9PSBQQUdFX0FMSUdOKHNpemUpOwotfQotCi0vKioKLSAqIGk5MTVfZ2VtX21tYXBf aW9jdGwgLSBNYXBzIHRoZSBjb250ZW50cyBvZiBhbiBvYmplY3QsIHJldHVybmluZyB0aGUgYWRk cmVzcwotICoJCQkgaXQgaXMgbWFwcGVkIHRvLgotICogQGRldjogZHJtIGRldmljZQotICogQGRh dGE6IGlvY3RsIGRhdGEgYmxvYgotICogQGZpbGU6IGRybSBmaWxlCi0gKgotICogV2hpbGUgdGhl IG1hcHBpbmcgaG9sZHMgYSByZWZlcmVuY2Ugb24gdGhlIGNvbnRlbnRzIG9mIHRoZSBvYmplY3Qs IGl0IGRvZXNuJ3QKLSAqIGltcGx5IGEgcmVmIG9uIHRoZSBvYmplY3QgaXRzZWxmLgotICoKLSAq IElNUE9SVEFOVDoKLSAqCi0gKiBEUk0gZHJpdmVyIHdyaXRlcnMgd2hvIGxvb2sgYSB0aGlzIGZ1 bmN0aW9uIGFzIGFuIGV4YW1wbGUgZm9yIGhvdyB0byBkbyBHRU0KLSAqIG1tYXAgc3VwcG9ydCwg cGxlYXNlIGRvbid0IGltcGxlbWVudCBtbWFwIHN1cHBvcnQgbGlrZSBoZXJlLiBUaGUgbW9kZXJu IHdheQotICogdG8gaW1wbGVtZW50IERSTSBtbWFwIHN1cHBvcnQgaXMgd2l0aCBhbiBtbWFwIG9m ZnNldCBpb2N0bCAobGlrZQotICogaTkxNV9nZW1fbW1hcF9ndHQpIGFuZCB0aGVuIHVzaW5nIHRo ZSBtbWFwIHN5c2NhbGwgb24gdGhlIERSTSBmZCBkaXJlY3RseS4KLSAqIFRoYXQgd2F5IGRlYnVn IHRvb2xpbmcgbGlrZSB2YWxncmluZCB3aWxsIHVuZGVyc3RhbmQgd2hhdCdzIGdvaW5nIG9uLCBo aWRpbmcKLSAqIHRoZSBtbWFwIGNhbGwgaW4gYSBkcml2ZXIgcHJpdmF0ZSBpb2N0bCB3aWxsIGJy ZWFrIHRoYXQuIFRoZSBpOTE1IGRyaXZlciBvbmx5Ci0gKiBkb2VzIGNwdSBtbWFwcyB0aGlzIHdh eSBiZWNhdXNlIHdlIGRpZG4ndCBrbm93IGJldHRlci4KLSAqLwotaW50Ci1pOTE1X2dlbV9tbWFw X2lvY3RsKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEsCi0JCSAgICBzdHJ1Y3Qg ZHJtX2ZpbGUgKmZpbGUpCi17Ci0Jc3RydWN0IGRybV9pOTE1X2dlbV9tbWFwICphcmdzID0gZGF0 YTsKLQlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqOwotCXVuc2lnbmVkIGxvbmcgYWRk cjsKLQotCWlmIChhcmdzLT5mbGFncyAmIH4oSTkxNV9NTUFQX1dDKSkKLQkJcmV0dXJuIC1FSU5W QUw7Ci0KLQlpZiAoYXJncy0+ZmxhZ3MgJiBJOTE1X01NQVBfV0MgJiYgIWJvb3RfY3B1X2hhcyhY ODZfRkVBVFVSRV9QQVQpKQotCQlyZXR1cm4gLUVOT0RFVjsKLQotCW9iaiA9IGk5MTVfZ2VtX29i amVjdF9sb29rdXAoZmlsZSwgYXJncy0+aGFuZGxlKTsKLQlpZiAoIW9iaikKLQkJcmV0dXJuIC1F Tk9FTlQ7Ci0KLQkvKiBwcmltZSBvYmplY3RzIGhhdmUgbm8gYmFja2luZyBmaWxwIHRvIEdFTSBt bWFwCi0JICogcGFnZXMgZnJvbS4KLQkgKi8KLQlpZiAoIW9iai0+YmFzZS5maWxwKSB7Ci0JCWk5 MTVfZ2VtX29iamVjdF9wdXQob2JqKTsKLQkJcmV0dXJuIC1FTlhJTzsKLQl9Ci0KLQlhZGRyID0g dm1fbW1hcChvYmotPmJhc2UuZmlscCwgMCwgYXJncy0+c2l6ZSwKLQkJICAgICAgIFBST1RfUkVB RCB8IFBST1RfV1JJVEUsIE1BUF9TSEFSRUQsCi0JCSAgICAgICBhcmdzLT5vZmZzZXQpOwotCWlm IChJU19FUlJfVkFMVUUoYWRkcikpCi0JCWdvdG8gZXJyOwotCi0JaWYgKGFyZ3MtPmZsYWdzICYg STkxNV9NTUFQX1dDKSB7Ci0JCXN0cnVjdCBtbV9zdHJ1Y3QgKm1tID0gY3VycmVudC0+bW07Ci0J CXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hOwotCi0JCWlmIChkb3duX3dyaXRlX2tpbGxhYmxl KCZtbS0+bW1hcF9zZW0pKSB7Ci0JCQlpOTE1X2dlbV9vYmplY3RfcHV0KG9iaik7Ci0JCQlyZXR1 cm4gLUVJTlRSOwotCQl9Ci0JCXZtYSA9IGZpbmRfdm1hKG1tLCBhZGRyKTsKLQkJaWYgKHZtYSAm JiBfX3ZtYV9tYXRjaGVzKHZtYSwgb2JqLT5iYXNlLmZpbHAsIGFkZHIsIGFyZ3MtPnNpemUpKQot CQkJdm1hLT52bV9wYWdlX3Byb3QgPQotCQkJCXBncHJvdF93cml0ZWNvbWJpbmUodm1fZ2V0X3Bh Z2VfcHJvdCh2bWEtPnZtX2ZsYWdzKSk7Ci0JCWVsc2UKLQkJCWFkZHIgPSAtRU5PTUVNOwotCQl1 cF93cml0ZSgmbW0tPm1tYXBfc2VtKTsKLQkJaWYgKElTX0VSUl9WQUxVRShhZGRyKSkKLQkJCWdv dG8gZXJyOwotCi0JCS8qIFRoaXMgbWF5IHJhY2UsIGJ1dCB0aGF0J3Mgb2ssIGl0IG9ubHkgZ2V0 cyBzZXQgKi8KLQkJV1JJVEVfT05DRShvYmotPmZyb250YnVmZmVyX2dndHRfb3JpZ2luLCBPUklH SU5fQ1BVKTsKLQl9Ci0JaTkxNV9nZW1fb2JqZWN0X3B1dChvYmopOwotCi0JYXJncy0+YWRkcl9w dHIgPSAodTY0KWFkZHI7Ci0KLQlyZXR1cm4gMDsKLQotZXJyOgotCWk5MTVfZ2VtX29iamVjdF9w dXQob2JqKTsKLQotCXJldHVybiBhZGRyOwotfQotCi1zdGF0aWMgdW5zaWduZWQgaW50IHRpbGVf cm93X3BhZ2VzKGNvbnN0IHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmopCi17Ci0JcmV0 dXJuIGk5MTVfZ2VtX29iamVjdF9nZXRfdGlsZV9yb3dfc2l6ZShvYmopID4+IFBBR0VfU0hJRlQ7 Ci19Ci0KLS8qKgotICogaTkxNV9nZW1fbW1hcF9ndHRfdmVyc2lvbiAtIHJlcG9ydCB0aGUgY3Vy cmVudCBmZWF0dXJlIHNldCBmb3IgR1RUIG1tYXBzCi0gKgotICogQSBoaXN0b3J5IG9mIHRoZSBH VFQgbW1hcCBpbnRlcmZhY2U6Ci0gKgotICogMCAtIEV2ZXJ5dGhpbmcgaGFkIHRvIGZpdCBpbnRv IHRoZSBHVFQuIEJvdGggcGFydGllcyBvZiBhIG1lbWNweSBoYWQgdG8KLSAqICAgICBhbGlnbmVk IGFuZCBzdWl0YWJsZSBmb3IgZmVuY2luZywgYW5kIHN0aWxsIGZpdCBpbnRvIHRoZSBhdmFpbGFi bGUKLSAqICAgICBtYXBwYWJsZSBzcGFjZSBsZWZ0IGJ5IHRoZSBwaW5uZWQgZGlzcGxheSBvYmpl Y3RzLiBBIGNsYXNzaWMgcHJvYmxlbQotICogICAgIHdlIGNhbGxlZCB0aGUgcGFnZS1mYXVsdC1v Zi1kb29tIHdoZXJlIHdlIHdvdWxkIHBpbmctcG9uZyBiZXR3ZWVuCi0gKiAgICAgdHdvIG9iamVj dHMgdGhhdCBjb3VsZCBub3QgZml0IGluc2lkZSB0aGUgR1RUIGFuZCBzbyB0aGUgbWVtY3B5Ci0g KiAgICAgd291bGQgcGFnZSBvbmUgb2JqZWN0IGluIGF0IHRoZSBleHBlbnNlIG9mIHRoZSBvdGhl ciBiZXR3ZWVuIGV2ZXJ5Ci0gKiAgICAgc2luZ2xlIGJ5dGUuCi0gKgotICogMSAtIE9iamVjdHMg Y2FuIGJlIGFueSBzaXplLCBhbmQgaGF2ZSBhbnkgY29tcGF0aWJsZSBmZW5jaW5nIChYIFksIG9y IG5vbmUKLSAqICAgICBhcyBzZXQgdmlhIGk5MTVfZ2VtX3NldF90aWxpbmcoKSBbRFJNX0k5MTVf R0VNX1NFVF9USUxJTkddKS4gSWYgdGhlCi0gKiAgICAgb2JqZWN0IGlzIHRvbyBsYXJnZSBmb3Ig dGhlIGF2YWlsYWJsZSBzcGFjZSAob3Igc2ltcGx5IHRvbyBsYXJnZQotICogICAgIGZvciB0aGUg bWFwcGFibGUgYXBlcnR1cmUhKSwgYSB2aWV3IGlzIGNyZWF0ZWQgaW5zdGVhZCBhbmQgZmF1bHRl ZAotICogICAgIGludG8gdXNlcnNwYWNlLiAoVGhpcyB2aWV3IGlzIGFsaWduZWQgYW5kIHNpemVk IGFwcHJvcHJpYXRlbHkgZm9yCi0gKiAgICAgZmVuY2VkIGFjY2Vzcy4pCi0gKgotICogMiAtIFJl Y29nbmlzZSBXQyBhcyBhIHNlcGFyYXRlIGNhY2hlIGRvbWFpbiBzbyB0aGF0IHdlIGNhbiBmbHVz aCB0aGUKLSAqICAgICBkZWxheWVkIHdyaXRlcyB2aWEgR1RUIGJlZm9yZSBwZXJmb3JtaW5nIGRp cmVjdCBhY2Nlc3MgdmlhIFdDLgotICoKLSAqIFJlc3RyaWN0aW9uczoKLSAqCi0gKiAgKiBzbm9v cGFibGUgb2JqZWN0cyBjYW5ub3QgYmUgYWNjZXNzZWQgdmlhIHRoZSBHVFQuIEl0IGNhbiBjYXVz ZSBtYWNoaW5lCi0gKiAgICBoYW5ncyBvbiBzb21lIGFyY2hpdGVjdHVyZXMsIGNvcnJ1cHRpb24g b24gb3RoZXJzLiBBbiBhdHRlbXB0IHRvIHNlcnZpY2UKLSAqICAgIGEgR1RUIHBhZ2UgZmF1bHQg ZnJvbSBhIHNub29wYWJsZSBvYmplY3Qgd2lsbCBnZW5lcmF0ZSBhIFNJR0JVUy4KLSAqCi0gKiAg KiB0aGUgb2JqZWN0IG11c3QgYmUgYWJsZSB0byBmaXQgaW50byBSQU0gKHBoeXNpY2FsIG1lbW9y eSwgdGhvdWdoIG5vCi0gKiAgICBsaW1pdGVkIHRvIHRoZSBtYXBwYWJsZSBhcGVydHVyZSkuCi0g KgotICoKLSAqIENhdmVhdHM6Ci0gKgotICogICogYSBuZXcgR1RUIHBhZ2UgZmF1bHQgd2lsbCBz eW5jaHJvbml6ZSByZW5kZXJpbmcgZnJvbSB0aGUgR1BVIGFuZCBmbHVzaAotICogICAgYWxsIGRh dGEgdG8gc3lzdGVtIG1lbW9yeS4gU3Vic2VxdWVudCBhY2Nlc3Mgd2lsbCBub3QgYmUgc3luY2hy b25pemVkLgotICoKLSAqICAqIGFsbCBtYXBwaW5ncyBhcmUgcmV2b2tlZCBvbiBydW50aW1lIGRl dmljZSBzdXNwZW5kLgotICoKLSAqICAqIHRoZXJlIGFyZSBvbmx5IDgsIDE2IG9yIDMyIGZlbmNl IHJlZ2lzdGVycyB0byBzaGFyZSBiZXR3ZWVuIGFsbCB1c2VycwotICogICAgKG9sZGVyIG1hY2hp bmVzIHJlcXVpcmUgZmVuY2UgcmVnaXN0ZXIgZm9yIGRpc3BsYXkgYW5kIGJsaXR0ZXIgYWNjZXNz Ci0gKiAgICBhcyB3ZWxsKS4gQ29udGVudGlvbiBvZiB0aGUgZmVuY2UgcmVnaXN0ZXJzIHdpbGwg Y2F1c2UgdGhlIHByZXZpb3VzIHVzZXJzCi0gKiAgICB0byBiZSB1bm1hcHBlZCBhbmQgYW55IG5l dyBhY2Nlc3Mgd2lsbCBnZW5lcmF0ZSBuZXcgcGFnZSBmYXVsdHMuCi0gKgotICogICogcnVubmlu ZyBvdXQgb2YgbWVtb3J5IHdoaWxlIHNlcnZpY2luZyBhIGZhdWx0IG1heSBnZW5lcmF0ZSBhIFNJ R0JVUywKLSAqICAgIHJhdGhlciB0aGFuIHRoZSBleHBlY3RlZCBTSUdTRUdWLgotICovCi1pbnQg aTkxNV9nZW1fbW1hcF9ndHRfdmVyc2lvbih2b2lkKQotewotCXJldHVybiAyOwotfQotCi1zdGF0 aWMgaW5saW5lIHN0cnVjdCBpOTE1X2dndHRfdmlldwotY29tcHV0ZV9wYXJ0aWFsX3ZpZXcoY29u c3Qgc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaiwKLQkJICAgICBwZ29mZl90IHBhZ2Vf b2Zmc2V0LAotCQkgICAgIHVuc2lnbmVkIGludCBjaHVuaykKLXsKLQlzdHJ1Y3QgaTkxNV9nZ3R0 X3ZpZXcgdmlldzsKLQotCWlmIChpOTE1X2dlbV9vYmplY3RfaXNfdGlsZWQob2JqKSkKLQkJY2h1 bmsgPSByb3VuZHVwKGNodW5rLCB0aWxlX3Jvd19wYWdlcyhvYmopKTsKLQotCXZpZXcudHlwZSA9 IEk5MTVfR0dUVF9WSUVXX1BBUlRJQUw7Ci0Jdmlldy5wYXJ0aWFsLm9mZnNldCA9IHJvdW5kZG93 bihwYWdlX29mZnNldCwgY2h1bmspOwotCXZpZXcucGFydGlhbC5zaXplID0KLQkJbWluX3QodW5z aWduZWQgaW50LCBjaHVuaywKLQkJICAgICAgKG9iai0+YmFzZS5zaXplID4+IFBBR0VfU0hJRlQp IC0gdmlldy5wYXJ0aWFsLm9mZnNldCk7Ci0KLQkvKiBJZiB0aGUgcGFydGlhbCBjb3ZlcnMgdGhl IGVudGlyZSBvYmplY3QsIGp1c3QgY3JlYXRlIGEgbm9ybWFsIFZNQS4gKi8KLQlpZiAoY2h1bmsg Pj0gb2JqLT5iYXNlLnNpemUgPj4gUEFHRV9TSElGVCkKLQkJdmlldy50eXBlID0gSTkxNV9HR1RU X1ZJRVdfTk9STUFMOwotCi0JcmV0dXJuIHZpZXc7Ci19Ci0KLS8qKgotICogaTkxNV9nZW1fZmF1 bHQgLSBmYXVsdCBhIHBhZ2UgaW50byB0aGUgR1RUCi0gKiBAdm1mOiBmYXVsdCBpbmZvCi0gKgot ICogVGhlIGZhdWx0IGhhbmRsZXIgaXMgc2V0IHVwIGJ5IGRybV9nZW1fbW1hcCgpIHdoZW4gYSBv YmplY3QgaXMgR1RUIG1hcHBlZAotICogZnJvbSB1c2Vyc3BhY2UuICBUaGUgZmF1bHQgaGFuZGxl ciB0YWtlcyBjYXJlIG9mIGJpbmRpbmcgdGhlIG9iamVjdCB0bwotICogdGhlIEdUVCAoaWYgbmVl ZGVkKSwgYWxsb2NhdGluZyBhbmQgcHJvZ3JhbW1pbmcgYSBmZW5jZSByZWdpc3RlciAoYWdhaW4s Ci0gKiBvbmx5IGlmIG5lZWRlZCBiYXNlZCBvbiB3aGV0aGVyIHRoZSBvbGQgcmVnIGlzIHN0aWxs IHZhbGlkIG9yIHRoZSBvYmplY3QKLSAqIGlzIHRpbGVkKSBhbmQgaW5zZXJ0aW5nIGEgbmV3IFBU RSBpbnRvIHRoZSBmYXVsdGluZyBwcm9jZXNzLgotICoKLSAqIE5vdGUgdGhhdCB0aGUgZmF1bHRp bmcgcHJvY2VzcyBtYXkgaW52b2x2ZSBldmljdGluZyBleGlzdGluZyBvYmplY3RzCi0gKiBmcm9t IHRoZSBHVFQgYW5kL29yIGZlbmNlIHJlZ2lzdGVycyB0byBtYWtlIHJvb20uICBTbyBwZXJmb3Jt YW5jZSBtYXkKLSAqIHN1ZmZlciBpZiB0aGUgR1RUIHdvcmtpbmcgc2V0IGlzIGxhcmdlIG9yIHRo ZXJlIGFyZSBmZXcgZmVuY2UgcmVnaXN0ZXJzCi0gKiBsZWZ0LgotICoKLSAqIFRoZSBjdXJyZW50 IGZlYXR1cmUgc2V0IHN1cHBvcnRlZCBieSBpOTE1X2dlbV9mYXVsdCgpIGFuZCB0aHVzIEdUVCBt bWFwcwotICogaXMgZXhwb3NlZCB2aWEgSTkxNV9QQVJBTV9NTUFQX0dUVF9WRVJTSU9OIChzZWUg aTkxNV9nZW1fbW1hcF9ndHRfdmVyc2lvbikuCi0gKi8KLXZtX2ZhdWx0X3QgaTkxNV9nZW1fZmF1 bHQoc3RydWN0IHZtX2ZhdWx0ICp2bWYpCi17Ci0jZGVmaW5lIE1JTl9DSFVOS19QQUdFUyAoU1pf MU0gPj4gUEFHRV9TSElGVCkKLQlzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKmFyZWEgPSB2bWYtPnZt YTsKLQlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqID0gdG9faW50ZWxfYm8oYXJlYS0+ dm1fcHJpdmF0ZV9kYXRhKTsKLQlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gb2JqLT5iYXNlLmRl djsKLQlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSB0b19pOTE1KGRldik7Ci0J c3RydWN0IGk5MTVfZ2d0dCAqZ2d0dCA9ICZkZXZfcHJpdi0+Z2d0dDsKLQlib29sIHdyaXRlID0g YXJlYS0+dm1fZmxhZ3MgJiBWTV9XUklURTsKLQlpbnRlbF93YWtlcmVmX3Qgd2FrZXJlZjsKLQlz dHJ1Y3QgaTkxNV92bWEgKnZtYTsKLQlwZ29mZl90IHBhZ2Vfb2Zmc2V0OwotCWludCBzcmN1Owot CWludCByZXQ7Ci0KLQkvKiBTYW5pdHkgY2hlY2sgdGhhdCB3ZSBhbGxvdyB3cml0aW5nIGludG8g dGhpcyBvYmplY3QgKi8KLQlpZiAoaTkxNV9nZW1fb2JqZWN0X2lzX3JlYWRvbmx5KG9iaikgJiYg d3JpdGUpCi0JCXJldHVybiBWTV9GQVVMVF9TSUdCVVM7Ci0KLQkvKiBXZSBkb24ndCB1c2Ugdm1m LT5wZ29mZiBzaW5jZSB0aGF0IGhhcyB0aGUgZmFrZSBvZmZzZXQgKi8KLQlwYWdlX29mZnNldCA9 ICh2bWYtPmFkZHJlc3MgLSBhcmVhLT52bV9zdGFydCkgPj4gUEFHRV9TSElGVDsKLQotCXRyYWNl X2k5MTVfZ2VtX29iamVjdF9mYXVsdChvYmosIHBhZ2Vfb2Zmc2V0LCB0cnVlLCB3cml0ZSk7Ci0K LQkvKiBUcnkgdG8gZmx1c2ggdGhlIG9iamVjdCBvZmYgdGhlIEdQVSBmaXJzdCB3aXRob3V0IGhv bGRpbmcgdGhlIGxvY2suCi0JICogVXBvbiBhY3F1aXJpbmcgdGhlIGxvY2ssIHdlIHdpbGwgcGVy Zm9ybSBvdXIgc2FuaXR5IGNoZWNrcyBhbmQgdGhlbgotCSAqIHJlcGVhdCB0aGUgZmx1c2ggaG9s ZGluZyB0aGUgbG9jayBpbiB0aGUgbm9ybWFsIG1hbm5lciB0byBjYXRjaCBjYXNlcwotCSAqIHdo ZXJlIHdlIGFyZSBnYXp1bXBlZC4KLQkgKi8KLQlyZXQgPSBpOTE1X2dlbV9vYmplY3Rfd2FpdChv YmosCi0JCQkJICAgSTkxNV9XQUlUX0lOVEVSUlVQVElCTEUsCi0JCQkJICAgTUFYX1NDSEVEVUxF X1RJTUVPVVQpOwotCWlmIChyZXQpCi0JCWdvdG8gZXJyOwotCi0JcmV0ID0gaTkxNV9nZW1fb2Jq ZWN0X3Bpbl9wYWdlcyhvYmopOwotCWlmIChyZXQpCi0JCWdvdG8gZXJyOwotCi0Jd2FrZXJlZiA9 IGludGVsX3J1bnRpbWVfcG1fZ2V0KGRldl9wcml2KTsKLQotCXNyY3UgPSBpOTE1X3Jlc2V0X3Ry eWxvY2soZGV2X3ByaXYpOwotCWlmIChzcmN1IDwgMCkgewotCQlyZXQgPSBzcmN1OwotCQlnb3Rv IGVycl9ycG07Ci0JfQotCi0JcmV0ID0gaTkxNV9tdXRleF9sb2NrX2ludGVycnVwdGlibGUoZGV2 KTsKLQlpZiAocmV0KQotCQlnb3RvIGVycl9yZXNldDsKLQotCS8qIEFjY2VzcyB0byBzbm9vcGFi bGUgcGFnZXMgdGhyb3VnaCB0aGUgR1RUIGlzIGluY29oZXJlbnQuICovCi0JaWYgKG9iai0+Y2Fj aGVfbGV2ZWwgIT0gSTkxNV9DQUNIRV9OT05FICYmICFIQVNfTExDKGRldl9wcml2KSkgewotCQly ZXQgPSAtRUZBVUxUOwotCQlnb3RvIGVycl91bmxvY2s7Ci0JfQotCi0JLyogTm93IHBpbiBpdCBp bnRvIHRoZSBHVFQgYXMgbmVlZGVkICovCi0Jdm1hID0gaTkxNV9nZW1fb2JqZWN0X2dndHRfcGlu KG9iaiwgTlVMTCwgMCwgMCwKLQkJCQkgICAgICAgUElOX01BUFBBQkxFIHwKLQkJCQkgICAgICAg UElOX05PTkJMT0NLIHwKLQkJCQkgICAgICAgUElOX05PTkZBVUxUKTsKLQlpZiAoSVNfRVJSKHZt YSkpIHsKLQkJLyogVXNlIGEgcGFydGlhbCB2aWV3IGlmIGl0IGlzIGJpZ2dlciB0aGFuIGF2YWls YWJsZSBzcGFjZSAqLwotCQlzdHJ1Y3QgaTkxNV9nZ3R0X3ZpZXcgdmlldyA9Ci0JCQljb21wdXRl X3BhcnRpYWxfdmlldyhvYmosIHBhZ2Vfb2Zmc2V0LCBNSU5fQ0hVTktfUEFHRVMpOwotCQl1bnNp Z25lZCBpbnQgZmxhZ3M7Ci0KLQkJZmxhZ3MgPSBQSU5fTUFQUEFCTEU7Ci0JCWlmICh2aWV3LnR5 cGUgPT0gSTkxNV9HR1RUX1ZJRVdfTk9STUFMKQotCQkJZmxhZ3MgfD0gUElOX05PTkJMT0NLOyAv KiBhdm9pZCB3YXJuaW5ncyBmb3IgcGlubmVkICovCi0KLQkJLyoKLQkJICogVXNlcnNwYWNlIGlz IG5vdyB3cml0aW5nIHRocm91Z2ggYW4gdW50cmFja2VkIFZNQSwgYWJhbmRvbgotCQkgKiBhbGwg aG9wZSB0aGF0IHRoZSBoYXJkd2FyZSBpcyBhYmxlIHRvIHRyYWNrIGZ1dHVyZSB3cml0ZXMuCi0J CSAqLwotCQlvYmotPmZyb250YnVmZmVyX2dndHRfb3JpZ2luID0gT1JJR0lOX0NQVTsKLQotCQl2 bWEgPSBpOTE1X2dlbV9vYmplY3RfZ2d0dF9waW4ob2JqLCAmdmlldywgMCwgMCwgZmxhZ3MpOwot CQlpZiAoSVNfRVJSKHZtYSkgJiYgIXZpZXcudHlwZSkgewotCQkJZmxhZ3MgPSBQSU5fTUFQUEFC TEU7Ci0JCQl2aWV3LnR5cGUgPSBJOTE1X0dHVFRfVklFV19QQVJUSUFMOwotCQkJdm1hID0gaTkx NV9nZW1fb2JqZWN0X2dndHRfcGluKG9iaiwgJnZpZXcsIDAsIDAsIGZsYWdzKTsKLQkJfQotCX0K LQlpZiAoSVNfRVJSKHZtYSkpIHsKLQkJcmV0ID0gUFRSX0VSUih2bWEpOwotCQlnb3RvIGVycl91 bmxvY2s7Ci0JfQotCi0JcmV0ID0gaTkxNV9nZW1fb2JqZWN0X3NldF90b19ndHRfZG9tYWluKG9i aiwgd3JpdGUpOwotCWlmIChyZXQpCi0JCWdvdG8gZXJyX3VucGluOwotCi0JcmV0ID0gaTkxNV92 bWFfcGluX2ZlbmNlKHZtYSk7Ci0JaWYgKHJldCkKLQkJZ290byBlcnJfdW5waW47Ci0KLQkvKiBG aW5hbGx5LCByZW1hcCBpdCB1c2luZyB0aGUgbmV3IEdUVCBvZmZzZXQgKi8KLQlyZXQgPSByZW1h cF9pb19tYXBwaW5nKGFyZWEsCi0JCQkgICAgICAgYXJlYS0+dm1fc3RhcnQgKyAodm1hLT5nZ3R0 X3ZpZXcucGFydGlhbC5vZmZzZXQgPDwgUEFHRV9TSElGVCksCi0JCQkgICAgICAgKGdndHQtPmdt YWRyLnN0YXJ0ICsgdm1hLT5ub2RlLnN0YXJ0KSA+PiBQQUdFX1NISUZULAotCQkJICAgICAgIG1p bl90KHU2NCwgdm1hLT5zaXplLCBhcmVhLT52bV9lbmQgLSBhcmVhLT52bV9zdGFydCksCi0JCQkg ICAgICAgJmdndHQtPmlvbWFwKTsKLQlpZiAocmV0KQotCQlnb3RvIGVycl9mZW5jZTsKLQotCS8q IE1hcmsgYXMgYmVpbmcgbW1hcHBlZCBpbnRvIHVzZXJzcGFjZSBmb3IgbGF0ZXIgcmV2b2NhdGlv biAqLwotCWFzc2VydF9ycG1fd2FrZWxvY2tfaGVsZChkZXZfcHJpdik7Ci0JaWYgKCFpOTE1X3Zt YV9zZXRfdXNlcmZhdWx0KHZtYSkgJiYgIW9iai0+dXNlcmZhdWx0X2NvdW50KyspCi0JCWxpc3Rf YWRkKCZvYmotPnVzZXJmYXVsdF9saW5rLCAmZGV2X3ByaXYtPm1tLnVzZXJmYXVsdF9saXN0KTsK LQlHRU1fQlVHX09OKCFvYmotPnVzZXJmYXVsdF9jb3VudCk7Ci0KLQlpOTE1X3ZtYV9zZXRfZ2d0 dF93cml0ZSh2bWEpOwotCi1lcnJfZmVuY2U6Ci0JaTkxNV92bWFfdW5waW5fZmVuY2Uodm1hKTsK LWVycl91bnBpbjoKLQlfX2k5MTVfdm1hX3VucGluKHZtYSk7Ci1lcnJfdW5sb2NrOgotCW11dGV4 X3VubG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOwotZXJyX3Jlc2V0OgotCWk5MTVfcmVzZXRfdW5s b2NrKGRldl9wcml2LCBzcmN1KTsKLWVycl9ycG06Ci0JaW50ZWxfcnVudGltZV9wbV9wdXQoZGV2 X3ByaXYsIHdha2VyZWYpOwotCWk5MTVfZ2VtX29iamVjdF91bnBpbl9wYWdlcyhvYmopOwotZXJy OgotCXN3aXRjaCAocmV0KSB7Ci0JY2FzZSAtRUlPOgotCQkvKgotCQkgKiBXZSBlYXQgZXJyb3Jz IHdoZW4gdGhlIGdwdSBpcyB0ZXJtaW5hbGx5IHdlZGdlZCB0byBhdm9pZAotCQkgKiB1c2Vyc3Bh Y2UgdW5kdWx5IGNyYXNoaW5nIChnbCBoYXMgbm8gcHJvdmlzaW9ucyBmb3IgbW1hcHMgdG8KLQkJ ICogZmFpbCkuIEJ1dCBhbnkgb3RoZXIgLUVJTyBpc24ndCBvdXJzIChlLmcuIHN3YXAgaW4gZmFp bHVyZSkKLQkJICogYW5kIHNvIG5lZWRzIHRvIGJlIHJlcG9ydGVkLgotCQkgKi8KLQkJaWYgKCFp OTE1X3Rlcm1pbmFsbHlfd2VkZ2VkKGRldl9wcml2KSkKLQkJCXJldHVybiBWTV9GQVVMVF9TSUdC VVM7Ci0JCS8qIGVsc2U6IGZhbGwgdGhyb3VnaCAqLwotCWNhc2UgLUVBR0FJTjoKLQkJLyoKLQkJ ICogRUFHQUlOIG1lYW5zIHRoZSBncHUgaXMgaHVuZyBhbmQgd2UnbGwgd2FpdCBmb3IgdGhlIGVy cm9yCi0JCSAqIGhhbmRsZXIgdG8gcmVzZXQgZXZlcnl0aGluZyB3aGVuIHJlLWZhdWx0aW5nIGlu Ci0JCSAqIGk5MTVfbXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlLgotCQkgKi8KLQljYXNlIDA6Ci0J Y2FzZSAtRVJFU1RBUlRTWVM6Ci0JY2FzZSAtRUlOVFI6Ci0JY2FzZSAtRUJVU1k6Ci0JCS8qCi0J CSAqIEVCVVNZIGlzIG9rOiB0aGlzIGp1c3QgbWVhbnMgdGhhdCBhbm90aGVyIHRocmVhZAotCQkg KiBhbHJlYWR5IGRpZCB0aGUgam9iLgotCQkgKi8KLQkJcmV0dXJuIFZNX0ZBVUxUX05PUEFHRTsK LQljYXNlIC1FTk9NRU06Ci0JCXJldHVybiBWTV9GQVVMVF9PT007Ci0JY2FzZSAtRU5PU1BDOgot CWNhc2UgLUVGQVVMVDoKLQkJcmV0dXJuIFZNX0ZBVUxUX1NJR0JVUzsKLQlkZWZhdWx0OgotCQlX QVJOX09OQ0UocmV0LCAidW5oYW5kbGVkIGVycm9yIGluIGk5MTVfZ2VtX2ZhdWx0OiAlaVxuIiwg cmV0KTsKLQkJcmV0dXJuIFZNX0ZBVUxUX1NJR0JVUzsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIF9f aTkxNV9nZW1fb2JqZWN0X3JlbGVhc2VfbW1hcChzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAq b2JqKQotewotCXN0cnVjdCBpOTE1X3ZtYSAqdm1hOwotCi0JR0VNX0JVR19PTighb2JqLT51c2Vy ZmF1bHRfY291bnQpOwotCi0Jb2JqLT51c2VyZmF1bHRfY291bnQgPSAwOwotCWxpc3RfZGVsKCZv YmotPnVzZXJmYXVsdF9saW5rKTsKLQlkcm1fdm1hX25vZGVfdW5tYXAoJm9iai0+YmFzZS52bWFf bm9kZSwKLQkJCSAgIG9iai0+YmFzZS5kZXYtPmFub25faW5vZGUtPmlfbWFwcGluZyk7Ci0KLQlm b3JfZWFjaF9nZ3R0X3ZtYSh2bWEsIG9iaikKLQkJaTkxNV92bWFfdW5zZXRfdXNlcmZhdWx0KHZt YSk7Ci19Ci0KLS8qKgotICogaTkxNV9nZW1fcmVsZWFzZV9tbWFwIC0gcmVtb3ZlIHBoeXNpY2Fs IHBhZ2UgbWFwcGluZ3MKLSAqIEBvYmo6IG9iaiBpbiBxdWVzdGlvbgotICoKLSAqIFByZXNlcnZl IHRoZSByZXNlcnZhdGlvbiBvZiB0aGUgbW1hcHBpbmcgd2l0aCB0aGUgRFJNIGNvcmUgY29kZSwg YnV0Ci0gKiByZWxpbnF1aXNoIG93bmVyc2hpcCBvZiB0aGUgcGFnZXMgYmFjayB0byB0aGUgc3lz dGVtLgotICoKLSAqIEl0IGlzIHZpdGFsIHRoYXQgd2UgcmVtb3ZlIHRoZSBwYWdlIG1hcHBpbmcg aWYgd2UgaGF2ZSBtYXBwZWQgYSB0aWxlZAotICogb2JqZWN0IHRocm91Z2ggdGhlIEdUVCBhbmQg dGhlbiBsb3NlIHRoZSBmZW5jZSByZWdpc3RlciBkdWUgdG8KLSAqIHJlc291cmNlIHByZXNzdXJl LiBTaW1pbGFybHkgaWYgdGhlIG9iamVjdCBoYXMgYmVlbiBtb3ZlZCBvdXQgb2YgdGhlCi0gKiBh cGVydHVyZSwgdGhhbiBwYWdlcyBtYXBwZWQgaW50byB1c2Vyc3BhY2UgbXVzdCBiZSByZXZva2Vk LiBSZW1vdmluZyB0aGUKLSAqIG1hcHBpbmcgd2lsbCB0aGVuIHRyaWdnZXIgYSBwYWdlIGZhdWx0 IG9uIHRoZSBuZXh0IHVzZXIgYWNjZXNzLCBhbGxvd2luZwotICogZml4dXAgYnkgaTkxNV9nZW1f ZmF1bHQoKS4KLSAqLwotdm9pZAotaTkxNV9nZW1fcmVsZWFzZV9tbWFwKHN0cnVjdCBkcm1faTkx NV9nZW1fb2JqZWN0ICpvYmopCi17Ci0Jc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmk5MTUgPSB0 b19pOTE1KG9iai0+YmFzZS5kZXYpOwotCWludGVsX3dha2VyZWZfdCB3YWtlcmVmOwotCi0JLyog U2VyaWFsaXNhdGlvbiBiZXR3ZWVuIHVzZXIgR1RUIGFjY2VzcyBhbmQgb3VyIGNvZGUgZGVwZW5k cyB1cG9uCi0JICogcmV2b2tpbmcgdGhlIENQVSdzIFBURSB3aGlsc3QgdGhlIG11dGV4IGlzIGhl bGQuIFRoZSBuZXh0IHVzZXIKLQkgKiBwYWdlZmF1bHQgdGhlbiBoYXMgdG8gd2FpdCB1bnRpbCB3 ZSByZWxlYXNlIHRoZSBtdXRleC4KLQkgKgotCSAqIE5vdGUgdGhhdCBSUE0gY29tcGxpY2F0ZXMg c29tZXdoYXQgYnkgYWRkaW5nIGFuIGFkZGl0aW9uYWwKLQkgKiByZXF1aXJlbWVudCB0aGF0IG9w ZXJhdGlvbnMgdG8gdGhlIEdHVFQgYmUgbWFkZSBob2xkaW5nIHRoZSBSUE0KLQkgKiB3YWtlcmVm LgotCSAqLwotCWxvY2tkZXBfYXNzZXJ0X2hlbGQoJmk5MTUtPmRybS5zdHJ1Y3RfbXV0ZXgpOwot CXdha2VyZWYgPSBpbnRlbF9ydW50aW1lX3BtX2dldChpOTE1KTsKLQotCWlmICghb2JqLT51c2Vy ZmF1bHRfY291bnQpCi0JCWdvdG8gb3V0OwotCi0JX19pOTE1X2dlbV9vYmplY3RfcmVsZWFzZV9t bWFwKG9iaik7Ci0KLQkvKiBFbnN1cmUgdGhhdCB0aGUgQ1BVJ3MgUFRFIGFyZSByZXZva2VkIGFu ZCB0aGVyZSBhcmUgbm90IG91dHN0YW5kaW5nCi0JICogbWVtb3J5IHRyYW5zYWN0aW9ucyBmcm9t IHVzZXJzcGFjZSBiZWZvcmUgd2UgcmV0dXJuLiBUaGUgVExCCi0JICogZmx1c2hpbmcgaW1wbGll ZCBhYm92ZSBieSBjaGFuZ2luZyB0aGUgUFRFIGFib3ZlICpzaG91bGQqIGJlCi0JICogc3VmZmlj aWVudCwgYW4gZXh0cmEgYmFycmllciBoZXJlIGp1c3QgcHJvdmlkZXMgdXMgd2l0aCBhIGJpdAot CSAqIG9mIHBhcmFub2lkIGRvY3VtZW50YXRpb24gYWJvdXQgb3VyIHJlcXVpcmVtZW50IHRvIHNl cmlhbGlzZQotCSAqIG1lbW9yeSB3cml0ZXMgYmVmb3JlIHRvdWNoaW5nIHJlZ2lzdGVycyAvIEdT TS4KLQkgKi8KLQl3bWIoKTsKLQotb3V0OgotCWludGVsX3J1bnRpbWVfcG1fcHV0KGk5MTUsIHdh a2VyZWYpOwotfQotCiB2b2lkIGk5MTVfZ2VtX3J1bnRpbWVfc3VzcGVuZChzdHJ1Y3QgZHJtX2k5 MTVfcHJpdmF0ZSAqZGV2X3ByaXYpCiB7CiAJc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9i aiwgKm9uOwpAQCAtMTg2NSw3OCArMTM5NSw2IEBAIHZvaWQgaTkxNV9nZW1fcnVudGltZV9zdXNw ZW5kKHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdikKIAl9CiB9CiAKLXN0YXRpYyBp bnQgaTkxNV9nZW1fb2JqZWN0X2NyZWF0ZV9tbWFwX29mZnNldChzdHJ1Y3QgZHJtX2k5MTVfZ2Vt X29iamVjdCAqb2JqKQotewotCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IHRv X2k5MTUob2JqLT5iYXNlLmRldik7Ci0JaW50IGVycjsKLQotCWVyciA9IGRybV9nZW1fY3JlYXRl X21tYXBfb2Zmc2V0KCZvYmotPmJhc2UpOwotCWlmIChsaWtlbHkoIWVycikpCi0JCXJldHVybiAw OwotCi0JLyogQXR0ZW1wdCB0byByZWFwIHNvbWUgbW1hcCBzcGFjZSBmcm9tIGRlYWQgb2JqZWN0 cyAqLwotCWRvIHsKLQkJZXJyID0gaTkxNV9nZW1fd2FpdF9mb3JfaWRsZShkZXZfcHJpdiwKLQkJ CQkJICAgICBJOTE1X1dBSVRfSU5URVJSVVBUSUJMRSwKLQkJCQkJICAgICBNQVhfU0NIRURVTEVf VElNRU9VVCk7Ci0JCWlmIChlcnIpCi0JCQlicmVhazsKLQotCQlpOTE1X2dlbV9kcmFpbl9mcmVl ZF9vYmplY3RzKGRldl9wcml2KTsKLQkJZXJyID0gZHJtX2dlbV9jcmVhdGVfbW1hcF9vZmZzZXQo Jm9iai0+YmFzZSk7Ci0JCWlmICghZXJyKQotCQkJYnJlYWs7Ci0KLQl9IHdoaWxlIChmbHVzaF9k ZWxheWVkX3dvcmsoJmRldl9wcml2LT5ndC5yZXRpcmVfd29yaykpOwotCi0JcmV0dXJuIGVycjsK LX0KLQotaW50Ci1pOTE1X2dlbV9tbWFwX2d0dChzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGUsCi0JCSAg c3RydWN0IGRybV9kZXZpY2UgKmRldiwKLQkJICB1MzIgaGFuZGxlLAotCQkgIHU2NCAqb2Zmc2V0 KQotewotCXN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmo7Ci0JaW50IHJldDsKLQotCW9i aiA9IGk5MTVfZ2VtX29iamVjdF9sb29rdXAoZmlsZSwgaGFuZGxlKTsKLQlpZiAoIW9iaikKLQkJ cmV0dXJuIC1FTk9FTlQ7Ci0KLQlyZXQgPSBpOTE1X2dlbV9vYmplY3RfY3JlYXRlX21tYXBfb2Zm c2V0KG9iaik7Ci0JaWYgKHJldCA9PSAwKQotCQkqb2Zmc2V0ID0gZHJtX3ZtYV9ub2RlX29mZnNl dF9hZGRyKCZvYmotPmJhc2Uudm1hX25vZGUpOwotCi0JaTkxNV9nZW1fb2JqZWN0X3B1dChvYmop OwotCXJldHVybiByZXQ7Ci19Ci0KLS8qKgotICogaTkxNV9nZW1fbW1hcF9ndHRfaW9jdGwgLSBw cmVwYXJlIGFuIG9iamVjdCBmb3IgR1RUIG1tYXAnaW5nCi0gKiBAZGV2OiBEUk0gZGV2aWNlCi0g KiBAZGF0YTogR1RUIG1hcHBpbmcgaW9jdGwgZGF0YQotICogQGZpbGU6IEdFTSBvYmplY3QgaW5m bwotICoKLSAqIFNpbXBseSByZXR1cm5zIHRoZSBmYWtlIG9mZnNldCB0byB1c2Vyc3BhY2Ugc28g aXQgY2FuIG1tYXAgaXQuCi0gKiBUaGUgbW1hcCBjYWxsIHdpbGwgZW5kIHVwIGluIGRybV9nZW1f bW1hcCgpLCB3aGljaCB3aWxsIHNldCB0aGluZ3MKLSAqIHVwIHNvIHdlIGNhbiBnZXQgZmF1bHRz IGluIHRoZSBoYW5kbGVyIGFib3ZlLgotICoKLSAqIFRoZSBmYXVsdCBoYW5kbGVyIHdpbGwgdGFr ZSBjYXJlIG9mIGJpbmRpbmcgdGhlIG9iamVjdCBpbnRvIHRoZSBHVFQKLSAqIChzaW5jZSBpdCBt YXkgaGF2ZSBiZWVuIGV2aWN0ZWQgdG8gbWFrZSByb29tIGZvciBzb21ldGhpbmcpLCBhbGxvY2F0 aW5nCi0gKiBhIGZlbmNlIHJlZ2lzdGVyLCBhbmQgbWFwcGluZyB0aGUgYXBwcm9wcmlhdGUgYXBl cnR1cmUgYWRkcmVzcyBpbnRvCi0gKiB1c2Vyc3BhY2UuCi0gKi8KLWludAotaTkxNV9nZW1fbW1h cF9ndHRfaW9jdGwoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdm9pZCAqZGF0YSwKLQkJCXN0cnVj dCBkcm1fZmlsZSAqZmlsZSkKLXsKLQlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX21tYXBfZ3R0ICphcmdz ID0gZGF0YTsKLQotCXJldHVybiBpOTE1X2dlbV9tbWFwX2d0dChmaWxlLCBkZXYsIGFyZ3MtPmhh bmRsZSwgJmFyZ3MtPm9mZnNldCk7Ci19Ci0KIGJvb2wgaTkxNV9zZ190cmltKHN0cnVjdCBzZ190 YWJsZSAqb3JpZ19zdCkKIHsKIAlzdHJ1Y3Qgc2dfdGFibGUgbmV3X3N0OwpAQCAtMjI1Niw3ICsx NzE0LDcgQEAgc3RhdGljIHZvaWQgX19pOTE1X2dlbV9vYmplY3RfZmx1c2hfZm9yX2Rpc3BsYXko c3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaikKIAkgKiBXZSBtYW51YWxseSBmbHVzaCB0 aGUgQ1BVIGRvbWFpbiBzbyB0aGF0IHdlIGNhbiBvdmVycmlkZSBhbmQKIAkgKiBmb3JjZSB0aGUg Zmx1c2ggZm9yIHRoZSBkaXNwbGF5LCBhbmQgcGVyZm9ybSBpdCBhc3luY3Job25vdXNseS4KIAkg Ki8KLQlmbHVzaF93cml0ZV9kb21haW4ob2JqLCB+STkxNV9HRU1fRE9NQUlOX0NQVSk7CisJaTkx NV9nZW1fb2JqZWN0X2ZsdXNoX3dyaXRlX2RvbWFpbihvYmosIH5JOTE1X0dFTV9ET01BSU5fQ1BV KTsKIAlpZiAob2JqLT5jYWNoZV9kaXJ0eSkKIAkJaTkxNV9nZW1fY2xmbHVzaF9vYmplY3Qob2Jq LCBJOTE1X0NMRkxVU0hfRk9SQ0UpOwogCW9iai0+d3JpdGVfZG9tYWluID0gMDsKQEAgLTIzMTAs NyArMTc2OCw3IEBAIGk5MTVfZ2VtX29iamVjdF9zZXRfdG9fd2NfZG9tYWluKHN0cnVjdCBkcm1f aTkxNV9nZW1fb2JqZWN0ICpvYmosIGJvb2wgd3JpdGUpCiAJaWYgKHJldCkKIAkJcmV0dXJuIHJl dDsKIAotCWZsdXNoX3dyaXRlX2RvbWFpbihvYmosIH5JOTE1X0dFTV9ET01BSU5fV0MpOworCWk5 MTVfZ2VtX29iamVjdF9mbHVzaF93cml0ZV9kb21haW4ob2JqLCB+STkxNV9HRU1fRE9NQUlOX1dD KTsKIAogCS8qIFNlcmlhbGlzZSBkaXJlY3QgYWNjZXNzIHRvIHRoaXMgb2JqZWN0IHdpdGggdGhl IGJhcnJpZXJzIGZvcgogCSAqIGNvaGVyZW50IHdyaXRlcyBmcm9tIHRoZSBHUFUsIGJ5IGVmZmVj dGl2ZWx5IGludmFsaWRhdGluZyB0aGUKQEAgLTIzNzIsNyArMTgzMCw3IEBAIGk5MTVfZ2VtX29i amVjdF9zZXRfdG9fZ3R0X2RvbWFpbihzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqLCBi b29sIHdyaXRlKQogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAKLQlmbHVzaF93cml0ZV9kb21h aW4ob2JqLCB+STkxNV9HRU1fRE9NQUlOX0dUVCk7CisJaTkxNV9nZW1fb2JqZWN0X2ZsdXNoX3dy aXRlX2RvbWFpbihvYmosIH5JOTE1X0dFTV9ET01BSU5fR1RUKTsKIAogCS8qIFNlcmlhbGlzZSBk aXJlY3QgYWNjZXNzIHRvIHRoaXMgb2JqZWN0IHdpdGggdGhlIGJhcnJpZXJzIGZvcgogCSAqIGNv aGVyZW50IHdyaXRlcyBmcm9tIHRoZSBHUFUsIGJ5IGVmZmVjdGl2ZWx5IGludmFsaWRhdGluZyB0 aGUKQEAgLTI0ODEsNyArMTkzOSw3IEBAIGludCBpOTE1X2dlbV9vYmplY3Rfc2V0X2NhY2hlX2xl dmVsKHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmosCiAJCQkgKiB0aGVuIGRvdWJsZSBj aGVjayBpZiB0aGUgR1RUIG1hcHBpbmcgaXMgc3RpbGwKIAkJCSAqIHZhbGlkIGZvciB0aGF0IHBv aW50ZXIgYWNjZXNzLgogCQkJICovCi0JCQlpOTE1X2dlbV9yZWxlYXNlX21tYXAob2JqKTsKKwkJ CWk5MTVfZ2VtX29iamVjdF9yZWxlYXNlX21tYXAob2JqKTsKIAogCQkJLyogQXMgd2Ugbm8gbG9u Z2VyIG5lZWQgYSBmZW5jZSBmb3IgR1RUIGFjY2VzcywKIAkJCSAqIHdlIGNhbiByZWxpbnF1aXNo IGl0IG5vdyAoYW5kIHNvIHByZXZlbnQgaGF2aW5nCkBAIC0yNzM2LDcgKzIxOTQsNyBAQCBpOTE1 X2dlbV9vYmplY3Rfc2V0X3RvX2NwdV9kb21haW4oc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3Qg Km9iaiwgYm9vbCB3cml0ZSkKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCi0JZmx1c2hfd3Jp dGVfZG9tYWluKG9iaiwgfkk5MTVfR0VNX0RPTUFJTl9DUFUpOworCWk5MTVfZ2VtX29iamVjdF9m bHVzaF93cml0ZV9kb21haW4ob2JqLCB+STkxNV9HRU1fRE9NQUlOX0NQVSk7CiAKIAkvKiBGbHVz aCB0aGUgQ1BVIGNhY2hlIGlmIGl0J3Mgc3RpbGwgaW52YWxpZC4gKi8KIAlpZiAoKG9iai0+cmVh ZF9kb21haW5zICYgSTkxNV9HRU1fRE9NQUlOX0NQVSkgPT0gMCkgewpkaWZmIC0tZ2l0IGEvZHJp dmVycy9ncHUvZHJtL2k5MTUvaTkxNV9nZW1fdGlsaW5nLmMgYi9kcml2ZXJzL2dwdS9kcm0vaTkx NS9pOTE1X2dlbV90aWxpbmcuYwppbmRleCA4Njc1YTZlMjQ3ODguLjhjZTNhMzBmYjBhMSAxMDA2 NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9nZW1fdGlsaW5nLmMKKysrIGIvZHJp dmVycy9ncHUvZHJtL2k5MTUvaTkxNV9nZW1fdGlsaW5nLmMKQEAgLTI5OSw3ICsyOTksNyBAQCBp OTE1X2dlbV9vYmplY3Rfc2V0X3RpbGluZyhzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2Jq LAogCWk5MTVfZ2VtX29iamVjdF91bmxvY2sob2JqKTsKIAogCS8qIEZvcmNlIHRoZSBmZW5jZSB0 byBiZSByZWFjcXVpcmVkIGZvciBHVFQgYWNjZXNzICovCi0JaTkxNV9nZW1fcmVsZWFzZV9tbWFw KG9iaik7CisJaTkxNV9nZW1fb2JqZWN0X3JlbGVhc2VfbW1hcChvYmopOwogCiAJLyogVHJ5IHRv IHByZWFsbG9jYXRlIG1lbW9yeSByZXF1aXJlZCB0byBzYXZlIHN3aXp6bGluZyBvbiBwdXQtcGFn ZXMgKi8KIAlpZiAoaTkxNV9nZW1fb2JqZWN0X25lZWRzX2JpdDE3X3N3aXp6bGUob2JqKSkgewpk aWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvc2VsZnRlc3RzL2k5MTVfZ2VtX29iamVj dC5jIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvc2VsZnRlc3RzL2k5MTVfZ2VtX29iamVjdC5jCmlu ZGV4IGFiNmFlOWVjZjAzYi4uZTRiMmVlNGM1NGUzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9k cm0vaTkxNS9zZWxmdGVzdHMvaTkxNV9nZW1fb2JqZWN0LmMKKysrIGIvZHJpdmVycy9ncHUvZHJt L2k5MTUvc2VsZnRlc3RzL2k5MTVfZ2VtX29iamVjdC5jCkBAIC04OCw0OTMgKzg4LDYgQEAgc3Rh dGljIGludCBpZ3RfZ2VtX2h1Z2Uodm9pZCAqYXJnKQogCXJldHVybiBlcnI7CiB9CiAKLXN0cnVj dCB0aWxlIHsKLQl1bnNpZ25lZCBpbnQgd2lkdGg7Ci0JdW5zaWduZWQgaW50IGhlaWdodDsKLQl1 bnNpZ25lZCBpbnQgc3RyaWRlOwotCXVuc2lnbmVkIGludCBzaXplOwotCXVuc2lnbmVkIGludCB0 aWxpbmc7Ci0JdW5zaWduZWQgaW50IHN3aXp6bGU7Ci19OwotCi1zdGF0aWMgdTY0IHN3aXp6bGVf Yml0KHVuc2lnbmVkIGludCBiaXQsIHU2NCBvZmZzZXQpCi17Ci0JcmV0dXJuIChvZmZzZXQgJiBC SVRfVUxMKGJpdCkpID4+IChiaXQgLSA2KTsKLX0KLQotc3RhdGljIHU2NCB0aWxlZF9vZmZzZXQo Y29uc3Qgc3RydWN0IHRpbGUgKnRpbGUsIHU2NCB2KQotewotCXU2NCB4LCB5OwotCi0JaWYgKHRp bGUtPnRpbGluZyA9PSBJOTE1X1RJTElOR19OT05FKQotCQlyZXR1cm4gdjsKLQotCXkgPSBkaXY2 NF91NjRfcmVtKHYsIHRpbGUtPnN0cmlkZSwgJngpOwotCXYgPSBkaXY2NF91NjRfcmVtKHksIHRp bGUtPmhlaWdodCwgJnkpICogdGlsZS0+c3RyaWRlICogdGlsZS0+aGVpZ2h0OwotCi0JaWYgKHRp bGUtPnRpbGluZyA9PSBJOTE1X1RJTElOR19YKSB7Ci0JCXYgKz0geSAqIHRpbGUtPndpZHRoOwot CQl2ICs9IGRpdjY0X3U2NF9yZW0oeCwgdGlsZS0+d2lkdGgsICZ4KSA8PCB0aWxlLT5zaXplOwot CQl2ICs9IHg7Ci0JfSBlbHNlIGlmICh0aWxlLT53aWR0aCA9PSAxMjgpIHsKLQkJY29uc3QgdW5z aWduZWQgaW50IHl0aWxlX3NwYW4gPSAxNjsKLQkJY29uc3QgdW5zaWduZWQgaW50IHl0aWxlX2hl aWdodCA9IDUxMjsKLQotCQl2ICs9IHkgKiB5dGlsZV9zcGFuOwotCQl2ICs9IGRpdjY0X3U2NF9y ZW0oeCwgeXRpbGVfc3BhbiwgJngpICogeXRpbGVfaGVpZ2h0OwotCQl2ICs9IHg7Ci0JfSBlbHNl IHsKLQkJY29uc3QgdW5zaWduZWQgaW50IHl0aWxlX3NwYW4gPSAzMjsKLQkJY29uc3QgdW5zaWdu ZWQgaW50IHl0aWxlX2hlaWdodCA9IDI1NjsKLQotCQl2ICs9IHkgKiB5dGlsZV9zcGFuOwotCQl2 ICs9IGRpdjY0X3U2NF9yZW0oeCwgeXRpbGVfc3BhbiwgJngpICogeXRpbGVfaGVpZ2h0OwotCQl2 ICs9IHg7Ci0JfQotCi0Jc3dpdGNoICh0aWxlLT5zd2l6emxlKSB7Ci0JY2FzZSBJOTE1X0JJVF82 X1NXSVpaTEVfOToKLQkJdiBePSBzd2l6emxlX2JpdCg5LCB2KTsKLQkJYnJlYWs7Ci0JY2FzZSBJ OTE1X0JJVF82X1NXSVpaTEVfOV8xMDoKLQkJdiBePSBzd2l6emxlX2JpdCg5LCB2KSBeIHN3aXp6 bGVfYml0KDEwLCB2KTsKLQkJYnJlYWs7Ci0JY2FzZSBJOTE1X0JJVF82X1NXSVpaTEVfOV8xMToK LQkJdiBePSBzd2l6emxlX2JpdCg5LCB2KSBeIHN3aXp6bGVfYml0KDExLCB2KTsKLQkJYnJlYWs7 Ci0JY2FzZSBJOTE1X0JJVF82X1NXSVpaTEVfOV8xMF8xMToKLQkJdiBePSBzd2l6emxlX2JpdCg5 LCB2KSBeIHN3aXp6bGVfYml0KDEwLCB2KSBeIHN3aXp6bGVfYml0KDExLCB2KTsKLQkJYnJlYWs7 Ci0JfQotCi0JcmV0dXJuIHY7Ci19Ci0KLXN0YXRpYyBpbnQgY2hlY2tfcGFydGlhbF9tYXBwaW5n KHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmosCi0JCQkJIGNvbnN0IHN0cnVjdCB0aWxl ICp0aWxlLAotCQkJCSB1bnNpZ25lZCBsb25nIGVuZF90aW1lKQotewotCWNvbnN0IHVuc2lnbmVk IGludCBucmVhbCA9IG9iai0+c2NyYXRjaCAvIFBBR0VfU0laRTsKLQljb25zdCB1bnNpZ25lZCBs b25nIG5wYWdlcyA9IG9iai0+YmFzZS5zaXplIC8gUEFHRV9TSVpFOwotCXN0cnVjdCBpOTE1X3Zt YSAqdm1hOwotCXVuc2lnbmVkIGxvbmcgcGFnZTsKLQlpbnQgZXJyOwotCi0JaWYgKGlndF90aW1l b3V0KGVuZF90aW1lLAotCQkJIiVzOiB0aW1lZCBvdXQgYmVmb3JlIHRpbGluZz0lZCBzdHJpZGU9 JWRcbiIsCi0JCQlfX2Z1bmNfXywgdGlsZS0+dGlsaW5nLCB0aWxlLT5zdHJpZGUpKQotCQlyZXR1 cm4gLUVJTlRSOwotCi0JZXJyID0gaTkxNV9nZW1fb2JqZWN0X3NldF90aWxpbmcob2JqLCB0aWxl LT50aWxpbmcsIHRpbGUtPnN0cmlkZSk7Ci0JaWYgKGVycikgewotCQlwcl9lcnIoIkZhaWxlZCB0 byBzZXQgdGlsaW5nIG1vZGU9JXUsIHN0cmlkZT0ldSwgZXJyPSVkXG4iLAotCQkgICAgICAgdGls ZS0+dGlsaW5nLCB0aWxlLT5zdHJpZGUsIGVycik7Ci0JCXJldHVybiBlcnI7Ci0JfQotCi0JR0VN X0JVR19PTihpOTE1X2dlbV9vYmplY3RfZ2V0X3RpbGluZyhvYmopICE9IHRpbGUtPnRpbGluZyk7 Ci0JR0VNX0JVR19PTihpOTE1X2dlbV9vYmplY3RfZ2V0X3N0cmlkZShvYmopICE9IHRpbGUtPnN0 cmlkZSk7Ci0KLQlmb3JfZWFjaF9wcmltZV9udW1iZXJfZnJvbShwYWdlLCAxLCBucGFnZXMpIHsK LQkJc3RydWN0IGk5MTVfZ2d0dF92aWV3IHZpZXcgPQotCQkJY29tcHV0ZV9wYXJ0aWFsX3ZpZXco b2JqLCBwYWdlLCBNSU5fQ0hVTktfUEFHRVMpOwotCQl1MzIgX19pb21lbSAqaW87Ci0JCXN0cnVj dCBwYWdlICpwOwotCQl1bnNpZ25lZCBpbnQgbjsKLQkJdTY0IG9mZnNldDsKLQkJdTMyICpjcHU7 Ci0KLQkJR0VNX0JVR19PTih2aWV3LnBhcnRpYWwuc2l6ZSA+IG5yZWFsKTsKLQkJY29uZF9yZXNj aGVkKCk7Ci0KLQkJZXJyID0gaTkxNV9nZW1fb2JqZWN0X3NldF90b19ndHRfZG9tYWluKG9iaiwg dHJ1ZSk7Ci0JCWlmIChlcnIpIHsKLQkJCXByX2VycigiRmFpbGVkIHRvIGZsdXNoIHRvIEdUVCB3 cml0ZSBkb21haW47IGVycj0lZFxuIiwKLQkJCSAgICAgICBlcnIpOwotCQkJcmV0dXJuIGVycjsK LQkJfQotCi0JCXZtYSA9IGk5MTVfZ2VtX29iamVjdF9nZ3R0X3BpbihvYmosICZ2aWV3LCAwLCAw LCBQSU5fTUFQUEFCTEUpOwotCQlpZiAoSVNfRVJSKHZtYSkpIHsKLQkJCXByX2VycigiRmFpbGVk IHRvIHBpbiBwYXJ0aWFsIHZpZXc6IG9mZnNldD0lbHU7IGVycj0lZFxuIiwKLQkJCSAgICAgICBw YWdlLCAoaW50KVBUUl9FUlIodm1hKSk7Ci0JCQlyZXR1cm4gUFRSX0VSUih2bWEpOwotCQl9Ci0K LQkJbiA9IHBhZ2UgLSB2aWV3LnBhcnRpYWwub2Zmc2V0OwotCQlHRU1fQlVHX09OKG4gPj0gdmll dy5wYXJ0aWFsLnNpemUpOwotCi0JCWlvID0gaTkxNV92bWFfcGluX2lvbWFwKHZtYSk7Ci0JCWk5 MTVfdm1hX3VucGluKHZtYSk7Ci0JCWlmIChJU19FUlIoaW8pKSB7Ci0JCQlwcl9lcnIoIkZhaWxl ZCB0byBpb21hcCBwYXJ0aWFsIHZpZXc6IG9mZnNldD0lbHU7IGVycj0lZFxuIiwKLQkJCSAgICAg ICBwYWdlLCAoaW50KVBUUl9FUlIoaW8pKTsKLQkJCXJldHVybiBQVFJfRVJSKGlvKTsKLQkJfQot Ci0JCWlvd3JpdGUzMihwYWdlLCBpbyArIG4gKiBQQUdFX1NJWkUvc2l6ZW9mKCppbykpOwotCQlp OTE1X3ZtYV91bnBpbl9pb21hcCh2bWEpOwotCi0JCW9mZnNldCA9IHRpbGVkX29mZnNldCh0aWxl LCBwYWdlIDw8IFBBR0VfU0hJRlQpOwotCQlpZiAob2Zmc2V0ID49IG9iai0+YmFzZS5zaXplKQot CQkJY29udGludWU7Ci0KLQkJZmx1c2hfd3JpdGVfZG9tYWluKG9iaiwgfkk5MTVfR0VNX0RPTUFJ Tl9DUFUpOwotCi0JCXAgPSBpOTE1X2dlbV9vYmplY3RfZ2V0X3BhZ2Uob2JqLCBvZmZzZXQgPj4g UEFHRV9TSElGVCk7Ci0JCWNwdSA9IGttYXAocCkgKyBvZmZzZXRfaW5fcGFnZShvZmZzZXQpOwot CQlkcm1fY2xmbHVzaF92aXJ0X3JhbmdlKGNwdSwgc2l6ZW9mKCpjcHUpKTsKLQkJaWYgKCpjcHUg IT0gKHUzMilwYWdlKSB7Ci0JCQlwcl9lcnIoIlBhcnRpYWwgdmlldyBmb3IgJWx1IFsldV0gKG9m ZnNldD0lbGx1LCBzaXplPSV1IFslbGx1LCByb3cgc2l6ZSAldV0sIGZlbmNlPSVkLCB0aWxpbmc9 JWQsIHN0cmlkZT0lZCkgbWlzYWxpZ25tZW50LCBleHBlY3RlZCB3cml0ZSB0byBwYWdlICglbGx1 ICsgJXUgWzB4JWxseF0pIG9mIDB4JXgsIGZvdW5kIDB4JXhcbiIsCi0JCQkgICAgICAgcGFnZSwg biwKLQkJCSAgICAgICB2aWV3LnBhcnRpYWwub2Zmc2V0LAotCQkJICAgICAgIHZpZXcucGFydGlh bC5zaXplLAotCQkJICAgICAgIHZtYS0+c2l6ZSA+PiBQQUdFX1NISUZULAotCQkJICAgICAgIHRp bGUtPnRpbGluZyA/IHRpbGVfcm93X3BhZ2VzKG9iaikgOiAwLAotCQkJICAgICAgIHZtYS0+ZmVu Y2UgPyB2bWEtPmZlbmNlLT5pZCA6IC0xLCB0aWxlLT50aWxpbmcsIHRpbGUtPnN0cmlkZSwKLQkJ CSAgICAgICBvZmZzZXQgPj4gUEFHRV9TSElGVCwKLQkJCSAgICAgICAodW5zaWduZWQgaW50KW9m ZnNldF9pbl9wYWdlKG9mZnNldCksCi0JCQkgICAgICAgb2Zmc2V0LAotCQkJICAgICAgICh1MzIp cGFnZSwgKmNwdSk7Ci0JCQllcnIgPSAtRUlOVkFMOwotCQl9Ci0JCSpjcHUgPSAwOwotCQlkcm1f Y2xmbHVzaF92aXJ0X3JhbmdlKGNwdSwgc2l6ZW9mKCpjcHUpKTsKLQkJa3VubWFwKHApOwotCQlp ZiAoZXJyKQotCQkJcmV0dXJuIGVycjsKLQotCQlpOTE1X3ZtYV9kZXN0cm95KHZtYSk7Ci0JfQot Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgaWd0X3BhcnRpYWxfdGlsaW5nKHZvaWQgKmFy ZykKLXsKLQljb25zdCB1bnNpZ25lZCBpbnQgbnJlYWwgPSAxIDw8IDEyOyAvKiBsYXJnZXN0IHRp bGUgcm93IHgyICovCi0Jc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmk5MTUgPSBhcmc7Ci0Jc3Ry dWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iajsKLQlpbnRlbF93YWtlcmVmX3Qgd2FrZXJlZjsK LQlpbnQgdGlsaW5nOwotCWludCBlcnI7Ci0KLQkvKiBXZSB3YW50IHRvIGNoZWNrIHRoZSBwYWdl IG1hcHBpbmcgYW5kIGZlbmNpbmcgb2YgYSBsYXJnZSBvYmplY3QKLQkgKiBtbWFwcGVkIHRocm91 Z2ggdGhlIEdUVC4gVGhlIG9iamVjdCB3ZSBjcmVhdGUgaXMgbGFyZ2VyIHRoYW4gY2FuCi0JICog cG9zc2libHkgYmUgbW1hcGVkIGFzIGEgd2hvbGUsIGFuZCBzbyB3ZSBtdXN0IHVzZSBwYXJ0aWFs IEdHVFQgdm1hLgotCSAqIFdlIHRoZW4gY2hlY2sgdGhhdCBhIHdyaXRlIHRocm91Z2ggZWFjaCBw YXJ0aWFsIEdHVFQgdm1hIGVuZHMgdXAKLQkgKiBpbiB0aGUgcmlnaHQgc2V0IG9mIHBhZ2VzIHdp dGhpbiB0aGUgb2JqZWN0LCBhbmQgd2l0aCB0aGUgZXhwZWN0ZWQKLQkgKiB0aWxpbmcsIHdoaWNo IHdlIHZlcmlmeSBieSBtYW51YWwgc3dpenpsaW5nLgotCSAqLwotCi0Jb2JqID0gaHVnZV9nZW1f b2JqZWN0KGk5MTUsCi0JCQkgICAgICBucmVhbCA8PCBQQUdFX1NISUZULAotCQkJICAgICAgKDEg KyBuZXh0X3ByaW1lX251bWJlcihpOTE1LT5nZ3R0LnZtLnRvdGFsID4+IFBBR0VfU0hJRlQpKSA8 PCBQQUdFX1NISUZUKTsKLQlpZiAoSVNfRVJSKG9iaikpCi0JCXJldHVybiBQVFJfRVJSKG9iaik7 Ci0KLQllcnIgPSBpOTE1X2dlbV9vYmplY3RfcGluX3BhZ2VzKG9iaik7Ci0JaWYgKGVycikgewot CQlwcl9lcnIoIkZhaWxlZCB0byBhbGxvY2F0ZSAldSBwYWdlcyAoJWx1IHRvdGFsKSwgZXJyPSVk XG4iLAotCQkgICAgICAgbnJlYWwsIG9iai0+YmFzZS5zaXplIC8gUEFHRV9TSVpFLCBlcnIpOwot CQlnb3RvIG91dDsKLQl9Ci0KLQltdXRleF9sb2NrKCZpOTE1LT5kcm0uc3RydWN0X211dGV4KTsK LQl3YWtlcmVmID0gaW50ZWxfcnVudGltZV9wbV9nZXQoaTkxNSk7Ci0KLQlpZiAoMSkgewotCQlJ R1RfVElNRU9VVChlbmQpOwotCQlzdHJ1Y3QgdGlsZSB0aWxlOwotCi0JCXRpbGUuaGVpZ2h0ID0g MTsKLQkJdGlsZS53aWR0aCA9IDE7Ci0JCXRpbGUuc2l6ZSA9IDA7Ci0JCXRpbGUuc3RyaWRlID0g MDsKLQkJdGlsZS5zd2l6emxlID0gSTkxNV9CSVRfNl9TV0laWkxFX05PTkU7Ci0JCXRpbGUudGls aW5nID0gSTkxNV9USUxJTkdfTk9ORTsKLQotCQllcnIgPSBjaGVja19wYXJ0aWFsX21hcHBpbmco b2JqLCAmdGlsZSwgZW5kKTsKLQkJaWYgKGVyciAmJiBlcnIgIT0gLUVJTlRSKQotCQkJZ290byBv dXRfdW5sb2NrOwotCX0KLQotCWZvciAodGlsaW5nID0gSTkxNV9USUxJTkdfWDsgdGlsaW5nIDw9 IEk5MTVfVElMSU5HX1k7IHRpbGluZysrKSB7Ci0JCUlHVF9USU1FT1VUKGVuZCk7Ci0JCXVuc2ln bmVkIGludCBtYXhfcGl0Y2g7Ci0JCXVuc2lnbmVkIGludCBwaXRjaDsKLQkJc3RydWN0IHRpbGUg dGlsZTsKLQotCQlpZiAoaTkxNS0+cXVpcmtzICYgUVVJUktfUElOX1NXSVpaTEVEX1BBR0VTKQot CQkJLyoKLQkJCSAqIFRoZSBzd2l6emxpbmcgcGF0dGVybiBpcyBhY3R1YWxseSB1bmtub3duIGFz IGl0Ci0JCQkgKiB2YXJpZXMgYmFzZWQgb24gcGh5c2ljYWwgYWRkcmVzcyBvZiBlYWNoIHBhZ2Uu Ci0JCQkgKiBTZWUgaTkxNV9nZW1fZGV0ZWN0X2JpdF82X3N3aXp6bGUoKS4KLQkJCSAqLwotCQkJ YnJlYWs7Ci0KLQkJdGlsZS50aWxpbmcgPSB0aWxpbmc7Ci0JCXN3aXRjaCAodGlsaW5nKSB7Ci0J CWNhc2UgSTkxNV9USUxJTkdfWDoKLQkJCXRpbGUuc3dpenpsZSA9IGk5MTUtPm1tLmJpdF82X3N3 aXp6bGVfeDsKLQkJCWJyZWFrOwotCQljYXNlIEk5MTVfVElMSU5HX1k6Ci0JCQl0aWxlLnN3aXp6 bGUgPSBpOTE1LT5tbS5iaXRfNl9zd2l6emxlX3k7Ci0JCQlicmVhazsKLQkJfQotCi0JCUdFTV9C VUdfT04odGlsZS5zd2l6emxlID09IEk5MTVfQklUXzZfU1dJWlpMRV9VTktOT1dOKTsKLQkJaWYg KHRpbGUuc3dpenpsZSA9PSBJOTE1X0JJVF82X1NXSVpaTEVfOV8xNyB8fAotCQkgICAgdGlsZS5z d2l6emxlID09IEk5MTVfQklUXzZfU1dJWlpMRV85XzEwXzE3KQotCQkJY29udGludWU7Ci0KLQkJ aWYgKElOVEVMX0dFTihpOTE1KSA8PSAyKSB7Ci0JCQl0aWxlLmhlaWdodCA9IDE2OwotCQkJdGls ZS53aWR0aCA9IDEyODsKLQkJCXRpbGUuc2l6ZSA9IDExOwotCQl9IGVsc2UgaWYgKHRpbGUudGls aW5nID09IEk5MTVfVElMSU5HX1kgJiYKLQkJCSAgIEhBU18xMjhfQllURV9ZX1RJTElORyhpOTE1 KSkgewotCQkJdGlsZS5oZWlnaHQgPSAzMjsKLQkJCXRpbGUud2lkdGggPSAxMjg7Ci0JCQl0aWxl LnNpemUgPSAxMjsKLQkJfSBlbHNlIHsKLQkJCXRpbGUuaGVpZ2h0ID0gODsKLQkJCXRpbGUud2lk dGggPSA1MTI7Ci0JCQl0aWxlLnNpemUgPSAxMjsKLQkJfQotCi0JCWlmIChJTlRFTF9HRU4oaTkx NSkgPCA0KQotCQkJbWF4X3BpdGNoID0gODE5MiAvIHRpbGUud2lkdGg7Ci0JCWVsc2UgaWYgKElO VEVMX0dFTihpOTE1KSA8IDcpCi0JCQltYXhfcGl0Y2ggPSAxMjggKiBJOTY1X0ZFTkNFX01BWF9Q SVRDSF9WQUwgLyB0aWxlLndpZHRoOwotCQllbHNlCi0JCQltYXhfcGl0Y2ggPSAxMjggKiBHRU43 X0ZFTkNFX01BWF9QSVRDSF9WQUwgLyB0aWxlLndpZHRoOwotCi0JCWZvciAocGl0Y2ggPSBtYXhf cGl0Y2g7IHBpdGNoOyBwaXRjaCA+Pj0gMSkgewotCQkJdGlsZS5zdHJpZGUgPSB0aWxlLndpZHRo ICogcGl0Y2g7Ci0JCQllcnIgPSBjaGVja19wYXJ0aWFsX21hcHBpbmcob2JqLCAmdGlsZSwgZW5k KTsKLQkJCWlmIChlcnIgPT0gLUVJTlRSKQotCQkJCWdvdG8gbmV4dF90aWxpbmc7Ci0JCQlpZiAo ZXJyKQotCQkJCWdvdG8gb3V0X3VubG9jazsKLQotCQkJaWYgKHBpdGNoID4gMiAmJiBJTlRFTF9H RU4oaTkxNSkgPj0gNCkgewotCQkJCXRpbGUuc3RyaWRlID0gdGlsZS53aWR0aCAqIChwaXRjaCAt IDEpOwotCQkJCWVyciA9IGNoZWNrX3BhcnRpYWxfbWFwcGluZyhvYmosICZ0aWxlLCBlbmQpOwot CQkJCWlmIChlcnIgPT0gLUVJTlRSKQotCQkJCQlnb3RvIG5leHRfdGlsaW5nOwotCQkJCWlmIChl cnIpCi0JCQkJCWdvdG8gb3V0X3VubG9jazsKLQkJCX0KLQotCQkJaWYgKHBpdGNoIDwgbWF4X3Bp dGNoICYmIElOVEVMX0dFTihpOTE1KSA+PSA0KSB7Ci0JCQkJdGlsZS5zdHJpZGUgPSB0aWxlLndp ZHRoICogKHBpdGNoICsgMSk7Ci0JCQkJZXJyID0gY2hlY2tfcGFydGlhbF9tYXBwaW5nKG9iaiwg JnRpbGUsIGVuZCk7Ci0JCQkJaWYgKGVyciA9PSAtRUlOVFIpCi0JCQkJCWdvdG8gbmV4dF90aWxp bmc7Ci0JCQkJaWYgKGVycikKLQkJCQkJZ290byBvdXRfdW5sb2NrOwotCQkJfQotCQl9Ci0KLQkJ aWYgKElOVEVMX0dFTihpOTE1KSA+PSA0KSB7Ci0JCQlmb3JfZWFjaF9wcmltZV9udW1iZXIocGl0 Y2gsIG1heF9waXRjaCkgewotCQkJCXRpbGUuc3RyaWRlID0gdGlsZS53aWR0aCAqIHBpdGNoOwot CQkJCWVyciA9IGNoZWNrX3BhcnRpYWxfbWFwcGluZyhvYmosICZ0aWxlLCBlbmQpOwotCQkJCWlm IChlcnIgPT0gLUVJTlRSKQotCQkJCQlnb3RvIG5leHRfdGlsaW5nOwotCQkJCWlmIChlcnIpCi0J CQkJCWdvdG8gb3V0X3VubG9jazsKLQkJCX0KLQkJfQotCi1uZXh0X3RpbGluZzogOwotCX0KLQot b3V0X3VubG9jazoKLQlpbnRlbF9ydW50aW1lX3BtX3B1dChpOTE1LCB3YWtlcmVmKTsKLQltdXRl eF91bmxvY2soJmk5MTUtPmRybS5zdHJ1Y3RfbXV0ZXgpOwotCWk5MTVfZ2VtX29iamVjdF91bnBp bl9wYWdlcyhvYmopOwotb3V0OgotCWk5MTVfZ2VtX29iamVjdF9wdXQob2JqKTsKLQlyZXR1cm4g ZXJyOwotfQotCi1zdGF0aWMgaW50IG1ha2Vfb2JqX2J1c3koc3RydWN0IGRybV9pOTE1X2dlbV9v YmplY3QgKm9iaikKLXsKLQlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqaTkxNSA9IHRvX2k5MTUo b2JqLT5iYXNlLmRldik7Ci0Jc3RydWN0IGk5MTVfcmVxdWVzdCAqcnE7Ci0Jc3RydWN0IGk5MTVf dm1hICp2bWE7Ci0JaW50IGVycjsKLQotCXZtYSA9IGk5MTVfdm1hX2luc3RhbmNlKG9iaiwgJmk5 MTUtPmdndHQudm0sIE5VTEwpOwotCWlmIChJU19FUlIodm1hKSkKLQkJcmV0dXJuIFBUUl9FUlIo dm1hKTsKLQotCWVyciA9IGk5MTVfdm1hX3Bpbih2bWEsIDAsIDAsIFBJTl9VU0VSKTsKLQlpZiAo ZXJyKQotCQlyZXR1cm4gZXJyOwotCi0JcnEgPSBpOTE1X3JlcXVlc3RfYWxsb2MoaTkxNS0+ZW5n aW5lW1JDUzBdLCBpOTE1LT5rZXJuZWxfY29udGV4dCk7Ci0JaWYgKElTX0VSUihycSkpIHsKLQkJ aTkxNV92bWFfdW5waW4odm1hKTsKLQkJcmV0dXJuIFBUUl9FUlIocnEpOwotCX0KLQotCWVyciA9 IGk5MTVfdm1hX21vdmVfdG9fYWN0aXZlKHZtYSwgcnEsIEVYRUNfT0JKRUNUX1dSSVRFKTsKLQot CWk5MTVfcmVxdWVzdF9hZGQocnEpOwotCi0JX19pOTE1X2dlbV9vYmplY3RfcmVsZWFzZV91bmxl c3NfYWN0aXZlKG9iaik7Ci0JaTkxNV92bWFfdW5waW4odm1hKTsKLQotCXJldHVybiBlcnI7Ci19 Ci0KLXN0YXRpYyBib29sIGFzc2VydF9tbWFwX29mZnNldChzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0 ZSAqaTkxNSwKLQkJCSAgICAgICB1bnNpZ25lZCBsb25nIHNpemUsCi0JCQkgICAgICAgaW50IGV4 cGVjdGVkKQotewotCXN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmo7Ci0JaW50IGVycjsK LQotCW9iaiA9IGk5MTVfZ2VtX29iamVjdF9jcmVhdGVfaW50ZXJuYWwoaTkxNSwgc2l6ZSk7Ci0J aWYgKElTX0VSUihvYmopKQotCQlyZXR1cm4gUFRSX0VSUihvYmopOwotCi0JZXJyID0gaTkxNV9n ZW1fb2JqZWN0X2NyZWF0ZV9tbWFwX29mZnNldChvYmopOwotCWk5MTVfZ2VtX29iamVjdF9wdXQo b2JqKTsKLQotCXJldHVybiBlcnIgPT0gZXhwZWN0ZWQ7Ci19Ci0KLXN0YXRpYyB2b2lkIGRpc2Fi bGVfcmV0aXJlX3dvcmtlcihzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqaTkxNSkKLXsKLQlpOTE1 X2dlbV9zaHJpbmtlcl91bnJlZ2lzdGVyKGk5MTUpOwotCi0JbXV0ZXhfbG9jaygmaTkxNS0+ZHJt LnN0cnVjdF9tdXRleCk7Ci0JaWYgKCFpOTE1LT5ndC5hY3RpdmVfcmVxdWVzdHMrKykgewotCQlp bnRlbF93YWtlcmVmX3Qgd2FrZXJlZjsKLQotCQl3aXRoX2ludGVsX3J1bnRpbWVfcG0oaTkxNSwg d2FrZXJlZikKLQkJCWk5MTVfZ2VtX3VucGFyayhpOTE1KTsKLQl9Ci0JbXV0ZXhfdW5sb2NrKCZp OTE1LT5kcm0uc3RydWN0X211dGV4KTsKLQotCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmaTkx NS0+Z3QucmV0aXJlX3dvcmspOwotCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmaTkxNS0+Z3Qu aWRsZV93b3JrKTsKLX0KLQotc3RhdGljIGludCBpZ3RfbW1hcF9vZmZzZXRfZXhoYXVzdGlvbih2 b2lkICphcmcpCi17Ci0Jc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmk5MTUgPSBhcmc7Ci0Jc3Ry dWN0IGRybV9tbSAqbW0gPSAmaTkxNS0+ZHJtLnZtYV9vZmZzZXRfbWFuYWdlci0+dm1fYWRkcl9z cGFjZV9tbTsKLQlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqOwotCXN0cnVjdCBkcm1f bW1fbm9kZSByZXN2LCAqaG9sZTsKLQl1NjQgaG9sZV9zdGFydCwgaG9sZV9lbmQ7Ci0JaW50IGxv b3AsIGVycjsKLQotCS8qIERpc2FibGUgYmFja2dyb3VuZCByZWFwZXIgKi8KLQlkaXNhYmxlX3Jl dGlyZV93b3JrZXIoaTkxNSk7Ci0JR0VNX0JVR19PTighaTkxNS0+Z3QuYXdha2UpOwotCi0JLyog VHJpbSB0aGUgZGV2aWNlIG1tYXAgc3BhY2UgdG8gb25seSBhIHBhZ2UgKi8KLQltZW1zZXQoJnJl c3YsIDAsIHNpemVvZihyZXN2KSk7Ci0JZHJtX21tX2Zvcl9lYWNoX2hvbGUoaG9sZSwgbW0sIGhv bGVfc3RhcnQsIGhvbGVfZW5kKSB7Ci0JCXJlc3Yuc3RhcnQgPSBob2xlX3N0YXJ0OwotCQlyZXN2 LnNpemUgPSBob2xlX2VuZCAtIGhvbGVfc3RhcnQgLSAxOyAvKiBQQUdFX1NJWkUgdW5pdHMgKi8K LQkJZXJyID0gZHJtX21tX3Jlc2VydmVfbm9kZShtbSwgJnJlc3YpOwotCQlpZiAoZXJyKSB7Ci0J CQlwcl9lcnIoIkZhaWxlZCB0byB0cmltIFZNQSBtYW5hZ2VyLCBlcnI9JWRcbiIsIGVycik7Ci0J CQlnb3RvIG91dF9wYXJrOwotCQl9Ci0JCWJyZWFrOwotCX0KLQotCS8qIEp1c3QgZml0cyEgKi8K LQlpZiAoIWFzc2VydF9tbWFwX29mZnNldChpOTE1LCBQQUdFX1NJWkUsIDApKSB7Ci0JCXByX2Vy cigiVW5hYmxlIHRvIGluc2VydCBvYmplY3QgaW50byBzaW5nbGUgcGFnZSBob2xlXG4iKTsKLQkJ ZXJyID0gLUVJTlZBTDsKLQkJZ290byBvdXQ7Ci0JfQotCi0JLyogVG9vIGxhcmdlICovCi0JaWYg KCFhc3NlcnRfbW1hcF9vZmZzZXQoaTkxNSwgMipQQUdFX1NJWkUsIC1FTk9TUEMpKSB7Ci0JCXBy X2VycigiVW5leHBlY3RlZGx5IHN1Y2NlZWRlZCBpbiBpbnNlcnRpbmcgdG9vIGxhcmdlIG9iamVj dCBpbnRvIHNpbmdsZSBwYWdlIGhvbGVcbiIpOwotCQllcnIgPSAtRUlOVkFMOwotCQlnb3RvIG91 dDsKLQl9Ci0KLQkvKiBGaWxsIHRoZSBob2xlLCBmdXJ0aGVyIGFsbG9jYXRpb24gYXR0ZW1wdHMg c2hvdWxkIHRoZW4gZmFpbCAqLwotCW9iaiA9IGk5MTVfZ2VtX29iamVjdF9jcmVhdGVfaW50ZXJu YWwoaTkxNSwgUEFHRV9TSVpFKTsKLQlpZiAoSVNfRVJSKG9iaikpIHsKLQkJZXJyID0gUFRSX0VS UihvYmopOwotCQlnb3RvIG91dDsKLQl9Ci0KLQllcnIgPSBpOTE1X2dlbV9vYmplY3RfY3JlYXRl X21tYXBfb2Zmc2V0KG9iaik7Ci0JaWYgKGVycikgewotCQlwcl9lcnIoIlVuYWJsZSB0byBpbnNl cnQgb2JqZWN0IGludG8gcmVjbGFpbWVkIGhvbGVcbiIpOwotCQlnb3RvIGVycl9vYmo7Ci0JfQot Ci0JaWYgKCFhc3NlcnRfbW1hcF9vZmZzZXQoaTkxNSwgUEFHRV9TSVpFLCAtRU5PU1BDKSkgewot CQlwcl9lcnIoIlVuZXhwZWN0ZWRseSBzdWNjZWVkZWQgaW4gaW5zZXJ0aW5nIG9iamVjdCBpbnRv IG5vIGhvbGVzIVxuIik7Ci0JCWVyciA9IC1FSU5WQUw7Ci0JCWdvdG8gZXJyX29iajsKLQl9Ci0K LQlpOTE1X2dlbV9vYmplY3RfcHV0KG9iaik7Ci0KLQkvKiBOb3cgZmlsbCB3aXRoIGJ1c3kgZGVh ZCBvYmplY3RzIHRoYXQgd2UgZXhwZWN0IHRvIHJlYXAgKi8KLQlmb3IgKGxvb3AgPSAwOyBsb29w IDwgMzsgbG9vcCsrKSB7Ci0JCWludGVsX3dha2VyZWZfdCB3YWtlcmVmOwotCi0JCWlmIChpOTE1 X3Rlcm1pbmFsbHlfd2VkZ2VkKGk5MTUpKQotCQkJYnJlYWs7Ci0KLQkJb2JqID0gaTkxNV9nZW1f b2JqZWN0X2NyZWF0ZV9pbnRlcm5hbChpOTE1LCBQQUdFX1NJWkUpOwotCQlpZiAoSVNfRVJSKG9i aikpIHsKLQkJCWVyciA9IFBUUl9FUlIob2JqKTsKLQkJCWdvdG8gb3V0OwotCQl9Ci0KLQkJZXJy ID0gMDsKLQkJbXV0ZXhfbG9jaygmaTkxNS0+ZHJtLnN0cnVjdF9tdXRleCk7Ci0JCXdpdGhfaW50 ZWxfcnVudGltZV9wbShpOTE1LCB3YWtlcmVmKQotCQkJZXJyID0gbWFrZV9vYmpfYnVzeShvYmop OwotCQltdXRleF91bmxvY2soJmk5MTUtPmRybS5zdHJ1Y3RfbXV0ZXgpOwotCQlpZiAoZXJyKSB7 Ci0JCQlwcl9lcnIoIltsb29wICVkXSBGYWlsZWQgdG8gYnVzeSB0aGUgb2JqZWN0XG4iLCBsb29w KTsKLQkJCWdvdG8gZXJyX29iajsKLQkJfQotCi0JCS8qIE5CIHdlIHJlbHkgb24gdGhlIF9hY3Rp dmVfIHJlZmVyZW5jZSB0byBhY2Nlc3Mgb2JqIG5vdyAqLwotCQlHRU1fQlVHX09OKCFpOTE1X2dl bV9vYmplY3RfaXNfYWN0aXZlKG9iaikpOwotCQllcnIgPSBpOTE1X2dlbV9vYmplY3RfY3JlYXRl X21tYXBfb2Zmc2V0KG9iaik7Ci0JCWlmIChlcnIpIHsKLQkJCXByX2VycigiW2xvb3AgJWRdIGk5 MTVfZ2VtX29iamVjdF9jcmVhdGVfbW1hcF9vZmZzZXQgZmFpbGVkIHdpdGggZXJyPSVkXG4iLAot CQkJICAgICAgIGxvb3AsIGVycik7Ci0JCQlnb3RvIG91dDsKLQkJfQotCX0KLQotb3V0OgotCWRy bV9tbV9yZW1vdmVfbm9kZSgmcmVzdik7Ci1vdXRfcGFyazoKLQltdXRleF9sb2NrKCZpOTE1LT5k cm0uc3RydWN0X211dGV4KTsKLQlpZiAoLS1pOTE1LT5ndC5hY3RpdmVfcmVxdWVzdHMpCi0JCXF1 ZXVlX2RlbGF5ZWRfd29yayhpOTE1LT53cSwgJmk5MTUtPmd0LnJldGlyZV93b3JrLCAwKTsKLQll bHNlCi0JCXF1ZXVlX2RlbGF5ZWRfd29yayhpOTE1LT53cSwgJmk5MTUtPmd0LmlkbGVfd29yaywg MCk7Ci0JbXV0ZXhfdW5sb2NrKCZpOTE1LT5kcm0uc3RydWN0X211dGV4KTsKLQlpOTE1X2dlbV9z aHJpbmtlcl9yZWdpc3RlcihpOTE1KTsKLQlyZXR1cm4gZXJyOwotZXJyX29iajoKLQlpOTE1X2dl bV9vYmplY3RfcHV0KG9iaik7Ci0JZ290byBvdXQ7Ci19Ci0KIGludCBpOTE1X2dlbV9vYmplY3Rf bW9ja19zZWxmdGVzdHModm9pZCkKIHsKIAlzdGF0aWMgY29uc3Qgc3RydWN0IGk5MTVfc3VidGVz dCB0ZXN0c1tdID0gewpAQCAtNTk3LDggKzExMCw2IEBAIGludCBpOTE1X2dlbV9vYmplY3RfbGl2 ZV9zZWxmdGVzdHMoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmk5MTUpCiB7CiAJc3RhdGljIGNv bnN0IHN0cnVjdCBpOTE1X3N1YnRlc3QgdGVzdHNbXSA9IHsKIAkJU1VCVEVTVChpZ3RfZ2VtX2h1 Z2UpLAotCQlTVUJURVNUKGlndF9wYXJ0aWFsX3RpbGluZyksCi0JCVNVQlRFU1QoaWd0X21tYXBf b2Zmc2V0X2V4aGF1c3Rpb24pLAogCX07CiAKIAlyZXR1cm4gaTkxNV9zdWJ0ZXN0cyh0ZXN0cywg aTkxNSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9zZWxmdGVzdHMvaTkxNV9s aXZlX3NlbGZ0ZXN0cy5oIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvc2VsZnRlc3RzL2k5MTVfbGl2 ZV9zZWxmdGVzdHMuaAppbmRleCA2ZDc2NjkyNWFkMDQuLmJiZjM4N2RlOGRiMyAxMDA2NDQKLS0t IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvc2VsZnRlc3RzL2k5MTVfbGl2ZV9zZWxmdGVzdHMuaAor KysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9zZWxmdGVzdHMvaTkxNV9saXZlX3NlbGZ0ZXN0cy5o CkBAIC0xNiw2ICsxNiw3IEBAIHNlbGZ0ZXN0KHRpbWVsaW5lcywgaTkxNV90aW1lbGluZV9saXZl X3NlbGZ0ZXN0cykKIHNlbGZ0ZXN0KHJlcXVlc3RzLCBpOTE1X3JlcXVlc3RfbGl2ZV9zZWxmdGVz dHMpCiBzZWxmdGVzdChhY3RpdmUsIGk5MTVfYWN0aXZlX2xpdmVfc2VsZnRlc3RzKQogc2VsZnRl c3Qob2JqZWN0cywgaTkxNV9nZW1fb2JqZWN0X2xpdmVfc2VsZnRlc3RzKQorc2VsZnRlc3QobW1h biwgaTkxNV9nZW1fbW1hbl9saXZlX3NlbGZ0ZXN0cykKIHNlbGZ0ZXN0KGRtYWJ1ZiwgaTkxNV9n ZW1fZG1hYnVmX2xpdmVfc2VsZnRlc3RzKQogc2VsZnRlc3QoY29oZXJlbmN5LCBpOTE1X2dlbV9j b2hlcmVuY3lfbGl2ZV9zZWxmdGVzdHMpCiBzZWxmdGVzdChndHQsIGk5MTVfZ2VtX2d0dF9saXZl X3NlbGZ0ZXN0cykKLS0gCjIuMjAuMQoKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX18KSW50ZWwtZ2Z4IG1haWxpbmcgbGlzdApJbnRlbC1nZnhAbGlzdHMuZnJl ZWRlc2t0b3Aub3JnCmh0dHBzOi8vbGlzdHMuZnJlZWRlc2t0b3Aub3JnL21haWxtYW4vbGlzdGlu Zm8vaW50ZWwtZ2Z4