Commit Diff


commit - 1e77a39450cf1542089114becb66a9974db50768
commit + 9142d36228acc954b289705244ce2477187091e9
blob - ac69423ad87725c951699d219c687653fa5c2dca
blob + 0e2226cdf1aafa116be199d138a138f8bc2f2371
--- src/cmd/devdraw/devdraw.c
+++ src/cmd/devdraw/devdraw.c
@@ -294,18 +294,11 @@ static
 void
 drawflush(void)
 {
-	_flushmemscreen(flushrect);
+	if(flushrect.min.x < flushrect.max.x)
+		_flushmemscreen(flushrect);
 	flushrect = Rect(10000, 10000, -10000, -10000);
 }
 
-void
-xdrawflush(void)
-{
-	qlock(&sdraw.lk);
-	drawflush();
-	qunlock(&sdraw.lk);
-}
-
 static
 int
 drawcmp(char *a, char *b, int n)
@@ -798,7 +791,7 @@ _drawmsgwrite(void *v, int n)
 
 	while((n-=m) > 0){
 		a += m;
-/* print("msgwrite %d(%c)...", n, *a); */
+/*fprint(2, "msgwrite %d(%d)...", n, *a); */
 		switch(*a){
 		default:
 /*fprint(2, "bad command %d\n", *a); */
blob - 533fa8438f0367336f277c1d553109ddf29dbffd
blob + 498bd5aaef7faf594630f4893a79239629e5d1d2
--- src/cmd/devdraw/devdraw.h
+++ src/cmd/devdraw/devdraw.h
@@ -2,3 +2,5 @@ int _drawmsgread(void*, int);
 int _drawmsgwrite(void*, int);
 void _initdisplaymemimage(Memimage*);
 int _latin1(Rune*, int);
+int parsewinsize(char*, Rectangle*, int*);
+
blob - /dev/null
blob + 99c6e6e8a59840e72dec571ad07138844695fc96 (mode 644)
--- /dev/null
+++ src/cmd/devdraw/glendapng.h
@@ -0,0 +1,608 @@
+uchar glenda_png[] = {
+	0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, 0x49, 0x48, 0x44, 0x52,
+	0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x08, 0x06, 0x00, 0x00, 0x00, 0xc3, 0x3e, 0x61,
+	0xcb, 0x00, 0x00, 0x00, 0x06, 0x62, 0x4b, 0x47, 0x44, 0x00, 0xfe, 0x00, 0xfe, 0x00, 0xfe, 0xeb,
+	0x18, 0xd4, 0x82, 0x00, 0x00, 0x00, 0x09, 0x70, 0x48, 0x59, 0x73, 0x00, 0x00, 0x0b, 0x12, 0x00,
+	0x00, 0x0b, 0x12, 0x01, 0xd2, 0xdd, 0x7e, 0xfc, 0x00, 0x00, 0x00, 0x09, 0x76, 0x70, 0x41, 0x67,
+	0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x30, 0xe1, 0x31, 0x9a, 0x00, 0x00, 0x25,
+	0x43, 0x49, 0x44, 0x41, 0x54, 0x78, 0xda, 0xed, 0x7d, 0x69, 0x70, 0x1c, 0xe7, 0x99, 0xde, 0xd3,
+	0x3d, 0x3d, 0xd3, 0x33, 0x3d, 0xd3, 0x73, 0x5f, 0x18, 0x60, 0x70, 0xdf, 0x24, 0x61, 0x90, 0x94,
+	0x29, 0x89, 0xa4, 0x24, 0x53, 0xd4, 0xb1, 0x16, 0x57, 0xdc, 0xd8, 0x8e, 0xed, 0x28, 0x89, 0x6b,
+	0xed, 0xf2, 0x26, 0xa9, 0x6c, 0x55, 0xf6, 0xcf, 0x3a, 0xa9, 0xdd, 0x3f, 0xf9, 0x91, 0x64, 0x2b,
+	0xa9, 0x4a, 0x9c, 0xaa, 0x78, 0xff, 0x6c, 0xa5, 0x5c, 0xd9, 0x6c, 0x6d, 0x95, 0x9c, 0x72, 0x6d,
+	0xb9, 0xd6, 0x96, 0xb6, 0xbc, 0x5a, 0x4b, 0xb2, 0x2d, 0x59, 0x14, 0x29, 0xf1, 0x90, 0x48, 0x80,
+	0x24, 0x40, 0x10, 0x80, 0x38, 0x18, 0x60, 0x30, 0xf7, 0x74, 0x4f, 0x4f, 0x77, 0x4f, 0x5f, 0xf9,
+	0x01, 0x7e, 0xed, 0xd1, 0x41, 0x8a, 0x22, 0x41, 0x4c, 0x53, 0x8b, 0xa7, 0x0a, 0x45, 0x14, 0x01,
+	0xcc, 0xf4, 0xf4, 0xf7, 0xf4, 0xf7, 0xbd, 0xef, 0xf3, 0x5e, 0xc0, 0x2e, 0x76, 0xb1, 0x8b, 0x5d,
+	0xec, 0xe2, 0x1f, 0x29, 0xa8, 0x6e, 0x5f, 0xc0, 0xa7, 0xc0, 0x03, 0x20, 0x06, 0x80, 0x03, 0x60,
+	0x00, 0x28, 0x02, 0x68, 0x75, 0xfb, 0xa2, 0x3e, 0x4f, 0x70, 0x2a, 0x01, 0x28, 0x00, 0xe9, 0xf1,
+	0xf1, 0xf1, 0xd9, 0x50, 0x28, 0xf4, 0xa4, 0xd7, 0xeb, 0x1d, 0xd4, 0x34, 0x4d, 0x52, 0x55, 0xf5,
+	0xf5, 0x8d, 0x8d, 0x8d, 0x73, 0x85, 0x42, 0x61, 0x05, 0xbb, 0x44, 0xd8, 0x16, 0x38, 0x91, 0x00,
+	0xd4, 0xf0, 0xf0, 0xf0, 0xde, 0x64, 0x32, 0xf9, 0x2f, 0xc7, 0xc6, 0xc6, 0xbe, 0xfd, 0xd8, 0x63,
+	0x8f, 0x25, 0x86, 0x87, 0x87, 0x29, 0x51, 0x14, 0x71, 0xee, 0xdc, 0x39, 0x65, 0x61, 0x61, 0xe1,
+	0xd4, 0xea, 0xea, 0xea, 0xff, 0x7e, 0xf7, 0xdd, 0x77, 0xdf, 0x00, 0x50, 0x00, 0x60, 0x75, 0xfb,
+	0x82, 0x77, 0xb1, 0xbd, 0x18, 0x7d, 0xe6, 0x99, 0x67, 0xfe, 0xe1, 0x07, 0x3f, 0xf8, 0x81, 0x3e,
+	0x37, 0x37, 0x67, 0x49, 0x92, 0x64, 0x19, 0x86, 0x61, 0x59, 0x96, 0x65, 0x89, 0xa2, 0x68, 0x9d,
+	0x3a, 0x75, 0xca, 0xfa, 0xde, 0xf7, 0xbe, 0x57, 0xdd, 0xb7, 0x6f, 0xdf, 0x7f, 0x0d, 0x85, 0x42,
+	0xc3, 0x70, 0x26, 0x89, 0x1f, 0x18, 0xb8, 0xba, 0x7d, 0x01, 0x1f, 0x81, 0x77, 0x70, 0x70, 0xf0,
+	0xbf, 0x7d, 0xed, 0x6b, 0x5f, 0x3b, 0x79, 0xf2, 0xe4, 0x49, 0xa6, 0xaf, 0xaf, 0x0f, 0x7e, 0xbf,
+	0x1f, 0x14, 0x45, 0xc1, 0xb2, 0x2c, 0xb0, 0x2c, 0x8b, 0x6c, 0x36, 0x8b, 0x81, 0x81, 0x01, 0x9f,
+	0x61, 0x18, 0x47, 0x35, 0x4d, 0x63, 0x57, 0x56, 0x56, 0xae, 0x00, 0xa8, 0x77, 0xfb, 0xc2, 0x1f,
+	0x54, 0x38, 0x8d, 0x00, 0xd9, 0xfd, 0xfb, 0xf7, 0xff, 0xf7, 0x63, 0xc7, 0x8e, 0xf1, 0xd9, 0x6c,
+	0x16, 0x91, 0x48, 0x04, 0x0c, 0xc3, 0xc0, 0xb2, 0x2c, 0xa8, 0xaa, 0x0a, 0x4d, 0xd3, 0x40, 0xd3,
+	0x34, 0x82, 0xc1, 0x20, 0x66, 0x66, 0x66, 0x20, 0xcb, 0xf2, 0x43, 0x37, 0x6e, 0xdc, 0x68, 0x95,
+	0xcb, 0xe5, 0xf7, 0xb0, 0x6b, 0x13, 0xdc, 0x15, 0x9c, 0x46, 0x80, 0xb1, 0xd9, 0xd9, 0xd9, 0x3f,
+	0x38, 0x71, 0xe2, 0x84, 0x27, 0x1e, 0x8f, 0xc3, 0xe7, 0xf3, 0x81, 0x61, 0x18, 0x48, 0x92, 0x84,
+	0x7c, 0x3e, 0x8f, 0xa5, 0xa5, 0x25, 0xb4, 0x5a, 0x2d, 0x04, 0x83, 0x41, 0x04, 0x83, 0x41, 0x0c,
+	0x0e, 0x0e, 0x42, 0x51, 0x94, 0xa3, 0xb9, 0x5c, 0xce, 0xac, 0xd5, 0x6a, 0x17, 0x00, 0xc8, 0xdd,
+	0xfe, 0x00, 0x0f, 0x1a, 0x9c, 0x46, 0x80, 0xc8, 0xe8, 0xe8, 0xe8, 0xb7, 0x1f, 0x7d, 0xf4, 0x51,
+	0x6f, 0x20, 0x10, 0x00, 0xcf, 0xf3, 0x60, 0x18, 0x06, 0xe5, 0x72, 0x19, 0x0b, 0x0b, 0x0b, 0x58,
+	0x58, 0x58, 0xc0, 0xe2, 0xe2, 0x22, 0xea, 0xf5, 0x3a, 0x78, 0x9e, 0x47, 0x2a, 0x95, 0x42, 0x32,
+	0x99, 0x44, 0xbd, 0x5e, 0x3f, 0x5a, 0x2a, 0x95, 0x36, 0xeb, 0xf5, 0xfa, 0x1c, 0x80, 0x76, 0xb7,
+	0x3f, 0xc4, 0x83, 0x04, 0xa7, 0x11, 0x40, 0xe7, 0x38, 0xee, 0xf7, 0x0e, 0x1d, 0x3a, 0x94, 0x4c,
+	0xa7, 0xd3, 0x54, 0x20, 0x10, 0x80, 0xdb, 0xed, 0x06, 0x45, 0x51, 0x58, 0x5c, 0x5c, 0xc4, 0x99,
+	0x33, 0x67, 0x50, 0xaf, 0xd7, 0x51, 0x2e, 0x97, 0x51, 0xad, 0x56, 0x11, 0x0e, 0x87, 0x31, 0x34,
+	0x34, 0x84, 0xc1, 0xc1, 0x41, 0xdc, 0xb8, 0x71, 0xe3, 0x91, 0x6a, 0xb5, 0x7a, 0x55, 0x14, 0xc5,
+	0x65, 0x00, 0x7a, 0xb7, 0x3f, 0xc8, 0x83, 0x02, 0xa7, 0x11, 0x40, 0x11, 0x04, 0x61, 0x60, 0xcf,
+	0x9e, 0x3d, 0x0f, 0x67, 0xb3, 0x59, 0x26, 0x1c, 0x0e, 0x83, 0x65, 0x59, 0x50, 0x14, 0x85, 0x7a,
+	0xbd, 0x8e, 0xa5, 0xa5, 0x25, 0xa8, 0xaa, 0x8a, 0x7c, 0x3e, 0x8f, 0x66, 0xb3, 0x09, 0x00, 0x88,
+	0xc5, 0x62, 0x18, 0x19, 0x19, 0x41, 0x6f, 0x6f, 0xaf, 0xb7, 0x54, 0x2a, 0x1d, 0x2f, 0x16, 0x8b,
+	0x73, 0x92, 0x24, 0x7d, 0x80, 0x5d, 0x12, 0xdc, 0x11, 0x9c, 0x46, 0x00, 0x68, 0x9a, 0x96, 0x8b,
+	0x46, 0xa3, 0x5f, 0x9d, 0x9e, 0x9e, 0x0e, 0x26, 0x12, 0x09, 0x8a, 0x61, 0x18, 0x78, 0x3c, 0x1e,
+	0xd0, 0x34, 0x8d, 0x5a, 0xad, 0x86, 0x42, 0xa1, 0x80, 0x56, 0xab, 0x85, 0x6a, 0xb5, 0x0a, 0x9a,
+	0xa6, 0x61, 0x18, 0x06, 0x02, 0x81, 0x00, 0x26, 0x27, 0x27, 0x31, 0x34, 0x34, 0xe4, 0xbb, 0x7a,
+	0xf5, 0xea, 0xd1, 0x42, 0xa1, 0xf0, 0x4e, 0xbb, 0xdd, 0x5e, 0xc3, 0xae, 0x46, 0xf0, 0xa9, 0xb8,
+	0x9f, 0x04, 0xa0, 0x71, 0x77, 0x3e, 0x7a, 0xa5, 0x52, 0xa9, 0x24, 0xd2, 0xe9, 0xf4, 0xa1, 0xd1,
+	0xd1, 0x51, 0xc6, 0xe7, 0xf3, 0x81, 0x65, 0x59, 0xb8, 0xdd, 0x6e, 0x28, 0x8a, 0x82, 0x7a, 0xbd,
+	0x8e, 0x56, 0xab, 0x05, 0x59, 0x96, 0xb1, 0xb8, 0xb8, 0x88, 0x60, 0x30, 0x88, 0x72, 0xb9, 0x0c,
+	0x9f, 0xcf, 0x87, 0x3d, 0x7b, 0xf6, 0x20, 0x1e, 0x8f, 0x07, 0xe7, 0xe6, 0xe6, 0x66, 0x2a, 0x95,
+	0xca, 0x2f, 0x0c, 0xc3, 0xa8, 0x77, 0xe7, 0xb6, 0x3e, 0x38, 0xd8, 0x6e, 0x02, 0xd0, 0x00, 0xb8,
+	0x78, 0x3c, 0x1e, 0xef, 0xe9, 0xe9, 0x19, 0xe0, 0x79, 0x3e, 0xce, 0x30, 0x4c, 0x54, 0x96, 0x65,
+	0x0b, 0x80, 0x89, 0x2d, 0x3d, 0xff, 0x53, 0x21, 0x49, 0xd2, 0x35, 0x8e, 0xe3, 0x9e, 0x1f, 0x1f,
+	0x1f, 0x8f, 0xa5, 0xd3, 0x69, 0x8a, 0x65, 0x59, 0x30, 0x0c, 0x03, 0x97, 0xcb, 0x05, 0x41, 0x10,
+	0x20, 0x49, 0x12, 0x0a, 0x85, 0x02, 0x58, 0x96, 0xc5, 0xc6, 0xc6, 0x06, 0x64, 0x59, 0x46, 0xb3,
+	0xd9, 0x44, 0x3a, 0x9d, 0xc6, 0x81, 0x03, 0x07, 0xc0, 0x30, 0x4c, 0xcf, 0xfc, 0xfc, 0x7c, 0xac,
+	0x52, 0xa9, 0xfc, 0x1a, 0xbb, 0x9e, 0xc1, 0x6d, 0xb1, 0x9d, 0x04, 0xf0, 0x0e, 0x0c, 0x0c, 0xec,
+	0x8b, 0xc5, 0x62, 0xff, 0x74, 0x62, 0x62, 0xe2, 0xbf, 0x8c, 0x8f, 0x8f, 0xff, 0x87, 0x70, 0x38,
+	0xfc, 0x9d, 0x50, 0x28, 0xf4, 0x2f, 0x68, 0x9a, 0x9e, 0x60, 0x59, 0x56, 0xf5, 0xf9, 0x7c, 0x62,
+	0xab, 0xd5, 0x6a, 0xe3, 0xd3, 0x89, 0x20, 0x14, 0x0a, 0x05, 0xb5, 0xdd, 0x6e, 0x3f, 0x31, 0x34,
+	0x34, 0xe4, 0x8d, 0xc7, 0xe3, 0x70, 0xbb, 0xdd, 0x08, 0x87, 0xc3, 0xa8, 0xd7, 0xeb, 0x58, 0x5b,
+	0x5b, 0xc3, 0xc6, 0xc6, 0x06, 0x44, 0x51, 0x44, 0xa3, 0xd1, 0xc0, 0x8d, 0x1b, 0x37, 0xd0, 0xdb,
+	0xdb, 0x8b, 0x50, 0x28, 0x04, 0x9e, 0xe7, 0x31, 0x31, 0x31, 0x81, 0x6a, 0xb5, 0x3a, 0xb3, 0xb2,
+	0xb2, 0x92, 0x17, 0x45, 0xf1, 0x22, 0x76, 0xed, 0x81, 0x5b, 0x62, 0xbb, 0x08, 0xc0, 0xf6, 0xf6,
+	0xf6, 0xfe, 0xde, 0xa3, 0x8f, 0x3e, 0xfa, 0xe2, 0x97, 0xbf, 0xfc, 0xe5, 0xaf, 0x3c, 0xff, 0xfc,
+	0xf3, 0xbd, 0x0f, 0x3f, 0xfc, 0xb0, 0x97, 0xe7, 0x79, 0xdf, 0xa1, 0x43, 0x87, 0xf8, 0xfe, 0xfe,
+	0xfe, 0x19, 0x9f, 0xcf, 0xf7, 0x02, 0xcf, 0xf3, 0x47, 0x5d, 0x2e, 0x57, 0x5d, 0x55, 0xd5, 0xaa,
+	0xa6, 0x69, 0x3a, 0x6e, 0xb3, 0x30, 0xed, 0x76, 0x7b, 0xbe, 0x58, 0x2c, 0x1e, 0x4a, 0xa5, 0x52,
+	0xc3, 0xc9, 0x64, 0xd2, 0x15, 0x8b, 0xc5, 0xec, 0x33, 0xbf, 0xdd, 0x6e, 0x43, 0xd3, 0x34, 0x14,
+	0x8b, 0x45, 0x68, 0x9a, 0x86, 0x78, 0x3c, 0x0e, 0x86, 0x61, 0xa0, 0x28, 0x0a, 0xaa, 0xd5, 0x2a,
+	0x46, 0x47, 0x47, 0x31, 0x33, 0x33, 0x83, 0xeb, 0xd7, 0xaf, 0x7f, 0xb1, 0x52, 0xa9, 0xfc, 0x5a,
+	0x14, 0xc5, 0x3c, 0x76, 0xed, 0x81, 0x4f, 0xc4, 0xb6, 0x10, 0xc0, 0xe3, 0xf1, 0xfc, 0xee, 0x37,
+	0xbe, 0xf1, 0x8d, 0x17, 0xbf, 0xf9, 0xcd, 0x6f, 0x06, 0x67, 0x66, 0x66, 0x30, 0x3e, 0x3e, 0x8e,
+	0x48, 0x24, 0x82, 0xa9, 0xa9, 0x29, 0x0c, 0x0e, 0x0e, 0x62, 0x62, 0x62, 0x02, 0x63, 0x63, 0x63,
+	0x98, 0x9d, 0x9d, 0xed, 0xa3, 0x69, 0xfa, 0xa4, 0x65, 0x59, 0x87, 0x34, 0x4d, 0x93, 0x25, 0x49,
+	0xda, 0xc0, 0xad, 0x15, 0x3c, 0xa3, 0xd9, 0x6c, 0x5e, 0x51, 0x14, 0xe5, 0xd9, 0xe1, 0xe1, 0xe1,
+	0xc8, 0xf0, 0xf0, 0x30, 0xe5, 0xf1, 0x78, 0x10, 0x0a, 0x85, 0xc0, 0xb2, 0x2c, 0x14, 0x45, 0x81,
+	0x24, 0x49, 0x68, 0xb5, 0x5a, 0x68, 0x34, 0x1a, 0x90, 0x24, 0x09, 0xc5, 0x62, 0x11, 0x00, 0xd0,
+	0xdf, 0xdf, 0x8f, 0x54, 0x2a, 0x85, 0xc9, 0xc9, 0x49, 0xee, 0xd2, 0xa5, 0x4b, 0x7b, 0xca, 0xe5,
+	0xf2, 0x6b, 0xaa, 0xaa, 0xd6, 0xbb, 0x7d, 0xb3, 0x9d, 0x88, 0xed, 0x20, 0x40, 0xf4, 0xa1, 0x87,
+	0x1e, 0xfa, 0xd1, 0x1f, 0xfd, 0xd1, 0x1f, 0xa5, 0x33, 0x99, 0x0c, 0xe2, 0xf1, 0x38, 0x52, 0xa9,
+	0x14, 0xc2, 0xe1, 0x30, 0x42, 0xa1, 0x10, 0x82, 0xc1, 0x20, 0xc2, 0xe1, 0x30, 0x06, 0x07, 0x07,
+	0x91, 0x4e, 0xa7, 0xd1, 0xd3, 0xd3, 0xe3, 0xea, 0xed, 0xed, 0x1d, 0x04, 0x70, 0x52, 0x96, 0xe5,
+	0x90, 0x2c, 0xcb, 0x73, 0xba, 0xae, 0x0b, 0xb7, 0x78, 0xed, 0xcd, 0x5c, 0x2e, 0xd7, 0x1c, 0x1d,
+	0x1d, 0x3d, 0x36, 0x30, 0x30, 0xe0, 0x8d, 0x46, 0xa3, 0x70, 0xb9, 0x5c, 0xf0, 0xf9, 0x7c, 0x70,
+	0xb9, 0x5c, 0x68, 0x34, 0x1a, 0x28, 0x16, 0x8b, 0x68, 0xb7, 0xdb, 0xd0, 0x75, 0x1d, 0x82, 0x20,
+	0xa0, 0x5c, 0x2e, 0x43, 0xd3, 0x34, 0x04, 0x83, 0x41, 0x4c, 0x4c, 0x4c, 0xc0, 0xe5, 0x72, 0xf5,
+	0x9d, 0x3d, 0x7b, 0xd6, 0x5f, 0xab, 0xd5, 0xde, 0xc6, 0xae, 0x5c, 0xfc, 0x31, 0x6c, 0x07, 0x01,
+	0xbe, 0xf3, 0xdd, 0xef, 0x7e, 0xf7, 0xf7, 0x9f, 0x78, 0xe2, 0x09, 0xc4, 0x62, 0x31, 0xc4, 0xe3,
+	0x71, 0xdb, 0x6d, 0xa3, 0x28, 0x0a, 0x14, 0x45, 0x81, 0xa6, 0x69, 0xb8, 0xdd, 0x6e, 0xf8, 0xfd,
+	0x7e, 0xa4, 0xd3, 0x69, 0x84, 0xc3, 0x61, 0x8c, 0x8c, 0x8c, 0xb8, 0x4c, 0xd3, 0xfc, 0x62, 0xab,
+	0xd5, 0x9a, 0xa8, 0xd5, 0x6a, 0x67, 0x0d, 0xc3, 0x10, 0xf1, 0xc9, 0xb6, 0xc1, 0xa5, 0x0f, 0x3e,
+	0xf8, 0xe0, 0x8b, 0xc3, 0xc3, 0xc3, 0x63, 0xc3, 0xc3, 0xc3, 0x34, 0xc7, 0x71, 0x70, 0xb9, 0x5c,
+	0x60, 0x18, 0x06, 0xf5, 0x7a, 0x1d, 0x34, 0x4d, 0xe3, 0x83, 0x0f, 0x3e, 0x80, 0x2c, 0xcb, 0x50,
+	0x14, 0x05, 0x8a, 0xa2, 0xa0, 0x54, 0x2a, 0xc1, 0xeb, 0xf5, 0x62, 0x70, 0x70, 0x10, 0x87, 0x0e,
+	0x1d, 0x42, 0xbd, 0x5e, 0x3f, 0xb0, 0xb4, 0xb4, 0xd4, 0x14, 0x45, 0xf1, 0x02, 0x00, 0xb5, 0xdb,
+	0x37, 0xdd, 0x49, 0xb8, 0x57, 0x02, 0xd0, 0x99, 0x4c, 0xe6, 0xcf, 0xbe, 0xf3, 0x9d, 0xef, 0x0c,
+	0x4f, 0x4d, 0x4d, 0x81, 0xe7, 0x79, 0x78, 0x3c, 0x1e, 0xfb, 0x87, 0x9a, 0xa6, 0x41, 0x14, 0x45,
+	0x54, 0xab, 0x55, 0x3b, 0xa8, 0xe3, 0xf1, 0x78, 0x10, 0x8f, 0xc7, 0x91, 0x48, 0x24, 0x90, 0xcd,
+	0x66, 0x61, 0x59, 0xd6, 0x58, 0xbd, 0x5e, 0x3f, 0x4a, 0x51, 0xd4, 0x72, 0xb3, 0xd9, 0xdc, 0xc4,
+	0xc7, 0xa5, 0x5c, 0x4b, 0x10, 0x84, 0x3c, 0xc3, 0x30, 0x27, 0x27, 0x26, 0x26, 0xfc, 0xc9, 0x64,
+	0xd2, 0x3e, 0xef, 0x43, 0xa1, 0x10, 0x0a, 0x85, 0x02, 0x2a, 0x95, 0x0a, 0x2a, 0x95, 0x0a, 0x4c,
+	0xd3, 0x84, 0xdb, 0xed, 0x06, 0xc3, 0x30, 0x68, 0xb7, 0xdb, 0x08, 0x87, 0xc3, 0xc8, 0x66, 0xb3,
+	0x18, 0x1a, 0x1a, 0x42, 0x2e, 0x97, 0x7b, 0xa2, 0x50, 0x28, 0x5c, 0x6c, 0xb5, 0x5a, 0x0b, 0xd8,
+	0xf2, 0x48, 0x76, 0x81, 0x7b, 0x27, 0x40, 0x68, 0x6c, 0x6c, 0xec, 0xcf, 0x4e, 0x9c, 0x38, 0xe1,
+	0x4f, 0x24, 0x12, 0x08, 0x85, 0x42, 0xf6, 0x0f, 0x34, 0x4d, 0xc3, 0x95, 0x2b, 0x57, 0x70, 0xfa,
+	0xf4, 0x69, 0x5b, 0xc3, 0x6f, 0x34, 0x1a, 0xf0, 0xf9, 0x7c, 0xf0, 0x7a, 0xbd, 0xf0, 0xf9, 0x7c,
+	0x48, 0x24, 0x12, 0x08, 0x87, 0xc3, 0xc8, 0x64, 0x32, 0x69, 0x4d, 0xd3, 0x4e, 0x08, 0x82, 0x50,
+	0x12, 0x45, 0xf1, 0x03, 0x7c, 0xdc, 0x75, 0xbb, 0xd1, 0x68, 0x34, 0x7a, 0xc6, 0xc7, 0xc7, 0xf7,
+	0x0f, 0x0c, 0x0c, 0x30, 0x24, 0x46, 0x40, 0x51, 0x14, 0x24, 0x49, 0x82, 0x24, 0x49, 0x30, 0x0c,
+	0x03, 0xb5, 0x5a, 0x0d, 0x00, 0x60, 0x18, 0x06, 0x18, 0x86, 0x01, 0xc3, 0x30, 0x48, 0x26, 0x93,
+	0x18, 0x1e, 0x1e, 0x46, 0x24, 0x12, 0xa1, 0xae, 0x5c, 0xb9, 0x32, 0x59, 0x28, 0x14, 0x5e, 0x31,
+	0x0c, 0xa3, 0xd6, 0xed, 0x1b, 0xef, 0x14, 0xdc, 0x2b, 0x01, 0x34, 0x8e, 0xe3, 0x7e, 0xe7, 0xe9,
+	0xa7, 0x9f, 0x1e, 0x4a, 0x26, 0x93, 0xe0, 0x79, 0x1e, 0x14, 0xb5, 0xa5, 0xfd, 0x14, 0x8b, 0x45,
+	0xfc, 0xe2, 0x17, 0xbf, 0xc0, 0x5b, 0x6f, 0xbd, 0x85, 0xa5, 0xa5, 0x25, 0x2c, 0x2f, 0x2f, 0xa3,
+	0x52, 0xa9, 0x40, 0x10, 0x04, 0xf8, 0xfd, 0x7e, 0xb8, 0xdd, 0x6e, 0xb0, 0x2c, 0x8b, 0x68, 0x34,
+	0x0a, 0x9e, 0xe7, 0xe1, 0xf7, 0xfb, 0x7d, 0x96, 0x65, 0xfd, 0xae, 0x2c, 0xcb, 0x91, 0x6a, 0xb5,
+	0x7a, 0x16, 0x40, 0xb3, 0xf3, 0x8d, 0x9a, 0xcd, 0xe6, 0x7c, 0xa3, 0xd1, 0x78, 0x66, 0x66, 0x66,
+	0x26, 0x19, 0x8f, 0xc7, 0x29, 0x8e, 0xe3, 0x60, 0x59, 0x16, 0x02, 0x81, 0x00, 0x74, 0x5d, 0x47,
+	0xbb, 0xdd, 0x86, 0x2c, 0xcb, 0xb0, 0x2c, 0x0b, 0xed, 0x76, 0x1b, 0xa2, 0x28, 0xa2, 0x56, 0xab,
+	0xc1, 0xef, 0xf7, 0x23, 0x1e, 0x8f, 0x23, 0x99, 0x4c, 0x02, 0x40, 0x72, 0x61, 0x61, 0x21, 0x52,
+	0xad, 0x56, 0xdf, 0x06, 0x20, 0x75, 0xfb, 0xe6, 0x3b, 0x01, 0xf7, 0x4a, 0x00, 0x4b, 0x14, 0xc5,
+	0xbe, 0x63, 0xc7, 0x8e, 0x3d, 0x39, 0x35, 0x35, 0x05, 0x8f, 0xc7, 0x03, 0x97, 0x6b, 0xeb, 0x25,
+	0x0b, 0x85, 0x02, 0x72, 0xb9, 0x1c, 0x2e, 0x5e, 0xbc, 0x88, 0xf5, 0xf5, 0x75, 0x50, 0x14, 0x05,
+	0x86, 0x61, 0x50, 0x2c, 0x16, 0x51, 0x2a, 0x95, 0x60, 0x18, 0x06, 0x78, 0x9e, 0x47, 0x20, 0x10,
+	0x40, 0x3a, 0x9d, 0x46, 0x3c, 0x1e, 0xc7, 0xe8, 0xe8, 0x28, 0x24, 0x49, 0x3a, 0xd0, 0x68, 0x34,
+	0x7a, 0x2d, 0xcb, 0x7a, 0x47, 0x51, 0x94, 0x26, 0x7e, 0xeb, 0xbe, 0x89, 0xb9, 0x5c, 0xae, 0xaa,
+	0x69, 0xda, 0xd3, 0xa3, 0xa3, 0xa3, 0xbe, 0x70, 0x38, 0x6c, 0x13, 0x49, 0xd3, 0x34, 0x94, 0xcb,
+	0x65, 0x28, 0x8a, 0x82, 0x7c, 0x3e, 0x8f, 0x56, 0xab, 0x05, 0xd3, 0x34, 0xd1, 0x6c, 0x36, 0x51,
+	0x2e, 0x97, 0xc1, 0x30, 0x0c, 0x52, 0xa9, 0x14, 0xbc, 0x5e, 0x2f, 0x0a, 0x85, 0xc2, 0x17, 0xd6,
+	0xd7, 0xd7, 0xfd, 0x00, 0x2e, 0xeb, 0xba, 0xce, 0xfa, 0x7c, 0xbe, 0x88, 0xc7, 0xe3, 0x09, 0x64,
+	0xb3, 0xd9, 0x48, 0x38, 0x1c, 0x0e, 0xab, 0xaa, 0x1a, 0xf0, 0xfb, 0xfd, 0x0c, 0xc7, 0x71, 0xac,
+	0xa2, 0x28, 0x1e, 0x7c, 0xce, 0x33, 0x8e, 0xee, 0xd9, 0x08, 0x34, 0x4d, 0xb3, 0xc4, 0xf3, 0xfc,
+	0x0b, 0xfb, 0xf6, 0xed, 0xe3, 0x82, 0xc1, 0x20, 0x58, 0x96, 0x05, 0x00, 0xd0, 0x34, 0x8d, 0x95,
+	0x95, 0x15, 0xdb, 0x4a, 0xdf, 0xdc, 0xdc, 0x44, 0xa9, 0x54, 0xc2, 0xe6, 0xe6, 0x26, 0x2a, 0x95,
+	0x0a, 0xaa, 0xd5, 0x2a, 0x28, 0x8a, 0x02, 0xc7, 0x71, 0xb6, 0x5d, 0x90, 0x4c, 0x26, 0x11, 0x0a,
+	0x85, 0xe0, 0xf1, 0x78, 0xf6, 0xae, 0xad, 0xad, 0x4d, 0x49, 0x92, 0xb4, 0xa0, 0xeb, 0x7a, 0x0d,
+	0x80, 0x76, 0xf3, 0xed, 0xae, 0x94, 0xcb, 0xe5, 0x2f, 0xf8, 0x7c, 0xbe, 0xa9, 0x44, 0x22, 0x41,
+	0xc7, 0xe3, 0x71, 0xb4, 0xdb, 0x6d, 0xac, 0xaf, 0xaf, 0x83, 0x61, 0x18, 0x6c, 0x6e, 0x6e, 0xda,
+	0x72, 0xb1, 0xd7, 0xeb, 0x85, 0xcb, 0xe5, 0x82, 0x28, 0x8a, 0x10, 0x45, 0x11, 0x0c, 0xc3, 0x20,
+	0x97, 0xcb, 0x41, 0x92, 0x24, 0x44, 0xa3, 0xd1, 0x2f, 0x86, 0x42, 0xa1, 0x27, 0xe3, 0xf1, 0xf8,
+	0x57, 0x63, 0xb1, 0xd8, 0xbf, 0x4e, 0xa5, 0x52, 0xff, 0x2c, 0x9d, 0x4e, 0xff, 0xab, 0x9e, 0x9e,
+	0x9e, 0xef, 0x86, 0x42, 0xa1, 0x17, 0x42, 0xa1, 0xd0, 0x9e, 0x68, 0x34, 0xba, 0xdf, 0xe7, 0xf3,
+	0x1d, 0xe2, 0x79, 0x3e, 0x12, 0x08, 0x04, 0x78, 0x00, 0x81, 0x76, 0xbb, 0x4d, 0xc8, 0x68, 0xe2,
+	0x73, 0xa2, 0x2b, 0x6c, 0x87, 0x17, 0x50, 0x6e, 0x34, 0x1a, 0xd1, 0xd9, 0xd9, 0xd9, 0x23, 0xe9,
+	0x74, 0x9a, 0x22, 0xc7, 0x80, 0x61, 0x18, 0x60, 0x59, 0x16, 0x96, 0x65, 0xa1, 0x56, 0xab, 0xa1,
+	0x5e, 0xaf, 0x43, 0x96, 0x65, 0x50, 0x14, 0x05, 0x59, 0x96, 0xed, 0xe3, 0x80, 0x61, 0x18, 0x00,
+	0x80, 0xcf, 0xe7, 0x03, 0xc7, 0x71, 0x18, 0x18, 0x18, 0x40, 0x26, 0x93, 0x81, 0xcb, 0xe5, 0x1a,
+	0x15, 0x04, 0xe1, 0x19, 0x49, 0x92, 0x4a, 0x8a, 0xa2, 0x7c, 0x00, 0x40, 0x01, 0x80, 0x66, 0xb3,
+	0xb9, 0xa8, 0xaa, 0xea, 0xf3, 0x5e, 0xaf, 0x37, 0x18, 0x0a, 0x85, 0x28, 0xc3, 0x30, 0xa0, 0x28,
+	0x0a, 0xdc, 0x6e, 0xb7, 0xfd, 0x1e, 0xc4, 0x10, 0xf5, 0x7a, 0xbd, 0x98, 0x9a, 0x9a, 0x42, 0x30,
+	0x18, 0x44, 0x3a, 0x9d, 0x46, 0x30, 0x18, 0x44, 0x4f, 0x4f, 0x0f, 0x1e, 0x7b, 0xec, 0x31, 0x3c,
+	0xfd, 0xf4, 0xd3, 0xa9, 0xd9, 0xd9, 0xd9, 0xec, 0x97, 0xbf, 0xfc, 0xe5, 0xf8, 0xc9, 0x93, 0x27,
+	0xd3, 0xcf, 0x3e, 0xfb, 0x6c, 0xf4, 0xa9, 0xa7, 0x9e, 0x0a, 0x3f, 0xf9, 0xe4, 0x93, 0x89, 0x7d,
+	0xfb, 0xf6, 0xed, 0x7f, 0xfc, 0xf1, 0xc7, 0x8f, 0x0e, 0x0c, 0x0c, 0x7c, 0x29, 0x95, 0x4a, 0x7d,
+	0x35, 0x1c, 0x0e, 0xff, 0x7e, 0x34, 0x1a, 0xfd, 0x3d, 0x9f, 0xcf, 0x37, 0xc1, 0x71, 0x1c, 0xc7,
+	0xb2, 0xac, 0x25, 0x49, 0x12, 0x21, 0xc1, 0x03, 0xad, 0x32, 0x6e, 0x8b, 0x10, 0xd4, 0x68, 0x34,
+	0xf2, 0x3c, 0xcf, 0x7f, 0x63, 0x7a, 0x7a, 0xda, 0xef, 0xf3, 0xf9, 0x6c, 0x3f, 0x9d, 0xa2, 0x28,
+	0xa8, 0xaa, 0x0a, 0xcb, 0xb2, 0xd0, 0x6a, 0xb5, 0x20, 0x8a, 0xa2, 0x7d, 0x3e, 0x7b, 0xbd, 0x5e,
+	0x3b, 0xb4, 0x5b, 0x28, 0x14, 0xe0, 0xf5, 0x7a, 0xe1, 0xf5, 0x7a, 0xc1, 0x71, 0x1c, 0xd2, 0xe9,
+	0x34, 0xc6, 0xc6, 0xc6, 0xd0, 0xdf, 0xdf, 0x1f, 0xde, 0xd8, 0xd8, 0xf8, 0x27, 0xad, 0x56, 0x4b,
+	0x6e, 0x36, 0x9b, 0x8b, 0xd8, 0xf2, 0xe3, 0x37, 0x69, 0x9a, 0x76, 0x01, 0x38, 0xdc, 0x6e, 0xb7,
+	0x59, 0x8e, 0xe3, 0xd0, 0x6a, 0xb5, 0x50, 0x28, 0x14, 0xc0, 0xf3, 0x3c, 0x62, 0xb1, 0x18, 0x26,
+	0x26, 0x26, 0x70, 0xe0, 0xc0, 0x01, 0x1c, 0x3d, 0x7a, 0x14, 0xc7, 0x8f, 0x1f, 0xc7, 0xe1, 0xc3,
+	0x87, 0x31, 0x3d, 0x3d, 0x8d, 0xa9, 0xa9, 0x29, 0x0c, 0x0f, 0x0f, 0x63, 0x64, 0x64, 0x04, 0x03,
+	0x03, 0x03, 0x18, 0x1b, 0x1b, 0xc3, 0xf0, 0xf0, 0x30, 0xb2, 0xd9, 0x2c, 0x52, 0xa9, 0x94, 0xad,
+	0x5b, 0xa4, 0xd3, 0x69, 0xa4, 0xd3, 0x69, 0xa4, 0x52, 0x29, 0xec, 0xd9, 0xb3, 0x87, 0x7e, 0xf4,
+	0xd1, 0x47, 0x99, 0x47, 0x1e, 0x79, 0x24, 0x3c, 0x3b, 0x3b, 0x3b, 0x9b, 0x48, 0x24, 0xbe, 0xe2,
+	0x76, 0xbb, 0xbf, 0xc2, 0x71, 0xdc, 0xcc, 0xcd, 0x1d, 0xa6, 0x8e, 0xad, 0x1d, 0xea, 0x8e, 0xe2,
+	0x1c, 0x4e, 0xc3, 0x76, 0x49, 0xc1, 0xe5, 0x6b, 0xd7, 0xae, 0x59, 0xe1, 0x70, 0xf8, 0x89, 0xfe,
+	0xfe, 0x7e, 0x26, 0x1c, 0x0e, 0xc3, 0xed, 0x76, 0xc3, 0xe7, 0xf3, 0x6d, 0xbd, 0xc9, 0x4d, 0xf1,
+	0x46, 0x55, 0x55, 0xdb, 0x45, 0x33, 0x0c, 0x03, 0xaa, 0xaa, 0xa2, 0x5e, 0xaf, 0xa3, 0x5e, 0xaf,
+	0x43, 0x51, 0x14, 0x70, 0x1c, 0x87, 0x40, 0x20, 0x00, 0x8f, 0xc7, 0x83, 0x60, 0x30, 0x88, 0x50,
+	0x28, 0x84, 0x54, 0x2a, 0x05, 0x4d, 0xd3, 0xbe, 0x54, 0x2c, 0x16, 0x87, 0x9a, 0xcd, 0xe6, 0x05,
+	0x00, 0x75, 0x41, 0x10, 0xde, 0x17, 0x04, 0xe1, 0xb9, 0x60, 0x30, 0xd8, 0xe3, 0xf1, 0x78, 0x28,
+	0x00, 0xf0, 0xfb, 0xfd, 0x18, 0x18, 0x18, 0xc0, 0xc1, 0x83, 0x07, 0x71, 0xf0, 0xe0, 0x41, 0xec,
+	0xdd, 0xbb, 0x17, 0xb3, 0xb3, 0xb3, 0xe8, 0xeb, 0xeb, 0x03, 0xf1, 0x50, 0x38, 0x8e, 0x03, 0xcf,
+	0xf3, 0xf0, 0x7a, 0xbd, 0x70, 0xbb, 0xdd, 0xf0, 0x7a, 0xbd, 0xf0, 0x78, 0x3c, 0x60, 0x18, 0x06,
+	0x6e, 0xb7, 0x1b, 0x34, 0x4d, 0xdb, 0x44, 0xf4, 0x7a, 0xbd, 0x88, 0xc7, 0xe3, 0x20, 0xb6, 0xc6,
+	0xe0, 0xe0, 0x20, 0x26, 0x27, 0x27, 0x31, 0x3e, 0x3e, 0x8e, 0xd1, 0xd1, 0xd1, 0xc0, 0xc4, 0xc4,
+	0xc4, 0xb4, 0xd7, 0xeb, 0xfd, 0x0a, 0x4d, 0xd3, 0xb3, 0x2e, 0x97, 0x8b, 0x6e, 0xb7, 0xdb, 0x65,
+	0x5d, 0xd7, 0xe5, 0x07, 0x8d, 0x08, 0xdb, 0x16, 0x0c, 0xd2, 0x34, 0xed, 0x9d, 0xf5, 0xf5, 0xf5,
+	0x87, 0xe2, 0xf1, 0xf8, 0x58, 0x22, 0x91, 0xa0, 0x88, 0x6a, 0x17, 0x89, 0x44, 0xe0, 0x76, 0xbb,
+	0x11, 0x0a, 0x85, 0xd0, 0x6a, 0xb5, 0xa0, 0xaa, 0x2a, 0x3c, 0x1e, 0x0f, 0x3c, 0x1e, 0x0f, 0xea,
+	0xf5, 0x3a, 0x38, 0x8e, 0x43, 0xb1, 0x58, 0x84, 0x69, 0x9a, 0x68, 0x34, 0x1a, 0xd0, 0x34, 0x0d,
+	0x8a, 0xa2, 0xc0, 0xb2, 0x2c, 0x7b, 0xf1, 0x34, 0x4d, 0x83, 0xdb, 0xed, 0x9e, 0x6a, 0x36, 0x9b,
+	0xfb, 0x15, 0x45, 0xb9, 0xec, 0x72, 0xb9, 0x46, 0x07, 0x07, 0x07, 0x9f, 0x1f, 0x1f, 0x1f, 0x4f,
+	0x1c, 0x3a, 0x74, 0x88, 0xda, 0xb7, 0x6f, 0x9f, 0x2d, 0x39, 0x47, 0x22, 0x11, 0x70, 0x1c, 0x07,
+	0xaf, 0xd7, 0x0b, 0x9a, 0xa6, 0x6f, 0x79, 0xbd, 0xc4, 0x5b, 0xe9, 0x04, 0xf9, 0x7d, 0x8f, 0xc7,
+	0x03, 0xb7, 0xdb, 0x6d, 0x5f, 0x27, 0x21, 0x04, 0x45, 0x51, 0x60, 0x59, 0x16, 0x81, 0x40, 0x00,
+	0x83, 0x83, 0x83, 0xd8, 0xbb, 0x77, 0x2f, 0x35, 0x38, 0x38, 0x38, 0x14, 0x0c, 0x06, 0x9f, 0x57,
+	0x14, 0xe5, 0x8b, 0x6e, 0xb7, 0xbb, 0x24, 0x08, 0x42, 0x19, 0x0f, 0x50, 0x04, 0x72, 0x3b, 0xa3,
+	0x81, 0x56, 0xad, 0x56, 0x7b, 0x17, 0xc0, 0x89, 0x54, 0x2a, 0x15, 0x8d, 0xc5, 0x62, 0x08, 0x04,
+	0x02, 0xf6, 0x53, 0x45, 0xb6, 0x57, 0x62, 0xf0, 0xb5, 0x5a, 0x2d, 0x68, 0x9a, 0x06, 0x8a, 0xa2,
+	0x60, 0x9a, 0x26, 0x64, 0x59, 0x46, 0x3e, 0x9f, 0x87, 0x69, 0x9a, 0xa8, 0xd7, 0xeb, 0x20, 0x7f,
+	0x1f, 0x89, 0x44, 0xd0, 0xd3, 0xd3, 0x03, 0x9f, 0xcf, 0x07, 0xcb, 0xb2, 0xfa, 0x25, 0x49, 0xfa,
+	0x5a, 0x26, 0x93, 0xf9, 0xd6, 0x0b, 0x2f, 0xbc, 0x90, 0xf9, 0xfa, 0xd7, 0xbf, 0x4e, 0x8d, 0x8f,
+	0x8f, 0xdb, 0xe7, 0xfb, 0xed, 0x16, 0xfc, 0x4e, 0x40, 0x54, 0x4b, 0xf2, 0x2f, 0x4d, 0xd3, 0x70,
+	0xb9, 0x5c, 0xb0, 0xac, 0x2d, 0x7b, 0xaf, 0x33, 0x39, 0x85, 0xa4, 0xab, 0xf5, 0xf4, 0xf4, 0x60,
+	0x68, 0x68, 0x08, 0xe9, 0x74, 0xba, 0x9f, 0xa2, 0xa8, 0xdf, 0x55, 0x14, 0xc5, 0x67, 0x18, 0xc6,
+	0x92, 0xaa, 0xaa, 0x22, 0x1e, 0x00, 0xc1, 0x69, 0xbb, 0xf3, 0x01, 0x6a, 0xd7, 0xaf, 0x5f, 0x2f,
+	0xb1, 0x2c, 0x7b, 0x3c, 0x91, 0x48, 0xf8, 0x22, 0x91, 0x88, 0xbd, 0xcd, 0xfa, 0x7c, 0x3e, 0x44,
+	0x22, 0x11, 0xc4, 0xe3, 0x71, 0x70, 0x1c, 0x87, 0x5a, 0xad, 0x06, 0x96, 0x65, 0x21, 0x08, 0x02,
+	0x34, 0x4d, 0x43, 0xab, 0xd5, 0x42, 0xbd, 0x5e, 0x47, 0xb1, 0x58, 0xb4, 0x8f, 0x0a, 0x51, 0x14,
+	0x11, 0x08, 0x04, 0x90, 0x48, 0x24, 0x10, 0x89, 0x44, 0xa0, 0xeb, 0x3a, 0x02, 0x81, 0x80, 0xf7,
+	0xb9, 0xe7, 0x9e, 0x63, 0x4e, 0x9c, 0x38, 0x81, 0xfe, 0xfe, 0x7e, 0x84, 0x42, 0x21, 0x7b, 0xd1,
+	0xee, 0x07, 0x88, 0xfb, 0xca, 0x30, 0xcc, 0x87, 0x48, 0x41, 0x8e, 0x38, 0x96, 0x65, 0x11, 0x89,
+	0x44, 0x30, 0x34, 0x34, 0x84, 0xd1, 0xd1, 0x51, 0x4f, 0x3c, 0x1e, 0x3f, 0x2c, 0xcb, 0xf2, 0x2c,
+	0xcb, 0xb2, 0xab, 0x95, 0x4a, 0xa5, 0x0a, 0x87, 0x27, 0xa9, 0xde, 0x8f, 0x8c, 0xa0, 0xb9, 0xab,
+	0x57, 0xaf, 0x0a, 0x2c, 0xcb, 0x1e, 0xee, 0xeb, 0xeb, 0xf3, 0x79, 0x3c, 0x1e, 0xf8, 0xfd, 0x7e,
+	0x00, 0x5b, 0x5b, 0x2b, 0xcf, 0xf3, 0x08, 0x85, 0x42, 0x08, 0x87, 0xc3, 0xf0, 0xf9, 0x7c, 0x28,
+	0x16, 0x8b, 0xa0, 0x69, 0x1a, 0x92, 0x24, 0xc1, 0xe5, 0x72, 0xa1, 0xd5, 0x6a, 0x41, 0x92, 0x24,
+	0x54, 0x2a, 0x15, 0x5b, 0xcc, 0x61, 0x18, 0x06, 0x3c, 0xcf, 0xa3, 0xdd, 0x6e, 0x63, 0x7a, 0x7a,
+	0x1a, 0x93, 0x93, 0x93, 0x18, 0x19, 0x19, 0xb1, 0x13, 0x46, 0x77, 0x0a, 0x24, 0xb6, 0x41, 0xbe,
+	0xc8, 0x67, 0xf2, 0x7a, 0xbd, 0xf6, 0x35, 0x0e, 0x0d, 0x0d, 0x61, 0x64, 0x64, 0x64, 0xb0, 0xd9,
+	0x6c, 0x9e, 0x90, 0x24, 0xc9, 0xa8, 0x56, 0xab, 0xab, 0xd8, 0x12, 0xb5, 0x1c, 0xe9, 0x36, 0xde,
+	0x97, 0x94, 0x30, 0xd3, 0x34, 0xcf, 0xce, 0xcd, 0xcd, 0x35, 0x68, 0x9a, 0x3e, 0x1a, 0x8f, 0xc7,
+	0xd9, 0x58, 0x2c, 0x46, 0x91, 0x33, 0xd4, 0xe5, 0x72, 0xd9, 0xe7, 0x28, 0x31, 0xc4, 0x24, 0x49,
+	0x42, 0xa3, 0xd1, 0x00, 0xb0, 0xb5, 0xcd, 0x92, 0x98, 0x3f, 0xc9, 0xfe, 0x6d, 0x34, 0x1a, 0x60,
+	0x59, 0x16, 0x3e, 0x9f, 0x0f, 0x13, 0x13, 0x13, 0x48, 0xa5, 0x52, 0x3b, 0xbe, 0xf8, 0x9d, 0xe8,
+	0xdc, 0x09, 0x00, 0x40, 0xd7, 0x75, 0xbb, 0x72, 0xc9, 0xe3, 0xf1, 0x20, 0x12, 0x89, 0x60, 0x76,
+	0x76, 0x96, 0xb3, 0x2c, 0xeb, 0xb8, 0x61, 0x18, 0x03, 0xba, 0xae, 0xcf, 0x35, 0x9b, 0xcd, 0x2a,
+	0x1c, 0x48, 0x82, 0xfb, 0x96, 0x13, 0x68, 0x9a, 0xe6, 0xd9, 0xa5, 0xa5, 0x25, 0x31, 0x1c, 0x0e,
+	0x1f, 0x4c, 0xa5, 0x52, 0x81, 0x40, 0x20, 0x60, 0x7b, 0x05, 0xe4, 0xe6, 0x79, 0xbd, 0x5e, 0x44,
+	0x22, 0x11, 0x68, 0x9a, 0x66, 0x0b, 0x43, 0x00, 0xec, 0x2a, 0x20, 0xa2, 0x11, 0xc4, 0xe3, 0x71,
+	0x4c, 0x4f, 0x4f, 0x63, 0x68, 0x68, 0x08, 0x89, 0x44, 0x02, 0x6e, 0xb7, 0xbb, 0xdb, 0xf7, 0x0d,
+	0xc0, 0x6f, 0x6d, 0x06, 0xcb, 0xb2, 0x40, 0xd3, 0xb4, 0xed, 0x4d, 0xb4, 0xdb, 0x6d, 0xf8, 0x7c,
+	0x3e, 0x0c, 0x0d, 0x0d, 0x21, 0x12, 0x89, 0x4c, 0x95, 0x4a, 0xa5, 0x3d, 0x34, 0x4d, 0x9f, 0xad,
+	0x6d, 0x05, 0x2b, 0x1c, 0x65, 0x17, 0xdc, 0xd7, 0xac, 0x60, 0x55, 0x55, 0xdf, 0x5d, 0x5e, 0x5e,
+	0x6e, 0x73, 0x1c, 0x77, 0xd0, 0xeb, 0xf5, 0xfa, 0xa3, 0xd1, 0xa8, 0x9d, 0xe6, 0x4d, 0x72, 0xfc,
+	0x48, 0x98, 0x58, 0x10, 0x04, 0x78, 0x3c, 0x1e, 0x18, 0x86, 0x01, 0x59, 0x96, 0xe1, 0x72, 0xb9,
+	0x10, 0x08, 0x04, 0x30, 0x3c, 0x3c, 0x8c, 0xa7, 0x9f, 0x7e, 0x1a, 0x7b, 0xf7, 0xee, 0x05, 0xc9,
+	0x0a, 0x72, 0x1a, 0xc8, 0x35, 0xb5, 0xdb, 0x6d, 0x9b, 0xdc, 0x2e, 0x97, 0x0b, 0xc1, 0x60, 0x10,
+	0x3c, 0xcf, 0x23, 0x12, 0x89, 0x0c, 0x16, 0x0a, 0x85, 0xfd, 0xcd, 0x66, 0x73, 0x5e, 0x92, 0xa4,
+	0x02, 0x1c, 0x44, 0x82, 0xfb, 0x9e, 0x16, 0x2e, 0x49, 0xd2, 0x3b, 0x2b, 0x2b, 0x2b, 0xa6, 0xcb,
+	0xe5, 0x9a, 0x31, 0x0c, 0x83, 0xe3, 0x79, 0x9e, 0x26, 0x21, 0x5b, 0x62, 0x48, 0x85, 0x42, 0x21,
+	0x84, 0x42, 0x21, 0x98, 0xa6, 0x09, 0x45, 0x51, 0xc0, 0xf3, 0x3c, 0x44, 0x51, 0x44, 0x38, 0x1c,
+	0xc6, 0xe1, 0xc3, 0x87, 0x71, 0xf8, 0xf0, 0x61, 0xc4, 0xe3, 0x71, 0x7b, 0xcb, 0x75, 0x1a, 0x88,
+	0x27, 0x43, 0x8c, 0x51, 0xb2, 0xbb, 0x91, 0xa2, 0xd6, 0x54, 0x2a, 0x85, 0x60, 0x30, 0xd8, 0xb7,
+	0xb1, 0xb1, 0xb1, 0xbf, 0xd5, 0x6a, 0xbd, 0xdd, 0x6a, 0xb5, 0x2a, 0x70, 0x08, 0x09, 0x76, 0xe4,
+	0x8e, 0x8a, 0xa2, 0xf8, 0xf6, 0xc5, 0x8b, 0x17, 0xd7, 0x04, 0x41, 0x18, 0xad, 0xd5, 0x6a, 0xbc,
+	0xd7, 0xeb, 0xf5, 0xf8, 0x7c, 0x3e, 0x50, 0x14, 0x65, 0x47, 0x05, 0x03, 0x81, 0x80, 0x9d, 0x33,
+	0xe0, 0xf3, 0xf9, 0xe0, 0xf1, 0x78, 0x30, 0x35, 0x35, 0x85, 0x67, 0x9f, 0x7d, 0x16, 0xa9, 0x54,
+	0xca, 0x8e, 0x31, 0x38, 0x15, 0xc4, 0x5d, 0x24, 0x06, 0xa2, 0x65, 0x59, 0x30, 0x0c, 0x03, 0x2e,
+	0x97, 0x0b, 0x86, 0x61, 0x60, 0x70, 0x70, 0x10, 0xa9, 0x54, 0xaa, 0xe7, 0xc6, 0x8d, 0x1b, 0x7b,
+	0x15, 0x45, 0xb9, 0xec, 0x94, 0x9d, 0x60, 0xc7, 0x1e, 0x29, 0x5d, 0xd7, 0xe7, 0x17, 0x17, 0x17,
+	0xff, 0xe1, 0xfa, 0xf5, 0xeb, 0x9c, 0x24, 0x49, 0x99, 0x76, 0xbb, 0xed, 0x11, 0x45, 0x91, 0x21,
+	0x86, 0x13, 0xc7, 0x71, 0xb6, 0x4e, 0x10, 0x0c, 0x06, 0xd1, 0xd7, 0xd7, 0x87, 0x23, 0x47, 0x8e,
+	0x20, 0x99, 0x4c, 0xc2, 0xef, 0xf7, 0x3b, 0xf6, 0xe9, 0xef, 0x44, 0xa7, 0x86, 0xa0, 0xeb, 0xba,
+	0x1d, 0xa3, 0x30, 0x4d, 0x13, 0x1e, 0x8f, 0x07, 0xe9, 0x74, 0x1a, 0xba, 0xae, 0xf7, 0x97, 0x4a,
+	0xa5, 0x47, 0x04, 0x41, 0x38, 0xa3, 0xaa, 0x6a, 0x11, 0x5d, 0x26, 0xc1, 0x4e, 0xdf, 0xd5, 0x7a,
+	0xa3, 0xd1, 0xf8, 0xf9, 0xb9, 0x73, 0xe7, 0xde, 0xb9, 0x78, 0xf1, 0xa2, 0x77, 0x75, 0x75, 0x35,
+	0x41, 0xd3, 0x34, 0x2b, 0xcb, 0xb2, 0x8b, 0xf4, 0x01, 0x20, 0xf1, 0x80, 0x50, 0x28, 0x84, 0xbe,
+	0xbe, 0x3e, 0x70, 0x1c, 0xf7, 0xb1, 0xa7, 0xdf, 0x34, 0xcd, 0xae, 0x79, 0x00, 0xb7, 0x03, 0x39,
+	0x0a, 0xc8, 0x2e, 0x40, 0x76, 0xb4, 0x60, 0x30, 0x68, 0xdb, 0x3b, 0x83, 0x83, 0x83, 0xf0, 0xfb,
+	0xfd, 0xc9, 0x5c, 0x2e, 0x97, 0xd9, 0xd8, 0xd8, 0x78, 0x13, 0x80, 0x70, 0xcf, 0x6f, 0x7c, 0x0f,
+	0xe8, 0xd6, 0x63, 0x95, 0xab, 0xd5, 0x6a, 0x7f, 0x7b, 0xf5, 0xea, 0xd5, 0x0b, 0x82, 0x20, 0xf4,
+	0x96, 0x4a, 0xa5, 0x84, 0xaa, 0xaa, 0x5e, 0x41, 0x10, 0x50, 0xa9, 0x54, 0x6c, 0xe3, 0xc9, 0xeb,
+	0xf5, 0x22, 0x10, 0x08, 0x7c, 0xe2, 0x62, 0x3b, 0x91, 0x00, 0x00, 0x6c, 0xaf, 0x80, 0x10, 0x81,
+	0x08, 0x48, 0x24, 0x4b, 0x89, 0xa2, 0x28, 0x68, 0x9a, 0x06, 0x4d, 0xd3, 0xc6, 0x05, 0x41, 0xa8,
+	0x97, 0x4a, 0xa5, 0x8b, 0xe8, 0xa2, 0x74, 0xdc, 0xed, 0x7d, 0x75, 0x75, 0x75, 0x75, 0xf5, 0xe5,
+	0xa5, 0xa5, 0x25, 0xb7, 0x20, 0x08, 0x53, 0x1e, 0x8f, 0x87, 0x53, 0x14, 0xc5, 0x2e, 0xfb, 0xe6,
+	0x79, 0xfe, 0x13, 0xb7, 0x7e, 0xa7, 0x2e, 0x7e, 0x27, 0x4c, 0xd3, 0x84, 0xcb, 0xe5, 0x82, 0xc7,
+	0xe3, 0x81, 0xa2, 0x28, 0xb6, 0x3d, 0xa0, 0xeb, 0x3a, 0x5a, 0xad, 0x16, 0x62, 0xb1, 0x18, 0x56,
+	0x57, 0x57, 0x1f, 0x15, 0x04, 0x61, 0x4e, 0x92, 0xa4, 0xeb, 0xe8, 0x52, 0x58, 0xb9, 0xdb, 0x04,
+	0x00, 0x00, 0x45, 0x51, 0x94, 0xd7, 0xd7, 0xd6, 0xd6, 0xc2, 0x9a, 0xa6, 0x1d, 0x9a, 0x9e, 0x9e,
+	0x66, 0x06, 0x06, 0x06, 0xd0, 0xd3, 0xd3, 0xd3, 0x55, 0xb1, 0xe7, 0x76, 0x20, 0xc6, 0xde, 0xed,
+	0x40, 0x72, 0x22, 0x48, 0x22, 0x2c, 0x59, 0x7c, 0x8a, 0xa2, 0xc0, 0xf3, 0x3c, 0x00, 0x40, 0x96,
+	0x65, 0x66, 0x6d, 0x6d, 0x6d, 0x9f, 0x28, 0x8a, 0xbf, 0xd4, 0x34, 0xad, 0x84, 0x2e, 0x08, 0x45,
+	0x8e, 0x71, 0xaa, 0x5b, 0xad, 0xd6, 0x5b, 0x86, 0x61, 0xe8, 0x44, 0x49, 0x23, 0xf9, 0x04, 0x4e,
+	0xc4, 0x47, 0xaf, 0x8b, 0x04, 0x8b, 0x3a, 0x7f, 0x4e, 0x9e, 0x7e, 0x8a, 0xa2, 0xa0, 0xeb, 0x5b,
+	0x0f, 0x37, 0x91, 0x8d, 0x0d, 0xc3, 0x80, 0xdf, 0xef, 0xc7, 0xe4, 0xe4, 0x24, 0x8e, 0x1c, 0x39,
+	0x32, 0x1e, 0x8d, 0x46, 0xff, 0x1d, 0x80, 0x68, 0x37, 0x3e, 0x8b, 0x63, 0x08, 0x00, 0x20, 0x3e,
+	0x3e, 0x3e, 0x4e, 0x0f, 0x0c, 0x0c, 0x80, 0xb8, 0x88, 0x0f, 0x0a, 0x6e, 0x75, 0xad, 0x84, 0x08,
+	0x44, 0x28, 0xd2, 0x34, 0xcd, 0x2e, 0x67, 0x0f, 0x87, 0xc3, 0x48, 0x26, 0x93, 0x18, 0x1f, 0x1f,
+	0x47, 0x5f, 0x5f, 0xdf, 0x3f, 0xe7, 0x38, 0xee, 0x51, 0x6c, 0x35, 0xc6, 0xdc, 0x51, 0x38, 0x85,
+	0x00, 0x74, 0x38, 0x1c, 0x7e, 0xaa, 0xb7, 0xb7, 0x97, 0xc9, 0x66, 0xb3, 0xb6, 0x64, 0xfc, 0x20,
+	0x83, 0x18, 0x82, 0xc0, 0x6f, 0x63, 0x07, 0x0c, 0xc3, 0xd8, 0xc6, 0x21, 0x49, 0x4f, 0xeb, 0xef,
+	0xef, 0xc7, 0xe4, 0xe4, 0xa4, 0xd7, 0xe5, 0x72, 0x7d, 0x1b, 0x40, 0x78, 0xa7, 0xaf, 0xd3, 0x29,
+	0x04, 0x48, 0x25, 0x12, 0x89, 0x47, 0xc6, 0xc7, 0xc7, 0x19, 0x22, 0x08, 0x39, 0x51, 0xf2, 0xfd,
+	0x24, 0x7c, 0x74, 0xfb, 0x27, 0xe8, 0x8c, 0x13, 0x18, 0x86, 0x01, 0x9a, 0xa6, 0xed, 0xec, 0x23,
+	0x97, 0xcb, 0x65, 0x17, 0xae, 0xa4, 0xd3, 0x69, 0x8c, 0x8e, 0x8e, 0x22, 0x1a, 0x8d, 0x3e, 0xe6,
+	0x76, 0xbb, 0x07, 0xb1, 0xc3, 0x76, 0x99, 0x53, 0xee, 0xf2, 0xc8, 0xe8, 0xe8, 0x68, 0x4f, 0x2a,
+	0x95, 0xa2, 0x48, 0xac, 0xe0, 0x41, 0xc1, 0x9d, 0x18, 0x83, 0x96, 0x65, 0xd9, 0x44, 0x20, 0xda,
+	0x00, 0xb1, 0x71, 0x28, 0x8a, 0x42, 0x3c, 0x1e, 0xc7, 0xde, 0xbd, 0x7b, 0xe3, 0xd9, 0x6c, 0xf6,
+	0x49, 0x00, 0x3b, 0xba, 0xfd, 0x39, 0x85, 0x00, 0xb3, 0x3d, 0x3d, 0x3d, 0x0c, 0xc9, 0x28, 0xbe,
+	0xd5, 0x53, 0xf5, 0x20, 0x82, 0xa4, 0x91, 0x75, 0x7e, 0x2e, 0x86, 0x61, 0x3e, 0x54, 0x1d, 0xd5,
+	0xd3, 0xd3, 0x83, 0x54, 0x2a, 0x05, 0x8f, 0xc7, 0x73, 0x14, 0x5b, 0x8d, 0xb1, 0x77, 0x0c, 0x8e,
+	0x20, 0x80, 0xcf, 0xe7, 0x1b, 0x0d, 0x85, 0x42, 0x74, 0x34, 0x1a, 0x45, 0x30, 0x18, 0xb4, 0xc3,
+	0xc0, 0x9f, 0x27, 0x74, 0x1e, 0x69, 0xba, 0xae, 0x43, 0x55, 0x55, 0x98, 0xa6, 0x69, 0x8b, 0x43,
+	0x89, 0x44, 0x02, 0xb1, 0x58, 0x6c, 0x7f, 0x34, 0x1a, 0x8d, 0x63, 0x07, 0xd7, 0xc5, 0x11, 0x04,
+	0x60, 0x59, 0x96, 0x89, 0x44, 0x22, 0x60, 0x59, 0x16, 0x86, 0x61, 0x3c, 0x50, 0x47, 0xc0, 0x9d,
+	0x42, 0xd3, 0xb6, 0x6a, 0x5b, 0x3a, 0x6d, 0x01, 0x9a, 0xa6, 0xc1, 0x71, 0x1c, 0x92, 0xc9, 0x24,
+	0x32, 0x99, 0x0c, 0x58, 0x96, 0x8d, 0x01, 0xc8, 0x62, 0x07, 0xed, 0x00, 0x47, 0x10, 0x80, 0xe3,
+	0x38, 0xa4, 0x52, 0x29, 0xe8, 0xba, 0x0e, 0xc3, 0x78, 0xa0, 0xb2, 0xaa, 0xef, 0x18, 0x24, 0x04,
+	0x4e, 0xbc, 0x00, 0x52, 0x32, 0x6f, 0x9a, 0xa6, 0x5d, 0x14, 0x93, 0x4a, 0xa5, 0x58, 0x9e, 0xe7,
+	0x67, 0x00, 0xec, 0x58, 0xe8, 0xd3, 0x11, 0x04, 0x20, 0x51, 0x34, 0x55, 0x55, 0x3f, 0xb7, 0x04,
+	0x20, 0x9e, 0x80, 0x65, 0x59, 0x50, 0x14, 0x05, 0xa6, 0x69, 0xc2, 0x34, 0x4d, 0x68, 0x9a, 0x86,
+	0x44, 0x22, 0x81, 0x89, 0x89, 0x09, 0x64, 0x32, 0x19, 0x04, 0x83, 0xc1, 0x4c, 0x24, 0x12, 0xf9,
+	0xc7, 0xb5, 0x03, 0x48, 0x92, 0x44, 0xad, 0xaf, 0xaf, 0xdb, 0x65, 0xde, 0x9f, 0x27, 0x23, 0x90,
+	0x80, 0x2c, 0x38, 0xd1, 0x06, 0x64, 0x59, 0x46, 0xbb, 0xdd, 0xb6, 0x83, 0x5d, 0x24, 0x02, 0xca,
+	0x71, 0xdc, 0x61, 0x97, 0xcb, 0xb5, 0x63, 0x86, 0xa0, 0x23, 0x08, 0x40, 0x51, 0x94, 0xbe, 0xbe,
+	0xbe, 0x0e, 0x41, 0x10, 0xec, 0x04, 0xcb, 0x7b, 0x05, 0x71, 0xbd, 0xba, 0x81, 0x4f, 0x7a, 0x5f,
+	0x97, 0xcb, 0xf5, 0xa1, 0x06, 0x16, 0xa6, 0x69, 0xa2, 0xd5, 0x6a, 0x41, 0xd7, 0x75, 0x9b, 0xf8,
+	0x37, 0x05, 0xa3, 0x94, 0x65, 0x59, 0x61, 0xec, 0x50, 0x55, 0xb2, 0x23, 0xcc, 0xed, 0x6a, 0xb5,
+	0x7a, 0xad, 0x54, 0x2a, 0x99, 0x8a, 0xa2, 0xd8, 0xc6, 0xd2, 0x76, 0xe0, 0x4e, 0x82, 0x36, 0xf7,
+	0x03, 0xb7, 0x8a, 0x15, 0x90, 0x23, 0xa0, 0xdd, 0x6e, 0xe3, 0xec, 0xd9, 0xb3, 0xc8, 0xe7, 0xf3,
+	0x98, 0x98, 0x98, 0xc0, 0xc8, 0xc8, 0x88, 0x5d, 0x5f, 0x10, 0x08, 0x04, 0x06, 0x74, 0x5d, 0x9f,
+	0x06, 0xb0, 0x8c, 0x1d, 0x68, 0x67, 0xe3, 0x08, 0x02, 0x00, 0xf8, 0xb5, 0x20, 0x08, 0xed, 0x7a,
+	0xbd, 0xee, 0xed, 0xac, 0xc4, 0xb9, 0x17, 0x74, 0xe6, 0xee, 0x3b, 0x01, 0x24, 0x59, 0xc4, 0xb2,
+	0x2c, 0x9c, 0x3f, 0x7f, 0x1e, 0x7f, 0xf5, 0x57, 0x7f, 0x85, 0x5c, 0x2e, 0x87, 0x81, 0x81, 0x01,
+	0xfc, 0xe1, 0x1f, 0xfe, 0x21, 0x92, 0xc9, 0xa4, 0xdd, 0x5f, 0xc9, 0xe3, 0xf1, 0xec, 0xd8, 0xce,
+	0xec, 0x14, 0x02, 0x7c, 0xb0, 0xba, 0xba, 0x7a, 0x4d, 0xd3, 0xb4, 0xfd, 0xb2, 0x2c, 0xd3, 0x91,
+	0x48, 0xa4, 0xdb, 0xd7, 0xf3, 0x31, 0x10, 0x6d, 0xff, 0x6e, 0xaa, 0x90, 0x3a, 0xc9, 0x68, 0x9a,
+	0x26, 0x2e, 0x5c, 0xb8, 0x80, 0xa5, 0xa5, 0x25, 0xd4, 0x6a, 0x35, 0x3b, 0x41, 0x84, 0x14, 0xac,
+	0xb2, 0x2c, 0xbb, 0xa3, 0xe9, 0x6f, 0x8e, 0xb0, 0x01, 0x00, 0x08, 0xb2, 0x2c, 0x9f, 0x6f, 0xb5,
+	0x5a, 0x46, 0x67, 0x10, 0xc5, 0x29, 0x30, 0x4d, 0x13, 0xab, 0xab, 0xab, 0x38, 0x7d, 0xfa, 0x34,
+	0xae, 0x5f, 0xbf, 0x7e, 0x4f, 0xc7, 0x14, 0xc9, 0x0f, 0x24, 0x25, 0x73, 0xe4, 0x7b, 0x5d, 0xd7,
+	0x6d, 0x81, 0x68, 0x27, 0xe1, 0x14, 0x02, 0xa0, 0x56, 0xab, 0xbd, 0xbe, 0xb9, 0xb9, 0xa9, 0x15,
+	0x0a, 0x05, 0xbb, 0xa7, 0x80, 0x53, 0x90, 0xcf, 0xe7, 0xf1, 0xa3, 0x1f, 0xfd, 0x08, 0xdf, 0xff,
+	0xfe, 0xf7, 0xf1, 0xe7, 0x7f, 0xfe, 0xe7, 0x98, 0x9f, 0x9f, 0xb7, 0x63, 0xfc, 0x9f, 0x05, 0x24,
+	0x0b, 0xfa, 0xd8, 0xb1, 0x63, 0x98, 0x9e, 0x9e, 0xc6, 0xc0, 0xc0, 0x00, 0x8e, 0x1f, 0x3f, 0x8e,
+	0xde, 0xde, 0x5e, 0xd4, 0xeb, 0x75, 0x3b, 0x5c, 0xbc, 0x93, 0xae, 0xb0, 0x53, 0x8e, 0x00, 0xc8,
+	0xb2, 0xfc, 0xfe, 0x6b, 0xaf, 0xbd, 0x26, 0x4e, 0x4c, 0x4c, 0x70, 0x23, 0x23, 0x23, 0x08, 0x04,
+	0x02, 0xdd, 0xbe, 0x24, 0x1b, 0x67, 0xcf, 0x9e, 0xc5, 0x9b, 0x6f, 0xbe, 0x09, 0x45, 0x51, 0xb0,
+	0xb1, 0xb1, 0x81, 0x64, 0x32, 0x89, 0x81, 0x81, 0x01, 0x7c, 0xd6, 0xa3, 0xca, 0xb2, 0x2c, 0xe8,
+	0xba, 0x8e, 0xa9, 0xa9, 0x29, 0xfc, 0xc9, 0x9f, 0xfc, 0x09, 0xea, 0xf5, 0x3a, 0xd2, 0xe9, 0xb4,
+	0x5d, 0x6d, 0xdc, 0x6a, 0xb5, 0xd0, 0x6c, 0x36, 0x77, 0x94, 0x00, 0x8e, 0xd9, 0x01, 0x00, 0xac,
+	0x8a, 0xa2, 0x58, 0x94, 0x24, 0xc9, 0x24, 0x5d, 0xbf, 0x9c, 0x82, 0x4a, 0xa5, 0x82, 0x52, 0xa9,
+	0x64, 0x57, 0x32, 0x0b, 0x82, 0x70, 0x57, 0xc7, 0x14, 0x71, 0x71, 0x75, 0x5d, 0x47, 0x5f, 0x5f,
+	0x1f, 0x66, 0x66, 0x66, 0x10, 0x0a, 0x85, 0x3e, 0x74, 0xe6, 0x0f, 0x0d, 0x0d, 0xed, 0x28, 0xf9,
+	0x9d, 0x44, 0x00, 0x79, 0x75, 0x75, 0xf5, 0xe7, 0xab, 0xab, 0xab, 0xba, 0xae, 0xeb, 0x8e, 0xb2,
+	0x03, 0xc6, 0xc6, 0xc6, 0xec, 0x27, 0x35, 0x12, 0x89, 0x60, 0x66, 0x66, 0x06, 0x1c, 0xf7, 0xd9,
+	0xb5, 0x1a, 0x52, 0x32, 0x46, 0x74, 0x00, 0x12, 0x22, 0x26, 0x5f, 0xa9, 0x54, 0xca, 0x6e, 0xaf,
+	0xb3, 0x53, 0x70, 0x42, 0x52, 0xa8, 0x0d, 0x59, 0x96, 0xf3, 0xd1, 0x68, 0xf4, 0x85, 0x3d, 0x7b,
+	0xf6, 0xf8, 0x49, 0x6f, 0x81, 0xed, 0xc4, 0xdd, 0xea, 0x02, 0x3d, 0x3d, 0x3d, 0x88, 0xc7, 0xe3,
+	0x30, 0x4d, 0x13, 0x8f, 0x3f, 0xfe, 0x38, 0x4e, 0x9c, 0x38, 0x81, 0x50, 0x28, 0xf4, 0x99, 0x5f,
+	0x4b, 0x55, 0x55, 0x7b, 0x17, 0x20, 0xa9, 0x62, 0x64, 0x24, 0x5e, 0xad, 0x56, 0x43, 0xb1, 0x58,
+	0xc4, 0x85, 0x0b, 0x17, 0xcc, 0xa5, 0xa5, 0xa5, 0x17, 0x25, 0x49, 0xba, 0x86, 0x1d, 0x68, 0x37,
+	0xe3, 0x18, 0x1b, 0xe0, 0x26, 0xae, 0x2c, 0x2e, 0x2e, 0xfe, 0xfc, 0xfd, 0xf7, 0xdf, 0x7f, 0x61,
+	0x64, 0x64, 0xc4, 0xbd, 0xdd, 0x42, 0xce, 0xdd, 0xbe, 0x16, 0xcb, 0xb2, 0x78, 0xee, 0xb9, 0xe7,
+	0x70, 0xf4, 0xe8, 0xd1, 0x0f, 0x35, 0xc3, 0xbc, 0x13, 0x90, 0xcf, 0x40, 0x94, 0xc9, 0x4e, 0x77,
+	0x90, 0x14, 0x93, 0xb6, 0xdb, 0x6d, 0xbb, 0x7b, 0x9a, 0x28, 0x8a, 0x79, 0x8a, 0xa2, 0xae, 0x61,
+	0x87, 0xd2, 0xc4, 0x9d, 0x74, 0x04, 0x00, 0x00, 0xe6, 0xe7, 0xe7, 0x5f, 0x5c, 0x59, 0x59, 0x51,
+	0x88, 0x56, 0xee, 0x24, 0x04, 0x83, 0xc1, 0x4f, 0x5d, 0xfc, 0xce, 0xec, 0x1f, 0x49, 0x92, 0xb0,
+	0xb9, 0xb9, 0x89, 0x62, 0xb1, 0x88, 0x66, 0xb3, 0x69, 0x7b, 0x36, 0x9d, 0x9f, 0xcb, 0x34, 0x4d,
+	0xf0, 0x3c, 0x6f, 0x13, 0x42, 0xd3, 0xb4, 0x7a, 0x6f, 0x6f, 0xef, 0x8e, 0x95, 0x91, 0x3b, 0x6d,
+	0x07, 0x00, 0x80, 0x5f, 0x5d, 0xbe, 0x7c, 0xf9, 0xc2, 0xfa, 0xfa, 0xfa, 0x91, 0x74, 0x3a, 0xed,
+	0xa8, 0x23, 0xea, 0x4e, 0x21, 0x49, 0x12, 0x2e, 0x5d, 0xba, 0x84, 0xb7, 0xdf, 0x7e, 0x1b, 0xeb,
+	0xeb, 0xeb, 0xa0, 0x69, 0x1a, 0xb1, 0x58, 0x0c, 0x33, 0x33, 0x33, 0x38, 0x70, 0xe0, 0x00, 0xe9,
+	0x77, 0x64, 0x27, 0x83, 0x50, 0x14, 0x85, 0x46, 0xa3, 0x81, 0x8d, 0x8d, 0x0d, 0x54, 0xab, 0xd5,
+	0xf6, 0xc2, 0xc2, 0xc2, 0x8e, 0xf9, 0xc0, 0x4e, 0x24, 0x80, 0x7a, 0xf1, 0xe2, 0xc5, 0x9f, 0xbd,
+	0xf7, 0xde, 0x7b, 0x87, 0xa6, 0xa7, 0xa7, 0x5d, 0xdb, 0x6d, 0x07, 0xdc, 0xf7, 0x8b, 0x57, 0x55,
+	0xbc, 0xf8, 0xe2, 0x8b, 0x58, 0x59, 0x59, 0xc1, 0xec, 0xec, 0x2c, 0x1e, 0x7e, 0xf8, 0x61, 0x68,
+	0x9a, 0x86, 0x5c, 0x2e, 0x87, 0x53, 0xa7, 0x4e, 0x41, 0x55, 0x55, 0x3c, 0xfe, 0xf8, 0xe3, 0x76,
+	0x35, 0xb1, 0xaa, 0xaa, 0xf6, 0x51, 0xd0, 0x68, 0x34, 0x20, 0xcb, 0xf2, 0x19, 0x49, 0x92, 0x94,
+	0x9d, 0xba, 0x5e, 0x27, 0x12, 0x00, 0xb9, 0x5c, 0xee, 0xa5, 0x33, 0x67, 0xce, 0xfc, 0xe9, 0x73,
+	0xcf, 0x3d, 0xe7, 0xbd, 0x55, 0x79, 0x98, 0xd3, 0x40, 0xb6, 0xfd, 0xf3, 0xe7, 0xcf, 0xe3, 0xcc,
+	0x99, 0x33, 0x78, 0xea, 0xa9, 0xa7, 0xf0, 0xa5, 0x2f, 0x7d, 0x09, 0x91, 0x48, 0x04, 0x86, 0x61,
+	0x60, 0x6c, 0x6c, 0x0c, 0xa1, 0x50, 0x08, 0xaf, 0xbc, 0xf2, 0x0a, 0x4c, 0xd3, 0xc4, 0x23, 0x8f,
+	0x3c, 0x02, 0x8e, 0xe3, 0x20, 0x49, 0x92, 0xfd, 0xb7, 0xa2, 0x28, 0xa2, 0x5c, 0x2e, 0xdf, 0xc0,
+	0x0e, 0x96, 0x89, 0x39, 0x92, 0x00, 0x00, 0x36, 0x9a, 0xcd, 0xe6, 0x4a, 0x2e, 0x97, 0x8b, 0x64,
+	0x32, 0x19, 0xfa, 0x41, 0x20, 0x40, 0xa5, 0x52, 0xc1, 0x3b, 0xef, 0xbc, 0x83, 0x57, 0x5f, 0x7d,
+	0x15, 0x92, 0x24, 0xd9, 0x09, 0x2e, 0xed, 0x76, 0xdb, 0xee, 0x32, 0xa6, 0xaa, 0x2a, 0x72, 0xb9,
+	0x1c, 0x7e, 0xf8, 0xc3, 0x1f, 0xc2, 0xb2, 0x2c, 0x1c, 0x3c, 0x78, 0x10, 0x9a, 0xa6, 0xc1, 0xe3,
+	0xf1, 0xa0, 0xd9, 0x6c, 0x42, 0xd3, 0x34, 0xf8, 0x7c, 0xbe, 0x1d, 0xb5, 0xcb, 0x9c, 0x7a, 0x67,
+	0xdb, 0x1b, 0x1b, 0x1b, 0xe9, 0x6c, 0x36, 0x7b, 0xe4, 0xa1, 0x87, 0x1e, 0x62, 0x3a, 0x87, 0x50,
+	0x38, 0x11, 0x82, 0x20, 0xe0, 0x2f, 0xff, 0xf2, 0x2f, 0xf1, 0xc6, 0x1b, 0x6f, 0x80, 0x61, 0x18,
+	0x94, 0x4a, 0x25, 0x54, 0x2a, 0x15, 0x7b, 0x60, 0x46, 0xad, 0x56, 0xc3, 0xdc, 0xdc, 0x1c, 0x5e,
+	0x79, 0xe5, 0x15, 0xe4, 0xf3, 0x79, 0xd4, 0xeb, 0x75, 0xe4, 0x72, 0x39, 0xf4, 0xf6, 0xf6, 0x62,
+	0x78, 0x78, 0x18, 0x96, 0x65, 0xe1, 0xd2, 0xa5, 0x4b, 0x38, 0x75, 0xea, 0x94, 0xb6, 0xb2, 0xb2,
+	0xf2, 0x17, 0x8a, 0xa2, 0x2c, 0x60, 0x87, 0x3a, 0x8e, 0x3a, 0x75, 0x07, 0x40, 0xbd, 0x5e, 0x7f,
+	0x75, 0x6e, 0x6e, 0xee, 0x7b, 0x95, 0x4a, 0x85, 0x25, 0x6d, 0xd8, 0x9c, 0x8a, 0x77, 0xdf, 0x7d,
+	0x17, 0x0b, 0x0b, 0x0b, 0xe8, 0xed, 0xed, 0xb5, 0x3b, 0x85, 0x91, 0xff, 0x0b, 0x87, 0xc3, 0xa0,
+	0x69, 0x1a, 0xf5, 0x7a, 0x1d, 0x8d, 0x46, 0x03, 0xb1, 0x58, 0x0c, 0x14, 0x45, 0x61, 0x7d, 0x7d,
+	0x1d, 0x6f, 0xbe, 0xf9, 0x26, 0x26, 0x27, 0x27, 0x01, 0x6c, 0xa5, 0x8a, 0x6b, 0x9a, 0xd6, 0xa4,
+	0x69, 0x7a, 0x11, 0x3b, 0xd8, 0x5b, 0xd0, 0xb9, 0x77, 0x15, 0x98, 0xcf, 0xe7, 0xf3, 0x2b, 0x85,
+	0x42, 0x61, 0x5f, 0x3a, 0x9d, 0xa6, 0x9d, 0x4a, 0x00, 0x55, 0x55, 0x71, 0xf9, 0xf2, 0x65, 0xbb,
+	0xb9, 0x25, 0x19, 0x87, 0xe3, 0x76, 0xbb, 0xb1, 0xb6, 0xb6, 0x86, 0x66, 0xb3, 0x89, 0x52, 0xa9,
+	0x04, 0x5d, 0xd7, 0x11, 0x0e, 0x87, 0xed, 0x16, 0xb6, 0xed, 0x76, 0x1b, 0xa1, 0x50, 0xc8, 0xee,
+	0xa6, 0xbe, 0xb8, 0xb8, 0x88, 0x56, 0xab, 0x55, 0xd3, 0xb6, 0x33, 0x23, 0xe6, 0x0e, 0xe0, 0xcc,
+	0xbb, 0xba, 0x05, 0xa1, 0x58, 0x2c, 0x5e, 0x5a, 0x5c, 0x5c, 0x9c, 0x9e, 0x99, 0x99, 0xd9, 0xf6,
+	0x73, 0x71, 0xbb, 0x44, 0x26, 0x92, 0xe8, 0xd1, 0x68, 0x34, 0xe0, 0x72, 0xb9, 0xe0, 0xf7, 0xfb,
+	0x11, 0x8d, 0x6e, 0x15, 0xfa, 0xf2, 0x3c, 0x6f, 0xcf, 0x4b, 0xd2, 0x34, 0x0d, 0xa1, 0x50, 0xc8,
+	0xee, 0x0f, 0x60, 0x59, 0x16, 0xc6, 0xc6, 0xc6, 0x3e, 0x54, 0x05, 0x2d, 0x49, 0xd2, 0x39, 0x51,
+	0x14, 0x2b, 0xd8, 0xc1, 0x32, 0x71, 0xc7, 0x09, 0x41, 0x9d, 0x58, 0x5b, 0x5b, 0x7b, 0x43, 0x92,
+	0x24, 0xbd, 0x33, 0x99, 0x72, 0xbb, 0xb0, 0x1d, 0x8b, 0x4f, 0x6a, 0xff, 0xd3, 0xe9, 0x34, 0x38,
+	0x8e, 0x83, 0xae, 0xeb, 0x64, 0xfc, 0x0d, 0x38, 0x8e, 0x43, 0xb9, 0x5c, 0x86, 0x28, 0x8a, 0x68,
+	0xb5, 0x5a, 0x68, 0xb7, 0xdb, 0x76, 0x4e, 0xa0, 0x61, 0x18, 0xe8, 0xed, 0xed, 0x45, 0x2a, 0x95,
+	0x82, 0x69, 0x9a, 0x76, 0xf4, 0x4f, 0x55, 0xd5, 0x1d, 0xef, 0x23, 0xe8, 0xe4, 0x1d, 0x00, 0xa2,
+	0x28, 0xae, 0x16, 0x0a, 0x05, 0x43, 0x92, 0x24, 0x30, 0x0c, 0xb3, 0x6d, 0x9d, 0xc2, 0xb6, 0xeb,
+	0xe9, 0x27, 0xaa, 0xdf, 0xe1, 0xc3, 0x87, 0x51, 0x28, 0x14, 0x70, 0xf9, 0xf2, 0x65, 0x78, 0xbd,
+	0x5e, 0xb0, 0x2c, 0x6b, 0x4f, 0x3b, 0xdf, 0xdc, 0xdc, 0x84, 0xa6, 0x69, 0x76, 0x8e, 0x03, 0xcf,
+	0xf3, 0xc8, 0x64, 0x32, 0x78, 0xea, 0xa9, 0xa7, 0x30, 0x38, 0x38, 0x08, 0x5d, 0xd7, 0x21, 0xcb,
+	0x32, 0xd6, 0xd7, 0xd7, 0xd1, 0x68, 0x34, 0x76, 0x7c, 0xac, 0x9d, 0xa3, 0x09, 0x00, 0xe0, 0xdd,
+	0xf3, 0xe7, 0xcf, 0x97, 0xf3, 0xf9, 0xbc, 0x3f, 0x1a, 0x8d, 0x6e, 0x5b, 0x50, 0x60, 0xbb, 0xe2,
+	0x0b, 0x34, 0x4d, 0xdb, 0x5b, 0xfb, 0xb1, 0x63, 0xc7, 0x20, 0x08, 0x02, 0x16, 0x16, 0x16, 0x60,
+	0x18, 0x06, 0x04, 0x41, 0x40, 0xbd, 0x5e, 0xc7, 0x53, 0x4f, 0x3d, 0x85, 0x13, 0x27, 0x4e, 0x40,
+	0xd7, 0x75, 0xbc, 0xfe, 0xfa, 0xeb, 0x88, 0x46, 0xa3, 0x18, 0x1a, 0x1a, 0xc2, 0xc4, 0xc4, 0x84,
+	0xfd, 0xe4, 0x93, 0xfe, 0x88, 0x0c, 0xc3, 0xec, 0xa8, 0x06, 0x00, 0x38, 0x9f, 0x00, 0x5a, 0xb1,
+	0x58, 0xac, 0x94, 0xcb, 0xe5, 0x7e, 0xd3, 0x34, 0x9d, 0x93, 0xe1, 0xd9, 0x01, 0xa2, 0xe8, 0xc5,
+	0x62, 0x31, 0x7c, 0xeb, 0x5b, 0xdf, 0xc2, 0xb9, 0x73, 0xe7, 0xf0, 0xea, 0xab, 0xaf, 0x62, 0x79,
+	0x79, 0x19, 0x27, 0x4f, 0x9e, 0xc4, 0x0b, 0x2f, 0xbc, 0x80, 0x4c, 0x26, 0x03, 0x55, 0x55, 0xb1,
+	0xbc, 0xbc, 0x6c, 0x37, 0xc6, 0x24, 0x0d, 0xa4, 0x1a, 0x8d, 0x06, 0x19, 0xa7, 0x67, 0xfa, 0x7c,
+	0x3e, 0x0d, 0x3b, 0xdc, 0x26, 0xc6, 0xd1, 0x36, 0x00, 0x00, 0xc9, 0xe3, 0xf1, 0x5c, 0xe3, 0x38,
+	0xce, 0xdc, 0x61, 0xe3, 0xf8, 0x8e, 0x41, 0xe6, 0x21, 0xc8, 0xb2, 0x0c, 0x41, 0x10, 0x90, 0x4a,
+	0xa5, 0xf0, 0xdc, 0x73, 0xcf, 0xa1, 0xbf, 0xbf, 0x1f, 0x24, 0xb3, 0x89, 0xa2, 0x28, 0x3b, 0xe2,
+	0x47, 0xba, 0xa2, 0x76, 0x76, 0x0f, 0x51, 0x55, 0x15, 0x85, 0x42, 0xa1, 0x29, 0x49, 0x92, 0x84,
+	0x5d, 0x02, 0x7c, 0x18, 0xab, 0xab, 0xab, 0x1b, 0xaa, 0xaa, 0x9a, 0x4e, 0x57, 0x03, 0x39, 0x8e,
+	0xb3, 0x43, 0xba, 0xa6, 0x69, 0xe2, 0x99, 0x67, 0x9e, 0xb1, 0x7b, 0x1d, 0x11, 0xb8, 0xdd, 0x6e,
+	0xbb, 0x67, 0x20, 0xc9, 0x0c, 0x02, 0x00, 0x45, 0x51, 0x50, 0x2e, 0x97, 0xaf, 0x37, 0x9b, 0xcd,
+	0x15, 0xec, 0xf0, 0x11, 0xe0, 0x78, 0x02, 0xa8, 0xaa, 0x6a, 0x91, 0xd1, 0x73, 0x4e, 0x4a, 0x14,
+	0xed, 0x04, 0xcb, 0xb2, 0x20, 0x8d, 0x2e, 0xe3, 0xf1, 0x38, 0x54, 0x55, 0x45, 0xb5, 0x5a, 0x45,
+	0xbb, 0xdd, 0x46, 0xbb, 0xdd, 0x46, 0xa5, 0x52, 0xc1, 0x8d, 0x1b, 0x37, 0xd0, 0x6e, 0xb7, 0x49,
+	0xf1, 0x87, 0x2d, 0x15, 0xeb, 0xba, 0x8e, 0x52, 0xa9, 0x84, 0x6a, 0xb5, 0x2a, 0xb7, 0x5a, 0xad,
+	0x1d, 0x4f, 0x83, 0x72, 0xba, 0x0d, 0x60, 0x57, 0xd1, 0xde, 0xcf, 0xa9, 0x20, 0xf7, 0x0a, 0x62,
+	0xcc, 0xb1, 0x2c, 0x6b, 0xd7, 0x0e, 0x8c, 0x8f, 0x8f, 0x63, 0x7d, 0x7d, 0x1d, 0x3f, 0xfb, 0xd9,
+	0xcf, 0xec, 0x80, 0xcf, 0xec, 0xec, 0xac, 0x4d, 0x14, 0x32, 0x1b, 0x89, 0x1c, 0x1d, 0x96, 0x65,
+	0x75, 0x25, 0x07, 0xce, 0xf1, 0x04, 0xe0, 0x79, 0xde, 0x4d, 0x26, 0x84, 0x3a, 0x19, 0x2e, 0x97,
+	0x0b, 0x89, 0x44, 0x02, 0xf9, 0x7c, 0x1e, 0xfd, 0xfd, 0xfd, 0x70, 0xb9, 0x5c, 0xc8, 0x64, 0x32,
+	0x10, 0x45, 0xd1, 0x4e, 0xfa, 0x48, 0xa5, 0x52, 0x1f, 0x6a, 0x18, 0xe5, 0xf3, 0xf9, 0x20, 0x8a,
+	0x22, 0xe9, 0x13, 0x50, 0x47, 0x17, 0xfa, 0x06, 0x3b, 0x9e, 0x00, 0xd9, 0x6c, 0x36, 0xc5, 0x30,
+	0x0c, 0x2d, 0xcb, 0xf2, 0x5d, 0xe9, 0x00, 0x9d, 0xc7, 0xc6, 0xed, 0x76, 0x90, 0x7b, 0xd1, 0x06,
+	0xc8, 0x58, 0x3c, 0x5d, 0xd7, 0x91, 0xc9, 0x64, 0x60, 0x59, 0x16, 0x9a, 0xcd, 0x26, 0x68, 0x9a,
+	0xb6, 0x63, 0x01, 0xc4, 0xe8, 0x23, 0x83, 0xb2, 0xc8, 0xfb, 0x35, 0x9b, 0x4d, 0x88, 0xa2, 0x08,
+	0x45, 0x51, 0x4e, 0xa1, 0x0b, 0x2d, 0x63, 0x9d, 0x4e, 0x00, 0x37, 0x45, 0x51, 0x49, 0x9a, 0xa6,
+	0xa9, 0xbb, 0x4d, 0x95, 0x26, 0x8b, 0xda, 0x59, 0x2d, 0xdc, 0xb9, 0x00, 0x04, 0xf7, 0x2a, 0x0e,
+	0x75, 0x4e, 0x41, 0x21, 0xe9, 0x5d, 0x44, 0x10, 0xd2, 0x34, 0x0d, 0x2e, 0x97, 0x0b, 0xb2, 0x2c,
+	0xc3, 0xef, 0xf7, 0xdb, 0x3f, 0x27, 0xe5, 0x60, 0x37, 0x23, 0x86, 0x75, 0x74, 0x61, 0x07, 0x70,
+	0xba, 0x11, 0xc8, 0xb5, 0xdb, 0xed, 0x64, 0x20, 0x10, 0xa0, 0x65, 0xf9, 0xd6, 0x0f, 0xc7, 0x9d,
+	0x18, 0x87, 0x9d, 0xf5, 0x79, 0x9f, 0x54, 0x3a, 0xbe, 0x1d, 0x23, 0xe7, 0x3a, 0xbb, 0x84, 0x93,
+	0xd6, 0xf7, 0x34, 0x4d, 0xdb, 0x8d, 0x2f, 0x49, 0x97, 0x50, 0xf2, 0xfd, 0xcd, 0xa6, 0xd1, 0x24,
+	0x5d, 0xbc, 0x2b, 0x06, 0x8e, 0xd3, 0x77, 0x00, 0x9a, 0x65, 0xd9, 0x00, 0x4d, 0xd3, 0xb7, 0xdd,
+	0xfe, 0x3f, 0xcb, 0x93, 0x4b, 0x7e, 0xf7, 0x7e, 0x18, 0x94, 0xc4, 0x60, 0xed, 0x7c, 0x2f, 0x42,
+	0x36, 0x92, 0xf5, 0x43, 0xd2, 0xc0, 0xc8, 0xee, 0x40, 0x76, 0x86, 0x6e, 0x75, 0x46, 0x71, 0x3a,
+	0x01, 0xfa, 0xf6, 0xec, 0xd9, 0xe3, 0xe3, 0x79, 0x9e, 0x22, 0x13, 0x47, 0xef, 0x16, 0x9d, 0x5b,
+	0xfc, 0x9d, 0xda, 0x05, 0x9f, 0x15, 0x9d, 0xd3, 0x42, 0xc8, 0x99, 0x4f, 0x8a, 0x3e, 0x48, 0xd5,
+	0xaf, 0xa6, 0x69, 0xf6, 0x6e, 0x43, 0x8c, 0xc3, 0x78, 0x3c, 0xde, 0x35, 0x23, 0xd7, 0xe9, 0x04,
+	0xf8, 0x02, 0xcf, 0xf3, 0x01, 0xb2, 0x65, 0xde, 0x0b, 0x3a, 0x17, 0xfa, 0x7e, 0xf6, 0x22, 0x24,
+	0x8b, 0x4b, 0xba, 0x83, 0x77, 0x8e, 0x97, 0x23, 0x6a, 0x26, 0xd9, 0x0d, 0x3c, 0x1e, 0x0f, 0x04,
+	0x41, 0x80, 0x20, 0x08, 0x5d, 0xeb, 0x8c, 0xea, 0x68, 0x1b, 0xc0, 0xed, 0x76, 0xbb, 0x43, 0xa1,
+	0x10, 0x0c, 0xc3, 0xb8, 0x2f, 0xa5, 0x62, 0xf7, 0x5b, 0x57, 0xe8, 0x9c, 0x2f, 0x48, 0xfa, 0x02,
+	0x92, 0x63, 0x82, 0x1c, 0x05, 0xcd, 0x66, 0x13, 0x5e, 0xaf, 0x17, 0x7e, 0xbf, 0xdf, 0x85, 0x1d,
+	0x6a, 0x0b, 0xd3, 0x09, 0x47, 0xef, 0x00, 0x7d, 0x7d, 0x7d, 0x81, 0xfe, 0xfe, 0x7e, 0x2a, 0x14,
+	0x0a, 0x6d, 0xfb, 0x16, 0xb9, 0x13, 0xa2, 0x12, 0x29, 0xfd, 0xea, 0xec, 0x16, 0x4a, 0x6a, 0x02,
+	0x09, 0xc8, 0xc4, 0x74, 0x49, 0x92, 0x2c, 0xfc, 0x63, 0x9e, 0x17, 0xf0, 0x49, 0x48, 0xa5, 0x52,
+	0xc7, 0x52, 0xa9, 0x14, 0xe3, 0xf7, 0xfb, 0x1f, 0x98, 0xe6, 0xd1, 0x9f, 0x04, 0x62, 0x0f, 0x00,
+	0xbf, 0x75, 0x17, 0xdd, 0x6e, 0xb7, 0x9d, 0x26, 0x76, 0xb3, 0x81, 0x74, 0x57, 0x94, 0x40, 0x47,
+	0xdf, 0x55, 0x4d, 0xd3, 0x12, 0xed, 0x76, 0x9b, 0x6a, 0x34, 0x1a, 0x8e, 0x8d, 0x03, 0xdc, 0x0e,
+	0x9d, 0xba, 0x03, 0x00, 0xdb, 0x28, 0x24, 0x93, 0xd3, 0x7d, 0x3e, 0x9f, 0x2d, 0x12, 0x75, 0xcb,
+	0x08, 0x74, 0x3a, 0x01, 0xac, 0x56, 0xab, 0xb5, 0xa3, 0x31, 0x80, 0xed, 0x6c, 0x51, 0xf3, 0xd1,
+	0x46, 0x55, 0x84, 0x10, 0x2c, 0xcb, 0x82, 0x61, 0x18, 0x3b, 0x3f, 0xb0, 0x9b, 0xcd, 0x31, 0x1d,
+	0x4d, 0x80, 0xce, 0xda, 0xb9, 0xbb, 0x69, 0xc9, 0x72, 0x37, 0xb8, 0x1f, 0xdd, 0xc5, 0x08, 0xa9,
+	0x88, 0x0b, 0x48, 0x92, 0x44, 0x49, 0xe6, 0x50, 0xad, 0x56, 0xb3, 0x64, 0x59, 0xee, 0x4a, 0xc2,
+	0x83, 0xa3, 0x09, 0x40, 0x51, 0x14, 0x45, 0x12, 0x2e, 0x76, 0x32, 0x1f, 0x60, 0x3b, 0x09, 0x40,
+	0x8c, 0x3e, 0xd2, 0x18, 0x82, 0x90, 0x99, 0x65, 0x59, 0xbb, 0x37, 0xf2, 0xc6, 0xc6, 0x46, 0xdd,
+	0xb2, 0xac, 0xf7, 0xb1, 0xc3, 0xf9, 0x80, 0x80, 0xc3, 0x09, 0x60, 0x59, 0x96, 0x75, 0xb3, 0x66,
+	0xde, 0x51, 0x1d, 0x43, 0xee, 0x16, 0x24, 0x0c, 0x4c, 0x72, 0x05, 0x4a, 0xa5, 0x12, 0xca, 0xe5,
+	0x32, 0x8a, 0xc5, 0x62, 0x45, 0x51, 0x94, 0x4d, 0xec, 0x50, 0x35, 0x50, 0x27, 0x1c, 0x4d, 0x00,
+	0xaf, 0xd7, 0xbb, 0xd4, 0x68, 0x34, 0xcc, 0x3b, 0xf5, 0x00, 0x9c, 0x6c, 0x28, 0x1a, 0x86, 0x01,
+	0x4d, 0xd3, 0x60, 0x9a, 0x26, 0x02, 0x81, 0x80, 0x4d, 0xe8, 0x62, 0xb1, 0x08, 0x51, 0x14, 0xcf,
+	0xd4, 0xeb, 0x75, 0xb1, 0x1b, 0xd7, 0xe5, 0x64, 0x1d, 0x80, 0xbd, 0x72, 0xe5, 0xca, 0x46, 0xb5,
+	0x5a, 0x35, 0x49, 0xee, 0xfc, 0xa7, 0x55, 0x07, 0x39, 0x31, 0x61, 0xa4, 0x33, 0x1e, 0x00, 0x6c,
+	0x91, 0x94, 0xf4, 0x06, 0x26, 0x49, 0xa1, 0x82, 0x20, 0xac, 0xa1, 0x4b, 0x83, 0x23, 0x9d, 0xb6,
+	0x03, 0x50, 0xd8, 0x9a, 0x99, 0x13, 0x1d, 0x18, 0x18, 0xf8, 0xf7, 0x93, 0x93, 0x93, 0x7f, 0x9c,
+	0xcb, 0xe5, 0xd8, 0x6a, 0xb5, 0xba, 0x63, 0x46, 0xe0, 0x76, 0x83, 0x18, 0x80, 0x64, 0x4e, 0xc0,
+	0x4d, 0xd5, 0x0f, 0xb2, 0x2c, 0xa3, 0x52, 0xa9, 0x60, 0x71, 0x71, 0x51, 0xd7, 0x34, 0xed, 0x97,
+	0xe8, 0xd2, 0xf8, 0x58, 0xa7, 0xed, 0x00, 0x63, 0xa9, 0x54, 0xea, 0xdf, 0x66, 0xb3, 0xd9, 0x27,
+	0x0e, 0x1d, 0x3a, 0xf4, 0x85, 0x5c, 0x2e, 0x47, 0x0b, 0x82, 0x60, 0x97, 0x52, 0x75, 0xa2, 0x5b,
+	0x8d, 0xa0, 0xef, 0x04, 0x44, 0xf2, 0xfd, 0xa8, 0x0e, 0x40, 0x62, 0x01, 0x24, 0x04, 0xbc, 0xb0,
+	0xb0, 0x80, 0x6b, 0xd7, 0xae, 0xcd, 0xd7, 0xeb, 0xf5, 0xcb, 0x00, 0xba, 0xe2, 0x05, 0x38, 0x89,
+	0x00, 0xf4, 0xc8, 0xc8, 0xc8, 0x7f, 0x7e, 0xe2, 0x89, 0x27, 0xbe, 0xea, 0x76, 0xbb, 0x19, 0x52,
+	0x68, 0xa9, 0xeb, 0x3a, 0x8a, 0xc5, 0x22, 0x1a, 0x8d, 0x06, 0xfc, 0x7e, 0x3f, 0x00, 0xe7, 0x35,
+	0x82, 0xfe, 0x28, 0x3e, 0x1a, 0x72, 0x26, 0x39, 0x02, 0x84, 0x00, 0xa6, 0x69, 0xa2, 0x58, 0x2c,
+	0x42, 0x10, 0x04, 0xb4, 0xdb, 0xed, 0x5f, 0x7a, 0xbd, 0x5e, 0xe1, 0x76, 0xf9, 0x0e, 0xf7, 0x13,
+	0x4e, 0x22, 0xc0, 0xd8, 0xc1, 0x83, 0x07, 0xbf, 0x14, 0x8d, 0x46, 0x99, 0x70, 0x38, 0x0c, 0xbf,
+	0xdf, 0x0f, 0xcb, 0xb2, 0x70, 0xf9, 0xf2, 0x65, 0x5c, 0xbd, 0x7a, 0x15, 0x93, 0x93, 0x93, 0xe0,
+	0x79, 0x1e, 0xc1, 0x60, 0xb0, 0xdb, 0xd7, 0xf9, 0xa9, 0xe8, 0x24, 0xa7, 0x69, 0x9a, 0xb6, 0xbb,
+	0x47, 0xf2, 0x01, 0x9a, 0xcd, 0x26, 0x96, 0x97, 0x97, 0xf1, 0xd6, 0x5b, 0x6f, 0x09, 0x95, 0x4a,
+	0xe5, 0xc7, 0xb5, 0x5a, 0x4d, 0xea, 0xd6, 0xb5, 0x3a, 0x86, 0x00, 0x89, 0x44, 0xe2, 0xab, 0x81,
+	0x40, 0x20, 0x94, 0xc9, 0x64, 0x30, 0x36, 0x36, 0x86, 0x58, 0x2c, 0x86, 0x7a, 0xbd, 0x6e, 0xb7,
+	0x67, 0xad, 0x54, 0x2a, 0x48, 0xa5, 0x52, 0x8e, 0xdc, 0xfa, 0x6f, 0x77, 0x4d, 0x96, 0x65, 0x75,
+	0x66, 0xfd, 0x40, 0x96, 0x65, 0xa8, 0xaa, 0x0a, 0x41, 0x10, 0x90, 0xcf, 0xe7, 0xcf, 0x17, 0x8b,
+	0xc5, 0xae, 0x4d, 0x0e, 0x07, 0x9c, 0x43, 0x80, 0xd9, 0xe9, 0xe9, 0xe9, 0x3f, 0x1d, 0x1d, 0x1d,
+	0x65, 0x07, 0x06, 0x06, 0xd0, 0xdf, 0xdf, 0x8f, 0x48, 0x24, 0x42, 0x26, 0x69, 0xe1, 0xb5, 0xd7,
+	0x5e, 0x43, 0xa9, 0x54, 0x82, 0xaa, 0xaa, 0x68, 0xb5, 0x5a, 0x76, 0x11, 0xc6, 0x67, 0xc5, 0xfd,
+	0x22, 0xcf, 0xad, 0x5e, 0x93, 0x3c, 0xf1, 0x64, 0x5a, 0x88, 0x2c, 0xcb, 0x28, 0x16, 0x8b, 0xb8,
+	0x76, 0xed, 0x1a, 0xfe, 0xee, 0xef, 0xfe, 0xce, 0xcc, 0xe5, 0x72, 0x7f, 0x01, 0xa0, 0xb1, 0xd3,
+	0x37, 0xbb, 0x13, 0x8e, 0xf0, 0x02, 0xf6, 0xec, 0xd9, 0xf3, 0xc2, 0xbe, 0x7d, 0xfb, 0xd8, 0x54,
+	0x2a, 0x85, 0xd1, 0xd1, 0x51, 0x98, 0xa6, 0x89, 0x5a, 0xad, 0x66, 0x97, 0x5f, 0xc7, 0x62, 0x31,
+	0x9c, 0x3a, 0x75, 0x0a, 0xef, 0xbd, 0xf7, 0x9e, 0x1d, 0x48, 0xb9, 0x1b, 0x7c, 0x74, 0xa1, 0xee,
+	0xa7, 0xb8, 0x44, 0x26, 0x83, 0x68, 0x9a, 0x66, 0x8f, 0x8b, 0x15, 0x04, 0x01, 0x6b, 0x6b, 0x6b,
+	0x38, 0x7d, 0xfa, 0x34, 0xe6, 0xe7, 0xe7, 0x5f, 0x6e, 0x34, 0x1a, 0xaf, 0xa1, 0x0b, 0xea, 0x5f,
+	0x27, 0x1c, 0x41, 0x00, 0x51, 0x14, 0xe7, 0x6a, 0xb5, 0x9a, 0x11, 0x08, 0x04, 0x10, 0x8f, 0xc7,
+	0x11, 0x8b, 0xc5, 0xe0, 0x76, 0xbb, 0xed, 0xca, 0xdb, 0xa9, 0xa9, 0x29, 0x70, 0x1c, 0x87, 0x97,
+	0x5f, 0x7e, 0x19, 0xe7, 0xce, 0x9d, 0x23, 0xc6, 0xd3, 0x3d, 0x0b, 0x3f, 0xf7, 0x2b, 0xc4, 0x4c,
+	0x32, 0x7e, 0xc8, 0x78, 0x38, 0xc3, 0x30, 0x20, 0xcb, 0x32, 0x68, 0x9a, 0x26, 0xed, 0x60, 0x45,
+	0x49, 0x92, 0xfe, 0x17, 0xba, 0xfc, 0xf4, 0x03, 0x0e, 0x21, 0xc0, 0x8d, 0x1b, 0x37, 0x3e, 0xa8,
+	0x54, 0x2a, 0xa6, 0xc7, 0xe3, 0x81, 0x24, 0x49, 0x20, 0x49, 0xa0, 0xe4, 0x26, 0x66, 0xb3, 0x59,
+	0x1c, 0x39, 0x72, 0x04, 0x0c, 0xc3, 0xe0, 0xc7, 0x3f, 0xfe, 0x31, 0x2e, 0x5c, 0xb8, 0x80, 0x9d,
+	0x8e, 0x12, 0xde, 0x29, 0x3a, 0xf3, 0x01, 0x49, 0xa8, 0xb7, 0xd5, 0x6a, 0xa1, 0x56, 0xab, 0xe1,
+	0xfc, 0xf9, 0xf3, 0xf8, 0xfb, 0xbf, 0xff, 0x7b, 0x9c, 0x3e, 0x7d, 0xfa, 0x07, 0x95, 0x4a, 0xe5,
+	0x2c, 0xba, 0xe4, 0xfa, 0x75, 0xc2, 0x11, 0x04, 0x88, 0x44, 0x22, 0x5f, 0x3f, 0x7a, 0xf4, 0xa8,
+	0x7b, 0x72, 0x72, 0xd2, 0x7e, 0xf2, 0x03, 0x81, 0x00, 0x88, 0x37, 0x10, 0x0c, 0x06, 0x11, 0x8f,
+	0xc7, 0x31, 0x36, 0x36, 0x86, 0x7c, 0x3e, 0x8f, 0xb3, 0x67, 0xcf, 0x62, 0x63, 0x63, 0x63, 0xdb,
+	0x06, 0x4c, 0x6d, 0xd7, 0x84, 0x31, 0x22, 0xfa, 0x18, 0x86, 0x61, 0x97, 0x7d, 0x19, 0x86, 0x81,
+	0xc5, 0xc5, 0x45, 0x14, 0x0a, 0x05, 0xbc, 0xfd, 0xf6, 0xdb, 0x38, 0x7d, 0xfa, 0xf4, 0x2f, 0x05,
+	0x41, 0xf8, 0x01, 0x00, 0xa1, 0xcb, 0xb7, 0x1d, 0x80, 0x43, 0x8c, 0x40, 0x8f, 0xc7, 0xe3, 0x35,
+	0x0c, 0x83, 0xa2, 0x28, 0xca, 0xb6, 0xfe, 0xdd, 0x6e, 0x37, 0x28, 0x8a, 0x82, 0xa2, 0x28, 0x90,
+	0x24, 0xc9, 0x16, 0x57, 0xa6, 0xa7, 0xa7, 0x71, 0xe9, 0xd2, 0x25, 0x00, 0xc0, 0x37, 0xbf, 0xf9,
+	0x4d, 0x64, 0x32, 0x19, 0xbb, 0x0f, 0xdf, 0xdd, 0x62, 0xbb, 0x0d, 0x4a, 0x45, 0x51, 0x50, 0xa9,
+	0x54, 0x50, 0x2c, 0x16, 0xe1, 0x72, 0xb9, 0x10, 0x8d, 0x46, 0x21, 0xcb, 0x32, 0x28, 0x8a, 0x42,
+	0xad, 0x56, 0xcb, 0xa1, 0x8b, 0x56, 0xff, 0x47, 0xe1, 0x88, 0x9a, 0xeb, 0x54, 0x2a, 0xb5, 0x27,
+	0x91, 0x48, 0x3c, 0xde, 0x68, 0x34, 0x98, 0x7a, 0xbd, 0x6e, 0x6b, 0xe5, 0xa4, 0x80, 0x92, 0x88,
+	0x26, 0x8d, 0x46, 0x03, 0x91, 0x48, 0x04, 0xb9, 0x5c, 0x0e, 0x97, 0x2f, 0x5f, 0x46, 0xb9, 0x5c,
+	0x46, 0x2c, 0x16, 0xb3, 0x8b, 0x30, 0x76, 0xf2, 0x48, 0xf8, 0xe8, 0x7b, 0x91, 0x19, 0x07, 0xe5,
+	0x72, 0x19, 0x57, 0xae, 0x5c, 0xc1, 0xb9, 0x73, 0xe7, 0xd0, 0x6c, 0x36, 0x41, 0x51, 0x14, 0xa2,
+	0xd1, 0xa8, 0x5d, 0x2c, 0x72, 0xed, 0xda, 0xb5, 0x4c, 0xad, 0x56, 0xfb, 0xb9, 0xaa, 0xaa, 0x9b,
+	0xe8, 0x42, 0x0e, 0xe0, 0x47, 0xe1, 0x08, 0x02, 0xd4, 0x6a, 0xb5, 0xb3, 0xc5, 0x62, 0x31, 0xfe,
+	0xde, 0x7b, 0xef, 0x8d, 0x08, 0x82, 0xc0, 0xe9, 0xba, 0x8e, 0xc5, 0xc5, 0x45, 0xb0, 0x2c, 0x0b,
+	0x49, 0x92, 0x50, 0x2c, 0x16, 0xb1, 0xb1, 0xb1, 0x01, 0x49, 0x92, 0xb0, 0xb1, 0xb1, 0x81, 0x72,
+	0xb9, 0x0c, 0xc3, 0x30, 0xb0, 0xb9, 0xb9, 0x89, 0x42, 0xa1, 0x60, 0x37, 0x65, 0xf2, 0xf9, 0x7c,
+	0x00, 0xee, 0x2d, 0x28, 0xf4, 0x59, 0x5c, 0x45, 0xf2, 0xbb, 0x86, 0x61, 0xa0, 0x5a, 0xad, 0xe2,
+	0xfd, 0xf7, 0xdf, 0xc7, 0xcb, 0x2f, 0xbf, 0x8c, 0x9f, 0xfe, 0xf4, 0xa7, 0x88, 0x46, 0xa3, 0x38,
+	0x72, 0xe4, 0x08, 0x06, 0x07, 0x07, 0xe1, 0xf5, 0x7a, 0xed, 0x18, 0x40, 0xa5, 0x52, 0xf1, 0xcf,
+	0xcf, 0xcf, 0x2f, 0x35, 0x9b, 0xcd, 0xf7, 0xb0, 0x83, 0xfd, 0x00, 0x6f, 0x05, 0x47, 0x10, 0x00,
+	0x80, 0x2e, 0x08, 0xc2, 0xcf, 0x2b, 0x95, 0xca, 0xff, 0x2d, 0x16, 0x8b, 0x4d, 0x59, 0x96, 0x1f,
+	0x2a, 0x97, 0xcb, 0x6c, 0xa1, 0x50, 0xc0, 0xdc, 0xdc, 0x9c, 0xbd, 0xf8, 0xa6, 0x69, 0x62, 0x63,
+	0x63, 0x03, 0x9b, 0x9b, 0x9b, 0x60, 0x18, 0x06, 0x96, 0x65, 0x61, 0x7e, 0x7e, 0x1e, 0xf5, 0x7a,
+	0x1d, 0x5e, 0xaf, 0x17, 0xaa, 0xaa, 0x82, 0xe7, 0xf9, 0x7b, 0x2a, 0x20, 0xf9, 0xa4, 0xc5, 0x27,
+	0x67, 0x3b, 0x91, 0xa0, 0xc9, 0x94, 0x4f, 0x92, 0xe5, 0x9b, 0xcf, 0xe7, 0x91, 0xcf, 0xe7, 0xb1,
+	0xba, 0xba, 0x8a, 0x33, 0x67, 0xce, 0x40, 0xd3, 0x34, 0x1c, 0x3f, 0x7e, 0x1c, 0x63, 0x63, 0x63,
+	0xb6, 0x1d, 0x23, 0xcb, 0x32, 0x14, 0x45, 0x81, 0xae, 0xeb, 0x58, 0x5e, 0x5e, 0xf6, 0xa8, 0xaa,
+	0xfa, 0xb7, 0x37, 0x3b, 0x82, 0x74, 0x15, 0x8e, 0xb0, 0x01, 0x3a, 0x50, 0x2c, 0x14, 0x0a, 0xff,
+	0xa9, 0x50, 0x28, 0xbc, 0xd2, 0xd7, 0xd7, 0xf7, 0x07, 0x0c, 0xc3, 0x04, 0x5b, 0xad, 0xd6, 0x43,
+	0xd9, 0x6c, 0x36, 0xed, 0xf7, 0xfb, 0xa9, 0x72, 0xb9, 0x7c, 0xbd, 0xd5, 0x6a, 0x5d, 0x12, 0x45,
+	0xd1, 0xf4, 0xfb, 0xfd, 0x10, 0x45, 0x11, 0x9a, 0xa6, 0x51, 0x85, 0x42, 0xe1, 0x89, 0xcb, 0x97,
+	0x2f, 0x67, 0x9e, 0x79, 0xe6, 0x19, 0x6a, 0xff, 0xfe, 0xfd, 0x18, 0x1b, 0x1b, 0x43, 0x36, 0x9b,
+	0xbd, 0xab, 0x62, 0x12, 0xf2, 0x54, 0x13, 0xe1, 0xa6, 0x5a, 0xad, 0x42, 0x92, 0x24, 0xe8, 0xba,
+	0x6e, 0xcf, 0xf8, 0x0d, 0x06, 0x83, 0x76, 0x9b, 0x17, 0x49, 0x92, 0xc0, 0x71, 0x1c, 0x32, 0x99,
+	0x0c, 0x38, 0x8e, 0x83, 0xaa, 0xaa, 0x98, 0x9f, 0x9f, 0x87, 0xdf, 0xef, 0x47, 0x20, 0x10, 0xb0,
+	0x6b, 0x00, 0x82, 0xc1, 0x20, 0x68, 0x9a, 0x46, 0x7f, 0x7f, 0x3f, 0x78, 0x9e, 0x4f, 0x53, 0x14,
+	0xb5, 0x63, 0xf3, 0x81, 0x6f, 0x07, 0xa7, 0x11, 0x80, 0xe0, 0xcc, 0xda, 0xda, 0xda, 0x99, 0x9b,
+	0xdf, 0x87, 0x8b, 0xc5, 0xa2, 0xff, 0xe6, 0xf7, 0x75, 0x00, 0x12, 0xb0, 0xd5, 0x9c, 0x99, 0xa0,
+	0xd9, 0x6c, 0xf6, 0x28, 0x8a, 0xf2, 0x3f, 0x8a, 0xc5, 0xe2, 0xd7, 0x37, 0x37, 0x37, 0xdd, 0xeb,
+	0xeb, 0xeb, 0x18, 0x1e, 0x1e, 0xb6, 0x25, 0x65, 0x22, 0xc4, 0xdc, 0x49, 0x5a, 0x99, 0x69, 0x9a,
+	0x68, 0x36, 0x9b, 0x58, 0x5f, 0x5f, 0xc7, 0xb5, 0x6b, 0xd7, 0xb0, 0xb4, 0xb4, 0x84, 0x4a, 0xa5,
+	0x82, 0x4b, 0x97, 0x2e, 0x21, 0x91, 0x48, 0xe0, 0xc0, 0x81, 0x03, 0x38, 0x7e, 0xfc, 0xb8, 0xdd,
+	0xea, 0x25, 0x18, 0x0c, 0xda, 0x9a, 0x04, 0x69, 0x0c, 0x59, 0x28, 0x14, 0xb0, 0xbe, 0xbe, 0x6e,
+	0xd7, 0x00, 0x76, 0xaa, 0x81, 0xa2, 0x28, 0xa2, 0xd1, 0x68, 0xf8, 0x9b, 0xcd, 0xa6, 0x0f, 0x5b,
+	0x5e, 0x58, 0x57, 0x53, 0x9d, 0x9c, 0x72, 0x04, 0xdc, 0x0e, 0x0a, 0x00, 0xf1, 0xe6, 0xd7, 0xad,
+	0xfc, 0xbe, 0xa6, 0x2c, 0xcb, 0x3f, 0x29, 0x97, 0xcb, 0xff, 0xb0, 0xbe, 0xbe, 0x8e, 0xd5, 0xd5,
+	0xd5, 0x7d, 0x6b, 0x6b, 0x6b, 0xae, 0xce, 0x56, 0x2d, 0x44, 0x87, 0x27, 0xde, 0xc5, 0xad, 0xce,
+	0x79, 0x22, 0xde, 0x90, 0xf2, 0xee, 0x9b, 0x0b, 0x06, 0xd3, 0x34, 0x91, 0xcb, 0xe5, 0x20, 0xcb,
+	0x32, 0x1e, 0x7e, 0xf8, 0x61, 0x24, 0x12, 0x89, 0x0f, 0x95, 0x81, 0x91, 0x2c, 0x5f, 0xf2, 0x37,
+	0xb9, 0x5c, 0x0e, 0xa3, 0xa3, 0xa3, 0x08, 0x85, 0x42, 0xf6, 0x2c, 0x80, 0x8b, 0x17, 0x2f, 0xe2,
+	0xf5, 0xd7, 0x5f, 0xc7, 0xdc, 0xdc, 0xdc, 0xaf, 0xd7, 0xd6, 0xd6, 0xfe, 0x1f, 0x6e, 0x92, 0xb9,
+	0x9b, 0x78, 0x10, 0x08, 0xf0, 0x59, 0x90, 0x17, 0x04, 0xe1, 0xa5, 0x5c, 0x2e, 0xf7, 0xd2, 0xda,
+	0xda, 0x1a, 0xbd, 0xb8, 0xb8, 0xd8, 0x5f, 0xab, 0xd5, 0xb8, 0xcd, 0xcd, 0x4d, 0xea, 0xfa, 0xf5,
+	0xeb, 0xa8, 0x56, 0xab, 0x30, 0x0c, 0x03, 0x2b, 0x2b, 0x2b, 0x08, 0x04, 0x02, 0x1f, 0x6a, 0xe9,
+	0x42, 0x40, 0x88, 0x11, 0x0a, 0x85, 0x10, 0x0e, 0x87, 0x91, 0xc9, 0x64, 0x90, 0x4c, 0x26, 0x91,
+	0xc9, 0x64, 0x10, 0x8d, 0x46, 0x11, 0x8b, 0xc5, 0x30, 0x31, 0x31, 0x81, 0x58, 0x2c, 0xf6, 0x31,
+	0x25, 0xd1, 0xed, 0x76, 0xc3, 0xe5, 0x72, 0xa1, 0x5a, 0xad, 0x22, 0x9f, 0xcf, 0xa3, 0xa7, 0xa7,
+	0x07, 0xc9, 0x64, 0x12, 0x8a, 0xa2, 0xa0, 0x5a, 0xad, 0xe2, 0x57, 0xbf, 0xfa, 0x15, 0xfe, 0xfa,
+	0xaf, 0xff, 0xfa, 0x37, 0x57, 0xaf, 0x5e, 0xfd, 0x37, 0x00, 0xd6, 0xbb, 0x7d, 0xb3, 0x80, 0x2e,
+	0xd4, 0xa2, 0xed, 0x30, 0xb2, 0x00, 0x1e, 0xe5, 0x79, 0xfe, 0x50, 0x2a, 0x95, 0x3a, 0x3c, 0x34,
+	0x34, 0xb4, 0x2f, 0x12, 0x89, 0x04, 0xa6, 0xa7, 0xa7, 0xd1, 0xdb, 0xdb, 0x8b, 0xc9, 0xc9, 0x49,
+	0x70, 0x1c, 0x87, 0x68, 0x34, 0x8a, 0x9e, 0x9e, 0x1e, 0x00, 0x5b, 0x36, 0x00, 0x21, 0x06, 0xe9,
+	0xe5, 0x5f, 0xaf, 0xd7, 0x91, 0xcf, 0xe7, 0xb1, 0xb8, 0xb8, 0x88, 0x52, 0xa9, 0x84, 0x23, 0x47,
+	0x8e, 0x60, 0x6a, 0x6a, 0xea, 0x13, 0xb5, 0x07, 0x59, 0x96, 0x91, 0xcf, 0xe7, 0xf1, 0xd2, 0x4b,
+	0x2f, 0xc1, 0xeb, 0xf5, 0x22, 0x14, 0x0a, 0xa1, 0x5a, 0xad, 0xe2, 0x8d, 0x37, 0xde, 0xd0, 0xde,
+	0x7a, 0xeb, 0xad, 0x9f, 0xac, 0xaf, 0xaf, 0xff, 0x31, 0xb6, 0x16, 0xbf, 0xeb, 0x2e, 0x20, 0xe0,
+	0x5c, 0x1b, 0x60, 0xbb, 0x90, 0x03, 0x90, 0x13, 0x45, 0xf1, 0xc7, 0xa2, 0x28, 0x62, 0x69, 0x69,
+	0x69, 0x1c, 0x40, 0x28, 0x9b, 0xcd, 0x3e, 0x61, 0x9a, 0xe6, 0xa1, 0xa1, 0xa1, 0xa1, 0xc7, 0x46,
+	0x46, 0x46, 0x22, 0x63, 0x63, 0x63, 0x2c, 0x31, 0xe2, 0x86, 0x87, 0x87, 0x91, 0x48, 0x24, 0x3e,
+	0x54, 0x93, 0xe0, 0xf3, 0xf9, 0x10, 0x0c, 0x06, 0x11, 0x8d, 0x46, 0x91, 0xcb, 0xe5, 0xec, 0xd1,
+	0x6f, 0x9f, 0x04, 0x97, 0xcb, 0x05, 0x49, 0x92, 0x70, 0xed, 0xda, 0x35, 0xbc, 0xfa, 0xea, 0xab,
+	0xab, 0xa5, 0x52, 0xe9, 0x8d, 0x66, 0xb3, 0xb9, 0xa9, 0xeb, 0xfa, 0x4f, 0x00, 0x9c, 0x83, 0x03,
+	0xe4, 0xdf, 0x4e, 0x7c, 0xde, 0x09, 0xf0, 0x51, 0x2c, 0x02, 0x40, 0x2e, 0x97, 0x7b, 0x17, 0x00,
+	0xf2, 0xf9, 0x7c, 0xf8, 0x37, 0xbf, 0xf9, 0x4d, 0x3f, 0xc7, 0x71, 0x47, 0x7a, 0x7a, 0x7a, 0x02,
+	0x7e, 0xbf, 0xff, 0x77, 0xf6, 0xee, 0xdd, 0xfb, 0x48, 0x28, 0x14, 0xe2, 0x52, 0xa9, 0x14, 0xb2,
+	0xd9, 0x2c, 0x12, 0x89, 0x04, 0x7c, 0x3e, 0x1f, 0x0a, 0x85, 0x02, 0xae, 0x5f, 0xbf, 0x8e, 0xe5,
+	0xe5, 0x65, 0x78, 0xbd, 0x5e, 0x24, 0x93, 0x49, 0xf4, 0xf4, 0xf4, 0x7c, 0xec, 0x18, 0xd0, 0x34,
+	0x0d, 0xcb, 0xcb, 0xcb, 0xd8, 0xdc, 0xdc, 0xc4, 0xe6, 0xe6, 0xe6, 0xf7, 0x05, 0x41, 0xf8, 0x3f,
+	0x00, 0x5a, 0xdd, 0xfe, 0xe0, 0xb7, 0xc2, 0xe7, 0xfd, 0x08, 0xb8, 0x1b, 0xec, 0x01, 0x30, 0xe0,
+	0xf5, 0x7a, 0x4f, 0x06, 0x02, 0x81, 0x9e, 0x70, 0x38, 0x3c, 0xc5, 0xf3, 0x7c, 0xb6, 0x5a, 0xad,
+	0xb6, 0x9b, 0xcd, 0xe6, 0x9c, 0xae, 0xeb, 0xc5, 0x7d, 0xfb, 0xf6, 0x3d, 0xf2, 0xed, 0x6f, 0x7f,
+	0x3b, 0xf5, 0xe4, 0x93, 0x4f, 0x52, 0xa9, 0x54, 0xca, 0xae, 0xeb, 0x5b, 0x5b, 0x5b, 0xc3, 0xd5,
+	0xab, 0x57, 0xf1, 0x37, 0x7f, 0xf3, 0x37, 0x78, 0xe9, 0xa5, 0x97, 0x5e, 0x2a, 0x95, 0x4a, 0xdf,
+	0x05, 0x50, 0xea, 0xf6, 0x07, 0xba, 0x1d, 0x76, 0x09, 0xf0, 0xe9, 0x08, 0x01, 0x08, 0x63, 0x4b,
+	0xbf, 0xdf, 0xbc, 0xf9, 0xef, 0x9e, 0xc1, 0xc1, 0xc1, 0xff, 0x78, 0xf4, 0xe8, 0xd1, 0xe3, 0xc3,
+	0xc3, 0xc3, 0x51, 0xaf, 0xd7, 0x4b, 0xb5, 0xdb, 0x6d, 0x9c, 0x3f, 0x7f, 0xbe, 0x72, 0xfd, 0xfa,
+	0xf5, 0x53, 0x0b, 0x0b, 0x0b, 0xff, 0x53, 0xd7, 0xf5, 0xb7, 0xd1, 0xe5, 0x58, 0xff, 0x9d, 0x60,
+	0x97, 0x00, 0xf7, 0x86, 0x01, 0x00, 0xd3, 0x00, 0x3c, 0xd8, 0x92, 0x75, 0xdf, 0x07, 0x50, 0x40,
+	0x97, 0x7d, 0xfb, 0x5d, 0xec, 0x62, 0x17, 0xbb, 0xd8, 0xc5, 0x2e, 0x76, 0xb1, 0x8b, 0x5d, 0xec,
+	0xe2, 0xb6, 0xf8, 0xff, 0x41, 0xf3, 0x4e, 0xbd, 0x05, 0x07, 0xdc, 0x04, 0x00, 0x00, 0x00, 0x16,
+	0x74, 0x45, 0x58, 0x74, 0x74, 0x69, 0x66, 0x66, 0x3a, 0x72, 0x6f, 0x77, 0x73, 0x2d, 0x70, 0x65,
+	0x72, 0x2d, 0x73, 0x74, 0x72, 0x69, 0x70, 0x00, 0x31, 0x36, 0xa8, 0x15, 0x87, 0xf0, 0x00, 0x00,
+	0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82,
+};
blob - 4e4a4476ef430177805e5583a2a9734b462ff137
blob + 66bea8972b52ee1fe9190fe2a6b0c87594bc5015
--- src/cmd/devdraw/mkfile
+++ src/cmd/devdraw/mkfile
@@ -5,6 +5,7 @@ TARG=devdraw
 WSYSOFILES=\
 	devdraw.$O\
 	latin1.$O\
+	winsize.$O\
 	
 <|sh ./mkwsysrules.sh
 
blob - 84fad024c03dbd60307f30ab0d7a281abcbfd6da
blob + 1239b86b523f402f388c279f79086dcfd7b43464
--- src/cmd/devdraw/mkwsysrules.sh
+++ src/cmd/devdraw/mkwsysrules.sh
@@ -36,7 +36,6 @@ if [ "x$WSYSTYPE" = "xx11" -a "x$X11H" = "x" ]; then
 	fi
 fi
 	
-
 echo 'WSYSTYPE='$WSYSTYPE
 echo 'X11='$X11
 
@@ -45,7 +44,8 @@ if [ $WSYSTYPE = x11 ]; then
 	echo 'HFILES=$HFILES $XHFILES'
 	XO=`ls x11-*.c 2>/dev/null | sed 's/\.c$/.o/'`
 	echo 'WSYSOFILES=$WSYSOFILES '$XO
-fi
-if [ $WSYSTYPE = nowsys ]; then
+elif [ $WSYSTYPE = osx ]; then
+	echo 'WSYSOFILES=$WSYSOFILES osx-screen.o osx-draw.o osx-srv.o'
+elif [ $WSYSTYPE = nowsys ]; then
 	echo 'WSYSOFILES=nowsys.o'
 fi
blob - /dev/null
blob + d3f08331659a0e2fad8261e34ff7e77276f51e62 (mode 644)
--- /dev/null
+++ src/cmd/devdraw/osx-draw.c
@@ -0,0 +1,59 @@
+#include "u.h"
+#include "libc.h"
+#include "draw.h"
+#include "memdraw.h"
+
+Memimage*
+allocmemimage(Rectangle r, u32int chan)
+{
+	return _allocmemimage(r, chan);
+}
+
+void
+freememimage(Memimage *i)
+{
+	_freememimage(i);
+}
+
+void
+memfillcolor(Memimage *i, u32int val)
+{
+	_memfillcolor(i, val);
+}
+
+
+int
+cloadmemimage(Memimage *i, Rectangle r, uchar *data, int ndata)
+{
+	return _cloadmemimage(i, r, data, ndata);
+}
+
+void
+memimagedraw(Memimage *dst, Rectangle r, Memimage *src, Point sp, Memimage *mask, Point mp, int op)
+{
+	Memdrawparam *par;
+
+	par = _memimagedrawsetup(dst, r, src, sp, mask, mp, op);
+	if(par == nil)
+		return;
+	_memimagedraw(par);
+}
+
+u32int
+pixelbits(Memimage *m, Point p)
+{
+	return _pixelbits(m, p);
+}
+
+int
+loadmemimage(Memimage *i, Rectangle r, uchar *data, int ndata)
+{
+	return _loadmemimage(i, r, data, ndata);
+}
+
+int
+unloadmemimage(Memimage *i, Rectangle r, uchar *data, int ndata)
+{
+	return _unloadmemimage(i, r, data, ndata);
+}
+
blob - /dev/null
blob + 52328ace09dbe74b8a6d9c0a188e5eee9aeafc4a (mode 644)
--- /dev/null
+++ src/cmd/devdraw/osx-keycodes.h
@@ -0,0 +1,189 @@
+/* These are the Macintosh key scancode constants -- from Inside Macintosh */
+#define QZ_ESCAPE		0x35
+#define QZ_F1			0x7A
+#define QZ_F2			0x78
+#define QZ_F3			0x63
+#define QZ_F4			0x76
+#define QZ_F5			0x60
+#define QZ_F6			0x61
+#define QZ_F7			0x62
+#define QZ_F8			0x64
+#define QZ_F9			0x65
+#define QZ_F10			0x6D
+#define QZ_F11			0x67
+#define QZ_F12			0x6F
+#define QZ_PRINT		0x69
+#define QZ_SCROLLOCK    	0x6B
+#define QZ_PAUSE		0x71
+#define QZ_POWER		0x7F
+#define QZ_BACKQUOTE		0x32
+#define QZ_1			0x12
+#define QZ_2			0x13
+#define QZ_3			0x14
+#define QZ_4			0x15
+#define QZ_5			0x17
+#define QZ_6			0x16
+#define QZ_7			0x1A
+#define QZ_8			0x1C
+#define QZ_9			0x19
+#define QZ_0			0x1D
+#define QZ_MINUS		0x1B
+#define QZ_EQUALS		0x18
+#define QZ_BACKSPACE		0x33
+#define QZ_INSERT		0x72
+#define QZ_HOME			0x73
+#define QZ_PAGEUP		0x74
+#define QZ_NUMLOCK		0x47
+#define QZ_KP_EQUALS		0x51
+#define QZ_KP_DIVIDE		0x4B
+#define QZ_KP_MULTIPLY		0x43
+#define QZ_TAB			0x30
+#define QZ_q			0x0C
+#define QZ_w			0x0D
+#define QZ_e			0x0E
+#define QZ_r			0x0F
+#define QZ_t			0x11
+#define QZ_y			0x10
+#define QZ_u			0x20
+#define QZ_i			0x22
+#define QZ_o			0x1F
+#define QZ_p			0x23
+#define QZ_LEFTBRACKET		0x21
+#define QZ_RIGHTBRACKET		0x1E
+#define QZ_BACKSLASH		0x2A
+#define QZ_DELETE		0x75
+#define QZ_END			0x77
+#define QZ_PAGEDOWN		0x79
+#define QZ_KP7			0x59
+#define QZ_KP8			0x5B
+#define QZ_KP9			0x5C
+#define QZ_KP_MINUS		0x4E
+#define QZ_CAPSLOCK		0x39
+#define QZ_a			0x00
+#define QZ_s			0x01
+#define QZ_d			0x02
+#define QZ_f			0x03
+#define QZ_g			0x05
+#define QZ_h			0x04
+#define QZ_j			0x26
+#define QZ_k			0x28
+#define QZ_l			0x25
+#define QZ_SEMICOLON		0x29
+#define QZ_QUOTE		0x27
+#define QZ_RETURN		0x24
+#define QZ_KP4			0x56
+#define QZ_KP5			0x57
+#define QZ_KP6			0x58
+#define QZ_KP_PLUS		0x45
+#define QZ_LSHIFT		0x38
+#define QZ_z			0x06
+#define QZ_x			0x07
+#define QZ_c			0x08
+#define QZ_v			0x09
+#define QZ_b			0x0B
+#define QZ_n			0x2D
+#define QZ_m			0x2E
+#define QZ_COMMA		0x2B
+#define QZ_PERIOD		0x2F
+#define QZ_SLASH		0x2C
+/* These are the same as the left versions - use left by default */
+#if 0
+#define QZ_RSHIFT		0x38
+#endif
+#define QZ_UP			0x7E
+#define QZ_KP1			0x53
+#define QZ_KP2			0x54
+#define QZ_KP3			0x55
+#define QZ_KP_ENTER		0x4C
+#define QZ_LCTRL		0x3B
+#define QZ_LALT			0x3A
+#define QZ_LMETA		0x37
+#define QZ_SPACE		0x31
+/* These are the same as the left versions - use left by default */
+#if 0
+#define QZ_RMETA		0x37
+#define QZ_RALT			0x3A
+#define QZ_RCTRL		0x3B
+#endif
+#define QZ_LEFT			0x7B
+#define QZ_DOWN			0x7D
+#define QZ_RIGHT		0x7C
+#define QZ_KP0			0x52
+#define QZ_KP_PERIOD		0x41
+
+/* Wierd, these keys are on my iBook under MacOS X */
+#define QZ_IBOOK_ENTER		0x34
+#define QZ_IBOOK_LEFT		0x3B
+#define QZ_IBOOK_RIGHT		0x3C
+#define QZ_IBOOK_DOWN		0x3D
+#define QZ_IBOOK_UP		0x3E
+#define KEY_ENTER 13
+#define KEY_TAB 9
+
+#define KEY_BASE 0x100
+
+/*  Function keys  */
+#define KEY_F (KEY_BASE+64)
+
+/* Control keys */
+#define KEY_CTRL (KEY_BASE)
+#define KEY_BACKSPACE (KEY_CTRL+0)
+#define KEY_DELETE (KEY_CTRL+1)
+#define KEY_INSERT (KEY_CTRL+2)
+#define KEY_HOME (KEY_CTRL+3)
+#define KEY_END (KEY_CTRL+4)
+#define KEY_PAGE_UP (KEY_CTRL+5)
+#define KEY_PAGE_DOWN (KEY_CTRL+6)
+#define KEY_ESC (KEY_CTRL+7)
+
+/* Control keys short name */
+#define KEY_BS KEY_BACKSPACE
+#define KEY_DEL KEY_DELETE
+#define KEY_INS KEY_INSERT
+#define KEY_PGUP KEY_PAGE_UP
+#define KEY_PGDOWN KEY_PAGE_DOWN
+#define KEY_PGDWN KEY_PAGE_DOWN
+
+/* Cursor movement */
+#define KEY_CRSR (KEY_BASE+16)
+#define KEY_RIGHT (KEY_CRSR+0)
+#define KEY_LEFT (KEY_CRSR+1)
+#define KEY_DOWN (KEY_CRSR+2)
+#define KEY_UP (KEY_CRSR+3)
+
+/* Multimedia keyboard/remote keys */
+#define KEY_MM_BASE (0x100+384)
+#define KEY_POWER (KEY_MM_BASE+0)
+#define KEY_MENU (KEY_MM_BASE+1)
+#define KEY_PLAY (KEY_MM_BASE+2)
+#define KEY_PAUSE (KEY_MM_BASE+3)
+#define KEY_PLAYPAUSE (KEY_MM_BASE+4)
+#define KEY_STOP (KEY_MM_BASE+5)
+#define KEY_FORWARD (KEY_MM_BASE+6)
+#define KEY_REWIND (KEY_MM_BASE+7)
+#define KEY_NEXT (KEY_MM_BASE+8)
+#define KEY_PREV (KEY_MM_BASE+9)
+#define KEY_VOLUME_UP (KEY_MM_BASE+10)
+#define KEY_VOLUME_DOWN (KEY_MM_BASE+11)
+#define KEY_MUTE (KEY_MM_BASE+12)
+
+/* Keypad keys */
+#define KEY_KEYPAD (KEY_BASE+32)
+#define KEY_KP0 (KEY_KEYPAD+0)
+#define KEY_KP1 (KEY_KEYPAD+1)
+#define KEY_KP2 (KEY_KEYPAD+2)
+#define KEY_KP3 (KEY_KEYPAD+3)
+#define KEY_KP4 (KEY_KEYPAD+4)
+#define KEY_KP5 (KEY_KEYPAD+5)
+#define KEY_KP6 (KEY_KEYPAD+6)
+#define KEY_KP7 (KEY_KEYPAD+7)
+#define KEY_KP8 (KEY_KEYPAD+8)
+#define KEY_KP9 (KEY_KEYPAD+9)
+#define KEY_KPDEC (KEY_KEYPAD+10)
+#define KEY_KPINS (KEY_KEYPAD+11)
+#define KEY_KPDEL (KEY_KEYPAD+12)
+#define KEY_KPENTER (KEY_KEYPAD+13)
+
+/* Special keys */
+#define KEY_INTERN (0x1000)
+#define KEY_CLOSE_WIN (KEY_INTERN+0)
blob - /dev/null
blob + c8c05705618c9e4c29a054a74eefa459498f099a (mode 644)
--- /dev/null
+++ src/cmd/devdraw/osx-screen.c
@@ -0,0 +1,714 @@
+#define Point OSXPoint
+#define Rect OSXRect
+#define Cursor OSXCursor
+#include <Carbon/Carbon.h>
+#include <QuickTime/QuickTime.h> // for full screen
+
+
+#undef Rect
+#undef Point
+#undef Cursor
+#undef offsetof
+#undef nil
+
+#include "u.h"
+#include "libc.h"
+#include <thread.h>
+#include <draw.h>
+#include <memdraw.h>
+#include <keyboard.h>
+#include "mouse.h"
+#include <cursor.h>
+#include "osx-screen.h"
+#include "osx-keycodes.h"
+#include "devdraw.h"
+#include "glendapng.h"
+
+#define panic sysfatal
+
+extern Rectangle mouserect;
+
+struct {
+	char *label;
+	char *winsize;
+
+	Rectangle fullscreenr;
+	Rectangle screenr;
+	Memimage *screenimage;
+	int isfullscreen;
+	Rectangle nonfullscreenr;
+	
+	Point xy;
+	int buttons;
+	int kbuttons;
+
+	CGDataProviderRef provider;
+	MenuRef wmenu;
+	MenuRef vmenu;
+	WindowRef window;
+	CGImageRef image;
+	WindowGroupRef wingroup;
+	PasteboardRef snarf;
+} osx;
+
+enum
+{
+	WindowAttrs =
+		kWindowCloseBoxAttribute |
+		kWindowCollapseBoxAttribute |
+		kWindowResizableAttribute |
+		kWindowStandardHandlerAttribute |
+		kWindowFullZoomAttribute
+};
+
+static void screenproc(void*);
+static void eresized(int);
+static void fullscreen(int);
+static void seticon(void);
+
+static OSStatus quithandler(EventHandlerCallRef, EventRef, void*);
+static OSStatus eventhandler(EventHandlerCallRef, EventRef, void*);
+static OSStatus cmdhandler(EventHandlerCallRef, EventRef, void*);
+
+enum
+{
+	CmdFullScreen = 1,
+};
+
+void screeninit(void);
+
+Memimage*
+attachscreen(char *label, char *winsize)
+{
+	if(label == nil)
+		label = "gnot a label";
+	osx.label = label;
+	osx.winsize = winsize;
+	if(osx.screenimage == nil){
+		screeninit();
+		if(osx.screenimage == nil)
+			panic("cannot create OS X screen");
+	}
+	return osx.screenimage;
+}
+
+void
+_screeninit(void)
+{
+	CGRect cgr;
+	OSXRect or;
+	Rectangle r;
+	int havemin;
+
+	memimageinit();
+
+	ProcessSerialNumber psn = { 0, kCurrentProcess };
+	TransformProcessType(&psn, kProcessTransformToForegroundApplication);
+	SetFrontProcess(&psn);
+
+	cgr = CGDisplayBounds(CGMainDisplayID());
+	osx.fullscreenr = Rect(0, 0, cgr.size.width, cgr.size.height);
+	
+	InitCursor();
+	
+	// Create minimal menu with full-screen option.
+	ClearMenuBar();
+	CreateStandardWindowMenu(0, &osx.wmenu);
+	InsertMenu(osx.wmenu, 0);
+	MenuItemIndex ix;
+	CreateNewMenu(1004, 0, &osx.vmenu);	// XXX 1004?
+	SetMenuTitleWithCFString(osx.vmenu, CFSTR("View"));
+	AppendMenuItemTextWithCFString(osx.vmenu,
+		CFSTR("Full Screen"), 0, CmdFullScreen, &ix);
+	SetMenuItemCommandKey(osx.vmenu, ix, 0, 'F');
+	AppendMenuItemTextWithCFString(osx.vmenu,
+		CFSTR("Ctl-Opt exits full screen"),
+		kMenuItemAttrDisabled, CmdFullScreen, &ix);
+	InsertMenu(osx.vmenu, GetMenuID(osx.wmenu));
+	DrawMenuBar();
+
+	// Create the window.
+	r = Rect(0, 0, Dx(osx.fullscreenr)*2/3, Dy(osx.fullscreenr)*2/3);
+	havemin = 0;
+	if(osx.winsize && osx.winsize[0]){
+		if(parsewinsize(osx.winsize, &r, &havemin) < 0)
+			sysfatal("%r");
+	}
+	if(!havemin)
+		r = rectaddpt(r, Pt((Dx(osx.fullscreenr)-Dx(r))/2, (Dy(osx.fullscreenr)-Dy(r))/2));
+	or.left = r.min.x;
+	or.top = r.min.y;
+	or.right = r.max.x;
+	or.bottom = r.max.y;
+	CreateNewWindow(kDocumentWindowClass, WindowAttrs, &or, &osx.window);
+	CreateWindowGroup(0, &osx.wingroup);
+	SetWindowGroup(osx.window, osx.wingroup);
+	setlabel(osx.label);
+	seticon();
+	
+	// Set up the clip board.
+	if(PasteboardCreate(kPasteboardClipboard, &osx.snarf) != noErr)
+		panic("pasteboard create");
+
+	// Explain in great detail which events we want to handle.
+	// Why can't we just have one handler?
+	const EventTypeSpec quits[] = {
+		{ kEventClassApplication, kEventAppQuit }
+	};
+	const EventTypeSpec cmds[] = {
+		{ kEventClassWindow, kEventWindowClosed },
+		{ kEventClassWindow, kEventWindowBoundsChanged },
+		{ kEventClassCommand, kEventCommandProcess }
+	};
+	const EventTypeSpec events[] = {
+		{ kEventClassKeyboard, kEventRawKeyDown },
+		{ kEventClassKeyboard, kEventRawKeyModifiersChanged },
+		{ kEventClassKeyboard, kEventRawKeyRepeat },
+		{ kEventClassMouse, kEventMouseDown },
+		{ kEventClassMouse, kEventMouseUp },
+		{ kEventClassMouse, kEventMouseMoved },
+		{ kEventClassMouse, kEventMouseDragged },
+		{ kEventClassMouse, kEventMouseWheelMoved },
+	};
+
+	InstallApplicationEventHandler(
+		NewEventHandlerUPP(quithandler),
+		nelem(quits), quits, nil, nil);
+
+ 	InstallApplicationEventHandler(
+ 		NewEventHandlerUPP(eventhandler),
+		nelem(events), events, nil, nil);
+
+	InstallWindowEventHandler(osx.window,
+		NewEventHandlerUPP(cmdhandler),
+		nelem(cmds), cmds, osx.window, nil);
+
+	// Finally, put the window on the screen.
+	ShowWindow(osx.window);
+	ShowMenuBar();
+	eresized(0);
+	SelectWindow(osx.window);
+	
+	InitCursor();
+}
+
+static Rendez scr;
+static QLock slock;
+
+void
+screeninit(void)
+{
+	scr.l = &slock;
+	qlock(scr.l);
+	proccreate(screenproc, nil, 256*1024);
+	while(osx.window == nil)
+		rsleep(&scr);
+	qunlock(scr.l);
+}
+
+static void
+screenproc(void *v)
+{
+	qlock(scr.l);
+	_screeninit();
+	rwakeup(&scr);
+	qunlock(scr.l);
+	RunApplicationEventLoop();
+}
+
+static OSStatus kbdevent(EventRef);
+static OSStatus mouseevent(EventRef);
+
+static OSStatus
+cmdhandler(EventHandlerCallRef next, EventRef event, void *arg)
+{
+	return eventhandler(next, event, arg);
+}
+
+static OSStatus
+quithandler(EventHandlerCallRef next, EventRef event, void *arg)
+{
+	exit(0);
+	return 0;
+}
+
+static OSStatus
+eventhandler(EventHandlerCallRef next, EventRef event, void *arg)
+{
+	OSStatus result;
+
+	result = CallNextEventHandler(next, event);
+
+	switch(GetEventClass(event)){
+	case kEventClassKeyboard:
+		return kbdevent(event);
+	
+	case kEventClassMouse:
+		return mouseevent(event);
+	
+	case kEventClassCommand:;
+		HICommand cmd;
+		GetEventParameter(event, kEventParamDirectObject,
+			typeHICommand, nil, sizeof cmd, nil, &cmd);
+		switch(cmd.commandID){
+		case kHICommandQuit:
+			exit(0);
+		
+		case CmdFullScreen:
+			fullscreen(1);
+			break;
+		
+		default:
+			return eventNotHandledErr;
+		}
+		break;
+	
+	case kEventClassWindow:;
+		switch(GetEventKind(event)){
+		case kEventWindowClosed:
+			exit(0);
+		
+		case kEventWindowBoundsChanged:
+			eresized(1);
+			break;
+		
+		default:
+			return eventNotHandledErr;
+		}
+		break;
+	}
+	
+	return result;
+}
+
+static ulong
+msec(void)
+{
+	return nsec()/1000000;
+}
+
+static OSStatus
+mouseevent(EventRef event)
+{
+	int wheel;
+	OSXPoint op;
+	
+	GetEventParameter(event, kEventParamMouseLocation,
+		typeQDPoint, 0, sizeof op, 0, &op);
+
+	osx.xy = subpt(Pt(op.h, op.v), osx.screenr.min);
+	wheel = 0;
+
+	switch(GetEventKind(event)){
+	case kEventMouseWheelMoved:;
+		SInt32 delta;
+		GetEventParameter(event, kEventParamMouseWheelDelta,
+			typeSInt32, 0, sizeof delta, 0, &delta);
+		if(delta > 0)
+			wheel = 8;
+		else
+			wheel = 16;
+		break;
+	
+	case kEventMouseDown:
+	case kEventMouseUp:;
+		UInt32 but, mod;
+		GetEventParameter(event, kEventParamMouseChord,
+			typeUInt32, 0, sizeof but, 0, &but);
+		GetEventParameter(event, kEventParamKeyModifiers,
+			typeUInt32, 0, sizeof mod, 0, &mod);
+		
+		// OS X swaps button 2 and 3
+		but = (but & ~6) | ((but & 4)>>1) | ((but&2)<<1);
+		
+		// Apply keyboard modifiers and pretend it was a real mouse button.
+		// (Modifiers typed while holding the button go into kbuttons,
+		// but this one does not.)
+		if(but == 1){
+			if(mod & optionKey)
+				but = 2;
+			else if(mod & cmdKey)
+				but = 4;
+		}
+		osx.buttons = but;
+		break;
+
+	case kEventMouseMoved:
+	case kEventMouseDragged:
+		break;
+	
+	default:
+		return eventNotHandledErr;
+	}
+
+	mousetrack(osx.xy.x, osx.xy.y, osx.buttons|osx.kbuttons, msec());
+	return noErr;	
+}
+
+static int keycvt[] =
+{
+	[QZ_IBOOK_ENTER] '\n',
+	[QZ_RETURN] '\n',
+	[QZ_ESCAPE] 27,
+	[QZ_BACKSPACE] '\b',
+	[QZ_LALT] Kalt,
+	[QZ_LCTRL] Kctl,
+	[QZ_LSHIFT] Kshift,
+	[QZ_F1] KF+1,
+	[QZ_F2] KF+2,
+	[QZ_F3] KF+3,
+	[QZ_F4] KF+4,
+	[QZ_F5] KF+5,
+	[QZ_F6] KF+6,
+	[QZ_F7] KF+7,
+	[QZ_F8] KF+8,
+	[QZ_F9] KF+9,
+	[QZ_F10] KF+10,
+	[QZ_F11] KF+11,
+	[QZ_F12] KF+12,
+	[QZ_INSERT] Kins,
+	[QZ_DELETE] 0x7F,
+	[QZ_HOME] Khome,
+	[QZ_END] Kend,
+	[QZ_KP_PLUS] '+',
+	[QZ_KP_MINUS] '-',
+	[QZ_TAB] '\t',
+	[QZ_PAGEUP] Kpgup,
+	[QZ_PAGEDOWN] Kpgdown,
+	[QZ_UP] Kup,
+	[QZ_DOWN] Kdown,
+	[QZ_LEFT] Kleft,
+	[QZ_RIGHT] Kright,
+	[QZ_KP_MULTIPLY] '*',
+	[QZ_KP_DIVIDE] '/',
+	[QZ_KP_ENTER] '\n',
+	[QZ_KP_PERIOD] '.',
+	[QZ_KP0] '0',
+	[QZ_KP1] '1',
+	[QZ_KP2] '2',
+	[QZ_KP3] '3',
+	[QZ_KP4] '4',
+	[QZ_KP5] '5',
+	[QZ_KP6] '6',
+	[QZ_KP7] '7',
+	[QZ_KP8] '8',
+	[QZ_KP9] '9',
+};
+
+static OSStatus
+kbdevent(EventRef event)
+{
+	char ch;
+	UInt32 code;
+	UInt32 mod;
+	int k;
+
+	GetEventParameter(event, kEventParamKeyMacCharCodes,
+		typeChar, nil, sizeof ch, nil, &ch);
+	GetEventParameter(event, kEventParamKeyCode,
+		typeUInt32, nil, sizeof code, nil, &code);
+	GetEventParameter(event, kEventParamKeyModifiers,
+		typeUInt32, nil, sizeof mod, nil, &mod);
+
+	switch(GetEventKind(event)){
+	case kEventRawKeyDown:
+	case kEventRawKeyRepeat:
+		if(mod == cmdKey){
+			if(ch == 'F' && osx.isfullscreen){
+				fullscreen(0);
+				break;
+			}
+			return eventNotHandledErr;
+		}
+		k = ch;
+		if(code < nelem(keycvt) && keycvt[code])
+			k = keycvt[code];
+		if(k >= 0)
+			keystroke(k);
+		break;
+
+	case kEventRawKeyModifiersChanged:
+		if(!osx.buttons && !osx.kbuttons){
+			if(mod == optionKey)
+				keystroke(Kalt);
+			break;
+		}
+		
+		// If the mouse button is being held down, treat 
+		// changes in the keyboard modifiers as changes
+		// in the mouse buttons.
+		osx.kbuttons = 0;
+		if(mod & optionKey)
+			osx.kbuttons |= 2;
+		if(mod & cmdKey)
+			osx.kbuttons |= 4;
+		mousetrack(osx.xy.x, osx.xy.y, osx.buttons|osx.kbuttons, msec());
+		break;
+	}
+	return noErr;
+}
+
+static void
+eresized(int new)
+{
+	Memimage *m;
+	OSXRect or;
+	ulong chan;
+	Rectangle r;
+	int bpl;
+	CGDataProviderRef provider;
+	CGImageRef image;
+	
+	GetWindowBounds(osx.window, kWindowContentRgn, &or);
+	r = Rect(or.left, or.top, or.right, or.bottom);
+	if(Dx(r) == Dx(osx.screenr) && Dy(r) == Dy(osx.screenr)){
+		// No need to make new image.
+		osx.screenr = r;
+		return;
+	}
+
+	chan = XBGR32;
+	m = allocmemimage(Rect(0, 0, Dx(r), Dy(r)), chan);
+	if(m == nil)
+		panic("allocmemimage: %r");
+	if(m->data == nil)
+		panic("m->data == nil");
+	bpl = bytesperline(r, 32);
+	provider = CGDataProviderCreateWithData(0,
+		m->data->bdata, Dy(r)*bpl, 0);
+	image = CGImageCreate(Dx(r), Dy(r), 8, 32, bpl,
+		CGColorSpaceCreateDeviceRGB(),
+		kCGImageAlphaNoneSkipLast,
+		provider, 0, 0, kCGRenderingIntentDefault);
+	CGDataProviderRelease(provider);	// CGImageCreate did incref
+	
+	mouserect = m->r;
+	if(new)
+		mouseresized = 1;
+//	termreplacescreenimage(m);
+	_drawreplacescreenimage(m);	// frees old osx.screenimage if any
+	if(osx.image)
+		CGImageRelease(osx.image);
+	osx.image = image;
+	osx.screenimage = m;
+	osx.screenr = r;
+}
+
+void
+_flushmemscreen(Rectangle r)
+{
+	CGRect cgr;
+	CGContextRef context;
+	CGImageRef subimg;
+
+	QDBeginCGContext(GetWindowPort(osx.window), &context);
+	
+	cgr.origin.x = r.min.x;
+	cgr.origin.y = r.min.y;
+	cgr.size.width = Dx(r);
+	cgr.size.height = Dy(r);
+	subimg = CGImageCreateWithImageInRect(osx.image, cgr);
+	cgr.origin.y = Dy(osx.screenr) - r.max.y; // XXX how does this make any sense?
+	CGContextDrawImage(context, cgr, subimg);
+	CGContextFlush(context);
+	CGImageRelease(subimg);
+
+	QDEndCGContext(GetWindowPort(osx.window), &context);
+}
+
+void
+fullscreen(int x)
+{
+}
+
+void
+setmouse(Point p)
+{
+	CGPoint cgp;
+	
+	cgp.x = p.x + osx.screenr.min.x;
+	cgp.y = p.y + osx.screenr.min.y;
+	CGWarpMouseCursorPosition(cgp);
+}
+
+void
+setcursor(Cursor *c)
+{
+	OSXCursor oc;
+	int i;
+
+	if(c == nil){
+		InitCursor();
+		return;
+	}
+	
+	// SetCursor is deprecated, but what replaces it?
+	for(i=0; i<16; i++){
+		oc.data[i] = ((ushort*)c->set)[i];
+		oc.mask[i] = oc.data[i] | ((ushort*)c->clr)[i];
+	}
+	oc.hotSpot.h = - c->offset.x;
+	oc.hotSpot.v = - c->offset.y;
+	SetCursor(&oc);
+}
+
+void
+getcolor(ulong i, ulong *r, ulong *g, ulong *b)
+{
+	ulong v;
+	
+	v = 0;
+	*r = (v>>16)&0xFF;
+	*g = (v>>8)&0xFF;
+	*b = v&0xFF;
+}
+
+int
+setcolor(ulong i, ulong r, ulong g, ulong b)
+{
+	/* no-op */
+	return 0;
+}
+
+
+int
+hwdraw(Memdrawparam *p)
+{
+	return 0;
+}
+
+struct {
+	QLock lk;
+	char buf[SnarfSize];
+	Rune rbuf[SnarfSize];
+	PasteboardRef apple;
+} clip;
+
+char*
+getsnarf(void)
+{
+	char *s, *t;
+	CFArrayRef flavors;
+	CFDataRef data;
+	CFIndex nflavor, ndata, j;
+	CFStringRef type;
+	ItemCount nitem;
+	PasteboardItemID id;
+	PasteboardSyncFlags flags;
+	UInt32 i;
+
+/*	fprint(2, "applegetsnarf\n"); */
+	qlock(&clip.lk);
+	clip.apple = osx.snarf;
+	if(clip.apple == nil){
+		if(PasteboardCreate(kPasteboardClipboard, &clip.apple) != noErr){
+			fprint(2, "apple pasteboard create failed\n");
+			qunlock(&clip.lk);
+			return nil;
+		}
+	}
+	flags = PasteboardSynchronize(clip.apple);
+	if(flags&kPasteboardClientIsOwner){
+		s = strdup(clip.buf);
+		qunlock(&clip.lk);
+		return s;
+	}
+	if(PasteboardGetItemCount(clip.apple, &nitem) != noErr){
+		fprint(2, "apple pasteboard get item count failed\n");
+		qunlock(&clip.lk);
+		return nil;
+	}
+	for(i=1; i<=nitem; i++){
+		if(PasteboardGetItemIdentifier(clip.apple, i, &id) != noErr)
+			continue;
+		if(PasteboardCopyItemFlavors(clip.apple, id, &flavors) != noErr)
+			continue;
+		nflavor = CFArrayGetCount(flavors);
+		for(j=0; j<nflavor; j++){
+			type = (CFStringRef)CFArrayGetValueAtIndex(flavors, j);
+			if(!UTTypeConformsTo(type, CFSTR("public.utf16-plain-text")))
+				continue;
+			if(PasteboardCopyItemFlavorData(clip.apple, id, type, &data) != noErr)
+				continue;
+			ndata = CFDataGetLength(data);
+			qunlock(&clip.lk);
+			s = smprint("%.*S", ndata/2, (Rune*)CFDataGetBytePtr(data));
+			CFRelease(flavors);
+			CFRelease(data);
+			for(t=s; *t; t++)
+				if(*t == '\r')
+					*t = '\n';
+			return s;
+		}
+		CFRelease(flavors);
+	}
+	qunlock(&clip.lk);
+	return nil;		
+}
+
+void
+putsnarf(char *s)
+{
+	CFDataRef cfdata;
+	PasteboardSyncFlags flags;
+
+/*	fprint(2, "appleputsnarf\n"); */
+
+	if(strlen(s) >= SnarfSize)
+		return;
+	qlock(&clip.lk);
+	strcpy(clip.buf, s);
+	runesnprint(clip.rbuf, nelem(clip.rbuf), "%s", s);
+	clip.apple = osx.snarf;
+	if(PasteboardClear(clip.apple) != noErr){
+		fprint(2, "apple pasteboard clear failed\n");
+		qunlock(&clip.lk);
+		return;
+	}
+	flags = PasteboardSynchronize(clip.apple);
+	if((flags&kPasteboardModified) || !(flags&kPasteboardClientIsOwner)){
+		fprint(2, "apple pasteboard cannot assert ownership\n");
+		qunlock(&clip.lk);
+		return;
+	}
+	cfdata = CFDataCreate(kCFAllocatorDefault, 
+		(uchar*)clip.rbuf, runestrlen(clip.rbuf)*2);
+	if(cfdata == nil){
+		fprint(2, "apple pasteboard cfdatacreate failed\n");
+		qunlock(&clip.lk);
+		return;
+	}
+	if(PasteboardPutItemFlavor(clip.apple, (PasteboardItemID)1,
+		CFSTR("public.utf16-plain-text"), cfdata, 0) != noErr){
+		fprint(2, "apple pasteboard putitem failed\n");
+		CFRelease(cfdata);
+		qunlock(&clip.lk);
+		return;
+	}
+	/* CFRelease(cfdata); ??? */
+	qunlock(&clip.lk);
+}
+
+void
+setlabel(char *label)
+{
+	CFStringRef cs;
+
+	cs = CFStringCreateWithBytes(nil, (uchar*)osx.label, strlen(osx.label), kCFStringEncodingUTF8, false);
+	SetWindowTitleWithCFString(osx.window, cs);
+}
+
+static void
+seticon(void)
+{
+	CGImageRef im;
+	CGDataProviderRef d;
+
+	d = CGDataProviderCreateWithData(nil, glenda_png, sizeof glenda_png, nil);
+	im = CGImageCreateWithPNGDataProvider(d, nil, true, kCGRenderingIntentDefault);
+	if(im)
+		SetApplicationDockTileImage(im);
+	CGImageRelease(im);
+	CGDataProviderRelease(d);
+}
+
blob - /dev/null
blob + 522046862b45b9d178255dca1b5e9789bb55e1ac (mode 644)
--- /dev/null
+++ src/cmd/devdraw/osx-screen.h
@@ -0,0 +1,17 @@
+void	zlock(void);
+void	zunlock(void);
+
+#define setcursor dsetcursor
+
+Memimage *attachscreen(char*, char*);
+void	setmouse(Point);
+void	setcursor(Cursor*);
+void	setlabel(char*);
+char*	getsnarf(void);
+void	putsnarf(char*);
+
+void	mousetrack(int, int, int, int);
+void	keystroke(int);
+
+extern	Rectangle mouserect;
+extern	int	mouseresized;
blob - /dev/null
blob + 9dded63285467e139e2c28a35bfba0dd57ac88da (mode 644)
--- /dev/null
+++ src/cmd/devdraw/osx-srv.c
@@ -0,0 +1,410 @@
+/*
+ * Window system protocol server.
+ */
+
+#include <u.h>
+#include <errno.h>
+#include <sys/select.h>
+#include <libc.h>
+#include <thread.h>
+#include <draw.h>
+#include <memdraw.h>
+#include <memlayer.h>
+#include <keyboard.h>
+#include <mouse.h>
+#include <cursor.h>
+#include <drawfcall.h>
+#include "osx-screen.h"
+#include "devdraw.h"
+
+#undef time
+
+#define MouseMask (\
+	ButtonPressMask|\
+	ButtonReleaseMask|\
+	PointerMotionMask|\
+	Button1MotionMask|\
+	Button2MotionMask|\
+	Button3MotionMask)
+
+#define Mask MouseMask|ExposureMask|StructureNotifyMask|KeyPressMask|EnterWindowMask|LeaveWindowMask
+
+typedef struct Kbdbuf Kbdbuf;
+typedef struct Mousebuf Mousebuf;
+typedef struct Fdbuf Fdbuf;
+typedef struct Tagbuf Tagbuf;
+
+struct Kbdbuf
+{
+	Rune r[32];
+	int ri;
+	int wi;
+	int stall;
+};
+
+struct Mousebuf
+{
+	Mouse m[32];
+	int ri;
+	int wi;
+	int stall;
+};
+
+struct Tagbuf
+{
+	int t[32];
+	int ri;
+	int wi;
+};
+
+Kbdbuf kbd;
+Mousebuf mouse;
+Tagbuf kbdtags;
+Tagbuf mousetags;
+
+void fdslide(Fdbuf*);
+void runmsg(Wsysmsg*);
+void replymsg(Wsysmsg*);
+void matchkbd(void);
+void matchmouse(void);
+int fdnoblock(int);
+Rectangle mouserect;
+int mouseresized;
+
+
+QLock lk;
+void
+zlock(void)
+{
+	qlock(&lk);
+}
+
+void
+zunlock(void)
+{
+	qunlock(&lk);
+}
+
+int chatty;
+int drawsleep;
+int trace;
+
+void
+usage(void)
+{
+	fprint(2, "usage: devdraw (don't run directly)\n");
+	threadexitsall("usage");
+}
+
+void
+bell(void *v, char *msg)
+{
+	if(strcmp(msg, "alarm") == 0)
+		drawsleep = drawsleep ? 0 : 1000;
+	noted(NCONT);
+}
+
+void
+threadmain(int argc, char **argv)
+{
+	uchar buf[4], *mbuf;
+	int nmbuf, n, nn;
+	Wsysmsg m;
+
+	/*
+	 * Move the protocol off stdin/stdout so that
+	 * any inadvertent prints don't screw things up.
+	 */
+	dup(0, 3);
+	dup(1, 4);
+	close(0);
+	close(1);
+	open("/dev/null", OREAD);
+	open("/dev/null", OWRITE);
+
+//trace = 1;
+	fmtinstall('W', drawfcallfmt);
+
+	ARGBEGIN{
+	case 'D':
+		chatty++;
+		break;
+	default:
+		usage();
+	}ARGEND
+
+	/*
+	 * Ignore arguments.  They're only for good ps -a listings.
+	 */
+	
+	notify(bell);
+
+	mbuf = nil;
+	nmbuf = 0;
+	while((n = read(3, buf, 4)) == 4){
+		GET(buf, n);
+		if(n > nmbuf){
+			free(mbuf);
+			mbuf = malloc(4+n);
+			if(mbuf == nil)
+				sysfatal("malloc: %r");
+			nmbuf = n;
+		}
+		memmove(mbuf, buf, 4);
+		nn = readn(3, mbuf+4, n-4);
+		if(nn != n-4)
+			sysfatal("eof during message");
+
+		/* pick off messages one by one */
+		if(convM2W(mbuf, nn+4, &m) <= 0)
+			sysfatal("cannot convert message");
+		if(trace) fprint(2, "<- %W\n", &m);
+		runmsg(&m);
+	}
+	threadexitsall(0);
+}
+
+void
+replyerror(Wsysmsg *m)
+{
+	char err[256];
+	
+	rerrstr(err, sizeof err);
+	m->type = Rerror;
+	m->error = err;
+	replymsg(m);
+}
+
+/* 
+ * Handle a single wsysmsg. 
+ * Might queue for later (kbd, mouse read)
+ */
+void
+runmsg(Wsysmsg *m)
+{
+	static uchar buf[65536];
+	int n;
+	Memimage *i;
+	
+	switch(m->type){
+	case Tinit:
+		memimageinit();
+		i = attachscreen(m->label, m->winsize);
+		_initdisplaymemimage(i);
+		replymsg(m);
+		break;
+
+	case Trdmouse:
+		zlock();
+		mousetags.t[mousetags.wi++] = m->tag;
+		if(mousetags.wi == nelem(mousetags.t))
+			mousetags.wi = 0;
+		if(mousetags.wi == mousetags.ri)
+			sysfatal("too many queued mouse reads");
+		/* fprint(2, "mouse unstall\n"); */
+		mouse.stall = 0;
+		matchmouse();
+		zunlock();
+		break;
+
+	case Trdkbd:
+		zlock();
+		kbdtags.t[kbdtags.wi++] = m->tag;
+		if(kbdtags.wi == nelem(kbdtags.t))
+			kbdtags.wi = 0;
+		if(kbdtags.wi == kbdtags.ri)
+			sysfatal("too many queued keyboard reads");
+		kbd.stall = 0;
+		matchkbd();
+		zunlock();
+		break;
+
+	case Tmoveto:
+		setmouse(m->mouse.xy);
+		replymsg(m);
+		break;
+
+	case Tcursor:
+		if(m->arrowcursor)
+			setcursor(nil);
+		else
+			setcursor(&m->cursor);
+		replymsg(m);
+		break;
+			
+	case Tbouncemouse:
+	//	_xbouncemouse(&m->mouse);
+		replymsg(m);
+		break;
+
+	case Tlabel:
+		setlabel(m->label);
+		replymsg(m);
+		break;
+
+	case Trdsnarf:
+		m->snarf = getsnarf();
+		replymsg(m);
+		free(m->snarf);
+		break;
+
+	case Twrsnarf:
+		putsnarf(m->snarf);
+		replymsg(m);
+		break;
+
+	case Trddraw:
+		n = m->count;
+		if(n > sizeof buf)
+			n = sizeof buf;
+		n = _drawmsgread(buf, n);
+		if(n < 0)
+			replyerror(m);
+		else{
+			m->count = n;
+			m->data = buf;
+			replymsg(m);
+		}
+		break;
+
+	case Twrdraw:
+		if(_drawmsgwrite(m->data, m->count) < 0)
+			replyerror(m);
+		else
+			replymsg(m);
+		break;
+	
+	case Ttop:
+	//	_xtopwindow();
+		replymsg(m);
+		break;
+	
+	case Tresize:
+	//	_xresizewindow(m->rect);
+		replymsg(m);
+		break;
+	}
+}
+
+/*
+ * Reply to m.
+ */
+void
+replymsg(Wsysmsg *m)
+{
+	int n;
+	static uchar *mbuf;
+	static int nmbuf;
+
+	/* T -> R msg */
+	if(m->type%2 == 0)
+		m->type++;
+		
+	if(trace) fprint(2, "-> %W\n", m);
+	/* copy to output buffer */
+	n = sizeW2M(m);
+	if(n > nmbuf){
+		free(mbuf);
+		mbuf = malloc(n);
+		if(mbuf == nil)
+			sysfatal("out of memory");
+		nmbuf = n;
+	}
+	convW2M(m, mbuf, n);
+	write(4, mbuf, n);
+}
+
+/*
+ * Match queued kbd reads with queued kbd characters.
+ */
+void
+matchkbd(void)
+{
+	Wsysmsg m;
+	
+	if(kbd.stall)
+		return;
+	while(kbd.ri != kbd.wi && kbdtags.ri != kbdtags.wi){
+		m.type = Rrdkbd;
+		m.tag = kbdtags.t[kbdtags.ri++];
+		if(kbdtags.ri == nelem(kbdtags.t))
+			kbdtags.ri = 0;
+		m.rune = kbd.r[kbd.ri++];
+		if(kbd.ri == nelem(kbd.r))
+			kbd.ri = 0;
+		replymsg(&m);
+	}
+}
+
+/*
+ * Match queued mouse reads with queued mouse events.
+ */
+void
+matchmouse(void)
+{
+	Wsysmsg m;
+	
+	while(mouse.ri != mouse.wi && mousetags.ri != mousetags.wi){
+		m.type = Rrdmouse;
+		m.tag = mousetags.t[mousetags.ri++];
+		if(mousetags.ri == nelem(mousetags.t))
+			mousetags.ri = 0;
+		m.mouse = mouse.m[mouse.ri];
+		m.resized = mouseresized;
+		/*
+		if(m.resized)
+			fprint(2, "sending resize\n");
+		*/
+		mouseresized = 0;
+		mouse.ri++;
+		if(mouse.ri == nelem(mouse.m))
+			mouse.ri = 0;
+		replymsg(&m);
+	}
+}
+
+void
+mousetrack(int x, int y, int b, int ms)
+{
+	Mouse *m;
+	
+	if(x < mouserect.min.x)
+		x = mouserect.min.x;
+	if(x > mouserect.max.x)
+		x = mouserect.max.x;
+	if(y < mouserect.min.y)
+		y = mouserect.min.y;
+	if(y > mouserect.max.y)
+		y = mouserect.max.y;
+
+	zlock();
+	m = &mouse.m[mouse.wi];
+	m->xy.x = x;
+	m->xy.y = y;
+	m->buttons = b;
+	m->msec = ms;
+	mouse.wi++;
+	if(mouse.wi == nelem(mouse.m))
+		mouse.wi = 0;
+	if(mouse.wi == mouse.ri){
+		mouse.stall = 1;
+		mouse.ri = 0;
+		mouse.wi = 1;
+		mouse.m[0] = *m;
+	}
+	matchmouse();
+	zunlock();
+}
+	
+void
+keystroke(int c)
+{
+	zlock();
+	kbd.r[kbd.wi++] = c;
+	if(kbd.wi == nelem(kbd.r))
+		kbd.wi = 0;
+	if(kbd.ri == kbd.wi)
+		kbd.stall = 1;
+	matchkbd();
+	zunlock();
+}
blob - 7e795906356fe389fba5113e85181edd8673d1ce
blob + 0fd27d724a64638dbd1aa695f4e065e024e55461
--- src/cmd/devdraw/x11-init.c
+++ src/cmd/devdraw/x11-init.c
@@ -10,8 +10,7 @@
 #include <mouse.h>
 #include <cursor.h>
 #include "x11-memdraw.h"
-
-static int parsewinsize(char*, Rectangle*, int*);
+#include "devdraw.h"
 
 static void	plan9cmap(void);
 static int	setupcmap(XWindow);
@@ -728,75 +727,4 @@ _xreplacescreenimage(void)
 	_x.screenr = r;
 	_drawreplacescreenimage(m);
 	return 1;
-}
-
-static int
-parsewinsize(char *s, Rectangle *r, int *havemin)
-{
-	char c, *os;
-	int i, j, k, l;
-
-	os = s;
-	*havemin = 0;
-	*r = Rect(0,0,0,0);
-	if(!isdigit((uchar)*s))
-		goto oops;
-	i = strtol(s, &s, 0);
-	if(*s == 'x'){
-		s++;
-		if(!isdigit((uchar)*s))
-			goto oops;
-		j = strtol(s, &s, 0);
-		r->max.x = i;
-		r->max.y = j;
-		if(*s == 0)
-			return 0;
-		if(*s != '@')
-			goto oops;
-
-		s++;
-		if(!isdigit((uchar)*s))
-			goto oops;
-		i = strtol(s, &s, 0);
-		if(*s != ',' && *s != ' ')
-			goto oops;
-		s++;
-		if(!isdigit((uchar)*s))
-			goto oops;
-		j = strtol(s, &s, 0);
-		if(*s != 0)
-			goto oops;
-		*r = rectaddpt(*r, Pt(i,j));
-		*havemin = 1;
-		return 0;
-	}
-
-	c = *s;
-	if(c != ' ' && c != ',')
-		goto oops;
-	s++;
-	if(!isdigit((uchar)*s))
-		goto oops;
-	j = strtol(s, &s, 0);
-	if(*s != c)
-		goto oops;
-	s++;
-	if(!isdigit((uchar)*s))
-		goto oops;
-	k = strtol(s, &s, 0);
-	if(*s != c)
-		goto oops;
-	s++;
-	if(!isdigit((uchar)*s))
-		goto oops;
-	l = strtol(s, &s, 0);
-	if(*s != 0)
-		goto oops;
-	*r = Rect(i,j,k,l);
-	*havemin = 1;
-	return 0;
-
-oops:
-	werrstr("bad syntax in window size '%s'", os);
-	return -1;
 }
