wineps: Add BiDi support in EMR_EXTTEXTOUTW record.

This commit is contained in:
Piotr Caban 2023-04-18 20:15:28 +02:00 committed by Alexandre Julliard
parent 2df476c11f
commit 0d95b82182
4 changed files with 1320 additions and 1 deletions

View file

@ -45,6 +45,7 @@ C_SRCS = \
data/ZapfChancery_MediumItalic.c \
data/ZapfDingbats.c \
data/agl.c \
direction.c \
download.c \
driver.c \
encode.c \

717
dlls/wineps.drv/direction.c Normal file
View file

@ -0,0 +1,717 @@
/* Unicode BiDi direction table */
/* Automatically generated; DO NOT EDIT!! */
#include "windef.h"
const unsigned short DECLSPEC_HIDDEN bidi_direction_table[5631] =
{
/* level 1 offsets */
0x0110, 0x0120, 0x0130, 0x0140, 0x0144, 0x0152, 0x0152, 0x0152,
0x0152, 0x0152, 0x015e, 0x0152, 0x0152, 0x0152, 0x0152, 0x016a,
0x017a, 0x018a, 0x0152, 0x019a, 0x0152, 0x0152, 0x01a0, 0x0152,
0x0152, 0x0152, 0x0152, 0x01b0, 0x01bd, 0x01cd, 0x01dd, 0x01ed,
0x0152, 0x0152, 0x0152, 0x0152, 0x0152, 0x0152, 0x0152, 0x0152,
0x0152, 0x0152, 0x0152, 0x0152, 0x0152, 0x0152, 0x0152, 0x0152,
0x0152, 0x0152, 0x0152, 0x0152, 0x0152, 0x0152, 0x0152, 0x0152,
0x0152, 0x0152, 0x0152, 0x0152, 0x0152, 0x0152, 0x0152, 0x0152,
0x0152, 0x0152, 0x0152, 0x0152, 0x0152, 0x0152, 0x0152, 0x0152,
0x0152, 0x0152, 0x0152, 0x0152, 0x0152, 0x0152, 0x0152, 0x0152,
0x0152, 0x0152, 0x0152, 0x0152, 0x0152, 0x0152, 0x0152, 0x0152,
0x0152, 0x0152, 0x0152, 0x0152, 0x0152, 0x0152, 0x0152, 0x0152,
0x0152, 0x0152, 0x0152, 0x0152, 0x0152, 0x0152, 0x0152, 0x0152,
0x0152, 0x0152, 0x0152, 0x0152, 0x0152, 0x0152, 0x0152, 0x0152,
0x0152, 0x0152, 0x0152, 0x0152, 0x0152, 0x0152, 0x0152, 0x0152,
0x0152, 0x0152, 0x0152, 0x0152, 0x0152, 0x0152, 0x0152, 0x0152,
0x0152, 0x0152, 0x0152, 0x0152, 0x0152, 0x0152, 0x0152, 0x0152,
0x0152, 0x0152, 0x0152, 0x0152, 0x0152, 0x0152, 0x0152, 0x0152,
0x0152, 0x0152, 0x0152, 0x0152, 0x0152, 0x0152, 0x0152, 0x0152,
0x0152, 0x0152, 0x0152, 0x0152, 0x0152, 0x0152, 0x0152, 0x0152,
0x0152, 0x0152, 0x0152, 0x0152, 0x0152, 0x0152, 0x0152, 0x0152,
0x0152, 0x0152, 0x0152, 0x0152, 0x0152, 0x0152, 0x0152, 0x0152,
0x0152, 0x0152, 0x0152, 0x0152, 0x0152, 0x0152, 0x0152, 0x0152,
0x0152, 0x0152, 0x0152, 0x0152, 0x0152, 0x0152, 0x0152, 0x0152,
0x0152, 0x0152, 0x0152, 0x0152, 0x0152, 0x0152, 0x0152, 0x0152,
0x0152, 0x0152, 0x0152, 0x0152, 0x0152, 0x0152, 0x0152, 0x0152,
0x0152, 0x0152, 0x0152, 0x0152, 0x0152, 0x0152, 0x0152, 0x0152,
0x0152, 0x0152, 0x0152, 0x0152, 0x0152, 0x0152, 0x0152, 0x0152,
0x01fd, 0x0152, 0x0152, 0x0152, 0x0152, 0x0152, 0x0152, 0x0152,
0x0152, 0x0152, 0x0152, 0x0152, 0x0152, 0x0152, 0x0152, 0x0152,
0x0152, 0x0152, 0x0152, 0x0152, 0x0152, 0x0152, 0x0152, 0x0152,
0x0152, 0x0152, 0x0152, 0x0152, 0x0152, 0x0152, 0x0152, 0x0152,
0x0152, 0x0152, 0x0152, 0x0152, 0x0152, 0x0152, 0x0152, 0x0152,
0x0152, 0x0152, 0x0152, 0x0152, 0x0152, 0x0152, 0x0152, 0x0152,
/* level 2 offsets */
0x020d, 0x021d, 0x0222, 0x0232, 0x0242, 0x024b, 0x025b, 0x026b,
0x027b, 0x028b, 0x029b, 0x02ab, 0x02bb, 0x02cb, 0x02d9, 0x02e8,
0x02f6, 0x021d, 0x021d, 0x0301, 0x0311, 0x021d, 0x0319, 0x0328,
0x0338, 0x0346, 0x0356, 0x0366, 0x0376, 0x0386, 0x021d, 0x0396,
0x03a6, 0x03b6, 0x03c5, 0x03d2, 0x03e0, 0x03ef, 0x03f5, 0x03ef,
0x021d, 0x03ef, 0x03ef, 0x0400, 0x0410, 0x0420, 0x0430, 0x0440,
0x0450, 0x0460, 0x046f, 0x047c, 0x021d, 0x021d, 0x021d, 0x021d,
0x021d, 0x021d, 0x021d, 0x021d, 0x021d, 0x021d, 0x021d, 0x021d,
0x021d, 0x048c, 0x021d, 0x021d, 0x021d, 0x021d, 0x021d, 0x021d,
0x021d, 0x021d, 0x021d, 0x021d, 0x021d, 0x021d, 0x021d, 0x021d,
0x021d, 0x021d, 0x049c, 0x021d, 0x04ac, 0x04bc, 0x04cc, 0x04dc,
0x04eb, 0x04fb, 0x021d, 0x021d, 0x021d, 0x021d, 0x021d, 0x021d,
0x021d, 0x021d, 0x021d, 0x021d, 0x021d, 0x050a, 0x0518, 0x0525,
0x0535, 0x0545, 0x021d, 0x0555, 0x0565, 0x0575, 0x021d, 0x021d,
0x021d, 0x021d, 0x0585, 0x0595, 0x05a5, 0x05b5, 0x05c5, 0x05d5,
0x05df, 0x05ef, 0x05ff, 0x060f, 0x061d, 0x062d, 0x063a, 0x0647,
0x0655, 0x0664, 0x0672, 0x067f, 0x068f, 0x021d, 0x069c, 0x06a9,
0x06b3, 0x06c3, 0x021d, 0x021d, 0x021d, 0x021d, 0x06d3, 0x021d,
0x021d, 0x021d, 0x021d, 0x021d, 0x021d, 0x021d, 0x021d, 0x021d,
0x021d, 0x021d, 0x06d9, 0x06e9, 0x021d, 0x021d, 0x021d, 0x06f5,
0x021d, 0x021d, 0x021d, 0x021d, 0x021d, 0x021d, 0x021d, 0x021d,
0x021d, 0x021d, 0x021d, 0x021d, 0x0704, 0x021d, 0x021d, 0x021d,
0x021d, 0x021d, 0x021d, 0x021d, 0x021d, 0x021d, 0x021d, 0x021d,
0x021d, 0x021d, 0x021d, 0x021d, 0x0714, 0x021d, 0x071e, 0x072e,
0x073e, 0x021d, 0x021d, 0x0744, 0x0753, 0x021d, 0x021d, 0x0763,
0x021d, 0x021d, 0x021d, 0x021d, 0x021d, 0x0773, 0x06e9, 0x077c,
0x021d, 0x078c, 0x021d, 0x021d, 0x021d, 0x079c, 0x07ac, 0x021d,
0x021d, 0x07b5, 0x07c5, 0x07d5, 0x021d, 0x07e5, 0x07f5, 0x0800,
0x03ef, 0x03ef, 0x03ef, 0x0810, 0x0820, 0x0830, 0x03ef, 0x0840,
0x0850, 0x021d, 0x021d, 0x021d, 0x021d, 0x0860, 0x0870, 0x021d,
0x021d, 0x021d, 0x021d, 0x021d, 0x021d, 0x021d, 0x021d, 0x021d,
0x021d, 0x021d, 0x021d, 0x021d, 0x021d,
/* level 3 offsets */
0x0880, 0x088e, 0x089e, 0x08ae, 0x08bd, 0x08c2, 0x08bd, 0x08d2,
0x08e1, 0x08e7, 0x08f7, 0x0907, 0x0917, 0x0920, 0x0917, 0x0920,
0x0917, 0x0917, 0x0917, 0x0917, 0x0917, 0x0917, 0x0917, 0x0917,
0x0917, 0x0917, 0x0917, 0x0917, 0x0917, 0x0917, 0x0917, 0x0917,
0x0928, 0x0936, 0x0936, 0x0946, 0x0955, 0x0965, 0x0965, 0x0965,
0x0965, 0x0965, 0x0965, 0x0965, 0x0975, 0x0984, 0x0917, 0x0917,
0x0917, 0x0917, 0x0917, 0x0917, 0x0921, 0x0917, 0x0917, 0x0917,
0x0917, 0x0917, 0x0917, 0x0917, 0x0917, 0x0991, 0x0917, 0x0917,
0x0917, 0x0917, 0x0917, 0x0917, 0x0917, 0x0917, 0x099b, 0x09ab,
0x0965, 0x09ad, 0x09bb, 0x09cb, 0x09d0, 0x09df, 0x09ef, 0x09ff,
0x0a0a, 0x0a0a, 0x0a0f, 0x0965, 0x0a1f, 0x0a09, 0x0a0a, 0x0a0a,
0x0a0a, 0x0a0a, 0x0a0a, 0x0a2c, 0x0a3b, 0x0a4b, 0x0a55, 0x0a64,
0x0a0a, 0x0965, 0x0a74, 0x0a0a, 0x0a0a, 0x0a0a, 0x0a0a, 0x0a0a,
0x0a6e, 0x0a84, 0x09cb, 0x09cb, 0x0a94, 0x0aa0, 0x09cb, 0x0aae,
0x0aba, 0x09cc, 0x09cb, 0x0aca, 0x0ada, 0x0a0a, 0x0aea, 0x0afa,
0x0a0a, 0x0a0a, 0x0a6a, 0x0965, 0x0b08, 0x0965, 0x0b15, 0x0917,
0x0917, 0x0b1b, 0x0b2a, 0x0993, 0x0b38, 0x0917, 0x0b47, 0x0917,
0x0917, 0x0b3c, 0x0b56, 0x0917, 0x0b38, 0x0b64, 0x0b73, 0x0917,
0x0917, 0x0b3c, 0x0b82, 0x0b47, 0x0917, 0x0b8e, 0x0b73, 0x0917,
0x0917, 0x0b3c, 0x0b9d, 0x0917, 0x0b38, 0x0bac, 0x0b47, 0x0917,
0x0917, 0x0bbc, 0x0b56, 0x0bcc, 0x0b38, 0x0917, 0x0b46, 0x0917,
0x0917, 0x0917, 0x0b3b, 0x0917, 0x0917, 0x0bd9, 0x0be9, 0x0917,
0x0917, 0x0bee, 0x0bfd, 0x0bcc, 0x0b38, 0x0c0b, 0x0b47, 0x0917,
0x0917, 0x0b3c, 0x0b77, 0x0917, 0x0b38, 0x0917, 0x0c1b, 0x0917,
0x0917, 0x0b78, 0x0b56, 0x0917, 0x0b38, 0x0917, 0x0b47, 0x0917,
0x0917, 0x0917, 0x0b3e, 0x0c29, 0x0917, 0x0917, 0x0917, 0x0c38,
0x0c48, 0x0917, 0x0917, 0x0917, 0x0917, 0x0917, 0x0917, 0x0c57,
0x098c, 0x0917, 0x0917, 0x0917, 0x0c64, 0x0917, 0x0c6f, 0x0917,
0x0917, 0x0917, 0x0c7e, 0x0c88, 0x0c95, 0x0965, 0x0968, 0x0b42,
0x0917, 0x0917, 0x0917, 0x0b4a, 0x0ca4, 0x0917, 0x0b7b, 0x0cb2,
0x0cc1, 0x0ccf, 0x0cdd, 0x0917, 0x0917, 0x0917, 0x0917, 0x0917,
0x0917, 0x0b4a, 0x0917, 0x0917, 0x0917, 0x0ced, 0x0917, 0x0917,
0x0917, 0x0917, 0x0917, 0x0917, 0x08bd, 0x0917, 0x0917, 0x0917,
0x0917, 0x0917, 0x0917, 0x0917, 0x0917, 0x0917, 0x0917, 0x0917,
0x0917, 0x0917, 0x0917, 0x0917, 0x0cfd, 0x0d02, 0x0917, 0x0917,
0x0917, 0x0917, 0x0917, 0x0917, 0x0d10, 0x0917, 0x0b38, 0x0917,
0x0b38, 0x0917, 0x0b38, 0x0917, 0x0917, 0x0917, 0x0d1c, 0x0c33,
0x0d26, 0x0917, 0x0ced, 0x0d36, 0x0917, 0x0917, 0x0917, 0x0917,
0x0917, 0x0917, 0x0917, 0x0bcc, 0x0917, 0x0b3f, 0x0917, 0x0917,
0x0917, 0x0917, 0x0917, 0x0d45, 0x0d53, 0x0d63, 0x0917, 0x0917,
0x0917, 0x0917, 0x0917, 0x0917, 0x0917, 0x0917, 0x08bf, 0x0955,
0x0955, 0x0917, 0x0d6c, 0x0917, 0x0917, 0x0917, 0x0d78, 0x0d86,
0x0d93, 0x0917, 0x0917, 0x0917, 0x0965, 0x0966, 0x0917, 0x0917,
0x0917, 0x0b14, 0x0917, 0x0917, 0x0da3, 0x0b46, 0x0917, 0x0db0,
0x0b14, 0x0c1b, 0x0917, 0x0dc0, 0x0917, 0x0917, 0x0917, 0x0dce,
0x0c1b, 0x0917, 0x0917, 0x0b4b, 0x0ddd, 0x0917, 0x0917, 0x0917,
0x0917, 0x0917, 0x0917, 0x0917, 0x0917, 0x0917, 0x0ded, 0x0dfc,
0x0e05, 0x0917, 0x0917, 0x0917, 0x0917, 0x0917, 0x0917, 0x0917,
0x0917, 0x0917, 0x0917, 0x0917, 0x0917, 0x0965, 0x0965, 0x0965,
0x0965, 0x0917, 0x0917, 0x0917, 0x0917, 0x0917, 0x0917, 0x0917,
0x0917, 0x0917, 0x0917, 0x0917, 0x0e0f, 0x08d0, 0x08c0, 0x08c0,
0x0d00, 0x0e1f, 0x0955, 0x0e2f, 0x0e3f, 0x0e4b, 0x0e50, 0x0e60,
0x0e70, 0x0e80, 0x0917, 0x0e90, 0x0e90, 0x0e9f, 0x0965, 0x0965,
0x0cb2, 0x0eaf, 0x0ebb, 0x0ec9, 0x0ed8, 0x0ee8, 0x0955, 0x0917,
0x0917, 0x0ef6, 0x0955, 0x0955, 0x0955, 0x0955, 0x0955, 0x0955,
0x0955, 0x0f06, 0x0955, 0x0955, 0x0955, 0x0955, 0x0955, 0x0955,
0x0955, 0x0955, 0x0955, 0x0955, 0x0955, 0x0955, 0x0955, 0x0955,
0x0f10, 0x0917, 0x0917, 0x0917, 0x08c2, 0x0955, 0x094f, 0x0955,
0x0955, 0x0955, 0x0955, 0x0955, 0x0955, 0x0f0f, 0x0917, 0x093b,
0x0917, 0x0955, 0x0955, 0x0f20, 0x0f28, 0x0917, 0x0917, 0x0917,
0x0917, 0x0f16, 0x0955, 0x0955, 0x0955, 0x0955, 0x0955, 0x0955,
0x0955, 0x0955, 0x0955, 0x0955, 0x0955, 0x0955, 0x0955, 0x0955,
0x0955, 0x0955, 0x0f38, 0x0955, 0x0955, 0x0955, 0x0955, 0x0955,
0x0955, 0x0955, 0x0f45, 0x0955, 0x094e, 0x0955, 0x0955, 0x0955,
0x0955, 0x0955, 0x0955, 0x0917, 0x0917, 0x0917, 0x0917, 0x0917,
0x0917, 0x0917, 0x0917, 0x0917, 0x0917, 0x0917, 0x0917, 0x0917,
0x0917, 0x0f55, 0x0f64, 0x0917, 0x0917, 0x0917, 0x0917, 0x0917,
0x0917, 0x0917, 0x0cb3, 0x0917, 0x0917, 0x0917, 0x0917, 0x0917,
0x0917, 0x0965, 0x0965, 0x0955, 0x0955, 0x0955, 0x0955, 0x0955,
0x0938, 0x0917, 0x0917, 0x0955, 0x0f6d, 0x0955, 0x0955, 0x0955,
0x0955, 0x0955, 0x08ba, 0x0955, 0x0955, 0x0955, 0x0955, 0x0955,
0x0955, 0x0955, 0x0955, 0x0955, 0x0955, 0x0955, 0x0955, 0x0955,
0x0f10, 0x0917, 0x093a, 0x0f7d, 0x0955, 0x0f8c, 0x0f9c, 0x0917,
0x0917, 0x0917, 0x0917, 0x0917, 0x0fac, 0x08bd, 0x0917, 0x0917,
0x0917, 0x0917, 0x091c, 0x0917, 0x0917, 0x0917, 0x0917, 0x0917,
0x0917, 0x0917, 0x0917, 0x0917, 0x0917, 0x0917, 0x0917, 0x0955,
0x0955, 0x08ba, 0x0917, 0x0d00, 0x0917, 0x0917, 0x0917, 0x0955,
0x0917, 0x0fb9, 0x0917, 0x0917, 0x0917, 0x0954, 0x08c1, 0x0917,
0x0917, 0x0917, 0x0917, 0x0917, 0x0917, 0x0917, 0x0fc8, 0x0917,
0x0917, 0x0917, 0x0917, 0x0917, 0x08bf, 0x0917, 0x08be, 0x0917,
0x0917, 0x0917, 0x0917, 0x0917, 0x0917, 0x0917, 0x0917, 0x0917,
0x0917, 0x0917, 0x0917, 0x0955, 0x0955, 0x0955, 0x0955, 0x0917,
0x0917, 0x0917, 0x0917, 0x0917, 0x0917, 0x0917, 0x0917, 0x0917,
0x0955, 0x0955, 0x0955, 0x0f0f, 0x0917, 0x0917, 0x0917, 0x08c0,
0x0917, 0x0917, 0x0917, 0x0917, 0x0917, 0x0cb3, 0x0fd8, 0x0917,
0x0b49, 0x0917, 0x0917, 0x0917, 0x0917, 0x0917, 0x0c1b, 0x0955,
0x0955, 0x08bc, 0x0917, 0x0917, 0x0917, 0x0917, 0x0917, 0x091f,
0x0917, 0x0917, 0x0917, 0x0917, 0x0917, 0x0917, 0x0917, 0x0fe8,
0x0917, 0x0ff4, 0x1001, 0x0917, 0x0917, 0x0917, 0x0eee, 0x0917,
0x0917, 0x0917, 0x0917, 0x100d, 0x0917, 0x0965, 0x0b16, 0x0917,
0x0917, 0x1017, 0x0917, 0x1025, 0x0c1b, 0x0917, 0x0917, 0x0b15,
0x0917, 0x0917, 0x1035, 0x0917, 0x0917, 0x0b43, 0x0917, 0x0917,
0x1043, 0x0cac, 0x1052, 0x0917, 0x0917, 0x0b3c, 0x0917, 0x0917,
0x0917, 0x1062, 0x0b47, 0x0917, 0x0b77, 0x0b42, 0x0917, 0x0917,
0x0917, 0x0917, 0x0917, 0x0917, 0x0ed8, 0x0917, 0x0917, 0x0917,
0x0917, 0x0917, 0x0917, 0x0917, 0x1072, 0x0917, 0x1080, 0x108f,
0x1099, 0x10a9, 0x0a0a, 0x0a0a, 0x0a0a, 0x0a0a, 0x0a0a, 0x0a0a,
0x0a0a, 0x10b9, 0x0ae7, 0x0a0a, 0x0a0a, 0x0a0a, 0x0a0a, 0x0a0a,
0x0a0a, 0x0a0a, 0x0a0a, 0x0a0a, 0x0a0a, 0x0a0a, 0x0a0a, 0x0a0a,
0x0a0a, 0x0a0a, 0x0a0a, 0x10c9, 0x0955, 0x0a0a, 0x0a0a, 0x0a0a,
0x0a0a, 0x0ae8, 0x0a0a, 0x0a0a, 0x10d9, 0x0917, 0x0917, 0x10e9,
0x0965, 0x0ced, 0x0965, 0x0955, 0x0955, 0x10f9, 0x1109, 0x1119,
0x0a0a, 0x0a0a, 0x0a0a, 0x0a0a, 0x0a0a, 0x0a0a, 0x0a0a, 0x111f,
0x112f, 0x08ae, 0x08bd, 0x08c2, 0x08bd, 0x08c2, 0x0f10, 0x0917,
0x0917, 0x0917, 0x0917, 0x0917, 0x0917, 0x0917, 0x113f, 0x08c4,
0x114e, 0x0917, 0x0917, 0x0917, 0x0955, 0x0955, 0x0955, 0x0955,
0x0939, 0x0939, 0x08bd, 0x0917, 0x0917, 0x0917, 0x0917, 0x0cdd,
0x0917, 0x0917, 0x0917, 0x0917, 0x0917, 0x0917, 0x0917, 0x0917,
0x0917, 0x0917, 0x0917, 0x0917, 0x0917, 0x0917, 0x115e, 0x0f28,
0x0917, 0x0917, 0x0917, 0x0917, 0x0917, 0x0917, 0x0917, 0x116e,
0x0917, 0x0917, 0x0917, 0x0917, 0x0917, 0x0917, 0x0917, 0x0917,
0x117e, 0x09cb, 0x09cb, 0x1188, 0x09cb, 0x1197, 0x09cb, 0x09cb,
0x09cb, 0x09cc, 0x09c4, 0x0917, 0x0917, 0x0917, 0x09cb, 0x11a4,
0x09cb, 0x11af, 0x09cb, 0x11bf, 0x0917, 0x0917, 0x0917, 0x0917,
0x09cb, 0x09cb, 0x09cb, 0x09d3, 0x09cb, 0x09c9, 0x09cb, 0x09cb,
0x11ce, 0x11de, 0x09cb, 0x11e8, 0x11f8, 0x11f8, 0x09cb, 0x09cb,
0x09cb, 0x09cb, 0x0917, 0x0917, 0x09cb, 0x09cb, 0x1208, 0x1213,
0x09cb, 0x09cb, 0x09cb, 0x1223, 0x09cb, 0x1233, 0x09cb, 0x1240,
0x09cb, 0x124e, 0x0a8b, 0x0917, 0x0917, 0x0917, 0x0917, 0x0917,
0x09cb, 0x09cb, 0x09cb, 0x09cb, 0x11f8, 0x0917, 0x0917, 0x0917,
0x09cb, 0x09cb, 0x09cb, 0x1258, 0x09cb, 0x09cb, 0x09cb, 0x1268,
0x0a0a, 0x0a0a, 0x1278, 0x1288, 0x0917, 0x0917, 0x0917, 0x0917,
0x0917, 0x0917, 0x0917, 0x0917, 0x0917, 0x0917, 0x0917, 0x0917,
0x1298, 0x1299, 0x09cb, 0x09cb, 0x12a9, 0x12b9, 0x0917, 0x0917,
0x0917, 0x0b4a, 0x09cb, 0x09cb, 0x12c9, 0x0a0a, 0x0a6e, 0x12d9,
0x0917, 0x09cb, 0x12e9, 0x0917, 0x0917, 0x09cb, 0x09cf, 0x0917,
0x09cb, 0x1213, 0x0b47, 0x0917, 0x0917, 0x1015, 0x0994, 0x0936,
0x0f10, 0x12f9, 0x0c1b, 0x0917, 0x0917, 0x1305, 0x0b46, 0x0917,
0x0917, 0x0917, 0x0b15, 0x0917, 0x1310, 0x0b13, 0x0917, 0x0917,
0x0917, 0x0b45, 0x0c1b, 0x0917, 0x0917, 0x1026, 0x12ff, 0x0917,
0x0917, 0x0917, 0x0cb3, 0x131e, 0x0b47, 0x0917, 0x0917, 0x0917,
0x0917, 0x0917, 0x0917, 0x0917, 0x0917, 0x0cb3, 0x101a, 0x0917,
0x0c1b, 0x0917, 0x0917, 0x0b78, 0x0cb2, 0x0917, 0x098e, 0x0b13,
0x0917, 0x0917, 0x0917, 0x0917, 0x0917, 0x0917, 0x0917, 0x0917,
0x1015, 0x0c29, 0x132d, 0x0917, 0x0917, 0x0917, 0x0917, 0x0917,
0x133c, 0x0b72, 0x0917, 0x0917, 0x0917, 0x0917, 0x0917, 0x0917,
0x0917, 0x0917, 0x0917, 0x0917, 0x0917, 0x1349, 0x0cb2, 0x0b77,
0x0917, 0x0917, 0x0917, 0x1359, 0x0cb2, 0x0917, 0x0939, 0x0917,
0x0917, 0x0917, 0x0b1a, 0x1368, 0x0917, 0x0917, 0x0917, 0x0917,
0x0b4a, 0x1376, 0x0917, 0x0917, 0x0917, 0x0917, 0x0917, 0x0917,
0x0917, 0x0917, 0x0917, 0x0917, 0x0917, 0x0917, 0x0917, 0x0cb3,
0x0c85, 0x0917, 0x0917, 0x0917, 0x0917, 0x0917, 0x0917, 0x0917,
0x0917, 0x0917, 0x0917, 0x0917, 0x0917, 0x1382, 0x0b45, 0x0917,
0x0917, 0x0917, 0x0917, 0x0917, 0x0917, 0x0917, 0x0917, 0x1304,
0x0cb2, 0x0917, 0x1391, 0x0917, 0x0917, 0x139e, 0x0b41, 0x13ad,
0x0917, 0x0917, 0x1013, 0x13bd, 0x0917, 0x0917, 0x0917, 0x0917,
0x0917, 0x0917, 0x13cd, 0x0917, 0x0917, 0x0917, 0x0917, 0x0917,
0x0c7d, 0x13dd, 0x13ec, 0x0917, 0x0917, 0x0917, 0x0917, 0x13fb,
0x1368, 0x0917, 0x0917, 0x0917, 0x0917, 0x140a, 0x0917, 0x0917,
0x0917, 0x0917, 0x0917, 0x0917, 0x0917, 0x0917, 0x0917, 0x0917,
0x0917, 0x0917, 0x0917, 0x0917, 0x0917, 0x0e0a, 0x0c1b, 0x0917,
0x0917, 0x116e, 0x140f, 0x0917, 0x0917, 0x0917, 0x0917, 0x0917,
0x0917, 0x0917, 0x0917, 0x141a, 0x1429, 0x08bc, 0x0917, 0x0917,
0x0917, 0x0917, 0x1439, 0x0995, 0x0917, 0x0917, 0x0917, 0x0917,
0x0917, 0x0917, 0x0917, 0x0917, 0x0917, 0x0917, 0x0917, 0x0917,
0x0917, 0x0917, 0x0917, 0x0b13, 0x0917, 0x0917, 0x0917, 0x0994,
0x0917, 0x0917, 0x0917, 0x0917, 0x0917, 0x0917, 0x0917, 0x0917,
0x0917, 0x0917, 0x0917, 0x0917, 0x0cb3, 0x0917, 0x0917, 0x0917,
0x0cb3, 0x0b15, 0x0917, 0x0917, 0x0917, 0x0917, 0x1449, 0x0917,
0x0917, 0x0917, 0x0917, 0x0917, 0x0917, 0x0917, 0x0917, 0x0917,
0x0b76, 0x1459, 0x0917, 0x0917, 0x0917, 0x0917, 0x0917, 0x0965,
0x0965, 0x0967, 0x0965, 0x0994, 0x0917, 0x0917, 0x0917, 0x0917,
0x0917, 0x0917, 0x0917, 0x0917, 0x0917, 0x0917, 0x0917, 0x1462,
0x146f, 0x147c, 0x0917, 0x0b4d, 0x0917, 0x0917, 0x0917, 0x0928,
0x0917, 0x0955, 0x0955, 0x0955, 0x0955, 0x148c, 0x0917, 0x0917,
0x0917, 0x0917, 0x0917, 0x0917, 0x0917, 0x0917, 0x0917, 0x0917,
0x0917, 0x0955, 0x0955, 0x0955, 0x0955, 0x0955, 0x0f0f, 0x0917,
0x0917, 0x0917, 0x0917, 0x0917, 0x0917, 0x0917, 0x0917, 0x0917,
0x0917, 0x0917, 0x0917, 0x0917, 0x091c, 0x0917, 0x0917, 0x1497,
0x0917, 0x0917, 0x08be, 0x0917, 0x0917, 0x0917, 0x091e, 0x0917,
0x0917, 0x0917, 0x1499, 0x14a7, 0x14a7, 0x14a7, 0x0965, 0x0965,
0x0965, 0x14b7, 0x0965, 0x0965, 0x0968, 0x0b43, 0x0b44, 0x0db0,
0x09ab, 0x0917, 0x0917, 0x0917, 0x0917, 0x0917, 0x14c2, 0x14ca,
0x14d8, 0x0917, 0x0917, 0x0917, 0x0917, 0x0917, 0x0cb3, 0x0917,
0x0917, 0x0917, 0x0917, 0x0917, 0x0917, 0x0917, 0x0917, 0x0917,
0x0917, 0x132d, 0x0917, 0x0917, 0x0917, 0x0b4b, 0x14e3, 0x0917,
0x0917, 0x0917, 0x0917, 0x0917, 0x0917, 0x0917, 0x0917, 0x0917,
0x0917, 0x0917, 0x0917, 0x0917, 0x0917, 0x0b4b, 0x0917, 0x09cb,
0x09cb, 0x09cb, 0x09cb, 0x09cb, 0x09cb, 0x09cb, 0x09cb, 0x09cb,
0x09cb, 0x09cb, 0x09cb, 0x14f3, 0x0994, 0x0917, 0x0917, 0x09cb,
0x09cb, 0x09cb, 0x09cb, 0x14ff, 0x09d1, 0x0917, 0x0917, 0x0917,
0x0917, 0x0917, 0x0917, 0x0917, 0x0917, 0x0917, 0x0917, 0x0ae9,
0x0a0a, 0x0a0a, 0x0a0a, 0x150f, 0x0917, 0x0917, 0x0917, 0x0917,
0x0ae9, 0x0a0a, 0x0a0a, 0x151f, 0x0917, 0x0917, 0x0917, 0x0917,
0x0917, 0x0917, 0x0917, 0x0917, 0x0917, 0x0917, 0x0917, 0x0917,
0x111a, 0x0a0a, 0x152e, 0x153b, 0x1549, 0x1559, 0x1567, 0x156f,
0x157f, 0x158a, 0x1599, 0x158a, 0x0917, 0x0917, 0x0917, 0x08bc,
0x0955, 0x0955, 0x093a, 0x0955, 0x0955, 0x0955, 0x0955, 0x0955,
0x0955, 0x08ba, 0x15a9, 0x0954, 0x0954, 0x0954, 0x0955, 0x0f10,
0x15b9, 0x0917, 0x08be, 0x0917, 0x0917, 0x0917, 0x0f16, 0x0917,
0x0917, 0x0917, 0x091a, 0x0917, 0x0917, 0x0917, 0x0917, 0x0917,
0x0917, 0x0f10, 0x0917, 0x0917, 0x0917, 0x0917, 0x0917, 0x0917,
0x0917, 0x0917, 0x0917, 0x0955, 0x0955, 0x0955, 0x0955, 0x0955,
0x0955, 0x0955, 0x0955, 0x0955, 0x0955, 0x0955, 0x0955, 0x0955,
0x15c4, 0x0939, 0x0939, 0x0955, 0x0955, 0x0955, 0x0955, 0x0955,
0x0955, 0x0955, 0x15c5, 0x0955, 0x0955, 0x0955, 0x0955, 0x0955,
0x0ced, 0x093a, 0x08bd, 0x093a, 0x0955, 0x0955, 0x0955, 0x0f0e,
0x0ced, 0x0955, 0x0955, 0x0f0e, 0x0955, 0x0938, 0x08bc, 0x0917,
0x0917, 0x0917, 0x0917, 0x0955, 0x0955, 0x0955, 0x0955, 0x0955,
0x08ba, 0x0938, 0x0939, 0x0f0d, 0x0955, 0x0955, 0x15d0, 0x15df,
0x093a, 0x0f0d, 0x0f0d, 0x0955, 0x0955, 0x0955, 0x0955, 0x0955,
0x0955, 0x0955, 0x0955, 0x0955, 0x0951, 0x0955, 0x0955, 0x093b,
0x0917, 0x0917, 0x1164, 0x15ef, 0x0917, 0x08e7, 0x08e7, 0x08e7,
0x08e7, 0x08e7, 0x08e7, 0x0917, 0x0917, 0x0917, 0x0917, 0x0917,
0x0917, 0x0917, 0x0917, 0x0965, 0x0965, 0x0965, 0x0965, 0x0965,
0x0965, 0x0965, 0x0965, 0x0965, 0x0965, 0x0965, 0x0965, 0x0965,
0x0965, 0x0965, 0x0917,
/* values */
0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a,
0x000a, 0x000b, 0x000d, 0x000b, 0x000c, 0x000d, 0x000a, 0x000a,
0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a,
0x000a, 0x000a, 0x000d, 0x000d, 0x000d, 0x000b, 0x000c, 0x0000,
0x0000, 0x0009, 0x0009, 0x0009, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0008, 0x0007, 0x0008, 0x0007, 0x0007, 0x0004, 0x0004,
0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
0x0007, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0001,
0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0000, 0x0000, 0x0000,
0x0000, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000d, 0x000a,
0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a,
0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x0007,
0x0000, 0x0009, 0x0009, 0x0009, 0x0009, 0x0000, 0x0000, 0x0000,
0x0000, 0x0001, 0x0000, 0x0000, 0x000a, 0x0000, 0x0000, 0x0009,
0x0009, 0x0004, 0x0004, 0x0000, 0x0001, 0x0000, 0x0000, 0x0000,
0x0004, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001,
0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0000,
0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
0x0001, 0x0000, 0x0000, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0001,
0x0001, 0x0001, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0006, 0x0006, 0x0006,
0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006,
0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0001, 0x0001, 0x0001,
0x0001, 0x0000, 0x0000, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
0x0001, 0x0001, 0x0001, 0x0000, 0x0001, 0x0001, 0x0001, 0x0001,
0x0000, 0x0000, 0x0001, 0x0000, 0x0001, 0x0001, 0x0001, 0x0001,
0x0001, 0x0001, 0x0001, 0x0001, 0x0006, 0x0006, 0x0006, 0x0006,
0x0006, 0x0006, 0x0006, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0000, 0x0001, 0x0001,
0x0000, 0x0000, 0x0009, 0x0001, 0x0006, 0x0006, 0x0006, 0x0006,
0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006,
0x0006, 0x0006, 0x0006, 0x0002, 0x0006, 0x0006, 0x0002, 0x0006,
0x0006, 0x0002, 0x0006, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
0x0001, 0x0001, 0x0001, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002,
0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002,
0x0002, 0x0002, 0x0002, 0x0001, 0x0001, 0x0001, 0x0001, 0x0002,
0x0002, 0x0002, 0x0002, 0x0002, 0x0001, 0x0001, 0x0001, 0x0001,
0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0003,
0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0000, 0x0000, 0x0005,
0x0009, 0x0009, 0x0005, 0x0007, 0x0005, 0x0000, 0x0000, 0x0006,
0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006,
0x0006, 0x0006, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005,
0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005,
0x0005, 0x0005, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0003,
0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003,
0x0003, 0x0009, 0x0003, 0x0003, 0x0005, 0x0005, 0x0005, 0x0005,
0x0005, 0x0005, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006,
0x0006, 0x0003, 0x0000, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006,
0x0005, 0x0005, 0x0006, 0x0006, 0x0000, 0x0006, 0x0006, 0x0006,
0x0006, 0x0005, 0x0005, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0005, 0x0005, 0x0005,
0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005,
0x0005, 0x0005, 0x0005, 0x0001, 0x0005, 0x0006, 0x0005, 0x0005,
0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005,
0x0005, 0x0005, 0x0005, 0x0005, 0x0006, 0x0006, 0x0006, 0x0006,
0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0001,
0x0001, 0x0005, 0x0005, 0x0005, 0x0006, 0x0005, 0x0001, 0x0001,
0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
0x0001, 0x0001, 0x0001, 0x0001, 0x0002, 0x0002, 0x0002, 0x0002,
0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0006,
0x0006, 0x0006, 0x0006, 0x0006, 0x0002, 0x0002, 0x0000, 0x0000,
0x0000, 0x0000, 0x0002, 0x0001, 0x0001, 0x0006, 0x0002, 0x0002,
0x0002, 0x0002, 0x0002, 0x0002, 0x0006, 0x0006, 0x0006, 0x0006,
0x0002, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0002, 0x0006,
0x0006, 0x0006, 0x0002, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006,
0x0001, 0x0001, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002,
0x0002, 0x0002, 0x0002, 0x0006, 0x0006, 0x0006, 0x0001, 0x0001,
0x0002, 0x0001, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005,
0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0001, 0x0001, 0x0001,
0x0001, 0x0001, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005,
0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005,
0x0005, 0x0001, 0x0003, 0x0003, 0x0001, 0x0001, 0x0001, 0x0001,
0x0001, 0x0001, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006,
0x0006, 0x0006, 0x0003, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006,
0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006,
0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0006, 0x0001, 0x0006,
0x0001, 0x0001, 0x0001, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006,
0x0006, 0x0006, 0x0006, 0x0001, 0x0001, 0x0001, 0x0001, 0x0006,
0x0001, 0x0001, 0x0006, 0x0006, 0x0001, 0x0001, 0x0001, 0x0001,
0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
0x0006, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0006,
0x0006, 0x0006, 0x0006, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
0x0001, 0x0001, 0x0001, 0x0006, 0x0001, 0x0001, 0x0009, 0x0009,
0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0009,
0x0001, 0x0001, 0x0006, 0x0001, 0x0006, 0x0006, 0x0001, 0x0001,
0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
0x0001, 0x0001, 0x0001, 0x0006, 0x0006, 0x0001, 0x0001, 0x0001,
0x0001, 0x0006, 0x0006, 0x0001, 0x0001, 0x0006, 0x0006, 0x0006,
0x0001, 0x0001, 0x0001, 0x0006, 0x0001, 0x0001, 0x0001, 0x0001,
0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0006, 0x0006,
0x0006, 0x0006, 0x0006, 0x0001, 0x0006, 0x0006, 0x0001, 0x0001,
0x0001, 0x0001, 0x0006, 0x0001, 0x0001, 0x0009, 0x0001, 0x0001,
0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0006, 0x0006,
0x0006, 0x0006, 0x0006, 0x0006, 0x0001, 0x0001, 0x0001, 0x0001,
0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
0x0006, 0x0001, 0x0001, 0x0006, 0x0001, 0x0001, 0x0001, 0x0001,
0x0001, 0x0006, 0x0006, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
0x0001, 0x0001, 0x0001, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0009, 0x0000, 0x0001, 0x0001, 0x0001, 0x0001,
0x0001, 0x0006, 0x0001, 0x0001, 0x0001, 0x0006, 0x0001, 0x0001,
0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
0x0001, 0x0001, 0x0006, 0x0001, 0x0006, 0x0006, 0x0001, 0x0001,
0x0001, 0x0001, 0x0001, 0x0006, 0x0006, 0x0006, 0x0001, 0x0006,
0x0006, 0x0006, 0x0006, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
0x0001, 0x0001, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0001, 0x0006, 0x0006, 0x0001, 0x0001, 0x0001,
0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
0x0001, 0x0001, 0x0001, 0x0006, 0x0006, 0x0006, 0x0001, 0x0006,
0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
0x0001, 0x0006, 0x0001, 0x0001, 0x0006, 0x0006, 0x0006, 0x0006,
0x0006, 0x0006, 0x0006, 0x0001, 0x0001, 0x0001, 0x0001, 0x0009,
0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0006,
0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0001,
0x0006, 0x0001, 0x0001, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006,
0x0006, 0x0006, 0x0006, 0x0006, 0x0001, 0x0001, 0x0001, 0x0001,
0x0001, 0x0001, 0x0001, 0x0001, 0x0006, 0x0006, 0x0001, 0x0001,
0x0001, 0x0001, 0x0001, 0x0001, 0x0006, 0x0001, 0x0006, 0x0001,
0x0006, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0001, 0x0006,
0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006,
0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0001, 0x0006, 0x0006,
0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0006, 0x0006, 0x0006,
0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0001, 0x0006, 0x0006,
0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0001, 0x0006, 0x0006,
0x0006, 0x0006, 0x0006, 0x0006, 0x0001, 0x0006, 0x0006, 0x0001,
0x0001, 0x0006, 0x0006, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
0x0001, 0x0001, 0x0006, 0x0006, 0x0006, 0x0006, 0x0001, 0x0001,
0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
0x0001, 0x0006, 0x0001, 0x0001, 0x0006, 0x0006, 0x0001, 0x0001,
0x0001, 0x0001, 0x0001, 0x0001, 0x0006, 0x0001, 0x0001, 0x0001,
0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
0x0001, 0x0001, 0x0006, 0x0001, 0x0001, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001,
0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x000c, 0x0001, 0x0001,
0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0000, 0x0000, 0x0001,
0x0001, 0x0001, 0x0006, 0x0006, 0x0006, 0x0001, 0x0001, 0x0001,
0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
0x0006, 0x0006, 0x0001, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006,
0x0006, 0x0006, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
0x0001, 0x0009, 0x0001, 0x0006, 0x0001, 0x0001, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0006, 0x0006, 0x0006, 0x000a, 0x0006, 0x0006, 0x0006,
0x0001, 0x0001, 0x0001, 0x0001, 0x0006, 0x0006, 0x0001, 0x0001,
0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0006, 0x0001, 0x0001,
0x0001, 0x0001, 0x0001, 0x0001, 0x0006, 0x0006, 0x0006, 0x0001,
0x0001, 0x0001, 0x0001, 0x0000, 0x0001, 0x0001, 0x0001, 0x0000,
0x0000, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
0x0001, 0x0001, 0x0001, 0x0006, 0x0006, 0x0001, 0x0001, 0x0006,
0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0006, 0x0001,
0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0001,
0x0006, 0x0001, 0x0001, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006,
0x0006, 0x0006, 0x0006, 0x0001, 0x0001, 0x0001, 0x0006, 0x0006,
0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006,
0x0001, 0x0001, 0x0006, 0x0001, 0x0001, 0x0001, 0x0001, 0x0006,
0x0001, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0001, 0x0006,
0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
0x0001, 0x0001, 0x0001, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006,
0x0001, 0x0001, 0x0006, 0x0006, 0x0006, 0x0006, 0x0001, 0x0001,
0x0006, 0x0006, 0x0001, 0x0006, 0x0006, 0x0006, 0x0001, 0x0001,
0x0001, 0x0001, 0x0001, 0x0001, 0x0006, 0x0001, 0x0006, 0x0006,
0x0001, 0x0001, 0x0001, 0x0006, 0x0001, 0x0006, 0x0006, 0x0006,
0x0006, 0x0001, 0x0001, 0x0006, 0x0006, 0x0001, 0x0001, 0x0001,
0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0006, 0x0006, 0x0006,
0x0001, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006,
0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0001, 0x0006, 0x0006,
0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0001, 0x0001, 0x0001,
0x0001, 0x0006, 0x0001, 0x0001, 0x0001, 0x0006, 0x0006, 0x0001,
0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
0x0001, 0x0001, 0x0001, 0x0001, 0x0000, 0x0001, 0x0000, 0x000c,
0x000c, 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, 0x000c, 0x000c,
0x000c, 0x000c, 0x000a, 0x000a, 0x000a, 0x0001, 0x0002, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x000c,
0x000d, 0x0011, 0x000f, 0x0012, 0x0010, 0x000e, 0x0007, 0x0009,
0x0009, 0x0009, 0x0009, 0x0009, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0007,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x000c,
0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x0001, 0x0013, 0x0014,
0x0015, 0x0016, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a,
0x0004, 0x0001, 0x0001, 0x0001, 0x0004, 0x0004, 0x0004, 0x0004,
0x0004, 0x0004, 0x0008, 0x0008, 0x0000, 0x0000, 0x0000, 0x0001,
0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
0x0004, 0x0004, 0x0008, 0x0008, 0x0000, 0x0000, 0x0000, 0x0001,
0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009,
0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009,
0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0000,
0x0000, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000,
0x0000, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0000,
0x0001, 0x0000, 0x0000, 0x0000, 0x0001, 0x0001, 0x0001, 0x0001,
0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000, 0x0001,
0x0000, 0x0001, 0x0000, 0x0001, 0x0001, 0x0001, 0x0001, 0x0009,
0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
0x0001, 0x0001, 0x0000, 0x0000, 0x0001, 0x0001, 0x0001, 0x0001,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0001, 0x0001,
0x0001, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0001,
0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0000,
0x0000, 0x0000, 0x0001, 0x0001, 0x0001, 0x0001, 0x0000, 0x0000,
0x0008, 0x0009, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0001,
0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
0x0004, 0x0004, 0x0004, 0x0004, 0x0001, 0x0001, 0x0001, 0x0001,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000, 0x0000, 0x0000,
0x0000, 0x0001, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0001, 0x0001,
0x0001, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0001, 0x0001, 0x0001, 0x0001, 0x0006, 0x0006, 0x0001, 0x0001,
0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x000c, 0x0000, 0x0000,
0x0000, 0x0000, 0x0001, 0x0001, 0x0001, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0001, 0x0001,
0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0006, 0x0006,
0x0006, 0x0006, 0x0001, 0x0001, 0x0000, 0x0001, 0x0001, 0x0001,
0x0001, 0x0001, 0x0000, 0x0000, 0x0001, 0x0001, 0x0001, 0x0001,
0x0001, 0x0000, 0x0000, 0x0000, 0x0001, 0x0001, 0x0001, 0x0001,
0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0006, 0x0006, 0x0000,
0x0000, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0000, 0x0000, 0x0000,
0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0000,
0x0000, 0x0000, 0x0000, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
0x0006, 0x0006, 0x0006, 0x0000, 0x0006, 0x0006, 0x0006, 0x0006,
0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0000, 0x0000,
0x0001, 0x0001, 0x0006, 0x0001, 0x0001, 0x0001, 0x0006, 0x0001,
0x0001, 0x0001, 0x0001, 0x0006, 0x0001, 0x0001, 0x0001, 0x0001,
0x0001, 0x0006, 0x0006, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000,
0x0006, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
0x0001, 0x0009, 0x0009, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
0x0001, 0x0006, 0x0006, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0006, 0x0006, 0x0006,
0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0001, 0x0001, 0x0001,
0x0001, 0x0001, 0x0001, 0x0001, 0x0006, 0x0006, 0x0006, 0x0006,
0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0001, 0x0001, 0x0001,
0x0006, 0x0001, 0x0001, 0x0006, 0x0006, 0x0006, 0x0006, 0x0001,
0x0001, 0x0006, 0x0006, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
0x0001, 0x0001, 0x0001, 0x0001, 0x0006, 0x0006, 0x0006, 0x0006,
0x0006, 0x0006, 0x0001, 0x0001, 0x0001, 0x0006, 0x0001, 0x0001,
0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0006, 0x0001,
0x0001, 0x0001, 0x0006, 0x0001, 0x0006, 0x0006, 0x0006, 0x0001,
0x0001, 0x0006, 0x0006, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
0x0006, 0x0006, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0006,
0x0001, 0x0001, 0x0006, 0x0001, 0x0001, 0x0001, 0x0001, 0x0006,
0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0002, 0x0006, 0x0002,
0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002,
0x0008, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002,
0x0001, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0001, 0x0002,
0x0001, 0x0002, 0x0002, 0x0001, 0x0002, 0x0002, 0x0001, 0x0002,
0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002,
0x0002, 0x0005, 0x0005, 0x0005, 0x0001, 0x0001, 0x0001, 0x0001,
0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
0x0001, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005,
0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0000,
0x0000, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005,
0x0005, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
0x0000, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005,
0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0000, 0x0000,
0x0000, 0x0007, 0x0000, 0x0007, 0x0001, 0x0000, 0x0007, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0009, 0x0000, 0x0000, 0x0008, 0x0008, 0x0000, 0x0000, 0x0000,
0x0001, 0x0000, 0x0009, 0x0009, 0x0000, 0x0001, 0x0001, 0x0001,
0x0001, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0001, 0x0005,
0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005,
0x0005, 0x0005, 0x0005, 0x0005, 0x0001, 0x0001, 0x000a, 0x0001,
0x0000, 0x0000, 0x0009, 0x0009, 0x0009, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0008, 0x0007, 0x0008, 0x0007, 0x0007, 0x0009,
0x0009, 0x0000, 0x0000, 0x0000, 0x0009, 0x0009, 0x0001, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000,
0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0006, 0x0004,
0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0001, 0x0001,
0x0001, 0x0001, 0x0001, 0x0001, 0x0006, 0x0006, 0x0006, 0x0006,
0x0006, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0002, 0x0002,
0x0002, 0x0002, 0x0002, 0x0002, 0x0001, 0x0001, 0x0002, 0x0001,
0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0001, 0x0002,
0x0002, 0x0001, 0x0001, 0x0001, 0x0002, 0x0001, 0x0001, 0x0002,
0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0001, 0x0002, 0x0002,
0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0001,
0x0002, 0x0002, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0002,
0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002,
0x0002, 0x0002, 0x0002, 0x0001, 0x0001, 0x0001, 0x0000, 0x0002,
0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002,
0x0002, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0002, 0x0006,
0x0006, 0x0006, 0x0001, 0x0006, 0x0006, 0x0001, 0x0001, 0x0001,
0x0001, 0x0001, 0x0006, 0x0006, 0x0006, 0x0006, 0x0002, 0x0002,
0x0002, 0x0002, 0x0001, 0x0002, 0x0002, 0x0002, 0x0001, 0x0002,
0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0001, 0x0001,
0x0006, 0x0006, 0x0006, 0x0001, 0x0001, 0x0001, 0x0001, 0x0006,
0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002,
0x0002, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0006, 0x0006, 0x0001,
0x0001, 0x0001, 0x0001, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002,
0x0002, 0x0002, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
0x0001, 0x0001, 0x0001, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002,
0x0002, 0x0001, 0x0001, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002,
0x0002, 0x0001, 0x0001, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002,
0x0002, 0x0002, 0x0002, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002,
0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0002,
0x0002, 0x0002, 0x0002, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
0x0002, 0x0002, 0x0002, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
0x0001, 0x0001, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002,
0x0005, 0x0005, 0x0005, 0x0005, 0x0006, 0x0006, 0x0006, 0x0006,
0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003,
0x0003, 0x0003, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003,
0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003,
0x0001, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002,
0x0002, 0x0002, 0x0002, 0x0001, 0x0006, 0x0006, 0x0002, 0x0001,
0x0001, 0x0002, 0x0002, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
0x0001, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002,
0x0002, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
0x0001, 0x0006, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005,
0x0005, 0x0005, 0x0005, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
0x0001, 0x0002, 0x0002, 0x0006, 0x0006, 0x0006, 0x0006, 0x0002,
0x0002, 0x0002, 0x0002, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
0x0001, 0x0006, 0x0001, 0x0001, 0x0006, 0x0006, 0x0001, 0x0001,
0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
0x0006, 0x0006, 0x0006, 0x0006, 0x0001, 0x0001, 0x0006, 0x0006,
0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0006,
0x0006, 0x0006, 0x0006, 0x0006, 0x0001, 0x0006, 0x0006, 0x0006,
0x0001, 0x0001, 0x0006, 0x0001, 0x0006, 0x0006, 0x0001, 0x0001,
0x0001, 0x0001, 0x0001, 0x0001, 0x0006, 0x0001, 0x0001, 0x0001,
0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
0x0001, 0x0001, 0x0001, 0x0006, 0x0001, 0x0001, 0x0001, 0x0006,
0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0001, 0x0006, 0x0001,
0x0001, 0x0001, 0x0001, 0x0006, 0x0006, 0x0006, 0x0006, 0x0001,
0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0006, 0x0006, 0x0001,
0x0006, 0x0001, 0x0001, 0x0001, 0x0006, 0x0006, 0x0006, 0x0006,
0x0006, 0x0006, 0x0006, 0x0006, 0x0001, 0x0001, 0x0006, 0x0001,
0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0001, 0x0006,
0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
0x0006, 0x0006, 0x0006, 0x0006, 0x0001, 0x0006, 0x0006, 0x0006,
0x0006, 0x0006, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0006, 0x0006, 0x0001,
0x0006, 0x0001, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006,
0x0001, 0x0001, 0x0006, 0x0006, 0x0001, 0x0001, 0x0001, 0x0001,
0x0001, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0001,
0x0001, 0x0006, 0x0006, 0x0006, 0x0006, 0x0001, 0x0006, 0x0006,
0x0006, 0x0006, 0x0006, 0x0006, 0x0001, 0x0001, 0x0006, 0x0006,
0x0006, 0x0001, 0x0001, 0x0001, 0x0001, 0x0006, 0x0006, 0x0006,
0x0006, 0x0006, 0x0006, 0x0006, 0x0001, 0x0006, 0x0006, 0x0001,
0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0006, 0x0006, 0x0006,
0x0006, 0x0006, 0x0006, 0x0006, 0x0001, 0x0006, 0x0006, 0x0006,
0x0006, 0x0006, 0x0006, 0x0001, 0x0001, 0x0006, 0x0006, 0x0006,
0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0001, 0x0001, 0x0006,
0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0001, 0x0006, 0x0006,
0x0001, 0x0006, 0x0006, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
0x0001, 0x0001, 0x0001, 0x0001, 0x0006, 0x0006, 0x0006, 0x0006,
0x0006, 0x0006, 0x0001, 0x0001, 0x0001, 0x0006, 0x0001, 0x0006,
0x0006, 0x0001, 0x0006, 0x0006, 0x0001, 0x0001, 0x0001, 0x0006,
0x0001, 0x0006, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0009,
0x0009, 0x0009, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0006, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006,
0x0006, 0x0001, 0x0001, 0x0000, 0x0001, 0x0006, 0x0001, 0x0001,
0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
0x0001, 0x000a, 0x000a, 0x000a, 0x000a, 0x0001, 0x0001, 0x0001,
0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
0x0001, 0x0006, 0x0006, 0x0006, 0x0001, 0x0001, 0x0001, 0x0001,
0x0001, 0x0001, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x000a,
0x000a, 0x000a, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0001,
0x0001, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006,
0x0001, 0x0001, 0x0001, 0x0001, 0x0000, 0x0000, 0x0006, 0x0006,
0x0006, 0x0000, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
0x0001, 0x0001, 0x0001, 0x0001, 0x0000, 0x0001, 0x0001, 0x0001,
0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0004,
0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0006,
0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0001, 0x0001,
0x0001, 0x0001, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006,
0x0006, 0x0001, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006,
0x0006, 0x0006, 0x0006, 0x0001, 0x0001, 0x0006, 0x0006, 0x0006,
0x0006, 0x0006, 0x0001, 0x0006, 0x0006, 0x0001, 0x0006, 0x0006,
0x0006, 0x0006, 0x0006, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
0x0001, 0x0001, 0x0009, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002,
0x0001, 0x0001, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002,
0x0002, 0x0002, 0x0002, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006,
0x0006, 0x0006, 0x0002, 0x0001, 0x0001, 0x0001, 0x0001, 0x0005,
0x0005, 0x0005, 0x0005, 0x0005, 0x0001, 0x0001, 0x0001, 0x0001,
0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0005,
0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005,
0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0001, 0x0001, 0x0005,
0x0005, 0x0001, 0x0005, 0x0001, 0x0001, 0x0005, 0x0001, 0x0005,
0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0001, 0x0005,
0x0005, 0x0005, 0x0005, 0x0001, 0x0005, 0x0001, 0x0005, 0x0001,
0x0001, 0x0001, 0x0001, 0x0005, 0x0001, 0x0001, 0x0001, 0x0001,
0x0005, 0x0001, 0x0005, 0x0001, 0x0005, 0x0001, 0x0005, 0x0005,
0x0005, 0x0001, 0x0005, 0x0005, 0x0001, 0x0005, 0x0001, 0x0001,
0x0005, 0x0001, 0x0005, 0x0001, 0x0005, 0x0001, 0x0005, 0x0001,
0x0005, 0x0005, 0x0001, 0x0005, 0x0001, 0x0001, 0x0005, 0x0005,
0x0005, 0x0005, 0x0001, 0x0005, 0x0005, 0x0005, 0x0005, 0x0001,
0x0005, 0x0005, 0x0005, 0x0005, 0x0001, 0x0005, 0x0001, 0x0005,
0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005,
0x0005, 0x0001, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005,
0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0001, 0x0001,
0x0001, 0x0001, 0x0005, 0x0005, 0x0005, 0x0001, 0x0005, 0x0005,
0x0005, 0x0005, 0x0005, 0x0001, 0x0005, 0x0005, 0x0005, 0x0005,
0x0005, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0001, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004,
0x0004, 0x0004, 0x0004, 0x0004, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0001, 0x0001, 0x0001,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0001, 0x0001,
0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0000, 0x0000, 0x0001,
0x000a, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001
};

