From donny at cloudspin.me Thu Dec 18 11:09:35 2014 Content-Type: multipart/mixed; boundary="===============0031585488750878343==" MIME-Version: 1.0 From: Donny Davis To: users at ovirt.org Subject: Re: [ovirt-users] IPv6 Functionality for WebSocket Proxy Date: Thu, 18 Dec 2014 09:09:26 -0700 Message-ID: <02bf01d01add$01368830$03a39890$@cloudspin.me> In-Reply-To: 02ac01d01adc$89c68340$9d5389c0$@cloudspin.me --===============0031585488750878343== Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable This is a multipart message in MIME format. ------=3D_NextPart_000_02C0_01D01AA2.54DA4840 Content-Type: text/plain; charset=3D"us-ascii" Content-Transfer-Encoding: 7bit I would also like to note that if nginx and websocket proxy are on the same machine you cannot have both nginx and websocket proxy listening on 6100. it would be best to change the websocket proxy listening port and then proxy both ipv4 and 6 with nginx :) = From: users-bounces(a)ovirt.org [mailto:users-bounces(a)ovirt.org] On Behal= f Of Donny Davis Sent: Thursday, December 18, 2014 9:06 AM To: users(a)ovirt.org Subject: [ovirt-users] IPv6 Functionality for WebSocket Proxy = I just realized this morning that my noVNC connections were not working for IPv6 only on cloudspin.me For those who want to deploy dual stack functionality for ovirt-websocket-proxy here is a very simple and elegant fix. = = NGINX is a useful tool :) = You will need nginx to proxy the connection between your IPv6 customers, and the IPv4 listening only websocket proxy(however that can be changed in /usr/share/ovirt-engine/services/ovirt-websocket-proxy/ovirt-websocket-proxy .conf but you can't have your cake and eat it too. one or the other ipv4 or ipv6) Anyways, here is the fix = Install nginx on your websocket proxy server - Why Nginx, because I like it better than apache. The default config for Ovirt could be setup to do this with the web server that is already running :) just sayin For my configuration I am running the websocket proxy on a different host, but I imagine you could use this config in a full deployment and use websocket proxy on the engine host = server { server_name web.cloudspin.me; # this is the hostname that you told the engine that the websocket proxy would be listening on #listen 6100; #Commented because I am using this for ipv6 only, but you could use nginx to proxy both and only open one port in the firewall listen [::]:6100 ssl; #NOTE this needs to listen on the same port you told the engine the websocket proxy would be listening on = ssl_certificate /physical/path/to/ssl/cert; #I used the same cert that my websocket proxy is using ssl_certificate_key /physical/path/to/ssl/key; = ssl on; ssl_session_cache builtin:1000 shared:SSL:10m; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_ciphers HIGH:!aNULL:!eNULL:!EXPORT:!CAMELLIA:!DES:!MD5:!PSK:!RC4; ssl_prefer_server_ciphers on; = access_log /var/log/nginx/websocket.cloudspin.me-access.log; error_log /var/log/nginx/websocket.cloudspin.me-error.log; = location / { proxy_pass https://ip_address_of_websocket_proxy:6100; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; = } } = = Too easy to fix the many problems I have had getting websocket proxy to work. If you have a commerical cert and key, this would be a great place to put it, so your users don't have to bother with trusting your CA, it will just work = = Cheers and I hope this helps = If anyone needs any help getting this to work give me a shout = Donny D cloudspin.me = = = ------=3D_NextPart_000_02C0_01D01AA2.54DA4840 Content-Type: text/html; charset=3D"us-ascii" Content-Transfer-Encoding: quoted-printable

I would also like to note that if nginx and =3D websocket proxy are on the same machine you cannot have both nginx and =3D websocket proxy listening on 6100… it would be best to change the =3D websocket proxy listening port and then proxy both ipv4 and 6 with nginx = =3D :)

 

From:= =3D = =3D users-bounces(a)ovirt.org [mailto:users-bounces(a)ovirt.org] On Behalf O= f =3D Donny Davis
Sent: Thursday, December 18, 2014 9:06 =3D AM
To: users(a)ovirt.org
Subject: [ovirt-users] IPv6 = =3D Functionality for WebSocket Proxy

 

I just =3D realized this morning that my noVNC connections were not working for =3D IPv6 only on cloudspin.me

For those = =3D who want to deploy dual stack functionality for ovirt-websocket-proxy =3D here is a very simple and elegant fix.

 

NGINX is a = =3D useful tool :)

 

You will = =3D need nginx to proxy the connection between your IPv6 customers, and the =3D IPv4 listening only websocket proxy(however that can be changed in =3D /usr/share/ovirt-engine/services/ovirt-websocket-proxy/ovirt-websocket-pr= =3D oxy.conf but you can't have your cake and eat it too… one or the =3D other ipv4 or ipv6)

Anyways, here is = =3D the fix

 

Install nginx on your websocket proxy server - Why =3D Nginx, because I like it better than apache. The default config for =3D Ovirt could be setup to do this with the web server that is already =3D running :) just sayin

For my =3D configuration I am running the websocket proxy on a different host, but =3D I imagine you could use this config in a full deployment and use =3D websocket proxy on the engine host

 

server =3D {

        server_name =3D web.cloudspin.me; # this is the hostname that you told the engine that =3D the websocket proxy would be listening on

        #listen =3D 6100;           &n= =3D bsp; #Commented because I am using this for ipv6 only, but you could use = =3D nginx to proxy both and only open one port in the =3D firewall

        listen [::]:6100 =3D ssl;     #NOTE this needs to listen on the same port = =3D you told the engine the websocket proxy would be listening =3D on  

        ssl_certificate= =3D            =3D /physical/path/to/ssl/cert; #I used the same cert that my websocket =3D proxy is using

        =3D ssl_certificate_key       =3D /physical/path/to/ssl/key;

 

        ssl =3D on;

        =3D ssl_session_cache  builtin:1000  =3D shared:SSL:10m;

        ssl_protocols  = =3D TLSv1 TLSv1.1 TLSv1.2;

        ssl_ciphers =3D HIGH:!aNULL:!eNULL:!EXPORT:!CAMELLIA:!DES:!MD5:!PSK:!RC4;

   =3D      ssl_prefer_server_ciphers =3D on;

 

        access_log =3D /var/log/nginx/websocket.cloudspin.me-access.log;

        error_log =3D /var/log/nginx/websocket.cloudspin.me-error.log;

 

        location / =3D {

          &nb= =3D sp; proxy_pass https://ip_address_of= =3D _websocket_proxy:6100;

          =3D proxy_http_version 1.1;

          =3D proxy_set_header Upgrade $http_upgrade;

          =3D proxy_set_header Connection "upgrade";

          &nb= =3D sp;   

        }

    }

 

 

