BBC Basic in Z80 emulation on the mbed, USB serial terminal output only. LOAD and SAVE work on the local file system but there is no error signalling.
Revision 0:806c2f2a7d47, committed 2011-06-29
- Comitter:
- gertk
- Date:
- Wed Jun 29 14:25:56 2011 +0000
- Commit message:
- preliminary version
Changed in this revision
diff -r 000000000000 -r 806c2f2a7d47 bbc_0100.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/bbc_0100.h Wed Jun 29 14:25:56 2011 +0000 @@ -0,0 +1,851 @@ +// the BBC Basic rom for Z80 +// this is the CP/M version +static const char rom[] = { + 0xc3, 0x2a, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc3, 0x50, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x0d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + + 0xc3, 0x2a, 0x01, 0xc3, 0x97, 0x01, 0xc3, 0x78, 0x0e, 0xc3, 0xd6, 0x07, 0xc3, 0xe6, 0x0c, 0xc3, + 0xdd, 0x0c, 0xc3, 0x86, 0x08, 0xc3, 0xaa, 0x08, 0xc3, 0x72, 0x0d, 0xc3, 0xf7, 0xff, 0xc3, 0x98, + 0x32, 0xc3, 0x7b, 0x32, 0xc3, 0xb2, 0x32, 0xc3, 0xd9, 0x31, 0x21, 0x00, 0x37, 0xf9, 0x36, 0x0a, + 0x2c, 0x36, 0x09, 0x2c, 0xaf, 0x77, 0x2c, 0x20, 0xfc, 0x3d, 0x32, 0xfe, 0x37, 0x21, 0x76, 0x01, + 0x22, 0xee, 0x37, 0xcd, 0x64, 0x34, 0xed, 0x53, 0xe4, 0x37, 0x22, 0xdc, 0x37, 0xcd, 0xa2, 0x08, + 0xc2, 0x6b, 0x0d, 0xcd, 0xe6, 0x0c, 0x41, 0x63, 0x6f, 0x72, 0x6e, 0x20, 0x42, 0x42, 0x43, 0x20, + 0x42, 0x41, 0x53, 0x49, 0x43, 0x20, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x32, 0x2e, + 0x32, 0x30, 0x20, 0x20, 0x0d, 0x0a, 0x28, 0x43, 0x29, 0x20, 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, + 0x67, 0x68, 0x74, 0x20, 0x52, 0x2e, 0x54, 0x2e, 0x52, 0x75, 0x73, 0x73, 0x65, 0x6c, 0x6c, 0x20, + 0x31, 0x39, 0x38, 0x33, 0x0d, 0x0a, 0x00, 0xf6, 0x37, 0xed, 0x7b, 0xe4, 0x37, 0xcd, 0x15, 0x13, + 0x21, 0xfe, 0x37, 0x7e, 0xe6, 0x0f, 0xf6, 0x30, 0x77, 0x21, 0x00, 0x00, 0x22, 0xec, 0x37, 0x22, + 0xf4, 0x37, 0x2a, 0xea, 0x37, 0x22, 0xe6, 0x37, 0x7c, 0xb5, 0x28, 0x17, 0xe5, 0xcd, 0xe3, 0x09, + 0xe1, 0xed, 0x4b, 0xff, 0x37, 0x06, 0x00, 0x09, 0xda, 0xf1, 0x2c, 0x22, 0xea, 0x37, 0x3e, 0x20, + 0xcd, 0x52, 0x09, 0x21, 0x00, 0x35, 0xcd, 0x99, 0x34, 0xaf, 0x32, 0xfb, 0x37, 0xfd, 0x21, 0x00, + 0x35, 0xcd, 0x9f, 0x0b, 0xcd, 0x7f, 0x2f, 0x7c, 0xb5, 0x28, 0x03, 0x22, 0xe6, 0x37, 0x11, 0x00, + 0x36, 0x0e, 0x01, 0xcd, 0x10, 0x0c, 0x12, 0xaf, 0x47, 0x4b, 0x13, 0x12, 0x2a, 0xe6, 0x37, 0x7c, + 0xb5, 0xfd, 0x21, 0x00, 0x36, 0xca, 0xa2, 0x0d, 0xc5, 0xe5, 0xcd, 0x86, 0x08, 0xe1, 0xcd, 0x89, + 0x09, 0xcc, 0x46, 0x08, 0xc1, 0x79, 0xb7, 0xca, 0x98, 0x01, 0xc6, 0x04, 0x4f, 0xd5, 0xc5, 0xeb, + 0x2a, 0xde, 0x37, 0xe5, 0x09, 0xe5, 0x24, 0xaf, 0xed, 0x72, 0xe1, 0xd2, 0xc1, 0x07, 0x22, 0xde, + 0x37, 0xe3, 0xe5, 0x23, 0xb7, 0xed, 0x52, 0x44, 0x4d, 0xe1, 0xd1, 0x28, 0x02, 0xed, 0xb8, 0xc1, + 0xd1, 0x23, 0x71, 0x23, 0x73, 0x23, 0x72, 0x23, 0x11, 0x00, 0x36, 0xeb, 0x0d, 0x0d, 0x0d, 0xed, + 0xb0, 0xcd, 0x7b, 0x08, 0xc3, 0x98, 0x01, 0x80, 0x41, 0x4e, 0x44, 0x94, 0x41, 0x42, 0x53, 0x95, + 0x41, 0x43, 0x53, 0x96, 0x41, 0x44, 0x56, 0x41, 0x4c, 0x97, 0x41, 0x53, 0x43, 0x98, 0x41, 0x53, + 0x4e, 0x99, 0x41, 0x54, 0x4e, 0xc6, 0x41, 0x55, 0x54, 0x4f, 0x9a, 0x42, 0x47, 0x45, 0x54, 0x00, + 0xd5, 0x42, 0x50, 0x55, 0x54, 0x00, 0xfb, 0x43, 0x4f, 0x4c, 0x4f, 0x55, 0x52, 0xfb, 0x43, 0x4f, + 0x4c, 0x4f, 0x52, 0xd6, 0x43, 0x41, 0x4c, 0x4c, 0xd7, 0x43, 0x48, 0x41, 0x49, 0x4e, 0xbd, 0x43, + 0x48, 0x52, 0x24, 0xd8, 0x43, 0x4c, 0x45, 0x41, 0x52, 0x00, 0xd9, 0x43, 0x4c, 0x4f, 0x53, 0x45, + 0x00, 0xda, 0x43, 0x4c, 0x47, 0x00, 0xdb, 0x43, 0x4c, 0x53, 0x00, 0x9b, 0x43, 0x4f, 0x53, 0x9c, + 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x00, 0xdc, 0x44, 0x41, 0x54, 0x41, 0x9d, 0x44, 0x45, 0x47, 0xdd, + 0x44, 0x45, 0x46, 0xc7, 0x44, 0x45, 0x4c, 0x45, 0x54, 0x45, 0x81, 0x44, 0x49, 0x56, 0xde, 0x44, + 0x49, 0x4d, 0xdf, 0x44, 0x52, 0x41, 0x57, 0xe1, 0x45, 0x4e, 0x44, 0x50, 0x52, 0x4f, 0x43, 0x00, + 0xe0, 0x45, 0x4e, 0x44, 0x00, 0xe2, 0x45, 0x4e, 0x56, 0x45, 0x4c, 0x4f, 0x50, 0x45, 0x8b, 0x45, + 0x4c, 0x53, 0x45, 0xa0, 0x45, 0x56, 0x41, 0x4c, 0x9e, 0x45, 0x52, 0x4c, 0x00, 0x85, 0x45, 0x52, + 0x52, 0x4f, 0x52, 0xc5, 0x45, 0x4f, 0x46, 0x00, 0x82, 0x45, 0x4f, 0x52, 0x9f, 0x45, 0x52, 0x52, + 0x00, 0xa1, 0x45, 0x58, 0x50, 0xa2, 0x45, 0x58, 0x54, 0x00, 0xe3, 0x46, 0x4f, 0x52, 0xa3, 0x46, + 0x41, 0x4c, 0x53, 0x45, 0x00, 0xa4, 0x46, 0x4e, 0xe5, 0x47, 0x4f, 0x54, 0x4f, 0xbe, 0x47, 0x45, + 0x54, 0x24, 0xa5, 0x47, 0x45, 0x54, 0xe4, 0x47, 0x4f, 0x53, 0x55, 0x42, 0xe6, 0x47, 0x43, 0x4f, + 0x4c, 0x93, 0x48, 0x49, 0x4d, 0x45, 0x4d, 0x00, 0xe8, 0x49, 0x4e, 0x50, 0x55, 0x54, 0xe7, 0x49, + 0x46, 0xbf, 0x49, 0x4e, 0x4b, 0x45, 0x59, 0x24, 0xa6, 0x49, 0x4e, 0x4b, 0x45, 0x59, 0xa8, 0x49, + 0x4e, 0x54, 0xa7, 0x49, 0x4e, 0x53, 0x54, 0x52, 0x28, 0xc9, 0x4c, 0x49, 0x53, 0x54, 0x86, 0x4c, + 0x49, 0x4e, 0x45, 0xc8, 0x4c, 0x4f, 0x41, 0x44, 0x92, 0x4c, 0x4f, 0x4d, 0x45, 0x4d, 0x00, 0xea, + 0x4c, 0x4f, 0x43, 0x41, 0x4c, 0xc0, 0x4c, 0x45, 0x46, 0x54, 0x24, 0x28, 0xa9, 0x4c, 0x45, 0x4e, + 0xe9, 0x4c, 0x45, 0x54, 0xab, 0x4c, 0x4f, 0x47, 0xaa, 0x4c, 0x4e, 0xc1, 0x4d, 0x49, 0x44, 0x24, + 0x28, 0xeb, 0x4d, 0x4f, 0x44, 0x45, 0x83, 0x4d, 0x4f, 0x44, 0xec, 0x4d, 0x4f, 0x56, 0x45, 0xed, + 0x4e, 0x45, 0x58, 0x54, 0xca, 0x4e, 0x45, 0x57, 0x00, 0xac, 0x4e, 0x4f, 0x54, 0xcb, 0x4f, 0x4c, + 0x44, 0x00, 0xee, 0x4f, 0x4e, 0x87, 0x4f, 0x46, 0x46, 0x84, 0x4f, 0x52, 0x8e, 0x4f, 0x50, 0x45, + 0x4e, 0x49, 0x4e, 0xae, 0x4f, 0x50, 0x45, 0x4e, 0x4f, 0x55, 0x54, 0xad, 0x4f, 0x50, 0x45, 0x4e, + 0x55, 0x50, 0xff, 0x4f, 0x53, 0x43, 0x4c, 0x49, 0xf1, 0x50, 0x52, 0x49, 0x4e, 0x54, 0x90, 0x50, + 0x41, 0x47, 0x45, 0x00, 0x8f, 0x50, 0x54, 0x52, 0x00, 0xaf, 0x50, 0x49, 0x00, 0xf0, 0x50, 0x4c, + 0x4f, 0x54, 0xb0, 0x50, 0x4f, 0x49, 0x4e, 0x54, 0x28, 0xf2, 0x50, 0x52, 0x4f, 0x43, 0xb1, 0x50, + 0x4f, 0x53, 0x00, 0xce, 0x50, 0x55, 0x54, 0xf8, 0x52, 0x45, 0x54, 0x55, 0x52, 0x4e, 0x00, 0xf5, + 0x52, 0x45, 0x50, 0x45, 0x41, 0x54, 0xf6, 0x52, 0x45, 0x50, 0x4f, 0x52, 0x54, 0x00, 0xf3, 0x52, + 0x45, 0x41, 0x44, 0xf4, 0x52, 0x45, 0x4d, 0xf9, 0x52, 0x55, 0x4e, 0x00, 0xb2, 0x52, 0x41, 0x44, + 0xf7, 0x52, 0x45, 0x53, 0x54, 0x4f, 0x52, 0x45, 0xc2, 0x52, 0x49, 0x47, 0x48, 0x54, 0x24, 0x28, + 0xb3, 0x52, 0x4e, 0x44, 0x00, 0xcc, 0x52, 0x45, 0x4e, 0x55, 0x4d, 0x42, 0x45, 0x52, 0x88, 0x53, + 0x54, 0x45, 0x50, 0xcd, 0x53, 0x41, 0x56, 0x45, 0xb4, 0x53, 0x47, 0x4e, 0xb5, 0x53, 0x49, 0x4e, + 0xb6, 0x53, 0x51, 0x52, 0x89, 0x53, 0x50, 0x43, 0xc3, 0x53, 0x54, 0x52, 0x24, 0xc4, 0x53, 0x54, + 0x52, 0x49, 0x4e, 0x47, 0x24, 0x28, 0xd4, 0x53, 0x4f, 0x55, 0x4e, 0x44, 0xfa, 0x53, 0x54, 0x4f, + 0x50, 0x00, 0xb7, 0x54, 0x41, 0x4e, 0x8c, 0x54, 0x48, 0x45, 0x4e, 0xb8, 0x54, 0x4f, 0x8a, 0x54, + 0x41, 0x42, 0x28, 0xfc, 0x54, 0x52, 0x41, 0x43, 0x45, 0x91, 0x54, 0x49, 0x4d, 0x45, 0x00, 0xb9, + 0x54, 0x52, 0x55, 0x45, 0x00, 0xfd, 0x55, 0x4e, 0x54, 0x49, 0x4c, 0xba, 0x55, 0x53, 0x52, 0xef, + 0x56, 0x44, 0x55, 0xbb, 0x56, 0x41, 0x4c, 0xbc, 0x56, 0x50, 0x4f, 0x53, 0x00, 0xfe, 0x57, 0x49, + 0x44, 0x54, 0x48, 0xd3, 0x48, 0x49, 0x4d, 0x45, 0x4d, 0xd2, 0x4c, 0x4f, 0x4d, 0x45, 0x4d, 0xd0, + 0x50, 0x41, 0x47, 0x45, 0xcf, 0x50, 0x54, 0x52, 0xd1, 0x54, 0x49, 0x4d, 0x45, 0x01, 0x4d, 0x69, + 0x73, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x02, 0x4e, 0x6f, 0x20, 0x73, 0x75, 0x63, 0x68, 0x20, 0x03, + 0x42, 0x61, 0x64, 0x20, 0x04, 0x20, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x05, 0x76, 0x61, 0x72, 0x69, + 0x61, 0x62, 0x6c, 0x65, 0x06, 0x4f, 0x75, 0x74, 0x20, 0x6f, 0x66, 0x07, 0x4e, 0x6f, 0x20, 0x08, + 0x20, 0x73, 0x70, 0x61, 0x63, 0x65, 0xff, 0xff, 0x07, 0x72, 0x6f, 0x6f, 0x6d, 0x00, 0x06, 0x04, + 0x00, 0x00, 0x00, 0x4d, 0x69, 0x73, 0x74, 0x61, 0x6b, 0x65, 0x00, 0x01, 0x2c, 0x00, 0x54, 0x79, + 0x70, 0x65, 0x20, 0x6d, 0x69, 0x73, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x00, 0x07, 0xa4, 0x00, 0x00, + 0x01, 0x22, 0x00, 0x03, 0xde, 0x00, 0xde, 0x08, 0x00, 0x4e, 0x6f, 0x74, 0x20, 0xea, 0x00, 0x07, + 0xf2, 0x00, 0x41, 0x72, 0x72, 0x61, 0x79, 0x00, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x00, 0x53, 0x79, 0x6e, 0x74, 0x61, 0x78, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x00, 0x45, + 0x73, 0x63, 0x61, 0x70, 0x65, 0x00, 0x44, 0x69, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x62, + 0x79, 0x20, 0x7a, 0x65, 0x72, 0x6f, 0x00, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x6f, + 0x6f, 0x20, 0x6c, 0x6f, 0x6e, 0x67, 0x00, 0x54, 0x6f, 0x6f, 0x20, 0x62, 0x69, 0x67, 0x00, 0x2d, + 0x76, 0x65, 0x20, 0x72, 0x6f, 0x6f, 0x74, 0x00, 0x4c, 0x6f, 0x67, 0x04, 0x00, 0x41, 0x63, 0x63, + 0x75, 0x72, 0x61, 0x63, 0x79, 0x20, 0x6c, 0x6f, 0x73, 0x74, 0x00, 0x45, 0x78, 0x70, 0x04, 0x00, + 0x00, 0x02, 0x05, 0x00, 0x01, 0x29, 0x00, 0x03, 0x48, 0x45, 0x58, 0x00, 0x02, 0xa4, 0x2f, 0xf2, + 0x00, 0x03, 0x63, 0x61, 0x6c, 0x6c, 0x00, 0x41, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, + 0x00, 0x07, 0xe3, 0x00, 0x43, 0x61, 0x6e, 0x27, 0x74, 0x20, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x20, + 0xe3, 0x00, 0xe3, 0x20, 0x05, 0x00, 0x00, 0x07, 0xb8, 0x00, 0x00, 0x07, 0xe4, 0x00, 0xee, 0x20, + 0x73, 0x79, 0x6e, 0x74, 0x61, 0x78, 0x00, 0xee, 0x04, 0x00, 0x02, 0x6c, 0x69, 0x6e, 0x65, 0x00, + 0x06, 0x20, 0xdc, 0x00, 0x07, 0xf5, 0x00, 0x00, 0x01, 0x23, 0x00, 0xcd, 0x86, 0x08, 0xcd, 0xd2, + 0x0b, 0x7e, 0xb7, 0x28, 0x51, 0x23, 0x5e, 0x23, 0x56, 0x7a, 0xb3, 0x28, 0x1a, 0x2b, 0x2b, 0xeb, + 0x37, 0xed, 0x42, 0xeb, 0x30, 0x40, 0xc5, 0xcd, 0x46, 0x08, 0xc1, 0x18, 0xe4, 0xfd, 0x23, 0xcd, + 0x46, 0x1f, 0xd9, 0x7d, 0x32, 0xfe, 0x37, 0xc3, 0x98, 0x01, 0xfe, 0x4f, 0x28, 0xef, 0xcd, 0xd2, + 0x0b, 0x78, 0xb1, 0x20, 0x01, 0x0b, 0xd9, 0xdd, 0x21, 0xfe, 0x37, 0x01, 0x00, 0x00, 0xd9, 0x3e, + 0x14, 0x08, 0x7e, 0xb7, 0x28, 0x10, 0x23, 0x5e, 0x23, 0x56, 0x7a, 0xb3, 0x28, 0xd9, 0x23, 0xd5, + 0xeb, 0x37, 0xed, 0x42, 0xeb, 0xd1, 0xd2, 0x97, 0x01, 0x22, 0xf4, 0x37, 0xcd, 0xc2, 0x08, 0x08, + 0x3d, 0xcd, 0x57, 0x34, 0x18, 0xdb, 0xcd, 0xaa, 0x08, 0xcd, 0xaf, 0x0b, 0xd9, 0x2a, 0xdc, 0x37, + 0xed, 0x5b, 0xe0, 0x37, 0x7e, 0xb7, 0x28, 0x2f, 0x23, 0x4e, 0x23, 0x46, 0x78, 0xb1, 0x28, 0xa7, + 0xeb, 0x71, 0x23, 0x70, 0x23, 0xd9, 0xe5, 0x09, 0xda, 0xf1, 0x2c, 0xd9, 0xc1, 0x71, 0x23, 0x70, + 0x23, 0xeb, 0x2b, 0x2b, 0xaf, 0x47, 0x4e, 0x09, 0xeb, 0xe5, 0x24, 0xed, 0x72, 0xe1, 0xeb, 0x38, + 0xd3, 0xcd, 0xd6, 0x07, 0xcc, 0x08, 0x00, 0xeb, 0x36, 0xff, 0x23, 0x36, 0xff, 0xed, 0x5b, 0xe0, + 0x37, 0xd9, 0x2a, 0xdc, 0x37, 0x4e, 0x79, 0xb7, 0x28, 0x9c, 0xd9, 0xeb, 0x23, 0x23, 0x5e, 0x23, + 0x56, 0x23, 0xd5, 0xeb, 0x22, 0xe6, 0x37, 0xd9, 0xd1, 0x23, 0x73, 0x23, 0x72, 0x23, 0x0d, 0x0d, + 0x0d, 0x06, 0x00, 0x3e, 0x8d, 0xed, 0xb1, 0x20, 0xdc, 0xc5, 0xe5, 0xe5, 0xfd, 0xe1, 0xd9, 0xcd, + 0xa1, 0x29, 0xd9, 0x44, 0x4d, 0x2a, 0xe0, 0x37, 0x5e, 0x23, 0x56, 0x23, 0xeb, 0xb7, 0xed, 0x42, + 0xeb, 0x5e, 0x23, 0x56, 0x23, 0x38, 0xf1, 0xeb, 0x28, 0x19, 0xcd, 0xe6, 0x0c, 0x46, 0x61, 0x69, + 0x6c, 0x65, 0x64, 0x20, 0x61, 0x74, 0x20, 0x00, 0x2a, 0xe6, 0x37, 0xcd, 0xdf, 0x09, 0xcd, 0x4b, + 0x09, 0x18, 0x06, 0xd1, 0xd5, 0x1b, 0xcd, 0xb4, 0x0c, 0xe1, 0xc1, 0x18, 0xb6, 0xcd, 0xaf, 0x0b, + 0x22, 0xea, 0x37, 0x79, 0x32, 0xff, 0x37, 0x18, 0x29, 0xcd, 0xe6, 0x0c, 0x03, 0x70, 0x72, 0x6f, + 0x67, 0x72, 0x61, 0x6d, 0x0d, 0x0a, 0x00, 0xcd, 0xa2, 0x08, 0x18, 0x16, 0x2a, 0xdc, 0x37, 0xe5, + 0x23, 0x23, 0x23, 0x01, 0xfc, 0x00, 0x3e, 0x0d, 0xed, 0xb1, 0x20, 0xdd, 0x7d, 0xe1, 0x77, 0xcd, + 0x7b, 0x08, 0xc3, 0x98, 0x01, 0xcd, 0x4f, 0x1f, 0x3e, 0x0d, 0x12, 0xcd, 0x61, 0x08, 0xcd, 0xaa, + 0x08, 0x18, 0x1b, 0xcd, 0x86, 0x08, 0xcd, 0xcb, 0x33, 0x3e, 0x0d, 0x12, 0xed, 0x5b, 0xdc, 0x37, + 0x2a, 0xde, 0x37, 0xb7, 0xed, 0x52, 0x44, 0x4d, 0x21, 0x00, 0x35, 0xcd, 0x62, 0x31, 0xc3, 0x97, + 0x01, 0xed, 0x7b, 0xe4, 0x37, 0x21, 0x38, 0x05, 0xb7, 0x28, 0x0a, 0x47, 0x08, 0xaf, 0xbe, 0x23, + 0x20, 0xfc, 0x10, 0xfa, 0x08, 0xe5, 0xe1, 0x22, 0xee, 0x37, 0xed, 0x7b, 0xe4, 0x37, 0x32, 0xfd, + 0x37, 0xcd, 0xa2, 0x09, 0x22, 0xf2, 0x37, 0xb7, 0x28, 0x0b, 0x2a, 0xec, 0x37, 0x7c, 0xb5, 0xe5, + 0xfd, 0xe1, 0xc2, 0xa2, 0x0d, 0x21, 0x00, 0x00, 0x22, 0xea, 0x37, 0x22, 0xe8, 0x37, 0xcd, 0x4b, + 0x09, 0xcd, 0xda, 0x0c, 0xcd, 0xcc, 0x09, 0xcd, 0x4b, 0x09, 0xc3, 0x98, 0x01, 0x21, 0x57, 0x02, + 0xfd, 0x7e, 0x00, 0x46, 0x23, 0xbe, 0x28, 0x08, 0xd8, 0x23, 0xcb, 0x7e, 0x28, 0xfb, 0x18, 0xf0, + 0xfd, 0xe5, 0x23, 0xcb, 0x7e, 0x20, 0x1b, 0xfd, 0x23, 0xfd, 0x7e, 0x00, 0xfe, 0x2e, 0x28, 0x12, + 0xbe, 0x28, 0xef, 0xcd, 0xf0, 0x0b, 0x38, 0x04, 0xfd, 0xe1, 0x18, 0xdd, 0x7e, 0xb7, 0x20, 0xf8, + 0xfd, 0x2b, 0xf1, 0xaf, 0x78, 0xc9, 0xd5, 0xe5, 0xe5, 0x06, 0x00, 0x4e, 0x09, 0xe5, 0xeb, 0x2a, + 0xde, 0x37, 0xed, 0x52, 0x44, 0x4d, 0xe1, 0xd1, 0xed, 0xb0, 0xed, 0x53, 0xde, 0x37, 0xe1, 0xd1, + 0xc9, 0xed, 0x5b, 0xdc, 0x37, 0x21, 0x00, 0xff, 0x39, 0xed, 0x52, 0x44, 0x4d, 0x21, 0x00, 0x35, + 0xcd, 0xa9, 0x31, 0xd4, 0xa2, 0x08, 0x3e, 0x00, 0xd2, 0xc1, 0x07, 0xcd, 0x86, 0x08, 0x2b, 0x36, + 0xff, 0x2b, 0x36, 0xff, 0x18, 0x24, 0x2a, 0xdc, 0x37, 0x06, 0x00, 0x3e, 0x0d, 0x4e, 0x0c, 0x0d, + 0x28, 0x09, 0x09, 0x2b, 0xbe, 0x23, 0x28, 0xf5, 0xc3, 0x69, 0x07, 0x23, 0x23, 0x23, 0x22, 0xde, + 0x37, 0xc9, 0x2a, 0xdc, 0x37, 0x36, 0x00, 0xcd, 0x9b, 0x08, 0xe5, 0x2a, 0xde, 0x37, 0x22, 0xe0, + 0x37, 0x22, 0xe2, 0x37, 0x21, 0x6c, 0x37, 0xc5, 0x06, 0x70, 0x36, 0x00, 0x23, 0x10, 0xfb, 0xc1, + 0xe1, 0xc9, 0xe5, 0xeb, 0xc5, 0xcd, 0xe3, 0x09, 0xc1, 0xe1, 0x7e, 0xfe, 0xed, 0xcc, 0x2e, 0x09, + 0xfe, 0xfd, 0xcc, 0x2e, 0x09, 0xd9, 0x3e, 0x20, 0xdd, 0xcb, 0x00, 0x46, 0xc4, 0x52, 0x09, 0x78, + 0x87, 0xdd, 0xcb, 0x00, 0x4e, 0xc4, 0x9c, 0x17, 0x79, 0x87, 0xdd, 0xcb, 0x00, 0x56, 0xc4, 0x9c, + 0x17, 0xd9, 0x7e, 0xfe, 0xe3, 0xcc, 0x2e, 0x09, 0xfe, 0xf5, 0xcc, 0x2e, 0x09, 0x1e, 0x00, 0x7e, + 0x23, 0xfe, 0x0d, 0x28, 0x46, 0xfe, 0x22, 0x20, 0x01, 0x1c, 0xcd, 0x22, 0x09, 0x18, 0xf0, 0xe5, + 0xfd, 0xe1, 0xc5, 0xcd, 0xa1, 0x29, 0xc1, 0xd9, 0xc5, 0xcd, 0xdf, 0x09, 0xc1, 0xd9, 0xfd, 0xe5, + 0xe1, 0xc9, 0xcb, 0x43, 0x20, 0x2c, 0xfe, 0x8d, 0x28, 0xe5, 0xcd, 0x6b, 0x09, 0x7e, 0xd9, 0xfe, + 0xe3, 0x28, 0x08, 0xfe, 0xed, 0x20, 0x05, 0x05, 0xf2, 0x3c, 0x09, 0x04, 0xfe, 0xf5, 0x28, 0x08, + 0xfe, 0xfd, 0x20, 0x05, 0x0d, 0xf2, 0x49, 0x09, 0x0c, 0xd9, 0xc9, 0x3e, 0x0d, 0xcd, 0x52, 0x09, + 0x3e, 0x0a, 0xcd, 0xee, 0xff, 0xd6, 0x0d, 0x28, 0x05, 0xd8, 0x3a, 0xfb, 0x37, 0x3c, 0x32, 0xfb, + 0x37, 0xc8, 0xe5, 0x2a, 0xfc, 0x37, 0xbd, 0xe1, 0xc0, 0x18, 0xe0, 0xfe, 0x8a, 0xea, 0x52, 0x09, + 0xc5, 0xe5, 0x21, 0x57, 0x02, 0x01, 0xdf, 0x02, 0xed, 0xb1, 0x7e, 0x23, 0xfe, 0x8a, 0xf5, 0xec, + 0x52, 0x09, 0xf1, 0xea, 0x7a, 0x09, 0xe1, 0xc1, 0xc9, 0xeb, 0x2a, 0xdc, 0x37, 0xaf, 0xbe, 0x3c, + 0xd0, 0xaf, 0x47, 0x4e, 0xe5, 0x23, 0x7e, 0x23, 0x66, 0x6f, 0xed, 0x52, 0xe1, 0xd0, 0x09, 0xc3, + 0x93, 0x09, 0x06, 0x00, 0xed, 0x5b, 0xf4, 0x37, 0x2a, 0xdc, 0x37, 0xb7, 0xed, 0x52, 0x19, 0x30, + 0x16, 0x4e, 0x0c, 0x0d, 0x28, 0x11, 0x09, 0xed, 0x52, 0x19, 0x38, 0xf5, 0xed, 0x42, 0x23, 0x5e, + 0x23, 0x56, 0xeb, 0x22, 0xe6, 0x37, 0xc9, 0x21, 0x00, 0x00, 0x18, 0xf7, 0x2a, 0xe6, 0x37, 0x7c, + 0xb5, 0xc8, 0xcd, 0xe6, 0x0c, 0x20, 0x61, 0x74, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x00, 0x0e, + 0x00, 0x18, 0x02, 0x0e, 0x20, 0x06, 0x05, 0x11, 0x10, 0x27, 0xaf, 0xed, 0x52, 0x3c, 0x30, 0xfb, + 0x19, 0x3d, 0x28, 0x04, 0xcb, 0xe1, 0xcb, 0xe9, 0xb1, 0xc4, 0x52, 0x09, 0x78, 0xfe, 0x05, 0x28, + 0x06, 0x29, 0x54, 0x5d, 0x29, 0x29, 0x19, 0x11, 0xe8, 0x03, 0x10, 0xde, 0x37, 0xc9, 0xcd, 0x5b, + 0x0b, 0xfd, 0x7e, 0x00, 0xfe, 0x28, 0x20, 0x68, 0x3e, 0x0e, 0xc3, 0xc1, 0x07, 0xfd, 0x7e, 0x00, + 0xfe, 0x24, 0x28, 0x62, 0xfe, 0x21, 0x28, 0x62, 0xfe, 0x3f, 0x28, 0x62, 0xcd, 0xd3, 0x0a, 0xc0, + 0xfd, 0x7e, 0x00, 0xfe, 0x28, 0x20, 0x41, 0xd5, 0x7e, 0xb7, 0x28, 0xdc, 0x23, 0x11, 0x00, 0x00, + 0xf5, 0xfd, 0x23, 0x18, 0x04, 0xf5, 0xcd, 0x39, 0x2f, 0xe5, 0xd5, 0xcd, 0x46, 0x1f, 0xd9, 0xd1, + 0xe3, 0x4e, 0x23, 0x46, 0x23, 0xe3, 0xeb, 0xd5, 0xcd, 0x15, 0x18, 0xd1, 0x19, 0xeb, 0xb7, 0xed, + 0x42, 0x3e, 0x0f, 0x30, 0xb5, 0xe1, 0xf1, 0x3d, 0x20, 0xdb, 0xcd, 0x45, 0x2f, 0xf1, 0xe5, 0xcd, + 0x08, 0x18, 0xe1, 0x19, 0x57, 0xfd, 0x7e, 0x00, 0xfe, 0x3f, 0x28, 0x1d, 0xfe, 0x21, 0x28, 0x15, + 0xe5, 0xdd, 0xe1, 0x7a, 0xbf, 0xc9, 0x3e, 0x80, 0x18, 0x05, 0x3e, 0x04, 0x18, 0x01, 0xaf, 0x21, + 0x00, 0x00, 0xf5, 0x18, 0x15, 0x06, 0x04, 0x18, 0x02, 0x06, 0x00, 0xe5, 0xdd, 0xe1, 0x7a, 0xfe, + 0x81, 0xc8, 0xc5, 0xcd, 0xeb, 0x1f, 0xcd, 0xf5, 0x2b, 0xd9, 0xe5, 0xfd, 0x23, 0xcd, 0x5d, 0x1f, + 0xd9, 0xd1, 0xf1, 0x19, 0xe5, 0xdd, 0xe1, 0xbf, 0xc9, 0xfd, 0x7e, 0x01, 0xcd, 0xf0, 0x0b, 0xd8, + 0xfd, 0x7e, 0x00, 0x21, 0xd8, 0x37, 0xfe, 0xa4, 0x28, 0x43, 0x21, 0xda, 0x37, 0xfe, 0xf2, 0x28, + 0x3c, 0x37, 0xc9, 0xd6, 0x40, 0xd8, 0x26, 0x00, 0xfe, 0x1b, 0x30, 0x1d, 0x87, 0x6f, 0xfd, 0x7e, + 0x01, 0xfe, 0x25, 0x20, 0x20, 0xfd, 0x7e, 0x02, 0xfe, 0x28, 0x28, 0x19, 0x29, 0x11, 0x00, 0x37, + 0x19, 0xfd, 0x23, 0xfd, 0x23, 0x16, 0x04, 0xaf, 0xc9, 0xfe, 0x1f, 0xd8, 0xfe, 0x3b, 0x3f, 0x3d, + 0xd8, 0xd6, 0x03, 0x87, 0x6f, 0x11, 0x6c, 0x37, 0x2d, 0x2d, 0x37, 0xf8, 0x19, 0x5e, 0x23, 0x56, + 0x7a, 0xb3, 0x28, 0x45, 0x62, 0x6b, 0x23, 0x23, 0xfd, 0xe5, 0x7e, 0x23, 0xfd, 0x23, 0xfd, 0xbe, + 0x00, 0x28, 0xf7, 0xb7, 0x28, 0x06, 0xfd, 0xe1, 0xeb, 0xc3, 0x0d, 0x0b, 0xfd, 0x2b, 0xfd, 0x7e, + 0x00, 0xfe, 0x28, 0x28, 0x13, 0xfd, 0x23, 0xcd, 0xe4, 0x0b, 0x38, 0x0c, 0xfe, 0x28, 0x28, 0xe6, + 0xfd, 0x7e, 0xff, 0xcd, 0xf0, 0x0b, 0x30, 0xde, 0xd1, 0xfd, 0x7e, 0xff, 0xfe, 0x24, 0x16, 0x81, + 0xc8, 0xfe, 0x25, 0x16, 0x04, 0xc8, 0x14, 0xbf, 0xc9, 0x3c, 0xc9, 0xaf, 0xed, 0x5b, 0xe2, 0x37, + 0x72, 0x2b, 0x73, 0xeb, 0x77, 0x23, 0x77, 0x23, 0xfd, 0x23, 0xcd, 0xe4, 0x0b, 0x38, 0x14, 0x77, + 0x23, 0xcd, 0xf0, 0x0b, 0x30, 0xf2, 0xfe, 0x28, 0x28, 0x09, 0xfd, 0x7e, 0x01, 0xfe, 0x28, 0x28, + 0xe7, 0xfd, 0x23, 0x36, 0x00, 0x23, 0xe5, 0xcd, 0x49, 0x0b, 0x3e, 0x05, 0xba, 0x28, 0x01, 0x3d, + 0x36, 0x00, 0x23, 0x3d, 0x20, 0xfa, 0x22, 0xe2, 0x37, 0xcd, 0x39, 0x16, 0xe1, 0xaf, 0xc9, 0xcd, + 0x7f, 0x2f, 0xcd, 0x00, 0x2d, 0xcd, 0xb4, 0x2b, 0x7c, 0xb5, 0xd9, 0xc8, 0xc3, 0xf1, 0x2c, 0xcd, + 0x9f, 0x0b, 0x7c, 0xb5, 0x20, 0x02, 0x2e, 0x0a, 0xcd, 0x3c, 0x17, 0xfd, 0x23, 0xe5, 0x21, 0x0a, + 0x00, 0xc4, 0x9f, 0x0b, 0xe3, 0xc1, 0x78, 0xb1, 0xc0, 0xcd, 0xd6, 0x07, 0x53, 0x69, 0x6c, 0x6c, + 0x79, 0x00, 0xcd, 0x9f, 0x0b, 0xcd, 0x3c, 0x17, 0xfd, 0x23, 0xe5, 0xc4, 0x9f, 0x0b, 0xe3, 0xcd, + 0x89, 0x09, 0xc1, 0xc9, 0xfd, 0x7e, 0x00, 0xfe, 0x24, 0xc8, 0xfe, 0x25, 0xc8, 0xfe, 0x28, 0xc8, + 0xfe, 0x30, 0xd8, 0xfe, 0x3a, 0x3f, 0xd0, 0xfe, 0x41, 0xd8, 0xfe, 0x5b, 0x3f, 0xd0, 0xfe, 0x5f, + 0xd8, 0xfe, 0x7b, 0x3f, 0xc9, 0xaf, 0xcd, 0xd6, 0x07, 0x86, 0x08, 0x00, 0x12, 0x13, 0xfd, 0x23, + 0x7b, 0xfe, 0xfc, 0x30, 0xf0, 0xfd, 0x7e, 0x00, 0xfe, 0x0d, 0xc8, 0xcd, 0xf0, 0x0b, 0x30, 0x04, + 0xcb, 0xa9, 0xcb, 0x99, 0xfe, 0x20, 0x28, 0xe4, 0xfe, 0x2c, 0x28, 0xe0, 0xfe, 0x47, 0x38, 0x02, + 0xcb, 0x99, 0xfe, 0x22, 0x20, 0x05, 0xcb, 0x11, 0x3f, 0xcb, 0x19, 0xcb, 0x61, 0x28, 0x10, 0xcb, + 0xa1, 0xc5, 0xd5, 0xcd, 0x9f, 0x0b, 0xd1, 0xc1, 0x7c, 0xb5, 0xc4, 0xb4, 0x0c, 0x18, 0xc1, 0x0d, + 0x28, 0x09, 0x0c, 0x20, 0xb7, 0xb7, 0xf4, 0x0d, 0x08, 0x18, 0x12, 0xfe, 0x2a, 0x28, 0x16, 0xb7, + 0xf4, 0x0d, 0x08, 0xfe, 0x8f, 0x38, 0x06, 0xfe, 0x94, 0x30, 0x02, 0xc6, 0x40, 0xfe, 0xf4, 0x28, + 0x04, 0xfe, 0xdc, 0x20, 0x02, 0xcb, 0xf1, 0xfe, 0xa4, 0x28, 0x09, 0xfe, 0xf2, 0x28, 0x05, 0xcd, + 0xf7, 0x0b, 0x38, 0x02, 0xcb, 0xe9, 0xfe, 0x26, 0x20, 0x02, 0xcb, 0xd9, 0x21, 0xab, 0x0c, 0xc5, + 0x01, 0x06, 0x00, 0xed, 0xb1, 0xc1, 0x20, 0x02, 0xcb, 0xe1, 0x21, 0xaf, 0x0c, 0xc5, 0x01, 0x05, + 0x00, 0xed, 0xb1, 0xc1, 0x20, 0x02, 0xcb, 0xc1, 0xc3, 0x0c, 0x0c, 0xe5, 0xe4, 0xf7, 0xfc, 0x8c, + 0x8b, 0xf5, 0x8d, 0x3a, 0xcb, 0xe1, 0xeb, 0x36, 0x8d, 0x23, 0x7a, 0xe6, 0xc0, 0x0f, 0x0f, 0x47, + 0x7b, 0xe6, 0xc0, 0xb0, 0x0f, 0x0f, 0xee, 0x54, 0x77, 0x23, 0x7b, 0xe6, 0x3f, 0xf6, 0x40, 0x77, + 0x23, 0x7a, 0xe6, 0x3f, 0xf6, 0x40, 0x77, 0x23, 0xeb, 0xc9, 0x2a, 0xee, 0x37, 0x7e, 0x23, 0xb7, + 0xc8, 0xcd, 0x6b, 0x09, 0x18, 0xf7, 0xe3, 0xcd, 0xdd, 0x0c, 0xe3, 0xc9, 0x5d, 0x07, 0x3b, 0x06, + 0x95, 0x07, 0x6a, 0x06, 0x77, 0x07, 0x7c, 0x07, 0xa6, 0x06, 0xa3, 0x07, 0xb4, 0x15, 0xdc, 0x32, + 0x91, 0x14, 0xa0, 0x14, 0xaf, 0x14, 0xc2, 0x14, 0x82, 0x30, 0x36, 0x15, 0x49, 0x15, 0x65, 0x0d, + 0x56, 0x14, 0x2d, 0x15, 0x06, 0x31, 0x33, 0x14, 0x18, 0x0e, 0x18, 0x0e, 0xc4, 0x0e, 0xbb, 0x30, + 0xca, 0x0d, 0x8f, 0x12, 0x54, 0x30, 0xfa, 0x10, 0xb5, 0x10, 0x9e, 0x10, 0x1e, 0x31, 0x06, 0x14, + 0x1a, 0x13, 0x37, 0x0e, 0x41, 0x12, 0xf2, 0x30, 0xb6, 0x30, 0x3f, 0x11, 0x42, 0x10, 0x0c, 0x15, + 0xc0, 0x30, 0x71, 0x0f, 0xc4, 0x11, 0xb5, 0x13, 0x18, 0x0e, 0xd0, 0x10, 0x50, 0x14, 0x5e, 0x14, + 0xc0, 0x10, 0x60, 0x0d, 0x3d, 0x14, 0x0e, 0x31, 0xf2, 0x14, 0xd8, 0x10, 0xe7, 0x14, 0x04, 0x0e, + 0xcd, 0x3c, 0x17, 0x28, 0x0d, 0xcd, 0x4f, 0x1f, 0x3e, 0x0d, 0x12, 0xed, 0x7b, 0xe4, 0x37, 0xcd, + 0x61, 0x08, 0xed, 0x7b, 0xe4, 0x37, 0xdd, 0x21, 0xf6, 0x37, 0xed, 0x5f, 0x28, 0xfc, 0x07, 0x07, + 0xdd, 0x77, 0x03, 0x9f, 0xdd, 0x77, 0x04, 0xcd, 0xaa, 0x08, 0x21, 0x00, 0x00, 0x22, 0xec, 0x37, + 0x2a, 0xdc, 0x37, 0x3e, 0xdc, 0xcd, 0xf2, 0x17, 0x22, 0xf0, 0x37, 0xfd, 0x2a, 0xdc, 0x37, 0xcd, + 0xd7, 0x0d, 0xfd, 0x22, 0xf4, 0x37, 0xcd, 0x57, 0x34, 0xcd, 0x7f, 0x2f, 0xfd, 0x23, 0xfe, 0x3a, + 0x28, 0xf7, 0xfe, 0x0d, 0x28, 0xe9, 0xd6, 0xc6, 0x38, 0x6c, 0x87, 0x4f, 0x06, 0x00, 0x21, 0xec, + 0x0c, 0x09, 0x7e, 0x23, 0x66, 0x6f, 0xcd, 0x7f, 0x2f, 0xe9, 0xcd, 0xa2, 0x09, 0x7c, 0xb5, 0xca, + 0x98, 0x01, 0x1e, 0x00, 0xc3, 0x97, 0x01, 0xfd, 0x7e, 0x00, 0x01, 0x03, 0x00, 0xfd, 0x09, 0xb7, + 0x28, 0xe8, 0x2a, 0xe8, 0x37, 0x7c, 0xb5, 0xc8, 0xfd, 0x56, 0xff, 0xfd, 0x5e, 0xfe, 0xed, 0x52, + 0xd8, 0xeb, 0x3e, 0x5b, 0xcd, 0x52, 0x09, 0xcd, 0xdf, 0x09, 0x3e, 0x5d, 0xcd, 0x52, 0x09, 0x3e, + 0x20, 0xc3, 0x52, 0x09, 0xcd, 0x4f, 0x1f, 0x3e, 0x0d, 0x12, 0x21, 0x00, 0x35, 0xcd, 0xf7, 0xff, + 0x18, 0x90, 0xfd, 0xe5, 0xe1, 0xcd, 0xf7, 0xff, 0xfd, 0xe5, 0xe1, 0x3e, 0x0d, 0x47, 0xed, 0xb1, + 0xe5, 0xfd, 0xe1, 0xc3, 0x9f, 0x0d, 0xfe, 0xc5, 0x28, 0xee, 0xfe, 0x64, 0x28, 0xe4, 0xfe, 0x77, + 0x28, 0x4b, 0xc3, 0xd0, 0x32, 0xfd, 0x2b, 0xcd, 0xc6, 0x15, 0xca, 0xa2, 0x0d, 0x38, 0x36, 0xf5, + 0xcd, 0x48, 0x17, 0xe5, 0xcd, 0x4f, 0x1f, 0xdd, 0xe1, 0xf1, 0xcd, 0x01, 0x16, 0xc3, 0xa2, 0x0d, + 0xcd, 0xd7, 0x0d, 0xfd, 0x22, 0xf4, 0x37, 0xcd, 0x57, 0x34, 0xcd, 0x3b, 0x18, 0x38, 0x16, 0xfe, + 0x0d, 0x28, 0xed, 0x21, 0xfe, 0x37, 0x7e, 0xe6, 0x0f, 0xf6, 0x30, 0x77, 0x18, 0xdf, 0xcd, 0x1d, + 0x0a, 0xc8, 0xd2, 0x0e, 0x0a, 0x3e, 0x10, 0x21, 0x3e, 0x11, 0xc3, 0xc1, 0x07, 0xcd, 0x36, 0x1e, + 0x43, 0xeb, 0xd9, 0xeb, 0xc1, 0x21, 0x1c, 0x17, 0xb7, 0xed, 0x42, 0x28, 0x19, 0x21, 0xc4, 0x11, + 0xb7, 0xed, 0x42, 0x3e, 0x07, 0x20, 0xe3, 0xfd, 0xe1, 0xfd, 0x22, 0xf4, 0x37, 0xeb, 0xd9, 0xeb, + 0x11, 0x00, 0x35, 0x58, 0x08, 0xc9, 0xdd, 0xe1, 0xc1, 0x78, 0xb7, 0xfa, 0xb7, 0x0e, 0xe1, 0xd9, + 0xe1, 0xd9, 0xcd, 0xda, 0x15, 0x18, 0xcd, 0x21, 0x00, 0x00, 0x39, 0xd5, 0x59, 0xcd, 0x04, 0x16, + 0xd1, 0xf9, 0x18, 0xc0, 0xcd, 0x1d, 0x0a, 0x38, 0x7b, 0xca, 0x4c, 0x0f, 0xcd, 0x5b, 0x0b, 0xe5, + 0xdd, 0xe1, 0xfd, 0x7e, 0x00, 0xfe, 0x28, 0x7a, 0x20, 0x72, 0xe5, 0xf5, 0x11, 0x01, 0x00, 0x42, + 0xfd, 0x23, 0xc5, 0xd5, 0xdd, 0xe5, 0xcd, 0x46, 0x1f, 0xcb, 0x7c, 0x20, 0x57, 0xd9, 0x23, 0xdd, + 0xe1, 0xdd, 0x23, 0xdd, 0x75, 0x00, 0xdd, 0x23, 0xdd, 0x74, 0x00, 0xc1, 0xcd, 0x15, 0x18, 0x38, + 0x46, 0xeb, 0xc1, 0x04, 0xfd, 0x7e, 0x00, 0xfe, 0x2c, 0x28, 0xd5, 0xcd, 0x45, 0x2f, 0xf1, 0xdd, + 0x23, 0xdd, 0xe3, 0xdd, 0x70, 0x00, 0xcd, 0x08, 0x18, 0xe1, 0x38, 0x2b, 0x19, 0x38, 0x28, 0xe5, + 0x24, 0x28, 0x24, 0xed, 0x72, 0x30, 0x20, 0xe1, 0x22, 0xe2, 0x37, 0x7a, 0xb3, 0x28, 0x06, 0x2b, + 0x36, 0x00, 0x1b, 0x18, 0xf6, 0xcd, 0x7f, 0x2f, 0xfe, 0x2c, 0xc2, 0xa2, 0x0d, 0xfd, 0x23, 0xcd, + 0x7f, 0x2f, 0x18, 0x80, 0x3e, 0x0a, 0x21, 0x3e, 0x0b, 0xc3, 0xc1, 0x07, 0xb7, 0x28, 0xf5, 0xfa, + 0x44, 0x0f, 0x47, 0xfd, 0x7e, 0xff, 0xfe, 0x29, 0x78, 0x28, 0xe9, 0x2a, 0xe2, 0x37, 0xd9, 0x21, + 0x00, 0x00, 0x4c, 0xcd, 0xda, 0x15, 0xcd, 0x46, 0x1f, 0xd9, 0x23, 0xeb, 0x2a, 0xe2, 0x37, 0x18, + 0xab, 0xfe, 0x23, 0x20, 0x67, 0xcd, 0x33, 0x18, 0xcd, 0x7f, 0x2f, 0xfe, 0x2c, 0xc2, 0xa2, 0x0d, + 0xfd, 0x23, 0xd5, 0xcd, 0x36, 0x1e, 0x08, 0xfa, 0xa5, 0x0f, 0xd1, 0xc5, 0xfe, 0x05, 0xca, 0x5b, + 0x33, 0x3e, 0x40, 0xcd, 0x7b, 0x32, 0xcd, 0x78, 0x33, 0xcd, 0x7c, 0x33, 0xcd, 0x80, 0x33, 0xcd, + 0x86, 0x33, 0xc1, 0x18, 0xd3, 0x26, 0x35, 0x6b, 0xd1, 0xaf, 0xcd, 0x7b, 0x32, 0x7d, 0xcd, 0x7b, + 0x32, 0x2c, 0x2d, 0x28, 0xc3, 0x2d, 0x7e, 0xcd, 0x7b, 0x32, 0x18, 0xf5, 0x06, 0x02, 0x18, 0x22, + 0x01, 0x00, 0x01, 0x18, 0x1d, 0x21, 0x00, 0x37, 0xaf, 0xbe, 0x28, 0x10, 0x3a, 0xfb, 0x37, 0xb7, + 0x28, 0x0a, 0x96, 0x28, 0x07, 0x30, 0xfb, 0xed, 0x44, 0xcd, 0x9c, 0x17, 0x3a, 0x00, 0x37, 0x4f, + 0x06, 0x00, 0xcd, 0x3c, 0x17, 0x28, 0x38, 0xcb, 0x80, 0xfd, 0x23, 0xfe, 0x7e, 0x28, 0xcd, 0xfe, + 0x3b, 0x28, 0xcd, 0xfe, 0x2c, 0x28, 0xce, 0xcd, 0x55, 0x17, 0x28, 0xe6, 0xfd, 0x2b, 0xc5, 0xcd, + 0x36, 0x1e, 0x08, 0xfa, 0x19, 0x10, 0xd1, 0xd5, 0xcb, 0x4a, 0xf5, 0xcc, 0x0f, 0x2a, 0xf1, 0xc4, + 0xce, 0x29, 0xc1, 0xc5, 0x79, 0x93, 0xd4, 0x9c, 0x17, 0xc1, 0xcd, 0xaa, 0x17, 0x18, 0xc3, 0xcb, + 0x40, 0xcc, 0x4b, 0x09, 0xc3, 0xa2, 0x0d, 0xfd, 0x23, 0x21, 0x00, 0x00, 0x22, 0xec, 0x37, 0xcd, + 0x7f, 0x2f, 0xfe, 0x87, 0xfd, 0x23, 0xca, 0xa2, 0x0d, 0xfd, 0x2b, 0xfd, 0x22, 0xec, 0x37, 0xc3, + 0x18, 0x0e, 0xfe, 0x85, 0x28, 0xe1, 0xcd, 0x46, 0x1f, 0xfd, 0x7e, 0x00, 0xfd, 0x23, 0xfe, 0xe5, + 0x28, 0x06, 0xfe, 0xe4, 0x3e, 0x27, 0x20, 0x43, 0xd9, 0xe5, 0xd9, 0xc1, 0x08, 0x78, 0xb4, 0xb5, + 0x20, 0x29, 0xb1, 0x28, 0x26, 0x08, 0x47, 0x0d, 0x28, 0x0e, 0xcd, 0x3c, 0x17, 0x28, 0x1c, 0xfd, + 0x23, 0xfe, 0x2c, 0x20, 0xf5, 0x0d, 0x20, 0xf2, 0xc5, 0xcd, 0x5d, 0x1f, 0xc1, 0x78, 0xfe, 0xe5, + 0x28, 0x25, 0xcd, 0x3c, 0x17, 0x28, 0x31, 0xfd, 0x23, 0x18, 0xf7, 0xfd, 0x7e, 0x00, 0xfd, 0x23, + 0xfe, 0x8b, 0xca, 0x18, 0x14, 0xfe, 0x0d, 0x20, 0xf2, 0x3e, 0x28, 0xc3, 0xc1, 0x07, 0xcd, 0x5d, + 0x1f, 0xcd, 0x3c, 0x17, 0xc2, 0x75, 0x0e, 0xd9, 0xcd, 0x89, 0x09, 0xe5, 0xfd, 0xe1, 0xca, 0x9f, + 0x0d, 0x3e, 0x29, 0x18, 0xe6, 0xcd, 0x5d, 0x1f, 0xfd, 0xe5, 0xcd, 0x39, 0x16, 0xcd, 0xa1, 0x10, + 0xd1, 0x21, 0xc0, 0x10, 0xb7, 0xed, 0x52, 0xfd, 0xe1, 0xca, 0xa2, 0x0d, 0x3e, 0x26, 0x18, 0xcb, + 0xfd, 0xe5, 0xcd, 0x39, 0x16, 0xcd, 0xa2, 0x0d, 0xc1, 0xc5, 0x21, 0xd8, 0x10, 0xb7, 0xed, 0x42, + 0x3e, 0x2b, 0x20, 0xb7, 0xcd, 0x46, 0x1f, 0xcd, 0xf6, 0x2c, 0xc1, 0xd1, 0x20, 0x05, 0xd5, 0xc5, + 0xd5, 0xfd, 0xe1, 0xc3, 0xa2, 0x0d, 0x3e, 0x22, 0x18, 0xa1, 0xcd, 0xc6, 0x15, 0x20, 0xf7, 0xf5, + 0xfd, 0x7e, 0x00, 0xfe, 0xb8, 0x3e, 0x24, 0x20, 0x92, 0xfd, 0x23, 0xdd, 0xe5, 0xcd, 0x3f, 0x1f, + 0xdd, 0xe1, 0xf1, 0x47, 0xc5, 0xe5, 0x21, 0x00, 0x00, 0x4c, 0xd9, 0xe5, 0x21, 0x01, 0x00, 0xd9, + 0xfd, 0x7e, 0x00, 0xfe, 0x88, 0x20, 0x09, 0xfd, 0x23, 0xdd, 0xe5, 0xcd, 0x3f, 0x1f, 0xdd, 0xe1, + 0xc5, 0xe5, 0xd9, 0xe5, 0xd9, 0xfd, 0xe5, 0xdd, 0xe5, 0xcd, 0x39, 0x16, 0xcd, 0xa2, 0x0d, 0xc1, + 0x21, 0x3f, 0x11, 0xb7, 0xed, 0x42, 0x3e, 0x20, 0x20, 0x73, 0xcd, 0x3c, 0x17, 0xe1, 0xe5, 0xc5, + 0xe5, 0xc4, 0x1d, 0x0a, 0xd1, 0xeb, 0xb7, 0xed, 0x52, 0x20, 0x50, 0xd5, 0xdd, 0x21, 0x08, 0x00, + 0xdd, 0x39, 0xcd, 0xa6, 0x20, 0xdd, 0x7e, 0x0b, 0xdd, 0xe1, 0xcd, 0xeb, 0x1f, 0xcb, 0x7a, 0xf5, + 0x3e, 0x0b, 0xcd, 0x98, 0x2f, 0xf1, 0xf5, 0xcd, 0xda, 0x15, 0xdd, 0x21, 0x0e, 0x00, 0xdd, 0x39, + 0xcd, 0xa6, 0x20, 0xf1, 0xcc, 0xdb, 0x2c, 0x3e, 0x08, 0xcd, 0x98, 0x2f, 0x24, 0x20, 0x11, 0x21, + 0x12, 0x00, 0x39, 0xf9, 0xcd, 0x7f, 0x2f, 0xfe, 0x2c, 0xc2, 0xa2, 0x0d, 0xfd, 0x23, 0x18, 0x9f, + 0xc1, 0xd1, 0xfd, 0xe1, 0xfd, 0xe5, 0xd5, 0xc5, 0xc3, 0xa2, 0x0d, 0x21, 0x12, 0x00, 0x39, 0xf9, + 0xc1, 0x21, 0x3f, 0x11, 0xed, 0x42, 0xe1, 0xe5, 0xc5, 0x28, 0x9c, 0x3e, 0x21, 0xc3, 0xc1, 0x07, + 0xf5, 0xcd, 0xc8, 0x11, 0xf5, 0xcd, 0xc8, 0x11, 0xcd, 0x39, 0x16, 0xfd, 0x2b, 0xfd, 0xe5, 0xcd, + 0xb9, 0x0a, 0xc1, 0x28, 0x39, 0x3e, 0x1e, 0x38, 0xe4, 0xc5, 0x2a, 0xdc, 0x37, 0x3e, 0xdd, 0xcd, + 0xf2, 0x17, 0x38, 0x21, 0xe5, 0xfd, 0xe1, 0xfd, 0x23, 0xcd, 0x7f, 0x2f, 0xcd, 0xb9, 0x0a, 0xfd, + 0xe5, 0xd1, 0x38, 0x09, 0xc4, 0x5b, 0x0b, 0xfd, 0xe5, 0xd1, 0x73, 0x23, 0x72, 0xeb, 0x3e, 0x0d, + 0x47, 0xed, 0xb1, 0x18, 0xd8, 0xfd, 0xe1, 0xcd, 0xb9, 0x0a, 0x3e, 0x1d, 0x20, 0xaf, 0x5e, 0x23, + 0x56, 0x21, 0x02, 0x00, 0x39, 0xcd, 0x7f, 0x2f, 0xd5, 0xfd, 0xe3, 0xd1, 0xfe, 0x28, 0x20, 0x1b, + 0xcd, 0x7f, 0x2f, 0xfe, 0x28, 0xc2, 0x75, 0x0e, 0xfd, 0xe5, 0xc1, 0xd9, 0xcd, 0xca, 0x16, 0xcd, + 0x45, 0x2f, 0xd9, 0xc5, 0xfd, 0xe1, 0xe5, 0xcd, 0x55, 0x16, 0xe1, 0x73, 0x23, 0x72, 0xc3, 0xa2, + 0x0d, 0xc1, 0xc5, 0x21, 0xc4, 0x11, 0xb7, 0xed, 0x42, 0x28, 0x13, 0x21, 0xc8, 0x11, 0xb7, 0xed, + 0x42, 0x28, 0x0b, 0x21, 0x1c, 0x17, 0xb7, 0xed, 0x42, 0x3e, 0x0c, 0xc2, 0xc1, 0x07, 0xfd, 0xe5, + 0xc1, 0xd9, 0xfd, 0x2b, 0xcd, 0xca, 0x16, 0xd9, 0xc5, 0xfd, 0xe1, 0xcd, 0x1d, 0x0a, 0xc2, 0x75, + 0x0e, 0xb7, 0x08, 0xcd, 0x00, 0x2d, 0x08, 0xf5, 0xf4, 0xda, 0x15, 0xf1, 0x59, 0xfc, 0x04, 0x16, + 0xcd, 0x7f, 0x2f, 0xfe, 0x2c, 0xc2, 0xa2, 0x0d, 0xfd, 0x23, 0xcd, 0x7f, 0x2f, 0x18, 0xdc, 0xc1, + 0x21, 0x1c, 0x17, 0xb7, 0xed, 0x42, 0x28, 0x10, 0x21, 0xc8, 0x11, 0xb7, 0xed, 0x42, 0xfd, 0xe1, + 0xca, 0xa2, 0x0d, 0x3e, 0x0d, 0xc3, 0xc1, 0x07, 0xdd, 0xe1, 0xc1, 0x78, 0xb7, 0xfa, 0xb9, 0x12, + 0xe1, 0xd9, 0xe1, 0xd9, 0xcd, 0xda, 0x15, 0x18, 0xd6, 0x21, 0x00, 0x00, 0x39, 0x59, 0xcd, 0x04, + 0x16, 0xf9, 0x18, 0xcb, 0xcd, 0x33, 0x18, 0xcd, 0x7f, 0x2f, 0xfe, 0x2c, 0xc2, 0xa2, 0x0d, 0xfd, + 0x23, 0xcd, 0x7f, 0x2f, 0xd5, 0xcd, 0x6e, 0x0e, 0xd1, 0xf5, 0xe5, 0xb7, 0xfa, 0xff, 0x12, 0xcd, + 0x98, 0x32, 0xfe, 0xff, 0xca, 0x9a, 0x33, 0xcd, 0xb3, 0x33, 0xcd, 0xb8, 0x33, 0xcd, 0xbd, 0x33, + 0xcd, 0xc4, 0x33, 0x0e, 0x00, 0xdd, 0xe1, 0xf1, 0xd5, 0xcd, 0xda, 0x15, 0xd1, 0x18, 0xc8, 0xcd, + 0x98, 0x32, 0xcd, 0x98, 0x32, 0xf5, 0x6f, 0x26, 0x35, 0x2c, 0x2d, 0xca, 0x8c, 0x33, 0x2d, 0xcd, + 0x98, 0x32, 0x77, 0x18, 0xf4, 0x3e, 0x3e, 0xc3, 0xee, 0xff, 0xfe, 0x23, 0x28, 0xa6, 0x0e, 0x00, + 0xfe, 0x86, 0x20, 0x04, 0xfd, 0x23, 0x0e, 0x80, 0x21, 0x00, 0x36, 0x36, 0x0d, 0xcd, 0x3c, 0x17, + 0xca, 0xa2, 0x0d, 0xfd, 0x23, 0xfe, 0x2c, 0x28, 0x4d, 0xfe, 0x3b, 0x28, 0x49, 0xe5, 0xfe, 0x22, + 0x20, 0x0a, 0xc5, 0xcd, 0x2d, 0x20, 0xc1, 0xcd, 0xaa, 0x17, 0x18, 0x05, 0xcd, 0x55, 0x17, 0x20, + 0x05, 0xe1, 0xcb, 0xc1, 0x18, 0xd2, 0xfd, 0x2b, 0xc5, 0xcd, 0x6e, 0x0e, 0xc1, 0xe1, 0xf5, 0x7e, + 0x23, 0xfe, 0x0d, 0xcc, 0x8a, 0x13, 0xcb, 0x79, 0xf5, 0xc4, 0xc8, 0x17, 0xf1, 0xcc, 0xb7, 0x17, + 0xf1, 0xc5, 0xe5, 0xb7, 0xfa, 0x81, 0x13, 0xf5, 0xcd, 0xeb, 0x21, 0xf1, 0xcd, 0xda, 0x15, 0x18, + 0x03, 0xcd, 0x01, 0x16, 0xe1, 0xc1, 0xcb, 0x81, 0x18, 0xa3, 0xcb, 0x41, 0x20, 0x0a, 0x3e, 0x3f, + 0xcd, 0x52, 0x09, 0x18, 0x03, 0xcd, 0x52, 0x09, 0x21, 0x00, 0x36, 0xc5, 0xe5, 0xdd, 0xe5, 0xcd, + 0x99, 0x34, 0xdd, 0xe1, 0xe1, 0xc1, 0x47, 0xaf, 0x32, 0xfb, 0x37, 0xb8, 0xc8, 0x7e, 0xfe, 0x0d, + 0xc8, 0x23, 0x10, 0xf9, 0xc9, 0xfe, 0x23, 0xca, 0xc4, 0x12, 0x2a, 0xf0, 0x37, 0x7e, 0x23, 0xfe, + 0x0d, 0xcc, 0xfa, 0x13, 0xe5, 0xcd, 0x6e, 0x0e, 0xe1, 0xb7, 0xfa, 0xe0, 0x13, 0xe5, 0xfd, 0xe3, + 0xf5, 0xdd, 0xe5, 0xcd, 0x3f, 0x1f, 0xdd, 0xe1, 0xf1, 0xcd, 0xda, 0x15, 0xfd, 0xe3, 0x18, 0x07, + 0xcd, 0xb7, 0x17, 0xe5, 0xcd, 0x01, 0x16, 0xe1, 0x22, 0xf0, 0x37, 0xcd, 0x7f, 0x2f, 0xfe, 0x2c, + 0xc2, 0xa2, 0x0d, 0xfd, 0x23, 0xcd, 0x7f, 0x2f, 0x18, 0xc3, 0x3e, 0xdc, 0xcd, 0xf2, 0x17, 0x23, + 0xd0, 0x3e, 0x2a, 0xc3, 0xc1, 0x07, 0xcd, 0x46, 0x1f, 0xcd, 0xf6, 0x2c, 0x28, 0x15, 0xfd, 0x7e, + 0x00, 0xfe, 0x8c, 0xc2, 0xa2, 0x0d, 0xfd, 0x23, 0xcd, 0x7f, 0x2f, 0xfe, 0x8d, 0xc2, 0xa2, 0x0d, + 0xc3, 0x9e, 0x10, 0xfd, 0x7e, 0x00, 0xfe, 0x0d, 0xfd, 0x23, 0xca, 0x9f, 0x0d, 0xfe, 0x8b, 0x20, + 0xf2, 0x18, 0xe5, 0xcd, 0xea, 0x2f, 0xaf, 0x32, 0xfb, 0x37, 0xc3, 0xa2, 0x0d, 0xcd, 0xe6, 0x0c, + 0x0d, 0x0a, 0xfa, 0x00, 0xcd, 0xa2, 0x09, 0xcd, 0xcc, 0x09, 0xcd, 0x4b, 0x09, 0xc3, 0x98, 0x01, + 0xcd, 0xa3, 0x31, 0xc3, 0xa2, 0x0d, 0xcd, 0xaa, 0x08, 0x2a, 0xdc, 0x37, 0x18, 0x13, 0x2a, 0xdc, + 0x37, 0xcd, 0x3c, 0x17, 0x28, 0x0b, 0xcd, 0x5d, 0x1f, 0xd9, 0xcd, 0x89, 0x09, 0x3e, 0x29, 0x20, + 0x92, 0x3e, 0xdc, 0xcd, 0xf2, 0x17, 0x22, 0xf0, 0x37, 0xc3, 0xa2, 0x0d, 0xcd, 0x29, 0x18, 0xcd, + 0x48, 0x17, 0x7b, 0xf5, 0xcd, 0x46, 0x1f, 0xe5, 0xd9, 0xd1, 0xf1, 0xc3, 0x67, 0x32, 0xc3, 0xa2, + 0x0d, 0xcd, 0x48, 0x17, 0xcd, 0x46, 0x1f, 0xd9, 0x2e, 0x00, 0x22, 0xdc, 0x37, 0xc3, 0xa2, 0x0d, + 0xc3, 0x0e, 0x33, 0xcd, 0x46, 0x1f, 0xe5, 0xd9, 0xd1, 0xcd, 0xcd, 0x2f, 0xc3, 0xa2, 0x0d, 0xcd, + 0x48, 0x17, 0xcd, 0x46, 0x1f, 0xcd, 0xaa, 0x08, 0xd9, 0x22, 0xe0, 0x37, 0x22, 0xe2, 0x37, 0xc3, + 0xa2, 0x0d, 0xcd, 0x48, 0x17, 0xcd, 0x46, 0x1f, 0xd9, 0xed, 0x5b, 0xe2, 0x37, 0x14, 0xaf, 0xed, + 0x52, 0x19, 0xda, 0xc1, 0x07, 0xed, 0x5b, 0xe4, 0x37, 0x22, 0xe4, 0x37, 0xeb, 0xed, 0x72, 0xc2, + 0xa2, 0x0d, 0xeb, 0xf9, 0xc3, 0xa2, 0x0d, 0xcd, 0x46, 0x1f, 0xd9, 0x7d, 0x32, 0xfc, 0x37, 0xc3, + 0xa2, 0x0d, 0xfd, 0x23, 0x21, 0x00, 0x00, 0xfe, 0xee, 0x28, 0x0a, 0xfe, 0x87, 0x28, 0x07, 0xfd, + 0x2b, 0xcd, 0x46, 0x1f, 0xd9, 0x2b, 0x22, 0xe8, 0x37, 0xc3, 0xa2, 0x0d, 0xcd, 0x46, 0x1f, 0xd9, + 0x7d, 0xcd, 0xee, 0xff, 0xfd, 0x7e, 0x00, 0xfe, 0x2c, 0x28, 0x08, 0xfe, 0x3b, 0x20, 0x06, 0x7c, + 0xcd, 0xee, 0xff, 0xfd, 0x23, 0xcd, 0x3c, 0x17, 0x20, 0xe2, 0xc3, 0xa2, 0x0d, 0xcd, 0x29, 0x18, + 0xcd, 0xd9, 0x31, 0xc3, 0xa2, 0x0d, 0xcd, 0x29, 0x18, 0xd5, 0xcd, 0x39, 0x2f, 0xcd, 0x46, 0x1f, + 0xd9, 0x7d, 0xd1, 0xcd, 0x7b, 0x32, 0xc3, 0xa2, 0x0d, 0xcd, 0x46, 0x1f, 0xd9, 0xe5, 0x06, 0x00, + 0x11, 0x00, 0x36, 0xcd, 0x7f, 0x2f, 0xfe, 0x2c, 0x20, 0x17, 0xfd, 0x23, 0x04, 0xcd, 0x7f, 0x2f, + 0xc5, 0xd5, 0xcd, 0x6e, 0x0e, 0xd1, 0xc1, 0x13, 0x12, 0x13, 0xeb, 0x73, 0x23, 0x72, 0xeb, 0x18, + 0xe2, 0x78, 0x32, 0x00, 0x36, 0xe1, 0xcd, 0x80, 0x15, 0xc3, 0xa2, 0x0d, 0xcd, 0x5d, 0x1f, 0xd9, + 0xe5, 0xfd, 0xe3, 0x24, 0x21, 0xaf, 0x15, 0xe5, 0xdd, 0x21, 0x00, 0x37, 0xcc, 0x3b, 0x31, 0xdd, + 0x4e, 0x18, 0xc5, 0xf1, 0xdd, 0x7e, 0x04, 0xdd, 0x46, 0x08, 0xdd, 0x4e, 0x0c, 0xdd, 0x56, 0x10, + 0xdd, 0x5e, 0x14, 0xdd, 0x66, 0x20, 0xdd, 0x6e, 0x30, 0xdd, 0x21, 0x00, 0x36, 0xfd, 0xe9, 0xfd, + 0xe1, 0xaf, 0x4f, 0xc9, 0xcd, 0x46, 0x1f, 0xd9, 0xe5, 0xcd, 0x39, 0x2f, 0xcd, 0x46, 0x1f, 0xd9, + 0xc1, 0xed, 0x69, 0xc3, 0xa2, 0x0d, 0xcd, 0x1d, 0x0a, 0xd8, 0xc4, 0x0e, 0x0a, 0xb7, 0xf8, 0xf5, + 0xcd, 0x48, 0x17, 0xe5, 0xcd, 0x3f, 0x1f, 0xdd, 0xe1, 0xf1, 0xcb, 0x47, 0x28, 0x13, 0xbf, 0xdd, + 0x71, 0x04, 0xd9, 0xdd, 0x75, 0x00, 0xdd, 0x74, 0x01, 0xd9, 0xdd, 0x75, 0x02, 0xdd, 0x74, 0x03, + 0xc9, 0xf5, 0xcd, 0xf5, 0x2b, 0xf1, 0xfe, 0x04, 0x28, 0xe8, 0xbf, 0xd9, 0xdd, 0x75, 0x00, 0xd9, + 0xc9, 0x21, 0x00, 0x35, 0x1f, 0x30, 0x3f, 0xe5, 0xcd, 0xf7, 0x1f, 0x7b, 0xd9, 0x6f, 0x7c, 0xd9, + 0xbb, 0x30, 0x14, 0xd9, 0x65, 0xd9, 0xe5, 0x06, 0x00, 0x4f, 0x09, 0xed, 0x4b, 0xe2, 0x37, 0xed, + 0x42, 0xe1, 0x37, 0x28, 0x02, 0x60, 0x69, 0xcd, 0xe2, 0x15, 0x06, 0x00, 0x4b, 0xeb, 0xe1, 0x0d, + 0x0c, 0xc8, 0xed, 0xb0, 0xd0, 0xed, 0x53, 0xe2, 0x37, 0xe5, 0x2a, 0xe2, 0x37, 0x24, 0xed, 0x72, + 0xe1, 0xd8, 0xaf, 0xc3, 0xc1, 0x07, 0x4b, 0xdd, 0xe5, 0xd1, 0xaf, 0x47, 0xb9, 0x28, 0x02, 0xed, + 0xb0, 0x3e, 0x0d, 0x12, 0xc9, 0x3e, 0xff, 0xf5, 0xfd, 0x23, 0x13, 0xd5, 0xcd, 0x7f, 0x2f, 0xcd, + 0x1d, 0x0a, 0x38, 0x38, 0xc4, 0x0e, 0x0a, 0xd1, 0xe5, 0xb7, 0xf5, 0xd5, 0xfd, 0xe3, 0xfa, 0x83, + 0x16, 0xcd, 0x3f, 0x1f, 0xfd, 0xe3, 0xd1, 0xf1, 0xd9, 0xe5, 0xd9, 0xe5, 0x47, 0xc5, 0xcd, 0x39, + 0x16, 0x18, 0x0d, 0xcd, 0x4f, 0x1f, 0xfd, 0xe3, 0xd9, 0xd1, 0xd9, 0xf1, 0xcd, 0xaa, 0x2d, 0xd9, + 0xcd, 0x7f, 0x2f, 0xfe, 0x2c, 0x20, 0x0a, 0x1a, 0xfe, 0x2c, 0x28, 0xbc, 0x3e, 0x1f, 0xc3, 0xc1, + 0x07, 0xcd, 0x45, 0x2f, 0x1a, 0xfe, 0x29, 0x20, 0xf3, 0x13, 0xd9, 0xc1, 0x78, 0x3c, 0xd9, 0xc8, + 0xd9, 0x3d, 0xfa, 0xc0, 0x16, 0xe1, 0xd9, 0xe1, 0xd9, 0xdd, 0xe1, 0xcd, 0xda, 0x15, 0x18, 0xeb, + 0xcd, 0xc9, 0x2d, 0xdd, 0xe1, 0xcd, 0x01, 0x16, 0x18, 0xe1, 0xd1, 0xfd, 0x23, 0xcd, 0x7f, 0x2f, + 0xd5, 0xd9, 0xc5, 0xd5, 0xe5, 0xd9, 0xcd, 0x6e, 0x0e, 0xd9, 0xe1, 0xd1, 0xc1, 0xd9, 0xd1, 0xb7, + 0xfa, 0xf1, 0x16, 0xd9, 0xe5, 0xd9, 0x47, 0xcd, 0xeb, 0x1f, 0xd9, 0xe3, 0xd9, 0xe5, 0xc5, 0x18, + 0x26, 0xf5, 0xd5, 0xd9, 0xe5, 0xd9, 0xcd, 0xb8, 0x20, 0xd9, 0xe1, 0xd9, 0x4b, 0xd1, 0xcd, 0x39, + 0x16, 0xf1, 0x21, 0x00, 0x00, 0x45, 0xed, 0x42, 0x39, 0xf9, 0x47, 0xc5, 0x28, 0x09, 0xd5, 0x11, + 0x00, 0x35, 0xeb, 0x45, 0xed, 0xb0, 0xd1, 0xdd, 0xe5, 0xcd, 0x1c, 0x17, 0xcd, 0x39, 0x16, 0xcd, + 0x7f, 0x2f, 0xfe, 0x2c, 0x28, 0xa5, 0xeb, 0xe9, 0xfd, 0x7e, 0x00, 0xfe, 0x20, 0xc8, 0xfe, 0x2c, + 0xc8, 0xfe, 0x29, 0xc8, 0xfe, 0x3b, 0xc8, 0xfe, 0x5c, 0xc8, 0x18, 0x06, 0xcd, 0x7f, 0x2f, 0xfe, + 0x8b, 0xd0, 0xfe, 0x3a, 0xd0, 0xfe, 0x0d, 0xc9, 0xcd, 0x7f, 0x2f, 0xfd, 0x23, 0xfe, 0x3d, 0xc8, + 0x3e, 0x04, 0xc3, 0xc1, 0x07, 0xfe, 0x8a, 0x28, 0x0c, 0xfe, 0x89, 0x28, 0x38, 0xfe, 0x27, 0xc0, + 0xcd, 0x4b, 0x09, 0xaf, 0xc9, 0xc5, 0xcd, 0x46, 0x1f, 0xd9, 0xc1, 0xfd, 0x7e, 0x00, 0xfe, 0x2c, + 0x28, 0x11, 0xcd, 0x45, 0x2f, 0x7d, 0x21, 0xfb, 0x37, 0xbe, 0xc8, 0xf5, 0xdc, 0x4b, 0x09, 0xf1, + 0x96, 0x18, 0x19, 0xfd, 0x23, 0xc5, 0xe5, 0xcd, 0x46, 0x1f, 0xd9, 0xd1, 0xc1, 0xcd, 0x45, 0x2f, + 0xcd, 0xfa, 0x2f, 0xaf, 0xc9, 0xc5, 0xcd, 0x5d, 0x1f, 0xd9, 0x7d, 0xc1, 0xb7, 0xc8, 0xc5, 0x47, + 0x3e, 0x20, 0xcd, 0x52, 0x09, 0x10, 0xf9, 0xc1, 0xaf, 0xc9, 0x21, 0x00, 0x35, 0x1c, 0x1d, 0xc8, + 0x7e, 0x23, 0xcd, 0x52, 0x09, 0x18, 0xf7, 0xf5, 0xc5, 0xe5, 0xfd, 0xe3, 0xcd, 0xd4, 0x17, 0xcd, + 0x7f, 0x2f, 0xfd, 0xe3, 0xe1, 0xc1, 0xf1, 0xc9, 0x11, 0x00, 0x35, 0x7e, 0x12, 0xfe, 0x0d, 0xc8, + 0x23, 0x1c, 0x18, 0xf7, 0xcd, 0x7f, 0x2f, 0xfe, 0x22, 0xfd, 0x23, 0xca, 0x2d, 0x20, 0xfd, 0x2b, + 0x11, 0x00, 0x35, 0xfd, 0x7e, 0x00, 0x12, 0xfe, 0x2c, 0xc8, 0xfe, 0x0d, 0xc8, 0xfd, 0x23, 0x1c, + 0x18, 0xf1, 0x06, 0x00, 0x4e, 0x0c, 0x0d, 0x28, 0x0c, 0x23, 0x23, 0x23, 0xbe, 0xc8, 0x0d, 0x0d, + 0x0d, 0x09, 0xc3, 0xf4, 0x17, 0x2b, 0x37, 0xc9, 0xfe, 0x05, 0x62, 0x6b, 0x29, 0xd8, 0x29, 0xd8, + 0xeb, 0xc0, 0x19, 0xeb, 0xc9, 0xeb, 0x21, 0x00, 0x00, 0x3e, 0x10, 0x29, 0xd8, 0xcb, 0x23, 0xcb, + 0x12, 0x30, 0x02, 0x09, 0xd8, 0x3d, 0x20, 0xf3, 0xc9, 0xcd, 0x7f, 0x2f, 0xfe, 0x23, 0x3e, 0x2d, + 0xc2, 0xc1, 0x07, 0xfd, 0x23, 0xcd, 0x5d, 0x1f, 0xd9, 0xeb, 0xc9, 0xcd, 0xb1, 0x1b, 0xfd, 0x23, + 0xfe, 0x3a, 0x28, 0xf7, 0xfe, 0x5d, 0xc8, 0xfe, 0x0d, 0xc8, 0xfd, 0x2b, 0xdd, 0x2a, 0x40, 0x37, + 0x21, 0xfe, 0x37, 0xcb, 0x76, 0x28, 0x04, 0xdd, 0x2a, 0x3c, 0x37, 0xdd, 0xe5, 0xfd, 0xe5, 0xcd, + 0xef, 0x18, 0xc1, 0xd1, 0xd8, 0xcd, 0xb1, 0x1b, 0x37, 0xc0, 0xfd, 0x2b, 0xfd, 0x23, 0xfd, 0x7e, + 0x00, 0xcd, 0x42, 0x17, 0x20, 0xf6, 0x3a, 0xfe, 0x37, 0xdd, 0xe5, 0xe1, 0xb7, 0xed, 0x52, 0xeb, + 0xe5, 0x2a, 0x40, 0x37, 0xe5, 0x19, 0x22, 0x40, 0x37, 0xcb, 0x77, 0x28, 0x07, 0x2a, 0x3c, 0x37, + 0x19, 0x22, 0x3c, 0x37, 0xe1, 0xdd, 0xe1, 0xcb, 0x67, 0x28, 0xa0, 0x7c, 0xcd, 0xdb, 0x18, 0x7d, + 0xcd, 0xd4, 0x18, 0xaf, 0xbb, 0x28, 0x15, 0x3a, 0xfb, 0x37, 0xfe, 0x11, 0x3e, 0x05, 0xd4, 0x76, + 0x17, 0xdd, 0x7e, 0x00, 0xcd, 0xd4, 0x18, 0xdd, 0x23, 0x1d, 0x20, 0xeb, 0x3e, 0x12, 0xcd, 0x76, + 0x17, 0xfd, 0xe5, 0xe1, 0xed, 0x42, 0x0a, 0xcd, 0x6b, 0x09, 0x03, 0x2d, 0x20, 0xf8, 0xcd, 0x4b, + 0x09, 0xc3, 0x3b, 0x18, 0xcd, 0xdb, 0x18, 0x3e, 0x20, 0x18, 0x11, 0xf5, 0x0f, 0x0f, 0x0f, 0x0f, + 0xcd, 0xe4, 0x18, 0xf1, 0xe6, 0x0f, 0xc6, 0x90, 0x27, 0xce, 0x40, 0x27, 0xc3, 0x6b, 0x09, 0xfe, + 0x2e, 0x20, 0x16, 0xfd, 0x23, 0xdd, 0xe5, 0xcd, 0x6e, 0x0e, 0xf5, 0xcd, 0x00, 0x2d, 0xd9, 0x2a, + 0x40, 0x37, 0xd9, 0xf1, 0xcd, 0xda, 0x15, 0xdd, 0xe1, 0xcd, 0xb1, 0x1b, 0xc8, 0xfe, 0xd6, 0x0e, + 0xc4, 0xfd, 0x23, 0xca, 0x00, 0x1a, 0xfd, 0x2b, 0x21, 0xc3, 0x1b, 0xcd, 0x68, 0x1b, 0xd8, 0x48, + 0x16, 0x00, 0xd6, 0x27, 0x30, 0x07, 0xfe, 0xe8, 0xd4, 0xce, 0x1a, 0x18, 0x68, 0xd6, 0x0a, 0x30, + 0x0f, 0xfe, 0xf9, 0xdc, 0x58, 0x1b, 0xd8, 0xcd, 0x2d, 0x1b, 0xd8, 0xcd, 0xd2, 0x1a, 0x18, 0x55, + 0xd6, 0x03, 0x30, 0x06, 0xcd, 0x4c, 0x1b, 0xd8, 0x18, 0x4b, 0xd6, 0x0a, 0x30, 0x32, 0xfe, 0xfd, + 0x06, 0x07, 0xd4, 0xe0, 0x1a, 0x78, 0xfe, 0x07, 0x20, 0x10, 0xcd, 0x2d, 0x1b, 0x79, 0x30, 0x28, + 0xee, 0x46, 0xcd, 0xd4, 0x1a, 0xcd, 0x10, 0x1b, 0x18, 0x78, 0xe6, 0x3f, 0xfe, 0x0c, 0x37, 0xc0, + 0x79, 0xfe, 0x80, 0x0e, 0x09, 0x28, 0xcd, 0xee, 0x1c, 0x0f, 0x4f, 0xcd, 0xce, 0x1a, 0x18, 0xc4, + 0xd6, 0x02, 0x30, 0x14, 0xcd, 0x33, 0x1b, 0x79, 0xd2, 0xd4, 0x1a, 0xee, 0x64, 0x07, 0x07, 0x07, + 0x4f, 0xcd, 0x50, 0x1b, 0xd8, 0x79, 0x18, 0x7f, 0xd6, 0x02, 0x30, 0x21, 0xfe, 0xff, 0xcc, 0xc3, + 0x1a, 0x08, 0xcd, 0x33, 0x1b, 0xd8, 0x08, 0xdc, 0xc3, 0x1a, 0x24, 0x28, 0xe8, 0x78, 0xfe, 0x07, + 0x37, 0xc0, 0x79, 0xee, 0x03, 0x07, 0x07, 0x07, 0xcd, 0x00, 0x1b, 0x18, 0x25, 0xd6, 0x02, 0x30, + 0x24, 0xfe, 0xff, 0xc4, 0x39, 0x1b, 0x79, 0x30, 0x02, 0x3e, 0x18, 0xcd, 0x00, 0x1b, 0xcd, 0x10, + 0x1b, 0xed, 0x5b, 0x40, 0x37, 0x13, 0x37, 0xed, 0x52, 0x7d, 0x17, 0x9f, 0xbc, 0x3e, 0x01, 0xc2, + 0xc1, 0x07, 0x7d, 0x18, 0x32, 0x47, 0x20, 0x16, 0xcd, 0x39, 0x1b, 0x79, 0x30, 0x0b, 0x78, 0xe6, + 0x3f, 0xfe, 0x06, 0x3e, 0xe9, 0x28, 0x20, 0x3e, 0xc3, 0xcd, 0x00, 0x1b, 0x18, 0x05, 0x10, 0x0c, + 0xcd, 0x1b, 0x1a, 0xcd, 0x10, 0x1b, 0xcd, 0xe2, 0x19, 0x7c, 0x18, 0x0b, 0x10, 0x0b, 0xcd, 0x10, + 0x1b, 0xa1, 0xb4, 0x20, 0xc8, 0x7d, 0xb1, 0x18, 0x78, 0x10, 0x0a, 0xcd, 0x39, 0x1b, 0x79, 0x30, + 0x70, 0xf6, 0x09, 0x18, 0x6c, 0x10, 0x6c, 0xcd, 0x65, 0x1b, 0x30, 0x5f, 0xcd, 0x33, 0x1b, 0x08, + 0xcd, 0xb1, 0x1b, 0xfe, 0x28, 0x28, 0x1d, 0x08, 0xd2, 0x5a, 0x19, 0x0e, 0x01, 0xcd, 0x50, 0x1b, + 0xd8, 0x3e, 0x0e, 0xb8, 0x47, 0xcc, 0x4c, 0x1b, 0x78, 0xe6, 0x3f, 0xfe, 0x0c, 0x79, 0x20, 0xa9, + 0x3e, 0xf9, 0x18, 0x3d, 0x08, 0xc5, 0xd4, 0x2d, 0x1b, 0x79, 0xc1, 0x30, 0x77, 0x0e, 0x0a, 0xcd, + 0x50, 0x1b, 0xcd, 0xaa, 0x1a, 0x30, 0x92, 0xcd, 0x10, 0x1b, 0x0e, 0x02, 0xcd, 0x4c, 0x1b, 0xcd, + 0xaa, 0x1a, 0xd8, 0xcd, 0x00, 0x1b, 0x18, 0x8e, 0x05, 0xca, 0x65, 0x19, 0x10, 0x85, 0xcd, 0x10, + 0x1b, 0x21, 0xfe, 0x37, 0x4f, 0xed, 0x6f, 0x79, 0xed, 0x67, 0xc9, 0xfe, 0x04, 0xdc, 0xce, 0x1a, + 0x78, 0x18, 0x6d, 0x10, 0xe3, 0xdd, 0xe5, 0xcd, 0x4f, 0x1f, 0xdd, 0xe1, 0x21, 0x00, 0x35, 0xaf, + 0xbb, 0xc8, 0x7e, 0x23, 0xcd, 0x00, 0x1b, 0x1d, 0x18, 0xf5, 0x78, 0x38, 0x0e, 0x78, 0xe6, 0x3f, + 0xfe, 0x0c, 0x79, 0xc8, 0xcd, 0xce, 0x1a, 0x79, 0xf6, 0x43, 0xc9, 0xfe, 0x07, 0x37, 0xc0, 0x79, + 0xf6, 0x30, 0xc9, 0xc5, 0xcd, 0xe0, 0x1a, 0xcb, 0x68, 0xc1, 0x28, 0x44, 0x26, 0xff, 0x3e, 0xed, + 0x18, 0x2e, 0x3e, 0xcb, 0xfe, 0x76, 0x37, 0xc8, 0xcd, 0x00, 0x1b, 0x14, 0xf0, 0x7b, 0x18, 0x20, + 0xe5, 0x21, 0x0a, 0x1d, 0xcd, 0x68, 0x1b, 0xe1, 0xd8, 0xcb, 0x78, 0xc8, 0xcb, 0x58, 0xe5, 0xcc, + 0x07, 0x1b, 0x5d, 0xe1, 0x3e, 0xdd, 0xcb, 0x70, 0x28, 0x02, 0x3e, 0xfd, 0xb7, 0x14, 0x57, 0xf8, + 0xdd, 0x77, 0x00, 0xdd, 0x23, 0xb7, 0xc9, 0xfd, 0x7e, 0x00, 0xfe, 0x29, 0x21, 0x00, 0x00, 0xc8, + 0xcd, 0xb1, 0x1b, 0xc5, 0xd5, 0xdd, 0xe5, 0xcd, 0x46, 0x1f, 0xdd, 0xe1, 0xd9, 0xd1, 0xc1, 0x7d, + 0xb7, 0xc9, 0xcd, 0xe0, 0x1a, 0xd8, 0x78, 0xe6, 0x3f, 0xfe, 0x08, 0x3f, 0xc9, 0xcd, 0x22, 0x1b, + 0xd8, 0x18, 0x2f, 0xcd, 0x22, 0x1b, 0xd8, 0x18, 0x26, 0xcd, 0xe0, 0x1a, 0xd8, 0x78, 0xe6, 0x1f, + 0xd6, 0x10, 0x30, 0x1b, 0xfe, 0xf1, 0x37, 0xc0, 0x3e, 0x03, 0x18, 0x13, 0xcd, 0xe0, 0x1a, 0xd8, + 0x78, 0xe6, 0x0f, 0xd6, 0x08, 0xd8, 0x18, 0x07, 0xcd, 0x10, 0x1b, 0xfe, 0x08, 0x3f, 0xd8, 0x07, + 0x07, 0x07, 0xb1, 0x4f, 0xc9, 0x21, 0x4f, 0x1d, 0xcd, 0xb1, 0x1b, 0x06, 0x00, 0x37, 0xc8, 0xfe, + 0xdd, 0x28, 0x04, 0xfe, 0x85, 0x3f, 0xd8, 0x7e, 0xb7, 0x28, 0xf0, 0xfd, 0xae, 0x00, 0xe6, 0x5f, + 0x28, 0x09, 0xcb, 0x7e, 0x23, 0x28, 0xfb, 0x23, 0x04, 0x18, 0xec, 0xfd, 0xe5, 0xcb, 0x7e, 0xfd, + 0x23, 0x23, 0x20, 0x10, 0xbe, 0xcc, 0xb0, 0x1b, 0x7e, 0xfd, 0xae, 0x00, 0xe6, 0x5f, 0x28, 0xed, + 0xfd, 0xe1, 0x18, 0xde, 0xcd, 0x28, 0x17, 0xc4, 0xbd, 0x1b, 0x20, 0xf4, 0x78, 0x46, 0xe1, 0xc9, + 0x23, 0xcd, 0x28, 0x17, 0xc0, 0xcd, 0x34, 0x17, 0xc8, 0xfd, 0x23, 0x18, 0xf4, 0xfe, 0x2b, 0xc8, + 0xfe, 0x2d, 0xc9, 0x4e, 0x4f, 0xd0, 0x00, 0x52, 0x4c, 0x43, 0xc1, 0x07, 0x45, 0x58, 0x00, 0x41, + 0x46, 0x00, 0x41, 0x46, 0xa7, 0x08, 0x52, 0x52, 0x43, 0xc1, 0x0f, 0x52, 0x4c, 0xc1, 0x17, 0x52, + 0x52, 0xc1, 0x1f, 0x44, 0x41, 0xc1, 0x27, 0x43, 0x50, 0xcc, 0x2f, 0x53, 0x43, 0xc6, 0x37, 0x43, + 0x43, 0xc6, 0x3f, 0x48, 0x41, 0x4c, 0xd4, 0x76, 0x45, 0x58, 0xd8, 0xd9, 0x45, 0x58, 0x00, 0x44, + 0x45, 0x00, 0x48, 0xcc, 0xeb, 0x44, 0xc9, 0xf3, 0x45, 0xc9, 0xfb, 0x4e, 0x45, 0xc7, 0x44, 0x49, + 0x4d, 0x00, 0xb0, 0x46, 0x52, 0x45, 0x54, 0xce, 0x45, 0x52, 0x45, 0x54, 0xc9, 0x4d, 0x49, 0x4d, + 0x00, 0xb1, 0x56, 0x49, 0x4d, 0x00, 0xb2, 0x5e, 0x52, 0x52, 0xc4, 0x67, 0x52, 0x4c, 0xc4, 0x6f, + 0x4c, 0x44, 0xc9, 0xa0, 0x43, 0x50, 0xc9, 0xa1, 0x49, 0x4e, 0xc9, 0xa2, 0x4f, 0x55, 0x54, 0xc9, + 0xa3, 0x4c, 0x44, 0xc4, 0xa8, 0x43, 0x50, 0xc4, 0xa9, 0x49, 0x4e, 0xc4, 0xaa, 0x4f, 0x55, 0x54, + 0xc4, 0xab, 0x4c, 0x44, 0x49, 0xd2, 0xb0, 0x43, 0x50, 0x49, 0xd2, 0xb1, 0x49, 0x4e, 0x49, 0xd2, + 0xb2, 0x4f, 0x54, 0x49, 0xd2, 0xb3, 0x4c, 0x44, 0x44, 0xd2, 0xb8, 0x43, 0x50, 0x44, 0xd2, 0xb9, + 0x49, 0x4e, 0x44, 0xd2, 0xba, 0x4f, 0x54, 0x44, 0xd2, 0xbb, 0x42, 0x49, 0xd4, 0x40, 0x52, 0x45, + 0xd3, 0x80, 0x53, 0x45, 0xd4, 0xc0, 0x52, 0x4c, 0xc3, 0x00, 0x52, 0x52, 0xc3, 0x08, 0x52, 0xcc, + 0x10, 0x52, 0xd2, 0x18, 0x53, 0x4c, 0xc1, 0x20, 0x53, 0x52, 0xc1, 0x28, 0x53, 0x52, 0xcc, 0x38, + 0x50, 0x4f, 0xd0, 0xc1, 0x50, 0x55, 0x53, 0xc8, 0xc5, 0x45, 0x58, 0x00, 0x28, 0x53, 0xd0, 0xe3, + 0x53, 0x55, 0xc2, 0x90, 0x41, 0x4e, 0xc4, 0xa0, 0x58, 0x4f, 0xd2, 0xa8, 0x4f, 0xd2, 0xb0, 0x43, + 0xd0, 0xb8, 0x80, 0xa0, 0x84, 0xb0, 0x41, 0x44, 0xc4, 0x80, 0x41, 0x44, 0xc3, 0x88, 0x53, 0x42, + 0xc3, 0x98, 0x49, 0x4e, 0xc3, 0x04, 0x44, 0x45, 0xc3, 0x05, 0x49, 0xce, 0x40, 0x4f, 0x55, 0xd4, + 0x41, 0x4a, 0xd2, 0x20, 0x44, 0x4a, 0x4e, 0xda, 0x10, 0x4a, 0xd0, 0xc2, 0x43, 0x41, 0x4c, 0xcc, + 0xc4, 0x52, 0x53, 0xd4, 0xc7, 0x52, 0x45, 0xd4, 0xc0, 0x4c, 0xc4, 0x40, 0x5d, 0xcd, 0x00, 0x5d, + 0xc2, 0x00, 0x4f, 0x50, 0xd4, 0x00, 0x5d, 0xd7, 0x00, 0x00, 0xc2, 0x00, 0xc3, 0x01, 0xc4, 0x02, + 0xc5, 0x03, 0xc8, 0x04, 0xcc, 0x05, 0x28, 0x48, 0xcc, 0x06, 0xc1, 0x07, 0x28, 0x49, 0xd8, 0x86, + 0x28, 0x49, 0xd9, 0xc6, 0x42, 0xc3, 0x08, 0x44, 0xc5, 0x0a, 0x48, 0xcc, 0x0c, 0x49, 0xd8, 0x8c, + 0x49, 0xd9, 0xcc, 0x41, 0xc6, 0x0e, 0x53, 0xd0, 0x0e, 0x4e, 0xda, 0x10, 0xda, 0x11, 0x4e, 0xc3, + 0x12, 0x50, 0xcf, 0x14, 0x50, 0xc5, 0x15, 0xd0, 0x16, 0xcd, 0x17, 0x28, 0xc3, 0x20, 0x00, 0x49, + 0x00, 0xc1, 0x47, 0x52, 0x00, 0xc1, 0x4f, 0x41, 0x00, 0xc9, 0x57, 0x41, 0x00, 0xd2, 0x5f, 0x28, + 0x42, 0x43, 0x00, 0xc1, 0x02, 0x28, 0x44, 0x45, 0x00, 0xc1, 0x12, 0x41, 0x00, 0x28, 0x42, 0xc3, + 0x0a, 0x41, 0x00, 0x28, 0x44, 0xc5, 0x1a, 0x00, 0xa1, 0x29, 0x5a, 0x32, 0x97, 0x21, 0x53, 0x21, + 0x9f, 0x21, 0x49, 0x21, 0x4e, 0x21, 0xda, 0x20, 0xed, 0x24, 0x48, 0x30, 0x36, 0x21, 0xee, 0x24, + 0x1d, 0x25, 0x12, 0x21, 0x2a, 0x23, 0x71, 0x21, 0xb4, 0x21, 0x67, 0x21, 0x6c, 0x21, 0x08, 0x22, + 0xca, 0x23, 0x8f, 0x21, 0x00, 0x2d, 0xc0, 0x11, 0x20, 0x21, 0x1b, 0x21, 0x9f, 0x25, 0x9b, 0x22, + 0x43, 0x21, 0x58, 0x24, 0xdb, 0x24, 0xe8, 0x20, 0x62, 0x32, 0x5e, 0x32, 0xa8, 0x21, 0x12, 0x30, + 0xfb, 0x20, 0xbc, 0x21, 0x35, 0x22, 0xd5, 0x21, 0x38, 0x23, 0xb4, 0x22, 0x0a, 0x23, 0x58, 0x21, + 0x96, 0x29, 0x7c, 0x15, 0xe8, 0x21, 0x01, 0x21, 0x1f, 0x26, 0x3c, 0x26, 0x2c, 0x26, 0x73, 0x26, + 0x42, 0x26, 0x8e, 0x26, 0xf7, 0x29, 0xa2, 0x26, 0x06, 0x21, 0xd8, 0x26, 0x3b, 0x27, 0xea, 0x26, + 0x0e, 0x27, 0xfc, 0x26, 0x70, 0x29, 0x82, 0x29, 0x60, 0x29, 0x3f, 0x29, 0x92, 0x29, 0x05, 0x28, + 0x5e, 0x27, 0x4f, 0x29, 0x48, 0x27, 0xa3, 0x28, 0xbd, 0x27, 0xd5, 0x26, 0x38, 0x27, 0xe7, 0x26, + 0x0b, 0x27, 0xf9, 0x26, 0x6b, 0x29, 0x7d, 0x29, 0x5b, 0x29, 0x3a, 0x29, 0x8d, 0x29, 0x53, 0x28, + 0x68, 0x27, 0x4a, 0x29, 0x52, 0x27, 0x0b, 0x29, 0xc0, 0x27, 0x66, 0x29, 0x78, 0x29, 0x56, 0x29, + 0x35, 0x29, 0x88, 0x29, 0x45, 0x29, 0xcd, 0x4b, 0x1e, 0xfe, 0x82, 0x28, 0x03, 0xfe, 0x84, 0xc0, + 0xcd, 0x52, 0x2f, 0xcd, 0x4b, 0x1e, 0xcd, 0x60, 0x2f, 0x18, 0xee, 0xcd, 0x5c, 0x1e, 0xfe, 0x80, + 0xc0, 0xcd, 0x52, 0x2f, 0xcd, 0x5c, 0x1e, 0xcd, 0x60, 0x2f, 0x18, 0xf2, 0xcd, 0xbb, 0x1e, 0xcd, + 0x22, 0x2f, 0xc0, 0x47, 0xfd, 0x23, 0xcd, 0x7f, 0x2f, 0xcd, 0x22, 0x2f, 0x20, 0x08, 0xfd, 0x23, + 0xb8, 0xca, 0x75, 0x0e, 0x80, 0x47, 0x78, 0x08, 0xfa, 0x8e, 0x1e, 0x08, 0xd6, 0x04, 0xfe, 0x3a, + 0x20, 0x02, 0xc6, 0x02, 0xcd, 0x54, 0x2f, 0xcd, 0xbb, 0x1e, 0xcd, 0x60, 0x2f, 0xc9, 0x08, 0x3d, + 0xe6, 0x07, 0xcd, 0xaa, 0x2d, 0xf5, 0xcd, 0xbb, 0x1e, 0x08, 0xf2, 0x6b, 0x1f, 0xf1, 0x4b, 0xd1, + 0x21, 0x00, 0x00, 0x39, 0x43, 0xd5, 0x11, 0x00, 0x35, 0xeb, 0xcd, 0x8a, 0x2f, 0xd1, 0xeb, 0x26, + 0x00, 0x39, 0xf9, 0xeb, 0xaf, 0x4f, 0x08, 0xfd, 0x7e, 0x00, 0xc9, 0xcd, 0x0a, 0x1f, 0xfe, 0x2d, + 0x28, 0x08, 0xfe, 0x2b, 0xc0, 0x08, 0xfa, 0xd5, 0x1e, 0x08, 0xcd, 0x52, 0x2f, 0xcd, 0x0a, 0x1f, + 0xcd, 0x60, 0x2f, 0x18, 0xe9, 0x08, 0xfd, 0x23, 0xcd, 0xaa, 0x2d, 0xcd, 0x0a, 0x1f, 0x08, 0xf2, + 0x6b, 0x1f, 0x4b, 0xd1, 0xd5, 0x21, 0x00, 0x35, 0x54, 0x79, 0xb7, 0x28, 0x0f, 0x45, 0x6f, 0x83, + 0x5f, 0x3e, 0x13, 0xda, 0xc1, 0x07, 0xd5, 0x1d, 0x2d, 0xed, 0xb8, 0xd1, 0xd9, 0xc1, 0xcd, 0xc9, + 0x2d, 0xd9, 0xf6, 0x80, 0x08, 0xfd, 0x7e, 0x00, 0x18, 0xb4, 0xcd, 0x27, 0x1f, 0xfe, 0x2a, 0x28, + 0x0b, 0xfe, 0x2f, 0x28, 0x07, 0xfe, 0x83, 0x28, 0x03, 0xfe, 0x81, 0xc0, 0xcd, 0x52, 0x2f, 0xcd, + 0x27, 0x1f, 0xcd, 0x60, 0x2f, 0x18, 0xe6, 0xcd, 0xae, 0x1f, 0xb7, 0x08, 0xcd, 0x7f, 0x2f, 0xfe, + 0x5e, 0xc0, 0xcd, 0x52, 0x2f, 0xcd, 0xae, 0x1f, 0xb7, 0x08, 0xcd, 0x60, 0x2f, 0x18, 0xed, 0xcd, + 0x36, 0x1e, 0x08, 0xf0, 0x18, 0x25, 0xcd, 0x36, 0x1e, 0x08, 0xf2, 0xf5, 0x2b, 0x18, 0x1c, 0xcd, + 0x36, 0x1e, 0x08, 0xf8, 0x18, 0x15, 0xcd, 0xae, 0x1f, 0xb7, 0xf0, 0x18, 0x0e, 0xcd, 0xae, 0x1f, + 0xb7, 0xf2, 0xf5, 0x2b, 0x18, 0x05, 0xcd, 0xae, 0x1f, 0xb7, 0xf8, 0x3e, 0x06, 0xc3, 0xc1, 0x07, + 0xcd, 0x36, 0x1e, 0xcd, 0x45, 0x2f, 0x08, 0xc9, 0xcd, 0x00, 0x2d, 0xcd, 0x0e, 0x2f, 0x38, 0x1b, + 0xfd, 0x23, 0xe6, 0x0f, 0xcd, 0x75, 0x2d, 0xcd, 0x75, 0x2d, 0xcd, 0x75, 0x2d, 0xcd, 0x75, 0x2d, + 0xd9, 0xb5, 0x6f, 0xd9, 0xcd, 0x0e, 0x2f, 0x30, 0xe7, 0xaf, 0xc9, 0x3e, 0x1c, 0xc3, 0xc1, 0x07, + 0xcd, 0x56, 0x1f, 0x0d, 0x0c, 0xca, 0x04, 0x2c, 0x7c, 0xee, 0x80, 0x67, 0xaf, 0xc9, 0xcd, 0x39, + 0x16, 0xcd, 0x7f, 0x2f, 0xfd, 0x23, 0xfe, 0x26, 0x28, 0xbe, 0xfe, 0x2d, 0x28, 0xe2, 0xfe, 0x2b, + 0x28, 0x94, 0xfe, 0x28, 0x28, 0xaa, 0xfe, 0x22, 0x28, 0x63, 0xfe, 0xc6, 0xd2, 0x82, 0x32, 0xfe, + 0x8d, 0xd2, 0x90, 0x2f, 0xfd, 0x2b, 0xfe, 0x3a, 0x30, 0x08, 0xfe, 0x30, 0x30, 0x74, 0xfe, 0x2e, + 0x28, 0x70, 0xcd, 0x1d, 0x0a, 0x20, 0x2b, 0xb7, 0xfa, 0xb8, 0x20, 0xb7, 0x28, 0x18, 0x0e, 0x00, + 0xcb, 0x47, 0x28, 0x03, 0xdd, 0x4e, 0x04, 0xd9, 0xdd, 0x6e, 0x00, 0xdd, 0x66, 0x01, 0xd9, 0xdd, + 0x6e, 0x02, 0xdd, 0x66, 0x03, 0xc9, 0x21, 0x00, 0x00, 0xd9, 0x26, 0x00, 0xdd, 0x6e, 0x00, 0xd9, + 0x4c, 0xc9, 0xda, 0x75, 0x0e, 0x3a, 0xfe, 0x37, 0xcb, 0x6f, 0x3e, 0x1a, 0x20, 0x23, 0xfd, 0x23, + 0xcd, 0xe4, 0x0b, 0x30, 0xf9, 0xdd, 0x21, 0x40, 0x37, 0xaf, 0x4f, 0x18, 0xca, 0x11, 0x00, 0x35, + 0xfd, 0x7e, 0x00, 0xfd, 0x23, 0xfe, 0x22, 0x28, 0x0b, 0x12, 0xfe, 0x20, 0x1c, 0x30, 0xf1, 0x3e, + 0x09, 0xc3, 0xc1, 0x07, 0xfd, 0x7e, 0x00, 0xfe, 0x22, 0xfd, 0x23, 0x28, 0xec, 0xfd, 0x2b, 0x3e, + 0x80, 0xc9, 0xcd, 0x00, 0x2d, 0x0e, 0x00, 0xcd, 0xb4, 0x2b, 0xfe, 0x2e, 0x06, 0x00, 0xcc, 0xb2, + 0x2b, 0xfe, 0x45, 0x3e, 0x00, 0xcc, 0x7d, 0x2b, 0xcb, 0x7c, 0x20, 0x08, 0xb7, 0x20, 0x05, 0xb8, + 0x20, 0x02, 0xb9, 0xc8, 0x90, 0x81, 0x0e, 0x9f, 0xcd, 0x97, 0x2c, 0xcb, 0xbc, 0xb7, 0xc8, 0xfa, + 0x8a, 0x20, 0xcd, 0x21, 0x2e, 0xcd, 0x53, 0x28, 0xaf, 0xc9, 0xfe, 0xda, 0x38, 0x0a, 0xed, 0x44, + 0xcd, 0x21, 0x2e, 0xcd, 0xc0, 0x27, 0xaf, 0xc9, 0xf5, 0x3e, 0x26, 0xcd, 0x21, 0x2e, 0xcd, 0xc0, + 0x27, 0xf1, 0xc6, 0x26, 0x18, 0xe4, 0xdd, 0x46, 0x04, 0xd9, 0xdd, 0x5e, 0x00, 0xdd, 0x56, 0x01, + 0xd9, 0xdd, 0x5e, 0x02, 0xdd, 0x56, 0x03, 0xc9, 0x11, 0x00, 0x35, 0x1f, 0x30, 0x10, 0xcd, 0xf7, + 0x1f, 0xd9, 0x7d, 0xd9, 0xb7, 0x4f, 0x3e, 0x80, 0xc8, 0x06, 0x00, 0xed, 0xb0, 0xc9, 0x7e, 0x12, + 0x23, 0xfe, 0x0d, 0x3e, 0x80, 0xc8, 0x1c, 0x20, 0xf5, 0xc9, 0xcd, 0x56, 0x1f, 0xcb, 0x7c, 0xc8, + 0x0d, 0x0c, 0xca, 0x04, 0x2c, 0xcb, 0xbc, 0xc9, 0xcd, 0x5d, 0x1f, 0x7c, 0x2f, 0x67, 0x7d, 0x2f, + 0x6f, 0xd9, 0x7c, 0x2f, 0x67, 0x7d, 0x2f, 0x6f, 0xd9, 0xaf, 0xc9, 0xcd, 0x07, 0x30, 0xeb, 0x18, + 0x75, 0xcd, 0x07, 0x30, 0x18, 0x70, 0xcd, 0x29, 0x18, 0xcd, 0xb2, 0x32, 0xca, 0x96, 0x29, 0xc3, + 0x00, 0x2d, 0xcd, 0x29, 0x18, 0xcd, 0x98, 0x32, 0x6f, 0x18, 0x59, 0xcd, 0x2c, 0x26, 0x18, 0x19, + 0xcd, 0x7f, 0x2f, 0xfe, 0x28, 0x20, 0x0a, 0xcd, 0x5d, 0x1f, 0xd9, 0x44, 0x4d, 0xed, 0x68, 0x18, + 0x43, 0xcd, 0x3c, 0x26, 0x18, 0x08, 0xcd, 0x66, 0x1f, 0xaf, 0xbb, 0xca, 0x96, 0x29, 0x2a, 0x00, + 0x35, 0x18, 0x31, 0xcd, 0x66, 0x1f, 0xeb, 0x18, 0x2b, 0x2a, 0xe0, 0x37, 0x18, 0x28, 0x2a, 0xe4, + 0x37, 0x18, 0x23, 0x2a, 0xdc, 0x37, 0x18, 0x1e, 0xfd, 0x7e, 0x00, 0xfd, 0x23, 0xfe, 0x50, 0xc2, + 0x75, 0x0e, 0x2a, 0xde, 0x37, 0x18, 0x0f, 0x2a, 0xf2, 0x37, 0x18, 0x0a, 0x2a, 0xfd, 0x37, 0x18, + 0x03, 0x2a, 0xfb, 0x37, 0x26, 0x00, 0xd9, 0xaf, 0x4f, 0x67, 0x6f, 0xc9, 0xf6, 0x37, 0xf5, 0xcd, + 0x66, 0x1f, 0x3e, 0x0d, 0x12, 0xf1, 0x21, 0x00, 0x35, 0xcd, 0xce, 0xff, 0x6f, 0x18, 0xe5, 0xcd, + 0x29, 0x18, 0xcd, 0xb4, 0x32, 0x18, 0x0b, 0xcd, 0x29, 0x18, 0xcd, 0xcd, 0x32, 0x18, 0x03, 0xc3, + 0xe9, 0x32, 0xd5, 0xd9, 0xe1, 0xaf, 0x4f, 0xc9, 0x21, 0x0f, 0x49, 0xd9, 0x21, 0xa2, 0xda, 0xd9, + 0x0e, 0x81, 0xaf, 0xc9, 0xcd, 0xc4, 0x21, 0xcd, 0x53, 0x28, 0xaf, 0xc9, 0xcd, 0xc4, 0x21, 0xcd, + 0xc0, 0x27, 0xaf, 0xc9, 0xcd, 0x56, 0x1f, 0xcd, 0xb1, 0x2c, 0x11, 0x2e, 0x65, 0xd9, 0x11, 0xd3, + 0xe0, 0xd9, 0x06, 0x85, 0xc9, 0xcd, 0x56, 0x1f, 0xcd, 0xf6, 0x2c, 0xb1, 0xc8, 0xcb, 0x7c, 0xc2, + 0x96, 0x29, 0xcd, 0x00, 0x2d, 0xc3, 0xc7, 0x2c, 0xcd, 0x66, 0x1f, 0xaf, 0x12, 0xfd, 0xe5, 0xfd, + 0x21, 0x00, 0x35, 0xcd, 0x7f, 0x2f, 0xcd, 0x2b, 0x2f, 0xf5, 0xcd, 0x52, 0x20, 0xf1, 0xfd, 0xe1, + 0xfe, 0x2d, 0x3e, 0x00, 0xc0, 0xc3, 0xa3, 0x1f, 0xcd, 0x66, 0x1f, 0x3e, 0x0d, 0x12, 0xfd, 0xe5, + 0x11, 0x00, 0x35, 0xfd, 0x21, 0x00, 0x35, 0x0e, 0x00, 0xcd, 0x10, 0x0c, 0x12, 0x13, 0xaf, 0xcd, + 0xaa, 0x2d, 0xfd, 0x21, 0x02, 0x00, 0xfd, 0x39, 0xcd, 0x36, 0x1e, 0xfd, 0xe1, 0xfd, 0x39, 0xfd, + 0xf9, 0xfd, 0xe1, 0x08, 0xc9, 0xdd, 0x21, 0xf6, 0x37, 0xcd, 0x7f, 0x2f, 0xfe, 0x28, 0x28, 0x1c, + 0xcd, 0xf4, 0x1f, 0xcb, 0x19, 0x06, 0x20, 0xd9, 0xed, 0x6a, 0xd9, 0xed, 0x6a, 0xcb, 0x5d, 0x28, + 0x01, 0x3f, 0x10, 0xf3, 0xcb, 0x11, 0xcd, 0xdf, 0x15, 0xaf, 0x4f, 0xc9, 0xcd, 0x5d, 0x1f, 0xdd, + 0x21, 0xf6, 0x37, 0xcb, 0x7c, 0x37, 0x20, 0xec, 0xcd, 0xf6, 0x2c, 0xf5, 0xcd, 0xdb, 0x2c, 0xd9, + 0xcd, 0xf4, 0x1f, 0xc4, 0x43, 0x22, 0xd9, 0x0e, 0x7f, 0xcd, 0x97, 0x2c, 0xcb, 0xbc, 0xf1, 0xc8, + 0xd9, 0x7b, 0x3d, 0xb2, 0xd9, 0xb3, 0xb2, 0xc8, 0x06, 0x00, 0xcd, 0xdb, 0x2c, 0xcd, 0xb1, 0x2c, + 0xcd, 0x53, 0x28, 0xcd, 0xf5, 0x2b, 0xcd, 0xc7, 0x2c, 0xaf, 0xc9, 0xcd, 0x56, 0x1f, 0x0d, 0x0c, + 0xc8, 0x3e, 0x9f, 0x44, 0xcd, 0xdc, 0x2b, 0x08, 0xa0, 0xfc, 0xc7, 0x2c, 0x78, 0xb7, 0xfc, 0x04, + 0x2c, 0xaf, 0x4f, 0xc9, 0xcd, 0x56, 0x1f, 0xcd, 0xb1, 0x2c, 0xcb, 0x7c, 0x3e, 0x15, 0xc2, 0xc1, + 0x07, 0x0d, 0x0c, 0xc8, 0xcb, 0xfc, 0xcb, 0x41, 0xcc, 0xe3, 0x2c, 0x79, 0xd6, 0x80, 0xcb, 0x2f, + 0xc6, 0x80, 0x4f, 0xc5, 0xeb, 0x21, 0x00, 0x00, 0x44, 0x4d, 0xd9, 0xeb, 0x21, 0x00, 0x00, 0x44, + 0x4d, 0x3e, 0xe1, 0xcd, 0xbe, 0x2e, 0xd9, 0xcb, 0x78, 0xd9, 0xcc, 0xbe, 0x2e, 0xcd, 0xf7, 0x2e, + 0xb7, 0xcd, 0x78, 0x2e, 0xcb, 0x1b, 0x60, 0x69, 0xd9, 0x60, 0x69, 0xdc, 0xc7, 0x2c, 0xc1, 0xdc, + 0xef, 0x2c, 0x1f, 0x9f, 0x81, 0x4f, 0xcb, 0xbc, 0xaf, 0xc9, 0xcd, 0x56, 0x1f, 0xcd, 0xb1, 0x2c, + 0xcd, 0x95, 0x2d, 0xcd, 0x30, 0x23, 0xcd, 0x9e, 0x2d, 0xcd, 0x95, 0x2d, 0xcd, 0xdb, 0x2c, 0xcd, + 0x3e, 0x23, 0xcd, 0x9e, 0x2d, 0xcd, 0xc0, 0x27, 0xaf, 0xc9, 0xcd, 0x56, 0x1f, 0xcd, 0xb1, 0x2c, + 0xcd, 0x26, 0x2c, 0x1c, 0x1c, 0x7b, 0x18, 0x11, 0xcd, 0x56, 0x1f, 0xcd, 0xb1, 0x2c, 0xe5, 0xcd, + 0x26, 0x2c, 0xf1, 0x07, 0x07, 0x07, 0xe6, 0x04, 0xab, 0xf5, 0xcb, 0xbc, 0x1f, 0xcd, 0xbf, 0x23, + 0xdc, 0x58, 0x27, 0xf1, 0xf5, 0xe6, 0x03, 0xe2, 0x88, 0x23, 0xcd, 0x95, 0x2d, 0xcd, 0x8f, 0x2d, + 0xcd, 0xfa, 0x2d, 0xb7, 0xa8, 0x11, 0x36, 0x6d, 0x26, 0xde, 0x05, 0xd0, 0x73, 0xc0, 0x80, 0x88, + 0x08, 0x79, 0x9d, 0xaa, 0xaa, 0xaa, 0x7d, 0x00, 0x00, 0x00, 0x00, 0x80, 0xcd, 0x9e, 0x2d, 0xcd, + 0x9e, 0x2d, 0xcd, 0x53, 0x28, 0xc3, 0xaa, 0x23, 0xcd, 0x8f, 0x2d, 0xcd, 0xfa, 0x2d, 0x71, 0xd5, + 0x78, 0x4c, 0x70, 0xaf, 0x94, 0x03, 0xb6, 0x76, 0xc8, 0x9c, 0xaa, 0x2a, 0x7b, 0xdd, 0xff, 0xff, + 0xff, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x80, 0xcd, 0x9e, 0x2d, 0xf1, 0xe6, 0x04, 0xc8, 0x0d, 0x0c, + 0xc8, 0xcb, 0xfc, 0xc9, 0x11, 0x00, 0x00, 0xd9, 0x11, 0x00, 0x00, 0xd9, 0x06, 0x80, 0xc9, 0x11, + 0x0f, 0x49, 0xd9, 0x11, 0xa2, 0xda, 0xd9, 0x06, 0x7f, 0xc9, 0xcd, 0x56, 0x1f, 0xcd, 0xb1, 0x2c, + 0xcd, 0x4d, 0x24, 0xd9, 0x1d, 0x01, 0xcf, 0xd1, 0xd9, 0xe5, 0xcd, 0x36, 0x2c, 0xf1, 0xcb, 0x7b, + 0x28, 0x09, 0x17, 0xda, 0x00, 0x2d, 0x3e, 0x18, 0xc3, 0xc1, 0x07, 0xe6, 0x80, 0xb3, 0xf5, 0xcb, + 0xbc, 0xcd, 0x95, 0x2d, 0xcd, 0xfa, 0x2d, 0x72, 0x40, 0x2e, 0x94, 0x73, 0x65, 0x6f, 0x4f, 0x2e, + 0x76, 0x37, 0x6d, 0x02, 0x88, 0x79, 0x12, 0xe5, 0xa0, 0x2a, 0x7b, 0x14, 0x4f, 0xaa, 0xaa, 0x7d, + 0x56, 0xfd, 0xff, 0x7f, 0x7e, 0xfe, 0xff, 0xff, 0xff, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x80, 0xcd, + 0x9e, 0x2d, 0xf1, 0xf5, 0xf4, 0x44, 0x24, 0xf1, 0xf2, 0x2f, 0x24, 0xe6, 0x7f, 0xed, 0x44, 0xc6, + 0x80, 0x81, 0x38, 0x05, 0xf2, 0x00, 0x2d, 0x18, 0x03, 0xfa, 0xf1, 0x2c, 0xc6, 0x80, 0xca, 0x00, + 0x2d, 0x4f, 0xaf, 0xc9, 0xcd, 0xb4, 0x23, 0xcd, 0xdb, 0x2c, 0xc3, 0xc0, 0x27, 0x11, 0x62, 0x31, + 0xd9, 0x11, 0xf8, 0x17, 0xd9, 0x06, 0x7f, 0xc9, 0xcd, 0x56, 0x1f, 0xcd, 0xb1, 0x2c, 0x3e, 0x16, + 0xcb, 0x7c, 0xc2, 0xc1, 0x07, 0x0c, 0x0d, 0xca, 0xc1, 0x07, 0x11, 0x04, 0x35, 0xd9, 0x11, 0x33, + 0xf3, 0xd9, 0xcd, 0x12, 0x2d, 0x79, 0x0e, 0x80, 0x38, 0x02, 0x0d, 0x3c, 0xf5, 0xcd, 0xdc, 0x2d, + 0xcd, 0x95, 0x2d, 0xcd, 0x8f, 0x2d, 0xcd, 0xfa, 0x2d, 0x48, 0xcc, 0xfb, 0x74, 0x7d, 0xaf, 0xae, + 0xff, 0x11, 0x7e, 0x8c, 0xd9, 0xcd, 0x4c, 0x7e, 0xe3, 0xa9, 0xaa, 0x2a, 0x7f, 0x00, 0x00, 0x00, + 0x00, 0x81, 0xcd, 0x9e, 0x2d, 0xcd, 0x9e, 0x2d, 0xcd, 0x53, 0x28, 0xf1, 0xcd, 0x95, 0x2d, 0x08, + 0xcd, 0x00, 0x2d, 0x08, 0xd6, 0x80, 0x28, 0x1b, 0x30, 0x02, 0x2f, 0x3c, 0x67, 0x0e, 0x87, 0xf5, + 0xcd, 0x97, 0x2c, 0xcb, 0xbc, 0xcd, 0x4d, 0x24, 0xcd, 0x53, 0x28, 0xf1, 0x30, 0x05, 0xfa, 0xd3, + 0x24, 0xcb, 0xfc, 0xcd, 0x9e, 0x2d, 0xcd, 0x68, 0x27, 0xaf, 0xc9, 0xcd, 0x58, 0x24, 0x11, 0x5b, + 0x5e, 0xd9, 0x11, 0xa9, 0xd8, 0xd9, 0x06, 0x7e, 0xcd, 0x53, 0x28, 0xaf, 0xc9, 0xf6, 0xaf, 0xf5, + 0xcd, 0x56, 0x1f, 0xcd, 0xb1, 0x2c, 0xcd, 0x95, 0x2d, 0xcd, 0x87, 0x2d, 0xcd, 0x53, 0x28, 0xcd, + 0xb4, 0x23, 0xcd, 0x58, 0x27, 0xcd, 0xba, 0x22, 0xcd, 0x9e, 0x2d, 0xf1, 0xcc, 0xdb, 0x2c, 0x04, + 0x05, 0x20, 0x05, 0xcd, 0xa8, 0x21, 0x0d, 0xc9, 0xcd, 0xc0, 0x27, 0x18, 0x06, 0xcd, 0x56, 0x1f, + 0xcd, 0xb1, 0x2c, 0x7c, 0xf5, 0xcb, 0xbc, 0x11, 0x13, 0x54, 0xd9, 0x11, 0xd0, 0xcc, 0xd9, 0x06, + 0x7e, 0xcd, 0x0f, 0x2d, 0x06, 0x00, 0x38, 0x1b, 0x11, 0x82, 0x1a, 0xd9, 0x11, 0x9a, 0x79, 0xd9, + 0x06, 0x81, 0xcd, 0x0f, 0x2d, 0x38, 0x07, 0xcd, 0x44, 0x24, 0x06, 0x02, 0x18, 0x05, 0xcd, 0xdc, + 0x2d, 0x06, 0x01, 0xc5, 0xcd, 0x95, 0x2d, 0xcd, 0x8f, 0x2d, 0xcd, 0xfa, 0x2d, 0x35, 0xf3, 0xd8, + 0x37, 0x7b, 0x91, 0x6b, 0xb9, 0xaa, 0x7c, 0xde, 0x41, 0x97, 0x61, 0x7c, 0x7b, 0x9d, 0x37, 0x92, + 0x7d, 0x5a, 0x2a, 0xcc, 0x4c, 0x7d, 0x5c, 0xa9, 0xaa, 0xaa, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x80, + 0xcd, 0x9e, 0x2d, 0xcd, 0x9e, 0x2d, 0xcd, 0x53, 0x28, 0xcd, 0xbf, 0x23, 0xf1, 0x1f, 0xf5, 0xdc, + 0x68, 0x27, 0xf1, 0x04, 0x1f, 0xdc, 0x58, 0x27, 0xf1, 0xb7, 0xf0, 0xcb, 0xfc, 0xaf, 0xc9, 0xcd, + 0x36, 0x2f, 0xcd, 0xaa, 0x2d, 0xcd, 0x4f, 0x1f, 0x4b, 0xd1, 0x21, 0x00, 0x00, 0x39, 0xd5, 0xcd, + 0xbf, 0x25, 0xcd, 0x45, 0x2f, 0xe1, 0x26, 0x00, 0x39, 0xf9, 0xaf, 0x67, 0x6f, 0x4f, 0xc9, 0xcd, + 0x7f, 0x2f, 0xfe, 0x2c, 0x3e, 0x00, 0x20, 0x19, 0xfd, 0x23, 0xc5, 0xe5, 0xcd, 0xaa, 0x2d, 0xcd, + 0x46, 0x1f, 0xc1, 0xcd, 0xc9, 0x2d, 0xe1, 0xc1, 0xd9, 0x7d, 0xd9, 0xb7, 0x28, 0x03, 0x3d, 0xed, + 0x44, 0x43, 0x11, 0x00, 0x35, 0x80, 0xd9, 0x5f, 0x21, 0x00, 0x00, 0xd9, 0x0c, 0x0d, 0xc8, 0x78, + 0xb7, 0xc8, 0x08, 0x1a, 0xbe, 0x28, 0x04, 0x23, 0x10, 0xfa, 0xc9, 0xc5, 0xd5, 0xe5, 0x13, 0x0d, + 0x28, 0x09, 0x23, 0x05, 0x28, 0x04, 0x1a, 0xbe, 0x28, 0xf4, 0x37, 0xe1, 0xd1, 0xc1, 0x1a, 0x38, + 0xe6, 0xd9, 0x7b, 0xd9, 0xb8, 0x1a, 0x38, 0xdf, 0x08, 0x90, 0x3c, 0xd9, 0x6f, 0xd9, 0xc9, 0xcd, + 0x5d, 0x1f, 0xd9, 0x7d, 0x11, 0x00, 0x35, 0x12, 0x1c, 0x3e, 0x80, 0xc9, 0xcd, 0x5d, 0x1f, 0xd9, + 0xcd, 0xef, 0x2f, 0x11, 0x00, 0x35, 0x12, 0x3e, 0x80, 0xd0, 0x1c, 0xc9, 0xcd, 0xe0, 0xff, 0x37, + 0x18, 0xf1, 0xcd, 0x36, 0x2f, 0xcd, 0xaa, 0x2d, 0xcd, 0x46, 0x1f, 0xc1, 0xcd, 0xc9, 0x2d, 0xd9, + 0x7d, 0xd9, 0xb7, 0x28, 0x0d, 0x3d, 0x6f, 0x93, 0x1e, 0x00, 0x30, 0x06, 0xed, 0x44, 0x4f, 0xcd, + 0x99, 0x26, 0xcd, 0x7f, 0x2f, 0xfe, 0x2c, 0xfd, 0x23, 0x28, 0x0b, 0xfd, 0x2b, 0xcd, 0x45, 0x2f, + 0x3e, 0x80, 0xc9, 0xcd, 0x36, 0x2f, 0xcd, 0xaa, 0x2d, 0xcd, 0x46, 0x1f, 0xc1, 0xcd, 0xc9, 0x2d, + 0xcd, 0x45, 0x2f, 0xd9, 0x7d, 0xd9, 0xbb, 0x30, 0x02, 0x6b, 0x5f, 0x3e, 0x80, 0xc9, 0xcd, 0x73, + 0x26, 0xd0, 0x1c, 0x1d, 0xc8, 0x4b, 0x7d, 0x93, 0x6f, 0x06, 0x00, 0x62, 0x58, 0xed, 0xb0, 0x3e, + 0x80, 0xc9, 0xcd, 0x46, 0x1f, 0xcd, 0x39, 0x2f, 0xd9, 0x7d, 0xd9, 0xf5, 0xcd, 0x4f, 0x1f, 0xcd, + 0x45, 0x2f, 0xf1, 0xb7, 0x28, 0xd4, 0x3d, 0x4f, 0x3e, 0x80, 0xc8, 0x1c, 0x1d, 0xc8, 0x43, 0x62, + 0x2e, 0x00, 0xc5, 0x7e, 0x23, 0x12, 0x1c, 0x3e, 0x13, 0xca, 0xc1, 0x07, 0x10, 0xf5, 0xc1, 0x0d, + 0x20, 0xf0, 0x3e, 0x80, 0xc9, 0xcd, 0xec, 0x2b, 0x7c, 0xa2, 0x67, 0x7d, 0xa3, 0x6f, 0xd9, 0x7c, + 0xa2, 0x67, 0x7d, 0xa3, 0x6f, 0xd9, 0xc9, 0xcd, 0xec, 0x2b, 0x7c, 0xaa, 0x67, 0x7d, 0xab, 0x6f, + 0xd9, 0x7c, 0xaa, 0x67, 0x7d, 0xab, 0x6f, 0xd9, 0xc9, 0xcd, 0xec, 0x2b, 0x7c, 0xb2, 0x67, 0x7d, + 0xb3, 0x6f, 0xd9, 0x7c, 0xb2, 0x67, 0x7d, 0xb3, 0x6f, 0xd9, 0xc9, 0xcd, 0xec, 0x2b, 0x7c, 0xaa, + 0xcb, 0x7c, 0x08, 0xcb, 0x7c, 0xc4, 0x04, 0x2c, 0xcd, 0xdb, 0x2c, 0xcb, 0x7c, 0xc4, 0x04, 0x2c, + 0x44, 0x4d, 0x21, 0x00, 0x00, 0xd9, 0x44, 0x4d, 0x21, 0x00, 0x00, 0x3e, 0xdf, 0xcd, 0x5d, 0x2e, + 0xd9, 0x0e, 0x00, 0x08, 0xc8, 0xc3, 0x04, 0x2c, 0xcd, 0xec, 0x2b, 0xcd, 0x0e, 0x27, 0xb7, 0xcd, + 0xdb, 0x2c, 0x0e, 0x00, 0xf0, 0xc3, 0x04, 0x2c, 0xcd, 0x5e, 0x2d, 0xe0, 0xcd, 0x58, 0x2d, 0xcd, + 0xa8, 0x2c, 0x7a, 0xee, 0x80, 0x57, 0x18, 0x10, 0x7c, 0xee, 0x80, 0x67, 0x18, 0x0a, 0xcd, 0x58, + 0x2d, 0xe0, 0xcd, 0x5e, 0x2d, 0xcd, 0xa8, 0x2c, 0x05, 0x04, 0xc8, 0x0d, 0x0c, 0xca, 0xdb, 0x2c, + 0xd9, 0x01, 0x00, 0x00, 0xd9, 0x7c, 0xaa, 0xf5, 0x78, 0xb9, 0xdc, 0xdb, 0x2c, 0x78, 0xcb, 0xfc, + 0xc4, 0xdc, 0x2b, 0xf1, 0x7a, 0xcb, 0xfa, 0xfa, 0x94, 0x27, 0xcd, 0x58, 0x2d, 0xdc, 0xe3, 0x2c, + 0xcb, 0xfc, 0x18, 0x0a, 0xcd, 0x5e, 0x2d, 0xdc, 0x18, 0x2c, 0xcd, 0x85, 0x2c, 0x2f, 0xd9, 0xeb, + 0x21, 0x00, 0x80, 0xb7, 0xed, 0x42, 0xeb, 0xd9, 0xcc, 0xd5, 0x2c, 0xdc, 0xc7, 0x2c, 0xdc, 0xef, + 0x2c, 0xcb, 0xbc, 0x0d, 0x0c, 0xca, 0x00, 0x2d, 0xb7, 0xf0, 0xcb, 0xfc, 0xc9, 0xcd, 0xa8, 0x2c, + 0x05, 0x04, 0x3e, 0x12, 0xca, 0xc1, 0x07, 0x0d, 0x0c, 0xc8, 0x7c, 0xaa, 0x08, 0xcb, 0xfa, 0xcb, + 0xfc, 0xc5, 0x42, 0x4b, 0x11, 0x00, 0x00, 0xd9, 0x42, 0x4b, 0x11, 0x00, 0x00, 0x3e, 0xe0, 0xcd, + 0x5d, 0x2e, 0xd9, 0xcb, 0x7a, 0xd9, 0xcc, 0x78, 0x2e, 0xeb, 0xd9, 0xcb, 0x38, 0xcb, 0x19, 0xb7, + 0xed, 0x42, 0x3f, 0xeb, 0xcc, 0xd5, 0x2c, 0xdc, 0xc7, 0x2c, 0xc1, 0xdc, 0xef, 0x2c, 0x1f, 0x79, + 0x98, 0x3f, 0xc3, 0x8c, 0x28, 0x7c, 0xaa, 0x08, 0xcb, 0x7c, 0xc4, 0x04, 0x2c, 0xcd, 0xdb, 0x2c, + 0xcb, 0x7c, 0xc4, 0x04, 0x2c, 0x44, 0x4d, 0x21, 0x00, 0x00, 0xd9, 0x44, 0x4d, 0x21, 0x00, 0x00, + 0x3e, 0xdf, 0xcd, 0x8b, 0x2e, 0xd9, 0x0e, 0xbf, 0xcd, 0xf6, 0x2c, 0x20, 0x0d, 0xcb, 0x7a, 0x20, + 0x09, 0xcd, 0xdb, 0x2c, 0x4a, 0x08, 0xf0, 0xc3, 0x04, 0x2c, 0x0d, 0xd9, 0xcb, 0x23, 0xcb, 0x12, + 0xd9, 0xcb, 0x13, 0xcb, 0x12, 0xd9, 0xed, 0x6a, 0xd9, 0xed, 0x6a, 0xf2, 0x3a, 0x28, 0x08, 0xf8, + 0xcb, 0xbc, 0xc9, 0x05, 0x04, 0xca, 0x00, 0x2d, 0x0d, 0x0c, 0xc8, 0x7c, 0xaa, 0x08, 0xcb, 0xfa, + 0xcb, 0xfc, 0xc5, 0x44, 0x4d, 0x21, 0x00, 0x00, 0xd9, 0x44, 0x4d, 0x21, 0x00, 0x00, 0x3e, 0xe0, + 0xcd, 0x8b, 0x2e, 0xdc, 0x9f, 0x2e, 0xd9, 0xe5, 0x21, 0x00, 0x80, 0xb7, 0xed, 0x52, 0xe1, 0xcc, + 0xd5, 0x2c, 0xdc, 0xc7, 0x2c, 0xc1, 0xdc, 0xef, 0x2c, 0x1f, 0x79, 0x88, 0x38, 0x05, 0xf2, 0x00, + 0x2d, 0x18, 0x03, 0xfa, 0xf1, 0x2c, 0xc6, 0x80, 0x4f, 0xca, 0x00, 0x2d, 0x08, 0xcb, 0xbc, 0xf0, + 0xcb, 0xfc, 0xc9, 0xcd, 0xdb, 0x2c, 0xcb, 0x7c, 0xf5, 0xc4, 0x04, 0x2c, 0x48, 0x06, 0x20, 0xcd, + 0x75, 0x2d, 0x38, 0x08, 0x10, 0xf9, 0xf1, 0xd9, 0x2c, 0xd9, 0x4c, 0xc9, 0xf1, 0xc5, 0xeb, 0xe5, + 0xd9, 0xeb, 0xe5, 0xd9, 0xdd, 0x21, 0x00, 0x00, 0xdd, 0x39, 0x28, 0x34, 0xc5, 0xd9, 0xd5, 0xd9, + 0xd5, 0xcd, 0xb1, 0x2c, 0xcd, 0x44, 0x24, 0xcd, 0xdf, 0x15, 0x18, 0x1d, 0xc5, 0xd9, 0xcb, 0x23, + 0xcb, 0x12, 0xd5, 0xd9, 0xcb, 0x13, 0xcb, 0x12, 0xd5, 0x3e, 0x0a, 0xf5, 0xcd, 0x87, 0x2d, 0xcd, + 0x98, 0x2f, 0xf1, 0xcd, 0xa6, 0x20, 0xdc, 0x98, 0x2f, 0xd1, 0xd9, 0xd1, 0xd9, 0x79, 0xc1, 0x4f, + 0x10, 0xda, 0xf1, 0xf1, 0xf1, 0xc9, 0xf1, 0xf1, 0xf1, 0x18, 0xa1, 0xcb, 0x7a, 0xf5, 0xcd, 0xdb, + 0x2c, 0xcd, 0x95, 0x2d, 0x0d, 0x0c, 0x28, 0xee, 0x3e, 0x9e, 0xb9, 0x38, 0x08, 0x3c, 0xcd, 0xdc, + 0x2b, 0x08, 0xf2, 0x06, 0x29, 0xcd, 0xdb, 0x2c, 0xcd, 0x5e, 0x24, 0xcd, 0x9e, 0x2d, 0xf1, 0xcd, + 0x53, 0x28, 0xc3, 0xd0, 0x23, 0xcd, 0x30, 0x2d, 0x18, 0x08, 0xcd, 0x0a, 0x2d, 0x18, 0x03, 0xcd, + 0xfd, 0x2c, 0xd0, 0x18, 0x51, 0xcd, 0x30, 0x2d, 0x18, 0x08, 0xcd, 0x0a, 0x2d, 0x18, 0x03, 0xcd, + 0xfd, 0x2c, 0xc8, 0xd8, 0x18, 0x40, 0xcd, 0x30, 0x2d, 0x18, 0x08, 0xcd, 0x0a, 0x2d, 0x18, 0x03, + 0xcd, 0xfd, 0x2c, 0xd8, 0x18, 0x30, 0xcd, 0x30, 0x2d, 0x18, 0x08, 0xcd, 0x0a, 0x2d, 0x18, 0x03, + 0xcd, 0xfd, 0x2c, 0x28, 0x21, 0xd0, 0x18, 0x1e, 0xcd, 0x30, 0x2d, 0x18, 0x08, 0xcd, 0x0a, 0x2d, + 0x18, 0x03, 0xcd, 0xfd, 0x2c, 0xc8, 0x18, 0x0e, 0xcd, 0x30, 0x2d, 0x18, 0x08, 0xcd, 0x0a, 0x2d, + 0x18, 0x03, 0xcd, 0xfd, 0x2c, 0xc0, 0x21, 0xff, 0xff, 0xd9, 0x21, 0xff, 0xff, 0xd9, 0xaf, 0x4f, + 0xc9, 0xd9, 0xfd, 0x7e, 0x00, 0xfd, 0x23, 0x17, 0x17, 0x67, 0xe6, 0xc0, 0xfd, 0xae, 0x00, 0xfd, + 0x23, 0x6f, 0x7c, 0x17, 0x17, 0xe6, 0xc0, 0xfd, 0xae, 0x00, 0xfd, 0x23, 0x67, 0xd9, 0xaf, 0x4f, + 0x67, 0x6f, 0xc9, 0xfd, 0x23, 0xcd, 0x56, 0x1f, 0xcd, 0xce, 0x29, 0x3e, 0x80, 0xc9, 0xcd, 0xf5, + 0x2b, 0x01, 0x08, 0x00, 0x11, 0x00, 0x35, 0xc5, 0x06, 0x04, 0xaf, 0xcd, 0x75, 0x2d, 0x17, 0x10, + 0xfa, 0xc1, 0x0d, 0xf8, 0x28, 0x06, 0xb7, 0x20, 0x03, 0xb8, 0x28, 0xeb, 0xc6, 0x90, 0x27, 0xce, + 0x40, 0x27, 0x12, 0x13, 0x47, 0x18, 0xe0, 0xcd, 0x7f, 0x2f, 0xfe, 0x7e, 0x28, 0xc5, 0xcd, 0x56, + 0x1f, 0xdd, 0x21, 0x00, 0x37, 0xdd, 0x7e, 0x03, 0xb7, 0xdd, 0x21, 0x7a, 0x2b, 0x28, 0x04, 0xdd, + 0x21, 0x00, 0x37, 0x11, 0x00, 0x35, 0xcd, 0xb1, 0x2c, 0x06, 0x00, 0xcb, 0x7c, 0x28, 0x06, 0xcb, + 0xbc, 0x3e, 0x2d, 0x12, 0x13, 0xaf, 0xb9, 0x28, 0x47, 0xd5, 0x78, 0xf5, 0x79, 0xfe, 0xa1, 0x30, + 0x1a, 0xfe, 0x9b, 0x30, 0x25, 0x2f, 0xfe, 0xe1, 0x38, 0x02, 0x3e, 0xf8, 0xc6, 0x1c, 0xcd, 0x21, + 0x2e, 0xf5, 0xcd, 0x53, 0x28, 0xf1, 0x47, 0xf1, 0x90, 0x18, 0xe0, 0xd6, 0x20, 0xcd, 0x21, 0x2e, + 0xf5, 0xcd, 0xc0, 0x27, 0xf1, 0x47, 0xf1, 0x80, 0x18, 0xd1, 0x3e, 0x09, 0xcd, 0x21, 0x2e, 0xcd, + 0x0f, 0x2d, 0x79, 0xc1, 0x4f, 0xcb, 0xfc, 0xdc, 0x4c, 0x2d, 0xd1, 0xcb, 0xb9, 0x3e, 0x00, 0x17, + 0x0c, 0x08, 0x78, 0xdd, 0xcb, 0x02, 0x4e, 0x20, 0x08, 0xaf, 0xdd, 0xbe, 0x01, 0x28, 0x0a, 0x3e, + 0xf6, 0xdd, 0x86, 0x01, 0xb7, 0xfa, 0x89, 0x2a, 0xaf, 0xf5, 0x08, 0xcd, 0x75, 0x2d, 0x8f, 0xfe, + 0x0a, 0x38, 0x05, 0xd6, 0x0a, 0xd9, 0x2c, 0xd9, 0x0d, 0x20, 0xf0, 0x4f, 0x7c, 0xe6, 0x3f, 0x67, + 0xf1, 0xf2, 0xae, 0x2a, 0x3c, 0x20, 0x1c, 0x3e, 0x04, 0xb9, 0x3e, 0x00, 0x18, 0x15, 0xf5, 0x79, + 0xce, 0x30, 0xfe, 0x30, 0x28, 0x05, 0xfe, 0x3a, 0x3f, 0x30, 0x08, 0xe3, 0xcb, 0x75, 0xe3, 0x20, + 0x05, 0x3e, 0x30, 0x3c, 0x3d, 0xf5, 0x04, 0xcd, 0xf6, 0x2c, 0x0e, 0x20, 0x3e, 0x00, 0x20, 0xbb, + 0xf1, 0xf5, 0x3e, 0x00, 0x38, 0xb5, 0xeb, 0x0e, 0xff, 0x16, 0x01, 0xdd, 0x5e, 0x01, 0xdd, 0xcb, + 0x02, 0x46, 0x20, 0x32, 0xdd, 0xcb, 0x02, 0x4e, 0x28, 0x11, 0x78, 0xb7, 0x28, 0x04, 0xfa, 0xf2, + 0x2a, 0x50, 0x7a, 0xdd, 0x86, 0x01, 0x5f, 0xfe, 0x0b, 0x38, 0x17, 0x78, 0x11, 0x01, 0x01, 0xb7, + 0xfa, 0x16, 0x2b, 0x28, 0x0d, 0xdd, 0x7e, 0x01, 0xb7, 0x20, 0x02, 0x3e, 0x0a, 0xb8, 0x38, 0x06, + 0x50, 0x58, 0x78, 0xc6, 0x81, 0x4f, 0xcb, 0xfa, 0x1d, 0x7a, 0xb9, 0x30, 0x0c, 0xf1, 0x28, 0x03, + 0xf2, 0x2b, 0x2b, 0xf5, 0x1c, 0x1d, 0xfa, 0x3a, 0x2b, 0x3e, 0x30, 0x15, 0xe2, 0x32, 0x2b, 0x36, + 0x2e, 0x23, 0x77, 0x23, 0x1d, 0xf2, 0x19, 0x2b, 0x18, 0xe3, 0xf1, 0x0c, 0x4d, 0x20, 0x27, 0x36, + 0x45, 0x23, 0x78, 0x3d, 0xf2, 0x4c, 0x2b, 0x36, 0x2d, 0x23, 0xed, 0x44, 0x36, 0x30, 0x28, 0x15, + 0xfe, 0x0a, 0x47, 0x3e, 0x3a, 0x38, 0x03, 0x23, 0x36, 0x30, 0x34, 0xbe, 0x20, 0x05, 0x36, 0x30, + 0x2b, 0x34, 0x23, 0x10, 0xf5, 0x23, 0xeb, 0xdd, 0xcb, 0x02, 0x46, 0x3e, 0x80, 0xc8, 0x79, 0xc6, + 0x04, 0xbb, 0x28, 0xf7, 0xeb, 0x36, 0x20, 0x23, 0xeb, 0x18, 0xf6, 0x09, 0x00, 0xc5, 0x47, 0x0e, + 0x02, 0xfd, 0x23, 0xfd, 0x7e, 0x00, 0xcd, 0x2b, 0x2f, 0x08, 0xfd, 0x7e, 0x00, 0xcd, 0x1b, 0x2f, + 0x38, 0x17, 0x78, 0x87, 0x87, 0x80, 0x87, 0x47, 0xfd, 0x7e, 0x00, 0xfd, 0x23, 0xe6, 0x0f, 0x80, + 0x47, 0x0d, 0xf2, 0x8a, 0x2b, 0x06, 0x64, 0x18, 0xe1, 0x08, 0xfe, 0x2d, 0x78, 0xc1, 0xc0, 0xed, + 0x44, 0xc9, 0xfd, 0x23, 0xfd, 0x7e, 0x00, 0xcd, 0x1b, 0x2f, 0xd8, 0x04, 0xfd, 0x23, 0xcd, 0x66, + 0x2d, 0x38, 0x13, 0x0d, 0x0c, 0x20, 0x0f, 0xe6, 0x0f, 0xd9, 0x06, 0x00, 0x4f, 0x09, 0xd9, 0x30, + 0xe3, 0x23, 0x7c, 0xb5, 0x20, 0xde, 0x0c, 0xcd, 0xde, 0x2c, 0x18, 0xd8, 0x08, 0xaf, 0x08, 0xcb, + 0xfc, 0xcd, 0xe3, 0x2c, 0xb9, 0xc8, 0xd2, 0xe1, 0x2b, 0xc3, 0xf1, 0x2c, 0xcd, 0xdb, 0x2c, 0xcd, + 0xf5, 0x2b, 0xcd, 0xdb, 0x2c, 0x0d, 0x0c, 0xc8, 0xcb, 0x7c, 0xf5, 0x3e, 0x9f, 0xcd, 0xdc, 0x2b, + 0xf1, 0x0e, 0x00, 0xc8, 0xb7, 0xd9, 0xd5, 0xeb, 0x21, 0x00, 0x00, 0xed, 0x52, 0xd1, 0xd9, 0xd5, + 0xeb, 0x21, 0x00, 0x00, 0xed, 0x52, 0xd1, 0xc9, 0xd9, 0x2f, 0xe5, 0xb7, 0x21, 0x00, 0x00, 0xed, + 0x42, 0x44, 0x4d, 0xe1, 0x18, 0xe0, 0x3e, 0x96, 0xb9, 0x3e, 0x17, 0xda, 0xc1, 0x07, 0xcd, 0xbf, + 0x23, 0xd9, 0x01, 0x69, 0x21, 0xd9, 0xcb, 0xfa, 0xcb, 0xfc, 0x79, 0x0e, 0x00, 0xdd, 0x21, 0x00, + 0x00, 0xdd, 0xe5, 0xb8, 0x38, 0x3a, 0xd9, 0xe3, 0xed, 0x42, 0xe3, 0xed, 0x52, 0xd9, 0xed, 0x52, + 0x30, 0x09, 0xd9, 0xe3, 0x09, 0xe3, 0xed, 0x5a, 0xd9, 0xed, 0x5a, 0x3f, 0xcb, 0x11, 0x30, 0x02, + 0xcb, 0xf9, 0x3d, 0xb8, 0x38, 0x19, 0xe3, 0x29, 0xe3, 0xd9, 0xed, 0x6a, 0xd9, 0xed, 0x6a, 0x30, + 0xd5, 0xb7, 0xd9, 0xe3, 0xed, 0x42, 0xe3, 0xed, 0x52, 0xd9, 0xed, 0x52, 0xb7, 0x18, 0xdc, 0x3c, + 0x59, 0x4f, 0xd9, 0xc1, 0xd9, 0xcb, 0x7c, 0xc0, 0xd9, 0xcb, 0x21, 0xcb, 0x10, 0xed, 0x6a, 0xd9, + 0xed, 0x6a, 0x0d, 0xc2, 0x85, 0x2c, 0xc9, 0xcb, 0x7c, 0xc0, 0xd9, 0x29, 0xd9, 0xed, 0x6a, 0x0d, + 0xc2, 0x97, 0x2c, 0xc9, 0x08, 0xc6, 0x10, 0x08, 0xcd, 0xdb, 0x2c, 0xcd, 0xb1, 0x2c, 0xcd, 0xdb, + 0x2c, 0x0d, 0x0c, 0xc0, 0xcd, 0xf6, 0x2c, 0xc8, 0x7c, 0xb7, 0xfc, 0x04, 0x2c, 0x0e, 0x9f, 0xcd, + 0x97, 0x2c, 0xb7, 0xf8, 0xcb, 0xbc, 0xc9, 0xd9, 0x01, 0x01, 0x00, 0x09, 0xd9, 0xd0, 0xc5, 0x01, + 0x01, 0x00, 0x09, 0xc1, 0xc9, 0xb7, 0xd9, 0xcb, 0xc5, 0xd9, 0xc9, 0x79, 0x48, 0x47, 0xeb, 0xd9, + 0xeb, 0xd9, 0xc9, 0xcd, 0x7c, 0x2d, 0xd9, 0xcb, 0x18, 0xcb, 0x19, 0x08, 0xb0, 0x08, 0xd9, 0x0c, + 0xc0, 0x3e, 0x14, 0xc3, 0xc1, 0x07, 0x7c, 0xb5, 0xd9, 0xb4, 0xb5, 0xd9, 0xc9, 0xcd, 0x28, 0x2d, + 0x3e, 0x00, 0xd9, 0x67, 0x6f, 0xd9, 0x67, 0x6f, 0x4f, 0xc9, 0xcd, 0x1c, 0x2d, 0x18, 0xf1, 0x79, + 0xb8, 0xc0, 0xed, 0x52, 0x19, 0xc0, 0xd9, 0xed, 0x52, 0x19, 0xd9, 0xc9, 0x7c, 0xaa, 0x7c, 0x17, + 0xf8, 0x30, 0xec, 0xcd, 0x0f, 0x2d, 0x3f, 0xc9, 0x7c, 0xaa, 0xf2, 0x12, 0x2d, 0x7c, 0x17, 0xc9, + 0xcd, 0x35, 0x2d, 0x18, 0xcb, 0x04, 0x0c, 0x05, 0x28, 0x0a, 0x0d, 0x28, 0x0c, 0x1a, 0xbe, 0xc0, + 0x13, 0x23, 0x18, 0xf3, 0xb7, 0x0d, 0xc8, 0x37, 0xc9, 0xb7, 0x0c, 0xc9, 0x05, 0x0c, 0xcd, 0x88, + 0x2d, 0xcd, 0x7b, 0x2d, 0xcd, 0x7b, 0x2d, 0x08, 0xd9, 0x19, 0xd9, 0xed, 0x5a, 0xc9, 0xd9, 0xb7, + 0xed, 0x52, 0xd9, 0xed, 0x52, 0xc9, 0xcd, 0x88, 0x2d, 0xcd, 0x75, 0x2d, 0xd8, 0xcd, 0x75, 0x2d, + 0xd8, 0xcd, 0x58, 0x2d, 0xd8, 0xd9, 0x29, 0xd9, 0xed, 0x6a, 0xc9, 0x0c, 0xcb, 0x3c, 0xcb, 0x1d, + 0xd9, 0xcb, 0x1c, 0xcb, 0x1d, 0xd9, 0xc9, 0x41, 0x54, 0x5d, 0xd9, 0x54, 0x5d, 0xd9, 0xc9, 0xcd, + 0x87, 0x2d, 0xcd, 0x53, 0x28, 0xdd, 0xe1, 0xc5, 0xe5, 0xd9, 0xe5, 0xd9, 0xdd, 0xe9, 0xdd, 0xe1, + 0xd9, 0xd1, 0xd9, 0xd1, 0x79, 0xc1, 0x41, 0x4f, 0xdd, 0xe9, 0xcd, 0x39, 0x16, 0xdd, 0xe1, 0xb7, + 0x21, 0x00, 0x35, 0x54, 0x45, 0xed, 0x52, 0x39, 0xf9, 0x57, 0xd5, 0x28, 0x0a, 0x4b, 0x11, 0x00, + 0x35, 0xeb, 0xed, 0xb0, 0xcd, 0x39, 0x16, 0xdd, 0xe9, 0xdd, 0xe1, 0x21, 0x00, 0x00, 0x44, 0x39, + 0x11, 0x00, 0x35, 0x0c, 0x0d, 0x28, 0x02, 0xed, 0xb0, 0xf9, 0xdd, 0xe9, 0xcd, 0x95, 0x2d, 0xcd, + 0xb4, 0x23, 0xcd, 0x68, 0x27, 0xcd, 0x9e, 0x2d, 0xcd, 0x95, 0x2d, 0xcd, 0xdb, 0x2c, 0xcd, 0xb4, + 0x23, 0xcd, 0x52, 0x27, 0xcd, 0x9e, 0x2d, 0xc3, 0xc0, 0x27, 0xdd, 0x21, 0x02, 0x00, 0xdd, 0x39, + 0xdd, 0xe3, 0xcd, 0xa6, 0x20, 0xcd, 0x53, 0x28, 0x11, 0x05, 0x00, 0xdd, 0x19, 0xcd, 0xa6, 0x20, + 0xdd, 0xe3, 0x04, 0x05, 0xfa, 0x68, 0x27, 0xcd, 0x68, 0x27, 0xcd, 0xa6, 0x20, 0xdd, 0xe3, 0x18, + 0xe4, 0x3c, 0x08, 0xe5, 0xd9, 0xe5, 0xd9, 0xcd, 0xb4, 0x23, 0xcd, 0xdb, 0x2c, 0xaf, 0x08, 0x3d, + 0x28, 0x20, 0xf2, 0x39, 0x2e, 0xb9, 0x38, 0x1a, 0x3c, 0x08, 0x3c, 0xcb, 0xfc, 0xcd, 0x4e, 0x2d, + 0x30, 0x05, 0x08, 0xcd, 0x7b, 0x2d, 0x08, 0x08, 0xdc, 0xc7, 0x2c, 0x0c, 0xfa, 0x2e, 0x2e, 0xc3, + 0xf1, 0x2c, 0xcd, 0xdb, 0x2c, 0xcb, 0xba, 0xd9, 0xe1, 0xd9, 0xe1, 0x08, 0xc9, 0xb7, 0xed, 0x42, + 0xd9, 0xed, 0x42, 0xd9, 0x30, 0x05, 0x09, 0xd9, 0xed, 0x4a, 0xd9, 0x3f, 0xcb, 0x13, 0xcb, 0x12, + 0xd9, 0xcb, 0x13, 0xcb, 0x12, 0xd9, 0x3c, 0xf0, 0xed, 0x6a, 0xd9, 0xed, 0x6a, 0xd9, 0x30, 0xde, + 0xb7, 0xed, 0x42, 0xd9, 0xed, 0x42, 0xd9, 0x37, 0xc3, 0x6c, 0x2e, 0xb7, 0xd9, 0xcb, 0x1a, 0xcb, + 0x1b, 0xd9, 0xcb, 0x1a, 0xcb, 0x1b, 0x30, 0x05, 0x09, 0xd9, 0xed, 0x4a, 0xd9, 0x3c, 0xf0, 0xd9, + 0xcb, 0x1c, 0xcb, 0x1d, 0xd9, 0xcb, 0x1c, 0xcb, 0x1d, 0xc3, 0x8c, 0x2e, 0xed, 0x42, 0xd9, 0xed, + 0x42, 0xd9, 0x0c, 0x30, 0x07, 0x0d, 0x09, 0xd9, 0xed, 0x4a, 0xd9, 0x0d, 0x3c, 0xf0, 0xcb, 0x21, + 0xcb, 0x10, 0xd9, 0xcb, 0x11, 0xcb, 0x10, 0xd9, 0x0c, 0xcb, 0x23, 0xcb, 0x12, 0xd9, 0xcb, 0x13, + 0xcb, 0x12, 0xd9, 0xed, 0x6a, 0xd9, 0xed, 0x6a, 0xd9, 0xcb, 0x23, 0xcb, 0x12, 0xd9, 0xcb, 0x13, + 0xcb, 0x12, 0xd9, 0xed, 0x6a, 0xd9, 0xed, 0x6a, 0xd9, 0xd2, 0xac, 0x2e, 0xb7, 0xed, 0x42, 0xd9, + 0xed, 0x42, 0xd9, 0x0c, 0xc3, 0xbc, 0x2e, 0x29, 0xd9, 0xed, 0x6a, 0xd9, 0x38, 0xee, 0x3c, 0x0c, + 0xed, 0x42, 0xd9, 0xed, 0x42, 0xd9, 0xd0, 0x09, 0xd9, 0xed, 0x4a, 0xd9, 0x0d, 0xc9, 0xfd, 0x7e, + 0x00, 0xfe, 0x41, 0x38, 0x06, 0xd6, 0x37, 0xfe, 0x10, 0x3f, 0xc9, 0xfe, 0x3a, 0x3f, 0xd8, 0xfe, + 0x30, 0xc9, 0xfe, 0x3e, 0xd0, 0xfe, 0x3d, 0xd0, 0xfe, 0x3c, 0xc9, 0xfd, 0x23, 0xfe, 0x2b, 0xc8, + 0xfe, 0x2d, 0xc8, 0xfd, 0x2b, 0xc9, 0xcd, 0x4f, 0x1f, 0xcd, 0x7f, 0x2f, 0xfd, 0x23, 0xfe, 0x2c, + 0xc8, 0x3e, 0x05, 0x18, 0x0a, 0xcd, 0x7f, 0x2f, 0xfd, 0x23, 0xfe, 0x29, 0xc8, 0x3e, 0x1b, 0xc3, + 0xc1, 0x07, 0xfd, 0x23, 0x08, 0xfa, 0x6b, 0x1f, 0x08, 0xe3, 0xd9, 0xe5, 0xd9, 0xf5, 0xc5, 0xe9, + 0x08, 0xfa, 0x6b, 0x1f, 0xd9, 0xc1, 0xd9, 0x79, 0xc1, 0x47, 0xf1, 0xd9, 0xeb, 0xe1, 0xd9, 0xeb, + 0xe1, 0xd9, 0xc5, 0xd9, 0xe6, 0x0f, 0xcd, 0x98, 0x2f, 0xaf, 0x08, 0xfd, 0x7e, 0x00, 0xc9, 0xfd, + 0x7e, 0x00, 0xfe, 0x20, 0xc0, 0xfd, 0x23, 0xc3, 0x7f, 0x2f, 0xe5, 0x21, 0x2a, 0x1e, 0x18, 0x13, + 0xe5, 0xd6, 0x8d, 0x21, 0x78, 0x1d, 0x18, 0x0b, 0x08, 0x78, 0xb1, 0xc4, 0xa4, 0x2c, 0x08, 0xe5, + 0x21, 0xea, 0x1d, 0xc5, 0x87, 0x4f, 0x06, 0x00, 0x09, 0x7e, 0x23, 0x66, 0x6f, 0xc1, 0xe3, 0xc9, + 0xdd, 0xe5, 0x3e, 0x01, 0x21, 0xee, 0x34, 0xcd, 0xf1, 0xff, 0xdd, 0x21, 0xee, 0x34, 0xdd, 0x6e, + 0x00, 0xdd, 0x66, 0x01, 0xdd, 0x5e, 0x02, 0xdd, 0x56, 0x03, 0xdd, 0xe1, 0xc9, 0xdd, 0xe5, 0xdd, + 0x21, 0xee, 0x34, 0xdd, 0x75, 0x00, 0xdd, 0x74, 0x01, 0xdd, 0x73, 0x02, 0xdd, 0x72, 0x03, 0x3e, + 0x02, 0x21, 0xee, 0x34, 0xcd, 0xf1, 0xff, 0xdd, 0xe1, 0xc9, 0x3e, 0x0c, 0xc3, 0xee, 0xff, 0x3e, + 0x81, 0xcd, 0xf4, 0xff, 0x7c, 0xb7, 0xc0, 0x7d, 0x37, 0xc9, 0x3e, 0x1f, 0xcd, 0xee, 0xff, 0x7b, + 0xcd, 0xee, 0xff, 0x7d, 0xc3, 0xee, 0xff, 0x3e, 0x86, 0xcd, 0xf4, 0xff, 0x5d, 0x6c, 0x16, 0x00, + 0x62, 0xc9, 0xcd, 0x46, 0x1f, 0xd9, 0xe5, 0xcd, 0x39, 0x2f, 0xcd, 0x46, 0x1f, 0xd9, 0xd1, 0xcd, + 0x45, 0x2f, 0xdd, 0x21, 0xee, 0x34, 0xdd, 0x73, 0x00, 0xdd, 0x72, 0x01, 0xdd, 0x75, 0x02, 0xdd, + 0x74, 0x03, 0x21, 0xee, 0x34, 0x3e, 0x09, 0xcd, 0xf1, 0xff, 0xdd, 0x7e, 0x04, 0x6f, 0xc6, 0x01, + 0x9f, 0x67, 0xd9, 0x67, 0x6f, 0xaf, 0x4f, 0xc9, 0xcd, 0x5d, 0x1f, 0xd9, 0x3e, 0x80, 0xcd, 0xf4, + 0xff, 0xaf, 0x18, 0xee, 0x06, 0x00, 0xdd, 0x21, 0xee, 0x34, 0xc5, 0xdd, 0xe5, 0xcd, 0x46, 0x1f, + 0xd9, 0xdd, 0xe1, 0xc1, 0xdd, 0x75, 0x00, 0x78, 0xfe, 0x0d, 0x28, 0x0b, 0x04, 0xdd, 0x23, 0xc5, + 0xdd, 0xe5, 0xcd, 0x39, 0x2f, 0x18, 0xe6, 0x21, 0xee, 0x34, 0x3e, 0x08, 0xcd, 0xf1, 0xff, 0xc3, + 0xa2, 0x0d, 0x06, 0x00, 0xdd, 0x21, 0xee, 0x34, 0xc5, 0xdd, 0xe5, 0xcd, 0x46, 0x1f, 0xd9, 0xdd, + 0xe1, 0xc1, 0xdd, 0x75, 0x00, 0xdd, 0x74, 0x01, 0xdd, 0x23, 0xdd, 0x23, 0x04, 0x04, 0x78, 0xfe, + 0x08, 0x28, 0x08, 0xc5, 0xdd, 0xe5, 0xcd, 0x39, 0x2f, 0x18, 0xe0, 0x21, 0xee, 0x34, 0x3e, 0x07, + 0xcd, 0xf1, 0xff, 0xc3, 0xa2, 0x0d, 0x2e, 0x04, 0xe5, 0x18, 0x0d, 0x2e, 0x05, 0xe5, 0x18, 0x08, + 0xcd, 0x46, 0x1f, 0xd9, 0xe5, 0xcd, 0x39, 0x2f, 0xcd, 0x46, 0x1f, 0xd9, 0xe5, 0xcd, 0x39, 0x2f, + 0xcd, 0x46, 0x1f, 0xd9, 0xd1, 0x3e, 0x19, 0xcd, 0xee, 0xff, 0xc1, 0x79, 0xcd, 0xee, 0xff, 0x7b, + 0xcd, 0xee, 0xff, 0x7a, 0xcd, 0xee, 0xff, 0x7d, 0xcd, 0xee, 0xff, 0x7c, 0xcd, 0xee, 0xff, 0xc3, + 0xa2, 0x0d, 0xcd, 0x46, 0x1f, 0xaf, 0x32, 0xfb, 0x37, 0xd9, 0x3e, 0x16, 0xcd, 0xee, 0xff, 0x7d, + 0xcd, 0xee, 0xff, 0xc3, 0xa2, 0x0d, 0x3e, 0x10, 0xcd, 0xee, 0xff, 0xc3, 0xa2, 0x0d, 0xcd, 0x46, + 0x1f, 0xd9, 0x3e, 0x11, 0xcd, 0xee, 0xff, 0x7d, 0xcd, 0xee, 0xff, 0xc3, 0xa2, 0x0d, 0xcd, 0x46, + 0x1f, 0xd9, 0xe5, 0xcd, 0x39, 0x2f, 0xcd, 0x46, 0x1f, 0xd9, 0xd1, 0x3e, 0x12, 0xcd, 0xee, 0xff, + 0x7b, 0xcd, 0xee, 0xff, 0x7d, 0xcd, 0xee, 0xff, 0xc3, 0xa2, 0x0d, 0xe1, 0x21, 0x4e, 0x31, 0xe5, + 0xdd, 0x7e, 0x04, 0xdd, 0x5e, 0x14, 0xdd, 0x66, 0x64, 0xdd, 0x6e, 0x60, 0xfd, 0xe9, 0xf5, 0x7d, + 0x6c, 0xd9, 0xc1, 0x67, 0x68, 0x79, 0xd9, 0x67, 0xc9, 0x3e, 0x82, 0xcd, 0xf4, 0xff, 0x22, 0xf2, + 0x34, 0xc9, 0xcd, 0xff, 0x33, 0xd0, 0xcd, 0xff, 0x31, 0x3e, 0x80, 0xcd, 0xce, 0xff, 0xa7, 0xca, + 0x45, 0x32, 0x67, 0x3e, 0x0d, 0x1b, 0xcd, 0x94, 0x31, 0xaf, 0xc3, 0xce, 0xff, 0x1a, 0xa7, 0x3e, + 0xff, 0x28, 0x02, 0x13, 0x13, 0xcd, 0x9f, 0x31, 0xfe, 0xff, 0xc8, 0xcd, 0x9e, 0x31, 0xcd, 0x9e, + 0x31, 0x13, 0x13, 0x13, 0xcd, 0x9f, 0x31, 0x13, 0xfe, 0x0d, 0x20, 0xf8, 0x18, 0xdf, 0x1b, 0x1a, + 0xc3, 0xd4, 0xff, 0xcd, 0xe7, 0xff, 0xc3, 0xda, 0x0c, 0x22, 0xee, 0x34, 0xed, 0x53, 0xf0, 0x34, + 0xcd, 0x59, 0x31, 0xaf, 0x32, 0xf4, 0x34, 0x3d, 0xcd, 0x3f, 0x32, 0xd5, 0xe1, 0x1a, 0xfe, 0x0d, + 0x20, 0x3b, 0x13, 0x13, 0x13, 0x1a, 0x77, 0x1b, 0x1a, 0x47, 0x1b, 0x1a, 0x23, 0x70, 0x23, 0x77, + 0x3c, 0x28, 0x26, 0x24, 0x28, 0x23, 0x25, 0x18, 0x05, 0xaf, 0x63, 0xc3, 0xce, 0xff, 0x13, 0x13, + 0x13, 0x2b, 0x2b, 0x1a, 0xfe, 0x20, 0x20, 0x04, 0x35, 0x13, 0x18, 0xf7, 0x23, 0x23, 0x23, 0x1a, + 0x77, 0x23, 0x13, 0xfe, 0x0d, 0x20, 0xf8, 0x18, 0xca, 0x2b, 0x2b, 0x36, 0x00, 0x37, 0xc9, 0x22, + 0xee, 0x34, 0xe5, 0xd5, 0xaf, 0x5f, 0xcd, 0xda, 0xff, 0xfe, 0x04, 0x38, 0x2f, 0xd1, 0xd5, 0x13, + 0xed, 0x53, 0xf8, 0x34, 0xeb, 0x23, 0x09, 0x22, 0xfc, 0x34, 0xcd, 0x59, 0x31, 0x22, 0xfa, 0x34, + 0x22, 0xfe, 0x34, 0x21, 0xff, 0xff, 0x22, 0xf2, 0x34, 0x22, 0xf6, 0x34, 0x21, 0x00, 0xfb, 0x22, + 0xf0, 0x34, 0x26, 0x00, 0x22, 0xf4, 0x34, 0xaf, 0xcd, 0x3f, 0x32, 0xa7, 0xd1, 0xe1, 0xc9, 0x21, + 0xee, 0x34, 0xc3, 0xdd, 0xff, 0x3e, 0xc0, 0xcd, 0xd6, 0x07, 0x43, 0x61, 0x6e, 0x27, 0x74, 0x20, + 0x73, 0x61, 0x76, 0x65, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x00, 0x3e, 0x40, 0x18, 0x06, 0x3e, 0x80, + 0x18, 0x02, 0x3e, 0xc0, 0xc3, 0x7e, 0x21, 0xc1, 0xed, 0x53, 0xf0, 0x34, 0x5f, 0x79, 0xa7, 0x3e, + 0x01, 0x20, 0x02, 0x3e, 0x03, 0xcd, 0xe0, 0x32, 0xc3, 0xa2, 0x0d, 0xe5, 0x63, 0xcd, 0xd4, 0xff, + 0xe1, 0xc9, 0xfe, 0xeb, 0x28, 0x19, 0xfe, 0xe0, 0x28, 0x08, 0xfe, 0xf6, 0xca, 0x3d, 0x33, 0xc3, + 0x76, 0x21, 0x2a, 0xe2, 0x37, 0xc3, 0x76, 0x21, 0xe5, 0x63, 0xcd, 0xd7, 0xff, 0xe1, 0xc9, 0x3e, + 0x87, 0xcd, 0xf4, 0xff, 0x6c, 0xc3, 0x74, 0x21, 0x3e, 0x7f, 0x6b, 0xcd, 0xf4, 0xff, 0x7d, 0x2f, + 0xa7, 0xc9, 0x18, 0xf4, 0x3e, 0x02, 0x21, 0x00, 0x00, 0x22, 0xf0, 0x34, 0xcd, 0xe0, 0x32, 0x2a, + 0xee, 0x34, 0xed, 0x5b, 0xf0, 0x34, 0xc9, 0x21, 0x00, 0x00, 0xc3, 0xf4, 0xff, 0xaf, 0x18, 0xe6, + 0xfe, 0x95, 0xca, 0x53, 0x0e, 0xfe, 0xdc, 0xc2, 0x35, 0x0e, 0x0e, 0x00, 0xc5, 0xc3, 0x7c, 0x14, + 0x22, 0xee, 0x34, 0x21, 0xee, 0x34, 0xc3, 0xda, 0xff, 0xfd, 0x7e, 0x00, 0xfe, 0x24, 0x28, 0x06, + 0xcd, 0xb0, 0x2f, 0xc3, 0xa2, 0x21, 0xfd, 0x23, 0x21, 0x00, 0x35, 0x36, 0x00, 0x3e, 0x0e, 0xcd, + 0xf1, 0xff, 0x7e, 0x5f, 0xa7, 0x28, 0x02, 0x1e, 0x18, 0x16, 0x35, 0x3e, 0x80, 0xc9, 0xfd, 0x7e, + 0x00, 0xfe, 0x24, 0x28, 0x06, 0xcd, 0x48, 0x17, 0xc3, 0xa3, 0x14, 0xfd, 0x23, 0xcd, 0x48, 0x17, + 0xcd, 0x4f, 0x1f, 0x7b, 0xa7, 0x28, 0x0a, 0xd5, 0x62, 0x6b, 0x4b, 0x06, 0x00, 0x2b, 0xed, 0xb8, + 0xd1, 0x21, 0x00, 0x35, 0x73, 0x3e, 0x0f, 0xcd, 0xf1, 0xff, 0xc3, 0xa2, 0x0d, 0xfd, 0x7e, 0x00, + 0xfe, 0x24, 0x20, 0x02, 0xfd, 0x23, 0x2a, 0xee, 0x37, 0x11, 0x00, 0x35, 0x7e, 0x12, 0x13, 0x23, + 0xcb, 0x7b, 0x20, 0x04, 0xa7, 0x20, 0xf5, 0x1d, 0x3e, 0x80, 0xc9, 0x3e, 0xff, 0xcd, 0x7b, 0x32, + 0xcd, 0x86, 0x33, 0xcd, 0x80, 0x33, 0xcd, 0x7c, 0x33, 0xcd, 0x78, 0x33, 0xc1, 0x79, 0xa7, 0x28, + 0x01, 0x3c, 0xcd, 0x7b, 0x32, 0xc3, 0x78, 0x0f, 0x7c, 0xc3, 0x7b, 0x32, 0x7d, 0xc3, 0x7b, 0x32, + 0xd9, 0x7c, 0xd9, 0xc3, 0x7b, 0x32, 0xd9, 0x7d, 0xd9, 0xc3, 0x7b, 0x32, 0xf1, 0x6f, 0xdd, 0xe1, + 0xf1, 0xd5, 0xeb, 0xcd, 0x01, 0x16, 0xd1, 0xc3, 0xc7, 0x12, 0xcd, 0xc4, 0x33, 0xcd, 0xbd, 0x33, + 0xcd, 0xb8, 0x33, 0xcd, 0xb3, 0x33, 0xcd, 0x98, 0x32, 0x4f, 0xfe, 0x02, 0xda, 0xf5, 0x12, 0x0d, + 0xc3, 0xf5, 0x12, 0xcd, 0x98, 0x32, 0x67, 0xc9, 0xcd, 0x98, 0x32, 0x6f, 0xc9, 0xcd, 0x98, 0x32, + 0xd9, 0x67, 0xd9, 0xc9, 0xcd, 0x98, 0x32, 0xd9, 0x6f, 0xd9, 0xc9, 0xfd, 0x7e, 0x00, 0xfe, 0x0d, + 0xc2, 0x4f, 0x1f, 0x2a, 0xdc, 0x37, 0x23, 0x23, 0x23, 0xcd, 0xf5, 0x33, 0xfe, 0xf4, 0xc2, 0x4f, + 0x1f, 0xcd, 0xf5, 0x33, 0xfe, 0x3e, 0xc2, 0x4f, 0x1f, 0x11, 0x00, 0x35, 0x7e, 0x12, 0x13, 0x23, + 0xfe, 0x0d, 0x20, 0xf8, 0xc9, 0x7e, 0x23, 0xfe, 0x20, 0x28, 0xfa, 0xc9, 0xe1, 0x37, 0xc9, 0xe5, + 0x2a, 0xe2, 0x37, 0x09, 0x38, 0xf6, 0x7c, 0x3c, 0x21, 0x00, 0x00, 0x39, 0xbc, 0x30, 0xed, 0xe1, + 0x22, 0xee, 0x34, 0x2a, 0xe2, 0x37, 0x36, 0x0d, 0x23, 0x13, 0x13, 0x1a, 0x77, 0x23, 0xfe, 0xff, + 0x28, 0x1d, 0x1b, 0x1a, 0x77, 0x23, 0x1b, 0x1a, 0x77, 0xa7, 0x28, 0x0e, 0x23, 0x13, 0x13, 0x13, + 0x1a, 0x77, 0x23, 0x13, 0xfe, 0x0d, 0x20, 0xf8, 0x18, 0xdf, 0x2b, 0x2b, 0x36, 0xff, 0x23, 0xed, + 0x5b, 0xe2, 0x37, 0xed, 0x53, 0xf8, 0x34, 0xe5, 0xe5, 0xc3, 0x17, 0x32, 0x2a, 0x82, 0xff, 0xe5, + 0xe1, 0x7e, 0x23, 0xe5, 0xc3, 0xd6, 0x07, 0x3a, 0x80, 0xff, 0xb7, 0xf0, 0x3e, 0x7e, 0xcd, 0xf4, + 0xff, 0xc3, 0x78, 0x0e, 0x3e, 0xc3, 0x32, 0x38, 0x00, 0x21, 0x50, 0x34, 0x22, 0x39, 0x00, 0x21, + 0x4c, 0x34, 0x22, 0xfa, 0xff, 0x3e, 0xe5, 0xcd, 0xc7, 0x32, 0x3e, 0xe6, 0xcd, 0xc7, 0x32, 0xcd, + 0xbf, 0x34, 0xf5, 0x3e, 0x84, 0xcd, 0xf4, 0xff, 0xeb, 0x3e, 0x83, 0xcd, 0xf4, 0xff, 0x2e, 0x00, + 0x7c, 0xfe, 0x38, 0x30, 0x02, 0x26, 0x38, 0xf1, 0xc9, 0xdd, 0x21, 0xee, 0x34, 0xdd, 0x75, 0x00, + 0xdd, 0x74, 0x01, 0xdd, 0x36, 0x02, 0xff, 0xdd, 0x36, 0x03, 0x20, 0xdd, 0x36, 0x04, 0xff, 0x3e, + 0xda, 0xcd, 0xc7, 0x32, 0xaf, 0x21, 0xee, 0x34, 0xcd, 0xf1, 0xff, 0x38, 0x9f, 0xaf, 0xc9, 0x11, + 0x00, 0x35, 0x2a, 0x86, 0xff, 0x7e, 0x12, 0x23, 0x13, 0xfe, 0x0d, 0x20, 0xf8, 0x1d, 0xc9 +}; +
diff -r 000000000000 -r 806c2f2a7d47 main.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Wed Jun 29 14:25:56 2011 +0000 @@ -0,0 +1,741 @@ +/* BBC Basic emulator on NXP mbed by Gert van der Knokke + * Emulation of the Z80 CPU + * The z80 emulator is heavily modified by me (Gert) + * original Copyright (C) 1994 Ian Collier. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#include "mbed.h" +#include "module.h" +#include "z80.h" + +#define DEBUG false + +// define serial port for debug +Serial linktopc(USBTX,USBRX); + + +// VDU queue +unsigned char vdu_queue[256]; // a somewhat large queue +unsigned char queue_bytes=0; // vdu queue pointer +unsigned char oldchar; // which VDU function needs the queue + +volatile unsigned char flag,oldy=0; + + +int background_color; // for clear screen +int cursor_xpos; +int cursor_ypos; +int last_line_processed; +int previous_line_found; + +int current_background_color; +int current_text_color; + + +// prepare mbed storage for local use +LocalFileSystem local("local"); // Create the local filesystem under the name "local" + +// clear the screen +void cls() { + putchar(0x0c); +} + +// dummy function +void set_cursor_position() { +} + +// home cursor +void home_cursor() { + cursor_xpos=0x00; // ypos + cursor_ypos=0x00; // xpos + set_cursor_position(); +} + +// prepare the screen +void init_screen() { + current_background_color=0; // set initial background color + current_text_color=7; // initial text color attributes + cls(); + home_cursor(); +} + +// handle VDU calls after all bytes are in queue +// Note! queue is working front to back (255 is first, 0 is last) +void do_handle_queue(unsigned char code) { + switch (code) { + case 0x11: // select text color + current_text_color=vdu_queue[255]; + break; + case 0x16: // Mode + current_text_color=7; + current_background_color=0; + init_screen(); + home_cursor(); + break; + case 0x17: // define character n + break; + case 0x1f: // move cursor to x,y + cursor_xpos=vdu_queue[254]; + cursor_ypos=vdu_queue[255]; + set_cursor_position(); + break; + } +} + +// VDU OSWRCHR +// this routine evaluates the stream characters +// and prepares the queue if needed +void printchar(unsigned char ch) { + + // do we need more queue bytes ? + if (queue_bytes) { + vdu_queue[queue_bytes++]=ch; + // all bytes in queue, now handle the call + if (queue_bytes==0) + do_handle_queue(oldchar); + + } else { + + switch (ch) { + case 0x00: // NULL + break; + case 0x08: // CURSOR LEFT + putchar(0x08); + if (cursor_xpos>0) { + cursor_xpos--; + set_cursor_position(); + } + break; + case 0x09: // CURSOR RIGHT + if (cursor_xpos<39) { + cursor_xpos++; + set_cursor_position(); + } + break; + case 0x0a: // CURSOR DOWN + if (cursor_ypos<23) { + cursor_ypos++; + set_cursor_position(); + } else { + cursor_ypos=23; + } + break; + case 0x0b: // CURSOR UP + cursor_ypos++; + if (cursor_ypos>0) { + cursor_ypos--; + set_cursor_position(); + } else { + cursor_ypos=0; + } + break; + case 0x0d: // Carriage Return + cursor_xpos=0; + putchar(0x0d); + putchar(0x0a); + set_cursor_position(); + break; + case 0x0c: // CLEAR TEXT WINDOW + case 0x10: // CLEAR GRAPHIC WINDOW + cls(); + cursor_xpos=0; + cursor_ypos=0; + set_cursor_position(); + break; + case 0x11: // set TEXT color + oldchar=ch; // this was the code of the initial call + queue_bytes=256-1; // for this call we need one more byte + break; + case 0x14: // reset colors + current_text_color=7; + current_background_color=0; + break; + case 0x16: // MODE select + oldchar=ch; + queue_bytes=256-1; + break; + case 0x17: // define character n + break; + case 0x1e: + cursor_xpos=0; + cursor_ypos=0; + set_cursor_position(); + break; + case 0x1f: // set cursor to position X,Y + oldchar=ch; // this was the code of the initial call + queue_bytes=256-2; // for this call we need two more bytes + break; + // all else is put on screen literally + default: + putchar(ch); + break; + } + } +} + + +void init_ramtop() { + + + // set all MOS calls to illegal opcode 0xed55 + // that code is trapped by a mbed routine + wrmem(OSWRCH,0xed); + wrmem(OSWRCH+1,0x55); + + wrmem(OSWORD,0xed); + wrmem(OSWORD+1,0x55); + + wrmem(OSBYTE,0xed); + wrmem(OSBYTE+1,0x55); + + wrmem(OSRDCH,0xed); + wrmem(OSRDCH+1,0x55); + + wrmem(OSNEWL,0xed); + wrmem(OSNEWL+1,0x55); + + wrmem(OSASCI,0xed); + wrmem(OSASCI+1,0x55); + + wrmem(OSRDCH,0xed); + wrmem(OSRDCH+1,0x55); + + wrmem(MAINVDU,0xed); + wrmem(MAINVDU+1,0x55); + + wrmem(GSINIT,0xed); + wrmem(GSINIT+1,0x55); + + wrmem(GSREAD,0xed); + wrmem(GSREAD+1,0x55); + + wrmem(OSRDRM,0xed); + wrmem(OSRDRM+1,0x55); + + wrmem(OSEVEN,0xed); + wrmem(OSEVEN+1,0x55); + + wrmem(OSCLI,0xed); + wrmem(OSCLI+1,0x55); + + wrmem(OSFILE,0xed); + wrmem(OSFILE+1,0x55); + + wrmem(CMDPTR,0xf0); // pointer to CR terminated string (auto start filename) + wrmem(CMDPTR+1,0x00); // it is set here to 0x00f0 + + wrmem(BRKV,0x00); // break vector + wrmem(BRKV+1,0x00); + + wrmem(FAULT,0x38); // fault vector + wrmem(FAULT+1,0x00); +} + +unsigned char getkey() { + unsigned char key=0x00; + if (linktopc.readable()) // get USB status + key=linktopc.getc(); // get ASCII key + return key; +} + +// crude getline routine +void mygets(int ad,int max,unsigned char minasc,unsigned char maxasc) { + int n=0; + int key=0; + + bool eflag=1; + + // show cursor + set_cursor_position(); + + while (eflag) { +// key=getkey(); +#if !DEBUG + // USB serial data ? then override key (only when NOT in debug mode) + if (linktopc.readable()) // get USB status + key=linktopc.getc(); // get ASCII key code + else key=0; + // key=getchar(); // BLOCKING MODE +#endif + + if (key) // printf("got key code: %02x\n\r",key); + + // only ASCII should arrive here + switch (key) { + case 0x00: // no key + break; + case 0x0d: // Enter or Return + wrmem(ad+n,key); + h=n; + // clear carry flag + anda(a); // z80 way of clearing carry... + eflag=0; // terminate the loop + printchar(key); + printchar(0x0a); + break; + case 0x1b: // Escape + wrmem(ad+n,key); + // set carry flag + f=(f&0xc4)|1|(a&0x28); + eflag=0; + h=n; + break; + case 0x15: // CTRL-U (clear input) + while (n) { + + printchar(0x08); + printchar(0x20); + printchar(0x08); + n--; + } + wrmem(ad,0x0d); + break; + case 0x7f: // DELETE + if (n) { + n--; + printchar(0x08); // cursor left + printchar(0x20); // delete character by printing a space + printchar(0x08); // cursor left + wrmem(ad+n,0x20); // overwrite with space + } + break; + default: // all else + // keep within maximum lenght and given ascii limits + if ((key>=minasc) && (key<=maxasc) && n<max) { + wrmem(ad+n,key); + n++; + printchar(key); + } + break; + } + } +} + + +// OSWORD +void do_osword() { + int ad,n; + char buf[40]; + time_t seconds; + + // printf("OSWORD called with PC=%04x A=%02x HL=%02x%02x\n\r",pc,a,h,l); + switch (a) { + + case 0x00: // get a line from the keyboard/input channel + ad=(h<<8)+l; +// printf("Control block:\n\r"); +// printf("buffer address %02x%02x\n\r",rdmem(ad+1),rdmem(ad)); +// printf("maximum length: %d\n\r",rdmem(ad+2)); +// printf("minimum ASCII value %d\n\r",rdmem(ad+3)); +// printf("maximum ASCII value %d\n\r",rdmem(ad+4)); + + mygets((rdmem(ad+1)<<8)+rdmem(ad),rdmem(ad+2),rdmem(ad+3),rdmem(ad+4)); + + break; + case 0x01: // read systemclock (long integer) + break; + case 0x02: // write systemclock (long integer) + break; + case 0x07: // emit a sound from the sound library (0-7) + break; + case 0x0e: // read TIME$ (not present in original BBC Basic) + ad=hl; // get pointer to function number + switch (rdmem(hl)) { // select function number + case 0: // return time string + seconds = time(NULL); // get current time from mbed RTC + strftime(buf,40, "%a,%d %m %Y.%H:%M:%S\r", localtime(&seconds)); // write to temporary buffer + n=0; + while (buf[n]) wrmem(ad++,buf[n++]); // copy to pointer from HL + break; + case 1: // return BCD values of clock + // On exit: + // XY?0=year (&00-&99) + // XY?1=month (&01-&12) + // XY?2=date (&01-&31) + // XY?3=day of week (&01-&07, Sun-Sat) + // XY?4=hours (&00-&23) + // XY?5=minutes (&00-&59) + // XY?6=seconds (&00-&59). + // + // A year value of &80-&99 represents 1980-1999, a value of + // &00-&79 represents 2000-2079. + // + break; + case 2: // Convert BCD to string. + // On entry: + // XY+1..7=BCD value + // On exit: + // XY+1..25=CR-terminated string + break; + } + break; + case 0x0f: // write TIME$ (not present in original BBC Basic) + // On entry: + // XY?0=function code + // XY+1.. value to use. + // Functions are: + // 8 - Set time to value in format "HH:MM:SS" + // 16 - Set date to value in format "Day,DD Mon Year" + // 24 - Set time and date to value in format + // "Day,DD Mon Year.HH:MM:SS" + n=0; + ad=hl; + // printf(" write time$ function %d\n\r",rdmem(ad)); + ad++; + while (rdmem(ad)!=0x0d) buf[n++]=rdmem(ad++); // copy timestring to buffer + buf[n]=0; + // printf("trying to set time from %s\n\r",buf); + break; + } +} + +// OSBYTE +// on 6502 A register and X,Y are used for Low,High parameters +// Z80 uses L and H (so X=L and H=Y <-> L=X and Y=H) +void do_osbyte() { + unsigned char temp; + + // printf("OSBYTE called with PC=%04x A=%02x H=%02x L=%02x\n\r",pc,a,h,l); + switch (a) { + case 0x00: // NULL + l=0xff; + break; + case 0x13: // ASCII 19 + break; + case 0x7c: // clear ESCAPE state + wrmem(0xff80,rdmem(0xff80)&0x7f); + break; + case 0x7d: // set ESCAPE state + wrmem(0xff80,rdmem(0xff80)|0x80); + break; + case 0x7e: // acknowledge ESCAPE state ? (CLOSE ALL!) + wrmem(0xff80,rdmem(0xff80)&0x7f); + break; + case 0x7f: // read EOF on channel + l=0x01; + break; + case 0x80: // read ADVAL(hl) + h=0; + l=0; + break; + case 0x81: // read key within time limit 'hl' centiseconds + temp=hl; // get timeout value (100th seconds) + do { + l=getkey(); + wait(0.01); + } while ((temp--) && (!l)); + + if (l) { // we got a key + if (l==0x1b) { // Escape ? + f=(f&0xc4)|1|(a&0x28); // set carry + h=0x1b; + } else { + anda(a); // clear carry + h=0x00; // clear h + } + } else { // timeout + f=(f&0xc4)|1|(a&0x28); // set carry + h=0xff; // signal no key + } + break; // scan keyboard etc + case 0x82: + h=l=0; + break; // Machine high order address + case 0x83: + h=PAGE>>8; + l=(PAGE & 0xff); + break; // lowest available memory address (PAGE) + case 0x84: // highest available memory address (HIMEM) + h=RAMEND>>8; + l=RAMEND & 0xff; + break; + case 0x85: // read bottom of display RAM for a specific mode + h=0x80; + l=0x00; + break; + case 0x86: // return H=VPOS, L=POS + h=cursor_ypos; + l=cursor_xpos; + break; + case 0x87: // L=character on screen at cursor position + h=7; + l=0; + break; + case 0xda: // read/write the number of items in the VDU queue + // on return H contains the new value, L the old + temp=queue_bytes; + queue_bytes=(queue_bytes & h)^l; + h=queue_bytes; + l=temp; + break; // read/write the number of items in the VDU queue + } +// show_registers(); +// wait(0.1); +} + +void do_osreadchar() { + a=getchar(); + // test for ESCAPE + if (a==27) { + f=(f&0xc4)|1|(a&0x28); + wrmem(0xff80,rdmem(0xff80)|0x80); + } +} + +void do_osnewline() { + printchar(0x0a); + printchar(0x0d); + a=0x0d; +} + +void do_osasci() { + if (a==0x0d) do_osnewline(); + else printchar(a); +} + +void do_mainvdu() { + printchar(a); +} + +void do_gsinit() { + printf("GSINIT called with PC=%04x A=%02x\n\r",pc,a); +} + +void do_gsread() { +} + +void do_osrdrm() { + printf("OSRDRM called with PC=%04x A=%02x H=%02x L=%02x\n\r",pc,a,h,l); +} + +void do_oseven() { + printf("OSEVEN called with PC=%04x A=%02x H=%02x L=%02x\n\r",pc,a,h,l); +} + +void do_oscli() { + printf("OSCLI called with PC=%04x A=%02x H=%02x L=%02x\n\r",pc,a,h,l); + do { + a=rdmem((h<<8)+l); + if (!++l)h++; + putchar(a); + } while (a!=0x0d); +} + +void do_osfile() { + char buffer[200]; + int n=0; + FILE *fp; + // get address of control block + int controlblock=hl; + int offset=rdmem(controlblock)+(rdmem(controlblock+1)<<8); + // create a kludgy pointer from this offset to the filename + char *filename=(char *)(ram+offset-RAMSTART); + long load_address=rdmem(controlblock+2)+(rdmem(controlblock+3)<<8)+(rdmem(controlblock+4)<<16)+(rdmem(controlblock+5)<<24); + long execution_address=rdmem(controlblock+6)+(rdmem(controlblock+7)<<8)+(rdmem(controlblock+8)<<16)+(rdmem(controlblock+9)<<24); + long start_or_length=rdmem(controlblock+10)+(rdmem(controlblock+11)<<8)+(rdmem(controlblock+12)<<16)+(rdmem(controlblock+13)<<24); + long end_address_or_attributes=rdmem(controlblock+14)+(rdmem(controlblock+15)<<8)+(rdmem(controlblock+16)<<16)+(rdmem(controlblock+17)<<24); + + + // printf("OSFILE called with PC=%04x A=%02x H=%02x L=%02x\n\r",pc,a,h,l); + + // for (n=0; n<=0x11; n++) printf("offset %02x value %02x\n\r",n,rdmem(controlblock+n)); + + n=0; + while (filename[n]!=0x0d) n++; + // overwrite 0x0d with end of string + filename[n]=0x00; + + // now determine what to do + switch (a) { + case 0x00: // save a section of memory as a named file + sprintf(buffer,"/local/%s",filename); + // printf("Saving file %s load adr:%08lx exec adr:%08lx start/length%08lx end/attr:%08lx\n\r",filename,load_address,execution_address,start_or_length,end_address_or_attributes); + fp=fopen(buffer, "w"); + if (fp) { + n=start_or_length; + while (n!=end_address_or_attributes) fputc(rdmem(n++),fp); + fclose(fp); + a=1; + } else { + // printf("could not write %s\n\r",buffer); + a=0; + pc=rdmem(0xfffa)+(rdmem(0xfffb)<<8); // do BRK + } + break; + case 0x01: // write the catalogue information (only) for the named file (disc only) + break; + case 0x02: // write the load address (only) for the named file (disc only) + break; + case 0x03: // write the execution address (only) for the named file (disc only) + break; + case 0x04: // write the attributes (only) for the named file (disc only) + break; + case 0x05: // read the named file's catalogue information, place file type in A (disc only) + break; + case 0x06: // delete the named file (disc only) + break; + case 0xff: // load the named file and read the named file's catalogue information + sprintf(buffer,"/local/%s",filename); + // printf("Loading file %s load adr:%08lx exec adr:%08lx start/length%08lx end/attr:%08lx\n\r",buffer,load_address,execution_address,start_or_length,end_address_or_attributes); + fp = fopen(buffer, "r"); + if (fp) { + n=load_address; + while (!feof(fp)) wrmem(n++,fgetc(fp)); + fclose(fp); + a=1; // file found + } else { + // printf("Could not open %s\n",buffer); + a=0; + pc=rdmem(0xfffa)+(rdmem(0xfffb)<<8); // do BRK + } + break; + } +} + +void terminalgets(char *buffer) { + int n=0; + int key=0; + do { + key=getchar(); + buffer[n]=key; + putchar(key); + if (n<16) n++; + } while (key != 0x0d); + buffer[n]=0; +} + + +// here the OS calls are recognized and +// diverted to the mbed routines. +// this needs to be replaced by native Z80 code +void do_mos() { + // printf("Entering MOS emulation with PC %04x\n\r",pc); + + // compensate pc for length of ED55 opcode + switch (pc-2) { + case OSBYTE: + do_osbyte(); + break; + case OSWORD: + do_osword(); + break; + case OSWRCH: + printchar(a); + break; + case OSRDCH: + do_osreadchar(); + break; + case OSNEWL: + do_osnewline(); + break; + case OSASCI: + do_osasci(); + break; + case MAINVDU: + do_mainvdu(); + break; + case GSINIT: + do_gsinit(); + break; + case GSREAD: + do_gsread(); + break; + case OSRDRM: + do_osrdrm(); + break; + case OSEVEN: + do_oseven(); + break; + case OSCLI: + do_oscli(); + break; + case OSFILE: + do_osfile(); + break; + } +} + +void listdir(void) { + DIR *d; + struct dirent *p; + + d = opendir("/sd"); + if (d != NULL) { + while ((p = readdir(d)) != NULL) { + printf(" - %s\r\n", p->d_name); + } + } else { + printf("Could not open directory!\n"); + } + closedir(d); +} + + + + + +// ================================================================ +// main loop +// ================================================================ +int main() { + + // serial port on at 115200 baud + linktopc.baud(115200); + setbuf(stdout, NULL); // no buffering for this filehandle + + // reset all Z80 registers to some initial values + a=f=b=c=d=e=h=l=a1=f1=b1=c1=d1=e1=h1=l1=i=iff1=iff2=im=r=0; + ixoriy=new_ixoriy=0; + ix=iy=sp=pc=0; + + queue_bytes=0; + + // init MOS vectors + init_ramtop(); + + init_screen(); + home_cursor(); + + // endless loop + while (1) { + // wait(0.01); + r++; + // this is some optimization for the IX and IY opcodes (DD/FD) + ixoriy=new_ixoriy; + new_ixoriy=0; + + // fetch opcode and execute, the include does all the heavy decoding + switch (fetch(pc++)) { +#include "z80ops.h" + } + + // next is the interrupt emulator (only IM1 mode) + // interrupt pending? if new_ixoriy is set or iff1==0 don't do interrupt yet (continue DD/FD opcode) + // if (intpend && !new_ixoriy && iff1) { + // are we HALT-ed ? then resume + // if (fetch(pc)==0x76) pc++; + + // block further interrupts for now + // iff1=0; + + // do the call to 00x38 + // push2(pc); // save old pc + // pc=0x0038; // setup new pc + // intpend=0; // release interrupt pending flag; + // } // if intpend + } // while +} \ No newline at end of file
diff -r 000000000000 -r 806c2f2a7d47 mbed.bld --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed.bld Wed Jun 29 14:25:56 2011 +0000 @@ -0,0 +1,1 @@ +http://mbed.org/users/mbed_official/code/mbed/builds/63bcd7ba4912
diff -r 000000000000 -r 806c2f2a7d47 module.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/module.h Wed Jun 29 14:25:56 2011 +0000 @@ -0,0 +1,99 @@ +// ------------------------------------------------------------- +// BBC Basic hardware emulation part +// ------------------------------------------------------------- + +#include "bbc_0100.h" + +#include "mbed.h" +#define byte unsigned char +#define word unsigned short + +// some defaults +#define ESCFLG 0xff80 // escape flag +#define FAULT 0xff82 // fault address +#define DEFERR 0xff84 // default error handler +#define CMDPTR 0xff86 // command line tail +#define SCRATCHPAD 0xff88 // Basic scratchpad area +#define RESERVED 0xff9a +#define OSRDRM 0xffb9 // read byte in paged ROM +#define MAINVDU 0xffbc // main VDU character output entry point +#define OSEVEN 0xffbf // generate an event +#define GSINIT 0xffc2 // general string input initialise routine +#define GSREAD 0xffc5 // read character from string input +#define UKCMD 0xffc9 // unknown command +#define OSFSC 0xffcb // filing system control +#define OSFIND 0xffce // open or close a file +#define OSGBPB 0xffd1 // multiple byte access +#define OSBPUT 0xffd4 // put a byte to a file +#define OSBGET 0xffd7 // get a byte from a file +#define OSARGS 0xffda // read or set file arguments +#define OSFILE 0xffdd // load or save a file +#define OSRDCH 0xffe0 // input a character +#define OSASCI 0xffe3 // print a character with CR converted to LF, CR +#define OSNEWL 0xffe7 // print a LF, CR sequence +#define OSWRCH 0xffee // print a character +#define OSWORD 0xfff1 // do an OSWORD call +#define OSBYTE 0xfff4 // do an OSBYTE call +#define OSCLI 0xfff7 // interpret a command +#define BRKV 0xfffa // FAULT vector + +// default CP/M ram pages +#define RAMSIZE (word)0x4000 // 16K ram +#define RAMSTART 0x34ee +#define RAMEND RAMSTART+RAMSIZE +#define PAGE 0x3800 + +// the emulated ram space +volatile unsigned char ram[RAMSIZE]; + +// ramtop space with vectors +volatile unsigned char ramtop[0x80]; + + +// read from memory space +unsigned char rdmem(word addr) { + extern volatile unsigned short pc; + + // all rom space + if (addr<RAMSTART) { + return rom[addr]; + } + + // ramtop with vectors + if ((addr >=0xff80) && (addr <=0xffff)) { + return ramtop[addr-0xff80]; + } + + // relocate $3400 + if ((addr >= RAMSTART) && (addr < RAMEND)) { + return ram[addr-0x34ee]; + } + return 0xff; // non existant memory reads as 0xff +} + +// write to memory space +void wrmem (word addr, byte val) { + extern volatile unsigned short pc; + + // memtop vector space + if ((addr >=0xff80) && (addr <=0xffff)) { + ramtop[addr-0xff80]=val; + return; + } + // printf("MEMW %04x %02x\n\r",addr,val); + if ((addr >= RAMSTART) && (addr < RAMEND)) { + ram[addr-RAMSTART] = val; + } +} + +// write a byte to IO space +void out(unsigned char addr, unsigned char val) { + printf("IO out called %02d, %02d\n\r",addr,val); +} + +// read a byte from IO space +unsigned char in(unsigned char addr) { + printf("IO in called %02d\n\r",addr); + return 0xff; +} +
diff -r 000000000000 -r 806c2f2a7d47 z80/cbops.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/z80/cbops.h Wed Jun 29 14:25:56 2011 +0000 @@ -0,0 +1,174 @@ +/* Emulations of the CB/DD and FD operations of the Z80 instruction set. + * Copyright (C) 1994 Ian Collier. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#define var_t unsigned char t +#define rlc(x) (x=(x<<1)|(x>>7),rflags(x,x&1)) +#define rrc(x) do{var_t=x&1;x=(x>>1)|(t<<7);rflags(x,t);}while(0) +#define rl(x) do{var_t=x>>7;x=(x<<1)|(f&1);rflags(x,t);}while(0) +#define rr(x) do{var_t=x&1;x=(x>>1)|(f<<7);rflags(x,t);}while(0) +#define sla(x) do{var_t=x>>7;x<<=1;rflags(x,t);}while(0) +#define sra(x) do{var_t=x&1;x=((signed char)x)>>1;rflags(x,t);}while(0) +#define sll(x) do{var_t=x>>7;x=(x<<1)|1;rflags(x,t);}while(0) +#define srl(x) do{var_t=x&1;x>>=1;rflags(x,t);}while(0) + +#define rflags(x,c) (f=(c)|(x&0xa8)|((!x)<<6)|parity(x)) + +#define bit(n,x) (f=(f&1)|((x&(1<<n))?0x10:0x54)|(x&0x28)) +#define set(n,x) (x|=(1<<n)) +#define res(n,x) (x&=~(1<<n)) + +{ + /* reg/val are initialised to stop gcc's (incorrect) warning, + * and static to save initialising them every time. + */ + static unsigned char reg=0,val=0; + unsigned short addr; + unsigned char op; + if(ixoriy){ + // if IX or IY addressing add the '+d' part + addr=(ixoriy==1?ix:iy)+(signed char)fetch(pc); + pc++; + op=fetch(pc); + reg=op&7; + op=(op&0xf8)|6; + } + else{ + op=fetch(pc); + addr=hl; + } + pc++; + + if(op<64)switch(op){ + case 0: rlc(b); break; + case 1: rlc(c); break; + case 2: rlc(d); break; + case 3: rlc(e); break; + case 4: rlc(h); break; + case 5: rlc(l); break; + case 6: val=fetch(addr);rlc(val);store(addr,val);break; + case 7: rlc(a); break; + case 8: rrc(b); break; + case 9: rrc(c); break; + case 10: rrc(d); break; + case 11: rrc(e); break; + case 12: rrc(h); break; + case 13: rrc(l); break; + case 14: val=fetch(addr);rrc(val);store(addr,val);break; + case 15: rrc(a); break; + case 0x10: rl(b); break; + case 0x11: rl(c); break; + case 0x12: rl(d); break; + case 0x13: rl(e); break; + case 0x14: rl(h); break; + case 0x15: rl(l); break; + case 0x16: val=fetch(addr);rl(val);store(addr,val);break; + case 0x17: rl(a); break; + case 0x18: rr(b); break; + case 0x19: rr(c); break; + case 0x1a: rr(d); break; + case 0x1b: rr(e); break; + case 0x1c: rr(h); break; + case 0x1d: rr(l); break; + case 0x1e: val=fetch(addr);rr(val);store(addr,val);break; + case 0x1f: rr(a); break; + case 0x20: sla(b); break; + case 0x21: sla(c); break; + case 0x22: sla(d); break; + case 0x23: sla(e); break; + case 0x24: sla(h); break; + case 0x25: sla(l); break; + case 0x26: val=fetch(addr);sla(val);store(addr,val);break; + case 0x27: sla(a); break; + case 0x28: sra(b); break; + case 0x29: sra(c); break; + case 0x2a: sra(d); break; + case 0x2b: sra(e); break; + case 0x2c: sra(h); break; + case 0x2d: sra(l); break; + case 0x2e: val=fetch(addr);sra(val);store(addr,val);break; + case 0x2f: sra(a); break; + case 0x30: sll(b); break; + case 0x31: sll(c); break; + case 0x32: sll(d); break; + case 0x33: sll(e); break; + case 0x34: sll(h); break; + case 0x35: sll(l); break; + case 0x36: val=fetch(addr);sll(val);store(addr,val);break; + case 0x37: sll(a); break; + case 0x38: srl(b); break; + case 0x39: srl(c); break; + case 0x3a: srl(d); break; + case 0x3b: srl(e); break; + case 0x3c: srl(h); break; + case 0x3d: srl(l); break; + case 0x3e: val=fetch(addr);srl(val);store(addr,val);break; + case 0x3f: srl(a); break; + } + else{ + unsigned char n=(op>>3)&7; + switch(op&0xc7){ + case 0x40: bit(n,b); break; + case 0x41: bit(n,c); break; + case 0x42: bit(n,d); break; + case 0x43: bit(n,e); break; + case 0x44: bit(n,h); break; + case 0x45: bit(n,l); break; + case 0x46: val=fetch(addr);bit(n,val);break; + case 0x47: bit(n,a); break; + case 0x80: res(n,b); break; + case 0x81: res(n,c); break; + case 0x82: res(n,d); break; + case 0x83: res(n,e); break; + case 0x84: res(n,h); break; + case 0x85: res(n,l); break; + case 0x86: val=fetch(addr);res(n,val);store(addr,val);break; + case 0x87: res(n,a); break; + case 0xc0: set(n,b); break; + case 0xc1: set(n,c); break; + case 0xc2: set(n,d); break; + case 0xc3: set(n,e); break; + case 0xc4: set(n,h); break; + case 0xc5: set(n,l); break; + case 0xc6: val=fetch(addr);set(n,val);store(addr,val);break; + case 0xc7: set(n,a); break; + } + } + if(ixoriy)switch(reg){ + case 0:b=val; break; + case 1:c=val; break; + case 2:d=val; break; + case 3:e=val; break; + case 4:h=val; break; + case 5:l=val; break; + case 7:a=val; break; + } +} + +#undef var_t +#undef rlc +#undef rrc +#undef rl +#undef rr +#undef sla +#undef sra +#undef sll +#undef srl +#undef rflags +#undef bit +#undef set +#undef res
diff -r 000000000000 -r 806c2f2a7d47 z80/edops.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/z80/edops.h Wed Jun 29 14:25:56 2011 +0000 @@ -0,0 +1,590 @@ +/* Emulations of the ED operations of the Z80 instruction set. + * Copyright (C) 1994 Ian Collier. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#define input(var) { var=in(c);\ + f=(f&1)|(var&0xa8)|((!var)<<6)|parity(var);\ + } +#define sbchl(x) { unsigned short z=(x);\ + unsigned long t=(hl-z-cy)&0x1ffff;\ + f=((t>>8)&0xa8)|(t>>16)|2|\ + (((hl&0xfff)<(z&0xfff)+cy)<<4)|\ + (((hl^z)&(hl^t)&0x8000)>>13)|\ + ((!(t&0xffff))<<6)|2;\ + l=t;\ + h=t>>8;\ + } + +#define adchl(x) { unsigned short z=(x);\ + unsigned long t=hl+z+cy;\ + f=((t>>8)&0xa8)|(t>>16)|\ + (((hl&0xfff)+(z&0xfff)+cy>0xfff)<<4)|\ + (((~hl^z)&(hl^t)&0x8000)>>13)|\ + ((!(t&0xffff))<<6)|2;\ + l=t;\ + h=t>>8;\ + } + +#define neg (a=-a,\ + f=(a&0xa8)|((!a)<<6)|(((a&15)>0)<<4)|((a==128)<<2)|2|(a>0)) + +{ + unsigned char op=fetch(pc); + pc++; + +// IN B,(C) + switch(op){ +instr(0x40,8); + input(b); +endinstr; + +// OUT (C),B +instr(0x41,8); + out(c,b); +endinstr; + +// SBC HL,BC +instr(0x42,11); + sbchl(bc); +endinstr; + +// LD (nn),BC +instr(0x43,16); + {unsigned short addr=fetch2(pc); + pc+=2; + store2b(addr,b,c); + } +endinstr; + +// NEG +instr(0x44,4); + neg; +endinstr; + +// RETN +instr(0x45,4); + iff1=iff2; + ret; +endinstr; + +// IM 0 +instr(0x46,4); + im=0; +endinstr; + +// LD I,A +instr(0x47,5); + i=a; +endinstr; + +// IN C,(C) +instr(0x48,8); + input(c); +endinstr; + +// OUT (C),C +instr(0x49,8); + out(c,c); +endinstr; + +// ADC HL,BC +instr(0x4a,11); + adchl(bc); +endinstr; + +// LD BC,(nn) +instr(0x4b,16); + {unsigned short addr=fetch2(pc); + pc+=2; + c=fetch(addr); + b=fetch(addr+1); + } +endinstr; + +// ? +instr(0x4c,4); + neg; +endinstr; + +// RETI +instr(0x4d,4); + ret; +endinstr; + +// ? +instr(0x4e,4); + im=1; +endinstr; + +// ? +instr(0x4f,5); + r=a; +endinstr; + +// IN D,(C) +instr(0x50,8); + input(d); +endinstr; + +// OUT (C),D +instr(0x51,8); + out(c,d); +endinstr; + +// SBC HL,DE +instr(0x52,11); + sbchl(de); +endinstr; + +// LD (nn),DE +instr(0x53,16); + {unsigned short addr=fetch2(pc); + pc+=2; + store2b(addr,d,e); + } +endinstr; + +// ? +instr(0x54,4); + neg; +endinstr; + +// my opcode for replacing the MOS routines +instr(0x55,4); + // printf("@ %04x Illegal opcode ED55 (MOS) \n\r",pc); + do_mos(); // + ret; +endinstr; + +// IM 1 +instr(0x56,4); + im=1; +endinstr; + +// LD A,I +instr(0x57,5); + a=i; + f=(f&1)|(a&0xa8)|((!a)<<6)|(iff2<<2); +endinstr; + +// IN E,(C) +instr(0x58,8); + input(e); +endinstr; + +// OUT (C),E +instr(0x59,8); + out(c,e); +endinstr; + +// ADC HL,DE +instr(0x5a,11); + adchl(de); +endinstr; + +// LD DE,(nn) +instr(0x5b,16); + {unsigned short addr=fetch2(pc); + pc+=2; + e=fetch(addr); + d=fetch(addr+1); + } +endinstr; + +// ? +instr(0x5c,4); + neg; +endinstr; + +// ? +instr(0x5d,4); + ret; +endinstr; + +// IM 2 +instr(0x5e,4); + im=2; +endinstr; + +// LDA A,R (unecessary on static memory) +instr(0x5f,5); + a=r; + f=(f&1)|(a&0xa8)|((!a)<<6)|(iff2<<2); +endinstr; + +// IN H,(C) +instr(0x60,8); + input(h); +endinstr; + +// OUT (C),H +instr(0x61,8); + out(c,h); +endinstr; + +// SBC HL,HL +instr(0x62,11); + sbchl(hl); +endinstr; + +// ? +instr(0x63,16); + {unsigned short addr=fetch2(pc); + pc+=2; + store2b(addr,h,l); + } +endinstr; + +// ? +instr(0x64,4); + neg; +endinstr; + +// ? illegal instruction ED65 +instr(0x65,4); + ret; +endinstr; + +// ? +instr(0x66,4); + ret; + // was im=0; +endinstr; + +// RRD +instr(0x67,14); + {unsigned char t=fetch(hl); + unsigned char u=(a<<4)|(t>>4); + a=(a&0xf0)|(t&0x0f); + store(hl,u); + f=(f&1)|(a&0xa8)|((!a)<<6)|parity(a); + } +endinstr; + +// IN L,(C) +instr(0x68,8); + input(l); +endinstr; + +// OUT (C),L +instr(0x69,8); + out(c,l); +endinstr; + +// ADC HL,HL +instr(0x6a,11); + adchl(hl); +endinstr; + +// ? +instr(0x6b,16); + {unsigned short addr=fetch2(pc); + pc+=2; + l=fetch(addr); + h=fetch(addr+1); + } +endinstr; + +// ? +instr(0x6c,4); + neg; +endinstr; + +// ? +instr(0x6d,4); + ret; +endinstr; + +// ? +instr(0x6e,4); + // im=1; + ret; +endinstr; + +// RLD +instr(0x6f,5); + {unsigned char t=fetch(hl); + unsigned char u=(a&0x0f)|(t<<4); + a=(a&0xf0)|(t>>4); + store(hl,u); + f=(f&1)|(a&0xa8)|((!a)<<6)|parity(a); + } +endinstr; + +// ? +instr(0x70,8); + {unsigned char x;input(x);} +endinstr; + +// ? +instr(0x71,8); + out(c,0); +endinstr; + +// SBC HL,SP +instr(0x72,11); + sbchl(sp); +endinstr; + +// LD (nn),SP +instr(0x73,16); + {unsigned short addr=fetch2(pc); + pc+=2; + store2(addr,sp); + } +endinstr; + +// ? +instr(0x74,4); + neg; +endinstr; + +// ? +instr(0x75,4); + ret; +endinstr; + +// ? +instr(0x76,4); + im=2; +endinstr; + +// IN A,(C) +instr(0x78,8); + input(a); +endinstr; + +// OUT (C),A +instr(0x79,8); + out(c,a); +endinstr; + +// ADC HL,SP +instr(0x7a,11); + adchl(sp); +endinstr; + +// LD SP,(nn) +instr(0x7b,16); + {unsigned short addr=fetch2(pc); + pc+=2; + sp=fetch2(addr); + } +endinstr; + +// ? +instr(0x7c,4); + neg; +endinstr; + +// ? +instr(0x7d,4); + ret; +endinstr; + +// ? +instr(0x7e,4); + im=3; +endinstr; + +// LDI +instr(0xa0,12); + {unsigned char x=fetch(hl); + store(de,x); + if(!++l)h++; + if(!++e)d++; + if(!c--)b--; + f=(f&0xc1)|(x&0x28)|(((b|c)>0)<<2); + } +endinstr; + +// CPI +instr(0xa1,12); + {unsigned char carry=cy; + cpa(fetch(hl)); + if(!++l)h++; + if(!c--)b--; + f=(f&0xfa)|carry|(((b|c)>0)<<2); + } +endinstr; + +// INI +instr(0xa2,12); + {unsigned char t=in(c); + store(hl,t); + if(!++l)h++; + b--; + f=(b&0xa8)|((!b)<<6)|2|((parity(b)^c)&4); + } +endinstr; + +// OUTI +instr(0xa3,12); /* I can't determine the correct flags outcome for the + block OUT instructions. Spec says that the carry + flag is left unchanged and N is set to 1, but that + doesn't seem to be the case... */ + {unsigned char x=fetch(hl); + // printf("OUTI %02x %02x\n\r",c,x); + out(c,x); + if(!++l)h++; + b--; + f=(f&1)|0x12|(b&0xa8)|((!b)<<6); + // f=(f & 0xBF)|2|((b==0)<<6); + + } +endinstr; + +// LDD +instr(0xa8,12); + {unsigned char x=fetch(hl); + store(de,x); + if(!l--)h--; + if(!e--)d--; + if(!c--)b--; + f=(f&0xc1)|(x&0x28)|(((b|c)>0)<<2); + } +endinstr; + +// CPD +instr(0xa9,12); + {unsigned char carry=cy; + cpa(fetch(hl)); + if(!l--)h--; + if(!c--)b--; + f=(f&0xfa)|carry|(((b|c)>0)<<2); + } +endinstr; + +// IND +instr(0xaa,12); + {unsigned char t=in(c); + store(hl,t); + if(!l--)h--; + b--; +// f=(f & 0xBF)|2|((!b)<<6); + + f=(b&0xa8)|((b>0)<<6)|2|((parity(b)^c^4)&4); + } +endinstr; + +// OUTD +instr(0xab,12); + {unsigned char x=fetch(hl); + out(c,x); + if(!l--)h--; + b--; + f=(f&1)|0x12|(b&0xa8)|((!b)<<6); + } +endinstr; + +/* Note: the Z80 implements "*R" as "*" followed by JR -2. No reason + to change this... */ + +// LDIR +instr(0xb0,12); + {unsigned char x=fetch(hl); + store(de,x); + if(!++l)h++; + if(!++e)d++; + if(!c--)b--; + f=(f&0xc1)|(x&0x28)|(((b|c)>0)<<2); + if(b|c)pc-=2; + } +endinstr; + +// CPIR +instr(0xb1,12); + {unsigned char carry=cy; + cpa(fetch(hl)); + if(!++l)h++; + if(!c--)b--; + f=(f&0xfa)|carry|(((b|c)>0)<<2); + if((f&0x44)==4)pc-=2; + } +endinstr; + +// INIR +instr(0xb2,12); + {unsigned char t=in(c); + store(hl,t); + if(!++l)h++; + b--; + f=(b&0xa8)|((!b)<<6)|2|((parity(b)^c)&4); + // f=(f & 0xBF)|2|((!b)<<6); + if(b)pc-=2; + } +endinstr; + +// OTIR +instr(0xb3,12); + {unsigned char x=fetch(hl); + out(c,x); + if(!++l)h++; + b--; + f=(f&1)|0x12|(b&0xa8)|((!b)<<6); + if(b)pc-=2; + } +endinstr; + +// LDDR +instr(0xb8,12); + {unsigned char x=fetch(hl); + store(de,x); + if(!l--)h--; + if(!e--)d--; + if(!c--)b--; + f=(f&0xc1)|(x&0x28)|(((b|c)>0)<<2); + if(b|c)pc-=2; + } +endinstr; + +// CPDR +instr(0xb9,12); + {unsigned char carry=cy; + cpa(fetch(hl)); + if(!l--)h--; + if(!c--)b--; + f=(f&0xfa)|carry|(((b|c)>0)<<2); + if((f&0x44)==4)pc-=2; + } +endinstr; + +// INDR +instr(0xba,12); + {unsigned char t=in(c); + store(hl,t); + if(!l--)h--; + b--; + f=(b&0xa8)|((!b)<<6)|2|((parity(b)^c^4)&4); + // f=(f & 0xBF)|2|((!b)<<6); + + if(b)pc-=2; + } +endinstr; + +// OTDR +instr(0xbb,12); + {unsigned char x=fetch(hl); + out(c,x); + if(!l--)h--; + b--; + f=(f&1)|0x12|(b&0xa8)|((!b)<<6); + if(b)pc-=2; + } +endinstr; + +}}
diff -r 000000000000 -r 806c2f2a7d47 z80/z80.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/z80/z80.h Wed Jun 29 14:25:56 2011 +0000 @@ -0,0 +1,173 @@ +/* z81/xz81, Linux console and X ZX81/ZX80 emulators. + * Copyright (C) 1994 Ian Collier. z81 changes (C) 1995-2001 Russell Marks. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +// I have made all Z80 registers global and volatile +volatile bool iff1, iff2; +unsigned char im; +volatile unsigned char a, f, b, c, d, e, h, l; +volatile unsigned char r, a1, f1, b1, c1, d1, e1, h1, l1, i; +volatile unsigned short pc; +volatile unsigned short ix, iy, sp; + +// some flags +volatile bool intpend=0; +volatile unsigned char new_ixoriy=0; +volatile unsigned char ixoriy=0; + + +#define Z80_quit 1 +#define Z80_NMI 2 +#define Z80_reset 3 +#define Z80_load 4 +#define Z80_save 5 +#define Z80_log 6 + +#define parity(a) (partable[a]) +unsigned char partable[256]={ + 4, 0, 0, 4, 0, 4, 4, 0, 0, 4, 4, 0, 4, 0, 0, 4, + 0, 4, 4, 0, 4, 0, 0, 4, 4, 0, 0, 4, 0, 4, 4, 0, + 0, 4, 4, 0, 4, 0, 0, 4, 4, 0, 0, 4, 0, 4, 4, 0, + 4, 0, 0, 4, 0, 4, 4, 0, 0, 4, 4, 0, 4, 0, 0, 4, + 0, 4, 4, 0, 4, 0, 0, 4, 4, 0, 0, 4, 0, 4, 4, 0, + 4, 0, 0, 4, 0, 4, 4, 0, 0, 4, 4, 0, 4, 0, 0, 4, + 4, 0, 0, 4, 0, 4, 4, 0, 0, 4, 4, 0, 4, 0, 0, 4, + 0, 4, 4, 0, 4, 0, 0, 4, 4, 0, 0, 4, 0, 4, 4, 0, + 0, 4, 4, 0, 4, 0, 0, 4, 4, 0, 0, 4, 0, 4, 4, 0, + 4, 0, 0, 4, 0, 4, 4, 0, 0, 4, 4, 0, 4, 0, 0, 4, + 4, 0, 0, 4, 0, 4, 4, 0, 0, 4, 4, 0, 4, 0, 0, 4, + 0, 4, 4, 0, 4, 0, 0, 4, 4, 0, 0, 4, 0, 4, 4, 0, + 4, 0, 0, 4, 0, 4, 4, 0, 0, 4, 4, 0, 4, 0, 0, 4, + 0, 4, 4, 0, 4, 0, 0, 4, 4, 0, 0, 4, 0, 4, 4, 0, + 0, 4, 4, 0, 4, 0, 0, 4, 4, 0, 0, 4, 0, 4, 4, 0, + 4, 0, 0, 4, 0, 4, 4, 0, 0, 4, 4, 0, 4, 0, 0, 4 + }; + + +#define fetch(x) (rdmem(x)) +#define fetch2(x) ((fetch((x)+1)<<8)|fetch(x)) + +// store 8 bit value y at 16 bit location x +#define store(x,y) (wrmem(x,(y))) + +#define store2b(x,hi,lo) do {wrmem(x,lo);wrmem(x+1,hi);}while(0) + +#define store2(x,y) store2b(x,(y)>>8,(y)&255) + +#define bc ((b<<8)|c) +#define de ((d<<8)|e) +#define hl ((h<<8)|l) + +#define instr(opcode,cycles) case opcode: { +#define HLinstr(opcode) \ + case opcode: {unsigned short addr; \ + if(ixoriy==0)addr=hl; \ + else addr=(ixoriy==1?ix:iy)+ \ + (signed char)fetch(pc),\ + pc++ +#define endinstr }; break + +#define cy (f&1) + +#define xh (ixoriy==0?h:ixoriy==1?(ix>>8):(iy>>8)) +#define xl (ixoriy==0?l:ixoriy==1?(ix&0xff):(iy&0xff)) + +#define setxh(x) (ixoriy==0?(h=(x)):ixoriy==1?(ix=(ix&0xff)|((x)<<8)):\ + (iy=(iy&0xff)|((x)<<8))) +#define setxl(x) (ixoriy==0?(l=(x)):ixoriy==1?(ix=(ix&0xff00)|(x)):\ + (iy=(iy&0xff00)|(x))) + +#define inc(var) /* 8-bit increment */ ( var++,\ + f=(f&1)|(var&0xa8)|\ + ((!(var&15))<<4)|((!var)<<6)|\ + ((var==128)<<2)\ + ) +#define dec(var) /* 8-bit decrement */ ( f=(f&1)|((!(var&15))<<4)|2,\ + --var,\ + f|=(var&0xa8)|((var==127)<<2)|\ + ((!var)<<6)\ + ) +#define swap(x,y) {unsigned char t=x; x=y; y=t;} +#define addhl(hi,lo) /* 16-bit add */ if(!ixoriy){\ + unsigned short t;\ + l=t=l+(lo);\ + f=(f&0xc4)|(((t>>=8)+(h&0x0f)+((hi)&0x0f)>15)<<4);\ + h=t+=h+(hi);\ + f|=(h&0x28)|(t>>8);\ + }\ + else do{unsigned long t=(ixoriy==1?ix:iy);\ + f=(f&0xc4)|(((t&0xfff)+((hi<<8)|lo)>0xfff)<<4);\ + t+=(hi<<8)|lo;\ + if(ixoriy==1)ix=t; else iy=t;\ + f|=((t>>8)&0x28)|(t>>16);\ + } while(0) + +#define adda(x,c) /* 8-bit add */ do{unsigned short y;\ + unsigned char z=(x);\ + y=a+z+(c);\ + f=(y&0xa8)|(y>>8)|(((a&0x0f)+(z&0x0f)+(c)>15)<<4)|\ + (((~a^z)&0x80&(y^a))>>5);\ + a=y; \ + f|=(!a)<<6;\ + } while(0) +#define suba(x,c) /* 8-bit subtract */ do{unsigned short y;\ + unsigned char z=(x);\ + y=(a-z-(c))&0x1ff;\ + f=(y&0xa8)|(y>>8)|(((a&0x0f)<(z&0x0f)+(c))<<4)|\ + (((a^z)&0x80&(y^a))>>5)|2;\ + a=y; \ + f|=(!a)<<6;\ + } while(0) +#define cpa(x) /* 8-bit compare */ do{unsigned short y;\ + unsigned char z=(x);\ + y=(a-z)&0x1ff;\ + f=(y&0xa8)|(y>>8)|(((a&0x0f)<(z&0x0f))<<4)|\ + (((a^z)&0x80&(y^a))>>5)|2|((!y)<<6);\ + } while(0) +#define anda(x) /* logical and */ do{\ + a&=(x);\ + f=(a&0xa8)|((!a)<<6)|0x10|parity(a);\ + } while(0) +#define xora(x) /* logical xor */ do{\ + a^=(x);\ + f=(a&0xa8)|((!a)<<6)|parity(a);\ + } while(0) +#define ora(x) /* logical or */ do{\ + a|=(x);\ + f=(a&0xa8)|((!a)<<6)|parity(a);\ + } while(0) + +#define jr /* execute relative jump */ do{int j=(signed char)fetch(pc);\ + pc+=j+1;\ + } while(0) +#define jp /* execute jump */ (pc=fetch2(pc)) +#define call /* execute call */ do{\ + push2(pc+2);\ + jp;\ + } while(0) +#define ret /* execute return */ do{\ + pop2(pc);\ + } while(0) +#define pop2(var) /* pop 16-bit register */ (var=fetch2(sp),sp+=2) +#define pop1(v1,v2) /* pop register pair */ (v2=fetch(sp),\ + v1=fetch(sp+1),sp+=2) +#define push2(val) /* push 16-bit register */ do{sp-=2;store2(sp,(val));}\ + while(0) +#define push1(v1,v2) /* push register pair */ do{sp-=2;\ + store2b(sp,v1,v2);\ + }while(0) +
diff -r 000000000000 -r 806c2f2a7d47 z80/z80ops.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/z80/z80ops.h Wed Jun 29 14:25:56 2011 +0000 @@ -0,0 +1,1218 @@ +/* Emulations of the Z80 CPU instruction set - part of xz80. + * Copyright (C) 1994 Ian Collier. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + + +/* nop */ +case 0: +break; +// ld BC,nn +instr(0x01,10); +c=fetch(pc),pc++; +b=fetch(pc),pc++; +endinstr; +// ld (BC),A +instr(0x02,7); +store(bc,a); +endinstr; +// inc BC +instr(0x03,6); +if (!++c)b++; +endinstr; +// inc B +instr(0x04,4); +inc(b); +endinstr; +// dec B +instr(0x05,4); +dec(b); +endinstr; +// ld B,n +instr(0x06,7); +b=fetch(pc),pc++; +endinstr; +// rlca +instr(0x07,4); +a=(a<<1)|(a>>7); +f=(f&0xc4)|(a&0x29); +endinstr; +// ex AF,AF' +instr(0x08,4); +swap(a,a1); +swap(f,f1); +endinstr; +// add HL,BC +instr(0x09,11); +addhl(b,c); +endinstr; +// ld A,(BC) +instr(0x0a,7); +a=fetch(bc); +endinstr; +// dec BC +instr(0x0b,6); +if (!c--)b--; +endinstr; +// inc C +instr(0x0c,4); +inc(c); +endinstr; +// dec C +instr(0x0d,4); +dec(c); +endinstr; +// ld C,n +instr(0x0e,4); +c=fetch(pc),pc++; +endinstr; +// rrca +instr(0x0f,4); +f=(f&0xc4)|(a&1); +a=(a>>1)|(a<<7); +f|=a&0x28; +endinstr; +// djnz +instr(0x10,8); +if (!--b)pc++; +else jr; +endinstr; +// ld DE,nn +instr(0x11,10); +e=fetch(pc),pc++; +d=fetch(pc),pc++; +endinstr; +// ld (DE),A +instr(0x12,7); +store(de,a); +endinstr; +// inc DE +instr(0x13,6); +if (!++e)d++; +endinstr; +// inc D +instr(0x14,4); +inc(d); +endinstr; +// dec D +instr(0x15,4); +dec(d); +endinstr; +// ld D,n +instr(0x16,7); +d=fetch(pc),pc++; +endinstr; +// rla +instr(0x17,4); +{ + int t=a>>7; + a=(a<<1)|(f&1); + f=(f&0xc4)|(a&0x28)|t; +} +endinstr; +// JR +instr(0x18,7); +jr; +endinstr; +// add HL,DE +instr(0x19,11); +addhl(d,e); +endinstr; +// ld A,(DE) +instr(0x1a,7); +a=fetch(de); +endinstr; +// dec DE +instr(0x1b,6); +if (!e--)d--; +endinstr; +// inc E +instr(0x1c,4); +inc(e); +endinstr; +// dec E +instr(0x1d,4); +dec(e); +endinstr; +// ld E,n +instr(0x1e,4); +e=fetch(pc),pc++; +endinstr; +// rra +instr(0x1f,4); +{ + int t=a&1; + a=(a>>1)|(f<<7); + f=(f&0xc4)|(a&0x28)|t; +} +endinstr; +// jr NZ +instr(0x20,7); +if (f&0x40)pc++; +else jr; +endinstr; +// ld HL,nn +instr(0x21,10); +if (!ixoriy) { + l=fetch(pc),pc++; + h=fetch(pc),pc++; +} else { + if (ixoriy==1) + ix=fetch2(pc); + else iy=fetch2(pc); + pc+=2; +} +endinstr; +// ld (nn),HL +instr(0x22,16); +{ + unsigned short addr=fetch2(pc); + pc+=2; + if (!ixoriy) store2b(addr,h,l); + else if (ixoriy==1)store2(addr,ix); + else store2(addr,iy); +} +endinstr; +// inc HL +instr(0x23,6); +if (!ixoriy) { + if (!++l)h++; +} else if (ixoriy==1)ix++; +else iy++; +endinstr; +// inc H +instr(0x24,4); +if (ixoriy==0)inc(h); +else { + unsigned char t; + t=(ixoriy==1?ix:iy)>>8; + inc(t); + if (ixoriy==1)ix=(ix&0xff)|(t<<8); + else iy=(iy&0xff)|(t<<8); +} +endinstr; +// dec H +instr(0x25,4); +if (ixoriy==0)dec(h); +else { + unsigned char t; + t=(ixoriy==1?ix:iy)>>8; + dec(t); + if (ixoriy==1)ix=(ix&0xff)|(t<<8); + else iy=(iy&0xff)|(t<<8); +} +endinstr; +// ld H,n +instr(0x26,7); +setxh(fetch(pc)); +pc++; +endinstr; +// daa +instr(0x27,4); +{ + unsigned char incr=0, carry=cy; + if ((f&0x10) || (a&0x0f)>9) incr=6; + if ((f&1) || (a>>4)>9) incr|=0x60; + if (f&2) suba(incr,0); + + else { + if (a>0x90 && (a&15)>9)incr|=0x60; + adda(incr,0); + } + f=((f|carry)&0xfb)|parity(a); +} +endinstr; +// jr Z +instr(0x28,7); +if (f&0x40)jr; +else pc++; +endinstr; +// add HL,HL +instr(0x29,11); +if (!ixoriy)addhl(h,l); +else if (ixoriy==1)addhl((ix>>8),(ix&0xff)); +else addhl((iy>>8),(iy&0xff)); +endinstr; +// ld HL,(nn) +instr(0x2a,16); +{ + unsigned short addr=fetch2(pc); + pc+=2; + if (!ixoriy) { + l=fetch(addr); + h=fetch(addr+1); + } else if (ixoriy==1)ix=fetch2(addr); + else iy=fetch2(addr); +} +endinstr; +// dec HL +instr(0x2b,6); +if (!ixoriy) { + if (!l--)h--; +} else if (ixoriy==1)ix--; +else iy--; +endinstr; +// inc L +instr(0x2c,4); +if (!ixoriy)inc(l); +else { + unsigned char t; + t=(ixoriy==1?ix:iy); + inc(t); + if (ixoriy==1)ix=(ix&0xff00)|t; + else iy=(iy&0xff00)|t; +} +endinstr; +// dec L +instr(0x2d,4); +if (!ixoriy)dec(l); +else { + unsigned char t; + t=(ixoriy==1?ix:iy); + dec(t); + if (ixoriy==1)ix=(ix&0xff00)|t; + else iy=(iy&0xff00)|t; +} +endinstr; +// ld L,n +instr(0x2e,4); +setxl(fetch(pc)); +pc++; +endinstr; +// cpl +instr(0x2f,4); +a=~a; +f=(f&0xc5)|(a&0x28)|0x12; +endinstr; +// jr NC +instr(0x30,7); +if (f&1)pc++; +else jr; +endinstr; +// ld SP,nn +instr(0x31,10); +sp=fetch2(pc); +pc+=2; +endinstr; +// ld (nn),A +instr(0x32,13); +{ + unsigned short addr=fetch2(pc); + pc+=2; + store(addr,a); +} +endinstr; +// inc SP +instr(0x33,6); +sp++; +endinstr; +// inc (HL) +HLinstr(0x34); +{ + unsigned char t=fetch(addr); + inc(t); + store(addr,t); +} +endinstr; +// dec (HL) +HLinstr(0x35); +{ + unsigned char t=fetch(addr); + dec(t); + store(addr,t); +} +endinstr; +// ld (HL),n +HLinstr(0x36); +store(addr,fetch(pc)); +pc++; +endinstr; +// scf +instr(0x37,4); +f=(f&0xc4)|1|(a&0x28); +endinstr; +// jr C +instr(0x38,7); +if (f&1)jr; +else pc++; +endinstr; +// add HL,SP +instr(0x39,11); +addhl((sp>>8),(sp&0xff)); +endinstr; +// ld A,(nn) +instr(0x3a,13); +{ + unsigned short addr=fetch2(pc); + pc+=2; + a=fetch(addr); +} +endinstr; +// dec SP +instr(0x3b,6); +sp--; +endinstr; +// inc A +instr(0x3c,4); +inc(a); +endinstr; +// dec A +instr(0x3d,4); +dec(a); +endinstr; +// ld A,n +instr(0x3e,4); +a=fetch(pc),pc++; +endinstr; +// ccf +instr(0x3f,4); +f=(f&0xc4)|(cy^1)|(cy<<4)|(a&0x28); +endinstr; +// ld B,B +instr(0x40,4); +/* ld b,b */ +endinstr; + +instr(0x41,4); +b=c; +endinstr; + +instr(0x42,4); +b=d; +endinstr; + +instr(0x43,4); +b=e; +endinstr; + +instr(0x44,4); +b=xh; +endinstr; + +instr(0x45,4); +b=xl; +endinstr; + +HLinstr(0x46); +b=fetch(addr); +endinstr; + +instr(0x47,4); +b=a; +endinstr; + +instr(0x48,4); +c=b; +endinstr; + +instr(0x49,4); +/* ld c,c */ +endinstr; + +instr(0x4a,4); +c=d; +endinstr; + +instr(0x4b,4); +c=e; +endinstr; + +instr(0x4c,4); +c=xh; +endinstr; + +instr(0x4d,4); +c=xl; +endinstr; + +HLinstr(0x4e); +c=fetch(addr); +endinstr; + +instr(0x4f,4); +c=a; +endinstr; + +instr(0x50,4); +d=b; +endinstr; + +instr(0x51,4); +d=c; +endinstr; + +instr(0x52,4); +/* ld d,d */ +endinstr; + +instr(0x53,4); +d=e; +endinstr; + +instr(0x54,4); +d=xh; +endinstr; + +instr(0x55,4); +d=xl; +endinstr; + +HLinstr(0x56); +d=fetch(addr); +endinstr; + +instr(0x57,4); +d=a; +endinstr; + +instr(0x58,4); +e=b; +endinstr; + +instr(0x59,4); +e=c; +endinstr; + +instr(0x5a,4); +e=d; +endinstr; + +instr(0x5b,4); +/* ld e,e */ +endinstr; + +instr(0x5c,4); +e=xh; +endinstr; + +instr(0x5d,4); +e=xl; +endinstr; + +HLinstr(0x5e); +e=fetch(addr); +endinstr; + +instr(0x5f,4); +e=a; +endinstr; + +instr(0x60,4); +setxh(b); +endinstr; + +instr(0x61,4); +setxh(c); +endinstr; + +instr(0x62,4); +setxh(d); +endinstr; + +instr(0x63,4); +setxh(e); +endinstr; + +instr(0x64,4); +/* ld h,h */ +endinstr; + +instr(0x65,4); +setxh(xl); +endinstr; + +HLinstr(0x66); +h=fetch(addr); +endinstr; + +instr(0x67,4); +setxh(a); +endinstr; + +instr(0x68,4); +setxl(b); +endinstr; + +instr(0x69,4); +setxl(c); +endinstr; + +instr(0x6a,4); +setxl(d); +endinstr; + +instr(0x6b,4); +setxl(e); +endinstr; + +instr(0x6c,4); +setxl(xh); +endinstr; + +instr(0x6d,4); +/* ld l,l */ +endinstr; + +HLinstr(0x6e); +l=fetch(addr); +endinstr; + +instr(0x6f,4); +setxl(a); +endinstr; + +HLinstr(0x70); +store(addr,b); +endinstr; + +HLinstr(0x71); +store(addr,c); +endinstr; + +HLinstr(0x72); +store(addr,d); +endinstr; + +HLinstr(0x73); +store(addr,e); +endinstr; + +HLinstr(0x74); +store(addr,h); +endinstr; + +HLinstr(0x75); +store(addr,l); +endinstr; + +// HALT +instr(0x76,4); +pc--; /* keep nopping until int */ +endinstr; + +HLinstr(0x77); +store(addr,a); +endinstr; + +instr(0x78,4); +a=b; +endinstr; + +instr(0x79,4); +a=c; +endinstr; + +instr(0x7a,4); +a=d; +endinstr; + +instr(0x7b,4); +a=e; +endinstr; + +instr(0x7c,4); +a=xh; +endinstr; + +instr(0x7d,4); +a=xl; +endinstr; + +HLinstr(0x7e); +a=fetch(addr); +endinstr; + +instr(0x7f,4); +/* ld a,a */ +endinstr; + +instr(0x80,4); +adda(b,0); +endinstr; + +instr(0x81,4); +adda(c,0); +endinstr; + +instr(0x82,4); +adda(d,0); +endinstr; + +instr(0x83,4); +adda(e,0); +endinstr; + +instr(0x84,4); +adda(xh,0); +endinstr; + +instr(0x85,4); +adda(xl,0); +endinstr; + +HLinstr(0x86); +adda(fetch(addr),0); +endinstr; + +instr(0x87,4); +adda(a,0); +endinstr; + +instr(0x88,4); +adda(b,cy); +endinstr; + +instr(0x89,4); +adda(c,cy); +endinstr; + +instr(0x8a,4); +adda(d,cy); +endinstr; + +instr(0x8b,4); +adda(e,cy); +endinstr; + +instr(0x8c,4); +adda(xh,cy); +endinstr; + +instr(0x8d,4); +adda(xl,cy); +endinstr; + +HLinstr(0x8e); +adda(fetch(addr),cy); +endinstr; + +instr(0x8f,4); +adda(a,cy); +endinstr; + +instr(0x90,4); +suba(b,0); +endinstr; + +instr(0x91,4); +suba(c,0); +endinstr; + +instr(0x92,4); +suba(d,0); +endinstr; + +instr(0x93,4); +suba(e,0); +endinstr; + +instr(0x94,4); +suba(xh,0); +endinstr; + +instr(0x95,4); +suba(xl,0); +endinstr; + +HLinstr(0x96); +suba(fetch(addr),0); +endinstr; + +instr(0x97,4); +suba(a,0); +endinstr; + +instr(0x98,4); +suba(b,cy); +endinstr; + +instr(0x99,4); +suba(c,cy); +endinstr; + +instr(0x9a,4); +suba(d,cy); +endinstr; + +instr(0x9b,4); +suba(e,cy); +endinstr; + +instr(0x9c,4); +suba(xh,cy); +endinstr; + +instr(0x9d,4); +suba(xl,cy); +endinstr; + +HLinstr(0x9e); +suba(fetch(addr),cy); +endinstr; + +instr(0x9f,4); +suba(a,cy); +endinstr; + +instr(0xa0,4); +anda(b); +endinstr; + +instr(0xa1,4); +anda(c); +endinstr; + +instr(0xa2,4); +anda(d); +endinstr; + +instr(0xa3,4); +anda(e); +endinstr; + +instr(0xa4,4); +anda(xh); +endinstr; + +instr(0xa5,4); +anda(xl); +endinstr; + +HLinstr(0xa6); +anda(fetch(addr)); +endinstr; + +instr(0xa7,4); +anda(a); +endinstr; + +instr(0xa8,4); +xora(b); +endinstr; + +instr(0xa9,4); +xora(c); +endinstr; + +instr(0xaa,4); +xora(d); +endinstr; + +instr(0xab,4); +xora(e); +endinstr; + +instr(0xac,4); +xora(xh); +endinstr; + +instr(0xad,4); +xora(xl); +endinstr; + +HLinstr(0xae); +xora(fetch(addr)); +endinstr; + +instr(0xaf,4); +xora(a); +endinstr; + +instr(0xb0,4); +ora(b); +endinstr; + +instr(0xb1,4); +ora(c); +endinstr; + +instr(0xb2,4); +ora(d); +endinstr; + +instr(0xb3,4); +ora(e); +endinstr; + +instr(0xb4,4); +ora(xh); +endinstr; + +instr(0xb5,4); +ora(xl); +endinstr; + +HLinstr(0xb6); +ora(fetch(addr)); +endinstr; + +instr(0xb7,4); +ora(a); +endinstr; + +instr(0xb8,4); +cpa(b); +endinstr; + +instr(0xb9,4); +cpa(c); +endinstr; + +instr(0xba,4); +cpa(d); +endinstr; + +instr(0xbb,4); +cpa(e); +endinstr; + +instr(0xbc,4); +cpa(xh); +endinstr; + +instr(0xbd,4); +cpa(xl); +endinstr; + +HLinstr(0xbe); +cpa(fetch(addr)); +endinstr; + +instr(0xbf,4); +cpa(a); +endinstr; + +instr(0xc0,5); +if (!(f&0x40))ret; +endinstr; + +instr(0xc1,10); +pop1(b,c); +endinstr; + +instr(0xc2,10); +if (!(f&0x40))jp; +else pc+=2; +endinstr; + +instr(0xc3,10); +jp; +endinstr; + +instr(0xc4,10); +if (!(f&0x40))call; +else pc+=2; +endinstr; + +instr(0xc5,11); +push1(b,c); +endinstr; + +instr(0xc6,7); +adda(fetch(pc),0); +pc++; +endinstr; + +instr(0xc7,11); +push2(pc); +pc=0; +endinstr; + +instr(0xc8,5); +if (f&0x40)ret; +endinstr; + +instr(0xc9,4); +ret; +endinstr; + +instr(0xca,10); +if (f&0x40)jp; +else pc+=2; +endinstr; + +instr(0xcb,4); +#include "cbops.h" +endinstr; + +instr(0xcc,10); +if (f&0x40)call; +else pc+=2; +endinstr; + +instr(0xcd,10); +call; +endinstr; + +instr(0xce,7); +adda(fetch(pc),cy); +pc++; +endinstr; + +instr(0xcf,11); +push2(pc); +pc=8; +endinstr; + +instr(0xd0,5); +if (!cy)ret; +endinstr; + +instr(0xd1,10); +pop1(d,e); +endinstr; + +instr(0xd2,10); +if (!cy)jp; +else pc+=2; +endinstr; + +// OUT +instr(0xd3,11); +out(fetch(pc),a); +pc++; +endinstr; + +instr(0xd4,10); +if (!cy)call; +else pc+=2; +endinstr; + +instr(0xd5,11); +push1(d,e); +endinstr; + +instr(0xd6,7); +suba(fetch(pc),0); +pc++; +endinstr; + +instr(0xd7,11); +push2(pc); +pc=16; +endinstr; + +instr(0xd8,5); +if (cy)ret; +endinstr; + +instr(0xd9,4); +swap(b,b1); +swap(c,c1); +swap(d,d1); +swap(e,e1); +swap(h,h1); +swap(l,l1); +endinstr; + +instr(0xda,10); +if (cy)jp; +else pc+=2; +endinstr; + +// IN +instr(0xdb,11); +{ + a=in(fetch(pc)); + pc++; +} +endinstr; + +instr(0xdc,10); +if (cy)call; +else pc+=2; +endinstr; + +instr(0xdd,4); +new_ixoriy=1; +endinstr; + +instr(0xde,7); +suba(fetch(pc),cy); +pc++; +endinstr; + +// RST 18 +instr(0xdf,11); +push2(pc); +pc=0x0018; +endinstr; + +instr(0xe0,5); +if (!(f&4))ret; +endinstr; + +instr(0xe1,10); +if (!ixoriy)pop1(h,l); +else if (ixoriy==1)pop2(ix); +else pop2(iy); +endinstr; + +instr(0xe2,10); +if (!(f&4))jp; +else pc+=2; +endinstr; + +instr(0xe3,19); +if (!ixoriy) { + unsigned short t=fetch2(sp); + store2b(sp,h,l); + l=t; + h=t>>8; +} else if (ixoriy==1) { + unsigned short t=fetch2(sp); + store2(sp,ix); + ix=t; +} else { + unsigned short t=fetch2(sp); + store2(sp,iy); + iy=t; +} +endinstr; + +instr(0xe4,10); +if (!(f&4))call; +else pc+=2; +endinstr; + +instr(0xe5,11); +if (!ixoriy)push1(h,l); +else if (ixoriy==1)push2(ix); +else push2(iy); +endinstr; + +instr(0xe6,7); +anda(fetch(pc)); +pc++; +endinstr; + +instr(0xe7,11); +push2(pc); +pc=32; +endinstr; + +instr(0xe8,5); +if (f&4)ret; +endinstr; + +instr(0xe9,4); +pc=!ixoriy?hl:ixoriy==1?ix:iy; +endinstr; + +instr(0xea,10); +if (f&4)jp; +else pc+=2; +endinstr; + +instr(0xeb,4); +swap(h,d); +swap(e,l); +endinstr; + +instr(0xec,10); +if (f&4)call; +else pc+=2; +endinstr; + +instr(0xed,4); +#include"edops.h" +endinstr; + +instr(0xee,7); +xora(fetch(pc)); +pc++; +endinstr; + +instr(0xef,11); +push2(pc); +pc=40; +endinstr; + +instr(0xf0,5); +if (!(f&0x80))ret; +endinstr; + +instr(0xf1,10); +pop1(a,f); +endinstr; + +instr(0xf2,10); +if (!(f&0x80))jp; +else pc+=2; +endinstr; + +instr(0xf3,4); +iff1=iff2=0; +// __disable_irq(); +endinstr; + +instr(0xf4,10); +if (!(f&0x80))call; +else pc+=2; +endinstr; + +instr(0xf5,11); +push1(a,f); +endinstr; + +instr(0xf6,7); +ora(fetch(pc)); +pc++; +endinstr; + +// rst 30 +instr(0xf7,11); +push2(pc); +pc=0x30; +// printf("RST30\n\r"); +endinstr; + +instr(0xf8,5); +if (f&0x80)ret; +endinstr; + +instr(0xf9,6); +sp=!ixoriy?hl:ixoriy==1?ix:iy; +endinstr; + +instr(0xfa,10); +if (f&0x80)jp; +else pc+=2; +endinstr; + +instr(0xfb,4); +iff1=iff2=1; +endinstr; + +instr(0xfc,10); +if (f&0x80)call; +else pc+=2; +endinstr; + +instr(0xfd,4); +new_ixoriy=2; +endinstr; + +instr(0xfe,7); +cpa(fetch(pc)); +pc++; +endinstr; + +instr(0xff,11); +push2(pc); +pc=56; +endinstr; +