From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S261590AbVG1QDe (ORCPT ); Thu, 28 Jul 2005 12:03:34 -0400 Received: (majordomo@vger.kernel.org) by vger.kernel.org id S261556AbVG1Ps4 (ORCPT ); Thu, 28 Jul 2005 11:48:56 -0400 Received: from ecfrec.frec.bull.fr ([129.183.4.8]:49900 "EHLO ecfrec.frec.bull.fr") by vger.kernel.org with ESMTP id S261578AbVG1Prp (ORCPT ); Thu, 28 Jul 2005 11:47:45 -0400 Subject: [PATCH 3/5] Add support for LIO completion notification From: =?ISO-8859-1?Q?S=E9bastien_Dugu=E9?= To: "linux-aio kvack.org" , "linux-kernel@vger.kernel.org" Date: Thu, 28 Jul 2005 17:46:35 +0200 Message-Id: <1122565595.2019.82.camel@frecb000686> Mime-Version: 1.0 X-Mailer: Evolution 2.0.3 X-MIMETrack: Itemize by SMTP Server on ECN002/FR/BULL(Release 5.0.12 |February 13, 2003) at 28/07/2005 17:59:49, Serialize by Router on ECN002/FR/BULL(Release 5.0.12 |February 13, 2003) at 28/07/2005 17:59:51 Content-Type: multipart/mixed; boundary="=-nUaI8sQYQYCJjLDz6Q66" Sender: linux-kernel-owner@vger.kernel.org X-Mailing-List: linux-kernel@vger.kernel.org --=-nUaI8sQYQYCJjLDz6Q66 Content-Transfer-Encoding: 7bit Content-Type: text/plain --=-nUaI8sQYQYCJjLDz6Q66 Content-Disposition: attachment; filename=lioevent Content-Type: application/octet-stream; name=lioevent Content-Transfer-Encoding: base64 bGlvZXZlbnQ6CgogVGhpcyBwYXRjaCBhZGRzIFBPU0lYIGxpc3RpbyBjb21wbGV0aW9uIG5vdGlm aWNhdGlvbiBldmVudC4gVGhpcyB3b3JrcyBieQphZGRpbmcgYW4gSU9DQl9DTURfRVZFTlQgY29t bWFuZC4KCiBBcyBwYXJ0IG9mIGxpc3RpbyBzdWJtaXNzaW9uLCB0aGUgdXNlciBtYXkgY2hvb3Nl IHRvIGNyZWF0ZSBhbiBlbXB0eSBhaW9jYgp3aXRoIGFuIGFpb19saW9fb3Bjb2RlIG9mIElPQ0Jf Q01EX0VWRU5UIGFuZCBmaWxsaW5nIG9ubHkgdGhlIGFpb19zaWdldmVudCBmaWVsZHMuCgogVXBv biBsaXN0IGNvbXBsZXRpb24sIHRoZSBrZXJuZWwgbm90aWZpZXMgdGhlIGFwcGxpY2F0aW9uIHVz aW5nIHRob3NlIHNpZ2V2ZW50CnBhcmFtZXRlcnMuCgoKIE1ha2VmaWxlICAgICAgICAgICAgICAg IHwgICAgMgogZnMvYWlvLmMgICAgICAgICAgICAgICAgfCAgMTU1ICsrKysrKysrKysrKysrKysr KysrKysrKysrKysrKysrKysrKysrKysrKysrKystLQogaW5jbHVkZS9saW51eC9haW8uaCAgICAg fCAgIDE0ICsrKy0KIGluY2x1ZGUvbGludXgvYWlvX2FiaS5oIHwgICAgMQogNCBmaWxlcyBjaGFu Z2VkLCAxNjQgaW5zZXJ0aW9ucygrKSwgOCBkZWxldGlvbnMoLSkKClNpZ25lZC1vZmYtYnk6IFPp YmFzdGllbiBEdWd16SA8c2ViYXN0aWVuLmR1Z3VlQGJ1bGwubmV0PgoKSW5kZXg6IGxpbnV4LTIu Ni4xMi9mcy9haW8uYwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBsaW51eC0yLjYuMTIub3JpZy9mcy9haW8uYwky MDA1LTA3LTA4IDE0OjM4OjM5LjAwMDAwMDAwMCArMDIwMAorKysgbGludXgtMi42LjEyL2ZzL2Fp by5jCTIwMDUtMDctMjEgMTE6NDM6MTcuMDAwMDAwMDAwICswMjAwCkBAIC00MTAsNiArNDEwLDcg QEAKIAlyZXEtPmtpX3NpZ25vID0gMDsKIAlyZXEtPmtpX25vdGlmeSA9IDA7CiAJcmVxLT5raV92 YWx1ZSA9IDA7CisJcmVxLT5raV9saW9fZXZlbnQgPSBOVUxMOwogCXJlcS0+cHJpdmF0ZSA9IE5V TEw7CiAJSU5JVF9MSVNUX0hFQUQoJnJlcS0+a2lfcnVuX2xpc3QpOwogCkBAIC05NTMsNiArOTU0 LDEwMSBAQAogCXJlYWRfdW5sb2NrKCZ0YXNrbGlzdF9sb2NrKTsKIH0KIAorc3RhdGljIGlubGlu ZSB2b2lkIGNoZWNrX2xpbyhzdHJ1Y3Qga2lvY3R4ICpjdHgsIAorCQkJICAgICBzdHJ1Y3QgbGlv X2V2ZW50ICpsaW8pCit7CisJaW50IHJldDsKKworCWlmIChsaW8gPT0gTlVMTCkKKwkJcmV0dXJu OworCisJcmV0ID0gYXRvbWljX2RlY19hbmRfdGVzdCgmKGxpby0+bGlvX3VzZXJzKSk7CisKKwlp ZiAobGlvLT5saW9fc2lnbm8pIHsKKworCQlpZiAobGlrZWx5KHJldCkpIHsKKworCQkJLyogbGFz dCBvbmUgLT4gbm90aWZ5IHByb2Nlc3MgKi8KKwkJCV9fYWlvX3NlbmRfc2lnbmFsKGxpby0+bGlv X3BpZCwgCisJCQkJCSAgbGlvLT5saW9fc2lnbm8sIAorCQkJCSAgCSAgbGlvLT5saW9fbm90aWZ5 LAorCQkJCQkgICh2b2lkKikodW5zaWduZWQgbG9uZylsaW8tPmxpb192YWx1ZSk7CisKKwkJCS8q IGZyZWUgbWVtb3J5ICovCisKKwkJCWtmcmVlKGxpbyk7CisJCX0KKworCX0KK30KKworc3RhdGlj IGludCBjcmVhdGVfbGlvX2V2ZW50KHN0cnVjdCBraW9jdHggKmN0eCxzdHJ1Y3QgbGlvX2V2ZW50 ICoqbGlvLAorCQkJICAgIHBpZF90IHBpZCwgaW50IHNpZ25vLCB2b2lkICp2YWx1ZSkKK3sKKwlp bnQgbm90aWZ5OworCisJaWYgKHBpZCA9PSAwKSB7CisJCS8qIG5vdGlmeSBpdHNlbGYgKi8KKwor CQlwaWQgPSBjdXJyZW50LT5waWQ7CisJCW5vdGlmeSA9IElPX05PVElGWV9TSUdOQUw7CisJfSBl bHNlIHsKKwkJcGlkX3QgZ3JvdXBfaWQ7CisJCXRhc2tfdCAqcHRhc2s7CisKKwkJLyogbm90aWZ5 IGdpdmVuIHRocmVhZCAqLworCisJCS8qIGNhbGxlciB0aHJlYWQgYW5kIHRhcmdldCB0aHJlYWQg bXVzdCBiZSBpbiBzYW1lCisJCSAqIHRocmVhZCBncm91cAorCQkgKi8KKworCQlyZWFkX2xvY2so JnRhc2tsaXN0X2xvY2spOworCQlwdGFzayA9IGZpbmRfdGFza19ieV9waWQocGlkKTsKKworCQlp ZiAodW5saWtlbHkgKHB0YXNrID09IE5VTEwpKSB7CisJCQlyZWFkX3VubG9jaygmdGFza2xpc3Rf bG9jayk7CisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCisJCWdyb3VwX2lkID0gcHRhc2stPnRn aWQ7CisJCXJlYWRfdW5sb2NrKCZ0YXNrbGlzdF9sb2NrKTsKKworCQlpZiAoZ3JvdXBfaWQgIT0g Y3VycmVudC0+dGdpZCkKKwkJCXJldHVybiAtRUlOVkFMOworCisJCW5vdGlmeSA9IElPX05PVElG WV9USFJFQURfSUQ7CisJfQorCisJLyogd2UgYnJlYWsgYW4gZXhpc3Rpbmcgc2VxdWVuY2UgKGxp byBleGlzdHMpCisJICogY2xvc2UgdGhlIHNlcXVlbmNlCisJICovCisKKwljaGVja19saW8oY3R4 LCAqbGlvKTsKKworCWlmIChzaWdubyA9PSAwKSB7CisKKwkJLyogaXQgbWVhbnMgd2UgZG9uJ3Qg d2FudCB0byBtb25pdG9yIGZvbGxvd2luZyBjb21tYW5kcworCQkgKiB1c2VmdWxsIHRvIGJyZWFr IGN1cnJlbnQgc2VxdWVuY2UKKwkJICovCisJCSpsaW8gPSBOVUxMOworCisJCXJldHVybiAwOwor CX0KKworCisJKmxpbyA9IGttYWxsb2Moc2l6ZW9mKCpsaW8pLCBHRlBfS0VSTkVMKTsKKwlpZiAo ISpsaW8pCisJCXJldHVybiAtRUFHQUlOOworCisJYXRvbWljX3NldCgmKCgqbGlvKS0+bGlvX3Vz ZXJzKSwgMSk7CisJKCpsaW8pLT5saW9fcGlkID0gcGlkOworCSgqbGlvKS0+bGlvX3NpZ25vID0g c2lnbm87CisJKCpsaW8pLT5saW9fbm90aWZ5ID0gbm90aWZ5OworCSgqbGlvKS0+bGlvX3ZhbHVl ID0gKF9fdTY0KSh1bnNpZ25lZCBsb25nKXZhbHVlOworCisJcmV0dXJuIDA7Cit9CisKIHN0YXRp YyB2b2lkIF9fYWlvX3dyaXRlX2V2dChzdHJ1Y3Qga2lvY3R4ICpjdHgsIHN0cnVjdCBpb19ldmVu dCAqZXZlbnQpCiB7CiAJc3RydWN0IGFpb19yaW5nX2luZm8JKmluZm87CkBAIC0xMDU3LDYgKzEx NTMsOCBAQAogCQlfX2Fpb19zZW5kX3NpZ25hbChpb2NiLT5raV9waWQsIGlvY2ItPmtpX3NpZ25v LCBpb2NiLT5raV9ub3RpZnksCiAJCQkJICAodm9pZCopKHVuc2lnbmVkIGxvbmcpaW9jYi0+a2lf dmFsdWUpOwogCisJY2hlY2tfbGlvKGN0eCwgaW9jYi0+a2lfbGlvX2V2ZW50KTsKKwogCXByX2Rl YnVnKCIlbGQgcmV0cmllczogJWQgb2YgJWRcbiIsIGlvY2ItPmtpX3JldHJpZWQsCiAJCWlvY2It PmtpX25ieXRlcyAtIGlvY2ItPmtpX2xlZnQsIGlvY2ItPmtpX25ieXRlcyk7CiBwdXRfcnE6CkBA IC0xNDQwLDYgKzE1MzgsNyBAQAogCiAJaWYgKGZpbGUtPmZfb3AtPmFpb19mc3luYykKIAkJcmV0 ID0gZmlsZS0+Zl9vcC0+YWlvX2ZzeW5jKGlvY2IsIDApOworCiAJcmV0dXJuIHJldDsKIH0KIApA QCAtMTUyOCw3ICsxNjI3LDcgQEAKIH0KIAogaW50IGZhc3RjYWxsIGlvX3N1Ym1pdF9vbmUoc3Ry dWN0IGtpb2N0eCAqY3R4LCBzdHJ1Y3QgaW9jYiBfX3VzZXIgKnVzZXJfaW9jYiwKLQkJCSBzdHJ1 Y3QgaW9jYiAqaW9jYikKKwkJCSBzdHJ1Y3QgaW9jYiAqaW9jYiwgc3RydWN0IGxpb19ldmVudCAq bGlvKQogewogCXN0cnVjdCBraW9jYiAqcmVxOwogCXN0cnVjdCBmaWxlICpmaWxlOwpAQCAtMTY1 MCw2ICsxNzQ5LDcgQEAKIAkJcmVxLT5raV9ub3RpZnkgPSBub3RpZnk7CiAJCXJlcS0+a2lfdmFs dWUgPSBhaW9fdmFsdWU7CiAJfQorCXJlcS0+a2lfbGlvX2V2ZW50ID0gbGlvOwogCiAJcmVxLT5r aV9idWYgPSAoY2hhciBfX3VzZXIgKikodW5zaWduZWQgbG9uZylpb2NiLT5haW9fYnVmOwogCXJl cS0+a2lfbGVmdCA9IHJlcS0+a2lfbmJ5dGVzID0gaW9jYi0+YWlvX25ieXRlczsKQEAgLTE2OTcs NiArMTc5Nyw3IEBACiBhc21saW5rYWdlIGxvbmcgc3lzX2lvX3N1Ym1pdChhaW9fY29udGV4dF90 IGN0eF9pZCwgbG9uZyBuciwKIAkJCSAgICAgIHN0cnVjdCBpb2NiIF9fdXNlciAqIF9fdXNlciAq aW9jYnBwKQogeworCXN0cnVjdCBsaW9fZXZlbnQgKmxpbzsKIAlzdHJ1Y3Qga2lvY3R4ICpjdHg7 CiAJbG9uZyByZXQgPSAwOwogCWludCBpOwpAQCAtMTcxNywxMyArMTgxOCwxNSBAQAogCSAqIEFL UE06IHNob3VsZCB0aGlzIHJldHVybiBhIHBhcnRpYWwgcmVzdWx0IGlmIHNvbWUgb2YgdGhlIElP cyB3ZXJlCiAJICogc3VjY2Vzc2Z1bGx5IHN1Ym1pdHRlZD8KIAkgKi8KKworCWxpbyA9IE5VTEw7 CiAJZm9yIChpPTA7IGk8bnI7IGkrKykgewogCQlzdHJ1Y3QgaW9jYiBfX3VzZXIgKnVzZXJfaW9j YjsKIAkJc3RydWN0IGlvY2IgdG1wOwogCQlzdHJ1Y3Qgc2lnZXZlbnQgX191c2VyICp1c2VyX2V2 ZW50ID0gTlVMTDsKIAkJaW50IGFpb19waWQgPSAwOwogCQlpbnQgYWlvX3NpZ25vID0gMDsKLQkJ CisJCWludCBhaW9fdmFsdWUgPSAwOwogCiAJCWlmICh1bmxpa2VseShfX2dldF91c2VyKHVzZXJf aW9jYiwgaW9jYnBwICsgaSkpKSB7CiAJCQlyZXQgPSAtRUZBVUxUOwpAQCAtMTc3MSwxMiArMTg3 NCw1NCBAQAogCQkJCXJldCA9IC1FRkFVTFQ7CiAJCQkJYnJlYWs7CiAJCQl9CisKKwkJCWlmICh1 bmxpa2VseShfX2dldF91c2VyKGFpb192YWx1ZSwKKwkJCQkJCSZ1c2VyX2V2ZW50LT5zaWdldl92 YWx1ZS5zaXZhbF9pbnQpKSkgeworCQkJCXJldCA9IC1FRkFVTFQ7CisJCQkJYnJlYWs7CisJCQl9 CiAJCX0KIAotCQlyZXQgPSBpb19zdWJtaXRfb25lKGN0eCwgdXNlcl9pb2NiLCAmdG1wKTsKLQkJ aWYgKHJldCkKLQkJCWJyZWFrOworCQlpZiAodG1wLmFpb19saW9fb3Bjb2RlID09IElPQ0JfQ01E X0VWRU5UKSB7CisKKwkJCS8qIHRoaXMgY29tbWFuZCBtZWFucyB0aGF0IGFsbCBmb2xsb3dpbmcg SU8gY29tbWFuZHMKKwkJCSAqIGFyZSBpbiB0aGUgc2FtZSBncm91cCBhbmQgd2hlbiB0aGUgZ3Jv dXAgYmVjb21lcworCQkJICogZW1wdHkgKGFsbCByZXF1ZXN0cyBoYXZlIGJlZW4gcHJvY2Vzc2Vk KQorCQkJICogd2UgbXVzdCBzZW5kIGEgc2lnbmFsIHRvIGEgZ2l2ZW4gcHJvY2VzcyBvciB0aHJl YWQKKwkJCSAqLworCisJCQlyZXQgPSBjcmVhdGVfbGlvX2V2ZW50KGN0eCwgJmxpbywKKwkJCQkJ ICAgICAgIGFpb19waWQsIGFpb19zaWdubywKKwkJCQkJICAgICAgICh2b2lkICopYWlvX3ZhbHVl KTsKKwkJCWlmIChyZXQpCisJCQkJYnJlYWs7CisKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYg KGxpbyAmJiAoKHRtcC5haW9fbGlvX29wY29kZSA9PSBJT0NCX0NNRF9QUkVBRCkgfHwKKwkJCSAg ICh0bXAuYWlvX2xpb19vcGNvZGUgPT0gSU9DQl9DTURfUFdSSVRFKSkgKSB7CisKKwkJCWF0b21p Y19pbmMoJmxpby0+bGlvX3VzZXJzKTsKKwkJCXJldCA9IGlvX3N1Ym1pdF9vbmUoY3R4LCB1c2Vy X2lvY2IsICZ0bXAsIGxpbyk7CisKKwkJCS8qCisJCQkgKiBJZiBhIHJlcXVlc3QgZmFpbGVkLCBq dXN0IGRlY3JlbWVudCB0aGUgdXNlcnMgY291bnQsCisJCQkgKiBidXQgZ28gb24gc3VibWl0dGlu ZyBzdWJzZXF1ZW50IHJlcXVlc3RzLgorCQkJICoKKwkJCSAqLworCQkJaWYgKHJldCkKKwkJCQlh dG9taWNfZGVjKCZsaW8tPmxpb191c2Vycyk7CisKKwkJCWNvbnRpbnVlOworCisJCX0gZWxzZSB7 CisJCQlyZXQgPSBpb19zdWJtaXRfb25lKGN0eCwgdXNlcl9pb2NiLCAmdG1wLCBOVUxMKTsKKwkJ CWlmIChyZXQpCisJCQkJYnJlYWs7CisJCX0KIAl9CisJY2hlY2tfbGlvKGN0eCwgbGlvKTsKIAog CXB1dF9pb2N0eChjdHgpOwogCXJldHVybiBpID8gaSA6IHJldDsKSW5kZXg6IGxpbnV4LTIuNi4x Mi9pbmNsdWRlL2xpbnV4L2Fpb19hYmkuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBsaW51eC0yLjYuMTIub3Jp Zy9pbmNsdWRlL2xpbnV4L2Fpb19hYmkuaAkyMDA1LTA3LTA4IDE0OjM4OjM5LjAwMDAwMDAwMCAr MDIwMAorKysgbGludXgtMi42LjEyL2luY2x1ZGUvbGludXgvYWlvX2FiaS5oCTIwMDUtMDctMjEg MTE6NDI6NTYuMDAwMDAwMDAwICswMjAwCkBAIC00MSw2ICs0MSw3IEBACiAJICogSU9DQl9DTURf UE9MTCA9IDUsCiAJICovCiAJSU9DQl9DTURfTk9PUCA9IDYsCisJSU9DQl9DTURfRVZFTlQgPSA3 LAogfTsKIAogLyogcmVhZCgpIGZyb20gL2Rldi9haW8gcmV0dXJucyB0aGVzZSBzdHJ1Y3R1cmVz LiAqLwpJbmRleDogbGludXgtMi42LjEyL2luY2x1ZGUvbGludXgvYWlvLmgKPT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot LS0gbGludXgtMi42LjEyLm9yaWcvaW5jbHVkZS9saW51eC9haW8uaAkyMDA1LTA3LTA4IDE0OjM4 OjM5LjAwMDAwMDAwMCArMDIwMAorKysgbGludXgtMi42LjEyL2luY2x1ZGUvbGludXgvYWlvLmgJ MjAwNS0wNy0yMSAxMTozMDowMi4wMDAwMDAwMDAgKzAyMDAKQEAgLTQ4LDYgKzQ4LDE0IEBACiAj ZGVmaW5lIGtpb2NiSXNLaWNrZWQoaW9jYikJdGVzdF9iaXQoS0lGX0tJQ0tFRCwgJihpb2NiKS0+ a2lfZmxhZ3MpCiAjZGVmaW5lIGtpb2NiSXNDYW5jZWxsZWQoaW9jYikJdGVzdF9iaXQoS0lGX0NB TkNFTExFRCwgJihpb2NiKS0+a2lfZmxhZ3MpCiAKK3N0cnVjdCBsaW9fZXZlbnQgeworCWF0b21p Y190CWxpb191c2VyczsKKwlfX3MzMgkJbGlvX3BpZDsKKwlfX3UxNgkJbGlvX3NpZ25vOworCV9f dTE2CQlsaW9fbm90aWZ5OworCV9fdTY0CQlsaW9fdmFsdWU7Cit9OworCiBzdHJ1Y3Qga2lvY2Ig ewogCXN0cnVjdCBsaXN0X2hlYWQJa2lfcnVuX2xpc3Q7CiAJbG9uZwkJCWtpX2ZsYWdzOwpAQCAt ODMsNiArOTEsNyBAQAogCV9fdTE2CQkJa2lfc2lnbm87CiAJX191MTYJCQlraV9ub3RpZnk7CiAJ X191NjQJCQlraV92YWx1ZTsKKwlzdHJ1Y3QgbGlvX2V2ZW50CSpraV9saW9fZXZlbnQ7CiAKIAl2 b2lkCQkJKnByaXZhdGU7CiB9OwpAQCAtMTc2LDEyICsxODUsMTMgQEAKIGV4dGVybiB2b2lkIEZB U1RDQUxMKGV4aXRfYWlvKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tKSk7CiBleHRlcm4gc3RydWN0IGtp b2N0eCAqbG9va3VwX2lvY3R4KHVuc2lnbmVkIGxvbmcgY3R4X2lkKTsKIGV4dGVybiBpbnQgRkFT VENBTEwoaW9fc3VibWl0X29uZShzdHJ1Y3Qga2lvY3R4ICpjdHgsCi0JCQlzdHJ1Y3QgaW9jYiBf X3VzZXIgKnVzZXJfaW9jYiwgc3RydWN0IGlvY2IgKmlvY2IpKTsKKwkJCXN0cnVjdCBpb2NiIF9f dXNlciAqdXNlcl9pb2NiLCBzdHJ1Y3QgaW9jYiAqaW9jYiwKKwkJCXN0cnVjdCBsaW9fZXZlbnQg KmxpbykpOwogCiAvKiBzZW1pIHByaXZhdGUsIGJ1dCB1c2VkIGJ5IHRoZSAzMmJpdCBlbXVsYXRp b25zOiAqLwogc3RydWN0IGtpb2N0eCAqbG9va3VwX2lvY3R4KHVuc2lnbmVkIGxvbmcgY3R4X2lk KTsKIGludCBGQVNUQ0FMTChpb19zdWJtaXRfb25lKHN0cnVjdCBraW9jdHggKmN0eCwgc3RydWN0 IGlvY2IgX191c2VyICp1c2VyX2lvY2IsCi0JCQkJICBzdHJ1Y3QgaW9jYiAqaW9jYikpOworCQkJ CSAgc3RydWN0IGlvY2IgKmlvY2IsIHN0cnVjdCBsaW9fZXZlbnQgKmxpbykpOwogCiAjZGVmaW5l IGdldF9pb2N0eChraW9jdHgpCWRvIHsgaWYgKHVubGlrZWx5KGF0b21pY19yZWFkKCYoa2lvY3R4 KS0+dXNlcnMpIDw9IDApKSBCVUcoKTsgYXRvbWljX2luYygmKGtpb2N0eCktPnVzZXJzKTsgfSB3 aGlsZSAoMCkKICNkZWZpbmUgcHV0X2lvY3R4KGtpb2N0eCkJZG8geyBpZiAodW5saWtlbHkoYXRv bWljX2RlY19hbmRfdGVzdCgmKGtpb2N0eCktPnVzZXJzKSkpIF9fcHV0X2lvY3R4KGtpb2N0eCk7 IGVsc2UgaWYgKHVubGlrZWx5KGF0b21pY19yZWFkKCYoa2lvY3R4KS0+dXNlcnMpIDwgMCkpIEJV RygpOyB9IHdoaWxlICgwKQpJbmRleDogbGludXgtMi42LjEyL01ha2VmaWxlCj09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K LS0tIGxpbnV4LTIuNi4xMi5vcmlnL01ha2VmaWxlCTIwMDUtMDctMDggMTQ6Mzg6MzkuMDAwMDAw MDAwICswMjAwCisrKyBsaW51eC0yLjYuMTIvTWFrZWZpbGUJMjAwNS0wNy0yMSAxMTo0Mjo1Ni4w MDAwMDAwMDAgKzAyMDAKQEAgLTEsNyArMSw3IEBACiBWRVJTSU9OID0gMgogUEFUQ0hMRVZFTCA9 IDYKIFNVQkxFVkVMID0gMTIKLUVYVFJBVkVSU0lPTiA9IC5QQUlPLWFpb2V2ZW50CitFWFRSQVZF UlNJT04gPSAuUEFJTy1saW9ldmVudAogTkFNRT1Xb296eSBOdW1iYXQKIAogIyAqRE9DVU1FTlRB VElPTioK --=-nUaI8sQYQYCJjLDz6Q66--