From mboxrd@z Thu Jan 1 00:00:00 1970 Content-Type: multipart/mixed; boundary="===============6912987258529298685==" MIME-Version: 1.0 From: Ernest Zaslavsky Subject: Re: [SPDK] Code robustness test Date: Thu, 08 Feb 2018 07:57:06 +0200 Message-ID: <5a7be6b5.cbbd500a.d274d.a3d9@mx.google.com> In-Reply-To: 82C9F782B054C94B9FC04A331649C77AA63FAB7B@FMSMSX108.amr.corp.intel.com List-ID: To: spdk@lists.01.org --===============6912987258529298685== Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Hi Paul, Thanks for your reply. I wasn=E2=80=99t clear enough with my question. Sure= you have tests in SPDK, but I was asking for something that may assist me = in testing my code. I=E2=80=99m writing something that uses NVMe driver. I= =E2=80=99m trying to handle errors where applicable. Now I want to simulate= real world problems which may occur (like controller reset) and see if my = code handles such a situation. Thanks, E. From: Luse, Paul E Sent: Thursday, February 8, 2018 1:37 AM To: Storage Performance Development Kit Subject: Re: [SPDK] Code robustness test Hi, SPDK is tested in =E2=80=9Ctiers=E2=80=9D and nvme is no different other th= an it may have more robust tests than some of the other modules due to its = maturity: - unit tests:=C2=A0 Look in /spdk/test/unit/lib/nvme and you=E2=80=99ll fin= d =E2=80=9Cper file=E2=80=9D unit tests that use C-unit.=C2=A0 These are, o= f course, SW only tests focused around exercising the public API in each fi= le geared towards catching regressions.=C2=A0 Every new public function add= ed is required to have a new unit test. Coverage reports are available on t= he CI page at spdk.io and there are clearly opportunities there for anyone = that wants to beef it up. - component level tests attempt to isolate just a pustular module (sometime= s a few other are required to be involved) and use either real hardware or = run on a VM with emulated NVMe devices.=C2=A0 They are in spdk/test/lib/nvm= e mainly via nvme.sh however you=E2=80=99ll find a few standalone focused t= ests that operate solely on the component, like sgl, in cases where we real= ly want to throw strange things at complicated code (like sgl and prp creat= ion). You=E2=80=99ll find a few other focused tets in here like hotplug.sh = for hotplug testing and aer for Async Event Requests and overhead for laten= cy measurements - system: there are bunch of other tests that use NVMe as a back end but ar= e focused on system level applications that are part of SPDK like the NVMe-= oF target tests, the vHost tests. iSCSI tests, etc. - performance: these are pretty manual right now so there=E2=80=99s not muc= h to point at but as the name implies they=E2=80=99re really about performa= nce stress testing. Basically there=E2=80=99s a TON of tests in the repo. There=E2=80=99s a lot= of activity right now ongoing to beef up the automated testing, to move ou= r CI over to Jenkins and to rework the dozens of bash scripts that control = the various tests.=C2=A0 The goal there is to make it easier for anyone to = come in and find what they are interested in to either understand testing, = help beef it up or reproduce a failure locally that they encountered on a p= atch in CI. After you dig around a little feel free to ask more questions and someone w= ill jump in and provide more detail.=C2=A0 As the effort I just mentioned m= akes progress there will be new docs added to http://spdk.io that explain t= he test strategy and hierarchy in a clear way - we hope =E2=98=BA -Paul From: SPDK [mailto:spdk-bounces(a)lists.01.org] On Behalf Of E.W.Z. Sent: Wednesday, February 7, 2018 9:14 AM To: Storage Performance Development Kit Subject: [SPDK] Code robustness test Hi, Is there anything that can wreck havoc on NVMe to check how well the code c= opes with it? Something like a script or utility that runs in background an= d resets PCIe controller, detaches disks and anything else that could theor= etically happen to NVMe. Thanks, E. --===============6912987258529298685== Content-Type: text/html MIME-Version: 1.0 Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="attachment.html" PGh0bWwgeG1sbnM6bz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6b2ZmaWNlIiB4 bWxuczp3PSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTp3b3JkIiB4bWxuczptPSJo dHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL29mZmljZS8yMDA0LzEyL29tbWwiIHhtbG5zPSJo dHRwOi8vd3d3LnczLm9yZy9UUi9SRUMtaHRtbDQwIj48aGVhZD48bWV0YSBodHRwLWVxdWl2PUNv bnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiPjxtZXRhIG5hbWU9 R2VuZXJhdG9yIGNvbnRlbnQ9Ik1pY3Jvc29mdCBXb3JkIDE1IChmaWx0ZXJlZCBtZWRpdW0pIj48 c3R5bGU+PCEtLQovKiBGb250IERlZmluaXRpb25zICovCkBmb250LWZhY2UKCXtmb250LWZhbWls eTpXaW5nZGluZ3M7CglwYW5vc2UtMTo1IDAgMCAwIDAgMCAwIDAgMCAwO30KQGZvbnQtZmFjZQoJ e2ZvbnQtZmFtaWx5OiJDYW1icmlhIE1hdGgiOwoJcGFub3NlLTE6MiA0IDUgMyA1IDQgNiAzIDIg NDt9CkBmb250LWZhY2UKCXtmb250LWZhbWlseTpDYWxpYnJpOwoJcGFub3NlLTE6MiAxNSA1IDIg MiAyIDQgMyAyIDQ7fQovKiBTdHlsZSBEZWZpbml0aW9ucyAqLwpwLk1zb05vcm1hbCwgbGkuTXNv Tm9ybWFsLCBkaXYuTXNvTm9ybWFsCgl7bWFyZ2luOjBpbjsKCW1hcmdpbi1ib3R0b206LjAwMDFw dDsKCWZvbnQtc2l6ZToxMS4wcHQ7Cglmb250LWZhbWlseToiQ2FsaWJyaSIsc2Fucy1zZXJpZjt9 CmE6bGluaywgc3Bhbi5Nc29IeXBlcmxpbmsKCXttc28tc3R5bGUtcHJpb3JpdHk6OTk7Cgljb2xv cjpibHVlOwoJdGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZTt9CmE6dmlzaXRlZCwgc3Bhbi5Nc29I eXBlcmxpbmtGb2xsb3dlZAoJe21zby1zdHlsZS1wcmlvcml0eTo5OTsKCWNvbG9yOiM5NTRGNzI7 Cgl0ZXh0LWRlY29yYXRpb246dW5kZXJsaW5lO30KLk1zb0NocERlZmF1bHQKCXttc28tc3R5bGUt dHlwZTpleHBvcnQtb25seTt9CkBwYWdlIFdvcmRTZWN0aW9uMQoJe3NpemU6OC41aW4gMTEuMGlu OwoJbWFyZ2luOjEuMGluIDEuMGluIDEuMGluIDEuMGluO30KZGl2LldvcmRTZWN0aW9uMQoJe3Bh Z2U6V29yZFNlY3Rpb24xO30KLS0+PC9zdHlsZT48L2hlYWQ+PGJvZHkgbGFuZz1FTi1VUyBsaW5r PWJsdWUgdmxpbms9IiM5NTRGNzIiPjxkaXYgY2xhc3M9V29yZFNlY3Rpb24xPjxwIGNsYXNzPU1z b05vcm1hbD5IaSBQYXVsLDwvcD48cCBjbGFzcz1Nc29Ob3JtYWw+VGhhbmtzIGZvciB5b3VyIHJl cGx5LiBJIHdhc27igJl0IGNsZWFyIGVub3VnaCB3aXRoIG15IHF1ZXN0aW9uLiBTdXJlIHlvdSBo YXZlIHRlc3RzIGluIFNQREssIGJ1dCBJIHdhcyBhc2tpbmcgZm9yIHNvbWV0aGluZyB0aGF0IG1h eSBhc3Npc3QgbWUgaW4gdGVzdGluZyBteSBjb2RlLiBJ4oCZbSB3cml0aW5nIHNvbWV0aGluZyB0 aGF0IHVzZXMgTlZNZSBkcml2ZXIuIEnigJltIHRyeWluZyB0byBoYW5kbGUgZXJyb3JzIHdoZXJl IGFwcGxpY2FibGUuIE5vdyBJIHdhbnQgdG8gc2ltdWxhdGUgcmVhbCB3b3JsZCBwcm9ibGVtcyB3 aGljaCBtYXkgb2NjdXIgKGxpa2UgY29udHJvbGxlciByZXNldCkgYW5kIHNlZSBpZiBteSBjb2Rl IGhhbmRsZXMgc3VjaCBhIHNpdHVhdGlvbi48L3A+PHAgY2xhc3M9TXNvTm9ybWFsPlRoYW5rcyw8 L3A+PHAgY2xhc3M9TXNvTm9ybWFsPkUuPC9wPjxwIGNsYXNzPU1zb05vcm1hbD48bzpwPiZuYnNw OzwvbzpwPjwvcD48ZGl2IHN0eWxlPSdtc28tZWxlbWVudDpwYXJhLWJvcmRlci1kaXY7Ym9yZGVy Om5vbmU7Ym9yZGVyLXRvcDpzb2xpZCAjRTFFMUUxIDEuMHB0O3BhZGRpbmc6My4wcHQgMGluIDBp biAwaW4nPjxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nYm9yZGVyOm5vbmU7cGFkZGluZzowaW4n PjxiPkZyb206IDwvYj48YSBocmVmPSJtYWlsdG86cGF1bC5lLmx1c2VAaW50ZWwuY29tIj5MdXNl LCBQYXVsIEU8L2E+PGJyPjxiPlNlbnQ6IDwvYj5UaHVyc2RheSwgRmVicnVhcnkgOCwgMjAxOCAx OjM3IEFNPGJyPjxiPlRvOiA8L2I+PGEgaHJlZj0ibWFpbHRvOnNwZGtAbGlzdHMuMDEub3JnIj5T dG9yYWdlIFBlcmZvcm1hbmNlIERldmVsb3BtZW50IEtpdDwvYT48YnI+PGI+U3ViamVjdDogPC9i PlJlOiBbU1BES10gQ29kZSByb2J1c3RuZXNzIHRlc3Q8L3A+PC9kaXY+PHAgY2xhc3M9TXNvTm9y bWFsPjxvOnA+Jm5ic3A7PC9vOnA+PC9wPjxwIGNsYXNzPU1zb05vcm1hbD48c3BhbiBzdHlsZT0n Y29sb3I6IzFGNDk3RCc+SGksPG86cD48L286cD48L3NwYW4+PC9wPjxwIGNsYXNzPU1zb05vcm1h bD48c3BhbiBzdHlsZT0nY29sb3I6IzFGNDk3RCc+PG86cD4mbmJzcDs8L286cD48L3NwYW4+PC9w PjxwIGNsYXNzPU1zb05vcm1hbD48c3BhbiBzdHlsZT0nY29sb3I6IzFGNDk3RCc+U1BESyBpcyB0 ZXN0ZWQgaW4g4oCcdGllcnPigJ0gYW5kIG52bWUgaXMgbm8gZGlmZmVyZW50IG90aGVyIHRoYW4g aXQgbWF5IGhhdmUgbW9yZSByb2J1c3QgdGVzdHMgdGhhbiBzb21lIG9mIHRoZSBvdGhlciBtb2R1 bGVzIGR1ZSB0byBpdHMgbWF0dXJpdHk6PG86cD48L286cD48L3NwYW4+PC9wPjxwIGNsYXNzPU1z b05vcm1hbD48c3BhbiBzdHlsZT0nY29sb3I6IzFGNDk3RCc+PG86cD4mbmJzcDs8L286cD48L3Nw YW4+PC9wPjxwIGNsYXNzPU1zb05vcm1hbD48c3BhbiBzdHlsZT0nY29sb3I6IzFGNDk3RCc+LSB1 bml0IHRlc3RzOiZuYnNwOyBMb29rIGluIC9zcGRrL3Rlc3QvdW5pdC9saWIvbnZtZSBhbmQgeW91 4oCZbGwgZmluZCDigJxwZXIgZmlsZeKAnSB1bml0IHRlc3RzIHRoYXQgdXNlIEMtdW5pdC4mbmJz cDsgVGhlc2UgYXJlLCBvZiBjb3Vyc2UsIFNXIG9ubHkgdGVzdHMgZm9jdXNlZCBhcm91bmQgZXhl cmNpc2luZyB0aGUgcHVibGljIEFQSSBpbiBlYWNoIGZpbGUgZ2VhcmVkIHRvd2FyZHMgY2F0Y2hp bmcgcmVncmVzc2lvbnMuJm5ic3A7IEV2ZXJ5IG5ldyBwdWJsaWMgZnVuY3Rpb24gYWRkZWQgaXMg cmVxdWlyZWQgdG8gaGF2ZSBhIG5ldyB1bml0IHRlc3QuIENvdmVyYWdlIHJlcG9ydHMgYXJlIGF2 YWlsYWJsZSBvbiB0aGUgQ0kgcGFnZSBhdCBzcGRrLmlvIGFuZCB0aGVyZSBhcmUgY2xlYXJseSBv cHBvcnR1bml0aWVzIHRoZXJlIGZvciBhbnlvbmUgdGhhdCB3YW50cyB0byBiZWVmIGl0IHVwLjxv OnA+PC9vOnA+PC9zcGFuPjwvcD48cCBjbGFzcz1Nc29Ob3JtYWw+PHNwYW4gc3R5bGU9J2NvbG9y OiMxRjQ5N0QnPi0gY29tcG9uZW50IGxldmVsIHRlc3RzIGF0dGVtcHQgdG8gaXNvbGF0ZSBqdXN0 IGEgcHVzdHVsYXIgbW9kdWxlIChzb21ldGltZXMgYSBmZXcgb3RoZXIgYXJlIHJlcXVpcmVkIHRv IGJlIGludm9sdmVkKSBhbmQgdXNlIGVpdGhlciByZWFsIGhhcmR3YXJlIG9yIHJ1biBvbiBhIFZN IHdpdGggZW11bGF0ZWQgTlZNZSBkZXZpY2VzLiZuYnNwOyBUaGV5IGFyZSBpbiBzcGRrL3Rlc3Qv bGliL252bWUgbWFpbmx5IHZpYSBudm1lLnNoIGhvd2V2ZXIgeW914oCZbGwgZmluZCBhIGZldyBz dGFuZGFsb25lIGZvY3VzZWQgdGVzdHMgdGhhdCBvcGVyYXRlIHNvbGVseSBvbiB0aGUgY29tcG9u ZW50LCBsaWtlIHNnbCwgaW4gY2FzZXMgd2hlcmUgd2UgcmVhbGx5IHdhbnQgdG8gdGhyb3cgc3Ry YW5nZSB0aGluZ3MgYXQgY29tcGxpY2F0ZWQgY29kZSAobGlrZSBzZ2wgYW5kIHBycCBjcmVhdGlv bikuIFlvdeKAmWxsIGZpbmQgYSBmZXcgb3RoZXIgZm9jdXNlZCB0ZXRzIGluIGhlcmUgbGlrZSBo b3RwbHVnLnNoIGZvciBob3RwbHVnIHRlc3RpbmcgYW5kIGFlciBmb3IgQXN5bmMgRXZlbnQgUmVx dWVzdHMgYW5kIG92ZXJoZWFkIGZvciBsYXRlbmN5IG1lYXN1cmVtZW50czxvOnA+PC9vOnA+PC9z cGFuPjwvcD48cCBjbGFzcz1Nc29Ob3JtYWw+PHNwYW4gc3R5bGU9J2NvbG9yOiMxRjQ5N0QnPi0g c3lzdGVtOiB0aGVyZSBhcmUgYnVuY2ggb2Ygb3RoZXIgdGVzdHMgdGhhdCB1c2UgTlZNZSBhcyBh IGJhY2sgZW5kIGJ1dCBhcmUgZm9jdXNlZCBvbiBzeXN0ZW0gbGV2ZWwgYXBwbGljYXRpb25zIHRo YXQgYXJlIHBhcnQgb2YgU1BESyBsaWtlIHRoZSBOVk1lLW9GIHRhcmdldCB0ZXN0cywgdGhlIHZI b3N0IHRlc3RzLiBpU0NTSSB0ZXN0cywgZXRjLjxvOnA+PC9vOnA+PC9zcGFuPjwvcD48cCBjbGFz cz1Nc29Ob3JtYWw+PHNwYW4gc3R5bGU9J2NvbG9yOiMxRjQ5N0QnPi0gcGVyZm9ybWFuY2U6IHRo ZXNlIGFyZSBwcmV0dHkgbWFudWFsIHJpZ2h0IG5vdyBzbyB0aGVyZeKAmXMgbm90IG11Y2ggdG8g cG9pbnQgYXQgYnV0IGFzIHRoZSBuYW1lIGltcGxpZXMgdGhleeKAmXJlIHJlYWxseSBhYm91dCBw ZXJmb3JtYW5jZSBzdHJlc3MgdGVzdGluZy48bzpwPjwvbzpwPjwvc3Bhbj48L3A+PHAgY2xhc3M9 TXNvTm9ybWFsPjxzcGFuIHN0eWxlPSdjb2xvcjojMUY0OTdEJz48bzpwPiZuYnNwOzwvbzpwPjwv c3Bhbj48L3A+PHAgY2xhc3M9TXNvTm9ybWFsPjxzcGFuIHN0eWxlPSdjb2xvcjojMUY0OTdEJz5C YXNpY2FsbHkgdGhlcmXigJlzIGEgVE9OIG9mIHRlc3RzIGluIHRoZSByZXBvLiBUaGVyZeKAmXMg YSBsb3Qgb2YgYWN0aXZpdHkgcmlnaHQgbm93IG9uZ29pbmcgdG8gYmVlZiB1cCB0aGUgYXV0b21h dGVkIHRlc3RpbmcsIHRvIG1vdmUgb3VyIENJIG92ZXIgdG8gSmVua2lucyBhbmQgdG8gcmV3b3Jr IHRoZSBkb3plbnMgb2YgYmFzaCBzY3JpcHRzIHRoYXQgY29udHJvbCB0aGUgdmFyaW91cyB0ZXN0 cy4mbmJzcDsgVGhlIGdvYWwgdGhlcmUgaXMgdG8gbWFrZSBpdCBlYXNpZXIgZm9yIGFueW9uZSB0 byBjb21lIGluIGFuZCBmaW5kIHdoYXQgdGhleSBhcmUgaW50ZXJlc3RlZCBpbiB0byBlaXRoZXIg dW5kZXJzdGFuZCB0ZXN0aW5nLCBoZWxwIGJlZWYgaXQgdXAgb3IgcmVwcm9kdWNlIGEgZmFpbHVy ZSBsb2NhbGx5IHRoYXQgdGhleSBlbmNvdW50ZXJlZCBvbiBhIHBhdGNoIGluIENJLjxvOnA+PC9v OnA+PC9zcGFuPjwvcD48cCBjbGFzcz1Nc29Ob3JtYWw+PHNwYW4gc3R5bGU9J2NvbG9yOiMxRjQ5 N0QnPjxvOnA+Jm5ic3A7PC9vOnA+PC9zcGFuPjwvcD48cCBjbGFzcz1Nc29Ob3JtYWw+PHNwYW4g c3R5bGU9J2NvbG9yOiMxRjQ5N0QnPkFmdGVyIHlvdSBkaWcgYXJvdW5kIGEgbGl0dGxlIGZlZWwg ZnJlZSB0byBhc2sgbW9yZSBxdWVzdGlvbnMgYW5kIHNvbWVvbmUgd2lsbCBqdW1wIGluIGFuZCBw cm92aWRlIG1vcmUgZGV0YWlsLiZuYnNwOyBBcyB0aGUgZWZmb3J0IEkganVzdCBtZW50aW9uZWQg bWFrZXMgcHJvZ3Jlc3MgdGhlcmUgd2lsbCBiZSBuZXcgZG9jcyBhZGRlZCB0byA8YSBocmVmPSJo dHRwOi8vc3Bkay5pbyI+aHR0cDovL3NwZGsuaW88L2E+IHRoYXQgZXhwbGFpbiB0aGUgdGVzdCBz dHJhdGVneSBhbmQgaGllcmFyY2h5IGluIGEgY2xlYXIgd2F5IC0gd2UgaG9wZSA8L3NwYW4+PHNw YW4gc3R5bGU9J2ZvbnQtZmFtaWx5OldpbmdkaW5ncztjb2xvcjojMUY0OTdEJz5KPC9zcGFuPjxz cGFuIHN0eWxlPSdjb2xvcjojMUY0OTdEJz48bzpwPjwvbzpwPjwvc3Bhbj48L3A+PHAgY2xhc3M9 TXNvTm9ybWFsPjxzcGFuIHN0eWxlPSdjb2xvcjojMUY0OTdEJz48bzpwPiZuYnNwOzwvbzpwPjwv c3Bhbj48L3A+PHAgY2xhc3M9TXNvTm9ybWFsPjxzcGFuIHN0eWxlPSdjb2xvcjojMUY0OTdEJz4t UGF1bDxvOnA+PC9vOnA+PC9zcGFuPjwvcD48cCBjbGFzcz1Nc29Ob3JtYWw+PHNwYW4gc3R5bGU9 J2NvbG9yOiMxRjQ5N0QnPjxvOnA+Jm5ic3A7PC9vOnA+PC9zcGFuPjwvcD48cCBjbGFzcz1Nc29O b3JtYWw+PHNwYW4gc3R5bGU9J2NvbG9yOiMxRjQ5N0QnPjxvOnA+Jm5ic3A7PC9vOnA+PC9zcGFu PjwvcD48cCBjbGFzcz1Nc29Ob3JtYWw+PGEgbmFtZT0iX01haWxFbmRDb21wb3NlIj48L2E+PHNw YW4gc3R5bGU9J2NvbG9yOiMxRjQ5N0QnPjxvOnA+Jm5ic3A7PC9vOnA+PC9zcGFuPjwvcD48ZGl2 PjxkaXYgc3R5bGU9J2JvcmRlcjpub25lO2JvcmRlci10b3A6c29saWQgI0UxRTFFMSAxLjBwdDtw YWRkaW5nOjMuMHB0IDBpbiAwaW4gMGluJz48cCBjbGFzcz1Nc29Ob3JtYWw+PGEgbmFtZT0iX19f X19yZXBseXNlcGFyYXRvciI+PC9hPjxiPkZyb206PC9iPiBTUERLIFttYWlsdG86c3Bkay1ib3Vu Y2VzQGxpc3RzLjAxLm9yZ10gPGI+T24gQmVoYWxmIE9mIDwvYj5FLlcuWi48YnI+PGI+U2VudDo8 L2I+IFdlZG5lc2RheSwgRmVicnVhcnkgNywgMjAxOCA5OjE0IEFNPGJyPjxiPlRvOjwvYj4gU3Rv cmFnZSBQZXJmb3JtYW5jZSBEZXZlbG9wbWVudCBLaXQgJmx0O3NwZGtAbGlzdHMuMDEub3JnJmd0 Ozxicj48Yj5TdWJqZWN0OjwvYj4gW1NQREtdIENvZGUgcm9idXN0bmVzcyB0ZXN0PG86cD48L286 cD48L3A+PC9kaXY+PC9kaXY+PHAgY2xhc3M9TXNvTm9ybWFsPjxvOnA+Jm5ic3A7PC9vOnA+PC9w PjxwIGNsYXNzPU1zb05vcm1hbD5IaSw8bzpwPjwvbzpwPjwvcD48cCBjbGFzcz1Nc29Ob3JtYWw+ SXMgdGhlcmUgYW55dGhpbmcgdGhhdCBjYW4gd3JlY2sgaGF2b2Mgb24gTlZNZSB0byBjaGVjayBo b3cgd2VsbCB0aGUgY29kZSBjb3BlcyB3aXRoIGl0PyBTb21ldGhpbmcgbGlrZSBhIHNjcmlwdCBv ciB1dGlsaXR5IHRoYXQgcnVucyBpbiBiYWNrZ3JvdW5kIGFuZCByZXNldHMgUENJZSBjb250cm9s bGVyLCBkZXRhY2hlcyBkaXNrcyBhbmQgYW55dGhpbmcgZWxzZSB0aGF0IGNvdWxkIHRoZW9yZXRp Y2FsbHkgaGFwcGVuIHRvIE5WTWUuPG86cD48L286cD48L3A+PHAgY2xhc3M9TXNvTm9ybWFsPlRo YW5rcyw8bzpwPjwvbzpwPjwvcD48cCBjbGFzcz1Nc29Ob3JtYWw+RS48bzpwPjwvbzpwPjwvcD48 cCBjbGFzcz1Nc29Ob3JtYWw+PG86cD4mbmJzcDs8L286cD48L3A+PHAgY2xhc3M9TXNvTm9ybWFs PjxvOnA+Jm5ic3A7PC9vOnA+PC9wPjwvZGl2PjwvYm9keT48L2h0bWw+ --===============6912987258529298685==--