blob - /dev/null
blob + 375401bf0812c59c5fca50e519953fcc811841d5 (mode 644)
--- /dev/null
+++ src/cmd/devdraw/winsize.c
@@ -0,0 +1,76 @@
+#include <u.h>
+#include <libc.h>
+#include <draw.h>
+#include <memdraw.h>
+#include "devdraw.h"
+
+int
+parsewinsize(char *s, Rectangle *r, int *havemin)
+{
+	char c, *os;
+	int i, j, k, l;
+
+	os = s;
+	*havemin = 0;
+	*r = Rect(0,0,0,0);
+	if(!isdigit((uchar)*s))
+		goto oops;
+	i = strtol(s, &s, 0);
+	if(*s == 'x'){
+		s++;
+		if(!isdigit((uchar)*s))
+			goto oops;
+		j = strtol(s, &s, 0);
+		r->max.x = i;
+		r->max.y = j;
+		if(*s == 0)
+			return 0;
+		if(*s != '@')
+			goto oops;
+
+		s++;
+		if(!isdigit((uchar)*s))
+			goto oops;
+		i = strtol(s, &s, 0);
+		if(*s != ',' && *s != ' ')
+			goto oops;
+		s++;
+		if(!isdigit((uchar)*s))
+			goto oops;
+		j = strtol(s, &s, 0);
+		if(*s != 0)
+			goto oops;
+		*r = rectaddpt(*r, Pt(i,j));
+		*havemin = 1;
+		return 0;
+	}
+
+	c = *s;
+	if(c != ' ' && c != ',')
+		goto oops;
+	s++;
+	if(!isdigit((uchar)*s))
+		goto oops;
+	j = strtol(s, &s, 0);
+	if(*s != c)
+		goto oops;
+	s++;
+	if(!isdigit((uchar)*s))
+		goto oops;
+	k = strtol(s, &s, 0);
+	if(*s != c)
+		goto oops;
+	s++;
+	if(!isdigit((uchar)*s))
+		goto oops;
+	l = strtol(s, &s, 0);
+	if(*s != 0)
+		goto oops;
+	*r = Rect(i,j,k,l);
+	*havemin = 1;
+	return 0;
+
+oops:
+	werrstr("bad syntax in window size '%s'", os);
+	return -1;
+}