1/*
2 * Copyright (c) 2009, 2016, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation.  Oracle designates this
8 * particular file as subject to the "Classpath" exception as provided
9 * by Oracle in the LICENSE file that accompanied this code.
10 *
11 * This code is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
14 * version 2 for more details (a copy is included in the LICENSE file that
15 * accompanied this code).
16 *
17 * You should have received a copy of the GNU General Public License version
18 * 2 along with this work; if not, write to the Free Software Foundation,
19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20 *
21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22 * or visit www.oracle.com if you need additional information or have any
23 * questions.
24 */
25package sun.awt;
26
27import java.util.Collections;
28import java.util.HashMap;
29import java.util.HashSet;
30import java.awt.event.KeyEvent;
31
32public class ExtendedKeyCodes {
33    /**
34     * ATTN: These are the readonly hashes with load factor == 1;
35     * adding a value, please set the inital capacity to exact number of items
36     * or higher.
37     */
38     // Keycodes declared in KeyEvent.java with corresponding Unicode values.
39     private static final HashMap<Integer, Integer>  regularKeyCodesMap =
40                                          new HashMap<Integer,Integer>(98, 1.0f);
41
42     // Keycodes derived from Unicode values. Here should be collected codes
43     // for characters appearing on the primary layer of at least one
44     // known keyboard layout. For instance, sterling sign is on the primary layer
45     // of the Mac Italian layout.
46     private static final HashSet<Integer> extendedKeyCodesSet =
47                                                  new HashSet<Integer>(501, 1.0f);
48     public static final int getExtendedKeyCodeForChar( int c ) {
49         int uc = Character.toUpperCase( c );
50         int lc = Character.toLowerCase( c );
51         if (regularKeyCodesMap.containsKey( c )) {
52             if(regularKeyCodesMap.containsKey(uc)) {
53                 return regularKeyCodesMap.get( uc );
54             }
55             return regularKeyCodesMap.get( c );
56         }
57         uc += 0x01000000;
58         lc += 0x01000000;
59         if (extendedKeyCodesSet.contains( uc )) {
60             return uc;
61         }else if (extendedKeyCodesSet.contains( lc )) {
62             return lc;
63         }
64         return KeyEvent.VK_UNDEFINED;
65     }
66     static {
67         regularKeyCodesMap.put(0x08, KeyEvent.VK_BACK_SPACE);
68         regularKeyCodesMap.put(0x09, KeyEvent.VK_TAB);
69         regularKeyCodesMap.put(0x0a, KeyEvent.VK_ENTER);
70         regularKeyCodesMap.put(0x1B, KeyEvent.VK_ESCAPE);
71         regularKeyCodesMap.put(0x20AC, KeyEvent.VK_EURO_SIGN);
72         regularKeyCodesMap.put(0x20, KeyEvent.VK_SPACE);
73         regularKeyCodesMap.put(0x21, KeyEvent.VK_EXCLAMATION_MARK);
74         regularKeyCodesMap.put(0x22, KeyEvent.VK_QUOTEDBL);
75         regularKeyCodesMap.put(0x23, KeyEvent.VK_NUMBER_SIGN);
76         regularKeyCodesMap.put(0x24, KeyEvent.VK_DOLLAR);
77         regularKeyCodesMap.put(0x26, KeyEvent.VK_AMPERSAND);
78         regularKeyCodesMap.put(0x27, KeyEvent.VK_QUOTE);
79         regularKeyCodesMap.put(0x28, KeyEvent.VK_LEFT_PARENTHESIS);
80         regularKeyCodesMap.put(0x29, KeyEvent.VK_RIGHT_PARENTHESIS);
81         regularKeyCodesMap.put(0x2A, KeyEvent.VK_ASTERISK);
82         regularKeyCodesMap.put(0x2B, KeyEvent.VK_PLUS);
83         regularKeyCodesMap.put(0x2C, KeyEvent.VK_COMMA);
84         regularKeyCodesMap.put(0x2D, KeyEvent.VK_MINUS);
85         regularKeyCodesMap.put(0x2E, KeyEvent.VK_PERIOD);
86         regularKeyCodesMap.put(0x2F, KeyEvent.VK_SLASH);
87         regularKeyCodesMap.put(0x30, KeyEvent.VK_0);
88         regularKeyCodesMap.put(0x31, KeyEvent.VK_1);
89         regularKeyCodesMap.put(0x32, KeyEvent.VK_2);
90         regularKeyCodesMap.put(0x33, KeyEvent.VK_3);
91         regularKeyCodesMap.put(0x34, KeyEvent.VK_4);
92         regularKeyCodesMap.put(0x35, KeyEvent.VK_5);
93         regularKeyCodesMap.put(0x36, KeyEvent.VK_6);
94         regularKeyCodesMap.put(0x37, KeyEvent.VK_7);
95         regularKeyCodesMap.put(0x38, KeyEvent.VK_8);
96         regularKeyCodesMap.put(0x39, KeyEvent.VK_9);
97         regularKeyCodesMap.put(0x3A, KeyEvent.VK_COLON);
98         regularKeyCodesMap.put(0x3B, KeyEvent.VK_SEMICOLON);
99         regularKeyCodesMap.put(0x3C, KeyEvent.VK_LESS);
100         regularKeyCodesMap.put(0x3D, KeyEvent.VK_EQUALS);
101         regularKeyCodesMap.put(0x3E, KeyEvent.VK_GREATER);
102         regularKeyCodesMap.put(0x40, KeyEvent.VK_AT);
103         regularKeyCodesMap.put(0x41, KeyEvent.VK_A);
104         regularKeyCodesMap.put(0x42, KeyEvent.VK_B);
105         regularKeyCodesMap.put(0x43, KeyEvent.VK_C);
106         regularKeyCodesMap.put(0x44, KeyEvent.VK_D);
107         regularKeyCodesMap.put(0x45, KeyEvent.VK_E);
108         regularKeyCodesMap.put(0x46, KeyEvent.VK_F);
109         regularKeyCodesMap.put(0x47, KeyEvent.VK_G);
110         regularKeyCodesMap.put(0x48, KeyEvent.VK_H);
111         regularKeyCodesMap.put(0x49, KeyEvent.VK_I);
112         regularKeyCodesMap.put(0x4A, KeyEvent.VK_J);
113         regularKeyCodesMap.put(0x4B, KeyEvent.VK_K);
114         regularKeyCodesMap.put(0x4C, KeyEvent.VK_L);
115         regularKeyCodesMap.put(0x4D, KeyEvent.VK_M);
116         regularKeyCodesMap.put(0x4E, KeyEvent.VK_N);
117         regularKeyCodesMap.put(0x4F, KeyEvent.VK_O);
118         regularKeyCodesMap.put(0x50, KeyEvent.VK_P);
119         regularKeyCodesMap.put(0x51, KeyEvent.VK_Q);
120         regularKeyCodesMap.put(0x52, KeyEvent.VK_R);
121         regularKeyCodesMap.put(0x53, KeyEvent.VK_S);
122         regularKeyCodesMap.put(0x54, KeyEvent.VK_T);
123         regularKeyCodesMap.put(0x55, KeyEvent.VK_U);
124         regularKeyCodesMap.put(0x56, KeyEvent.VK_V);
125         regularKeyCodesMap.put(0x57, KeyEvent.VK_W);
126         regularKeyCodesMap.put(0x58, KeyEvent.VK_X);
127         regularKeyCodesMap.put(0x59, KeyEvent.VK_Y);
128         regularKeyCodesMap.put(0x5A, KeyEvent.VK_Z);
129         regularKeyCodesMap.put(0x5B, KeyEvent.VK_OPEN_BRACKET);
130         regularKeyCodesMap.put(0x5C, KeyEvent.VK_BACK_SLASH);
131         regularKeyCodesMap.put(0x5D, KeyEvent.VK_CLOSE_BRACKET);
132         regularKeyCodesMap.put(0x5E, KeyEvent.VK_CIRCUMFLEX);
133         regularKeyCodesMap.put(0x5F, KeyEvent.VK_UNDERSCORE);
134         regularKeyCodesMap.put(0x60, KeyEvent.VK_BACK_QUOTE);
135         regularKeyCodesMap.put(0x61, KeyEvent.VK_A);
136         regularKeyCodesMap.put(0x62, KeyEvent.VK_B);
137         regularKeyCodesMap.put(0x63, KeyEvent.VK_C);
138         regularKeyCodesMap.put(0x64, KeyEvent.VK_D);
139         regularKeyCodesMap.put(0x65, KeyEvent.VK_E);
140         regularKeyCodesMap.put(0x66, KeyEvent.VK_F);
141         regularKeyCodesMap.put(0x67, KeyEvent.VK_G);
142         regularKeyCodesMap.put(0x68, KeyEvent.VK_H);
143         regularKeyCodesMap.put(0x69, KeyEvent.VK_I);
144         regularKeyCodesMap.put(0x6A, KeyEvent.VK_J);
145         regularKeyCodesMap.put(0x6B, KeyEvent.VK_K);
146         regularKeyCodesMap.put(0x6C, KeyEvent.VK_L);
147         regularKeyCodesMap.put(0x6D, KeyEvent.VK_M);
148         regularKeyCodesMap.put(0x6E, KeyEvent.VK_N);
149         regularKeyCodesMap.put(0x6F, KeyEvent.VK_O);
150         regularKeyCodesMap.put(0x70, KeyEvent.VK_P);
151         regularKeyCodesMap.put(0x71, KeyEvent.VK_Q);
152         regularKeyCodesMap.put(0x72, KeyEvent.VK_R);
153         regularKeyCodesMap.put(0x73, KeyEvent.VK_S);
154         regularKeyCodesMap.put(0x74, KeyEvent.VK_T);
155         regularKeyCodesMap.put(0x75, KeyEvent.VK_U);
156         regularKeyCodesMap.put(0x76, KeyEvent.VK_V);
157         regularKeyCodesMap.put(0x77, KeyEvent.VK_W);
158         regularKeyCodesMap.put(0x78, KeyEvent.VK_X);
159         regularKeyCodesMap.put(0x79, KeyEvent.VK_Y);
160         regularKeyCodesMap.put(0x7A, KeyEvent.VK_Z);
161         regularKeyCodesMap.put(0x7B, KeyEvent.VK_BRACELEFT);
162         regularKeyCodesMap.put(0x7D, KeyEvent.VK_BRACERIGHT);
163         regularKeyCodesMap.put(0x7F, KeyEvent.VK_DELETE);
164         regularKeyCodesMap.put(0xA1, KeyEvent.VK_INVERTED_EXCLAMATION_MARK);
165
166         extendedKeyCodesSet.add(0x01000000+0x0060);
167         extendedKeyCodesSet.add(0x01000000+0x007C);
168         extendedKeyCodesSet.add(0x01000000+0x007E);
169         extendedKeyCodesSet.add(0x01000000+0x00A2);
170         extendedKeyCodesSet.add(0x01000000+0x00A3);
171         extendedKeyCodesSet.add(0x01000000+0x00A5);
172         extendedKeyCodesSet.add(0x01000000+0x00A7);
173         extendedKeyCodesSet.add(0x01000000+0x00A8);
174         extendedKeyCodesSet.add(0x01000000+0x00AB);
175         extendedKeyCodesSet.add(0x01000000+0x00B0);
176         extendedKeyCodesSet.add(0x01000000+0x00B1);
177         extendedKeyCodesSet.add(0x01000000+0x00B2);
178         extendedKeyCodesSet.add(0x01000000+0x00B3);
179         extendedKeyCodesSet.add(0x01000000+0x00B4);
180         extendedKeyCodesSet.add(0x01000000+0x00B5);
181         extendedKeyCodesSet.add(0x01000000+0x00B6);
182         extendedKeyCodesSet.add(0x01000000+0x00B7);
183         extendedKeyCodesSet.add(0x01000000+0x00B9);
184         extendedKeyCodesSet.add(0x01000000+0x00BA);
185         extendedKeyCodesSet.add(0x01000000+0x00BB);
186         extendedKeyCodesSet.add(0x01000000+0x00BC);
187         extendedKeyCodesSet.add(0x01000000+0x00BD);
188         extendedKeyCodesSet.add(0x01000000+0x00BE);
189         extendedKeyCodesSet.add(0x01000000+0x00BF);
190         extendedKeyCodesSet.add(0x01000000+0x00C4);
191         extendedKeyCodesSet.add(0x01000000+0x00C5);
192         extendedKeyCodesSet.add(0x01000000+0x00C6);
193         extendedKeyCodesSet.add(0x01000000+0x00C7);
194         extendedKeyCodesSet.add(0x01000000+0x00D1);
195         extendedKeyCodesSet.add(0x01000000+0x00D6);
196         extendedKeyCodesSet.add(0x01000000+0x00D7);
197         extendedKeyCodesSet.add(0x01000000+0x00D8);
198         extendedKeyCodesSet.add(0x01000000+0x00DF);
199         extendedKeyCodesSet.add(0x01000000+0x00E0);
200         extendedKeyCodesSet.add(0x01000000+0x00E1);
201         extendedKeyCodesSet.add(0x01000000+0x00E2);
202         extendedKeyCodesSet.add(0x01000000+0x00E4);
203         extendedKeyCodesSet.add(0x01000000+0x00E5);
204         extendedKeyCodesSet.add(0x01000000+0x00E6);
205         extendedKeyCodesSet.add(0x01000000+0x00E7);
206         extendedKeyCodesSet.add(0x01000000+0x00E8);
207         extendedKeyCodesSet.add(0x01000000+0x00E9);
208         extendedKeyCodesSet.add(0x01000000+0x00EA);
209         extendedKeyCodesSet.add(0x01000000+0x00EB);
210         extendedKeyCodesSet.add(0x01000000+0x00EC);
211         extendedKeyCodesSet.add(0x01000000+0x00ED);
212         extendedKeyCodesSet.add(0x01000000+0x00EE);
213         extendedKeyCodesSet.add(0x01000000+0x00F0);
214         extendedKeyCodesSet.add(0x01000000+0x00F1);
215         extendedKeyCodesSet.add(0x01000000+0x00F2);
216         extendedKeyCodesSet.add(0x01000000+0x00F3);
217         extendedKeyCodesSet.add(0x01000000+0x00F4);
218         extendedKeyCodesSet.add(0x01000000+0x00F5);
219         extendedKeyCodesSet.add(0x01000000+0x00F6);
220         extendedKeyCodesSet.add(0x01000000+0x00F7);
221         extendedKeyCodesSet.add(0x01000000+0x00F8);
222         extendedKeyCodesSet.add(0x01000000+0x00F9);
223         extendedKeyCodesSet.add(0x01000000+0x00FA);
224         extendedKeyCodesSet.add(0x01000000+0x00FB);
225         extendedKeyCodesSet.add(0x01000000+0x00FC);
226         extendedKeyCodesSet.add(0x01000000+0x00FD);
227         extendedKeyCodesSet.add(0x01000000+0x00FE);
228         extendedKeyCodesSet.add(0x01000000+0x0105);
229         extendedKeyCodesSet.add(0x01000000+0x02DB);
230         extendedKeyCodesSet.add(0x01000000+0x0142);
231         extendedKeyCodesSet.add(0x01000000+0x013E);
232         extendedKeyCodesSet.add(0x01000000+0x015B);
233         extendedKeyCodesSet.add(0x01000000+0x0161);
234         extendedKeyCodesSet.add(0x01000000+0x015F);
235         extendedKeyCodesSet.add(0x01000000+0x0165);
236         extendedKeyCodesSet.add(0x01000000+0x017E);
237         extendedKeyCodesSet.add(0x01000000+0x017C);
238         extendedKeyCodesSet.add(0x01000000+0x0103);
239         extendedKeyCodesSet.add(0x01000000+0x0107);
240         extendedKeyCodesSet.add(0x01000000+0x010D);
241         extendedKeyCodesSet.add(0x01000000+0x0119);
242         extendedKeyCodesSet.add(0x01000000+0x011B);
243         extendedKeyCodesSet.add(0x01000000+0x0111);
244         extendedKeyCodesSet.add(0x01000000+0x0148);
245         extendedKeyCodesSet.add(0x01000000+0x0151);
246         extendedKeyCodesSet.add(0x01000000+0x0171);
247         extendedKeyCodesSet.add(0x01000000+0x0159);
248         extendedKeyCodesSet.add(0x01000000+0x016F);
249         extendedKeyCodesSet.add(0x01000000+0x0163);
250         extendedKeyCodesSet.add(0x01000000+0x02D9);
251         extendedKeyCodesSet.add(0x01000000+0x0130);
252         extendedKeyCodesSet.add(0x01000000+0x0127);
253         extendedKeyCodesSet.add(0x01000000+0x0125);
254         extendedKeyCodesSet.add(0x01000000+0x0131);
255         extendedKeyCodesSet.add(0x01000000+0x011F);
256         extendedKeyCodesSet.add(0x01000000+0x0135);
257         extendedKeyCodesSet.add(0x01000000+0x010B);
258         extendedKeyCodesSet.add(0x01000000+0x0109);
259         extendedKeyCodesSet.add(0x01000000+0x0121);
260         extendedKeyCodesSet.add(0x01000000+0x011D);
261         extendedKeyCodesSet.add(0x01000000+0x016D);
262         extendedKeyCodesSet.add(0x01000000+0x015D);
263         extendedKeyCodesSet.add(0x01000000+0x0138);
264         extendedKeyCodesSet.add(0x01000000+0x0157);
265         extendedKeyCodesSet.add(0x01000000+0x013C);
266         extendedKeyCodesSet.add(0x01000000+0x0113);
267         extendedKeyCodesSet.add(0x01000000+0x0123);
268         extendedKeyCodesSet.add(0x01000000+0x0167);
269         extendedKeyCodesSet.add(0x01000000+0x014B);
270         extendedKeyCodesSet.add(0x01000000+0x0101);
271         extendedKeyCodesSet.add(0x01000000+0x012F);
272         extendedKeyCodesSet.add(0x01000000+0x0117);
273         extendedKeyCodesSet.add(0x01000000+0x012B);
274         extendedKeyCodesSet.add(0x01000000+0x0146);
275         extendedKeyCodesSet.add(0x01000000+0x014D);
276         extendedKeyCodesSet.add(0x01000000+0x0137);
277         extendedKeyCodesSet.add(0x01000000+0x0173);
278         extendedKeyCodesSet.add(0x01000000+0x016B);
279         extendedKeyCodesSet.add(0x01000000+0x0153);
280         extendedKeyCodesSet.add(0x01000000+0x30FC);
281         extendedKeyCodesSet.add(0x01000000+0x30A2);
282         extendedKeyCodesSet.add(0x01000000+0x30A4);
283         extendedKeyCodesSet.add(0x01000000+0x30A6);
284         extendedKeyCodesSet.add(0x01000000+0x30A8);
285         extendedKeyCodesSet.add(0x01000000+0x30AA);
286         extendedKeyCodesSet.add(0x01000000+0x30AB);
287         extendedKeyCodesSet.add(0x01000000+0x30AD);
288         extendedKeyCodesSet.add(0x01000000+0x30AF);
289         extendedKeyCodesSet.add(0x01000000+0x30B1);
290         extendedKeyCodesSet.add(0x01000000+0x30B3);
291         extendedKeyCodesSet.add(0x01000000+0x30B5);
292         extendedKeyCodesSet.add(0x01000000+0x30B7);
293         extendedKeyCodesSet.add(0x01000000+0x30B9);
294         extendedKeyCodesSet.add(0x01000000+0x30BB);
295         extendedKeyCodesSet.add(0x01000000+0x30BD);
296         extendedKeyCodesSet.add(0x01000000+0x30BF);
297         extendedKeyCodesSet.add(0x01000000+0x30C1);
298         extendedKeyCodesSet.add(0x01000000+0x30C4);
299         extendedKeyCodesSet.add(0x01000000+0x30C6);
300         extendedKeyCodesSet.add(0x01000000+0x30C8);
301         extendedKeyCodesSet.add(0x01000000+0x30CA);
302         extendedKeyCodesSet.add(0x01000000+0x30CB);
303         extendedKeyCodesSet.add(0x01000000+0x30CC);
304         extendedKeyCodesSet.add(0x01000000+0x30CD);
305         extendedKeyCodesSet.add(0x01000000+0x30CE);
306         extendedKeyCodesSet.add(0x01000000+0x30CF);
307         extendedKeyCodesSet.add(0x01000000+0x30D2);
308         extendedKeyCodesSet.add(0x01000000+0x30D5);
309         extendedKeyCodesSet.add(0x01000000+0x30D8);
310         extendedKeyCodesSet.add(0x01000000+0x30DB);
311         extendedKeyCodesSet.add(0x01000000+0x30DE);
312         extendedKeyCodesSet.add(0x01000000+0x30DF);
313         extendedKeyCodesSet.add(0x01000000+0x30E0);
314         extendedKeyCodesSet.add(0x01000000+0x30E1);
315         extendedKeyCodesSet.add(0x01000000+0x30E2);
316         extendedKeyCodesSet.add(0x01000000+0x30E4);
317         extendedKeyCodesSet.add(0x01000000+0x30E6);
318         extendedKeyCodesSet.add(0x01000000+0x30E8);
319         extendedKeyCodesSet.add(0x01000000+0x30E9);
320         extendedKeyCodesSet.add(0x01000000+0x30EA);
321         extendedKeyCodesSet.add(0x01000000+0x30EB);
322         extendedKeyCodesSet.add(0x01000000+0x30EC);
323         extendedKeyCodesSet.add(0x01000000+0x30ED);
324         extendedKeyCodesSet.add(0x01000000+0x30EF);
325         extendedKeyCodesSet.add(0x01000000+0x30F3);
326         extendedKeyCodesSet.add(0x01000000+0x309B);
327         extendedKeyCodesSet.add(0x01000000+0x309C);
328         extendedKeyCodesSet.add(0x01000000+0x06F0);
329         extendedKeyCodesSet.add(0x01000000+0x06F1);
330         extendedKeyCodesSet.add(0x01000000+0x06F2);
331         extendedKeyCodesSet.add(0x01000000+0x06F3);
332         extendedKeyCodesSet.add(0x01000000+0x06F4);
333         extendedKeyCodesSet.add(0x01000000+0x06F5);
334         extendedKeyCodesSet.add(0x01000000+0x06F6);
335         extendedKeyCodesSet.add(0x01000000+0x06F7);
336         extendedKeyCodesSet.add(0x01000000+0x06F8);
337         extendedKeyCodesSet.add(0x01000000+0x06F9);
338         extendedKeyCodesSet.add(0x01000000+0x0670);
339         extendedKeyCodesSet.add(0x01000000+0x067E);
340         extendedKeyCodesSet.add(0x01000000+0x0686);
341         extendedKeyCodesSet.add(0x01000000+0x060C);
342         extendedKeyCodesSet.add(0x01000000+0x06D4);
343         extendedKeyCodesSet.add(0x01000000+0x0660);
344         extendedKeyCodesSet.add(0x01000000+0x0661);
345         extendedKeyCodesSet.add(0x01000000+0x0662);
346         extendedKeyCodesSet.add(0x01000000+0x0663);
347         extendedKeyCodesSet.add(0x01000000+0x0664);
348         extendedKeyCodesSet.add(0x01000000+0x0665);
349         extendedKeyCodesSet.add(0x01000000+0x0666);
350         extendedKeyCodesSet.add(0x01000000+0x0667);
351         extendedKeyCodesSet.add(0x01000000+0x0668);
352         extendedKeyCodesSet.add(0x01000000+0x0669);
353         extendedKeyCodesSet.add(0x01000000+0x061B);
354         extendedKeyCodesSet.add(0x01000000+0x0621);
355         extendedKeyCodesSet.add(0x01000000+0x0624);
356         extendedKeyCodesSet.add(0x01000000+0x0626);
357         extendedKeyCodesSet.add(0x01000000+0x0627);
358         extendedKeyCodesSet.add(0x01000000+0x0628);
359         extendedKeyCodesSet.add(0x01000000+0x0629);
360         extendedKeyCodesSet.add(0x01000000+0x062A);
361         extendedKeyCodesSet.add(0x01000000+0x062B);
362         extendedKeyCodesSet.add(0x01000000+0x062C);
363         extendedKeyCodesSet.add(0x01000000+0x062D);
364         extendedKeyCodesSet.add(0x01000000+0x062E);
365         extendedKeyCodesSet.add(0x01000000+0x062F);
366         extendedKeyCodesSet.add(0x01000000+0x0630);
367         extendedKeyCodesSet.add(0x01000000+0x0631);
368         extendedKeyCodesSet.add(0x01000000+0x0632);
369         extendedKeyCodesSet.add(0x01000000+0x0633);
370         extendedKeyCodesSet.add(0x01000000+0x0634);
371         extendedKeyCodesSet.add(0x01000000+0x0635);
372         extendedKeyCodesSet.add(0x01000000+0x0636);
373         extendedKeyCodesSet.add(0x01000000+0x0637);
374         extendedKeyCodesSet.add(0x01000000+0x0638);
375         extendedKeyCodesSet.add(0x01000000+0x0639);
376         extendedKeyCodesSet.add(0x01000000+0x063A);
377         extendedKeyCodesSet.add(0x01000000+0x0641);
378         extendedKeyCodesSet.add(0x01000000+0x0642);
379         extendedKeyCodesSet.add(0x01000000+0x0643);
380         extendedKeyCodesSet.add(0x01000000+0x0644);
381         extendedKeyCodesSet.add(0x01000000+0x0645);
382         extendedKeyCodesSet.add(0x01000000+0x0646);
383         extendedKeyCodesSet.add(0x01000000+0x0647);
384         extendedKeyCodesSet.add(0x01000000+0x0648);
385         extendedKeyCodesSet.add(0x01000000+0x0649);
386         extendedKeyCodesSet.add(0x01000000+0x064A);
387         extendedKeyCodesSet.add(0x01000000+0x064E);
388         extendedKeyCodesSet.add(0x01000000+0x064F);
389         extendedKeyCodesSet.add(0x01000000+0x0650);
390         extendedKeyCodesSet.add(0x01000000+0x0652);
391         extendedKeyCodesSet.add(0x01000000+0x0698);
392         extendedKeyCodesSet.add(0x01000000+0x06A4);
393         extendedKeyCodesSet.add(0x01000000+0x06A9);
394         extendedKeyCodesSet.add(0x01000000+0x06AF);
395         extendedKeyCodesSet.add(0x01000000+0x06BE);
396         extendedKeyCodesSet.add(0x01000000+0x06CC);
397         extendedKeyCodesSet.add(0x01000000+0x06CC);
398         extendedKeyCodesSet.add(0x01000000+0x06D2);
399         extendedKeyCodesSet.add(0x01000000+0x0493);
400         extendedKeyCodesSet.add(0x01000000+0x0497);
401         extendedKeyCodesSet.add(0x01000000+0x049B);
402         extendedKeyCodesSet.add(0x01000000+0x049D);
403         extendedKeyCodesSet.add(0x01000000+0x04A3);
404         extendedKeyCodesSet.add(0x01000000+0x04AF);
405         extendedKeyCodesSet.add(0x01000000+0x04B1);
406         extendedKeyCodesSet.add(0x01000000+0x04B3);
407         extendedKeyCodesSet.add(0x01000000+0x04B9);
408         extendedKeyCodesSet.add(0x01000000+0x04BB);
409         extendedKeyCodesSet.add(0x01000000+0x04D9);
410         extendedKeyCodesSet.add(0x01000000+0x04E9);
411         extendedKeyCodesSet.add(0x01000000+0x0452);
412         extendedKeyCodesSet.add(0x01000000+0x0453);
413         extendedKeyCodesSet.add(0x01000000+0x0451);
414         extendedKeyCodesSet.add(0x01000000+0x0454);
415         extendedKeyCodesSet.add(0x01000000+0x0455);
416         extendedKeyCodesSet.add(0x01000000+0x0456);
417         extendedKeyCodesSet.add(0x01000000+0x0457);
418         extendedKeyCodesSet.add(0x01000000+0x0458);
419         extendedKeyCodesSet.add(0x01000000+0x0459);
420         extendedKeyCodesSet.add(0x01000000+0x045A);
421         extendedKeyCodesSet.add(0x01000000+0x045B);
422         extendedKeyCodesSet.add(0x01000000+0x045C);
423         extendedKeyCodesSet.add(0x01000000+0x0491);
424         extendedKeyCodesSet.add(0x01000000+0x045E);
425         extendedKeyCodesSet.add(0x01000000+0x045F);
426         extendedKeyCodesSet.add(0x01000000+0x2116);
427         extendedKeyCodesSet.add(0x01000000+0x044E);
428         extendedKeyCodesSet.add(0x01000000+0x0430);
429         extendedKeyCodesSet.add(0x01000000+0x0431);
430         extendedKeyCodesSet.add(0x01000000+0x0446);
431         extendedKeyCodesSet.add(0x01000000+0x0434);
432         extendedKeyCodesSet.add(0x01000000+0x0435);
433         extendedKeyCodesSet.add(0x01000000+0x0444);
434         extendedKeyCodesSet.add(0x01000000+0x0433);
435         extendedKeyCodesSet.add(0x01000000+0x0445);
436         extendedKeyCodesSet.add(0x01000000+0x0438);
437         extendedKeyCodesSet.add(0x01000000+0x0439);
438         extendedKeyCodesSet.add(0x01000000+0x043A);
439         extendedKeyCodesSet.add(0x01000000+0x043B);
440         extendedKeyCodesSet.add(0x01000000+0x043C);
441         extendedKeyCodesSet.add(0x01000000+0x043D);
442         extendedKeyCodesSet.add(0x01000000+0x043E);
443         extendedKeyCodesSet.add(0x01000000+0x043F);
444         extendedKeyCodesSet.add(0x01000000+0x044F);
445         extendedKeyCodesSet.add(0x01000000+0x0440);
446         extendedKeyCodesSet.add(0x01000000+0x0441);
447         extendedKeyCodesSet.add(0x01000000+0x0442);
448         extendedKeyCodesSet.add(0x01000000+0x0443);
449         extendedKeyCodesSet.add(0x01000000+0x0436);
450         extendedKeyCodesSet.add(0x01000000+0x0432);
451         extendedKeyCodesSet.add(0x01000000+0x044C);
452         extendedKeyCodesSet.add(0x01000000+0x044B);
453         extendedKeyCodesSet.add(0x01000000+0x0437);
454         extendedKeyCodesSet.add(0x01000000+0x0448);
455         extendedKeyCodesSet.add(0x01000000+0x044D);
456         extendedKeyCodesSet.add(0x01000000+0x0449);
457         extendedKeyCodesSet.add(0x01000000+0x0447);
458         extendedKeyCodesSet.add(0x01000000+0x044A);
459         extendedKeyCodesSet.add(0x01000000+0x2015);
460         extendedKeyCodesSet.add(0x01000000+0x03B1);
461         extendedKeyCodesSet.add(0x01000000+0x03B2);
462         extendedKeyCodesSet.add(0x01000000+0x03B3);
463         extendedKeyCodesSet.add(0x01000000+0x03B4);
464         extendedKeyCodesSet.add(0x01000000+0x03B5);
465         extendedKeyCodesSet.add(0x01000000+0x03B6);
466         extendedKeyCodesSet.add(0x01000000+0x03B7);
467         extendedKeyCodesSet.add(0x01000000+0x03B8);
468         extendedKeyCodesSet.add(0x01000000+0x03B9);
469         extendedKeyCodesSet.add(0x01000000+0x03BA);
470         extendedKeyCodesSet.add(0x01000000+0x03BB);
471         extendedKeyCodesSet.add(0x01000000+0x03BC);
472         extendedKeyCodesSet.add(0x01000000+0x03BD);
473         extendedKeyCodesSet.add(0x01000000+0x03BE);
474         extendedKeyCodesSet.add(0x01000000+0x03BF);
475         extendedKeyCodesSet.add(0x01000000+0x03C0);
476         extendedKeyCodesSet.add(0x01000000+0x03C1);
477         extendedKeyCodesSet.add(0x01000000+0x03C3);
478         extendedKeyCodesSet.add(0x01000000+0x03C2);
479         extendedKeyCodesSet.add(0x01000000+0x03C4);
480         extendedKeyCodesSet.add(0x01000000+0x03C5);
481         extendedKeyCodesSet.add(0x01000000+0x03C6);
482         extendedKeyCodesSet.add(0x01000000+0x03C7);
483         extendedKeyCodesSet.add(0x01000000+0x03C8);
484         extendedKeyCodesSet.add(0x01000000+0x03C9);
485         extendedKeyCodesSet.add(0x01000000+0x2190);
486         extendedKeyCodesSet.add(0x01000000+0x2192);
487         extendedKeyCodesSet.add(0x01000000+0x2193);
488         extendedKeyCodesSet.add(0x01000000+0x2013);
489         extendedKeyCodesSet.add(0x01000000+0x201C);
490         extendedKeyCodesSet.add(0x01000000+0x201D);
491         extendedKeyCodesSet.add(0x01000000+0x201E);
492         extendedKeyCodesSet.add(0x01000000+0x05D0);
493         extendedKeyCodesSet.add(0x01000000+0x05D1);
494         extendedKeyCodesSet.add(0x01000000+0x05D2);
495         extendedKeyCodesSet.add(0x01000000+0x05D3);
496         extendedKeyCodesSet.add(0x01000000+0x05D4);
497         extendedKeyCodesSet.add(0x01000000+0x05D5);
498         extendedKeyCodesSet.add(0x01000000+0x05D6);
499         extendedKeyCodesSet.add(0x01000000+0x05D7);
500         extendedKeyCodesSet.add(0x01000000+0x05D8);
501         extendedKeyCodesSet.add(0x01000000+0x05D9);
502         extendedKeyCodesSet.add(0x01000000+0x05DA);
503         extendedKeyCodesSet.add(0x01000000+0x05DB);
504         extendedKeyCodesSet.add(0x01000000+0x05DC);
505         extendedKeyCodesSet.add(0x01000000+0x05DD);
506         extendedKeyCodesSet.add(0x01000000+0x05DE);
507         extendedKeyCodesSet.add(0x01000000+0x05DF);
508         extendedKeyCodesSet.add(0x01000000+0x05E0);
509         extendedKeyCodesSet.add(0x01000000+0x05E1);
510         extendedKeyCodesSet.add(0x01000000+0x05E2);
511         extendedKeyCodesSet.add(0x01000000+0x05E3);
512         extendedKeyCodesSet.add(0x01000000+0x05E4);
513         extendedKeyCodesSet.add(0x01000000+0x05E5);
514         extendedKeyCodesSet.add(0x01000000+0x05E6);
515         extendedKeyCodesSet.add(0x01000000+0x05E7);
516         extendedKeyCodesSet.add(0x01000000+0x05E8);
517         extendedKeyCodesSet.add(0x01000000+0x05E9);
518         extendedKeyCodesSet.add(0x01000000+0x05EA);
519         extendedKeyCodesSet.add(0x01000000+0x0E01);
520         extendedKeyCodesSet.add(0x01000000+0x0E02);
521         extendedKeyCodesSet.add(0x01000000+0x0E03);
522         extendedKeyCodesSet.add(0x01000000+0x0E04);
523         extendedKeyCodesSet.add(0x01000000+0x0E05);
524         extendedKeyCodesSet.add(0x01000000+0x0E07);
525         extendedKeyCodesSet.add(0x01000000+0x0E08);
526         extendedKeyCodesSet.add(0x01000000+0x0E0A);
527         extendedKeyCodesSet.add(0x01000000+0x0E0C);
528         extendedKeyCodesSet.add(0x01000000+0x0E14);
529         extendedKeyCodesSet.add(0x01000000+0x0E15);
530         extendedKeyCodesSet.add(0x01000000+0x0E16);
531         extendedKeyCodesSet.add(0x01000000+0x0E17);
532         extendedKeyCodesSet.add(0x01000000+0x0E19);
533         extendedKeyCodesSet.add(0x01000000+0x0E1A);
534         extendedKeyCodesSet.add(0x01000000+0x0E1B);
535         extendedKeyCodesSet.add(0x01000000+0x0E1C);
536         extendedKeyCodesSet.add(0x01000000+0x0E1D);
537         extendedKeyCodesSet.add(0x01000000+0x0E1E);
538         extendedKeyCodesSet.add(0x01000000+0x0E1F);
539         extendedKeyCodesSet.add(0x01000000+0x0E20);
540         extendedKeyCodesSet.add(0x01000000+0x0E21);
541         extendedKeyCodesSet.add(0x01000000+0x0E22);
542         extendedKeyCodesSet.add(0x01000000+0x0E23);
543         extendedKeyCodesSet.add(0x01000000+0x0E25);
544         extendedKeyCodesSet.add(0x01000000+0x0E27);
545         extendedKeyCodesSet.add(0x01000000+0x0E2A);
546         extendedKeyCodesSet.add(0x01000000+0x0E2B);
547         extendedKeyCodesSet.add(0x01000000+0x0E2D);
548         extendedKeyCodesSet.add(0x01000000+0x0E30);
549         extendedKeyCodesSet.add(0x01000000+0x0E31);
550         extendedKeyCodesSet.add(0x01000000+0x0E32);
551         extendedKeyCodesSet.add(0x01000000+0x0E33);
552         extendedKeyCodesSet.add(0x01000000+0x0E34);
553         extendedKeyCodesSet.add(0x01000000+0x0E35);
554         extendedKeyCodesSet.add(0x01000000+0x0E36);
555         extendedKeyCodesSet.add(0x01000000+0x0E37);
556         extendedKeyCodesSet.add(0x01000000+0x0E38);
557         extendedKeyCodesSet.add(0x01000000+0x0E39);
558         extendedKeyCodesSet.add(0x01000000+0x0E3F);
559         extendedKeyCodesSet.add(0x01000000+0x0E40);
560         extendedKeyCodesSet.add(0x01000000+0x0E41);
561         extendedKeyCodesSet.add(0x01000000+0x0E43);
562         extendedKeyCodesSet.add(0x01000000+0x0E44);
563         extendedKeyCodesSet.add(0x01000000+0x0E45);
564         extendedKeyCodesSet.add(0x01000000+0x0E46);
565         extendedKeyCodesSet.add(0x01000000+0x0E47);
566         extendedKeyCodesSet.add(0x01000000+0x0E48);
567         extendedKeyCodesSet.add(0x01000000+0x0E49);
568         extendedKeyCodesSet.add(0x01000000+0x0E50);
569         extendedKeyCodesSet.add(0x01000000+0x0E51);
570         extendedKeyCodesSet.add(0x01000000+0x0E52);
571         extendedKeyCodesSet.add(0x01000000+0x0E53);
572         extendedKeyCodesSet.add(0x01000000+0x0E54);
573         extendedKeyCodesSet.add(0x01000000+0x0E55);
574         extendedKeyCodesSet.add(0x01000000+0x0E56);
575         extendedKeyCodesSet.add(0x01000000+0x0E57);
576         extendedKeyCodesSet.add(0x01000000+0x0E58);
577         extendedKeyCodesSet.add(0x01000000+0x0E59);
578         extendedKeyCodesSet.add(0x01000000+0x0587);
579         extendedKeyCodesSet.add(0x01000000+0x0589);
580         extendedKeyCodesSet.add(0x01000000+0x0589);
581         extendedKeyCodesSet.add(0x01000000+0x055D);
582         extendedKeyCodesSet.add(0x01000000+0x055D);
583         extendedKeyCodesSet.add(0x01000000+0x055B);
584         extendedKeyCodesSet.add(0x01000000+0x055B);
585         extendedKeyCodesSet.add(0x01000000+0x055E);
586         extendedKeyCodesSet.add(0x01000000+0x055E);
587         extendedKeyCodesSet.add(0x01000000+0x0561);
588         extendedKeyCodesSet.add(0x01000000+0x0562);
589         extendedKeyCodesSet.add(0x01000000+0x0563);
590         extendedKeyCodesSet.add(0x01000000+0x0564);
591         extendedKeyCodesSet.add(0x01000000+0x0565);
592         extendedKeyCodesSet.add(0x01000000+0x0566);
593         extendedKeyCodesSet.add(0x01000000+0x0567);
594         extendedKeyCodesSet.add(0x01000000+0x0568);
595         extendedKeyCodesSet.add(0x01000000+0x0569);
596         extendedKeyCodesSet.add(0x01000000+0x056A);
597         extendedKeyCodesSet.add(0x01000000+0x056B);
598         extendedKeyCodesSet.add(0x01000000+0x056C);
599         extendedKeyCodesSet.add(0x01000000+0x056D);
600         extendedKeyCodesSet.add(0x01000000+0x056E);
601         extendedKeyCodesSet.add(0x01000000+0x056F);
602         extendedKeyCodesSet.add(0x01000000+0x0570);
603         extendedKeyCodesSet.add(0x01000000+0x0571);
604         extendedKeyCodesSet.add(0x01000000+0x0572);
605         extendedKeyCodesSet.add(0x01000000+0x0573);
606         extendedKeyCodesSet.add(0x01000000+0x0574);
607         extendedKeyCodesSet.add(0x01000000+0x0575);
608         extendedKeyCodesSet.add(0x01000000+0x0576);
609         extendedKeyCodesSet.add(0x01000000+0x0577);
610         extendedKeyCodesSet.add(0x01000000+0x0578);
611         extendedKeyCodesSet.add(0x01000000+0x0579);
612         extendedKeyCodesSet.add(0x01000000+0x057A);
613         extendedKeyCodesSet.add(0x01000000+0x057B);
614         extendedKeyCodesSet.add(0x01000000+0x057C);
615         extendedKeyCodesSet.add(0x01000000+0x057D);
616         extendedKeyCodesSet.add(0x01000000+0x057E);
617         extendedKeyCodesSet.add(0x01000000+0x057F);
618         extendedKeyCodesSet.add(0x01000000+0x0580);
619         extendedKeyCodesSet.add(0x01000000+0x0581);
620         extendedKeyCodesSet.add(0x01000000+0x0582);
621         extendedKeyCodesSet.add(0x01000000+0x0583);
622         extendedKeyCodesSet.add(0x01000000+0x0584);
623         extendedKeyCodesSet.add(0x01000000+0x0585);
624         extendedKeyCodesSet.add(0x01000000+0x0586);
625         extendedKeyCodesSet.add(0x01000000+0x10D0);
626         extendedKeyCodesSet.add(0x01000000+0x10D1);
627         extendedKeyCodesSet.add(0x01000000+0x10D2);
628         extendedKeyCodesSet.add(0x01000000+0x10D3);
629         extendedKeyCodesSet.add(0x01000000+0x10D4);
630         extendedKeyCodesSet.add(0x01000000+0x10D5);
631         extendedKeyCodesSet.add(0x01000000+0x10D6);
632         extendedKeyCodesSet.add(0x01000000+0x10D7);
633         extendedKeyCodesSet.add(0x01000000+0x10D8);
634         extendedKeyCodesSet.add(0x01000000+0x10D9);
635         extendedKeyCodesSet.add(0x01000000+0x10DA);
636         extendedKeyCodesSet.add(0x01000000+0x10DB);
637         extendedKeyCodesSet.add(0x01000000+0x10DC);
638         extendedKeyCodesSet.add(0x01000000+0x10DD);
639         extendedKeyCodesSet.add(0x01000000+0x10DE);
640         extendedKeyCodesSet.add(0x01000000+0x10DF);
641         extendedKeyCodesSet.add(0x01000000+0x10E0);
642         extendedKeyCodesSet.add(0x01000000+0x10E1);
643         extendedKeyCodesSet.add(0x01000000+0x10E2);
644         extendedKeyCodesSet.add(0x01000000+0x10E3);
645         extendedKeyCodesSet.add(0x01000000+0x10E4);
646         extendedKeyCodesSet.add(0x01000000+0x10E5);
647         extendedKeyCodesSet.add(0x01000000+0x10E6);
648         extendedKeyCodesSet.add(0x01000000+0x10E7);
649         extendedKeyCodesSet.add(0x01000000+0x10E8);
650         extendedKeyCodesSet.add(0x01000000+0x10E9);
651         extendedKeyCodesSet.add(0x01000000+0x10EA);
652         extendedKeyCodesSet.add(0x01000000+0x10EB);
653         extendedKeyCodesSet.add(0x01000000+0x10EC);
654         extendedKeyCodesSet.add(0x01000000+0x10ED);
655         extendedKeyCodesSet.add(0x01000000+0x10EE);
656         extendedKeyCodesSet.add(0x01000000+0x10EF);
657         extendedKeyCodesSet.add(0x01000000+0x10F0);
658         extendedKeyCodesSet.add(0x01000000+0x01E7);
659         extendedKeyCodesSet.add(0x01000000+0x0259);
660         extendedKeyCodesSet.add(0x01000000+0x1EB9);
661         extendedKeyCodesSet.add(0x01000000+0x1ECB);
662         extendedKeyCodesSet.add(0x01000000+0x1ECD);
663         extendedKeyCodesSet.add(0x01000000+0x1EE5);
664         extendedKeyCodesSet.add(0x01000000+0x01A1);
665         extendedKeyCodesSet.add(0x01000000+0x01B0);
666         extendedKeyCodesSet.add(0x01000000+0x20AB);
667     }
668}
669