From mboxrd@z Thu Jan 1 00:00:00 1970 Content-Type: multipart/mixed; boundary="===============4418307312295362873==" MIME-Version: 1.0 From: Harris, James R Subject: Re: [SPDK] Request for comments regarding latency measurements Date: Tue, 14 Nov 2017 16:00:48 +0000 Message-ID: In-Reply-To: 82C9F782B054C94B9FC04A331649C77A9D42A310@FMSMSX108.amr.corp.intel.com List-ID: To: spdk@lists.01.org --===============4418307312295362873== Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Or we leave out the reset stats API and provide helper functions on the cli= ent side (in Python) to diff results from two calls to spdk_bdev_get_io_sta= t(). From: SPDK on behalf of Paul E Luse Reply-To: Storage Performance Development Kit Date: Tuesday, November 14, 2017 at 7:50 AM To: Storage Performance Development Kit Subject: Re: [SPDK] Request for comments regarding latency measurements Or maybe as an initial separate patch remove the auto-reset and add a new A= PI to reset stats=E2=80=A6. From: SPDK [mailto:spdk-bounces(a)lists.01.org] On Behalf Of Harris, James R Sent: Tuesday, November 14, 2017 8:43 AM To: Storage Performance Development Kit Subject: Re: [SPDK] Request for comments regarding latency measurements Agreed - #2 is the way to go. While we=E2=80=99re on the topic - should we be resetting the stats when sp= dk_bdev_get_io_stat() is called? This eliminates the ability for two separ= ate applications to monitor stats in parallel =E2=80=93 or even a separate = application plus some future yet-to-be-written internal load-balancing moni= tor. I=E2=80=99m thinking that bdev should just keep the running total and= let the caller own tracking differences from the last time it called spdk_= bdev_get_io_stat(). -Jim From: SPDK = > on behalf of Nathan Marushak > Reply-To: Storage Performance Development Kit > Date: Tuesday, November 14, 2017 at 7:29 AM To: Storage Performance Development Kit > Subject: Re: [SPDK] Request for comments regarding latency measurements So, not being the technical expert so to speak =E2=98=BA, please take this = with a grain of salt. Agree with option #2. Seems like this would allow for= keeping stats across the different device types e.g. NVMe, NVML, NVMe-oF (= although that has a transport within NVMe, so it might be covered for eithe= r option). From: SPDK [mailto:spdk-bounces(a)lists.01.org] On Behalf Of Luse, Paul E Sent: Tuesday, November 14, 2017 7:57 AM To: Storage Performance Development Kit > Subject: Re: [SPDK] Request for comments regarding latency measurements FWIW option 2 sounds like the most appropriate to me=E2=80=A6 Thx Paul From: SPDK [mailto:spdk-bounces(a)lists.01.org] On Behalf Of Paul Von-Stamw= itz Sent: Monday, November 13, 2017 7:29 PM To: spdk(a)lists.01.org Subject: [SPDK] Request for comments regarding latency measurements Background: Bdev.c currently maintains a count of reads/writes/bytes_read/bytes_written= in channel->stat. This information is retrieved (and reset) via spdk_bdev_= get_io_stat. Proposal: Add latency information to channel->stat and enable the option to provide a= histogram. We can measure the latency of each IO and keep a running total on a read/wr= ite basis. We can also use the measured latency to keep a running count of = reads/writes in their associated histogram =E2=80=9Cbuckets=E2=80=9D. The question is, how do we measure latency? Option 1: Measure latency at the NVMe tracker . Currently, we already timestamp every command placed on the tracker if the = abort timeout callback is registered. When we remove a completed IO from th= e tracker, we can timestamp it again and calculate the latency. There are several issues here that need to be considered. We need to get the latency information back up to the bdev layer, most like= ly through a callback argument, but this would require a change the NVMe AP= I. If the bdev breaks down a request into smaller IOs, it can add up the la= tencies of the child IOs for io_stat and histogram purposes. Also, this method does not take into account any latency added by the spdk = bdev/nvme layers (except the poller.) If a request was queued before being = placed on the tracker, then the time it was queued is not factored into the= latency calculation. Option 2: Measure latency at the bdev layer. We can timestamp at submit and again at completion. This would keep all io_= stat information local to bdev and would take into account the overhead of = most queued operations. Any applications written directly to the NVMe layer= would have to calculate their own latencies, but that is currently true fo= r all io_stats. I=E2=80=99m sure that there are other issues I am missing, but I would appr= eciate any comments on how best to move forward on this. Thanks, Paul --===============4418307312295362873== Content-Type: text/html MIME-Version: 1.0 Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="attachment.html" PGh0bWwgeG1sbnM6bz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6b2ZmaWNlIiB4 bWxuczp3PSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTp3b3JkIiB4bWxuczptPSJo dHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL29mZmljZS8yMDA0LzEyL29tbWwiIHhtbG5zPSJo dHRwOi8vd3d3LnczLm9yZy9UUi9SRUMtaHRtbDQwIj4NCjxoZWFkPg0KPG1ldGEgaHR0cC1lcXVp dj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiPg0KPG1l dGEgbmFtZT0iVGl0bGUiIGNvbnRlbnQ9IiI+DQo8bWV0YSBuYW1lPSJLZXl3b3JkcyIgY29udGVu dD0iIj4NCjxtZXRhIG5hbWU9IkdlbmVyYXRvciIgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgMTUg KGZpbHRlcmVkIG1lZGl1bSkiPg0KPHN0eWxlPjwhLS0NCi8qIEZvbnQgRGVmaW5pdGlvbnMgKi8N CkBmb250LWZhY2UNCgl7Zm9udC1mYW1pbHk6V2luZ2RpbmdzOw0KCXBhbm9zZS0xOjUgMCAwIDAg MCAwIDAgMCAwIDA7fQ0KQGZvbnQtZmFjZQ0KCXtmb250LWZhbWlseToiQ2FtYnJpYSBNYXRoIjsN CglwYW5vc2UtMToyIDQgNSAzIDUgNCA2IDMgMiA0O30NCkBmb250LWZhY2UNCgl7Zm9udC1mYW1p bHk6RGVuZ1hpYW47DQoJcGFub3NlLTE6MiAxIDYgMCAzIDEgMSAxIDEgMTt9DQpAZm9udC1mYWNl DQoJe2ZvbnQtZmFtaWx5OkNhbGlicmk7DQoJcGFub3NlLTE6MiAxNSA1IDIgMiAyIDQgMyAyIDQ7 fQ0KQGZvbnQtZmFjZQ0KCXtmb250LWZhbWlseToiSW50ZWwgQ2xlYXIiOw0KCXBhbm9zZS0xOjIg MTEgNiA0IDIgMiAzIDIgMiA0O30NCi8qIFN0eWxlIERlZmluaXRpb25zICovDQpwLk1zb05vcm1h bCwgbGkuTXNvTm9ybWFsLCBkaXYuTXNvTm9ybWFsDQoJe21hcmdpbjowaW47DQoJbWFyZ2luLWJv dHRvbTouMDAwMXB0Ow0KCWZvbnQtc2l6ZToxMS4wcHQ7DQoJZm9udC1mYW1pbHk6Q2FsaWJyaTt9 DQphOmxpbmssIHNwYW4uTXNvSHlwZXJsaW5rDQoJe21zby1zdHlsZS1wcmlvcml0eTo5OTsNCglj b2xvcjpibHVlOw0KCXRleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmU7fQ0KYTp2aXNpdGVkLCBzcGFu Lk1zb0h5cGVybGlua0ZvbGxvd2VkDQoJe21zby1zdHlsZS1wcmlvcml0eTo5OTsNCgljb2xvcjpw dXJwbGU7DQoJdGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZTt9DQpwLk1zb0xpc3RQYXJhZ3JhcGgs IGxpLk1zb0xpc3RQYXJhZ3JhcGgsIGRpdi5Nc29MaXN0UGFyYWdyYXBoDQoJe21zby1zdHlsZS1w cmlvcml0eTozNDsNCgltYXJnaW4tdG9wOjBpbjsNCgltYXJnaW4tcmlnaHQ6MGluOw0KCW1hcmdp bi1ib3R0b206MGluOw0KCW1hcmdpbi1sZWZ0Oi41aW47DQoJbWFyZ2luLWJvdHRvbTouMDAwMXB0 Ow0KCWZvbnQtc2l6ZToxMS4wcHQ7DQoJZm9udC1mYW1pbHk6Q2FsaWJyaTt9DQpzcGFuLkVtYWls U3R5bGUxOA0KCXttc28tc3R5bGUtdHlwZTpwZXJzb25hbDsNCglmb250LWZhbWlseTpDYWxpYnJp Ow0KCWNvbG9yOndpbmRvd3RleHQ7fQ0Kc3Bhbi5FbWFpbFN0eWxlMTkNCgl7bXNvLXN0eWxlLXR5 cGU6cGVyc29uYWw7DQoJZm9udC1mYW1pbHk6Q2FsaWJyaTsNCgljb2xvcjojMUY0OTdEO30NCnNw YW4uRW1haWxTdHlsZTIwDQoJe21zby1zdHlsZS10eXBlOnBlcnNvbmFsOw0KCWZvbnQtZmFtaWx5 OiJJbnRlbCBDbGVhciI7DQoJY29sb3I6Izk5MDAwMDsNCglmb250LXdlaWdodDpub3JtYWw7DQoJ Zm9udC1zdHlsZTpub3JtYWw7DQoJdGV4dC1kZWNvcmF0aW9uOm5vbmUgbm9uZTt9DQpzcGFuLkVt YWlsU3R5bGUyMQ0KCXttc28tc3R5bGUtdHlwZTpwZXJzb25hbDsNCglmb250LWZhbWlseTpDYWxp YnJpOw0KCWNvbG9yOndpbmRvd3RleHQ7fQ0Kc3Bhbi5FbWFpbFN0eWxlMjINCgl7bXNvLXN0eWxl LXR5cGU6cGVyc29uYWw7DQoJZm9udC1mYW1pbHk6Q2FsaWJyaTsNCgljb2xvcjojMUY0OTdEO30N CnNwYW4uRW1haWxTdHlsZTIzDQoJe21zby1zdHlsZS10eXBlOnBlcnNvbmFsLXJlcGx5Ow0KCWZv bnQtZmFtaWx5OkNhbGlicmk7DQoJY29sb3I6d2luZG93dGV4dDt9DQpzcGFuLm1zb0lucw0KCXtt c28tc3R5bGUtdHlwZTpleHBvcnQtb25seTsNCgltc28tc3R5bGUtbmFtZToiIjsNCgl0ZXh0LWRl Y29yYXRpb246dW5kZXJsaW5lOw0KCWNvbG9yOnRlYWw7fQ0KLk1zb0NocERlZmF1bHQNCgl7bXNv LXN0eWxlLXR5cGU6ZXhwb3J0LW9ubHk7DQoJZm9udC1zaXplOjEwLjBwdDt9DQpAcGFnZSBXb3Jk U2VjdGlvbjENCgl7c2l6ZTo4LjVpbiAxMS4waW47DQoJbWFyZ2luOjEuMGluIDEuMGluIDEuMGlu IDEuMGluO30NCmRpdi5Xb3JkU2VjdGlvbjENCgl7cGFnZTpXb3JkU2VjdGlvbjE7fQ0KLS0+PC9z dHlsZT4NCjwvaGVhZD4NCjxib2R5IGJnY29sb3I9IndoaXRlIiBsYW5nPSJFTi1VUyIgbGluaz0i Ymx1ZSIgdmxpbms9InB1cnBsZSI+DQo8ZGl2IGNsYXNzPSJXb3JkU2VjdGlvbjEiPg0KPHAgY2xh c3M9Ik1zb05vcm1hbCI+T3Igd2UgbGVhdmUgb3V0IHRoZSByZXNldCBzdGF0cyBBUEkgYW5kIHBy b3ZpZGUgaGVscGVyIGZ1bmN0aW9ucyBvbiB0aGUgY2xpZW50IHNpZGUgKGluIFB5dGhvbikgdG8g ZGlmZiByZXN1bHRzIGZyb20gdHdvIGNhbGxzIHRvIHNwZGtfYmRldl9nZXRfaW9fc3RhdCgpLjxv OnA+PC9vOnA+PC9wPg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+PG86cD4mbmJzcDs8L286cD48L3A+ DQo8ZGl2IHN0eWxlPSJib3JkZXI6bm9uZTtib3JkZXItdG9wOnNvbGlkICNCNUM0REYgMS4wcHQ7 cGFkZGluZzozLjBwdCAwaW4gMGluIDBpbiI+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0i bWFyZ2luLWxlZnQ6LjVpbiI+PGI+PHNwYW4gc3R5bGU9ImNvbG9yOmJsYWNrIj5Gcm9tOiA8L3Nw YW4+DQo8L2I+PHNwYW4gc3R5bGU9ImNvbG9yOmJsYWNrIj5TUERLICZsdDtzcGRrLWJvdW5jZXNA bGlzdHMuMDEub3JnJmd0OyBvbiBiZWhhbGYgb2YgUGF1bCBFIEx1c2UgJmx0O3BhdWwuZS5sdXNl QGludGVsLmNvbSZndDs8YnI+DQo8Yj5SZXBseS1UbzogPC9iPlN0b3JhZ2UgUGVyZm9ybWFuY2Ug RGV2ZWxvcG1lbnQgS2l0ICZsdDtzcGRrQGxpc3RzLjAxLm9yZyZndDs8YnI+DQo8Yj5EYXRlOiA8 L2I+VHVlc2RheSwgTm92ZW1iZXIgMTQsIDIwMTcgYXQgNzo1MCBBTTxicj4NCjxiPlRvOiA8L2I+ U3RvcmFnZSBQZXJmb3JtYW5jZSBEZXZlbG9wbWVudCBLaXQgJmx0O3NwZGtAbGlzdHMuMDEub3Jn Jmd0Ozxicj4NCjxiPlN1YmplY3Q6IDwvYj5SZTogW1NQREtdIFJlcXVlc3QgZm9yIGNvbW1lbnRz IHJlZ2FyZGluZyBsYXRlbmN5IG1lYXN1cmVtZW50czwvc3Bhbj48c3BhbiBzdHlsZT0iZm9udC1z aXplOjEyLjBwdDtjb2xvcjpibGFjayI+PG86cD48L286cD48L3NwYW4+PC9wPg0KPC9kaXY+DQo8 ZGl2Pg0KPHAgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbi1sZWZ0Oi41aW4iPjxzcGFu IHN0eWxlPSJmb250LWZhbWlseTomcXVvdDtUaW1lcyBOZXcgUm9tYW4mcXVvdDsiPjxvOnA+Jm5i c3A7PC9vOnA+PC9zcGFuPjwvcD4NCjwvZGl2Pg0KPHAgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9 Im1hcmdpbi1sZWZ0Oi41aW4iPjxzcGFuIHN0eWxlPSJjb2xvcjojMUY0OTdEIj5PciBtYXliZSBh cyBhbiBpbml0aWFsIHNlcGFyYXRlIHBhdGNoIHJlbW92ZSB0aGUgYXV0by1yZXNldCBhbmQgYWRk IGEgbmV3IEFQSSB0byByZXNldCBzdGF0c+KApi48L3NwYW4+PG86cD48L286cD48L3A+DQo8cCBj bGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luLWxlZnQ6LjVpbiI+PGEgbmFtZT0iX01haWxF bmRDb21wb3NlIj48c3BhbiBzdHlsZT0iY29sb3I6IzFGNDk3RCI+Jm5ic3A7PC9zcGFuPjwvYT48 bzpwPjwvbzpwPjwvcD4NCjxkaXY+DQo8ZGl2IHN0eWxlPSJib3JkZXI6bm9uZTtib3JkZXItdG9w OnNvbGlkICNFMUUxRTEgMS4wcHQ7cGFkZGluZzozLjBwdCAwaW4gMGluIDBpbiI+DQo8cCBjbGFz cz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luLWxlZnQ6LjVpbiI+PGEgbmFtZT0iX19fX19yZXBs eXNlcGFyYXRvciI+PC9hPjxiPkZyb206PC9iPiBTUERLIFttYWlsdG86c3Bkay1ib3VuY2VzQGxp c3RzLjAxLm9yZ10NCjxiPk9uIEJlaGFsZiBPZiA8L2I+SGFycmlzLCBKYW1lcyBSPGJyPg0KPGI+ U2VudDo8L2I+IFR1ZXNkYXksIE5vdmVtYmVyIDE0LCAyMDE3IDg6NDMgQU08YnI+DQo8Yj5Ubzo8 L2I+IFN0b3JhZ2UgUGVyZm9ybWFuY2UgRGV2ZWxvcG1lbnQgS2l0ICZsdDtzcGRrQGxpc3RzLjAx Lm9yZyZndDs8YnI+DQo8Yj5TdWJqZWN0OjwvYj4gUmU6IFtTUERLXSBSZXF1ZXN0IGZvciBjb21t ZW50cyByZWdhcmRpbmcgbGF0ZW5jeSBtZWFzdXJlbWVudHM8bzpwPjwvbzpwPjwvcD4NCjwvZGl2 Pg0KPC9kaXY+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luLWxlZnQ6LjVpbiI+ Jm5ic3A7PG86cD48L286cD48L3A+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2lu LWxlZnQ6LjVpbiI+QWdyZWVkIC0gIzIgaXMgdGhlIHdheSB0byBnby48bzpwPjwvbzpwPjwvcD4N CjxwIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW4tbGVmdDouNWluIj4mbmJzcDs8bzpw PjwvbzpwPjwvcD4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW4tbGVmdDouNWlu Ij5XaGlsZSB3ZeKAmXJlIG9uIHRoZSB0b3BpYyAtIHNob3VsZCB3ZSBiZSByZXNldHRpbmcgdGhl IHN0YXRzIHdoZW4gc3Bka19iZGV2X2dldF9pb19zdGF0KCkgaXMgY2FsbGVkPyZuYnNwOyBUaGlz IGVsaW1pbmF0ZXMgdGhlIGFiaWxpdHkgZm9yIHR3byBzZXBhcmF0ZSBhcHBsaWNhdGlvbnMgdG8g bW9uaXRvciBzdGF0cyBpbiBwYXJhbGxlbCDigJMgb3IgZXZlbiBhIHNlcGFyYXRlIGFwcGxpY2F0 aW9uDQogcGx1cyBzb21lIGZ1dHVyZSB5ZXQtdG8tYmUtd3JpdHRlbiBpbnRlcm5hbCBsb2FkLWJh bGFuY2luZyBtb25pdG9yLiZuYnNwOyBJ4oCZbSB0aGlua2luZyB0aGF0IGJkZXYgc2hvdWxkIGp1 c3Qga2VlcCB0aGUgcnVubmluZyB0b3RhbCBhbmQgbGV0IHRoZSBjYWxsZXIgb3duIHRyYWNraW5n IGRpZmZlcmVuY2VzIGZyb20gdGhlIGxhc3QgdGltZSBpdCBjYWxsZWQgc3Bka19iZGV2X2dldF9p b19zdGF0KCkuPG86cD48L286cD48L3A+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFy Z2luLWxlZnQ6LjVpbiI+Jm5ic3A7PG86cD48L286cD48L3A+DQo8cCBjbGFzcz0iTXNvTm9ybWFs IiBzdHlsZT0ibWFyZ2luLWxlZnQ6LjVpbiI+LUppbTxvOnA+PC9vOnA+PC9wPg0KPHAgY2xhc3M9 Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbi1sZWZ0Oi41aW4iPiZuYnNwOzxvOnA+PC9vOnA+PC9w Pg0KPHAgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbi1sZWZ0Oi41aW4iPiZuYnNwOzxv OnA+PC9vOnA+PC9wPg0KPGRpdiBzdHlsZT0iYm9yZGVyOm5vbmU7Ym9yZGVyLXRvcDpzb2xpZCAj QjVDNERGIDEuMHB0O3BhZGRpbmc6My4wcHQgMGluIDBpbiAwaW4iPg0KPHAgY2xhc3M9Ik1zb05v cm1hbCIgc3R5bGU9Im1hcmdpbi1sZWZ0OjEuMGluIj48Yj48c3BhbiBzdHlsZT0iY29sb3I6Ymxh Y2siPkZyb206DQo8L3NwYW4+PC9iPjxzcGFuIHN0eWxlPSJjb2xvcjpibGFjayI+U1BESyAmbHQ7 PGEgaHJlZj0ibWFpbHRvOnNwZGstYm91bmNlc0BsaXN0cy4wMS5vcmciPnNwZGstYm91bmNlc0Bs aXN0cy4wMS5vcmc8L2E+Jmd0OyBvbiBiZWhhbGYgb2YgTmF0aGFuIE1hcnVzaGFrICZsdDs8YSBo cmVmPSJtYWlsdG86bmF0aGFuLm1hcnVzaGFrQGludGVsLmNvbSI+bmF0aGFuLm1hcnVzaGFrQGlu dGVsLmNvbTwvYT4mZ3Q7PGJyPg0KPGI+UmVwbHktVG86IDwvYj5TdG9yYWdlIFBlcmZvcm1hbmNl IERldmVsb3BtZW50IEtpdCAmbHQ7PGEgaHJlZj0ibWFpbHRvOnNwZGtAbGlzdHMuMDEub3JnIj5z cGRrQGxpc3RzLjAxLm9yZzwvYT4mZ3Q7PGJyPg0KPGI+RGF0ZTogPC9iPlR1ZXNkYXksIE5vdmVt YmVyIDE0LCAyMDE3IGF0IDc6MjkgQU08YnI+DQo8Yj5UbzogPC9iPlN0b3JhZ2UgUGVyZm9ybWFu Y2UgRGV2ZWxvcG1lbnQgS2l0ICZsdDs8YSBocmVmPSJtYWlsdG86c3Bka0BsaXN0cy4wMS5vcmci PnNwZGtAbGlzdHMuMDEub3JnPC9hPiZndDs8YnI+DQo8Yj5TdWJqZWN0OiA8L2I+UmU6IFtTUERL XSBSZXF1ZXN0IGZvciBjb21tZW50cyByZWdhcmRpbmcgbGF0ZW5jeSBtZWFzdXJlbWVudHM8L3Nw YW4+PG86cD48L286cD48L3A+DQo8L2Rpdj4NCjxkaXY+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIiBz dHlsZT0ibWFyZ2luLWxlZnQ6MS4waW4iPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTomcXVvdDtU aW1lcyBOZXcgUm9tYW4mcXVvdDsiPiZuYnNwOzwvc3Bhbj48bzpwPjwvbzpwPjwvcD4NCjwvZGl2 Pg0KPHAgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbi1sZWZ0OjEuMGluIj48c3BhbiBz dHlsZT0iZm9udC1mYW1pbHk6JnF1b3Q7SW50ZWwgQ2xlYXImcXVvdDs7Y29sb3I6Izk5MDAwMCI+ U28sIG5vdCBiZWluZyB0aGUgdGVjaG5pY2FsIGV4cGVydCBzbyB0byBzcGVhaw0KPC9zcGFuPjxz cGFuIHN0eWxlPSJmb250LWZhbWlseTpXaW5nZGluZ3M7Y29sb3I6Izk5MDAwMCI+Sjwvc3Bhbj48 c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6JnF1b3Q7SW50ZWwgQ2xlYXImcXVvdDs7Y29sb3I6Izk5 MDAwMCI+LCBwbGVhc2UgdGFrZSB0aGlzIHdpdGggYSBncmFpbiBvZiBzYWx0LiBBZ3JlZSB3aXRo IG9wdGlvbiAjMi4gU2VlbXMgbGlrZSB0aGlzIHdvdWxkIGFsbG93IGZvciBrZWVwaW5nIHN0YXRz IGFjcm9zcyB0aGUgZGlmZmVyZW50IGRldmljZSB0eXBlcw0KIGUuZy4gTlZNZSwgTlZNTCwgTlZN ZS1vRiAoYWx0aG91Z2ggdGhhdCBoYXMgYSB0cmFuc3BvcnQgd2l0aGluIE5WTWUsIHNvIGl0IG1p Z2h0IGJlIGNvdmVyZWQgZm9yIGVpdGhlciBvcHRpb24pLjwvc3Bhbj48bzpwPjwvbzpwPjwvcD4N CjxwIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW4tbGVmdDoxLjBpbiI+PHNwYW4gc3R5 bGU9ImZvbnQtZmFtaWx5OiZxdW90O0ludGVsIENsZWFyJnF1b3Q7O2NvbG9yOiM5OTAwMDAiPiZu YnNwOzwvc3Bhbj48bzpwPjwvbzpwPjwvcD4NCjxkaXYgc3R5bGU9ImJvcmRlcjpub25lO2JvcmRl ci1sZWZ0OnNvbGlkIGJsdWUgMS41cHQ7cGFkZGluZzowaW4gMGluIDBpbiA0LjBwdCI+DQo8ZGl2 Pg0KPGRpdiBzdHlsZT0iYm9yZGVyOm5vbmU7Ym9yZGVyLXRvcDpzb2xpZCAjRTFFMUUxIDEuMHB0 O3BhZGRpbmc6My4wcHQgMGluIDBpbiAwaW4iPg0KPHAgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9 Im1hcmdpbi1sZWZ0OjEuMGluIj48Yj5Gcm9tOjwvYj4gU1BESyBbPGEgaHJlZj0ibWFpbHRvOnNw ZGstYm91bmNlc0BsaXN0cy4wMS5vcmciPm1haWx0bzpzcGRrLWJvdW5jZXNAbGlzdHMuMDEub3Jn PC9hPl0NCjxiPk9uIEJlaGFsZiBPZiA8L2I+THVzZSwgUGF1bCBFPGJyPg0KPGI+U2VudDo8L2I+ IFR1ZXNkYXksIE5vdmVtYmVyIDE0LCAyMDE3IDc6NTcgQU08YnI+DQo8Yj5Ubzo8L2I+IFN0b3Jh Z2UgUGVyZm9ybWFuY2UgRGV2ZWxvcG1lbnQgS2l0ICZsdDs8YSBocmVmPSJtYWlsdG86c3Bka0Bs aXN0cy4wMS5vcmciPnNwZGtAbGlzdHMuMDEub3JnPC9hPiZndDs8YnI+DQo8Yj5TdWJqZWN0Ojwv Yj4gUmU6IFtTUERLXSBSZXF1ZXN0IGZvciBjb21tZW50cyByZWdhcmRpbmcgbGF0ZW5jeSBtZWFz dXJlbWVudHM8bzpwPjwvbzpwPjwvcD4NCjwvZGl2Pg0KPC9kaXY+DQo8cCBjbGFzcz0iTXNvTm9y bWFsIiBzdHlsZT0ibWFyZ2luLWxlZnQ6MS4waW4iPiZuYnNwOzxvOnA+PC9vOnA+PC9wPg0KPHAg Y2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbi1sZWZ0OjEuMGluIj48c3BhbiBzdHlsZT0i Y29sb3I6IzFGNDk3RCI+RldJVyBvcHRpb24gMiBzb3VuZHMgbGlrZSB0aGUgbW9zdCBhcHByb3By aWF0ZSB0byBtZeKApjwvc3Bhbj48bzpwPjwvbzpwPjwvcD4NCjxwIGNsYXNzPSJNc29Ob3JtYWwi IHN0eWxlPSJtYXJnaW4tbGVmdDoxLjBpbiI+PHNwYW4gc3R5bGU9ImNvbG9yOiMxRjQ5N0QiPiZu YnNwOzwvc3Bhbj48bzpwPjwvbzpwPjwvcD4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJt YXJnaW4tbGVmdDoxLjBpbiI+PHNwYW4gc3R5bGU9ImNvbG9yOiMxRjQ5N0QiPlRoeDwvc3Bhbj48 bzpwPjwvbzpwPjwvcD4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW4tbGVmdDox LjBpbiI+PHNwYW4gc3R5bGU9ImNvbG9yOiMxRjQ5N0QiPlBhdWw8L3NwYW4+PG86cD48L286cD48 L3A+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luLWxlZnQ6MS4waW4iPjxzcGFu IHN0eWxlPSJjb2xvcjojMUY0OTdEIj4mbmJzcDs8L3NwYW4+PG86cD48L286cD48L3A+DQo8ZGl2 Pg0KPGRpdiBzdHlsZT0iYm9yZGVyOm5vbmU7Ym9yZGVyLXRvcDpzb2xpZCAjRTFFMUUxIDEuMHB0 O3BhZGRpbmc6My4wcHQgMGluIDBpbiAwaW4iPg0KPHAgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9 Im1hcmdpbi1sZWZ0OjEuMGluIj48Yj5Gcm9tOjwvYj4gU1BESyBbPGEgaHJlZj0ibWFpbHRvOnNw ZGstYm91bmNlc0BsaXN0cy4wMS5vcmciPm1haWx0bzpzcGRrLWJvdW5jZXNAbGlzdHMuMDEub3Jn PC9hPl0NCjxiPk9uIEJlaGFsZiBPZiA8L2I+UGF1bCBWb24tU3RhbXdpdHo8YnI+DQo8Yj5TZW50 OjwvYj4gTW9uZGF5LCBOb3ZlbWJlciAxMywgMjAxNyA3OjI5IFBNPGJyPg0KPGI+VG86PC9iPiA8 YSBocmVmPSJtYWlsdG86c3Bka0BsaXN0cy4wMS5vcmciPnNwZGtAbGlzdHMuMDEub3JnPC9hPjxi cj4NCjxiPlN1YmplY3Q6PC9iPiBbU1BES10gUmVxdWVzdCBmb3IgY29tbWVudHMgcmVnYXJkaW5n IGxhdGVuY3kgbWVhc3VyZW1lbnRzPG86cD48L286cD48L3A+DQo8L2Rpdj4NCjwvZGl2Pg0KPHAg Y2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbi1sZWZ0OjEuMGluIj4mbmJzcDs8bzpwPjwv bzpwPjwvcD4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW4tbGVmdDoxLjBpbiI+ QmFja2dyb3VuZDo8bzpwPjwvbzpwPjwvcD4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJt YXJnaW4tbGVmdDoxLjBpbiI+QmRldi5jIGN1cnJlbnRseSBtYWludGFpbnMgYSBjb3VudCBvZiBy ZWFkcy93cml0ZXMvYnl0ZXNfcmVhZC9ieXRlc193cml0dGVuIGluIGNoYW5uZWwtJmd0O3N0YXQu IFRoaXMgaW5mb3JtYXRpb24gaXMgcmV0cmlldmVkIChhbmQgcmVzZXQpIHZpYSBzcGRrX2JkZXZf Z2V0X2lvX3N0YXQuPG86cD48L286cD48L3A+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0i bWFyZ2luLWxlZnQ6MS4waW4iPiZuYnNwOzxvOnA+PC9vOnA+PC9wPg0KPHAgY2xhc3M9Ik1zb05v cm1hbCIgc3R5bGU9Im1hcmdpbi1sZWZ0OjEuMGluIj5Qcm9wb3NhbDo8bzpwPjwvbzpwPjwvcD4N CjxwIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW4tbGVmdDoxLjBpbiI+QWRkIGxhdGVu Y3kgaW5mb3JtYXRpb24gdG8gY2hhbm5lbC0mZ3Q7c3RhdCBhbmQgZW5hYmxlIHRoZSBvcHRpb24g dG8gcHJvdmlkZSBhIGhpc3RvZ3JhbS48bzpwPjwvbzpwPjwvcD4NCjxwIGNsYXNzPSJNc29Ob3Jt YWwiIHN0eWxlPSJtYXJnaW4tbGVmdDoxLjBpbiI+V2UgY2FuIG1lYXN1cmUgdGhlIGxhdGVuY3kg b2YgZWFjaCBJTyBhbmQga2VlcCBhIHJ1bm5pbmcgdG90YWwgb24gYSByZWFkL3dyaXRlIGJhc2lz LiBXZSBjYW4gYWxzbyB1c2UgdGhlIG1lYXN1cmVkIGxhdGVuY3kgdG8ga2VlcCBhIHJ1bm5pbmcg Y291bnQgb2YgcmVhZHMvd3JpdGVzIGluIHRoZWlyIGFzc29jaWF0ZWQgaGlzdG9ncmFtIOKAnGJ1 Y2tldHPigJ0uPG86cD48L286cD48L3A+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFy Z2luLWxlZnQ6MS4waW4iPlRoZSBxdWVzdGlvbiBpcywgaG93IGRvIHdlIG1lYXN1cmUgbGF0ZW5j eT88bzpwPjwvbzpwPjwvcD4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW4tbGVm dDoxLjBpbiI+Jm5ic3A7PG86cD48L286cD48L3A+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIiBzdHls ZT0ibWFyZ2luLWxlZnQ6MS4waW4iPk9wdGlvbiAxOjxvOnA+PC9vOnA+PC9wPg0KPHAgY2xhc3M9 Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbi1sZWZ0OjEuMGluIj5NZWFzdXJlIGxhdGVuY3kgYXQg dGhlIE5WTWUgdHJhY2tlciAuPG86cD48L286cD48L3A+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIiBz dHlsZT0ibWFyZ2luLWxlZnQ6MS4waW4iPkN1cnJlbnRseSwgd2UgYWxyZWFkeSB0aW1lc3RhbXAg ZXZlcnkgY29tbWFuZCBwbGFjZWQgb24gdGhlIHRyYWNrZXIgaWYgdGhlIGFib3J0IHRpbWVvdXQg Y2FsbGJhY2sgaXMgcmVnaXN0ZXJlZC4gV2hlbiB3ZSByZW1vdmUgYSBjb21wbGV0ZWQgSU8gZnJv bSB0aGUgdHJhY2tlciwgd2UgY2FuIHRpbWVzdGFtcCBpdCBhZ2FpbiBhbmQgY2FsY3VsYXRlIHRo ZSBsYXRlbmN5LjxvOnA+PC9vOnA+PC9wPg0KPHAgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1h cmdpbi1sZWZ0OjEuMGluIj5UaGVyZSBhcmUgc2V2ZXJhbCBpc3N1ZXMgaGVyZSB0aGF0IG5lZWQg dG8gYmUgY29uc2lkZXJlZC48bzpwPjwvbzpwPjwvcD4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiIHN0 eWxlPSJtYXJnaW4tbGVmdDoxLjBpbiI+V2UgbmVlZCB0byBnZXQgdGhlIGxhdGVuY3kgaW5mb3Jt YXRpb24gYmFjayB1cCB0byB0aGUgYmRldiBsYXllciwgbW9zdCBsaWtlbHkgdGhyb3VnaCBhIGNh bGxiYWNrIGFyZ3VtZW50LCBidXQgdGhpcyB3b3VsZCByZXF1aXJlIGEgY2hhbmdlIHRoZSBOVk1l IEFQSS4gSWYgdGhlIGJkZXYgYnJlYWtzIGRvd24gYSByZXF1ZXN0IGludG8gc21hbGxlciBJT3Ms IGl0IGNhbg0KIGFkZCB1cCB0aGUgbGF0ZW5jaWVzIG9mIHRoZSBjaGlsZCBJT3MgZm9yIGlvX3N0 YXQgYW5kIGhpc3RvZ3JhbSBwdXJwb3Nlcy48bzpwPjwvbzpwPjwvcD4NCjxwIGNsYXNzPSJNc29O b3JtYWwiIHN0eWxlPSJtYXJnaW4tbGVmdDoxLjBpbiI+QWxzbywgdGhpcyBtZXRob2QgZG9lcyBu b3QgdGFrZSBpbnRvIGFjY291bnQgYW55IGxhdGVuY3kgYWRkZWQgYnkgdGhlIHNwZGsgYmRldi9u dm1lIGxheWVycyAoZXhjZXB0IHRoZSBwb2xsZXIuKSBJZiBhIHJlcXVlc3Qgd2FzIHF1ZXVlZCBi ZWZvcmUgYmVpbmcgcGxhY2VkIG9uIHRoZSB0cmFja2VyLCB0aGVuIHRoZSB0aW1lIGl0IHdhcyBx dWV1ZWQgaXMgbm90IGZhY3RvcmVkDQogaW50byB0aGUgbGF0ZW5jeSBjYWxjdWxhdGlvbi48bzpw PjwvbzpwPjwvcD4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW4tbGVmdDoxLjBp biI+Jm5ic3A7PG86cD48L286cD48L3A+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFy Z2luLWxlZnQ6MS4waW4iPk9wdGlvbiAyOjxvOnA+PC9vOnA+PC9wPg0KPHAgY2xhc3M9Ik1zb05v cm1hbCIgc3R5bGU9Im1hcmdpbi1sZWZ0OjEuMGluIj5NZWFzdXJlIGxhdGVuY3kgYXQgdGhlIGJk ZXYgbGF5ZXIuPG86cD48L286cD48L3A+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFy Z2luLWxlZnQ6MS4waW4iPldlIGNhbiB0aW1lc3RhbXAgYXQgc3VibWl0IGFuZCBhZ2FpbiBhdCBj b21wbGV0aW9uLiBUaGlzIHdvdWxkIGtlZXAgYWxsIGlvX3N0YXQgaW5mb3JtYXRpb24gbG9jYWwg dG8gYmRldiBhbmQgd291bGQgdGFrZSBpbnRvIGFjY291bnQgdGhlIG92ZXJoZWFkIG9mIG1vc3Qg cXVldWVkIG9wZXJhdGlvbnMuIEFueSBhcHBsaWNhdGlvbnMgd3JpdHRlbiBkaXJlY3RseSB0bw0K IHRoZSBOVk1lIGxheWVyIHdvdWxkIGhhdmUgdG8gY2FsY3VsYXRlIHRoZWlyIG93biBsYXRlbmNp ZXMsIGJ1dCB0aGF0IGlzIGN1cnJlbnRseSB0cnVlIGZvciBhbGwgaW9fc3RhdHMuPG86cD48L286 cD48L3A+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luLWxlZnQ6MS4waW4iPiZu YnNwOzxvOnA+PC9vOnA+PC9wPg0KPHAgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbi1s ZWZ0OjEuMGluIj5J4oCZbSBzdXJlIHRoYXQgdGhlcmUgYXJlIG90aGVyIGlzc3VlcyBJIGFtIG1p c3NpbmcsIGJ1dCBJIHdvdWxkIGFwcHJlY2lhdGUgYW55IGNvbW1lbnRzIG9uIGhvdyBiZXN0IHRv IG1vdmUgZm9yd2FyZCBvbiB0aGlzLjxvOnA+PC9vOnA+PC9wPg0KPHAgY2xhc3M9Ik1zb05vcm1h bCIgc3R5bGU9Im1hcmdpbi1sZWZ0OjEuMGluIj4mbmJzcDs8bzpwPjwvbzpwPjwvcD4NCjxwIGNs YXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW4tbGVmdDoxLjBpbiI+VGhhbmtzLDxvOnA+PC9v OnA+PC9wPg0KPHAgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbi1sZWZ0OjEuMGluIj5Q YXVsPG86cD48L286cD48L3A+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luLWxl ZnQ6MS4waW4iPiZuYnNwOzxvOnA+PC9vOnA+PC9wPg0KPC9kaXY+DQo8L2Rpdj4NCjwvYm9keT4N CjwvaHRtbD4NCg== --===============4418307312295362873==--