[REBOL] Slightly newer HTTP Server Object
From: rex::smallandmighty::com at: 1-Sep-2000 1:29
--==_Boundary-1_==
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: 7bit
Just created (and attached) a newer version of my HTTP server object.
Instead of directly overriding the method handlers during object creation
you can put a handler in a %handlers directory. Upon start-up the server
scans that directory looking for %init.r, %get.r, %post.r, %head.r, and
%put.r files. It will replace its default handlers with the appropriate
files. I'm attaching the new object along with a sample get.r file.
This get.r serves html files, images, etc. from a %www directory,
i.e. it behaves like a normal webserver. As one can see, it didn't take
much code to implement that functionality on top of the base server object.
The HTTP server object itself is meant to be sort of a black box. Any
code to extend the server should go in the handlers. (get.r probably
being the most common one folks would want to change, probably followed
by post.r) The HTTP server object handles multiple connections and has
separate queues for reading and writing to those connections.
Incidentally, you can change the handlers on the fly while the server
is running by visiting the /refresh url. It causes the get.r etc.
handlers to be reloaded. /shutdown causes the server to shutdown and
cleanup. These both cause 404s to be returned by the above get.r. I'll
probably fix that in the next rev.
One the server object has solidified, I'm going to start adding some
layers on top to facilitate the creation of web application servers. XML-
RPC support is somewhat high on the list of features I'd like to implement.
Some comments would be welcome :)
:Eric
--==_Boundary-1_==
Content-Type: multipart/mixed; boundary="==_Boundary-2_=="
--==_Boundary-2_==
Content-Type: application/octet-stream; name="get.r"; x-mac-type="54455854";
x-mac-creator="522A6368"
Content-Disposition: attachment
Content-Transfer-Encoding: base64
UmVib2wgClsKCVRpdGxlOiAiU2ltcGxlIEV4dGVybmFsIGdldC1oYW5kbGVyIgoJQXV0aG9yOiAi
RXJpYyBLaW5nIgpdCgpjb250ZW50LXR5cGU/OiBmdW5jdGlvbiBbIGZpbGVuYW1lIFtzdHJpbmch
IGZpbGUhXSBdIFtdIApbCiAgIAlzd2l0Y2gvZGVmYXVsdCBuZXh0IGZvcm0gZmluZC9sYXN0IHRv
LXN0cmluZyBmaWxlbmFtZSAiLiIgCiAgIAlbCiAgIAkJOyBTbGlnaHRseSBtb2RpZmllZCBmcm9t
IENhbCBEaXhvbidzIGZ1bmN0aW9uCiAgICAJOyBpbiBoaXMgd2ViLXNlcnZlci4gbmV4dCBjYW4n
dCBiZSB1c2VkIG9uIGEgbm9uZSEKICAgIAk7IHZhbHVlCiAgICAJInR4dCIgCVsgcmV0dXJuICJ0
ZXh0L3BsYWluIiBdCiAgICAgIAkiZ2lmIiAJWyByZXR1cm4gImltYWdlL2dpZiIgXQogICAgICAJ
ImpwZyIgCVsgcmV0dXJuICJpbWFnZS9qcGVnIiBdCiAgICAgIAkicG5nIiAJWyByZXR1cm4gImlt
YWdlL3BuZyIgXQogICAgICAJIm1vdiIgCVsgcmV0dXJuICJ2aWRlby9xdWlja3RpbWUiIF0KICAg
ICAgCSJ0aWYiIAlbIHJldHVybiAiaW1hZ2UvdGlmZiIgXQogICAgICAJInRpZmYiIAlbIHJldHVy
biAiaW1hZ2UvdGlmZiIgXQogICAgICAJIndhdiIgCVsgcmV0dXJuICJhdWRpby93YXYiIF0KICAg
ICAgCSJ4bWwiIAlbIHJldHVybiAidGV4dC94bWwiIF0KICAgICAgCSJ4c2wiIAlbIHJldHVybiAi
dGV4dC94bWwiIF0KICAgICAgCSJtaWQiIAlbIHJldHVybiAiYXVkaW8vbWlkaSIgXQoJXSAKCVsg
cmV0dXJuICJ0ZXh0L2h0bWwiIF0KXQoKOyBUaGUgbGFzdCB0aGluZyByZXR1cm5lZCBmcm9tIHRo
aXMgaGFuZGxlciBzaG91bGQgYmUgYSAncmF3JyAKOyBmdW5jdGlvbgoKZnVuY3Rpb24gWyBoZHJz
IF0gCglbIHQgIHJlc3BvbnNlIHMgaCB2IGhlYWRlcnN0cmluZyBwYXRoIG1pbWVdCglbCgkJO0Zl
dGNoIHRoZSB0YXJnZXQtdXJpIGFuZCBjb252ZXJ0IGl0IHRvIGEgcGF0aAoJCXBhdGg6IGpvaW4g
JXd3dyBzZWxlY3QgaGRycyAiVGFyZ2V0LVVSSToiCgkJO0xvb2sgZm9yIGluZGV4Lmh0bWwgaW4g
ZGlyZWN0b3JpZXMKCQlpZiBkaXI/IHBhdGggCgkJWyAKCQkJZWl0aGVyIChsYXN0IHBhdGgpID0g
IyIvIgoJCQlbIHBhdGg6IGpvaW4gcGF0aCAlaW5kZXguaHRtbCBdIAoJCQlbIHBhdGg6IGpvaW4g
cGF0aCAlL2luZGV4Lmh0bWwgXSAKCQldCgkJO01ha2Ugc3VyZSB0aGVyZSdzIGEgZmlsZSB0byBz
ZW5kCgkJZWl0aGVyIGV4aXN0cz8gcGF0aAoJCVsJCgkJCTtSZWFkIGluIHRoZSBmaWxlIHRvIHNl
bmQKCQkJdDogcmVhZC9iaW5hcnkgcGF0aAoJCQk7QnVpbGQgdGhlIHJlc3BvbnNlIG9iamVjdAoJ
CQlyZXNwb25zZTogbWFrZSBoYW5kbGVyLXJlc3BvbnNlCgkJCVsKCQkJCWNvZGU6ICIyMDAiIG1p
bWU6IGNvbnRlbnQtdHlwZT8gcGF0aAoJCQkJY29va2llOiAiIiAJZW50aXR5OiB0CgkJCQloZHJz
OiBjb3B5IFsgIlNlcnZlcjoiICJSZWJvbC1IVFRQLU9iamVjdCAxLjBhMiIgXQoJCQldCgkJXQoJ
CVsKCQkJO0J1aWxkIGEgNDA0IERvY3VtZW50IG5vdCBmb3VuZCBlcnJvciBwYWdlCgkJCXQ6IGNv
cHkgZGVmYXVsdC10ZW1wbGF0ZQoJCQl0OiBjbXQtaW5zZXJ0IHQgImNvbnRlbnQiIAoJCQl7PGgy
PkVycm9yIDQwNDwvaDI+IERvY3VtZW50IG5vdCBmb3VuZH0KCQkJcmVzcG9uc2U6IG1ha2UgaGFu
ZGxlci1yZXNwb25zZQoJCQlbCgkJCQljb2RlOiAiNDA0IiBtaW1lOiAidGV4dC9odG1sIgoJCQkJ
Y29va2llOiAiIiAJZW50aXR5OiB0CgkJCQloZHJzOiBjb3B5IFsgIlNlcnZlcjoiICJSZWJvbC1I
VFRQLU9iamVjdCAxLjBhMiIgXQoJCQldCgkJCgkJXQoJCXJldHVybiByZXNwb25zZQoJXQo--==_Boundary-2_==
Content-Type: application/octet-stream; name="httpobject.r";
x-mac-type="54455854"; x-mac-creator="522A6368"
Content-Disposition: attachment
Content-Transfer-Encoding: base64
UmVib2wNWw0JVGl0bGU6ICJSZWJvbCBIVFRQIFNlcnZlciBPYmplY3QiDQlWZXJzaW9uOiAiMS4w
YTIiDQlEYXRlOiAzMS1BdWctMjAwMA0JQXV0aG9yOiAiRXJpYyBLaW5nIg1dDQ0NOyANOyAJUmFu
ZG9tIG5vdGVzOiANOyAJSWYgdGhlIGRlYnVnIGF0dHJpYnV0ZSBpcyBzZXQgdG8gdHJ1ZSAod2hp
Y2ggaXQgaXMgYnkgZGVmYXVsdCkNOyAJQXR0ZW1wdGluZyB0byByZWFkIChHRVQpIGZyb20gL3No
dXRkb3duIHdpbGwgY2F1c2UgdGhlIA07IAl3ZWIgc2VydmVyIHRvIGNsZWFuIHVwIGFuZCBzaHV0
ZG93bi4gDTsgDTsgCVRoaXMgdmVyc2lvbiBub3cgc3VwcG9ydHMgZGlzay1iYXNlZCBtZXRob2Qg
aGFuZGxlcnMNOyAJVGhlc2UgaGFuZGxlcnMgY2FuIGJlIG1vZGlmaWVkIGFuZCByZWxvYWRlZCBv
biB0aGUgZmx5DTsgCUJ5IGxvYWRpbmcgL3JlZnJlc2ggd2l0aCBkZWJ1ZyBzZXQgdG8gdHJ1ZQ07
IAlpLmUuIHlvdSBjYW4gY2hhbmdlIHRoZSBzZXJ2ZXIncyBjb2RlIHdoaWxlIGl0J3Mgc3RpbGwg
cnVubmluZy4NOyAJDTsgCUhhbmRsZXJzIHNob3VsZCBiZSBwbGFjZWQgaW4gYSAlaGFuZGxlcnMv
IHN1YmRpcmVjdG9yeS4NOyAJVGhlIHNlcnZlciBsb29rcyBmb3IgaGFuZGxlcnMgbmFtZWQ6DTsg
CWdldC5yIHBvc3QuciBoZWFkLnIgcHV0LnIgaW5pdC5yDTsgCVRoZSBpbml0IGhhbmRsZXIgaXMg
c3BlY2lhbCBpbiB0aGF0IGl0IGlzIGNhbGxlZCBvbmx5IG9uY2UNOyAJQmVmb3JlIGFueSBvZiB0
aGUgb3RoZXIgaGFuZGxlcnMuIEJ5IGRlZmF1bHQgaXQgZG9lcyBub3RoaW5nDTsgCUJ1dCBpZiBh
IGhhbmRsZXIgbmVlZGVkIHRvIHNldCB1cCBzb21lIGRhdGEgaXQgY291bGQgZG8gc28uDTsgCVRo
ZXJlJ3MgYWxzbyBhbiBpbml0LWhhbmRsZXItZGF0YSBhdHRyaWJ1dGUgd2hpY2ggaXMgc2V0IHRv
IGFuIA07IAlFbXB0eSBibG9jayBbXSBieSBkZWZhdWx0Lg07DTsJSSdtIGluY2x1ZGluZyBhIHNh
bXBsZSBleHRlcm5hbCBnZXQtaGFuZGxlciB3aGljaCBzZXJ2ZXMNOwlpbWFnZXMgYW5kIGh0bWwg
ZmlsZXMgcGxhY2VkIGluIGEgJXd3dy8gZGlyZWN0b3J5DTsNDWh0dHAtc2VydmVyOiBtYWtlIG9i
amVjdCENWw07IA07IAlIVE1MIFRlbXBsYXRlcw07IA0JZGVmYXVsdC10ZW1wbGF0ZTogY29weQ17
PCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDMuMiBGaW5hbC8vRU4iPg08
aHRtbD4NPHRpdGxlPlJlYm9sIEhUVFAgU2VydmVyIE9iamVjdDwvdGl0bGU+DTxzdHlsZSB0eXBl
PSJ0ZXh0L2NzcyI+DTwhLS0NYTpsaW5rIF57IHRleHQtZGVjb3JhdGlvbjogbm9uZTsgY29sb3I6
ICM2RDRENEQgXn0NYTp2aXNpdGVkIF57IHRleHQtZGVjb3JhdGlvbjogbm9uZTsgY29sb3I6ICM0
RDRENkQgXn0NLnRleHQge2ZvbnQtZmFtaWx5OiBBcmlhbCwgU2Fucy1zZXJpZjsgZm9udC1zaXpl
OiAxMnB4OyB9DS0tPg08L3N0eWxlPg08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9IlJl
YmxvZyAzLjAiPg08Ym9keSBiZ2NvbG9yID0gIiNGRkZGRkYiPg08ZGl2IGNsYXNzID0gInRleHQi
Pg08IS0tY29udGVudC0tPg08L2Rpdj4NPC9ib2R5Pg08L2h0bWw+fQ0NOyANOyAJQXR0cmlidXRl
cw07IA0JcG9ydDoJCQk4MA0JY29ubmVjdGlvbnM6CTANCWxpc3RlbmVyOglub25lDQk7IFF1ZXVl
cyB0byBob2xkIHRoZSBzdGF0ZSBvZiBtdWx0aXBsZSBjb25uZWN0aW9ucw0JcmVhZC1xOiAJY29w
eSAJW10NCXdyaXRlLXE6IAljb3B5IAlbXQ0JOyBCbG9jayBvZiBoYW5kbGVyIGVycm9ycw0JZXJy
b3JzOiAJY29weSAJW10NCTsgSnVzdCBhIGNvbnZlbmllbnQgcGxhY2UgdG8gc3RpY2sgZGF0YSBm
b3IgdGhlIGluaXQtaGFuZGxlcg0JaW5pdC1oYW5kbGVyLWRhdGE6IGNvcHkgW10NCTsgQ3JlYXRl
IGEgNGsgYnVmZmVyIGZvciBoZWFkZXJzDQloZWFkZXItYnVmZmVyOgltYWtlIHN0cmluZyEgNDA5
Ng0JOyBTZW5kL1JlY2VpdmUgZGF0YSBpbiA4ayBjaHVua3MNCXJlYWQtY2h1bmstc2l6ZTogODE5
Mg0Jd3JpdGUtY2h1bmstc2l6ZTogODE5Mg0JOyBMaW1pdCBzaXplIG9mIFBVVCBvciBQT1NUZWQg
ZGF0YQ0JbWF4LWVudGl0eTogMzI3NjgNCWRlYnVnOiB0cnVlDQk7IENvcHkgdGhpcyBvYmplY3Qg
YW5kIHNldCB0aGUgYXBwcm9wcmlhdGUgZmllbGRzIGluIHRoZQ0JOyBnZXQtaGFuZGxlciwgcHV0
LWhhbmRsZXIsIHBvc3QtaGFuZGxlciwgYW5kIGhlYWQtaGFuZGxlciANCTsgbWV0aG9kcy4NCWhh
bmRsZXItcmVzcG9uc2U6IG1ha2Ugb2JqZWN0IQ0JWw0JCWNvZGU6IAljb3B5ICIyMDAiDQkJbWlt
ZTogCWNvcHkgInRleHQvaHRtbCINCQljb29raWU6IGNvcHkgInZhbHVlPW51bGwiDQkJZW50aXR5
OiBjb3B5ICIiDQkJaGRyczoJY29weSBbXQ0JXQ0JDTsgDTsgCVV0aWxpdHkgTWV0aG9kcw07IA0J
Y210LWluc2VydDogZnVuY3Rpb24gDQlbc3RyIFtzdHJpbmchXSB0YWcgW3N0cmluZyFdIGNvbiBb
c3RyaW5nIV0gL2R1cCAvZXZlcnldDQlbIHMgdCBjIGRdDQlbDQkJczogcmVqb2luIFsgY29weSAi
PCEtLSIgY29weSB0YWcgIi0tPiIgXQ0JCWM6IGNvcHkgY29uDQkJaWYgZHVwIFsgYzogYXBwZW5k
IGMgcmVmb3JtIFsgIl4vIiBzXSBdDQkJZWl0aGVyIGV2ZXJ5DQkJWyB0OiByZXBsYWNlL2FsbCBj
b3B5IHN0ciBzIGNdDQkJWyB0OiByZXBsYWNlIGNvcHkgc3RyIHMgY10NCQlyZXR1cm4gdA0JXQ0J
DTsgDTsgCUluaXRpYWxpemF0aW9uIE1ldGhvZHMNOyANDQlpbml0LWhhbmRsZXI6IGZ1bmN0aW9u
IFtdDQlbIAldDQlbDQ0JCTsgT3ZlcnJpZGUgdGhpcyBmb3IgY3VzdG9tIGluaXRpYWxpemF0aW9u
IGNvZGUuDQ0JXQ0NCXJlZnJlc2g6IGZ1bmN0aW9uIFtdIFsgYmxrIF0NCVsNCQk7IENoZWNrIHRv
IHNlZSBpZiB0aGVyZSBhcmUgYW55IGV4dGVybmFsIGhhbmRsZXJzDQkJOyBJZiB5ZXMsIHJlcGxh
Y2UgdGhlIGRlZmF1bHQgaGFuZGxlcnMgd2l0aCB0aGVtLg0JCTsgVGhlIGxhc3QgdmFsdWUgcmV0
dXJuZWQgaW4gYW4gZXh0ZXJuYWwgaGFuZGxlcg0JCTsgbXVzdCBiZSBhIGhhbmRsZXIgZnVuY3Rp
b24uDQkJaWYgZXhpc3RzPyAlaGFuZGxlcnMvaW5pdC5yIA0JCVsNCQkJYmxrOiBsb2FkICVoYW5k
bGVycy9pbml0LnINCQkJYmluZCBibGsgJ2luaXQtaGFuZGxlcg0JCQlpbml0LWhhbmRsZXI6IGRv
IGJsawkJCQ0JCV0JDQkJaWYgZXhpc3RzPyAlaGFuZGxlcnMvZ2V0LnIgDQkJWw0JCQlibGs6IGxv
YWQgJWhhbmRsZXJzL2dldC5yDQkJCWJpbmQgYmxrICdnZXQtaGFuZGxlcg0JCQlnZXQtaGFuZGxl
cjogZG8gYmxrCQkJDQkJXQkNCQlpZiBleGlzdHM/ICVoYW5kbGVycy9wdXQuciANCQlbDQkJCWJs
azogbG9hZCAlaGFuZGxlcnMvcHV0LnINCQkJYmluZCBibGsgJ3B1dC1oYW5kbGVyDQkJCXB1dC1o
YW5kbGVyOiBkbyBibGsJCQkNCQldCQ0JCWlmIGV4aXN0cz8gJWhhbmRsZXJzL3Bvc3QuciANCQlb
DQkJCWJsazogbG9hZCAlaGFuZGxlcnMvcG9zdC5yDQkJCWJpbmQgYmxrICdwb3N0LWhhbmRsZXIN
CQkJcG9zdC1oYW5kbGVyOiBkbyBibGsJCQkNCQldCQ0JCWlmIGV4aXN0cz8gJWhhbmRsZXJzL2hl
YWQuciANCQlbDQkJCWJsazogbG9hZCAlaGFuZGxlcnMvaGVhZC5yDQkJCWJpbmQgYmxrICdoZWFk
LWhhbmRsZXINCQkJaGVhZC1oYW5kbGVyOiBkbyBibGsJCQkNCQldDQkJaW5pdC1oYW5kbGVyLWRh
dGE6IGNvcHkgW10JCQ0JCWluaXQtaGFuZGxlcg0JXQ0JDQ0Jc3RhcnR1cDogZnVuY3Rpb24gW10g
WyBibGsgXQ0JWw0JCTsgTG9hZCBhbnkgZXh0ZXJuYWwgaGFuZGxlcnMNCQlyZWZyZXNoDQkJOyBP
cGVuIHRoZSBodHRwIHBvcnQNCQlsaXN0ZW5lcjogb3Blbi9saW5lcyBqb2luIHRjcDovLzogcG9y
dA0JCTsgSSB0aGluayBJIGhhZCBncmFuZGVyIHN0YXJ0dXAgcGxhbnMgdGhhbiB0aGlzLg0JDQld
DQ07IA07IAlTZXJ2ZXIgUmVzcG9uc2UgdXRpbGl0aWVzDTsgDQ07IA07IAlIYW5kbGVyIE1ldGhv
ZHMNOyANOyANOyAJSGFuZGxlcnMgc2hvdWxkIGFsd2F5cyByZXR1cm4gdGhlIEhUVFAgUmVzcG9u
c2UgY29kZQ07IAlUaGUgbWltZSB0eXBlIG9mIHRoZSBlbnRpdHkgYmVpbmcgc2VudA07IAlBIGJs
b2NrIG9mIGF1eGlsbGFyeSBoZWFkZXJzIGluIHRoZSBmb3JtIG9mIA07IAlbICJIZWFkZXI6ICIg
IlZhbHVlIiBdDTsgCVRoZSBhY3R1YWwgZW50aXR5IGJlaW5nIHNlbnQuIEl0IGNhbiBiZSBhIGJp
bmFyeSEsIHN0cmluZyEsIA07IAlvciBhbiBvcGVuIHBvcnQhIA07IA07IAlBcyBhIGNvbnZlbmll
bmNlLCB0aGVyZSBpcyBhIGhhbmRsZXItcmVzcG9uc2Ugb2JqZWN0IHdoaWNoDTsgCWVuY2Fwc3Vs
YXRlcyB0aG9zZSBmb3VyIHRoaW5ncy4gSXRzIGZpZWxkcyBhcmU6IA07IAljb2RlIFtzdHJpbmch
XSBtaW1lIFtzdHJpbmchXSBjb29raWUgW3N0cmluZyFdDTsgCWVudGl0eSBbYmluYXJ5ISBwb3J0
IV0gaGRycyBbYmxvY2shXSAgDTsgDTsgCU5vdGU6IExpbmVmZWVkcyBmb3IgdGhlIGF1eGhlYWRl
cnMgd2lsbCBhdXRvbWF0aWNhbGx5IGJlIA07IAlhZGRlZCBpbiB0aGUgc2VuZC1yZXNwb25zZSBt
ZXRob2QuDTsgDTsgCU92ZXJyaWRlIHRoZXNlIGZvdXIgbWV0aG9kcyBpbiBhIGRlcml2ZWQgb2Jq
ZWN0IHRvIA07IAltYWtlIHRoaXMgc2VydmVyDTsgCWRvIHdoYXQgeW91IHdhbnQuIGUuZy4gDTsg
CW15LXNlcnZlcjogbWFrZSBodHRwc2VydmVyIHJlZHVjZSANOyAJWyBnZXQtaGFuZGxlcjogbXkt
Z2V0LWhhbmRsZXIgDTsgCXBvc3QtaGFuZGxlcjogbXktcG9zdC1oYW5kbGVyIHBvcnQ6IDgwMDAg
XQ07IA07CVlvdSBjYW4gbm93IHVzZSBleHRlcm5hbCBkaXNrLWJhc2VkIGhhbmRsZXJzLg07CVNl
ZSBhYm92ZSBub3RlLg07DTsgCVRoZSByZWFkIGFuZCB3cml0ZSBxdWV1ZXMgYXJlIHNldCB1cCBz
dWNoIHRoYXQgdGhlIA07IAloYW5kbGVycyBuZXZlciBoYXZlIHRvIHdvcnJ5IGFib3V0IHN0cmVh
bWluZyBkYXRhIHRvIG9yIGZyb20gDTsgCXRoZSBjbGllbnQuIA07IA07IAllLmcuIER1cmluZyBh
IEdFVCwgdGhlIGdldC1oYW5kbGVyIG1lcmVseSBoYXMgdG8gZG8gDTsgCXNvbWV0aGluZyB1c2Vm
dWwgDTsgCXdpdGggdGhlIGhlYWRlcnMgcGFzc2VkIHRvIGl0IGFuZCBnZW5lcmF0ZSBhbiBhcHBy
b3ByaWF0ZSBlbnRpdHkNOyAJdGhlIGNvbm5lY3Rpb24gaXMgdGhlbiBwbGFjZWQgaW4gdGhlIHdy
aXRlLXEgYW5kIHRoZSBlbnRpdHkgDTsgCWlzIHNlbnQgdG8gY2xpZW50IGluIHdyaXRlLWNodW5r
LXNpemUgc2l6ZWQgYml0cy4NOyANOyAJRHVyaW5nIGEgUFVUIG9yIFBPU1QsIHRoZSBjb25uZWN0
aW9uIGFuZCBkYXRhIGJlaW5nIHNlbnQgZnJvbQ07IAl0aGUgY2xpZW50IGlzIHBsYWNlZCBpbiB0
aGUgcmVhZC1xIGFuZCByZXRyaWV2ZWQgaW4NOyAJcmVhZC1jaHVuay1zaXplIHNpemVkIGNodW5r
cy4gVGhlIFBVVCBvciBQT1NUIGhhbmRsZXIgaXMgDTsgCXRoZW4gY2FsbGVkLCBhbmQgaXQJc2hv
dWxkIHRha2UgdGhhdCBkYXRhIGFuZCB0aGUgaGVhZGVycyBwYXNzZWQgOyAJdG8gaXQgYW5kIGdl
bmVyYXRlIGFuIGFwcHJvcHJpYXRlIGVudGl0eS4gTGlrZSB0aGUgR0VUIGhhbmRsZXIsIA07IAl0
aGUgY29ubmVjdGlvbiBhbmQgdGhlIG5ldyBlbnRpdHkgYXJlIHRoZW4gcGxhY2VkIGluIHRoZSB3
cml0ZS1xIA07IAl3aGVyZSB0aGV5IGFyZSBzdHJlYW1lZCBiYWNrIHRvIHRoZSBjbGllbnQgaW4g
d3JpdGUtY2h1bmstc2l6ZSANOyAJc2l6ZWQgY2h1bmtzLg07IA07IAlJIGhhdmUgbm90IGZpZ3Vy
ZWQgb3V0IHdoYXQgc2hvdWxkIGJlIGRvbmUgZHVyaW5nIGEgDTsgCUhFQUQgcmVxdWVzdC4gUHJv
YmFibHkganVzdCBkbyBhIEdFVCBidXQgZG9uJ3Qgc2VuZCB0aGUgZW50aXR5Lg07IA0NCWdldC1o
YW5kbGVyOiBmdW5jdGlvbiBbIGhkcnMgXSANCVsgdCAgcmVzcG9uc2UgcyBoIHYgaGVhZGVyc3Ry
aW5nIF0NCVsNCQk7IA0JCTsgQnkgZGVmYXVsdCBmb3JtYXQgYW5kIHJldHVybiB0aGUgaGVhZGVy
cyBwYXNzZWQgdG8gDQkJOyB0aGUgc2VydmVyIGZyb20gdGhlIGJyb3dzZXINCQk7IA0JCWhlYWRl
cnN0cmluZzogY29weSAiUmVxdWVzdCBIZWFkZXJzOiA8YnI+Xi8iDQkJZm9yZWFjaCBbIGggdiBd
IGhkcnMgDQkJWyBhcHBlbmQgaGVhZGVyc3RyaW5nIHJlam9pbiANCQlbIjxsaT4iIGggIiAmbmJz
cDsgJm5ic3A7ICIgdiAiPGJyPl4vIl1dDQkJdDogY29weSBkZWZhdWx0LXRlbXBsYXRlDQkJdDog
Y210LWluc2VydCB0ICJjb250ZW50IiByZWpvaW4NCQlbIA0JCQkiRGVmYXVsdCBIVFRQIEdldCBI
YW5kbGVyPGJyPjxicj5eLyIgDQkJCWZvcm0gbm93ICI8YnI+PGJyPl4vIiANCQkJaGVhZGVyc3Ry
aW5nICI8YnI+PGJyPl4vIiANCQldDQkJcmVzcG9uc2U6IG1ha2UgaGFuZGxlci1yZXNwb25zZQ0J
CVsNCQkJY29kZTogIjIwMCIgbWltZTogInRleHQvaHRtbCINCQkJY29va2llOiAiIiAJZW50aXR5
OiB0DQkJCWhkcnM6IGNvcHkgWyAiU2VydmVyOiIgIlJlYm9sLUhUVFAtT2JqZWN0IDEuMGEyIiAg
XQ0JCV0NCQlyZXR1cm4gcmVzcG9uc2UNCV0NDQloZWFkLWhhbmRsZXI6IGZ1bmN0aW9uIFsgaGRy
cyBdIA0JWyByZXNwb25zZSBdDQlbDQkJcmVzcG9uc2U6IG1ha2UgaGFuZGxlci1yZXNwb25zZQ0J
CVsNCQkJY29kZTogIjIwMCIJbWltZTogInRleHQvaHRtbCINCQkJY29va2llOiAiIgllbnRpdHk6
ICIiDQkJCWhkcnM6IGNvcHkgWyAiU2VydmVyOiIgIlJlYm9sLUhUVFAtT2JqZWN0IDEuMGEyIiAg
XQ0JCV0NCQlyZXR1cm4gcmVzcG9uc2UNCV0NDQlwdXQtaGFuZGxlcjogZnVuY3Rpb24gWyBoZHJz
IGRhdGEgXSANCVsgdCAgcmVzcG9uc2UgXQ0JWw0JCTsgDQkJOyBCeSBkZWZhdWx0IGZvcm1hdCBh
bmQgcmV0dXJuIHRoZSBoZWFkZXJzIGFuZCBkYXRhIA0JCTsgcGFzc2VkIHRvIHRoZSBzZXJ2ZXIg
ZnJvbSB0aGUgYnJvd3Nlcg0JCTsgDQkJaGVhZGVyc3RyaW5nOiBjb3B5ICJSZXF1ZXN0IEhlYWRl
cnM6IDxicj5eLyINCQlmb3JlYWNoIFsgaCB2IF0gaGRycyANCQlbIGFwcGVuZCBoZWFkZXJzdHJp
bmcgcmVqb2luIA0JCVsiPGxpPiIgaCAiICZuYnNwOyAmbmJzcDsgIiB2ICI8YnI+Xi8iXV0NCQl0
OiBjb3B5IGRlZmF1bHQtdGVtcGxhdGUNCQl0OiBjbXQtaW5zZXJ0IHQgImNvbnRlbnQiIHJlam9p
bg0JCVsgDQkJCSJEZWZhdWx0IEhUVFAgUHV0IEhhbmRsZXI8YnI+PGJyPl4vIiANCQkJZm9ybSBu
b3cgIjxicj48YnI+Xi8iIA0JCQloZWFkZXJzdHJpbmcgIjxicj48YnI+Xi8iDQkJCSJEYXRhOiA8
YnI+Xi8iIHRvLXN0cmluZyBkYXRhDQkJXQ0JCXJlc3BvbnNlOiBtYWtlIGhhbmRsZXItcmVzcG9u
c2UNCQlbDQkJCWNvZGU6ICIyMDAiCW1pbWU6ICJ0ZXh0L2h0bWwiDQkJCWNvb2tpZTogIiIJZW50
aXR5OiB0DQkJCWhkcnM6IGNvcHkgWyAiU2VydmVyOiIgIlJlYm9sLUhUVFAtT2JqZWN0IDEuMGEy
IiBdDQkJXQ0JCXJldHVybiByZXNwb25zZQ0JXQ0NCXBvc3QtaGFuZGxlcjogZnVuY3Rpb24gWyBo
ZHJzIGRhdGEgXSANCVsgdCAgcmVzcG9uc2UgXQ0JWw0JCTsgDQkJOyBCeSBkZWZhdWx0IGZvcm1h
dCBhbmQgcmV0dXJuIHRoZSBoZWFkZXJzIGFuZCBkYXRhIA0JCTsgcGFzc2VkIHRvIHRoZSBzZXJ2
ZXIgZnJvbSB0aGUgYnJvd3Nlcg0JCTsgDQkJaGVhZGVyc3RyaW5nOiBjb3B5ICJSZXF1ZXN0IEhl
YWRlcnM6IDxicj5eLyINCQlmb3JlYWNoIFsgaCB2IF0gaGRycyANCQlbIGFwcGVuZCBoZWFkZXJz
dHJpbmcgcmVqb2luIA0JCVsiPGxpPiIgaCAiICZuYnNwOyAmbmJzcDsgIiB2ICI8YnI+Xi8iXV0N
CQl0OiBjb3B5IGRlZmF1bHQtdGVtcGxhdGUNCQl0OiBjbXQtaW5zZXJ0IHQgImNvbnRlbnQiIHJl
am9pbg0JCVsgDQkJCSJEZWZhdWx0IEhUVFAgUE9TVCBIYW5kbGVyPGJyPjxicj5eLyIgDQkJCWZv
cm0gbm93ICI8YnI+PGJyPl4vIiANCQkJaGVhZGVyc3RyaW5nICI8YnI+PGJyPl4vIg0JCQkiRGF0
YTogPGJyPl4vIiB0by1zdHJpbmcgZGF0YQ0JCV0NCQlyZXNwb25zZTogbWFrZSBoYW5kbGVyLXJl
c3BvbnNlDQkJWw0JCQljb2RlOiAiMjAwIgltaW1lOiAidGV4dC9odG1sIg0JCQljb29raWU6ICIi
CWVudGl0eTogdA0JCQloZHJzOiBjb3B5IFsgIlNlcnZlcjoiICJSZWJvbC1IVFRQLU9iamVjdCAx
LjBhMiIgXQ0JCV0NCQlyZXR1cm4gcmVzcG9uc2UNCV0NDQ07IA07IAlSZXF1ZXN0IGFuZCBSZXNw
b25zZSBzZXJ2aWNpbmcgbWV0aG9kcw07IA0NCWZldGNoLWhlYWRlcnM6IGZ1bmN0aW9uIFsgY29u
biBdDQlbIGxpbmUgaGRycyBpcC1hZGQgaGRyc2JsayByYXdoZHJzIGggcCBdDQlbDQkJOyBTdWNr
IGVhY2ggbGluZSBvZiBoZWFkZXJzIGZyb20gdGhlIGNvbm5lY3Rpb24NCQk7IEFuZCBwbGFjZSBp
dCBpbiBhIGJ1ZmZlcg0JCXdoaWxlIFthbGwgWygobGluZTogcGljayBjb25uIDEpIDw+ICIiKSAo
bGluZSA8PiBub25lKV1dDQkJWyBhcHBlbmQgaGVhZGVyLWJ1ZmZlciBqb2luIGxpbmUgIl4vIiBd
DQkJDQkJOyBCcmVhayB0aGUgaGVhZGVyLWJ1ZmZlciB1cCBpbnRvIHNvbWV0aGluZyBTZWxlY3Rh
YmxlDQkJOyBUaGVyZSBhcmUgcHJvYmFibHkgYSBidW5jaCBvZiBtdWNoIG1vcmUgZWxlZ2FudCB3
YXlzIA0JCTsgdG8gZG8gdGhpcy4uLg0JCWhkcnM6IGNvcHkgW10NCQlyYXdoZHJzOiBwYXJzZSBo
ZWFkZXItYnVmZmVyIG5vbmUNCQlhcHBlbmQgaGRycyByZWR1Y2UgDQkJWyANCQkJIk1ldGhvZDoi
IGZpcnN0IHJhd2hkcnMgDQkJCSJUYXJnZXQtVVJJOiIgc2Vjb25kIHJhd2hkcnMgDQkJCSJIVFRQ
LXZl