/* AbiSource Program Utilities
 * Copyright (C) 2001 Tomas Frydrych
 *
 * 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., 59 Temple Place - Suite 330, Boston, MA
 * 02111-1307, USA.
 */

#ifndef UT_CASE_H
#define UT_CASE_H

// this file is to be included in ut_string.cpp only !!!
#ifndef UT_STRING_CPP
#error !!! This file can only be included in ut_string.cpp !!!
#endif

struct case_entry
{
	UT_UCSChar code;
	UT_Byte    type;
	UT_UCSChar other;
};

/*  the following structure works this way: low indicates lower boundary, and high
    upper boundary of a range that is to be treated in the same way, depending on type
    
    if type is Lu/Ll, then the character is Upper/Lowecase and the other can be found
    by adding the diff
    
    if type is Lu_even, then all even characters in this range are Upper-, while odd
    characters are Lower-case; a lowecase character is obtained by adding diff while
    uppercase character is obtained by subtracting diff.
    
    if type is Lu_odd, the all odd characters in this range are Upper-, while even
    characters are Lower-case; a lowercase character is obtained by adding the diff,
    while uppercase character is obtained by subtracting diff.
    
*/
#if 0
struct case_entry2
{
    UT_UCSChar  low;
    UT_UCSChar  high;
    UT_Byte     type;
    UT_sint32   diff;
}

case_entry2 case_table2[] = 
{
 {0x0041, 0x005a, Lu,  0x0020},
 {0x0061, 0x007a, Ll, -0x0020},
 {0x00b5, 0x00b5, Ll,  0x02e7},
 {0x00c0, 0x00d6, Lu,  0x0020},
 {0x00d8, 0x00de, Lu,  0x0020},
 {0x00e0, 0x00f6, Ll, -0x0020},
 {0x00f8, 0x00fe, Ll, -0x0020},
 {0x00ff, 0x00ff, Ll,  0x0079},
 {0x0100, 0x012f, Lu_even, 0x0001},
 {0x0130, 0x0130, Lu, -0x00c7},
 {0x0131, 0x0131, Ll, -0x00e8},
 {0x0132, 0x0137, Lu_even, 0x0001},
 {0x0139, 0x0148, Lu_odd,  0x0001},
 {0x014A, 0x0177, Lu_even, 0x0001},
 {0x0178, 0x0178, Ll, -0x0079},
 {0x0179, 0x017e, Lu_odd, 0x0001},
 {0x017f, 0x017f, Ll, -0x0125},
 {0x0181, 0x0181, Lu,  0x00d2},
 {0x0182, 0x0188, Lu_even, 0x0001},
 {0x2c80, 0x2ce3, Lu_even, 0x0001},	/* Coptic */
 
}
#endif

#define Lu 1
#define Ll 0

static int s_cmp_case(const void * c1, const void * c2)
{
	const UT_UCSChar * C1 = (const UT_UCSChar *) c1;
	const case_entry * C2 = (const case_entry *) c2;

	return *C1 - C2->code;
}

// must stay sorted !!!

