From mboxrd@z Thu Jan 1 00:00:00 1970 From: Vitaly Kuznetsov Subject: [PATCH v2 13/21] x86/xen: split off mmu_pv.c Date: Thu, 2 Mar 2017 18:53:49 +0100 Message-ID: <20170302175357.8222-14-vkuznets@redhat.com> References: <20170302175357.8222-1-vkuznets@redhat.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from mail6.bemta6.messagelabs.com ([193.109.254.103]) by lists.xenproject.org with esmtp (Exim 4.84_2) (envelope-from ) id 1cjUvr-0003iN-HW for xen-devel@lists.xenproject.org; Thu, 02 Mar 2017 17:54:27 +0000 In-Reply-To: <20170302175357.8222-1-vkuznets@redhat.com> List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Errors-To: xen-devel-bounces@lists.xen.org Sender: "Xen-devel" To: xen-devel@lists.xenproject.org Cc: Juergen Gross , Boris Ostrovsky , x86@kernel.org, Andrew Jones , linux-kernel@vger.kernel.org List-Id: xen-devel@lists.xenproject.org QmFzaWNhbGx5LCBtbXUuYyBpcyByZW5hbWVkIHRvIG1tdV9wdi5jIGFuZCBzb21lIGNvZGUgbW92 ZWQgb3V0IHRvIGNvbW1vbgptbXUuYy4KClNpZ25lZC1vZmYtYnk6IFZpdGFseSBLdXpuZXRzb3Yg PHZrdXpuZXRzQHJlZGhhdC5jb20+Ci0tLQogYXJjaC94ODYveGVuL01ha2VmaWxlIHwgICAgNCAr LQogYXJjaC94ODYveGVuL21tdS5jICAgIHwgMjcwMiArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBhcmNoL3g4Ni94ZW4vbW11X3B2LmMgfCAyNjM1ICsr KysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrCiAzIGZpbGVzIGNo YW5nZWQsIDI2NzQgaW5zZXJ0aW9ucygrKSwgMjY2NyBkZWxldGlvbnMoLSkKIGNyZWF0ZSBtb2Rl IDEwMDY0NCBhcmNoL3g4Ni94ZW4vbW11X3B2LmMKCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni94ZW4v TWFrZWZpbGUgYi9hcmNoL3g4Ni94ZW4vTWFrZWZpbGUKaW5kZXggNmE5NWE4Yi4uOGRhMWNhOSAx MDA2NDQKLS0tIGEvYXJjaC94ODYveGVuL01ha2VmaWxlCisrKyBiL2FyY2gveDg2L3hlbi9NYWtl ZmlsZQpAQCAtOCwxMiArOCwxMiBAQCBlbmRpZgogIyBNYWtlIHN1cmUgZWFybHkgYm9vdCBoYXMg bm8gc3RhY2twcm90ZWN0b3IKIG5vc3RhY2twIDo9ICQoY2FsbCBjYy1vcHRpb24sIC1mbm8tc3Rh Y2stcHJvdGVjdG9yKQogQ0ZMQUdTX2VubGlnaHRlbl9wdi5vCQk6PSAkKG5vc3RhY2twKQotQ0ZM QUdTX21tdS5vCQkJOj0gJChub3N0YWNrcCkKK0NGTEFHU19tbXVfcHYubwkJOj0gJChub3N0YWNr cCkKIAogb2JqLXkJCTo9IGVubGlnaHRlbi5vIHNldHVwLm8gbXVsdGljYWxscy5vIG1tdS5vIGly cS5vIFwKIAkJCXRpbWUubyB4ZW4tYXNtLm8geGVuLWFzbV8kKEJJVFMpLm8gXAogCQkJZ3JhbnQt dGFibGUubyBzdXNwZW5kLm8gcGxhdGZvcm0tcGNpLXVucGx1Zy5vIFwKLQkJCXAybS5vIGFwaWMu byBwbXUubyBlbmxpZ2h0ZW5fcHYubworCQkJcDJtLm8gYXBpYy5vIHBtdS5vIGVubGlnaHRlbl9w di5vIG1tdV9wdi5vCiAKIG9iai0kKENPTkZJR19YRU5fUFZIVk0pCQkrPSBlbmxpZ2h0ZW5faHZt Lm8gbW11X2h2bS5vCiBvYmotJChDT05GSUdfWEVOX1BWSCkJCQkrPSBlbmxpZ2h0ZW5fcHZoLm8K ZGlmZiAtLWdpdCBhL2FyY2gveDg2L3hlbi9tbXUuYyBiL2FyY2gveDg2L3hlbi9tbXUuYwppbmRl eCA0ZGZjYjA2Li41ZTM3NWE1IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni94ZW4vbW11LmMKKysrIGIv YXJjaC94ODYveGVuL21tdS5jCkBAIC0xLDI2OTMgKzEsNjYgQEAKLS8qCi0gKiBYZW4gbW11IG9w ZXJhdGlvbnMKLSAqCi0gKiBUaGlzIGZpbGUgY29udGFpbnMgdGhlIHZhcmlvdXMgbW11IGZldGNo IGFuZCB1cGRhdGUgb3BlcmF0aW9ucy4KLSAqIFRoZSBtb3N0IGltcG9ydGFudCBqb2IgdGhleSBt dXN0IHBlcmZvcm0gaXMgdGhlIG1hcHBpbmcgYmV0d2VlbiB0aGUKLSAqIGRvbWFpbidzIHBmbiBh bmQgdGhlIG92ZXJhbGwgbWFjaGluZSBtZm5zLgotICoKLSAqIFhlbiBhbGxvd3MgZ3Vlc3RzIHRv IGRpcmVjdGx5IHVwZGF0ZSB0aGUgcGFnZXRhYmxlLCBpbiBhIGNvbnRyb2xsZWQKLSAqIGZhc2hp b24uICBJbiBvdGhlciB3b3JkcywgdGhlIGd1ZXN0IG1vZGlmaWVzIHRoZSBzYW1lIHBhZ2V0YWJs ZQotICogdGhhdCB0aGUgQ1BVIGFjdHVhbGx5IHVzZXMsIHdoaWNoIGVsaW1pbmF0ZXMgdGhlIG92 ZXJoZWFkIG9mIGhhdmluZwotICogYSBzZXBhcmF0ZSBzaGFkb3cgcGFnZXRhYmxlLgotICoKLSAq IEluIG9yZGVyIHRvIGFsbG93IHRoaXMsIGl0IGZhbGxzIG9uIHRoZSBndWVzdCBkb21haW4gdG8g bWFwIGl0cwotICogbm90aW9uIG9mIGEgInBoeXNpY2FsIiBwZm4gLSB3aGljaCBpcyBqdXN0IGEg ZG9tYWluLWxvY2FsIGxpbmVhcgotICogYWRkcmVzcyAtIGludG8gYSByZWFsICJtYWNoaW5lIGFk ZHJlc3MiIHdoaWNoIHRoZSBDUFUncyBNTVUgY2FuCi0gKiB1c2UuCi0gKgotICogQSBwZ2RfdC9w bWRfdC9wdGVfdCB3aWxsIHR5cGljYWxseSBjb250YWluIGFuIG1mbiwgYW5kIHNvIGNhbiBiZQot ICogaW5zZXJ0ZWQgZGlyZWN0bHkgaW50byB0aGUgcGFnZXRhYmxlLiAgV2hlbiBjcmVhdGluZyBh IG5ldwotICogcHRlL3BtZC9wZ2QsIGl0IGNvbnZlcnRzIHRoZSBwYXNzZWQgcGZuIGludG8gYW4g bWZuLiAgQ29udmVyc2VseSwKLSAqIHdoZW4gcmVhZGluZyB0aGUgY29udGVudCBiYWNrIHdpdGgg X18ocGdkfHBtZHxwdGUpX3ZhbCwgaXQgY29udmVydHMKLSAqIHRoZSBtZm4gYmFjayBpbnRvIGEg cGZuLgotICoKLSAqIFRoZSBvdGhlciBjb25zdHJhaW50IGlzIHRoYXQgYWxsIHBhZ2VzIHdoaWNo IG1ha2UgdXAgYSBwYWdldGFibGUKLSAqIG11c3QgYmUgbWFwcGVkIHJlYWQtb25seSBpbiB0aGUg Z3Vlc3QuICBUaGlzIHByZXZlbnRzIHVuY29udHJvbGxlZAotICogZ3Vlc3QgdXBkYXRlcyB0byB0 aGUgcGFnZXRhYmxlLiAgWGVuIHN0cmljdGx5IGVuZm9yY2VzIHRoaXMsIGFuZAotICogd2lsbCBk aXNhbGxvdyBhbnkgcGFnZXRhYmxlIHVwZGF0ZSB3aGljaCB3aWxsIGVuZCB1cCBtYXBwaW5nIGEK LSAqIHBhZ2V0YWJsZSBwYWdlIFJXLCBhbmQgd2lsbCBkaXNhbGxvdyB1c2luZyBhbnkgd3JpdGFi bGUgcGFnZSBhcyBhCi0gKiBwYWdldGFibGUuCi0gKgotICogTmFpdmVseSwgd2hlbiBsb2FkaW5n ICVjcjMgd2l0aCB0aGUgYmFzZSBvZiBhIG5ldyBwYWdldGFibGUsIFhlbgotICogd291bGQgbmVl ZCB0byB2YWxpZGF0ZSB0aGUgd2hvbGUgcGFnZXRhYmxlIGJlZm9yZSBnb2luZyBvbi4KLSAqIE5h dHVyYWxseSwgdGhpcyBpcyBxdWl0ZSBzbG93LiAgVGhlIHNvbHV0aW9uIGlzIHRvICJwaW4iIGEK LSAqIHBhZ2V0YWJsZSwgd2hpY2ggZW5mb3JjZXMgYWxsIHRoZSBjb25zdHJhaW50cyBvbiB0aGUg cGFnZXRhYmxlIGV2ZW4KLSAqIHdoZW4gaXQgaXMgbm90IGFjdGl2ZWx5IGluIHVzZS4gIFRoaXMg bWVuYXMgdGhhdCBYZW4gY2FuIGJlIGFzc3VyZWQKLSAqIHRoYXQgaXQgaXMgc3RpbGwgdmFsaWQg d2hlbiB5b3UgZG8gbG9hZCBpdCBpbnRvICVjcjMsIGFuZCBkb2Vzbid0Ci0gKiBuZWVkIHRvIHJl dmFsaWRhdGUgaXQuCi0gKgotICogSmVyZW15IEZpdHpoYXJkaW5nZSA8amVyZW15QHhlbnNvdXJj ZS5jb20+LCBYZW5Tb3VyY2UgSW5jLCAyMDA3Ci0gKi8KLSNpbmNsdWRlIDxsaW51eC9zY2hlZC5o PgotI2luY2x1ZGUgPGxpbnV4L2hpZ2htZW0uaD4KLSNpbmNsdWRlIDxsaW51eC9kZWJ1Z2ZzLmg+ Ci0jaW5jbHVkZSA8bGludXgvYnVnLmg+Ci0jaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgotI2lu Y2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRl IDxsaW51eC9nZnAuaD4KLSNpbmNsdWRlIDxsaW51eC9tZW1ibG9jay5oPgotI2luY2x1ZGUgPGxp bnV4L3NlcV9maWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvY3Jhc2hfZHVtcC5oPgotCi0jaW5jbHVk ZSA8dHJhY2UvZXZlbnRzL3hlbi5oPgotCi0jaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KLSNpbmNs dWRlIDxhc20vdGxiZmx1c2guaD4KLSNpbmNsdWRlIDxhc20vZml4bWFwLmg+Ci0jaW5jbHVkZSA8 YXNtL21tdV9jb250ZXh0Lmg+Ci0jaW5jbHVkZSA8YXNtL3NldHVwLmg+Ci0jaW5jbHVkZSA8YXNt L3BhcmF2aXJ0Lmg+Ci0jaW5jbHVkZSA8YXNtL2U4MjAuaD4KLSNpbmNsdWRlIDxhc20vbGlua2Fn ZS5oPgotI2luY2x1ZGUgPGFzbS9wYWdlLmg+Ci0jaW5jbHVkZSA8YXNtL2luaXQuaD4KLSNpbmNs dWRlIDxhc20vcGF0Lmg+Ci0jaW5jbHVkZSA8YXNtL3NtcC5oPgotCi0jaW5jbHVkZSA8YXNtL3hl bi9oeXBlcmNhbGwuaD4KLSNpbmNsdWRlIDxhc20veGVuL2h5cGVydmlzb3IuaD4KLQotI2luY2x1 ZGUgPHhlbi94ZW4uaD4KLSNpbmNsdWRlIDx4ZW4vcGFnZS5oPgotI2luY2x1ZGUgPHhlbi9pbnRl cmZhY2UveGVuLmg+Ci0jaW5jbHVkZSA8eGVuL2ludGVyZmFjZS9odm0vaHZtX29wLmg+Ci0jaW5j bHVkZSA8eGVuL2ludGVyZmFjZS92ZXJzaW9uLmg+Ci0jaW5jbHVkZSA8eGVuL2ludGVyZmFjZS9t ZW1vcnkuaD4KLSNpbmNsdWRlIDx4ZW4vaHZjLWNvbnNvbGUuaD4KLQotI2luY2x1ZGUgIm11bHRp Y2FsbHMuaCIKLSNpbmNsdWRlICJtbXUuaCIKLSNpbmNsdWRlICJkZWJ1Z2ZzLmgiCi0KLS8qCi0g KiBQcm90ZWN0cyBhdG9taWMgcmVzZXJ2YXRpb24gZGVjcmVhc2UvaW5jcmVhc2UgYWdhaW5zdCBj b25jdXJyZW50IGluY3JlYXNlcy4KLSAqIEFsc28gcHJvdGVjdHMgbm9uLWF0b21pYyB1cGRhdGVz IG9mIGN1cnJlbnRfcGFnZXMgYW5kIGJhbGxvb24gbGlzdHMuCi0gKi8KLURFRklORV9TUElOTE9D Syh4ZW5fcmVzZXJ2YXRpb25fbG9jayk7Ci0KLSNpZmRlZiBDT05GSUdfWDg2XzMyCi0vKgotICog SWRlbnRpdHkgbWFwLCBpbiBhZGRpdGlvbiB0byBwbGFpbiBrZXJuZWwgbWFwLiAgVGhpcyBuZWVk cyB0byBiZQotICogbGFyZ2UgZW5vdWdoIHRvIGFsbG9jYXRlIHBhZ2UgdGFibGUgcGFnZXMgdG8g YWxsb2NhdGUgdGhlIHJlc3QuCi0gKiBFYWNoIHBhZ2UgY2FuIG1hcCAyTUIuCi0gKi8KLSNkZWZp bmUgTEVWRUwxX0lERU5UX0VOVFJJRVMJKFBUUlNfUEVSX1BURSAqIDQpCi1zdGF0aWMgUkVTRVJW RV9CUktfQVJSQVkocHRlX3QsIGxldmVsMV9pZGVudF9wZ3QsIExFVkVMMV9JREVOVF9FTlRSSUVT KTsKLSNlbmRpZgotI2lmZGVmIENPTkZJR19YODZfNjQKLS8qIGwzIHB1ZCBmb3IgdXNlcnNwYWNl IHZzeXNjYWxsIG1hcHBpbmcgKi8KLXN0YXRpYyBwdWRfdCBsZXZlbDNfdXNlcl92c3lzY2FsbFtQ VFJTX1BFUl9QVURdIF9fcGFnZV9hbGlnbmVkX2JzczsKLSNlbmRpZiAvKiBDT05GSUdfWDg2XzY0 ICovCi0KLS8qCi0gKiBOb3RlIGFib3V0IGNyMyAocGFnZXRhYmxlIGJhc2UpIHZhbHVlczoKLSAq Ci0gKiB4ZW5fY3IzIGNvbnRhaW5zIHRoZSBjdXJyZW50IGxvZ2ljYWwgY3IzIHZhbHVlOyBpdCBj b250YWlucyB0aGUKLSAqIGxhc3Qgc2V0IGNyMy4gIFRoaXMgbWF5IG5vdCBiZSB0aGUgY3VycmVu dCBlZmZlY3RpdmUgY3IzLCBiZWNhdXNlCi0gKiBpdHMgdXBkYXRlIG1heSBiZSBiZWluZyBsYXpp bHkgZGVmZXJyZWQuICBIb3dldmVyLCBhIHZjcHUgbG9va2luZwotICogYXQgaXRzIG93biBjcjMg Y2FuIHVzZSB0aGlzIHZhbHVlIGtub3dpbmcgdGhhdCBpdCBldmVyeXRoaW5nIHdpbGwKLSAqIGJl IHNlbGYtY29uc2lzdGVudC4KLSAqCi0gKiB4ZW5fY3VycmVudF9jcjMgY29udGFpbnMgdGhlIGFj dHVhbCB2Y3B1IGNyMzsgaXQgaXMgc2V0IG9uY2UgdGhlCi0gKiBoeXBlcmNhbGwgdG8gc2V0IHRo ZSB2Y3B1IGNyMyBpcyBjb21wbGV0ZSAoc28gaXQgbWF5IGJlIGEgbGl0dGxlCi0gKiBvdXQgb2Yg ZGF0ZSwgYnV0IGl0IHdpbGwgbmV2ZXIgYmUgc2V0IGVhcmx5KS4gIElmIG9uZSB2Y3B1IGlzCi0g KiBsb29raW5nIGF0IGFub3RoZXIgdmNwdSdzIGNyMyB2YWx1ZSwgaXQgc2hvdWxkIHVzZSB0aGlz IHZhcmlhYmxlLgotICovCi1ERUZJTkVfUEVSX0NQVSh1bnNpZ25lZCBsb25nLCB4ZW5fY3IzKTsJ IC8qIGNyMyBzdG9yZWQgYXMgcGh5c2FkZHIgKi8KLURFRklORV9QRVJfQ1BVKHVuc2lnbmVkIGxv bmcsIHhlbl9jdXJyZW50X2NyMyk7CSAvKiBhY3R1YWwgdmNwdSBjcjMgKi8KLQotc3RhdGljIHBo eXNfYWRkcl90IHhlbl9wdF9iYXNlLCB4ZW5fcHRfc2l6ZSBfX2luaXRkYXRhOwotCi0vKgotICog SnVzdCBiZXlvbmQgdGhlIGhpZ2hlc3QgdXNlcm1vZGUgYWRkcmVzcy4gIFNUQUNLX1RPUF9NQVgg aGFzIGEKLSAqIHJlZHpvbmUgYWJvdmUgaXQsIHNvIHJvdW5kIGl0IHVwIHRvIGEgUEdEIGJvdW5k YXJ5LgotICovCi0jZGVmaW5lIFVTRVJfTElNSVQJKChTVEFDS19UT1BfTUFYICsgUEdESVJfU0la RSAtIDEpICYgUEdESVJfTUFTSykKLQotdW5zaWduZWQgbG9uZyBhcmJpdHJhcnlfdmlydF90b19t Zm4odm9pZCAqdmFkZHIpCi17Ci0JeG1hZGRyX3QgbWFkZHIgPSBhcmJpdHJhcnlfdmlydF90b19t YWNoaW5lKHZhZGRyKTsKLQotCXJldHVybiBQRk5fRE9XTihtYWRkci5tYWRkcik7Ci19Ci0KLXht YWRkcl90IGFyYml0cmFyeV92aXJ0X3RvX21hY2hpbmUodm9pZCAqdmFkZHIpCi17Ci0JdW5zaWdu ZWQgbG9uZyBhZGRyZXNzID0gKHVuc2lnbmVkIGxvbmcpdmFkZHI7Ci0JdW5zaWduZWQgaW50IGxl dmVsOwotCXB0ZV90ICpwdGU7Ci0JdW5zaWduZWQgb2Zmc2V0OwotCi0JLyoKLQkgKiBpZiB0aGUg UEZOIGlzIGluIHRoZSBsaW5lYXIgbWFwcGVkIHZhZGRyIHJhbmdlLCB3ZSBjYW4ganVzdCB1c2UK LQkgKiB0aGUgKHF1aWNrKSB2aXJ0X3RvX21hY2hpbmUoKSBwMm0gbG9va3VwCi0JICovCi0JaWYg KHZpcnRfYWRkcl92YWxpZCh2YWRkcikpCi0JCXJldHVybiB2aXJ0X3RvX21hY2hpbmUodmFkZHIp OwotCi0JLyogb3RoZXJ3aXNlIHdlIGhhdmUgdG8gZG8gYSAoc2xvd2VyKSBmdWxsIHBhZ2UtdGFi bGUgd2FsayAqLwotCi0JcHRlID0gbG9va3VwX2FkZHJlc3MoYWRkcmVzcywgJmxldmVsKTsKLQlC VUdfT04ocHRlID09IE5VTEwpOwotCW9mZnNldCA9IGFkZHJlc3MgJiB+UEFHRV9NQVNLOwotCXJl dHVybiBYTUFERFIoKChwaHlzX2FkZHJfdClwdGVfbWZuKCpwdGUpIDw8IFBBR0VfU0hJRlQpICsg b2Zmc2V0KTsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKGFyYml0cmFyeV92aXJ0X3RvX21hY2hpbmUp OwotCi12b2lkIG1ha2VfbG93bWVtX3BhZ2VfcmVhZG9ubHkodm9pZCAqdmFkZHIpCi17Ci0JcHRl X3QgKnB0ZSwgcHRldjsKLQl1bnNpZ25lZCBsb25nIGFkZHJlc3MgPSAodW5zaWduZWQgbG9uZyl2 YWRkcjsKLQl1bnNpZ25lZCBpbnQgbGV2ZWw7Ci0KLQlwdGUgPSBsb29rdXBfYWRkcmVzcyhhZGRy ZXNzLCAmbGV2ZWwpOwotCWlmIChwdGUgPT0gTlVMTCkKLQkJcmV0dXJuOwkJLyogdmFkZHIgbWlz c2luZyAqLwotCi0JcHRldiA9IHB0ZV93cnByb3RlY3QoKnB0ZSk7Ci0KLQlpZiAoSFlQRVJWSVNP Ul91cGRhdGVfdmFfbWFwcGluZyhhZGRyZXNzLCBwdGV2LCAwKSkKLQkJQlVHKCk7Ci19Ci0KLXZv aWQgbWFrZV9sb3dtZW1fcGFnZV9yZWFkd3JpdGUodm9pZCAqdmFkZHIpCi17Ci0JcHRlX3QgKnB0 ZSwgcHRldjsKLQl1bnNpZ25lZCBsb25nIGFkZHJlc3MgPSAodW5zaWduZWQgbG9uZyl2YWRkcjsK LQl1bnNpZ25lZCBpbnQgbGV2ZWw7Ci0KLQlwdGUgPSBsb29rdXBfYWRkcmVzcyhhZGRyZXNzLCAm bGV2ZWwpOwotCWlmIChwdGUgPT0gTlVMTCkKLQkJcmV0dXJuOwkJLyogdmFkZHIgbWlzc2luZyAq LwotCi0JcHRldiA9IHB0ZV9ta3dyaXRlKCpwdGUpOwotCi0JaWYgKEhZUEVSVklTT1JfdXBkYXRl X3ZhX21hcHBpbmcoYWRkcmVzcywgcHRldiwgMCkpCi0JCUJVRygpOwotfQotCi0KLXN0YXRpYyBi b29sIHhlbl9wYWdlX3Bpbm5lZCh2b2lkICpwdHIpCi17Ci0Jc3RydWN0IHBhZ2UgKnBhZ2UgPSB2 aXJ0X3RvX3BhZ2UocHRyKTsKLQotCXJldHVybiBQYWdlUGlubmVkKHBhZ2UpOwotfQotCi12b2lk IHhlbl9zZXRfZG9tYWluX3B0ZShwdGVfdCAqcHRlcCwgcHRlX3QgcHRldmFsLCB1bnNpZ25lZCBk b21pZCkKLXsKLQlzdHJ1Y3QgbXVsdGljYWxsX3NwYWNlIG1jczsKLQlzdHJ1Y3QgbW11X3VwZGF0 ZSAqdTsKLQotCXRyYWNlX3hlbl9tbXVfc2V0X2RvbWFpbl9wdGUocHRlcCwgcHRldmFsLCBkb21p ZCk7Ci0KLQltY3MgPSB4ZW5fbWNfZW50cnkoc2l6ZW9mKCp1KSk7Ci0JdSA9IG1jcy5hcmdzOwot Ci0JLyogcHRlcCBtaWdodCBiZSBrbWFwcGVkIHdoZW4gdXNpbmcgMzItYml0IEhJR0hQVEUgKi8K LQl1LT5wdHIgPSB2aXJ0X3RvX21hY2hpbmUocHRlcCkubWFkZHI7Ci0JdS0+dmFsID0gcHRlX3Zh bF9tYShwdGV2YWwpOwotCi0JTVVMVElfbW11X3VwZGF0ZShtY3MubWMsIG1jcy5hcmdzLCAxLCBO VUxMLCBkb21pZCk7Ci0KLQl4ZW5fbWNfaXNzdWUoUEFSQVZJUlRfTEFaWV9NTVUpOwotfQotRVhQ T1JUX1NZTUJPTF9HUEwoeGVuX3NldF9kb21haW5fcHRlKTsKLQotc3RhdGljIHZvaWQgeGVuX2V4 dGVuZF9tbXVfdXBkYXRlKGNvbnN0IHN0cnVjdCBtbXVfdXBkYXRlICp1cGRhdGUpCi17Ci0Jc3Ry dWN0IG11bHRpY2FsbF9zcGFjZSBtY3M7Ci0Jc3RydWN0IG1tdV91cGRhdGUgKnU7Ci0KLQltY3Mg PSB4ZW5fbWNfZXh0ZW5kX2FyZ3MoX19IWVBFUlZJU09SX21tdV91cGRhdGUsIHNpemVvZigqdSkp OwotCi0JaWYgKG1jcy5tYyAhPSBOVUxMKSB7Ci0JCW1jcy5tYy0+YXJnc1sxXSsrOwotCX0gZWxz ZSB7Ci0JCW1jcyA9IF9feGVuX21jX2VudHJ5KHNpemVvZigqdSkpOwotCQlNVUxUSV9tbXVfdXBk YXRlKG1jcy5tYywgbWNzLmFyZ3MsIDEsIE5VTEwsIERPTUlEX1NFTEYpOwotCX0KLQotCXUgPSBt Y3MuYXJnczsKLQkqdSA9ICp1cGRhdGU7Ci19Ci0KLXN0YXRpYyB2b2lkIHhlbl9leHRlbmRfbW11 ZXh0X29wKGNvbnN0IHN0cnVjdCBtbXVleHRfb3AgKm9wKQotewotCXN0cnVjdCBtdWx0aWNhbGxf c3BhY2UgbWNzOwotCXN0cnVjdCBtbXVleHRfb3AgKnU7Ci0KLQltY3MgPSB4ZW5fbWNfZXh0ZW5k X2FyZ3MoX19IWVBFUlZJU09SX21tdWV4dF9vcCwgc2l6ZW9mKCp1KSk7Ci0KLQlpZiAobWNzLm1j ICE9IE5VTEwpIHsKLQkJbWNzLm1jLT5hcmdzWzFdKys7Ci0JfSBlbHNlIHsKLQkJbWNzID0gX194 ZW5fbWNfZW50cnkoc2l6ZW9mKCp1KSk7Ci0JCU1VTFRJX21tdWV4dF9vcChtY3MubWMsIG1jcy5h cmdzLCAxLCBOVUxMLCBET01JRF9TRUxGKTsKLQl9Ci0KLQl1ID0gbWNzLmFyZ3M7Ci0JKnUgPSAq b3A7Ci19Ci0KLXN0YXRpYyB2b2lkIHhlbl9zZXRfcG1kX2h5cGVyKHBtZF90ICpwdHIsIHBtZF90 IHZhbCkKLXsKLQlzdHJ1Y3QgbW11X3VwZGF0ZSB1OwotCi0JcHJlZW1wdF9kaXNhYmxlKCk7Ci0K LQl4ZW5fbWNfYmF0Y2goKTsKLQotCS8qIHB0ciBtYXkgYmUgaW9yZW1hcHBlZCBmb3IgNjQtYml0 IHBhZ2V0YWJsZSBzZXR1cCAqLwotCXUucHRyID0gYXJiaXRyYXJ5X3ZpcnRfdG9fbWFjaGluZShw dHIpLm1hZGRyOwotCXUudmFsID0gcG1kX3ZhbF9tYSh2YWwpOwotCXhlbl9leHRlbmRfbW11X3Vw ZGF0ZSgmdSk7Ci0KLQl4ZW5fbWNfaXNzdWUoUEFSQVZJUlRfTEFaWV9NTVUpOwotCi0JcHJlZW1w dF9lbmFibGUoKTsKLX0KLQotc3RhdGljIHZvaWQgeGVuX3NldF9wbWQocG1kX3QgKnB0ciwgcG1k X3QgdmFsKQotewotCXRyYWNlX3hlbl9tbXVfc2V0X3BtZChwdHIsIHZhbCk7Ci0KLQkvKiBJZiBw YWdlIGlzIG5vdCBwaW5uZWQsIHdlIGNhbiBqdXN0IHVwZGF0ZSB0aGUgZW50cnkKLQkgICBkaXJl Y3RseSAqLwotCWlmICgheGVuX3BhZ2VfcGlubmVkKHB0cikpIHsKLQkJKnB0ciA9IHZhbDsKLQkJ cmV0dXJuOwotCX0KLQotCXhlbl9zZXRfcG1kX2h5cGVyKHB0ciwgdmFsKTsKLX0KLQotLyoKLSAq IEFzc29jaWF0ZSBhIHZpcnR1YWwgcGFnZSBmcmFtZSB3aXRoIGEgZ2l2ZW4gcGh5c2ljYWwgcGFn ZSBmcmFtZQotICogYW5kIHByb3RlY3Rpb24gZmxhZ3MgZm9yIHRoYXQgZnJhbWUuCi0gKi8KLXZv aWQgc2V0X3B0ZV9tZm4odW5zaWduZWQgbG9uZyB2YWRkciwgdW5zaWduZWQgbG9uZyBtZm4sIHBn cHJvdF90IGZsYWdzKQotewotCXNldF9wdGVfdmFkZHIodmFkZHIsIG1mbl9wdGUobWZuLCBmbGFn cykpOwotfQotCi1zdGF0aWMgYm9vbCB4ZW5fYmF0Y2hlZF9zZXRfcHRlKHB0ZV90ICpwdGVwLCBw dGVfdCBwdGV2YWwpCi17Ci0Jc3RydWN0IG1tdV91cGRhdGUgdTsKLQotCWlmIChwYXJhdmlydF9n ZXRfbGF6eV9tb2RlKCkgIT0gUEFSQVZJUlRfTEFaWV9NTVUpCi0JCXJldHVybiBmYWxzZTsKLQot CXhlbl9tY19iYXRjaCgpOwotCi0JdS5wdHIgPSB2aXJ0X3RvX21hY2hpbmUocHRlcCkubWFkZHIg fCBNTVVfTk9STUFMX1BUX1VQREFURTsKLQl1LnZhbCA9IHB0ZV92YWxfbWEocHRldmFsKTsKLQl4 ZW5fZXh0ZW5kX21tdV91cGRhdGUoJnUpOwotCi0JeGVuX21jX2lzc3VlKFBBUkFWSVJUX0xBWllf TU1VKTsKLQotCXJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgX194ZW5fc2V0 X3B0ZShwdGVfdCAqcHRlcCwgcHRlX3QgcHRldmFsKQotewotCWlmICgheGVuX2JhdGNoZWRfc2V0 X3B0ZShwdGVwLCBwdGV2YWwpKSB7Ci0JCS8qCi0JCSAqIENvdWxkIGNhbGwgbmF0aXZlX3NldF9w dGUoKSBoZXJlIGFuZCB0cmFwIGFuZAotCQkgKiBlbXVsYXRlIHRoZSBQVEUgd3JpdGUgYnV0IHdp dGggMzItYml0IGd1ZXN0cyB0aGlzCi0JCSAqIG5lZWRzIHR3byB0cmFwcyAob25lIGZvciBlYWNo IG9mIHRoZSB0d28gMzItYml0Ci0JCSAqIHdvcmRzIGluIHRoZSBQVEUpIHNvIGRvIG9uZSBoeXBl cmNhbGwgZGlyZWN0bHkKLQkJICogaW5zdGVhZC4KLQkJICovCi0JCXN0cnVjdCBtbXVfdXBkYXRl IHU7Ci0KLQkJdS5wdHIgPSB2aXJ0X3RvX21hY2hpbmUocHRlcCkubWFkZHIgfCBNTVVfTk9STUFM X1BUX1VQREFURTsKLQkJdS52YWwgPSBwdGVfdmFsX21hKHB0ZXZhbCk7Ci0JCUhZUEVSVklTT1Jf bW11X3VwZGF0ZSgmdSwgMSwgTlVMTCwgRE9NSURfU0VMRik7Ci0JfQotfQotCi1zdGF0aWMgdm9p ZCB4ZW5fc2V0X3B0ZShwdGVfdCAqcHRlcCwgcHRlX3QgcHRldmFsKQotewotCXRyYWNlX3hlbl9t bXVfc2V0X3B0ZShwdGVwLCBwdGV2YWwpOwotCV9feGVuX3NldF9wdGUocHRlcCwgcHRldmFsKTsK LX0KLQotc3RhdGljIHZvaWQgeGVuX3NldF9wdGVfYXQoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVu c2lnbmVkIGxvbmcgYWRkciwKLQkJICAgIHB0ZV90ICpwdGVwLCBwdGVfdCBwdGV2YWwpCi17Ci0J dHJhY2VfeGVuX21tdV9zZXRfcHRlX2F0KG1tLCBhZGRyLCBwdGVwLCBwdGV2YWwpOwotCV9feGVu X3NldF9wdGUocHRlcCwgcHRldmFsKTsKLX0KLQotcHRlX3QgeGVuX3B0ZXBfbW9kaWZ5X3Byb3Rf c3RhcnQoc3RydWN0IG1tX3N0cnVjdCAqbW0sCi0JCQkJIHVuc2lnbmVkIGxvbmcgYWRkciwgcHRl X3QgKnB0ZXApCi17Ci0JLyogSnVzdCByZXR1cm4gdGhlIHB0ZSBhcy1pcy4gIFdlIHByZXNlcnZl IHRoZSBiaXRzIG9uIGNvbW1pdCAqLwotCXRyYWNlX3hlbl9tbXVfcHRlcF9tb2RpZnlfcHJvdF9z dGFydChtbSwgYWRkciwgcHRlcCwgKnB0ZXApOwotCXJldHVybiAqcHRlcDsKLX0KLQotdm9pZCB4 ZW5fcHRlcF9tb2RpZnlfcHJvdF9jb21taXQoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVk IGxvbmcgYWRkciwKLQkJCQkgcHRlX3QgKnB0ZXAsIHB0ZV90IHB0ZSkKLXsKLQlzdHJ1Y3QgbW11 X3VwZGF0ZSB1OwotCi0JdHJhY2VfeGVuX21tdV9wdGVwX21vZGlmeV9wcm90X2NvbW1pdChtbSwg YWRkciwgcHRlcCwgcHRlKTsKLQl4ZW5fbWNfYmF0Y2goKTsKLQotCXUucHRyID0gdmlydF90b19t YWNoaW5lKHB0ZXApLm1hZGRyIHwgTU1VX1BUX1VQREFURV9QUkVTRVJWRV9BRDsKLQl1LnZhbCA9 IHB0ZV92YWxfbWEocHRlKTsKLQl4ZW5fZXh0ZW5kX21tdV91cGRhdGUoJnUpOwotCi0JeGVuX21j X2lzc3VlKFBBUkFWSVJUX0xBWllfTU1VKTsKLX0KLQotLyogQXNzdW1lIHB0ZXZhbF90IGlzIGVx dWl2YWxlbnQgdG8gYWxsIHRoZSBvdGhlciAqdmFsX3QgdHlwZXMuICovCi1zdGF0aWMgcHRldmFs X3QgcHRlX21mbl90b19wZm4ocHRldmFsX3QgdmFsKQotewotCWlmICh2YWwgJiBfUEFHRV9QUkVT RU5UKSB7Ci0JCXVuc2lnbmVkIGxvbmcgbWZuID0gKHZhbCAmIFBURV9QRk5fTUFTSykgPj4gUEFH RV9TSElGVDsKLQkJdW5zaWduZWQgbG9uZyBwZm4gPSBtZm5fdG9fcGZuKG1mbik7Ci0KLQkJcHRl dmFsX3QgZmxhZ3MgPSB2YWwgJiBQVEVfRkxBR1NfTUFTSzsKLQkJaWYgKHVubGlrZWx5KHBmbiA9 PSB+MCkpCi0JCQl2YWwgPSBmbGFncyAmIH5fUEFHRV9QUkVTRU5UOwotCQllbHNlCi0JCQl2YWwg PSAoKHB0ZXZhbF90KXBmbiA8PCBQQUdFX1NISUZUKSB8IGZsYWdzOwotCX0KLQotCXJldHVybiB2 YWw7Ci19Ci0KLXN0YXRpYyBwdGV2YWxfdCBwdGVfcGZuX3RvX21mbihwdGV2YWxfdCB2YWwpCi17 Ci0JaWYgKHZhbCAmIF9QQUdFX1BSRVNFTlQpIHsKLQkJdW5zaWduZWQgbG9uZyBwZm4gPSAodmFs ICYgUFRFX1BGTl9NQVNLKSA+PiBQQUdFX1NISUZUOwotCQlwdGV2YWxfdCBmbGFncyA9IHZhbCAm IFBURV9GTEFHU19NQVNLOwotCQl1bnNpZ25lZCBsb25nIG1mbjsKLQotCQlpZiAoIXhlbl9mZWF0 dXJlKFhFTkZFQVRfYXV0b190cmFuc2xhdGVkX3BoeXNtYXApKQotCQkJbWZuID0gX19wZm5fdG9f bWZuKHBmbik7Ci0JCWVsc2UKLQkJCW1mbiA9IHBmbjsKLQkJLyoKLQkJICogSWYgdGhlcmUncyBu byBtZm4gZm9yIHRoZSBwZm4sIHRoZW4ganVzdCBjcmVhdGUgYW4KLQkJICogZW1wdHkgbm9uLXBy ZXNlbnQgcHRlLiAgVW5mb3J0dW5hdGVseSB0aGlzIGxvc2VzCi0JCSAqIGluZm9ybWF0aW9uIGFi b3V0IHRoZSBvcmlnaW5hbCBwZm4sIHNvCi0JCSAqIHB0ZV9tZm5fdG9fcGZuIGlzIGFzeW1tZXRy aWMuCi0JCSAqLwotCQlpZiAodW5saWtlbHkobWZuID09IElOVkFMSURfUDJNX0VOVFJZKSkgewot CQkJbWZuID0gMDsKLQkJCWZsYWdzID0gMDsKLQkJfSBlbHNlCi0JCQltZm4gJj0gfihGT1JFSUdO X0ZSQU1FX0JJVCB8IElERU5USVRZX0ZSQU1FX0JJVCk7Ci0JCXZhbCA9ICgocHRldmFsX3QpbWZu IDw8IFBBR0VfU0hJRlQpIHwgZmxhZ3M7Ci0JfQotCi0JcmV0dXJuIHZhbDsKLX0KLQotX192aXNp YmxlIHB0ZXZhbF90IHhlbl9wdGVfdmFsKHB0ZV90IHB0ZSkKLXsKLQlwdGV2YWxfdCBwdGV2YWwg PSBwdGUucHRlOwotCi0JcmV0dXJuIHB0ZV9tZm5fdG9fcGZuKHB0ZXZhbCk7Ci19Ci1QVl9DQUxM RUVfU0FWRV9SRUdTX1RIVU5LKHhlbl9wdGVfdmFsKTsKLQotX192aXNpYmxlIHBnZHZhbF90IHhl bl9wZ2RfdmFsKHBnZF90IHBnZCkKLXsKLQlyZXR1cm4gcHRlX21mbl90b19wZm4ocGdkLnBnZCk7 Ci19Ci1QVl9DQUxMRUVfU0FWRV9SRUdTX1RIVU5LKHhlbl9wZ2RfdmFsKTsKLQotX192aXNpYmxl IHB0ZV90IHhlbl9tYWtlX3B0ZShwdGV2YWxfdCBwdGUpCi17Ci0JcHRlID0gcHRlX3Bmbl90b19t Zm4ocHRlKTsKLQotCXJldHVybiBuYXRpdmVfbWFrZV9wdGUocHRlKTsKLX0KLVBWX0NBTExFRV9T QVZFX1JFR1NfVEhVTksoeGVuX21ha2VfcHRlKTsKLQotX192aXNpYmxlIHBnZF90IHhlbl9tYWtl X3BnZChwZ2R2YWxfdCBwZ2QpCi17Ci0JcGdkID0gcHRlX3Bmbl90b19tZm4ocGdkKTsKLQlyZXR1 cm4gbmF0aXZlX21ha2VfcGdkKHBnZCk7Ci19Ci1QVl9DQUxMRUVfU0FWRV9SRUdTX1RIVU5LKHhl bl9tYWtlX3BnZCk7Ci0KLV9fdmlzaWJsZSBwbWR2YWxfdCB4ZW5fcG1kX3ZhbChwbWRfdCBwbWQp Ci17Ci0JcmV0dXJuIHB0ZV9tZm5fdG9fcGZuKHBtZC5wbWQpOwotfQotUFZfQ0FMTEVFX1NBVkVf UkVHU19USFVOSyh4ZW5fcG1kX3ZhbCk7Ci0KLXN0YXRpYyB2b2lkIHhlbl9zZXRfcHVkX2h5cGVy KHB1ZF90ICpwdHIsIHB1ZF90IHZhbCkKLXsKLQlzdHJ1Y3QgbW11X3VwZGF0ZSB1OwotCi0JcHJl ZW1wdF9kaXNhYmxlKCk7Ci0KLQl4ZW5fbWNfYmF0Y2goKTsKLQotCS8qIHB0ciBtYXkgYmUgaW9y ZW1hcHBlZCBmb3IgNjQtYml0IHBhZ2V0YWJsZSBzZXR1cCAqLwotCXUucHRyID0gYXJiaXRyYXJ5 X3ZpcnRfdG9fbWFjaGluZShwdHIpLm1hZGRyOwotCXUudmFsID0gcHVkX3ZhbF9tYSh2YWwpOwot CXhlbl9leHRlbmRfbW11X3VwZGF0ZSgmdSk7Ci0KLQl4ZW5fbWNfaXNzdWUoUEFSQVZJUlRfTEFa WV9NTVUpOwotCi0JcHJlZW1wdF9lbmFibGUoKTsKLX0KLQotc3RhdGljIHZvaWQgeGVuX3NldF9w dWQocHVkX3QgKnB0ciwgcHVkX3QgdmFsKQotewotCXRyYWNlX3hlbl9tbXVfc2V0X3B1ZChwdHIs IHZhbCk7Ci0KLQkvKiBJZiBwYWdlIGlzIG5vdCBwaW5uZWQsIHdlIGNhbiBqdXN0IHVwZGF0ZSB0 aGUgZW50cnkKLQkgICBkaXJlY3RseSAqLwotCWlmICgheGVuX3BhZ2VfcGlubmVkKHB0cikpIHsK LQkJKnB0ciA9IHZhbDsKLQkJcmV0dXJuOwotCX0KLQotCXhlbl9zZXRfcHVkX2h5cGVyKHB0ciwg dmFsKTsKLX0KLQotI2lmZGVmIENPTkZJR19YODZfUEFFCi1zdGF0aWMgdm9pZCB4ZW5fc2V0X3B0 ZV9hdG9taWMocHRlX3QgKnB0ZXAsIHB0ZV90IHB0ZSkKLXsKLQl0cmFjZV94ZW5fbW11X3NldF9w dGVfYXRvbWljKHB0ZXAsIHB0ZSk7Ci0Jc2V0XzY0Yml0KCh1NjQgKilwdGVwLCBuYXRpdmVfcHRl X3ZhbChwdGUpKTsKLX0KLQotc3RhdGljIHZvaWQgeGVuX3B0ZV9jbGVhcihzdHJ1Y3QgbW1fc3Ry dWN0ICptbSwgdW5zaWduZWQgbG9uZyBhZGRyLCBwdGVfdCAqcHRlcCkKLXsKLQl0cmFjZV94ZW5f bW11X3B0ZV9jbGVhcihtbSwgYWRkciwgcHRlcCk7Ci0JaWYgKCF4ZW5fYmF0Y2hlZF9zZXRfcHRl KHB0ZXAsIG5hdGl2ZV9tYWtlX3B0ZSgwKSkpCi0JCW5hdGl2ZV9wdGVfY2xlYXIobW0sIGFkZHIs IHB0ZXApOwotfQotCi1zdGF0aWMgdm9pZCB4ZW5fcG1kX2NsZWFyKHBtZF90ICpwbWRwKQotewot CXRyYWNlX3hlbl9tbXVfcG1kX2NsZWFyKHBtZHApOwotCXNldF9wbWQocG1kcCwgX19wbWQoMCkp OwotfQotI2VuZGlmCS8qIENPTkZJR19YODZfUEFFICovCi0KLV9fdmlzaWJsZSBwbWRfdCB4ZW5f bWFrZV9wbWQocG1kdmFsX3QgcG1kKQotewotCXBtZCA9IHB0ZV9wZm5fdG9fbWZuKHBtZCk7Ci0J cmV0dXJuIG5hdGl2ZV9tYWtlX3BtZChwbWQpOwotfQotUFZfQ0FMTEVFX1NBVkVfUkVHU19USFVO Syh4ZW5fbWFrZV9wbWQpOwotCi0jaWYgQ09ORklHX1BHVEFCTEVfTEVWRUxTID09IDQKLV9fdmlz aWJsZSBwdWR2YWxfdCB4ZW5fcHVkX3ZhbChwdWRfdCBwdWQpCi17Ci0JcmV0dXJuIHB0ZV9tZm5f dG9fcGZuKHB1ZC5wdWQpOwotfQotUFZfQ0FMTEVFX1NBVkVfUkVHU19USFVOSyh4ZW5fcHVkX3Zh bCk7Ci0KLV9fdmlzaWJsZSBwdWRfdCB4ZW5fbWFrZV9wdWQocHVkdmFsX3QgcHVkKQotewotCXB1 ZCA9IHB0ZV9wZm5fdG9fbWZuKHB1ZCk7Ci0KLQlyZXR1cm4gbmF0aXZlX21ha2VfcHVkKHB1ZCk7 Ci19Ci1QVl9DQUxMRUVfU0FWRV9SRUdTX1RIVU5LKHhlbl9tYWtlX3B1ZCk7Ci0KLXN0YXRpYyBw Z2RfdCAqeGVuX2dldF91c2VyX3BnZChwZ2RfdCAqcGdkKQotewotCXBnZF90ICpwZ2RfcGFnZSA9 IChwZ2RfdCAqKSgoKHVuc2lnbmVkIGxvbmcpcGdkKSAmIFBBR0VfTUFTSyk7Ci0JdW5zaWduZWQg b2Zmc2V0ID0gcGdkIC0gcGdkX3BhZ2U7Ci0JcGdkX3QgKnVzZXJfcHRyID0gTlVMTDsKLQotCWlm IChvZmZzZXQgPCBwZ2RfaW5kZXgoVVNFUl9MSU1JVCkpIHsKLQkJc3RydWN0IHBhZ2UgKnBhZ2Ug PSB2aXJ0X3RvX3BhZ2UocGdkX3BhZ2UpOwotCQl1c2VyX3B0ciA9IChwZ2RfdCAqKXBhZ2UtPnBy aXZhdGU7Ci0JCWlmICh1c2VyX3B0cikKLQkJCXVzZXJfcHRyICs9IG9mZnNldDsKLQl9Ci0KLQly ZXR1cm4gdXNlcl9wdHI7Ci19Ci0KLXN0YXRpYyB2b2lkIF9feGVuX3NldF9wZ2RfaHlwZXIocGdk X3QgKnB0ciwgcGdkX3QgdmFsKQotewotCXN0cnVjdCBtbXVfdXBkYXRlIHU7Ci0KLQl1LnB0ciA9 IHZpcnRfdG9fbWFjaGluZShwdHIpLm1hZGRyOwotCXUudmFsID0gcGdkX3ZhbF9tYSh2YWwpOwot CXhlbl9leHRlbmRfbW11X3VwZGF0ZSgmdSk7Ci19Ci0KLS8qCi0gKiBSYXcgaHlwZXJjYWxsLWJh c2VkIHNldF9wZ2QsIGludGVuZGVkIGZvciBpbiBlYXJseSBib290IGJlZm9yZQotICogdGhlcmUn cyBhIHBhZ2Ugc3RydWN0dXJlLiAgVGhpcyBpbXBsaWVzOgotICogIDEuIFRoZSBvbmx5IGV4aXN0 aW5nIHBhZ2V0YWJsZSBpcyB0aGUga2VybmVsJ3MKLSAqICAyLiBJdCBpcyBhbHdheXMgcGlubmVk Ci0gKiAgMy4gSXQgaGFzIG5vIHVzZXIgcGFnZXRhYmxlIGF0dGFjaGVkIHRvIGl0Ci0gKi8KLXN0 YXRpYyB2b2lkIF9faW5pdCB4ZW5fc2V0X3BnZF9oeXBlcihwZ2RfdCAqcHRyLCBwZ2RfdCB2YWwp Ci17Ci0JcHJlZW1wdF9kaXNhYmxlKCk7Ci0KLQl4ZW5fbWNfYmF0Y2goKTsKLQotCV9feGVuX3Nl dF9wZ2RfaHlwZXIocHRyLCB2YWwpOwotCi0JeGVuX21jX2lzc3VlKFBBUkFWSVJUX0xBWllfTU1V KTsKLQotCXByZWVtcHRfZW5hYmxlKCk7Ci19Ci0KLXN0YXRpYyB2b2lkIHhlbl9zZXRfcGdkKHBn ZF90ICpwdHIsIHBnZF90IHZhbCkKLXsKLQlwZ2RfdCAqdXNlcl9wdHIgPSB4ZW5fZ2V0X3VzZXJf cGdkKHB0cik7Ci0KLQl0cmFjZV94ZW5fbW11X3NldF9wZ2QocHRyLCB1c2VyX3B0ciwgdmFsKTsK LQotCS8qIElmIHBhZ2UgaXMgbm90IHBpbm5lZCwgd2UgY2FuIGp1c3QgdXBkYXRlIHRoZSBlbnRy eQotCSAgIGRpcmVjdGx5ICovCi0JaWYgKCF4ZW5fcGFnZV9waW5uZWQocHRyKSkgewotCQkqcHRy ID0gdmFsOwotCQlpZiAodXNlcl9wdHIpIHsKLQkJCVdBUk5fT04oeGVuX3BhZ2VfcGlubmVkKHVz ZXJfcHRyKSk7Ci0JCQkqdXNlcl9wdHIgPSB2YWw7Ci0JCX0KLQkJcmV0dXJuOwotCX0KLQotCS8q IElmIGl0J3MgcGlubmVkLCB0aGVuIHdlIGNhbiBhdCBsZWFzdCBiYXRjaCB0aGUga2VybmVsIGFu ZAotCSAgIHVzZXIgdXBkYXRlcyB0b2dldGhlci4gKi8KLQl4ZW5fbWNfYmF0Y2goKTsKLQotCV9f eGVuX3NldF9wZ2RfaHlwZXIocHRyLCB2YWwpOwotCWlmICh1c2VyX3B0cikKLQkJX194ZW5fc2V0 X3BnZF9oeXBlcih1c2VyX3B0ciwgdmFsKTsKLQotCXhlbl9tY19pc3N1ZShQQVJBVklSVF9MQVpZ X01NVSk7Ci19Ci0jZW5kaWYJLyogQ09ORklHX1BHVEFCTEVfTEVWRUxTID09IDQgKi8KLQotLyoK LSAqIChZZXQgYW5vdGhlcikgcGFnZXRhYmxlIHdhbGtlci4gIFRoaXMgb25lIGlzIGludGVuZGVk IGZvciBwaW5uaW5nIGEKLSAqIHBhZ2V0YWJsZS4gIFRoaXMgbWVhbnMgdGhhdCBpdCB3YWxrcyBh IHBhZ2V0YWJsZSBhbmQgY2FsbHMgdGhlCi0gKiBjYWxsYmFjayBmdW5jdGlvbiBvbiBlYWNoIHBh Z2UgaXQgZmluZHMgbWFraW5nIHVwIHRoZSBwYWdlIHRhYmxlLAotICogYXQgZXZlcnkgbGV2ZWwu ICBJdCB3YWxrcyB0aGUgZW50aXJlIHBhZ2V0YWJsZSwgYnV0IGl0IG9ubHkgYm90aGVycwotICog cGlubmluZyBwdGUgcGFnZXMgd2hpY2ggYXJlIGJlbG93IGxpbWl0LiAgSW4gdGhlIG5vcm1hbCBj YXNlIHRoaXMKLSAqIHdpbGwgYmUgU1RBQ0tfVE9QX01BWCwgYnV0IGF0IGJvb3Qgd2UgbmVlZCB0 byBwaW4gdXAgdG8KLSAqIEZJWEFERFJfVE9QLgotICoKLSAqIEZvciAzMi1iaXQgdGhlIGltcG9y dGFudCBiaXQgaXMgdGhhdCB3ZSBkb24ndCBwaW4gYmV5b25kIHRoZXJlLAotICogYmVjYXVzZSB0 aGVuIHdlIHN0YXJ0IGdldHRpbmcgaW50byBYZW4ncyBwdGVzLgotICoKLSAqIEZvciA2NC1iaXQs IHdlIG11c3Qgc2tpcCB0aGUgWGVuIGhvbGUgaW4gdGhlIG1pZGRsZSBvZiB0aGUgYWRkcmVzcwot ICogc3BhY2UsIGp1c3QgYWZ0ZXIgdGhlIGJpZyB4ODYtNjQgdmlydHVhbCBob2xlLgotICovCi1z dGF0aWMgaW50IF9feGVuX3BnZF93YWxrKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCBwZ2RfdCAqcGdk LAotCQkJICBpbnQgKCpmdW5jKShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgc3RydWN0IHBhZ2UgKiwK LQkJCQkgICAgICBlbnVtIHB0X2xldmVsKSwKLQkJCSAgdW5zaWduZWQgbG9uZyBsaW1pdCkKLXsK LQlpbnQgZmx1c2ggPSAwOwotCXVuc2lnbmVkIGhvbGVfbG93LCBob2xlX2hpZ2g7Ci0JdW5zaWdu ZWQgcGdkaWR4X2xpbWl0LCBwdWRpZHhfbGltaXQsIHBtZGlkeF9saW1pdDsKLQl1bnNpZ25lZCBw Z2RpZHgsIHB1ZGlkeCwgcG1kaWR4OwotCi0JLyogVGhlIGxpbWl0IGlzIHRoZSBsYXN0IGJ5dGUg dG8gYmUgdG91Y2hlZCAqLwotCWxpbWl0LS07Ci0JQlVHX09OKGxpbWl0ID49IEZJWEFERFJfVE9Q KTsKLQotCWlmICh4ZW5fZmVhdHVyZShYRU5GRUFUX2F1dG9fdHJhbnNsYXRlZF9waHlzbWFwKSkK LQkJcmV0dXJuIDA7Ci0KLQkvKgotCSAqIDY0LWJpdCBoYXMgYSBncmVhdCBiaWcgaG9sZSBpbiB0 aGUgbWlkZGxlIG9mIHRoZSBhZGRyZXNzCi0JICogc3BhY2UsIHdoaWNoIGNvbnRhaW5zIHRoZSBY ZW4gbWFwcGluZ3MuICBPbiAzMi1iaXQgdGhlc2UKLQkgKiB3aWxsIGVuZCB1cCBtYWtpbmcgYSB6 ZXJvLXNpemVkIGhvbGUgYW5kIHNvIGlzIGEgbm8tb3AuCi0JICovCi0JaG9sZV9sb3cgPSBwZ2Rf aW5kZXgoVVNFUl9MSU1JVCk7Ci0JaG9sZV9oaWdoID0gcGdkX2luZGV4KFBBR0VfT0ZGU0VUKTsK LQotCXBnZGlkeF9saW1pdCA9IHBnZF9pbmRleChsaW1pdCk7Ci0jaWYgUFRSU19QRVJfUFVEID4g MQotCXB1ZGlkeF9saW1pdCA9IHB1ZF9pbmRleChsaW1pdCk7Ci0jZWxzZQotCXB1ZGlkeF9saW1p dCA9IDA7Ci0jZW5kaWYKLSNpZiBQVFJTX1BFUl9QTUQgPiAxCi0JcG1kaWR4X2xpbWl0ID0gcG1k X2luZGV4KGxpbWl0KTsKLSNlbHNlCi0JcG1kaWR4X2xpbWl0ID0gMDsKLSNlbmRpZgotCi0JZm9y IChwZ2RpZHggPSAwOyBwZ2RpZHggPD0gcGdkaWR4X2xpbWl0OyBwZ2RpZHgrKykgewotCQlwdWRf dCAqcHVkOwotCi0JCWlmIChwZ2RpZHggPj0gaG9sZV9sb3cgJiYgcGdkaWR4IDwgaG9sZV9oaWdo KQotCQkJY29udGludWU7Ci0KLQkJaWYgKCFwZ2RfdmFsKHBnZFtwZ2RpZHhdKSkKLQkJCWNvbnRp bnVlOwotCi0JCXB1ZCA9IHB1ZF9vZmZzZXQoJnBnZFtwZ2RpZHhdLCAwKTsKLQotCQlpZiAoUFRS U19QRVJfUFVEID4gMSkgLyogbm90IGZvbGRlZCAqLwotCQkJZmx1c2ggfD0gKCpmdW5jKShtbSwg dmlydF90b19wYWdlKHB1ZCksIFBUX1BVRCk7Ci0KLQkJZm9yIChwdWRpZHggPSAwOyBwdWRpZHgg PCBQVFJTX1BFUl9QVUQ7IHB1ZGlkeCsrKSB7Ci0JCQlwbWRfdCAqcG1kOwotCi0JCQlpZiAocGdk aWR4ID09IHBnZGlkeF9saW1pdCAmJgotCQkJICAgIHB1ZGlkeCA+IHB1ZGlkeF9saW1pdCkKLQkJ CQlnb3RvIG91dDsKLQotCQkJaWYgKHB1ZF9ub25lKHB1ZFtwdWRpZHhdKSkKLQkJCQljb250aW51 ZTsKLQotCQkJcG1kID0gcG1kX29mZnNldCgmcHVkW3B1ZGlkeF0sIDApOwotCi0JCQlpZiAoUFRS U19QRVJfUE1EID4gMSkgLyogbm90IGZvbGRlZCAqLwotCQkJCWZsdXNoIHw9ICgqZnVuYykobW0s IHZpcnRfdG9fcGFnZShwbWQpLCBQVF9QTUQpOwotCi0JCQlmb3IgKHBtZGlkeCA9IDA7IHBtZGlk eCA8IFBUUlNfUEVSX1BNRDsgcG1kaWR4KyspIHsKLQkJCQlzdHJ1Y3QgcGFnZSAqcHRlOwotCi0J CQkJaWYgKHBnZGlkeCA9PSBwZ2RpZHhfbGltaXQgJiYKLQkJCQkgICAgcHVkaWR4ID09IHB1ZGlk eF9saW1pdCAmJgotCQkJCSAgICBwbWRpZHggPiBwbWRpZHhfbGltaXQpCi0JCQkJCWdvdG8gb3V0 OwotCi0JCQkJaWYgKHBtZF9ub25lKHBtZFtwbWRpZHhdKSkKLQkJCQkJY29udGludWU7Ci0KLQkJ CQlwdGUgPSBwbWRfcGFnZShwbWRbcG1kaWR4XSk7Ci0JCQkJZmx1c2ggfD0gKCpmdW5jKShtbSwg cHRlLCBQVF9QVEUpOwotCQkJfQotCQl9Ci0JfQotCi1vdXQ6Ci0JLyogRG8gdGhlIHRvcCBsZXZl bCBsYXN0LCBzbyB0aGF0IHRoZSBjYWxsYmFja3MgY2FuIHVzZSBpdCBhcwotCSAgIGEgY3VlIHRv IGRvIGZpbmFsIHRoaW5ncyBsaWtlIHRsYiBmbHVzaGVzLiAqLwotCWZsdXNoIHw9ICgqZnVuYyko bW0sIHZpcnRfdG9fcGFnZShwZ2QpLCBQVF9QR0QpOwotCi0JcmV0dXJuIGZsdXNoOwotfQotCi1z dGF0aWMgaW50IHhlbl9wZ2Rfd2FsayhzdHJ1Y3QgbW1fc3RydWN0ICptbSwKLQkJCWludCAoKmZ1 bmMpKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCBzdHJ1Y3QgcGFnZSAqLAotCQkJCSAgICBlbnVtIHB0 X2xldmVsKSwKLQkJCXVuc2lnbmVkIGxvbmcgbGltaXQpCi17Ci0JcmV0dXJuIF9feGVuX3BnZF93 YWxrKG1tLCBtbS0+cGdkLCBmdW5jLCBsaW1pdCk7Ci19Ci0KLS8qIElmIHdlJ3JlIHVzaW5nIHNw bGl0IHB0ZSBsb2NrcywgdGhlbiB0YWtlIHRoZSBwYWdlJ3MgbG9jayBhbmQKLSAgIHJldHVybiBh IHBvaW50ZXIgdG8gaXQuICBPdGhlcndpc2UgcmV0dXJuIE5VTEwuICovCi1zdGF0aWMgc3Bpbmxv Y2tfdCAqeGVuX3B0ZV9sb2NrKHN0cnVjdCBwYWdlICpwYWdlLCBzdHJ1Y3QgbW1fc3RydWN0ICpt bSkKLXsKLQlzcGlubG9ja190ICpwdGwgPSBOVUxMOwotCi0jaWYgVVNFX1NQTElUX1BURV9QVExP Q0tTCi0JcHRsID0gcHRsb2NrX3B0cihwYWdlKTsKLQlzcGluX2xvY2tfbmVzdF9sb2NrKHB0bCwg Jm1tLT5wYWdlX3RhYmxlX2xvY2spOwotI2VuZGlmCi0KLQlyZXR1cm4gcHRsOwotfQotCi1zdGF0 aWMgdm9pZCB4ZW5fcHRlX3VubG9jayh2b2lkICp2KQotewotCXNwaW5sb2NrX3QgKnB0bCA9IHY7 Ci0Jc3Bpbl91bmxvY2socHRsKTsKLX0KLQotc3RhdGljIHZvaWQgeGVuX2RvX3Bpbih1bnNpZ25l ZCBsZXZlbCwgdW5zaWduZWQgbG9uZyBwZm4pCi17Ci0Jc3RydWN0IG1tdWV4dF9vcCBvcDsKLQot CW9wLmNtZCA9IGxldmVsOwotCW9wLmFyZzEubWZuID0gcGZuX3RvX21mbihwZm4pOwotCi0JeGVu X2V4dGVuZF9tbXVleHRfb3AoJm9wKTsKLX0KLQotc3RhdGljIGludCB4ZW5fcGluX3BhZ2Uoc3Ry dWN0IG1tX3N0cnVjdCAqbW0sIHN0cnVjdCBwYWdlICpwYWdlLAotCQkJZW51bSBwdF9sZXZlbCBs ZXZlbCkKLXsKLQl1bnNpZ25lZCBwZ2ZsID0gVGVzdFNldFBhZ2VQaW5uZWQocGFnZSk7Ci0JaW50 IGZsdXNoOwotCi0JaWYgKHBnZmwpCi0JCWZsdXNoID0gMDsJCS8qIGFscmVhZHkgcGlubmVkICov Ci0JZWxzZSBpZiAoUGFnZUhpZ2hNZW0ocGFnZSkpCi0JCS8qIGttYXBzIG5lZWQgZmx1c2hpbmcg aWYgd2UgZm91bmQgYW4gdW5waW5uZWQKLQkJICAgaGlnaHBhZ2UgKi8KLQkJZmx1c2ggPSAxOwot CWVsc2UgewotCQl2b2lkICpwdCA9IGxvd21lbV9wYWdlX2FkZHJlc3MocGFnZSk7Ci0JCXVuc2ln bmVkIGxvbmcgcGZuID0gcGFnZV90b19wZm4ocGFnZSk7Ci0JCXN0cnVjdCBtdWx0aWNhbGxfc3Bh Y2UgbWNzID0gX194ZW5fbWNfZW50cnkoMCk7Ci0JCXNwaW5sb2NrX3QgKnB0bDsKLQotCQlmbHVz aCA9IDA7Ci0KLQkJLyoKLQkJICogV2UgbmVlZCB0byBob2xkIHRoZSBwYWdldGFibGUgbG9jayBi ZXR3ZWVuIHRoZSB0aW1lCi0JCSAqIHdlIG1ha2UgdGhlIHBhZ2V0YWJsZSBSTyBhbmQgd2hlbiB3 ZSBhY3R1YWxseSBwaW4KLQkJICogaXQuICBJZiB3ZSBkb24ndCwgdGhlbiBvdGhlciB1c2VycyBt YXkgY29tZSBpbiBhbmQKLQkJICogYXR0ZW1wdCB0byB1cGRhdGUgdGhlIHBhZ2V0YWJsZSBieSB3 cml0aW5nIGl0LAotCQkgKiB3aGljaCB3aWxsIGZhaWwgYmVjYXVzZSB0aGUgbWVtb3J5IGlzIFJP IGJ1dCBub3QKLQkJICogcGlubmVkLCBzbyBYZW4gd29uJ3QgZG8gdGhlIHRyYXAnbidlbXVsYXRl LgotCQkgKgotCQkgKiBJZiB3ZSdyZSB1c2luZyBzcGxpdCBwdGUgbG9ja3MsIHdlIGNhbid0IGhv bGQgdGhlCi0JCSAqIGVudGlyZSBwYWdldGFibGUncyB3b3J0aCBvZiBsb2NrcyBkdXJpbmcgdGhl Ci0JCSAqIHRyYXZlcnNlLCBiZWNhdXNlIHdlIG1heSB3cmFwIHRoZSBwcmVlbXB0IGNvdW50ICg4 Ci0JCSAqIGJpdHMpLiAgVGhlIHNvbHV0aW9uIGlzIHRvIG1hcmsgUk8gYW5kIHBpbiBlYWNoIFBU RQotCQkgKiBwYWdlIHdoaWxlIGhvbGRpbmcgdGhlIGxvY2suICBUaGlzIG1lYW5zIHRoZSBudW1i ZXIKLQkJICogb2YgbG9ja3Mgd2UgZW5kIHVwIGhvbGRpbmcgaXMgbmV2ZXIgbW9yZSB0aGFuIGEK LQkJICogYmF0Y2ggc2l6ZSAofjMyIGVudHJpZXMsIGF0IHByZXNlbnQpLgotCQkgKgotCQkgKiBJ ZiB3ZSdyZSBub3QgdXNpbmcgc3BsaXQgcHRlIGxvY2tzLCB3ZSBuZWVkbid0IHBpbgotCQkgKiB0 aGUgUFRFIHBhZ2VzIGluZGVwZW5kZW50bHksIGJlY2F1c2Ugd2UncmUKLQkJICogcHJvdGVjdGVk IGJ5IHRoZSBvdmVyYWxsIHBhZ2V0YWJsZSBsb2NrLgotCQkgKi8KLQkJcHRsID0gTlVMTDsKLQkJ aWYgKGxldmVsID09IFBUX1BURSkKLQkJCXB0bCA9IHhlbl9wdGVfbG9jayhwYWdlLCBtbSk7Ci0K LQkJTVVMVElfdXBkYXRlX3ZhX21hcHBpbmcobWNzLm1jLCAodW5zaWduZWQgbG9uZylwdCwKLQkJ CQkJcGZuX3B0ZShwZm4sIFBBR0VfS0VSTkVMX1JPKSwKLQkJCQkJbGV2ZWwgPT0gUFRfUEdEID8g VVZNRl9UTEJfRkxVU0ggOiAwKTsKLQotCQlpZiAocHRsKSB7Ci0JCQl4ZW5fZG9fcGluKE1NVUVY VF9QSU5fTDFfVEFCTEUsIHBmbik7Ci0KLQkJCS8qIFF1ZXVlIGEgZGVmZXJyZWQgdW5sb2NrIGZv ciB3aGVuIHRoaXMgYmF0Y2gKLQkJCSAgIGlzIGNvbXBsZXRlZC4gKi8KLQkJCXhlbl9tY19jYWxs YmFjayh4ZW5fcHRlX3VubG9jaywgcHRsKTsKLQkJfQotCX0KLQotCXJldHVybiBmbHVzaDsKLX0K LQotLyogVGhpcyBpcyBjYWxsZWQganVzdCBhZnRlciBhIG1tIGhhcyBiZWVuIGNyZWF0ZWQsIGJ1 dCBpdCBoYXMgbm90Ci0gICBiZWVuIHVzZWQgeWV0LiAgV2UgbmVlZCB0byBtYWtlIHN1cmUgdGhh dCBpdHMgcGFnZXRhYmxlIGlzIGFsbAotICAgcmVhZC1vbmx5LCBhbmQgY2FuIGJlIHBpbm5lZC4g Ki8KLXN0YXRpYyB2b2lkIF9feGVuX3BnZF9waW4oc3RydWN0IG1tX3N0cnVjdCAqbW0sIHBnZF90 ICpwZ2QpCi17Ci0JdHJhY2VfeGVuX21tdV9wZ2RfcGluKG1tLCBwZ2QpOwotCi0JeGVuX21jX2Jh dGNoKCk7Ci0KLQlpZiAoX194ZW5fcGdkX3dhbGsobW0sIHBnZCwgeGVuX3Bpbl9wYWdlLCBVU0VS X0xJTUlUKSkgewotCQkvKiByZS1lbmFibGUgaW50ZXJydXB0cyBmb3IgZmx1c2hpbmcgKi8KLQkJ eGVuX21jX2lzc3VlKDApOwotCi0JCWttYXBfZmx1c2hfdW51c2VkKCk7Ci0KLQkJeGVuX21jX2Jh dGNoKCk7Ci0JfQotCi0jaWZkZWYgQ09ORklHX1g4Nl82NAotCXsKLQkJcGdkX3QgKnVzZXJfcGdk ID0geGVuX2dldF91c2VyX3BnZChwZ2QpOwotCi0JCXhlbl9kb19waW4oTU1VRVhUX1BJTl9MNF9U QUJMRSwgUEZOX0RPV04oX19wYShwZ2QpKSk7Ci0KLQkJaWYgKHVzZXJfcGdkKSB7Ci0JCQl4ZW5f cGluX3BhZ2UobW0sIHZpcnRfdG9fcGFnZSh1c2VyX3BnZCksIFBUX1BHRCk7Ci0JCQl4ZW5fZG9f cGluKE1NVUVYVF9QSU5fTDRfVEFCTEUsCi0JCQkJICAgUEZOX0RPV04oX19wYSh1c2VyX3BnZCkp KTsKLQkJfQotCX0KLSNlbHNlIC8qIENPTkZJR19YODZfMzIgKi8KLSNpZmRlZiBDT05GSUdfWDg2 X1BBRQotCS8qIE5lZWQgdG8gbWFrZSBzdXJlIHVuc2hhcmVkIGtlcm5lbCBQTUQgaXMgcGlubmFi bGUgKi8KLQl4ZW5fcGluX3BhZ2UobW0sIHBnZF9wYWdlKHBnZFtwZ2RfaW5kZXgoVEFTS19TSVpF KV0pLAotCQkgICAgIFBUX1BNRCk7Ci0jZW5kaWYKLQl4ZW5fZG9fcGluKE1NVUVYVF9QSU5fTDNf VEFCTEUsIFBGTl9ET1dOKF9fcGEocGdkKSkpOwotI2VuZGlmIC8qIENPTkZJR19YODZfNjQgKi8K LQl4ZW5fbWNfaXNzdWUoMCk7Ci19Ci0KLXN0YXRpYyB2b2lkIHhlbl9wZ2RfcGluKHN0cnVjdCBt bV9zdHJ1Y3QgKm1tKQotewotCV9feGVuX3BnZF9waW4obW0sIG1tLT5wZ2QpOwotfQotCi0vKgot ICogT24gc2F2ZSwgd2UgbmVlZCB0byBwaW4gYWxsIHBhZ2V0YWJsZXMgdG8gbWFrZSBzdXJlIHRo ZXkgZ2V0IHRoZWlyCi0gKiBtZm5zIHR1cm5lZCBpbnRvIHBmbnMuICBTZWFyY2ggdGhlIGxpc3Qg Zm9yIGFueSB1bnBpbm5lZCBwZ2RzIGFuZCBwaW4KLSAqIHRoZW0gKHVucGlubmVkIHBnZHMgYXJl IG5vdCBjdXJyZW50bHkgaW4gdXNlLCBwcm9iYWJseSBiZWNhdXNlIHRoZQotICogcHJvY2VzcyBp cyB1bmRlciBjb25zdHJ1Y3Rpb24gb3IgZGVzdHJ1Y3Rpb24pLgotICoKLSAqIEV4cGVjdGVkIHRv IGJlIGNhbGxlZCBpbiBzdG9wX21hY2hpbmUoKSAoImVxdWl2YWxlbnQgdG8gdGFraW5nCi0gKiBl dmVyeSBzcGlubG9jayBpbiB0aGUgc3lzdGVtIiksIHNvIHRoZSBsb2NraW5nIGRvZXNuJ3QgcmVh bGx5Ci0gKiBtYXR0ZXIgYWxsIHRoYXQgbXVjaC4KLSAqLwotdm9pZCB4ZW5fbW1fcGluX2FsbCh2 b2lkKQotewotCXN0cnVjdCBwYWdlICpwYWdlOwotCi0Jc3Bpbl9sb2NrKCZwZ2RfbG9jayk7Ci0K LQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHBhZ2UsICZwZ2RfbGlzdCwgbHJ1KSB7Ci0JCWlmICghUGFn ZVBpbm5lZChwYWdlKSkgewotCQkJX194ZW5fcGdkX3BpbigmaW5pdF9tbSwgKHBnZF90ICopcGFn ZV9hZGRyZXNzKHBhZ2UpKTsKLQkJCVNldFBhZ2VTYXZlUGlubmVkKHBhZ2UpOwotCQl9Ci0JfQot Ci0Jc3Bpbl91bmxvY2soJnBnZF9sb2NrKTsKLX0KLQotLyoKLSAqIFRoZSBpbml0X21tIHBhZ2V0 YWJsZSBpcyByZWFsbHkgcGlubmVkIGFzIHNvb24gYXMgaXRzIGNyZWF0ZWQsIGJ1dAotICogdGhh dCdzIGJlZm9yZSB3ZSBoYXZlIHBhZ2Ugc3RydWN0dXJlcyB0byBzdG9yZSB0aGUgYml0cy4gIFNv IGRvIGFsbAotICogdGhlIGJvb2sta2VlcGluZyBub3cuCi0gKi8KLXN0YXRpYyBpbnQgX19pbml0 IHhlbl9tYXJrX3Bpbm5lZChzdHJ1Y3QgbW1fc3RydWN0ICptbSwgc3RydWN0IHBhZ2UgKnBhZ2Us Ci0JCQkJICBlbnVtIHB0X2xldmVsIGxldmVsKQotewotCVNldFBhZ2VQaW5uZWQocGFnZSk7Ci0J cmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIF9faW5pdCB4ZW5fbWFya19pbml0X21tX3Bpbm5l ZCh2b2lkKQotewotCXhlbl9wZ2Rfd2FsaygmaW5pdF9tbSwgeGVuX21hcmtfcGlubmVkLCBGSVhB RERSX1RPUCk7Ci19Ci0KLXN0YXRpYyBpbnQgeGVuX3VucGluX3BhZ2Uoc3RydWN0IG1tX3N0cnVj dCAqbW0sIHN0cnVjdCBwYWdlICpwYWdlLAotCQkJICBlbnVtIHB0X2xldmVsIGxldmVsKQotewot CXVuc2lnbmVkIHBnZmwgPSBUZXN0Q2xlYXJQYWdlUGlubmVkKHBhZ2UpOwotCi0JaWYgKHBnZmwg JiYgIVBhZ2VIaWdoTWVtKHBhZ2UpKSB7Ci0JCXZvaWQgKnB0ID0gbG93bWVtX3BhZ2VfYWRkcmVz cyhwYWdlKTsKLQkJdW5zaWduZWQgbG9uZyBwZm4gPSBwYWdlX3RvX3BmbihwYWdlKTsKLQkJc3Bp bmxvY2tfdCAqcHRsID0gTlVMTDsKLQkJc3RydWN0IG11bHRpY2FsbF9zcGFjZSBtY3M7Ci0KLQkJ LyoKLQkJICogRG8gdGhlIGNvbnZlcnNlIHRvIHBpbl9wYWdlLiAgSWYgd2UncmUgdXNpbmcgc3Bs aXQKLQkJICogcHRlIGxvY2tzLCB3ZSBtdXN0IGJlIGhvbGRpbmcgdGhlIGxvY2sgZm9yIHdoaWxl Ci0JCSAqIHRoZSBwdGUgcGFnZSBpcyB1bnBpbm5lZCBidXQgc3RpbGwgUk8gdG8gcHJldmVudAot CQkgKiBjb25jdXJyZW50IHVwZGF0ZXMgZnJvbSBzZWVpbmcgaXQgaW4gdGhpcwotCQkgKiBwYXJ0 aWFsbHktcGlubmVkIHN0YXRlLgotCQkgKi8KLQkJaWYgKGxldmVsID09IFBUX1BURSkgewotCQkJ cHRsID0geGVuX3B0ZV9sb2NrKHBhZ2UsIG1tKTsKLQotCQkJaWYgKHB0bCkKLQkJCQl4ZW5fZG9f cGluKE1NVUVYVF9VTlBJTl9UQUJMRSwgcGZuKTsKLQkJfQotCi0JCW1jcyA9IF9feGVuX21jX2Vu dHJ5KDApOwotCi0JCU1VTFRJX3VwZGF0ZV92YV9tYXBwaW5nKG1jcy5tYywgKHVuc2lnbmVkIGxv bmcpcHQsCi0JCQkJCXBmbl9wdGUocGZuLCBQQUdFX0tFUk5FTCksCi0JCQkJCWxldmVsID09IFBU X1BHRCA/IFVWTUZfVExCX0ZMVVNIIDogMCk7Ci0KLQkJaWYgKHB0bCkgewotCQkJLyogdW5sb2Nr IHdoZW4gYmF0Y2ggY29tcGxldGVkICovCi0JCQl4ZW5fbWNfY2FsbGJhY2soeGVuX3B0ZV91bmxv Y2ssIHB0bCk7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gMDsJCS8qIG5ldmVyIG5lZWQgdG8gZmx1c2gg b24gdW5waW4gKi8KLX0KLQotLyogUmVsZWFzZSBhIHBhZ2V0YWJsZXMgcGFnZXMgYmFjayBhcyBu b3JtYWwgUlcgKi8KLXN0YXRpYyB2b2lkIF9feGVuX3BnZF91bnBpbihzdHJ1Y3QgbW1fc3RydWN0 ICptbSwgcGdkX3QgKnBnZCkKLXsKLQl0cmFjZV94ZW5fbW11X3BnZF91bnBpbihtbSwgcGdkKTsK LQotCXhlbl9tY19iYXRjaCgpOwotCi0JeGVuX2RvX3BpbihNTVVFWFRfVU5QSU5fVEFCTEUsIFBG Tl9ET1dOKF9fcGEocGdkKSkpOwotCi0jaWZkZWYgQ09ORklHX1g4Nl82NAotCXsKLQkJcGdkX3Qg KnVzZXJfcGdkID0geGVuX2dldF91c2VyX3BnZChwZ2QpOwotCi0JCWlmICh1c2VyX3BnZCkgewot CQkJeGVuX2RvX3BpbihNTVVFWFRfVU5QSU5fVEFCTEUsCi0JCQkJICAgUEZOX0RPV04oX19wYSh1 c2VyX3BnZCkpKTsKLQkJCXhlbl91bnBpbl9wYWdlKG1tLCB2aXJ0X3RvX3BhZ2UodXNlcl9wZ2Qp LCBQVF9QR0QpOwotCQl9Ci0JfQotI2VuZGlmCi0KLSNpZmRlZiBDT05GSUdfWDg2X1BBRQotCS8q IE5lZWQgdG8gbWFrZSBzdXJlIHVuc2hhcmVkIGtlcm5lbCBQTUQgaXMgdW5waW5uZWQgKi8KLQl4 ZW5fdW5waW5fcGFnZShtbSwgcGdkX3BhZ2UocGdkW3BnZF9pbmRleChUQVNLX1NJWkUpXSksCi0J CSAgICAgICBQVF9QTUQpOwotI2VuZGlmCi0KLQlfX3hlbl9wZ2Rfd2FsayhtbSwgcGdkLCB4ZW5f dW5waW5fcGFnZSwgVVNFUl9MSU1JVCk7Ci0KLQl4ZW5fbWNfaXNzdWUoMCk7Ci19Ci0KLXN0YXRp YyB2b2lkIHhlbl9wZ2RfdW5waW4oc3RydWN0IG1tX3N0cnVjdCAqbW0pCi17Ci0JX194ZW5fcGdk X3VucGluKG1tLCBtbS0+cGdkKTsKLX0KLQotLyoKLSAqIE9uIHJlc3VtZSwgdW5kbyBhbnkgcGlu bmluZyBkb25lIGF0IHNhdmUsIHNvIHRoYXQgdGhlIHJlc3Qgb2YgdGhlCi0gKiBrZXJuZWwgZG9l c24ndCBzZWUgYW55IHVuZXhwZWN0ZWQgcGlubmVkIHBhZ2V0YWJsZXMuCi0gKi8KLXZvaWQgeGVu X21tX3VucGluX2FsbCh2b2lkKQotewotCXN0cnVjdCBwYWdlICpwYWdlOwotCi0Jc3Bpbl9sb2Nr KCZwZ2RfbG9jayk7Ci0KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHBhZ2UsICZwZ2RfbGlzdCwgbHJ1 KSB7Ci0JCWlmIChQYWdlU2F2ZVBpbm5lZChwYWdlKSkgewotCQkJQlVHX09OKCFQYWdlUGlubmVk KHBhZ2UpKTsKLQkJCV9feGVuX3BnZF91bnBpbigmaW5pdF9tbSwgKHBnZF90ICopcGFnZV9hZGRy ZXNzKHBhZ2UpKTsKLQkJCUNsZWFyUGFnZVNhdmVQaW5uZWQocGFnZSk7Ci0JCX0KLQl9Ci0KLQlz cGluX3VubG9jaygmcGdkX2xvY2spOwotfQotCi1zdGF0aWMgdm9pZCB4ZW5fYWN0aXZhdGVfbW0o c3RydWN0IG1tX3N0cnVjdCAqcHJldiwgc3RydWN0IG1tX3N0cnVjdCAqbmV4dCkKLXsKLQlzcGlu X2xvY2soJm5leHQtPnBhZ2VfdGFibGVfbG9jayk7Ci0JeGVuX3BnZF9waW4obmV4dCk7Ci0Jc3Bp bl91bmxvY2soJm5leHQtPnBhZ2VfdGFibGVfbG9jayk7Ci19Ci0KLXN0YXRpYyB2b2lkIHhlbl9k dXBfbW1hcChzdHJ1Y3QgbW1fc3RydWN0ICpvbGRtbSwgc3RydWN0IG1tX3N0cnVjdCAqbW0pCi17 Ci0Jc3Bpbl9sb2NrKCZtbS0+cGFnZV90YWJsZV9sb2NrKTsKLQl4ZW5fcGdkX3BpbihtbSk7Ci0J c3Bpbl91bmxvY2soJm1tLT5wYWdlX3RhYmxlX2xvY2spOwotfQotCi0KLSNpZmRlZiBDT05GSUdf U01QCi0vKiBBbm90aGVyIGNwdSBtYXkgc3RpbGwgaGF2ZSB0aGVpciAlY3IzIHBvaW50aW5nIGF0 IHRoZSBwYWdldGFibGUsIHNvCi0gICB3ZSBuZWVkIHRvIHJlcG9pbnQgaXQgc29tZXdoZXJlIGVs c2UgYmVmb3JlIHdlIGNhbiB1bnBpbiBpdC4gKi8KLXN0YXRpYyB2b2lkIGRyb3Bfb3RoZXJfbW1f cmVmKHZvaWQgKmluZm8pCi17Ci0Jc3RydWN0IG1tX3N0cnVjdCAqbW0gPSBpbmZvOwotCXN0cnVj dCBtbV9zdHJ1Y3QgKmFjdGl2ZV9tbTsKLQotCWFjdGl2ZV9tbSA9IHRoaXNfY3B1X3JlYWQoY3B1 X3RsYnN0YXRlLmFjdGl2ZV9tbSk7Ci0KLQlpZiAoYWN0aXZlX21tID09IG1tICYmIHRoaXNfY3B1 X3JlYWQoY3B1X3RsYnN0YXRlLnN0YXRlKSAhPSBUTEJTVEFURV9PSykKLQkJbGVhdmVfbW0oc21w X3Byb2Nlc3Nvcl9pZCgpKTsKLQotCS8qIElmIHRoaXMgY3B1IHN0aWxsIGhhcyBhIHN0YWxlIGNy MyByZWZlcmVuY2UsIHRoZW4gbWFrZSBzdXJlCi0JICAgaXQgaGFzIGJlZW4gZmx1c2hlZC4gKi8K LQlpZiAodGhpc19jcHVfcmVhZCh4ZW5fY3VycmVudF9jcjMpID09IF9fcGEobW0tPnBnZCkpCi0J CWxvYWRfY3IzKHN3YXBwZXJfcGdfZGlyKTsKLX0KLQotc3RhdGljIHZvaWQgeGVuX2Ryb3BfbW1f cmVmKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tKQotewotCWNwdW1hc2tfdmFyX3QgbWFzazsKLQl1bnNp Z25lZCBjcHU7Ci0KLQlpZiAoY3VycmVudC0+YWN0aXZlX21tID09IG1tKSB7Ci0JCWlmIChjdXJy ZW50LT5tbSA9PSBtbSkKLQkJCWxvYWRfY3IzKHN3YXBwZXJfcGdfZGlyKTsKLQkJZWxzZQotCQkJ bGVhdmVfbW0oc21wX3Byb2Nlc3Nvcl9pZCgpKTsKLQl9Ci0KLQkvKiBHZXQgdGhlICJvZmZpY2lh bCIgc2V0IG9mIGNwdXMgcmVmZXJyaW5nIHRvIG91ciBwYWdldGFibGUuICovCi0JaWYgKCFhbGxv Y19jcHVtYXNrX3ZhcigmbWFzaywgR0ZQX0FUT01JQykpIHsKLQkJZm9yX2VhY2hfb25saW5lX2Nw dShjcHUpIHsKLQkJCWlmICghY3B1bWFza190ZXN0X2NwdShjcHUsIG1tX2NwdW1hc2sobW0pKQot CQkJICAgICYmIHBlcl9jcHUoeGVuX2N1cnJlbnRfY3IzLCBjcHUpICE9IF9fcGEobW0tPnBnZCkp Ci0JCQkJY29udGludWU7Ci0JCQlzbXBfY2FsbF9mdW5jdGlvbl9zaW5nbGUoY3B1LCBkcm9wX290 aGVyX21tX3JlZiwgbW0sIDEpOwotCQl9Ci0JCXJldHVybjsKLQl9Ci0JY3B1bWFza19jb3B5KG1h c2ssIG1tX2NwdW1hc2sobW0pKTsKLQotCS8qIEl0J3MgcG9zc2libGUgdGhhdCBhIHZjcHUgbWF5 IGhhdmUgYSBzdGFsZSByZWZlcmVuY2UgdG8gb3VyCi0JICAgY3IzLCBiZWNhdXNlIGl0cyBpbiBs YXp5IG1vZGUsIGFuZCBpdCBoYXNuJ3QgeWV0IGZsdXNoZWQKLQkgICBpdHMgc2V0IG9mIHBlbmRp bmcgaHlwZXJjYWxscyB5ZXQuICBJbiB0aGlzIGNhc2UsIHdlIGNhbgotCSAgIGxvb2sgYXQgaXRz IGFjdHVhbCBjdXJyZW50IGNyMyB2YWx1ZSwgYW5kIGZvcmNlIGl0IHRvIGZsdXNoCi0JICAgaWYg bmVlZGVkLiAqLwotCWZvcl9lYWNoX29ubGluZV9jcHUoY3B1KSB7Ci0JCWlmIChwZXJfY3B1KHhl bl9jdXJyZW50X2NyMywgY3B1KSA9PSBfX3BhKG1tLT5wZ2QpKQotCQkJY3B1bWFza19zZXRfY3B1 KGNwdSwgbWFzayk7Ci0JfQotCi0JaWYgKCFjcHVtYXNrX2VtcHR5KG1hc2spKQotCQlzbXBfY2Fs bF9mdW5jdGlvbl9tYW55KG1hc2ssIGRyb3Bfb3RoZXJfbW1fcmVmLCBtbSwgMSk7Ci0JZnJlZV9j cHVtYXNrX3ZhcihtYXNrKTsKLX0KLSNlbHNlCi1zdGF0aWMgdm9pZCB4ZW5fZHJvcF9tbV9yZWYo c3RydWN0IG1tX3N0cnVjdCAqbW0pCi17Ci0JaWYgKGN1cnJlbnQtPmFjdGl2ZV9tbSA9PSBtbSkK LQkJbG9hZF9jcjMoc3dhcHBlcl9wZ19kaXIpOwotfQotI2VuZGlmCi0KLS8qCi0gKiBXaGlsZSBh IHByb2Nlc3MgcnVucywgWGVuIHBpbnMgaXRzIHBhZ2V0YWJsZXMsIHdoaWNoIG1lYW5zIHRoYXQg dGhlCi0gKiBoeXBlcnZpc29yIGZvcmNlcyBpdCB0byBiZSByZWFkLW9ubHksIGFuZCBpdCBjb250 cm9scyBhbGwgdXBkYXRlcwotICogdG8gaXQuICBUaGlzIG1lYW5zIHRoYXQgYWxsIHBhZ2V0YWJs ZSB1cGRhdGVzIGhhdmUgdG8gZ28gdmlhIHRoZQotICogaHlwZXJ2aXNvciwgd2hpY2ggaXMgbW9k ZXJhdGVseSBleHBlbnNpdmUuCi0gKgotICogU2luY2Ugd2UncmUgcHVsbGluZyB0aGUgcGFnZXRh YmxlIGRvd24sIHdlIHN3aXRjaCB0byB1c2UgaW5pdF9tbSwKLSAqIHVucGluIG9sZCBwcm9jZXNz IHBhZ2V0YWJsZSBhbmQgbWFyayBpdCBhbGwgcmVhZC13cml0ZSwgd2hpY2gKLSAqIGFsbG93cyBm dXJ0aGVyIG9wZXJhdGlvbnMgb24gaXQgdG8gYmUgc2ltcGxlIG1lbW9yeSBhY2Nlc3Nlcy4KLSAq Ci0gKiBUaGUgb25seSBzdWJ0bGUgcG9pbnQgaXMgdGhhdCBhbm90aGVyIENQVSBtYXkgYmUgc3Rp bGwgdXNpbmcgdGhlCi0gKiBwYWdldGFibGUgYmVjYXVzZSBvZiBsYXp5IHRsYiBmbHVzaGluZy4g IFRoaXMgbWVhbnMgd2UgbmVlZCBuZWVkIHRvCi0gKiBzd2l0Y2ggYWxsIENQVXMgb2ZmIHRoaXMg cGFnZXRhYmxlIGJlZm9yZSB3ZSBjYW4gdW5waW4gaXQuCi0gKi8KLXN0YXRpYyB2b2lkIHhlbl9l eGl0X21tYXAoc3RydWN0IG1tX3N0cnVjdCAqbW0pCi17Ci0JZ2V0X2NwdSgpOwkJLyogbWFrZSBz dXJlIHdlIGRvbid0IG1vdmUgYXJvdW5kICovCi0JeGVuX2Ryb3BfbW1fcmVmKG1tKTsKLQlwdXRf Y3B1KCk7Ci0KLQlzcGluX2xvY2soJm1tLT5wYWdlX3RhYmxlX2xvY2spOwotCi0JLyogcGdkIG1h eSBub3QgYmUgcGlubmVkIGluIHRoZSBlcnJvciBleGl0IHBhdGggb2YgZXhlY3ZlICovCi0JaWYg KHhlbl9wYWdlX3Bpbm5lZChtbS0+cGdkKSkKLQkJeGVuX3BnZF91bnBpbihtbSk7Ci0KLQlzcGlu X3VubG9jaygmbW0tPnBhZ2VfdGFibGVfbG9jayk7Ci19Ci0KLXN0YXRpYyB2b2lkIHhlbl9wb3N0 X2FsbG9jYXRvcl9pbml0KHZvaWQpOwotCi1zdGF0aWMgdm9pZCBfX2luaXQgcGluX3BhZ2V0YWJs ZV9wZm4odW5zaWduZWQgY21kLCB1bnNpZ25lZCBsb25nIHBmbikKLXsKLQlzdHJ1Y3QgbW11ZXh0 X29wIG9wOwotCi0Jb3AuY21kID0gY21kOwotCW9wLmFyZzEubWZuID0gcGZuX3RvX21mbihwZm4p OwotCWlmIChIWVBFUlZJU09SX21tdWV4dF9vcCgmb3AsIDEsIE5VTEwsIERPTUlEX1NFTEYpKQot CQlCVUcoKTsKLX0KLQotI2lmZGVmIENPTkZJR19YODZfNjQKLXN0YXRpYyB2b2lkIF9faW5pdCB4 ZW5fY2xlYW5oaWdobWFwKHVuc2lnbmVkIGxvbmcgdmFkZHIsCi0JCQkJICAgIHVuc2lnbmVkIGxv bmcgdmFkZHJfZW5kKQotewotCXVuc2lnbmVkIGxvbmcga2VybmVsX2VuZCA9IHJvdW5kdXAoKHVu c2lnbmVkIGxvbmcpX2Jya19lbmQsIFBNRF9TSVpFKSAtIDE7Ci0JcG1kX3QgKnBtZCA9IGxldmVs Ml9rZXJuZWxfcGd0ICsgcG1kX2luZGV4KHZhZGRyKTsKLQotCS8qIE5PVEU6IFRoZSBsb29wIGlz IG1vcmUgZ3JlZWR5IHRoYW4gdGhlIGNsZWFudXBfaGlnaG1hcCB2YXJpYW50LgotCSAqIFdlIGlu Y2x1ZGUgdGhlIFBNRCBwYXNzZWQgaW4gb24gX2JvdGhfIGJvdW5kYXJpZXMuICovCi0JZm9yICg7 IHZhZGRyIDw9IHZhZGRyX2VuZCAmJiAocG1kIDwgKGxldmVsMl9rZXJuZWxfcGd0ICsgUFRSU19Q RVJfUE1EKSk7Ci0JCQlwbWQrKywgdmFkZHIgKz0gUE1EX1NJWkUpIHsKLQkJaWYgKHBtZF9ub25l KCpwbWQpKQotCQkJY29udGludWU7Ci0JCWlmICh2YWRkciA8ICh1bnNpZ25lZCBsb25nKSBfdGV4 dCB8fCB2YWRkciA+IGtlcm5lbF9lbmQpCi0JCQlzZXRfcG1kKHBtZCwgX19wbWQoMCkpOwotCX0K LQkvKiBJbiBjYXNlIHdlIGRpZCBzb21ldGhpbmcgc2lsbHksIHdlIHNob3VsZCBjcmFzaCBpbiB0 aGlzIGZ1bmN0aW9uCi0JICogaW5zdGVhZCBvZiBzb21ld2hlcmUgbGF0ZXIgYW5kIGJlIGNvbmZ1 c2luZy4gKi8KLQl4ZW5fbWNfZmx1c2goKTsKLX0KLQotLyoKLSAqIE1ha2UgYSBwYWdlIHJhbmdl IHdyaXRlYWJsZSBhbmQgZnJlZSBpdC4KLSAqLwotc3RhdGljIHZvaWQgX19pbml0IHhlbl9mcmVl X3JvX3BhZ2VzKHVuc2lnbmVkIGxvbmcgcGFkZHIsIHVuc2lnbmVkIGxvbmcgc2l6ZSkKLXsKLQl2 b2lkICp2YWRkciA9IF9fdmEocGFkZHIpOwotCXZvaWQgKnZhZGRyX2VuZCA9IHZhZGRyICsgc2l6 ZTsKLQotCWZvciAoOyB2YWRkciA8IHZhZGRyX2VuZDsgdmFkZHIgKz0gUEFHRV9TSVpFKQotCQlt YWtlX2xvd21lbV9wYWdlX3JlYWR3cml0ZSh2YWRkcik7Ci0KLQltZW1ibG9ja19mcmVlKHBhZGRy LCBzaXplKTsKLX0KLQotc3RhdGljIHZvaWQgX19pbml0IHhlbl9jbGVhbm1mbm1hcF9mcmVlX3Bn dGJsKHZvaWQgKnBndGJsLCBib29sIHVucGluKQotewotCXVuc2lnbmVkIGxvbmcgcGEgPSBfX3Bh KHBndGJsKSAmIFBIWVNJQ0FMX1BBR0VfTUFTSzsKLQotCWlmICh1bnBpbikKLQkJcGluX3BhZ2V0 YWJsZV9wZm4oTU1VRVhUX1VOUElOX1RBQkxFLCBQRk5fRE9XTihwYSkpOwotCUNsZWFyUGFnZVBp bm5lZCh2aXJ0X3RvX3BhZ2UoX192YShwYSkpKTsKLQl4ZW5fZnJlZV9yb19wYWdlcyhwYSwgUEFH RV9TSVpFKTsKLX0KLQotLyoKLSAqIFNpbmNlIGl0IGlzIHdlbGwgaXNvbGF0ZWQgd2UgY2FuIChh bmQgc2luY2UgaXQgaXMgcGVyaGFwcyBsYXJnZSB3ZSBzaG91bGQpCi0gKiBhbHNvIGZyZWUgdGhl IHBhZ2UgdGFibGVzIG1hcHBpbmcgdGhlIGluaXRpYWwgUC0+TSB0YWJsZS4KLSAqLwotc3RhdGlj IHZvaWQgX19pbml0IHhlbl9jbGVhbm1mbm1hcCh1bnNpZ25lZCBsb25nIHZhZGRyKQotewotCXVu c2lnbmVkIGxvbmcgdmEgPSB2YWRkciAmIFBNRF9NQVNLOwotCXVuc2lnbmVkIGxvbmcgcGE7Ci0J cGdkX3QgKnBnZCA9IHBnZF9vZmZzZXRfayh2YSk7Ci0JcHVkX3QgKnB1ZF9wYWdlID0gcHVkX29m ZnNldChwZ2QsIDApOwotCXB1ZF90ICpwdWQ7Ci0JcG1kX3QgKnBtZDsKLQlwdGVfdCAqcHRlOwot CXVuc2lnbmVkIGludCBpOwotCWJvb2wgdW5waW47Ci0KLQl1bnBpbiA9ICh2YWRkciA9PSAyICog UEdESVJfU0laRSk7Ci0Jc2V0X3BnZChwZ2QsIF9fcGdkKDApKTsKLQlkbyB7Ci0JCXB1ZCA9IHB1 ZF9wYWdlICsgcHVkX2luZGV4KHZhKTsKLQkJaWYgKHB1ZF9ub25lKCpwdWQpKSB7Ci0JCQl2YSAr PSBQVURfU0laRTsKLQkJfSBlbHNlIGlmIChwdWRfbGFyZ2UoKnB1ZCkpIHsKLQkJCXBhID0gcHVk X3ZhbCgqcHVkKSAmIFBIWVNJQ0FMX1BBR0VfTUFTSzsKLQkJCXhlbl9mcmVlX3JvX3BhZ2VzKHBh LCBQVURfU0laRSk7Ci0JCQl2YSArPSBQVURfU0laRTsKLQkJfSBlbHNlIHsKLQkJCXBtZCA9IHBt ZF9vZmZzZXQocHVkLCB2YSk7Ci0JCQlpZiAocG1kX2xhcmdlKCpwbWQpKSB7Ci0JCQkJcGEgPSBw bWRfdmFsKCpwbWQpICYgUEhZU0lDQUxfUEFHRV9NQVNLOwotCQkJCXhlbl9mcmVlX3JvX3BhZ2Vz KHBhLCBQTURfU0laRSk7Ci0JCQl9IGVsc2UgaWYgKCFwbWRfbm9uZSgqcG1kKSkgewotCQkJCXB0 ZSA9IHB0ZV9vZmZzZXRfa2VybmVsKHBtZCwgdmEpOwotCQkJCXNldF9wbWQocG1kLCBfX3BtZCgw KSk7Ci0JCQkJZm9yIChpID0gMDsgaSA8IFBUUlNfUEVSX1BURTsgKytpKSB7Ci0JCQkJCWlmIChw dGVfbm9uZShwdGVbaV0pKQotCQkJCQkJYnJlYWs7Ci0JCQkJCXBhID0gcHRlX3BmbihwdGVbaV0p IDw8IFBBR0VfU0hJRlQ7Ci0JCQkJCXhlbl9mcmVlX3JvX3BhZ2VzKHBhLCBQQUdFX1NJWkUpOwot CQkJCX0KLQkJCQl4ZW5fY2xlYW5tZm5tYXBfZnJlZV9wZ3RibChwdGUsIHVucGluKTsKLQkJCX0K LQkJCXZhICs9IFBNRF9TSVpFOwotCQkJaWYgKHBtZF9pbmRleCh2YSkpCi0JCQkJY29udGludWU7 Ci0JCQlzZXRfcHVkKHB1ZCwgX19wdWQoMCkpOwotCQkJeGVuX2NsZWFubWZubWFwX2ZyZWVfcGd0 YmwocG1kLCB1bnBpbik7Ci0JCX0KLQotCX0gd2hpbGUgKHB1ZF9pbmRleCh2YSkgfHwgcG1kX2lu ZGV4KHZhKSk7Ci0JeGVuX2NsZWFubWZubWFwX2ZyZWVfcGd0YmwocHVkX3BhZ2UsIHVucGluKTsK LX0KLQotc3RhdGljIHZvaWQgX19pbml0IHhlbl9wYWdldGFibGVfcDJtX2ZyZWUodm9pZCkKLXsK LQl1bnNpZ25lZCBsb25nIHNpemU7Ci0JdW5zaWduZWQgbG9uZyBhZGRyOwotCi0Jc2l6ZSA9IFBB R0VfQUxJR04oeGVuX3N0YXJ0X2luZm8tPm5yX3BhZ2VzICogc2l6ZW9mKHVuc2lnbmVkIGxvbmcp KTsKLQotCS8qIE5vIG1lbW9yeSBvciBhbHJlYWR5IGNhbGxlZC4gKi8KLQlpZiAoKHVuc2lnbmVk IGxvbmcpeGVuX3AybV9hZGRyID09IHhlbl9zdGFydF9pbmZvLT5tZm5fbGlzdCkKLQkJcmV0dXJu OwotCi0JLyogdXNpbmcgX19rYSBhZGRyZXNzIGFuZCBzdGlja2luZyBJTlZBTElEX1AyTV9FTlRS WSEgKi8KLQltZW1zZXQoKHZvaWQgKil4ZW5fc3RhcnRfaW5mby0+bWZuX2xpc3QsIDB4ZmYsIHNp emUpOwotCi0JYWRkciA9IHhlbl9zdGFydF9pbmZvLT5tZm5fbGlzdDsKLQkvKgotCSAqIFdlIGNv dWxkIGJlIGluIF9fa2Egc3BhY2UuCi0JICogV2Ugcm91bmR1cCB0byB0aGUgUE1ELCB3aGljaCBt ZWFucyB0aGF0IGlmIGFueWJvZHkgYXQgdGhpcyBzdGFnZSBpcwotCSAqIHVzaW5nIHRoZSBfX2th IGFkZHJlc3Mgb2YgeGVuX3N0YXJ0X2luZm8gb3IKLQkgKiB4ZW5fc3RhcnRfaW5mby0+c2hhcmVk X2luZm8gdGhleSBhcmUgaW4gZ29pbmcgdG8gY3Jhc2guIEZvcnR1bmF0bHkKLQkgKiB3ZSBoYXZl IGFscmVhZHkgcmV2ZWN0b3JlZCBpbiB4ZW5fc2V0dXBfa2VybmVsX3BhZ2V0YWJsZSBhbmQgaW4K LQkgKiB4ZW5fc2V0dXBfc2hhcmVkX2luZm8uCi0JICovCi0Jc2l6ZSA9IHJvdW5kdXAoc2l6ZSwg UE1EX1NJWkUpOwotCi0JaWYgKGFkZHIgPj0gX19TVEFSVF9LRVJORUxfbWFwKSB7Ci0JCXhlbl9j bGVhbmhpZ2htYXAoYWRkciwgYWRkciArIHNpemUpOwotCQlzaXplID0gUEFHRV9BTElHTih4ZW5f c3RhcnRfaW5mby0+bnJfcGFnZXMgKgotCQkJCSAgc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKTsKLQkJ bWVtYmxvY2tfZnJlZShfX3BhKGFkZHIpLCBzaXplKTsKLQl9IGVsc2UgewotCQl4ZW5fY2xlYW5t Zm5tYXAoYWRkcik7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBfX2luaXQgeGVuX3BhZ2V0YWJsZV9j bGVhbmhpZ2htYXAodm9pZCkKLXsKLQl1bnNpZ25lZCBsb25nIHNpemU7Ci0JdW5zaWduZWQgbG9u ZyBhZGRyOwotCi0JLyogQXQgdGhpcyBzdGFnZSwgY2xlYW51cF9oaWdobWFwIGhhcyBhbHJlYWR5 IGNsZWFuZWQgX19rYSBzcGFjZQotCSAqIGZyb20gX2Jya19saW1pdCB3YXkgdXAgdG8gdGhlIG1h eF9wZm5fbWFwcGVkICh3aGljaCBpcyB0aGUgZW5kIG9mCi0JICogdGhlIHJhbWRpc2spLiBXZSBj b250aW51ZSBvbiwgZXJhc2luZyBQTUQgZW50cmllcyB0aGF0IHBvaW50IHRvIHBhZ2UKLQkgKiB0 YWJsZXMgLSBkbyBub3RlIHRoYXQgdGhleSBhcmUgYWNjZXNzaWJsZSBhdCB0aGlzIHN0YWdlIHZp YSBfX3ZhLgotCSAqIEZvciBnb29kIG1lYXN1cmUgd2UgYWxzbyByb3VuZCB1cCB0byB0aGUgUE1E IC0gd2hpY2ggbWVhbnMgdGhhdCBpZgotCSAqIGFueWJvZHkgaXMgdXNpbmcgX19rYSBhZGRyZXNz IHRvIHRoZSBpbml0aWFsIGJvb3Qtc3RhY2sgLSBhbmQgdHJ5Ci0JICogdG8gdXNlIGl0IC0gdGhl eSBhcmUgZ29pbmcgdG8gY3Jhc2guIFRoZSB4ZW5fc3RhcnRfaW5mbyBoYXMgYmVlbgotCSAqIHRh a2VuIGNhcmUgb2YgYWxyZWFkeSBpbiB4ZW5fc2V0dXBfa2VybmVsX3BhZ2V0YWJsZS4gKi8KLQlh ZGRyID0geGVuX3N0YXJ0X2luZm8tPnB0X2Jhc2U7Ci0Jc2l6ZSA9IHJvdW5kdXAoeGVuX3N0YXJ0 X2luZm8tPm5yX3B0X2ZyYW1lcyAqIFBBR0VfU0laRSwgUE1EX1NJWkUpOwotCi0JeGVuX2NsZWFu aGlnaG1hcChhZGRyLCBhZGRyICsgc2l6ZSk7Ci0JeGVuX3N0YXJ0X2luZm8tPnB0X2Jhc2UgPSAo dW5zaWduZWQgbG9uZylfX3ZhKF9fcGEoeGVuX3N0YXJ0X2luZm8tPnB0X2Jhc2UpKTsKLSNpZmRl ZiBERUJVRwotCS8qIFRoaXMgaXMgc3VwZXJmbHVvdXMgYW5kIGlzIG5vdCBuZWNlc3NhcnksIGJ1 dCB5b3Uga25vdyB3aGF0Ci0JICogbGV0cyBkbyBpdC4gVGhlIE1PRFVMRVNfVkFERFIgLT4gTU9E VUxFU19FTkQgc2hvdWxkIGJlIGNsZWFyIG9mCi0JICogYW55dGhpbmcgYXQgdGhpcyBzdGFnZS4g Ki8KLQl4ZW5fY2xlYW5oaWdobWFwKE1PRFVMRVNfVkFERFIsIHJvdW5kdXAoTU9EVUxFU19WQURE UiwgUFVEX1NJWkUpIC0gMSk7Ci0jZW5kaWYKLX0KLSNlbmRpZgotCi1zdGF0aWMgdm9pZCBfX2lu aXQgeGVuX3BhZ2V0YWJsZV9wMm1fc2V0dXAodm9pZCkKLXsKLQlpZiAoeGVuX2ZlYXR1cmUoWEVO RkVBVF9hdXRvX3RyYW5zbGF0ZWRfcGh5c21hcCkpCi0JCXJldHVybjsKLQotCXhlbl92bWFsbG9j X3AybV90cmVlKCk7Ci0KLSNpZmRlZiBDT05GSUdfWDg2XzY0Ci0JeGVuX3BhZ2V0YWJsZV9wMm1f ZnJlZSgpOwotCi0JeGVuX3BhZ2V0YWJsZV9jbGVhbmhpZ2htYXAoKTsKLSNlbmRpZgotCS8qIEFu ZCByZXZlY3RvciEgQnllIGJ5ZSBvbGQgYXJyYXkgKi8KLQl4ZW5fc3RhcnRfaW5mby0+bWZuX2xp c3QgPSAodW5zaWduZWQgbG9uZyl4ZW5fcDJtX2FkZHI7Ci19Ci0KLXN0YXRpYyB2b2lkIF9faW5p dCB4ZW5fcGFnZXRhYmxlX2luaXQodm9pZCkKLXsKLQlwYWdpbmdfaW5pdCgpOwotCXhlbl9wb3N0 X2FsbG9jYXRvcl9pbml0KCk7Ci0KLQl4ZW5fcGFnZXRhYmxlX3AybV9zZXR1cCgpOwotCi0JLyog QWxsb2NhdGUgYW5kIGluaXRpYWxpemUgdG9wIGFuZCBtaWQgbWZuIGxldmVscyBmb3IgcDJtIHN0 cnVjdHVyZSAqLwotCXhlbl9idWlsZF9tZm5fbGlzdF9saXN0KCk7Ci0KLQkvKiBSZW1hcCBtZW1v cnkgZnJlZWQgZHVlIHRvIGNvbmZsaWN0cyB3aXRoIEU4MjAgbWFwICovCi0JaWYgKCF4ZW5fZmVh dHVyZShYRU5GRUFUX2F1dG9fdHJhbnNsYXRlZF9waHlzbWFwKSkKLQkJeGVuX3JlbWFwX21lbW9y eSgpOwotCi0JeGVuX3NldHVwX3NoYXJlZF9pbmZvKCk7Ci19Ci1zdGF0aWMgdm9pZCB4ZW5fd3Jp dGVfY3IyKHVuc2lnbmVkIGxvbmcgY3IyKQotewotCXRoaXNfY3B1X3JlYWQoeGVuX3ZjcHUpLT5h cmNoLmNyMiA9IGNyMjsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGxvbmcgeGVuX3JlYWRfY3IyKHZv aWQpCi17Ci0JcmV0dXJuIHRoaXNfY3B1X3JlYWQoeGVuX3ZjcHUpLT5hcmNoLmNyMjsKLX0KLQot dW5zaWduZWQgbG9uZyB4ZW5fcmVhZF9jcjJfZGlyZWN0KHZvaWQpCi17Ci0JcmV0dXJuIHRoaXNf Y3B1X3JlYWQoeGVuX3ZjcHVfaW5mby5hcmNoLmNyMik7Ci19Ci0KLXZvaWQgeGVuX2ZsdXNoX3Rs Yl9hbGwodm9pZCkKLXsKLQlzdHJ1Y3QgbW11ZXh0X29wICpvcDsKLQlzdHJ1Y3QgbXVsdGljYWxs X3NwYWNlIG1jczsKLQotCXRyYWNlX3hlbl9tbXVfZmx1c2hfdGxiX2FsbCgwKTsKLQotCXByZWVt cHRfZGlzYWJsZSgpOwotCi0JbWNzID0geGVuX21jX2VudHJ5KHNpemVvZigqb3ApKTsKLQotCW9w ID0gbWNzLmFyZ3M7Ci0Jb3AtPmNtZCA9IE1NVUVYVF9UTEJfRkxVU0hfQUxMOwotCU1VTFRJX21t dWV4dF9vcChtY3MubWMsIG9wLCAxLCBOVUxMLCBET01JRF9TRUxGKTsKLQotCXhlbl9tY19pc3N1 ZShQQVJBVklSVF9MQVpZX01NVSk7Ci0KLQlwcmVlbXB0X2VuYWJsZSgpOwotfQotc3RhdGljIHZv aWQgeGVuX2ZsdXNoX3RsYih2b2lkKQotewotCXN0cnVjdCBtbXVleHRfb3AgKm9wOwotCXN0cnVj dCBtdWx0aWNhbGxfc3BhY2UgbWNzOwotCi0JdHJhY2VfeGVuX21tdV9mbHVzaF90bGIoMCk7Ci0K LQlwcmVlbXB0X2Rpc2FibGUoKTsKLQotCW1jcyA9IHhlbl9tY19lbnRyeShzaXplb2YoKm9wKSk7 Ci0KLQlvcCA9IG1jcy5hcmdzOwotCW9wLT5jbWQgPSBNTVVFWFRfVExCX0ZMVVNIX0xPQ0FMOwot CU1VTFRJX21tdWV4dF9vcChtY3MubWMsIG9wLCAxLCBOVUxMLCBET01JRF9TRUxGKTsKLQotCXhl bl9tY19pc3N1ZShQQVJBVklSVF9MQVpZX01NVSk7Ci0KLQlwcmVlbXB0X2VuYWJsZSgpOwotfQot Ci1zdGF0aWMgdm9pZCB4ZW5fZmx1c2hfdGxiX3NpbmdsZSh1bnNpZ25lZCBsb25nIGFkZHIpCi17 Ci0Jc3RydWN0IG1tdWV4dF9vcCAqb3A7Ci0Jc3RydWN0IG11bHRpY2FsbF9zcGFjZSBtY3M7Ci0K LQl0cmFjZV94ZW5fbW11X2ZsdXNoX3RsYl9zaW5nbGUoYWRkcik7Ci0KLQlwcmVlbXB0X2Rpc2Fi bGUoKTsKLQotCW1jcyA9IHhlbl9tY19lbnRyeShzaXplb2YoKm9wKSk7Ci0Jb3AgPSBtY3MuYXJn czsKLQlvcC0+Y21kID0gTU1VRVhUX0lOVkxQR19MT0NBTDsKLQlvcC0+YXJnMS5saW5lYXJfYWRk ciA9IGFkZHIgJiBQQUdFX01BU0s7Ci0JTVVMVElfbW11ZXh0X29wKG1jcy5tYywgb3AsIDEsIE5V TEwsIERPTUlEX1NFTEYpOwotCi0JeGVuX21jX2lzc3VlKFBBUkFWSVJUX0xBWllfTU1VKTsKLQot CXByZWVtcHRfZW5hYmxlKCk7Ci19Ci0KLXN0YXRpYyB2b2lkIHhlbl9mbHVzaF90bGJfb3RoZXJz KGNvbnN0IHN0cnVjdCBjcHVtYXNrICpjcHVzLAotCQkJCSBzdHJ1Y3QgbW1fc3RydWN0ICptbSwg dW5zaWduZWQgbG9uZyBzdGFydCwKLQkJCQkgdW5zaWduZWQgbG9uZyBlbmQpCi17Ci0Jc3RydWN0 IHsKLQkJc3RydWN0IG1tdWV4dF9vcCBvcDsKLSNpZmRlZiBDT05GSUdfU01QCi0JCURFQ0xBUkVf QklUTUFQKG1hc2ssIG51bV9wcm9jZXNzb3JzKTsKLSNlbHNlCi0JCURFQ0xBUkVfQklUTUFQKG1h c2ssIE5SX0NQVVMpOwotI2VuZGlmCi0JfSAqYXJnczsKLQlzdHJ1Y3QgbXVsdGljYWxsX3NwYWNl IG1jczsKLQotCXRyYWNlX3hlbl9tbXVfZmx1c2hfdGxiX290aGVycyhjcHVzLCBtbSwgc3RhcnQs IGVuZCk7Ci0KLQlpZiAoY3B1bWFza19lbXB0eShjcHVzKSkKLQkJcmV0dXJuOwkJLyogbm90aGlu ZyB0byBkbyAqLwotCi0JbWNzID0geGVuX21jX2VudHJ5KHNpemVvZigqYXJncykpOwotCWFyZ3Mg PSBtY3MuYXJnczsKLQlhcmdzLT5vcC5hcmcyLnZjcHVtYXNrID0gdG9fY3B1bWFzayhhcmdzLT5t YXNrKTsKLQotCS8qIFJlbW92ZSB1cywgYW5kIGFueSBvZmZsaW5lIENQVVMuICovCi0JY3B1bWFz a19hbmQodG9fY3B1bWFzayhhcmdzLT5tYXNrKSwgY3B1cywgY3B1X29ubGluZV9tYXNrKTsKLQlj cHVtYXNrX2NsZWFyX2NwdShzbXBfcHJvY2Vzc29yX2lkKCksIHRvX2NwdW1hc2soYXJncy0+bWFz aykpOwotCi0JYXJncy0+b3AuY21kID0gTU1VRVhUX1RMQl9GTFVTSF9NVUxUSTsKLQlpZiAoZW5k ICE9IFRMQl9GTFVTSF9BTEwgJiYgKGVuZCAtIHN0YXJ0KSA8PSBQQUdFX1NJWkUpIHsKLQkJYXJn cy0+b3AuY21kID0gTU1VRVhUX0lOVkxQR19NVUxUSTsKLQkJYXJncy0+b3AuYXJnMS5saW5lYXJf YWRkciA9IHN0YXJ0OwotCX0KLQotCU1VTFRJX21tdWV4dF9vcChtY3MubWMsICZhcmdzLT5vcCwg MSwgTlVMTCwgRE9NSURfU0VMRik7Ci0KLQl4ZW5fbWNfaXNzdWUoUEFSQVZJUlRfTEFaWV9NTVUp OwotfQotCi1zdGF0aWMgdW5zaWduZWQgbG9uZyB4ZW5fcmVhZF9jcjModm9pZCkKLXsKLQlyZXR1 cm4gdGhpc19jcHVfcmVhZCh4ZW5fY3IzKTsKLX0KLQotc3RhdGljIHZvaWQgc2V0X2N1cnJlbnRf Y3IzKHZvaWQgKnYpCi17Ci0JdGhpc19jcHVfd3JpdGUoeGVuX2N1cnJlbnRfY3IzLCAodW5zaWdu ZWQgbG9uZyl2KTsKLX0KLQotc3RhdGljIHZvaWQgX194ZW5fd3JpdGVfY3IzKGJvb2wga2VybmVs LCB1bnNpZ25lZCBsb25nIGNyMykKLXsKLQlzdHJ1Y3QgbW11ZXh0X29wIG9wOwotCXVuc2lnbmVk IGxvbmcgbWZuOwotCi0JdHJhY2VfeGVuX21tdV93cml0ZV9jcjMoa2VybmVsLCBjcjMpOwotCi0J aWYgKGNyMykKLQkJbWZuID0gcGZuX3RvX21mbihQRk5fRE9XTihjcjMpKTsKLQllbHNlCi0JCW1m biA9IDA7Ci0KLQlXQVJOX09OKG1mbiA9PSAwICYmIGtlcm5lbCk7Ci0KLQlvcC5jbWQgPSBrZXJu ZWwgPyBNTVVFWFRfTkVXX0JBU0VQVFIgOiBNTVVFWFRfTkVXX1VTRVJfQkFTRVBUUjsKLQlvcC5h cmcxLm1mbiA9IG1mbjsKLQotCXhlbl9leHRlbmRfbW11ZXh0X29wKCZvcCk7Ci0KLQlpZiAoa2Vy bmVsKSB7Ci0JCXRoaXNfY3B1X3dyaXRlKHhlbl9jcjMsIGNyMyk7Ci0KLQkJLyogVXBkYXRlIHhl bl9jdXJyZW50X2NyMyBvbmNlIHRoZSBiYXRjaCBoYXMgYWN0dWFsbHkKLQkJICAgYmVlbiBzdWJt aXR0ZWQuICovCi0JCXhlbl9tY19jYWxsYmFjayhzZXRfY3VycmVudF9jcjMsICh2b2lkICopY3Iz KTsKLQl9Ci19Ci1zdGF0aWMgdm9pZCB4ZW5fd3JpdGVfY3IzKHVuc2lnbmVkIGxvbmcgY3IzKQot ewotCUJVR19PTihwcmVlbXB0aWJsZSgpKTsKLQotCXhlbl9tY19iYXRjaCgpOyAgLyogZGlzYWJs ZXMgaW50ZXJydXB0cyAqLwotCi0JLyogVXBkYXRlIHdoaWxlIGludGVycnVwdHMgYXJlIGRpc2Fi bGVkLCBzbyBpdHMgYXRvbWljIHdpdGgKLQkgICByZXNwZWN0IHRvIGlwaXMgKi8KLQl0aGlzX2Nw dV93cml0ZSh4ZW5fY3IzLCBjcjMpOwotCi0JX194ZW5fd3JpdGVfY3IzKHRydWUsIGNyMyk7Ci0K LSNpZmRlZiBDT05GSUdfWDg2XzY0Ci0JewotCQlwZ2RfdCAqdXNlcl9wZ2QgPSB4ZW5fZ2V0X3Vz ZXJfcGdkKF9fdmEoY3IzKSk7Ci0JCWlmICh1c2VyX3BnZCkKLQkJCV9feGVuX3dyaXRlX2NyMyhm YWxzZSwgX19wYSh1c2VyX3BnZCkpOwotCQllbHNlCi0JCQlfX3hlbl93cml0ZV9jcjMoZmFsc2Us IDApOwotCX0KLSNlbmRpZgotCi0JeGVuX21jX2lzc3VlKFBBUkFWSVJUX0xBWllfQ1BVKTsgIC8q IGludGVycnVwdHMgcmVzdG9yZWQgKi8KLX0KLQotI2lmZGVmIENPTkZJR19YODZfNjQKLS8qCi0g KiBBdCB0aGUgc3RhcnQgb2YgdGhlIGRheSAtIHdoZW4gWGVuIGxhdW5jaGVzIGEgZ3Vlc3QsIGl0 IGhhcyBhbHJlYWR5Ci0gKiBidWlsdCBwYWdldGFibGVzIGZvciB0aGUgZ3Vlc3QuIFdlIGRpbGln ZW50bHkgbG9vayBvdmVyIHRoZW0KLSAqIGluIHhlbl9zZXR1cF9rZXJuZWxfcGFnZXRhYmxlIGFu ZCBncmFmdCBhcyBhcHByb3ByaWF0ZSB0aGVtIGluIHRoZQotICogaW5pdF9sZXZlbDRfcGd0IGFu ZCBpdHMgZnJpZW5kcy4gVGhlbiB3aGVuIHdlIGFyZSBoYXBweSB3ZSBsb2FkCi0gKiB0aGUgbmV3 IGluaXRfbGV2ZWw0X3BndCAtIGFuZCBjb250aW51ZSBvbi4KLSAqCi0gKiBUaGUgZ2VuZXJpYyBj b2RlIHN0YXJ0cyAoc3RhcnRfa2VybmVsKSBhbmQgJ2luaXRfbWVtX21hcHBpbmcnIHNldHMKLSAq IHVwIHRoZSByZXN0IG9mIHRoZSBwYWdldGFibGVzLiBXaGVuIGl0IGhhcyBjb21wbGV0ZWQgaXQg bG9hZHMgdGhlIGNyMy4KLSAqIE4uQi4gdGhhdCBiYXJlbWV0YWwgd291bGQgc3RhcnQgYXQgJ3N0 YXJ0X2tlcm5lbCcgKGFuZCB0aGUgZWFybHkKLSAqICNQRiBoYW5kbGVyIHdvdWxkIGNyZWF0ZSBi b290c3RyYXAgcGFnZXRhYmxlcykgLSBzbyB3ZSBhcmUgcnVubmluZwotICogd2l0aCB0aGUgc2Ft ZSBhc3N1bXB0aW9ucyBhcyB3aGF0IHRvIGRvIHdoZW4gd3JpdGVfY3IzIGlzIGV4ZWN1dGVkCi0g KiBhdCB0aGlzIHBvaW50LgotICoKLSAqIFNpbmNlIHRoZXJlIGFyZSBubyB1c2VyLXBhZ2UgdGFi bGVzIGF0IGFsbCwgd2UgaGF2ZSB0d28gdmFyaWFudHMKLSAqIG9mIHhlbl93cml0ZV9jcjMgLSB0 aGUgZWFybHkgYm9vdHVwICh0aGlzIG9uZSksIGFuZCB0aGUgbGF0ZSBvbmUKLSAqICh4ZW5fd3Jp dGVfY3IzKS4gVGhlIHJlYXNvbiB3ZSBoYXZlIHRvIGRvIHRoYXQgaXMgdGhhdCBpbiA2NC1iaXQK LSAqIHRoZSBMaW51eCBrZXJuZWwgYW5kIHVzZXItc3BhY2UgYXJlIGJvdGggaW4gcmluZyAzIHdo aWxlIHRoZQotICogaHlwZXJ2aXNvciBpcyBpbiByaW5nIDAuCi0gKi8KLXN0YXRpYyB2b2lkIF9f aW5pdCB4ZW5fd3JpdGVfY3IzX2luaXQodW5zaWduZWQgbG9uZyBjcjMpCi17Ci0JQlVHX09OKHBy ZWVtcHRpYmxlKCkpOwotCi0JeGVuX21jX2JhdGNoKCk7ICAvKiBkaXNhYmxlcyBpbnRlcnJ1cHRz ICovCi0KLQkvKiBVcGRhdGUgd2hpbGUgaW50ZXJydXB0cyBhcmUgZGlzYWJsZWQsIHNvIGl0cyBh dG9taWMgd2l0aAotCSAgIHJlc3BlY3QgdG8gaXBpcyAqLwotCXRoaXNfY3B1X3dyaXRlKHhlbl9j cjMsIGNyMyk7Ci0KLQlfX3hlbl93cml0ZV9jcjModHJ1ZSwgY3IzKTsKLQotCXhlbl9tY19pc3N1 ZShQQVJBVklSVF9MQVpZX0NQVSk7ICAvKiBpbnRlcnJ1cHRzIHJlc3RvcmVkICovCi19Ci0jZW5k aWYKLQotc3RhdGljIGludCB4ZW5fcGdkX2FsbG9jKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tKQotewot CXBnZF90ICpwZ2QgPSBtbS0+cGdkOwotCWludCByZXQgPSAwOwotCi0JQlVHX09OKFBhZ2VQaW5u ZWQodmlydF90b19wYWdlKHBnZCkpKTsKLQotI2lmZGVmIENPTkZJR19YODZfNjQKLQl7Ci0JCXN0 cnVjdCBwYWdlICpwYWdlID0gdmlydF90b19wYWdlKHBnZCk7Ci0JCXBnZF90ICp1c2VyX3BnZDsK LQotCQlCVUdfT04ocGFnZS0+cHJpdmF0ZSAhPSAwKTsKLQotCQlyZXQgPSAtRU5PTUVNOwotCi0J CXVzZXJfcGdkID0gKHBnZF90ICopX19nZXRfZnJlZV9wYWdlKEdGUF9LRVJORUwgfCBfX0dGUF9a RVJPKTsKLQkJcGFnZS0+cHJpdmF0ZSA9ICh1bnNpZ25lZCBsb25nKXVzZXJfcGdkOwotCi0JCWlm ICh1c2VyX3BnZCAhPSBOVUxMKSB7Ci0jaWZkZWYgQ09ORklHX1g4Nl9WU1lTQ0FMTF9FTVVMQVRJ T04KLQkJCXVzZXJfcGdkW3BnZF9pbmRleChWU1lTQ0FMTF9BRERSKV0gPQotCQkJCV9fcGdkKF9f cGEobGV2ZWwzX3VzZXJfdnN5c2NhbGwpIHwgX1BBR0VfVEFCTEUpOwotI2VuZGlmCi0JCQlyZXQg PSAwOwotCQl9Ci0KLQkJQlVHX09OKFBhZ2VQaW5uZWQodmlydF90b19wYWdlKHhlbl9nZXRfdXNl cl9wZ2QocGdkKSkpKTsKLQl9Ci0jZW5kaWYKLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyB2 b2lkIHhlbl9wZ2RfZnJlZShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgcGdkX3QgKnBnZCkKLXsKLSNp ZmRlZiBDT05GSUdfWDg2XzY0Ci0JcGdkX3QgKnVzZXJfcGdkID0geGVuX2dldF91c2VyX3BnZChw Z2QpOwotCi0JaWYgKHVzZXJfcGdkKQotCQlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpdXNlcl9w Z2QpOwotI2VuZGlmCi19Ci0KLS8qCi0gKiBJbml0LXRpbWUgc2V0X3B0ZSB3aGlsZSBjb25zdHJ1 Y3RpbmcgaW5pdGlhbCBwYWdldGFibGVzLCB3aGljaAotICogZG9lc24ndCBhbGxvdyBSTyBwYWdl IHRhYmxlIHBhZ2VzIHRvIGJlIHJlbWFwcGVkIFJXLgotICoKLSAqIElmIHRoZXJlIGlzIG5vIE1G TiBmb3IgdGhpcyBQRk4gdGhlbiB0aGlzIHBhZ2UgaXMgaW5pdGlhbGx5Ci0gKiBiYWxsb29uZWQg b3V0IHNvIGNsZWFyIHRoZSBQVEUgKGFzIGluIGRlY3JlYXNlX3Jlc2VydmF0aW9uKCkgaW4KLSAq IGRyaXZlcnMveGVuL2JhbGxvb24uYykuCi0gKgotICogTWFueSBvZiB0aGVzZSBQVEUgdXBkYXRl cyBhcmUgZG9uZSBvbiB1bnBpbm5lZCBhbmQgd3JpdGFibGUgcGFnZXMKLSAqIGFuZCBkb2luZyBh IGh5cGVyY2FsbCBmb3IgdGhlc2UgaXMgdW5uZWNlc3NhcnkgYW5kIGV4cGVuc2l2ZS4gIEF0Ci0g KiB0aGlzIHBvaW50IGl0IGlzIG5vdCBwb3NzaWJsZSB0byB0ZWxsIGlmIGEgcGFnZSBpcyBwaW5u ZWQgb3Igbm90LAotICogc28gYWx3YXlzIHdyaXRlIHRoZSBQVEUgZGlyZWN0bHkgYW5kIHJlbHkg b24gWGVuIHRyYXBwaW5nIGFuZAotICogZW11bGF0aW5nIGFueSB1cGRhdGVzIGFzIG5lY2Vzc2Fy eS4KLSAqLwotX192aXNpYmxlIHB0ZV90IHhlbl9tYWtlX3B0ZV9pbml0KHB0ZXZhbF90IHB0ZSkK LXsKLSNpZmRlZiBDT05GSUdfWDg2XzY0Ci0JdW5zaWduZWQgbG9uZyBwZm47Ci0KLQkvKgotCSAq IFBhZ2VzIGJlbG9uZ2luZyB0byB0aGUgaW5pdGlhbCBwMm0gbGlzdCBtYXBwZWQgb3V0c2lkZSB0 aGUgZGVmYXVsdAotCSAqIGFkZHJlc3MgcmFuZ2UgbXVzdCBiZSBtYXBwZWQgcmVhZC1vbmx5LiBU aGlzIHJlZ2lvbiBjb250YWlucyB0aGUKLQkgKiBwYWdlIHRhYmxlcyBmb3IgbWFwcGluZyB0aGUg cDJtIGxpc3QsIHRvbywgYW5kIHBhZ2UgdGFibGVzIE1VU1QgYmUKLQkgKiBtYXBwZWQgcmVhZC1v bmx5LgotCSAqLwotCXBmbiA9IChwdGUgJiBQVEVfUEZOX01BU0spID4+IFBBR0VfU0hJRlQ7Ci0J aWYgKHhlbl9zdGFydF9pbmZvLT5tZm5fbGlzdCA8IF9fU1RBUlRfS0VSTkVMX21hcCAmJgotCSAg ICBwZm4gPj0geGVuX3N0YXJ0X2luZm8tPmZpcnN0X3AybV9wZm4gJiYKLQkgICAgcGZuIDwgeGVu X3N0YXJ0X2luZm8tPmZpcnN0X3AybV9wZm4gKyB4ZW5fc3RhcnRfaW5mby0+bnJfcDJtX2ZyYW1l cykKLQkJcHRlICY9IH5fUEFHRV9SVzsKLSNlbmRpZgotCXB0ZSA9IHB0ZV9wZm5fdG9fbWZuKHB0 ZSk7Ci0JcmV0dXJuIG5hdGl2ZV9tYWtlX3B0ZShwdGUpOwotfQotUFZfQ0FMTEVFX1NBVkVfUkVH U19USFVOSyh4ZW5fbWFrZV9wdGVfaW5pdCk7Ci0KLXN0YXRpYyB2b2lkIF9faW5pdCB4ZW5fc2V0 X3B0ZV9pbml0KHB0ZV90ICpwdGVwLCBwdGVfdCBwdGUpCi17Ci0jaWZkZWYgQ09ORklHX1g4Nl8z MgotCS8qIElmIHRoZXJlJ3MgYW4gZXhpc3RpbmcgcHRlLCB0aGVuIGRvbid0IGFsbG93IF9QQUdF X1JXIHRvIGJlIHNldCAqLwotCWlmIChwdGVfbWZuKHB0ZSkgIT0gSU5WQUxJRF9QMk1fRU5UUlkK LQkgICAgJiYgcHRlX3ZhbF9tYSgqcHRlcCkgJiBfUEFHRV9QUkVTRU5UKQotCQlwdGUgPSBfX3B0 ZV9tYSgoKHB0ZV92YWxfbWEoKnB0ZXApICYgX1BBR0VfUlcpIHwgfl9QQUdFX1JXKSAmCi0JCQkg ICAgICAgcHRlX3ZhbF9tYShwdGUpKTsKLSNlbmRpZgotCW5hdGl2ZV9zZXRfcHRlKHB0ZXAsIHB0 ZSk7Ci19Ci0KLS8qIEVhcmx5IGluIGJvb3QsIHdoaWxlIHNldHRpbmcgdXAgdGhlIGluaXRpYWwg cGFnZXRhYmxlLCBhc3N1bWUKLSAgIGV2ZXJ5dGhpbmcgaXMgcGlubmVkLiAqLwotc3RhdGljIHZv aWQgX19pbml0IHhlbl9hbGxvY19wdGVfaW5pdChzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWdu ZWQgbG9uZyBwZm4pCi17Ci0jaWZkZWYgQ09ORklHX0ZMQVRNRU0KLQlCVUdfT04obWVtX21hcCk7 CS8qIHNob3VsZCBvbmx5IGJlIHVzZWQgZWFybHkgKi8KLSNlbmRpZgotCW1ha2VfbG93bWVtX3Bh Z2VfcmVhZG9ubHkoX192YShQRk5fUEhZUyhwZm4pKSk7Ci0JcGluX3BhZ2V0YWJsZV9wZm4oTU1V RVhUX1BJTl9MMV9UQUJMRSwgcGZuKTsKLX0KLQotLyogVXNlZCBmb3IgcG1kIGFuZCBwdWQgKi8K LXN0YXRpYyB2b2lkIF9faW5pdCB4ZW5fYWxsb2NfcG1kX2luaXQoc3RydWN0IG1tX3N0cnVjdCAq bW0sIHVuc2lnbmVkIGxvbmcgcGZuKQotewotI2lmZGVmIENPTkZJR19GTEFUTUVNCi0JQlVHX09O KG1lbV9tYXApOwkvKiBzaG91bGQgb25seSBiZSB1c2VkIGVhcmx5ICovCi0jZW5kaWYKLQltYWtl X2xvd21lbV9wYWdlX3JlYWRvbmx5KF9fdmEoUEZOX1BIWVMocGZuKSkpOwotfQotCi0vKiBFYXJs eSByZWxlYXNlX3B0ZSBhc3N1bWVzIHRoYXQgYWxsIHB0cyBhcmUgcGlubmVkLCBzaW5jZSB0aGVy ZSdzCi0gICBvbmx5IGluaXRfbW0gYW5kIGFueXRoaW5nIGF0dGFjaGVkIHRvIHRoYXQgaXMgcGlu bmVkLiAqLwotc3RhdGljIHZvaWQgX19pbml0IHhlbl9yZWxlYXNlX3B0ZV9pbml0KHVuc2lnbmVk IGxvbmcgcGZuKQotewotCXBpbl9wYWdldGFibGVfcGZuKE1NVUVYVF9VTlBJTl9UQUJMRSwgcGZu KTsKLQltYWtlX2xvd21lbV9wYWdlX3JlYWR3cml0ZShfX3ZhKFBGTl9QSFlTKHBmbikpKTsKLX0K LQotc3RhdGljIHZvaWQgX19pbml0IHhlbl9yZWxlYXNlX3BtZF9pbml0KHVuc2lnbmVkIGxvbmcg cGZuKQotewotCW1ha2VfbG93bWVtX3BhZ2VfcmVhZHdyaXRlKF9fdmEoUEZOX1BIWVMocGZuKSkp OwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgX19waW5fcGFnZXRhYmxlX3Bmbih1bnNpZ25lZCBj bWQsIHVuc2lnbmVkIGxvbmcgcGZuKQotewotCXN0cnVjdCBtdWx0aWNhbGxfc3BhY2UgbWNzOwot CXN0cnVjdCBtbXVleHRfb3AgKm9wOwotCi0JbWNzID0gX194ZW5fbWNfZW50cnkoc2l6ZW9mKCpv cCkpOwotCW9wID0gbWNzLmFyZ3M7Ci0Jb3AtPmNtZCA9IGNtZDsKLQlvcC0+YXJnMS5tZm4gPSBw Zm5fdG9fbWZuKHBmbik7Ci0KLQlNVUxUSV9tbXVleHRfb3AobWNzLm1jLCBtY3MuYXJncywgMSwg TlVMTCwgRE9NSURfU0VMRik7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBfX3NldF9wZm5fcHJv dCh1bnNpZ25lZCBsb25nIHBmbiwgcGdwcm90X3QgcHJvdCkKLXsKLQlzdHJ1Y3QgbXVsdGljYWxs X3NwYWNlIG1jczsKLQl1bnNpZ25lZCBsb25nIGFkZHIgPSAodW5zaWduZWQgbG9uZylfX3ZhKHBm biA8PCBQQUdFX1NISUZUKTsKLQotCW1jcyA9IF9feGVuX21jX2VudHJ5KDApOwotCU1VTFRJX3Vw ZGF0ZV92YV9tYXBwaW5nKG1jcy5tYywgKHVuc2lnbmVkIGxvbmcpYWRkciwKLQkJCQlwZm5fcHRl KHBmbiwgcHJvdCksIDApOwotfQotCi0vKiBUaGlzIG5lZWRzIHRvIG1ha2Ugc3VyZSB0aGUgbmV3 IHB0ZSBwYWdlIGlzIHBpbm5lZCBpZmYgaXRzIGJlaW5nCi0gICBhdHRhY2hlZCB0byBhIHBpbm5l ZCBwYWdldGFibGUuICovCi1zdGF0aWMgaW5saW5lIHZvaWQgeGVuX2FsbG9jX3B0cGFnZShzdHJ1 Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBwZm4sCi0JCQkJICAgIHVuc2lnbmVkIGxl dmVsKQotewotCWJvb2wgcGlubmVkID0gUGFnZVBpbm5lZCh2aXJ0X3RvX3BhZ2UobW0tPnBnZCkp OwotCi0JdHJhY2VfeGVuX21tdV9hbGxvY19wdHBhZ2UobW0sIHBmbiwgbGV2ZWwsIHBpbm5lZCk7 Ci0KLQlpZiAocGlubmVkKSB7Ci0JCXN0cnVjdCBwYWdlICpwYWdlID0gcGZuX3RvX3BhZ2UocGZu KTsKLQotCQlTZXRQYWdlUGlubmVkKHBhZ2UpOwotCi0JCWlmICghUGFnZUhpZ2hNZW0ocGFnZSkp IHsKLQkJCXhlbl9tY19iYXRjaCgpOwotCi0JCQlfX3NldF9wZm5fcHJvdChwZm4sIFBBR0VfS0VS TkVMX1JPKTsKLQotCQkJaWYgKGxldmVsID09IFBUX1BURSAmJiBVU0VfU1BMSVRfUFRFX1BUTE9D S1MpCi0JCQkJX19waW5fcGFnZXRhYmxlX3BmbihNTVVFWFRfUElOX0wxX1RBQkxFLCBwZm4pOwot Ci0JCQl4ZW5fbWNfaXNzdWUoUEFSQVZJUlRfTEFaWV9NTVUpOwotCQl9IGVsc2UgewotCQkJLyog bWFrZSBzdXJlIHRoZXJlIGFyZSBubyBzdHJheSBtYXBwaW5ncyBvZgotCQkJICAgdGhpcyBwYWdl ICovCi0JCQlrbWFwX2ZsdXNoX3VudXNlZCgpOwotCQl9Ci0JfQotfQotCi1zdGF0aWMgdm9pZCB4 ZW5fYWxsb2NfcHRlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIHBmbikKLXsK LQl4ZW5fYWxsb2NfcHRwYWdlKG1tLCBwZm4sIFBUX1BURSk7Ci19Ci0KLXN0YXRpYyB2b2lkIHhl bl9hbGxvY19wbWQoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgcGZuKQotewot CXhlbl9hbGxvY19wdHBhZ2UobW0sIHBmbiwgUFRfUE1EKTsKLX0KLQotLyogVGhpcyBzaG91bGQg bmV2ZXIgaGFwcGVuIHVudGlsIHdlJ3JlIE9LIHRvIHVzZSBzdHJ1Y3QgcGFnZSAqLwotc3RhdGlj IGlubGluZSB2b2lkIHhlbl9yZWxlYXNlX3B0cGFnZSh1bnNpZ25lZCBsb25nIHBmbiwgdW5zaWdu ZWQgbGV2ZWwpCi17Ci0Jc3RydWN0IHBhZ2UgKnBhZ2UgPSBwZm5fdG9fcGFnZShwZm4pOwotCWJv b2wgcGlubmVkID0gUGFnZVBpbm5lZChwYWdlKTsKLQotCXRyYWNlX3hlbl9tbXVfcmVsZWFzZV9w dHBhZ2UocGZuLCBsZXZlbCwgcGlubmVkKTsKLQotCWlmIChwaW5uZWQpIHsKLQkJaWYgKCFQYWdl SGlnaE1lbShwYWdlKSkgewotCQkJeGVuX21jX2JhdGNoKCk7Ci0KLQkJCWlmIChsZXZlbCA9PSBQ VF9QVEUgJiYgVVNFX1NQTElUX1BURV9QVExPQ0tTKQotCQkJCV9fcGluX3BhZ2V0YWJsZV9wZm4o TU1VRVhUX1VOUElOX1RBQkxFLCBwZm4pOwotCi0JCQlfX3NldF9wZm5fcHJvdChwZm4sIFBBR0Vf S0VSTkVMKTsKLQotCQkJeGVuX21jX2lzc3VlKFBBUkFWSVJUX0xBWllfTU1VKTsKLQkJfQotCQlD bGVhclBhZ2VQaW5uZWQocGFnZSk7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCB4ZW5fcmVsZWFzZV9w dGUodW5zaWduZWQgbG9uZyBwZm4pCi17Ci0JeGVuX3JlbGVhc2VfcHRwYWdlKHBmbiwgUFRfUFRF KTsKLX0KLQotc3RhdGljIHZvaWQgeGVuX3JlbGVhc2VfcG1kKHVuc2lnbmVkIGxvbmcgcGZuKQot ewotCXhlbl9yZWxlYXNlX3B0cGFnZShwZm4sIFBUX1BNRCk7Ci19Ci0KLSNpZiBDT05GSUdfUEdU QUJMRV9MRVZFTFMgPT0gNAotc3RhdGljIHZvaWQgeGVuX2FsbG9jX3B1ZChzdHJ1Y3QgbW1fc3Ry dWN0ICptbSwgdW5zaWduZWQgbG9uZyBwZm4pCi17Ci0JeGVuX2FsbG9jX3B0cGFnZShtbSwgcGZu LCBQVF9QVUQpOwotfQotCi1zdGF0aWMgdm9pZCB4ZW5fcmVsZWFzZV9wdWQodW5zaWduZWQgbG9u ZyBwZm4pCi17Ci0JeGVuX3JlbGVhc2VfcHRwYWdlKHBmbiwgUFRfUFVEKTsKLX0KLSNlbmRpZgot Ci12b2lkIF9faW5pdCB4ZW5fcmVzZXJ2ZV90b3Aodm9pZCkKLXsKLSNpZmRlZiBDT05GSUdfWDg2 XzMyCi0JdW5zaWduZWQgbG9uZyB0b3AgPSBIWVBFUlZJU09SX1ZJUlRfU1RBUlQ7Ci0Jc3RydWN0 IHhlbl9wbGF0Zm9ybV9wYXJhbWV0ZXJzIHBwOwotCi0JaWYgKEhZUEVSVklTT1JfeGVuX3ZlcnNp b24oWEVOVkVSX3BsYXRmb3JtX3BhcmFtZXRlcnMsICZwcCkgPT0gMCkKLQkJdG9wID0gcHAudmly dF9zdGFydDsKLQotCXJlc2VydmVfdG9wX2FkZHJlc3MoLXRvcCk7Ci0jZW5kaWYJLyogQ09ORklH X1g4Nl8zMiAqLwotfQotCi0vKgotICogTGlrZSBfX3ZhKCksIGJ1dCByZXR1cm5zIGFkZHJlc3Mg aW4gdGhlIGtlcm5lbCBtYXBwaW5nICh3aGljaCBpcwotICogYWxsIHdlIGhhdmUgdW50aWwgdGhl IHBoeXNpY2FsIG1lbW9yeSBtYXBwaW5nIGhhcyBiZWVuIHNldCB1cC4KLSAqLwotc3RhdGljIHZv aWQgKiBfX2luaXQgX19rYShwaHlzX2FkZHJfdCBwYWRkcikKLXsKLSNpZmRlZiBDT05GSUdfWDg2 XzY0Ci0JcmV0dXJuICh2b2lkICopKHBhZGRyICsgX19TVEFSVF9LRVJORUxfbWFwKTsKLSNlbHNl Ci0JcmV0dXJuIF9fdmEocGFkZHIpOwotI2VuZGlmCi19Ci0KLS8qIENvbnZlcnQgYSBtYWNoaW5l IGFkZHJlc3MgdG8gcGh5c2ljYWwgYWRkcmVzcyAqLwotc3RhdGljIHVuc2lnbmVkIGxvbmcgX19p bml0IG0ycChwaHlzX2FkZHJfdCBtYWRkcikKLXsKLQlwaHlzX2FkZHJfdCBwYWRkcjsKLQotCW1h ZGRyICY9IFBURV9QRk5fTUFTSzsKLQlwYWRkciA9IG1mbl90b19wZm4obWFkZHIgPj4gUEFHRV9T SElGVCkgPDwgUEFHRV9TSElGVDsKLQotCXJldHVybiBwYWRkcjsKLX0KLQotLyogQ29udmVydCBh IG1hY2hpbmUgYWRkcmVzcyB0byBrZXJuZWwgdmlydHVhbCAqLwotc3RhdGljIHZvaWQgKiBfX2lu aXQgbTJ2KHBoeXNfYWRkcl90IG1hZGRyKQotewotCXJldHVybiBfX2thKG0ycChtYWRkcikpOwot fQotCi0vKiBTZXQgdGhlIHBhZ2UgcGVybWlzc2lvbnMgb24gYW4gaWRlbnRpdHktbWFwcGVkIHBh Z2VzICovCi1zdGF0aWMgdm9pZCBfX2luaXQgc2V0X3BhZ2VfcHJvdF9mbGFncyh2b2lkICphZGRy LCBwZ3Byb3RfdCBwcm90LAotCQkJCSAgICAgICB1bnNpZ25lZCBsb25nIGZsYWdzKQotewotCXVu c2lnbmVkIGxvbmcgcGZuID0gX19wYShhZGRyKSA+PiBQQUdFX1NISUZUOwotCXB0ZV90IHB0ZSA9 IHBmbl9wdGUocGZuLCBwcm90KTsKLQotCWlmIChIWVBFUlZJU09SX3VwZGF0ZV92YV9tYXBwaW5n KCh1bnNpZ25lZCBsb25nKWFkZHIsIHB0ZSwgZmxhZ3MpKQotCQlCVUcoKTsKLX0KLXN0YXRpYyB2 b2lkIF9faW5pdCBzZXRfcGFnZV9wcm90KHZvaWQgKmFkZHIsIHBncHJvdF90IHByb3QpCi17Ci0J cmV0dXJuIHNldF9wYWdlX3Byb3RfZmxhZ3MoYWRkciwgcHJvdCwgVVZNRl9OT05FKTsKLX0KLSNp ZmRlZiBDT05GSUdfWDg2XzMyCi1zdGF0aWMgdm9pZCBfX2luaXQgeGVuX21hcF9pZGVudGl0eV9l YXJseShwbWRfdCAqcG1kLCB1bnNpZ25lZCBsb25nIG1heF9wZm4pCi17Ci0JdW5zaWduZWQgcG1k aWR4LCBwdGVpZHg7Ci0JdW5zaWduZWQgaWRlbnRfcHRlOwotCXVuc2lnbmVkIGxvbmcgcGZuOwot Ci0JbGV2ZWwxX2lkZW50X3BndCA9IGV4dGVuZF9icmsoc2l6ZW9mKHB0ZV90KSAqIExFVkVMMV9J REVOVF9FTlRSSUVTLAotCQkJCSAgICAgIFBBR0VfU0laRSk7Ci0KLQlpZGVudF9wdGUgPSAwOwot CXBmbiA9IDA7Ci0JZm9yIChwbWRpZHggPSAwOyBwbWRpZHggPCBQVFJTX1BFUl9QTUQgJiYgcGZu IDwgbWF4X3BmbjsgcG1kaWR4KyspIHsKLQkJcHRlX3QgKnB0ZV9wYWdlOwotCi0JCS8qIFJldXNl IG9yIGFsbG9jYXRlIGEgcGFnZSBvZiBwdGVzICovCi0JCWlmIChwbWRfcHJlc2VudChwbWRbcG1k aWR4XSkpCi0JCQlwdGVfcGFnZSA9IG0ydihwbWRbcG1kaWR4XS5wbWQpOwotCQllbHNlIHsKLQkJ CS8qIENoZWNrIGZvciBmcmVlIHB0ZSBwYWdlcyAqLwotCQkJaWYgKGlkZW50X3B0ZSA9PSBMRVZF TDFfSURFTlRfRU5UUklFUykKLQkJCQlicmVhazsKLQotCQkJcHRlX3BhZ2UgPSAmbGV2ZWwxX2lk ZW50X3BndFtpZGVudF9wdGVdOwotCQkJaWRlbnRfcHRlICs9IFBUUlNfUEVSX1BURTsKLQotCQkJ cG1kW3BtZGlkeF0gPSBfX3BtZChfX3BhKHB0ZV9wYWdlKSB8IF9QQUdFX1RBQkxFKTsKLQkJfQot Ci0JCS8qIEluc3RhbGwgbWFwcGluZ3MgKi8KLQkJZm9yIChwdGVpZHggPSAwOyBwdGVpZHggPCBQ VFJTX1BFUl9QVEU7IHB0ZWlkeCsrLCBwZm4rKykgewotCQkJcHRlX3QgcHRlOwotCi0JCQlpZiAo cGZuID4gbWF4X3Bmbl9tYXBwZWQpCi0JCQkJbWF4X3Bmbl9tYXBwZWQgPSBwZm47Ci0KLQkJCWlm ICghcHRlX25vbmUocHRlX3BhZ2VbcHRlaWR4XSkpCi0JCQkJY29udGludWU7Ci0KLQkJCXB0ZSA9 IHBmbl9wdGUocGZuLCBQQUdFX0tFUk5FTF9FWEVDKTsKLQkJCXB0ZV9wYWdlW3B0ZWlkeF0gPSBw dGU7Ci0JCX0KLQl9Ci0KLQlmb3IgKHB0ZWlkeCA9IDA7IHB0ZWlkeCA8IGlkZW50X3B0ZTsgcHRl aWR4ICs9IFBUUlNfUEVSX1BURSkKLQkJc2V0X3BhZ2VfcHJvdCgmbGV2ZWwxX2lkZW50X3BndFtw dGVpZHhdLCBQQUdFX0tFUk5FTF9STyk7Ci0KLQlzZXRfcGFnZV9wcm90KHBtZCwgUEFHRV9LRVJO RUxfUk8pOwotfQotI2VuZGlmCi12b2lkIF9faW5pdCB4ZW5fc2V0dXBfbWFjaHBoeXNfbWFwcGlu Zyh2b2lkKQotewotCXN0cnVjdCB4ZW5fbWFjaHBoeXNfbWFwcGluZyBtYXBwaW5nOwotCi0JaWYg KEhZUEVSVklTT1JfbWVtb3J5X29wKFhFTk1FTV9tYWNocGh5c19tYXBwaW5nLCAmbWFwcGluZykg PT0gMCkgewotCQltYWNoaW5lX3RvX3BoeXNfbWFwcGluZyA9ICh1bnNpZ25lZCBsb25nICopbWFw cGluZy52X3N0YXJ0OwotCQltYWNoaW5lX3RvX3BoeXNfbnIgPSBtYXBwaW5nLm1heF9tZm4gKyAx OwotCX0gZWxzZSB7Ci0JCW1hY2hpbmVfdG9fcGh5c19uciA9IE1BQ0gyUEhZU19OUl9FTlRSSUVT OwotCX0KLSNpZmRlZiBDT05GSUdfWDg2XzMyCi0JV0FSTl9PTigobWFjaGluZV90b19waHlzX21h cHBpbmcgKyAobWFjaGluZV90b19waHlzX25yIC0gMSkpCi0JCTwgbWFjaGluZV90b19waHlzX21h cHBpbmcpOwotI2VuZGlmCi19Ci0KLSNpZmRlZiBDT05GSUdfWDg2XzY0Ci1zdGF0aWMgdm9pZCBf X2luaXQgY29udmVydF9wZm5fbWZuKHZvaWQgKnYpCi17Ci0JcHRlX3QgKnB0ZSA9IHY7Ci0JaW50 IGk7Ci0KLQkvKiBBbGwgbGV2ZWxzIGFyZSBjb252ZXJ0ZWQgdGhlIHNhbWUgd2F5LCBzbyBqdXN0 IHRyZWF0IHRoZW0KLQkgICBhcyBwdGVzLiAqLwotCWZvciAoaSA9IDA7IGkgPCBQVFJTX1BFUl9Q VEU7IGkrKykKLQkJcHRlW2ldID0geGVuX21ha2VfcHRlKHB0ZVtpXS5wdGUpOwotfQotc3RhdGlj IHZvaWQgX19pbml0IGNoZWNrX3B0X2Jhc2UodW5zaWduZWQgbG9uZyAqcHRfYmFzZSwgdW5zaWdu ZWQgbG9uZyAqcHRfZW5kLAotCQkJCSB1bnNpZ25lZCBsb25nIGFkZHIpCi17Ci0JaWYgKCpwdF9i YXNlID09IFBGTl9ET1dOKF9fcGEoYWRkcikpKSB7Ci0JCXNldF9wYWdlX3Byb3RfZmxhZ3MoKHZv aWQgKilhZGRyLCBQQUdFX0tFUk5FTCwgVVZNRl9JTlZMUEcpOwotCQljbGVhcl9wYWdlKCh2b2lk ICopYWRkcik7Ci0JCSgqcHRfYmFzZSkrKzsKLQl9Ci0JaWYgKCpwdF9lbmQgPT0gUEZOX0RPV04o X19wYShhZGRyKSkpIHsKLQkJc2V0X3BhZ2VfcHJvdF9mbGFncygodm9pZCAqKWFkZHIsIFBBR0Vf S0VSTkVMLCBVVk1GX0lOVkxQRyk7Ci0JCWNsZWFyX3BhZ2UoKHZvaWQgKilhZGRyKTsKLQkJKCpw dF9lbmQpLS07Ci0JfQotfQotLyoKLSAqIFNldCB1cCB0aGUgaW5pdGlhbCBrZXJuZWwgcGFnZXRh YmxlLgotICoKLSAqIFdlIGNhbiBjb25zdHJ1Y3QgdGhpcyBieSBncmFmdGluZyB0aGUgWGVuIHBy b3ZpZGVkIHBhZ2V0YWJsZSBpbnRvCi0gKiBoZWFkXzY0LlMncyBwcmVjb25zdHJ1Y3RlZCBwYWdl dGFibGVzLiAgV2UgY29weSB0aGUgWGVuIEwyJ3MgaW50bwotICogbGV2ZWwyX2lkZW50X3BndCwg YW5kIGxldmVsMl9rZXJuZWxfcGd0LiAgVGhpcyBtZWFucyB0aGF0IG9ubHkgdGhlCi0gKiBrZXJu ZWwgaGFzIGEgcGh5c2ljYWwgbWFwcGluZyB0byBzdGFydCB3aXRoIC0gYnV0IHRoYXQncyBlbm91 Z2ggdG8KLSAqIGdldCBfX3ZhIHdvcmtpbmcuICBXZSBuZWVkIHRvIGZpbGwgaW4gdGhlIHJlc3Qg b2YgdGhlIHBoeXNpY2FsCi0gKiBtYXBwaW5nIG9uY2Ugc29tZSBzb3J0IG9mIGFsbG9jYXRvciBo YXMgYmVlbiBzZXQgdXAuCi0gKi8KLXZvaWQgX19pbml0IHhlbl9zZXR1cF9rZXJuZWxfcGFnZXRh YmxlKHBnZF90ICpwZ2QsIHVuc2lnbmVkIGxvbmcgbWF4X3BmbikKLXsKLQlwdWRfdCAqbDM7Ci0J cG1kX3QgKmwyOwotCXVuc2lnbmVkIGxvbmcgYWRkclszXTsKLQl1bnNpZ25lZCBsb25nIHB0X2Jh c2UsIHB0X2VuZDsKLQl1bnNpZ25lZCBpOwotCi0JLyogbWF4X3Bmbl9tYXBwZWQgaXMgdGhlIGxh c3QgcGZuIG1hcHBlZCBpbiB0aGUgaW5pdGlhbCBtZW1vcnkKLQkgKiBtYXBwaW5ncy4gQ29uc2lk ZXJpbmcgdGhhdCBvbiBYZW4gYWZ0ZXIgdGhlIGtlcm5lbCBtYXBwaW5ncyB3ZQotCSAqIGhhdmUg dGhlIG1hcHBpbmdzIG9mIHNvbWUgcGFnZXMgdGhhdCBkb24ndCBleGlzdCBpbiBwZm4gc3BhY2Us IHdlCi0JICogc2V0IG1heF9wZm5fbWFwcGVkIHRvIHRoZSBsYXN0IHJlYWwgcGZuIG1hcHBlZC4g Ki8KLQlpZiAoeGVuX3N0YXJ0X2luZm8tPm1mbl9saXN0IDwgX19TVEFSVF9LRVJORUxfbWFwKQot CQltYXhfcGZuX21hcHBlZCA9IHhlbl9zdGFydF9pbmZvLT5maXJzdF9wMm1fcGZuOwotCWVsc2UK LQkJbWF4X3Bmbl9tYXBwZWQgPSBQRk5fRE9XTihfX3BhKHhlbl9zdGFydF9pbmZvLT5tZm5fbGlz dCkpOwotCi0JcHRfYmFzZSA9IFBGTl9ET1dOKF9fcGEoeGVuX3N0YXJ0X2luZm8tPnB0X2Jhc2Up KTsKLQlwdF9lbmQgPSBwdF9iYXNlICsgeGVuX3N0YXJ0X2luZm8tPm5yX3B0X2ZyYW1lczsKLQot CS8qIFphcCBpZGVudGl0eSBtYXBwaW5nICovCi0JaW5pdF9sZXZlbDRfcGd0WzBdID0gX19wZ2Qo MCk7Ci0KLQlpZiAoIXhlbl9mZWF0dXJlKFhFTkZFQVRfYXV0b190cmFuc2xhdGVkX3BoeXNtYXAp KSB7Ci0JCS8qIFByZS1jb25zdHJ1Y3RlZCBlbnRyaWVzIGFyZSBpbiBwZm4sIHNvIGNvbnZlcnQg dG8gbWZuICovCi0JCS8qIEw0WzI3Ml0gLT4gbGV2ZWwzX2lkZW50X3BndAotCQkgKiBMNFs1MTFd IC0+IGxldmVsM19rZXJuZWxfcGd0ICovCi0JCWNvbnZlcnRfcGZuX21mbihpbml0X2xldmVsNF9w Z3QpOwotCi0JCS8qIEwzX2lbMF0gLT4gbGV2ZWwyX2lkZW50X3BndCAqLwotCQljb252ZXJ0X3Bm bl9tZm4obGV2ZWwzX2lkZW50X3BndCk7Ci0JCS8qIEwzX2tbNTEwXSAtPiBsZXZlbDJfa2VybmVs X3BndAotCQkgKiBMM19rWzUxMV0gLT4gbGV2ZWwyX2ZpeG1hcF9wZ3QgKi8KLQkJY29udmVydF9w Zm5fbWZuKGxldmVsM19rZXJuZWxfcGd0KTsKLQotCQkvKiBMM19rWzUxMV1bNTA2XSAtPiBsZXZl bDFfZml4bWFwX3BndCAqLwotCQljb252ZXJ0X3Bmbl9tZm4obGV2ZWwyX2ZpeG1hcF9wZ3QpOwot CX0KLQkvKiBXZSBnZXQgWzUxMV1bNTExXSBhbmQgaGF2ZSBYZW4ncyB2ZXJzaW9uIG9mIGxldmVs Ml9rZXJuZWxfcGd0ICovCi0JbDMgPSBtMnYocGdkW3BnZF9pbmRleChfX1NUQVJUX0tFUk5FTF9t YXApXS5wZ2QpOwotCWwyID0gbTJ2KGwzW3B1ZF9pbmRleChfX1NUQVJUX0tFUk5FTF9tYXApXS5w dWQpOwotCi0JYWRkclswXSA9ICh1bnNpZ25lZCBsb25nKXBnZDsKLQlhZGRyWzFdID0gKHVuc2ln bmVkIGxvbmcpbDM7Ci0JYWRkclsyXSA9ICh1bnNpZ25lZCBsb25nKWwyOwotCS8qIEdyYWZ0IGl0 IG9udG8gTDRbMjcyXVswXS4gTm90ZSB0aGF0IHdlIGNyZWF0aW5nIGFuIGFsaWFzaW5nIHByb2Js ZW06Ci0JICogQm90aCBMNFsyNzJdWzBdIGFuZCBMNFs1MTFdWzUxMF0gaGF2ZSBlbnRyaWVzIHRo YXQgcG9pbnQgdG8gdGhlIHNhbWUKLQkgKiBMMiAoUE1EKSB0YWJsZXMuIE1lYW5pbmcgdGhhdCBp ZiB5b3UgbW9kaWZ5IGl0IGluIF9fdmEgc3BhY2UKLQkgKiBpdCB3aWxsIGJlIGFsc28gbW9kaWZp ZWQgaW4gdGhlIF9fa2Egc3BhY2UhIChCdXQgaWYgeW91IGp1c3QKLQkgKiBtb2RpZnkgdGhlIFBN RCB0YWJsZSB0byBwb2ludCB0byBvdGhlciBQVEUncyBvciBub25lLCB0aGVuIHlvdQotCSAqIGFy ZSBPSyAtIHdoaWNoIGlzIHdoYXQgY2xlYW51cF9oaWdobWFwIGRvZXMpICovCi0JY29weV9wYWdl KGxldmVsMl9pZGVudF9wZ3QsIGwyKTsKLQkvKiBHcmFmdCBpdCBvbnRvIEw0WzUxMV1bNTEwXSAq LwotCWNvcHlfcGFnZShsZXZlbDJfa2VybmVsX3BndCwgbDIpOwotCi0JLyogQ29weSB0aGUgaW5p dGlhbCBQLT5NIHRhYmxlIG1hcHBpbmdzIGlmIG5lY2Vzc2FyeS4gKi8KLQlpID0gcGdkX2luZGV4 KHhlbl9zdGFydF9pbmZvLT5tZm5fbGlzdCk7Ci0JaWYgKGkgJiYgaSA8IHBnZF9pbmRleChfX1NU QVJUX0tFUk5FTF9tYXApKQotCQlpbml0X2xldmVsNF9wZ3RbaV0gPSAoKHBnZF90ICopeGVuX3N0 YXJ0X2luZm8tPnB0X2Jhc2UpW2ldOwotCi0JaWYgKCF4ZW5fZmVhdHVyZShYRU5GRUFUX2F1dG9f dHJhbnNsYXRlZF9waHlzbWFwKSkgewotCQkvKiBNYWtlIHBhZ2V0YWJsZSBwaWVjZXMgUk8gKi8K LQkJc2V0X3BhZ2VfcHJvdChpbml0X2xldmVsNF9wZ3QsIFBBR0VfS0VSTkVMX1JPKTsKLQkJc2V0 X3BhZ2VfcHJvdChsZXZlbDNfaWRlbnRfcGd0LCBQQUdFX0tFUk5FTF9STyk7Ci0JCXNldF9wYWdl X3Byb3QobGV2ZWwzX2tlcm5lbF9wZ3QsIFBBR0VfS0VSTkVMX1JPKTsKLQkJc2V0X3BhZ2VfcHJv dChsZXZlbDNfdXNlcl92c3lzY2FsbCwgUEFHRV9LRVJORUxfUk8pOwotCQlzZXRfcGFnZV9wcm90 KGxldmVsMl9pZGVudF9wZ3QsIFBBR0VfS0VSTkVMX1JPKTsKLQkJc2V0X3BhZ2VfcHJvdChsZXZl bDJfa2VybmVsX3BndCwgUEFHRV9LRVJORUxfUk8pOwotCQlzZXRfcGFnZV9wcm90KGxldmVsMl9m aXhtYXBfcGd0LCBQQUdFX0tFUk5FTF9STyk7Ci0JCXNldF9wYWdlX3Byb3QobGV2ZWwxX2ZpeG1h cF9wZ3QsIFBBR0VfS0VSTkVMX1JPKTsKLQotCQkvKiBQaW4gZG93biBuZXcgTDQgKi8KLQkJcGlu X3BhZ2V0YWJsZV9wZm4oTU1VRVhUX1BJTl9MNF9UQUJMRSwKLQkJCQkgIFBGTl9ET1dOKF9fcGFf c3ltYm9sKGluaXRfbGV2ZWw0X3BndCkpKTsKLQotCQkvKiBVbnBpbiBYZW4tcHJvdmlkZWQgb25l ICovCi0JCXBpbl9wYWdldGFibGVfcGZuKE1NVUVYVF9VTlBJTl9UQUJMRSwgUEZOX0RPV04oX19w YShwZ2QpKSk7Ci0KLQkJLyoKLQkJICogQXQgdGhpcyBzdGFnZSB0aGVyZSBjYW4gYmUgbm8gdXNl ciBwZ2QsIGFuZCBubyBwYWdlCi0JCSAqIHN0cnVjdHVyZSB0byBhdHRhY2ggaXQgdG8sIHNvIG1h a2Ugc3VyZSB3ZSBqdXN0IHNldCBrZXJuZWwKLQkJICogcGdkLgotCQkgKi8KLQkJeGVuX21jX2Jh dGNoKCk7Ci0JCV9feGVuX3dyaXRlX2NyMyh0cnVlLCBfX3BhKGluaXRfbGV2ZWw0X3BndCkpOwot CQl4ZW5fbWNfaXNzdWUoUEFSQVZJUlRfTEFaWV9DUFUpOwotCX0gZWxzZQotCQluYXRpdmVfd3Jp dGVfY3IzKF9fcGEoaW5pdF9sZXZlbDRfcGd0KSk7Ci0KLQkvKiBXZSBjYW4ndCB0aGF0IGVhc2ls eSByaXAgb3V0IEwzIGFuZCBMMiwgYXMgdGhlIFhlbiBwYWdldGFibGVzIGFyZQotCSAqIHNldCBv dXQgdGhpcyB3YXk6IFtMNF0sIFtMMV0sIFtMMl0sIFtMM10sIFtMMV0sIFtMMV0gLi4uICBmb3IK LQkgKiB0aGUgaW5pdGlhbCBkb21haW4uIEZvciBndWVzdHMgdXNpbmcgdGhlIHRvb2xzdGFjaywg dGhleSBhcmUgaW46Ci0JICogW0w0XSwgW0wzXSwgW0wyXSwgW0wxXSwgW0wxXSwgb3JkZXIgLi4g U28gZm9yIGRvbTAgd2UgY2FuIG9ubHkKLQkgKiByaXAgb3V0IHRoZSBbTDRdIChwZ2QpLCBidXQg Zm9yIGd1ZXN0cyB3ZSBzaGF2ZSBvZmYgdGhyZWUgcGFnZXMuCi0JICovCi0JZm9yIChpID0gMDsg aSA8IEFSUkFZX1NJWkUoYWRkcik7IGkrKykKLQkJY2hlY2tfcHRfYmFzZSgmcHRfYmFzZSwgJnB0 X2VuZCwgYWRkcltpXSk7Ci0KLQkvKiBPdXIgKGJ5IHRocmVlIHBhZ2VzKSBzbWFsbGVyIFhlbiBw YWdldGFibGUgdGhhdCB3ZSBhcmUgdXNpbmcgKi8KLQl4ZW5fcHRfYmFzZSA9IFBGTl9QSFlTKHB0 X2Jhc2UpOwotCXhlbl9wdF9zaXplID0gKHB0X2VuZCAtIHB0X2Jhc2UpICogUEFHRV9TSVpFOwot CW1lbWJsb2NrX3Jlc2VydmUoeGVuX3B0X2Jhc2UsIHhlbl9wdF9zaXplKTsKLQotCS8qIFJldmVj dG9yIHRoZSB4ZW5fc3RhcnRfaW5mbyAqLwotCXhlbl9zdGFydF9pbmZvID0gKHN0cnVjdCBzdGFy dF9pbmZvICopX192YShfX3BhKHhlbl9zdGFydF9pbmZvKSk7Ci19Ci0KLS8qCi0gKiBSZWFkIGEg dmFsdWUgZnJvbSBhIHBoeXNpY2FsIGFkZHJlc3MuCi0gKi8KLXN0YXRpYyB1bnNpZ25lZCBsb25n IF9faW5pdCB4ZW5fcmVhZF9waHlzX3Vsb25nKHBoeXNfYWRkcl90IGFkZHIpCi17Ci0JdW5zaWdu ZWQgbG9uZyAqdmFkZHI7Ci0JdW5zaWduZWQgbG9uZyB2YWw7CisjaW5jbHVkZSA8bGludXgvcGZu Lmg+CisjaW5jbHVkZSA8YXNtL3hlbi9wYWdlLmg+CisjaW5jbHVkZSA8YXNtL3hlbi9oeXBlcmNh bGwuaD4KKyNpbmNsdWRlIDx4ZW4vaW50ZXJmYWNlL21lbW9yeS5oPgogCi0JdmFkZHIgPSBlYXJs eV9tZW1yZW1hcF9ybyhhZGRyLCBzaXplb2YodmFsKSk7Ci0JdmFsID0gKnZhZGRyOwotCWVhcmx5 X21lbXVubWFwKHZhZGRyLCBzaXplb2YodmFsKSk7Ci0JcmV0dXJuIHZhbDsKLX0KKyNpbmNsdWRl ICJtdWx0aWNhbGxzLmgiCisjaW5jbHVkZSAibW11LmgiCiAKIC8qCi0gKiBUcmFuc2xhdGUgYSB2 aXJ0dWFsIGFkZHJlc3MgdG8gYSBwaHlzaWNhbCBvbmUgd2l0aG91dCByZWx5aW5nIG9uIG1hcHBl ZAotICogcGFnZSB0YWJsZXMuCisgKiBQcm90ZWN0cyBhdG9taWMgcmVzZXJ2YXRpb24gZGVjcmVh c2UvaW5jcmVhc2UgYWdhaW5zdCBjb25jdXJyZW50IGluY3JlYXNlcy4KKyAqIEFsc28gcHJvdGVj dHMgbm9uLWF0b21pYyB1cGRhdGVzIG9mIGN1cnJlbnRfcGFnZXMgYW5kIGJhbGxvb24gbGlzdHMu CiAgKi8KLXN0YXRpYyBwaHlzX2FkZHJfdCBfX2luaXQgeGVuX2Vhcmx5X3ZpcnRfdG9fcGh5cyh1 bnNpZ25lZCBsb25nIHZhZGRyKQotewotCXBoeXNfYWRkcl90IHBhOwotCXBnZF90IHBnZDsKLQlw dWRfdCBwdWQ7Ci0JcG1kX3QgcG1kOwotCXB0ZV90IHB0ZTsKLQotCXBhID0gcmVhZF9jcjMoKTsK LQlwZ2QgPSBuYXRpdmVfbWFrZV9wZ2QoeGVuX3JlYWRfcGh5c191bG9uZyhwYSArIHBnZF9pbmRl eCh2YWRkcikgKgotCQkJCQkJICAgICAgIHNpemVvZihwZ2QpKSk7Ci0JaWYgKCFwZ2RfcHJlc2Vu dChwZ2QpKQotCQlyZXR1cm4gMDsKLQotCXBhID0gcGdkX3ZhbChwZ2QpICYgUFRFX1BGTl9NQVNL OwotCXB1ZCA9IG5hdGl2ZV9tYWtlX3B1ZCh4ZW5fcmVhZF9waHlzX3Vsb25nKHBhICsgcHVkX2lu ZGV4KHZhZGRyKSAqCi0JCQkJCQkgICAgICAgc2l6ZW9mKHB1ZCkpKTsKLQlpZiAoIXB1ZF9wcmVz ZW50KHB1ZCkpCi0JCXJldHVybiAwOwotCXBhID0gcHVkX3BmbihwdWQpIDw8IFBBR0VfU0hJRlQ7 Ci0JaWYgKHB1ZF9sYXJnZShwdWQpKQotCQlyZXR1cm4gcGEgKyAodmFkZHIgJiB+UFVEX01BU0sp OwotCi0JcG1kID0gbmF0aXZlX21ha2VfcG1kKHhlbl9yZWFkX3BoeXNfdWxvbmcocGEgKyBwbWRf aW5kZXgodmFkZHIpICoKLQkJCQkJCSAgICAgICBzaXplb2YocG1kKSkpOwotCWlmICghcG1kX3By ZXNlbnQocG1kKSkKLQkJcmV0dXJuIDA7Ci0JcGEgPSBwbWRfcGZuKHBtZCkgPDwgUEFHRV9TSElG VDsKLQlpZiAocG1kX2xhcmdlKHBtZCkpCi0JCXJldHVybiBwYSArICh2YWRkciAmIH5QTURfTUFT Syk7Ci0KLQlwdGUgPSBuYXRpdmVfbWFrZV9wdGUoeGVuX3JlYWRfcGh5c191bG9uZyhwYSArIHB0 ZV9pbmRleCh2YWRkcikgKgotCQkJCQkJICAgICAgIHNpemVvZihwdGUpKSk7Ci0JaWYgKCFwdGVf cHJlc2VudChwdGUpKQotCQlyZXR1cm4gMDsKLQlwYSA9IHB0ZV9wZm4ocHRlKSA8PCBQQUdFX1NI SUZUOwotCi0JcmV0dXJuIHBhIHwgKHZhZGRyICYgflBBR0VfTUFTSyk7Ci19CitERUZJTkVfU1BJ TkxPQ0soeGVuX3Jlc2VydmF0aW9uX2xvY2spOwogCi0vKgotICogRmluZCBhIG5ldyBhcmVhIGZv ciB0aGUgaHlwZXJ2aXNvciBzdXBwbGllZCBwMm0gbGlzdCBhbmQgcmVsb2NhdGUgdGhlIHAybSB0 bwotICogdGhpcyBhcmVhLgotICovCi12b2lkIF9faW5pdCB4ZW5fcmVsb2NhdGVfcDJtKHZvaWQp Cit1bnNpZ25lZCBsb25nIGFyYml0cmFyeV92aXJ0X3RvX21mbih2b2lkICp2YWRkcikKIHsKLQlw aHlzX2FkZHJfdCBzaXplLCBuZXdfYXJlYSwgcHRfcGh5cywgcG1kX3BoeXMsIHB1ZF9waHlzOwot CXVuc2lnbmVkIGxvbmcgcDJtX3BmbiwgcDJtX3Bmbl9lbmQsIG5fZnJhbWVzLCBwZm4sIHBmbl9l bmQ7Ci0JaW50IG5fcHRlLCBuX3B0LCBuX3BtZCwgbl9wdWQsIGlkeF9wdGUsIGlkeF9wdCwgaWR4 X3BtZCwgaWR4X3B1ZDsKLQlwdGVfdCAqcHQ7Ci0JcG1kX3QgKnBtZDsKLQlwdWRfdCAqcHVkOwot CXBnZF90ICpwZ2Q7Ci0JdW5zaWduZWQgbG9uZyAqbmV3X3AybTsKLQotCXNpemUgPSBQQUdFX0FM SUdOKHhlbl9zdGFydF9pbmZvLT5ucl9wYWdlcyAqIHNpemVvZih1bnNpZ25lZCBsb25nKSk7Ci0J bl9wdGUgPSByb3VuZHVwKHNpemUsIFBBR0VfU0laRSkgPj4gUEFHRV9TSElGVDsKLQluX3B0ID0g cm91bmR1cChzaXplLCBQTURfU0laRSkgPj4gUE1EX1NISUZUOwotCW5fcG1kID0gcm91bmR1cChz aXplLCBQVURfU0laRSkgPj4gUFVEX1NISUZUOwotCW5fcHVkID0gcm91bmR1cChzaXplLCBQR0RJ Ul9TSVpFKSA+PiBQR0RJUl9TSElGVDsKLQluX2ZyYW1lcyA9IG5fcHRlICsgbl9wdCArIG5fcG1k ICsgbl9wdWQ7Ci0KLQluZXdfYXJlYSA9IHhlbl9maW5kX2ZyZWVfYXJlYShQRk5fUEhZUyhuX2Zy YW1lcykpOwotCWlmICghbmV3X2FyZWEpIHsKLQkJeGVuX3Jhd19jb25zb2xlX3dyaXRlKCJDYW4n dCBmaW5kIG5ldyBtZW1vcnkgYXJlYSBmb3IgcDJtIG5lZWRlZCBkdWUgdG8gRTgyMCBtYXAgY29u ZmxpY3RcbiIpOwotCQlCVUcoKTsKLQl9Ci0KLQkvKgotCSAqIFNldHVwIHRoZSBwYWdlIHRhYmxl cyBmb3IgYWRkcmVzc2luZyB0aGUgbmV3IHAybSBsaXN0LgotCSAqIFdlIGhhdmUgYXNrZWQgdGhl IGh5cGVydmlzb3IgdG8gbWFwIHRoZSBwMm0gbGlzdCBhdCB0aGUgdXNlciBhZGRyZXNzCi0JICog UFVEX1NJWkUuIEl0IG1heSBoYXZlIGRvbmUgc28sIG9yIGl0IG1heSBoYXZlIHVzZWQgYSBrZXJu ZWwgc3BhY2UKLQkgKiBhZGRyZXNzIGRlcGVuZGluZyBvbiB0aGUgWGVuIHZlcnNpb24uCi0JICog VG8gYXZvaWQgYW55IHBvc3NpYmxlIHZpcnR1YWwgYWRkcmVzcyBjb2xsaXNpb24sIGp1c3QgdXNl Ci0JICogMiAqIFBVRF9TSVpFIGZvciB0aGUgbmV3IGFyZWEuCi0JICovCi0JcHVkX3BoeXMgPSBu ZXdfYXJlYTsKLQlwbWRfcGh5cyA9IHB1ZF9waHlzICsgUEZOX1BIWVMobl9wdWQpOwotCXB0X3Bo eXMgPSBwbWRfcGh5cyArIFBGTl9QSFlTKG5fcG1kKTsKLQlwMm1fcGZuID0gUEZOX0RPV04ocHRf cGh5cykgKyBuX3B0OwotCi0JcGdkID0gX192YShyZWFkX2NyMygpKTsKLQluZXdfcDJtID0gKHVu c2lnbmVkIGxvbmcgKikoMiAqIFBHRElSX1NJWkUpOwotCWZvciAoaWR4X3B1ZCA9IDA7IGlkeF9w dWQgPCBuX3B1ZDsgaWR4X3B1ZCsrKSB7Ci0JCXB1ZCA9IGVhcmx5X21lbXJlbWFwKHB1ZF9waHlz LCBQQUdFX1NJWkUpOwotCQljbGVhcl9wYWdlKHB1ZCk7Ci0JCWZvciAoaWR4X3BtZCA9IDA7IGlk eF9wbWQgPCBtaW4obl9wbWQsIFBUUlNfUEVSX1BVRCk7Ci0JCSAgICAgaWR4X3BtZCsrKSB7Ci0J CQlwbWQgPSBlYXJseV9tZW1yZW1hcChwbWRfcGh5cywgUEFHRV9TSVpFKTsKLQkJCWNsZWFyX3Bh Z2UocG1kKTsKLQkJCWZvciAoaWR4X3B0ID0gMDsgaWR4X3B0IDwgbWluKG5fcHQsIFBUUlNfUEVS X1BNRCk7Ci0JCQkgICAgIGlkeF9wdCsrKSB7Ci0JCQkJcHQgPSBlYXJseV9tZW1yZW1hcChwdF9w aHlzLCBQQUdFX1NJWkUpOwotCQkJCWNsZWFyX3BhZ2UocHQpOwotCQkJCWZvciAoaWR4X3B0ZSA9 IDA7Ci0JCQkJICAgICBpZHhfcHRlIDwgbWluKG5fcHRlLCBQVFJTX1BFUl9QVEUpOwotCQkJCSAg ICAgaWR4X3B0ZSsrKSB7Ci0JCQkJCXNldF9wdGUocHQgKyBpZHhfcHRlLAotCQkJCQkJcGZuX3B0 ZShwMm1fcGZuLCBQQUdFX0tFUk5FTCkpOwotCQkJCQlwMm1fcGZuKys7Ci0JCQkJfQotCQkJCW5f cHRlIC09IFBUUlNfUEVSX1BURTsKLQkJCQllYXJseV9tZW11bm1hcChwdCwgUEFHRV9TSVpFKTsK LQkJCQltYWtlX2xvd21lbV9wYWdlX3JlYWRvbmx5KF9fdmEocHRfcGh5cykpOwotCQkJCXBpbl9w YWdldGFibGVfcGZuKE1NVUVYVF9QSU5fTDFfVEFCTEUsCi0JCQkJCQkgIFBGTl9ET1dOKHB0X3Bo eXMpKTsKLQkJCQlzZXRfcG1kKHBtZCArIGlkeF9wdCwKLQkJCQkJX19wbWQoX1BBR0VfVEFCTEUg fCBwdF9waHlzKSk7Ci0JCQkJcHRfcGh5cyArPSBQQUdFX1NJWkU7Ci0JCQl9Ci0JCQluX3B0IC09 IFBUUlNfUEVSX1BNRDsKLQkJCWVhcmx5X21lbXVubWFwKHBtZCwgUEFHRV9TSVpFKTsKLQkJCW1h a2VfbG93bWVtX3BhZ2VfcmVhZG9ubHkoX192YShwbWRfcGh5cykpOwotCQkJcGluX3BhZ2V0YWJs ZV9wZm4oTU1VRVhUX1BJTl9MMl9UQUJMRSwKLQkJCQkJICBQRk5fRE9XTihwbWRfcGh5cykpOwot CQkJc2V0X3B1ZChwdWQgKyBpZHhfcG1kLCBfX3B1ZChfUEFHRV9UQUJMRSB8IHBtZF9waHlzKSk7 Ci0JCQlwbWRfcGh5cyArPSBQQUdFX1NJWkU7Ci0JCX0KLQkJbl9wbWQgLT0gUFRSU19QRVJfUFVE OwotCQllYXJseV9tZW11bm1hcChwdWQsIFBBR0VfU0laRSk7Ci0JCW1ha2VfbG93bWVtX3BhZ2Vf cmVhZG9ubHkoX192YShwdWRfcGh5cykpOwotCQlwaW5fcGFnZXRhYmxlX3BmbihNTVVFWFRfUElO X0wzX1RBQkxFLCBQRk5fRE9XTihwdWRfcGh5cykpOwotCQlzZXRfcGdkKHBnZCArIDIgKyBpZHhf cHVkLCBfX3BnZChfUEFHRV9UQUJMRSB8IHB1ZF9waHlzKSk7Ci0JCXB1ZF9waHlzICs9IFBBR0Vf U0laRTsKLQl9Ci0KLQkvKiBOb3cgY29weSB0aGUgb2xkIHAybSBpbmZvIHRvIHRoZSBuZXcgYXJl YS4gKi8KLQltZW1jcHkobmV3X3AybSwgeGVuX3AybV9hZGRyLCBzaXplKTsKLQl4ZW5fcDJtX2Fk ZHIgPSBuZXdfcDJtOwotCi0JLyogUmVsZWFzZSB0aGUgb2xkIHAybSBsaXN0IGFuZCBzZXQgbmV3 IGxpc3QgaW5mby4gKi8KLQlwMm1fcGZuID0gUEZOX0RPV04oeGVuX2Vhcmx5X3ZpcnRfdG9fcGh5 cyh4ZW5fc3RhcnRfaW5mby0+bWZuX2xpc3QpKTsKLQlCVUdfT04oIXAybV9wZm4pOwotCXAybV9w Zm5fZW5kID0gcDJtX3BmbiArIFBGTl9ET1dOKHNpemUpOwotCi0JaWYgKHhlbl9zdGFydF9pbmZv LT5tZm5fbGlzdCA8IF9fU1RBUlRfS0VSTkVMX21hcCkgewotCQlwZm4gPSB4ZW5fc3RhcnRfaW5m by0+Zmlyc3RfcDJtX3BmbjsKLQkJcGZuX2VuZCA9IHhlbl9zdGFydF9pbmZvLT5maXJzdF9wMm1f cGZuICsKLQkJCSAgeGVuX3N0YXJ0X2luZm8tPm5yX3AybV9mcmFtZXM7Ci0JCXNldF9wZ2QocGdk ICsgMSwgX19wZ2QoMCkpOwotCX0gZWxzZSB7Ci0JCXBmbiA9IHAybV9wZm47Ci0JCXBmbl9lbmQg PSBwMm1fcGZuX2VuZDsKLQl9Ci0KLQltZW1ibG9ja19mcmVlKFBGTl9QSFlTKHBmbiksIFBBR0Vf U0laRSAqIChwZm5fZW5kIC0gcGZuKSk7Ci0Jd2hpbGUgKHBmbiA8IHBmbl9lbmQpIHsKLQkJaWYg KHBmbiA9PSBwMm1fcGZuKSB7Ci0JCQlwZm4gPSBwMm1fcGZuX2VuZDsKLQkJCWNvbnRpbnVlOwot CQl9Ci0JCW1ha2VfbG93bWVtX3BhZ2VfcmVhZHdyaXRlKF9fdmEoUEZOX1BIWVMocGZuKSkpOwot CQlwZm4rKzsKLQl9CisJeG1hZGRyX3QgbWFkZHIgPSBhcmJpdHJhcnlfdmlydF90b19tYWNoaW5l KHZhZGRyKTsKIAotCXhlbl9zdGFydF9pbmZvLT5tZm5fbGlzdCA9ICh1bnNpZ25lZCBsb25nKXhl bl9wMm1fYWRkcjsKLQl4ZW5fc3RhcnRfaW5mby0+Zmlyc3RfcDJtX3BmbiA9ICBQRk5fRE9XTihu ZXdfYXJlYSk7Ci0JeGVuX3N0YXJ0X2luZm8tPm5yX3AybV9mcmFtZXMgPSBuX2ZyYW1lczsKKwly ZXR1cm4gUEZOX0RPV04obWFkZHIubWFkZHIpOwogfQogCi0jZWxzZQkvKiAhQ09ORklHX1g4Nl82 NCAqLwotc3RhdGljIFJFU0VSVkVfQlJLX0FSUkFZKHBtZF90LCBpbml0aWFsX2tlcm5lbF9wbWQs IFBUUlNfUEVSX1BNRCk7Ci1zdGF0aWMgUkVTRVJWRV9CUktfQVJSQVkocG1kX3QsIHN3YXBwZXJf a2VybmVsX3BtZCwgUFRSU19QRVJfUE1EKTsKLQotc3RhdGljIHZvaWQgX19pbml0IHhlbl93cml0 ZV9jcjNfaW5pdCh1bnNpZ25lZCBsb25nIGNyMykKK3htYWRkcl90IGFyYml0cmFyeV92aXJ0X3Rv X21hY2hpbmUodm9pZCAqdmFkZHIpCiB7Ci0JdW5zaWduZWQgbG9uZyBwZm4gPSBQRk5fRE9XTihf X3BhKHN3YXBwZXJfcGdfZGlyKSk7Ci0KLQlCVUdfT04ocmVhZF9jcjMoKSAhPSBfX3BhKGluaXRp YWxfcGFnZV90YWJsZSkpOwotCUJVR19PTihjcjMgIT0gX19wYShzd2FwcGVyX3BnX2RpcikpOwor CXVuc2lnbmVkIGxvbmcgYWRkcmVzcyA9ICh1bnNpZ25lZCBsb25nKXZhZGRyOworCXVuc2lnbmVk IGludCBsZXZlbDsKKwlwdGVfdCAqcHRlOworCXVuc2lnbmVkIG9mZnNldDsKIAogCS8qCi0JICog V2UgYXJlIHN3aXRjaGluZyB0byBzd2FwcGVyX3BnX2RpciBmb3IgdGhlIGZpcnN0IHRpbWUgKGZy b20KLQkgKiBpbml0aWFsX3BhZ2VfdGFibGUpIGFuZCB0aGVyZWZvcmUgbmVlZCB0byBtYXJrIHRo YXQgcGFnZQotCSAqIHJlYWQtb25seSBhbmQgdGhlbiBwaW4gaXQuCi0JICoKLQkgKiBYZW4gZGlz YWxsb3dzIHNoYXJpbmcgb2Yga2VybmVsIFBNRHMgZm9yIFBBRQotCSAqIGd1ZXN0cy4gVGhlcmVm b3JlIHdlIG11c3QgY29weSB0aGUga2VybmVsIFBNRCBmcm9tCi0JICogaW5pdGlhbF9wYWdlX3Rh YmxlIGludG8gYSBuZXcga2VybmVsIFBNRCB0byBiZSB1c2VkIGluCi0JICogc3dhcHBlcl9wZ19k aXIuCisJICogaWYgdGhlIFBGTiBpcyBpbiB0aGUgbGluZWFyIG1hcHBlZCB2YWRkciByYW5nZSwg d2UgY2FuIGp1c3QgdXNlCisJICogdGhlIChxdWljaykgdmlydF90b19tYWNoaW5lKCkgcDJtIGxv b2t1cAogCSAqLwotCXN3YXBwZXJfa2VybmVsX3BtZCA9Ci0JCWV4dGVuZF9icmsoc2l6ZW9mKHBt ZF90KSAqIFBUUlNfUEVSX1BNRCwgUEFHRV9TSVpFKTsKLQljb3B5X3BhZ2Uoc3dhcHBlcl9rZXJu ZWxfcG1kLCBpbml0aWFsX2tlcm5lbF9wbWQpOwotCXN3YXBwZXJfcGdfZGlyW0tFUk5FTF9QR0Rf Qk9VTkRBUlldID0KLQkJX19wZ2QoX19wYShzd2FwcGVyX2tlcm5lbF9wbWQpIHwgX1BBR0VfUFJF U0VOVCk7Ci0Jc2V0X3BhZ2VfcHJvdChzd2FwcGVyX2tlcm5lbF9wbWQsIFBBR0VfS0VSTkVMX1JP KTsKLQotCXNldF9wYWdlX3Byb3Qoc3dhcHBlcl9wZ19kaXIsIFBBR0VfS0VSTkVMX1JPKTsKLQl4 ZW5fd3JpdGVfY3IzKGNyMyk7Ci0JcGluX3BhZ2V0YWJsZV9wZm4oTU1VRVhUX1BJTl9MM19UQUJM RSwgcGZuKTsKLQotCXBpbl9wYWdldGFibGVfcGZuKE1NVUVYVF9VTlBJTl9UQUJMRSwKLQkJCSAg UEZOX0RPV04oX19wYShpbml0aWFsX3BhZ2VfdGFibGUpKSk7Ci0Jc2V0X3BhZ2VfcHJvdChpbml0 aWFsX3BhZ2VfdGFibGUsIFBBR0VfS0VSTkVMKTsKLQlzZXRfcGFnZV9wcm90KGluaXRpYWxfa2Vy bmVsX3BtZCwgUEFHRV9LRVJORUwpOwotCi0JcHZfbW11X29wcy53cml0ZV9jcjMgPSAmeGVuX3dy aXRlX2NyMzsKLX0KLQotLyoKLSAqIEZvciAzMiBiaXQgZG9tYWlucyB4ZW5fc3RhcnRfaW5mby0+ cHRfYmFzZSBpcyB0aGUgcGdkIGFkZHJlc3Mgd2hpY2ggbWlnaHQgYmUKLSAqIG5vdCB0aGUgZmly c3QgcGFnZSB0YWJsZSBpbiB0aGUgcGFnZSB0YWJsZSBwb29sLgotICogSXRlcmF0ZSB0aHJvdWdo IHRoZSBpbml0aWFsIHBhZ2UgdGFibGVzIHRvIGZpbmQgdGhlIHJlYWwgcGFnZSB0YWJsZSBiYXNl LgotICovCi1zdGF0aWMgcGh5c19hZGRyX3QgeGVuX2ZpbmRfcHRfYmFzZShwbWRfdCAqcG1kKQot ewotCXBoeXNfYWRkcl90IHB0X2Jhc2UsIHBhZGRyOwotCXVuc2lnbmVkIHBtZGlkeDsKLQotCXB0 X2Jhc2UgPSBtaW4oX19wYSh4ZW5fc3RhcnRfaW5mby0+cHRfYmFzZSksIF9fcGEocG1kKSk7Ci0K LQlmb3IgKHBtZGlkeCA9IDA7IHBtZGlkeCA8IFBUUlNfUEVSX1BNRDsgcG1kaWR4KyspCi0JCWlm IChwbWRfcHJlc2VudChwbWRbcG1kaWR4XSkgJiYgIXBtZF9sYXJnZShwbWRbcG1kaWR4XSkpIHsK LQkJCXBhZGRyID0gbTJwKHBtZFtwbWRpZHhdLnBtZCk7Ci0JCQlwdF9iYXNlID0gbWluKHB0X2Jh c2UsIHBhZGRyKTsKLQkJfQotCi0JcmV0dXJuIHB0X2Jhc2U7Ci19Ci0KLXZvaWQgX19pbml0IHhl bl9zZXR1cF9rZXJuZWxfcGFnZXRhYmxlKHBnZF90ICpwZ2QsIHVuc2lnbmVkIGxvbmcgbWF4X3Bm bikKLXsKLQlwbWRfdCAqa2VybmVsX3BtZDsKLQotCWtlcm5lbF9wbWQgPSBtMnYocGdkW0tFUk5F TF9QR0RfQk9VTkRBUlldLnBnZCk7Ci0KLQl4ZW5fcHRfYmFzZSA9IHhlbl9maW5kX3B0X2Jhc2Uo a2VybmVsX3BtZCk7Ci0JeGVuX3B0X3NpemUgPSB4ZW5fc3RhcnRfaW5mby0+bnJfcHRfZnJhbWVz ICogUEFHRV9TSVpFOwotCi0JaW5pdGlhbF9rZXJuZWxfcG1kID0KLQkJZXh0ZW5kX2JyayhzaXpl b2YocG1kX3QpICogUFRSU19QRVJfUE1ELCBQQUdFX1NJWkUpOwotCi0JbWF4X3Bmbl9tYXBwZWQg PSBQRk5fRE9XTih4ZW5fcHRfYmFzZSArIHhlbl9wdF9zaXplICsgNTEyICogMTAyNCk7Ci0KLQlj b3B5X3BhZ2UoaW5pdGlhbF9rZXJuZWxfcG1kLCBrZXJuZWxfcG1kKTsKLQotCXhlbl9tYXBfaWRl bnRpdHlfZWFybHkoaW5pdGlhbF9rZXJuZWxfcG1kLCBtYXhfcGZuKTsKLQotCWNvcHlfcGFnZShp bml0aWFsX3BhZ2VfdGFibGUsIHBnZCk7Ci0JaW5pdGlhbF9wYWdlX3RhYmxlW0tFUk5FTF9QR0Rf Qk9VTkRBUlldID0KLQkJX19wZ2QoX19wYShpbml0aWFsX2tlcm5lbF9wbWQpIHwgX1BBR0VfUFJF U0VOVCk7Ci0KLQlzZXRfcGFnZV9wcm90KGluaXRpYWxfa2VybmVsX3BtZCwgUEFHRV9LRVJORUxf Uk8pOwotCXNldF9wYWdlX3Byb3QoaW5pdGlhbF9wYWdlX3RhYmxlLCBQQUdFX0tFUk5FTF9STyk7 Ci0Jc2V0X3BhZ2VfcHJvdChlbXB0eV96ZXJvX3BhZ2UsIFBBR0VfS0VSTkVMX1JPKTsKLQotCXBp bl9wYWdldGFibGVfcGZuKE1NVUVYVF9VTlBJTl9UQUJMRSwgUEZOX0RPV04oX19wYShwZ2QpKSk7 Ci0KLQlwaW5fcGFnZXRhYmxlX3BmbihNTVVFWFRfUElOX0wzX1RBQkxFLAotCQkJICBQRk5fRE9X TihfX3BhKGluaXRpYWxfcGFnZV90YWJsZSkpKTsKLQl4ZW5fd3JpdGVfY3IzKF9fcGEoaW5pdGlh bF9wYWdlX3RhYmxlKSk7Ci0KLQltZW1ibG9ja19yZXNlcnZlKHhlbl9wdF9iYXNlLCB4ZW5fcHRf c2l6ZSk7Ci19Ci0jZW5kaWYJLyogQ09ORklHX1g4Nl82NCAqLwotCi12b2lkIF9faW5pdCB4ZW5f cmVzZXJ2ZV9zcGVjaWFsX3BhZ2VzKHZvaWQpCi17Ci0JcGh5c19hZGRyX3QgcGFkZHI7Ci0KLQlt ZW1ibG9ja19yZXNlcnZlKF9fcGEoeGVuX3N0YXJ0X2luZm8pLCBQQUdFX1NJWkUpOwotCWlmICh4 ZW5fc3RhcnRfaW5mby0+c3RvcmVfbWZuKSB7Ci0JCXBhZGRyID0gUEZOX1BIWVMobWZuX3RvX3Bm bih4ZW5fc3RhcnRfaW5mby0+c3RvcmVfbWZuKSk7Ci0JCW1lbWJsb2NrX3Jlc2VydmUocGFkZHIs IFBBR0VfU0laRSk7Ci0JfQotCWlmICgheGVuX2luaXRpYWxfZG9tYWluKCkpIHsKLQkJcGFkZHIg PSBQRk5fUEhZUyhtZm5fdG9fcGZuKHhlbl9zdGFydF9pbmZvLT5jb25zb2xlLmRvbVUubWZuKSk7 Ci0JCW1lbWJsb2NrX3Jlc2VydmUocGFkZHIsIFBBR0VfU0laRSk7Ci0JfQotfQotCi12b2lkIF9f aW5pdCB4ZW5fcHRfY2hlY2tfZTgyMCh2b2lkKQotewotCWlmICh4ZW5faXNfZTgyMF9yZXNlcnZl ZCh4ZW5fcHRfYmFzZSwgeGVuX3B0X3NpemUpKSB7Ci0JCXhlbl9yYXdfY29uc29sZV93cml0ZSgi WGVuIGh5cGVydmlzb3IgYWxsb2NhdGVkIHBhZ2UgdGFibGUgbWVtb3J5IGNvbmZsaWN0cyB3aXRo IEU4MjAgbWFwXG4iKTsKLQkJQlVHKCk7Ci0JfQotfQotCi1zdGF0aWMgdW5zaWduZWQgY2hhciBk dW1teV9tYXBwaW5nW1BBR0VfU0laRV0gX19wYWdlX2FsaWduZWRfYnNzOwotCi1zdGF0aWMgdm9p ZCB4ZW5fc2V0X2ZpeG1hcCh1bnNpZ25lZCBpZHgsIHBoeXNfYWRkcl90IHBoeXMsIHBncHJvdF90 IHByb3QpCi17Ci0JcHRlX3QgcHRlOwotCi0JcGh5cyA+Pj0gUEFHRV9TSElGVDsKLQotCXN3aXRj aCAoaWR4KSB7Ci0JY2FzZSBGSVhfQlRNQVBfRU5EIC4uLiBGSVhfQlRNQVBfQkVHSU46Ci0JY2Fz ZSBGSVhfUk9fSURUOgotI2lmZGVmIENPTkZJR19YODZfMzIKLQljYXNlIEZJWF9XUF9URVNUOgot IyBpZmRlZiBDT05GSUdfSElHSE1FTQotCWNhc2UgRklYX0tNQVBfQkVHSU4gLi4uIEZJWF9LTUFQ X0VORDoKLSMgZW5kaWYKLSNlbGlmIGRlZmluZWQoQ09ORklHX1g4Nl9WU1lTQ0FMTF9FTVVMQVRJ T04pCi0JY2FzZSBWU1lTQ0FMTF9QQUdFOgotI2VuZGlmCi0JY2FzZSBGSVhfVEVYVF9QT0tFMDoK LQljYXNlIEZJWF9URVhUX1BPS0UxOgotCQkvKiBBbGwgbG9jYWwgcGFnZSBtYXBwaW5ncyAqLwot CQlwdGUgPSBwZm5fcHRlKHBoeXMsIHByb3QpOwotCQlicmVhazsKLQotI2lmZGVmIENPTkZJR19Y ODZfTE9DQUxfQVBJQwotCWNhc2UgRklYX0FQSUNfQkFTRToJLyogbWFwcyBkdW1teSBsb2NhbCBB UElDICovCi0JCXB0ZSA9IHBmbl9wdGUoUEZOX0RPV04oX19wYShkdW1teV9tYXBwaW5nKSksIFBB R0VfS0VSTkVMKTsKLQkJYnJlYWs7Ci0jZW5kaWYKLQotI2lmZGVmIENPTkZJR19YODZfSU9fQVBJ QwotCWNhc2UgRklYX0lPX0FQSUNfQkFTRV8wIC4uLiBGSVhfSU9fQVBJQ19CQVNFX0VORDoKLQkJ LyoKLQkJICogV2UganVzdCBkb24ndCBtYXAgdGhlIElPIEFQSUMgLSBhbGwgYWNjZXNzIGlzIHZp YQotCQkgKiBoeXBlcmNhbGxzLiAgS2VlcCB0aGUgYWRkcmVzcyBpbiB0aGUgcHRlIGZvciByZWZl cmVuY2UuCi0JCSAqLwotCQlwdGUgPSBwZm5fcHRlKFBGTl9ET1dOKF9fcGEoZHVtbXlfbWFwcGlu ZykpLCBQQUdFX0tFUk5FTCk7Ci0JCWJyZWFrOwotI2VuZGlmCi0KLQljYXNlIEZJWF9QQVJBVklS VF9CT09UTUFQOgotCQkvKiBUaGlzIGlzIGFuIE1GTiwgYnV0IGl0IGlzbid0IGFuIElPIG1hcHBp bmcgZnJvbSB0aGUKLQkJICAgSU8gZG9tYWluICovCi0JCXB0ZSA9IG1mbl9wdGUocGh5cywgcHJv dCk7Ci0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQkJLyogQnkgZGVmYXVsdCwgc2V0X2ZpeG1hcCBp cyB1c2VkIGZvciBoYXJkd2FyZSBtYXBwaW5ncyAqLwotCQlwdGUgPSBtZm5fcHRlKHBoeXMsIHBy b3QpOwotCQlicmVhazsKLQl9Ci0KLQlfX25hdGl2ZV9zZXRfZml4bWFwKGlkeCwgcHRlKTsKLQot I2lmZGVmIENPTkZJR19YODZfVlNZU0NBTExfRU1VTEFUSU9OCi0JLyogUmVwbGljYXRlIGNoYW5n ZXMgdG8gbWFwIHRoZSB2c3lzY2FsbCBwYWdlIGludG8gdGhlIHVzZXIKLQkgICBwYWdldGFibGUg dnN5c2NhbGwgbWFwcGluZy4gKi8KLQlpZiAoaWR4ID09IFZTWVNDQUxMX1BBR0UpIHsKLQkJdW5z aWduZWQgbG9uZyB2YWRkciA9IF9fZml4X3RvX3ZpcnQoaWR4KTsKLQkJc2V0X3B0ZV92YWRkcl9w dWQobGV2ZWwzX3VzZXJfdnN5c2NhbGwsIHZhZGRyLCBwdGUpOwotCX0KLSNlbmRpZgotfQotCi1z dGF0aWMgdm9pZCBfX2luaXQgeGVuX3Bvc3RfYWxsb2NhdG9yX2luaXQodm9pZCkKLXsKLQlpZiAo eGVuX2ZlYXR1cmUoWEVORkVBVF9hdXRvX3RyYW5zbGF0ZWRfcGh5c21hcCkpCi0JCXJldHVybjsK LQotCXB2X21tdV9vcHMuc2V0X3B0ZSA9IHhlbl9zZXRfcHRlOwotCXB2X21tdV9vcHMuc2V0X3Bt ZCA9IHhlbl9zZXRfcG1kOwotCXB2X21tdV9vcHMuc2V0X3B1ZCA9IHhlbl9zZXRfcHVkOwotI2lm IENPTkZJR19QR1RBQkxFX0xFVkVMUyA9PSA0Ci0JcHZfbW11X29wcy5zZXRfcGdkID0geGVuX3Nl dF9wZ2Q7Ci0jZW5kaWYKLQotCS8qIFRoaXMgd2lsbCB3b3JrIGFzIGxvbmcgYXMgcGF0Y2hpbmcg aGFzbid0IGhhcHBlbmVkIHlldAotCSAgICh3aGljaCBpdCBoYXNuJ3QpICovCi0JcHZfbW11X29w cy5hbGxvY19wdGUgPSB4ZW5fYWxsb2NfcHRlOwotCXB2X21tdV9vcHMuYWxsb2NfcG1kID0geGVu X2FsbG9jX3BtZDsKLQlwdl9tbXVfb3BzLnJlbGVhc2VfcHRlID0geGVuX3JlbGVhc2VfcHRlOwot CXB2X21tdV9vcHMucmVsZWFzZV9wbWQgPSB4ZW5fcmVsZWFzZV9wbWQ7Ci0jaWYgQ09ORklHX1BH VEFCTEVfTEVWRUxTID09IDQKLQlwdl9tbXVfb3BzLmFsbG9jX3B1ZCA9IHhlbl9hbGxvY19wdWQ7 Ci0JcHZfbW11X29wcy5yZWxlYXNlX3B1ZCA9IHhlbl9yZWxlYXNlX3B1ZDsKLSNlbmRpZgotCXB2 X21tdV9vcHMubWFrZV9wdGUgPSBQVl9DQUxMRUVfU0FWRSh4ZW5fbWFrZV9wdGUpOwotCi0jaWZk ZWYgQ09ORklHX1g4Nl82NAotCXB2X21tdV9vcHMud3JpdGVfY3IzID0gJnhlbl93cml0ZV9jcjM7 Ci0JU2V0UGFnZVBpbm5lZCh2aXJ0X3RvX3BhZ2UobGV2ZWwzX3VzZXJfdnN5c2NhbGwpKTsKLSNl bmRpZgotCXhlbl9tYXJrX2luaXRfbW1fcGlubmVkKCk7Ci19Ci0KLXN0YXRpYyB2b2lkIHhlbl9s ZWF2ZV9sYXp5X21tdSh2b2lkKQotewotCXByZWVtcHRfZGlzYWJsZSgpOwotCXhlbl9tY19mbHVz aCgpOwotCXBhcmF2aXJ0X2xlYXZlX2xhenlfbW11KCk7Ci0JcHJlZW1wdF9lbmFibGUoKTsKLX0K LQotc3RhdGljIGNvbnN0IHN0cnVjdCBwdl9tbXVfb3BzIHhlbl9tbXVfb3BzIF9faW5pdGNvbnN0 ID0gewotCS5yZWFkX2NyMiA9IHhlbl9yZWFkX2NyMiwKLQkud3JpdGVfY3IyID0geGVuX3dyaXRl X2NyMiwKLQotCS5yZWFkX2NyMyA9IHhlbl9yZWFkX2NyMywKLQkud3JpdGVfY3IzID0geGVuX3dy aXRlX2NyM19pbml0LAotCi0JLmZsdXNoX3RsYl91c2VyID0geGVuX2ZsdXNoX3RsYiwKLQkuZmx1 c2hfdGxiX2tlcm5lbCA9IHhlbl9mbHVzaF90bGIsCi0JLmZsdXNoX3RsYl9zaW5nbGUgPSB4ZW5f Zmx1c2hfdGxiX3NpbmdsZSwKLQkuZmx1c2hfdGxiX290aGVycyA9IHhlbl9mbHVzaF90bGJfb3Ro ZXJzLAotCi0JLnB0ZV91cGRhdGUgPSBwYXJhdmlydF9ub3AsCi0KLQkucGdkX2FsbG9jID0geGVu X3BnZF9hbGxvYywKLQkucGdkX2ZyZWUgPSB4ZW5fcGdkX2ZyZWUsCi0KLQkuYWxsb2NfcHRlID0g eGVuX2FsbG9jX3B0ZV9pbml0LAotCS5yZWxlYXNlX3B0ZSA9IHhlbl9yZWxlYXNlX3B0ZV9pbml0 LAotCS5hbGxvY19wbWQgPSB4ZW5fYWxsb2NfcG1kX2luaXQsCi0JLnJlbGVhc2VfcG1kID0geGVu X3JlbGVhc2VfcG1kX2luaXQsCi0KLQkuc2V0X3B0ZSA9IHhlbl9zZXRfcHRlX2luaXQsCi0JLnNl dF9wdGVfYXQgPSB4ZW5fc2V0X3B0ZV9hdCwKLQkuc2V0X3BtZCA9IHhlbl9zZXRfcG1kX2h5cGVy LAotCi0JLnB0ZXBfbW9kaWZ5X3Byb3Rfc3RhcnQgPSBfX3B0ZXBfbW9kaWZ5X3Byb3Rfc3RhcnQs Ci0JLnB0ZXBfbW9kaWZ5X3Byb3RfY29tbWl0ID0gX19wdGVwX21vZGlmeV9wcm90X2NvbW1pdCwK LQotCS5wdGVfdmFsID0gUFZfQ0FMTEVFX1NBVkUoeGVuX3B0ZV92YWwpLAotCS5wZ2RfdmFsID0g UFZfQ0FMTEVFX1NBVkUoeGVuX3BnZF92YWwpLAotCi0JLm1ha2VfcHRlID0gUFZfQ0FMTEVFX1NB VkUoeGVuX21ha2VfcHRlX2luaXQpLAotCS5tYWtlX3BnZCA9IFBWX0NBTExFRV9TQVZFKHhlbl9t YWtlX3BnZCksCi0KLSNpZmRlZiBDT05GSUdfWDg2X1BBRQotCS5zZXRfcHRlX2F0b21pYyA9IHhl bl9zZXRfcHRlX2F0b21pYywKLQkucHRlX2NsZWFyID0geGVuX3B0ZV9jbGVhciwKLQkucG1kX2Ns ZWFyID0geGVuX3BtZF9jbGVhciwKLSNlbmRpZgkvKiBDT05GSUdfWDg2X1BBRSAqLwotCS5zZXRf cHVkID0geGVuX3NldF9wdWRfaHlwZXIsCi0KLQkubWFrZV9wbWQgPSBQVl9DQUxMRUVfU0FWRSh4 ZW5fbWFrZV9wbWQpLAotCS5wbWRfdmFsID0gUFZfQ0FMTEVFX1NBVkUoeGVuX3BtZF92YWwpLAot Ci0jaWYgQ09ORklHX1BHVEFCTEVfTEVWRUxTID09IDQKLQkucHVkX3ZhbCA9IFBWX0NBTExFRV9T QVZFKHhlbl9wdWRfdmFsKSwKLQkubWFrZV9wdWQgPSBQVl9DQUxMRUVfU0FWRSh4ZW5fbWFrZV9w dWQpLAotCS5zZXRfcGdkID0geGVuX3NldF9wZ2RfaHlwZXIsCi0KLQkuYWxsb2NfcHVkID0geGVu X2FsbG9jX3BtZF9pbml0LAotCS5yZWxlYXNlX3B1ZCA9IHhlbl9yZWxlYXNlX3BtZF9pbml0LAot I2VuZGlmCS8qIENPTkZJR19QR1RBQkxFX0xFVkVMUyA9PSA0ICovCi0KLQkuYWN0aXZhdGVfbW0g PSB4ZW5fYWN0aXZhdGVfbW0sCi0JLmR1cF9tbWFwID0geGVuX2R1cF9tbWFwLAotCS5leGl0X21t YXAgPSB4ZW5fZXhpdF9tbWFwLAotCi0JLmxhenlfbW9kZSA9IHsKLQkJLmVudGVyID0gcGFyYXZp cnRfZW50ZXJfbGF6eV9tbXUsCi0JCS5sZWF2ZSA9IHhlbl9sZWF2ZV9sYXp5X21tdSwKLQkJLmZs dXNoID0gcGFyYXZpcnRfZmx1c2hfbGF6eV9tbXUsCi0JfSwKLQotCS5zZXRfZml4bWFwID0geGVu X3NldF9maXhtYXAsCi19OwotCi12b2lkIF9faW5pdCB4ZW5faW5pdF9tbXVfb3BzKHZvaWQpCi17 Ci0JeDg2X2luaXQucGFnaW5nLnBhZ2V0YWJsZV9pbml0ID0geGVuX3BhZ2V0YWJsZV9pbml0Owot Ci0JaWYgKHhlbl9mZWF0dXJlKFhFTkZFQVRfYXV0b190cmFuc2xhdGVkX3BoeXNtYXApKQotCQly ZXR1cm47CisJaWYgKHZpcnRfYWRkcl92YWxpZCh2YWRkcikpCisJCXJldHVybiB2aXJ0X3RvX21h Y2hpbmUodmFkZHIpOwogCi0JcHZfbW11X29wcyA9IHhlbl9tbXVfb3BzOworCS8qIG90aGVyd2lz ZSB3ZSBoYXZlIHRvIGRvIGEgKHNsb3dlcikgZnVsbCBwYWdlLXRhYmxlIHdhbGsgKi8KIAotCW1l bXNldChkdW1teV9tYXBwaW5nLCAweGZmLCBQQUdFX1NJWkUpOworCXB0ZSA9IGxvb2t1cF9hZGRy ZXNzKGFkZHJlc3MsICZsZXZlbCk7CisJQlVHX09OKHB0ZSA9PSBOVUxMKTsKKwlvZmZzZXQgPSBh ZGRyZXNzICYgflBBR0VfTUFTSzsKKwlyZXR1cm4gWE1BRERSKCgocGh5c19hZGRyX3QpcHRlX21m bigqcHRlKSA8PCBQQUdFX1NISUZUKSArIG9mZnNldCk7CiB9CitFWFBPUlRfU1lNQk9MX0dQTChh cmJpdHJhcnlfdmlydF90b19tYWNoaW5lKTsKIAotLyogUHJvdGVjdGVkIGJ5IHhlbl9yZXNlcnZh dGlvbl9sb2NrLiAqLwotI2RlZmluZSBNQVhfQ09OVElHX09SREVSIDkgLyogMk1CICovCi1zdGF0 aWMgdW5zaWduZWQgbG9uZyBkaXNjb250aWdfZnJhbWVzWzE8PE1BWF9DT05USUdfT1JERVJdOwot Ci0jZGVmaW5lIFZPSURfUFRFIChtZm5fcHRlKDAsIF9fcGdwcm90KDApKSkKLXN0YXRpYyB2b2lk IHhlbl96YXBfcGZuX3JhbmdlKHVuc2lnbmVkIGxvbmcgdmFkZHIsIHVuc2lnbmVkIGludCBvcmRl ciwKLQkJCQl1bnNpZ25lZCBsb25nICppbl9mcmFtZXMsCi0JCQkJdW5zaWduZWQgbG9uZyAqb3V0 X2ZyYW1lcykKK3ZvaWQgeGVuX2ZsdXNoX3RsYl9hbGwodm9pZCkKIHsKLQlpbnQgaTsKKwlzdHJ1 Y3QgbW11ZXh0X29wICpvcDsKIAlzdHJ1Y3QgbXVsdGljYWxsX3NwYWNlIG1jczsKIAotCXhlbl9t Y19iYXRjaCgpOwotCWZvciAoaSA9IDA7IGkgPCAoMVVMPDxvcmRlcik7IGkrKywgdmFkZHIgKz0g UEFHRV9TSVpFKSB7Ci0JCW1jcyA9IF9feGVuX21jX2VudHJ5KDApOwotCi0JCWlmIChpbl9mcmFt ZXMpCi0JCQlpbl9mcmFtZXNbaV0gPSB2aXJ0X3RvX21mbih2YWRkcik7Ci0KLQkJTVVMVElfdXBk YXRlX3ZhX21hcHBpbmcobWNzLm1jLCB2YWRkciwgVk9JRF9QVEUsIDApOwotCQlfX3NldF9waHlz X3RvX21hY2hpbmUodmlydF90b19wZm4odmFkZHIpLCBJTlZBTElEX1AyTV9FTlRSWSk7Ci0KLQkJ aWYgKG91dF9mcmFtZXMpCi0JCQlvdXRfZnJhbWVzW2ldID0gdmlydF90b19wZm4odmFkZHIpOwot CX0KLQl4ZW5fbWNfaXNzdWUoMCk7Ci19Ci0KLS8qCi0gKiBVcGRhdGUgdGhlIHBmbi10by1tZm4g bWFwcGluZ3MgZm9yIGEgdmlydHVhbCBhZGRyZXNzIHJhbmdlLCBlaXRoZXIgdG8KLSAqIHBvaW50 IHRvIGFuIGFycmF5IG9mIG1mbnMsIG9yIGNvbnRpZ3VvdXNseSBmcm9tIGEgc2luZ2xlIHN0YXJ0 aW5nCi0gKiBtZm4uCi0gKi8KLXN0YXRpYyB2b2lkIHhlbl9yZW1hcF9leGNoYW5nZWRfcHRlcyh1 bnNpZ25lZCBsb25nIHZhZGRyLCBpbnQgb3JkZXIsCi0JCQkJICAgICB1bnNpZ25lZCBsb25nICpt Zm5zLAotCQkJCSAgICAgdW5zaWduZWQgbG9uZyBmaXJzdF9tZm4pCi17Ci0JdW5zaWduZWQgaSwg bGltaXQ7Ci0JdW5zaWduZWQgbG9uZyBtZm47Ci0KLQl4ZW5fbWNfYmF0Y2goKTsKLQotCWxpbWl0 ID0gMXUgPDwgb3JkZXI7Ci0JZm9yIChpID0gMDsgaSA8IGxpbWl0OyBpKyssIHZhZGRyICs9IFBB R0VfU0laRSkgewotCQlzdHJ1Y3QgbXVsdGljYWxsX3NwYWNlIG1jczsKLQkJdW5zaWduZWQgZmxh Z3M7Ci0KLQkJbWNzID0gX194ZW5fbWNfZW50cnkoMCk7Ci0JCWlmIChtZm5zKQotCQkJbWZuID0g bWZuc1tpXTsKLQkJZWxzZQotCQkJbWZuID0gZmlyc3RfbWZuICsgaTsKLQotCQlpZiAoaSA8IChs aW1pdCAtIDEpKQotCQkJZmxhZ3MgPSAwOwotCQllbHNlIHsKLQkJCWlmIChvcmRlciA9PSAwKQot CQkJCWZsYWdzID0gVVZNRl9JTlZMUEcgfCBVVk1GX0FMTDsKLQkJCWVsc2UKLQkJCQlmbGFncyA9 IFVWTUZfVExCX0ZMVVNIIHwgVVZNRl9BTEw7Ci0JCX0KLQotCQlNVUxUSV91cGRhdGVfdmFfbWFw cGluZyhtY3MubWMsIHZhZGRyLAotCQkJCW1mbl9wdGUobWZuLCBQQUdFX0tFUk5FTCksIGZsYWdz KTsKLQotCQlzZXRfcGh5c190b19tYWNoaW5lKHZpcnRfdG9fcGZuKHZhZGRyKSwgbWZuKTsKLQl9 Ci0KLQl4ZW5fbWNfaXNzdWUoMCk7Ci19Ci0KLS8qCi0gKiBQZXJmb3JtIHRoZSBoeXBlcmNhbGwg dG8gZXhjaGFuZ2UgYSByZWdpb24gb2Ygb3VyIHBmbnMgdG8gcG9pbnQgdG8KLSAqIG1lbW9yeSB3 aXRoIHRoZSByZXF1aXJlZCBjb250aWd1b3VzIGFsaWdubWVudC4gIFRha2VzIHRoZSBwZm5zIGFz Ci0gKiBpbnB1dCwgYW5kIHBvcHVsYXRlcyBtZm5zIGFzIG91dHB1dC4KLSAqCi0gKiBSZXR1cm5z IGEgc3VjY2VzcyBjb2RlIGluZGljYXRpbmcgd2hldGhlciB0aGUgaHlwZXJ2aXNvciB3YXMgYWJs ZSB0bwotICogc2F0aXNmeSB0aGUgcmVxdWVzdCBvciBub3QuCi0gKi8KLXN0YXRpYyBpbnQgeGVu X2V4Y2hhbmdlX21lbW9yeSh1bnNpZ25lZCBsb25nIGV4dGVudHNfaW4sIHVuc2lnbmVkIGludCBv cmRlcl9pbiwKLQkJCSAgICAgICB1bnNpZ25lZCBsb25nICpwZm5zX2luLAotCQkJICAgICAgIHVu c2lnbmVkIGxvbmcgZXh0ZW50c19vdXQsCi0JCQkgICAgICAgdW5zaWduZWQgaW50IG9yZGVyX291 dCwKLQkJCSAgICAgICB1bnNpZ25lZCBsb25nICptZm5zX291dCwKLQkJCSAgICAgICB1bnNpZ25l ZCBpbnQgYWRkcmVzc19iaXRzKQotewotCWxvbmcgcmM7Ci0JaW50IHN1Y2Nlc3M7Ci0KLQlzdHJ1 Y3QgeGVuX21lbW9yeV9leGNoYW5nZSBleGNoYW5nZSA9IHsKLQkJLmluID0gewotCQkJLm5yX2V4 dGVudHMgICA9IGV4dGVudHNfaW4sCi0JCQkuZXh0ZW50X29yZGVyID0gb3JkZXJfaW4sCi0JCQku ZXh0ZW50X3N0YXJ0ID0gcGZuc19pbiwKLQkJCS5kb21pZCAgICAgICAgPSBET01JRF9TRUxGCi0J CX0sCi0JCS5vdXQgPSB7Ci0JCQkubnJfZXh0ZW50cyAgID0gZXh0ZW50c19vdXQsCi0JCQkuZXh0 ZW50X29yZGVyID0gb3JkZXJfb3V0LAotCQkJLmV4dGVudF9zdGFydCA9IG1mbnNfb3V0LAotCQkJ LmFkZHJlc3NfYml0cyA9IGFkZHJlc3NfYml0cywKLQkJCS5kb21pZCAgICAgICAgPSBET01JRF9T RUxGCi0JCX0KLQl9OwotCi0JQlVHX09OKGV4dGVudHNfaW4gPDwgb3JkZXJfaW4gIT0gZXh0ZW50 c19vdXQgPDwgb3JkZXJfb3V0KTsKLQotCXJjID0gSFlQRVJWSVNPUl9tZW1vcnlfb3AoWEVOTUVN X2V4Y2hhbmdlLCAmZXhjaGFuZ2UpOwotCXN1Y2Nlc3MgPSAoZXhjaGFuZ2UubnJfZXhjaGFuZ2Vk ID09IGV4dGVudHNfaW4pOwotCi0JQlVHX09OKCFzdWNjZXNzICYmICgoZXhjaGFuZ2UubnJfZXhj aGFuZ2VkICE9IDApIHx8IChyYyA9PSAwKSkpOwotCUJVR19PTihzdWNjZXNzICYmIChyYyAhPSAw KSk7Ci0KLQlyZXR1cm4gc3VjY2VzczsKLX0KLQotaW50IHhlbl9jcmVhdGVfY29udGlndW91c19y ZWdpb24ocGh5c19hZGRyX3QgcHN0YXJ0LCB1bnNpZ25lZCBpbnQgb3JkZXIsCi0JCQkJIHVuc2ln bmVkIGludCBhZGRyZXNzX2JpdHMsCi0JCQkJIGRtYV9hZGRyX3QgKmRtYV9oYW5kbGUpCi17Ci0J dW5zaWduZWQgbG9uZyAqaW5fZnJhbWVzID0gZGlzY29udGlnX2ZyYW1lcywgb3V0X2ZyYW1lOwot CXVuc2lnbmVkIGxvbmcgIGZsYWdzOwotCWludCAgICAgICAgICAgIHN1Y2Nlc3M7Ci0JdW5zaWdu ZWQgbG9uZyB2c3RhcnQgPSAodW5zaWduZWQgbG9uZylwaHlzX3RvX3ZpcnQocHN0YXJ0KTsKLQot CS8qCi0JICogQ3VycmVudGx5IGFuIGF1dG8tdHJhbnNsYXRlZCBndWVzdCB3aWxsIG5vdCBwZXJm b3JtIEkvTywgbm9yIHdpbGwKLQkgKiBpdCByZXF1aXJlIFBBRSBwYWdlIGRpcmVjdG9yaWVzIGJl bG93IDRHQi4gVGhlcmVmb3JlIGFueSBjYWxscyB0bwotCSAqIHRoaXMgZnVuY3Rpb24gYXJlIHJl ZHVuZGFudCBhbmQgY2FuIGJlIGlnbm9yZWQuCi0JICovCi0KLQlpZiAoeGVuX2ZlYXR1cmUoWEVO RkVBVF9hdXRvX3RyYW5zbGF0ZWRfcGh5c21hcCkpCi0JCXJldHVybiAwOwotCi0JaWYgKHVubGlr ZWx5KG9yZGVyID4gTUFYX0NPTlRJR19PUkRFUikpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JbWVt c2V0KCh2b2lkICopIHZzdGFydCwgMCwgUEFHRV9TSVpFIDw8IG9yZGVyKTsKLQotCXNwaW5fbG9j a19pcnFzYXZlKCZ4ZW5fcmVzZXJ2YXRpb25fbG9jaywgZmxhZ3MpOwotCi0JLyogMS4gWmFwIGN1 cnJlbnQgUFRFcywgcmVtZW1iZXJpbmcgTUZOcy4gKi8KLQl4ZW5femFwX3Bmbl9yYW5nZSh2c3Rh cnQsIG9yZGVyLCBpbl9mcmFtZXMsIE5VTEwpOwotCi0JLyogMi4gR2V0IGEgbmV3IGNvbnRpZ3Vv dXMgbWVtb3J5IGV4dGVudC4gKi8KLQlvdXRfZnJhbWUgPSB2aXJ0X3RvX3Bmbih2c3RhcnQpOwot CXN1Y2Nlc3MgPSB4ZW5fZXhjaGFuZ2VfbWVtb3J5KDFVTCA8PCBvcmRlciwgMCwgaW5fZnJhbWVz LAotCQkJCSAgICAgIDEsIG9yZGVyLCAmb3V0X2ZyYW1lLAotCQkJCSAgICAgIGFkZHJlc3NfYml0 cyk7Ci0KLQkvKiAzLiBNYXAgdGhlIG5ldyBleHRlbnQgaW4gcGxhY2Ugb2Ygb2xkIHBhZ2VzLiAq LwotCWlmIChzdWNjZXNzKQotCQl4ZW5fcmVtYXBfZXhjaGFuZ2VkX3B0ZXModnN0YXJ0LCBvcmRl ciwgTlVMTCwgb3V0X2ZyYW1lKTsKLQllbHNlCi0JCXhlbl9yZW1hcF9leGNoYW5nZWRfcHRlcyh2 c3RhcnQsIG9yZGVyLCBpbl9mcmFtZXMsIDApOwotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgm eGVuX3Jlc2VydmF0aW9uX2xvY2ssIGZsYWdzKTsKLQotCSpkbWFfaGFuZGxlID0gdmlydF90b19t YWNoaW5lKHZzdGFydCkubWFkZHI7Ci0JcmV0dXJuIHN1Y2Nlc3MgPyAwIDogLUVOT01FTTsKLX0K LUVYUE9SVF9TWU1CT0xfR1BMKHhlbl9jcmVhdGVfY29udGlndW91c19yZWdpb24pOwotCi12b2lk IHhlbl9kZXN0cm95X2NvbnRpZ3VvdXNfcmVnaW9uKHBoeXNfYWRkcl90IHBzdGFydCwgdW5zaWdu ZWQgaW50IG9yZGVyKQotewotCXVuc2lnbmVkIGxvbmcgKm91dF9mcmFtZXMgPSBkaXNjb250aWdf ZnJhbWVzLCBpbl9mcmFtZTsKLQl1bnNpZ25lZCBsb25nICBmbGFnczsKLQlpbnQgc3VjY2VzczsK LQl1bnNpZ25lZCBsb25nIHZzdGFydDsKLQotCWlmICh4ZW5fZmVhdHVyZShYRU5GRUFUX2F1dG9f dHJhbnNsYXRlZF9waHlzbWFwKSkKLQkJcmV0dXJuOwotCi0JaWYgKHVubGlrZWx5KG9yZGVyID4g TUFYX0NPTlRJR19PUkRFUikpCi0JCXJldHVybjsKLQotCXZzdGFydCA9ICh1bnNpZ25lZCBsb25n KXBoeXNfdG9fdmlydChwc3RhcnQpOwotCW1lbXNldCgodm9pZCAqKSB2c3RhcnQsIDAsIFBBR0Vf U0laRSA8PCBvcmRlcik7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmeGVuX3Jlc2VydmF0aW9uX2xv Y2ssIGZsYWdzKTsKKwl0cmFjZV94ZW5fbW11X2ZsdXNoX3RsYl9hbGwoMCk7CiAKLQkvKiAxLiBG aW5kIHN0YXJ0IE1GTiBvZiBjb250aWd1b3VzIGV4dGVudC4gKi8KLQlpbl9mcmFtZSA9IHZpcnRf dG9fbWZuKHZzdGFydCk7CisJcHJlZW1wdF9kaXNhYmxlKCk7CiAKLQkvKiAyLiBaYXAgY3VycmVu dCBQVEVzLiAqLwotCXhlbl96YXBfcGZuX3JhbmdlKHZzdGFydCwgb3JkZXIsIE5VTEwsIG91dF9m cmFtZXMpOworCW1jcyA9IHhlbl9tY19lbnRyeShzaXplb2YoKm9wKSk7CiAKLQkvKiAzLiBEbyB0 aGUgZXhjaGFuZ2UgZm9yIG5vbi1jb250aWd1b3VzIE1GTnMuICovCi0Jc3VjY2VzcyA9IHhlbl9l eGNoYW5nZV9tZW1vcnkoMSwgb3JkZXIsICZpbl9mcmFtZSwgMVVMIDw8IG9yZGVyLAotCQkJCQkw LCBvdXRfZnJhbWVzLCAwKTsKKwlvcCA9IG1jcy5hcmdzOworCW9wLT5jbWQgPSBNTVVFWFRfVExC X0ZMVVNIX0FMTDsKKwlNVUxUSV9tbXVleHRfb3AobWNzLm1jLCBvcCwgMSwgTlVMTCwgRE9NSURf U0VMRik7CiAKLQkvKiA0LiBNYXAgbmV3IHBhZ2VzIGluIHBsYWNlIG9mIG9sZCBwYWdlcy4gKi8K LQlpZiAoc3VjY2VzcykKLQkJeGVuX3JlbWFwX2V4Y2hhbmdlZF9wdGVzKHZzdGFydCwgb3JkZXIs IG91dF9mcmFtZXMsIDApOwotCWVsc2UKLQkJeGVuX3JlbWFwX2V4Y2hhbmdlZF9wdGVzKHZzdGFy dCwgb3JkZXIsIE5VTEwsIGluX2ZyYW1lKTsKKwl4ZW5fbWNfaXNzdWUoUEFSQVZJUlRfTEFaWV9N TVUpOwogCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmeGVuX3Jlc2VydmF0aW9uX2xvY2ssIGZs YWdzKTsKKwlwcmVlbXB0X2VuYWJsZSgpOwogfQotRVhQT1JUX1NZTUJPTF9HUEwoeGVuX2Rlc3Ry b3lfY29udGlndW91c19yZWdpb24pOwogCiAjZGVmaW5lIFJFTUFQX0JBVENIX1NJWkUgMTYKIApA QCAtMjgxOCw3ICsxOTEsNiBAQCBpbnQgeGVuX3JlbWFwX2RvbWFpbl9nZm5fYXJyYXkoc3RydWN0 IHZtX2FyZWFfc3RydWN0ICp2bWEsCiB9CiBFWFBPUlRfU1lNQk9MX0dQTCh4ZW5fcmVtYXBfZG9t YWluX2dmbl9hcnJheSk7CiAKLQogLyogUmV0dXJuczogMCBzdWNjZXNzICovCiBpbnQgeGVuX3Vu bWFwX2RvbWFpbl9nZm5fcmFuZ2Uoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCiAJCQkgICAg ICAgaW50IG51bXBncywgc3RydWN0IHBhZ2UgKipwYWdlcykKZGlmZiAtLWdpdCBhL2FyY2gveDg2 L3hlbi9tbXVfcHYuYyBiL2FyY2gveDg2L3hlbi9tbXVfcHYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0 NAppbmRleCAwMDAwMDAwLi40OTEzN2ZkCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC94ODYveGVu L21tdV9wdi5jCkBAIC0wLDAgKzEsMjYzNSBAQAorLyoKKyAqIFhlbiBtbXUgb3BlcmF0aW9ucwor ICoKKyAqIFRoaXMgZmlsZSBjb250YWlucyB0aGUgdmFyaW91cyBtbXUgZmV0Y2ggYW5kIHVwZGF0 ZSBvcGVyYXRpb25zLgorICogVGhlIG1vc3QgaW1wb3J0YW50IGpvYiB0aGV5IG11c3QgcGVyZm9y bSBpcyB0aGUgbWFwcGluZyBiZXR3ZWVuIHRoZQorICogZG9tYWluJ3MgcGZuIGFuZCB0aGUgb3Zl cmFsbCBtYWNoaW5lIG1mbnMuCisgKgorICogWGVuIGFsbG93cyBndWVzdHMgdG8gZGlyZWN0bHkg dXBkYXRlIHRoZSBwYWdldGFibGUsIGluIGEgY29udHJvbGxlZAorICogZmFzaGlvbi4gIEluIG90 aGVyIHdvcmRzLCB0aGUgZ3Vlc3QgbW9kaWZpZXMgdGhlIHNhbWUgcGFnZXRhYmxlCisgKiB0aGF0 IHRoZSBDUFUgYWN0dWFsbHkgdXNlcywgd2hpY2ggZWxpbWluYXRlcyB0aGUgb3ZlcmhlYWQgb2Yg aGF2aW5nCisgKiBhIHNlcGFyYXRlIHNoYWRvdyBwYWdldGFibGUuCisgKgorICogSW4gb3JkZXIg dG8gYWxsb3cgdGhpcywgaXQgZmFsbHMgb24gdGhlIGd1ZXN0IGRvbWFpbiB0byBtYXAgaXRzCisg KiBub3Rpb24gb2YgYSAicGh5c2ljYWwiIHBmbiAtIHdoaWNoIGlzIGp1c3QgYSBkb21haW4tbG9j YWwgbGluZWFyCisgKiBhZGRyZXNzIC0gaW50byBhIHJlYWwgIm1hY2hpbmUgYWRkcmVzcyIgd2hp Y2ggdGhlIENQVSdzIE1NVSBjYW4KKyAqIHVzZS4KKyAqCisgKiBBIHBnZF90L3BtZF90L3B0ZV90 IHdpbGwgdHlwaWNhbGx5IGNvbnRhaW4gYW4gbWZuLCBhbmQgc28gY2FuIGJlCisgKiBpbnNlcnRl ZCBkaXJlY3RseSBpbnRvIHRoZSBwYWdldGFibGUuICBXaGVuIGNyZWF0aW5nIGEgbmV3CisgKiBw dGUvcG1kL3BnZCwgaXQgY29udmVydHMgdGhlIHBhc3NlZCBwZm4gaW50byBhbiBtZm4uICBDb252 ZXJzZWx5LAorICogd2hlbiByZWFkaW5nIHRoZSBjb250ZW50IGJhY2sgd2l0aCBfXyhwZ2R8cG1k fHB0ZSlfdmFsLCBpdCBjb252ZXJ0cworICogdGhlIG1mbiBiYWNrIGludG8gYSBwZm4uCisgKgor ICogVGhlIG90aGVyIGNvbnN0cmFpbnQgaXMgdGhhdCBhbGwgcGFnZXMgd2hpY2ggbWFrZSB1cCBh IHBhZ2V0YWJsZQorICogbXVzdCBiZSBtYXBwZWQgcmVhZC1vbmx5IGluIHRoZSBndWVzdC4gIFRo aXMgcHJldmVudHMgdW5jb250cm9sbGVkCisgKiBndWVzdCB1cGRhdGVzIHRvIHRoZSBwYWdldGFi bGUuICBYZW4gc3RyaWN0bHkgZW5mb3JjZXMgdGhpcywgYW5kCisgKiB3aWxsIGRpc2FsbG93IGFu eSBwYWdldGFibGUgdXBkYXRlIHdoaWNoIHdpbGwgZW5kIHVwIG1hcHBpbmcgYQorICogcGFnZXRh YmxlIHBhZ2UgUlcsIGFuZCB3aWxsIGRpc2FsbG93IHVzaW5nIGFueSB3cml0YWJsZSBwYWdlIGFz IGEKKyAqIHBhZ2V0YWJsZS4KKyAqCisgKiBOYWl2ZWx5LCB3aGVuIGxvYWRpbmcgJWNyMyB3aXRo IHRoZSBiYXNlIG9mIGEgbmV3IHBhZ2V0YWJsZSwgWGVuCisgKiB3b3VsZCBuZWVkIHRvIHZhbGlk YXRlIHRoZSB3aG9sZSBwYWdldGFibGUgYmVmb3JlIGdvaW5nIG9uLgorICogTmF0dXJhbGx5LCB0 aGlzIGlzIHF1aXRlIHNsb3cuICBUaGUgc29sdXRpb24gaXMgdG8gInBpbiIgYQorICogcGFnZXRh YmxlLCB3aGljaCBlbmZvcmNlcyBhbGwgdGhlIGNvbnN0cmFpbnRzIG9uIHRoZSBwYWdldGFibGUg ZXZlbgorICogd2hlbiBpdCBpcyBub3QgYWN0aXZlbHkgaW4gdXNlLiAgVGhpcyBtZW5hcyB0aGF0 IFhlbiBjYW4gYmUgYXNzdXJlZAorICogdGhhdCBpdCBpcyBzdGlsbCB2YWxpZCB3aGVuIHlvdSBk byBsb2FkIGl0IGludG8gJWNyMywgYW5kIGRvZXNuJ3QKKyAqIG5lZWQgdG8gcmV2YWxpZGF0ZSBp dC4KKyAqCisgKiBKZXJlbXkgRml0emhhcmRpbmdlIDxqZXJlbXlAeGVuc291cmNlLmNvbT4sIFhl blNvdXJjZSBJbmMsIDIwMDcKKyAqLworI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVk ZSA8bGludXgvaGlnaG1lbS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlYnVnZnMuaD4KKyNpbmNsdWRl IDxsaW51eC9idWcuaD4KKyNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CisjaW5jbHVkZSA8bGlu dXgvZXhwb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2dm cC5oPgorI2luY2x1ZGUgPGxpbnV4L21lbWJsb2NrLmg+CisjaW5jbHVkZSA8bGludXgvc2VxX2Zp bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9jcmFzaF9kdW1wLmg+CisKKyNpbmNsdWRlIDx0cmFjZS9l dmVudHMveGVuLmg+CisKKyNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgorI2luY2x1ZGUgPGFzbS90 bGJmbHVzaC5oPgorI2luY2x1ZGUgPGFzbS9maXhtYXAuaD4KKyNpbmNsdWRlIDxhc20vbW11X2Nv bnRleHQuaD4KKyNpbmNsdWRlIDxhc20vc2V0dXAuaD4KKyNpbmNsdWRlIDxhc20vcGFyYXZpcnQu aD4KKyNpbmNsdWRlIDxhc20vZTgyMC5oPgorI2luY2x1ZGUgPGFzbS9saW5rYWdlLmg+CisjaW5j bHVkZSA8YXNtL3BhZ2UuaD4KKyNpbmNsdWRlIDxhc20vaW5pdC5oPgorI2luY2x1ZGUgPGFzbS9w YXQuaD4KKyNpbmNsdWRlIDxhc20vc21wLmg+CisKKyNpbmNsdWRlIDxhc20veGVuL2h5cGVyY2Fs bC5oPgorI2luY2x1ZGUgPGFzbS94ZW4vaHlwZXJ2aXNvci5oPgorCisjaW5jbHVkZSA8eGVuL3hl bi5oPgorI2luY2x1ZGUgPHhlbi9wYWdlLmg+CisjaW5jbHVkZSA8eGVuL2ludGVyZmFjZS94ZW4u aD4KKyNpbmNsdWRlIDx4ZW4vaW50ZXJmYWNlL2h2bS9odm1fb3AuaD4KKyNpbmNsdWRlIDx4ZW4v aW50ZXJmYWNlL3ZlcnNpb24uaD4KKyNpbmNsdWRlIDx4ZW4vaW50ZXJmYWNlL21lbW9yeS5oPgor I2luY2x1ZGUgPHhlbi9odmMtY29uc29sZS5oPgorCisjaW5jbHVkZSAibXVsdGljYWxscy5oIgor I2luY2x1ZGUgIm1tdS5oIgorI2luY2x1ZGUgImRlYnVnZnMuaCIKKworI2lmZGVmIENPTkZJR19Y ODZfMzIKKy8qCisgKiBJZGVudGl0eSBtYXAsIGluIGFkZGl0aW9uIHRvIHBsYWluIGtlcm5lbCBt YXAuICBUaGlzIG5lZWRzIHRvIGJlCisgKiBsYXJnZSBlbm91Z2ggdG8gYWxsb2NhdGUgcGFnZSB0 YWJsZSBwYWdlcyB0byBhbGxvY2F0ZSB0aGUgcmVzdC4KKyAqIEVhY2ggcGFnZSBjYW4gbWFwIDJN Qi4KKyAqLworI2RlZmluZSBMRVZFTDFfSURFTlRfRU5UUklFUwkoUFRSU19QRVJfUFRFICogNCkK K3N0YXRpYyBSRVNFUlZFX0JSS19BUlJBWShwdGVfdCwgbGV2ZWwxX2lkZW50X3BndCwgTEVWRUwx X0lERU5UX0VOVFJJRVMpOworI2VuZGlmCisjaWZkZWYgQ09ORklHX1g4Nl82NAorLyogbDMgcHVk IGZvciB1c2Vyc3BhY2UgdnN5c2NhbGwgbWFwcGluZyAqLworc3RhdGljIHB1ZF90IGxldmVsM191 c2VyX3ZzeXNjYWxsW1BUUlNfUEVSX1BVRF0gX19wYWdlX2FsaWduZWRfYnNzOworI2VuZGlmIC8q IENPTkZJR19YODZfNjQgKi8KKworLyoKKyAqIE5vdGUgYWJvdXQgY3IzIChwYWdldGFibGUgYmFz ZSkgdmFsdWVzOgorICoKKyAqIHhlbl9jcjMgY29udGFpbnMgdGhlIGN1cnJlbnQgbG9naWNhbCBj cjMgdmFsdWU7IGl0IGNvbnRhaW5zIHRoZQorICogbGFzdCBzZXQgY3IzLiAgVGhpcyBtYXkgbm90 IGJlIHRoZSBjdXJyZW50IGVmZmVjdGl2ZSBjcjMsIGJlY2F1c2UKKyAqIGl0cyB1cGRhdGUgbWF5 IGJlIGJlaW5nIGxhemlseSBkZWZlcnJlZC4gIEhvd2V2ZXIsIGEgdmNwdSBsb29raW5nCisgKiBh dCBpdHMgb3duIGNyMyBjYW4gdXNlIHRoaXMgdmFsdWUga25vd2luZyB0aGF0IGl0IGV2ZXJ5dGhp bmcgd2lsbAorICogYmUgc2VsZi1jb25zaXN0ZW50LgorICoKKyAqIHhlbl9jdXJyZW50X2NyMyBj b250YWlucyB0aGUgYWN0dWFsIHZjcHUgY3IzOyBpdCBpcyBzZXQgb25jZSB0aGUKKyAqIGh5cGVy Y2FsbCB0byBzZXQgdGhlIHZjcHUgY3IzIGlzIGNvbXBsZXRlIChzbyBpdCBtYXkgYmUgYSBsaXR0 bGUKKyAqIG91dCBvZiBkYXRlLCBidXQgaXQgd2lsbCBuZXZlciBiZSBzZXQgZWFybHkpLiAgSWYg b25lIHZjcHUgaXMKKyAqIGxvb2tpbmcgYXQgYW5vdGhlciB2Y3B1J3MgY3IzIHZhbHVlLCBpdCBz aG91bGQgdXNlIHRoaXMgdmFyaWFibGUuCisgKi8KK0RFRklORV9QRVJfQ1BVKHVuc2lnbmVkIGxv bmcsIHhlbl9jcjMpOwkgLyogY3IzIHN0b3JlZCBhcyBwaHlzYWRkciAqLworREVGSU5FX1BFUl9D UFUodW5zaWduZWQgbG9uZywgeGVuX2N1cnJlbnRfY3IzKTsJIC8qIGFjdHVhbCB2Y3B1IGNyMyAq LworCitzdGF0aWMgcGh5c19hZGRyX3QgeGVuX3B0X2Jhc2UsIHhlbl9wdF9zaXplIF9faW5pdGRh dGE7CisKKy8qCisgKiBKdXN0IGJleW9uZCB0aGUgaGlnaGVzdCB1c2VybW9kZSBhZGRyZXNzLiAg U1RBQ0tfVE9QX01BWCBoYXMgYQorICogcmVkem9uZSBhYm92ZSBpdCwgc28gcm91bmQgaXQgdXAg dG8gYSBQR0QgYm91bmRhcnkuCisgKi8KKyNkZWZpbmUgVVNFUl9MSU1JVAkoKFNUQUNLX1RPUF9N QVggKyBQR0RJUl9TSVpFIC0gMSkgJiBQR0RJUl9NQVNLKQorCit2b2lkIG1ha2VfbG93bWVtX3Bh Z2VfcmVhZG9ubHkodm9pZCAqdmFkZHIpCit7CisJcHRlX3QgKnB0ZSwgcHRldjsKKwl1bnNpZ25l ZCBsb25nIGFkZHJlc3MgPSAodW5zaWduZWQgbG9uZyl2YWRkcjsKKwl1bnNpZ25lZCBpbnQgbGV2 ZWw7CisKKwlwdGUgPSBsb29rdXBfYWRkcmVzcyhhZGRyZXNzLCAmbGV2ZWwpOworCWlmIChwdGUg PT0gTlVMTCkKKwkJcmV0dXJuOwkJLyogdmFkZHIgbWlzc2luZyAqLworCisJcHRldiA9IHB0ZV93 cnByb3RlY3QoKnB0ZSk7CisKKwlpZiAoSFlQRVJWSVNPUl91cGRhdGVfdmFfbWFwcGluZyhhZGRy ZXNzLCBwdGV2LCAwKSkKKwkJQlVHKCk7Cit9CisKK3ZvaWQgbWFrZV9sb3dtZW1fcGFnZV9yZWFk d3JpdGUodm9pZCAqdmFkZHIpCit7CisJcHRlX3QgKnB0ZSwgcHRldjsKKwl1bnNpZ25lZCBsb25n IGFkZHJlc3MgPSAodW5zaWduZWQgbG9uZyl2YWRkcjsKKwl1bnNpZ25lZCBpbnQgbGV2ZWw7CisK KwlwdGUgPSBsb29rdXBfYWRkcmVzcyhhZGRyZXNzLCAmbGV2ZWwpOworCWlmIChwdGUgPT0gTlVM TCkKKwkJcmV0dXJuOwkJLyogdmFkZHIgbWlzc2luZyAqLworCisJcHRldiA9IHB0ZV9ta3dyaXRl KCpwdGUpOworCisJaWYgKEhZUEVSVklTT1JfdXBkYXRlX3ZhX21hcHBpbmcoYWRkcmVzcywgcHRl diwgMCkpCisJCUJVRygpOworfQorCisKK3N0YXRpYyBib29sIHhlbl9wYWdlX3Bpbm5lZCh2b2lk ICpwdHIpCit7CisJc3RydWN0IHBhZ2UgKnBhZ2UgPSB2aXJ0X3RvX3BhZ2UocHRyKTsKKworCXJl dHVybiBQYWdlUGlubmVkKHBhZ2UpOworfQorCit2b2lkIHhlbl9zZXRfZG9tYWluX3B0ZShwdGVf dCAqcHRlcCwgcHRlX3QgcHRldmFsLCB1bnNpZ25lZCBkb21pZCkKK3sKKwlzdHJ1Y3QgbXVsdGlj YWxsX3NwYWNlIG1jczsKKwlzdHJ1Y3QgbW11X3VwZGF0ZSAqdTsKKworCXRyYWNlX3hlbl9tbXVf c2V0X2RvbWFpbl9wdGUocHRlcCwgcHRldmFsLCBkb21pZCk7CisKKwltY3MgPSB4ZW5fbWNfZW50 cnkoc2l6ZW9mKCp1KSk7CisJdSA9IG1jcy5hcmdzOworCisJLyogcHRlcCBtaWdodCBiZSBrbWFw cGVkIHdoZW4gdXNpbmcgMzItYml0IEhJR0hQVEUgKi8KKwl1LT5wdHIgPSB2aXJ0X3RvX21hY2hp bmUocHRlcCkubWFkZHI7CisJdS0+dmFsID0gcHRlX3ZhbF9tYShwdGV2YWwpOworCisJTVVMVElf bW11X3VwZGF0ZShtY3MubWMsIG1jcy5hcmdzLCAxLCBOVUxMLCBkb21pZCk7CisKKwl4ZW5fbWNf aXNzdWUoUEFSQVZJUlRfTEFaWV9NTVUpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoeGVuX3NldF9k b21haW5fcHRlKTsKKworc3RhdGljIHZvaWQgeGVuX2V4dGVuZF9tbXVfdXBkYXRlKGNvbnN0IHN0 cnVjdCBtbXVfdXBkYXRlICp1cGRhdGUpCit7CisJc3RydWN0IG11bHRpY2FsbF9zcGFjZSBtY3M7 CisJc3RydWN0IG1tdV91cGRhdGUgKnU7CisKKwltY3MgPSB4ZW5fbWNfZXh0ZW5kX2FyZ3MoX19I WVBFUlZJU09SX21tdV91cGRhdGUsIHNpemVvZigqdSkpOworCisJaWYgKG1jcy5tYyAhPSBOVUxM KSB7CisJCW1jcy5tYy0+YXJnc1sxXSsrOworCX0gZWxzZSB7CisJCW1jcyA9IF9feGVuX21jX2Vu dHJ5KHNpemVvZigqdSkpOworCQlNVUxUSV9tbXVfdXBkYXRlKG1jcy5tYywgbWNzLmFyZ3MsIDEs IE5VTEwsIERPTUlEX1NFTEYpOworCX0KKworCXUgPSBtY3MuYXJnczsKKwkqdSA9ICp1cGRhdGU7 Cit9CisKK3N0YXRpYyB2b2lkIHhlbl9leHRlbmRfbW11ZXh0X29wKGNvbnN0IHN0cnVjdCBtbXVl eHRfb3AgKm9wKQoreworCXN0cnVjdCBtdWx0aWNhbGxfc3BhY2UgbWNzOworCXN0cnVjdCBtbXVl eHRfb3AgKnU7CisKKwltY3MgPSB4ZW5fbWNfZXh0ZW5kX2FyZ3MoX19IWVBFUlZJU09SX21tdWV4 dF9vcCwgc2l6ZW9mKCp1KSk7CisKKwlpZiAobWNzLm1jICE9IE5VTEwpIHsKKwkJbWNzLm1jLT5h cmdzWzFdKys7CisJfSBlbHNlIHsKKwkJbWNzID0gX194ZW5fbWNfZW50cnkoc2l6ZW9mKCp1KSk7 CisJCU1VTFRJX21tdWV4dF9vcChtY3MubWMsIG1jcy5hcmdzLCAxLCBOVUxMLCBET01JRF9TRUxG KTsKKwl9CisKKwl1ID0gbWNzLmFyZ3M7CisJKnUgPSAqb3A7Cit9CisKK3N0YXRpYyB2b2lkIHhl bl9zZXRfcG1kX2h5cGVyKHBtZF90ICpwdHIsIHBtZF90IHZhbCkKK3sKKwlzdHJ1Y3QgbW11X3Vw ZGF0ZSB1OworCisJcHJlZW1wdF9kaXNhYmxlKCk7CisKKwl4ZW5fbWNfYmF0Y2goKTsKKworCS8q IHB0ciBtYXkgYmUgaW9yZW1hcHBlZCBmb3IgNjQtYml0IHBhZ2V0YWJsZSBzZXR1cCAqLworCXUu cHRyID0gYXJiaXRyYXJ5X3ZpcnRfdG9fbWFjaGluZShwdHIpLm1hZGRyOworCXUudmFsID0gcG1k X3ZhbF9tYSh2YWwpOworCXhlbl9leHRlbmRfbW11X3VwZGF0ZSgmdSk7CisKKwl4ZW5fbWNfaXNz dWUoUEFSQVZJUlRfTEFaWV9NTVUpOworCisJcHJlZW1wdF9lbmFibGUoKTsKK30KKworc3RhdGlj IHZvaWQgeGVuX3NldF9wbWQocG1kX3QgKnB0ciwgcG1kX3QgdmFsKQoreworCXRyYWNlX3hlbl9t bXVfc2V0X3BtZChwdHIsIHZhbCk7CisKKwkvKiBJZiBwYWdlIGlzIG5vdCBwaW5uZWQsIHdlIGNh biBqdXN0IHVwZGF0ZSB0aGUgZW50cnkKKwkgICBkaXJlY3RseSAqLworCWlmICgheGVuX3BhZ2Vf cGlubmVkKHB0cikpIHsKKwkJKnB0ciA9IHZhbDsKKwkJcmV0dXJuOworCX0KKworCXhlbl9zZXRf cG1kX2h5cGVyKHB0ciwgdmFsKTsKK30KKworLyoKKyAqIEFzc29jaWF0ZSBhIHZpcnR1YWwgcGFn ZSBmcmFtZSB3aXRoIGEgZ2l2ZW4gcGh5c2ljYWwgcGFnZSBmcmFtZQorICogYW5kIHByb3RlY3Rp b24gZmxhZ3MgZm9yIHRoYXQgZnJhbWUuCisgKi8KK3ZvaWQgc2V0X3B0ZV9tZm4odW5zaWduZWQg bG9uZyB2YWRkciwgdW5zaWduZWQgbG9uZyBtZm4sIHBncHJvdF90IGZsYWdzKQoreworCXNldF9w dGVfdmFkZHIodmFkZHIsIG1mbl9wdGUobWZuLCBmbGFncykpOworfQorCitzdGF0aWMgYm9vbCB4 ZW5fYmF0Y2hlZF9zZXRfcHRlKHB0ZV90ICpwdGVwLCBwdGVfdCBwdGV2YWwpCit7CisJc3RydWN0 IG1tdV91cGRhdGUgdTsKKworCWlmIChwYXJhdmlydF9nZXRfbGF6eV9tb2RlKCkgIT0gUEFSQVZJ UlRfTEFaWV9NTVUpCisJCXJldHVybiBmYWxzZTsKKworCXhlbl9tY19iYXRjaCgpOworCisJdS5w dHIgPSB2aXJ0X3RvX21hY2hpbmUocHRlcCkubWFkZHIgfCBNTVVfTk9STUFMX1BUX1VQREFURTsK Kwl1LnZhbCA9IHB0ZV92YWxfbWEocHRldmFsKTsKKwl4ZW5fZXh0ZW5kX21tdV91cGRhdGUoJnUp OworCisJeGVuX21jX2lzc3VlKFBBUkFWSVJUX0xBWllfTU1VKTsKKworCXJldHVybiB0cnVlOwor fQorCitzdGF0aWMgaW5saW5lIHZvaWQgX194ZW5fc2V0X3B0ZShwdGVfdCAqcHRlcCwgcHRlX3Qg cHRldmFsKQoreworCWlmICgheGVuX2JhdGNoZWRfc2V0X3B0ZShwdGVwLCBwdGV2YWwpKSB7CisJ CS8qCisJCSAqIENvdWxkIGNhbGwgbmF0aXZlX3NldF9wdGUoKSBoZXJlIGFuZCB0cmFwIGFuZAor CQkgKiBlbXVsYXRlIHRoZSBQVEUgd3JpdGUgYnV0IHdpdGggMzItYml0IGd1ZXN0cyB0aGlzCisJ CSAqIG5lZWRzIHR3byB0cmFwcyAob25lIGZvciBlYWNoIG9mIHRoZSB0d28gMzItYml0CisJCSAq IHdvcmRzIGluIHRoZSBQVEUpIHNvIGRvIG9uZSBoeXBlcmNhbGwgZGlyZWN0bHkKKwkJICogaW5z dGVhZC4KKwkJICovCisJCXN0cnVjdCBtbXVfdXBkYXRlIHU7CisKKwkJdS5wdHIgPSB2aXJ0X3Rv X21hY2hpbmUocHRlcCkubWFkZHIgfCBNTVVfTk9STUFMX1BUX1VQREFURTsKKwkJdS52YWwgPSBw dGVfdmFsX21hKHB0ZXZhbCk7CisJCUhZUEVSVklTT1JfbW11X3VwZGF0ZSgmdSwgMSwgTlVMTCwg RE9NSURfU0VMRik7CisJfQorfQorCitzdGF0aWMgdm9pZCB4ZW5fc2V0X3B0ZShwdGVfdCAqcHRl cCwgcHRlX3QgcHRldmFsKQoreworCXRyYWNlX3hlbl9tbXVfc2V0X3B0ZShwdGVwLCBwdGV2YWwp OworCV9feGVuX3NldF9wdGUocHRlcCwgcHRldmFsKTsKK30KKworc3RhdGljIHZvaWQgeGVuX3Nl dF9wdGVfYXQoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgYWRkciwKKwkJICAg IHB0ZV90ICpwdGVwLCBwdGVfdCBwdGV2YWwpCit7CisJdHJhY2VfeGVuX21tdV9zZXRfcHRlX2F0 KG1tLCBhZGRyLCBwdGVwLCBwdGV2YWwpOworCV9feGVuX3NldF9wdGUocHRlcCwgcHRldmFsKTsK K30KKworcHRlX3QgeGVuX3B0ZXBfbW9kaWZ5X3Byb3Rfc3RhcnQoc3RydWN0IG1tX3N0cnVjdCAq bW0sCisJCQkJIHVuc2lnbmVkIGxvbmcgYWRkciwgcHRlX3QgKnB0ZXApCit7CisJLyogSnVzdCBy ZXR1cm4gdGhlIHB0ZSBhcy1pcy4gIFdlIHByZXNlcnZlIHRoZSBiaXRzIG9uIGNvbW1pdCAqLwor CXRyYWNlX3hlbl9tbXVfcHRlcF9tb2RpZnlfcHJvdF9zdGFydChtbSwgYWRkciwgcHRlcCwgKnB0 ZXApOworCXJldHVybiAqcHRlcDsKK30KKwordm9pZCB4ZW5fcHRlcF9tb2RpZnlfcHJvdF9jb21t aXQoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgYWRkciwKKwkJCQkgcHRlX3Qg KnB0ZXAsIHB0ZV90IHB0ZSkKK3sKKwlzdHJ1Y3QgbW11X3VwZGF0ZSB1OworCisJdHJhY2VfeGVu X21tdV9wdGVwX21vZGlmeV9wcm90X2NvbW1pdChtbSwgYWRkciwgcHRlcCwgcHRlKTsKKwl4ZW5f bWNfYmF0Y2goKTsKKworCXUucHRyID0gdmlydF90b19tYWNoaW5lKHB0ZXApLm1hZGRyIHwgTU1V X1BUX1VQREFURV9QUkVTRVJWRV9BRDsKKwl1LnZhbCA9IHB0ZV92YWxfbWEocHRlKTsKKwl4ZW5f ZXh0ZW5kX21tdV91cGRhdGUoJnUpOworCisJeGVuX21jX2lzc3VlKFBBUkFWSVJUX0xBWllfTU1V KTsKK30KKworLyogQXNzdW1lIHB0ZXZhbF90IGlzIGVxdWl2YWxlbnQgdG8gYWxsIHRoZSBvdGhl ciAqdmFsX3QgdHlwZXMuICovCitzdGF0aWMgcHRldmFsX3QgcHRlX21mbl90b19wZm4ocHRldmFs X3QgdmFsKQoreworCWlmICh2YWwgJiBfUEFHRV9QUkVTRU5UKSB7CisJCXVuc2lnbmVkIGxvbmcg bWZuID0gKHZhbCAmIFBURV9QRk5fTUFTSykgPj4gUEFHRV9TSElGVDsKKwkJdW5zaWduZWQgbG9u ZyBwZm4gPSBtZm5fdG9fcGZuKG1mbik7CisKKwkJcHRldmFsX3QgZmxhZ3MgPSB2YWwgJiBQVEVf RkxBR1NfTUFTSzsKKwkJaWYgKHVubGlrZWx5KHBmbiA9PSB+MCkpCisJCQl2YWwgPSBmbGFncyAm IH5fUEFHRV9QUkVTRU5UOworCQllbHNlCisJCQl2YWwgPSAoKHB0ZXZhbF90KXBmbiA8PCBQQUdF X1NISUZUKSB8IGZsYWdzOworCX0KKworCXJldHVybiB2YWw7Cit9CisKK3N0YXRpYyBwdGV2YWxf dCBwdGVfcGZuX3RvX21mbihwdGV2YWxfdCB2YWwpCit7CisJaWYgKHZhbCAmIF9QQUdFX1BSRVNF TlQpIHsKKwkJdW5zaWduZWQgbG9uZyBwZm4gPSAodmFsICYgUFRFX1BGTl9NQVNLKSA+PiBQQUdF X1NISUZUOworCQlwdGV2YWxfdCBmbGFncyA9IHZhbCAmIFBURV9GTEFHU19NQVNLOworCQl1bnNp Z25lZCBsb25nIG1mbjsKKworCQlpZiAoIXhlbl9mZWF0dXJlKFhFTkZFQVRfYXV0b190cmFuc2xh dGVkX3BoeXNtYXApKQorCQkJbWZuID0gX19wZm5fdG9fbWZuKHBmbik7CisJCWVsc2UKKwkJCW1m biA9IHBmbjsKKwkJLyoKKwkJICogSWYgdGhlcmUncyBubyBtZm4gZm9yIHRoZSBwZm4sIHRoZW4g anVzdCBjcmVhdGUgYW4KKwkJICogZW1wdHkgbm9uLXByZXNlbnQgcHRlLiAgVW5mb3J0dW5hdGVs eSB0aGlzIGxvc2VzCisJCSAqIGluZm9ybWF0aW9uIGFib3V0IHRoZSBvcmlnaW5hbCBwZm4sIHNv CisJCSAqIHB0ZV9tZm5fdG9fcGZuIGlzIGFzeW1tZXRyaWMuCisJCSAqLworCQlpZiAodW5saWtl bHkobWZuID09IElOVkFMSURfUDJNX0VOVFJZKSkgeworCQkJbWZuID0gMDsKKwkJCWZsYWdzID0g MDsKKwkJfSBlbHNlCisJCQltZm4gJj0gfihGT1JFSUdOX0ZSQU1FX0JJVCB8IElERU5USVRZX0ZS QU1FX0JJVCk7CisJCXZhbCA9ICgocHRldmFsX3QpbWZuIDw8IFBBR0VfU0hJRlQpIHwgZmxhZ3M7 CisJfQorCisJcmV0dXJuIHZhbDsKK30KKworX192aXNpYmxlIHB0ZXZhbF90IHhlbl9wdGVfdmFs KHB0ZV90IHB0ZSkKK3sKKwlwdGV2YWxfdCBwdGV2YWwgPSBwdGUucHRlOworCisJcmV0dXJuIHB0 ZV9tZm5fdG9fcGZuKHB0ZXZhbCk7Cit9CitQVl9DQUxMRUVfU0FWRV9SRUdTX1RIVU5LKHhlbl9w dGVfdmFsKTsKKworX192aXNpYmxlIHBnZHZhbF90IHhlbl9wZ2RfdmFsKHBnZF90IHBnZCkKK3sK KwlyZXR1cm4gcHRlX21mbl90b19wZm4ocGdkLnBnZCk7Cit9CitQVl9DQUxMRUVfU0FWRV9SRUdT X1RIVU5LKHhlbl9wZ2RfdmFsKTsKKworX192aXNpYmxlIHB0ZV90IHhlbl9tYWtlX3B0ZShwdGV2 YWxfdCBwdGUpCit7CisJcHRlID0gcHRlX3Bmbl90b19tZm4ocHRlKTsKKworCXJldHVybiBuYXRp dmVfbWFrZV9wdGUocHRlKTsKK30KK1BWX0NBTExFRV9TQVZFX1JFR1NfVEhVTksoeGVuX21ha2Vf cHRlKTsKKworX192aXNpYmxlIHBnZF90IHhlbl9tYWtlX3BnZChwZ2R2YWxfdCBwZ2QpCit7CisJ cGdkID0gcHRlX3Bmbl90b19tZm4ocGdkKTsKKwlyZXR1cm4gbmF0aXZlX21ha2VfcGdkKHBnZCk7 Cit9CitQVl9DQUxMRUVfU0FWRV9SRUdTX1RIVU5LKHhlbl9tYWtlX3BnZCk7CisKK19fdmlzaWJs ZSBwbWR2YWxfdCB4ZW5fcG1kX3ZhbChwbWRfdCBwbWQpCit7CisJcmV0dXJuIHB0ZV9tZm5fdG9f cGZuKHBtZC5wbWQpOworfQorUFZfQ0FMTEVFX1NBVkVfUkVHU19USFVOSyh4ZW5fcG1kX3ZhbCk7 CisKK3N0YXRpYyB2b2lkIHhlbl9zZXRfcHVkX2h5cGVyKHB1ZF90ICpwdHIsIHB1ZF90IHZhbCkK K3sKKwlzdHJ1Y3QgbW11X3VwZGF0ZSB1OworCisJcHJlZW1wdF9kaXNhYmxlKCk7CisKKwl4ZW5f bWNfYmF0Y2goKTsKKworCS8qIHB0ciBtYXkgYmUgaW9yZW1hcHBlZCBmb3IgNjQtYml0IHBhZ2V0 YWJsZSBzZXR1cCAqLworCXUucHRyID0gYXJiaXRyYXJ5X3ZpcnRfdG9fbWFjaGluZShwdHIpLm1h ZGRyOworCXUudmFsID0gcHVkX3ZhbF9tYSh2YWwpOworCXhlbl9leHRlbmRfbW11X3VwZGF0ZSgm dSk7CisKKwl4ZW5fbWNfaXNzdWUoUEFSQVZJUlRfTEFaWV9NTVUpOworCisJcHJlZW1wdF9lbmFi bGUoKTsKK30KKworc3RhdGljIHZvaWQgeGVuX3NldF9wdWQocHVkX3QgKnB0ciwgcHVkX3QgdmFs KQoreworCXRyYWNlX3hlbl9tbXVfc2V0X3B1ZChwdHIsIHZhbCk7CisKKwkvKiBJZiBwYWdlIGlz IG5vdCBwaW5uZWQsIHdlIGNhbiBqdXN0IHVwZGF0ZSB0aGUgZW50cnkKKwkgICBkaXJlY3RseSAq LworCWlmICgheGVuX3BhZ2VfcGlubmVkKHB0cikpIHsKKwkJKnB0ciA9IHZhbDsKKwkJcmV0dXJu OworCX0KKworCXhlbl9zZXRfcHVkX2h5cGVyKHB0ciwgdmFsKTsKK30KKworI2lmZGVmIENPTkZJ R19YODZfUEFFCitzdGF0aWMgdm9pZCB4ZW5fc2V0X3B0ZV9hdG9taWMocHRlX3QgKnB0ZXAsIHB0 ZV90IHB0ZSkKK3sKKwl0cmFjZV94ZW5fbW11X3NldF9wdGVfYXRvbWljKHB0ZXAsIHB0ZSk7CisJ c2V0XzY0Yml0KCh1NjQgKilwdGVwLCBuYXRpdmVfcHRlX3ZhbChwdGUpKTsKK30KKworc3RhdGlj IHZvaWQgeGVuX3B0ZV9jbGVhcihzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBh ZGRyLCBwdGVfdCAqcHRlcCkKK3sKKwl0cmFjZV94ZW5fbW11X3B0ZV9jbGVhcihtbSwgYWRkciwg cHRlcCk7CisJaWYgKCF4ZW5fYmF0Y2hlZF9zZXRfcHRlKHB0ZXAsIG5hdGl2ZV9tYWtlX3B0ZSgw KSkpCisJCW5hdGl2ZV9wdGVfY2xlYXIobW0sIGFkZHIsIHB0ZXApOworfQorCitzdGF0aWMgdm9p ZCB4ZW5fcG1kX2NsZWFyKHBtZF90ICpwbWRwKQoreworCXRyYWNlX3hlbl9tbXVfcG1kX2NsZWFy KHBtZHApOworCXNldF9wbWQocG1kcCwgX19wbWQoMCkpOworfQorI2VuZGlmCS8qIENPTkZJR19Y ODZfUEFFICovCisKK19fdmlzaWJsZSBwbWRfdCB4ZW5fbWFrZV9wbWQocG1kdmFsX3QgcG1kKQor eworCXBtZCA9IHB0ZV9wZm5fdG9fbWZuKHBtZCk7CisJcmV0dXJuIG5hdGl2ZV9tYWtlX3BtZChw bWQpOworfQorUFZfQ0FMTEVFX1NBVkVfUkVHU19USFVOSyh4ZW5fbWFrZV9wbWQpOworCisjaWYg Q09ORklHX1BHVEFCTEVfTEVWRUxTID09IDQKK19fdmlzaWJsZSBwdWR2YWxfdCB4ZW5fcHVkX3Zh bChwdWRfdCBwdWQpCit7CisJcmV0dXJuIHB0ZV9tZm5fdG9fcGZuKHB1ZC5wdWQpOworfQorUFZf Q0FMTEVFX1NBVkVfUkVHU19USFVOSyh4ZW5fcHVkX3ZhbCk7CisKK19fdmlzaWJsZSBwdWRfdCB4 ZW5fbWFrZV9wdWQocHVkdmFsX3QgcHVkKQoreworCXB1ZCA9IHB0ZV9wZm5fdG9fbWZuKHB1ZCk7 CisKKwlyZXR1cm4gbmF0aXZlX21ha2VfcHVkKHB1ZCk7Cit9CitQVl9DQUxMRUVfU0FWRV9SRUdT X1RIVU5LKHhlbl9tYWtlX3B1ZCk7CisKK3N0YXRpYyBwZ2RfdCAqeGVuX2dldF91c2VyX3BnZChw Z2RfdCAqcGdkKQoreworCXBnZF90ICpwZ2RfcGFnZSA9IChwZ2RfdCAqKSgoKHVuc2lnbmVkIGxv bmcpcGdkKSAmIFBBR0VfTUFTSyk7CisJdW5zaWduZWQgb2Zmc2V0ID0gcGdkIC0gcGdkX3BhZ2U7 CisJcGdkX3QgKnVzZXJfcHRyID0gTlVMTDsKKworCWlmIChvZmZzZXQgPCBwZ2RfaW5kZXgoVVNF Ul9MSU1JVCkpIHsKKwkJc3RydWN0IHBhZ2UgKnBhZ2UgPSB2aXJ0X3RvX3BhZ2UocGdkX3BhZ2Up OworCQl1c2VyX3B0ciA9IChwZ2RfdCAqKXBhZ2UtPnByaXZhdGU7CisJCWlmICh1c2VyX3B0cikK KwkJCXVzZXJfcHRyICs9IG9mZnNldDsKKwl9CisKKwlyZXR1cm4gdXNlcl9wdHI7Cit9CisKK3N0 YXRpYyB2b2lkIF9feGVuX3NldF9wZ2RfaHlwZXIocGdkX3QgKnB0ciwgcGdkX3QgdmFsKQorewor CXN0cnVjdCBtbXVfdXBkYXRlIHU7CisKKwl1LnB0ciA9IHZpcnRfdG9fbWFjaGluZShwdHIpLm1h ZGRyOworCXUudmFsID0gcGdkX3ZhbF9tYSh2YWwpOworCXhlbl9leHRlbmRfbW11X3VwZGF0ZSgm dSk7Cit9CisKKy8qCisgKiBSYXcgaHlwZXJjYWxsLWJhc2VkIHNldF9wZ2QsIGludGVuZGVkIGZv ciBpbiBlYXJseSBib290IGJlZm9yZQorICogdGhlcmUncyBhIHBhZ2Ugc3RydWN0dXJlLiAgVGhp cyBpbXBsaWVzOgorICogIDEuIFRoZSBvbmx5IGV4aXN0aW5nIHBhZ2V0YWJsZSBpcyB0aGUga2Vy bmVsJ3MKKyAqICAyLiBJdCBpcyBhbHdheXMgcGlubmVkCisgKiAgMy4gSXQgaGFzIG5vIHVzZXIg cGFnZXRhYmxlIGF0dGFjaGVkIHRvIGl0CisgKi8KK3N0YXRpYyB2b2lkIF9faW5pdCB4ZW5fc2V0 X3BnZF9oeXBlcihwZ2RfdCAqcHRyLCBwZ2RfdCB2YWwpCit7CisJcHJlZW1wdF9kaXNhYmxlKCk7 CisKKwl4ZW5fbWNfYmF0Y2goKTsKKworCV9feGVuX3NldF9wZ2RfaHlwZXIocHRyLCB2YWwpOwor CisJeGVuX21jX2lzc3VlKFBBUkFWSVJUX0xBWllfTU1VKTsKKworCXByZWVtcHRfZW5hYmxlKCk7 Cit9CisKK3N0YXRpYyB2b2lkIHhlbl9zZXRfcGdkKHBnZF90ICpwdHIsIHBnZF90IHZhbCkKK3sK KwlwZ2RfdCAqdXNlcl9wdHIgPSB4ZW5fZ2V0X3VzZXJfcGdkKHB0cik7CisKKwl0cmFjZV94ZW5f bW11X3NldF9wZ2QocHRyLCB1c2VyX3B0ciwgdmFsKTsKKworCS8qIElmIHBhZ2UgaXMgbm90IHBp bm5lZCwgd2UgY2FuIGp1c3QgdXBkYXRlIHRoZSBlbnRyeQorCSAgIGRpcmVjdGx5ICovCisJaWYg KCF4ZW5fcGFnZV9waW5uZWQocHRyKSkgeworCQkqcHRyID0gdmFsOworCQlpZiAodXNlcl9wdHIp IHsKKwkJCVdBUk5fT04oeGVuX3BhZ2VfcGlubmVkKHVzZXJfcHRyKSk7CisJCQkqdXNlcl9wdHIg PSB2YWw7CisJCX0KKwkJcmV0dXJuOworCX0KKworCS8qIElmIGl0J3MgcGlubmVkLCB0aGVuIHdl IGNhbiBhdCBsZWFzdCBiYXRjaCB0aGUga2VybmVsIGFuZAorCSAgIHVzZXIgdXBkYXRlcyB0b2dl dGhlci4gKi8KKwl4ZW5fbWNfYmF0Y2goKTsKKworCV9feGVuX3NldF9wZ2RfaHlwZXIocHRyLCB2 YWwpOworCWlmICh1c2VyX3B0cikKKwkJX194ZW5fc2V0X3BnZF9oeXBlcih1c2VyX3B0ciwgdmFs KTsKKworCXhlbl9tY19pc3N1ZShQQVJBVklSVF9MQVpZX01NVSk7Cit9CisjZW5kaWYJLyogQ09O RklHX1BHVEFCTEVfTEVWRUxTID09IDQgKi8KKworLyoKKyAqIChZZXQgYW5vdGhlcikgcGFnZXRh YmxlIHdhbGtlci4gIFRoaXMgb25lIGlzIGludGVuZGVkIGZvciBwaW5uaW5nIGEKKyAqIHBhZ2V0 YWJsZS4gIFRoaXMgbWVhbnMgdGhhdCBpdCB3YWxrcyBhIHBhZ2V0YWJsZSBhbmQgY2FsbHMgdGhl CisgKiBjYWxsYmFjayBmdW5jdGlvbiBvbiBlYWNoIHBhZ2UgaXQgZmluZHMgbWFraW5nIHVwIHRo ZSBwYWdlIHRhYmxlLAorICogYXQgZXZlcnkgbGV2ZWwuICBJdCB3YWxrcyB0aGUgZW50aXJlIHBh Z2V0YWJsZSwgYnV0IGl0IG9ubHkgYm90aGVycworICogcGlubmluZyBwdGUgcGFnZXMgd2hpY2gg YXJlIGJlbG93IGxpbWl0LiAgSW4gdGhlIG5vcm1hbCBjYXNlIHRoaXMKKyAqIHdpbGwgYmUgU1RB Q0tfVE9QX01BWCwgYnV0IGF0IGJvb3Qgd2UgbmVlZCB0byBwaW4gdXAgdG8KKyAqIEZJWEFERFJf VE9QLgorICoKKyAqIEZvciAzMi1iaXQgdGhlIGltcG9ydGFudCBiaXQgaXMgdGhhdCB3ZSBkb24n dCBwaW4gYmV5b25kIHRoZXJlLAorICogYmVjYXVzZSB0aGVuIHdlIHN0YXJ0IGdldHRpbmcgaW50 byBYZW4ncyBwdGVzLgorICoKKyAqIEZvciA2NC1iaXQsIHdlIG11c3Qgc2tpcCB0aGUgWGVuIGhv bGUgaW4gdGhlIG1pZGRsZSBvZiB0aGUgYWRkcmVzcworICogc3BhY2UsIGp1c3QgYWZ0ZXIgdGhl IGJpZyB4ODYtNjQgdmlydHVhbCBob2xlLgorICovCitzdGF0aWMgaW50IF9feGVuX3BnZF93YWxr KHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCBwZ2RfdCAqcGdkLAorCQkJICBpbnQgKCpmdW5jKShzdHJ1 Y3QgbW1fc3RydWN0ICptbSwgc3RydWN0IHBhZ2UgKiwKKwkJCQkgICAgICBlbnVtIHB0X2xldmVs KSwKKwkJCSAgdW5zaWduZWQgbG9uZyBsaW1pdCkKK3sKKwlpbnQgZmx1c2ggPSAwOworCXVuc2ln bmVkIGhvbGVfbG93LCBob2xlX2hpZ2g7CisJdW5zaWduZWQgcGdkaWR4X2xpbWl0LCBwdWRpZHhf bGltaXQsIHBtZGlkeF9saW1pdDsKKwl1bnNpZ25lZCBwZ2RpZHgsIHB1ZGlkeCwgcG1kaWR4Owor CisJLyogVGhlIGxpbWl0IGlzIHRoZSBsYXN0IGJ5dGUgdG8gYmUgdG91Y2hlZCAqLworCWxpbWl0 LS07CisJQlVHX09OKGxpbWl0ID49IEZJWEFERFJfVE9QKTsKKworCWlmICh4ZW5fZmVhdHVyZShY RU5GRUFUX2F1dG9fdHJhbnNsYXRlZF9waHlzbWFwKSkKKwkJcmV0dXJuIDA7CisKKwkvKgorCSAq IDY0LWJpdCBoYXMgYSBncmVhdCBiaWcgaG9sZSBpbiB0aGUgbWlkZGxlIG9mIHRoZSBhZGRyZXNz CisJICogc3BhY2UsIHdoaWNoIGNvbnRhaW5zIHRoZSBYZW4gbWFwcGluZ3MuICBPbiAzMi1iaXQg dGhlc2UKKwkgKiB3aWxsIGVuZCB1cCBtYWtpbmcgYSB6ZXJvLXNpemVkIGhvbGUgYW5kIHNvIGlz IGEgbm8tb3AuCisJICovCisJaG9sZV9sb3cgPSBwZ2RfaW5kZXgoVVNFUl9MSU1JVCk7CisJaG9s ZV9oaWdoID0gcGdkX2luZGV4KFBBR0VfT0ZGU0VUKTsKKworCXBnZGlkeF9saW1pdCA9IHBnZF9p bmRleChsaW1pdCk7CisjaWYgUFRSU19QRVJfUFVEID4gMQorCXB1ZGlkeF9saW1pdCA9IHB1ZF9p bmRleChsaW1pdCk7CisjZWxzZQorCXB1ZGlkeF9saW1pdCA9IDA7CisjZW5kaWYKKyNpZiBQVFJT X1BFUl9QTUQgPiAxCisJcG1kaWR4X2xpbWl0ID0gcG1kX2luZGV4KGxpbWl0KTsKKyNlbHNlCisJ cG1kaWR4X2xpbWl0ID0gMDsKKyNlbmRpZgorCisJZm9yIChwZ2RpZHggPSAwOyBwZ2RpZHggPD0g cGdkaWR4X2xpbWl0OyBwZ2RpZHgrKykgeworCQlwdWRfdCAqcHVkOworCisJCWlmIChwZ2RpZHgg Pj0gaG9sZV9sb3cgJiYgcGdkaWR4IDwgaG9sZV9oaWdoKQorCQkJY29udGludWU7CisKKwkJaWYg KCFwZ2RfdmFsKHBnZFtwZ2RpZHhdKSkKKwkJCWNvbnRpbnVlOworCisJCXB1ZCA9IHB1ZF9vZmZz ZXQoJnBnZFtwZ2RpZHhdLCAwKTsKKworCQlpZiAoUFRSU19QRVJfUFVEID4gMSkgLyogbm90IGZv bGRlZCAqLworCQkJZmx1c2ggfD0gKCpmdW5jKShtbSwgdmlydF90b19wYWdlKHB1ZCksIFBUX1BV RCk7CisKKwkJZm9yIChwdWRpZHggPSAwOyBwdWRpZHggPCBQVFJTX1BFUl9QVUQ7IHB1ZGlkeCsr KSB7CisJCQlwbWRfdCAqcG1kOworCisJCQlpZiAocGdkaWR4ID09IHBnZGlkeF9saW1pdCAmJgor CQkJICAgIHB1ZGlkeCA+IHB1ZGlkeF9saW1pdCkKKwkJCQlnb3RvIG91dDsKKworCQkJaWYgKHB1 ZF9ub25lKHB1ZFtwdWRpZHhdKSkKKwkJCQljb250aW51ZTsKKworCQkJcG1kID0gcG1kX29mZnNl dCgmcHVkW3B1ZGlkeF0sIDApOworCisJCQlpZiAoUFRSU19QRVJfUE1EID4gMSkgLyogbm90IGZv bGRlZCAqLworCQkJCWZsdXNoIHw9ICgqZnVuYykobW0sIHZpcnRfdG9fcGFnZShwbWQpLCBQVF9Q TUQpOworCisJCQlmb3IgKHBtZGlkeCA9IDA7IHBtZGlkeCA8IFBUUlNfUEVSX1BNRDsgcG1kaWR4 KyspIHsKKwkJCQlzdHJ1Y3QgcGFnZSAqcHRlOworCisJCQkJaWYgKHBnZGlkeCA9PSBwZ2RpZHhf bGltaXQgJiYKKwkJCQkgICAgcHVkaWR4ID09IHB1ZGlkeF9saW1pdCAmJgorCQkJCSAgICBwbWRp ZHggPiBwbWRpZHhfbGltaXQpCisJCQkJCWdvdG8gb3V0OworCisJCQkJaWYgKHBtZF9ub25lKHBt ZFtwbWRpZHhdKSkKKwkJCQkJY29udGludWU7CisKKwkJCQlwdGUgPSBwbWRfcGFnZShwbWRbcG1k aWR4XSk7CisJCQkJZmx1c2ggfD0gKCpmdW5jKShtbSwgcHRlLCBQVF9QVEUpOworCQkJfQorCQl9 CisJfQorCitvdXQ6CisJLyogRG8gdGhlIHRvcCBsZXZlbCBsYXN0LCBzbyB0aGF0IHRoZSBjYWxs YmFja3MgY2FuIHVzZSBpdCBhcworCSAgIGEgY3VlIHRvIGRvIGZpbmFsIHRoaW5ncyBsaWtlIHRs YiBmbHVzaGVzLiAqLworCWZsdXNoIHw9ICgqZnVuYykobW0sIHZpcnRfdG9fcGFnZShwZ2QpLCBQ VF9QR0QpOworCisJcmV0dXJuIGZsdXNoOworfQorCitzdGF0aWMgaW50IHhlbl9wZ2Rfd2Fsayhz dHJ1Y3QgbW1fc3RydWN0ICptbSwKKwkJCWludCAoKmZ1bmMpKHN0cnVjdCBtbV9zdHJ1Y3QgKm1t LCBzdHJ1Y3QgcGFnZSAqLAorCQkJCSAgICBlbnVtIHB0X2xldmVsKSwKKwkJCXVuc2lnbmVkIGxv bmcgbGltaXQpCit7CisJcmV0dXJuIF9feGVuX3BnZF93YWxrKG1tLCBtbS0+cGdkLCBmdW5jLCBs aW1pdCk7Cit9CisKKy8qIElmIHdlJ3JlIHVzaW5nIHNwbGl0IHB0ZSBsb2NrcywgdGhlbiB0YWtl IHRoZSBwYWdlJ3MgbG9jayBhbmQKKyAgIHJldHVybiBhIHBvaW50ZXIgdG8gaXQuICBPdGhlcndp c2UgcmV0dXJuIE5VTEwuICovCitzdGF0aWMgc3BpbmxvY2tfdCAqeGVuX3B0ZV9sb2NrKHN0cnVj dCBwYWdlICpwYWdlLCBzdHJ1Y3QgbW1fc3RydWN0ICptbSkKK3sKKwlzcGlubG9ja190ICpwdGwg PSBOVUxMOworCisjaWYgVVNFX1NQTElUX1BURV9QVExPQ0tTCisJcHRsID0gcHRsb2NrX3B0cihw YWdlKTsKKwlzcGluX2xvY2tfbmVzdF9sb2NrKHB0bCwgJm1tLT5wYWdlX3RhYmxlX2xvY2spOwor I2VuZGlmCisKKwlyZXR1cm4gcHRsOworfQorCitzdGF0aWMgdm9pZCB4ZW5fcHRlX3VubG9jayh2 b2lkICp2KQoreworCXNwaW5sb2NrX3QgKnB0bCA9IHY7CisJc3Bpbl91bmxvY2socHRsKTsKK30K Kworc3RhdGljIHZvaWQgeGVuX2RvX3Bpbih1bnNpZ25lZCBsZXZlbCwgdW5zaWduZWQgbG9uZyBw Zm4pCit7CisJc3RydWN0IG1tdWV4dF9vcCBvcDsKKworCW9wLmNtZCA9IGxldmVsOworCW9wLmFy ZzEubWZuID0gcGZuX3RvX21mbihwZm4pOworCisJeGVuX2V4dGVuZF9tbXVleHRfb3AoJm9wKTsK K30KKworc3RhdGljIGludCB4ZW5fcGluX3BhZ2Uoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHN0cnVj dCBwYWdlICpwYWdlLAorCQkJZW51bSBwdF9sZXZlbCBsZXZlbCkKK3sKKwl1bnNpZ25lZCBwZ2Zs ID0gVGVzdFNldFBhZ2VQaW5uZWQocGFnZSk7CisJaW50IGZsdXNoOworCisJaWYgKHBnZmwpCisJ CWZsdXNoID0gMDsJCS8qIGFscmVhZHkgcGlubmVkICovCisJZWxzZSBpZiAoUGFnZUhpZ2hNZW0o cGFnZSkpCisJCS8qIGttYXBzIG5lZWQgZmx1c2hpbmcgaWYgd2UgZm91bmQgYW4gdW5waW5uZWQK KwkJICAgaGlnaHBhZ2UgKi8KKwkJZmx1c2ggPSAxOworCWVsc2UgeworCQl2b2lkICpwdCA9IGxv d21lbV9wYWdlX2FkZHJlc3MocGFnZSk7CisJCXVuc2lnbmVkIGxvbmcgcGZuID0gcGFnZV90b19w Zm4ocGFnZSk7CisJCXN0cnVjdCBtdWx0aWNhbGxfc3BhY2UgbWNzID0gX194ZW5fbWNfZW50cnko MCk7CisJCXNwaW5sb2NrX3QgKnB0bDsKKworCQlmbHVzaCA9IDA7CisKKwkJLyoKKwkJICogV2Ug bmVlZCB0byBob2xkIHRoZSBwYWdldGFibGUgbG9jayBiZXR3ZWVuIHRoZSB0aW1lCisJCSAqIHdl IG1ha2UgdGhlIHBhZ2V0YWJsZSBSTyBhbmQgd2hlbiB3ZSBhY3R1YWxseSBwaW4KKwkJICogaXQu ICBJZiB3ZSBkb24ndCwgdGhlbiBvdGhlciB1c2VycyBtYXkgY29tZSBpbiBhbmQKKwkJICogYXR0 ZW1wdCB0byB1cGRhdGUgdGhlIHBhZ2V0YWJsZSBieSB3cml0aW5nIGl0LAorCQkgKiB3aGljaCB3 aWxsIGZhaWwgYmVjYXVzZSB0aGUgbWVtb3J5IGlzIFJPIGJ1dCBub3QKKwkJICogcGlubmVkLCBz byBYZW4gd29uJ3QgZG8gdGhlIHRyYXAnbidlbXVsYXRlLgorCQkgKgorCQkgKiBJZiB3ZSdyZSB1 c2luZyBzcGxpdCBwdGUgbG9ja3MsIHdlIGNhbid0IGhvbGQgdGhlCisJCSAqIGVudGlyZSBwYWdl dGFibGUncyB3b3J0aCBvZiBsb2NrcyBkdXJpbmcgdGhlCisJCSAqIHRyYXZlcnNlLCBiZWNhdXNl IHdlIG1heSB3cmFwIHRoZSBwcmVlbXB0IGNvdW50ICg4CisJCSAqIGJpdHMpLiAgVGhlIHNvbHV0 aW9uIGlzIHRvIG1hcmsgUk8gYW5kIHBpbiBlYWNoIFBURQorCQkgKiBwYWdlIHdoaWxlIGhvbGRp bmcgdGhlIGxvY2suICBUaGlzIG1lYW5zIHRoZSBudW1iZXIKKwkJICogb2YgbG9ja3Mgd2UgZW5k IHVwIGhvbGRpbmcgaXMgbmV2ZXIgbW9yZSB0aGFuIGEKKwkJICogYmF0Y2ggc2l6ZSAofjMyIGVu dHJpZXMsIGF0IHByZXNlbnQpLgorCQkgKgorCQkgKiBJZiB3ZSdyZSBub3QgdXNpbmcgc3BsaXQg cHRlIGxvY2tzLCB3ZSBuZWVkbid0IHBpbgorCQkgKiB0aGUgUFRFIHBhZ2VzIGluZGVwZW5kZW50 bHksIGJlY2F1c2Ugd2UncmUKKwkJICogcHJvdGVjdGVkIGJ5IHRoZSBvdmVyYWxsIHBhZ2V0YWJs ZSBsb2NrLgorCQkgKi8KKwkJcHRsID0gTlVMTDsKKwkJaWYgKGxldmVsID09IFBUX1BURSkKKwkJ CXB0bCA9IHhlbl9wdGVfbG9jayhwYWdlLCBtbSk7CisKKwkJTVVMVElfdXBkYXRlX3ZhX21hcHBp bmcobWNzLm1jLCAodW5zaWduZWQgbG9uZylwdCwKKwkJCQkJcGZuX3B0ZShwZm4sIFBBR0VfS0VS TkVMX1JPKSwKKwkJCQkJbGV2ZWwgPT0gUFRfUEdEID8gVVZNRl9UTEJfRkxVU0ggOiAwKTsKKwor CQlpZiAocHRsKSB7CisJCQl4ZW5fZG9fcGluKE1NVUVYVF9QSU5fTDFfVEFCTEUsIHBmbik7CisK KwkJCS8qIFF1ZXVlIGEgZGVmZXJyZWQgdW5sb2NrIGZvciB3aGVuIHRoaXMgYmF0Y2gKKwkJCSAg IGlzIGNvbXBsZXRlZC4gKi8KKwkJCXhlbl9tY19jYWxsYmFjayh4ZW5fcHRlX3VubG9jaywgcHRs KTsKKwkJfQorCX0KKworCXJldHVybiBmbHVzaDsKK30KKworLyogVGhpcyBpcyBjYWxsZWQganVz dCBhZnRlciBhIG1tIGhhcyBiZWVuIGNyZWF0ZWQsIGJ1dCBpdCBoYXMgbm90CisgICBiZWVuIHVz ZWQgeWV0LiAgV2UgbmVlZCB0byBtYWtlIHN1cmUgdGhhdCBpdHMgcGFnZXRhYmxlIGlzIGFsbAor ICAgcmVhZC1vbmx5LCBhbmQgY2FuIGJlIHBpbm5lZC4gKi8KK3N0YXRpYyB2b2lkIF9feGVuX3Bn ZF9waW4oc3RydWN0IG1tX3N0cnVjdCAqbW0sIHBnZF90ICpwZ2QpCit7CisJdHJhY2VfeGVuX21t dV9wZ2RfcGluKG1tLCBwZ2QpOworCisJeGVuX21jX2JhdGNoKCk7CisKKwlpZiAoX194ZW5fcGdk X3dhbGsobW0sIHBnZCwgeGVuX3Bpbl9wYWdlLCBVU0VSX0xJTUlUKSkgeworCQkvKiByZS1lbmFi bGUgaW50ZXJydXB0cyBmb3IgZmx1c2hpbmcgKi8KKwkJeGVuX21jX2lzc3VlKDApOworCisJCWtt YXBfZmx1c2hfdW51c2VkKCk7CisKKwkJeGVuX21jX2JhdGNoKCk7CisJfQorCisjaWZkZWYgQ09O RklHX1g4Nl82NAorCXsKKwkJcGdkX3QgKnVzZXJfcGdkID0geGVuX2dldF91c2VyX3BnZChwZ2Qp OworCisJCXhlbl9kb19waW4oTU1VRVhUX1BJTl9MNF9UQUJMRSwgUEZOX0RPV04oX19wYShwZ2Qp KSk7CisKKwkJaWYgKHVzZXJfcGdkKSB7CisJCQl4ZW5fcGluX3BhZ2UobW0sIHZpcnRfdG9fcGFn ZSh1c2VyX3BnZCksIFBUX1BHRCk7CisJCQl4ZW5fZG9fcGluKE1NVUVYVF9QSU5fTDRfVEFCTEUs CisJCQkJICAgUEZOX0RPV04oX19wYSh1c2VyX3BnZCkpKTsKKwkJfQorCX0KKyNlbHNlIC8qIENP TkZJR19YODZfMzIgKi8KKyNpZmRlZiBDT05GSUdfWDg2X1BBRQorCS8qIE5lZWQgdG8gbWFrZSBz dXJlIHVuc2hhcmVkIGtlcm5lbCBQTUQgaXMgcGlubmFibGUgKi8KKwl4ZW5fcGluX3BhZ2UobW0s IHBnZF9wYWdlKHBnZFtwZ2RfaW5kZXgoVEFTS19TSVpFKV0pLAorCQkgICAgIFBUX1BNRCk7Cisj ZW5kaWYKKwl4ZW5fZG9fcGluKE1NVUVYVF9QSU5fTDNfVEFCTEUsIFBGTl9ET1dOKF9fcGEocGdk KSkpOworI2VuZGlmIC8qIENPTkZJR19YODZfNjQgKi8KKwl4ZW5fbWNfaXNzdWUoMCk7Cit9CisK K3N0YXRpYyB2b2lkIHhlbl9wZ2RfcGluKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tKQoreworCV9feGVu X3BnZF9waW4obW0sIG1tLT5wZ2QpOworfQorCisvKgorICogT24gc2F2ZSwgd2UgbmVlZCB0byBw aW4gYWxsIHBhZ2V0YWJsZXMgdG8gbWFrZSBzdXJlIHRoZXkgZ2V0IHRoZWlyCisgKiBtZm5zIHR1 cm5lZCBpbnRvIHBmbnMuICBTZWFyY2ggdGhlIGxpc3QgZm9yIGFueSB1bnBpbm5lZCBwZ2RzIGFu ZCBwaW4KKyAqIHRoZW0gKHVucGlubmVkIHBnZHMgYXJlIG5vdCBjdXJyZW50bHkgaW4gdXNlLCBw cm9iYWJseSBiZWNhdXNlIHRoZQorICogcHJvY2VzcyBpcyB1bmRlciBjb25zdHJ1Y3Rpb24gb3Ig ZGVzdHJ1Y3Rpb24pLgorICoKKyAqIEV4cGVjdGVkIHRvIGJlIGNhbGxlZCBpbiBzdG9wX21hY2hp bmUoKSAoImVxdWl2YWxlbnQgdG8gdGFraW5nCisgKiBldmVyeSBzcGlubG9jayBpbiB0aGUgc3lz dGVtIiksIHNvIHRoZSBsb2NraW5nIGRvZXNuJ3QgcmVhbGx5CisgKiBtYXR0ZXIgYWxsIHRoYXQg bXVjaC4KKyAqLwordm9pZCB4ZW5fbW1fcGluX2FsbCh2b2lkKQoreworCXN0cnVjdCBwYWdlICpw YWdlOworCisJc3Bpbl9sb2NrKCZwZ2RfbG9jayk7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHBh Z2UsICZwZ2RfbGlzdCwgbHJ1KSB7CisJCWlmICghUGFnZVBpbm5lZChwYWdlKSkgeworCQkJX194 ZW5fcGdkX3BpbigmaW5pdF9tbSwgKHBnZF90ICopcGFnZV9hZGRyZXNzKHBhZ2UpKTsKKwkJCVNl dFBhZ2VTYXZlUGlubmVkKHBhZ2UpOworCQl9CisJfQorCisJc3Bpbl91bmxvY2soJnBnZF9sb2Nr KTsKK30KKworLyoKKyAqIFRoZSBpbml0X21tIHBhZ2V0YWJsZSBpcyByZWFsbHkgcGlubmVkIGFz IHNvb24gYXMgaXRzIGNyZWF0ZWQsIGJ1dAorICogdGhhdCdzIGJlZm9yZSB3ZSBoYXZlIHBhZ2Ug c3RydWN0dXJlcyB0byBzdG9yZSB0aGUgYml0cy4gIFNvIGRvIGFsbAorICogdGhlIGJvb2sta2Vl cGluZyBub3cuCisgKi8KK3N0YXRpYyBpbnQgX19pbml0IHhlbl9tYXJrX3Bpbm5lZChzdHJ1Y3Qg bW1fc3RydWN0ICptbSwgc3RydWN0IHBhZ2UgKnBhZ2UsCisJCQkJICBlbnVtIHB0X2xldmVsIGxl dmVsKQoreworCVNldFBhZ2VQaW5uZWQocGFnZSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2 b2lkIF9faW5pdCB4ZW5fbWFya19pbml0X21tX3Bpbm5lZCh2b2lkKQoreworCXhlbl9wZ2Rfd2Fs aygmaW5pdF9tbSwgeGVuX21hcmtfcGlubmVkLCBGSVhBRERSX1RPUCk7Cit9CisKK3N0YXRpYyBp bnQgeGVuX3VucGluX3BhZ2Uoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHN0cnVjdCBwYWdlICpwYWdl LAorCQkJICBlbnVtIHB0X2xldmVsIGxldmVsKQoreworCXVuc2lnbmVkIHBnZmwgPSBUZXN0Q2xl YXJQYWdlUGlubmVkKHBhZ2UpOworCisJaWYgKHBnZmwgJiYgIVBhZ2VIaWdoTWVtKHBhZ2UpKSB7 CisJCXZvaWQgKnB0ID0gbG93bWVtX3BhZ2VfYWRkcmVzcyhwYWdlKTsKKwkJdW5zaWduZWQgbG9u ZyBwZm4gPSBwYWdlX3RvX3BmbihwYWdlKTsKKwkJc3BpbmxvY2tfdCAqcHRsID0gTlVMTDsKKwkJ c3RydWN0IG11bHRpY2FsbF9zcGFjZSBtY3M7CisKKwkJLyoKKwkJICogRG8gdGhlIGNvbnZlcnNl IHRvIHBpbl9wYWdlLiAgSWYgd2UncmUgdXNpbmcgc3BsaXQKKwkJICogcHRlIGxvY2tzLCB3ZSBt dXN0IGJlIGhvbGRpbmcgdGhlIGxvY2sgZm9yIHdoaWxlCisJCSAqIHRoZSBwdGUgcGFnZSBpcyB1 bnBpbm5lZCBidXQgc3RpbGwgUk8gdG8gcHJldmVudAorCQkgKiBjb25jdXJyZW50IHVwZGF0ZXMg ZnJvbSBzZWVpbmcgaXQgaW4gdGhpcworCQkgKiBwYXJ0aWFsbHktcGlubmVkIHN0YXRlLgorCQkg Ki8KKwkJaWYgKGxldmVsID09IFBUX1BURSkgeworCQkJcHRsID0geGVuX3B0ZV9sb2NrKHBhZ2Us IG1tKTsKKworCQkJaWYgKHB0bCkKKwkJCQl4ZW5fZG9fcGluKE1NVUVYVF9VTlBJTl9UQUJMRSwg cGZuKTsKKwkJfQorCisJCW1jcyA9IF9feGVuX21jX2VudHJ5KDApOworCisJCU1VTFRJX3VwZGF0 ZV92YV9tYXBwaW5nKG1jcy5tYywgKHVuc2lnbmVkIGxvbmcpcHQsCisJCQkJCXBmbl9wdGUocGZu LCBQQUdFX0tFUk5FTCksCisJCQkJCWxldmVsID09IFBUX1BHRCA/IFVWTUZfVExCX0ZMVVNIIDog MCk7CisKKwkJaWYgKHB0bCkgeworCQkJLyogdW5sb2NrIHdoZW4gYmF0Y2ggY29tcGxldGVkICov CisJCQl4ZW5fbWNfY2FsbGJhY2soeGVuX3B0ZV91bmxvY2ssIHB0bCk7CisJCX0KKwl9CisKKwly ZXR1cm4gMDsJCS8qIG5ldmVyIG5lZWQgdG8gZmx1c2ggb24gdW5waW4gKi8KK30KKworLyogUmVs ZWFzZSBhIHBhZ2V0YWJsZXMgcGFnZXMgYmFjayBhcyBub3JtYWwgUlcgKi8KK3N0YXRpYyB2b2lk IF9feGVuX3BnZF91bnBpbihzdHJ1Y3QgbW1fc3RydWN0ICptbSwgcGdkX3QgKnBnZCkKK3sKKwl0 cmFjZV94ZW5fbW11X3BnZF91bnBpbihtbSwgcGdkKTsKKworCXhlbl9tY19iYXRjaCgpOworCisJ eGVuX2RvX3BpbihNTVVFWFRfVU5QSU5fVEFCTEUsIFBGTl9ET1dOKF9fcGEocGdkKSkpOworCisj aWZkZWYgQ09ORklHX1g4Nl82NAorCXsKKwkJcGdkX3QgKnVzZXJfcGdkID0geGVuX2dldF91c2Vy X3BnZChwZ2QpOworCisJCWlmICh1c2VyX3BnZCkgeworCQkJeGVuX2RvX3BpbihNTVVFWFRfVU5Q SU5fVEFCTEUsCisJCQkJICAgUEZOX0RPV04oX19wYSh1c2VyX3BnZCkpKTsKKwkJCXhlbl91bnBp bl9wYWdlKG1tLCB2aXJ0X3RvX3BhZ2UodXNlcl9wZ2QpLCBQVF9QR0QpOworCQl9CisJfQorI2Vu ZGlmCisKKyNpZmRlZiBDT05GSUdfWDg2X1BBRQorCS8qIE5lZWQgdG8gbWFrZSBzdXJlIHVuc2hh cmVkIGtlcm5lbCBQTUQgaXMgdW5waW5uZWQgKi8KKwl4ZW5fdW5waW5fcGFnZShtbSwgcGdkX3Bh Z2UocGdkW3BnZF9pbmRleChUQVNLX1NJWkUpXSksCisJCSAgICAgICBQVF9QTUQpOworI2VuZGlm CisKKwlfX3hlbl9wZ2Rfd2FsayhtbSwgcGdkLCB4ZW5fdW5waW5fcGFnZSwgVVNFUl9MSU1JVCk7 CisKKwl4ZW5fbWNfaXNzdWUoMCk7Cit9CisKK3N0YXRpYyB2b2lkIHhlbl9wZ2RfdW5waW4oc3Ry dWN0IG1tX3N0cnVjdCAqbW0pCit7CisJX194ZW5fcGdkX3VucGluKG1tLCBtbS0+cGdkKTsKK30K KworLyoKKyAqIE9uIHJlc3VtZSwgdW5kbyBhbnkgcGlubmluZyBkb25lIGF0IHNhdmUsIHNvIHRo YXQgdGhlIHJlc3Qgb2YgdGhlCisgKiBrZXJuZWwgZG9lc24ndCBzZWUgYW55IHVuZXhwZWN0ZWQg cGlubmVkIHBhZ2V0YWJsZXMuCisgKi8KK3ZvaWQgeGVuX21tX3VucGluX2FsbCh2b2lkKQorewor CXN0cnVjdCBwYWdlICpwYWdlOworCisJc3Bpbl9sb2NrKCZwZ2RfbG9jayk7CisKKwlsaXN0X2Zv cl9lYWNoX2VudHJ5KHBhZ2UsICZwZ2RfbGlzdCwgbHJ1KSB7CisJCWlmIChQYWdlU2F2ZVBpbm5l ZChwYWdlKSkgeworCQkJQlVHX09OKCFQYWdlUGlubmVkKHBhZ2UpKTsKKwkJCV9feGVuX3BnZF91 bnBpbigmaW5pdF9tbSwgKHBnZF90ICopcGFnZV9hZGRyZXNzKHBhZ2UpKTsKKwkJCUNsZWFyUGFn ZVNhdmVQaW5uZWQocGFnZSk7CisJCX0KKwl9CisKKwlzcGluX3VubG9jaygmcGdkX2xvY2spOwor fQorCitzdGF0aWMgdm9pZCB4ZW5fYWN0aXZhdGVfbW0oc3RydWN0IG1tX3N0cnVjdCAqcHJldiwg c3RydWN0IG1tX3N0cnVjdCAqbmV4dCkKK3sKKwlzcGluX2xvY2soJm5leHQtPnBhZ2VfdGFibGVf bG9jayk7CisJeGVuX3BnZF9waW4obmV4dCk7CisJc3Bpbl91bmxvY2soJm5leHQtPnBhZ2VfdGFi bGVfbG9jayk7Cit9CisKK3N0YXRpYyB2b2lkIHhlbl9kdXBfbW1hcChzdHJ1Y3QgbW1fc3RydWN0 ICpvbGRtbSwgc3RydWN0IG1tX3N0cnVjdCAqbW0pCit7CisJc3Bpbl9sb2NrKCZtbS0+cGFnZV90 YWJsZV9sb2NrKTsKKwl4ZW5fcGdkX3BpbihtbSk7CisJc3Bpbl91bmxvY2soJm1tLT5wYWdlX3Rh YmxlX2xvY2spOworfQorCisKKyNpZmRlZiBDT05GSUdfU01QCisvKiBBbm90aGVyIGNwdSBtYXkg c3RpbGwgaGF2ZSB0aGVpciAlY3IzIHBvaW50aW5nIGF0IHRoZSBwYWdldGFibGUsIHNvCisgICB3 ZSBuZWVkIHRvIHJlcG9pbnQgaXQgc29tZXdoZXJlIGVsc2UgYmVmb3JlIHdlIGNhbiB1bnBpbiBp dC4gKi8KK3N0YXRpYyB2b2lkIGRyb3Bfb3RoZXJfbW1fcmVmKHZvaWQgKmluZm8pCit7CisJc3Ry dWN0IG1tX3N0cnVjdCAqbW0gPSBpbmZvOworCXN0cnVjdCBtbV9zdHJ1Y3QgKmFjdGl2ZV9tbTsK KworCWFjdGl2ZV9tbSA9IHRoaXNfY3B1X3JlYWQoY3B1X3RsYnN0YXRlLmFjdGl2ZV9tbSk7CisK KwlpZiAoYWN0aXZlX21tID09IG1tICYmIHRoaXNfY3B1X3JlYWQoY3B1X3RsYnN0YXRlLnN0YXRl KSAhPSBUTEJTVEFURV9PSykKKwkJbGVhdmVfbW0oc21wX3Byb2Nlc3Nvcl9pZCgpKTsKKworCS8q IElmIHRoaXMgY3B1IHN0aWxsIGhhcyBhIHN0YWxlIGNyMyByZWZlcmVuY2UsIHRoZW4gbWFrZSBz dXJlCisJICAgaXQgaGFzIGJlZW4gZmx1c2hlZC4gKi8KKwlpZiAodGhpc19jcHVfcmVhZCh4ZW5f Y3VycmVudF9jcjMpID09IF9fcGEobW0tPnBnZCkpCisJCWxvYWRfY3IzKHN3YXBwZXJfcGdfZGly KTsKK30KKworc3RhdGljIHZvaWQgeGVuX2Ryb3BfbW1fcmVmKHN0cnVjdCBtbV9zdHJ1Y3QgKm1t KQoreworCWNwdW1hc2tfdmFyX3QgbWFzazsKKwl1bnNpZ25lZCBjcHU7CisKKwlpZiAoY3VycmVu dC0+YWN0aXZlX21tID09IG1tKSB7CisJCWlmIChjdXJyZW50LT5tbSA9PSBtbSkKKwkJCWxvYWRf Y3IzKHN3YXBwZXJfcGdfZGlyKTsKKwkJZWxzZQorCQkJbGVhdmVfbW0oc21wX3Byb2Nlc3Nvcl9p ZCgpKTsKKwl9CisKKwkvKiBHZXQgdGhlICJvZmZpY2lhbCIgc2V0IG9mIGNwdXMgcmVmZXJyaW5n IHRvIG91ciBwYWdldGFibGUuICovCisJaWYgKCFhbGxvY19jcHVtYXNrX3ZhcigmbWFzaywgR0ZQ X0FUT01JQykpIHsKKwkJZm9yX2VhY2hfb25saW5lX2NwdShjcHUpIHsKKwkJCWlmICghY3B1bWFz a190ZXN0X2NwdShjcHUsIG1tX2NwdW1hc2sobW0pKQorCQkJICAgICYmIHBlcl9jcHUoeGVuX2N1 cnJlbnRfY3IzLCBjcHUpICE9IF9fcGEobW0tPnBnZCkpCisJCQkJY29udGludWU7CisJCQlzbXBf Y2FsbF9mdW5jdGlvbl9zaW5nbGUoY3B1LCBkcm9wX290aGVyX21tX3JlZiwgbW0sIDEpOworCQl9 CisJCXJldHVybjsKKwl9CisJY3B1bWFza19jb3B5KG1hc2ssIG1tX2NwdW1hc2sobW0pKTsKKwor CS8qIEl0J3MgcG9zc2libGUgdGhhdCBhIHZjcHUgbWF5IGhhdmUgYSBzdGFsZSByZWZlcmVuY2Ug dG8gb3VyCisJICAgY3IzLCBiZWNhdXNlIGl0cyBpbiBsYXp5IG1vZGUsIGFuZCBpdCBoYXNuJ3Qg eWV0IGZsdXNoZWQKKwkgICBpdHMgc2V0IG9mIHBlbmRpbmcgaHlwZXJjYWxscyB5ZXQuICBJbiB0 aGlzIGNhc2UsIHdlIGNhbgorCSAgIGxvb2sgYXQgaXRzIGFjdHVhbCBjdXJyZW50IGNyMyB2YWx1 ZSwgYW5kIGZvcmNlIGl0IHRvIGZsdXNoCisJICAgaWYgbmVlZGVkLiAqLworCWZvcl9lYWNoX29u bGluZV9jcHUoY3B1KSB7CisJCWlmIChwZXJfY3B1KHhlbl9jdXJyZW50X2NyMywgY3B1KSA9PSBf X3BhKG1tLT5wZ2QpKQorCQkJY3B1bWFza19zZXRfY3B1KGNwdSwgbWFzayk7CisJfQorCisJaWYg KCFjcHVtYXNrX2VtcHR5KG1hc2spKQorCQlzbXBfY2FsbF9mdW5jdGlvbl9tYW55KG1hc2ssIGRy b3Bfb3RoZXJfbW1fcmVmLCBtbSwgMSk7CisJZnJlZV9jcHVtYXNrX3ZhcihtYXNrKTsKK30KKyNl bHNlCitzdGF0aWMgdm9pZCB4ZW5fZHJvcF9tbV9yZWYoc3RydWN0IG1tX3N0cnVjdCAqbW0pCit7 CisJaWYgKGN1cnJlbnQtPmFjdGl2ZV9tbSA9PSBtbSkKKwkJbG9hZF9jcjMoc3dhcHBlcl9wZ19k aXIpOworfQorI2VuZGlmCisKKy8qCisgKiBXaGlsZSBhIHByb2Nlc3MgcnVucywgWGVuIHBpbnMg aXRzIHBhZ2V0YWJsZXMsIHdoaWNoIG1lYW5zIHRoYXQgdGhlCisgKiBoeXBlcnZpc29yIGZvcmNl cyBpdCB0byBiZSByZWFkLW9ubHksIGFuZCBpdCBjb250cm9scyBhbGwgdXBkYXRlcworICogdG8g aXQuICBUaGlzIG1lYW5zIHRoYXQgYWxsIHBhZ2V0YWJsZSB1cGRhdGVzIGhhdmUgdG8gZ28gdmlh IHRoZQorICogaHlwZXJ2aXNvciwgd2hpY2ggaXMgbW9kZXJhdGVseSBleHBlbnNpdmUuCisgKgor ICogU2luY2Ugd2UncmUgcHVsbGluZyB0aGUgcGFnZXRhYmxlIGRvd24sIHdlIHN3aXRjaCB0byB1 c2UgaW5pdF9tbSwKKyAqIHVucGluIG9sZCBwcm9jZXNzIHBhZ2V0YWJsZSBhbmQgbWFyayBpdCBh bGwgcmVhZC13cml0ZSwgd2hpY2gKKyAqIGFsbG93cyBmdXJ0aGVyIG9wZXJhdGlvbnMgb24gaXQg dG8gYmUgc2ltcGxlIG1lbW9yeSBhY2Nlc3Nlcy4KKyAqCisgKiBUaGUgb25seSBzdWJ0bGUgcG9p bnQgaXMgdGhhdCBhbm90aGVyIENQVSBtYXkgYmUgc3RpbGwgdXNpbmcgdGhlCisgKiBwYWdldGFi bGUgYmVjYXVzZSBvZiBsYXp5IHRsYiBmbHVzaGluZy4gIFRoaXMgbWVhbnMgd2UgbmVlZCBuZWVk IHRvCisgKiBzd2l0Y2ggYWxsIENQVXMgb2ZmIHRoaXMgcGFnZXRhYmxlIGJlZm9yZSB3ZSBjYW4g dW5waW4gaXQuCisgKi8KK3N0YXRpYyB2b2lkIHhlbl9leGl0X21tYXAoc3RydWN0IG1tX3N0cnVj dCAqbW0pCit7CisJZ2V0X2NwdSgpOwkJLyogbWFrZSBzdXJlIHdlIGRvbid0IG1vdmUgYXJvdW5k ICovCisJeGVuX2Ryb3BfbW1fcmVmKG1tKTsKKwlwdXRfY3B1KCk7CisKKwlzcGluX2xvY2soJm1t LT5wYWdlX3RhYmxlX2xvY2spOworCisJLyogcGdkIG1heSBub3QgYmUgcGlubmVkIGluIHRoZSBl cnJvciBleGl0IHBhdGggb2YgZXhlY3ZlICovCisJaWYgKHhlbl9wYWdlX3Bpbm5lZChtbS0+cGdk KSkKKwkJeGVuX3BnZF91bnBpbihtbSk7CisKKwlzcGluX3VubG9jaygmbW0tPnBhZ2VfdGFibGVf bG9jayk7Cit9CisKK3N0YXRpYyB2b2lkIHhlbl9wb3N0X2FsbG9jYXRvcl9pbml0KHZvaWQpOwor CitzdGF0aWMgdm9pZCBfX2luaXQgcGluX3BhZ2V0YWJsZV9wZm4odW5zaWduZWQgY21kLCB1bnNp Z25lZCBsb25nIHBmbikKK3sKKwlzdHJ1Y3QgbW11ZXh0X29wIG9wOworCisJb3AuY21kID0gY21k OworCW9wLmFyZzEubWZuID0gcGZuX3RvX21mbihwZm4pOworCWlmIChIWVBFUlZJU09SX21tdWV4 dF9vcCgmb3AsIDEsIE5VTEwsIERPTUlEX1NFTEYpKQorCQlCVUcoKTsKK30KKworI2lmZGVmIENP TkZJR19YODZfNjQKK3N0YXRpYyB2b2lkIF9faW5pdCB4ZW5fY2xlYW5oaWdobWFwKHVuc2lnbmVk IGxvbmcgdmFkZHIsCisJCQkJICAgIHVuc2lnbmVkIGxvbmcgdmFkZHJfZW5kKQoreworCXVuc2ln bmVkIGxvbmcga2VybmVsX2VuZCA9IHJvdW5kdXAoKHVuc2lnbmVkIGxvbmcpX2Jya19lbmQsIFBN RF9TSVpFKSAtIDE7CisJcG1kX3QgKnBtZCA9IGxldmVsMl9rZXJuZWxfcGd0ICsgcG1kX2luZGV4 KHZhZGRyKTsKKworCS8qIE5PVEU6IFRoZSBsb29wIGlzIG1vcmUgZ3JlZWR5IHRoYW4gdGhlIGNs ZWFudXBfaGlnaG1hcCB2YXJpYW50LgorCSAqIFdlIGluY2x1ZGUgdGhlIFBNRCBwYXNzZWQgaW4g b24gX2JvdGhfIGJvdW5kYXJpZXMuICovCisJZm9yICg7IHZhZGRyIDw9IHZhZGRyX2VuZCAmJiAo cG1kIDwgKGxldmVsMl9rZXJuZWxfcGd0ICsgUFRSU19QRVJfUE1EKSk7CisJCQlwbWQrKywgdmFk ZHIgKz0gUE1EX1NJWkUpIHsKKwkJaWYgKHBtZF9ub25lKCpwbWQpKQorCQkJY29udGludWU7CisJ CWlmICh2YWRkciA8ICh1bnNpZ25lZCBsb25nKSBfdGV4dCB8fCB2YWRkciA+IGtlcm5lbF9lbmQp CisJCQlzZXRfcG1kKHBtZCwgX19wbWQoMCkpOworCX0KKwkvKiBJbiBjYXNlIHdlIGRpZCBzb21l dGhpbmcgc2lsbHksIHdlIHNob3VsZCBjcmFzaCBpbiB0aGlzIGZ1bmN0aW9uCisJICogaW5zdGVh ZCBvZiBzb21ld2hlcmUgbGF0ZXIgYW5kIGJlIGNvbmZ1c2luZy4gKi8KKwl4ZW5fbWNfZmx1c2go KTsKK30KKworLyoKKyAqIE1ha2UgYSBwYWdlIHJhbmdlIHdyaXRlYWJsZSBhbmQgZnJlZSBpdC4K KyAqLworc3RhdGljIHZvaWQgX19pbml0IHhlbl9mcmVlX3JvX3BhZ2VzKHVuc2lnbmVkIGxvbmcg cGFkZHIsIHVuc2lnbmVkIGxvbmcgc2l6ZSkKK3sKKwl2b2lkICp2YWRkciA9IF9fdmEocGFkZHIp OworCXZvaWQgKnZhZGRyX2VuZCA9IHZhZGRyICsgc2l6ZTsKKworCWZvciAoOyB2YWRkciA8IHZh ZGRyX2VuZDsgdmFkZHIgKz0gUEFHRV9TSVpFKQorCQltYWtlX2xvd21lbV9wYWdlX3JlYWR3cml0 ZSh2YWRkcik7CisKKwltZW1ibG9ja19mcmVlKHBhZGRyLCBzaXplKTsKK30KKworc3RhdGljIHZv aWQgX19pbml0IHhlbl9jbGVhbm1mbm1hcF9mcmVlX3BndGJsKHZvaWQgKnBndGJsLCBib29sIHVu cGluKQoreworCXVuc2lnbmVkIGxvbmcgcGEgPSBfX3BhKHBndGJsKSAmIFBIWVNJQ0FMX1BBR0Vf TUFTSzsKKworCWlmICh1bnBpbikKKwkJcGluX3BhZ2V0YWJsZV9wZm4oTU1VRVhUX1VOUElOX1RB QkxFLCBQRk5fRE9XTihwYSkpOworCUNsZWFyUGFnZVBpbm5lZCh2aXJ0X3RvX3BhZ2UoX192YShw YSkpKTsKKwl4ZW5fZnJlZV9yb19wYWdlcyhwYSwgUEFHRV9TSVpFKTsKK30KKworLyoKKyAqIFNp bmNlIGl0IGlzIHdlbGwgaXNvbGF0ZWQgd2UgY2FuIChhbmQgc2luY2UgaXQgaXMgcGVyaGFwcyBs YXJnZSB3ZSBzaG91bGQpCisgKiBhbHNvIGZyZWUgdGhlIHBhZ2UgdGFibGVzIG1hcHBpbmcgdGhl IGluaXRpYWwgUC0+TSB0YWJsZS4KKyAqLworc3RhdGljIHZvaWQgX19pbml0IHhlbl9jbGVhbm1m bm1hcCh1bnNpZ25lZCBsb25nIHZhZGRyKQoreworCXVuc2lnbmVkIGxvbmcgdmEgPSB2YWRkciAm IFBNRF9NQVNLOworCXVuc2lnbmVkIGxvbmcgcGE7CisJcGdkX3QgKnBnZCA9IHBnZF9vZmZzZXRf ayh2YSk7CisJcHVkX3QgKnB1ZF9wYWdlID0gcHVkX29mZnNldChwZ2QsIDApOworCXB1ZF90ICpw dWQ7CisJcG1kX3QgKnBtZDsKKwlwdGVfdCAqcHRlOworCXVuc2lnbmVkIGludCBpOworCWJvb2wg dW5waW47CisKKwl1bnBpbiA9ICh2YWRkciA9PSAyICogUEdESVJfU0laRSk7CisJc2V0X3BnZChw Z2QsIF9fcGdkKDApKTsKKwlkbyB7CisJCXB1ZCA9IHB1ZF9wYWdlICsgcHVkX2luZGV4KHZhKTsK KwkJaWYgKHB1ZF9ub25lKCpwdWQpKSB7CisJCQl2YSArPSBQVURfU0laRTsKKwkJfSBlbHNlIGlm IChwdWRfbGFyZ2UoKnB1ZCkpIHsKKwkJCXBhID0gcHVkX3ZhbCgqcHVkKSAmIFBIWVNJQ0FMX1BB R0VfTUFTSzsKKwkJCXhlbl9mcmVlX3JvX3BhZ2VzKHBhLCBQVURfU0laRSk7CisJCQl2YSArPSBQ VURfU0laRTsKKwkJfSBlbHNlIHsKKwkJCXBtZCA9IHBtZF9vZmZzZXQocHVkLCB2YSk7CisJCQlp ZiAocG1kX2xhcmdlKCpwbWQpKSB7CisJCQkJcGEgPSBwbWRfdmFsKCpwbWQpICYgUEhZU0lDQUxf UEFHRV9NQVNLOworCQkJCXhlbl9mcmVlX3JvX3BhZ2VzKHBhLCBQTURfU0laRSk7CisJCQl9IGVs c2UgaWYgKCFwbWRfbm9uZSgqcG1kKSkgeworCQkJCXB0ZSA9IHB0ZV9vZmZzZXRfa2VybmVsKHBt ZCwgdmEpOworCQkJCXNldF9wbWQocG1kLCBfX3BtZCgwKSk7CisJCQkJZm9yIChpID0gMDsgaSA8 IFBUUlNfUEVSX1BURTsgKytpKSB7CisJCQkJCWlmIChwdGVfbm9uZShwdGVbaV0pKQorCQkJCQkJ YnJlYWs7CisJCQkJCXBhID0gcHRlX3BmbihwdGVbaV0pIDw8IFBBR0VfU0hJRlQ7CisJCQkJCXhl bl9mcmVlX3JvX3BhZ2VzKHBhLCBQQUdFX1NJWkUpOworCQkJCX0KKwkJCQl4ZW5fY2xlYW5tZm5t YXBfZnJlZV9wZ3RibChwdGUsIHVucGluKTsKKwkJCX0KKwkJCXZhICs9IFBNRF9TSVpFOworCQkJ aWYgKHBtZF9pbmRleCh2YSkpCisJCQkJY29udGludWU7CisJCQlzZXRfcHVkKHB1ZCwgX19wdWQo MCkpOworCQkJeGVuX2NsZWFubWZubWFwX2ZyZWVfcGd0YmwocG1kLCB1bnBpbik7CisJCX0KKwor CX0gd2hpbGUgKHB1ZF9pbmRleCh2YSkgfHwgcG1kX2luZGV4KHZhKSk7CisJeGVuX2NsZWFubWZu bWFwX2ZyZWVfcGd0YmwocHVkX3BhZ2UsIHVucGluKTsKK30KKworc3RhdGljIHZvaWQgX19pbml0 IHhlbl9wYWdldGFibGVfcDJtX2ZyZWUodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIHNpemU7CisJ dW5zaWduZWQgbG9uZyBhZGRyOworCisJc2l6ZSA9IFBBR0VfQUxJR04oeGVuX3N0YXJ0X2luZm8t Pm5yX3BhZ2VzICogc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKTsKKworCS8qIE5vIG1lbW9yeSBvciBh bHJlYWR5IGNhbGxlZC4gKi8KKwlpZiAoKHVuc2lnbmVkIGxvbmcpeGVuX3AybV9hZGRyID09IHhl bl9zdGFydF9pbmZvLT5tZm5fbGlzdCkKKwkJcmV0dXJuOworCisJLyogdXNpbmcgX19rYSBhZGRy ZXNzIGFuZCBzdGlja2luZyBJTlZBTElEX1AyTV9FTlRSWSEgKi8KKwltZW1zZXQoKHZvaWQgKil4 ZW5fc3RhcnRfaW5mby0+bWZuX2xpc3QsIDB4ZmYsIHNpemUpOworCisJYWRkciA9IHhlbl9zdGFy dF9pbmZvLT5tZm5fbGlzdDsKKwkvKgorCSAqIFdlIGNvdWxkIGJlIGluIF9fa2Egc3BhY2UuCisJ ICogV2Ugcm91bmR1cCB0byB0aGUgUE1ELCB3aGljaCBtZWFucyB0aGF0IGlmIGFueWJvZHkgYXQg dGhpcyBzdGFnZSBpcworCSAqIHVzaW5nIHRoZSBfX2thIGFkZHJlc3Mgb2YgeGVuX3N0YXJ0X2lu Zm8gb3IKKwkgKiB4ZW5fc3RhcnRfaW5mby0+c2hhcmVkX2luZm8gdGhleSBhcmUgaW4gZ29pbmcg dG8gY3Jhc2guIEZvcnR1bmF0bHkKKwkgKiB3ZSBoYXZlIGFscmVhZHkgcmV2ZWN0b3JlZCBpbiB4 ZW5fc2V0dXBfa2VybmVsX3BhZ2V0YWJsZSBhbmQgaW4KKwkgKiB4ZW5fc2V0dXBfc2hhcmVkX2lu Zm8uCisJICovCisJc2l6ZSA9IHJvdW5kdXAoc2l6ZSwgUE1EX1NJWkUpOworCisJaWYgKGFkZHIg Pj0gX19TVEFSVF9LRVJORUxfbWFwKSB7CisJCXhlbl9jbGVhbmhpZ2htYXAoYWRkciwgYWRkciAr IHNpemUpOworCQlzaXplID0gUEFHRV9BTElHTih4ZW5fc3RhcnRfaW5mby0+bnJfcGFnZXMgKgor CQkJCSAgc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKTsKKwkJbWVtYmxvY2tfZnJlZShfX3BhKGFkZHIp LCBzaXplKTsKKwl9IGVsc2UgeworCQl4ZW5fY2xlYW5tZm5tYXAoYWRkcik7CisJfQorfQorCitz dGF0aWMgdm9pZCBfX2luaXQgeGVuX3BhZ2V0YWJsZV9jbGVhbmhpZ2htYXAodm9pZCkKK3sKKwl1 bnNpZ25lZCBsb25nIHNpemU7CisJdW5zaWduZWQgbG9uZyBhZGRyOworCisJLyogQXQgdGhpcyBz dGFnZSwgY2xlYW51cF9oaWdobWFwIGhhcyBhbHJlYWR5IGNsZWFuZWQgX19rYSBzcGFjZQorCSAq IGZyb20gX2Jya19saW1pdCB3YXkgdXAgdG8gdGhlIG1heF9wZm5fbWFwcGVkICh3aGljaCBpcyB0 aGUgZW5kIG9mCisJICogdGhlIHJhbWRpc2spLiBXZSBjb250aW51ZSBvbiwgZXJhc2luZyBQTUQg ZW50cmllcyB0aGF0IHBvaW50IHRvIHBhZ2UKKwkgKiB0YWJsZXMgLSBkbyBub3RlIHRoYXQgdGhl eSBhcmUgYWNjZXNzaWJsZSBhdCB0aGlzIHN0YWdlIHZpYSBfX3ZhLgorCSAqIEZvciBnb29kIG1l YXN1cmUgd2UgYWxzbyByb3VuZCB1cCB0byB0aGUgUE1EIC0gd2hpY2ggbWVhbnMgdGhhdCBpZgor CSAqIGFueWJvZHkgaXMgdXNpbmcgX19rYSBhZGRyZXNzIHRvIHRoZSBpbml0aWFsIGJvb3Qtc3Rh Y2sgLSBhbmQgdHJ5CisJICogdG8gdXNlIGl0IC0gdGhleSBhcmUgZ29pbmcgdG8gY3Jhc2guIFRo ZSB4ZW5fc3RhcnRfaW5mbyBoYXMgYmVlbgorCSAqIHRha2VuIGNhcmUgb2YgYWxyZWFkeSBpbiB4 ZW5fc2V0dXBfa2VybmVsX3BhZ2V0YWJsZS4gKi8KKwlhZGRyID0geGVuX3N0YXJ0X2luZm8tPnB0 X2Jhc2U7CisJc2l6ZSA9IHJvdW5kdXAoeGVuX3N0YXJ0X2luZm8tPm5yX3B0X2ZyYW1lcyAqIFBB R0VfU0laRSwgUE1EX1NJWkUpOworCisJeGVuX2NsZWFuaGlnaG1hcChhZGRyLCBhZGRyICsgc2l6 ZSk7CisJeGVuX3N0YXJ0X2luZm8tPnB0X2Jhc2UgPSAodW5zaWduZWQgbG9uZylfX3ZhKF9fcGEo eGVuX3N0YXJ0X2luZm8tPnB0X2Jhc2UpKTsKKyNpZmRlZiBERUJVRworCS8qIFRoaXMgaXMgc3Vw ZXJmbHVvdXMgYW5kIGlzIG5vdCBuZWNlc3NhcnksIGJ1dCB5b3Uga25vdyB3aGF0CisJICogbGV0 cyBkbyBpdC4gVGhlIE1PRFVMRVNfVkFERFIgLT4gTU9EVUxFU19FTkQgc2hvdWxkIGJlIGNsZWFy IG9mCisJICogYW55dGhpbmcgYXQgdGhpcyBzdGFnZS4gKi8KKwl4ZW5fY2xlYW5oaWdobWFwKE1P RFVMRVNfVkFERFIsIHJvdW5kdXAoTU9EVUxFU19WQUREUiwgUFVEX1NJWkUpIC0gMSk7CisjZW5k aWYKK30KKyNlbmRpZgorCitzdGF0aWMgdm9pZCBfX2luaXQgeGVuX3BhZ2V0YWJsZV9wMm1fc2V0 dXAodm9pZCkKK3sKKwlpZiAoeGVuX2ZlYXR1cmUoWEVORkVBVF9hdXRvX3RyYW5zbGF0ZWRfcGh5 c21hcCkpCisJCXJldHVybjsKKworCXhlbl92bWFsbG9jX3AybV90cmVlKCk7CisKKyNpZmRlZiBD T05GSUdfWDg2XzY0CisJeGVuX3BhZ2V0YWJsZV9wMm1fZnJlZSgpOworCisJeGVuX3BhZ2V0YWJs ZV9jbGVhbmhpZ2htYXAoKTsKKyNlbmRpZgorCS8qIEFuZCByZXZlY3RvciEgQnllIGJ5ZSBvbGQg YXJyYXkgKi8KKwl4ZW5fc3RhcnRfaW5mby0+bWZuX2xpc3QgPSAodW5zaWduZWQgbG9uZyl4ZW5f cDJtX2FkZHI7Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCB4ZW5fcGFnZXRhYmxlX2luaXQodm9p ZCkKK3sKKwlwYWdpbmdfaW5pdCgpOworCXhlbl9wb3N0X2FsbG9jYXRvcl9pbml0KCk7CisKKwl4 ZW5fcGFnZXRhYmxlX3AybV9zZXR1cCgpOworCisJLyogQWxsb2NhdGUgYW5kIGluaXRpYWxpemUg dG9wIGFuZCBtaWQgbWZuIGxldmVscyBmb3IgcDJtIHN0cnVjdHVyZSAqLworCXhlbl9idWlsZF9t Zm5fbGlzdF9saXN0KCk7CisKKwkvKiBSZW1hcCBtZW1vcnkgZnJlZWQgZHVlIHRvIGNvbmZsaWN0 cyB3aXRoIEU4MjAgbWFwICovCisJaWYgKCF4ZW5fZmVhdHVyZShYRU5GRUFUX2F1dG9fdHJhbnNs YXRlZF9waHlzbWFwKSkKKwkJeGVuX3JlbWFwX21lbW9yeSgpOworCisJeGVuX3NldHVwX3NoYXJl ZF9pbmZvKCk7Cit9CitzdGF0aWMgdm9pZCB4ZW5fd3JpdGVfY3IyKHVuc2lnbmVkIGxvbmcgY3Iy KQoreworCXRoaXNfY3B1X3JlYWQoeGVuX3ZjcHUpLT5hcmNoLmNyMiA9IGNyMjsKK30KKworc3Rh dGljIHVuc2lnbmVkIGxvbmcgeGVuX3JlYWRfY3IyKHZvaWQpCit7CisJcmV0dXJuIHRoaXNfY3B1 X3JlYWQoeGVuX3ZjcHUpLT5hcmNoLmNyMjsKK30KKwordW5zaWduZWQgbG9uZyB4ZW5fcmVhZF9j cjJfZGlyZWN0KHZvaWQpCit7CisJcmV0dXJuIHRoaXNfY3B1X3JlYWQoeGVuX3ZjcHVfaW5mby5h cmNoLmNyMik7Cit9CisKK3N0YXRpYyB2b2lkIHhlbl9mbHVzaF90bGIodm9pZCkKK3sKKwlzdHJ1 Y3QgbW11ZXh0X29wICpvcDsKKwlzdHJ1Y3QgbXVsdGljYWxsX3NwYWNlIG1jczsKKworCXRyYWNl X3hlbl9tbXVfZmx1c2hfdGxiKDApOworCisJcHJlZW1wdF9kaXNhYmxlKCk7CisKKwltY3MgPSB4 ZW5fbWNfZW50cnkoc2l6ZW9mKCpvcCkpOworCisJb3AgPSBtY3MuYXJnczsKKwlvcC0+Y21kID0g TU1VRVhUX1RMQl9GTFVTSF9MT0NBTDsKKwlNVUxUSV9tbXVleHRfb3AobWNzLm1jLCBvcCwgMSwg TlVMTCwgRE9NSURfU0VMRik7CisKKwl4ZW5fbWNfaXNzdWUoUEFSQVZJUlRfTEFaWV9NTVUpOwor CisJcHJlZW1wdF9lbmFibGUoKTsKK30KKworc3RhdGljIHZvaWQgeGVuX2ZsdXNoX3RsYl9zaW5n bGUodW5zaWduZWQgbG9uZyBhZGRyKQoreworCXN0cnVjdCBtbXVleHRfb3AgKm9wOworCXN0cnVj dCBtdWx0aWNhbGxfc3BhY2UgbWNzOworCisJdHJhY2VfeGVuX21tdV9mbHVzaF90bGJfc2luZ2xl KGFkZHIpOworCisJcHJlZW1wdF9kaXNhYmxlKCk7CisKKwltY3MgPSB4ZW5fbWNfZW50cnkoc2l6 ZW9mKCpvcCkpOworCW9wID0gbWNzLmFyZ3M7CisJb3AtPmNtZCA9IE1NVUVYVF9JTlZMUEdfTE9D QUw7CisJb3AtPmFyZzEubGluZWFyX2FkZHIgPSBhZGRyICYgUEFHRV9NQVNLOworCU1VTFRJX21t dWV4dF9vcChtY3MubWMsIG9wLCAxLCBOVUxMLCBET01JRF9TRUxGKTsKKworCXhlbl9tY19pc3N1 ZShQQVJBVklSVF9MQVpZX01NVSk7CisKKwlwcmVlbXB0X2VuYWJsZSgpOworfQorCitzdGF0aWMg dm9pZCB4ZW5fZmx1c2hfdGxiX290aGVycyhjb25zdCBzdHJ1Y3QgY3B1bWFzayAqY3B1cywKKwkJ CQkgc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgc3RhcnQsCisJCQkJIHVuc2ln bmVkIGxvbmcgZW5kKQoreworCXN0cnVjdCB7CisJCXN0cnVjdCBtbXVleHRfb3Agb3A7CisjaWZk ZWYgQ09ORklHX1NNUAorCQlERUNMQVJFX0JJVE1BUChtYXNrLCBudW1fcHJvY2Vzc29ycyk7Cisj ZWxzZQorCQlERUNMQVJFX0JJVE1BUChtYXNrLCBOUl9DUFVTKTsKKyNlbmRpZgorCX0gKmFyZ3M7 CisJc3RydWN0IG11bHRpY2FsbF9zcGFjZSBtY3M7CisKKwl0cmFjZV94ZW5fbW11X2ZsdXNoX3Rs Yl9vdGhlcnMoY3B1cywgbW0sIHN0YXJ0LCBlbmQpOworCisJaWYgKGNwdW1hc2tfZW1wdHkoY3B1 cykpCisJCXJldHVybjsJCS8qIG5vdGhpbmcgdG8gZG8gKi8KKworCW1jcyA9IHhlbl9tY19lbnRy eShzaXplb2YoKmFyZ3MpKTsKKwlhcmdzID0gbWNzLmFyZ3M7CisJYXJncy0+b3AuYXJnMi52Y3B1 bWFzayA9IHRvX2NwdW1hc2soYXJncy0+bWFzayk7CisKKwkvKiBSZW1vdmUgdXMsIGFuZCBhbnkg b2ZmbGluZSBDUFVTLiAqLworCWNwdW1hc2tfYW5kKHRvX2NwdW1hc2soYXJncy0+bWFzayksIGNw dXMsIGNwdV9vbmxpbmVfbWFzayk7CisJY3B1bWFza19jbGVhcl9jcHUoc21wX3Byb2Nlc3Nvcl9p ZCgpLCB0b19jcHVtYXNrKGFyZ3MtPm1hc2spKTsKKworCWFyZ3MtPm9wLmNtZCA9IE1NVUVYVF9U TEJfRkxVU0hfTVVMVEk7CisJaWYgKGVuZCAhPSBUTEJfRkxVU0hfQUxMICYmIChlbmQgLSBzdGFy dCkgPD0gUEFHRV9TSVpFKSB7CisJCWFyZ3MtPm9wLmNtZCA9IE1NVUVYVF9JTlZMUEdfTVVMVEk7 CisJCWFyZ3MtPm9wLmFyZzEubGluZWFyX2FkZHIgPSBzdGFydDsKKwl9CisKKwlNVUxUSV9tbXVl eHRfb3AobWNzLm1jLCAmYXJncy0+b3AsIDEsIE5VTEwsIERPTUlEX1NFTEYpOworCisJeGVuX21j X2lzc3VlKFBBUkFWSVJUX0xBWllfTU1VKTsKK30KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgeGVu X3JlYWRfY3IzKHZvaWQpCit7CisJcmV0dXJuIHRoaXNfY3B1X3JlYWQoeGVuX2NyMyk7Cit9CisK K3N0YXRpYyB2b2lkIHNldF9jdXJyZW50X2NyMyh2b2lkICp2KQoreworCXRoaXNfY3B1X3dyaXRl KHhlbl9jdXJyZW50X2NyMywgKHVuc2lnbmVkIGxvbmcpdik7Cit9CisKK3N0YXRpYyB2b2lkIF9f eGVuX3dyaXRlX2NyMyhib29sIGtlcm5lbCwgdW5zaWduZWQgbG9uZyBjcjMpCit7CisJc3RydWN0 IG1tdWV4dF9vcCBvcDsKKwl1bnNpZ25lZCBsb25nIG1mbjsKKworCXRyYWNlX3hlbl9tbXVfd3Jp dGVfY3IzKGtlcm5lbCwgY3IzKTsKKworCWlmIChjcjMpCisJCW1mbiA9IHBmbl90b19tZm4oUEZO X0RPV04oY3IzKSk7CisJZWxzZQorCQltZm4gPSAwOworCisJV0FSTl9PTihtZm4gPT0gMCAmJiBr ZXJuZWwpOworCisJb3AuY21kID0ga2VybmVsID8gTU1VRVhUX05FV19CQVNFUFRSIDogTU1VRVhU X05FV19VU0VSX0JBU0VQVFI7CisJb3AuYXJnMS5tZm4gPSBtZm47CisKKwl4ZW5fZXh0ZW5kX21t dWV4dF9vcCgmb3ApOworCisJaWYgKGtlcm5lbCkgeworCQl0aGlzX2NwdV93cml0ZSh4ZW5fY3Iz LCBjcjMpOworCisJCS8qIFVwZGF0ZSB4ZW5fY3VycmVudF9jcjMgb25jZSB0aGUgYmF0Y2ggaGFz IGFjdHVhbGx5CisJCSAgIGJlZW4gc3VibWl0dGVkLiAqLworCQl4ZW5fbWNfY2FsbGJhY2soc2V0 X2N1cnJlbnRfY3IzLCAodm9pZCAqKWNyMyk7CisJfQorfQorc3RhdGljIHZvaWQgeGVuX3dyaXRl X2NyMyh1bnNpZ25lZCBsb25nIGNyMykKK3sKKwlCVUdfT04ocHJlZW1wdGlibGUoKSk7CisKKwl4 ZW5fbWNfYmF0Y2goKTsgIC8qIGRpc2FibGVzIGludGVycnVwdHMgKi8KKworCS8qIFVwZGF0ZSB3 aGlsZSBpbnRlcnJ1cHRzIGFyZSBkaXNhYmxlZCwgc28gaXRzIGF0b21pYyB3aXRoCisJICAgcmVz cGVjdCB0byBpcGlzICovCisJdGhpc19jcHVfd3JpdGUoeGVuX2NyMywgY3IzKTsKKworCV9feGVu X3dyaXRlX2NyMyh0cnVlLCBjcjMpOworCisjaWZkZWYgQ09ORklHX1g4Nl82NAorCXsKKwkJcGdk X3QgKnVzZXJfcGdkID0geGVuX2dldF91c2VyX3BnZChfX3ZhKGNyMykpOworCQlpZiAodXNlcl9w Z2QpCisJCQlfX3hlbl93cml0ZV9jcjMoZmFsc2UsIF9fcGEodXNlcl9wZ2QpKTsKKwkJZWxzZQor CQkJX194ZW5fd3JpdGVfY3IzKGZhbHNlLCAwKTsKKwl9CisjZW5kaWYKKworCXhlbl9tY19pc3N1 ZShQQVJBVklSVF9MQVpZX0NQVSk7ICAvKiBpbnRlcnJ1cHRzIHJlc3RvcmVkICovCit9CisKKyNp ZmRlZiBDT05GSUdfWDg2XzY0CisvKgorICogQXQgdGhlIHN0YXJ0IG9mIHRoZSBkYXkgLSB3aGVu IFhlbiBsYXVuY2hlcyBhIGd1ZXN0LCBpdCBoYXMgYWxyZWFkeQorICogYnVpbHQgcGFnZXRhYmxl cyBmb3IgdGhlIGd1ZXN0LiBXZSBkaWxpZ2VudGx5IGxvb2sgb3ZlciB0aGVtCisgKiBpbiB4ZW5f c2V0dXBfa2VybmVsX3BhZ2V0YWJsZSBhbmQgZ3JhZnQgYXMgYXBwcm9wcmlhdGUgdGhlbSBpbiB0 aGUKKyAqIGluaXRfbGV2ZWw0X3BndCBhbmQgaXRzIGZyaWVuZHMuIFRoZW4gd2hlbiB3ZSBhcmUg aGFwcHkgd2UgbG9hZAorICogdGhlIG5ldyBpbml0X2xldmVsNF9wZ3QgLSBhbmQgY29udGludWUg b24uCisgKgorICogVGhlIGdlbmVyaWMgY29kZSBzdGFydHMgKHN0YXJ0X2tlcm5lbCkgYW5kICdp bml0X21lbV9tYXBwaW5nJyBzZXRzCisgKiB1cCB0aGUgcmVzdCBvZiB0aGUgcGFnZXRhYmxlcy4g V2hlbiBpdCBoYXMgY29tcGxldGVkIGl0IGxvYWRzIHRoZSBjcjMuCisgKiBOLkIuIHRoYXQgYmFy ZW1ldGFsIHdvdWxkIHN0YXJ0IGF0ICdzdGFydF9rZXJuZWwnIChhbmQgdGhlIGVhcmx5CisgKiAj UEYgaGFuZGxlciB3b3VsZCBjcmVhdGUgYm9vdHN0cmFwIHBhZ2V0YWJsZXMpIC0gc28gd2UgYXJl IHJ1bm5pbmcKKyAqIHdpdGggdGhlIHNhbWUgYXNzdW1wdGlvbnMgYXMgd2hhdCB0byBkbyB3aGVu IHdyaXRlX2NyMyBpcyBleGVjdXRlZAorICogYXQgdGhpcyBwb2ludC4KKyAqCisgKiBTaW5jZSB0 aGVyZSBhcmUgbm8gdXNlci1wYWdlIHRhYmxlcyBhdCBhbGwsIHdlIGhhdmUgdHdvIHZhcmlhbnRz CisgKiBvZiB4ZW5fd3JpdGVfY3IzIC0gdGhlIGVhcmx5IGJvb3R1cCAodGhpcyBvbmUpLCBhbmQg dGhlIGxhdGUgb25lCisgKiAoeGVuX3dyaXRlX2NyMykuIFRoZSByZWFzb24gd2UgaGF2ZSB0byBk byB0aGF0IGlzIHRoYXQgaW4gNjQtYml0CisgKiB0aGUgTGludXgga2VybmVsIGFuZCB1c2VyLXNw YWNlIGFyZSBib3RoIGluIHJpbmcgMyB3aGlsZSB0aGUKKyAqIGh5cGVydmlzb3IgaXMgaW4gcmlu ZyAwLgorICovCitzdGF0aWMgdm9pZCBfX2luaXQgeGVuX3dyaXRlX2NyM19pbml0KHVuc2lnbmVk IGxvbmcgY3IzKQoreworCUJVR19PTihwcmVlbXB0aWJsZSgpKTsKKworCXhlbl9tY19iYXRjaCgp OyAgLyogZGlzYWJsZXMgaW50ZXJydXB0cyAqLworCisJLyogVXBkYXRlIHdoaWxlIGludGVycnVw dHMgYXJlIGRpc2FibGVkLCBzbyBpdHMgYXRvbWljIHdpdGgKKwkgICByZXNwZWN0IHRvIGlwaXMg Ki8KKwl0aGlzX2NwdV93cml0ZSh4ZW5fY3IzLCBjcjMpOworCisJX194ZW5fd3JpdGVfY3IzKHRy dWUsIGNyMyk7CisKKwl4ZW5fbWNfaXNzdWUoUEFSQVZJUlRfTEFaWV9DUFUpOyAgLyogaW50ZXJy dXB0cyByZXN0b3JlZCAqLworfQorI2VuZGlmCisKK3N0YXRpYyBpbnQgeGVuX3BnZF9hbGxvYyhz dHJ1Y3QgbW1fc3RydWN0ICptbSkKK3sKKwlwZ2RfdCAqcGdkID0gbW0tPnBnZDsKKwlpbnQgcmV0 ID0gMDsKKworCUJVR19PTihQYWdlUGlubmVkKHZpcnRfdG9fcGFnZShwZ2QpKSk7CisKKyNpZmRl ZiBDT05GSUdfWDg2XzY0CisJeworCQlzdHJ1Y3QgcGFnZSAqcGFnZSA9IHZpcnRfdG9fcGFnZShw Z2QpOworCQlwZ2RfdCAqdXNlcl9wZ2Q7CisKKwkJQlVHX09OKHBhZ2UtPnByaXZhdGUgIT0gMCk7 CisKKwkJcmV0ID0gLUVOT01FTTsKKworCQl1c2VyX3BnZCA9IChwZ2RfdCAqKV9fZ2V0X2ZyZWVf cGFnZShHRlBfS0VSTkVMIHwgX19HRlBfWkVSTyk7CisJCXBhZ2UtPnByaXZhdGUgPSAodW5zaWdu ZWQgbG9uZyl1c2VyX3BnZDsKKworCQlpZiAodXNlcl9wZ2QgIT0gTlVMTCkgeworI2lmZGVmIENP TkZJR19YODZfVlNZU0NBTExfRU1VTEFUSU9OCisJCQl1c2VyX3BnZFtwZ2RfaW5kZXgoVlNZU0NB TExfQUREUildID0KKwkJCQlfX3BnZChfX3BhKGxldmVsM191c2VyX3ZzeXNjYWxsKSB8IF9QQUdF X1RBQkxFKTsKKyNlbmRpZgorCQkJcmV0ID0gMDsKKwkJfQorCisJCUJVR19PTihQYWdlUGlubmVk KHZpcnRfdG9fcGFnZSh4ZW5fZ2V0X3VzZXJfcGdkKHBnZCkpKSk7CisJfQorI2VuZGlmCisKKwly ZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCB4ZW5fcGdkX2ZyZWUoc3RydWN0IG1tX3N0cnVj dCAqbW0sIHBnZF90ICpwZ2QpCit7CisjaWZkZWYgQ09ORklHX1g4Nl82NAorCXBnZF90ICp1c2Vy X3BnZCA9IHhlbl9nZXRfdXNlcl9wZ2QocGdkKTsKKworCWlmICh1c2VyX3BnZCkKKwkJZnJlZV9w YWdlKCh1bnNpZ25lZCBsb25nKXVzZXJfcGdkKTsKKyNlbmRpZgorfQorCisvKgorICogSW5pdC10 aW1lIHNldF9wdGUgd2hpbGUgY29uc3RydWN0aW5nIGluaXRpYWwgcGFnZXRhYmxlcywgd2hpY2gK KyAqIGRvZXNuJ3QgYWxsb3cgUk8gcGFnZSB0YWJsZSBwYWdlcyB0byBiZSByZW1hcHBlZCBSVy4K KyAqCisgKiBJZiB0aGVyZSBpcyBubyBNRk4gZm9yIHRoaXMgUEZOIHRoZW4gdGhpcyBwYWdlIGlz IGluaXRpYWxseQorICogYmFsbG9vbmVkIG91dCBzbyBjbGVhciB0aGUgUFRFIChhcyBpbiBkZWNy ZWFzZV9yZXNlcnZhdGlvbigpIGluCisgKiBkcml2ZXJzL3hlbi9iYWxsb29uLmMpLgorICoKKyAq IE1hbnkgb2YgdGhlc2UgUFRFIHVwZGF0ZXMgYXJlIGRvbmUgb24gdW5waW5uZWQgYW5kIHdyaXRh YmxlIHBhZ2VzCisgKiBhbmQgZG9pbmcgYSBoeXBlcmNhbGwgZm9yIHRoZXNlIGlzIHVubmVjZXNz YXJ5IGFuZCBleHBlbnNpdmUuICBBdAorICogdGhpcyBwb2ludCBpdCBpcyBub3QgcG9zc2libGUg dG8gdGVsbCBpZiBhIHBhZ2UgaXMgcGlubmVkIG9yIG5vdCwKKyAqIHNvIGFsd2F5cyB3cml0ZSB0 aGUgUFRFIGRpcmVjdGx5IGFuZCByZWx5IG9uIFhlbiB0cmFwcGluZyBhbmQKKyAqIGVtdWxhdGlu ZyBhbnkgdXBkYXRlcyBhcyBuZWNlc3NhcnkuCisgKi8KK19fdmlzaWJsZSBwdGVfdCB4ZW5fbWFr ZV9wdGVfaW5pdChwdGV2YWxfdCBwdGUpCit7CisjaWZkZWYgQ09ORklHX1g4Nl82NAorCXVuc2ln bmVkIGxvbmcgcGZuOworCisJLyoKKwkgKiBQYWdlcyBiZWxvbmdpbmcgdG8gdGhlIGluaXRpYWwg cDJtIGxpc3QgbWFwcGVkIG91dHNpZGUgdGhlIGRlZmF1bHQKKwkgKiBhZGRyZXNzIHJhbmdlIG11 c3QgYmUgbWFwcGVkIHJlYWQtb25seS4gVGhpcyByZWdpb24gY29udGFpbnMgdGhlCisJICogcGFn ZSB0YWJsZXMgZm9yIG1hcHBpbmcgdGhlIHAybSBsaXN0LCB0b28sIGFuZCBwYWdlIHRhYmxlcyBN VVNUIGJlCisJICogbWFwcGVkIHJlYWQtb25seS4KKwkgKi8KKwlwZm4gPSAocHRlICYgUFRFX1BG Tl9NQVNLKSA+PiBQQUdFX1NISUZUOworCWlmICh4ZW5fc3RhcnRfaW5mby0+bWZuX2xpc3QgPCBf X1NUQVJUX0tFUk5FTF9tYXAgJiYKKwkgICAgcGZuID49IHhlbl9zdGFydF9pbmZvLT5maXJzdF9w Mm1fcGZuICYmCisJICAgIHBmbiA8IHhlbl9zdGFydF9pbmZvLT5maXJzdF9wMm1fcGZuICsgeGVu X3N0YXJ0X2luZm8tPm5yX3AybV9mcmFtZXMpCisJCXB0ZSAmPSB+X1BBR0VfUlc7CisjZW5kaWYK KwlwdGUgPSBwdGVfcGZuX3RvX21mbihwdGUpOworCXJldHVybiBuYXRpdmVfbWFrZV9wdGUocHRl KTsKK30KK1BWX0NBTExFRV9TQVZFX1JFR1NfVEhVTksoeGVuX21ha2VfcHRlX2luaXQpOworCitz dGF0aWMgdm9pZCBfX2luaXQgeGVuX3NldF9wdGVfaW5pdChwdGVfdCAqcHRlcCwgcHRlX3QgcHRl KQoreworI2lmZGVmIENPTkZJR19YODZfMzIKKwkvKiBJZiB0aGVyZSdzIGFuIGV4aXN0aW5nIHB0 ZSwgdGhlbiBkb24ndCBhbGxvdyBfUEFHRV9SVyB0byBiZSBzZXQgKi8KKwlpZiAocHRlX21mbihw dGUpICE9IElOVkFMSURfUDJNX0VOVFJZCisJICAgICYmIHB0ZV92YWxfbWEoKnB0ZXApICYgX1BB R0VfUFJFU0VOVCkKKwkJcHRlID0gX19wdGVfbWEoKChwdGVfdmFsX21hKCpwdGVwKSAmIF9QQUdF X1JXKSB8IH5fUEFHRV9SVykgJgorCQkJICAgICAgIHB0ZV92YWxfbWEocHRlKSk7CisjZW5kaWYK KwluYXRpdmVfc2V0X3B0ZShwdGVwLCBwdGUpOworfQorCisvKiBFYXJseSBpbiBib290LCB3aGls ZSBzZXR0aW5nIHVwIHRoZSBpbml0aWFsIHBhZ2V0YWJsZSwgYXNzdW1lCisgICBldmVyeXRoaW5n IGlzIHBpbm5lZC4gKi8KK3N0YXRpYyB2b2lkIF9faW5pdCB4ZW5fYWxsb2NfcHRlX2luaXQoc3Ry dWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgcGZuKQoreworI2lmZGVmIENPTkZJR19G TEFUTUVNCisJQlVHX09OKG1lbV9tYXApOwkvKiBzaG91bGQgb25seSBiZSB1c2VkIGVhcmx5ICov CisjZW5kaWYKKwltYWtlX2xvd21lbV9wYWdlX3JlYWRvbmx5KF9fdmEoUEZOX1BIWVMocGZuKSkp OworCXBpbl9wYWdldGFibGVfcGZuKE1NVUVYVF9QSU5fTDFfVEFCTEUsIHBmbik7Cit9CisKKy8q IFVzZWQgZm9yIHBtZCBhbmQgcHVkICovCitzdGF0aWMgdm9pZCBfX2luaXQgeGVuX2FsbG9jX3Bt ZF9pbml0KHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIHBmbikKK3sKKyNpZmRl ZiBDT05GSUdfRkxBVE1FTQorCUJVR19PTihtZW1fbWFwKTsJLyogc2hvdWxkIG9ubHkgYmUgdXNl ZCBlYXJseSAqLworI2VuZGlmCisJbWFrZV9sb3dtZW1fcGFnZV9yZWFkb25seShfX3ZhKFBGTl9Q SFlTKHBmbikpKTsKK30KKworLyogRWFybHkgcmVsZWFzZV9wdGUgYXNzdW1lcyB0aGF0IGFsbCBw dHMgYXJlIHBpbm5lZCwgc2luY2UgdGhlcmUncworICAgb25seSBpbml0X21tIGFuZCBhbnl0aGlu ZyBhdHRhY2hlZCB0byB0aGF0IGlzIHBpbm5lZC4gKi8KK3N0YXRpYyB2b2lkIF9faW5pdCB4ZW5f cmVsZWFzZV9wdGVfaW5pdCh1bnNpZ25lZCBsb25nIHBmbikKK3sKKwlwaW5fcGFnZXRhYmxlX3Bm bihNTVVFWFRfVU5QSU5fVEFCTEUsIHBmbik7CisJbWFrZV9sb3dtZW1fcGFnZV9yZWFkd3JpdGUo X192YShQRk5fUEhZUyhwZm4pKSk7Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCB4ZW5fcmVsZWFz ZV9wbWRfaW5pdCh1bnNpZ25lZCBsb25nIHBmbikKK3sKKwltYWtlX2xvd21lbV9wYWdlX3JlYWR3 cml0ZShfX3ZhKFBGTl9QSFlTKHBmbikpKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIF9fcGlu X3BhZ2V0YWJsZV9wZm4odW5zaWduZWQgY21kLCB1bnNpZ25lZCBsb25nIHBmbikKK3sKKwlzdHJ1 Y3QgbXVsdGljYWxsX3NwYWNlIG1jczsKKwlzdHJ1Y3QgbW11ZXh0X29wICpvcDsKKworCW1jcyA9 IF9feGVuX21jX2VudHJ5KHNpemVvZigqb3ApKTsKKwlvcCA9IG1jcy5hcmdzOworCW9wLT5jbWQg PSBjbWQ7CisJb3AtPmFyZzEubWZuID0gcGZuX3RvX21mbihwZm4pOworCisJTVVMVElfbW11ZXh0 X29wKG1jcy5tYywgbWNzLmFyZ3MsIDEsIE5VTEwsIERPTUlEX1NFTEYpOworfQorCitzdGF0aWMg aW5saW5lIHZvaWQgX19zZXRfcGZuX3Byb3QodW5zaWduZWQgbG9uZyBwZm4sIHBncHJvdF90IHBy b3QpCit7CisJc3RydWN0IG11bHRpY2FsbF9zcGFjZSBtY3M7CisJdW5zaWduZWQgbG9uZyBhZGRy ID0gKHVuc2lnbmVkIGxvbmcpX192YShwZm4gPDwgUEFHRV9TSElGVCk7CisKKwltY3MgPSBfX3hl bl9tY19lbnRyeSgwKTsKKwlNVUxUSV91cGRhdGVfdmFfbWFwcGluZyhtY3MubWMsICh1bnNpZ25l ZCBsb25nKWFkZHIsCisJCQkJcGZuX3B0ZShwZm4sIHByb3QpLCAwKTsKK30KKworLyogVGhpcyBu ZWVkcyB0byBtYWtlIHN1cmUgdGhlIG5ldyBwdGUgcGFnZSBpcyBwaW5uZWQgaWZmIGl0cyBiZWlu ZworICAgYXR0YWNoZWQgdG8gYSBwaW5uZWQgcGFnZXRhYmxlLiAqLworc3RhdGljIGlubGluZSB2 b2lkIHhlbl9hbGxvY19wdHBhZ2Uoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcg cGZuLAorCQkJCSAgICB1bnNpZ25lZCBsZXZlbCkKK3sKKwlib29sIHBpbm5lZCA9IFBhZ2VQaW5u ZWQodmlydF90b19wYWdlKG1tLT5wZ2QpKTsKKworCXRyYWNlX3hlbl9tbXVfYWxsb2NfcHRwYWdl KG1tLCBwZm4sIGxldmVsLCBwaW5uZWQpOworCisJaWYgKHBpbm5lZCkgeworCQlzdHJ1Y3QgcGFn ZSAqcGFnZSA9IHBmbl90b19wYWdlKHBmbik7CisKKwkJU2V0UGFnZVBpbm5lZChwYWdlKTsKKwor CQlpZiAoIVBhZ2VIaWdoTWVtKHBhZ2UpKSB7CisJCQl4ZW5fbWNfYmF0Y2goKTsKKworCQkJX19z ZXRfcGZuX3Byb3QocGZuLCBQQUdFX0tFUk5FTF9STyk7CisKKwkJCWlmIChsZXZlbCA9PSBQVF9Q VEUgJiYgVVNFX1NQTElUX1BURV9QVExPQ0tTKQorCQkJCV9fcGluX3BhZ2V0YWJsZV9wZm4oTU1V RVhUX1BJTl9MMV9UQUJMRSwgcGZuKTsKKworCQkJeGVuX21jX2lzc3VlKFBBUkFWSVJUX0xBWllf TU1VKTsKKwkJfSBlbHNlIHsKKwkJCS8qIG1ha2Ugc3VyZSB0aGVyZSBhcmUgbm8gc3RyYXkgbWFw cGluZ3Mgb2YKKwkJCSAgIHRoaXMgcGFnZSAqLworCQkJa21hcF9mbHVzaF91bnVzZWQoKTsKKwkJ fQorCX0KK30KKworc3RhdGljIHZvaWQgeGVuX2FsbG9jX3B0ZShzdHJ1Y3QgbW1fc3RydWN0ICpt bSwgdW5zaWduZWQgbG9uZyBwZm4pCit7CisJeGVuX2FsbG9jX3B0cGFnZShtbSwgcGZuLCBQVF9Q VEUpOworfQorCitzdGF0aWMgdm9pZCB4ZW5fYWxsb2NfcG1kKHN0cnVjdCBtbV9zdHJ1Y3QgKm1t LCB1bnNpZ25lZCBsb25nIHBmbikKK3sKKwl4ZW5fYWxsb2NfcHRwYWdlKG1tLCBwZm4sIFBUX1BN RCk7Cit9CisKKy8qIFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbiB1bnRpbCB3ZSdyZSBPSyB0byB1 c2Ugc3RydWN0IHBhZ2UgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCB4ZW5fcmVsZWFzZV9wdHBhZ2Uo dW5zaWduZWQgbG9uZyBwZm4sIHVuc2lnbmVkIGxldmVsKQoreworCXN0cnVjdCBwYWdlICpwYWdl ID0gcGZuX3RvX3BhZ2UocGZuKTsKKwlib29sIHBpbm5lZCA9IFBhZ2VQaW5uZWQocGFnZSk7CisK Kwl0cmFjZV94ZW5fbW11X3JlbGVhc2VfcHRwYWdlKHBmbiwgbGV2ZWwsIHBpbm5lZCk7CisKKwlp ZiAocGlubmVkKSB7CisJCWlmICghUGFnZUhpZ2hNZW0ocGFnZSkpIHsKKwkJCXhlbl9tY19iYXRj aCgpOworCisJCQlpZiAobGV2ZWwgPT0gUFRfUFRFICYmIFVTRV9TUExJVF9QVEVfUFRMT0NLUykK KwkJCQlfX3Bpbl9wYWdldGFibGVfcGZuKE1NVUVYVF9VTlBJTl9UQUJMRSwgcGZuKTsKKworCQkJ X19zZXRfcGZuX3Byb3QocGZuLCBQQUdFX0tFUk5FTCk7CisKKwkJCXhlbl9tY19pc3N1ZShQQVJB VklSVF9MQVpZX01NVSk7CisJCX0KKwkJQ2xlYXJQYWdlUGlubmVkKHBhZ2UpOworCX0KK30KKwor c3RhdGljIHZvaWQgeGVuX3JlbGVhc2VfcHRlKHVuc2lnbmVkIGxvbmcgcGZuKQoreworCXhlbl9y ZWxlYXNlX3B0cGFnZShwZm4sIFBUX1BURSk7Cit9CisKK3N0YXRpYyB2b2lkIHhlbl9yZWxlYXNl X3BtZCh1bnNpZ25lZCBsb25nIHBmbikKK3sKKwl4ZW5fcmVsZWFzZV9wdHBhZ2UocGZuLCBQVF9Q TUQpOworfQorCisjaWYgQ09ORklHX1BHVEFCTEVfTEVWRUxTID09IDQKK3N0YXRpYyB2b2lkIHhl bl9hbGxvY19wdWQoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgcGZuKQorewor CXhlbl9hbGxvY19wdHBhZ2UobW0sIHBmbiwgUFRfUFVEKTsKK30KKworc3RhdGljIHZvaWQgeGVu X3JlbGVhc2VfcHVkKHVuc2lnbmVkIGxvbmcgcGZuKQoreworCXhlbl9yZWxlYXNlX3B0cGFnZShw Zm4sIFBUX1BVRCk7Cit9CisjZW5kaWYKKwordm9pZCBfX2luaXQgeGVuX3Jlc2VydmVfdG9wKHZv aWQpCit7CisjaWZkZWYgQ09ORklHX1g4Nl8zMgorCXVuc2lnbmVkIGxvbmcgdG9wID0gSFlQRVJW SVNPUl9WSVJUX1NUQVJUOworCXN0cnVjdCB4ZW5fcGxhdGZvcm1fcGFyYW1ldGVycyBwcDsKKwor CWlmIChIWVBFUlZJU09SX3hlbl92ZXJzaW9uKFhFTlZFUl9wbGF0Zm9ybV9wYXJhbWV0ZXJzLCAm cHApID09IDApCisJCXRvcCA9IHBwLnZpcnRfc3RhcnQ7CisKKwlyZXNlcnZlX3RvcF9hZGRyZXNz KC10b3ApOworI2VuZGlmCS8qIENPTkZJR19YODZfMzIgKi8KK30KKworLyoKKyAqIExpa2UgX192 YSgpLCBidXQgcmV0dXJucyBhZGRyZXNzIGluIHRoZSBrZXJuZWwgbWFwcGluZyAod2hpY2ggaXMK KyAqIGFsbCB3ZSBoYXZlIHVudGlsIHRoZSBwaHlzaWNhbCBtZW1vcnkgbWFwcGluZyBoYXMgYmVl biBzZXQgdXAuCisgKi8KK3N0YXRpYyB2b2lkICogX19pbml0IF9fa2EocGh5c19hZGRyX3QgcGFk ZHIpCit7CisjaWZkZWYgQ09ORklHX1g4Nl82NAorCXJldHVybiAodm9pZCAqKShwYWRkciArIF9f U1RBUlRfS0VSTkVMX21hcCk7CisjZWxzZQorCXJldHVybiBfX3ZhKHBhZGRyKTsKKyNlbmRpZgor fQorCisvKiBDb252ZXJ0IGEgbWFjaGluZSBhZGRyZXNzIHRvIHBoeXNpY2FsIGFkZHJlc3MgKi8K K3N0YXRpYyB1bnNpZ25lZCBsb25nIF9faW5pdCBtMnAocGh5c19hZGRyX3QgbWFkZHIpCit7CisJ cGh5c19hZGRyX3QgcGFkZHI7CisKKwltYWRkciAmPSBQVEVfUEZOX01BU0s7CisJcGFkZHIgPSBt Zm5fdG9fcGZuKG1hZGRyID4+IFBBR0VfU0hJRlQpIDw8IFBBR0VfU0hJRlQ7CisKKwlyZXR1cm4g cGFkZHI7Cit9CisKKy8qIENvbnZlcnQgYSBtYWNoaW5lIGFkZHJlc3MgdG8ga2VybmVsIHZpcnR1 YWwgKi8KK3N0YXRpYyB2b2lkICogX19pbml0IG0ydihwaHlzX2FkZHJfdCBtYWRkcikKK3sKKwly ZXR1cm4gX19rYShtMnAobWFkZHIpKTsKK30KKworLyogU2V0IHRoZSBwYWdlIHBlcm1pc3Npb25z IG9uIGFuIGlkZW50aXR5LW1hcHBlZCBwYWdlcyAqLworc3RhdGljIHZvaWQgX19pbml0IHNldF9w YWdlX3Byb3RfZmxhZ3Modm9pZCAqYWRkciwgcGdwcm90X3QgcHJvdCwKKwkJCQkgICAgICAgdW5z aWduZWQgbG9uZyBmbGFncykKK3sKKwl1bnNpZ25lZCBsb25nIHBmbiA9IF9fcGEoYWRkcikgPj4g UEFHRV9TSElGVDsKKwlwdGVfdCBwdGUgPSBwZm5fcHRlKHBmbiwgcHJvdCk7CisKKwlpZiAoSFlQ RVJWSVNPUl91cGRhdGVfdmFfbWFwcGluZygodW5zaWduZWQgbG9uZylhZGRyLCBwdGUsIGZsYWdz KSkKKwkJQlVHKCk7Cit9CitzdGF0aWMgdm9pZCBfX2luaXQgc2V0X3BhZ2VfcHJvdCh2b2lkICph ZGRyLCBwZ3Byb3RfdCBwcm90KQoreworCXJldHVybiBzZXRfcGFnZV9wcm90X2ZsYWdzKGFkZHIs IHByb3QsIFVWTUZfTk9ORSk7Cit9CisjaWZkZWYgQ09ORklHX1g4Nl8zMgorc3RhdGljIHZvaWQg X19pbml0IHhlbl9tYXBfaWRlbnRpdHlfZWFybHkocG1kX3QgKnBtZCwgdW5zaWduZWQgbG9uZyBt YXhfcGZuKQoreworCXVuc2lnbmVkIHBtZGlkeCwgcHRlaWR4OworCXVuc2lnbmVkIGlkZW50X3B0 ZTsKKwl1bnNpZ25lZCBsb25nIHBmbjsKKworCWxldmVsMV9pZGVudF9wZ3QgPSBleHRlbmRfYnJr KHNpemVvZihwdGVfdCkgKiBMRVZFTDFfSURFTlRfRU5UUklFUywKKwkJCQkgICAgICBQQUdFX1NJ WkUpOworCisJaWRlbnRfcHRlID0gMDsKKwlwZm4gPSAwOworCWZvciAocG1kaWR4ID0gMDsgcG1k aWR4IDwgUFRSU19QRVJfUE1EICYmIHBmbiA8IG1heF9wZm47IHBtZGlkeCsrKSB7CisJCXB0ZV90 ICpwdGVfcGFnZTsKKworCQkvKiBSZXVzZSBvciBhbGxvY2F0ZSBhIHBhZ2Ugb2YgcHRlcyAqLwor CQlpZiAocG1kX3ByZXNlbnQocG1kW3BtZGlkeF0pKQorCQkJcHRlX3BhZ2UgPSBtMnYocG1kW3Bt ZGlkeF0ucG1kKTsKKwkJZWxzZSB7CisJCQkvKiBDaGVjayBmb3IgZnJlZSBwdGUgcGFnZXMgKi8K KwkJCWlmIChpZGVudF9wdGUgPT0gTEVWRUwxX0lERU5UX0VOVFJJRVMpCisJCQkJYnJlYWs7CisK KwkJCXB0ZV9wYWdlID0gJmxldmVsMV9pZGVudF9wZ3RbaWRlbnRfcHRlXTsKKwkJCWlkZW50X3B0 ZSArPSBQVFJTX1BFUl9QVEU7CisKKwkJCXBtZFtwbWRpZHhdID0gX19wbWQoX19wYShwdGVfcGFn ZSkgfCBfUEFHRV9UQUJMRSk7CisJCX0KKworCQkvKiBJbnN0YWxsIG1hcHBpbmdzICovCisJCWZv ciAocHRlaWR4ID0gMDsgcHRlaWR4IDwgUFRSU19QRVJfUFRFOyBwdGVpZHgrKywgcGZuKyspIHsK KwkJCXB0ZV90IHB0ZTsKKworCQkJaWYgKHBmbiA+IG1heF9wZm5fbWFwcGVkKQorCQkJCW1heF9w Zm5fbWFwcGVkID0gcGZuOworCisJCQlpZiAoIXB0ZV9ub25lKHB0ZV9wYWdlW3B0ZWlkeF0pKQor CQkJCWNvbnRpbnVlOworCisJCQlwdGUgPSBwZm5fcHRlKHBmbiwgUEFHRV9LRVJORUxfRVhFQyk7 CisJCQlwdGVfcGFnZVtwdGVpZHhdID0gcHRlOworCQl9CisJfQorCisJZm9yIChwdGVpZHggPSAw OyBwdGVpZHggPCBpZGVudF9wdGU7IHB0ZWlkeCArPSBQVFJTX1BFUl9QVEUpCisJCXNldF9wYWdl X3Byb3QoJmxldmVsMV9pZGVudF9wZ3RbcHRlaWR4XSwgUEFHRV9LRVJORUxfUk8pOworCisJc2V0 X3BhZ2VfcHJvdChwbWQsIFBBR0VfS0VSTkVMX1JPKTsKK30KKyNlbmRpZgordm9pZCBfX2luaXQg eGVuX3NldHVwX21hY2hwaHlzX21hcHBpbmcodm9pZCkKK3sKKwlzdHJ1Y3QgeGVuX21hY2hwaHlz X21hcHBpbmcgbWFwcGluZzsKKworCWlmIChIWVBFUlZJU09SX21lbW9yeV9vcChYRU5NRU1fbWFj aHBoeXNfbWFwcGluZywgJm1hcHBpbmcpID09IDApIHsKKwkJbWFjaGluZV90b19waHlzX21hcHBp bmcgPSAodW5zaWduZWQgbG9uZyAqKW1hcHBpbmcudl9zdGFydDsKKwkJbWFjaGluZV90b19waHlz X25yID0gbWFwcGluZy5tYXhfbWZuICsgMTsKKwl9IGVsc2UgeworCQltYWNoaW5lX3RvX3BoeXNf bnIgPSBNQUNIMlBIWVNfTlJfRU5UUklFUzsKKwl9CisjaWZkZWYgQ09ORklHX1g4Nl8zMgorCVdB Uk5fT04oKG1hY2hpbmVfdG9fcGh5c19tYXBwaW5nICsgKG1hY2hpbmVfdG9fcGh5c19uciAtIDEp KQorCQk8IG1hY2hpbmVfdG9fcGh5c19tYXBwaW5nKTsKKyNlbmRpZgorfQorCisjaWZkZWYgQ09O RklHX1g4Nl82NAorc3RhdGljIHZvaWQgX19pbml0IGNvbnZlcnRfcGZuX21mbih2b2lkICp2KQor eworCXB0ZV90ICpwdGUgPSB2OworCWludCBpOworCisJLyogQWxsIGxldmVscyBhcmUgY29udmVy dGVkIHRoZSBzYW1lIHdheSwgc28ganVzdCB0cmVhdCB0aGVtCisJICAgYXMgcHRlcy4gKi8KKwlm b3IgKGkgPSAwOyBpIDwgUFRSU19QRVJfUFRFOyBpKyspCisJCXB0ZVtpXSA9IHhlbl9tYWtlX3B0 ZShwdGVbaV0ucHRlKTsKK30KK3N0YXRpYyB2b2lkIF9faW5pdCBjaGVja19wdF9iYXNlKHVuc2ln bmVkIGxvbmcgKnB0X2Jhc2UsIHVuc2lnbmVkIGxvbmcgKnB0X2VuZCwKKwkJCQkgdW5zaWduZWQg bG9uZyBhZGRyKQoreworCWlmICgqcHRfYmFzZSA9PSBQRk5fRE9XTihfX3BhKGFkZHIpKSkgewor CQlzZXRfcGFnZV9wcm90X2ZsYWdzKCh2b2lkICopYWRkciwgUEFHRV9LRVJORUwsIFVWTUZfSU5W TFBHKTsKKwkJY2xlYXJfcGFnZSgodm9pZCAqKWFkZHIpOworCQkoKnB0X2Jhc2UpKys7CisJfQor CWlmICgqcHRfZW5kID09IFBGTl9ET1dOKF9fcGEoYWRkcikpKSB7CisJCXNldF9wYWdlX3Byb3Rf ZmxhZ3MoKHZvaWQgKilhZGRyLCBQQUdFX0tFUk5FTCwgVVZNRl9JTlZMUEcpOworCQljbGVhcl9w YWdlKCh2b2lkICopYWRkcik7CisJCSgqcHRfZW5kKS0tOworCX0KK30KKy8qCisgKiBTZXQgdXAg dGhlIGluaXRpYWwga2VybmVsIHBhZ2V0YWJsZS4KKyAqCisgKiBXZSBjYW4gY29uc3RydWN0IHRo aXMgYnkgZ3JhZnRpbmcgdGhlIFhlbiBwcm92aWRlZCBwYWdldGFibGUgaW50bworICogaGVhZF82 NC5TJ3MgcHJlY29uc3RydWN0ZWQgcGFnZXRhYmxlcy4gIFdlIGNvcHkgdGhlIFhlbiBMMidzIGlu dG8KKyAqIGxldmVsMl9pZGVudF9wZ3QsIGFuZCBsZXZlbDJfa2VybmVsX3BndC4gIFRoaXMgbWVh bnMgdGhhdCBvbmx5IHRoZQorICoga2VybmVsIGhhcyBhIHBoeXNpY2FsIG1hcHBpbmcgdG8gc3Rh cnQgd2l0aCAtIGJ1dCB0aGF0J3MgZW5vdWdoIHRvCisgKiBnZXQgX192YSB3b3JraW5nLiAgV2Ug bmVlZCB0byBmaWxsIGluIHRoZSByZXN0IG9mIHRoZSBwaHlzaWNhbAorICogbWFwcGluZyBvbmNl IHNvbWUgc29ydCBvZiBhbGxvY2F0b3IgaGFzIGJlZW4gc2V0IHVwLgorICovCit2b2lkIF9faW5p dCB4ZW5fc2V0dXBfa2VybmVsX3BhZ2V0YWJsZShwZ2RfdCAqcGdkLCB1bnNpZ25lZCBsb25nIG1h eF9wZm4pCit7CisJcHVkX3QgKmwzOworCXBtZF90ICpsMjsKKwl1bnNpZ25lZCBsb25nIGFkZHJb M107CisJdW5zaWduZWQgbG9uZyBwdF9iYXNlLCBwdF9lbmQ7CisJdW5zaWduZWQgaTsKKworCS8q IG1heF9wZm5fbWFwcGVkIGlzIHRoZSBsYXN0IHBmbiBtYXBwZWQgaW4gdGhlIGluaXRpYWwgbWVt b3J5CisJICogbWFwcGluZ3MuIENvbnNpZGVyaW5nIHRoYXQgb24gWGVuIGFmdGVyIHRoZSBrZXJu ZWwgbWFwcGluZ3Mgd2UKKwkgKiBoYXZlIHRoZSBtYXBwaW5ncyBvZiBzb21lIHBhZ2VzIHRoYXQg ZG9uJ3QgZXhpc3QgaW4gcGZuIHNwYWNlLCB3ZQorCSAqIHNldCBtYXhfcGZuX21hcHBlZCB0byB0 aGUgbGFzdCByZWFsIHBmbiBtYXBwZWQuICovCisJaWYgKHhlbl9zdGFydF9pbmZvLT5tZm5fbGlz dCA8IF9fU1RBUlRfS0VSTkVMX21hcCkKKwkJbWF4X3Bmbl9tYXBwZWQgPSB4ZW5fc3RhcnRfaW5m by0+Zmlyc3RfcDJtX3BmbjsKKwllbHNlCisJCW1heF9wZm5fbWFwcGVkID0gUEZOX0RPV04oX19w YSh4ZW5fc3RhcnRfaW5mby0+bWZuX2xpc3QpKTsKKworCXB0X2Jhc2UgPSBQRk5fRE9XTihfX3Bh KHhlbl9zdGFydF9pbmZvLT5wdF9iYXNlKSk7CisJcHRfZW5kID0gcHRfYmFzZSArIHhlbl9zdGFy dF9pbmZvLT5ucl9wdF9mcmFtZXM7CisKKwkvKiBaYXAgaWRlbnRpdHkgbWFwcGluZyAqLworCWlu aXRfbGV2ZWw0X3BndFswXSA9IF9fcGdkKDApOworCisJaWYgKCF4ZW5fZmVhdHVyZShYRU5GRUFU X2F1dG9fdHJhbnNsYXRlZF9waHlzbWFwKSkgeworCQkvKiBQcmUtY29uc3RydWN0ZWQgZW50cmll cyBhcmUgaW4gcGZuLCBzbyBjb252ZXJ0IHRvIG1mbiAqLworCQkvKiBMNFsyNzJdIC0+IGxldmVs M19pZGVudF9wZ3QKKwkJICogTDRbNTExXSAtPiBsZXZlbDNfa2VybmVsX3BndCAqLworCQljb252 ZXJ0X3Bmbl9tZm4oaW5pdF9sZXZlbDRfcGd0KTsKKworCQkvKiBMM19pWzBdIC0+IGxldmVsMl9p ZGVudF9wZ3QgKi8KKwkJY29udmVydF9wZm5fbWZuKGxldmVsM19pZGVudF9wZ3QpOworCQkvKiBM M19rWzUxMF0gLT4gbGV2ZWwyX2tlcm5lbF9wZ3QKKwkJICogTDNfa1s1MTFdIC0+IGxldmVsMl9m aXhtYXBfcGd0ICovCisJCWNvbnZlcnRfcGZuX21mbihsZXZlbDNfa2VybmVsX3BndCk7CisKKwkJ LyogTDNfa1s1MTFdWzUwNl0gLT4gbGV2ZWwxX2ZpeG1hcF9wZ3QgKi8KKwkJY29udmVydF9wZm5f bWZuKGxldmVsMl9maXhtYXBfcGd0KTsKKwl9CisJLyogV2UgZ2V0IFs1MTFdWzUxMV0gYW5kIGhh dmUgWGVuJ3MgdmVyc2lvbiBvZiBsZXZlbDJfa2VybmVsX3BndCAqLworCWwzID0gbTJ2KHBnZFtw Z2RfaW5kZXgoX19TVEFSVF9LRVJORUxfbWFwKV0ucGdkKTsKKwlsMiA9IG0ydihsM1twdWRfaW5k ZXgoX19TVEFSVF9LRVJORUxfbWFwKV0ucHVkKTsKKworCWFkZHJbMF0gPSAodW5zaWduZWQgbG9u ZylwZ2Q7CisJYWRkclsxXSA9ICh1bnNpZ25lZCBsb25nKWwzOworCWFkZHJbMl0gPSAodW5zaWdu ZWQgbG9uZylsMjsKKwkvKiBHcmFmdCBpdCBvbnRvIEw0WzI3Ml1bMF0uIE5vdGUgdGhhdCB3ZSBj cmVhdGluZyBhbiBhbGlhc2luZyBwcm9ibGVtOgorCSAqIEJvdGggTDRbMjcyXVswXSBhbmQgTDRb NTExXVs1MTBdIGhhdmUgZW50cmllcyB0aGF0IHBvaW50IHRvIHRoZSBzYW1lCisJICogTDIgKFBN RCkgdGFibGVzLiBNZWFuaW5nIHRoYXQgaWYgeW91IG1vZGlmeSBpdCBpbiBfX3ZhIHNwYWNlCisJ ICogaXQgd2lsbCBiZSBhbHNvIG1vZGlmaWVkIGluIHRoZSBfX2thIHNwYWNlISAoQnV0IGlmIHlv dSBqdXN0CisJICogbW9kaWZ5IHRoZSBQTUQgdGFibGUgdG8gcG9pbnQgdG8gb3RoZXIgUFRFJ3Mg b3Igbm9uZSwgdGhlbiB5b3UKKwkgKiBhcmUgT0sgLSB3aGljaCBpcyB3aGF0IGNsZWFudXBfaGln aG1hcCBkb2VzKSAqLworCWNvcHlfcGFnZShsZXZlbDJfaWRlbnRfcGd0LCBsMik7CisJLyogR3Jh ZnQgaXQgb250byBMNFs1MTFdWzUxMF0gKi8KKwljb3B5X3BhZ2UobGV2ZWwyX2tlcm5lbF9wZ3Qs IGwyKTsKKworCS8qIENvcHkgdGhlIGluaXRpYWwgUC0+TSB0YWJsZSBtYXBwaW5ncyBpZiBuZWNl c3NhcnkuICovCisJaSA9IHBnZF9pbmRleCh4ZW5fc3RhcnRfaW5mby0+bWZuX2xpc3QpOworCWlm IChpICYmIGkgPCBwZ2RfaW5kZXgoX19TVEFSVF9LRVJORUxfbWFwKSkKKwkJaW5pdF9sZXZlbDRf cGd0W2ldID0gKChwZ2RfdCAqKXhlbl9zdGFydF9pbmZvLT5wdF9iYXNlKVtpXTsKKworCWlmICgh eGVuX2ZlYXR1cmUoWEVORkVBVF9hdXRvX3RyYW5zbGF0ZWRfcGh5c21hcCkpIHsKKwkJLyogTWFr ZSBwYWdldGFibGUgcGllY2VzIFJPICovCisJCXNldF9wYWdlX3Byb3QoaW5pdF9sZXZlbDRfcGd0 LCBQQUdFX0tFUk5FTF9STyk7CisJCXNldF9wYWdlX3Byb3QobGV2ZWwzX2lkZW50X3BndCwgUEFH RV9LRVJORUxfUk8pOworCQlzZXRfcGFnZV9wcm90KGxldmVsM19rZXJuZWxfcGd0LCBQQUdFX0tF Uk5FTF9STyk7CisJCXNldF9wYWdlX3Byb3QobGV2ZWwzX3VzZXJfdnN5c2NhbGwsIFBBR0VfS0VS TkVMX1JPKTsKKwkJc2V0X3BhZ2VfcHJvdChsZXZlbDJfaWRlbnRfcGd0LCBQQUdFX0tFUk5FTF9S Tyk7CisJCXNldF9wYWdlX3Byb3QobGV2ZWwyX2tlcm5lbF9wZ3QsIFBBR0VfS0VSTkVMX1JPKTsK KwkJc2V0X3BhZ2VfcHJvdChsZXZlbDJfZml4bWFwX3BndCwgUEFHRV9LRVJORUxfUk8pOworCQlz ZXRfcGFnZV9wcm90KGxldmVsMV9maXhtYXBfcGd0LCBQQUdFX0tFUk5FTF9STyk7CisKKwkJLyog UGluIGRvd24gbmV3IEw0ICovCisJCXBpbl9wYWdldGFibGVfcGZuKE1NVUVYVF9QSU5fTDRfVEFC TEUsCisJCQkJICBQRk5fRE9XTihfX3BhX3N5bWJvbChpbml0X2xldmVsNF9wZ3QpKSk7CisKKwkJ LyogVW5waW4gWGVuLXByb3ZpZGVkIG9uZSAqLworCQlwaW5fcGFnZXRhYmxlX3BmbihNTVVFWFRf VU5QSU5fVEFCTEUsIFBGTl9ET1dOKF9fcGEocGdkKSkpOworCisJCS8qCisJCSAqIEF0IHRoaXMg c3RhZ2UgdGhlcmUgY2FuIGJlIG5vIHVzZXIgcGdkLCBhbmQgbm8gcGFnZQorCQkgKiBzdHJ1Y3R1 cmUgdG8gYXR0YWNoIGl0IHRvLCBzbyBtYWtlIHN1cmUgd2UganVzdCBzZXQga2VybmVsCisJCSAq IHBnZC4KKwkJICovCisJCXhlbl9tY19iYXRjaCgpOworCQlfX3hlbl93cml0ZV9jcjModHJ1ZSwg X19wYShpbml0X2xldmVsNF9wZ3QpKTsKKwkJeGVuX21jX2lzc3VlKFBBUkFWSVJUX0xBWllfQ1BV KTsKKwl9IGVsc2UKKwkJbmF0aXZlX3dyaXRlX2NyMyhfX3BhKGluaXRfbGV2ZWw0X3BndCkpOwor CisJLyogV2UgY2FuJ3QgdGhhdCBlYXNpbHkgcmlwIG91dCBMMyBhbmQgTDIsIGFzIHRoZSBYZW4g cGFnZXRhYmxlcyBhcmUKKwkgKiBzZXQgb3V0IHRoaXMgd2F5OiBbTDRdLCBbTDFdLCBbTDJdLCBb TDNdLCBbTDFdLCBbTDFdIC4uLiAgZm9yCisJICogdGhlIGluaXRpYWwgZG9tYWluLiBGb3IgZ3Vl c3RzIHVzaW5nIHRoZSB0b29sc3RhY2ssIHRoZXkgYXJlIGluOgorCSAqIFtMNF0sIFtMM10sIFtM Ml0sIFtMMV0sIFtMMV0sIG9yZGVyIC4uIFNvIGZvciBkb20wIHdlIGNhbiBvbmx5CisJICogcmlw IG91dCB0aGUgW0w0XSAocGdkKSwgYnV0IGZvciBndWVzdHMgd2Ugc2hhdmUgb2ZmIHRocmVlIHBh Z2VzLgorCSAqLworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGFkZHIpOyBpKyspCisJCWNo ZWNrX3B0X2Jhc2UoJnB0X2Jhc2UsICZwdF9lbmQsIGFkZHJbaV0pOworCisJLyogT3VyIChieSB0 aHJlZSBwYWdlcykgc21hbGxlciBYZW4gcGFnZXRhYmxlIHRoYXQgd2UgYXJlIHVzaW5nICovCisJ eGVuX3B0X2Jhc2UgPSBQRk5fUEhZUyhwdF9iYXNlKTsKKwl4ZW5fcHRfc2l6ZSA9IChwdF9lbmQg LSBwdF9iYXNlKSAqIFBBR0VfU0laRTsKKwltZW1ibG9ja19yZXNlcnZlKHhlbl9wdF9iYXNlLCB4 ZW5fcHRfc2l6ZSk7CisKKwkvKiBSZXZlY3RvciB0aGUgeGVuX3N0YXJ0X2luZm8gKi8KKwl4ZW5f c3RhcnRfaW5mbyA9IChzdHJ1Y3Qgc3RhcnRfaW5mbyAqKV9fdmEoX19wYSh4ZW5fc3RhcnRfaW5m bykpOworfQorCisvKgorICogUmVhZCBhIHZhbHVlIGZyb20gYSBwaHlzaWNhbCBhZGRyZXNzLgor ICovCitzdGF0aWMgdW5zaWduZWQgbG9uZyBfX2luaXQgeGVuX3JlYWRfcGh5c191bG9uZyhwaHlz X2FkZHJfdCBhZGRyKQoreworCXVuc2lnbmVkIGxvbmcgKnZhZGRyOworCXVuc2lnbmVkIGxvbmcg dmFsOworCisJdmFkZHIgPSBlYXJseV9tZW1yZW1hcF9ybyhhZGRyLCBzaXplb2YodmFsKSk7CisJ dmFsID0gKnZhZGRyOworCWVhcmx5X21lbXVubWFwKHZhZGRyLCBzaXplb2YodmFsKSk7CisJcmV0 dXJuIHZhbDsKK30KKworLyoKKyAqIFRyYW5zbGF0ZSBhIHZpcnR1YWwgYWRkcmVzcyB0byBhIHBo eXNpY2FsIG9uZSB3aXRob3V0IHJlbHlpbmcgb24gbWFwcGVkCisgKiBwYWdlIHRhYmxlcy4KKyAq Lworc3RhdGljIHBoeXNfYWRkcl90IF9faW5pdCB4ZW5fZWFybHlfdmlydF90b19waHlzKHVuc2ln bmVkIGxvbmcgdmFkZHIpCit7CisJcGh5c19hZGRyX3QgcGE7CisJcGdkX3QgcGdkOworCXB1ZF90 IHB1ZDsKKwlwbWRfdCBwbWQ7CisJcHRlX3QgcHRlOworCisJcGEgPSByZWFkX2NyMygpOworCXBn ZCA9IG5hdGl2ZV9tYWtlX3BnZCh4ZW5fcmVhZF9waHlzX3Vsb25nKHBhICsgcGdkX2luZGV4KHZh ZGRyKSAqCisJCQkJCQkgICAgICAgc2l6ZW9mKHBnZCkpKTsKKwlpZiAoIXBnZF9wcmVzZW50KHBn ZCkpCisJCXJldHVybiAwOworCisJcGEgPSBwZ2RfdmFsKHBnZCkgJiBQVEVfUEZOX01BU0s7CisJ cHVkID0gbmF0aXZlX21ha2VfcHVkKHhlbl9yZWFkX3BoeXNfdWxvbmcocGEgKyBwdWRfaW5kZXgo dmFkZHIpICoKKwkJCQkJCSAgICAgICBzaXplb2YocHVkKSkpOworCWlmICghcHVkX3ByZXNlbnQo cHVkKSkKKwkJcmV0dXJuIDA7CisJcGEgPSBwdWRfcGZuKHB1ZCkgPDwgUEFHRV9TSElGVDsKKwlp ZiAocHVkX2xhcmdlKHB1ZCkpCisJCXJldHVybiBwYSArICh2YWRkciAmIH5QVURfTUFTSyk7CisK KwlwbWQgPSBuYXRpdmVfbWFrZV9wbWQoeGVuX3JlYWRfcGh5c191bG9uZyhwYSArIHBtZF9pbmRl eCh2YWRkcikgKgorCQkJCQkJICAgICAgIHNpemVvZihwbWQpKSk7CisJaWYgKCFwbWRfcHJlc2Vu dChwbWQpKQorCQlyZXR1cm4gMDsKKwlwYSA9IHBtZF9wZm4ocG1kKSA8PCBQQUdFX1NISUZUOwor CWlmIChwbWRfbGFyZ2UocG1kKSkKKwkJcmV0dXJuIHBhICsgKHZhZGRyICYgflBNRF9NQVNLKTsK KworCXB0ZSA9IG5hdGl2ZV9tYWtlX3B0ZSh4ZW5fcmVhZF9waHlzX3Vsb25nKHBhICsgcHRlX2lu ZGV4KHZhZGRyKSAqCisJCQkJCQkgICAgICAgc2l6ZW9mKHB0ZSkpKTsKKwlpZiAoIXB0ZV9wcmVz ZW50KHB0ZSkpCisJCXJldHVybiAwOworCXBhID0gcHRlX3BmbihwdGUpIDw8IFBBR0VfU0hJRlQ7 CisKKwlyZXR1cm4gcGEgfCAodmFkZHIgJiB+UEFHRV9NQVNLKTsKK30KKworLyoKKyAqIEZpbmQg YSBuZXcgYXJlYSBmb3IgdGhlIGh5cGVydmlzb3Igc3VwcGxpZWQgcDJtIGxpc3QgYW5kIHJlbG9j YXRlIHRoZSBwMm0gdG8KKyAqIHRoaXMgYXJlYS4KKyAqLwordm9pZCBfX2luaXQgeGVuX3JlbG9j YXRlX3AybSh2b2lkKQoreworCXBoeXNfYWRkcl90IHNpemUsIG5ld19hcmVhLCBwdF9waHlzLCBw bWRfcGh5cywgcHVkX3BoeXM7CisJdW5zaWduZWQgbG9uZyBwMm1fcGZuLCBwMm1fcGZuX2VuZCwg bl9mcmFtZXMsIHBmbiwgcGZuX2VuZDsKKwlpbnQgbl9wdGUsIG5fcHQsIG5fcG1kLCBuX3B1ZCwg aWR4X3B0ZSwgaWR4X3B0LCBpZHhfcG1kLCBpZHhfcHVkOworCXB0ZV90ICpwdDsKKwlwbWRfdCAq cG1kOworCXB1ZF90ICpwdWQ7CisJcGdkX3QgKnBnZDsKKwl1bnNpZ25lZCBsb25nICpuZXdfcDJt OworCisJc2l6ZSA9IFBBR0VfQUxJR04oeGVuX3N0YXJ0X2luZm8tPm5yX3BhZ2VzICogc2l6ZW9m KHVuc2lnbmVkIGxvbmcpKTsKKwluX3B0ZSA9IHJvdW5kdXAoc2l6ZSwgUEFHRV9TSVpFKSA+PiBQ QUdFX1NISUZUOworCW5fcHQgPSByb3VuZHVwKHNpemUsIFBNRF9TSVpFKSA+PiBQTURfU0hJRlQ7 CisJbl9wbWQgPSByb3VuZHVwKHNpemUsIFBVRF9TSVpFKSA+PiBQVURfU0hJRlQ7CisJbl9wdWQg PSByb3VuZHVwKHNpemUsIFBHRElSX1NJWkUpID4+IFBHRElSX1NISUZUOworCW5fZnJhbWVzID0g bl9wdGUgKyBuX3B0ICsgbl9wbWQgKyBuX3B1ZDsKKworCW5ld19hcmVhID0geGVuX2ZpbmRfZnJl ZV9hcmVhKFBGTl9QSFlTKG5fZnJhbWVzKSk7CisJaWYgKCFuZXdfYXJlYSkgeworCQl4ZW5fcmF3 X2NvbnNvbGVfd3JpdGUoIkNhbid0IGZpbmQgbmV3IG1lbW9yeSBhcmVhIGZvciBwMm0gbmVlZGVk IGR1ZSB0byBFODIwIG1hcCBjb25mbGljdFxuIik7CisJCUJVRygpOworCX0KKworCS8qCisJICog U2V0dXAgdGhlIHBhZ2UgdGFibGVzIGZvciBhZGRyZXNzaW5nIHRoZSBuZXcgcDJtIGxpc3QuCisJ ICogV2UgaGF2ZSBhc2tlZCB0aGUgaHlwZXJ2aXNvciB0byBtYXAgdGhlIHAybSBsaXN0IGF0IHRo ZSB1c2VyIGFkZHJlc3MKKwkgKiBQVURfU0laRS4gSXQgbWF5IGhhdmUgZG9uZSBzbywgb3IgaXQg bWF5IGhhdmUgdXNlZCBhIGtlcm5lbCBzcGFjZQorCSAqIGFkZHJlc3MgZGVwZW5kaW5nIG9uIHRo ZSBYZW4gdmVyc2lvbi4KKwkgKiBUbyBhdm9pZCBhbnkgcG9zc2libGUgdmlydHVhbCBhZGRyZXNz IGNvbGxpc2lvbiwganVzdCB1c2UKKwkgKiAyICogUFVEX1NJWkUgZm9yIHRoZSBuZXcgYXJlYS4K KwkgKi8KKwlwdWRfcGh5cyA9IG5ld19hcmVhOworCXBtZF9waHlzID0gcHVkX3BoeXMgKyBQRk5f UEhZUyhuX3B1ZCk7CisJcHRfcGh5cyA9IHBtZF9waHlzICsgUEZOX1BIWVMobl9wbWQpOworCXAy bV9wZm4gPSBQRk5fRE9XTihwdF9waHlzKSArIG5fcHQ7CisKKwlwZ2QgPSBfX3ZhKHJlYWRfY3Iz KCkpOworCW5ld19wMm0gPSAodW5zaWduZWQgbG9uZyAqKSgyICogUEdESVJfU0laRSk7CisJZm9y IChpZHhfcHVkID0gMDsgaWR4X3B1ZCA8IG5fcHVkOyBpZHhfcHVkKyspIHsKKwkJcHVkID0gZWFy bHlfbWVtcmVtYXAocHVkX3BoeXMsIFBBR0VfU0laRSk7CisJCWNsZWFyX3BhZ2UocHVkKTsKKwkJ Zm9yIChpZHhfcG1kID0gMDsgaWR4X3BtZCA8IG1pbihuX3BtZCwgUFRSU19QRVJfUFVEKTsKKwkJ ICAgICBpZHhfcG1kKyspIHsKKwkJCXBtZCA9IGVhcmx5X21lbXJlbWFwKHBtZF9waHlzLCBQQUdF X1NJWkUpOworCQkJY2xlYXJfcGFnZShwbWQpOworCQkJZm9yIChpZHhfcHQgPSAwOyBpZHhfcHQg PCBtaW4obl9wdCwgUFRSU19QRVJfUE1EKTsKKwkJCSAgICAgaWR4X3B0KyspIHsKKwkJCQlwdCA9 IGVhcmx5X21lbXJlbWFwKHB0X3BoeXMsIFBBR0VfU0laRSk7CisJCQkJY2xlYXJfcGFnZShwdCk7 CisJCQkJZm9yIChpZHhfcHRlID0gMDsKKwkJCQkgICAgIGlkeF9wdGUgPCBtaW4obl9wdGUsIFBU UlNfUEVSX1BURSk7CisJCQkJICAgICBpZHhfcHRlKyspIHsKKwkJCQkJc2V0X3B0ZShwdCArIGlk eF9wdGUsCisJCQkJCQlwZm5fcHRlKHAybV9wZm4sIFBBR0VfS0VSTkVMKSk7CisJCQkJCXAybV9w Zm4rKzsKKwkJCQl9CisJCQkJbl9wdGUgLT0gUFRSU19QRVJfUFRFOworCQkJCWVhcmx5X21lbXVu bWFwKHB0LCBQQUdFX1NJWkUpOworCQkJCW1ha2VfbG93bWVtX3BhZ2VfcmVhZG9ubHkoX192YShw dF9waHlzKSk7CisJCQkJcGluX3BhZ2V0YWJsZV9wZm4oTU1VRVhUX1BJTl9MMV9UQUJMRSwKKwkJ CQkJCSAgUEZOX0RPV04ocHRfcGh5cykpOworCQkJCXNldF9wbWQocG1kICsgaWR4X3B0LAorCQkJ CQlfX3BtZChfUEFHRV9UQUJMRSB8IHB0X3BoeXMpKTsKKwkJCQlwdF9waHlzICs9IFBBR0VfU0la RTsKKwkJCX0KKwkJCW5fcHQgLT0gUFRSU19QRVJfUE1EOworCQkJZWFybHlfbWVtdW5tYXAocG1k LCBQQUdFX1NJWkUpOworCQkJbWFrZV9sb3dtZW1fcGFnZV9yZWFkb25seShfX3ZhKHBtZF9waHlz KSk7CisJCQlwaW5fcGFnZXRhYmxlX3BmbihNTVVFWFRfUElOX0wyX1RBQkxFLAorCQkJCQkgIFBG Tl9ET1dOKHBtZF9waHlzKSk7CisJCQlzZXRfcHVkKHB1ZCArIGlkeF9wbWQsIF9fcHVkKF9QQUdF X1RBQkxFIHwgcG1kX3BoeXMpKTsKKwkJCXBtZF9waHlzICs9IFBBR0VfU0laRTsKKwkJfQorCQlu X3BtZCAtPSBQVFJTX1BFUl9QVUQ7CisJCWVhcmx5X21lbXVubWFwKHB1ZCwgUEFHRV9TSVpFKTsK KwkJbWFrZV9sb3dtZW1fcGFnZV9yZWFkb25seShfX3ZhKHB1ZF9waHlzKSk7CisJCXBpbl9wYWdl dGFibGVfcGZuKE1NVUVYVF9QSU5fTDNfVEFCTEUsIFBGTl9ET1dOKHB1ZF9waHlzKSk7CisJCXNl dF9wZ2QocGdkICsgMiArIGlkeF9wdWQsIF9fcGdkKF9QQUdFX1RBQkxFIHwgcHVkX3BoeXMpKTsK KwkJcHVkX3BoeXMgKz0gUEFHRV9TSVpFOworCX0KKworCS8qIE5vdyBjb3B5IHRoZSBvbGQgcDJt IGluZm8gdG8gdGhlIG5ldyBhcmVhLiAqLworCW1lbWNweShuZXdfcDJtLCB4ZW5fcDJtX2FkZHIs IHNpemUpOworCXhlbl9wMm1fYWRkciA9IG5ld19wMm07CisKKwkvKiBSZWxlYXNlIHRoZSBvbGQg cDJtIGxpc3QgYW5kIHNldCBuZXcgbGlzdCBpbmZvLiAqLworCXAybV9wZm4gPSBQRk5fRE9XTih4 ZW5fZWFybHlfdmlydF90b19waHlzKHhlbl9zdGFydF9pbmZvLT5tZm5fbGlzdCkpOworCUJVR19P TighcDJtX3Bmbik7CisJcDJtX3Bmbl9lbmQgPSBwMm1fcGZuICsgUEZOX0RPV04oc2l6ZSk7CisK KwlpZiAoeGVuX3N0YXJ0X2luZm8tPm1mbl9saXN0IDwgX19TVEFSVF9LRVJORUxfbWFwKSB7CisJ CXBmbiA9IHhlbl9zdGFydF9pbmZvLT5maXJzdF9wMm1fcGZuOworCQlwZm5fZW5kID0geGVuX3N0 YXJ0X2luZm8tPmZpcnN0X3AybV9wZm4gKworCQkJICB4ZW5fc3RhcnRfaW5mby0+bnJfcDJtX2Zy YW1lczsKKwkJc2V0X3BnZChwZ2QgKyAxLCBfX3BnZCgwKSk7CisJfSBlbHNlIHsKKwkJcGZuID0g cDJtX3BmbjsKKwkJcGZuX2VuZCA9IHAybV9wZm5fZW5kOworCX0KKworCW1lbWJsb2NrX2ZyZWUo UEZOX1BIWVMocGZuKSwgUEFHRV9TSVpFICogKHBmbl9lbmQgLSBwZm4pKTsKKwl3aGlsZSAocGZu IDwgcGZuX2VuZCkgeworCQlpZiAocGZuID09IHAybV9wZm4pIHsKKwkJCXBmbiA9IHAybV9wZm5f ZW5kOworCQkJY29udGludWU7CisJCX0KKwkJbWFrZV9sb3dtZW1fcGFnZV9yZWFkd3JpdGUoX192 YShQRk5fUEhZUyhwZm4pKSk7CisJCXBmbisrOworCX0KKworCXhlbl9zdGFydF9pbmZvLT5tZm5f bGlzdCA9ICh1bnNpZ25lZCBsb25nKXhlbl9wMm1fYWRkcjsKKwl4ZW5fc3RhcnRfaW5mby0+Zmly c3RfcDJtX3BmbiA9ICBQRk5fRE9XTihuZXdfYXJlYSk7CisJeGVuX3N0YXJ0X2luZm8tPm5yX3Ay bV9mcmFtZXMgPSBuX2ZyYW1lczsKK30KKworI2Vsc2UJLyogIUNPTkZJR19YODZfNjQgKi8KK3N0 YXRpYyBSRVNFUlZFX0JSS19BUlJBWShwbWRfdCwgaW5pdGlhbF9rZXJuZWxfcG1kLCBQVFJTX1BF Ul9QTUQpOworc3RhdGljIFJFU0VSVkVfQlJLX0FSUkFZKHBtZF90LCBzd2FwcGVyX2tlcm5lbF9w bWQsIFBUUlNfUEVSX1BNRCk7CisKK3N0YXRpYyB2b2lkIF9faW5pdCB4ZW5fd3JpdGVfY3IzX2lu aXQodW5zaWduZWQgbG9uZyBjcjMpCit7CisJdW5zaWduZWQgbG9uZyBwZm4gPSBQRk5fRE9XTihf X3BhKHN3YXBwZXJfcGdfZGlyKSk7CisKKwlCVUdfT04ocmVhZF9jcjMoKSAhPSBfX3BhKGluaXRp YWxfcGFnZV90YWJsZSkpOworCUJVR19PTihjcjMgIT0gX19wYShzd2FwcGVyX3BnX2RpcikpOwor CisJLyoKKwkgKiBXZSBhcmUgc3dpdGNoaW5nIHRvIHN3YXBwZXJfcGdfZGlyIGZvciB0aGUgZmly c3QgdGltZSAoZnJvbQorCSAqIGluaXRpYWxfcGFnZV90YWJsZSkgYW5kIHRoZXJlZm9yZSBuZWVk IHRvIG1hcmsgdGhhdCBwYWdlCisJICogcmVhZC1vbmx5IGFuZCB0aGVuIHBpbiBpdC4KKwkgKgor CSAqIFhlbiBkaXNhbGxvd3Mgc2hhcmluZyBvZiBrZXJuZWwgUE1EcyBmb3IgUEFFCisJICogZ3Vl c3RzLiBUaGVyZWZvcmUgd2UgbXVzdCBjb3B5IHRoZSBrZXJuZWwgUE1EIGZyb20KKwkgKiBpbml0 aWFsX3BhZ2VfdGFibGUgaW50byBhIG5ldyBrZXJuZWwgUE1EIHRvIGJlIHVzZWQgaW4KKwkgKiBz d2FwcGVyX3BnX2Rpci4KKwkgKi8KKwlzd2FwcGVyX2tlcm5lbF9wbWQgPQorCQlleHRlbmRfYnJr KHNpemVvZihwbWRfdCkgKiBQVFJTX1BFUl9QTUQsIFBBR0VfU0laRSk7CisJY29weV9wYWdlKHN3 YXBwZXJfa2VybmVsX3BtZCwgaW5pdGlhbF9rZXJuZWxfcG1kKTsKKwlzd2FwcGVyX3BnX2RpcltL RVJORUxfUEdEX0JPVU5EQVJZXSA9CisJCV9fcGdkKF9fcGEoc3dhcHBlcl9rZXJuZWxfcG1kKSB8 IF9QQUdFX1BSRVNFTlQpOworCXNldF9wYWdlX3Byb3Qoc3dhcHBlcl9rZXJuZWxfcG1kLCBQQUdF X0tFUk5FTF9STyk7CisKKwlzZXRfcGFnZV9wcm90KHN3YXBwZXJfcGdfZGlyLCBQQUdFX0tFUk5F TF9STyk7CisJeGVuX3dyaXRlX2NyMyhjcjMpOworCXBpbl9wYWdldGFibGVfcGZuKE1NVUVYVF9Q SU5fTDNfVEFCTEUsIHBmbik7CisKKwlwaW5fcGFnZXRhYmxlX3BmbihNTVVFWFRfVU5QSU5fVEFC TEUsCisJCQkgIFBGTl9ET1dOKF9fcGEoaW5pdGlhbF9wYWdlX3RhYmxlKSkpOworCXNldF9wYWdl X3Byb3QoaW5pdGlhbF9wYWdlX3RhYmxlLCBQQUdFX0tFUk5FTCk7CisJc2V0X3BhZ2VfcHJvdChp bml0aWFsX2tlcm5lbF9wbWQsIFBBR0VfS0VSTkVMKTsKKworCXB2X21tdV9vcHMud3JpdGVfY3Iz ID0gJnhlbl93cml0ZV9jcjM7Cit9CisKKy8qCisgKiBGb3IgMzIgYml0IGRvbWFpbnMgeGVuX3N0 YXJ0X2luZm8tPnB0X2Jhc2UgaXMgdGhlIHBnZCBhZGRyZXNzIHdoaWNoIG1pZ2h0IGJlCisgKiBu b3QgdGhlIGZpcnN0IHBhZ2UgdGFibGUgaW4gdGhlIHBhZ2UgdGFibGUgcG9vbC4KKyAqIEl0ZXJh dGUgdGhyb3VnaCB0aGUgaW5pdGlhbCBwYWdlIHRhYmxlcyB0byBmaW5kIHRoZSByZWFsIHBhZ2Ug dGFibGUgYmFzZS4KKyAqLworc3RhdGljIHBoeXNfYWRkcl90IHhlbl9maW5kX3B0X2Jhc2UocG1k X3QgKnBtZCkKK3sKKwlwaHlzX2FkZHJfdCBwdF9iYXNlLCBwYWRkcjsKKwl1bnNpZ25lZCBwbWRp ZHg7CisKKwlwdF9iYXNlID0gbWluKF9fcGEoeGVuX3N0YXJ0X2luZm8tPnB0X2Jhc2UpLCBfX3Bh KHBtZCkpOworCisJZm9yIChwbWRpZHggPSAwOyBwbWRpZHggPCBQVFJTX1BFUl9QTUQ7IHBtZGlk eCsrKQorCQlpZiAocG1kX3ByZXNlbnQocG1kW3BtZGlkeF0pICYmICFwbWRfbGFyZ2UocG1kW3Bt ZGlkeF0pKSB7CisJCQlwYWRkciA9IG0ycChwbWRbcG1kaWR4XS5wbWQpOworCQkJcHRfYmFzZSA9 IG1pbihwdF9iYXNlLCBwYWRkcik7CisJCX0KKworCXJldHVybiBwdF9iYXNlOworfQorCit2b2lk IF9faW5pdCB4ZW5fc2V0dXBfa2VybmVsX3BhZ2V0YWJsZShwZ2RfdCAqcGdkLCB1bnNpZ25lZCBs b25nIG1heF9wZm4pCit7CisJcG1kX3QgKmtlcm5lbF9wbWQ7CisKKwlrZXJuZWxfcG1kID0gbTJ2 KHBnZFtLRVJORUxfUEdEX0JPVU5EQVJZXS5wZ2QpOworCisJeGVuX3B0X2Jhc2UgPSB4ZW5fZmlu ZF9wdF9iYXNlKGtlcm5lbF9wbWQpOworCXhlbl9wdF9zaXplID0geGVuX3N0YXJ0X2luZm8tPm5y X3B0X2ZyYW1lcyAqIFBBR0VfU0laRTsKKworCWluaXRpYWxfa2VybmVsX3BtZCA9CisJCWV4dGVu ZF9icmsoc2l6ZW9mKHBtZF90KSAqIFBUUlNfUEVSX1BNRCwgUEFHRV9TSVpFKTsKKworCW1heF9w Zm5fbWFwcGVkID0gUEZOX0RPV04oeGVuX3B0X2Jhc2UgKyB4ZW5fcHRfc2l6ZSArIDUxMiAqIDEw MjQpOworCisJY29weV9wYWdlKGluaXRpYWxfa2VybmVsX3BtZCwga2VybmVsX3BtZCk7CisKKwl4 ZW5fbWFwX2lkZW50aXR5X2Vhcmx5KGluaXRpYWxfa2VybmVsX3BtZCwgbWF4X3Bmbik7CisKKwlj b3B5X3BhZ2UoaW5pdGlhbF9wYWdlX3RhYmxlLCBwZ2QpOworCWluaXRpYWxfcGFnZV90YWJsZVtL RVJORUxfUEdEX0JPVU5EQVJZXSA9CisJCV9fcGdkKF9fcGEoaW5pdGlhbF9rZXJuZWxfcG1kKSB8 IF9QQUdFX1BSRVNFTlQpOworCisJc2V0X3BhZ2VfcHJvdChpbml0aWFsX2tlcm5lbF9wbWQsIFBB R0VfS0VSTkVMX1JPKTsKKwlzZXRfcGFnZV9wcm90KGluaXRpYWxfcGFnZV90YWJsZSwgUEFHRV9L RVJORUxfUk8pOworCXNldF9wYWdlX3Byb3QoZW1wdHlfemVyb19wYWdlLCBQQUdFX0tFUk5FTF9S Tyk7CisKKwlwaW5fcGFnZXRhYmxlX3BmbihNTVVFWFRfVU5QSU5fVEFCTEUsIFBGTl9ET1dOKF9f cGEocGdkKSkpOworCisJcGluX3BhZ2V0YWJsZV9wZm4oTU1VRVhUX1BJTl9MM19UQUJMRSwKKwkJ CSAgUEZOX0RPV04oX19wYShpbml0aWFsX3BhZ2VfdGFibGUpKSk7CisJeGVuX3dyaXRlX2NyMyhf X3BhKGluaXRpYWxfcGFnZV90YWJsZSkpOworCisJbWVtYmxvY2tfcmVzZXJ2ZSh4ZW5fcHRfYmFz ZSwgeGVuX3B0X3NpemUpOworfQorI2VuZGlmCS8qIENPTkZJR19YODZfNjQgKi8KKwordm9pZCBf X2luaXQgeGVuX3Jlc2VydmVfc3BlY2lhbF9wYWdlcyh2b2lkKQoreworCXBoeXNfYWRkcl90IHBh ZGRyOworCisJbWVtYmxvY2tfcmVzZXJ2ZShfX3BhKHhlbl9zdGFydF9pbmZvKSwgUEFHRV9TSVpF KTsKKwlpZiAoeGVuX3N0YXJ0X2luZm8tPnN0b3JlX21mbikgeworCQlwYWRkciA9IFBGTl9QSFlT KG1mbl90b19wZm4oeGVuX3N0YXJ0X2luZm8tPnN0b3JlX21mbikpOworCQltZW1ibG9ja19yZXNl cnZlKHBhZGRyLCBQQUdFX1NJWkUpOworCX0KKwlpZiAoIXhlbl9pbml0aWFsX2RvbWFpbigpKSB7 CisJCXBhZGRyID0gUEZOX1BIWVMobWZuX3RvX3Bmbih4ZW5fc3RhcnRfaW5mby0+Y29uc29sZS5k b21VLm1mbikpOworCQltZW1ibG9ja19yZXNlcnZlKHBhZGRyLCBQQUdFX1NJWkUpOworCX0KK30K Kwordm9pZCBfX2luaXQgeGVuX3B0X2NoZWNrX2U4MjAodm9pZCkKK3sKKwlpZiAoeGVuX2lzX2U4 MjBfcmVzZXJ2ZWQoeGVuX3B0X2Jhc2UsIHhlbl9wdF9zaXplKSkgeworCQl4ZW5fcmF3X2NvbnNv bGVfd3JpdGUoIlhlbiBoeXBlcnZpc29yIGFsbG9jYXRlZCBwYWdlIHRhYmxlIG1lbW9yeSBjb25m bGljdHMgd2l0aCBFODIwIG1hcFxuIik7CisJCUJVRygpOworCX0KK30KKworc3RhdGljIHVuc2ln bmVkIGNoYXIgZHVtbXlfbWFwcGluZ1tQQUdFX1NJWkVdIF9fcGFnZV9hbGlnbmVkX2JzczsKKwor c3RhdGljIHZvaWQgeGVuX3NldF9maXhtYXAodW5zaWduZWQgaWR4LCBwaHlzX2FkZHJfdCBwaHlz LCBwZ3Byb3RfdCBwcm90KQoreworCXB0ZV90IHB0ZTsKKworCXBoeXMgPj49IFBBR0VfU0hJRlQ7 CisKKwlzd2l0Y2ggKGlkeCkgeworCWNhc2UgRklYX0JUTUFQX0VORCAuLi4gRklYX0JUTUFQX0JF R0lOOgorCWNhc2UgRklYX1JPX0lEVDoKKyNpZmRlZiBDT05GSUdfWDg2XzMyCisJY2FzZSBGSVhf V1BfVEVTVDoKKyMgaWZkZWYgQ09ORklHX0hJR0hNRU0KKwljYXNlIEZJWF9LTUFQX0JFR0lOIC4u LiBGSVhfS01BUF9FTkQ6CisjIGVuZGlmCisjZWxpZiBkZWZpbmVkKENPTkZJR19YODZfVlNZU0NB TExfRU1VTEFUSU9OKQorCWNhc2UgVlNZU0NBTExfUEFHRToKKyNlbmRpZgorCWNhc2UgRklYX1RF WFRfUE9LRTA6CisJY2FzZSBGSVhfVEVYVF9QT0tFMToKKwkJLyogQWxsIGxvY2FsIHBhZ2UgbWFw cGluZ3MgKi8KKwkJcHRlID0gcGZuX3B0ZShwaHlzLCBwcm90KTsKKwkJYnJlYWs7CisKKyNpZmRl ZiBDT05GSUdfWDg2X0xPQ0FMX0FQSUMKKwljYXNlIEZJWF9BUElDX0JBU0U6CS8qIG1hcHMgZHVt bXkgbG9jYWwgQVBJQyAqLworCQlwdGUgPSBwZm5fcHRlKFBGTl9ET1dOKF9fcGEoZHVtbXlfbWFw cGluZykpLCBQQUdFX0tFUk5FTCk7CisJCWJyZWFrOworI2VuZGlmCisKKyNpZmRlZiBDT05GSUdf WDg2X0lPX0FQSUMKKwljYXNlIEZJWF9JT19BUElDX0JBU0VfMCAuLi4gRklYX0lPX0FQSUNfQkFT RV9FTkQ6CisJCS8qCisJCSAqIFdlIGp1c3QgZG9uJ3QgbWFwIHRoZSBJTyBBUElDIC0gYWxsIGFj Y2VzcyBpcyB2aWEKKwkJICogaHlwZXJjYWxscy4gIEtlZXAgdGhlIGFkZHJlc3MgaW4gdGhlIHB0 ZSBmb3IgcmVmZXJlbmNlLgorCQkgKi8KKwkJcHRlID0gcGZuX3B0ZShQRk5fRE9XTihfX3BhKGR1 bW15X21hcHBpbmcpKSwgUEFHRV9LRVJORUwpOworCQlicmVhazsKKyNlbmRpZgorCisJY2FzZSBG SVhfUEFSQVZJUlRfQk9PVE1BUDoKKwkJLyogVGhpcyBpcyBhbiBNRk4sIGJ1dCBpdCBpc24ndCBh biBJTyBtYXBwaW5nIGZyb20gdGhlCisJCSAgIElPIGRvbWFpbiAqLworCQlwdGUgPSBtZm5fcHRl KHBoeXMsIHByb3QpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCS8qIEJ5IGRlZmF1bHQsIHNl dF9maXhtYXAgaXMgdXNlZCBmb3IgaGFyZHdhcmUgbWFwcGluZ3MgKi8KKwkJcHRlID0gbWZuX3B0 ZShwaHlzLCBwcm90KTsKKwkJYnJlYWs7CisJfQorCisJX19uYXRpdmVfc2V0X2ZpeG1hcChpZHgs IHB0ZSk7CisKKyNpZmRlZiBDT05GSUdfWDg2X1ZTWVNDQUxMX0VNVUxBVElPTgorCS8qIFJlcGxp Y2F0ZSBjaGFuZ2VzIHRvIG1hcCB0aGUgdnN5c2NhbGwgcGFnZSBpbnRvIHRoZSB1c2VyCisJICAg cGFnZXRhYmxlIHZzeXNjYWxsIG1hcHBpbmcuICovCisJaWYgKGlkeCA9PSBWU1lTQ0FMTF9QQUdF KSB7CisJCXVuc2lnbmVkIGxvbmcgdmFkZHIgPSBfX2ZpeF90b192aXJ0KGlkeCk7CisJCXNldF9w dGVfdmFkZHJfcHVkKGxldmVsM191c2VyX3ZzeXNjYWxsLCB2YWRkciwgcHRlKTsKKwl9CisjZW5k aWYKK30KKworc3RhdGljIHZvaWQgX19pbml0IHhlbl9wb3N0X2FsbG9jYXRvcl9pbml0KHZvaWQp Cit7CisJaWYgKHhlbl9mZWF0dXJlKFhFTkZFQVRfYXV0b190cmFuc2xhdGVkX3BoeXNtYXApKQor CQlyZXR1cm47CisKKwlwdl9tbXVfb3BzLnNldF9wdGUgPSB4ZW5fc2V0X3B0ZTsKKwlwdl9tbXVf b3BzLnNldF9wbWQgPSB4ZW5fc2V0X3BtZDsKKwlwdl9tbXVfb3BzLnNldF9wdWQgPSB4ZW5fc2V0 X3B1ZDsKKyNpZiBDT05GSUdfUEdUQUJMRV9MRVZFTFMgPT0gNAorCXB2X21tdV9vcHMuc2V0X3Bn ZCA9IHhlbl9zZXRfcGdkOworI2VuZGlmCisKKwkvKiBUaGlzIHdpbGwgd29yayBhcyBsb25nIGFz IHBhdGNoaW5nIGhhc24ndCBoYXBwZW5lZCB5ZXQKKwkgICAod2hpY2ggaXQgaGFzbid0KSAqLwor CXB2X21tdV9vcHMuYWxsb2NfcHRlID0geGVuX2FsbG9jX3B0ZTsKKwlwdl9tbXVfb3BzLmFsbG9j X3BtZCA9IHhlbl9hbGxvY19wbWQ7CisJcHZfbW11X29wcy5yZWxlYXNlX3B0ZSA9IHhlbl9yZWxl YXNlX3B0ZTsKKwlwdl9tbXVfb3BzLnJlbGVhc2VfcG1kID0geGVuX3JlbGVhc2VfcG1kOworI2lm IENPTkZJR19QR1RBQkxFX0xFVkVMUyA9PSA0CisJcHZfbW11X29wcy5hbGxvY19wdWQgPSB4ZW5f YWxsb2NfcHVkOworCXB2X21tdV9vcHMucmVsZWFzZV9wdWQgPSB4ZW5fcmVsZWFzZV9wdWQ7Cisj ZW5kaWYKKwlwdl9tbXVfb3BzLm1ha2VfcHRlID0gUFZfQ0FMTEVFX1NBVkUoeGVuX21ha2VfcHRl KTsKKworI2lmZGVmIENPTkZJR19YODZfNjQKKwlwdl9tbXVfb3BzLndyaXRlX2NyMyA9ICZ4ZW5f d3JpdGVfY3IzOworCVNldFBhZ2VQaW5uZWQodmlydF90b19wYWdlKGxldmVsM191c2VyX3ZzeXNj YWxsKSk7CisjZW5kaWYKKwl4ZW5fbWFya19pbml0X21tX3Bpbm5lZCgpOworfQorCitzdGF0aWMg dm9pZCB4ZW5fbGVhdmVfbGF6eV9tbXUodm9pZCkKK3sKKwlwcmVlbXB0X2Rpc2FibGUoKTsKKwl4 ZW5fbWNfZmx1c2goKTsKKwlwYXJhdmlydF9sZWF2ZV9sYXp5X21tdSgpOworCXByZWVtcHRfZW5h YmxlKCk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcHZfbW11X29wcyB4ZW5fbW11X29wcyBf X2luaXRjb25zdCA9IHsKKwkucmVhZF9jcjIgPSB4ZW5fcmVhZF9jcjIsCisJLndyaXRlX2NyMiA9 IHhlbl93cml0ZV9jcjIsCisKKwkucmVhZF9jcjMgPSB4ZW5fcmVhZF9jcjMsCisJLndyaXRlX2Ny MyA9IHhlbl93cml0ZV9jcjNfaW5pdCwKKworCS5mbHVzaF90bGJfdXNlciA9IHhlbl9mbHVzaF90 bGIsCisJLmZsdXNoX3RsYl9rZXJuZWwgPSB4ZW5fZmx1c2hfdGxiLAorCS5mbHVzaF90bGJfc2lu Z2xlID0geGVuX2ZsdXNoX3RsYl9zaW5nbGUsCisJLmZsdXNoX3RsYl9vdGhlcnMgPSB4ZW5fZmx1 c2hfdGxiX290aGVycywKKworCS5wdGVfdXBkYXRlID0gcGFyYXZpcnRfbm9wLAorCisJLnBnZF9h bGxvYyA9IHhlbl9wZ2RfYWxsb2MsCisJLnBnZF9mcmVlID0geGVuX3BnZF9mcmVlLAorCisJLmFs bG9jX3B0ZSA9IHhlbl9hbGxvY19wdGVfaW5pdCwKKwkucmVsZWFzZV9wdGUgPSB4ZW5fcmVsZWFz ZV9wdGVfaW5pdCwKKwkuYWxsb2NfcG1kID0geGVuX2FsbG9jX3BtZF9pbml0LAorCS5yZWxlYXNl X3BtZCA9IHhlbl9yZWxlYXNlX3BtZF9pbml0LAorCisJLnNldF9wdGUgPSB4ZW5fc2V0X3B0ZV9p bml0LAorCS5zZXRfcHRlX2F0ID0geGVuX3NldF9wdGVfYXQsCisJLnNldF9wbWQgPSB4ZW5fc2V0 X3BtZF9oeXBlciwKKworCS5wdGVwX21vZGlmeV9wcm90X3N0YXJ0ID0gX19wdGVwX21vZGlmeV9w cm90X3N0YXJ0LAorCS5wdGVwX21vZGlmeV9wcm90X2NvbW1pdCA9IF9fcHRlcF9tb2RpZnlfcHJv dF9jb21taXQsCisKKwkucHRlX3ZhbCA9IFBWX0NBTExFRV9TQVZFKHhlbl9wdGVfdmFsKSwKKwku cGdkX3ZhbCA9IFBWX0NBTExFRV9TQVZFKHhlbl9wZ2RfdmFsKSwKKworCS5tYWtlX3B0ZSA9IFBW X0NBTExFRV9TQVZFKHhlbl9tYWtlX3B0ZV9pbml0KSwKKwkubWFrZV9wZ2QgPSBQVl9DQUxMRUVf U0FWRSh4ZW5fbWFrZV9wZ2QpLAorCisjaWZkZWYgQ09ORklHX1g4Nl9QQUUKKwkuc2V0X3B0ZV9h dG9taWMgPSB4ZW5fc2V0X3B0ZV9hdG9taWMsCisJLnB0ZV9jbGVhciA9IHhlbl9wdGVfY2xlYXIs CisJLnBtZF9jbGVhciA9IHhlbl9wbWRfY2xlYXIsCisjZW5kaWYJLyogQ09ORklHX1g4Nl9QQUUg Ki8KKwkuc2V0X3B1ZCA9IHhlbl9zZXRfcHVkX2h5cGVyLAorCisJLm1ha2VfcG1kID0gUFZfQ0FM TEVFX1NBVkUoeGVuX21ha2VfcG1kKSwKKwkucG1kX3ZhbCA9IFBWX0NBTExFRV9TQVZFKHhlbl9w bWRfdmFsKSwKKworI2lmIENPTkZJR19QR1RBQkxFX0xFVkVMUyA9PSA0CisJLnB1ZF92YWwgPSBQ Vl9DQUxMRUVfU0FWRSh4ZW5fcHVkX3ZhbCksCisJLm1ha2VfcHVkID0gUFZfQ0FMTEVFX1NBVkUo eGVuX21ha2VfcHVkKSwKKwkuc2V0X3BnZCA9IHhlbl9zZXRfcGdkX2h5cGVyLAorCisJLmFsbG9j X3B1ZCA9IHhlbl9hbGxvY19wbWRfaW5pdCwKKwkucmVsZWFzZV9wdWQgPSB4ZW5fcmVsZWFzZV9w bWRfaW5pdCwKKyNlbmRpZgkvKiBDT05GSUdfUEdUQUJMRV9MRVZFTFMgPT0gNCAqLworCisJLmFj dGl2YXRlX21tID0geGVuX2FjdGl2YXRlX21tLAorCS5kdXBfbW1hcCA9IHhlbl9kdXBfbW1hcCwK KwkuZXhpdF9tbWFwID0geGVuX2V4aXRfbW1hcCwKKworCS5sYXp5X21vZGUgPSB7CisJCS5lbnRl ciA9IHBhcmF2aXJ0X2VudGVyX2xhenlfbW11LAorCQkubGVhdmUgPSB4ZW5fbGVhdmVfbGF6eV9t bXUsCisJCS5mbHVzaCA9IHBhcmF2aXJ0X2ZsdXNoX2xhenlfbW11LAorCX0sCisKKwkuc2V0X2Zp eG1hcCA9IHhlbl9zZXRfZml4bWFwLAorfTsKKwordm9pZCBfX2luaXQgeGVuX2luaXRfbW11X29w cyh2b2lkKQoreworCXg4Nl9pbml0LnBhZ2luZy5wYWdldGFibGVfaW5pdCA9IHhlbl9wYWdldGFi bGVfaW5pdDsKKworCWlmICh4ZW5fZmVhdHVyZShYRU5GRUFUX2F1dG9fdHJhbnNsYXRlZF9waHlz bWFwKSkKKwkJcmV0dXJuOworCisJcHZfbW11X29wcyA9IHhlbl9tbXVfb3BzOworCisJbWVtc2V0 KGR1bW15X21hcHBpbmcsIDB4ZmYsIFBBR0VfU0laRSk7Cit9CisKKy8qIFByb3RlY3RlZCBieSB4 ZW5fcmVzZXJ2YXRpb25fbG9jay4gKi8KKyNkZWZpbmUgTUFYX0NPTlRJR19PUkRFUiA5IC8qIDJN QiAqLworc3RhdGljIHVuc2lnbmVkIGxvbmcgZGlzY29udGlnX2ZyYW1lc1sxPDxNQVhfQ09OVElH X09SREVSXTsKKworI2RlZmluZSBWT0lEX1BURSAobWZuX3B0ZSgwLCBfX3BncHJvdCgwKSkpCitz dGF0aWMgdm9pZCB4ZW5femFwX3Bmbl9yYW5nZSh1bnNpZ25lZCBsb25nIHZhZGRyLCB1bnNpZ25l ZCBpbnQgb3JkZXIsCisJCQkJdW5zaWduZWQgbG9uZyAqaW5fZnJhbWVzLAorCQkJCXVuc2lnbmVk IGxvbmcgKm91dF9mcmFtZXMpCit7CisJaW50IGk7CisJc3RydWN0IG11bHRpY2FsbF9zcGFjZSBt Y3M7CisKKwl4ZW5fbWNfYmF0Y2goKTsKKwlmb3IgKGkgPSAwOyBpIDwgKDFVTDw8b3JkZXIpOyBp KyssIHZhZGRyICs9IFBBR0VfU0laRSkgeworCQltY3MgPSBfX3hlbl9tY19lbnRyeSgwKTsKKwor CQlpZiAoaW5fZnJhbWVzKQorCQkJaW5fZnJhbWVzW2ldID0gdmlydF90b19tZm4odmFkZHIpOwor CisJCU1VTFRJX3VwZGF0ZV92YV9tYXBwaW5nKG1jcy5tYywgdmFkZHIsIFZPSURfUFRFLCAwKTsK KwkJX19zZXRfcGh5c190b19tYWNoaW5lKHZpcnRfdG9fcGZuKHZhZGRyKSwgSU5WQUxJRF9QMk1f RU5UUlkpOworCisJCWlmIChvdXRfZnJhbWVzKQorCQkJb3V0X2ZyYW1lc1tpXSA9IHZpcnRfdG9f cGZuKHZhZGRyKTsKKwl9CisJeGVuX21jX2lzc3VlKDApOworfQorCisvKgorICogVXBkYXRlIHRo ZSBwZm4tdG8tbWZuIG1hcHBpbmdzIGZvciBhIHZpcnR1YWwgYWRkcmVzcyByYW5nZSwgZWl0aGVy IHRvCisgKiBwb2ludCB0byBhbiBhcnJheSBvZiBtZm5zLCBvciBjb250aWd1b3VzbHkgZnJvbSBh IHNpbmdsZSBzdGFydGluZworICogbWZuLgorICovCitzdGF0aWMgdm9pZCB4ZW5fcmVtYXBfZXhj aGFuZ2VkX3B0ZXModW5zaWduZWQgbG9uZyB2YWRkciwgaW50IG9yZGVyLAorCQkJCSAgICAgdW5z aWduZWQgbG9uZyAqbWZucywKKwkJCQkgICAgIHVuc2lnbmVkIGxvbmcgZmlyc3RfbWZuKQorewor CXVuc2lnbmVkIGksIGxpbWl0OworCXVuc2lnbmVkIGxvbmcgbWZuOworCisJeGVuX21jX2JhdGNo KCk7CisKKwlsaW1pdCA9IDF1IDw8IG9yZGVyOworCWZvciAoaSA9IDA7IGkgPCBsaW1pdDsgaSsr LCB2YWRkciArPSBQQUdFX1NJWkUpIHsKKwkJc3RydWN0IG11bHRpY2FsbF9zcGFjZSBtY3M7CisJ CXVuc2lnbmVkIGZsYWdzOworCisJCW1jcyA9IF9feGVuX21jX2VudHJ5KDApOworCQlpZiAobWZu cykKKwkJCW1mbiA9IG1mbnNbaV07CisJCWVsc2UKKwkJCW1mbiA9IGZpcnN0X21mbiArIGk7CisK KwkJaWYgKGkgPCAobGltaXQgLSAxKSkKKwkJCWZsYWdzID0gMDsKKwkJZWxzZSB7CisJCQlpZiAo b3JkZXIgPT0gMCkKKwkJCQlmbGFncyA9IFVWTUZfSU5WTFBHIHwgVVZNRl9BTEw7CisJCQllbHNl CisJCQkJZmxhZ3MgPSBVVk1GX1RMQl9GTFVTSCB8IFVWTUZfQUxMOworCQl9CisKKwkJTVVMVElf dXBkYXRlX3ZhX21hcHBpbmcobWNzLm1jLCB2YWRkciwKKwkJCQltZm5fcHRlKG1mbiwgUEFHRV9L RVJORUwpLCBmbGFncyk7CisKKwkJc2V0X3BoeXNfdG9fbWFjaGluZSh2aXJ0X3RvX3Bmbih2YWRk ciksIG1mbik7CisJfQorCisJeGVuX21jX2lzc3VlKDApOworfQorCisvKgorICogUGVyZm9ybSB0 aGUgaHlwZXJjYWxsIHRvIGV4Y2hhbmdlIGEgcmVnaW9uIG9mIG91ciBwZm5zIHRvIHBvaW50IHRv CisgKiBtZW1vcnkgd2l0aCB0aGUgcmVxdWlyZWQgY29udGlndW91cyBhbGlnbm1lbnQuICBUYWtl cyB0aGUgcGZucyBhcworICogaW5wdXQsIGFuZCBwb3B1bGF0ZXMgbWZucyBhcyBvdXRwdXQuCisg KgorICogUmV0dXJucyBhIHN1Y2Nlc3MgY29kZSBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIGh5cGVy dmlzb3Igd2FzIGFibGUgdG8KKyAqIHNhdGlzZnkgdGhlIHJlcXVlc3Qgb3Igbm90LgorICovCitz dGF0aWMgaW50IHhlbl9leGNoYW5nZV9tZW1vcnkodW5zaWduZWQgbG9uZyBleHRlbnRzX2luLCB1 bnNpZ25lZCBpbnQgb3JkZXJfaW4sCisJCQkgICAgICAgdW5zaWduZWQgbG9uZyAqcGZuc19pbiwK KwkJCSAgICAgICB1bnNpZ25lZCBsb25nIGV4dGVudHNfb3V0LAorCQkJICAgICAgIHVuc2lnbmVk IGludCBvcmRlcl9vdXQsCisJCQkgICAgICAgdW5zaWduZWQgbG9uZyAqbWZuc19vdXQsCisJCQkg ICAgICAgdW5zaWduZWQgaW50IGFkZHJlc3NfYml0cykKK3sKKwlsb25nIHJjOworCWludCBzdWNj ZXNzOworCisJc3RydWN0IHhlbl9tZW1vcnlfZXhjaGFuZ2UgZXhjaGFuZ2UgPSB7CisJCS5pbiA9 IHsKKwkJCS5ucl9leHRlbnRzICAgPSBleHRlbnRzX2luLAorCQkJLmV4dGVudF9vcmRlciA9IG9y ZGVyX2luLAorCQkJLmV4dGVudF9zdGFydCA9IHBmbnNfaW4sCisJCQkuZG9taWQgICAgICAgID0g RE9NSURfU0VMRgorCQl9LAorCQkub3V0ID0geworCQkJLm5yX2V4dGVudHMgICA9IGV4dGVudHNf b3V0LAorCQkJLmV4dGVudF9vcmRlciA9IG9yZGVyX291dCwKKwkJCS5leHRlbnRfc3RhcnQgPSBt Zm5zX291dCwKKwkJCS5hZGRyZXNzX2JpdHMgPSBhZGRyZXNzX2JpdHMsCisJCQkuZG9taWQgICAg ICAgID0gRE9NSURfU0VMRgorCQl9CisJfTsKKworCUJVR19PTihleHRlbnRzX2luIDw8IG9yZGVy X2luICE9IGV4dGVudHNfb3V0IDw8IG9yZGVyX291dCk7CisKKwlyYyA9IEhZUEVSVklTT1JfbWVt b3J5X29wKFhFTk1FTV9leGNoYW5nZSwgJmV4Y2hhbmdlKTsKKwlzdWNjZXNzID0gKGV4Y2hhbmdl Lm5yX2V4Y2hhbmdlZCA9PSBleHRlbnRzX2luKTsKKworCUJVR19PTighc3VjY2VzcyAmJiAoKGV4 Y2hhbmdlLm5yX2V4Y2hhbmdlZCAhPSAwKSB8fCAocmMgPT0gMCkpKTsKKwlCVUdfT04oc3VjY2Vz cyAmJiAocmMgIT0gMCkpOworCisJcmV0dXJuIHN1Y2Nlc3M7Cit9CisKK2ludCB4ZW5fY3JlYXRl X2NvbnRpZ3VvdXNfcmVnaW9uKHBoeXNfYWRkcl90IHBzdGFydCwgdW5zaWduZWQgaW50IG9yZGVy LAorCQkJCSB1bnNpZ25lZCBpbnQgYWRkcmVzc19iaXRzLAorCQkJCSBkbWFfYWRkcl90ICpkbWFf aGFuZGxlKQoreworCXVuc2lnbmVkIGxvbmcgKmluX2ZyYW1lcyA9IGRpc2NvbnRpZ19mcmFtZXMs IG91dF9mcmFtZTsKKwl1bnNpZ25lZCBsb25nICBmbGFnczsKKwlpbnQgICAgICAgICAgICBzdWNj ZXNzOworCXVuc2lnbmVkIGxvbmcgdnN0YXJ0ID0gKHVuc2lnbmVkIGxvbmcpcGh5c190b192aXJ0 KHBzdGFydCk7CisKKwkvKgorCSAqIEN1cnJlbnRseSBhbiBhdXRvLXRyYW5zbGF0ZWQgZ3Vlc3Qg d2lsbCBub3QgcGVyZm9ybSBJL08sIG5vciB3aWxsCisJICogaXQgcmVxdWlyZSBQQUUgcGFnZSBk aXJlY3RvcmllcyBiZWxvdyA0R0IuIFRoZXJlZm9yZSBhbnkgY2FsbHMgdG8KKwkgKiB0aGlzIGZ1 bmN0aW9uIGFyZSByZWR1bmRhbnQgYW5kIGNhbiBiZSBpZ25vcmVkLgorCSAqLworCisJaWYgKHhl bl9mZWF0dXJlKFhFTkZFQVRfYXV0b190cmFuc2xhdGVkX3BoeXNtYXApKQorCQlyZXR1cm4gMDsK KworCWlmICh1bmxpa2VseShvcmRlciA+IE1BWF9DT05USUdfT1JERVIpKQorCQlyZXR1cm4gLUVO T01FTTsKKworCW1lbXNldCgodm9pZCAqKSB2c3RhcnQsIDAsIFBBR0VfU0laRSA8PCBvcmRlcik7 CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmeGVuX3Jlc2VydmF0aW9uX2xvY2ssIGZsYWdzKTsKKwor CS8qIDEuIFphcCBjdXJyZW50IFBURXMsIHJlbWVtYmVyaW5nIE1GTnMuICovCisJeGVuX3phcF9w Zm5fcmFuZ2UodnN0YXJ0LCBvcmRlciwgaW5fZnJhbWVzLCBOVUxMKTsKKworCS8qIDIuIEdldCBh IG5ldyBjb250aWd1b3VzIG1lbW9yeSBleHRlbnQuICovCisJb3V0X2ZyYW1lID0gdmlydF90b19w Zm4odnN0YXJ0KTsKKwlzdWNjZXNzID0geGVuX2V4Y2hhbmdlX21lbW9yeSgxVUwgPDwgb3JkZXIs IDAsIGluX2ZyYW1lcywKKwkJCQkgICAgICAxLCBvcmRlciwgJm91dF9mcmFtZSwKKwkJCQkgICAg ICBhZGRyZXNzX2JpdHMpOworCisJLyogMy4gTWFwIHRoZSBuZXcgZXh0ZW50IGluIHBsYWNlIG9m IG9sZCBwYWdlcy4gKi8KKwlpZiAoc3VjY2VzcykKKwkJeGVuX3JlbWFwX2V4Y2hhbmdlZF9wdGVz KHZzdGFydCwgb3JkZXIsIE5VTEwsIG91dF9mcmFtZSk7CisJZWxzZQorCQl4ZW5fcmVtYXBfZXhj aGFuZ2VkX3B0ZXModnN0YXJ0LCBvcmRlciwgaW5fZnJhbWVzLCAwKTsKKworCXNwaW5fdW5sb2Nr X2lycXJlc3RvcmUoJnhlbl9yZXNlcnZhdGlvbl9sb2NrLCBmbGFncyk7CisKKwkqZG1hX2hhbmRs ZSA9IHZpcnRfdG9fbWFjaGluZSh2c3RhcnQpLm1hZGRyOworCXJldHVybiBzdWNjZXNzID8gMCA6 IC1FTk9NRU07Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh4ZW5fY3JlYXRlX2NvbnRpZ3VvdXNfcmVn aW9uKTsKKwordm9pZCB4ZW5fZGVzdHJveV9jb250aWd1b3VzX3JlZ2lvbihwaHlzX2FkZHJfdCBw c3RhcnQsIHVuc2lnbmVkIGludCBvcmRlcikKK3sKKwl1bnNpZ25lZCBsb25nICpvdXRfZnJhbWVz ID0gZGlzY29udGlnX2ZyYW1lcywgaW5fZnJhbWU7CisJdW5zaWduZWQgbG9uZyAgZmxhZ3M7CisJ aW50IHN1Y2Nlc3M7CisJdW5zaWduZWQgbG9uZyB2c3RhcnQ7CisKKwlpZiAoeGVuX2ZlYXR1cmUo WEVORkVBVF9hdXRvX3RyYW5zbGF0ZWRfcGh5c21hcCkpCisJCXJldHVybjsKKworCWlmICh1bmxp a2VseShvcmRlciA+IE1BWF9DT05USUdfT1JERVIpKQorCQlyZXR1cm47CisKKwl2c3RhcnQgPSAo dW5zaWduZWQgbG9uZylwaHlzX3RvX3ZpcnQocHN0YXJ0KTsKKwltZW1zZXQoKHZvaWQgKikgdnN0 YXJ0LCAwLCBQQUdFX1NJWkUgPDwgb3JkZXIpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnhlbl9y ZXNlcnZhdGlvbl9sb2NrLCBmbGFncyk7CisKKwkvKiAxLiBGaW5kIHN0YXJ0IE1GTiBvZiBjb250 aWd1b3VzIGV4dGVudC4gKi8KKwlpbl9mcmFtZSA9IHZpcnRfdG9fbWZuKHZzdGFydCk7CisKKwkv KiAyLiBaYXAgY3VycmVudCBQVEVzLiAqLworCXhlbl96YXBfcGZuX3JhbmdlKHZzdGFydCwgb3Jk ZXIsIE5VTEwsIG91dF9mcmFtZXMpOworCisJLyogMy4gRG8gdGhlIGV4Y2hhbmdlIGZvciBub24t Y29udGlndW91cyBNRk5zLiAqLworCXN1Y2Nlc3MgPSB4ZW5fZXhjaGFuZ2VfbWVtb3J5KDEsIG9y ZGVyLCAmaW5fZnJhbWUsIDFVTCA8PCBvcmRlciwKKwkJCQkJMCwgb3V0X2ZyYW1lcywgMCk7CisK KwkvKiA0LiBNYXAgbmV3IHBhZ2VzIGluIHBsYWNlIG9mIG9sZCBwYWdlcy4gKi8KKwlpZiAoc3Vj Y2VzcykKKwkJeGVuX3JlbWFwX2V4Y2hhbmdlZF9wdGVzKHZzdGFydCwgb3JkZXIsIG91dF9mcmFt ZXMsIDApOworCWVsc2UKKwkJeGVuX3JlbWFwX2V4Y2hhbmdlZF9wdGVzKHZzdGFydCwgb3JkZXIs IE5VTEwsIGluX2ZyYW1lKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnhlbl9yZXNlcnZh dGlvbl9sb2NrLCBmbGFncyk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh4ZW5fZGVzdHJveV9jb250 aWd1b3VzX3JlZ2lvbik7Ci0tIAoyLjkuMwoKCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fClhlbi1kZXZlbCBtYWlsaW5nIGxpc3QKWGVuLWRldmVsQGxpc3Rz Lnhlbi5vcmcKaHR0cHM6Ly9saXN0cy54ZW4ub3JnL3hlbi1kZXZlbAo=