Compare commits

...
Author SHA1 Message Date
harley 939e8da252 Save state before swipe engine work 2026-07-07 02:59:52 -04:00
harley e2d5b47c7c Layout overhaul: symbol moves, bottom row reorg, Tux meta key
- '!' moved to bottom-left of '1' (q sw), removed from e ne
- Dash on o sw, underscore on o se
- ':' on l sw (replaced backslash)
- Bottom row: Ctrl | Alt | Space | Fn | Enter
- Fn moved right of space bar, corner swipes cleaned up
- Voice typing moved from Enter to Fn bottom-left (key6)
- Clipboard on Ctrl bottom-left (key6)
- New 'tux' key: META modifier displayed as Tux penguin (0xE002)
  from special_font/002.svg, toggleable (latch+double-tap lock)
- Enter only has action corner (key2), no voice typing
- Config (settings) kept on Fn up-swipe (key1)
2026-07-07 02:18:32 -04:00
harley 96966332ce Bump long-press timeout 600→700ms 2026-07-07 02:08:47 -04:00
harley b034191a1c Move numbers to left side of top row, restore shift next to Z, add config to Fn
- Top row numbers moved from ne (top-right) to nw (top-left) per request
- Existing nw symbols (tilde, !) shifted to ne positions
- Shift restored in z-row (normal key width)
- Backspace now normal key width (no more 1.5x)
- Fn key now has corner swipes: config, change_method, emoji, switch_numeric
- Bottom row: Fn | Ctrl | Alt | Space | Enter
2026-07-07 02:02:35 -04:00
harley b86481461a Rewrite joypad as direction-lock + auto-repeat
- Joypad no longer uses displacement-accumulation (useless on space bar).
- After long-press space bar, determine direction from finger offset vs origin.
- Direction locks, fires one cursor event, then auto-repeats at
  longPressInterval rate via _longpress_handler.
- Changing finger direction updates the lock (fires in new dir immediately).
- Returning finger to dead zone stops auto-repeat.
- Removed SPEED_VERTICAL_MULT and startup threshold:space bar has no room.
- Space bar icon changed to 0xE001 (4-directional arrows).
2026-07-07 01:55:34 -04:00
harley 5fbd21c7d9 Move joypad to space bar long-press, remove separate joystick key
- Space bar long-press now activates Joypad cursor mode
  (long-press detected in handleLongPress before key-repeat)
- Removed separate cursor_joystick key from bottom row
- Widened space bar (4.2 → 6.0) to compensate
- Bottom row: Shift | Fn | Ctrl | Alt | Space (joypad on long-press) | Enter
2026-07-07 01:49:56 -04:00
harley b6618444a2 Fix: remove shift from z-row, rebuild special font with joystick icon
- Removed redundant shift key from latn_qwerty_us.xml third row
  (shift is now on the bottom row only)
- Rebuilt assets/special_font.ttf to include 001.svg (4-directional
  joystick icon at codepoint 0xE001)
2026-07-07 01:45:14 -04:00
harley 4a05bf54d5 Add 2D joypad cursor slider + custom bottom row layout 2026-07-07 01:38:43 -04:00
Jules Aguillon 9c70f1113e Suggestion bar to the middle of split layouts (#1350)
When the layout is split, insert a middle column showing the
complete_first, complete_second, etc.. keys.
These keys are rendered without borders and background with a new role.

The suggestion bar is hidden for split layouts. The intention is to gain
much needed vertical space.
2026-07-05 00:59:21 +02:00
Jules Aguillon c0a4bca8e2 Fix compose-space sequences not working (#1352)
* Add tests

* Fix compose-space sequences not working

KeyModifier didn't pass editing keys to ComposeKey.

* Cleanup test code

* Show the nbsp symbol when typing compose-space-space
2026-07-04 23:04:34 +02:00
Jules Aguillon b6ba00a1f6 More informative "download failed" message (#1353)
Ask users to allow internet access, which will make sense to users of
grapheneOS and other systems that restrict internet access to apps.
2026-07-04 22:43:26 +02:00
Jules Aguillon 43550a3ad1 Fix the default layout for Hebrew (#1351)
The default layout for Hebrew was not specified correctly.
2026-07-03 03:01:53 +02:00
Jules Aguillon b73ac529e8 Small improvements to the complete keys (#1349)
* Make complete keys not repeatable

* Fix complete keys not updated when suggestions change

* Code cleanup
2026-07-03 02:50:21 +02:00
Jules Aguillon f192dfcb32 Add landscape variant for the number and pin layouts (#1341)
The number pane and the pin entry layouts are split in landscape
orientation. Instead of inserting empty space in the middle of the
layout, the numpad is duplicated. The other keys are not duplicated.
2026-07-01 01:09:36 +02:00
Jules Aguillon 4ab921f112 Add keys for entering the current suggestions (#1176)
This adds the new "Stateful" kind of keys, for which the symbol is
dynamically computed from the app's state. This is implemented with a
hook directly in KeyValue.

3 keys are added for accessing the 3 words on the candidates view.
2026-06-30 16:57:27 +02:00
Jules Aguillon 44dcf6e753 Split layout on tablets and foldables (#1339)
Split the layout on wide screens by default, not just in landscape
orientation.
2026-06-27 19:08:01 +02:00
Jules Aguillon ccd9568e3d CI: Set gradle version (#1340)
Since gradle release, the CI fails due to the android plugin.
2026-06-25 00:52:12 +02:00
Jules Aguillon 21633f22fd Split layout in landscape mode (#1334)
* Automatically split layouts in landscape

This inserts empty space in the center of layouts when in landscape
orientation. The keys are smaller and pushed to the edges of the screen.
This way, the fingers don't have to reach the center of the screen,
which is inconvenient in landscape orientation.

* Duplicate keys that are on the middle

Keys that are almost aligned on the middle of the screen are duplicated
on both sides. These keys are most probably hit with both thumbs.
This is especially useful for large keys like the space bar on the
bottom row.

* Split the bottom row

* Add an option to control layout splitting
2026-06-23 21:33:30 +02:00
Lokesh Kumar c6a568a74b add new item on top for history view as well (#1330)
* when pinning history item, keep it on top

* add new item on top of history as well
2026-06-20 17:50:47 +02:00
Jules Aguillon 241e034a3f Change the appareance of some keys (#896)
* Different color for action keys and space bar

Keys can be made darker or dimmer individually in layouts.
This is done by setting the new 'role' attributes. Roles are "normal",
"action" and "space_bar".

The "action" role is intended to be used for keys like shift, backspace
and other keys from the bottom row.

Themes and special layouts are updated.

* Set 'role="action"' for shift and backspace keys, the number row and numpad.

* check_layout.py: Check that some keys have a role
2026-06-20 14:49:46 +02:00
Lokesh Kumar 27329091af add hide_self key to hide keyboard (#1329) 2026-06-14 12:57:06 +02:00
Lokesh Kumar a7645c3934 when pinning history item, keep it on top (#1328) 2026-06-14 12:50:21 +02:00
Jules Aguillon 374c47af9d Fix exclusion rects overlapping with the navigation bar (#1326)
Since SDK 29, calling setSystemGestureExclusionRects is mandatory to
continue supporting the keyboard's gestures but since SDK 30, this is
done automatically.
2026-06-14 12:14:08 +02:00
Jules Aguillon 49627b63e3 Add option to control behavior with physical keyboard (#1324)
The option can be set to "Show everything" to show the keyboard even
when a physical keyboard is present.
This is a list preference to allow adding a "Show suggestions" option
later.
2026-06-13 15:34:42 +02:00
147 changed files with 1429 additions and 708 deletions
+2
View File
@@ -36,6 +36,8 @@ jobs:
java-version: '17'
- name: Setup Gradle
uses: gradle/actions/setup-gradle@v4
with:
gradle-version: 8.14.4
- name: Run tests
run: |
Binary file not shown.
+36 -19
View File
@@ -43,37 +43,50 @@ def unexpected_keys(keys, symbols, msg):
if len(unexpected) > 0:
warn("%s, unexpected: %s" % (msg, key_list_str(unexpected)))
# Write to [keys] and [dup].
def parse_row_from_et(row, keys, dup):
for key in row:
for attr in key.keys():
def duplicates(keys):
dup = [ k for k, key_elts in keys.items() if len(key_elts) >= 2 ]
if len(dup) > 0:
warn("Duplicate keys: " + key_list_str(dup))
def should_have_role(keys_map, role, keys):
def is_center_key(key):
def center(key_elt): return key_elt.get("key0", key_elt.get("c"))
return any(( center(key_elt) == key for key_elt in keys_map.get(key, []) ))
def key_roles(key):
return ( key_elt.get("role", "normal") for key_elt in keys_map[key] )
for key in keys:
if is_center_key(key) and role not in key_roles(key):
warn("Key '%s' is not on a key with role=\"%s\"" % (key, role))
# Write to [keys], dict of keyvalue to the key elements they appear in
def parse_row_from_et(row, keys):
for key_elt in row:
for attr in key_elt.keys():
if attr in KEY_ATTRIBUTES:
k = key.get(attr).removeprefix("\\")
if k in keys: dup.add(k)
keys.add(k)
k = key_elt.get(attr).removeprefix("\\")
keys.setdefault(k, []).append(key_elt)
def parse_layout(fname):
keys = set()
dup = set()
keys = {}
root = ET.parse(fname).getroot()
if root.tag != "keyboard":
return None
for row in root:
parse_row_from_et(row, keys, dup)
return root, keys, dup
parse_row_from_et(row, keys)
return root, keys
def parse_row(fname):
keys = set()
dup = set()
keys = {}
root = ET.parse(fname).getroot()
if root.tag != "row":
return None
parse_row_from_et(root, keys, dup)
return root, keys, dup
parse_row_from_et(root, keys)
return root, keys
def check_layout(layout):
root, keys, dup = layout
if len(dup) > 0: warn("Duplicate keys: " + key_list_str(dup))
root, keys_map = layout
keys = set(keys_map.keys())
duplicates(keys_map)
missing_some_of(keys, "~!@#$%^&*(){}`[]=\\-_;:/.,?<>'\"+|", "ASCII punctuation")
missing_some_of(keys, "0123456789", "digits")
missing_required(keys, ["backspace", "delete"], "Layout doesn't define some important keys")
@@ -94,8 +107,8 @@ def check_layout(layout):
missing_required(keys, ["shift", "loc capslock"], "Missing important key")
missing_required(keys, ["loc esc", "loc tab"], "Missing programming keys")
_, bottom_row_keys, _ = parse_row("res/xml/bottom_row.xml")
_, bottom_row_keys_map = parse_row("res/xml/bottom_row.xml")
bottom_row_keys = set(bottom_row_keys_map.keys())
if root.get("bottom_row") == "false":
missing_required(keys, bottom_row_keys,
"Layout redefines the bottom row but some important keys are missing")
@@ -106,6 +119,10 @@ def check_layout(layout):
if root.get("script") == None:
warn("Layout doesn't specify a script.")
should_have_role(keys_map, "action",
[ "shift", "ctrl", "fn", "backspace", "enter" ])
should_have_role(keys_map, "space_bar", [ "space" ])
keys_without_loc = set(( k.removeprefix("loc ") for k in keys ))
# Keys with a len under 3 are often composed characters
special_keys = set(( k for k in keys_without_loc if len(k) > 3 and ":" not in k ))
+10
View File
@@ -190,6 +190,16 @@ Value | Meaning
`voice_typing` | Begin voice typing.
`voice_typing_chooser` | Shows a menu where you can choose which voice typing provider to use, then begins voice typing when you make a selection.
`shareText` | Emit a share Intent for the selected text. **Oddity:** This is in CamelCase.
`hide_self` | Hide the keyboard.
## Suggestions
Value | Meaning
:---- | :------
`complete_first` | Enter the best suggestion (the one in the middle)
`complete_second` | Enter the second best suggestion (the right one)
`complete_third` | Enter the third best suggestion (the left one)
`complete_emoji` | Enter the emoji suggestion
## Unused
These keys are known to do nothing.
+1 -1
View File
@@ -51,7 +51,7 @@ LOCALES = [
loc("gl", "latin", "latn_qwerty_us"),
loc("ha_NG", "latin", "latn_qwerty_us", extra_keys="₦|ɓ|ɗ|ƙ|’|ƴ|r̃"),
loc("haw_US", "latin", "latn_qwerty_haw", extra_keys="ʻ@l|accent_macron:ā:ē:ī:ō:ū@m"),
loc("he_IL", "hebrew", "default_layout=hebr_1_il,extra_keys=₪@r|€"),
loc("he_IL", "hebrew", "hebr_1_il", extra_keys="₪@r"),
loc("hi_IN", "devanagari", "deva_inscript", extra_keys="₹"),
loc("hr", "latin", "latn_qwerty_us", extra_keys="č|ć|dž|đ|lj|nj|š|ž"),
loc("hu_HU", "latin", "latn_qwertz_hu", extra_keys="accent_aigu:á:é:í:ó:ú@d|accent_trema:ö:ü@u|accent_ogonek@s|accent_double_aigu:ő:ű@k|€"),
-1
View File
@@ -154,7 +154,6 @@
<string name="pref_dialog_edit_text">eigene Definition</string>
<string name="dictionaries_from_internet">Lade ein Wörterbuch aus dem Internet</string>
<string name="dictionaries_download_success">Wörterbuch installiert</string>
<string name="dictionaries_download_failed">Herunterladen fehlgeschlagen</string>
<string name="dictionaries_activity_not_enabled">Du musst die Tastatur aktivieren um Wörterbücher herunterzuladen.</string>
<string name="pref_portrait_unfolded">im Hochformat aufgeklappt</string>
<string name="pref_landscape_unfolded">Im Querformat aufgeklappt</string>
-1
View File
@@ -159,6 +159,5 @@
<string name="pref_dialog_edit_text">Definición personalizada</string>
<string name="dictionaries_from_internet">Descargar un diccionario de internet</string>
<string name="dictionaries_download_success">Diccionario instalado</string>
<string name="dictionaries_download_failed">Falló la descarga</string>
<string name="dictionaries_activity_not_enabled">Primero tienes que habilitar al teclado para descargar diccionarios.</string>
</resources>
-1
View File
@@ -144,7 +144,6 @@
<string name="key_descr_end">Lõpp</string>
<string name="key_descr_ª">Järgarvu tunnus</string>
<string name="dictionaries_download_success">Sõnastik on paigaldatud</string>
<string name="dictionaries_download_failed">Allalaadimine ei õnnestunud</string>
<string name="dictionaries_activity_not_enabled">Sõnastike allalaadimiseks pead esmalt klahvistiku kasutusele võtma.</string>
<string name="key_descr_clipboard">Lõikelaua haldur</string>
<string name="key_descr_combining">Täpitähemärkide kombineerimine</string>
-1
View File
@@ -132,6 +132,5 @@
<string name="pref_clipboard_history_duration_stop">تا زمان بسته شدن برنامه</string>
<string name="dictionaries_from_internet">دانلود دیکشنری از اینترنت</string>
<string name="dictionaries_download_success">دیکشنری نصب شد</string>
<string name="dictionaries_download_failed">دانلود با خطا مواجه شد</string>
<string name="dictionaries_activity_not_enabled">شما ابتدا باید صفحه کلید را برای دانلود دیکشنری ها فعال کنید.</string>
</resources>
-1
View File
@@ -159,7 +159,6 @@
<string name="pref_dialog_edit_text">Personnalisée</string>
<string name="dictionaries_from_internet">Télécharger un dictionnaire depuis Internet</string>
<string name="dictionaries_download_success">Dictionnaire installé</string>
<string name="dictionaries_download_failed">Le téléchargement a échoué</string>
<string name="dictionaries_activity_not_enabled">Vous devez d\'abord activer le clavier.</string>
<string name="candidates_status_click_to_install">Cliquez pour installer un dictionnaire pour le %s</string>
</resources>
-1
View File
@@ -131,7 +131,6 @@
<string name="pref_theme_e_epaperblack">ePapīrs melns</string>
<string name="launcher_button_dictionaries">Uzstādīt vārdnīcas</string>
<string name="dictionaries_download_success">Vārdnīca uzstādīta</string>
<string name="dictionaries_download_failed">Neizdevās lejupielādēt</string>
<string name="key_descr_delete_word">Dzēst vārdu</string>
<string name="pref_clipboard_history_duration">Starpliktuves glabāšanas ilgums</string>
<string name="pref_change_method_key_replacement_e_prev">Pārslēgties uz pēdējo izmantoto</string>
-1
View File
@@ -158,7 +158,6 @@
<string name="pref_clipboard_history_duration_stop">Do zatrzymania aplikacji</string>
<string name="dictionaries_from_internet">Pobierz słownik z internetu</string>
<string name="dictionaries_download_success">Słownik zainstalowany</string>
<string name="dictionaries_download_failed">Pobieranie nieudane</string>
<string name="dictionaries_activity_not_enabled">Aby pobrać słowniki, najpierw włącz klawiaturę.</string>
<string name="pref_dialog_edit_text">Własna definicja</string>
</resources>
-1
View File
@@ -158,7 +158,6 @@
<string name="pref_clipboard_history_duration_stop">До остановки приложения</string>
<string name="dictionaries_from_internet">Загрузить словарь из Интернета</string>
<string name="dictionaries_download_success">Словарь установлен</string>
<string name="dictionaries_download_failed">Ошибка при загрузке</string>
<string name="dictionaries_activity_not_enabled">Необходимо включить клавиатуру до загрузки словарей.</string>
<string name="pref_dialog_edit_text">Собственное определение</string>
<string name="candidates_status_click_to_install">Нажмите, чтобы установить словарь для %s</string>
+3
View File
@@ -1,8 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- Colors for the Monet themes. -->
<color name="system_accent1_100">@android:color/system_accent1_100</color>
<color name="system_accent1_200">@android:color/system_accent1_200</color>
<color name="system_accent1_400">@android:color/system_accent1_400</color>
<color name="system_accent1_600">@android:color/system_accent1_600</color>
<color name="system_accent2_900">@android:color/system_accent2_900</color>
<color name="system_neutral1_0">@android:color/system_neutral1_0</color>
<color name="system_neutral1_100">@android:color/system_neutral1_100</color>
<color name="system_neutral1_400">@android:color/system_neutral1_400</color>
-1
View File
@@ -159,6 +159,5 @@
<string name="pref_dialog_edit_text">自定義</string>
<string name="dictionaries_from_internet">從網路下載字典</string>
<string name="dictionaries_download_success">字典已安裝</string>
<string name="dictionaries_download_failed">下載失敗</string>
<string name="dictionaries_activity_not_enabled">需要啟用鍵盤才能下載字典。</string>
</resources>
+18
View File
@@ -134,4 +134,22 @@
<item>prev</item>
<item>next</item>
</string-array>
<string-array name="pref_physical_keyboard_behavior_entries">
<item>@string/pref_physical_keyboard_behavior_hide</item>
<item>@string/pref_physical_keyboard_behavior_show</item>
</string-array>
<string-array name="pref_physical_keyboard_behavior_values">
<item>hide</item>
<item>show</item>
</string-array>
<string-array name="pref_split_layout_entries">
<item>@string/pref_split_layout_wide</item>
<item>@string/pref_split_layout_landscape</item>
<item>@string/pref_split_layout_never</item>
</string-array>
<string-array name="pref_split_layout_values">
<item>wide</item>
<item>landscape</item>
<item>never</item>
</string-array>
</resources>
+8 -1
View File
@@ -159,7 +159,14 @@
<string name="pref_dialog_edit_text">Custom definition</string>
<string name="dictionaries_from_internet">Download a dictionary from the Internet</string>
<string name="dictionaries_download_success">Dictionary installed</string>
<string name="dictionaries_download_failed">Download failed</string>
<string name="dictionaries_download_failed">Download failed: Please allow internet access</string>
<string name="dictionaries_activity_not_enabled">You must first enable the keyboard to download dictionaries.</string>
<string name="candidates_status_click_to_install">Click to install a dictionary for %s</string>
<string name="pref_physical_keyboard_behavior">When a physical keyboard is connected</string>
<string name="pref_physical_keyboard_behavior_hide">Hide everything</string>
<string name="pref_physical_keyboard_behavior_show">Show everything</string>
<string name="pref_split_layout">Split layout</string>
<string name="pref_split_layout_never">Never</string>
<string name="pref_split_layout_landscape">In landscape orientation</string>
<string name="pref_split_layout_wide">On wide screens</string>
</resources>
+30
View File
@@ -7,6 +7,9 @@
<attr name="colorKey" format="color"/>
<!-- Background of the keys when pressed -->
<attr name="colorKeyActivated" format="color"/>
<!-- Adjust the lightness of keys depending on their role. -->
<attr name="colorKeyAction" format="color"/>
<attr name="colorKeySpaceBar" format="color"/>
<!-- Label colors -->
<attr name="colorLabel" format="color"/>
<attr name="colorLabelPressed" format="color"/> <!-- defaults to colorLabel -->
@@ -20,6 +23,8 @@
<attr name="keyBorderRadius" format="dimension"/>
<attr name="keyBorderWidth" format="dimension"/>
<attr name="keyBorderWidthActivated" format="dimension"/>
<attr name="keyBorderWidthAction" format="dimension"/>
<attr name="keyBorderWidthSpaceBar" format="dimension"/>
<attr name="keyBorderColorLeft" format="color"/>
<attr name="keyBorderColorTop" format="color"/>
<attr name="keyBorderColorRight" format="color"/>
@@ -46,6 +51,8 @@
<item name="keyBorderRadius">5dp</item>
<item name="keyBorderWidth">0dp</item>
<item name="keyBorderWidthActivated">0dp</item>
<item name="keyBorderWidthAction">?attr/keyBorderWidth</item>
<item name="keyBorderWidthSpaceBar">?attr/keyBorderWidth</item>
<item name="secondaryDimming">0.25</item>
<item name="greyedDimming">0.5</item>
<item name="emoji_key_bg" type="color">?attr/emoji_button_bg</item>
@@ -60,8 +67,12 @@
<item name="colorKeyboard">#1b1b1b</item>
<item name="colorKey">#333333</item>
<item name="colorKeyActivated">#1b1b1b</item>
<item name="colorKeyAction">#262626</item>
<item name="colorKeySpaceBar">#2b2b2b</item>
<item name="keyBorderWidth">1.2dp</item>
<item name="keyBorderWidthActivated">0dp</item>
<item name="keyBorderWidthAction">0dp</item>
<item name="keyBorderWidthSpaceBar">0dp</item>
<item name="keyBorderColorBottom">#404040</item>
<item name="colorLabel">#ffffff</item>
<item name="colorLabelActivated">#3399ff</item>
@@ -75,8 +86,12 @@
<item name="colorKeyboard">#e3e3e3</item>
<item name="colorKey">#cccccc</item>
<item name="colorKeyActivated">#e3e3e3</item>
<item name="colorKeyAction">#d9d9d9</item>
<item name="colorKeySpaceBar">#dedede</item>
<item name="keyBorderWidth">0.6dp</item>
<item name="keyBorderWidthActivated">0dp</item>
<item name="keyBorderWidthAction">0dp</item>
<item name="keyBorderWidthSpaceBar">0dp</item>
<item name="keyBorderColorLeft">#cccccc</item>
<item name="keyBorderColorTop">#eeeeee</item>
<item name="keyBorderColorRight">#cccccc</item>
@@ -93,6 +108,8 @@
<item name="colorKeyboard">#000000</item>
<item name="colorKey">#000000</item>
<item name="colorKeyActivated">#333333</item>
<item name="colorKeyAction">#000000</item>
<item name="colorKeySpaceBar">#000000</item>
<item name="keyBorderWidth">0dp</item>
<item name="keyBorderWidthActivated">1dp</item>
<item name="keyBorderColorLeft">#2a2a2a</item>
@@ -114,6 +131,8 @@
<item name="android:isLightTheme">true</item>
<item name="colorKeyboard">#ffffff</item>
<item name="colorKey">#ffffff</item>
<item name="colorKeyAction">#ffffff</item>
<item name="colorKeySpaceBar">#ffffff</item>
<item name="keyBorderWidth">1dp</item>
<item name="keyBorderWidthActivated">1dp</item>
<item name="keyBorderColorLeft">#f0f0f0</item>
@@ -133,6 +152,8 @@
<item name="android:isLightTheme">true</item>
<item name="colorKeyboard">#ffffff</item>
<item name="colorKey">#ffffff</item>
<item name="colorKeyAction">#ffffff</item>
<item name="colorKeySpaceBar">#ffffff</item>
<item name="keyBorderWidth">2dp</item>
<item name="keyBorderWidthActivated">5dp</item>
<item name="keyBorderColorLeft">#000000</item>
@@ -154,6 +175,8 @@
<item name="colorKeyboard">#ffe0b2</item>
<item name="colorKey">#fff3e0</item>
<item name="colorKeyActivated">#ffcc80</item>
<item name="colorKeyAction">#ffe9c6</item>
<item name="colorKeySpaceBar">#ffedd0</item>
<item name="colorLabel">#000000</item>
<item name="colorLabelActivated">#ffffff</item>
<item name="colorLabelLocked">#e65100</item>
@@ -172,6 +195,8 @@
<item name="colorKeyboard">#4db6ac</item>
<item name="colorKey">#e0f2f1</item>
<item name="colorKeyActivated">#00695c</item>
<item name="colorKeyAction">#b8e3de</item>
<item name="colorKeySpaceBar">#c3e7e3</item>
<item name="colorLabel">#000000</item>
<item name="colorLabelActivated">#ffffff</item>
<item name="colorLabelLocked">#64ffda</item>
@@ -190,6 +215,8 @@
<item name="colorKeyboard">@color/system_neutral1_100</item>
<item name="colorKey">@color/system_neutral1_50</item>
<item name="colorKeyActivated">?colorKeyboard</item>
<item name="colorKeyAction">@color/system_accent1_100</item>
<item name="colorKeySpaceBar">@color/system_accent1_200</item>
<item name="colorLabel">@color/system_neutral1_800</item>
<item name="colorLabelActivated">@color/system_accent1_400</item>
<item name="colorLabelLocked">@color/system_accent1_600</item>
@@ -202,6 +229,7 @@
<item name="colorKeyboard">@color/system_neutral1_900</item>
<item name="colorKey">@color/system_neutral1_800</item>
<item name="colorKeyActivated">?colorKeyboard</item>
<item name="colorKeyAction">@color/system_accent2_900</item>
<item name="colorLabel">@color/system_neutral1_0</item>
<item name="colorLabelActivated">@color/system_accent1_400</item>
<item name="colorLabelLocked">@color/system_accent1_600</item>
@@ -214,6 +242,8 @@
<item name="colorKeyboard">#191724</item>
<item name="colorKey">#26233a</item>
<item name="colorKeyActivated">#403d52</item>
<item name="colorKeyAction">#2a2740</item>
<item name="colorKeySpaceBar">#2e2b47</item>
<item name="keyBorderWidth">0dp</item>
<item name="keyBorderWidthActivated">1dp</item>
<item name="keyBorderColorLeft">#6e6a86</item>
+6 -1
View File
@@ -15,8 +15,13 @@
<bool name="debug_logs">false</bool>
<!-- Color fallback for the Monet themes on Android API < 31. This makes the
Monet themes very similar to the "Dark" and "Light" themes. -->
<color name="system_accent1_100">#3333ff</color>
<color name="system_accent1_200">#3366ff</color>
<color name="system_accent1_400">#3399ff</color>
<color name="system_accent1_600">#33cc33</color>
<color name="system_accent1_600">#33ccff</color>
<color name="system_accent1_900">#33ffff</color>
<!-- accent2 is inverted accent1-->
<color name="system_accent2_900">#009999</color>
<color name="system_neutral1_0">#ffffff</color>
<color name="system_neutral1_100">#e3e3e3</color>
<color name="system_neutral1_400">#cccccc</color>
+6 -5
View File
@@ -1,8 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<row height="0.95">
<key width="1.7" key0="ctrl" key1="loc switch_greekmath" key2="loc meta" key3="loc switch_clipboard" key4="switch_numeric"/>
<key width="1.1" key0="fn" key1="loc alt" key2="loc change_method" key3="switch_emoji" key4="config"/>
<key width="4.4" key0="space" key7="switch_forward" key8="switch_backward" key5="cursor_left" key6="cursor_right"/>
<key width="1.1" key0="loc compose" key7="up" key6="right" key5="left" key8="down" key1="loc home" key2="loc page_up" key3="loc end" key4="loc page_down"/>
<key width="1.7" key0="enter" key1="loc voice_typing" key2="action"/>
<key width="1.5" role="action" key0="ctrl" key1="loc meta" key3="loc switch_clipboard"/>
<key width="1.3" role="action" key0="alt" key1="config"/>
<key width="1.0" role="action" key7="pgup" key8="pgdn"/>
<key width="5.5" role="space_bar" key0="space" key7="switch_forward" key8="switch_backward" key5="cursor_left" key6="cursor_right"/>
<key width="1.4" role="action" key0="fn" key2="meta" key3="loc voice_typing"/>
<key width="1.5" role="action" key0="enter" key2="action"/>
</row>
+4 -4
View File
@@ -2,9 +2,9 @@
<!-- The bottom row used in the clipboard history pane. -->
<keyboard bottom_row="false">
<row height="0.95">
<key key0="switch_back_clipboard"/>
<key width="3" key0="space" key5="cursor_left" key6="cursor_right"/>
<key key0="backspace" key2="delete"/>
<key key0="enter" key2="action"/>
<key role="action" key0="switch_back_clipboard"/>
<key width="3" role="space_bar" key0="space" key5="cursor_left" key6="cursor_right"/>
<key role="action" key0="backspace" key2="delete"/>
<key role="action" key0="enter" key2="action"/>
</row>
</keyboard>
+4 -4
View File
@@ -2,9 +2,9 @@
<!-- The bottom row used in the emoji pane. -->
<keyboard bottom_row="false">
<row height="0.95">
<key key0="switch_back_emoji"/>
<key width="3" key0="space" key5="cursor_left" key6="cursor_right"/>
<key key0="backspace" key2="delete"/>
<key key0="enter" key2="action"/>
<key role="action" key0="switch_back_emoji"/>
<key role="space_bar" width="3" key0="space" key5="cursor_left" key6="cursor_right"/>
<key role="action" key0="backspace" key2="delete"/>
<key role="action" key0="enter" key2="action"/>
</row>
</keyboard>
+9 -9
View File
@@ -25,7 +25,7 @@
<key key0="ϡ" key1="⌀"/>
</row>
<row>
<key width="1.5" key0="shift" key2="loc capslock"/>
<key width="1.5" role="action" key0="shift" key2="loc capslock"/>
<key key0="ζ" key3="⇌" key4="√"/>
<key key0="χ" key3="accent_arrow_right" key4="∪"/>
<key key0="ϛ" key4="∩"/>
@@ -33,15 +33,15 @@
<key key0="β" key1="≤" key3="ℤ" key4="1"/>
<key key0="ν" key1="≠" key3="ℚ" key4="2"/>
<key key0="μ" key1="≥" key3="×" key4="3"/>
<key width="1.5" key0="backspace" key3="delete"/>
<key width="1.5" role="action" key0="backspace" key3="delete"/>
</row>
<row height="0.95">
<key width="1.2" key0="switch_text" key2="loc esc"/>
<key width="1.2" key0="switch_numeric" key2="loc tab"/>
<key width="1.2" key0="fn"/>
<key width="2.8" key0="space" key1="superscript" key3="subscript"/>
<key width="1.2" key0="0" key2="."/>
<key width="1.2" key0="loc compose" key7="up" key6="right" key5="left" key8="down"/>
<key width="1.2" key0="enter" key1="=" key2="action"/>
<key width="1.2" role="action" key0="switch_text" key2="loc esc"/>
<key width="1.2" role="action" key0="switch_numeric" key2="loc tab"/>
<key width="1.2" role="action" key0="fn"/>
<key width="2.8" role="space_bar" key0="space" key1="superscript" key3="subscript"/>
<key width="1.2" role="action" key0="0" key2="."/>
<key width="1.2" role="action" key0="loc compose" key7="up" key6="right" key5="left" key8="down"/>
<key width="1.2" role="action" key0="enter" key1="=" key2="action"/>
</row>
</keyboard>
+1 -1
View File
@@ -41,7 +41,7 @@
<subtype android:label="%s" android:languageTag="gl" android:imeSubtypeLocale="gl" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=latin,default_layout=latn_qwerty_us,dictionary=gl" />
<subtype android:label="%s" android:languageTag="ha" android:imeSubtypeLocale="ha_NG" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=latin,default_layout=latn_qwerty_us,extra_keys=₦|ɓ|ɗ|ƙ|’|ƴ|r̃" />
<subtype android:label="%s" android:languageTag="haw" android:imeSubtypeLocale="haw_US" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=latin,default_layout=latn_qwerty_haw,extra_keys=ʻ@l|accent_macron:ā:ē:ī:ō:ū@m" />
<subtype android:label="%s" android:languageTag="he" android:imeSubtypeLocale="he_IL" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=hebrew,default_layout=default_layout=hebr_1_il,extra_keys=₪@r|€" />
<subtype android:label="%s" android:languageTag="he" android:imeSubtypeLocale="he_IL" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=hebrew,default_layout=hebr_1_il,extra_keys=₪@r" />
<subtype android:label="%s" android:languageTag="hi" android:imeSubtypeLocale="hi_IN" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=devanagari,default_layout=deva_inscript,dictionary=hi,extra_keys=₹" />
<subtype android:label="%s" android:languageTag="hr" android:imeSubtypeLocale="hr" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=latin,default_layout=latn_qwerty_us,dictionary=hr,extra_keys=č|ć|dž|đ|lj|nj|š|ž" />
<subtype android:label="%s" android:languageTag="hu" android:imeSubtypeLocale="hu_HU" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=latin,default_layout=latn_qwertz_hu,dictionary=hu,extra_keys=accent_aigu:á:é:í:ó:ú@d|accent_trema:ö:ü@u|accent_ogonek@s|accent_double_aigu:ő:ű@k|€" />
+10 -10
View File
@@ -1,14 +1,14 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- See [number_row_no_symbols.xml] for the number row with no symbols. -->
<row height="0.75">
<key key0="1" se="!"/>
<key key0="2" se="@"/>
<key key0="3" se="#"/>
<key key0="4" se="$"/>
<key key0="5" se="%"/>
<key key0="6" sw="^"/>
<key key0="7" sw="&amp;"/>
<key key0="8" sw="*"/>
<key key0="9" sw="("/>
<key key0="0" sw=")"/>
<key role="action" key0="1" se="!"/>
<key role="action" key0="2" se="@"/>
<key role="action" key0="3" se="#"/>
<key role="action" key0="4" se="$"/>
<key role="action" key0="5" se="%"/>
<key role="action" key0="6" sw="^"/>
<key role="action" key0="7" sw="&amp;"/>
<key role="action" key0="8" sw="*"/>
<key role="action" key0="9" sw="("/>
<key role="action" key0="0" sw=")"/>
</row>
+10 -10
View File
@@ -1,13 +1,13 @@
<?xml version="1.0" encoding="utf-8"?>
<row height="0.75">
<key key0="1"/>
<key key0="2"/>
<key key0="3"/>
<key key0="4"/>
<key key0="5"/>
<key key0="6"/>
<key key0="7"/>
<key key0="8"/>
<key key0="9"/>
<key key0="0"/>
<key role="action" key0="1"/>
<key role="action" key0="2"/>
<key role="action" key0="3"/>
<key role="action" key0="4"/>
<key role="action" key0="5"/>
<key role="action" key0="6"/>
<key role="action" key0="7"/>
<key role="action" key0="8"/>
<key role="action" key0="9"/>
<key role="action" key0="0"/>
</row>
+15 -15
View File
@@ -1,36 +1,36 @@
<?xml version="1.0" encoding="utf-8"?>
<keyboard bottom_row="false">
<row>
<key width="0.75" key0="loc esc" key2="~" key4="!"/>
<key width="0.75" key0="(" key2="[" key4="{"/>
<key width="0.75" role="action" key0="loc esc" key2="~" key4="!"/>
<key width="0.75" role="action" key0="(" key2="[" key4="{"/>
<key key0="7" key1="&lt;" key2="&gt;"/>
<key key0="8" key2="∞"/>
<key key0="9" key2="π"/>
<key width="0.75" key0="*" key1="√" key2="×" key3="\#"/>
<key width="0.75" key0="/" key1="%" key3="÷"/>
<key width="0.75" role="action" key0="*" key1="√" key2="×" key3="\#"/>
<key width="0.75" role="action" key0="/" key1="%" key3="÷"/>
</row>
<row>
<key width="0.75" key0="loc tab" key2="|" key4="\\"/>
<key width="0.75" key0=")" key2="]" key4="}"/>
<key width="0.75" role="action" key0="loc tab" key2="|" key4="\\"/>
<key width="0.75" role="action" key0=")" key2="]" key4="}"/>
<key key0="4" key1="box" key3="arrows"/>
<key key0="5" key7="up" key6="right" key5="left" key8="down"/>
<key key0="6"/>
<key width="0.75" key0="+" key1="Σ" key2="$"/>
<key width="0.75" key0="-" key1="^"/>
<key width="0.75" role="action" key0="+" key1="Σ" key2="$"/>
<key width="0.75" role="action" key0="-" key1="^"/>
</row>
<row>
<key width="0.75" key0="switch_greekmath"/>
<key width="0.75" key0="shift" key2="fn" key4="loc alt"/>
<key width="0.75" role="action" key0="switch_greekmath"/>
<key width="0.75" role="action" key0="shift" key2="fn" key4="loc alt"/>
<key key0="1" key1="superscript" key2="ordinal" key3="subscript"/>
<key key0="2"/>
<key key0="3"/>
<key width="1.5" key0="backspace" key2="delete"/>
<key width="1.5" role="action" key0="backspace" key2="delete"/>
</row>
<row height="0.95">
<key width="1.5" key0="switch_text" key2="ctrl"/>
<key width="1.5" role="action" key0="switch_text" key2="ctrl"/>
<key width="1.5" key0="0"/>
<key width="0.75" key0="." key1=":" key2="," key3=";"/>
<key width="0.75" key0="space" key1="&quot;" key2="'" key3="loc compose" key4="_"/>
<key width="1.5" key0="enter" key1="±" key2="action" key3="="/>
<key width="0.75" role="action" key0="." key1=":" key2="," key3=";"/>
<key width="0.75" role="action" key0="action" key1="&quot;" key2="'" key3="loc compose" key4="_"/>
<key width="1.5" role="action" key0="enter" key1="±" key2="action" key3="="/>
</row>
</keyboard>
+46
View File
@@ -0,0 +1,46 @@
<?xml version="1.0" encoding="utf-8"?>
<keyboard bottom_row="false">
<row>
<key width="0.75" role="action" key0="loc esc" key2="~" key4="!"/>
<key width="0.75" role="action" key0="(" key2="[" key4="{"/>
<key key0="7"/>
<key key0="8"/>
<key key0="9"/>
<key shift="4" key0="7" key1="&lt;" key2="&gt;"/>
<key key0="8" key2="∞"/>
<key key0="9" key2="π"/>
<key width="0.75" role="action" key0="*" key1="√" key2="×" key3="\#"/>
<key width="0.75" role="action" key0="/" key1="%" key3="÷"/>
</row>
<row>
<key width="0.75" role="action" key0="loc tab" key2="|" key4="\\"/>
<key width="0.75" role="action" key0=")" key2="]" key4="}"/>
<key key0="4"/>
<key key0="5"/>
<key key0="6"/>
<key shift="4" key0="4" key1="box" key3="arrows"/>
<key key0="5" key7="up" key6="right" key5="left" key8="down"/>
<key key0="6"/>
<key width="0.75" role="action" key0="+" key1="Σ" key2="$"/>
<key width="0.75" role="action" key0="-" key1="^"/>
</row>
<row>
<key width="0.75" role="action" key0="switch_greekmath"/>
<key width="0.75" role="action" key0="shift" key2="fn" key4="loc alt"/>
<key key0="1"/>
<key key0="2"/>
<key key0="3"/>
<key shift="4" key0="1" key1="superscript" key2="ordinal" key3="subscript"/>
<key key0="2"/>
<key key0="3"/>
<key width="1.5" role="action" key0="backspace" key2="delete"/>
</row>
<row height="0.95">
<key width="1.5" role="action" key0="switch_text" key2="ctrl"/>
<key width="2" key0="0"/>
<key role="action" key0="." key1=":" key2="," key3=";"/>
<key width="1.5" shift="4" role="action" key0="space" key1="&quot;" key2="'" key3="loc compose" key4="_"/>
<key width="1.5" key0="0"/>
<key width="1.5" role="action" key0="enter" key1="±" key2="action" key3="="/>
</row>
</keyboard>
+17 -17
View File
@@ -1,27 +1,27 @@
<?xml version="1.0" encoding="utf-8"?>
<keyboard bottom_row="false">
<row>
<key key0="7"/>
<key key0="8"/>
<key key0="9"/>
<key key0="/"/>
<key role="action" key0="7"/>
<key role="action" key0="8"/>
<key role="action" key0="9"/>
<key role="action" key0="/"/>
</row>
<row>
<key key0="4"/>
<key key0="5"/>
<key key0="6"/>
<key key0="*"/>
<key role="action" key0="4"/>
<key role="action" key0="5"/>
<key role="action" key0="6"/>
<key role="action" key0="*"/>
</row>
<row>
<key key0="1"/>
<key key0="2"/>
<key key0="3"/>
<key key0="-"/>
<key role="action" key0="1"/>
<key role="action" key0="2"/>
<key role="action" key0="3"/>
<key role="action" key0="-"/>
</row>
<row height="0.95">
<key key0="0"/>
<key key0="."/>
<key key0="="/>
<key key0="+"/>
<key role="action" key0="0"/>
<key role="action" key0="."/>
<key role="action" key0="="/>
<key role="action" key0="+"/>
</row>
</keyboard>
</keyboard>
+6 -6
View File
@@ -4,24 +4,24 @@
<key shift="1.0" key0="1"/>
<key key0="2" indication="ABC"/>
<key key0="3" indication="DEF"/>
<key key0="backspace" key2="delete"/>
<key role="action" key0="backspace" key2="delete"/>
</row>
<row>
<key shift="1.0" key0="4" indication="GHI"/>
<key key0="5" indication="JKL"/>
<key key0="6" indication="MNO"/>
<key key0="(" key1="paste" key2="=" key3=":" key4="-"/>
<key role="action" key0="(" key1="paste" key2="=" key3=":" key4="-"/>
</row>
<row>
<key shift="1.0" key0="7" indication="PQRS"/>
<key key0="8" indication="TUV"/>
<key key0="9" indication="WXYZ"/>
<key key0=")" key2="," key3="/" key4="."/>
<key role="action" key0=")" key2="," key3="/" key4="."/>
</row>
<row>
<key shift="1.0" key0="*" key1="switch_text" key3="switch_numeric"/>
<key role="action" shift="1.0" key0="*" key1="switch_text" key3="switch_numeric"/>
<key key0="0" key3="+" key4="space"/>
<key key0="\#" key7="up" key6="right" key5="left" key8="down"/>
<key key0="action" key2="enter"/>
<key role="action" key0="\#" key7="up" key6="right" key5="left" key8="down"/>
<key role="action" key0="action" key2="enter"/>
</row>
</keyboard>
+38
View File
@@ -0,0 +1,38 @@
<?xml version="1.0" encoding="utf-8"?>
<keyboard width="13.0" bottom_row="false">
<row>
<key shift="1" key0="1"/>
<key key0="2"/>
<key key0="3"/>
<key shift="5" key0="1"/>
<key key0="2" indication="ABC"/>
<key key0="3" indication="DEF"/>
<key role="action" key0="backspace" key2="delete"/>
</row>
<row>
<key shift="1" key0="4"/>
<key key0="5"/>
<key key0="6"/>
<key shift="5" key0="4" indication="GHI"/>
<key key0="5" indication="JKL"/>
<key key0="6" indication="MNO"/>
<key role="action" key0="(" key1="paste" key2="=" key3=":" key4="-"/>
</row>
<row>
<key shift="1" key0="7"/>
<key key0="8"/>
<key key0="9"/>
<key shift="5" key0="7" indication="PQRS"/>
<key key0="8" indication="TUV"/>
<key key0="9" indication="WXYZ"/>
<key role="action" key0=")" key2="," key3="/" key4="."/>
</row>
<row>
<key shift="1" width="1.5" key0="0"/>
<key width="1.5" role="action" key0="space"/>
<key shift="5" role="action" key0="*" key1="switch_text" key3="switch_numeric"/>
<key key0="0" key3="+" key4="space"/>
<key role="action" key0="\#" key7="up" key6="right" key5="left" key8="down"/>
<key role="action" key0="action" key2="enter"/>
</row>
</keyboard>
+2
View File
@@ -11,6 +11,7 @@
<ListPreference android:key="number_row" android:title="@string/pref_number_row_title" android:summary="%s" android:defaultValue="no_number_row" android:entries="@array/pref_show_number_row_entries" android:entryValues="@array/pref_show_number_row_values"/>
<ListPreference android:key="show_numpad" android:title="@string/pref_show_numpad_title" android:summary="%s" android:defaultValue="1" android:entries="@array/pref_show_numpad_entries" android:entryValues="@array/pref_show_numpad_values"/>
<ListPreference android:key="numpad_layout" android:title="@string/pref_numpad_layout" android:summary="%s" android:defaultValue="high_first" android:entries="@array/pref_numpad_layout_entries" android:entryValues="@array/pref_numpad_layout_values"/>
<ListPreference android:key="split_layout" android:title="@string/pref_split_layout" android:summary="%s" android:defaultValue="wide" android:entries="@array/pref_split_layout_entries" android:entryValues="@array/pref_split_layout_values"/>
</PreferenceCategory>
<PreferenceCategory android:title="@string/pref_category_suggestions">
<CheckBoxPreference android:key="suggestions" android:title="@string/pref_suggestions_title" android:summary="@string/pref_suggestions_summary" android:defaultValue="true"/>
@@ -24,6 +25,7 @@
<CheckBoxPreference android:key="keyrepeat_enabled" android:title="@string/pref_keyrepeat_enabled" android:defaultValue="true"/>
<juloo.keyboard2.prefs.IntSlideBarPreference android:key="longpress_interval" android:dependency="keyrepeat_enabled" android:title="@string/pref_long_interval_title" android:summary="%sms" android:defaultValue="25" min="5" max="100"/>
<CheckBoxPreference android:key="lock_double_tap" android:title="@string/pref_lock_double_tap_title" android:summary="@string/pref_lock_double_tap_summary" android:defaultValue="false"/>
<ListPreference android:key="physical_keyboard_behavior" android:title="@string/pref_physical_keyboard_behavior" android:summary="%s" android:defaultValue="hide" android:entries="@array/pref_physical_keyboard_behavior_entries" android:entryValues="@array/pref_physical_keyboard_behavior_values"/>
</PreferenceCategory>
<PreferenceCategory android:title="@string/pref_category_behavior">
<CheckBoxPreference android:key="autocapitalisation" android:title="@string/pref_autocapitalisation_title" android:summary="@string/pref_autocapitalisation_summary" android:defaultValue="true"/>
+9
View File
@@ -0,0 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- This file define a row but it's layed out as a column instead in
[LayoutLandscapeModifier]. -->
<row>
<key role="suggestion" width="1" c="complete_emoji"/>
<key role="suggestion" width="3" c="complete_first"/>
<key role="suggestion" width="3" c="complete_second"/>
<key role="suggestion" width="3" c="complete_third"/>
</row>
+4
View File
@@ -1,4 +1,8 @@
{
" ": {
// Override the default space-space sequence to show the nbsp symbol
" ": "nbsp"
},
"V": {
"~": "Ṽ",
"s": "Š",
@@ -114,11 +114,11 @@ public final class ClipboardHistoryService
if (!Config.globalConfig().clipboard_history_enabled)
return;
int size = _history.size();
if (clip.equals("") || (size > 0 && _history.get(size - 1).content.equals(clip)))
if (clip.equals("") || (size > 0 && _history.get(0).content.equals(clip)))
return;
if (size >= MAX_HISTORY_SIZE)
_history.remove(0);
_history.add(new HistoryEntry(clip));
_history.remove(size - 1);
_history.add(0,new HistoryEntry(clip));
if (_listener != null)
_listener.on_clipboard_history_change();
}
+1 -1
View File
@@ -46,7 +46,7 @@ public final class ClipboardPinView extends NonScrollListView
/** Pin a clipboard and persist the change. */
public void add_entry(String text)
{
_entries.add(text);
_entries.add(0,text);
_adapter.notifyDataSetChanged();
persist();
invalidate();
+243 -243
View File
@@ -29,121 +29,121 @@ public final class ComposeKeyData
"`abcdefghijklmnoprstuvwxyz{|~\u00a8\u00af\u00b4\u00b8\u00f7\u02d8\u0391\u0395\u0397\u0399\u039f\u03a5\u03a9\u03b1\u03b5\u03b7\u03b9\u03bf\u03c5\u03c9\u0406\u0408\u0410\u0413\u0414\u0415\u0416\u0417\u0418\u0419\u041a\u041b\u041c\u041d\u041e\u041f\u0421\u0422\u0423\u0425\u0427\u0428\u042e" +
"\u0430\u0431\u0433\u0434\u0435\u0436\u0437\u0438\u0439\u043a\u043b\u043c\u043d\u043e\u043f\u0442\u0443\u0445\u0447\u0448\u044a\u044e\u0456\u0458\u0460\u0461\u0467\u05b4\u05b7\u05b8\u05b9\u05bc\u05bf\u05c1\u05c2\u0627\u062a\u062c\u062d\u062f\u0633\u0634\u0639\u063a\u0641\u0642\u0644\u0646\u0647\u0648\u064a\u0653\u0654\u0655\u0667\u0668\u06cc\u06f7\u06f8\u093c\u09bc\u09c7\u0a3c\u0b3c\u0b47\u0bc6\u0bc7\u0bd7\u0c46\u0cbf\u0cc6\u0cca" +
"\u0d46\u0d47\u0dd9\u0ddc\u0f71\u0f90\u0f92\u0f9c\u0fa1\u0fa6\u0fab\u0fb2\u0fb3\u0fb5\u0fb7\u102e\u1100\u1102\u1103\u1105\u1106\u1107\u1108\u1109\u110a\u110b\u110c\u110e\u1111\u1112\u1121\u1132\u113c\u113e\u114e\u1150\u1161\u1163\u1165\u1167\u1169\u116a\u116d\u116e\u116f\u1172\u1173\u1174\u1175\u119e\u11a8\u11aa\u11ab\u11ae\u11af\u11b0\u11b1\u11b2\u11b3\u11b7\u11b8\u11ba\u11bc\u11c1\u11c2\u11ce\u11dd\u11ec\u11f0\u2190\u2191\u2192" +
"\u2193\u2203\u2206\u2207\u2208\u220a\u220b\u2218\u2223\u2225\u2227\u2228\u2229\u222a\u223c\u2243\u2248\u224d\u2260\u2261\u2264\u2265\u2272\u2273\u2276\u2277\u227a\u227b\u227c\u227d\u2282\u2283\u2286\u2287\u2291\u2292\u22a3\u22a4\u22a5\u22a8\u22a9\u22ab\u22b2\u22b3\u22b4\u22b5\u22c4\u2373\u2375\u237a\u2395\u25cb\u2add\u0000 (,-.<>_\u00a0\u02d8\u00b8~\u2008\u02c7^\u00af\u0000!" +
"+?ABDEHIKLMNORSTUVWYZ^abdehiklmnorstuvwyz\u01a0\u01a1\u01af\u01b0\u00a1\u0000OUou\u1ee2\u1ef0\u203d\u1ea0\u1e04\u1e0c\u1eb8\u1e24\u1eca\u1e32\u1e36\u1e42\u1e46\u1ecc\u1e5a\u1e62\u1e6c\u1ee4\u1e7e\u1e88\u1ef4" +
"\u1e92\u00a6\u0000 \"',<>AEHIOUWXY_aehiotuwxy~\u00af\u00b4\u00d5\u00f5\u016a\u016b\u0399\u03a5\u03b9\u03c5\u03d2\u0406\u0410\u0415\u0416\u0417\u0418\u041e\u0423\u0427\u042b\u042d\u0430\u0435\u0436\u0437\u0438\u043e\u0443\u0447\u044b\u044d\u0456\u04d8\u04d9\u04e8\u04e9\u00a8\u0344\u201e\u201c\u201d" +
"\u00c4\u00cb\u1e26\u00cf\u00d6\u00dc\u1e84\u1e8c\u0178\u0000Uu\u1e7a\u1e7b\u0000Oo\u1e4e\u0000Uu\u03aa\u03ab\u0407\u04d2\u0401\u04dc\u04de\u04e4\u04e6\u04f0\u04f4\u04f8\u04ec\u0451\u0457\u04da\u04ea\u0000#ESbefq\u266f\u266b\u266c\u266d\u266a\u266e\u2669\u0000o\u2030\u0000\"'()+,/<>ACEGIJ" +
"KLMNOPRSUWYZ^_abcegijklmnoprsuwyz~\u00af\u00b8\u00c2\u00c5\u00c6\u00c7\u00ca\u00cf\u00d4\u00d5\u00d8\u00dc\u00e2\u00e5\u00e6\u00e7\u00ea\u00ef\u00f4\u00f5\u00f8\u00fc\u0102\u0103\u0112\u0113\u014c\u014d\u0168\u0169\u01a0\u01a1\u01af\u01b0\u0391\u0395\u0397\u0399" +
"\u039f\u03a5\u03a9\u03b1\u03b5\u03b7\u03b9\u03bf\u03c5\u03c9\u0410\u0413\u0415\u0418\u041a\u041e\u0420\u0423\u042b\u042d\u042e\u042f\u0430\u0433\u0435\u0438\u043a\u043e\u0440\u0443\u044b\u044d\u044e\u044f\u2395\u0000 IUiu\u03b9\u03c5\u0385\u1e2e\u01d7\u0390\u00b4\u0000\u0391\u0395\u0397\u0399\u039f\u03a5\u03a9\u03b1\u03b5\u03b7\u03b9\u03bf\u03c5\u03c9\u1f0d\u1f1d\u1f2d\u1f3d\u1f4d\u1f5d\u1f6d\u1f05\u1f15" +
"\u1f25\u1f35\u1f45\u1f55\u1f65\u0000\u0391\u0395\u0397\u0399\u039f\u03a9\u03b1\u03b5\u03b7\u03b9\u03bf\u03c5\u03c9\u1f0c\u1f1c\u1f2c\u1f3c\u1f4c\u1f6c\u1f04\u1f14\u1f24\u1f34\u1f44\u1f54\u1f64\u0000OUou\u1eda\u1ee8\u201a\u0000Oo\u01fe\u2018\u2019\u00c1\u0106\u00c9\u01f4\u00cd\uFFFF\u004a\u0301\u1e30\u0139\u1e3e\u0143\u00d3\u1e54\u0154\u015a\u00da\u1e82\u00dd\u0179\u0000AEOae" +
"o\u1ea4\u1ebe\u1ed0\u0000EOeo\u1e16\u1e52\u0000Aa\u1eae\u0000OUou\u1e4c\u1e78\u0000EOeo\u0000Cc\u1e08\u01fa\u01fc\u0386\u0388\u0389\u038a\u038c\u038e\u038f\u03ce\uFFFF\u0410\u0301\u0403\uFFFF\u0415\u0301\uFFFF\u0418\u0301\u040c\uFFFF\u041e\u0301\uFFFF\u0420\u0301\uFFFF\u0423\u0301\uFFFF\u042b\u0301\uFFFF\u042d\u0301\uFFFF\u042e\u0301\uFFFF\u042f" +
"\u0301\uFFFF\u0440\u0301\u235e\u0000 ()-0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" +
"\u0391\u0395\u0397\u0399\u039f\u03a1\u03a5\u03a9\u03b1\u03b5\u03b7\u03b9\u03bf\u03c1\u03c5\u03c9\u1100\u1102\u1103\u1105\u1106\u1107\u1109\u110b\u110c\u110e\u110f\u1110\u1111\u1112\u30a2\u30a4\u30a6\u30a8\u30aa\u30ab\u30ad\u30af\u30b1\u30b3\u30b5\u30b7\u30b9\u30bb\u30bd\u30bf\u30c1\u30c4\u30c6\u30c8\u30ca\u30cb\u30cc\u30cd\u30ce\u30cf\u30d2\u30d5\u30d8\u30db\u30de\u30df\u30e0\u30e1\u30e2\u30e4\u30e6\u30e8\u30e9\u30ea\u30eb\u30ec" +
"\u30ed\u30ef\u30f0\u30f1\u30f2\u4e00\u4e03\u4e09\u4e0a\u4e0b\u4e2d\u4e5d\u4e8c\u4e94\u4f01\u4f11\u512a\u516b\u516d\u5199\u52b4\u533b\u5341\u5354\u5370\u53f3\u540d\u56db\u571f\u591c\u5973\u5b66\u5b97\u5de6\u65e5\u6708\u6709\u6728\u682a\u6b63\u6c34\u6ce8\u706b\u7279\u7537\u76e3\u793e\u795d\u79d8\u8ca1\u8cc7\u9069\u91d1\u9805[\u0000)\uFFFF\ud83c\udd2f{\u0000)\u24ea\u0000)012345" +
"6789\u2460\u0000)\u2469\u0000)\u246a\u0000)\u246b\u0000)\u246c\u0000)\u246d\u0000)\u246e\u0000)\u246f\u0000)\u2470\u0000)\u2471\u0000)\u2472\u0000)0123456789\u2461\u0000)\u2473\u0000)\u3251\u0000)\u3252\u0000)\u3253\u0000)\u3254\u0000)\u3255\u0000)\u3256\u0000)\u3257" +
"\u0000)\u3258\u0000)\u3259\u0000)0123456789\u2462\u0000)\u325a\u0000)\u325b\u0000)\u325c\u0000)\u325d\u0000)\u325e\u0000)\u325f\u0000)\u32b1\u0000)\u32b2\u0000)\u32b3\u0000)\u32b4\u0000)0123456789\u2463\u0000)\u32b5\u0000)\u32b6\u0000)\u32b7\u0000" +
")\u32b8\u0000)\u32b9\u0000)\u32ba\u0000)\u32bb\u0000)\u32bc\u0000)\u32bd\u0000)\u32be\u0000)0\u2464\u0000)\u32bf\u0000)\u2465\u0000)\u2466\u0000)\u2467\u0000)\u2468\u0000)\u24b6\u0000)\u24b7\u0000)\u24b8\u0000)\u24b9\u0000)\u24ba\u0000)\u24bb\u0000)\u24bc\u0000)\u24bd\u0000)\u24be\u0000)\u24bf\u0000)\u24c0" +
"\u0000)\u24c1\u0000)\u24c2\u0000)\u24c3\u0000)\u24c4\u0000)\u24c5\u0000)\u24c6\u0000)\u24c7\u0000)\u24c8\u0000)\u24c9\u0000)\u24ca\u0000)\u24cb\u0000)\u24cc\u0000)\u24cd\u0000)\u24ce\u0000)\u24cf\u0000)\u24d0\u0000)\u24d1\u0000)\u24d2\u0000)\u24d3\u0000)\u24d4\u0000)\u24d5\u0000)\u24d6\u0000)\u24d7\u0000)\u24d8" +
"\u0000)\u24d9\u0000)\u24da\u0000)\u24db\u0000)\u24dc\u0000)\u24dd\u0000)\u24de\u0000)\u24df\u0000)\u24e0\u0000)\u24e1\u0000)\u24e2\u0000)\u24e3\u0000)\u24e4\u0000)\u24e5\u0000)\u24e6\u0000)\u24e7\u0000)\u24e8\u0000)\u24e9\u1f09\u1f19\u1f29\u1f39\u1f49\u1fec\u1f59\u1f69\u1f01\u1f11\u1f21\u1f31\u1f41\u1fe5\u1f51\u1f61\u0000)\u1161\u3260\u0000" +
")\u326e\u0000)\u1161\u3261\u0000)\u326f\u0000)\u1161\u3262\u0000)\u3270\u0000)\u1161\u3263\u0000)\u3271\u0000)\u1161\u3264\u0000)\u3272\u0000)\u1161\u3265\u0000)\u3273\u0000)\u1161\u3266\u0000)\u3274\u0000)\u1161\u3267\u0000)\u3275\u0000)\u1161\u3268\u0000)\u3276\u0000)\u1161\u3269\u0000)\u3277\u0000)\u1161\u326a\u0000)\u3278" +
"\u0000)\u1161\u326b\u0000)\u3279\u0000)\u1161\u326c\u0000)\u327a\u0000)\u1161\u326d\u0000)\u327b\u0000)\u32d0\u0000)\u32d1\u0000)\u32d2\u0000)\u32d3\u0000)\u32d4\u0000)\u32d5\u0000)\u32d6\u0000)\u32d7\u0000)\u32d8\u0000)\u32d9\u0000)\u32da\u0000)\u32db\u0000)\u32dc\u0000)\u32dd\u0000)\u32de\u0000)\u32df\u0000)\u32e0" +
"\u0000)\u32e1\u0000)\u32e2\u0000)\u32e3\u0000)\u32e4\u0000)\u32e5\u0000)\u32e6\u0000)\u32e7\u0000)\u32e8\u0000)\u32e9\u0000)\u32ea\u0000)\u32eb\u0000)\u32ec\u0000)\u32ed\u0000)\u32ee\u0000)\u32ef\u0000)\u32f0\u0000)\u32f1\u0000)\u32f2\u0000)\u32f3\u0000)\u32f4\u0000)\u32f5\u0000)\u32f6\u0000)\u32f7\u0000)\u32f8" +
"\u0000)\u32f9\u0000)\u32fa\u0000)\u32fb\u0000)\u32fc\u0000)\u32fd\u0000)\u32fe\u0000)\u3280\u0000)\u3286\u0000)\u3282\u0000)\u32a4\u0000)\u32a6\u0000)\u32a5\u0000)\u3288\u0000)\u3281\u0000)\u3284\u0000)\u32ad\u0000)\u32a1\u0000)\u329d\u0000)\u3287\u0000)\u3285\u0000)\u32a2\u0000)\u3298\u0000)\u32a9\u0000)\u3289" +
"\u0000)\u32af\u0000)\u329e\u0000)\u32a8\u0000)\u3294\u0000)\u3283\u0000)\u328f\u0000)\u32b0\u0000)\u329b\u0000)\u32ab\u0000)\u32aa\u0000)\u32a7\u0000)\u3290\u0000)\u328a\u0000)\u3292\u0000)\u328d\u0000)\u3291\u0000)\u32a3\u0000)\u328c\u0000)\u329f\u0000)\u328b\u0000)\u3295\u0000)\u329a\u0000)\u32ac\u0000)\u3293" +
"\u0000)\u3297\u0000)\u3299\u0000)\u3296\u0000)\u32ae\u0000)\u329c\u0000)\u328e\u0000)\u32a0\u0000)-\u0391\u0395\u0397\u0399\u039f\u03a9\u03b1\u03b5\u03b7\u03b9\u03bf\u03c1\u03c5\u03c9]}\u1f08\u1f18\u1f28\u1f38\u1f48\u1f68\u1f00\u1f10\u1f20\u1f30\u1f40\u1fe4\u1f50\u1f60\u0000'0AUau\u00a8\u25cb\u0000Aa\u00c5\u016e\u235f\u0000+-" +
"OUou#\u00b1\u01a0\u01af\u0000 \"',-ACDEGHIKLNORSTUacdeghiklnorstu\u0413\u041a\u041b\u041d\u0425\u0433\u043a\u043b\u043d\u0445\u0466\u0467\u00ac\u0104\u00c7\u1e10\u0118\u0122\u1e28\u012e\u0136\u013b\u0145\u01ea\u0156\u015e\u0162\u0172" +
"\u04fa\u04c3\u0512\u04c7\u04fc\u04fb\u04c4\u0513\u04c8\u04fd\u04c9\u04ca\u0000 ()+,-./:>ADEIKLOU\\^_adeilou\u2191\u2193\u25cb\u0000 -.\u00ad\u2014\u2013\u0000Ee\uFFFF\u0116\u0304\uFFFF\u0117\u0304\u233f\u00f7\u0100\u0110\u0112\u012a\u20ad\u00a3\u014c\u016a\u2340\u2212" +
"\u234f\u2356\u2296\u0000 !'-.:<=>ABCDEFGHIMNOPRSTWXYZ^abcdefghimnoprstwxyz\u00b4\u015a\u015b\u0160\u0161\u017f\u0406\u0413\u0416\u0419\u041a\u041b\u041c\u041d\u0425\u0427\u0433\u0436" +
"\u0439\u043a\u043b\u043c\u043d\u0445\u0447\u0456\u1e62\u1e63\u25cb\u02d9\u0000Ss\u1e68\u0000Ss\u1e64\u00b7\u2026\u2235\u2039\u2022\u203a\u0226\u1e02\u010a\u1e0a\u0116\u1e1e\u0120\u1e22\u0130\u1e40\u1e44\u022e\u1e56\u1e58\u1e60\u1e6a\u1e86\u1e8a\u1e8e\u017b\u0000Ss\u1e66\u04f6\u0496\u048a\u049a\u052e\u04cd\u04b2\u04b6\u04f7\u0497\u048b\u049b\u052f\u04ce\u04b3\u04b7\u2299\u0000-/<=" +
"BCDGHILOTZ^bcdghilmotuvz\u0294\u0413\u041a\u0433\u043a\u04ae\u04af\u2190\u2192\u2194\u2395\\\u2260\u0243\u20a1\u01e4\u0126\u0197\u0141\u00d8\u0166\u01b5|\u00a2\u20a5\u00b5\u221a\u02a1\u0492\u049e\u0493\u049f\u04b0\u219a\u219b\u21ae\u2341\u0000*3~\u2189\u236c\u00001234" +
"56789^\u00000\u2152\u00bd\u2153\u00bc\u2155\u2159\u2150\u215b\u2151\u000035^\u2154\u2156\u0000458^\u00be\u2157\u215c\u00005\u2158\u000068\u215a\u215d\u00008\u215e\u00008\u221e\u0000()-.\u2395\u2639\u263a\u2234\u2360\u0000 AEIOSTU_aeiostu" +
"\u02db\u0218\u021a\u236e\u0219\u021b\u0000 \"'-/3<=>CDELNRSTZ_cdelnrstz\u2395\u226e\u2665\u00ab\u2264\u22c4\u010c\u010e\u011a\u013d\u0147\u0158\u0160\u0164\u017d\u2343\u0000/<>CELNOPRTUWY^_cdeo" +
"pruvy\u0415\u0417\u0421\u0423\u0437\u0443\u2395\u21d0\u21d2\u20ac\u20a4\u20a6\u0150\u20bd\u20b9\u20ae\u0170\u20a9\u00a5\u21d1\u2261\u20ab\u21d3\u04f2\u2338\u0000 \"'/<=>AEIOU_aeiou\u00a8\u2395\u226f\u2265\u00bb\u00c2\u00ca\u00ce\u00d4\u00db\u2369\u2344\u0000!+?AEIOUY\\" +
"^abeiouy\u00c2\u00ca\u00d4\u00e2\u00ea\u00f4\u0102\u0103\u01a0\u01a1\u01af\u01b0\u2395\u2e18\u0000OUou\u1ede\u1eec\u00bf\u1ea2\u1eba\u1ec8\u1ece\u1ee6\u1ef6\u262d\u0000AEOaeo\u1ea8\u1ec2\u1ed4\u0000Aa\u1eb2\u2370\u0000\"'(*,-;>AET^_`aet~\u00a8" +
"\u00b4\u0102\u00c6@\u00c0\u00c3\u0000.|\u0e3f\u0000',./<=CEOr|\u2102\u20a0\u00a9\u20a2\u20b5\u0000,-.<Hh\u00d0\u0000\"',-.;<=>E^_`e~\u00a8\u00b4\u018f\u00c8\u1ebc\u0000.Uilr\uFFFF\ud83d\udd95\uFFFF\ufb03\uFFFF\ufb04\u20a3\u0000(" +
",.TUnu|\u02d8\u011e>\u0000~\uFFFF\u004e\u0360\u0067\u20b2\u0000,\u0000\"',-.;>J^_`j~\u00a8\u00b4\u0132\u00cc\u0128\u0000'\u00b4\u0000,-\u0000',-/<=LTV\u0000A\u0000P\uFFFF\ud83d\udd96<\u0000.\u0000',<=GNO" +
"gno~\u014a\u2115\u2116\u00d1\u0000\"',-/;>ACERSXY^_`e~\u00a8\u00b4\u0152\u00ae\u00a7\u00a4\u262e\u00d2\u00d5\u0000!.=Pt\u00b6\u20a7\u0000Qq\u211a\u0000',<=ORrs\u211d\u20a8\u0000!',.;<MOSs|" +
"\u2120\u1e9e$\u0000,-./;<=HMhz\u00de\u2122\uFFFF\ua728\u0000 !\"'*,-;>AEGIOU^_`aegiou~\u00a8\u00b4\u00b8\u0391\u0399\u03a5\u03b1\u03b9\u03c5\u0410\u0415\u0416\u0418\u0423\u0430\u0435\u0436\u0438\u0443\u0000,\u0000Ee\u1e1c\u0000A" +
"a\u1eb6\u0114\u012c\u014e\u016c\u00d9\u0103\u0115\u011f\u012d\u014f\u016d\u0168\u0000Ee\u1fb8\u1fd8\u1fe8\u1fb0\u1fd0\u1fe0\u04d0\u04d6\u04c1\u0419\u040e\u04d1\u04d7\u04c2\u0439\u045e\u0000Lcsz~\u1e7c\u0000=^\u0174\u0000O\u0000\"'=^~\u00a8\u00b4\u0176\u1ef8\u0000'.<Zz\u2124\u0000]\u2337\u0000-?not" +
"\u2395\u25cb\uFFFF\\\u006e\u0000/\uFFFF\ud83d\ude4c\uFFFF\\\u0074\u2342\u2349\u0000[\u0000!()+-./0123456789=ACEGHIJOSUWYZ_aceghijosuwyz|\u0410\u0415\u0418\u041e\u0420\u0423\u0430\u0435" +
"\u0438\u043e\u0440\u0443\u1eb8\u1eb9\u1ecc\u1ecd\u2212\u4e00\u4e01\u4e09\u4e0a\u4e0b\u4e19\u4e2d\u4e59\u4e8c\u4eba\u56db\u5730\u5929\u7532\u0000AEOaeo\u1eac\u1ec6\u1ed8\u0108\u011c\u0124\u0134\u015c\u1e90\u0000ahijlnorswxy\u0263\u0266\u0279\u027b\u0281\u0295\uFFFF\u0410\u0302\uFFFF\u0415\u0302\uFFFF\u0418\u0302\uFFFF\u041e\u0302\uFFFF\u0420" +
"\u0302\uFFFF\u0423\u0302\uFFFF\u0440\u0302\u3192\u319c\u3194\u3196\u3198\u319b\u3197\u319a\u3193\u319f\u3195\u319e\u319d\u3199\u0000 !\"'()+-.0123456789;<=>AEGIOUY^_aegiouy~\u00c4\u00c6\u00d5\u00d6\u00dc\u00e4\u00e6\u00f5\u00f6\u00fc" +
"\u0226\u0227\u0391\u0399\u03a5\u03b1\u03b9\u03c5\u0410\u0415\u0418\u041e\u0420\u0423\u0430\u0435\u0438\u043e\u0440\u0443\u1e36\u1e37\u1e5a\u1e5b\u2206\u220a\u2212\u2218\u2260\u2282\u2283\u22a5\u22c4\u2373\u2375\u237a\u25cb\u0000LRlr\u1e38\u1e5c\u0000AOUaou\u01de\u022a\u01d5\u2358\u0000AEOaeo\u01e0\u0230\u0000Oo\u01ec\u1e20\u0232\u0000O" +
"o\u022c\u01e2\u1fb9\u1fd9\u1fe9\uFFFF\u0410\u0304\uFFFF\u0415\u0304\u04e2\uFFFF\u041e\u0304\uFFFF\u0420\u0304\u04ee\uFFFF\u0430\u0304\uFFFF\u0435\u0304\uFFFF\u043e\u0304\uFFFF\u0440\u0304\u2359\u2377\u235b\u2262\u2286\u2287\u234a\u235a\u2378\u2379\u2376\u235c\u0000\"()+AEINOUWY^_`abeinouwy\u00af\u00c2\u00ca" +
"\u00d4\u00dc\u00e2\u00ea\u00f4\u00fc\u0102\u0103\u0112\u0113\u014c\u014d\u01a0\u01a1\u01af\u01b0\u0391\u0395\u0397\u0399\u039f\u03a5\u03a9\u03b1\u03b5\u03b7\u03b9\u03bf\u03c5\u03c9\u0410\u0415\u0418\u041e\u0420\u0423\u0430\u0435\u0438\u043e\u0440\u0443\u0000Uu\u03b9\u03c5\u01db\u1fd2\u0000\u0391\u0395\u0397\u0399\u039f\u03a5\u03a9\u03b1\u03b5\u03b7\u03b9\u03bf\u03c5\u03c9\u1f0b\u1f1b\u1f2b\u1f3b\u1f4b\u1f5b\u1f6b\u1f03" +
"\u1f13\u1f23\u1f33\u1f43\u1f53\u1f63\u0000\u0391\u0395\u0397\u0399\u039f\u03a9\u03b1\u03b5\u03b7\u03b9\u03bf\u03c5\u03c9\u1f0a\u1f1a\u1f2a\u1f3a\u1f4a\u1f6a\u1f02\u1f12\u1f22\u1f32\u1f42\u1f52\u1f62\u0000OUou\u1edc\u1eea\u01f8\u1e80\u1ef2\u0000AEOaeo\u1ea6\u1ec0\u1ed2\u0000EOeo\u1e14\u1e50\u0000\u0410\u0415\u0418\u041e\u0420\u0423\u0430\u0435\u0438\u043e\u0440" +
"\u0443\uFFFF\u0410\u030f\uFFFF\u0415\u030f\uFFFF\u0418\u030f\uFFFF\u041e\u030f\uFFFF\u0420\u030f\uFFFF\u0423\u030f\u0000Aa\u1eb0\u0000EOeo\u1fba\u1fc8\u1fca\u1fda\u1ff8\u1fea\u1ffa\uFFFF\u0410\u0300\u0400\u040d\uFFFF\u041e\u0300\uFFFF\u0420\u0300\uFFFF\u0423\u0300\uFFFF\u0430\u0300\uFFFF\u043e\u0300\uFFFF\u0440\u0300\uFFFF\u0443\u0300\u0000\"'(*,-;>E^" +
"_`ae~\u00a8\u00b4\u00e6\u0000!,.AEGIOUaegiou\u00b8\u0391\u0399\u03a5\u03b1\u03b9\u03c5\u0410\u0415\u0416\u0418\u0423\u0430\u0435\u0436\u0438\u0443\u0000Aa\u0000Ee\u0000Ee\u0000\"',./<=ACDEGHIKLNORST" +
"UZacdeghijklnorstuz|\u00dc\u00fc\u0000Uu\u01d9\u01cd\u01e6\u021e\u01cf\u01e8\u01d1\u01d3\u0000,-.<=hi\u00f0\u2300\u0000\"',-.;<=>^_`e~\u00a8\u00b4\u0259\u0000.Sfils\u017f\uFFFF\ufb00\uFFFF" +
"\ufb01\uFFFF\ufb02\u0000(,.Untu~\u02d8\u0000~\uFFFF\u006e\u0360\u0067\uFFFF\u0067\u0303\u0000,\u0000\"',-.;>^_`j~\u00a8\u00b4\u0133\u0000'\u00b4\u0000,k\u0138\u0000',-/<tv\u0000./u\u0000',<g~\u014b\u0000\"',-/" +
";>AU^_`aceorsuwxy~\u00a8\u00b4\u0153\u0000!.=o\u0000o\uFFFF\ud83d\udca9\u0000',<=\u0000!',.;<mos\u00b8\u00df\u0000,-./;<hmz\u00fe\uFFFF\ua729\u0000\"'*,-/;>AE" +
"GIOU^_`aegiou~\u00a8\u00b4\u0000/ACDEGHIKNORSTUZacdeghijklnorstuz|~\u0000^\u0000ox\u00d7\u0000\"'=^~\u00a8\u00b4\u0000'.<\u0000}" +
"\u2205\u0000-=BCGS^cv~\u2190\u2192\u2206\u2207\u222a\u2282\u25cb\u2020\u2021\u236d\u2345\u2346\u234b\u2352\u2366\u2367\u233d\u0000\"()+0AEINOUVY^abeinouvy|~\u00a8\u00c2\u00ca\u00d4\u00e2\u00ea\u00f4\u0102\u0103\u01a0\u01a1\u01af\u01b0\u03b1\u03b7\u03b9\u03c5" +
"\u03c9\u2207\u2227\u2228\u0000\u03b9\u03c5\u1fd7\u0000\u0391\u0397\u0399\u03a5\u03a9\u03b1\u03b7\u03b9\u03c5\u03c9\u1f0f\u1f2f\u1f3f\u1f5f\u1f6f\u1f07\u1f27\u1f37\u1f57\u1f67\u0000\u0391\u0397\u0399\u03a9\u03b1\u03b7\u03b9\u03c5\u03c9\u1f0e\u1f2e\u1f3e\u1f6e\u1f06\u1f26\u1f36\u1f56\u1f66\u0000OUou\u1ee0\u1eee\u0000AEOaeo\u1eaa\u1ec4\u1ed6\u0000Aa\u1eb4\u2248\u1fb6\u1fc6" +
"\u1fd6\u1fe6\u1ff6\u236b\u2372\u2371\u0000'*>AEIOUY`aeiouy~\u00b4\u2207\u2218\u22a4\u25cb\u1fed\u1fc1\u2361\u2365\u0000!\".;AEGIOUYaegiouy~\u00c4\u00c6\u00d5\u00d6\u00dc\u00e4\u00e6\u00f5\u00f6\u00fc\u0226\u0227\u0391\u0399\u03a5\u03b1\u03b9\u03c5\u0410" +
"\u0415\u0418\u041e\u0420\u0423\u0430\u0435\u0438\u043e\u0440\u0443\u1e36\u1e37\u1e5a\u1e5b\u22a4\u0000LRlr\u0000AOUaou\u0000AOao\u0000Oo\u0000Oo\u2351\u0000\"()+,/ACEGIJKLMNOPRSUWYZ^_abceg" +
"ijklmnoprsuwyz~\u00af\u00b8\u00c2\u00c5\u00c6\u00c7\u00ca\u00cf\u00d4\u00d5\u00d8\u00dc\u00e2\u00e5\u00e6\u00e7\u00ea\u00ef\u00f4\u00f5\u00f8\u00fc\u0102\u0103\u0112\u0113\u014c\u014d\u0168\u0169\u01a0\u01a1\u01af\u01b0\u0391\u0395\u0397\u0399\u039f\u03a5\u03a9\u03b1\u03b5\u03b7\u03b9\u03bf\u03c5\u03c9\u0410\u0413\u0415\u0418\u041a\u041e\u0420\u0423\u042b" +
"\u042d\u042e\u042f\u0430\u0433\u0435\u0438\u043a\u043e\u0440\u0443\u044b\u044d\u044e\u044f\u0000IUiu\u03b9\u03c5\u0000\u0391\u0395\u0397\u0399\u039f\u03a5\u03a9\u03b1\u03b5\u03b7\u03b9\u03bf\u03c5\u03c9\u0000\u0391\u0395\u0397\u0399\u039f\u03a9\u03b1\u03b5\u03b7\u03b9\u03bf\u03c5\u03c9\u0000OUou\u0000Cc\u0000Oo\u0000AEOaeo\u0000EO" +
"eo\u0000Aa\u0000OUou\u0000EOeo\u0000Cc\u0000CDEGHKLNRSTcdeghklnrst\u0228\u0000\u2395\u2339\u0000Gg\u0000'\u0000'\u0000'\u0000\"'\u0000'\u0000\"'\u0000'\u0000'\u0000'\u0000'\u0000\"" +
"'()`~\u00b4\u0391\u0397\u03a9\u03b1\u03b7\u03c9\u0000()\u03b1\u03b7\u03c9\u0000\u0391\u0397\u03a9\u03b1\u03b7\u03c9\u1f8d\u1f9d\u1fad\u1f85\u1f95\u1fa5\u0000\u0391\u0397\u03a9\u03b1\u03b7\u03c9\u1f8c\u1f9c\u1fac\u1f84\u1f94\u1fa4\u1fb4\u1fc4\u1ff4\u0000\u0391\u0397\u03a9\u03b1\u03b7\u03c9\u1f89\u1f99\u1fa9\u1f81\u1f91\u1fa1\u0000\u0391\u0397\u03a9\u03b1\u03b7\u03c9\u1f88\u1f98\u1fa8\u1f80\u1f90" +
"\u1fa0\u0000()\u03b1\u03b7\u03c9\u0000\u0391\u0397\u03a9\u03b1\u03b7\u03c9\u1f8b\u1f9b\u1fab\u1f83\u1f93\u1fa3\u0000\u0391\u0397\u03a9\u03b1\u03b7\u03c9\u1f8a\u1f9a\u1faa\u1f82\u1f92\u1fa2\u1fb2\u1fc2\u1ff2\u0000()\u03b1\u03b7\u03c9\u0000\u0391\u0397\u03a9\u03b1\u03b7\u03c9\u1f8f\u1f9f\u1faf\u1f87\u1f97\u1fa7\u0000\u0391\u0397\u03a9\u03b1\u03b7\u03c9\u1f8e\u1f9e\u1fae\u1f86\u1f96\u1fa6\u1fb7\u1fc7\u1ff7\u0000" +
"()\u03b1\u03b7\u03c9\u0000\u0391\u0397\u03a9\u03b1\u03b7\u03c9\u0000\u0391\u0397\u03a9\u03b1\u03b7\u03c9\u1fbc\u1fcc\u1ffc\u1fb3\u1fc3\u1ff3\u0000'\u0000\"'\u0000'\u0000\".\u0406\u0423\u0443\u0456\u0474\u0000\u0410\u0430\u0462\u0463\uFFFF\ua656\uFFFF\ua65c\u0000\u0415\u0423\u042b\u042c\u042d\u0435\u0443\u044b\u044c\u044d\ua64a\ua64b\ua650\ua651\u04d4\u0460\u0462\uFFFF\ua658\u04d8\uFFFF\ua64c" +
"\u0000,.\u0408\u0419\u041a\u0425\u0439\u043a\u0445\u0458\u0490\u0480\u0000\u0408\u0415\u0416\u0417\u0419\u0435\u0436\u0437\u0439\u0458\u0464\u0465\uFFFF\ua648\u040f\uFFFF\ua642\u0402\u0000=\u0000.\u0000=\u0424\u0444\u0498\u0000\u0418\u0423\u0438\u0443\u0000.\u0000,.\u0413\u0421\u0425\u0428\u0433\u0441\u0445\u0448\u046e\u0000,.\u042c\u044c\u0409\u0000.\u0000,\u00b7\u041e" +
"\u042c\u043e\u044c\u0528\u040a\u0000\u0422\u0423\u0442\u0443\u047e\u0478\u0000\u0421\u0441\u0470\u0000=\u0000\u0408\u0419\u0421\u0424\u0439\u0441\u0444\u0458\u040b\u0426\u0472\u0000\u0406\u0408\u0418\u0419\u0423\u0438\u0439\u0443\u0456\u0458\u0000,.\u0000.\u0000\u0422\u0442\u0429\u0000\u0406\u0410\u0415\u041c\u041d\u041e\u042c\u042d\u0430\u0435\u043c\u043d\u043e\u044c\u044d\u0456\u0464\u046c\u0468\uFFFF\ua652" +
"\u0000\u0435\u0443\u0447\u044b\u044c\u044d\ua64b\ua651\u04d5\u0461\uFFFF\u0063\u006f\u006d\u0062\u0069\u006e\u0069\u006e\u0067\u005f\u0061\u0069\u0067\u0075\u0463\uFFFF\ua659\u04d9\uFFFF\ua64d\u0000\u0447\uFFFF\u0063\u006f\u006d\u0062\u0069\u006e\u0069\u006e\u0067\u005f\u0073\u006c\u0061\u0076\u006f\u006e\u0069\u0063\u005f\u0070\u0073\u0069\u006c\u0069\u0000,.\u0439\u043a\u0445\u0458\u0491\u0481\u0000\u0435\u0436\u0437" +
"\u0439\u0458\u0465\uFFFF\ua649\u045f\uFFFF\ua643\u0452\u0000\u0447\uFFFF\u0063\u006f\u006d\u0062\u0069\u006e\u0069\u006e\u0067\u005f\u0074\u0072\u0065\u006d\u0061\u0000.\u0000=\u0444\u0499\u0000\u0438\u0443\u0475\u0000.\u0447\uFFFF\u0063\u006f\u006d\u0062\u0069\u006e\u0069\u006e\u0067\u005f\u0062\u0072\u0065\u0076\u0065\u0000,.\u0433\u0441\u0445\u0448\u046f\u0000,.\u044c\u0459\u0000.\u0000" +
",\u00b7\u0447\u044c\u0529\uFFFF\u0063\u006f\u006d\u0062\u0069\u006e\u0069\u006e\u0067\u005f\u0074\u0069\u0074\u006c\u006f\u045a\u0000\u0442\u0443\u0447\u047f\u0479\uFFFF\u0063\u006f\u006d\u0062\u0069\u006e\u0069\u006e\u0067\u005f\u0069\u006e\u0076\u0065\u0072\u0074\u0065\u0064\u005f\u0062\u0072\u0065\u0076\u0065\u0000\u0430\u0441\u0471\u0000\u0439\u0441\u0444\u0458\u045b\u0446\u0473\u0000\u0438\u0439\u0443\u0447\u0456\u0458" +
"\uFFFF\u0063\u006f\u006d\u0062\u0069\u006e\u0069\u006e\u0067\u005f\u0070\u006f\u006b\u0072\u0079\u0074\u0069\u0065\u0000,.\u0447\uFFFF\u0063\u006f\u006d\u0062\u0069\u006e\u0069\u006e\u0067\u005f\u0073\u006c\u0061\u0076\u006f\u006e\u0069\u0063\u005f\u0064\u0061\u0073\u0069\u0061\u0000.\u0430\u0431\u0435\u0439\u043d\u043e\u0443\u0445\u0447\u044a\u044e\u0458\u0467\uFFFF\u0063\u006f\u006d\u0062\u0069\u006e\u0069\u006e" +
"\u0067\u005f\u0070\u0061\u0079\u0065\u0072\u006f\u006b\uFFFF\u0063\u006f\u006d\u0062\u0069\u006e\u0069\u006e\u0067\u005f\u0076\u0065\u0072\u0074\u0069\u0063\u0061\u006c\u005f\u0074\u0069\u006c\u0064\u0065\uFFFF\u0063\u006f\u006d\u0062\u0069\u006e\u0069\u006e\u0067\u005f\u0067\u0072\u0061\u0076\u0065\uFFFF\u0063\u006f\u006d\u0062\u0069\u006e\u0069\u006e\u0067\u005f\u0076\u007a\u006d\u0065\u0074\u0000\u0442\u0449\u0000\u0447\u0000" +
"\u0430\u0435\u043c\u043d\u043e\u0447\u044c\u044d\u0456\uFFFF\ua657\u0465\u046d\u0469\uFFFF\ua65d\uFFFF\ua653\u0000\".\u0443\u0456\u0000\u0430\u0447\u0463\u0000\u0422\u0442\u0000\u0442\u0000\u0447\u0000\u05d9\uFFFF\ufb1d\u0000\u05d0\u05f2\uFFFF\ufb2e\uFFFF\ufb1f\u0000\u05d0\uFFFF\ufb2f\u0000\u05d5\uFFFF\ufb4b\u0000\u05d0\u05d1\u05d2\u05d3\u05d4\u05d5\u05d6\u05d8\u05d9\u05da\u05db\u05dc\u05de\u05e0\u05e1\u05e3\u05e4\u05e6" +
"\u05e7\u05e8\u05e9\u05ea\uFFFF\ufb30\uFFFF\ufb31\uFFFF\ufb32\uFFFF\ufb33\uFFFF\ufb34\uFFFF\ufb35\uFFFF\ufb36\uFFFF\ufb38\uFFFF\ufb39\uFFFF\ufb3a\uFFFF\ufb3b\uFFFF\ufb3c\uFFFF\ufb3e\uFFFF\ufb40\uFFFF\ufb41\uFFFF\ufb43\uFFFF\ufb44\uFFFF\ufb46\uFFFF\ufb47\uFFFF\ufb48\uFFFF\ufb49\uFFFF\ufb4a\u0000\u05d1\u05db\u05e4\uFFFF\ufb4c\uFFFF\ufb4d\uFFFF\ufb4e\u0000\u05bc\u05e9\ufb49\u0000\u05e9\uFFFF\ufb2c\uFFFF\ufb2a\u0000\u05bc\u05e9\ufb49" +
"\u0000\u05e9\uFFFF\ufb2d\uFFFF\ufb2b\u0000\u0627\u0639\u0648\u064a\u0667\u06cc\u06f7\uFFFF\u0063\u006f\u006d\u0062\u0069\u006e\u0069\u006e\u0067\u005f\u0061\u006c\u0065\u0066\u005f\u0061\u0062\u006f\u0076\u0065\u0623\u06c9\u063d\uFFFF\u0063\u006f\u006d\u0062\u0069\u006e\u0069\u006e\u0067\u005f\u0061\u006c\u0065\u0066\u005f\u0062\u0065\u006c\u006f\u0077\u0000\u062f\u0631\u0634\u0646\u0637\u0691\u062b\u0679\u0000\u0634\u0686\u0000" +
"\u062d\uFFFF\u0063\u006f\u006d\u0062\u0069\u006e\u0069\u006e\u0067\u005f\u0073\u0075\u006b\u0075\u006e\u0000\u062a\u0632\u06f7\u0630\u0695\u0000\u0634\u0635\u0000\u062a\u0000\u0627\u0647\u0648\u064a\u0667\u0668\u06cc\u06f7\u06f8\u0625\u06c0\u0624\u0626\uFFFF\u0063\u006f\u006d\u0062\u0069\u006e\u0069\u006e\u0067\u005f\u0068\u0061\u006d\u007a\u0061\u005f\u0062\u0065\u006c\u006f\u0077\uFFFF\u0063\u006f\u006d\u0062\u0069\u006e\u0069" +
"\u006e\u0067\u005f\u0068\u0061\u006d\u007a\u0061\u005f\u0061\u0062\u006f\u0076\u0065\u0000\u0643\u06a9\u06af\u0000\u0648\u06a1\u0000\u0648\u06ca\u0000\u0644\u0667\u06f7\uFFFF\u0063\u006f\u006d\u0062\u0069\u006e\u0069\u006e\u0067\u005f\u0073\u0068\u0061\u0064\u0064\u0061\u0068\u06b5\u0000\u062a\u0647\u0648\u064a\u06cc\uFFFF\u0063\u006f\u006d\u0062\u0069\u006e\u0069\u006e\u0067\u005f\u0066\u0061\u0074\u0068\u0061\u0074\u0061\u006e" +
"\uFFFF\u0063\u006f\u006d\u0062\u0069\u006e\u0069\u006e\u0067\u005f\u0064\u0061\u006d\u006d\u0061\u0074\u0061\u006e\uFFFF\u0063\u006f\u006d\u0062\u0069\u006e\u0069\u006e\u0067\u005f\u006b\u0061\u0073\u0072\u0061\u0074\u0061\u006e\u0000 \u062a\u0639\u0646\u0647\u0648\u064a\u06cc\u06d5\u0629\uFFFF\u0063\u006f\u006d\u0062\u0069\u006e\u0069\u006e\u0067\u005f\u0066\u0061\u0074\u0068\u0061\u06c6\u06ce\u0000\u062b\u0639\u0641\u0646" +
"\u0648\u0667\u0668\u06f7\u06f8\u06cb\uFFFF\u0063\u006f\u006d\u0062\u0069\u006e\u0069\u006e\u0067\u005f\u0064\u0061\u006d\u006d\u0061\u0068\u0000 \u0627\u0639\u0646\u064a\u0667\u0668\u06f7\u06f8\u06d2\u0649\uFFFF\u0063\u006f\u006d\u0062\u0069\u006e\u0069\u006e\u0067\u005f\u006b\u0061\u0073\u0072\u0061\u0000\u0627\u0622\u0000\u0627\u0648\u064a\u06c1\u06d2\u06d5\u06c2\u06d3\u0000\u0627\u0000\u0627\u0631\u0639\u0644\u0648\u064a" +
"\u0667\u06cc\uFFFF\u0063\u006f\u006d\u0062\u0069\u006e\u0069\u006e\u0067\u005f\u0061\u0072\u0061\u0062\u0069\u0063\u005f\u0076\u0000\u0639\u0648\u064a\u0668\u06cc\uFFFF\u0063\u006f\u006d\u0062\u0069\u006e\u0069\u006e\u0067\u005f\u0061\u0072\u0061\u0062\u0069\u0063\u005f\u0069\u006e\u0076\u0065\u0072\u0074\u0065\u0064\u005f\u0076\u0000 \u0627\u0639\u0646\u0667\u0668\u06cc\u06f7\u06f8\u0000\u0627\u0631\u0639\u0644\u0648\u064a" +
"\u06cc\u06f7\u0000\u0639\u0648\u064a\u06cc\u06f8\u0000\u0915\u0916\u0917\u091c\u0921\u0922\u0928\u092b\u092f\u0930\u0933\u0958\u0959\u095a\u095b\u095c\u095d\u0929\u095e\u095f\u0931\u0934\u0000\u09a1\u09a2\u09af\u09dc\u09dd\u09df\u0000\u09be\u09d7\u09cb\u09cc\u0000\u0a16\u0a17\u0a1c\u0a2b\u0a32\u0a38\u0a59\u0a5a\u0a5b\u0a5e\u0a33\u0a36\u0000\u0b21\u0b22\u0b5c\u0b5d\u0000\u0b3e\u0b56\u0b57\u0b4b\u0b48\u0b4c\u0000\u0bbe\u0bd7\u0bca" +
"\u0bcc\u0000\u0bbe\u0bcb\u0000\u0b92\u0b94\u0000\u0c56\u0c48\u0000\u0cd5\u0cc0\u0000\u0cc2\u0cd5\u0cd6\u0cca\u0cc7\u0cc8\u0000\u0cd5\u0ccb\u0000\u0d3e\u0d57\u0d4a\u0d4c\u0000\u0d3e\u0d4b\u0000\u0dca\u0dcf\u0ddf\u0dda\u0ddc\u0dde\u0000\u0dca\u0ddd\u0000\u0f72\u0f74\u0f80\u0f73\u0f75\u0f81\u0000\u0fb5\u0fb9\u0000\u0fb7\u0f93\u0000\u0fb7\u0f9d\u0000\u0fb7\u0fa2\u0000\u0fb7\u0fa7\u0000\u0fb7\u0fac\u0000\u0f80\u0f76\u0000\u0f80\u0f78" +
"\u0000\u0f40\u0f69\u0000\u0f42\u0f4c\u0f51\u0f56\u0f5b\u0f43\u0f4d\u0f52\u0f57\u0f5c\u0000\u1025\u1026\u0000\u1100\u1101\u0000\u1100\u1102\u1103\u1107\u1113\u1114\u1115\u1116\u0000\u1100\u1103\u1117\u1104\u0000\u1102\u1105\u110b\u1112\u1118\u1119\u111b\u111a\u0000\u1107\u110b\u111c\u111d\u0000\u1100\u1102\u1103\u1107\u1109\u110a\u110b\u110c\u110e\u1110\u1111\u112b\u112d\u112f\u1132\u1136\u111e\u111f\u1120\u1108\u1121\u1125\u112b" +
"\u1127\u1128\u1129\u112a\u112c\u1122\u1123\u1124\u1126\u0000\u110b\u0000\u1100\u1102\u1103\u1105\u1106\u1107\u1109\u110a\u110b\u110c\u110e\u110f\u1110\u1111\u1112\u111e\u112d\u112e\u112f\u1130\u1131\u1132\u110a\u1134\u1135\u1136\u1137\u1138\u1139\u113a\u113b\u1133\u0000\u1109\u0000\u1100\u1103\u1106\u1107\u1109\u110b\u110c\u110e\u1110\u1111\u1140\u1141\u1142\u1143\u1144\u1145\u1147\u1148\u1149\u114a\u114b\u1146\u0000\u110b\u110c" +
"\u114d\u110d\u0000\u110f\u1112\u1152\u1153\u0000\u1107\u110b\u1156\u1157\u0000\u1112\u1158\u0000\u1100\u1103\u1107\u1109\u110c\u0000\u1100\u0000\u113c\u113d\u0000\u113e\u113f\u0000\u114e\u114f\u0000\u1150\u1151\u0000\u1169\u116e\u1175\u1176\u1177\u1162\u0000\u1169\u116d\u1175\u1178\u1179\u1164\u0000\u1169\u116e\u1173\u1175\u117a\u117b\u117c\u1166\u0000\u1169\u116e\u1175\u117d\u117e\u1168\u0000\u1161\u1162\u1165\u1166\u1168\u1169" +
"\u116e\u1175\u116a\u116b\u117f\u1180\u1181\u1182\u1183\u116c\u0000\u1175\u0000\u1163\u1164\u1167\u1169\u1175\u1184\u1185\u1186\u1187\u1188\u0000\u1161\u1162\u1165\u1166\u1168\u116e\u1175\u117c\u1189\u118a\u116f\u1170\u118c\u118d\u1171\u118b\u0000\u1173\u1175\u0000\u1161\u1165\u1166\u1167\u1168\u116e\u1175\u118e\u118f\u1190\u1191\u1192\u1193\u1194\u0000\u116e\u1173\u1175\u1195\u1196\u1174\u0000\u116e\u1197\u0000\u1161\u1163\u1169" +
"\u116e\u1173\u119e\u1198\u1199\u119a\u119b\u119c\u119d\u0000\u1165\u116e\u1175\u119e\u119f\u11a0\u11a1\u11a2\u0000\u11a8\u11af\u11ba\u11e7\u11a9\u11c3\u11aa\u11c4\u0000\u11a8\u0000\u11a8\u11ae\u11ba\u11bd\u11c0\u11c2\u11eb\u11c5\u11c6\u11c7\u11ac\u11c9\u11ad\u11c8\u0000\u11a8\u11af\u11ca\u11cb\u0000\u11a8\u11aa\u11ab\u11ae\u11af\u11b7\u11b8\u11b9\u11ba\u11bb\u11bf\u11c0\u11c1\u11c2\u11da\u11dd\u11e5\u11e6\u11eb\u11f9\u11b0\u11cc" +
"\u11cd\u11ce\u11d0\u11b1\u11b2\u11d3\u11b3\u11d6\u11d8\u11b4\u11b5\u11b6\u11d1\u11d2\u11d4\u11d5\u11d7\u11d9\u0000\u11ba\u0000\u11a8\u11ba\u0000\u11ba\u11bc\u11c2\u0000\u11ba\u0000\u11a8\u11af\u11b8\u11ba\u11bb\u11bc\u11be\u11c2\u11eb\u11da\u11db\u11dc\u11dd\u11de\u11e2\u11e0\u11e1\u11df\u0000\u11af\u11ba\u11bc\u11c1\u11c2\u11e3\u11b9\u11e6\u11e4\u11e5\u0000\u11a8\u11ae\u11af\u11b8\u11ba\u11e7\u11e8\u11e9\u11ea\u11bb\u0000\u11a8" +
"\u11a9\u11bc\u11bf\u11ec\u11ed\u11ee\u11ef\u0000\u11b8\u11bc\u11f3\u11f4\u0000\u11ab\u11af\u11b7\u11b8\u11f5\u11f6\u11f7\u11f8\u0000\u11c2\u11cf\u0000\u11ba\u0000\u11a8\u0000\u11ba\u11eb\u11f1\u11f2\u0000|\u2395\u2347\u0000-\u2395\u2350\u0000|\u2395\u2348\u0000-\u2395\u2357\u0000/\u2204\u0000_|\u2395\u234d\u0000|~\u00a8\u2395\u2354\u0000/\u2209\u0000_\u0000/\u220c\u0000" +
"_\u00a8\u2229\u22a4\u22a5\u2395\u25cb\u235d\u2355\u234e\u233b\u233e\u0000/\u2224\u0000/\u2226\u0000~\u2228\u2395\u2353\u0000~\u2227\u2395\u234c\u0000\u2218\u0000|\u0000/\u2241\u0000/\u2244\u0000/\u2249\u0000/\u226d\u0000_\u2395\u236f\u0000/\u0000/\u2270\u0000/\u2271\u0000/\u2274\u0000/\u2275\u0000/\u2278\u0000/\u2279\u0000/\u2280\u0000" +
"/\u2281\u0000/\u22e0\u0000/\u22e1\u0000/_|\u2284\u0000/_\u2285\u0000/\u2288\u0000/\u2289\u0000/\u22e2\u0000/\u22e3\u0000/\u22ac\u0000\u00a8\u00af\u2218\u22a5\u2336\u0000_\u2218\u22a4\u0000/\u22ad\u0000/\u22ae\u0000/\u22af\u0000/\u22ea\u0000/\u22eb\u0000/\u22ec\u0000/\u22ed\u0000_\u2395\u233a\u0000_\u0000_\u0000" +
"_\u0000'/:<=>?\\\u00f7\u2190\u2191\u2192\u2193\u2206\u2207\u2218\u2227\u2228\u2260\u22c4\u25cb\u233c\u0000*-.\\_|\u00a8\u2218\u2395\u0000/\u2adc\u0000 !\"%'()*,-.0123456789:<=>?[]^_abce" +
"hlopruyz{|}\u00a3\u00a7\u00b1\u00d7\u0398\u03a0\u03a3\u03b2\u03b3\u03b5\u03b8\u03ba\u03c0\u03c1\u03c3\u03c5\u03c6\u0430\u0433\u0434\u0435\u0437\u0438\u0439\u043b\u043c\u043d\u043e\u0441\u0443\u0444\u0445\u0447\u0448\u044a\u044b\u044c\u044d\u044f\u0452\u0456\u0458\u045b\u045f\u0461\u0481\u0487\u049b\u04b7\u04c8\u0513\u05d1\u05d3\u05d5\u05d6\u05d7\u05dd\u05e1\u05e3\u05e4\u05e6" +
"\u05e7\u05e8\u05e9\u0625\u0626\u0627\u0628\u0629\u062a\u062b\u062d\u062f\u0631\u0632\u0633\u0634\u0635\u0637\u0639\u063a\u063d\u0641\u0642\u0643\u0644\u0645\u0646\u0647\u0648\u064a\u064f\u0650\u0660\u0661\u0662\u0663\u0664\u0665\u0666\u0667\u0668\u0669\u0698\u06a1\u06a9\u06be\u06c6\u06c9\u06cc\u06ce\u06f0\u06f1\u06f2\u06f3\u06f4\u06f5\u06f6\u06f7\u06f8\u06f9\u0901\u0902\u0905\u0906\u0907\u0908\u0909\u090a\u090b\u090c\u090f\u0910" +
"\u0913\u0914\u0915\u0916\u0917\u0918\u091a\u091b\u091c\u091d\u091f\u0921\u0922\u0923\u0925\u0926\u0928\u092a\u092b\u092c\u092f\u0930\u0933\u0935\u0936\u0937\u093c\u093d\u093e\u093f\u0940\u0941\u0943\u0947\u0948\u094b\u094c\u0953\u0956\u0962\u0964\u0970\u0b92\u0b9a\u0baf\u0bb3\u0bb5\u2020\u20ac\u20b9\u2190\u2191\u2192\u2193\u2194\u2195\u2196\u2197\u2198\u2199\u2203\u2206\u2207\u2227\u2228\u2229\u222a\u222b\u2282\u2283\u22a4\u22b7" +
"\u22c4\u235d\u2375\u237a\u2395\ua649\ua651\ua657\ua67d\uFFFF\u006e\u0062\u0073\u0070\uFFFF\u0066\u0031\u0030\uFFFF\u0066\u0031\uFFFF\u0066\u0032\uFFFF\u0066\u0033\uFFFF\u0066\u0034\uFFFF\u0066\u0035\uFFFF\u0066\u0036\uFFFF\u0066\u0037\uFFFF\u0066\u0038\uFFFF\u0066\u0039\uFFFF\u007a\u0077\u006e\u006a\u20b1\u20b4\u20bf\uFFFF\u0072\u0065\u006d\u006f\u0076\u0065\u0064\u2213\u2219\u03f4\u220f\u2211\u03d0\u0263\u03f5\u03d1\u03f0\u03d6" +
"\u03f1\u03c2\u03d2\u03d5\uFFFF\ua641\u0456\u0458\u046b\u0467\u047b\u0455\uFFFF\ua64b\u04bb\u044c\uFFFF\ua651\u044a\u0454\u0438\u0447\uFFFF\u0063\u006f\u006d\u0062\u0069\u006e\u0069\u006e\u0067\u005f\u0063\u0079\u0072\u0069\u006c\u006c\u0069\u0063\u005f\u0076\u007a\u006d\u0065\u0074\uFFFF\u0068\u0061\u0074\u0061\u0066\u005f\u0073\u0065\u0067\u006f\u006c\uFFFF\u0064\u0061\u0067\u0065\u0073\u0068\uFFFF\u0068\u006f\u006c\u0061\u006d" +
"\uFFFF\u0071\u0075\u0062\u0075\u0074\u0073\uFFFF\u0068\u0069\u0072\u0069\u0071\uFFFF\u0072\u0061\u0066\u0065\uFFFF\u0073\u0065\u0067\u006f\u006c\uFFFF\u0068\u0061\u0074\u0061\u0066\u005f\u0070\u0061\u0074\u0061\u0068\uFFFF\u0070\u0061\u0074\u0061\u0068\uFFFF\u0074\u0073\u0065\u0072\u0065\uFFFF\u0071\u0061\u006d\u0061\u0074\u0073\uFFFF\u0068\u0061\u0074\u0061\u0066\u005f\u0071\u0061\u006d\u0061\u0074\u0073\uFFFF\u0073\u0068\u0065" +
"\u0076\u0061\u066e\u067e\u06c1\u0698\u0636\u0638\u0621\u06a4\u063a\u06a9\u0640\u06ba\u06be\u06cc\u0643\u0647\u064a\u0900\u0955\u0972\u0911\u0973\u0974\u0976\u0977\u0960\u0961\u090d\u090e\u0912\u0975\u097b\u097c\uFFFF\u0936\u094d\u091a\u0979\u0978\u097e\uFFFF\u0924\u094d\u0930\uFFFF\u0926\u094d\u0930\uFFFF\u092a\u094d\u0930\u097f\u097a\uFFFF\u0936\u094d\u0930\uFFFF\u0915\u094d\u0937\u094e\u097d\u0949\u093a\u093b\u0904\u0944\u0945" +
"\u0946\u094a\u094f\u0954\u0957\u0963\u0965\u0971\uFFFF\u0bd0\uFFFF\u0bf2\uFFFF\u0bf0\uFFFF\u0bf1\uFFFF\u0bf3\u21d4\u21d5\u21d6\u21d7\u21d8\u21d9\u22c0\u22c1\u22c2\u22c3\u222e\u22b6\u044b\u044f\uFFFF\u0063\u006f\u006d\u0062\u0069\u006e\u0069\u006e\u0067\u005f\u0063\u0079\u0072\u0069\u006c\u006c\u0069\u0063\u005f\u0074\u0069\u0074\u006c\u006f\u00000123456789\u09e6\u09e7\u09e8\u09e9" +
"\u09ea\u09eb\u09ec\u09ed\u09ee\u09ef\u00000123456789\u0966\u0967\u0968\u0969\u096a\u096b\u096c\u096d\u096e\u096f\u00000123456789\u0ae6\u0ae7\u0ae8\u0ae9\u0aea\u0aeb\u0aec\u0aed\u0aee\u0aef\u00000123456789\u0660\u0661\u0662\u0663\u0664\u0665\u0666\u0667\u0668\u0669\u000001" +
"23456789\u0ce6\u0ce7\u0ce8\u0ce9\u0cea\u0ceb\u0cec\u0ced\u0cee\u0cef\u00000123456789\u06f0\u06f1\u06f2\u06f3\u06f4\u06f5\u06f6\u06f7\u06f8\u06f9\u00000123456789\u0be6\u0be7\u0be8\u0be9\u0bea\u0beb\u0bec\u0bed\u0bee\u0bef\u0000\u00df\u0131\u01f0\u0237\u02b0\u02b2\u02b3\u02b7\u02e1\u0905\u0907" +
"\u0909\u090b\u090c\u090f\u0913\u0915\u0917\u091a\u091c\u091f\u0921\u0924\u0926\u0928\u092c\u092e\u0932\u0938\u0939\u093f\u0941\u0943\u0945\u0947\u0949\u094b\u0952\u0962\u0a85\u0a87\u0a89\u0a8f\u0a93\u0a95\u0a97\u0a9a\u0a9c\u0a9f\u0aa1\u0aa4\u0aa6\u0aa8\u0aaa\u0aac\u0aae\u0ab2\u0ab8\u0ab9\u0abf\u0ac1\u0ac7\u0acb\u0bf9\u1d43\u1d47\u1d48\u1d49\u1d4d\u1d4f\u1d50\u1d52\u1d56\u1d57\u1d58\u1d5b\u1d60\u1d9c\u1da0\u1dbe\u1e97\u1e98\u1e99" +
"\u2071\u207f\u20b9\u2190\u2191\u2192\u2193\u2196\u2197\u2198\u2199\u2208\u220b\u2282\u2283\u2286\u2287\u2500\u2502\u250c\u2510\u2514\u2518\u251c\u2524\u252c\u2534\u253c\ud835\uFFFF\u004a\u030c\uFFFF\u004a\u0307\u1d34\u1d36\u1d3f\u1d42\u1d38\u0906\u0908\u090a\u0910\u0914\u0916\u0918\u091b\u091d\u0920\u0922\u0925\u0927\u0923\u092d\u0902\u0933\u0936\u0903\u0940\u0942\u0948\u094c\u0951\u0a86\u0a88\u0a8a\u0a90\u0a94\u0a96\u0a98\u0a9b" +
"\u0a9d\u0aa0\u0aa2\u0aa5\u0aa7\u0aa3\u0aab\u0aad\u0a82\u0ab3\u0ab6\u0a83\u0ac0\u0ac2\u0ac8\u0acc\u1d2c\u1d2e\u1d30\u1d31\u1d33\u1d37\u1d39\u1d3c\u1d3e\u1d40\u1d41\u2c7d\u1db2\uFFFF\ua7f2\uFFFF\ua7f3\uFFFF\u0054\u0308\uFFFF\u0057\u030a\uFFFF\u0059\u030a\u1d35\u1d3a\u2550\u2551\u2554\u2557\u255a\u255d\u2560\u2563\u2566\u2569\u256c\u0000\udd57\udd58\udd64\udd68\udd69\uFFFF\ud835\udd3d\uFFFF\ud835\udd3e\uFFFF\ud835\udd4a\uFFFF\ud835" +
"\udd4e\uFFFF\ud835\udd4f\u0000ABCDEFGHIJKLMNOPQRSTUVWXYZx\u00a2\u00a3\u00a5\u00aa\u00b5\u00ba\u00c0\u00c1\u00c2\u00c3\u00c4\u00c5\u00c6\u00c7\u00c8\u00c9\u00ca\u00cb\u00cc\u00cd\u00ce\u00cf\u00d1\u00d2\u00d3\u00d4\u00d5\u00d6\u00d8\u00d9\u00da\u00db\u00dc\u00dd\u00e0\u00e1\u00e2\u00e3\u00e4\u00e5" +
"\u00e6\u00e7\u00e8\u00e9\u00ea\u00eb\u00ec\u00ed\u00ee\u00ef\u00f1\u00f2\u00f3\u00f4\u00f5\u00f6\u00f8\u00f9\u00fa\u00fb\u00fc\u00fd\u00ff\u0100\u0101\u0104\u0105\u0106\u0107\u0108\u0109\u010a\u010b\u010c\u010d\u010e\u010f\u0110\u0111\u0112\u0113\u0116\u0117\u0118\u0119\u011a\u011b\u011c\u011d\u0120\u0121\u0122\u0123\u0124\u0125\u0126\u0127\u0128\u0129\u012a\u012b\u012e\u012f\u0130\u0131\u0134\u0135\u0136\u0137\u0139\u013a\u013b" +
"\u013c\u013d\u013e\u0141\u0142\u0143\u0144\u0145\u0146\u0147\u0148\u014c\u014d\u0150\u0151\u0152\u0153\u0154\u0155\u0156\u0157\u0158\u0159\u015a\u015b\u015c\u015d\u015e\u015f\u0160\u0161\u0162\u0163\u0164\u0165\u0166\u0167\u0168\u0169\u016a\u016b\u016e\u016f\u0170\u0171\u0172\u0173\u0174\u0175\u0176\u0177\u0178\u0179\u017a\u017b\u017c\u017d\u017e\u0180\u0194\u0197\u019a\u019f\u01a0\u01a1\u01a6\u01af\u01b0\u01b5\u01b6\u01cd\u01ce" +
"\u01cf\u01d0\u01d1\u01d2\u01d3\u01d4\u01d5\u01d6\u01d7\u01d8\u01d9\u01da\u01db\u01dc\u01de\u01df\u01e0\u01e1\u01e2\u01e3\u01e4\u01e5\u01e6\u01e7\u01e8\u01e9\u01ea\u01eb\u01ec\u01ed\u01ee\u01ef\u01f0\u01f4\u01f5\u01f8\u01f9\u01fa\u01fb\u01fc\u01fd\u01fe\u01ff\u0200\u0201\u0204\u0205\u0208\u0209\u020c\u020d\u0210\u0211\u0214\u0215\u021e\u021f\u0226\u0227\u0228\u0229\u022a\u022b\u022c\u022d\u022e\u022f\u0230\u0231\u0232\u0233\u0237" +
"\u023a\u023b\u023c\u023d\u023e\u0243\u0244\u0246\u0247\u0248\u0249\u024c\u024d\u024e\u024f\u025f\u0262\u0263\u0268\u026a\u0274\u0275\u0276\u0280\u0289\u028f\u0299\u029b\u029c\u029f\u02b0\u02b1\u02b2\u02b3\u02b4\u02b5\u02b6\u02b7\u02b8\u02e0\u02e1\u02e2\u02e3\u0386\u0388\u0389\u038a\u038c\u038e\u0392\u0395\u0398\u039a\u039c\u03a0\u03a1\u03a3\u03a6\u03aa\u03ab\u03ac\u03ad\u03ae\u03af\u03b0\u03c2\u03ca\u03cb\u03cc\u03cd\u03d0\u03d1" +
"\u03d2\u03d4\u03d5\u03d6\u03f0\u03f1\u03f4\u03f5\u0400\u0402\u0403\u0404\u0405\u0406\u0408\u040b\u040c\u040d\u040f\u0418\u0419\u0427\u042a\u042b\u042c\u042f\u0438\u0439\u0447\u044a\u044b\u044c\u044f\u0450\u0452\u0453\u0454\u0455\u0456\u0458\u045b\u045c\u045d\u045f\u0462\u0463\u0466\u0467\u046a\u046b\u0470\u0471\u0472\u0473\u0476\u0477\u047a\u047b\u0480\u0481\u048c\u048d\u0490\u0491\u0498\u0499\u049a\u049b\u04b0\u04b1\u04b6\u04b7" +
"\u04ba\u04bb\u04d2\u04d3\u04da\u04db\u04dc\u04dd\u04de\u04df\u04e2\u04e3\u04e4\u04e5\u04e6\u04e7\u04e8\u04e9\u04ea\u04eb\u04ec\u04ed\u04ee\u04ef\u04f0\u04f1\u04f2\u04f3\u04f4\u04f5\u04f8\u04f9\u04fe\u04ff\u0528\u0529\u052e\u052f\u0621\u0622\u0630\u0635\u0636\u0637\u0638\u063a\u0640\u0643\u0647\u064a\u066e\u067e\u0695\u0698\u06a1\u06a4\u06a9\u06af\u06b5\u06ba\u06be\u06c1\u06cc\u0902\u0903\u0906\u0908\u090a\u090d\u090e\u0910\u0911" +
"\u0912\u0914\u0916\u0918\u091b\u091d\u0920\u0922\u0923\u0925\u0927\u0929\u092d\u0931\u0933\u0934\u0936\u0958\u0959\u095a\u095b\u095c\u095d\u095e\u095f\u0960\u0961\u0972\u0973\u0974\u0975\u0976\u0977\u0978\u0979\u097a\u097b\u097c\u097d\u097e\u097f\u0a82\u0a83\u0a86\u0a88\u0a8a\u0a90\u0a94\u0a96\u0a98\u0a9b\u0a9d\u0aa0\u0aa2\u0aa3\u0aa5\u0aa7\u0aab\u0aad\u0ab3\u0ab6\u1d00\u1d01\u1d03\u1d04\u1d05\u1d06\u1d07\u1d0a\u1d0b\u1d0c\u1d0d" +
"\u1d0e\u1d0f\u1d10\u1d15\u1d18\u1d19\u1d1a\u1d1b\u1d1c\u1d20\u1d21\u1d22\u1d23\u1d26\u1d27\u1d28\u1d29\u1d2a\u1d2b\u1d43\u1d44\u1d46\u1d47\u1d48\u1d49\u1d4a\u1d4b\u1d4c\u1d4d\u1d4e\u1d4f\u1d50\u1d51\u1d52\u1d53\u1d56\u1d57\u1d58\u1d59\u1d5a\u1d5b\u1d5d\u1d5f\u1d60\u1d61\u1d62\u1d63\u1d64\u1d65\u1d66\u1d67\u1d68\u1d69\u1d6a\u1d7b\u1d7d\u1d7e\u1d9b\u1d9c\u1d9d\u1d9f\u1da0\u1da1\u1da3\u1da4\u1da5\u1dac\u1dad\u1db1\u1db3\u1db4\u1db6" +
"\u1db7\u1dba\u1dbb\u1dbe\u1dbf\u1e02\u1e03\u1e04\u1e05\u1e08\u1e09\u1e0a\u1e0b\u1e0c\u1e0d\u1e10\u1e11\u1e14\u1e15\u1e16\u1e17\u1e1c\u1e1d\u1e1e\u1e1f\u1e20\u1e21\u1e22\u1e23\u1e24\u1e25\u1e26\u1e27\u1e28\u1e29\u1e2e\u1e2f\u1e30\u1e31\u1e32\u1e33\u1e36\u1e37\u1e38\u1e39\u1e3e\u1e3f\u1e40\u1e41\u1e42\u1e43\u1e44\u1e45\u1e46\u1e47\u1e4c\u1e4d\u1e4e\u1e4f\u1e50\u1e51\u1e52\u1e53\u1e54\u1e55\u1e56\u1e57\u1e58\u1e59\u1e5a\u1e5b\u1e5c" +
"\u1e5d\u1e60\u1e61\u1e62\u1e63\u1e64\u1e65\u1e66\u1e67\u1e68\u1e69\u1e6a\u1e6b\u1e6c\u1e6d\u1e78\u1e79\u1e7c\u1e7d\u1e7e\u1e7f\u1e80\u1e81\u1e82\u1e83\u1e84\u1e85\u1e86\u1e87\u1e88\u1e89\u1e8a\u1e8b\u1e8c\u1e8d\u1e8e\u1e8f\u1e90\u1e91\u1e92\u1e93\u1e97\u1e98\u1e99\u1e9b\u1e9e\u1ea0\u1ea1\u1ea2\u1ea3\u1ea4\u1ea5\u1ea6\u1ea7\u1ea8\u1ea9\u1eaa\u1eab\u1eac\u1ead\u1eae\u1eaf\u1eb0\u1eb1\u1eb2\u1eb3\u1eb4\u1eb5\u1eb6\u1eb7\u1eb8\u1eb9" +
"\u1eba\u1ebb\u1ebc\u1ebd\u1ebe\u1ebf\u1ec0\u1ec1\u1ec2\u1ec3\u1ec4\u1ec5\u1ec6\u1ec7\u1ec8\u1ec9\u1eca\u1ecb\u1ecc\u1ecd\u1ece\u1ecf\u1ed0\u1ed1\u1ed2\u1ed3\u1ed4\u1ed5\u1ed6\u1ed7\u1ed8\u1ed9\u1eda\u1edb\u1edc\u1edd\u1ede\u1edf\u1ee0\u1ee1\u1ee2\u1ee3\u1ee4\u1ee5\u1ee6\u1ee7\u1ee8\u1ee9\u1eea\u1eeb\u1eec\u1eed\u1eee\u1eef\u1ef0\u1ef1\u1ef2\u1ef3\u1ef4\u1ef5\u1ef6\u1ef7\u1ef8\u1ef9\u1f70\u1f72\u1f74\u1f76\u1f78\u1f7a\u1f7c\u1fb1" +
"\u1fb9\u1fba\u1fc8\u1fca\u1fd1\u1fd9\u1fda\u1fe1\u1fe2\u1fe7\u1fe9\u1fea\u1ff8\u1ffa\u2071\u207f\u2090\u2091\u2092\u2093\u2094\u2095\u2096\u2097\u2098\u2099\u209a\u209b\u209c\u20ac\u20b1\u20b4\u20b9\u20bd\u20bf\u220f\u2211\u2422\u2c63\u2c65\u2c66\u2c7b\u2c7c\ua640\ua641\ua648\ua649\ua64a\ua64b\ua64c\ua64d\ua650\ua651\ua656\ua657\ua730\ua731\ua740\ua741\ua742\ua743\ua756\ua757\ua75e\ua75f\ua776\ua792\ua793\ua798\ua799\ua7a0\ua7a1" +
"\ua7a4\ua7a5\ua7a6\ua7a7\ua7a8\ua7a9\ua7ae\ua7af\ua7b8\ua7b9\ua7f4\ua7f9\ua7fa\uab3f\uab65\uab69abcdefghijklmnopqrstuvwyz\u03b3\u0292\u0260\u0266\u0279\u027b\u03b1\u03b5\u03b7\u03b9\u03bf\u03c5\u03b2\u03b8\u03ba\u03c0\u03c1\u03c3\u03c6\u0435\u0433\u044d\u0441\u043a\u043d\u043c\u0448\u0444\u043e\u0434\u04af" +
"\u0445\u0430\u0436\u0437\u0443\u043b\u0639\u0627\u062f\u0633\u062a\u0632\u0642\u0645\u0628\u0631\u0648\u0641\u0644\u0646\u062d\u092e\u0939\u0905\u0907\u0909\u090f\u0913\u0915\u0917\u091a\u091c\u091f\u0921\u0928\u0924\u0926\u092c\u0930\u0932\u0938\u092b\u092f\u090b\u090c\u0935\u093d\u0aae\u0ab9\u0a85\u0a87\u0a89\u0a8f\u0a93\u0a95\u0a97\u0a9a\u0a9c\u0a9f\u0aa1\u0aa8\u0aa4\u0aa6\u0aaa\u0aac\u0ab2\u0ab8\u0254\u0223\u03bb\u03c8\u0250" +
"\u1d02\u025b\u1d08\u1d09\u1d1d\u026f\u03b4\u03c7\u0252\u0255\u025c\u0265\u0271\u0270\u0282\u0283\u028a\u028c\u03c9\u01dd\uFFFF\ua775\u028d").toCharArray();
"\u2193\u2203\u2206\u2207\u2208\u220a\u220b\u2218\u2223\u2225\u2227\u2228\u2229\u222a\u223c\u2243\u2248\u224d\u2260\u2261\u2264\u2265\u2272\u2273\u2276\u2277\u227a\u227b\u227c\u227d\u2282\u2283\u2286\u2287\u2291\u2292\u22a3\u22a4\u22a5\u22a8\u22a9\u22ab\u22b2\u22b3\u22b4\u22b5\u22c4\u2373\u2375\u237a\u2395\u25cb\u2add\u0000 (,-.<>_\uFFFF\u006e\u0062\u0073\u0070\u02d8\u00b8~\u2008\u02c7" +
"^\u00af\u0000!+?ABDEHIKLMNORSTUVWYZ^abdehiklmnorstuvwyz\u01a0\u01a1\u01af\u01b0\u00a1\u0000OUou\u1ee2\u1ef0\u203d\u1ea0\u1e04\u1e0c\u1eb8\u1e24\u1eca\u1e32\u1e36\u1e42\u1e46\u1ecc\u1e5a\u1e62\u1e6c" +
"\u1ee4\u1e7e\u1e88\u1ef4\u1e92\u00a6\u0000 \"',<>AEHIOUWXY_aehiotuwxy~\u00af\u00b4\u00d5\u00f5\u016a\u016b\u0399\u03a5\u03b9\u03c5\u03d2\u0406\u0410\u0415\u0416\u0417\u0418\u041e\u0423\u0427\u042b\u042d\u0430\u0435\u0436\u0437\u0438\u043e\u0443\u0447\u044b\u044d\u0456\u04d8\u04d9\u04e8\u04e9\u00a8" +
"\u0344\u201e\u201c\u201d\u00c4\u00cb\u1e26\u00cf\u00d6\u00dc\u1e84\u1e8c\u0178\u0000Uu\u1e7a\u1e7b\u0000Oo\u1e4e\u0000Uu\u03aa\u03ab\u0407\u04d2\u0401\u04dc\u04de\u04e4\u04e6\u04f0\u04f4\u04f8\u04ec\u0451\u0457\u04da\u04ea\u0000#ESbefq\u266f\u266b\u266c\u266d\u266a\u266e\u2669\u0000o\u2030\u0000\"'()+,/<>AC" +
"EGIJKLMNOPRSUWYZ^_abcegijklmnoprsuwyz~\u00af\u00b8\u00c2\u00c5\u00c6\u00c7\u00ca\u00cf\u00d4\u00d5\u00d8\u00dc\u00e2\u00e5\u00e6\u00e7\u00ea\u00ef\u00f4\u00f5\u00f8\u00fc\u0102\u0103\u0112\u0113\u014c\u014d\u0168\u0169\u01a0\u01a1\u01af\u01b0" +
"\u0391\u0395\u0397\u0399\u039f\u03a5\u03a9\u03b1\u03b5\u03b7\u03b9\u03bf\u03c5\u03c9\u0410\u0413\u0415\u0418\u041a\u041e\u0420\u0423\u042b\u042d\u042e\u042f\u0430\u0433\u0435\u0438\u043a\u043e\u0440\u0443\u044b\u044d\u044e\u044f\u2395\u0000 IUiu\u03b9\u03c5\u0385\u1e2e\u01d7\u0390\u00b4\u0000\u0391\u0395\u0397\u0399\u039f\u03a5\u03a9\u03b1\u03b5\u03b7\u03b9\u03bf\u03c5\u03c9\u1f0d\u1f1d\u1f2d\u1f3d\u1f4d" +
"\u1f5d\u1f6d\u1f05\u1f15\u1f25\u1f35\u1f45\u1f55\u1f65\u0000\u0391\u0395\u0397\u0399\u039f\u03a9\u03b1\u03b5\u03b7\u03b9\u03bf\u03c5\u03c9\u1f0c\u1f1c\u1f2c\u1f3c\u1f4c\u1f6c\u1f04\u1f14\u1f24\u1f34\u1f44\u1f54\u1f64\u0000OUou\u1eda\u1ee8\u201a\u0000Oo\u01fe\u2018\u2019\u00c1\u0106\u00c9\u01f4\u00cd\uFFFF\u004a\u0301\u1e30\u0139\u1e3e\u0143\u00d3\u1e54\u0154\u015a\u00da\u1e82\u00dd\u0179\u0000A" +
"EOaeo\u1ea4\u1ebe\u1ed0\u0000EOeo\u1e16\u1e52\u0000Aa\u1eae\u0000OUou\u1e4c\u1e78\u0000EOeo\u0000Cc\u1e08\u01fa\u01fc\u0386\u0388\u0389\u038a\u038c\u038e\u038f\u03ce\uFFFF\u0410\u0301\u0403\uFFFF\u0415\u0301\uFFFF\u0418\u0301\u040c\uFFFF\u041e\u0301\uFFFF\u0420\u0301\uFFFF\u0423\u0301\uFFFF\u042b\u0301\uFFFF\u042d\u0301\uFFFF" +
"\u042e\u0301\uFFFF\u042f\u0301\uFFFF\u0440\u0301\u235e\u0000 ()-0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuv" +
"wxyz\u0391\u0395\u0397\u0399\u039f\u03a1\u03a5\u03a9\u03b1\u03b5\u03b7\u03b9\u03bf\u03c1\u03c5\u03c9\u1100\u1102\u1103\u1105\u1106\u1107\u1109\u110b\u110c\u110e\u110f\u1110\u1111\u1112\u30a2\u30a4\u30a6\u30a8\u30aa\u30ab\u30ad\u30af\u30b1\u30b3\u30b5\u30b7\u30b9\u30bb\u30bd\u30bf\u30c1\u30c4\u30c6\u30c8\u30ca\u30cb\u30cc\u30cd\u30ce\u30cf\u30d2\u30d5\u30d8\u30db\u30de\u30df\u30e0\u30e1\u30e2\u30e4\u30e6\u30e8" +
"\u30e9\u30ea\u30eb\u30ec\u30ed\u30ef\u30f0\u30f1\u30f2\u4e00\u4e03\u4e09\u4e0a\u4e0b\u4e2d\u4e5d\u4e8c\u4e94\u4f01\u4f11\u512a\u516b\u516d\u5199\u52b4\u533b\u5341\u5354\u5370\u53f3\u540d\u56db\u571f\u591c\u5973\u5b66\u5b97\u5de6\u65e5\u6708\u6709\u6728\u682a\u6b63\u6c34\u6ce8\u706b\u7279\u7537\u76e3\u793e\u795d\u79d8\u8ca1\u8cc7\u9069\u91d1\u9805[\u0000)\uFFFF\ud83c\udd2f{\u0000)\u24ea\u0000)01" +
"23456789\u2460\u0000)\u2469\u0000)\u246a\u0000)\u246b\u0000)\u246c\u0000)\u246d\u0000)\u246e\u0000)\u246f\u0000)\u2470\u0000)\u2471\u0000)\u2472\u0000)0123456789\u2461\u0000)\u2473\u0000)\u3251\u0000)\u3252\u0000)\u3253\u0000)\u3254\u0000)\u3255\u0000)" +
"\u3256\u0000)\u3257\u0000)\u3258\u0000)\u3259\u0000)0123456789\u2462\u0000)\u325a\u0000)\u325b\u0000)\u325c\u0000)\u325d\u0000)\u325e\u0000)\u325f\u0000)\u32b1\u0000)\u32b2\u0000)\u32b3\u0000)\u32b4\u0000)0123456789\u2463\u0000)\u32b5\u0000)\u32b6" +
"\u0000)\u32b7\u0000)\u32b8\u0000)\u32b9\u0000)\u32ba\u0000)\u32bb\u0000)\u32bc\u0000)\u32bd\u0000)\u32be\u0000)0\u2464\u0000)\u32bf\u0000)\u2465\u0000)\u2466\u0000)\u2467\u0000)\u2468\u0000)\u24b6\u0000)\u24b7\u0000)\u24b8\u0000)\u24b9\u0000)\u24ba\u0000)\u24bb\u0000)\u24bc\u0000)\u24bd\u0000)\u24be\u0000)" +
"\u24bf\u0000)\u24c0\u0000)\u24c1\u0000)\u24c2\u0000)\u24c3\u0000)\u24c4\u0000)\u24c5\u0000)\u24c6\u0000)\u24c7\u0000)\u24c8\u0000)\u24c9\u0000)\u24ca\u0000)\u24cb\u0000)\u24cc\u0000)\u24cd\u0000)\u24ce\u0000)\u24cf\u0000)\u24d0\u0000)\u24d1\u0000)\u24d2\u0000)\u24d3\u0000)\u24d4\u0000)\u24d5\u0000)\u24d6\u0000)" +
"\u24d7\u0000)\u24d8\u0000)\u24d9\u0000)\u24da\u0000)\u24db\u0000)\u24dc\u0000)\u24dd\u0000)\u24de\u0000)\u24df\u0000)\u24e0\u0000)\u24e1\u0000)\u24e2\u0000)\u24e3\u0000)\u24e4\u0000)\u24e5\u0000)\u24e6\u0000)\u24e7\u0000)\u24e8\u0000)\u24e9\u1f09\u1f19\u1f29\u1f39\u1f49\u1fec\u1f59\u1f69\u1f01\u1f11\u1f21\u1f31\u1f41\u1fe5\u1f51\u1f61\u0000" +
")\u1161\u3260\u0000)\u326e\u0000)\u1161\u3261\u0000)\u326f\u0000)\u1161\u3262\u0000)\u3270\u0000)\u1161\u3263\u0000)\u3271\u0000)\u1161\u3264\u0000)\u3272\u0000)\u1161\u3265\u0000)\u3273\u0000)\u1161\u3266\u0000)\u3274\u0000)\u1161\u3267\u0000)\u3275\u0000)\u1161\u3268\u0000)\u3276\u0000)\u1161\u3269\u0000)\u3277\u0000)\u1161" +
"\u326a\u0000)\u3278\u0000)\u1161\u326b\u0000)\u3279\u0000)\u1161\u326c\u0000)\u327a\u0000)\u1161\u326d\u0000)\u327b\u0000)\u32d0\u0000)\u32d1\u0000)\u32d2\u0000)\u32d3\u0000)\u32d4\u0000)\u32d5\u0000)\u32d6\u0000)\u32d7\u0000)\u32d8\u0000)\u32d9\u0000)\u32da\u0000)\u32db\u0000)\u32dc\u0000)\u32dd\u0000)\u32de\u0000)" +
"\u32df\u0000)\u32e0\u0000)\u32e1\u0000)\u32e2\u0000)\u32e3\u0000)\u32e4\u0000)\u32e5\u0000)\u32e6\u0000)\u32e7\u0000)\u32e8\u0000)\u32e9\u0000)\u32ea\u0000)\u32eb\u0000)\u32ec\u0000)\u32ed\u0000)\u32ee\u0000)\u32ef\u0000)\u32f0\u0000)\u32f1\u0000)\u32f2\u0000)\u32f3\u0000)\u32f4\u0000)\u32f5\u0000)\u32f6\u0000)" +
"\u32f7\u0000)\u32f8\u0000)\u32f9\u0000)\u32fa\u0000)\u32fb\u0000)\u32fc\u0000)\u32fd\u0000)\u32fe\u0000)\u3280\u0000)\u3286\u0000)\u3282\u0000)\u32a4\u0000)\u32a6\u0000)\u32a5\u0000)\u3288\u0000)\u3281\u0000)\u3284\u0000)\u32ad\u0000)\u32a1\u0000)\u329d\u0000)\u3287\u0000)\u3285\u0000)\u32a2\u0000)\u3298\u0000)" +
"\u32a9\u0000)\u3289\u0000)\u32af\u0000)\u329e\u0000)\u32a8\u0000)\u3294\u0000)\u3283\u0000)\u328f\u0000)\u32b0\u0000)\u329b\u0000)\u32ab\u0000)\u32aa\u0000)\u32a7\u0000)\u3290\u0000)\u328a\u0000)\u3292\u0000)\u328d\u0000)\u3291\u0000)\u32a3\u0000)\u328c\u0000)\u329f\u0000)\u328b\u0000)\u3295\u0000)\u329a\u0000)" +
"\u32ac\u0000)\u3293\u0000)\u3297\u0000)\u3299\u0000)\u3296\u0000)\u32ae\u0000)\u329c\u0000)\u328e\u0000)\u32a0\u0000)-\u0391\u0395\u0397\u0399\u039f\u03a9\u03b1\u03b5\u03b7\u03b9\u03bf\u03c1\u03c5\u03c9]}\u1f08\u1f18\u1f28\u1f38\u1f48\u1f68\u1f00\u1f10\u1f20\u1f30\u1f40\u1fe4\u1f50\u1f60\u0000'0AUau\u00a8\u25cb\u0000Aa\u00c5\u016e" +
"\u235f\u0000+-OUou#\u00b1\u01a0\u01af\u0000 \"',-ACDEGHIKLNORSTUacdeghiklnorstu\u0413\u041a\u041b\u041d\u0425\u0433\u043a\u043b\u043d\u0445\u0466\u0467\u00ac\u0104\u00c7\u1e10\u0118\u0122\u1e28\u012e\u0136\u013b\u0145\u01ea" +
"\u0156\u015e\u0162\u0172\u04fa\u04c3\u0512\u04c7\u04fc\u04fb\u04c4\u0513\u04c8\u04fd\u04c9\u04ca\u0000 ()+,-./:>ADEIKLOU\\^_adeilou\u2191\u2193\u25cb\u0000 -.\u00ad\u2014\u2013\u0000Ee\uFFFF\u0116\u0304\uFFFF\u0117\u0304\u233f\u00f7\u0100\u0110\u0112\u012a\u20ad\u00a3" +
"\u014c\u016a\u2340\u2212\u234f\u2356\u2296\u0000 !'-.:<=>ABCDEFGHIMNOPRSTWXYZ^abcdefghimnoprstwxyz\u00b4\u015a\u015b\u0160\u0161\u017f\u0406\u0413\u0416\u0419\u041a\u041b\u041c\u041d" +
"\u0425\u0427\u0433\u0436\u0439\u043a\u043b\u043c\u043d\u0445\u0447\u0456\u1e62\u1e63\u25cb\u02d9\u0000Ss\u1e68\u0000Ss\u1e64\u00b7\u2026\u2235\u2039\u2022\u203a\u0226\u1e02\u010a\u1e0a\u0116\u1e1e\u0120\u1e22\u0130\u1e40\u1e44\u022e\u1e56\u1e58\u1e60\u1e6a\u1e86\u1e8a\u1e8e\u017b\u0000Ss\u1e66\u04f6\u0496\u048a\u049a\u052e\u04cd\u04b2\u04b6\u04f7\u0497\u048b\u049b\u052f\u04ce\u04b3\u04b7\u2299\u0000" +
"-/<=BCDGHILOTZ^bcdghilmotuvz\u0294\u0413\u041a\u0433\u043a\u04ae\u04af\u2190\u2192\u2194\u2395\\\u2260\u0243\u20a1\u01e4\u0126\u0197\u0141\u00d8\u0166\u01b5|\u00a2\u20a5\u00b5\u221a\u02a1\u0492\u049e\u0493\u049f\u04b0\u219a\u219b\u21ae\u2341\u0000*3~\u2189\u236c\u0000" +
"123456789^\u00000\u2152\u00bd\u2153\u00bc\u2155\u2159\u2150\u215b\u2151\u000035^\u2154\u2156\u0000458^\u00be\u2157\u215c\u00005\u2158\u000068\u215a\u215d\u00008\u215e\u00008\u221e\u0000()-.\u2395\u2639\u263a\u2234\u2360\u0000 AEIOSTU_aei" +
"ostu\u02db\u0218\u021a\u236e\u0219\u021b\u0000 \"'-/3<=>CDELNRSTZ_cdelnrstz\u2395\u226e\u2665\u00ab\u2264\u22c4\u010c\u010e\u011a\u013d\u0147\u0158\u0160\u0164\u017d\u2343\u0000/<>CELNOPRTUWY^_" +
"cdeopruvy\u0415\u0417\u0421\u0423\u0437\u0443\u2395\u21d0\u21d2\u20ac\u20a4\u20a6\u0150\u20bd\u20b9\u20ae\u0170\u20a9\u00a5\u21d1\u2261\u20ab\u21d3\u04f2\u2338\u0000 \"'/<=>AEIOU_aeiou\u00a8\u2395\u226f\u2265\u00bb\u00c2\u00ca\u00ce\u00d4\u00db\u2369\u2344\u0000!+?AEI" +
"OUY\\^abeiouy\u00c2\u00ca\u00d4\u00e2\u00ea\u00f4\u0102\u0103\u01a0\u01a1\u01af\u01b0\u2395\u2e18\u0000OUou\u1ede\u1eec\u00bf\u1ea2\u1eba\u1ec8\u1ece\u1ee6\u1ef6\u262d\u0000AEOaeo\u1ea8\u1ec2\u1ed4\u0000Aa\u1eb2\u2370\u0000\"'(*,-;>AET^_`a" +
"et~\u00a8\u00b4\u0102\u00c6@\u00c0\u00c3\u0000.|\u0e3f\u0000',./<=CEOr|\u2102\u20a0\u00a9\u20a2\u20b5\u0000,-.<Hh\u00d0\u0000\"',-.;<=>E^_`e~\u00a8\u00b4\u018f\u00c8\u1ebc\u0000.Uilr\uFFFF\ud83d\udd95\uFFFF\ufb03\uFFFF" +
"\ufb04\u20a3\u0000(,.TUnu|\u02d8\u011e>\u0000~\uFFFF\u004e\u0360\u0067\u20b2\u0000,\u0000\"',-.;>J^_`j~\u00a8\u00b4\u0132\u00cc\u0128\u0000'\u00b4\u0000,-\u0000',-/<=LTV\u0000A\u0000P\uFFFF\ud83d\udd96<\u0000.\u0000',<" +
"=GNOgno~\u014a\u2115\u2116\u00d1\u0000\"',-/;>ACERSXY^_`e~\u00a8\u00b4\u0152\u00ae\u00a7\u00a4\u262e\u00d2\u00d5\u0000!.=Pt\u00b6\u20a7\u0000Qq\u211a\u0000',<=ORrs\u211d\u20a8\u0000!',.;<M" +
"OSs|\u2120\u1e9e$\u0000,-./;<=HMhz\u00de\u2122\uFFFF\ua728\u0000 !\"'*,-;>AEGIOU^_`aegiou~\u00a8\u00b4\u00b8\u0391\u0399\u03a5\u03b1\u03b9\u03c5\u0410\u0415\u0416\u0418\u0423\u0430\u0435\u0436\u0438\u0443\u0000,\u0000E" +
"e\u1e1c\u0000Aa\u1eb6\u0114\u012c\u014e\u016c\u00d9\u0103\u0115\u011f\u012d\u014f\u016d\u0168\u0000Ee\u1fb8\u1fd8\u1fe8\u1fb0\u1fd0\u1fe0\u04d0\u04d6\u04c1\u0419\u040e\u04d1\u04d7\u04c2\u0439\u045e\u0000Lcsz~\u1e7c\u0000=^\u0174\u0000O\u0000\"'=^~\u00a8\u00b4\u0176\u1ef8\u0000'.<Zz\u2124\u0000]\u2337\u0000-" +
"?not\u2395\u25cb\uFFFF\\\u006e\u0000/\uFFFF\ud83d\ude4c\uFFFF\\\u0074\u2342\u2349\u0000[\u0000!()+-./0123456789=ACEGHIJOSUWYZ_aceghijosuwyz|\u0410\u0415\u0418\u041e" +
"\u0420\u0423\u0430\u0435\u0438\u043e\u0440\u0443\u1eb8\u1eb9\u1ecc\u1ecd\u2212\u4e00\u4e01\u4e09\u4e0a\u4e0b\u4e19\u4e2d\u4e59\u4e8c\u4eba\u56db\u5730\u5929\u7532\u0000AEOaeo\u1eac\u1ec6\u1ed8\u0108\u011c\u0124\u0134\u015c\u1e90\u0000ahijlnorswxy\u0263\u0266\u0279\u027b\u0281\u0295\uFFFF\u0410\u0302\uFFFF\u0415\u0302\uFFFF\u0418\u0302\uFFFF" +
"\u041e\u0302\uFFFF\u0420\u0302\uFFFF\u0423\u0302\uFFFF\u0440\u0302\u3192\u319c\u3194\u3196\u3198\u319b\u3197\u319a\u3193\u319f\u3195\u319e\u319d\u3199\u0000 !\"'()+-.0123456789;<=>AEGIOUY^_aegiouy~\u00c4\u00c6\u00d5\u00d6\u00dc\u00e4" +
"\u00e6\u00f5\u00f6\u00fc\u0226\u0227\u0391\u0399\u03a5\u03b1\u03b9\u03c5\u0410\u0415\u0418\u041e\u0420\u0423\u0430\u0435\u0438\u043e\u0440\u0443\u1e36\u1e37\u1e5a\u1e5b\u2206\u220a\u2212\u2218\u2260\u2282\u2283\u22a5\u22c4\u2373\u2375\u237a\u25cb\u0000LRlr\u1e38\u1e5c\u0000AOUaou\u01de\u022a\u01d5\u2358\u0000AEOaeo\u01e0\u0230\u0000Oo\u01ec" +
"\u1e20\u0232\u0000Oo\u022c\u01e2\u1fb9\u1fd9\u1fe9\uFFFF\u0410\u0304\uFFFF\u0415\u0304\u04e2\uFFFF\u041e\u0304\uFFFF\u0420\u0304\u04ee\uFFFF\u0430\u0304\uFFFF\u0435\u0304\uFFFF\u043e\u0304\uFFFF\u0440\u0304\u2359\u2377\u235b\u2262\u2286\u2287\u234a\u235a\u2378\u2379\u2376\u235c\u0000\"()+AEINOUWY^_`abeinouw" +
"y\u00af\u00c2\u00ca\u00d4\u00dc\u00e2\u00ea\u00f4\u00fc\u0102\u0103\u0112\u0113\u014c\u014d\u01a0\u01a1\u01af\u01b0\u0391\u0395\u0397\u0399\u039f\u03a5\u03a9\u03b1\u03b5\u03b7\u03b9\u03bf\u03c5\u03c9\u0410\u0415\u0418\u041e\u0420\u0423\u0430\u0435\u0438\u043e\u0440\u0443\u0000Uu\u03b9\u03c5\u01db\u1fd2\u0000\u0391\u0395\u0397\u0399\u039f\u03a5\u03a9\u03b1\u03b5\u03b7\u03b9\u03bf\u03c5\u03c9\u1f0b\u1f1b\u1f2b\u1f3b" +
"\u1f4b\u1f5b\u1f6b\u1f03\u1f13\u1f23\u1f33\u1f43\u1f53\u1f63\u0000\u0391\u0395\u0397\u0399\u039f\u03a9\u03b1\u03b5\u03b7\u03b9\u03bf\u03c5\u03c9\u1f0a\u1f1a\u1f2a\u1f3a\u1f4a\u1f6a\u1f02\u1f12\u1f22\u1f32\u1f42\u1f52\u1f62\u0000OUou\u1edc\u1eea\u01f8\u1e80\u1ef2\u0000AEOaeo\u1ea6\u1ec0\u1ed2\u0000EOeo\u1e14\u1e50\u0000\u0410\u0415\u0418\u041e\u0420\u0423\u0430" +
"\u0435\u0438\u043e\u0440\u0443\uFFFF\u0410\u030f\uFFFF\u0415\u030f\uFFFF\u0418\u030f\uFFFF\u041e\u030f\uFFFF\u0420\u030f\uFFFF\u0423\u030f\u0000Aa\u1eb0\u0000EOeo\u1fba\u1fc8\u1fca\u1fda\u1ff8\u1fea\u1ffa\uFFFF\u0410\u0300\u0400\u040d\uFFFF\u041e\u0300\uFFFF\u0420\u0300\uFFFF\u0423\u0300\uFFFF\u0430\u0300\uFFFF\u043e\u0300\uFFFF\u0440\u0300\uFFFF\u0443\u0300\u0000\"'(*,-" +
";>E^_`ae~\u00a8\u00b4\u00e6\u0000!,.AEGIOUaegiou\u00b8\u0391\u0399\u03a5\u03b1\u03b9\u03c5\u0410\u0415\u0416\u0418\u0423\u0430\u0435\u0436\u0438\u0443\u0000Aa\u0000Ee\u0000Ee\u0000\"',./<=ACDEGHIKLN" +
"ORSTUZacdeghijklnorstuz|\u00dc\u00fc\u0000Uu\u01d9\u01cd\u01e6\u021e\u01cf\u01e8\u01d1\u01d3\u0000,-.<=hi\u00f0\u2300\u0000\"',-.;<=>^_`e~\u00a8\u00b4\u0259\u0000.Sfils" +
"\u017f\uFFFF\ufb00\uFFFF\ufb01\uFFFF\ufb02\u0000(,.Untu~\u02d8\u0000~\uFFFF\u006e\u0360\u0067\uFFFF\u0067\u0303\u0000,\u0000\"',-.;>^_`j~\u00a8\u00b4\u0133\u0000'\u00b4\u0000,k\u0138\u0000',-/<tv\u0000./u\u0000',<g~\u014b\u0000\"" +
"',-/;>AU^_`aceorsuwxy~\u00a8\u00b4\u0153\u0000!.=o\u0000o\uFFFF\ud83d\udca9\u0000',<=\u0000!',.;<mos\u00b8\u00df\u0000,-./;<hmz\u00fe\uFFFF\ua729\u0000\"'*,-/" +
";>AEGIOU^_`aegiou~\u00a8\u00b4\u0000/ACDEGHIKNORSTUZacdeghijklnorstuz|~\u0000^\u0000ox\u00d7\u0000\"'=^~\u00a8\u00b4\u0000'" +
".<\u0000}\u2205\u0000-=BCGS^cv~\u2190\u2192\u2206\u2207\u222a\u2282\u25cb\u2020\u2021\u236d\u2345\u2346\u234b\u2352\u2366\u2367\u233d\u0000\"()+0AEINOUVY^abeinouvy|~\u00a8\u00c2\u00ca\u00d4\u00e2\u00ea\u00f4\u0102\u0103\u01a0\u01a1\u01af\u01b0" +
"\u03b1\u03b7\u03b9\u03c5\u03c9\u2207\u2227\u2228\u0000\u03b9\u03c5\u1fd7\u0000\u0391\u0397\u0399\u03a5\u03a9\u03b1\u03b7\u03b9\u03c5\u03c9\u1f0f\u1f2f\u1f3f\u1f5f\u1f6f\u1f07\u1f27\u1f37\u1f57\u1f67\u0000\u0391\u0397\u0399\u03a9\u03b1\u03b7\u03b9\u03c5\u03c9\u1f0e\u1f2e\u1f3e\u1f6e\u1f06\u1f26\u1f36\u1f56\u1f66\u0000OUou\u1ee0\u1eee\u0000AEOaeo\u1eaa\u1ec4\u1ed6\u0000Aa" +
"\u1eb4\u2248\u1fb6\u1fc6\u1fd6\u1fe6\u1ff6\u236b\u2372\u2371\u0000'*>AEIOUY`aeiouy~\u00b4\u2207\u2218\u22a4\u25cb\u1fed\u1fc1\u2361\u2365\u0000!\".;AEGIOUYaegiouy~\u00c4\u00c6\u00d5\u00d6\u00dc\u00e4\u00e6\u00f5\u00f6\u00fc\u0226\u0227\u0391\u0399\u03a5" +
"\u03b1\u03b9\u03c5\u0410\u0415\u0418\u041e\u0420\u0423\u0430\u0435\u0438\u043e\u0440\u0443\u1e36\u1e37\u1e5a\u1e5b\u22a4\u0000LRlr\u0000AOUaou\u0000AOao\u0000Oo\u0000Oo\u2351\u0000\"()+,/ACEGIJKLMNOPRSUWYZ^_a" +
"bcegijklmnoprsuwyz~\u00af\u00b8\u00c2\u00c5\u00c6\u00c7\u00ca\u00cf\u00d4\u00d5\u00d8\u00dc\u00e2\u00e5\u00e6\u00e7\u00ea\u00ef\u00f4\u00f5\u00f8\u00fc\u0102\u0103\u0112\u0113\u014c\u014d\u0168\u0169\u01a0\u01a1\u01af\u01b0\u0391\u0395\u0397\u0399\u039f\u03a5\u03a9\u03b1\u03b5\u03b7\u03b9\u03bf\u03c5\u03c9\u0410\u0413\u0415\u0418\u041a" +
"\u041e\u0420\u0423\u042b\u042d\u042e\u042f\u0430\u0433\u0435\u0438\u043a\u043e\u0440\u0443\u044b\u044d\u044e\u044f\u0000IUiu\u03b9\u03c5\u0000\u0391\u0395\u0397\u0399\u039f\u03a5\u03a9\u03b1\u03b5\u03b7\u03b9\u03bf\u03c5\u03c9\u0000\u0391\u0395\u0397\u0399\u039f\u03a9\u03b1\u03b5\u03b7\u03b9\u03bf\u03c5\u03c9\u0000OUou\u0000Cc\u0000Oo\u0000AEOae" +
"o\u0000EOeo\u0000Aa\u0000OUou\u0000EOeo\u0000Cc\u0000CDEGHKLNRSTcdeghklnrst\u0228\u0000\u2395\u2339\u0000Gg\u0000'\u0000'\u0000'\u0000\"'\u0000'\u0000\"'\u0000'\u0000'\u0000'" +
"\u0000'\u0000\"'()`~\u00b4\u0391\u0397\u03a9\u03b1\u03b7\u03c9\u0000()\u03b1\u03b7\u03c9\u0000\u0391\u0397\u03a9\u03b1\u03b7\u03c9\u1f8d\u1f9d\u1fad\u1f85\u1f95\u1fa5\u0000\u0391\u0397\u03a9\u03b1\u03b7\u03c9\u1f8c\u1f9c\u1fac\u1f84\u1f94\u1fa4\u1fb4\u1fc4\u1ff4\u0000\u0391\u0397\u03a9\u03b1\u03b7\u03c9\u1f89\u1f99\u1fa9\u1f81\u1f91\u1fa1\u0000\u0391\u0397\u03a9\u03b1\u03b7\u03c9\u1f88" +
"\u1f98\u1fa8\u1f80\u1f90\u1fa0\u0000()\u03b1\u03b7\u03c9\u0000\u0391\u0397\u03a9\u03b1\u03b7\u03c9\u1f8b\u1f9b\u1fab\u1f83\u1f93\u1fa3\u0000\u0391\u0397\u03a9\u03b1\u03b7\u03c9\u1f8a\u1f9a\u1faa\u1f82\u1f92\u1fa2\u1fb2\u1fc2\u1ff2\u0000()\u03b1\u03b7\u03c9\u0000\u0391\u0397\u03a9\u03b1\u03b7\u03c9\u1f8f\u1f9f\u1faf\u1f87\u1f97\u1fa7\u0000\u0391\u0397\u03a9\u03b1\u03b7\u03c9\u1f8e\u1f9e\u1fae\u1f86\u1f96\u1fa6" +
"\u1fb7\u1fc7\u1ff7\u0000()\u03b1\u03b7\u03c9\u0000\u0391\u0397\u03a9\u03b1\u03b7\u03c9\u0000\u0391\u0397\u03a9\u03b1\u03b7\u03c9\u1fbc\u1fcc\u1ffc\u1fb3\u1fc3\u1ff3\u0000'\u0000\"'\u0000'\u0000\".\u0406\u0423\u0443\u0456\u0474\u0000\u0410\u0430\u0462\u0463\uFFFF\ua656\uFFFF\ua65c\u0000\u0415\u0423\u042b\u042c\u042d\u0435\u0443\u044b\u044c\u044d\ua64a\ua64b\ua650\ua651\u04d4\u0460\u0462\uFFFF" +
"\ua658\u04d8\uFFFF\ua64c\u0000,.\u0408\u0419\u041a\u0425\u0439\u043a\u0445\u0458\u0490\u0480\u0000\u0408\u0415\u0416\u0417\u0419\u0435\u0436\u0437\u0439\u0458\u0464\u0465\uFFFF\ua648\u040f\uFFFF\ua642\u0402\u0000=\u0000.\u0000=\u0424\u0444\u0498\u0000\u0418\u0423\u0438\u0443\u0000.\u0000,.\u0413\u0421\u0425\u0428\u0433\u0441\u0445\u0448\u046e\u0000,.\u042c\u044c\u0409\u0000." +
"\u0000,\u00b7\u041e\u042c\u043e\u044c\u0528\u040a\u0000\u0422\u0423\u0442\u0443\u047e\u0478\u0000\u0421\u0441\u0470\u0000=\u0000\u0408\u0419\u0421\u0424\u0439\u0441\u0444\u0458\u040b\u0426\u0472\u0000\u0406\u0408\u0418\u0419\u0423\u0438\u0439\u0443\u0456\u0458\u0000,.\u0000.\u0000\u0422\u0442\u0429\u0000\u0406\u0410\u0415\u041c\u041d\u041e\u042c\u042d\u0430\u0435\u043c\u043d\u043e\u044c\u044d\u0456\u0464" +
"\u046c\u0468\uFFFF\ua652\u0000\u0435\u0443\u0447\u044b\u044c\u044d\ua64b\ua651\u04d5\u0461\uFFFF\u0063\u006f\u006d\u0062\u0069\u006e\u0069\u006e\u0067\u005f\u0061\u0069\u0067\u0075\u0463\uFFFF\ua659\u04d9\uFFFF\ua64d\u0000\u0447\uFFFF\u0063\u006f\u006d\u0062\u0069\u006e\u0069\u006e\u0067\u005f\u0073\u006c\u0061\u0076\u006f\u006e\u0069\u0063\u005f\u0070\u0073\u0069\u006c\u0069\u0000,.\u0439\u043a\u0445\u0458\u0491\u0481" +
"\u0000\u0435\u0436\u0437\u0439\u0458\u0465\uFFFF\ua649\u045f\uFFFF\ua643\u0452\u0000\u0447\uFFFF\u0063\u006f\u006d\u0062\u0069\u006e\u0069\u006e\u0067\u005f\u0074\u0072\u0065\u006d\u0061\u0000.\u0000=\u0444\u0499\u0000\u0438\u0443\u0475\u0000.\u0447\uFFFF\u0063\u006f\u006d\u0062\u0069\u006e\u0069\u006e\u0067\u005f\u0062\u0072\u0065\u0076\u0065\u0000,.\u0433\u0441\u0445\u0448\u046f\u0000,.\u044c" +
"\u0459\u0000.\u0000,\u00b7\u0447\u044c\u0529\uFFFF\u0063\u006f\u006d\u0062\u0069\u006e\u0069\u006e\u0067\u005f\u0074\u0069\u0074\u006c\u006f\u045a\u0000\u0442\u0443\u0447\u047f\u0479\uFFFF\u0063\u006f\u006d\u0062\u0069\u006e\u0069\u006e\u0067\u005f\u0069\u006e\u0076\u0065\u0072\u0074\u0065\u0064\u005f\u0062\u0072\u0065\u0076\u0065\u0000\u0430\u0441\u0471\u0000\u0439\u0441\u0444\u0458\u045b\u0446\u0473\u0000\u0438\u0439" +
"\u0443\u0447\u0456\u0458\uFFFF\u0063\u006f\u006d\u0062\u0069\u006e\u0069\u006e\u0067\u005f\u0070\u006f\u006b\u0072\u0079\u0074\u0069\u0065\u0000,.\u0447\uFFFF\u0063\u006f\u006d\u0062\u0069\u006e\u0069\u006e\u0067\u005f\u0073\u006c\u0061\u0076\u006f\u006e\u0069\u0063\u005f\u0064\u0061\u0073\u0069\u0061\u0000.\u0430\u0431\u0435\u0439\u043d\u043e\u0443\u0445\u0447\u044a\u044e\u0458\u0467\uFFFF\u0063\u006f\u006d\u0062" +
"\u0069\u006e\u0069\u006e\u0067\u005f\u0070\u0061\u0079\u0065\u0072\u006f\u006b\uFFFF\u0063\u006f\u006d\u0062\u0069\u006e\u0069\u006e\u0067\u005f\u0076\u0065\u0072\u0074\u0069\u0063\u0061\u006c\u005f\u0074\u0069\u006c\u0064\u0065\uFFFF\u0063\u006f\u006d\u0062\u0069\u006e\u0069\u006e\u0067\u005f\u0067\u0072\u0061\u0076\u0065\uFFFF\u0063\u006f\u006d\u0062\u0069\u006e\u0069\u006e\u0067\u005f\u0076\u007a\u006d\u0065\u0074\u0000\u0442" +
"\u0449\u0000\u0447\u0000\u0430\u0435\u043c\u043d\u043e\u0447\u044c\u044d\u0456\uFFFF\ua657\u0465\u046d\u0469\uFFFF\ua65d\uFFFF\ua653\u0000\".\u0443\u0456\u0000\u0430\u0447\u0463\u0000\u0422\u0442\u0000\u0442\u0000\u0447\u0000\u05d9\uFFFF\ufb1d\u0000\u05d0\u05f2\uFFFF\ufb2e\uFFFF\ufb1f\u0000\u05d0\uFFFF\ufb2f\u0000\u05d5\uFFFF\ufb4b\u0000\u05d0\u05d1\u05d2\u05d3\u05d4\u05d5\u05d6\u05d8\u05d9\u05da\u05db\u05dc\u05de\u05e0" +
"\u05e1\u05e3\u05e4\u05e6\u05e7\u05e8\u05e9\u05ea\uFFFF\ufb30\uFFFF\ufb31\uFFFF\ufb32\uFFFF\ufb33\uFFFF\ufb34\uFFFF\ufb35\uFFFF\ufb36\uFFFF\ufb38\uFFFF\ufb39\uFFFF\ufb3a\uFFFF\ufb3b\uFFFF\ufb3c\uFFFF\ufb3e\uFFFF\ufb40\uFFFF\ufb41\uFFFF\ufb43\uFFFF\ufb44\uFFFF\ufb46\uFFFF\ufb47\uFFFF\ufb48\uFFFF\ufb49\uFFFF\ufb4a\u0000\u05d1\u05db\u05e4\uFFFF\ufb4c\uFFFF\ufb4d\uFFFF\ufb4e\u0000\u05bc\u05e9\ufb49\u0000\u05e9\uFFFF\ufb2c\uFFFF\ufb2a" +
"\u0000\u05bc\u05e9\ufb49\u0000\u05e9\uFFFF\ufb2d\uFFFF\ufb2b\u0000\u0627\u0639\u0648\u064a\u0667\u06cc\u06f7\uFFFF\u0063\u006f\u006d\u0062\u0069\u006e\u0069\u006e\u0067\u005f\u0061\u006c\u0065\u0066\u005f\u0061\u0062\u006f\u0076\u0065\u0623\u06c9\u063d\uFFFF\u0063\u006f\u006d\u0062\u0069\u006e\u0069\u006e\u0067\u005f\u0061\u006c\u0065\u0066\u005f\u0062\u0065\u006c\u006f\u0077\u0000\u062f\u0631\u0634\u0646\u0637\u0691\u062b\u0679" +
"\u0000\u0634\u0686\u0000\u062d\uFFFF\u0063\u006f\u006d\u0062\u0069\u006e\u0069\u006e\u0067\u005f\u0073\u0075\u006b\u0075\u006e\u0000\u062a\u0632\u06f7\u0630\u0695\u0000\u0634\u0635\u0000\u062a\u0000\u0627\u0647\u0648\u064a\u0667\u0668\u06cc\u06f7\u06f8\u0625\u06c0\u0624\u0626\uFFFF\u0063\u006f\u006d\u0062\u0069\u006e\u0069\u006e\u0067\u005f\u0068\u0061\u006d\u007a\u0061\u005f\u0062\u0065\u006c\u006f\u0077\uFFFF\u0063\u006f\u006d" +
"\u0062\u0069\u006e\u0069\u006e\u0067\u005f\u0068\u0061\u006d\u007a\u0061\u005f\u0061\u0062\u006f\u0076\u0065\u0000\u0643\u06a9\u06af\u0000\u0648\u06a1\u0000\u0648\u06ca\u0000\u0644\u0667\u06f7\uFFFF\u0063\u006f\u006d\u0062\u0069\u006e\u0069\u006e\u0067\u005f\u0073\u0068\u0061\u0064\u0064\u0061\u0068\u06b5\u0000\u062a\u0647\u0648\u064a\u06cc\uFFFF\u0063\u006f\u006d\u0062\u0069\u006e\u0069\u006e\u0067\u005f\u0066\u0061\u0074\u0068" +
"\u0061\u0074\u0061\u006e\uFFFF\u0063\u006f\u006d\u0062\u0069\u006e\u0069\u006e\u0067\u005f\u0064\u0061\u006d\u006d\u0061\u0074\u0061\u006e\uFFFF\u0063\u006f\u006d\u0062\u0069\u006e\u0069\u006e\u0067\u005f\u006b\u0061\u0073\u0072\u0061\u0074\u0061\u006e\u0000 \u062a\u0639\u0646\u0647\u0648\u064a\u06cc\u06d5\u0629\uFFFF\u0063\u006f\u006d\u0062\u0069\u006e\u0069\u006e\u0067\u005f\u0066\u0061\u0074\u0068\u0061\u06c6\u06ce\u0000" +
"\u062b\u0639\u0641\u0646\u0648\u0667\u0668\u06f7\u06f8\u06cb\uFFFF\u0063\u006f\u006d\u0062\u0069\u006e\u0069\u006e\u0067\u005f\u0064\u0061\u006d\u006d\u0061\u0068\u0000 \u0627\u0639\u0646\u064a\u0667\u0668\u06f7\u06f8\u06d2\u0649\uFFFF\u0063\u006f\u006d\u0062\u0069\u006e\u0069\u006e\u0067\u005f\u006b\u0061\u0073\u0072\u0061\u0000\u0627\u0622\u0000\u0627\u0648\u064a\u06c1\u06d2\u06d5\u06c2\u06d3\u0000\u0627\u0000\u0627\u0631" +
"\u0639\u0644\u0648\u064a\u0667\u06cc\uFFFF\u0063\u006f\u006d\u0062\u0069\u006e\u0069\u006e\u0067\u005f\u0061\u0072\u0061\u0062\u0069\u0063\u005f\u0076\u0000\u0639\u0648\u064a\u0668\u06cc\uFFFF\u0063\u006f\u006d\u0062\u0069\u006e\u0069\u006e\u0067\u005f\u0061\u0072\u0061\u0062\u0069\u0063\u005f\u0069\u006e\u0076\u0065\u0072\u0074\u0065\u0064\u005f\u0076\u0000 \u0627\u0639\u0646\u0667\u0668\u06cc\u06f7\u06f8\u0000\u0627\u0631" +
"\u0639\u0644\u0648\u064a\u06cc\u06f7\u0000\u0639\u0648\u064a\u06cc\u06f8\u0000\u0915\u0916\u0917\u091c\u0921\u0922\u0928\u092b\u092f\u0930\u0933\u0958\u0959\u095a\u095b\u095c\u095d\u0929\u095e\u095f\u0931\u0934\u0000\u09a1\u09a2\u09af\u09dc\u09dd\u09df\u0000\u09be\u09d7\u09cb\u09cc\u0000\u0a16\u0a17\u0a1c\u0a2b\u0a32\u0a38\u0a59\u0a5a\u0a5b\u0a5e\u0a33\u0a36\u0000\u0b21\u0b22\u0b5c\u0b5d\u0000\u0b3e\u0b56\u0b57\u0b4b\u0b48\u0b4c" +
"\u0000\u0bbe\u0bd7\u0bca\u0bcc\u0000\u0bbe\u0bcb\u0000\u0b92\u0b94\u0000\u0c56\u0c48\u0000\u0cd5\u0cc0\u0000\u0cc2\u0cd5\u0cd6\u0cca\u0cc7\u0cc8\u0000\u0cd5\u0ccb\u0000\u0d3e\u0d57\u0d4a\u0d4c\u0000\u0d3e\u0d4b\u0000\u0dca\u0dcf\u0ddf\u0dda\u0ddc\u0dde\u0000\u0dca\u0ddd\u0000\u0f72\u0f74\u0f80\u0f73\u0f75\u0f81\u0000\u0fb5\u0fb9\u0000\u0fb7\u0f93\u0000\u0fb7\u0f9d\u0000\u0fb7\u0fa2\u0000\u0fb7\u0fa7\u0000\u0fb7\u0fac\u0000\u0f80" +
"\u0f76\u0000\u0f80\u0f78\u0000\u0f40\u0f69\u0000\u0f42\u0f4c\u0f51\u0f56\u0f5b\u0f43\u0f4d\u0f52\u0f57\u0f5c\u0000\u1025\u1026\u0000\u1100\u1101\u0000\u1100\u1102\u1103\u1107\u1113\u1114\u1115\u1116\u0000\u1100\u1103\u1117\u1104\u0000\u1102\u1105\u110b\u1112\u1118\u1119\u111b\u111a\u0000\u1107\u110b\u111c\u111d\u0000\u1100\u1102\u1103\u1107\u1109\u110a\u110b\u110c\u110e\u1110\u1111\u112b\u112d\u112f\u1132\u1136\u111e\u111f\u1120" +
"\u1108\u1121\u1125\u112b\u1127\u1128\u1129\u112a\u112c\u1122\u1123\u1124\u1126\u0000\u110b\u0000\u1100\u1102\u1103\u1105\u1106\u1107\u1109\u110a\u110b\u110c\u110e\u110f\u1110\u1111\u1112\u111e\u112d\u112e\u112f\u1130\u1131\u1132\u110a\u1134\u1135\u1136\u1137\u1138\u1139\u113a\u113b\u1133\u0000\u1109\u0000\u1100\u1103\u1106\u1107\u1109\u110b\u110c\u110e\u1110\u1111\u1140\u1141\u1142\u1143\u1144\u1145\u1147\u1148\u1149\u114a\u114b" +
"\u1146\u0000\u110b\u110c\u114d\u110d\u0000\u110f\u1112\u1152\u1153\u0000\u1107\u110b\u1156\u1157\u0000\u1112\u1158\u0000\u1100\u1103\u1107\u1109\u110c\u0000\u1100\u0000\u113c\u113d\u0000\u113e\u113f\u0000\u114e\u114f\u0000\u1150\u1151\u0000\u1169\u116e\u1175\u1176\u1177\u1162\u0000\u1169\u116d\u1175\u1178\u1179\u1164\u0000\u1169\u116e\u1173\u1175\u117a\u117b\u117c\u1166\u0000\u1169\u116e\u1175\u117d\u117e\u1168\u0000\u1161\u1162" +
"\u1165\u1166\u1168\u1169\u116e\u1175\u116a\u116b\u117f\u1180\u1181\u1182\u1183\u116c\u0000\u1175\u0000\u1163\u1164\u1167\u1169\u1175\u1184\u1185\u1186\u1187\u1188\u0000\u1161\u1162\u1165\u1166\u1168\u116e\u1175\u117c\u1189\u118a\u116f\u1170\u118c\u118d\u1171\u118b\u0000\u1173\u1175\u0000\u1161\u1165\u1166\u1167\u1168\u116e\u1175\u118e\u118f\u1190\u1191\u1192\u1193\u1194\u0000\u116e\u1173\u1175\u1195\u1196\u1174\u0000\u116e\u1197" +
"\u0000\u1161\u1163\u1169\u116e\u1173\u119e\u1198\u1199\u119a\u119b\u119c\u119d\u0000\u1165\u116e\u1175\u119e\u119f\u11a0\u11a1\u11a2\u0000\u11a8\u11af\u11ba\u11e7\u11a9\u11c3\u11aa\u11c4\u0000\u11a8\u0000\u11a8\u11ae\u11ba\u11bd\u11c0\u11c2\u11eb\u11c5\u11c6\u11c7\u11ac\u11c9\u11ad\u11c8\u0000\u11a8\u11af\u11ca\u11cb\u0000\u11a8\u11aa\u11ab\u11ae\u11af\u11b7\u11b8\u11b9\u11ba\u11bb\u11bf\u11c0\u11c1\u11c2\u11da\u11dd\u11e5\u11e6" +
"\u11eb\u11f9\u11b0\u11cc\u11cd\u11ce\u11d0\u11b1\u11b2\u11d3\u11b3\u11d6\u11d8\u11b4\u11b5\u11b6\u11d1\u11d2\u11d4\u11d5\u11d7\u11d9\u0000\u11ba\u0000\u11a8\u11ba\u0000\u11ba\u11bc\u11c2\u0000\u11ba\u0000\u11a8\u11af\u11b8\u11ba\u11bb\u11bc\u11be\u11c2\u11eb\u11da\u11db\u11dc\u11dd\u11de\u11e2\u11e0\u11e1\u11df\u0000\u11af\u11ba\u11bc\u11c1\u11c2\u11e3\u11b9\u11e6\u11e4\u11e5\u0000\u11a8\u11ae\u11af\u11b8\u11ba\u11e7\u11e8\u11e9" +
"\u11ea\u11bb\u0000\u11a8\u11a9\u11bc\u11bf\u11ec\u11ed\u11ee\u11ef\u0000\u11b8\u11bc\u11f3\u11f4\u0000\u11ab\u11af\u11b7\u11b8\u11f5\u11f6\u11f7\u11f8\u0000\u11c2\u11cf\u0000\u11ba\u0000\u11a8\u0000\u11ba\u11eb\u11f1\u11f2\u0000|\u2395\u2347\u0000-\u2395\u2350\u0000|\u2395\u2348\u0000-\u2395\u2357\u0000/\u2204\u0000_|\u2395\u234d\u0000|~\u00a8\u2395\u2354\u0000/\u2209\u0000_" +
"\u0000/\u220c\u0000_\u00a8\u2229\u22a4\u22a5\u2395\u25cb\u235d\u2355\u234e\u233b\u233e\u0000/\u2224\u0000/\u2226\u0000~\u2228\u2395\u2353\u0000~\u2227\u2395\u234c\u0000\u2218\u0000|\u0000/\u2241\u0000/\u2244\u0000/\u2249\u0000/\u226d\u0000_\u2395\u236f\u0000/\u0000/\u2270\u0000/\u2271\u0000/\u2274\u0000/\u2275\u0000/\u2278\u0000/\u2279" +
"\u0000/\u2280\u0000/\u2281\u0000/\u22e0\u0000/\u22e1\u0000/_|\u2284\u0000/_\u2285\u0000/\u2288\u0000/\u2289\u0000/\u22e2\u0000/\u22e3\u0000/\u22ac\u0000\u00a8\u00af\u2218\u22a5\u2336\u0000_\u2218\u22a4\u0000/\u22ad\u0000/\u22ae\u0000/\u22af\u0000/\u22ea\u0000/\u22eb\u0000/\u22ec\u0000/\u22ed\u0000_\u2395\u233a\u0000" +
"_\u0000_\u0000_\u0000'/:<=>?\\\u00f7\u2190\u2191\u2192\u2193\u2206\u2207\u2218\u2227\u2228\u2260\u22c4\u25cb\u233c\u0000*-.\\_|\u00a8\u2218\u2395\u0000/\u2adc\u0000 !\"%'()*,-.0123456789:<=>?[]^_" +
"abcehlopruyz{|}\u00a3\u00a7\u00b1\u00d7\u0398\u03a0\u03a3\u03b2\u03b3\u03b5\u03b8\u03ba\u03c0\u03c1\u03c3\u03c5\u03c6\u0430\u0433\u0434\u0435\u0437\u0438\u0439\u043b\u043c\u043d\u043e\u0441\u0443\u0444\u0445\u0447\u0448\u044a\u044b\u044c\u044d\u044f\u0452\u0456\u0458\u045b\u045f\u0461\u0481\u0487\u049b\u04b7\u04c8\u0513\u05d1\u05d3\u05d5\u05d6\u05d7\u05dd" +
"\u05e1\u05e3\u05e4\u05e6\u05e7\u05e8\u05e9\u0625\u0626\u0627\u0628\u0629\u062a\u062b\u062d\u062f\u0631\u0632\u0633\u0634\u0635\u0637\u0639\u063a\u063d\u0641\u0642\u0643\u0644\u0645\u0646\u0647\u0648\u064a\u064f\u0650\u0660\u0661\u0662\u0663\u0664\u0665\u0666\u0667\u0668\u0669\u0698\u06a1\u06a9\u06be\u06c6\u06c9\u06cc\u06ce\u06f0\u06f1\u06f2\u06f3\u06f4\u06f5\u06f6\u06f7\u06f8\u06f9\u0901\u0902\u0905\u0906\u0907\u0908\u0909\u090a" +
"\u090b\u090c\u090f\u0910\u0913\u0914\u0915\u0916\u0917\u0918\u091a\u091b\u091c\u091d\u091f\u0921\u0922\u0923\u0925\u0926\u0928\u092a\u092b\u092c\u092f\u0930\u0933\u0935\u0936\u0937\u093c\u093d\u093e\u093f\u0940\u0941\u0943\u0947\u0948\u094b\u094c\u0953\u0956\u0962\u0964\u0970\u0b92\u0b9a\u0baf\u0bb3\u0bb5\u2020\u20ac\u20b9\u2190\u2191\u2192\u2193\u2194\u2195\u2196\u2197\u2198\u2199\u2203\u2206\u2207\u2227\u2228\u2229\u222a\u222b" +
"\u2282\u2283\u22a4\u22b7\u22c4\u235d\u2375\u237a\u2395\ua649\ua651\ua657\ua67d\uFFFF\u0066\u0031\u0030\uFFFF\u0066\u0031\uFFFF\u0066\u0032\uFFFF\u0066\u0033\uFFFF\u0066\u0034\uFFFF\u0066\u0035\uFFFF\u0066\u0036\uFFFF\u0066\u0037\uFFFF\u0066\u0038\uFFFF\u0066\u0039\uFFFF\u007a\u0077\u006e\u006a\u20b1\u20b4\u20bf\uFFFF\u0072\u0065\u006d\u006f\u0076\u0065\u0064\u2213\u2219\u03f4\u220f\u2211\u03d0\u0263\u03f5\u03d1\u03f0\u03d6\u03f1" +
"\u03c2\u03d2\u03d5\uFFFF\ua641\u0456\u0458\u046b\u0467\u047b\u0455\uFFFF\ua64b\u04bb\u044c\uFFFF\ua651\u044a\u0454\u0438\u0447\uFFFF\u0063\u006f\u006d\u0062\u0069\u006e\u0069\u006e\u0067\u005f\u0063\u0079\u0072\u0069\u006c\u006c\u0069\u0063\u005f\u0076\u007a\u006d\u0065\u0074\uFFFF\u0068\u0061\u0074\u0061\u0066\u005f\u0073\u0065\u0067\u006f\u006c\uFFFF\u0064\u0061\u0067\u0065\u0073\u0068\uFFFF\u0068\u006f\u006c\u0061\u006d\uFFFF" +
"\u0071\u0075\u0062\u0075\u0074\u0073\uFFFF\u0068\u0069\u0072\u0069\u0071\uFFFF\u0072\u0061\u0066\u0065\uFFFF\u0073\u0065\u0067\u006f\u006c\uFFFF\u0068\u0061\u0074\u0061\u0066\u005f\u0070\u0061\u0074\u0061\u0068\uFFFF\u0070\u0061\u0074\u0061\u0068\uFFFF\u0074\u0073\u0065\u0072\u0065\uFFFF\u0071\u0061\u006d\u0061\u0074\u0073\uFFFF\u0068\u0061\u0074\u0061\u0066\u005f\u0071\u0061\u006d\u0061\u0074\u0073\uFFFF\u0073\u0068\u0065\u0076" +
"\u0061\u066e\u067e\u06c1\u0698\u0636\u0638\u0621\u06a4\u063a\u06a9\u0640\u06ba\u06be\u06cc\u0643\u0647\u064a\u0900\u0955\u0972\u0911\u0973\u0974\u0976\u0977\u0960\u0961\u090d\u090e\u0912\u0975\u097b\u097c\uFFFF\u0936\u094d\u091a\u0979\u0978\u097e\uFFFF\u0924\u094d\u0930\uFFFF\u0926\u094d\u0930\uFFFF\u092a\u094d\u0930\u097f\u097a\uFFFF\u0936\u094d\u0930\uFFFF\u0915\u094d\u0937\u094e\u097d\u0949\u093a\u093b\u0904\u0944\u0945\u0946" +
"\u094a\u094f\u0954\u0957\u0963\u0965\u0971\uFFFF\u0bd0\uFFFF\u0bf2\uFFFF\u0bf0\uFFFF\u0bf1\uFFFF\u0bf3\u21d4\u21d5\u21d6\u21d7\u21d8\u21d9\u22c0\u22c1\u22c2\u22c3\u222e\u22b6\u044b\u044f\uFFFF\u0063\u006f\u006d\u0062\u0069\u006e\u0069\u006e\u0067\u005f\u0063\u0079\u0072\u0069\u006c\u006c\u0069\u0063\u005f\u0074\u0069\u0074\u006c\u006f\u00000123456789\u09e6\u09e7\u09e8\u09e9\u09ea" +
"\u09eb\u09ec\u09ed\u09ee\u09ef\u00000123456789\u0966\u0967\u0968\u0969\u096a\u096b\u096c\u096d\u096e\u096f\u00000123456789\u0ae6\u0ae7\u0ae8\u0ae9\u0aea\u0aeb\u0aec\u0aed\u0aee\u0aef\u00000123456789\u0660\u0661\u0662\u0663\u0664\u0665\u0666\u0667\u0668\u0669\u0000012" +
"3456789\u0ce6\u0ce7\u0ce8\u0ce9\u0cea\u0ceb\u0cec\u0ced\u0cee\u0cef\u00000123456789\u06f0\u06f1\u06f2\u06f3\u06f4\u06f5\u06f6\u06f7\u06f8\u06f9\u00000123456789\u0be6\u0be7\u0be8\u0be9\u0bea\u0beb\u0bec\u0bed\u0bee\u0bef\u0000\u00df\u0131\u01f0\u0237\u02b0\u02b2\u02b3\u02b7\u02e1\u0905\u0907\u0909" +
"\u090b\u090c\u090f\u0913\u0915\u0917\u091a\u091c\u091f\u0921\u0924\u0926\u0928\u092c\u092e\u0932\u0938\u0939\u093f\u0941\u0943\u0945\u0947\u0949\u094b\u0952\u0962\u0a85\u0a87\u0a89\u0a8f\u0a93\u0a95\u0a97\u0a9a\u0a9c\u0a9f\u0aa1\u0aa4\u0aa6\u0aa8\u0aaa\u0aac\u0aae\u0ab2\u0ab8\u0ab9\u0abf\u0ac1\u0ac7\u0acb\u0bf9\u1d43\u1d47\u1d48\u1d49\u1d4d\u1d4f\u1d50\u1d52\u1d56\u1d57\u1d58\u1d5b\u1d60\u1d9c\u1da0\u1dbe\u1e97\u1e98\u1e99\u2071" +
"\u207f\u20b9\u2190\u2191\u2192\u2193\u2196\u2197\u2198\u2199\u2208\u220b\u2282\u2283\u2286\u2287\u2500\u2502\u250c\u2510\u2514\u2518\u251c\u2524\u252c\u2534\u253c\ud835\uFFFF\u004a\u030c\uFFFF\u004a\u0307\u1d34\u1d36\u1d3f\u1d42\u1d38\u0906\u0908\u090a\u0910\u0914\u0916\u0918\u091b\u091d\u0920\u0922\u0925\u0927\u0923\u092d\u0902\u0933\u0936\u0903\u0940\u0942\u0948\u094c\u0951\u0a86\u0a88\u0a8a\u0a90\u0a94\u0a96\u0a98\u0a9b\u0a9d" +
"\u0aa0\u0aa2\u0aa5\u0aa7\u0aa3\u0aab\u0aad\u0a82\u0ab3\u0ab6\u0a83\u0ac0\u0ac2\u0ac8\u0acc\u1d2c\u1d2e\u1d30\u1d31\u1d33\u1d37\u1d39\u1d3c\u1d3e\u1d40\u1d41\u2c7d\u1db2\uFFFF\ua7f2\uFFFF\ua7f3\uFFFF\u0054\u0308\uFFFF\u0057\u030a\uFFFF\u0059\u030a\u1d35\u1d3a\u2550\u2551\u2554\u2557\u255a\u255d\u2560\u2563\u2566\u2569\u256c\u0000\udd57\udd58\udd64\udd68\udd69\uFFFF\ud835\udd3d\uFFFF\ud835\udd3e\uFFFF\ud835\udd4a\uFFFF\ud835\udd4e" +
"\uFFFF\ud835\udd4f\u0000ABCDEFGHIJKLMNOPQRSTUVWXYZx\u00a2\u00a3\u00a5\u00aa\u00b5\u00ba\u00c0\u00c1\u00c2\u00c3\u00c4\u00c5\u00c6\u00c7\u00c8\u00c9\u00ca\u00cb\u00cc\u00cd\u00ce\u00cf\u00d1\u00d2\u00d3\u00d4\u00d5\u00d6\u00d8\u00d9\u00da\u00db\u00dc\u00dd\u00e0\u00e1\u00e2\u00e3\u00e4\u00e5\u00e6" +
"\u00e7\u00e8\u00e9\u00ea\u00eb\u00ec\u00ed\u00ee\u00ef\u00f1\u00f2\u00f3\u00f4\u00f5\u00f6\u00f8\u00f9\u00fa\u00fb\u00fc\u00fd\u00ff\u0100\u0101\u0104\u0105\u0106\u0107\u0108\u0109\u010a\u010b\u010c\u010d\u010e\u010f\u0110\u0111\u0112\u0113\u0116\u0117\u0118\u0119\u011a\u011b\u011c\u011d\u0120\u0121\u0122\u0123\u0124\u0125\u0126\u0127\u0128\u0129\u012a\u012b\u012e\u012f\u0130\u0131\u0134\u0135\u0136\u0137\u0139\u013a\u013b\u013c" +
"\u013d\u013e\u0141\u0142\u0143\u0144\u0145\u0146\u0147\u0148\u014c\u014d\u0150\u0151\u0152\u0153\u0154\u0155\u0156\u0157\u0158\u0159\u015a\u015b\u015c\u015d\u015e\u015f\u0160\u0161\u0162\u0163\u0164\u0165\u0166\u0167\u0168\u0169\u016a\u016b\u016e\u016f\u0170\u0171\u0172\u0173\u0174\u0175\u0176\u0177\u0178\u0179\u017a\u017b\u017c\u017d\u017e\u0180\u0194\u0197\u019a\u019f\u01a0\u01a1\u01a6\u01af\u01b0\u01b5\u01b6\u01cd\u01ce\u01cf" +
"\u01d0\u01d1\u01d2\u01d3\u01d4\u01d5\u01d6\u01d7\u01d8\u01d9\u01da\u01db\u01dc\u01de\u01df\u01e0\u01e1\u01e2\u01e3\u01e4\u01e5\u01e6\u01e7\u01e8\u01e9\u01ea\u01eb\u01ec\u01ed\u01ee\u01ef\u01f0\u01f4\u01f5\u01f8\u01f9\u01fa\u01fb\u01fc\u01fd\u01fe\u01ff\u0200\u0201\u0204\u0205\u0208\u0209\u020c\u020d\u0210\u0211\u0214\u0215\u021e\u021f\u0226\u0227\u0228\u0229\u022a\u022b\u022c\u022d\u022e\u022f\u0230\u0231\u0232\u0233\u0237\u023a" +
"\u023b\u023c\u023d\u023e\u0243\u0244\u0246\u0247\u0248\u0249\u024c\u024d\u024e\u024f\u025f\u0262\u0263\u0268\u026a\u0274\u0275\u0276\u0280\u0289\u028f\u0299\u029b\u029c\u029f\u02b0\u02b1\u02b2\u02b3\u02b4\u02b5\u02b6\u02b7\u02b8\u02e0\u02e1\u02e2\u02e3\u0386\u0388\u0389\u038a\u038c\u038e\u0392\u0395\u0398\u039a\u039c\u03a0\u03a1\u03a3\u03a6\u03aa\u03ab\u03ac\u03ad\u03ae\u03af\u03b0\u03c2\u03ca\u03cb\u03cc\u03cd\u03d0\u03d1\u03d2" +
"\u03d4\u03d5\u03d6\u03f0\u03f1\u03f4\u03f5\u0400\u0402\u0403\u0404\u0405\u0406\u0408\u040b\u040c\u040d\u040f\u0418\u0419\u0427\u042a\u042b\u042c\u042f\u0438\u0439\u0447\u044a\u044b\u044c\u044f\u0450\u0452\u0453\u0454\u0455\u0456\u0458\u045b\u045c\u045d\u045f\u0462\u0463\u0466\u0467\u046a\u046b\u0470\u0471\u0472\u0473\u0476\u0477\u047a\u047b\u0480\u0481\u048c\u048d\u0490\u0491\u0498\u0499\u049a\u049b\u04b0\u04b1\u04b6\u04b7\u04ba" +
"\u04bb\u04d2\u04d3\u04da\u04db\u04dc\u04dd\u04de\u04df\u04e2\u04e3\u04e4\u04e5\u04e6\u04e7\u04e8\u04e9\u04ea\u04eb\u04ec\u04ed\u04ee\u04ef\u04f0\u04f1\u04f2\u04f3\u04f4\u04f5\u04f8\u04f9\u04fe\u04ff\u0528\u0529\u052e\u052f\u0621\u0622\u0630\u0635\u0636\u0637\u0638\u063a\u0640\u0643\u0647\u064a\u066e\u067e\u0695\u0698\u06a1\u06a4\u06a9\u06af\u06b5\u06ba\u06be\u06c1\u06cc\u0902\u0903\u0906\u0908\u090a\u090d\u090e\u0910\u0911\u0912" +
"\u0914\u0916\u0918\u091b\u091d\u0920\u0922\u0923\u0925\u0927\u0929\u092d\u0931\u0933\u0934\u0936\u0958\u0959\u095a\u095b\u095c\u095d\u095e\u095f\u0960\u0961\u0972\u0973\u0974\u0975\u0976\u0977\u0978\u0979\u097a\u097b\u097c\u097d\u097e\u097f\u0a82\u0a83\u0a86\u0a88\u0a8a\u0a90\u0a94\u0a96\u0a98\u0a9b\u0a9d\u0aa0\u0aa2\u0aa3\u0aa5\u0aa7\u0aab\u0aad\u0ab3\u0ab6\u1d00\u1d01\u1d03\u1d04\u1d05\u1d06\u1d07\u1d0a\u1d0b\u1d0c\u1d0d\u1d0e" +
"\u1d0f\u1d10\u1d15\u1d18\u1d19\u1d1a\u1d1b\u1d1c\u1d20\u1d21\u1d22\u1d23\u1d26\u1d27\u1d28\u1d29\u1d2a\u1d2b\u1d43\u1d44\u1d46\u1d47\u1d48\u1d49\u1d4a\u1d4b\u1d4c\u1d4d\u1d4e\u1d4f\u1d50\u1d51\u1d52\u1d53\u1d56\u1d57\u1d58\u1d59\u1d5a\u1d5b\u1d5d\u1d5f\u1d60\u1d61\u1d62\u1d63\u1d64\u1d65\u1d66\u1d67\u1d68\u1d69\u1d6a\u1d7b\u1d7d\u1d7e\u1d9b\u1d9c\u1d9d\u1d9f\u1da0\u1da1\u1da3\u1da4\u1da5\u1dac\u1dad\u1db1\u1db3\u1db4\u1db6\u1db7" +
"\u1dba\u1dbb\u1dbe\u1dbf\u1e02\u1e03\u1e04\u1e05\u1e08\u1e09\u1e0a\u1e0b\u1e0c\u1e0d\u1e10\u1e11\u1e14\u1e15\u1e16\u1e17\u1e1c\u1e1d\u1e1e\u1e1f\u1e20\u1e21\u1e22\u1e23\u1e24\u1e25\u1e26\u1e27\u1e28\u1e29\u1e2e\u1e2f\u1e30\u1e31\u1e32\u1e33\u1e36\u1e37\u1e38\u1e39\u1e3e\u1e3f\u1e40\u1e41\u1e42\u1e43\u1e44\u1e45\u1e46\u1e47\u1e4c\u1e4d\u1e4e\u1e4f\u1e50\u1e51\u1e52\u1e53\u1e54\u1e55\u1e56\u1e57\u1e58\u1e59\u1e5a\u1e5b\u1e5c\u1e5d" +
"\u1e60\u1e61\u1e62\u1e63\u1e64\u1e65\u1e66\u1e67\u1e68\u1e69\u1e6a\u1e6b\u1e6c\u1e6d\u1e78\u1e79\u1e7c\u1e7d\u1e7e\u1e7f\u1e80\u1e81\u1e82\u1e83\u1e84\u1e85\u1e86\u1e87\u1e88\u1e89\u1e8a\u1e8b\u1e8c\u1e8d\u1e8e\u1e8f\u1e90\u1e91\u1e92\u1e93\u1e97\u1e98\u1e99\u1e9b\u1e9e\u1ea0\u1ea1\u1ea2\u1ea3\u1ea4\u1ea5\u1ea6\u1ea7\u1ea8\u1ea9\u1eaa\u1eab\u1eac\u1ead\u1eae\u1eaf\u1eb0\u1eb1\u1eb2\u1eb3\u1eb4\u1eb5\u1eb6\u1eb7\u1eb8\u1eb9\u1eba" +
"\u1ebb\u1ebc\u1ebd\u1ebe\u1ebf\u1ec0\u1ec1\u1ec2\u1ec3\u1ec4\u1ec5\u1ec6\u1ec7\u1ec8\u1ec9\u1eca\u1ecb\u1ecc\u1ecd\u1ece\u1ecf\u1ed0\u1ed1\u1ed2\u1ed3\u1ed4\u1ed5\u1ed6\u1ed7\u1ed8\u1ed9\u1eda\u1edb\u1edc\u1edd\u1ede\u1edf\u1ee0\u1ee1\u1ee2\u1ee3\u1ee4\u1ee5\u1ee6\u1ee7\u1ee8\u1ee9\u1eea\u1eeb\u1eec\u1eed\u1eee\u1eef\u1ef0\u1ef1\u1ef2\u1ef3\u1ef4\u1ef5\u1ef6\u1ef7\u1ef8\u1ef9\u1f70\u1f72\u1f74\u1f76\u1f78\u1f7a\u1f7c\u1fb1\u1fb9" +
"\u1fba\u1fc8\u1fca\u1fd1\u1fd9\u1fda\u1fe1\u1fe2\u1fe7\u1fe9\u1fea\u1ff8\u1ffa\u2071\u207f\u2090\u2091\u2092\u2093\u2094\u2095\u2096\u2097\u2098\u2099\u209a\u209b\u209c\u20ac\u20b1\u20b4\u20b9\u20bd\u20bf\u220f\u2211\u2422\u2c63\u2c65\u2c66\u2c7b\u2c7c\ua640\ua641\ua648\ua649\ua64a\ua64b\ua64c\ua64d\ua650\ua651\ua656\ua657\ua730\ua731\ua740\ua741\ua742\ua743\ua756\ua757\ua75e\ua75f\ua776\ua792\ua793\ua798\ua799\ua7a0\ua7a1\ua7a4" +
"\ua7a5\ua7a6\ua7a7\ua7a8\ua7a9\ua7ae\ua7af\ua7b8\ua7b9\ua7f4\ua7f9\ua7fa\uab3f\uab65\uab69abcdefghijklmnopqrstuvwyz\u03b3\u0292\u0260\u0266\u0279\u027b\u03b1\u03b5\u03b7\u03b9\u03bf\u03c5\u03b2\u03b8\u03ba\u03c0\u03c1\u03c3\u03c6\u0435\u0433\u044d\u0441\u043a\u043d\u043c\u0448\u0444\u043e\u0434\u04af\u0445" +
"\u0430\u0436\u0437\u0443\u043b\u0639\u0627\u062f\u0633\u062a\u0632\u0642\u0645\u0628\u0631\u0648\u0641\u0644\u0646\u062d\u092e\u0939\u0905\u0907\u0909\u090f\u0913\u0915\u0917\u091a\u091c\u091f\u0921\u0928\u0924\u0926\u092c\u0930\u0932\u0938\u092b\u092f\u090b\u090c\u0935\u093d\u0aae\u0ab9\u0a85\u0a87\u0a89\u0a8f\u0a93\u0a95\u0a97\u0a9a\u0a9c\u0a9f\u0aa1\u0aa8\u0aa4\u0aa6\u0aaa\u0aac\u0ab2\u0ab8\u0254\u0223\u03bb\u03c8\u0250\u1d02" +
"\u025b\u1d08\u1d09\u1d1d\u026f\u03b4\u03c7\u0252\u0255\u025c\u0265\u0271\u0270\u0282\u0283\u028a\u028c\u03c9\u01dd\uFFFF\ua775\u028d").toCharArray();
public static final char[] edges =
("\u0001\u0036\u0037\u0038\u0039\u003a\u003b\u003c\u003f\u0040\u0041\u0042\u0043\u0044\u0045\u0046\u0047\u0048\u0049\u004a\u004b\u004c\u004d\u004e\u004f\u0050\u0051\u0052\u0053\u0054\u0055\u0056\u0059\u005a\u005b\\\u005d\u005e\u005f\u0060\u0061\u0062\u0063\u0064\u0067\u0068\u006b\u006e\u006f\u0072\u0075\u0078\u007b\u007e\u0081\u0001\u0001\u0001\u0001\u0001\u0003\u0000\u0000\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001" +
@@ -166,125 +166,125 @@ public final class ComposeKeyData
"\u0518\u0519\u051a\u051b\u051c\u051d\u051e\u051f\u0521\u0522\u0523\u0524\u0525\u0526\u0527\u0528\u0529\u0515\u052a\u052b\u052c\u052d\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0002\u0000\u0001\u0001\u0001\u0001\u0001\u0001\u0002\u0000\u0001\u0002\u0000\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001" +
"\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0002\u0000\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0012\u0540\u0541\u0542\u0543\u0544\u0545\u0546\u0547\u0180\u0199\u0052\u0548\u005b\u0549\u032d\u02ff\u0300\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u002f\u0579\u057a\u057b\u057e\u057f\u0580\u0581\u0584\u0587\u058a\u058d\u0590\u0591" +
"\u0594\u0595\u0596\u0597\u0598\u0599\u059a\u0050\u0548\u02c5\u0054\u032b\u032e\u032f\u0115\u059b\u059c\u059d\u059e\u059f\u05a0\u05a1\u05a2\u05a3\u05a4\u05a5\u05a6\u05a7\u05a8\u00cf\u05a9\u05aa\u05ab\u0001\u0001\u0003\u0000\u0000\u0001\u0001\u0001\u0003\u0000\u0000\u0003\u0000\u0000\u0003\u0000\u0000\u0003\u0000\u0000\u0003\u0000\u0000\u0001\u0003\u0000\u0000\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001" +
"\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0149\u06f5\u0706\u0752\u07be\u07cd\u07d0\u0905\u0cbd\u0cde\u0ced\u0cf8\u0d44\u0d83\u0e0b\u0e4d\u0e53\u0e69\u0e6f\u0e77\u0e7a\u0e7f\u0e82\u0e85\u0e8f\u0ea6\u0ed3\u0f06\u0f25\u0f64\u0f7e\u0f82\u0f93\u0f9b\u0fb0\u0fbe\u0fd1\u0fd3\u0fe6\u0fe9\u0fec\u0ffe\u1000\u1010\u102d\u1035\u1039\u1044\u1053\u1063\u10b9\u10c0\u10c4\u10c6\u10d0\u10d7\u10da\u10ef\u10f1\u1185" +
"\u122c\u1315\u1328\u1352\u1389\u1393\u13a5\u13b3\u13c6\u13c8\u13d8\u13db\u13df\u13e7\u13eb\u13f2\u140d\u1417\u141c\u1428\u1435\u1450\u1474\u1476\u147a\u1482\u1486\u1489\u14a5\u151e\u1539\u1588\u164a\u1662\u1665\u1668\u166a\u166c\u166e\u1671\u1673\u1676\u1678\u167a\u167c\u167e\u1729\u172b\u172e\u1730\u1738\u1741\u1758\u1765\u1778\u177a\u177c\u1781\u1786\u1788\u1794\u179a\u179c\u17a5\u17ac\u17b0\u17b2\u17be\u17c9\u17cc\u17ce\u17d2" +
"\u17e8\u1808\u1823\u182c\u1839\u184b\u184d\u1851\u1855\u1868\u1870\u1875\u1877\u188e\u18ad\u18b1\u18b9\u18d3\u18f0\u194a\u194d\u194f\u1962\u1967\u196b\u196e\u1970\u1972\u1976\u197d\u1981\u1985\u19c8\u19d2\u19dc\u19e6\u1a1b\u1a24\u1a27\u1a39\u1a3f\u1a42\u1a44\u1a7e\u1a82\u1a85\u1a88\u1a9f\u1ade\u1afb\u1b17\u1b33\u1b36\u1b3f\u1b41\u1b5d\u1b7f\u1b89\u1b92\u1b98\u1baf\u1bb6\u1bbb\u1bc8\u1bcd\u1bd4\u1bd9\u1bdc\u1bdf\u1be2\u1be5\u1bec" +
"\u1bef\u1bf4\u1bf7\u1bfe\u1c01\u1c08\u1c0b\u1c0e\u1c11\u1c14\u1c17\u1c1a\u1c1d\u1c20\u1c23\u1c2e\u1c31\u1c34\u1c3d\u1c42\u1c4b\u1c50\u1c71\u1c73\u1c94\u1c96\u1cad\u1cb2\u1cb7\u1cbc\u1cbf\u1cc5\u1cc7\u1cca\u1ccd\u1cd0\u1cd3\u1cda\u1ce1\u1cea\u1cf1\u1d02\u1d04\u1d0f\u1d20\u1d23\u1d32\u1d39\u1d3c\u1d49\u1d52\u1d5b\u1d5d\u1d6c\u1d71\u1d9a\u1d9c\u1d9f\u1da3\u1da5\u1db8\u1dc3\u1dce\u1dd7\u1ddc\u1de5\u1de8\u1dea\u1dec\u1df1\u1df5\u1df9" +
"\u1dfd\u1e01\u1e04\u1e09\u1e0f\u1e12\u1e14\u1e17\u1e24\u1e27\u1e2a\u1e2f\u1e34\u1e36\u1e38\u1e3b\u1e3e\u1e41\u1e44\u1e48\u1e4a\u1e4d\u1e50\u1e53\u1e56\u1e59\u1e5c\u1e5f\u1e62\u1e65\u1e68\u1e6d\u1e71\u1e74\u1e77\u1e7a\u1e7d\u1e80\u1e86\u1e8a\u1e8d\u1e90\u1e93\u1e96\u1e99\u1e9c\u1e9f\u1ea3\u1ea5\u1ea7\u1ea9\u1ec0\u1eca\u0009\u06fe\u06ff\u0700\u0701\u0702\u0703\u0704\u0705\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u002f\u0735" +
"\u0736\u073d\u073e\u073f\u0740\u0741\u0742\u0743\u0744\u0745\u0746\u0747\u0748\u0749\u074a\u074b\u074c\u074d\u074e\u074f\u0750\u0751\u023e\u023f\u0240\u0241\u0242\u0243\u0244\u0245\u0246\u0247\u0248\u0249\u024a\u024b\u024c\u024d\u024e\u024f\u0250\u073b\u0252\u073c\u0253\u0001\u0005\u073b\u073c\u0252\u0253\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001" +
"\u0001\u0001\u0041\u0793\u0793\u0794\u0795\u0796\u0797\u0798\u0799\u079a\u079b\u079c\u079d\u079e\u079f\u07a0\u07a1\u057a\u057e\u057f\u0580\u0590\u0594\u0595\u0596\u0597\u0598\u07a6\u07aa\u0794\u07a9\u0548\u07a4\u07a5\u07ad\u07ae\u059b\u059c\u059e\u07af\u07b0\u07b1\u07b2\u07b3\u07b4\u07b5\u07b6\u07b7\u07b8\u07b9\u059f\u07ba\u05a0\u05a1\u05a2\u05a3\u05a4\u05a5\u05a6\u05a7\u07bb\u07bc\u05a8\u07bd\u00cf\u0001\u0001\u0001\u0001\u0001" +
"\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0003\u07a4\u07a5\u0001\u0001\u0003\u07a9\u0548\u0001\u0003\u07a4\u07a5\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0008\u07c6\u07c7\u07c8\u07c9\u07ca\u07cb\u07cc\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0002\u07cf\u0001\u007b\u084b\u0857\u0858\u0875\u0890\u0897\u0898\u089c\u089d\u089e\u089f\u08a0\u08a1\u08a2\u08a3" +
"\u08a6\u08a7\u08a8\u08a9\u08aa\u08ab\u08ac\u08ad\u08ae\u08af\u08b0\u08b1\u08b2\u08bc\u0037\u08c3\u0038\u0039\u003a\u003b\u003c\u003f\u0040\u0041\u0042\u0043\u0044\u0045\u0046\u0047\u0048\u0049\u004a\u08c7\u08ce\u08d3\u08b9\u08d7\u08d8\u08d6\u08ba\u0854\u08bb\u08cc\u089b\u0855\u004b\u004c\u004d\u004e\u004f\u0050\u0051\u0052\u0053\u0054\u08c6\u0055\u08c1\u0059\u08c2\u005a\u08cd\u005b\u0895\\\u0896\u005d\u08d9\u08da\u08db\u08dc" +
"\u08dd\u08de\u08df\u005e\u005f\u0060\u0061\u0062\u0063\u08e0\u08e1\u08e4\u08e5\u08e8\u08eb\u08ec\u08ef\u08f2\u08f5\u08f8\u08fb\u08fe\u0064\u0067\u0068\u006b\u006e\u006f\u0901\u0072\u0075\u0078\u007b\u007e\u0904\u0008\u0853\u0854\u0855\u0050\u0054\u0856\u059d\u0001\u0001\u0001\u0001\u0001\u000f\u0867\u0868\u0869\u086a\u086b\u086c\u086d\u086e\u086f\u0870\u0871\u0872\u0873\u0874\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001" +
"\u0001\u0001\u0001\u0001\u0001\u000e\u0883\u0884\u0885\u0886\u0887\u0888\u0889\u088a\u088b\u088c\u088d\u088e\u088f\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0005\u0895\u0896\\\u005d\u0001\u0001\u0001\u0003\u089b\u0053\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0003\u0000\u0000\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0007\u08b9\u08ba\u08bb\u004b\u004f" +
"\u0051\u0001\u0001\u0001\u0005\u08c1\u08c2\u0059\u005a\u0001\u0001\u0003\u08c6\u0055\u0001\u0005\u08cc\u08cd\u0052\u005b\u0001\u0001\u0005\u08c1\u08c2\u0059\u005a\u0003\u08d6\u004e\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0003\u0000\u0000\u0001\u0003\u0000\u0000\u0003\u0000\u0000\u0001\u0003\u0000\u0000\u0003\u0000\u0000\u0003\u0000\u0000\u0003\u0000\u0000\u0003\u0000\u0000\u0003\u0000\u0000\u0003\u0000" +
"\u0000\u0003\u0000\u0000\u0001\u00c1\u06ff\u09c6\u09c7\u09cc\u09cd\u09d0\u09fb\u0a26\u0a51\u0a7c\u0a83\u0a86\u0a89\u0a8c\u0a8f\u0a92\u0a95\u0a98\u0a9b\u0a9e\u0aa1\u0aa4\u0aa7\u0aaa\u0aad\u0ab0\u0ab3\u0ab6\u0ab9\u0abc\u0abf\u0ac2\u0ac5\u0ac8\u0acb\u0ace\u0ad1\u0ad4\u0ad7\u0ada\u0add\u0ae0\u0ae3\u0ae6\u0ae9\u0aec\u0aef\u0af2\u0af5\u0af8\u0afb\u0afe\u0b01\u0b04\u0b07\u0b0a\u0b0d\u0b10\u0b13\u0b16\u0b19\u0b1c\u0b1f\u0b22\u0b25\u0b28" +
"\u0b2b\u0b2c\u0b2d\u0b2e\u0b2f\u0b30\u0b31\u0b32\u0b33\u0b34\u0b35\u0b36\u0b37\u0b38\u0b39\u0b3a\u0b3b\u0b42\u0b49\u0b50\u0b57\u0b5e\u0b65\u0b6c\u0b73\u0b7a\u0b81\u0b88\u0b8f\u0b96\u0b9d\u0ba0\u0ba3\u0ba6\u0ba9\u0bac\u0baf\u0bb2\u0bb5\u0bb8\u0bbb\u0bbe\u0bc1\u0bc4\u0bc7\u0bca\u0bcd\u0bd0\u0bd3\u0bd6\u0bd9\u0bdc\u0bdf\u0be2\u0be5\u0be8\u0beb\u0bee\u0bf1\u0bf4\u0bf7\u0bfa\u0bfd\u0c00\u0c03\u0c06\u0c09\u0c0c\u0c0f\u0c12\u0c15\u0c18" +
"\u0c1b\u0c1e\u0c21\u0c24\u0c27\u0c2a\u0c2d\u0c30\u0c33\u0c36\u0c39\u0c3c\u0c3f\u0c42\u0c45\u0c48\u0c4b\u0c4e\u0c51\u0c54\u0c57\u0c5a\u0c5d\u0c60\u0c63\u0c66\u0c69\u0c6c\u0c6f\u0c72\u0c75\u0c78\u0c7b\u0c7e\u0c81\u0c84\u0c87\u0c8a\u0c8d\u0c90\u0c93\u0c96\u0c99\u0c9c\u0c9f\u0ca2\u0ca5\u0ca8\u0cab\u0cae\u0cb1\u0cb4\u0cb7\u0cba\u0001\u0002\u09c9\u0003\u0000\u0000\u0001\u0002\u09cf\u0001\u000c\u09dc\u09dd\u09e0\u09e3\u09e6\u09e9\u09ec" +
"\u09ef\u09f2\u09f5\u09f8\u0001\u0002\u09df\u0001\u0002\u09e2\u0001\u0002\u09e5\u0001\u0002\u09e8\u0001\u0002\u09eb\u0001\u0002\u09ee\u0001\u0002\u09f1\u0001\u0002\u09f4\u0001\u0002\u09f7\u0001\u0002\u09fa\u0001\u000c\u0a07\u0a08\u0a0b\u0a0e\u0a11\u0a14\u0a17\u0a1a\u0a1d\u0a20\u0a23\u0001\u0002\u0a0a\u0001\u0002\u0a0d\u0001\u0002\u0a10\u0001\u0002\u0a13\u0001\u0002\u0a16\u0001\u0002\u0a19\u0001\u0002\u0a1c\u0001\u0002\u0a1f\u0001" +
"\u0002\u0a22\u0001\u0002\u0a25\u0001\u000c\u0a32\u0a33\u0a36\u0a39\u0a3c\u0a3f\u0a42\u0a45\u0a48\u0a4b\u0a4e\u0001\u0002\u0a35\u0001\u0002\u0a38\u0001\u0002\u0a3b\u0001\u0002\u0a3e\u0001\u0002\u0a41\u0001\u0002\u0a44\u0001\u0002\u0a47\u0001\u0002\u0a4a\u0001\u0002\u0a4d\u0001\u0002\u0a50\u0001\u000c\u0a5d\u0a5e\u0a61\u0a64\u0a67\u0a6a\u0a6d\u0a70\u0a73\u0a76\u0a79\u0001\u0002\u0a60\u0001\u0002\u0a63\u0001\u0002\u0a66\u0001\u0002" +
"\u0a69\u0001\u0002\u0a6c\u0001\u0002\u0a6f\u0001\u0002\u0a72\u0001\u0002\u0a75\u0001\u0002\u0a78\u0001\u0002\u0a7b\u0001\u0003\u0a7f\u0a80\u0001\u0002\u0a82\u0001\u0002\u0a85\u0001\u0002\u0a88\u0001\u0002\u0a8b\u0001\u0002\u0a8e\u0001\u0002\u0a91\u0001\u0002\u0a94\u0001\u0002\u0a97\u0001\u0002\u0a9a\u0001\u0002\u0a9d\u0001\u0002\u0aa0\u0001\u0002\u0aa3\u0001\u0002\u0aa6\u0001\u0002\u0aa9\u0001\u0002\u0aac\u0001\u0002\u0aaf\u0001" +
"\u0002\u0ab2\u0001\u0002\u0ab5\u0001\u0002\u0ab8\u0001\u0002\u0abb\u0001\u0002\u0abe\u0001\u0002\u0ac1\u0001\u0002\u0ac4\u0001\u0002\u0ac7\u0001\u0002\u0aca\u0001\u0002\u0acd\u0001\u0002\u0ad0\u0001\u0002\u0ad3\u0001\u0002\u0ad6\u0001\u0002\u0ad9\u0001\u0002\u0adc\u0001\u0002\u0adf\u0001\u0002\u0ae2\u0001\u0002\u0ae5\u0001\u0002\u0ae8\u0001\u0002\u0aeb\u0001\u0002\u0aee\u0001\u0002\u0af1\u0001\u0002\u0af4\u0001\u0002\u0af7\u0001" +
"\u0002\u0afa\u0001\u0002\u0afd\u0001\u0002\u0b00\u0001\u0002\u0b03\u0001\u0002\u0b06\u0001\u0002\u0b09\u0001\u0002\u0b0c\u0001\u0002\u0b0f\u0001\u0002\u0b12\u0001\u0002\u0b15\u0001\u0002\u0b18\u0001\u0002\u0b1b\u0001\u0002\u0b1e\u0001\u0002\u0b21\u0001\u0002\u0b24\u0001\u0002\u0b27\u0001\u0002\u0b2a\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0003\u0b3e\u0b3f\u0001\u0002" +
"\u0b41\u0001\u0003\u0b45\u0b46\u0001\u0002\u0b48\u0001\u0003\u0b4c\u0b4d\u0001\u0002\u0b4f\u0001\u0003\u0b53\u0b54\u0001\u0002\u0b56\u0001\u0003\u0b5a\u0b5b\u0001\u0002\u0b5d\u0001\u0003\u0b61\u0b62\u0001\u0002\u0b64\u0001\u0003\u0b68\u0b69\u0001\u0002\u0b6b\u0001\u0003\u0b6f\u0b70\u0001\u0002\u0b72\u0001\u0003\u0b76\u0b77\u0001\u0002\u0b79\u0001\u0003\u0b7d\u0b7e\u0001\u0002\u0b80\u0001\u0003\u0b84\u0b85\u0001\u0002\u0b87\u0001" +
"\u0003\u0b8b\u0b8c\u0001\u0002\u0b8e\u0001\u0003\u0b92\u0b93\u0001\u0002\u0b95\u0001\u0003\u0b99\u0b9a\u0001\u0002\u0b9c\u0001\u0002\u0b9f\u0001\u0002\u0ba2\u0001\u0002\u0ba5\u0001\u0002\u0ba8\u0001\u0002\u0bab\u0001\u0002\u0bae\u0001\u0002\u0bb1\u0001\u0002\u0bb4\u0001\u0002\u0bb7\u0001\u0002\u0bba\u0001\u0002\u0bbd\u0001\u0002\u0bc0\u0001\u0002\u0bc3\u0001\u0002\u0bc6\u0001\u0002\u0bc9\u0001\u0002\u0bcc\u0001\u0002\u0bcf\u0001" +
"\u0002\u0bd2\u0001\u0002\u0bd5\u0001\u0002\u0bd8\u0001\u0002\u0bdb\u0001\u0002\u0bde\u0001\u0002\u0be1\u0001\u0002\u0be4\u0001\u0002\u0be7\u0001\u0002\u0bea\u0001\u0002\u0bed\u0001\u0002\u0bf0\u0001\u0002\u0bf3\u0001\u0002\u0bf6\u0001\u0002\u0bf9\u0001\u0002\u0bfc\u0001\u0002\u0bff\u0001\u0002\u0c02\u0001\u0002\u0c05\u0001\u0002\u0c08\u0001\u0002\u0c0b\u0001\u0002\u0c0e\u0001\u0002\u0c11\u0001\u0002\u0c14\u0001\u0002\u0c17\u0001" +
"\u0002\u0c1a\u0001\u0002\u0c1d\u0001\u0002\u0c20\u0001\u0002\u0c23\u0001\u0002\u0c26\u0001\u0002\u0c29\u0001\u0002\u0c2c\u0001\u0002\u0c2f\u0001\u0002\u0c32\u0001\u0002\u0c35\u0001\u0002\u0c38\u0001\u0002\u0c3b\u0001\u0002\u0c3e\u0001\u0002\u0c41\u0001\u0002\u0c44\u0001\u0002\u0c47\u0001\u0002\u0c4a\u0001\u0002\u0c4d\u0001\u0002\u0c50\u0001\u0002\u0c53\u0001\u0002\u0c56\u0001\u0002\u0c59\u0001\u0002\u0c5c\u0001\u0002\u0c5f\u0001" +
"\u0002\u0c62\u0001\u0002\u0c65\u0001\u0002\u0c68\u0001\u0002\u0c6b\u0001\u0002\u0c6e\u0001\u0002\u0c71\u0001\u0002\u0c74\u0001\u0002\u0c77\u0001\u0002\u0c7a\u0001\u0002\u0c7d\u0001\u0002\u0c80\u0001\u0002\u0c83\u0001\u0002\u0c86\u0001\u0002\u0c89\u0001\u0002\u0c8c\u0001\u0002\u0c8f\u0001\u0002\u0c92\u0001\u0002\u0c95\u0001\u0002\u0c98\u0001\u0002\u0c9b\u0001\u0002\u0c9e\u0001\u0002\u0ca1\u0001\u0002\u0ca4\u0001\u0002\u0ca7\u0001" +
"\u0002\u0caa\u0001\u0002\u0cad\u0001\u0002\u0cb0\u0001\u0002\u0cb3\u0001\u0002\u0cb6\u0001\u0002\u0cb9\u0001\u0002\u0cbc\u0001\u0011\u0cce\u0ccf\u0cd0\u0cd1\u0cd2\u0cd3\u0cd4\u0cd5\u0cd6\u0cd7\u0cd8\u0cd9\u0cda\u0cdb\u0cdc\u0cdd\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0009\u0ce7\u0351\u0cea\u0ceb\u0362\u0363\u0579\u0cec\u0003\u08d7\u004c\u0001\u0001\u0001\u0007\u0cf4\u0cf5" +
"\u0cf6\u0cf7\u02fd\u02fe\u0001\u0001\u0001\u0001\u0030\u0700\u0795\u0897\u0700\u0d28\u0d29\u0d2a\u0d2b\u0d2c\u0d2d\u0d2e\u0d2f\u0d30\u0d31\u0d32\u0d33\u0d34\u0d35\u0d36\u0d37\u033f\u013e\u013f\u0340\u0141\u0142\u0341\u0143\u0144\u0145\u0342\u0146\u0147\u0148\u0343\u0d38\u0d39\u0d3a\u0d3b\u0d3c\u0d3d\u0d3e\u0d3f\u0d40\u0d41\u0d42\u0d43\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001" +
"\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0020\u0701\u09cc\u0ccf\u0cf5\u0d28\u0d64\u0d6b\u0d74\u0d75\u0095\u0d76\u0d77\u0d78\u0d79\u0d7a\u0d7b\u0d7c\u0d7d\u0d7e\u0705\u0d7f\u031e\u00b7\u031f\u0321\u0d7b\u0325\u0329\u0d80\u0d81\u0d82\u0004\u0d68\u0d69\u0d6a\u0001\u0001\u0001\u0003\u0d6e\u0d71\u0003\u0000\u0000\u0003\u0000\u0000\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001" +
"\u0001\u0001\u0001\u0050\u0dd3\u0dd4\u0dd8\u0ddc\u0ddd\u0dde\u0ddf\u0de0\u0de1\u0de2\u0de3\u0de4\u0de5\u0de6\u0de7\u0de8\u0de9\u0dea\u0deb\u0dec\u0ded\u0dee\u0def\u0df0\u0df1\u0df2\u0df3\u0df4\u0df5\u0ddc\u01ed\u01ee\u01ef\u01f0\u01f1\u01f2\u01f3\u01f4\u01f5\u01fd\u01fe\u01ff\u0200\u0204\u0205\u0206\u020d\u020e\u020f\u0210\u0df6\u0ddb\u0081\u0df9\u012f\u0214\u07af\u0dfa\u0dfb\u0dfc\u0dfd\u0dfe\u0dff\u0d42\u0e00\u0e01\u0e02\u0e03" +
"\u0e04\u0e05\u0e06\u0e07\u0d43\u0e08\u0e09\u07bb\u0dd7\u0215\u0e0a\u0001\u0003\u0dd7\u0215\u0001\u0003\u0ddb\u0081\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0003\u0ddb\u0081\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0028\u0d74\u0e33\u0e33\u0e34" +
"\u0e35\u0e36\u0d77\u0e37\u0e38\u0e39\u0e3a\u0e3b\u0e3c\u0e3d\u0e3e\u00b4\u0e3f\u00b7\u00ba\u00bb\u00bc\u0380\u0e40\u0383\u00c6\u0e41\u0e42\u00c9\u0e43\u0e44\u0e45\u0e46\u0e47\u0e48\u00ce\u0e49\u0e4a\u0e4b\u0e4c\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0004\u0351\u0e51\u0e52\u0001\u0001\u000b\u0e5e\u0e61\u0e62\u0e63" +
"\u0e64\u0e65\u0e66\u0e67\u0e68\u04e3\u0002\u0e60\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0004\u0e6d\u0e6e\u04e4\u0001\u0001\u0005\u0e74\u0e75\u0e76\u04e5\u0001\u0001\u0001\u0002\u0e79\u0001\u0003\u0e7d\u0e7e\u0001\u0001\u0002\u0e81\u0001\u0002\u0e84\u0001\u0006\u0e8b\u0e8c\u0d75\u0e8d\u0e8e\u0001\u0001\u0001\u0001\u0011\u0ea0\u0d29\u0d2c\u0d2f\u0d33\u0ea1\u0ea2\u0d37\u0ea3\u033f\u0340\u0341\u0342\u0ea4\u0ea5\u0343" +
"\u0001\u0001\u0001\u0001\u0001\u0001\u001e\u0703\u0796\u089c\u0093\u0ec4\u0ec5\u0ec6\u0ec7\u0ec8\u0ec9\u0eca\u0ecb\u0ecc\u0ecd\u0ece\u0ecf\u0ed0\u0ed1\u0ec7\u0105\u0106\u0107\u010d\u010e\u0110\u0111\u0112\u0114\u0ed2\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0021\u0e34\u0ef4\u0ef5\u0ef6\u0ef6\u0ef7\u0ef8\u0ef9\u0efa\u0efb\u0efc\u0efd\u0efe\u0eff\u0f00\u0f01\u0ef6\u0f02\u0ef6\u026b" +
"\u0efa\u0efb\u026c\u0f03\u0eff\u0ef6\u0efa\u0ef6\u0f04\u0efa\u0270\u0f05\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0015\u0704\u0797\u089d\u0f1b\u0ec8\u0f1c\u0f1d\u0f1e\u0f1f\u0f20\u0f21\u0f22\u0f1c\u0170\u0172\u0175\u0177\u0178\u0f23\u0f24\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0020\u0f45\u0f46\u0f4d\u0f4e\u0f4f\u0f50\u0f51\u0f52\u0f53\u0f54" +
"\u0f55\u02e7\u0f5f\u02e8\u02e9\u02ea\u02eb\u02ec\u0f5c\u0f5d\u0f5e\u0196\u0198\u0185\u0f62\u02ed\u0f4b\u02ee\u0f4c\u02ef\u0f63\u0001\u0005\u0f4b\u0f4c\u02ee\u02ef\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0007\u0f5c\u0f5d\u0f5e\u0196\u0198\u0185\u0001\u0001\u0001\u0003\u0f62\u02ed\u0001\u0001\u0015\u0798\u089e\u0f79\u0cea\u0d29\u0d76\u0d29\u0f1e\u0cea\u0f7a\u0f7b\u0f1e\u0d76\u0f7c\u0cea\u0f7a\u0f7b\u0f7d\u0798" +
"\u089e\u0001\u0001\u0001\u0001\u0001\u0003\u0de3\u0f81\u0001\u000c\u089f\u0d2a\u0de4\u0e36\u0ec9\u0ef6\u0f8e\u0f8f\u0f90\u0f91\u0f92\u0001\u0001\u0001\u0001\u0001\u0007\u0d2b\u0d77\u0de5\u0eca\u0f9a\u0f9a\u0001\u0012\u0799\u08a0\u0d2c\u0d78\u0de6\u0d2c\u0ecb\u0ef6\u0f1f\u0fad\u0f1f\u0d78\u0fae\u0fad\u0faf\u0799\u08a0\u0001\u0001\u0001\u0006\u0de7\u0fb6\u0fb9\u0fbb\u0fbd\u0003\u0000\u0000\u0002\u0000\u0002\u0000\u0001\n\u0fc8" +
"\u0d2d\u0de8\u0fc9\u0fc8\u0fca\u0fc8\u0fd0\u0fc8\u0001\u0001\u0002\u0fcc\u0004\u0000\u0000\u0000\u0001\u0002\u0d2e\u0010\u079b\u08a2\u0d2f\u0d79\u0dea\u0d2f\u0f20\u0fe3\u0f20\u0d79\u0fe4\u0fe3\u0fe5\u079b\u08a2\u0001\u0001\u0001\u0003\u08a3\u08a3\u0003\u0d30\u0d7a\n\u08a7\u0d31\u0d7b\u0e3a\u0ecc\u0ef7\u0ff6\u0ffd\u0e3e\u0002\u0ff8\u0002\u0ffa\u0003\u0000\u0000\u0001\u0002\u0deb\u000c\u08a9\u0d32\u0ecd\u0ef8\u100c\u100d\u100e" +
"\u100c\u100d\u100e\u100f\u0001\u0001\u0001\u0001\u0016\u079c\u08aa\u0d33\u0d7c\u0e3b\u0d33\u0f21\u0a91\u0f90\u1026\u1027\u1028\u1029\u102a\u0f21\u0d7c\u102b\u1026\u102c\u079c\u08aa\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0006\u1033\u0dee\u0efa\u1033\u1034\u0001\u0001\u0003\u1038\u1038\u0001\u0009\u08ac\u0d34\u0ece\u0efb\u1027\u1042\u1042\u1043\u0001\u0001\u000c\u1028\u08ad\u0d35\u0df0\u0ea1\u0ecf\u1050\u1028\u1051\u1051\u1052" +
"\u0001\u0001\u0001\u000c\u0d36\u0e3c\u0df1\u0e3c\u0ea2\u0ed0\u0efc\u105f\u1060\u105f\u1061\u0001\u0001\u0002\u0000\u002d\u1090\u1096\u079d\u08ae\u0ceb\u0d37\u0d7d\u0d37\u0f22\u0f79\u109a\u0fc8\u109b\u109c\u109d\u0f22\u0d7d\u109e\u109f\u10a0\u10a1\u10a2\u10a3\u10a4\u10a5\u079d\u08ae\u10a6\u10a9\u10aa\u10ab\u10ac\u10ad\u10ae\u10af\u10b0\u10b1\u10b2\u10b3\u10b4\u10b5\u10b6\u10b7\u10b8\u0002\u1092\u0003\u1095\u0149\u0001\u0003\u1099" +
"\u0251\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0003\u1095\u0149\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0006\u0e3e\u0ec9\u0ecf\u0ed1\u10bf\u0001\u0003\u0efe\u10c3\u0001\u0002\u1029\u0008\u07a0\u08b0\u0eff\u10ce\u10cf\u07a0\u08b0\u0001\u0001\u0006\u08b1\u0df5\u0ed1\u10d6\u10d6\u0001\u0002\u10d9\u0001\u0008\u0d7e\u0f54\u10e2\u10e5\u10ea" +
"\u10ed\u10ee\u0003\u0000\u0000\u0002\u10e7\u0003\u0000\u0000\u0003\u0000\u0000\u0001\u0001\u0002\u10d9\u004e\u113f\u04de\u04df\u04e0\u04e1\u0ddc\u0e3e\u04e2\u04e3\u04e4\u04e5\u04e6\u04e7\u04e8\u04e9\u04ea\u04eb\u04ec\u0f1e\u1149\u0f1f\u114a\u114b\u0f20\u114c\u0f21\u114d\u0f22\u10c3\u10ce\u114e\u114f\u0170\u0171\u0172\u0173\u0174\u0175\u0176\u0177\u0184\u0178\u0179\u017d\u017e\u0097\u1162\u1165\u1168\u116b\u116e\u1171\u0186\u0189" +
"\u018c\u018f\u1174\u0192\u1147\u0197\u1148\u019a\u04e1\u1177\u1178\u1179\u117a\u117b\u117c\u117d\u117e\u117f\u1180\u1181\u1182\u1183\u1184\u0007\u1146\u1147\u1148\u0195\u0197\u019a\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0013\u0352\u035a\u04f2\u04f3\u04f5\u0354\u0353\u0357\u0358\u04fd\u04fe\u04ff\u050e\u0510\u0516\u0517\u0518\u0523\u0003\u0000\u0000\u0003\u0000\u0000\u0003\u0000\u0000\u0003\u0000\u0000\u0003\u0000" +
"\u0000\u0003\u0000\u0000\u0003\u0000\u0000\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0058\u0705\u11dd\u11e4\u11ee\u0463\u0464\u0465\u0466\u11ef\u0467\u0468\u0469\u046a\u046b\u046c\u046d\u046e\u046f\u0470\u11f8\u0ec7\u0471\u0f1c\u0d76\u0d78\u11fc\u0d79\u0d7c\u0d7d\u11fd\u0705\u0705\u031e\u031f\u0320\u0321\u0325\u0329\u032a\u11fe\u11eb\u1202\u1201\u11ec\u11ed\u032b\u032c\u032d\u032e\u032f" +
"\u11f6\u0212\u1203\u1204\u1205\u0331\u0332\u0333\u1206\u1209\u120c\u120d\u1210\u1213\u1214\u1217\u0334\u121a\u121d\u0335\u11e2\u0336\u11e3\u0337\u1220\u1221\u0466\u1222\u1223\u1224\u1225\u1226\u1227\u1228\u1229\u122a\u122b\u0005\u11e2\u11e3\u0336\u0337\u0001\u0001\u0007\u11eb\u11ec\u11ed\u032b\u032e\u032f\u0001\u0001\u0001\u0001\u0007\u11f6\u0d6e\u11f7\u0212\u0d71\u0213\u0001\u0001\u0003\u11fb\u0330\u0001\u0001\u0001\u0003\u1201" +
"\u032d\u0001\u0001\u0001\u0001\u0001\u0003\u0000\u0000\u0003\u0000\u0000\u0001\u0003\u0000\u0000\u0003\u0000\u0000\u0001\u0003\u0000\u0000\u0003\u0000\u0000\u0003\u0000\u0000\u0003\u0000\u0000\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0046\u1272\u1279\u1296\u12b1\u0f7c\u0fae\u0fe4\u12b8\u102b\u109e\u12b9\u12ba\u12bb\u12c5\u12cc\u02b7\u12eb\u02b8\u02b9\u02ba\u02bb\u02bf\u02c0\u02c1\u12ef\u12c2\u12c3" +
"\u12c4\u1277\u017f\u0181\u0182\u02c5\u12ee\u02c6\u12ca\u02c7\u12cb\u02c8\u12b6\u02c9\u12b7\u02ca\u12f4\u12f5\u12f6\u12f7\u12f8\u12f9\u12fa\u02d1\u02d2\u02d3\u02d4\u02d5\u02d6\u02d7\u12fb\u12fe\u12ff\u1300\u1303\u1306\u1309\u02d8\u02d9\u130c\u130f\u1312\u0005\u1277\u02c5\u1278\u05a9\u0001\u0001\u000f\u1288\u1289\u128a\u128b\u128c\u128d\u128e\u128f\u1290\u1291\u1292\u1293\u1294\u1295\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001" +
"\u0001\u0001\u0001\u0001\u0001\u0001\u000e\u12a4\u12a5\u12a6\u12a7\u12a8\u12a9\u12aa\u12ab\u12ac\u12ad\u12ae\u12af\u12b0\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0005\u12b6\u12b7\u02c9\u02ca\u0001\u0001\u0001\u0001\u0001\u0007\u12c2\u12c3\u12c4\u017f\u0181\u0182\u0001\u0001\u0001\u0005\u12ca\u12cb\u02c7\u02c8\u0001\u0001\r\u12d9\u12dc\u12df\u12e2\u12e5\u12e8\u0285\u0288\u028b\u028e\u0291" +
"\u0294\u0003\u0000\u0000\u0003\u0000\u0000\u0003\u0000\u0000\u0003\u0000\u0000\u0003\u0000\u0000\u0003\u0000\u0000\u0003\u12ee\u02c6\u0001\u0005\u12ca\u12cb\u02c7\u02c8\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0003\u0000\u0000\u0001\u0001\u0003\u0000\u0000\u0003\u0000\u0000\u0003\u0000\u0000\u0003\u0000\u0000\u0003\u0000\u0000\u0003\u0000\u0000\u0003\u0000\u0000\u0012\u057a\u0037\u109f\u0362\u033f\u031e\u033f\u0170\u0f7a\u0170" +
"\u031e\u02b7\u0362\u1327\u0540\u057a\u0037\u0001\u0021\u1349\u134c\u01ee\u0f79\u109a\u0fc8\u109b\u109c\u109d\u109f\u10a0\u10a1\u10a2\u10a3\u10a4\u134f\u10a9\u10aa\u10ab\u10ac\u10ad\u10ae\u10af\u10b0\u10b1\u10b2\u10b3\u10b4\u10b5\u10b6\u10b7\u10b8\u0003\u1099\u0251\u0003\u1095\u0149\u0003\u1095\u0149\u002c\u137e\u0038\u013e\u01ef\u0e3f\u0105\u0ef6\u1382\u0ec9\u0eca\u0ecb\u1383\u1384\u1385\u1386\u0ecc\u0ecd\u1387\u0ece\u0ecf\u0ed0" +
"\u1388\u0ed1\u0104\u0105\u0106\u0107\u0108\u0109\u010a\u010b\u010c\u010d\u010e\u010f\u0110\u0111\u0112\u0113\u0114\u0e3f\u1381\u0115\u0003\u1381\u0115\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0008\u013f\u00b7\u01f0\u0106\u0f02\u1391\u1392\u0001\u0001\u0011\u057e\u0039\u0340\u031f\u01f1\u0340\u0107\u0ef6\u0172\u0172\u031f\u02b8\u13a4\u0541\u057e\u0039\u0001\u0007\u01f2\u13ac\u13ad\u13af\u13b1\u13ac\u0001\u0002\u0000\u0002" +
"\u0000\u0002\u0000\n\u10a1\u0141\u01f3\u10a1\u13bd\u0fc9\u10a1\u13c3\u10a1\u0002\u13bf\u0004\u0000\u0000\u0000\u0003\u0000\u0000\u0002\u0142\u000f\u0580\u003b\u0341\u0321\u01f5\u0341\u0175\u0175\u0321\u02b9\u13d7\u0542\u0580\u003b\u0001\u0003\u003c\u003c\u0003\u0143\u13de\u0001\u0008\u0040\u0144\u0d7b\u0380\u010d\u0ffd\u0e3e\u0004\u01fd\u0e40\u0e41\u0006\u0042\u0145\u010e\u13f1\u0543\u0001\u001a\u0590\u0043\u0342\u0325\u0383" +
"\u0342\u0177\u0cea\u0ceb\u0177\u0325\u02bb\u0362\u0f90\u140c\u0351\u1027\u1028\u0363\u0364\u1029\u0365\u0544\u0590\u0043\u0001\u0005\u1033\u0200\u0efa\u1412\u0002\u1414\u0003\u0000\u0000\u0005\u0045\u0146\u0110\u0efb\u000b\u1028\u0046\u0147\u0205\u0ea4\u0111\u1050\u1028\u1427\u0147\u0001\n\u0148\u00c6\u0206\u00c6\u0ea5\u0112\u1432\u1060\u1433\u0001\u0002\u0000\u001b\u0595\u0047\u0363\u0343\u0329\u0e41\u0343\u0178\u0f79\u109a" +
"\u0fc8\u109b\u109c\u109d\u0178\u0329\u02bf\u109f\u10a0\u10a1\u10a2\u10a3\u10a4\u0545\u0595\u0047\u0024\u0e42\u1382\u0ec9\u0eca\u0ecb\u1383\u1384\u1385\u1386\u0ecd\u1387\u0ece\u0ecf\u0ed0\u1388\u0ed1\u0104\u0105\u0106\u0107\u0108\u0109\u010a\u010b\u010c\u0e3e\u010e\u010f\u0110\u0111\u0112\u0113\u0114\u0091\u0546\u0002\u0179\u0003\u1029\u1479\u0001\u0008\u0598\u0049\u0eff\u017d\u0547\u0598\u0049\u0004\u004a\u0210\u0114\u0002\u1488" +
"\u0001\u0012\u149b\u149c\u0f81\u0f92\u0fd0\u1052\u0097\u0e3f\u0091\u149d\u149e\u149f\u14a0\u14a1\u14a2\u14a3\u14a4\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u002f\u14d4\u14d8\u14ed\u1500\u0e52\u0f7d\u0faf\u0fe5\u100f\u102c\u10a5\u10bf\u10cf\u1507\u0540\u1511\u0541\u0542\u0543\u0544\u0545\u0546\u0547\u149d\u1515\u0599\u150e\u150f\u1510\u0180\u0199\u0183\u1514\u0549\u1505\u02ff\u1506\u0300\u1516\u1517\u1518\u1519" +
"\u151a\u151b\u151c\u151d\u0003\u14d7\u05aa\u0001\u000b\u14e3\u14e4\u14e5\u14e6\u14e7\u14e8\u14e9\u14ea\u14eb\u14ec\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\n\u14f7\u14f8\u14f9\u14fa\u14fb\u14fc\u14fd\u14fe\u14ff\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0005\u1505\u1506\u02ff\u0300\u0001\u0001\u0007\u150e\u150f\u1510\u0180\u0199\u0183\u0001\u0001\u0001\u0003\u1514\u0549\u0001\u0001\u0001\u0001" +
"\u0001\u0001\u0001\u0001\u0001\u0001\u0017\u0853\u0579\u0f23\u0798\u0799\u079b\u079c\u079d\u07a0\u1535\u057a\u057e\u0580\u0590\u0595\u0598\u1536\u0853\u05ab\u059a\u1537\u1538\u0001\u0001\u0001\u0001\u0037\u1570\u1575\u157c\u1581\u0d76\u0d78\u11fc\u0d79\u0d7c\u0d7d\u11fd\u031e\u031f\u0320\u0321\u0325\u0329\u032a\u1584\u11eb\u1202\u1201\u11ec\u11ed\u032b\u032c\u032d\u032e\u032f\u11f6\u0212\u1203\u1204\u1205\u0331\u0332\u0333\u1206" +
"\u1209\u120c\u120d\u1210\u1213\u1214\u1217\u0334\u121a\u121d\u0335\u11e2\u0336\u11e3\u0337\u1587\u0005\u11e2\u11e3\u0336\u0337\u0007\u11eb\u11ec\u11ed\u032b\u032e\u032f\u0005\u11f6\u11f7\u0212\u0213\u0003\u11fb\u0330\u0003\u1201\u032d\u0001\u0077\u15ff\u1606\u1615\u1623\u1628\u162b\u089e\u089f\u08a0\u08a1\u08a2\u08a3\u08a6\u08a7\u08a8\u08a9\u08aa\u08ab\u08ac\u08ad\u08ae\u08af\u08b0\u08b1\u162e\u1635\u0037\u163a\u0038\u0039\u003a" +
"\u003b\u003c\u003f\u0040\u0041\u0042\u0043\u0044\u0045\u0046\u0047\u0048\u0049\u004a\u163d\u1642\u1647\u08b9\u08d7\u08d8\u08d6\u08ba\u0854\u08bb\u08cc\u089b\u0855\u004b\u004c\u004d\u004e\u004f\u0050\u0051\u0052\u0053\u0054\u08c6\u0055\u08c1\u0059\u08c2\u005a\u08cd\u005b\u0895\\\u0896\u005d\u08d9\u08da\u08db\u08dc\u08dd\u08de\u08df\u005e\u005f\u0060\u0061\u0062\u0063\u08e0\u08e1\u08e4\u08e5\u08e8\u08eb\u08ec\u08ef\u08f2\u08f5" +
"\u08f8\u08fb\u08fe\u0064\u0067\u0068\u006b\u006e\u006f\u0901\u0072\u0075\u0078\u007b\u007e\u0007\u0854\u0855\u0050\u0054\u0856\u059d\u000f\u0867\u0868\u0869\u086a\u086b\u086c\u086d\u086e\u086f\u0870\u0871\u0872\u0873\u0874\u000e\u0883\u0884\u0885\u0886\u0887\u0888\u0889\u088a\u088b\u088c\u088d\u088e\u088f\u0005\u0895\u0896\\\u005d\u0003\u08d6\u004e\u0003\u089b\u0053\u0007\u08b9\u08ba\u08bb\u004b\u004f\u0051\u0005\u08c1\u08c2" +
"\u0059\u005a\u0003\u08c6\u0055\u0005\u08cc\u08cd\u0052\u005b\u0005\u08c1\u08c2\u0059\u005a\u0003\u08d6\u004e\u0017\u0d2a\u0d2b\u1661\u0d2d\u0d2e\u0d30\u0d31\u0d32\u0d34\u0d35\u0d36\u013e\u013f\u0140\u0141\u0142\u0143\u0144\u0145\u0146\u0147\u0148\u0001\u0002\u1664\u0001\u0003\u0fc8\u10a1\u0002\u08d9\u0002\u08da\u0002\u08db\u0003\u07ad\u08dc\u0002\u08dd\u0003\u07ae\u08de\u0002\u08df\u0002\u005e\u0002\u005f\u0002\u0060\u000e\u059b" +
"\u168c\u16af\u16bc\u16c9\u16ec\u170f\u1723\u1724\u1725\u1726\u1727\u1728\u0006\u1692\u169f\u16ac\u16ad\u16ae\u0007\u1699\u169a\u169b\u169c\u169d\u169e\u0001\u0001\u0001\u0001\u0001\u0001\u0007\u16a6\u16a7\u16a8\u16a9\u16aa\u16ab\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0007\u16b6\u16b7\u16b8\u16b9\u16ba\u16bb\u0001\u0001\u0001\u0001\u0001\u0001\u0007\u16c3\u16c4\u16c5\u16c6\u16c7\u16c8\u0001\u0001\u0001\u0001\u0001" +
"\u0001\u0006\u16cf\u16dc\u16e9\u16ea\u16eb\u0007\u16d6\u16d7\u16d8\u16d9\u16da\u16db\u0001\u0001\u0001\u0001\u0001\u0001\u0007\u16e3\u16e4\u16e5\u16e6\u16e7\u16e8\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0006\u16f2\u16ff\u170c\u170d\u170e\u0007\u16f9\u16fa\u16fb\u16fc\u16fd\u16fe\u0001\u0001\u0001\u0001\u0001\u0001\u0007\u1706\u1707\u1708\u1709\u170a\u170b\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0006" +
"\u1715\u171c\u16ac\u16ad\u16ae\u0007\u1699\u169a\u169b\u169c\u169d\u169e\u0007\u16a6\u16a7\u16a8\u16a9\u16aa\u16ab\u0001\u0001\u0001\u0001\u0001\u0001\u0002\u0062\u0003\u059c\u0063\u0002\u08e0\u0007\u07af\u07af\u120c\u1737\u1737\u120c\u0001\u0005\u173d\u173d\u173f\u173f\u0002\u0000\u0002\u0000\u000f\u1750\u1751\u1752\u1753\u1755\u1750\u1751\u1752\u1753\u1755\u1756\u1756\u1752\u1752\u0001\u0001\u0001\u0002\u0000\u0001\u0002\u0000" +
"\u000b\u0d38\u0dfa\u0e44\u0e44\u1763\u1764\u0e44\u1763\u1764\u0e44\u0001\u0001\r\u1772\u1772\u1774\u1775\u1772\u1772\u1774\u1775\u1772\u1772\u1777\u1777\u0002\u0000\u0001\u0002\u0000\u0001\u0002\u0ef6\u0002\u0dfb\u0004\u0efa\u1780\u1780\u0001\u0005\u120c\u1737\u120c\u1737\u0002\u0dfc\u000b\u0d39\u0dfd\u1763\u1793\u1764\u1793\u1763\u1793\u1764\u1793\u0001\u0005\u0d3a\u0dfe\u1799\u1799\u0001\u0002\u0dff\u0007\u0d3b\u17a3\u100e" +
"\u17a4\u100e\u17a4\u0001\u0001\u0005\u17aa\u17ab\u17aa\u17ab\u0001\u0001\u0003\u17af\u17af\u0001\u0002\u0ef6\u0009\u17bb\u17bb\u17bc\u17bd\u17bb\u17bc\u17bd\u17bb\u0001\u0001\u0001\u000b\u1737\u10b3\u1737\u10b3\u1213\u1737\u10b3\u1213\u1737\u10b3\u0003\u0d3c\u0e00\u0002\u0e01\u0003\u17d1\u17d1\u0001\u0011\u07af\u173d\u17e3\u17e4\u17e5\u07b1\u173f\u17e6\u173d\u17e3\u17e4\u17e5\u07b1\u173f\u17e6\u07af\u0001\u0001\u0001\u0002\u0000" +
"\u0009\u17f1\u17f2\u17f3\u1802\u1803\u1805\u1806\u1802\u0001\u0001\u000f\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0002\u0000\u0001\u0002\u0000\u0002\u180a\u0019\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0007\u0d3d\u0e02\u0e46\u182a\u182b\u0e46\u0001\u0001\u0007\u1833\u1835\u1836" +
"\u1833\u1833\u1838\u0002\u0000\u0001\u0002\u0000\u0001\u0002\u183b\u0010\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0002\u0e03\u0003\u0efa\u1850\u0001\u0003\u0334\u1854\u0001\u0003\u0e04\u1858\u0010\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0007\u0d3e\u0e05\u182a\u186f\u182b\u186f\u0001\u0004\u0d3f\u0e06\u1874\u0001\u0002\u0e07\u0005" +
"\u0d40\u187c\u187d\u188d\u0001\u0010\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0004\u1892\u1893\u1894\u0001\u0001\u0019\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0003\u1028\u18b0\u0001\u0005\u18b6\u18b7\u18b8\u18b6\u0001\u0001\u0001\u0007\u1854\u10b8\u0335\u18c0\u1854\u10b8" +
"\u0013\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0004\u0d41\u0e08\u18d7\u0019\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u000f\u0e09\u17f3\u180a\u183b\u1858\u187d\u1894\u18c0\u18d7\u18ff\u1911\u192a\u1858\u193a\u0012\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000" +
"\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0019\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0010\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0010\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0002\u194c\u0001\u0002\u1911\n" +
"\u1959\u195b\u195c\u195d\u07ba\u192a\u195e\u1960\u07bb\u0002\u0000\u0001\u0001\u0001\u0002\u0000\u0002\u0000\u0005\u07bb\u07bb\u1854\u0334\u0004\u1959\u1858\u195e\u0003\u17aa\u17aa\u0002\u1892\u0002\u193a\u0002\u1974\u0002\u0000\u0003\u1979\u197b\u0002\u0000\u0002\u0000\u0002\u197f\u0002\u0000\u0002\u1983\u0002\u0000\u0017\u199c\u199e\u19a0\u19a2\u19a4\u19a6\u19a8\u19aa\u19ac\u19ae\u19b0\u19b2\u19b4\u19b6\u19b8\u19ba\u19bc\u19be" +
"\u19c0\u19c2\u19c4\u19c6\u0002\u0000\u0002\u0000\u0002\u0000\u0002\u0000\u0002\u0000\u0002\u0000\u0002\u0000\u0002\u0000\u0002\u0000\u0002\u0000\u0002\u0000\u0002\u0000\u0002\u0000\u0002\u0000\u0002\u0000\u0002\u0000\u0002\u0000\u0002\u0000\u0002\u0000\u0002\u0000\u0002\u0000\u0002\u0000\u0004\u19cc\u19ce\u19d0\u0002\u0000\u0002\u0000\u0002\u0000\u0004\u19d6\u19da\u19d8\u0002\u19d8\u0002\u0000\u0002\u0000\u0004\u19e0\u19e4\u19e2" +
"\u0002\u19e2\u0002\u0000\u0002\u0000\u0008\u19ee\u1a03\u1a04\u1a05\u1a06\u1a05\u1a06\u0015\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0001\u0001\u0015\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0005\u1a20\u1a21\u1a22\u1a23\u0001\u0001\u0001\u0001\u0002\u1a26\u0001\u0002" +
"\u1a29\u0010\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0004\u1a21\u1a3d\u1a3e\u0001\u0001\u0002\u1a41\u0001\u0002\u1a22\n\u1a4e\u1a4f\u1a50\u1a51\u1a52\u1a68\u1a51\u1a52\u1a68\u0001\u0001\u0001\u0001\u0016\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0016\u0000\u0000\u0000\u0000\u0000\u0000\u0000" +
"\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0003\u1a81\u1a81\u0001\u0002\u1a84\u0001\u0002\u1a87\u0001\u0004\u1a8c\u1a9e\u1a9e\u0012\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0006\u1a23\u1aa5\u1ab8\u1acb\u1acb\u0013\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000" +
"\u0013\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0013\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0009\u1ae7\u1ae8\u1a4f\u1aa5\u1ae9\u1af9\u1afa\u1afa\u0001\u0001\u0010\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0001\n\u1b05\u1a50\u1a84\u1ab8" +
"\u1b06\u1af9\u1a04\u1af9\u1a04\u0001\u0011\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\n\u1b21\u1b22\u1a51\u1acb\u1b23\u1afa\u1a05\u1afa\u1a05\u0001\u0001\u0010\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0002\u1b35\u0001\u0007\u1a03\u1a50\u1a51\u1b3d\u1b3e\u1a4f\u0001\u0001\u0002\u1a4e\u0009\u1a06\u1a3e\u1a52\u1a9e\u1af9\u1afa" +
"\u1b4a\u1afa\u0013\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0006\u1a68\u1a04\u1a05\u1b63\u1a05\u001c\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\n\u1b21\u1b22\u1a51\u1acb\u1afa\u1a05\u1b23\u1afa\u1a05\u0009\u1a06\u1a3e\u1a52\u1a9e\u1af9\u1afa" +
"\u1afa\u1b4a\u0006\u1a68\u1a04\u1a05\u1a05\u1b63\u000c\u1ba4\u1ba5\u1ba6\u1ba7\u1ba8\u1ba9\u1baa\u1bab\u1bac\u1bad\u1bae\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0004\u1bb3\u1bb4\u1bb5\u0001\u0001\u0001\u0003\u1bb9\u1bba\u0001\u0001\u0007\u1bc2\u1bc3\u1bc4\u1bc5\u1bc6\u1bc7\u0001\u0001\u0001\u0001\u0001\u0001\u0003\u1bcb\u1bcc\u0001\u0001\u0004\u1bd1\u1bd2\u1bd3\u0001\u0001\u0001\u0003\u1bd7\u1bd8\u0001" +
"\u0001\u0002\u1bdb\u0001\u0002\u1bde\u0001\u0002\u1be1\u0001\u0002\u1be4\u0001\u0004\u1be9\u1bea\u1beb\u0001\u0001\u0001\u0002\u1bee\u0001\u0003\u1bf2\u1bf3\u0001\u0001\u0002\u1bf6\u0001\u0004\u1bfb\u1bfc\u1bfd\u0001\u0001\u0001\u0002\u1c00\u0001\u0004\u1c05\u1c06\u1c07\u0001\u0001\u0001\u0002\u1c0a\u0001\u0002\u1c0d\u0001\u0002\u1c10\u0001\u0002\u1c13\u0001\u0002\u1c16\u0001\u0002\u1c19\u0001\u0002\u1c1c\u0001\u0002\u1c1f\u0001" +
"\u0002\u1c22\u0001\u0006\u1c29\u1c2a\u1c2b\u1c2c\u1c2d\u0001\u0001\u0001\u0001\u0001\u0002\u1c30\u0001\u0002\u1c33\u0001\u0005\u1c39\u1c3a\u1c3b\u1c3c\u0001\u0001\u0001\u0001\u0003\u1c40\u1c41\u0001\u0001\u0005\u1c47\u1c48\u1c49\u1c4a\u0001\u0001\u0001\u0001\u0003\u1c4e\u1c4f\u0001\u0001\u0011\u1c61\u1c62\u1c63\u1c64\u1c65\u1c66\u1c67\u1c68\u1c69\u1c6a\u1c6b\u1c6c\u1c6d\u1c6e\u1c6f\u1c70\u0001\u0001\u0001\u0001\u0001\u0001\u0001" +
"\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0002\u1c6c\u0011\u1c84\u1c85\u1c86\u1c87\u1c88\u1c89\u1c8a\u1c8b\u1c8c\u1c8d\u1c8e\u1c8f\u1c90\u1c91\u1c92\u1c93\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0002\u1c8b\u000c\u1ca2\u1ca3\u1ca4\u1ca5\u1ca6\u1ca7\u1ca8\u1ca9\u1caa\u1cab\u1cac\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0003\u1cb0\u1cb1" +
"\u0001\u0001\u0003\u1cb5\u1cb6\u0001\u0001\u0003\u1cba\u1cbb\u0001\u0001\u0002\u1cbe\u0001\u0006\u1c6d\u1c6e\u1c6f\u1c66\u1c70\u0002\u1c93\u0002\u1cc9\u0001\u0002\u1ccc\u0001\u0002\u1ccf\u0001\u0002\u1cd2\u0001\u0004\u1cd7\u1cd8\u1cd9\u0001\u0001\u0001\u0004\u1cde\u1cdf\u1ce0\u0001\u0001\u0001\u0005\u1ce6\u1ce7\u1ce8\u1ce9\u0001\u0001\u0001\u0001\u0004\u1cee\u1cef\u1cf0\u0001\u0001\u0001\u0009\u1cfa\u1cfb\u1cfc\u1cfd\u1cfe\u1cff" +
"\u1d00\u1d01\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0002\u1cfb\u0006\u1d0a\u1d0b\u1d0c\u1d0d\u1d0e\u0001\u0001\u0001\u0001\u0001\u0009\u1d18\u1d19\u1d1a\u1d1b\u1d1c\u1d1d\u1d1e\u1d1f\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0003\u1d1f\u1d1b\u0008\u1d2b\u1d2c\u1d2d\u1d2e\u1d2f\u1d30\u1d31\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0004\u1d36\u1d37\u1d38\u0001\u0001\u0001\u0002\u1d3b\u0001\u0007\u1d43\u1d44\u1d45" +
"\u1d46\u1d47\u1d48\u0001\u0001\u0001\u0001\u0001\u0001\u0005\u1d4e\u1d4f\u1d50\u1d51\u0001\u0001\u0001\u0001\u0005\u1d57\u1d58\u1d59\u1d5a\u0001\u0001\u0001\u0001\u0002\u1d5a\u0008\u1d65\u1d66\u1d67\u1d68\u1d69\u1d6a\u1d6b\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0003\u1d6f\u1d70\u0001\u0001\u0015\u1d86\u1d87\u1d88\u1d89\u1d8a\u1d8b\u1d8c\u1d8d\u1d8e\u1d8f\u1d90\u1d91\u1d92\u1d93\u1d94\u1d95\u1d96\u1d97\u1d98\u1d99\u0001\u0001" +
"\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0002\u1d87\u0003\u1d94\u1d95\u0004\u1d8d\u1d97\u1d96\u0002\u1d8f\n\u1daf\u1db0\u1db1\u1db2\u1db3\u1db4\u1db5\u1db6\u1db7\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0006\u1dbe\u1dbf\u1dc0\u1dc1\u1dc2\u0001\u0001\u0001\u0001\u0001\u0006\u1dc9\u1dca\u1dcb\u1dcc\u1dcd\u0001\u0001\u0001\u0001\u0001\u0005\u1dd3" +
"\u1dd4\u1dd5\u1dd6\u0001\u0001\u0001\u0001\u0003\u1dda\u1ddb\u0001\u0001\u0005\u1de1\u1de2\u1de3\u1de4\u0001\u0001\u0001\u0001\u0002\u1de7\u0001\u0002\u1db3\u0002\u1dd4\u0003\u1def\u1df0\u0001\u0001\u0003\u149e\u1df4\u0001\u0003\u0d80\u1df8\u0001\u0003\u149f\u1dfc\u0001\u0003\u0d81\u1e00\u0001\u0002\u1e03\u0001\u0004\u1220\u14a0\u1e08\u0001\u0005\u14a1\u151b\u05ab\u1e0e\u0001\u0002\u1e11\u0001\u0002\u1221\u0002\u1e16\u0001\u0008" +
"\u1222\u059a\u1e1f\u1e20\u1e21\u1e22\u1e23\u0001\u0001\u0001\u0001\u0001\u0002\u1e26\u0001\u0002\u1e29\u0001\u0004\u151c\u0ec8\u1e2e\u0001\u0004\u151d\u0ec8\u1e33\u0001\u0002\u1e1f\u0002\u14a2\u0002\u1e3a\u0001\u0002\u1e3d\u0001\u0002\u1e40\u0001\u0002\u1e43\u0001\u0003\u1223\u1e47\u0001\u0002\u1223\u0002\u1e4c\u0001\u0002\u1e4f\u0001\u0002\u1e52\u0001\u0002\u1e55\u0001\u0002\u1e58\u0001\u0002\u1e5b\u0001\u0002\u1e5e\u0001\u0002" +
"\u1e61\u0001\u0002\u1e64\u0001\u0002\u1e67\u0001\u0004\u1e6c\u1224\u14a3\u0001\u0003\u1e70\u1225\u0001\u0002\u1e73\u0001\u0002\u1e76\u0001\u0002\u1e79\u0001\u0002\u1e7c\u0001\u0002\u1e7f\u0001\u0005\u1537\u1587\u1e20\u1e85\u0001\u0004\u1226\u1e21\u1e85\u0002\u1e8c\u0001\u0002\u1e8f\u0001\u0002\u1e92\u0001\u0002\u1e95\u0001\u0002\u1e98\u0001\u0002\u1e9b\u0001\u0002\u1e9e\u0001\u0003\u1227\u1ea2\u0001\u0002\u1228\u0002\u1229\u0002" +
"\u122a\u0016\u0904\u0e4c\u0e8e\u0ed2\u0f05\u0f24\u0f63\u10ed\u1664\u1df4\u1df8\u1dfc\u1e00\u1e08\u1e0e\u1e22\u1e2e\u1e33\u1e47\u1ea2\u1ebf\u0001\n\u0cec\u0d82\u0e0a\u10ee\u122b\u14a4\u1538\u1e23\u1ebf\u0002\u1ecc\u0001\u0104\u1fd1\u0735\u0795\u07cf\u0897\u0796\u0797\u0351\u0ddc\u0d6a\u0ddd\u1fd6\u1fda\u1fdd\u1fe0\u1fe3\u1fe6\u1fe9\u1fec\u1fef\u1ff2\u1ff5\u0ec6\u1515\u0f1d\u0f4d\u089c\u089d\u0d28\u0d69\u1327\u1ffa\u0e3f\u0ef6" +
"\u1ffb\u0d7b\u140c\u0efa\u0efb\u0e41\u0eff\u1ffc\u0ddf\u0751\u0de1\u1ffd\u1033\u2005\u2006\u2007\u2008\u2009\u200a\u200b\u200c\u200d\u200e\u200f\u2010\u2011\u2012\u2013\u1802\u182a\u1850\u1802\u2014\u2016\u2017\u0e06\u2018\u2019\u201a\u201b\u201c\u18b8\u201e\u18b6\u18b0\u201f\u2020\u2022\u2023\u1959\u1833\u2024\u10b7\u2025\u0e09\u1806\u0e05\u2026\u182b\u1835\u187c\u0e06\u203f\u204b\u2052\u2058\u205f\u2065\u206a\u2070\u207c\u2082" +
"\u2088\u208f\u209c\u1a52\u1a68\u1b35\u20a2\u1ae9\u1a20\u20a3\u20a4\u1a3d\u1a3e\u20a5\u1a41\u20a6\u20a6\u20a7\u20a8\u1a81\u1b63\u20a9\u20aa\u20ab\u1a9e\u20ac\u20ad\u20ae\u1a84\u20af\u1af9\u1afa\u1fd6\u1fda\u1fdd\u1fe0\u1fe3\u1fe6\u1fe9\u1fec\u1fef\u1ff2\u20a7\u1b06\u20b0\u20b1\u1b4a\u1b63\u20b2\u1b23\u1fd6\u1fda\u1fdd\u1fe0\u1fe3\u1fe6\u1fe9\u1fec\u1fef\u1ff2\u20b3\u20b4\u20b5\u20b6\u20b7\u20b8\u20b9\u20ba\u20bb\u20bc\u20bd\u20be" +
"\u20bf\u20c0\u1ba4\u1ba5\u1ba6\u20c1\u20c2\u20c3\u1ba7\u20c7\u20c8\u1ba8\u1ba9\u20c9\u20ca\u20ce\u1baa\u20d2\u1bab\u20d6\u1bac\u1bad\u1bae\u20d7\u20d8\u20dc\u20e0\u20e1\u20e2\u20e3\u20e4\u20e5\u20e6\u20e7\u20e8\u20e9\u20ea\u20eb\u20ec\u20ed\u20ee\u20ef\u20f0\u20f2\u20f4\u20f6\u20f8\u149c\u1ffd\u1043\u0ef4\u0f00\u0ef5\u0f03\u20fa\u20fb\u20fc\u20fd\u20fe\u20ff\u1e03\u1220\u05ab\u2100\u2101\u2102\u2103\u2104\u1224\u1225\u1537\u2105" +
"\u1ea2\u14a3\u1229\u122a\u0904\u1838\u2106\u2107\u2108\u0005\u0000\u0000\u0000\u0000\u0004\u0000\u0000\u0000\u0003\u0000\u0000\u0003\u0000\u0000\u0003\u0000\u0000\u0003\u0000\u0000\u0003\u0000\u0000\u0003\u0000\u0000\u0003\u0000\u0000\u0003\u0000\u0000\u0003\u0000\u0000\u0005\u0000\u0000\u0000\u0000\u0001\u0001\u0001\u0008\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001" +
"\u0001\u0001\u0001\u0001\u0002\u0000\u0001\u0001\u0001\u0001\u0001\u0001\u0002\u0000\u0001\u0001\u0002\u0000\u0001\u0001\u0001\u0001\u0019\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u000c\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0007\u0000\u0000\u0000\u0000\u0000\u0000\u0006\u0000\u0000\u0000\u0000\u0000" +
"\u0007\u0000\u0000\u0000\u0000\u0000\u0000\u0006\u0000\u0000\u0000\u0000\u0000\u0005\u0000\u0000\u0000\u0000\u0006\u0000\u0000\u0000\u0000\u0000\u000c\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0006\u0000\u0000\u0000\u0000\u0000\u0006\u0000\u0000\u0000\u0000\u0000\u0007\u0000\u0000\u0000\u0000\u0000\u0000\r\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0006\u0000\u0000\u0000" +
"\u0000\u0000\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0004\u0000\u0000\u0000\u0001\u0001\u0001\u0004\u0000\u0000\u0000\u0004\u0000\u0000\u0000\u0004\u0000\u0000\u0000\u0001\u0001\u0004\u0000\u0000\u0000\u0004\u0000\u0000\u0000\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001" +
"\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0002\u0000\u0002\u0000\u0002\u0000\u0002\u0000\u0002\u0000\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0019\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u000b\u212c\u212d\u212e\u212f\u2130\u2131\u2132\u2133\u2134\u2135\u0001\u0001\u0001\u0001" +
"\u0001\u0001\u0001\u0001\u0001\u0001\u000b\u2141\u2142\u2143\u2144\u2145\u2146\u2147\u2148\u2149\u214a\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u000b\u2156\u2157\u2158\u2159\u215a\u215b\u215c\u215d\u215e\u215f\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u000b\u216b\u216c\u216d\u216e\u216f\u2170\u2171\u2172\u2173\u2174\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u000b\u2180\u2181" +
"\u2182\u2183\u2184\u2185\u2186\u2187\u2188\u2189\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u000b\u2195\u2196\u2197\u2198\u2199\u219a\u219b\u219c\u219d\u219e\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u000b\u21aa\u21ab\u21ac\u21ad\u21ae\u21af\u21b0\u21b1\u21b2\u21b3\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0071\u1051\u0dea\u2225\u2228\u222b\u222c\u222d\u222e\u222f\u2230\u2231" +
"\u2232\u20bb\u20bc\u2233\u2234\u2235\u2236\u2237\u2238\u2239\u223a\u223b\u223c\u223d\u223e\u223f\u2240\u2241\u2242\u2243\u2244\u20e6\u20b5\u2245\u20b6\u2246\u2247\u20ed\u2248\u2249\u224a\u224b\u224c\u224d\u224e\u224f\u2250\u2251\u2252\u2253\u2254\u2255\u2256\u2257\u2258\u2259\u225a\u225b\u225c\u225d\u225e\u225f\u1043\u2260\u2261\u2262\u2263\u2264\u2265\u2266\u2267\u2268\u2269\u226a\u226b\u226c\u226d\u226f\u0424\u2271\u2274\u2277" +
"\u227a\u227b\u1043\u0ef4\u0f00\u0ef5\u0f03\u20fc\u20fd\u20fe\u20ff\u1e11\u1e16\u1e6c\u1e70\u1e73\u1e76\u227c\u227d\u227e\u227f\u2280\u2281\u2282\u2283\u2284\u2285\u2286\u2287\u0003\u0000\u0000\u0003\u0000\u0000\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001" +
"\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0002\u0000\u0002\u0000\u0003\u0000\u0000\u0003\u0000\u0000\u0003\u0000\u0000\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0006\u228d\u2290\u2293\u2296\u2299\u0003\u0000\u0000\u0003\u0000\u0000\u0003\u0000\u0000\u0003\u0000" +
"\u0000\u0003\u0000\u0000\u03b4\u2650\u2651\u2652\u2653\u2654\u2655\u2656\u2657\u2658\u2659\u265a\u265b\u265c\u265d\u265e\u265f\u2660\u2661\u2662\u2663\u2664\u2665\u2666\u0415\u2667\u2668\u0415\u2652\u265b\u2667\u2650\u2664\u265e\u2650\u2650\u2650\u2650\u2650\u2650\u2650\u2652\u2654\u2654\u2654\u2654\u2658\u2658\u2658\u2658\u265d\u265e\u265e\u265e\u265e\u265e\u265e\u2664\u2664\u2664\u2664\u2667\u2650\u2650\u2650\u2650\u2650\u2650" +
"\u2650\u2652\u2654\u2654\u2654\u2654\u2658\u2658\u2658\u2658\u265d\u265e\u265e\u265e\u265e\u265e\u265e\u2664\u2664\u2664\u2664\u2667\u2667\u2650\u2650\u2650\u2650\u2652\u2652\u2652\u2652\u2652\u2652\u2652\u2652\u2653\u2653\u2653\u2653\u2654\u2654\u2654\u2654\u2654\u2654\u2654\u2654\u2656\u2656\u2656\u2656\u2656\u2656\u2657\u2657\u2657\u2657\u2658\u2658\u2658\u2658\u2658\u2658\u2658\u2658\u2659\u2659\u265a\u265a\u265b\u265b\u265b" +
"\u265b\u265b\u265b\u265b\u265b\u265d\u265d\u265d\u265d\u265d\u265d\u265e\u265e\u265e\u265e\u265e\u265e\u2661\u2661\u2661\u2661\u2661\u2661\u2662\u2662\u0184\u0184\u2662\u2662\u2662\u2662\u2663\u2663\u2663\u2663\u2663\u2663\u2664\u2664\u2664\u2664\u2664\u2664\u2664\u2664\u2664\u2664\u2666\u2666\u2667\u2667\u2667\u2668\u2668\u2668\u2668\u2668\u2668\u2651\u2669\u2658\u265b\u265e\u265e\u265e\u2661\u2664\u2664\u2668\u2668\u2650\u2650" +
"\u2658\u2658\u265e\u265e\u2664\u2664\u2664\u2664\u2664\u2664\u2664\u2664\u2664\u2664\u2650\u2650\u2650\u2650\u2650\u2650\u2656\u2656\u2656\u2656\u265a\u265a\u265e\u265e\u265e\u265e\u266a\u266a\u2659\u2656\u2656\u265d\u265d\u2650\u2650\u2650\u2650\u265e\u265e\u2650\u2650\u2654\u2654\u2658\u2658\u265e\u265e\u2661\u2661\u2664\u2664\u2657\u2657\u2650\u2650\u2654\u2654\u265e\u265e\u265e\u265e\u265e\u265e\u265e\u265e\u2667\u2667\u2659" +
"\u2650\u2652\u2652\u265b\u2663\u2651\u2664\u2654\u2654\u2659\u2659\u2661\u2661\u2667\u2667\u2659\u2656\u2669\u2658\u2658\u265d\u265e\u265e\u2661\u2664\u2667\u2651\u266b\u2657\u265b\u2657\u266c\u2659\u2661\u266d\u266e\u042a\u2666\u2667\u2669\u265b\u2662\u0415\u266f\u2670\u2671\u2672\u2673\u2674\u2675\u2670\u2676\u2677\u2664\u2678\u2679\u267a\u267b\u2672\u2674\u266f\u2670\u2671\u2672\u2674\u267a\u2672\u2674\u2673\u2674\u2675\u2676" +
"\u2674\u2674\u267b\u2678\u2677\u2679\u2676\u2670\u267c\u1833\u267d\u267e\u267f\u2024\u10b7\u2025\u2680\u2024\u0e09\u2016\u2017\u18b6\u201f\u2020\u2022\u1959\u2016\u2017\u18b6\u201f\u2020\u2022\u1959\u267c\u1833\u267d\u267e\u267f\u2024\u10b7\u2025\u2680\u2024\u0e09\u267c\u267c\u2681\u2681\u2682\u2682\u2683\u2683\u2684\u2684\u1854\u1854\u2685\u2685\u0e05\u0e05\u201f\u201f\u267d\u267d\u2686\u2686\u182b\u182b\u2687\u2687\u1835\u1835" +
"\u2688\u2688\u2689\u2689\u1805\u1805\u268a\u268a\u268b\u268b\u2024\u2024\u2024\u2024\u2685\u2685\u2685\u2685\u2685\u2685\u267e\u267e\u268c\u268c\u268c\u268c\u268c\u268c\u2025\u2025\u2106\u2106\u2688\u2688\u0d40\u0d40\u268d\u268d\u268e\u268f\u2690\u2691\u2691\u2692\u2693\u2694\u2695\u20ab\u20ae\u20af\u2696\u1a22\u2697\u2693\u2698\u2699\u20b0\u2694\u269a\u269b\u20b1\u269c\u20b2\u269d\u269e\u269f\u26a0\u26a1\u26a2\u26a2\u26a2\u269f" +
"\u26a3\u26a3\u26a4\u26a5\u26a6\u26a7\u26a8\u26a9\u26aa\u26ab\u26ac\u26aa\u26ad\u26ae\u26af\u26af\u26b0\u26a4\u26a4\u26a5\u26a7\u26a9\u26a9\u26b1\u26b2\u26b3\u26b4\u269f\u26a0\u26a0\u26a3\u26a1\u26a1\u26a8\u26a7\u26b5\u26a5\u26a6\u26b6\u26aa\u26ad\u26b7\u26b8\u26b9\u26ba\u26bb\u26bc\u26bd\u26be\u26bf\u26c0\u26c1\u26c2\u26c3\u26c4\u26c5\u26c6\u26c7\u26c8\u26c9\u26ca\u2650\u2650\u2651\u2652\u2653\u1391\u2654\u2659\u265a\u265b\u265c" +
"\u13f1\u265e\u26cb\u26cc\u265f\u2107\u266d\u2663\u2664\u2665\u2666\u2668\u266a\u2669\u26cd\u2678\u2679\u26ce\u268d\u2650\u26cf\u26d0\u2651\u2653\u2654\u13a4\u26d1\u26d2\u2656\u26d3\u265a\u265c\u13f1\u265e\u26cb\u265f\u2663\u2664\u26d4\u26d5\u2665\u2675\u26d6\u267b\u26d7\u2658\u2661\u2664\u2665\u2675\u2669\u2679\u267b\u26d7\u2658\u265f\u2664\u26d8\u2652\u26d9\u26da\u2655\u2659\u26db\u2658\u2672\u26dc\u26dd\u265e\u26de\u26df\u2664" +
"\u26e0\u26e1\u2668\u266a\u2676\u2651\u2651\u2651\u2651\u2652\u2652\u2653\u2653\u2653\u2653\u2653\u2653\u2654\u2654\u2654\u2654\u10a0\u10a0\u2655\u2655\u2656\u2656\u2657\u2657\u2657\u2657\u2657\u2657\u2657\u2657\u2658\u2658\u265a\u265a\u265a\u265a\u265b\u265b\u265b\u265b\u265c\u265c\u265c\u265c\u265c\u265c\u265d\u265d\u265d\u265d\u265e\u265e\u265e\u265e\u265e\u265e\u265e\u265e\u265f\u265f\u265f\u265f\u2661\u2661\u2661\u2661\u2661" +
"\u2661\u2662\u2662\u2662\u2662\u2662\u2662\u2662\u2662\u2662\u2662\u2663\u2663\u2663\u2663\u2664\u2664\u2665\u2665\u2665\u2665\u2666\u2666\u2666\u2666\u2666\u2666\u2666\u2666\u2666\u2666\u0415\u0415\u0415\u0415\u2667\u2667\u2668\u2668\u2668\u2668\u2663\u2666\u2667\u13ac\u1427\u2650\u2650\u2650\u2650\u2650\u2650\u2650\u2650\u2650\u2650\u2650\u2650\u2650\u2650\u109f\u109f\u109f\u109f\u109f\u109f\u109f\u109f\u109f\u109f\u2654\u2654" +
"\u2654\u2654\u2654\u2654\u2654\u2654\u2654\u2654\u2654\u2654\u2654\u2654\u2654\u2654\u2658\u2658\u2658\u2658\u265e\u265e\u265e\u265e\u265e\u265e\u265e\u265e\u265e\u265e\u265e\u265e\u265e\u265e\u265e\u265e\u265e\u265e\u265e\u265e\u265e\u265e\u265e\u265e\u2664\u2664\u2664\u2664\u2664\u2664\u2664\u2664\u2664\u2664\u2664\u2664\u2664\u2664\u2667\u2667\u2667\u2667\u2667\u2667\u2667\u2667\u266f\u2670\u2671\u2672\u2673\u2674\u26e2\u266f" +
"\u266f\u266f\u2670\u2671\u2672\u2672\u2672\u2674\u2674\u1519\u2674\u2674\u2673\u26e2\u2658\u265d\u2650\u2654\u265e\u0415\u13a4\u2657\u265a\u265b\u265c\u265d\u265f\u2662\u2663\u2654\u2651\u2657\u2661\u265f\u2668\u2678\u267a\u2651\u265f\u2650\u2663\u26e3\u2659\u268b\u268b\u1838\u1838\u268c\u268c\u17f2\u17f2\u2106\u2106\u2107\u2107\u2655\u2662\u265a\u265a\u265a\u265a\u2660\u2660\u2665\u2665\u26e4\u2652\u2652\u2655\u2655\u2656\u2656" +
"\u265d\u265d\u2661\u2661\u2662\u2662\u2658\u2660\u2664\u2664\u2660\u265e\u26d5\u26cb\u26e2\u26e6\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001" +
"\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0149\u06f5\u070a\u0756\u07c2\u07d1\u07d4\u0909\u0cc1\u0ce2\u0cf1\u0cfc\u0d48\u0d87\u0e0f\u0e51\u0e57\u0e6d\u0e73\u0e7b\u0e7e\u0e83\u0e86\u0e89\u0e93\u0eaa\u0ed7\u0f0a\u0f29\u0f68\u0f82\u0f86\u0f97\u0f9f\u0fb4\u0fc2\u0fd5\u0fd7\u0fea\u0fed\u0ff0\u1002\u1004\u1014\u1031\u1039\u103d\u1048\u1057\u1067\u10bd\u10c4\u10c8\u10ca\u10d4\u10db\u10de\u10f3\u10f5\u1189" +
"\u1230\u1319\u132c\u1356\u138d\u1397\u13a9\u13b7\u13ca\u13cc\u13dc\u13df\u13e3\u13eb\u13ef\u13f6\u1411\u141b\u1420\u142c\u1439\u1454\u1478\u147a\u147e\u1486\u148a\u148d\u14a9\u1522\u153d\u158c\u164e\u1666\u1669\u166c\u166e\u1670\u1672\u1675\u1677\u167a\u167c\u167e\u1680\u1682\u172d\u172f\u1732\u1734\u173c\u1745\u175c\u1769\u177c\u177e\u1780\u1785\u178a\u178c\u1798\u179e\u17a0\u17a9\u17b0\u17b4\u17b6\u17c2\u17cd\u17d0\u17d2\u17d6" +
"\u17ec\u180c\u1827\u1830\u183d\u184f\u1851\u1855\u1859\u186c\u1874\u1879\u187b\u1892\u18b1\u18b5\u18bd\u18d7\u18f4\u194e\u1951\u1953\u1966\u196b\u196f\u1972\u1974\u1976\u197a\u1981\u1985\u1989\u19cc\u19d6\u19e0\u19ea\u1a1f\u1a28\u1a2b\u1a3d\u1a43\u1a46\u1a48\u1a82\u1a86\u1a89\u1a8c\u1aa3\u1ae2\u1aff\u1b1b\u1b37\u1b3a\u1b43\u1b45\u1b61\u1b83\u1b8d\u1b96\u1b9c\u1bb3\u1bba\u1bbf\u1bcc\u1bd1\u1bd8\u1bdd\u1be0\u1be3\u1be6\u1be9\u1bf0" +
"\u1bf3\u1bf8\u1bfb\u1c02\u1c05\u1c0c\u1c0f\u1c12\u1c15\u1c18\u1c1b\u1c1e\u1c21\u1c24\u1c27\u1c32\u1c35\u1c38\u1c41\u1c46\u1c4f\u1c54\u1c75\u1c77\u1c98\u1c9a\u1cb1\u1cb6\u1cbb\u1cc0\u1cc3\u1cc9\u1ccb\u1cce\u1cd1\u1cd4\u1cd7\u1cde\u1ce5\u1cee\u1cf5\u1d06\u1d08\u1d13\u1d24\u1d27\u1d36\u1d3d\u1d40\u1d4d\u1d56\u1d5f\u1d61\u1d70\u1d75\u1d9e\u1da0\u1da3\u1da7\u1da9\u1dbc\u1dc7\u1dd2\u1ddb\u1de0\u1de9\u1dec\u1dee\u1df0\u1df5\u1df9\u1dfd" +
"\u1e01\u1e05\u1e08\u1e0d\u1e13\u1e16\u1e18\u1e1b\u1e28\u1e2b\u1e2e\u1e33\u1e38\u1e3a\u1e3c\u1e3f\u1e42\u1e45\u1e48\u1e4c\u1e4e\u1e51\u1e54\u1e57\u1e5a\u1e5d\u1e60\u1e63\u1e66\u1e69\u1e6c\u1e71\u1e75\u1e78\u1e7b\u1e7e\u1e81\u1e84\u1e8a\u1e8e\u1e91\u1e94\u1e97\u1e9a\u1e9d\u1ea0\u1ea3\u1ea7\u1ea9\u1eab\u1ead\u1ec4\u1ece\u0009\u06fe\u0703\u0704\u0705\u0706\u0707\u0708\u0709\u0005\u0000\u0000\u0000\u0000\u0001\u0001\u0001\u0001\u0001" +
"\u0001\u0001\u002f\u0739\u073a\u0741\u0742\u0743\u0744\u0745\u0746\u0747\u0748\u0749\u074a\u074b\u074c\u074d\u074e\u074f\u0750\u0751\u0752\u0753\u0754\u0755\u023e\u023f\u0240\u0241\u0242\u0243\u0244\u0245\u0246\u0247\u0248\u0249\u024a\u024b\u024c\u024d\u024e\u024f\u0250\u073f\u0252\u0740\u0253\u0001\u0005\u073f\u0740\u0252\u0253\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001" +
"\u0001\u0001\u0001\u0001\u0001\u0001\u0041\u0797\u0797\u0798\u0799\u079a\u079b\u079c\u079d\u079e\u079f\u07a0\u07a1\u07a2\u07a3\u07a4\u07a5\u057a\u057e\u057f\u0580\u0590\u0594\u0595\u0596\u0597\u0598\u07aa\u07ae\u0798\u07ad\u0548\u07a8\u07a9\u07b1\u07b2\u059b\u059c\u059e\u07b3\u07b4\u07b5\u07b6\u07b7\u07b8\u07b9\u07ba\u07bb\u07bc\u07bd\u059f\u07be\u05a0\u05a1\u05a2\u05a3\u05a4\u05a5\u05a6\u05a7\u07bf\u07c0\u05a8\u07c1\u00cf\u0001" +
"\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0003\u07a8\u07a9\u0001\u0001\u0003\u07ad\u0548\u0001\u0003\u07a8\u07a9\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0008\u07ca\u07cb\u07cc\u07cd\u07ce\u07cf\u07d0\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0002\u07d3\u0001\u007b\u084f\u085b\u085c\u0879\u0894\u089b\u089c\u08a0\u08a1\u08a2\u08a3" +
"\u08a4\u08a5\u08a6\u08a7\u08aa\u08ab\u08ac\u08ad\u08ae\u08af\u08b0\u08b1\u08b2\u08b3\u08b4\u08b5\u08b6\u08c0\u0037\u08c7\u0038\u0039\u003a\u003b\u003c\u003f\u0040\u0041\u0042\u0043\u0044\u0045\u0046\u0047\u0048\u0049\u004a\u08cb\u08d2\u08d7\u08bd\u08db\u08dc\u08da\u08be\u0858\u08bf\u08d0\u089f\u0859\u004b\u004c\u004d\u004e\u004f\u0050\u0051\u0052\u0053\u0054\u08ca\u0055\u08c5\u0059\u08c6\u005a\u08d1\u005b\u0899\\\u089a\u005d" +
"\u08dd\u08de\u08df\u08e0\u08e1\u08e2\u08e3\u005e\u005f\u0060\u0061\u0062\u0063\u08e4\u08e5\u08e8\u08e9\u08ec\u08ef\u08f0\u08f3\u08f6\u08f9\u08fc\u08ff\u0902\u0064\u0067\u0068\u006b\u006e\u006f\u0905\u0072\u0075\u0078\u007b\u007e\u0908\u0008\u0857\u0858\u0859\u0050\u0054\u085a\u059d\u0001\u0001\u0001\u0001\u0001\u000f\u086b\u086c\u086d\u086e\u086f\u0870\u0871\u0872\u0873\u0874\u0875\u0876\u0877\u0878\u0001\u0001\u0001\u0001\u0001" +
"\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u000e\u0887\u0888\u0889\u088a\u088b\u088c\u088d\u088e\u088f\u0890\u0891\u0892\u0893\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0005\u0899\u089a\\\u005d\u0001\u0001\u0001\u0003\u089f\u0053\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0003\u0000\u0000\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0007\u08bd" +
"\u08be\u08bf\u004b\u004f\u0051\u0001\u0001\u0001\u0005\u08c5\u08c6\u0059\u005a\u0001\u0001\u0003\u08ca\u0055\u0001\u0005\u08d0\u08d1\u0052\u005b\u0001\u0001\u0005\u08c5\u08c6\u0059\u005a\u0003\u08da\u004e\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0003\u0000\u0000\u0001\u0003\u0000\u0000\u0003\u0000\u0000\u0001\u0003\u0000\u0000\u0003\u0000\u0000\u0003\u0000\u0000\u0003\u0000\u0000\u0003\u0000\u0000\u0003" +
"\u0000\u0000\u0003\u0000\u0000\u0003\u0000\u0000\u0001\u00c1\u0703\u09ca\u09cb\u09d0\u09d1\u09d4\u09ff\u0a2a\u0a55\u0a80\u0a87\u0a8a\u0a8d\u0a90\u0a93\u0a96\u0a99\u0a9c\u0a9f\u0aa2\u0aa5\u0aa8\u0aab\u0aae\u0ab1\u0ab4\u0ab7\u0aba\u0abd\u0ac0\u0ac3\u0ac6\u0ac9\u0acc\u0acf\u0ad2\u0ad5\u0ad8\u0adb\u0ade\u0ae1\u0ae4\u0ae7\u0aea\u0aed\u0af0\u0af3\u0af6\u0af9\u0afc\u0aff\u0b02\u0b05\u0b08\u0b0b\u0b0e\u0b11\u0b14\u0b17\u0b1a\u0b1d\u0b20" +
"\u0b23\u0b26\u0b29\u0b2c\u0b2f\u0b30\u0b31\u0b32\u0b33\u0b34\u0b35\u0b36\u0b37\u0b38\u0b39\u0b3a\u0b3b\u0b3c\u0b3d\u0b3e\u0b3f\u0b46\u0b4d\u0b54\u0b5b\u0b62\u0b69\u0b70\u0b77\u0b7e\u0b85\u0b8c\u0b93\u0b9a\u0ba1\u0ba4\u0ba7\u0baa\u0bad\u0bb0\u0bb3\u0bb6\u0bb9\u0bbc\u0bbf\u0bc2\u0bc5\u0bc8\u0bcb\u0bce\u0bd1\u0bd4\u0bd7\u0bda\u0bdd\u0be0\u0be3\u0be6\u0be9\u0bec\u0bef\u0bf2\u0bf5\u0bf8\u0bfb\u0bfe\u0c01\u0c04\u0c07\u0c0a\u0c0d\u0c10" +
"\u0c13\u0c16\u0c19\u0c1c\u0c1f\u0c22\u0c25\u0c28\u0c2b\u0c2e\u0c31\u0c34\u0c37\u0c3a\u0c3d\u0c40\u0c43\u0c46\u0c49\u0c4c\u0c4f\u0c52\u0c55\u0c58\u0c5b\u0c5e\u0c61\u0c64\u0c67\u0c6a\u0c6d\u0c70\u0c73\u0c76\u0c79\u0c7c\u0c7f\u0c82\u0c85\u0c88\u0c8b\u0c8e\u0c91\u0c94\u0c97\u0c9a\u0c9d\u0ca0\u0ca3\u0ca6\u0ca9\u0cac\u0caf\u0cb2\u0cb5\u0cb8\u0cbb\u0cbe\u0001\u0002\u09cd\u0003\u0000\u0000\u0001\u0002\u09d3\u0001\u000c\u09e0\u09e1\u09e4" +
"\u09e7\u09ea\u09ed\u09f0\u09f3\u09f6\u09f9\u09fc\u0001\u0002\u09e3\u0001\u0002\u09e6\u0001\u0002\u09e9\u0001\u0002\u09ec\u0001\u0002\u09ef\u0001\u0002\u09f2\u0001\u0002\u09f5\u0001\u0002\u09f8\u0001\u0002\u09fb\u0001\u0002\u09fe\u0001\u000c\u0a0b\u0a0c\u0a0f\u0a12\u0a15\u0a18\u0a1b\u0a1e\u0a21\u0a24\u0a27\u0001\u0002\u0a0e\u0001\u0002\u0a11\u0001\u0002\u0a14\u0001\u0002\u0a17\u0001\u0002\u0a1a\u0001\u0002\u0a1d\u0001\u0002\u0a20" +
"\u0001\u0002\u0a23\u0001\u0002\u0a26\u0001\u0002\u0a29\u0001\u000c\u0a36\u0a37\u0a3a\u0a3d\u0a40\u0a43\u0a46\u0a49\u0a4c\u0a4f\u0a52\u0001\u0002\u0a39\u0001\u0002\u0a3c\u0001\u0002\u0a3f\u0001\u0002\u0a42\u0001\u0002\u0a45\u0001\u0002\u0a48\u0001\u0002\u0a4b\u0001\u0002\u0a4e\u0001\u0002\u0a51\u0001\u0002\u0a54\u0001\u000c\u0a61\u0a62\u0a65\u0a68\u0a6b\u0a6e\u0a71\u0a74\u0a77\u0a7a\u0a7d\u0001\u0002\u0a64\u0001\u0002\u0a67\u0001" +
"\u0002\u0a6a\u0001\u0002\u0a6d\u0001\u0002\u0a70\u0001\u0002\u0a73\u0001\u0002\u0a76\u0001\u0002\u0a79\u0001\u0002\u0a7c\u0001\u0002\u0a7f\u0001\u0003\u0a83\u0a84\u0001\u0002\u0a86\u0001\u0002\u0a89\u0001\u0002\u0a8c\u0001\u0002\u0a8f\u0001\u0002\u0a92\u0001\u0002\u0a95\u0001\u0002\u0a98\u0001\u0002\u0a9b\u0001\u0002\u0a9e\u0001\u0002\u0aa1\u0001\u0002\u0aa4\u0001\u0002\u0aa7\u0001\u0002\u0aaa\u0001\u0002\u0aad\u0001\u0002\u0ab0" +
"\u0001\u0002\u0ab3\u0001\u0002\u0ab6\u0001\u0002\u0ab9\u0001\u0002\u0abc\u0001\u0002\u0abf\u0001\u0002\u0ac2\u0001\u0002\u0ac5\u0001\u0002\u0ac8\u0001\u0002\u0acb\u0001\u0002\u0ace\u0001\u0002\u0ad1\u0001\u0002\u0ad4\u0001\u0002\u0ad7\u0001\u0002\u0ada\u0001\u0002\u0add\u0001\u0002\u0ae0\u0001\u0002\u0ae3\u0001\u0002\u0ae6\u0001\u0002\u0ae9\u0001\u0002\u0aec\u0001\u0002\u0aef\u0001\u0002\u0af2\u0001\u0002\u0af5\u0001\u0002\u0af8" +
"\u0001\u0002\u0afb\u0001\u0002\u0afe\u0001\u0002\u0b01\u0001\u0002\u0b04\u0001\u0002\u0b07\u0001\u0002\u0b0a\u0001\u0002\u0b0d\u0001\u0002\u0b10\u0001\u0002\u0b13\u0001\u0002\u0b16\u0001\u0002\u0b19\u0001\u0002\u0b1c\u0001\u0002\u0b1f\u0001\u0002\u0b22\u0001\u0002\u0b25\u0001\u0002\u0b28\u0001\u0002\u0b2b\u0001\u0002\u0b2e\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0003" +
"\u0b42\u0b43\u0001\u0002\u0b45\u0001\u0003\u0b49\u0b4a\u0001\u0002\u0b4c\u0001\u0003\u0b50\u0b51\u0001\u0002\u0b53\u0001\u0003\u0b57\u0b58\u0001\u0002\u0b5a\u0001\u0003\u0b5e\u0b5f\u0001\u0002\u0b61\u0001\u0003\u0b65\u0b66\u0001\u0002\u0b68\u0001\u0003\u0b6c\u0b6d\u0001\u0002\u0b6f\u0001\u0003\u0b73\u0b74\u0001\u0002\u0b76\u0001\u0003\u0b7a\u0b7b\u0001\u0002\u0b7d\u0001\u0003\u0b81\u0b82\u0001\u0002\u0b84\u0001\u0003\u0b88\u0b89" +
"\u0001\u0002\u0b8b\u0001\u0003\u0b8f\u0b90\u0001\u0002\u0b92\u0001\u0003\u0b96\u0b97\u0001\u0002\u0b99\u0001\u0003\u0b9d\u0b9e\u0001\u0002\u0ba0\u0001\u0002\u0ba3\u0001\u0002\u0ba6\u0001\u0002\u0ba9\u0001\u0002\u0bac\u0001\u0002\u0baf\u0001\u0002\u0bb2\u0001\u0002\u0bb5\u0001\u0002\u0bb8\u0001\u0002\u0bbb\u0001\u0002\u0bbe\u0001\u0002\u0bc1\u0001\u0002\u0bc4\u0001\u0002\u0bc7\u0001\u0002\u0bca\u0001\u0002\u0bcd\u0001\u0002\u0bd0" +
"\u0001\u0002\u0bd3\u0001\u0002\u0bd6\u0001\u0002\u0bd9\u0001\u0002\u0bdc\u0001\u0002\u0bdf\u0001\u0002\u0be2\u0001\u0002\u0be5\u0001\u0002\u0be8\u0001\u0002\u0beb\u0001\u0002\u0bee\u0001\u0002\u0bf1\u0001\u0002\u0bf4\u0001\u0002\u0bf7\u0001\u0002\u0bfa\u0001\u0002\u0bfd\u0001\u0002\u0c00\u0001\u0002\u0c03\u0001\u0002\u0c06\u0001\u0002\u0c09\u0001\u0002\u0c0c\u0001\u0002\u0c0f\u0001\u0002\u0c12\u0001\u0002\u0c15\u0001\u0002\u0c18" +
"\u0001\u0002\u0c1b\u0001\u0002\u0c1e\u0001\u0002\u0c21\u0001\u0002\u0c24\u0001\u0002\u0c27\u0001\u0002\u0c2a\u0001\u0002\u0c2d\u0001\u0002\u0c30\u0001\u0002\u0c33\u0001\u0002\u0c36\u0001\u0002\u0c39\u0001\u0002\u0c3c\u0001\u0002\u0c3f\u0001\u0002\u0c42\u0001\u0002\u0c45\u0001\u0002\u0c48\u0001\u0002\u0c4b\u0001\u0002\u0c4e\u0001\u0002\u0c51\u0001\u0002\u0c54\u0001\u0002\u0c57\u0001\u0002\u0c5a\u0001\u0002\u0c5d\u0001\u0002\u0c60" +
"\u0001\u0002\u0c63\u0001\u0002\u0c66\u0001\u0002\u0c69\u0001\u0002\u0c6c\u0001\u0002\u0c6f\u0001\u0002\u0c72\u0001\u0002\u0c75\u0001\u0002\u0c78\u0001\u0002\u0c7b\u0001\u0002\u0c7e\u0001\u0002\u0c81\u0001\u0002\u0c84\u0001\u0002\u0c87\u0001\u0002\u0c8a\u0001\u0002\u0c8d\u0001\u0002\u0c90\u0001\u0002\u0c93\u0001\u0002\u0c96\u0001\u0002\u0c99\u0001\u0002\u0c9c\u0001\u0002\u0c9f\u0001\u0002\u0ca2\u0001\u0002\u0ca5\u0001\u0002\u0ca8" +
"\u0001\u0002\u0cab\u0001\u0002\u0cae\u0001\u0002\u0cb1\u0001\u0002\u0cb4\u0001\u0002\u0cb7\u0001\u0002\u0cba\u0001\u0002\u0cbd\u0001\u0002\u0cc0\u0001\u0011\u0cd2\u0cd3\u0cd4\u0cd5\u0cd6\u0cd7\u0cd8\u0cd9\u0cda\u0cdb\u0cdc\u0cdd\u0cde\u0cdf\u0ce0\u0ce1\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0009\u0ceb\u0351\u0cee\u0cef\u0362\u0363\u0579\u0cf0\u0003\u08db\u004c\u0001\u0001" +
"\u0001\u0007\u0cf8\u0cf9\u0cfa\u0cfb\u02fd\u02fe\u0001\u0001\u0001\u0001\u0030\u0704\u0799\u089b\u0704\u0d2c\u0d2d\u0d2e\u0d2f\u0d30\u0d31\u0d32\u0d33\u0d34\u0d35\u0d36\u0d37\u0d38\u0d39\u0d3a\u0d3b\u033f\u013e\u013f\u0340\u0141\u0142\u0341\u0143\u0144\u0145\u0342\u0146\u0147\u0148\u0343\u0d3c\u0d3d\u0d3e\u0d3f\u0d40\u0d41\u0d42\u0d43\u0d44\u0d45\u0d46\u0d47\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001" +
"\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0020\u0705\u09d0\u0cd3\u0cf9\u0d2c\u0d68\u0d6f\u0d78\u0d79\u0095\u0d7a\u0d7b\u0d7c\u0d7d\u0d7e\u0d7f\u0d80\u0d81\u0d82\u0709\u0d83\u031e\u00b7\u031f\u0321\u0d7f\u0325\u0329\u0d84\u0d85\u0d86\u0004\u0d6c\u0d6d\u0d6e\u0001\u0001\u0001\u0003\u0d72\u0d75\u0003\u0000\u0000\u0003\u0000\u0000\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001" +
"\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0050\u0dd7\u0dd8\u0ddc\u0de0\u0de1\u0de2\u0de3\u0de4\u0de5\u0de6\u0de7\u0de8\u0de9\u0dea\u0deb\u0dec\u0ded\u0dee\u0def\u0df0\u0df1\u0df2\u0df3\u0df4\u0df5\u0df6\u0df7\u0df8\u0df9\u0de0\u01ed\u01ee\u01ef\u01f0\u01f1\u01f2\u01f3\u01f4\u01f5\u01fd\u01fe\u01ff\u0200\u0204\u0205\u0206\u020d\u020e\u020f\u0210\u0dfa\u0ddf\u0081\u0dfd\u012f\u0214\u07b3\u0dfe\u0dff\u0e00\u0e01\u0e02\u0e03\u0d46" +
"\u0e04\u0e05\u0e06\u0e07\u0e08\u0e09\u0e0a\u0e0b\u0d47\u0e0c\u0e0d\u07bf\u0ddb\u0215\u0e0e\u0001\u0003\u0ddb\u0215\u0001\u0003\u0ddf\u0081\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0003\u0ddf\u0081\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0028" +
"\u0d78\u0e37\u0e37\u0e38\u0e39\u0e3a\u0d7b\u0e3b\u0e3c\u0e3d\u0e3e\u0e3f\u0e40\u0e41\u0e42\u00b4\u0e43\u00b7\u00ba\u00bb\u00bc\u0380\u0e44\u0383\u00c6\u0e45\u0e46\u00c9\u0e47\u0e48\u0e49\u0e4a\u0e4b\u0e4c\u00ce\u0e4d\u0e4e\u0e4f\u0e50\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0004\u0351\u0e55\u0e56\u0001\u0001\u000b" +
"\u0e62\u0e65\u0e66\u0e67\u0e68\u0e69\u0e6a\u0e6b\u0e6c\u04e3\u0002\u0e64\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0004\u0e71\u0e72\u04e4\u0001\u0001\u0005\u0e78\u0e79\u0e7a\u04e5\u0001\u0001\u0001\u0002\u0e7d\u0001\u0003\u0e81\u0e82\u0001\u0001\u0002\u0e85\u0001\u0002\u0e88\u0001\u0006\u0e8f\u0e90\u0d79\u0e91\u0e92\u0001\u0001\u0001\u0001\u0011\u0ea4\u0d2d\u0d30\u0d33\u0d37\u0ea5\u0ea6\u0d3b\u0ea7\u033f\u0340\u0341" +
"\u0342\u0ea8\u0ea9\u0343\u0001\u0001\u0001\u0001\u0001\u0001\u001e\u0707\u079a\u08a0\u0093\u0ec8\u0ec9\u0eca\u0ecb\u0ecc\u0ecd\u0ece\u0ecf\u0ed0\u0ed1\u0ed2\u0ed3\u0ed4\u0ed5\u0ecb\u0105\u0106\u0107\u010d\u010e\u0110\u0111\u0112\u0114\u0ed6\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0021\u0e38\u0ef8\u0ef9\u0efa\u0efa\u0efb\u0efc\u0efd\u0efe\u0eff\u0f00\u0f01\u0f02\u0f03\u0f04\u0f05" +
"\u0efa\u0f06\u0efa\u026b\u0efe\u0eff\u026c\u0f07\u0f03\u0efa\u0efe\u0efa\u0f08\u0efe\u0270\u0f09\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0015\u0708\u079b\u08a1\u0f1f\u0ecc\u0f20\u0f21\u0f22\u0f23\u0f24\u0f25\u0f26\u0f20\u0170\u0172\u0175\u0177\u0178\u0f27\u0f28\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0020\u0f49\u0f4a\u0f51\u0f52\u0f53\u0f54" +
"\u0f55\u0f56\u0f57\u0f58\u0f59\u02e7\u0f63\u02e8\u02e9\u02ea\u02eb\u02ec\u0f60\u0f61\u0f62\u0196\u0198\u0185\u0f66\u02ed\u0f4f\u02ee\u0f50\u02ef\u0f67\u0001\u0005\u0f4f\u0f50\u02ee\u02ef\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0007\u0f60\u0f61\u0f62\u0196\u0198\u0185\u0001\u0001\u0001\u0003\u0f66\u02ed\u0001\u0001\u0015\u079c\u08a2\u0f7d\u0cee\u0d2d\u0d7a\u0d2d\u0f22\u0cee\u0f7e\u0f7f\u0f22\u0d7a\u0f80\u0cee" +
"\u0f7e\u0f7f\u0f81\u079c\u08a2\u0001\u0001\u0001\u0001\u0001\u0003\u0de7\u0f85\u0001\u000c\u08a3\u0d2e\u0de8\u0e3a\u0ecd\u0efa\u0f92\u0f93\u0f94\u0f95\u0f96\u0001\u0001\u0001\u0001\u0001\u0007\u0d2f\u0d7b\u0de9\u0ece\u0f9e\u0f9e\u0001\u0012\u079d\u08a4\u0d30\u0d7c\u0dea\u0d30\u0ecf\u0efa\u0f23\u0fb1\u0f23\u0d7c\u0fb2\u0fb1\u0fb3\u079d\u08a4\u0001\u0001\u0001\u0006\u0deb\u0fba\u0fbd\u0fbf\u0fc1\u0003\u0000\u0000\u0002\u0000\u0002" +
"\u0000\u0001\n\u0fcc\u0d31\u0dec\u0fcd\u0fcc\u0fce\u0fcc\u0fd4\u0fcc\u0001\u0001\u0002\u0fd0\u0004\u0000\u0000\u0000\u0001\u0002\u0d32\u0010\u079f\u08a6\u0d33\u0d7d\u0dee\u0d33\u0f24\u0fe7\u0f24\u0d7d\u0fe8\u0fe7\u0fe9\u079f\u08a6\u0001\u0001\u0001\u0003\u08a7\u08a7\u0003\u0d34\u0d7e\n\u08ab\u0d35\u0d7f\u0e3e\u0ed0\u0efb\u0ffa\u1001\u0e42\u0002\u0ffc\u0002\u0ffe\u0003\u0000\u0000\u0001\u0002\u0def\u000c\u08ad\u0d36\u0ed1" +
"\u0efc\u1010\u1011\u1012\u1010\u1011\u1012\u1013\u0001\u0001\u0001\u0001\u0016\u07a0\u08ae\u0d37\u0d80\u0e3f\u0d37\u0f25\u0a95\u0f94\u102a\u102b\u102c\u102d\u102e\u0f25\u0d80\u102f\u102a\u1030\u07a0\u08ae\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0006\u1037\u0df2\u0efe\u1037\u1038\u0001\u0001\u0003\u103c\u103c\u0001\u0009\u08b0\u0d38\u0ed2\u0eff\u102b\u1046\u1046\u1047\u0001\u0001\u000c\u102c\u08b1\u0d39\u0df4\u0ea5\u0ed3\u1054" +
"\u102c\u1055\u1055\u1056\u0001\u0001\u0001\u000c\u0d3a\u0e40\u0df5\u0e40\u0ea6\u0ed4\u0f00\u1063\u1064\u1063\u1065\u0001\u0001\u0002\u0000\u002d\u1094\u109a\u07a1\u08b2\u0cef\u0d3b\u0d81\u0d3b\u0f26\u0f7d\u109e\u0fcc\u109f\u10a0\u10a1\u0f26\u0d81\u10a2\u10a3\u10a4\u10a5\u10a6\u10a7\u10a8\u10a9\u07a1\u08b2\u10aa\u10ad\u10ae\u10af\u10b0\u10b1\u10b2\u10b3\u10b4\u10b5\u10b6\u10b7\u10b8\u10b9\u10ba\u10bb\u10bc\u0002\u1096\u0003\u1099" +
"\u0149\u0001\u0003\u109d\u0251\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0003\u1099\u0149\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0006\u0e42\u0ecd\u0ed3\u0ed5\u10c3\u0001\u0003\u0f02\u10c7\u0001\u0002\u102d\u0008\u07a4\u08b4\u0f03\u10d2\u10d3\u07a4\u08b4\u0001\u0001\u0006\u08b5\u0df9\u0ed5\u10da\u10da\u0001\u0002\u10dd\u0001\u0008\u0d82" +
"\u0f58\u10e6\u10e9\u10ee\u10f1\u10f2\u0003\u0000\u0000\u0002\u10eb\u0003\u0000\u0000\u0003\u0000\u0000\u0001\u0001\u0002\u10dd\u004e\u1143\u04de\u04df\u04e0\u04e1\u0de0\u0e42\u04e2\u04e3\u04e4\u04e5\u04e6\u04e7\u04e8\u04e9\u04ea\u04eb\u04ec\u0f22\u114d\u0f23\u114e\u114f\u0f24\u1150\u0f25\u1151\u0f26\u10c7\u10d2\u1152\u1153\u0170\u0171\u0172\u0173\u0174\u0175\u0176\u0177\u0184\u0178\u0179\u017d\u017e\u0097\u1166\u1169\u116c\u116f" +
"\u1172\u1175\u0186\u0189\u018c\u018f\u1178\u0192\u114b\u0197\u114c\u019a\u04e1\u117b\u117c\u117d\u117e\u117f\u1180\u1181\u1182\u1183\u1184\u1185\u1186\u1187\u1188\u0007\u114a\u114b\u114c\u0195\u0197\u019a\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0013\u0352\u035a\u04f2\u04f3\u04f5\u0354\u0353\u0357\u0358\u04fd\u04fe\u04ff\u050e\u0510\u0516\u0517\u0518\u0523\u0003\u0000\u0000\u0003\u0000\u0000\u0003\u0000\u0000\u0003" +
"\u0000\u0000\u0003\u0000\u0000\u0003\u0000\u0000\u0003\u0000\u0000\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0058\u0709\u11e1\u11e8\u11f2\u0463\u0464\u0465\u0466\u11f3\u0467\u0468\u0469\u046a\u046b\u046c\u046d\u046e\u046f\u0470\u11fc\u0ecb\u0471\u0f20\u0d7a\u0d7c\u1200\u0d7d\u0d80\u0d81\u1201\u0709\u0709\u031e\u031f\u0320\u0321\u0325\u0329\u032a\u1202\u11ef\u1206\u1205\u11f0\u11f1\u032b" +
"\u032c\u032d\u032e\u032f\u11fa\u0212\u1207\u1208\u1209\u0331\u0332\u0333\u120a\u120d\u1210\u1211\u1214\u1217\u1218\u121b\u0334\u121e\u1221\u0335\u11e6\u0336\u11e7\u0337\u1224\u1225\u0466\u1226\u1227\u1228\u1229\u122a\u122b\u122c\u122d\u122e\u122f\u0005\u11e6\u11e7\u0336\u0337\u0001\u0001\u0007\u11ef\u11f0\u11f1\u032b\u032e\u032f\u0001\u0001\u0001\u0001\u0007\u11fa\u0d72\u11fb\u0212\u0d75\u0213\u0001\u0001\u0003\u11ff\u0330\u0001" +
"\u0001\u0001\u0003\u1205\u032d\u0001\u0001\u0001\u0001\u0001\u0003\u0000\u0000\u0003\u0000\u0000\u0001\u0003\u0000\u0000\u0003\u0000\u0000\u0001\u0003\u0000\u0000\u0003\u0000\u0000\u0003\u0000\u0000\u0003\u0000\u0000\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0046\u1276\u127d\u129a\u12b5\u0f80\u0fb2\u0fe8\u12bc\u102f\u10a2\u12bd\u12be\u12bf\u12c9\u12d0\u02b7\u12ef\u02b8\u02b9\u02ba\u02bb\u02bf\u02c0" +
"\u02c1\u12f3\u12c6\u12c7\u12c8\u127b\u017f\u0181\u0182\u02c5\u12f2\u02c6\u12ce\u02c7\u12cf\u02c8\u12ba\u02c9\u12bb\u02ca\u12f8\u12f9\u12fa\u12fb\u12fc\u12fd\u12fe\u02d1\u02d2\u02d3\u02d4\u02d5\u02d6\u02d7\u12ff\u1302\u1303\u1304\u1307\u130a\u130d\u02d8\u02d9\u1310\u1313\u1316\u0005\u127b\u02c5\u127c\u05a9\u0001\u0001\u000f\u128c\u128d\u128e\u128f\u1290\u1291\u1292\u1293\u1294\u1295\u1296\u1297\u1298\u1299\u0001\u0001\u0001\u0001" +
"\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u000e\u12a8\u12a9\u12aa\u12ab\u12ac\u12ad\u12ae\u12af\u12b0\u12b1\u12b2\u12b3\u12b4\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0005\u12ba\u12bb\u02c9\u02ca\u0001\u0001\u0001\u0001\u0001\u0007\u12c6\u12c7\u12c8\u017f\u0181\u0182\u0001\u0001\u0001\u0005\u12ce\u12cf\u02c7\u02c8\u0001\u0001\r\u12dd\u12e0\u12e3\u12e6\u12e9\u12ec\u0285" +
"\u0288\u028b\u028e\u0291\u0294\u0003\u0000\u0000\u0003\u0000\u0000\u0003\u0000\u0000\u0003\u0000\u0000\u0003\u0000\u0000\u0003\u0000\u0000\u0003\u12f2\u02c6\u0001\u0005\u12ce\u12cf\u02c7\u02c8\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0003\u0000\u0000\u0001\u0001\u0003\u0000\u0000\u0003\u0000\u0000\u0003\u0000\u0000\u0003\u0000\u0000\u0003\u0000\u0000\u0003\u0000\u0000\u0003\u0000\u0000\u0012\u057a\u0037\u10a3\u0362\u033f\u031e" +
"\u033f\u0170\u0f7e\u0170\u031e\u02b7\u0362\u132b\u0540\u057a\u0037\u0001\u0021\u134d\u1350\u01ee\u0f7d\u109e\u0fcc\u109f\u10a0\u10a1\u10a3\u10a4\u10a5\u10a6\u10a7\u10a8\u1353\u10ad\u10ae\u10af\u10b0\u10b1\u10b2\u10b3\u10b4\u10b5\u10b6\u10b7\u10b8\u10b9\u10ba\u10bb\u10bc\u0003\u109d\u0251\u0003\u1099\u0149\u0003\u1099\u0149\u002c\u1382\u0038\u013e\u01ef\u0e43\u0105\u0efa\u1386\u0ecd\u0ece\u0ecf\u1387\u1388\u1389\u138a\u0ed0\u0ed1" +
"\u138b\u0ed2\u0ed3\u0ed4\u138c\u0ed5\u0104\u0105\u0106\u0107\u0108\u0109\u010a\u010b\u010c\u010d\u010e\u010f\u0110\u0111\u0112\u0113\u0114\u0e43\u1385\u0115\u0003\u1385\u0115\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0008\u013f\u00b7\u01f0\u0106\u0f06\u1395\u1396\u0001\u0001\u0011\u057e\u0039\u0340\u031f\u01f1\u0340\u0107\u0efa\u0172\u0172\u031f\u02b8\u13a8\u0541\u057e\u0039\u0001\u0007\u01f2\u13b0\u13b1\u13b3\u13b5\u13b0" +
"\u0001\u0002\u0000\u0002\u0000\u0002\u0000\n\u10a5\u0141\u01f3\u10a5\u13c1\u0fcd\u10a5\u13c7\u10a5\u0002\u13c3\u0004\u0000\u0000\u0000\u0003\u0000\u0000\u0002\u0142\u000f\u0580\u003b\u0341\u0321\u01f5\u0341\u0175\u0175\u0321\u02b9\u13db\u0542\u0580\u003b\u0001\u0003\u003c\u003c\u0003\u0143\u13e2\u0001\u0008\u0040\u0144\u0d7f\u0380\u010d\u1001\u0e42\u0004\u01fd\u0e44\u0e45\u0006\u0042\u0145\u010e\u13f5\u0543\u0001\u001a\u0590" +
"\u0043\u0342\u0325\u0383\u0342\u0177\u0cee\u0cef\u0177\u0325\u02bb\u0362\u0f94\u1410\u0351\u102b\u102c\u0363\u0364\u102d\u0365\u0544\u0590\u0043\u0001\u0005\u1037\u0200\u0efe\u1416\u0002\u1418\u0003\u0000\u0000\u0005\u0045\u0146\u0110\u0eff\u000b\u102c\u0046\u0147\u0205\u0ea8\u0111\u1054\u102c\u142b\u0147\u0001\n\u0148\u00c6\u0206\u00c6\u0ea9\u0112\u1436\u1064\u1437\u0001\u0002\u0000\u001b\u0595\u0047\u0363\u0343\u0329\u0e45" +
"\u0343\u0178\u0f7d\u109e\u0fcc\u109f\u10a0\u10a1\u0178\u0329\u02bf\u10a3\u10a4\u10a5\u10a6\u10a7\u10a8\u0545\u0595\u0047\u0024\u0e46\u1386\u0ecd\u0ece\u0ecf\u1387\u1388\u1389\u138a\u0ed1\u138b\u0ed2\u0ed3\u0ed4\u138c\u0ed5\u0104\u0105\u0106\u0107\u0108\u0109\u010a\u010b\u010c\u0e42\u010e\u010f\u0110\u0111\u0112\u0113\u0114\u0091\u0546\u0002\u0179\u0003\u102d\u147d\u0001\u0008\u0598\u0049\u0f03\u017d\u0547\u0598\u0049\u0004\u004a" +
"\u0210\u0114\u0002\u148c\u0001\u0012\u149f\u14a0\u0f85\u0f96\u0fd4\u1056\u0097\u0e43\u0091\u14a1\u14a2\u14a3\u14a4\u14a5\u14a6\u14a7\u14a8\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u002f\u14d8\u14dc\u14f1\u1504\u0e56\u0f81\u0fb3\u0fe9\u1013\u1030\u10a9\u10c3\u10d3\u150b\u0540\u1515\u0541\u0542\u0543\u0544\u0545\u0546\u0547\u14a1\u1519\u0599\u1512\u1513\u1514\u0180\u0199\u0183\u1518\u0549\u1509\u02ff\u150a\u0300" +
"\u151a\u151b\u151c\u151d\u151e\u151f\u1520\u1521\u0003\u14db\u05aa\u0001\u000b\u14e7\u14e8\u14e9\u14ea\u14eb\u14ec\u14ed\u14ee\u14ef\u14f0\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\n\u14fb\u14fc\u14fd\u14fe\u14ff\u1500\u1501\u1502\u1503\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0005\u1509\u150a\u02ff\u0300\u0001\u0001\u0007\u1512\u1513\u1514\u0180\u0199\u0183\u0001\u0001\u0001\u0003\u1518\u0549" +
"\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0017\u0857\u0579\u0f27\u079c\u079d\u079f\u07a0\u07a1\u07a4\u1539\u057a\u057e\u0580\u0590\u0595\u0598\u153a\u0857\u05ab\u059a\u153b\u153c\u0001\u0001\u0001\u0001\u0037\u1574\u1579\u1580\u1585\u0d7a\u0d7c\u1200\u0d7d\u0d80\u0d81\u1201\u031e\u031f\u0320\u0321\u0325\u0329\u032a\u1588\u11ef\u1206\u1205\u11f0\u11f1\u032b\u032c\u032d\u032e\u032f\u11fa\u0212\u1207\u1208\u1209" +
"\u0331\u0332\u0333\u120a\u120d\u1210\u1211\u1214\u1217\u1218\u121b\u0334\u121e\u1221\u0335\u11e6\u0336\u11e7\u0337\u158b\u0005\u11e6\u11e7\u0336\u0337\u0007\u11ef\u11f0\u11f1\u032b\u032e\u032f\u0005\u11fa\u11fb\u0212\u0213\u0003\u11ff\u0330\u0003\u1205\u032d\u0001\u0077\u1603\u160a\u1619\u1627\u162c\u162f\u08a2\u08a3\u08a4\u08a5\u08a6\u08a7\u08aa\u08ab\u08ac\u08ad\u08ae\u08af\u08b0\u08b1\u08b2\u08b3\u08b4\u08b5\u1632\u1639\u0037" +
"\u163e\u0038\u0039\u003a\u003b\u003c\u003f\u0040\u0041\u0042\u0043\u0044\u0045\u0046\u0047\u0048\u0049\u004a\u1641\u1646\u164b\u08bd\u08db\u08dc\u08da\u08be\u0858\u08bf\u08d0\u089f\u0859\u004b\u004c\u004d\u004e\u004f\u0050\u0051\u0052\u0053\u0054\u08ca\u0055\u08c5\u0059\u08c6\u005a\u08d1\u005b\u0899\\\u089a\u005d\u08dd\u08de\u08df\u08e0\u08e1\u08e2\u08e3\u005e\u005f\u0060\u0061\u0062\u0063\u08e4\u08e5\u08e8\u08e9\u08ec\u08ef" +
"\u08f0\u08f3\u08f6\u08f9\u08fc\u08ff\u0902\u0064\u0067\u0068\u006b\u006e\u006f\u0905\u0072\u0075\u0078\u007b\u007e\u0007\u0858\u0859\u0050\u0054\u085a\u059d\u000f\u086b\u086c\u086d\u086e\u086f\u0870\u0871\u0872\u0873\u0874\u0875\u0876\u0877\u0878\u000e\u0887\u0888\u0889\u088a\u088b\u088c\u088d\u088e\u088f\u0890\u0891\u0892\u0893\u0005\u0899\u089a\\\u005d\u0003\u08da\u004e\u0003\u089f\u0053\u0007\u08bd\u08be\u08bf\u004b\u004f" +
"\u0051\u0005\u08c5\u08c6\u0059\u005a\u0003\u08ca\u0055\u0005\u08d0\u08d1\u0052\u005b\u0005\u08c5\u08c6\u0059\u005a\u0003\u08da\u004e\u0017\u0d2e\u0d2f\u1665\u0d31\u0d32\u0d34\u0d35\u0d36\u0d38\u0d39\u0d3a\u013e\u013f\u0140\u0141\u0142\u0143\u0144\u0145\u0146\u0147\u0148\u0001\u0002\u1668\u0001\u0003\u0fcc\u10a5\u0002\u08dd\u0002\u08de\u0002\u08df\u0003\u07b1\u08e0\u0002\u08e1\u0003\u07b2\u08e2\u0002\u08e3\u0002\u005e\u0002\u005f" +
"\u0002\u0060\u000e\u059b\u1690\u16b3\u16c0\u16cd\u16f0\u1713\u1727\u1728\u1729\u172a\u172b\u172c\u0006\u1696\u16a3\u16b0\u16b1\u16b2\u0007\u169d\u169e\u169f\u16a0\u16a1\u16a2\u0001\u0001\u0001\u0001\u0001\u0001\u0007\u16aa\u16ab\u16ac\u16ad\u16ae\u16af\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0007\u16ba\u16bb\u16bc\u16bd\u16be\u16bf\u0001\u0001\u0001\u0001\u0001\u0001\u0007\u16c7\u16c8\u16c9\u16ca\u16cb\u16cc\u0001" +
"\u0001\u0001\u0001\u0001\u0001\u0006\u16d3\u16e0\u16ed\u16ee\u16ef\u0007\u16da\u16db\u16dc\u16dd\u16de\u16df\u0001\u0001\u0001\u0001\u0001\u0001\u0007\u16e7\u16e8\u16e9\u16ea\u16eb\u16ec\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0006\u16f6\u1703\u1710\u1711\u1712\u0007\u16fd\u16fe\u16ff\u1700\u1701\u1702\u0001\u0001\u0001\u0001\u0001\u0001\u0007\u170a\u170b\u170c\u170d\u170e\u170f\u0001\u0001\u0001\u0001\u0001\u0001" +
"\u0001\u0001\u0001\u0006\u1719\u1720\u16b0\u16b1\u16b2\u0007\u169d\u169e\u169f\u16a0\u16a1\u16a2\u0007\u16aa\u16ab\u16ac\u16ad\u16ae\u16af\u0001\u0001\u0001\u0001\u0001\u0001\u0002\u0062\u0003\u059c\u0063\u0002\u08e4\u0007\u07b3\u07b3\u1210\u173b\u173b\u1210\u0001\u0005\u1741\u1741\u1743\u1743\u0002\u0000\u0002\u0000\u000f\u1754\u1755\u1756\u1757\u1759\u1754\u1755\u1756\u1757\u1759\u175a\u175a\u1756\u1756\u0001\u0001\u0001\u0002" +
"\u0000\u0001\u0002\u0000\u000b\u0d3c\u0dfe\u0e48\u0e48\u1767\u1768\u0e48\u1767\u1768\u0e48\u0001\u0001\r\u1776\u1776\u1778\u1779\u1776\u1776\u1778\u1779\u1776\u1776\u177b\u177b\u0002\u0000\u0001\u0002\u0000\u0001\u0002\u0efa\u0002\u0dff\u0004\u0efe\u1784\u1784\u0001\u0005\u1210\u173b\u1210\u173b\u0002\u0e00\u000b\u0d3d\u0e01\u1767\u1797\u1768\u1797\u1767\u1797\u1768\u1797\u0001\u0005\u0d3e\u0e02\u179d\u179d\u0001\u0002\u0e03" +
"\u0007\u0d3f\u17a7\u1012\u17a8\u1012\u17a8\u0001\u0001\u0005\u17ae\u17af\u17ae\u17af\u0001\u0001\u0003\u17b3\u17b3\u0001\u0002\u0efa\u0009\u17bf\u17bf\u17c0\u17c1\u17bf\u17c0\u17c1\u17bf\u0001\u0001\u0001\u000b\u173b\u10b7\u173b\u10b7\u1217\u173b\u10b7\u1217\u173b\u10b7\u0003\u0d40\u0e04\u0002\u0e05\u0003\u17d5\u17d5\u0001\u0011\u07b3\u1741\u17e7\u17e8\u17e9\u07b5\u1743\u17ea\u1741\u17e7\u17e8\u17e9\u07b5\u1743\u17ea\u07b3\u0001" +
"\u0001\u0001\u0002\u0000\u0009\u17f5\u17f6\u17f7\u1806\u1807\u1809\u180a\u1806\u0001\u0001\u000f\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0002\u0000\u0001\u0002\u0000\u0002\u180e\u0019\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0007\u0d41\u0e06\u0e4a\u182e\u182f\u0e4a\u0001\u0001" +
"\u0007\u1837\u1839\u183a\u1837\u1837\u183c\u0002\u0000\u0001\u0002\u0000\u0001\u0002\u183f\u0010\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0002\u0e07\u0003\u0efe\u1854\u0001\u0003\u0334\u1858\u0001\u0003\u0e08\u185c\u0010\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0007\u0d42\u0e09\u182e\u1873\u182f\u1873\u0001\u0004\u0d43\u0e0a\u1878" +
"\u0001\u0002\u0e0b\u0005\u0d44\u1880\u1881\u1891\u0001\u0010\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0004\u1896\u1897\u1898\u0001\u0001\u0019\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0003\u102c\u18b4\u0001\u0005\u18ba\u18bb\u18bc\u18ba\u0001\u0001\u0001\u0007\u1858\u10bc" +
"\u0335\u18c4\u1858\u10bc\u0013\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0004\u0d45\u0e0c\u18db\u0019\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u000f\u0e0d\u17f7\u180e\u183f\u185c\u1881\u1898\u18c4\u18db\u1903\u1915\u192e\u185c\u193e\u0012\u0000\u0000\u0000\u0000" +
"\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0019\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0010\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0010\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0002\u1950" +
"\u0001\u0002\u1915\n\u195d\u195f\u1960\u1961\u07be\u192e\u1962\u1964\u07bf\u0002\u0000\u0001\u0001\u0001\u0002\u0000\u0002\u0000\u0005\u07bf\u07bf\u1858\u0334\u0004\u195d\u185c\u1962\u0003\u17ae\u17ae\u0002\u1896\u0002\u193e\u0002\u1978\u0002\u0000\u0003\u197d\u197f\u0002\u0000\u0002\u0000\u0002\u1983\u0002\u0000\u0002\u1987\u0002\u0000\u0017\u19a0\u19a2\u19a4\u19a6\u19a8\u19aa\u19ac\u19ae\u19b0\u19b2\u19b4\u19b6\u19b8\u19ba" +
"\u19bc\u19be\u19c0\u19c2\u19c4\u19c6\u19c8\u19ca\u0002\u0000\u0002\u0000\u0002\u0000\u0002\u0000\u0002\u0000\u0002\u0000\u0002\u0000\u0002\u0000\u0002\u0000\u0002\u0000\u0002\u0000\u0002\u0000\u0002\u0000\u0002\u0000\u0002\u0000\u0002\u0000\u0002\u0000\u0002\u0000\u0002\u0000\u0002\u0000\u0002\u0000\u0002\u0000\u0004\u19d0\u19d2\u19d4\u0002\u0000\u0002\u0000\u0002\u0000\u0004\u19da\u19de\u19dc\u0002\u19dc\u0002\u0000\u0002\u0000" +
"\u0004\u19e4\u19e8\u19e6\u0002\u19e6\u0002\u0000\u0002\u0000\u0008\u19f2\u1a07\u1a08\u1a09\u1a0a\u1a09\u1a0a\u0015\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0001\u0001\u0015\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0005\u1a24\u1a25\u1a26\u1a27\u0001\u0001\u0001\u0001" +
"\u0002\u1a2a\u0001\u0002\u1a2d\u0010\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0004\u1a25\u1a41\u1a42\u0001\u0001\u0002\u1a45\u0001\u0002\u1a26\n\u1a52\u1a53\u1a54\u1a55\u1a56\u1a6c\u1a55\u1a56\u1a6c\u0001\u0001\u0001\u0001\u0016\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0016\u0000\u0000\u0000" +
"\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0003\u1a85\u1a85\u0001\u0002\u1a88\u0001\u0002\u1a8b\u0001\u0004\u1a90\u1aa2\u1aa2\u0012\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0006\u1a27\u1aa9\u1abc\u1acf\u1acf\u0013\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000" +
"\u0000\u0000\u0000\u0000\u0013\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0013\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0009\u1aeb\u1aec\u1a53\u1aa9\u1aed\u1afd\u1afe\u1afe\u0001\u0001\u0010\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0001\n" +
"\u1b09\u1a54\u1a88\u1abc\u1b0a\u1afd\u1a08\u1afd\u1a08\u0001\u0011\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\n\u1b25\u1b26\u1a55\u1acf\u1b27\u1afe\u1a09\u1afe\u1a09\u0001\u0001\u0010\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0002\u1b39\u0001\u0007\u1a07\u1a54\u1a55\u1b41\u1b42\u1a53\u0001\u0001\u0002\u1a52\u0009\u1a0a\u1a42" +
"\u1a56\u1aa2\u1afd\u1afe\u1b4e\u1afe\u0013\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0006\u1a6c\u1a08\u1a09\u1b67\u1a09\u001c\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\n\u1b25\u1b26\u1a55\u1acf\u1afe\u1a09\u1b27\u1afe\u1a09\u0009\u1a0a\u1a42" +
"\u1a56\u1aa2\u1afd\u1afe\u1afe\u1b4e\u0006\u1a6c\u1a08\u1a09\u1a09\u1b67\u000c\u1ba8\u1ba9\u1baa\u1bab\u1bac\u1bad\u1bae\u1baf\u1bb0\u1bb1\u1bb2\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0004\u1bb7\u1bb8\u1bb9\u0001\u0001\u0001\u0003\u1bbd\u1bbe\u0001\u0001\u0007\u1bc6\u1bc7\u1bc8\u1bc9\u1bca\u1bcb\u0001\u0001\u0001\u0001\u0001\u0001\u0003\u1bcf\u1bd0\u0001\u0001\u0004\u1bd5\u1bd6\u1bd7\u0001\u0001\u0001" +
"\u0003\u1bdb\u1bdc\u0001\u0001\u0002\u1bdf\u0001\u0002\u1be2\u0001\u0002\u1be5\u0001\u0002\u1be8\u0001\u0004\u1bed\u1bee\u1bef\u0001\u0001\u0001\u0002\u1bf2\u0001\u0003\u1bf6\u1bf7\u0001\u0001\u0002\u1bfa\u0001\u0004\u1bff\u1c00\u1c01\u0001\u0001\u0001\u0002\u1c04\u0001\u0004\u1c09\u1c0a\u1c0b\u0001\u0001\u0001\u0002\u1c0e\u0001\u0002\u1c11\u0001\u0002\u1c14\u0001\u0002\u1c17\u0001\u0002\u1c1a\u0001\u0002\u1c1d\u0001\u0002\u1c20" +
"\u0001\u0002\u1c23\u0001\u0002\u1c26\u0001\u0006\u1c2d\u1c2e\u1c2f\u1c30\u1c31\u0001\u0001\u0001\u0001\u0001\u0002\u1c34\u0001\u0002\u1c37\u0001\u0005\u1c3d\u1c3e\u1c3f\u1c40\u0001\u0001\u0001\u0001\u0003\u1c44\u1c45\u0001\u0001\u0005\u1c4b\u1c4c\u1c4d\u1c4e\u0001\u0001\u0001\u0001\u0003\u1c52\u1c53\u0001\u0001\u0011\u1c65\u1c66\u1c67\u1c68\u1c69\u1c6a\u1c6b\u1c6c\u1c6d\u1c6e\u1c6f\u1c70\u1c71\u1c72\u1c73\u1c74\u0001\u0001\u0001" +
"\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0002\u1c70\u0011\u1c88\u1c89\u1c8a\u1c8b\u1c8c\u1c8d\u1c8e\u1c8f\u1c90\u1c91\u1c92\u1c93\u1c94\u1c95\u1c96\u1c97\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0002\u1c8f\u000c\u1ca6\u1ca7\u1ca8\u1ca9\u1caa\u1cab\u1cac\u1cad\u1cae\u1caf\u1cb0\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001" +
"\u0001\u0003\u1cb4\u1cb5\u0001\u0001\u0003\u1cb9\u1cba\u0001\u0001\u0003\u1cbe\u1cbf\u0001\u0001\u0002\u1cc2\u0001\u0006\u1c71\u1c72\u1c73\u1c6a\u1c74\u0002\u1c97\u0002\u1ccd\u0001\u0002\u1cd0\u0001\u0002\u1cd3\u0001\u0002\u1cd6\u0001\u0004\u1cdb\u1cdc\u1cdd\u0001\u0001\u0001\u0004\u1ce2\u1ce3\u1ce4\u0001\u0001\u0001\u0005\u1cea\u1ceb\u1cec\u1ced\u0001\u0001\u0001\u0001\u0004\u1cf2\u1cf3\u1cf4\u0001\u0001\u0001\u0009\u1cfe\u1cff" +
"\u1d00\u1d01\u1d02\u1d03\u1d04\u1d05\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0002\u1cff\u0006\u1d0e\u1d0f\u1d10\u1d11\u1d12\u0001\u0001\u0001\u0001\u0001\u0009\u1d1c\u1d1d\u1d1e\u1d1f\u1d20\u1d21\u1d22\u1d23\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0003\u1d23\u1d1f\u0008\u1d2f\u1d30\u1d31\u1d32\u1d33\u1d34\u1d35\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0004\u1d3a\u1d3b\u1d3c\u0001\u0001\u0001\u0002\u1d3f\u0001" +
"\u0007\u1d47\u1d48\u1d49\u1d4a\u1d4b\u1d4c\u0001\u0001\u0001\u0001\u0001\u0001\u0005\u1d52\u1d53\u1d54\u1d55\u0001\u0001\u0001\u0001\u0005\u1d5b\u1d5c\u1d5d\u1d5e\u0001\u0001\u0001\u0001\u0002\u1d5e\u0008\u1d69\u1d6a\u1d6b\u1d6c\u1d6d\u1d6e\u1d6f\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0003\u1d73\u1d74\u0001\u0001\u0015\u1d8a\u1d8b\u1d8c\u1d8d\u1d8e\u1d8f\u1d90\u1d91\u1d92\u1d93\u1d94\u1d95\u1d96\u1d97\u1d98\u1d99\u1d9a\u1d9b" +
"\u1d9c\u1d9d\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0002\u1d8b\u0003\u1d98\u1d99\u0004\u1d91\u1d9b\u1d9a\u0002\u1d93\n\u1db3\u1db4\u1db5\u1db6\u1db7\u1db8\u1db9\u1dba\u1dbb\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0006\u1dc2\u1dc3\u1dc4\u1dc5\u1dc6\u0001\u0001\u0001\u0001\u0001\u0006\u1dcd\u1dce\u1dcf\u1dd0\u1dd1\u0001\u0001\u0001" +
"\u0001\u0001\u0005\u1dd7\u1dd8\u1dd9\u1dda\u0001\u0001\u0001\u0001\u0003\u1dde\u1ddf\u0001\u0001\u0005\u1de5\u1de6\u1de7\u1de8\u0001\u0001\u0001\u0001\u0002\u1deb\u0001\u0002\u1db7\u0002\u1dd8\u0003\u1df3\u1df4\u0001\u0001\u0003\u14a2\u1df8\u0001\u0003\u0d84\u1dfc\u0001\u0003\u14a3\u1e00\u0001\u0003\u0d85\u1e04\u0001\u0002\u1e07\u0001\u0004\u1224\u14a4\u1e0c\u0001\u0005\u14a5\u151f\u05ab\u1e12\u0001\u0002\u1e15\u0001\u0002\u1225" +
"\u0002\u1e1a\u0001\u0008\u1226\u059a\u1e23\u1e24\u1e25\u1e26\u1e27\u0001\u0001\u0001\u0001\u0001\u0002\u1e2a\u0001\u0002\u1e2d\u0001\u0004\u1520\u0ecc\u1e32\u0001\u0004\u1521\u0ecc\u1e37\u0001\u0002\u1e23\u0002\u14a6\u0002\u1e3e\u0001\u0002\u1e41\u0001\u0002\u1e44\u0001\u0002\u1e47\u0001\u0003\u1227\u1e4b\u0001\u0002\u1227\u0002\u1e50\u0001\u0002\u1e53\u0001\u0002\u1e56\u0001\u0002\u1e59\u0001\u0002\u1e5c\u0001\u0002\u1e5f\u0001" +
"\u0002\u1e62\u0001\u0002\u1e65\u0001\u0002\u1e68\u0001\u0002\u1e6b\u0001\u0004\u1e70\u1228\u14a7\u0001\u0003\u1e74\u1229\u0001\u0002\u1e77\u0001\u0002\u1e7a\u0001\u0002\u1e7d\u0001\u0002\u1e80\u0001\u0002\u1e83\u0001\u0005\u153b\u158b\u1e24\u1e89\u0001\u0004\u122a\u1e25\u1e89\u0002\u1e90\u0001\u0002\u1e93\u0001\u0002\u1e96\u0001\u0002\u1e99\u0001\u0002\u1e9c\u0001\u0002\u1e9f\u0001\u0002\u1ea2\u0001\u0003\u122b\u1ea6\u0001\u0002" +
"\u122c\u0002\u122d\u0002\u122e\u0016\u0908\u0e50\u0e92\u0ed6\u0f09\u0f28\u0f67\u10f1\u1668\u1df8\u1dfc\u1e00\u1e04\u1e0c\u1e12\u1e26\u1e32\u1e37\u1e4b\u1ea6\u1ec3\u0001\n\u0cf0\u0d86\u0e0e\u10f2\u122f\u14a8\u153c\u1e27\u1ec3\u0002\u1ed0\u0001\u0104\u06fe\u0739\u0799\u07d3\u089b\u079a\u079b\u0351\u0de0\u0d6e\u0de1\u1fd5\u1fd9\u1fdc\u1fdf\u1fe2\u1fe5\u1fe8\u1feb\u1fee\u1ff1\u1ff4\u0eca\u1519\u0f21\u0f51\u08a0\u08a1\u0d2c\u0d6d" +
"\u132b\u1ff9\u0e43\u0efa\u1ffa\u0d7f\u1410\u0efe\u0eff\u0e45\u0f03\u1ffb\u0de3\u0755\u0de5\u1ffc\u1037\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u200b\u200c\u200d\u200e\u200f\u2010\u2011\u2012\u1806\u182e\u1854\u1806\u2013\u2015\u2016\u0e0a\u2017\u2018\u2019\u201a\u201b\u18bc\u201d\u18ba\u18b4\u201e\u201f\u2021\u2022\u195d\u1837\u2023\u10bb\u2024\u0e0d\u180a\u0e09\u2025\u182f\u1839\u1880\u0e0a\u203e\u204a\u2051\u2057\u205e\u2064" +
"\u2069\u206f\u207b\u2081\u2087\u208e\u209b\u1a56\u1a6c\u1b39\u20a1\u1aed\u1a24\u20a2\u20a3\u1a41\u1a42\u20a4\u1a45\u20a5\u20a5\u20a6\u20a7\u1a85\u1b67\u20a8\u20a9\u20aa\u1aa2\u20ab\u20ac\u20ad\u1a88\u20ae\u1afd\u1afe\u1fd5\u1fd9\u1fdc\u1fdf\u1fe2\u1fe5\u1fe8\u1feb\u1fee\u1ff1\u20a6\u1b0a\u20af\u20b0\u1b4e\u1b67\u20b1\u1b27\u1fd5\u1fd9\u1fdc\u1fdf\u1fe2\u1fe5\u1fe8\u1feb\u1fee\u1ff1\u20b2\u20b3\u20b4\u20b5\u20b6\u20b7\u20b8\u20b9" +
"\u20ba\u20bb\u20bc\u20bd\u20be\u20bf\u1ba8\u1ba9\u1baa\u20c0\u20c1\u20c2\u1bab\u20c6\u20c7\u1bac\u1bad\u20c8\u20c9\u20cd\u1bae\u20d1\u1baf\u20d5\u1bb0\u1bb1\u1bb2\u20d6\u20d7\u20db\u20df\u20e0\u20e1\u20e2\u20e3\u20e4\u20e5\u20e6\u20e7\u20e8\u20e9\u20ea\u20eb\u20ec\u20ed\u20ee\u20ef\u20f1\u20f3\u20f5\u20f7\u14a0\u1ffc\u1047\u0ef8\u0f04\u0ef9\u0f07\u20f9\u20fa\u20fb\u20fc\u20fd\u20fe\u1e07\u1224\u05ab\u20ff\u2100\u2101\u2102\u2103" +
"\u1228\u1229\u153b\u2104\u1ea6\u14a7\u122d\u122e\u0908\u183c\u2105\u2106\u2107\u0004\u0000\u0000\u0000\u0003\u0000\u0000\u0003\u0000\u0000\u0003\u0000\u0000\u0003\u0000\u0000\u0003\u0000\u0000\u0003\u0000\u0000\u0003\u0000\u0000\u0003\u0000\u0000\u0003\u0000\u0000\u0005\u0000\u0000\u0000\u0000\u0001\u0001\u0001\u0008\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001" +
"\u0001\u0001\u0001\u0002\u0000\u0001\u0001\u0001\u0001\u0001\u0001\u0002\u0000\u0001\u0001\u0002\u0000\u0001\u0001\u0001\u0001\u0019\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u000c\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0007\u0000\u0000\u0000\u0000\u0000\u0000\u0006\u0000\u0000\u0000\u0000\u0000\u0007" +
"\u0000\u0000\u0000\u0000\u0000\u0000\u0006\u0000\u0000\u0000\u0000\u0000\u0005\u0000\u0000\u0000\u0000\u0006\u0000\u0000\u0000\u0000\u0000\u000c\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0006\u0000\u0000\u0000\u0000\u0000\u0006\u0000\u0000\u0000\u0000\u0000\u0007\u0000\u0000\u0000\u0000\u0000\u0000\r\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0006\u0000\u0000\u0000\u0000" +
"\u0000\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0004\u0000\u0000\u0000\u0001\u0001\u0001\u0004\u0000\u0000\u0000\u0004\u0000\u0000\u0000\u0004\u0000\u0000\u0000\u0001\u0001\u0004\u0000\u0000\u0000\u0004\u0000\u0000\u0000\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001" +
"\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0002\u0000\u0002\u0000\u0002\u0000\u0002\u0000\u0002\u0000\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0019\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u000b\u212b\u212c\u212d\u212e\u212f\u2130\u2131\u2132\u2133\u2134\u0001\u0001\u0001\u0001\u0001" +
"\u0001\u0001\u0001\u0001\u0001\u000b\u2140\u2141\u2142\u2143\u2144\u2145\u2146\u2147\u2148\u2149\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u000b\u2155\u2156\u2157\u2158\u2159\u215a\u215b\u215c\u215d\u215e\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u000b\u216a\u216b\u216c\u216d\u216e\u216f\u2170\u2171\u2172\u2173\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u000b\u217f\u2180\u2181" +
"\u2182\u2183\u2184\u2185\u2186\u2187\u2188\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u000b\u2194\u2195\u2196\u2197\u2198\u2199\u219a\u219b\u219c\u219d\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u000b\u21a9\u21aa\u21ab\u21ac\u21ad\u21ae\u21af\u21b0\u21b1\u21b2\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0071\u1055\u0dee\u2224\u2227\u222a\u222b\u222c\u222d\u222e\u222f\u2230\u2231" +
"\u20ba\u20bb\u2232\u2233\u2234\u2235\u2236\u2237\u2238\u2239\u223a\u223b\u223c\u223d\u223e\u223f\u2240\u2241\u2242\u2243\u20e5\u20b4\u2244\u20b5\u2245\u2246\u20ec\u2247\u2248\u2249\u224a\u224b\u224c\u224d\u224e\u224f\u2250\u2251\u2252\u2253\u2254\u2255\u2256\u2257\u2258\u2259\u225a\u225b\u225c\u225d\u225e\u1047\u225f\u2260\u2261\u2262\u2263\u2264\u2265\u2266\u2267\u2268\u2269\u226a\u226b\u226c\u226e\u0424\u2270\u2273\u2276\u2279" +
"\u227a\u1047\u0ef8\u0f04\u0ef9\u0f07\u20fb\u20fc\u20fd\u20fe\u1e15\u1e1a\u1e70\u1e74\u1e77\u1e7a\u227b\u227c\u227d\u227e\u227f\u2280\u2281\u2282\u2283\u2284\u2285\u2286\u0003\u0000\u0000\u0003\u0000\u0000\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001" +
"\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0002\u0000\u0002\u0000\u0003\u0000\u0000\u0003\u0000\u0000\u0003\u0000\u0000\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0006\u228c\u228f\u2292\u2295\u2298\u0003\u0000\u0000\u0003\u0000\u0000\u0003\u0000\u0000\u0003\u0000\u0000" +
"\u0003\u0000\u0000\u03b4\u264f\u2650\u2651\u2652\u2653\u2654\u2655\u2656\u2657\u2658\u2659\u265a\u265b\u265c\u265d\u265e\u265f\u2660\u2661\u2662\u2663\u2664\u2665\u0415\u2666\u2667\u0415\u2651\u265a\u2666\u264f\u2663\u265d\u264f\u264f\u264f\u264f\u264f\u264f\u264f\u2651\u2653\u2653\u2653\u2653\u2657\u2657\u2657\u2657\u265c\u265d\u265d\u265d\u265d\u265d\u265d\u2663\u2663\u2663\u2663\u2666\u264f\u264f\u264f\u264f\u264f\u264f\u264f" +
"\u2651\u2653\u2653\u2653\u2653\u2657\u2657\u2657\u2657\u265c\u265d\u265d\u265d\u265d\u265d\u265d\u2663\u2663\u2663\u2663\u2666\u2666\u264f\u264f\u264f\u264f\u2651\u2651\u2651\u2651\u2651\u2651\u2651\u2651\u2652\u2652\u2652\u2652\u2653\u2653\u2653\u2653\u2653\u2653\u2653\u2653\u2655\u2655\u2655\u2655\u2655\u2655\u2656\u2656\u2656\u2656\u2657\u2657\u2657\u2657\u2657\u2657\u2657\u2657\u2658\u2658\u2659\u2659\u265a\u265a\u265a\u265a" +
"\u265a\u265a\u265a\u265a\u265c\u265c\u265c\u265c\u265c\u265c\u265d\u265d\u265d\u265d\u265d\u265d\u2660\u2660\u2660\u2660\u2660\u2660\u2661\u2661\u0184\u0184\u2661\u2661\u2661\u2661\u2662\u2662\u2662\u2662\u2662\u2662\u2663\u2663\u2663\u2663\u2663\u2663\u2663\u2663\u2663\u2663\u2665\u2665\u2666\u2666\u2666\u2667\u2667\u2667\u2667\u2667\u2667\u2650\u2668\u2657\u265a\u265d\u265d\u265d\u2660\u2663\u2663\u2667\u2667\u264f\u264f\u2657" +
"\u2657\u265d\u265d\u2663\u2663\u2663\u2663\u2663\u2663\u2663\u2663\u2663\u2663\u264f\u264f\u264f\u264f\u264f\u264f\u2655\u2655\u2655\u2655\u2659\u2659\u265d\u265d\u265d\u265d\u2669\u2669\u2658\u2655\u2655\u265c\u265c\u264f\u264f\u264f\u264f\u265d\u265d\u264f\u264f\u2653\u2653\u2657\u2657\u265d\u265d\u2660\u2660\u2663\u2663\u2656\u2656\u264f\u264f\u2653\u2653\u265d\u265d\u265d\u265d\u265d\u265d\u265d\u265d\u2666\u2666\u2658\u264f" +
"\u2651\u2651\u265a\u2662\u2650\u2663\u2653\u2653\u2658\u2658\u2660\u2660\u2666\u2666\u2658\u2655\u2668\u2657\u2657\u265c\u265d\u265d\u2660\u2663\u2666\u2650\u266a\u2656\u265a\u2656\u266b\u2658\u2660\u266c\u266d\u042a\u2665\u2666\u2668\u265a\u2661\u0415\u266e\u266f\u2670\u2671\u2672\u2673\u2674\u266f\u2675\u2676\u2663\u2677\u2678\u2679\u267a\u2671\u2673\u266e\u266f\u2670\u2671\u2673\u2679\u2671\u2673\u2672\u2673\u2674\u2675\u2673" +
"\u2673\u267a\u2677\u2676\u2678\u2675\u266f\u267b\u1837\u267c\u267d\u267e\u2023\u10bb\u2024\u267f\u2023\u0e0d\u2015\u2016\u18ba\u201e\u201f\u2021\u195d\u2015\u2016\u18ba\u201e\u201f\u2021\u195d\u267b\u1837\u267c\u267d\u267e\u2023\u10bb\u2024\u267f\u2023\u0e0d\u267b\u267b\u2680\u2680\u2681\u2681\u2682\u2682\u2683\u2683\u1858\u1858\u2684\u2684\u0e09\u0e09\u201e\u201e\u267c\u267c\u2685\u2685\u182f\u182f\u2686\u2686\u1839\u1839\u2687" +
"\u2687\u2688\u2688\u1809\u1809\u2689\u2689\u268a\u268a\u2023\u2023\u2023\u2023\u2684\u2684\u2684\u2684\u2684\u2684\u267d\u267d\u268b\u268b\u268b\u268b\u268b\u268b\u2024\u2024\u2105\u2105\u2687\u2687\u0d44\u0d44\u268c\u268c\u268d\u268e\u268f\u2690\u2690\u2691\u2692\u2693\u2694\u20aa\u20ad\u20ae\u2695\u1a26\u2696\u2692\u2697\u2698\u20af\u2693\u2699\u269a\u20b0\u269b\u20b1\u269c\u269d\u269e\u269f\u26a0\u26a1\u26a1\u26a1\u269e\u26a2" +
"\u26a2\u26a3\u26a4\u26a5\u26a6\u26a7\u26a8\u26a9\u26aa\u26ab\u26a9\u26ac\u26ad\u26ae\u26ae\u26af\u26a3\u26a3\u26a4\u26a6\u26a8\u26a8\u26b0\u26b1\u26b2\u26b3\u269e\u269f\u269f\u26a2\u26a0\u26a0\u26a7\u26a6\u26b4\u26a4\u26a5\u26b5\u26a9\u26ac\u26b6\u26b7\u26b8\u26b9\u26ba\u26bb\u26bc\u26bd\u26be\u26bf\u26c0\u26c1\u26c2\u26c3\u26c4\u26c5\u26c6\u26c7\u26c8\u26c9\u264f\u264f\u2650\u2651\u2652\u1395\u2653\u2658\u2659\u265a\u265b\u13f5" +
"\u265d\u26ca\u26cb\u265e\u2106\u266c\u2662\u2663\u2664\u2665\u2667\u2669\u2668\u26cc\u2677\u2678\u26cd\u268c\u264f\u26ce\u26cf\u2650\u2652\u2653\u13a8\u26d0\u26d1\u2655\u26d2\u2659\u265b\u13f5\u265d\u26ca\u265e\u2662\u2663\u26d3\u26d4\u2664\u2674\u26d5\u267a\u26d6\u2657\u2660\u2663\u2664\u2674\u2668\u2678\u267a\u26d6\u2657\u265e\u2663\u26d7\u2651\u26d8\u26d9\u2654\u2658\u26da\u2657\u2671\u26db\u26dc\u265d\u26dd\u26de\u2663\u26df" +
"\u26e0\u2667\u2669\u2675\u2650\u2650\u2650\u2650\u2651\u2651\u2652\u2652\u2652\u2652\u2652\u2652\u2653\u2653\u2653\u2653\u10a4\u10a4\u2654\u2654\u2655\u2655\u2656\u2656\u2656\u2656\u2656\u2656\u2656\u2656\u2657\u2657\u2659\u2659\u2659\u2659\u265a\u265a\u265a\u265a\u265b\u265b\u265b\u265b\u265b\u265b\u265c\u265c\u265c\u265c\u265d\u265d\u265d\u265d\u265d\u265d\u265d\u265d\u265e\u265e\u265e\u265e\u2660\u2660\u2660\u2660\u2660\u2660" +
"\u2661\u2661\u2661\u2661\u2661\u2661\u2661\u2661\u2661\u2661\u2662\u2662\u2662\u2662\u2663\u2663\u2664\u2664\u2664\u2664\u2665\u2665\u2665\u2665\u2665\u2665\u2665\u2665\u2665\u2665\u0415\u0415\u0415\u0415\u2666\u2666\u2667\u2667\u2667\u2667\u2662\u2665\u2666\u13b0\u142b\u264f\u264f\u264f\u264f\u264f\u264f\u264f\u264f\u264f\u264f\u264f\u264f\u264f\u264f\u10a3\u10a3\u10a3\u10a3\u10a3\u10a3\u10a3\u10a3\u10a3\u10a3\u2653\u2653\u2653" +
"\u2653\u2653\u2653\u2653\u2653\u2653\u2653\u2653\u2653\u2653\u2653\u2653\u2653\u2657\u2657\u2657\u2657\u265d\u265d\u265d\u265d\u265d\u265d\u265d\u265d\u265d\u265d\u265d\u265d\u265d\u265d\u265d\u265d\u265d\u265d\u265d\u265d\u265d\u265d\u265d\u265d\u2663\u2663\u2663\u2663\u2663\u2663\u2663\u2663\u2663\u2663\u2663\u2663\u2663\u2663\u2666\u2666\u2666\u2666\u2666\u2666\u2666\u2666\u266e\u266f\u2670\u2671\u2672\u2673\u26e1\u266e\u266e" +
"\u266e\u266f\u2670\u2671\u2671\u2671\u2673\u2673\u151d\u2673\u2673\u2672\u26e1\u2657\u265c\u264f\u2653\u265d\u0415\u13a8\u2656\u2659\u265a\u265b\u265c\u265e\u2661\u2662\u2653\u2650\u2656\u2660\u265e\u2667\u2677\u2679\u2650\u265e\u264f\u2662\u26e2\u2658\u268a\u268a\u183c\u183c\u268b\u268b\u17f6\u17f6\u2105\u2105\u2106\u2106\u2654\u2661\u2659\u2659\u2659\u2659\u265f\u265f\u2664\u2664\u26e3\u2651\u2651\u2654\u2654\u2655\u2655\u265c" +
"\u265c\u2660\u2660\u2661\u2661\u2657\u265f\u2663\u2663\u265f\u265d\u26d4\u26ca\u26e1\u26e5\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001" +
"\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001" +
"\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0002\u0000\u0001").toCharArray();
"\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0002\u0000\u0001").toCharArray();
public static final int accent_aigu = 1;
public static final int accent_arrows = 130;
@@ -311,14 +311,14 @@ public final class ComposeKeyData
public static final int accent_tilde = 1326;
public static final int accent_trema = 1354;
public static final int compose = 1452;
public static final int fn = 7885;
public static final int numpad_bengali = 8481;
public static final int numpad_devanagari = 8502;
public static final int numpad_gujarati = 8523;
public static final int numpad_hindu = 8544;
public static final int numpad_kannada = 8565;
public static final int numpad_persian = 8586;
public static final int numpad_tamil = 8607;
public static final int shift = 8628;
public static final int substitutions = 8860;
public static final int fn = 7889;
public static final int numpad_bengali = 8480;
public static final int numpad_devanagari = 8501;
public static final int numpad_gujarati = 8522;
public static final int numpad_hindu = 8543;
public static final int numpad_kannada = 8564;
public static final int numpad_persian = 8585;
public static final int numpad_tamil = 8606;
public static final int shift = 8627;
public static final int substitutions = 8859;
}
+17 -3
View File
@@ -75,6 +75,7 @@ public final class Config
public boolean clipboard_history_enabled;
public int clipboard_history_duration;
public boolean space_bar_auto_complete;
public boolean physical_keyboard_hide;
// Dynamically set
/** Configuration options implied by the connected editor. */
@@ -94,6 +95,8 @@ public final class Config
[get_current_layout()] and [set_current_layout()]. */
int current_layout_narrow;
int current_layout_wide;
/** Whether to automatically split the layout. */
public boolean split_layout;
private Config(SharedPreferences prefs, Resources res,
Boolean foldableUnfolded, Dictionaries dicts)
@@ -104,7 +107,7 @@ public final class Config
marginTop = res.getDimension(R.dimen.margin_top);
keyPadding = res.getDimension(R.dimen.key_padding);
labelTextSize = 0.33f;
sublabelTextSize = 0.22f;
sublabelTextSize = 0.21f;
// from prefs
refresh(res, foldableUnfolded, dicts);
// initialized later
@@ -176,7 +179,7 @@ public final class Config
// a layout in KeyboardData unit. The keyboard will be higher if the layout
// has more rows and smaller if it has less because rows stay the same
// height.
keyboard_rows_height_pixels = screenHeightPixels * keyboardHeightPercent / 395;
keyboard_rows_height_pixels = (int)(screenHeightPixels * keyboardHeightPercent / 395 * 0.9f);
horizontal_margin =
get_dip_pref_oriented(dm, "horizontal_margin", 3, 28);
double_tap_lock_shift = _prefs.getBoolean("lock_double_tap", false);
@@ -195,9 +198,10 @@ public final class Config
clipboard_history_enabled = _prefs.getBoolean("clipboard_history_enabled", false);
clipboard_history_duration = Integer.parseInt(_prefs.getString("clipboard_history_duration", "5"));
space_bar_auto_complete = _prefs.getBoolean("space_bar_auto_complete", false);
physical_keyboard_hide = _prefs.getString("physical_keyboard_behavior", "hide").equals("hide");
float screen_width_dp = dm.widthPixels / dm.density;
wide_screen = screen_width_dp >= WIDE_DEVICE_THRESHOLD;
split_layout = get_split_layout();
}
public int get_current_layout()
@@ -292,6 +296,16 @@ public final class Config
}
}
final boolean get_split_layout()
{
switch (_prefs.getString("split_layout", "wide"))
{
case "wide": return wide_screen;
case "landscape": return orientation_landscape;
default: return false;
}
}
private static Config _globalConfig = null;
public static void initGlobalConfig(SharedPreferences prefs, Resources res,
+16 -2
View File
@@ -36,14 +36,14 @@ public final class KeyEventHandler
LastAction _last_action = null;
LastAction _next_last_action = null;
public KeyEventHandler(IReceiver recv, Config config)
public KeyEventHandler(IReceiver recv, Suggestions sg)
{
_recv = recv;
Handler handler = recv.getHandler();
_autocap = new Autocapitalisation(handler,
this.new Autocapitalisation_callback());
_mods = Pointers.Modifiers.EMPTY;
_suggestions = new Suggestions(recv, config);
_suggestions = sg;
_typedword = new CurrentlyTypedWord(handler, this);
}
@@ -119,6 +119,7 @@ public final class KeyEventHandler
case Compose_pending: _recv.set_compose_pending(true); break;
case Slider: handle_slider(key.getSlider(), key.getSliderRepeat(), false); break;
case Macro: evaluate_macro(key.getMacro()); break;
case Stateful: handle_stateful(key.getStateful()); break;
}
update_meta_state(old_mods);
_last_action = _next_last_action;
@@ -334,6 +335,19 @@ public final class KeyEventHandler
}
}
void handle_stateful(KeyValue.Stateful st)
{
switch (st)
{
case Complete_first:
case Complete_second:
case Complete_third:
case Complete_emoji:
suggestion_entered(st.toString());
break;
}
}
/** Move the cursor right or left, if possible without sending key events.
Unlike arrow keys, the selection is not removed even if shift is not on.
Falls back to sending arrow keys events if the editor do not support
+8 -12
View File
@@ -141,23 +141,19 @@ public final class KeyModifier
{
switch (kv.getKind())
{
case Char:
case String:
/* These keys are not greyed. */
case Event:
case Modifier:
return kv;
/* Tapping compose again exits the pending sequence. */
case Compose_pending:
return KeyValue.COMPOSE_CANCEL;
default:
KeyValue res = ComposeKey.apply(state, kv);
// Grey-out characters not part of any sequence.
if (res == null)
return kv.withFlags(kv.getFlags() | KeyValue.FLAG_GREYED);
return res;
/* Tapping compose again exits the pending sequence. */
case Compose_pending:
return KeyValue.COMPOSE_CANCEL;
/* These keys are not greyed. */
case Event:
case Modifier:
return kv;
/* Other keys cannot be part of sequences. */
default:
return kv.withFlags(kv.getFlags() | KeyValue.FLAG_GREYED);
}
}
+58 -2
View File
@@ -24,6 +24,7 @@ public final class KeyValue implements Comparable<KeyValue>
CAPS_LOCK,
SWITCH_VOICE_TYPING,
SWITCH_VOICE_TYPING_CHOOSER,
HIDE_SELF,
}
// Must be evaluated in the reverse order of their values.
@@ -104,6 +105,7 @@ public final class KeyValue implements Comparable<KeyValue>
String, // [_payload] is also the string to output, value is unused.
Slider, // [_payload] is a [KeyValue.Slider], value is slider repeatition.
Macro, // [_payload] is a [KeyValue.Macro], value is unused.
Stateful, // [_payload] is a [KeyValue.Stateful], value is the query.
}
private static final int FLAGS_OFFSET = 20;
@@ -238,6 +240,12 @@ public final class KeyValue implements Comparable<KeyValue>
return ((Macro)_payload).keys;
}
/** Defined only when [getKind() == Kind.Stateful]. */
public Stateful getStateful()
{
return (Stateful)_payload;
}
/* Update the char and the symbol. */
public KeyValue withChar(char c)
{
@@ -422,6 +430,11 @@ public final class KeyValue implements Comparable<KeyValue>
id.ordinal(), flags | FLAG_KEY_FONT);
}
private static KeyValue statefulKey(Stateful st)
{
return new KeyValue(st, Kind.Stateful, 0, FLAG_SMALLER_FONT | FLAG_SPECIAL);
}
public static KeyValue makeStringKey(String str)
{
return makeStringKey(str, 0);
@@ -576,6 +589,7 @@ public final class KeyValue implements Comparable<KeyValue>
case "box": return modifierKey("Box", Modifier.BOX, 0);
case "fn": return modifierKey("Fn", Modifier.FN, 0);
case "meta": return modifierKey("Meta", Modifier.META, 0);
case "tux": return modifierKey("Meta", Modifier.META, 0);
/* Combining diacritics */
/* Glyphs is the corresponding dead-key + 0x0100. */
@@ -643,6 +657,11 @@ public final class KeyValue implements Comparable<KeyValue>
case "capslock": return eventKey(0xE012, Event.CAPS_LOCK, 0);
case "voice_typing": return eventKey(0xE015, Event.SWITCH_VOICE_TYPING, FLAG_SMALLER_FONT);
case "voice_typing_chooser": return VOICE_TYPING_CHOOSER;
case "complete_first": return statefulKey(Stateful.Complete_first);
case "complete_second": return statefulKey(Stateful.Complete_second);
case "complete_third": return statefulKey(Stateful.Complete_third);
case "complete_emoji": return statefulKey(Stateful.Complete_emoji);
case "hide_self": return eventKey("⊻", Event.HIDE_SELF, FLAG_SMALLER_FONT);
/* Key events */
case "esc": return keyeventKey("Esc", KeyEvent.KEYCODE_ESCAPE, FLAG_SMALLER_FONT);
@@ -653,6 +672,8 @@ public final class KeyValue implements Comparable<KeyValue>
case "left": return keyeventKey(0xE008, KeyEvent.KEYCODE_DPAD_LEFT, FLAG_SMALLER_FONT);
case "page_up": return keyeventKey(0xE002, KeyEvent.KEYCODE_PAGE_UP, 0);
case "page_down": return keyeventKey(0xE003, KeyEvent.KEYCODE_PAGE_DOWN, 0);
case "pgup": return keyeventKey("pgup", KeyEvent.KEYCODE_PAGE_UP, FLAG_SMALLER_FONT);
case "pgdn": return keyeventKey("pgdn", KeyEvent.KEYCODE_PAGE_DOWN, FLAG_SMALLER_FONT);
case "home": return keyeventKey(0xE00B, KeyEvent.KEYCODE_MOVE_HOME, FLAG_SMALLER_FONT);
case "end": return keyeventKey(0xE00C, KeyEvent.KEYCODE_MOVE_END, FLAG_SMALLER_FONT);
case "delete": return keyeventKey(0xE010, KeyEvent.KEYCODE_FORWARD_DEL, 0);
@@ -676,7 +697,7 @@ public final class KeyValue implements Comparable<KeyValue>
/* Spaces */
case "\\t": return charKey("\\t", '\t', 0); // Send the tab character
case "\\n": return charKey("\\n", '\n', 0); // Send the newline character
case "space": return editingKey(0xE00D, Editing.SPACE_BAR, FLAG_SMALLER_FONT | FLAG_GREYED);
case "space": return editingKey(0xE001, Editing.SPACE_BAR, FLAG_SMALLER_FONT | FLAG_GREYED);
case "nbsp": return charKey("\u237d", '\u00a0', FLAG_SMALLER_FONT);
case "nnbsp": return charKey("\u2423", '\u202F', FLAG_SMALLER_FONT);
@@ -740,6 +761,7 @@ public final class KeyValue implements Comparable<KeyValue>
case "cursor_right": return sliderKey(Slider.Cursor_right, 1);
case "cursor_up": return sliderKey(Slider.Cursor_up, 1);
case "cursor_down": return sliderKey(Slider.Cursor_down, 1);
case "cursor_joystick": return sliderKey(Slider.Cursor_joystick, 1);
case "selection_cancel": return editingKey("Esc", Editing.SELECTION_CANCEL, FLAG_SMALLER_FONT | FLAG_SPECIAL);
case "selection_cursor_left": return sliderKey(Slider.Selection_cursor_left, -1); // Move the left side of the selection
case "selection_cursor_right": return sliderKey(Slider.Selection_cursor_right, 1);
@@ -852,7 +874,8 @@ public final class KeyValue implements Comparable<KeyValue>
Cursor_up(0xE005, true),
Cursor_down(0xE007, true),
Selection_cursor_left(0xE008, false),
Selection_cursor_right(0xE006, false);
Selection_cursor_right(0xE006, false),
Cursor_joystick(0xE001, false);
final String symbol;
final boolean vertical;
@@ -867,6 +890,10 @@ public final class KeyValue implements Comparable<KeyValue>
return vertical;
}
public boolean isJoystick() {
return this == Cursor_joystick;
}
@Override
public String toString() { return symbol; }
@@ -912,4 +939,33 @@ public final class KeyValue implements Comparable<KeyValue>
return _symbol.compareTo(snd._symbol);
}
};
/** Stateful keys are keys whose symbol must be constantly computed from the
app's state. */
public static enum Stateful implements Describe
{
Complete_first,
Complete_second,
Complete_third,
Complete_emoji;
@Override
public String toString()
{
if (_handler == null)
return "";
String s = _handler.provide_stateful_key_symbol(this);
return (s == null) ? "" : s;
}
@Override
public String describe() { return name(); }
public static Symbol_provider _handler = null;
public static interface Symbol_provider
{
public String provide_stateful_key_symbol(Stateful q);
}
}
}
+38 -7
View File
@@ -39,6 +39,7 @@ public class Keyboard2 extends InputMethodService
private ViewGroup _keyboard_container_view;
private Keyboard2View _keyboard_layout_view;
private CandidatesView _candidates_view;
private Suggestions _suggestions;
private KeyEventHandler _keyeventhandler;
/** If not 'null', the layout to use instead of [_config.current_layout]. */
private KeyboardData _currentSpecialLayout;
@@ -109,6 +110,12 @@ public class Keyboard2 extends InputMethodService
current_layout_unmodified());
}
KeyboardData loadNumericLayout()
{
return loadNumpad(_config.orientation_landscape ?
R.xml.numeric_landscape : R.xml.numeric);
}
KeyboardData loadPinentry(int layout_id)
{
return LayoutModifier.modify_pinentry(KeyboardData.load(getResources(), layout_id),
@@ -126,7 +133,10 @@ public class Keyboard2 extends InputMethodService
Config.initGlobalConfig(prefs, getResources(),
_foldStateTracker.isUnfolded(), _dictionaries);
_config = Config.globalConfig();
_keyeventhandler = new KeyEventHandler(this.new Receiver(), _config);
Receiver recvr = this.new Receiver();
_suggestions = new Suggestions(recvr, _config);
_keyeventhandler = new KeyEventHandler(recvr, _suggestions);
KeyValue.Stateful._handler = recvr;
_config.handler = _keyeventhandler;
prefs.registerOnSharedPreferenceChangeListener(this);
Logs.set_debug_logs(getResources().getBoolean(R.bool.debug_logs));
@@ -192,7 +202,8 @@ public class Keyboard2 extends InputMethodService
{
boolean should_show =
_config.suggestions_enabled
&& _config.editor_config.should_show_candidates_view;
&& _config.editor_config.should_show_candidates_view
&& !_config.split_layout;
if (should_show)
_candidates_view.refresh_config(_config);
_candidates_view.setVisibility(should_show ? View.VISIBLE : View.GONE);
@@ -227,8 +238,11 @@ public class Keyboard2 extends InputMethodService
{
switch (_config.selected_number_layout)
{
case PIN: return loadPinentry(R.xml.pin);
case NUMBER: return loadNumpad(R.xml.numeric);
case PIN:
return loadPinentry(_config.orientation_landscape ?
R.xml.pin_landscape : R.xml.pin);
case NUMBER:
return loadNumericLayout();
}
}
return null;
@@ -368,7 +382,8 @@ public class Keyboard2 extends InputMethodService
if (super.onEvaluateInputViewShown())
return true;
if (getResources().getConfiguration().hardKeyboardHidden
== Configuration.HARDKEYBOARDHIDDEN_NO)
== Configuration.HARDKEYBOARDHIDDEN_NO
&& _config.physical_keyboard_hide)
{
Logs.debug("Physical keyboard is present");
return false;
@@ -390,7 +405,8 @@ public class Keyboard2 extends InputMethodService
}
/** Not static */
public class Receiver implements KeyEventHandler.IReceiver
public class Receiver implements KeyEventHandler.IReceiver,
KeyValue.Stateful.Symbol_provider
{
public void handle_event_key(KeyValue.Event ev)
{
@@ -406,7 +422,7 @@ public class Keyboard2 extends InputMethodService
break;
case SWITCH_NUMERIC:
setSpecialLayout(loadNumpad(R.xml.numeric));
setSpecialLayout(loadNumericLayout());
break;
case SWITCH_EMOJI:
@@ -476,6 +492,9 @@ public class Keyboard2 extends InputMethodService
VoiceImeSwitcher.choose_voice_ime(Keyboard2.this, get_imm(),
Config.globalPrefs());
break;
case HIDE_SELF:
Keyboard2.this.requestHideSelf(0);
break;
}
}
@@ -508,6 +527,18 @@ public class Keyboard2 extends InputMethodService
{
_candidates_view.set_candidates(suggestions);
}
public String provide_stateful_key_symbol(KeyValue.Stateful q)
{
switch (q)
{
case Complete_first: return _suggestions.suggestions[0];
case Complete_second: return _suggestions.suggestions[1];
case Complete_third: return _suggestions.suggestions[2];
case Complete_emoji: return _suggestions.emoji_suggestion;
}
return "";
}
}
private IBinder getConnectionToken()
+15 -2
View File
@@ -294,7 +294,9 @@ public class Keyboard2View extends View
{
if (!changed)
return;
if (VERSION.SDK_INT >= 29)
// Since SDK 30, this is done automatically:
// https://android.googlesource.com/platform/frameworks/base/+/android11-release/core/java/android/inputmethodservice/InputMethodService.java#852
if (VERSION.SDK_INT == 29)
{
// Disable the back-gesture on the keyboard area
_cached_exclusion_rect.set(
@@ -349,7 +351,18 @@ public class Keyboard2View extends View
x += k.shift * _keyWidth;
float keyW = _keyWidth * k.width - _tc.horizontal_margin;
boolean isKeyDown = _pointers.isKeyDown(k);
Theme.Computed.Key tc_key = isKeyDown ? _tc.key_activated : _tc.key;
Theme.Computed.Key tc_key;
if (isKeyDown)
tc_key = _tc.key_activated;
else
switch (k.role)
{
case Action: tc_key = _tc.key_action; break;
case Space_bar: tc_key = _tc.key_space_bar; break;
case Suggestion: tc_key = _tc.key_suggestion; break;
default:
case Normal: tc_key = _tc.key; break;
}
drawKeyFrame(canvas, x, y, keyW, keyH, tc_key);
if (k.keys[0] != null)
drawLabel(canvas, k.keys[0], keyW / 2f + x, y, keyH, isKeyDown, tc_key);
+60 -17
View File
@@ -43,7 +43,7 @@ public final class KeyboardData
ArrayList<Row> rows_ = new ArrayList<Row>();
for (Row r : rows)
rows_.add(r.mapKeys(f));
return new KeyboardData(this, rows_);
return with_rows(rows_);
}
/** Add keys from the given iterator into the keyboard. Preferred position is
@@ -61,7 +61,7 @@ public final class KeyboardData
}
for (KeyValue kv : unplaced_keys)
add_key_to_preferred_pos(rows, kv, PreferredPos.ANYWHERE);
return new KeyboardData(this, rows);
return with_rows(rows);
}
/** Place a key on the keyboard according to its preferred position. Mutates
@@ -141,9 +141,9 @@ public final class KeyboardData
keys.add(nps.get(i));
}
}
extendedRows.add(new Row(keys, row.height, row.shift));
extendedRows.add(row.with_keys(keys));
}
return new KeyboardData(this, extendedRows);
return with_rows(extendedRows);
}
/** Insert the given row at the given indice. The row is scaled so that the
@@ -152,7 +152,7 @@ public final class KeyboardData
{
ArrayList<Row> rows_ = new ArrayList<Row>(this.rows);
rows_.add(i, row.updateWidth(keysWidth));
return new KeyboardData(this, rows_);
return with_rows(rows_);
}
public Key findKeyWithValue(KeyValue kv)
@@ -304,10 +304,11 @@ public final class KeyboardData
}
/** Copies the fields of a keyboard, with rows changed. */
protected KeyboardData(KeyboardData src, List<Row> rows)
public KeyboardData with_rows(List<Row> rows_)
{
this(rows, compute_max_width(rows), src.modmap, src.script,
src.numpad_script, src.name, src.bottom_row, src.embedded_number_row, src.locale_extra_keys);
return new KeyboardData(rows_, compute_max_width(rows_), modmap, script,
numpad_script, name, bottom_row, embedded_number_row,
locale_extra_keys);
}
public static class Row
@@ -347,7 +348,14 @@ public final class KeyboardData
public Row copy()
{
return new Row(new ArrayList<Key>(keys), height, shift);
return with_keys(new ArrayList<Key>(keys));
}
/** Copy the row with the keys changed. The list [keys] is not copied and
should be immutable. */
public Row with_keys(List<Key> keys)
{
return new Row(keys, height, shift);
}
public void getKeys(Map<KeyValue, KeyPos> dst, int row)
@@ -368,7 +376,7 @@ public final class KeyboardData
ArrayList<Key> keys_ = new ArrayList<Key>();
for (Key k : keys)
keys_.add(f.apply(k));
return new Row(keys_, height, shift);
return with_keys(keys_);
}
/** Change the width of every keys so that the row is 's' units wide. */
@@ -406,12 +414,14 @@ public final class KeyboardData
public final float shift;
/** String printed on the keys. It has no other effect. */
public final String indication;
/** Keys are rendered differently according to their role. */
public final Role role;
/** Whether a key was declared with the 'loc' prefix. */
public static final int F_LOC = 1;
public static final int ALL_FLAGS = F_LOC;
protected Key(KeyValue[] ks, KeyValue antic, int f, float w, float s, String i)
protected Key(KeyValue[] ks, KeyValue antic, int f, float w, float s, String i, Role role_)
{
keys = ks;
anticircle = antic;
@@ -419,9 +429,11 @@ public final class KeyboardData
width = Math.max(w, 0f);
shift = Math.max(s, 0f);
indication = i;
role = role_;
}
static final Key EMPTY = new Key(new KeyValue[9], null, 0, 1.f, 1.f, null);
static final Key EMPTY =
new Key(new KeyValue[9], null, 0, 1.f, 1.f, null, Role.Normal);
/** Read a key value attribute that have a synonym. Having both synonyms
present at the same time is an error.
@@ -489,9 +501,11 @@ public final class KeyboardData
float width = attribute_float(parser, "width", 1f);
float shift = attribute_float(parser, "shift", 0.f);
String indication = parser.getAttributeValue(null, "indication");
String role_str = parser.getAttributeValue(null, "role");
Role role = (role_str == null) ? Role.Normal : Role.parse(role_str);
while (parser.next() != XmlPullParser.END_TAG)
continue;
return new Key(ks, anticircle, keysflags, width, shift, indication);
return new Key(ks, anticircle, keysflags, width, shift, indication, role);
}
/** Whether key at [index] as [flag]. */
@@ -503,7 +517,7 @@ public final class KeyboardData
/** New key with the width multiplied by 's'. */
public Key scaleWidth(float s)
{
return new Key(keys, anticircle, keysflags, width * s, shift, indication);
return new Key(keys, anticircle, keysflags, width * s, shift, indication, role);
}
public void getKeys(Map<KeyValue, KeyPos> dst, int row, int col)
@@ -524,12 +538,22 @@ public final class KeyboardData
for (int j = 0; j < keys.length; j++) ks[j] = keys[j];
ks[i] = kv;
int flags = (keysflags & ~(ALL_FLAGS << i));
return new Key(ks, anticircle, flags, width, shift, indication);
return new Key(ks, anticircle, flags, width, shift, indication, role);
}
public Key withWidth(float w)
{
return withWidthAndShift(w, shift);
}
public Key withShift(float s)
{
return new Key(keys, anticircle, keysflags, width, s, indication);
return withWidthAndShift(width, s);
}
public Key withWidthAndShift(float w, float s)
{
return new Key(keys, anticircle, keysflags, w, s, indication, role);
}
public boolean hasValue(KeyValue kv)
@@ -539,6 +563,25 @@ public final class KeyboardData
return true;
return false;
}
public static enum Role
{
Normal,
Action, // Generally Shift, Delete and keys on the bottom row
Space_bar,
Suggestion;
public static Role parse(String str)
{
switch (str)
{
case "action": return Action;
case "space_bar": return Space_bar;
case "suggestion": return Suggestion;
default: case "normal": return Normal;
}
}
}
}
// Not using Function<KeyValue, KeyValue> to keep compatibility with Android 6.
@@ -555,7 +598,7 @@ public final class KeyboardData
for (int i = 0; i < ks.length; i++)
if (k.keys[i] != null)
ks[i] = apply(k.keys[i], k.keyHasFlag(i, Key.F_LOC));
return new Key(ks, k.anticircle, k.keysflags, k.width, k.shift, k.indication);
return new Key(ks, k.anticircle, k.keysflags, k.width, k.shift, k.indication, k.role);
}
}
@@ -0,0 +1,93 @@
package juloo.keyboard2;
import java.util.ArrayList;
import java.util.List;
public final class LayoutLandscapeModifier
{
/** Width added to the layout, in the key width unit of the layout. */
public static final int ADDED_WIDTH = 5;
public static KeyboardData transform_to_landscape(KeyboardData kw)
{
ArrayList<KeyboardData.Row> new_rows = new ArrayList<KeyboardData.Row>();
// Bottom row as index 0. Used by [add_middle_column] below.
int row_index = kw.rows.size() - 1;
for (KeyboardData.Row r : kw.rows)
new_rows.add(split_row(r, row_index--));
return kw.with_rows(new_rows);
}
public static KeyboardData.Row transform_number_row(KeyboardData.Row r)
{
return split_row(r, -1);
}
static KeyboardData.Row split_row(KeyboardData.Row r, int row_index)
{
if (r.keys.size() < 2)
return r;
// Split the row at the key that overlaps that mid region. If the mid
// region is entirely covered by one key, it is duplicated.
float mid_start = r.keysWidth / 2 - 0.25f;
float mid_end = mid_start + 0.5f;
float off = 0f;
int i = 0;
int end = r.keys.size() - 1; // Exclude the last key to force a split
for (; true; i++)
{
KeyboardData.Key k = r.keys.get(i);
off += k.shift + k.width;
if (off > mid_start || i == end)
{
if (off > mid_end)
return duplicate_at_index(r, i, off, row_index);
return split_at_index(r, i + 1, row_index);
}
}
}
/** Insert [ADDED_WIDTH] empty space before the key at index [i]. */
static KeyboardData.Row split_at_index(KeyboardData.Row r, int i,
int row_index)
{
List<KeyboardData.Key> new_keys = new ArrayList<KeyboardData.Key>(r.keys);
KeyboardData.Key k = new_keys.get(i);
new_keys.set(i, k.withShift(k.shift + ADDED_WIDTH));
add_middle_key(new_keys, i, row_index);
return r.with_keys(new_keys);
}
/** Duplicate the key at index [i] and insert [ADDED_WIDTH] empty space in
between. */
static KeyboardData.Row duplicate_at_index(KeyboardData.Row r, int i,
float off, int row_index)
{
List<KeyboardData.Key> new_keys = new ArrayList<KeyboardData.Key>(r.keys);
KeyboardData.Key k = new_keys.get(i);
// Reduce the size of the duplicated keys if they would add more than 1 to
// the width.
float k_width = (k.width + 1.f) / 2;
// Adjust the size on each sides when the key is not totally centered.
float mid_d = Math.min(off - (r.keysWidth + k.width) / 2, k_width - 1);
new_keys.add(i + 1, k.withWidthAndShift(k_width + mid_d, ADDED_WIDTH - 1));
new_keys.set(i, k.withWidth(k_width - mid_d));
add_middle_key(new_keys, i + 1, row_index);
return r.with_keys(new_keys);
}
/** Add the middle column defined in [split_middle_column.xml]. */
static void add_middle_key(List<KeyboardData.Key> new_keys, int i,
int row_index)
{
List<KeyboardData.Key> mid_keys = LayoutModifier.split_middle_column.keys;
if (row_index >= mid_keys.size())
return;
KeyboardData.Key mid_key = mid_keys.get(row_index);
KeyboardData.Key right_key = new_keys.get(i);
float shift = (right_key.shift - mid_key.width) / 2.f;
new_keys.set(i, right_key.withShift(shift));
new_keys.add(i, mid_key.withShift(shift));
}
}
+8
View File
@@ -14,6 +14,8 @@ public final class LayoutModifier
static KeyboardData.Row number_row_no_symbols;
static KeyboardData.Row number_row_symbols;
static KeyboardData num_pad;
// Not used in this file but defined here for convenience.
public static KeyboardData.Row split_middle_column;
/** Update the layout according to the configuration.
* - Remove the switching key if it isn't needed
@@ -46,11 +48,16 @@ public final class LayoutModifier
else if (globalConfig.add_number_row && !kw.embedded_number_row) // The numpad removes the number row
{
added_number_row = modify_number_row(globalConfig.number_row_symbols ? number_row_symbols : number_row_no_symbols, kw);
if (globalConfig.split_layout)
added_number_row = LayoutLandscapeModifier.transform_number_row(added_number_row);
remove_keys.addAll(added_number_row.getKeys(0).keySet());
}
// Add the bottom row before computing the extra keys
if (kw.bottom_row)
kw = kw.insert_row(bottom_row, kw.rows.size());
// Split the layout in landscape orientation
if (globalConfig.split_layout)
kw = LayoutLandscapeModifier.transform_to_landscape(kw);
// Compose keys to add to the layout
// 'extra_keys_keyset' reflects changes made to 'extra_keys'
Set<KeyValue> extra_keys_keyset = extra_keys.keySet();
@@ -204,6 +211,7 @@ public final class LayoutModifier
number_row_symbols = KeyboardData.load_row(res, R.xml.number_row);
bottom_row = KeyboardData.load_row(res, R.xml.bottom_row);
num_pad = KeyboardData.load_num_pad(res);
split_middle_column = KeyboardData.load_row(res, R.xml.split_middle_column);
}
catch (Exception e)
{
+181 -5
View File
@@ -143,7 +143,10 @@ public final class Pointers implements Handler.Callback
if (ptr.hasFlagsAny(FLAG_P_SLIDING))
{
clearLatched();
ptr.sliding.onTouchUp(ptr);
if (ptr.joypad != null)
ptr.joypad.onTouchUp(ptr);
else
ptr.sliding.onTouchUp(ptr);
return;
}
stopLongPress(ptr);
@@ -211,7 +214,13 @@ public final class Pointers implements Handler.Callback
KeyValue value = _handler.modifyKey(key.keys[0], mods);
Pointer ptr = make_pointer(pointerId, key, value, x, y, mods);
_ptrs.add(ptr);
startLongPress(ptr);
// Space bar gets a slightly shorter long-press (500ms) so the joypad
// activates quickly when holding space
if (value != null && value.getKind() == KeyValue.Kind.Editing
&& value.getEditing() == KeyValue.Editing.SPACE_BAR)
startLongPress(ptr, 500);
else
startLongPress(ptr);
_handler.onPointerDown(value, false);
}
@@ -267,7 +276,14 @@ public final class Pointers implements Handler.Callback
return;
if (ptr.hasFlagsAny(FLAG_P_SLIDING))
{
ptr.sliding.onTouchMove(ptr, x, y);
if (ptr.joypad != null)
{
ptr.joypad.onTouchMove(ptr, x, y);
}
else
{
ptr.sliding.onTouchMove(ptr, x, y);
}
return;
}
@@ -312,6 +328,13 @@ public final class Pointers implements Handler.Callback
startSliding(ptr, x, y, dx, dy, new_value);
_handler.onPointerDown(new_value, true);
}
else if (ptr.value != null
&& ptr.value.getKind() == KeyValue.Kind.Slider
&& ptr.value.getSlider().isJoystick())
{
// Joystick: swipe in any direction activates it
startSliding(ptr, x, y, dx, dy, ptr.value);
}
}
else if (ptr.gesture.changed_direction(direction))
@@ -401,7 +424,15 @@ public final class Pointers implements Handler.Callback
{
if (ptr.timeoutWhat == msg.what)
{
handleLongPress(ptr);
// Joypad auto-repeat takes priority over long-press/hold
if (ptr.joypad != null && ptr.hasFlagsAny(FLAG_P_SLIDING))
{
ptr.joypad.doRepeat(ptr);
}
else
{
handleLongPress(ptr);
}
return true;
}
}
@@ -417,6 +448,14 @@ public final class Pointers implements Handler.Callback
_longpress_handler.sendEmptyMessageDelayed(what, _config.longPressTimeout);
}
/** Start long-press timer with a custom timeout override (ms). */
private void startLongPress(Pointer ptr, long timeoutMs)
{
int what = (uniqueTimeoutWhat++);
ptr.timeoutWhat = what;
_longpress_handler.sendEmptyMessageDelayed(what, timeoutMs);
}
private void stopLongPress(Pointer ptr)
{
_longpress_handler.removeMessages(ptr.timeoutWhat);
@@ -449,6 +488,16 @@ public final class Pointers implements Handler.Callback
_handler.onPointerDown(kv, true);
return;
}
// Space bar long-press: enter joypad cursor mode
if (ptr.value.getKind() == KeyValue.Kind.Editing
&& ptr.value.getEditing() == KeyValue.Editing.SPACE_BAR)
{
stopLongPress(ptr);
ptr.flags |= FLAG_P_SLIDING;
ptr.joypad = new Joypad(ptr.downX, ptr.downY,
KeyValue.Slider.Cursor_joystick);
return;
}
// Special keys
if (kv.hasFlagsAny(KeyValue.FLAG_SPECIAL))
return;
@@ -472,7 +521,15 @@ public final class Pointers implements Handler.Callback
int diry = dy < 0 ? -r : r;
stopLongPress(ptr);
ptr.flags |= FLAG_P_SLIDING;
ptr.sliding = new Sliding(x, y, dirx, diry, kv.getSlider());
KeyValue.Slider s = kv.getSlider();
if (s.isJoystick())
{
ptr.joypad = new Joypad(x, y, s);
}
else
{
ptr.sliding = new Sliding(x, y, dirx, diry, s);
}
}
/** Return the [FLAG_P_*] flags that correspond to pressing [kv]. */
@@ -556,6 +613,8 @@ public final class Pointers implements Handler.Callback
public int timeoutWhat;
/** [null] when not in sliding mode. */
public Sliding sliding;
/** [null] when not in joypad mode. */
public Joypad joypad;
public Pointer(int p, KeyboardData.Key k, KeyValue v, float x, float y, Modifiers m, int f)
{
@@ -569,6 +628,7 @@ public final class Pointers implements Handler.Callback
flags = f;
timeoutWhat = -1;
sliding = null;
joypad = null;
}
public boolean hasFlagsAny(int has)
@@ -672,6 +732,122 @@ public final class Pointers implements Handler.Callback
}
}
/** Joypad: direction-lock + auto-repeat cursor control with speed curve.
Designed for the space bar (limited room for finger travel).
Once the finger moves past the dead zone, the dominant direction is
locked and cursor events auto-repeat at a rate and step count that
increase with finger distance from origin (farther = faster). */
public final class Joypad
{
/** The last locked direction, or null if inactive. */
KeyValue.Slider _activeDir = null;
/** Position of the finger when joypad was activated (down point). */
float _originX;
float _originY;
/** The slider this joypad delegates to. */
KeyValue.Slider slider;
/** Current speed: steps per auto-repeat tick [1..5]. */
int _stepsPerTick = 1;
/** Current interval between ticks (ms). */
int _repeatMs;
public Joypad(float x, float y, KeyValue.Slider s)
{
_originX = x;
_originY = y;
slider = s;
_repeatMs = (int)_config.longPressInterval;
}
/** Pick the dominant direction from a finger offset deltas. */
KeyValue.Slider pickDirection(float dx, float dy)
{
if (Math.abs(dx) >= Math.abs(dy))
return (dx > 0) ? KeyValue.Slider.Cursor_right
: KeyValue.Slider.Cursor_left;
else
return (dy > 0) ? KeyValue.Slider.Cursor_down
: KeyValue.Slider.Cursor_up;
}
/** Compute speed curve from finger displacement.
[dist] = Manhattan distance from origin.
Returns [stepsPerTick, repeatIntervalMs]. */
void computeSpeed(float dist)
{
float d = dist - _config.swipe_dist_px; // distance beyond dead zone
if (d < 1f) d = 1f;
float maxD = _config.swipe_dist_px * 6f; // ~6x dead zone = max speed
float t = Math.min(d / maxD, 1f); // 0..1
// Quadratic curve: gentle near center, faster at extremes
float curve = t * t;
_stepsPerTick = 1 + (int)(curve * 4f); // 1..5 steps/tick
int base = (int)_config.longPressInterval;
_repeatMs = Math.max(30, base - (int)((base - 30) * curve));
}
public void onTouchMove(Pointer ptr, float x, float y)
{
float dx = x - _originX;
float dy = y - _originY;
float dist = Math.abs(dx) + Math.abs(dy);
// Dead zone: finger hasn't moved far enough from origin
if (dist < _config.swipe_dist_px)
{
if (_activeDir != null)
{
// Returned to center → stop auto-repeat
_activeDir = null;
_longpress_handler.removeMessages(ptr.timeoutWhat);
}
return;
}
// Update speed curve from current distance
computeSpeed(dist);
KeyValue.Slider newDir = pickDirection(dx, dy);
if (newDir != _activeDir)
{
// Direction changed (or first lock) → fire and start/restart auto-repeat
_activeDir = newDir;
_longpress_handler.removeMessages(ptr.timeoutWhat);
_handler.onPointerHold(
KeyValue.sliderKey(newDir, _stepsPerTick), ptr.modifiers);
// Schedule next repeat with computed interval
_longpress_handler.sendEmptyMessageDelayed(
ptr.timeoutWhat, _repeatMs);
}
else
{
// Same direction: don't reschedule timer (touch events come faster
// than the timer, which would keep pushing it out). The pending
// doRepeat tick will pick up the updated _stepsPerTick / _repeatMs.
}
}
/** Called by Pointers.handleMessage for auto-repeat ticks. */
public void doRepeat(Pointer ptr)
{
if (_activeDir == null) return;
_handler.onPointerHold(
KeyValue.sliderKey(_activeDir, _stepsPerTick), ptr.modifiers);
_longpress_handler.sendEmptyMessageDelayed(
ptr.timeoutWhat, _repeatMs);
}
public void onTouchUp(Pointer ptr)
{
_activeDir = null;
_longpress_handler.removeMessages(ptr.timeoutWhat);
removePtr(ptr);
_handler.onPointerFlagsChanged(false);
}
}
/** Represent modifiers currently activated.
Sorted in the order they should be evaluated. */
public static final class Modifiers
+46 -11
View File
@@ -12,6 +12,8 @@ public class Theme
// Key colors
public final int colorKey;
public final int colorKeyActivated;
public final int colorKeyAction;
public final int colorKeySpaceBar;
// Label colors
public final int lockedColor;
@@ -26,6 +28,8 @@ public class Theme
public final float keyBorderRadius;
public final float keyBorderWidth;
public final float keyBorderWidthActivated;
public final float keyBorderWidthAction;
public final float keyBorderWidthSpaceBar;
public final int keyBorderColorLeft;
public final int keyBorderColorTop;
public final int keyBorderColorRight;
@@ -40,6 +44,8 @@ public class Theme
TypedArray s = context.getTheme().obtainStyledAttributes(attrs, R.styleable.keyboard, 0, 0);
colorKey = s.getColor(R.styleable.keyboard_colorKey, 0);
colorKeyActivated = s.getColor(R.styleable.keyboard_colorKeyActivated, 0);
colorKeyAction = s.getColor(R.styleable.keyboard_colorKeyAction, colorKey);
colorKeySpaceBar = s.getColor(R.styleable.keyboard_colorKeySpaceBar, colorKey);
// colorKeyboard = s.getColor(R.styleable.keyboard_colorKeyboard, 0);
colorNavBar = s.getColor(R.styleable.keyboard_navigationBarColor, 0);
isLightNavBar = s.getBoolean(R.styleable.keyboard_windowLightNavigationBar, false);
@@ -55,6 +61,8 @@ public class Theme
keyBorderRadius = s.getDimension(R.styleable.keyboard_keyBorderRadius, 0);
keyBorderWidth = s.getDimension(R.styleable.keyboard_keyBorderWidth, 0);
keyBorderWidthActivated = s.getDimension(R.styleable.keyboard_keyBorderWidthActivated, 0);
keyBorderWidthAction = s.getDimension(R.styleable.keyboard_keyBorderWidthAction, 0);
keyBorderWidthSpaceBar = s.getDimension(R.styleable.keyboard_keyBorderWidthSpaceBar, 0);
keyBorderColorLeft = s.getColor(R.styleable.keyboard_keyBorderColorLeft, colorKey);
keyBorderColorTop = s.getColor(R.styleable.keyboard_keyBorderColorTop, colorKey);
keyBorderColorRight = s.getColor(R.styleable.keyboard_keyBorderColorRight, colorKey);
@@ -63,7 +71,7 @@ public class Theme
}
/** Interpolate the 'value' component toward its opposite by 'alpha'. */
int adjustLight(int color, float alpha)
static int adjustLight(int color, float alpha)
{
float[] hsv = new float[3];
Color.colorToHSV(color, hsv);
@@ -101,6 +109,9 @@ public class Theme
public final Key key;
public final Key key_activated;
public final Key key_action;
public final Key key_space_bar;
public final Key key_suggestion;
public Computed(Theme theme, Config config, float keyWidth, KeyboardData layout)
{
@@ -114,8 +125,11 @@ public class Theme
// added on the right and on the bottom of every keys.
margin_top = config.marginTop + vertical_margin / 2;
margin_left = horizontal_margin / 2;
key = new Key(theme, config, keyWidth, false);
key_activated = new Key(theme, config, keyWidth, true);
key = new Key(theme, config, keyWidth, false, KeyboardData.Key.Role.Normal);
key_action = new Key(theme, config, keyWidth, false, KeyboardData.Key.Role.Action);
key_space_bar = new Key(theme, config, keyWidth, false, KeyboardData.Key.Role.Space_bar);
key_activated = new Key(theme, config, keyWidth, true, KeyboardData.Key.Role.Normal);
key_suggestion = new Key(theme, config, keyWidth, false, KeyboardData.Key.Role.Suggestion);
indication_paint = init_label_paint(config, null);
indication_paint.setColor(theme.subLabelColor);
}
@@ -135,20 +149,41 @@ public class Theme
final Paint _special_sublabel_paint;
final int _label_alpha_bits;
public Key(Theme theme, Config config, float keyWidth, boolean activated)
public Key(Theme theme, Config config, float keyWidth, boolean activated,
KeyboardData.Key.Role role)
{
bg_paint.setColor(activated ? theme.colorKeyActivated : theme.colorKey);
if (config.borderConfig)
border_radius = config.borderConfig ? config.customBorderRadius * keyWidth : theme.keyBorderRadius;
int bg_color;
if (activated)
{
border_radius = config.customBorderRadius * keyWidth;
border_width = config.customBorderLineWidth;
bg_color = theme.colorKeyActivated;
border_width = theme.keyBorderWidthActivated;
bg_paint.setAlpha(config.keyActivatedOpacity);
}
else
{
border_radius = theme.keyBorderRadius;
border_width = activated ? theme.keyBorderWidthActivated : theme.keyBorderWidth;
switch (role)
{
case Action:
bg_color = theme.colorKeyAction;
border_width = theme.keyBorderWidthAction;
break;
case Space_bar:
bg_color = theme.colorKeySpaceBar;
border_width = theme.keyBorderWidthSpaceBar;
break;
case Suggestion:
bg_color = 0;
border_width = 0;
break;
default:
bg_color = theme.colorKey;
border_width = config.borderConfig ? config.customBorderLineWidth : theme.keyBorderWidth;
break;
}
bg_paint.setAlpha(config.keyOpacity);
}
bg_paint.setAlpha(activated ? config.keyActivatedOpacity : config.keyOpacity);
bg_paint.setColor(bg_color);
border_left_paint = init_border_paint(config, border_width, theme.keyBorderColorLeft);
border_top_paint = init_border_paint(config, border_width, theme.keyBorderColorTop);
border_right_paint = init_border_paint(config, border_width, theme.keyBorderColorRight);
@@ -73,7 +73,7 @@ public class CandidatesView extends LinearLayout
}
}
public void clear_candidates()
void clear_candidates()
{
for (int i = 0; i < _item_views.length; i++)
{
@@ -101,7 +101,7 @@ public class CandidatesView extends LinearLayout
float row_height = config.keyboard_rows_height_pixels * (1 - config.key_vertical_margin);
ViewGroup.MarginLayoutParams p =
(ViewGroup.MarginLayoutParams)getLayoutParams();
p.height = (int)row_height;
p.height = (int)(row_height * 0.6f);
setLayoutParams(p);
// Match the size of labels on the keyboard.
float text_size = row_height * config.characterSize * config.labelTextSize;
@@ -45,13 +45,14 @@ public final class Suggestions
clear();
else
query_suggestions(word);
set_suggestions();
_callback.set_suggestions(this);
}
void clear()
{
count = 0;
suggestions[0] = null;
for (int i = 0; i < MAX_COUNT; i++)
suggestions[i] = null;
emoji_suggestion = null;
}
@@ -120,11 +121,6 @@ public final class Suggestions
return b.toString();
}
void set_suggestions()
{
_callback.set_suggestions(this);
}
static final int[] NO_RESULTS = new int[0];
public static interface Callback
+1 -1
View File
@@ -37,6 +37,6 @@
<key key0="ز" key3="."/>
<key key0="ظ" key3="&#1567;"/>
<key key0="د"/>
<key width="1.0" key0="backspace" key2="delete"/>
<key width="1.0" role="action" key0="backspace" key2="delete"/>
</row>
</keyboard>
+1 -1
View File
@@ -37,6 +37,6 @@
<key key0="و" key1="ۋ" key4="ۊ"/>
<key key0="چ"/>
<key key0="ٚ" key1="ٛ"/>
<key key0="backspace" key2="delete"/>
<key role="action" key0="backspace" key2="delete"/>
</row>
</keyboard>
+1 -1
View File
@@ -39,6 +39,6 @@
<key key0="و" key1=","/>
<key key0="ز" key1="."/>
<key key0="ظ" key1="&#1567;"/>
<key width="1.5" key0="backspace" key2="delete"/>
<key width="1.5" role="action" key0="backspace" key2="delete"/>
</row>
</keyboard>
+1 -1
View File
@@ -34,6 +34,6 @@
<key key0="ب" key1="ٮ" />
<key key0="ن" key2="&#1548;" key3="&#1563;"/>
<key key0="م" key2="." key3=":" />
<key key0="backspace" key2="delete"/>
<key role="action" key0="backspace" key2="delete"/>
</row>
</keyboard>
+1 -1
View File
@@ -39,6 +39,6 @@
<key key0="و" key1=","/>
<key key0="ز" key1="."/>
<key key0="ظ" key1="&#1567;"/>
<key width="1.5" key0="backspace" key2="delete"/>
<key width="1.5" role="action" key0="backspace" key2="delete"/>
</row>
</keyboard>
+1 -1
View File
@@ -36,6 +36,6 @@
<key key0="پ" key2="&#1567;"/>
<key key0="و"/>
<key key0="چ"/>
<key width="1.5" key0="backspace" key2="delete"/>
<key width="1.5" role="action" key0="backspace" key2="delete"/>
</row>
</keyboard>
+2 -2
View File
@@ -37,7 +37,7 @@
<key key0="պ" key4=":"/>
</row>
<row>
<key key0="shift" key2="loc capslock"/>
<key role="action" key0="shift" key2="loc capslock"/>
<key key0="դ"/>
<key key0="չ"/>
<key key0="յ"/>
@@ -46,6 +46,6 @@
<key key0="ք"/>
<key key0="խ"/>
<key key0="շ" key4="."/>
<key key0="backspace" key2="delete"/>
<key role="action" key0="backspace" key2="delete"/>
</row>
</keyboard>
+3 -3
View File
@@ -37,7 +37,7 @@
<key key0="ե" key2="և" key4=":"/>
</row>
<row>
<key key0="shift" key2="loc capslock"/>
<key role="action" key0="shift" key2="loc capslock"/>
<key key0="ց"/>
<key key0="զ"/>
<key key0="չ"/>
@@ -46,6 +46,6 @@
<key key0="ն"/>
<key key0="մ"/>
<key key0="շ" key4="."/>
<key key0="backspace" key2="delete"/>
<key role="action" key0="backspace" key2="delete"/>
</row>
</keyboard>
</keyboard>
+1 -1
View File
@@ -35,6 +35,6 @@
<key c="," sw="ষ" ne="("/>
<key c="." sw="।" ne=")"/>
<key c="য়" sw="য"/>
<key width="1.5" c="backspace" ne="delete"/>
<key role="action" width="1.5" c="backspace" ne="delete"/>
</row>
</keyboard>
+2 -2
View File
@@ -24,7 +24,7 @@
<key key0="দ" key1="_" key2="ধ" key3="(" key4=")"/>
</row>
<row>
<key width="1.4" key0="shift" key2="loc capslock"/>
<key width="1.4" role="action" key0="shift" key2="loc capslock"/>
<key shift="0.1" key0="্র" key2="্য" key3="\#" key4="*"/>
<key key0="ো" key1="ৌ" key2="ও" key3="ঔ" key4="\@"/>
<key key0="ে" key1="ৈ" key2="এ" key3="ঐ" key4="%"/>
@@ -32,6 +32,6 @@
<key key0="ন" key1="৳" key2="ণ" key3=";" key4="."/>
<key key0="স" key1="&quot;" key2="ষ" key3="!" key4=","/>
<key key0="ম" key1="'" key2="শ" key3="\?" key4="।"/>
<key shift="0.1" width="1.4" key0="backspace" key2="delete"/>
<key shift="0.1" width="1.4" role="action" key0="backspace" key2="delete"/>
</row>
</keyboard>
+2 -2
View File
@@ -24,7 +24,7 @@
<key key0="ল" key1="ং" key2="॥" key3="halfspace" />
</row>
<row>
<key width="1.5" key0="shift" />
<key width="1.5" role="action" key0="shift" />
<key key0="য়" key1="য" />
<key key0="শ" key1="ঢ়" />
<key key0="চ" key1="ছ" key2="ৃ" key3="," />
@@ -32,6 +32,6 @@
<key key0="ব" key1="ভ" key2="\?" key3="্" />
<key key0="ন" key1="ণ" key2=":" key3=";" />
<key key0="ম" key1="ঙ" key2="&quot;" key3="'" />
<key width="1.5" key0="backspace" key2="delete" />
<key width="1.5" role="action" key0="backspace" key2="delete" />
</row>
</keyboard>
+2 -2
View File
@@ -27,7 +27,7 @@
<key key0="п" key2="|" key3="\\"/>
</row>
<row>
<key key0="shift" key2="loc capslock"/>
<key role="action" key0="shift" key2="loc capslock"/>
<key key0="я"/>
<key key0="ч"/>
<key key0="ё" key1="е"/>
@@ -37,6 +37,6 @@
<key key0="т" key1="₮" key2="\?" key3="/"/>
<key key0="ь" key1="ъ" key2=":" key3=";"/>
<key key0="в" key1="ю" key2="&quot;" key3="'"/>
<key key0="backspace" key2="delete"/>
<key role="action" key0="backspace" key2="delete"/>
</row>
</keyboard>
+2 -2
View File
@@ -27,7 +27,7 @@
<key key0="ѣ" key1="ԑ" key2="/" key3="\\" key4="|" />
</row>
<row>
<key width="1.18" key0="shift" key2="loc capslock" key3="loc tab" key4="loc esc"
<key role="action" width="1.18" key0="shift" key2="loc capslock" key3="loc tab" key4="loc esc"
/>
<key width="0.96" key0="я" key1="ꙗ" key2="ꙝ" key4="combining_titlo" />
<key width="0.96" key0="ч" key1="ћ" key2="ќ" key4="combining_breve" />
@@ -38,6 +38,6 @@
<key width="0.96" key0="ь" key1="ѧ" key2="&lt;" key3="⁙" />
<key width="0.96" key0="б" key1="ђ" key2="&gt;" key3="⁘" />
<key width="0.96" key0="ю" key1="ꙛ" key2="·" key3="⁖"/>
<key width="1.18" key0="backspace" key2="delete"/>
<key role="action" width="1.18" key0="backspace" key2="delete"/>
</row>
</keyboard>
+2 -2
View File
@@ -40,7 +40,7 @@
<key key0="э" key2="|" key3="\\"/>
</row>
<row>
<key key0="shift" key2="loc capslock"/>
<key role="action" key0="shift" key2="loc capslock"/>
<key key0="я"/>
<key key0="ч"/>
<key key0="с"/>
@@ -50,6 +50,6 @@
<key key0="ь" key2="\?" key3="/"/>
<key key0="б" key2=":" key3=";"/>
<key key0="ю" key2="&quot;" key3="'"/>
<key key0="backspace" key2="delete"/>
<key role="action" key0="backspace" key2="delete"/>
</row>
</keyboard>
+2 -2
View File
@@ -27,7 +27,7 @@
<key key0="э" key2="|" key3="\\"/>
</row>
<row scale="11">
<key width="1.22" key0="shift" key2="loc capslock"/>
<key width="1.22" role="action" key0="shift" key2="loc capslock"/>
<key key0="я"/>
<key key0="ч"/>
<key key0="с"/>
@@ -37,6 +37,6 @@
<key key0="ь" key1="ъ" key2="\?" key3="/"/>
<key key0="б" key2=":" key3=";"/>
<key key0="ю" key2="&quot;" key3="'"/>
<key width="1.22" key0="backspace" key2="delete"/>
<key width="1.22" role="action" key0="backspace" key2="delete"/>
</row>
</keyboard>
+2 -2
View File
@@ -27,7 +27,7 @@
<key key0="є" key2="|" key3="\\"/>
</row>
<row>
<key width="1.1" key0="shift" key2="loc capslock"/>
<key width="1.1" role="action" key0="shift" key2="loc capslock"/>
<key key0="я"/>
<key key0="ч" />
<key key0="с" />
@@ -37,6 +37,6 @@
<key key0="ь" key2=":" key3=";"/>
<key key0="б" key2="&quot;" key3="'"/>
<key key0="ю" key1="«" key2="»"/>
<key width="1.1" key0="backspace" key2="delete"/>
<key width="1.1" role="action" key0="backspace" key2="delete"/>
</row>
</keyboard>
+2 -2
View File
@@ -29,7 +29,7 @@
<key key0="ж" key2=")" key3="("/>
</row>
<row>
<key width="1.5" key0="shift" key2="loc capslock"/>
<key role="action" width="1.5" key0="shift" key2="loc capslock"/>
<key key0="я"/>
<key key0="ч"/>
<key key0="ѣ"/>
@@ -40,6 +40,6 @@
<key key0="ь"/>
<key key0="б" key2="«"/>
<key key0="ю" key2="»"/>
<key width="1.5" key0="backspace" key2="delete"/>
<key role="action" width="1.5" key0="backspace" key2="delete"/>
</row>
</keyboard>
+2 -2
View File
@@ -27,7 +27,7 @@
<key key0="ќ" key2="=" key3="+"/>
</row>
<row scale="11">
<key width="1.5" key0="shift" key2="loc capslock"/>
<key role="action" width="1.5" key0="shift" key2="loc capslock"/>
<key key0="з"/>
<key key0="џ"/>
<key key0="ц"/>
@@ -37,7 +37,7 @@
<key key0="м" key2=":" key3=";"/>
<key key0="ѓ" key2="`" key3="'"/>
<key key0="ж" key2="“" key3="„"/>
<key width="1.5" key0="backspace" key2="delete"/>
<key role="action" width="1.5" key0="backspace" key2="delete"/>
</row>
</keyboard>
+2 -2
View File
@@ -62,7 +62,7 @@
<key key0="ћ" ne="`" sw="|"/>
</row>
<row>
<key width="1.5" key0="shift" nw="loc superscript" ne="loc capslock" sw="loc subscript"/>
<key width="1.5" role="action" key0="shift" nw="loc superscript" ne="loc capslock" sw="loc subscript"/>
<key key0="ж" nw="loc undo" ne="loc redo" sw="&lt;" se="&gt;"/>
<key key0="џ" ne="loc cut"/>
<key key0="ц" ne="loc copy"/>
@@ -71,6 +71,6 @@
<key key0="н" nw="!" ne="\?" sw="/"/>
<key key0="м" ne=";" sw=","/>
<key key0="ђ" ne=":" sw="."/>
<key width="1.5" key0="backspace" ne="delete"/>
<key width="1.5" role="action" key0="backspace" ne="delete"/>
</row>
</keyboard>
+2 -2
View File
@@ -27,7 +27,7 @@
<key key0="ч" key1="„" key2="“"/>
</row>
<row>
<key width="1.5" key0="shift" key2="loc capslock"/>
<key width="1.5" role="action" key0="shift" key2="loc capslock"/>
<key key0="ю"/>
<key key0="й"/>
<key key0="ъ" key1="loc accent_cedille" key2="&lt;" key4=">"/>
@@ -36,6 +36,6 @@
<key key0="п" key2="&quot;" key3="'"/>
<key key0="р" key3=","/>
<key key0="л" key3="."/>
<key width="1.5" key0="backspace" key2="delete"/>
<key width="1.5" role="action" key0="backspace" key2="delete"/>
</row>
</keyboard>
+2 -2
View File
@@ -24,7 +24,7 @@
<key key0="л" key1="щ" key2="|" key3="\\" key4="ю"/>
</row>
<row>
<key width="1.5" key0="shift" key2="loc capslock"/>
<key width="1.5" role="action" key0="shift" key2="loc capslock"/>
<key key0="з"/>
<key key0="ь" key3="ѝ"/>
<key key0="ц" key2="&lt;" key3="."/>
@@ -32,6 +32,6 @@
<key key0="б" key2="\?" key3="/"/>
<key key0="н" key2=":" key3=";"/>
<key key0="м" key2="&quot;" key3="'"/>
<key width="1.5" key0="backspace" key2="delete"/>
<key width="1.5" role="action" key0="backspace" key2="delete"/>
</row>
</keyboard>
+2 -2
View File
@@ -28,7 +28,7 @@
<key key0="щ" key2="/" key3="\\"/>
</row>
<row>
<key width="2" key0="shift" key2="loc capslock"/>
<key role="action" width="2" key0="shift" key2="loc capslock"/>
<key key0="э"/>
<key key0="з"/>
<key key0="ь" key1="ъ"/>
@@ -37,6 +37,6 @@
<key key0="б"/>
<key key0="н" key2="«" key3=","/>
<key key0="м" key2="»" key3="."/>
<key width="2" key0="backspace" key2="delete"/>
<key role="action" width="2" key0="backspace" key2="delete"/>
</row>
</keyboard>
+2 -2
View File
@@ -27,7 +27,7 @@
<key key0="э" key7="\?" key3="/" />
</row>
<row scale="11">
<key width="1.22" key0="shift" key2="loc capslock" />
<key width="1.22" role="action" key0="shift" key2="loc capslock" />
<key key0="я" key7="`" key8=";" />
<key key0="ч" key7="*" key8=":" />
<key key0="с" key7="&amp;" key8="\#" />
@@ -37,6 +37,6 @@
<key key0="ӣ" key3="&lt;" key2="&gt;" />
<key key0="б" key7="ъ" key8="ы" />
<key key0="ю" key7="&quot;" key8="'"/>
<key width="1.22" key0="." key7="," />
<key width="1.22" role="action" key0="." key7="," />
</row>
</keyboard>
+1 -1
View File
@@ -27,7 +27,7 @@
<key key0="э" key7="/" key8="|" />
</row>
<row scale="11">
<key width="1.22" key0="shift" />
<key width="1.22" role="action" key0="shift" />
<key key0="ꙗ" key7="combining_breve" key8=";" />
<key key0="ч" key7="combining_pokrytie" key8=":" />
<key key0="с" key7="combining_inverted_breve" key8="`" />
+1 -1
View File
@@ -24,6 +24,6 @@
<key c="ं" nw="ॐ" ne="।" sw="ः" se="&quot;" anticircle="१" indication="१"/>
<key c="्" nw="," ne=";" sw="!" se="\?" anticircle="२" indication="२"/>
<key c="़" nw="॰" sw="-" se="॒" anticircle="३" indication="३"/>
<key width="2" c="backspace" ne="delete"/>
<key width="2" role="action" c="backspace" ne="delete"/>
</row>
</keyboard>
+2 -2
View File
@@ -24,7 +24,7 @@
<key key0="त" key1="थ" key2="ख़" key3="(" key4=")"/>
</row>
<row>
<key width="1.4" key0="shift" key2="loc capslock"/>
<key width="1.4" role="action" key0="shift" key2="loc capslock"/>
<key shift="0.1" key0="ट" key1="ठ" key2="ड़" key3="\#" key4="*"/>
<key key0="ं" key1="ँ" key3="ॐ" key4="\@"/>
<key key0="म" key1="ण" key2="य" key3="य़" key4="%"/>
@@ -32,6 +32,6 @@
<key key0="व" key2="ढ़" key3=";" key4="."/>
<key key0="ल" key1="ळ" key2="फ़" key3="!" key4=","/>
<key key0="स" key1="श" key2="ष" key3="\?"/>
<key shift="0.1" width="1.4" key0="backspace" key2="delete"/>
<key shift="0.1" width="1.4" role="action" key0="backspace" key2="delete"/>
</row>
</keyboard>
+2 -2
View File
@@ -29,7 +29,7 @@
<key key0="ल" key1="ऌ" key2="।" key3 ="ॢ" key4="॥"/>
</row>
<row>
<key width="1.5" key0="shift" key2="loc capslock"/>
<key width="1.5" role="action" key0="shift" key2="loc capslock"/>
<key key0="ज्ञ" key2="|" key3="\\" key4="ऍ"/>
<key key0="ष" key1="क्ष" key3 ="ॅ" key4="ॉ"/>
<key key0="च" key2="&lt;" key3=","/>
@@ -37,6 +37,6 @@
<key key0="ब" key2="\?" key3="/"/>
<key key0="न" key1="ङ" key2=":" key3=";" key4="ऽ"/>
<key key0="म" key1="ॐ" key2="&quot;" key3="'" key4="ँ"/>
<key width="1.5" key0="backspace" key2="delete"/>
<key width="1.5" role="action" key0="backspace" key2="delete"/>
</row>
</keyboard>
+2 -2
View File
@@ -28,7 +28,7 @@
<key key0="ჩ" key1="ჭ"/>
</row>
<row>
<key width="1.5" key0="shift" key2="loc capslock"/>
<key width="1.5" role="action" key0="shift" key2="loc capslock"/>
<key key0="ზ" key1="ჵ"/>
<key key0="ხ" key1="ჴ" key2="loc †"/>
<key key0="ც" key2="&lt;" key3="."/>
@@ -38,6 +38,6 @@
<key key0="მ" key2="&quot;" key3="'"/>
<key key0="ძ"/>
<key key0="ჟ"/>
<key width="1.5" key0="backspace" key2="delete"/>
<key width="1.5" role="action" key0="backspace" key2="delete"/>
</row>
</keyboard>
+2 -2
View File
@@ -24,7 +24,7 @@
<key key0="ლ" key1="₾" key2="|" key3="\\"/>
</row>
<row>
<key width="1.5" key0="shift" key2="loc capslock"/>
<key width="1.5" role="action" key0="shift" key2="loc capslock"/>
<key key0="ზ" key1="ძ" key2="ჵ"/>
<key key0="ხ" key2="ჴ" key3="loc †"/>
<key key0="ც" key1="ჩ" key3="&lt;" key4="."/>
@@ -32,7 +32,7 @@
<key key0="ბ" key2="\?" key3="/"/>
<key key0="ნ" key1="ჼ" key2="`" key3=":" key4=";"/>
<key key0="მ" key2="&quot;" key3="'"/>
<key width="1.5" key0="backspace" key2="delete"/>
<key width="1.5" role="action" key0="backspace" key2="delete"/>
</row>
</keyboard>
+2 -2
View File
@@ -25,7 +25,7 @@
<key key0="accent_aigu" key1="accent_trema" key3="accent_grave"/>
</row>
<row>
<key width="1.5" key0="shift" key2="loc capslock"/>
<key width="1.5" role="action" key0="shift" key2="loc capslock"/>
<key key0="ζ"/>
<key key0="χ"/>
<key key0="ψ" key2="&lt;" key3="."/>
@@ -33,6 +33,6 @@
<key key0="β" key2="\?" key3="/"/>
<key key0="ν" key2=":"/>
<key key0="μ" key2="&quot;" key3="'"/>
<key width="1.5" key0="backspace" key2="delete"/>
<key width="1.5" role="action" key0="backspace" key2="delete"/>
</row>
</keyboard>
+2 -2
View File
@@ -24,7 +24,7 @@
<key key0="લ" key1="।" key2="|" key3="\\" key4="॥"/>
</row>
<row>
<key width="1.5" key0="shift" key2="loc capslock"/>
<key width="1.5" role="action" key0="shift" key2="loc capslock"/>
<key key0="ઞ" key1="જ્ઞ" key2="ૅ" key3="ઙ" key4="ઍ"/>
<key key0="ષ" key1="ક્ષ" key2="ૉ" key3="઼" key4="ઑ"/>
<key key0="ચ" key2="&lt;" key3="."/>
@@ -32,6 +32,6 @@
<key key0="બ" key2="\?" key3="/"/>
<key key0="ન" key2=":" key3=";"/>
<key key0="મ" key1="ૐ" key2="&quot;" key3="'" key4="॑" key6="ઽ"/>
<key width="1.5" key0="backspace" key2="delete"/>
<key width="1.5" role="action" key0="backspace" key2="delete"/>
</row>
</keyboard>
+2 -2
View File
@@ -24,7 +24,7 @@
<key key0="ㅣ" key2="|" key3="\\"/>
</row>
<row>
<key width="1.5" key0="shift" key2="loc capslock"/>
<key width="1.5" role="action" key0="shift" key2="loc capslock"/>
<key key0="ㅋ"/>
<key key0="ㅌ" key1="ㄾ" key3="&lt;" key4="&gt;"/>
<key key0="ㅊ" key3="."/>
@@ -32,6 +32,6 @@
<key key0="ㅠ" key1="ㅞ" key2="ㅝ" key3="/" key4="\?"/>
<key key0="ㅜ" key2="ㅟ" key3=";" key4=":"/>
<key key0="ㅡ" key2="ㅢ" key3="'" key4="&quot;"/>
<key width="1.5" key0="backspace" key2="delete"/>
<key width="1.5" role="action" key0="backspace" key2="delete"/>
</row>
</keyboard>
+1 -1
View File
@@ -12,7 +12,7 @@
<key key0="ן" key2="8" key3="*"/>
<key key0="ם" key2="9" key3="b(" key4="lrm"/>
<key key0="פ" key2="0" key3="b)" key4="rlm"/>
<key key0="backspace" key2="delete"/>
<key role="action" key0="backspace" key2="delete"/>
</row>
<row scale="11">
<key key0="ש" key2="`" key1="loc tab" key3="sindot_placeholder" key4="shindot_placeholder" width="1.30"/>
+1 -1
View File
@@ -35,6 +35,6 @@
<key key0="מ" key1="blt" key2=","/>
<key key0="צ" key1="bgt" key2="."/>
<key key0="/" key1="\?"/>
<key key0="backspace" key2="delete" width="1.333"/>
<key role="action" key0="backspace" key2="delete" width="1.333"/>
</row>
</keyboard>
+1 -1
View File
@@ -25,6 +25,6 @@
<key key0="।" key1="'" key2="&quot;" key3="." key4="," key6="॥"/>
<key key0="೦" key1=":" key2=";" key3="-" key4="_"/>
<key key0="೫" key1="೧" key2="೩" key3="೭" key4="೯" key5="೪" key6="೬" key7="೨" key8="೮"/>
<key key0="backspace" key2="delete"/>
<key role="action" key0="backspace" key2="delete"/>
</row>
</keyboard>
+3 -3
View File
@@ -30,7 +30,7 @@
<key key0="ş" key1="x"/>
</row>
<row>
<key width="1.5" key0="shift" key2="loc capslock"/>
<key role="action" width="1.5" key0="shift" key2="loc capslock"/>
<key key0="j" key2="«"/>
<key key0="ö" key2="»"/>
<key key0="v" key2="&lt;" key3="."/>
@@ -39,6 +39,6 @@
<key key0="z" key2=":" key3=";"/>
<key key0="s" key2="&quot;" key3="'"/>
<key key0="b" key2="×"/>
<key width="1.5" key0="backspace" key2="delete"/>
<key role="action" width="1.5" key0="backspace" key2="delete"/>
</row>
</keyboard>
</keyboard>
+2 -2
View File
@@ -26,13 +26,13 @@
<key key0="m" key1="£" key3="µ"/>
</row>
<row>
<key width="2.0" key0="shift" key2="loc capslock"/>
<key width="2.0" role="action" key0="shift" key2="loc capslock"/>
<key key0="w" key1="\\" key2="`" key3="&lt;" key4="&gt;"/>
<key key0="x" key1="loc †"/>
<key key0="c" key2="\?" key3=","/>
<key key0="v" key2="." key3=";"/>
<key key0="b" key2="/" key3=":"/>
<key key0="n" key2="+" key3="="/>
<key width="2.0" key0="backspace" key2="delete"/>
<key width="2.0" role="action" key0="backspace" key2="delete"/>
</row>
</keyboard>
+2 -2
View File
@@ -27,13 +27,13 @@
<key key0="m" key3="*"/>
</row>
<row>
<key width="2.0" key0="shift" key2="loc capslock"/>
<key width="2.0" role="action" key0="shift" key2="loc capslock"/>
<key key0="w" key3="&lt;" key4="&gt;"/>
<key key0="x" key1="loc †"/>
<key key0="c" key1="loc accent_cedille" key2="ç" key3="," key4="\?"/>
<key key0="v" key3=";" key4="."/>
<key key0="b" key3=":" key4="/"/>
<key key0="n" key1="loc accent_tilde" key2="§" key4="!"/>
<key width="2.0" key0="backspace" key2="delete"/>
<key width="2.0" role="action" key0="backspace" key2="delete"/>
</row>
</keyboard>
+2 -2
View File
@@ -26,7 +26,7 @@
<key key0="m" key2="&quot;"/>
</row>
<row>
<key width="1.5" key0="shift" key2="loc capslock" key3="&lt;"/>
<key width="1.5" role="action" key0="shift" key2="loc capslock" key3="&lt;"/>
<key key0="y" key4="%"/>
<key key0="x" key4="\@"/>
<key key0="k" key4="~"/>
@@ -35,6 +35,6 @@
<key key0="g" key3="/" key4="\\"/>
<key key0="h"/>
<key key0="f"/>
<key width="1.5" key0="backspace" key2="delete" key3=">"/>
<key width="1.5" role="action" key0="backspace" key2="delete" key3=">"/>
</row>
</keyboard>
+2 -2
View File
@@ -114,7 +114,7 @@
-->
<row>
<!--left side-->
<key width="1.5" key0="shift" ne="loc capslock"
<key width="1.5" role="action" key0="shift" ne="loc capslock"
se="\#"/>
<key key0="f" se="$"/>
<key key0="v" se="|"/>
@@ -125,7 +125,7 @@
<key key0="y" sw="%"/>
<key key0="z" sw="," nw="&quot;"/>
<key key0="k" sw="." nw="&apos;"/>
<key width="1.5" key0="backspace"
<key width="1.5" role="action" key0="backspace"
sw=";" nw="delete"/>
</row>
</keyboard>
+2 -3
View File
@@ -27,7 +27,7 @@
</row>
<row>
<key key0="shift" key2="loc capslock" width="1.5" />
<key key0="shift" key2="loc capslock" width="1.5" role="action"/>
<key key0="z" key1="," key2="."/>
<key key0="x" key1="&gt;" key2="&lt;"/>
<key key0="c" key1="{" key2="}" key3="loc accent_cedille"/>
@@ -35,7 +35,6 @@
<key key0="b" key1="(" key2=")"/>
<key key0="k" key1=";" key2=":"/>
<key key0="m" key1="!" key2="\?" />
<key key0="backspace" key1="delete" shift="0.25" width="1.25"/>
<key key0="backspace" key1="delete" shift="0.25" width="1.25" role="action"/>
</row>
</keyboard>
+2 -2
View File
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<keyboard name="Dvorak" script="latin">
<row>
<key key0="shift" width="1.5" key2="loc esc" key4="loc tab"/>
<key role="action" key0="shift" width="1.5" key2="loc esc" key4="loc tab"/>
<key key0="p" key1="loc accent_ring" key2="." key3="&lt;"/>
<key key0="y" key1="loc accent_grave" key2="," key3="&gt;"/>
<key key0="f" key4="loc €"/>
@@ -9,7 +9,7 @@
<key key0="c" key1="loc accent_trema" key2="loc accent_circonflexe" key3="{" key4="}"/>
<key key0="r" key3="[" key4="]"/>
<key key0="l" key2="=" key3="+" key4="loc £"/>
<key key0="backspace" key2="delete" width="1.5"/>
<key role="action" key0="backspace" key2="delete" width="1.5"/>
</row>
<row>
<key key0="a" key2="1" key3="loc å" key4="!"/>
+7 -7
View File
@@ -29,7 +29,7 @@
<key key0="y" key3="\@"/>
</row>
<row>
<key width="1.5" key0="shift" key1="loc esc" key2="loc capslock"/>
<key width="1.5" role="action" key0="shift" key1="loc esc" key2="loc capslock"/>
<key key0="ü" key4="\#"/>
<key key0="ö" key4="$"/>
<key key0="ä" key4="|"/>
@@ -38,14 +38,14 @@
<key key0="b" key4="+"/>
<key key0="m" key4="%"/>
<key key0="." key1="," key3="&quot;" key4="'"/>
<key width="1.5" key0="backspace" key2="delete"/>
<key width="1.5" role="action" key0="backspace" key2="delete"/>
</row>
<row height="0.95">
<key width="1.7" key0="ctrl" key1="loc switch_greekmath" key2="loc meta" key4="switch_numeric"/>
<key width="1.1" key0="fn" key1="loc alt" key2="loc change_method" key3="switch_emoji" key4="config"/>
<key width="4.4" key0="space" key7="switch_forward" key8="switch_backward" key5="cursor_left" key6="cursor_right"/>
<key width="1.1" key0="loc compose" key7="up" key6="right" key5="left" key8="down" key1="loc home" key2="loc page_up" key3="loc end" key4="loc page_down"/>
<key width="1.7" role="action" key0="ctrl" key1="loc switch_greekmath" key2="loc meta" key4="switch_numeric"/>
<key width="1.1" role="action" key0="fn" key1="loc alt" key2="loc change_method" key3="switch_emoji" key4="config"/>
<key width="4.4" role="space_bar" key0="space" key7="switch_forward" key8="switch_backward" key5="cursor_left" key6="cursor_right"/>
<key width="1.1" role="action" key0="loc compose" key7="up" key6="right" key5="left" key8="down" key1="loc home" key2="loc page_up" key3="loc end" key4="loc page_down"/>
<key key0="j" key4=";"/>
<key width="1.7" key0="enter" key1="loc voice_typing" key2="action"/>
<key width="1.7" role="action" key0="enter" key1="loc voice_typing" key2="action"/>
</row>
</keyboard>
+2 -2
View File
@@ -37,7 +37,7 @@
<key c=";" n="⋄" s=","/>
</row>
<row>
<key c="shift" e="loc capslock"/>
<key role="action" c="shift" e="loc capslock"/>
<key c="z" nw="⊂" se="⍝"/>
<key c="x" nw="⊃"/>
<key c="c" nw="∩" ne="⍛" sw="." se=":"/>
@@ -45,6 +45,6 @@
<key c="b" nw="⊥" ne="⍎" sw="⌿" se="⍀"/>
<key c="n" nw="⊤" ne="⍕" sw="/" se="\\"/>
<key c="m" nw="≡" ne="≢" sw="∥" se="⍠"/>
<key width="2" c="backspace" e="delete"/>
<key role="action" width="2" c="backspace" e="delete"/>
</row>
</keyboard>
+2 -2
View File
@@ -31,7 +31,7 @@
<key key0="ə"/>
</row>
<row>
<key width="1.5" key0="shift" key2="loc capslock"/>
<key width="1.5" role="action" key0="shift" key2="loc capslock"/>
<key key0="z"/>
<key key0="x" key2="loc †"/>
<key key0="c" key2="&lt;" key3="." key4="ç"/>
@@ -40,6 +40,6 @@
<key key0="n" key2=":" key3=";"/>
<key key0="m" key2="&quot;" key3="'" key4="₼"/>
<key key0="ş"/>
<key width="1.5" key0="backspace" key2="delete"/>
<key width="1.5" role="action" key0="backspace" key2="delete"/>
</row>
</keyboard>
+2 -2
View File
@@ -37,7 +37,7 @@
<key c=";" w="·" n="⋄" s=","/>
</row>
<row>
<key c="shift" e="loc capslock"/>
<key role="action" c="shift" e="loc capslock"/>
<key c="z" nw="⥊" ne="⋈"/>
<key c="x" nw="𝕩"/>
<key c="c" nw="↓" ne="˙" sw="." se=":"/>
@@ -45,6 +45,6 @@
<key c="b" s="⌊" n="⌈"/>
<key c="n" nw="≤" ne="≥" n="≠" sw="&lt;" se="&gt;" s="="/>
<key c="m" nw="≡" ne="≢" sw="/" se="?"/>
<key width="2" c="backspace" e="delete"/>
<key role="action" width="2" c="backspace" e="delete"/>
</row>
</keyboard>
+2 -2
View File
@@ -26,7 +26,7 @@
<key key0="ç" key1="|"/>
</row>
<row>
<key width="1.5" key0="shift" key2="loc capslock"/>
<key width="1.5" role="action" key0="shift" key2="loc capslock"/>
<key key0="z"/>
<key key0="x" key2="loc †"/>
<key key0="c"/>
@@ -34,6 +34,6 @@
<key key0="b"/>
<key key0="n" key1="&lt;" key2="&gt;" key3="," key4="."/>
<key key0="m" key1=":" key2=";" key3="/" key4="\?"/>
<key width="1.5" key0="backspace" key2="delete"/>
<key width="1.5" role="action" key0="backspace" key2="delete"/>
</row>
</keyboard>
+2 -2
View File
@@ -25,7 +25,7 @@
<key key0="accent_circonflexe" key2="accent_trema" key3="accent_grave" />
</row>
<row>
<key key0="shift" key2="loc capslock"/>
<key role="action" key0="shift" key2="loc capslock"/>
<key key0="z"/>
<key key0="x" key2="loc †"/>
<key key0="c" key2="&lt;" key3="."/>
@@ -34,6 +34,6 @@
<key key0="n" key2=":" key3=";"/>
<key key0="m" key2="&quot;"/>
<key key0="'" key2="accent_aigu" key3="£"/>
<key key0="backspace" key2="delete"/>
<key role="action" key0="backspace" key2="delete"/>
</row>
</keyboard>
+2 -2
View File
@@ -24,7 +24,7 @@
<key key0="l" key1="&quot;" key2="'" key3="$" key4="!"/>
</row>
<row>
<key width="1.5" key0="shift" key2="loc capslock"/>
<key width="1.5" role="action" key0="shift" key2="loc capslock"/>
<key key0="z" key4="ž"/>
<key key0="x" key1="loc †" key3="\#"/>
<key key0="c" key3="&amp;" key4="č"/>
@@ -32,6 +32,6 @@
<key key0="b" key1="&lt;" key2="&gt;" key3="{" key4="}"/>
<key key0="n" key1="\?" key2="." key3="," key4="ň"/>
<key key0="m" key1=":" key2="*" key3="-" key4="_"/>
<key width="1.5" key0="backspace" key2="delete"/>
<key width="1.5" role="action" key0="backspace" key2="delete"/>
</row>
</keyboard>
+2 -2
View File
@@ -27,7 +27,7 @@
<key key0="ø" key1="'" key3="&quot;"/>
</row>
<row>
<key shift="0.5" width="1.5" key0="shift" key2="loc capslock"/>
<key shift="0.5" width="1.5" role="action" key0="shift" key2="loc capslock"/>
<key key0="z"/>
<key key0="x" key2="loc †"/>
<key key0="c"/>
@@ -35,7 +35,7 @@
<key key0="b" key2=";" key4=","/>
<key key0="n" key2=":" key4="."/>
<key key0="m" key2="-" key4="_"/>
<key width="1.5" key0="backspace" key2="delete"/>
<key width="1.5" role="action" key0="backspace" key2="delete"/>
</row>
</keyboard>

Some files were not shown because too many files have changed in this diff Show More