case_entry case_table[] =
{
	{0x0041, Lu, 0x0061},
	{0x0042, Lu, 0x0062},
	{0x0043, Lu, 0x0063},
	{0x0044, Lu, 0x0064},
	{0x0045, Lu, 0x0065},
	{0x0046, Lu, 0x0066},
	{0x0047, Lu, 0x0067},
	{0x0048, Lu, 0x0068},
	{0x0049, Lu, 0x0069},
	{0x004A, Lu, 0x006A},
	{0x004B, Lu, 0x006B},
	{0x004C, Lu, 0x006C},
	{0x004D, Lu, 0x006D},
	{0x004E, Lu, 0x006E},
	{0x004F, Lu, 0x006F},
	{0x0050, Lu, 0x0070},
	{0x0051, Lu, 0x0071},
	{0x0052, Lu, 0x0072},
	{0x0053, Lu, 0x0073},
	{0x0054, Lu, 0x0074},
	{0x0055, Lu, 0x0075},
	{0x0056, Lu, 0x0076},
	{0x0057, Lu, 0x0077},
	{0x0058, Lu, 0x0078},
	{0x0059, Lu, 0x0079},
	{0x005A, Lu, 0x007A},
	{0x0061, Ll, 0x0041},
	{0x0062, Ll, 0x0042},
	{0x0063, Ll, 0x0043},
	{0x0064, Ll, 0x0044},
	{0x0065, Ll, 0x0045},
	{0x0066, Ll, 0x0046},
	{0x0067, Ll, 0x0047},
	{0x0068, Ll, 0x0048},
	{0x0069, Ll, 0x0049},
	{0x006A, Ll, 0x004A},
	{0x006B, Ll, 0x004B},
	{0x006C, Ll, 0x004C},
	{0x006D, Ll, 0x004D},
	{0x006E, Ll, 0x004E},
	{0x006F, Ll, 0x004F},
	{0x0070, Ll, 0x0050},
	{0x0071, Ll, 0x0051},
	{0x0072, Ll, 0x0052},
	{0x0073, Ll, 0x0053},
	{0x0074, Ll, 0x0054},
	{0x0075, Ll, 0x0055},
	{0x0076, Ll, 0x0056},
	{0x0077, Ll, 0x0057},
	{0x0078, Ll, 0x0058},
	{0x0079, Ll, 0x0059},
	{0x007A, Ll, 0x005A},
	{0x00B5, Ll, 0x039C},
	{0x00C0, Lu, 0x00E0},
	{0x00C1, Lu, 0x00E1},
	{0x00C2, Lu, 0x00E2},
	{0x00C3, Lu, 0x00E3},
	{0x00C4, Lu, 0x00E4},
	{0x00C5, Lu, 0x00E5},
	{0x00C6, Lu, 0x00E6},
	{0x00C7, Lu, 0x00E7},
	{0x00C8, Lu, 0x00E8},
	{0x00C9, Lu, 0x00E9},
	{0x00CA, Lu, 0x00EA},
	{0x00CB, Lu, 0x00EB},
	{0x00CC, Lu, 0x00EC},
	{0x00CD, Lu, 0x00ED},
	{0x00CE, Lu, 0x00EE},
	{0x00CF, Lu, 0x00EF},
	{0x00D0, Lu, 0x00F0},
	{0x00D1, Lu, 0x00F1},
	{0x00D2, Lu, 0x00F2},
	{0x00D3, Lu, 0x00F3},
	{0x00D4, Lu, 0x00F4},
	{0x00D5, Lu, 0x00F5},
	{0x00D6, Lu, 0x00F6},
	{0x00D8, Lu, 0x00F8},
	{0x00D9, Lu, 0x00F9},
	{0x00DA, Lu, 0x00FA},
	{0x00DB, Lu, 0x00FB},
	{0x00DC, Lu, 0x00FC},
	{0x00DD, Lu, 0x00FD},
	{0x00DE, Lu, 0x00FE},
	{0x00E0, Ll, 0x00C0},
	{0x00E1, Ll, 0x00C1},
	{0x00E2, Ll, 0x00C2},
	{0x00E3, Ll, 0x00C3},
	{0x00E4, Ll, 0x00C4},
	{0x00E5, Ll, 0x00C5},
	{0x00E6, Ll, 0x00C6},
	{0x00E7, Ll, 0x00C7},
	{0x00E8, Ll, 0x00C8},
	{0x00E9, Ll, 0x00C9},
	{0x00EA, Ll, 0x00CA},
	{0x00EB, Ll, 0x00CB},
	{0x00EC, Ll, 0x00CC},
	{0x00ED, Ll, 0x00CD},
	{0x00EE, Ll, 0x00CE},
	{0x00EF, Ll, 0x00CF},
	{0x00F0, Ll, 0x00D0},
	{0x00F1, Ll, 0x00D1},
	{0x00F2, Ll, 0x00D2},
	{0x00F3, Ll, 0x00D3},
	{0x00F4, Ll, 0x00D4},
	{0x00F5, Ll, 0x00D5},
	{0x00F6, Ll, 0x00D6},
	{0x00F8, Ll, 0x00D8},
	{0x00F9, Ll, 0x00D9},
	{0x00FA, Ll, 0x00DA},
	{0x00FB, Ll, 0x00DB},
	{0x00FC, Ll, 0x00DC},
	{0x00FD, Ll, 0x00DD},
	{0x00FE, Ll, 0x00DE},
	{0x00FF, Ll, 0x0178},
	{0x0100, Lu, 0x0101},
	{0x0101, Ll, 0x0100},
	{0x0102, Lu, 0x0103},
	{0x0103, Ll, 0x0102},
	{0x0104, Lu, 0x0105},
	{0x0105, Ll, 0x0104},
	{0x0106, Lu, 0x0107},
	{0x0107, Ll, 0x0106},
	{0x0108, Lu, 0x0109},
	{0x0109, Ll, 0x0108},
	{0x010A, Lu, 0x010B},
	{0x010B, Ll, 0x010A},
	{0x010C, Lu, 0x010D},
	{0x010D, Ll, 0x010C},
	{0x010E, Lu, 0x010F},
	{0x010F, Ll, 0x010E},
	{0x0110, Lu, 0x0111},
	{0x0111, Ll, 0x0110},
	{0x0112, Lu, 0x0113},
	{0x0113, Ll, 0x0112},
	{0x0114, Lu, 0x0115},
	{0x0115, Ll, 0x0114},
	{0x0116, Lu, 0x0117},
	{0x0117, Ll, 0x0116},
	{0x0118, Lu, 0x0119},
	{0x0119, Ll, 0x0118},
	{0x011A, Lu, 0x011B},
	{0x011B, Ll, 0x011A},
	{0x011C, Lu, 0x011D},
	{0x011D, Ll, 0x011C},
	{0x011E, Lu, 0x011F},
	{0x011F, Ll, 0x011E},
	{0x0120, Lu, 0x0121},
	{0x0121, Ll, 0x0120},
	{0x0122, Lu, 0x0123},
	{0x0123, Ll, 0x0122},
	{0x0124, Lu, 0x0125},
	{0x0125, Ll, 0x0124},
	{0x0126, Lu, 0x0127},
	{0x0127, Ll, 0x0126},
	{0x0128, Lu, 0x0129},
	{0x0129, Ll, 0x0128},
	{0x012A, Lu, 0x012B},
	{0x012B, Ll, 0x012A},
	{0x012C, Lu, 0x012D},
	{0x012D, Ll, 0x012C},
	{0x012E, Lu, 0x012F},
	{0x012F, Ll, 0x012E},
	{0x0130, Lu, 0x0069},
	{0x0131, Ll, 0x0049},
	{0x0132, Lu, 0x0133},
	{0x0133, Ll, 0x0132},
	{0x0134, Lu, 0x0135},
	{0x0135, Ll, 0x0134},
	{0x0136, Lu, 0x0137},
	{0x0137, Ll, 0x0136},
	{0x0139, Lu, 0x013A},
	{0x013A, Ll, 0x0139},
	{0x013B, Lu, 0x013C},
	{0x013C, Ll, 0x013B},
	{0x013D, Lu, 0x013E},
	{0x013E, Ll, 0x013D},
	{0x013F, Lu, 0x0140},
	{0x0140, Ll, 0x013F},
	{0x0141, Lu, 0x0142},
	{0x0142, Ll, 0x0141},
	{0x0143, Lu, 0x0144},
	{0x0144, Ll, 0x0143},
	{0x0145, Lu, 0x0146},
	{0x0146, Ll, 0x0145},
	{0x0147, Lu, 0x0148},
	{0x0148, Ll, 0x0147},
	{0x014A, Lu, 0x014B},
	{0x014B, Ll, 0x014A},
	{0x014C, Lu, 0x014D},
	{0x014D, Ll, 0x014C},
	{0x014E, Lu, 0x014F},
	{0x014F, Ll, 0x014E},
	{0x0150, Lu, 0x0151},
	{0x0151, Ll, 0x0150},
	{0x0152, Lu, 0x0153},
	{0x0153, Ll, 0x0152},
	{0x0154, Lu, 0x0155},
	{0x0155, Ll, 0x0154},
	{0x0156, Lu, 0x0157},
	{0x0157, Ll, 0x0156},
	{0x0158, Lu, 0x0159},
	{0x0159, Ll, 0x0158},
	{0x015A, Lu, 0x015B},
	{0x015B, Ll, 0x015A},
	{0x015C, Lu, 0x015D},
	{0x015D, Ll, 0x015C},
	{0x015E, Lu, 0x015F},
	{0x015F, Ll, 0x015E},
	{0x0160, Lu, 0x0161},
	{0x0161, Ll, 0x0160},
	{0x0162, Lu, 0x0163},
	{0x0163, Ll, 0x0162},
	{0x0164, Lu, 0x0165},
	{0x0165, Ll, 0x0164},
	{0x0166, Lu, 0x0167},
	{0x0167, Ll, 0x0166},
	{0x0168, Lu, 0x0169},
	{0x0169, Ll, 0x0168},
	{0x016A, Lu, 0x016B},
	{0x016B, Ll, 0x016A},
	{0x016C, Lu, 0x016D},
	{0x016D, Ll, 0x016C},
	{0x016E, Lu, 0x016F},
	{0x016F, Ll, 0x016E},
	{0x0170, Lu, 0x0171},
	{0x0171, Ll, 0x0170},
	{0x0172, Lu, 0x0173},
	{0x0173, Ll, 0x0172},
	{0x0174, Lu, 0x0175},
	{0x0175, Ll, 0x0174},
	{0x0176, Lu, 0x0177},
	{0x0177, Ll, 0x0176},
	{0x0178, Lu, 0x00FF},
	{0x0179, Lu, 0x017A},
	{0x017A, Ll, 0x0179},
	{0x017B, Lu, 0x017C},
	{0x017C, Ll, 0x017B},
	{0x017D, Lu, 0x017E},
	{0x017E, Ll, 0x017D},
	{0x017F, Ll, 0x0053},
	{0x0181, Lu, 0x0253},
	{0x0182, Lu, 0x0183},
	{0x0183, Ll, 0x0182},
	{0x0184, Lu, 0x0185},
	{0x0185, Ll, 0x0184},
	{0x0186, Lu, 0x0254},
	{0x0187, Lu, 0x0188},
	{0x0188, Ll, 0x0187},
	{0x0189, Lu, 0x0256},
	{0x018A, Lu, 0x0257},
	{0x018B, Lu, 0x018C},
	{0x018C, Ll, 0x018B},
	{0x018E, Lu, 0x01DD},
	{0x018F, Lu, 0x0259},
	{0x0190, Lu, 0x025B},
	{0x0191, Lu, 0x0192},
	{0x0192, Ll, 0x0191},
	{0x0193, Lu, 0x0260},
	{0x0194, Lu, 0x0263},
	{0x0195, Ll, 0x01F6},
	{0x0196, Lu, 0x0269},
	{0x0197, Lu, 0x0268},
	{0x0198, Lu, 0x0199},
	{0x0199, Ll, 0x0198},
	{0x019C, Lu, 0x026F},
	{0x019D, Lu, 0x0272},
	{0x019F, Lu, 0x0275},
	{0x01A0, Lu, 0x01A1},
	{0x01A1, Ll, 0x01A0},
	{0x01A2, Lu, 0x01A3},
	{0x01A3, Ll, 0x01A2},
	{0x01A4, Lu, 0x01A5},
	{0x01A5, Ll, 0x01A4},
	{0x01A6, Lu, 0x0280},
	{0x01A7, Lu, 0x01A8},
	{0x01A8, Ll, 0x01A7},
	{0x01A9, Lu, 0x0283},
	{0x01AC, Lu, 0x01AD},
	{0x01AD, Ll, 0x01AC},
	{0x01AE, Lu, 0x0288},
	{0x01AF, Lu, 0x01B0},
	{0x01B0, Ll, 0x01AF},
	{0x01B1, Lu, 0x028A},
	{0x01B2, Lu, 0x028B},
	{0x01B3, Lu, 0x01B4},
	{0x01B4, Ll, 0x01B3},
	{0x01B5, Lu, 0x01B6},
	{0x01B6, Ll, 0x01B5},
	{0x01B7, Lu, 0x0292},
	{0x01B8, Lu, 0x01B9},
	{0x01B9, Ll, 0x01B8},
	{0x01BC, Lu, 0x01BD},
	{0x01BD, Ll, 0x01BC},
	{0x01BF, Ll, 0x01F7},
	{0x01C4, Lu, 0x01C6},
	{0x01C6, Ll, 0x01C5},
	{0x01C7, Lu, 0x01C9},
	{0x01C9, Ll, 0x01C8},
	{0x01CA, Lu, 0x01CC},
	{0x01CC, Ll, 0x01CB},
	{0x01CD, Lu, 0x01CE},
	{0x01CE, Ll, 0x01CD},
	{0x01CF, Lu, 0x01D0},
	{0x01D0, Ll, 0x01CF},
	{0x01D1, Lu, 0x01D2},
	{0x01D2, Ll, 0x01D1},
	{0x01D3, Lu, 0x01D4},
	{0x01D4, Ll, 0x01D3},
	{0x01D5, Lu, 0x01D6},
	{0x01D6, Ll, 0x01D5},
	{0x01D7, Lu, 0x01D8},
	{0x01D8, Ll, 0x01D7},
	{0x01D9, Lu, 0x01DA},
	{0x01DA, Ll, 0x01D9},
	{0x01DB, Lu, 0x01DC},
	{0x01DC, Ll, 0x01DB},
	{0x01DD, Ll, 0x018E},
	{0x01DE, Lu, 0x01DF},
	{0x01DF, Ll, 0x01DE},
	{0x01E0, Lu, 0x01E1},
	{0x01E1, Ll, 0x01E0},
	{0x01E2, Lu, 0x01E3},
	{0x01E3, Ll, 0x01E2},
	{0x01E4, Lu, 0x01E5},
	{0x01E5, Ll, 0x01E4},
	{0x01E6, Lu, 0x01E7},
	{0x01E7, Ll, 0x01E6},
	{0x01E8, Lu, 0x01E9},
	{0x01E9, Ll, 0x01E8},
	{0x01EA, Lu, 0x01EB},
	{0x01EB, Ll, 0x01EA},
	{0x01EC, Lu, 0x01ED},
	{0x01ED, Ll, 0x01EC},
	{0x01EE, Lu, 0x01EF},
	{0x01EF, Ll, 0x01EE},
	{0x01F1, Lu, 0x01F3},
	{0x01F3, Ll, 0x01F2},
	{0x01F4, Lu, 0x01F5},
	{0x01F5, Ll, 0x01F4},
	{0x01F6, Lu, 0x0195},
	{0x01F7, Lu, 0x01BF},
	{0x01F8, Lu, 0x01F9},
	{0x01F9, Ll, 0x01F8},
	{0x01FA, Lu, 0x01FB},
	{0x01FB, Ll, 0x01FA},
	{0x01FC, Lu, 0x01FD},
	{0x01FD, Ll, 0x01FC},
	{0x01FE, Lu, 0x01FF},
	{0x01FF, Ll, 0x01FE},
	{0x0200, Lu, 0x0201},
	{0x0201, Ll, 0x0200},
	{0x0202, Lu, 0x0203},
	{0x0203, Ll, 0x0202},
	{0x0204, Lu, 0x0205},
	{0x0205, Ll, 0x0204},
	{0x0206, Lu, 0x0207},
	{0x0207, Ll, 0x0206},
	{0x0208, Lu, 0x0209},
	{0x0209, Ll, 0x0208},
	{0x020A, Lu, 0x020B},
	{0x020B, Ll, 0x020A},
	{0x020C, Lu, 0x020D},
	{0x020D, Ll, 0x020C},
	{0x020E, Lu, 0x020F},
	{0x020F, Ll, 0x020E},
	{0x0210, Lu, 0x0211},
	{0x0211, Ll, 0x0210},
	{0x0212, Lu, 0x0213},
	{0x0213, Ll, 0x0212},
	{0x0214, Lu, 0x0215},
	{0x0215, Ll, 0x0214},
	{0x0216, Lu, 0x0217},
	{0x0217, Ll, 0x0216},
	{0x0218, Lu, 0x0219},
	{0x0219, Ll, 0x0218},
	{0x021A, Lu, 0x021B},
	{0x021B, Ll, 0x021A},
	{0x021C, Lu, 0x021D},
	{0x021D, Ll, 0x021C},
	{0x021E, Lu, 0x021F},
	{0x021F, Ll, 0x021E},
	{0x0222, Lu, 0x0223},
	{0x0223, Ll, 0x0222},
	{0x0224, Lu, 0x0225},
	{0x0225, Ll, 0x0224},
	{0x0226, Lu, 0x0227},
	{0x0227, Ll, 0x0226},
	{0x0228, Lu, 0x0229},
	{0x0229, Ll, 0x0228},
	{0x022A, Lu, 0x022B},
	{0x022B, Ll, 0x022A},
	{0x022C, Lu, 0x022D},
	{0x022D, Ll, 0x022C},
	{0x022E, Lu, 0x022F},
	{0x022F, Ll, 0x022E},
	{0x0230, Lu, 0x0231},
	{0x0231, Ll, 0x0230},
	{0x0232, Lu, 0x0233},
	{0x0233, Ll, 0x0232},
	{0x0253, Ll, 0x0181},
	{0x0254, Ll, 0x0186},
	{0x0256, Ll, 0x0189},
	{0x0257, Ll, 0x018A},
	{0x0259, Ll, 0x018F},
	{0x025B, Ll, 0x0190},
	{0x0260, Ll, 0x0193},
	{0x0263, Ll, 0x0194},
	{0x0268, Ll, 0x0197},
	{0x0269, Ll, 0x0196},
	{0x026F, Ll, 0x019C},
	{0x0272, Ll, 0x019D},
	{0x0275, Ll, 0x019F},
	{0x0280, Ll, 0x01A6},
	{0x0283, Ll, 0x01A9},
	{0x0288, Ll, 0x01AE},
	{0x028A, Ll, 0x01B1},
	{0x028B, Ll, 0x01B2},
	{0x0292, Ll, 0x01B7},
	{0x0386, Lu, 0x03AC},
	{0x0388, Lu, 0x03AD},
	{0x0389, Lu, 0x03AE},
	{0x038A, Lu, 0x03AF},
	{0x038C, Lu, 0x03CC},
	{0x038E, Lu, 0x03CD},
	{0x038F, Lu, 0x03CE},
	{0x0391, Lu, 0x03B1},
	{0x0392, Lu, 0x03B2},
	{0x0393, Lu, 0x03B3},
	{0x0394, Lu, 0x03B4},
	{0x0395, Lu, 0x03B5},
	{0x0396, Lu, 0x03B6},
	{0x0397, Lu, 0x03B7},
	{0x0398, Lu, 0x03B8},
	{0x0399, Lu, 0x03B9},
	{0x039A, Lu, 0x03BA},
	{0x039B, Lu, 0x03BB},
	{0x039C, Lu, 0x03BC},
	{0x039D, Lu, 0x03BD},
	{0x039E, Lu, 0x03BE},
	{0x039F, Lu, 0x03BF},
	{0x03A0, Lu, 0x03C0},
	{0x03A1, Lu, 0x03C1},
	{0x03A3, Lu, 0x03C3},
	{0x03A4, Lu, 0x03C4},
	{0x03A5, Lu, 0x03C5},
	{0x03A6, Lu, 0x03C6},
	{0x03A7, Lu, 0x03C7},
	{0x03A8, Lu, 0x03C8},
	{0x03A9, Lu, 0x03C9},
	{0x03AA, Lu, 0x03CA},
	{0x03AB, Lu, 0x03CB},
	{0x03AC, Ll, 0x0386},
	{0x03AD, Ll, 0x0388},
	{0x03AE, Ll, 0x0389},
	{0x03AF, Ll, 0x038A},
	{0x03B1, Ll, 0x0391},
	{0x03B2, Ll, 0x0392},
	{0x03B3, Ll, 0x0393},
	{0x03B4, Ll, 0x0394},
	{0x03B5, Ll, 0x0395},
	{0x03B6, Ll, 0x0396},
	{0x03B7, Ll, 0x0397},
	{0x03B8, Ll, 0x0398},
	{0x03B9, Ll, 0x0399},
	{0x03BA, Ll, 0x039A},
	{0x03BB, Ll, 0x039B},
	{0x03BC, Ll, 0x039C},
	{0x03BD, Ll, 0x039D},
	{0x03BE, Ll, 0x039E},
	{0x03BF, Ll, 0x039F},
	{0x03C0, Ll, 0x03A0},
	{0x03C1, Ll, 0x03A1},
	{0x03C2, Ll, 0x03A3},
	{0x03C3, Ll, 0x03A3},
	{0x03C4, Ll, 0x03A4},
	{0x03C5, Ll, 0x03A5},
	{0x03C6, Ll, 0x03A6},
	{0x03C7, Ll, 0x03A7},
	{0x03C8, Ll, 0x03A8},
	{0x03C9, Ll, 0x03A9},
	{0x03CA, Ll, 0x03AA},
	{0x03CB, Ll, 0x03AB},
	{0x03CC, Ll, 0x038C},
	{0x03CD, Ll, 0x038E},
	{0x03CE, Ll, 0x038F},
	{0x03D0, Ll, 0x0392},
	{0x03D1, Ll, 0x0398},
	{0x03D5, Ll, 0x03A6},
	{0x03D6, Ll, 0x03A0},
	{0x03DA, Lu, 0x03DB},
	{0x03DB, Ll, 0x03DA},
	{0x03DC, Lu, 0x03DD},
	{0x03DD, Ll, 0x03DC},
	{0x03DE, Lu, 0x03DF},
	{0x03DF, Ll, 0x03DE},
	{0x03E0, Lu, 0x03E1},
	{0x03E1, Ll, 0x03E0},
	{0x03E2, Lu, 0x03E3},
	{0x03E3, Ll, 0x03E2},
	{0x03E4, Lu, 0x03E5},
	{0x03E5, Ll, 0x03E4},
	{0x03E6, Lu, 0x03E7},
	{0x03E7, Ll, 0x03E6},
	{0x03E8, Lu, 0x03E9},
	{0x03E9, Ll, 0x03E8},
	{0x03EA, Lu, 0x03EB},
	{0x03EB, Ll, 0x03EA},
	{0x03EC, Lu, 0x03ED},
	{0x03ED, Ll, 0x03EC},
	{0x03EE, Lu, 0x03EF},
	{0x03EF, Ll, 0x03EE},
	{0x03F0, Ll, 0x039A},
	{0x03F1, Ll, 0x03A1},
	{0x03F2, Ll, 0x03A3},
	{0x03F4, Lu, 0x03B8},
	{0x03F5, Ll, 0x0395},
	{0x0400, Lu, 0x0450},
	{0x0401, Lu, 0x0451},
	{0x0402, Lu, 0x0452},
	{0x0403, Lu, 0x0453},
	{0x0404, Lu, 0x0454},
	{0x0405, Lu, 0x0455},
	{0x0406, Lu, 0x0456},
	{0x0407, Lu, 0x0457},
	{0x0408, Lu, 0x0458},
	{0x0409, Lu, 0x0459},
	{0x040A, Lu, 0x045A},
	{0x040B, Lu, 0x045B},
	{0x040C, Lu, 0x045C},
	{0x040D, Lu, 0x045D},
	{0x040E, Lu, 0x045E},
	{0x040F, Lu, 0x045F},
	{0x0410, Lu, 0x0430},
	{0x0411, Lu, 0x0431},
	{0x0412, Lu, 0x0432},
	{0x0413, Lu, 0x0433},
	{0x0414, Lu, 0x0434},
	{0x0415, Lu, 0x0435},
	{0x0416, Lu, 0x0436},
	{0x0417, Lu, 0x0437},
	{0x0418, Lu, 0x0438},
	{0x0419, Lu, 0x0439},
	{0x041A, Lu, 0x043A},
	{0x041B, Lu, 0x043B},
	{0x041C, Lu, 0x043C},
	{0x041D, Lu, 0x043D},
	{0x041E, Lu, 0x043E},
	{0x041F, Lu, 0x043F},
	{0x0420, Lu, 0x0440},
	{0x0421, Lu, 0x0441},
	{0x0422, Lu, 0x0442},
	{0x0423, Lu, 0x0443},
	{0x0424, Lu, 0x0444},
	{0x0425, Lu, 0x0445},
	{0x0426, Lu, 0x0446},
	{0x0427, Lu, 0x0447},
	{0x0428, Lu, 0x0448},
	{0x0429, Lu, 0x0449},
	{0x042A, Lu, 0x044A},
	{0x042B, Lu, 0x044B},
	{0x042C, Lu, 0x044C},
	{0x042D, Lu, 0x044D},
	{0x042E, Lu, 0x044E},
	{0x042F, Lu, 0x044F},
	{0x0430, Ll, 0x0410},
	{0x0431, Ll, 0x0411},
	{0x0432, Ll, 0x0412},
	{0x0433, Ll, 0x0413},
	{0x0434, Ll, 0x0414},
	{0x0435, Ll, 0x0415},
	{0x0436, Ll, 0x0416},
	{0x0437, Ll, 0x0417},
	{0x0438, Ll, 0x0418},
	{0x0439, Ll, 0x0419},
	{0x043A, Ll, 0x041A},
	{0x043B, Ll, 0x041B},
	{0x043C, Ll, 0x041C},
	{0x043D, Ll, 0x041D},
	{0x043E, Ll, 0x041E},
	{0x043F, Ll, 0x041F},
	{0x0440, Ll, 0x0420},
	{0x0441, Ll, 0x0421},
	{0x0442, Ll, 0x0422},
	{0x0443, Ll, 0x0423},
	{0x0444, Ll, 0x0424},
	{0x0445, Ll, 0x0425},
	{0x0446, Ll, 0x0426},
	{0x0447, Ll, 0x0427},
	{0x0448, Ll, 0x0428},
	{0x0449, Ll, 0x0429},
	{0x044A, Ll, 0x042A},
	{0x044B, Ll, 0x042B},
	{0x044C, Ll, 0x042C},
	{0x044D, Ll, 0x042D},
	{0x044E, Ll, 0x042E},
	{0x044F, Ll, 0x042F},
	{0x0450, Ll, 0x0400},
	{0x0451, Ll, 0x0401},
	{0x0452, Ll, 0x0402},
	{0x0453, Ll, 0x0403},
	{0x0454, Ll, 0x0404},
	{0x0455, Ll, 0x0405},
	{0x0456, Ll, 0x0406},
	{0x0457, Ll, 0x0407},
	{0x0458, Ll, 0x0408},
	{0x0459, Ll, 0x0409},
	{0x045A, Ll, 0x040A},
	{0x045B, Ll, 0x040B},
	{0x045C, Ll, 0x040C},
	{0x045D, Ll, 0x040D},
	{0x045E, Ll, 0x040E},
	{0x045F, Ll, 0x040F},
	{0x0460, Lu, 0x0461},
	{0x0461, Ll, 0x0460},
	{0x0462, Lu, 0x0463},
	{0x0463, Ll, 0x0462},
	{0x0464, Lu, 0x0465},
	{0x0465, Ll, 0x0464},
	{0x0466, Lu, 0x0467},
	{0x0467, Ll, 0x0466},
	{0x0468, Lu, 0x0469},
	{0x0469, Ll, 0x0468},
	{0x046A, Lu, 0x046B},
	{0x046B, Ll, 0x046A},
	{0x046C, Lu, 0x046D},
	{0x046D, Ll, 0x046C},
	{0x046E, Lu, 0x046F},
	{0x046F, Ll, 0x046E},
	{0x0470, Lu, 0x0471},
	{0x0471, Ll, 0x0470},
	{0x0472, Lu, 0x0473},
	{0x0473, Ll, 0x0472},
	{0x0474, Lu, 0x0475},
	{0x0475, Ll, 0x0474},
	{0x0476, Lu, 0x0477},
	{0x0477, Ll, 0x0476},
	{0x0478, Lu, 0x0479},
	{0x0479, Ll, 0x0478},
	{0x047A, Lu, 0x047B},
	{0x047B, Ll, 0x047A},
	{0x047C, Lu, 0x047D},
	{0x047D, Ll, 0x047C},
	{0x047E, Lu, 0x047F},
	{0x047F, Ll, 0x047E},
	{0x0480, Lu, 0x0481},
	{0x0481, Ll, 0x0480},
	{0x048C, Lu, 0x048D},
	{0x048D, Ll, 0x048C},
	{0x048E, Lu, 0x048F},
	{0x048F, Ll, 0x048E},
	{0x0490, Lu, 0x0491},
	{0x0491, Ll, 0x0490},
	{0x0492, Lu, 0x0493},
	{0x0493, Ll, 0x0492},
	{0x0494, Lu, 0x0495},
	{0x0495, Ll, 0x0494},
	{0x0496, Lu, 0x0497},
	{0x0497, Ll, 0x0496},
	{0x0498, Lu, 0x0499},
	{0x0499, Ll, 0x0498},
	{0x049A, Lu, 0x049B},
	{0x049B, Ll, 0x049A},
	{0x049C, Lu, 0x049D},
	{0x049D, Ll, 0x049C},
	{0x049E, Lu, 0x049F},
	{0x049F, Ll, 0x049E},
	{0x04A0, Lu, 0x04A1},
	{0x04A1, Ll, 0x04A0},
	{0x04A2, Lu, 0x04A3},
	{0x04A3, Ll, 0x04A2},
	{0x04A4, Lu, 0x04A5},
	{0x04A5, Ll, 0x04A4},
	{0x04A6, Lu, 0x04A7},
	{0x04A7, Ll, 0x04A6},
	{0x04A8, Lu, 0x04A9},
	{0x04A9, Ll, 0x04A8},
	{0x04AA, Lu, 0x04AB},
	{0x04AB, Ll, 0x04AA},
	{0x04AC, Lu, 0x04AD},
	{0x04AD, Ll, 0x04AC},
	{0x04AE, Lu, 0x04AF},
	{0x04AF, Ll, 0x04AE},
	{0x04B0, Lu, 0x04B1},
	{0x04B1, Ll, 0x04B0},
	{0x04B2, Lu, 0x04B3},
	{0x04B3, Ll, 0x04B2},
	{0x04B4, Lu, 0x04B5},
	{0x04B5, Ll, 0x04B4},
	{0x04B6, Lu, 0x04B7},
	{0x04B7, Ll, 0x04B6},
	{0x04B8, Lu, 0x04B9},
	{0x04B9, Ll, 0x04B8},
	{0x04BA, Lu, 0x04BB},
	{0x04BB, Ll, 0x04BA},
	{0x04BC, Lu, 0x04BD},
	{0x04BD, Ll, 0x04BC},
	{0x04BE, Lu, 0x04BF},
	{0x04BF, Ll, 0x04BE},
	{0x04C1, Lu, 0x04C2},
	{0x04C2, Ll, 0x04C1},
	{0x04C3, Lu, 0x04C4},
	{0x04C4, Ll, 0x04C3},
	{0x04C7, Lu, 0x04C8},
	{0x04C8, Ll, 0x04C7},
	{0x04CB, Lu, 0x04CC},
	{0x04CC, Ll, 0x04CB},
	{0x04D0, Lu, 0x04D1},
	{0x04D1, Ll, 0x04D0},
	{0x04D2, Lu, 0x04D3},
	{0x04D3, Ll, 0x04D2},
	{0x04D4, Lu, 0x04D5},
	{0x04D5, Ll, 0x04D4},
	{0x04D6, Lu, 0x04D7},
	{0x04D7, Ll, 0x04D6},
	{0x04D8, Lu, 0x04D9},
	{0x04D9, Ll, 0x04D8},
	{0x04DA, Lu, 0x04DB},
	{0x04DB, Ll, 0x04DA},
	{0x04DC, Lu, 0x04DD},
	{0x04DD, Ll, 0x04DC},
	{0x04DE, Lu, 0x04DF},
	{0x04DF, Ll, 0x04DE},
	{0x04E0, Lu, 0x04E1},
	{0x04E1, Ll, 0x04E0},
	{0x04E2, Lu, 0x04E3},
	{0x04E3, Ll, 0x04E2},
	{0x04E4, Lu, 0x04E5},
	{0x04E5, Ll, 0x04E4},
	{0x04E6, Lu, 0x04E7},
	{0x04E7, Ll, 0x04E6},
	{0x04E8, Lu, 0x04E9},
	{0x04E9, Ll, 0x04E8},
	{0x04EA, Lu, 0x04EB},
	{0x04EB, Ll, 0x04EA},
	{0x04EC, Lu, 0x04ED},
	{0x04ED, Ll, 0x04EC},
	{0x04EE, Lu, 0x04EF},
	{0x04EF, Ll, 0x04EE},
	{0x04F0, Lu, 0x04F1},
	{0x04F1, Ll, 0x04F0},
	{0x04F2, Lu, 0x04F3},
	{0x04F3, Ll, 0x04F2},
	{0x04F4, Lu, 0x04F5},
	{0x04F5, Ll, 0x04F4},
	{0x04F8, Lu, 0x04F9},
	{0x04F9, Ll, 0x04F8},
	{0x0531, Lu, 0x0561},
	{0x0532, Lu, 0x0562},
	{0x0533, Lu, 0x0563},
	{0x0534, Lu, 0x0564},
	{0x0535, Lu, 0x0565},
	{0x0536, Lu, 0x0566},
	{0x0537, Lu, 0x0567},
	{0x0538, Lu, 0x0568},
	{0x0539, Lu, 0x0569},
	{0x053A, Lu, 0x056A},
	{0x053B, Lu, 0x056B},
	{0x053C, Lu, 0x056C},
	{0x053D, Lu, 0x056D},
	{0x053E, Lu, 0x056E},
	{0x053F, Lu, 0x056F},
	{0x0540, Lu, 0x0570},
	{0x0541, Lu, 0x0571},
	{0x0542, Lu, 0x0572},
	{0x0543, Lu, 0x0573},
	{0x0544, Lu, 0x0574},
	{0x0545, Lu, 0x0575},
	{0x0546, Lu, 0x0576},
	{0x0547, Lu, 0x0577},
	{0x0548, Lu, 0x0578},
	{0x0549, Lu, 0x0579},
	{0x054A, Lu, 0x057A},
	{0x054B, Lu, 0x057B},
	{0x054C, Lu, 0x057C},
	{0x054D, Lu, 0x057D},
	{0x054E, Lu, 0x057E},
	{0x054F, Lu, 0x057F},
	{0x0550, Lu, 0x0580},
	{0x0551, Lu, 0x0581},
	{0x0552, Lu, 0x0582},
	{0x0553, Lu, 0x0583},
	{0x0554, Lu, 0x0584},
	{0x0555, Lu, 0x0585},
	{0x0556, Lu, 0x0586},
	{0x0561, Ll, 0x0531},
	{0x0562, Ll, 0x0532},
	{0x0563, Ll, 0x0533},
	{0x0564, Ll, 0x0534},
	{0x0565, Ll, 0x0535},
	{0x0566, Ll, 0x0536},
	{0x0567, Ll, 0x0537},
	{0x0568, Ll, 0x0538},
	{0x0569, Ll, 0x0539},
	{0x056A, Ll, 0x053A},
	{0x056B, Ll, 0x053B},
	{0x056C, Ll, 0x053C},
	{0x056D, Ll, 0x053D},
	{0x056E, Ll, 0x053E},
	{0x056F, Ll, 0x053F},
	{0x0570, Ll, 0x0540},
	{0x0571, Ll, 0x0541},
	{0x0572, Ll, 0x0542},
	{0x0573, Ll, 0x0543},
	{0x0574, Ll, 0x0544},
	{0x0575, Ll, 0x0545},
	{0x0576, Ll, 0x0546},
	{0x0577, Ll, 0x0547},
	{0x0578, Ll, 0x0548},
	{0x0579, Ll, 0x0549},
	{0x057A, Ll, 0x054A},
	{0x057B, Ll, 0x054B},
	{0x057C, Ll, 0x054C},
	{0x057D, Ll, 0x054D},
	{0x057E, Ll, 0x054E},
	{0x057F, Ll, 0x054F},
	{0x0580, Ll, 0x0550},
	{0x0581, Ll, 0x0551},
	{0x0582, Ll, 0x0552},
	{0x0583, Ll, 0x0553},
	{0x0584, Ll, 0x0554},
	{0x0585, Ll, 0x0555},
	{0x0586, Ll, 0x0556},

	/* Coptic */

	{0x2C80, Lu, 0x2C81},
	{0x2C81, Ll, 0x2C80},
	{0x2C82, Lu, 0x2C83},
	{0x2C83, Ll, 0x2C82},
	{0x2C84, Lu, 0x2C85},
	{0x2C85, Ll, 0x2C84},
	{0x2C86, Lu, 0x2C87},
	{0x2C87, Ll, 0x2C86},
	{0x2C88, Lu, 0x2C89},
	{0x2C89, Ll, 0x2C88},
	{0x2C8A, Lu, 0x2C8B},
	{0x2C8B, Ll, 0x2C8A},
	{0x2C8C, Lu, 0x2C8D},
	{0x2C8D, Ll, 0x2C8C},
	{0x2C8E, Lu, 0x2C8F},
	{0x2C8F, Ll, 0x2C8E},
	{0x2C90, Lu, 0x2C91},
	{0x2C91, Ll, 0x2C90},
	{0x2C92, Lu, 0x2C93},
	{0x2C93, Ll, 0x2C92},
	{0x2C94, Lu, 0x2C95},
	{0x2C95, Ll, 0x2C94},
	{0x2C96, Lu, 0x2C97},
	{0x2C97, Ll, 0x2C96},
	{0x2C98, Lu, 0x2C99},
	{0x2C99, Ll, 0x2C98},
	{0x2C9A, Lu, 0x2C9B},
	{0x2C9B, Ll, 0x2C9A},
	{0x2C9C, Lu, 0x2C9D},
	{0x2C9D, Ll, 0x2C9C},
	{0x2C9E, Lu, 0x2C9F},
	{0x2C9F, Ll, 0x2C9E},
	{0x2CA0, Lu, 0x2CA1},
	{0x2CA1, Ll, 0x2CA0},
	{0x2CA2, Lu, 0x2CA3},
	{0x2CA3, Ll, 0x2CA2},
	{0x2CA4, Lu, 0x2CA5},
	{0x2CA5, Ll, 0x2CA4},
	{0x2CA6, Lu, 0x2CA7},
	{0x2CA7, Ll, 0x2CA6},
	{0x2CA8, Lu, 0x2CA9},
	{0x2CA9, Ll, 0x2CA8},
	{0x2CAA, Lu, 0x2CAB},
	{0x2CAB, Ll, 0x2CAA},
	{0x2CAC, Lu, 0x2CAD},
	{0x2CAD, Ll, 0x2CAC},
	{0x2CAE, Lu, 0x2CAF},
	{0x2CAF, Ll, 0x2CAE},
	{0x2CB0, Lu, 0x2CB1},
	{0x2CB1, Ll, 0x2CB0},


	{0x1E00, Lu, 0x1E01},
	{0x1E01, Ll, 0x1E00},
	{0x1E02, Lu, 0x1E03},
	{0x1E03, Ll, 0x1E02},
	{0x1E04, Lu, 0x1E05},
	{0x1E05, Ll, 0x1E04},
	{0x1E06, Lu, 0x1E07},
	{0x1E07, Ll, 0x1E06},
	{0x1E08, Lu, 0x1E09},
	{0x1E09, Ll, 0x1E08},
	{0x1E0A, Lu, 0x1E0B},
	{0x1E0B, Ll, 0x1E0A},
	{0x1E0C, Lu, 0x1E0D},
	{0x1E0D, Ll, 0x1E0C},
	{0x1E0E, Lu, 0x1E0F},
	{0x1E0F, Ll, 0x1E0E},
	{0x1E10, Lu, 0x1E11},
	{0x1E11, Ll, 0x1E10},
	{0x1E12, Lu, 0x1E13},
	{0x1E13, Ll, 0x1E12},
	{0x1E14, Lu, 0x1E15},
	{0x1E15, Ll, 0x1E14},
	{0x1E16, Lu, 0x1E17},
	{0x1E17, Ll, 0x1E16},
	{0x1E18, Lu, 0x1E19},
	{0x1E19, Ll, 0x1E18},
	{0x1E1A, Lu, 0x1E1B},
	{0x1E1B, Ll, 0x1E1A},
	{0x1E1C, Lu, 0x1E1D},
	{0x1E1D, Ll, 0x1E1C},
	{0x1E1E, Lu, 0x1E1F},
	{0x1E1F, Ll, 0x1E1E},
	{0x1E20, Lu, 0x1E21},
	{0x1E21, Ll, 0x1E20},
	{0x1E22, Lu, 0x1E23},
	{0x1E23, Ll, 0x1E22},
	{0x1E24, Lu, 0x1E25},
	{0x1E25, Ll, 0x1E24},
	{0x1E26, Lu, 0x1E27},
	{0x1E27, Ll, 0x1E26},
	{0x1E28, Lu, 0x1E29},
	{0x1E29, Ll, 0x1E28},
	{0x1E2A, Lu, 0x1E2B},
	{0x1E2B, Ll, 0x1E2A},
	{0x1E2C, Lu, 0x1E2D},
	{0x1E2D, Ll, 0x1E2C},
	{0x1E2E, Lu, 0x1E2F},
	{0x1E2F, Ll, 0x1E2E},
	{0x1E30, Lu, 0x1E31},
	{0x1E31, Ll, 0x1E30},
	{0x1E32, Lu, 0x1E33},
	{0x1E33, Ll, 0x1E32},
	{0x1E34, Lu, 0x1E35},
	{0x1E35, Ll, 0x1E34},
	{0x1E36, Lu, 0x1E37},
	{0x1E37, Ll, 0x1E36},
	{0x1E38, Lu, 0x1E39},
	{0x1E39, Ll, 0x1E38},
	{0x1E3A, Lu, 0x1E3B},
	{0x1E3B, Ll, 0x1E3A},
	{0x1E3C, Lu, 0x1E3D},
	{0x1E3D, Ll, 0x1E3C},
	{0x1E3E, Lu, 0x1E3F},
	{0x1E3F, Ll, 0x1E3E},
	{0x1E40, Lu, 0x1E41},
	{0x1E41, Ll, 0x1E40},
	{0x1E42, Lu, 0x1E43},
	{0x1E43, Ll, 0x1E42},
	{0x1E44, Lu, 0x1E45},
	{0x1E45, Ll, 0x1E44},
	{0x1E46, Lu, 0x1E47},
	{0x1E47, Ll, 0x1E46},
	{0x1E48, Lu, 0x1E49},
	{0x1E49, Ll, 0x1E48},
	{0x1E4A, Lu, 0x1E4B},
	{0x1E4B, Ll, 0x1E4A},
	{0x1E4C, Lu, 0x1E4D},
	{0x1E4D, Ll, 0x1E4C},
	{0x1E4E, Lu, 0x1E4F},
	{0x1E4F, Ll, 0x1E4E},
	{0x1E50, Lu, 0x1E51},
	{0x1E51, Ll, 0x1E50},
	{0x1E52, Lu, 0x1E53},
	{0x1E53, Ll, 0x1E52},
	{0x1E54, Lu, 0x1E55},
	{0x1E55, Ll, 0x1E54},
	{0x1E56, Lu, 0x1E57},
	{0x1E57, Ll, 0x1E56},
	{0x1E58, Lu, 0x1E59},
	{0x1E59, Ll, 0x1E58},
	{0x1E5A, Lu, 0x1E5B},
	{0x1E5B, Ll, 0x1E5A},
	{0x1E5C, Lu, 0x1E5D},
	{0x1E5D, Ll, 0x1E5C},
	{0x1E5E, Lu, 0x1E5F},
	{0x1E5F, Ll, 0x1E5E},
	{0x1E60, Lu, 0x1E61},
	{0x1E61, Ll, 0x1E60},
	{0x1E62, Lu, 0x1E63},
	{0x1E63, Ll, 0x1E62},
	{0x1E64, Lu, 0x1E65},
	{0x1E65, Ll, 0x1E64},
	{0x1E66, Lu, 0x1E67},
	{0x1E67, Ll, 0x1E66},
	{0x1E68, Lu, 0x1E69},
	{0x1E69, Ll, 0x1E68},
	{0x1E6A, Lu, 0x1E6B},
	{0x1E6B, Ll, 0x1E6A},
	{0x1E6C, Lu, 0x1E6D},
	{0x1E6D, Ll, 0x1E6C},
	{0x1E6E, Lu, 0x1E6F},
	{0x1E6F, Ll, 0x1E6E},
	{0x1E70, Lu, 0x1E71},
	{0x1E71, Ll, 0x1E70},
	{0x1E72, Lu, 0x1E73},
	{0x1E73, Ll, 0x1E72},
	{0x1E74, Lu, 0x1E75},
	{0x1E75, Ll, 0x1E74},
	{0x1E76, Lu, 0x1E77},
	{0x1E77, Ll, 0x1E76},
	{0x1E78, Lu, 0x1E79},
	{0x1E79, Ll, 0x1E78},
	{0x1E7A, Lu, 0x1E7B},
	{0x1E7B, Ll, 0x1E7A},
	{0x1E7C, Lu, 0x1E7D},
	{0x1E7D, Ll, 0x1E7C},
	{0x1E7E, Lu, 0x1E7F},
	{0x1E7F, Ll, 0x1E7E},
	{0x1E80, Lu, 0x1E81},
	{0x1E81, Ll, 0x1E80},
	{0x1E82, Lu, 0x1E83},
	{0x1E83, Ll, 0x1E82},
	{0x1E84, Lu, 0x1E85},
	{0x1E85, Ll, 0x1E84},
	{0x1E86, Lu, 0x1E87},
	{0x1E87, Ll, 0x1E86},
	{0x1E88, Lu, 0x1E89},
	{0x1E89, Ll, 0x1E88},
	{0x1E8A, Lu, 0x1E8B},
	{0x1E8B, Ll, 0x1E8A},
	{0x1E8C, Lu, 0x1E8D},
	{0x1E8D, Ll, 0x1E8C},
	{0x1E8E, Lu, 0x1E8F},
	{0x1E8F, Ll, 0x1E8E},
	{0x1E90, Lu, 0x1E91},
	{0x1E91, Ll, 0x1E90},
	{0x1E92, Lu, 0x1E93},
	{0x1E93, Ll, 0x1E92},
	{0x1E94, Lu, 0x1E95},
	{0x1E95, Ll, 0x1E94},
	{0x1E9B, Ll, 0x1E60},
	{0x1EA0, Lu, 0x1EA1},
	{0x1EA1, Ll, 0x1EA0},
	{0x1EA2, Lu, 0x1EA3},
	{0x1EA3, Ll, 0x1EA2},
	{0x1EA4, Lu, 0x1EA5},
	{0x1EA5, Ll, 0x1EA4},
	{0x1EA6, Lu, 0x1EA7},
	{0x1EA7, Ll, 0x1EA6},
	{0x1EA8, Lu, 0x1EA9},
	{0x1EA9, Ll, 0x1EA8},
	{0x1EAA, Lu, 0x1EAB},
	{0x1EAB, Ll, 0x1EAA},
	{0x1EAC, Lu, 0x1EAD},
	{0x1EAD, Ll, 0x1EAC},
	{0x1EAE, Lu, 0x1EAF},
	{0x1EAF, Ll, 0x1EAE},
	{0x1EB0, Lu, 0x1EB1},
	{0x1EB1, Ll, 0x1EB0},
	{0x1EB2, Lu, 0x1EB3},
	{0x1EB3, Ll, 0x1EB2},
	{0x1EB4, Lu, 0x1EB5},
	{0x1EB5, Ll, 0x1EB4},
	{0x1EB6, Lu, 0x1EB7},
	{0x1EB7, Ll, 0x1EB6},
	{0x1EB8, Lu, 0x1EB9},
	{0x1EB9, Ll, 0x1EB8},
	{0x1EBA, Lu, 0x1EBB},
	{0x1EBB, Ll, 0x1EBA},
	{0x1EBC, Lu, 0x1EBD},
	{0x1EBD, Ll, 0x1EBC},
	{0x1EBE, Lu, 0x1EBF},
	{0x1EBF, Ll, 0x1EBE},
	{0x1EC0, Lu, 0x1EC1},
	{0x1EC1, Ll, 0x1EC0},
	{0x1EC2, Lu, 0x1EC3},
	{0x1EC3, Ll, 0x1EC2},
	{0x1EC4, Lu, 0x1EC5},
	{0x1EC5, Ll, 0x1EC4},
	{0x1EC6, Lu, 0x1EC7},
	{0x1EC7, Ll, 0x1EC6},
	{0x1EC8, Lu, 0x1EC9},
	{0x1EC9, Ll, 0x1EC8},
	{0x1ECA, Lu, 0x1ECB},
	{0x1ECB, Ll, 0x1ECA},
	{0x1ECC, Lu, 0x1ECD},
	{0x1ECD, Ll, 0x1ECC},
	{0x1ECE, Lu, 0x1ECF},
	{0x1ECF, Ll, 0x1ECE},
	{0x1ED0, Lu, 0x1ED1},
	{0x1ED1, Ll, 0x1ED0},
	{0x1ED2, Lu, 0x1ED3},
	{0x1ED3, Ll, 0x1ED2},
	{0x1ED4, Lu, 0x1ED5},
	{0x1ED5, Ll, 0x1ED4},
	{0x1ED6, Lu, 0x1ED7},
	{0x1ED7, Ll, 0x1ED6},
	{0x1ED8, Lu, 0x1ED9},
	{0x1ED9, Ll, 0x1ED8},
	{0x1EDA, Lu, 0x1EDB},
	{0x1EDB, Ll, 0x1EDA},
	{0x1EDC, Lu, 0x1EDD},
	{0x1EDD, Ll, 0x1EDC},
	{0x1EDE, Lu, 0x1EDF},
	{0x1EDF, Ll, 0x1EDE},
	{0x1EE0, Lu, 0x1EE1},
	{0x1EE1, Ll, 0x1EE0},
	{0x1EE2, Lu, 0x1EE3},
	{0x1EE3, Ll, 0x1EE2},
	{0x1EE4, Lu, 0x1EE5},
	{0x1EE5, Ll, 0x1EE4},
	{0x1EE6, Lu, 0x1EE7},
	{0x1EE7, Ll, 0x1EE6},
	{0x1EE8, Lu, 0x1EE9},
	{0x1EE9, Ll, 0x1EE8},
	{0x1EEA, Lu, 0x1EEB},
	{0x1EEB, Ll, 0x1EEA},
	{0x1EEC, Lu, 0x1EED},
	{0x1EED, Ll, 0x1EEC},
	{0x1EEE, Lu, 0x1EEF},
	{0x1EEF, Ll, 0x1EEE},
	{0x1EF0, Lu, 0x1EF1},
	{0x1EF1, Ll, 0x1EF0},
	{0x1EF2, Lu, 0x1EF3},
	{0x1EF3, Ll, 0x1EF2},
	{0x1EF4, Lu, 0x1EF5},
	{0x1EF5, Ll, 0x1EF4},
	{0x1EF6, Lu, 0x1EF7},
	{0x1EF7, Ll, 0x1EF6},
	{0x1EF8, Lu, 0x1EF9},
	{0x1EF9, Ll, 0x1EF8},
	{0x1F00, Ll, 0x1F08},
	{0x1F01, Ll, 0x1F09},
	{0x1F02, Ll, 0x1F0A},
	{0x1F03, Ll, 0x1F0B},
	{0x1F04, Ll, 0x1F0C},
	{0x1F05, Ll, 0x1F0D},
	{0x1F06, Ll, 0x1F0E},
	{0x1F07, Ll, 0x1F0F},
	{0x1F08, Lu, 0x1F00},
	{0x1F09, Lu, 0x1F01},
	{0x1F0A, Lu, 0x1F02},
	{0x1F0B, Lu, 0x1F03},
	{0x1F0C, Lu, 0x1F04},
	{0x1F0D, Lu, 0x1F05},
	{0x1F0E, Lu, 0x1F06},
	{0x1F0F, Lu, 0x1F07},
	{0x1F10, Ll, 0x1F18},
	{0x1F11, Ll, 0x1F19},
	{0x1F12, Ll, 0x1F1A},
	{0x1F13, Ll, 0x1F1B},
	{0x1F14, Ll, 0x1F1C},
	{0x1F15, Ll, 0x1F1D},
	{0x1F18, Lu, 0x1F10},
	{0x1F19, Lu, 0x1F11},
	{0x1F1A, Lu, 0x1F12},
	{0x1F1B, Lu, 0x1F13},
	{0x1F1C, Lu, 0x1F14},
	{0x1F1D, Lu, 0x1F15},
	{0x1F20, Ll, 0x1F28},
	{0x1F21, Ll, 0x1F29},
	{0x1F22, Ll, 0x1F2A},
	{0x1F23, Ll, 0x1F2B},
	{0x1F24, Ll, 0x1F2C},
	{0x1F25, Ll, 0x1F2D},
	{0x1F26, Ll, 0x1F2E},
	{0x1F27, Ll, 0x1F2F},
	{0x1F28, Lu, 0x1F20},
	{0x1F29, Lu, 0x1F21},
	{0x1F2A, Lu, 0x1F22},
	{0x1F2B, Lu, 0x1F23},
	{0x1F2C, Lu, 0x1F24},
	{0x1F2D, Lu, 0x1F25},
	{0x1F2E, Lu, 0x1F26},
	{0x1F2F, Lu, 0x1F27},
	{0x1F30, Ll, 0x1F38},
	{0x1F31, Ll, 0x1F39},
	{0x1F32, Ll, 0x1F3A},
	{0x1F33, Ll, 0x1F3B},
	{0x1F34, Ll, 0x1F3C},
	{0x1F35, Ll, 0x1F3D},
	{0x1F36, Ll, 0x1F3E},
	{0x1F37, Ll, 0x1F3F},
	{0x1F38, Lu, 0x1F30},
	{0x1F39, Lu, 0x1F31},
	{0x1F3A, Lu, 0x1F32},
	{0x1F3B, Lu, 0x1F33},
	{0x1F3C, Lu, 0x1F34},
	{0x1F3D, Lu, 0x1F35},
	{0x1F3E, Lu, 0x1F36},
	{0x1F3F, Lu, 0x1F37},
	{0x1F40, Ll, 0x1F48},
	{0x1F41, Ll, 0x1F49},
	{0x1F42, Ll, 0x1F4A},
	{0x1F43, Ll, 0x1F4B},
	{0x1F44, Ll, 0x1F4C},
	{0x1F45, Ll, 0x1F4D},
	{0x1F48, Lu, 0x1F40},
	{0x1F49, Lu, 0x1F41},
	{0x1F4A, Lu, 0x1F42},
	{0x1F4B, Lu, 0x1F43},
	{0x1F4C, Lu, 0x1F44},
	{0x1F4D, Lu, 0x1F45},
	{0x1F51, Ll, 0x1F59},
	{0x1F53, Ll, 0x1F5B},
	{0x1F55, Ll, 0x1F5D},
	{0x1F57, Ll, 0x1F5F},
	{0x1F59, Lu, 0x1F51},
	{0x1F5B, Lu, 0x1F53},
	{0x1F5D, Lu, 0x1F55},
	{0x1F5F, Lu, 0x1F57},
	{0x1F60, Ll, 0x1F68},
	{0x1F61, Ll, 0x1F69},
	{0x1F62, Ll, 0x1F6A},
	{0x1F63, Ll, 0x1F6B},
	{0x1F64, Ll, 0x1F6C},
	{0x1F65, Ll, 0x1F6D},
	{0x1F66, Ll, 0x1F6E},
	{0x1F67, Ll, 0x1F6F},
	{0x1F68, Lu, 0x1F60},
	{0x1F69, Lu, 0x1F61},
	{0x1F6A, Lu, 0x1F62},
	{0x1F6B, Lu, 0x1F63},
	{0x1F6C, Lu, 0x1F64},
	{0x1F6D, Lu, 0x1F65},
	{0x1F6E, Lu, 0x1F66},
	{0x1F6F, Lu, 0x1F67},
	{0x1F70, Ll, 0x1FBA},
	{0x1F71, Ll, 0x1FBB},
	{0x1F72, Ll, 0x1FC8},
	{0x1F73, Ll, 0x1FC9},
	{0x1F74, Ll, 0x1FCA},
	{0x1F75, Ll, 0x1FCB},
	{0x1F76, Ll, 0x1FDA},
	{0x1F77, Ll, 0x1FDB},
	{0x1F78, Ll, 0x1FF8},
	{0x1F79, Ll, 0x1FF9},
	{0x1F7A, Ll, 0x1FEA},
	{0x1F7B, Ll, 0x1FEB},
	{0x1F7C, Ll, 0x1FFA},
	{0x1F7D, Ll, 0x1FFB},
	{0x1F80, Ll, 0x1F88},
	{0x1F81, Ll, 0x1F89},
	{0x1F82, Ll, 0x1F8A},
	{0x1F83, Ll, 0x1F8B},
	{0x1F84, Ll, 0x1F8C},
	{0x1F85, Ll, 0x1F8D},
	{0x1F86, Ll, 0x1F8E},
	{0x1F87, Ll, 0x1F8F},
	{0x1F90, Ll, 0x1F98},
	{0x1F91, Ll, 0x1F99},
	{0x1F92, Ll, 0x1F9A},
	{0x1F93, Ll, 0x1F9B},
	{0x1F94, Ll, 0x1F9C},
	{0x1F95, Ll, 0x1F9D},
	{0x1F96, Ll, 0x1F9E},
	{0x1F97, Ll, 0x1F9F},
	{0x1FA0, Ll, 0x1FA8},
	{0x1FA1, Ll, 0x1FA9},
	{0x1FA2, Ll, 0x1FAA},
	{0x1FA3, Ll, 0x1FAB},
	{0x1FA4, Ll, 0x1FAC},
	{0x1FA5, Ll, 0x1FAD},
	{0x1FA6, Ll, 0x1FAE},
	{0x1FA7, Ll, 0x1FAF},
	{0x1FB0, Ll, 0x1FB8},
	{0x1FB1, Ll, 0x1FB9},
	{0x1FB3, Ll, 0x1FBC},
	{0x1FB8, Lu, 0x1FB0},
	{0x1FB9, Lu, 0x1FB1},
	{0x1FBA, Lu, 0x1F70},
	{0x1FBB, Lu, 0x1F71},
	{0x1FBE, Ll, 0x0399},
	{0x1FC3, Ll, 0x1FCC},
	{0x1FC8, Lu, 0x1F72},
	{0x1FC9, Lu, 0x1F73},
	{0x1FCA, Lu, 0x1F74},
	{0x1FCB, Lu, 0x1F75},
	{0x1FD0, Ll, 0x1FD8},
	{0x1FD1, Ll, 0x1FD9},
	{0x1FD8, Lu, 0x1FD0},
	{0x1FD9, Lu, 0x1FD1},
	{0x1FDA, Lu, 0x1F76},
	{0x1FDB, Lu, 0x1F77},
	{0x1FE0, Ll, 0x1FE8},
	{0x1FE1, Ll, 0x1FE9},
	{0x1FE5, Ll, 0x1FEC},
	{0x1FE8, Lu, 0x1FE0},
	{0x1FE9, Lu, 0x1FE1},
	{0x1FEA, Lu, 0x1F7A},
	{0x1FEB, Lu, 0x1F7B},
	{0x1FEC, Lu, 0x1FE5},
	{0x1FF3, Ll, 0x1FFC},
	{0x1FF8, Lu, 0x1F78},
	{0x1FF9, Lu, 0x1F79},
	{0x1FFA, Lu, 0x1F7C},
	{0x1FFB, Lu, 0x1F7D},
	{0x2126, Lu, 0x03C9},
	{0x212A, Lu, 0x006B},
	{0x212B, Lu, 0x00E5},
	{0xFF21, Lu, 0xFF41},
	{0xFF22, Lu, 0xFF42},
	{0xFF23, Lu, 0xFF43},
	{0xFF24, Lu, 0xFF44},
	{0xFF25, Lu, 0xFF45},
	{0xFF26, Lu, 0xFF46},
	{0xFF27, Lu, 0xFF47},
	{0xFF28, Lu, 0xFF48},
	{0xFF29, Lu, 0xFF49},
	{0xFF2A, Lu, 0xFF4A},
	{0xFF2B, Lu, 0xFF4B},
	{0xFF2C, Lu, 0xFF4C},
	{0xFF2D, Lu, 0xFF4D},
	{0xFF2E, Lu, 0xFF4E},
	{0xFF2F, Lu, 0xFF4F},
	{0xFF30, Lu, 0xFF50},
	{0xFF31, Lu, 0xFF51},
	{0xFF32, Lu, 0xFF52},
	{0xFF33, Lu, 0xFF53},
	{0xFF34, Lu, 0xFF54},
	{0xFF35, Lu, 0xFF55},
	{0xFF36, Lu, 0xFF56},
	{0xFF37, Lu, 0xFF57},
	{0xFF38, Lu, 0xFF58},
	{0xFF39, Lu, 0xFF59},
	{0xFF3A, Lu, 0xFF5A},
	{0xFF41, Ll, 0xFF21},
	{0xFF42, Ll, 0xFF22},
	{0xFF43, Ll, 0xFF23},
	{0xFF44, Ll, 0xFF24},
	{0xFF45, Ll, 0xFF25},
	{0xFF46, Ll, 0xFF26},
	{0xFF47, Ll, 0xFF27},
	{0xFF48, Ll, 0xFF28},
	{0xFF49, Ll, 0xFF29},
	{0xFF4A, Ll, 0xFF2A},
	{0xFF4B, Ll, 0xFF2B},
	{0xFF4C, Ll, 0xFF2C},
	{0xFF4D, Ll, 0xFF2D},
	{0xFF4E, Ll, 0xFF2E},
	{0xFF4F, Ll, 0xFF2F},
	{0xFF50, Ll, 0xFF30},
	{0xFF51, Ll, 0xFF31},
	{0xFF52, Ll, 0xFF32},
	{0xFF53, Ll, 0xFF33},
	{0xFF54, Ll, 0xFF34},
	{0xFF55, Ll, 0xFF35},
	{0xFF56, Ll, 0xFF36},
	{0xFF57, Ll, 0xFF37},
	{0xFF58, Ll, 0xFF38},
	{0xFF59, Ll, 0xFF39},
	{0xFF5A, Ll, 0xFF3A}
};

#undef Lu
#undef Ll

struct ucs_range
{
	UT_UCSChar low;
	UT_UCSChar high;
};

ucs_range whitespace_table[] =
{
	{0x0009, 0x000d},
	{0x001c, 0x0020},
	{0x0085, 0x0085},
	{0x00A0, 0x00A0}, // had to add this by hand, for some reason in Unicode 3.1 it is marked as CS, not WS
	{0x1680, 0x1680},
	{0x2000, 0x200a},
	{0x2028, 0x2029},
	{0x202f, 0x202f},
	{0x3000, 0x3000}
};
#endif