View file

@ -25,6 +25,7 @@
#include <ntgdi.h>
#include <winspool.h>
#include <ddk/winsplp.h>
#include <usp10.h>
#include "psdrv.h"
@ -1143,6 +1144,585 @@ static BOOL get_text_extent(struct pp_data *data, const WCHAR *str, INT count,
return ret;
}
extern const unsigned short bidi_direction_table[] DECLSPEC_HIDDEN;
/*------------------------------------------------------------------------
Bidirectional Character Types
as defined by the Unicode Bidirectional Algorithm Table 3-7.
Note:
The list of bidirectional character types here is not grouped the
same way as the table 3-7, since the numeric values for the types
are chosen to keep the state and action tables compact.
------------------------------------------------------------------------*/
enum directions
{
/* input types */
/* ON MUST be zero, code relies on ON = N = 0 */
ON = 0, /* Other Neutral */
L, /* Left Letter */
R, /* Right Letter */
AN, /* Arabic Number */
EN, /* European Number */
AL, /* Arabic Letter (Right-to-left) */
NSM, /* Non-spacing Mark */
CS, /* Common Separator */
ES, /* European Separator */
ET, /* European Terminator (post/prefix e.g. $ and %) */
/* resolved types */
BN, /* Boundary neutral (type of RLE etc after explicit levels) */
/* input types, */
S, /* Segment Separator (TAB) // used only in L1 */
WS, /* White space // used only in L1 */
B, /* Paragraph Separator (aka as PS) */
/* types for explicit controls */
RLO, /* these are used only in X1-X9 */
RLE,
LRO,
LRE,
PDF,
LRI, /* Isolate formatting characters new with 6.3 */
RLI,
FSI,
PDI,
/* resolved types, also resolved directions */
NI = ON, /* alias, where ON, WS and S are treated the same */
};
static inline unsigned short get_table_entry_32(const unsigned short *table, UINT ch)
{
return table[table[table[table[ch >> 12] + ((ch >> 8) & 0x0f)] + ((ch >> 4) & 0x0f)] + (ch & 0xf)];
}
/* Convert the libwine information to the direction enum */
static void classify(LPCWSTR lpString, WORD *chartype, DWORD uCount)
{
unsigned i;
for (i = 0; i < uCount; ++i)
chartype[i] = get_table_entry_32(bidi_direction_table, lpString[i]);
}
/* Set a run of cval values at locations all prior to, but not including */
/* iStart, to the new value nval. */
static void SetDeferredRun(BYTE *pval, int cval, int iStart, int nval)
{
int i = iStart - 1;
for (; i >= iStart - cval; i--)
{
pval[i] = nval;
}
}
/* THE PARAGRAPH LEVEL */
/*------------------------------------------------------------------------
Function: resolveParagraphs
Resolves the input strings into blocks over which the algorithm
is then applied.
Implements Rule P1 of the Unicode Bidi Algorithm
Input: Text string
Character count
Output: revised character count
Note: This is a very simplistic function. In effect it restricts
the action of the algorithm to the first paragraph in the input
where a paragraph ends at the end of the first block separator
or at the end of the input text.
------------------------------------------------------------------------*/
static int resolveParagraphs(WORD *types, int cch)
{
/* skip characters not of type B */
int ich = 0;
for(; ich < cch && types[ich] != B; ich++);
/* stop after first B, make it a BN for use in the next steps */
if (ich < cch && types[ich] == B)
types[ich++] = BN;
return ich;
}
/* REORDER */
/*------------------------------------------------------------------------
Function: resolveLines
Breaks a paragraph into lines
Input: Array of line break flags
Character count
In/Out: Array of characters
Returns the count of characters on the first line
Note: This function only breaks lines at hard line breaks. Other
line breaks can be passed in. If pbrk[n] is TRUE, then a break
occurs after the character in pszInput[n]. Breaks before the first
character are not allowed.
------------------------------------------------------------------------*/
static int resolveLines(LPCWSTR pszInput, const BOOL * pbrk, int cch)
{
/* skip characters not of type LS */
int ich = 0;
for(; ich < cch; ich++)
{
if (pszInput[ich] == (WCHAR)'\n' || (pbrk && pbrk[ich]))
{
ich++;
break;
}
}
return ich;
}
/*------------------------------------------------------------------------
Function: resolveWhiteSpace
Resolves levels for WS and S
Implements rule L1 of the Unicode bidi Algorithm.
Input: Base embedding level
Character count
Array of direction classes (for one line of text)
In/Out: Array of embedding levels (for one line of text)
Note: this should be applied a line at a time. The default driver
code supplied in this file assumes a single line of text; for
a real implementation, cch and the initial pointer values
would have to be adjusted.
------------------------------------------------------------------------*/
static void resolveWhitespace(int baselevel, const WORD *pcls, BYTE *plevel, int cch)
{
int cchrun = 0;
BYTE oldlevel = baselevel;
int ich = 0;
for (; ich < cch; ich++)
{
switch(pcls[ich])
{
default:
cchrun = 0; /* any other character breaks the run */
break;
case WS:
cchrun++;
break;
case RLE:
case LRE:
case LRO:
case RLO:
case PDF:
case LRI:
case RLI:
case FSI:
case PDI:
case BN:
plevel[ich] = oldlevel;
cchrun++;
break;
case S:
case B:
/* reset levels for WS before eot */
SetDeferredRun(plevel, cchrun, ich, baselevel);
cchrun = 0;
plevel[ich] = baselevel;
break;
}
oldlevel = plevel[ich];
}
/* reset level before eot */
SetDeferredRun(plevel, cchrun, ich, baselevel);
}
/*------------------------------------------------------------------------
Function: BidiLines
Implements the Line-by-Line phases of the Unicode Bidi Algorithm
Input: Count of characters
Array of character directions
Inp/Out: Input text
Array of levels
------------------------------------------------------------------------*/
static void BidiLines(int baselevel, LPWSTR pszOutLine, LPCWSTR pszLine, const WORD * pclsLine,
BYTE * plevelLine, int cchPara, const BOOL * pbrk)
{
int cchLine = 0;
int done = 0;
int *run;
run = HeapAlloc(GetProcessHeap(), 0, cchPara * sizeof(int));
if (!run)
{
WARN("Out of memory\n");
return;
}
do
{
/* break lines at LS */
cchLine = resolveLines(pszLine, pbrk, cchPara);
/* resolve whitespace */
resolveWhitespace(baselevel, pclsLine, plevelLine, cchLine);
if (pszOutLine)
{
int i;
/* reorder each line in place */
ScriptLayout(cchLine, plevelLine, NULL, run);
for (i = 0; i < cchLine; i++)
pszOutLine[done+run[i]] = pszLine[i];
}
pszLine += cchLine;
plevelLine += cchLine;
pbrk += pbrk ? cchLine : 0;
pclsLine += cchLine;
cchPara -= cchLine;
done += cchLine;
} while (cchPara);
HeapFree(GetProcessHeap(), 0, run);
}
#define WINE_GCPW_FORCE_LTR 0
#define WINE_GCPW_FORCE_RTL 1
#define WINE_GCPW_DIR_MASK 3
static BOOL BIDI_Reorder(HDC hDC, /* [in] Display DC */
LPCWSTR lpString, /* [in] The string for which information is to be returned */
INT uCount, /* [in] Number of WCHARs in string. */
DWORD dwFlags, /* [in] GetCharacterPlacement compatible flags */
DWORD dwWineGCP_Flags, /* [in] Wine internal flags - Force paragraph direction */
LPWSTR lpOutString, /* [out] Reordered string */
INT uCountOut, /* [in] Size of output buffer */
UINT *lpOrder, /* [out] Logical -> Visual order map */
WORD **lpGlyphs, /* [out] reordered, mirrored, shaped glyphs to display */
INT *cGlyphs) /* [out] number of glyphs generated */
{
WORD *chartype = NULL;
BYTE *levels = NULL;
INT i, done;
unsigned glyph_i;
BOOL is_complex, ret = FALSE;
int maxItems;
int nItems;
SCRIPT_CONTROL Control;
SCRIPT_STATE State;
SCRIPT_ITEM *pItems = NULL;
HRESULT res;
SCRIPT_CACHE psc = NULL;
WORD *run_glyphs = NULL;
WORD *pwLogClust = NULL;
SCRIPT_VISATTR *psva = NULL;
DWORD cMaxGlyphs = 0;
BOOL doGlyphs = TRUE;
TRACE("%s, %d, 0x%08lx lpOutString=%p, lpOrder=%p\n",
debugstr_wn(lpString, uCount), uCount, dwFlags,
lpOutString, lpOrder);
memset(&Control, 0, sizeof(Control));
memset(&State, 0, sizeof(State));
if (lpGlyphs)
*lpGlyphs = NULL;
if (!(dwFlags & GCP_REORDER))
{
FIXME("Asked to reorder without reorder flag set\n");
return FALSE;
}
if (lpOutString && uCountOut < uCount)
{
FIXME("lpOutString too small\n");
return FALSE;
}
chartype = HeapAlloc(GetProcessHeap(), 0, uCount * sizeof(WORD));
if (!chartype)
{
WARN("Out of memory\n");
return FALSE;
}
if (lpOutString)
memcpy(lpOutString, lpString, uCount * sizeof(WCHAR));
is_complex = FALSE;
for (i = 0; i < uCount && !is_complex; i++)
{
if ((lpString[i] >= 0x900 && lpString[i] <= 0xfff) ||
(lpString[i] >= 0x1cd0 && lpString[i] <= 0x1cff) ||
(lpString[i] >= 0xa840 && lpString[i] <= 0xa8ff))
is_complex = TRUE;
}
/* Verify reordering will be required */
if (WINE_GCPW_FORCE_RTL == (dwWineGCP_Flags & WINE_GCPW_DIR_MASK))
State.uBidiLevel = 1;
else if (!is_complex)
{
done = 1;
classify(lpString, chartype, uCount);
for (i = 0; i < uCount; i++)
switch (chartype[i])
{
case R:
case AL:
case RLE:
case RLO:
done = 0;
break;
}
if (done)
{
HeapFree(GetProcessHeap(), 0, chartype);
if (lpOrder)
{
for (i = 0; i < uCount; i++)
lpOrder[i] = i;
}
return TRUE;
}
}
levels = HeapAlloc(GetProcessHeap(), 0, uCount * sizeof(BYTE));
if (!levels)
{
WARN("Out of memory\n");
goto cleanup;
}
maxItems = 5;
pItems = HeapAlloc(GetProcessHeap(),0, maxItems * sizeof(SCRIPT_ITEM));
if (!pItems)
{
WARN("Out of memory\n");
goto cleanup;
}
if (lpGlyphs)
{
cMaxGlyphs = 1.5 * uCount + 16;
run_glyphs = HeapAlloc(GetProcessHeap(),0,sizeof(WORD) * cMaxGlyphs);
if (!run_glyphs)
{
WARN("Out of memory\n");
goto cleanup;
}
pwLogClust = HeapAlloc(GetProcessHeap(),0,sizeof(WORD) * uCount);
if (!pwLogClust)
{
WARN("Out of memory\n");
goto cleanup;
}
psva = HeapAlloc(GetProcessHeap(),0,sizeof(SCRIPT_VISATTR) * cMaxGlyphs);
if (!psva)
{
WARN("Out of memory\n");
goto cleanup;
}
}
done = 0;
glyph_i = 0;
while (done < uCount)
{
INT j;
classify(lpString + done, chartype, uCount - done);
/* limit text to first block */
i = resolveParagraphs(chartype, uCount - done);
for (j = 0; j < i; ++j)
switch(chartype[j])
{
case B:
case S:
case WS:
case ON: chartype[j] = NI;
default: continue;
}
res = ScriptItemize(lpString + done, i, maxItems, &Control, &State, pItems, &nItems);
while (res == E_OUTOFMEMORY)
{
SCRIPT_ITEM *new_pItems = HeapReAlloc(GetProcessHeap(), 0, pItems, sizeof(*pItems) * maxItems * 2);
if (!new_pItems)
{
WARN("Out of memory\n");
goto cleanup;
}
pItems = new_pItems;
maxItems *= 2;
res = ScriptItemize(lpString + done, i, maxItems, &Control, &State, pItems, &nItems);
}
if (lpOutString || lpOrder)
for (j = 0; j < nItems; j++)
{
int k;
for (k = pItems[j].iCharPos; k < pItems[j+1].iCharPos; k++)
levels[k] = pItems[j].a.s.uBidiLevel;
}
if (lpOutString)
{
/* assign directional types again, but for WS, S this time */
classify(lpString + done, chartype, i);
BidiLines(State.uBidiLevel, lpOutString + done, lpString + done,
chartype, levels, i, 0);
}
if (lpOrder)
{
int k, lastgood;
for (j = lastgood = 0; j < i; ++j)
if (levels[j] != levels[lastgood])
{
--j;
if (levels[lastgood] & 1)
for (k = j; k >= lastgood; --k)
lpOrder[done + k] = done + j - k;
else
for (k = lastgood; k <= j; ++k)
lpOrder[done + k] = done + k;
lastgood = ++j;
}
if (levels[lastgood] & 1)
for (k = j - 1; k >= lastgood; --k)
lpOrder[done + k] = done + j - 1 - k;
else
for (k = lastgood; k < j; ++k)
lpOrder[done + k] = done + k;
}
if (lpGlyphs && doGlyphs)
{
BYTE *runOrder;
int *visOrder;
SCRIPT_ITEM *curItem;
runOrder = HeapAlloc(GetProcessHeap(), 0, maxItems * sizeof(*runOrder));
visOrder = HeapAlloc(GetProcessHeap(), 0, maxItems * sizeof(*visOrder));
if (!runOrder || !visOrder)
{
WARN("Out of memory\n");
HeapFree(GetProcessHeap(), 0, runOrder);
HeapFree(GetProcessHeap(), 0, visOrder);
goto cleanup;
}
for (j = 0; j < nItems; j++)
runOrder[j] = pItems[j].a.s.uBidiLevel;
ScriptLayout(nItems, runOrder, visOrder, NULL);
for (j = 0; j < nItems; j++)
{
int k;
int cChars,cOutGlyphs;
curItem = &pItems[visOrder[j]];
cChars = pItems[visOrder[j]+1].iCharPos - curItem->iCharPos;
res = ScriptShape(hDC, &psc, lpString + done + curItem->iCharPos, cChars, cMaxGlyphs, &curItem->a, run_glyphs, pwLogClust, psva, &cOutGlyphs);
while (res == E_OUTOFMEMORY)
{
WORD *new_run_glyphs = HeapReAlloc(GetProcessHeap(), 0, run_glyphs, sizeof(*run_glyphs) * cMaxGlyphs * 2);
SCRIPT_VISATTR *new_psva = HeapReAlloc(GetProcessHeap(), 0, psva, sizeof(*psva) * cMaxGlyphs * 2);
if (!new_run_glyphs || !new_psva)
{
WARN("Out of memory\n");
HeapFree(GetProcessHeap(), 0, runOrder);
HeapFree(GetProcessHeap(), 0, visOrder);
HeapFree(GetProcessHeap(), 0, *lpGlyphs);
*lpGlyphs = NULL;
if (new_run_glyphs)
run_glyphs = new_run_glyphs;
if (new_psva)
psva = new_psva;
goto cleanup;
}
run_glyphs = new_run_glyphs;
psva = new_psva;
cMaxGlyphs *= 2;
res = ScriptShape(hDC, &psc, lpString + done + curItem->iCharPos, cChars, cMaxGlyphs, &curItem->a, run_glyphs, pwLogClust, psva, &cOutGlyphs);
}
if (res)
{
if (res == USP_E_SCRIPT_NOT_IN_FONT)
TRACE("Unable to shape with currently selected font\n");
else
FIXME("Unable to shape string (%lx)\n",res);
j = nItems;
doGlyphs = FALSE;
HeapFree(GetProcessHeap(), 0, *lpGlyphs);
*lpGlyphs = NULL;
}
else
{
WORD *new_glyphs;
if (*lpGlyphs)
new_glyphs = HeapReAlloc(GetProcessHeap(), 0, *lpGlyphs, sizeof(**lpGlyphs) * (glyph_i + cOutGlyphs));
else
new_glyphs = HeapAlloc(GetProcessHeap(), 0, sizeof(**lpGlyphs) * (glyph_i + cOutGlyphs));
if (!new_glyphs)
{
WARN("Out of memory\n");
HeapFree(GetProcessHeap(), 0, runOrder);
HeapFree(GetProcessHeap(), 0, visOrder);
HeapFree(GetProcessHeap(), 0, *lpGlyphs);
*lpGlyphs = NULL;
goto cleanup;
}
*lpGlyphs = new_glyphs;
for (k = 0; k < cOutGlyphs; k++)
(*lpGlyphs)[glyph_i+k] = run_glyphs[k];
glyph_i += cOutGlyphs;
}
}
HeapFree(GetProcessHeap(), 0, runOrder);
HeapFree(GetProcessHeap(), 0, visOrder);
}
done += i;
}
if (cGlyphs)
*cGlyphs = glyph_i;
ret = TRUE;
cleanup:
HeapFree(GetProcessHeap(), 0, chartype);
HeapFree(GetProcessHeap(), 0, levels);
HeapFree(GetProcessHeap(), 0, pItems);
HeapFree(GetProcessHeap(), 0, run_glyphs);
HeapFree(GetProcessHeap(), 0, pwLogClust);
HeapFree(GetProcessHeap(), 0, psva);
ScriptFreeCache(&psc);
return ret;
}
static inline BOOL intersect_rect(RECT *dst, const RECT *src1, const RECT *src2)
{
dst->left = max(src1->left, src2->left);
@ -1182,9 +1762,28 @@ static BOOL ext_text_out(struct pp_data *data, HANDLETABLE *htable,
RECT rc;
POINT *deltas = NULL, width = {0, 0};
INT breakRem;
WORD *glyphs = NULL;
XFORM xform;
/* TODO: Add BiDi support */
if (!(flags & (ETO_GLYPH_INDEX | ETO_IGNORELANGUAGE)) && count > 0)
{
int glyphs_count = 0;
UINT bidi_flags;
bidi_flags = (GetTextAlign(hdc) & TA_RTLREADING) || (flags & ETO_RTLREADING)
? WINE_GCPW_FORCE_RTL : WINE_GCPW_FORCE_LTR;
BIDI_Reorder(hdc, str, count, GCP_REORDER, bidi_flags,
NULL, 0, NULL, &glyphs, &glyphs_count);
flags |= ETO_IGNORELANGUAGE;
if (glyphs)
{
flags |= ETO_GLYPH_INDEX;
count = glyphs_count;
str = glyphs;
}
}
align = GetTextAlign(hdc);
breakRem = data->break_rem;
@ -1504,6 +2103,7 @@ done:
DeleteObject(hbrush);
}
HeapFree(GetProcessHeap(), 0, glyphs);
return ret;
}

View file

@ -5807,6 +5807,7 @@ chdir ".." if -f "./make_unicode";
load_data();
dump_bidi_dir_table( "dlls/gdi32/uniscribe/direction.c" );
dump_bidi_dir_table( "dlls/dwrite/direction.c" );
dump_bidi_dir_table( "dlls/wineps.drv/direction.c" );
dump_mirroring( "dlls/gdi32/uniscribe/mirror.c" );
dump_mirroring( "dlls/dwrite/mirror.c" );
dump_bracket( "dlls/gdi32/uniscribe/bracket.c" );