Too easy to fix = =3D the many problems I have had getting websocket proxy to work. If you =3D have a commerical cert and key, this would be a great place to put it, =3D so your users don't have to bother with trusting your CA, it will just =3D work

 

Cheers and I =3D hope this helps

 

If anyone needs = =3D any help getting this to work give me a shout

 

Donny =3D D

cloudspin.me

 

 

 

------=3D_NextPart_000_02C0_01D01AA2.54DA4840-- --===============0031585488750878343== Content-Type: multipart/alternative MIME-Version: 1.0 Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="attachment.bin" VGhpcyBpcyBhIG11bHRpcGFydCBtZXNzYWdlIGluIE1JTUUgZm9ybWF0LgoKLS0tLS0tPV9OZXh0 UGFydF8wMDBfMDJDMF8wMUQwMUFBMi41NERBNDg0MApDb250ZW50LVR5cGU6IHRleHQvcGxhaW47 CgljaGFyc2V0PSJ1cy1hc2NpaSIKQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogN2JpdAoKSSB3 b3VsZCBhbHNvIGxpa2UgdG8gbm90ZSB0aGF0IGlmIG5naW54IGFuZCB3ZWJzb2NrZXQgcHJveHkg YXJlIG9uIHRoZSBzYW1lCm1hY2hpbmUgeW91IGNhbm5vdCBoYXZlIGJvdGggbmdpbnggYW5kIHdl YnNvY2tldCBwcm94eSBsaXN0ZW5pbmcgb24gNjEwMC4gaXQKd291bGQgYmUgYmVzdCB0byBjaGFu Z2UgdGhlIHdlYnNvY2tldCBwcm94eSBsaXN0ZW5pbmcgcG9ydCBhbmQgdGhlbiBwcm94eQpib3Ro IGlwdjQgYW5kIDYgd2l0aCBuZ2lueCA6KQoKIAoKRnJvbTogdXNlcnMtYm91bmNlc0BvdmlydC5v cmcgW21haWx0bzp1c2Vycy1ib3VuY2VzQG92aXJ0Lm9yZ10gT24gQmVoYWxmIE9mCkRvbm55IERh dmlzClNlbnQ6IFRodXJzZGF5LCBEZWNlbWJlciAxOCwgMjAxNCA5OjA2IEFNClRvOiB1c2Vyc0Bv dmlydC5vcmcKU3ViamVjdDogW292aXJ0LXVzZXJzXSBJUHY2IEZ1bmN0aW9uYWxpdHkgZm9yIFdl YlNvY2tldCBQcm94eQoKIAoKSSBqdXN0IHJlYWxpemVkIHRoaXMgbW9ybmluZyB0aGF0IG15IG5v Vk5DIGNvbm5lY3Rpb25zIHdlcmUgbm90IHdvcmtpbmcgZm9yCklQdjYgb25seSBvbiBjbG91ZHNw aW4ubWUKCkZvciB0aG9zZSB3aG8gd2FudCB0byBkZXBsb3kgZHVhbCBzdGFjayBmdW5jdGlvbmFs aXR5IGZvcgpvdmlydC13ZWJzb2NrZXQtcHJveHkgaGVyZSBpcyBhIHZlcnkgc2ltcGxlIGFuZCBl bGVnYW50IGZpeC4gCgogCgpOR0lOWCBpcyBhIHVzZWZ1bCB0b29sIDopCgogCgpZb3Ugd2lsbCBu ZWVkIG5naW54IHRvIHByb3h5IHRoZSBjb25uZWN0aW9uIGJldHdlZW4geW91ciBJUHY2IGN1c3Rv bWVycywgYW5kCnRoZSBJUHY0IGxpc3RlbmluZyBvbmx5IHdlYnNvY2tldCBwcm94eShob3dldmVy IHRoYXQgY2FuIGJlIGNoYW5nZWQgaW4KL3Vzci9zaGFyZS9vdmlydC1lbmdpbmUvc2VydmljZXMv b3ZpcnQtd2Vic29ja2V0LXByb3h5L292aXJ0LXdlYnNvY2tldC1wcm94eQouY29uZiBidXQgeW91 IGNhbid0IGhhdmUgeW91ciBjYWtlIGFuZCBlYXQgaXQgdG9vLiBvbmUgb3IgdGhlIG90aGVyIGlw djQgb3IKaXB2NikKCkFueXdheXMsIGhlcmUgaXMgdGhlIGZpeAoKIAoKSW5zdGFsbCBuZ2lueCBv biB5b3VyIHdlYnNvY2tldCBwcm94eSBzZXJ2ZXIgLSBXaHkgTmdpbngsIGJlY2F1c2UgSSBsaWtl IGl0CmJldHRlciB0aGFuIGFwYWNoZS4gVGhlIGRlZmF1bHQgY29uZmlnIGZvciBPdmlydCBjb3Vs ZCBiZSBzZXR1cCB0byBkbyB0aGlzCndpdGggdGhlIHdlYiBzZXJ2ZXIgdGhhdCBpcyBhbHJlYWR5 IHJ1bm5pbmcgOikganVzdCBzYXlpbgoKRm9yIG15IGNvbmZpZ3VyYXRpb24gSSBhbSBydW5uaW5n IHRoZSB3ZWJzb2NrZXQgcHJveHkgb24gYSBkaWZmZXJlbnQgaG9zdCwKYnV0IEkgaW1hZ2luZSB5 b3UgY291bGQgdXNlIHRoaXMgY29uZmlnIGluIGEgZnVsbCBkZXBsb3ltZW50IGFuZCB1c2UKd2Vi c29ja2V0IHByb3h5IG9uIHRoZSBlbmdpbmUgaG9zdAoKIAoKc2VydmVyIHsKCiAgICAgICAgc2Vy dmVyX25hbWUgd2ViLmNsb3Vkc3Bpbi5tZTsgIyB0aGlzIGlzIHRoZSBob3N0bmFtZSB0aGF0IHlv dSB0b2xkCnRoZSBlbmdpbmUgdGhhdCB0aGUgd2Vic29ja2V0IHByb3h5IHdvdWxkIGJlIGxpc3Rl bmluZyBvbgoKICAgICAgICAjbGlzdGVuIDYxMDA7ICAgICAgICAgICAgICNDb21tZW50ZWQgYmVj YXVzZSBJIGFtIHVzaW5nIHRoaXMgZm9yCmlwdjYgb25seSwgYnV0IHlvdSBjb3VsZCB1c2Ugbmdp bnggdG8gcHJveHkgYm90aCBhbmQgb25seSBvcGVuIG9uZSBwb3J0IGluCnRoZSBmaXJld2FsbAoK ICAgICAgICBsaXN0ZW4gWzo6XTo2MTAwIHNzbDsgICAgICNOT1RFIHRoaXMgbmVlZHMgdG8gbGlz dGVuIG9uIHRoZSBzYW1lCnBvcnQgeW91IHRvbGQgdGhlIGVuZ2luZSB0aGUgd2Vic29ja2V0IHBy b3h5IHdvdWxkIGJlIGxpc3RlbmluZyBvbiAgIAoKICAgICAgICBzc2xfY2VydGlmaWNhdGUgICAg ICAgICAgIC9waHlzaWNhbC9wYXRoL3RvL3NzbC9jZXJ0OyAjSSB1c2VkIHRoZQpzYW1lIGNlcnQg dGhhdCBteSB3ZWJzb2NrZXQgcHJveHkgaXMgdXNpbmcKCiAgICAgICAgc3NsX2NlcnRpZmljYXRl X2tleSAgICAgICAvcGh5c2ljYWwvcGF0aC90by9zc2wva2V5OwoKIAoKICAgICAgICBzc2wgb247 CgogICAgICAgIHNzbF9zZXNzaW9uX2NhY2hlICBidWlsdGluOjEwMDAgIHNoYXJlZDpTU0w6MTBt OwoKICAgICAgICBzc2xfcHJvdG9jb2xzICBUTFN2MSBUTFN2MS4xIFRMU3YxLjI7CgogICAgICAg IHNzbF9jaXBoZXJzCkhJR0g6IWFOVUxMOiFlTlVMTDohRVhQT1JUOiFDQU1FTExJQTohREVTOiFN RDU6IVBTSzohUkM0OwoKICAgICAgICBzc2xfcHJlZmVyX3NlcnZlcl9jaXBoZXJzIG9uOwoKIAoK ICAgICAgICBhY2Nlc3NfbG9nIC92YXIvbG9nL25naW54L3dlYnNvY2tldC5jbG91ZHNwaW4ubWUt YWNjZXNzLmxvZzsKCiAgICAgICAgZXJyb3JfbG9nIC92YXIvbG9nL25naW54L3dlYnNvY2tldC5j bG91ZHNwaW4ubWUtZXJyb3IubG9nOwoKIAoKICAgICAgICBsb2NhdGlvbiAvIHsKCiAgICAgICAg ICAgIHByb3h5X3Bhc3MgaHR0cHM6Ly9pcF9hZGRyZXNzX29mX3dlYnNvY2tldF9wcm94eTo2MTAw OwoKICAgICAgICAgIHByb3h5X2h0dHBfdmVyc2lvbiAxLjE7CgogICAgICAgICAgcHJveHlfc2V0 X2hlYWRlciBVcGdyYWRlICRodHRwX3VwZ3JhZGU7CgogICAgICAgICAgcHJveHlfc2V0X2hlYWRl ciBDb25uZWN0aW9uICJ1cGdyYWRlIjsKCiAgICAgICAgICAgICAgIAoKICAgICAgICB9CgogICAg fQoKIAoKIAoKVG9vIGVhc3kgdG8gZml4IHRoZSBtYW55IHByb2JsZW1zIEkgaGF2ZSBoYWQgZ2V0 dGluZyB3ZWJzb2NrZXQgcHJveHkgdG8Kd29yay4gSWYgeW91IGhhdmUgYSBjb21tZXJpY2FsIGNl cnQgYW5kIGtleSwgdGhpcyB3b3VsZCBiZSBhIGdyZWF0IHBsYWNlIHRvCnB1dCBpdCwgc28geW91 ciB1c2VycyBkb24ndCBoYXZlIHRvIGJvdGhlciB3aXRoIHRydXN0aW5nIHlvdXIgQ0EsIGl0IHdp bGwKanVzdCB3b3JrIAoKIAoKQ2hlZXJzIGFuZCBJIGhvcGUgdGhpcyBoZWxwcwoKIAoKSWYgYW55 b25lIG5lZWRzIGFueSBoZWxwIGdldHRpbmcgdGhpcyB0byB3b3JrIGdpdmUgbWUgYSBzaG91dAoK IAoKRG9ubnkgRAoKY2xvdWRzcGluLm1lCgogCgogCgogCgoKLS0tLS0tPV9OZXh0UGFydF8wMDBf MDJDMF8wMUQwMUFBMi41NERBNDg0MApDb250ZW50LVR5cGU6IHRleHQvaHRtbDsKCWNoYXJzZXQ9 InVzLWFzY2lpIgpDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiBxdW90ZWQtcHJpbnRhYmxlCgo8 aHRtbCB4bWxuczp2PTNEInVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206dm1sIiA9CnhtbG5zOm89 M0QidXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6b2ZmaWNlIiA9CnhtbG5zOnc9M0Qi dXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6d29yZCIgPQp4bWxuczptPTNEImh0dHA6 Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vb2ZmaWNlLzIwMDQvMTIvb21tbCIgPQp4bWxucz0zRCJo dHRwOi8vd3d3LnczLm9yZy9UUi9SRUMtaHRtbDQwIj48aGVhZD48TUVUQSA9CkhUVFAtRVFVSVY9 M0QiQ29udGVudC1UeXBlIiBDT05URU5UPTNEInRleHQvaHRtbDsgPQpjaGFyc2V0PTNEdXMtYXNj aWkiPjxtZXRhIG5hbWU9M0RHZW5lcmF0b3IgY29udGVudD0zRCJNaWNyb3NvZnQgV29yZCAxNCA9 CihmaWx0ZXJlZCBtZWRpdW0pIj48c3R5bGU+PCEtLQovKiBGb250IERlZmluaXRpb25zICovCkBm b250LWZhY2UKCXtmb250LWZhbWlseTpDYWxpYnJpOwoJcGFub3NlLTE6MiAxNSA1IDIgMiAyIDQg MyAyIDQ7fQpAZm9udC1mYWNlCgl7Zm9udC1mYW1pbHk6VGFob21hOwoJcGFub3NlLTE6MiAxMSA2 IDQgMyA1IDQgNCAyIDQ7fQpAZm9udC1mYWNlCgl7Zm9udC1mYW1pbHk6Ikx1Y2lkYSBDb25zb2xl IjsKCXBhbm9zZS0xOjIgMTEgNiA5IDQgNSA0IDIgMiA0O30KLyogU3R5bGUgRGVmaW5pdGlvbnMg Ki8KcC5Nc29Ob3JtYWwsIGxpLk1zb05vcm1hbCwgZGl2Lk1zb05vcm1hbAoJe21hcmdpbjowaW47 CgltYXJnaW4tYm90dG9tOi4wMDAxcHQ7Cglmb250LXNpemU6MTEuMHB0OwoJZm9udC1mYW1pbHk6 IkNhbGlicmkiLCJzYW5zLXNlcmlmIjt9CmE6bGluaywgc3Bhbi5Nc29IeXBlcmxpbmsKCXttc28t c3R5bGUtcHJpb3JpdHk6OTk7Cgljb2xvcjpibHVlOwoJdGV4dC1kZWNvcmF0aW9uOnVuZGVybGlu ZTt9CmE6dmlzaXRlZCwgc3Bhbi5Nc29IeXBlcmxpbmtGb2xsb3dlZAoJe21zby1zdHlsZS1wcmlv cml0eTo5OTsKCWNvbG9yOnB1cnBsZTsKCXRleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmU7fQpzcGFu LkVtYWlsU3R5bGUxNwoJe21zby1zdHlsZS10eXBlOnBlcnNvbmFsOwoJZm9udC1mYW1pbHk6IkNh bGlicmkiLCJzYW5zLXNlcmlmIjsKCWNvbG9yOndpbmRvd3RleHQ7fQpzcGFuLkVtYWlsU3R5bGUx OAoJe21zby1zdHlsZS10eXBlOnBlcnNvbmFsLXJlcGx5OwoJZm9udC1mYW1pbHk6IkNhbGlicmki LCJzYW5zLXNlcmlmIjsKCWNvbG9yOiMxRjQ5N0Q7fQouTXNvQ2hwRGVmYXVsdAoJe21zby1zdHls ZS10eXBlOmV4cG9ydC1vbmx5OwoJZm9udC1zaXplOjEwLjBwdDt9CkBwYWdlIFdvcmRTZWN0aW9u MQoJe3NpemU6OC41aW4gMTEuMGluOwoJbWFyZ2luOjEuMGluIDEuMGluIDEuMGluIDEuMGluO30K ZGl2LldvcmRTZWN0aW9uMQoJe3BhZ2U6V29yZFNlY3Rpb24xO30KLS0+PC9zdHlsZT48IS0tW2lm IGd0ZSBtc28gOV0+PHhtbD4KPG86c2hhcGVkZWZhdWx0cyB2OmV4dD0zRCJlZGl0IiBzcGlkbWF4 PTNEIjEwMjYiIC8+CjwveG1sPjwhW2VuZGlmXS0tPjwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPgo8 bzpzaGFwZWxheW91dCB2OmV4dD0zRCJlZGl0Ij4KPG86aWRtYXAgdjpleHQ9M0QiZWRpdCIgZGF0 YT0zRCIxIiAvPgo8L286c2hhcGVsYXlvdXQ+PC94bWw+PCFbZW5kaWZdLS0+PC9oZWFkPjxib2R5 IGxhbmc9M0RFTi1VUyBsaW5rPTNEYmx1ZSA9CnZsaW5rPTNEcHVycGxlPjxkaXYgY2xhc3M9M0RX b3JkU2VjdGlvbjE+PHAgY2xhc3M9M0RNc29Ob3JtYWw+PHNwYW4gPQpzdHlsZT0zRCdjb2xvcjoj MUY0OTdEJz5JIHdvdWxkIGFsc28gbGlrZSB0byBub3RlIHRoYXQgaWYgbmdpbnggYW5kID0Kd2Vi c29ja2V0IHByb3h5IGFyZSBvbiB0aGUgc2FtZSBtYWNoaW5lIHlvdSBjYW5ub3QgaGF2ZSBib3Ro IG5naW54IGFuZCA9CndlYnNvY2tldCBwcm94eSBsaXN0ZW5pbmcgb24gNjEwMCYjODIzMDsgaXQg d291bGQgYmUgYmVzdCB0byBjaGFuZ2UgdGhlID0Kd2Vic29ja2V0IHByb3h5IGxpc3RlbmluZyBw b3J0IGFuZCB0aGVuIHByb3h5IGJvdGggaXB2NCBhbmQgNiB3aXRoIG5naW54ID0KOik8bzpwPjwv bzpwPjwvc3Bhbj48L3A+PHAgY2xhc3M9M0RNc29Ob3JtYWw+PHNwYW4gPQpzdHlsZT0zRCdjb2xv cjojMUY0OTdEJz48bzpwPiZuYnNwOzwvbzpwPjwvc3Bhbj48L3A+PGRpdj48ZGl2ID0Kc3R5bGU9 M0QnYm9yZGVyOm5vbmU7Ym9yZGVyLXRvcDpzb2xpZCAjQjVDNERGIDEuMHB0O3BhZGRpbmc6My4w cHQgMGluID0KMGluIDBpbic+PHAgY2xhc3M9M0RNc29Ob3JtYWw+PGI+PHNwYW4gPQpzdHlsZT0z RCdmb250LXNpemU6MTAuMHB0O2ZvbnQtZmFtaWx5OiJUYWhvbWEiLCJzYW5zLXNlcmlmIic+RnJv bTo8L3NwYW4+PQo8L2I+PHNwYW4gc3R5bGU9M0QnZm9udC1zaXplOjEwLjBwdDtmb250LWZhbWls eToiVGFob21hIiwic2Fucy1zZXJpZiInPiA9CnVzZXJzLWJvdW5jZXNAb3ZpcnQub3JnIFttYWls dG86dXNlcnMtYm91bmNlc0BvdmlydC5vcmddIDxiPk9uIEJlaGFsZiBPZiA9CjwvYj5Eb25ueSBE YXZpczxicj48Yj5TZW50OjwvYj4gVGh1cnNkYXksIERlY2VtYmVyIDE4LCAyMDE0IDk6MDYgPQpB TTxicj48Yj5Ubzo8L2I+IHVzZXJzQG92aXJ0Lm9yZzxicj48Yj5TdWJqZWN0OjwvYj4gW292aXJ0 LXVzZXJzXSBJUHY2ID0KRnVuY3Rpb25hbGl0eSBmb3IgV2ViU29ja2V0IFByb3h5PG86cD48L286 cD48L3NwYW4+PC9wPjwvZGl2PjwvZGl2PjxwID0KY2xhc3M9M0RNc29Ob3JtYWw+PG86cD4mbmJz cDs8L286cD48L3A+PHAgY2xhc3M9M0RNc29Ob3JtYWw+SSBqdXN0ID0KcmVhbGl6ZWQgdGhpcyBt b3JuaW5nIHRoYXQgbXkgbm9WTkMgY29ubmVjdGlvbnMgd2VyZSBub3Qgd29ya2luZyBmb3IgPQpJ UHY2IG9ubHkgb24gY2xvdWRzcGluLm1lPG86cD48L286cD48L3A+PHAgY2xhc3M9M0RNc29Ob3Jt YWw+Rm9yIHRob3NlID0Kd2hvIHdhbnQgdG8gZGVwbG95IGR1YWwgc3RhY2sgZnVuY3Rpb25hbGl0 eSBmb3Igb3ZpcnQtd2Vic29ja2V0LXByb3h5ID0KaGVyZSBpcyBhIHZlcnkgc2ltcGxlIGFuZCBl bGVnYW50IGZpeC4gPG86cD48L286cD48L3A+PHAgPQpjbGFzcz0zRE1zb05vcm1hbD48bzpwPiZu YnNwOzwvbzpwPjwvcD48cCBjbGFzcz0zRE1zb05vcm1hbD5OR0lOWCBpcyBhID0KdXNlZnVsIHRv b2wgOik8bzpwPjwvbzpwPjwvcD48cCA9CmNsYXNzPTNETXNvTm9ybWFsPjxvOnA+Jm5ic3A7PC9v OnA+PC9wPjxwIGNsYXNzPTNETXNvTm9ybWFsPllvdSB3aWxsID0KbmVlZCBuZ2lueCB0byBwcm94 eSB0aGUgY29ubmVjdGlvbiBiZXR3ZWVuIHlvdXIgSVB2NiBjdXN0b21lcnMsIGFuZCB0aGUgPQpJ UHY0IGxpc3RlbmluZyBvbmx5IHdlYnNvY2tldCBwcm94eShob3dldmVyIHRoYXQgY2FuIGJlIGNo YW5nZWQgaW4gPQovdXNyL3NoYXJlL292aXJ0LWVuZ2luZS9zZXJ2aWNlcy9vdmlydC13ZWJzb2Nr ZXQtcHJveHkvb3ZpcnQtd2Vic29ja2V0LXByPQpveHkuY29uZiBidXQgeW91IGNhbid0IGhhdmUg eW91ciBjYWtlIGFuZCBlYXQgaXQgdG9vJiM4MjMwOyBvbmUgb3IgdGhlID0Kb3RoZXIgaXB2NCBv ciBpcHY2KTxvOnA+PC9vOnA+PC9wPjxwIGNsYXNzPTNETXNvTm9ybWFsPkFueXdheXMsIGhlcmUg aXMgPQp0aGUgZml4PG86cD48L286cD48L3A+PHAgY2xhc3M9M0RNc29Ob3JtYWw+PG86cD4mbmJz cDs8L286cD48L3A+PHAgPQpjbGFzcz0zRE1zb05vcm1hbD5JbnN0YWxsIG5naW54IG9uIHlvdXIg d2Vic29ja2V0IHByb3h5IHNlcnZlciAtIFdoeSA9Ck5naW54LCBiZWNhdXNlIEkgbGlrZSBpdCBi ZXR0ZXIgdGhhbiBhcGFjaGUuIFRoZSBkZWZhdWx0IGNvbmZpZyBmb3IgPQpPdmlydCBjb3VsZCBi ZSBzZXR1cCB0byBkbyB0aGlzIHdpdGggdGhlIHdlYiBzZXJ2ZXIgdGhhdCBpcyBhbHJlYWR5ID0K cnVubmluZyA6KSBqdXN0IHNheWluPG86cD48L286cD48L3A+PHAgY2xhc3M9M0RNc29Ob3JtYWw+ Rm9yIG15ID0KY29uZmlndXJhdGlvbiBJIGFtIHJ1bm5pbmcgdGhlIHdlYnNvY2tldCBwcm94eSBv biBhIGRpZmZlcmVudCBob3N0LCBidXQgPQpJIGltYWdpbmUgeW91IGNvdWxkIHVzZSB0aGlzIGNv bmZpZyBpbiBhIGZ1bGwgZGVwbG95bWVudCBhbmQgdXNlID0Kd2Vic29ja2V0IHByb3h5IG9uIHRo ZSBlbmdpbmUgaG9zdDxvOnA+PC9vOnA+PC9wPjxwID0KY2xhc3M9M0RNc29Ob3JtYWw+PG86cD4m bmJzcDs8L286cD48L3A+PHAgY2xhc3M9M0RNc29Ob3JtYWwgPQpzdHlsZT0zRCd0ZXh0LWF1dG9z cGFjZTpub25lJz48c3BhbiA9CnN0eWxlPTNEJ2ZvbnQtc2l6ZToxMC4wcHQ7Zm9udC1mYW1pbHk6 Ikx1Y2lkYSBDb25zb2xlIic+c2VydmVyID0KezxvOnA+PC9vOnA+PC9zcGFuPjwvcD48cCBjbGFz cz0zRE1zb05vcm1hbCA9CnN0eWxlPTNEJ3RleHQtYXV0b3NwYWNlOm5vbmUnPjxzcGFuID0Kc3R5 bGU9M0QnZm9udC1zaXplOjEwLjBwdDtmb250LWZhbWlseToiTHVjaWRhID0KQ29uc29sZSInPiZu YnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBzZXJ2ZXJfbmFtZSA9Cndl Yi5jbG91ZHNwaW4ubWU7ICMgdGhpcyBpcyB0aGUgaG9zdG5hbWUgdGhhdCB5b3UgdG9sZCB0aGUg ZW5naW5lIHRoYXQgPQp0aGUgd2Vic29ja2V0IHByb3h5IHdvdWxkIGJlIGxpc3RlbmluZyBvbjxv OnA+PC9vOnA+PC9zcGFuPjwvcD48cCA9CmNsYXNzPTNETXNvTm9ybWFsIHN0eWxlPTNEJ3RleHQt YXV0b3NwYWNlOm5vbmUnPjxzcGFuID0Kc3R5bGU9M0QnZm9udC1zaXplOjEwLjBwdDtmb250LWZh bWlseToiTHVjaWRhID0KQ29uc29sZSInPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZu YnNwOyZuYnNwOyAjbGlzdGVuID0KNjEwMDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsm bmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbj0KYnNwOyAjQ29tbWVudGVkIGJl Y2F1c2UgSSBhbSB1c2luZyB0aGlzIGZvciBpcHY2IG9ubHksIGJ1dCB5b3UgY291bGQgdXNlID0K bmdpbnggdG8gcHJveHkgYm90aCBhbmQgb25seSBvcGVuIG9uZSBwb3J0IGluIHRoZSA9CmZpcmV3 YWxsPG86cD48L286cD48L3NwYW4+PC9wPjxwIGNsYXNzPTNETXNvTm9ybWFsID0Kc3R5bGU9M0Qn dGV4dC1hdXRvc3BhY2U6bm9uZSc+PHNwYW4gPQpzdHlsZT0zRCdmb250LXNpemU6MTAuMHB0O2Zv bnQtZmFtaWx5OiJMdWNpZGEgPQpDb25zb2xlIic+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5i c3A7Jm5ic3A7Jm5ic3A7IGxpc3RlbiBbOjpdOjYxMDAgPQpzc2w7Jm5ic3A7Jm5ic3A7Jm5ic3A7 Jm5ic3A7ICNOT1RFIHRoaXMgbmVlZHMgdG8gbGlzdGVuIG9uIHRoZSBzYW1lIHBvcnQgPQp5b3Ug dG9sZCB0aGUgZW5naW5lIHRoZSB3ZWJzb2NrZXQgcHJveHkgd291bGQgYmUgbGlzdGVuaW5nID0K b24mbmJzcDsmbmJzcDsgPG86cD48L286cD48L3NwYW4+PC9wPjxwIGNsYXNzPTNETXNvTm9ybWFs ID0Kc3R5bGU9M0QndGV4dC1hdXRvc3BhY2U6bm9uZSc+PHNwYW4gPQpzdHlsZT0zRCdmb250LXNp emU6MTAuMHB0O2ZvbnQtZmFtaWx5OiJMdWNpZGEgPQpDb25zb2xlIic+Jm5ic3A7Jm5ic3A7Jm5i c3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7c3NsX2NlcnRpZmljYXRlPQombmJzcDsm bmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgPQov cGh5c2ljYWwvcGF0aC90by9zc2wvY2VydDsgI0kgdXNlZCB0aGUgc2FtZSBjZXJ0IHRoYXQgbXkg d2Vic29ja2V0ID0KcHJveHkgaXMgdXNpbmc8bzpwPjwvbzpwPjwvc3Bhbj48L3A+PHAgY2xhc3M9 M0RNc29Ob3JtYWwgPQpzdHlsZT0zRCd0ZXh0LWF1dG9zcGFjZTpub25lJz48c3BhbiA9CnN0eWxl PTNEJ2ZvbnQtc2l6ZToxMC4wcHQ7Zm9udC1mYW1pbHk6Ikx1Y2lkYSA9CkNvbnNvbGUiJz4mbmJz cDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgPQpzc2xfY2VydGlmaWNhdGVf a2V5Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7ID0KL3BoeXNpY2FsL3BhdGgv dG8vc3NsL2tleTs8bzpwPjwvbzpwPjwvc3Bhbj48L3A+PHAgY2xhc3M9M0RNc29Ob3JtYWwgPQpz dHlsZT0zRCd0ZXh0LWF1dG9zcGFjZTpub25lJz48c3BhbiA9CnN0eWxlPTNEJ2ZvbnQtc2l6ZTox MC4wcHQ7Zm9udC1mYW1pbHk6Ikx1Y2lkYSA9CkNvbnNvbGUiJz48bzpwPiZuYnNwOzwvbzpwPjwv c3Bhbj48L3A+PHAgY2xhc3M9M0RNc29Ob3JtYWwgPQpzdHlsZT0zRCd0ZXh0LWF1dG9zcGFjZTpu b25lJz48c3BhbiA9CnN0eWxlPTNEJ2ZvbnQtc2l6ZToxMC4wcHQ7Zm9udC1mYW1pbHk6Ikx1Y2lk YSA9CkNvbnNvbGUiJz4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsg c3NsID0Kb247PG86cD48L286cD48L3NwYW4+PC9wPjxwIGNsYXNzPTNETXNvTm9ybWFsID0Kc3R5 bGU9M0QndGV4dC1hdXRvc3BhY2U6bm9uZSc+PHNwYW4gPQpzdHlsZT0zRCdmb250LXNpemU6MTAu MHB0O2ZvbnQtZmFtaWx5OiJMdWNpZGEgPQpDb25zb2xlIic+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5i c3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7ID0Kc3NsX3Nlc3Npb25fY2FjaGUmbmJzcDsgYnVpbHRpbjox MDAwJm5ic3A7ID0Kc2hhcmVkOlNTTDoxMG07PG86cD48L286cD48L3NwYW4+PC9wPjxwIGNsYXNz PTNETXNvTm9ybWFsID0Kc3R5bGU9M0QndGV4dC1hdXRvc3BhY2U6bm9uZSc+PHNwYW4gPQpzdHls ZT0zRCdmb250LXNpemU6MTAuMHB0O2ZvbnQtZmFtaWx5OiJMdWNpZGEgPQpDb25zb2xlIic+Jm5i c3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IHNzbF9wcm90b2NvbHMmbmJz cDsgPQpUTFN2MSBUTFN2MS4xIFRMU3YxLjI7PG86cD48L286cD48L3NwYW4+PC9wPjxwIGNsYXNz PTNETXNvTm9ybWFsID0Kc3R5bGU9M0QndGV4dC1hdXRvc3BhY2U6bm9uZSc+PHNwYW4gPQpzdHls ZT0zRCdmb250LXNpemU6MTAuMHB0O2ZvbnQtZmFtaWx5OiJMdWNpZGEgPQpDb25zb2xlIic+Jm5i c3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IHNzbF9jaXBoZXJzID0KSElH SDohYU5VTEw6IWVOVUxMOiFFWFBPUlQ6IUNBTUVMTElBOiFERVM6IU1ENTohUFNLOiFSQzQ7PG86 cD48L286cD48L3NwYT0Kbj48L3A+PHAgY2xhc3M9M0RNc29Ob3JtYWwgc3R5bGU9M0QndGV4dC1h dXRvc3BhY2U6bm9uZSc+PHNwYW4gPQpzdHlsZT0zRCdmb250LXNpemU6MTAuMHB0O2ZvbnQtZmFt aWx5OiJMdWNpZGEgQ29uc29sZSInPiZuYnNwOyZuYnNwOyA9CiZuYnNwOyZuYnNwOyZuYnNwOyZu YnNwOyZuYnNwO3NzbF9wcmVmZXJfc2VydmVyX2NpcGhlcnMgPQpvbjs8bzpwPjwvbzpwPjwvc3Bh bj48L3A+PHAgY2xhc3M9M0RNc29Ob3JtYWwgPQpzdHlsZT0zRCd0ZXh0LWF1dG9zcGFjZTpub25l Jz48c3BhbiA9CnN0eWxlPTNEJ2ZvbnQtc2l6ZToxMC4wcHQ7Zm9udC1mYW1pbHk6Ikx1Y2lkYSA9 CkNvbnNvbGUiJz48bzpwPiZuYnNwOzwvbzpwPjwvc3Bhbj48L3A+PHAgY2xhc3M9M0RNc29Ob3Jt YWwgPQpzdHlsZT0zRCd0ZXh0LWF1dG9zcGFjZTpub25lJz48c3BhbiA9CnN0eWxlPTNEJ2ZvbnQt c2l6ZToxMC4wcHQ7Zm9udC1mYW1pbHk6Ikx1Y2lkYSA9CkNvbnNvbGUiJz4mbmJzcDsmbmJzcDsm bmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgYWNjZXNzX2xvZyA9Ci92YXIvbG9nL25naW54 L3dlYnNvY2tldC5jbG91ZHNwaW4ubWUtYWNjZXNzLmxvZzs8bzpwPjwvbzpwPjwvc3Bhbj48L3A+ PHA9CiBjbGFzcz0zRE1zb05vcm1hbCBzdHlsZT0zRCd0ZXh0LWF1dG9zcGFjZTpub25lJz48c3Bh biA9CnN0eWxlPTNEJ2ZvbnQtc2l6ZToxMC4wcHQ7Zm9udC1mYW1pbHk6Ikx1Y2lkYSA9CkNvbnNv bGUiJz4mbmJzcDsmbmJzcDsmbmJzcDsgJm5ic3A7Jm5ic3A7Jm5ic3A7IGVycm9yX2xvZyA9Ci92 YXIvbG9nL25naW54L3dlYnNvY2tldC5jbG91ZHNwaW4ubWUtZXJyb3IubG9nOzxvOnA+PC9vOnA+ PC9zcGFuPjwvcD48cCA9CmNsYXNzPTNETXNvTm9ybWFsIHN0eWxlPTNEJ3RleHQtYXV0b3NwYWNl Om5vbmUnPjxzcGFuID0Kc3R5bGU9M0QnZm9udC1zaXplOjEwLjBwdDtmb250LWZhbWlseToiTHVj aWRhID0KQ29uc29sZSInPjxvOnA+Jm5ic3A7PC9vOnA+PC9zcGFuPjwvcD48cCBjbGFzcz0zRE1z b05vcm1hbCA9CnN0eWxlPTNEJ3RleHQtYXV0b3NwYWNlOm5vbmUnPjxzcGFuID0Kc3R5bGU9M0Qn Zm9udC1zaXplOjEwLjBwdDtmb250LWZhbWlseToiTHVjaWRhID0KQ29uc29sZSInPiZuYnNwOyZu YnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBsb2NhdGlvbiAvID0KezxvOnA+PC9v OnA+PC9zcGFuPjwvcD48cCBjbGFzcz0zRE1zb05vcm1hbCA9CnN0eWxlPTNEJ3RleHQtYXV0b3Nw YWNlOm5vbmUnPjxzcGFuID0Kc3R5bGU9M0QnZm9udC1zaXplOjEwLjBwdDtmb250LWZhbWlseToi THVjaWRhID0KQ29uc29sZSInPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZu YnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYj0Kc3A7IHByb3h5X3Bhc3MgPGEgPQpocmVmPTNEImh0 dHBzOi8vaXBfYWRkcmVzc19vZl93ZWJzb2NrZXRfcHJveHk6NjEwMCI+aHR0cHM6Ly9pcF9hZGRy ZXNzX29mPQpfd2Vic29ja2V0X3Byb3h5OjYxMDA8L2E+OzxvOnA+PC9vOnA+PC9zcGFuPjwvcD48 cCBjbGFzcz0zRE1zb05vcm1hbCA9CnN0eWxlPTNEJ3RleHQtYXV0b3NwYWNlOm5vbmUnPjxzcGFu ID0Kc3R5bGU9M0QnZm9udC1zaXplOjEwLjBwdDtmb250LWZhbWlseToiTHVjaWRhID0KQ29uc29s ZSInPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNw OyA9CnByb3h5X2h0dHBfdmVyc2lvbiAxLjE7PG86cD48L286cD48L3NwYW4+PC9wPjxwIGNsYXNz PTNETXNvTm9ybWFsID0Kc3R5bGU9M0QndGV4dC1hdXRvc3BhY2U6bm9uZSc+PHNwYW4gPQpzdHls ZT0zRCdmb250LXNpemU6MTAuMHB0O2ZvbnQtZmFtaWx5OiJMdWNpZGEgPQpDb25zb2xlIic+Jm5i c3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7ID0KcHJv eHlfc2V0X2hlYWRlciBVcGdyYWRlICRodHRwX3VwZ3JhZGU7PG86cD48L286cD48L3NwYW4+PC9w PjxwID0KY2xhc3M9M0RNc29Ob3JtYWwgc3R5bGU9M0QndGV4dC1hdXRvc3BhY2U6bm9uZSc+PHNw YW4gPQpzdHlsZT0zRCdmb250LXNpemU6MTAuMHB0O2ZvbnQtZmFtaWx5OiJMdWNpZGEgPQpDb25z b2xlIic+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5i c3A7ID0KcHJveHlfc2V0X2hlYWRlciBDb25uZWN0aW9uICZxdW90O3VwZ3JhZGUmcXVvdDs7PG86 cD48L286cD48L3NwYW4+PC9wPjxwID0KY2xhc3M9M0RNc29Ob3JtYWwgc3R5bGU9M0QndGV4dC1h dXRvc3BhY2U6bm9uZSc+PHNwYW4gPQpzdHlsZT0zRCdmb250LXNpemU6MTAuMHB0O2ZvbnQtZmFt aWx5OiJMdWNpZGEgPQpDb25zb2xlIic+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5i c3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5iPQpzcDsmbmJzcDsmbmJzcDsmbmJzcDsgPG86 cD48L286cD48L3NwYW4+PC9wPjxwIGNsYXNzPTNETXNvTm9ybWFsID0Kc3R5bGU9M0QndGV4dC1h dXRvc3BhY2U6bm9uZSc+PHNwYW4gPQpzdHlsZT0zRCdmb250LXNpemU6MTAuMHB0O2ZvbnQtZmFt aWx5OiJMdWNpZGEgPQpDb25zb2xlIic+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5i c3A7Jm5ic3A7Jm5ic3A7fTxvOnA+PC9vOnA+PC9zPQpwYW4+PC9wPjxwIGNsYXNzPTNETXNvTm9y bWFsIHN0eWxlPTNEJ3RleHQtYXV0b3NwYWNlOm5vbmUnPjxzcGFuID0Kc3R5bGU9M0QnZm9udC1z aXplOjEwLjBwdDtmb250LWZhbWlseToiTHVjaWRhID0KQ29uc29sZSInPiZuYnNwOyZuYnNwOyZu YnNwOyB9PG86cD48L286cD48L3NwYW4+PC9wPjxwIGNsYXNzPTNETXNvTm9ybWFsID0Kc3R5bGU9 M0QndGV4dC1hdXRvc3BhY2U6bm9uZSc+PHNwYW4gPQpzdHlsZT0zRCdmb250LXNpemU6MTAuMHB0 O2ZvbnQtZmFtaWx5OiJMdWNpZGEgPQpDb25zb2xlIic+PG86cD4mbmJzcDs8L286cD48L3NwYW4+ PC9wPjxwIGNsYXNzPTNETXNvTm9ybWFsID0Kc3R5bGU9M0QndGV4dC1hdXRvc3BhY2U6bm9uZSc+ PHNwYW4gPQpzdHlsZT0zRCdmb250LXNpemU6MTAuMHB0O2ZvbnQtZmFtaWx5OiJMdWNpZGEgPQpD b25zb2xlIic+PG86cD4mbmJzcDs8L286cD48L3NwYW4+PC9wPjxwIGNsYXNzPTNETXNvTm9ybWFs ID0Kc3R5bGU9M0QndGV4dC1hdXRvc3BhY2U6bm9uZSc+PHNwYW4gPQpzdHlsZT0zRCdmb250LXNp emU6MTAuMHB0O2ZvbnQtZmFtaWx5OiJMdWNpZGEgQ29uc29sZSInPlRvbyBlYXN5IHRvIGZpeCA9 CnRoZSBtYW55IHByb2JsZW1zIEkgaGF2ZSBoYWQgZ2V0dGluZyB3ZWJzb2NrZXQgcHJveHkgdG8g d29yay4gSWYgeW91ID0KaGF2ZSBhIGNvbW1lcmljYWwgY2VydCBhbmQga2V5LCB0aGlzIHdvdWxk IGJlIGEgZ3JlYXQgcGxhY2UgdG8gcHV0IGl0LCA9CnNvIHlvdXIgdXNlcnMgZG9uJ3QgaGF2ZSB0 byBib3RoZXIgd2l0aCB0cnVzdGluZyB5b3VyIENBLCBpdCB3aWxsIGp1c3QgPQp3b3JrIDxvOnA+ PC9vOnA+PC9zcGFuPjwvcD48cCBjbGFzcz0zRE1zb05vcm1hbCA9CnN0eWxlPTNEJ3RleHQtYXV0 b3NwYWNlOm5vbmUnPjxzcGFuID0Kc3R5bGU9M0QnZm9udC1zaXplOjEwLjBwdDtmb250LWZhbWls eToiTHVjaWRhID0KQ29uc29sZSInPjxvOnA+Jm5ic3A7PC9vOnA+PC9zcGFuPjwvcD48cCBjbGFz cz0zRE1zb05vcm1hbCA9CnN0eWxlPTNEJ3RleHQtYXV0b3NwYWNlOm5vbmUnPjxzcGFuID0Kc3R5 bGU9M0QnZm9udC1zaXplOjEwLjBwdDtmb250LWZhbWlseToiTHVjaWRhIENvbnNvbGUiJz5DaGVl cnMgYW5kIEkgPQpob3BlIHRoaXMgaGVscHM8bzpwPjwvbzpwPjwvc3Bhbj48L3A+PHAgY2xhc3M9 M0RNc29Ob3JtYWwgPQpzdHlsZT0zRCd0ZXh0LWF1dG9zcGFjZTpub25lJz48c3BhbiA9CnN0eWxl PTNEJ2ZvbnQtc2l6ZToxMC4wcHQ7Zm9udC1mYW1pbHk6Ikx1Y2lkYSA9CkNvbnNvbGUiJz48bzpw PiZuYnNwOzwvbzpwPjwvc3Bhbj48L3A+PHAgY2xhc3M9M0RNc29Ob3JtYWwgPQpzdHlsZT0zRCd0 ZXh0LWF1dG9zcGFjZTpub25lJz48c3BhbiA9CnN0eWxlPTNEJ2ZvbnQtc2l6ZToxMC4wcHQ7Zm9u dC1mYW1pbHk6Ikx1Y2lkYSBDb25zb2xlIic+SWYgYW55b25lIG5lZWRzID0KYW55IGhlbHAgZ2V0 dGluZyB0aGlzIHRvIHdvcmsgZ2l2ZSBtZSBhIHNob3V0PG86cD48L286cD48L3NwYW4+PC9wPjxw ID0KY2xhc3M9M0RNc29Ob3JtYWwgc3R5bGU9M0QndGV4dC1hdXRvc3BhY2U6bm9uZSc+PHNwYW4g PQpzdHlsZT0zRCdmb250LXNpemU6MTAuMHB0O2ZvbnQtZmFtaWx5OiJMdWNpZGEgPQpDb25zb2xl Iic+PG86cD4mbmJzcDs8L286cD48L3NwYW4+PC9wPjxwIGNsYXNzPTNETXNvTm9ybWFsID0Kc3R5 bGU9M0QndGV4dC1hdXRvc3BhY2U6bm9uZSc+PHNwYW4gPQpzdHlsZT0zRCdmb250LXNpemU6MTAu MHB0O2ZvbnQtZmFtaWx5OiJMdWNpZGEgQ29uc29sZSInPkRvbm55ID0KRDxvOnA+PC9vOnA+PC9z cGFuPjwvcD48cCBjbGFzcz0zRE1zb05vcm1hbCA9CnN0eWxlPTNEJ3RleHQtYXV0b3NwYWNlOm5v bmUnPjxzcGFuID0Kc3R5bGU9M0QnZm9udC1zaXplOjEwLjBwdDtmb250LWZhbWlseToiTHVjaWRh ID0KQ29uc29sZSInPmNsb3Vkc3Bpbi5tZTxvOnA+PC9vOnA+PC9zcGFuPjwvcD48cCA9CmNsYXNz PTNETXNvTm9ybWFsPjxvOnA+Jm5ic3A7PC9vOnA+PC9wPjxwID0KY2xhc3M9M0RNc29Ob3JtYWw+ PG86cD4mbmJzcDs8L286cD48L3A+PHAgPQpjbGFzcz0zRE1zb05vcm1hbD48bzpwPiZuYnNwOzwv bzpwPjwvcD48L2Rpdj48L2JvZHk+PC9odG1sPgotLS0tLS09X05leHRQYXJ0XzAwMF8wMkMwXzAx RDAxQUEyLjU0REE0ODQwLS0KCg== --===============0031585488750878343==--