From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: From: "Gix, Brian" To: "marcel@holtmann.org" CC: "johan.hedberg@gmail.com" , "linux-bluetooth@vger.kernel.org" , "Stotland, Inga" Subject: Re: [PATCH BlueZ v5 02/14] mesh: Mesh crypto support Date: Sun, 8 Jul 2018 15:07:00 +0000 Message-ID: <1531062419.7346.19.camel@intel.com> References: <20180706171306.13501-1-brian.gix@intel.com> <20180706171306.13501-3-brian.gix@intel.com> <26C9EEB7-AC2B-4880-9C01-C287F45BB6CA@holtmann.org> In-Reply-To: <26C9EEB7-AC2B-4880-9C01-C287F45BB6CA@holtmann.org> Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 List-ID: SGkgTWFyY2VsLA0KDQpBbGwgb2YgeW91ciBiZWxvdyBjb21tZW50cyB3aWxsIGJlIGluY29ycG9y YXRlZCBpbnRvIHBhdGNoc2V0IHY2DQoNCk9uIEZyaSwgMjAxOC0wNy0wNiBhdCAyMDoxMCArMDIw MCwgTWFyY2VsIEhvbHRtYW5uIHdyb3RlOg0KPiBIaSBCcmlhbiwNCj4gDQo+ID4gLS0tDQo+ID4g bWVzaC9jcnlwdG8uYyB8IDE2MDcgKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysr KysrKysrKysrKysrKysrKysrKysrDQo+ID4gMSBmaWxlIGNoYW5nZWQsIDE2MDcgaW5zZXJ0aW9u cygrKQ0KPiA+IGNyZWF0ZSBtb2RlIDEwMDY0NCBtZXNoL2NyeXB0by5jDQo+IA0KPiB3aGF0IEkg YW0gbWlzc2luZyBpcyBhIHVuaXQvdGVzdC1tZXNoLWNyeXB0byB3aXRoIHRoZSBNZXNoIHRlc3Qg dmVjdG9ycy4NCj4gDQo+ID4gDQo+ID4gZGlmZiAtLWdpdCBhL21lc2gvY3J5cHRvLmMgYi9tZXNo L2NyeXB0by5jDQo+ID4gbmV3IGZpbGUgbW9kZSAxMDA2NDQNCj4gPiBpbmRleCAwMDAwMDAwMDAu LmM0MjRjZjYyMg0KPiA+IC0tLSAvZGV2L251bGwNCj4gPiArKysgYi9tZXNoL2NyeXB0by5jDQo+ ID4gQEAgLTAsMCArMSwxNjA3IEBADQo+ID4gKy8qDQo+ID4gKyAqDQo+ID4gKyAqICBCbHVlWiAt IEJsdWV0b290aCBwcm90b2NvbCBzdGFjayBmb3IgTGludXgNCj4gPiArICoNCj4gPiArICogIENv cHlyaWdodCAoQykgMjAxOCAgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQu DQo+ID4gKyAqDQo+ID4gKyAqDQo+ID4gKyAqICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2Fy ZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yDQo+ID4gKyAqICBtb2RpZnkgaXQgdW5k ZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljDQo+ID4gKyAqICBM aWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRo ZXINCj4gPiArICogIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRp b24pIGFueSBsYXRlciB2ZXJzaW9uLg0KPiA+ICsgKg0KPiA+ICsgKiAgVGhpcyBsaWJyYXJ5IGlz IGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsDQo+ID4gKyAq ICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJy YW50eSBvZg0KPiA+ICsgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElD VUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUNCj4gPiArICogIExlc3NlciBHZW5lcmFsIFB1Ymxp YyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuDQo+ID4gKyAqDQo+ID4gKyAqLw0KPiA+ICsNCj4g PiArI2lmZGVmIEhBVkVfQ09ORklHX0gNCj4gPiArI2luY2x1ZGUgPGNvbmZpZy5oPg0KPiA+ICsj ZW5kaWYNCj4gPiArDQo+ID4gKyNpbmNsdWRlIDxmY250bC5oPg0KPiA+ICsjaW5jbHVkZSA8dW5p c3RkLmg+DQo+ID4gKyNpbmNsdWRlIDxzdHJpbmcuaD4NCj4gPiArI2luY2x1ZGUgPHN5cy9zb2Nr ZXQuaD4NCj4gPiArI2luY2x1ZGUgPGVsbC9lbGwuaD4NCj4gPiArDQo+ID4gKyNpbmNsdWRlIDxs aW51eC9pZl9hbGcuaD4NCj4gPiArDQo+ID4gKyNpZm5kZWYgU09MX0FMRw0KPiA+ICsjZGVmaW5l IFNPTF9BTEcJCTI3OQ0KPiA+ICsjZW5kaWYNCj4gPiArDQo+ID4gKyNpZm5kZWYgQUxHX1NFVF9B RUFEX0FVVEhTSVpFDQo+ID4gKyNkZWZpbmUgQUxHX1NFVF9BRUFEX0FVVEhTSVpFCTUNCj4gPiAr I2VuZGlmDQo+ID4gKw0KPiA+ICsjaW5jbHVkZSAibWVzaC9tZXNoLmgiDQo+ID4gKyNpbmNsdWRl ICJtZXNoL25vZGUuaCINCj4gPiArI2luY2x1ZGUgIm1lc2gvbmV0LmgiDQo+ID4gKyNpbmNsdWRl ICJtZXNoL2NyeXB0by5oIg0KPiA+ICsjaW5jbHVkZSAibWVzaC9kaXNwbGF5LmgiDQo+IA0KPiBO byBpZGVhIHdoeSB5b3Ugd291bGQgbmVlZCBtZXNoL2Rpc3BsYXkuaCBoZXJlLg0KPiANCj4gPiAr DQo+ID4gK3N0YXRpYyBpbnQgYWxnX25ldyhpbnQgZmQsIGNvbnN0IHZvaWQgKmtleXZhbCwgc29j a2xlbl90IGtleWxlbiwNCj4gPiArCQkJCQkJCXNpemVfdCBtaWNfc2l6ZSkNCj4gPiArew0KPiA+ ICsJaWYgKHNldHNvY2tvcHQoZmQsIFNPTF9BTEcsIEFMR19TRVRfS0VZLCBrZXl2YWwsIGtleWxl bikgPCAwKSB7DQo+ID4gKwkJbF9lcnJvcigia2V5Iik7DQo+ID4gKwkJcmV0dXJuIC0xOw0KPiA+ ICsJfQ0KPiA+ICsNCj4gPiArCWlmIChtaWNfc2l6ZSAmJg0KPiA+ICsJCXNldHNvY2tvcHQoZmQs IFNPTF9BTEcsIEFMR19TRVRfQUVBRF9BVVRIU0laRSwNCj4gPiArCQkJCQkJCU5VTEwsIG1pY19z aXplKSA8IDApIHsNCj4gPiArCQlsX2Vycm9yKCJ0YWdsZW4iKTsNCj4gDQo+IEkgYW0gbm90IHN1 cmUgd2Ugc2hvdWxkIHByaW50IGVycm9ycyBoZXJlLg0KPiANCj4gPiArCQlyZXR1cm4gLTE7DQo+ ID4gKwl9DQo+ID4gKw0KPiA+ICsJLyogRklYTUU6IFRoaXMgc2hvdWxkIHVzZSBhY2NlcHQ0KCkg d2l0aCBTT0NLX0NMT0VYRUMgKi8NCj4gPiArCXJldHVybiBhY2NlcHQoZmQsIE5VTEwsIDApOw0K PiA+ICt9DQo+ID4gKw0KPiA+ICtzdGF0aWMgYm9vbCBhbGdfZW5jcnlwdChpbnQgZmQsIGNvbnN0 IHZvaWQgKmluYnVmLCBzaXplX3QgaW5sZW4sDQo+ID4gKwkJCQkJCXZvaWQgKm91dGJ1Ziwgc2l6 ZV90IG91dGxlbikNCj4gPiArew0KPiA+ICsJX191MzIgYWxnX29wID0gQUxHX09QX0VOQ1JZUFQ7 DQo+ID4gKwljaGFyIGNidWZbQ01TR19TUEFDRShzaXplb2YoYWxnX29wKSldOw0KPiA+ICsJc3Ry dWN0IGNtc2doZHIgKmNtc2c7DQo+ID4gKwlzdHJ1Y3QgbXNnaGRyIG1zZzsNCj4gPiArCXN0cnVj dCBpb3ZlYyBpb3Y7DQo+ID4gKwlzc2l6ZV90IGxlbjsNCj4gPiArDQo+ID4gKwltZW1zZXQoY2J1 ZiwgMCwgc2l6ZW9mKGNidWYpKTsNCj4gPiArCW1lbXNldCgmbXNnLCAwLCBzaXplb2YobXNnKSk7 DQo+ID4gKw0KPiA+ICsJbXNnLm1zZ19jb250cm9sID0gY2J1ZjsNCj4gPiArCW1zZy5tc2dfY29u dHJvbGxlbiA9IHNpemVvZihjYnVmKTsNCj4gPiArDQo+ID4gKwljbXNnID0gQ01TR19GSVJTVEhE UigmbXNnKTsNCj4gPiArCWNtc2ctPmNtc2dfbGV2ZWwgPSBTT0xfQUxHOw0KPiA+ICsJY21zZy0+ Y21zZ190eXBlID0gQUxHX1NFVF9PUDsNCj4gPiArCWNtc2ctPmNtc2dfbGVuID0gQ01TR19MRU4o c2l6ZW9mKGFsZ19vcCkpOw0KPiA+ICsJbWVtY3B5KENNU0dfREFUQShjbXNnKSwgJmFsZ19vcCwg c2l6ZW9mKGFsZ19vcCkpOw0KPiA+ICsNCj4gPiArCWlvdi5pb3ZfYmFzZSA9ICh2b2lkICopIGlu YnVmOw0KPiA+ICsJaW92Lmlvdl9sZW4gPSBpbmxlbjsNCj4gPiArDQo+ID4gKwltc2cubXNnX2lv diA9ICZpb3Y7DQo+ID4gKwltc2cubXNnX2lvdmxlbiA9IDE7DQo+ID4gKw0KPiA+ICsJbGVuID0g c2VuZG1zZyhmZCwgJm1zZywgMCk7DQo+ID4gKwlpZiAobGVuIDwgMCkNCj4gPiArCQlyZXR1cm4g ZmFsc2U7DQo+ID4gKw0KPiA+ICsJbGVuID0gcmVhZChmZCwgb3V0YnVmLCBvdXRsZW4pOw0KPiA+ ICsJaWYgKGxlbiA8IDApDQo+ID4gKwkJcmV0dXJuIGZhbHNlOw0KPiA+ICsNCj4gPiArCXJldHVy biB0cnVlOw0KPiA+ICt9DQo+ID4gKw0KPiA+ICtzdGF0aWMgaW50IGFlc19lY2Jfc2V0dXAoY29u c3QgdWludDhfdCBrZXlbMTZdKQ0KPiA+ICt7DQo+ID4gKwlzdHJ1Y3Qgc29ja2FkZHJfYWxnIHNh bGc7DQo+ID4gKwlpbnQgZmQsIG5mZDsNCj4gPiArDQo+ID4gKwlmZCA9IHNvY2tldChQRl9BTEcs IFNPQ0tfU0VRUEFDS0VUIHwgU09DS19DTE9FWEVDLCAwKTsNCj4gPiArCWlmIChmZCA8IDApDQo+ ID4gKwkJcmV0dXJuIC0xOw0KPiA+ICsNCj4gPiArCW1lbXNldCgmc2FsZywgMCwgc2l6ZW9mKHNh bGcpKTsNCj4gPiArCXNhbGcuc2FsZ19mYW1pbHkgPSBBRl9BTEc7DQo+ID4gKwlzdHJjcHkoKGNo YXIgKikgc2FsZy5zYWxnX3R5cGUsICJza2NpcGhlciIpOw0KPiA+ICsJc3RyY3B5KChjaGFyICop IHNhbGcuc2FsZ19uYW1lLCAiZWNiKGFlcykiKTsNCj4gPiArDQo+ID4gKwlpZiAoYmluZChmZCwg KHN0cnVjdCBzb2NrYWRkciAqKSAmc2FsZywgc2l6ZW9mKHNhbGcpKSA8IDApIHsNCj4gPiArCQlj bG9zZShmZCk7DQo+ID4gKwkJcmV0dXJuIC0xOw0KPiA+ICsJfQ0KPiA+ICsNCj4gPiArCW5mZCA9 IGFsZ19uZXcoZmQsIGtleSwgMTYsIDApOw0KPiA+ICsNCj4gPiArCWNsb3NlKGZkKTsNCj4gPiAr DQo+ID4gKwlyZXR1cm4gbmZkOw0KPiA+ICt9DQo+ID4gKw0KPiA+ICtzdGF0aWMgYm9vbCBhZXNf ZWNiKGludCBmZCwgY29uc3QgdWludDhfdCBwbGFpbnRleHRbMTZdLCB1aW50OF90IGVuY3J5cHRl ZFsxNl0pDQo+ID4gK3sNCj4gPiArCXJldHVybiBhbGdfZW5jcnlwdChmZCwgcGxhaW50ZXh0LCAx NiwgZW5jcnlwdGVkLCAxNik7DQo+ID4gK30NCj4gPiArDQo+ID4gK3N0YXRpYyB2b2lkIGFlc19l Y2JfZGVzdHJveShpbnQgZmQpDQo+ID4gK3sNCj4gPiArCWNsb3NlKGZkKTsNCj4gPiArfQ0KPiA+ ICsNCj4gPiArc3RhdGljIGJvb2wgYWVzX2VjYl9vbmUoY29uc3QgdWludDhfdCBrZXlbMTZdLA0K PiA+ICsJCQljb25zdCB1aW50OF90IHBsYWludGV4dFsxNl0sIHVpbnQ4X3QgZW5jcnlwdGVkWzE2 XSkNCj4gPiArew0KPiA+ICsJYm9vbCByZXN1bHQ7DQo+ID4gKwlpbnQgZmQ7DQo+ID4gKw0KPiA+ ICsJZmQgPSBhZXNfZWNiX3NldHVwKGtleSk7DQo+ID4gKwlpZiAoZmQgPCAwKQ0KPiA+ICsJCXJl dHVybiBmYWxzZTsNCj4gPiArDQo+ID4gKwlyZXN1bHQgPSBhZXNfZWNiKGZkLCBwbGFpbnRleHQs IGVuY3J5cHRlZCk7DQo+ID4gKw0KPiA+ICsJYWVzX2VjYl9kZXN0cm95KGZkKTsNCj4gPiArDQo+ ID4gKwlyZXR1cm4gcmVzdWx0Ow0KPiA+ICt9DQo+ID4gKw0KPiA+ICtib29sIG1lc2hfYWVzX2Vj Yl9vbmUoY29uc3QgdWludDhfdCBrZXlbMTZdLA0KPiA+ICsJCQljb25zdCB1aW50OF90IHBsYWlu dGV4dFsxNl0sIHVpbnQ4X3QgZW5jcnlwdGVkWzE2XSkNCj4gPiArew0KPiA+ICsJcmV0dXJuIGFl c19lY2Jfb25lKGtleSwgcGxhaW50ZXh0LCBlbmNyeXB0ZWQpOw0KPiA+ICt9DQo+ID4gKw0KPiA+ ICsvKiBNYXhpbXVtIG1lc3NhZ2UgbGVuZ3RoIHRoYXQgY2FuIGJlIHBhc3NlZCB0byBhZXNfY21h YyAqLw0KPiA+ICsjZGVmaW5lIENNQUNfTVNHX01BWAkoNjQgKyA2NCArIDE3KQ0KPiA+ICsNCj4g PiArc3RhdGljIGludCBhZXNfY21hY19zZXR1cChjb25zdCB1aW50OF90IGtleVsxNl0pDQo+ID4g K3sNCj4gPiArCXN0cnVjdCBzb2NrYWRkcl9hbGcgc2FsZzsNCj4gPiArCWludCBmZCwgbmZkOw0K PiA+ICsNCj4gPiArCWZkID0gc29ja2V0KFBGX0FMRywgU09DS19TRVFQQUNLRVQgfCBTT0NLX0NM T0VYRUMsIDApOw0KPiA+ICsJaWYgKGZkIDwgMCkNCj4gPiArCQlyZXR1cm4gLTE7DQo+ID4gKw0K PiA+ICsJbWVtc2V0KCZzYWxnLCAwLCBzaXplb2Yoc2FsZykpOw0KPiA+ICsJc2FsZy5zYWxnX2Zh bWlseSA9IEFGX0FMRzsNCj4gPiArCXN0cmNweSgoY2hhciAqKSBzYWxnLnNhbGdfdHlwZSwgImhh c2giKTsNCj4gPiArCXN0cmNweSgoY2hhciAqKSBzYWxnLnNhbGdfbmFtZSwgImNtYWMoYWVzKSIp Ow0KPiA+ICsNCj4gPiArCWlmIChiaW5kKGZkLCAoc3RydWN0IHNvY2thZGRyICopICZzYWxnLCBz aXplb2Yoc2FsZykpIDwgMCkgew0KPiA+ICsJCWNsb3NlKGZkKTsNCj4gPiArCQlyZXR1cm4gLTE7 DQo+ID4gKwl9DQo+ID4gKw0KPiA+ICsJbmZkID0gYWxnX25ldyhmZCwga2V5LCAxNiwgMCk7DQo+ ID4gKw0KPiA+ICsJY2xvc2UoZmQpOw0KPiA+ICsNCj4gPiArCXJldHVybiBuZmQ7DQo+ID4gK30N Cj4gPiArDQo+ID4gK3N0YXRpYyBib29sIGFlc19jbWFjKGludCBmZCwgY29uc3QgdWludDhfdCAq bXNnLA0KPiA+ICsJCQkJCXNpemVfdCBtc2dfbGVuLCB1aW50OF90IHJlc1sxNl0pDQo+ID4gK3sN Cj4gPiArCXNzaXplX3QgbGVuOw0KPiA+ICsNCj4gPiArCWlmIChtc2dfbGVuID4gQ01BQ19NU0df TUFYKQ0KPiA+ICsJCXJldHVybiBmYWxzZTsNCj4gPiArDQo+ID4gKwlsZW4gPSBzZW5kKGZkLCBt c2csIG1zZ19sZW4sIDApOw0KPiA+ICsJaWYgKGxlbiA8IDApDQo+ID4gKwkJcmV0dXJuIGZhbHNl Ow0KPiA+ICsNCj4gPiArCWxlbiA9IHJlYWQoZmQsIHJlcywgMTYpOw0KPiA+ICsJaWYgKGxlbiA8 IDApDQo+ID4gKwkJcmV0dXJuIGZhbHNlOw0KPiA+ICsNCj4gPiArCXJldHVybiB0cnVlOw0KPiA+ ICt9DQo+ID4gKw0KPiA+ICtzdGF0aWMgdm9pZCBhZXNfY21hY19kZXN0cm95KGludCBmZCkNCj4g PiArew0KPiA+ICsJY2xvc2UoZmQpOw0KPiA+ICt9DQo+ID4gKw0KPiA+ICtzdGF0aWMgaW50IGFl c19jbWFjX05fc3RhcnQoY29uc3QgdWludDhfdCBOWzE2XSkNCj4gPiArew0KPiA+ICsJaW50IGZk Ow0KPiA+ICsNCj4gPiArCWZkID0gYWVzX2NtYWNfc2V0dXAoTik7DQo+ID4gKwlyZXR1cm4gZmQ7 DQo+ID4gK30NCj4gPiArDQo+ID4gK3N0YXRpYyBib29sIGFlc19jbWFjX29uZShjb25zdCB1aW50 OF90IGtleVsxNl0sIGNvbnN0IHZvaWQgKm1zZywNCj4gPiArCQkJCQlzaXplX3QgbXNnX2xlbiwg dWludDhfdCByZXNbMTZdKQ0KPiA+ICt7DQo+ID4gKwlib29sIHJlc3VsdDsNCj4gPiArCWludCBm ZDsNCj4gPiArDQo+ID4gKwlmZCA9IGFlc19jbWFjX3NldHVwKGtleSk7DQo+ID4gKwlpZiAoZmQg PCAwKQ0KPiA+ICsJCXJldHVybiBmYWxzZTsNCj4gPiArDQo+ID4gKwlyZXN1bHQgPSBhZXNfY21h YyhmZCwgbXNnLCBtc2dfbGVuLCByZXMpOw0KPiA+ICsNCj4gPiArCWFlc19jbWFjX2Rlc3Ryb3ko ZmQpOw0KPiA+ICsNCj4gPiArCXJldHVybiByZXN1bHQ7DQo+ID4gK30NCj4gPiArDQo+ID4gK2Jv b2wgbWVzaF9jcnlwdG9fYWVzX2NtYWMoY29uc3QgdWludDhfdCBrZXlbMTZdLCBjb25zdCB1aW50 OF90ICptc2csDQo+ID4gKwkJCQkJc2l6ZV90IG1zZ19sZW4sIHVpbnQ4X3QgcmVzWzE2XSkNCj4g PiArew0KPiA+ICsJcmV0dXJuIGFlc19jbWFjX29uZShrZXksIG1zZywgbXNnX2xlbiwgcmVzKTsN Cj4gPiArfQ0KPiA+ICsNCj4gPiArYm9vbCBtZXNoX2NyeXB0b19hZXNfY2NtX2VuY3J5cHQoY29u c3QgdWludDhfdCBub25jZVsxM10sIGNvbnN0IHVpbnQ4X3Qga2V5WzE2XSwNCj4gPiArCQkJCQlj b25zdCB1aW50OF90ICphYWQsIHVpbnQxNl90IGFhZF9sZW4sDQo+ID4gKwkJCQkJY29uc3QgdWlu dDhfdCAqbXNnLCB1aW50MTZfdCBtc2dfbGVuLA0KPiA+ICsJCQkJCXVpbnQ4X3QgKm91dF9tc2cs DQo+ID4gKwkJCQkJdm9pZCAqb3V0X21pYywgc2l6ZV90IG1pY19zaXplKQ0KPiA+ICt7DQo+ID4g Kwl1aW50OF90IHBtc2dbMTZdLCBjbWljWzE2XSwgY21zZ1sxNl07DQo+ID4gKwl1aW50OF90IG1p Y1sxNl0sIFhuWzE2XTsNCj4gPiArCXVpbnQxNl90IGJsa19jbnQsIGxhc3RfYmxrOw0KPiA+ICsJ Ym9vbCByZXN1bHQ7DQo+ID4gKwlzaXplX3QgaSwgajsNCj4gPiArCWludCBmZDsNCj4gPiArDQo+ ID4gKwlpZiAoYWFkX2xlbiA+PSAweGZmMDApIHsNCj4gPiArCQlsX2Vycm9yKCJVbnN1cHBvcnRl ZCBBQUQgc2l6ZSIpOw0KPiA+ICsJCXJldHVybiBmYWxzZTsNCj4gPiArCX0NCj4gDQo+IFNhbWUg Y29tbWVudCBmb3IgdGhlIGVycm9ycy4NCj4gDQo+IEluIGEgZm9sbG93IHVwIHBhdGNoLCBJIHdv dWxkIHByZWZlciB0aGF0IHdlIG1vdmUgb3ZlciB0byB1c2UgdGhlIGtlcm5lbCBBRVMtQ01BQyBz dXBwb3J0Lg0KPiANCj4gPiArDQo+ID4gKwlmZCA9IGFlc19lY2Jfc2V0dXAoa2V5KTsNCj4gPiAr CWlmIChmZCA8IDApDQo+ID4gKwkJcmV0dXJuIGZhbHNlOw0KPiA+ICsNCj4gPiArCS8qIENfbWlj ID0gZShBcHBLZXksIDB4MDEgfHwgbm9uY2UgfHwgMHgwMDAwKSAqLw0KPiA+ICsJcG1zZ1swXSA9 IDB4MDE7DQo+ID4gKwltZW1jcHkocG1zZyArIDEsIG5vbmNlLCAxMyk7DQo+ID4gKwlsX3B1dF9i ZTE2KDB4MDAwMCwgcG1zZyArIDE0KTsNCj4gPiArDQo+ID4gKwlyZXN1bHQgPSBhZXNfZWNiKGZk LCBwbXNnLCBjbWljKTsNCj4gPiArCWlmICghcmVzdWx0KQ0KPiA+ICsJCWdvdG8gZG9uZTsNCj4g PiArDQo+ID4gKwkvKiBYXzAgPSBlKEFwcEtleSwgMHgwOSB8fCBub25jZSB8fCBsZW5ndGgpICov DQo+ID4gKwlpZiAobWljX3NpemUgPT0gc2l6ZW9mKHVpbnQ2NF90KSkNCj4gPiArCQlwbXNnWzBd ID0gMHgxOSB8IChhYWRfbGVuID8gMHg0MCA6IDB4MDApOw0KPiA+ICsJZWxzZQ0KPiA+ICsJCXBt c2dbMF0gPSAweDA5IHwgKGFhZF9sZW4gPyAweDQwIDogMHgwMCk7DQo+ID4gKw0KPiA+ICsJbWVt Y3B5KHBtc2cgKyAxLCBub25jZSwgMTMpOw0KPiA+ICsJbF9wdXRfYmUxNihtc2dfbGVuLCBwbXNn ICsgMTQpOw0KPiA+ICsNCj4gPiArCXJlc3VsdCA9IGFlc19lY2IoZmQsIHBtc2csIFhuKTsNCj4g PiArCWlmICghcmVzdWx0KQ0KPiA+ICsJCWdvdG8gZG9uZTsNCj4gPiArDQo+ID4gKwkvKiBJZiBB QUQgaXMgYmVpbmcgdXNlZCB0byBhdXRoZW50aWNhdGUsIGluY2x1ZGUgaXQgaGVyZSAqLw0KPiA+ ICsJaWYgKGFhZF9sZW4pIHsNCj4gPiArCQlsX3B1dF9iZTE2KGFhZF9sZW4sIHBtc2cpOw0KPiA+ ICsNCj4gPiArCQlmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKHVpbnQxNl90KTsgaSsrKQ0KPiA+ICsJ CQlwbXNnW2ldID0gWG5baV0gXiBwbXNnW2ldOw0KPiA+ICsNCj4gPiArCQlqID0gMDsNCj4gPiAr CQlhYWRfbGVuICs9IHNpemVvZih1aW50MTZfdCk7DQo+ID4gKwkJd2hpbGUgKGFhZF9sZW4gPiAx Nikgew0KPiA+ICsJCQlkbyB7DQo+ID4gKwkJCQlwbXNnW2ldID0gWG5baV0gXiBhYWRbal07DQo+ ID4gKwkJCQlpKyssIGorKzsNCj4gPiArCQkJfSB3aGlsZSAoaSA8IDE2KTsNCj4gPiArDQo+ID4g KwkJCWFhZF9sZW4gLT0gMTY7DQo+ID4gKwkJCWkgPSAwOw0KPiA+ICsNCj4gPiArCQkJcmVzdWx0 ID0gYWVzX2VjYihmZCwgcG1zZywgWG4pOw0KPiA+ICsJCQlpZiAoIXJlc3VsdCkNCj4gPiArCQkJ CWdvdG8gZG9uZTsNCj4gPiArCQl9DQo+ID4gKw0KPiA+ICsJCWZvciAoaSA9IDA7IGkgPCBhYWRf bGVuOyBpKyssIGorKykNCj4gPiArCQkJcG1zZ1tpXSA9IFhuW2ldIF4gYWFkW2pdOw0KPiA+ICsN Cj4gPiArCQlmb3IgKGkgPSBhYWRfbGVuOyBpIDwgMTY7IGkrKykNCj4gPiArCQkJcG1zZ1tpXSA9 IFhuW2ldOw0KPiA+ICsNCj4gPiArCQlyZXN1bHQgPSBhZXNfZWNiKGZkLCBwbXNnLCBYbik7DQo+ ID4gKwkJaWYgKCFyZXN1bHQpDQo+ID4gKwkJCWdvdG8gZG9uZTsNCj4gPiArCX0NCj4gPiArDQo+ ID4gKwlsYXN0X2JsayA9IG1zZ19sZW4gJSAxNjsNCj4gPiArCWJsa19jbnQgPSAobXNnX2xlbiAr IDE1KSAvIDE2Ow0KPiA+ICsJaWYgKCFsYXN0X2JsaykNCj4gPiArCQlsYXN0X2JsayA9IDE2Ow0K PiA+ICsNCj4gPiArCWZvciAoaiA9IDA7IGogPCBibGtfY250OyBqKyspIHsNCj4gPiArCQlpZiAo aiArIDEgPT0gYmxrX2NudCkgew0KPiA+ICsJCQkvKiBYXzEgPSBlKEFwcEtleSwgWF8wIF4gUGF5 bG9hZFswLTE1XSkgKi8NCj4gPiArCQkJZm9yIChpID0gMDsgaSA8IGxhc3RfYmxrOyBpKyspDQo+ ID4gKwkJCQlwbXNnW2ldID0gWG5baV0gXiBtc2dbKGogKiAxNikgKyBpXTsNCj4gPiArCQkJZm9y IChpID0gbGFzdF9ibGs7IGkgPCAxNjsgaSsrKQ0KPiA+ICsJCQkJcG1zZ1tpXSA9IFhuW2ldIF4g MHgwMDsNCj4gPiArDQo+ID4gKwkJCXJlc3VsdCA9IGFlc19lY2IoZmQsIHBtc2csIFhuKTsNCj4g PiArCQkJaWYgKCFyZXN1bHQpDQo+ID4gKwkJCQlnb3RvIGRvbmU7DQo+ID4gKw0KPiA+ICsJCQkv KiBNSUMgPSBDX21pYyBeIFhfMSAqLw0KPiA+ICsJCQlmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKG1p Yyk7IGkrKykNCj4gPiArCQkJCW1pY1tpXSA9IGNtaWNbaV0gXiBYbltpXTsNCj4gPiArDQo+ID4g KwkJCS8qIENfMSA9IGUoQXBwS2V5LCAweDAxIHx8IG5vbmNlIHx8IDB4MDAwMSkgKi8NCj4gPiAr CQkJcG1zZ1swXSA9IDB4MDE7DQo+ID4gKwkJCW1lbWNweShwbXNnICsgMSwgbm9uY2UsIDEzKTsN Cj4gPiArCQkJbF9wdXRfYmUxNihqICsgMSwgcG1zZyArIDE0KTsNCj4gPiArDQo+ID4gKwkJCXJl c3VsdCA9IGFlc19lY2IoZmQsIHBtc2csIGNtc2cpOw0KPiA+ICsJCQlpZiAoIXJlc3VsdCkNCj4g PiArCQkJCWdvdG8gZG9uZTsNCj4gPiArDQo+ID4gKwkJCWlmIChvdXRfbXNnKSB7DQo+ID4gKwkJ CQkvKiBFbmNyeXB0ZWQgPSBQYXlsb2FkWzAtMTVdIF4gQ18xICovDQo+ID4gKwkJCQlmb3IgKGkg PSAwOyBpIDwgbGFzdF9ibGs7IGkrKykNCj4gPiArCQkJCQlvdXRfbXNnWyhqICogMTYpICsgaV0g PQ0KPiA+ICsJCQkJCQltc2dbKGogKiAxNikgKyBpXSBeIGNtc2dbaV07DQo+ID4gKw0KPiA+ICsJ CQl9DQo+ID4gKwkJfSBlbHNlIHsNCj4gPiArCQkJLyogWF8xID0gZShBcHBLZXksIFhfMCBeIFBh eWxvYWRbMC0xNV0pICovDQo+ID4gKwkJCWZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQ0KPiA+ICsJ CQkJcG1zZ1tpXSA9IFhuW2ldIF4gbXNnWyhqICogMTYpICsgaV07DQo+ID4gKw0KPiA+ICsJCQly ZXN1bHQgPSBhZXNfZWNiKGZkLCBwbXNnLCBYbik7DQo+ID4gKwkJCWlmICghcmVzdWx0KQ0KPiA+ ICsJCQkJZ290byBkb25lOw0KPiA+ICsNCj4gPiArCQkJLyogQ18xID0gZShBcHBLZXksIDB4MDEg fHwgbm9uY2UgfHwgMHgwMDAxKSAqLw0KPiA+ICsJCQlwbXNnWzBdID0gMHgwMTsNCj4gPiArCQkJ bWVtY3B5KHBtc2cgKyAxLCBub25jZSwgMTMpOw0KPiA+ICsJCQlsX3B1dF9iZTE2KGogKyAxLCBw bXNnICsgMTQpOw0KPiA+ICsNCj4gPiArCQkJcmVzdWx0ID0gYWVzX2VjYihmZCwgcG1zZywgY21z Zyk7DQo+ID4gKwkJCWlmICghcmVzdWx0KQ0KPiA+ICsJCQkJZ290byBkb25lOw0KPiA+ICsNCj4g PiArCQkJaWYgKG91dF9tc2cpIHsNCj4gPiArCQkJCS8qIEVuY3J5cHRlZCA9IFBheWxvYWRbMC0x NV0gXiBDX04gKi8NCj4gPiArCQkJCWZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQ0KPiA+ICsJCQkJ CW91dF9tc2dbKGogKiAxNikgKyBpXSA9DQo+ID4gKwkJCQkJCW1zZ1soaiAqIDE2KSArIGldIF4g Y21zZ1tpXTsNCj4gPiArCQkJfQ0KPiA+ICsNCj4gPiArCQl9DQo+ID4gKwl9DQo+ID4gKw0KPiA+ ICsJaWYgKG91dF9tc2cpDQo+ID4gKwkJbWVtY3B5KG91dF9tc2cgKyBtc2dfbGVuLCBtaWMsIG1p Y19zaXplKTsNCj4gPiArDQo+ID4gKwlpZiAob3V0X21pYykgew0KPiA+ICsJCXN3aXRjaCAobWlj X3NpemUpIHsNCj4gPiArCQljYXNlIHNpemVvZih1aW50MzJfdCk6DQo+ID4gKwkJCSoodWludDMy X3QgKilvdXRfbWljID0gbF9nZXRfYmUzMihtaWMpOw0KPiA+ICsJCQlicmVhazsNCj4gPiArCQlj YXNlIHNpemVvZih1aW50NjRfdCk6DQo+ID4gKwkJCSoodWludDY0X3QgKilvdXRfbWljID0gbF9n ZXRfYmU2NChtaWMpOw0KPiA+ICsJCQlicmVhazsNCj4gPiArCQlkZWZhdWx0Og0KPiA+ICsJCQls X2Vycm9yKCJVbnN1cHBvcnRlZCBNSUMgc2l6ZSIpOw0KPiA+ICsJCX0NCj4gPiArCX0NCj4gPiAr DQo+ID4gK2RvbmU6DQo+ID4gKwlhZXNfZWNiX2Rlc3Ryb3koZmQpOw0KPiA+ICsNCj4gPiArCXJl dHVybiByZXN1bHQ7DQo+ID4gK30NCj4gPiArDQo+ID4gK2Jvb2wgbWVzaF9jcnlwdG9fYWVzX2Nj bV9kZWNyeXB0KGNvbnN0IHVpbnQ4X3Qgbm9uY2VbMTNdLCBjb25zdCB1aW50OF90IGtleVsxNl0s DQo+ID4gKwkJCQljb25zdCB1aW50OF90ICphYWQsIHVpbnQxNl90IGFhZF9sZW4sDQo+ID4gKwkJ CQljb25zdCB1aW50OF90ICplbmNfbXNnLCB1aW50MTZfdCBlbmNfbXNnX2xlbiwNCj4gPiArCQkJ CXVpbnQ4X3QgKm91dF9tc2csDQo+ID4gKwkJCQl2b2lkICpvdXRfbWljLCBzaXplX3QgbWljX3Np emUpDQo+ID4gK3sNCj4gPiArCXVpbnQ4X3QgbXNnWzE2XSwgcG1zZ1sxNl0sIGNtaWNbMTZdLCBj bXNnWzE2XSwgWG5bMTZdOw0KPiA+ICsJdWludDhfdCBtaWNbMTZdOw0KPiA+ICsJdWludDE2X3Qg bXNnX2xlbiA9IGVuY19tc2dfbGVuIC0gbWljX3NpemU7DQo+ID4gKwl1aW50MTZfdCBsYXN0X2Js aywgYmxrX2NudDsNCj4gPiArCWJvb2wgcmVzdWx0Ow0KPiA+ICsJc2l6ZV90IGksIGo7DQo+ID4g KwlpbnQgZmQ7DQo+ID4gKw0KPiA+ICsJaWYgKGVuY19tc2dfbGVuIDwgNSB8fCBhYWRfbGVuID49 IDB4ZmYwMCkNCj4gPiArCQlyZXR1cm4gZmFsc2U7DQo+ID4gKw0KPiA+ICsJZmQgPSBhZXNfZWNi X3NldHVwKGtleSk7DQo+ID4gKwlpZiAoZmQgPCAwKQ0KPiA+ICsJCXJldHVybiBmYWxzZTsNCj4g PiArDQo+ID4gKwkvKiBDX21pYyA9IGUoQXBwS2V5LCAweDAxIHx8IG5vbmNlIHx8IDB4MDAwMCkg Ki8NCj4gPiArCXBtc2dbMF0gPSAweDAxOw0KPiA+ICsJbWVtY3B5KHBtc2cgKyAxLCBub25jZSwg MTMpOw0KPiA+ICsJbF9wdXRfYmUxNigweDAwMDAsIHBtc2cgKyAxNCk7DQo+ID4gKw0KPiA+ICsJ cmVzdWx0ID0gYWVzX2VjYihmZCwgcG1zZywgY21pYyk7DQo+ID4gKwlpZiAoIXJlc3VsdCkNCj4g PiArCQlnb3RvIGRvbmU7DQo+ID4gKw0KPiA+ICsJLyogWF8wID0gZShBcHBLZXksIDB4MDkgfHwg bm9uY2UgfHwgbGVuZ3RoKSAqLw0KPiA+ICsJaWYgKG1pY19zaXplID09IHNpemVvZih1aW50NjRf dCkpDQo+ID4gKwkJcG1zZ1swXSA9IDB4MTkgfCAoYWFkX2xlbiA/IDB4NDAgOiAweDAwKTsNCj4g PiArCWVsc2UNCj4gPiArCQlwbXNnWzBdID0gMHgwOSB8IChhYWRfbGVuID8gMHg0MCA6IDB4MDAp Ow0KPiA+ICsNCj4gPiArCW1lbWNweShwbXNnICsgMSwgbm9uY2UsIDEzKTsNCj4gPiArCWxfcHV0 X2JlMTYobXNnX2xlbiwgcG1zZyArIDE0KTsNCj4gPiArDQo+ID4gKwlyZXN1bHQgPSBhZXNfZWNi KGZkLCBwbXNnLCBYbik7DQo+ID4gKwlpZiAoIXJlc3VsdCkNCj4gPiArCQlnb3RvIGRvbmU7DQo+ ID4gKw0KPiA+ICsJLyogSWYgQUFEIGlzIGJlaW5nIHVzZWQgdG8gYXV0aGVudGljYXRlLCBpbmNs dWRlIGl0IGhlcmUgKi8NCj4gPiArCWlmIChhYWRfbGVuKSB7DQo+ID4gKwkJbF9wdXRfYmUxNihh YWRfbGVuLCBwbXNnKTsNCj4gPiArDQo+ID4gKwkJZm9yIChpID0gMDsgaSA8IHNpemVvZih1aW50 MTZfdCk7IGkrKykNCj4gPiArCQkJcG1zZ1tpXSA9IFhuW2ldIF4gcG1zZ1tpXTsNCj4gPiArDQo+ ID4gKwkJaiA9IDA7DQo+ID4gKwkJYWFkX2xlbiArPSBzaXplb2YodWludDE2X3QpOw0KPiA+ICsJ CXdoaWxlIChhYWRfbGVuID4gMTYpIHsNCj4gPiArCQkJZG8gew0KPiA+ICsJCQkJcG1zZ1tpXSA9 IFhuW2ldIF4gYWFkW2pdOw0KPiA+ICsJCQkJaSsrLCBqKys7DQo+ID4gKwkJCX0gd2hpbGUgKGkg PCAxNik7DQo+ID4gKw0KPiA+ICsJCQlhYWRfbGVuIC09IDE2Ow0KPiA+ICsJCQlpID0gMDsNCj4g PiArDQo+ID4gKwkJCXJlc3VsdCA9IGFlc19lY2IoZmQsIHBtc2csIFhuKTsNCj4gPiArCQkJaWYg KCFyZXN1bHQpDQo+ID4gKwkJCQlnb3RvIGRvbmU7DQo+ID4gKwkJfQ0KPiA+ICsNCj4gPiArCQlm b3IgKGkgPSAwOyBpIDwgYWFkX2xlbjsgaSsrLCBqKyspDQo+ID4gKwkJCXBtc2dbaV0gPSBYbltp XSBeIGFhZFtqXTsNCj4gPiArDQo+ID4gKwkJZm9yIChpID0gYWFkX2xlbjsgaSA8IDE2OyBpKysp DQo+ID4gKwkJCXBtc2dbaV0gPSBYbltpXTsNCj4gPiArDQo+ID4gKwkJcmVzdWx0ID0gYWVzX2Vj YihmZCwgcG1zZywgWG4pOw0KPiA+ICsJCWlmICghcmVzdWx0KQ0KPiA+ICsJCQlnb3RvIGRvbmU7 DQo+ID4gKwl9DQo+ID4gKw0KPiA+ICsJbGFzdF9ibGsgPSBtc2dfbGVuICUgMTY7DQo+ID4gKwli bGtfY250ID0gKG1zZ19sZW4gKyAxNSkgLyAxNjsNCj4gPiArCWlmICghbGFzdF9ibGspDQo+ID4g KwkJbGFzdF9ibGsgPSAxNjsNCj4gPiArDQo+ID4gKwlmb3IgKGogPSAwOyBqIDwgYmxrX2NudDsg aisrKSB7DQo+ID4gKwkJaWYgKGogKyAxID09IGJsa19jbnQpIHsNCj4gPiArCQkJLyogQ18xID0g ZShBcHBLZXksIDB4MDEgfHwgbm9uY2UgfHwgMHgwMDAxKSAqLw0KPiA+ICsJCQlwbXNnWzBdID0g MHgwMTsNCj4gPiArCQkJbWVtY3B5KHBtc2cgKyAxLCBub25jZSwgMTMpOw0KPiA+ICsJCQlsX3B1 dF9iZTE2KGogKyAxLCBwbXNnICsgMTQpOw0KPiA+ICsNCj4gPiArCQkJcmVzdWx0ID0gYWVzX2Vj YihmZCwgcG1zZywgY21zZyk7DQo+ID4gKwkJCWlmICghcmVzdWx0KQ0KPiA+ICsJCQkJZ290byBk b25lOw0KPiA+ICsNCj4gPiArCQkJLyogRW5jcnlwdGVkID0gUGF5bG9hZFswLTE1XSBeIENfMSAq Lw0KPiA+ICsJCQlmb3IgKGkgPSAwOyBpIDwgbGFzdF9ibGs7IGkrKykNCj4gPiArCQkJCW1zZ1tp XSA9IGVuY19tc2dbKGogKiAxNikgKyBpXSBeIGNtc2dbaV07DQo+ID4gKw0KPiA+ICsJCQlpZiAo b3V0X21zZykNCj4gPiArCQkJCW1lbWNweShvdXRfbXNnICsgKGogKiAxNiksIG1zZywgbGFzdF9i bGspOw0KPiA+ICsNCj4gPiArCQkJLyogWF8xID0gZShBcHBLZXksIFhfMCBeIFBheWxvYWRbMC0x NV0pICovDQo+ID4gKwkJCWZvciAoaSA9IDA7IGkgPCBsYXN0X2JsazsgaSsrKQ0KPiA+ICsJCQkJ cG1zZ1tpXSA9IFhuW2ldIF4gbXNnW2ldOw0KPiA+ICsJCQlmb3IgKGkgPSBsYXN0X2JsazsgaSA8 IDE2OyBpKyspDQo+ID4gKwkJCQlwbXNnW2ldID0gWG5baV0gXiAweDAwOw0KPiA+ICsNCj4gPiAr CQkJcmVzdWx0ID0gYWVzX2VjYihmZCwgcG1zZywgWG4pOw0KPiA+ICsJCQlpZiAoIXJlc3VsdCkN Cj4gPiArCQkJCWdvdG8gZG9uZTsNCj4gPiArDQo+ID4gKwkJCS8qIE1JQyA9IENfbWljIF4gWF8x ICovDQo+ID4gKwkJCWZvciAoaSA9IDA7IGkgPCBzaXplb2YobWljKTsgaSsrKQ0KPiA+ICsJCQkJ bWljW2ldID0gY21pY1tpXSBeIFhuW2ldOw0KPiA+ICsJCX0gZWxzZSB7DQo+ID4gKwkJCS8qIENf MSA9IGUoQXBwS2V5LCAweDAxIHx8IG5vbmNlIHx8IDB4MDAwMSkgKi8NCj4gPiArCQkJcG1zZ1sw XSA9IDB4MDE7DQo+ID4gKwkJCW1lbWNweShwbXNnICsgMSwgbm9uY2UsIDEzKTsNCj4gPiArCQkJ bF9wdXRfYmUxNihqICsgMSwgcG1zZyArIDE0KTsNCj4gPiArDQo+ID4gKwkJCXJlc3VsdCA9IGFl c19lY2IoZmQsIHBtc2csIGNtc2cpOw0KPiA+ICsJCQlpZiAoIXJlc3VsdCkNCj4gPiArCQkJCWdv dG8gZG9uZTsNCj4gPiArDQo+ID4gKwkJCS8qIEVuY3J5cHRlZCA9IFBheWxvYWRbMC0xNV0gXiBD XzEgKi8NCj4gPiArCQkJZm9yIChpID0gMDsgaSA8IDE2OyBpKyspDQo+ID4gKwkJCQltc2dbaV0g PSBlbmNfbXNnWyhqICogMTYpICsgaV0gXiBjbXNnW2ldOw0KPiA+ICsNCj4gPiArCQkJaWYgKG91 dF9tc2cpDQo+ID4gKwkJCQltZW1jcHkob3V0X21zZyArIChqICogMTYpLCBtc2csIDE2KTsNCj4g PiArDQo+ID4gKwkJCS8qIFhfMSA9IGUoQXBwS2V5LCBYXzAgXiBQYXlsb2FkWzAtMTVdKSAqLw0K PiA+ICsJCQlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykNCj4gPiArCQkJCXBtc2dbaV0gPSBYbltp XSBeIG1zZ1tpXTsNCj4gPiArDQo+ID4gKwkJCXJlc3VsdCA9IGFlc19lY2IoZmQsIHBtc2csIFhu KTsNCj4gPiArCQkJaWYgKCFyZXN1bHQpDQo+ID4gKwkJCQlnb3RvIGRvbmU7DQo+ID4gKwkJfQ0K PiA+ICsJfQ0KPiA+ICsNCj4gPiArCWlmIChvdXRfbWljKSB7DQo+ID4gKwkJc3dpdGNoIChtaWNf c2l6ZSkgew0KPiA+ICsJCWNhc2Ugc2l6ZW9mKHVpbnQzMl90KToNCj4gPiArCQkJKih1aW50MzJf dCAqKW91dF9taWMgPSBsX2dldF9iZTMyKG1pYyk7DQo+ID4gKwkJCWJyZWFrOw0KPiA+ICsJCWNh c2Ugc2l6ZW9mKHVpbnQ2NF90KToNCj4gPiArCQkJKih1aW50NjRfdCAqKW91dF9taWMgPSBsX2dl dF9iZTY0KG1pYyk7DQo+ID4gKwkJCWJyZWFrOw0KPiA+ICsJCWRlZmF1bHQ6DQo+ID4gKwkJCWxf ZXJyb3IoIlVuc3VwcG9ydGVkIE1JQyBzaXplIik7DQo+ID4gKwkJfQ0KPiA+ICsJfQ0KPiA+ICsN Cj4gPiArZG9uZToNCj4gPiArCWFlc19lY2JfZGVzdHJveShmZCk7DQo+ID4gKw0KPiA+ICsJcmV0 dXJuIHJlc3VsdDsNCj4gPiArfQ0KPiA+ICsNCj4gPiArYm9vbCBtZXNoX2NyeXB0b19rMShjb25z dCB1aW50OF90IGlrbVsxNl0sIGNvbnN0IHVpbnQ4X3Qgc2FsdFsxNl0sDQo+ID4gKwkJY29uc3Qg dm9pZCAqaW5mbywgc2l6ZV90IGluZm9fbGVuLCB1aW50OF90IG9rbVsxNl0pDQo+ID4gK3sNCj4g PiArCXVpbnQ4X3QgcmVzWzE2XTsNCj4gPiArDQo+ID4gKwlpZiAoIWFlc19jbWFjX29uZShzYWx0 LCBpa20sIDE2LCByZXMpKQ0KPiA+ICsJCXJldHVybiBmYWxzZTsNCj4gPiArDQo+ID4gKwlyZXR1 cm4gYWVzX2NtYWNfb25lKHJlcywgaW5mbywgaW5mb19sZW4sIG9rbSk7DQo+ID4gK30NCj4gPiAr DQo+ID4gK2Jvb2wgbWVzaF9jcnlwdG9fazIoY29uc3QgdWludDhfdCBuWzE2XSwgY29uc3QgdWlu dDhfdCAqcCwgc2l6ZV90IHBfbGVuLA0KPiA+ICsJCQkJCQkJdWludDhfdCBuZXRfaWRbMV0sDQo+ ID4gKwkJCQkJCQl1aW50OF90IGVuY19rZXlbMTZdLA0KPiA+ICsJCQkJCQkJdWludDhfdCBwcml2 X2tleVsxNl0pDQo+ID4gK3sNCj4gPiArCWludCBmZDsNCj4gPiArCXVpbnQ4X3Qgb3V0cHV0WzE2 XTsNCj4gPiArCXVpbnQ4X3QgdFsxNl07DQo+ID4gKwl1aW50OF90ICpzdGFnZTsNCj4gPiArCWJv b2wgc3VjY2VzcyA9IGZhbHNlOw0KPiA+ICsNCj4gPiArCXByaW50X3BhY2tldCgiSzItTiIsIG4s IDE2KTsNCj4gPiArCXN0YWdlID0gbF9tYWxsb2Moc2l6ZW9mKG91dHB1dCkgKyBwX2xlbiArIDEp Ow0KPiA+ICsJaWYgKHN0YWdlID09IE5VTEwpDQo+ID4gKwkJcmV0dXJuIGZhbHNlOw0KPiANCj4g SSBwcmVmZXIgaWYgKCFzdGFnZSkgY29uc3RydWN0cy4NCj4gDQo+ID4gKw0KPiA+ICsJaWYgKCFt ZXNoX2NyeXB0b19zMSgic21rMiIsIDQsIHN0YWdlKSkNCj4gPiArCQlnb3RvIGZhaWw7DQo+ID4g KwlwcmludF9wYWNrZXQoIksyLVMxKHNtazIpIiwgc3RhZ2UsIDE2KTsNCj4gPiArCXByaW50X3Bh Y2tldCgiSzItUCIsIHAsIHBfbGVuKTsNCj4gDQo+IFRoaXMgcHJpbnRfcGFja2V0IGlzIHJlYWxs eSBub3QgYWNjZXB0YWJsZS4NCj4gDQo+ID4gKw0KPiA+ICsJaWYgKCFhZXNfY21hY19vbmUoc3Rh Z2UsIG4sIDE2LCB0KSkNCj4gPiArCQlnb3RvIGZhaWw7DQo+ID4gKw0KPiA+ICsJcHJpbnRfcGFj a2V0KCJLMi1UIiwgdCwgMTYpOw0KPiA+ICsNCj4gPiArCWZkID0gYWVzX2NtYWNfTl9zdGFydCh0 KTsNCj4gPiArCWlmIChmZCA8IDApDQo+ID4gKwkJZ290byBmYWlsOw0KPiA+ICsNCj4gPiArCW1l bWNweShzdGFnZSwgcCwgcF9sZW4pOw0KPiA+ICsJc3RhZ2VbcF9sZW5dID0gMTsNCj4gPiArDQo+ ID4gKwlpZiAoIWFlc19jbWFjKGZkLCBzdGFnZSwgcF9sZW4gKyAxLCBvdXRwdXQpKQ0KPiA+ICsJ CWdvdG8gZG9uZTsNCj4gPiArDQo+ID4gKwlwcmludF9wYWNrZXQoIksyLVQxIiwgb3V0cHV0LCAx Nik7DQo+ID4gKw0KPiA+ICsJbmV0X2lkWzBdID0gb3V0cHV0WzE1XSAmIDB4N2Y7DQo+ID4gKw0K PiA+ICsJbWVtY3B5KHN0YWdlLCBvdXRwdXQsIDE2KTsNCj4gPiArCW1lbWNweShzdGFnZSArIDE2 LCBwLCBwX2xlbik7DQo+ID4gKwlzdGFnZVtwX2xlbiArIDE2XSA9IDI7DQo+ID4gKw0KPiA+ICsJ aWYgKCFhZXNfY21hYyhmZCwgc3RhZ2UsIHBfbGVuICsgMTYgKyAxLCBvdXRwdXQpKQ0KPiA+ICsJ CWdvdG8gZG9uZTsNCj4gPiArCXByaW50X3BhY2tldCgiSzItVDIiLCBvdXRwdXQsIDE2KTsNCj4g PiArDQo+ID4gKwltZW1jcHkoZW5jX2tleSwgb3V0cHV0LCAxNik7DQo+ID4gKw0KPiA+ICsJbWVt Y3B5KHN0YWdlLCBvdXRwdXQsIDE2KTsNCj4gPiArCW1lbWNweShzdGFnZSArIDE2LCBwLCBwX2xl bik7DQo+ID4gKwlzdGFnZVtwX2xlbiArIDE2XSA9IDM7DQo+ID4gKw0KPiA+ICsJaWYgKCFhZXNf Y21hYyhmZCwgc3RhZ2UsIHBfbGVuICsgMTYgKyAxLCBvdXRwdXQpKQ0KPiA+ICsJCWdvdG8gZG9u ZTsNCj4gPiArCXByaW50X3BhY2tldCgiSzItVDMiLCBvdXRwdXQsIDE2KTsNCj4gPiArDQo+ID4g KwltZW1jcHkocHJpdl9rZXksIG91dHB1dCwgMTYpOw0KPiA+ICsJc3VjY2VzcyA9IHRydWU7DQo+ ID4gKw0KPiA+ICtkb25lOg0KPiA+ICsJYWVzX2NtYWNfZGVzdHJveShmZCk7DQo+ID4gK2ZhaWw6 DQo+ID4gKwlsX2ZyZWUoc3RhZ2UpOw0KPiA+ICsNCj4gPiArCXJldHVybiBzdWNjZXNzOw0KPiA+ ICt9DQo+ID4gKw0KPiA+ICtzdGF0aWMgYm9vbCBjcnlwdG9fMTI4KGNvbnN0IHVpbnQ4X3Qgblsx Nl0sIGNvbnN0IGNoYXIgKnMsIHVpbnQ4X3Qgb3V0MTI4WzE2XSkNCj4gPiArew0KPiA+ICsJdWlu dDhfdCBpZDEyOFtdID0geyAnaScsICdkJywgJzEnLCAnMicsICc4JywgMHgwMSB9Ow0KPiA+ICsJ dWludDhfdCBzYWx0WzE2XTsNCj4gPiArDQo+ID4gKwlpZiAoIW1lc2hfY3J5cHRvX3MxKHMsIDQs IHNhbHQpKQ0KPiA+ICsJCXJldHVybiBmYWxzZTsNCj4gPiArDQo+ID4gKwlyZXR1cm4gbWVzaF9j cnlwdG9fazEobiwgc2FsdCwgaWQxMjgsIHNpemVvZihpZDEyOCksIG91dDEyOCk7DQo+ID4gK30N Cj4gPiArDQo+ID4gK2Jvb2wgbWVzaF9jcnlwdG9fbmtpayhjb25zdCB1aW50OF90IG5bMTZdLCB1 aW50OF90IGlkZW50aXR5X2tleVsxNl0pDQo+ID4gK3sNCj4gPiArCXJldHVybiBjcnlwdG9fMTI4 KG4sICJua2lrIiwgaWRlbnRpdHlfa2V5KTsNCj4gPiArfQ0KPiA+ICsNCj4gPiArYm9vbCBtZXNo X2NyeXB0b19pZGVudGl0eShjb25zdCB1aW50OF90IG5ldF9rZXlbMTZdLCB1aW50MTZfdCBhZGRy LA0KPiA+ICsJCQkJCQkJdWludDhfdCBpZFsxNl0pDQo+ID4gK3sNCj4gPiArCXVpbnQ4X3QgaWRf a2V5WzE2XTsNCj4gPiArCXVpbnQ4X3QgdG1wWzE2XTsNCj4gPiArDQo+ID4gKwlwcmludF9wYWNr ZXQoIk5ldF9LZXkiLCBuZXRfa2V5LCAxNik7DQo+ID4gKw0KPiA+ICsJaWYgKCFtZXNoX2NyeXB0 b19ua2lrKG5ldF9rZXksIGlkX2tleSkpDQo+ID4gKwkJcmV0dXJuIGZhbHNlOw0KPiA+ICsNCj4g PiArCXByaW50X3BhY2tldCgiSURfS2V5IiwgaWRfa2V5LCAxNik7DQo+ID4gKw0KPiA+ICsJaWYg KCFsX2dldF9iZTY0KGlkICsgOCkpDQo+ID4gKwkJbF9nZXRyYW5kb20oaWQgKyA4LCA4KTsNCj4g PiArDQo+ID4gKwltZW1zZXQodG1wLCAwLCBzaXplb2YodG1wKSk7DQo+ID4gKwltZW1jcHkodG1w ICsgNiwgaWQgKyA4LCA4KTsNCj4gPiArCWxfcHV0X2JlMTYoYWRkciwgdG1wICsgMTQpOw0KPiA+ ICsNCj4gPiArCXByaW50X3BhY2tldCgiTm9uY2UiLCB0bXAsIDE2KTsNCj4gPiArCWlmICghYWVz X2VjYl9vbmUoaWRfa2V5LCB0bXAsIHRtcCkpDQo+ID4gKwkJcmV0dXJuIGZhbHNlOw0KPiA+ICsN Cj4gPiArCXByaW50X3BhY2tldCgicmVzdWx0IiwgdG1wLCAxNik7DQo+ID4gKw0KPiA+ICsJbWVt Y3B5KGlkLCB0bXAgKyA4LCA4KTsNCj4gPiArCXJldHVybiB0cnVlOw0KPiA+ICt9DQo+ID4gKw0K PiA+ICtib29sIG1lc2hfY3J5cHRvX25rYmsoY29uc3QgdWludDhfdCBuWzE2XSwgdWludDhfdCBi ZWFjb25fa2V5WzE2XSkNCj4gPiArew0KPiA+ICsJcmV0dXJuIGNyeXB0b18xMjgobiwgIm5rYmsi LCBiZWFjb25fa2V5KTsNCj4gPiArfQ0KPiA+ICsNCj4gPiArYm9vbCBtZXNoX2NyeXB0b19ua3Br KGNvbnN0IHVpbnQ4X3QgblsxNl0sIHVpbnQ4X3QgcHJveHlfa2V5WzE2XSkNCj4gPiArew0KPiA+ ICsJcmV0dXJuIGNyeXB0b18xMjgobiwgIm5rcGsiLCBwcm94eV9rZXkpOw0KPiA+ICt9DQo+ID4g Kw0KPiA+ICtib29sIG1lc2hfY3J5cHRvX2szKGNvbnN0IHVpbnQ4X3QgblsxNl0sIHVpbnQ4X3Qg b3V0NjRbOF0pDQo+ID4gK3sNCj4gPiArCXVpbnQ4X3QgdG1wWzE2XTsNCj4gPiArCXVpbnQ4X3Qg dFsxNl07DQo+ID4gKwl1aW50OF90IGlkNjRbXSA9IHsgJ2knLCAnZCcsICc2JywgJzQnLCAweDAx IH07DQo+ID4gKw0KPiA+ICsJaWYgKCFtZXNoX2NyeXB0b19zMSgic21rMyIsIDQsIHRtcCkpDQo+ ID4gKwkJcmV0dXJuIGZhbHNlOw0KPiA+ICsNCj4gPiArCWlmICghYWVzX2NtYWNfb25lKHRtcCwg biwgMTYsIHQpKQ0KPiA+ICsJCXJldHVybiBmYWxzZTsNCj4gPiArDQo+ID4gKwlpZiAoIWFlc19j bWFjX29uZSh0LCBpZDY0LCBzaXplb2YoaWQ2NCksIHRtcCkpDQo+ID4gKwkJcmV0dXJuIGZhbHNl Ow0KPiA+ICsNCj4gPiArCW1lbWNweShvdXQ2NCwgdG1wICsgOCwgOCk7DQo+ID4gKw0KPiA+ICsJ cmV0dXJuIHRydWU7DQo+ID4gK30NCj4gPiArDQo+ID4gK2Jvb2wgbWVzaF9jcnlwdG9fazQoY29u c3QgdWludDhfdCBhWzE2XSwgdWludDhfdCBvdXQ2WzFdKQ0KPiA+ICt7DQo+ID4gKwl1aW50OF90 IHRtcFsxNl07DQo+ID4gKwl1aW50OF90IHRbMTZdOw0KPiA+ICsJdWludDhfdCBpZDZbXSA9IHsg J2knLCAnZCcsICc2JywgMHgwMSB9Ow0KPiANCj4gVGhlc2Ugc2hvdWxkIGNvbWUgZmlyc3QgYW5k IG1vc3QgbGlrZWx5IGJlIGRlY2xhcmVkIGNvbnN0Lg0KPiANCj4gPiArDQo+ID4gKwlpZiAoIW1l c2hfY3J5cHRvX3MxKCJzbWs0IiwgNCwgdG1wKSkNCj4gPiArCQlyZXR1cm4gZmFsc2U7DQo+ID4g Kw0KPiA+ICsJaWYgKCFhZXNfY21hY19vbmUodG1wLCBhLCAxNiwgdCkpDQo+ID4gKwkJcmV0dXJu IGZhbHNlOw0KPiA+ICsNCj4gPiArCWlmICghYWVzX2NtYWNfb25lKHQsIGlkNiwgc2l6ZW9mKGlk NiksIHRtcCkpDQo+ID4gKwkJcmV0dXJuIGZhbHNlOw0KPiA+ICsNCj4gPiArCW91dDZbMF0gPSB0 bXBbMTVdICYgMHgzZjsNCj4gPiArCXJldHVybiB0cnVlOw0KPiA+ICt9DQo+ID4gKw0KPiA+ICti b29sIG1lc2hfY3J5cHRvX2JlYWNvbl9jbWFjKGNvbnN0IHVpbnQ4X3QgZW5jcnlwdGlvbl9rZXlb MTZdLA0KPiA+ICsJCQkJY29uc3QgdWludDhfdCBuZXR3b3JrX2lkWzhdLA0KPiA+ICsJCQkJdWlu dDMyX3QgaXZfaW5kZXgsIGJvb2wga3IsIGJvb2wgaXUsDQo+ID4gKwkJCQl1aW50NjRfdCAqY21h YykNCj4gPiArew0KPiA+ICsJdWludDhfdCBtc2dbMTNdLCB0bXBbMTZdOw0KPiA+ICsNCj4gPiAr CWlmICghY21hYykNCj4gPiArCQlyZXR1cm4gZmFsc2U7DQo+ID4gKw0KPiA+ICsJbXNnWzBdID0g a3IgPyAweDAxIDogMHgwMDsNCj4gPiArCW1zZ1swXSB8PSBpdSA/IDB4MDIgOiAweDAwOw0KPiA+ ICsJbWVtY3B5KG1zZyArIDEsIG5ldHdvcmtfaWQsIDgpOw0KPiA+ICsJbF9wdXRfYmUzMihpdl9p bmRleCwgbXNnICsgOSk7DQo+ID4gKw0KPiA+ICsJaWYgKCFhZXNfY21hY19vbmUoZW5jcnlwdGlv bl9rZXksIG1zZywgMTMsIHRtcCkpDQo+ID4gKwkJcmV0dXJuIGZhbHNlOw0KPiA+ICsNCj4gPiAr CSpjbWFjID0gbF9nZXRfYmU2NCh0bXApOw0KPiA+ICsNCj4gPiArCXJldHVybiB0cnVlOw0KPiA+ ICt9DQo+ID4gKw0KPiA+ICtib29sIG1lc2hfY3J5cHRvX25ldHdvcmtfbm9uY2UoYm9vbCBjdGws IHVpbnQ4X3QgdHRsLCB1aW50MzJfdCBzZXEsDQo+ID4gKwkJCQl1aW50MTZfdCBzcmMsIHVpbnQz Ml90IGl2X2luZGV4LA0KPiA+ICsJCQkJdWludDhfdCBub25jZVsxM10pDQo+ID4gK3sNCj4gPiAr CW5vbmNlWzBdID0gMDsNCj4gPiArCW5vbmNlWzFdID0gKHR0bCAmIFRUTF9NQVNLKSB8IChjdGwg PyBDVEwgOiAweDAwKTsNCj4gPiArCW5vbmNlWzJdID0gKHNlcSA+PiAxNikgJiAweGZmOw0KPiA+ ICsJbm9uY2VbM10gPSAoc2VxID4+IDgpICYgMHhmZjsNCj4gPiArCW5vbmNlWzRdID0gc2VxICYg MHhmZjsNCj4gPiArDQo+ID4gKwkvKiBTUkMgKi8NCj4gPiArCWxfcHV0X2JlMTYoc3JjLCBub25j ZSArIDUpOw0KPiA+ICsNCj4gPiArCWxfcHV0X2JlMTYoMCwgbm9uY2UgKyA3KTsNCj4gPiArDQo+ ID4gKwkvKiBJViBJbmRleCAqLw0KPiA+ICsJbF9wdXRfYmUzMihpdl9pbmRleCwgbm9uY2UgKyA5 KTsNCj4gPiArDQo+ID4gKwlyZXR1cm4gdHJ1ZTsNCj4gPiArfQ0KPiA+ICsNCj4gPiArYm9vbCBt ZXNoX2NyeXB0b19uZXR3b3JrX2VuY3J5cHQoYm9vbCBjdGwsIHVpbnQ4X3QgdHRsLA0KPiA+ICsJ CQkJdWludDMyX3Qgc2VxLCB1aW50MTZfdCBzcmMsDQo+ID4gKwkJCQl1aW50MzJfdCBpdl9pbmRl eCwNCj4gPiArCQkJCWNvbnN0IHVpbnQ4X3QgbmV0X2tleVsxNl0sDQo+ID4gKwkJCQljb25zdCB1 aW50OF90ICplbmNfbXNnLCB1aW50OF90IGVuY19tc2dfbGVuLA0KPiA+ICsJCQkJdWludDhfdCAq b3V0LCB2b2lkICpuZXRfbWljKQ0KPiA+ICt7DQo+ID4gKwl1aW50OF90IG5vbmNlWzEzXTsNCj4g PiArDQo+ID4gKwlpZiAoIW1lc2hfY3J5cHRvX25ldHdvcmtfbm9uY2UoY3RsLCB0dGwsIHNlcSwg c3JjLCBpdl9pbmRleCwgbm9uY2UpKQ0KPiA+ICsJCXJldHVybiBmYWxzZTsNCj4gPiArDQo+ID4g KwlyZXR1cm4gbWVzaF9jcnlwdG9fYWVzX2NjbV9lbmNyeXB0KG5vbmNlLCBuZXRfa2V5LCBOVUxM LCAwLCBlbmNfbXNnLA0KPiA+ICsJCQkJZW5jX21zZ19sZW4sIG91dCwgbmV0X21pYywNCj4gPiAr CQkJCWN0bCA/IHNpemVvZih1aW50NjRfdCkgOiBzaXplb2YodWludDMyX3QpKTsNCj4gPiArfQ0K PiA+ICsNCj4gPiArYm9vbCBtZXNoX2NyeXB0b19uZXR3b3JrX2RlY3J5cHQoYm9vbCBjdGwsIHVp bnQ4X3QgdHRsLA0KPiA+ICsJCQkJdWludDMyX3Qgc2VxLCB1aW50MTZfdCBzcmMsDQo+ID4gKwkJ CQl1aW50MzJfdCBpdl9pbmRleCwNCj4gPiArCQkJCWNvbnN0IHVpbnQ4X3QgbmV0X2tleVsxNl0s DQo+ID4gKwkJCQljb25zdCB1aW50OF90ICplbmNfbXNnLCB1aW50OF90IGVuY19tc2dfbGVuLA0K PiA+ICsJCQkJdWludDhfdCAqb3V0LCB2b2lkICpuZXRfbWljLCBzaXplX3QgbWljX3NpemUpDQo+ ID4gK3sNCj4gPiArCXVpbnQ4X3Qgbm9uY2VbMTNdOw0KPiA+ICsNCj4gPiArCWlmICghbWVzaF9j cnlwdG9fbmV0d29ya19ub25jZShjdGwsIHR0bCwgc2VxLCBzcmMsIGl2X2luZGV4LCBub25jZSkp DQo+ID4gKwkJcmV0dXJuIGZhbHNlOw0KPiA+ICsNCj4gPiArCXJldHVybiBtZXNoX2NyeXB0b19h ZXNfY2NtX2RlY3J5cHQobm9uY2UsIG5ldF9rZXksIE5VTEwsIDAsDQo+ID4gKwkJCQkJCWVuY19t c2csIGVuY19tc2dfbGVuLCBvdXQsDQo+ID4gKwkJCQkJCW5ldF9taWMsIG1pY19zaXplKTsNCj4g PiArfQ0KPiA+ICsNCj4gPiArYm9vbCBtZXNoX2NyeXB0b19hcHBsaWNhdGlvbl9ub25jZSh1aW50 MzJfdCBzZXEsIHVpbnQxNl90IHNyYywNCj4gPiArCQkJCQl1aW50MTZfdCBkc3QsIHVpbnQzMl90 IGl2X2luZGV4LA0KPiA+ICsJCQkJCWJvb2wgYXN6bWljLCB1aW50OF90IG5vbmNlWzEzXSkNCj4g PiArew0KPiA+ICsJbm9uY2VbMF0gPSAweDAxOw0KPiA+ICsJbm9uY2VbMV0gPSBhc3ptaWMgPyAw eDgwIDogMHgwMDsNCj4gPiArCW5vbmNlWzJdID0gKHNlcSAmIDB4MDBmZjAwMDApID4+IDE2Ow0K PiA+ICsJbm9uY2VbM10gPSAoc2VxICYgMHgwMDAwZmYwMCkgPj4gODsNCj4gPiArCW5vbmNlWzRd ID0gKHNlcSAmIDB4MDAwMDAwZmYpOw0KPiA+ICsJbm9uY2VbNV0gPSAoc3JjICYgMHhmZjAwKSA+ PiA4Ow0KPiA+ICsJbm9uY2VbNl0gPSAoc3JjICYgMHgwMGZmKTsNCj4gPiArCW5vbmNlWzddID0g KGRzdCAmIDB4ZmYwMCkgPj4gODsNCj4gPiArCW5vbmNlWzhdID0gKGRzdCAmIDB4MDBmZik7DQo+ ID4gKwlsX3B1dF9iZTMyKGl2X2luZGV4LCBub25jZSArIDkpOw0KPiA+ICsNCj4gPiArCXJldHVy biB0cnVlOw0KPiA+ICt9DQo+ID4gKw0KPiA+ICtib29sIG1lc2hfY3J5cHRvX2RldmljZV9ub25j ZSh1aW50MzJfdCBzZXEsIHVpbnQxNl90IHNyYywNCj4gPiArCQkJCQl1aW50MTZfdCBkc3QsIHVp bnQzMl90IGl2X2luZGV4LA0KPiA+ICsJCQkJCWJvb2wgYXN6bWljLCB1aW50OF90IG5vbmNlWzEz XSkNCj4gPiArew0KPiA+ICsJbm9uY2VbMF0gPSAweDAyOw0KPiA+ICsJbm9uY2VbMV0gPSBhc3pt aWMgPyAweDgwIDogMHgwMDsNCj4gPiArCW5vbmNlWzJdID0gKHNlcSAmIDB4MDBmZjAwMDApID4+ IDE2Ow0KPiA+ICsJbm9uY2VbM10gPSAoc2VxICYgMHgwMDAwZmYwMCkgPj4gODsNCj4gPiArCW5v bmNlWzRdID0gKHNlcSAmIDB4MDAwMDAwZmYpOw0KPiA+ICsJbm9uY2VbNV0gPSAoc3JjICYgMHhm ZjAwKSA+PiA4Ow0KPiA+ICsJbm9uY2VbNl0gPSAoc3JjICYgMHgwMGZmKTsNCj4gPiArCW5vbmNl WzddID0gKGRzdCAmIDB4ZmYwMCkgPj4gODsNCj4gPiArCW5vbmNlWzhdID0gKGRzdCAmIDB4MDBm Zik7DQo+ID4gKwlsX3B1dF9iZTMyKGl2X2luZGV4LCBub25jZSArIDkpOw0KPiA+ICsNCj4gPiAr CXJldHVybiB0cnVlOw0KPiA+ICt9DQo+ID4gKw0KPiA+ICtib29sIG1lc2hfY3J5cHRvX2FwcGxp Y2F0aW9uX2VuY3J5cHQodWludDhfdCBrZXlfaWQsIHVpbnQzMl90IHNlcSwgdWludDE2X3Qgc3Jj LA0KPiA+ICsJCQkJCXVpbnQxNl90IGRzdCwgdWludDMyX3QgaXZfaW5kZXgsDQo+ID4gKwkJCQkJ Y29uc3QgdWludDhfdCBhcHBfa2V5WzE2XSwNCj4gPiArCQkJCQljb25zdCB1aW50OF90ICphYWQs IHVpbnQ4X3QgYWFkX2xlbiwNCj4gPiArCQkJCQljb25zdCB1aW50OF90ICptc2csIHVpbnQ4X3Qg bXNnX2xlbiwNCj4gPiArCQkJCQl1aW50OF90ICpvdXQsDQo+ID4gKwkJCQkJdm9pZCAqYXBwX21p Yywgc2l6ZV90IG1pY19zaXplKQ0KPiA+ICt7DQo+ID4gKwl1aW50OF90IG5vbmNlWzEzXTsNCj4g PiArCWJvb2wgYXN6bWljID0gKG1pY19zaXplID09IHNpemVvZih1aW50NjRfdCkpID8gdHJ1ZSA6 IGZhbHNlOw0KPiANCj4gSXMgdGhpcyBzaXplb2YodWludDY0X3QpIGNvbnN0cnVjdCByZWFsbHkg YSBnb29kIGlkZWE/DQo+IA0KPiA+ICsNCj4gPiArCWlmICgha2V5X2lkICYmICFtZXNoX2NyeXB0 b19kZXZpY2Vfbm9uY2Uoc2VxLCBzcmMsIGRzdCwNCj4gPiArCQkJCQkJaXZfaW5kZXgsIGFzem1p Yywgbm9uY2UpKQ0KPiA+ICsJCXJldHVybiBmYWxzZTsNCj4gPiArDQo+ID4gKwlpZiAoa2V5X2lk ICYmICFtZXNoX2NyeXB0b19hcHBsaWNhdGlvbl9ub25jZShzZXEsIHNyYywgZHN0LA0KPiA+ICsJ CQkJCQlpdl9pbmRleCwgYXN6bWljLCBub25jZSkpDQo+ID4gKwkJcmV0dXJuIGZhbHNlOw0KPiA+ ICsNCj4gPiArCXJldHVybiBtZXNoX2NyeXB0b19hZXNfY2NtX2VuY3J5cHQobm9uY2UsIGFwcF9r ZXksIGFhZCwgYWFkX2xlbiwNCj4gPiArCQkJCQkJbXNnLCBtc2dfbGVuLA0KPiA+ICsJCQkJCQlv dXQsIGFwcF9taWMsIG1pY19zaXplKTsNCj4gPiArfQ0KPiA+ICsNCj4gPiArYm9vbCBtZXNoX2Ny eXB0b19hcHBsaWNhdGlvbl9kZWNyeXB0KHVpbnQ4X3Qga2V5X2lkLCB1aW50MzJfdCBzZXEsIHVp bnQxNl90IHNyYywNCj4gPiArCQkJCXVpbnQxNl90IGRzdCwgdWludDMyX3QgaXZfaW5kZXgsDQo+ ID4gKwkJCQljb25zdCB1aW50OF90IGFwcF9rZXlbMTZdLA0KPiA+ICsJCQkJY29uc3QgdWludDhf dCAqYWFkLCB1aW50OF90IGFhZF9sZW4sDQo+ID4gKwkJCQljb25zdCB1aW50OF90ICplbmNfbXNn LCB1aW50OF90IGVuY19tc2dfbGVuLA0KPiA+ICsJCQkJdWludDhfdCAqb3V0LCB2b2lkICphcHBf bWljLCBzaXplX3QgbWljX3NpemUpDQo+ID4gK3sNCj4gPiArCXVpbnQ4X3Qgbm9uY2VbMTNdOw0K PiA+ICsJYm9vbCBhc3ptaWMgPSAobWljX3NpemUgPT0gc2l6ZW9mKHVpbnQ2NF90KSkgPyB0cnVl IDogZmFsc2U7DQo+ID4gKw0KPiA+ICsJaWYgKCFrZXlfaWQgJiYgIW1lc2hfY3J5cHRvX2Rldmlj ZV9ub25jZShzZXEsIHNyYywgZHN0LA0KPiA+ICsJCQkJCQlpdl9pbmRleCwgYXN6bWljLCBub25j ZSkpDQo+ID4gKwkJcmV0dXJuIGZhbHNlOw0KPiA+ICsNCj4gPiArCWlmIChrZXlfaWQgJiYgIW1l c2hfY3J5cHRvX2FwcGxpY2F0aW9uX25vbmNlKHNlcSwgc3JjLCBkc3QsDQo+ID4gKwkJCQkJCWl2 X2luZGV4LCBhc3ptaWMsIG5vbmNlKSkNCj4gPiArCQlyZXR1cm4gZmFsc2U7DQo+ID4gKw0KPiA+ ICsJcmV0dXJuIG1lc2hfY3J5cHRvX2Flc19jY21fZGVjcnlwdChub25jZSwgYXBwX2tleSwNCj4g PiArCQkJCQkJYWFkLCBhYWRfbGVuLCBlbmNfbXNnLA0KPiA+ICsJCQkJCQllbmNfbXNnX2xlbiwg b3V0LA0KPiA+ICsJCQkJCQlhcHBfbWljLCBtaWNfc2l6ZSk7DQo+ID4gK30NCj4gPiArDQo+ID4g K2Jvb2wgbWVzaF9jcnlwdG9fc2Vzc2lvbl9rZXkoY29uc3QgdWludDhfdCBzZWNyZXRbMzJdLA0K PiA+ICsJCQkJCWNvbnN0IHVpbnQ4X3Qgc2FsdFsxNl0sDQo+ID4gKwkJCQkJdWludDhfdCBzZXNz aW9uX2tleVsxNl0pDQo+ID4gK3sNCj4gPiArCWNvbnN0IHVpbnQ4X3QgcHJza1s0XSA9ICJwcnNr IjsNCj4gPiArDQo+ID4gKwlpZiAoIWFlc19jbWFjX29uZShzYWx0LCBzZWNyZXQsIDMyLCBzZXNz aW9uX2tleSkpDQo+ID4gKwkJcmV0dXJuIGZhbHNlOw0KPiA+ICsNCj4gPiArCXJldHVybiBhZXNf Y21hY19vbmUoc2Vzc2lvbl9rZXksIHByc2ssIDQsIHNlc3Npb25fa2V5KTsNCj4gPiArfQ0KPiA+ ICsNCj4gPiArYm9vbCBtZXNoX2NyeXB0b19ub25jZShjb25zdCB1aW50OF90IHNlY3JldFszMl0s DQo+ID4gKwkJCQkJY29uc3QgdWludDhfdCBzYWx0WzE2XSwNCj4gPiArCQkJCQl1aW50OF90IG5v bmNlWzEzXSkNCj4gPiArew0KPiA+ICsJY29uc3QgdWludDhfdCBwcnNuWzRdID0gInByc24iOw0K PiA+ICsJdWludDhfdCB0bXBbMTZdOw0KPiA+ICsJYm9vbCByZXN1bHQ7DQo+ID4gKw0KPiA+ICsJ aWYgKCFhZXNfY21hY19vbmUoc2FsdCwgc2VjcmV0LCAzMiwgdG1wKSkNCj4gPiArCQlyZXR1cm4g ZmFsc2U7DQo+ID4gKw0KPiA+ICsJcmVzdWx0ID0gIGFlc19jbWFjX29uZSh0bXAsIHByc24sIDQs IHRtcCk7DQo+IA0KPiBEb3VibGUgc3BhY2VzLg0KPiANCj4gPiArDQo+ID4gKwlpZiAocmVzdWx0 KQ0KPiA+ICsJCW1lbWNweShub25jZSwgdG1wICsgMywgMTMpOw0KPiA+ICsNCj4gPiArCXJldHVy biByZXN1bHQ7DQo+ID4gK30NCj4gPiArDQo+ID4gK2Jvb2wgbWVzaF9jcnlwdG9fczEoY29uc3Qg dm9pZCAqaW5mbywgc2l6ZV90IGxlbiwgdWludDhfdCBzYWx0WzE2XSkNCj4gPiArew0KPiA+ICsJ Y29uc3QgdWludDhfdCB6ZXJvWzE2XSA9IHswfTsNCj4gDQo+ICA9IHsgMCwgfTsNCj4gDQo+ID4g Kw0KPiA+ICsJcmV0dXJuIGFlc19jbWFjX29uZSh6ZXJvLCBpbmZvLCBsZW4sIHNhbHQpOw0KPiA+ ICt9DQo+ID4gKw0KPiA+ICtib29sIG1lc2hfY3J5cHRvX3Byb3ZfcHJvdl9zYWx0KGNvbnN0IHVp bnQ4X3QgY29uZl9zYWx0WzE2XSwNCj4gPiArCQkJCQljb25zdCB1aW50OF90IHByb3ZfcmFuZFsx Nl0sDQo+ID4gKwkJCQkJY29uc3QgdWludDhfdCBkZXZfcmFuZFsxNl0sDQo+ID4gKwkJCQkJdWlu dDhfdCBwcm92X3NhbHRbMTZdKQ0KPiA+ICt7DQo+ID4gKwljb25zdCB1aW50OF90IHplcm9bMTZd ID0gezB9Ow0KPiA+ICsJdWludDhfdCB0bXBbMTYgKiAzXTsNCj4gPiArDQo+ID4gKwltZW1jcHko dG1wLCBjb25mX3NhbHQsIDE2KTsNCj4gPiArCW1lbWNweSh0bXAgKyAxNiwgcHJvdl9yYW5kLCAx Nik7DQo+ID4gKwltZW1jcHkodG1wICsgMzIsIGRldl9yYW5kLCAxNik7DQo+ID4gKw0KPiA+ICsJ cmV0dXJuIGFlc19jbWFjX29uZSh6ZXJvLCB0bXAsIHNpemVvZih0bXApLCBwcm92X3NhbHQpOw0K PiA+ICt9DQo+ID4gKw0KPiA+ICtib29sIG1lc2hfY3J5cHRvX3Byb3ZfY29uZl9rZXkoY29uc3Qg dWludDhfdCBzZWNyZXRbMzJdLA0KPiA+ICsJCQkJCWNvbnN0IHVpbnQ4X3Qgc2FsdFsxNl0sDQo+ ID4gKwkJCQkJdWludDhfdCBjb25mX2tleVsxNl0pDQo+ID4gK3sNCj4gPiArCWNvbnN0IHVpbnQ4 X3QgcHJja1s0XSA9ICJwcmNrIjsNCj4gPiArDQo+ID4gKwlpZiAoIWFlc19jbWFjX29uZShzYWx0 LCBzZWNyZXQsIDMyLCBjb25mX2tleSkpDQo+ID4gKwkJcmV0dXJuIGZhbHNlOw0KPiA+ICsNCj4g PiArCXJldHVybiBhZXNfY21hY19vbmUoY29uZl9rZXksIHByY2ssIDQsIGNvbmZfa2V5KTsNCj4g PiArfQ0KPiA+ICsNCj4gPiArYm9vbCBtZXNoX2NyeXB0b19kZXZpY2Vfa2V5KGNvbnN0IHVpbnQ4 X3Qgc2VjcmV0WzMyXSwNCj4gPiArCQkJCQkJY29uc3QgdWludDhfdCBzYWx0WzE2XSwNCj4gPiAr CQkJCQkJdWludDhfdCBkZXZpY2Vfa2V5WzE2XSkNCj4gPiArew0KPiA+ICsJY29uc3QgdWludDhf dCBwcmRrWzRdID0gInByZGsiOw0KPiA+ICsNCj4gPiArCWlmICghYWVzX2NtYWNfb25lKHNhbHQs IHNlY3JldCwgMzIsIGRldmljZV9rZXkpKQ0KPiA+ICsJCXJldHVybiBmYWxzZTsNCj4gPiArDQo+ ID4gKwlyZXR1cm4gYWVzX2NtYWNfb25lKGRldmljZV9rZXksIHByZGssIDQsIGRldmljZV9rZXkp Ow0KPiA+ICt9DQo+ID4gKw0KPiA+ICtib29sIG1lc2hfY3J5cHRvX3ZpcnR1YWxfYWRkcihjb25z dCB1aW50OF90IHZpcnR1YWxfbGFiZWxbMTZdLA0KPiA+ICsJCQkJCQl1aW50MTZfdCAqYWRkcikN Cj4gPiArew0KPiA+ICsJdWludDhfdCB0bXBbMTZdOw0KPiA+ICsNCj4gPiArCWlmICghbWVzaF9j cnlwdG9fczEoInZ0YWQiLCA0LCB0bXApKQ0KPiA+ICsJCXJldHVybiBmYWxzZTsNCj4gPiArDQo+ ID4gKwlpZiAoIWFkZHIgfHwgIWFlc19jbWFjX29uZSh0bXAsIHZpcnR1YWxfbGFiZWwsIDE2LCB0 bXApKQ0KPiA+ICsJCXJldHVybiBmYWxzZTsNCj4gPiArDQo+ID4gKwkqYWRkciA9IChsX2dldF9i ZTE2KHRtcCArIDE0KSAmIDB4M2ZmZikgfCAweDgwMDA7DQo+ID4gKw0KPiA+ICsJcmV0dXJuIHRy dWU7DQo+ID4gK30NCj4gPiArDQo+ID4gK2Jvb2wgbWVzaF9jcnlwdG9fcHJpdmFjeV9jb3VudGVy KHVpbnQzMl90IGl2X2luZGV4LA0KPiA+ICsJCQkJCQljb25zdCB1aW50OF90ICpwYXlsb2FkLA0K PiA+ICsJCQkJCQl1aW50OF90IHByaXZhY3lfY291bnRlclsxNl0pDQo+ID4gK3sNCj4gPiArCW1l bXNldChwcml2YWN5X2NvdW50ZXIsIDAsIDUpOw0KPiA+ICsJbF9wdXRfYmUzMihpdl9pbmRleCwg cHJpdmFjeV9jb3VudGVyICsgNSk7DQo+ID4gKwltZW1jcHkocHJpdmFjeV9jb3VudGVyICsgOSwg cGF5bG9hZCwgNyk7DQo+ID4gKw0KPiA+ICsJcmV0dXJuIHRydWU7DQo+ID4gK30NCj4gPiArDQo+ ID4gK2Jvb2wgbWVzaF9jcnlwdG9fbmV0d29ya19vYmZ1c2NhdGUoY29uc3QgdWludDhfdCBwcml2 YWN5X2tleVsxNl0sDQo+ID4gKwkJCQkJY29uc3QgdWludDhfdCBwcml2YWN5X2NvdW50ZXJbMTZd LA0KPiA+ICsJCQkJCWJvb2wgY3RsLCB1aW50OF90IHR0bCwgdWludDMyX3Qgc2VxLA0KPiA+ICsJ CQkJCXVpbnQxNl90IHNyYywgdWludDhfdCAqb3V0KQ0KPiA+ICt7DQo+ID4gKwl1aW50OF90IGVj YlsxNl0sIHRtcFsxNl07DQo+ID4gKwlpbnQgaTsNCj4gPiArDQo+ID4gKwlpZiAoIWFlc19lY2Jf b25lKHByaXZhY3lfa2V5LCBwcml2YWN5X2NvdW50ZXIsIGVjYikpDQo+ID4gKwkJcmV0dXJuIGZh bHNlOw0KPiA+ICsNCj4gPiArCXRtcFswXSA9ICgoISFjdGwpIDw8IDcpIHwgKHR0bCAmIFRUTF9N QVNLKTsNCj4gPiArCXRtcFsxXSA9IChzZXEgJiAweGZmMDAwMCkgPj4gMTY7DQo+ID4gKwl0bXBb Ml0gPSAoc2VxICYgMHgwMGZmMDApID4+IDg7DQo+ID4gKwl0bXBbM10gPSAoc2VxICYgMHgwMDAw ZmYpOw0KPiA+ICsJdG1wWzRdID0gKHNyYyAmIDB4ZmYwMCkgPj4gODsNCj4gPiArCXRtcFs1XSA9 IChzcmMgJiAweDAwZmYpOw0KPiA+ICsNCj4gPiArCWlmIChvdXQpIHsNCj4gPiArCQlmb3IgKGkg PSAwOyBpIDwgNjsgaSsrKQ0KPiA+ICsJCQlvdXRbaV0gPSBlY2JbaV0gXiB0bXBbaV07DQo+ID4g Kwl9DQo+ID4gKw0KPiA+ICsJcmV0dXJuIHRydWU7DQo+ID4gK30NCj4gPiArDQo+ID4gK2Jvb2wg bWVzaF9jcnlwdG9fbmV0d29ya19jbGFyaWZ5KGNvbnN0IHVpbnQ4X3QgcHJpdmFjeV9rZXlbMTZd LA0KPiA+ICsJCQkJY29uc3QgdWludDhfdCBwcml2YWN5X2NvdW50ZXJbMTZdLA0KPiA+ICsJCQkJ Y29uc3QgdWludDhfdCBuZXRfaGRyWzZdLA0KPiA+ICsJCQkJYm9vbCAqY3RsLCB1aW50OF90ICp0 dGwsDQo+ID4gKwkJCQl1aW50MzJfdCAqc2VxLCB1aW50MTZfdCAqc3JjKQ0KPiA+ICt7DQo+ID4g Kwl1aW50OF90IGVjYlsxNl0sIHRtcFs2XTsNCj4gPiArCWludCBpOw0KPiA+ICsNCj4gPiArCWlm ICghYWVzX2VjYl9vbmUocHJpdmFjeV9rZXksIHByaXZhY3lfY291bnRlciwgZWNiKSkNCj4gPiAr CQlyZXR1cm4gZmFsc2U7DQo+ID4gKw0KPiA+ICsJZm9yIChpID0gMDsgaSA8IDY7IGkrKykNCj4g PiArCQl0bXBbaV0gPSBlY2JbaV0gXiBuZXRfaGRyW2ldOw0KPiA+ICsNCj4gPiArCWlmIChjdGwp DQo+ID4gKwkJKmN0bCA9ICEhKHRtcFswXSAmIENUTCk7DQo+ID4gKw0KPiA+ICsJaWYgKHR0bCkN Cj4gPiArCQkqdHRsID0gdG1wWzBdICYgVFRMX01BU0s7DQo+ID4gKw0KPiA+ICsJaWYgKHNlcSkN Cj4gPiArCQkqc2VxID0gbF9nZXRfYmUzMih0bXApICYgU0VRX01BU0s7DQo+ID4gKw0KPiA+ICsJ aWYgKHNyYykNCj4gPiArCQkqc3JjID0gbF9nZXRfYmUxNih0bXAgKyA0KTsNCj4gPiArDQo+ID4g KwlyZXR1cm4gdHJ1ZTsNCj4gPiArfQ0KPiA+ICsNCj4gPiArYm9vbCBtZXNoX2NyeXB0b19wYWNr ZXRfYnVpbGQoYm9vbCBjdGwsIHVpbnQ4X3QgdHRsLA0KPiA+ICsJCQkJdWludDMyX3Qgc2VxLA0K PiA+ICsJCQkJdWludDE2X3Qgc3JjLCB1aW50MTZfdCBkc3QsDQo+ID4gKwkJCQl1aW50OF90IG9w Y29kZSwNCj4gPiArCQkJCWJvb2wgc2VnbWVudGVkLCB1aW50OF90IGtleV9pZCwNCj4gPiArCQkJ CWJvb2wgc3ptaWMsIGJvb2wgcmVsYXksIHVpbnQxNl90IHNlcVplcm8sDQo+ID4gKwkJCQl1aW50 OF90IHNlZ08sIHVpbnQ4X3Qgc2VnTiwNCj4gPiArCQkJCWNvbnN0IHVpbnQ4X3QgKnBheWxvYWQs IHVpbnQ4X3QgcGF5bG9hZF9sZW4sDQo+ID4gKwkJCQl1aW50OF90ICpwYWNrZXQsIHVpbnQ4X3Qg KnBhY2tldF9sZW4pDQo+ID4gK3sNCj4gPiArCXVpbnQzMl90IGhkcjsNCj4gPiArCXNpemVfdCBu Ow0KPiA+ICsNCj4gPiArCWxfcHV0X2JlMzIoc2VxLCBwYWNrZXQgKyAxKTsNCj4gPiArCXBhY2tl dFsxXSA9IChjdGwgPyBDVEwgOiAwKSB8ICh0dGwgJiBUVExfTUFTSyk7DQo+ID4gKw0KPiA+ICsJ bF9wdXRfYmUxNihzcmMsIHBhY2tldCArIDUpOw0KPiA+ICsJbF9wdXRfYmUxNihkc3QsIHBhY2tl dCArIDcpOw0KPiA+ICsJbiA9IDk7DQo+ID4gKw0KPiA+ICsJaWYgKCFjdGwpIHsNCj4gPiArCQlo ZHIgPSBzZWdtZW50ZWQgPDwgU0VHX0hEUl9TSElGVDsNCj4gPiArCQloZHIgfD0gKGtleV9pZCAm IEtFWV9JRF9NQVNLKSA8PCBLRVlfSERSX1NISUZUOw0KPiA+ICsJCWlmIChzZWdtZW50ZWQpIHsN Cj4gPiArCQkJaGRyIHw9IHN6bWljIDw8IFNaTUlDX0hEUl9TSElGVDsNCj4gPiArCQkJaGRyIHw9 IChzZXFaZXJvICYgU0VRX1pFUk9fTUFTSykgPDwgU0VRX1pFUk9fSERSX1NISUZUOw0KPiA+ICsJ CQloZHIgfD0gKHNlZ08gJiBTRUdfTUFTSykgPDwgU0VHT19IRFJfU0hJRlQ7DQo+ID4gKwkJCWhk ciB8PSAoc2VnTiAmIFNFR19NQVNLKSA8PCBTRUdOX0hEUl9TSElGVDsNCj4gPiArCQl9DQo+ID4g KwkJbF9wdXRfYmUzMihoZHIsIHBhY2tldCArIG4pOw0KPiA+ICsNCj4gPiArCQkvKiBPbmx5IGZp cnN0IG9jdGV0IGlzIHZhbGlkIGZvciB1bnNlZ21lbnRlZCBtZXNzYWdlcyAqLw0KPiA+ICsJCWlm IChzZWdtZW50ZWQpDQo+ID4gKwkJCW4gKz0gNDsNCj4gPiArCQllbHNlDQo+ID4gKwkJCW4gKz0g MTsNCj4gPiArDQo+ID4gKwkJbWVtY3B5KHBhY2tldCArIG4sIHBheWxvYWQsIHBheWxvYWRfbGVu KTsNCj4gPiArDQo+ID4gKwkJbF9wdXRfYmUzMigweDAwMDAwMDAwLCBwYWNrZXQgKyBwYXlsb2Fk X2xlbiArIG4pOw0KPiA+ICsJCWlmIChwYWNrZXRfbGVuKQ0KPiA+ICsJCQkqcGFja2V0X2xlbiA9 IHBheWxvYWRfbGVuICsgbiArIDQ7DQo+ID4gKwl9IGVsc2Ugew0KPiA+ICsJCWlmICgob3Bjb2Rl ICYgT1BDT0RFX01BU0spICE9IG9wY29kZSkNCj4gPiArCQkJcmV0dXJuIGZhbHNlOw0KPiA+ICsN Cj4gPiArCQloZHIgPSBvcGNvZGUgPDwgS0VZX0hEUl9TSElGVDsNCj4gPiArCQlsX3B1dF9iZTMy KGhkciwgcGFja2V0ICsgbik7DQo+ID4gKwkJbiArPSAxOw0KPiA+ICsNCj4gPiArCQltZW1jcHko cGFja2V0ICsgbiwgcGF5bG9hZCwgcGF5bG9hZF9sZW4pOw0KPiA+ICsJCW4gKz0gcGF5bG9hZF9s ZW47DQo+ID4gKw0KPiA+ICsJCWxfcHV0X2JlNjQoMHgwMDAwMDAwMDAwMDAwMDAwLCBwYWNrZXQg KyBuKTsNCj4gPiArCQlpZiAocGFja2V0X2xlbikNCj4gPiArCQkJKnBhY2tldF9sZW4gPSBuICsg ODsNCj4gPiArCX0NCj4gPiArDQo+ID4gKw0KPiA+ICsJcmV0dXJuIHRydWU7DQo+ID4gK30NCj4g PiArDQo+ID4gK2Jvb2wgbWVzaF9jcnlwdG9fcGFja2V0X3BhcnNlKGNvbnN0IHVpbnQ4X3QgKnBh Y2tldCwgdWludDhfdCBwYWNrZXRfbGVuLA0KPiA+ICsJCQkJYm9vbCAqY3RsLCB1aW50OF90ICp0 dGwsIHVpbnQzMl90ICpzZXEsDQo+ID4gKwkJCQl1aW50MTZfdCAqc3JjLCB1aW50MTZfdCAqZHN0 LA0KPiA+ICsJCQkJdWludDMyX3QgKmNvb2tpZSwgdWludDhfdCAqb3Bjb2RlLA0KPiA+ICsJCQkJ Ym9vbCAqc2VnbWVudGVkLCB1aW50OF90ICprZXlfaWQsDQo+ID4gKwkJCQlib29sICpzem1pYywg Ym9vbCAqcmVsYXksIHVpbnQxNl90ICpzZXFaZXJvLA0KPiA+ICsJCQkJdWludDhfdCAqc2VnTywg dWludDhfdCAqc2VnTiwNCj4gPiArCQkJCWNvbnN0IHVpbnQ4X3QgKipwYXlsb2FkLCB1aW50OF90 ICpwYXlsb2FkX2xlbikNCj4gPiArew0KPiA+ICsJdWludDMyX3QgaGRyOw0KPiA+ICsJdWludDE2 X3QgdGhpc19kc3Q7DQo+ID4gKwlib29sIGlzX3NlZ21lbnRlZDsNCj4gPiArDQo+ID4gKwlpZiAo cGFja2V0X2xlbiA8IDE0KQ0KPiA+ICsJCXJldHVybiBmYWxzZTsNCj4gPiArDQo+ID4gKwl0aGlz X2RzdCA9IGxfZ2V0X2JlMTYocGFja2V0ICsgNyk7DQo+ID4gKw0KPiA+ICsJLyogVHJ5IHRvIGtl ZXAgYml0cyBpbiB0aGUgb3JkZXIgdGhleSBleGlzdCB3aXRoaW4gdGhlIHBhY2tldCAqLw0KPiA+ ICsJaWYgKGN0bCkNCj4gPiArCQkqY3RsID0gISEocGFja2V0WzFdICYgQ1RMKTsNCj4gPiArDQo+ ID4gKwlpZiAodHRsKQ0KPiA+ICsJCSp0dGwgPSBwYWNrZXRbMV0gJiBUVExfTUFTSzsNCj4gPiAr DQo+ID4gKwlpZiAoc2VxKQ0KPiA+ICsJCSpzZXEgPSBsX2dldF9iZTMyKHBhY2tldCArIDEpICYg U0VRX01BU0s7DQo+ID4gKw0KPiA+ICsJaWYgKHNyYykNCj4gPiArCQkqc3JjID0gbF9nZXRfYmUx NihwYWNrZXQgKyA1KTsNCj4gPiArDQo+ID4gKwlpZiAoZHN0KQ0KPiA+ICsJCSpkc3QgPSB0aGlz X2RzdDsNCj4gPiArDQo+ID4gKwloZHIgPSBsX2dldF9iZTMyKHBhY2tldCArIDkpOw0KPiA+ICsN Cj4gPiArCWlzX3NlZ21lbnRlZCA9ICEhKChoZHIgPj4gU0VHX0hEUl9TSElGVCkgJiB0cnVlKTsN Cj4gPiArCWlmIChzZWdtZW50ZWQpDQo+ID4gKwkJKnNlZ21lbnRlZCA9IGlzX3NlZ21lbnRlZDsN Cj4gPiArDQo+ID4gKwlpZiAocGFja2V0WzFdICYgQ1RMKSB7DQo+ID4gKwkJdWludDhfdCB0aGlz X29wY29kZSA9IHBhY2tldFs5XSAmIE9QQ09ERV9NQVNLOw0KPiA+ICsNCj4gPiArCQlpZiAoY29v a2llKQ0KPiA+ICsJCQkqY29va2llID0gbF9nZXRfYmUzMihwYWNrZXQgKyA5KTsNCj4gPiArDQo+ ID4gKwkJaWYgKG9wY29kZSkNCj4gPiArCQkJKm9wY29kZSA9IHRoaXNfb3Bjb2RlOw0KPiA+ICsN Cj4gPiArCQlpZiAodGhpc19kc3QgJiYgdGhpc19vcGNvZGUgPT0gTkVUX09QX1NFR19BQ0tOT1dM RURHRSkgew0KPiA+ICsJCQlpZiAocmVsYXkpDQo+ID4gKwkJCQkqcmVsYXkgPSAhISgoaGRyID4+ IFJFTEFZX0hEUl9TSElGVCkgJiB0cnVlKTsNCj4gPiArDQo+ID4gKwkJCWlmIChzZXFaZXJvKQ0K PiA+ICsJCQkJKnNlcVplcm8gPSAoaGRyID4+IFNFUV9aRVJPX0hEUl9TSElGVCkgJg0KPiA+ICsJ CQkJCQkJCVNFUV9aRVJPX01BU0s7DQo+ID4gKw0KPiA+ICsJCQlpZiAocGF5bG9hZCkNCj4gPiAr CQkJCSpwYXlsb2FkID0gcGFja2V0ICsgOTsNCj4gPiArDQo+ID4gKwkJCWlmIChwYXlsb2FkX2xl bikNCj4gPiArCQkJCSpwYXlsb2FkX2xlbiA9IHBhY2tldF9sZW4gLSA5IC0gODsNCj4gPiArCQl9 IGVsc2Ugew0KPiA+ICsJCQlpZiAocGF5bG9hZCkNCj4gPiArCQkJCSpwYXlsb2FkID0gcGFja2V0 ICsgMTA7DQo+ID4gKw0KPiA+ICsJCQlpZiAocGF5bG9hZF9sZW4pDQo+ID4gKwkJCQkqcGF5bG9h ZF9sZW4gPSBwYWNrZXRfbGVuIC0gMTAgLSA4Ow0KPiA+ICsJCX0NCj4gPiArCX0gZWxzZSB7DQo+ ID4gKwkJaWYgKGNvb2tpZSkNCj4gPiArCQkJKmNvb2tpZSA9IGxfZ2V0X2JlMzIocGFja2V0ICsg cGFja2V0X2xlbiAtIDgpOw0KPiA+ICsNCj4gPiArCQlpZiAoa2V5X2lkKQ0KPiA+ICsJCQkqa2V5 X2lkID0gKGhkciA+PiBLRVlfSERSX1NISUZUKSAmIEtFWV9JRF9NQVNLOw0KPiA+ICsNCj4gPiAr CQlpZiAoaXNfc2VnbWVudGVkKSB7DQo+ID4gKwkJCWlmIChzem1pYykNCj4gPiArCQkJCSpzem1p YyA9ICEhKChoZHIgPj4gU1pNSUNfSERSX1NISUZUKSAmIHRydWUpOw0KPiA+ICsNCj4gPiArCQkJ aWYgKHNlcVplcm8pDQo+ID4gKwkJCQkqc2VxWmVybyA9IChoZHIgPj4gU0VRX1pFUk9fSERSX1NI SUZUKSAmDQo+ID4gKwkJCQkJCQkJU0VRX1pFUk9fTUFTSzsNCj4gPiArDQo+ID4gKwkJCWlmIChz ZWdPKQ0KPiA+ICsJCQkJKnNlZ08gPSAoaGRyID4+IFNFR09fSERSX1NISUZUKSAmIFNFR19NQVNL Ow0KPiA+ICsNCj4gPiArCQkJaWYgKHNlZ04pDQo+ID4gKwkJCQkqc2VnTiA9IChoZHIgPj4gU0VH Tl9IRFJfU0hJRlQpICYgU0VHX01BU0s7DQo+ID4gKw0KPiA+ICsJCQlpZiAocGF5bG9hZCkNCj4g PiArCQkJCSpwYXlsb2FkID0gcGFja2V0ICsgMTM7DQo+ID4gKw0KPiA+ICsJCQlpZiAocGF5bG9h ZF9sZW4pDQo+ID4gKwkJCQkqcGF5bG9hZF9sZW4gPSBwYWNrZXRfbGVuIC0gMTMgLSA0Ow0KPiA+ ICsJCX0gZWxzZSB7DQo+ID4gKwkJCWlmIChwYXlsb2FkKQ0KPiA+ICsJCQkJKnBheWxvYWQgPSBw YWNrZXQgKyAxMDsNCj4gPiArDQo+ID4gKwkJCWlmIChwYXlsb2FkX2xlbikNCj4gPiArCQkJCSpw YXlsb2FkX2xlbiA9IHBhY2tldF9sZW4gLSAxMCAtIDQ7DQo+ID4gKwkJfQ0KPiA+ICsJfQ0KPiA+ ICsNCj4gPiArCXJldHVybiB0cnVlOw0KPiA+ICt9DQo+ID4gKw0KPiA+ICtib29sIG1lc2hfY3J5 cHRvX3BheWxvYWRfZW5jcnlwdCh1aW50OF90ICphYWQsIGNvbnN0IHVpbnQ4X3QgKnBheWxvYWQs DQo+ID4gKwkJCQl1aW50OF90ICpvdXQsIHVpbnQxNl90IHBheWxvYWRfbGVuLA0KPiA+ICsJCQkJ dWludDE2X3Qgc3JjLCB1aW50MTZfdCBkc3QsIHVpbnQ4X3Qga2V5X2lkLA0KPiA+ICsJCQkJdWlu dDMyX3Qgc2VxX251bSwgdWludDMyX3QgaXZfaW5kZXgsDQo+ID4gKwkJCQlib29sIGFzem1pYywN Cj4gPiArCQkJCWNvbnN0IHVpbnQ4X3QgYXBwbGljYXRpb25fa2V5WzE2XSkNCj4gPiArew0KPiA+ ICsJdWludDhfdCBhcHBsaWNhdGlvbl9ub25jZVsxM10gPSB7IDB4MDEsIH07DQo+ID4gKw0KPiA+ ICsJaWYgKHBheWxvYWRfbGVuIDwgMSkNCj4gPiArCQlyZXR1cm4gZmFsc2U7DQo+ID4gKw0KPiA+ ICsJLyogS2V5X0lEID09IDAgbWVhbnMgdGhlIERldmljZSBLZXkgaXMgYmVpbmcgdXNlZCAqLw0K PiA+ICsJaWYgKCFrZXlfaWQpDQo+ID4gKwkJYXBwbGljYXRpb25fbm9uY2VbMF0gPSAweDAyOw0K PiA+ICsNCj4gPiArCS8qIFNlcSBOdW0gKi8NCj4gPiArCWxfcHV0X2JlMzIoc2VxX251bSwgYXBw bGljYXRpb25fbm9uY2UgKyAxKTsNCj4gPiArDQo+ID4gKwkvKiBBU1pNSUMgKi8NCj4gPiArCWFw cGxpY2F0aW9uX25vbmNlWzFdIHw9IGFzem1pYyA/IDB4ODAgOiAweDAwOw0KPiA+ICsNCj4gPiAr CS8qIFNSQyAqLw0KPiA+ICsJbF9wdXRfYmUxNihzcmMsIGFwcGxpY2F0aW9uX25vbmNlICsgNSk7 DQo+ID4gKw0KPiA+ICsJLyogRFNUICovDQo+ID4gKwlsX3B1dF9iZTE2KGRzdCwgYXBwbGljYXRp b25fbm9uY2UgKyA3KTsNCj4gPiArDQo+ID4gKwkvKiBJViBJbmRleCAqLw0KPiA+ICsJbF9wdXRf YmUzMihpdl9pbmRleCwgYXBwbGljYXRpb25fbm9uY2UgKyA5KTsNCj4gPiArDQo+ID4gKwkvKiBw cmludF9wYWNrZXQoIkFBRCIsIGFhZCwgYWFkID8gMTYgOiAwKTsgKi8NCj4gPiArCS8qIHByaW50 X3BhY2tldCgiTm9uY2UiLCBhcHBsaWNhdGlvbl9ub25jZSwgMTMpOyAqLw0KPiA+ICsJLyogcHJp bnRfcGFja2V0KCJLZXkiLCBhcHBsaWNhdGlvbl9rZXksIDE2KTsgKi8NCj4gPiArCS8qIHByaW50 X3BhY2tldCgiUGF5bG9hZFtjbHJdIiwgcGF5bG9hZCwgcGF5bG9hZF9sZW4pOyAqLw0KPiA+ICsN Cj4gPiArCWlmICghbWVzaF9jcnlwdG9fYWVzX2NjbV9lbmNyeXB0KGFwcGxpY2F0aW9uX25vbmNl LCBhcHBsaWNhdGlvbl9rZXksDQo+ID4gKwkJCQkJYWFkLCBhYWQgPyAxNiA6IDAsDQo+ID4gKwkJ CQkJcGF5bG9hZCwgcGF5bG9hZF9sZW4sDQo+ID4gKwkJCQkJb3V0LCBOVUxMLA0KPiA+ICsJCQkJ CWFzem1pYyA/IDggOiA0KSkNCj4gPiArCQlyZXR1cm4gZmFsc2U7DQo+ID4gKw0KPiA+ICsJLyog cHJpbnRfcGFja2V0KCJQYXlsb2FkW2VuY10iLCBvdXQsIHBheWxvYWRfbGVuICsgKGFzem1pYyA/ IDggOiA0KSk7ICovDQo+ID4gKw0KPiA+ICsJcmV0dXJuIHRydWU7DQo+ID4gK30NCj4gPiArDQo+ ID4gK2Jvb2wgbWVzaF9jcnlwdG9fcGF5bG9hZF9kZWNyeXB0KHVpbnQ4X3QgKmFhZCwgdWludDE2 X3QgYWFkX2xlbiwNCj4gPiArCQkJCWNvbnN0IHVpbnQ4X3QgKnBheWxvYWQsIHVpbnQxNl90IHBh eWxvYWRfbGVuLA0KPiA+ICsJCQkJYm9vbCBzem1pY3QsDQo+ID4gKwkJCQl1aW50MTZfdCBzcmMs IHVpbnQxNl90IGRzdCwNCj4gPiArCQkJCXVpbnQ4X3Qga2V5X2lkLCB1aW50MzJfdCBzZXFfbnVt LA0KPiA+ICsJCQkJdWludDMyX3QgaXZfaW5kZXgsIHVpbnQ4X3QgKm91dCwNCj4gPiArCQkJCWNv bnN0IHVpbnQ4X3QgYXBwX2tleVsxNl0pDQo+ID4gK3sNCj4gPiArCXVpbnQ4X3QgYXBwX25vbmNl WzEzXSA9IHsgMHgwMSwgfTsNCj4gPiArCXVpbnQzMl90IG1pYzMyOw0KPiA+ICsJdWludDY0X3Qg bWljNjQ7DQo+ID4gKw0KPiA+ICsJaWYgKHBheWxvYWRfbGVuIDwgNSB8fCAhb3V0KQ0KPiA+ICsJ CXJldHVybiBmYWxzZTsNCj4gPiArDQo+ID4gKwkvKiBLZXlfSUQgPT0gMCBtZWFucyB0aGUgRGV2 aWNlIEtleSBpcyBiZWluZyB1c2VkICovDQo+ID4gKwlpZiAoIWtleV9pZCkNCj4gPiArCQlhcHBf bm9uY2VbMF0gPSAweDAyOw0KPiA+ICsNCj4gPiArCS8qIFNlcSBOdW0gKi8NCj4gPiArCWxfcHV0 X2JlMzIoc2VxX251bSwgYXBwX25vbmNlICsgMSk7DQo+ID4gKw0KPiA+ICsJLyogQVNaTUlDICov DQo+ID4gKwlhcHBfbm9uY2VbMV0gfD0gc3ptaWN0ID8gMHg4MCA6IDB4MDA7DQo+ID4gKw0KPiA+ ICsJLyogU1JDICovDQo+ID4gKwlsX3B1dF9iZTE2KHNyYywgYXBwX25vbmNlICsgNSk7DQo+ID4g Kw0KPiA+ICsJLyogRFNUICovDQo+ID4gKwlsX3B1dF9iZTE2KGRzdCwgYXBwX25vbmNlICsgNyk7 DQo+ID4gKw0KPiA+ICsJLyogSVYgSW5kZXggKi8NCj4gPiArCWxfcHV0X2JlMzIoaXZfaW5kZXgs IGFwcF9ub25jZSArIDkpOw0KPiA+ICsNCj4gPiArCW1lbWNweShvdXQsIHBheWxvYWQsIHBheWxv YWRfbGVuKTsNCj4gPiArDQo+ID4gKwkvKiBwcmludF9wYWNrZXQoIkFBRCIsIGFhZCwgYWFkX2xl bik7ICovDQo+ID4gKwkvKiBwcmludF9wYWNrZXQoIk5vbmNlIiwgYXBwX25vbmNlLCAxMyk7ICov DQo+ID4gKwkvKiBwcmludF9wYWNrZXQoIktleSIsIGFwcF9rZXksIDE2KTsgKi8NCj4gPiArCS8q IHByaW50X3BhY2tldCgiUGF5bG9hZFtlbmNdIiwgcGF5bG9hZCwgcGF5bG9hZF9sZW4pOyAqLw0K PiA+ICsNCj4gPiArCWlmIChzem1pY3QpIHsNCj4gPiArCQlpZiAoIW1lc2hfY3J5cHRvX2Flc19j Y21fZGVjcnlwdChhcHBfbm9uY2UsIGFwcF9rZXksDQo+ID4gKwkJCQkJYWFkLCBhYWRfbGVuLA0K PiA+ICsJCQkJCXBheWxvYWQsIHBheWxvYWRfbGVuLA0KPiA+ICsJCQkJCW91dCwgJm1pYzY0LCBz aXplb2YobWljNjQpKSkNCj4gPiArCQkJcmV0dXJuIGZhbHNlOw0KPiA+ICsNCj4gPiArCQltaWM2 NCBePSBsX2dldF9iZTY0KG91dCArIHBheWxvYWRfbGVuIC0gOCk7DQo+ID4gKwkJbF9wdXRfYmU2 NChtaWM2NCwgb3V0ICsgcGF5bG9hZF9sZW4gLSA4KTsNCj4gPiArDQo+ID4gKwkJLyogcHJpbnRf cGFja2V0KCJQYXlsb2FkW2Nscl0iLCBvdXQsIHBheWxvYWRfbGVuIC0gOCk7ICovDQo+ID4gKw0K PiA+ICsJCWlmIChtaWM2NCkNCj4gPiArCQkJcmV0dXJuIGZhbHNlOw0KPiA+ICsJfSBlbHNlIHsN Cj4gPiArCQlpZiAoIW1lc2hfY3J5cHRvX2Flc19jY21fZGVjcnlwdChhcHBfbm9uY2UsIGFwcF9r ZXksDQo+ID4gKwkJCQkJYWFkLCBhYWRfbGVuLA0KPiA+ICsJCQkJCXBheWxvYWQsIHBheWxvYWRf bGVuLA0KPiA+ICsJCQkJCW91dCwgJm1pYzMyLCBzaXplb2YobWljMzIpKSkNCj4gPiArCQkJcmV0 dXJuIGZhbHNlOw0KPiA+ICsNCj4gPiArCQltaWMzMiBePSBsX2dldF9iZTMyKG91dCArIHBheWxv YWRfbGVuIC0gNCk7DQo+ID4gKwkJbF9wdXRfYmUzMihtaWMzMiwgb3V0ICsgcGF5bG9hZF9sZW4g LSA0KTsNCj4gPiArDQo+ID4gKwkJLyogcHJpbnRfcGFja2V0KCJQYXlsb2FkW2Nscl0iLCBvdXQs IHBheWxvYWRfbGVuIC0gNCk7ICovDQo+ID4gKw0KPiA+ICsJCWlmIChtaWMzMikNCj4gPiArCQkJ cmV0dXJuIGZhbHNlOw0KPiA+ICsJfQ0KPiA+ICsNCj4gPiArCXJldHVybiB0cnVlOw0KPiA+ICt9 DQo+ID4gKw0KPiA+ICtib29sIG1lc2hfY3J5cHRvX3BhY2tldF9lbmNvZGUodWludDhfdCAqcGFj a2V0LCB1aW50OF90IHBhY2tldF9sZW4sDQo+ID4gKwkJCQljb25zdCB1aW50OF90IG5ldHdvcmtf a2V5WzE2XSwNCj4gPiArCQkJCXVpbnQzMl90IGl2X2luZGV4LA0KPiA+ICsJCQkJY29uc3QgdWlu dDhfdCBwcml2YWN5X2tleVsxNl0pDQo+ID4gK3sNCj4gPiArCXVpbnQ4X3QgbmV0d29ya19ub25j ZVsxM10gPSB7IDB4MDAsIDB4MDAgfTsNCj4gPiArCXVpbnQ4X3QgcHJpdmFjeV9jb3VudGVyWzE2 XSA9IHsgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgfTsNCj4gPiArCXVpbnQ4X3QgdG1w WzE2XTsNCj4gPiArCWludCBpOw0KPiA+ICsNCj4gPiArCWlmIChwYWNrZXRfbGVuIDwgMTQpDQo+ ID4gKwkJcmV0dXJuIGZhbHNlOw0KPiA+ICsNCj4gPiArCS8qIERldGVjdCBQcm94eSBwYWNrZXQg YnkgQ1RMID09IHRydWUgJiYgRFNUID09IDB4MDAwMCAqLw0KPiA+ICsJaWYgKChwYWNrZXRbMV0g JiBDVEwpICYmIGxfZ2V0X2JlMTYocGFja2V0ICsgNykgPT0gMCkNCj4gPiArCQluZXR3b3JrX25v bmNlWzBdID0gMHgwMzsgLyogIFByb3h5IE5vbmNlICovDQo+ID4gKwllbHNlDQo+ID4gKwkJLyog Q1RMICsgVFRMICovDQo+ID4gKwkJbmV0d29ya19ub25jZVsxXSA9IHBhY2tldFsxXTsNCj4gPiAr DQo+ID4gKwkvKiBTZXEgTnVtICovDQo+ID4gKwluZXR3b3JrX25vbmNlWzJdID0gcGFja2V0WzJd Ow0KPiA+ICsJbmV0d29ya19ub25jZVszXSA9IHBhY2tldFszXTsNCj4gPiArCW5ldHdvcmtfbm9u Y2VbNF0gPSBwYWNrZXRbNF07DQo+ID4gKw0KPiA+ICsJLyogU1JDICovDQo+ID4gKwluZXR3b3Jr X25vbmNlWzVdID0gcGFja2V0WzVdOw0KPiA+ICsJbmV0d29ya19ub25jZVs2XSA9IHBhY2tldFs2 XTsNCj4gPiArDQo+ID4gKwkvKiBEU1Qgbm90IGF2YWlsYWJsZSAqLw0KPiA+ICsJbmV0d29ya19u b25jZVs3XSA9IDA7DQo+ID4gKwluZXR3b3JrX25vbmNlWzhdID0gMDsNCj4gPiArDQo+ID4gKwkv KiBJViBJbmRleCAqLw0KPiA+ICsJbF9wdXRfYmUzMihpdl9pbmRleCwgbmV0d29ya19ub25jZSAr IDkpOw0KPiA+ICsNCj4gPiArCS8qIHByaW50X3BhY2tldCgiTmV0LU5vbmNlIiwgbmV0d29ya19u b25jZSwgMTMpOyAqLw0KPiA+ICsJLyogcHJpbnRfcGFja2V0KCJOZXQtS2V5IiwgbmV0d29ya19r ZXksIDE2KTsgKi8NCj4gPiArCS8qIHByaW50X3BhY2tldCgiTmV0LVBheWxvYWRbY2xyXSIsIHBh Y2tldCwgcGFja2V0X2xlbik7ICovDQo+ID4gKw0KPiA+ICsJLyogQ2hlY2sgZm9yIExvbmcgbmV0 LU1JQyAqLw0KPiA+ICsJaWYgKHBhY2tldFsxXSAmIENUTCkgew0KPiA+ICsJCWlmICghbWVzaF9j cnlwdG9fYWVzX2NjbV9lbmNyeXB0KG5ldHdvcmtfbm9uY2UsIG5ldHdvcmtfa2V5LA0KPiA+ICsJ CQkJCU5VTEwsIDAsDQo+ID4gKwkJCQkJcGFja2V0ICsgNywgcGFja2V0X2xlbiAtIDcgLSA4LA0K PiA+ICsJCQkJCXBhY2tldCArIDcsIE5VTEwsIHNpemVvZih1aW50NjRfdCkpKQ0KPiA+ICsJCQly ZXR1cm4gZmFsc2U7DQo+ID4gKwl9IGVsc2Ugew0KPiA+ICsJCWlmICghbWVzaF9jcnlwdG9fYWVz X2NjbV9lbmNyeXB0KG5ldHdvcmtfbm9uY2UsIG5ldHdvcmtfa2V5LA0KPiA+ICsJCQkJCU5VTEws IDAsDQo+ID4gKwkJCQkJcGFja2V0ICsgNywgcGFja2V0X2xlbiAtIDcgLSA0LA0KPiA+ICsJCQkJ CXBhY2tldCArIDcsIE5VTEwsIHNpemVvZih1aW50MzJfdCkpKQ0KPiA+ICsJCQlyZXR1cm4gZmFs c2U7DQo+ID4gKwl9DQo+ID4gKw0KPiA+ICsJLyogcHJpbnRfcGFja2V0KCJOZXQtUGF5bG9hZFtl bmNdIiwgcGFja2V0LCBwYWNrZXRfbGVuKTsgKi8NCj4gPiArDQo+ID4gKwlsX3B1dF9iZTMyKGl2 X2luZGV4LCBwcml2YWN5X2NvdW50ZXIgKyA1KTsNCj4gPiArCW1lbWNweShwcml2YWN5X2NvdW50 ZXIgKyA5LCBwYWNrZXQgKyA3LCA3KTsNCj4gPiArDQo+ID4gKwkvKiBwcmludF9wYWNrZXQoIlBy aXYtUmFuZG9tIiwgcHJpdmFjeV9jb3VudGVyLCAxNik7ICovDQo+ID4gKw0KPiA+ICsJLyogcHJp bnRfcGFja2V0KCJQcml2LUtleSIsIHByaXZhY3lfa2V5LCAxNik7ICovDQo+ID4gKw0KPiA+ICsN Cj4gPiArCWlmICghYWVzX2VjYl9vbmUocHJpdmFjeV9rZXksIHByaXZhY3lfY291bnRlciwgdG1w KSkNCj4gPiArCQlyZXR1cm4gZmFsc2U7DQo+ID4gKw0KPiA+ICsJZm9yIChpID0gMDsgaSA8IDY7 IGkrKykNCj4gPiArCQlwYWNrZXRbMSArIGldIF49IHRtcFtpXTsNCj4gPiArDQo+ID4gKwkvKiBw cmludF9wYWNrZXQoIk5ldC1Qcml2YXRlIiwgcGFja2V0LCBwYWNrZXRfbGVuKTsgKi8NCj4gPiAr DQo+ID4gKwlyZXR1cm4gdHJ1ZTsNCj4gPiArfQ0KPiA+ICsNCj4gPiArYm9vbCBtZXNoX2NyeXB0 b19wYWNrZXRfZGVjb2RlKGNvbnN0IHVpbnQ4X3QgKnBhY2tldCwgdWludDhfdCBwYWNrZXRfbGVu LA0KPiA+ICsJCQkJYm9vbCBwcm94eSwgdWludDhfdCAqb3V0LCB1aW50MzJfdCBpdl9pbmRleCwN Cj4gPiArCQkJCWNvbnN0IHVpbnQ4X3QgbmV0d29ya19rZXlbMTZdLA0KPiA+ICsJCQkJY29uc3Qg dWludDhfdCBwcml2YWN5X2tleVsxNl0pDQo+ID4gK3sNCj4gPiArCXVpbnQ4X3QgcHJpdmFjeV9j b3VudGVyWzE2XSA9IHsgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgfTsNCj4gPiArCXVp bnQ4X3QgbmV0d29ya19ub25jZVsxM10gPSB7IDB4MDAsIDB4MDAsIH07DQo+ID4gKwl1aW50OF90 IHRtcFsxNl07DQo+ID4gKwl1aW50MTZfdCBzcmM7DQo+ID4gKwlpbnQgaTsNCj4gPiArDQo+ID4g KwlpZiAocGFja2V0X2xlbiA8IDE0KQ0KPiA+ICsJCXJldHVybiBmYWxzZTsNCj4gPiArDQo+ID4g KwkvKiBwcmludF9wYWNrZXQoIlByaXYtS2V5IiwgcHJpdmFjeV9rZXksIDE2KTsgKi8NCj4gPiAr DQo+ID4gKwlsX3B1dF9iZTMyKGl2X2luZGV4LCBwcml2YWN5X2NvdW50ZXIgKyA1KTsNCj4gPiAr CW1lbWNweShwcml2YWN5X2NvdW50ZXIgKyA5LCBwYWNrZXQgKyA3LCA3KTsNCj4gPiArDQo+ID4g KwkvKiBwcmludF9wYWNrZXQoIlByaXYtUmFuZG9tIiwgcHJpdmFjeV9jb3VudGVyLCAxNik7ICov DQo+ID4gKw0KPiA+ICsJaWYgKCFhZXNfZWNiX29uZShwcml2YWN5X2tleSwgcHJpdmFjeV9jb3Vu dGVyLCB0bXApKQ0KPiA+ICsJCXJldHVybiBmYWxzZTsNCj4gPiArDQo+ID4gKwltZW1jcHkob3V0 LCBwYWNrZXQsIHBhY2tldF9sZW4pOw0KPiA+ICsJZm9yIChpID0gMDsgaSA8IDY7IGkrKykNCj4g PiArCQlvdXRbMSArIGldIF49IHRtcFtpXTsNCj4gPiArDQo+ID4gKwlzcmMgID0gbF9nZXRfYmUx NihvdXQgKyA1KTsNCj4gPiArDQo+ID4gKwkvKiBQcmUtY2hlY2sgU1JDIGFkZHJlc3MgZm9yIGls bGVnYWwgdmFsdWVzICovDQo+ID4gKwlpZiAoIXNyYyB8fCBzcmMgPj0gMHg4MDAwKQ0KPiA+ICsJ CXJldHVybiBmYWxzZTsNCj4gPiArDQo+ID4gKwkvKiBEZXRlY3QgUHJveHkgcGFja2V0IGJ5IENU TCA9PSB0cnVlICYmIHByb3h5ID09IHRydWUgKi8NCj4gPiArCWlmICgob3V0WzFdICYgQ1RMKSAm JiBwcm94eSkNCj4gPiArCQluZXR3b3JrX25vbmNlWzBdID0gMHgwMzsgLyogIFByb3h5IE5vbmNl ICovDQo+ID4gKwllbHNlDQo+ID4gKwkJLyogQ1RMICsgVFRMICovDQo+ID4gKwkJbmV0d29ya19u b25jZVsxXSA9IG91dFsxXTsNCj4gPiArDQo+ID4gKwkvKiBTZXEgTnVtICovDQo+ID4gKwluZXR3 b3JrX25vbmNlWzJdID0gb3V0WzJdOw0KPiA+ICsJbmV0d29ya19ub25jZVszXSA9IG91dFszXTsN Cj4gPiArCW5ldHdvcmtfbm9uY2VbNF0gPSBvdXRbNF07DQo+ID4gKw0KPiA+ICsJLyogU1JDICov DQo+ID4gKwluZXR3b3JrX25vbmNlWzVdID0gb3V0WzVdOw0KPiA+ICsJbmV0d29ya19ub25jZVs2 XSA9IG91dFs2XTsNCj4gPiArDQo+ID4gKwkvKiBEU1Qgbm90IGF2YWlsYWJsZSAqLw0KPiA+ICsJ bmV0d29ya19ub25jZVs3XSA9IDA7DQo+ID4gKwluZXR3b3JrX25vbmNlWzhdID0gMDsNCj4gPiAr DQo+ID4gKwkvKiBJViBJbmRleCAqLw0KPiA+ICsJbF9wdXRfYmUzMihpdl9pbmRleCwgbmV0d29y a19ub25jZSArIDkpOw0KPiA+ICsNCj4gPiArCS8qIHByaW50X3BhY2tldCgiTmV0LU5vbmNlIiwg bmV0d29ya19ub25jZSwgMTMpOyAqLw0KPiA+ICsJLyogcHJpbnRfcGFja2V0KCJOZXQtS2V5Iiwg bmV0d29ya19rZXksIDE2KTsgKi8NCj4gPiArCS8qIHByaW50X3BhY2tldCgiTmV0LVBrdFtlbmNd Iiwgb3V0LCBwYWNrZXRfbGVuKTsgKi8NCj4gPiArDQo+ID4gKwkvKiBDaGVjayBmb3IgTG9uZyBN SUMgKi8NCj4gPiArCWlmIChvdXRbMV0gJiBDVEwpIHsNCj4gPiArCQl1aW50NjRfdCBtaWM7DQo+ ID4gKw0KPiA+ICsJCWlmICghbWVzaF9jcnlwdG9fYWVzX2NjbV9kZWNyeXB0KG5ldHdvcmtfbm9u Y2UsIG5ldHdvcmtfa2V5LA0KPiA+ICsJCQkJCU5VTEwsIDAsIHBhY2tldCArIDcsIHBhY2tldF9s ZW4gLSA3LA0KPiA+ICsJCQkJCW91dCArIDcsICZtaWMsIHNpemVvZihtaWMpKSkNCj4gPiArCQkJ cmV0dXJuIGZhbHNlOw0KPiA+ICsNCj4gPiArCQltaWMgXj0gbF9nZXRfYmU2NChvdXQgKyBwYWNr ZXRfbGVuIC0gOCk7DQo+ID4gKwkJbF9wdXRfYmU2NChtaWMsIG91dCArIHBhY2tldF9sZW4gLSA4 KTsNCj4gPiArDQo+ID4gKwkJaWYgKG1pYykNCj4gPiArCQkJcmV0dXJuIGZhbHNlOw0KPiA+ICsJ fSBlbHNlIHsNCj4gPiArCQl1aW50MzJfdCBtaWM7DQo+ID4gKw0KPiA+ICsJCWlmICghbWVzaF9j cnlwdG9fYWVzX2NjbV9kZWNyeXB0KG5ldHdvcmtfbm9uY2UsIG5ldHdvcmtfa2V5LA0KPiA+ICsJ CQkJCU5VTEwsIDAsIHBhY2tldCArIDcsIHBhY2tldF9sZW4gLSA3LA0KPiA+ICsJCQkJCW91dCAr IDcsICZtaWMsIHNpemVvZihtaWMpKSkNCj4gPiArCQkJcmV0dXJuIGZhbHNlOw0KPiA+ICsNCj4g PiArCQltaWMgXj0gbF9nZXRfYmUzMihvdXQgKyBwYWNrZXRfbGVuIC0gNCk7DQo+ID4gKwkJbF9w dXRfYmUzMihtaWMsIG91dCArIHBhY2tldF9sZW4gLSA0KTsNCj4gPiArDQo+ID4gKwkJaWYgKG1p YykNCj4gPiArCQkJcmV0dXJuIGZhbHNlOw0KPiA+ICsJfQ0KPiA+ICsNCj4gPiArCS8qIHByaW50 X3BhY2tldCgiTmV0LVBrdFtjbHJdIiwgb3V0LCBwYWNrZXRfbGVuKTsgKi8NCj4gPiArDQo+ID4g KwlyZXR1cm4gdHJ1ZTsNCj4gPiArfQ0KPiA+ICsNCj4gPiArYm9vbCBtZXNoX2NyeXB0b19wYWNr ZXRfbGFiZWwodWludDhfdCAqcGFja2V0LCB1aW50OF90IHBhY2tldF9sZW4sDQo+ID4gKwkJCQl1 aW50MTZfdCBpdl9pbmRleCwgdWludDhfdCBuZXR3b3JrX2lkKQ0KPiA+ICt7DQo+ID4gKwlwYWNr ZXRbMF0gPSAoaXZfaW5kZXggJiAweDAwMDEpIDw8IDcgfCAobmV0d29ya19pZCAmIDB4N2YpOw0K PiA+ICsNCj4gPiArCXJldHVybiB0cnVlOw0KPiA+ICt9DQo+ID4gKw0KPiA+ICsvKiByZXZlcnNl ZCwgOC1iaXQsIHBvbHk9MHgwNyAqLw0KPiA+ICtzdGF0aWMgY29uc3QgdWludDhfdCBjcmNfdGFi bGVbMjU2XSA9IHsNCj4gPiArCTB4MDAsIDB4OTEsIDB4ZTMsIDB4NzIsIDB4MDcsIDB4OTYsIDB4 ZTQsIDB4NzUsDQo+ID4gKwkweDBlLCAweDlmLCAweGVkLCAweDdjLCAweDA5LCAweDk4LCAweGVh LCAweDdiLA0KPiA+ICsJMHgxYywgMHg4ZCwgMHhmZiwgMHg2ZSwgMHgxYiwgMHg4YSwgMHhmOCwg MHg2OSwNCj4gPiArCTB4MTIsIDB4ODMsIDB4ZjEsIDB4NjAsIDB4MTUsIDB4ODQsIDB4ZjYsIDB4 NjcsDQo+ID4gKw0KPiA+ICsJMHgzOCwgMHhhOSwgMHhkYiwgMHg0YSwgMHgzZiwgMHhhZSwgMHhk YywgMHg0ZCwNCj4gPiArCTB4MzYsIDB4YTcsIDB4ZDUsIDB4NDQsIDB4MzEsIDB4YTAsIDB4ZDIs IDB4NDMsDQo+ID4gKwkweDI0LCAweGI1LCAweGM3LCAweDU2LCAweDIzLCAweGIyLCAweGMwLCAw eDUxLA0KPiA+ICsJMHgyYSwgMHhiYiwgMHhjOSwgMHg1OCwgMHgyZCwgMHhiYywgMHhjZSwgMHg1 ZiwNCj4gPiArDQo+ID4gKwkweDcwLCAweGUxLCAweDkzLCAweDAyLCAweDc3LCAweGU2LCAweDk0 LCAweDA1LA0KPiA+ICsJMHg3ZSwgMHhlZiwgMHg5ZCwgMHgwYywgMHg3OSwgMHhlOCwgMHg5YSwg MHgwYiwNCj4gPiArCTB4NmMsIDB4ZmQsIDB4OGYsIDB4MWUsIDB4NmIsIDB4ZmEsIDB4ODgsIDB4 MTksDQo+ID4gKwkweDYyLCAweGYzLCAweDgxLCAweDEwLCAweDY1LCAweGY0LCAweDg2LCAweDE3 LA0KPiA+ICsNCj4gPiArCTB4NDgsIDB4ZDksIDB4YWIsIDB4M2EsIDB4NGYsIDB4ZGUsIDB4YWMs IDB4M2QsDQo+ID4gKwkweDQ2LCAweGQ3LCAweGE1LCAweDM0LCAweDQxLCAweGQwLCAweGEyLCAw eDMzLA0KPiA+ICsJMHg1NCwgMHhjNSwgMHhiNywgMHgyNiwgMHg1MywgMHhjMiwgMHhiMCwgMHgy MSwNCj4gPiArCTB4NWEsIDB4Y2IsIDB4YjksIDB4MjgsIDB4NWQsIDB4Y2MsIDB4YmUsIDB4MmYs DQo+ID4gKw0KPiA+ICsJMHhlMCwgMHg3MSwgMHgwMywgMHg5MiwgMHhlNywgMHg3NiwgMHgwNCwg MHg5NSwNCj4gPiArCTB4ZWUsIDB4N2YsIDB4MGQsIDB4OWMsIDB4ZTksIDB4NzgsIDB4MGEsIDB4 OWIsDQo+ID4gKwkweGZjLCAweDZkLCAweDFmLCAweDhlLCAweGZiLCAweDZhLCAweDE4LCAweDg5 LA0KPiA+ICsJMHhmMiwgMHg2MywgMHgxMSwgMHg4MCwgMHhmNSwgMHg2NCwgMHgxNiwgMHg4NywN Cj4gPiArDQo+ID4gKwkweGQ4LCAweDQ5LCAweDNiLCAweGFhLCAweGRmLCAweDRlLCAweDNjLCAw eGFkLA0KPiA+ICsJMHhkNiwgMHg0NywgMHgzNSwgMHhhNCwgMHhkMSwgMHg0MCwgMHgzMiwgMHhh MywNCj4gPiArCTB4YzQsIDB4NTUsIDB4MjcsIDB4YjYsIDB4YzMsIDB4NTIsIDB4MjAsIDB4YjEs DQo+ID4gKwkweGNhLCAweDViLCAweDI5LCAweGI4LCAweGNkLCAweDVjLCAweDJlLCAweGJmLA0K PiA+ICsNCj4gPiArCTB4OTAsIDB4MDEsIDB4NzMsIDB4ZTIsIDB4OTcsIDB4MDYsIDB4NzQsIDB4 ZTUsDQo+ID4gKwkweDllLCAweDBmLCAweDdkLCAweGVjLCAweDk5LCAweDA4LCAweDdhLCAweGVi LA0KPiA+ICsJMHg4YywgMHgxZCwgMHg2ZiwgMHhmZSwgMHg4YiwgMHgxYSwgMHg2OCwgMHhmOSwN Cj4gPiArCTB4ODIsIDB4MTMsIDB4NjEsIDB4ZjAsIDB4ODUsIDB4MTQsIDB4NjYsIDB4ZjcsDQo+ ID4gKw0KPiA+ICsJMHhhOCwgMHgzOSwgMHg0YiwgMHhkYSwgMHhhZiwgMHgzZSwgMHg0YywgMHhk ZCwNCj4gPiArCTB4YTYsIDB4MzcsIDB4NDUsIDB4ZDQsIDB4YTEsIDB4MzAsIDB4NDIsIDB4ZDMs DQo+ID4gKwkweGI0LCAweDI1LCAweDU3LCAweGM2LCAweGIzLCAweDIyLCAweDUwLCAweGMxLA0K PiA+ICsJMHhiYSwgMHgyYiwgMHg1OSwgMHhjOCwgMHhiZCwgMHgyYywgMHg1ZSwgMHhjZg0KPiA+ ICt9Ow0KPiA+ICsNCj4gPiArdWludDhfdCBtZXNoX2NyeXB0b19jb21wdXRlX2Zjcyhjb25zdCB1 aW50OF90ICpwYWNrZXQsIHVpbnQ4X3QgcGFja2V0X2xlbikNCj4gPiArew0KPiA+ICsJdWludDhf dCBmY3MgPSAweGZmOw0KPiA+ICsJaW50IGk7DQo+ID4gKw0KPiA+ICsJZm9yIChpID0gMDsgaSA8 IHBhY2tldF9sZW47IGkrKykNCj4gPiArCQlmY3MgPSBjcmNfdGFibGVbZmNzIF4gcGFja2V0W2ld XTsNCj4gPiArDQo+ID4gKwlyZXR1cm4gMHhmZiAtIGZjczsNCj4gPiArfQ0KPiA+ICsNCj4gPiAr Ym9vbCBtZXNoX2NyeXB0b19jaGVja19mY3MoY29uc3QgdWludDhfdCAqcGFja2V0LCB1aW50OF90 IHBhY2tldF9sZW4sDQo+ID4gKwkJCQkJCQl1aW50OF90IHJlY2VpdmVkX2ZjcykNCj4gPiArew0K PiA+ICsJdWludDhfdCBmY3MgPSAweGZmOw0KPiA+ICsJaW50IGk7DQo+ID4gKw0KPiA+ICsJZm9y IChpID0gMDsgaSA8IHBhY2tldF9sZW47IGkrKykNCj4gPiArCQlmY3MgPSBjcmNfdGFibGVbZmNz IF4gcGFja2V0W2ldXTsNCj4gPiArDQo+ID4gKwlmY3MgPSBjcmNfdGFibGVbZmNzIF4gcmVjZWl2 ZWRfZmNzXTsNCj4gPiArDQo+ID4gKwlpZiAoZmNzICE9IDB4Y2YpDQo+ID4gKwkJbF9lcnJvcigi SU9UIFdhcm5pbmchIENSQyAlMi4yeCAhPSAweGNmIiwgZmNzKTsNCj4gDQo+IFRoaXMgb25lIGlz IGJhZCBhcyB3ZWxsLiBUaGUgY2FsbGVyIGNhbiBwcmludCBhbiBlcnJvciBpZiBjaG9zZW4uDQo+ IA0KPiBSZWdhcmRzDQo+IA0KPiBNYXJjZWwNCj4g