tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

USKeyboardLayout.ts (18746B)


      1 /**
      2 * @license
      3 * Copyright 2017 Google Inc.
      4 * SPDX-License-Identifier: Apache-2.0
      5 */
      6 
      7 /**
      8 * @internal
      9 */
     10 export interface KeyDefinition {
     11  keyCode?: number;
     12  shiftKeyCode?: number;
     13  key?: string;
     14  shiftKey?: string;
     15  code?: string;
     16  text?: string;
     17  shiftText?: string;
     18  location?: number;
     19 }
     20 
     21 /**
     22 * All the valid keys that can be passed to functions that take user input, such
     23 * as {@link Keyboard.press | keyboard.press }
     24 *
     25 * @public
     26 */
     27 export type KeyInput =
     28  | '0'
     29  | '1'
     30  | '2'
     31  | '3'
     32  | '4'
     33  | '5'
     34  | '6'
     35  | '7'
     36  | '8'
     37  | '9'
     38  | 'Power'
     39  | 'Eject'
     40  | 'Abort'
     41  | 'Help'
     42  | 'Backspace'
     43  | 'Tab'
     44  | 'Numpad5'
     45  | 'NumpadEnter'
     46  | 'Enter'
     47  | '\r'
     48  | '\n'
     49  | 'ShiftLeft'
     50  | 'ShiftRight'
     51  | 'ControlLeft'
     52  | 'ControlRight'
     53  | 'AltLeft'
     54  | 'AltRight'
     55  | 'Pause'
     56  | 'CapsLock'
     57  | 'Escape'
     58  | 'Convert'
     59  | 'NonConvert'
     60  | 'Space'
     61  | 'Numpad9'
     62  | 'PageUp'
     63  | 'Numpad3'
     64  | 'PageDown'
     65  | 'End'
     66  | 'Numpad1'
     67  | 'Home'
     68  | 'Numpad7'
     69  | 'ArrowLeft'
     70  | 'Numpad4'
     71  | 'Numpad8'
     72  | 'ArrowUp'
     73  | 'ArrowRight'
     74  | 'Numpad6'
     75  | 'Numpad2'
     76  | 'ArrowDown'
     77  | 'Select'
     78  | 'Open'
     79  | 'PrintScreen'
     80  | 'Insert'
     81  | 'Numpad0'
     82  | 'Delete'
     83  | 'NumpadDecimal'
     84  | 'Digit0'
     85  | 'Digit1'
     86  | 'Digit2'
     87  | 'Digit3'
     88  | 'Digit4'
     89  | 'Digit5'
     90  | 'Digit6'
     91  | 'Digit7'
     92  | 'Digit8'
     93  | 'Digit9'
     94  | 'KeyA'
     95  | 'KeyB'
     96  | 'KeyC'
     97  | 'KeyD'
     98  | 'KeyE'
     99  | 'KeyF'
    100  | 'KeyG'
    101  | 'KeyH'
    102  | 'KeyI'
    103  | 'KeyJ'
    104  | 'KeyK'
    105  | 'KeyL'
    106  | 'KeyM'
    107  | 'KeyN'
    108  | 'KeyO'
    109  | 'KeyP'
    110  | 'KeyQ'
    111  | 'KeyR'
    112  | 'KeyS'
    113  | 'KeyT'
    114  | 'KeyU'
    115  | 'KeyV'
    116  | 'KeyW'
    117  | 'KeyX'
    118  | 'KeyY'
    119  | 'KeyZ'
    120  | 'MetaLeft'
    121  | 'MetaRight'
    122  | 'ContextMenu'
    123  | 'NumpadMultiply'
    124  | 'NumpadAdd'
    125  | 'NumpadSubtract'
    126  | 'NumpadDivide'
    127  | 'F1'
    128  | 'F2'
    129  | 'F3'
    130  | 'F4'
    131  | 'F5'
    132  | 'F6'
    133  | 'F7'
    134  | 'F8'
    135  | 'F9'
    136  | 'F10'
    137  | 'F11'
    138  | 'F12'
    139  | 'F13'
    140  | 'F14'
    141  | 'F15'
    142  | 'F16'
    143  | 'F17'
    144  | 'F18'
    145  | 'F19'
    146  | 'F20'
    147  | 'F21'
    148  | 'F22'
    149  | 'F23'
    150  | 'F24'
    151  | 'NumLock'
    152  | 'ScrollLock'
    153  | 'AudioVolumeMute'
    154  | 'AudioVolumeDown'
    155  | 'AudioVolumeUp'
    156  | 'MediaTrackNext'
    157  | 'MediaTrackPrevious'
    158  | 'MediaStop'
    159  | 'MediaPlayPause'
    160  | 'Semicolon'
    161  | 'Equal'
    162  | 'NumpadEqual'
    163  | 'Comma'
    164  | 'Minus'
    165  | 'Period'
    166  | 'Slash'
    167  | 'Backquote'
    168  | 'BracketLeft'
    169  | 'Backslash'
    170  | 'BracketRight'
    171  | 'Quote'
    172  | 'AltGraph'
    173  | 'Props'
    174  | 'Cancel'
    175  | 'Clear'
    176  | 'Shift'
    177  | 'Control'
    178  | 'Alt'
    179  | 'Accept'
    180  | 'ModeChange'
    181  | ' '
    182  | 'Print'
    183  | 'Execute'
    184  | '\u0000'
    185  | 'a'
    186  | 'b'
    187  | 'c'
    188  | 'd'
    189  | 'e'
    190  | 'f'
    191  | 'g'
    192  | 'h'
    193  | 'i'
    194  | 'j'
    195  | 'k'
    196  | 'l'
    197  | 'm'
    198  | 'n'
    199  | 'o'
    200  | 'p'
    201  | 'q'
    202  | 'r'
    203  | 's'
    204  | 't'
    205  | 'u'
    206  | 'v'
    207  | 'w'
    208  | 'x'
    209  | 'y'
    210  | 'z'
    211  | 'Meta'
    212  | '*'
    213  | '+'
    214  | '-'
    215  | '/'
    216  | ';'
    217  | '='
    218  | ','
    219  | '.'
    220  | '`'
    221  | '['
    222  | '\\'
    223  | ']'
    224  | "'"
    225  | 'Attn'
    226  | 'CrSel'
    227  | 'ExSel'
    228  | 'EraseEof'
    229  | 'Play'
    230  | 'ZoomOut'
    231  | ')'
    232  | '!'
    233  | '@'
    234  | '#'
    235  | '$'
    236  | '%'
    237  | '^'
    238  | '&'
    239  | '('
    240  | 'A'
    241  | 'B'
    242  | 'C'
    243  | 'D'
    244  | 'E'
    245  | 'F'
    246  | 'G'
    247  | 'H'
    248  | 'I'
    249  | 'J'
    250  | 'K'
    251  | 'L'
    252  | 'M'
    253  | 'N'
    254  | 'O'
    255  | 'P'
    256  | 'Q'
    257  | 'R'
    258  | 'S'
    259  | 'T'
    260  | 'U'
    261  | 'V'
    262  | 'W'
    263  | 'X'
    264  | 'Y'
    265  | 'Z'
    266  | ':'
    267  | '<'
    268  | '_'
    269  | '>'
    270  | '?'
    271  | '~'
    272  | '{'
    273  | '|'
    274  | '}'
    275  | '"'
    276  | 'SoftLeft'
    277  | 'SoftRight'
    278  | 'Camera'
    279  | 'Call'
    280  | 'EndCall'
    281  | 'VolumeDown'
    282  | 'VolumeUp';
    283 
    284 /**
    285 * @internal
    286 */
    287 export const _keyDefinitions: Readonly<Record<KeyInput, KeyDefinition>> = {
    288  '0': {keyCode: 48, key: '0', code: 'Digit0'},
    289  '1': {keyCode: 49, key: '1', code: 'Digit1'},
    290  '2': {keyCode: 50, key: '2', code: 'Digit2'},
    291  '3': {keyCode: 51, key: '3', code: 'Digit3'},
    292  '4': {keyCode: 52, key: '4', code: 'Digit4'},
    293  '5': {keyCode: 53, key: '5', code: 'Digit5'},
    294  '6': {keyCode: 54, key: '6', code: 'Digit6'},
    295  '7': {keyCode: 55, key: '7', code: 'Digit7'},
    296  '8': {keyCode: 56, key: '8', code: 'Digit8'},
    297  '9': {keyCode: 57, key: '9', code: 'Digit9'},
    298  Power: {key: 'Power', code: 'Power'},
    299  Eject: {key: 'Eject', code: 'Eject'},
    300  Abort: {keyCode: 3, code: 'Abort', key: 'Cancel'},
    301  Help: {keyCode: 6, code: 'Help', key: 'Help'},
    302  Backspace: {keyCode: 8, code: 'Backspace', key: 'Backspace'},
    303  Tab: {keyCode: 9, code: 'Tab', key: 'Tab'},
    304  Numpad5: {
    305    keyCode: 12,
    306    shiftKeyCode: 101,
    307    key: 'Clear',
    308    code: 'Numpad5',
    309    shiftKey: '5',
    310    location: 3,
    311  },
    312  NumpadEnter: {
    313    keyCode: 13,
    314    code: 'NumpadEnter',
    315    key: 'Enter',
    316    text: '\r',
    317    location: 3,
    318  },
    319  Enter: {keyCode: 13, code: 'Enter', key: 'Enter', text: '\r'},
    320  '\r': {keyCode: 13, code: 'Enter', key: 'Enter', text: '\r'},
    321  '\n': {keyCode: 13, code: 'Enter', key: 'Enter', text: '\r'},
    322  ShiftLeft: {keyCode: 16, code: 'ShiftLeft', key: 'Shift', location: 1},
    323  ShiftRight: {keyCode: 16, code: 'ShiftRight', key: 'Shift', location: 2},
    324  ControlLeft: {
    325    keyCode: 17,
    326    code: 'ControlLeft',
    327    key: 'Control',
    328    location: 1,
    329  },
    330  ControlRight: {
    331    keyCode: 17,
    332    code: 'ControlRight',
    333    key: 'Control',
    334    location: 2,
    335  },
    336  AltLeft: {keyCode: 18, code: 'AltLeft', key: 'Alt', location: 1},
    337  AltRight: {keyCode: 18, code: 'AltRight', key: 'Alt', location: 2},
    338  Pause: {keyCode: 19, code: 'Pause', key: 'Pause'},
    339  CapsLock: {keyCode: 20, code: 'CapsLock', key: 'CapsLock'},
    340  Escape: {keyCode: 27, code: 'Escape', key: 'Escape'},
    341  Convert: {keyCode: 28, code: 'Convert', key: 'Convert'},
    342  NonConvert: {keyCode: 29, code: 'NonConvert', key: 'NonConvert'},
    343  Space: {keyCode: 32, code: 'Space', key: ' '},
    344  Numpad9: {
    345    keyCode: 33,
    346    shiftKeyCode: 105,
    347    key: 'PageUp',
    348    code: 'Numpad9',
    349    shiftKey: '9',
    350    location: 3,
    351  },
    352  PageUp: {keyCode: 33, code: 'PageUp', key: 'PageUp'},
    353  Numpad3: {
    354    keyCode: 34,
    355    shiftKeyCode: 99,
    356    key: 'PageDown',
    357    code: 'Numpad3',
    358    shiftKey: '3',
    359    location: 3,
    360  },
    361  PageDown: {keyCode: 34, code: 'PageDown', key: 'PageDown'},
    362  End: {keyCode: 35, code: 'End', key: 'End'},
    363  Numpad1: {
    364    keyCode: 35,
    365    shiftKeyCode: 97,
    366    key: 'End',
    367    code: 'Numpad1',
    368    shiftKey: '1',
    369    location: 3,
    370  },
    371  Home: {keyCode: 36, code: 'Home', key: 'Home'},
    372  Numpad7: {
    373    keyCode: 36,
    374    shiftKeyCode: 103,
    375    key: 'Home',
    376    code: 'Numpad7',
    377    shiftKey: '7',
    378    location: 3,
    379  },
    380  ArrowLeft: {keyCode: 37, code: 'ArrowLeft', key: 'ArrowLeft'},
    381  Numpad4: {
    382    keyCode: 37,
    383    shiftKeyCode: 100,
    384    key: 'ArrowLeft',
    385    code: 'Numpad4',
    386    shiftKey: '4',
    387    location: 3,
    388  },
    389  Numpad8: {
    390    keyCode: 38,
    391    shiftKeyCode: 104,
    392    key: 'ArrowUp',
    393    code: 'Numpad8',
    394    shiftKey: '8',
    395    location: 3,
    396  },
    397  ArrowUp: {keyCode: 38, code: 'ArrowUp', key: 'ArrowUp'},
    398  ArrowRight: {keyCode: 39, code: 'ArrowRight', key: 'ArrowRight'},
    399  Numpad6: {
    400    keyCode: 39,
    401    shiftKeyCode: 102,
    402    key: 'ArrowRight',
    403    code: 'Numpad6',
    404    shiftKey: '6',
    405    location: 3,
    406  },
    407  Numpad2: {
    408    keyCode: 40,
    409    shiftKeyCode: 98,
    410    key: 'ArrowDown',
    411    code: 'Numpad2',
    412    shiftKey: '2',
    413    location: 3,
    414  },
    415  ArrowDown: {keyCode: 40, code: 'ArrowDown', key: 'ArrowDown'},
    416  Select: {keyCode: 41, code: 'Select', key: 'Select'},
    417  Open: {keyCode: 43, code: 'Open', key: 'Execute'},
    418  PrintScreen: {keyCode: 44, code: 'PrintScreen', key: 'PrintScreen'},
    419  Insert: {keyCode: 45, code: 'Insert', key: 'Insert'},
    420  Numpad0: {
    421    keyCode: 45,
    422    shiftKeyCode: 96,
    423    key: 'Insert',
    424    code: 'Numpad0',
    425    shiftKey: '0',
    426    location: 3,
    427  },
    428  Delete: {keyCode: 46, code: 'Delete', key: 'Delete'},
    429  NumpadDecimal: {
    430    keyCode: 46,
    431    shiftKeyCode: 110,
    432    code: 'NumpadDecimal',
    433    key: '\u0000',
    434    shiftKey: '.',
    435    location: 3,
    436  },
    437  Digit0: {keyCode: 48, code: 'Digit0', shiftKey: ')', key: '0'},
    438  Digit1: {keyCode: 49, code: 'Digit1', shiftKey: '!', key: '1'},
    439  Digit2: {keyCode: 50, code: 'Digit2', shiftKey: '@', key: '2'},
    440  Digit3: {keyCode: 51, code: 'Digit3', shiftKey: '#', key: '3'},
    441  Digit4: {keyCode: 52, code: 'Digit4', shiftKey: '$', key: '4'},
    442  Digit5: {keyCode: 53, code: 'Digit5', shiftKey: '%', key: '5'},
    443  Digit6: {keyCode: 54, code: 'Digit6', shiftKey: '^', key: '6'},
    444  Digit7: {keyCode: 55, code: 'Digit7', shiftKey: '&', key: '7'},
    445  Digit8: {keyCode: 56, code: 'Digit8', shiftKey: '*', key: '8'},
    446  Digit9: {keyCode: 57, code: 'Digit9', shiftKey: '(', key: '9'},
    447  KeyA: {keyCode: 65, code: 'KeyA', shiftKey: 'A', key: 'a'},
    448  KeyB: {keyCode: 66, code: 'KeyB', shiftKey: 'B', key: 'b'},
    449  KeyC: {keyCode: 67, code: 'KeyC', shiftKey: 'C', key: 'c'},
    450  KeyD: {keyCode: 68, code: 'KeyD', shiftKey: 'D', key: 'd'},
    451  KeyE: {keyCode: 69, code: 'KeyE', shiftKey: 'E', key: 'e'},
    452  KeyF: {keyCode: 70, code: 'KeyF', shiftKey: 'F', key: 'f'},
    453  KeyG: {keyCode: 71, code: 'KeyG', shiftKey: 'G', key: 'g'},
    454  KeyH: {keyCode: 72, code: 'KeyH', shiftKey: 'H', key: 'h'},
    455  KeyI: {keyCode: 73, code: 'KeyI', shiftKey: 'I', key: 'i'},
    456  KeyJ: {keyCode: 74, code: 'KeyJ', shiftKey: 'J', key: 'j'},
    457  KeyK: {keyCode: 75, code: 'KeyK', shiftKey: 'K', key: 'k'},
    458  KeyL: {keyCode: 76, code: 'KeyL', shiftKey: 'L', key: 'l'},
    459  KeyM: {keyCode: 77, code: 'KeyM', shiftKey: 'M', key: 'm'},
    460  KeyN: {keyCode: 78, code: 'KeyN', shiftKey: 'N', key: 'n'},
    461  KeyO: {keyCode: 79, code: 'KeyO', shiftKey: 'O', key: 'o'},
    462  KeyP: {keyCode: 80, code: 'KeyP', shiftKey: 'P', key: 'p'},
    463  KeyQ: {keyCode: 81, code: 'KeyQ', shiftKey: 'Q', key: 'q'},
    464  KeyR: {keyCode: 82, code: 'KeyR', shiftKey: 'R', key: 'r'},
    465  KeyS: {keyCode: 83, code: 'KeyS', shiftKey: 'S', key: 's'},
    466  KeyT: {keyCode: 84, code: 'KeyT', shiftKey: 'T', key: 't'},
    467  KeyU: {keyCode: 85, code: 'KeyU', shiftKey: 'U', key: 'u'},
    468  KeyV: {keyCode: 86, code: 'KeyV', shiftKey: 'V', key: 'v'},
    469  KeyW: {keyCode: 87, code: 'KeyW', shiftKey: 'W', key: 'w'},
    470  KeyX: {keyCode: 88, code: 'KeyX', shiftKey: 'X', key: 'x'},
    471  KeyY: {keyCode: 89, code: 'KeyY', shiftKey: 'Y', key: 'y'},
    472  KeyZ: {keyCode: 90, code: 'KeyZ', shiftKey: 'Z', key: 'z'},
    473  MetaLeft: {keyCode: 91, code: 'MetaLeft', key: 'Meta', location: 1},
    474  MetaRight: {keyCode: 92, code: 'MetaRight', key: 'Meta', location: 2},
    475  ContextMenu: {keyCode: 93, code: 'ContextMenu', key: 'ContextMenu'},
    476  NumpadMultiply: {
    477    keyCode: 106,
    478    code: 'NumpadMultiply',
    479    key: '*',
    480    location: 3,
    481  },
    482  NumpadAdd: {keyCode: 107, code: 'NumpadAdd', key: '+', location: 3},
    483  NumpadSubtract: {
    484    keyCode: 109,
    485    code: 'NumpadSubtract',
    486    key: '-',
    487    location: 3,
    488  },
    489  NumpadDivide: {keyCode: 111, code: 'NumpadDivide', key: '/', location: 3},
    490  F1: {keyCode: 112, code: 'F1', key: 'F1'},
    491  F2: {keyCode: 113, code: 'F2', key: 'F2'},
    492  F3: {keyCode: 114, code: 'F3', key: 'F3'},
    493  F4: {keyCode: 115, code: 'F4', key: 'F4'},
    494  F5: {keyCode: 116, code: 'F5', key: 'F5'},
    495  F6: {keyCode: 117, code: 'F6', key: 'F6'},
    496  F7: {keyCode: 118, code: 'F7', key: 'F7'},
    497  F8: {keyCode: 119, code: 'F8', key: 'F8'},
    498  F9: {keyCode: 120, code: 'F9', key: 'F9'},
    499  F10: {keyCode: 121, code: 'F10', key: 'F10'},
    500  F11: {keyCode: 122, code: 'F11', key: 'F11'},
    501  F12: {keyCode: 123, code: 'F12', key: 'F12'},
    502  F13: {keyCode: 124, code: 'F13', key: 'F13'},
    503  F14: {keyCode: 125, code: 'F14', key: 'F14'},
    504  F15: {keyCode: 126, code: 'F15', key: 'F15'},
    505  F16: {keyCode: 127, code: 'F16', key: 'F16'},
    506  F17: {keyCode: 128, code: 'F17', key: 'F17'},
    507  F18: {keyCode: 129, code: 'F18', key: 'F18'},
    508  F19: {keyCode: 130, code: 'F19', key: 'F19'},
    509  F20: {keyCode: 131, code: 'F20', key: 'F20'},
    510  F21: {keyCode: 132, code: 'F21', key: 'F21'},
    511  F22: {keyCode: 133, code: 'F22', key: 'F22'},
    512  F23: {keyCode: 134, code: 'F23', key: 'F23'},
    513  F24: {keyCode: 135, code: 'F24', key: 'F24'},
    514  NumLock: {keyCode: 144, code: 'NumLock', key: 'NumLock'},
    515  ScrollLock: {keyCode: 145, code: 'ScrollLock', key: 'ScrollLock'},
    516  AudioVolumeMute: {
    517    keyCode: 173,
    518    code: 'AudioVolumeMute',
    519    key: 'AudioVolumeMute',
    520  },
    521  AudioVolumeDown: {
    522    keyCode: 174,
    523    code: 'AudioVolumeDown',
    524    key: 'AudioVolumeDown',
    525  },
    526  AudioVolumeUp: {keyCode: 175, code: 'AudioVolumeUp', key: 'AudioVolumeUp'},
    527  MediaTrackNext: {
    528    keyCode: 176,
    529    code: 'MediaTrackNext',
    530    key: 'MediaTrackNext',
    531  },
    532  MediaTrackPrevious: {
    533    keyCode: 177,
    534    code: 'MediaTrackPrevious',
    535    key: 'MediaTrackPrevious',
    536  },
    537  MediaStop: {keyCode: 178, code: 'MediaStop', key: 'MediaStop'},
    538  MediaPlayPause: {
    539    keyCode: 179,
    540    code: 'MediaPlayPause',
    541    key: 'MediaPlayPause',
    542  },
    543  Semicolon: {keyCode: 186, code: 'Semicolon', shiftKey: ':', key: ';'},
    544  Equal: {keyCode: 187, code: 'Equal', shiftKey: '+', key: '='},
    545  NumpadEqual: {keyCode: 187, code: 'NumpadEqual', key: '=', location: 3},
    546  Comma: {keyCode: 188, code: 'Comma', shiftKey: '<', key: ','},
    547  Minus: {keyCode: 189, code: 'Minus', shiftKey: '_', key: '-'},
    548  Period: {keyCode: 190, code: 'Period', shiftKey: '>', key: '.'},
    549  Slash: {keyCode: 191, code: 'Slash', shiftKey: '?', key: '/'},
    550  Backquote: {keyCode: 192, code: 'Backquote', shiftKey: '~', key: '`'},
    551  BracketLeft: {keyCode: 219, code: 'BracketLeft', shiftKey: '{', key: '['},
    552  Backslash: {keyCode: 220, code: 'Backslash', shiftKey: '|', key: '\\'},
    553  BracketRight: {keyCode: 221, code: 'BracketRight', shiftKey: '}', key: ']'},
    554  Quote: {keyCode: 222, code: 'Quote', shiftKey: '"', key: "'"},
    555  AltGraph: {keyCode: 225, code: 'AltGraph', key: 'AltGraph'},
    556  Props: {keyCode: 247, code: 'Props', key: 'CrSel'},
    557  Cancel: {keyCode: 3, key: 'Cancel', code: 'Abort'},
    558  Clear: {keyCode: 12, key: 'Clear', code: 'Numpad5', location: 3},
    559  Shift: {keyCode: 16, key: 'Shift', code: 'ShiftLeft', location: 1},
    560  Control: {keyCode: 17, key: 'Control', code: 'ControlLeft', location: 1},
    561  Alt: {keyCode: 18, key: 'Alt', code: 'AltLeft', location: 1},
    562  Accept: {keyCode: 30, key: 'Accept'},
    563  ModeChange: {keyCode: 31, key: 'ModeChange'},
    564  ' ': {keyCode: 32, key: ' ', code: 'Space'},
    565  Print: {keyCode: 42, key: 'Print'},
    566  Execute: {keyCode: 43, key: 'Execute', code: 'Open'},
    567  '\u0000': {keyCode: 46, key: '\u0000', code: 'NumpadDecimal', location: 3},
    568  a: {keyCode: 65, key: 'a', code: 'KeyA'},
    569  b: {keyCode: 66, key: 'b', code: 'KeyB'},
    570  c: {keyCode: 67, key: 'c', code: 'KeyC'},
    571  d: {keyCode: 68, key: 'd', code: 'KeyD'},
    572  e: {keyCode: 69, key: 'e', code: 'KeyE'},
    573  f: {keyCode: 70, key: 'f', code: 'KeyF'},
    574  g: {keyCode: 71, key: 'g', code: 'KeyG'},
    575  h: {keyCode: 72, key: 'h', code: 'KeyH'},
    576  i: {keyCode: 73, key: 'i', code: 'KeyI'},
    577  j: {keyCode: 74, key: 'j', code: 'KeyJ'},
    578  k: {keyCode: 75, key: 'k', code: 'KeyK'},
    579  l: {keyCode: 76, key: 'l', code: 'KeyL'},
    580  m: {keyCode: 77, key: 'm', code: 'KeyM'},
    581  n: {keyCode: 78, key: 'n', code: 'KeyN'},
    582  o: {keyCode: 79, key: 'o', code: 'KeyO'},
    583  p: {keyCode: 80, key: 'p', code: 'KeyP'},
    584  q: {keyCode: 81, key: 'q', code: 'KeyQ'},
    585  r: {keyCode: 82, key: 'r', code: 'KeyR'},
    586  s: {keyCode: 83, key: 's', code: 'KeyS'},
    587  t: {keyCode: 84, key: 't', code: 'KeyT'},
    588  u: {keyCode: 85, key: 'u', code: 'KeyU'},
    589  v: {keyCode: 86, key: 'v', code: 'KeyV'},
    590  w: {keyCode: 87, key: 'w', code: 'KeyW'},
    591  x: {keyCode: 88, key: 'x', code: 'KeyX'},
    592  y: {keyCode: 89, key: 'y', code: 'KeyY'},
    593  z: {keyCode: 90, key: 'z', code: 'KeyZ'},
    594  Meta: {keyCode: 91, key: 'Meta', code: 'MetaLeft', location: 1},
    595  '*': {keyCode: 106, key: '*', code: 'NumpadMultiply', location: 3},
    596  '+': {keyCode: 107, key: '+', code: 'NumpadAdd', location: 3},
    597  '-': {keyCode: 109, key: '-', code: 'NumpadSubtract', location: 3},
    598  '/': {keyCode: 111, key: '/', code: 'NumpadDivide', location: 3},
    599  ';': {keyCode: 186, key: ';', code: 'Semicolon'},
    600  '=': {keyCode: 187, key: '=', code: 'Equal'},
    601  ',': {keyCode: 188, key: ',', code: 'Comma'},
    602  '.': {keyCode: 190, key: '.', code: 'Period'},
    603  '`': {keyCode: 192, key: '`', code: 'Backquote'},
    604  '[': {keyCode: 219, key: '[', code: 'BracketLeft'},
    605  '\\': {keyCode: 220, key: '\\', code: 'Backslash'},
    606  ']': {keyCode: 221, key: ']', code: 'BracketRight'},
    607  "'": {keyCode: 222, key: "'", code: 'Quote'},
    608  Attn: {keyCode: 246, key: 'Attn'},
    609  CrSel: {keyCode: 247, key: 'CrSel', code: 'Props'},
    610  ExSel: {keyCode: 248, key: 'ExSel'},
    611  EraseEof: {keyCode: 249, key: 'EraseEof'},
    612  Play: {keyCode: 250, key: 'Play'},
    613  ZoomOut: {keyCode: 251, key: 'ZoomOut'},
    614  ')': {keyCode: 48, key: ')', code: 'Digit0'},
    615  '!': {keyCode: 49, key: '!', code: 'Digit1'},
    616  '@': {keyCode: 50, key: '@', code: 'Digit2'},
    617  '#': {keyCode: 51, key: '#', code: 'Digit3'},
    618  $: {keyCode: 52, key: '$', code: 'Digit4'},
    619  '%': {keyCode: 53, key: '%', code: 'Digit5'},
    620  '^': {keyCode: 54, key: '^', code: 'Digit6'},
    621  '&': {keyCode: 55, key: '&', code: 'Digit7'},
    622  '(': {keyCode: 57, key: '(', code: 'Digit9'},
    623  A: {keyCode: 65, key: 'A', code: 'KeyA'},
    624  B: {keyCode: 66, key: 'B', code: 'KeyB'},
    625  C: {keyCode: 67, key: 'C', code: 'KeyC'},
    626  D: {keyCode: 68, key: 'D', code: 'KeyD'},
    627  E: {keyCode: 69, key: 'E', code: 'KeyE'},
    628  F: {keyCode: 70, key: 'F', code: 'KeyF'},
    629  G: {keyCode: 71, key: 'G', code: 'KeyG'},
    630  H: {keyCode: 72, key: 'H', code: 'KeyH'},
    631  I: {keyCode: 73, key: 'I', code: 'KeyI'},
    632  J: {keyCode: 74, key: 'J', code: 'KeyJ'},
    633  K: {keyCode: 75, key: 'K', code: 'KeyK'},
    634  L: {keyCode: 76, key: 'L', code: 'KeyL'},
    635  M: {keyCode: 77, key: 'M', code: 'KeyM'},
    636  N: {keyCode: 78, key: 'N', code: 'KeyN'},
    637  O: {keyCode: 79, key: 'O', code: 'KeyO'},
    638  P: {keyCode: 80, key: 'P', code: 'KeyP'},
    639  Q: {keyCode: 81, key: 'Q', code: 'KeyQ'},
    640  R: {keyCode: 82, key: 'R', code: 'KeyR'},
    641  S: {keyCode: 83, key: 'S', code: 'KeyS'},
    642  T: {keyCode: 84, key: 'T', code: 'KeyT'},
    643  U: {keyCode: 85, key: 'U', code: 'KeyU'},
    644  V: {keyCode: 86, key: 'V', code: 'KeyV'},
    645  W: {keyCode: 87, key: 'W', code: 'KeyW'},
    646  X: {keyCode: 88, key: 'X', code: 'KeyX'},
    647  Y: {keyCode: 89, key: 'Y', code: 'KeyY'},
    648  Z: {keyCode: 90, key: 'Z', code: 'KeyZ'},
    649  ':': {keyCode: 186, key: ':', code: 'Semicolon'},
    650  '<': {keyCode: 188, key: '<', code: 'Comma'},
    651  _: {keyCode: 189, key: '_', code: 'Minus'},
    652  '>': {keyCode: 190, key: '>', code: 'Period'},
    653  '?': {keyCode: 191, key: '?', code: 'Slash'},
    654  '~': {keyCode: 192, key: '~', code: 'Backquote'},
    655  '{': {keyCode: 219, key: '{', code: 'BracketLeft'},
    656  '|': {keyCode: 220, key: '|', code: 'Backslash'},
    657  '}': {keyCode: 221, key: '}', code: 'BracketRight'},
    658  '"': {keyCode: 222, key: '"', code: 'Quote'},
    659  SoftLeft: {key: 'SoftLeft', code: 'SoftLeft', location: 4},
    660  SoftRight: {key: 'SoftRight', code: 'SoftRight', location: 4},
    661  Camera: {keyCode: 44, key: 'Camera', code: 'Camera', location: 4},
    662  Call: {key: 'Call', code: 'Call', location: 4},
    663  EndCall: {keyCode: 95, key: 'EndCall', code: 'EndCall', location: 4},
    664  VolumeDown: {
    665    keyCode: 182,
    666    key: 'VolumeDown',
    667    code: 'VolumeDown',
    668    location: 4,
    669  },
    670  VolumeUp: {keyCode: 183, key: 'VolumeUp', code: 'VolumeUp', location: 4},
    671 };