From vszocs at redhat.com Tue Jun 17 10:13:35 2014 Content-Type: multipart/mixed; boundary="===============0360007693716082688==" MIME-Version: 1.0 From: Vojtech Szocs To: users at ovirt.org Subject: [ovirt-users] Announcing oVirt.js prototype Date: Tue, 17 Jun 2014 10:13:34 -0400 Message-ID: <1807144956.23636583.1403014414472.JavaMail.zimbra@redhat.com> In-Reply-To: 1437654574.23610909.1403011303578.JavaMail.zimbra@redhat.com --===============0360007693716082688== Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable ------=3D_Part_23636581_113868456.1403014414461 Content-Type: text/plain; charset=3Dutf-8 Content-Transfer-Encoding: 7bit Hello everyone, in past few weeks, we've been working on JavaScript SDK for oVirt Engine. Today, I'm happy to announce the first prototype called oVirt.js :) Attached, there's an "sdk-testdrive" UI plugin which: - bundles oVirt.js prototype [ovirt.js] - contains test code for DataCenter object [plugin.js] To install this plugin, simply copy (or symlink) sdk-testdrive.json file and sdk-testdrive-resources directory under /usr/share/ovirt-engine/ui-plugins. Following is a quick recap of test code exercising oVirt.js. To add new DataCenter: // Obtain DataCenter resource collection. // Resource collection is a handle to work with RESTful objects. var dcColl =3D ovirt.api.datacenters; // Obtain "add DataCenter" operation. // Operation is a reusable, uhm, operation, backed by HTTP request. // You can run the same operation multiple times, if necessary. var addOp =3D dcColl.add({ name: 'test-dc', local: false }); // Register result handler and run the operation. addOp.success(dcAddedCallback).run(); // Example of operation result handler that receives a single resource. function dcAddedCallback (dc) { console.log('Added: ' + dc.data().name); } In dcAddedCallback function shown above, "dc" is a resource object, representing a handle to work with RESTful DataCenter object. It provides access to underlying resource data: var dcDataObj =3D dc.data(); // Get var dcName =3D dcDataObj.name; var dcDesc =3D dcDataObj.description; // Set multiple properties at once ... dc.data({ name: 'test-dc-updated', description: 'test' }); // ... or one by one dcDataObj.name =3D 'test-dc-updated'; dcDataObj.description =3D 'test'; It also gives access to nested collections (if any) and supported actions (if any): // Obtain Cluster resource collection for given DataCenter. var dcClusterColl =3D dc.clusters; oVirt.js is currently only 445 lines of code, yey :) we're not using any code generation at this point, we're simply relying on HATEOAS [1] principle of REST and dynamically augmenting resource objects with nested collections and supported actions, which are part of resource representation. [1] http://en.wikipedia.org/wiki/HATEOAS I feel we'll eventually come to a point where code generation can be useful, but for now, we're trying to keep things small and simple. oVirt.js currently uses Lo-Dash library [2] containing various utility functions. I think that Lo-Dash is great because it makes working with JavaScript a bit easier. [2] http://lodash.com/ Overall, oVirt.js will be self-contained, which means there will be no additional dependencies from JavaScript perspective. Using oVirt.js in HTML page will be as simple as this: This means that (build-time) dependencies such as Lo-Dash will be inlined into resulting oVirt.js build. We're also planning to provide minified version + Source Maps for better debugging. oVirt.js is planned to be usable NOT ONLY in web browsers. In fact, there's "ovirt.svc" namespace containing services used by oVirt.js API implementation. You (or any 3rd party extension) can override these services to achieve SDK portability for given runtime environment. In other words, I'd love to see oVirt.js used also with Node.js :) Finally, an important thing to mention - oVirt.js requires AT LEAST ECMAScript 5.1 compliant environment. All modern browsers support ES5, including IE9+. Unfortunately, IE9 doesn't support ES5 Strict Mode, but that's not that big of a deal. I'll send some more emails outlining implementation design and also how to manage source control & distribution of oVirt.js. Regards, Vojtech ------=3D_Part_23636581_113868456.1403014414461 Content-Type: application/x-compressed-tar; name=3Dovirt-js-sdk.tar.gz Content-Disposition: attachment; filename=3Dovirt-js-sdk.tar.gz Content-Transfer-Encoding: base64 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 cn25vlz/5df/AadgwuoAXAAA ------=3D_Part_23636581_113868456.1403014414461-- --===============0360007693716082688== Content-Type: multipart/mixed MIME-Version: 1.0 Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="attachment.bin" LS0tLS0tPV9QYXJ0XzIzNjM2NTgxXzExMzg2ODQ1Ni4xNDAzMDE0NDE0NDYxCkNvbnRlbnQtVHlw ZTogdGV4dC9wbGFpbjsgY2hhcnNldD11dGYtOApDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiA3 Yml0CgpIZWxsbyBldmVyeW9uZSwKCmluIHBhc3QgZmV3IHdlZWtzLCB3ZSd2ZSBiZWVuIHdvcmtp bmcgb24gSmF2YVNjcmlwdCBTREsgZm9yIG9WaXJ0IEVuZ2luZS4KClRvZGF5LCBJJ20gaGFwcHkg dG8gYW5ub3VuY2UgdGhlIGZpcnN0IHByb3RvdHlwZSBjYWxsZWQgb1ZpcnQuanMgOikKCkF0dGFj aGVkLCB0aGVyZSdzIGFuICJzZGstdGVzdGRyaXZlIiBVSSBwbHVnaW4gd2hpY2g6Ci0gYnVuZGxl cyBvVmlydC5qcyBwcm90b3R5cGUgW292aXJ0LmpzXQotIGNvbnRhaW5zIHRlc3QgY29kZSBmb3Ig RGF0YUNlbnRlciBvYmplY3QgW3BsdWdpbi5qc10KClRvIGluc3RhbGwgdGhpcyBwbHVnaW4sIHNp bXBseSBjb3B5IChvciBzeW1saW5rKSBzZGstdGVzdGRyaXZlLmpzb24gZmlsZSBhbmQKc2RrLXRl c3Rkcml2ZS1yZXNvdXJjZXMgZGlyZWN0b3J5IHVuZGVyIC91c3Ivc2hhcmUvb3ZpcnQtZW5naW5l L3VpLXBsdWdpbnMuCgpGb2xsb3dpbmcgaXMgYSBxdWljayByZWNhcCBvZiB0ZXN0IGNvZGUgZXhl cmNpc2luZyBvVmlydC5qcy4KClRvIGFkZCBuZXcgRGF0YUNlbnRlcjoKCiAgLy8gT2J0YWluIERh dGFDZW50ZXIgcmVzb3VyY2UgY29sbGVjdGlvbi4KICAvLyBSZXNvdXJjZSBjb2xsZWN0aW9uIGlz IGEgaGFuZGxlIHRvIHdvcmsgd2l0aCBSRVNUZnVsIG9iamVjdHMuCiAgdmFyIGRjQ29sbCA9IG92 aXJ0LmFwaS5kYXRhY2VudGVyczsKCiAgLy8gT2J0YWluICJhZGQgRGF0YUNlbnRlciIgb3BlcmF0 aW9uLgogIC8vIE9wZXJhdGlvbiBpcyBhIHJldXNhYmxlLCB1aG0sIG9wZXJhdGlvbiwgYmFja2Vk IGJ5IEhUVFAgcmVxdWVzdC4KICAvLyBZb3UgY2FuIHJ1biB0aGUgc2FtZSBvcGVyYXRpb24gbXVs dGlwbGUgdGltZXMsIGlmIG5lY2Vzc2FyeS4KICB2YXIgYWRkT3AgPSBkY0NvbGwuYWRkKHsgbmFt ZTogJ3Rlc3QtZGMnLCBsb2NhbDogZmFsc2UgfSk7CgogIC8vIFJlZ2lzdGVyIHJlc3VsdCBoYW5k bGVyIGFuZCBydW4gdGhlIG9wZXJhdGlvbi4KICBhZGRPcC5zdWNjZXNzKGRjQWRkZWRDYWxsYmFj aykucnVuKCk7CgogIC8vIEV4YW1wbGUgb2Ygb3BlcmF0aW9uIHJlc3VsdCBoYW5kbGVyIHRoYXQg cmVjZWl2ZXMgYSBzaW5nbGUgcmVzb3VyY2UuCiAgZnVuY3Rpb24gZGNBZGRlZENhbGxiYWNrIChk YykgewogICAgY29uc29sZS5sb2coJ0FkZGVkOiAnICsgZGMuZGF0YSgpLm5hbWUpOwogIH0KCklu IGRjQWRkZWRDYWxsYmFjayBmdW5jdGlvbiBzaG93biBhYm92ZSwgImRjIiBpcyBhIHJlc291cmNl IG9iamVjdCwKcmVwcmVzZW50aW5nIGEgaGFuZGxlIHRvIHdvcmsgd2l0aCBSRVNUZnVsIERhdGFD ZW50ZXIgb2JqZWN0LiBJdCBwcm92aWRlcwphY2Nlc3MgdG8gdW5kZXJseWluZyByZXNvdXJjZSBk YXRhOgoKICB2YXIgZGNEYXRhT2JqID0gZGMuZGF0YSgpOwoKICAvLyBHZXQKICB2YXIgZGNOYW1l ID0gZGNEYXRhT2JqLm5hbWU7CiAgdmFyIGRjRGVzYyA9IGRjRGF0YU9iai5kZXNjcmlwdGlvbjsK CiAgLy8gU2V0IG11bHRpcGxlIHByb3BlcnRpZXMgYXQgb25jZSAuLi4KICBkYy5kYXRhKHsgbmFt ZTogJ3Rlc3QtZGMtdXBkYXRlZCcsIGRlc2NyaXB0aW9uOiAndGVzdCcgfSk7CiAgLy8gLi4uIG9y IG9uZSBieSBvbmUKICBkY0RhdGFPYmoubmFtZSA9ICd0ZXN0LWRjLXVwZGF0ZWQnOwogIGRjRGF0 YU9iai5kZXNjcmlwdGlvbiA9ICd0ZXN0JzsKCkl0IGFsc28gZ2l2ZXMgYWNjZXNzIHRvIG5lc3Rl ZCBjb2xsZWN0aW9ucyAoaWYgYW55KSBhbmQgc3VwcG9ydGVkCmFjdGlvbnMgKGlmIGFueSk6Cgog IC8vIE9idGFpbiBDbHVzdGVyIHJlc291cmNlIGNvbGxlY3Rpb24gZm9yIGdpdmVuIERhdGFDZW50 ZXIuCiAgdmFyIGRjQ2x1c3RlckNvbGwgPSBkYy5jbHVzdGVyczsKCm9WaXJ0LmpzIGlzIGN1cnJl bnRseSBvbmx5IDQ0NSBsaW5lcyBvZiBjb2RlLCB5ZXkgOikgd2UncmUgbm90IHVzaW5nCmFueSBj b2RlIGdlbmVyYXRpb24gYXQgdGhpcyBwb2ludCwgd2UncmUgc2ltcGx5IHJlbHlpbmcgb24gSEFU RU9BUyBbMV0KcHJpbmNpcGxlIG9mIFJFU1QgYW5kIGR5bmFtaWNhbGx5IGF1Z21lbnRpbmcgcmVz b3VyY2Ugb2JqZWN0cyB3aXRoCm5lc3RlZCBjb2xsZWN0aW9ucyBhbmQgc3VwcG9ydGVkIGFjdGlv bnMsIHdoaWNoIGFyZSBwYXJ0IG9mIHJlc291cmNlCnJlcHJlc2VudGF0aW9uLgoKWzFdIGh0dHA6 Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvSEFURU9BUwoKSSBmZWVsIHdlJ2xsIGV2ZW50dWFsbHkg Y29tZSB0byBhIHBvaW50IHdoZXJlIGNvZGUgZ2VuZXJhdGlvbiBjYW4gYmUKdXNlZnVsLCBidXQg Zm9yIG5vdywgd2UncmUgdHJ5aW5nIHRvIGtlZXAgdGhpbmdzIHNtYWxsIGFuZCBzaW1wbGUuCgpv VmlydC5qcyBjdXJyZW50bHkgdXNlcyBMby1EYXNoIGxpYnJhcnkgWzJdIGNvbnRhaW5pbmcgdmFy aW91cyB1dGlsaXR5CmZ1bmN0aW9ucy4gSSB0aGluayB0aGF0IExvLURhc2ggaXMgZ3JlYXQgYmVj YXVzZSBpdCBtYWtlcyB3b3JraW5nIHdpdGgKSmF2YVNjcmlwdCBhIGJpdCBlYXNpZXIuCgpbMl0g aHR0cDovL2xvZGFzaC5jb20vCgpPdmVyYWxsLCBvVmlydC5qcyB3aWxsIGJlIHNlbGYtY29udGFp bmVkLCB3aGljaCBtZWFucyB0aGVyZSB3aWxsIGJlCm5vIGFkZGl0aW9uYWwgZGVwZW5kZW5jaWVz IGZyb20gSmF2YVNjcmlwdCBwZXJzcGVjdGl2ZS4gVXNpbmcgb1ZpcnQuanMKaW4gSFRNTCBwYWdl IHdpbGwgYmUgYXMgc2ltcGxlIGFzIHRoaXM6CgogIDxzY3JpcHQgc3JjPSJvdmlydC5qcyI+PC9z Y3JpcHQ+CgpUaGlzIG1lYW5zIHRoYXQgKGJ1aWxkLXRpbWUpIGRlcGVuZGVuY2llcyBzdWNoIGFz IExvLURhc2ggd2lsbCBiZQppbmxpbmVkIGludG8gcmVzdWx0aW5nIG9WaXJ0LmpzIGJ1aWxkLiBX ZSdyZSBhbHNvIHBsYW5uaW5nIHRvIHByb3ZpZGUKbWluaWZpZWQgdmVyc2lvbiArIFNvdXJjZSBN YXBzIGZvciBiZXR0ZXIgZGVidWdnaW5nLgoKb1ZpcnQuanMgaXMgcGxhbm5lZCB0byBiZSB1c2Fi bGUgTk9UIE9OTFkgaW4gd2ViIGJyb3dzZXJzLiBJbiBmYWN0LAp0aGVyZSdzICJvdmlydC5zdmMi IG5hbWVzcGFjZSBjb250YWluaW5nIHNlcnZpY2VzIHVzZWQgYnkgb1ZpcnQuanMgQVBJCmltcGxl bWVudGF0aW9uLiBZb3UgKG9yIGFueSAzcmQgcGFydHkgZXh0ZW5zaW9uKSBjYW4gb3ZlcnJpZGUg dGhlc2UKc2VydmljZXMgdG8gYWNoaWV2ZSBTREsgcG9ydGFiaWxpdHkgZm9yIGdpdmVuIHJ1bnRp bWUgZW52aXJvbm1lbnQuCgpJbiBvdGhlciB3b3JkcywgSSdkIGxvdmUgdG8gc2VlIG9WaXJ0Lmpz IHVzZWQgYWxzbyB3aXRoIE5vZGUuanMgOikKCkZpbmFsbHksIGFuIGltcG9ydGFudCB0aGluZyB0 byBtZW50aW9uIC0gb1ZpcnQuanMgcmVxdWlyZXMgQVQgTEVBU1QKRUNNQVNjcmlwdCA1LjEgY29t cGxpYW50IGVudmlyb25tZW50LiBBbGwgbW9kZXJuIGJyb3dzZXJzIHN1cHBvcnQKRVM1LCBpbmNs dWRpbmcgSUU5Ky4gVW5mb3J0dW5hdGVseSwgSUU5IGRvZXNuJ3Qgc3VwcG9ydCBFUzUgU3RyaWN0 Ck1vZGUsIGJ1dCB0aGF0J3Mgbm90IHRoYXQgYmlnIG9mIGEgZGVhbC4KCkknbGwgc2VuZCBzb21l IG1vcmUgZW1haWxzIG91dGxpbmluZyBpbXBsZW1lbnRhdGlvbiBkZXNpZ24gYW5kIGFsc28KaG93 IHRvIG1hbmFnZSBzb3VyY2UgY29udHJvbCAmIGRpc3RyaWJ1dGlvbiBvZiBvVmlydC5qcy4KClJl Z2FyZHMsClZvanRlY2gKCi0tLS0tLT1fUGFydF8yMzYzNjU4MV8xMTM4Njg0NTYuMTQwMzAxNDQx NDQ2MQpDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL3gtY29tcHJlc3NlZC10YXI7IG5hbWU9b3Zp cnQtanMtc2RrLnRhci5negpDb250ZW50LURpc3Bvc2l0aW9uOiBhdHRhY2htZW50OyBmaWxlbmFt ZT1vdmlydC1qcy1zZGsudGFyLmd6CkNvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IGJhc2U2NAoK SDRzSUFEVkFvRk1BQSswODczUGJOckw5bkw4QzV3OUgrVldtNUY5eHg0bDc0OXBPNjd1a3p0ak96 WnZKWkRvUUNWbU1LVUlsU0R1Ngpudi8zdDdzQVNZQUVKYWYxdEwxM29XY3NpVnpzTG5ZWGk5MEZR QlhmYmhWQ0ZYR2UzSW10WENoWjVwRlFJM21YNUVYNFVYMzFCTmQ0ClBINit0OGZnYy90Z2YyeC80 clVIdjU2ejdaM2R2WVA5ZzkzZDhTNGI3NHgzdDU5L3hjWlBRWHpkVmFxQzU4REtuZnFYakZaMGQ5 MXoKM1JsV2YvNkhYS01Say8vVXFtYUxYQmF5V0M1RStBeHVYNHFmeXdRTWdwMmR2RG0raXZKa1Vi RDljSnRGY3I1SUU1NFZUR1JnSkRLYgppNnc0eEJac1ZoU0x3OUhvL3Y0K0ZOR2NieVZaSWZLTUY0 bk1lQnJLL0daRXQzZWU3NHdBMHdqYm5KUjVEdTNUSmNzcmVxL2wxaWxYCk01WW1rNXpuU3dkMUtt TjRGQUlQbzJmVVhHWUZUekpXekFTN092MEh1MCtLR2Z3TXlId0RkcFBLQ1UvWkhjOFRQa21oWC9D TjBUTjIKeEg1NWVFRTR6ajR0cEJKTWlmd3VBZE5ucFJJeG15elo4ZHR6bGtCZkJYYVFPa0Z5T2VQ UnJBSm1haWJMRktBRjR4bVRrNDhpS2tCQQp4Rk9TM1VDZlNvV0UyVndVTXhrclFuQlZFWXBGbFBJ Y2lGRUhFc1V5UGhkcXdRSHZqTjlCb3pJdEVxRFBjcGtLcGVXd0hUTHhLVkVGCllxODVqb0E0c0NE dlJKNG5jU3dBbldUQVppTHV0RmdXTWkvNEpFbVRZc21tTW1jM01OZ3pscGRaa2N5RnJVZWlzYk9D QmdtSFp6SEwKeEgzbklRZmFKRHFrS1Q0VklsTWdOY1dBWXBRbWdGNDkwMzVGM1VXZ2dNRzB6Q0tV S3h0c3NsK2VNYmlDRWpWUjVFbFVCS0FkdklVcQpxd2tacmVGOTRQU0g2K3UzdFNxd1gwcGtzWmI3 enlVNE5ZVnl5TVZjRmxxOUltZDNDZGZOeU5nam1ZWVZzbXZVZ0t0djdLMWkvL3ZtCjlROWdmWmNh WjZWbFZTNVFxcnEvOTJMQ0pybThCeUpLSTZ3NER0RndrVzI2YTBoZEFadWFDOE5vaDgvUUJnOFF4 MXVlODdrSzFsbWMKZzNXQmJRU01RVEFlQ3gvYllvRTJ5T0JRTjlDL2tBdm84UkFNYzhyQjlraDh3 ZmRuMTBHN2RabW4wUFRkNVd1RVFLRmJIWEdiaS9rQwpiQTQxQ3N3TllobVZLRjAyNGFEbmQ1Zm5t MjNNTThGajRCZXdkL3NHRnBVYjdSa3dIeTNkcm8xM0l1TWxJT1haRWd3cUxZV3JQMWZGCklmV29N azZYUmxhbXFhTWJtVjJWRVNqYVZVM2RHdHNrMloyOEZleCtCbVBPMFErNVVvRThLSTFqQ3RpWGJB QlRVbEhDcUpLeFlEdmoKOFdiWW9uaVc1ekwvRmZTbVBFbUJtSU5mZ3V2TXdmMkFOYm1rVUFpSERk NUJZNFJEVm5jYXZ4STNtNWFGVjZQMjB5d0h5MGRINGNwMwpzR21Hc0Qwa2VKWVV5YjhFTUw4b0N4 VTZ6eHZTZ00vNjhlOS9OKzZndW9Cb0tMTWM3R09KM1JRUjlPeEdRTHV1czdHdlpNb0cySlFhClht RkRkblIweFBaOHNGYi9qQmdBUFRZMmN2MzJDRVhKL3ZwWCsrWkx0anNldDNpMStuK3VkY1lYNEpj V01Gc1ZPQWRrY1FxNnFSZ1AKdlcwTjR4VWpRUFNuTUZHdlRKdEJyYW5OdnA3Z1ZVTVpHYWdGdUcx eERRTU9WT1ZyOE1CRUNpTVlpZjlsSlhWdEhLdHBFOHlna1ZVZgp6YzVkOTA3YkVpaUdVVEtGT2JE SEs0WWRreldPMExheTBOd0RZeU5mK0tMVENMeWgyd0p2SUxnSDFqZ3VGNzY2YWV5NTNRWjlsOXVB CjdnQTBlcU51cjg5eEtLRUY0ZEF6dlE2N2cyUWhzb0h1MnhDN01HUkZYZ3JQMER6UG9yUUVUeEZC cUFLK08rR3BRbjgxWTF4cHdmS3kKbU1HNGhRbDRycWROakE4aUtXOFRtRDBodG9seXFkU1dTb0Nq YW1MdXNvT1IyNGxGNFlqWTZYSnp2RmlZWUJGMWFTVG5vcnVnR1NDOApGVXMxTUFDYklYQ0hrWnNW YzJDMDVUTk1GTG1lSTQ0cS9POFI5Z09hdDNNakxPUVZ6V3dEajhtU1BZdkMrTHdmcUIzUkhCcnNa Q0d0CmhnOGUrYitDcUpqSjZaU0MzRjUxb3JzZW9GMVlHUFg0cU1aRkxvb3l6K3JJNU1XemgwM3l4 RTBJWEJZWUlpYnJZK0IzV1pyY05pSHoKMEdvSkFTMk1Ja3dQTUFaVkN1Sklpc3JaZlo1UVJEbVhB Q0dtMHlUQ2lKRDluZDl4azEzZ2ZCU2FDQkVSdWlGaVJXeE5xTmh3NHNhSwo3NG9tL0FWTDVzU0xq aFd3dThSWjhpbUJhSlc0alFVTUR6REdDRzBObkVoSlRNeHBPa25VWE11L3BoV2FwcTA0RDdJVFlM Q0VLS2FKCjFTeFN0V2RYTkdKcWtvalFtZkhWUWtSckl6OTdBR1pDWUNTT2ZhMEFxY3YySklLSU5k c3QxRHpQK2RKRFlJeHhQR212eGIyTEU3cngKK1JoTmdFZ0RBM3dHZVlIcHNncmxFMHlTZXNWRGdY dHRKd3VSb3h6Z2preFRlVTg1VEFFc3VSRXdwRkVrRVFFeVdBYUd0U0VRVzRDMgprVGcybTFGeXBn UkFnbzN3dWF4dHhNRzEwK0NDTUtyb3djYWpvb1JVMUF4QzZxaURaVGNFUDNwRHdiSEZVc3NZMGF4 elBhZUJkbk01CnI3T2ZPblYwa082RkdGR0F2elQyQ2ZKcDhUaEpkTVlVWUFJYVVNQnZBempZOXNP S2ZUOE1FTEVEUnJUYW9hR01RZlJDK1lMRStkSU0KMVBZREpHR1BZWXVUbGNFaWtvVjI5T0daVU91 UmFyNEF5UHNQTGdpeUNnRDBZUjczQlJhT1puQVEyem9NTzFnL1l4YWFMODJrYzFTNwpXWDFqL1lS eDdGVjV2NjVEajRBOG5FNHpINS9UTEl4NG1nNFEwNURwLzBienkzV1RtN0VtYkdSTldzTm50dFc5 MGI2bTltUUtheU0wCm9QSkpVbUNCaU1sRnl3M2hvTG5RTjIyRGJKanpHYUxCWWt3bnJINzZjZ3lV c1E1NEt5Z3NLOXlJQW9MS2thS1BoaXlONExuSWI4U1cKekxiZ0tUaEY3SUxNWGJramQySERSRE8z VEtGcmMzNHJ2aGZGbFNqZUlLWlhtZW1NZ1grY1lKMW9vRFVsM3N2OEZxVkszTFk4dThOSwplNDU3 dzIrZC9CUDhIR2xIR1huUXFEQXlrZlc4cFNPZ3g0Z0dwMUd3THowVktLeUl3VGRYdU0xMHlQTWJY Vis0VDlKVVk4WkNEOHdKCkZCSElxZllxQmpySmFBaEFJMUU3TTJMWDhYSU9LeGVZTGQ4bldDUnBO eVNTRTJFYWk3aHAxMUZlMXlnMXJyWlpHajRhNEhJUnd6elQKbDc5aTZxVmozd3F3TCsvNktTVFpE RFJaQ044MHVEL3Y4aHBUYlZRNkVmU1RxVm9TRlUvYmR2cm1QbmlNcFJxZjBMYlR5bFg0YlRVVwpZ c0dpVkdZWVZrTjBSVXNlNEI5OTloSm8wUVRhV01oNmRFdkxUakF1cDV1TnlwSEVDZDQ2em1KU3Vq TXhFc0ZhNmg1ZnBFa2NnWjdvCjJ5bGdNNjFhT2pJY1ZQb2thSTg2dllsQUxTN0tCT3JDckpzU1lB SUFZeG03T01kQ093d3U4TGdMbWVnQUh3dTlWY2M0cXFpSzMva2kKY2NQM210cWErTDJlbjl2QjlZ c2FwTkZ1UitNTjBMVHJSUnQ3Nms0cWJxekdMcyt1cnFkbHlxb0ZNWWhhMDFSWVpaakczNmxMQTNO UwpnL1JOTmVUaVlTZzQxYWdrYnR5NGYveWovN2dBbStTNnBtSk12bU5pSnVEcURrVlpUWVhteTdB RGdhV0ZOMVFLT05SRmppNElLQlFYClc4U240aTB2Wm9kNmtuUnZzcTlaTUFyZ1AzU3AweDZtNmt4 aFpINUpYdHdlRDJDc3ZNOVRXU0tvNUR6b3J5VWhwa09IRkxVNGhkdWEKaXIrdzVIRjhMZCswYVEr bUYwNkFjcWs1bEpXQ2NGaWttUFhXaTZuc0pwZmxRaWZVdE03VGExVWtLRFFTUW1CYnlYK0FoWFEw YkN2dApHRlBBM3lSVEhzZU40T3JocXFVYW9ITHJtWmdjOWFQRWpEaVBXcGI0Snh1TmJ5K3VmTUpH bU85a3ZEeGtmNys2K0RIVStUT2t6TnJNCi81OFBQdzFST2ZQcmloN0wrWDJqZENSSUxoN25tY215 ZWVERURNMjZpWS9ycm5CcStGaE1rMHk4MWNIQzhsTHcrQ0xEdFJzTUgzNmsKS2g5Kyt5Zkd1VzNo bXZxa2k4SFlYdFBjVjVnRVpJY04zcTZXc2NhRzY4MmdYZzVoV1JjZ2t0azB1U2x6RFlRVjFpNk15 Q0NHdGlBNgpPVnlqcEs1WWNoR1hrWGlkWkxlS0RhanUwek9NNkZtb3dhMHdRY2Y0US9DZzJhM1BL UFh6OS9nWUdxZVlIdFAzV1M2bVhUTXl0SFNqClZqSUtFdTdwVEJVcEJra2NzQXd5azBxc2Ruem4w LzRBV3d6SjhzSWszbnpoUVlsOGZpNVNhbVBRNHZjVzRzYitNU1lWT203TGhFTGYKNkhHQlZwNU1T K3ZscEFsY3RONk9OQ21VYTdzODBzZWlnMFVGUTlzT0JsMFM5bmlPQlM2Qk5pUWYwYmxtN1piN3Vz U2R2dERBQ2cwZwpsdkR0MzZHMnMwZjJrbnU3eDkxKzFWaU04U0c1dHNzNnc1VnNtS2s4RGd1TGVn RzRxTURPTUV3QmRick9pWFZtWElZVDFLYWJCZFhFCmJjSkRROVRVYlUyUkZpSmhMRmVud25JS1ZZ SzBkSVdPcXkwZ2JYdnRCVW0vY0lDUWt1WUw5SUl3WVNxeUc0Z2NjYTExZTVQOURmdjEKSGgrOEgz LzR3QTdkMnB0ZCtYT1l0NGFRUllBK0lTV216MEg5QktrMFlGMFNsN1hQOEVpNnBWZE5ZczRYZzlY VDZlT20wYytiUGgzbgp0ZWxZbU5jZTdQU2tuWmhVL09uU0gzeVk2T1c5dVdNVjFJYmVqT2ZEWnR2 RVQrUjhVY0s0TnV2dkUxSGNDOXlZZEMvcm5NczJjQlluCjA2bG5pUUFUVDN3a2NwRkZ3dHFzSTV3 V1ZmRUZGMFN4Rm9KbEdzRndTNVUwSExSR1NxVFpPMFVjQTVrbk53bmtyME0ybDRBMUViRXQKSERK Y2hHc1ZvMXNsbHdySlpyVUtidTdYS0h2Q0FCb3FOWkNuN2dvQWZjdVUxVkRFYm5qMkZ0RHlmTVZY T09QcTRqNnI0dzFFMnhmMgpZWUV6MW51OEtoSmdIRXJwZFNad0ZRWm5nR3UvRWhlZHNBYTgxRVVT U3kvK0xRc0lnSU1jSisrcTQvVDdNOHRMYmowdWNnME9JNzk2CkYxdmRpVnhFWmE2U093SE1vdm5w U3NsNmxtMUJBOWVXOWRSNnB4NE0zUTcxVk5SUUx6YkdWZHNqYkdHNTZ2WkJyOTBqMFZjL1N0VFoK enlWUEIwaU9JaVB3a2pTWURva0R5OVg0Tk5KQjR4dFJOY0xxVnFjKzlldnJNNzFGbWI1U0REcjZ6 dVNyQ21tMll4cTNVbE50cloxVwpjeG5raXFhanB6VExkK05oWEFHL3lYUXVrVnNPdmExeW9uL0Vi QkRmNnBWTnJsVWZwQm1pZDZIQzdlZ1RMRmVnRTc0NHZRQ2JGSGRZCmNVYzhxQnZMWjJBSmRRRHNv UmN1R0U5cGJ4VXpFbVcwZ2d6MlFBeTVnblluT3NyVWpYeFdyWVVZQVRRMlpTdGI3NGxKVjRRT2ph Wm8KOGd2Yjh1d3BTeGdQNGhRY1dsVUdBL0tuTGVlOGZmZFpGUWFmOHp1bHdVQWllN3JpZzZXUkZV SFJyMXExK0UyVktKT3hyRks1QWZuVApxdnowN1BYWjlkbEtyUWUvUEFTUEZ0T3hXZmF1eHhhNWtW K1hoTllKYU90dXl4M2E0Wk1MK2RqTlhxaXBlcEhkSHlwN292Uk9JZHloCnJmR3RETlRYeSsxUitX MHRKcjVlUHZ6ekJOTmo5Mlpmc1Q0OG9GR2E3VXdtTXo3VlZkaXNiMmgwaE42dzBTRG9yYi9pOVVT akJhLzEKSXdhdng5UmlLeml2dDJ3NjVuR01lTFh0aWZjYUVsNFBiWC8zMEc5Y05EK2Jra2toRjFz cHpOUnBLeEt3cG1yYUdTY3pVRzZDdWRiYQpoUEl4YVdTMU1PbFRoSGRGaVppQ0JLcitRUlV2cTR0 cms5SnVLbm8rWmNFMEN6QWRiRFlxRE8wWm9yWEgyazBzNmhRMWsxdHkwUUt0CkpRUGgxS3ZzSXY5 UkFraHJxNHdWSGRjN294SGlieERPUURqOFU1aEJvemJUM1JDNDNvZnBoc0QxRUsxNXIwOXUwY0dS b05vLzFJbVIKNnhGa0I4bTBiNmVWL2RiYnd5bmtiTGh0bnRNV2J1dHBOeEJHVmlvc0EyZUhlZHNy NTB2UGlJVnV2ZVc1b3VpTm11S3FOQTAxYjJLcwpLNzdBRUlFc3NLVkwxSk10dTBzSjlWNlRhcWNj SkcyWlFQWjV2dXdTcllvQnRZTEpnRnVCVDIrK1hiUHJhMlZxNHQ1VkVsOG56RkdDCnhuV2J3eVVN Yy9RSmoyNjczRGY3LzcyMEhxQnBFYzNZd0x2MXBQSTArcndDRTJRSzJxK2t5dzQwZUJnbFV4R204 bVlRYUxPNW55VlkKVmdRbG1WMCtwQ2J3dCt4cjF0N3cwRVJ1dnRVSE5ES04wNXh4T1pHeGIzWjdK TDhPcjVmdUlSbzlVVnNIYVpCYmkyaGZJbklwYmhKRgptNkVlb1IrS0pWVTk5cHJwc2dKdDk4MGVx WlpIYXVDOTZYOXJuMWc3QXU0d3JFWFd3NjR3cnVBeHpGWnU0NmxZTGZWbW5KclRZWDBpCjhKR243 YWdIT2FCWmRWNElmUkVrckxqVGZlVTVCUGU4QncxdE5OQWYrazk3VktjTEFzemFGMFdBTVZLQU8z aVRpUG96K3Foa0Z2UzAKb2NrMEs3YXVsd3Z4ZVMxZkpTa29tTnJBcEZ4dFFoeEF1RWdQdEJ0UzNk cENXd3FyVHRZNFo3ZzgyMTFOakZWTFNRZGQzWkNwek5QRApGcGNDSXExTWZNZVZlSmVuT0FxN1cx TThpWTd1L0dGOWxMQURNYUZ3cm1ZSW83dDI1TlVXQ0IzczdEMm1NVjhTSW4xVXd6NU9aODJOCnc4 YUg5YTU1TzlHWU5Zbi94cXAramVrRGdPalFvUlZMVWZKQkc3c3NuQTI5T3FMdURKY3owbEIxNnZQ MWtMeW5MQXNJWTJDeVMyaDMKcDByeFpMZlQwbEhzb1E1bkRrZWo3WjJEY0F4LzI0ZmZqTDhadHdK eVBEQ1RjaXhUeDJUNnVGTndKdlFoUjhtMFFadjVWaEZETWRNSApmZk5BNGVFQktuTTdLUmVKM0I0 SVpuVzlYYjMwQ3ZiRFpyUHJyRXIyY0U4ZFRSK2VvTHlUSWxlelZSMzlrZkVuV1ZKWWV4Y3doSTBU CkZlRUpjQWh5MDlSQ2JXRWtoTmdjQStzSWQ4K1FaMXFiK3JZajlVQy9IbUpMNjJjRWowY1dSbDAx cUpPUktueGVKTlkrUTl5WEJ3Qi8KOU5zUHZseXE1LzBmVDBsalBCNGY3Ty8zdmY5RHZ5OWplMmQz bitCMmR0aDQrL24rd2M1WGJQOHBtZWk3L3N2Zi8rSG9QOFFnNGVscApySDcveTdoKy84djQrUTc4 M3diOTcrODkzL255L3BmZjQ5Sk9mZ09MVFJ1SGJNTXhodzA5czI1QXlJWFBGbWtKN243a2dJejBU WWhyCjVta0ZYamtSbkNzNk9Cc1hzL0hzNFl2Ly84T3ZQdjl2NmZVMzAxZzMvbmNQZHN6N24vWjJ4 anQ3K1A2bmcrY0hYOGIvNzNHOS9Fc3MKSTN6bkUwTlZmL3ZzWmZVQldkRzNOSjVmUW1yR2NWZEZy a1J4dEZFVzA2MXZOZ0JpcEVGZVlwcGtJSlUreDYzeTZHaGpOSXJpN0tQQwpCZW95bnVKN2p1aXRU ZndqL3pSS2s0bXFYdVgwVVkxMndyMXd1L205OGUzTGtjYmtRVnU5bDJ3bGtERmVGK3JsU0hNS2pG TVgvMmpKCi96bXVOZVAvU1Y0QXQyYjg3KzRlN0xueDM4NTRiM2YveS9qL1BTNWFhY2lTT2NjVEow bkUzcDB6clhvMmtiSlFrSjB2OUZ2VDlOMWoKeXY2eDZKTVZZWDFyRURobWhDKzFxSitGdWFrZm1u d1NFczBDYmw4SlNyT1BJMzI2LzdDbjNJWTRUeEhub0s1RVBMU3c4M2hadmNiaQpHcmRZZDE5blI2 c29uT1VKdmw2aVNab3IxQTNGWmhjN3oySTVQNGQwOWtia2JEQlBzaUZreVo4OHhaVTNFT1NFMDFU S2ZFQmZkVXZBCitEL1FqSDlpV3d3YXM2OXhjK3ZYK0xXek9IVXhvWTIydUVCNFF2bHovN0VWMm5V VVlZWU9PcWlQMmRuSnZGVnJNTnYzR3J4RFVKdmUKd1VkcmJGemgwaUNnMXlkb3F0VWtyTHlLekJ4 ZTFjVHdsSXhWRE1CUThaQUZLTDZ0T05yQ3NyY2pyc0Y0eUxaaENGakxuYW1NZUdwWApUUjQycTZy MklJNk84YTF4SjFYVkY2dXY5UXVpbXRNV0xoU0Racll5bkVJOVFlclZnMWl2SVE0MlExcm1iZ3Bx YVBhNEMyMXBDU2pBCk4vTHAyY0xaN05VZ3NSNWplZlVkN2V1SkdTK0ltQkUzbUdwWXlQT3JpKzZy WWZBa3E5NExaS3VsS25oakZWeWZ0RlRBTEF2aUtPanMKU1FSZTlHNmlnUzFCdzBoSGhwYWxXWkpz UWErVXBZRmRMODFUdmVHbHYxOVVnTmZiVHB3MVBFOFA5ZVlacDRjYS9XTjcySUtHSHRLTgpTME8y dDdlbW5lbXQwOGE4bW9vK1JHY1F2OGJqZWxoMmEvcXZuQ0dFM3RYcGtNSW1qekQ3Rmh3cTY3aDlx c2JjOG16dWlEdHZPbkQ2CnEzR3ZVYTdwNHZlaXNKMFV1SXp6MDlZTExuUlhRZHVEQmxrUzI3MytY aGJmTGMvOWF0UitvVStsclpZcmpSWmdOWDhyZXZid0pmdjgKY24yNXZsei81ZGYvQWFkZ3d1b0FY QUFBCi0tLS0tLT1fUGFydF8yMzYzNjU4MV8xMTM4Njg0NTYuMTQwMzAxNDQxNDQ2MS0tCg== --===============0360007693716082688==--