[PATCH] linux epoll support
[email protected] (Rusty Conover) Sun, 11 Sep 2005 20:01:06 -0600
| Newsgroups | perl.loop |
|---|---|
| Organization | InfoGears Inc. |
| Message-ID | <[email protected]> |
--------------030406070300070003010305 Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit Hi All, I've hacked together a patch to Event-1.06 to add epoll support on Linux. Its enabled by adding -DHAS_EPOLL. I've turned on that switch by default in the attached patch. I've tested it on Fedora Core 3 with kernel 2.6.11-1.14_FC3. I thought about using libevent, but it turned out to be too hard to intermingle the event loops. I'm interested in any feedback that anyone has. Especially any follow up assistance with properly detecting if epoll is available on the system and enabling it by default. Do you think this code is suitable with putting into the main module? Here is a benchmark run with the epoll code enabled on a 1Ghz Intel Pentium 3: benchmark: 0.08 Event: 1.06 perl 5.008007 uname=Linux synthesis.labs.infogears.com 2.6.11-1.14_FC3 #1 Thu Apr 7 19:23:49 EDT 2005 i686 i686 i386 GNU/Linux cc='cc', optimize='-O2' ccflags='-fno-strict-aliasing -pipe -I/usr/local/include -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -I/usr/include/gdbm' Elapse Time: 99.94% of 11 seconds Timer/sec: 98.43% (803 total) Io/sec: 55665.822 (611936 total) Signals/sec 1.91 Events/sec 59219.892 Null/sec 547318 Event/Null 10.82% Thanks, Rusty -- Rusty Conover InfoGears Inc. http://www.infogears.com 406-587-5432 --------------030406070300070003010305 Content-Type: text/plain; name="epoll.diff" Content-Transfer-Encoding: base64 Content-Disposition: inline; filename="epoll.diff" ZGlmZiAtdXIgRXZlbnQtMS4wNi9jL3VuaXguYyAvaG9tZS9yY29ub3Zlci9FdmVudC0xLjA2 L2MvdW5peC5jCi0tLSBFdmVudC0xLjA2L2MvdW5peC5jCTIwMDUtMDktMTEgMTQ6MTA6Mzgu MDAwMDAwMDAwIC0wNjAwCisrKyAvaG9tZS9yY29ub3Zlci9FdmVudC0xLjA2L2MvdW5peC5j CTIwMDUtMDktMTEgMTk6Mzg6NDguMDAwMDAwMDAwIC0wNjAwCkBAIC0xLDMgKzEsMjA4IEBA CisjaWYgZGVmaW5lZChIQVNfRVBPTEwpCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNp bmNsdWRlIDxzeXMvcmVzb3VyY2UuaD4KKyNpbmNsdWRlIDxzeXMvcXVldWUuaD4KKyNpbmNs dWRlIDxzeXMvZXBvbGwuaD4KKworc3RydWN0IGVwb2xsb3AgeworCS8qIHdhdGNoZXIgcG9p bnRlcnMgKi8KKwlwZV9pbyAqKmZkczsKKwlpbnQgbmZkczsKKwlzdHJ1Y3QgZXBvbGxfZXZl bnQgKmV2ZW50czsKKwlpbnQgbmV2ZW50czsKKwlpbnQgZXBmZDsKK307CisKK3N0cnVjdCBl cG9sbG9wIGVwb2xsb3A7CisKKworI2VuZGlmIC8qIEhBU19FUE9MTCAqLworCisvKiBRdWV1 ZSBzb21lIElPIGJhY2sgaW50byB0aGUgY2FsbGJhY2sgc3lzdGVtIGZvciBzb21lIGJpdHMg Ki8KK3N0YXRpYyB2b2lkIF9xdWV1ZV9pbyhwZV9pbyAqd2EsIGludCBnb3QpIHsKKyAgICBw ZV9pb2V2ZW50ICpldjsKKyAgICBnb3QgJj0gd2EtPnBvbGw7CisgICAgaWYgKCFnb3QpIHsK KwlpZiAoV2FERUJVR3god2EpID49IDMpIHsKKwkgICAgU1RSTEVOIG5fYTsKKwkgICAgd2Fy bigiRXZlbnQ6IGlvICclcycgcXVldWVkIG5vdGhpbmciLCBTdlBWKHdhLT5iYXNlLmRlc2Ms IG5fYSkpOworCX0KKwlyZXR1cm47CisgICAgfQorICAgIGV2ID0gKHBlX2lvZXZlbnQqKSAo KndhLT5iYXNlLnZ0YmwtPm5ld19ldmVudCkoKHBlX3dhdGNoZXIqKSB3YSk7CisgICAgKytl di0+YmFzZS5oaXRzOworICAgIGV2LT5nb3QgfD0gZ290OyAgICAKKyAgICBxdWV1ZUV2ZW50 KChwZV9ldmVudCopIGV2KTsKK30KKworc3RhdGljIHZvaWQgYm9vdF9lcG9sbCgpIHsKKyNp ZiBkZWZpbmVkKEhBU19FUE9MTCkKKwlzdHJ1Y3QgcmxpbWl0IHJsOworCWludCBlcGZkLCBu ZmlsZXM7CisKKwkvKiBHZXQgdGhlIHRvdGFsIG51bWJlciBvZiBkZXNjcmlwdG9ycyBhYmxl IHRvIGJlIG9wZW5lZCBpbiB0aGlzIHByb2Nlc3MKKwkgICBhbmQgYWxsb2NhdGUgZW5vdWdo IHNsb3RzIHRvIGhhbmRsZSBhbGwgb2YgdGhlbSAqLworCWlmIChnZXRybGltaXQoUkxJTUlU X05PRklMRSwgJnJsKSA9PSAwKSB7CisJCWlmKHJsLnJsaW1fY3VyICE9IFJMSU1fSU5GSU5J VFkpIHsKKwkJCW5maWxlcyA9IHJsLnJsaW1fY3VyOworCQl9IGVsc2UgeworCQkJLyogQW4g YXJiaXRyYXJ5IGxpbWl0IG9mIGRlc2NyaXB0b3JzICovCisJCQluZmlsZXMgPSA2NCoxMDI0 KjEwMjQ7CisJCX0KKwl9IGVsc2UgeworCQljcm9haygiRmFpbGVkIHRvIGdldCBvcGVuZWQg ZmlsZSBoYW5kbGUgbGltaXQiKTsKKwl9CisJCisJLyogSW5pdGFsaXplIHRoZSBrZXJuZWwg cXVldWUsIHdpdGggYW4gaW5pdGlhbCBzaXplIG9mCisJIGRlc2NyaXB0b3JzLCBkb24ndCBz aXplIHRvIHRoZSBtYXhpbXVtIGhlcmUsIHNpbmNlIHRoZSBrZXJuZWwKKwkgd2lsbCBhdXRv bWF0aWNhbGx5IHJlc2l6ZS4gKi8KKworCWlmICgoZXBmZCA9IGVwb2xsX2NyZWF0ZSgxMDAp KSA9PSAtMSkgeworCQljcm9haygiRmFpbGVkIHRvIGNyZWF0ZSBlcG9sbCB3aXRoICVkIGZp bGVzIiwgbmZpbGVzKTsKKwl9CisKKwkvKiBzZXQgdGhlIGNsb3NlIG9uIGV4ZWMgZmxhZyAq LworCWZjbnRsKGVwZmQsIEZfU0VURkQsIDEpOworCisJZXBvbGxvcC5lcGZkID0gZXBmZDsK KwkKKwkvKiBJbml0IGFuZCBhbGxvYyBmaWVsZHMgKi8KKwlFdk5ldyg5LCBlcG9sbG9wLmV2 ZW50cywgbmZpbGVzLCBzdHJ1Y3QgZXBvbGxfZXZlbnQpOworCWVwb2xsb3AubmV2ZW50cyA9 IG5maWxlczsKKworCUV2TmV3KDksIGVwb2xsb3AuZmRzLCBuZmlsZXMsIHBlX2lvICopOwor CWVwb2xsb3AubmZkcyA9IG5maWxlczsKKworI2VuZGlmIC8qSEFTX0VQT0xMKi8KK30KKwor CisKKworCisjaWYgZGVmaW5lZChIQVNfRVBPTEwpCisKK3N0YXRpYyB2b2lkIHBlX3N5c19z bGVlcChkb3VibGUgbGVmdCkgeworCWludCByZXQ7CisJZG91YmxlIHQwID0gTlZ0aW1lKCk7 CisJZG91YmxlIHQxID0gdDAgKyBsZWZ0OworCXdoaWxlICgxKSB7CisJCS8qIE5vIG5lZWQg dG8gY2FsbCBlcG9sbCBoZXJlIHdoZW4gcG9sbCB3aWxsIHdvcmsganVzdCBmaW5lICovCisJ CXJldCA9IHBvbGwoMCwgMCwgKGludCkgKGxlZnQgKiAxMDAwKSk7IC8qIGhvcGUgemVyb2Vz IG9rYXkgKi8KKwkJaWYgKHJldCA8IDAgJiYgZXJybm8gIT0gRUFHQUlOICYmIGVycm5vICE9 IEVJTlRSKQorCQkJY3JvYWsoInBvbGwoJS4yZikgZ290IGVycm5vICVkIiwgbGVmdCwgZXJy bm8pOworCQlsZWZ0ID0gdDEgLSBOVnRpbWUoKTsKKwkJaWYgKGxlZnQgPiBJbnRlcnZhbEVw c2lsb24pIHsKKwkJCWlmIChyZXQ9PTApICsrVGltZW91dFRvb0Vhcmx5OworCQkJY29udGlu dWU7CisJCX0KKwkJYnJlYWs7CisJfQorfQorCitzdGF0aWMgdm9pZCBwZV9zeXNfaW9fYWRk IChwZV9pbyAqZXYpIHsKKwlzdHJ1Y3Qgc3RhdCBidWY7CisJU1RSTEVOIG5fYTsJCisJaW50 IG9wID0gRVBPTExfQ1RMX0FERDsKKworCisJaWYgKGV2LT5mZCA8PSAwKSB7CisJCWNyb2Fr KCJwZV9zeXNfaW9fYWRkOiBub24tdmFsaWQgZmQgKCVkKSIsIGV2LT5mZCk7CisJCXJldHVy bjsKKwl9CisKKwlpZihldi0+cG9sbCAmIFBFX0UpIHsKKwkJZXBvbGxvcC5ldmVudHNbZXYt PmZkXS5ldmVudHMgfD0gRVBPTExQUkk7CisJfQorCQorCWlmKGV2LT5wb2xsICYgUEVfUikg eworCQllcG9sbG9wLmV2ZW50c1tldi0+ZmRdLmV2ZW50cyB8PSBFUE9MTElOIHwgRVBPTExQ UkkgfCBFUE9MTEVSUiB8IEVQT0xMSFVQOworCX0KKwlpZihldi0+cG9sbCAmIFBFX1cpIHsK KwkJZXBvbGxvcC5ldmVudHNbZXYtPmZkXS5ldmVudHMgfD0gRVBPTExPVVQgfCBFUE9MTEVS UjsKKwl9CisJCisJLyogSWYgdGhpcyBkZXNjcmlwdG9yIGlzIGFscmVhZHkgdXNlZCB3ZSBu ZWVkIHRvIG1vZGlmeSB0aGUgZmxhZ3MgKi8KKwlpZihlcG9sbG9wLmZkc1tldi0+ZmRdICE9 IE5VTEwpIHsKKwkJb3AgPSBFUE9MTF9DVExfTU9EOwkgICAgCisJfSAKKworCQorCWVwb2xs b3AuZXZlbnRzW2V2LT5mZF0uZGF0YS5wdHIgPSBldjsKKwkgICAgICAgIAorCWlmIChlcG9s bF9jdGwoZXBvbGxvcC5lcGZkLCBvcCwgZXYtPmZkLCAmZXBvbGxvcC5ldmVudHNbZXYtPmZk XSkgPT0gLTEpIHsJCQorCQkvKiBDaGVjayBpZiBpdHMgYSBiYWQgZGVzY3JpcHRvciAqLwor CQlpZiAoZXYtPmZkID49IDAgJiYgUGVybExJT19mc3RhdChldi0+ZmQsICZidWYpIDwgMCAm JiBlcnJubyA9PSBFQkFERikgeworCQkgICAgd2FybigiRXZlbnQ6ICclcycgd2FzIHVuZXhw ZWN0ZWRseSBjbG9zZWQiLAorCQkJIFN2UFYoZXYtPmJhc2UuZGVzYywgbl9hKSk7CisJCSAg ICBwZV9pb19yZXNldF9oYW5kbGUoKHBlX3dhdGNoZXIqKSBldik7CisJCSAgICByZXR1cm47 CisJCX0KKwkJY3JvYWsoIkZhaWxlZCB0byBjaGFuZ2UgdGhlIGVwb2xsIHNldHRpbmdzIHVu a25vd24gZXJyb3IiLCBldi0+ZmQpOworCX0KKworCS8qIFNhdmUgdGhlIHBvaW50ZXIgdG8g dGhlIGN1cnJlbnQgZXZlbnQgKi8KKwllcG9sbG9wLmZkc1tldi0+ZmRdID0gZXY7ICAgIAor CXJldHVybjsKK30KKworc3RhdGljIHZvaWQgcGVfc3lzX2lvX2RlbCAocGVfaW8gKmV2KSB7 CisJaWYoZXYtPmZkIDwgMCkgeworCQlyZXR1cm47CisJfQorCisJaWYgKGVwb2xsX2N0bChl cG9sbG9wLmVwZmQsIEVQT0xMX0NUTF9ERUwsIGV2LT5mZCwgJmVwb2xsb3AuZXZlbnRzW2V2 LT5mZF0pID09IC0xKQorCQljcm9haygiRmFpbGVkIHRvIGRlbGV0ZSBmcm9tIGVwb2xsIik7 CisKKwllcG9sbG9wLmZkc1tldi0+ZmRdID0gMDsKKwkKKwlyZXR1cm47Cit9CisKKworc3Rh dGljIHZvaWQgcGVfc3lzX211bHRpcGxleChkb3VibGUgdGltZW91dCkgeworCWludCBpLCBy ZXMsIHJlYWxfdGltZW91dDsKKwkKKwlpZih0aW1lb3V0IDw9IDApIHsKKwkJcmVhbF90aW1l b3V0ID0gMDsKKwl9IGVsc2UgeworCQlyZWFsX3RpbWVvdXQgPSB0aW1lb3V0ICogMTAwMDsK Kwl9CisKKwlyZXMgPSBlcG9sbF93YWl0KGVwb2xsb3AuZXBmZCwgZXBvbGxvcC5ldmVudHMs IGVwb2xsb3AubmV2ZW50cywgcmVhbF90aW1lb3V0KTsKKwkKKwlpZiAocmVzID09IC0xKSB7 CisJCXJldHVybjsKKwl9CisJCisJZm9yIChpID0gMDsgaSA8IHJlczsgaSsrKSB7CisJCWlu dCB3aGF0ID0gZXBvbGxvcC5ldmVudHNbaV0uZXZlbnRzOwkJCisJCXBlX2lvICp0aGlzX3dh dGNoZXIgPSAoc3RydWN0IHBlX2lvICopZXBvbGxvcC5ldmVudHNbaV0uZGF0YS5wdHI7Cisg ICAKKwkJLyogSW4gdGhlIGV2ZW50IG9mIGFuIGVycm9yIHNpZ25hbCBlaXRoZXIgdGhlIHJl YWQgb3IgdGhlIHdyaXRlIGNhbGxiYWNrICovCisgICAgICAgICAgICAgICAgaWYgKHdoYXQg JiBFUE9MTEhVUCB8fCB3aGF0ICYgRVBPTExFUlIpIHsKKyAgICAgICAgICAgICAgICAgICAg ICAgIHdoYXQgfD0gRVBPTExJTiB8IEVQT0xMT1VUOworCQl9CisKKwkJaWYgKHdoYXQgJiBF UE9MTElOKSB7CisJCQlfcXVldWVfaW8odGhpc193YXRjaGVyLCBQRV9SKTsKKwkJfQorCisJ CWlmICh3aGF0ICYgRVBPTExPVVQpIHsKKwkJCV9xdWV1ZV9pbyh0aGlzX3dhdGNoZXIsIFBF X1cpOworCQl9CisJfQorCXJldHVybjsKK30KKworI2VuZGlmIC8qIEhBU19FUE9MTCAqLwor CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqIEVQT0xMICovCisKKworCiAj aWYgZGVmaW5lZChIQVNfREVWUE9MTCkKICNpbmNsdWRlIDxzeXMvZGV2cG9sbC5oPgogICAg IHN0YXRpYyBpbnQgZHBmZD0wOwpAQCAtNTMsMjQgKzI1OCw5IEBACiAgICAgcmV0dXJuIC0x OwogfQogCi1zdGF0aWMgdm9pZCBfcXVldWVfaW8ocGVfaW8gKndhLCBpbnQgZ290KSB7Ci0g ICAgcGVfaW9ldmVudCAqZXY7Ci0gICAgZ290ICY9IHdhLT5wb2xsOwotICAgIGlmICghZ290 KSB7Ci0JaWYgKFdhREVCVUd4KHdhKSA+PSAzKSB7Ci0JICAgIFNUUkxFTiBuX2E7Ci0JICAg IHdhcm4oIkV2ZW50OiBpbyAnJXMnIHF1ZXVlZCBub3RoaW5nIiwgU3ZQVih3YS0+YmFzZS5k ZXNjLCBuX2EpKTsKLQl9Ci0JcmV0dXJuOwotICAgIH0KLSAgICBldiA9IChwZV9pb2V2ZW50 KikgKCp3YS0+YmFzZS52dGJsLT5uZXdfZXZlbnQpKChwZV93YXRjaGVyKikgd2EpOwotICAg ICsrZXYtPmJhc2UuaGl0czsKLSAgICBldi0+Z290IHw9IGdvdDsKLSAgICBxdWV1ZUV2ZW50 KChwZV9ldmVudCopIGV2KTsKLX0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKiogREVWUE9MTCAqLwotI2lmIGRlZmluZWQoSEFTX0RFVlBP TEwpICYmICFQRV9TWVNfSU8KKyNpZiBkZWZpbmVkKEhBU19ERVZQT0xMKSAmJiAhUEVfU1lT X0lPICYmICFkZWZpbmVkKEhBU19FUE9MTCkKICNkZWZpbmUgUEVfU1lTX0lPIDEKIAogc3Rh dGljIHZvaWQgcGVfc3lzX3NsZWVwKGRvdWJsZSBsZWZ0KSB7CkBAIC0yMjksNyArNDE5LDcg QEAKICNlbmRpZiAvKkhBU19ERVZQT0xMKi8KIAogLyoqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKiogUE9MTCAqLwotI2lmIGRlZmluZWQoSEFTX1BP TEwpICYmICFQRV9TWVNfSU8KKyNpZiBkZWZpbmVkKEhBU19QT0xMKSAmJiAhUEVfU1lTX0lP ICYmICFkZWZpbmVkKEhBU19FUE9MTCkKICNkZWZpbmUgUEVfU1lTX0lPIDEKIAogc3RhdGlj IHN0cnVjdCBwb2xsZmQgKlBvbGxmZD0wOwpAQCAtMzQ2LDcgKzUzNiw3IEBACiAKIAogLyoq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogU0VMRUNU ICovCi0jaWYgZGVmaW5lZChIQVNfU0VMRUNUKSAmJiAhUEVfU1lTX0lPCisjaWYgZGVmaW5l ZChIQVNfU0VMRUNUKSAmJiAhUEVfU1lTX0lPICYmICFkZWZpbmVkKEhBU19FUE9MTCkKICNk ZWZpbmUgUEVfU1lTX0lPIDEKIAogc3RhdGljIGludCBOZmRzOwpkaWZmIC11ciBFdmVudC0x LjA2L0NoYW5nZUxvZyAvaG9tZS9yY29ub3Zlci9FdmVudC0xLjA2L0NoYW5nZUxvZwotLS0g RXZlbnQtMS4wNi9DaGFuZ2VMb2cJMjAwNS0wOS0xMSAxNDoxMDozOC4wMDAwMDAwMDAgLTA2 MDAKKysrIC9ob21lL3Jjb25vdmVyL0V2ZW50LTEuMDYvQ2hhbmdlTG9nCTIwMDUtMDktMTEg MTk6NDQ6MTMuMDAwMDAwMDAwIC0wNjAwCkBAIC0xLDMgKzEsMTQgQEAKKzIwMDUtMDktMTEg ICAgPHJjb25vdmVyQGluZm9nZWFycy5jb20+CisKKwkqIEFkZCBlcG9sbCBzdXBwb3J0IG9u IGxpbnV4LCBlbmFibGVkIHdpdGggLURIQVNfRVBPTEwKKworCSogQ2hhbmdlIHRoZSB0L2lv LnQgdGVzdCB0byBhZGQgdGhlIHdhcm5pbmcgaGFuZGxlciBiZWZvcmUgdGhlIGZkCisJaXMg YWRkZWQgdG8gdGhlIEV2ZW50IG9iamVjdCwgYmVjYXVzZSB3aXRoIGVwb2xsIHRoZSBFQkFE RiBlcnJvcgorCXdpbGwgYmUgcmVwb3J0ZWQgd2hlbiB0aGUgZmQgaXMgYWRkZWQgdG8gdGhl IGVwb2xsIGZkLgorCisJKiBDaGFuZ2UgRXZlbnQueHMgdG8gY2FsbCBib290X2Vwb2xsKCkg dG8gaW5pdGlhbGl6ZSB0aGUgZXBvbGwgZmQsCisJc28gaXQgY2FuIGJlIHVzZWQgbGF0ZXIg b24uCisKIDIwMDUtMDUtMTQgICAgPGpvc2h1YUBhbHdheXMuam95LmV0aC5uZXQ+CiAKIAkq IFJlbGVhc2UgMS4wNi4KT25seSBpbiAvaG9tZS9yY29ub3Zlci9FdmVudC0xLjA2OiBDaGFu Z2VMb2d+CmRpZmYgLXVyIEV2ZW50LTEuMDYvRXZlbnQueHMgL2hvbWUvcmNvbm92ZXIvRXZl bnQtMS4wNi9FdmVudC54cwotLS0gRXZlbnQtMS4wNi9FdmVudC54cwkyMDA1LTA5LTExIDE0 OjEwOjM4LjAwMDAwMDAwMCAtMDYwMAorKysgL2hvbWUvcmNvbm92ZXIvRXZlbnQtMS4wNi9F dmVudC54cwkyMDA1LTA5LTExIDE5OjI3OjI3LjAwMDAwMDAwMCAtMDYwMApAQCAtMjk2LDYg KzI5Niw3IEBACiAgIGJvb3RfaWRsZSgpOwogICBib290X3RpbWVyKCk7CiAgIGJvb3RfaW8o KTsKKyAgYm9vdF9lcG9sbCgpOwogICBib290X2RldnBvbGwoKTsKICAgYm9vdF92YXIoKTsK ICAgYm9vdF90aWVkKCk7CmRpZmYgLXVyIEV2ZW50LTEuMDYvTWFrZWZpbGUuUEwgL2hvbWUv cmNvbm92ZXIvRXZlbnQtMS4wNi9NYWtlZmlsZS5QTAotLS0gRXZlbnQtMS4wNi9NYWtlZmls ZS5QTAkyMDA1LTA5LTExIDE0OjEwOjM4LjAwMDAwMDAwMCAtMDYwMAorKysgL2hvbWUvcmNv bm92ZXIvRXZlbnQtMS4wNi9NYWtlZmlsZS5QTAkyMDA1LTA5LTExIDE5OjI3OjAxLjAwMDAw MDAwMCAtMDYwMApAQCAtMTEsNiArMTEsNyBAQAogbXkgQG9wdD0oUFJFUkVRX1BNID0+IHsg VGVzdCA9PiAxIH0sCiAJIFZFUlNJT05fRlJPTQk9PiAiLi9saWIvRXZlbnQucG0iLAogCSBO QU1FICAgICAgCT0+ICJFdmVudCIsCisJIERFRklORSAgICAgICAgID0+ICctREhBU19FUE9M TCcsCiAJIFRZUEVNQVBTICAgICAgID0+IFsnLi9saWIvRXZlbnQvdHlwZW1hcCddLAogCSBJ TkMJCT0+ICctSWMgLUlsaWIvRXZlbnQnLAogCSBICQk9PiBbZ2xvYigiYy8qIiksIGdsb2Io IiouaCIpLCAibGliL0V2ZW50L0V2ZW50QVBJLmgiXSwKT25seSBpbiAvaG9tZS9yY29ub3Zl ci9FdmVudC0xLjA2L3Q6IGZvby5ydW4KZGlmZiAtdXIgRXZlbnQtMS4wNi90L2lvLnQgL2hv bWUvcmNvbm92ZXIvRXZlbnQtMS4wNi90L2lvLnQKLS0tIEV2ZW50LTEuMDYvdC9pby50CTIw MDUtMDktMTEgMTk6NDc6NDQuMDAwMDAwMDAwIC0wNjAwCisrKyAvaG9tZS9yY29ub3Zlci9F dmVudC0xLjA2L3QvaW8udAkyMDA1LTA5LTExIDE1OjQ5OjQzLjAwMDAwMDAwMCAtMDYwMApA QCAtMjMsMTIgKzIzLDYgQEAKIAogbXkgJG5vdGljZWRfYm9ndXNfZmQ9MDsKIG15ICRib2d1 c190aW1lb3V0PTA7Ci1teSAkYm9ndXMgPSBFdmVudC0+aW8oZGVzYyA9PiAnb29wcycsIHBv bGwgPT4gJ3InLCBmZCA9PiAxMjMsCi0JCSAgICAgIHRpbWVvdXQgPT4gLjEsIGNiID0+IHN1 YiB7Ci0JCQkgICsrJGJvZ3VzX3RpbWVvdXQ7Ci0JCSAgICAgIH0pOwotCi1wcmludCAiYm9n dXM6ICRib2d1c1xuIjsKIAogJFNJR3tfX1dBUk5fX30gPSBzdWIgewogICAgIG15ICRpc19p dCA9ICRfWzBdID1+IG0vXCdvb3BzXCcgd2FzIHVuZXhwZWN0ZWRseS87CkBAIC0zOSw2ICsz MywxMiBAQAogICAgIH0KIH07CiAKKworbXkgJGJvZ3VzID0gRXZlbnQtPmlvKGRlc2MgPT4g J29vcHMnLCBwb2xsID0+ICdyJywgZmQgPT4gMTIzLAorCQkgICAgICB0aW1lb3V0ID0+IC4x LCBjYiA9PiBzdWIgeworCQkJICArKyRib2d1c190aW1lb3V0OworCQkgICAgICB9KTsKKwog c3ViIG5ld19waXBlIHsKICAgICBteSAoJGNudCkgPSBAXzsKICAgICBteSAoJHIsJHcpID0g KGdlbnN5bSwgZ2Vuc3ltKTsK --------------030406070300070003010305--