--f46d04426b642829070513e7a46a Content-Type: text/plain; charset=UTF-8 Proposed patch in message body as issue tracker doesn't recognizes attachments:
commit c9857a7c0df4448a14a2aa9f55850df5e830069e Author: Dmytro Milinevskyy <[email protected]> Date: Fri Apr 17 10:41:26 2015 +0200 libmdb: retry write operation in case of interrupted system diff --git a/libraries/liblmdb/mdb.c b/libraries/liblmdb/mdb.c index a95c7cd..ed7f370 100644 --- a/libraries/liblmdb/mdb.c +++ b/libraries/liblmdb/mdb.c @@ -3236,6 +3236,7 @@ mdb_page_flush(MDB_txn *txn, int keep) /* Write up to MDB_COMMIT_PAGES dirty pages at a time. */ if (pos!=next_pos || n==MDB_COMMIT_PAGES || wsize+size>MAX_WRITE) { if (n) { + retry_write: /* Write previous page(s) */ #ifdef MDB_USE_PWRITEV wres = pwritev(env->me_fd, iov, n, wpos); @@ -3243,8 +3244,10 @@ mdb_page_flush(MDB_txn *txn, int keep) if (n == 1) { wres = pwrite(env->me_fd, iov[0].iov_base, wsize, wpos); } else { + retry_seek: if (lseek(env->me_fd, wpos, SEEK_SET) == -1) { rc = ErrCode(); + if (EINTR == rc) goto retry_seek; DPRINTF(("lseek: %s", strerror(rc))); return rc; } @@ -3254,6 +3257,7 @@ mdb_page_flush(MDB_txn *txn, int keep) if (wres != wsize) { if (wres < 0) { rc = ErrCode(); + if (EINTR == rc) goto retry_write; DPRINTF(("Write error: %s", strerror(rc))); } else { rc = EIO; /* TODO: Use which error code? */ @@ -3627,7 +3631,8 @@ mdb_env_init_meta(MDB_env *env, MDB_meta *meta) int len; #define DO_PWRITE(rc, fd, ptr, size, len, pos) do { \ len = pwrite(fd, ptr, size, pos); \ - rc = (len >= 0); } while(0) + if (len == -1 && EINVAL == ErrCode()) continue; \ + rc = (len >= 0); break; } while(1) #endif DPUTS("writing new meta page"); @@ -3735,6 +3740,7 @@ mdb_env_write_meta(MDB_txn *txn) /* Write to the SYNC fd */ mfd = (flags & (MDB_NOSYNC|MDB_NOMETASYNC)) ? env->me_fd : env->me_mfd; +retry_write: #ifdef _WIN32 { memset(&ov, 0, sizeof(ov)); @@ -3747,6 +3753,7 @@ mdb_env_write_meta(MDB_txn *txn) #endif if (rc != len) { rc = rc < 0 ? ErrCode() : EIO; + if (EINTR == rc) goto retry_write; DPUTS("write failed, disk error?"); /* On a failure, the pagecache still contains the new data. * Write some old data back, to prevent it from being used. On Fri, Apr 17, 2015 at 10:46 AM, Dmytro Milinevskyy <[email protected]> wrote: > Proposed patch in attachment. > > On Fri, Apr 17, 2015 at 10:43 AM, <[email protected]> wrote: > >> >> *** THIS IS AN AUTOMATICALLY GENERATED REPLY *** >> >> Thanks for your report to the OpenLDAP Issue Tracking System. Your >> report has been assigned the tracking number ITS#8106. >> >> One of our support engineers will look at your report in due course. >> Note that this may take some time because our support engineers >> are volunteers. They only work on OpenLDAP when they have spare >> time. >> >> If you need to provide additional information in regards to your >> issue report, you may do so by replying to this message. Note that >> any mail sent to [email protected] with (ITS#8106) >> in the subject will automatically be attached to the issue report. >> >> mailto:[email protected]?subject=(ITS#8106) >> >> You may follow the progress of this report by loading the following >> URL in a web browser: >> http://www.OpenLDAP.org/its/index.cgi?findid=8106 >> >> Please remember to retain your issue tracking number (ITS#8106) >> on any further messages you send to us regarding this report. If >> you don't then you'll just waste our time and yours because we >> won't be able to properly track the report. >> >> Please note that the Issue Tracking System is not intended to >> be used to seek help in the proper use of OpenLDAP Software. >> Such requests will be closed. >> >> OpenLDAP Software is user supported. >> http://www.OpenLDAP.org/support/ >> >> -------------- >> Copyright 1998-2007 The OpenLDAP Foundation, All Rights Reserved. >> >> > --f46d04426b642829070513e7a46a Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: base64 PGRpdiBkaXI9Imx0ciI+UHJvcG9zZWQgcGF0Y2ggaW4gbWVzc2FnZSBib2R5IGFzIGlzc3VlIHRy YWNrZXIgZG9lc24mIzM5O3QgcmVjb2duaXplcyBhdHRhY2htZW50czo8YnI+PGJyPmNvbW1pdCBj OTg1N2E3YzBkZjQ0NDhhMTRhMmFhOWY1NTg1MGRmNWU4MzAwNjllPGJyPkF1dGhvcjogRG15dHJv IE1pbGluZXZza3l5ICZsdDs8YSBocmVmPSJtYWlsdG86bWlsaW5ldnNreXlAZ21haWwuY29tIj5t aWxpbmV2c2t5eUBnbWFpbC5jb208L2E+Jmd0Ozxicj5EYXRlOsKgwqAgRnJpIEFwciAxNyAxMDo0 MToyNiAyMDE1ICswMjAwPGJyPjxicj7CoMKgwqAgbGlibWRiOiByZXRyeSB3cml0ZSBvcGVyYXRp b24gaW4gY2FzZSBvZiBpbnRlcnJ1cHRlZCBzeXN0ZW08YnI+PGJyPmRpZmYgLS1naXQgYS9saWJy YXJpZXMvbGlibG1kYi9tZGIuYyBiL2xpYnJhcmllcy9saWJsbWRiL21kYi5jPGJyPmluZGV4IGE5 NWM3Y2QuLmVkN2YzNzAgMTAwNjQ0PGJyPi0tLSBhL2xpYnJhcmllcy9saWJsbWRiL21kYi5jPGJy PisrKyBiL2xpYnJhcmllcy9saWJsbWRiL21kYi5jPGJyPkBAIC0zMjM2LDYgKzMyMzYsNyBAQCBt ZGJfcGFnZV9mbHVzaChNREJfdHhuICp0eG4sIGludCBrZWVwKTxicj7CoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqAgLyogV3JpdGUgdXAgdG8gTURCX0NPTU1JVF9QQUdFUyBkaXJ0eSBwYWdl cyBhdCBhIHRpbWUuICovPGJyPsKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBpZiAocG9z IT1uZXh0X3BvcyB8fCBuPT1NREJfQ09NTUlUX1BBR0VTIHx8IHdzaXplK3NpemUmZ3Q7TUFYX1dS SVRFKSB7PGJyPsKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAg aWYgKG4pIHs8YnI+K8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHJldHJ5X3dyaXRlOjxicj7C oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoCAvKiBXcml0ZSBwcmV2aW91cyBwYWdlKHMpICovPGJyPsKgI2lmZGVmIE1EQl9VU0VfUFdS SVRFVjxicj7CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoCB3cmVzID0gcHdyaXRldihlbnYtJmd0O21lX2ZkLCBpb3YsIG4sIHdwb3Mp Ozxicj5AQCAtMzI0Myw4ICszMjQ0LDEwIEBAIG1kYl9wYWdlX2ZsdXNoKE1EQl90eG4gKnR4biwg aW50IGtlZXApPGJyPsKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgIGlmIChuID09IDEpIHs8YnI+wqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg IHdyZXMgPSBwd3JpdGUoZW52LSZndDttZV9mZCwgaW92WzBdLmlvdl9iYXNlLCB3c2l6ZSwgd3Bv cyk7PGJyPsKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgIH0gZWxzZSB7PGJyPivCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHJldHJ5X3NlZWs6PGJyPsKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoCBpZiAobHNlZWsoZW52LSZndDttZV9mZCwgd3BvcywgU0VFS19TRVQpID09 IC0xKSB7PGJyPsKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgcmMgPSBFcnJD b2RlKCk7PGJyPivCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBpZiAoRUlOVFIg PT0gcmMpIGdvdG8gcmV0cnlfc2Vlazs8YnI+wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoCBEUFJJTlRGKCgmcXVvdDtsc2VlazogJXMmcXVvdDssIHN0cmVycm9yKHJjKSkpOzxi cj7CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHJldHVybiByYzs8YnI+wqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgIH08YnI+QEAgLTMyNTQsNiArMzI1Nyw3IEBAIG1kYl9wYWdlX2Zs dXNoKE1EQl90eG4gKnR4biwgaW50IGtlZXApPGJyPsKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGlmICh3cmVzICE9IHdzaXplKSB7 PGJyPsKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBpZiAod3JlcyAmbHQ7IDApIHs8YnI+wqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCByYyA9IEVyckNvZGUoKTs8YnI+K8KgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGlmIChFSU5UUiA9PSByYykgZ290byByZXRyeV93 cml0ZTs8YnI+wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBEUFJJTlRGKCgm cXVvdDtXcml0ZSBlcnJvcjogJXMmcXVvdDssIHN0cmVycm9yKHJjKSkpOzxicj7CoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqAgfSBlbHNlIHs8YnI+wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoCByYyA9IEVJTzsgLyogVE9ETzogVXNlIHdoaWNoIGVycm9yIGNvZGU/ICovPGJyPkBAIC0z NjI3LDcgKzM2MzEsOCBAQCBtZGJfZW52X2luaXRfbWV0YShNREJfZW52ICplbnYsIE1EQl9tZXRh ICptZXRhKTxicj7CoMKgwqDCoMKgwqDCoCBpbnQgbGVuOzxicj7CoCNkZWZpbmUgRE9fUFdSSVRF KHJjLCBmZCwgcHRyLCBzaXplLCBsZW4sIHBvcykgZG8geyBcPGJyPsKgwqDCoMKgwqDCoMKgIGxl biA9IHB3cml0ZShmZCwgcHRyLCBzaXplLCBwb3MpO8KgwqDCoMKgwqDCoCBcPGJyPi3CoMKgwqDC oMKgwqAgcmMgPSAobGVuICZndDs9IDApOyB9IHdoaWxlKDApPGJyPivCoMKgwqDCoMKgwqAgaWYg KGxlbiA9PSAtMSAmYW1wOyZhbXA7IEVJTlZBTCA9PSBFcnJDb2RlKCkpIGNvbnRpbnVlOyBcPGJy PivCoMKgwqDCoMKgwqAgcmMgPSAobGVuICZndDs9IDApOyBicmVhazsgfSB3aGlsZSgxKTxicj7C oCNlbmRpZjxicj48YnI+wqDCoMKgwqDCoMKgwqAgRFBVVFMoJnF1b3Q7d3JpdGluZyBuZXcgbWV0 YSBwYWdlJnF1b3Q7KTs8YnI+QEAgLTM3MzUsNiArMzc0MCw3IEBAIG1kYl9lbnZfd3JpdGVfbWV0 YShNREJfdHhuICp0eG4pPGJyPjxicj7CoMKgwqDCoMKgwqDCoCAvKiBXcml0ZSB0byB0aGUgU1lO QyBmZCAqLzxicj7CoMKgwqDCoMKgwqDCoCBtZmQgPSAoZmxhZ3MgJmFtcDsgKE1EQl9OT1NZTkN8 TURCX05PTUVUQVNZTkMpKSA/IGVudi0mZ3Q7bWVfZmQgOiBlbnYtJmd0O21lX21mZDs8YnI+K3Jl dHJ5X3dyaXRlOjxicj7CoCNpZmRlZiBfV0lOMzI8YnI+wqDCoMKgwqDCoMKgwqAgezxicj7CoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgbWVtc2V0KCZhbXA7b3YsIDAsIHNpemVvZihvdikp Ozxicj5AQCAtMzc0Nyw2ICszNzUzLDcgQEAgbWRiX2Vudl93cml0ZV9tZXRhKE1EQl90eG4gKnR4 bik8YnI+wqAjZW5kaWY8YnI+wqDCoMKgwqDCoMKgwqAgaWYgKHJjICE9IGxlbikgezxicj7CoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgcmMgPSByYyAmbHQ7IDAgPyBFcnJDb2RlKCkgOiBF SU87PGJyPivCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGlmIChFSU5UUiA9PSByYykgZ290 byByZXRyeV93cml0ZTs8YnI+wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIERQVVRTKCZx dW90O3dyaXRlIGZhaWxlZCwgZGlzayBlcnJvcj8mcXVvdDspOzxicj7CoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqAgLyogT24gYSBmYWlsdXJlLCB0aGUgcGFnZWNhY2hlIHN0aWxsIGNvbnRh aW5zIHRoZSBuZXcgZGF0YS48YnI+wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgKiBX cml0ZSBzb21lIG9sZCBkYXRhIGJhY2ssIHRvIHByZXZlbnQgaXQgZnJvbSBiZWluZyB1c2VkLjxi cj48L2Rpdj48ZGl2IGNsYXNzPSJnbWFpbF9leHRyYSI+PGJyPjxkaXYgY2xhc3M9ImdtYWlsX3F1 b3RlIj5PbiBGcmksIEFwciAxNywgMjAxNSBhdCAxMDo0NiBBTSwgRG15dHJvIE1pbGluZXZza3l5 IDxzcGFuIGRpcj0ibHRyIj4mbHQ7PGEgaHJlZj0ibWFpbHRvOm1pbGluZXZza3l5QGdtYWlsLmNv bSIgdGFyZ2V0PSJfYmxhbmsiPm1pbGluZXZza3l5QGdtYWlsLmNvbTwvYT4mZ3Q7PC9zcGFuPiB3 cm90ZTo8YnI+PGJsb2NrcXVvdGUgY2xhc3M9ImdtYWlsX3F1b3RlIiBzdHlsZT0ibWFyZ2luOjAg MCAwIC44ZXg7Ym9yZGVyLWxlZnQ6MXB4ICNjY2Mgc29saWQ7cGFkZGluZy1sZWZ0OjFleCI+PGRp diBkaXI9Imx0ciI+UHJvcG9zZWQgcGF0Y2ggaW4gYXR0YWNobWVudC48YnI+PC9kaXY+PGRpdiBj bGFzcz0iSE9FblpiIj48ZGl2IGNsYXNzPSJoNSI+PGRpdiBjbGFzcz0iZ21haWxfZXh0cmEiPjxi cj48ZGl2IGNsYXNzPSJnbWFpbF9xdW90ZSI+T24gRnJpLCBBcHIgMTcsIDIwMTUgYXQgMTA6NDMg QU0sICA8c3BhbiBkaXI9Imx0ciI+Jmx0OzxhIGhyZWY9Im1haWx0bzpvcGVubGRhcC1pdHNAb3Bl bmxkYXAub3JnIiB0YXJnZXQ9Il9ibGFuayI+b3BlbmxkYXAtaXRzQG9wZW5sZGFwLm9yZzwvYT4m Z3Q7PC9zcGFuPiB3cm90ZTo8YnI+PGJsb2NrcXVvdGUgY2xhc3M9ImdtYWlsX3F1b3RlIiBzdHls ZT0ibWFyZ2luOjAgMCAwIC44ZXg7Ym9yZGVyLWxlZnQ6MXB4ICNjY2Mgc29saWQ7cGFkZGluZy1s ZWZ0OjFleCI+PGJyPg0KKioqIFRISVMgSVMgQU4gQVVUT01BVElDQUxMWSBHRU5FUkFURUQgUkVQ TFkgKioqPGJyPg0KPGJyPg0KVGhhbmtzIGZvciB5b3VyIHJlcG9ydCB0byB0aGUgT3BlbkxEQVAg SXNzdWUgVHJhY2tpbmcgU3lzdGVtLsKgIFlvdXI8YnI+DQpyZXBvcnQgaGFzIGJlZW4gYXNzaWdu ZWQgdGhlIHRyYWNraW5nIG51bWJlciBJVFMjODEwNi48YnI+DQo8YnI+DQpPbmUgb2Ygb3VyIHN1 cHBvcnQgZW5naW5lZXJzIHdpbGwgbG9vayBhdCB5b3VyIHJlcG9ydCBpbiBkdWUgY291cnNlLjxi cj4NCk5vdGUgdGhhdCB0aGlzIG1heSB0YWtlIHNvbWUgdGltZSBiZWNhdXNlIG91ciBzdXBwb3J0 IGVuZ2luZWVyczxicj4NCmFyZSB2b2x1bnRlZXJzLsKgIFRoZXkgb25seSB3b3JrIG9uIE9wZW5M REFQIHdoZW4gdGhleSBoYXZlIHNwYXJlPGJyPg0KdGltZS48YnI+DQo8YnI+DQpJZiB5b3UgbmVl ZCB0byBwcm92aWRlIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gaW4gcmVnYXJkcyB0byB5b3VyPGJy Pg0KaXNzdWUgcmVwb3J0LCB5b3UgbWF5IGRvIHNvIGJ5IHJlcGx5aW5nIHRvIHRoaXMgbWVzc2Fn ZS7CoCBOb3RlIHRoYXQ8YnI+DQphbnkgbWFpbCBzZW50IHRvIDxhIGhyZWY9Im1haWx0bzpvcGVu bGRhcC1pdHNAb3BlbmxkYXAub3JnIiB0YXJnZXQ9Il9ibGFuayI+b3BlbmxkYXAtaXRzQG9wZW5s ZGFwLm9yZzwvYT4gd2l0aCAoSVRTIzgxMDYpPGJyPg0KaW4gdGhlIHN1YmplY3Qgd2lsbCBhdXRv bWF0aWNhbGx5IGJlIGF0dGFjaGVkIHRvIHRoZSBpc3N1ZSByZXBvcnQuPGJyPg0KPGJyPg0KwqAg wqAgwqAgwqAgbWFpbHRvOjxhIGhyZWY9Im1haWx0bzpvcGVubGRhcC1pdHNAb3BlbmxkYXAub3Jn IiB0YXJnZXQ9Il9ibGFuayI+b3BlbmxkYXAtaXRzQG9wZW5sZGFwLm9yZzwvYT4/c3ViamVjdD0o SVRTIzgxMDYpPGJyPg0KPGJyPg0KWW91IG1heSBmb2xsb3cgdGhlIHByb2dyZXNzIG9mIHRoaXMg cmVwb3J0IGJ5IGxvYWRpbmcgdGhlIGZvbGxvd2luZzxicj4NClVSTCBpbiBhIHdlYiBicm93c2Vy Ojxicj4NCsKgIMKgIDxhIGhyZWY9Imh0dHA6Ly93d3cuT3BlbkxEQVAub3JnL2l0cy9pbmRleC5j Z2k/ZmluZGlkPTgxMDYiIHRhcmdldD0iX2JsYW5rIj5odHRwOi8vd3d3Lk9wZW5MREFQLm9yZy9p dHMvaW5kZXguY2dpP2ZpbmRpZD04MTA2PC9hPjxicj4NCjxicj4NClBsZWFzZSByZW1lbWJlciB0 byByZXRhaW4geW91ciBpc3N1ZSB0cmFja2luZyBudW1iZXIgKElUUyM4MTA2KTxicj4NCm9uIGFu eSBmdXJ0aGVyIG1lc3NhZ2VzIHlvdSBzZW5kIHRvIHVzIHJlZ2FyZGluZyB0aGlzIHJlcG9ydC7C oCBJZjxicj4NCnlvdSBkb24mIzM5O3QgdGhlbiB5b3UmIzM5O2xsIGp1c3Qgd2FzdGUgb3VyIHRp bWUgYW5kIHlvdXJzIGJlY2F1c2Ugd2U8YnI+DQp3b24mIzM5O3QgYmUgYWJsZSB0byBwcm9wZXJs eSB0cmFjayB0aGUgcmVwb3J0Ljxicj4NCjxicj4NClBsZWFzZSBub3RlIHRoYXQgdGhlIElzc3Vl IFRyYWNraW5nIFN5c3RlbSBpcyBub3QgaW50ZW5kZWQgdG88YnI+DQpiZSB1c2VkIHRvIHNlZWsg aGVscCBpbiB0aGUgcHJvcGVyIHVzZSBvZiBPcGVuTERBUCBTb2Z0d2FyZS48YnI+DQpTdWNoIHJl cXVlc3RzIHdpbGwgYmUgY2xvc2VkLjxicj4NCjxicj4NCk9wZW5MREFQIFNvZnR3YXJlIGlzIHVz ZXIgc3VwcG9ydGVkLjxicj4NCsKgIMKgIMKgIMKgIDxhIGhyZWY9Imh0dHA6Ly93d3cuT3BlbkxE QVAub3JnL3N1cHBvcnQvIiB0YXJnZXQ9Il9ibGFuayI+aHR0cDovL3d3dy5PcGVuTERBUC5vcmcv c3VwcG9ydC88L2E+PGJyPg0KPGJyPg0KLS0tLS0tLS0tLS0tLS08YnI+DQpDb3B5cmlnaHQgMTk5 OC0yMDA3IFRoZSBPcGVuTERBUCBGb3VuZGF0aW9uLCBBbGwgUmlnaHRzIFJlc2VydmVkLjxicj4N Cjxicj4NCjwvYmxvY2txdW90ZT48L2Rpdj48YnI+PC9kaXY+DQo8L2Rpdj48L2Rpdj48L2Jsb2Nr cXVvdGU+PC9kaXY+PGJyPjwvZGl2Pg0K --f46d04426b642829070513e7a46a--
