From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from simark.ca (simark.ca [158.69.221.121]) by sourceware.org (Postfix) with ESMTPS id C3572385C426 for ; Tue, 24 Mar 2020 15:35:30 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.3.2 sourceware.org C3572385C426 Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=simark.ca Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=simark@simark.ca Received: from [10.0.0.11] (unknown [192.222.164.54]) (using TLSv1.3 with cipher TLS_AES_128_GCM_SHA256 (128/128 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by simark.ca (Postfix) with ESMTPSA id 3CA2A1E5F9; Tue, 24 Mar 2020 11:35:29 -0400 (EDT) Subject: Re: [PATCH][gdb] Fix hang after ext sigkill To: Tom de Vries , gdb-patches@sourceware.org Cc: Pedro Alves References: <20200224201403.GA7079@delia> From: Simon Marchi Message-ID: Date: Tue, 24 Mar 2020 11:35:28 -0400 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101 Thunderbird/68.6.0 MIME-Version: 1.0 In-Reply-To: <20200224201403.GA7079@delia> Content-Type: multipart/mixed; boundary="------------B05C081925994325B5B01E88" Content-Language: en-US-large X-Spam-Status: No, score=-28.5 required=5.0 tests=BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, KAM_DMARC_STATUS, KAM_SHORT, SPF_HELO_PASS, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.2 X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on server2.sourceware.org X-BeenThere: gdb-patches@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gdb-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 24 Mar 2020 15:35:33 -0000 This is a multi-part message in MIME format. --------------B05C081925994325B5B01E88 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit Hi Tom, The test fails for me more often than not. I've attached a gdb.log showing one such failure. There seems to be a problem matching the output of the last "continue". This is what I see when I reproduce the case by hand: (gdb) c Continuing. Couldn't get registers: No such process. Couldn't get registers: No such process. (gdb) [Thread 0x7ffff7d99700 (LWP 514079) exited] Program terminated with signal SIGKILL, Killed. The program no longer exists. I didn't really understand why we saw a prompt coming back before the other messages, so I looked into it a bit and this is what I think happens: 1. While we are stopped at the prompt, the linux-nat event handler is unregistered from the event loop 2. Inferior gets SIGKILL'ed, so GDB gets SIGCHLD'ed, that posts an event to the event pipe, but since it's not registered in the event loop, nothing happens 3. User does continue, the linux-nat event handler gets registered with the event loop. Then, the continue fails (No such process), which brings us back at the prompt. However, the linux-nat event handler stays registered with the event loop. 4. When we come back to the event loop, we process the event for the SIGKILL, which makes GDB print the thread exit message and "Program terminated" message. Normally, after the "continue" fails, I don't think we would want to leave the linux-nat handler registered with the event loop: if it was not registered before, why should it be registered after? However, if it wasn't left there, we wouldn't see the messages saying the program has terminated, so that wouldn't be good either. Maybe there's a better way to handle it? However, I still think it would be a good idea to merge a patch like yours, it's already a step forward (especially since it fixes a regression). > diff --git a/gdb/testsuite/lib/gdb.exp b/gdb/testsuite/lib/gdb.exp > index 81518b9646..745694df2d 100644 > --- a/gdb/testsuite/lib/gdb.exp > +++ b/gdb/testsuite/lib/gdb.exp > @@ -571,7 +571,7 @@ proc runto { function args } { > } > return 1 > } > - -re "Breakpoint \[0-9\]*, \[0-9xa-f\]* in .*$gdb_prompt $" { > + -re "\[Bb\]reakpoint \[0-9\]*, \[0-9xa-f\]* in .*$gdb_prompt $" { > if { $print_pass } { > pass $test_name > } > diff --git a/gdb/thread.c b/gdb/thread.c > index 54b59e2244..9876ca3c76 100644 > --- a/gdb/thread.c > +++ b/gdb/thread.c > @@ -1444,6 +1444,8 @@ scoped_restore_current_thread::restore () > > scoped_restore_current_thread::~scoped_restore_current_thread () > { > + if (m_inf == NULL) > + return; > if (!m_dont_restore) > { > try > @@ -1488,7 +1490,17 @@ scoped_restore_current_thread::scoped_restore_current_thread () > else > frame = NULL; > > - m_selected_frame_id = get_frame_id (frame); > + try > + { > + m_selected_frame_id = get_frame_id (frame); > + } > + catch (const gdb_exception &ex) > + { > + m_inf = NULL; > + m_selected_frame_id = null_frame_id; > + m_selected_frame_level = -1; > + return; > + } The indentation is a bit off here. Instead of clearing everything, I think we should just set m_selected_frame_id to null_frame_id and m_selected_frame_level to -1. m_inf and m_thread can still be set. This way, the right inferior will be restored, at least, I think this is desirable. scoped_restore_current_thread::restore handles well the case where the thread to restore has exited. The thread_info object is refcounted for this exact use case, where the thread would get deleted while In other words: try { m_selected_frame_id = get_frame_id (frame); m_selected_frame_level = frame_relative_level (frame); } catch (const gdb_exception &ex) { m_selected_frame_id = null_frame_id; m_selected_frame_level = -1; } Simon --------------B05C081925994325B5B01E88 Content-Type: text/x-log; name="gdb.log" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="gdb.log" VGVzdCBydW4gYnkgc2ltYXJrIG9uIFR1ZSBNYXIgMjQgMTA6NDY6NTYgMjAyMApOYXRpdmUg Y29uZmlndXJhdGlvbiBpcyB4ODZfNjQtcGMtbGludXgtZ251CgoJCT09PSBnZGIgdGVzdHMg PT09CgpTY2hlZHVsZSBvZiB2YXJpYXRpb25zOgogICAgdW5peAoKUnVubmluZyB0YXJnZXQg dW5peApVc2luZyAvdXNyL3NoYXJlL2RlamFnbnUvYmFzZWJvYXJkcy91bml4LmV4cCBhcyBi b2FyZCBkZXNjcmlwdGlvbiBmaWxlIGZvciB0YXJnZXQuClVzaW5nIC91c3Ivc2hhcmUvZGVq YWdudS9jb25maWcvdW5peC5leHAgYXMgZ2VuZXJpYyBpbnRlcmZhY2UgZmlsZSBmb3IgdGFy Z2V0LgpVc2luZyAvaG9tZS9zaW1hcmsvc3JjL2JpbnV0aWxzLWdkYi9nZGIvdGVzdHN1aXRl L2NvbmZpZy91bml4LmV4cCBhcyB0b29sLWFuZC10YXJnZXQtc3BlY2lmaWMgaW50ZXJmYWNl IGZpbGUuClJ1bm5pbmcgL2hvbWUvc2ltYXJrL3NyYy9iaW51dGlscy1nZGIvZ2RiL3Rlc3Rz dWl0ZS9nZGIudGhyZWFkcy9oYW5nLWFmdGVyLWV4dC1zaWdraWxsLmV4cCAuLi4KZ2V0X2Nv bXBpbGVyX2luZm86IGdjYy05LTMtMApFeGVjdXRpbmcgb24gaG9zdDogZ2NjICAtZm5vLXN0 YWNrLXByb3RlY3RvciAgLWZkaWFnbm9zdGljcy1jb2xvcj1uZXZlciAtYyAgLW8gL2hvbWUv c2ltYXJrL2J1aWxkL2JpbnV0aWxzLWdkYi9nZGIvdGVzdHN1aXRlL291dHB1dHMvZ2RiLnRo cmVhZHMvaGFuZy1hZnRlci1leHQtc2lna2lsbC9oYW5nLWFmdGVyLWV4dC1zaWdraWxsMC5v IC9ob21lL3NpbWFyay9zcmMvYmludXRpbHMtZ2RiL2dkYi90ZXN0c3VpdGUvZ2RiLnRocmVh ZHMvaGFuZy1hZnRlci1leHQtc2lna2lsbC5jICAgICh0aW1lb3V0ID0gMzAwKQpzcGF3biAt aWdub3JlIFNJR0hVUCBnY2MgLWZuby1zdGFjay1wcm90ZWN0b3IgLWZkaWFnbm9zdGljcy1j b2xvcj1uZXZlciAtYyAtbyAvaG9tZS9zaW1hcmsvYnVpbGQvYmludXRpbHMtZ2RiL2dkYi90 ZXN0c3VpdGUvb3V0cHV0cy9nZGIudGhyZWFkcy9oYW5nLWFmdGVyLWV4dC1zaWdraWxsL2hh bmctYWZ0ZXItZXh0LXNpZ2tpbGwwLm8gL2hvbWUvc2ltYXJrL3NyYy9iaW51dGlscy1nZGIv Z2RiL3Rlc3RzdWl0ZS9nZGIudGhyZWFkcy9oYW5nLWFmdGVyLWV4dC1zaWdraWxsLmMNCkV4 ZWN1dGluZyBvbiBob3N0OiBnY2MgIC1mbm8tc3RhY2stcHJvdGVjdG9yIC9ob21lL3NpbWFy ay9idWlsZC9iaW51dGlscy1nZGIvZ2RiL3Rlc3RzdWl0ZS9vdXRwdXRzL2dkYi50aHJlYWRz L2hhbmctYWZ0ZXItZXh0LXNpZ2tpbGwvaGFuZy1hZnRlci1leHQtc2lna2lsbDAubyAgLWZk aWFnbm9zdGljcy1jb2xvcj1uZXZlciAgLWxwdGhyZWFkcyAtbG0gICAtbyAvaG9tZS9zaW1h cmsvYnVpbGQvYmludXRpbHMtZ2RiL2dkYi90ZXN0c3VpdGUvb3V0cHV0cy9nZGIudGhyZWFk cy9oYW5nLWFmdGVyLWV4dC1zaWdraWxsL2hhbmctYWZ0ZXItZXh0LXNpZ2tpbGwgICAgKHRp bWVvdXQgPSAzMDApCnNwYXduIC1pZ25vcmUgU0lHSFVQIGdjYyAtZm5vLXN0YWNrLXByb3Rl Y3RvciAvaG9tZS9zaW1hcmsvYnVpbGQvYmludXRpbHMtZ2RiL2dkYi90ZXN0c3VpdGUvb3V0 cHV0cy9nZGIudGhyZWFkcy9oYW5nLWFmdGVyLWV4dC1zaWdraWxsL2hhbmctYWZ0ZXItZXh0 LXNpZ2tpbGwwLm8gLWZkaWFnbm9zdGljcy1jb2xvcj1uZXZlciAtbHB0aHJlYWRzIC1sbSAt byAvaG9tZS9zaW1hcmsvYnVpbGQvYmludXRpbHMtZ2RiL2dkYi90ZXN0c3VpdGUvb3V0cHV0 cy9nZGIudGhyZWFkcy9oYW5nLWFmdGVyLWV4dC1zaWdraWxsL2hhbmctYWZ0ZXItZXh0LXNp Z2tpbGwNCi91c3IvYmluL2xkOiBjYW5ub3QgZmluZCAtbHB0aHJlYWRzDQpjb2xsZWN0Mjog ZXJyb3I6IGxkIHJldHVybmVkIDEgZXhpdCBzdGF0dXMNCmNvbXBpbGVyIGV4aXRlZCB3aXRo IHN0YXR1cyAxCm91dHB1dCBpczoKL3Vzci9iaW4vbGQ6IGNhbm5vdCBmaW5kIC1scHRocmVh ZHMNCmNvbGxlY3QyOiBlcnJvcjogbGQgcmV0dXJuZWQgMSBleGl0IHN0YXR1cw0KCkV4ZWN1 dGluZyBvbiBob3N0OiBnY2MgIC1mbm8tc3RhY2stcHJvdGVjdG9yIC9ob21lL3NpbWFyay9i dWlsZC9iaW51dGlscy1nZGIvZ2RiL3Rlc3RzdWl0ZS9vdXRwdXRzL2dkYi50aHJlYWRzL2hh bmctYWZ0ZXItZXh0LXNpZ2tpbGwvaGFuZy1hZnRlci1leHQtc2lna2lsbDAubyAgLWZkaWFn bm9zdGljcy1jb2xvcj1uZXZlciAgLWxwdGhyZWFkIC1sbSAgIC1vIC9ob21lL3NpbWFyay9i dWlsZC9iaW51dGlscy1nZGIvZ2RiL3Rlc3RzdWl0ZS9vdXRwdXRzL2dkYi50aHJlYWRzL2hh bmctYWZ0ZXItZXh0LXNpZ2tpbGwvaGFuZy1hZnRlci1leHQtc2lna2lsbCAgICAodGltZW91 dCA9IDMwMCkKc3Bhd24gLWlnbm9yZSBTSUdIVVAgZ2NjIC1mbm8tc3RhY2stcHJvdGVjdG9y IC9ob21lL3NpbWFyay9idWlsZC9iaW51dGlscy1nZGIvZ2RiL3Rlc3RzdWl0ZS9vdXRwdXRz L2dkYi50aHJlYWRzL2hhbmctYWZ0ZXItZXh0LXNpZ2tpbGwvaGFuZy1hZnRlci1leHQtc2ln a2lsbDAubyAtZmRpYWdub3N0aWNzLWNvbG9yPW5ldmVyIC1scHRocmVhZCAtbG0gLW8gL2hv bWUvc2ltYXJrL2J1aWxkL2JpbnV0aWxzLWdkYi9nZGIvdGVzdHN1aXRlL291dHB1dHMvZ2Ri LnRocmVhZHMvaGFuZy1hZnRlci1leHQtc2lna2lsbC9oYW5nLWFmdGVyLWV4dC1zaWdraWxs DQpQQVNTOiBnZGIudGhyZWFkcy9oYW5nLWFmdGVyLWV4dC1zaWdraWxsLmV4cDogc3VjY2Vz c2Z1bGx5IGNvbXBpbGVkIHBvc2l4IHRocmVhZHMgdGVzdCBjYXNlCnNwYXduIC9ob21lL3Np bWFyay9idWlsZC9iaW51dGlscy1nZGIvZ2RiL3Rlc3RzdWl0ZS8uLi8uLi9nZGIvZ2RiIC1u dyAtbnggLWRhdGEtZGlyZWN0b3J5IC9ob21lL3NpbWFyay9idWlsZC9iaW51dGlscy1nZGIv Z2RiL3Rlc3RzdWl0ZS8uLi9kYXRhLWRpcmVjdG9yeQ0Kd2FybmluZzogRm91bmQgY3VzdG9t IGhhbmRsZXIgZm9yIHNpZ25hbCA3IChCdXMgZXJyb3IpIHByZWluc3RhbGxlZC4NCndhcm5p bmc6IEZvdW5kIGN1c3RvbSBoYW5kbGVyIGZvciBzaWduYWwgOCAoRmxvYXRpbmcgcG9pbnQg ZXhjZXB0aW9uKSBwcmVpbnN0YWxsZWQuDQp3YXJuaW5nOiBGb3VuZCBjdXN0b20gaGFuZGxl ciBmb3Igc2lnbmFsIDExIChTZWdtZW50YXRpb24gZmF1bHQpIHByZWluc3RhbGxlZC4NClNv bWUgc2lnbmFsIGRpc3Bvc2l0aW9ucyBpbmhlcml0ZWQgZnJvbSB0aGUgZW52aXJvbm1lbnQg KFNJR19ERkwvU0lHX0lHTikNCndvbid0IGJlIHByb3BhZ2F0ZWQgdG8gc3Bhd25lZCBwcm9n cmFtcy4NCkdOVSBnZGIgKEdEQikgMTAuMC41MC4yMDIwMDMyNC1naXQNCkNvcHlyaWdodCAo QykgMjAyMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4NCkxpY2Vuc2UgR1BMdjMr OiBHTlUgR1BMIHZlcnNpb24gMyBvciBsYXRlciA8aHR0cDovL2dudS5vcmcvbGljZW5zZXMv Z3BsLmh0bWw+DQpUaGlzIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBhcmUgZnJlZSB0byBjaGFu Z2UgYW5kIHJlZGlzdHJpYnV0ZSBpdC4NClRoZXJlIGlzIE5PIFdBUlJBTlRZLCB0byB0aGUg ZXh0ZW50IHBlcm1pdHRlZCBieSBsYXcuDQpUeXBlICJzaG93IGNvcHlpbmciIGFuZCAic2hv dyB3YXJyYW50eSIgZm9yIGRldGFpbHMuDQpUaGlzIEdEQiB3YXMgY29uZmlndXJlZCBhcyAi eDg2XzY0LXBjLWxpbnV4LWdudSIuDQpUeXBlICJzaG93IGNvbmZpZ3VyYXRpb24iIGZvciBj b25maWd1cmF0aW9uIGRldGFpbHMuDQpGb3IgYnVnIHJlcG9ydGluZyBpbnN0cnVjdGlvbnMs IHBsZWFzZSBzZWU6DQo8aHR0cDovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2dkYi9idWdzLz4u DQpGaW5kIHRoZSBHREIgbWFudWFsIGFuZCBvdGhlciBkb2N1bWVudGF0aW9uIHJlc291cmNl cyBvbmxpbmUgYXQ6DQogICAgPGh0dHA6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9nZGIvZG9j dW1lbnRhdGlvbi8+Lg0KDQpGb3IgaGVscCwgdHlwZSAiaGVscCIuDQpUeXBlICJhcHJvcG9z IHdvcmQiIHRvIHNlYXJjaCBmb3IgY29tbWFuZHMgcmVsYXRlZCB0byAid29yZCIuDQooZ2Ri KSBzZXQgaGVpZ2h0IDANCihnZGIpIHNldCB3aWR0aCAwDQooZ2RiKSBkaXINClJlaW5pdGlh bGl6ZSBzb3VyY2UgcGF0aCB0byBlbXB0eT8gKHkgb3IgbikgeQ0KU291cmNlIGRpcmVjdG9y aWVzIHNlYXJjaGVkOiAkY2RpcjokY3dkDQooZ2RiKSBkaXIgL2hvbWUvc2ltYXJrL3NyYy9i aW51dGlscy1nZGIvZ2RiL3Rlc3RzdWl0ZS9nZGIudGhyZWFkcw0KU291cmNlIGRpcmVjdG9y aWVzIHNlYXJjaGVkOiAvaG9tZS9zaW1hcmsvc3JjL2JpbnV0aWxzLWdkYi9nZGIvdGVzdHN1 aXRlL2dkYi50aHJlYWRzOiRjZGlyOiRjd2QNCihnZGIpIGtpbGwNClRoZSBwcm9ncmFtIGlz IG5vdCBiZWluZyBydW4uDQooZ2RiKSBmaWxlIC9ob21lL3NpbWFyay9idWlsZC9iaW51dGls cy1nZGIvZ2RiL3Rlc3RzdWl0ZS9vdXRwdXRzL2dkYi50aHJlYWRzL2hhbmctYWZ0ZXItZXh0 LXNpZ2tpbGwvaGFuZy1hZnRlci1leHQtc2lna2lsbA0KUmVhZGluZyBzeW1ib2xzIGZyb20g L2hvbWUvc2ltYXJrL2J1aWxkL2JpbnV0aWxzLWdkYi9nZGIvdGVzdHN1aXRlL291dHB1dHMv Z2RiLnRocmVhZHMvaGFuZy1hZnRlci1leHQtc2lna2lsbC9oYW5nLWFmdGVyLWV4dC1zaWdr aWxsLi4uDQooTm8gZGVidWdnaW5nIHN5bWJvbHMgZm91bmQgaW4gL2hvbWUvc2ltYXJrL2J1 aWxkL2JpbnV0aWxzLWdkYi9nZGIvdGVzdHN1aXRlL291dHB1dHMvZ2RiLnRocmVhZHMvaGFu Zy1hZnRlci1leHQtc2lna2lsbC9oYW5nLWFmdGVyLWV4dC1zaWdraWxsKQ0KKGdkYikgZGVs ZXRlIGJyZWFrcG9pbnRzDQooZ2RiKSBpbmZvIGJyZWFrcG9pbnRzDQpObyBicmVha3BvaW50 cyBvciB3YXRjaHBvaW50cy4NCihnZGIpIHRicmVhayBtYWluDQpUZW1wb3JhcnkgYnJlYWtw b2ludCAxIGF0IDB4MTE2NQ0KKGdkYikgcnVuIA0KU3RhcnRpbmcgcHJvZ3JhbTogL2hvbWUv c2ltYXJrL2J1aWxkL2JpbnV0aWxzLWdkYi9nZGIvdGVzdHN1aXRlL291dHB1dHMvZ2RiLnRo cmVhZHMvaGFuZy1hZnRlci1leHQtc2lna2lsbC9oYW5nLWFmdGVyLWV4dC1zaWdraWxsIA0K W1RocmVhZCBkZWJ1Z2dpbmcgdXNpbmcgbGlidGhyZWFkX2RiIGVuYWJsZWRdDQpVc2luZyBo b3N0IGxpYnRocmVhZF9kYiBsaWJyYXJ5ICIvdXNyL2xpYi8uLi9saWIvbGlidGhyZWFkX2Ri LnNvLjEiLg0KDQpUZW1wb3JhcnkgYnJlYWtwb2ludCAxLCAweDAwMDA1NTU1NTU1NTUxNjUg aW4gbWFpbiAoKQ0KKGdkYikgaW5mbyBpbmZlcmlvciAxDQogIE51bSAgRGVzY3JpcHRpb24g ICAgICAgQ29ubmVjdGlvbiAgICAgICAgICAgRXhlY3V0YWJsZSAgICAgICAgDQoqIDEgICAg cHJvY2VzcyA1MTEzMDEgICAgMSAobmF0aXZlKSAgICAgICAgICAgL2hvbWUvc2ltYXJrL2J1 aWxkL2JpbnV0aWxzLWdkYi9nZGIvdGVzdHN1aXRlL291dHB1dHMvZ2RiLnRocmVhZHMvaGFu Zy1hZnRlci1leHQtc2lna2lsbC9oYW5nLWFmdGVyLWV4dC1zaWdraWxsIA0KKGdkYikgUEFT UzogZ2RiLnRocmVhZHMvaGFuZy1hZnRlci1leHQtc2lna2lsbC5leHA6IGdldCBpbmZlcmlv ciBwaWQKY29udGludWUNCkNvbnRpbnVpbmcuDQpQQVNTOiBnZGIudGhyZWFkcy9oYW5nLWFm dGVyLWV4dC1zaWdraWxsLmV4cDogY29udGludWUKW05ldyBUaHJlYWQgMHg3ZmZmZjdjNTM3 MDAgKExXUCA1MTEzMDUpXQ0KXkMNClRocmVhZCAyICJoYW5nLWFmdGVyLWV4dC0iIHJlY2Vp dmVkIHNpZ25hbCBTSUdJTlQsIEludGVycnVwdC4NCltTd2l0Y2hpbmcgdG8gVGhyZWFkIDB4 N2ZmZmY3YzUzNzAwIChMV1AgNTExMzA1KV0NCjB4MDAwMDdmZmZmN2Q1NjNjNSBpbiBjbG9u ZSAoKSBmcm9tIC91c3IvbGliL2xpYmMuc28uNg0KKGdkYikgUEFTUzogZ2RiLnRocmVhZHMv aGFuZy1hZnRlci1leHQtc2lna2lsbC5leHA6IGdldCBzaWdpbnQKc2hlbGwga2lsbCAtcyBT SUdLSUxMIDUxMTMwMQ0KKGdkYikgUEFTUzogZ2RiLnRocmVhZHMvaGFuZy1hZnRlci1leHQt c2lna2lsbC5leHA6IHNoZWxsIGtpbGwgLXMgU0lHS0lMTCBwaWQKY29udGludWUNCkNvbnRp bnVpbmcuDQpDb3VsZG4ndCBnZXQgcmVnaXN0ZXJzOiBObyBzdWNoIHByb2Nlc3MuDQooZ2Ri KSBjb250aW51ZQ0KQ29udGludWluZy4NCkNvdWxkbid0IGdldCByZWdpc3RlcnM6IE5vIHN1 Y2ggcHJvY2Vzcy4NCihnZGIpIEZBSUw6IGdkYi50aHJlYWRzL2hhbmctYWZ0ZXItZXh0LXNp Z2tpbGwuZXhwOiBjb250aW51ZQp0ZXN0Y2FzZSAvaG9tZS9zaW1hcmsvc3JjL2JpbnV0aWxz LWdkYi9nZGIvdGVzdHN1aXRlL2dkYi50aHJlYWRzL2hhbmctYWZ0ZXItZXh0LXNpZ2tpbGwu ZXhwIGNvbXBsZXRlZCBpbiAxIHNlY29uZHMKCgkJPT09IGdkYiBTdW1tYXJ5ID09PQoKIyBv ZiBleHBlY3RlZCBwYXNzZXMJCTUKIyBvZiB1bmV4cGVjdGVkIGZhaWx1cmVzCTEKRXhlY3V0 aW5nIG9uIGhvc3Q6IC9ob21lL3NpbWFyay9idWlsZC9iaW51dGlscy1nZGIvZ2RiL3Rlc3Rz dWl0ZS8uLi8uLi9nZGIvZ2RiIC1udyAtbnggLWRhdGEtZGlyZWN0b3J5IC9ob21lL3NpbWFy ay9idWlsZC9iaW51dGlscy1nZGIvZ2RiL3Rlc3RzdWl0ZS8uLi9kYXRhLWRpcmVjdG9yeSAt LXZlcnNpb24gICAgKHRpbWVvdXQgPSAzMDApCnNwYXduIC1pZ25vcmUgU0lHSFVQIC9ob21l L3NpbWFyay9idWlsZC9iaW51dGlscy1nZGIvZ2RiL3Rlc3RzdWl0ZS8uLi8uLi9nZGIvZ2Ri IC1udyAtbnggLWRhdGEtZGlyZWN0b3J5IC9ob21lL3NpbWFyay9idWlsZC9iaW51dGlscy1n ZGIvZ2RiL3Rlc3RzdWl0ZS8uLi9kYXRhLWRpcmVjdG9yeSAtLXZlcnNpb24NCndhcm5pbmc6 IEZvdW5kIGN1c3RvbSBoYW5kbGVyIGZvciBzaWduYWwgNyAoQnVzIGVycm9yKSBwcmVpbnN0 YWxsZWQuDQp3YXJuaW5nOiBGb3VuZCBjdXN0b20gaGFuZGxlciBmb3Igc2lnbmFsIDggKEZs b2F0aW5nIHBvaW50IGV4Y2VwdGlvbikgcHJlaW5zdGFsbGVkLg0Kd2FybmluZzogRm91bmQg Y3VzdG9tIGhhbmRsZXIgZm9yIHNpZ25hbCAxMSAoU2VnbWVudGF0aW9uIGZhdWx0KSBwcmVp bnN0YWxsZWQuDQpTb21lIHNpZ25hbCBkaXNwb3NpdGlvbnMgaW5oZXJpdGVkIGZyb20gdGhl IGVudmlyb25tZW50IChTSUdfREZML1NJR19JR04pDQp3b24ndCBiZSBwcm9wYWdhdGVkIHRv IHNwYXduZWQgcHJvZ3JhbXMuDQpHTlUgZ2RiIChHREIpIDEwLjAuNTAuMjAyMDAzMjQtZ2l0 DQpDb3B5cmlnaHQgKEMpIDIwMjAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuDQpM aWNlbnNlIEdQTHYzKzogR05VIEdQTCB2ZXJzaW9uIDMgb3IgbGF0ZXIgPGh0dHA6Ly9nbnUu b3JnL2xpY2Vuc2VzL2dwbC5odG1sPg0KVGhpcyBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgYXJl IGZyZWUgdG8gY2hhbmdlIGFuZCByZWRpc3RyaWJ1dGUgaXQuDQpUaGVyZSBpcyBOTyBXQVJS QU5UWSwgdG8gdGhlIGV4dGVudCBwZXJtaXR0ZWQgYnkgbGF3Lg0KL2hvbWUvc2ltYXJrL2J1 aWxkL2JpbnV0aWxzLWdkYi9nZGIvZ2RiIHZlcnNpb24gIDExIC1udyAtbnggLWRhdGEtZGly ZWN0b3J5IC9ob21lL3NpbWFyay9idWlsZC9iaW51dGlscy1nZGIvZ2RiL3Rlc3RzdWl0ZS8u Li9kYXRhLWRpcmVjdG9yeSAKCnJ1bnRlc3QgY29tcGxldGVkIGF0IFR1ZSBNYXIgMjQgMTA6 NDY6NTggMjAyMAo= --------------B05C081925994325B5B01E88--