From mboxrd@z Thu Jan 1 00:00:00 1970 Content-Type: multipart/mixed; boundary="===============2120512523569279446==" MIME-Version: 1.0 From: Aneesh Pachilangottil Subject: Re: [SPDK] SPDK + user space appliance Date: Fri, 19 Jan 2018 17:38:57 +0000 Message-ID: In-Reply-To: 2BFA8F2383C3784C90698C10BC0963195EF544A7@SHSMSX103.ccr.corp.intel.com List-ID: To: spdk@lists.01.org --===============2120512523569279446== Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Hi Shahar, By namespace, do you mean the namespace exposed by the NVMe= OF target which is visible to the host? I am asking because, I am looking i= nto something similar and would like to understand whether our requirements= matches. My requirement is to add a new namespace to an existing NVMeOF subsystem us= ing RPC. I don`t find an option to do this presently using RPC. When callin= g construct_nvmf_subsystem method, we can specify the list of namespaces to= be created, however adding a new namespace to an already existing subsyste= m doesn`t seems to be supported. This is what I am trying to achieve. Best Regards, Aneesh From: SPDK [mailto:spdk-bounces(a)lists.01.org] On Behalf Of Chang, Cunyin Sent: Friday, January 19, 2018 5:24 AM To: Storage Performance Development Kit Cc: Yael Shavit ; Amir Sasson ; Ilan Steinberg Subject: Re: [SPDK] SPDK + user space appliance I suppose your use application just works as the new type "bdev" which will= be the namespace of the nvmf target? If so, the SPDK user space nvme Bdev and aio bdev should be a good reference: In general bdev layer, when you try to call spdk_bdev_register(), we provid= e the io channel creation callback as: spdk_bdev_channel_create(), In this function, we actually will try to call the backend bdev->fn_table->= get_io_channel(bdev->ctxt), this should be provided by your application, in This function, you should implement the poll function just as bdev_nvme_pol= l(), so, you could keep your our poller for the backend bdev in your own application without modify of the nvmf target driver. When the nvmf target = driver try to call spdk_bdev_get_io_channel() in the function poll_group_up= date_subsystem(), it will trigger all the process which I mentioned above. -Cunyin From: SPDK [mailto:spdk-bounces(a)lists.01.org] On Behalf Of Shahar Salzman Sent: Sunday, January 14, 2018 5:10 PM To: Storage Performance Development Kit > Cc: Yael Shavit >; Amir Sasson >; Ilan Steinberg > Subject: [SPDK] SPDK + user space appliance Hi experts, We have been integrating spdk into our system using a blockdev module, curr= ently only a POC version. Our use case is a user space appliance processing IOs, with an SPDK fronten= d to do the NVMeF. Currently all of the user bdevs are created via configuration file, but we = are working to add functions + rpc's which allow creation/deletion of these= namespaces. IO is sent to user space via callback, implementation is up to user space, = but obviously the longer it lingers there the lower the performance, we use= a set of rings + threads processing them, so that the time spent in the ap= pliance is minimal. Going back from user space we use a single ring (multiple producers single = consumer) onto which the completions are inserted, and the ring poll functi= on is registered with spdk core (spdk_poller_register). Does this seem like a sane design? We'd really like your feedback, and if t= his can be useful to others, push the code into spdk. Obviously we are willing to go through any review/testing process that is r= equired. And share performance results and issues. Cheers, Shahar --===============2120512523569279446== Content-Type: text/html MIME-Version: 1.0 Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="attachment.html" PGh0bWwgeG1sbnM6dj0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTp2bWwiIHhtbG5zOm89InVy bjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOm9mZmljZSIgeG1sbnM6dz0idXJuOnNjaGVt YXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6d29yZCIgeG1sbnM6bT0iaHR0cDovL3NjaGVtYXMubWlj cm9zb2Z0LmNvbS9vZmZpY2UvMjAwNC8xMi9vbW1sIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcv VFIvUkVDLWh0bWw0MCI+CjxoZWFkPgo8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNv bnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSI+CjxtZXRhIG5hbWU9IkdlbmVyYXRv ciIgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgMTUgKGZpbHRlcmVkIG1lZGl1bSkiPgo8c3R5bGU+ PCEtLQovKiBGb250IERlZmluaXRpb25zICovCkBmb250LWZhY2UKCXtmb250LWZhbWlseTpNYW5n YWw7CglwYW5vc2UtMToyIDQgNSAzIDUgMiAzIDMgMiAyO30KQGZvbnQtZmFjZQoJe2ZvbnQtZmFt aWx5OiJDYW1icmlhIE1hdGgiOwoJcGFub3NlLTE6MiA0IDUgMyA1IDQgNiAzIDIgNDt9CkBmb250 LWZhY2UKCXtmb250LWZhbWlseTpDYWxpYnJpOwoJcGFub3NlLTE6MiAxNSA1IDIgMiAyIDQgMyAy IDQ7fQovKiBTdHlsZSBEZWZpbml0aW9ucyAqLwpwLk1zb05vcm1hbCwgbGkuTXNvTm9ybWFsLCBk aXYuTXNvTm9ybWFsCgl7bWFyZ2luOjBpbjsKCW1hcmdpbi1ib3R0b206LjAwMDFwdDsKCWZvbnQt c2l6ZToxMi4wcHQ7Cglmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIixzZXJpZjt9CmE6bGlu aywgc3Bhbi5Nc29IeXBlcmxpbmsKCXttc28tc3R5bGUtcHJpb3JpdHk6OTk7Cgljb2xvcjojMDU2 M0MxOwoJdGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZTt9CmE6dmlzaXRlZCwgc3Bhbi5Nc29IeXBl cmxpbmtGb2xsb3dlZAoJe21zby1zdHlsZS1wcmlvcml0eTo5OTsKCWNvbG9yOiM5NTRGNzI7Cgl0 ZXh0LWRlY29yYXRpb246dW5kZXJsaW5lO30KcAoJe21zby1zdHlsZS1wcmlvcml0eTo5OTsKCW1h cmdpbjowaW47CgltYXJnaW4tYm90dG9tOi4wMDAxcHQ7Cglmb250LXNpemU6MTIuMHB0OwoJZm9u dC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiIsc2VyaWY7fQpwLm1zb25vcm1hbDAsIGxpLm1zb25v cm1hbDAsIGRpdi5tc29ub3JtYWwwCgl7bXNvLXN0eWxlLW5hbWU6bXNvbm9ybWFsOwoJbXNvLXN0 eWxlLXByaW9yaXR5Ojk5OwoJbWFyZ2luOjBpbjsKCW1hcmdpbi1ib3R0b206LjAwMDFwdDsKCWZv bnQtc2l6ZToxMi4wcHQ7Cglmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIixzZXJpZjt9CnNw YW4uRW1haWxTdHlsZTE5Cgl7bXNvLXN0eWxlLXR5cGU6cGVyc29uYWw7Cglmb250LWZhbWlseToi Q2FsaWJyaSIsc2Fucy1zZXJpZjsKCWNvbG9yOiMxRjQ5N0Q7fQpzcGFuLkVtYWlsU3R5bGUyMAoJ e21zby1zdHlsZS10eXBlOnBlcnNvbmFsLXJlcGx5OwoJZm9udC1mYW1pbHk6IkNhbGlicmkiLHNh bnMtc2VyaWY7Cgljb2xvcjojMUY0OTdEO30KLk1zb0NocERlZmF1bHQKCXttc28tc3R5bGUtdHlw ZTpleHBvcnQtb25seTsKCWZvbnQtc2l6ZToxMC4wcHQ7fQpAcGFnZSBXb3JkU2VjdGlvbjEKCXtz aXplOjguNWluIDExLjBpbjsKCW1hcmdpbjoxLjBpbiAxLjBpbiAxLjBpbiAxLjBpbjt9CmRpdi5X b3JkU2VjdGlvbjEKCXtwYWdlOldvcmRTZWN0aW9uMTt9Ci0tPjwvc3R5bGU+PCEtLVtpZiBndGUg bXNvIDldPjx4bWw+CjxvOnNoYXBlZGVmYXVsdHMgdjpleHQ9ImVkaXQiIHNwaWRtYXg9IjEwMjYi IC8+CjwveG1sPjwhW2VuZGlmXS0tPjwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPgo8bzpzaGFwZWxh eW91dCB2OmV4dD0iZWRpdCI+CjxvOmlkbWFwIHY6ZXh0PSJlZGl0IiBkYXRhPSIxIiAvPgo8L286 c2hhcGVsYXlvdXQ+PC94bWw+PCFbZW5kaWZdLS0+CjwvaGVhZD4KPGJvZHkgbGFuZz0iRU4tVVMi IGxpbms9IiMwNTYzQzEiIHZsaW5rPSIjOTU0RjcyIj4KPGRpdiBjbGFzcz0iV29yZFNlY3Rpb24x Ij4KPHAgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMS4wcHQ7Zm9u dC1mYW1pbHk6JnF1b3Q7Q2FsaWJyaSZxdW90OyxzYW5zLXNlcmlmO2NvbG9yOiMxRjQ5N0QiPkhp IFNoYWhhciw8bzpwPjwvbzpwPjwvc3Bhbj48L3A+CjxwIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFu IHN0eWxlPSJmb250LXNpemU6MTEuMHB0O2ZvbnQtZmFtaWx5OiZxdW90O0NhbGlicmkmcXVvdDss c2Fucy1zZXJpZjtjb2xvcjojMUY0OTdEIj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsm bmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJz cDsgQnkgbmFtZXNwYWNlLCBkbyB5b3UgbWVhbiB0aGUgbmFtZXNwYWNlIGV4cG9zZWQgYnkgdGhl IE5WTWVPRiB0YXJnZXQgd2hpY2ggaXMgdmlzaWJsZSB0byB0aGUgaG9zdD8gSSBhbSBhc2tpbmcg YmVjYXVzZSwgSSBhbSBsb29raW5nIGludG8gc29tZXRoaW5nCiBzaW1pbGFyIGFuZCB3b3VsZCBs aWtlIHRvIHVuZGVyc3RhbmQgd2hldGhlciBvdXIgcmVxdWlyZW1lbnRzIG1hdGNoZXMuPG86cD48 L286cD48L3NwYW4+PC9wPgo8cCBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBzdHlsZT0iZm9udC1z aXplOjExLjBwdDtmb250LWZhbWlseTomcXVvdDtDYWxpYnJpJnF1b3Q7LHNhbnMtc2VyaWY7Y29s b3I6IzFGNDk3RCI+PG86cD4mbmJzcDs8L286cD48L3NwYW4+PC9wPgo8cCBjbGFzcz0iTXNvTm9y bWFsIiBzdHlsZT0idGV4dC1pbmRlbnQ6LjVpbiI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMS4w cHQ7Zm9udC1mYW1pbHk6JnF1b3Q7Q2FsaWJyaSZxdW90OyxzYW5zLXNlcmlmO2NvbG9yOiMxRjQ5 N0QiPk15IHJlcXVpcmVtZW50IGlzIHRvIGFkZCBhIG5ldyBuYW1lc3BhY2UgdG8gYW4gZXhpc3Rp bmcgTlZNZU9GIHN1YnN5c3RlbSB1c2luZyBSUEMuIEkgZG9uYHQgZmluZCBhbiBvcHRpb24gdG8g ZG8gdGhpcyBwcmVzZW50bHkgdXNpbmcKIFJQQy4gV2hlbiBjYWxsaW5nIGNvbnN0cnVjdF9udm1m X3N1YnN5c3RlbSBtZXRob2QsIHdlIGNhbiBzcGVjaWZ5IHRoZSBsaXN0IG9mIG5hbWVzcGFjZXMg dG8gYmUgY3JlYXRlZCwgaG93ZXZlciBhZGRpbmcgYSBuZXcgbmFtZXNwYWNlIHRvIGFuIGFscmVh ZHkgZXhpc3Rpbmcgc3Vic3lzdGVtIGRvZXNuYHQgc2VlbXMgdG8gYmUgc3VwcG9ydGVkLiBUaGlz IGlzIHdoYXQgSSBhbSB0cnlpbmcgdG8gYWNoaWV2ZS48bzpwPjwvbzpwPjwvc3Bhbj48L3A+Cjxw IGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTEuMHB0O2ZvbnQtZmFt aWx5OiZxdW90O0NhbGlicmkmcXVvdDssc2Fucy1zZXJpZjtjb2xvcjojMUY0OTdEIj48bzpwPiZu YnNwOzwvbzpwPjwvc3Bhbj48L3A+CjxwIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIHN0eWxlPSJm b250LXNpemU6MTEuMHB0O2ZvbnQtZmFtaWx5OiZxdW90O0NhbGlicmkmcXVvdDssc2Fucy1zZXJp Zjtjb2xvcjojMUY0OTdEIj5CZXN0IFJlZ2FyZHMsPG86cD48L286cD48L3NwYW4+PC9wPgo8cCBj bGFzcz0iTXNvTm9ybWFsIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOjExLjBwdDtmb250LWZhbWls eTomcXVvdDtDYWxpYnJpJnF1b3Q7LHNhbnMtc2VyaWY7Y29sb3I6IzFGNDk3RCI+QW5lZXNoPC9z cGFuPjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTEuMHB0O2ZvbnQtZmFtaWx5OiZxdW90O0NhbGli cmkmcXVvdDssc2Fucy1zZXJpZjtjb2xvcjojMUY0OTdEIj48bzpwPjwvbzpwPjwvc3Bhbj48L3A+ CjxwIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTEuMHB0O2ZvbnQt ZmFtaWx5OiZxdW90O0NhbGlicmkmcXVvdDssc2Fucy1zZXJpZjtjb2xvcjojMUY0OTdEIj48bzpw PiZuYnNwOzwvbzpwPjwvc3Bhbj48L3A+CjxkaXY+CjxkaXYgc3R5bGU9ImJvcmRlcjpub25lO2Jv cmRlci10b3A6c29saWQgI0UxRTFFMSAxLjBwdDtwYWRkaW5nOjMuMHB0IDBpbiAwaW4gMGluIj4K PHAgY2xhc3M9Ik1zb05vcm1hbCI+PGI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMS4wcHQ7Zm9u dC1mYW1pbHk6JnF1b3Q7Q2FsaWJyaSZxdW90OyxzYW5zLXNlcmlmIj5Gcm9tOjwvc3Bhbj48L2I+ PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMS4wcHQ7Zm9udC1mYW1pbHk6JnF1b3Q7Q2FsaWJyaSZx dW90OyxzYW5zLXNlcmlmIj4gU1BESyBbbWFpbHRvOnNwZGstYm91bmNlc0BsaXN0cy4wMS5vcmdd CjxiPk9uIEJlaGFsZiBPZiA8L2I+Q2hhbmcsIEN1bnlpbjxicj4KPGI+U2VudDo8L2I+IEZyaWRh eSwgSmFudWFyeSAxOSwgMjAxOCA1OjI0IEFNPGJyPgo8Yj5Ubzo8L2I+IFN0b3JhZ2UgUGVyZm9y bWFuY2UgRGV2ZWxvcG1lbnQgS2l0ICZsdDtzcGRrQGxpc3RzLjAxLm9yZyZndDs8YnI+CjxiPkNj OjwvYj4gWWFlbCBTaGF2aXQgJmx0O3lhZWwuc2hhdml0QGthbWluYXJpby5jb20mZ3Q7OyBBbWly IFNhc3NvbiAmbHQ7YW1pci5zYXNzb25Aa2FtaW5hcmlvLmNvbSZndDs7IElsYW4gU3RlaW5iZXJn ICZsdDtpbGFuLnN0ZWluYmVyZ0BrYW1pbmFyaW8uY29tJmd0Ozxicj4KPGI+U3ViamVjdDo8L2I+ IFJlOiBbU1BES10gU1BESyAmIzQzOyB1c2VyIHNwYWNlIGFwcGxpYW5jZTxvOnA+PC9vOnA+PC9z cGFuPjwvcD4KPC9kaXY+CjwvZGl2Pgo8cCBjbGFzcz0iTXNvTm9ybWFsIj48bzpwPiZuYnNwOzwv bzpwPjwvcD4KPHAgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMS4w cHQ7Zm9udC1mYW1pbHk6JnF1b3Q7Q2FsaWJyaSZxdW90OyxzYW5zLXNlcmlmO2NvbG9yOiMxRjQ5 N0QiPkkgc3VwcG9zZSB5b3VyIHVzZSBhcHBsaWNhdGlvbiBqdXN0IHdvcmtzIGFzIHRoZSBuZXcg dHlwZSAmIzgyMjA7YmRldiYjODIyMTsgd2hpY2ggd2lsbCBiZSB0aGUgbmFtZXNwYWNlIG9mIHRo ZSBudm1mIHRhcmdldD8gSWYgc28sIHRoZSBTUERLIHVzZXIgc3BhY2UgbnZtZTxvOnA+PC9vOnA+ PC9zcGFuPjwvcD4KPHAgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTox MS4wcHQ7Zm9udC1mYW1pbHk6JnF1b3Q7Q2FsaWJyaSZxdW90OyxzYW5zLXNlcmlmO2NvbG9yOiMx RjQ5N0QiPkJkZXYgYW5kIGFpbyBiZGV2IHNob3VsZCBiZSBhIGdvb2QgcmVmZXJlbmNlPGEgbmFt ZT0iX01haWxFbmRDb21wb3NlIj46PC9hPjxvOnA+PC9vOnA+PC9zcGFuPjwvcD4KPHAgY2xhc3M9 Ik1zb05vcm1hbCI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMS4wcHQ7Zm9udC1mYW1pbHk6JnF1 b3Q7Q2FsaWJyaSZxdW90OyxzYW5zLXNlcmlmO2NvbG9yOiMxRjQ5N0QiPkluIGdlbmVyYWwgYmRl diBsYXllciwgd2hlbiB5b3UgdHJ5IHRvIGNhbGwgc3Bka19iZGV2X3JlZ2lzdGVyKCksIHdlIHBy b3ZpZGUgdGhlIGlvIGNoYW5uZWwgY3JlYXRpb24gY2FsbGJhY2sgYXM6IHNwZGtfYmRldl9jaGFu bmVsX2NyZWF0ZSgpLDxvOnA+PC9vOnA+PC9zcGFuPjwvcD4KPHAgY2xhc3M9Ik1zb05vcm1hbCI+ PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMS4wcHQ7Zm9udC1mYW1pbHk6JnF1b3Q7Q2FsaWJyaSZx dW90OyxzYW5zLXNlcmlmO2NvbG9yOiMxRjQ5N0QiPkluIHRoaXMgZnVuY3Rpb24sIHdlIGFjdHVh bGx5IHdpbGwgdHJ5IHRvIGNhbGwgdGhlIGJhY2tlbmQgYmRldi0mZ3Q7Zm5fdGFibGUtJmd0O2dl dF9pb19jaGFubmVsKGJkZXYtJmd0O2N0eHQpLCB0aGlzIHNob3VsZCBiZSBwcm92aWRlZCBieSB5 b3VyIGFwcGxpY2F0aW9uLCBpbjxvOnA+PC9vOnA+PC9zcGFuPjwvcD4KPHAgY2xhc3M9Ik1zb05v cm1hbCI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMS4wcHQ7Zm9udC1mYW1pbHk6JnF1b3Q7Q2Fs aWJyaSZxdW90OyxzYW5zLXNlcmlmO2NvbG9yOiMxRjQ5N0QiPlRoaXMgZnVuY3Rpb24sIHlvdSBz aG91bGQgaW1wbGVtZW50IHRoZSBwb2xsIGZ1bmN0aW9uIGp1c3QgYXMgYmRldl9udm1lX3BvbGwo KSwgc28sIHlvdSBjb3VsZCBrZWVwIHlvdXIgb3VyIHBvbGxlciBmb3IgdGhlIGJhY2tlbmQgYmRl diBpbiB5b3VyIG93bjxvOnA+PC9vOnA+PC9zcGFuPjwvcD4KPHAgY2xhc3M9Ik1zb05vcm1hbCI+ PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMS4wcHQ7Zm9udC1mYW1pbHk6JnF1b3Q7Q2FsaWJyaSZx dW90OyxzYW5zLXNlcmlmO2NvbG9yOiMxRjQ5N0QiPmFwcGxpY2F0aW9uIHdpdGhvdXQgbW9kaWZ5 IG9mIHRoZSBudm1mIHRhcmdldCBkcml2ZXIuIFdoZW4gdGhlIG52bWYgdGFyZ2V0IGRyaXZlciB0 cnkgdG8gY2FsbCBzcGRrX2JkZXZfZ2V0X2lvX2NoYW5uZWwoKSBpbiB0aGUgZnVuY3Rpb24gcG9s bF9ncm91cF91cGRhdGVfc3Vic3lzdGVtKCksPG86cD48L286cD48L3NwYW4+PC9wPgo8cCBjbGFz cz0iTXNvTm9ybWFsIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOjExLjBwdDtmb250LWZhbWlseTom cXVvdDtDYWxpYnJpJnF1b3Q7LHNhbnMtc2VyaWY7Y29sb3I6IzFGNDk3RCI+aXQgd2lsbCB0cmln Z2VyIGFsbCB0aGUgcHJvY2VzcyB3aGljaCBJIG1lbnRpb25lZCBhYm92ZS48bzpwPjwvbzpwPjwv c3Bhbj48L3A+CjxwIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTEu MHB0O2ZvbnQtZmFtaWx5OiZxdW90O0NhbGlicmkmcXVvdDssc2Fucy1zZXJpZjtjb2xvcjojMUY0 OTdEIj48bzpwPiZuYnNwOzwvbzpwPjwvc3Bhbj48L3A+CjxwIGNsYXNzPSJNc29Ob3JtYWwiPjxz cGFuIHN0eWxlPSJmb250LXNpemU6MTEuMHB0O2ZvbnQtZmFtaWx5OiZxdW90O0NhbGlicmkmcXVv dDssc2Fucy1zZXJpZjtjb2xvcjojMUY0OTdEIj4tQ3VueWluPG86cD48L286cD48L3NwYW4+PC9w Pgo8cCBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOjExLjBwdDtmb250 LWZhbWlseTomcXVvdDtDYWxpYnJpJnF1b3Q7LHNhbnMtc2VyaWY7Y29sb3I6IzFGNDk3RCI+PG86 cD4mbmJzcDs8L286cD48L3NwYW4+PC9wPgo8ZGl2IHN0eWxlPSJib3JkZXI6bm9uZTtib3JkZXIt bGVmdDpzb2xpZCBibHVlIDEuNXB0O3BhZGRpbmc6MGluIDBpbiAwaW4gNC4wcHQiPgo8ZGl2Pgo8 ZGl2IHN0eWxlPSJib3JkZXI6bm9uZTtib3JkZXItdG9wOnNvbGlkICNFMUUxRTEgMS4wcHQ7cGFk ZGluZzozLjBwdCAwaW4gMGluIDBpbiI+CjxwIGNsYXNzPSJNc29Ob3JtYWwiPjxhIG5hbWU9Il9f X19fcmVwbHlzZXBhcmF0b3IiPjwvYT48Yj48c3BhbiBzdHlsZT0iZm9udC1zaXplOjExLjBwdDtm b250LWZhbWlseTomcXVvdDtDYWxpYnJpJnF1b3Q7LHNhbnMtc2VyaWYiPkZyb206PC9zcGFuPjwv Yj48c3BhbiBzdHlsZT0iZm9udC1zaXplOjExLjBwdDtmb250LWZhbWlseTomcXVvdDtDYWxpYnJp JnF1b3Q7LHNhbnMtc2VyaWYiPiBTUERLIFs8L3NwYW4+PGEgaHJlZj0ibWFpbHRvOnNwZGstYm91 bmNlc0BsaXN0cy4wMS5vcmciPjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTEuMHB0O2ZvbnQtZmFt aWx5OiZxdW90O0NhbGlicmkmcXVvdDssc2Fucy1zZXJpZiI+bWFpbHRvOnNwZGstYm91bmNlc0Bs aXN0cy4wMS5vcmc8L3NwYW4+PC9hPjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTEuMHB0O2ZvbnQt ZmFtaWx5OiZxdW90O0NhbGlicmkmcXVvdDssc2Fucy1zZXJpZiI+XQo8Yj5PbiBCZWhhbGYgT2Yg PC9iPlNoYWhhciBTYWx6bWFuPGJyPgo8Yj5TZW50OjwvYj4gU3VuZGF5LCBKYW51YXJ5IDE0LCAy MDE4IDU6MTAgUE08YnI+CjxiPlRvOjwvYj4gU3RvcmFnZSBQZXJmb3JtYW5jZSBEZXZlbG9wbWVu dCBLaXQgJmx0Ozwvc3Bhbj48YSBocmVmPSJtYWlsdG86c3Bka0BsaXN0cy4wMS5vcmciPjxzcGFu IHN0eWxlPSJmb250LXNpemU6MTEuMHB0O2ZvbnQtZmFtaWx5OiZxdW90O0NhbGlicmkmcXVvdDss c2Fucy1zZXJpZiI+c3Bka0BsaXN0cy4wMS5vcmc8L3NwYW4+PC9hPjxzcGFuIHN0eWxlPSJmb250 LXNpemU6MTEuMHB0O2ZvbnQtZmFtaWx5OiZxdW90O0NhbGlicmkmcXVvdDssc2Fucy1zZXJpZiI+ Jmd0Ozxicj4KPGI+Q2M6PC9iPiBZYWVsIFNoYXZpdCAmbHQ7PC9zcGFuPjxhIGhyZWY9Im1haWx0 bzp5YWVsLnNoYXZpdEBrYW1pbmFyaW8uY29tIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOjExLjBw dDtmb250LWZhbWlseTomcXVvdDtDYWxpYnJpJnF1b3Q7LHNhbnMtc2VyaWYiPnlhZWwuc2hhdml0 QGthbWluYXJpby5jb208L3NwYW4+PC9hPjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTEuMHB0O2Zv bnQtZmFtaWx5OiZxdW90O0NhbGlicmkmcXVvdDssc2Fucy1zZXJpZiI+Jmd0OzsgQW1pciBTYXNz b24gJmx0Ozwvc3Bhbj48YSBocmVmPSJtYWlsdG86YW1pci5zYXNzb25Aa2FtaW5hcmlvLmNvbSI+ PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMS4wcHQ7Zm9udC1mYW1pbHk6JnF1b3Q7Q2FsaWJyaSZx dW90OyxzYW5zLXNlcmlmIj5hbWlyLnNhc3NvbkBrYW1pbmFyaW8uY29tPC9zcGFuPjwvYT48c3Bh biBzdHlsZT0iZm9udC1zaXplOjExLjBwdDtmb250LWZhbWlseTomcXVvdDtDYWxpYnJpJnF1b3Q7 LHNhbnMtc2VyaWYiPiZndDs7CiBJbGFuIFN0ZWluYmVyZyAmbHQ7PC9zcGFuPjxhIGhyZWY9Im1h aWx0bzppbGFuLnN0ZWluYmVyZ0BrYW1pbmFyaW8uY29tIj48c3BhbiBzdHlsZT0iZm9udC1zaXpl OjExLjBwdDtmb250LWZhbWlseTomcXVvdDtDYWxpYnJpJnF1b3Q7LHNhbnMtc2VyaWYiPmlsYW4u c3RlaW5iZXJnQGthbWluYXJpby5jb208L3NwYW4+PC9hPjxzcGFuIHN0eWxlPSJmb250LXNpemU6 MTEuMHB0O2ZvbnQtZmFtaWx5OiZxdW90O0NhbGlicmkmcXVvdDssc2Fucy1zZXJpZiI+Jmd0Ozxi cj4KPGI+U3ViamVjdDo8L2I+IFtTUERLXSBTUERLICYjNDM7IHVzZXIgc3BhY2UgYXBwbGlhbmNl PG86cD48L286cD48L3NwYW4+PC9wPgo8L2Rpdj4KPC9kaXY+CjxwIGNsYXNzPSJNc29Ob3JtYWwi PjxvOnA+Jm5ic3A7PC9vOnA+PC9wPgo8ZGl2IGlkPSJkaXZ0YWdkZWZhdWx0d3JhcHBlciI+Cjxw PjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTomcXVvdDtDYWxpYnJpJnF1b3Q7LHNhbnMtc2VyaWY7 Y29sb3I6YmxhY2siPkhpIGV4cGVydHMsPG86cD48L286cD48L3NwYW4+PC9wPgo8cD48c3BhbiBz dHlsZT0iZm9udC1mYW1pbHk6JnF1b3Q7Q2FsaWJyaSZxdW90OyxzYW5zLXNlcmlmO2NvbG9yOmJs YWNrIj48bzpwPiZuYnNwOzwvbzpwPjwvc3Bhbj48L3A+CjxwPjxzcGFuIHN0eWxlPSJmb250LWZh bWlseTomcXVvdDtDYWxpYnJpJnF1b3Q7LHNhbnMtc2VyaWY7Y29sb3I6YmxhY2siPldlIGhhdmUg YmVlbiBpbnRlZ3JhdGluZyBzcGRrIGludG8gb3VyIHN5c3RlbSB1c2luZyBhIGJsb2NrZGV2IG1v ZHVsZSwgY3VycmVudGx5IG9ubHkgYSBQT0MgdmVyc2lvbi48bzpwPjwvbzpwPjwvc3Bhbj48L3A+ CjxwPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTomcXVvdDtDYWxpYnJpJnF1b3Q7LHNhbnMtc2Vy aWY7Y29sb3I6YmxhY2siPk91ciB1c2UmbmJzcDtjYXNlIGlzIGEgdXNlciBzcGFjZSBhcHBsaWFu Y2UgcHJvY2Vzc2luZyBJT3MsIHdpdGggYW4gU1BESyBmcm9udGVuZCB0byBkbyB0aGUgTlZNZUYu PG86cD48L286cD48L3NwYW4+PC9wPgo8cD48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6JnF1b3Q7 Q2FsaWJyaSZxdW90OyxzYW5zLXNlcmlmO2NvbG9yOmJsYWNrIj48bzpwPiZuYnNwOzwvbzpwPjwv c3Bhbj48L3A+CjxwPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTomcXVvdDtDYWxpYnJpJnF1b3Q7 LHNhbnMtc2VyaWY7Y29sb3I6YmxhY2siPkN1cnJlbnRseSBhbGwgb2YgdGhlIHVzZXIgYmRldnMg YXJlIGNyZWF0ZWQgdmlhIGNvbmZpZ3VyYXRpb24gZmlsZSwgYnV0IHdlIGFyZSB3b3JraW5nIHRv IGFkZCBmdW5jdGlvbnMgJiM0MzsgcnBjJ3Mgd2hpY2ggYWxsb3cgY3JlYXRpb24vZGVsZXRpb24g b2YgdGhlc2UgbmFtZXNwYWNlcy48bzpwPjwvbzpwPjwvc3Bhbj48L3A+CjxwPjxzcGFuIHN0eWxl PSJmb250LWZhbWlseTomcXVvdDtDYWxpYnJpJnF1b3Q7LHNhbnMtc2VyaWY7Y29sb3I6YmxhY2si PklPIGlzIHNlbnQmbmJzcDt0byB1c2VyIHNwYWNlIHZpYSBjYWxsYmFjaywmbmJzcDtpbXBsZW1l bnRhdGlvbiBpcyB1cCB0byB1c2VyIHNwYWNlLCBidXQgb2J2aW91c2x5IHRoZSBsb25nZXIgaXQg bGluZ2VycyB0aGVyZSB0aGUgbG93ZXIgdGhlIHBlcmZvcm1hbmNlLCB3ZSB1c2UgYSBzZXQgb2Yg cmluZ3MgJiM0MzsgdGhyZWFkcyBwcm9jZXNzaW5nIHRoZW0sIHNvCiB0aGF0IHRoZSB0aW1lIHNw ZW50IGluIHRoZSBhcHBsaWFuY2UgaXMgbWluaW1hbC48bzpwPjwvbzpwPjwvc3Bhbj48L3A+Cjxw PjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTomcXVvdDtDYWxpYnJpJnF1b3Q7LHNhbnMtc2VyaWY7 Y29sb3I6YmxhY2siPkdvaW5nIGJhY2sgZnJvbSB1c2VyIHNwYWNlIHdlIHVzZSBhIHNpbmdsZSBy aW5nIChtdWx0aXBsZSBwcm9kdWNlcnMgc2luZ2xlIGNvbnN1bWVyKSBvbnRvIHdoaWNoIHRoZSBj b21wbGV0aW9ucyBhcmUgaW5zZXJ0ZWQsIGFuZCB0aGUgcmluZyBwb2xsIGZ1bmN0aW9uIGlzIHJl Z2lzdGVyZWQgd2l0aCBzcGRrIGNvcmUgKHNwZGtfcG9sbGVyX3JlZ2lzdGVyKS48bzpwPjwvbzpw Pjwvc3Bhbj48L3A+CjxwPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTomcXVvdDtDYWxpYnJpJnF1 b3Q7LHNhbnMtc2VyaWY7Y29sb3I6YmxhY2siPjxvOnA+Jm5ic3A7PC9vOnA+PC9zcGFuPjwvcD4K PHA+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiZxdW90O0NhbGlicmkmcXVvdDssc2Fucy1zZXJp Zjtjb2xvcjpibGFjayI+RG9lcyB0aGlzIHNlZW0gbGlrZSBhIHNhbmUgZGVzaWduPyBXZSdkIHJl YWxseSBsaWtlIHlvdXIgZmVlZGJhY2ssIGFuZCBpZiB0aGlzIGNhbiBiZSB1c2VmdWwgdG8gb3Ro ZXJzLCBwdXNoIHRoZSBjb2RlIGludG8gc3Bkay48bzpwPjwvbzpwPjwvc3Bhbj48L3A+CjxwPjxz cGFuIHN0eWxlPSJmb250LWZhbWlseTomcXVvdDtDYWxpYnJpJnF1b3Q7LHNhbnMtc2VyaWY7Y29s b3I6YmxhY2siPk9idmlvdXNseSB3ZSBhcmUgd2lsbGluZyB0byBnbyB0aHJvdWdoIGFueSByZXZp ZXcvdGVzdGluZyBwcm9jZXNzJm5ic3A7dGhhdCBpcyByZXF1aXJlZC4gQW5kIHNoYXJlIHBlcmZv cm1hbmNlIHJlc3VsdHMgYW5kIGlzc3Vlcy48bzpwPjwvbzpwPjwvc3Bhbj48L3A+CjxwPjxzcGFu IHN0eWxlPSJmb250LWZhbWlseTomcXVvdDtDYWxpYnJpJnF1b3Q7LHNhbnMtc2VyaWY7Y29sb3I6 YmxhY2siPjxvOnA+Jm5ic3A7PC9vOnA+PC9zcGFuPjwvcD4KPHA+PHNwYW4gc3R5bGU9ImZvbnQt ZmFtaWx5OiZxdW90O0NhbGlicmkmcXVvdDssc2Fucy1zZXJpZjtjb2xvcjpibGFjayI+Q2hlZXJz LDxvOnA+PC9vOnA+PC9zcGFuPjwvcD4KPHA+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiZxdW90 O0NhbGlicmkmcXVvdDssc2Fucy1zZXJpZjtjb2xvcjpibGFjayI+U2hhaGFyPG86cD48L286cD48 L3NwYW4+PC9wPgo8L2Rpdj4KPC9kaXY+CjwvZGl2Pgo8L2JvZHk+CjwvaHRtbD4K --===============2120512523569279446==--