[
  {
    "path": ".gitignore",
    "content": "node_modules/\n"
  },
  {
    "path": ".jscsrc",
    "content": "{\n  \"preset\": \"airbnb\",\n\n  \"esnext\": false,\n  \"requireTrailingComma\": null,\n  \"requireCommaBeforeLineBreak\": null,\n  \"requireCamelCaseOrUpperCaseIdentifiers\": null,\n  \"requirePaddingNewLinesBeforeLineComments\": null,\n  \"requirePaddingNewLinesAfterBlocks\": null,\n  \"safeContextKeyword\": \"self\",\n\n  \"maximumLineLength\": 110,\n  \"maxErrors\": 1000,\n  \"requireSpaceAfterLineComment\": true\n}\n"
  },
  {
    "path": ".jshintrc",
    "content": "{\n  \"bitwise\": false,\n  \"curly\": false,\n  \"eqeqeq\": true,\n  \"freeze\": true,\n  \"latedef\": \"nofunc\",\n  \"maxparams\": 7,\n  \"noarg\": true,\n  \"shadow\": \"inner\",\n  \"undef\": true,\n  \"unused\": true,\n\n  \"boss\": true,\n  \"expr\": true,\n  \"eqnull\": true,\n  \"evil\": true,\n  \"loopfunc\": true,\n  \"proto\": true,\n  \"supernew\": true,\n\n  \"-W018\": true,\n  \"-W064\": true,\n  \"-W086\": true,\n  \"+W032\": true,\n\n  \"browser\": false,\n  \"browserify\": false,\n  \"node\": true,\n  \"nonstandard\": true,\n  \"typed\": true,\n  \"worker\": false,\n\n  \"camelcase\": false,\n  \"indent\": 2,\n  \"maxlen\": 110,\n  \"newcap\": true,\n  \"quotmark\": \"single\",\n\n  \"laxbreak\": true,\n  \"laxcomma\": true\n}\n"
  },
  {
    "path": ".npmignore",
    "content": ".git*\ntest/\nimg/\nnode_modules/\n.jshintrc\n.jscsrc\n"
  },
  {
    "path": "CHANGELOG.md",
    "content": "# Blessed v0.1.0 - new terminal goodies for node.js\n\n![blessed](https://raw.githubusercontent.com/chjj/blessed/master/img/v0.1.0-3.gif)\n\nThe features demonstrated in the above gif __element transparency/shadow__ and\n__border docking__.\n\n## New useful options for your typewriter application:\n\n- __`transparent` option__ - Lower element opacity to 50%. This will display\n  dimmed elements and content behind the foreground element using a naive color\n  blending function (good enough for a terminal's limited amount of colors).\n  works best with 256color terminals. (see widget-shadow.js)\n\n- __`shadow` option__ - Give the element a translucent shadow. Automatically\n  darkens the background behind it. (see widget-shadow.js)\n\n- __`dockBorders` option__ - Element borders will automatically \"dock\" to each\n  other. Instead of overlapping the borders end up connecting. (see\n  widget-dock.js)\n\n- __`autoPadding` default__ - Auto padding is now enabled by default, meaning\n  blessed will automatically position elements inside their parent's border.\n\n- __`rleft` property__ - Relative offsets are now default element properties\n  (`left` instead of `rleft`).\n\n- __`draggable` property__ - Make any element draggable with the mouse. (see\n  widget-shadow.js or widget-dock.js)\n\n- __`Table` and `ListTable` elements__ - Tables with a high quality rendering.\n  (see widget-table.js and widget-listtable.js)\n\n- __`Log` element__ - A top to bottom logger box with scrollback and other\n  features. (see widget-log.js)\n\n- __Obscurable borders__ - In addition to docking borders, it's possible to\n  obscure borders by sliding them off the screen with negative offsets. (see\n  widget-dock.js)\n\n- __Percentage expressions__ - Like CSS, arithmetic can now be performed on\n  percentages. e.g. `width: '50%-1'`. This is useful for overlapping borders on\n  elements with a percentage width. (see widget-dock.js)\n\n## Other features that weren't mentioned before:\n\n- __`setHover` option__ - Set a hover text box to follow cursor on mouseover,\n  similar to how a web browser handles the \"title\" attribute. (see widget.js)\n\n- __`Terminal` element__ - Spin up a pseudo terminal as a blessed element.\n  useful for writing a terminal multiplexer. (requires term.js and pty.js as\n  optional dependencies). (see example/multiplex.js)\n\n- __`Image` element__ - Uses `w3mimgdisplay` to draw real images your terminal.\n  this is much easier than calling w3mimgdisplay by hand. Image elements behave\n  like any other element, although it is wise to use `width: 'shrink', height:\n  'shrink'`. (see widget-image.js)\n\n---\n\nThe major things that justified the 0.1.0 release were fixes and stabilization\nof api (`autoPadding`/`rleft`/`left`). Scrolling boxes were almost completely\nrevamped to work a bit smarter.\n\n---\n\n## Things yet to come:\n\n- __@secrettriangle's [improvements](https://github.com/slap-editor/slap) for\n  textareas__ - This allows for real text navigation.\n\n- __Gravity and margin layouts__\n\nThis is something that's been in the idea bin for a while. Every element could\npotentially have properties like:\n\n```\n  gravity: 'bottomleft',\n  margin: 5,\n``\n\nIn other words, just a more complex `float` system than what the CSSOM is used\nto.\n"
  },
  {
    "path": "LICENSE",
    "content": "Copyright (c) 2013-2015, Christopher Jeffrey and contributors\nhttps://github.com/chjj/\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n"
  },
  {
    "path": "README.md",
    "content": "# blessed\n\nA curses-like library with a high level terminal interface API for node.js.\n\n![blessed](https://raw.githubusercontent.com/chjj/blessed/master/img/v0.1.0-3.gif)\n\nBlessed is over 16,000 lines of code and terminal goodness. It's completely\nimplemented in javascript, and its goal consists of two things:\n\n1. Reimplement ncurses entirely by parsing and compiling terminfo and termcap,\nand exposing a `Program` object which can output escape sequences compatible\nwith _any_ terminal.\n\n2. Implement a widget API which is heavily optimized for terminals.\n\nThe blessed renderer makes use of CSR (change-scroll-region), and BCE\n(back-color-erase). It draws the screen using the painter's algorithm and is\nsped up with smart cursor movements and a screen damage buffer. This means\nrendering of your application will be extremely efficient: blessed only draws\nthe changes (damage) to the screen.\n\nBlessed is arguably as accurate as ncurses, but even more optimized in some\nways. The widget library gives you an API which is reminiscent of the DOM.\nAnyone is able to make an awesome terminal application with blessed. There are\nterminal widget libraries for other platforms (primarily [python][urwid] and\n[perl][curses-ui]), but blessed is possibly the most DOM-like (dare I say the\nmost user-friendly?).\n\nBlessed has been used to implement other popular libraries and programs.\nExamples include: the [slap text editor][slap] and [blessed-contrib][contrib].\nThe blessed API itself has gone on to inspire [termui][termui] for Go.\n\n## Install\n\n``` bash\n$ npm install blessed\n```\n\n## Example\n\nThis will render a box with line borders containing the text `'Hello world!'`,\nperfectly centered horizontally and vertically.\n\n__NOTE__: It is recommend you use either `smartCSR` or `fastCSR` as a\n`blessed.screen` option. This will enable CSR when scrolling text in elements\nor when manipulating lines.\n\n``` js\nvar blessed = require('blessed');\n\n// Create a screen object.\nvar screen = blessed.screen({\n  smartCSR: true\n});\n\nscreen.title = 'my window title';\n\n// Create a box perfectly centered horizontally and vertically.\nvar box = blessed.box({\n  top: 'center',\n  left: 'center',\n  width: '50%',\n  height: '50%',\n  content: 'Hello {bold}world{/bold}!',\n  tags: true,\n  border: {\n    type: 'line'\n  },\n  style: {\n    fg: 'white',\n    bg: 'magenta',\n    border: {\n      fg: '#f0f0f0'\n    },\n    hover: {\n      bg: 'green'\n    }\n  }\n});\n\n// Append our box to the screen.\nscreen.append(box);\n\n// Add a png icon to the box\nvar icon = blessed.image({\n  parent: box,\n  top: 0,\n  left: 0,\n  type: 'overlay',\n  width: 'shrink',\n  height: 'shrink',\n  file: __dirname + '/my-program-icon.png',\n  search: false\n});\n\n// If our box is clicked, change the content.\nbox.on('click', function(data) {\n  box.setContent('{center}Some different {red-fg}content{/red-fg}.{/center}');\n  screen.render();\n});\n\n// If box is focused, handle `enter`/`return` and give us some more content.\nbox.key('enter', function(ch, key) {\n  box.setContent('{right}Even different {black-fg}content{/black-fg}.{/right}\\n');\n  box.setLine(1, 'bar');\n  box.insertLine(1, 'foo');\n  screen.render();\n});\n\n// Quit on Escape, q, or Control-C.\nscreen.key(['escape', 'q', 'C-c'], function(ch, key) {\n  return process.exit(0);\n});\n\n// Focus our element.\nbox.focus();\n\n// Render the screen.\nscreen.render();\n```\n\n## Documentation\n\n### Widgets\n\n- [Base Nodes](#base-nodes)\n  - [Node](#node-from-eventemitter) (abstract)\n  - [Screen](#screen-from-node)\n  - [Element](#element-from-node) (abstract)\n- [Boxes](#boxes)\n  - [Box](#box-from-element)\n  - [Text](#text-from-element)\n  - [Line](#line-from-box)\n  - [ScrollableBox](#scrollablebox-from-box) (deprecated)\n  - [ScrollableText](#scrollabletext-from-scrollablebox) (deprecated)\n  - [BigText](#bigtext-from-box)\n- [Lists](#lists)\n  - [List](#list-from-box)\n  - [FileManager](#filemanager-from-list)\n  - [ListTable](#listtable-from-list)\n  - [Listbar](#listbar-from-box)\n- [Forms](#forms)\n  - [Form](#form-from-box)\n  - [Input](#input-from-box) (abstract)\n  - [Textarea](#textarea-from-input)\n  - [Textbox](#textbox-from-textarea)\n  - [Button](#button-from-input)\n  - [Checkbox](#checkbox-from-input)\n  - [RadioSet](#radioset-from-box)\n  - [RadioButton](#radiobutton-from-checkbox)\n- [Prompts](#prompts)\n  - [Prompt](#prompt-from-box)\n  - [Question](#question-from-box)\n  - [Message](#message-from-box)\n  - [Loading](#loading-from-box)\n- [Data Display](#data-display)\n  - [ProgressBar](#progressbar-from-input)\n  - [Log](#log-from-scrollabletext)\n  - [Table](#table-from-box)\n- [Special Elements](#special-elements)\n  - [Terminal](#terminal-from-box)\n  - [Image](#image-from-box)\n  - [ANSIImage](#ansiimage-from-box)\n  - [OverlayImage](#overlayimage-from-box)\n  - [Video](#video-from-box)\n  - [Layout](#layout-from-element)\n\n### Other\n\n- [Helpers](#helpers)\n\n### Mechanics\n\n- [Content & Tags](#content--tags)\n  - [Colors](#colors)\n  - [Attributes](#attributes)\n  - [Alignment](#alignment)\n  - [Escaping](#escaping)\n  - [SGR Sequences](#sgr-sequences)\n- [Style](#style)\n  - [Colors](#colors-1)\n  - [Attributes](#attributes-1)\n  - [Transparency](#transparency)\n  - [Shadow](#shadow)\n  - [Effects](#effects)\n- [Events](#events)\n  - [Event Bubbling](#event-bubbling)\n- [Poisitioning](#positioning)\n- [Rendering](#rendering)\n- [Artificial Cursors](#artificial-cursors)\n- [Multiple Screens](#multiple-screens)\n- [Server Side Usage](#server-side-usage)\n\n### Notes\n\n- [Windows Compatibility](#windows-compatibility)\n- [Low-level Usage](#low-level-usage)\n- [Testing](#testing)\n- [Examples](#examples)\n- [FAQ](#faq)\n\n\n## Widgets\n\nBlessed comes with a number of high-level widgets so you can avoid all the\nnasty low-level terminal stuff.\n\n\n### Base Nodes\n\n\n#### Node (from EventEmitter)\n\nThe base node which everything inherits from.\n\n##### Options:\n\n- __screen__ - The screen to be associated with.\n- __parent__ - The desired parent.\n- __children__ - An arrray of children.\n\n##### Properties:\n\n- Inherits all from EventEmitter.\n- __type__ - Type of the node (e.g. `box`).\n- __options__ - Original options object.\n- __parent__ - Parent node.\n- __screen__ - Parent screen.\n- __children__ - Array of node's children.\n- __data, _, $__ - An object for any miscellanous user data.\n- __index__ - Render index (document order index) of the last render call.\n\n##### Events:\n\n- Inherits all from EventEmitter.\n- __adopt__ - Received when node is added to a parent.\n- __remove__ - Received when node is removed from it's current parent.\n- __reparent__ - Received when node gains a new parent.\n- __attach__ - Received when node is attached to the screen directly or\n  somewhere in its ancestry.\n- __detach__ - Received when node is detached from the screen directly or\n  somewhere in its ancestry.\n\n##### Methods:\n\n- Inherits all from EventEmitter.\n- __prepend(node)__ - Prepend a node to this node's children.\n- __append(node)__ - Append a node to this node's children.\n- __remove(node)__ - Remove child node from node.\n- __insert(node, i)__ - Insert a node to this node's children at index `i`.\n- __insertBefore(node, refNode)__ - Insert a node to this node's children\n  before the reference node.\n- __insertAfter(node, refNode)__ - Insert a node from node after the reference\n  node.\n- __detach()__ - Remove node from its parent.\n- __emitDescendants(type, args..., [iterator])__ - Emit event for element, and\n  recursively emit same event for all descendants.\n- __get(name, [default])__ - Get user property with a potential default value.\n- __set(name, value)__ - Set user property to value.\n\n\n#### Screen (from Node)\n\nThe screen on which every other node renders.\n\n##### Options:\n\n- __program__ - The blessed `Program` to be associated with. Will be\n  automatically instantiated if none is provided.\n- __smartCSR__ - Attempt to perform CSR optimization on all possible elements\n  (not just full-width ones, elements with uniform cells to their sides).\n  This is known to cause flickering with elements that are not full-width,\n  however, it is more optimal for terminal rendering.\n- __fastCSR__ - Do CSR on any element within 20 cols of the screen edge on\n  either side. Faster than `smartCSR`, but may cause flickering depending on\n  what is on each side of the element.\n- __useBCE__ - Attempt to perform `back_color_erase` optimizations for terminals\n  that support it. It will also work with terminals that don't support it, but\n  only on lines with the default background color. As it stands with the current\n  implementation, it's uncertain how much terminal performance this adds at the\n  cost of overhead within node.\n- __resizeTimeout__ - Amount of time (in ms) to redraw the screen after the\n  terminal is resized (Default: 300).\n- __tabSize__ - The width of tabs within an element's content.\n- __autoPadding__ - Automatically position child elements with border and\n  padding in mind (__NOTE__: this is a recommended option. It may become\n  default in the future).\n- __cursor.artificial__ - Have blessed draw a custom cursor and hide the\n  terminal cursor (__experimental__).\n- __cursor.shape__ - Shape of the cursor. Can be: block, underline, or line.\n- __cursor.blink__ - Whether the cursor blinks.\n- __cursor.color__ - Color of the color. Accepts any valid color value (`null`\n  is default).\n- __log__ - Create a log file. See `log` method.\n- __dump__ - Dump all output and input to desired file. Can be used together\n  with `log` option if set as a boolean.\n- __debug__ - Debug mode. Enables usage of the `debug` method. Also creates a\n  debug console which will display when pressing F12. It will display all log\n  and debug messages.\n- __ignoreLocked__ - Array of keys in their full format (e.g. `C-c`) to ignore\n  when keys are locked or grabbed. Useful for creating a key that will _always_\n  exit no matter whether the keys are locked.\n- __dockBorders__ - Automatically \"dock\" borders with other elements instead of\n  overlapping, depending on position (__experimental__). For example:\n  These border-overlapped elements:\n```\n┌─────────┌─────────┐\n│ box1    │ box2    │\n└─────────└─────────┘\n```\n  Become:\n```\n┌─────────┬─────────┐\n│ box1    │ box2    │\n└─────────┴─────────┘\n```\n- __ignoreDockContrast__ - Normally, dockable borders will not dock if the\n  colors or attributes are different. This option will allow them to dock\n  regardless. It may produce some odd looking multi-colored borders though.\n- __fullUnicode__ - Allow for rendering of East Asian double-width characters,\n  utf-16 surrogate pairs, and unicode combining characters. This allows you to\n  display text above the basic multilingual plane. This is behind an option\n  because it may affect performance slightly negatively. Without this option\n  enabled, all double-width, surrogate pair, and combining characters will be\n  replaced by `'??'`, `'?'`, `''` respectively. (NOTE: iTerm2 cannot display\n  combining characters properly. Blessed simply removes them from an element's\n  content if iTerm2 is detected).\n- __sendFocus__ - Send focus events after mouse is enabled.\n- __warnings__ - Display warnings (such as the output not being a TTY, similar\n  to ncurses).\n- __forceUnicode__ - Force blessed to use unicode even if it is not detected\n  via terminfo, env variables, or windows code page. If value is `true` unicode\n  is forced. If value is `false` non-unicode is forced (default: `null`).\n- __input/output__ - Input and output streams. `process.stdin`/`process.stdout`\n  by default, however, it could be a `net.Socket` if you want to make a program\n  that runs over telnet or something of that nature.\n- __terminal__ - `TERM` name used for terminfo parsing. The `$TERM` env variable is\n  used by default.\n- __title__ - Set the terminal window title if possible.\n\n##### Properties:\n\n- Inherits all from Node.\n- __program__ - The blessed Program object.\n- __tput__ - The blessed Tput object (only available if you passed `tput: true`\n  to the Program constructor.)\n- __focused__ - Top of the focus history stack.\n- __width__ - Width of the screen (same as `program.cols`).\n- __height__ - Height of the screen (same as `program.rows`).\n- __cols__ - Same as `screen.width`.\n- __rows__ - Same as `screen.height`.\n- __left__ - Relative left offset, always zero.\n- __right__ - Relative right offset, always zero.\n- __top__ - Relative top offset, always zero.\n- __bottom__ - Relative bottom offset, always zero.\n- __aleft__ - Absolute left offset, always zero.\n- __aright__ - Absolute right offset, always zero.\n- __atop__ - Absolute top offset, always zero.\n- __abottom__ - Absolute bottom offset, always zero.\n- __grabKeys__ - Whether the focused element grabs all keypresses.\n- __lockKeys__ - Prevent keypresses from being received by any element.\n- __hover__ - The currently hovered element. Only set if mouse events are bound.\n- __terminal__ - Set or get terminal name. `Set` calls `screen.setTerminal()`\n  internally.\n- __title__ - Set or get window title.\n\n##### Events:\n\n- Inherits all from Node.\n- __resize__ - Received on screen resize.\n- __mouse__ - Received on mouse events.\n- __keypress__ - Received on key events.\n- __element [name]__ - Global events received for all elements.\n- __key [name]__ - Received on key event for [name].\n- __focus, blur__ - Received when the terminal window focuses/blurs. Requires a\n  terminal supporting the focus protocol and focus needs to be passed to\n  program.enableMouse().\n- __prerender__ - Received before render.\n- __render__ - Received on render.\n- __warning__ - Received when blessed notices something untoward (output is not\n  a tty, terminfo not found, etc).\n- __destroy__ - Received when the screen is destroyed (only useful when using\n  multiple screens).\n\n##### Methods:\n\n- Inherits all from Node.\n- __log(msg, ...)__ - Write string to the log file if one was created.\n- __debug(msg, ...)__ - Same as the log method, but only gets called if the\n  `debug` option was set.\n- __alloc()__ - Allocate a new pending screen buffer and a new output screen\n  buffer.\n- __realloc()__ - Reallocate the screen buffers and clear the screen.\n- __draw(start, end)__ - Draw the screen based on the contents of the screen\n  buffer.\n- __render()__ - Render all child elements, writing all data to the screen\n  buffer and drawing the screen.\n- __clearRegion(x1, x2, y1, y2)__ - Clear any region on the screen.\n- __fillRegion(attr, ch, x1, x2, y1, y2)__ - Fill any region with a character\n  of a certain attribute.\n- __focusOffset(offset)__ - Focus element by offset of focusable elements.\n- __focusPrevious()__ - Focus previous element in the index.\n- __focusNext()__ - Focus next element in the index.\n- __focusPush(element)__ - Push element on the focus stack (equivalent to\n  `screen.focused = el`).\n- __focusPop()__ - Pop element off the focus stack.\n- __saveFocus()__ - Save the focused element.\n- __restoreFocus()__ - Restore the saved focused element.\n- __rewindFocus()__ - \"Rewind\" focus to the last visible and attached element.\n- __key(name, listener)__ - Bind a keypress listener for a specific key.\n- __onceKey(name, listener)__ - Bind a keypress listener for a specific key\n  once.\n- __unkey(name, listener)__ - Remove a keypress listener for a specific key.\n- __spawn(file, args, options)__ - Spawn a process in the foreground, return to\n  blessed app after exit.\n- __exec(file, args, options, callback)__ - Spawn a process in the foreground,\n  return to blessed app after exit. Executes callback on error or exit.\n- __readEditor([options], callback)__ - Read data from text editor.\n- __setEffects(el, fel, over, out, effects, temp)__ - Set effects based on\n  two events and attributes.\n- __insertLine(n, y, top, bottom)__ - Insert a line into the screen (using csr:\n  this bypasses the output buffer).\n- __deleteLine(n, y, top, bottom)__ - Delete a line from the screen (using csr:\n  this bypasses the output buffer).\n- __insertBottom(top, bottom)__ - Insert a line at the bottom of the screen.\n- __insertTop(top, bottom)__ - Insert a line at the top of the screen.\n- __deleteBottom(top, bottom)__ - Delete a line at the bottom of the screen.\n- __deleteTop(top, bottom)__ - Delete a line at the top of the screen.\n- __enableMouse([el])__ - Enable mouse events for the screen and optionally an\n  element (automatically called when a form of on('mouse') is bound).\n- __enableKeys([el])__ - Enable keypress events for the screen and optionally\n  an element (automatically called when a form of on('keypress') is bound).\n- __enableInput([el])__ - Enable key and mouse events. Calls bot enableMouse\n  and enableKeys.\n- __copyToClipboard(text)__ - Attempt to copy text to clipboard using iTerm2's\n  proprietary sequence. Returns true if successful.\n- __cursorShape(shape, blink)__ - Attempt to change cursor shape. Will not work\n  in all terminals (see artificial cursors for a solution to this). Returns\n  true if successful.\n- __cursorColor(color)__ - Attempt to change cursor color. Returns true if\n  successful.\n- __cursorReset()__ - Attempt to reset cursor. Returns true if successful.\n- __screenshot([xi, xl, yi, yl])__ - Take an SGR screenshot of the screen\n  within the region. Returns a string containing only characters and SGR codes.\n  Can be displayed by simply echoing it in a terminal.\n- __destroy()__ - Destroy the screen object and remove it from the global list.\n  Also remove all global events relevant to the screen object. If all screen\n  objects are destroyed, the node process is essentially reset to its initial\n  state.\n- __setTerminal(term)__ - Reset the terminal to `term`. Reloads terminfo.\n\n\n#### Element (from Node)\n\nThe base element.\n\n##### Options:\n\n- __fg, bg, bold, underline__ - Attributes.\n- __style__ - May contain attributes in the format of:\n``` js\n  {\n    fg: 'blue',\n    bg: 'black',\n    border: {\n      fg: 'blue'\n    },\n    scrollbar: {\n      bg: 'blue'\n    },\n    focus: {\n      bg: 'red'\n    },\n    hover: {\n      bg: 'red'\n    }\n  }\n```\n- __border__ - Border object, see below.\n- __content__ - Element's text content.\n- __clickable__ - Element is clickable.\n- __input, keyable__ - Element is focusable and can receive key input.\n- __focused__ - Element is focused.\n- __hidden__ - Whether the element is hidden.\n- __label__ - A simple text label for the element.\n- __hoverText__ - A floating text label for the element which appears on mouseover.\n- __align__ - Text alignment: `left`, `center`, or `right`.\n- __valign__ - Vertical text alignment: `top`, `middle`, or `bottom`.\n- __shrink__ - Shrink/flex/grow to content and child elements. Width/height\n  during render.\n- __padding__ - Amount of padding on the inside of the element. Can be a number\n  or an object containing the properties: `left`, `right`, `top`, and `bottom`.\n- __width, height__ - Width/height of the element, can be a number, percentage\n  (`0-100%`), or keyword (`half` or `shrink`). Percentages can also have\n  offsets (`50%+1`, `50%-1`).\n- __left, right, top, bottom__ - Offsets of the element __relative to its\n  parent__. Can be a number, percentage (`0-100%`), or keyword (`center`).\n  `right` and `bottom` do not accept keywords. Percentages can also have\n  offsets (`50%+1`, `50%-1`).\n- __position__ - Can contain the above options.\n- __scrollable__ - Whether the element is scrollable or not.\n- __ch__ - Background character (default is whitespace ` `).\n- __draggable__ - Allow the element to be dragged with the mouse.\n- __shadow__ - Draw a translucent offset shadow behind the element.\n\n##### Properties:\n\n- Inherits all from Node.\n- __name__ - Name of the element. Useful for form submission.\n- __border__ - Border object.\n  - __type__ - Type of border (`line` or `bg`). `bg` by default.\n  - __ch__ - Character to use if `bg` type, default is space.\n  - __bg, fg__ - Border foreground and background, must be numbers (-1 for\n    default).\n  - __bold, underline__ - Border attributes.\n- __style__ - Contains attributes (e.g. `fg/bg/underline`). See above.\n- __position__ - Raw width, height, and offsets.\n- __content__ - Raw text content.\n- __hidden__ - Whether the element is hidden or not.\n- __visible__ - Whether the element is visible or not.\n- __detached__ - Whether the element is attached to a screen in its ancestry\n  somewhere.\n- __fg, bg__ - Foreground and background, must be numbers (-1 for default).\n- __bold, underline__ - Attributes.\n- __width__ - Calculated width.\n- __height__ - Calculated height.\n- __left__ - Calculated relative left offset.\n- __right__ - Calculated relative right offset.\n- __top__ - Calculated relative top offset.\n- __bottom__ - Calculated relative bottom offset.\n- __aleft__ - Calculated absolute left offset.\n- __aright__ - Calculated absolute right offset.\n- __atop__ - Calculated absolute top offset.\n- __abottom__ - Calculated absolute bottom offset.\n- __draggable__ - Whether the element is draggable. Set to true to allow\n  dragging.\n\n##### Events:\n\n- Inherits all from Node.\n- __blur, focus__ - Received when an element is focused or unfocused.\n- __mouse__ - Received on mouse events for this element.\n  - __mousedown, mouseup__ - Mouse button was pressed or released.\n  - __wheeldown, wheelup__ - Wheel was scrolled down or up.\n  - __mouseover, mouseout__ - Element was hovered or unhovered.\n  - __mousemove__ - Mouse was moved somewhere on this element.\n  - __click__ - Element was clicked (slightly smarter than mouseup).\n- __keypress__ - Received on key events for this element.\n- __move__ - Received when the element is moved.\n- __resize__ - Received when the element is resized.\n- __key [name]__ - Received on key event for [name].\n- __prerender__ - Received before a call to render.\n- __render__ - Received after a call to render.\n- __hide__ - Received when element becomes hidden.\n- __show__ - Received when element is shown.\n- __destroy__ - Received when element is destroyed.\n\n##### Methods:\n\n- Inherits all from Node.\n- Note: If the `scrollable` option is enabled, Element inherits all methods\n  from ScrollableBox.\n- __render()__ - Write content and children to the screen buffer.\n- __hide()__ - Hide element.\n- __show()__ - Show element.\n- __toggle()__ - Toggle hidden/shown.\n- __focus()__ - Focus element.\n- __key(name, listener)__ - Bind a keypress listener for a specific key.\n- __onceKey(name, listener)__ - Bind a keypress listener for a specific key\n  once.\n- __unkey(name, listener)__ - Remove a keypress listener for a specific key.\n- __onScreenEvent(type, handler)__ - Same as`el.on('screen', ...)` except this\n  will automatically keep track of which listeners are bound to the screen\n  object. For use with `removeScreenEvent()`, `free()`, and `destroy()`.\n- __removeScreenEvent(type, handler)__ - Same as`el.removeListener('screen',\n  ...)` except this will automatically keep track of which listeners are bound\n  to the screen object. For use with `onScreenEvent()`, `free()`, and\n  `destroy()`.\n- __free()__ - Free up the element. Automatically unbind all events that may\n  have been bound to the screen object. This prevents memory leaks. For use\n  with `onScreenEvent()`, `removeScreenEvent()`, and `destroy()`.\n- __destroy()__ - Same as the `detach()` method, except this will automatically\n  call `free()` and unbind any screen events to prevent memory leaks.  for use\n  with `onScreenEvent()`, `removeScreenEvent()`, and `free()`.\n- __setIndex(z)__ - Set the z-index of the element (changes rendering order).\n- __setFront()__ - Put the element in front of its siblings.\n- __setBack()__ - Put the element in back of its siblings.\n- __setLabel(text/options)__ - Set the label text for the top-left corner.\n  Example options: `{text:'foo',side:'left'}`\n- __removeLabel()__ - Remove the label completely.\n- __setHover(text/options)__ - Set a hover text box to follow the cursor.\n  Similar to the \"title\" DOM attribute in the browser.\n  Example options: `{text:'foo'}`\n- __removeHover()__ - Remove the hover label completely.\n- __enableMouse()__ - Enable mouse events for the element (automatically called\n  when a form of on('mouse') is bound).\n- __enableKeys()__ - Enable keypress events for the element (automatically\n  called when a form of on('keypress') is bound).\n- __enableInput()__ - Enable key and mouse events. Calls bot enableMouse and\n  enableKeys.\n- __enableDrag()__ - Enable dragging of the element.\n- __disableDrag()__ - Disable dragging of the element.\n- __screenshot([xi, xl, yi, yl])__ - Take an SGR screenshot of the element\n  within the region. Returns a string containing only characters and SGR codes.\n  Can be displayed by simply echoing it in a terminal.\n\n###### Content Methods\n\nMethods for dealing with text content, line by line. Useful for writing a\ntext editor, irc client, etc.\n\nNote: All of these methods deal with pre-aligned, pre-wrapped text. If you use\ndeleteTop() on a box with a wrapped line at the top, it may remove 3-4 \"real\"\nlines (rows) depending on how long the original line was.\n\nThe `lines` parameter can be a string or an array of strings. The `line`\nparameter must be a string.\n\n- __setContent(text)__ - Set the content. Note: When text is input, it will be\n  stripped of all non-SGR escape codes, tabs will be replaced with 8 spaces,\n  and tags will be replaced with SGR codes (if enabled).\n- __getContent()__ - Return content, slightly different from `el.content`.\n  Assume the above formatting.\n- __setText(text)__ - Similar to `setContent`, but ignore tags and remove escape\n  codes.\n- __getText()__ - Similar to `getContent`, but return content with tags and\n  escape codes removed.\n- __insertLine(i, lines)__ - Insert a line into the box's content.\n- __deleteLine(i)__ - Delete a line from the box's content.\n- __getLine(i)__ - Get a line from the box's content.\n- __getBaseLine(i)__ - Get a line from the box's content from the visible top.\n- __setLine(i, line)__ - Set a line in the box's content.\n- __setBaseLine(i, line)__ - Set a line in the box's content from the visible\n  top.\n- __clearLine(i)__ - Clear a line from the box's content.\n- __clearBaseLine(i)__ - Clear a line from the box's content from the visible\n  top.\n- __insertTop(lines)__ - Insert a line at the top of the box.\n- __insertBottom(lines)__ - Insert a line at the bottom of the box.\n- __deleteTop()__ - Delete a line at the top of the box.\n- __deleteBottom()__ - Delete a line at the bottom of the box.\n- __unshiftLine(lines)__ - Unshift a line onto the top of the content.\n- __shiftLine(i)__ - Shift a line off the top of the content.\n- __pushLine(lines)__ - Push a line onto the bottom of the content.\n- __popLine(i)__ - Pop a line off the bottom of the content.\n- __getLines()__ - An array containing the content lines.\n- __getScreenLines()__ - An array containing the lines as they are displayed on\n  the screen.\n- __strWidth(text)__ - Get a string's displayed width, taking into account\n  double-width, surrogate pairs, combining characters, tags, and SGR escape\n  codes.\n\n\n### Boxes\n\n\n#### Box (from Element)\n\nA box element which draws a simple box containing `content` or other elements.\n\n##### Options:\n\n- Inherits all from Element.\n\n##### Properties:\n\n- Inherits all from Element.\n\n##### Events:\n\n- Inherits all from Element.\n\n##### Methods:\n\n- Inherits all from Element.\n\n\n#### Text (from Element)\n\nAn element similar to Box, but geared towards rendering simple text elements.\n\n##### Options:\n\n- Inherits all from Element.\n- __fill__ - Fill the entire line with chosen bg until parent bg ends, even if\n  there is not enough text to fill the entire width. __(deprecated)__\n- __align__ - Text alignment: `left`, `center`, or `right`.\n\nInherits all options, properties, events, and methods from Element.\n\n\n#### Line (from Box)\n\nA simple line which can be `line` or `bg` styled.\n\n##### Options:\n\n- Inherits all from Box.\n- __orientation__ - Can be `vertical` or `horizontal`.\n- __type, bg, fg, ch__ - Treated the same as a border object.\n  (attributes can be contained in `style`).\n\nInherits all options, properties, events, and methods from Box.\n\n\n#### ScrollableBox (from Box)\n\n__DEPRECATED__ - Use Box with the `scrollable` option instead.\n\nA box with scrollable content.\n\n##### Options:\n\n- Inherits all from Box.\n- __baseLimit__ - A limit to the childBase. Default is `Infinity`.\n- __alwaysScroll__ - A option which causes the ignoring of `childOffset`. This\n  in turn causes the childBase to change every time the element is scrolled.\n- __scrollbar__ - Object enabling a scrollbar.\n- __scrollbar.style__ - Style of the scrollbar.\n- __scrollbar.track__ - Style of the scrollbar track if present (takes regular\n  style options).\n\n##### Properties:\n\n- Inherits all from Box.\n- __childBase__ - The offset of the top of the scroll content.\n- __childOffset__ - The offset of the chosen item/line.\n\n##### Events:\n\n- Inherits all from Box.\n- __scroll__ - Received when the element is scrolled.\n\n##### Methods:\n\n- __scroll(offset)__ - Scroll the content by a relative offset.\n- __scrollTo(index)__ - Scroll the content to an absolute index.\n- __setScroll(index)__ - Same as `scrollTo`.\n- __setScrollPerc(perc)__ - Set the current scroll index in percentage (0-100).\n- __getScroll()__ - Get the current scroll index in lines.\n- __getScrollHeight()__ - Get the actual height of the scrolling area.\n- __getScrollPerc()__ - Get the current scroll index in percentage.\n- __resetScroll()__ - Reset the scroll index to its initial state.\n\n\n#### ScrollableText (from ScrollableBox)\n\n__DEPRECATED__ - Use Box with the `scrollable` and `alwaysScroll` options\ninstead.\n\nA scrollable text box which can display and scroll text, as well as handle\npre-existing newlines and escape codes.\n\n##### Options:\n\n- Inherits all from ScrollableBox.\n- __mouse__ - Whether to enable automatic mouse support for this element.\n- __keys__ - Use predefined keys for navigating the text.\n- __vi__ - Use vi keys with the `keys` option.\n\n##### Properties:\n\n- Inherits all from ScrollableBox.\n\n##### Events:\n\n- Inherits all from ScrollableBox.\n\n##### Methods:\n\n- Inherits all from ScrollableBox.\n\n\n#### BigText (from Box)\n\nA box which can render content drawn as 8x14 cell characters using the terminus\nfont.\n\n##### Options:\n\n- Inherits all from Box.\n- __font__ - bdf->json font file to use (see [ttystudio][ttystudio] for\n  instructions on compiling BDFs to JSON).\n- __fontBold__ - bdf->json bold font file to use (see [ttystudio][ttystudio]\n  for instructions on compiling BDFs to JSON).\n- __fch__ - foreground character. (default: `' '`)\n\n##### Properties:\n\n- Inherits all from Box.\n\n##### Events:\n\n- Inherits all from Box.\n\n##### Methods:\n\n- Inherits all from Box.\n\n\n### Lists\n\n\n#### List (from Box)\n\nA scrollable list which can display selectable items.\n\n##### Options:\n\n- Inherits all from Box.\n- __style.selected__ - Style for a selected item.\n- __style.item__ - Style for an unselected item.\n- __mouse__ - Whether to automatically enable mouse support for this list\n  (allows clicking items).\n- __keys__ - Use predefined keys for navigating the list.\n- __vi__ - Use vi keys with the `keys` option.\n- __items__ - An array of strings which become the list's items.\n- __search__ - A function that is called when `vi` mode is enabled and the key\n  `/` is pressed. This function accepts a callback function which should be\n  called with the search string. The search string is then used to jump to an\n  item that is found in `items`.\n- __interactive__ - Whether the list is interactive and can have items selected\n  (Default: true).\n- __invertSelected__ - Whether to automatically override tags and invert fg of\n  item when selected (Default: `true`).\n\n##### Properties:\n\n- Inherits all from Box.\n\n##### Events:\n\n- Inherits all from Box.\n- __select__ - Received when an item is selected.\n- __cancel__ - List was canceled (when `esc` is pressed with the `keys` option).\n- __action__ - Either a select or a cancel event was received.\n\n##### Methods:\n\n- Inherits all from Box.\n- __add/addItem(text)__ - Add an item based on a string.\n- __removeItem(child)__ - Removes an item from the list. Child can be an\n  element, index, or string.\n- __pushItem(child)__ - Push an item onto the list.\n- __popItem()__ - Pop an item off the list.\n- __unshiftItem(child)__ - Unshift an item onto the list.\n- __shiftItem()__ - Shift an item off the list.\n- __insertItem(i, child)__ - Inserts an item to the list. Child can be an\n  element, index, or string.\n- __getItem(child)__ - Returns the item element. Child can be an element,\n  index, or string.\n- __setItem(child, content)__ - Set item to content.\n- __spliceItem(i, n, item1, ...)__ - Remove and insert items to the list.\n- __clearItems()__ - Clears all items from the list.\n- __setItems(items)__ - Sets the list items to multiple strings.\n- __getItemIndex(child)__ - Returns the item index from the list. Child can be\n  an element, index, or string.\n- __select(index)__ - Select an index of an item.\n- __move(offset)__ - Select item based on current offset.\n- __up(amount)__ - Select item above selected.\n- __down(amount)__ - Select item below selected.\n- __pick(callback)__ - Show/focus list and pick an item. The callback is\n  executed with the result.\n- __fuzzyFind([string/regex/callback])__ - Find an item based on its text\n  content.\n\n\n#### FileManager (from List)\n\nA very simple file manager for selecting files.\n\n##### Options:\n\n- Inherits all from List.\n- __cwd__ - Current working directory.\n\n##### Properties:\n\n- Inherits all from List.\n- __cwd__ - Current working directory.\n\n##### Events:\n\n- Inherits all from List.\n- __cd__ - Directory was selected and navigated to.\n- __file__ - File was selected.\n\n##### Methods:\n\n- Inherits all from List.\n- __refresh([cwd], [callback])__ - Refresh the file list (perform a `readdir` on `cwd`\n  and update the list items).\n- __pick([cwd], callback)__ - Pick a single file and return the path in the callback.\n- __reset([cwd], [callback])__ - Reset back to original cwd.\n\n\n#### ListTable (from List)\n\nA stylized table of text elements with a list.\n\n##### Options:\n\n- Inherits all from List.\n- __rows/data__ - Array of array of strings representing rows.\n- __pad__ - Spaces to attempt to pad on the sides of each cell. `2` by default:\n  one space on each side (only useful if the width is shrunken).\n- __noCellBorders__ - Do not draw inner cells.\n- __style.header__ - Header style.\n- __style.cell__ - Cell style.\n\n##### Properties:\n\n- Inherits all from List.\n\n##### Events:\n\n- Inherits all from List.\n\n##### Methods:\n\n- Inherits all from List.\n- __setRows/setData(rows)__ - Set rows in table. Array of arrays of strings.\n``` js\n  table.setData([\n    [ 'Animals',  'Foods'  ],\n    [ 'Elephant', 'Apple'  ],\n    [ 'Bird',     'Orange' ]\n  ]);\n```\n\n\n#### Listbar (from Box)\n\nA horizontal list. Useful for a main menu bar.\n\n##### Options:\n\n- Inherits all from Box.\n- __style.selected__ - Style for a selected item.\n- __style.item__ - Style for an unselected item.\n- __commands/items__ - Set buttons using an object with keys as titles of\n  buttons, containing of objects containing keys of `keys` and `callback`.\n- __autoCommandKeys__ - Automatically bind list buttons to keys 0-9.\n\n##### Properties:\n\n- Inherits all from Box.\n\n##### Events:\n\n- Inherits all from Box.\n\n##### Methods:\n\n- Inherits all from Box.\n- __setItems(commands)__ - Set commands (see `commands` option above).\n- __add/addItem/appendItem(item, callback)__ - Append an item to the bar.\n- __select(offset)__ - Select an item on the bar.\n- __removeItem(child)__ - Remove item from the bar.\n- __move(offset)__ - Move relatively across the bar.\n- __moveLeft(offset)__ - Move left relatively across the bar.\n- __moveRight(offset)__ - Move right relatively across the bar.\n- __selectTab(index)__ - Select button and execute its callback.\n\n\n### Forms\n\n\n#### Form (from Box)\n\nA form which can contain form elements.\n\n##### Options:\n\n- Inherits all from Box.\n- __keys__ - Allow default keys (tab, vi keys, enter).\n- __vi__ - Allow vi keys.\n\n##### Properties:\n\n- Inherits all from Box.\n- __submission__ - Last submitted data.\n\n##### Events:\n\n- Inherits all from Box.\n- __submit__ - Form is submitted. Receives a data object.\n- __cancel__ - Form is discarded.\n- __reset__ - Form is cleared.\n\n##### Methods:\n\n- Inherits all from Box.\n- __focusNext()__ - Focus next form element.\n- __focusPrevious()__ - Focus previous form element.\n- __submit()__ - Submit the form.\n- __cancel()__ - Discard the form.\n- __reset()__ - Clear the form.\n\n\n#### Input (from Box)\n\nA form input.\n\n\n#### Textarea (from Input)\n\nA box which allows multiline text input.\n\n##### Options:\n\n- Inherits all from Input.\n- __keys__ - Use pre-defined keys (`i` or `enter` for insert, `e` for editor,\n  `C-e` for editor while inserting).\n- __mouse__ - Use pre-defined mouse events (right-click for editor).\n- __inputOnFocus__ - Call `readInput()` when the element is focused.\n  Automatically unfocus.\n\n##### Properties:\n\n- Inherits all from Input.\n- __value__ - The input text. __read-only__.\n\n##### Events:\n\n- Inherits all from Input.\n- __submit__ - Value is submitted (enter).\n- __cancel__ - Value is discared (escape).\n- __action__ - Either submit or cancel.\n\n##### Methods:\n\n- Inherits all from Input.\n- __submit__ - Submit the textarea (emits `submit`).\n- __cancel__ - Cancel the textarea (emits `cancel`).\n- __readInput(callback)__ - Grab key events and start reading text from the\n  keyboard. Takes a callback which receives the final value.\n- __readEditor(callback)__ - Open text editor in `$EDITOR`, read the output from\n  the resulting file. Takes a callback which receives the final value.\n- __getValue()__ - The same as `this.value`, for now.\n- __clearValue()__ - Clear input.\n- __setValue(text)__ - Set value.\n\n\n#### Textbox (from Textarea)\n\nA box which allows text input.\n\n##### Options:\n\n- Inherits all from Textarea.\n- __secret__ - Completely hide text.\n- __censor__ - Replace text with asterisks (`*`).\n\n##### Properties:\n\n- Inherits all from Textarea.\n- __secret__ - Completely hide text.\n- __censor__ - Replace text with asterisks (`*`).\n\n##### Events:\n\n- Inherits all from Textarea.\n\n##### Methods:\n\n- Inherits all from Textarea.\n\n\n#### Button (from Input)\n\nA button which can be focused and allows key and mouse input.\n\n##### Options:\n\n- Inherits all from Input.\n\n##### Properties:\n\n- Inherits all from Input.\n\n##### Events:\n\n- Inherits all from Input.\n- __press__ - Received when the button is clicked/pressed.\n\n##### Methods:\n\n- Inherits all from Input.\n- __press()__ - Press button. Emits `press`.\n\n\n#### Checkbox (from Input)\n\nA checkbox which can be used in a form element.\n\n##### Options:\n\n- Inherits all from Input.\n- __checked__ - Whether the element is checked or not.\n- __mouse__ - Enable mouse support.\n\n##### Properties:\n\n- Inherits all from Input.\n- __text__ - The text next to the checkbox (do not use setContent, use\n  `check.text = ''`).\n- __checked__ - Whether the element is checked or not.\n- __value__ - Same as `checked`.\n\n##### Events:\n\n- Inherits all from Input.\n- __check__ - Received when element is checked.\n- __uncheck__ received when element is unchecked.\n\n##### Methods:\n\n- Inherits all from Input.\n- __check()__ - Check the element.\n- __uncheck()__ - Uncheck the element.\n- __toggle()__ - Toggle checked state.\n\n\n#### RadioSet (from Box)\n\nAn element wrapping RadioButtons. RadioButtons within this element will be\nmutually exclusive with each other.\n\n##### Options:\n\n- Inherits all from Box.\n\n##### Properties:\n\n- Inherits all from Box.\n\n##### Events:\n\n- Inherits all from Box.\n\n##### Methods:\n\n- Inherits all from Box.\n\n\n#### RadioButton (from Checkbox)\n\nA radio button which can be used in a form element.\n\n##### Options:\n\n- Inherits all from Checkbox.\n\n##### Properties:\n\n- Inherits all from Checkbox.\n\n##### Events:\n\n- Inherits all from Checkbox.\n\n##### Methods:\n\n- Inherits all from Checkbox.\n\n\n### Prompts\n\n\n#### Prompt (from Box)\n\nA prompt box containing a text input, okay, and cancel buttons (automatically\nhidden).\n\n##### Options:\n\n- Inherits all from Box.\n\n##### Properties:\n\n- Inherits all from Box.\n\n##### Events:\n\n- Inherits all from Box.\n\n##### Methods:\n\n- Inherits all from Box.\n- __input/setInput/readInput(text, value, callback)__ - Show the prompt and\n  wait for the result of the textbox. Set text and initial value.\n\n\n#### Question (from Box)\n\nA question box containing okay and cancel buttons (automatically hidden).\n\n##### Options:\n\n- Inherits all from Box.\n\n##### Properties:\n\n- Inherits all from Box.\n\n##### Events:\n\n- Inherits all from Box.\n\n##### Methods:\n\n- Inherits all from Box.\n- __ask(question, callback)__ - Ask a `question`. `callback` will yield the\n  result.\n\n\n#### Message (from Box)\n\nA box containing a message to be displayed (automatically hidden).\n\n##### Options:\n\n- Inherits all from Box.\n\n##### Properties:\n\n- Inherits all from Box.\n\n##### Events:\n\n- Inherits all from Box.\n\n##### Methods:\n\n- Inherits all from Box.\n- __log/display(text, [time], callback)__ - Display a message for a time\n  (default is 3 seconds). Set time to 0 for a perpetual message that is\n  dismissed on keypress.\n- __error(text, [time], callback)__ - Display an error in the same way.\n\n\n#### Loading (from Box)\n\nA box with a spinning line to denote loading (automatically hidden).\n\n##### Options:\n\n- Inherits all from Box.\n\n##### Properties:\n\n- Inherits all from Box.\n\n##### Events:\n\n- Inherits all from Box.\n\n##### Methods:\n\n- Inherits all from Box.\n- __load(text)__ - Display the loading box with a message. Will lock keys until\n  `stop` is called.\n- __stop()__ - Hide loading box. Unlock keys.\n\n\n### Data Display\n\n\n#### ProgressBar (from Input)\n\nA progress bar allowing various styles. This can also be used as a form input.\n\n##### Options:\n\n- Inherits all from Input.\n- __orientation__ - Can be `horizontal` or `vertical`.\n- __style.bar__ - Style of the bar contents itself.\n- __pch__ - The character to fill the bar with (default is space).\n- __filled__ - The amount filled (0 - 100).\n- __value__ - Same as `filled`.\n- __keys__ - Enable key support.\n- __mouse__ - Enable mouse support.\n\n##### Properties:\n\n- Inherits all from Input.\n\n##### Events:\n\n- Inherits all from Input.\n- __reset__ - Bar was reset.\n- __complete__ - Bar has completely filled.\n\n##### Methods:\n\n- Inherits all from Input.\n- __progress(amount)__ - Progress the bar by a fill amount.\n- __setProgress(amount)__ - Set progress to specific amount.\n- __reset()__ - Reset the bar.\n\n\n#### Log (from ScrollableText)\n\nA log permanently scrolled to the bottom.\n\n##### Options:\n\n- Inherits all from ScrollableText.\n- __scrollback__ - Amount of scrollback allowed. Default: Infinity.\n- __scrollOnInput__ - Scroll to bottom on input even if the user has scrolled\n  up. Default: false.\n\n##### Properties:\n\n- Inherits all from ScrollableText.\n- __scrollback__ - Amount of scrollback allowed. Default: Infinity.\n- __scrollOnInput__ - Scroll to bottom on input even if the user has scrolled\n  up. Default: false.\n\n##### Events:\n\n- Inherits all from ScrollableText.\n- __log__ - Emitted on a log line. Passes in line.\n\n##### Methods:\n\n- Inherits all from ScrollableText.\n- __log/add(text)__ - Add a log line.\n\n\n#### Table (from Box)\n\nA stylized table of text elements.\n\n##### Options:\n\n- Inherits all from Box.\n- __rows/data__ - Array of array of strings representing rows.\n- __pad__ - Spaces to attempt to pad on the sides of each cell. `2` by default:\n  one space on each side (only useful if the width is shrunken).\n- __noCellBorders__ - Do not draw inner cells.\n- __fillCellBorders__ - Fill cell borders with the adjacent background color.\n- __style.header__ - Header style.\n- __style.cell__ - Cell style.\n\n##### Properties:\n\n- Inherits all from Box.\n\n##### Events:\n\n- Inherits all from Box.\n\n##### Methods:\n\n- Inherits all from Box.\n- __setRows/setData(rows)__ - Set rows in table. Array of arrays of strings.\n``` js\n  table.setData([\n    [ 'Animals',  'Foods'  ],\n    [ 'Elephant', 'Apple'  ],\n    [ 'Bird',     'Orange' ]\n  ]);\n```\n\n\n### Special Elements\n\n\n#### Terminal (from Box)\n\nA box which spins up a pseudo terminal and renders the output. Useful for\nwriting a terminal multiplexer, or something similar to an mc-like file\nmanager. Requires term.js and pty.js to be installed. See\n`example/multiplex.js` for an example terminal multiplexer.\n\n##### Options:\n\n- Inherits all from Box.\n- __handler__ - Handler for input data.\n- __shell__ - Name of shell. `$SHELL` by default.\n- __args__ - Args for shell.\n- __cursor__ - Can be `line`, `underline`, and `block`.\n- __terminal__ - Terminal name (Default: `xterm`).\n- __env__ - Object for process env.\n- Other options similar to term.js'.\n\n##### Properties:\n\n- Inherits all from Box.\n- __term__ - Reference to the headless term.js terminal.\n- __pty__ - Reference to the pty.js pseudo terminal.\n\n##### Events:\n\n- Inherits all from Box.\n- __title__ - Window title from terminal.\n- Other events similar to ScrollableBox.\n\n##### Methods:\n\n- Inherits all from Box.\n- __write(data)__ - Write data to the terminal.\n- __screenshot([xi, xl, yi, xl])__ - Nearly identical to `element.screenshot`,\n  however, the specified region includes the terminal's _entire_ scrollback,\n  rather than just what is visible on the screen.\n- Other methods similar to ScrollableBox.\n\n\n#### Image (from Box)\n\nDisplay an image in the terminal (jpeg, png, gif) using either blessed's\ninternal png/gif-to-terminal renderer (using a [ANSIImage element](#ansiimage-from-box)) or\nusing `w3mimgdisplay` (using a [OverlayImage element](#overlayimage-from-box)).\n\n##### Options:\n\n- Inherits all from Box.\n- __file__ - Path to image.\n- __type__ - `ansi` or `overlay`. Whether to render the file as ANSI art or\n  using `w3m` to overlay. See the [ANSIImage element](#ansiimage-from-box) for\n  more information/options. (__default__: `ansi`).\n\n##### Properties:\n\n- Inherits all from Box.\n- See [ANSIImage element](#ansiimage-from-box)\n- See [OverlayImage element](#overlayimage-from-box)\n\n##### Events:\n\n- Inherits all from Box.\n- See [ANSIImage element](#ansiimage-from-box)\n- See [OverlayImage element](#overlayimage-from-box)\n\n##### Methods:\n\n- Inherits all from Box.\n- See [ANSIImage element](#ansiimage-from-box)\n- See [OverlayImage element](#overlayimage-from-box)\n\n\n#### ANSIImage (from Box)\n\nConvert any `.png` file (or `.gif`, see below) to an ANSI image and display it\nas an element. This differs from the `OverlayImage` element in that it uses\nblessed's internal PNG/GIF parser and does not require external dependencies.\n\nBlessed uses an internal from-scratch PNG/GIF reader because no other javascript\nPNG reader supports Adam7 interlaced images (much less pass the png test\nsuite).\n\nThe blessed PNG reader supports adam7 deinterlacing, animation (APNG), all\ncolor types, bit depths 1-32, alpha, alpha palettes, and outputs scaled bitmaps\n(cellmaps) in blessed for efficient rendering to the screen buffer. It also\nuses some code from libcaca/libcucul to add density ASCII characters in order\nto give the image more detail in the terminal.\n\nIf a corrupt PNG or a non-PNG is passed in, blessed will display error text in\nthe element.\n\n`.gif` files are also supported via a javascript implementation (they are\ninternally converted to bitmaps and fed to the PNG renderer). Any other image\nformat is support only if the user has imagemagick (`convert` and `identify`)\ninstalled.\n\n##### Options:\n\n- Inherits all from Box.\n- __file__ - URL or path to PNG/GIF file. Can also be a buffer.\n- __scale__ - Scale cellmap down (`0-1.0`) from its original pixel width/height\n  (Default: `1.0`).\n- __width/height__ - This differs from other element's `width` or `height` in\n  that only one of them is needed: blessed will maintain the aspect ratio of\n  the image as it scales down to the proper number of cells. __NOTE__: PNG/GIF's\n  are always automatically shrunken to size (based on scale) if a `width` or\n  `height` is not given.\n- __ascii__ - Add various \"density\" ASCII characters over the rendering to give\n  the image more detail, similar to libcaca/libcucul (the library mplayer uses\n  to display videos in the terminal).\n- __animate__ - Whether to animate if the image is an APNG/animating GIF. If\n  false, only display the first frame or IDAT (Default: `true`).\n- __speed__ - Set the speed of animation. Slower: `0.0-1.0`. Faster: `1-1000`.\n  It cannot go faster than 1 frame per millisecond, so 1000 is the fastest.\n  (Default: 1.0)\n- __optimization__ - `mem` or `cpu`. If optimizing for memory, animation frames\n  will be rendered to bitmaps _as the animation plays_, using less memory.\n  Optimizing for cpu will precompile all bitmaps beforehand, which may be\n  faster, but might also OOM the process on large images. (Default: `mem`).\n\n##### Properties:\n\n- Inherits all from Box.\n- __img__ - Image object from the png reader.\n- __img.width__ - Pixel width.\n- __img.height__ - Pixel height.\n- __img.bmp__ - Image bitmap.\n- __img.cellmap__ - Image cellmap (bitmap scaled down to cell size).\n\n##### Events:\n\n- Inherits all from Box.\n\n##### Methods:\n\n- Inherits all from Box.\n- __setImage(file)__ - Set the image in the box to a new path. File can be a\n  path, url, or buffer.\n- __clearImage()__ - Clear the image.\n- __play()__ - Play animation if it has been paused or stopped.\n- __pause()__ - Pause animation.\n- __stop()__ - Stop animation.\n\n\n#### OverlayImage (from Box)\n\nDisplay an image in the terminal (jpeg, png, gif) using w3mimgdisplay. Requires\nw3m to be installed. X11 required: works in xterm, urxvt, and possibly other\nterminals.\n\n##### Options:\n\n- Inherits all from Box.\n- __file__ - Path to image.\n- __ansi__ - Render the file as ANSI art instead of using `w3m` to overlay\n  Internally uses the ANSIImage element. See the [ANSIImage element](#ansiimage-from-box) for\n  more information/options. (Default: `true`).\n- __w3m__ - Path to w3mimgdisplay. If a proper `w3mimgdisplay` path is not\n  given, blessed will search the entire disk for the binary.\n- __search__ - Whether to search `/usr`, `/bin`, and `/lib` for\n  `w3mimgdisplay` (Default: `true`).\n\n##### Properties:\n\n- Inherits all from Box.\n\n##### Events:\n\n- Inherits all from Box.\n\n##### Methods:\n\n- Inherits all from Box.\n- __setImage(img, [callback])__ - Set the image in the box to a new path.\n- __clearImage([callback])__ - Clear the current image.\n- __imageSize(img, [callback])__ - Get the size of an image file in pixels.\n- __termSize([callback])__ - Get the size of the terminal in pixels.\n- __getPixelRatio([callback])__ - Get the pixel to cell ratio for the terminal.\n- _Note:_ All methods above can be synchronous as long as the host version of\n  node supports `spawnSync`.\n\n\n#### Video (from Box)\n\nA box which spins up a pseudo terminal in order to render a video via `mplayer\n-vo caca` or `mpv --vo caca`. Requires `mplayer` or `mpv` to be installed with\nlibcaca support.\n\n##### Options:\n\n- Inherits all from Box.\n- __file__ - Video to play.\n- __start__ - Start time in seconds.\n\n##### Properties:\n\n- Inherits all from Box.\n- __tty__ - The terminal element running `mplayer` or `mpv`.\n\n##### Events:\n\n- Inherits all from Box.\n\n##### Methods:\n\n- Inherits all from Box.\n\n\n#### Layout (from Element)\n\nA layout which can position children automatically based on a `renderer` method\n(__experimental__ - the mechanics of this element may be changed in the\nfuture!).\n\nBy default, the Layout element automatically positions children as if they were\n`display: inline-block;` in CSS.\n\n##### Options:\n\n- Inherits all from Element.\n- __renderer__ - A callback which is called right before the children are\n  iterated over to be rendered. Should return an iterator callback which is\n  called on each child element: __iterator(el, i)__.\n- __layout__ - Using the default renderer, it provides two layouts: inline, and\n  grid. `inline` is the default and will render akin to `inline-block`. `grid`\n  will create an automatic grid based on element dimensions. The grid cells'\n  width and height are always determined by the largest children in the layout.\n\n##### Properties:\n\n- Inherits all from Element.\n\n##### Events:\n\n- Inherits all from Element.\n\n##### Methods:\n\n- Inherits all from Element.\n- __renderer(coords)__ - A callback which is called right before the children\n  are iterated over to be rendered. Should return an iterator callback which is\n  called on each child element: __iterator(el, i)__.\n- __isRendered(el)__ - Check to see if a previous child element has been\n  rendered and is visible on screen. This is __only__ useful for checking child\n  elements that have already been attempted to be rendered! see the example\n  below.\n- __getLast(i)__ - Get the last rendered and visible child element based on an\n  index. This is useful for basing the position of the current child element on\n  the position of the last child element.\n- __getLastCoords(i)__ - Get the last rendered and visible child element coords\n  based on an index. This is useful for basing the position of the current\n  child element on the position of the last child element. See the example\n  below.\n\n##### Rendering a Layout for child elements\n\n###### Notes\n\nYou must __always__ give `Layout` a width and height. This is a chicken-and-egg\nproblem: blessed cannot calculate the width and height dynamically _before_ the\nchildren are positioned.\n\n`border` and `padding` are already calculated into the `coords` object the\n`renderer` receives, so there is no need to account for it in your renderer.\n\nTry to set position for children using `el.position`. `el.position` is the most\nprimitive \"to-be-rendered\" way to set coordinates. Setting `el.left` directly\nhas more dynamic behavior which may interfere with rendering.\n\nSome definitions for `coords` (otherwise known as `el.lpos`):\n\n- `coords.xi` - the absolute x coordinate of the __left__ side of a rendered\n  element. It is absolute: relative to the screen itself.\n- `coords.xl` - the absolute x coordinate of the __right__ side of a rendered\n  element. It is absolute: relative to the screen itself.\n- `coords.yi` - the absolute y coordinate of the __top__ side of a rendered\n  element. It is absolute: relative to the screen itself.\n- `coords.yl` - the absolute y coordinate of the __bottom__ side of a rendered\n  element. It is absolute: relative to the screen itself.\n\nNote again: the `coords` the renderer receives for the Layout already has\nborder and padding subtracted, so you do not have to account for these. The\nchildren do not.\n\n###### Example\n\nHere is an example of how to provide a renderer. Note that this is also the\ndefault renderer if none is provided. This renderer will render each child as\nthough they were `display: inline-block;` in CSS, as if there were a\ndynamically sized horizontal grid from left to right.\n\n``` js\nvar layout = blessed.layout({\n  parent: screen,\n  top: 'center',\n  left: 'center',\n  width: '50%',\n  height: '50%',\n  border: 'line',\n  style: {\n    bg: 'red',\n    border: {\n      fg: 'blue'\n    }\n  },\n  // NOTE: This is already the default renderer if none is provided!\n  renderer: function(coords) {\n    var self = this;\n\n    // The coordinates of the layout element\n    var width = coords.xl - coords.xi\n      , height = coords.yl - coords.yi\n      , xi = coords.xi\n      , xl = coords.xl\n      , yi = coords.yi\n      , yl = coords.yl;\n\n    // The current row offset in cells (which row are we on?)\n    var rowOffset = 0;\n\n    // The index of the first child in the row\n    var rowIndex = 0;\n\n    return function iterator(el, i) {\n      // Make our children shrinkable. If they don't have a height, for\n      // example, calculate it for them.\n      el.shrink = true;\n\n      // Find the previous rendered child's coordinates\n      var last = self.getLastCoords(i);\n\n      // If there is no previously rendered element, we are on the first child.\n      if (!last) {\n        el.position.left = 0;\n        el.position.top = 0;\n      } else {\n        // Otherwise, figure out where to place this child. We'll start by\n        // setting it's `left`/`x` coordinate to right after the previous\n        // rendered element. This child will end up directly to the right of it.\n        el.position.left = last.xl - xi;\n\n        // If our child does not overlap the right side of the Layout, set it's\n        // `top`/`y` to the current `rowOffset` (the coordinate for the current\n        // row).\n        if (el.position.left + el.width <= width) {\n          el.position.top = rowOffset;\n        } else {\n          // Otherwise we need to start a new row and calculate a new\n          // `rowOffset` and `rowIndex` (the index of the child on the current\n          // row).\n          rowOffset += self.children.slice(rowIndex, i).reduce(function(out, el) {\n            if (!self.isRendered(el)) return out;\n            out = Math.max(out, el.lpos.yl - el.lpos.yi);\n            return out;\n          }, 0);\n          rowIndex = i;\n          el.position.left = 0;\n          el.position.top = rowOffset;\n        }\n      }\n\n      // If our child overflows the Layout, do not render it!\n      // Disable this feature for now.\n      if (el.position.top + el.height > height) {\n        // Returning false tells blessed to ignore this child.\n        // return false;\n      }\n    };\n  }\n});\n\nfor (var i = 0; i < 10; i++) {\n  blessed.box({\n    parent: layout,\n    width: i % 2 === 0 ? 10 : 20,\n    height: i % 2 === 0 ? 5 : 10,\n    border: 'line'\n  });\n}\n```\n\n\n### Other\n\n\n#### Helpers\n\nAll helpers reside on `blessed.helpers` or `blessed`.\n\n- __merge(a, b)__ - Merge objects `a` and `b` into object `a`.\n- __asort(obj)__ - Sort array alphabetically by `name` prop.\n- __hsort(obj)__ - Sort array numerically by `index` prop.\n- __findFile(start, target)__ - Find a file at `start` directory with name\n  `target`.\n- __escape(text)__ - Escape content's tags to be passed into `el.setContent()`.\n  Example: `box.setContent('escaped tag: ' + blessed.escape('{bold}{/bold}'));`\n- __parseTags(text)__ - Parse tags into SGR escape codes.\n- __generateTags(style, text)__ - Generate text tags based on `style` object.\n- __attrToBinary(style, element)__ - Convert `style` attributes to binary\n  format.\n- __stripTags(text)__ - Strip text of tags and SGR sequences.\n- __cleanTags(text)__ - Strip text of tags, SGR escape code, and\n  leading/trailing whitespace.\n- __dropUnicode(text)__ - Drop text of any >U+FFFF characters.\n\n\n### Mechanics\n\n\n#### Content & Tags\n\nEvery element can have text content via `setContent`. If `tags: true` was\npassed to the element's constructor, the content can contain tags. For example:\n\n``` js\nbox.setContent('hello {red-fg}{green-bg}{bold}world{/bold}{/green-bg}{/red-fg}');\n```\n\nTo make this more concise `{/}` cancels all character attributes.\n\n``` js\nbox.setContent('hello {red-fg}{green-bg}{bold}world{/}');\n```\n\n\n##### Colors\n\nBlessed tags support the basic 16 colors for colors, as well as up to 256\ncolors.\n\n``` js\nbox.setContent('hello {red-fg}{green-bg}world{/}');\n```\n\nTags can also use hex colors (which will be reduced to the most accurate\nterminal color):\n\n``` js\nbox.setContent('hello {#ff0000-fg}{#00ff00-bg}world{/}');\n```\n\n\n##### Attributes\n\nBlessed supports all terminal attributes, including `bold`, `underline`,\n`blink`, `inverse`, and `invisible`.\n\n``` js\nbox.setContent('hello {bold}world{/bold}');\n```\n\n\n##### Alignment\n\nNewlines and alignment are also possible in content.\n\n``` js\nbox.setContent('hello\\n'\n  + '{right}world{/right}\\n'\n  + '{center}foo{/center}\\n');\n  + 'left{|}right');\n```\n\nThis will produce a box that looks like:\n\n```\n| hello                 |\n|                 world |\n|          foo          |\n| left            right |\n```\n\n\n##### Escaping\n\nEscaping can either be done using `blessed.escape()`\n\n```\nbox.setContent('here is an escaped tag: ' + blessed.escape('{bold}{/bold}'));\n```\n\nOr with the special `{open}` and `{close}` tags:\n\n```\nbox.setContent('here is an escaped tag: {open}bold{close}{open}/bold{close}');\n```\n\nEither will produce:\n\n```\nhere is an escaped tag: {bold}{/bold}\n```\n\n\n##### SGR Sequences\n\nContent can also handle SGR escape codes. This means if you got output from a\nprogram, say `git log` for example, you can feed it directly to an element's\ncontent and the colors will be parsed appropriately.\n\nThis means that while `{red-fg}foo{/red-fg}` produces `^[[31mfoo^[[39m`, you\ncould just feed `^[[31mfoo^[[39m` directly to the content.\n\n\n#### Style\n\nThe style option controls most of the visual aspects of an element.\n\n``` js\n  style: {\n    fg: 'blue',\n    bg: 'black',\n    bold: true,\n    underline: false,\n    blink: false,\n    inverse: false,\n    invisible: false,\n    transparent: false,\n    border: {\n      fg: 'blue',\n      bg: 'red'\n    },\n    scrollbar: {\n      bg: 'blue'\n    },\n    focus: {\n      bg: 'red'\n    },\n    hover: {\n      bg: 'red'\n    }\n  }\n```\n\n\n##### Colors\n\nColors can be the names of any of the 16 basic terminal colors, along with hex\nvalues (e.g. `#ff0000`) for 256 color terminals. If 256 or 88 colors is not\nsupported. Blessed with reduce the color to whatever is available.\n\n\n##### Attributes\n\nBlessed supports all terminal attributes, including `bold`, `underline`,\n`blink`, `inverse`, and `invisible`. Attributes are represented as bools in the\n`style` object.\n\n\n##### Transparency\n\nBlessed can set the opacity of an element to 50% using `style.transparent =\ntrue;`. While this seems like it normally shouldn't be possible in a terminal,\nblessed will use a color blending algorithm to blend the element of the\nforemost element with the background behind it. Obviously characters cannot be\nblended, but background colors can.\n\n\n##### Shadow\n\nTranslucent shadows are also an option when it comes to styling an element.\nThis option will create a 50% opacity 2-cell wide, 1-cell high shadow offset to\nthe bottom-right.\n\n``` js\nshadow: true\n```\n\n\n##### Effects\n\nBlessed supports hover and focus styles. (Hover is only useful is mouse input\nis enabled).\n\n``` js\n  style: {\n    hover: {\n      bg: 'red'\n    },\n    focus: {\n      border: {\n        fg: 'blue'\n      }\n    }\n  }\n```\n\n\n##### Scrollbar\n\nOn scrollable elements, blessed will support style options for the scrollbar,\nsuch as:\n\n``` js\nstyle: {\n  scrollbar: {\n    bg: 'red',\n    fg: 'blue'\n  }\n}\n```\n\nAs a main option, scrollbar will either take a bool or an object:\n\n``` js\nscrollbar: {\n  ch: ' '\n}\n```\n\nOr:\n\n``` js\nscrollbar: true\n```\n\n\n#### Events\n\nEvents in Blessed work similar to the traditional node.js model, with one\nimportant difference: they have a concept of a tree and event bubbling.\n\n\n##### Event Bubbling\n\nEvents can bubble in blessed. For example:\n\nReceiving all click events for `box` (a normal event listener):\n\n``` js\nbox.on('click', function(mouse) {\n  box.setContent('You clicked ' + mouse.x + ', ' + mouse.y + '.');\n  screen.render();\n});\n```\n\nReceiving all click events for `box`, as well as all of its children:\n\n``` js\nbox.on('element click', function(el, mouse) {\n  box.setContent('You clicked '\n    + el.type + ' at ' + mouse.x + ', ' + mouse.y + '.');\n  screen.render();\n  if (el === box) {\n    return false; // Cancel propagation.\n  }\n});\n```\n\n`el` gets passed in as the first argument. It refers to the target element the\nevent occurred on. Returning `false` will cancel propagation up the tree.\n\n\n#### Positioning\n\nOffsets may be a number, a percentage (e.g. `50%`), or a keyword (e.g.\n`center`).\n\nDimensions may be a number, or a percentage (e.g. `50%`).\n\nPositions are treated almost _exactly_ the same as they are in CSS/CSSOM when\nan element has the `position: absolute` CSS property.\n\nWhen an element is created, it can be given coordinates in its constructor:\n\n``` js\nvar box = blessed.box({\n  left: 'center',\n  top: 'center',\n  bg: 'yellow',\n  width: '50%',\n  height: '50%'\n});\n```\n\nThis tells blessed to create a box, perfectly centered __relative to its\nparent__, 50% as wide and 50% as tall as its parent.\n\nPercentages can also have offsets applied to them:\n\n``` js\n  ...\n  height: '50%-1',\n  left: '45%+1',\n  ...\n```\n\nTo access the calculated offsets, relative to the parent:\n\n``` js\nconsole.log(box.left);\nconsole.log(box.top);\n```\n\nTo access the calculated offsets, absolute (relative to the screen):\n\n``` js\nconsole.log(box.aleft);\nconsole.log(box.atop);\n```\n\n\n##### Overlapping offsets and dimensions greater than parents'\n\nThis still needs to be tested a bit, but it should work.\n\n\n#### Rendering\n\nTo actually render the screen buffer, you must call `render`.\n\n``` js\nbox.setContent('Hello {#0fe1ab-fg}world{/}.');\nscreen.render();\n```\n\nElements are rendered with the lower elements in the children array being\npainted first. In terms of the painter's algorithm, the lowest indicies in the\narray are the furthest away, just like in the DOM.\n\n\n#### Artificial Cursors\n\nTerminal cursors can be tricky. They all have different custom escape codes to\nalter. As an _experimental_ alternative, blessed can draw a cursor for you,\nallowing you to have a custom cursor that you control.\n\n``` js\nvar screen = blessed.screen({\n  cursor: {\n    artificial: true,\n    shape: 'line',\n    blink: true,\n    color: null // null for default\n  }\n});\n```\n\nThat's it. It's controlled the same way as the regular cursor.\n\nTo create a custom cursor:\n\n``` js\nvar screen = blessed.screen({\n  cursor: {\n    artificial: true,\n    shape: {\n      bg: 'red',\n      fg: 'white',\n      bold: true,\n      ch: '#'\n    },\n    blink: true\n  }\n});\n```\n\n\n#### Multiple Screens\n\nBlessed supports the ability to create multiple screens. This may not seem\nuseful at first, but if you're writing a program that serves terminal\ninterfaces over http, telnet, or any other protocol, this can be very useful.\n\n##### Server Side Usage\n\nA simple telnet server might look like this (see examples/blessed-telnet.js for\na full example):\n\n``` js\nvar blessed = require('blessed');\nvar telnet = require('telnet2');\n\ntelnet({ tty: true }, function(client) {\n  client.on('term', function(terminal) {\n    screen.terminal = terminal;\n    screen.render();\n  });\n\n  client.on('size', function(width, height) {\n    client.columns = width;\n    client.rows = height;\n    client.emit('resize');\n  });\n\n  var screen = blessed.screen({\n    smartCSR: true,\n    input: client,\n    output: client,\n    terminal: 'xterm-256color',\n    fullUnicode: true\n  });\n\n  client.on('close', function() {\n    if (!screen.destroyed) {\n      screen.destroy();\n    }\n  });\n\n  screen.key(['C-c', 'q'], function(ch, key) {\n    screen.destroy();\n  });\n\n  screen.on('destroy', function() {\n    if (client.writable) {\n      client.destroy();\n    }\n  });\n\n  screen.data.main = blessed.box({\n    parent: screen,\n    left: 'center',\n    top: 'center',\n    width: '80%',\n    height: '90%',\n    border: 'line',\n    content: 'Welcome to my server. Here is your own private session.'\n  });\n\n  screen.render();\n}).listen(2300);\n```\n\nOnce you've written something similar and started it, you can simply telnet\ninto your blessed app:\n\n``` bash\n$ telnet localhost 2300\n```\n\nCreating a netcat server would also work as long as you disable line buffering\nand terminal echo on the commandline via `stty`:\n`$ stty -icanon -echo; ncat localhost 2300; stty icanon echo`\n\nOr by using netcat's `-t` option: `$ ncat -t localhost 2300`\n\nCreating a streaming http 1.1 server than runs in the terminal is possible by\ncurling it with special arguments: `$ curl -sSNT. localhost:8080`.\n\nThere are currently no examples of netcat/nc/ncat or http->curl servers yet.\n\n---\n\nThe `blessed.screen` constructor can accept `input`, `output`, and `term`\narguments to aid with this. The multiple screens will be managed internally by\nblessed. The programmer just has to keep track of the references, however, to\navoid ambiguity, it's possible to explicitly dictate which screen a node is\npart of by using the `screen` option when creating an element.\n\nThe `screen.destroy()` method is also crucial: this will clean up all event\nlisteners the screen has bound and make sure it stops listening on the event\nloop. Make absolutely certain to remember to clean up your screens once you're\ndone with them.\n\nA tricky part is making sure to include the ability for the client to send the\nTERM which is reset on the serverside, and the terminal size, which is should\nalso be reset on the serverside. Both of these capabilities are demonstrated\nabove.\n\nFor a working example of a blessed telnet server, see\n`examples/blessed-telnet.js`.\n\n\n### Notes\n\n\n#### Windows Compatibility\n\nCurrently there is no `mouse` or `resize` event support on Windows.\n\nWindows users will need to explicitly set `term` when creating a screen like so\n(__NOTE__: This is no longer necessary as of the latest versions of blessed.\nThis is now handled automatically):\n\n``` js\nvar screen = blessed.screen({ terminal: 'windows-ansi' });\n```\n\n\n#### Low-level Usage\n\nThis will actually parse the xterm terminfo and compile every\nstring capability to a javascript function:\n\n``` js\nvar blessed = require('blessed');\n\nvar tput = blessed.tput({\n  terminal: 'xterm-256color',\n  extended: true\n});\n\nprocess.stdout.write(tput.setaf(4) + 'Hello' + tput.sgr0() + '\\n');\n```\n\nTo play around with it on the command line, it works just like tput:\n\n``` bash\n$ tput.js setaf 2\n$ tput.js sgr0\n$ echo \"$(tput.js setaf 2)Hello World$(tput.js sgr0)\"\n```\n\nThe main functionality is exposed in the main `blessed` module:\n\n``` js\nvar blessed = require('blessed')\n  , program = blessed.program();\n\nprogram.key('q', function(ch, key) {\n  program.clear();\n  program.disableMouse();\n  program.showCursor();\n  program.normalBuffer();\n  process.exit(0);\n});\n\nprogram.on('mouse', function(data) {\n  if (data.action === 'mousemove') {\n    program.move(data.x, data.y);\n    program.bg('red');\n    program.write('x');\n    program.bg('!red');\n  }\n});\n\nprogram.alternateBuffer();\nprogram.enableMouse();\nprogram.hideCursor();\nprogram.clear();\n\nprogram.move(1, 1);\nprogram.bg('black');\nprogram.write('Hello world', 'blue fg');\nprogram.setx((program.cols / 2 | 0) - 4);\nprogram.down(5);\nprogram.write('Hi again!');\nprogram.bg('!black');\nprogram.feed();\n```\n\n\n#### Testing\n\nMost tests contained in the `test/` directory are interactive. It's up to the\nprogrammer to determine whether the test is properly displayed. In the future\nit might be better to do something similar to vttest.\n\n\n#### Examples\n\nExamples can be found in `examples/`.\n\n\n#### FAQ\n\n1. Why doesn't the Linux console render lines correctly on Ubuntu?\n  - You need to install the `ncurses-base` package __and__ the `ncurses-term`\n    package. (#98)\n2. Why do vertical lines look chopped up in iTerm2?\n  - All ACS vertical lines look this way in iTerm2 with the default font.\n3. Why can't I use my mouse in Terminal.app?\n  - Terminal.app does not support mouse events.\n4. Why doesn't the OverlayImage element appear in my terminal?\n  - The OverlayImage element uses w3m to display images. This generally only\n    works on X11+xterm/urxvt, but it _may_ work on other unix terminals.\n5. Why can't my mouse clicks register beyond 255 cells?\n  - Older versions of VTE do not support any modern mouse protocol. On top of\n    that, the old X10 protocol it _does_ implement is bugged. Through several\n    workarounds we've managed to get the cell limit from `127` to `255`. If\n    you're not happy with this, you may want to look into using xterm or urxvt,\n    or a terminal which uses a modern VTE, like gnome-terminal.\n6. Is blessed efficient?\n  - Yes. Blessed implements CSR and uses the painter's algorithm to render the\n    screen. It maintains two screen buffers so it only needs to render what\n    has changed on the terminal screen.\n7. Will blessed work with all terminals?\n  - Yes. Blessed has a terminfo/termcap parser and compiler that was written\n    from scratch. It should work with every terminal as long as a terminfo\n    file is provided. If you notice any compatibility issues in your termial,\n    do not hesitate to post an issue.\n8. What is \"curses\" and \"ncurses\"?\n  - [\"curses\"][curses] was an old library written in the early days of unix\n    which allowed a programmer to easily manipulate the cursor in order to\n    render the screen. [\"ncurses\"][ncurses] is a free reimplementation of\n    curses. It improved upon it quite a bit by focusing more on terminal\n    compatibility and is now the standard library for implementing terminal\n    programs. Blessed uses neither of these, and instead handles terminal\n    compatibility itself.\n9. What is the difference between blessed and blessed-contrib?\n  - blessed is a major piece of code which reimplements curses from the ground\n    up. A UI API is then layered on top of this. [blessed-contrib][contrib] is\n    a popular library built on top of blessed which makes clever use of modules\n    to implement useful widgets like graphs, ascii art, and so on.\n10. Are there blessed-like solutions for non-javascript platforms?\n  - Yes. There are some fantastic solutions out there.\n    - Perl: [Curses::UI][curses-ui]\n    - Python: [Urwid][urwid]\n    - Go: [termui][termui] & [termbox-go][termbox]\n\n\n## Contribution and License Agreement\n\nIf you contribute code to this project, you are implicitly allowing your code\nto be distributed under the MIT license. You are also implicitly verifying that\nall code is your original work. `</legalese>`\n\n\n## License\n\nCopyright (c) 2013-2015, Christopher Jeffrey. (MIT License)\n\nSee LICENSE for more info.\n\n[slap]: https://github.com/slap-editor/slap\n[contrib]: https://github.com/yaronn/blessed-contrib\n[termui]: https://github.com/gizak/termui\n[curses]: https://en.wikipedia.org/wiki/Curses_(programming_library)\n[ncurses]: https://en.wikipedia.org/wiki/Ncurses\n[urwid]: http://urwid.org/reference/index.html\n[curses-ui]: http://search.cpan.org/~mdxi/Curses-UI-0.9609/lib/Curses/UI.pm\n[termbox]: https://github.com/nsf/termbox-go\n[ttystudio]: https://github.com/chjj/ttystudio#choosing-a-new-font-for-your-terminal-recording\n"
  },
  {
    "path": "bin/tput.js",
    "content": "#!/usr/bin/env node\n\nvar blessed = require('../')\n  , argv = process.argv.slice(2)\n  , cmd = argv.shift()\n  , tput;\n\ntput = blessed.tput({\n  terminal: process.env.TERM,\n  termcap: !!process.env.USE_TERMCAP,\n  extended: true\n});\n\nif (tput[cmd]) {\n  process.stdout.write(tput[cmd].apply(tput, argv));\n}\n"
  },
  {
    "path": "browser/Makefile",
    "content": "all:\n\t@cd .. && browserify -e index.js -o browser/blessed.js\n\nclean:\n\t@rm -f blessed.js\n\n.PHONY: clean all\n"
  },
  {
    "path": "browser/transform.js",
    "content": "/**\n * transform.js - browserify workaround for blessed\n * Copyright (c) 2013-2015, Christopher Jeffrey and contributors (MIT License).\n * https://github.com/chjj/blessed\n */\n\nvar Transform = require('stream').Transform\n  , path = require('path')\n  , fs = require('fs');\n\n/**\n * Transformer\n */\n\nfunction transformer(code) {\n  var stream = new Transform;\n  stream._transform = function(chunk, encoding, callback) {\n    return callback(null, chunk);\n  };\n  stream._flush = function(callback) {\n    if (code) {\n      stream.push(code);\n    }\n    return callback();\n  };\n  return stream;\n}\n\n/**\n * Explicitly require all widgets in widget.js\n */\n\nvar widgets = fs.readdirSync(__dirname + '/../lib/widgets');\n\nvar requireWidgets = widgets.reduce(function(out, name) {\n  name = path.basename(name, '.js');\n  out += '\\nrequire(\\'./widgets/' + name + '\\');';\n  return out;\n}, '');\n\n/**\n * Do not make filesystem calls in tput.js for\n * terminfo or termcap, just use xterm terminfo/cap.\n */\n\nvar infoPath = path.resolve(__dirname, '..', 'usr', 'xterm-256color')\n  , capPath = path.resolve(__dirname, '..', 'usr', 'xterm.termcap');\n\nvar infoPathFake = path.resolve(\n  path.sep, 'usr', 'share', 'terminfo',\n  path.basename(infoPath)[0],\n  path.basename(infoPath)\n);\n\nfunction readMethods() {\n  Tput._infoBuffer = new Buffer(TERMINFO, 'base64');\n\n  Tput.prototype.readTerminfo = function() {\n    this.terminal = TERMINFO_NAME;\n    return this.parseTerminfo(Tput._infoBuffer, TERMINFO_PATH);\n  };\n\n  Tput.cpaths = [];\n  Tput.termcap = TERMCAP;\n\n  Tput.prototype._readTermcap = Tput.prototype.readTermcap;\n  Tput.prototype.readTermcap = function() {\n    this.terminal = TERMCAP_NAME;\n    return this._readTermcap(this.terminal);\n  };\n\n  Tput.prototype.detectUnicode = function() {\n    return true;\n  };\n}\n\nreadMethods = readMethods.toString().slice(24, -2)\n  .replace(/^  /gm, '')\n  .replace('TERMINFO', JSON.stringify(fs.readFileSync(infoPath, 'base64')))\n  .replace('TERMINFO_NAME', JSON.stringify(path.basename(infoPath)))\n  .replace('TERMINFO_PATH', JSON.stringify(infoPathFake))\n  .replace('TERMCAP', JSON.stringify(fs.readFileSync(capPath, 'utf8')))\n  .replace('TERMCAP_NAME', JSON.stringify(path.basename(capPath, '.termcap')));\n\n/**\n * Helpers\n */\n\nfunction end(file, offset) {\n  return file.split(path.sep).slice(-offset).join('/');\n}\n\n/**\n * Expose\n */\n\nmodule.exports = function(file) {\n  if (end(file, 2) === 'lib/widget.js') {\n    return transformer(requireWidgets);\n  }\n  if (end(file, 2) === 'lib/tput.js') {\n    return transformer(readMethods);\n  }\n  return transformer();\n};\n"
  },
  {
    "path": "example/ansi-viewer/LICENSE",
    "content": "Copyright (c) 2015, Christopher Jeffrey\nhttps://github.com/chjj/\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n"
  },
  {
    "path": "example/ansi-viewer/README.md",
    "content": "# ansi-viewer\n\nA terminal app to view ANSI art from http://artscene.textfiles.com/ansi/.\n\n![ansi-viewer](https://raw.githubusercontent.com/chjj/blessed/master/img/ansi-viewer.png)\n\n## Contribution and License Agreement\n\nIf you contribute code to this project, you are implicitly allowing your code\nto be distributed under the MIT license. You are also implicitly verifying that\nall code is your original work. `</legalese>`\n\n## License\n\nCopyright (c) 2015, Christopher Jeffrey. (MIT License)\n\nSee LICENSE for more info.\n"
  },
  {
    "path": "example/ansi-viewer/ansi-art.list",
    "content": "http://artscene.textfiles.com/ansi/information/arcane.ans\nhttp://artscene.textfiles.com/ansi/artwork/beastie.ans\nhttp://artscene.textfiles.com/ansi/artwork/beer.ans\nhttp://artscene.textfiles.com/ansi/artwork/belinda.ans\nhttp://artscene.textfiles.com/ansi/artwork/blues.ans\nhttp://artscene.textfiles.com/ansi/artwork/bookworm.ans\nhttp://artscene.textfiles.com/ansi/artwork/borgman.ans\nhttp://artscene.textfiles.com/ansi/artwork/boss1.ans\nhttp://artscene.textfiles.com/ansi/artwork/boss2.ans\nhttp://artscene.textfiles.com/ansi/artwork/boss3.ans\nhttp://artscene.textfiles.com/ansi/artwork/boss4.ans\nhttp://artscene.textfiles.com/ansi/artwork/bowl.ans\nhttp://artscene.textfiles.com/ansi/artwork/boxer.ans\nhttp://artscene.textfiles.com/ansi/artwork/bsktball.ans\nhttp://artscene.textfiles.com/ansi/artwork/bud_bug.ans\nhttp://artscene.textfiles.com/ansi/artwork/bwings1.ans\nhttp://artscene.textfiles.com/ansi/artwork/bwtrek.ans\nhttp://artscene.textfiles.com/ansi/artwork/bye_mike.ans\nhttp://artscene.textfiles.com/ansi/artwork/f_kuwait.ans\nhttp://artscene.textfiles.com/ansi/artwork/face.ans\nhttp://artscene.textfiles.com/ansi/artwork/face_2.ans\nhttp://artscene.textfiles.com/ansi/artwork/face_3.ans\nhttp://artscene.textfiles.com/ansi/artwork/face_4.ans\nhttp://artscene.textfiles.com/ansi/artwork/fbasebol.ans\nhttp://artscene.textfiles.com/ansi/artwork/feds.ans\nhttp://artscene.textfiles.com/ansi/artwork/fighters.ans\nhttp://artscene.textfiles.com/ansi/artwork/firstpic.ans\nhttp://artscene.textfiles.com/ansi/artwork/fish.ans\nhttp://artscene.textfiles.com/ansi/artwork/fishermn.ans\nhttp://artscene.textfiles.com/ansi/artwork/fist.ans\nhttp://artscene.textfiles.com/ansi/artwork/flower.ans\nhttp://artscene.textfiles.com/ansi/artwork/fort.ans\nhttp://artscene.textfiles.com/ansi/artwork/fortress.ans\nhttp://artscene.textfiles.com/ansi/artwork/fox_goat.ans\nhttp://artscene.textfiles.com/ansi/artwork/friendsh.ans\nhttp://artscene.textfiles.com/ansi/artwork/fruit.ans\nhttp://artscene.textfiles.com/ansi/artwork/fw_wf.ans\nhttp://artscene.textfiles.com/ansi/artwork/oakland.ans\nhttp://artscene.textfiles.com/ansi/artwork/t1.ans\nhttp://artscene.textfiles.com/ansi/artwork/t_hanot.ans\nhttp://artscene.textfiles.com/ansi/artwork/test_pat.ans\nhttp://artscene.textfiles.com/ansi/artwork/theq.ans\nhttp://artscene.textfiles.com/ansi/artwork/thoughts.ans\nhttp://artscene.textfiles.com/ansi/artwork/ti-nex7.ans\nhttp://artscene.textfiles.com/ansi/artwork/timebend.ans\nhttp://artscene.textfiles.com/ansi/artwork/trinity.ans\nhttp://artscene.textfiles.com/ansi/artwork/truckan.ans\nhttp://artscene.textfiles.com/ansi/artwork/tuit.ans\nhttp://artscene.textfiles.com/ansi/artwork/ufo.ans\nhttp://artscene.textfiles.com/ansi/artwork/us_eagle.ans\nhttp://artscene.textfiles.com/ansi/artwork/wwans59.ans\nhttp://artscene.textfiles.com/ansi/bbs/1014.ans\nhttp://artscene.textfiles.com/ansi/bbs/1stbrtbc.ans\nhttp://artscene.textfiles.com/ansi/bbs/360.ans\nhttp://artscene.textfiles.com/ansi/bbs/49ers_1.ans\nhttp://artscene.textfiles.com/ansi/bbs/49ers_2.ans\nhttp://artscene.textfiles.com/ansi/bbs/49hq.ans\nhttp://artscene.textfiles.com/ansi/bbs/4past.ans\nhttp://artscene.textfiles.com/ansi/bbs/786welcc.ans\nhttp://artscene.textfiles.com/ansi/bbs/7seas.ans\nhttp://artscene.textfiles.com/ansi/bbs/99dreams.ans\nhttp://artscene.textfiles.com/ansi/bbs/aaaug.ans\nhttp://artscene.textfiles.com/ansi/bbs/aardvark.ans\nhttp://artscene.textfiles.com/ansi/bbs/abbs-11.ans\nhttp://artscene.textfiles.com/ansi/bbs/abbs.ans\nhttp://artscene.textfiles.com/ansi/bbs/abcmail.ans\nhttp://artscene.textfiles.com/ansi/bbs/abyss.ans\nhttp://artscene.textfiles.com/ansi/bbs/abyss1.ans\nhttp://artscene.textfiles.com/ansi/bbs/abyss2.ans\nhttp://artscene.textfiles.com/ansi/bbs/ac6_0.ans\nhttp://artscene.textfiles.com/ansi/bbs/acad09.ans\nhttp://artscene.textfiles.com/ansi/bbs/acidvoid.ans\nhttp://artscene.textfiles.com/ansi/bbs/acrobar.ans\nhttp://artscene.textfiles.com/ansi/bbs/acromid.ans\nhttp://artscene.textfiles.com/ansi/bbs/acrosrt.ans\nhttp://artscene.textfiles.com/ansi/bbs/ad.ans\nhttp://artscene.textfiles.com/ansi/bbs/addnew.ans\nhttp://artscene.textfiles.com/ansi/bbs/address.ans\nhttp://artscene.textfiles.com/ansi/bbs/adlib.ans\nhttp://artscene.textfiles.com/ansi/bbs/aerosmth.ans\nhttp://artscene.textfiles.com/ansi/bbs/afacts.ans\nhttp://artscene.textfiles.com/ansi/bbs/afmid.ans\nhttp://artscene.textfiles.com/ansi/bbs/after5.ans\nhttp://artscene.textfiles.com/ansi/bbs/again.ans\nhttp://artscene.textfiles.com/ansi/bbs/age.ans\nhttp://artscene.textfiles.com/ansi/bbs/alterlin.ans\nhttp://artscene.textfiles.com/ansi/bbs/americom.ans\nhttp://artscene.textfiles.com/ansi/bbs/anbbs.ans\nhttp://artscene.textfiles.com/ansi/bbs/ans_0000.ans\nhttp://artscene.textfiles.com/ansi/bbs/ans_0001.ans\nhttp://artscene.textfiles.com/ansi/bbs/ans_0002.ans\nhttp://artscene.textfiles.com/ansi/bbs/ans_0003.ans\nhttp://artscene.textfiles.com/ansi/bbs/ans_0004.ans\nhttp://artscene.textfiles.com/ansi/bbs/ans_0006.ans\nhttp://artscene.textfiles.com/ansi/bbs/ans_0007.ans\nhttp://artscene.textfiles.com/ansi/bbs/ans_0020.ans\nhttp://artscene.textfiles.com/ansi/bbs/ans_0054.ans\nhttp://artscene.textfiles.com/ansi/bbs/ans_0064.ans\nhttp://artscene.textfiles.com/ansi/bbs/ansi1.ans\nhttp://artscene.textfiles.com/ansi/bbs/ansi2.ans\nhttp://artscene.textfiles.com/ansi/bbs/ansi3.ans\nhttp://artscene.textfiles.com/ansi/bbs/ansi41.ans\nhttp://artscene.textfiles.com/ansi/bbs/ansi5.ans\nhttp://artscene.textfiles.com/ansi/bbs/ansi6.ans\nhttp://artscene.textfiles.com/ansi/bbs/ansilime.ans\nhttp://artscene.textfiles.com/ansi/bbs/ansivue.ans\nhttp://artscene.textfiles.com/ansi/bbs/apbot.ans\nhttp://artscene.textfiles.com/ansi/bbs/aptop.ans\nhttp://artscene.textfiles.com/ansi/bbs/arcana.ans\nhttp://artscene.textfiles.com/ansi/bbs/arcane.ans\nhttp://artscene.textfiles.com/ansi/bbs/archive.ans\nhttp://artscene.textfiles.com/ansi/bbs/arden.ans\nhttp://artscene.textfiles.com/ansi/bbs/asmoke.ans\nhttp://artscene.textfiles.com/ansi/bbs/assassin.ans\nhttp://artscene.textfiles.com/ansi/bbs/asylum.ans\nhttp://artscene.textfiles.com/ansi/bbs/atlantis.ans\nhttp://artscene.textfiles.com/ansi/bbs/atlas.ans\nhttp://artscene.textfiles.com/ansi/bbs/aub.ans\nhttp://artscene.textfiles.com/ansi/bbs/auto.ans\nhttp://artscene.textfiles.com/ansi/bbs/auto1.ans\nhttp://artscene.textfiles.com/ansi/bbs/auto10.ans\nhttp://artscene.textfiles.com/ansi/bbs/auto11.ans\nhttp://artscene.textfiles.com/ansi/bbs/auto12.ans\nhttp://artscene.textfiles.com/ansi/bbs/auto2.ans\nhttp://artscene.textfiles.com/ansi/bbs/auto3.ans\nhttp://artscene.textfiles.com/ansi/bbs/auto4.ans\nhttp://artscene.textfiles.com/ansi/bbs/auto5.ans\nhttp://artscene.textfiles.com/ansi/bbs/auto6.ans\nhttp://artscene.textfiles.com/ansi/bbs/auto7.ans\nhttp://artscene.textfiles.com/ansi/bbs/auto8.ans\nhttp://artscene.textfiles.com/ansi/bbs/auto9.ans\nhttp://artscene.textfiles.com/ansi/bbs/availabl.ans\nhttp://artscene.textfiles.com/ansi/bbs/b10.ans\nhttp://artscene.textfiles.com/ansi/bbs/b100.ans\nhttp://artscene.textfiles.com/ansi/bbs/b11.ans\nhttp://artscene.textfiles.com/ansi/bbs/b13.ans\nhttp://artscene.textfiles.com/ansi/bbs/b14.ans\nhttp://artscene.textfiles.com/ansi/bbs/b15.ans\nhttp://artscene.textfiles.com/ansi/bbs/b16.ans\nhttp://artscene.textfiles.com/ansi/bbs/b17.ans\nhttp://artscene.textfiles.com/ansi/bbs/b18.ans\nhttp://artscene.textfiles.com/ansi/bbs/b19.ans\nhttp://artscene.textfiles.com/ansi/bbs/b21.ans\nhttp://artscene.textfiles.com/ansi/bbs/b22.ans\nhttp://artscene.textfiles.com/ansi/bbs/b23.ans\nhttp://artscene.textfiles.com/ansi/bbs/banner1.ans\nhttp://artscene.textfiles.com/ansi/bbs/banner2.ans\nhttp://artscene.textfiles.com/ansi/bbs/banner3.ans\nhttp://artscene.textfiles.com/ansi/bbs/batch.ans\nhttp://artscene.textfiles.com/ansi/bbs/batch1.ans\nhttp://artscene.textfiles.com/ansi/bbs/batch10.ans\nhttp://artscene.textfiles.com/ansi/bbs/batch11.ans\nhttp://artscene.textfiles.com/ansi/bbs/batch12.ans\nhttp://artscene.textfiles.com/ansi/bbs/batch2.ans\nhttp://artscene.textfiles.com/ansi/bbs/batch3.ans\nhttp://artscene.textfiles.com/ansi/bbs/batch4.ans\nhttp://artscene.textfiles.com/ansi/bbs/batch5.ans\nhttp://artscene.textfiles.com/ansi/bbs/batch6.ans\nhttp://artscene.textfiles.com/ansi/bbs/batch7.ans\nhttp://artscene.textfiles.com/ansi/bbs/batch8.ans\nhttp://artscene.textfiles.com/ansi/bbs/batch9.ans\nhttp://artscene.textfiles.com/ansi/bbs/bbnewhat.ans\nhttp://artscene.textfiles.com/ansi/bbs/bbsdoors.ans\nhttp://artscene.textfiles.com/ansi/bbs/bbslist.ans\nhttp://artscene.textfiles.com/ansi/bbs/bbslists.ans\nhttp://artscene.textfiles.com/ansi/bbs/bbslst1.ans\nhttp://artscene.textfiles.com/ansi/bbs/bbslst10.ans\nhttp://artscene.textfiles.com/ansi/bbs/bbslst11.ans\nhttp://artscene.textfiles.com/ansi/bbs/bbslst12.ans\nhttp://artscene.textfiles.com/ansi/bbs/bbslst2.ans\nhttp://artscene.textfiles.com/ansi/bbs/bbslst3.ans\nhttp://artscene.textfiles.com/ansi/bbs/bbslst4.ans\nhttp://artscene.textfiles.com/ansi/bbs/bbslst5.ans\nhttp://artscene.textfiles.com/ansi/bbs/bbslst6.ans\nhttp://artscene.textfiles.com/ansi/bbs/bbslst7.ans\nhttp://artscene.textfiles.com/ansi/bbs/bbslst8.ans\nhttp://artscene.textfiles.com/ansi/bbs/bbslst9.ans\nhttp://artscene.textfiles.com/ansi/bbs/bchange.ans\nhttp://artscene.textfiles.com/ansi/bbs/bday.ans\nhttp://artscene.textfiles.com/ansi/bbs/beloved.ans\nhttp://artscene.textfiles.com/ansi/bbs/billtcat.ans\nhttp://artscene.textfiles.com/ansi/bbs/blank.ans\nhttp://artscene.textfiles.com/ansi/bbs/blox.ans\nhttp://artscene.textfiles.com/ansi/bbs/board03.ans\nhttp://artscene.textfiles.com/ansi/bbs/br14400.ans\nhttp://artscene.textfiles.com/ansi/bbs/br2400.ans\nhttp://artscene.textfiles.com/ansi/bbs/br9600.ans\nhttp://artscene.textfiles.com/ansi/bbs/brothers.ans\nhttp://artscene.textfiles.com/ansi/bbs/bucden2.ans\nhttp://artscene.textfiles.com/ansi/bbs/bucden3.ans\nhttp://artscene.textfiles.com/ansi/bbs/bullet2.ans\nhttp://artscene.textfiles.com/ansi/bbs/bullet20.ans\nhttp://artscene.textfiles.com/ansi/bbs/bullet3.ans\nhttp://artscene.textfiles.com/ansi/bbs/bullet5.ans\nhttp://artscene.textfiles.com/ansi/bbs/bullet7.ans\nhttp://artscene.textfiles.com/ansi/bbs/bullet8.ans\nhttp://artscene.textfiles.com/ansi/bbs/bulletin.ans\nhttp://artscene.textfiles.com/ansi/bbs/bulletm.ans\nhttp://artscene.textfiles.com/ansi/bbs/buterfly.ans\nhttp://artscene.textfiles.com/ansi/bbs/bwing.ans\nhttp://artscene.textfiles.com/ansi/bbs/bye.ans\nhttp://artscene.textfiles.com/ansi/bbs/byesetup.ans\nhttp://artscene.textfiles.com/ansi/bbs/c128.ans\nhttp://artscene.textfiles.com/ansi/bbs/c64c.ans\nhttp://artscene.textfiles.com/ansi/bbs/call-me.ans\nhttp://artscene.textfiles.com/ansi/bbs/cascdenc.ans\nhttp://artscene.textfiles.com/ansi/bbs/cc-asylm.ans\nhttp://artscene.textfiles.com/ansi/bbs/chatdef.ans\nhttp://artscene.textfiles.com/ansi/bbs/chatend.ans\nhttp://artscene.textfiles.com/ansi/bbs/chatinit.ans\nhttp://artscene.textfiles.com/ansi/bbs/closing.ans\nhttp://artscene.textfiles.com/ansi/bbs/clsvote.ans\nhttp://artscene.textfiles.com/ansi/bbs/colonels.ans\nhttp://artscene.textfiles.com/ansi/bbs/conf-1.ans\nhttp://artscene.textfiles.com/ansi/bbs/conf-2.ans\nhttp://artscene.textfiles.com/ansi/bbs/conf.ans\nhttp://artscene.textfiles.com/ansi/bbs/confman.ans\nhttp://artscene.textfiles.com/ansi/bbs/confscr.ans\nhttp://artscene.textfiles.com/ansi/bbs/crainiul.ans\nhttp://artscene.textfiles.com/ansi/bbs/cv.ans\nhttp://artscene.textfiles.com/ansi/bbs/dark1.ans\nhttp://artscene.textfiles.com/ansi/bbs/darkr04.ans\nhttp://artscene.textfiles.com/ansi/bbs/darkside.ans\nhttp://artscene.textfiles.com/ansi/bbs/datacom.ans\nhttp://artscene.textfiles.com/ansi/bbs/dataset.ans\nhttp://artscene.textfiles.com/ansi/bbs/daves.ans\nhttp://artscene.textfiles.com/ansi/bbs/de_ds.ans\nhttp://artscene.textfiles.com/ansi/bbs/de_para.ans\nhttp://artscene.textfiles.com/ansi/bbs/deadend.ans\nhttp://artscene.textfiles.com/ansi/bbs/dean_1.ans\nhttp://artscene.textfiles.com/ansi/bbs/denlogo.ans\nhttp://artscene.textfiles.com/ansi/bbs/desktop.ans\nhttp://artscene.textfiles.com/ansi/bbs/diamond.ans\nhttp://artscene.textfiles.com/ansi/bbs/dibarbbs.ans\nhttp://artscene.textfiles.com/ansi/bbs/digital.ans\nhttp://artscene.textfiles.com/ansi/bbs/dillonew.ans\nhttp://artscene.textfiles.com/ansi/bbs/disclame.ans\nhttp://artscene.textfiles.com/ansi/bbs/discover.ans\nhttp://artscene.textfiles.com/ansi/bbs/diskdriv.ans\nhttp://artscene.textfiles.com/ansi/bbs/diving.ans\nhttp://artscene.textfiles.com/ansi/bbs/djm.ans\nhttp://artscene.textfiles.com/ansi/bbs/dm-illn.ans\nhttp://artscene.textfiles.com/ansi/bbs/dn-ill.ans\nhttp://artscene.textfiles.com/ansi/bbs/dngeons.ans\nhttp://artscene.textfiles.com/ansi/bbs/dog_hbbs.ans\nhttp://artscene.textfiles.com/ansi/bbs/dominion.ans\nhttp://artscene.textfiles.com/ansi/bbs/doorext.ans\nhttp://artscene.textfiles.com/ansi/bbs/doors3.ans\nhttp://artscene.textfiles.com/ansi/bbs/dosaurdn.ans\nhttp://artscene.textfiles.com/ansi/bbs/downundr.ans\nhttp://artscene.textfiles.com/ansi/bbs/drawbrig.ans\nhttp://artscene.textfiles.com/ansi/bbs/duffer01.ans\nhttp://artscene.textfiles.com/ansi/bbs/duffer02.ans\nhttp://artscene.textfiles.com/ansi/bbs/dwrld.ans\nhttp://artscene.textfiles.com/ansi/bbs/dzprt3.ans\nhttp://artscene.textfiles.com/ansi/bbs/email.ans\nhttp://artscene.textfiles.com/ansi/bbs/email1.ans\nhttp://artscene.textfiles.com/ansi/bbs/email10.ans\nhttp://artscene.textfiles.com/ansi/bbs/email11.ans\nhttp://artscene.textfiles.com/ansi/bbs/email12.ans\nhttp://artscene.textfiles.com/ansi/bbs/email2.ans\nhttp://artscene.textfiles.com/ansi/bbs/email3.ans\nhttp://artscene.textfiles.com/ansi/bbs/email4.ans\nhttp://artscene.textfiles.com/ansi/bbs/email5.ans\nhttp://artscene.textfiles.com/ansi/bbs/email6.ans\nhttp://artscene.textfiles.com/ansi/bbs/email7.ans\nhttp://artscene.textfiles.com/ansi/bbs/email8.ans\nhttp://artscene.textfiles.com/ansi/bbs/email9.ans\nhttp://artscene.textfiles.com/ansi/bbs/emnu.ans\nhttp://artscene.textfiles.com/ansi/bbs/emnult1.ans\nhttp://artscene.textfiles.com/ansi/bbs/emnult2.ans\nhttp://artscene.textfiles.com/ansi/bbs/emnult3.ans\nhttp://artscene.textfiles.com/ansi/bbs/emnult4.ans\nhttp://artscene.textfiles.com/ansi/bbs/emnurt1.ans\nhttp://artscene.textfiles.com/ansi/bbs/emnurt2.ans\nhttp://artscene.textfiles.com/ansi/bbs/emnurt3.ans\nhttp://artscene.textfiles.com/ansi/bbs/emnurt4.ans\nhttp://artscene.textfiles.com/ansi/bbs/end.ans\nhttp://artscene.textfiles.com/ansi/bbs/enter1.ans\nhttp://artscene.textfiles.com/ansi/bbs/enter2.ans\nhttp://artscene.textfiles.com/ansi/bbs/enter3.ans\nhttp://artscene.textfiles.com/ansi/bbs/essence.ans\nhttp://artscene.textfiles.com/ansi/bbs/feed1.ans\nhttp://artscene.textfiles.com/ansi/bbs/feed10.ans\nhttp://artscene.textfiles.com/ansi/bbs/feed11.ans\nhttp://artscene.textfiles.com/ansi/bbs/feed12.ans\nhttp://artscene.textfiles.com/ansi/bbs/feed2.ans\nhttp://artscene.textfiles.com/ansi/bbs/feed3.ans\nhttp://artscene.textfiles.com/ansi/bbs/feed4.ans\nhttp://artscene.textfiles.com/ansi/bbs/feed5.ans\nhttp://artscene.textfiles.com/ansi/bbs/feed6.ans\nhttp://artscene.textfiles.com/ansi/bbs/feed7.ans\nhttp://artscene.textfiles.com/ansi/bbs/feed8.ans\nhttp://artscene.textfiles.com/ansi/bbs/feed9.ans\nhttp://artscene.textfiles.com/ansi/bbs/fext20.ans\nhttp://artscene.textfiles.com/ansi/bbs/fheader.ans\nhttp://artscene.textfiles.com/ansi/bbs/fibbs_1.ans\nhttp://artscene.textfiles.com/ansi/bbs/fibbs_2.ans\nhttp://artscene.textfiles.com/ansi/bbs/fibbs_3.ans\nhttp://artscene.textfiles.com/ansi/bbs/file.ans\nhttp://artscene.textfiles.com/ansi/bbs/file1.ans\nhttp://artscene.textfiles.com/ansi/bbs/file10.ans\nhttp://artscene.textfiles.com/ansi/bbs/file11.ans\nhttp://artscene.textfiles.com/ansi/bbs/file12.ans\nhttp://artscene.textfiles.com/ansi/bbs/file120.ans\nhttp://artscene.textfiles.com/ansi/bbs/file2.ans\nhttp://artscene.textfiles.com/ansi/bbs/file3.ans\nhttp://artscene.textfiles.com/ansi/bbs/file4.ans\nhttp://artscene.textfiles.com/ansi/bbs/file40.ans\nhttp://artscene.textfiles.com/ansi/bbs/file5.ans\nhttp://artscene.textfiles.com/ansi/bbs/file6.ans\nhttp://artscene.textfiles.com/ansi/bbs/file7.ans\nhttp://artscene.textfiles.com/ansi/bbs/file8.ans\nhttp://artscene.textfiles.com/ansi/bbs/file9.ans\nhttp://artscene.textfiles.com/ansi/bbs/file900.ans\nhttp://artscene.textfiles.com/ansi/bbs/file999.ans\nhttp://artscene.textfiles.com/ansi/bbs/filehogs.ans\nhttp://artscene.textfiles.com/ansi/bbs/filem.ans\nhttp://artscene.textfiles.com/ansi/bbs/files1.ans\nhttp://artscene.textfiles.com/ansi/bbs/filescan.ans\nhttp://artscene.textfiles.com/ansi/bbs/fileshop.ans\nhttp://artscene.textfiles.com/ansi/bbs/filestat.ans\nhttp://artscene.textfiles.com/ansi/bbs/filst25.ans\nhttp://artscene.textfiles.com/ansi/bbs/filst900.ans\nhttp://artscene.textfiles.com/ansi/bbs/financal.ans\nhttp://artscene.textfiles.com/ansi/bbs/firenet.ans\nhttp://artscene.textfiles.com/ansi/bbs/fl-ill1.ans\nhttp://artscene.textfiles.com/ansi/bbs/flag_2.ans\nhttp://artscene.textfiles.com/ansi/bbs/flagbye.ans\nhttp://artscene.textfiles.com/ansi/bbs/football.ans\nhttp://artscene.textfiles.com/ansi/bbs/footer.ans\nhttp://artscene.textfiles.com/ansi/bbs/format.ans\nhttp://artscene.textfiles.com/ansi/bbs/formats.ans\nhttp://artscene.textfiles.com/ansi/bbs/friday13.ans\nhttp://artscene.textfiles.com/ansi/bbs/fuckdata.ans\nhttp://artscene.textfiles.com/ansi/bbs/fullscr1.ans\nhttp://artscene.textfiles.com/ansi/bbs/futmoon.ans\nhttp://artscene.textfiles.com/ansi/bbs/gb-1l.ans\nhttp://artscene.textfiles.com/ansi/bbs/gb-1r.ans\nhttp://artscene.textfiles.com/ansi/bbs/gb-2l.ans\nhttp://artscene.textfiles.com/ansi/bbs/gb-2r.ans\nhttp://artscene.textfiles.com/ansi/bbs/gb-3l.ans\nhttp://artscene.textfiles.com/ansi/bbs/gb-3r.ans\nhttp://artscene.textfiles.com/ansi/bbs/gb-4l.ans\nhttp://artscene.textfiles.com/ansi/bbs/gb-4r.ans\nhttp://artscene.textfiles.com/ansi/bbs/gg-room.ans\nhttp://artscene.textfiles.com/ansi/bbs/goodbye.ans\nhttp://artscene.textfiles.com/ansi/bbs/goodbye1.ans\nhttp://artscene.textfiles.com/ansi/bbs/goodbye2.ans\nhttp://artscene.textfiles.com/ansi/bbs/goodbye3.ans\nhttp://artscene.textfiles.com/ansi/bbs/goodbye4.ans\nhttp://artscene.textfiles.com/ansi/bbs/goodbyea.ans\nhttp://artscene.textfiles.com/ansi/bbs/hackers.ans\nhttp://artscene.textfiles.com/ansi/bbs/halowen1.ans\nhttp://artscene.textfiles.com/ansi/bbs/handle.ans\nhttp://artscene.textfiles.com/ansi/bbs/harm.ans\nhttp://artscene.textfiles.com/ansi/bbs/hatching.ans\nhttp://artscene.textfiles.com/ansi/bbs/hcountry.ans\nhttp://artscene.textfiles.com/ansi/bbs/hdr.ans\nhttp://artscene.textfiles.com/ansi/bbs/header.ans\nhttp://artscene.textfiles.com/ansi/bbs/hearts.ans\nhttp://artscene.textfiles.com/ansi/bbs/heckofit.ans\nhttp://artscene.textfiles.com/ansi/bbs/heidi.ans\nhttp://artscene.textfiles.com/ansi/bbs/hell.ans\nhttp://artscene.textfiles.com/ansi/bbs/hell01.ans\nhttp://artscene.textfiles.com/ansi/bbs/helloc3.ans\nhttp://artscene.textfiles.com/ansi/bbs/helloc4.ans\nhttp://artscene.textfiles.com/ansi/bbs/helloc5.ans\nhttp://artscene.textfiles.com/ansi/bbs/helpsal.ans\nhttp://artscene.textfiles.com/ansi/bbs/helpsal2.ans\nhttp://artscene.textfiles.com/ansi/bbs/heros.ans\nhttp://artscene.textfiles.com/ansi/bbs/hh02.ans\nhttp://artscene.textfiles.com/ansi/bbs/hh03.ans\nhttp://artscene.textfiles.com/ansi/bbs/hh04.ans\nhttp://artscene.textfiles.com/ansi/bbs/hh1.ans\nhttp://artscene.textfiles.com/ansi/bbs/hidd1.ans\nhttp://artscene.textfiles.com/ansi/bbs/hidd2.ans\nhttp://artscene.textfiles.com/ansi/bbs/highway.ans\nhttp://artscene.textfiles.com/ansi/bbs/hill.ans\nhttp://artscene.textfiles.com/ansi/bbs/holistic.ans\nhttp://artscene.textfiles.com/ansi/bbs/homedba.ans\nhttp://artscene.textfiles.com/ansi/bbs/hr-awol.ans\nhttp://artscene.textfiles.com/ansi/bbs/hub.ans\nhttp://artscene.textfiles.com/ansi/bbs/hvd_card.ans\nhttp://artscene.textfiles.com/ansi/bbs/hydr1.ans\nhttp://artscene.textfiles.com/ansi/bbs/hydro01.ans\nhttp://artscene.textfiles.com/ansi/bbs/hydro02.ans\nhttp://artscene.textfiles.com/ansi/bbs/illness4.ans\nhttp://artscene.textfiles.com/ansi/bbs/illnfo.ans\nhttp://artscene.textfiles.com/ansi/bbs/illnmem.ans\nhttp://artscene.textfiles.com/ansi/bbs/innrchrs.ans\nhttp://artscene.textfiles.com/ansi/bbs/j_woolf.ans\nhttp://artscene.textfiles.com/ansi/bbs/jason.ans\nhttp://artscene.textfiles.com/ansi/bbs/jason5.ans\nhttp://artscene.textfiles.com/ansi/bbs/jeff3.ans\nhttp://artscene.textfiles.com/ansi/bbs/jeff4.ans\nhttp://artscene.textfiles.com/ansi/bbs/jeff6.ans\nhttp://artscene.textfiles.com/ansi/bbs/jeffmurf.ans\nhttp://artscene.textfiles.com/ansi/bbs/jerrys.ans\nhttp://artscene.textfiles.com/ansi/bbs/jesters.ans\nhttp://artscene.textfiles.com/ansi/bbs/jimnet.ans\nhttp://artscene.textfiles.com/ansi/bbs/jims.ans\nhttp://artscene.textfiles.com/ansi/bbs/jivesoda.ans\nhttp://artscene.textfiles.com/ansi/bbs/joe.ans\nhttp://artscene.textfiles.com/ansi/bbs/joebobs.ans\nhttp://artscene.textfiles.com/ansi/bbs/joeseats.ans\nhttp://artscene.textfiles.com/ansi/bbs/joeys.ans\nhttp://artscene.textfiles.com/ansi/bbs/johnshop.ans\nhttp://artscene.textfiles.com/ansi/bbs/jokeem.ans\nhttp://artscene.textfiles.com/ansi/bbs/jollyrog.ans\nhttp://artscene.textfiles.com/ansi/bbs/juda.ans\nhttp://artscene.textfiles.com/ansi/bbs/juda2.ans\nhttp://artscene.textfiles.com/ansi/bbs/jumpstar.ans\nhttp://artscene.textfiles.com/ansi/bbs/junkyard.ans\nhttp://artscene.textfiles.com/ansi/bbs/keeping.ans\nhttp://artscene.textfiles.com/ansi/bbs/kevskorn.ans\nhttp://artscene.textfiles.com/ansi/bbs/kickass.ans\nhttp://artscene.textfiles.com/ansi/bbs/killeen.ans\nhttp://artscene.textfiles.com/ansi/bbs/kingsval.ans\nhttp://artscene.textfiles.com/ansi/bbs/kitty.ans\nhttp://artscene.textfiles.com/ansi/bbs/kmark.ans\nhttp://artscene.textfiles.com/ansi/bbs/kolkon2.ans\nhttp://artscene.textfiles.com/ansi/bbs/kollkonn.ans\nhttp://artscene.textfiles.com/ansi/bbs/kt-ill.ans\nhttp://artscene.textfiles.com/ansi/bbs/kt-vital.ans\nhttp://artscene.textfiles.com/ansi/bbs/ku-ill1.ans\nhttp://artscene.textfiles.com/ansi/bbs/kwvs.ans\nhttp://artscene.textfiles.com/ansi/bbs/l1a.ans\nhttp://artscene.textfiles.com/ansi/bbs/l2a.ans\nhttp://artscene.textfiles.com/ansi/bbs/l3a.ans\nhttp://artscene.textfiles.com/ansi/bbs/l4a.ans\nhttp://artscene.textfiles.com/ansi/bbs/l5a.ans\nhttp://artscene.textfiles.com/ansi/bbs/lacebbs.ans\nhttp://artscene.textfiles.com/ansi/bbs/ladder.ans\nhttp://artscene.textfiles.com/ansi/bbs/lair.ans\nhttp://artscene.textfiles.com/ansi/bbs/laketown.ans\nhttp://artscene.textfiles.com/ansi/bbs/larrys.ans\nhttp://artscene.textfiles.com/ansi/bbs/ld-ill1.ans\nhttp://artscene.textfiles.com/ansi/bbs/ld-ill2.ans\nhttp://artscene.textfiles.com/ansi/bbs/ld-ill3.ans\nhttp://artscene.textfiles.com/ansi/bbs/ld-ill5.ans\nhttp://artscene.textfiles.com/ansi/bbs/ld-para1.ans\nhttp://artscene.textfiles.com/ansi/bbs/lden.ans\nhttp://artscene.textfiles.com/ansi/bbs/lehman.ans\nhttp://artscene.textfiles.com/ansi/bbs/lethbrig.ans\nhttp://artscene.textfiles.com/ansi/bbs/lgn.ans\nhttp://artscene.textfiles.com/ansi/bbs/lhouse.ans\nhttp://artscene.textfiles.com/ansi/bbs/lhouse3.ans\nhttp://artscene.textfiles.com/ansi/bbs/lhouse4.ans\nhttp://artscene.textfiles.com/ansi/bbs/liberty.ans\nhttp://artscene.textfiles.com/ansi/bbs/library.ans\nhttp://artscene.textfiles.com/ansi/bbs/likehom2.ans\nhttp://artscene.textfiles.com/ansi/bbs/likehome.ans\nhttp://artscene.textfiles.com/ansi/bbs/lionsden.ans\nhttp://artscene.textfiles.com/ansi/bbs/livonvid.ans\nhttp://artscene.textfiles.com/ansi/bbs/lizards.ans\nhttp://artscene.textfiles.com/ansi/bbs/lmesadd.ans\nhttp://artscene.textfiles.com/ansi/bbs/lmesshow.ans\nhttp://artscene.textfiles.com/ansi/bbs/lnans21.ans\nhttp://artscene.textfiles.com/ansi/bbs/lnans32.ans\nhttp://artscene.textfiles.com/ansi/bbs/lnans82.ans\nhttp://artscene.textfiles.com/ansi/bbs/lockshop.ans\nhttp://artscene.textfiles.com/ansi/bbs/loginn.ans\nhttp://artscene.textfiles.com/ansi/bbs/logon1.ans\nhttp://artscene.textfiles.com/ansi/bbs/logon2.ans\nhttp://artscene.textfiles.com/ansi/bbs/logon3.ans\nhttp://artscene.textfiles.com/ansi/bbs/logon4.ans\nhttp://artscene.textfiles.com/ansi/bbs/londonun.ans\nhttp://artscene.textfiles.com/ansi/bbs/lonetree.ans\nhttp://artscene.textfiles.com/ansi/bbs/longleaf.ans\nhttp://artscene.textfiles.com/ansi/bbs/lookat1.ans\nhttp://artscene.textfiles.com/ansi/bbs/lookat2.ans\nhttp://artscene.textfiles.com/ansi/bbs/lost.ans\nhttp://artscene.textfiles.com/ansi/bbs/lovbelov.ans\nhttp://artscene.textfiles.com/ansi/bbs/lv-ill1.ans\nhttp://artscene.textfiles.com/ansi/bbs/lwfangel.ans\nhttp://artscene.textfiles.com/ansi/bbs/machine.ans\nhttp://artscene.textfiles.com/ansi/bbs/maddogs.ans\nhttp://artscene.textfiles.com/ansi/bbs/madhater.ans\nhttp://artscene.textfiles.com/ansi/bbs/mailcall.ans\nhttp://artscene.textfiles.com/ansi/bbs/main.ans\nhttp://artscene.textfiles.com/ansi/bbs/main1.ans\nhttp://artscene.textfiles.com/ansi/bbs/main10.ans\nhttp://artscene.textfiles.com/ansi/bbs/main11.ans\nhttp://artscene.textfiles.com/ansi/bbs/main12.ans\nhttp://artscene.textfiles.com/ansi/bbs/main2.ans\nhttp://artscene.textfiles.com/ansi/bbs/main3.ans\nhttp://artscene.textfiles.com/ansi/bbs/main4.ans\nhttp://artscene.textfiles.com/ansi/bbs/main5.ans\nhttp://artscene.textfiles.com/ansi/bbs/main6.ans\nhttp://artscene.textfiles.com/ansi/bbs/main7.ans\nhttp://artscene.textfiles.com/ansi/bbs/main8.ans\nhttp://artscene.textfiles.com/ansi/bbs/main9.ans\nhttp://artscene.textfiles.com/ansi/bbs/marksrom.ans\nhttp://artscene.textfiles.com/ansi/bbs/martins.ans\nhttp://artscene.textfiles.com/ansi/bbs/maskit.ans\nhttp://artscene.textfiles.com/ansi/bbs/matrix-1.ans\nhttp://artscene.textfiles.com/ansi/bbs/matrix-2.ans\nhttp://artscene.textfiles.com/ansi/bbs/matrix-3.ans\nhttp://artscene.textfiles.com/ansi/bbs/matrix-4.ans\nhttp://artscene.textfiles.com/ansi/bbs/matrix-5.ans\nhttp://artscene.textfiles.com/ansi/bbs/matrix-6.ans\nhttp://artscene.textfiles.com/ansi/bbs/matrix1.ans\nhttp://artscene.textfiles.com/ansi/bbs/matrix10.ans\nhttp://artscene.textfiles.com/ansi/bbs/matrix2.ans\nhttp://artscene.textfiles.com/ansi/bbs/matrix3.ans\nhttp://artscene.textfiles.com/ansi/bbs/matrix4.ans\nhttp://artscene.textfiles.com/ansi/bbs/matrix5.ans\nhttp://artscene.textfiles.com/ansi/bbs/matrix6.ans\nhttp://artscene.textfiles.com/ansi/bbs/matrix7.ans\nhttp://artscene.textfiles.com/ansi/bbs/matrix8.ans\nhttp://artscene.textfiles.com/ansi/bbs/matrix9.ans\nhttp://artscene.textfiles.com/ansi/bbs/maxsdogh.ans\nhttp://artscene.textfiles.com/ansi/bbs/maze.ans\nhttp://artscene.textfiles.com/ansi/bbs/mcscotts.ans\nhttp://artscene.textfiles.com/ansi/bbs/md-lof1.ans\nhttp://artscene.textfiles.com/ansi/bbs/md-mmh1.ans\nhttp://artscene.textfiles.com/ansi/bbs/md-pr2.ans\nhttp://artscene.textfiles.com/ansi/bbs/mdistro2.ans\nhttp://artscene.textfiles.com/ansi/bbs/mechanic.ans\nhttp://artscene.textfiles.com/ansi/bbs/median.ans\nhttp://artscene.textfiles.com/ansi/bbs/meltzer.ans\nhttp://artscene.textfiles.com/ansi/bbs/menace.ans\nhttp://artscene.textfiles.com/ansi/bbs/menucmd.ans\nhttp://artscene.textfiles.com/ansi/bbs/menuinfo.ans\nhttp://artscene.textfiles.com/ansi/bbs/meow.ans\nhttp://artscene.textfiles.com/ansi/bbs/message.ans\nhttp://artscene.textfiles.com/ansi/bbs/messpon.ans\nhttp://artscene.textfiles.com/ansi/bbs/middle.ans\nhttp://artscene.textfiles.com/ansi/bbs/mindtalk.ans\nhttp://artscene.textfiles.com/ansi/bbs/mirror.ans\nhttp://artscene.textfiles.com/ansi/bbs/modem.ans\nhttp://artscene.textfiles.com/ansi/bbs/mog-tfad.ans\nhttp://artscene.textfiles.com/ansi/bbs/mogland.ans\nhttp://artscene.textfiles.com/ansi/bbs/moonwalk.ans\nhttp://artscene.textfiles.com/ansi/bbs/msg.ans\nhttp://artscene.textfiles.com/ansi/bbs/msg1.ans\nhttp://artscene.textfiles.com/ansi/bbs/msg10.ans\nhttp://artscene.textfiles.com/ansi/bbs/msg11.ans\nhttp://artscene.textfiles.com/ansi/bbs/msg12.ans\nhttp://artscene.textfiles.com/ansi/bbs/msg2.ans\nhttp://artscene.textfiles.com/ansi/bbs/msg3.ans\nhttp://artscene.textfiles.com/ansi/bbs/msg4.ans\nhttp://artscene.textfiles.com/ansi/bbs/msg5.ans\nhttp://artscene.textfiles.com/ansi/bbs/msg6.ans\nhttp://artscene.textfiles.com/ansi/bbs/msg7.ans\nhttp://artscene.textfiles.com/ansi/bbs/msg8.ans\nhttp://artscene.textfiles.com/ansi/bbs/msg9.ans\nhttp://artscene.textfiles.com/ansi/bbs/mstat.ans\nhttp://artscene.textfiles.com/ansi/bbs/multinod.ans\nhttp://artscene.textfiles.com/ansi/bbs/name.ans\nhttp://artscene.textfiles.com/ansi/bbs/new1.ans\nhttp://artscene.textfiles.com/ansi/bbs/new10.ans\nhttp://artscene.textfiles.com/ansi/bbs/new11.ans\nhttp://artscene.textfiles.com/ansi/bbs/new12.ans\nhttp://artscene.textfiles.com/ansi/bbs/new2.ans\nhttp://artscene.textfiles.com/ansi/bbs/new3.ans\nhttp://artscene.textfiles.com/ansi/bbs/new4.ans\nhttp://artscene.textfiles.com/ansi/bbs/new5.ans\nhttp://artscene.textfiles.com/ansi/bbs/new6.ans\nhttp://artscene.textfiles.com/ansi/bbs/new7.ans\nhttp://artscene.textfiles.com/ansi/bbs/new8.ans\nhttp://artscene.textfiles.com/ansi/bbs/new9.ans\nhttp://artscene.textfiles.com/ansi/bbs/newend.ans\nhttp://artscene.textfiles.com/ansi/bbs/newmid.ans\nhttp://artscene.textfiles.com/ansi/bbs/news.ans\nhttp://artscene.textfiles.com/ansi/bbs/newsrt.ans\nhttp://artscene.textfiles.com/ansi/bbs/nuvmenu.ans\nhttp://artscene.textfiles.com/ansi/bbs/nuvpic.ans\nhttp://artscene.textfiles.com/ansi/bbs/obvhead.ans\nhttp://artscene.textfiles.com/ansi/bbs/offlne1.ans\nhttp://artscene.textfiles.com/ansi/bbs/offlne10.ans\nhttp://artscene.textfiles.com/ansi/bbs/offlne11.ans\nhttp://artscene.textfiles.com/ansi/bbs/offlne12.ans\nhttp://artscene.textfiles.com/ansi/bbs/offlne2.ans\nhttp://artscene.textfiles.com/ansi/bbs/offlne3.ans\nhttp://artscene.textfiles.com/ansi/bbs/offlne4.ans\nhttp://artscene.textfiles.com/ansi/bbs/offlne5.ans\nhttp://artscene.textfiles.com/ansi/bbs/offlne6.ans\nhttp://artscene.textfiles.com/ansi/bbs/offlne7.ans\nhttp://artscene.textfiles.com/ansi/bbs/offlne8.ans\nhttp://artscene.textfiles.com/ansi/bbs/offlne9.ans\nhttp://artscene.textfiles.com/ansi/bbs/online.ans\nhttp://artscene.textfiles.com/ansi/bbs/online1.ans\nhttp://artscene.textfiles.com/ansi/bbs/online10.ans\nhttp://artscene.textfiles.com/ansi/bbs/online11.ans\nhttp://artscene.textfiles.com/ansi/bbs/online12.ans\nhttp://artscene.textfiles.com/ansi/bbs/online2.ans\nhttp://artscene.textfiles.com/ansi/bbs/online3.ans\nhttp://artscene.textfiles.com/ansi/bbs/online4.ans\nhttp://artscene.textfiles.com/ansi/bbs/online5.ans\nhttp://artscene.textfiles.com/ansi/bbs/online6.ans\nhttp://artscene.textfiles.com/ansi/bbs/online7.ans\nhttp://artscene.textfiles.com/ansi/bbs/online8.ans\nhttp://artscene.textfiles.com/ansi/bbs/online9.ans\nhttp://artscene.textfiles.com/ansi/bbs/openscr.ans\nhttp://artscene.textfiles.com/ansi/bbs/pause.ans\nhttp://artscene.textfiles.com/ansi/bbs/peekaboo.ans\nhttp://artscene.textfiles.com/ansi/bbs/pers1.ans\nhttp://artscene.textfiles.com/ansi/bbs/pers10.ans\nhttp://artscene.textfiles.com/ansi/bbs/pers11.ans\nhttp://artscene.textfiles.com/ansi/bbs/pers12.ans\nhttp://artscene.textfiles.com/ansi/bbs/pers2.ans\nhttp://artscene.textfiles.com/ansi/bbs/pers3.ans\nhttp://artscene.textfiles.com/ansi/bbs/pers4.ans\nhttp://artscene.textfiles.com/ansi/bbs/pers5.ans\nhttp://artscene.textfiles.com/ansi/bbs/pers6.ans\nhttp://artscene.textfiles.com/ansi/bbs/pers7.ans\nhttp://artscene.textfiles.com/ansi/bbs/pers8.ans\nhttp://artscene.textfiles.com/ansi/bbs/pers9.ans\nhttp://artscene.textfiles.com/ansi/bbs/personal.ans\nhttp://artscene.textfiles.com/ansi/bbs/ph-info1.ans\nhttp://artscene.textfiles.com/ansi/bbs/phone.ans\nhttp://artscene.textfiles.com/ansi/bbs/prelogon.ans\nhttp://artscene.textfiles.com/ansi/bbs/ptomega.ans\nhttp://artscene.textfiles.com/ansi/bbs/pulldown.ans\nhttp://artscene.textfiles.com/ansi/bbs/pulldwn.ans\nhttp://artscene.textfiles.com/ansi/bbs/pw.ans\nhttp://artscene.textfiles.com/ansi/bbs/q.ans\nhttp://artscene.textfiles.com/ansi/bbs/quoteftr.ans\nhttp://artscene.textfiles.com/ansi/bbs/quotehdr.ans\nhttp://artscene.textfiles.com/ansi/bbs/qwkmail.ans\nhttp://artscene.textfiles.com/ansi/bbs/rainfacr.ans\nhttp://artscene.textfiles.com/ansi/bbs/rbs.ans\nhttp://artscene.textfiles.com/ansi/bbs/rgarch.ans\nhttp://artscene.textfiles.com/ansi/bbs/rgarch1.ans\nhttp://artscene.textfiles.com/ansi/bbs/rgarch2.ans\nhttp://artscene.textfiles.com/ansi/bbs/rgauto.ans\nhttp://artscene.textfiles.com/ansi/bbs/rgauto1.ans\nhttp://artscene.textfiles.com/ansi/bbs/rgauto2.ans\nhttp://artscene.textfiles.com/ansi/bbs/rgbbsl.ans\nhttp://artscene.textfiles.com/ansi/bbs/rgbbsl1.ans\nhttp://artscene.textfiles.com/ansi/bbs/rgbbsl2.ans\nhttp://artscene.textfiles.com/ansi/bbs/rgbtch.ans\nhttp://artscene.textfiles.com/ansi/bbs/rgbtch1.ans\nhttp://artscene.textfiles.com/ansi/bbs/rgbtch2.ans\nhttp://artscene.textfiles.com/ansi/bbs/rgcosy.ans\nhttp://artscene.textfiles.com/ansi/bbs/rgcosy1.ans\nhttp://artscene.textfiles.com/ansi/bbs/rgcosy2.ans\nhttp://artscene.textfiles.com/ansi/bbs/rgdoor.ans\nhttp://artscene.textfiles.com/ansi/bbs/rgdoor1.ans\nhttp://artscene.textfiles.com/ansi/bbs/rgdoor2.ans\nhttp://artscene.textfiles.com/ansi/bbs/rgfile.ans\nhttp://artscene.textfiles.com/ansi/bbs/rgfile1.ans\nhttp://artscene.textfiles.com/ansi/bbs/rgfile2.ans\nhttp://artscene.textfiles.com/ansi/bbs/rggood.ans\nhttp://artscene.textfiles.com/ansi/bbs/rggood1.ans\nhttp://artscene.textfiles.com/ansi/bbs/rggood2.ans\nhttp://artscene.textfiles.com/ansi/bbs/rgmail.ans\nhttp://artscene.textfiles.com/ansi/bbs/rgmail1.ans\nhttp://artscene.textfiles.com/ansi/bbs/rgmail2.ans\nhttp://artscene.textfiles.com/ansi/bbs/rgmain.ans\nhttp://artscene.textfiles.com/ansi/bbs/rgmain1.ans\nhttp://artscene.textfiles.com/ansi/bbs/rgmain2.ans\nhttp://artscene.textfiles.com/ansi/bbs/rgmesg.ans\nhttp://artscene.textfiles.com/ansi/bbs/rgmesg1.ans\nhttp://artscene.textfiles.com/ansi/bbs/rgmesg2.ans\nhttp://artscene.textfiles.com/ansi/bbs/rgnewi.ans\nhttp://artscene.textfiles.com/ansi/bbs/rgoffl.ans\nhttp://artscene.textfiles.com/ansi/bbs/rgoffl1.ans\nhttp://artscene.textfiles.com/ansi/bbs/rgoffl2.ans\nhttp://artscene.textfiles.com/ansi/bbs/rgpers.ans\nhttp://artscene.textfiles.com/ansi/bbs/rgpers1.ans\nhttp://artscene.textfiles.com/ansi/bbs/rgpers2.ans\nhttp://artscene.textfiles.com/ansi/bbs/rgsysp.ans\nhttp://artscene.textfiles.com/ansi/bbs/rgsysp1.ans\nhttp://artscene.textfiles.com/ansi/bbs/rgsysp2.ans\nhttp://artscene.textfiles.com/ansi/bbs/rgtime.ans\nhttp://artscene.textfiles.com/ansi/bbs/rgtime1.ans\nhttp://artscene.textfiles.com/ansi/bbs/rgtime2.ans\nhttp://artscene.textfiles.com/ansi/bbs/rgvote.ans\nhttp://artscene.textfiles.com/ansi/bbs/rgvote1.ans\nhttp://artscene.textfiles.com/ansi/bbs/rgvote2.ans\nhttp://artscene.textfiles.com/ansi/bbs/ring1991.ans\nhttp://artscene.textfiles.com/ansi/bbs/rumor.ans\nhttp://artscene.textfiles.com/ansi/bbs/rumors.ans\nhttp://artscene.textfiles.com/ansi/bbs/s_greet.ans\nhttp://artscene.textfiles.com/ansi/bbs/sale.ans\nhttp://artscene.textfiles.com/ansi/bbs/saleend.ans\nhttp://artscene.textfiles.com/ansi/bbs/salemid.ans\nhttp://artscene.textfiles.com/ansi/bbs/salesrt.ans\nhttp://artscene.textfiles.com/ansi/bbs/scan1.ans\nhttp://artscene.textfiles.com/ansi/bbs/scan2.ans\nhttp://artscene.textfiles.com/ansi/bbs/sd-coven.ans\nhttp://artscene.textfiles.com/ansi/bbs/sd-dom.ans\nhttp://artscene.textfiles.com/ansi/bbs/sd-dt1.ans\nhttp://artscene.textfiles.com/ansi/bbs/sd-dti.ans\nhttp://artscene.textfiles.com/ansi/bbs/sd-ilcom.ans\nhttp://artscene.textfiles.com/ansi/bbs/sd-red.ans\nhttp://artscene.textfiles.com/ansi/bbs/sd-splts.ans\nhttp://artscene.textfiles.com/ansi/bbs/sd-toons.ans\nhttp://artscene.textfiles.com/ansi/bbs/sd-wolf.ans\nhttp://artscene.textfiles.com/ansi/bbs/sex.ans\nhttp://artscene.textfiles.com/ansi/bbs/shak2.ans\nhttp://artscene.textfiles.com/ansi/bbs/shwnew.ans\nhttp://artscene.textfiles.com/ansi/bbs/sig1.ans\nhttp://artscene.textfiles.com/ansi/bbs/sig2.ans\nhttp://artscene.textfiles.com/ansi/bbs/sothad.ans\nhttp://artscene.textfiles.com/ansi/bbs/stardanc.ans\nhttp://artscene.textfiles.com/ansi/bbs/state.ans\nhttp://artscene.textfiles.com/ansi/bbs/status.ans\nhttp://artscene.textfiles.com/ansi/bbs/street.ans\nhttp://artscene.textfiles.com/ansi/bbs/sunlit.ans\nhttp://artscene.textfiles.com/ansi/bbs/sysop.ans\nhttp://artscene.textfiles.com/ansi/bbs/sysop1.ans\nhttp://artscene.textfiles.com/ansi/bbs/sysop10.ans\nhttp://artscene.textfiles.com/ansi/bbs/sysop11.ans\nhttp://artscene.textfiles.com/ansi/bbs/sysop12.ans\nhttp://artscene.textfiles.com/ansi/bbs/sysop2.ans\nhttp://artscene.textfiles.com/ansi/bbs/sysop3.ans\nhttp://artscene.textfiles.com/ansi/bbs/sysop4.ans\nhttp://artscene.textfiles.com/ansi/bbs/sysop5.ans\nhttp://artscene.textfiles.com/ansi/bbs/sysop6.ans\nhttp://artscene.textfiles.com/ansi/bbs/sysop7.ans\nhttp://artscene.textfiles.com/ansi/bbs/sysop8.ans\nhttp://artscene.textfiles.com/ansi/bbs/sysop9.ans\nhttp://artscene.textfiles.com/ansi/bbs/tc.ans\nhttp://artscene.textfiles.com/ansi/bbs/tdr1c.ans\nhttp://artscene.textfiles.com/ansi/bbs/template.ans\nhttp://artscene.textfiles.com/ansi/bbs/tgws.ans\nhttp://artscene.textfiles.com/ansi/bbs/thebank.ans\nhttp://artscene.textfiles.com/ansi/bbs/time1.ans\nhttp://artscene.textfiles.com/ansi/bbs/time10.ans\nhttp://artscene.textfiles.com/ansi/bbs/time11.ans\nhttp://artscene.textfiles.com/ansi/bbs/time12.ans\nhttp://artscene.textfiles.com/ansi/bbs/time2.ans\nhttp://artscene.textfiles.com/ansi/bbs/time3.ans\nhttp://artscene.textfiles.com/ansi/bbs/time4.ans\nhttp://artscene.textfiles.com/ansi/bbs/time5.ans\nhttp://artscene.textfiles.com/ansi/bbs/time6.ans\nhttp://artscene.textfiles.com/ansi/bbs/time7.ans\nhttp://artscene.textfiles.com/ansi/bbs/time8.ans\nhttp://artscene.textfiles.com/ansi/bbs/time9.ans\nhttp://artscene.textfiles.com/ansi/bbs/tl.ans\nhttp://artscene.textfiles.com/ansi/bbs/to-magik.ans\nhttp://artscene.textfiles.com/ansi/bbs/tol.ans\nhttp://artscene.textfiles.com/ansi/bbs/topgun.ans\nhttp://artscene.textfiles.com/ansi/bbs/tr-illn.ans\nhttp://artscene.textfiles.com/ansi/bbs/tron.ans\nhttp://artscene.textfiles.com/ansi/bbs/tw2.ans\nhttp://artscene.textfiles.com/ansi/bbs/tw_2002.ans\nhttp://artscene.textfiles.com/ansi/bbs/twar2002.ans\nhttp://artscene.textfiles.com/ansi/bbs/twars.ans\nhttp://artscene.textfiles.com/ansi/bbs/ug-ti1.ans\nhttp://artscene.textfiles.com/ansi/bbs/unifntsy.ans\nhttp://artscene.textfiles.com/ansi/bbs/up2.ans\nhttp://artscene.textfiles.com/ansi/bbs/urgent!.ans\nhttp://artscene.textfiles.com/ansi/bbs/userinit.ans\nhttp://artscene.textfiles.com/ansi/bbs/v1.ans\nhttp://artscene.textfiles.com/ansi/bbs/v2.ans\nhttp://artscene.textfiles.com/ansi/bbs/v3.ans\nhttp://artscene.textfiles.com/ansi/bbs/v4.ans\nhttp://artscene.textfiles.com/ansi/bbs/v5.ans\nhttp://artscene.textfiles.com/ansi/bbs/vampire1.ans\nhttp://artscene.textfiles.com/ansi/bbs/vampire2.ans\nhttp://artscene.textfiles.com/ansi/bbs/viking.ans\nhttp://artscene.textfiles.com/ansi/bbs/vip.ans\nhttp://artscene.textfiles.com/ansi/bbs/vital.ans\nhttp://artscene.textfiles.com/ansi/bbs/vn-ill1.ans\nhttp://artscene.textfiles.com/ansi/bbs/vn-illn.ans\nhttp://artscene.textfiles.com/ansi/bbs/void3.ans\nhttp://artscene.textfiles.com/ansi/bbs/void_bs.ans\nhttp://artscene.textfiles.com/ansi/bbs/voidacid.ans\nhttp://artscene.textfiles.com/ansi/bbs/vote1.ans\nhttp://artscene.textfiles.com/ansi/bbs/vote10.ans\nhttp://artscene.textfiles.com/ansi/bbs/vote11.ans\nhttp://artscene.textfiles.com/ansi/bbs/vote12.ans\nhttp://artscene.textfiles.com/ansi/bbs/vote2.ans\nhttp://artscene.textfiles.com/ansi/bbs/vote3.ans\nhttp://artscene.textfiles.com/ansi/bbs/vote4.ans\nhttp://artscene.textfiles.com/ansi/bbs/vote5.ans\nhttp://artscene.textfiles.com/ansi/bbs/vote6.ans\nhttp://artscene.textfiles.com/ansi/bbs/vote7.ans\nhttp://artscene.textfiles.com/ansi/bbs/vote8.ans\nhttp://artscene.textfiles.com/ansi/bbs/vote9.ans\nhttp://artscene.textfiles.com/ansi/bbs/voting.ans\nhttp://artscene.textfiles.com/ansi/bbs/vz-jimi.ans\nhttp://artscene.textfiles.com/ansi/bbs/wc.ans\nhttp://artscene.textfiles.com/ansi/bbs/welcome3.ans\nhttp://artscene.textfiles.com/ansi/bbs/wildcat.ans\nhttp://artscene.textfiles.com/ansi/bbs/wwans60.ans\nhttp://artscene.textfiles.com/ansi/bbs/www.ans\nhttp://artscene.textfiles.com/ansi/bbs/wwwadd.ans\nhttp://artscene.textfiles.com/ansi/bbs/wwwend.ans\nhttp://artscene.textfiles.com/ansi/bbs/wwwmid.ans\nhttp://artscene.textfiles.com/ansi/bbs/wwwshw.ans\nhttp://artscene.textfiles.com/ansi/bbs/wwwsrt.ans\nhttp://artscene.textfiles.com/ansi/bbs/wz-vital.ans\nhttp://artscene.textfiles.com/ansi/bbs/xdus_tcs.ans\nhttp://artscene.textfiles.com/ansi/bbs/xignals.ans\nhttp://artscene.textfiles.com/ansi/bbs/xmas1.ans\nhttp://artscene.textfiles.com/ansi/bbs/xx-info1.ans\nhttp://artscene.textfiles.com/ansi/bbs/year1.ans\nhttp://artscene.textfiles.com/ansi/bbs/year2.ans\nhttp://artscene.textfiles.com/ansi/bbs/year3.ans\nhttp://artscene.textfiles.com/ansi/bbs/yoda.ans\nhttp://artscene.textfiles.com/ansi/welcomes/786welcc.ans\nhttp://artscene.textfiles.com/ansi/welcomes/acad09.ans\nhttp://artscene.textfiles.com/ansi/welcomes/add.ans\nhttp://artscene.textfiles.com/ansi/welcomes/ans_0010.ans\nhttp://artscene.textfiles.com/ansi/welcomes/ans_0011.ans\nhttp://artscene.textfiles.com/ansi/welcomes/ans_0012.ans\nhttp://artscene.textfiles.com/ansi/welcomes/ans_0014.ans\nhttp://artscene.textfiles.com/ansi/welcomes/ans_0017.ans\nhttp://artscene.textfiles.com/ansi/welcomes/ans_0018.ans\nhttp://artscene.textfiles.com/ansi/welcomes/ans_0021.ans\nhttp://artscene.textfiles.com/ansi/welcomes/ans_0022.ans\nhttp://artscene.textfiles.com/ansi/welcomes/ans_0049.ans\nhttp://artscene.textfiles.com/ansi/welcomes/ans_0056.ans\nhttp://artscene.textfiles.com/ansi/welcomes/atlantis.ans\nhttp://artscene.textfiles.com/ansi/welcomes/baby1.ans\nhttp://artscene.textfiles.com/ansi/welcomes/backchan.ans\nhttp://artscene.textfiles.com/ansi/welcomes/backfenc.ans\nhttp://artscene.textfiles.com/ansi/welcomes/badgers.ans\nhttp://artscene.textfiles.com/ansi/welcomes/barister.ans\nhttp://artscene.textfiles.com/ansi/welcomes/batesart.ans\nhttp://artscene.textfiles.com/ansi/welcomes/batwing.ans\nhttp://artscene.textfiles.com/ansi/welcomes/bbnewhat.ans\nhttp://artscene.textfiles.com/ansi/welcomes/bbs.ans\nhttp://artscene.textfiles.com/ansi/welcomes/bbs_town.ans\nhttp://artscene.textfiles.com/ansi/welcomes/bbsadd.ans\nhttp://artscene.textfiles.com/ansi/welcomes/bbsdmo.ans\nhttp://artscene.textfiles.com/ansi/welcomes/bbstown.ans\nhttp://artscene.textfiles.com/ansi/welcomes/bcp1.ans\nhttp://artscene.textfiles.com/ansi/welcomes/bdwalk_m.ans\nhttp://artscene.textfiles.com/ansi/welcomes/beggers.ans\nhttp://artscene.textfiles.com/ansi/welcomes/beta.ans\nhttp://artscene.textfiles.com/ansi/welcomes/biggles.ans\nhttp://artscene.textfiles.com/ansi/welcomes/biggmixx.ans\nhttp://artscene.textfiles.com/ansi/welcomes/billsbd.ans\nhttp://artscene.textfiles.com/ansi/welcomes/blacklit.ans\nhttp://artscene.textfiles.com/ansi/welcomes/board03.ans\nhttp://artscene.textfiles.com/ansi/welcomes/board1.ans\nhttp://artscene.textfiles.com/ansi/welcomes/boat.ans\nhttp://artscene.textfiles.com/ansi/welcomes/boombox.ans\nhttp://artscene.textfiles.com/ansi/welcomes/bordwalk.ans\nhttp://artscene.textfiles.com/ansi/welcomes/brdwalk.ans\nhttp://artscene.textfiles.com/ansi/welcomes/brew.ans\nhttp://artscene.textfiles.com/ansi/welcomes/brigbbs.ans\nhttp://artscene.textfiles.com/ansi/welcomes/brodcast.ans\nhttp://artscene.textfiles.com/ansi/welcomes/brokrose.ans\nhttp://artscene.textfiles.com/ansi/welcomes/brooksie.ans\nhttp://artscene.textfiles.com/ansi/welcomes/buccsden.ans\nhttp://artscene.textfiles.com/ansi/welcomes/buena.ans\nhttp://artscene.textfiles.com/ansi/welcomes/burger.ans\nhttp://artscene.textfiles.com/ansi/welcomes/burger6.ans\nhttp://artscene.textfiles.com/ansi/welcomes/burgerad.ans\nhttp://artscene.textfiles.com/ansi/welcomes/burnwolf.ans\nhttp://artscene.textfiles.com/ansi/welcomes/buterfly.ans\nhttp://artscene.textfiles.com/ansi/welcomes/butrfly.ans\nhttp://artscene.textfiles.com/ansi/welcomes/buttnest.ans\nhttp://artscene.textfiles.com/ansi/welcomes/bwtrek.ans\nhttp://artscene.textfiles.com/ansi/welcomes/byebye.ans\nhttp://artscene.textfiles.com/ansi/welcomes/byto1.ans\nhttp://artscene.textfiles.com/ansi/welcomes/cablecom.ans\nhttp://artscene.textfiles.com/ansi/welcomes/campusg.ans\nhttp://artscene.textfiles.com/ansi/welcomes/cat08c.ans\nhttp://artscene.textfiles.com/ansi/welcomes/certxmas.ans\nhttp://artscene.textfiles.com/ansi/welcomes/channel1.ans\nhttp://artscene.textfiles.com/ansi/welcomes/colbyscr.ans\nhttp://artscene.textfiles.com/ansi/welcomes/computer.ans\nhttp://artscene.textfiles.com/ansi/welcomes/copbye.ans\nhttp://artscene.textfiles.com/ansi/welcomes/cove.ans\nhttp://artscene.textfiles.com/ansi/welcomes/cove2.ans\nhttp://artscene.textfiles.com/ansi/welcomes/critical.ans\nhttp://artscene.textfiles.com/ansi/welcomes/criticl2.ans\nhttp://artscene.textfiles.com/ansi/welcomes/crossrd.ans\nhttp://artscene.textfiles.com/ansi/welcomes/ctsalogo.ans\nhttp://artscene.textfiles.com/ansi/welcomes/cybrpunk.ans\nhttp://artscene.textfiles.com/ansi/welcomes/data.ans\nhttp://artscene.textfiles.com/ansi/welcomes/denlogo.ans\nhttp://artscene.textfiles.com/ansi/welcomes/desantis.ans\nhttp://artscene.textfiles.com/ansi/welcomes/dillo.ans\nhttp://artscene.textfiles.com/ansi/welcomes/dillonew.ans\nhttp://artscene.textfiles.com/ansi/welcomes/diskdriv.ans\nhttp://artscene.textfiles.com/ansi/welcomes/dktower.ans\nhttp://artscene.textfiles.com/ansi/welcomes/draglair.ans\nhttp://artscene.textfiles.com/ansi/welcomes/emporium.ans\nhttp://artscene.textfiles.com/ansi/welcomes/entropy.ans\nhttp://artscene.textfiles.com/ansi/welcomes/epoch.ans\nhttp://artscene.textfiles.com/ansi/welcomes/falcon.ans\nhttp://artscene.textfiles.com/ansi/welcomes/farm01.ans\nhttp://artscene.textfiles.com/ansi/welcomes/farside.ans\nhttp://artscene.textfiles.com/ansi/welcomes/fibbs_1.ans\nhttp://artscene.textfiles.com/ansi/welcomes/fifi1.ans\nhttp://artscene.textfiles.com/ansi/welcomes/filelist.ans\nhttp://artscene.textfiles.com/ansi/welcomes/filexx.ans\nhttp://artscene.textfiles.com/ansi/welcomes/fishing.ans\nhttp://artscene.textfiles.com/ansi/welcomes/fix1.ans\nhttp://artscene.textfiles.com/ansi/welcomes/fla_map.ans\nhttp://artscene.textfiles.com/ansi/welcomes/flight.ans\nhttp://artscene.textfiles.com/ansi/welcomes/flipside.ans\nhttp://artscene.textfiles.com/ansi/welcomes/floppy.ans\nhttp://artscene.textfiles.com/ansi/welcomes/fringe1.ans\nhttp://artscene.textfiles.com/ansi/welcomes/fringe2.ans\nhttp://artscene.textfiles.com/ansi/welcomes/fringe3.ans\nhttp://artscene.textfiles.com/ansi/welcomes/fringe4.ans\nhttp://artscene.textfiles.com/ansi/welcomes/frog01.ans\nhttp://artscene.textfiles.com/ansi/welcomes/frostbbs.ans\nhttp://artscene.textfiles.com/ansi/welcomes/ftruck.ans\nhttp://artscene.textfiles.com/ansi/welcomes/funboard.ans\nhttp://artscene.textfiles.com/ansi/welcomes/gavel10.ans\nhttp://artscene.textfiles.com/ansi/welcomes/gavel14.ans\nhttp://artscene.textfiles.com/ansi/welcomes/gavel15.ans\nhttp://artscene.textfiles.com/ansi/welcomes/gavel16.ans\nhttp://artscene.textfiles.com/ansi/welcomes/gavel17.ans\nhttp://artscene.textfiles.com/ansi/welcomes/gavel18.ans\nhttp://artscene.textfiles.com/ansi/welcomes/gavel20.ans\nhttp://artscene.textfiles.com/ansi/welcomes/gavel29.ans\nhttp://artscene.textfiles.com/ansi/welcomes/gavel31.ans\nhttp://artscene.textfiles.com/ansi/welcomes/gavel32.ans\nhttp://artscene.textfiles.com/ansi/welcomes/gavel33.ans\nhttp://artscene.textfiles.com/ansi/welcomes/gavel35.ans\nhttp://artscene.textfiles.com/ansi/welcomes/gavel36.ans\nhttp://artscene.textfiles.com/ansi/welcomes/gavel38.ans\nhttp://artscene.textfiles.com/ansi/welcomes/gavel40.ans\nhttp://artscene.textfiles.com/ansi/welcomes/gavel49.ans\nhttp://artscene.textfiles.com/ansi/welcomes/gavel50.ans\nhttp://artscene.textfiles.com/ansi/welcomes/gavel61.ans\nhttp://artscene.textfiles.com/ansi/welcomes/gavel62.ans\nhttp://artscene.textfiles.com/ansi/welcomes/gavel63.ans\nhttp://artscene.textfiles.com/ansi/welcomes/gavel67.ans\nhttp://artscene.textfiles.com/ansi/welcomes/gavel73.ans\nhttp://artscene.textfiles.com/ansi/welcomes/gavel82.ans\nhttp://artscene.textfiles.com/ansi/welcomes/gavel86.ans\nhttp://artscene.textfiles.com/ansi/welcomes/gavel87.ans\nhttp://artscene.textfiles.com/ansi/welcomes/gavel88.ans\nhttp://artscene.textfiles.com/ansi/welcomes/hdba1.ans\nhttp://artscene.textfiles.com/ansi/welcomes/hexlogo.ans\nhttp://artscene.textfiles.com/ansi/welcomes/hi.ans\nhttp://artscene.textfiles.com/ansi/welcomes/hotel01.ans\nhttp://artscene.textfiles.com/ansi/welcomes/huntpeck.ans\nhttp://artscene.textfiles.com/ansi/welcomes/jimnet.ans\nhttp://artscene.textfiles.com/ansi/welcomes/jon.ans\nhttp://artscene.textfiles.com/ansi/welcomes/junkyard.ans\nhttp://artscene.textfiles.com/ansi/welcomes/omega.ans\nhttp://artscene.textfiles.com/ansi/welcomes/ourhouse.ans\nhttp://artscene.textfiles.com/ansi/welcomes/pr_uca.ans\nhttp://artscene.textfiles.com/ansi/welcomes/t_chest.ans\nhttp://artscene.textfiles.com/ansi/welcomes/tau.ans\nhttp://artscene.textfiles.com/ansi/welcomes/tbc.ans\nhttp://artscene.textfiles.com/ansi/welcomes/tbcduck.ans\nhttp://artscene.textfiles.com/ansi/welcomes/tdome1.ans\nhttp://artscene.textfiles.com/ansi/welcomes/tdome2.ans\nhttp://artscene.textfiles.com/ansi/welcomes/teleterm.ans\nhttp://artscene.textfiles.com/ansi/welcomes/tempdoom.ans\nhttp://artscene.textfiles.com/ansi/welcomes/tg.ans\nhttp://artscene.textfiles.com/ansi/welcomes/theattic.ans\nhttp://artscene.textfiles.com/ansi/welcomes/thebored.ans\nhttp://artscene.textfiles.com/ansi/welcomes/themorg.ans\nhttp://artscene.textfiles.com/ansi/welcomes/thereef.ans\nhttp://artscene.textfiles.com/ansi/welcomes/thevirus.ans\nhttp://artscene.textfiles.com/ansi/welcomes/thief.ans\nhttp://artscene.textfiles.com/ansi/welcomes/thirst.ans\nhttp://artscene.textfiles.com/ansi/welcomes/throne.ans\nhttp://artscene.textfiles.com/ansi/welcomes/thunderd.ans\nhttp://artscene.textfiles.com/ansi/welcomes/tiffany.ans\nhttp://artscene.textfiles.com/ansi/welcomes/tmap02.ans\nhttp://artscene.textfiles.com/ansi/welcomes/toms.ans\nhttp://artscene.textfiles.com/ansi/welcomes/toolshed.ans\nhttp://artscene.textfiles.com/ansi/welcomes/totem.ans\nhttp://artscene.textfiles.com/ansi/welcomes/touch.ans\nhttp://artscene.textfiles.com/ansi/welcomes/tower.ans\nhttp://artscene.textfiles.com/ansi/welcomes/track.ans\nhttp://artscene.textfiles.com/ansi/welcomes/treffins.ans\nhttp://artscene.textfiles.com/ansi/welcomes/tri_cats.ans\nhttp://artscene.textfiles.com/ansi/welcomes/trs80386.ans\nhttp://artscene.textfiles.com/ansi/welcomes/truck.ans\nhttp://artscene.textfiles.com/ansi/welcomes/tsr1.ans\nhttp://artscene.textfiles.com/ansi/welcomes/tugboat.ans\nhttp://artscene.textfiles.com/ansi/welcomes/tuggbbs.ans\nhttp://artscene.textfiles.com/ansi/welcomes/tugmenu.ans\nhttp://artscene.textfiles.com/ansi/welcomes/tumble.ans\nhttp://artscene.textfiles.com/ansi/welcomes/unbbs.ans\nhttp://artscene.textfiles.com/ansi/welcomes/unicorn.ans\nhttp://artscene.textfiles.com/ansi/welcomes/us-rust.ans\nhttp://artscene.textfiles.com/ansi/welcomes/usr_hst.ans\nhttp://artscene.textfiles.com/ansi/welcomes/vita.ans\nhttp://artscene.textfiles.com/ansi/welcomes/wwans51.ans\nhttp://artscene.textfiles.com/ansi/welcomes/wwans58.ans\nhttp://artscene.textfiles.com/ansi/welcomes/wwans62.ans\nhttp://artscene.textfiles.com/ansi/welcomes/wwans64.ans\nhttp://artscene.textfiles.com/ansi/welcomes/wwans65.ans\nhttp://artscene.textfiles.com/ansi/welcomes/xchange.ans\nhttp://artscene.textfiles.com/ansi/welcomes/xxxtalk.ans\nhttp://artscene.textfiles.com/ansi/holiday/4thjuly.ans\nhttp://artscene.textfiles.com/ansi/holiday/4thjuly3.ans\nhttp://artscene.textfiles.com/ansi/holiday/america.ans\nhttp://artscene.textfiles.com/ansi/holiday/ar_xmas.ans\nhttp://artscene.textfiles.com/ansi/holiday/bapatrot.ans\nhttp://artscene.textfiles.com/ansi/holiday/bells.ans\nhttp://artscene.textfiles.com/ansi/holiday/bestwish.ans\nhttp://artscene.textfiles.com/ansi/holiday/blarney1.ans\nhttp://artscene.textfiles.com/ansi/holiday/blarney2.ans\nhttp://artscene.textfiles.com/ansi/holiday/blarney4.ans\nhttp://artscene.textfiles.com/ansi/holiday/bordwalk.ans\nhttp://artscene.textfiles.com/ansi/holiday/bunny.ans\nhttp://artscene.textfiles.com/ansi/holiday/bunnybkt.ans\nhttp://artscene.textfiles.com/ansi/holiday/buyameri.ans\nhttp://artscene.textfiles.com/ansi/holiday/easter.ans\nhttp://artscene.textfiles.com/ansi/holiday/easter0.ans\nhttp://artscene.textfiles.com/ansi/holiday/easter1.ans\nhttp://artscene.textfiles.com/ansi/holiday/easter2.ans\nhttp://artscene.textfiles.com/ansi/holiday/easter4.ans\nhttp://artscene.textfiles.com/ansi/holiday/easter5.ans\nhttp://artscene.textfiles.com/ansi/holiday/easter90.ans\nhttp://artscene.textfiles.com/ansi/holiday/fathers.ans\nhttp://artscene.textfiles.com/ansi/holiday/fiesta.ans\nhttp://artscene.textfiles.com/ansi/holiday/fiesta91.ans\nhttp://artscene.textfiles.com/ansi/holiday/firework.ans\nhttp://artscene.textfiles.com/ansi/holiday/flag.ans\nhttp://artscene.textfiles.com/ansi/holiday/flagd.ans\nhttp://artscene.textfiles.com/ansi/holiday/flagfly.ans\nhttp://artscene.textfiles.com/ansi/holiday/gavel04.ans\nhttp://artscene.textfiles.com/ansi/holiday/gavel64.ans\nhttp://artscene.textfiles.com/ansi/holiday/gavel72.ans\nhttp://artscene.textfiles.com/ansi/holiday/gavel93.ans\nhttp://artscene.textfiles.com/ansi/holiday/hallow2.ans\nhttp://artscene.textfiles.com/ansi/holiday/haloween.ans\nhttp://artscene.textfiles.com/ansi/holiday/halowen0.ans\nhttp://artscene.textfiles.com/ansi/holiday/halowen2.ans\nhttp://artscene.textfiles.com/ansi/holiday/halowen3.ans\nhttp://artscene.textfiles.com/ansi/holiday/haltool1.ans\nhttp://artscene.textfiles.com/ansi/holiday/happyday.ans\nhttp://artscene.textfiles.com/ansi/holiday/heart.ans\nhttp://artscene.textfiles.com/ansi/holiday/hpstpat.ans\nhttp://artscene.textfiles.com/ansi/holiday/hwxmas92.ans\nhttp://artscene.textfiles.com/ansi/holiday/july.ans\nhttp://artscene.textfiles.com/ansi/holiday/julyfour.ans\nhttp://artscene.textfiles.com/ansi/holiday/lnans33.ans\nhttp://artscene.textfiles.com/ansi/holiday/lnans84.ans\nhttp://artscene.textfiles.com/ansi/holiday/lnans86.ans\nhttp://artscene.textfiles.com/ansi/holiday/texan.ans\nhttp://artscene.textfiles.com/ansi/holiday/tgd_fb.ans\nhttp://artscene.textfiles.com/ansi/holiday/thankgv1.ans\nhttp://artscene.textfiles.com/ansi/holiday/thankgv2.ans\nhttp://artscene.textfiles.com/ansi/holiday/thanks2.ans\nhttp://artscene.textfiles.com/ansi/holiday/thanks3.ans\nhttp://artscene.textfiles.com/ansi/holiday/tree.ans\nhttp://artscene.textfiles.com/ansi/holiday/turkey.ans\nhttp://artscene.textfiles.com/ansi/holiday/usa_flag.ans\nhttp://artscene.textfiles.com/ansi/holiday/usamn.ans\nhttp://artscene.textfiles.com/ansi/holiday/val1.ans\nhttp://artscene.textfiles.com/ansi/holiday/val2.ans\nhttp://artscene.textfiles.com/ansi/holiday/valday91.ans\nhttp://artscene.textfiles.com/ansi/holiday/valentin.ans\nhttp://artscene.textfiles.com/ansi/holiday/valintin.ans\nhttp://artscene.textfiles.com/ansi/holiday/valntine.ans\nhttp://artscene.textfiles.com/ansi/holiday/vday.ans\nhttp://artscene.textfiles.com/ansi/holiday/vday90.ans\nhttp://artscene.textfiles.com/ansi/holiday/voter.ans\nhttp://artscene.textfiles.com/ansi/holiday/wwans53.ans\nhttp://artscene.textfiles.com/ansi/holiday/wwans55.ans\nhttp://artscene.textfiles.com/ansi/holiday/wwans66.ans\nhttp://artscene.textfiles.com/ansi/holiday/xangel.ans\nhttp://artscene.textfiles.com/ansi/holiday/xfrosty.ans\nhttp://artscene.textfiles.com/ansi/holiday/xjesusis.ans\nhttp://artscene.textfiles.com/ansi/holiday/xmas.ans\nhttp://artscene.textfiles.com/ansi/holiday/xmas0001.ans\nhttp://artscene.textfiles.com/ansi/holiday/xmas0002.ans\nhttp://artscene.textfiles.com/ansi/holiday/xmas0003.ans\nhttp://artscene.textfiles.com/ansi/holiday/xmas0004.ans\nhttp://artscene.textfiles.com/ansi/holiday/xmas0005.ans\nhttp://artscene.textfiles.com/ansi/holiday/xmas0006.ans\nhttp://artscene.textfiles.com/ansi/holiday/xmas0007.ans\nhttp://artscene.textfiles.com/ansi/holiday/xmas0008.ans\nhttp://artscene.textfiles.com/ansi/holiday/xmas0009.ans\nhttp://artscene.textfiles.com/ansi/holiday/xmas0010.ans\nhttp://artscene.textfiles.com/ansi/holiday/xmas0011.ans\nhttp://artscene.textfiles.com/ansi/holiday/xmas0012.ans\nhttp://artscene.textfiles.com/ansi/holiday/xmas0013.ans\nhttp://artscene.textfiles.com/ansi/holiday/xmas0014.ans\nhttp://artscene.textfiles.com/ansi/holiday/xmas0015.ans\nhttp://artscene.textfiles.com/ansi/holiday/xmas0016.ans\nhttp://artscene.textfiles.com/ansi/holiday/xmas0017.ans\nhttp://artscene.textfiles.com/ansi/holiday/xmas0018.ans\nhttp://artscene.textfiles.com/ansi/holiday/xmas0019.ans\nhttp://artscene.textfiles.com/ansi/holiday/xmas0020.ans\nhttp://artscene.textfiles.com/ansi/holiday/xmas0021.ans\nhttp://artscene.textfiles.com/ansi/holiday/xmas0022.ans\nhttp://artscene.textfiles.com/ansi/holiday/xmas0023.ans\nhttp://artscene.textfiles.com/ansi/holiday/xmas0024.ans\nhttp://artscene.textfiles.com/ansi/holiday/xmas01.ans\nhttp://artscene.textfiles.com/ansi/holiday/xmas01st.ans\nhttp://artscene.textfiles.com/ansi/holiday/xmas02.ans\nhttp://artscene.textfiles.com/ansi/holiday/xmas03.ans\nhttp://artscene.textfiles.com/ansi/holiday/xmas04.ans\nhttp://artscene.textfiles.com/ansi/holiday/xmas05.ans\nhttp://artscene.textfiles.com/ansi/holiday/xmas06.ans\nhttp://artscene.textfiles.com/ansi/holiday/xmas07.ans\nhttp://artscene.textfiles.com/ansi/holiday/xmas09.ans\nhttp://artscene.textfiles.com/ansi/holiday/xmas10.ans\nhttp://artscene.textfiles.com/ansi/holiday/xmas11.ans\nhttp://artscene.textfiles.com/ansi/holiday/xmas12.ans\nhttp://artscene.textfiles.com/ansi/holiday/xmas13.ans\nhttp://artscene.textfiles.com/ansi/holiday/xmas14.ans\nhttp://artscene.textfiles.com/ansi/holiday/xmas15.ans\nhttp://artscene.textfiles.com/ansi/holiday/xmas16.ans\nhttp://artscene.textfiles.com/ansi/holiday/xmas17.ans\nhttp://artscene.textfiles.com/ansi/holiday/xmas18.ans\nhttp://artscene.textfiles.com/ansi/holiday/xmas19.ans\nhttp://artscene.textfiles.com/ansi/holiday/xmas2.ans\nhttp://artscene.textfiles.com/ansi/holiday/xmas20.ans\nhttp://artscene.textfiles.com/ansi/holiday/xmas21.ans\nhttp://artscene.textfiles.com/ansi/holiday/xmas22.ans\nhttp://artscene.textfiles.com/ansi/holiday/xmas23.ans\nhttp://artscene.textfiles.com/ansi/holiday/xmas2425.ans\nhttp://artscene.textfiles.com/ansi/holiday/xmas26.ans\nhttp://artscene.textfiles.com/ansi/holiday/xmas27.ans\nhttp://artscene.textfiles.com/ansi/holiday/xmas28.ans\nhttp://artscene.textfiles.com/ansi/holiday/xmas29.ans\nhttp://artscene.textfiles.com/ansi/holiday/xmas3.ans\nhttp://artscene.textfiles.com/ansi/holiday/xmas30.ans\nhttp://artscene.textfiles.com/ansi/holiday/xmas31.ans\nhttp://artscene.textfiles.com/ansi/holiday/xmas4.ans\nhttp://artscene.textfiles.com/ansi/holiday/xmas_fun.ans\nhttp://artscene.textfiles.com/ansi/holiday/xmasarnd.ans\nhttp://artscene.textfiles.com/ansi/holiday/xmasb.ans\nhttp://artscene.textfiles.com/ansi/holiday/xmasbuny.ans\nhttp://artscene.textfiles.com/ansi/holiday/xmasc.ans\nhttp://artscene.textfiles.com/ansi/holiday/xmascard.ans\nhttp://artscene.textfiles.com/ansi/holiday/xmase.ans\nhttp://artscene.textfiles.com/ansi/holiday/xmasf.ans\nhttp://artscene.textfiles.com/ansi/holiday/xmasfwks.ans\nhttp://artscene.textfiles.com/ansi/holiday/xmasg.ans\nhttp://artscene.textfiles.com/ansi/holiday/xmash.ans\nhttp://artscene.textfiles.com/ansi/holiday/xmasi.ans\nhttp://artscene.textfiles.com/ansi/holiday/xmasj.ans\nhttp://artscene.textfiles.com/ansi/holiday/xmask.ans\nhttp://artscene.textfiles.com/ansi/holiday/xmasm.ans\nhttp://artscene.textfiles.com/ansi/holiday/xmasn.ans\nhttp://artscene.textfiles.com/ansi/holiday/xmaso.ans\nhttp://artscene.textfiles.com/ansi/holiday/xmasp.ans\nhttp://artscene.textfiles.com/ansi/holiday/xmasq.ans\nhttp://artscene.textfiles.com/ansi/holiday/xmasr.ans\nhttp://artscene.textfiles.com/ansi/holiday/xmass.ans\nhttp://artscene.textfiles.com/ansi/holiday/xmast.ans\nhttp://artscene.textfiles.com/ansi/holiday/xmasu.ans\nhttp://artscene.textfiles.com/ansi/holiday/xmasv.ans\nhttp://artscene.textfiles.com/ansi/holiday/xmasw.ans\nhttp://artscene.textfiles.com/ansi/holiday/xmasy.ans\nhttp://artscene.textfiles.com/ansi/holiday/xmasz.ans\nhttp://artscene.textfiles.com/ansi/holiday/xsanta4.ans\nhttp://artscene.textfiles.com/ansi/holiday/xsleigh.ans\nhttp://artscene.textfiles.com/ansi/logos/101abn.ans\nhttp://artscene.textfiles.com/ansi/logos/1stcav.ans\nhttp://artscene.textfiles.com/ansi/logos/2hello.ans\nhttp://artscene.textfiles.com/ansi/logos/aaaa1.ans\nhttp://artscene.textfiles.com/ansi/logos/aaaa2.ans\nhttp://artscene.textfiles.com/ansi/logos/aaaa3.ans\nhttp://artscene.textfiles.com/ansi/logos/aalogo.ans\nhttp://artscene.textfiles.com/ansi/logos/ac-dc.ans\nhttp://artscene.textfiles.com/ansi/logos/ac-dc2.ans\nhttp://artscene.textfiles.com/ansi/logos/aerosmt3.ans\nhttp://artscene.textfiles.com/ansi/logos/anarchy.ans\nhttp://artscene.textfiles.com/ansi/logos/anthrax.ans\nhttp://artscene.textfiles.com/ansi/logos/arista.ans\nhttp://artscene.textfiles.com/ansi/logos/aristaa.ans\nhttp://artscene.textfiles.com/ansi/logos/asmith.ans\nhttp://artscene.textfiles.com/ansi/logos/atco.ans\nhttp://artscene.textfiles.com/ansi/logos/atl_brvs.ans\nhttp://artscene.textfiles.com/ansi/logos/atlantic.ans\nhttp://artscene.textfiles.com/ansi/logos/bck2futr.ans\nhttp://artscene.textfiles.com/ansi/logos/beatles.ans\nhttp://artscene.textfiles.com/ansi/logos/beyzork.ans\nhttp://artscene.textfiles.com/ansi/logos/bislogo.ans\nhttp://artscene.textfiles.com/ansi/logos/blessing.ans\nhttp://artscene.textfiles.com/ansi/logos/blooming.ans\nhttp://artscene.textfiles.com/ansi/logos/bluetear.ans\nhttp://artscene.textfiles.com/ansi/logos/bobcat.ans\nhttp://artscene.textfiles.com/ansi/logos/boston.ans\nhttp://artscene.textfiles.com/ansi/logos/cancerad.ans\nhttp://artscene.textfiles.com/ansi/logos/cib.ans\nhttp://artscene.textfiles.com/ansi/logos/dallasco.ans\nhttp://artscene.textfiles.com/ansi/logos/dc_1992.ans\nhttp://artscene.textfiles.com/ansi/logos/dleppard.ans\nhttp://artscene.textfiles.com/ansi/logos/dlroth.ans\nhttp://artscene.textfiles.com/ansi/logos/door$.ans\nhttp://artscene.textfiles.com/ansi/logos/dpurple.ans\nhttp://artscene.textfiles.com/ansi/logos/ds_moon.ans\nhttp://artscene.textfiles.com/ansi/logos/flash1.ans\nhttp://artscene.textfiles.com/ansi/logos/flash2.ans\nhttp://artscene.textfiles.com/ansi/logos/flashing.ans\nhttp://artscene.textfiles.com/ansi/logos/frank.ans\nhttp://artscene.textfiles.com/ansi/logos/freed_kw.ans\nhttp://artscene.textfiles.com/ansi/logos/freedom.ans\nhttp://artscene.textfiles.com/ansi/logos/fuct2.ans\nhttp://artscene.textfiles.com/ansi/logos/fyc.ans\nhttp://artscene.textfiles.com/ansi/logos/gavel01.ans\nhttp://artscene.textfiles.com/ansi/logos/gavel66.ans\nhttp://artscene.textfiles.com/ansi/logos/gavel84.ans\nhttp://artscene.textfiles.com/ansi/logos/hr_bad.ans\nhttp://artscene.textfiles.com/ansi/logos/hsa.ans\nhttp://artscene.textfiles.com/ansi/logos/humbledx.ans\nhttp://artscene.textfiles.com/ansi/logos/hustonoi.ans\nhttp://artscene.textfiles.com/ansi/logos/ithoty.ans\nhttp://artscene.textfiles.com/ansi/logos/js-ug1.ans\nhttp://artscene.textfiles.com/ansi/logos/jz-ug.ans\nhttp://artscene.textfiles.com/ansi/logos/lnans31.ans\nhttp://artscene.textfiles.com/ansi/logos/lnans38.ans\nhttp://artscene.textfiles.com/ansi/logos/lnans39.ans\nhttp://artscene.textfiles.com/ansi/logos/lnans80.ans\nhttp://artscene.textfiles.com/ansi/logos/mili-v.ans\nhttp://artscene.textfiles.com/ansi/logos/ods.ans\nhttp://artscene.textfiles.com/ansi/logos/outfield.ans\nhttp://artscene.textfiles.com/ansi/logos/stcomand.ans\nhttp://artscene.textfiles.com/ansi/logos/sttmp.ans\nhttp://artscene.textfiles.com/ansi/logos/sttng.ans\nhttp://artscene.textfiles.com/ansi/logos/sttng2.ans\nhttp://artscene.textfiles.com/ansi/logos/sttng3d.ans\nhttp://artscene.textfiles.com/ansi/logos/sttos.ans\nhttp://artscene.textfiles.com/ansi/logos/timeg.ans\nhttp://artscene.textfiles.com/ansi/logos/tml.ans\nhttp://artscene.textfiles.com/ansi/logos/trinity.ans\nhttp://artscene.textfiles.com/ansi/logos/u2.ans\nhttp://artscene.textfiles.com/ansi/logos/uso_50.ans\nhttp://artscene.textfiles.com/ansi/logos/vanhalen.ans\nhttp://artscene.textfiles.com/ansi/logos/wwans52.ans\nhttp://artscene.textfiles.com/ansi/logos/wwans56.ans\nhttp://artscene.textfiles.com/ansi/logos/yes.ans\nhttp://artscene.textfiles.com/ansi/music/bach12.ans\nhttp://artscene.textfiles.com/ansi/music/bach22.ans\nhttp://artscene.textfiles.com/ansi/music/fourth.ans\nhttp://artscene.textfiles.com/ansi/scene/3t-wow1.ans\nhttp://artscene.textfiles.com/ansi/scene/acid-vn.ans\nhttp://artscene.textfiles.com/ansi/scene/acidlsd2.ans\nhttp://artscene.textfiles.com/ansi/scene/acidzn1.ans\nhttp://artscene.textfiles.com/ansi/scene/am-ice.ans\nhttp://artscene.textfiles.com/ansi/scene/am-tbg1.ans\nhttp://artscene.textfiles.com/ansi/scene/ambrosia.ans\nhttp://artscene.textfiles.com/ansi/scene/ansi1.ans\nhttp://artscene.textfiles.com/ansi/scene/ansi2.ans\nhttp://artscene.textfiles.com/ansi/scene/ansi3.ans\nhttp://artscene.textfiles.com/ansi/scene/ansi4.ans\nhttp://artscene.textfiles.com/ansi/scene/aofacid1.ans\nhttp://artscene.textfiles.com/ansi/scene/arcana.ans\nhttp://artscene.textfiles.com/ansi/scene/asylum.ans\nhttp://artscene.textfiles.com/ansi/scene/automesm.ans\nhttp://artscene.textfiles.com/ansi/scene/b2bacid.ans\nhttp://artscene.textfiles.com/ansi/scene/b_onkelz.ans\nhttp://artscene.textfiles.com/ansi/scene/bbslbot.ans\nhttp://artscene.textfiles.com/ansi/scene/bbslist.ans\nhttp://artscene.textfiles.com/ansi/scene/bbsltop.ans\nhttp://artscene.textfiles.com/ansi/scene/bbstop.ans\nhttp://artscene.textfiles.com/ansi/scene/bcacid2.ans\nhttp://artscene.textfiles.com/ansi/scene/bcacid3.ans\nhttp://artscene.textfiles.com/ansi/scene/bcacid4.ans\nhttp://artscene.textfiles.com/ansi/scene/bcacid6.ans\nhttp://artscene.textfiles.com/ansi/scene/bch1acid.ans\nhttp://artscene.textfiles.com/ansi/scene/bchange.ans\nhttp://artscene.textfiles.com/ansi/scene/bcp.ans\nhttp://artscene.textfiles.com/ansi/scene/bcpacid!.ans\nhttp://artscene.textfiles.com/ansi/scene/beastrip.ans\nhttp://artscene.textfiles.com/ansi/scene/becovert.ans\nhttp://artscene.textfiles.com/ansi/scene/bestansi.ans\nhttp://artscene.textfiles.com/ansi/scene/biggles.ans\nhttp://artscene.textfiles.com/ansi/scene/bigtime.ans\nhttp://artscene.textfiles.com/ansi/scene/bigtime3.ans\nhttp://artscene.textfiles.com/ansi/scene/bigtime4.ans\nhttp://artscene.textfiles.com/ansi/scene/bk&prbad.ans\nhttp://artscene.textfiles.com/ansi/scene/bk_after.ans\nhttp://artscene.textfiles.com/ansi/scene/bk_corro.ans\nhttp://artscene.textfiles.com/ansi/scene/bk_north.ans\nhttp://artscene.textfiles.com/ansi/scene/bk_parad.ans\nhttp://artscene.textfiles.com/ansi/scene/bk_psych.ans\nhttp://artscene.textfiles.com/ansi/scene/bk_unsta.ans\nhttp://artscene.textfiles.com/ansi/scene/blc2acid.ans\nhttp://artscene.textfiles.com/ansi/scene/bmech.ans\nhttp://artscene.textfiles.com/ansi/scene/bog01.ans\nhttp://artscene.textfiles.com/ansi/scene/bog02.ans\nhttp://artscene.textfiles.com/ansi/scene/bog03.ans\nhttp://artscene.textfiles.com/ansi/scene/bog04.ans\nhttp://artscene.textfiles.com/ansi/scene/bot.ans\nhttp://artscene.textfiles.com/ansi/scene/boteel.ans\nhttp://artscene.textfiles.com/ansi/scene/btw.ans\nhttp://artscene.textfiles.com/ansi/scene/bulletm.ans\nhttp://artscene.textfiles.com/ansi/scene/byebye.ans\nhttp://artscene.textfiles.com/ansi/scene/call2112.ans\nhttp://artscene.textfiles.com/ansi/scene/cartel.ans\nhttp://artscene.textfiles.com/ansi/scene/chatdef.ans\nhttp://artscene.textfiles.com/ansi/scene/confman.ans\nhttp://artscene.textfiles.com/ansi/scene/confscr.ans\nhttp://artscene.textfiles.com/ansi/scene/connect.ans\nhttp://artscene.textfiles.com/ansi/scene/daydream.ans\nhttp://artscene.textfiles.com/ansi/scene/de_tribe.ans\nhttp://artscene.textfiles.com/ansi/scene/dzds.ans\nhttp://artscene.textfiles.com/ansi/scene/eoworld.ans\nhttp://artscene.textfiles.com/ansi/scene/evil.ans\nhttp://artscene.textfiles.com/ansi/scene/fantasy.ans\nhttp://artscene.textfiles.com/ansi/scene/fatc1.ans\nhttp://artscene.textfiles.com/ansi/scene/fchangem.ans\nhttp://artscene.textfiles.com/ansi/scene/fconfigs.ans\nhttp://artscene.textfiles.com/ansi/scene/fiad.ans\nhttp://artscene.textfiles.com/ansi/scene/file.ans\nhttp://artscene.textfiles.com/ansi/scene/filem.ans\nhttp://artscene.textfiles.com/ansi/scene/files.ans\nhttp://artscene.textfiles.com/ansi/scene/files0.ans\nhttp://artscene.textfiles.com/ansi/scene/filestat.ans\nhttp://artscene.textfiles.com/ansi/scene/firm01.ans\nhttp://artscene.textfiles.com/ansi/scene/fism2.ans\nhttp://artscene.textfiles.com/ansi/scene/fsponsor.ans\nhttp://artscene.textfiles.com/ansi/scene/gavel02.ans\nhttp://artscene.textfiles.com/ansi/scene/gavel54.ans\nhttp://artscene.textfiles.com/ansi/scene/honus.ans\nhttp://artscene.textfiles.com/ansi/scene/message.ans\nhttp://artscene.textfiles.com/ansi/scene/messpon.ans\nhttp://artscene.textfiles.com/ansi/scene/mm-wtcdg.ans\nhttp://artscene.textfiles.com/ansi/scene/multinod.ans\nhttp://artscene.textfiles.com/ansi/scene/qwkmail.ans\nhttp://artscene.textfiles.com/ansi/scene/rmcrypt.ans\nhttp://artscene.textfiles.com/ansi/scene/rumor.ans\nhttp://artscene.textfiles.com/ansi/scene/rvndl.ans\nhttp://artscene.textfiles.com/ansi/scene/sdata.ans\nhttp://artscene.textfiles.com/ansi/scene/status.ans\nhttp://artscene.textfiles.com/ansi/scene/sysop.ans\nhttp://artscene.textfiles.com/ansi/scene/tcs1.ans\nhttp://artscene.textfiles.com/ansi/scene/td.ans\nhttp://artscene.textfiles.com/ansi/scene/tdr01.ans\nhttp://artscene.textfiles.com/ansi/scene/tdr02.ans\nhttp://artscene.textfiles.com/ansi/scene/thefirm!.ans\nhttp://artscene.textfiles.com/ansi/scene/timelife.ans\nhttp://artscene.textfiles.com/ansi/scene/tmh.ans\nhttp://artscene.textfiles.com/ansi/scene/tmh2.ans\nhttp://artscene.textfiles.com/ansi/scene/tmpl1.ans\nhttp://artscene.textfiles.com/ansi/scene/tno1192.ans\nhttp://artscene.textfiles.com/ansi/scene/ts-tl2yr.ans\nhttp://artscene.textfiles.com/ansi/scene/ttex2.ans\nhttp://artscene.textfiles.com/ansi/scene/tue1.ans\nhttp://artscene.textfiles.com/ansi/scene/tue3.ans\nhttp://artscene.textfiles.com/ansi/scene/ug12logo.ans\nhttp://artscene.textfiles.com/ansi/scene/ug12memb.ans\nhttp://artscene.textfiles.com/ansi/scene/ug12open.ans\nhttp://artscene.textfiles.com/ansi/scene/ulcheck.ans\nhttp://artscene.textfiles.com/ansi/scene/ultstar.ans\nhttp://artscene.textfiles.com/ansi/scene/userstat.ans\nhttp://artscene.textfiles.com/ansi/scene/uva.ans\nhttp://artscene.textfiles.com/ansi/unsorted/1701.ans\nhttp://artscene.textfiles.com/ansi/unsorted/1701a.ans\nhttp://artscene.textfiles.com/ansi/unsorted/1701d.ans\nhttp://artscene.textfiles.com/ansi/unsorted/1701top.ans\nhttp://artscene.textfiles.com/ansi/unsorted/21.ans\nhttp://artscene.textfiles.com/ansi/unsorted/29cents.ans\nhttp://artscene.textfiles.com/ansi/unsorted/2acrisp.ans\nhttp://artscene.textfiles.com/ansi/unsorted/3_d.ans\nhttp://artscene.textfiles.com/ansi/unsorted/3_doodle.ans\nhttp://artscene.textfiles.com/ansi/unsorted/40ishere.ans\nhttp://artscene.textfiles.com/ansi/unsorted/4thjuly1.ans\nhttp://artscene.textfiles.com/ansi/unsorted/4thjuly6.ans\nhttp://artscene.textfiles.com/ansi/unsorted/57chevy.ans\nhttp://artscene.textfiles.com/ansi/unsorted/82ndabn.ans\nhttp://artscene.textfiles.com/ansi/unsorted/a-10.ans\nhttp://artscene.textfiles.com/ansi/unsorted/a_boy.ans\nhttp://artscene.textfiles.com/ansi/unsorted/aatiger.ans\nhttp://artscene.textfiles.com/ansi/unsorted/abst-snr.ans\nhttp://artscene.textfiles.com/ansi/unsorted/abstr2.ans\nhttp://artscene.textfiles.com/ansi/unsorted/abstr3.ans\nhttp://artscene.textfiles.com/ansi/unsorted/abstr4.ans\nhttp://artscene.textfiles.com/ansi/unsorted/abstr5.ans\nhttp://artscene.textfiles.com/ansi/unsorted/abstr6.ans\nhttp://artscene.textfiles.com/ansi/unsorted/abstr7.ans\nhttp://artscene.textfiles.com/ansi/unsorted/abstract.ans\nhttp://artscene.textfiles.com/ansi/unsorted/addbbs.ans\nhttp://artscene.textfiles.com/ansi/unsorted/addone.ans\nhttp://artscene.textfiles.com/ansi/unsorted/addrum.ans\nhttp://artscene.textfiles.com/ansi/unsorted/advice.ans\nhttp://artscene.textfiles.com/ansi/unsorted/aerosmt3.ans\nhttp://artscene.textfiles.com/ansi/unsorted/agama.ans\nhttp://artscene.textfiles.com/ansi/unsorted/agt1.ans\nhttp://artscene.textfiles.com/ansi/unsorted/ah-64.ans\nhttp://artscene.textfiles.com/ansi/unsorted/ahhh!.ans\nhttp://artscene.textfiles.com/ansi/unsorted/alabama.ans\nhttp://artscene.textfiles.com/ansi/unsorted/alarm.ans\nhttp://artscene.textfiles.com/ansi/unsorted/alf6.ans\nhttp://artscene.textfiles.com/ansi/unsorted/alice.ans\nhttp://artscene.textfiles.com/ansi/unsorted/alien.ans\nhttp://artscene.textfiles.com/ansi/unsorted/alien2.ans\nhttp://artscene.textfiles.com/ansi/unsorted/amishbug.ans\nhttp://artscene.textfiles.com/ansi/unsorted/amygrant.ans\nhttp://artscene.textfiles.com/ansi/unsorted/anans13.ans\nhttp://artscene.textfiles.com/ansi/unsorted/anarchy.ans\nhttp://artscene.textfiles.com/ansi/unsorted/angle1.ans\nhttp://artscene.textfiles.com/ansi/unsorted/animated.ans\nhttp://artscene.textfiles.com/ansi/unsorted/ans_0027.ans\nhttp://artscene.textfiles.com/ansi/unsorted/ans_0028.ans\nhttp://artscene.textfiles.com/ansi/unsorted/ans_0029.ans\nhttp://artscene.textfiles.com/ansi/unsorted/ans_0030.ans\nhttp://artscene.textfiles.com/ansi/unsorted/ans_0053.ans\nhttp://artscene.textfiles.com/ansi/unsorted/ans_0057.ans\nhttp://artscene.textfiles.com/ansi/unsorted/ans_0058.ans\nhttp://artscene.textfiles.com/ansi/unsorted/ans_0060.ans\nhttp://artscene.textfiles.com/ansi/unsorted/ansi12.ans\nhttp://artscene.textfiles.com/ansi/unsorted/ansi_art.ans\nhttp://artscene.textfiles.com/ansi/unsorted/ansi_la.ans\nhttp://artscene.textfiles.com/ansi/unsorted/ansiclub.ans\nhttp://artscene.textfiles.com/ansi/unsorted/ansicode.ans\nhttp://artscene.textfiles.com/ansi/unsorted/ansigala.ans\nhttp://artscene.textfiles.com/ansi/unsorted/ansim.ans\nhttp://artscene.textfiles.com/ansi/unsorted/ansistuf.ans\nhttp://artscene.textfiles.com/ansi/unsorted/ansisze1.ans\nhttp://artscene.textfiles.com/ansi/unsorted/ansisze2.ans\nhttp://artscene.textfiles.com/ansi/unsorted/ansituch.ans\nhttp://artscene.textfiles.com/ansi/unsorted/ansmsg1.ans\nhttp://artscene.textfiles.com/ansi/unsorted/ansmsg2.ans\nhttp://artscene.textfiles.com/ansi/unsorted/anthrax.ans\nhttp://artscene.textfiles.com/ansi/unsorted/antics.ans\nhttp://artscene.textfiles.com/ansi/unsorted/anton!.ans\nhttp://artscene.textfiles.com/ansi/unsorted/antrfont.ans\nhttp://artscene.textfiles.com/ansi/unsorted/apcomem.ans\nhttp://artscene.textfiles.com/ansi/unsorted/apollo11.ans\nhttp://artscene.textfiles.com/ansi/unsorted/apple.ans\nhttp://artscene.textfiles.com/ansi/unsorted/areaend.ans\nhttp://artscene.textfiles.com/ansi/unsorted/areamid.ans\nhttp://artscene.textfiles.com/ansi/unsorted/areatop.ans\nhttp://artscene.textfiles.com/ansi/unsorted/arena.ans\nhttp://artscene.textfiles.com/ansi/unsorted/armmount.ans\nhttp://artscene.textfiles.com/ansi/unsorted/arnett.ans\nhttp://artscene.textfiles.com/ansi/unsorted/ascmsg1.ans\nhttp://artscene.textfiles.com/ansi/unsorted/ascmsg2.ans\nhttp://artscene.textfiles.com/ansi/unsorted/aselibbs.ans\nhttp://artscene.textfiles.com/ansi/unsorted/asia.ans\nhttp://artscene.textfiles.com/ansi/unsorted/asp.ans\nhttp://artscene.textfiles.com/ansi/unsorted/athene.ans\nhttp://artscene.textfiles.com/ansi/unsorted/atouch.ans\nhttp://artscene.textfiles.com/ansi/unsorted/attnsys.ans\nhttp://artscene.textfiles.com/ansi/unsorted/australi.ans\nhttp://artscene.textfiles.com/ansi/unsorted/autumn.ans\nhttp://artscene.textfiles.com/ansi/unsorted/availabl.ans\nhttp://artscene.textfiles.com/ansi/unsorted/awol.ans\nhttp://artscene.textfiles.com/ansi/unsorted/awtfall.ans\nhttp://artscene.textfiles.com/ansi/unsorted/b.ans\nhttp://artscene.textfiles.com/ansi/unsorted/b00gfun.ans\nhttp://artscene.textfiles.com/ansi/unsorted/b1.ans\nhttp://artscene.textfiles.com/ansi/unsorted/b12.ans\nhttp://artscene.textfiles.com/ansi/unsorted/b2.ans\nhttp://artscene.textfiles.com/ansi/unsorted/b20.ans\nhttp://artscene.textfiles.com/ansi/unsorted/b24.ans\nhttp://artscene.textfiles.com/ansi/unsorted/b25.ans\nhttp://artscene.textfiles.com/ansi/unsorted/b26.ans\nhttp://artscene.textfiles.com/ansi/unsorted/b27.ans\nhttp://artscene.textfiles.com/ansi/unsorted/b28.ans\nhttp://artscene.textfiles.com/ansi/unsorted/b29.ans\nhttp://artscene.textfiles.com/ansi/unsorted/b3.ans\nhttp://artscene.textfiles.com/ansi/unsorted/b30.ans\nhttp://artscene.textfiles.com/ansi/unsorted/b31.ans\nhttp://artscene.textfiles.com/ansi/unsorted/b32.ans\nhttp://artscene.textfiles.com/ansi/unsorted/b33.ans\nhttp://artscene.textfiles.com/ansi/unsorted/b34.ans\nhttp://artscene.textfiles.com/ansi/unsorted/b35.ans\nhttp://artscene.textfiles.com/ansi/unsorted/b36.ans\nhttp://artscene.textfiles.com/ansi/unsorted/b37.ans\nhttp://artscene.textfiles.com/ansi/unsorted/b38.ans\nhttp://artscene.textfiles.com/ansi/unsorted/b39.ans\nhttp://artscene.textfiles.com/ansi/unsorted/b4.ans\nhttp://artscene.textfiles.com/ansi/unsorted/b40.ans\nhttp://artscene.textfiles.com/ansi/unsorted/b41.ans\nhttp://artscene.textfiles.com/ansi/unsorted/b42.ans\nhttp://artscene.textfiles.com/ansi/unsorted/b43.ans\nhttp://artscene.textfiles.com/ansi/unsorted/b44.ans\nhttp://artscene.textfiles.com/ansi/unsorted/b45.ans\nhttp://artscene.textfiles.com/ansi/unsorted/b46.ans\nhttp://artscene.textfiles.com/ansi/unsorted/b47.ans\nhttp://artscene.textfiles.com/ansi/unsorted/b48.ans\nhttp://artscene.textfiles.com/ansi/unsorted/b49.ans\nhttp://artscene.textfiles.com/ansi/unsorted/b5.ans\nhttp://artscene.textfiles.com/ansi/unsorted/b50.ans\nhttp://artscene.textfiles.com/ansi/unsorted/b51.ans\nhttp://artscene.textfiles.com/ansi/unsorted/b52.ans\nhttp://artscene.textfiles.com/ansi/unsorted/b53.ans\nhttp://artscene.textfiles.com/ansi/unsorted/b54.ans\nhttp://artscene.textfiles.com/ansi/unsorted/b55.ans\nhttp://artscene.textfiles.com/ansi/unsorted/b56.ans\nhttp://artscene.textfiles.com/ansi/unsorted/b57.ans\nhttp://artscene.textfiles.com/ansi/unsorted/b58.ans\nhttp://artscene.textfiles.com/ansi/unsorted/b59.ans\nhttp://artscene.textfiles.com/ansi/unsorted/b6.ans\nhttp://artscene.textfiles.com/ansi/unsorted/b60.ans\nhttp://artscene.textfiles.com/ansi/unsorted/b61.ans\nhttp://artscene.textfiles.com/ansi/unsorted/b62.ans\nhttp://artscene.textfiles.com/ansi/unsorted/b63.ans\nhttp://artscene.textfiles.com/ansi/unsorted/b64.ans\nhttp://artscene.textfiles.com/ansi/unsorted/b65.ans\nhttp://artscene.textfiles.com/ansi/unsorted/b66.ans\nhttp://artscene.textfiles.com/ansi/unsorted/b67.ans\nhttp://artscene.textfiles.com/ansi/unsorted/b68.ans\nhttp://artscene.textfiles.com/ansi/unsorted/b69.ans\nhttp://artscene.textfiles.com/ansi/unsorted/b7.ans\nhttp://artscene.textfiles.com/ansi/unsorted/b70.ans\nhttp://artscene.textfiles.com/ansi/unsorted/b71.ans\nhttp://artscene.textfiles.com/ansi/unsorted/b72.ans\nhttp://artscene.textfiles.com/ansi/unsorted/b73.ans\nhttp://artscene.textfiles.com/ansi/unsorted/b74.ans\nhttp://artscene.textfiles.com/ansi/unsorted/b75.ans\nhttp://artscene.textfiles.com/ansi/unsorted/b76.ans\nhttp://artscene.textfiles.com/ansi/unsorted/b77.ans\nhttp://artscene.textfiles.com/ansi/unsorted/b78.ans\nhttp://artscene.textfiles.com/ansi/unsorted/b79.ans\nhttp://artscene.textfiles.com/ansi/unsorted/b8.ans\nhttp://artscene.textfiles.com/ansi/unsorted/b80.ans\nhttp://artscene.textfiles.com/ansi/unsorted/b81.ans\nhttp://artscene.textfiles.com/ansi/unsorted/b82.ans\nhttp://artscene.textfiles.com/ansi/unsorted/b83.ans\nhttp://artscene.textfiles.com/ansi/unsorted/b84.ans\nhttp://artscene.textfiles.com/ansi/unsorted/b85.ans\nhttp://artscene.textfiles.com/ansi/unsorted/b86.ans\nhttp://artscene.textfiles.com/ansi/unsorted/b87.ans\nhttp://artscene.textfiles.com/ansi/unsorted/b88.ans\nhttp://artscene.textfiles.com/ansi/unsorted/b89.ans\nhttp://artscene.textfiles.com/ansi/unsorted/b9.ans\nhttp://artscene.textfiles.com/ansi/unsorted/b90.ans\nhttp://artscene.textfiles.com/ansi/unsorted/b91.ans\nhttp://artscene.textfiles.com/ansi/unsorted/b92.ans\nhttp://artscene.textfiles.com/ansi/unsorted/b93.ans\nhttp://artscene.textfiles.com/ansi/unsorted/b94.ans\nhttp://artscene.textfiles.com/ansi/unsorted/b95.ans\nhttp://artscene.textfiles.com/ansi/unsorted/b96.ans\nhttp://artscene.textfiles.com/ansi/unsorted/b97.ans\nhttp://artscene.textfiles.com/ansi/unsorted/b98.ans\nhttp://artscene.textfiles.com/ansi/unsorted/b99.ans\nhttp://artscene.textfiles.com/ansi/unsorted/b_idol.ans\nhttp://artscene.textfiles.com/ansi/unsorted/badbaud.ans\nhttp://artscene.textfiles.com/ansi/unsorted/ball.ans\nhttp://artscene.textfiles.com/ansi/unsorted/balloon.ans\nhttp://artscene.textfiles.com/ansi/unsorted/bapatrot.ans\nhttp://artscene.textfiles.com/ansi/unsorted/barfdark.ans\nhttp://artscene.textfiles.com/ansi/unsorted/barney.ans\nhttp://artscene.textfiles.com/ansi/unsorted/bart.ans\nhttp://artscene.textfiles.com/ansi/unsorted/bartman.ans\nhttp://artscene.textfiles.com/ansi/unsorted/baseball.ans\nhttp://artscene.textfiles.com/ansi/unsorted/batchtop.ans\nhttp://artscene.textfiles.com/ansi/unsorted/batesart.ans\nhttp://artscene.textfiles.com/ansi/unsorted/bb.ans\nhttp://artscene.textfiles.com/ansi/unsorted/bbsadd.ans\nhttp://artscene.textfiles.com/ansi/unsorted/bbsbot.ans\nhttp://artscene.textfiles.com/ansi/unsorted/bbsdoors.ans\nhttp://artscene.textfiles.com/ansi/unsorted/bbsend.ans\nhttp://artscene.textfiles.com/ansi/unsorted/bbslistm.ans\nhttp://artscene.textfiles.com/ansi/unsorted/bbsmid.ans\nhttp://artscene.textfiles.com/ansi/unsorted/bbsran.ans\nhttp://artscene.textfiles.com/ansi/unsorted/bbssrt.ans\nhttp://artscene.textfiles.com/ansi/unsorted/bck2futr.ans\nhttp://artscene.textfiles.com/ansi/unsorted/beavnbut.ans\nhttp://artscene.textfiles.com/ansi/unsorted/beer-30.ans\nhttp://artscene.textfiles.com/ansi/unsorted/belinda.ans\nhttp://artscene.textfiles.com/ansi/unsorted/beta.ans\nhttp://artscene.textfiles.com/ansi/unsorted/big_lou'.ans\nhttp://artscene.textfiles.com/ansi/unsorted/biggles.ans\nhttp://artscene.textfiles.com/ansi/unsorted/bike.ans\nhttp://artscene.textfiles.com/ansi/unsorted/billtcat.ans\nhttp://artscene.textfiles.com/ansi/unsorted/blank.ans\nhttp://artscene.textfiles.com/ansi/unsorted/blarney1.ans\nhttp://artscene.textfiles.com/ansi/unsorted/blarney2.ans\nhttp://artscene.textfiles.com/ansi/unsorted/blarney3.ans\nhttp://artscene.textfiles.com/ansi/unsorted/blarney4.ans\nhttp://artscene.textfiles.com/ansi/unsorted/blood.ans\nhttp://artscene.textfiles.com/ansi/unsorted/blueice.ans\nhttp://artscene.textfiles.com/ansi/unsorted/blujeans.ans\nhttp://artscene.textfiles.com/ansi/unsorted/boat.ans\nhttp://artscene.textfiles.com/ansi/unsorted/boo.ans\nhttp://artscene.textfiles.com/ansi/unsorted/bookworm.ans\nhttp://artscene.textfiles.com/ansi/unsorted/bop.ans\nhttp://artscene.textfiles.com/ansi/unsorted/bopwing.ans\nhttp://artscene.textfiles.com/ansi/unsorted/borg.ans\nhttp://artscene.textfiles.com/ansi/unsorted/boston.ans\nhttp://artscene.textfiles.com/ansi/unsorted/bowl.ans\nhttp://artscene.textfiles.com/ansi/unsorted/boys.ans\nhttp://artscene.textfiles.com/ansi/unsorted/bozo.ans\nhttp://artscene.textfiles.com/ansi/unsorted/brdmg.ans\nhttp://artscene.textfiles.com/ansi/unsorted/brdwalk.ans\nhttp://artscene.textfiles.com/ansi/unsorted/brian.ans\nhttp://artscene.textfiles.com/ansi/unsorted/bugs.ans\nhttp://artscene.textfiles.com/ansi/unsorted/bull11.ans\nhttp://artscene.textfiles.com/ansi/unsorted/bull12.ans\nhttp://artscene.textfiles.com/ansi/unsorted/bull1_old.ans\nhttp://artscene.textfiles.com/ansi/unsorted/bull2.ans\nhttp://artscene.textfiles.com/ansi/unsorted/bull7.ans\nhttp://artscene.textfiles.com/ansi/unsorted/bull8.ans\nhttp://artscene.textfiles.com/ansi/unsorted/bullwink.ans\nhttp://artscene.textfiles.com/ansi/unsorted/butrfly.ans\nhttp://artscene.textfiles.com/ansi/unsorted/bwah!.ans\nhttp://artscene.textfiles.com/ansi/unsorted/bwing.ans\nhttp://artscene.textfiles.com/ansi/unsorted/bye_mike.ans\nhttp://artscene.textfiles.com/ansi/unsorted/c_puppy.ans\nhttp://artscene.textfiles.com/ansi/unsorted/cablecom.ans\nhttp://artscene.textfiles.com/ansi/unsorted/calbomb.ans\nhttp://artscene.textfiles.com/ansi/unsorted/camelot.ans\nhttp://artscene.textfiles.com/ansi/unsorted/camera.ans\nhttp://artscene.textfiles.com/ansi/unsorted/cap-am.ans\nhttp://artscene.textfiles.com/ansi/unsorted/captbob.ans\nhttp://artscene.textfiles.com/ansi/unsorted/car.ans\nhttp://artscene.textfiles.com/ansi/unsorted/carlinosucks.ans\nhttp://artscene.textfiles.com/ansi/unsorted/cartoon.ans\nhttp://artscene.textfiles.com/ansi/unsorted/casa.ans\nhttp://artscene.textfiles.com/ansi/unsorted/castle.ans\nhttp://artscene.textfiles.com/ansi/unsorted/catclock.ans\nhttp://artscene.textfiles.com/ansi/unsorted/cbs.ans\nhttp://artscene.textfiles.com/ansi/unsorted/chat.ans\nhttp://artscene.textfiles.com/ansi/unsorted/chess.ans\nhttp://artscene.textfiles.com/ansi/unsorted/chess2.ans\nhttp://artscene.textfiles.com/ansi/unsorted/city.ans\nhttp://artscene.textfiles.com/ansi/unsorted/cityview.ans\nhttp://artscene.textfiles.com/ansi/unsorted/clear.ans\nhttp://artscene.textfiles.com/ansi/unsorted/clip.ans\nhttp://artscene.textfiles.com/ansi/unsorted/clown.ans\nhttp://artscene.textfiles.com/ansi/unsorted/clown_1.ans\nhttp://artscene.textfiles.com/ansi/unsorted/clown_2.ans\nhttp://artscene.textfiles.com/ansi/unsorted/coffee.ans\nhttp://artscene.textfiles.com/ansi/unsorted/color!.ans\nhttp://artscene.textfiles.com/ansi/unsorted/coloribm.ans\nhttp://artscene.textfiles.com/ansi/unsorted/colors.ans\nhttp://artscene.textfiles.com/ansi/unsorted/comics1.ans\nhttp://artscene.textfiles.com/ansi/unsorted/comics10.ans\nhttp://artscene.textfiles.com/ansi/unsorted/comics11.ans\nhttp://artscene.textfiles.com/ansi/unsorted/comics12.ans\nhttp://artscene.textfiles.com/ansi/unsorted/comics13.ans\nhttp://artscene.textfiles.com/ansi/unsorted/comics14.ans\nhttp://artscene.textfiles.com/ansi/unsorted/comics18.ans\nhttp://artscene.textfiles.com/ansi/unsorted/comics2.ans\nhttp://artscene.textfiles.com/ansi/unsorted/comics3.ans\nhttp://artscene.textfiles.com/ansi/unsorted/comics4.ans\nhttp://artscene.textfiles.com/ansi/unsorted/comics5.ans\nhttp://artscene.textfiles.com/ansi/unsorted/comics6.ans\nhttp://artscene.textfiles.com/ansi/unsorted/comics7.ans\nhttp://artscene.textfiles.com/ansi/unsorted/comics8.ans\nhttp://artscene.textfiles.com/ansi/unsorted/comics9.ans\nhttp://artscene.textfiles.com/ansi/unsorted/computer.ans\nhttp://artscene.textfiles.com/ansi/unsorted/config.ans\nhttp://artscene.textfiles.com/ansi/unsorted/configlm.ans\nhttp://artscene.textfiles.com/ansi/unsorted/configm.ans\nhttp://artscene.textfiles.com/ansi/unsorted/connect2.ans\nhttp://artscene.textfiles.com/ansi/unsorted/contest.ans\nhttp://artscene.textfiles.com/ansi/unsorted/court.ans\nhttp://artscene.textfiles.com/ansi/unsorted/cowboy.ans\nhttp://artscene.textfiles.com/ansi/unsorted/cowpoke.ans\nhttp://artscene.textfiles.com/ansi/unsorted/csmiles.ans\nhttp://artscene.textfiles.com/ansi/unsorted/cylon.ans\nhttp://artscene.textfiles.com/ansi/unsorted/d_gibson.ans\nhttp://artscene.textfiles.com/ansi/unsorted/d_storm.ans\nhttp://artscene.textfiles.com/ansi/unsorted/dad.ans\nhttp://artscene.textfiles.com/ansi/unsorted/dan_sig.ans\nhttp://artscene.textfiles.com/ansi/unsorted/danceart.ans\nhttp://artscene.textfiles.com/ansi/unsorted/darkman.ans\nhttp://artscene.textfiles.com/ansi/unsorted/darkside.ans\nhttp://artscene.textfiles.com/ansi/unsorted/data.ans\nhttp://artscene.textfiles.com/ansi/unsorted/datacom.ans\nhttp://artscene.textfiles.com/ansi/unsorted/datam.ans\nhttp://artscene.textfiles.com/ansi/unsorted/dataprot.ans\nhttp://artscene.textfiles.com/ansi/unsorted/david.ans\nhttp://artscene.textfiles.com/ansi/unsorted/dawg.ans\nhttp://artscene.textfiles.com/ansi/unsorted/day.ans\nhttp://artscene.textfiles.com/ansi/unsorted/dc_font.ans\nhttp://artscene.textfiles.com/ansi/unsorted/de-foot.ans\nhttp://artscene.textfiles.com/ansi/unsorted/de_foot.ans\nhttp://artscene.textfiles.com/ansi/unsorted/deadcat.ans\nhttp://artscene.textfiles.com/ansi/unsorted/deadline.ans\nhttp://artscene.textfiles.com/ansi/unsorted/dean-1.ans\nhttp://artscene.textfiles.com/ansi/unsorted/dean-2.ans\nhttp://artscene.textfiles.com/ansi/unsorted/dean_2.ans\nhttp://artscene.textfiles.com/ansi/unsorted/debate.ans\nhttp://artscene.textfiles.com/ansi/unsorted/debate2.ans\nhttp://artscene.textfiles.com/ansi/unsorted/debgib.ans\nhttp://artscene.textfiles.com/ansi/unsorted/defsacre.ans\nhttp://artscene.textfiles.com/ansi/unsorted/demo.ans\nhttp://artscene.textfiles.com/ansi/unsorted/derby_wk.ans\nhttp://artscene.textfiles.com/ansi/unsorted/desantis.ans\nhttp://artscene.textfiles.com/ansi/unsorted/desert.ans\nhttp://artscene.textfiles.com/ansi/unsorted/deshield.ans\nhttp://artscene.textfiles.com/ansi/unsorted/dest.ans\nhttp://artscene.textfiles.com/ansi/unsorted/destorm.ans\nhttp://artscene.textfiles.com/ansi/unsorted/dh-ug1.ans\nhttp://artscene.textfiles.com/ansi/unsorted/dhxmas.ans\nhttp://artscene.textfiles.com/ansi/unsorted/dino.ans\nhttp://artscene.textfiles.com/ansi/unsorted/direct.ans\nhttp://artscene.textfiles.com/ansi/unsorted/directry.ans\nhttp://artscene.textfiles.com/ansi/unsorted/dirtop.ans\nhttp://artscene.textfiles.com/ansi/unsorted/disclaim.ans\nhttp://artscene.textfiles.com/ansi/unsorted/diver.ans\nhttp://artscene.textfiles.com/ansi/unsorted/dknight.ans\nhttp://artscene.textfiles.com/ansi/unsorted/dleppard.ans\nhttp://artscene.textfiles.com/ansi/unsorted/dlmt.ans\nhttp://artscene.textfiles.com/ansi/unsorted/doctor.ans\nhttp://artscene.textfiles.com/ansi/unsorted/doddle.ans\nhttp://artscene.textfiles.com/ansi/unsorted/dog.ans\nhttp://artscene.textfiles.com/ansi/unsorted/dog_hbbs.ans\nhttp://artscene.textfiles.com/ansi/unsorted/dolly.ans\nhttp://artscene.textfiles.com/ansi/unsorted/donald.ans\nhttp://artscene.textfiles.com/ansi/unsorted/donatelo.ans\nhttp://artscene.textfiles.com/ansi/unsorted/doneapp.ans\nhttp://artscene.textfiles.com/ansi/unsorted/doodle.ans\nhttp://artscene.textfiles.com/ansi/unsorted/doodle1.ans\nhttp://artscene.textfiles.com/ansi/unsorted/doodle2.ans\nhttp://artscene.textfiles.com/ansi/unsorted/doomsday.ans\nhttp://artscene.textfiles.com/ansi/unsorted/door$.ans\nhttp://artscene.textfiles.com/ansi/unsorted/door1.ans\nhttp://artscene.textfiles.com/ansi/unsorted/doors1.ans\nhttp://artscene.textfiles.com/ansi/unsorted/doors2.ans\nhttp://artscene.textfiles.com/ansi/unsorted/doors4.ans\nhttp://artscene.textfiles.com/ansi/unsorted/doorsm.ans\nhttp://artscene.textfiles.com/ansi/unsorted/dorbul12.ans\nhttp://artscene.textfiles.com/ansi/unsorted/dos_1.ans\nhttp://artscene.textfiles.com/ansi/unsorted/dosaurdn.ans\nhttp://artscene.textfiles.com/ansi/unsorted/dp-under.ans\nhttp://artscene.textfiles.com/ansi/unsorted/dpurple.ans\nhttp://artscene.textfiles.com/ansi/unsorted/dragcity.ans\nhttp://artscene.textfiles.com/ansi/unsorted/dragon.ans\nhttp://artscene.textfiles.com/ansi/unsorted/dreams0.ans\nhttp://artscene.textfiles.com/ansi/unsorted/dreams1.ans\nhttp://artscene.textfiles.com/ansi/unsorted/dreams2.ans\nhttp://artscene.textfiles.com/ansi/unsorted/dreams3.ans\nhttp://artscene.textfiles.com/ansi/unsorted/dreams4.ans\nhttp://artscene.textfiles.com/ansi/unsorted/dreams5.ans\nhttp://artscene.textfiles.com/ansi/unsorted/drfg.ans\nhttp://artscene.textfiles.com/ansi/unsorted/drgn1.ans\nhttp://artscene.textfiles.com/ansi/unsorted/drgncomp.ans\nhttp://artscene.textfiles.com/ansi/unsorted/drip-o.ans\nhttp://artscene.textfiles.com/ansi/unsorted/drivin.ans\nhttp://artscene.textfiles.com/ansi/unsorted/drugs.ans\nhttp://artscene.textfiles.com/ansi/unsorted/ds_hst.ans\nhttp://artscene.textfiles.com/ansi/unsorted/ds_moon.ans\nhttp://artscene.textfiles.com/ansi/unsorted/dstbegin.ans\nhttp://artscene.textfiles.com/ansi/unsorted/dstend.ans\nhttp://artscene.textfiles.com/ansi/unsorted/dsysopm.ans\nhttp://artscene.textfiles.com/ansi/unsorted/duck.ans\nhttp://artscene.textfiles.com/ansi/unsorted/dude.ans\nhttp://artscene.textfiles.com/ansi/unsorted/dude4.ans\nhttp://artscene.textfiles.com/ansi/unsorted/duel.ans\nhttp://artscene.textfiles.com/ansi/unsorted/e_john.ans\nhttp://artscene.textfiles.com/ansi/unsorted/eagle.ans\nhttp://artscene.textfiles.com/ansi/unsorted/eagle2.ans\nhttp://artscene.textfiles.com/ansi/unsorted/earth.ans\nhttp://artscene.textfiles.com/ansi/unsorted/earthday.ans\nhttp://artscene.textfiles.com/ansi/unsorted/eatmy.ans\nhttp://artscene.textfiles.com/ansi/unsorted/eddy.ans\nhttp://artscene.textfiles.com/ansi/unsorted/edithelp.ans\nhttp://artscene.textfiles.com/ansi/unsorted/eds_mm.ans\nhttp://artscene.textfiles.com/ansi/unsorted/efoldsys.ans\nhttp://artscene.textfiles.com/ansi/unsorted/eggtrain.ans\nhttp://artscene.textfiles.com/ansi/unsorted/eglenest.ans\nhttp://artscene.textfiles.com/ansi/unsorted/egyptian.ans\nhttp://artscene.textfiles.com/ansi/unsorted/ei.ans\nhttp://artscene.textfiles.com/ansi/unsorted/ei_1.ans\nhttp://artscene.textfiles.com/ansi/unsorted/eiad.ans\nhttp://artscene.textfiles.com/ansi/unsorted/eiad2.ans\nhttp://artscene.textfiles.com/ansi/unsorted/eidolon.ans\nhttp://artscene.textfiles.com/ansi/unsorted/eight.ans\nhttp://artscene.textfiles.com/ansi/unsorted/eis.ans\nhttp://artscene.textfiles.com/ansi/unsorted/elect01.ans\nhttp://artscene.textfiles.com/ansi/unsorted/elect02.ans\nhttp://artscene.textfiles.com/ansi/unsorted/electric.ans\nhttp://artscene.textfiles.com/ansi/unsorted/elektra.ans\nhttp://artscene.textfiles.com/ansi/unsorted/elephant.ans\nhttp://artscene.textfiles.com/ansi/unsorted/elimnatr.ans\nhttp://artscene.textfiles.com/ansi/unsorted/elsiecow.ans\nhttp://artscene.textfiles.com/ansi/unsorted/elton.ans\nhttp://artscene.textfiles.com/ansi/unsorted/elvis.ans\nhttp://artscene.textfiles.com/ansi/unsorted/elvis2.ans\nhttp://artscene.textfiles.com/ansi/unsorted/elvis_p.ans\nhttp://artscene.textfiles.com/ansi/unsorted/em_tribe.ans\nhttp://artscene.textfiles.com/ansi/unsorted/email.ans\nhttp://artscene.textfiles.com/ansi/unsorted/emailm.ans\nhttp://artscene.textfiles.com/ansi/unsorted/emer.ans\nhttp://artscene.textfiles.com/ansi/unsorted/enchant.ans\nhttp://artscene.textfiles.com/ansi/unsorted/enforce.ans\nhttp://artscene.textfiles.com/ansi/unsorted/engineer.ans\nhttp://artscene.textfiles.com/ansi/unsorted/engr1.ans\nhttp://artscene.textfiles.com/ansi/unsorted/entropy.ans\nhttp://artscene.textfiles.com/ansi/unsorted/entry.ans\nhttp://artscene.textfiles.com/ansi/unsorted/eod.ans\nhttp://artscene.textfiles.com/ansi/unsorted/epic.ans\nhttp://artscene.textfiles.com/ansi/unsorted/epoch.ans\nhttp://artscene.textfiles.com/ansi/unsorted/ernest.ans\nhttp://artscene.textfiles.com/ansi/unsorted/escanm.ans\nhttp://artscene.textfiles.com/ansi/unsorted/escape.ans\nhttp://artscene.textfiles.com/ansi/unsorted/esysopm.ans\nhttp://artscene.textfiles.com/ansi/unsorted/europe.ans\nhttp://artscene.textfiles.com/ansi/unsorted/evilwarr.ans\nhttp://artscene.textfiles.com/ansi/unsorted/evoluton.ans\nhttp://artscene.textfiles.com/ansi/unsorted/excalibu.ans\nhttp://artscene.textfiles.com/ansi/unsorted/exchan11.ans\nhttp://artscene.textfiles.com/ansi/unsorted/exchang1.ans\nhttp://artscene.textfiles.com/ansi/unsorted/exchang2.ans\nhttp://artscene.textfiles.com/ansi/unsorted/exchang4.ans\nhttp://artscene.textfiles.com/ansi/unsorted/execute.ans\nhttp://artscene.textfiles.com/ansi/unsorted/express.ans\nhttp://artscene.textfiles.com/ansi/unsorted/eye.ans\nhttp://artscene.textfiles.com/ansi/unsorted/eye_b_em.ans\nhttp://artscene.textfiles.com/ansi/unsorted/eye_test.ans\nhttp://artscene.textfiles.com/ansi/unsorted/eyes.ans\nhttp://artscene.textfiles.com/ansi/unsorted/f_kuwait.ans\nhttp://artscene.textfiles.com/ansi/unsorted/face_1.ans\nhttp://artscene.textfiles.com/ansi/unsorted/face_2.ans\nhttp://artscene.textfiles.com/ansi/unsorted/face_3.ans\nhttp://artscene.textfiles.com/ansi/unsorted/face_4.ans\nhttp://artscene.textfiles.com/ansi/unsorted/face_5.ans\nhttp://artscene.textfiles.com/ansi/unsorted/faces.ans\nhttp://artscene.textfiles.com/ansi/unsorted/falcon.ans\nhttp://artscene.textfiles.com/ansi/unsorted/fantasia.ans\nhttp://artscene.textfiles.com/ansi/unsorted/fbatchm.ans\nhttp://artscene.textfiles.com/ansi/unsorted/fchangem.ans\nhttp://artscene.textfiles.com/ansi/unsorted/feditm.ans\nhttp://artscene.textfiles.com/ansi/unsorted/feedback.ans\nhttp://artscene.textfiles.com/ansi/unsorted/felix.ans\nhttp://artscene.textfiles.com/ansi/unsorted/fheader.ans\nhttp://artscene.textfiles.com/ansi/unsorted/fighters.ans\nhttp://artscene.textfiles.com/ansi/unsorted/file1.ans\nhttp://artscene.textfiles.com/ansi/unsorted/firenet.ans\nhttp://artscene.textfiles.com/ansi/unsorted/firework.ans\nhttp://artscene.textfiles.com/ansi/unsorted/firstpic.ans\nhttp://artscene.textfiles.com/ansi/unsorted/fish.ans\nhttp://artscene.textfiles.com/ansi/unsorted/fishing.ans\nhttp://artscene.textfiles.com/ansi/unsorted/fishy.ans\nhttp://artscene.textfiles.com/ansi/unsorted/fla_map.ans\nhttp://artscene.textfiles.com/ansi/unsorted/flag.ans\nhttp://artscene.textfiles.com/ansi/unsorted/flag_2.ans\nhttp://artscene.textfiles.com/ansi/unsorted/flashing.ans\nhttp://artscene.textfiles.com/ansi/unsorted/flight.ans\nhttp://artscene.textfiles.com/ansi/unsorted/flintstn.ans\nhttp://artscene.textfiles.com/ansi/unsorted/floppy.ans\nhttp://artscene.textfiles.com/ansi/unsorted/flower.ans\nhttp://artscene.textfiles.com/ansi/unsorted/fnewm.ans\nhttp://artscene.textfiles.com/ansi/unsorted/forests.ans\nhttp://artscene.textfiles.com/ansi/unsorted/foulup.ans\nhttp://artscene.textfiles.com/ansi/unsorted/fred.ans\nhttp://artscene.textfiles.com/ansi/unsorted/freddy.ans\nhttp://artscene.textfiles.com/ansi/unsorted/freed_kw.ans\nhttp://artscene.textfiles.com/ansi/unsorted/friday13.ans\nhttp://artscene.textfiles.com/ansi/unsorted/friendly.ans\nhttp://artscene.textfiles.com/ansi/unsorted/frontier.ans\nhttp://artscene.textfiles.com/ansi/unsorted/fruit.ans\nhttp://artscene.textfiles.com/ansi/unsorted/fsehead.ans\nhttp://artscene.textfiles.com/ansi/unsorted/fsehelp.ans\nhttp://artscene.textfiles.com/ansi/unsorted/fsysopm.ans\nhttp://artscene.textfiles.com/ansi/unsorted/fyc.ans\nhttp://artscene.textfiles.com/ansi/unsorted/garf1.ans\nhttp://artscene.textfiles.com/ansi/unsorted/garfield.ans\nhttp://artscene.textfiles.com/ansi/unsorted/gavel03.ans\nhttp://artscene.textfiles.com/ansi/unsorted/gavel05.ans\nhttp://artscene.textfiles.com/ansi/unsorted/gavel06.ans\nhttp://artscene.textfiles.com/ansi/unsorted/gavel07.ans\nhttp://artscene.textfiles.com/ansi/unsorted/gavel08.ans\nhttp://artscene.textfiles.com/ansi/unsorted/gavel09.ans\nhttp://artscene.textfiles.com/ansi/unsorted/gavel21.ans\nhttp://artscene.textfiles.com/ansi/unsorted/gavel22.ans\nhttp://artscene.textfiles.com/ansi/unsorted/gavel23.ans\nhttp://artscene.textfiles.com/ansi/unsorted/gavel24.ans\nhttp://artscene.textfiles.com/ansi/unsorted/gavel25.ans\nhttp://artscene.textfiles.com/ansi/unsorted/gavel26.ans\nhttp://artscene.textfiles.com/ansi/unsorted/gavel27.ans\nhttp://artscene.textfiles.com/ansi/unsorted/gavel28.ans\nhttp://artscene.textfiles.com/ansi/unsorted/gavel30.ans\nhttp://artscene.textfiles.com/ansi/unsorted/gavel37.ans\nhttp://artscene.textfiles.com/ansi/unsorted/gavel42.ans\nhttp://artscene.textfiles.com/ansi/unsorted/gavel43.ans\nhttp://artscene.textfiles.com/ansi/unsorted/gavel44.ans\nhttp://artscene.textfiles.com/ansi/unsorted/gavel45.ans\nhttp://artscene.textfiles.com/ansi/unsorted/gavel46.ans\nhttp://artscene.textfiles.com/ansi/unsorted/gavel47.ans\nhttp://artscene.textfiles.com/ansi/unsorted/gavel48.ans\nhttp://artscene.textfiles.com/ansi/unsorted/gavel51.ans\nhttp://artscene.textfiles.com/ansi/unsorted/gavel52.ans\nhttp://artscene.textfiles.com/ansi/unsorted/gavel53.ans\nhttp://artscene.textfiles.com/ansi/unsorted/gavel56.ans\nhttp://artscene.textfiles.com/ansi/unsorted/gavel57.ans\nhttp://artscene.textfiles.com/ansi/unsorted/gavel58.ans\nhttp://artscene.textfiles.com/ansi/unsorted/gavel60.ans\nhttp://artscene.textfiles.com/ansi/unsorted/gavel65.ans\nhttp://artscene.textfiles.com/ansi/unsorted/gavel68.ans\nhttp://artscene.textfiles.com/ansi/unsorted/gavel69.ans\nhttp://artscene.textfiles.com/ansi/unsorted/gavel71.ans\nhttp://artscene.textfiles.com/ansi/unsorted/gavel74.ans\nhttp://artscene.textfiles.com/ansi/unsorted/gavel75.ans\nhttp://artscene.textfiles.com/ansi/unsorted/gavel76.ans\nhttp://artscene.textfiles.com/ansi/unsorted/gavel77.ans\nhttp://artscene.textfiles.com/ansi/unsorted/gavel78.ans\nhttp://artscene.textfiles.com/ansi/unsorted/gavel79.ans\nhttp://artscene.textfiles.com/ansi/unsorted/gavel83.ans\nhttp://artscene.textfiles.com/ansi/unsorted/gavel85.ans\nhttp://artscene.textfiles.com/ansi/unsorted/gavel89.ans\nhttp://artscene.textfiles.com/ansi/unsorted/gavel92.ans\nhttp://artscene.textfiles.com/ansi/unsorted/gavel94.ans\nhttp://artscene.textfiles.com/ansi/unsorted/geekaren.ans\nhttp://artscene.textfiles.com/ansi/unsorted/genius.ans\nhttp://artscene.textfiles.com/ansi/unsorted/getwell.ans\nhttp://artscene.textfiles.com/ansi/unsorted/ghost.ans\nhttp://artscene.textfiles.com/ansi/unsorted/ghost1.ans\nhttp://artscene.textfiles.com/ansi/unsorted/ghost2.ans\nhttp://artscene.textfiles.com/ansi/unsorted/ghostcom.ans\nhttp://artscene.textfiles.com/ansi/unsorted/ghstmchn.ans\nhttp://artscene.textfiles.com/ansi/unsorted/gif-ansi.ans\nhttp://artscene.textfiles.com/ansi/unsorted/gif_ans1.ans\nhttp://artscene.textfiles.com/ansi/unsorted/gif_ans2.ans\nhttp://artscene.textfiles.com/ansi/unsorted/gilligan.ans\nhttp://artscene.textfiles.com/ansi/unsorted/goflames.ans\nhttp://artscene.textfiles.com/ansi/unsorted/goldappl.ans\nhttp://artscene.textfiles.com/ansi/unsorted/goodbye.ans\nhttp://artscene.textfiles.com/ansi/unsorted/goose.ans\nhttp://artscene.textfiles.com/ansi/unsorted/gorilla.ans\nhttp://artscene.textfiles.com/ansi/unsorted/gossip.ans\nhttp://artscene.textfiles.com/ansi/unsorted/gottem.ans\nhttp://artscene.textfiles.com/ansi/unsorted/gpgtbbs.ans\nhttp://artscene.textfiles.com/ansi/unsorted/grandpa.ans\nhttp://artscene.textfiles.com/ansi/unsorted/great.ans\nhttp://artscene.textfiles.com/ansi/unsorted/greenbay.ans\nhttp://artscene.textfiles.com/ansi/unsorted/greeting.ans\nhttp://artscene.textfiles.com/ansi/unsorted/grimm.ans\nhttp://artscene.textfiles.com/ansi/unsorted/gross.ans\nhttp://artscene.textfiles.com/ansi/unsorted/groupm.ans\nhttp://artscene.textfiles.com/ansi/unsorted/grumpy.ans\nhttp://artscene.textfiles.com/ansi/unsorted/gults.ans\nhttp://artscene.textfiles.com/ansi/unsorted/gvb.ans\nhttp://artscene.textfiles.com/ansi/unsorted/hallfame.ans\nhttp://artscene.textfiles.com/ansi/unsorted/haloween.ans\nhttp://artscene.textfiles.com/ansi/unsorted/halowen4.ans\nhttp://artscene.textfiles.com/ansi/unsorted/hammer.ans\nhttp://artscene.textfiles.com/ansi/unsorted/hamradio.ans\nhttp://artscene.textfiles.com/ansi/unsorted/hamrtime.ans\nhttp://artscene.textfiles.com/ansi/unsorted/hands.ans\nhttp://artscene.textfiles.com/ansi/unsorted/hanukkah.ans\nhttp://artscene.textfiles.com/ansi/unsorted/happy.ans\nhttp://artscene.textfiles.com/ansi/unsorted/hardkod.ans\nhttp://artscene.textfiles.com/ansi/unsorted/hardrock.ans\nhttp://artscene.textfiles.com/ansi/unsorted/hawaii.ans\nhttp://artscene.textfiles.com/ansi/unsorted/hawaiian.ans\nhttp://artscene.textfiles.com/ansi/unsorted/hbarrel.ans\nhttp://artscene.textfiles.com/ansi/unsorted/hcts.ans\nhttp://artscene.textfiles.com/ansi/unsorted/hdba1.ans\nhttp://artscene.textfiles.com/ansi/unsorted/hdba2.ans\nhttp://artscene.textfiles.com/ansi/unsorted/hdr.ans\nhttp://artscene.textfiles.com/ansi/unsorted/header.ans\nhttp://artscene.textfiles.com/ansi/unsorted/heart.ans\nhttp://artscene.textfiles.com/ansi/unsorted/hefner.ans\nhttp://artscene.textfiles.com/ansi/unsorted/helmets.ans\nhttp://artscene.textfiles.com/ansi/unsorted/hero.ans\nhttp://artscene.textfiles.com/ansi/unsorted/hey.ans\nhttp://artscene.textfiles.com/ansi/unsorted/hh01.ans\nhttp://artscene.textfiles.com/ansi/unsorted/hibex.ans\nhttp://artscene.textfiles.com/ansi/unsorted/highflt.ans\nhttp://artscene.textfiles.com/ansi/unsorted/hilite.ans\nhttp://artscene.textfiles.com/ansi/unsorted/history2.ans\nhttp://artscene.textfiles.com/ansi/unsorted/history3.ans\nhttp://artscene.textfiles.com/ansi/unsorted/hit.ans\nhttp://artscene.textfiles.com/ansi/unsorted/hlc.ans\nhttp://artscene.textfiles.com/ansi/unsorted/hocii2.ans\nhttp://artscene.textfiles.com/ansi/unsorted/hocii3.ans\nhttp://artscene.textfiles.com/ansi/unsorted/holistic.ans\nhttp://artscene.textfiles.com/ansi/unsorted/homebase.ans\nhttp://artscene.textfiles.com/ansi/unsorted/homedba.ans\nhttp://artscene.textfiles.com/ansi/unsorted/homey.ans\nhttp://artscene.textfiles.com/ansi/unsorted/homrduck.ans\nhttp://artscene.textfiles.com/ansi/unsorted/honey.ans\nhttp://artscene.textfiles.com/ansi/unsorted/hop2.ans\nhttp://artscene.textfiles.com/ansi/unsorted/hoppyday.ans\nhttp://artscene.textfiles.com/ansi/unsorted/horse.ans\nhttp://artscene.textfiles.com/ansi/unsorted/horsebck.ans\nhttp://artscene.textfiles.com/ansi/unsorted/house.ans\nhttp://artscene.textfiles.com/ansi/unsorted/house1.ans\nhttp://artscene.textfiles.com/ansi/unsorted/house2.ans\nhttp://artscene.textfiles.com/ansi/unsorted/hrt&soul.ans\nhttp://artscene.textfiles.com/ansi/unsorted/hstsale.ans\nhttp://artscene.textfiles.com/ansi/unsorted/hub.ans\nhttp://artscene.textfiles.com/ansi/unsorted/hulagrls.ans\nhttp://artscene.textfiles.com/ansi/unsorted/humpday.ans\nhttp://artscene.textfiles.com/ansi/unsorted/hvd_card.ans\nhttp://artscene.textfiles.com/ansi/unsorted/hween.ans\nhttp://artscene.textfiles.com/ansi/unsorted/hy-ug.ans\nhttp://artscene.textfiles.com/ansi/unsorted/ibm.ans\nhttp://artscene.textfiles.com/ansi/unsorted/ibmpres.ans\nhttp://artscene.textfiles.com/ansi/unsorted/ice.ans\nhttp://artscene.textfiles.com/ansi/unsorted/ii.ans\nhttp://artscene.textfiles.com/ansi/unsorted/iii.ans\nhttp://artscene.textfiles.com/ansi/unsorted/ikripld.ans\nhttp://artscene.textfiles.com/ansi/unsorted/ilans10.ans\nhttp://artscene.textfiles.com/ansi/unsorted/ilans11.ans\nhttp://artscene.textfiles.com/ansi/unsorted/ilans12.ans\nhttp://artscene.textfiles.com/ansi/unsorted/ilans13.ans\nhttp://artscene.textfiles.com/ansi/unsorted/ilans14.ans\nhttp://artscene.textfiles.com/ansi/unsorted/ilans15.ans\nhttp://artscene.textfiles.com/ansi/unsorted/ilans16.ans\nhttp://artscene.textfiles.com/ansi/unsorted/ilans17.ans\nhttp://artscene.textfiles.com/ansi/unsorted/ilans18.ans\nhttp://artscene.textfiles.com/ansi/unsorted/ilans19.ans\nhttp://artscene.textfiles.com/ansi/unsorted/ilans20.ans\nhttp://artscene.textfiles.com/ansi/unsorted/ilans21.ans\nhttp://artscene.textfiles.com/ansi/unsorted/ilans22.ans\nhttp://artscene.textfiles.com/ansi/unsorted/ilans23.ans\nhttp://artscene.textfiles.com/ansi/unsorted/ilans24.ans\nhttp://artscene.textfiles.com/ansi/unsorted/ilans25.ans\nhttp://artscene.textfiles.com/ansi/unsorted/ilans26.ans\nhttp://artscene.textfiles.com/ansi/unsorted/ilans27.ans\nhttp://artscene.textfiles.com/ansi/unsorted/image.ans\nhttp://artscene.textfiles.com/ansi/unsorted/inans33.ans\nhttp://artscene.textfiles.com/ansi/unsorted/inans34.ans\nhttp://artscene.textfiles.com/ansi/unsorted/inans35.ans\nhttp://artscene.textfiles.com/ansi/unsorted/inans36.ans\nhttp://artscene.textfiles.com/ansi/unsorted/inside.ans\nhttp://artscene.textfiles.com/ansi/unsorted/intercon.ans\nhttp://artscene.textfiles.com/ansi/unsorted/iraq_af.ans\nhttp://artscene.textfiles.com/ansi/unsorted/iraqflag.ans\nhttp://artscene.textfiles.com/ansi/unsorted/irs.ans\nhttp://artscene.textfiles.com/ansi/unsorted/ito.ans\nhttp://artscene.textfiles.com/ansi/unsorted/itsaboy.ans\nhttp://artscene.textfiles.com/ansi/unsorted/itsover.ans\nhttp://artscene.textfiles.com/ansi/unsorted/ivgb.ans\nhttp://artscene.textfiles.com/ansi/unsorted/jabba.ans\nhttp://artscene.textfiles.com/ansi/unsorted/jabbahq.ans\nhttp://artscene.textfiles.com/ansi/unsorted/jabflag.ans\nhttp://artscene.textfiles.com/ansi/unsorted/jadoodle.ans\nhttp://artscene.textfiles.com/ansi/unsorted/janet.ans\nhttp://artscene.textfiles.com/ansi/unsorted/jason5.ans\nhttp://artscene.textfiles.com/ansi/unsorted/jd.ans\nhttp://artscene.textfiles.com/ansi/unsorted/jeffmurf.ans\nhttp://artscene.textfiles.com/ansi/unsorted/jessica.ans\nhttp://artscene.textfiles.com/ansi/unsorted/jesters.ans\nhttp://artscene.textfiles.com/ansi/unsorted/jet.ans\nhttp://artscene.textfiles.com/ansi/unsorted/jill.ans\nhttp://artscene.textfiles.com/ansi/unsorted/jimnet.ans\nhttp://artscene.textfiles.com/ansi/unsorted/jm_matri.ans\nhttp://artscene.textfiles.com/ansi/unsorted/joel.ans\nhttp://artscene.textfiles.com/ansi/unsorted/joelcrow.ans\nhttp://artscene.textfiles.com/ansi/unsorted/jolly5.ans\nhttp://artscene.textfiles.com/ansi/unsorted/jordi.ans\nhttp://artscene.textfiles.com/ansi/unsorted/jp.ans\nhttp://artscene.textfiles.com/ansi/unsorted/jtiger.ans\nhttp://artscene.textfiles.com/ansi/unsorted/judge.ans\nhttp://artscene.textfiles.com/ansi/unsorted/july4.ans\nhttp://artscene.textfiles.com/ansi/unsorted/jumbo.ans\nhttp://artscene.textfiles.com/ansi/unsorted/junkyard.ans\nhttp://artscene.textfiles.com/ansi/unsorted/ka_sword.ans\nhttp://artscene.textfiles.com/ansi/unsorted/kansas.ans\nhttp://artscene.textfiles.com/ansi/unsorted/kc_chief.ans\nhttp://artscene.textfiles.com/ansi/unsorted/kentucky.ans\nhttp://artscene.textfiles.com/ansi/unsorted/kermborg.ans\nhttp://artscene.textfiles.com/ansi/unsorted/kermit.ans\nhttp://artscene.textfiles.com/ansi/unsorted/kernfair.ans\nhttp://artscene.textfiles.com/ansi/unsorted/kidsline.ans\nhttp://artscene.textfiles.com/ansi/unsorted/killer.ans\nhttp://artscene.textfiles.com/ansi/unsorted/killgeek.ans\nhttp://artscene.textfiles.com/ansi/unsorted/killopus.ans\nhttp://artscene.textfiles.com/ansi/unsorted/killsven.ans\nhttp://artscene.textfiles.com/ansi/unsorted/kimwells.ans\nhttp://artscene.textfiles.com/ansi/unsorted/kiss.ans\nhttp://artscene.textfiles.com/ansi/unsorted/klingon.ans\nhttp://artscene.textfiles.com/ansi/unsorted/knights.ans\nhttp://artscene.textfiles.com/ansi/unsorted/knit02.ans\nhttp://artscene.textfiles.com/ansi/unsorted/knit03.ans\nhttp://artscene.textfiles.com/ansi/unsorted/knit04.ans\nhttp://artscene.textfiles.com/ansi/unsorted/knit05.ans\nhttp://artscene.textfiles.com/ansi/unsorted/knit06.ans\nhttp://artscene.textfiles.com/ansi/unsorted/knit07.ans\nhttp://artscene.textfiles.com/ansi/unsorted/knit08.ans\nhttp://artscene.textfiles.com/ansi/unsorted/know.ans\nhttp://artscene.textfiles.com/ansi/unsorted/krap.ans\nhttp://artscene.textfiles.com/ansi/unsorted/kuwait.ans\nhttp://artscene.textfiles.com/ansi/unsorted/l0gix.ans\nhttp://artscene.textfiles.com/ansi/unsorted/l_arcana.ans\nhttp://artscene.textfiles.com/ansi/unsorted/labor.ans\nhttp://artscene.textfiles.com/ansi/unsorted/language.ans\nhttp://artscene.textfiles.com/ansi/unsorted/lasa.ans\nhttp://artscene.textfiles.com/ansi/unsorted/lastcall.ans\nhttp://artscene.textfiles.com/ansi/unsorted/lastend.ans\nhttp://artscene.textfiles.com/ansi/unsorted/lastmid.ans\nhttp://artscene.textfiles.com/ansi/unsorted/lastsrt.ans\nhttp://artscene.textfiles.com/ansi/unsorted/ledzepp.ans\nhttp://artscene.textfiles.com/ansi/unsorted/lenbirth.ans\nhttp://artscene.textfiles.com/ansi/unsorted/leonardo.ans\nhttp://artscene.textfiles.com/ansi/unsorted/lincoln.ans\nhttp://artscene.textfiles.com/ansi/unsorted/link.ans\nhttp://artscene.textfiles.com/ansi/unsorted/lips.ans\nhttp://artscene.textfiles.com/ansi/unsorted/lisa_s.ans\nhttp://artscene.textfiles.com/ansi/unsorted/listbot.ans\nhttp://artscene.textfiles.com/ansi/unsorted/listme.ans\nhttp://artscene.textfiles.com/ansi/unsorted/live.ans\nhttp://artscene.textfiles.com/ansi/unsorted/livelong.ans\nhttp://artscene.textfiles.com/ansi/unsorted/lizard.ans\nhttp://artscene.textfiles.com/ansi/unsorted/lmb.ans\nhttp://artscene.textfiles.com/ansi/unsorted/lnans01.ans\nhttp://artscene.textfiles.com/ansi/unsorted/lnans02.ans\nhttp://artscene.textfiles.com/ansi/unsorted/lnans03.ans\nhttp://artscene.textfiles.com/ansi/unsorted/lnans04.ans\nhttp://artscene.textfiles.com/ansi/unsorted/lnans05.ans\nhttp://artscene.textfiles.com/ansi/unsorted/lnans06.ans\nhttp://artscene.textfiles.com/ansi/unsorted/lnans07.ans\nhttp://artscene.textfiles.com/ansi/unsorted/lnans08.ans\nhttp://artscene.textfiles.com/ansi/unsorted/lnans09.ans\nhttp://artscene.textfiles.com/ansi/unsorted/lnans10.ans\nhttp://artscene.textfiles.com/ansi/unsorted/lnans11.ans\nhttp://artscene.textfiles.com/ansi/unsorted/lnans12.ans\nhttp://artscene.textfiles.com/ansi/unsorted/lnans13.ans\nhttp://artscene.textfiles.com/ansi/unsorted/lnans14.ans\nhttp://artscene.textfiles.com/ansi/unsorted/lnans16.ans\nhttp://artscene.textfiles.com/ansi/unsorted/lnans17.ans\nhttp://artscene.textfiles.com/ansi/unsorted/lnans18.ans\nhttp://artscene.textfiles.com/ansi/unsorted/lnans19.ans\nhttp://artscene.textfiles.com/ansi/unsorted/lnans20.ans\nhttp://artscene.textfiles.com/ansi/unsorted/lnans22.ans\nhttp://artscene.textfiles.com/ansi/unsorted/lnans23.ans\nhttp://artscene.textfiles.com/ansi/unsorted/lnans24.ans\nhttp://artscene.textfiles.com/ansi/unsorted/lnans25.ans\nhttp://artscene.textfiles.com/ansi/unsorted/lnans26.ans\nhttp://artscene.textfiles.com/ansi/unsorted/lnans27.ans\nhttp://artscene.textfiles.com/ansi/unsorted/lnans28.ans\nhttp://artscene.textfiles.com/ansi/unsorted/lnans29.ans\nhttp://artscene.textfiles.com/ansi/unsorted/lnans30.ans\nhttp://artscene.textfiles.com/ansi/unsorted/lnans34.ans\nhttp://artscene.textfiles.com/ansi/unsorted/lnans35.ans\nhttp://artscene.textfiles.com/ansi/unsorted/lnans36.ans\nhttp://artscene.textfiles.com/ansi/unsorted/lnans37.ans\nhttp://artscene.textfiles.com/ansi/unsorted/lnans41.ans\nhttp://artscene.textfiles.com/ansi/unsorted/lnans42.ans\nhttp://artscene.textfiles.com/ansi/unsorted/lnans43.ans\nhttp://artscene.textfiles.com/ansi/unsorted/lnans81.ans\nhttp://artscene.textfiles.com/ansi/unsorted/lnans83.ans\nhttp://artscene.textfiles.com/ansi/unsorted/lnans85.ans\nhttp://artscene.textfiles.com/ansi/unsorted/lnans87.ans\nhttp://artscene.textfiles.com/ansi/unsorted/loco.ans\nhttp://artscene.textfiles.com/ansi/unsorted/login.ans\nhttp://artscene.textfiles.com/ansi/unsorted/login5.ans\nhttp://artscene.textfiles.com/ansi/unsorted/logoff.ans\nhttp://artscene.textfiles.com/ansi/unsorted/logon8.ans\nhttp://artscene.textfiles.com/ansi/unsorted/lq_bison.ans\nhttp://artscene.textfiles.com/ansi/unsorted/lq_splat.ans\nhttp://artscene.textfiles.com/ansi/unsorted/lq_spot.ans\nhttp://artscene.textfiles.com/ansi/unsorted/m_angelo.ans\nhttp://artscene.textfiles.com/ansi/unsorted/m_crue.ans\nhttp://artscene.textfiles.com/ansi/unsorted/machine.ans\nhttp://artscene.textfiles.com/ansi/unsorted/mad.ans\nhttp://artscene.textfiles.com/ansi/unsorted/main3.ans\nhttp://artscene.textfiles.com/ansi/unsorted/mainm.ans\nhttp://artscene.textfiles.com/ansi/unsorted/mainmenu.ans\nhttp://artscene.textfiles.com/ansi/unsorted/mansion.ans\nhttp://artscene.textfiles.com/ansi/unsorted/maranath.ans\nhttp://artscene.textfiles.com/ansi/unsorted/mario!.ans\nhttp://artscene.textfiles.com/ansi/unsorted/mario.ans\nhttp://artscene.textfiles.com/ansi/unsorted/marioscr.ans\nhttp://artscene.textfiles.com/ansi/unsorted/martin.ans\nhttp://artscene.textfiles.com/ansi/unsorted/marvin.ans\nhttp://artscene.textfiles.com/ansi/unsorted/mash-chp.ans\nhttp://artscene.textfiles.com/ansi/unsorted/mat_3-17.ans\nhttp://artscene.textfiles.com/ansi/unsorted/matrix.ans\nhttp://artscene.textfiles.com/ansi/unsorted/max.ans\nhttp://artscene.textfiles.com/ansi/unsorted/mca_rec.ans\nhttp://artscene.textfiles.com/ansi/unsorted/mchat.ans\nhttp://artscene.textfiles.com/ansi/unsorted/meet.ans\nhttp://artscene.textfiles.com/ansi/unsorted/menu.ans\nhttp://artscene.textfiles.com/ansi/unsorted/menu1.ans\nhttp://artscene.textfiles.com/ansi/unsorted/merk.ans\nhttp://artscene.textfiles.com/ansi/unsorted/mescal.ans\nhttp://artscene.textfiles.com/ansi/unsorted/mescalin.ans\nhttp://artscene.textfiles.com/ansi/unsorted/message1.ans\nhttp://artscene.textfiles.com/ansi/unsorted/message2.ans\nhttp://artscene.textfiles.com/ansi/unsorted/mftdp.ans\nhttp://artscene.textfiles.com/ansi/unsorted/midestwr.ans\nhttp://artscene.textfiles.com/ansi/unsorted/mirror.ans\nhttp://artscene.textfiles.com/ansi/unsorted/misc1.ans\nhttp://artscene.textfiles.com/ansi/unsorted/mlk.ans\nhttp://artscene.textfiles.com/ansi/unsorted/mm.ans\nhttp://artscene.textfiles.com/ansi/unsorted/monroe.ans\nhttp://artscene.textfiles.com/ansi/unsorted/moonrise.ans\nhttp://artscene.textfiles.com/ansi/unsorted/morbid1.ans\nhttp://artscene.textfiles.com/ansi/unsorted/mountain.ans\nhttp://artscene.textfiles.com/ansi/unsorted/mouse8.ans\nhttp://artscene.textfiles.com/ansi/unsorted/ms_piggy.ans\nhttp://artscene.textfiles.com/ansi/unsorted/msgbases.ans\nhttp://artscene.textfiles.com/ansi/unsorted/multipic.ans\nhttp://artscene.textfiles.com/ansi/unsorted/my_font.ans\nhttp://artscene.textfiles.com/ansi/unsorted/n-hawk.ans\nhttp://artscene.textfiles.com/ansi/unsorted/n_ranger.ans\nhttp://artscene.textfiles.com/ansi/unsorted/nasa.ans\nhttp://artscene.textfiles.com/ansi/unsorted/naugflag.ans\nhttp://artscene.textfiles.com/ansi/unsorted/nautical.ans\nhttp://artscene.textfiles.com/ansi/unsorted/ncpds.ans\nhttp://artscene.textfiles.com/ansi/unsorted/ncpds1.ans\nhttp://artscene.textfiles.com/ansi/unsorted/ncpds2.ans\nhttp://artscene.textfiles.com/ansi/unsorted/ne-sys.ans\nhttp://artscene.textfiles.com/ansi/unsorted/neptune.ans\nhttp://artscene.textfiles.com/ansi/unsorted/neptune2.ans\nhttp://artscene.textfiles.com/ansi/unsorted/neptune3.ans\nhttp://artscene.textfiles.com/ansi/unsorted/newcon.ans\nhttp://artscene.textfiles.com/ansi/unsorted/newfont.ans\nhttp://artscene.textfiles.com/ansi/unsorted/newinfo.ans\nhttp://artscene.textfiles.com/ansi/unsorted/newshead.ans\nhttp://artscene.textfiles.com/ansi/unsorted/newsm.ans\nhttp://artscene.textfiles.com/ansi/unsorted/nice.ans\nhttp://artscene.textfiles.com/ansi/unsorted/nicetry.ans\nhttp://artscene.textfiles.com/ansi/unsorted/nitecity.ans\nhttp://artscene.textfiles.com/ansi/unsorted/nobody.ans\nhttp://artscene.textfiles.com/ansi/unsorted/noday.ans\nhttp://artscene.textfiles.com/ansi/unsorted/norad.ans\nhttp://artscene.textfiles.com/ansi/unsorted/north.ans\nhttp://artscene.textfiles.com/ansi/unsorted/nuv.ans\nhttp://artscene.textfiles.com/ansi/unsorted/nuvm.ans\nhttp://artscene.textfiles.com/ansi/unsorted/oakland.ans\nhttp://artscene.textfiles.com/ansi/unsorted/oaklawn1.ans\nhttp://artscene.textfiles.com/ansi/unsorted/odie.ans\nhttp://artscene.textfiles.com/ansi/unsorted/ods.ans\nhttp://artscene.textfiles.com/ansi/unsorted/ofrog03.ans\nhttp://artscene.textfiles.com/ansi/unsorted/ofrog04.ans\nhttp://artscene.textfiles.com/ansi/unsorted/oinkbbs.ans\nhttp://artscene.textfiles.com/ansi/unsorted/olcodger.ans\nhttp://artscene.textfiles.com/ansi/unsorted/oldguy.ans\nhttp://artscene.textfiles.com/ansi/unsorted/oldman.ans\nhttp://artscene.textfiles.com/ansi/unsorted/omega.ans\nhttp://artscene.textfiles.com/ansi/unsorted/oneeyed.ans\nhttp://artscene.textfiles.com/ansi/unsorted/onemid.ans\nhttp://artscene.textfiles.com/ansi/unsorted/onempty.ans\nhttp://artscene.textfiles.com/ansi/unsorted/op-icon.ans\nhttp://artscene.textfiles.com/ansi/unsorted/openscr.ans\nhttp://artscene.textfiles.com/ansi/unsorted/opus.ans\nhttp://artscene.textfiles.com/ansi/unsorted/opus002.ans\nhttp://artscene.textfiles.com/ansi/unsorted/opus006.ans\nhttp://artscene.textfiles.com/ansi/unsorted/opus007.ans\nhttp://artscene.textfiles.com/ansi/unsorted/opus008.ans\nhttp://artscene.textfiles.com/ansi/unsorted/opus011.ans\nhttp://artscene.textfiles.com/ansi/unsorted/opus012.ans\nhttp://artscene.textfiles.com/ansi/unsorted/opus014.ans\nhttp://artscene.textfiles.com/ansi/unsorted/opus016.ans\nhttp://artscene.textfiles.com/ansi/unsorted/opus017.ans\nhttp://artscene.textfiles.com/ansi/unsorted/opus021.ans\nhttp://artscene.textfiles.com/ansi/unsorted/opus024.ans\nhttp://artscene.textfiles.com/ansi/unsorted/opus025.ans\nhttp://artscene.textfiles.com/ansi/unsorted/opus026.ans\nhttp://artscene.textfiles.com/ansi/unsorted/opus027.ans\nhttp://artscene.textfiles.com/ansi/unsorted/opus028.ans\nhttp://artscene.textfiles.com/ansi/unsorted/opus029.ans\nhttp://artscene.textfiles.com/ansi/unsorted/opus030.ans\nhttp://artscene.textfiles.com/ansi/unsorted/opus036.ans\nhttp://artscene.textfiles.com/ansi/unsorted/opus042.ans\nhttp://artscene.textfiles.com/ansi/unsorted/opus045.ans\nhttp://artscene.textfiles.com/ansi/unsorted/opus046.ans\nhttp://artscene.textfiles.com/ansi/unsorted/opus047.ans\nhttp://artscene.textfiles.com/ansi/unsorted/opus048.ans\nhttp://artscene.textfiles.com/ansi/unsorted/opus054.ans\nhttp://artscene.textfiles.com/ansi/unsorted/opus061.ans\nhttp://artscene.textfiles.com/ansi/unsorted/opus066.ans\nhttp://artscene.textfiles.com/ansi/unsorted/opus068.ans\nhttp://artscene.textfiles.com/ansi/unsorted/opus069.ans\nhttp://artscene.textfiles.com/ansi/unsorted/opus072.ans\nhttp://artscene.textfiles.com/ansi/unsorted/opus092.ans\nhttp://artscene.textfiles.com/ansi/unsorted/opus093.ans\nhttp://artscene.textfiles.com/ansi/unsorted/opus094.ans\nhttp://artscene.textfiles.com/ansi/unsorted/opus2.ans\nhttp://artscene.textfiles.com/ansi/unsorted/opus3.ans\nhttp://artscene.textfiles.com/ansi/unsorted/opusack.ans\nhttp://artscene.textfiles.com/ansi/unsorted/oriental.ans\nhttp://artscene.textfiles.com/ansi/unsorted/orion.ans\nhttp://artscene.textfiles.com/ansi/unsorted/orions01.ans\nhttp://artscene.textfiles.com/ansi/unsorted/ourhouse.ans\nhttp://artscene.textfiles.com/ansi/unsorted/out-back.ans\nhttp://artscene.textfiles.com/ansi/unsorted/out_back.ans\nhttp://artscene.textfiles.com/ansi/unsorted/outfield.ans\nhttp://artscene.textfiles.com/ansi/unsorted/outhouse.ans\nhttp://artscene.textfiles.com/ansi/unsorted/owlhaunt.ans\nhttp://artscene.textfiles.com/ansi/unsorted/owlserv.ans\nhttp://artscene.textfiles.com/ansi/unsorted/oz_flag.ans\nhttp://artscene.textfiles.com/ansi/unsorted/p1.ans\nhttp://artscene.textfiles.com/ansi/unsorted/p_abdul.ans\nhttp://artscene.textfiles.com/ansi/unsorted/panic!.ans\nhttp://artscene.textfiles.com/ansi/unsorted/paris.ans\nhttp://artscene.textfiles.com/ansi/unsorted/parrot.ans\nhttp://artscene.textfiles.com/ansi/unsorted/parrot2.ans\nhttp://artscene.textfiles.com/ansi/unsorted/passiton.ans\nhttp://artscene.textfiles.com/ansi/unsorted/patriot.ans\nhttp://artscene.textfiles.com/ansi/unsorted/paul_t's.ans\nhttp://artscene.textfiles.com/ansi/unsorted/pcbbs.ans\nhttp://artscene.textfiles.com/ansi/unsorted/pcnet.ans\nhttp://artscene.textfiles.com/ansi/unsorted/pcx-gif.ans\nhttp://artscene.textfiles.com/ansi/unsorted/pegasus.ans\nhttp://artscene.textfiles.com/ansi/unsorted/pencils.ans\nhttp://artscene.textfiles.com/ansi/unsorted/phone.ans\nhttp://artscene.textfiles.com/ansi/unsorted/picard.ans\nhttp://artscene.textfiles.com/ansi/unsorted/picard2.ans\nhttp://artscene.textfiles.com/ansi/unsorted/pink1.ans\nhttp://artscene.textfiles.com/ansi/unsorted/pink2.ans\nhttp://artscene.textfiles.com/ansi/unsorted/pioneer.ans\nhttp://artscene.textfiles.com/ansi/unsorted/pirate.ans\nhttp://artscene.textfiles.com/ansi/unsorted/pistons.ans\nhttp://artscene.textfiles.com/ansi/unsorted/plagrism.ans\nhttp://artscene.textfiles.com/ansi/unsorted/pledge.ans\nhttp://artscene.textfiles.com/ansi/unsorted/plnetzed.ans\nhttp://artscene.textfiles.com/ansi/unsorted/poison.ans\nhttp://artscene.textfiles.com/ansi/unsorted/polly.ans\nhttp://artscene.textfiles.com/ansi/unsorted/pool.ans\nhttp://artscene.textfiles.com/ansi/unsorted/poorboys.ans\nhttp://artscene.textfiles.com/ansi/unsorted/practice.ans\nhttp://artscene.textfiles.com/ansi/unsorted/prelogon.ans\nhttp://artscene.textfiles.com/ansi/unsorted/prelogon3.ans\nhttp://artscene.textfiles.com/ansi/unsorted/propday.ans\nhttp://artscene.textfiles.com/ansi/unsorted/propnite.ans\nhttp://artscene.textfiles.com/ansi/unsorted/ps.ans\nhttp://artscene.textfiles.com/ansi/unsorted/pseudo.ans\nhttp://artscene.textfiles.com/ansi/unsorted/pseudor1.ans\nhttp://artscene.textfiles.com/ansi/unsorted/psyc.ans\nhttp://artscene.textfiles.com/ansi/unsorted/psycblod.ans\nhttp://artscene.textfiles.com/ansi/unsorted/psych.ans\nhttp://artscene.textfiles.com/ansi/unsorted/psyctaxi.ans\nhttp://artscene.textfiles.com/ansi/unsorted/psylocke.ans\nhttp://artscene.textfiles.com/ansi/unsorted/pumpkin.ans\nhttp://artscene.textfiles.com/ansi/unsorted/quagmire.ans\nhttp://artscene.textfiles.com/ansi/unsorted/quilt.ans\nhttp://artscene.textfiles.com/ansi/unsorted/qwkdn.ans\nhttp://artscene.textfiles.com/ansi/unsorted/qwkup.ans\nhttp://artscene.textfiles.com/ansi/unsorted/r_rabbit.ans\nhttp://artscene.textfiles.com/ansi/unsorted/r_tech1.ans\nhttp://artscene.textfiles.com/ansi/unsorted/r_tech2.ans\nhttp://artscene.textfiles.com/ansi/unsorted/r_tech3.ans\nhttp://artscene.textfiles.com/ansi/unsorted/r_tech4.ans\nhttp://artscene.textfiles.com/ansi/unsorted/r_tech5.ans\nhttp://artscene.textfiles.com/ansi/unsorted/racoon.ans\nhttp://artscene.textfiles.com/ansi/unsorted/radio.ans\nhttp://artscene.textfiles.com/ansi/unsorted/raid.ans\nhttp://artscene.textfiles.com/ansi/unsorted/raiders.ans\nhttp://artscene.textfiles.com/ansi/unsorted/rainbow.ans\nhttp://artscene.textfiles.com/ansi/unsorted/rall.ans\nhttp://artscene.textfiles.com/ansi/unsorted/rallxmas.ans\nhttp://artscene.textfiles.com/ansi/unsorted/ramsland.ans\nhttp://artscene.textfiles.com/ansi/unsorted/rangers.ans\nhttp://artscene.textfiles.com/ansi/unsorted/raphael.ans\nhttp://artscene.textfiles.com/ansi/unsorted/rathead.ans\nhttp://artscene.textfiles.com/ansi/unsorted/ratio.ans\nhttp://artscene.textfiles.com/ansi/unsorted/ratt.ans\nhttp://artscene.textfiles.com/ansi/unsorted/razoredg.ans\nhttp://artscene.textfiles.com/ansi/unsorted/rb&wf.ans\nhttp://artscene.textfiles.com/ansi/unsorted/rbow.ans\nhttp://artscene.textfiles.com/ansi/unsorted/rca.ans\nhttp://artscene.textfiles.com/ansi/unsorted/reach.ans\nhttp://artscene.textfiles.com/ansi/unsorted/read.ans\nhttp://artscene.textfiles.com/ansi/unsorted/read1.ans\nhttp://artscene.textfiles.com/ansi/unsorted/readme.ans\nhttp://artscene.textfiles.com/ansi/unsorted/reaper.ans\nhttp://artscene.textfiles.com/ansi/unsorted/red.ans\nhttp://artscene.textfiles.com/ansi/unsorted/red04.ans\nhttp://artscene.textfiles.com/ansi/unsorted/redline.ans\nhttp://artscene.textfiles.com/ansi/unsorted/reflctns.ans\nhttp://artscene.textfiles.com/ansi/unsorted/religion.ans\nhttp://artscene.textfiles.com/ansi/unsorted/rev.ans\nhttp://artscene.textfiles.com/ansi/unsorted/rfc.ans\nhttp://artscene.textfiles.com/ansi/unsorted/rffwks.ans\nhttp://artscene.textfiles.com/ansi/unsorted/riker.ans\nhttp://artscene.textfiles.com/ansi/unsorted/ring-god.ans\nhttp://artscene.textfiles.com/ansi/unsorted/ring1991.ans\nhttp://artscene.textfiles.com/ansi/unsorted/ringmstr.ans\nhttp://artscene.textfiles.com/ansi/unsorted/rinosoft.ans\nhttp://artscene.textfiles.com/ansi/unsorted/rip-opus.ans\nhttp://artscene.textfiles.com/ansi/unsorted/rip_opus.ans\nhttp://artscene.textfiles.com/ansi/unsorted/ristuff2.ans\nhttp://artscene.textfiles.com/ansi/unsorted/river.ans\nhttp://artscene.textfiles.com/ansi/unsorted/rknight.ans\nhttp://artscene.textfiles.com/ansi/unsorted/rnd-mtn.ans\nhttp://artscene.textfiles.com/ansi/unsorted/rnd_mtn.ans\nhttp://artscene.textfiles.com/ansi/unsorted/rob.ans\nhttp://artscene.textfiles.com/ansi/unsorted/robbie.ans\nhttp://artscene.textfiles.com/ansi/unsorted/robocop.ans\nhttp://artscene.textfiles.com/ansi/unsorted/robopen.ans\nhttp://artscene.textfiles.com/ansi/unsorted/robsroom.ans\nhttp://artscene.textfiles.com/ansi/unsorted/rocky01.ans\nhttp://artscene.textfiles.com/ansi/unsorted/rocky06.ans\nhttp://artscene.textfiles.com/ansi/unsorted/rocky07.ans\nhttp://artscene.textfiles.com/ansi/unsorted/rodehous.ans\nhttp://artscene.textfiles.com/ansi/unsorted/rodntman.ans\nhttp://artscene.textfiles.com/ansi/unsorted/ron_sig.ans\nhttp://artscene.textfiles.com/ansi/unsorted/ronsroom.ans\nhttp://artscene.textfiles.com/ansi/unsorted/rooster.ans\nhttp://artscene.textfiles.com/ansi/unsorted/rummid.ans\nhttp://artscene.textfiles.com/ansi/unsorted/rumorm.ans\nhttp://artscene.textfiles.com/ansi/unsorted/rumran.ans\nhttp://artscene.textfiles.com/ansi/unsorted/rumsrt.ans\nhttp://artscene.textfiles.com/ansi/unsorted/runtsmad.ans\nhttp://artscene.textfiles.com/ansi/unsorted/rv_asyl.ans\nhttp://artscene.textfiles.com/ansi/unsorted/rv_rsun.ans\nhttp://artscene.textfiles.com/ansi/unsorted/rvps.ans\nhttp://artscene.textfiles.com/ansi/unsorted/ryans118.ans\nhttp://artscene.textfiles.com/ansi/unsorted/ryans120.ans\nhttp://artscene.textfiles.com/ansi/unsorted/ryans123.ans\nhttp://artscene.textfiles.com/ansi/unsorted/ryans20.ans\nhttp://artscene.textfiles.com/ansi/unsorted/ryans21.ans\nhttp://artscene.textfiles.com/ansi/unsorted/ryans22.ans\nhttp://artscene.textfiles.com/ansi/unsorted/ryans23.ans\nhttp://artscene.textfiles.com/ansi/unsorted/ryans26.ans\nhttp://artscene.textfiles.com/ansi/unsorted/ryans41.ans\nhttp://artscene.textfiles.com/ansi/unsorted/ryans43.ans\nhttp://artscene.textfiles.com/ansi/unsorted/ryans44.ans\nhttp://artscene.textfiles.com/ansi/unsorted/ryans45.ans\nhttp://artscene.textfiles.com/ansi/unsorted/ryans46.ans\nhttp://artscene.textfiles.com/ansi/unsorted/ryans47.ans\nhttp://artscene.textfiles.com/ansi/unsorted/ryans48.ans\nhttp://artscene.textfiles.com/ansi/unsorted/ryans49.ans\nhttp://artscene.textfiles.com/ansi/unsorted/ryans50.ans\nhttp://artscene.textfiles.com/ansi/unsorted/ryans52.ans\nhttp://artscene.textfiles.com/ansi/unsorted/ryans53.ans\nhttp://artscene.textfiles.com/ansi/unsorted/ryans54.ans\nhttp://artscene.textfiles.com/ansi/unsorted/ryans55.ans\nhttp://artscene.textfiles.com/ansi/unsorted/ryans56.ans\nhttp://artscene.textfiles.com/ansi/unsorted/ryans59.ans\nhttp://artscene.textfiles.com/ansi/unsorted/ryans63.ans\nhttp://artscene.textfiles.com/ansi/unsorted/ryans64.ans\nhttp://artscene.textfiles.com/ansi/unsorted/ryans67.ans\nhttp://artscene.textfiles.com/ansi/unsorted/ryans69.ans\nhttp://artscene.textfiles.com/ansi/unsorted/ryans70.ans\nhttp://artscene.textfiles.com/ansi/unsorted/ryans72.ans\nhttp://artscene.textfiles.com/ansi/unsorted/ryans75.ans\nhttp://artscene.textfiles.com/ansi/unsorted/ryans77.ans\nhttp://artscene.textfiles.com/ansi/unsorted/ryans78.ans\nhttp://artscene.textfiles.com/ansi/unsorted/ryans79.ans\nhttp://artscene.textfiles.com/ansi/unsorted/ryans80.ans\nhttp://artscene.textfiles.com/ansi/unsorted/s_dan.ans\nhttp://artscene.textfiles.com/ansi/unsorted/sa_spurs.ans\nhttp://artscene.textfiles.com/ansi/unsorted/sad_cafe.ans\nhttp://artscene.textfiles.com/ansi/unsorted/safeaven.ans\nhttp://artscene.textfiles.com/ansi/unsorted/sally.ans\nhttp://artscene.textfiles.com/ansi/unsorted/salute.ans\nhttp://artscene.textfiles.com/ansi/unsorted/samurai.ans\nhttp://artscene.textfiles.com/ansi/unsorted/san_fran.ans\nhttp://artscene.textfiles.com/ansi/unsorted/sand.ans\nhttp://artscene.textfiles.com/ansi/unsorted/sansim.ans\nhttp://artscene.textfiles.com/ansi/unsorted/santuary.ans\nhttp://artscene.textfiles.com/ansi/unsorted/sb1990.ans\nhttp://artscene.textfiles.com/ansi/unsorted/sb_xxv.ans\nhttp://artscene.textfiles.com/ansi/unsorted/scenic-1.ans\nhttp://artscene.textfiles.com/ansi/unsorted/scenic-2.ans\nhttp://artscene.textfiles.com/ansi/unsorted/scroll.ans\nhttp://artscene.textfiles.com/ansi/unsorted/scud.ans\nhttp://artscene.textfiles.com/ansi/unsorted/sdoorsm.ans\nhttp://artscene.textfiles.com/ansi/unsorted/seasonsg.ans\nhttp://artscene.textfiles.com/ansi/unsorted/settings.ans\nhttp://artscene.textfiles.com/ansi/unsorted/sf49ers.ans\nhttp://artscene.textfiles.com/ansi/unsorted/shield.ans\nhttp://artscene.textfiles.com/ansi/unsorted/ship.ans\nhttp://artscene.textfiles.com/ansi/unsorted/ships.ans\nhttp://artscene.textfiles.com/ansi/unsorted/shoal.ans\nhttp://artscene.textfiles.com/ansi/unsorted/showbbs.ans\nhttp://artscene.textfiles.com/ansi/unsorted/shuttle2.ans\nhttp://artscene.textfiles.com/ansi/unsorted/shuttle22.ans\nhttp://artscene.textfiles.com/ansi/unsorted/shuttle3.ans\nhttp://artscene.textfiles.com/ansi/unsorted/shwone.ans\nhttp://artscene.textfiles.com/ansi/unsorted/shwrum.ans\nhttp://artscene.textfiles.com/ansi/unsorted/sillydt9.ans\nhttp://artscene.textfiles.com/ansi/unsorted/simulat1.ans\nhttp://artscene.textfiles.com/ansi/unsorted/sineade.ans\nhttp://artscene.textfiles.com/ansi/unsorted/sirus.ans\nhttp://artscene.textfiles.com/ansi/unsorted/sixglag.ans\nhttp://artscene.textfiles.com/ansi/unsorted/skism.ans\nhttp://artscene.textfiles.com/ansi/unsorted/skittles.ans\nhttp://artscene.textfiles.com/ansi/unsorted/skoal.ans\nhttp://artscene.textfiles.com/ansi/unsorted/skull.ans\nhttp://artscene.textfiles.com/ansi/unsorted/skynyrd.ans\nhttp://artscene.textfiles.com/ansi/unsorted/sm-kids.ans\nhttp://artscene.textfiles.com/ansi/unsorted/smiledr.ans\nhttp://artscene.textfiles.com/ansi/unsorted/smurfbnk.ans\nhttp://artscene.textfiles.com/ansi/unsorted/snoopycm.ans\nhttp://artscene.textfiles.com/ansi/unsorted/society.ans\nhttp://artscene.textfiles.com/ansi/unsorted/source.ans\nhttp://artscene.textfiles.com/ansi/unsorted/spacecom.ans\nhttp://artscene.textfiles.com/ansi/unsorted/spacedoc.ans\nhttp://artscene.textfiles.com/ansi/unsorted/spaces1.ans\nhttp://artscene.textfiles.com/ansi/unsorted/spaces2.ans\nhttp://artscene.textfiles.com/ansi/unsorted/spaces3.ans\nhttp://artscene.textfiles.com/ansi/unsorted/spaces4.ans\nhttp://artscene.textfiles.com/ansi/unsorted/spam.ans\nhttp://artscene.textfiles.com/ansi/unsorted/sparta.ans\nhttp://artscene.textfiles.com/ansi/unsorted/spdman.ans\nhttp://artscene.textfiles.com/ansi/unsorted/spectrum.ans\nhttp://artscene.textfiles.com/ansi/unsorted/speeder.ans\nhttp://artscene.textfiles.com/ansi/unsorted/spidrman.ans\nhttp://artscene.textfiles.com/ansi/unsorted/spock.ans\nhttp://artscene.textfiles.com/ansi/unsorted/spock2.ans\nhttp://artscene.textfiles.com/ansi/unsorted/sponsorm.ans\nhttp://artscene.textfiles.com/ansi/unsorted/sprngbrk.ans\nhttp://artscene.textfiles.com/ansi/unsorted/spt_trps.ans\nhttp://artscene.textfiles.com/ansi/unsorted/spuds.ans\nhttp://artscene.textfiles.com/ansi/unsorted/sspcb.ans\nhttp://artscene.textfiles.com/ansi/unsorted/st-awol.ans\nhttp://artscene.textfiles.com/ansi/unsorted/stallion.ans\nhttp://artscene.textfiles.com/ansi/unsorted/stand.ans\nhttp://artscene.textfiles.com/ansi/unsorted/starbase.ans\nhttp://artscene.textfiles.com/ansi/unsorted/starbrst.ans\nhttp://artscene.textfiles.com/ansi/unsorted/startrek.ans\nhttp://artscene.textfiles.com/ansi/unsorted/starwars.ans\nhttp://artscene.textfiles.com/ansi/unsorted/stimpy.ans\nhttp://artscene.textfiles.com/ansi/unsorted/sting.ans\nhttp://artscene.textfiles.com/ansi/unsorted/stly_dan.ans\nhttp://artscene.textfiles.com/ansi/unsorted/strburst.ans\nhttp://artscene.textfiles.com/ansi/unsorted/stuff.ans\nhttp://artscene.textfiles.com/ansi/unsorted/stupides.ans\nhttp://artscene.textfiles.com/ansi/unsorted/styx.ans\nhttp://artscene.textfiles.com/ansi/unsorted/styx2.ans\nhttp://artscene.textfiles.com/ansi/unsorted/subsend.ans\nhttp://artscene.textfiles.com/ansi/unsorted/subsmid.ans\nhttp://artscene.textfiles.com/ansi/unsorted/subsstar.ans\nhttp://artscene.textfiles.com/ansi/unsorted/sugrbear.ans\nhttp://artscene.textfiles.com/ansi/unsorted/summit.ans\nhttp://artscene.textfiles.com/ansi/unsorted/sunshine.ans\nhttp://artscene.textfiles.com/ansi/unsorted/sup_trps.ans\nhttp://artscene.textfiles.com/ansi/unsorted/supbowl.ans\nhttp://artscene.textfiles.com/ansi/unsorted/supreme1.ans\nhttp://artscene.textfiles.com/ansi/unsorted/supreme3.ans\nhttp://artscene.textfiles.com/ansi/unsorted/supreme4.ans\nhttp://artscene.textfiles.com/ansi/unsorted/symetric.ans\nhttp://artscene.textfiles.com/ansi/unsorted/synccopy.ans\nhttp://artscene.textfiles.com/ansi/unsorted/syncro.ans\nhttp://artscene.textfiles.com/ansi/unsorted/syscon.ans\nhttp://artscene.textfiles.com/ansi/unsorted/sysopm.ans\nhttp://artscene.textfiles.com/ansi/unsorted/sysptrd.ans\nhttp://artscene.textfiles.com/ansi/unsorted/t-chest.ans\nhttp://artscene.textfiles.com/ansi/unsorted/tardis.ans\nhttp://artscene.textfiles.com/ansi/unsorted/target.ans\nhttp://artscene.textfiles.com/ansi/unsorted/teamwork.ans\nhttp://artscene.textfiles.com/ansi/unsorted/temp.ans\nhttp://artscene.textfiles.com/ansi/unsorted/test.ans\nhttp://artscene.textfiles.com/ansi/unsorted/test_pat.ans\nhttp://artscene.textfiles.com/ansi/unsorted/tg.ans\nhttp://artscene.textfiles.com/ansi/unsorted/thanks.ans\nhttp://artscene.textfiles.com/ansi/unsorted/the_duke.ans\nhttp://artscene.textfiles.com/ansi/unsorted/the_wood.ans\nhttp://artscene.textfiles.com/ansi/unsorted/thermo.ans\nhttp://artscene.textfiles.com/ansi/unsorted/thirst.ans\nhttp://artscene.textfiles.com/ansi/unsorted/thoughts.ans\nhttp://artscene.textfiles.com/ansi/unsorted/throbb.ans\nhttp://artscene.textfiles.com/ansi/unsorted/thumper.ans\nhttp://artscene.textfiles.com/ansi/unsorted/tigger.ans\nhttp://artscene.textfiles.com/ansi/unsorted/timebend.ans\nhttp://artscene.textfiles.com/ansi/unsorted/timeclok.ans\nhttp://artscene.textfiles.com/ansi/unsorted/tinyeggp.ans\nhttp://artscene.textfiles.com/ansi/unsorted/title.ans\nhttp://artscene.textfiles.com/ansi/unsorted/tompetty.ans\nhttp://artscene.textfiles.com/ansi/unsorted/toms.ans\nhttp://artscene.textfiles.com/ansi/unsorted/toon.ans\nhttp://artscene.textfiles.com/ansi/unsorted/topgun.ans\nhttp://artscene.textfiles.com/ansi/unsorted/topten.ans\nhttp://artscene.textfiles.com/ansi/unsorted/topusers.ans\nhttp://artscene.textfiles.com/ansi/unsorted/tree2.ans\nhttp://artscene.textfiles.com/ansi/unsorted/treffins.ans\nhttp://artscene.textfiles.com/ansi/unsorted/trivia1.ans\nhttp://artscene.textfiles.com/ansi/unsorted/truck.ans\nhttp://artscene.textfiles.com/ansi/unsorted/tumble.ans\nhttp://artscene.textfiles.com/ansi/unsorted/turkey.ans\nhttp://artscene.textfiles.com/ansi/unsorted/tw_2002.ans\nhttp://artscene.textfiles.com/ansi/unsorted/twar2002.ans\nhttp://artscene.textfiles.com/ansi/unsorted/ueditm.ans\nhttp://artscene.textfiles.com/ansi/unsorted/underlay.ans\nhttp://artscene.textfiles.com/ansi/unsorted/unicorn.ans\nhttp://artscene.textfiles.com/ansi/unsorted/us_eagle.ans\nhttp://artscene.textfiles.com/ansi/unsorted/usa_tank.ans\nhttp://artscene.textfiles.com/ansi/unsorted/usa_trp.ans\nhttp://artscene.textfiles.com/ansi/unsorted/usered.ans\nhttp://artscene.textfiles.com/ansi/unsorted/userend.ans\nhttp://artscene.textfiles.com/ansi/unsorted/usermid.ans\nhttp://artscene.textfiles.com/ansi/unsorted/userstar.ans\nhttp://artscene.textfiles.com/ansi/unsorted/uso_50.ans\nhttp://artscene.textfiles.com/ansi/unsorted/usr_hst.ans\nhttp://artscene.textfiles.com/ansi/unsorted/v-e.ans\nhttp://artscene.textfiles.com/ansi/unsorted/vacation.ans\nhttp://artscene.textfiles.com/ansi/unsorted/valentin.ans\nhttp://artscene.textfiles.com/ansi/unsorted/vampire.ans\nhttp://artscene.textfiles.com/ansi/unsorted/vanhalen.ans\nhttp://artscene.textfiles.com/ansi/unsorted/vday.ans\nhttp://artscene.textfiles.com/ansi/unsorted/veltins.ans\nhttp://artscene.textfiles.com/ansi/unsorted/vervans.ans\nhttp://artscene.textfiles.com/ansi/unsorted/veterans.ans\nhttp://artscene.textfiles.com/ansi/unsorted/vision.ans\nhttp://artscene.textfiles.com/ansi/unsorted/void01.ans\nhttp://artscene.textfiles.com/ansi/unsorted/void2.ans\nhttp://artscene.textfiles.com/ansi/unsorted/volcano.ans\nhttp://artscene.textfiles.com/ansi/unsorted/vote-2.ans\nhttp://artscene.textfiles.com/ansi/unsorted/votescan.ans\nhttp://artscene.textfiles.com/ansi/unsorted/votingm.ans\nhttp://artscene.textfiles.com/ansi/unsorted/vsysopm.ans\nhttp://artscene.textfiles.com/ansi/unsorted/vwbus.ans\nhttp://artscene.textfiles.com/ansi/unsorted/ware.ans\nhttp://artscene.textfiles.com/ansi/unsorted/warmask.ans\nhttp://artscene.textfiles.com/ansi/unsorted/warnings.ans\nhttp://artscene.textfiles.com/ansi/unsorted/warp2.ans\nhttp://artscene.textfiles.com/ansi/unsorted/watrmeln.ans\nhttp://artscene.textfiles.com/ansi/unsorted/we_r_-1.ans\nhttp://artscene.textfiles.com/ansi/unsorted/weapons.ans\nhttp://artscene.textfiles.com/ansi/unsorted/welcome.ans\nhttp://artscene.textfiles.com/ansi/unsorted/welcome1.ans\nhttp://artscene.textfiles.com/ansi/unsorted/welcomep.ans\nhttp://artscene.textfiles.com/ansi/unsorted/welhome.ans\nhttp://artscene.textfiles.com/ansi/unsorted/whitney.ans\nhttp://artscene.textfiles.com/ansi/unsorted/whitxmas.ans\nhttp://artscene.textfiles.com/ansi/unsorted/who_sane.ans\nhttp://artscene.textfiles.com/ansi/unsorted/whthouse.ans\nhttp://artscene.textfiles.com/ansi/unsorted/whtsnk.ans\nhttp://artscene.textfiles.com/ansi/unsorted/windows.ans\nhttp://artscene.textfiles.com/ansi/unsorted/wire-man.ans\nhttp://artscene.textfiles.com/ansi/unsorted/wire2.ans\nhttp://artscene.textfiles.com/ansi/unsorted/wolvrine.ans\nhttp://artscene.textfiles.com/ansi/unsorted/wonder.ans\nhttp://artscene.textfiles.com/ansi/unsorted/works.ans\nhttp://artscene.textfiles.com/ansi/unsorted/wow.ans\nhttp://artscene.textfiles.com/ansi/unsorted/wrldtree.ans\nhttp://artscene.textfiles.com/ansi/unsorted/wtrflow.ans\nhttp://artscene.textfiles.com/ansi/unsorted/wuppet.ans\nhttp://artscene.textfiles.com/ansi/unsorted/wwans57.ans\nhttp://artscene.textfiles.com/ansi/unsorted/wwans61.ans\nhttp://artscene.textfiles.com/ansi/unsorted/wwans63.ans\nhttp://artscene.textfiles.com/ansi/unsorted/wwans67.ans\nhttp://artscene.textfiles.com/ansi/unsorted/wwans68.ans\nhttp://artscene.textfiles.com/ansi/unsorted/wwans69.ans\nhttp://artscene.textfiles.com/ansi/unsorted/wwans70.ans\nhttp://artscene.textfiles.com/ansi/unsorted/wwans71.ans\nhttp://artscene.textfiles.com/ansi/unsorted/x_rated.ans\nhttp://artscene.textfiles.com/ansi/unsorted/xaminm.ans\nhttp://artscene.textfiles.com/ansi/unsorted/xmas1.ans\nhttp://artscene.textfiles.com/ansi/unsorted/xmasfwks.ans\nhttp://artscene.textfiles.com/ansi/unsorted/xmaswish.ans\nhttp://artscene.textfiles.com/ansi/unsorted/yes.ans\nhttp://artscene.textfiles.com/ansi/unsorted/z_end.ans\nhttp://artscene.textfiles.com/ansi/unsorted/zap6.ans\nhttp://artscene.textfiles.com/ansi/unsorted/zbfbbs.ans\nhttp://artscene.textfiles.com/ansi/unsorted/zbfbbs2.ans\nhttp://artscene.textfiles.com/ansi/unsorted/zbfbbs4.ans\nhttp://artscene.textfiles.com/ansi/unsorted/zbfbbs6.ans\nhttp://artscene.textfiles.com/ansi/unsorted/zbfbbs7.ans\nhttp://artscene.textfiles.com/ansi/unsorted/zbfbbs8.ans\nhttp://artscene.textfiles.com/ansi/unsorted/zbflbbs3.ans\nhttp://artscene.textfiles.com/ansi/unsorted/zblbbf5.ans\nhttp://artscene.textfiles.com/ansi/unsorted/zbye.ans\nhttp://artscene.textfiles.com/ansi/unsorted/ze-ug.ans\nhttp://artscene.textfiles.com/ansi/unsorted/zed_bbs.ans\nhttp://artscene.textfiles.com/ansi/unsorted/zippy.ans\nhttp://artscene.textfiles.com/ansi/unsorted/zoom_sno.ans\nhttp://artscene.textfiles.com/ansi/unsorted/zwelcome.ans\nhttp://artscene.textfiles.com/ansi/bbs/DAWARREN/1000.ans\nhttp://artscene.textfiles.com/ansi/bbs/DAWARREN/12days01.ans\nhttp://artscene.textfiles.com/ansi/bbs/DAWARREN/12days02.ans\nhttp://artscene.textfiles.com/ansi/bbs/DAWARREN/12days03.ans\nhttp://artscene.textfiles.com/ansi/bbs/DAWARREN/12days04.ans\nhttp://artscene.textfiles.com/ansi/bbs/DAWARREN/12days05.ans\nhttp://artscene.textfiles.com/ansi/bbs/DAWARREN/12days07.ans\nhttp://artscene.textfiles.com/ansi/bbs/DAWARREN/12days08.ans\nhttp://artscene.textfiles.com/ansi/bbs/DAWARREN/12days09.ans\nhttp://artscene.textfiles.com/ansi/bbs/DAWARREN/12days10.ans\nhttp://artscene.textfiles.com/ansi/bbs/DAWARREN/12days11.ans\nhttp://artscene.textfiles.com/ansi/bbs/DAWARREN/12days12.ans\nhttp://artscene.textfiles.com/ansi/bbs/DAWARREN/12nodes.ans\nhttp://artscene.textfiles.com/ansi/bbs/DAWARREN/1994.ans\nhttp://artscene.textfiles.com/ansi/bbs/DAWARREN/advisory.ans\nhttp://artscene.textfiles.com/ansi/bbs/DAWARREN/aprlfool.ans\nhttp://artscene.textfiles.com/ansi/bbs/DAWARREN/baduser.ans\nhttp://artscene.textfiles.com/ansi/bbs/DAWARREN/biker.ans\nhttp://artscene.textfiles.com/ansi/bbs/DAWARREN/billtcat2.ans\nhttp://artscene.textfiles.com/ansi/bbs/DAWARREN/blendshi.ans\nhttp://artscene.textfiles.com/ansi/bbs/DAWARREN/bsi.ans\nhttp://artscene.textfiles.com/ansi/bbs/DAWARREN/bull1.ans\nhttp://artscene.textfiles.com/ansi/bbs/DAWARREN/bull10.ans\nhttp://artscene.textfiles.com/ansi/bbs/DAWARREN/bull13.ans\nhttp://artscene.textfiles.com/ansi/bbs/DAWARREN/bull3.ans\nhttp://artscene.textfiles.com/ansi/bbs/DAWARREN/bull4.ans\nhttp://artscene.textfiles.com/ansi/bbs/DAWARREN/bull5.ans\nhttp://artscene.textfiles.com/ansi/bbs/DAWARREN/bull6.ans\nhttp://artscene.textfiles.com/ansi/bbs/DAWARREN/bull9.ans\nhttp://artscene.textfiles.com/ansi/bbs/DAWARREN/bulletin.ans\nhttp://artscene.textfiles.com/ansi/bbs/DAWARREN/californ.ans\nhttp://artscene.textfiles.com/ansi/bbs/DAWARREN/camping.ans\nhttp://artscene.textfiles.com/ansi/bbs/DAWARREN/clr10000.ans\nhttp://artscene.textfiles.com/ansi/bbs/DAWARREN/columbus.ans\nhttp://artscene.textfiles.com/ansi/bbs/DAWARREN/cool1.ans\nhttp://artscene.textfiles.com/ansi/bbs/DAWARREN/devilla.ans\nhttp://artscene.textfiles.com/ansi/bbs/DAWARREN/dndahole.ans\nhttp://artscene.textfiles.com/ansi/bbs/DAWARREN/dominat.ans\nhttp://artscene.textfiles.com/ansi/bbs/DAWARREN/doons.ans\nhttp://artscene.textfiles.com/ansi/bbs/DAWARREN/dwapdcjc.ans\nhttp://artscene.textfiles.com/ansi/bbs/DAWARREN/dwhsn.ans\nhttp://artscene.textfiles.com/ansi/bbs/DAWARREN/dwsml!.ans\nhttp://artscene.textfiles.com/ansi/bbs/DAWARREN/egg.ans\nhttp://artscene.textfiles.com/ansi/bbs/DAWARREN/fathers.ans\nhttp://artscene.textfiles.com/ansi/bbs/DAWARREN/features.ans\nhttp://artscene.textfiles.com/ansi/bbs/DAWARREN/field.ans\nhttp://artscene.textfiles.com/ansi/bbs/DAWARREN/finnegan.ans\nhttp://artscene.textfiles.com/ansi/bbs/DAWARREN/floydhsn.ans\nhttp://artscene.textfiles.com/ansi/bbs/DAWARREN/foodwars.ans\nhttp://artscene.textfiles.com/ansi/bbs/DAWARREN/forbes.ans\nhttp://artscene.textfiles.com/ansi/bbs/DAWARREN/funyun.ans\nhttp://artscene.textfiles.com/ansi/bbs/DAWARREN/gdi.ans\nhttp://artscene.textfiles.com/ansi/bbs/DAWARREN/grill.ans\nhttp://artscene.textfiles.com/ansi/bbs/DAWARREN/gutteral.ans\nhttp://artscene.textfiles.com/ansi/bbs/DAWARREN/hack2ftr.ans\nhttp://artscene.textfiles.com/ansi/bbs/DAWARREN/hallowee.ans\nhttp://artscene.textfiles.com/ansi/bbs/DAWARREN/hillblly.ans\nhttp://artscene.textfiles.com/ansi/bbs/DAWARREN/history1.ans\nhttp://artscene.textfiles.com/ansi/bbs/DAWARREN/history4.ans\nhttp://artscene.textfiles.com/ansi/bbs/DAWARREN/hitch.ans\nhttp://artscene.textfiles.com/ansi/bbs/DAWARREN/jetson.ans\nhttp://artscene.textfiles.com/ansi/bbs/DAWARREN/jiminy.ans\nhttp://artscene.textfiles.com/ansi/bbs/DAWARREN/kookbook.ans\nhttp://artscene.textfiles.com/ansi/bbs/DAWARREN/landspam.ans\nhttp://artscene.textfiles.com/ansi/bbs/DAWARREN/logquote.ans\nhttp://artscene.textfiles.com/ansi/bbs/DAWARREN/main.ans\nhttp://artscene.textfiles.com/ansi/bbs/DAWARREN/main1.ans\nhttp://artscene.textfiles.com/ansi/bbs/DAWARREN/measure.ans\nhttp://artscene.textfiles.com/ansi/bbs/DAWARREN/memorial.ans\nhttp://artscene.textfiles.com/ansi/bbs/DAWARREN/mole.ans\nhttp://artscene.textfiles.com/ansi/bbs/DAWARREN/moonieii.ans\nhttp://artscene.textfiles.com/ansi/bbs/DAWARREN/msg1.ans\nhttp://artscene.textfiles.com/ansi/bbs/DAWARREN/mst3k.ans\nhttp://artscene.textfiles.com/ansi/bbs/DAWARREN/news.ans\nhttp://artscene.textfiles.com/ansi/bbs/DAWARREN/nextgen.ans\nhttp://artscene.textfiles.com/ansi/bbs/DAWARREN/oldfarts.ans\nhttp://artscene.textfiles.com/ansi/bbs/DAWARREN/oliver.ans\nhttp://artscene.textfiles.com/ansi/bbs/DAWARREN/patrick.ans\nhttp://artscene.textfiles.com/ansi/bbs/DAWARREN/pigbarf.ans\nhttp://artscene.textfiles.com/ansi/bbs/DAWARREN/pschdlia.ans\nhttp://artscene.textfiles.com/ansi/bbs/DAWARREN/rosh.ans\nhttp://artscene.textfiles.com/ansi/bbs/DAWARREN/sale.ans\nhttp://artscene.textfiles.com/ansi/bbs/DAWARREN/santline.ans\nhttp://artscene.textfiles.com/ansi/bbs/DAWARREN/sesame.ans\nhttp://artscene.textfiles.com/ansi/bbs/DAWARREN/sillytng.ans\nhttp://artscene.textfiles.com/ansi/bbs/DAWARREN/slug.ans\nhttp://artscene.textfiles.com/ansi/bbs/DAWARREN/spaminva.ans\nhttp://artscene.textfiles.com/ansi/bbs/DAWARREN/sysops.ans\nhttp://artscene.textfiles.com/ansi/bbs/DAWARREN/tvshoot.ans\nhttp://artscene.textfiles.com/ansi/bbs/DAWARREN/veteran.ans\nhttp://artscene.textfiles.com/ansi/bbs/DAWARREN/vomit.ans\nhttp://artscene.textfiles.com/ansi/bbs/DAWARREN/wectlep2.ans\nhttp://artscene.textfiles.com/ansi/bbs/DAWARREN/wectolep.ans\nhttp://artscene.textfiles.com/ansi/bbs/DAWARREN/wectolp2.ans\nhttp://artscene.textfiles.com/ansi/bbs/DAWARREN/woodstok.ans\n"
  },
  {
    "path": "example/ansi-viewer/index.js",
    "content": "/**\n * ansi-viewer\n * ANSI art viewer for node.\n * Copyright (c) 2015, Christopher Jeffrey and contributors (MIT License).\n * https://github.com/chjj/blessed\n */\n\nvar blessed = require('blessed')\n  , request = require('request')\n  , singlebyte = require('./singlebyte')\n  , fs = require('fs');\n\n// $ wget -r -o log --tries=10 'http://artscene.textfiles.com/ansi/'\n// $ grep 'http.*\\.ans$' log | awk '{ print $3 }' > ansi-art.list\n\nvar urls = fs.readFileSync(__dirname + '/ansi-art.list', 'utf8').trim().split('\\n');\n\nvar map = urls.reduce(function(map, url) {\n  map[/([^.\\/]+\\/[^.\\/]+)\\.ans$/.exec(url)[1]] = url;\n  return map;\n}, {});\n\nvar max = Object.keys(map).reduce(function(out, text) {\n  return Math.max(out, text.length);\n}, 0) + 6;\n\nvar screen = blessed.screen({\n  smartCSR: true,\n  dockBorders: true\n});\n\nvar art = blessed.terminal({\n  parent: screen,\n  left: 0,\n  top: 0,\n  height: 60,\n  // some are 78/80, some are 80/82\n  width: 82,\n  border: 'line',\n  tags: true,\n  label: ' {bold}{cyan-fg}ANSI Art{/cyan-fg}{/bold} (Drag Me) ',\n  handler: function() {},\n  draggable: true\n});\n\nvar list = blessed.list({\n  parent: screen,\n  label: ' {bold}{cyan-fg}Art List{/cyan-fg}{/bold} (Drag Me) ',\n  tags: true,\n  draggable: true,\n  top: 0,\n  right: 0,\n  width: max,\n  height: '50%',\n  keys: true,\n  vi: true,\n  mouse: true,\n  border: 'line',\n  scrollbar: {\n    ch: ' ',\n    track: {\n      bg: 'cyan'\n    },\n    style: {\n      inverse: true\n    }\n  },\n  style: {\n    item: {\n      hover: {\n        bg: 'blue'\n      }\n    },\n    selected: {\n      bg: 'blue',\n      bold: true\n    }\n  },\n  search: function(callback) {\n    prompt.input('Search:', '', function(err, value) {\n      if (err) return;\n      return callback(null, value);\n    });\n  }\n});\n\nvar status = blessed.box({\n  parent: screen,\n  bottom: 0,\n  right: 0,\n  height: 1,\n  width: 'shrink',\n  style: {\n    bg: 'blue'\n  },\n  content: 'Select your piece of ANSI art (`/` to search).'\n});\n\nvar loader = blessed.loading({\n  parent: screen,\n  top: 'center',\n  left: 'center',\n  height: 5,\n  align: 'center',\n  width: '50%',\n  tags: true,\n  hidden: true,\n  border: 'line'\n});\n\nvar msg = blessed.message({\n  parent: screen,\n  top: 'center',\n  left: 'center',\n  height: 'shrink',\n  width: '50%',\n  align: 'center',\n  tags: true,\n  hidden: true,\n  border: 'line'\n});\n\nvar prompt = blessed.prompt({\n  parent: screen,\n  top: 'center',\n  left: 'center',\n  height: 'shrink',\n  width: 'shrink',\n  keys: true,\n  vi: true,\n  mouse: true,\n  tags: true,\n  border: 'line',\n  hidden: true\n});\n\nlist.setItems(Object.keys(map));\n\nlist.on('select', function(el, selected) {\n  if (list._.rendering) return;\n\n  var name = el.getText();\n  var url = map[name];\n\n  status.setContent(url);\n\n  list._.rendering = true;\n  loader.load('Loading...');\n\n  request({\n    uri: url,\n    encoding: null\n  }, function(err, res, body) {\n    list._.rendering = false;\n    loader.stop();\n\n    if (err) {\n      return msg.error(err.message);\n    }\n\n    if (!body) {\n      return msg.error('No body.');\n    }\n\n    return cp437ToUtf8(body, function(err, body) {\n      if (err) {\n        return msg.error(err.message);\n      }\n\n      if (process.argv[2] === '--debug') {\n        var filename = name.replace(/\\//g, '.') + '.ans';\n        fs.writeFileSync(__dirname + '/' + filename, body);\n      }\n\n      // Remove text:\n      body = body.replace('Downloaded From P-80 International Information Systems 304-744-2253', '');\n\n      // Remove MCI codes:\n      body = body.replace(/%[A-Z0-9]{2}/g, '');\n\n      // ^A (SOH) seems to need to produce CRLF in some cases??\n      // body = body.replace(/\\x01/g, '\\r\\n');\n\n      // Reset and write the art:\n      art.term.reset();\n      art.term.write(body);\n      art.term.cursorHidden = true;\n\n      screen.render();\n\n      if (process.argv[2] === '--debug' || process.argv[2] === '--save') {\n        takeScreenshot(name);\n      }\n    });\n  });\n});\n\nlist.items.forEach(function(item, i) {\n  var text = item.getText();\n  item.setHover(map[text]);\n});\n\nlist.focus();\nlist.enterSelected(0);\n\nscreen.key('h', function() {\n  list.toggle();\n  if (list.visible) list.focus();\n});\n\nscreen.key('r', function() {\n  shuffle();\n});\n\nscreen.key('S-s', function() {\n  takeScreenshot(list.ritems[list.selected]);\n});\n\nscreen.key('s', function() {\n  slideshow();\n});\n\nscreen.key('q', function() {\n  return process.exit(0);\n});\n\nscreen.render();\n\n/**\n * Helpers\n */\n\n// https://github.com/chjj/blessed/issues/127\n// https://github.com/Mithgol/node-singlebyte\n\nfunction cp437ToUtf8(buf, callback) {\n  try {\n    return callback(null, singlebyte.bufToStr(buf, 'cp437'));\n  } catch (e) {\n    return callback(e);\n  }\n}\n\n// Animating ANSI art doesn't work for screenshots.\nvar ANIMATING = [\n  'bbs/void3',\n  'holiday/xmasfwks',\n  'unsorted/diver',\n  'unsorted/mash-chp',\n  'unsorted/ryans47',\n  'unsorted/xmasfwks'\n];\n\nfunction takeScreenshot(name) {\n  var filename = name.replace(/\\//g, '.') + '.ans.sgr';\n  var image;\n  // Animating art hangs terminal during screenshot as of right now.\n  if (~ANIMATING.indexOf(name)) {\n    image = blessed.element.prototype.screenshot.call(art,\n      0 - art.ileft, art.width - art.iright,\n      0 - art.itop, art.height - art.ibottom);\n  } else {\n    image = art.screenshot();\n  }\n  fs.writeFileSync(__dirname + '/' + filename, image);\n  msg.display('Screenshot taken.');\n}\n\nfunction slideshow() {\n  if (!screen._.slideshow) {\n    screen._.slideshow = setInterval(function slide() {\n      if (screen.lockKeys) return;\n      var i = (list.items.length - 1) * Math.random() | 0;\n      list.enterSelected(i);\n      return slide;\n    }(), 3000);\n    msg.display('Slideshow started.');\n  } else {\n    clearInterval(screen._.slideshow);\n    delete screen._.slideshow;\n    msg.display('Slideshow stopped.');\n  }\n}\n\nfunction shuffle() {\n  var items = Object.keys(map).sort(function(key) {\n    return Math.random() > 0.5 ? 1 : -1;\n  });\n  list.setItems(items);\n  screen.render();\n  msg.display('Shuffled items.');\n}\n"
  },
  {
    "path": "example/ansi-viewer/package.json",
    "content": "{\n  \"name\": \"ansi-viewer\",\n  \"description\": \"ANSI art viewer for node\",\n  \"author\": \"Christopher Jeffrey\",\n  \"version\": \"0.0.1\",\n  \"main\": \"./index.js\",\n  \"bin\": \"./index.js\",\n  \"preferGlobal\": false,\n  \"repository\": \"git://github.com/chjj/blessed.git\",\n  \"homepage\": \"https://github.com/chjj/blessed\",\n  \"bugs\": { \"url\": \"http://github.com/chjj/blessed/issues\" },\n  \"keywords\": [\"ansi\", \"art\"],\n  \"tags\": [\"ansi\", \"art\"],\n  \"dependencies\": {\n    \"blessed\": \">=0.1.5\",\n    \"term.js\": \"0.0.4\",\n    \"request\": \"2.55.0\"\n  }\n}\n"
  },
  {
    "path": "example/ansi-viewer/singlebyte.js",
    "content": "/**\n * node-singlebyte\n */\n\n// The MIT License (MIT)\n//\n// Copyright (c) 2013, Sergey Sokoloff (aka Mithgol the Webmaster).\n// https://github.com/Mithgol/node-singlebyte\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy of\n// this software and associated documentation files (the \"Software\"), to deal in\n// the Software without restriction, including without limitation the rights to\n// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\n// the Software, and to permit persons to whom the Software is furnished to do so,\n// subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in all\n// copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\n// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\n// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\n// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\nvar extend = function(target) {\n  target = target || {};\n  Array.prototype.slice.call(arguments, 1).forEach(function(obj) {\n    Object.keys(obj || {}).forEach(function(key) {\n      target[key] = obj[key];\n    });\n  });\n  return target;\n};\n\nvar singlebyte = function(){\n   /* jshint indent: false */\n   if(!( this instanceof singlebyte )){\n      return new singlebyte();\n   }\n\n   this.encodings = [];\n\n   // CP437\n   this.learnEncoding('cp437', this.extendASCII([\n       0xC7,   0xFC,   0xE9,   0xE2,   0xE4,   0xE0,   0xE5,   0xE7,\n       0xEA,   0xEB,   0xE8,   0xEF,   0xEE,   0xEC,   0xC4,   0xC5,\n       0xC9,   0xE6,   0xC6,   0xF4,   0xF6,   0xF2,   0xFB,   0xF9,\n       0xFF,   0xD6,   0xDC,   0xA2,   0xA3,   0xA5,  0x20A7, 0x192,\n       0xE1,   0xED,   0xF3,   0xFA,   0xF1,   0xD1,   0xAA,   0xBA,\n       0xBF,  0x2310,  0xAC,   0xBD,   0xBC,   0xA1,   0xAB,   0xBB,\n      0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556,\n      0x2555, 0x2563, 0x2551, 0x2557, 0x255D, 0x255C, 0x255B, 0x2510,\n      0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x255E, 0x255F,\n      0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x2567,\n      0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256B,\n      0x256A, 0x2518, 0x250C, 0x2588, 0x2584, 0x258C, 0x2590, 0x2580,\n      0x3B1,  0x3B2,  0x393,  0x3C0,  0x3A3,  0x3C3,  0x3BC,  0x3C4,\n      0x3A6,  0x398,  0x3A9,  0x3B4,  0x221E, 0x3C6,  0x3B5,  0x2229,\n      0x2261,  0xB1,  0x2265, 0x2264, 0x2320, 0x2321,  0xF7,  0x2248,\n      0xB0,   0x2219,  0xB7,  0x221A, 0x207F,  0xB2,  0x25A0,  0xA0\n   ]));\n\n   // CP850\n   this.learnEncoding('cp850', this.extendASCII([\n       0xC7,   0xFC,   0xE9,   0xE2,   0xE4,   0xE0,   0xE5,   0xE7,\n       0xEA,   0xEB,   0xE8,   0xEF,   0xEE,   0xEC,   0xC4,   0xC5,\n       0xC9,   0xE6,   0xC6,   0xF4,   0xF6,   0xF2,   0xFB,   0xF9,\n       0xFF,   0xD6,   0xDC,   0xF8,   0xA3,   0xD8,   0xD7,  0x192,\n       0xE1,   0xED,   0xF3,   0xFA,   0xF1,   0xD1,   0xAA,   0xBA,\n       0xBF,   0xAE,   0xAC,   0xBD,   0xBC,   0xA1,   0xAB,   0xBB,\n      0x2591, 0x2592, 0x2593, 0x2502, 0x2524,  0xC1,   0xC2,   0xC0,\n       0xA9,  0x2563, 0x2551, 0x2557, 0x255D,  0xA2,   0xA5,  0x2510,\n      0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C,  0xE3,   0xC3,\n      0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C,  0xA4,\n       0xF0,   0xD0,   0xCA,   0xCB,   0xC8,  0x131,   0xCD,   0xCE,\n       0xCF,  0x2518, 0x250C, 0x2588, 0x2584,  0xA6,   0xCC,  0x2580,\n       0xD3,   0xDF,   0xD4,   0xD2,   0xF5,   0xD5,   0xB5,   0xFE,\n       0xDE,   0xDA,   0xDB,   0xD9,   0xFD,   0xDD,   0xAF,   0xB4,\n       0xAD,   0xB1,  0x2017,  0xBE,   0xB6,   0xA7,   0xF7,   0xB8,\n       0xB0,   0xA8,   0xB7,   0xB9,   0xB3,   0xB2,  0x25A0,  0xA0\n   ]));\n\n   // CP858\n   this.learnEncoding('cp858', this.extendASCII([\n       0xC7,   0xFC,   0xE9,   0xE2,   0xE4,   0xE0,   0xE5,   0xE7,\n       0xEA,   0xEB,   0xE8,   0xEF,   0xEE,   0xEC,   0xC4,   0xC5,\n       0xC9,   0xE6,   0xC6,   0xF4,   0xF6,   0xF2,   0xFB,   0xF9,\n       0xFF,   0xD6,   0xDC,   0xF8,   0xA3,   0xD8,   0xD7,  0x192,\n       0xE1,   0xED,   0xF3,   0xFA,   0xF1,   0xD1,   0xAA,   0xBA,\n       0xBF,   0xAE,   0xAC,   0xBD,   0xBC,   0xA1,   0xAB,   0xBB,\n      0x2591, 0x2592, 0x2593, 0x2502, 0x2524,  0xC1,   0xC2,   0xC0,\n       0xA9,  0x2563, 0x2551, 0x2557, 0x255D,  0xA2,   0xA5,  0x2510,\n      0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C,  0xE3,   0xC3,\n      0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C,  0xA4,\n       0xF0,   0xD0,   0xCA,   0xCB,   0xC8,  0x20AC,   0xCD,   0xCE,\n       0xCF,  0x2518, 0x250C, 0x2588, 0x2584,  0xA6,   0xCC,  0x2580,\n       0xD3,   0xDF,   0xD4,   0xD2,   0xF5,   0xD5,   0xB5,   0xFE,\n       0xDE,   0xDA,   0xDB,   0xD9,   0xFD,   0xDD,   0xAF,   0xB4,\n       0xAD,   0xB1,  0x2017,  0xBE,   0xB6,   0xA7,   0xF7,   0xB8,\n       0xB0,   0xA8,   0xB7,   0xB9,   0xB3,   0xB2,  0x25A0,  0xA0\n   ]));\n\n   // CP808\n   this.learnEncoding('cp808', this.extendASCII([\n      0x410,  0x411,  0x412,  0x413,  0x414,  0x415,  0x416,  0x417,\n      0x418,  0x419,  0x41A,  0x41B,  0x41C,  0x41D,  0x41E,  0x41F,\n      0x420,  0x421,  0x422,  0x423,  0x424,  0x425,  0x426,  0x427,\n      0x428,  0x429,  0x42A,  0x42B,  0x42C,  0x42D,  0x42E,  0x42F,\n      0x430,  0x431,  0x432,  0x433,  0x434,  0x435,  0x436,  0x437,\n      0x438,  0x439,  0x43A,  0x43B,  0x43C,  0x43D,  0x43E,  0x43F,\n      0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556,\n      0x2555, 0x2563, 0x2551, 0x2557, 0x255D, 0x255C, 0x255B, 0x2510,\n      0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x255E, 0x255F,\n      0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x2567,\n      0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256B,\n      0x256A, 0x2518, 0x250C, 0x2588, 0x2584, 0x258C, 0x2590, 0x2580,\n      0x440,  0x441,  0x442,  0x443,  0x444,  0x445,  0x446,  0x447,\n      0x448,  0x449,  0x44A,  0x44B,  0x44C,  0x44D,  0x44E,  0x44F,\n      0x401,  0x451,  0x404,  0x454,  0x407,  0x457,  0x40E,  0x45E,\n       0xB0,  0x2219,  0xB7,  0x221A, 0x2116, 0x20AC, 0x25A0,  0xA0\n   ]));\n\n   // CP866\n   this.learnEncoding('cp866', this.extendASCII([\n      0x410,  0x411,  0x412,  0x413,  0x414,  0x415,  0x416,  0x417,\n      0x418,  0x419,  0x41A,  0x41B,  0x41C,  0x41D,  0x41E,  0x41F,\n      0x420,  0x421,  0x422,  0x423,  0x424,  0x425,  0x426,  0x427,\n      0x428,  0x429,  0x42A,  0x42B,  0x42C,  0x42D,  0x42E,  0x42F,\n      0x430,  0x431,  0x432,  0x433,  0x434,  0x435,  0x436,  0x437,\n      0x438,  0x439,  0x43A,  0x43B,  0x43C,  0x43D,  0x43E,  0x43F,\n      0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556,\n      0x2555, 0x2563, 0x2551, 0x2557, 0x255D, 0x255C, 0x255B, 0x2510,\n      0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x255E, 0x255F,\n      0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x2567,\n      0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256B,\n      0x256A, 0x2518, 0x250C, 0x2588, 0x2584, 0x258C, 0x2590, 0x2580,\n      0x440,  0x441,  0x442,  0x443,  0x444,  0x445,  0x446,  0x447,\n      0x448,  0x449,  0x44A,  0x44B,  0x44C,  0x44D,  0x44E,  0x44F,\n      0x401,  0x451,  0x404,  0x454,  0x407,  0x457,  0x40E,  0x45E,\n       0xB0,  0x2219,  0xB7,  0x221A, 0x2116,  0xA4,  0x25A0,  0xA0\n   ]));\n\n   // CP1125\n   this.learnEncoding('cp1125', this.extendASCII([\n      0x410,  0x411,  0x412,  0x413,  0x414,  0x415,  0x416,  0x417,\n      0x418,  0x419,  0x41A,  0x41B,  0x41C,  0x41D,  0x41E,  0x41F,\n      0x420,  0x421,  0x422,  0x423,  0x424,  0x425,  0x426,  0x427,\n      0x428,  0x429,  0x42A,  0x42B,  0x42C,  0x42D,  0x42E,  0x42F,\n      0x430,  0x431,  0x432,  0x433,  0x434,  0x435,  0x436,  0x437,\n      0x438,  0x439,  0x43A,  0x43B,  0x43C,  0x43D,  0x43E,  0x43F,\n      0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556,\n      0x2555, 0x2563, 0x2551, 0x2557, 0x255D, 0x255C, 0x255B, 0x2510,\n      0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x255E, 0x255F,\n      0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x2567,\n      0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256B,\n      0x256A, 0x2518, 0x250C, 0x2588, 0x2584, 0x258C, 0x2590, 0x2580,\n      0x440,  0x441,  0x442,  0x443,  0x444,  0x445,  0x446,  0x447,\n      0x448,  0x449,  0x44A,  0x44B,  0x44C,  0x44D,  0x44E,  0x44F,\n      0x401,  0x451,  0x490,  0x491,  0x404,  0x454,  0x406,  0x456,\n      0x407,  0x457,   0xB7,  0x221A, 0x2116,  0xA4,  0x25A0,  0xA0\n   ]));\n\n   // KOI8-R\n   this.learnEncoding('koi8-r', this.extendASCII([\n      0x2500, 0x2502, 0x250C, 0x2510, 0x2514, 0x2518, 0x251C, 0x2524,\n      0x252C, 0x2534, 0x253C, 0x2580, 0x2584, 0x2588, 0x258C, 0x2590,\n      0x2591, 0x2592, 0x2593, 0x2320, 0x25A0, 0x2219, 0x221A, 0x2248,\n      0x2264, 0x2265,  0xA0,  0x2321,  0xB0,   0xB2,   0xB7,   0xF7,\n      0x2550, 0x2551, 0x2552, 0x451,  0x2553, 0x2554, 0x2555, 0x2556,\n      0x2557, 0x2558, 0x2559, 0x255A, 0x255B, 0x255C, 0x255D, 0x255E,\n      0x255F, 0x2560, 0x2561, 0x401,  0x2562, 0x2563, 0x2564, 0x2565,\n      0x2566, 0x2567, 0x2568, 0x2569, 0x256A, 0x256B, 0x256C,  0xA9,\n      0x44E,  0x430,  0x431,  0x446,  0x434,  0x435,  0x444,  0x433,\n      0x445,  0x438,  0x439,  0x43A,  0x43B,  0x43C,  0x43D,  0x043E,\n      0x43F,  0x44F,  0x440,  0x441,  0x442,  0x443,  0x436,  0x432,\n      0x44C,  0x44B,  0x437,  0x448,  0x44D,  0x449,  0x447,  0x44A,\n      0x42E,  0x410,  0x411,  0x426,  0x414,  0x415,  0x424,  0x413,\n      0x425,  0x418,  0x419,  0x41A,  0x41B,  0x41C,  0x41D,  0x41E,\n      0x41F,  0x42F,  0x420,  0x421,  0x422,  0x423,  0x416,  0x412,\n      0x42C,  0x42B,  0x417,  0x428,  0x42D,  0x429,  0x427,  0x42A\n   ]));\n\n   // KOI8-U\n   this.learnEncoding('koi8-u', this.extendASCII([\n      0x2500, 0x2502, 0x250C, 0x2510, 0x2514, 0x2518, 0x251C, 0x2524,\n      0x252C, 0x2534, 0x253C, 0x2580, 0x2584, 0x2588, 0x258C, 0x2590,\n      0x2591, 0x2592, 0x2593, 0x2320, 0x25A0, 0x2219, 0x221A, 0x2248,\n      0x2264, 0x2265,  0xA0,  0x2321,  0xB0,   0xB2,   0xB7,   0xF7,\n      0x2550, 0x2551, 0x2552, 0x451,  0x454,  0x2554, 0x456,  0x457,\n      0x2557, 0x2558, 0x2559, 0x255A, 0x255B, 0x491,  0x255D, 0x255E,\n      0x255F, 0x2560, 0x2561, 0x401,  0x404,  0x2563, 0x406,  0x407,\n      0x2566, 0x2567, 0x2568, 0x2569, 0x256A, 0x490,  0x256C,  0xA9,\n      0x44E,  0x430,  0x431,  0x446,  0x434,  0x435,  0x444,  0x433,\n      0x445,  0x438,  0x439,  0x43A,  0x43B,  0x43C,  0x43D,  0x043E,\n      0x43F,  0x44F,  0x440,  0x441,  0x442,  0x443,  0x436,  0x432,\n      0x44C,  0x44B,  0x437,  0x448,  0x44D,  0x449,  0x447,  0x44A,\n      0x42E,  0x410,  0x411,  0x426,  0x414,  0x415,  0x424,  0x413,\n      0x425,  0x418,  0x419,  0x41A,  0x41B,  0x41C,  0x41D,  0x41E,\n      0x41F,  0x42F,  0x420,  0x421,  0x422,  0x423,  0x416,  0x412,\n      0x42C,  0x42B,  0x417,  0x428,  0x42D,  0x429,  0x427,  0x42A\n   ]));\n\n   // KOI8-RU\n   this.learnEncoding('koi8-ru', this.extendASCII([\n      0x2500, 0x2502, 0x250C, 0x2510, 0x2514, 0x2518, 0x251C, 0x2524,\n      0x252C, 0x2534, 0x253C, 0x2580, 0x2584, 0x2588, 0x258C, 0x2590,\n      0x2591, 0x2592, 0x2593, 0x2320, 0x25A0, 0x2219, 0x221A, 0x2248,\n      0x2264, 0x2265,  0xA0,  0x2321,  0xB0,   0xB2,   0xB7,   0xF7,\n      0x2550, 0x2551, 0x2552, 0x451,  0x454,  0x2554, 0x456,  0x457,\n      0x2557, 0x2558, 0x2559, 0x255A, 0x255B, 0x491,  0x45E,  0x255E,\n      0x255F, 0x2560, 0x2561, 0x401,  0x404,  0x2563, 0x406,  0x407,\n      0x2566, 0x2567, 0x2568, 0x2569, 0x256A, 0x490,  0x40E,   0xA9,\n      0x44E,  0x430,  0x431,  0x446,  0x434,  0x435,  0x444,  0x433,\n      0x445,  0x438,  0x439,  0x43A,  0x43B,  0x43C,  0x43D,  0x043E,\n      0x43F,  0x44F,  0x440,  0x441,  0x442,  0x443,  0x436,  0x432,\n      0x44C,  0x44B,  0x437,  0x448,  0x44D,  0x449,  0x447,  0x44A,\n      0x42E,  0x410,  0x411,  0x426,  0x414,  0x415,  0x424,  0x413,\n      0x425,  0x418,  0x419,  0x41A,  0x41B,  0x41C,  0x41D,  0x41E,\n      0x41F,  0x42F,  0x420,  0x421,  0x422,  0x423,  0x416,  0x412,\n      0x42C,  0x42B,  0x417,  0x428,  0x42D,  0x429,  0x427,  0x42A\n   ]));\n\n   // LATIN-1 aka ISO 8859-1 (Western European)\n   this.learnEncoding('latin-1', this.extendASCII([\n      0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,\n      0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, 0x8F,\n      0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,\n      0x98, 0x99, 0x9A, 0x9B, 0x9C, 0x9D, 0x9E, 0x9F,\n      0xA0, 0xA1, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7,\n      0xA8, 0xA9, 0xAA, 0xAB, 0xAC, 0xAD, 0xAE, 0xAF,\n      0xB0, 0xB1, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6, 0xB7,\n      0xB8, 0xB9, 0xBA, 0xBB, 0xBC, 0xBD, 0xBE, 0xBF,\n      0xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7,\n      0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF,\n      0xD0, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7,\n      0xD8, 0xD9, 0xDA, 0xDB, 0xDC, 0xDD, 0xDE, 0xDF,\n      0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7,\n      0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF,\n      0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7,\n      0xF8, 0xF9, 0xFA, 0xFB, 0xFC, 0xFD, 0xFE, 0xFF\n   ]));\n\n   // Windows-1252\n   this.learnEncoding('cp1252', this.extendASCII([\n      0x20AC,  0x81,  0x201A, 0x192,  0x201E, 0x2026, 0x2020, 0x2021,\n      0x2C6,  0x2030, 0x160,  0x2039, 0x152,   0x8D,  0x017D,  0x8F,\n       0x90,  0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014,\n      0x02DC, 0x2122, 0x161,  0x203A, 0x0153,  0x9D,  0x17E,  0x178,\n       0xA0,   0xA1,   0xA2,   0xA3,   0xA4,   0xA5,   0xA6,   0xA7,\n       0xA8,   0xA9,   0xAA,   0xAB,   0xAC,   0xAD,   0xAE,   0xAF,\n       0xB0,   0xB1,   0xB2,   0xB3,   0xB4,   0xB5,   0xB6,   0xB7,\n       0xB8,   0xB9,   0xBA,   0xBB,   0xBC,   0xBD,   0xBE,   0xBF,\n       0xC0,   0xC1,   0xC2,   0xC3,   0xC4,   0xC5,   0xC6,   0xC7,\n       0xC8,   0xC9,   0xCA,   0xCB,   0xCC,   0xCD,   0xCE,   0xCF,\n       0xD0,   0xD1,   0xD2,   0xD3,   0xD4,   0xD5,   0xD6,   0xD7,\n       0xD8,   0xD9,   0xDA,   0xDB,   0xDC,   0xDD,   0xDE,   0xDF,\n       0xE0,   0xE1,   0xE2,   0xE3,   0xE4,   0xE5,   0xE6,   0xE7,\n       0xE8,   0xE9,   0xEA,   0xEB,   0xEC,   0xED,   0xEE,   0xEF,\n       0xF0,   0xF1,   0xF2,   0xF3,   0xF4,   0xF5,   0xF6,   0xF7,\n       0xF8,   0xF9,   0xFA,   0xFB,   0xFC,   0xFD,   0xFE,   0xFF\n   ]));\n};\n\nsinglebyte.prototype.isEncoding = function(encodingName){\n   if( Buffer.isEncoding(encodingName) ) return true;\n   for( var i = 0; i < this.encodings.length; i++ ){\n      if( this.encodings[i].name === encodingName ) return true;\n   }\n   return false;\n};\n\nsinglebyte.prototype.learnEncoding = function(encodingName, encodingTable){\n   /*jshint bitwise: false */\n   if( Buffer.isEncoding(encodingName) ){\n      throw new Error(this.errors.BUFFER_ENCODING);\n   }\n\n   if( encodingTable.length !== 256 ){\n      throw new Error(this.errors.INVALID_TABLE_LENGTH);\n   }\n\n   var _this = this;\n   encodingTable = encodingTable.map(function(item){\n      var nextCode = item |0;\n      if( 0 > nextCode || nextCode > 0x10FFFF ){\n         throw new Error(_this.errors.OUT_OF_UNICODE);\n      }\n      return item;\n   });\n\n   if( this.isEncoding(encodingName) ){\n      for( var i = 0; i < this.encodings.length; i++ ){\n         if( this.encodings[i].name === encodingName ){\n            this.encodings[i].table = encodingTable;\n            return;\n         }\n      }\n   } else {\n      this.encodings.push({\n         name:  encodingName,\n         table: encodingTable\n      });\n   }\n};\n\nsinglebyte.prototype.getEncodingTable = function(encodingName){\n   for( var i = 0; i < this.encodings.length; i++ ){\n      if( this.encodings[i].name === encodingName ){\n         return this.encodings[i].table;\n      }\n   }\n   return null;\n};\n\nsinglebyte.prototype.extendASCII = function(extensionTable){\n   if( extensionTable.length !== 128 ){\n      throw new Error(this.errors.INVALID_EXTENSION);\n   }\n\n   var output = [];\n   for( var i = 0; i < 128; i++ ) output.push(i);\n   return output.concat(extensionTable);\n};\n\nsinglebyte.prototype.bufToStr = function(buf, encoding, start, end){\n   /* jshint bitwise: false */\n   if(!( Buffer.isBuffer(buf) )){\n      throw new Error(this.errors.NOT_A_BUFFER);\n   }\n   if( Buffer.isEncoding(encoding) ){\n      return buf.toString(encoding, start, end);\n   }\n   var table = this.getEncodingTable(encoding);\n   if( table === null ) throw new Error(this.errors.UNKNOWN_ENCODING);\n\n   if( typeof end   === 'undefined' ) end   = buf.length;\n   if( typeof start === 'undefined' ) start = 0;\n\n   var output = '';\n   var sourceValue;\n   for( var i = start; i < end; i++ ){\n      sourceValue = table[ buf[i] ];\n      if( sourceValue <= 0xFFFF ){\n         output += String.fromCharCode(sourceValue);\n      } else if( 0x10000 <= sourceValue && sourceValue <= 0x10FFFF ){\n         sourceValue -= 0x10000;\n         output += String.fromCharCode( 0xD800 + (sourceValue >> 10) );\n         output += String.fromCharCode( 0xDC00 + (sourceValue & 0x3FF) );\n      } else throw new Error(this.errors.OUT_OF_UNICODE);\n   }\n   return output;\n};\n\nvar strToBufDefaults = {\n   defaultCode: 0x3F   // '?'\n};\n\nsinglebyte.prototype.strToBuf = function(str, encoding, encodingOptions){\n   if( Buffer.isEncoding(encoding) ){\n      return new Buffer(str, encoding);\n   }\n   str = '' + str;\n   var options = extend({}, strToBufDefaults, encodingOptions);\n   var table = this.getEncodingTable(encoding);\n   if( table === null ) throw new Error(this.errors.UNKNOWN_ENCODING);\n   var output = [];\n   for( var i = 0; i < str.length; i++ ){\n      var charUnicode;\n      var thisCharCode = str.charCodeAt(i);\n      if( 0xD800 <= thisCharCode && thisCharCode <= 0xDBFF &&\n         i+1 < str.length\n      ){\n         var nextCharCode = str.charCodeAt(i+1);\n         if( 0xDC00 <= nextCharCode && nextCharCode <= 0xDFFF ){\n            charUnicode = 0x10000 + (thisCharCode - 0xD800)*0x400 +\n               (nextCharCode - 0xDC00);\n            i++;\n         } else {\n            charUnicode = thisCharCode;\n         }\n      } else {\n         charUnicode = thisCharCode;\n      }\n\n      var codeFoundIndex = table.indexOf(charUnicode);\n      if( codeFoundIndex < 0 ){\n         output.push(options.defaultCode);\n      } else {\n         output.push(codeFoundIndex);\n      }\n   }\n   return new Buffer(output);\n};\n\nsinglebyte.prototype.errors = {\n   NOT_A_BUFFER : 'The given source is not a buffer!',\n   UNKNOWN_ENCODING : 'The given encoding is not defined!',\n   INVALID_TABLE_LENGTH : 'The encoding table must have 256 elements!',\n   INVALID_EXTENSION : 'The ASCII extension table must have 128 elements!',\n   BUFFER_ENCODING : \"Cannot redefine a Node's encoding!\",\n   OUT_OF_UNICODE : \"An encoding table's element is greater than 0x10FFFF!\"\n};\n\nmodule.exports = singlebyte();\n"
  },
  {
    "path": "example/blessed-telnet.js",
    "content": "#!/usr/bin/env node\n\n/**\n * blessed-telnet.js\n * https://github.com/chjj/blessed\n * Copyright (c) 2013-2015, Christopher Jeffrey (MIT License)\n * A blessed telnet server.\n * See: https://github.com/TooTallNate/node-telnet\n */\n\nprocess.title = 'blessed-telnet';\n\nvar fs = require('fs');\nvar path = require('path');\nvar blessed = require('blessed');\nvar telnet = require('telnet2');\n\nvar server = telnet({ tty: true }, function(client) {\n  client.on('debug', function(msg) {\n    console.error(msg);\n  });\n\n  client.on('term', function(terminal) {\n    screen.terminal = terminal;\n    screen.render();\n  });\n\n  client.on('size', function(width, height) {\n    client.columns = width;\n    client.rows = height;\n    client.emit('resize');\n  });\n\n  var screen = blessed.screen({\n    smartCSR: true,\n    input: client,\n    output: client,\n    terminal: 'xterm-256color',\n    fullUnicode: true\n  });\n\n  client.on('close', function() {\n    if (!screen.destroyed) {\n      screen.destroy();\n    }\n  });\n\n  screen.on('destroy', function() {\n    if (client.writable) {\n      client.destroy();\n    }\n  });\n\n  if (test === 'widget-simple') {\n    return simpleTest(screen);\n  }\n\n  loadTest(screen, test);\n});\n\nfunction simpleTest(screen) {\n  screen.data.main = blessed.box({\n    parent: screen,\n    width: '80%',\n    height: '90%',\n    border: 'line',\n    content: 'Welcome to my server. Here is your own private session.',\n    style: {\n      bg: 'red'\n    }\n  });\n\n  screen.key('i', function() {\n    screen.data.main.style.bg = 'blue';\n    screen.render();\n  });\n\n  screen.key(['C-c', 'q'], function(ch, key) {\n    screen.destroy();\n  });\n\n  screen.render();\n}\n\nvar test = process.argv[2] || path.resolve(__dirname, '../test/widget-shadow.js');\nif (~test.indexOf('widget-png.js')) process.argv.length = 2;\ntest = path.resolve(process.cwd(), test);\n\nfunction loadTest(screen, name) {\n  var Screen = blessed.screen;\n  blessed.screen = function() { return screen; };\n  var path = require.resolve(name);\n  delete require.cache[path];\n  require(name);\n  blessed.screen = Screen;\n}\n\nserver.listen(2300);\nconsole.log('Listening on 2300...');\n"
  },
  {
    "path": "example/index.js",
    "content": "/**\n * Example Program for Blessed\n * Copyright (c) 2013, Christopher Jeffrey (MIT License).\n * https://github.com/chjj/blessed\n */\n\nvar blessed = require('../')\n  , program = blessed.program();\n\nprocess.title = 'blessed';\n\nprogram.on('keypress', function(ch, key) {\n  if (key.name === 'q') {\n    program.clear();\n    program.disableMouse();\n    program.showCursor();\n    program.normalBuffer();\n    process.exit(0);\n  }\n});\n\nprogram.on('mouse', function(data) {\n  if (data.action === 'mouseup') return;\n  program.move(1, program.rows);\n  program.eraseInLine('right');\n  if (data.action === 'wheelup') {\n    program.write('Mouse wheel up at: ' + data.x + ', ' + data.y);\n  } else if (data.action === 'wheeldown') {\n    program.write('Mouse wheel down at: ' + data.x + ', ' + data.y);\n  } else if (data.action === 'mousedown' && data.button === 'left') {\n    program.write('Left button down at: ' + data.x + ', ' + data.y);\n  } else if (data.action === 'mousedown' && data.button === 'right') {\n    program.write('Right button down at: ' + data.x + ', ' + data.y);\n  } else {\n    program.write('Mouse at: ' + data.x + ', ' + data.y);\n  }\n  program.move(data.x, data.y);\n  program.bg('red');\n  program.write(' ');\n  program.bg('!red');\n});\n\nprogram.on('focus', function() {\n  program.move(1, program.rows);\n  program.write('Gained focus.');\n});\n\nprogram.on('blur', function() {\n  program.move(1, program.rows);\n  program.write('Lost focus.');\n});\n\nprogram.alternateBuffer();\nprogram.enableMouse();\nprogram.hideCursor();\nprogram.clear();\n\nprogram.move(1, 1);\nprogram.bg('black');\nprogram.write('Hello world', 'blue fg');\nprogram.setx((program.cols / 2 | 0) - 4);\nprogram.down(5);\nprogram.write('Hi again!');\nprogram.bg('!black');\nprogram.feed();\n\nprogram.getCursor(function(err, data) {\n  if (!err) {\n    program.write('Cursor is at: ' + data.x + ', ' + data.y + '.');\n    program.feed();\n  }\n\n  program.charset('SCLD');\n  program.write('abcdefghijklmnopqrstuvwxyz0123456789');\n  program.charset('US');\n  program.setx(1);\n});\n"
  },
  {
    "path": "example/multiplex.js",
    "content": "#!/usr/bin/env node\n\n/**\n * multiplex.js\n * https://github.com/chjj/blessed\n * Copyright (c) 2013-2015, Christopher Jeffrey (MIT License)\n * A terminal multiplexer created by blessed.\n */\n\nprocess.title = 'multiplex.js';\n\nvar blessed = require('blessed')\n  , screen;\n\nscreen = blessed.screen({\n  smartCSR: true,\n  log: process.env.HOME + '/blessed-terminal.log',\n  fullUnicode: true,\n  dockBorders: true,\n  ignoreDockContrast: true\n});\n\nvar topleft = blessed.terminal({\n  parent: screen,\n  cursor: 'line',\n  cursorBlink: true,\n  screenKeys: false,\n  label: ' multiplex.js ',\n  left: 0,\n  top: 0,\n  width: '50%',\n  height: '50%',\n  border: 'line',\n  style: {\n    fg: 'default',\n    bg: 'default',\n    focus: {\n      border: {\n        fg: 'green'\n      }\n    }\n  }\n});\n\ntopleft.pty.on('data', function(data) {\n  screen.log(JSON.stringify(data));\n});\n\nvar topright = blessed.terminal({\n  parent: screen,\n  cursor: 'block',\n  cursorBlink: true,\n  screenKeys: false,\n  label: ' multiplex.js ',\n  left: '50%-1',\n  top: 0,\n  width: '50%+1',\n  height: '50%',\n  border: 'line',\n  style: {\n    fg: 'red',\n    bg: 'black',\n    focus: {\n      border: {\n        fg: 'green'\n      }\n    }\n  }\n});\n\nvar bottomleft = blessed.terminal({\n  parent: screen,\n  cursor: 'block',\n  cursorBlink: true,\n  screenKeys: false,\n  label: ' multiplex.js ',\n  left: 0,\n  top: '50%-1',\n  width: '50%',\n  height: '50%+1',\n  border: 'line',\n  style: {\n    fg: 'default',\n    bg: 'default',\n    focus: {\n      border: {\n        fg: 'green'\n      }\n    }\n  }\n});\n\nvar bottomright = blessed.terminal({\n  parent: screen,\n  cursor: 'block',\n  cursorBlink: true,\n  screenKeys: false,\n  label: ' multiplex.js ',\n  left: '50%-1',\n  top: '50%-1',\n  width: '50%+1',\n  height: '50%+1',\n  border: 'line',\n  style: {\n    fg: 'default',\n    bg: 'default',\n    focus: {\n      border: {\n        fg: 'green'\n      }\n    }\n  }\n});\n\n[topleft, topright, bottomleft, bottomright].forEach(function(term) {\n  term.enableDrag(function(mouse) {\n    return !!mouse.ctrl;\n  });\n  term.on('title', function(title) {\n    screen.title = title;\n    term.setLabel(' ' + title + ' ');\n    screen.render();\n  });\n  term.on('click', term.focus.bind(term));\n});\n\ntopleft.focus();\n\nscreen.key('C-q', function() {\n  topleft.kill();\n  topright.kill();\n  bottomleft.kill();\n  bottomright.kill();\n  return screen.destroy();\n});\n\nscreen.program.key('S-tab', function() {\n  screen.focusNext();\n  screen.render();\n});\n\nscreen.render();\n"
  },
  {
    "path": "example/ping",
    "content": "#!/usr/bin/env node\n\n/**\n * ping\n * https://github.com/chjj/blessed\n * Copyright (c) 2013, Christopher Jeffrey (MIT License)\n * Online (ping)pong in your terminal.\n */\n\n// Example Usage:\n// Server: $ ./example/ping 3000\n// Client: $ ./example/ping 127.0.0.1 3000\n// Demo: $ ./example/ping\n\nprocess.title = 'ping';\n\nif (/^(-h|--help|-\\?)$/.test(process.argv[2])) {\n  console.log('node-ping');\n  console.log('Example Usage:');\n  console.log('Server: $ node-ping 3000');\n  console.log('Client: $ node-ping 127.0.0.1 3000');\n  console.log('Demo: $ node-ping');\n  return process.exit(0);\n}\n\nvar blessed = require('blessed')\n  , nssocket;\n\ntry {\n  nssocket = require('nssocket');\n} catch (e) {\n  ;\n}\n\nvar server\n  , socket;\n\n/**\n * Screen Layout\n */\n\nvar screen = blessed.screen();\n\nvar table = blessed.box({\n  left: 0,\n  top: 0,\n  width: screen.width,\n  height: screen.height\n});\n\nvar ball = blessed.box({\n  width: 1,\n  height: 1,\n  bg: 'white',\n  top: 0,\n  left: 0\n});\n\nvar lpaddle = blessed.box({\n  width: 1,\n  height: 3,\n  bg: 'yellow',\n  top: 0,\n  left: 0\n});\n\nvar rpaddle = blessed.box({\n  width: 1,\n  height: 3,\n  bg: 'yellow',\n  top: 0,\n  right: 0\n});\n\nvar score = blessed.box({\n  top: 0,\n  left: 4,\n  height: 3,\n  width: 'shrink',\n  border: {\n    type: 'line'\n  },\n  //align: 'center',\n  style: {\n    bold: true\n  },\n  tags: true\n});\n\nscore.lwins = 0;\nscore.rwins = 0;\n\nvar net = blessed.box({\n  width: 1,\n  height: '100%',\n  bg: 'yellow',\n  top: 0,\n  left: 'center'\n});\n\nvar message = blessed.box({\n  width: '50%',\n  height: 3,\n  border: {\n    type: 'line'\n  },\n  top: 'center',\n  left: 'center'\n});\n\nvar text = blessed.box({\n  top: 'center',\n  left: 1,\n  right: 1,\n  height: 1,\n  align: 'center',\n  content: 'Waiting for players to connect...'\n});\n\nmessage.append(text);\n\nscreen.append(table);\n\ntable.append(score);\ntable.append(lpaddle);\ntable.append(rpaddle);\ntable.append(net);\ntable.append(ball);\ntable.append(message);\n\nscreen.on('resize', function() {\n  table.width = screen.width;\n  table.height = screen.height;\n  [ball, lpaddle, rpaddle].forEach(function(el) {\n    if (el.rbottom < 0) el.rtop = table.height - 1 - el.height;\n    if (el.rright < 0) el.rleft = table.width - 1;\n  });\n  screen.render();\n  sync();\n});\n\n/**\n * Options\n */\n\nball.speed = 2;\nball.unpredictable = true;\nlpaddle.speed = 2;\nrpaddle.speed = 2;\n\n/**\n * Game\n */\n\nfunction sync() {\n  if (!socket) return;\n  socket.send(['update'], {\n    table: { width: table.width, height: table.height },\n    lpaddle: { rleft: lpaddle.rleft, rtop: lpaddle.rtop, speed: lpaddle.speed },\n    rpaddle: { rleft: rpaddle.rleft, rtop: rpaddle.rtop, speed: rpaddle.speed },\n    score: { lwins: score.lwins, rwins: score.rwins }\n  });\n}\n\nfunction reset() {\n  text.setContent('Waiting for players to connect...');\n  message.hide();\n  ball.moving = true;\n  ball.direction = 'right';\n  ball.angle = 'down';\n  ball.rtop = 1;\n  ball.rleft = 1;\n  if ((score.lwins + score.rwins) % 2 !== 0) {\n    ball.direction = 'left';\n    ball.rleft = table.width - 1;\n  }\n  lpaddle.rtop = 0;\n  rpaddle.rtop = 0;\n\n  score.setContent('{green-fg}Score:{/} ' + score.lwins + ' | ' + score.rwins);\n\n  rpaddle.movable = true;\n\n  screen.render();\n  if (server && socket) {\n    socket.send(['reset']);\n  }\n}\n\nfunction rand(min, max) {\n  return Math.floor(Math.random() * (max - min + 1)) + min;\n}\n\nfunction startGame() {\n  reset();\n\n  if (startGame._bound) return;\n  startGame._bound = true;\n\n  screen.on('keypress', function(ch, key) {\n    if (!ball.moving) return;\n    if (key.name === 'up' || key.name === 'k') {\n      if (socket) socket.send(['up']);\n      if (lpaddle.rtop > 0) lpaddle.rtop -= lpaddle.speed;\n      if (!socket) if (rpaddle.rtop > 0) rpaddle.rtop -= rpaddle.speed;\n      if (lpaddle.rtop < 0) lpaddle.rtop = 0;\n      if (rpaddle.rtop < 0) rpaddle.rtop = 0;\n      screen.render();\n    } else if (key.name === 'down' || key.name === 'j') {\n      if (socket) socket.send(['down']);\n      if (lpaddle.rbottom > 0) lpaddle.rtop += lpaddle.speed;\n      if (!socket) if (rpaddle.rbottom > 0) rpaddle.rtop += rpaddle.speed;\n      if (lpaddle.rbottom < 0) lpaddle.rtop = table.height - lpaddle.height - 1;\n      if (rpaddle.rbottom < 0) rpaddle.rtop = table.height - rpaddle.height - 1;\n      screen.render();\n    }\n  });\n\n  setInterval(function() {\n    if (!ball.moving) return;\n    if (ball.direction === 'right') {\n      if (ball.rright > 1) {\n        ball.rleft += ball.speed;\n      } else {\n        if (ball.rtop >= rpaddle.rtop && ball.rtop <= rpaddle.rtop + rpaddle.height) {\n          ball.direction = 'left';\n          ball.rleft -= ball.speed;\n\n          ball.rleft -= rand(0, 3);\n          if (ball.angle === 'down') ball.rtop += rand(0, 3);\n          else if (ball.angle === 'up') ball.rtop -= rand(0, 3);\n        } else {\n          // Right loses\n          score.lwins++;\n          ball.rleft = table.width - 1;\n          if (socket) socket.send(['lose']);\n          ball.moving = false;\n          text.setContent('Right player loses!');\n          message.show();\n          setTimeout(reset, 3000);\n          screen.render();\n          return;\n        }\n      }\n      if (ball.rright < 1) ball.rleft = table.width - 2;\n    } else if (ball.direction === 'left') {\n      if (ball.rleft > 1) {\n        ball.rleft -= ball.speed;\n      } else {\n        if (ball.rtop >= lpaddle.rtop && ball.rtop <= lpaddle.rtop + lpaddle.height) {\n          ball.direction = 'right';\n          ball.rleft += ball.speed;\n\n          ball.rleft += rand(0, 3);\n          if (ball.angle === 'down') ball.rtop += rand(0, 3);\n          else if (ball.angle === 'up') ball.rtop -= rand(0, 3);\n        } else {\n          // Left loses\n          score.rwins++;\n          ball.rleft = 0;\n          if (socket) socket.send(['win']);\n          ball.moving = false;\n          text.setContent('Left player loses!');\n          message.show();\n          setTimeout(reset, 3000);\n          screen.render();\n          return;\n        }\n      }\n      if (ball.rleft < 1) ball.rleft = 1;\n    }\n    if (ball.angle === 'down') {\n      if (ball.rbottom > 0) {\n        ball.rtop++;\n        if (ball.unpredictable) ball.rtop += rand(0, 3);\n      } else {\n        ball.angle = 'up';\n        ball.rtop--;\n      }\n    } else if (ball.angle === 'up') {\n      if (ball.rtop > 0) {\n        ball.rtop--;\n        if (ball.unpredictable) ball.rtop -= rand(0, 3);\n      } else {\n        ball.angle = 'down';\n        ball.rtop++;\n      }\n    }\n    if (ball.rtop < 0) ball.rtop = 0;\n    if (ball.rbottom < 0) ball.rtop = table.height - 1;\n    if (socket) socket.send(['ball'], { rleft: ball.rleft, rtop: ball.rtop });\n    screen.render();\n  }, 100);\n}\n\nfunction startServer() {\n  server = nssocket.createServer({}, function(socket_) {\n    socket = socket_;\n\n    sync();\n\n    socket.data(['up'], function() {\n      if (!ball.moving) return;\n      if (rpaddle.rtop > 0) rpaddle.rtop -= rpaddle.speed;\n      screen.render();\n    });\n\n    socket.data(['down'], function() {\n      if (!ball.moving) return;\n      if (rpaddle.rtop < table.height - 1) rpaddle.rtop += rpaddle.speed;\n      screen.render();\n    });\n\n    socket.on('error', function() {\n      socket = null;\n      reset();\n      ball.moving = false;\n      message.show();\n      screen.render();\n    });\n\n    startGame();\n  });\n\n  server.listen(+process.argv[2]);\n}\n\nfunction startClient() {\n  var socket = new nssocket.NsSocket({\n    reconnect: true,\n    maxRetries: Infinity,\n    retryInterval: 5000\n  });\n\n  socket.connect(+process.argv[3], process.argv[2]);\n\n  screen.on('keypress', function(ch, key) {\n    if (!rpaddle.movable) return;\n    if (key.name === 'up' || key.name === 'k') {\n      socket.send(['up']);\n      if (rpaddle.rtop > 0) rpaddle.rtop -= rpaddle.speed;\n      if (rpaddle.rtop < 0) rpaddle.rtop = 0;\n      screen.render();\n    } else if (key.name === 'down' || key.name === 'j') {\n      socket.send(['down']);\n      if (rpaddle.rbottom > 0) rpaddle.rtop += rpaddle.speed;\n      if (rpaddle.rbottom < 0) rpaddle.rtop = table.height - rpaddle.height - 1;\n      screen.render();\n    }\n  });\n\n  socket.data(['up'], function() {\n    if (lpaddle.rtop > 0) lpaddle.rtop -= lpaddle.speed;\n    screen.render();\n  });\n\n  socket.data(['down'], function() {\n    if (lpaddle.rtop < table.height - 1) lpaddle.rtop += lpaddle.speed;\n    screen.render();\n  });\n\n  socket.data(['ball'], function(data) {\n    ball.rleft = data.rleft;\n    ball.rtop = data.rtop;\n    screen.render();\n  });\n\n  socket.data(['update'], function(data) {\n    if (data.lpaddle) {\n      lpaddle.rleft = data.lpaddle.rleft;\n      lpaddle.rtop = data.lpaddle.rtop;\n      lpaddle.speed = data.lpaddle.speed;\n    }\n\n    if (data.rpaddle) {\n      rpaddle.rleft = data.rpaddle.rleft;\n      rpaddle.rtop = data.rpaddle.rtop;\n      rpaddle.speed = data.rpaddle.speed;\n    }\n\n    if (data.ball) {\n      ball.moving = data.ball.moving;\n      ball.rleft = data.ball.rleft;\n      ball.rtop = data.ball.rtop;\n    }\n\n    if (data.table) {\n      table.height = data.table.height;\n      table.width = data.table.width;\n    }\n\n    if (data.score) {\n      score.lwins = data.score.lwins;\n      score.rwins = data.score.rwins;\n    }\n\n    screen.render();\n  });\n\n  socket.data(['win'], function() {\n    rpaddle.movable = false;\n    score.rwins++;\n    text.setContent('Left player loses!');\n    message.show();\n    screen.render();\n  });\n\n  socket.data(['lose'], function() {\n    rpaddle.movable = false;\n    score.lwins++;\n    text.setContent('Right player loses!');\n    message.show();\n    screen.render();\n  });\n\n  socket.data(['reset'], reset);\n\n  reset();\n}\n\n/**\n * Main\n */\n\nfunction main() {\n  screen.on('keypress', function(ch, key) {\n    if (key.name === 'q' || key.name === 'escape') {\n      return process.exit(0);\n    }\n  });\n\n  screen.render();\n\n  // Demo Mode / Single Player\n  if (!nssocket || !process.argv[2]) return startGame();\n\n  // Server Mode\n  if (!process.argv[3]) return startServer();\n\n  // Client Mode\n  if (process.argv[2] && process.argv[3]) return startClient();\n}\n\n/**\n * Execute\n */\n\nmain();\n"
  },
  {
    "path": "example/simple-form.js",
    "content": "var blessed = require('blessed')\n  , screen = blessed.screen();\n\nvar form = blessed.form({\n  parent: screen,\n  keys: true,\n  left: 0,\n  top: 0,\n  width: 30,\n  height: 4,\n  bg: 'green',\n  content: 'Submit or cancel?'\n});\n\nvar submit = blessed.button({\n  parent: form,\n  mouse: true,\n  keys: true,\n  shrink: true,\n  padding: {\n    left: 1,\n    right: 1\n  },\n  left: 10,\n  top: 2,\n  shrink: true,\n  name: 'submit',\n  content: 'submit',\n  style: {\n    bg: 'blue',\n    focus: {\n      bg: 'red'\n    },\n    hover: {\n      bg: 'red'\n    }\n  }\n});\n\nvar cancel = blessed.button({\n  parent: form,\n  mouse: true,\n  keys: true,\n  shrink: true,\n  padding: {\n    left: 1,\n    right: 1\n  },\n  left: 20,\n  top: 2,\n  shrink: true,\n  name: 'cancel',\n  content: 'cancel',\n  style: {\n    bg: 'blue',\n    focus: {\n      bg: 'red'\n    },\n    hover: {\n      bg: 'red'\n    }\n  }\n});\n\nsubmit.on('press', function() {\n  form.submit();\n});\n\ncancel.on('press', function() {\n  form.reset();\n});\n\nform.on('submit', function(data) {\n  form.setContent('Submitted.');\n  screen.render();\n});\n\nform.on('reset', function(data) {\n  form.setContent('Canceled.');\n  screen.render();\n});\n\nscreen.key('q', function() {\n  process.exit(0);\n});\n\nscreen.render();\n"
  },
  {
    "path": "example/time.js",
    "content": "#!/usr/bin/env node\n\n/**\n * A clock using blessed\n * Copyright (c) 2013, Christopher Jeffrey (MIT License).\n * https://github.com/chjj/blessed\n */\n\nprocess.title = 'time.js';\n\nvar argv = process.argv;\n\nif (~argv.indexOf('-h') || ~argv.indexOf('--help')) {\n  console.log('Options:');\n  console.log('-s - Show seconds.');\n  console.log('-n - No leading zero on hours.');\n  console.log('-d - Show date box.');\n  console.log('--skinny - Skinny text.');\n  return process.exit(0);\n}\n\nvar blessed = require('blessed');\n\nvar screen = blessed.screen({\n  autoPadding: true\n});\n\nvar lastTime;\n\nvar positions = {};\n\nvar container = blessed.box({\n  parent: screen,\n  top: 'center',\n  left: 'center',\n  width: 'shrink',\n  height: 9,\n  //padding: 2,\n  //border: {\n  //  type: 'line',\n  //  fg: 'black'\n  //}\n});\n\n// Workaround for centering shrunken box.\ncontainer.on('prerender', function() {\n  var lpos = container._getCoords(true);\n  if (lpos) {\n    container.rleft = (screen.width - (lpos.xl - lpos.xi)) / 2 | 0;\n  }\n});\n\nvar date = blessed.box({\n  parent: screen,\n  top: 1,\n  left: 1,\n  //top: '80%',\n  //left: 'center',\n  width: 'shrink',\n  height: 'shrink',\n  border: {\n    type: 'line',\n    fg: 'black'\n  }\n});\n\ndate.hide();\n\nvar wid = ~argv.indexOf('--skinny') ? 1 : 2;\n// var bch = ' ';\nvar bch = '│';\nvar inverse = true;\n\n// var bch = '*';\n// var bch = '·';\n// var bch = '│';\n// var bch = '◆';\n// var bch = '▪';\n// var inverse = false;\n\n// TODO: Potentially make height of each char 9 instead\n// of 8 so we can vertically center horizontal lines\n// in 4, 8, etc.\n\nfor (var i = 0; i < 10; i++) {\n  var symbols = positions[i] = {};\n\n  /**\n   * Zero\n   */\n\n  symbols[0] = blessed.box({\n    parent: container,\n    top: 0,\n    left: 0,\n    width: 10,\n    height: 9\n  });\n\n  blessed.box({\n    parent: symbols[0],\n    top: 0,\n    left: 0,\n    right: 0,\n    height: 1,\n    ch: bch,\n    style: {\n      fg: 'default',\n      inverse: inverse\n    }\n  });\n\n  blessed.box({\n    parent: symbols[0],\n    top: 0,\n    left: 0,\n    bottom: 0,\n    width: wid,\n    ch: bch,\n    style: {\n      fg: 'default',\n      inverse: inverse\n    }\n  });\n\n  blessed.box({\n    parent: symbols[0],\n    top: 0,\n    right: 0,\n    bottom: 0,\n    width: wid,\n    ch: bch,\n    style: {\n      fg: 'default',\n      inverse: inverse\n    }\n  });\n\n  blessed.box({\n    parent: symbols[0],\n    top: 8,\n    left: 0,\n    right: 0,\n    height: 1,\n    ch: bch,\n    style: {\n      fg: 'default',\n      inverse: inverse\n    }\n  });\n\n  symbols[0].hide();\n\n  /**\n   * One\n   */\n\n  symbols[1] = blessed.box({\n    parent: container,\n    top: 0,\n    width: 10,\n    height: 9\n  });\n\n  blessed.box({\n    parent: symbols[1],\n    top: 0,\n    left: 'center',\n    width: 2,\n    ch: bch,\n    style: {\n      fg: 'default',\n      inverse: inverse\n    }\n  });\n\n  symbols[1].hide();\n\n  /**\n   * Two\n   */\n\n  symbols[2] = blessed.box({\n    parent: container,\n    top: 0,\n    left: 0,\n    width: 10,\n    height: 9\n  });\n\n  blessed.box({\n    parent: symbols[2],\n    top: 0,\n    left: 0,\n    right: 0,\n    height: 1,\n    ch: bch,\n    style: {\n      fg: 'default',\n      inverse: inverse\n    }\n  });\n\n  blessed.box({\n    parent: symbols[2],\n    top: 0,\n    right: 0,\n    height: 4,\n    width: wid,\n    ch: bch,\n    style: {\n      fg: 'default',\n      inverse: inverse\n    }\n  });\n\n  blessed.box({\n    parent: symbols[2],\n    top: 4,\n    left: 0,\n    right: 0,\n    height: 1,\n    ch: bch,\n    style: {\n      fg: 'default',\n      inverse: inverse\n    }\n  });\n\n  blessed.box({\n    parent: symbols[2],\n    top: 4,\n    left: 0,\n    height: 4,\n    width: wid,\n    ch: bch,\n    style: {\n      fg: 'default',\n      inverse: inverse\n    }\n  });\n\n  blessed.box({\n    parent: symbols[2],\n    top: 8,\n    left: 0,\n    right: 0,\n    height: 1,\n    ch: bch,\n    style: {\n      fg: 'default',\n      inverse: inverse\n    }\n  });\n\n  symbols[2].hide();\n\n  /**\n   * Three\n   */\n\n  symbols[3] = blessed.box({\n    parent: container,\n    top: 0,\n    left: 0,\n    width: 10,\n    height: 9\n  });\n\n  blessed.box({\n    parent: symbols[3],\n    top: 0,\n    bottom: 0,\n    right: 0,\n    width: wid,\n    height: 9,\n    ch: bch,\n    style: {\n      fg: 'default',\n      inverse: inverse\n    }\n  });\n\n  blessed.box({\n    parent: symbols[3],\n    top: 0,\n    right: 0,\n    left: 0,\n    height: 1,\n    ch: bch,\n    style: {\n      fg: 'default',\n      inverse: inverse\n    }\n  });\n\n  blessed.box({\n    parent: symbols[3],\n    top: 4,\n    right: 0,\n    left: 0,\n    height: 1,\n    ch: bch,\n    style: {\n      fg: 'default',\n      inverse: inverse\n    }\n  });\n\n  blessed.box({\n    parent: symbols[3],\n    top: 8,\n    right: 0,\n    left: 0,\n    height: 1,\n    ch: bch,\n    style: {\n      fg: 'default',\n      inverse: inverse\n    }\n  });\n\n  symbols[3].hide();\n\n  /**\n   * Four\n   */\n\n  symbols[4] = blessed.box({\n    parent: container,\n    top: 0,\n    left: 0,\n    width: 10,\n    height: 9\n  });\n\n  blessed.box({\n    parent: symbols[4],\n    top: 0,\n    bottom: 0,\n    right: 0,\n    width: wid,\n    height: 9,\n    ch: bch,\n    style: {\n      fg: 'default',\n      inverse: inverse\n    }\n  });\n\n  blessed.box({\n    parent: symbols[4],\n    top: 4,\n    right: 0,\n    left: 0,\n    height: 1,\n    ch: bch,\n    style: {\n      fg: 'default',\n      inverse: inverse\n    }\n  });\n\n  blessed.box({\n    parent: symbols[4],\n    top: 0,\n    left: 0,\n    width: wid,\n    height: 4,\n    ch: bch,\n    style: {\n      fg: 'default',\n      inverse: inverse\n    }\n  });\n\n  symbols[4].hide();\n\n  /**\n   * Five\n   */\n\n  symbols[5] = blessed.box({\n    parent: container,\n    top: 0,\n    left: 0,\n    width: 10,\n    height: 9\n  });\n\n  blessed.box({\n    parent: symbols[5],\n    top: 0,\n    left: 0,\n    right: 0,\n    height: 1,\n    ch: bch,\n    style: {\n      fg: 'default',\n      inverse: inverse\n    }\n  });\n\n  blessed.box({\n    parent: symbols[5],\n    top: 0,\n    left: 0,\n    height: 4,\n    width: wid,\n    ch: bch,\n    style: {\n      fg: 'default',\n      inverse: inverse\n    }\n  });\n\n  blessed.box({\n    parent: symbols[5],\n    top: 4,\n    left: 0,\n    right: 0,\n    height: 1,\n    ch: bch,\n    style: {\n      fg: 'default',\n      inverse: inverse\n    }\n  });\n\n  blessed.box({\n    parent: symbols[5],\n    top: 4,\n    right: 0,\n    height: 4,\n    width: wid,\n    ch: bch,\n    style: {\n      fg: 'default',\n      inverse: inverse\n    }\n  });\n\n  blessed.box({\n    parent: symbols[5],\n    top: 8,\n    left: 0,\n    right: 0,\n    height: 1,\n    ch: bch,\n    style: {\n      fg: 'default',\n      inverse: inverse\n    }\n  });\n\n  symbols[5].hide();\n\n  /**\n   * Six\n   */\n\n  symbols[6] = blessed.box({\n    parent: container,\n    top: 0,\n    left: 0,\n    width: 10,\n    height: 9\n  });\n\n  blessed.box({\n    parent: symbols[6],\n    top: 0,\n    left: 0,\n    right: 0,\n    height: 1,\n    ch: bch,\n    style: {\n      fg: 'default',\n      inverse: inverse\n    }\n  });\n\n  blessed.box({\n    parent: symbols[6],\n    top: 0,\n    left: 0,\n    bottom: 0,\n    width: wid,\n    ch: bch,\n    style: {\n      fg: 'default',\n      inverse: inverse\n    }\n  });\n\n  blessed.box({\n    parent: symbols[6],\n    top: 4,\n    left: 0,\n    right: 0,\n    height: 1,\n    ch: bch,\n    style: {\n      fg: 'default',\n      inverse: inverse\n    }\n  });\n\n  blessed.box({\n    parent: symbols[6],\n    top: 4,\n    right: 0,\n    height: 4,\n    width: wid,\n    ch: bch,\n    style: {\n      fg: 'default',\n      inverse: inverse\n    }\n  });\n\n  blessed.box({\n    parent: symbols[6],\n    top: 8,\n    left: 0,\n    right: 0,\n    height: 1,\n    ch: bch,\n    style: {\n      fg: 'default',\n      inverse: inverse\n    }\n  });\n\n  symbols[6].hide();\n\n  /**\n   * Seven\n   */\n\n  symbols[7] = blessed.box({\n    parent: container,\n    top: 0,\n    left: 0,\n    width: 10,\n    height: 9\n  });\n\n  blessed.box({\n    parent: symbols[7],\n    top: 0,\n    bottom: 0,\n    right: 0,\n    width: wid,\n    height: 9,\n    ch: bch,\n    style: {\n      fg: 'default',\n      inverse: inverse\n    }\n  });\n\n  blessed.box({\n    parent: symbols[7],\n    top: 0,\n    right: 0,\n    left: 0,\n    height: 1,\n    ch: bch,\n    style: {\n      fg: 'default',\n      inverse: inverse\n    }\n  });\n\n  symbols[7].hide();\n\n  /**\n   * Eight\n   */\n\n  symbols[8] = blessed.box({\n    parent: container,\n    top: 0,\n    left: 0,\n    width: 10,\n    height: 9\n  });\n\n  blessed.box({\n    parent: symbols[8],\n    top: 0,\n    left: 0,\n    right: 0,\n    height: 1,\n    ch: bch,\n    style: {\n      fg: 'default',\n      inverse: inverse\n    }\n  });\n\n  blessed.box({\n    parent: symbols[8],\n    top: 0,\n    left: 0,\n    bottom: 0,\n    width: wid,\n    ch: bch,\n    style: {\n      fg: 'default',\n      inverse: inverse\n    }\n  });\n\n  blessed.box({\n    parent: symbols[8],\n    top: 4,\n    left: 0,\n    right: 0,\n    height: 1,\n    ch: bch,\n    style: {\n      fg: 'default',\n      inverse: inverse\n    }\n  });\n\n  blessed.box({\n    parent: symbols[8],\n    top: 0,\n    right: 0,\n    bottom: 0,\n    width: wid,\n    ch: bch,\n    style: {\n      fg: 'default',\n      inverse: inverse\n    }\n  });\n\n  blessed.box({\n    parent: symbols[8],\n    top: 8,\n    left: 0,\n    right: 0,\n    height: 1,\n    ch: bch,\n    style: {\n      fg: 'default',\n      inverse: inverse\n    }\n  });\n\n  symbols[8].hide();\n\n  /**\n   * Nine\n   */\n\n  symbols[9] = blessed.box({\n    parent: container,\n    top: 0,\n    left: 0,\n    width: 10,\n    height: 9\n  });\n\n  blessed.box({\n    parent: symbols[9],\n    top: 0,\n    left: 0,\n    right: 0,\n    height: 1,\n    ch: bch,\n    style: {\n      fg: 'default',\n      inverse: inverse\n    }\n  });\n\n  blessed.box({\n    parent: symbols[9],\n    top: 0,\n    left: 0,\n    height: 4,\n    width: wid,\n    ch: bch,\n    style: {\n      fg: 'default',\n      inverse: inverse\n    }\n  });\n\n  blessed.box({\n    parent: symbols[9],\n    top: 4,\n    left: 0,\n    right: 0,\n    height: 1,\n    ch: bch,\n    style: {\n      fg: 'default',\n      inverse: inverse\n    }\n  });\n\n  blessed.box({\n    parent: symbols[9],\n    top: 0,\n    right: 0,\n    bottom: 0,\n    width: wid,\n    ch: bch,\n    style: {\n      fg: 'default',\n      inverse: inverse\n    }\n  });\n\n  blessed.box({\n    parent: symbols[9],\n    top: 8,\n    left: 0,\n    right: 0,\n    height: 1,\n    ch: bch,\n    style: {\n      fg: 'default',\n      inverse: inverse\n    }\n  });\n\n  symbols[9].hide();\n\n  /**\n   * Colon\n   */\n\n  symbols[':'] = blessed.box({\n    parent: container,\n    top: 0,\n    left: 0,\n    width: 5,\n    height: 9\n  });\n\n  blessed.box({\n    parent: symbols[':'],\n    top: 3,\n    left: 'center',\n    width: 2,\n    height: 1,\n    ch: bch,\n    style: {\n      fg: 'black',\n      inverse: inverse\n    }\n  });\n\n  blessed.box({\n    parent: symbols[':'],\n    top: 6,\n    left: 'center',\n    width: 2,\n    height: 1,\n    ch: bch,\n    style: {\n      fg: 'black',\n      inverse: inverse\n    }\n  });\n\n  symbols[':'].hide();\n\n  /**\n   * A\n   */\n\n  symbols['a'] = blessed.box({\n    parent: container,\n    top: 2,\n    left: 0,\n    width: 10,\n    height: 7\n  });\n\n  blessed.box({\n    parent: symbols['a'],\n    top: 0,\n    left: 0,\n    right: 0,\n    height: 1,\n    ch: bch,\n    style: {\n      fg: 'blue',\n      inverse: inverse\n    }\n  });\n\n  blessed.box({\n    parent: symbols['a'],\n    top: 0,\n    left: 0,\n    bottom: 0,\n    width: wid,\n    ch: bch,\n    style: {\n      fg: 'blue',\n      inverse: inverse\n    }\n  });\n\n  blessed.box({\n    parent: symbols['a'],\n    top: 3,\n    left: 0,\n    right: 0,\n    height: 1,\n    ch: bch,\n    style: {\n      fg: 'blue',\n      inverse: inverse\n    }\n  });\n\n  blessed.box({\n    parent: symbols['a'],\n    top: 0,\n    right: 0,\n    bottom: 0,\n    width: wid,\n    ch: bch,\n    style: {\n      fg: 'blue',\n      inverse: inverse\n    }\n  });\n\n  symbols['a'].hide();\n\n  /**\n   * P\n   */\n\n  symbols['p'] = blessed.box({\n    parent: container,\n    top: 2,\n    left: 0,\n    width: 10,\n    height: 7\n  });\n\n  blessed.box({\n    parent: symbols['p'],\n    top: 0,\n    left: 0,\n    right: 0,\n    height: 1,\n    ch: bch,\n    style: {\n      fg: 'blue',\n      inverse: inverse\n    }\n  });\n\n  blessed.box({\n    parent: symbols['p'],\n    top: 0,\n    right: 0,\n    height: 4,\n    width: wid,\n    ch: bch,\n    style: {\n      fg: 'blue',\n      inverse: inverse\n    }\n  });\n\n  blessed.box({\n    parent: symbols['p'],\n    top: 0,\n    left: 0,\n    bottom: 0,\n    width: wid,\n    ch: bch,\n    style: {\n      fg: 'blue',\n      inverse: inverse\n    }\n  });\n\n  blessed.box({\n    parent: symbols['p'],\n    top: 3,\n    left: 0,\n    right: 0,\n    height: 1,\n    ch: bch,\n    style: {\n      fg: 'blue',\n      inverse: inverse\n    }\n  });\n\n  symbols['p'].hide();\n\n  /**\n   * M\n   */\n\n  symbols['m'] = blessed.box({\n    parent: container,\n    top: 2,\n    left: 0,\n    width: 10,\n    height: 7\n  });\n\n  blessed.box({\n    parent: symbols['m'],\n    top: 0,\n    left: 0,\n    right: 0,\n    height: 1,\n    ch: bch,\n    style: {\n      fg: 'black',\n      inverse: inverse\n    }\n  });\n\n  blessed.box({\n    parent: symbols['m'],\n    top: 0,\n    left: 0,\n    bottom: 0,\n    width: wid,\n    ch: bch,\n    style: {\n      fg: 'black',\n      inverse: inverse\n    }\n  });\n\n  blessed.box({\n    parent: symbols['m'],\n    top: 0,\n    right: 0,\n    bottom: 0,\n    width: wid,\n    ch: bch,\n    style: {\n      fg: 'black',\n      inverse: inverse\n    }\n  });\n\n  blessed.box({\n    parent: symbols['m'],\n    top: 0,\n    bottom: 0,\n    left: 'center',\n    width: wid,\n    ch: bch,\n    style: {\n      fg: 'black',\n      inverse: inverse\n    }\n  });\n\n  symbols['m'].hide();\n}\n\nfunction updateTime() {\n  var pos = 0\n    , d = new Date\n    , im = 'am'\n    , time\n    , h\n    , m\n    , s;\n\n  h = d.getHours();\n  if (h >= 12) {\n    im = 'pm';\n  }\n  if (h > 12) {\n    h -= 12;\n  }\n  if (h === 0) h = 12;\n  if (h < 10) {\n    h = '0' + h;\n  }\n\n  m = d.getMinutes();\n  if (m < 10) {\n    m = '0' + m;\n  }\n\n  s = d.getSeconds();\n  if (s < 10) {\n    s = '0' + s;\n  }\n\n  time = ~argv.indexOf('-s')\n    ? h + ':' + m + ':' + s + im\n    : h + ':' + m + im;\n\n  if (time === lastTime) return;\n  lastTime = time;\n\n  time = time.split('');\n\n  if (~argv.indexOf('-n')) {\n    if (time[0] === '0') time[0] = ' ';\n  }\n\n  Object.keys(positions).forEach(function(key) {\n    var symbols = positions[key];\n    Object.keys(symbols).forEach(function(key) {\n      symbols[key].hide();\n    });\n  });\n\n  time.forEach(function(ch, i) {\n    var symbols = positions[i]\n      , symbol = symbols[ch];\n\n    if (!symbol) return;\n\n    symbol.rleft = pos;\n    pos += symbol.width + 2;\n\n    symbol.show();\n  });\n\n  if (~argv.indexOf('-d')) {\n    date.show();\n    date.setContent(d.toISOString().replace(/\\.\\d+/, ''));\n  }\n\n  screen.render();\n}\n\nsetInterval(updateTime, ~argv.indexOf('-s') ? 100 : 950);\n\nupdateTime();\n\nscreen.key('q', function() {\n  process.exit(0);\n});\n"
  },
  {
    "path": "example/widget.js",
    "content": "var blessed = require('../');\n\n// Create a screen object.\nvar screen = blessed.screen();\n\n// Create a box perfectly centered horizontally and vertically.\nvar box = blessed.box({\n  top: 'center',\n  left: 'center',\n  width: '50%',\n  height: '50%',\n  content: 'Hello {bold}world{/bold}!',\n  tags: true,\n  border: {\n    type: 'line'\n  },\n  style: {\n    fg: 'white',\n    bg: 'magenta',\n    border: {\n      fg: '#ffffff'\n    },\n    hover: {\n      bg: 'green'\n    }\n  }\n});\n\n// Append our box to the screen.\nscreen.append(box);\n\n// If our box is clicked, change the content.\nbox.on('click', function(data) {\n  box.setContent('{center}Some different {red-fg}content{/red-fg}.{/center}');\n  screen.render();\n});\n\n// If box is focused, handle `enter` and give us some more content.\nbox.key('enter', function() {\n  box.setContent('{right}Even different {black-fg}content{/black-fg}.{/right}\\n');\n  box.setLine(1, 'bar');\n  box.insertLine(1, 'foo');\n  screen.render();\n});\n\n// Quit on Escape, q, or Control-C.\nscreen.key(['escape', 'q', 'C-c'], function(ch, key) {\n  return process.exit(0);\n});\n\n// Focus our element.\nbox.focus();\n\n// Render the screen.\nscreen.render();\n"
  },
  {
    "path": "index.js",
    "content": "module.exports = require('./lib/blessed');\n"
  },
  {
    "path": "lib/alias.js",
    "content": "/**\n * alias.js - terminfo/cap aliases for blessed.\n * https://github.com/chjj/blessed\n * Taken from terminfo(5) man page.\n */\n\n/* jshint maxlen: 300 */\n// jscs:disable maximumLineLength\n// jscs:disable\n\nvar alias = exports;\n\n// These are the boolean capabilities:\nalias.bools = {\n  //         Variable                                      Cap-                               TCap                                  Description\n  //         Booleans                                      name                               Code\n  'auto_left_margin':                                      ['bw',                                 'bw'], //                                cub1 wraps from col‐ umn 0 to last column\n  'auto_right_margin':                                     ['am',                                 'am'], //                                terminal has auto‐ matic margins\n  'back_color_erase':                                      ['bce',                                'ut'], //                                screen erased with background color\n  'can_change':                                            ['ccc',                                'cc'], //                                terminal can re- define existing col‐ ors\n  'ceol_standout_glitch':                                  ['xhp',                                'xs'], //                                standout not erased by overwriting (hp)\n  'col_addr_glitch':                                       ['xhpa',                               'YA'], //                                only positive motion for hpa/mhpa caps\n  'cpi_changes_res':                                       ['cpix',                               'YF'], //                                changing character pitch changes reso‐ lution\n  'cr_cancels_micro_mode':                                 ['crxm',                               'YB'], //                                using cr turns off micro mode\n  'dest_tabs_magic_smso':                                  ['xt',                                 'xt'], //                                tabs destructive, magic so char (t1061)\n  'eat_newline_glitch':                                    ['xenl',                               'xn'], //                                newline ignored after 80 cols (con‐ cept)\n  'erase_overstrike':                                      ['eo',                                 'eo'], //                                can erase over‐ strikes with a blank\n  'generic_type':                                          ['gn',                                 'gn'], //                                generic line type\n  'hard_copy':                                             ['hc',                                 'hc'], //                                hardcopy terminal\n  'hard_cursor':                                           ['chts',                               'HC'], //                                cursor is hard to see\n  'has_meta_key':                                          ['km',                                 'km'], //                                Has a meta key (i.e., sets 8th-bit)\n  'has_print_wheel':                                       ['daisy',                              'YC'], //                                printer needs opera‐ tor to change char‐ acter set\n  'has_status_line':                                       ['hs',                                 'hs'], //                                has extra status line\n  'hue_lightness_saturation':                              ['hls',                                'hl'], //                                terminal uses only HLS color notation (Tektronix)\n  'insert_null_glitch':                                    ['in',                                 'in'], //                                insert mode distin‐ guishes nulls\n  'lpi_changes_res':                                       ['lpix',                               'YG'], //                                changing line pitch changes resolution\n  'memory_above':                                          ['da',                                 'da'], //                                display may be retained above the screen\n  'memory_below':                                          ['db',                                 'db'], //                                display may be retained below the screen\n  'move_insert_mode':                                      ['mir',                                'mi'], //                                safe to move while in insert mode\n  'move_standout_mode':                                    ['msgr',                               'ms'], //                                safe to move while in standout mode\n  'needs_xon_xoff':                                        ['nxon',                               'nx'], //                                padding will not work, xon/xoff required\n  'no_esc_ctlc':                                           ['xsb',                                'xb'], //                                beehive (f1=escape, f2=ctrl C)\n  'no_pad_char':                                           ['npc',                                'NP'], //                                pad character does not exist\n  'non_dest_scroll_region':                                ['ndscr',                              'ND'], //                                scrolling region is non-destructive\n  'non_rev_rmcup':                                         ['nrrmc',                              'NR'], //                                smcup does not reverse rmcup\n  'over_strike':                                           ['os',                                 'os'], //                                terminal can over‐ strike\n  'prtr_silent':                                           ['mc5i',                               '5i'], //                                printer will not echo on screen\n  'row_addr_glitch':                                       ['xvpa',                               'YD'], //                                only positive motion for vpa/mvpa caps\n  'semi_auto_right_margin':                                ['sam',                                'YE'], //                                printing in last column causes cr\n  'status_line_esc_ok':                                    ['eslok',                              'es'], //                                escape can be used on the status line\n  'tilde_glitch':                                          ['hz',                                 'hz'], //                                cannot print ~'s (hazeltine)\n  'transparent_underline':                                 ['ul',                                 'ul'], //                                underline character overstrikes\n  'xon_xoff':                                              ['xon',                                'xo']  //                                terminal uses xon/xoff handshaking\n};\n\n// These are the numeric capabilities:\nalias.numbers = {\n  //         Variable                                      Cap-                               TCap                                  Description\n  //          Numeric                                      name                               Code\n  'columns':                                               ['cols',                               'co'], //                                number of columns in a line\n  'init_tabs':                                             ['it',                                 'it'], //                                tabs initially every # spaces\n  'label_height':                                          ['lh',                                 'lh'], //                                rows in each label\n  'label_width':                                           ['lw',                                 'lw'], //                                columns in each label\n  'lines':                                                 ['lines',                              'li'], //                                number of lines on screen or page\n  'lines_of_memory':                                       ['lm',                                 'lm'], //                                lines of memory if > line. 0 means varies\n  'magic_cookie_glitch':                                   ['xmc',                                'sg'], //                                number of blank characters left by smso or rmso\n  'max_attributes':                                        ['ma',                                 'ma'], //                                maximum combined attributes terminal can handle\n  'max_colors':                                            ['colors',                             'Co'], //                                maximum number of colors on screen\n  'max_pairs':                                             ['pairs',                              'pa'], //                                maximum number of color-pairs on the screen\n  'maximum_windows':                                       ['wnum',                               'MW'], //                                maximum number of defineable windows\n  'no_color_video':                                        ['ncv',                                'NC'], //                                video attributes that cannot be used with colors\n  'num_labels':                                            ['nlab',                               'Nl'], //                                number of labels on screen\n  'padding_baud_rate':                                     ['pb',                                 'pb'], //                                lowest baud rate where padding needed\n  'virtual_terminal':                                      ['vt',                                 'vt'], //                                virtual terminal number (CB/unix)\n  'width_status_line':                                     ['wsl',                                'ws'], //                                number of columns in status line\n\n  // The  following  numeric  capabilities  are present in the SVr4.0 term structure, but are not yet documented in the man page.  They came in with\n  // SVr4's printer support.\n\n\n  //         Variable                                      Cap-                               TCap                                  Description\n  //          Numeric                                      name                               Code\n  'bit_image_entwining':                                   ['bitwin',                             'Yo'], //                                number of passes for each bit-image row\n  'bit_image_type':                                        ['bitype',                             'Yp'], //                                type of bit-image device\n  'buffer_capacity':                                       ['bufsz',                              'Ya'], //                                numbers of bytes buffered before printing\n  'buttons':                                               ['btns',                               'BT'], //                                number of buttons on mouse\n  'dot_horz_spacing':                                      ['spinh',                              'Yc'], //                                spacing of dots hor‐ izontally in dots per inch\n  'dot_vert_spacing':                                      ['spinv',                              'Yb'], //                                spacing of pins ver‐ tically in pins per inch\n  'max_micro_address':                                     ['maddr',                              'Yd'], //                                maximum value in micro_..._address\n  'max_micro_jump':                                        ['mjump',                              'Ye'], //                                maximum value in parm_..._micro\n  'micro_col_size':                                        ['mcs',                                'Yf'], //                                character step size when in micro mode\n  'micro_line_size':                                       ['mls',                                'Yg'], //                                line step size when in micro mode\n  'number_of_pins':                                        ['npins',                              'Yh'], //                                numbers of pins in print-head\n  'output_res_char':                                       ['orc',                                'Yi'], //                                horizontal resolu‐ tion in units per line\n  'output_res_horz_inch':                                  ['orhi',                               'Yk'], //                                horizontal resolu‐ tion in units per inch\n  'output_res_line':                                       ['orl',                                'Yj'], //                                vertical resolution in units per line\n  'output_res_vert_inch':                                  ['orvi',                               'Yl'], //                                vertical resolution in units per inch\n  'print_rate':                                            ['cps',                                'Ym'], //                                print rate in char‐ acters per second\n  'wide_char_size':                                        ['widcs',                              'Yn']  //                                character step size when in double wide mode\n};\n\n// These are the string capabilities:\nalias.strings = {\n  //         Variable                                    Cap-                             TCap                                   Description\n  //          String                                     name                             Code\n  'acs_chars':                                           ['acsc',                             'ac'], //                              graphics charset pairs, based on vt100\n  'back_tab':                                            ['cbt',                              'bt'], //                              back tab (P)\n  'bell':                                                ['bel',                              'bl'], //                              audible signal (bell) (P)\n  'carriage_return':                                     ['cr',                               'cr'], //                              carriage return (P*) (P*)\n  'change_char_pitch':                                   ['cpi',                              'ZA'], //                              Change number of characters per inch to #1\n  'change_line_pitch':                                   ['lpi',                              'ZB'], //                              Change number of lines per inch to #1\n  'change_res_horz':                                     ['chr',                              'ZC'], //                              Change horizontal resolution to #1\n  'change_res_vert':                                     ['cvr',                              'ZD'], //                              Change vertical res‐ olution to #1\n  'change_scroll_region':                                ['csr',                              'cs'], //                              change region to line #1 to line #2 (P)\n  'char_padding':                                        ['rmp',                              'rP'], //                              like ip but when in insert mode\n  'clear_all_tabs':                                      ['tbc',                              'ct'], //                              clear all tab stops (P)\n  'clear_margins':                                       ['mgc',                              'MC'], //                              clear right and left soft margins\n  'clear_screen':                                        ['clear',                            'cl'], //                              clear screen and home cursor (P*)\n  'clr_bol':                                             ['el1',                              'cb'], //                              Clear to beginning of line\n  'clr_eol':                                             ['el',                               'ce'], //                              clear to end of line (P)\n  'clr_eos':                                             ['ed',                               'cd'], //                              clear to end of screen (P*)\n  'column_address':                                      ['hpa',                              'ch'], //                              horizontal position #1, absolute (P)\n  'command_character':                                   ['cmdch',                            'CC'], //                              terminal settable cmd character in prototype !?\n  'create_window':                                       ['cwin',                             'CW'], //                              define a window #1 from #2,#3 to #4,#5\n  'cursor_address':                                      ['cup',                              'cm'], //                              move to row #1 col‐ umns #2\n  'cursor_down':                                         ['cud1',                             'do'], //                              down one line\n  'cursor_home':                                         ['home',                             'ho'], //                              home cursor (if no cup)\n  'cursor_invisible':                                    ['civis',                            'vi'], //                              make cursor invisi‐ ble\n  'cursor_left':                                         ['cub1',                             'le'], //                              move left one space\n  'cursor_mem_address':                                  ['mrcup',                            'CM'], //                              memory relative cur‐ sor addressing, move to row #1 columns #2\n  'cursor_normal':                                       ['cnorm',                            've'], //                              make cursor appear normal (undo civis/cvvis)\n  'cursor_right':                                        ['cuf1',                             'nd'], //                              non-destructive space (move right one space)\n  'cursor_to_ll':                                        ['ll',                               'll'], //                              last line, first column (if no cup)\n  'cursor_up':                                           ['cuu1',                             'up'], //                              up one line\n  'cursor_visible':                                      ['cvvis',                            'vs'], //                              make cursor very visible\n  'define_char':                                         ['defc',                             'ZE'], //                              Define a character #1, #2 dots wide, descender #3\n  'delete_character':                                    ['dch1',                             'dc'], //                              delete character (P*)\n  'delete_line':                                         ['dl1',                              'dl'], //                              delete line (P*)\n  'dial_phone':                                          ['dial',                             'DI'], //                              dial number #1\n  'dis_status_line':                                     ['dsl',                              'ds'], //                              disable status line\n  'display_clock':                                       ['dclk',                             'DK'], //                              display clock\n  'down_half_line':                                      ['hd',                               'hd'], //                              half a line down\n  'ena_acs':                                             ['enacs',                            'eA'], //                              enable alternate char set\n  'enter_alt_charset_mode':                              ['smacs',                            'as'], //                              start alternate character set (P)\n  'enter_am_mode':                                       ['smam',                             'SA'], //                              turn on automatic margins\n  'enter_blink_mode':                                    ['blink',                            'mb'], //                              turn on blinking\n  'enter_bold_mode':                                     ['bold',                             'md'], //                              turn on bold (extra bright) mode\n  'enter_ca_mode':                                       ['smcup',                            'ti'], //                              string to start pro‐ grams using cup\n  'enter_delete_mode':                                   ['smdc',                             'dm'], //                              enter delete mode\n  'enter_dim_mode':                                      ['dim',                              'mh'], //                              turn on half-bright mode\n  'enter_doublewide_mode':                               ['swidm',                            'ZF'], //                              Enter double-wide mode\n  'enter_draft_quality':                                 ['sdrfq',                            'ZG'], //                              Enter draft-quality mode\n  'enter_insert_mode':                                   ['smir',                             'im'], //                              enter insert mode\n  'enter_italics_mode':                                  ['sitm',                             'ZH'], //                              Enter italic mode\n  'enter_leftward_mode':                                 ['slm',                              'ZI'], //                              Start leftward car‐ riage motion\n  'enter_micro_mode':                                    ['smicm',                            'ZJ'], //                              Start micro-motion mode\n  'enter_near_letter_quality':                           ['snlq',                             'ZK'], //                              Enter NLQ mode\n  'enter_normal_quality':                                ['snrmq',                            'ZL'], //                              Enter normal-quality mode\n  'enter_protected_mode':                                ['prot',                             'mp'], //                              turn on protected mode\n  'enter_reverse_mode':                                  ['rev',                              'mr'], //                              turn on reverse video mode\n  'enter_secure_mode':                                   ['invis',                            'mk'], //                              turn on blank mode (characters invisi‐ ble)\n  'enter_shadow_mode':                                   ['sshm',                             'ZM'], //                              Enter shadow-print mode\n  'enter_standout_mode':                                 ['smso',                             'so'], //                              begin standout mode\n  'enter_subscript_mode':                                ['ssubm',                            'ZN'], //                              Enter subscript mode\n  'enter_superscript_mode':                              ['ssupm',                            'ZO'], //                              Enter superscript mode\n  'enter_underline_mode':                                ['smul',                             'us'], //                              begin underline mode\n  'enter_upward_mode':                                   ['sum',                              'ZP'], //                              Start upward car‐ riage motion\n  'enter_xon_mode':                                      ['smxon',                            'SX'], //                              turn on xon/xoff handshaking\n  'erase_chars':                                         ['ech',                              'ec'], //                              erase #1 characters (P)\n  'exit_alt_charset_mode':                               ['rmacs',                            'ae'], //                              end alternate char‐ acter set (P)\n  'exit_am_mode':                                        ['rmam',                             'RA'], //                              turn off automatic margins\n  'exit_attribute_mode':                                 ['sgr0',                             'me'], //                              turn off all attributes\n  'exit_ca_mode':                                        ['rmcup',                            'te'], //                              strings to end pro‐ grams using cup\n  'exit_delete_mode':                                    ['rmdc',                             'ed'], //                              end delete mode\n  'exit_doublewide_mode':                                ['rwidm',                            'ZQ'], //                              End double-wide mode\n  'exit_insert_mode':                                    ['rmir',                             'ei'], //                              exit insert mode\n  'exit_italics_mode':                                   ['ritm',                             'ZR'], //                              End italic mode\n  'exit_leftward_mode':                                  ['rlm',                              'ZS'], //                              End left-motion mode\n\n\n  'exit_micro_mode':                                     ['rmicm',                            'ZT'], //                              End micro-motion mode\n  'exit_shadow_mode':                                    ['rshm',                             'ZU'], //                              End shadow-print mode\n  'exit_standout_mode':                                  ['rmso',                             'se'], //                              exit standout mode\n  'exit_subscript_mode':                                 ['rsubm',                            'ZV'], //                              End subscript mode\n  'exit_superscript_mode':                               ['rsupm',                            'ZW'], //                              End superscript mode\n  'exit_underline_mode':                                 ['rmul',                             'ue'], //                              exit underline mode\n  'exit_upward_mode':                                    ['rum',                              'ZX'], //                              End reverse charac‐ ter motion\n  'exit_xon_mode':                                       ['rmxon',                            'RX'], //                              turn off xon/xoff handshaking\n  'fixed_pause':                                         ['pause',                            'PA'], //                              pause for 2-3 sec‐ onds\n  'flash_hook':                                          ['hook',                             'fh'], //                              flash switch hook\n  'flash_screen':                                        ['flash',                            'vb'], //                              visible bell (may not move cursor)\n  'form_feed':                                           ['ff',                               'ff'], //                              hardcopy terminal page eject (P*)\n  'from_status_line':                                    ['fsl',                              'fs'], //                              return from status line\n  'goto_window':                                         ['wingo',                            'WG'], //                              go to window #1\n  'hangup':                                              ['hup',                              'HU'], //                              hang-up phone\n  'init_1string':                                        ['is1',                              'i1'], //                              initialization string\n  'init_2string':                                        ['is2',                              'is'], //                              initialization string\n  'init_3string':                                        ['is3',                              'i3'], //                              initialization string\n  'init_file':                                           ['if',                               'if'], //                              name of initializa‐ tion file\n  'init_prog':                                           ['iprog',                            'iP'], //                              path name of program for initialization\n  'initialize_color':                                    ['initc',                            'Ic'], //                              initialize color #1 to (#2,#3,#4)\n  'initialize_pair':                                     ['initp',                            'Ip'], //                              Initialize color pair #1 to fg=(#2,#3,#4), bg=(#5,#6,#7)\n  'insert_character':                                    ['ich1',                             'ic'], //                              insert character (P)\n  'insert_line':                                         ['il1',                              'al'], //                              insert line (P*)\n  'insert_padding':                                      ['ip',                               'ip'], //                              insert padding after inserted character\n  'key_a1':                                              ['ka1',                              'K1'], //                              upper left of keypad\n  'key_a3':                                              ['ka3',                              'K3'], //                              upper right of key‐ pad\n  'key_b2':                                              ['kb2',                              'K2'], //                              center of keypad\n  'key_backspace':                                       ['kbs',                              'kb'], //                              backspace key\n  'key_beg':                                             ['kbeg',                             '@1'], //                              begin key\n  'key_btab':                                            ['kcbt',                             'kB'], //                              back-tab key\n  'key_c1':                                              ['kc1',                              'K4'], //                              lower left of keypad\n  'key_c3':                                              ['kc3',                              'K5'], //                              lower right of key‐ pad\n  'key_cancel':                                          ['kcan',                             '@2'], //                              cancel key\n  'key_catab':                                           ['ktbc',                             'ka'], //                              clear-all-tabs key\n  'key_clear':                                           ['kclr',                             'kC'], //                              clear-screen or erase key\n  'key_close':                                           ['kclo',                             '@3'], //                              close key\n  'key_command':                                         ['kcmd',                             '@4'], //                              command key\n  'key_copy':                                            ['kcpy',                             '@5'], //                              copy key\n  'key_create':                                          ['kcrt',                             '@6'], //                              create key\n  'key_ctab':                                            ['kctab',                            'kt'], //                              clear-tab key\n  'key_dc':                                              ['kdch1',                            'kD'], //                              delete-character key\n  'key_dl':                                              ['kdl1',                             'kL'], //                              delete-line key\n  'key_down':                                            ['kcud1',                            'kd'], //                              down-arrow key\n\n  'key_eic':                                             ['krmir',                            'kM'], //                              sent by rmir or smir in insert mode\n  'key_end':                                             ['kend',                             '@7'], //                              end key\n  'key_enter':                                           ['kent',                             '@8'], //                              enter/send key\n  'key_eol':                                             ['kel',                              'kE'], //                              clear-to-end-of-line key\n  'key_eos':                                             ['ked',                              'kS'], //                              clear-to-end-of- screen key\n  'key_exit':                                            ['kext',                             '@9'], //                              exit key\n  'key_f0':                                              ['kf0',                              'k0'], //                              F0 function key\n  'key_f1':                                              ['kf1',                              'k1'], //                              F1 function key\n  'key_f10':                                             ['kf10',                             'k;'], //                              F10 function key\n  'key_f11':                                             ['kf11',                             'F1'], //                              F11 function key\n  'key_f12':                                             ['kf12',                             'F2'], //                              F12 function key\n  'key_f13':                                             ['kf13',                             'F3'], //                              F13 function key\n  'key_f14':                                             ['kf14',                             'F4'], //                              F14 function key\n  'key_f15':                                             ['kf15',                             'F5'], //                              F15 function key\n  'key_f16':                                             ['kf16',                             'F6'], //                              F16 function key\n  'key_f17':                                             ['kf17',                             'F7'], //                              F17 function key\n  'key_f18':                                             ['kf18',                             'F8'], //                              F18 function key\n  'key_f19':                                             ['kf19',                             'F9'], //                              F19 function key\n  'key_f2':                                              ['kf2',                              'k2'], //                              F2 function key\n  'key_f20':                                             ['kf20',                             'FA'], //                              F20 function key\n  'key_f21':                                             ['kf21',                             'FB'], //                              F21 function key\n  'key_f22':                                             ['kf22',                             'FC'], //                              F22 function key\n  'key_f23':                                             ['kf23',                             'FD'], //                              F23 function key\n  'key_f24':                                             ['kf24',                             'FE'], //                              F24 function key\n  'key_f25':                                             ['kf25',                             'FF'], //                              F25 function key\n  'key_f26':                                             ['kf26',                             'FG'], //                              F26 function key\n  'key_f27':                                             ['kf27',                             'FH'], //                              F27 function key\n  'key_f28':                                             ['kf28',                             'FI'], //                              F28 function key\n  'key_f29':                                             ['kf29',                             'FJ'], //                              F29 function key\n  'key_f3':                                              ['kf3',                              'k3'], //                              F3 function key\n  'key_f30':                                             ['kf30',                             'FK'], //                              F30 function key\n  'key_f31':                                             ['kf31',                             'FL'], //                              F31 function key\n  'key_f32':                                             ['kf32',                             'FM'], //                              F32 function key\n  'key_f33':                                             ['kf33',                             'FN'], //                              F33 function key\n  'key_f34':                                             ['kf34',                             'FO'], //                              F34 function key\n  'key_f35':                                             ['kf35',                             'FP'], //                              F35 function key\n  'key_f36':                                             ['kf36',                             'FQ'], //                              F36 function key\n  'key_f37':                                             ['kf37',                             'FR'], //                              F37 function key\n  'key_f38':                                             ['kf38',                             'FS'], //                              F38 function key\n  'key_f39':                                             ['kf39',                             'FT'], //                              F39 function key\n  'key_f4':                                              ['kf4',                              'k4'], //                              F4 function key\n  'key_f40':                                             ['kf40',                             'FU'], //                              F40 function key\n  'key_f41':                                             ['kf41',                             'FV'], //                              F41 function key\n  'key_f42':                                             ['kf42',                             'FW'], //                              F42 function key\n  'key_f43':                                             ['kf43',                             'FX'], //                              F43 function key\n  'key_f44':                                             ['kf44',                             'FY'], //                              F44 function key\n  'key_f45':                                             ['kf45',                             'FZ'], //                              F45 function key\n  'key_f46':                                             ['kf46',                             'Fa'], //                              F46 function key\n  'key_f47':                                             ['kf47',                             'Fb'], //                              F47 function key\n  'key_f48':                                             ['kf48',                             'Fc'], //                              F48 function key\n  'key_f49':                                             ['kf49',                             'Fd'], //                              F49 function key\n  'key_f5':                                              ['kf5',                              'k5'], //                              F5 function key\n  'key_f50':                                             ['kf50',                             'Fe'], //                              F50 function key\n  'key_f51':                                             ['kf51',                             'Ff'], //                              F51 function key\n  'key_f52':                                             ['kf52',                             'Fg'], //                              F52 function key\n  'key_f53':                                             ['kf53',                             'Fh'], //                              F53 function key\n  'key_f54':                                             ['kf54',                             'Fi'], //                              F54 function key\n  'key_f55':                                             ['kf55',                             'Fj'], //                              F55 function key\n  'key_f56':                                             ['kf56',                             'Fk'], //                              F56 function key\n  'key_f57':                                             ['kf57',                             'Fl'], //                              F57 function key\n  'key_f58':                                             ['kf58',                             'Fm'], //                              F58 function key\n  'key_f59':                                             ['kf59',                             'Fn'], //                              F59 function key\n\n  'key_f6':                                              ['kf6',                              'k6'], //                              F6 function key\n  'key_f60':                                             ['kf60',                             'Fo'], //                              F60 function key\n  'key_f61':                                             ['kf61',                             'Fp'], //                              F61 function key\n  'key_f62':                                             ['kf62',                             'Fq'], //                              F62 function key\n  'key_f63':                                             ['kf63',                             'Fr'], //                              F63 function key\n  'key_f7':                                              ['kf7',                              'k7'], //                              F7 function key\n  'key_f8':                                              ['kf8',                              'k8'], //                              F8 function key\n  'key_f9':                                              ['kf9',                              'k9'], //                              F9 function key\n  'key_find':                                            ['kfnd',                             '@0'], //                              find key\n  'key_help':                                            ['khlp',                             '%1'], //                              help key\n  'key_home':                                            ['khome',                            'kh'], //                              home key\n  'key_ic':                                              ['kich1',                            'kI'], //                              insert-character key\n  'key_il':                                              ['kil1',                             'kA'], //                              insert-line key\n  'key_left':                                            ['kcub1',                            'kl'], //                              left-arrow key\n  'key_ll':                                              ['kll',                              'kH'], //                              lower-left key (home down)\n  'key_mark':                                            ['kmrk',                             '%2'], //                              mark key\n  'key_message':                                         ['kmsg',                             '%3'], //                              message key\n  'key_move':                                            ['kmov',                             '%4'], //                              move key\n  'key_next':                                            ['knxt',                             '%5'], //                              next key\n  'key_npage':                                           ['knp',                              'kN'], //                              next-page key\n  'key_open':                                            ['kopn',                             '%6'], //                              open key\n  'key_options':                                         ['kopt',                             '%7'], //                              options key\n  'key_ppage':                                           ['kpp',                              'kP'], //                              previous-page key\n  'key_previous':                                        ['kprv',                             '%8'], //                              previous key\n  'key_print':                                           ['kprt',                             '%9'], //                              print key\n  'key_redo':                                            ['krdo',                             '%0'], //                              redo key\n  'key_reference':                                       ['kref',                             '&1'], //                              reference key\n  'key_refresh':                                         ['krfr',                             '&2'], //                              refresh key\n  'key_replace':                                         ['krpl',                             '&3'], //                              replace key\n  'key_restart':                                         ['krst',                             '&4'], //                              restart key\n  'key_resume':                                          ['kres',                             '&5'], //                              resume key\n  'key_right':                                           ['kcuf1',                            'kr'], //                              right-arrow key\n  'key_save':                                            ['ksav',                             '&6'], //                              save key\n  'key_sbeg':                                            ['kBEG',                             '&9'], //                              shifted begin key\n  'key_scancel':                                         ['kCAN',                             '&0'], //                              shifted cancel key\n  'key_scommand':                                        ['kCMD',                             '*1'], //                              shifted command key\n  'key_scopy':                                           ['kCPY',                             '*2'], //                              shifted copy key\n  'key_screate':                                         ['kCRT',                             '*3'], //                              shifted create key\n  'key_sdc':                                             ['kDC',                              '*4'], //                              shifted delete-char‐ acter key\n  'key_sdl':                                             ['kDL',                              '*5'], //                              shifted delete-line key\n  'key_select':                                          ['kslt',                             '*6'], //                              select key\n  'key_send':                                            ['kEND',                             '*7'], //                              shifted end key\n  'key_seol':                                            ['kEOL',                             '*8'], //                              shifted clear-to- end-of-line key\n  'key_sexit':                                           ['kEXT',                             '*9'], //                              shifted exit key\n  'key_sf':                                              ['kind',                             'kF'], //                              scroll-forward key\n  'key_sfind':                                           ['kFND',                             '*0'], //                              shifted find key\n  'key_shelp':                                           ['kHLP',                             '#1'], //                              shifted help key\n  'key_shome':                                           ['kHOM',                             '#2'], //                              shifted home key\n  'key_sic':                                             ['kIC',                              '#3'], //                              shifted insert-char‐ acter key\n  'key_sleft':                                           ['kLFT',                             '#4'], //                              shifted left-arrow key\n  'key_smessage':                                        ['kMSG',                             '%a'], //                              shifted message key\n  'key_smove':                                           ['kMOV',                             '%b'], //                              shifted move key\n  'key_snext':                                           ['kNXT',                             '%c'], //                              shifted next key\n  'key_soptions':                                        ['kOPT',                             '%d'], //                              shifted options key\n  'key_sprevious':                                       ['kPRV',                             '%e'], //                              shifted previous key\n  'key_sprint':                                          ['kPRT',                             '%f'], //                              shifted print key\n  'key_sr':                                              ['kri',                              'kR'], //                              scroll-backward key\n  'key_sredo':                                           ['kRDO',                             '%g'], //                              shifted redo key\n  'key_sreplace':                                        ['kRPL',                             '%h'], //                              shifted replace key\n\n  'key_sright':                                          ['kRIT',                             '%i'], //                              shifted right-arrow key\n  'key_srsume':                                          ['kRES',                             '%j'], //                              shifted resume key\n  'key_ssave':                                           ['kSAV',                             '!1'], //                              shifted save key\n  'key_ssuspend':                                        ['kSPD',                             '!2'], //                              shifted suspend key\n  'key_stab':                                            ['khts',                             'kT'], //                              set-tab key\n  'key_sundo':                                           ['kUND',                             '!3'], //                              shifted undo key\n  'key_suspend':                                         ['kspd',                             '&7'], //                              suspend key\n  'key_undo':                                            ['kund',                             '&8'], //                              undo key\n  'key_up':                                              ['kcuu1',                            'ku'], //                              up-arrow key\n  'keypad_local':                                        ['rmkx',                             'ke'], //                              leave 'key‐ board_transmit' mode\n  'keypad_xmit':                                         ['smkx',                             'ks'], //                              enter 'key‐ board_transmit' mode\n  'lab_f0':                                              ['lf0',                              'l0'], //                              label on function key f0 if not f0\n  'lab_f1':                                              ['lf1',                              'l1'], //                              label on function key f1 if not f1\n  'lab_f10':                                             ['lf10',                             'la'], //                              label on function key f10 if not f10\n  'lab_f2':                                              ['lf2',                              'l2'], //                              label on function key f2 if not f2\n  'lab_f3':                                              ['lf3',                              'l3'], //                              label on function key f3 if not f3\n  'lab_f4':                                              ['lf4',                              'l4'], //                              label on function key f4 if not f4\n  'lab_f5':                                              ['lf5',                              'l5'], //                              label on function key f5 if not f5\n  'lab_f6':                                              ['lf6',                              'l6'], //                              label on function key f6 if not f6\n  'lab_f7':                                              ['lf7',                              'l7'], //                              label on function key f7 if not f7\n  'lab_f8':                                              ['lf8',                              'l8'], //                              label on function key f8 if not f8\n  'lab_f9':                                              ['lf9',                              'l9'], //                              label on function key f9 if not f9\n  'label_format':                                        ['fln',                              'Lf'], //                              label format\n  'label_off':                                           ['rmln',                             'LF'], //                              turn off soft labels\n  'label_on':                                            ['smln',                             'LO'], //                              turn on soft labels\n  'meta_off':                                            ['rmm',                              'mo'], //                              turn off meta mode\n  'meta_on':                                             ['smm',                              'mm'], //                              turn on meta mode (8th-bit on)\n  'micro_column_address':                                ['mhpa',                             'ZY'], //                              Like column_address in micro mode\n  'micro_down':                                          ['mcud1',                            'ZZ'], //                              Like cursor_down in micro mode\n  'micro_left':                                          ['mcub1',                            'Za'], //                              Like cursor_left in micro mode\n  'micro_right':                                         ['mcuf1',                            'Zb'], //                              Like cursor_right in micro mode\n  'micro_row_address':                                   ['mvpa',                             'Zc'], //                              Like row_address #1 in micro mode\n  'micro_up':                                            ['mcuu1',                            'Zd'], //                              Like cursor_up in micro mode\n  'newline':                                             ['nel',                              'nw'], //                              newline (behave like cr followed by lf)\n  'order_of_pins':                                       ['porder',                           'Ze'], //                              Match software bits to print-head pins\n  'orig_colors':                                         ['oc',                               'oc'], //                              Set all color pairs to the original ones\n  'orig_pair':                                           ['op',                               'op'], //                              Set default pair to its original value\n  'pad_char':                                            ['pad',                              'pc'], //                              padding char (instead of null)\n\n\n  'parm_dch':                                            ['dch',                              'DC'], //                              delete #1 characters (P*)\n  'parm_delete_line':                                    ['dl',                               'DL'], //                              delete #1 lines (P*)\n  'parm_down_cursor':                                    ['cud',                              'DO'], //                              down #1 lines (P*)\n  'parm_down_micro':                                     ['mcud',                             'Zf'], //                              Like parm_down_cur‐ sor in micro mode\n  'parm_ich':                                            ['ich',                              'IC'], //                              insert #1 characters (P*)\n  'parm_index':                                          ['indn',                             'SF'], //                              scroll forward #1 lines (P)\n  'parm_insert_line':                                    ['il',                               'AL'], //                              insert #1 lines (P*)\n  'parm_left_cursor':                                    ['cub',                              'LE'], //                              move #1 characters to the left (P)\n  'parm_left_micro':                                     ['mcub',                             'Zg'], //                              Like parm_left_cur‐ sor in micro mode\n  'parm_right_cursor':                                   ['cuf',                              'RI'], //                              move #1 characters to the right (P*)\n  'parm_right_micro':                                    ['mcuf',                             'Zh'], //                              Like parm_right_cur‐ sor in micro mode\n  'parm_rindex':                                         ['rin',                              'SR'], //                              scroll back #1 lines (P)\n  'parm_up_cursor':                                      ['cuu',                              'UP'], //                              up #1 lines (P*)\n  'parm_up_micro':                                       ['mcuu',                             'Zi'], //                              Like parm_up_cursor in micro mode\n  'pkey_key':                                            ['pfkey',                            'pk'], //                              program function key #1 to type string #2\n  'pkey_local':                                          ['pfloc',                            'pl'], //                              program function key #1 to execute string #2\n  'pkey_xmit':                                           ['pfx',                              'px'], //                              program function key #1 to transmit string #2\n  'plab_norm':                                           ['pln',                              'pn'], //                              program label #1 to show string #2\n  'print_screen':                                        ['mc0',                              'ps'], //                              print contents of screen\n  'prtr_non':                                            ['mc5p',                             'pO'], //                              turn on printer for #1 bytes\n  'prtr_off':                                            ['mc4',                              'pf'], //                              turn off printer\n  'prtr_on':                                             ['mc5',                              'po'], //                              turn on printer\n  'pulse':                                               ['pulse',                            'PU'], //                              select pulse dialing\n  'quick_dial':                                          ['qdial',                            'QD'], //                              dial number #1 with‐ out checking\n  'remove_clock':                                        ['rmclk',                            'RC'], //                              remove clock\n  'repeat_char':                                         ['rep',                              'rp'], //                              repeat char #1 #2 times (P*)\n  'req_for_input':                                       ['rfi',                              'RF'], //                              send next input char (for ptys)\n  'reset_1string':                                       ['rs1',                              'r1'], //                              reset string\n  'reset_2string':                                       ['rs2',                              'r2'], //                              reset string\n  'reset_3string':                                       ['rs3',                              'r3'], //                              reset string\n  'reset_file':                                          ['rf',                               'rf'], //                              name of reset file\n  'restore_cursor':                                      ['rc',                               'rc'], //                              restore cursor to position of last save_cursor\n  'row_address':                                         ['vpa',                              'cv'], //                              vertical position #1 absolute (P)\n  'save_cursor':                                         ['sc',                               'sc'], //                              save current cursor position (P)\n  'scroll_forward':                                      ['ind',                              'sf'], //                              scroll text up (P)\n  'scroll_reverse':                                      ['ri',                               'sr'], //                              scroll text down (P)\n  'select_char_set':                                     ['scs',                              'Zj'], //                              Select character set, #1\n\n\n\n  'set_attributes':                                      ['sgr',                              'sa'], //                              define video attributes #1-#9 (PG9)\n  'set_background':                                      ['setb',                             'Sb'], //                              Set background color #1\n  'set_bottom_margin':                                   ['smgb',                             'Zk'], //                              Set bottom margin at current line\n  'set_bottom_margin_parm':                              ['smgbp',                            'Zl'], //                              Set bottom margin at line #1 or (if smgtp is not given) #2 lines from bottom\n  'set_clock':                                           ['sclk',                             'SC'], //                              set clock, #1 hrs #2 mins #3 secs\n  'set_color_pair':                                      ['scp',                              'sp'], //                              Set current color pair to #1\n  'set_foreground':                                      ['setf',                             'Sf'], //                              Set foreground color #1\n  'set_left_margin':                                     ['smgl',                             'ML'], //                              set left soft margin at current col‐ umn.  See smgl. (ML is not in BSD termcap).\n  'set_left_margin_parm':                                ['smglp',                            'Zm'], //                              Set left (right) margin at column #1\n  'set_right_margin':                                    ['smgr',                             'MR'], //                              set right soft margin at current column\n  'set_right_margin_parm':                               ['smgrp',                            'Zn'], //                              Set right margin at column #1\n  'set_tab':                                             ['hts',                              'st'], //                              set a tab in every row, current columns\n  'set_top_margin':                                      ['smgt',                             'Zo'], //                              Set top margin at current line\n  'set_top_margin_parm':                                 ['smgtp',                            'Zp'], //                              Set top (bottom) margin at row #1\n  'set_window':                                          ['wind',                             'wi'], //                              current window is lines #1-#2 cols #3-#4\n  'start_bit_image':                                     ['sbim',                             'Zq'], //                              Start printing bit image graphics\n  'start_char_set_def':                                  ['scsd',                             'Zr'], //                              Start character set defi‐ nition #1, with #2 charac‐ ters in the set\n  'stop_bit_image':                                      ['rbim',                             'Zs'], //                              Stop printing bit image graphics\n  'stop_char_set_def':                                   ['rcsd',                             'Zt'], //                              End definition of charac‐ ter set #1\n  'subscript_characters':                                ['subcs',                            'Zu'], //                              List of subscriptable characters\n  'superscript_characters':                              ['supcs',                            'Zv'], //                              List of superscriptable characters\n  'tab':                                                 ['ht',                               'ta'], //                              tab to next 8-space hard‐ ware tab stop\n  'these_cause_cr':                                      ['docr',                             'Zw'], //                              Printing any of these characters causes CR\n  'to_status_line':                                      ['tsl',                              'ts'], //                              move to status line, col‐ umn #1\n  'tone':                                                ['tone',                             'TO'], //                              select touch tone dialing\n  'underline_char':                                      ['uc',                               'uc'], //                              underline char and move past it\n  'up_half_line':                                        ['hu',                               'hu'], //                              half a line up\n  'user0':                                               ['u0',                               'u0'], //                              User string #0\n  'user1':                                               ['u1',                               'u1'], //                              User string #1\n  'user2':                                               ['u2',                               'u2'], //                              User string #2\n  'user3':                                               ['u3',                               'u3'], //                              User string #3\n  'user4':                                               ['u4',                               'u4'], //                              User string #4\n  'user5':                                               ['u5',                               'u5'], //                              User string #5\n\n  'user6':                                               ['u6',                               'u6'], //                              User string #6\n  'user7':                                               ['u7',                               'u7'], //                              User string #7\n  'user8':                                               ['u8',                               'u8'], //                              User string #8\n  'user9':                                               ['u9',                               'u9'], //                              User string #9\n  'wait_tone':                                           ['wait',                             'WA'], //                              wait for dial-tone\n  'xoff_character':                                      ['xoffc',                            'XF'], //                              XOFF character\n  'xon_character':                                       ['xonc',                             'XN'], //                              XON character\n  'zero_motion':                                         ['zerom',                            'Zx'], //                              No motion for subsequent character\n\n  // The following string capabilities are present in the SVr4.0 term structure, but were originally not documented in the man page.\n\n\n  //         Variable                                      Cap-                                 TCap                                 Description\n  //          String                                       name                                 Code\n  'alt_scancode_esc':                                      ['scesa',                                'S8'], //                                Alternate escape for scancode emu‐ lation\n  'bit_image_carriage_return':                             ['bicr',                                 'Yv'], //                                Move to beginning of same row\n  'bit_image_newline':                                     ['binel',                                'Zz'], //                                Move to next row of the bit image\n  'bit_image_repeat':                                      ['birep',                                'Xy'], //                                Repeat bit image cell #1 #2 times\n  'char_set_names':                                        ['csnm',                                 'Zy'], //                                Produce #1'th item from list of char‐ acter set names\n  'code_set_init':                                         ['csin',                                 'ci'], //                                Init sequence for multiple codesets\n  'color_names':                                           ['colornm',                              'Yw'], //                                Give name for color #1\n  'define_bit_image_region':                               ['defbi',                                'Yx'], //                                Define rectan‐ gualar bit image region\n  'device_type':                                           ['devt',                                 'dv'], //                                Indicate lan‐ guage/codeset sup‐ port\n  'display_pc_char':                                       ['dispc',                                'S1'], //                                Display PC charac‐ ter #1\n  'end_bit_image_region':                                  ['endbi',                                'Yy'], //                                End a bit-image region\n  'enter_pc_charset_mode':                                 ['smpch',                                'S2'], //                                Enter PC character display mode\n  'enter_scancode_mode':                                   ['smsc',                                 'S4'], //                                Enter PC scancode mode\n  'exit_pc_charset_mode':                                  ['rmpch',                                'S3'], //                                Exit PC character display mode\n  'exit_scancode_mode':                                    ['rmsc',                                 'S5'], //                                Exit PC scancode mode\n  'get_mouse':                                             ['getm',                                 'Gm'], //                                Curses should get button events, parameter #1 not documented.\n  'key_mouse':                                             ['kmous',                                'Km'], //                                Mouse event has occurred\n  'mouse_info':                                            ['minfo',                                'Mi'], //                                Mouse status information\n  'pc_term_options':                                       ['pctrm',                                'S6'], //                                PC terminal options\n  'pkey_plab':                                             ['pfxl',                                 'xl'], //                                Program function key #1 to type string #2 and show string #3\n  'req_mouse_pos':                                         ['reqmp',                                'RQ'], //                                Request mouse position\n\n  'scancode_escape':                                       ['scesc',                                'S7'], //                                Escape for scan‐ code emulation\n  'set0_des_seq':                                          ['s0ds',                                 's0'], //                                Shift to codeset 0 (EUC set 0, ASCII)\n  'set1_des_seq':                                          ['s1ds',                                 's1'], //                                Shift to codeset 1\n  'set2_des_seq':                                          ['s2ds',                                 's2'], //                                Shift to codeset 2\n  'set3_des_seq':                                          ['s3ds',                                 's3'], //                                Shift to codeset 3\n  'set_a_background':                                      ['setab',                                'AB'], //                                Set background color to #1, using ANSI escape\n  'set_a_foreground':                                      ['setaf',                                'AF'], //                                Set foreground color to #1, using ANSI escape\n  'set_color_band':                                        ['setcolor',                             'Yz'], //                                Change to ribbon color #1\n  'set_lr_margin':                                         ['smglr',                                'ML'], //                                Set both left and right margins to #1, #2.  (ML is not in BSD term‐ cap).\n  'set_page_length':                                       ['slines',                               'YZ'], //                                Set page length to #1 lines\n  'set_tb_margin':                                         ['smgtb',                                'MT'], //                                Sets both top and bottom margins to #1, #2\n\n  // The XSI Curses standard added these.  They are some post-4.1 versions of System V curses, e.g., Solaris 2.5 and IRIX 6.x.  The ncurses termcap\n  // names for them are invented; according to the XSI Curses standard, they have no termcap names.  If your compiled terminfo entries  use  these,\n  // they may not be binary-compatible with System V terminfo entries after SVr4.1; beware!\n\n\n  //         Variable                                      Cap-                               TCap                                 Description\n  //          String                                       name                               Code\n  'enter_horizontal_hl_mode':                              ['ehhlm',                              'Xh'], //                               Enter horizontal highlight mode\n  'enter_left_hl_mode':                                    ['elhlm',                              'Xl'], //                               Enter left highlight mode\n  'enter_low_hl_mode':                                     ['elohlm',                             'Xo'], //                               Enter low highlight mode\n  'enter_right_hl_mode':                                   ['erhlm',                              'Xr'], //                               Enter right high‐ light mode\n  'enter_top_hl_mode':                                     ['ethlm',                              'Xt'], //                               Enter top highlight mode\n  'enter_vertical_hl_mode':                                ['evhlm',                              'Xv'], //                               Enter vertical high‐ light mode\n  'set_a_attributes':                                      ['sgr1',                               'sA'], //                               Define second set of video attributes #1-#6\n  'set_pglen_inch':                                        ['slength',                            'sL']  //                               YI Set page length to #1 hundredth of an inch\n};\n"
  },
  {
    "path": "lib/blessed.js",
    "content": "/**\n * blessed - a high-level terminal interface library for node.js\n * Copyright (c) 2013-2015, Christopher Jeffrey and contributors (MIT License).\n * https://github.com/chjj/blessed\n */\n\n/**\n * Blessed\n */\n\nfunction blessed() {\n  return blessed.program.apply(null, arguments);\n}\n\nblessed.program = blessed.Program = require('./program');\nblessed.tput = blessed.Tput = require('./tput');\nblessed.widget = require('./widget');\nblessed.colors = require('./colors');\nblessed.unicode = require('./unicode');\nblessed.helpers = require('./helpers');\n\nblessed.helpers.sprintf = blessed.tput.sprintf;\nblessed.helpers.tryRead = blessed.tput.tryRead;\nblessed.helpers.merge(blessed, blessed.helpers);\n\nblessed.helpers.merge(blessed, blessed.widget);\n\n/**\n * Expose\n */\n\nmodule.exports = blessed;\n"
  },
  {
    "path": "lib/colors.js",
    "content": "/**\n * colors.js - color-related functions for blessed.\n * Copyright (c) 2013-2015, Christopher Jeffrey and contributors (MIT License).\n * https://github.com/chjj/blessed\n */\n\nexports.match = function(r1, g1, b1) {\n  if (typeof r1 === 'string') {\n    var hex = r1;\n    if (hex[0] !== '#') {\n      return -1;\n    }\n    hex = exports.hexToRGB(hex);\n    r1 = hex[0], g1 = hex[1], b1 = hex[2];\n  } else if (Array.isArray(r1)) {\n    b1 = r1[2], g1 = r1[1], r1 = r1[0];\n  }\n\n  var hash = (r1 << 16) | (g1 << 8) | b1;\n\n  if (exports._cache[hash] != null) {\n    return exports._cache[hash];\n  }\n\n  var ldiff = Infinity\n    , li = -1\n    , i = 0\n    , c\n    , r2\n    , g2\n    , b2\n    , diff;\n\n  for (; i < exports.vcolors.length; i++) {\n    c = exports.vcolors[i];\n    r2 = c[0];\n    g2 = c[1];\n    b2 = c[2];\n\n    diff = colorDistance(r1, g1, b1, r2, g2, b2);\n\n    if (diff === 0) {\n      li = i;\n      break;\n    }\n\n    if (diff < ldiff) {\n      ldiff = diff;\n      li = i;\n    }\n  }\n\n  return exports._cache[hash] = li;\n};\n\nexports.RGBToHex = function(r, g, b) {\n  if (Array.isArray(r)) {\n    b = r[2], g = r[1], r = r[0];\n  }\n\n  function hex(n) {\n    n = n.toString(16);\n    if (n.length < 2) n = '0' + n;\n    return n;\n  }\n\n  return '#' + hex(r) + hex(g) + hex(b);\n};\n\nexports.hexToRGB = function(hex) {\n  if (hex.length === 4) {\n    hex = hex[0]\n      + hex[1] + hex[1]\n      + hex[2] + hex[2]\n      + hex[3] + hex[3];\n  }\n\n  var col = parseInt(hex.substring(1), 16)\n    , r = (col >> 16) & 0xff\n    , g = (col >> 8) & 0xff\n    , b = col & 0xff;\n\n  return [r, g, b];\n};\n\n// As it happens, comparing how similar two colors are is really hard. Here is\n// one of the simplest solutions, which doesn't require conversion to another\n// color space, posted on stackoverflow[1]. Maybe someone better at math can\n// propose a superior solution.\n// [1] http://stackoverflow.com/questions/1633828\n\nfunction colorDistance(r1, g1, b1, r2, g2, b2) {\n  return Math.pow(30 * (r1 - r2), 2)\n    + Math.pow(59 * (g1 - g2), 2)\n    + Math.pow(11 * (b1 - b2), 2);\n}\n\n// This might work well enough for a terminal's colors: treat RGB as XYZ in a\n// 3-dimensional space and go midway between the two points.\nexports.mixColors = function(c1, c2, alpha) {\n  // if (c1 === 0x1ff) return c1;\n  // if (c2 === 0x1ff) return c1;\n  if (c1 === 0x1ff) c1 = 0;\n  if (c2 === 0x1ff) c2 = 0;\n  if (alpha == null) alpha = 0.5;\n\n  c1 = exports.vcolors[c1];\n  var r1 = c1[0];\n  var g1 = c1[1];\n  var b1 = c1[2];\n\n  c2 = exports.vcolors[c2];\n  var r2 = c2[0];\n  var g2 = c2[1];\n  var b2 = c2[2];\n\n  r1 += (r2 - r1) * alpha | 0;\n  g1 += (g2 - g1) * alpha | 0;\n  b1 += (b2 - b1) * alpha | 0;\n\n  return exports.match([r1, g1, b1]);\n};\n\nexports.blend = function blend(attr, attr2, alpha) {\n  var name, i, c, nc;\n\n  var bg = attr & 0x1ff;\n  if (attr2 != null) {\n    var bg2 = attr2 & 0x1ff;\n    if (bg === 0x1ff) bg = 0;\n    if (bg2 === 0x1ff) bg2 = 0;\n    bg = exports.mixColors(bg, bg2, alpha);\n  } else {\n    if (blend._cache[bg] != null) {\n      bg = blend._cache[bg];\n    // } else if (bg < 8) {\n    //   bg += 8;\n    } else if (bg >= 8 && bg <= 15) {\n      bg -= 8;\n    } else {\n      name = exports.ncolors[bg];\n      if (name) {\n        for (i = 0; i < exports.ncolors.length; i++) {\n          if (name === exports.ncolors[i] && i !== bg) {\n            c = exports.vcolors[bg];\n            nc = exports.vcolors[i];\n            if (nc[0] + nc[1] + nc[2] < c[0] + c[1] + c[2]) {\n              blend._cache[bg] = i;\n              bg = i;\n              break;\n            }\n          }\n        }\n      }\n    }\n  }\n\n  attr &= ~0x1ff;\n  attr |= bg;\n\n  var fg = (attr >> 9) & 0x1ff;\n  if (attr2 != null) {\n    var fg2 = (attr2 >> 9) & 0x1ff;\n    // 0, 7, 188, 231, 251\n    if (fg === 0x1ff) {\n      // XXX workaround\n      fg = 248;\n    } else {\n      if (fg === 0x1ff) fg = 7;\n      if (fg2 === 0x1ff) fg2 = 7;\n      fg = exports.mixColors(fg, fg2, alpha);\n    }\n  } else {\n    if (blend._cache[fg] != null) {\n      fg = blend._cache[fg];\n    // } else if (fg < 8) {\n    //   fg += 8;\n    } else if (fg >= 8 && fg <= 15) {\n      fg -= 8;\n    } else {\n      name = exports.ncolors[fg];\n      if (name) {\n        for (i = 0; i < exports.ncolors.length; i++) {\n          if (name === exports.ncolors[i] && i !== fg) {\n            c = exports.vcolors[fg];\n            nc = exports.vcolors[i];\n            if (nc[0] + nc[1] + nc[2] < c[0] + c[1] + c[2]) {\n              blend._cache[fg] = i;\n              fg = i;\n              break;\n            }\n          }\n        }\n      }\n    }\n  }\n\n  attr &= ~(0x1ff << 9);\n  attr |= fg << 9;\n\n  return attr;\n};\n\nexports.blend._cache = {};\n\nexports._cache = {};\n\nexports.reduce = function(color, total) {\n  if (color >= 16 && total <= 16) {\n    color = exports.ccolors[color];\n  } else if (color >= 8 && total <= 8) {\n    color -= 8;\n  } else if (color >= 2 && total <= 2) {\n    color %= 2;\n  }\n  return color;\n};\n\n// XTerm Colors\n// These were actually tough to track down. The xterm source only uses color\n// keywords. The X11 source needed to be examined to find the actual values.\n// They then had to be mapped to rgb values and then converted to hex values.\nexports.xterm = [\n  '#000000', // black\n  '#cd0000', // red3\n  '#00cd00', // green3\n  '#cdcd00', // yellow3\n  '#0000ee', // blue2\n  '#cd00cd', // magenta3\n  '#00cdcd', // cyan3\n  '#e5e5e5', // gray90\n  '#7f7f7f', // gray50\n  '#ff0000', // red\n  '#00ff00', // green\n  '#ffff00', // yellow\n  '#5c5cff', // rgb:5c/5c/ff\n  '#ff00ff', // magenta\n  '#00ffff', // cyan\n  '#ffffff'  // white\n];\n\n// Seed all 256 colors. Assume xterm defaults.\n// Ported from the xterm color generation script.\nexports.colors = (function() {\n  var cols = exports.colors = []\n    , _cols = exports.vcolors = []\n    , r\n    , g\n    , b\n    , i\n    , l;\n\n  function hex(n) {\n    n = n.toString(16);\n    if (n.length < 2) n = '0' + n;\n    return n;\n  }\n\n  function push(i, r, g, b) {\n    cols[i] = '#' + hex(r) + hex(g) + hex(b);\n    _cols[i] = [r, g, b];\n  }\n\n  // 0 - 15\n  exports.xterm.forEach(function(c, i) {\n    c = parseInt(c.substring(1), 16);\n    push(i, (c >> 16) & 0xff, (c >> 8) & 0xff, c & 0xff);\n  });\n\n  // 16 - 231\n  for (r = 0; r < 6; r++) {\n    for (g = 0; g < 6; g++) {\n      for (b = 0; b < 6; b++) {\n        i = 16 + (r * 36) + (g * 6) + b;\n        push(i,\n          r ? (r * 40 + 55) : 0,\n          g ? (g * 40 + 55) : 0,\n          b ? (b * 40 + 55) : 0);\n      }\n    }\n  }\n\n  // 232 - 255 are grey.\n  for (g = 0; g < 24; g++) {\n    l = (g * 10) + 8;\n    i = 232 + g;\n    push(i, l, l, l);\n  }\n\n  return cols;\n})();\n\n// Map higher colors to the first 8 colors.\n// This allows translation of high colors to low colors on 8-color terminals.\nexports.ccolors = (function() {\n  var _cols = exports.vcolors.slice()\n    , cols = exports.colors.slice()\n    , out;\n\n  exports.vcolors = exports.vcolors.slice(0, 8);\n  exports.colors = exports.colors.slice(0, 8);\n\n  out = cols.map(exports.match);\n\n  exports.colors = cols;\n  exports.vcolors = _cols;\n  exports.ccolors = out;\n\n  return out;\n})();\n\nvar colorNames = exports.colorNames = {\n  // special\n  default: -1,\n  normal: -1,\n  bg: -1,\n  fg: -1,\n  // normal\n  black: 0,\n  red: 1,\n  green: 2,\n  yellow: 3,\n  blue: 4,\n  magenta: 5,\n  cyan: 6,\n  white: 7,\n  // light\n  lightblack: 8,\n  lightred: 9,\n  lightgreen: 10,\n  lightyellow: 11,\n  lightblue: 12,\n  lightmagenta: 13,\n  lightcyan: 14,\n  lightwhite: 15,\n  // bright\n  brightblack: 8,\n  brightred: 9,\n  brightgreen: 10,\n  brightyellow: 11,\n  brightblue: 12,\n  brightmagenta: 13,\n  brightcyan: 14,\n  brightwhite: 15,\n  // alternate spellings\n  grey: 8,\n  gray: 8,\n  lightgrey: 7,\n  lightgray: 7,\n  brightgrey: 7,\n  brightgray: 7\n};\n\nexports.convert = function(color) {\n  if (typeof color === 'number') {\n    ;\n  } else if (typeof color === 'string') {\n    color = color.replace(/[\\- ]/g, '');\n    if (colorNames[color] != null) {\n      color = colorNames[color];\n    } else {\n      color = exports.match(color);\n    }\n  } else if (Array.isArray(color)) {\n    color = exports.match(color);\n  } else {\n    color = -1;\n  }\n  return color !== -1 ? color : 0x1ff;\n};\n\n// Map higher colors to the first 8 colors.\n// This allows translation of high colors to low colors on 8-color terminals.\n// Why the hell did I do this by hand?\nexports.ccolors = {\n  blue: [\n    4,\n    12,\n    [17, 21],\n    [24, 27],\n    [31, 33],\n    [38, 39],\n    45,\n    [54, 57],\n    [60, 63],\n    [67, 69],\n    [74, 75],\n    81,\n    [91, 93],\n    [97, 99],\n    [103, 105],\n    [110, 111],\n    117,\n    [128, 129],\n    [134, 135],\n    [140, 141],\n    [146, 147],\n    153,\n    165,\n    171,\n    177,\n    183,\n    189\n  ],\n\n  green: [\n    2,\n    10,\n    22,\n    [28, 29],\n    [34, 36],\n    [40, 43],\n    [46, 50],\n    [64, 65],\n    [70, 72],\n    [76, 79],\n    [82, 86],\n    [106, 108],\n    [112, 115],\n    [118, 122],\n    [148, 151],\n    [154, 158],\n    [190, 194]\n  ],\n\n  cyan: [\n    6,\n    14,\n    23,\n    30,\n    37,\n    44,\n    51,\n    66,\n    73,\n    80,\n    87,\n    109,\n    116,\n    123,\n    152,\n    159,\n    195\n  ],\n\n  red: [\n    1,\n    9,\n    52,\n    [88, 89],\n    [94, 95],\n    [124, 126],\n    [130, 132],\n    [136, 138],\n    [160, 163],\n    [166, 169],\n    [172, 175],\n    [178, 181],\n    [196, 200],\n    [202, 206],\n    [208, 212],\n    [214, 218],\n    [220, 224]\n  ],\n\n  magenta: [\n    5,\n    13,\n    53,\n    90,\n    96,\n    127,\n    133,\n    139,\n    164,\n    170,\n    176,\n    182,\n    201,\n    207,\n    213,\n    219,\n    225\n  ],\n\n  yellow: [\n    3,\n    11,\n    58,\n    [100, 101],\n    [142, 144],\n    [184, 187],\n    [226, 230]\n  ],\n\n  black: [\n    0,\n    8,\n    16,\n    59,\n    102,\n    [232, 243]\n  ],\n\n  white: [\n    7,\n    15,\n    145,\n    188,\n    231,\n    [244, 255]\n  ]\n};\n\nexports.ncolors = [];\n\nObject.keys(exports.ccolors).forEach(function(name) {\n  exports.ccolors[name].forEach(function(offset) {\n    if (typeof offset === 'number') {\n      exports.ncolors[offset] = name;\n      exports.ccolors[offset] = exports.colorNames[name];\n      return;\n    }\n    for (var i = offset[0], l = offset[1]; i <= l; i++) {\n      exports.ncolors[i] = name;\n      exports.ccolors[i] = exports.colorNames[name];\n    }\n  });\n  delete exports.ccolors[name];\n});\n"
  },
  {
    "path": "lib/events.js",
    "content": "/**\n * events.js - event emitter for blessed\n * Copyright (c) 2013-2015, Christopher Jeffrey and contributors (MIT License).\n * https://github.com/chjj/blessed\n */\n\nvar slice = Array.prototype.slice;\n\n/**\n * EventEmitter\n */\n\nfunction EventEmitter() {\n  if (!this._events) this._events = {};\n}\n\nEventEmitter.prototype.setMaxListeners = function(n) {\n  this._maxListeners = n;\n};\n\nEventEmitter.prototype.addListener = function(type, listener) {\n  if (!this._events[type]) {\n    this._events[type] = listener;\n  } else if (typeof this._events[type] === 'function') {\n    this._events[type] = [this._events[type], listener];\n  } else {\n    this._events[type].push(listener);\n  }\n  this._emit('newListener', [type, listener]);\n};\n\nEventEmitter.prototype.on = EventEmitter.prototype.addListener;\n\nEventEmitter.prototype.removeListener = function(type, listener) {\n  var handler = this._events[type];\n  if (!handler) return;\n\n  if (typeof handler === 'function' || handler.length === 1) {\n    delete this._events[type];\n    this._emit('removeListener', [type, listener]);\n    return;\n  }\n\n  for (var i = 0; i < handler.length; i++) {\n    if (handler[i] === listener || handler[i].listener === listener) {\n      handler.splice(i, 1);\n      this._emit('removeListener', [type, listener]);\n      return;\n    }\n  }\n};\n\nEventEmitter.prototype.off = EventEmitter.prototype.removeListener;\n\nEventEmitter.prototype.removeAllListeners = function(type) {\n  if (type) {\n    delete this._events[type];\n  } else {\n    this._events = {};\n  }\n};\n\nEventEmitter.prototype.once = function(type, listener) {\n  function on() {\n    this.removeListener(type, on);\n    return listener.apply(this, arguments);\n  }\n  on.listener = listener;\n  return this.on(type, on);\n};\n\nEventEmitter.prototype.listeners = function(type) {\n  return typeof this._events[type] === 'function'\n    ? [this._events[type]]\n    : this._events[type] || [];\n};\n\nEventEmitter.prototype._emit = function(type, args) {\n  var handler = this._events[type]\n    , ret;\n\n  // if (type !== 'event') {\n  //   this._emit('event', [type.replace(/^element /, '')].concat(args));\n  // }\n\n  if (!handler) {\n    if (type === 'error') {\n      throw new args[0];\n    }\n    return;\n  }\n\n  if (typeof handler === 'function') {\n    return handler.apply(this, args);\n  }\n\n  for (var i = 0; i < handler.length; i++) {\n    if (handler[i].apply(this, args) === false) {\n      ret = false;\n    }\n  }\n\n  return ret !== false;\n};\n\nEventEmitter.prototype.emit = function(type) {\n  var args = slice.call(arguments, 1)\n    , params = slice.call(arguments)\n    , el = this;\n\n  this._emit('event', params);\n\n  if (this.type === 'screen') {\n    return this._emit(type, args);\n  }\n\n  if (this._emit(type, args) === false) {\n    return false;\n  }\n\n  type = 'element ' + type;\n  args.unshift(this);\n  // `element` prefix\n  // params = [type].concat(args);\n  // no `element` prefix\n  // params.splice(1, 0, this);\n\n  do {\n    // el._emit('event', params);\n    if (!el._events[type]) continue;\n    if (el._emit(type, args) === false) {\n      return false;\n    }\n  } while (el = el.parent);\n\n  return true;\n};\n\n// For hooking into the main EventEmitter if we want to.\n// Might be better to do things this way being that it\n// will always be compatible with node, not to mention\n// it gives us domain support as well.\n// Node.prototype._emit = Node.prototype.emit;\n// Node.prototype.emit = function(type) {\n//   var args, el;\n//\n//   if (this.type === 'screen') {\n//     return this._emit.apply(this, arguments);\n//   }\n//\n//   this._emit.apply(this, arguments);\n//   if (this._bubbleStopped) return false;\n//\n//   args = slice.call(arguments, 1);\n//   el = this;\n//\n//   args.unshift('element ' + type, this);\n//   this._bubbleStopped = false;\n//   //args.push(stopBubble);\n//\n//   do {\n//     if (!el._events || !el._events[type]) continue;\n//     el._emit.apply(el, args);\n//     if (this._bubbleStopped) return false;\n//   } while (el = el.parent);\n//\n//   return true;\n// };\n//\n// Node.prototype._addListener = Node.prototype.addListener;\n// Node.prototype.on =\n// Node.prototype.addListener = function(type, listener) {\n//   function on() {\n//     if (listener.apply(this, arguments) === false) {\n//       this._bubbleStopped = true;\n//     }\n//   }\n//   on.listener = listener;\n//   return this._addListener(type, on);\n// };\n\n/**\n * Expose\n */\n\nexports = EventEmitter;\nexports.EventEmitter = EventEmitter;\n\nmodule.exports = exports;\n"
  },
  {
    "path": "lib/gpmclient.js",
    "content": "/**\n * gpmclient.js - support the gpm mouse protocol\n * Copyright (c) 2013-2015, Christopher Jeffrey and contributors (MIT License).\n * https://github.com/chjj/blessed\n */\n\nvar net = require('net');\nvar fs = require('fs');\nvar EventEmitter = require('events').EventEmitter;\n\nvar GPM_USE_MAGIC = false;\n\nvar GPM_MOVE = 1\n  , GPM_DRAG = 2\n  , GPM_DOWN = 4\n  , GPM_UP = 8;\n\nvar GPM_DOUBLE = 32\n  , GPM_MFLAG = 128;\n\nvar GPM_REQ_NOPASTE = 3\n  , GPM_HARD = 256;\n\nvar GPM_MAGIC = 0x47706D4C;\nvar GPM_SOCKET = '/dev/gpmctl';\n\n// typedef struct Gpm_Connect {\n//   unsigned short eventMask, defaultMask;\n//   unsigned short minMod, maxMod;\n//   int pid;\n//   int vc;\n// } Gpm_Connect;\n\nfunction send_config(socket, Gpm_Connect,  callback) {\n  var buffer;\n  if (GPM_USE_MAGIC) {\n    buffer = new Buffer(20);\n    buffer.writeUInt32LE(GPM_MAGIC, 0);\n    buffer.writeUInt16LE(Gpm_Connect.eventMask, 4);\n    buffer.writeUInt16LE(Gpm_Connect.defaultMask, 6);\n    buffer.writeUInt16LE(Gpm_Connect.minMod, 8);\n    buffer.writeUInt16LE(Gpm_Connect.maxMod, 10);\n    buffer.writeInt16LE(process.pid, 12);\n    buffer.writeInt16LE(Gpm_Connect.vc, 16);\n  } else {\n    buffer = new Buffer(16);\n    buffer.writeUInt16LE(Gpm_Connect.eventMask, 0);\n    buffer.writeUInt16LE(Gpm_Connect.defaultMask, 2);\n    buffer.writeUInt16LE(Gpm_Connect.minMod, 4);\n    buffer.writeUInt16LE(Gpm_Connect.maxMod, 6);\n    buffer.writeInt16LE(Gpm_Connect.pid, 8);\n    buffer.writeInt16LE(Gpm_Connect.vc, 12);\n  }\n  socket.write(buffer, function() {\n    if (callback) callback();\n  });\n}\n\n// typedef struct Gpm_Event {\n//   unsigned char buttons, modifiers;  // try to be a multiple of 4\n//   unsigned short vc;\n//   short dx, dy, x, y; // displacement x,y for this event, and absolute x,y\n//   enum Gpm_Etype type;\n//   // clicks e.g. double click are determined by time-based processing\n//   int clicks;\n//   enum Gpm_Margin margin;\n//   // wdx/y: displacement of wheels in this event. Absolute values are not\n//   // required, because wheel movement is typically used for scrolling\n//   // or selecting fields, not for cursor positioning. The application\n//   // can determine when the end of file or form is reached, and not\n//   // go any further.\n//   // A single mouse will use wdy, \"vertical scroll\" wheel.\n//   short wdx, wdy;\n// } Gpm_Event;\n\nfunction parseEvent(raw) {\n  var evnt = {};\n  evnt.buttons = raw[0];\n  evnt.modifiers = raw[1];\n  evnt.vc = raw.readUInt16LE(2);\n  evnt.dx = raw.readInt16LE(4);\n  evnt.dy = raw.readInt16LE(6);\n  evnt.x = raw.readInt16LE(8);\n  evnt.y = raw.readInt16LE(10);\n  evnt.type = raw.readInt16LE(12);\n  evnt.clicks = raw.readInt32LE(16);\n  evnt.margin = raw.readInt32LE(20);\n  evnt.wdx = raw.readInt16LE(24);\n  evnt.wdy = raw.readInt16LE(26);\n  return evnt;\n}\n\nfunction GpmClient(options) {\n  if (!(this instanceof GpmClient)) {\n    return new GpmClient(options);\n  }\n\n  EventEmitter.call(this);\n\n  var pid = process.pid;\n\n  // check tty for /dev/tty[n]\n  var path;\n  try {\n    path = fs.readlinkSync('/proc/' + pid + '/fd/0');\n  } catch (e) {\n    ;\n  }\n  var tty = /tty[0-9]+$/.exec(path);\n  if (tty === null) {\n    // TODO: should  also check for /dev/input/..\n  }\n\n  var vc;\n  if (tty) {\n    tty = tty[0];\n    vc = +/[0-9]+$/.exec(tty)[0];\n  }\n\n  var self = this;\n\n  if (tty) {\n    fs.stat(GPM_SOCKET, function(err, stat) {\n      if (err || !stat.isSocket()) {\n        return;\n      }\n\n      var conf =  {\n        eventMask: 0xffff,\n        defaultMask: GPM_MOVE | GPM_HARD,\n        minMod: 0,\n        maxMod: 0xffff,\n        pid: pid,\n        vc: vc\n      };\n\n      var gpm = net.createConnection(GPM_SOCKET);\n      this.gpm = gpm;\n\n      gpm.on('connect', function() {\n        send_config(gpm, conf, function() {\n          conf.pid = 0;\n          conf.vc = GPM_REQ_NOPASTE;\n          //send_config(gpm, conf);\n        });\n      });\n\n      gpm.on('data', function(packet) {\n        var evnt = parseEvent(packet);\n        switch (evnt.type & 15) {\n          case GPM_MOVE:\n            if (evnt.dx || evnt.dy) {\n              self.emit('move', evnt.buttons, evnt.modifiers, evnt.x, evnt.y);\n            }\n            if (evnt.wdx || evnt.wdy) {\n              self.emit('mousewheel',\n                evnt.buttons, evnt.modifiers,\n                evnt.x, evnt.y, evnt.wdx, evnt.wdy);\n            }\n            break;\n          case GPM_DRAG:\n            if (evnt.dx || evnt.dy) {\n              self.emit('drag', evnt.buttons, evnt.modifiers, evnt.x, evnt.y);\n            }\n            if (evnt.wdx || evnt.wdy) {\n              self.emit('mousewheel',\n                evnt.buttons, evnt.modifiers,\n                evnt.x, evnt.y, evnt.wdx, evnt.wdy);\n            }\n            break;\n          case GPM_DOWN:\n            self.emit('btndown', evnt.buttons, evnt.modifiers, evnt.x, evnt.y);\n            if (evnt.type & GPM_DOUBLE) {\n              self.emit('dblclick', evnt.buttons, evnt.modifiers, evnt.x, evnt.y);\n            }\n            break;\n          case GPM_UP:\n            self.emit('btnup', evnt.buttons, evnt.modifiers, evnt.x, evnt.y);\n            if (!(evnt.type & GPM_MFLAG)) {\n              self.emit('click', evnt.buttons, evnt.modifiers, evnt.x, evnt.y);\n            }\n            break;\n        }\n      });\n\n      gpm.on('error', function() {\n        self.stop();\n      });\n    });\n  }\n}\n\nGpmClient.prototype.__proto__ = EventEmitter.prototype;\n\nGpmClient.prototype.stop = function() {\n  if (this.gpm) {\n    this.gpm.end();\n  }\n  delete this.gpm;\n};\n\nGpmClient.prototype.ButtonName =  function(btn) {\n  if (btn & 4) return 'left';\n  if (btn & 2) return 'middle';\n  if (btn & 1) return 'right';\n  return '';\n};\n\nGpmClient.prototype.hasShiftKey =  function(mod) {\n  return (mod & 1) ? true : false;\n};\n\nGpmClient.prototype.hasCtrlKey =  function(mod) {\n  return (mod & 4) ? true : false;\n};\n\nGpmClient.prototype.hasMetaKey =  function(mod) {\n  return (mod & 8) ? true : false;\n};\n\nmodule.exports = GpmClient;\n"
  },
  {
    "path": "lib/helpers.js",
    "content": "/**\n * helpers.js - helpers for blessed\n * Copyright (c) 2013-2015, Christopher Jeffrey and contributors (MIT License).\n * https://github.com/chjj/blessed\n */\n\n/**\n * Modules\n */\n\nvar fs = require('fs');\n\nvar unicode = require('./unicode');\n\n/**\n * Helpers\n */\n\nvar helpers = exports;\n\nhelpers.merge = function(a, b) {\n  Object.keys(b).forEach(function(key) {\n    a[key] = b[key];\n  });\n  return a;\n};\n\nhelpers.asort = function(obj) {\n  return obj.sort(function(a, b) {\n    a = a.name.toLowerCase();\n    b = b.name.toLowerCase();\n\n    if (a[0] === '.' && b[0] === '.') {\n      a = a[1];\n      b = b[1];\n    } else {\n      a = a[0];\n      b = b[0];\n    }\n\n    return a > b ? 1 : (a < b ? -1 : 0);\n  });\n};\n\nhelpers.hsort = function(obj) {\n  return obj.sort(function(a, b) {\n    return b.index - a.index;\n  });\n};\n\nhelpers.findFile = function(start, target) {\n  return (function read(dir) {\n    var files, file, stat, out;\n\n    if (dir === '/dev' || dir === '/sys'\n        || dir === '/proc' || dir === '/net') {\n      return null;\n    }\n\n    try {\n      files = fs.readdirSync(dir);\n    } catch (e) {\n      files = [];\n    }\n\n    for (var i = 0; i < files.length; i++) {\n      file = files[i];\n\n      if (file === target) {\n        return (dir === '/' ? '' : dir) + '/' + file;\n      }\n\n      try {\n        stat = fs.lstatSync((dir === '/' ? '' : dir) + '/' + file);\n      } catch (e) {\n        stat = null;\n      }\n\n      if (stat && stat.isDirectory() && !stat.isSymbolicLink()) {\n        out = read((dir === '/' ? '' : dir) + '/' + file);\n        if (out) return out;\n      }\n    }\n\n    return null;\n  })(start);\n};\n\n// Escape text for tag-enabled elements.\nhelpers.escape = function(text) {\n  return text.replace(/[{}]/g, function(ch) {\n    return ch === '{' ? '{open}' : '{close}';\n  });\n};\n\nhelpers.parseTags = function(text, screen) {\n  return helpers.Element.prototype._parseTags.call(\n    { parseTags: true, screen: screen || helpers.Screen.global }, text);\n};\n\nhelpers.generateTags = function(style, text) {\n  var open = ''\n    , close = '';\n\n  Object.keys(style || {}).forEach(function(key) {\n    var val = style[key];\n    if (typeof val === 'string') {\n      val = val.replace(/^light(?!-)/, 'light-');\n      val = val.replace(/^bright(?!-)/, 'bright-');\n      open = '{' + val + '-' + key + '}' + open;\n      close += '{/' + val + '-' + key + '}';\n    } else {\n      if (val === true) {\n        open = '{' + key + '}' + open;\n        close += '{/' + key + '}';\n      }\n    }\n  });\n\n  if (text != null) {\n    return open + text + close;\n  }\n\n  return {\n    open: open,\n    close: close\n  };\n};\n\nhelpers.attrToBinary = function(style, element) {\n  return helpers.Element.prototype.sattr.call(element || {}, style);\n};\n\nhelpers.stripTags = function(text) {\n  if (!text) return '';\n  return text\n    .replace(/{(\\/?)([\\w\\-,;!#]*)}/g, '')\n    .replace(/\\x1b\\[[\\d;]*m/g, '');\n};\n\nhelpers.cleanTags = function(text) {\n  return helpers.stripTags(text).trim();\n};\n\nhelpers.dropUnicode = function(text) {\n  if (!text) return '';\n  return text\n    .replace(unicode.chars.all, '??')\n    .replace(unicode.chars.combining, '')\n    .replace(unicode.chars.surrogate, '?');\n};\n\nhelpers.__defineGetter__('Screen', function() {\n  if (!helpers._screen) {\n    helpers._screen = require('./widgets/screen');\n  }\n  return helpers._screen;\n});\n\nhelpers.__defineGetter__('Element', function() {\n  if (!helpers._element) {\n    helpers._element = require('./widgets/element');\n  }\n  return helpers._element;\n});\n"
  },
  {
    "path": "lib/keys.js",
    "content": "/**\n * keys.js - emit key presses\n * Copyright (c) 2010-2015, Joyent, Inc. and other contributors (MIT License)\n * https://github.com/chjj/blessed\n */\n\n// Originally taken from the node.js tree:\n//\n// Copyright Joyent, Inc. and other Node contributors. All rights reserved.\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to\n// deal in the Software without restriction, including without limitation the\n// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n// sell copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n// IN THE SOFTWARE.\n\nvar EventEmitter = require('events').EventEmitter;\n\n// NOTE: node <=v0.8.x has no EventEmitter.listenerCount\nfunction listenerCount(stream, event) {\n  return EventEmitter.listenerCount\n    ? EventEmitter.listenerCount(stream, event)\n    : stream.listeners(event).length;\n}\n\n/**\n * accepts a readable Stream instance and makes it emit \"keypress\" events\n */\n\nfunction emitKeypressEvents(stream) {\n  if (stream._keypressDecoder) return;\n  var StringDecoder = require('string_decoder').StringDecoder; // lazy load\n  stream._keypressDecoder = new StringDecoder('utf8');\n\n  function onData(b) {\n    if (listenerCount(stream, 'keypress') > 0) {\n      var r = stream._keypressDecoder.write(b);\n      if (r) emitKeys(stream, r);\n    } else {\n      // Nobody's watching anyway\n      stream.removeListener('data', onData);\n      stream.on('newListener', onNewListener);\n    }\n  }\n\n  function onNewListener(event) {\n    if (event === 'keypress') {\n      stream.on('data', onData);\n      stream.removeListener('newListener', onNewListener);\n    }\n  }\n\n  if (listenerCount(stream, 'keypress') > 0) {\n    stream.on('data', onData);\n  } else {\n    stream.on('newListener', onNewListener);\n  }\n}\nexports.emitKeypressEvents = emitKeypressEvents;\n\n/*\n  Some patterns seen in terminal key escape codes, derived from combos seen\n  at http://www.midnight-commander.org/browser/lib/tty/key.c\n\n  ESC letter\n  ESC [ letter\n  ESC [ modifier letter\n  ESC [ 1 ; modifier letter\n  ESC [ num char\n  ESC [ num ; modifier char\n  ESC O letter\n  ESC O modifier letter\n  ESC O 1 ; modifier letter\n  ESC N letter\n  ESC [ [ num ; modifier char\n  ESC [ [ 1 ; modifier letter\n  ESC ESC [ num char\n  ESC ESC O letter\n\n  - char is usually ~ but $ and ^ also happen with rxvt\n  - modifier is 1 +\n                (shift     * 1) +\n                (left_alt  * 2) +\n                (ctrl      * 4) +\n                (right_alt * 8)\n  - two leading ESCs apparently mean the same as one leading ESC\n*/\n\n// Regexes used for ansi escape code splitting\nvar metaKeyCodeReAnywhere = /(?:\\x1b)([a-zA-Z0-9])/;\nvar metaKeyCodeRe = new RegExp('^' + metaKeyCodeReAnywhere.source + '$');\nvar functionKeyCodeReAnywhere = new RegExp('(?:\\x1b+)(O|N|\\\\[|\\\\[\\\\[)(?:' + [\n  '(\\\\d+)(?:;(\\\\d+))?([~^$])',\n  '(?:M([@ #!a`])(.)(.))', // mouse\n  '(?:1;)?(\\\\d+)?([a-zA-Z])'\n].join('|') + ')');\nvar functionKeyCodeRe = new RegExp('^' + functionKeyCodeReAnywhere.source);\nvar escapeCodeReAnywhere = new RegExp([\n  functionKeyCodeReAnywhere.source, metaKeyCodeReAnywhere.source, /\\x1b./.source\n].join('|'));\n\nfunction emitKeys(stream, s) {\n  if (Buffer.isBuffer(s)) {\n    if (s[0] > 127 && s[1] === undefined) {\n      s[0] -= 128;\n      s = '\\x1b' + s.toString(stream.encoding || 'utf-8');\n    } else {\n      s = s.toString(stream.encoding || 'utf-8');\n    }\n  }\n\n  if (isMouse(s)) return;\n\n  var buffer = [];\n  var match;\n  while (match = escapeCodeReAnywhere.exec(s)) {\n    buffer = buffer.concat(s.slice(0, match.index).split(''));\n    buffer.push(match[0]);\n    s = s.slice(match.index + match[0].length);\n  }\n  buffer = buffer.concat(s.split(''));\n\n  buffer.forEach(function(s) {\n    var ch,\n        key = {\n          sequence: s,\n          name: undefined,\n          ctrl: false,\n          meta: false,\n          shift: false\n        },\n        parts;\n\n    if (s === '\\r') {\n      // carriage return\n      key.name = 'return';\n\n    } else if (s === '\\n') {\n      // enter, should have been called linefeed\n      key.name = 'enter';\n      // linefeed\n      // key.name = 'linefeed';\n\n    } else if (s === '\\t') {\n      // tab\n      key.name = 'tab';\n\n    } else if (s === '\\b' || s === '\\x7f' ||\n               s === '\\x1b\\x7f' || s === '\\x1b\\b') {\n      // backspace or ctrl+h\n      key.name = 'backspace';\n      key.meta = (s.charAt(0) === '\\x1b');\n\n    } else if (s === '\\x1b' || s === '\\x1b\\x1b') {\n      // escape key\n      key.name = 'escape';\n      key.meta = (s.length === 2);\n\n    } else if (s === ' ' || s === '\\x1b ') {\n      key.name = 'space';\n      key.meta = (s.length === 2);\n\n    } else if (s.length === 1 && s <= '\\x1a') {\n      // ctrl+letter\n      key.name = String.fromCharCode(s.charCodeAt(0) + 'a'.charCodeAt(0) - 1);\n      key.ctrl = true;\n\n    } else if (s.length === 1 && s >= 'a' && s <= 'z') {\n      // lowercase letter\n      key.name = s;\n\n    } else if (s.length === 1 && s >= 'A' && s <= 'Z') {\n      // shift+letter\n      key.name = s.toLowerCase();\n      key.shift = true;\n\n    } else if (parts = metaKeyCodeRe.exec(s)) {\n      // meta+character key\n      key.name = parts[1].toLowerCase();\n      key.meta = true;\n      key.shift = /^[A-Z]$/.test(parts[1]);\n\n    } else if (parts = functionKeyCodeRe.exec(s)) {\n      // ansi escape sequence\n\n      // reassemble the key code leaving out leading \\x1b's,\n      // the modifier key bitflag and any meaningless \"1;\" sequence\n      var code = (parts[1] || '') + (parts[2] || '') +\n                 (parts[4] || '') + (parts[9] || ''),\n          modifier = (parts[3] || parts[8] || 1) - 1;\n\n      // Parse the key modifier\n      key.ctrl = !!(modifier & 4);\n      key.meta = !!(modifier & 10);\n      key.shift = !!(modifier & 1);\n      key.code = code;\n\n      // Parse the key itself\n      switch (code) {\n        /* xterm/gnome ESC O letter */\n        case 'OP': key.name = 'f1'; break;\n        case 'OQ': key.name = 'f2'; break;\n        case 'OR': key.name = 'f3'; break;\n        case 'OS': key.name = 'f4'; break;\n\n        /* xterm/rxvt ESC [ number ~ */\n        case '[11~': key.name = 'f1'; break;\n        case '[12~': key.name = 'f2'; break;\n        case '[13~': key.name = 'f3'; break;\n        case '[14~': key.name = 'f4'; break;\n\n        /* from Cygwin and used in libuv */\n        case '[[A': key.name = 'f1'; break;\n        case '[[B': key.name = 'f2'; break;\n        case '[[C': key.name = 'f3'; break;\n        case '[[D': key.name = 'f4'; break;\n        case '[[E': key.name = 'f5'; break;\n\n        /* common */\n        case '[15~': key.name = 'f5'; break;\n        case '[17~': key.name = 'f6'; break;\n        case '[18~': key.name = 'f7'; break;\n        case '[19~': key.name = 'f8'; break;\n        case '[20~': key.name = 'f9'; break;\n        case '[21~': key.name = 'f10'; break;\n        case '[23~': key.name = 'f11'; break;\n        case '[24~': key.name = 'f12'; break;\n\n        /* xterm ESC [ letter */\n        case '[A': key.name = 'up'; break;\n        case '[B': key.name = 'down'; break;\n        case '[C': key.name = 'right'; break;\n        case '[D': key.name = 'left'; break;\n        case '[E': key.name = 'clear'; break;\n        case '[F': key.name = 'end'; break;\n        case '[H': key.name = 'home'; break;\n\n        /* xterm/gnome ESC O letter */\n        case 'OA': key.name = 'up'; break;\n        case 'OB': key.name = 'down'; break;\n        case 'OC': key.name = 'right'; break;\n        case 'OD': key.name = 'left'; break;\n        case 'OE': key.name = 'clear'; break;\n        case 'OF': key.name = 'end'; break;\n        case 'OH': key.name = 'home'; break;\n\n        /* xterm/rxvt ESC [ number ~ */\n        case '[1~': key.name = 'home'; break;\n        case '[2~': key.name = 'insert'; break;\n        case '[3~': key.name = 'delete'; break;\n        case '[4~': key.name = 'end'; break;\n        case '[5~': key.name = 'pageup'; break;\n        case '[6~': key.name = 'pagedown'; break;\n\n        /* putty */\n        case '[[5~': key.name = 'pageup'; break;\n        case '[[6~': key.name = 'pagedown'; break;\n\n        /* rxvt */\n        case '[7~': key.name = 'home'; break;\n        case '[8~': key.name = 'end'; break;\n\n        /* rxvt keys with modifiers */\n        case '[a': key.name = 'up'; key.shift = true; break;\n        case '[b': key.name = 'down'; key.shift = true; break;\n        case '[c': key.name = 'right'; key.shift = true; break;\n        case '[d': key.name = 'left'; key.shift = true; break;\n        case '[e': key.name = 'clear'; key.shift = true; break;\n\n        case '[2$': key.name = 'insert'; key.shift = true; break;\n        case '[3$': key.name = 'delete'; key.shift = true; break;\n        case '[5$': key.name = 'pageup'; key.shift = true; break;\n        case '[6$': key.name = 'pagedown'; key.shift = true; break;\n        case '[7$': key.name = 'home'; key.shift = true; break;\n        case '[8$': key.name = 'end'; key.shift = true; break;\n\n        case 'Oa': key.name = 'up'; key.ctrl = true; break;\n        case 'Ob': key.name = 'down'; key.ctrl = true; break;\n        case 'Oc': key.name = 'right'; key.ctrl = true; break;\n        case 'Od': key.name = 'left'; key.ctrl = true; break;\n        case 'Oe': key.name = 'clear'; key.ctrl = true; break;\n\n        case '[2^': key.name = 'insert'; key.ctrl = true; break;\n        case '[3^': key.name = 'delete'; key.ctrl = true; break;\n        case '[5^': key.name = 'pageup'; key.ctrl = true; break;\n        case '[6^': key.name = 'pagedown'; key.ctrl = true; break;\n        case '[7^': key.name = 'home'; key.ctrl = true; break;\n        case '[8^': key.name = 'end'; key.ctrl = true; break;\n\n        /* misc. */\n        case '[Z': key.name = 'tab'; key.shift = true; break;\n        default: key.name = 'undefined'; break;\n\n      }\n    }\n\n    // Don't emit a key if no name was found\n    if (key.name === undefined) {\n      key = undefined;\n    }\n\n    if (s.length === 1) {\n      ch = s;\n    }\n\n    if (key || ch) {\n      stream.emit('keypress', ch, key);\n      // if (key && key.name === 'return') {\n      //   var nkey = {};\n      //   Object.keys(key).forEach(function(k) {\n      //     nkey[k] = key[k];\n      //   });\n      //   nkey.name = 'enter';\n      //   stream.emit('keypress', ch, nkey);\n      // }\n    }\n  });\n}\n\nfunction isMouse(s) {\n  return /\\x1b\\[M/.test(s)\n    || /\\x1b\\[M([\\x00\\u0020-\\uffff]{3})/.test(s)\n    || /\\x1b\\[(\\d+;\\d+;\\d+)M/.test(s)\n    || /\\x1b\\[<(\\d+;\\d+;\\d+)([mM])/.test(s)\n    || /\\x1b\\[<(\\d+;\\d+;\\d+;\\d+)&w/.test(s)\n    || /\\x1b\\[24([0135])~\\[(\\d+),(\\d+)\\]\\r/.test(s)\n    || /\\x1b\\[(O|I)/.test(s);\n}\n"
  },
  {
    "path": "lib/program.js",
    "content": "/**\n * program.js - basic curses-like functionality for blessed.\n * Copyright (c) 2013-2015, Christopher Jeffrey and contributors (MIT License).\n * https://github.com/chjj/blessed\n */\n\n/**\n * Modules\n */\n\nvar EventEmitter = require('events').EventEmitter\n  , StringDecoder = require('string_decoder').StringDecoder\n  , cp = require('child_process')\n  , util = require('util')\n  , fs = require('fs');\n\nvar Tput = require('./tput')\n  , colors = require('./colors')\n  , slice = Array.prototype.slice;\n\nvar nextTick = global.setImmediate || process.nextTick.bind(process);\n\n/**\n * Program\n */\n\nfunction Program(options) {\n  var self = this;\n\n  if (!(this instanceof Program)) {\n    return new Program(options);\n  }\n\n  Program.bind(this);\n\n  EventEmitter.call(this);\n\n  if (!options || options.__proto__ !== Object.prototype) {\n    options = {\n      input: arguments[0],\n      output: arguments[1]\n    };\n  }\n\n  this.options = options;\n  this.input = options.input || process.stdin;\n  this.output = options.output || process.stdout;\n\n  options.log = options.log || options.dump;\n  if (options.log) {\n    this._logger = fs.createWriteStream(options.log);\n    if (options.dump) this.setupDump();\n  }\n\n  this.zero = options.zero !== false;\n  this.useBuffer = options.buffer;\n\n  this.x = 0;\n  this.y = 0;\n  this.savedX = 0;\n  this.savedY = 0;\n\n  this.cols = this.output.columns || 1;\n  this.rows = this.output.rows || 1;\n\n  this.scrollTop = 0;\n  this.scrollBottom = this.rows - 1;\n\n  this._terminal = options.terminal\n    || options.term\n    || process.env.TERM\n    || (process.platform === 'win32' ? 'windows-ansi' : 'xterm');\n\n  this._terminal = this._terminal.toLowerCase();\n\n  // OSX\n  this.isOSXTerm = process.env.TERM_PROGRAM === 'Apple_Terminal';\n  this.isiTerm2 = process.env.TERM_PROGRAM === 'iTerm.app'\n    || !!process.env.ITERM_SESSION_ID;\n\n  // VTE\n  // NOTE: lxterminal does not provide an env variable to check for.\n  // NOTE: gnome-terminal and sakura use a later version of VTE\n  // which provides VTE_VERSION as well as supports SGR events.\n  this.isXFCE = /xfce/i.test(process.env.COLORTERM);\n  this.isTerminator = !!process.env.TERMINATOR_UUID;\n  this.isLXDE = false;\n  this.isVTE = !!process.env.VTE_VERSION\n    || this.isXFCE\n    || this.isTerminator\n    || this.isLXDE;\n\n  // xterm and rxvt - not accurate\n  this.isRxvt = /rxvt/i.test(process.env.COLORTERM);\n  this.isXterm = false;\n\n  this.tmux = !!process.env.TMUX;\n  this.tmuxVersion = (function() {\n    if (!self.tmux) return 2;\n    try {\n      var version = cp.execFileSync('tmux', ['-V'], { encoding: 'utf8' });\n      return +/^tmux ([\\d.]+)/i.exec(version.trim().split('\\n')[0])[1];\n    } catch (e) {\n      return 2;\n    }\n  })();\n\n  this._buf = '';\n  this._flush = this.flush.bind(this);\n\n  if (options.tput !== false) {\n    this.setupTput();\n  }\n\n  this.listen();\n}\n\nProgram.global = null;\n\nProgram.total = 0;\n\nProgram.instances = [];\n\nProgram.bind = function(program) {\n  if (!Program.global) {\n    Program.global = program;\n  }\n\n  if (!~Program.instances.indexOf(program)) {\n    Program.instances.push(program);\n    program.index = Program.total;\n    Program.total++;\n  }\n\n  if (Program._bound) return;\n  Program._bound = true;\n\n  unshiftEvent(process, 'exit', Program._exitHandler = function() {\n    Program.instances.forEach(function(program) {\n      // Potentially reset window title on exit:\n      // if (program._originalTitle) {\n      //   program.setTitle(program._originalTitle);\n      // }\n      // Ensure the buffer is flushed (it should\n      // always be at this point, but who knows).\n      program.flush();\n      // Ensure _exiting is set (could technically\n      // use process._exiting).\n      program._exiting = true;\n    });\n  });\n};\n\nProgram.prototype.__proto__ = EventEmitter.prototype;\n\nProgram.prototype.type = 'program';\n\nProgram.prototype.log = function() {\n  return this._log('LOG',  util.format.apply(util, arguments));\n};\n\nProgram.prototype.debug = function() {\n  if (!this.options.debug) return;\n  return this._log('DEBUG',  util.format.apply(util, arguments));\n};\n\nProgram.prototype._log = function(pre, msg) {\n  if (!this._logger) return;\n  return this._logger.write(pre + ': ' + msg + '\\n-\\n');\n};\n\nProgram.prototype.setupDump = function() {\n  var self = this\n    , write = this.output.write\n    , decoder = new StringDecoder('utf8');\n\n  function stringify(data) {\n    return caret(data\n      .replace(/\\r/g, '\\\\r')\n      .replace(/\\n/g, '\\\\n')\n      .replace(/\\t/g, '\\\\t'))\n      .replace(/[^ -~]/g, function(ch) {\n        if (ch.charCodeAt(0) > 0xff) return ch;\n        ch = ch.charCodeAt(0).toString(16);\n        if (ch.length > 2) {\n          if (ch.length < 4) ch = '0' + ch;\n          return '\\\\u' + ch;\n        }\n        if (ch.length < 2) ch = '0' + ch;\n        return '\\\\x' + ch;\n      });\n  }\n\n  function caret(data) {\n    return data.replace(/[\\0\\x80\\x1b-\\x1f\\x7f\\x01-\\x1a]/g, function(ch) {\n      switch (ch) {\n        case '\\0':\n        case '\\x80':\n          ch = '@';\n          break;\n        case '\\x1b':\n          ch = '[';\n          break;\n        case '\\x1c':\n          ch = '\\\\';\n          break;\n        case '\\x1d':\n          ch = ']';\n          break;\n        case '\\x1e':\n          ch = '^';\n          break;\n        case '\\x1f':\n          ch = '_';\n          break;\n        case '\\x7f':\n          ch = '?';\n          break;\n        default:\n          ch = ch.charCodeAt(0);\n          // From ('A' - 64) to ('Z' - 64).\n          if (ch >= 1 && ch <= 26) {\n            ch = String.fromCharCode(ch + 64);\n          } else {\n            return String.fromCharCode(ch);\n          }\n          break;\n      }\n      return '^' + ch;\n    });\n  }\n\n  this.input.on('data', function(data) {\n    self._log('IN', stringify(decoder.write(data)));\n  });\n\n  this.output.write = function(data) {\n    self._log('OUT', stringify(data));\n    return write.apply(this, arguments);\n  };\n};\n\nProgram.prototype.setupTput = function() {\n  if (this._tputSetup) return;\n  this._tputSetup = true;\n\n  var self = this\n    , options = this.options\n    , write = this._write.bind(this);\n\n  var tput = this.tput = new Tput({\n    terminal: this.terminal,\n    padding: options.padding,\n    extended: options.extended,\n    printf: options.printf,\n    termcap: options.termcap,\n    forceUnicode: options.forceUnicode\n  });\n\n  if (tput.error) {\n    nextTick(function() {\n      self.emit('warning', tput.error.message);\n    });\n  }\n\n  if (tput.padding) {\n    nextTick(function() {\n      self.emit('warning', 'Terminfo padding has been enabled.');\n    });\n  }\n\n  this.put = function() {\n    var args = slice.call(arguments)\n      , cap = args.shift();\n\n    if (tput[cap]) {\n      return this._write(tput[cap].apply(tput, args));\n    }\n  };\n\n  Object.keys(tput).forEach(function(key) {\n    if (self[key] == null) {\n      self[key] = tput[key];\n    }\n\n    if (typeof tput[key] !== 'function') {\n      self.put[key] = tput[key];\n      return;\n    }\n\n    if (tput.padding) {\n      self.put[key] = function() {\n        return tput._print(tput[key].apply(tput, arguments), write);\n      };\n    } else {\n      self.put[key] = function() {\n        return self._write(tput[key].apply(tput, arguments));\n      };\n    }\n  });\n};\n\nProgram.prototype.__defineGetter__('terminal', function() {\n  return this._terminal;\n});\n\nProgram.prototype.__defineSetter__('terminal', function(terminal) {\n  this.setTerminal(terminal);\n  return this.terminal;\n});\n\nProgram.prototype.setTerminal = function(terminal) {\n  this._terminal = terminal.toLowerCase();\n  delete this._tputSetup;\n  this.setupTput();\n};\n\nProgram.prototype.has = function(name) {\n  return this.tput\n    ? this.tput.has(name)\n    : false;\n};\n\nProgram.prototype.term = function(is) {\n  return this.terminal.indexOf(is) === 0;\n};\n\nProgram.prototype.listen = function() {\n  var self = this;\n\n  // Potentially reset window title on exit:\n  // if (!this.isRxvt) {\n  //   if (!this.isVTE) this.setTitleModeFeature(3);\n  //   this.manipulateWindow(21, function(err, data) {\n  //     if (err) return;\n  //     self._originalTitle = data.text;\n  //   });\n  // }\n\n  // Listen for keys/mouse on input\n  if (!this.input._blessedInput) {\n    this.input._blessedInput = 1;\n    this._listenInput();\n  } else {\n    this.input._blessedInput++;\n  }\n\n  this.on('newListener', this._newHandler = function fn(type) {\n    if (type === 'keypress' || type === 'mouse') {\n      self.removeListener('newListener', fn);\n      if (self.input.setRawMode && !self.input.isRaw) {\n        self.input.setRawMode(true);\n        self.input.resume();\n      }\n    }\n  });\n\n  this.on('newListener', function fn(type) {\n    if (type === 'mouse') {\n      self.removeListener('newListener', fn);\n      self.bindMouse();\n    }\n  });\n\n  // Listen for resize on output\n  if (!this.output._blessedOutput) {\n    this.output._blessedOutput = 1;\n    this._listenOutput();\n  } else {\n    this.output._blessedOutput++;\n  }\n};\n\nProgram.prototype._listenInput = function() {\n  var keys = require('./keys')\n    , self = this;\n\n  // Input\n  this.input.on('keypress', this.input._keypressHandler = function(ch, key) {\n    key = key || { ch: ch };\n\n    if (key.name === 'undefined'\n        && (key.code === '[M' || key.code === '[I' || key.code === '[O')) {\n      // A mouse sequence. The `keys` module doesn't understand these.\n      return;\n    }\n\n    if (key.name === 'undefined') {\n      // Not sure what this is, but we should probably ignore it.\n      return;\n    }\n\n    if (key.name === 'enter' && key.sequence === '\\n') {\n      key.name = 'linefeed';\n    }\n\n    if (key.name === 'return' && key.sequence === '\\r') {\n      self.input.emit('keypress', ch, merge({}, key, { name: 'enter' }));\n    }\n\n    var name = (key.ctrl ? 'C-' : '')\n      + (key.meta ? 'M-' : '')\n      + (key.shift && key.name ? 'S-' : '')\n      + (key.name || ch);\n\n    key.full = name;\n\n    Program.instances.forEach(function(program) {\n      if (program.input !== self.input) return;\n      program.emit('keypress', ch, key);\n      program.emit('key ' + name, ch, key);\n    });\n  });\n\n  this.input.on('data', this.input._dataHandler = function(data) {\n    Program.instances.forEach(function(program) {\n      if (program.input !== self.input) return;\n      program.emit('data', data);\n    });\n  });\n\n  keys.emitKeypressEvents(this.input);\n};\n\nProgram.prototype._listenOutput = function() {\n  var self = this;\n\n  if (!this.output.isTTY) {\n    nextTick(function() {\n      self.emit('warning', 'Output is not a TTY');\n    });\n  }\n\n  // Output\n  function resize() {\n    Program.instances.forEach(function(program) {\n      if (program.output !== self.output) return;\n      program.cols = program.output.columns;\n      program.rows = program.output.rows;\n      program.emit('resize');\n    });\n  }\n\n  this.output.on('resize', this.output._resizeHandler = function() {\n    Program.instances.forEach(function(program) {\n      if (program.output !== self.output) return;\n      if (!program.options.resizeTimeout) {\n        return resize();\n      }\n      if (program._resizeTimer) {\n        clearTimeout(program._resizeTimer);\n        delete program._resizeTimer;\n      }\n      var time = typeof program.options.resizeTimeout === 'number'\n        ? program.options.resizeTimeout\n        : 300;\n      program._resizeTimer = setTimeout(resize, time);\n    });\n  });\n};\n\nProgram.prototype.destroy = function() {\n  var index = Program.instances.indexOf(this);\n\n  if (~index) {\n    Program.instances.splice(index, 1);\n    Program.total--;\n\n    this.flush();\n    this._exiting = true;\n\n    Program.global = Program.instances[0];\n\n    if (Program.total === 0) {\n      Program.global = null;\n\n      process.removeListener('exit', Program._exitHandler);\n      delete Program._exitHandler;\n\n      delete Program._bound;\n    }\n\n    this.input._blessedInput--;\n    this.output._blessedOutput--;\n\n    if (this.input._blessedInput === 0) {\n      this.input.removeListener('keypress', this.input._keypressHandler);\n      this.input.removeListener('data', this.input._dataHandler);\n      delete this.input._keypressHandler;\n      delete this.input._dataHandler;\n\n      if (this.input.setRawMode) {\n        if (this.input.isRaw) {\n          this.input.setRawMode(false);\n        }\n        if (!this.input.destroyed) {\n          this.input.pause();\n        }\n      }\n    }\n\n    if (this.output._blessedOutput === 0) {\n      this.output.removeListener('resize', this.output._resizeHandler);\n      delete this.output._resizeHandler;\n    }\n\n    this.removeListener('newListener', this._newHandler);\n    delete this._newHandler;\n\n    this.destroyed = true;\n    this.emit('destroy');\n  }\n};\n\nProgram.prototype.key = function(key, listener) {\n  if (typeof key === 'string') key = key.split(/\\s*,\\s*/);\n  key.forEach(function(key) {\n    return this.on('key ' + key, listener);\n  }, this);\n};\n\nProgram.prototype.onceKey = function(key, listener) {\n  if (typeof key === 'string') key = key.split(/\\s*,\\s*/);\n  key.forEach(function(key) {\n    return this.once('key ' + key, listener);\n  }, this);\n};\n\nProgram.prototype.unkey =\nProgram.prototype.removeKey = function(key, listener) {\n  if (typeof key === 'string') key = key.split(/\\s*,\\s*/);\n  key.forEach(function(key) {\n    return this.removeListener('key ' + key, listener);\n  }, this);\n};\n\n// XTerm mouse events\n// http://invisible-island.net/xterm/ctlseqs/ctlseqs.html#Mouse%20Tracking\n// To better understand these\n// the xterm code is very helpful:\n// Relevant files:\n//   button.c, charproc.c, misc.c\n// Relevant functions in xterm/button.c:\n//   BtnCode, EmitButtonCode, EditorButton, SendMousePosition\n// send a mouse event:\n// regular/utf8: ^[[M Cb Cx Cy\n// urxvt: ^[[ Cb ; Cx ; Cy M\n// sgr: ^[[ Cb ; Cx ; Cy M/m\n// vt300: ^[[ 24(1/3/5)~ [ Cx , Cy ] \\r\n// locator: CSI P e ; P b ; P r ; P c ; P p & w\n// motion example of a left click:\n// ^[[M 3<^[[M@4<^[[M@5<^[[M@6<^[[M@7<^[[M#7<\n// mouseup, mousedown, mousewheel\n// left click: ^[[M 3<^[[M#3<\n// mousewheel up: ^[[M`3>\nProgram.prototype.bindMouse = function() {\n  if (this._boundMouse) return;\n  this._boundMouse = true;\n\n  var decoder = new StringDecoder('utf8')\n    , self = this;\n\n  this.on('data', function(data) {\n    var text = decoder.write(data);\n    if (!text) return;\n    self._bindMouse(text, data);\n  });\n};\n\nProgram.prototype._bindMouse = function(s, buf) {\n  var self = this\n    , key\n    , parts\n    , b\n    , x\n    , y\n    , mod\n    , params\n    , down\n    , page\n    , button;\n\n  key = {\n    name: undefined,\n    ctrl: false,\n    meta: false,\n    shift: false\n  };\n\n  if (Buffer.isBuffer(s)) {\n    if (s[0] > 127 && s[1] === undefined) {\n      s[0] -= 128;\n      s = '\\x1b' + s.toString('utf-8');\n    } else {\n      s = s.toString('utf-8');\n    }\n  }\n\n  // if (this.8bit) {\n  //   s = s.replace(/\\233/g, '\\x1b[');\n  //   buf = new Buffer(s, 'utf8');\n  // }\n\n  // XTerm / X10 for buggy VTE\n  // VTE can only send unsigned chars and no unicode for coords. This limits\n  // them to 0xff. However, normally the x10 protocol does not allow a byte\n  // under 0x20, but since VTE can have the bytes overflow, we can consider\n  // bytes below 0x20 to be up to 0xff + 0x20. This gives a limit of 287. Since\n  // characters ranging from 223 to 248 confuse javascript's utf parser, we\n  // need to parse the raw binary. We can detect whether the terminal is using\n  // a bugged VTE version by examining the coordinates and seeing whether they\n  // are a value they would never otherwise be with a properly implemented x10\n  // protocol. This method of detecting VTE is only 99% reliable because we\n  // can't check if the coords are 0x00 (255) since that is a valid x10 coord\n  // technically.\n  var bx = s.charCodeAt(4);\n  var by = s.charCodeAt(5);\n  if (buf[0] === 0x1b && buf[1] === 0x5b && buf[2] === 0x4d\n      && (this.isVTE\n      || bx >= 65533 || by >= 65533\n      || (bx > 0x00 && bx < 0x20)\n      || (by > 0x00 && by < 0x20)\n      || (buf[4] > 223 && buf[4] < 248 && buf.length === 6)\n      || (buf[5] > 223 && buf[5] < 248 && buf.length === 6))) {\n    b = buf[3];\n    x = buf[4];\n    y = buf[5];\n\n    // unsigned char overflow.\n    if (x < 0x20) x += 0xff;\n    if (y < 0x20) y += 0xff;\n\n    // Convert the coordinates into a\n    // properly formatted x10 utf8 sequence.\n    s = '\\x1b[M'\n      + String.fromCharCode(b)\n      + String.fromCharCode(x)\n      + String.fromCharCode(y);\n  }\n\n  // XTerm / X10\n  if (parts = /^\\x1b\\[M([\\x00\\u0020-\\uffff]{3})/.exec(s)) {\n    b = parts[1].charCodeAt(0);\n    x = parts[1].charCodeAt(1);\n    y = parts[1].charCodeAt(2);\n\n    key.name = 'mouse';\n    key.type = 'X10';\n\n    key.raw = [b, x, y, parts[0]];\n    key.buf = buf;\n    key.x = x - 32;\n    key.y = y - 32;\n\n    if (this.zero) key.x--, key.y--;\n\n    if (x === 0) key.x = 255;\n    if (y === 0) key.y = 255;\n\n    mod = b >> 2;\n    key.shift = !!(mod & 1);\n    key.meta = !!((mod >> 1) & 1);\n    key.ctrl = !!((mod >> 2) & 1);\n\n    b -= 32;\n\n    if ((b >> 6) & 1) {\n      key.action = b & 1 ? 'wheeldown' : 'wheelup';\n      key.button = 'middle';\n    } else if (b === 3) {\n      // NOTE: x10 and urxvt have no way\n      // of telling which button mouseup used.\n      key.action = 'mouseup';\n      key.button = this._lastButton || 'unknown';\n      delete this._lastButton;\n    } else {\n      key.action = 'mousedown';\n      button = b & 3;\n      key.button =\n        button === 0 ? 'left'\n        : button === 1 ? 'middle'\n        : button === 2 ? 'right'\n        : 'unknown';\n      this._lastButton = key.button;\n    }\n\n    // Probably a movement.\n    // The *newer* VTE gets mouse movements comepletely wrong.\n    // This presents a problem: older versions of VTE that get it right might\n    // be confused by the second conditional in the if statement.\n    // NOTE: Possibly just switch back to the if statement below.\n    // none, shift, ctrl, alt\n    // gnome: 32, 36, 48, 40\n    // xterm: 35, _, 51, _\n    // urxvt: 35, _, _, _\n    // if (key.action === 'mousedown' && key.button === 'unknown') {\n    if (b === 35 || b === 39 || b === 51 || b === 43\n        || (this.isVTE && (b === 32 || b === 36 || b === 48 || b === 40))) {\n      delete key.button;\n      key.action = 'mousemove';\n    }\n\n    self.emit('mouse', key);\n\n    return;\n  }\n\n  // URxvt\n  if (parts = /^\\x1b\\[(\\d+;\\d+;\\d+)M/.exec(s)) {\n    params = parts[1].split(';');\n    b = +params[0];\n    x = +params[1];\n    y = +params[2];\n\n    key.name = 'mouse';\n    key.type = 'urxvt';\n\n    key.raw = [b, x, y, parts[0]];\n    key.buf = buf;\n    key.x = x;\n    key.y = y;\n\n    if (this.zero) key.x--, key.y--;\n\n    mod = b >> 2;\n    key.shift = !!(mod & 1);\n    key.meta = !!((mod >> 1) & 1);\n    key.ctrl = !!((mod >> 2) & 1);\n\n    // XXX Bug in urxvt after wheelup/down on mousemove\n    // NOTE: This may be different than 128/129 depending\n    // on mod keys.\n    if (b === 128 || b === 129) {\n      b = 67;\n    }\n\n    b -= 32;\n\n    if ((b >> 6) & 1) {\n      key.action = b & 1 ? 'wheeldown' : 'wheelup';\n      key.button = 'middle';\n    } else if (b === 3) {\n      // NOTE: x10 and urxvt have no way\n      // of telling which button mouseup used.\n      key.action = 'mouseup';\n      key.button = this._lastButton || 'unknown';\n      delete this._lastButton;\n    } else {\n      key.action = 'mousedown';\n      button = b & 3;\n      key.button =\n        button === 0 ? 'left'\n        : button === 1 ? 'middle'\n        : button === 2 ? 'right'\n        : 'unknown';\n      // NOTE: 0/32 = mousemove, 32/64 = mousemove with left down\n      // if ((b >> 1) === 32)\n      this._lastButton = key.button;\n    }\n\n    // Probably a movement.\n    // The *newer* VTE gets mouse movements comepletely wrong.\n    // This presents a problem: older versions of VTE that get it right might\n    // be confused by the second conditional in the if statement.\n    // NOTE: Possibly just switch back to the if statement below.\n    // none, shift, ctrl, alt\n    // urxvt: 35, _, _, _\n    // gnome: 32, 36, 48, 40\n    // if (key.action === 'mousedown' && key.button === 'unknown') {\n    if (b === 35 || b === 39 || b === 51 || b === 43\n        || (this.isVTE && (b === 32 || b === 36 || b === 48 || b === 40))) {\n      delete key.button;\n      key.action = 'mousemove';\n    }\n\n    self.emit('mouse', key);\n\n    return;\n  }\n\n  // SGR\n  if (parts = /^\\x1b\\[<(\\d+;\\d+;\\d+)([mM])/.exec(s)) {\n    down = parts[2] === 'M';\n    params = parts[1].split(';');\n    b = +params[0];\n    x = +params[1];\n    y = +params[2];\n\n    key.name = 'mouse';\n    key.type = 'sgr';\n\n    key.raw = [b, x, y, parts[0]];\n    key.buf = buf;\n    key.x = x;\n    key.y = y;\n\n    if (this.zero) key.x--, key.y--;\n\n    mod = b >> 2;\n    key.shift = !!(mod & 1);\n    key.meta = !!((mod >> 1) & 1);\n    key.ctrl = !!((mod >> 2) & 1);\n\n    if ((b >> 6) & 1) {\n      key.action = b & 1 ? 'wheeldown' : 'wheelup';\n      key.button = 'middle';\n    } else {\n      key.action = down\n        ? 'mousedown'\n        : 'mouseup';\n      button = b & 3;\n      key.button =\n        button === 0 ? 'left'\n        : button === 1 ? 'middle'\n        : button === 2 ? 'right'\n        : 'unknown';\n    }\n\n    // Probably a movement.\n    // The *newer* VTE gets mouse movements comepletely wrong.\n    // This presents a problem: older versions of VTE that get it right might\n    // be confused by the second conditional in the if statement.\n    // NOTE: Possibly just switch back to the if statement below.\n    // none, shift, ctrl, alt\n    // xterm: 35, _, 51, _\n    // gnome: 32, 36, 48, 40\n    // if (key.action === 'mousedown' && key.button === 'unknown') {\n    if (b === 35 || b === 39 || b === 51 || b === 43\n        || (this.isVTE && (b === 32 || b === 36 || b === 48 || b === 40))) {\n      delete key.button;\n      key.action = 'mousemove';\n    }\n\n    self.emit('mouse', key);\n\n    return;\n  }\n\n  // DEC\n  // The xterm mouse documentation says there is a\n  // `<` prefix, the DECRQLP says there is no prefix.\n  if (parts = /^\\x1b\\[<(\\d+;\\d+;\\d+;\\d+)&w/.exec(s)) {\n    params = parts[1].split(';');\n    b = +params[0];\n    x = +params[1];\n    y = +params[2];\n    page = +params[3];\n\n    key.name = 'mouse';\n    key.type = 'dec';\n\n    key.raw = [b, x, y, parts[0]];\n    key.buf = buf;\n    key.x = x;\n    key.y = y;\n    key.page = page;\n\n    if (this.zero) key.x--, key.y--;\n\n    key.action = b === 3\n      ? 'mouseup'\n      : 'mousedown';\n\n    key.button =\n      b === 2 ? 'left'\n      : b === 4 ? 'middle'\n      : b === 6 ? 'right'\n      : 'unknown';\n\n    self.emit('mouse', key);\n\n    return;\n  }\n\n  // vt300\n  if (parts = /^\\x1b\\[24([0135])~\\[(\\d+),(\\d+)\\]\\r/.exec(s)) {\n    b = +parts[1];\n    x = +parts[2];\n    y = +parts[3];\n\n    key.name = 'mouse';\n    key.type = 'vt300';\n\n    key.raw = [b, x, y, parts[0]];\n    key.buf = buf;\n    key.x = x;\n    key.y = y;\n\n    if (this.zero) key.x--, key.y--;\n\n    key.action = 'mousedown';\n    key.button =\n      b === 1 ? 'left'\n      : b === 2 ? 'middle'\n      : b === 5 ? 'right'\n      : 'unknown';\n\n    self.emit('mouse', key);\n\n    return;\n  }\n\n  if (parts = /^\\x1b\\[(O|I)/.exec(s)) {\n    key.action = parts[1] === 'I'\n      ? 'focus'\n      : 'blur';\n\n    self.emit('mouse', key);\n    self.emit(key.action);\n\n    return;\n  }\n};\n\n// gpm support for linux vc\nProgram.prototype.enableGpm = function() {\n  var self = this;\n  var gpmclient = require('./gpmclient');\n\n  if (this.gpm) return;\n\n  this.gpm = gpmclient();\n\n  this.gpm.on('btndown', function(btn, modifier, x, y) {\n    x--, y--;\n\n    var key = {\n      name: 'mouse',\n      type: 'GPM',\n      action: 'mousedown',\n      button: self.gpm.ButtonName(btn),\n      raw: [btn, modifier, x, y],\n      x: x,\n      y: y,\n      shift: self.gpm.hasShiftKey(modifier),\n      meta: self.gpm.hasMetaKey(modifier),\n      ctrl: self.gpm.hasCtrlKey(modifier)\n    };\n\n    self.emit('mouse', key);\n  });\n\n  this.gpm.on('btnup', function(btn, modifier, x, y) {\n    x--, y--;\n\n    var key = {\n      name: 'mouse',\n      type: 'GPM',\n      action: 'mouseup',\n      button: self.gpm.ButtonName(btn),\n      raw: [btn, modifier, x, y],\n      x: x,\n      y: y,\n      shift: self.gpm.hasShiftKey(modifier),\n      meta: self.gpm.hasMetaKey(modifier),\n      ctrl: self.gpm.hasCtrlKey(modifier)\n    };\n\n    self.emit('mouse', key);\n  });\n\n  this.gpm.on('move', function(btn, modifier, x, y) {\n    x--, y--;\n\n    var key = {\n      name: 'mouse',\n      type: 'GPM',\n      action: 'mousemove',\n      button: self.gpm.ButtonName(btn),\n      raw: [btn, modifier, x, y],\n      x: x,\n      y: y,\n      shift: self.gpm.hasShiftKey(modifier),\n      meta: self.gpm.hasMetaKey(modifier),\n      ctrl: self.gpm.hasCtrlKey(modifier)\n    };\n\n    self.emit('mouse', key);\n  });\n\n  this.gpm.on('drag', function(btn, modifier, x, y) {\n    x--, y--;\n\n    var key = {\n      name: 'mouse',\n      type: 'GPM',\n      action: 'mousemove',\n      button: self.gpm.ButtonName(btn),\n      raw: [btn, modifier, x, y],\n      x: x,\n      y: y,\n      shift: self.gpm.hasShiftKey(modifier),\n      meta: self.gpm.hasMetaKey(modifier),\n      ctrl: self.gpm.hasCtrlKey(modifier)\n    };\n\n    self.emit('mouse', key);\n  });\n\n  this.gpm.on('mousewheel', function(btn, modifier, x, y, dx, dy) {\n    var key = {\n      name: 'mouse',\n      type: 'GPM',\n      action: dy > 0 ? 'wheelup' : 'wheeldown',\n      button: self.gpm.ButtonName(btn),\n      raw: [btn, modifier, x, y, dx, dy],\n      x: x,\n      y: y,\n      shift: self.gpm.hasShiftKey(modifier),\n      meta: self.gpm.hasMetaKey(modifier),\n      ctrl: self.gpm.hasCtrlKey(modifier)\n    };\n\n    self.emit('mouse', key);\n  });\n};\n\nProgram.prototype.disableGpm = function() {\n  if (this.gpm) {\n    this.gpm.stop();\n    delete this.gpm;\n  }\n};\n\n// All possible responses from the terminal\nProgram.prototype.bindResponse = function() {\n  if (this._boundResponse) return;\n  this._boundResponse = true;\n\n  var decoder = new StringDecoder('utf8')\n    , self = this;\n\n  this.on('data', function(data) {\n    data = decoder.write(data);\n    if (!data) return;\n    self._bindResponse(data);\n  });\n};\n\nProgram.prototype._bindResponse = function(s) {\n  var out = {}\n    , parts;\n\n  if (Buffer.isBuffer(s)) {\n    if (s[0] > 127 && s[1] === undefined) {\n      s[0] -= 128;\n      s = '\\x1b' + s.toString('utf-8');\n    } else {\n      s = s.toString('utf-8');\n    }\n  }\n\n  // CSI P s c\n  // Send Device Attributes (Primary DA).\n  // CSI > P s c\n  // Send Device Attributes (Secondary DA).\n  if (parts = /^\\x1b\\[(\\?|>)(\\d*(?:;\\d*)*)c/.exec(s)) {\n    parts = parts[2].split(';').map(function(ch) {\n      return +ch || 0;\n    });\n\n    out.event = 'device-attributes';\n    out.code = 'DA';\n\n    if (parts[1] === '?') {\n      out.type = 'primary-attribute';\n      // VT100-style params:\n      if (parts[0] === 1 && parts[2] === 2) {\n        out.term = 'vt100';\n        out.advancedVideo = true;\n      } else if (parts[0] === 1 && parts[2] === 0) {\n        out.term = 'vt101';\n      } else if (parts[0] === 6) {\n        out.term = 'vt102';\n      } else if (parts[0] === 60\n        && parts[1] === 1 && parts[2] === 2\n        && parts[3] === 6 && parts[4] === 8\n        && parts[5] === 9 && parts[6] === 15) {\n        out.term = 'vt220';\n      } else {\n        // VT200-style params:\n        parts.forEach(function(attr) {\n          switch (attr) {\n            case 1:\n              out.cols132 = true;\n              break;\n            case 2:\n              out.printer = true;\n              break;\n            case 6:\n              out.selectiveErase = true;\n              break;\n            case 8:\n              out.userDefinedKeys = true;\n              break;\n            case 9:\n              out.nationalReplacementCharsets = true;\n              break;\n            case 15:\n              out.technicalCharacters = true;\n              break;\n            case 18:\n              out.userWindows = true;\n              break;\n            case 21:\n              out.horizontalScrolling = true;\n              break;\n            case 22:\n              out.ansiColor = true;\n              break;\n            case 29:\n              out.ansiTextLocator = true;\n              break;\n          }\n        });\n      }\n    } else {\n      out.type = 'secondary-attribute';\n      switch (parts[0]) {\n        case 0:\n          out.term = 'vt100';\n          break;\n        case 1:\n          out.term = 'vt220';\n          break;\n        case 2:\n          out.term = 'vt240';\n          break;\n        case 18:\n          out.term = 'vt330';\n          break;\n        case 19:\n          out.term = 'vt340';\n          break;\n        case 24:\n          out.term = 'vt320';\n          break;\n        case 41:\n          out.term = 'vt420';\n          break;\n        case 61:\n          out.term = 'vt510';\n          break;\n        case 64:\n          out.term = 'vt520';\n          break;\n        case 65:\n          out.term = 'vt525';\n          break;\n      }\n      out.firmwareVersion = parts[1];\n      out.romCartridgeRegistrationNumber = parts[2];\n    }\n\n    // LEGACY\n    out.deviceAttributes = out;\n\n    this.emit('response', out);\n    this.emit('response ' + out.event, out);\n\n    return;\n  }\n\n  // CSI Ps n  Device Status Report (DSR).\n  //     Ps = 5  -> Status Report.  Result (``OK'') is\n  //   CSI 0 n\n  // CSI ? Ps n\n  //   Device Status Report (DSR, DEC-specific).\n  //     Ps = 1 5  -> Report Printer status as CSI ? 1 0  n  (ready).\n  //     or CSI ? 1 1  n  (not ready).\n  //     Ps = 2 5  -> Report UDK status as CSI ? 2 0  n  (unlocked)\n  //     or CSI ? 2 1  n  (locked).\n  //     Ps = 2 6  -> Report Keyboard status as\n  //   CSI ? 2 7  ;  1  ;  0  ;  0  n  (North American).\n  //   The last two parameters apply to VT400 & up, and denote key-\n  //   board ready and LK01 respectively.\n  //     Ps = 5 3  -> Report Locator status as\n  //   CSI ? 5 3  n  Locator available, if compiled-in, or\n  //   CSI ? 5 0  n  No Locator, if not.\n  if (parts = /^\\x1b\\[(\\?)?(\\d+)(?:;(\\d+);(\\d+);(\\d+))?n/.exec(s)) {\n    out.event = 'device-status';\n    out.code = 'DSR';\n\n    if (!parts[1] && parts[2] === '0' && !parts[3]) {\n      out.type = 'device-status';\n      out.status = 'OK';\n\n      // LEGACY\n      out.deviceStatus = out.status;\n\n      this.emit('response', out);\n      this.emit('response ' + out.event, out);\n\n      return;\n    }\n\n    if (parts[1] && (parts[2] === '10' || parts[2] === '11') && !parts[3]) {\n      out.type = 'printer-status';\n      out.status = parts[2] === '10'\n        ? 'ready'\n        : 'not ready';\n\n      // LEGACY\n      out.printerStatus = out.status;\n\n      this.emit('response', out);\n      this.emit('response ' + out.event, out);\n\n      return;\n    }\n\n    if (parts[1] && (parts[2] === '20' || parts[2] === '21') && !parts[3]) {\n      out.type = 'udk-status';\n      out.status = parts[2] === '20'\n        ? 'unlocked'\n        : 'locked';\n\n      // LEGACY\n      out.UDKStatus = out.status;\n\n      this.emit('response', out);\n      this.emit('response ' + out.event, out);\n\n      return;\n    }\n\n    if (parts[1]\n        && parts[2] === '27'\n        && parts[3] === '1'\n        && parts[4] === '0'\n        && parts[5] === '0') {\n      out.type = 'keyboard-status';\n      out.status = 'OK';\n\n      // LEGACY\n      out.keyboardStatus = out.status;\n\n      this.emit('response', out);\n      this.emit('response ' + out.event, out);\n\n      return;\n    }\n\n    if (parts[1] && (parts[2] === '53' || parts[2] === '50') && !parts[3]) {\n      out.type = 'locator-status';\n      out.status = parts[2] === '53'\n          ? 'available'\n          : 'unavailable';\n\n      // LEGACY\n      out.locator = out.status;\n\n      this.emit('response', out);\n      this.emit('response ' + out.event, out);\n\n      return;\n    }\n\n    out.type = 'error';\n    out.text = 'Unhandled: ' + JSON.stringify(parts);\n\n    // LEGACY\n    out.error = out.text;\n\n    this.emit('response', out);\n    this.emit('response ' + out.event, out);\n\n    return;\n  }\n\n  // CSI Ps n  Device Status Report (DSR).\n  //     Ps = 6  -> Report Cursor Position (CPR) [row;column].\n  //   Result is\n  //   CSI r ; c R\n  // CSI ? Ps n\n  //   Device Status Report (DSR, DEC-specific).\n  //     Ps = 6  -> Report Cursor Position (CPR) [row;column] as CSI\n  //     ? r ; c R (assumes page is zero).\n  if (parts = /^\\x1b\\[(\\?)?(\\d+);(\\d+)R/.exec(s)) {\n    out.event = 'device-status';\n    out.code = 'DSR';\n    out.type = 'cursor-status';\n\n    out.status = {\n      x: +parts[3],\n      y: +parts[2],\n      page: !parts[1] ? undefined : 0\n    };\n\n    out.x = out.status.x;\n    out.y = out.status.y;\n    out.page = out.status.page;\n\n    // LEGACY\n    out.cursor = out.status;\n\n    this.emit('response', out);\n    this.emit('response ' + out.event, out);\n\n    return;\n  }\n\n  // CSI Ps ; Ps ; Ps t\n  //   Window manipulation (from dtterm, as well as extensions).\n  //   These controls may be disabled using the allowWindowOps\n  //   resource.  Valid values for the first (and any additional\n  //   parameters) are:\n  //     Ps = 1 1  -> Report xterm window state.  If the xterm window\n  //     is open (non-iconified), it returns CSI 1 t .  If the xterm\n  //     window is iconified, it returns CSI 2 t .\n  //     Ps = 1 3  -> Report xterm window position.  Result is CSI 3\n  //     ; x ; y t\n  //     Ps = 1 4  -> Report xterm window in pixels.  Result is CSI\n  //     4  ;  height ;  width t\n  //     Ps = 1 8  -> Report the size of the text area in characters.\n  //     Result is CSI  8  ;  height ;  width t\n  //     Ps = 1 9  -> Report the size of the screen in characters.\n  //     Result is CSI  9  ;  height ;  width t\n  if (parts = /^\\x1b\\[(\\d+)(?:;(\\d+);(\\d+))?t/.exec(s)) {\n    out.event = 'window-manipulation';\n    out.code = '';\n\n    if ((parts[1] === '1' || parts[1] === '2') && !parts[2]) {\n      out.type = 'window-state';\n      out.state = parts[1] === '1'\n        ? 'non-iconified'\n        : 'iconified';\n\n      // LEGACY\n      out.windowState = out.state;\n\n      this.emit('response', out);\n      this.emit('response ' + out.event, out);\n\n      return;\n    }\n\n    if (parts[1] === '3' && parts[2]) {\n      out.type = 'window-position';\n\n      out.position = {\n        x: +parts[2],\n        y: +parts[3]\n      };\n      out.x = out.position.x;\n      out.y = out.position.y;\n\n      // LEGACY\n      out.windowPosition = out.position;\n\n      this.emit('response', out);\n      this.emit('response ' + out.event, out);\n\n      return;\n    }\n\n    if (parts[1] === '4' && parts[2]) {\n      out.type = 'window-size-pixels';\n      out.size = {\n        height: +parts[2],\n        width: +parts[3]\n      };\n      out.height = out.size.height;\n      out.width = out.size.width;\n\n      // LEGACY\n      out.windowSizePixels = out.size;\n\n      this.emit('response', out);\n      this.emit('response ' + out.event, out);\n\n      return;\n    }\n\n    if (parts[1] === '8' && parts[2]) {\n      out.type = 'textarea-size';\n      out.size = {\n        height: +parts[2],\n        width: +parts[3]\n      };\n      out.height = out.size.height;\n      out.width = out.size.width;\n\n      // LEGACY\n      out.textAreaSizeCharacters = out.size;\n\n      this.emit('response', out);\n      this.emit('response ' + out.event, out);\n\n      return;\n    }\n\n    if (parts[1] === '9' && parts[2]) {\n      out.type = 'screen-size';\n      out.size = {\n        height: +parts[2],\n        width: +parts[3]\n      };\n      out.height = out.size.height;\n      out.width = out.size.width;\n\n      // LEGACY\n      out.screenSizeCharacters = out.size;\n\n      this.emit('response', out);\n      this.emit('response ' + out.event, out);\n\n      return;\n    }\n\n    out.type = 'error';\n    out.text = 'Unhandled: ' + JSON.stringify(parts);\n\n    // LEGACY\n    out.error = out.text;\n\n    this.emit('response', out);\n    this.emit('response ' + out.event, out);\n\n    return;\n  }\n\n  // rxvt-unicode does not support window manipulation\n  //   Result Normal: OSC l/L 0xEF 0xBF 0xBD\n  //   Result ASCII: OSC l/L 0x1c (file separator)\n  //   Result UTF8->ASCII: OSC l/L 0xFD\n  // Test with:\n  //   echo -ne '\\ePtmux;\\e\\e[>3t\\e\\\\'\n  //   sleep 2 && echo -ne '\\ePtmux;\\e\\e[21t\\e\\\\' & cat -v\n  //   -\n  //   echo -ne '\\e[>3t'\n  //   sleep 2 && echo -ne '\\e[21t' & cat -v\n  if (parts = /^\\x1b\\](l|L)([^\\x07\\x1b]*)$/.exec(s)) {\n    parts[2] = 'rxvt';\n    s = '\\x1b]' + parts[1] + parts[2] + '\\x1b\\\\';\n  }\n\n  // CSI Ps ; Ps ; Ps t\n  //   Window manipulation (from dtterm, as well as extensions).\n  //   These controls may be disabled using the allowWindowOps\n  //   resource.  Valid values for the first (and any additional\n  //   parameters) are:\n  //     Ps = 2 0  -> Report xterm window's icon label.  Result is\n  //     OSC  L  label ST\n  //     Ps = 2 1  -> Report xterm window's title.  Result is OSC  l\n  //     label ST\n  if (parts = /^\\x1b\\](l|L)([^\\x07\\x1b]*)(?:\\x07|\\x1b\\\\)/.exec(s)) {\n    out.event = 'window-manipulation';\n    out.code = '';\n\n    if (parts[1] === 'L') {\n      out.type = 'window-icon-label';\n      out.text = parts[2];\n\n      // LEGACY\n      out.windowIconLabel = out.text;\n\n      this.emit('response', out);\n      this.emit('response ' + out.event, out);\n\n      return;\n    }\n\n    if (parts[1] === 'l') {\n      out.type = 'window-title';\n      out.text = parts[2];\n\n      // LEGACY\n      out.windowTitle = out.text;\n\n      this.emit('response', out);\n      this.emit('response ' + out.event, out);\n\n      return;\n    }\n\n    out.type = 'error';\n    out.text = 'Unhandled: ' + JSON.stringify(parts);\n\n    // LEGACY\n    out.error = out.text;\n\n    this.emit('response', out);\n    this.emit('response ' + out.event, out);\n\n    return;\n  }\n\n  // CSI Ps ' |\n  //   Request Locator Position (DECRQLP).\n  //     -> CSI Pe ; Pb ; Pr ; Pc ; Pp &  w\n  //   Parameters are [event;button;row;column;page].\n  //   Valid values for the event:\n  //     Pe = 0  -> locator unavailable - no other parameters sent.\n  //     Pe = 1  -> request - xterm received a DECRQLP.\n  //     Pe = 2  -> left button down.\n  //     Pe = 3  -> left button up.\n  //     Pe = 4  -> middle button down.\n  //     Pe = 5  -> middle button up.\n  //     Pe = 6  -> right button down.\n  //     Pe = 7  -> right button up.\n  //     Pe = 8  -> M4 button down.\n  //     Pe = 9  -> M4 button up.\n  //     Pe = 1 0  -> locator outside filter rectangle.\n  //   ``button'' parameter is a bitmask indicating which buttons are\n  //     pressed:\n  //     Pb = 0  <- no buttons down.\n  //     Pb & 1  <- right button down.\n  //     Pb & 2  <- middle button down.\n  //     Pb & 4  <- left button down.\n  //     Pb & 8  <- M4 button down.\n  //   ``row'' and ``column'' parameters are the coordinates of the\n  //     locator position in the xterm window, encoded as ASCII deci-\n  //     mal.\n  //   The ``page'' parameter is not used by xterm, and will be omit-\n  //   ted.\n  // NOTE:\n  // This is already implemented in the _bindMouse\n  // method, but it might make more sense here.\n  // The xterm mouse documentation says there is a\n  // `<` prefix, the DECRQLP says there is no prefix.\n  if (parts = /^\\x1b\\[(\\d+(?:;\\d+){4})&w/.exec(s)) {\n    parts = parts[1].split(';').map(function(ch) {\n      return +ch;\n    });\n\n    out.event = 'locator-position';\n    out.code = 'DECRQLP';\n\n    switch (parts[0]) {\n      case 0:\n        out.status = 'locator-unavailable';\n        break;\n      case 1:\n        out.status = 'request';\n        break;\n      case 2:\n        out.status = 'left-button-down';\n        break;\n      case 3:\n        out.status = 'left-button-up';\n        break;\n      case 4:\n        out.status = 'middle-button-down';\n        break;\n      case 5:\n        out.status = 'middle-button-up';\n        break;\n      case 6:\n        out.status = 'right-button-down';\n        break;\n      case 7:\n        out.status = 'right-button-up';\n        break;\n      case 8:\n        out.status = 'm4-button-down';\n        break;\n      case 9:\n        out.status = 'm4-button-up';\n        break;\n      case 10:\n        out.status = 'locator-outside';\n        break;\n    }\n\n    out.mask = parts[1];\n    out.row = parts[2];\n    out.col = parts[3];\n    out.page = parts[4];\n\n    // LEGACY\n    out.locatorPosition = out;\n\n    this.emit('response', out);\n    this.emit('response ' + out.event, out);\n\n    return;\n  }\n\n  // OSC Ps ; Pt BEL\n  // OSC Ps ; Pt ST\n  // Set Text Parameters\n  if (parts = /^\\x1b\\](\\d+);([^\\x07\\x1b]+)(?:\\x07|\\x1b\\\\)/.exec(s)) {\n    out.event = 'text-params';\n    out.code = 'Set Text Parameters';\n    out.ps = +s[1];\n    out.pt = s[2];\n    this.emit('response', out);\n    this.emit('response ' + out.event, out);\n  }\n};\n\nProgram.prototype.response = function(name, text, callback, noBypass) {\n  var self = this;\n\n  if (arguments.length === 2) {\n    callback = text;\n    text = name;\n    name = null;\n  }\n\n  if (!callback) {\n    callback = function() {};\n  }\n\n  this.bindResponse();\n\n  name = name\n    ? 'response ' + name\n    : 'response';\n\n  var onresponse;\n\n  this.once(name, onresponse = function(event) {\n    if (timeout) clearTimeout(timeout);\n    if (event.type === 'error') {\n      return callback(new Error(event.event + ': ' + event.text));\n    }\n    return callback(null, event);\n  });\n\n  var timeout = setTimeout(function() {\n    self.removeListener(name, onresponse);\n    return callback(new Error('Timeout.'));\n  }, 2000);\n\n  return noBypass\n    ? this._write(text)\n    : this._twrite(text);\n};\n\nProgram.prototype._owrite =\nProgram.prototype.write = function(text) {\n  if (!this.output.writable) return;\n  return this.output.write(text);\n};\n\nProgram.prototype._buffer = function(text) {\n  if (this._exiting) {\n    this.flush();\n    this._owrite(text);\n    return;\n  }\n\n  if (this._buf) {\n    this._buf += text;\n    return;\n  }\n\n  this._buf = text;\n\n  nextTick(this._flush);\n\n  return true;\n};\n\nProgram.prototype.flush = function() {\n  if (!this._buf) return;\n  this._owrite(this._buf);\n  this._buf = '';\n};\n\nProgram.prototype._write = function(text) {\n  if (this.ret) return text;\n  if (this.useBuffer) {\n    return this._buffer(text);\n  }\n  return this._owrite(text);\n};\n\n// Example: `DCS tmux; ESC Pt ST`\n// Real: `DCS tmux; ESC Pt ESC \\`\nProgram.prototype._twrite = function(data) {\n  var self = this\n    , iterations = 0\n    , timer;\n\n  if (this.tmux) {\n    // Replace all STs with BELs so they can be nested within the DCS code.\n    data = data.replace(/\\x1b\\\\/g, '\\x07');\n\n    // Wrap in tmux forward DCS:\n    data = '\\x1bPtmux;\\x1b' + data + '\\x1b\\\\';\n\n    // If we've never even flushed yet, it means we're still in\n    // the normal buffer. Wait for alt screen buffer.\n    if (this.output.bytesWritten === 0) {\n      timer = setInterval(function() {\n        if (self.output.bytesWritten > 0 || ++iterations === 50) {\n          clearInterval(timer);\n          self.flush();\n          self._owrite(data);\n        }\n      }, 100);\n      return true;\n    }\n\n    // NOTE: Flushing the buffer is required in some cases.\n    // The DCS code must be at the start of the output.\n    this.flush();\n\n    // Write out raw now that the buffer is flushed.\n    return this._owrite(data);\n  }\n\n  return this._write(data);\n};\n\nProgram.prototype.echo =\nProgram.prototype.print = function(text, attr) {\n  return attr\n    ? this._write(this.text(text, attr))\n    : this._write(text);\n};\n\nProgram.prototype._ncoords = function() {\n  if (this.x < 0) this.x = 0;\n  else if (this.x >= this.cols) this.x = this.cols - 1;\n  if (this.y < 0) this.y = 0;\n  else if (this.y >= this.rows) this.y = this.rows - 1;\n};\n\nProgram.prototype.setx = function(x) {\n  return this.cursorCharAbsolute(x);\n  // return this.charPosAbsolute(x);\n};\n\nProgram.prototype.sety = function(y) {\n  return this.linePosAbsolute(y);\n};\n\nProgram.prototype.move = function(x, y) {\n  return this.cursorPos(y, x);\n};\n\n// TODO: Fix cud and cuu calls.\nProgram.prototype.omove = function(x, y) {\n  if (!this.zero) {\n    x = (x || 1) - 1;\n    y = (y || 1) - 1;\n  } else {\n    x = x || 0;\n    y = y || 0;\n  }\n  if (y === this.y && x === this.x) {\n    return;\n  }\n  if (y === this.y) {\n    if (x > this.x) {\n      this.cuf(x - this.x);\n    } else if (x < this.x) {\n      this.cub(this.x - x);\n    }\n  } else if (x === this.x) {\n    if (y > this.y) {\n      this.cud(y - this.y);\n    } else if (y < this.y) {\n      this.cuu(this.y - y);\n    }\n  } else {\n    if (!this.zero) x++, y++;\n    this.cup(y, x);\n  }\n};\n\nProgram.prototype.rsetx = function(x) {\n  // return this.HPositionRelative(x);\n  if (!x) return;\n  return x > 0\n    ? this.forward(x)\n    : this.back(-x);\n};\n\nProgram.prototype.rsety = function(y) {\n  // return this.VPositionRelative(y);\n  if (!y) return;\n  return y > 0\n    ? this.up(y)\n    : this.down(-y);\n};\n\nProgram.prototype.rmove = function(x, y) {\n  this.rsetx(x);\n  this.rsety(y);\n};\n\nProgram.prototype.simpleInsert = function(ch, i, attr) {\n  return this._write(this.repeat(ch, i), attr);\n};\n\nProgram.prototype.repeat = function(ch, i) {\n  if (!i || i < 0) i = 0;\n  return Array(i + 1).join(ch);\n};\n\nProgram.prototype.__defineGetter__('title', function() {\n  return this._title;\n});\n\nProgram.prototype.__defineSetter__('title', function(title) {\n  this.setTitle(title);\n  return this._title;\n});\n\n// Specific to iTerm2, but I think it's really cool.\n// Example:\n//  if (!screen.copyToClipboard(text)) {\n//    execClipboardProgram(text);\n//  }\nProgram.prototype.copyToClipboard = function(text) {\n  if (this.isiTerm2) {\n    this._twrite('\\x1b]50;CopyToCliboard=' + text + '\\x07');\n    return true;\n  }\n  return false;\n};\n\n// Only XTerm and iTerm2. If you know of any others, post them.\nProgram.prototype.cursorShape = function(shape, blink) {\n  if (this.isiTerm2) {\n    switch (shape) {\n      case 'block':\n        if (!blink) {\n          this._twrite('\\x1b]50;CursorShape=0;BlinkingCursorEnabled=0\\x07');\n        } else {\n          this._twrite('\\x1b]50;CursorShape=0;BlinkingCursorEnabled=1\\x07');\n        }\n        break;\n      case 'underline':\n        if (!blink) {\n          // this._twrite('\\x1b]50;CursorShape=n;BlinkingCursorEnabled=0\\x07');\n        } else {\n          // this._twrite('\\x1b]50;CursorShape=n;BlinkingCursorEnabled=1\\x07');\n        }\n        break;\n      case 'line':\n        if (!blink) {\n          this._twrite('\\x1b]50;CursorShape=1;BlinkingCursorEnabled=0\\x07');\n        } else {\n          this._twrite('\\x1b]50;CursorShape=1;BlinkingCursorEnabled=1\\x07');\n        }\n        break;\n    }\n    return true;\n  } else if (this.term('xterm') || this.term('screen')) {\n    switch (shape) {\n      case 'block':\n        if (!blink) {\n          this._twrite('\\x1b[0 q');\n        } else {\n          this._twrite('\\x1b[1 q');\n        }\n        break;\n      case 'underline':\n        if (!blink) {\n          this._twrite('\\x1b[2 q');\n        } else {\n          this._twrite('\\x1b[3 q');\n        }\n        break;\n      case 'line':\n        if (!blink) {\n          this._twrite('\\x1b[4 q');\n        } else {\n          this._twrite('\\x1b[5 q');\n        }\n        break;\n    }\n    return true;\n  }\n  return false;\n};\n\nProgram.prototype.cursorColor = function(color) {\n  if (this.term('xterm') || this.term('rxvt') || this.term('screen')) {\n    this._twrite('\\x1b]12;' + color + '\\x07');\n    return true;\n  }\n  return false;\n};\n\nProgram.prototype.cursorReset =\nProgram.prototype.resetCursor = function() {\n  if (this.term('xterm') || this.term('rxvt') || this.term('screen')) {\n    // XXX\n    // return this.resetColors();\n    this._twrite('\\x1b[0 q');\n    this._twrite('\\x1b]112\\x07');\n    // urxvt doesnt support OSC 112\n    this._twrite('\\x1b]12;white\\x07');\n    return true;\n  }\n  return false;\n};\n\nProgram.prototype.getTextParams = function(param, callback) {\n  return this.response('text-params', '\\x1b]' + param + ';?\\x07', function(err, data) {\n    if (err) return callback(err);\n    return callback(null, data.pt);\n  });\n};\n\nProgram.prototype.getCursorColor = function(callback) {\n  return this.getTextParams(12, callback);\n};\n\n/**\n * Normal\n */\n\n//Program.prototype.pad =\nProgram.prototype.nul = function() {\n  //if (this.has('pad')) return this.put.pad();\n  return this._write('\\x80');\n};\n\nProgram.prototype.bel =\nProgram.prototype.bell = function() {\n  if (this.has('bel')) return this.put.bel();\n  return this._write('\\x07');\n};\n\nProgram.prototype.vtab = function() {\n  this.y++;\n  this._ncoords();\n  return this._write('\\x0b');\n};\n\nProgram.prototype.ff =\nProgram.prototype.form = function() {\n  if (this.has('ff')) return this.put.ff();\n  return this._write('\\x0c');\n};\n\nProgram.prototype.kbs =\nProgram.prototype.backspace = function() {\n  this.x--;\n  this._ncoords();\n  if (this.has('kbs')) return this.put.kbs();\n  return this._write('\\x08');\n};\n\nProgram.prototype.ht =\nProgram.prototype.tab = function() {\n  this.x += 8;\n  this._ncoords();\n  if (this.has('ht')) return this.put.ht();\n  return this._write('\\t');\n};\n\nProgram.prototype.shiftOut = function() {\n  // if (this.has('S2')) return this.put.S2();\n  return this._write('\\x0e');\n};\n\nProgram.prototype.shiftIn = function() {\n  // if (this.has('S3')) return this.put.S3();\n  return this._write('\\x0f');\n};\n\nProgram.prototype.cr =\nProgram.prototype.return = function() {\n  this.x = 0;\n  if (this.has('cr')) return this.put.cr();\n  return this._write('\\r');\n};\n\nProgram.prototype.nel =\nProgram.prototype.newline =\nProgram.prototype.feed = function() {\n  if (this.tput && this.tput.bools.eat_newline_glitch && this.x >= this.cols) {\n    return;\n  }\n  this.x = 0;\n  this.y++;\n  this._ncoords();\n  if (this.has('nel')) return this.put.nel();\n  return this._write('\\n');\n};\n\n/**\n * Esc\n */\n\n// ESC D Index (IND is 0x84).\nProgram.prototype.ind =\nProgram.prototype.index = function() {\n  this.y++;\n  this._ncoords();\n  if (this.tput) return this.put.ind();\n  return this._write('\\x1bD');\n};\n\n// ESC M Reverse Index (RI is 0x8d).\nProgram.prototype.ri =\nProgram.prototype.reverse =\nProgram.prototype.reverseIndex = function() {\n  this.y--;\n  this._ncoords();\n  if (this.tput) return this.put.ri();\n  return this._write('\\x1bM');\n};\n\n// ESC E Next Line (NEL is 0x85).\nProgram.prototype.nextLine = function() {\n  this.y++;\n  this.x = 0;\n  this._ncoords();\n  if (this.has('nel')) return this.put.nel();\n  return this._write('\\x1bE');\n};\n\n// ESC c Full Reset (RIS).\nProgram.prototype.reset = function() {\n  this.x = this.y = 0;\n  if (this.has('rs1') || this.has('ris')) {\n    return this.has('rs1')\n      ? this.put.rs1()\n      : this.put.ris();\n  }\n  return this._write('\\x1bc');\n};\n\n// ESC H Tab Set (HTS is 0x88).\nProgram.prototype.tabSet = function() {\n  if (this.tput) return this.put.hts();\n  return this._write('\\x1bH');\n};\n\n// ESC 7 Save Cursor (DECSC).\nProgram.prototype.sc =\nProgram.prototype.saveCursor = function(key) {\n  if (key) return this.lsaveCursor(key);\n  this.savedX = this.x || 0;\n  this.savedY = this.y || 0;\n  if (this.tput) return this.put.sc();\n  return this._write('\\x1b7');\n};\n\n// ESC 8 Restore Cursor (DECRC).\nProgram.prototype.rc =\nProgram.prototype.restoreCursor = function(key, hide) {\n  if (key) return this.lrestoreCursor(key, hide);\n  this.x = this.savedX || 0;\n  this.y = this.savedY || 0;\n  if (this.tput) return this.put.rc();\n  return this._write('\\x1b8');\n};\n\n// Save Cursor Locally\nProgram.prototype.lsaveCursor = function(key) {\n  key = key || 'local';\n  this._saved = this._saved || {};\n  this._saved[key] = this._saved[key] || {};\n  this._saved[key].x = this.x;\n  this._saved[key].y = this.y;\n  this._saved[key].hidden = this.cursorHidden;\n};\n\n// Restore Cursor Locally\nProgram.prototype.lrestoreCursor = function(key, hide) {\n  var pos;\n  key = key || 'local';\n  if (!this._saved || !this._saved[key]) return;\n  pos = this._saved[key];\n  //delete this._saved[key];\n  this.cup(pos.y, pos.x);\n  if (hide && pos.hidden !== this.cursorHidden) {\n    if (pos.hidden) {\n      this.hideCursor();\n    } else {\n      this.showCursor();\n    }\n  }\n};\n\n// ESC # 3 DEC line height/width\nProgram.prototype.lineHeight = function() {\n  return this._write('\\x1b#');\n};\n\n// ESC (,),*,+,-,. Designate G0-G2 Character Set.\nProgram.prototype.charset = function(val, level) {\n  level = level || 0;\n\n  // See also:\n  // acs_chars / acsc / ac\n  // enter_alt_charset_mode / smacs / as\n  // exit_alt_charset_mode / rmacs / ae\n  // enter_pc_charset_mode / smpch / S2\n  // exit_pc_charset_mode / rmpch / S3\n\n  switch (level) {\n    case 0:\n      level = '(';\n      break;\n    case 1:\n      level = ')';\n      break;\n    case 2:\n      level = '*';\n      break;\n    case 3:\n      level = '+';\n      break;\n  }\n\n  var name = typeof val === 'string'\n    ? val.toLowerCase()\n    : val;\n\n  switch (name) {\n    case 'acs':\n    case 'scld': // DEC Special Character and Line Drawing Set.\n      if (this.tput) return this.put.smacs();\n      val = '0';\n      break;\n    case 'uk': // UK\n      val = 'A';\n      break;\n    case 'us': // United States (USASCII).\n    case 'usascii':\n    case 'ascii':\n      if (this.tput) return this.put.rmacs();\n      val = 'B';\n      break;\n    case 'dutch': // Dutch\n      val = '4';\n      break;\n    case 'finnish': // Finnish\n      val = 'C';\n      val = '5';\n      break;\n    case 'french': // French\n      val = 'R';\n      break;\n    case 'frenchcanadian': // FrenchCanadian\n      val = 'Q';\n      break;\n    case 'german':  // German\n      val = 'K';\n      break;\n    case 'italian': // Italian\n      val = 'Y';\n      break;\n    case 'norwegiandanish': // NorwegianDanish\n      val = 'E';\n      val = '6';\n      break;\n    case 'spanish': // Spanish\n      val = 'Z';\n      break;\n    case 'swedish': // Swedish\n      val = 'H';\n      val = '7';\n      break;\n    case 'swiss': // Swiss\n      val = '=';\n      break;\n    case 'isolatin': // ISOLatin (actually /A)\n      val = '/A';\n      break;\n    default: // Default\n      if (this.tput) return this.put.rmacs();\n      val = 'B';\n      break;\n  }\n\n  return this._write('\\x1b(' + val);\n};\n\nProgram.prototype.enter_alt_charset_mode =\nProgram.prototype.as =\nProgram.prototype.smacs = function() {\n  return this.charset('acs');\n};\n\nProgram.prototype.exit_alt_charset_mode =\nProgram.prototype.ae =\nProgram.prototype.rmacs = function() {\n  return this.charset('ascii');\n};\n\n// ESC N\n// Single Shift Select of G2 Character Set\n// ( SS2 is 0x8e). This affects next character only.\n// ESC O\n// Single Shift Select of G3 Character Set\n// ( SS3 is 0x8f). This affects next character only.\n// ESC n\n// Invoke the G2 Character Set as GL (LS2).\n// ESC o\n// Invoke the G3 Character Set as GL (LS3).\n// ESC |\n// Invoke the G3 Character Set as GR (LS3R).\n// ESC }\n// Invoke the G2 Character Set as GR (LS2R).\n// ESC ~\n// Invoke the G1 Character Set as GR (LS1R).\nProgram.prototype.setG = function(val) {\n  // if (this.tput) return this.put.S2();\n  // if (this.tput) return this.put.S3();\n  switch (val) {\n    case 1:\n      val = '~'; // GR\n      break;\n    case 2:\n      val = 'n'; // GL\n      val = '}'; // GR\n      val = 'N'; // Next Char Only\n      break;\n    case 3:\n      val = 'o'; // GL\n      val = '|'; // GR\n      val = 'O'; // Next Char Only\n      break;\n  }\n  return this._write('\\x1b' + val);\n};\n\n/**\n * OSC\n */\n\n// OSC Ps ; Pt ST\n// OSC Ps ; Pt BEL\n//   Set Text Parameters.\nProgram.prototype.setTitle = function(title) {\n  this._title = title;\n\n  // if (this.term('screen')) {\n  //   // Tmux pane\n  //   // if (this.tmux) {\n  //   //   return this._write('\\x1b]2;' + title + '\\x1b\\\\');\n  //   // }\n  //   return this._write('\\x1bk' + title + '\\x1b\\\\');\n  // }\n\n  return this._twrite('\\x1b]0;' + title + '\\x07');\n};\n\n// OSC Ps ; Pt ST\n// OSC Ps ; Pt BEL\n//   Reset colors\nProgram.prototype.resetColors = function(param) {\n  if (this.has('Cr')) {\n    return this.put.Cr(param);\n  }\n  return this._twrite('\\x1b]112\\x07');\n  //return this._twrite('\\x1b]112;' + param + '\\x07');\n};\n\n// OSC Ps ; Pt ST\n// OSC Ps ; Pt BEL\n//   Change dynamic colors\nProgram.prototype.dynamicColors = function(param) {\n  if (this.has('Cs')) {\n    return this.put.Cs(param);\n  }\n  return this._twrite('\\x1b]12;' + param + '\\x07');\n};\n\n// OSC Ps ; Pt ST\n// OSC Ps ; Pt BEL\n//   Sel data\nProgram.prototype.selData = function(a, b) {\n  if (this.has('Ms')) {\n    return this.put.Ms(a, b);\n  }\n  return this._twrite('\\x1b]52;' + a + ';' + b + '\\x07');\n};\n\n/**\n * CSI\n */\n\n// CSI Ps A\n// Cursor Up Ps Times (default = 1) (CUU).\nProgram.prototype.cuu =\nProgram.prototype.up =\nProgram.prototype.cursorUp = function(param) {\n  this.y -= param || 1;\n  this._ncoords();\n  if (this.tput) {\n    if (!this.tput.strings.parm_up_cursor) {\n      return this._write(this.repeat(this.tput.cuu1(), param));\n    }\n    return this.put.cuu(param);\n  }\n  return this._write('\\x1b[' + (param || '') + 'A');\n};\n\n// CSI Ps B\n// Cursor Down Ps Times (default = 1) (CUD).\nProgram.prototype.cud =\nProgram.prototype.down =\nProgram.prototype.cursorDown = function(param) {\n  this.y += param || 1;\n  this._ncoords();\n  if (this.tput) {\n    if (!this.tput.strings.parm_down_cursor) {\n      return this._write(this.repeat(this.tput.cud1(), param));\n    }\n    return this.put.cud(param);\n  }\n  return this._write('\\x1b[' + (param || '') + 'B');\n};\n\n// CSI Ps C\n// Cursor Forward Ps Times (default = 1) (CUF).\nProgram.prototype.cuf =\nProgram.prototype.right =\nProgram.prototype.forward =\nProgram.prototype.cursorForward = function(param) {\n  this.x += param || 1;\n  this._ncoords();\n  if (this.tput) {\n    if (!this.tput.strings.parm_right_cursor) {\n      return this._write(this.repeat(this.tput.cuf1(), param));\n    }\n    return this.put.cuf(param);\n  }\n  return this._write('\\x1b[' + (param || '') + 'C');\n};\n\n// CSI Ps D\n// Cursor Backward Ps Times (default = 1) (CUB).\nProgram.prototype.cub =\nProgram.prototype.left =\nProgram.prototype.back =\nProgram.prototype.cursorBackward = function(param) {\n  this.x -= param || 1;\n  this._ncoords();\n  if (this.tput) {\n    if (!this.tput.strings.parm_left_cursor) {\n      return this._write(this.repeat(this.tput.cub1(), param));\n    }\n    return this.put.cub(param);\n  }\n  return this._write('\\x1b[' + (param || '') + 'D');\n};\n\n// CSI Ps ; Ps H\n// Cursor Position [row;column] (default = [1,1]) (CUP).\nProgram.prototype.cup =\nProgram.prototype.pos =\nProgram.prototype.cursorPos = function(row, col) {\n  if (!this.zero) {\n    row = (row || 1) - 1;\n    col = (col || 1) - 1;\n  } else {\n    row = row || 0;\n    col = col || 0;\n  }\n  this.x = col;\n  this.y = row;\n  this._ncoords();\n  if (this.tput) return this.put.cup(row, col);\n  return this._write('\\x1b[' + (row + 1) + ';' + (col + 1) + 'H');\n};\n\n// CSI Ps J  Erase in Display (ED).\n//     Ps = 0  -> Erase Below (default).\n//     Ps = 1  -> Erase Above.\n//     Ps = 2  -> Erase All.\n//     Ps = 3  -> Erase Saved Lines (xterm).\n// CSI ? Ps J\n//   Erase in Display (DECSED).\n//     Ps = 0  -> Selective Erase Below (default).\n//     Ps = 1  -> Selective Erase Above.\n//     Ps = 2  -> Selective Erase All.\nProgram.prototype.ed =\nProgram.prototype.eraseInDisplay = function(param) {\n  if (this.tput) {\n    switch (param) {\n      case 'above':\n        param = 1;\n        break;\n      case 'all':\n        param = 2;\n        break;\n      case 'saved':\n        param = 3;\n        break;\n      case 'below':\n      default:\n        param = 0;\n        break;\n    }\n    // extended tput.E3 = ^[[3;J\n    return this.put.ed(param);\n  }\n  switch (param) {\n    case 'above':\n      return this._write('\\X1b[1J');\n    case 'all':\n      return this._write('\\x1b[2J');\n    case 'saved':\n      return this._write('\\x1b[3J');\n    case 'below':\n    default:\n      return this._write('\\x1b[J');\n  }\n};\n\nProgram.prototype.clear = function() {\n  this.x = 0;\n  this.y = 0;\n  if (this.tput) return this.put.clear();\n  return this._write('\\x1b[H\\x1b[J');\n};\n\n// CSI Ps K  Erase in Line (EL).\n//     Ps = 0  -> Erase to Right (default).\n//     Ps = 1  -> Erase to Left.\n//     Ps = 2  -> Erase All.\n// CSI ? Ps K\n//   Erase in Line (DECSEL).\n//     Ps = 0  -> Selective Erase to Right (default).\n//     Ps = 1  -> Selective Erase to Left.\n//     Ps = 2  -> Selective Erase All.\nProgram.prototype.el =\nProgram.prototype.eraseInLine = function(param) {\n  if (this.tput) {\n    //if (this.tput.back_color_erase) ...\n    switch (param) {\n      case 'left':\n        param = 1;\n        break;\n      case 'all':\n        param = 2;\n        break;\n      case 'right':\n      default:\n        param = 0;\n        break;\n    }\n    return this.put.el(param);\n  }\n  switch (param) {\n    case 'left':\n      return this._write('\\x1b[1K');\n    case 'all':\n      return this._write('\\x1b[2K');\n    case 'right':\n    default:\n      return this._write('\\x1b[K');\n  }\n};\n\n// CSI Pm m  Character Attributes (SGR).\n//     Ps = 0  -> Normal (default).\n//     Ps = 1  -> Bold.\n//     Ps = 4  -> Underlined.\n//     Ps = 5  -> Blink (appears as Bold).\n//     Ps = 7  -> Inverse.\n//     Ps = 8  -> Invisible, i.e., hidden (VT300).\n//     Ps = 2 2  -> Normal (neither bold nor faint).\n//     Ps = 2 4  -> Not underlined.\n//     Ps = 2 5  -> Steady (not blinking).\n//     Ps = 2 7  -> Positive (not inverse).\n//     Ps = 2 8  -> Visible, i.e., not hidden (VT300).\n//     Ps = 3 0  -> Set foreground color to Black.\n//     Ps = 3 1  -> Set foreground color to Red.\n//     Ps = 3 2  -> Set foreground color to Green.\n//     Ps = 3 3  -> Set foreground color to Yellow.\n//     Ps = 3 4  -> Set foreground color to Blue.\n//     Ps = 3 5  -> Set foreground color to Magenta.\n//     Ps = 3 6  -> Set foreground color to Cyan.\n//     Ps = 3 7  -> Set foreground color to White.\n//     Ps = 3 9  -> Set foreground color to default (original).\n//     Ps = 4 0  -> Set background color to Black.\n//     Ps = 4 1  -> Set background color to Red.\n//     Ps = 4 2  -> Set background color to Green.\n//     Ps = 4 3  -> Set background color to Yellow.\n//     Ps = 4 4  -> Set background color to Blue.\n//     Ps = 4 5  -> Set background color to Magenta.\n//     Ps = 4 6  -> Set background color to Cyan.\n//     Ps = 4 7  -> Set background color to White.\n//     Ps = 4 9  -> Set background color to default (original).\n\n//   If 16-color support is compiled, the following apply.  Assume\n//   that xterm's resources are set so that the ISO color codes are\n//   the first 8 of a set of 16.  Then the aixterm colors are the\n//   bright versions of the ISO colors:\n//     Ps = 9 0  -> Set foreground color to Black.\n//     Ps = 9 1  -> Set foreground color to Red.\n//     Ps = 9 2  -> Set foreground color to Green.\n//     Ps = 9 3  -> Set foreground color to Yellow.\n//     Ps = 9 4  -> Set foreground color to Blue.\n//     Ps = 9 5  -> Set foreground color to Magenta.\n//     Ps = 9 6  -> Set foreground color to Cyan.\n//     Ps = 9 7  -> Set foreground color to White.\n//     Ps = 1 0 0  -> Set background color to Black.\n//     Ps = 1 0 1  -> Set background color to Red.\n//     Ps = 1 0 2  -> Set background color to Green.\n//     Ps = 1 0 3  -> Set background color to Yellow.\n//     Ps = 1 0 4  -> Set background color to Blue.\n//     Ps = 1 0 5  -> Set background color to Magenta.\n//     Ps = 1 0 6  -> Set background color to Cyan.\n//     Ps = 1 0 7  -> Set background color to White.\n\n//   If xterm is compiled with the 16-color support disabled, it\n//   supports the following, from rxvt:\n//     Ps = 1 0 0  -> Set foreground and background color to\n//     default.\n\n//   If 88- or 256-color support is compiled, the following apply.\n//     Ps = 3 8  ; 5  ; Ps -> Set foreground color to the second\n//     Ps.\n//     Ps = 4 8  ; 5  ; Ps -> Set background color to the second\n//     Ps.\nProgram.prototype.sgr =\nProgram.prototype.attr =\nProgram.prototype.charAttributes = function(param, val) {\n  return this._write(this._attr(param, val));\n};\n\nProgram.prototype.text = function(text, attr) {\n  return this._attr(attr, true) + text + this._attr(attr, false);\n};\n\n// NOTE: sun-color may not allow multiple params for SGR.\nProgram.prototype._attr = function(param, val) {\n  var self = this\n    , parts\n    , color\n    , m;\n\n  if (Array.isArray(param)) {\n    parts = param;\n    param = parts[0] || 'normal';\n  } else {\n    param = param || 'normal';\n    parts = param.split(/\\s*[,;]\\s*/);\n  }\n\n  if (parts.length > 1) {\n    var used = {}\n      , out = [];\n\n    parts.forEach(function(part) {\n      part = self._attr(part, val).slice(2, -1);\n      if (part === '') return;\n      if (used[part]) return;\n      used[part] = true;\n      out.push(part);\n    });\n\n    return '\\x1b[' + out.join(';') + 'm';\n  }\n\n  if (param.indexOf('no ') === 0) {\n    param = param.substring(3);\n    val = false;\n  } else if (param.indexOf('!') === 0) {\n    param = param.substring(1);\n    val = false;\n  }\n\n  switch (param) {\n    // attributes\n    case 'normal':\n    case 'default':\n      if (val === false) return '';\n      return '\\x1b[m';\n    case 'bold':\n      return val === false\n        ? '\\x1b[22m'\n        : '\\x1b[1m';\n    case 'ul':\n    case 'underline':\n    case 'underlined':\n      return val === false\n        ? '\\x1b[24m'\n        : '\\x1b[4m';\n    case 'blink':\n      return val === false\n        ? '\\x1b[25m'\n        : '\\x1b[5m';\n    case 'inverse':\n      return val === false\n        ? '\\x1b[27m'\n        : '\\x1b[7m';\n    case 'invisible':\n      return val === false\n        ? '\\x1b[28m'\n        : '\\x1b[8m';\n\n    // 8-color foreground\n    case 'black fg':\n      return val === false\n        ? '\\x1b[39m'\n        : '\\x1b[30m';\n    case 'red fg':\n      return val === false\n        ? '\\x1b[39m'\n        : '\\x1b[31m';\n    case 'green fg':\n      return val === false\n        ? '\\x1b[39m'\n        : '\\x1b[32m';\n    case 'yellow fg':\n      return val === false\n        ? '\\x1b[39m'\n        : '\\x1b[33m';\n    case 'blue fg':\n      return val === false\n        ? '\\x1b[39m'\n        : '\\x1b[34m';\n    case 'magenta fg':\n      return val === false\n        ? '\\x1b[39m'\n        : '\\x1b[35m';\n    case 'cyan fg':\n      return val === false\n        ? '\\x1b[39m'\n        : '\\x1b[36m';\n    case 'white fg':\n    case 'light grey fg':\n    case 'light gray fg':\n    case 'bright grey fg':\n    case 'bright gray fg':\n      return val === false\n        ? '\\x1b[39m'\n        : '\\x1b[37m';\n    case 'default fg':\n      if (val === false) return '';\n      return '\\x1b[39m';\n\n    // 8-color background\n    case 'black bg':\n      return val === false\n        ? '\\x1b[49m'\n        : '\\x1b[40m';\n    case 'red bg':\n      return val === false\n        ? '\\x1b[49m'\n        : '\\x1b[41m';\n    case 'green bg':\n      return val === false\n        ? '\\x1b[49m'\n        : '\\x1b[42m';\n    case 'yellow bg':\n      return val === false\n        ? '\\x1b[49m'\n        : '\\x1b[43m';\n    case 'blue bg':\n      return val === false\n        ? '\\x1b[49m'\n        : '\\x1b[44m';\n    case 'magenta bg':\n      return val === false\n        ? '\\x1b[49m'\n        : '\\x1b[45m';\n    case 'cyan bg':\n      return val === false\n        ? '\\x1b[49m'\n        : '\\x1b[46m';\n    case 'white bg':\n    case 'light grey bg':\n    case 'light gray bg':\n    case 'bright grey bg':\n    case 'bright gray bg':\n      return val === false\n        ? '\\x1b[49m'\n        : '\\x1b[47m';\n    case 'default bg':\n      if (val === false) return '';\n      return '\\x1b[49m';\n\n    // 16-color foreground\n    case 'light black fg':\n    case 'bright black fg':\n    case 'grey fg':\n    case 'gray fg':\n      return val === false\n        ? '\\x1b[39m'\n        : '\\x1b[90m';\n    case 'light red fg':\n    case 'bright red fg':\n      return val === false\n        ? '\\x1b[39m'\n        : '\\x1b[91m';\n    case 'light green fg':\n    case 'bright green fg':\n      return val === false\n        ? '\\x1b[39m'\n        : '\\x1b[92m';\n    case 'light yellow fg':\n    case 'bright yellow fg':\n      return val === false\n        ? '\\x1b[39m'\n        : '\\x1b[93m';\n    case 'light blue fg':\n    case 'bright blue fg':\n      return val === false\n        ? '\\x1b[39m'\n        : '\\x1b[94m';\n    case 'light magenta fg':\n    case 'bright magenta fg':\n      return val === false\n        ? '\\x1b[39m'\n        : '\\x1b[95m';\n    case 'light cyan fg':\n    case 'bright cyan fg':\n      return val === false\n        ? '\\x1b[39m'\n        : '\\x1b[96m';\n    case 'light white fg':\n    case 'bright white fg':\n      return val === false\n        ? '\\x1b[39m'\n        : '\\x1b[97m';\n\n    // 16-color background\n    case 'light black bg':\n    case 'bright black bg':\n    case 'grey bg':\n    case 'gray bg':\n      return val === false\n        ? '\\x1b[49m'\n        : '\\x1b[100m';\n    case 'light red bg':\n    case 'bright red bg':\n      return val === false\n        ? '\\x1b[49m'\n        : '\\x1b[101m';\n    case 'light green bg':\n    case 'bright green bg':\n      return val === false\n        ? '\\x1b[49m'\n        : '\\x1b[102m';\n    case 'light yellow bg':\n    case 'bright yellow bg':\n      return val === false\n        ? '\\x1b[49m'\n        : '\\x1b[103m';\n    case 'light blue bg':\n    case 'bright blue bg':\n      return val === false\n        ? '\\x1b[49m'\n        : '\\x1b[104m';\n    case 'light magenta bg':\n    case 'bright magenta bg':\n      return val === false\n        ? '\\x1b[49m'\n        : '\\x1b[105m';\n    case 'light cyan bg':\n    case 'bright cyan bg':\n      return val === false\n        ? '\\x1b[49m'\n        : '\\x1b[106m';\n    case 'light white bg':\n    case 'bright white bg':\n      return val === false\n        ? '\\x1b[49m'\n        : '\\x1b[107m';\n\n    // non-16-color rxvt default fg and bg\n    case 'default fg bg':\n      if (val === false) return '';\n      return this.term('rxvt')\n        ? '\\x1b[100m'\n        : '\\x1b[39;49m';\n\n    default:\n      // 256-color fg and bg\n      if (param[0] === '#') {\n        param = param.replace(/#(?:[0-9a-f]{3}){1,2}/i, colors.match);\n      }\n\n      m = /^(-?\\d+) (fg|bg)$/.exec(param);\n      if (m) {\n        color = +m[1];\n\n        if (val === false || color === -1) {\n          return this._attr('default ' + m[2]);\n        }\n\n        color = colors.reduce(color, this.tput.colors);\n\n        if (color < 16 || (this.tput && this.tput.colors <= 16)) {\n          if (m[2] === 'fg') {\n            if (color < 8) {\n              color += 30;\n            } else if (color < 16) {\n              color -= 8;\n              color += 90;\n            }\n          } else if (m[2] === 'bg') {\n            if (color < 8) {\n              color += 40;\n            } else if (color < 16) {\n              color -= 8;\n              color += 100;\n            }\n          }\n          return '\\x1b[' + color + 'm';\n        }\n\n        if (m[2] === 'fg') {\n          return '\\x1b[38;5;' + color + 'm';\n        }\n\n        if (m[2] === 'bg') {\n          return '\\x1b[48;5;' + color + 'm';\n        }\n      }\n\n      if (/^[\\d;]*$/.test(param)) {\n        return '\\x1b[' + param + 'm';\n      }\n\n      return null;\n  }\n};\n\nProgram.prototype.fg =\nProgram.prototype.setForeground = function(color, val) {\n  color = color.split(/\\s*[,;]\\s*/).join(' fg, ') + ' fg';\n  return this.attr(color, val);\n};\n\nProgram.prototype.bg =\nProgram.prototype.setBackground = function(color, val) {\n  color = color.split(/\\s*[,;]\\s*/).join(' bg, ') + ' bg';\n  return this.attr(color, val);\n};\n\n// CSI Ps n  Device Status Report (DSR).\n//     Ps = 5  -> Status Report.  Result (``OK'') is\n//   CSI 0 n\n//     Ps = 6  -> Report Cursor Position (CPR) [row;column].\n//   Result is\n//   CSI r ; c R\n// CSI ? Ps n\n//   Device Status Report (DSR, DEC-specific).\n//     Ps = 6  -> Report Cursor Position (CPR) [row;column] as CSI\n//     ? r ; c R (assumes page is zero).\n//     Ps = 1 5  -> Report Printer status as CSI ? 1 0  n  (ready).\n//     or CSI ? 1 1  n  (not ready).\n//     Ps = 2 5  -> Report UDK status as CSI ? 2 0  n  (unlocked)\n//     or CSI ? 2 1  n  (locked).\n//     Ps = 2 6  -> Report Keyboard status as\n//   CSI ? 2 7  ;  1  ;  0  ;  0  n  (North American).\n//   The last two parameters apply to VT400 & up, and denote key-\n//   board ready and LK01 respectively.\n//     Ps = 5 3  -> Report Locator status as\n//   CSI ? 5 3  n  Locator available, if compiled-in, or\n//   CSI ? 5 0  n  No Locator, if not.\nProgram.prototype.dsr =\nProgram.prototype.deviceStatus = function(param, callback, dec, noBypass) {\n  if (dec) {\n    return this.response('device-status',\n      '\\x1b[?' + (param || '0') + 'n', callback, noBypass);\n  }\n  return this.response('device-status',\n    '\\x1b[' + (param || '0') + 'n', callback, noBypass);\n};\n\nProgram.prototype.getCursor = function(callback) {\n  return this.deviceStatus(6, callback, false, true);\n};\n\nProgram.prototype.saveReportedCursor = function(callback) {\n  var self = this;\n  if (this.tput.strings.user7 === '\\x1b[6n' || this.term('screen')) {\n    return this.getCursor(function(err, data) {\n      if (data) {\n        self._rx = data.status.x;\n        self._ry = data.status.y;\n      }\n      if (!callback) return;\n      return callback(err);\n    });\n  }\n  if (!callback) return;\n  return callback();\n};\n\nProgram.prototype.restoreReportedCursor = function() {\n  if (this._rx == null) return;\n  return this.cup(this._ry, this._rx);\n  // return this.nel();\n};\n\n/**\n * Additions\n */\n\n// CSI Ps @\n// Insert Ps (Blank) Character(s) (default = 1) (ICH).\nProgram.prototype.ich =\nProgram.prototype.insertChars = function(param) {\n  this.x += param || 1;\n  this._ncoords();\n  if (this.tput) return this.put.ich(param);\n  return this._write('\\x1b[' + (param || 1) + '@');\n};\n\n// CSI Ps E\n// Cursor Next Line Ps Times (default = 1) (CNL).\n// same as CSI Ps B ?\nProgram.prototype.cnl =\nProgram.prototype.cursorNextLine = function(param) {\n  this.y += param || 1;\n  this._ncoords();\n  return this._write('\\x1b[' + (param || '') + 'E');\n};\n\n// CSI Ps F\n// Cursor Preceding Line Ps Times (default = 1) (CNL).\n// reuse CSI Ps A ?\nProgram.prototype.cpl =\nProgram.prototype.cursorPrecedingLine = function(param) {\n  this.y -= param || 1;\n  this._ncoords();\n  return this._write('\\x1b[' + (param || '') + 'F');\n};\n\n// CSI Ps G\n// Cursor Character Absolute  [column] (default = [row,1]) (CHA).\nProgram.prototype.cha =\nProgram.prototype.cursorCharAbsolute = function(param) {\n  if (!this.zero) {\n    param = (param || 1) - 1;\n  } else {\n    param = param || 0;\n  }\n  this.x = param;\n  this.y = 0;\n  this._ncoords();\n  if (this.tput) return this.put.hpa(param);\n  return this._write('\\x1b[' + (param + 1) + 'G');\n};\n\n// CSI Ps L\n// Insert Ps Line(s) (default = 1) (IL).\nProgram.prototype.il =\nProgram.prototype.insertLines = function(param) {\n  if (this.tput) return this.put.il(param);\n  return this._write('\\x1b[' + (param || '') + 'L');\n};\n\n// CSI Ps M\n// Delete Ps Line(s) (default = 1) (DL).\nProgram.prototype.dl =\nProgram.prototype.deleteLines = function(param) {\n  if (this.tput) return this.put.dl(param);\n  return this._write('\\x1b[' + (param || '') + 'M');\n};\n\n// CSI Ps P\n// Delete Ps Character(s) (default = 1) (DCH).\nProgram.prototype.dch =\nProgram.prototype.deleteChars = function(param) {\n  if (this.tput) return this.put.dch(param);\n  return this._write('\\x1b[' + (param || '') + 'P');\n};\n\n// CSI Ps X\n// Erase Ps Character(s) (default = 1) (ECH).\nProgram.prototype.ech =\nProgram.prototype.eraseChars = function(param) {\n  if (this.tput) return this.put.ech(param);\n  return this._write('\\x1b[' + (param || '') + 'X');\n};\n\n// CSI Pm `  Character Position Absolute\n//   [column] (default = [row,1]) (HPA).\nProgram.prototype.hpa =\nProgram.prototype.charPosAbsolute = function(param) {\n  this.x = param || 0;\n  this._ncoords();\n  if (this.tput) {\n    return this.put.hpa.apply(this.put, arguments);\n  }\n  param = slice.call(arguments).join(';');\n  return this._write('\\x1b[' + (param || '') + '`');\n};\n\n// 141 61 a * HPR -\n// Horizontal Position Relative\n// reuse CSI Ps C ?\nProgram.prototype.hpr =\nProgram.prototype.HPositionRelative = function(param) {\n  if (this.tput) return this.cuf(param);\n  this.x += param || 1;\n  this._ncoords();\n  // Does not exist:\n  // if (this.tput) return this.put.hpr(param);\n  return this._write('\\x1b[' + (param || '') + 'a');\n};\n\n// CSI Ps c  Send Device Attributes (Primary DA).\n//     Ps = 0  or omitted -> request attributes from terminal.  The\n//     response depends on the decTerminalID resource setting.\n//     -> CSI ? 1 ; 2 c  (``VT100 with Advanced Video Option'')\n//     -> CSI ? 1 ; 0 c  (``VT101 with No Options'')\n//     -> CSI ? 6 c  (``VT102'')\n//     -> CSI ? 6 0 ; 1 ; 2 ; 6 ; 8 ; 9 ; 1 5 ; c  (``VT220'')\n//   The VT100-style response parameters do not mean anything by\n//   themselves.  VT220 parameters do, telling the host what fea-\n//   tures the terminal supports:\n//     Ps = 1  -> 132-columns.\n//     Ps = 2  -> Printer.\n//     Ps = 6  -> Selective erase.\n//     Ps = 8  -> User-defined keys.\n//     Ps = 9  -> National replacement character sets.\n//     Ps = 1 5  -> Technical characters.\n//     Ps = 2 2  -> ANSI color, e.g., VT525.\n//     Ps = 2 9  -> ANSI text locator (i.e., DEC Locator mode).\n// CSI > Ps c\n//   Send Device Attributes (Secondary DA).\n//     Ps = 0  or omitted -> request the terminal's identification\n//     code.  The response depends on the decTerminalID resource set-\n//     ting.  It should apply only to VT220 and up, but xterm extends\n//     this to VT100.\n//     -> CSI  > Pp ; Pv ; Pc c\n//   where Pp denotes the terminal type\n//     Pp = 0  -> ``VT100''.\n//     Pp = 1  -> ``VT220''.\n//   and Pv is the firmware version (for xterm, this was originally\n//   the XFree86 patch number, starting with 95).  In a DEC termi-\n//   nal, Pc indicates the ROM cartridge registration number and is\n//   always zero.\n// More information:\n//   xterm/charproc.c - line 2012, for more information.\n//   vim responds with ^[[?0c or ^[[?1c after the terminal's response (?)\nProgram.prototype.da =\nProgram.prototype.sendDeviceAttributes = function(param, callback) {\n  return this.response('device-attributes',\n    '\\x1b[' + (param || '') + 'c', callback);\n};\n\n// CSI Pm d\n// Line Position Absolute  [row] (default = [1,column]) (VPA).\n// NOTE: Can't find in terminfo, no idea why it has multiple params.\nProgram.prototype.vpa =\nProgram.prototype.linePosAbsolute = function(param) {\n  this.y = param || 1;\n  this._ncoords();\n  if (this.tput) {\n    return this.put.vpa.apply(this.put, arguments);\n  }\n  param = slice.call(arguments).join(';');\n  return this._write('\\x1b[' + (param || '') + 'd');\n};\n\n// 145 65 e * VPR - Vertical Position Relative\n// reuse CSI Ps B ?\nProgram.prototype.vpr =\nProgram.prototype.VPositionRelative = function(param) {\n  if (this.tput) return this.cud(param);\n  this.y += param || 1;\n  this._ncoords();\n  // Does not exist:\n  // if (this.tput) return this.put.vpr(param);\n  return this._write('\\x1b[' + (param || '') + 'e');\n};\n\n// CSI Ps ; Ps f\n//   Horizontal and Vertical Position [row;column] (default =\n//   [1,1]) (HVP).\nProgram.prototype.hvp =\nProgram.prototype.HVPosition = function(row, col) {\n  if (!this.zero) {\n    row = (row || 1) - 1;\n    col = (col || 1) - 1;\n  } else {\n    row = row || 0;\n    col = col || 0;\n  }\n  this.y = row;\n  this.x = col;\n  this._ncoords();\n  // Does not exist (?):\n  // if (this.tput) return this.put.hvp(row, col);\n  if (this.tput) return this.put.cup(row, col);\n  return this._write('\\x1b[' + (row + 1) + ';' + (col + 1) + 'f');\n};\n\n// CSI Pm h  Set Mode (SM).\n//     Ps = 2  -> Keyboard Action Mode (AM).\n//     Ps = 4  -> Insert Mode (IRM).\n//     Ps = 1 2  -> Send/receive (SRM).\n//     Ps = 2 0  -> Automatic Newline (LNM).\n// CSI ? Pm h\n//   DEC Private Mode Set (DECSET).\n//     Ps = 1  -> Application Cursor Keys (DECCKM).\n//     Ps = 2  -> Designate USASCII for character sets G0-G3\n//     (DECANM), and set VT100 mode.\n//     Ps = 3  -> 132 Column Mode (DECCOLM).\n//     Ps = 4  -> Smooth (Slow) Scroll (DECSCLM).\n//     Ps = 5  -> Reverse Video (DECSCNM).\n//     Ps = 6  -> Origin Mode (DECOM).\n//     Ps = 7  -> Wraparound Mode (DECAWM).\n//     Ps = 8  -> Auto-repeat Keys (DECARM).\n//     Ps = 9  -> Send Mouse X & Y on button press.  See the sec-\n//     tion Mouse Tracking.\n//     Ps = 1 0  -> Show toolbar (rxvt).\n//     Ps = 1 2  -> Start Blinking Cursor (att610).\n//     Ps = 1 8  -> Print form feed (DECPFF).\n//     Ps = 1 9  -> Set print extent to full screen (DECPEX).\n//     Ps = 2 5  -> Show Cursor (DECTCEM).\n//     Ps = 3 0  -> Show scrollbar (rxvt).\n//     Ps = 3 5  -> Enable font-shifting functions (rxvt).\n//     Ps = 3 8  -> Enter Tektronix Mode (DECTEK).\n//     Ps = 4 0  -> Allow 80 -> 132 Mode.\n//     Ps = 4 1  -> more(1) fix (see curses resource).\n//     Ps = 4 2  -> Enable Nation Replacement Character sets (DECN-\n//     RCM).\n//     Ps = 4 4  -> Turn On Margin Bell.\n//     Ps = 4 5  -> Reverse-wraparound Mode.\n//     Ps = 4 6  -> Start Logging.  This is normally disabled by a\n//     compile-time option.\n//     Ps = 4 7  -> Use Alternate Screen Buffer.  (This may be dis-\n//     abled by the titeInhibit resource).\n//     Ps = 6 6  -> Application keypad (DECNKM).\n//     Ps = 6 7  -> Backarrow key sends backspace (DECBKM).\n//     Ps = 1 0 0 0  -> Send Mouse X & Y on button press and\n//     release.  See the section Mouse Tracking.\n//     Ps = 1 0 0 1  -> Use Hilite Mouse Tracking.\n//     Ps = 1 0 0 2  -> Use Cell Motion Mouse Tracking.\n//     Ps = 1 0 0 3  -> Use All Motion Mouse Tracking.\n//     Ps = 1 0 0 4  -> Send FocusIn/FocusOut events.\n//     Ps = 1 0 0 5  -> Enable Extended Mouse Mode.\n//     Ps = 1 0 1 0  -> Scroll to bottom on tty output (rxvt).\n//     Ps = 1 0 1 1  -> Scroll to bottom on key press (rxvt).\n//     Ps = 1 0 3 4  -> Interpret \"meta\" key, sets eighth bit.\n//     (enables the eightBitInput resource).\n//     Ps = 1 0 3 5  -> Enable special modifiers for Alt and Num-\n//     Lock keys.  (This enables the numLock resource).\n//     Ps = 1 0 3 6  -> Send ESC   when Meta modifies a key.  (This\n//     enables the metaSendsEscape resource).\n//     Ps = 1 0 3 7  -> Send DEL from the editing-keypad Delete\n//     key.\n//     Ps = 1 0 3 9  -> Send ESC  when Alt modifies a key.  (This\n//     enables the altSendsEscape resource).\n//     Ps = 1 0 4 0  -> Keep selection even if not highlighted.\n//     (This enables the keepSelection resource).\n//     Ps = 1 0 4 1  -> Use the CLIPBOARD selection.  (This enables\n//     the selectToClipboard resource).\n//     Ps = 1 0 4 2  -> Enable Urgency window manager hint when\n//     Control-G is received.  (This enables the bellIsUrgent\n//     resource).\n//     Ps = 1 0 4 3  -> Enable raising of the window when Control-G\n//     is received.  (enables the popOnBell resource).\n//     Ps = 1 0 4 7  -> Use Alternate Screen Buffer.  (This may be\n//     disabled by the titeInhibit resource).\n//     Ps = 1 0 4 8  -> Save cursor as in DECSC.  (This may be dis-\n//     abled by the titeInhibit resource).\n//     Ps = 1 0 4 9  -> Save cursor as in DECSC and use Alternate\n//     Screen Buffer, clearing it first.  (This may be disabled by\n//     the titeInhibit resource).  This combines the effects of the 1\n//     0 4 7  and 1 0 4 8  modes.  Use this with terminfo-based\n//     applications rather than the 4 7  mode.\n//     Ps = 1 0 5 0  -> Set terminfo/termcap function-key mode.\n//     Ps = 1 0 5 1  -> Set Sun function-key mode.\n//     Ps = 1 0 5 2  -> Set HP function-key mode.\n//     Ps = 1 0 5 3  -> Set SCO function-key mode.\n//     Ps = 1 0 6 0  -> Set legacy keyboard emulation (X11R6).\n//     Ps = 1 0 6 1  -> Set VT220 keyboard emulation.\n//     Ps = 2 0 0 4  -> Set bracketed paste mode.\n// Modes:\n//   http://vt100.net/docs/vt220-rm/chapter4.html\nProgram.prototype.sm =\nProgram.prototype.setMode = function() {\n  var param = slice.call(arguments).join(';');\n  return this._write('\\x1b[' + (param || '') + 'h');\n};\n\nProgram.prototype.decset = function() {\n  var param = slice.call(arguments).join(';');\n  return this.setMode('?' + param);\n};\n\nProgram.prototype.dectcem =\nProgram.prototype.cnorm =\nProgram.prototype.cvvis =\nProgram.prototype.showCursor = function() {\n  this.cursorHidden = false;\n  // NOTE: In xterm terminfo:\n  // cnorm stops blinking cursor\n  // cvvis starts blinking cursor\n  if (this.tput) return this.put.cnorm();\n  //if (this.tput) return this.put.cvvis();\n  // return this._write('\\x1b[?12l\\x1b[?25h'); // cursor_normal\n  // return this._write('\\x1b[?12;25h'); // cursor_visible\n  return this.setMode('?25');\n};\n\nProgram.prototype.alternate =\nProgram.prototype.smcup =\nProgram.prototype.alternateBuffer = function() {\n  this.isAlt = true;\n  if (this.tput) return this.put.smcup();\n  if (this.term('vt') || this.term('linux')) return;\n  this.setMode('?47');\n  return this.setMode('?1049');\n};\n\n// CSI Pm l  Reset Mode (RM).\n//     Ps = 2  -> Keyboard Action Mode (AM).\n//     Ps = 4  -> Replace Mode (IRM).\n//     Ps = 1 2  -> Send/receive (SRM).\n//     Ps = 2 0  -> Normal Linefeed (LNM).\n// CSI ? Pm l\n//   DEC Private Mode Reset (DECRST).\n//     Ps = 1  -> Normal Cursor Keys (DECCKM).\n//     Ps = 2  -> Designate VT52 mode (DECANM).\n//     Ps = 3  -> 80 Column Mode (DECCOLM).\n//     Ps = 4  -> Jump (Fast) Scroll (DECSCLM).\n//     Ps = 5  -> Normal Video (DECSCNM).\n//     Ps = 6  -> Normal Cursor Mode (DECOM).\n//     Ps = 7  -> No Wraparound Mode (DECAWM).\n//     Ps = 8  -> No Auto-repeat Keys (DECARM).\n//     Ps = 9  -> Don't send Mouse X & Y on button press.\n//     Ps = 1 0  -> Hide toolbar (rxvt).\n//     Ps = 1 2  -> Stop Blinking Cursor (att610).\n//     Ps = 1 8  -> Don't print form feed (DECPFF).\n//     Ps = 1 9  -> Limit print to scrolling region (DECPEX).\n//     Ps = 2 5  -> Hide Cursor (DECTCEM).\n//     Ps = 3 0  -> Don't show scrollbar (rxvt).\n//     Ps = 3 5  -> Disable font-shifting functions (rxvt).\n//     Ps = 4 0  -> Disallow 80 -> 132 Mode.\n//     Ps = 4 1  -> No more(1) fix (see curses resource).\n//     Ps = 4 2  -> Disable Nation Replacement Character sets (DEC-\n//     NRCM).\n//     Ps = 4 4  -> Turn Off Margin Bell.\n//     Ps = 4 5  -> No Reverse-wraparound Mode.\n//     Ps = 4 6  -> Stop Logging.  (This is normally disabled by a\n//     compile-time option).\n//     Ps = 4 7  -> Use Normal Screen Buffer.\n//     Ps = 6 6  -> Numeric keypad (DECNKM).\n//     Ps = 6 7  -> Backarrow key sends delete (DECBKM).\n//     Ps = 1 0 0 0  -> Don't send Mouse X & Y on button press and\n//     release.  See the section Mouse Tracking.\n//     Ps = 1 0 0 1  -> Don't use Hilite Mouse Tracking.\n//     Ps = 1 0 0 2  -> Don't use Cell Motion Mouse Tracking.\n//     Ps = 1 0 0 3  -> Don't use All Motion Mouse Tracking.\n//     Ps = 1 0 0 4  -> Don't send FocusIn/FocusOut events.\n//     Ps = 1 0 0 5  -> Disable Extended Mouse Mode.\n//     Ps = 1 0 1 0  -> Don't scroll to bottom on tty output\n//     (rxvt).\n//     Ps = 1 0 1 1  -> Don't scroll to bottom on key press (rxvt).\n//     Ps = 1 0 3 4  -> Don't interpret \"meta\" key.  (This disables\n//     the eightBitInput resource).\n//     Ps = 1 0 3 5  -> Disable special modifiers for Alt and Num-\n//     Lock keys.  (This disables the numLock resource).\n//     Ps = 1 0 3 6  -> Don't send ESC  when Meta modifies a key.\n//     (This disables the metaSendsEscape resource).\n//     Ps = 1 0 3 7  -> Send VT220 Remove from the editing-keypad\n//     Delete key.\n//     Ps = 1 0 3 9  -> Don't send ESC  when Alt modifies a key.\n//     (This disables the altSendsEscape resource).\n//     Ps = 1 0 4 0  -> Do not keep selection when not highlighted.\n//     (This disables the keepSelection resource).\n//     Ps = 1 0 4 1  -> Use the PRIMARY selection.  (This disables\n//     the selectToClipboard resource).\n//     Ps = 1 0 4 2  -> Disable Urgency window manager hint when\n//     Control-G is received.  (This disables the bellIsUrgent\n//     resource).\n//     Ps = 1 0 4 3  -> Disable raising of the window when Control-\n//     G is received.  (This disables the popOnBell resource).\n//     Ps = 1 0 4 7  -> Use Normal Screen Buffer, clearing screen\n//     first if in the Alternate Screen.  (This may be disabled by\n//     the titeInhibit resource).\n//     Ps = 1 0 4 8  -> Restore cursor as in DECRC.  (This may be\n//     disabled by the titeInhibit resource).\n//     Ps = 1 0 4 9  -> Use Normal Screen Buffer and restore cursor\n//     as in DECRC.  (This may be disabled by the titeInhibit\n//     resource).  This combines the effects of the 1 0 4 7  and 1 0\n//     4 8  modes.  Use this with terminfo-based applications rather\n//     than the 4 7  mode.\n//     Ps = 1 0 5 0  -> Reset terminfo/termcap function-key mode.\n//     Ps = 1 0 5 1  -> Reset Sun function-key mode.\n//     Ps = 1 0 5 2  -> Reset HP function-key mode.\n//     Ps = 1 0 5 3  -> Reset SCO function-key mode.\n//     Ps = 1 0 6 0  -> Reset legacy keyboard emulation (X11R6).\n//     Ps = 1 0 6 1  -> Reset keyboard emulation to Sun/PC style.\n//     Ps = 2 0 0 4  -> Reset bracketed paste mode.\nProgram.prototype.rm =\nProgram.prototype.resetMode = function() {\n  var param = slice.call(arguments).join(';');\n  return this._write('\\x1b[' + (param || '') + 'l');\n};\n\nProgram.prototype.decrst = function() {\n  var param = slice.call(arguments).join(';');\n  return this.resetMode('?' + param);\n};\n\nProgram.prototype.dectcemh =\nProgram.prototype.cursor_invisible =\nProgram.prototype.vi =\nProgram.prototype.civis =\nProgram.prototype.hideCursor = function() {\n  this.cursorHidden = true;\n  if (this.tput) return this.put.civis();\n  return this.resetMode('?25');\n};\n\nProgram.prototype.rmcup =\nProgram.prototype.normalBuffer = function() {\n  this.isAlt = false;\n  if (this.tput) return this.put.rmcup();\n  this.resetMode('?47');\n  return this.resetMode('?1049');\n};\n\nProgram.prototype.enableMouse = function() {\n  if (process.env.BLESSED_FORCE_MODES) {\n    var modes = process.env.BLESSED_FORCE_MODES.split(',');\n    var options = {};\n    for (var n = 0; n < modes.length; ++n) {\n      var pair = modes[n].split('=');\n      var v = pair[1] !== '0';\n      switch (pair[0].toUpperCase()) {\n        case 'SGRMOUSE':\n          options.sgrMouse = v;\n          break;\n        case 'UTFMOUSE':\n          options.utfMouse = v;\n          break;\n        case 'VT200MOUSE':\n          options.vt200Mouse = v;\n          break;\n        case 'URXVTMOUSE':\n          options.urxvtMouse = v;\n          break;\n        case 'X10MOUSE':\n          options.x10Mouse = v;\n          break;\n        case 'DECMOUSE':\n          options.decMouse = v;\n          break;\n        case 'PTERMMOUSE':\n          options.ptermMouse = v;\n          break;\n        case 'JSBTERMMOUSE':\n          options.jsbtermMouse = v;\n          break;\n        case 'VT200HILITE':\n          options.vt200Hilite = v;\n          break;\n        case 'GPMMOUSE':\n          options.gpmMouse = v;\n          break;\n        case 'CELLMOTION':\n          options.cellMotion = v;\n          break;\n        case 'ALLMOTION':\n          options.allMotion = v;\n          break;\n        case 'SENDFOCUS':\n          options.sendFocus = v;\n          break;\n      }\n    }\n    return this.setMouse(options, true);\n  }\n\n  // NOTE:\n  // Cell Motion isn't normally need for anything below here, but we'll\n  // activate it for tmux (whether using it or not) in case our all-motion\n  // passthrough does not work. It can't hurt.\n\n  if (this.term('rxvt-unicode')) {\n    return this.setMouse({\n      urxvtMouse: true,\n      cellMotion: true,\n      allMotion: true\n    }, true);\n  }\n\n  // rxvt does not support the X10 UTF extensions\n  if (this.term('rxvt')) {\n    return this.setMouse({\n      vt200Mouse: true,\n      x10Mouse: true,\n      cellMotion: true,\n      allMotion: true\n    }, true);\n  }\n\n  // libvte is broken. Older versions do not support the\n  // X10 UTF extension. However, later versions do support\n  // SGR/URXVT.\n  if (this.isVTE) {\n    return this.setMouse({\n      // NOTE: Could also use urxvtMouse here.\n      sgrMouse: true,\n      cellMotion: true,\n      allMotion: true\n    }, true);\n  }\n\n  if (this.term('linux')) {\n    return this.setMouse({\n      vt200Mouse: true,\n      gpmMouse: true\n    }, true);\n  }\n\n  if (this.term('xterm')\n      || this.term('screen')\n      || (this.tput && this.tput.strings.key_mouse)) {\n    return this.setMouse({\n      vt200Mouse: true,\n      utfMouse: true,\n      cellMotion: true,\n      allMotion: true\n    }, true);\n  }\n};\n\nProgram.prototype.disableMouse = function() {\n  if (!this._currentMouse) return;\n\n  var obj = {};\n\n  Object.keys(this._currentMouse).forEach(function(key) {\n    obj[key] = false;\n  });\n\n  return this.setMouse(obj, false);\n};\n\n// Set Mouse\nProgram.prototype.setMouse = function(opt, enable) {\n  if (opt.normalMouse != null) {\n    opt.vt200Mouse = opt.normalMouse;\n    opt.allMotion = opt.normalMouse;\n  }\n\n  if (opt.hiliteTracking != null) {\n    opt.vt200Hilite = opt.hiliteTracking;\n  }\n\n  if (enable === true) {\n    if (this._currentMouse) {\n      this.setMouse(opt);\n      Object.keys(opt).forEach(function(key) {\n        this._currentMouse[key] = opt[key];\n      }, this);\n      return;\n    }\n    this._currentMouse = opt;\n    this.mouseEnabled = true;\n  } else if (enable === false) {\n    delete this._currentMouse;\n    this.mouseEnabled = false;\n  }\n\n  //     Ps = 9  -> Send Mouse X & Y on button press.  See the sec-\n  //     tion Mouse Tracking.\n  //     Ps = 9  -> Don't send Mouse X & Y on button press.\n  // x10 mouse\n  if (opt.x10Mouse != null) {\n    if (opt.x10Mouse) this.setMode('?9');\n    else this.resetMode('?9');\n  }\n\n  //     Ps = 1 0 0 0  -> Send Mouse X & Y on button press and\n  //     release.  See the section Mouse Tracking.\n  //     Ps = 1 0 0 0  -> Don't send Mouse X & Y on button press and\n  //     release.  See the section Mouse Tracking.\n  // vt200 mouse\n  if (opt.vt200Mouse != null) {\n    if (opt.vt200Mouse) this.setMode('?1000');\n    else this.resetMode('?1000');\n  }\n\n  //     Ps = 1 0 0 1  -> Use Hilite Mouse Tracking.\n  //     Ps = 1 0 0 1  -> Don't use Hilite Mouse Tracking.\n  if (opt.vt200Hilite != null) {\n    if (opt.vt200Hilite) this.setMode('?1001');\n    else this.resetMode('?1001');\n  }\n\n  //     Ps = 1 0 0 2  -> Use Cell Motion Mouse Tracking.\n  //     Ps = 1 0 0 2  -> Don't use Cell Motion Mouse Tracking.\n  // button event mouse\n  if (opt.cellMotion != null) {\n    if (opt.cellMotion) this.setMode('?1002');\n    else this.resetMode('?1002');\n  }\n\n  //     Ps = 1 0 0 3  -> Use All Motion Mouse Tracking.\n  //     Ps = 1 0 0 3  -> Don't use All Motion Mouse Tracking.\n  // any event mouse\n  if (opt.allMotion != null) {\n    // NOTE: Latest versions of tmux seem to only support cellMotion (not\n    // allMotion). We pass all motion through to the terminal.\n    if (this.tmux && this.tmuxVersion >= 2) {\n      if (opt.allMotion) this._twrite('\\x1b[?1003h');\n      else this._twrite('\\x1b[?1003l');\n    } else {\n      if (opt.allMotion) this.setMode('?1003');\n      else this.resetMode('?1003');\n    }\n  }\n\n  //     Ps = 1 0 0 4  -> Send FocusIn/FocusOut events.\n  //     Ps = 1 0 0 4  -> Don't send FocusIn/FocusOut events.\n  if (opt.sendFocus != null) {\n    if (opt.sendFocus) this.setMode('?1004');\n    else this.resetMode('?1004');\n  }\n\n  //     Ps = 1 0 0 5  -> Enable Extended Mouse Mode.\n  //     Ps = 1 0 0 5  -> Disable Extended Mouse Mode.\n  if (opt.utfMouse != null) {\n    if (opt.utfMouse) this.setMode('?1005');\n    else this.resetMode('?1005');\n  }\n\n  // sgr mouse\n  if (opt.sgrMouse != null) {\n    if (opt.sgrMouse) this.setMode('?1006');\n    else this.resetMode('?1006');\n  }\n\n  // urxvt mouse\n  if (opt.urxvtMouse != null) {\n    if (opt.urxvtMouse) this.setMode('?1015');\n    else this.resetMode('?1015');\n  }\n\n  // dec mouse\n  if (opt.decMouse != null) {\n    if (opt.decMouse) this._write('\\x1b[1;2\\'z\\x1b[1;3\\'{');\n    else this._write('\\x1b[\\'z');\n  }\n\n  // pterm mouse\n  if (opt.ptermMouse != null) {\n    if (opt.ptermMouse) this._write('\\x1b[>1h\\x1b[>6h\\x1b[>7h\\x1b[>1h\\x1b[>9l');\n    else this._write('\\x1b[>1l\\x1b[>6l\\x1b[>7l\\x1b[>1l\\x1b[>9h');\n  }\n\n  // jsbterm mouse\n  if (opt.jsbtermMouse != null) {\n    // + = advanced mode\n    if (opt.jsbtermMouse) this._write('\\x1b[0~ZwLMRK+1Q\\x1b\\\\');\n    else this._write('\\x1b[0~ZwQ\\x1b\\\\');\n  }\n\n  // gpm mouse\n  if (opt.gpmMouse != null) {\n    if (opt.gpmMouse) this.enableGpm();\n    else this.disableGpm();\n  }\n};\n\n// CSI Ps ; Ps r\n//   Set Scrolling Region [top;bottom] (default = full size of win-\n//   dow) (DECSTBM).\n// CSI ? Pm r\nProgram.prototype.decstbm =\nProgram.prototype.csr =\nProgram.prototype.setScrollRegion = function(top, bottom) {\n  if (!this.zero) {\n    top = (top || 1) - 1;\n    bottom = (bottom || this.rows) - 1;\n  } else {\n    top = top || 0;\n    bottom = bottom || (this.rows - 1);\n  }\n  this.scrollTop = top;\n  this.scrollBottom = bottom;\n  this.x = 0;\n  this.y = 0;\n  this._ncoords();\n  if (this.tput) return this.put.csr(top, bottom);\n  return this._write('\\x1b[' + (top + 1) + ';' + (bottom + 1) + 'r');\n};\n\n// CSI s\n//   Save cursor (ANSI.SYS).\nProgram.prototype.scA =\nProgram.prototype.saveCursorA = function() {\n  this.savedX = this.x;\n  this.savedY = this.y;\n  if (this.tput) return this.put.sc();\n  return this._write('\\x1b[s');\n};\n\n// CSI u\n//   Restore cursor (ANSI.SYS).\nProgram.prototype.rcA =\nProgram.prototype.restoreCursorA = function() {\n  this.x = this.savedX || 0;\n  this.y = this.savedY || 0;\n  if (this.tput) return this.put.rc();\n  return this._write('\\x1b[u');\n};\n\n/**\n * Lesser Used\n */\n\n// CSI Ps I\n//   Cursor Forward Tabulation Ps tab stops (default = 1) (CHT).\nProgram.prototype.cht =\nProgram.prototype.cursorForwardTab = function(param) {\n  this.x += 8;\n  this._ncoords();\n  if (this.tput) return this.put.tab(param);\n  return this._write('\\x1b[' + (param || 1) + 'I');\n};\n\n// CSI Ps S  Scroll up Ps lines (default = 1) (SU).\nProgram.prototype.su =\nProgram.prototype.scrollUp = function(param) {\n  this.y -= param || 1;\n  this._ncoords();\n  if (this.tput) return this.put.parm_index(param);\n  return this._write('\\x1b[' + (param || 1) + 'S');\n};\n\n// CSI Ps T  Scroll down Ps lines (default = 1) (SD).\nProgram.prototype.sd =\nProgram.prototype.scrollDown = function(param) {\n  this.y += param || 1;\n  this._ncoords();\n  if (this.tput) return this.put.parm_rindex(param);\n  return this._write('\\x1b[' + (param || 1) + 'T');\n};\n\n// CSI Ps ; Ps ; Ps ; Ps ; Ps T\n//   Initiate highlight mouse tracking.  Parameters are\n//   [func;startx;starty;firstrow;lastrow].  See the section Mouse\n//   Tracking.\nProgram.prototype.initMouseTracking = function() {\n  return this._write('\\x1b[' + slice.call(arguments).join(';') + 'T');\n};\n\n// CSI > Ps; Ps T\n//   Reset one or more features of the title modes to the default\n//   value.  Normally, \"reset\" disables the feature.  It is possi-\n//   ble to disable the ability to reset features by compiling a\n//   different default for the title modes into xterm.\n//     Ps = 0  -> Do not set window/icon labels using hexadecimal.\n//     Ps = 1  -> Do not query window/icon labels using hexadeci-\n//     mal.\n//     Ps = 2  -> Do not set window/icon labels using UTF-8.\n//     Ps = 3  -> Do not query window/icon labels using UTF-8.\n//   (See discussion of \"Title Modes\").\nProgram.prototype.resetTitleModes = function() {\n  return this._write('\\x1b[>' + slice.call(arguments).join(';') + 'T');\n};\n\n// CSI Ps Z  Cursor Backward Tabulation Ps tab stops (default = 1) (CBT).\nProgram.prototype.cbt =\nProgram.prototype.cursorBackwardTab = function(param) {\n  this.x -= 8;\n  this._ncoords();\n  if (this.tput) return this.put.cbt(param);\n  return this._write('\\x1b[' + (param || 1) + 'Z');\n};\n\n// CSI Ps b  Repeat the preceding graphic character Ps times (REP).\nProgram.prototype.rep =\nProgram.prototype.repeatPrecedingCharacter = function(param) {\n  this.x += param || 1;\n  this._ncoords();\n  if (this.tput) return this.put.rep(param);\n  return this._write('\\x1b[' + (param || 1) + 'b');\n};\n\n// CSI Ps g  Tab Clear (TBC).\n//     Ps = 0  -> Clear Current Column (default).\n//     Ps = 3  -> Clear All.\n// Potentially:\n//   Ps = 2  -> Clear Stops on Line.\n//   http://vt100.net/annarbor/aaa-ug/section6.html\nProgram.prototype.tbc =\nProgram.prototype.tabClear = function(param) {\n  if (this.tput) return this.put.tbc(param);\n  return this._write('\\x1b[' + (param || 0) + 'g');\n};\n\n// CSI Pm i  Media Copy (MC).\n//     Ps = 0  -> Print screen (default).\n//     Ps = 4  -> Turn off printer controller mode.\n//     Ps = 5  -> Turn on printer controller mode.\n// CSI ? Pm i\n//   Media Copy (MC, DEC-specific).\n//     Ps = 1  -> Print line containing cursor.\n//     Ps = 4  -> Turn off autoprint mode.\n//     Ps = 5  -> Turn on autoprint mode.\n//     Ps = 1  0  -> Print composed display, ignores DECPEX.\n//     Ps = 1  1  -> Print all pages.\nProgram.prototype.mc =\nProgram.prototype.mediaCopy = function() {\n  return this._write('\\x1b[' + slice.call(arguments).join(';') + 'i');\n};\n\nProgram.prototype.print_screen =\nProgram.prototype.ps =\nProgram.prototype.mc0 = function() {\n  if (this.tput) return this.put.mc0();\n  return this.mc('0');\n};\n\nProgram.prototype.prtr_on =\nProgram.prototype.po =\nProgram.prototype.mc5 = function() {\n  if (this.tput) return this.put.mc5();\n  return this.mc('5');\n};\n\nProgram.prototype.prtr_off =\nProgram.prototype.pf =\nProgram.prototype.mc4 = function() {\n  if (this.tput) return this.put.mc4();\n  return this.mc('4');\n};\n\nProgram.prototype.prtr_non =\nProgram.prototype.pO =\nProgram.prototype.mc5p = function() {\n  if (this.tput) return this.put.mc5p();\n  return this.mc('?5');\n};\n\n// CSI > Ps; Ps m\n//   Set or reset resource-values used by xterm to decide whether\n//   to construct escape sequences holding information about the\n//   modifiers pressed with a given key.  The first parameter iden-\n//   tifies the resource to set/reset.  The second parameter is the\n//   value to assign to the resource.  If the second parameter is\n//   omitted, the resource is reset to its initial value.\n//     Ps = 1  -> modifyCursorKeys.\n//     Ps = 2  -> modifyFunctionKeys.\n//     Ps = 4  -> modifyOtherKeys.\n//   If no parameters are given, all resources are reset to their\n//   initial values.\nProgram.prototype.setResources = function() {\n  return this._write('\\x1b[>' + slice.call(arguments).join(';') + 'm');\n};\n\n// CSI > Ps n\n//   Disable modifiers which may be enabled via the CSI > Ps; Ps m\n//   sequence.  This corresponds to a resource value of \"-1\", which\n//   cannot be set with the other sequence.  The parameter identi-\n//   fies the resource to be disabled:\n//     Ps = 1  -> modifyCursorKeys.\n//     Ps = 2  -> modifyFunctionKeys.\n//     Ps = 4  -> modifyOtherKeys.\n//   If the parameter is omitted, modifyFunctionKeys is disabled.\n//   When modifyFunctionKeys is disabled, xterm uses the modifier\n//   keys to make an extended sequence of functions rather than\n//   adding a parameter to each function key to denote the modi-\n//   fiers.\nProgram.prototype.disableModifiers = function(param) {\n  return this._write('\\x1b[>' + (param || '') + 'n');\n};\n\n// CSI > Ps p\n//   Set resource value pointerMode.  This is used by xterm to\n//   decide whether to hide the pointer cursor as the user types.\n//   Valid values for the parameter:\n//     Ps = 0  -> never hide the pointer.\n//     Ps = 1  -> hide if the mouse tracking mode is not enabled.\n//     Ps = 2  -> always hide the pointer.  If no parameter is\n//     given, xterm uses the default, which is 1 .\nProgram.prototype.setPointerMode = function(param) {\n  return this._write('\\x1b[>' + (param || '') + 'p');\n};\n\n// CSI ! p   Soft terminal reset (DECSTR).\n// http://vt100.net/docs/vt220-rm/table4-10.html\nProgram.prototype.decstr =\nProgram.prototype.rs2 =\nProgram.prototype.softReset = function() {\n  //if (this.tput) return this.put.init_2string();\n  //if (this.tput) return this.put.reset_2string();\n  if (this.tput) return this.put.rs2();\n  //return this._write('\\x1b[!p');\n  //return this._write('\\x1b[!p\\x1b[?3;4l\\x1b[4l\\x1b>'); // init\n  return this._write('\\x1b[!p\\x1b[?3;4l\\x1b[4l\\x1b>'); // reset\n};\n\n// CSI Ps$ p\n//   Request ANSI mode (DECRQM).  For VT300 and up, reply is\n//     CSI Ps; Pm$ y\n//   where Ps is the mode number as in RM, and Pm is the mode\n//   value:\n//     0 - not recognized\n//     1 - set\n//     2 - reset\n//     3 - permanently set\n//     4 - permanently reset\nProgram.prototype.decrqm =\nProgram.prototype.requestAnsiMode = function(param) {\n  return this._write('\\x1b[' + (param || '') + '$p');\n};\n\n// CSI ? Ps$ p\n//   Request DEC private mode (DECRQM).  For VT300 and up, reply is\n//     CSI ? Ps; Pm$ p\n//   where Ps is the mode number as in DECSET, Pm is the mode value\n//   as in the ANSI DECRQM.\nProgram.prototype.decrqmp =\nProgram.prototype.requestPrivateMode = function(param) {\n  return this._write('\\x1b[?' + (param || '') + '$p');\n};\n\n// CSI Ps ; Ps \" p\n//   Set conformance level (DECSCL).  Valid values for the first\n//   parameter:\n//     Ps = 6 1  -> VT100.\n//     Ps = 6 2  -> VT200.\n//     Ps = 6 3  -> VT300.\n//   Valid values for the second parameter:\n//     Ps = 0  -> 8-bit controls.\n//     Ps = 1  -> 7-bit controls (always set for VT100).\n//     Ps = 2  -> 8-bit controls.\nProgram.prototype.decscl =\nProgram.prototype.setConformanceLevel = function() {\n  return this._write('\\x1b[' + slice.call(arguments).join(';') + '\"p');\n};\n\n// CSI Ps q  Load LEDs (DECLL).\n//     Ps = 0  -> Clear all LEDS (default).\n//     Ps = 1  -> Light Num Lock.\n//     Ps = 2  -> Light Caps Lock.\n//     Ps = 3  -> Light Scroll Lock.\n//     Ps = 2  1  -> Extinguish Num Lock.\n//     Ps = 2  2  -> Extinguish Caps Lock.\n//     Ps = 2  3  -> Extinguish Scroll Lock.\nProgram.prototype.decll =\nProgram.prototype.loadLEDs = function(param) {\n  return this._write('\\x1b[' + (param || '') + 'q');\n};\n\n// CSI Ps SP q\n//   Set cursor style (DECSCUSR, VT520).\n//     Ps = 0  -> blinking block.\n//     Ps = 1  -> blinking block (default).\n//     Ps = 2  -> steady block.\n//     Ps = 3  -> blinking underline.\n//     Ps = 4  -> steady underline.\nProgram.prototype.decscusr =\nProgram.prototype.setCursorStyle = function(param) {\n  switch (param) {\n    case 'blinking block':\n      param = 1;\n      break;\n    case 'block':\n    case 'steady block':\n      param = 2;\n      break;\n    case 'blinking underline':\n      param = 3;\n      break;\n    case 'underline':\n    case 'steady underline':\n      param = 4;\n      break;\n    case 'blinking bar':\n      param = 5;\n      break;\n    case 'bar':\n    case 'steady bar':\n      param = 6;\n      break;\n  }\n  if (param === 2 && this.has('Se')) {\n    return this.put.Se();\n  }\n  if (this.has('Ss')) {\n    return this.put.Ss(param);\n  }\n  return this._write('\\x1b[' + (param || 1) + ' q');\n};\n\n// CSI Ps \" q\n//   Select character protection attribute (DECSCA).  Valid values\n//   for the parameter:\n//     Ps = 0  -> DECSED and DECSEL can erase (default).\n//     Ps = 1  -> DECSED and DECSEL cannot erase.\n//     Ps = 2  -> DECSED and DECSEL can erase.\nProgram.prototype.decsca =\nProgram.prototype.setCharProtectionAttr = function(param) {\n  return this._write('\\x1b[' + (param || 0) + '\"q');\n};\n\n// CSI ? Pm r\n//   Restore DEC Private Mode Values.  The value of Ps previously\n//   saved is restored.  Ps values are the same as for DECSET.\nProgram.prototype.restorePrivateValues = function() {\n  return this._write('\\x1b[?' + slice.call(arguments).join(';') + 'r');\n};\n\n// CSI Pt; Pl; Pb; Pr; Ps$ r\n//   Change Attributes in Rectangular Area (DECCARA), VT400 and up.\n//     Pt; Pl; Pb; Pr denotes the rectangle.\n//     Ps denotes the SGR attributes to change: 0, 1, 4, 5, 7.\n// NOTE: xterm doesn't enable this code by default.\nProgram.prototype.deccara =\nProgram.prototype.setAttrInRectangle = function() {\n  return this._write('\\x1b[' + slice.call(arguments).join(';') + '$r');\n};\n\n// CSI ? Pm s\n//   Save DEC Private Mode Values.  Ps values are the same as for\n//   DECSET.\nProgram.prototype.savePrivateValues = function() {\n  return this._write('\\x1b[?' + slice.call(arguments).join(';') + 's');\n};\n\n// CSI Ps ; Ps ; Ps t\n//   Window manipulation (from dtterm, as well as extensions).\n//   These controls may be disabled using the allowWindowOps\n//   resource.  Valid values for the first (and any additional\n//   parameters) are:\n//     Ps = 1  -> De-iconify window.\n//     Ps = 2  -> Iconify window.\n//     Ps = 3  ;  x ;  y -> Move window to [x, y].\n//     Ps = 4  ;  height ;  width -> Resize the xterm window to\n//     height and width in pixels.\n//     Ps = 5  -> Raise the xterm window to the front of the stack-\n//     ing order.\n//     Ps = 6  -> Lower the xterm window to the bottom of the\n//     stacking order.\n//     Ps = 7  -> Refresh the xterm window.\n//     Ps = 8  ;  height ;  width -> Resize the text area to\n//     [height;width] in characters.\n//     Ps = 9  ;  0  -> Restore maximized window.\n//     Ps = 9  ;  1  -> Maximize window (i.e., resize to screen\n//     size).\n//     Ps = 1 0  ;  0  -> Undo full-screen mode.\n//     Ps = 1 0  ;  1  -> Change to full-screen.\n//     Ps = 1 1  -> Report xterm window state.  If the xterm window\n//     is open (non-iconified), it returns CSI 1 t .  If the xterm\n//     window is iconified, it returns CSI 2 t .\n//     Ps = 1 3  -> Report xterm window position.  Result is CSI 3\n//     ; x ; y t\n//     Ps = 1 4  -> Report xterm window in pixels.  Result is CSI\n//     4  ;  height ;  width t\n//     Ps = 1 8  -> Report the size of the text area in characters.\n//     Result is CSI  8  ;  height ;  width t\n//     Ps = 1 9  -> Report the size of the screen in characters.\n//     Result is CSI  9  ;  height ;  width t\n//     Ps = 2 0  -> Report xterm window's icon label.  Result is\n//     OSC  L  label ST\n//     Ps = 2 1  -> Report xterm window's title.  Result is OSC  l\n//     label ST\n//     Ps = 2 2  ;  0  -> Save xterm icon and window title on\n//     stack.\n//     Ps = 2 2  ;  1  -> Save xterm icon title on stack.\n//     Ps = 2 2  ;  2  -> Save xterm window title on stack.\n//     Ps = 2 3  ;  0  -> Restore xterm icon and window title from\n//     stack.\n//     Ps = 2 3  ;  1  -> Restore xterm icon title from stack.\n//     Ps = 2 3  ;  2  -> Restore xterm window title from stack.\n//     Ps >= 2 4  -> Resize to Ps lines (DECSLPP).\nProgram.prototype.manipulateWindow = function() {\n  var args = slice.call(arguments);\n\n  var callback = typeof args[args.length - 1] === 'function'\n    ? args.pop()\n    : function() {};\n\n  return this.response('window-manipulation',\n    '\\x1b[' + args.join(';') + 't', callback);\n};\n\nProgram.prototype.getWindowSize = function(callback) {\n  return this.manipulateWindow(18, callback);\n};\n\n// CSI Pt; Pl; Pb; Pr; Ps$ t\n//   Reverse Attributes in Rectangular Area (DECRARA), VT400 and\n//   up.\n//     Pt; Pl; Pb; Pr denotes the rectangle.\n//     Ps denotes the attributes to reverse, i.e.,  1, 4, 5, 7.\n// NOTE: xterm doesn't enable this code by default.\nProgram.prototype.decrara =\nProgram.prototype.reverseAttrInRectangle = function() {\n  return this._write('\\x1b[' + slice.call(arguments).join(';') + '$t');\n};\n\n// CSI > Ps; Ps t\n//   Set one or more features of the title modes.  Each parameter\n//   enables a single feature.\n//     Ps = 0  -> Set window/icon labels using hexadecimal.\n//     Ps = 1  -> Query window/icon labels using hexadecimal.\n//     Ps = 2  -> Set window/icon labels using UTF-8.\n//     Ps = 3  -> Query window/icon labels using UTF-8.  (See dis-\n//     cussion of \"Title Modes\")\n// XXX VTE bizarelly echos this:\nProgram.prototype.setTitleModeFeature = function() {\n  return this._twrite('\\x1b[>' + slice.call(arguments).join(';') + 't');\n};\n\n// CSI Ps SP t\n//   Set warning-bell volume (DECSWBV, VT520).\n//     Ps = 0  or 1  -> off.\n//     Ps = 2 , 3  or 4  -> low.\n//     Ps = 5 , 6 , 7 , or 8  -> high.\nProgram.prototype.decswbv =\nProgram.prototype.setWarningBellVolume = function(param) {\n  return this._write('\\x1b[' + (param || '') + ' t');\n};\n\n// CSI Ps SP u\n//   Set margin-bell volume (DECSMBV, VT520).\n//     Ps = 1  -> off.\n//     Ps = 2 , 3  or 4  -> low.\n//     Ps = 0 , 5 , 6 , 7 , or 8  -> high.\nProgram.prototype.decsmbv =\nProgram.prototype.setMarginBellVolume = function(param) {\n  return this._write('\\x1b[' + (param || '') + ' u');\n};\n\n// CSI Pt; Pl; Pb; Pr; Pp; Pt; Pl; Pp$ v\n//   Copy Rectangular Area (DECCRA, VT400 and up).\n//     Pt; Pl; Pb; Pr denotes the rectangle.\n//     Pp denotes the source page.\n//     Pt; Pl denotes the target location.\n//     Pp denotes the target page.\n// NOTE: xterm doesn't enable this code by default.\nProgram.prototype.deccra =\nProgram.prototype.copyRectangle = function() {\n  return this._write('\\x1b[' + slice.call(arguments).join(';') + '$v');\n};\n\n// CSI Pt ; Pl ; Pb ; Pr ' w\n//   Enable Filter Rectangle (DECEFR), VT420 and up.\n//   Parameters are [top;left;bottom;right].\n//   Defines the coordinates of a filter rectangle and activates\n//   it.  Anytime the locator is detected outside of the filter\n//   rectangle, an outside rectangle event is generated and the\n//   rectangle is disabled.  Filter rectangles are always treated\n//   as \"one-shot\" events.  Any parameters that are omitted default\n//   to the current locator position.  If all parameters are omit-\n//   ted, any locator motion will be reported.  DECELR always can-\n//   cels any prevous rectangle definition.\nProgram.prototype.decefr =\nProgram.prototype.enableFilterRectangle = function() {\n  return this._write('\\x1b[' + slice.call(arguments).join(';') + '\\'w');\n};\n\n// CSI Ps x  Request Terminal Parameters (DECREQTPARM).\n//   if Ps is a \"0\" (default) or \"1\", and xterm is emulating VT100,\n//   the control sequence elicits a response of the same form whose\n//   parameters describe the terminal:\n//     Ps -> the given Ps incremented by 2.\n//     Pn = 1  <- no parity.\n//     Pn = 1  <- eight bits.\n//     Pn = 1  <- 2  8  transmit 38.4k baud.\n//     Pn = 1  <- 2  8  receive 38.4k baud.\n//     Pn = 1  <- clock multiplier.\n//     Pn = 0  <- STP flags.\nProgram.prototype.decreqtparm =\nProgram.prototype.requestParameters = function(param) {\n  return this._write('\\x1b[' + (param || 0) + 'x');\n};\n\n// CSI Ps x  Select Attribute Change Extent (DECSACE).\n//     Ps = 0  -> from start to end position, wrapped.\n//     Ps = 1  -> from start to end position, wrapped.\n//     Ps = 2  -> rectangle (exact).\nProgram.prototype.decsace =\nProgram.prototype.selectChangeExtent = function(param) {\n  return this._write('\\x1b[' + (param || 0) + 'x');\n};\n\n// CSI Pc; Pt; Pl; Pb; Pr$ x\n//   Fill Rectangular Area (DECFRA), VT420 and up.\n//     Pc is the character to use.\n//     Pt; Pl; Pb; Pr denotes the rectangle.\n// NOTE: xterm doesn't enable this code by default.\nProgram.prototype.decfra =\nProgram.prototype.fillRectangle = function() {\n  return this._write('\\x1b[' + slice.call(arguments).join(';') + '$x');\n};\n\n// CSI Ps ; Pu ' z\n//   Enable Locator Reporting (DECELR).\n//   Valid values for the first parameter:\n//     Ps = 0  -> Locator disabled (default).\n//     Ps = 1  -> Locator enabled.\n//     Ps = 2  -> Locator enabled for one report, then disabled.\n//   The second parameter specifies the coordinate unit for locator\n//   reports.\n//   Valid values for the second parameter:\n//     Pu = 0  <- or omitted -> default to character cells.\n//     Pu = 1  <- device physical pixels.\n//     Pu = 2  <- character cells.\nProgram.prototype.decelr =\nProgram.prototype.enableLocatorReporting = function() {\n  return this._write('\\x1b[' + slice.call(arguments).join(';') + '\\'z');\n};\n\n// CSI Pt; Pl; Pb; Pr$ z\n//   Erase Rectangular Area (DECERA), VT400 and up.\n//     Pt; Pl; Pb; Pr denotes the rectangle.\n// NOTE: xterm doesn't enable this code by default.\nProgram.prototype.decera =\nProgram.prototype.eraseRectangle = function() {\n  return this._write('\\x1b[' + slice.call(arguments).join(';') + '$z');\n};\n\n// CSI Pm ' {\n//   Select Locator Events (DECSLE).\n//   Valid values for the first (and any additional parameters)\n//   are:\n//     Ps = 0  -> only respond to explicit host requests (DECRQLP).\n//                (This is default).  It also cancels any filter\n//   rectangle.\n//     Ps = 1  -> report button down transitions.\n//     Ps = 2  -> do not report button down transitions.\n//     Ps = 3  -> report button up transitions.\n//     Ps = 4  -> do not report button up transitions.\nProgram.prototype.decsle =\nProgram.prototype.setLocatorEvents = function() {\n  return this._write('\\x1b[' + slice.call(arguments).join(';') + '\\'{');\n};\n\n// CSI Pt; Pl; Pb; Pr$ {\n//   Selective Erase Rectangular Area (DECSERA), VT400 and up.\n//     Pt; Pl; Pb; Pr denotes the rectangle.\nProgram.prototype.decsera =\nProgram.prototype.selectiveEraseRectangle = function() {\n  return this._write('\\x1b[' + slice.call(arguments).join(';') + '${');\n};\n\n// CSI Ps ' |\n//   Request Locator Position (DECRQLP).\n//   Valid values for the parameter are:\n//     Ps = 0 , 1 or omitted -> transmit a single DECLRP locator\n//     report.\n\n//   If Locator Reporting has been enabled by a DECELR, xterm will\n//   respond with a DECLRP Locator Report.  This report is also\n//   generated on button up and down events if they have been\n//   enabled with a DECSLE, or when the locator is detected outside\n//   of a filter rectangle, if filter rectangles have been enabled\n//   with a DECEFR.\n\n//     -> CSI Pe ; Pb ; Pr ; Pc ; Pp &  w\n\n//   Parameters are [event;button;row;column;page].\n//   Valid values for the event:\n//     Pe = 0  -> locator unavailable - no other parameters sent.\n//     Pe = 1  -> request - xterm received a DECRQLP.\n//     Pe = 2  -> left button down.\n//     Pe = 3  -> left button up.\n//     Pe = 4  -> middle button down.\n//     Pe = 5  -> middle button up.\n//     Pe = 6  -> right button down.\n//     Pe = 7  -> right button up.\n//     Pe = 8  -> M4 button down.\n//     Pe = 9  -> M4 button up.\n//     Pe = 1 0  -> locator outside filter rectangle.\n//   ``button'' parameter is a bitmask indicating which buttons are\n//     pressed:\n//     Pb = 0  <- no buttons down.\n//     Pb & 1  <- right button down.\n//     Pb & 2  <- middle button down.\n//     Pb & 4  <- left button down.\n//     Pb & 8  <- M4 button down.\n//   ``row'' and ``column'' parameters are the coordinates of the\n//     locator position in the xterm window, encoded as ASCII deci-\n//     mal.\n//   The ``page'' parameter is not used by xterm, and will be omit-\n//   ted.\nProgram.prototype.decrqlp =\nProgram.prototype.req_mouse_pos =\nProgram.prototype.reqmp =\nProgram.prototype.requestLocatorPosition = function(param, callback) {\n  // See also:\n  // get_mouse / getm / Gm\n  // mouse_info / minfo / Mi\n  // Correct for tput?\n  if (this.has('req_mouse_pos')) {\n    var code = this.tput.req_mouse_pos(param);\n    return this.response('locator-position', code, callback);\n  }\n  return this.response('locator-position',\n    '\\x1b[' + (param || '') + '\\'|', callback);\n};\n\n// CSI P m SP }\n// Insert P s Column(s) (default = 1) (DECIC), VT420 and up.\n// NOTE: xterm doesn't enable this code by default.\nProgram.prototype.decic =\nProgram.prototype.insertColumns = function() {\n  return this._write('\\x1b[' + slice.call(arguments).join(';') + ' }');\n};\n\n// CSI P m SP ~\n// Delete P s Column(s) (default = 1) (DECDC), VT420 and up\n// NOTE: xterm doesn't enable this code by default.\nProgram.prototype.decdc =\nProgram.prototype.deleteColumns = function() {\n  return this._write('\\x1b[' + slice.call(arguments).join(';') + ' ~');\n};\n\nProgram.prototype.out = function(name) {\n  var args = Array.prototype.slice.call(arguments, 1);\n  this.ret = true;\n  var out = this[name].apply(this, args);\n  this.ret = false;\n  return out;\n};\n\nProgram.prototype.sigtstp = function(callback) {\n  var resume = this.pause();\n\n  process.once('SIGCONT', function() {\n    resume();\n    if (callback) callback();\n  });\n\n  process.kill(process.pid, 'SIGTSTP');\n};\n\nProgram.prototype.pause = function(callback) {\n  var self = this\n    , isAlt = this.isAlt\n    , mouseEnabled = this.mouseEnabled;\n\n  this.lsaveCursor('pause');\n  //this.csr(0, screen.height - 1);\n  if (isAlt) this.normalBuffer();\n  this.showCursor();\n  if (mouseEnabled) this.disableMouse();\n\n  var write = this.output.write;\n  this.output.write = function() {};\n  if (this.input.setRawMode) {\n    this.input.setRawMode(false);\n  }\n  this.input.pause();\n\n  return this._resume = function() {\n    delete self._resume;\n\n    if (self.input.setRawMode) {\n      self.input.setRawMode(true);\n    }\n    self.input.resume();\n    self.output.write = write;\n\n    if (isAlt) self.alternateBuffer();\n    //self.csr(0, screen.height - 1);\n    if (mouseEnabled) self.enableMouse();\n    self.lrestoreCursor('pause', true);\n\n    if (callback) callback();\n  };\n};\n\nProgram.prototype.resume = function() {\n  if (this._resume) return this._resume();\n};\n\n/**\n * Helpers\n */\n\n// We could do this easier by just manipulating the _events object, or for\n// older versions of node, manipulating the array returned by listeners(), but\n// neither of these methods are guaranteed to work in future versions of node.\nfunction unshiftEvent(obj, event, listener) {\n  var listeners = obj.listeners(event);\n  obj.removeAllListeners(event);\n  obj.on(event, listener);\n  listeners.forEach(function(listener) {\n    obj.on(event, listener);\n  });\n}\n\nfunction merge(out) {\n  slice.call(arguments, 1).forEach(function(obj) {\n    Object.keys(obj).forEach(function(key) {\n      out[key] = obj[key];\n    });\n  });\n  return out;\n}\n\n/**\n * Expose\n */\n\nmodule.exports = Program;\n"
  },
  {
    "path": "lib/tput.js",
    "content": "/**\n * tput.js - parse and compile terminfo caps to javascript.\n * Copyright (c) 2013-2015, Christopher Jeffrey and contributors (MIT License).\n * https://github.com/chjj/blessed\n */\n\n// Resources:\n//   $ man term\n//   $ man terminfo\n//   http://invisible-island.net/ncurses/man/term.5.html\n//   https://en.wikipedia.org/wiki/Terminfo\n\n// Todo:\n// - xterm's XT (set-title capability?) value should\n//   be true (at least tmux thinks it should).\n//   It's not parsed as true. Investigate.\n// - Possibly switch to other method of finding the\n//   extended data string table: i += h.symOffsetCount * 2;\n\n/**\n * Modules\n */\n\nvar assert = require('assert')\n  , path = require('path')\n  , fs = require('fs')\n  , cp = require('child_process');\n\n/**\n * Tput\n */\n\nfunction Tput(options) {\n  if (!(this instanceof Tput)) {\n    return new Tput(options);\n  }\n\n  options = options || {};\n  if (typeof options === 'string') {\n    options = { terminal: options };\n  }\n\n  this.options = options;\n  this.terminal = options.terminal\n    || options.term\n    || process.env.TERM\n    || (process.platform === 'win32' ? 'windows-ansi' : 'xterm');\n\n  this.terminal = this.terminal.toLowerCase();\n\n  this.debug = options.debug;\n  this.padding = options.padding;\n  this.extended = options.extended;\n  this.printf = options.printf;\n  this.termcap = options.termcap;\n  this.error = null;\n\n  this.terminfoPrefix = options.terminfoPrefix;\n  this.terminfoFile = options.terminfoFile;\n  this.termcapFile = options.termcapFile;\n\n  if (options.terminal || options.term) {\n    this.setup();\n  }\n}\n\nTput.prototype.setup = function() {\n  this.error = null;\n  try {\n    if (this.termcap) {\n      try {\n        this.injectTermcap();\n      } catch (e) {\n        if (this.debug) throw e;\n        this.error = new Error('Termcap parse error.');\n        this._useInternalCap(this.terminal);\n      }\n    } else {\n      try {\n        this.injectTerminfo();\n      } catch (e) {\n        if (this.debug) throw e;\n        this.error = new Error('Terminfo parse error.');\n        this._useInternalInfo(this.terminal);\n      }\n    }\n  } catch (e) {\n    // If there was an error, fallback\n    // to an internally stored terminfo/cap.\n    if (this.debug) throw e;\n    this.error = new Error('Terminfo not found.');\n    this._useXtermInfo();\n  }\n};\n\nTput.prototype.term = function(is) {\n  return this.terminal.indexOf(is) === 0;\n};\n\nTput.prototype._debug = function() {\n  if (!this.debug) return;\n  return console.log.apply(console, arguments);\n};\n\n/**\n * Fallback\n */\n\nTput.prototype._useVt102Cap = function() {\n  return this.injectTermcap('vt102');\n};\n\nTput.prototype._useXtermCap = function() {\n  return this.injectTermcap(__dirname + '/../usr/xterm.termcap');\n};\n\nTput.prototype._useXtermInfo = function() {\n  return this.injectTerminfo(__dirname + '/../usr/xterm');\n};\n\nTput.prototype._useInternalInfo = function(name) {\n  name = path.basename(name);\n  return this.injectTerminfo(__dirname + '/../usr/' + name);\n};\n\nTput.prototype._useInternalCap = function(name) {\n  name = path.basename(name);\n  return this.injectTermcap(__dirname + '/../usr/' + name + '.termcap');\n};\n\n/**\n * Terminfo\n */\n\nTput.ipaths = [\n  process.env.TERMINFO || '',\n  (process.env.TERMINFO_DIRS || '').split(':'),\n  (process.env.HOME || '') + '/.terminfo',\n  '/usr/share/terminfo',\n  '/usr/share/lib/terminfo',\n  '/usr/lib/terminfo',\n  '/usr/local/share/terminfo',\n  '/usr/local/share/lib/terminfo',\n  '/usr/local/lib/terminfo',\n  '/usr/local/ncurses/lib/terminfo',\n  '/lib/terminfo'\n];\n\nTput.prototype.readTerminfo = function(term) {\n  var data\n    , file\n    , info;\n\n  term = term || this.terminal;\n\n  file = path.normalize(this._prefix(term));\n  data = fs.readFileSync(file);\n  info = this.parseTerminfo(data, file);\n\n  if (this.debug) {\n    this._terminfo = info;\n  }\n\n  return info;\n};\n\nTput._prefix =\nTput.prototype._prefix = function(term) {\n  // If we have a terminfoFile, or our\n  // term looks like a filename, use it.\n  if (term) {\n    if (~term.indexOf(path.sep)) {\n      return term;\n    }\n    if (this.terminfoFile) {\n      return this.terminfoFile;\n    }\n  }\n\n  var paths = Tput.ipaths.slice()\n    , file;\n\n  if (this.terminfoPrefix) {\n    paths.unshift(this.terminfoPrefix);\n  }\n\n  // Try exact matches.\n  file = this._tprefix(paths, term);\n  if (file) return file;\n\n  // Try similar matches.\n  file = this._tprefix(paths, term, true);\n  if (file) return file;\n\n  // Not found.\n  throw new Error('Terminfo directory not found.');\n};\n\nTput._tprefix =\nTput.prototype._tprefix = function(prefix, term, soft) {\n  if (!prefix) return;\n\n  var file\n    , dir\n    , i\n    , sdiff\n    , sfile\n    , list;\n\n  if (Array.isArray(prefix)) {\n    for (i = 0; i < prefix.length; i++) {\n      file = this._tprefix(prefix[i], term, soft);\n      if (file) return file;\n    }\n    return;\n  }\n\n  var find = function(word) {\n    var file, ch;\n\n    file = path.resolve(prefix, word[0]);\n    try {\n      fs.statSync(file);\n      return file;\n    } catch (e) {\n      ;\n    }\n\n    ch = word[0].charCodeAt(0).toString(16);\n    if (ch.length < 2) ch = '0' + ch;\n\n    file = path.resolve(prefix, ch);\n    try {\n      fs.statSync(file);\n      return file;\n    } catch (e) {\n      ;\n    }\n  };\n\n  if (!term) {\n    // Make sure the directory's sub-directories\n    // are all one-letter, or hex digits.\n    // return find('x') ? prefix : null;\n    try {\n      dir = fs.readdirSync(prefix).filter(function(file) {\n        return file.length !== 1 && !/^[0-9a-fA-F]{2}$/.test(file);\n      });\n      if (!dir.length) {\n        return prefix;\n      }\n    } catch (e) {\n      ;\n    }\n    return;\n  }\n\n  term = path.basename(term);\n  dir = find(term);\n\n  if (!dir) return;\n\n  if (soft) {\n    try {\n      list = fs.readdirSync(dir);\n    } catch (e) {\n      return;\n    }\n\n    list.forEach(function(file) {\n      if (file.indexOf(term) === 0) {\n        var diff = file.length - term.length;\n        if (!sfile || diff < sdiff) {\n          sdiff = diff;\n          sfile = file;\n        }\n      }\n    });\n\n    return sfile && (soft || sdiff === 0)\n      ? path.resolve(dir, sfile)\n      : null;\n  }\n\n  file = path.resolve(dir, term);\n  try {\n    fs.statSync(file);\n    return file;\n  } catch (e) {\n    ;\n  }\n};\n\n/**\n * Terminfo Parser\n * All shorts are little-endian\n */\n\nTput.prototype.parseTerminfo = function(data, file) {\n  var info = {}\n    , extended\n    , l = data.length\n    , i = 0\n    , v\n    , o;\n\n  var h = info.header = {\n    dataSize: data.length,\n    headerSize: 12,\n    magicNumber: (data[1] << 8) | data[0],\n    namesSize: (data[3] << 8) | data[2],\n    boolCount: (data[5] << 8) | data[4],\n    numCount: (data[7] << 8) | data[6],\n    strCount: (data[9] << 8) | data[8],\n    strTableSize: (data[11] << 8) | data[10]\n  };\n\n  h.total = h.headerSize\n    + h.namesSize\n    + h.boolCount\n    + h.numCount * 2\n    + h.strCount * 2\n    + h.strTableSize;\n\n  i += h.headerSize;\n\n  // Names Section\n  var names = data.toString('ascii', i, i + h.namesSize - 1)\n    , parts = names.split('|')\n    , name = parts[0]\n    , desc = parts.pop();\n\n  info.name = name;\n  info.names = parts;\n  info.desc = desc;\n\n  info.dir = path.resolve(file, '..', '..');\n  info.file = file;\n\n  i += h.namesSize - 1;\n\n  // Names is nul-terminated.\n  assert.equal(data[i], 0);\n  i++;\n\n  // Booleans Section\n  // One byte for each flag\n  // Same order as <term.h>\n  info.bools = {};\n  l = i + h.boolCount;\n  o = 0;\n  for (; i < l; i++) {\n    v = Tput.bools[o++];\n    info.bools[v] = data[i] === 1;\n  }\n\n  // Null byte in between to make sure numbers begin on an even byte.\n  if (i % 2) {\n    assert.equal(data[i], 0);\n    i++;\n  }\n\n  // Numbers Section\n  info.numbers = {};\n  l = i + h.numCount * 2;\n  o = 0;\n  for (; i < l; i += 2) {\n    v = Tput.numbers[o++];\n    if (data[i + 1] === 0xff && data[i] === 0xff) {\n      info.numbers[v] = -1;\n    } else {\n      info.numbers[v] = (data[i + 1] << 8) | data[i];\n    }\n  }\n\n  // Strings Section\n  info.strings = {};\n  l = i + h.strCount * 2;\n  o = 0;\n  for (; i < l; i += 2) {\n    v = Tput.strings[o++];\n    if (data[i + 1] === 0xff && data[i] === 0xff) {\n      info.strings[v] = -1;\n    } else {\n      info.strings[v] = (data[i + 1] << 8) | data[i];\n    }\n  }\n\n  // String Table\n  Object.keys(info.strings).forEach(function(key) {\n    if (info.strings[key] === -1) {\n      delete info.strings[key];\n      return;\n    }\n\n    // Workaround: fix an odd bug in the screen-256color terminfo where it tries\n    // to set -1, but it appears to have {0xfe, 0xff} instead of {0xff, 0xff}.\n    // TODO: Possibly handle errors gracefully below, as well as in the\n    // extended info. Also possibly do: `if (info.strings[key] >= data.length)`.\n    if (info.strings[key] === 65534) {\n      delete info.strings[key];\n      return;\n    }\n\n    var s = i + info.strings[key]\n      , j = s;\n\n    while (data[j]) j++;\n\n    assert(j < data.length);\n\n    info.strings[key] = data.toString('ascii', s, j);\n  });\n\n  // Extended Header\n  if (this.extended !== false) {\n    i--;\n    i += h.strTableSize;\n    if (i % 2) {\n      assert.equal(data[i], 0);\n      i++;\n    }\n    l = data.length;\n    if (i < l - 1) {\n      try {\n        extended = this.parseExtended(data.slice(i));\n      } catch (e) {\n        if (this.debug) {\n          throw e;\n        }\n        return info;\n      }\n      info.header.extended = extended.header;\n      ['bools', 'numbers', 'strings'].forEach(function(key) {\n        merge(info[key], extended[key]);\n      });\n    }\n  }\n\n  return info;\n};\n\n/**\n * Extended Parsing\n */\n\n// Some data to help understand:\n\n// For xterm, non-extended header:\n// { dataSize: 3270,\n//   headerSize: 12,\n//   magicNumber: 282,\n//   namesSize: 48,\n//   boolCount: 38,\n//   numCount: 15,\n//   strCount: 413,\n//   strTableSize: 1388,\n//   total: 2342 }\n\n// For xterm, header:\n// Offset: 2342\n// { header:\n//    { dataSize: 928,\n//      headerSize: 10,\n//      boolCount: 2,\n//      numCount: 1,\n//      strCount: 57,\n//      strTableSize: 117,\n//      lastStrTableOffset: 680,\n//      total: 245 },\n\n// For xterm, layout:\n// { header: '0 - 10', // length: 10\n//   bools: '10 - 12', // length: 2\n//   numbers: '12 - 14', // length: 2\n//   strings: '14 - 128', // length: 114 (57 short)\n//   symoffsets: '128 - 248', // length: 120 (60 short)\n//   stringtable: '248 - 612', // length: 364\n//   sym: '612 - 928' } // length: 316\n//\n// How lastStrTableOffset works:\n//   data.length - h.lastStrTableOffset === 248\n//     (sym-offset end, string-table start)\n//   364 + 316 === 680 (lastStrTableOffset)\n// How strTableSize works:\n//   h.strCount + [symOffsetCount] === h.strTableSize\n//   57 + 60 === 117 (strTableSize)\n//   symOffsetCount doesn't actually exist in the header. it's just implied.\n// Getting the number of sym offsets:\n//   h.symOffsetCount = h.strTableSize - h.strCount;\n//   h.symOffsetSize = (h.strTableSize - h.strCount) * 2;\n\nTput.prototype.parseExtended = function(data) {\n  var info = {}\n    , l = data.length\n    , i = 0;\n\n  var h = info.header = {\n    dataSize: data.length,\n    headerSize: 10,\n    boolCount: (data[i + 1] << 8) | data[i + 0],\n    numCount: (data[i + 3] << 8) | data[i + 2],\n    strCount: (data[i + 5] << 8) | data[i + 4],\n    strTableSize: (data[i + 7] << 8) | data[i + 6],\n    lastStrTableOffset: (data[i + 9] << 8) | data[i + 8]\n  };\n\n  // h.symOffsetCount = h.strTableSize - h.strCount;\n\n  h.total = h.headerSize\n    + h.boolCount\n    + h.numCount * 2\n    + h.strCount * 2\n    + h.strTableSize;\n\n  i += h.headerSize;\n\n  // Booleans Section\n  // One byte for each flag\n  var _bools = [];\n  l = i + h.boolCount;\n  for (; i < l; i++) {\n    _bools.push(data[i] === 1);\n  }\n\n  // Null byte in between to make sure numbers begin on an even byte.\n  if (i % 2) {\n    assert.equal(data[i], 0);\n    i++;\n  }\n\n  // Numbers Section\n  var _numbers = [];\n  l = i + h.numCount * 2;\n  for (; i < l; i += 2) {\n    if (data[i + 1] === 0xff && data[i] === 0xff) {\n      _numbers.push(-1);\n    } else {\n      _numbers.push((data[i + 1] << 8) | data[i]);\n    }\n  }\n\n  // Strings Section\n  var _strings = [];\n  l = i + h.strCount * 2;\n  for (; i < l; i += 2) {\n    if (data[i + 1] === 0xff && data[i] === 0xff) {\n      _strings.push(-1);\n    } else {\n      _strings.push((data[i + 1] << 8) | data[i]);\n    }\n  }\n\n  // Pass over the sym offsets and get to the string table.\n  i = data.length - h.lastStrTableOffset;\n  // Might be better to do this instead if the file has trailing bytes:\n  // i += h.symOffsetCount * 2;\n\n  // String Table\n  var high = 0;\n  _strings.forEach(function(offset, k) {\n    if (offset === -1) {\n      _strings[k] = '';\n      return;\n    }\n\n    var s = i + offset\n      , j = s;\n\n    while (data[j]) j++;\n\n    assert(j < data.length);\n\n    // Find out where the string table ends by\n    // getting the highest string length.\n    if (high < j - i) {\n      high = j - i;\n    }\n\n    _strings[k] = data.toString('ascii', s, j);\n  });\n\n  // Symbol Table\n  // Add one to the highest string length because we didn't count \\0.\n  i += high + 1;\n  l = data.length;\n\n  var sym = []\n    , j;\n\n  for (; i < l; i++) {\n    j = i;\n    while (data[j]) j++;\n    sym.push(data.toString('ascii', i, j));\n    i = j;\n  }\n\n  // Identify by name\n  j = 0;\n\n  info.bools = {};\n  _bools.forEach(function(bool) {\n    info.bools[sym[j++]] = bool;\n  });\n\n  info.numbers = {};\n  _numbers.forEach(function(number) {\n    info.numbers[sym[j++]] = number;\n  });\n\n  info.strings = {};\n  _strings.forEach(function(string) {\n    info.strings[sym[j++]] = string;\n  });\n\n  // Should be the very last bit of data.\n  assert.equal(i, data.length);\n\n  return info;\n};\n\nTput.prototype.compileTerminfo = function(term) {\n  return this.compile(this.readTerminfo(term));\n};\n\nTput.prototype.injectTerminfo = function(term) {\n  return this.inject(this.compileTerminfo(term));\n};\n\n/**\n * Compiler - terminfo cap->javascript\n */\n\nTput.prototype.compile = function(info) {\n  var self = this;\n\n  if (!info) {\n    throw new Error('Terminal not found.');\n  }\n\n  this.detectFeatures(info);\n\n  this._debug(info);\n\n  info.all = {};\n  info.methods = {};\n\n  ['bools', 'numbers', 'strings'].forEach(function(type) {\n    Object.keys(info[type]).forEach(function(key) {\n      info.all[key] = info[type][key];\n      info.methods[key] = self._compile(info, key, info.all[key]);\n    });\n  });\n\n  Tput.bools.forEach(function(key) {\n    if (info.methods[key] == null) info.methods[key] = false;\n  });\n\n  Tput.numbers.forEach(function(key) {\n    if (info.methods[key] == null) info.methods[key] = -1;\n  });\n\n  Tput.strings.forEach(function(key) {\n    if (!info.methods[key]) info.methods[key] = noop;\n  });\n\n  Object.keys(info.methods).forEach(function(key) {\n    if (!Tput.alias[key]) return;\n    Tput.alias[key].forEach(function(alias) {\n      info.methods[alias] = info.methods[key];\n    });\n    // Could just use:\n    // Object.keys(Tput.aliasMap).forEach(function(key) {\n    //   info.methods[key] = info.methods[Tput.aliasMap[key]];\n    // });\n  });\n\n  return info;\n};\n\nTput.prototype.inject = function(info) {\n  var self = this\n    , methods = info.methods || info;\n\n  Object.keys(methods).forEach(function(key) {\n    if (typeof methods[key] !== 'function') {\n      self[key] = methods[key];\n      return;\n    }\n    self[key] = function() {\n      var args = Array.prototype.slice.call(arguments);\n      return methods[key].call(self, args);\n    };\n  });\n\n  this.info = info;\n  this.all = info.all;\n  this.methods = info.methods;\n  this.bools = info.bools;\n  this.numbers = info.numbers;\n  this.strings = info.strings;\n\n  if (!~info.names.indexOf(this.terminal)) {\n    this.terminal = info.name;\n  }\n\n  this.features = info.features;\n  Object.keys(info.features).forEach(function(key) {\n    if (key === 'padding') {\n      if (!info.features.padding && self.options.padding !== true) {\n        self.padding = false;\n      }\n      return;\n    }\n    self[key] = info.features[key];\n  });\n};\n\n// See:\n// ~/ncurses/ncurses/tinfo/lib_tparm.c\n// ~/ncurses/ncurses/tinfo/comp_scan.c\nTput.prototype._compile = function(info, key, str) {\n  var v;\n\n  this._debug('Compiling %s: %s', key, JSON.stringify(str));\n\n  switch (typeof str) {\n    case 'boolean':\n      return str;\n    case 'number':\n      return str;\n    case 'string':\n      break;\n    default:\n      return noop;\n  }\n\n  if (!str) {\n    return noop;\n  }\n\n  // See:\n  // ~/ncurses/progs/tput.c - tput() - L149\n  // ~/ncurses/progs/tset.c - set_init() - L992\n  if (key === 'init_file' || key === 'reset_file') {\n    try {\n      str = fs.readFileSync(str, 'utf8');\n      if (this.debug) {\n        v = ('return ' + JSON.stringify(str) + ';')\n          .replace(/\\x1b/g, '\\\\x1b')\n          .replace(/\\r/g, '\\\\r')\n          .replace(/\\n/g, '\\\\n');\n        process.stdout.write(v + '\\n');\n      }\n      return function() { return str; };\n    } catch (e) {\n      return noop;\n    }\n  }\n\n  var tkey = info.name + '.' + key\n    , header = 'var v, dyn = {}, stat = {}, stack = [], out = [];'\n    , footer = ';return out.join(\"\");'\n    , code = header\n    , val = str\n    , buff = ''\n    , cap\n    , ch\n    , fi\n    , then\n    , els\n    , end;\n\n  function read(regex, no) {\n    cap = regex.exec(val);\n    if (!cap) return;\n    val = val.substring(cap[0].length);\n    ch = cap[1];\n    if (!no) clear();\n    return cap;\n  }\n\n  function stmt(c) {\n    if (code[code.length - 1] === ',') {\n      code = code.slice(0, -1);\n    }\n    code += c;\n  }\n\n  function expr(c) {\n    code += c + ',';\n  }\n\n  function echo(c) {\n    if (c === '\"\"') return;\n    expr('out.push(' + c + ')');\n  }\n\n  function print(c) {\n    buff += c;\n  }\n\n  function clear() {\n    if (buff) {\n      echo(JSON.stringify(buff).replace(/\\\\u00([0-9a-fA-F]{2})/g, '\\\\x$1'));\n      buff = '';\n    }\n  }\n\n  while (val) {\n    // Ignore newlines\n    if (read(/^\\n /, true)) {\n      continue;\n    }\n\n    // '^A' -> ^A\n    if (read(/^\\^(.)/i, true)) {\n      if (!(ch >= ' ' && ch <= '~')) {\n        this._debug('%s: bad caret char.', tkey);\n        // NOTE: ncurses appears to simply\n        // continue in this situation, but\n        // I could be wrong.\n        print(cap[0]);\n        continue;\n      }\n      if (ch === '?') {\n        ch = '\\x7f';\n      } else {\n        ch = ch.charCodeAt(0) & 31;\n        if (ch === 0) ch = 128;\n        ch = String.fromCharCode(ch);\n      }\n      print(ch);\n      continue;\n    }\n\n    // 3 octal digits -> character\n    if (read(/^\\\\([0-7]{3})/, true)) {\n      print(String.fromCharCode(parseInt(ch, 8)));\n      continue;\n    }\n\n    // '\\e' -> ^[\n    // '\\n' -> \\n\n    // '\\r' -> \\r\n    // '\\0' -> \\200 (special case)\n    if (read(/^\\\\([eEnlrtbfs\\^\\\\,:0]|.)/, true)) {\n      switch (ch) {\n        case 'e':\n        case 'E':\n          ch = '\\x1b';\n          break;\n        case 'n':\n          ch = '\\n';\n          break;\n        case 'l':\n          ch = '\\x85';\n          break;\n        case 'r':\n          ch = '\\r';\n          break;\n        case 't':\n          ch = '\\t';\n          break;\n        case 'b':\n          ch = '\\x08';\n          break;\n        case 'f':\n          ch = '\\x0c';\n          break;\n        case 's':\n          ch = ' ';\n          break;\n        case '^':\n          ch = '^';\n          break;\n        case '\\\\':\n          ch = '\\\\';\n          break;\n        case ',':\n          ch = ',';\n          break;\n        case ':':\n          ch = ':';\n          break;\n        case '0':\n          ch = '\\x80';\n          break;\n        case 'a':\n          ch = '\\x07';\n          break;\n        default:\n          this._debug('%s: bad backslash char.', tkey);\n          ch = cap[0];\n          break;\n      }\n      print(ch);\n      continue;\n    }\n\n    // $<5> -> padding\n    // e.g. flash_screen: '\\u001b[?5h$<100/>\\u001b[?5l',\n    if (read(/^\\$<(\\d+)([*\\/]{0,2})>/, true)) {\n      if (this.padding) print(cap[0]);\n      continue;\n    }\n\n    // %%   outputs `%'\n    if (read(/^%%/, true)) {\n      print('%');\n      continue;\n    }\n\n    // %[[:]flags][width[.precision]][doxXs]\n    //   as in printf, flags are [-+#] and space.  Use a `:' to allow the\n    //   next character to be a `-' flag, avoiding interpreting \"%-\" as an\n    //   operator.\n    // %c   print pop() like %c in printf\n    // Example from screen terminfo:\n    //   S0: \"\\u001b(%p1%c\"\n    // %d   print pop()\n    // \"Print (e.g., \"%d\") is a special case.\"\n    // %s   print pop() like %s in printf\n    if (read(/^%((?::-|[+# ]){1,4})?(\\d+(?:\\.\\d+)?)?([doxXsc])/)) {\n      if (this.printf || cap[1] || cap[2] || ~'oxX'.indexOf(cap[3])) {\n        echo('sprintf(\"'+ cap[0].replace(':-', '-') + '\", stack.pop())');\n      } else if (cap[3] === 'c') {\n        echo('(v = stack.pop(), isFinite(v) '\n          + '? String.fromCharCode(v || 0200) : \"\")');\n      } else {\n        echo('stack.pop()');\n      }\n      continue;\n    }\n\n    // %p[1-9]\n    //   push i'th parameter\n    if (read(/^%p([1-9])/)) {\n      expr('(stack.push(v = params[' + (ch - 1) + ']), v)');\n      continue;\n    }\n\n    // %P[a-z]\n    //   set dynamic variable [a-z] to pop()\n    if (read(/^%P([a-z])/)) {\n      expr('dyn.' + ch + ' = stack.pop()');\n      continue;\n    }\n\n    // %g[a-z]\n    //   get dynamic variable [a-z] and push it\n    if (read(/^%g([a-z])/)) {\n      expr('(stack.push(dyn.' + ch + '), dyn.' + ch + ')');\n      continue;\n    }\n\n    // %P[A-Z]\n    //   set static variable [a-z] to pop()\n    if (read(/^%P([A-Z])/)) {\n      expr('stat.' + ch + ' = stack.pop()');\n      continue;\n    }\n\n    // %g[A-Z]\n    //   get static variable [a-z] and push it\n    //   The  terms  \"static\"  and  \"dynamic\" are misleading.  Historically,\n    //   these are simply two different sets of variables, whose values are\n    //   not reset between calls to tparm.  However, that fact is not\n    //   documented in other implementations.  Relying on it will adversely\n    //   impact portability to other implementations.\n    if (read(/^%g([A-Z])/)) {\n      expr('(stack.push(v = stat.' + ch + '), v)');\n      continue;\n    }\n\n    // %'c' char constant c\n    // NOTE: These are stored as c chars, exemplified by:\n    // cursor_address: \"\\u001b=%p1%' '%+%c%p2%' '%+%c\"\n    if (read(/^%'(.)'/)) {\n      expr('(stack.push(v = ' + ch.charCodeAt(0) + '), v)');\n      continue;\n    }\n\n    // %{nn}\n    //   integer constant nn\n    if (read(/^%\\{(\\d+)\\}/)) {\n      expr('(stack.push(v = ' + ch + '), v)');\n      continue;\n    }\n\n    // %l   push strlen(pop)\n    if (read(/^%l/)) {\n      expr('(stack.push(v = (stack.pop() || \"\").length || 0), v)');\n      continue;\n    }\n\n    // %+ %- %* %/ %m\n    //   arithmetic (%m is mod): push(pop() op pop())\n    // %& %| %^\n    //   bit operations (AND, OR and exclusive-OR): push(pop() op pop())\n    // %= %> %<\n    //   logical operations: push(pop() op pop())\n    if (read(/^%([+\\-*\\/m&|\\^=><])/)) {\n      if (ch === '=') ch = '===';\n      else if (ch === 'm') ch = '%';\n      expr('(v = stack.pop(),'\n        + ' stack.push(v = (stack.pop() ' + ch + ' v) || 0),'\n        + ' v)');\n      continue;\n    }\n\n    // %A, %O\n    //   logical AND and OR operations (for conditionals)\n    if (read(/^%([AO])/)) {\n      // Are we supposed to store the result on the stack?\n      expr('(stack.push(v = (stack.pop() '\n        + (ch === 'A' ? '&&' : '||')\n        + ' stack.pop())), v)');\n      continue;\n    }\n\n    // %! %~\n    //   unary operations (logical and bit complement): push(op pop())\n    if (read(/^%([!~])/)) {\n      expr('(stack.push(v = ' + ch + 'stack.pop()), v)');\n      continue;\n    }\n\n    // %i   add 1 to first two parameters (for ANSI terminals)\n    if (read(/^%i/)) {\n      // Are these supposed to go on the stack in certain situations?\n      // ncurses doesn't seem to put them on the stack, but xterm.user6\n      // seems to assume they're on the stack for some reason. Could\n      // just be a bad terminfo string.\n      // user6: \"\\u001b[%i%d;%dR\" - possibly a termcap-style string.\n      // expr('(params[0] |= 0, params[1] |= 0, params[0]++, params[1]++)');\n      expr('(params[0]++, params[1]++)');\n      continue;\n    }\n\n    // %? expr %t thenpart %e elsepart %;\n    //   This forms an if-then-else.  The %e elsepart is optional.  Usually\n    //   the %? expr part pushes a value onto the stack, and %t pops it from\n    //   the stack, testing if it is nonzero (true).  If it is zero (false),\n    //   control passes to the %e (else) part.\n    //   It is possible to form else-if's a la Algol 68:\n    //     %? c1 %t b1 %e c2 %t b2 %e c3 %t b3 %e c4 %t b4 %e %;\n    //   where ci are conditions, bi are bodies.\n    if (read(/^%\\?/)) {\n      end = -1;\n      stmt(';if (');\n      continue;\n    }\n\n    if (read(/^%t/)) {\n      end = -1;\n      // Technically this is supposed to pop everything off the stack that was\n      // pushed onto the stack after the if statement, see man terminfo.\n      // Right now, we don't pop anything off. This could cause compat issues.\n      // Perhaps implement a \"pushed\" counter from the time the if statement\n      // is added, to the time the then statement is added, and pop off\n      // the appropriate number of elements.\n      // while (pushed--) expr('stack.pop()');\n      stmt(') {');\n      continue;\n    }\n\n    // Terminfo does elseif's like\n    // this: %?[expr]%t...%e[expr]%t...%;\n    if (read(/^%e/)) {\n      fi = val.indexOf('%?');\n      then = val.indexOf('%t');\n      els = val.indexOf('%e');\n      end = val.indexOf('%;');\n      if (end === -1) end = Infinity;\n      if (then !== -1 && then < end\n          && (fi === -1 || then < fi)\n          && (els === -1 || then < els)) {\n        stmt('} else if (');\n      } else {\n        stmt('} else {');\n      }\n      continue;\n    }\n\n    if (read(/^%;/)) {\n      end = null;\n      stmt('}');\n      continue;\n    }\n\n    buff += val[0];\n    val = val.substring(1);\n  }\n\n  // Clear the buffer of any remaining text.\n  clear();\n\n  // Some terminfos (I'm looking at you, atari-color), don't end an if\n  // statement. It's assumed terminfo will automatically end it for\n  // them, because they are a bunch of lazy bastards.\n  if (end != null) {\n    stmt('}');\n  }\n\n  // Add the footer.\n  stmt(footer);\n\n  // Optimize and cleanup generated code.\n  v = code.slice(header.length, -footer.length);\n  if (!v.length) {\n    code = 'return \"\";';\n  } else if (v = /^out\\.push\\((\"(?:[^\"]|\\\\\")+\")\\)$/.exec(v)) {\n    code = 'return ' + v[1] + ';';\n  } else {\n    // Turn `(stack.push(v = params[0]), v),out.push(stack.pop())`\n    // into `out.push(params[0])`.\n    code = code.replace(\n      /\\(stack\\.push\\(v = params\\[(\\d+)\\]\\), v\\),out\\.push\\(stack\\.pop\\(\\)\\)/g,\n      'out.push(params[$1])');\n\n    // Remove unnecessary variable initializations.\n    v = code.slice(header.length, -footer.length);\n    if (!~v.indexOf('v = ')) code = code.replace('v, ', '');\n    if (!~v.indexOf('dyn')) code = code.replace('dyn = {}, ', '');\n    if (!~v.indexOf('stat')) code = code.replace('stat = {}, ', '');\n    if (!~v.indexOf('stack')) code = code.replace('stack = [], ', '');\n\n    // Turn `var out = [];out.push(\"foo\"),` into `var out = [\"foo\"];`.\n    code = code.replace(\n      /out = \\[\\];out\\.push\\((\"(?:[^\"]|\\\\\")+\")\\),/,\n      'out = [$1];');\n  }\n\n  // Terminfos `wyse350-vb`, and `wy350-w`\n  // seem to have a few broken strings.\n  if (str === '\\u001b%?') {\n    code = 'return \"\\\\x1b\";';\n  }\n\n  if (this.debug) {\n    v = code\n      .replace(/\\x1b/g, '\\\\x1b')\n      .replace(/\\r/g, '\\\\r')\n      .replace(/\\n/g, '\\\\n');\n    process.stdout.write(v + '\\n');\n  }\n\n  try {\n    if (this.options.stringify && code.indexOf('return ') === 0) {\n      return new Function('', code)();\n    }\n    return this.printf || ~code.indexOf('sprintf(')\n      ? new Function('sprintf, params', code).bind(null, sprintf)\n      : new Function('params', code);\n  } catch (e) {\n    console.error('');\n    console.error('Error on %s:', tkey);\n    console.error(JSON.stringify(str));\n    console.error('');\n    console.error(code.replace(/(,|;)/g, '$1\\n'));\n    e.stack = e.stack.replace(/\\x1b/g, '\\\\x1b');\n    throw e;\n  }\n};\n\n// See: ~/ncurses/ncurses/tinfo/lib_tputs.c\nTput.prototype._print = function(code, print, done) {\n  var xon = !this.bools.needs_xon_xoff || this.bools.xon_xoff;\n\n  print = print || write;\n  done = done || noop;\n\n  if (!this.padding) {\n    print(code);\n    return done();\n  }\n\n  var parts = code.split(/(?=\\$<[\\d.]+[*\\/]{0,2}>)/)\n    , i = 0;\n\n  (function next() {\n    if (i === parts.length) {\n      return done();\n    }\n\n    var part = parts[i++]\n      , padding = /^\\$<([\\d.]+)([*\\/]{0,2})>/.exec(part)\n      , amount\n      , suffix;\n      // , affect;\n\n    if (!padding) {\n      print(part);\n      return next();\n    }\n\n    part = part.substring(padding[0].length);\n    amount = +padding[1];\n    suffix = padding[2];\n\n    // A `/'  suffix indicates  that  the  padding  is  mandatory and forces a\n    // delay of the given number of milliseconds even on devices for which xon\n    // is present to indicate flow control.\n    if (xon && !~suffix.indexOf('/')) {\n      print(part);\n      return next();\n    }\n\n    // A `*' indicates that the padding required is proportional to the number\n    // of lines affected by the operation, and  the amount  given  is the\n    // per-affected-unit padding required.  (In the case of insert character,\n    // the factor is still the number of lines affected.) Normally, padding is\n    // advisory if the device has the xon capability; it is used for cost\n    // computation but does not trigger delays.\n    if (~suffix.indexOf('*')) {\n      // XXX Disable this for now.\n      amount = amount;\n      // if (affect = /\\x1b\\[(\\d+)[LM]/.exec(part)) {\n      //   amount *= +affect[1];\n      // }\n      // The above is a huge workaround. In reality, we need to compile\n      // `_print` into the string functions and check the cap name and\n      // params.\n      // if (cap === 'insert_line' || cap === 'delete_line') {\n      //   amount *= params[0];\n      // }\n      // if (cap === 'clear_screen') {\n      //   amount *= process.stdout.rows;\n      // }\n    }\n\n    return setTimeout(function() {\n      print(part);\n      return next();\n    }, amount);\n  })();\n};\n\n// A small helper function if we want\n// to easily output text with setTimeouts.\nTput.print = function() {\n  var fake = {\n    padding: true,\n    bools: { needs_xon_xoff: true, xon_xoff: false }\n  };\n  return Tput.prototype._print.apply(fake, arguments);\n};\n\n/**\n * Termcap\n */\n\nTput.cpaths = [\n  process.env.TERMCAP || '',\n  (process.env.TERMPATH || '').split(/[: ]/),\n  (process.env.HOME || '') + '/.termcap',\n  '/usr/share/misc/termcap',\n  '/etc/termcap'\n];\n\nTput.prototype.readTermcap = function(term) {\n  var self = this\n    , terms\n    , term_\n    , root\n    , paths;\n\n  term = term || this.terminal;\n\n  // Termcap has a bunch of terminals usually stored in one file/string,\n  // so we need to find the one containing our desired terminal.\n  if (~term.indexOf(path.sep) && (terms = this._tryCap(path.resolve(term)))) {\n    term_ = path.basename(term).split('.')[0];\n    if (terms[process.env.TERM]) {\n      term = process.env.TERM;\n    } else if (terms[term_]) {\n      term = term_;\n    } else {\n      term = Object.keys(terms)[0];\n    }\n  } else {\n    paths = Tput.cpaths.slice();\n\n    if (this.termcapFile) {\n      paths.unshift(this.termcapFile);\n    }\n\n    paths.push(Tput.termcap);\n\n    terms = this._tryCap(paths, term);\n  }\n\n  if (!terms) {\n    throw new Error('Cannot find termcap for: ' + term);\n  }\n\n  root = terms[term];\n\n  if (this.debug) {\n    this._termcap = terms;\n  }\n\n  (function tc(term) {\n    if (term && term.strings.tc) {\n      root.inherits = root.inherits || [];\n      root.inherits.push(term.strings.tc);\n\n      var names = terms[term.strings.tc]\n        ? terms[term.strings.tc].names\n        : [term.strings.tc];\n\n      self._debug('%s inherits from %s.',\n        term.names.join('/'), names.join('/'));\n\n      var inherit = tc(terms[term.strings.tc]);\n      if (inherit) {\n        ['bools', 'numbers', 'strings'].forEach(function(type) {\n          merge(term[type], inherit[type]);\n        });\n      }\n    }\n    return term;\n  })(root);\n\n  // Translate termcap names to terminfo-style names.\n  root = this.translateTermcap(root);\n\n  return root;\n};\n\nTput.prototype._tryCap = function(file, term) {\n  if (!file) return;\n\n  var terms\n    , data\n    , i;\n\n  if (Array.isArray(file)) {\n    for (i = 0; i < file.length; i++) {\n      data = this._tryCap(file[i], term);\n      if (data) return data;\n    }\n    return;\n  }\n\n  // If the termcap string starts with `/`,\n  // ncurses considers it a filename.\n  data = file[0] === '/'\n    ? tryRead(file)\n    : file;\n\n  if (!data) return;\n\n  terms = this.parseTermcap(data, file);\n\n  if (term && !terms[term]) {\n    return;\n  }\n\n  return terms;\n};\n\n/**\n * Termcap Parser\n *  http://en.wikipedia.org/wiki/Termcap\n *  http://www.gnu.org/software\n *    /termutils/manual/termcap-1.3/html_mono/termcap.html\n *  http://www.gnu.org/software\n *    /termutils/manual/termcap-1.3/html_mono/termcap.html#SEC17\n *  http://tldp.org/HOWTO/Text-Terminal-HOWTO.html#toc16\n *  man termcap\n */\n\n// Example:\n// vt102|dec vt102:\\\n//  :do=^J:co#80:li#24:cl=50\\E[;H\\E[2J:\\\n//  :le=^H:bs:cm=5\\E[%i%d;%dH:nd=2\\E[C:up=2\\E[A:\\\n//  :ce=3\\E[K:cd=50\\E[J:so=2\\E[7m:se=2\\E[m:us=2\\E[4m:ue=2\\E[m:\\\n//  :md=2\\E[1m:mr=2\\E[7m:mb=2\\E[5m:me=2\\E[m:is=\\E[1;24r\\E[24;1H:\\\n//  :rs=\\E>\\E[?3l\\E[?4l\\E[?5l\\E[?7h\\E[?8h:ks=\\E[?1h\\E=:ke=\\E[?1l\\E>:\\\n//  :ku=\\EOA:kd=\\EOB:kr=\\EOC:kl=\\EOD:kb=^H:\\\n//  :ho=\\E[H:k1=\\EOP:k2=\\EOQ:k3=\\EOR:k4=\\EOS:pt:sr=5\\EM:vt#3:\\\n//  :sc=\\E7:rc=\\E8:cs=\\E[%i%d;%dr:vs=\\E[?7l:ve=\\E[?7h:\\\n//  :mi:al=\\E[L:dc=\\E[P:dl=\\E[M:ei=\\E[4l:im=\\E[4h:\n\nTput.prototype.parseTermcap = function(data, file) {\n  var terms = {}\n    , parts\n    , term\n    , entries\n    , fields\n    , field\n    , names\n    , i\n    , j\n    , k;\n\n  // remove escaped newlines\n  data = data.replace(/\\\\\\n[ \\t]*/g, '');\n\n  // remove comments\n  data = data.replace(/^#[^\\n]+/gm, '');\n\n  // split entries\n  entries = data.trim().split(/\\n+/);\n\n  for (i = 0; i < entries.length; i++) {\n    fields = entries[i].split(/:+/);\n    for (j = 0; j < fields.length; j++) {\n      field = fields[j].trim();\n      if (!field) continue;\n\n      if (j === 0) {\n        names = field.split('|');\n        term = {\n          name: names[0],\n          names: names,\n          desc: names.pop(),\n          file: ~file.indexOf(path.sep)\n            ? path.resolve(file)\n            : file,\n          termcap: true\n        };\n\n        for (k = 0; k < names.length; k++) {\n          terms[names[k]] = term;\n        }\n\n        term.bools = {};\n        term.numbers = {};\n        term.strings = {};\n\n        continue;\n      }\n\n      if (~field.indexOf('=')) {\n        parts = field.split('=');\n        term.strings[parts[0]] = parts.slice(1).join('=');\n      } else if (~field.indexOf('#')) {\n        parts = field.split('#');\n        term.numbers[parts[0]] = +parts.slice(1).join('#');\n      } else {\n        term.bools[field] = true;\n      }\n    }\n  }\n\n  return terms;\n};\n\n/**\n * Termcap Compiler\n *  man termcap\n */\n\nTput.prototype.translateTermcap = function(info) {\n  var self = this\n    , out = {};\n\n  if (!info) return;\n\n  this._debug(info);\n\n  ['name', 'names', 'desc', 'file', 'termcap'].forEach(function(key) {\n    out[key] = info[key];\n  });\n\n  // Separate aliases for termcap\n  var map = (function() {\n    var out = {};\n\n    Object.keys(Tput.alias).forEach(function(key) {\n      var aliases = Tput.alias[key];\n      out[aliases.termcap] = key;\n    });\n\n    return out;\n  })();\n\n  // Translate termcap cap names to terminfo cap names.\n  // e.g. `up` -> `cursor_up`\n  ['bools', 'numbers', 'strings'].forEach(function(key) {\n    out[key] = {};\n    Object.keys(info[key]).forEach(function(cap) {\n      if (key === 'strings') {\n        info.strings[cap] = self._captoinfo(cap, info.strings[cap], 1);\n      }\n      if (map[cap]) {\n        out[key][map[cap]] = info[key][cap];\n      } else {\n        // NOTE: Possibly include all termcap names\n        // in a separate alias.js file. Some are\n        // missing from the terminfo alias.js file\n        // which is why we have to do this:\n        // See: $ man termcap\n        out[key][cap] = info[key][cap];\n      }\n    });\n  });\n\n  return out;\n};\n\nTput.prototype.compileTermcap = function(term) {\n  return this.compile(this.readTermcap(term));\n};\n\nTput.prototype.injectTermcap = function(term) {\n  return this.inject(this.compileTermcap(term));\n};\n\n/**\n * _nc_captoinfo - ported to javascript directly from ncurses.\n * Copyright (c) 1998-2009,2010 Free Software Foundation, Inc.\n * See: ~/ncurses/ncurses/tinfo/captoinfo.c\n *\n * Convert a termcap string to terminfo format.\n * 'cap' is the relevant terminfo capability index.\n * 's' is the string value of the capability.\n * 'parameterized' tells what type of translations to do:\n *    % translations if 1\n *    pad translations if >=0\n */\n\nTput.prototype._captoinfo = function(cap, s, parameterized) {\n  var self = this;\n\n  var capstart;\n\n  if (parameterized == null) {\n    parameterized = 0;\n  }\n\n  var MAX_PUSHED = 16\n    , stack = [];\n\n  var stackptr = 0\n    , onstack = 0\n    , seenm = 0\n    , seenn = 0\n    , seenr = 0\n    , param = 1\n    , i = 0\n    , out = '';\n\n  function warn() {\n    var args = Array.prototype.slice.call(arguments);\n    args[0] = 'captoinfo: ' + (args[0] || '');\n    return self._debug.apply(self, args);\n  }\n\n  function isdigit(ch) {\n    return ch >= '0' && ch <= '9';\n  }\n\n  function isgraph(ch) {\n    return ch > ' ' && ch <= '~';\n  }\n\n  // convert a character to a terminfo push\n  function cvtchar(sp) {\n    var c = '\\0'\n      , len;\n\n    var j = i;\n\n    switch (sp[j]) {\n      case '\\\\':\n        switch (sp[++j]) {\n          case '\\'':\n          case '$':\n          case '\\\\':\n          case '%':\n            c = sp[j];\n            len = 2;\n            break;\n          case '\\0':\n            c = '\\\\';\n            len = 1;\n            break;\n          case '0':\n          case '1':\n          case '2':\n          case '3':\n            len = 1;\n            while (isdigit(sp[j])) {\n              c = String.fromCharCode(8 * c.charCodeAt(0)\n                + (sp[j++].charCodeAt(0) - '0'.charCodeAt(0)));\n              len++;\n            }\n            break;\n          default:\n            c = sp[j];\n            len = 2;\n            break;\n        }\n        break;\n      case '^':\n        c = String.fromCharCode(sp[++j].charCodeAt(0) & 0x1f);\n        len = 2;\n        break;\n      default:\n        c = sp[j];\n        len = 1;\n    }\n    if (isgraph(c) && c !== ',' && c !== '\\'' && c !== '\\\\' && c !== ':') {\n      out += '%\\'';\n      out += c;\n      out += '\\'';\n    } else {\n      out += '%{';\n      if (c.charCodeAt(0) > 99) {\n        out += String.fromCharCode(\n          (c.charCodeAt(0) / 100 | 0) + '0'.charCodeAt(0));\n      }\n      if (c.charCodeAt(0) > 9) {\n        out += String.fromCharCode(\n          (c.charCodeAt(0) / 10 | 0) % 10 + '0'.charCodeAt(0));\n      }\n      out += String.fromCharCode(\n        c.charCodeAt(0) % 10 + '0'.charCodeAt(0));\n      out += '}';\n    }\n\n    return len;\n  }\n\n  // push n copies of param on the terminfo stack if not already there\n  function getparm(parm, n) {\n    if (seenr) {\n      if (parm === 1) {\n        parm = 2;\n      } else if (parm === 2) {\n        parm = 1;\n      }\n    }\n\n    if (onstack === parm) {\n      if (n > 1) {\n        warn('string may not be optimal');\n        out += '%Pa';\n        while (n--) {\n          out += '%ga';\n        }\n      }\n      return;\n    }\n\n    if (onstack !== 0) {\n      push();\n    }\n\n    onstack = parm;\n\n    while (n--) {\n      out += '%p';\n      out += String.fromCharCode('0'.charCodeAt(0) + parm);\n    }\n\n    if (seenn && parm < 3) {\n      out += '%{96}%^';\n    }\n\n    if (seenm && parm < 3) {\n      out += '%{127}%^';\n    }\n  }\n\n  // push onstack on to the stack\n  function push() {\n    if (stackptr >= MAX_PUSHED) {\n      warn('string too complex to convert');\n    } else {\n      stack[stackptr++] = onstack;\n    }\n  }\n\n  // pop the top of the stack into onstack\n  function pop() {\n    if (stackptr === 0) {\n      if (onstack === 0) {\n        warn('I\\'m confused');\n      } else {\n        onstack = 0;\n      }\n    } else {\n      onstack = stack[--stackptr];\n    }\n    param++;\n  }\n\n  function see03() {\n    getparm(param, 1);\n    out += '%3d';\n    pop();\n  }\n\n  function invalid() {\n    out += '%';\n    i--;\n    warn('unknown %% code %s (%#x) in %s',\n      JSON.stringify(s[i]), s[i].charCodeAt(0), cap);\n  }\n\n  // skip the initial padding (if we haven't been told not to)\n  capstart = null;\n  if (s == null) s = '';\n\n  if (parameterized >= 0 && isdigit(s[i])) {\n    for (capstart = i;; i++) {\n      if (!(isdigit(s[i]) || s[i] === '*' || s[i] === '.')) {\n        break;\n      }\n    }\n  }\n\n  while (s[i]) {\n    switch (s[i]) {\n      case '%':\n        i++;\n        if (parameterized < 1) {\n          out += '%';\n          break;\n        }\n        switch (s[i++]) {\n          case '%':\n            out += '%';\n            break;\n          case 'r':\n            if (seenr++ === 1) {\n              warn('saw %%r twice in %s', cap);\n            }\n            break;\n          case 'm':\n            if (seenm++ === 1) {\n              warn('saw %%m twice in %s', cap);\n            }\n            break;\n          case 'n':\n            if (seenn++ === 1) {\n              warn('saw %%n twice in %s', cap);\n            }\n            break;\n          case 'i':\n            out += '%i';\n            break;\n          case '6':\n          case 'B':\n            getparm(param, 1);\n            out += '%{10}%/%{16}%*';\n            getparm(param, 1);\n            out += '%{10}%m%+';\n            break;\n          case '8':\n          case 'D':\n            getparm(param, 2);\n            out += '%{2}%*%-';\n            break;\n          case '>':\n            getparm(param, 2);\n            // %?%{x}%>%t%{y}%+%;\n            out += '%?';\n            i += cvtchar(s);\n            out += '%>%t';\n            i += cvtchar(s);\n            out += '%+%;';\n            break;\n          case 'a':\n            if ((s[i] === '=' || s[i] === '+' || s[i] === '-'\n                || s[i] === '*' || s[i] === '/')\n                && (s[i + 1] === 'p' || s[i + 1] === 'c')\n                && s[i + 2] !== '\\0' && s[i + 2]) {\n              var l;\n              l = 2;\n              if (s[i] !== '=') {\n                getparm(param, 1);\n              }\n              if (s[i + 1] === 'p') {\n                getparm(param + s[i + 2].charCodeAt(0) - '@'.charCodeAt(0), 1);\n                if (param !== onstack) {\n                  pop();\n                  param--;\n                }\n                l++;\n              } else {\n                i += 2, l += cvtchar(s), i -= 2;\n              }\n              switch (s[i]) {\n                case '+':\n                  out += '%+';\n                  break;\n                case '-':\n                  out += '%-';\n                  break;\n                case '*':\n                  out += '%*';\n                  break;\n                case '/':\n                  out += '%/';\n                  break;\n                case '=':\n                  if (seenr) {\n                    if (param === 1) {\n                      onstack = 2;\n                    } else if (param === 2) {\n                      onstack = 1;\n                    } else {\n                      onstack = param;\n                    }\n                  } else {\n                    onstack = param;\n                  }\n                  break;\n              }\n              i += l;\n              break;\n            }\n            getparm(param, 1);\n            i += cvtchar(s);\n            out += '%+';\n            break;\n          case '+':\n            getparm(param, 1);\n            i += cvtchar(s);\n            out += '%+%c';\n            pop();\n            break;\n          case 's':\n// #ifdef WATERLOO\n//          i += cvtchar(s);\n//          getparm(param, 1);\n//          out += '%-';\n// #else\n            getparm(param, 1);\n            out += '%s';\n            pop();\n// #endif /* WATERLOO */\n            break;\n          case '-':\n            i += cvtchar(s);\n            getparm(param, 1);\n            out += '%-%c';\n            pop();\n            break;\n          case '.':\n            getparm(param, 1);\n            out += '%c';\n            pop();\n            break;\n          case '0': // not clear any of the historical termcaps did this\n            if (s[i] === '3') {\n              see03(); // goto\n              break;\n            } else if (s[i] !== '2') {\n              invalid(); // goto\n              break;\n            }\n            // FALLTHRU\n          case '2':\n            getparm(param, 1);\n            out += '%2d';\n            pop();\n            break;\n          case '3':\n            see03();\n            break;\n          case 'd':\n            getparm(param, 1);\n            out += '%d';\n            pop();\n            break;\n          case 'f':\n            param++;\n            break;\n          case 'b':\n            param--;\n            break;\n          case '\\\\':\n            out += '%\\\\';\n            break;\n          default:\n            invalid();\n            break;\n        }\n        break;\n// #ifdef REVISIBILIZE\n//    case '\\\\':\n//      out += s[i++];\n//      out += s[i++];\n//      break;\n//    case '\\n':\n//      out += '\\\\n';\n//      i++;\n//      break;\n//    case '\\t':\n//      out += '\\\\t';\n//      i++;\n//      break;\n//    case '\\r':\n//      out += '\\\\r';\n//      i++;\n//      break;\n//    case '\\200':\n//      out += '\\\\0';\n//      i++;\n//      break;\n//    case '\\f':\n//      out += '\\\\f';\n//      i++;\n//      break;\n//    case '\\b':\n//      out += '\\\\b';\n//      i++;\n//      break;\n//    case ' ':\n//      out += '\\\\s';\n//      i++;\n//      break;\n//    case '^':\n//      out += '\\\\^';\n//      i++;\n//      break;\n//    case ':':\n//      out += '\\\\:';\n//      i++;\n//      break;\n//    case ',':\n//      out += '\\\\,';\n//      i++;\n//      break;\n//    default:\n//      if (s[i] === '\\033') {\n//        out += '\\\\E';\n//        i++;\n//      } else if (s[i].charCodeAt(0) > 0 && s[i].charCodeAt(0) < 32) {\n//        out += '^';\n//        out += String.fromCharCode(s[i].charCodeAt(0) + '@'.charCodeAt(0));\n//        i++;\n//      } else if (s[i].charCodeAt(0) <= 0 || s[i].charCodeAt(0) >= 127) {\n//        out += '\\\\';\n//        out += String.fromCharCode(\n//          ((s[i].charCodeAt(0) & 0300) >> 6) + '0'.charCodeAt(0));\n//        out += String.fromCharCode(\n//          ((s[i].charCodeAt(0) & 0070) >> 3) + '0'.charCodeAt(0));\n//        out += String.fromCharCode(\n//          (s[i].charCodeAt(0) & 0007) + '0'.charCodeAt(0));\n//        i++;\n//      } else {\n//        out += s[i++];\n//      }\n//      break;\n// #else\n      default:\n        out += s[i++];\n        break;\n// #endif\n    }\n  }\n\n  // Now, if we stripped off some leading padding, add it at the end\n  // of the string as mandatory padding.\n  if (capstart != null) {\n    out += '$<';\n    for (i = capstart;; i++) {\n      if (isdigit(s[i]) || s[i] === '*' || s[i] === '.') {\n        out += s[i];\n      } else {\n        break;\n      }\n    }\n    out += '/>';\n  }\n\n  if (s !== out) {\n    warn('Translating %s from %s to %s.',\n      cap, JSON.stringify(s), JSON.stringify(out));\n  }\n\n  return out;\n};\n\n/**\n * Compile All Terminfo\n */\n\nTput.prototype.getAll = function() {\n  var dir = this._prefix()\n    , list = asort(fs.readdirSync(dir))\n    , infos = [];\n\n  list.forEach(function(letter) {\n    var terms = asort(fs.readdirSync(path.resolve(dir, letter)));\n    infos.push.apply(infos, terms);\n  });\n\n  function asort(obj) {\n    return obj.sort(function(a, b) {\n      a = a.toLowerCase().charCodeAt(0);\n      b = b.toLowerCase().charCodeAt(0);\n      return a - b;\n    });\n  }\n\n  return infos;\n};\n\nTput.prototype.compileAll = function(start) {\n  var self = this\n    , all = {};\n\n  this.getAll().forEach(function(name) {\n    if (start && name !== start) {\n      return;\n    } else {\n      start = null;\n    }\n    all[name] = self.compileTerminfo(name);\n  });\n\n  return all;\n};\n\n/**\n * Detect Features / Quirks\n */\n\nTput.prototype.detectFeatures = function(info) {\n  var data = this.parseACS(info);\n  info.features = {\n    unicode: this.detectUnicode(info),\n    brokenACS: this.detectBrokenACS(info),\n    PCRomSet: this.detectPCRomSet(info),\n    magicCookie: this.detectMagicCookie(info),\n    padding: this.detectPadding(info),\n    setbuf: this.detectSetbuf(info),\n    acsc: data.acsc,\n    acscr: data.acscr\n  };\n  return info.features;\n};\n\nTput.prototype.detectUnicode = function() {\n  if (process.env.NCURSES_FORCE_UNICODE != null) {\n    return !!+process.env.NCURSES_FORCE_UNICODE;\n  }\n\n  if (this.options.forceUnicode != null) {\n    return this.options.forceUnicode;\n  }\n\n  var LANG = process.env.LANG\n    + ':' + process.env.LANGUAGE\n    + ':' + process.env.LC_ALL\n    + ':' + process.env.LC_CTYPE;\n\n  return /utf-?8/i.test(LANG) || (this.GetConsoleCP() === 65001);\n};\n\n// For some reason TERM=linux has smacs/rmacs, but it maps to `^[[11m`\n// and it does not switch to the DEC SCLD character set. What the hell?\n// xterm: \\x1b(0, screen: \\x0e, linux: \\x1b[11m (doesn't work)\n// `man console_codes` says:\n// 11  select null mapping, set display control flag, reset tog‐\n//     gle meta flag (ECMA-48 says \"first alternate font\").\n// See ncurses:\n// ~/ncurses/ncurses/base/lib_set_term.c\n// ~/ncurses/ncurses/tinfo/lib_acs.c\n// ~/ncurses/ncurses/tinfo/tinfo_driver.c\n// ~/ncurses/ncurses/tinfo/lib_setup.c\nTput.prototype.detectBrokenACS = function(info) {\n  // ncurses-compatible env variable.\n  if (process.env.NCURSES_NO_UTF8_ACS != null) {\n    return !!+process.env.NCURSES_NO_UTF8_ACS;\n  }\n\n  // If the terminal supports unicode, we don't need ACS.\n  if (info.numbers.U8 >= 0) {\n    return !!info.numbers.U8;\n  }\n\n  // The linux console is just broken for some reason.\n  // Apparently the Linux console does not support ACS,\n  // but it does support the PC ROM character set.\n  if (info.name === 'linux') {\n    return true;\n  }\n\n  // PC alternate charset\n  // if (acsc.indexOf('+\\x10,\\x11-\\x18.\\x190') === 0) {\n  if (this.detectPCRomSet(info)) {\n    return true;\n  }\n\n  // screen termcap is bugged?\n  if (this.termcap\n      && info.name.indexOf('screen') === 0\n      && process.env.TERMCAP\n      && ~process.env.TERMCAP.indexOf('screen')\n      && ~process.env.TERMCAP.indexOf('hhII00')) {\n    if (~info.strings.enter_alt_charset_mode.indexOf('\\x0e')\n        || ~info.strings.enter_alt_charset_mode.indexOf('\\x0f')\n        || ~info.strings.set_attributes.indexOf('\\x0e')\n        || ~info.strings.set_attributes.indexOf('\\x0f')) {\n      return true;\n    }\n  }\n\n  return false;\n};\n\n// If enter_pc_charset is the same as enter_alt_charset,\n// the terminal does not support SCLD as ACS.\n// See: ~/ncurses/ncurses/tinfo/lib_acs.c\nTput.prototype.detectPCRomSet = function(info) {\n  var s = info.strings;\n  if (s.enter_pc_charset_mode && s.enter_alt_charset_mode\n      && s.enter_pc_charset_mode === s.enter_alt_charset_mode\n      && s.exit_pc_charset_mode === s.exit_alt_charset_mode) {\n    return true;\n  }\n  return false;\n};\n\nTput.prototype.detectMagicCookie = function() {\n  return process.env.NCURSES_NO_MAGIC_COOKIE == null;\n};\n\nTput.prototype.detectPadding = function() {\n  return process.env.NCURSES_NO_PADDING == null;\n};\n\nTput.prototype.detectSetbuf = function() {\n  return process.env.NCURSES_NO_SETBUF == null;\n};\n\nTput.prototype.parseACS = function(info) {\n  var data = {};\n\n  data.acsc = {};\n  data.acscr = {};\n\n  // Possibly just return an empty object, as done here, instead of\n  // specifically saying ACS is \"broken\" above. This would be more\n  // accurate to ncurses logic. But it doesn't really matter.\n  if (this.detectPCRomSet(info)) {\n    return data;\n  }\n\n  // See: ~/ncurses/ncurses/tinfo/lib_acs.c: L208\n  Object.keys(Tput.acsc).forEach(function(ch) {\n    var acs_chars = info.strings.acs_chars || ''\n      , i = acs_chars.indexOf(ch)\n      , next = acs_chars[i + 1];\n\n    if (!next || i === -1 || !Tput.acsc[next]) {\n      return;\n    }\n\n    data.acsc[ch] = Tput.acsc[next];\n    data.acscr[Tput.acsc[next]] = ch;\n  });\n\n  return data;\n};\n\nTput.prototype.GetConsoleCP = function() {\n  var ccp;\n\n  if (process.platform !== 'win32') {\n    return -1;\n  }\n\n  // Allow unicode on all windows consoles for now:\n  if (+process.env.NCURSES_NO_WINDOWS_UNICODE !== 1) {\n    return 65001;\n  }\n\n  // cp.execSync('chcp 65001', { stdio: 'ignore', timeout: 1500 });\n\n  try {\n    // Produces something like: 'Active code page: 437\\n\\n'\n    ccp = cp.execFileSync(process.env.WINDIR + '\\\\system32\\\\chcp.com', [], {\n      stdio: ['ignore', 'pipe', 'ignore'],\n      encoding: 'ascii',\n      timeout: 1500\n    });\n    // ccp = cp.execSync('chcp', {\n    //   stdio: ['ignore', 'pipe', 'ignore'],\n    //   encoding: 'ascii',\n    //   timeout: 1500\n    // });\n  } catch (e) {\n    ;\n  }\n\n  ccp = /\\d+/.exec(ccp);\n\n  if (!ccp) {\n    return -1;\n  }\n\n  ccp = +ccp[0];\n\n  return ccp;\n};\n\n/**\n * Helpers\n */\n\nfunction noop() {\n  return '';\n}\n\nnoop.unsupported = true;\n\nfunction merge(a, b) {\n  Object.keys(b).forEach(function(key) {\n    a[key] = b[key];\n  });\n  return a;\n}\n\nfunction write(data) {\n  return process.stdout.write(data);\n}\n\nfunction tryRead(file) {\n  if (Array.isArray(file)) {\n    for (var i = 0; i < file.length; i++) {\n      var data = tryRead(file[i]);\n      if (data) return data;\n    }\n    return '';\n  }\n  if (!file) return '';\n  file = path.resolve.apply(path, arguments);\n  try {\n    return fs.readFileSync(file, 'utf8');\n  } catch (e) {\n    return '';\n  }\n}\n\n/**\n * sprintf\n *  http://www.cplusplus.com/reference/cstdio/printf/\n */\n\nfunction sprintf(src) {\n  var params = Array.prototype.slice.call(arguments, 1)\n    , rule = /%([\\-+# ]{1,4})?(\\d+(?:\\.\\d+)?)?([doxXsc])/g\n    , i = 0;\n\n  return src.replace(rule, function(_, flag, width, type) {\n    var flags = (flag || '').split('')\n      , param = params[i] != null ? params[i] : ''\n      , initial = param\n      // , width = +width\n      , opt = {}\n      , pre = '';\n\n    i++;\n\n    switch (type) {\n      case 'd': // signed int\n        param = (+param).toString(10);\n        break;\n      case 'o': // unsigned octal\n        param = (+param).toString(8);\n        break;\n      case 'x': // unsigned hex int\n        param = (+param).toString(16);\n        break;\n      case 'X': // unsigned hex int uppercase\n        param = (+param).toString(16).toUppercase();\n        break;\n      case 's': // string\n        break;\n      case 'c': // char\n        param = isFinite(param)\n          ? String.fromCharCode(param || 0x80)\n          : '';\n        break;\n    }\n\n    flags.forEach(function(flag) {\n      switch (flag) {\n        // left-justify by width\n        case '-':\n          opt.left = true;\n          break;\n        // always precede numbers with their signs\n        case '+':\n          opt.signs = true;\n          break;\n        // used with o, x, X - value is preceded with 0, 0x, or 0X respectively.\n        // used with a, A, e, E, f, F, g, G - forces written output to contain\n        // a decimal point even if no more digits follow\n        case '#':\n          opt.hexpoint = true;\n          break;\n        // if no sign is going to be written, black space in front of the value\n        case ' ':\n          opt.space = true;\n          break;\n      }\n    });\n\n    width = +width.split('.')[0];\n\n    // Should this be for opt.left too?\n    // Example: %2.2X - turns 0 into 00\n    if (width && !opt.left) {\n      param = param + '';\n      while (param.length < width) {\n        param = '0' + param;\n      }\n    }\n\n    if (opt.signs) {\n      if (+initial >= 0) {\n        pre += '+';\n      }\n    }\n\n    if (opt.space) {\n      if (!opt.signs && +initial >= 0) {\n        pre += ' ';\n      }\n    }\n\n    if (opt.hexpoint) {\n      switch (type) {\n        case 'o': // unsigned octal\n          pre += '0';\n          break;\n        case 'x': // unsigned hex int\n          pre += '0x';\n          break;\n        case 'X': // unsigned hex int uppercase\n          pre += '0X';\n          break;\n      }\n    }\n\n    if (opt.left) {\n      if (width > (pre.length + param.length)) {\n        width -= pre.length + param.length;\n        pre = Array(width + 1).join(' ') + pre;\n      }\n    }\n\n    return pre + param;\n  });\n}\n\n/**\n * Aliases\n */\n\nTput._alias = require('./alias');\n\nTput.alias = {};\n\n['bools', 'numbers', 'strings'].forEach(function(type) {\n  Object.keys(Tput._alias[type]).forEach(function(key) {\n    var aliases = Tput._alias[type][key];\n    Tput.alias[key] = [aliases[0]];\n    Tput.alias[key].terminfo = aliases[0];\n    Tput.alias[key].termcap = aliases[1];\n  });\n});\n\n// Bools\nTput.alias.no_esc_ctlc.push('beehive_glitch');\nTput.alias.dest_tabs_magic_smso.push('teleray_glitch');\n\n// Numbers\nTput.alias.micro_col_size.push('micro_char_size');\n\n/**\n * Feature Checking\n */\n\nTput.aliasMap = {};\n\nObject.keys(Tput.alias).forEach(function(key) {\n  Tput.aliasMap[key] = key;\n  Tput.alias[key].forEach(function(k) {\n    Tput.aliasMap[k] = key;\n  });\n});\n\nTput.prototype.has = function(name) {\n  name = Tput.aliasMap[name];\n\n  var val = this.all[name];\n\n  if (!name) return false;\n\n  if (typeof val === 'number') {\n    return val !== -1;\n  }\n\n  return !!val;\n};\n\n/**\n * Fallback Termcap Entry\n */\n\nTput.termcap = ''\n  + 'vt102|dec vt102:'\n  + ':do=^J:co#80:li#24:cl=50\\\\E[;H\\\\E[2J:'\n  + ':le=^H:bs:cm=5\\\\E[%i%d;%dH:nd=2\\\\E[C:up=2\\\\E[A:'\n  + ':ce=3\\\\E[K:cd=50\\\\E[J:so=2\\\\E[7m:se=2\\\\E[m:us=2\\\\E[4m:ue=2\\\\E[m:'\n  + ':md=2\\\\E[1m:mr=2\\\\E[7m:mb=2\\\\E[5m:me=2\\\\E[m:is=\\\\E[1;24r\\\\E[24;1H:'\n  + ':rs=\\\\E>\\\\E[?3l\\\\E[?4l\\\\E[?5l\\\\E[?7h\\\\E[?8h:ks=\\\\E[?1h\\\\E=:ke=\\\\E[?1l\\\\E>:'\n  + ':ku=\\\\EOA:kd=\\\\EOB:kr=\\\\EOC:kl=\\\\EOD:kb=^H:\\\\\\n'\n  + ':ho=\\\\E[H:k1=\\\\EOP:k2=\\\\EOQ:k3=\\\\EOR:k4=\\\\EOS:pt:sr=5\\\\EM:vt#3:'\n  + ':sc=\\\\E7:rc=\\\\E8:cs=\\\\E[%i%d;%dr:vs=\\\\E[?7l:ve=\\\\E[?7h:'\n  + ':mi:al=\\\\E[L:dc=\\\\E[P:dl=\\\\E[M:ei=\\\\E[4l:im=\\\\E[4h:';\n\n/**\n * Terminfo Data\n */\n\nTput.bools = [\n  'auto_left_margin',\n  'auto_right_margin',\n  'no_esc_ctlc',\n  'ceol_standout_glitch',\n  'eat_newline_glitch',\n  'erase_overstrike',\n  'generic_type',\n  'hard_copy',\n  'has_meta_key',\n  'has_status_line',\n  'insert_null_glitch',\n  'memory_above',\n  'memory_below',\n  'move_insert_mode',\n  'move_standout_mode',\n  'over_strike',\n  'status_line_esc_ok',\n  'dest_tabs_magic_smso',\n  'tilde_glitch',\n  'transparent_underline',\n  'xon_xoff',\n  'needs_xon_xoff',\n  'prtr_silent',\n  'hard_cursor',\n  'non_rev_rmcup',\n  'no_pad_char',\n  'non_dest_scroll_region',\n  'can_change',\n  'back_color_erase',\n  'hue_lightness_saturation',\n  'col_addr_glitch',\n  'cr_cancels_micro_mode',\n  'has_print_wheel',\n  'row_addr_glitch',\n  'semi_auto_right_margin',\n  'cpi_changes_res',\n  'lpi_changes_res',\n\n  // #ifdef __INTERNAL_CAPS_VISIBLE\n  'backspaces_with_bs',\n  'crt_no_scrolling',\n  'no_correctly_working_cr',\n  'gnu_has_meta_key',\n  'linefeed_is_newline',\n  'has_hardware_tabs',\n  'return_does_clr_eol'\n];\n\nTput.numbers = [\n  'columns',\n  'init_tabs',\n  'lines',\n  'lines_of_memory',\n  'magic_cookie_glitch',\n  'padding_baud_rate',\n  'virtual_terminal',\n  'width_status_line',\n  'num_labels',\n  'label_height',\n  'label_width',\n  'max_attributes',\n  'maximum_windows',\n  'max_colors',\n  'max_pairs',\n  'no_color_video',\n  'buffer_capacity',\n  'dot_vert_spacing',\n  'dot_horz_spacing',\n  'max_micro_address',\n  'max_micro_jump',\n  'micro_col_size',\n  'micro_line_size',\n  'number_of_pins',\n  'output_res_char',\n  'output_res_line',\n  'output_res_horz_inch',\n  'output_res_vert_inch',\n  'print_rate',\n  'wide_char_size',\n  'buttons',\n  'bit_image_entwining',\n  'bit_image_type',\n\n  // #ifdef __INTERNAL_CAPS_VISIBLE\n  'magic_cookie_glitch_ul',\n  'carriage_return_delay',\n  'new_line_delay',\n  'backspace_delay',\n  'horizontal_tab_delay',\n  'number_of_function_keys'\n];\n\nTput.strings = [\n  'back_tab',\n  'bell',\n  'carriage_return',\n  'change_scroll_region',\n  'clear_all_tabs',\n  'clear_screen',\n  'clr_eol',\n  'clr_eos',\n  'column_address',\n  'command_character',\n  'cursor_address',\n  'cursor_down',\n  'cursor_home',\n  'cursor_invisible',\n  'cursor_left',\n  'cursor_mem_address',\n  'cursor_normal',\n  'cursor_right',\n  'cursor_to_ll',\n  'cursor_up',\n  'cursor_visible',\n  'delete_character',\n  'delete_line',\n  'dis_status_line',\n  'down_half_line',\n  'enter_alt_charset_mode',\n  'enter_blink_mode',\n  'enter_bold_mode',\n  'enter_ca_mode',\n  'enter_delete_mode',\n  'enter_dim_mode',\n  'enter_insert_mode',\n  'enter_secure_mode',\n  'enter_protected_mode',\n  'enter_reverse_mode',\n  'enter_standout_mode',\n  'enter_underline_mode',\n  'erase_chars',\n  'exit_alt_charset_mode',\n  'exit_attribute_mode',\n  'exit_ca_mode',\n  'exit_delete_mode',\n  'exit_insert_mode',\n  'exit_standout_mode',\n  'exit_underline_mode',\n  'flash_screen',\n  'form_feed',\n  'from_status_line',\n  'init_1string',\n  'init_2string',\n  'init_3string',\n  'init_file',\n  'insert_character',\n  'insert_line',\n  'insert_padding',\n  'key_backspace',\n  'key_catab',\n  'key_clear',\n  'key_ctab',\n  'key_dc',\n  'key_dl',\n  'key_down',\n  'key_eic',\n  'key_eol',\n  'key_eos',\n  'key_f0',\n  'key_f1',\n  'key_f10',\n  'key_f2',\n  'key_f3',\n  'key_f4',\n  'key_f5',\n  'key_f6',\n  'key_f7',\n  'key_f8',\n  'key_f9',\n  'key_home',\n  'key_ic',\n  'key_il',\n  'key_left',\n  'key_ll',\n  'key_npage',\n  'key_ppage',\n  'key_right',\n  'key_sf',\n  'key_sr',\n  'key_stab',\n  'key_up',\n  'keypad_local',\n  'keypad_xmit',\n  'lab_f0',\n  'lab_f1',\n  'lab_f10',\n  'lab_f2',\n  'lab_f3',\n  'lab_f4',\n  'lab_f5',\n  'lab_f6',\n  'lab_f7',\n  'lab_f8',\n  'lab_f9',\n  'meta_off',\n  'meta_on',\n  'newline',\n  'pad_char',\n  'parm_dch',\n  'parm_delete_line',\n  'parm_down_cursor',\n  'parm_ich',\n  'parm_index',\n  'parm_insert_line',\n  'parm_left_cursor',\n  'parm_right_cursor',\n  'parm_rindex',\n  'parm_up_cursor',\n  'pkey_key',\n  'pkey_local',\n  'pkey_xmit',\n  'print_screen',\n  'prtr_off',\n  'prtr_on',\n  'repeat_char',\n  'reset_1string',\n  'reset_2string',\n  'reset_3string',\n  'reset_file',\n  'restore_cursor',\n  'row_address',\n  'save_cursor',\n  'scroll_forward',\n  'scroll_reverse',\n  'set_attributes',\n  'set_tab',\n  'set_window',\n  'tab',\n  'to_status_line',\n  'underline_char',\n  'up_half_line',\n  'init_prog',\n  'key_a1',\n  'key_a3',\n  'key_b2',\n  'key_c1',\n  'key_c3',\n  'prtr_non',\n  'char_padding',\n  'acs_chars',\n  'plab_norm',\n  'key_btab',\n  'enter_xon_mode',\n  'exit_xon_mode',\n  'enter_am_mode',\n  'exit_am_mode',\n  'xon_character',\n  'xoff_character',\n  'ena_acs',\n  'label_on',\n  'label_off',\n  'key_beg',\n  'key_cancel',\n  'key_close',\n  'key_command',\n  'key_copy',\n  'key_create',\n  'key_end',\n  'key_enter',\n  'key_exit',\n  'key_find',\n  'key_help',\n  'key_mark',\n  'key_message',\n  'key_move',\n  'key_next',\n  'key_open',\n  'key_options',\n  'key_previous',\n  'key_print',\n  'key_redo',\n  'key_reference',\n  'key_refresh',\n  'key_replace',\n  'key_restart',\n  'key_resume',\n  'key_save',\n  'key_suspend',\n  'key_undo',\n  'key_sbeg',\n  'key_scancel',\n  'key_scommand',\n  'key_scopy',\n  'key_screate',\n  'key_sdc',\n  'key_sdl',\n  'key_select',\n  'key_send',\n  'key_seol',\n  'key_sexit',\n  'key_sfind',\n  'key_shelp',\n  'key_shome',\n  'key_sic',\n  'key_sleft',\n  'key_smessage',\n  'key_smove',\n  'key_snext',\n  'key_soptions',\n  'key_sprevious',\n  'key_sprint',\n  'key_sredo',\n  'key_sreplace',\n  'key_sright',\n  'key_srsume',\n  'key_ssave',\n  'key_ssuspend',\n  'key_sundo',\n  'req_for_input',\n  'key_f11',\n  'key_f12',\n  'key_f13',\n  'key_f14',\n  'key_f15',\n  'key_f16',\n  'key_f17',\n  'key_f18',\n  'key_f19',\n  'key_f20',\n  'key_f21',\n  'key_f22',\n  'key_f23',\n  'key_f24',\n  'key_f25',\n  'key_f26',\n  'key_f27',\n  'key_f28',\n  'key_f29',\n  'key_f30',\n  'key_f31',\n  'key_f32',\n  'key_f33',\n  'key_f34',\n  'key_f35',\n  'key_f36',\n  'key_f37',\n  'key_f38',\n  'key_f39',\n  'key_f40',\n  'key_f41',\n  'key_f42',\n  'key_f43',\n  'key_f44',\n  'key_f45',\n  'key_f46',\n  'key_f47',\n  'key_f48',\n  'key_f49',\n  'key_f50',\n  'key_f51',\n  'key_f52',\n  'key_f53',\n  'key_f54',\n  'key_f55',\n  'key_f56',\n  'key_f57',\n  'key_f58',\n  'key_f59',\n  'key_f60',\n  'key_f61',\n  'key_f62',\n  'key_f63',\n  'clr_bol',\n  'clear_margins',\n  'set_left_margin',\n  'set_right_margin',\n  'label_format',\n  'set_clock',\n  'display_clock',\n  'remove_clock',\n  'create_window',\n  'goto_window',\n  'hangup',\n  'dial_phone',\n  'quick_dial',\n  'tone',\n  'pulse',\n  'flash_hook',\n  'fixed_pause',\n  'wait_tone',\n  'user0',\n  'user1',\n  'user2',\n  'user3',\n  'user4',\n  'user5',\n  'user6',\n  'user7',\n  'user8',\n  'user9',\n  'orig_pair',\n  'orig_colors',\n  'initialize_color',\n  'initialize_pair',\n  'set_color_pair',\n  'set_foreground',\n  'set_background',\n  'change_char_pitch',\n  'change_line_pitch',\n  'change_res_horz',\n  'change_res_vert',\n  'define_char',\n  'enter_doublewide_mode',\n  'enter_draft_quality',\n  'enter_italics_mode',\n  'enter_leftward_mode',\n  'enter_micro_mode',\n  'enter_near_letter_quality',\n  'enter_normal_quality',\n  'enter_shadow_mode',\n  'enter_subscript_mode',\n  'enter_superscript_mode',\n  'enter_upward_mode',\n  'exit_doublewide_mode',\n  'exit_italics_mode',\n  'exit_leftward_mode',\n  'exit_micro_mode',\n  'exit_shadow_mode',\n  'exit_subscript_mode',\n  'exit_superscript_mode',\n  'exit_upward_mode',\n  'micro_column_address',\n  'micro_down',\n  'micro_left',\n  'micro_right',\n  'micro_row_address',\n  'micro_up',\n  'order_of_pins',\n  'parm_down_micro',\n  'parm_left_micro',\n  'parm_right_micro',\n  'parm_up_micro',\n  'select_char_set',\n  'set_bottom_margin',\n  'set_bottom_margin_parm',\n  'set_left_margin_parm',\n  'set_right_margin_parm',\n  'set_top_margin',\n  'set_top_margin_parm',\n  'start_bit_image',\n  'start_char_set_def',\n  'stop_bit_image',\n  'stop_char_set_def',\n  'subscript_characters',\n  'superscript_characters',\n  'these_cause_cr',\n  'zero_motion',\n  'char_set_names',\n  'key_mouse',\n  'mouse_info',\n  'req_mouse_pos',\n  'get_mouse',\n  'set_a_foreground',\n  'set_a_background',\n  'pkey_plab',\n  'device_type',\n  'code_set_init',\n  'set0_des_seq',\n  'set1_des_seq',\n  'set2_des_seq',\n  'set3_des_seq',\n  'set_lr_margin',\n  'set_tb_margin',\n  'bit_image_repeat',\n  'bit_image_newline',\n  'bit_image_carriage_return',\n  'color_names',\n  'define_bit_image_region',\n  'end_bit_image_region',\n  'set_color_band',\n  'set_page_length',\n  'display_pc_char',\n  'enter_pc_charset_mode',\n  'exit_pc_charset_mode',\n  'enter_scancode_mode',\n  'exit_scancode_mode',\n  'pc_term_options',\n  'scancode_escape',\n  'alt_scancode_esc',\n  'enter_horizontal_hl_mode',\n  'enter_left_hl_mode',\n  'enter_low_hl_mode',\n  'enter_right_hl_mode',\n  'enter_top_hl_mode',\n  'enter_vertical_hl_mode',\n  'set_a_attributes',\n  'set_pglen_inch',\n\n  // #ifdef __INTERNAL_CAPS_VISIBLE\n  'termcap_init2',\n  'termcap_reset',\n  'linefeed_if_not_lf',\n  'backspace_if_not_bs',\n  'other_non_function_keys',\n  'arrow_key_map',\n  'acs_ulcorner',\n  'acs_llcorner',\n  'acs_urcorner',\n  'acs_lrcorner',\n  'acs_ltee',\n  'acs_rtee',\n  'acs_btee',\n  'acs_ttee',\n  'acs_hline',\n  'acs_vline',\n  'acs_plus',\n  'memory_lock',\n  'memory_unlock',\n  'box_chars_1'\n];\n\n// DEC Special Character and Line Drawing Set.\n// Taken from tty.js.\nTput.acsc = {    // (0\n  '`': '\\u25c6', // '◆'\n  'a': '\\u2592', // '▒'\n  'b': '\\u0009', // '\\t'\n  'c': '\\u000c', // '\\f'\n  'd': '\\u000d', // '\\r'\n  'e': '\\u000a', // '\\n'\n  'f': '\\u00b0', // '°'\n  'g': '\\u00b1', // '±'\n  'h': '\\u2424', // '\\u2424' (NL)\n  'i': '\\u000b', // '\\v'\n  'j': '\\u2518', // '┘'\n  'k': '\\u2510', // '┐'\n  'l': '\\u250c', // '┌'\n  'm': '\\u2514', // '└'\n  'n': '\\u253c', // '┼'\n  'o': '\\u23ba', // '⎺'\n  'p': '\\u23bb', // '⎻'\n  'q': '\\u2500', // '─'\n  'r': '\\u23bc', // '⎼'\n  's': '\\u23bd', // '⎽'\n  't': '\\u251c', // '├'\n  'u': '\\u2524', // '┤'\n  'v': '\\u2534', // '┴'\n  'w': '\\u252c', // '┬'\n  'x': '\\u2502', // '│'\n  'y': '\\u2264', // '≤'\n  'z': '\\u2265', // '≥'\n  '{': '\\u03c0', // 'π'\n  '|': '\\u2260', // '≠'\n  '}': '\\u00a3', // '£'\n  '~': '\\u00b7'  // '·'\n};\n\n// Convert ACS unicode characters to the\n// most similar-looking ascii characters.\nTput.utoa = Tput.prototype.utoa = {\n  '\\u25c6': '*', // '◆'\n  '\\u2592': ' ', // '▒'\n  // '\\u0009': '\\t', // '\\t'\n  // '\\u000c': '\\f', // '\\f'\n  // '\\u000d': '\\r', // '\\r'\n  // '\\u000a': '\\n', // '\\n'\n  '\\u00b0': '*', // '°'\n  '\\u00b1': '+', // '±'\n  '\\u2424': '\\n', // '\\u2424' (NL)\n  // '\\u000b': '\\v', // '\\v'\n  '\\u2518': '+', // '┘'\n  '\\u2510': '+', // '┐'\n  '\\u250c': '+', // '┌'\n  '\\u2514': '+', // '└'\n  '\\u253c': '+', // '┼'\n  '\\u23ba': '-', // '⎺'\n  '\\u23bb': '-', // '⎻'\n  '\\u2500': '-', // '─'\n  '\\u23bc': '-', // '⎼'\n  '\\u23bd': '_', // '⎽'\n  '\\u251c': '+', // '├'\n  '\\u2524': '+', // '┤'\n  '\\u2534': '+', // '┴'\n  '\\u252c': '+', // '┬'\n  '\\u2502': '|', // '│'\n  '\\u2264': '<', // '≤'\n  '\\u2265': '>', // '≥'\n  '\\u03c0': '?', // 'π'\n  '\\u2260': '=', // '≠'\n  '\\u00a3': '?', // '£'\n  '\\u00b7': '*'  // '·'\n};\n\n/**\n * Expose\n */\n\nexports = Tput;\nexports.sprintf = sprintf;\nexports.tryRead = tryRead;\n\nmodule.exports = exports;\n"
  },
  {
    "path": "lib/unicode.js",
    "content": "/**\n * unicode.js - east asian width and surrogate pairs\n * Copyright (c) 2013-2015, Christopher Jeffrey and contributors (MIT License).\n * https://github.com/chjj/blessed\n * Borrowed from vangie/east-asian-width, komagata/eastasianwidth,\n * and mathiasbynens/String.prototype.codePointAt. Licenses below.\n */\n\n// east-asian-width\n//\n// Copyright (c) 2015 Vangie Du\n// https://github.com/vangie/east-asian-width\n//\n// Permission is hereby granted, free of charge, to any person\n// obtaining a copy of this software and associated documentation\n// files (the \"Software\"), to deal in the Software without\n// restriction, including without limitation the rights to use,\n// copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the\n// Software is furnished to do so, subject to the following\n// conditions:\n//\n// The above copyright notice and this permission notice shall be\n// included in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n// OTHER DEALINGS IN THE SOFTWARE.\n\n// eastasianwidth\n//\n// Copyright (c) 2013, Masaki Komagata\n// https://github.com/komagata/eastasianwidth\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n\n// String.prototype.codePointAt\n//\n// Copyright Mathias Bynens <https://mathiasbynens.be/>\n// https://github.com/mathiasbynens/String.prototype.codePointAt\n//\n// Permission is hereby granted, free of charge, to any person obtaining\n// a copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to\n// permit persons to whom the Software is furnished to do so, subject to\n// the following conditions:\n//\n// The above copyright notice and this permission notice shall be\n// included in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\n// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\n// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\n// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n// String.fromCodePoint\n//\n// Copyright Mathias Bynens <https://mathiasbynens.be/>\n// https://github.com/mathiasbynens/String.fromCodePoint\n//\n// Permission is hereby granted, free of charge, to any person obtaining\n// a copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to\n// permit persons to whom the Software is furnished to do so, subject to\n// the following conditions:\n//\n// The above copyright notice and this permission notice shall be\n// included in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\n// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\n// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\n// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\nvar stringFromCharCode = String.fromCharCode;\nvar floor = Math.floor;\n\n/**\n * Wide, Surrogates, and Combining\n */\n\nexports.charWidth = function(str, i) {\n  var point = typeof str !== 'number'\n    ? exports.codePointAt(str, i || 0)\n    : str;\n\n  // nul\n  if (point === 0) return 0;\n\n  // tab\n  if (point === 0x09) {\n    if (!exports.blessed) {\n      exports.blessed = require('../');\n    }\n    return exports.blessed.screen.global\n      ? exports.blessed.screen.global.tabc.length\n      : 8;\n  }\n\n  // 8-bit control characters (2-width according to unicode??)\n  if (point < 32 || (point >= 0x7f && point < 0xa0)) {\n    return 0;\n  }\n\n  // search table of non-spacing characters\n  // is ucs combining or C0/C1 control character\n  if (exports.combining[point]) {\n    return 0;\n  }\n\n  // check for double-wide\n  // if (point >= 0x1100\n  //     && (point <= 0x115f // Hangul Jamo init. consonants\n  //     || point === 0x2329 || point === 0x232a\n  //     || (point >= 0x2e80 && point <= 0xa4cf\n  //     && point !== 0x303f) // CJK ... Yi\n  //     || (point >= 0xac00 && point <= 0xd7a3) // Hangul Syllables\n  //     || (point >= 0xf900 && point <= 0xfaff) // CJK Compatibility Ideographs\n  //     || (point >= 0xfe10 && point <= 0xfe19) // Vertical forms\n  //     || (point >= 0xfe30 && point <= 0xfe6f) // CJK Compatibility Forms\n  //     || (point >= 0xff00 && point <= 0xff60) // Fullwidth Forms\n  //     || (point >= 0xffe0 && point <= 0xffe6)\n  //     || (point >= 0x20000 && point <= 0x2fffd)\n  //     || (point >= 0x30000 && point <= 0x3fffd))) {\n  //   return 2;\n  // }\n\n  // check for double-wide\n  if ((0x3000 === point)\n      || (0xFF01 <= point && point <= 0xFF60)\n      || (0xFFE0 <= point && point <= 0xFFE6)) {\n    return 2;\n  }\n\n  if ((0x1100 <= point && point <= 0x115F)\n      || (0x11A3 <= point && point <= 0x11A7)\n      || (0x11FA <= point && point <= 0x11FF)\n      || (0x2329 <= point && point <= 0x232A)\n      || (0x2E80 <= point && point <= 0x2E99)\n      || (0x2E9B <= point && point <= 0x2EF3)\n      || (0x2F00 <= point && point <= 0x2FD5)\n      || (0x2FF0 <= point && point <= 0x2FFB)\n      || (0x3001 <= point && point <= 0x303E)\n      || (0x3041 <= point && point <= 0x3096)\n      || (0x3099 <= point && point <= 0x30FF)\n      || (0x3105 <= point && point <= 0x312D)\n      || (0x3131 <= point && point <= 0x318E)\n      || (0x3190 <= point && point <= 0x31BA)\n      || (0x31C0 <= point && point <= 0x31E3)\n      || (0x31F0 <= point && point <= 0x321E)\n      || (0x3220 <= point && point <= 0x3247)\n      || (0x3250 <= point && point <= 0x32FE)\n      || (0x3300 <= point && point <= 0x4DBF)\n      || (0x4E00 <= point && point <= 0xA48C)\n      || (0xA490 <= point && point <= 0xA4C6)\n      || (0xA960 <= point && point <= 0xA97C)\n      || (0xAC00 <= point && point <= 0xD7A3)\n      || (0xD7B0 <= point && point <= 0xD7C6)\n      || (0xD7CB <= point && point <= 0xD7FB)\n      || (0xF900 <= point && point <= 0xFAFF)\n      || (0xFE10 <= point && point <= 0xFE19)\n      || (0xFE30 <= point && point <= 0xFE52)\n      || (0xFE54 <= point && point <= 0xFE66)\n      || (0xFE68 <= point && point <= 0xFE6B)\n      || (0x1B000 <= point && point <= 0x1B001)\n      || (0x1F200 <= point && point <= 0x1F202)\n      || (0x1F210 <= point && point <= 0x1F23A)\n      || (0x1F240 <= point && point <= 0x1F248)\n      || (0x1F250 <= point && point <= 0x1F251)\n      || (0x20000 <= point && point <= 0x2F73F)\n      || (0x2B740 <= point && point <= 0x2FFFD)\n      || (0x30000 <= point && point <= 0x3FFFD)) {\n    return 2;\n  }\n\n  // CJK Ambiguous\n  // http://www.unicode.org/reports/tr11/\n  // http://www.unicode.org/reports/tr11/#Ambiguous\n  if (process.env.NCURSES_CJK_WIDTH) {\n    if ((0x00A1 === point)\n        || (0x00A4 === point)\n        || (0x00A7 <= point && point <= 0x00A8)\n        || (0x00AA === point)\n        || (0x00AD <= point && point <= 0x00AE)\n        || (0x00B0 <= point && point <= 0x00B4)\n        || (0x00B6 <= point && point <= 0x00BA)\n        || (0x00BC <= point && point <= 0x00BF)\n        || (0x00C6 === point)\n        || (0x00D0 === point)\n        || (0x00D7 <= point && point <= 0x00D8)\n        || (0x00DE <= point && point <= 0x00E1)\n        || (0x00E6 === point)\n        || (0x00E8 <= point && point <= 0x00EA)\n        || (0x00EC <= point && point <= 0x00ED)\n        || (0x00F0 === point)\n        || (0x00F2 <= point && point <= 0x00F3)\n        || (0x00F7 <= point && point <= 0x00FA)\n        || (0x00FC === point)\n        || (0x00FE === point)\n        || (0x0101 === point)\n        || (0x0111 === point)\n        || (0x0113 === point)\n        || (0x011B === point)\n        || (0x0126 <= point && point <= 0x0127)\n        || (0x012B === point)\n        || (0x0131 <= point && point <= 0x0133)\n        || (0x0138 === point)\n        || (0x013F <= point && point <= 0x0142)\n        || (0x0144 === point)\n        || (0x0148 <= point && point <= 0x014B)\n        || (0x014D === point)\n        || (0x0152 <= point && point <= 0x0153)\n        || (0x0166 <= point && point <= 0x0167)\n        || (0x016B === point)\n        || (0x01CE === point)\n        || (0x01D0 === point)\n        || (0x01D2 === point)\n        || (0x01D4 === point)\n        || (0x01D6 === point)\n        || (0x01D8 === point)\n        || (0x01DA === point)\n        || (0x01DC === point)\n        || (0x0251 === point)\n        || (0x0261 === point)\n        || (0x02C4 === point)\n        || (0x02C7 === point)\n        || (0x02C9 <= point && point <= 0x02CB)\n        || (0x02CD === point)\n        || (0x02D0 === point)\n        || (0x02D8 <= point && point <= 0x02DB)\n        || (0x02DD === point)\n        || (0x02DF === point)\n        || (0x0300 <= point && point <= 0x036F)\n        || (0x0391 <= point && point <= 0x03A1)\n        || (0x03A3 <= point && point <= 0x03A9)\n        || (0x03B1 <= point && point <= 0x03C1)\n        || (0x03C3 <= point && point <= 0x03C9)\n        || (0x0401 === point)\n        || (0x0410 <= point && point <= 0x044F)\n        || (0x0451 === point)\n        || (0x2010 === point)\n        || (0x2013 <= point && point <= 0x2016)\n        || (0x2018 <= point && point <= 0x2019)\n        || (0x201C <= point && point <= 0x201D)\n        || (0x2020 <= point && point <= 0x2022)\n        || (0x2024 <= point && point <= 0x2027)\n        || (0x2030 === point)\n        || (0x2032 <= point && point <= 0x2033)\n        || (0x2035 === point)\n        || (0x203B === point)\n        || (0x203E === point)\n        || (0x2074 === point)\n        || (0x207F === point)\n        || (0x2081 <= point && point <= 0x2084)\n        || (0x20AC === point)\n        || (0x2103 === point)\n        || (0x2105 === point)\n        || (0x2109 === point)\n        || (0x2113 === point)\n        || (0x2116 === point)\n        || (0x2121 <= point && point <= 0x2122)\n        || (0x2126 === point)\n        || (0x212B === point)\n        || (0x2153 <= point && point <= 0x2154)\n        || (0x215B <= point && point <= 0x215E)\n        || (0x2160 <= point && point <= 0x216B)\n        || (0x2170 <= point && point <= 0x2179)\n        || (0x2189 === point)\n        || (0x2190 <= point && point <= 0x2199)\n        || (0x21B8 <= point && point <= 0x21B9)\n        || (0x21D2 === point)\n        || (0x21D4 === point)\n        || (0x21E7 === point)\n        || (0x2200 === point)\n        || (0x2202 <= point && point <= 0x2203)\n        || (0x2207 <= point && point <= 0x2208)\n        || (0x220B === point)\n        || (0x220F === point)\n        || (0x2211 === point)\n        || (0x2215 === point)\n        || (0x221A === point)\n        || (0x221D <= point && point <= 0x2220)\n        || (0x2223 === point)\n        || (0x2225 === point)\n        || (0x2227 <= point && point <= 0x222C)\n        || (0x222E === point)\n        || (0x2234 <= point && point <= 0x2237)\n        || (0x223C <= point && point <= 0x223D)\n        || (0x2248 === point)\n        || (0x224C === point)\n        || (0x2252 === point)\n        || (0x2260 <= point && point <= 0x2261)\n        || (0x2264 <= point && point <= 0x2267)\n        || (0x226A <= point && point <= 0x226B)\n        || (0x226E <= point && point <= 0x226F)\n        || (0x2282 <= point && point <= 0x2283)\n        || (0x2286 <= point && point <= 0x2287)\n        || (0x2295 === point)\n        || (0x2299 === point)\n        || (0x22A5 === point)\n        || (0x22BF === point)\n        || (0x2312 === point)\n        || (0x2460 <= point && point <= 0x24E9)\n        || (0x24EB <= point && point <= 0x254B)\n        || (0x2550 <= point && point <= 0x2573)\n        || (0x2580 <= point && point <= 0x258F)\n        || (0x2592 <= point && point <= 0x2595)\n        || (0x25A0 <= point && point <= 0x25A1)\n        || (0x25A3 <= point && point <= 0x25A9)\n        || (0x25B2 <= point && point <= 0x25B3)\n        || (0x25B6 <= point && point <= 0x25B7)\n        || (0x25BC <= point && point <= 0x25BD)\n        || (0x25C0 <= point && point <= 0x25C1)\n        || (0x25C6 <= point && point <= 0x25C8)\n        || (0x25CB === point)\n        || (0x25CE <= point && point <= 0x25D1)\n        || (0x25E2 <= point && point <= 0x25E5)\n        || (0x25EF === point)\n        || (0x2605 <= point && point <= 0x2606)\n        || (0x2609 === point)\n        || (0x260E <= point && point <= 0x260F)\n        || (0x2614 <= point && point <= 0x2615)\n        || (0x261C === point)\n        || (0x261E === point)\n        || (0x2640 === point)\n        || (0x2642 === point)\n        || (0x2660 <= point && point <= 0x2661)\n        || (0x2663 <= point && point <= 0x2665)\n        || (0x2667 <= point && point <= 0x266A)\n        || (0x266C <= point && point <= 0x266D)\n        || (0x266F === point)\n        || (0x269E <= point && point <= 0x269F)\n        || (0x26BE <= point && point <= 0x26BF)\n        || (0x26C4 <= point && point <= 0x26CD)\n        || (0x26CF <= point && point <= 0x26E1)\n        || (0x26E3 === point)\n        || (0x26E8 <= point && point <= 0x26FF)\n        || (0x273D === point)\n        || (0x2757 === point)\n        || (0x2776 <= point && point <= 0x277F)\n        || (0x2B55 <= point && point <= 0x2B59)\n        || (0x3248 <= point && point <= 0x324F)\n        || (0xE000 <= point && point <= 0xF8FF)\n        || (0xFE00 <= point && point <= 0xFE0F)\n        || (0xFFFD === point)\n        || (0x1F100 <= point && point <= 0x1F10A)\n        || (0x1F110 <= point && point <= 0x1F12D)\n        || (0x1F130 <= point && point <= 0x1F169)\n        || (0x1F170 <= point && point <= 0x1F19A)\n        || (0xE0100 <= point && point <= 0xE01EF)\n        || (0xF0000 <= point && point <= 0xFFFFD)\n        || (0x100000 <= point && point <= 0x10FFFD)) {\n      return +process.env.NCURSES_CJK_WIDTH || 1;\n    }\n  }\n\n  return 1;\n};\n\nexports.strWidth = function(str) {\n  var width = 0;\n  for (var i = 0; i < str.length; i++) {\n    width += exports.charWidth(str, i);\n    if (exports.isSurrogate(str, i)) i++;\n  }\n  return width;\n};\n\nexports.isSurrogate = function(str, i) {\n  var point = typeof str !== 'number'\n    ? exports.codePointAt(str, i || 0)\n    : str;\n  return point > 0x00ffff;\n};\n\nexports.combiningTable = [\n  [0x0300, 0x036F],   [0x0483, 0x0486],   [0x0488, 0x0489],\n  [0x0591, 0x05BD],   [0x05BF, 0x05BF],   [0x05C1, 0x05C2],\n  [0x05C4, 0x05C5],   [0x05C7, 0x05C7],   [0x0600, 0x0603],\n  [0x0610, 0x0615],   [0x064B, 0x065E],   [0x0670, 0x0670],\n  [0x06D6, 0x06E4],   [0x06E7, 0x06E8],   [0x06EA, 0x06ED],\n  [0x070F, 0x070F],   [0x0711, 0x0711],   [0x0730, 0x074A],\n  [0x07A6, 0x07B0],   [0x07EB, 0x07F3],   [0x0901, 0x0902],\n  [0x093C, 0x093C],   [0x0941, 0x0948],   [0x094D, 0x094D],\n  [0x0951, 0x0954],   [0x0962, 0x0963],   [0x0981, 0x0981],\n  [0x09BC, 0x09BC],   [0x09C1, 0x09C4],   [0x09CD, 0x09CD],\n  [0x09E2, 0x09E3],   [0x0A01, 0x0A02],   [0x0A3C, 0x0A3C],\n  [0x0A41, 0x0A42],   [0x0A47, 0x0A48],   [0x0A4B, 0x0A4D],\n  [0x0A70, 0x0A71],   [0x0A81, 0x0A82],   [0x0ABC, 0x0ABC],\n  [0x0AC1, 0x0AC5],   [0x0AC7, 0x0AC8],   [0x0ACD, 0x0ACD],\n  [0x0AE2, 0x0AE3],   [0x0B01, 0x0B01],   [0x0B3C, 0x0B3C],\n  [0x0B3F, 0x0B3F],   [0x0B41, 0x0B43],   [0x0B4D, 0x0B4D],\n  [0x0B56, 0x0B56],   [0x0B82, 0x0B82],   [0x0BC0, 0x0BC0],\n  [0x0BCD, 0x0BCD],   [0x0C3E, 0x0C40],   [0x0C46, 0x0C48],\n  [0x0C4A, 0x0C4D],   [0x0C55, 0x0C56],   [0x0CBC, 0x0CBC],\n  [0x0CBF, 0x0CBF],   [0x0CC6, 0x0CC6],   [0x0CCC, 0x0CCD],\n  [0x0CE2, 0x0CE3],   [0x0D41, 0x0D43],   [0x0D4D, 0x0D4D],\n  [0x0DCA, 0x0DCA],   [0x0DD2, 0x0DD4],   [0x0DD6, 0x0DD6],\n  [0x0E31, 0x0E31],   [0x0E34, 0x0E3A],   [0x0E47, 0x0E4E],\n  [0x0EB1, 0x0EB1],   [0x0EB4, 0x0EB9],   [0x0EBB, 0x0EBC],\n  [0x0EC8, 0x0ECD],   [0x0F18, 0x0F19],   [0x0F35, 0x0F35],\n  [0x0F37, 0x0F37],   [0x0F39, 0x0F39],   [0x0F71, 0x0F7E],\n  [0x0F80, 0x0F84],   [0x0F86, 0x0F87],   [0x0F90, 0x0F97],\n  [0x0F99, 0x0FBC],   [0x0FC6, 0x0FC6],   [0x102D, 0x1030],\n  [0x1032, 0x1032],   [0x1036, 0x1037],   [0x1039, 0x1039],\n  [0x1058, 0x1059],   [0x1160, 0x11FF],   [0x135F, 0x135F],\n  [0x1712, 0x1714],   [0x1732, 0x1734],   [0x1752, 0x1753],\n  [0x1772, 0x1773],   [0x17B4, 0x17B5],   [0x17B7, 0x17BD],\n  [0x17C6, 0x17C6],   [0x17C9, 0x17D3],   [0x17DD, 0x17DD],\n  [0x180B, 0x180D],   [0x18A9, 0x18A9],   [0x1920, 0x1922],\n  [0x1927, 0x1928],   [0x1932, 0x1932],   [0x1939, 0x193B],\n  [0x1A17, 0x1A18],   [0x1B00, 0x1B03],   [0x1B34, 0x1B34],\n  [0x1B36, 0x1B3A],   [0x1B3C, 0x1B3C],   [0x1B42, 0x1B42],\n  [0x1B6B, 0x1B73],   [0x1DC0, 0x1DCA],   [0x1DFE, 0x1DFF],\n  [0x200B, 0x200F],   [0x202A, 0x202E],   [0x2060, 0x2063],\n  [0x206A, 0x206F],   [0x20D0, 0x20EF],   [0x302A, 0x302F],\n  [0x3099, 0x309A],   [0xA806, 0xA806],   [0xA80B, 0xA80B],\n  [0xA825, 0xA826],   [0xFB1E, 0xFB1E],   [0xFE00, 0xFE0F],\n  [0xFE20, 0xFE23],   [0xFEFF, 0xFEFF],   [0xFFF9, 0xFFFB],\n  [0x10A01, 0x10A03], [0x10A05, 0x10A06], [0x10A0C, 0x10A0F],\n  [0x10A38, 0x10A3A], [0x10A3F, 0x10A3F], [0x1D167, 0x1D169],\n  [0x1D173, 0x1D182], [0x1D185, 0x1D18B], [0x1D1AA, 0x1D1AD],\n  [0x1D242, 0x1D244], [0xE0001, 0xE0001], [0xE0020, 0xE007F],\n  [0xE0100, 0xE01EF]\n];\n\nexports.combining = exports.combiningTable.reduce(function(out, row) {\n  for (var i = row[0]; i <= row[1]; i++) {\n    out[i] = true;\n  }\n  return out;\n}, {});\n\nexports.isCombining = function(str, i) {\n  var point = typeof str !== 'number'\n    ? exports.codePointAt(str, i || 0)\n    : str;\n  return exports.combining[point] === true;\n};\n\n/**\n * Code Point Helpers\n */\n\nexports.codePointAt = function(str, position) {\n  if (str == null) {\n    throw TypeError();\n  }\n  var string = String(str);\n  if (string.codePointAt) {\n    return string.codePointAt(position);\n  }\n  var size = string.length;\n  // `ToInteger`\n  var index = position ? Number(position) : 0;\n  if (index !== index) { // better `isNaN`\n    index = 0;\n  }\n  // Account for out-of-bounds indices:\n  if (index < 0 || index >= size) {\n    return undefined;\n  }\n  // Get the first code unit\n  var first = string.charCodeAt(index);\n  var second;\n  if ( // check if it’s the start of a surrogate pair\n    first >= 0xD800 && first <= 0xDBFF && // high surrogate\n    size > index + 1 // there is a next code unit\n  ) {\n    second = string.charCodeAt(index + 1);\n    if (second >= 0xDC00 && second <= 0xDFFF) { // low surrogate\n      // http://mathiasbynens.be/notes/javascript-encoding#surrogate-formulae\n      return (first - 0xD800) * 0x400 + second - 0xDC00 + 0x10000;\n    }\n  }\n  return first;\n};\n\n// exports.codePointAt = function(str, position) {\n//   position = +position || 0;\n//   var x = str.charCodeAt(position);\n//   var y = str.length > 1 ? str.charCodeAt(position + 1) : 0;\n//   var point = x;\n//   if ((0xD800 <= x && x <= 0xDBFF) && (0xDC00 <= y && y <= 0xDFFF)) {\n//     x &= 0x3FF;\n//     y &= 0x3FF;\n//     point = (x << 10) | y;\n//     point += 0x10000;\n//   }\n//   return point;\n// };\n\nexports.fromCodePoint = function() {\n  if (String.fromCodePoint) {\n    return String.fromCodePoint.apply(String, arguments);\n  }\n  var MAX_SIZE = 0x4000;\n  var codeUnits = [];\n  var highSurrogate;\n  var lowSurrogate;\n  var index = -1;\n  var length = arguments.length;\n  if (!length) {\n    return '';\n  }\n  var result = '';\n  while (++index < length) {\n    var codePoint = Number(arguments[index]);\n    if (\n      !isFinite(codePoint) ||       // `NaN`, `+Infinity`, or `-Infinity`\n      codePoint < 0 ||              // not a valid Unicode code point\n      codePoint > 0x10FFFF ||       // not a valid Unicode code point\n      floor(codePoint) !== codePoint // not an integer\n    ) {\n      throw RangeError('Invalid code point: ' + codePoint);\n    }\n    if (codePoint <= 0xFFFF) { // BMP code point\n      codeUnits.push(codePoint);\n    } else { // Astral code point; split in surrogate halves\n      // http://mathiasbynens.be/notes/javascript-encoding#surrogate-formulae\n      codePoint -= 0x10000;\n      highSurrogate = (codePoint >> 10) + 0xD800;\n      lowSurrogate = (codePoint % 0x400) + 0xDC00;\n      codeUnits.push(highSurrogate, lowSurrogate);\n    }\n    if (index + 1 === length || codeUnits.length > MAX_SIZE) {\n      result += stringFromCharCode.apply(null, codeUnits);\n      codeUnits.length = 0;\n    }\n  }\n  return result;\n};\n\n/**\n * Regexes\n */\n\nexports.chars = {};\n\n// Double width characters that are _not_ surrogate pairs.\n// NOTE: 0x20000 - 0x2fffd and 0x30000 - 0x3fffd are not necessary for this\n// regex anyway. This regex is used to put a blank char after wide chars to\n// be eaten, however, if this is a surrogate pair, parseContent already adds\n// the extra one char because its length equals 2 instead of 1.\nexports.chars.wide = new RegExp('(['\n  + '\\\\u1100-\\\\u115f' // Hangul Jamo init. consonants\n  + '\\\\u2329\\\\u232a'\n  + '\\\\u2e80-\\\\u303e\\\\u3040-\\\\ua4cf' // CJK ... Yi\n  + '\\\\uac00-\\\\ud7a3' // Hangul Syllables\n  + '\\\\uf900-\\\\ufaff' // CJK Compatibility Ideographs\n  + '\\\\ufe10-\\\\ufe19' // Vertical forms\n  + '\\\\ufe30-\\\\ufe6f' // CJK Compatibility Forms\n  + '\\\\uff00-\\\\uff60' // Fullwidth Forms\n  + '\\\\uffe0-\\\\uffe6'\n  + '])', 'g');\n\n// All surrogate pair wide chars.\nexports.chars.swide = new RegExp('('\n  // 0x20000 - 0x2fffd:\n  + '[\\\\ud840-\\\\ud87f][\\\\udc00-\\\\udffd]'\n  + '|'\n  // 0x30000 - 0x3fffd:\n  + '[\\\\ud880-\\\\ud8bf][\\\\udc00-\\\\udffd]'\n  + ')', 'g');\n\n// All wide chars including surrogate pairs.\nexports.chars.all = new RegExp('('\n  + exports.chars.swide.source.slice(1, -1)\n  + '|'\n  + exports.chars.wide.source.slice(1, -1)\n  + ')', 'g');\n\n// Regex to detect a surrogate pair.\nexports.chars.surrogate = /[\\ud800-\\udbff][\\udc00-\\udfff]/g;\n\n// Regex to find combining characters.\nexports.chars.combining = exports.combiningTable.reduce(function(out, row) {\n  var low, high, range;\n  if (row[0] > 0x00ffff) {\n    low = exports.fromCodePoint(row[0]);\n    low = [\n      hexify(low.charCodeAt(0)),\n      hexify(low.charCodeAt(1))\n    ];\n    high = exports.fromCodePoint(row[1]);\n    high = [\n      hexify(high.charCodeAt(0)),\n      hexify(high.charCodeAt(1))\n    ];\n    range = '[\\\\u' + low[0] + '-' + '\\\\u' + high[0] + ']'\n          + '[\\\\u' + low[1] + '-' + '\\\\u' + high[1] + ']';\n    if (!~out.indexOf('|')) out += ']';\n    out += '|' + range;\n  } else {\n    low = hexify(row[0]);\n    high = hexify(row[1]);\n    low = '\\\\u' + low;\n    high = '\\\\u' + high;\n    out += low + '-' + high;\n  }\n  return out;\n}, '[');\n\nexports.chars.combining = new RegExp(exports.chars.combining, 'g');\n\nfunction hexify(n) {\n  n = n.toString(16);\n  while (n.length < 4) n = '0' + n;\n  return n;\n}\n\n/*\nexports.chars.combining = new RegExp(\n  '['\n  + '\\\\u0300-\\\\u036f'\n  + '\\\\u0483-\\\\u0486'\n  + '\\\\u0488-\\\\u0489'\n  + '\\\\u0591-\\\\u05bd'\n  + '\\\\u05bf-\\\\u05bf'\n  + '\\\\u05c1-\\\\u05c2'\n  + '\\\\u05c4-\\\\u05c5'\n  + '\\\\u05c7-\\\\u05c7'\n  + '\\\\u0600-\\\\u0603'\n  + '\\\\u0610-\\\\u0615'\n  + '\\\\u064b-\\\\u065e'\n  + '\\\\u0670-\\\\u0670'\n  + '\\\\u06d6-\\\\u06e4'\n  + '\\\\u06e7-\\\\u06e8'\n  + '\\\\u06ea-\\\\u06ed'\n  + '\\\\u070f-\\\\u070f'\n  + '\\\\u0711-\\\\u0711'\n  + '\\\\u0730-\\\\u074a'\n  + '\\\\u07a6-\\\\u07b0'\n  + '\\\\u07eb-\\\\u07f3'\n  + '\\\\u0901-\\\\u0902'\n  + '\\\\u093c-\\\\u093c'\n  + '\\\\u0941-\\\\u0948'\n  + '\\\\u094d-\\\\u094d'\n  + '\\\\u0951-\\\\u0954'\n  + '\\\\u0962-\\\\u0963'\n  + '\\\\u0981-\\\\u0981'\n  + '\\\\u09bc-\\\\u09bc'\n  + '\\\\u09c1-\\\\u09c4'\n  + '\\\\u09cd-\\\\u09cd'\n  + '\\\\u09e2-\\\\u09e3'\n  + '\\\\u0a01-\\\\u0a02'\n  + '\\\\u0a3c-\\\\u0a3c'\n  + '\\\\u0a41-\\\\u0a42'\n  + '\\\\u0a47-\\\\u0a48'\n  + '\\\\u0a4b-\\\\u0a4d'\n  + '\\\\u0a70-\\\\u0a71'\n  + '\\\\u0a81-\\\\u0a82'\n  + '\\\\u0abc-\\\\u0abc'\n  + '\\\\u0ac1-\\\\u0ac5'\n  + '\\\\u0ac7-\\\\u0ac8'\n  + '\\\\u0acd-\\\\u0acd'\n  + '\\\\u0ae2-\\\\u0ae3'\n  + '\\\\u0b01-\\\\u0b01'\n  + '\\\\u0b3c-\\\\u0b3c'\n  + '\\\\u0b3f-\\\\u0b3f'\n  + '\\\\u0b41-\\\\u0b43'\n  + '\\\\u0b4d-\\\\u0b4d'\n  + '\\\\u0b56-\\\\u0b56'\n  + '\\\\u0b82-\\\\u0b82'\n  + '\\\\u0bc0-\\\\u0bc0'\n  + '\\\\u0bcd-\\\\u0bcd'\n  + '\\\\u0c3e-\\\\u0c40'\n  + '\\\\u0c46-\\\\u0c48'\n  + '\\\\u0c4a-\\\\u0c4d'\n  + '\\\\u0c55-\\\\u0c56'\n  + '\\\\u0cbc-\\\\u0cbc'\n  + '\\\\u0cbf-\\\\u0cbf'\n  + '\\\\u0cc6-\\\\u0cc6'\n  + '\\\\u0ccc-\\\\u0ccd'\n  + '\\\\u0ce2-\\\\u0ce3'\n  + '\\\\u0d41-\\\\u0d43'\n  + '\\\\u0d4d-\\\\u0d4d'\n  + '\\\\u0dca-\\\\u0dca'\n  + '\\\\u0dd2-\\\\u0dd4'\n  + '\\\\u0dd6-\\\\u0dd6'\n  + '\\\\u0e31-\\\\u0e31'\n  + '\\\\u0e34-\\\\u0e3a'\n  + '\\\\u0e47-\\\\u0e4e'\n  + '\\\\u0eb1-\\\\u0eb1'\n  + '\\\\u0eb4-\\\\u0eb9'\n  + '\\\\u0ebb-\\\\u0ebc'\n  + '\\\\u0ec8-\\\\u0ecd'\n  + '\\\\u0f18-\\\\u0f19'\n  + '\\\\u0f35-\\\\u0f35'\n  + '\\\\u0f37-\\\\u0f37'\n  + '\\\\u0f39-\\\\u0f39'\n  + '\\\\u0f71-\\\\u0f7e'\n  + '\\\\u0f80-\\\\u0f84'\n  + '\\\\u0f86-\\\\u0f87'\n  + '\\\\u0f90-\\\\u0f97'\n  + '\\\\u0f99-\\\\u0fbc'\n  + '\\\\u0fc6-\\\\u0fc6'\n  + '\\\\u102d-\\\\u1030'\n  + '\\\\u1032-\\\\u1032'\n  + '\\\\u1036-\\\\u1037'\n  + '\\\\u1039-\\\\u1039'\n  + '\\\\u1058-\\\\u1059'\n  + '\\\\u1160-\\\\u11ff'\n  + '\\\\u135f-\\\\u135f'\n  + '\\\\u1712-\\\\u1714'\n  + '\\\\u1732-\\\\u1734'\n  + '\\\\u1752-\\\\u1753'\n  + '\\\\u1772-\\\\u1773'\n  + '\\\\u17b4-\\\\u17b5'\n  + '\\\\u17b7-\\\\u17bd'\n  + '\\\\u17c6-\\\\u17c6'\n  + '\\\\u17c9-\\\\u17d3'\n  + '\\\\u17dd-\\\\u17dd'\n  + '\\\\u180b-\\\\u180d'\n  + '\\\\u18a9-\\\\u18a9'\n  + '\\\\u1920-\\\\u1922'\n  + '\\\\u1927-\\\\u1928'\n  + '\\\\u1932-\\\\u1932'\n  + '\\\\u1939-\\\\u193b'\n  + '\\\\u1a17-\\\\u1a18'\n  + '\\\\u1b00-\\\\u1b03'\n  + '\\\\u1b34-\\\\u1b34'\n  + '\\\\u1b36-\\\\u1b3a'\n  + '\\\\u1b3c-\\\\u1b3c'\n  + '\\\\u1b42-\\\\u1b42'\n  + '\\\\u1b6b-\\\\u1b73'\n  + '\\\\u1dc0-\\\\u1dca'\n  + '\\\\u1dfe-\\\\u1dff'\n  + '\\\\u200b-\\\\u200f'\n  + '\\\\u202a-\\\\u202e'\n  + '\\\\u2060-\\\\u2063'\n  + '\\\\u206a-\\\\u206f'\n  + '\\\\u20d0-\\\\u20ef'\n  + '\\\\u302a-\\\\u302f'\n  + '\\\\u3099-\\\\u309a'\n  + '\\\\ua806-\\\\ua806'\n  + '\\\\ua80b-\\\\ua80b'\n  + '\\\\ua825-\\\\ua826'\n  + '\\\\ufb1e-\\\\ufb1e'\n  + '\\\\ufe00-\\\\ufe0f'\n  + '\\\\ufe20-\\\\ufe23'\n  + '\\\\ufeff-\\\\ufeff'\n  + '\\\\ufff9-\\\\ufffb'\n  + ']'\n  + '|[\\\\ud802-\\\\ud802][\\\\ude01-\\\\ude03]'\n  + '|[\\\\ud802-\\\\ud802][\\\\ude05-\\\\ude06]'\n  + '|[\\\\ud802-\\\\ud802][\\\\ude0c-\\\\ude0f]'\n  + '|[\\\\ud802-\\\\ud802][\\\\ude38-\\\\ude3a]'\n  + '|[\\\\ud802-\\\\ud802][\\\\ude3f-\\\\ude3f]'\n  + '|[\\\\ud834-\\\\ud834][\\\\udd67-\\\\udd69]'\n  + '|[\\\\ud834-\\\\ud834][\\\\udd73-\\\\udd82]'\n  + '|[\\\\ud834-\\\\ud834][\\\\udd85-\\\\udd8b]'\n  + '|[\\\\ud834-\\\\ud834][\\\\uddaa-\\\\uddad]'\n  + '|[\\\\ud834-\\\\ud834][\\\\ude42-\\\\ude44]'\n  + '|[\\\\udb40-\\\\udb40][\\\\udc01-\\\\udc01]'\n  + '|[\\\\udb40-\\\\udb40][\\\\udc20-\\\\udc7f]'\n  + '|[\\\\udb40-\\\\udb40][\\\\udd00-\\\\uddef]'\n, 'g');\n*/\n"
  },
  {
    "path": "lib/widget.js",
    "content": "/**\n * widget.js - high-level interface for blessed\n * Copyright (c) 2013-2015, Christopher Jeffrey and contributors (MIT License).\n * https://github.com/chjj/blessed\n */\n\nvar widget = exports;\n\nwidget.classes = [\n  'Node',\n  'Screen',\n  'Element',\n  'Box',\n  'Text',\n  'Line',\n  'ScrollableBox',\n  'ScrollableText',\n  'BigText',\n  'List',\n  'Form',\n  'Input',\n  'Textarea',\n  'Textbox',\n  'Button',\n  'ProgressBar',\n  'FileManager',\n  'Checkbox',\n  'RadioSet',\n  'RadioButton',\n  'Prompt',\n  'Question',\n  'Message',\n  'Loading',\n  'Listbar',\n  'Log',\n  'Table',\n  'ListTable',\n  'Terminal',\n  'Image',\n  'ANSIImage',\n  'OverlayImage',\n  'Video',\n  'Layout'\n];\n\nwidget.classes.forEach(function(name) {\n  var file = name.toLowerCase();\n  widget[name] = widget[file] = require('./widgets/' + file);\n});\n\nwidget.aliases = {\n  'ListBar': 'Listbar',\n  'PNG': 'ANSIImage'\n};\n\nObject.keys(widget.aliases).forEach(function(key) {\n  var name = widget.aliases[key];\n  widget[key] = widget[name];\n  widget[key.toLowerCase()] = widget[name];\n});\n"
  },
  {
    "path": "lib/widgets/ansiimage.js",
    "content": "/**\n * ansiimage.js - render PNGS/GIFS as ANSI\n * Copyright (c) 2013-2015, Christopher Jeffrey and contributors (MIT License).\n * https://github.com/chjj/blessed\n */\n\n/**\n * Modules\n */\n\nvar cp = require('child_process');\n\nvar colors = require('../colors');\n\nvar Node = require('./node');\nvar Box = require('./box');\n\nvar tng = require('../../vendor/tng');\n\n/**\n * ANSIImage\n */\n\nfunction ANSIImage(options) {\n  var self = this;\n\n  if (!(this instanceof Node)) {\n    return new ANSIImage(options);\n  }\n\n  options = options || {};\n  options.shrink = true;\n\n  Box.call(this, options);\n\n  this.scale = this.options.scale || 1.0;\n  this.options.animate = this.options.animate !== false;\n  this._noFill = true;\n\n  if (this.options.file) {\n    this.setImage(this.options.file);\n  }\n\n  this.screen.on('prerender', function() {\n    var lpos = self.lpos;\n    if (!lpos) return;\n    // prevent image from blending with itself if there are alpha channels\n    self.screen.clearRegion(lpos.xi, lpos.xl, lpos.yi, lpos.yl);\n  });\n\n  this.on('destroy', function() {\n    self.stop();\n  });\n}\n\nANSIImage.prototype.__proto__ = Box.prototype;\n\nANSIImage.prototype.type = 'ansiimage';\n\nANSIImage.curl = function(url) {\n  try {\n    return cp.execFileSync('curl',\n      ['-s', '-A', '', url],\n      { stdio: ['ignore', 'pipe', 'ignore'] });\n  } catch (e) {\n    ;\n  }\n  try {\n    return cp.execFileSync('wget',\n      ['-U', '', '-O', '-', url],\n      { stdio: ['ignore', 'pipe', 'ignore'] });\n  } catch (e) {\n    ;\n  }\n  throw new Error('curl or wget failed.');\n};\n\nANSIImage.prototype.setImage = function(file) {\n  this.file = typeof file === 'string' ? file : null;\n\n  if (/^https?:/.test(file)) {\n    file = ANSIImage.curl(file);\n  }\n\n  var width = this.position.width;\n  var height = this.position.height;\n\n  if (width != null) {\n    width = this.width;\n  }\n\n  if (height != null) {\n    height = this.height;\n  }\n\n  try {\n    this.setContent('');\n\n    this.img = tng(file, {\n      colors: colors,\n      width: width,\n      height: height,\n      scale: this.scale,\n      ascii: this.options.ascii,\n      speed: this.options.speed,\n      filename: this.file\n    });\n\n    if (width == null || height == null) {\n      this.width = this.img.cellmap[0].length;\n      this.height = this.img.cellmap.length;\n    }\n\n    if (this.img.frames && this.options.animate) {\n      this.play();\n    } else {\n      this.cellmap = this.img.cellmap;\n    }\n  } catch (e) {\n    this.setContent('Image Error: ' + e.message);\n    this.img = null;\n    this.cellmap = null;\n  }\n};\n\nANSIImage.prototype.play = function() {\n  var self = this;\n  if (!this.img) return;\n  return this.img.play(function(bmp, cellmap) {\n    self.cellmap = cellmap;\n    self.screen.render();\n  });\n};\n\nANSIImage.prototype.pause = function() {\n  if (!this.img) return;\n  return this.img.pause();\n};\n\nANSIImage.prototype.stop = function() {\n  if (!this.img) return;\n  return this.img.stop();\n};\n\nANSIImage.prototype.clearImage = function() {\n  this.stop();\n  this.setContent('');\n  this.img = null;\n  this.cellmap = null;\n};\n\nANSIImage.prototype.render = function() {\n  var coords = this._render();\n  if (!coords) return;\n\n  if (this.img && this.cellmap) {\n    this.img.renderElement(this.cellmap, this);\n  }\n\n  return coords;\n};\n\n/**\n * Expose\n */\n\nmodule.exports = ANSIImage;\n"
  },
  {
    "path": "lib/widgets/bigtext.js",
    "content": "/**\n * bigtext.js - bigtext element for blessed\n * Copyright (c) 2013-2015, Christopher Jeffrey and contributors (MIT License).\n * https://github.com/chjj/blessed\n */\n\n/**\n * Modules\n */\n\nvar fs = require('fs');\n\nvar Node = require('./node');\nvar Box = require('./box');\n\n/**\n * BigText\n */\n\nfunction BigText(options) {\n  if (!(this instanceof Node)) {\n    return new BigText(options);\n  }\n  options = options || {};\n  options.font = options.font\n    || __dirname + '/../../usr/fonts/ter-u14n.json';\n  options.fontBold = options.font\n    || __dirname + '/../../usr/fonts/ter-u14b.json';\n  this.fch = options.fch;\n  this.ratio = {};\n  this.font = this.loadFont(options.font);\n  this.fontBold = this.loadFont(options.font);\n  Box.call(this, options);\n  if (this.style.bold) {\n    this.font = this.fontBold;\n  }\n}\n\nBigText.prototype.__proto__ = Box.prototype;\n\nBigText.prototype.type = 'bigtext';\n\nBigText.prototype.loadFont = function(filename) {\n  var self = this\n    , data\n    , font;\n\n  data = JSON.parse(fs.readFileSync(filename, 'utf8'));\n\n  this.ratio.width = data.width;\n  this.ratio.height = data.height;\n\n  function convertLetter(ch, lines) {\n    var line, i;\n\n    while (lines.length > self.ratio.height) {\n      lines.shift();\n      lines.pop();\n    }\n\n    lines = lines.map(function(line) {\n      var chs = line.split('');\n      chs = chs.map(function(ch) {\n        return ch === ' ' ? 0 : 1;\n      });\n      while (chs.length < self.ratio.width) {\n        chs.push(0);\n      }\n      return chs;\n    });\n\n    while (lines.length < self.ratio.height) {\n      line = [];\n      for (i = 0; i < self.ratio.width; i++) {\n        line.push(0);\n      }\n      lines.push(line);\n    }\n\n    return lines;\n  }\n\n  font = Object.keys(data.glyphs).reduce(function(out, ch) {\n    var lines = data.glyphs[ch].map;\n    out[ch] = convertLetter(ch, lines);\n    return out;\n  }, {});\n\n  delete font[' '];\n\n  return font;\n};\n\nBigText.prototype.setContent = function(content) {\n  this.content = '';\n  this.text = content || '';\n};\n\nBigText.prototype.render = function() {\n  if (this.position.width == null || this._shrinkWidth) {\n    // if (this.width - this.iwidth < this.ratio.width * this.text.length + 1) {\n      this.position.width = this.ratio.width * this.text.length + 1;\n      this._shrinkWidth = true;\n    // }\n  }\n  if (this.position.height == null || this._shrinkHeight) {\n    // if (this.height - this.iheight < this.ratio.height + 0) {\n      this.position.height = this.ratio.height + 0;\n      this._shrinkHeight = true;\n    // }\n  }\n\n  var coords = this._render();\n  if (!coords) return;\n\n  var lines = this.screen.lines\n    , left = coords.xi + this.ileft\n    , top = coords.yi + this.itop\n    , right = coords.xl - this.iright\n    , bottom = coords.yl - this.ibottom;\n\n  var dattr = this.sattr(this.style)\n    , bg = dattr & 0x1ff\n    , fg = (dattr >> 9) & 0x1ff\n    , flags = (dattr >> 18) & 0x1ff\n    , attr = (flags << 18) | (bg << 9) | fg;\n\n  for (var x = left, i = 0; x < right; x += this.ratio.width, i++) {\n    var ch = this.text[i];\n    if (!ch) break;\n    var map = this.font[ch];\n    if (!map) continue;\n    for (var y = top; y < Math.min(bottom, top + this.ratio.height); y++) {\n      if (!lines[y]) continue;\n      var mline = map[y - top];\n      if (!mline) continue;\n      for (var mx = 0; mx < this.ratio.width; mx++) {\n        var mcell = mline[mx];\n        if (mcell == null) break;\n        if (this.fch && this.fch !== ' ') {\n          lines[y][x + mx][0] = dattr;\n          lines[y][x + mx][1] = mcell === 1 ? this.fch : this.ch;\n        } else {\n          lines[y][x + mx][0] = mcell === 1 ? attr : dattr;\n          lines[y][x + mx][1] = mcell === 1 ? ' ' : this.ch;\n        }\n      }\n      lines[y].dirty = true;\n    }\n  }\n\n  return coords;\n};\n\n/**\n * Expose\n */\n\nmodule.exports = BigText;\n"
  },
  {
    "path": "lib/widgets/box.js",
    "content": "/**\n * box.js - box element for blessed\n * Copyright (c) 2013-2015, Christopher Jeffrey and contributors (MIT License).\n * https://github.com/chjj/blessed\n */\n\n/**\n * Modules\n */\n\nvar Node = require('./node');\nvar Element = require('./element');\n\n/**\n * Box\n */\n\nfunction Box(options) {\n  if (!(this instanceof Node)) {\n    return new Box(options);\n  }\n  options = options || {};\n  Element.call(this, options);\n}\n\nBox.prototype.__proto__ = Element.prototype;\n\nBox.prototype.type = 'box';\n\n/**\n * Expose\n */\n\nmodule.exports = Box;\n"
  },
  {
    "path": "lib/widgets/button.js",
    "content": "/**\n * button.js - button element for blessed\n * Copyright (c) 2013-2015, Christopher Jeffrey and contributors (MIT License).\n * https://github.com/chjj/blessed\n */\n\n/**\n * Modules\n */\n\nvar Node = require('./node');\nvar Input = require('./input');\n\n/**\n * Button\n */\n\nfunction Button(options) {\n  var self = this;\n\n  if (!(this instanceof Node)) {\n    return new Button(options);\n  }\n\n  options = options || {};\n\n  if (options.autoFocus == null) {\n    options.autoFocus = false;\n  }\n\n  Input.call(this, options);\n\n  this.on('keypress', function(ch, key) {\n    if (key.name === 'enter' || key.name === 'space') {\n      return self.press();\n    }\n  });\n\n  if (this.options.mouse) {\n    this.on('click', function() {\n      return self.press();\n    });\n  }\n}\n\nButton.prototype.__proto__ = Input.prototype;\n\nButton.prototype.type = 'button';\n\nButton.prototype.press = function() {\n  this.focus();\n  this.value = true;\n  var result = this.emit('press');\n  delete this.value;\n  return result;\n};\n\n/**\n * Expose\n */\n\nmodule.exports = Button;\n"
  },
  {
    "path": "lib/widgets/checkbox.js",
    "content": "/**\n * checkbox.js - checkbox element for blessed\n * Copyright (c) 2013-2015, Christopher Jeffrey and contributors (MIT License).\n * https://github.com/chjj/blessed\n */\n\n/**\n * Modules\n */\n\nvar Node = require('./node');\nvar Input = require('./input');\n\n/**\n * Checkbox\n */\n\nfunction Checkbox(options) {\n  var self = this;\n\n  if (!(this instanceof Node)) {\n    return new Checkbox(options);\n  }\n\n  options = options || {};\n\n  Input.call(this, options);\n\n  this.text = options.content || options.text || '';\n  this.checked = this.value = options.checked || false;\n\n  this.on('keypress', function(ch, key) {\n    if (key.name === 'enter' || key.name === 'space') {\n      self.toggle();\n      self.screen.render();\n    }\n  });\n\n  if (options.mouse) {\n    this.on('click', function() {\n      self.toggle();\n      self.screen.render();\n    });\n  }\n\n  this.on('focus', function() {\n    var lpos = self.lpos;\n    if (!lpos) return;\n    self.screen.program.lsaveCursor('checkbox');\n    self.screen.program.cup(lpos.yi, lpos.xi + 1);\n    self.screen.program.showCursor();\n  });\n\n  this.on('blur', function() {\n    self.screen.program.lrestoreCursor('checkbox', true);\n  });\n}\n\nCheckbox.prototype.__proto__ = Input.prototype;\n\nCheckbox.prototype.type = 'checkbox';\n\nCheckbox.prototype.render = function() {\n  this.clearPos(true);\n  this.setContent('[' + (this.checked ? 'x' : ' ') + '] ' + this.text, true);\n  return this._render();\n};\n\nCheckbox.prototype.check = function() {\n  if (this.checked) return;\n  this.checked = this.value = true;\n  this.emit('check');\n};\n\nCheckbox.prototype.uncheck = function() {\n  if (!this.checked) return;\n  this.checked = this.value = false;\n  this.emit('uncheck');\n};\n\nCheckbox.prototype.toggle = function() {\n  return this.checked\n    ? this.uncheck()\n    : this.check();\n};\n\n/**\n * Expose\n */\n\nmodule.exports = Checkbox;\n"
  },
  {
    "path": "lib/widgets/element.js",
    "content": "/**\n * element.js - base element for blessed\n * Copyright (c) 2013-2015, Christopher Jeffrey and contributors (MIT License).\n * https://github.com/chjj/blessed\n */\n\n/**\n * Modules\n */\n\nvar assert = require('assert');\n\nvar colors = require('../colors')\n  , unicode = require('../unicode');\n\nvar nextTick = global.setImmediate || process.nextTick.bind(process);\n\nvar helpers = require('../helpers');\n\nvar Node = require('./node');\n\n/**\n * Element\n */\n\nfunction Element(options) {\n  var self = this;\n\n  if (!(this instanceof Node)) {\n    return new Element(options);\n  }\n\n  options = options || {};\n\n  // Workaround to get a `scrollable` option.\n  if (options.scrollable && !this._ignore && this.type !== 'scrollable-box') {\n    var ScrollableBox = require('./scrollablebox');\n    Object.getOwnPropertyNames(ScrollableBox.prototype).forEach(function(key) {\n      if (key === 'type') return;\n      Object.defineProperty(this, key,\n        Object.getOwnPropertyDescriptor(ScrollableBox.prototype, key));\n    }, this);\n    this._ignore = true;\n    ScrollableBox.call(this, options);\n    delete this._ignore;\n    return this;\n  }\n\n  Node.call(this, options);\n\n  this.name = options.name;\n\n  options.position = options.position || {\n    left: options.left,\n    right: options.right,\n    top: options.top,\n    bottom: options.bottom,\n    width: options.width,\n    height: options.height\n  };\n\n  if (options.position.width === 'shrink'\n      || options.position.height === 'shrink') {\n    if (options.position.width === 'shrink') {\n      delete options.position.width;\n    }\n    if (options.position.height === 'shrink') {\n      delete options.position.height;\n    }\n    options.shrink = true;\n  }\n\n  this.position = options.position;\n\n  this.noOverflow = options.noOverflow;\n  this.dockBorders = options.dockBorders;\n  this.shadow = options.shadow;\n\n  this.style = options.style;\n\n  if (!this.style) {\n    this.style = {};\n    this.style.fg = options.fg;\n    this.style.bg = options.bg;\n    this.style.bold = options.bold;\n    this.style.underline = options.underline;\n    this.style.blink = options.blink;\n    this.style.inverse = options.inverse;\n    this.style.invisible = options.invisible;\n    this.style.transparent = options.transparent;\n  }\n\n  this.hidden = options.hidden || false;\n  this.fixed = options.fixed || false;\n  this.align = options.align || 'left';\n  this.valign = options.valign || 'top';\n  this.wrap = options.wrap !== false;\n  this.shrink = options.shrink;\n  this.fixed = options.fixed;\n  this.ch = options.ch || ' ';\n\n  if (typeof options.padding === 'number' || !options.padding) {\n    options.padding = {\n      left: options.padding,\n      top: options.padding,\n      right: options.padding,\n      bottom: options.padding\n    };\n  }\n\n  this.padding = {\n    left: options.padding.left || 0,\n    top: options.padding.top || 0,\n    right: options.padding.right || 0,\n    bottom: options.padding.bottom || 0\n  };\n\n  this.border = options.border;\n  if (this.border) {\n    if (typeof this.border === 'string') {\n      this.border = { type: this.border };\n    }\n    this.border.type = this.border.type || 'bg';\n    if (this.border.type === 'ascii') this.border.type = 'line';\n    this.border.ch = this.border.ch || ' ';\n    this.style.border = this.style.border || this.border.style;\n    if (!this.style.border) {\n      this.style.border = {};\n      this.style.border.fg = this.border.fg;\n      this.style.border.bg = this.border.bg;\n    }\n    //this.border.style = this.style.border;\n    if (this.border.left == null) this.border.left = true;\n    if (this.border.top == null) this.border.top = true;\n    if (this.border.right == null) this.border.right = true;\n    if (this.border.bottom == null) this.border.bottom = true;\n  }\n\n  // if (options.mouse || options.clickable) {\n  if (options.clickable) {\n    this.screen._listenMouse(this);\n  }\n\n  if (options.input || options.keyable) {\n    this.screen._listenKeys(this);\n  }\n\n  this.parseTags = options.parseTags || options.tags;\n\n  this.setContent(options.content || '', true);\n\n  if (options.label) {\n    this.setLabel(options.label);\n  }\n\n  if (options.hoverText) {\n    this.setHover(options.hoverText);\n  }\n\n  // TODO: Possibly move this to Node for onScreenEvent('mouse', ...).\n  this.on('newListener', function fn(type) {\n    // type = type.split(' ').slice(1).join(' ');\n    if (type === 'mouse'\n      || type === 'click'\n      || type === 'mouseover'\n      || type === 'mouseout'\n      || type === 'mousedown'\n      || type === 'mouseup'\n      || type === 'mousewheel'\n      || type === 'wheeldown'\n      || type === 'wheelup'\n      || type === 'mousemove') {\n      self.screen._listenMouse(self);\n    } else if (type === 'keypress' || type.indexOf('key ') === 0) {\n      self.screen._listenKeys(self);\n    }\n  });\n\n  this.on('resize', function() {\n    self.parseContent();\n  });\n\n  this.on('attach', function() {\n    self.parseContent();\n  });\n\n  this.on('detach', function() {\n    delete self.lpos;\n  });\n\n  if (options.hoverBg != null) {\n    options.hoverEffects = options.hoverEffects || {};\n    options.hoverEffects.bg = options.hoverBg;\n  }\n\n  if (this.style.hover) {\n    options.hoverEffects = this.style.hover;\n  }\n\n  if (this.style.focus) {\n    options.focusEffects = this.style.focus;\n  }\n\n  if (options.effects) {\n    if (options.effects.hover) options.hoverEffects = options.effects.hover;\n    if (options.effects.focus) options.focusEffects = options.effects.focus;\n  }\n\n  [['hoverEffects', 'mouseover', 'mouseout', '_htemp'],\n   ['focusEffects', 'focus', 'blur', '_ftemp']].forEach(function(props) {\n    var pname = props[0], over = props[1], out = props[2], temp = props[3];\n    self.screen.setEffects(self, self, over, out, self.options[pname], temp);\n  });\n\n  if (this.options.draggable) {\n    this.draggable = true;\n  }\n\n  if (options.focused) {\n    this.focus();\n  }\n}\n\nElement.prototype.__proto__ = Node.prototype;\n\nElement.prototype.type = 'element';\n\nElement.prototype.__defineGetter__('focused', function() {\n  return this.screen.focused === this;\n});\n\nElement.prototype.sattr = function(style, fg, bg) {\n  var bold = style.bold\n    , underline = style.underline\n    , blink = style.blink\n    , inverse = style.inverse\n    , invisible = style.invisible;\n\n  // if (arguments.length === 1) {\n  if (fg == null && bg == null) {\n    fg = style.fg;\n    bg = style.bg;\n  }\n\n  // This used to be a loop, but I decided\n  // to unroll it for performance's sake.\n  if (typeof bold === 'function') bold = bold(this);\n  if (typeof underline === 'function') underline = underline(this);\n  if (typeof blink === 'function') blink = blink(this);\n  if (typeof inverse === 'function') inverse = inverse(this);\n  if (typeof invisible === 'function') invisible = invisible(this);\n\n  if (typeof fg === 'function') fg = fg(this);\n  if (typeof bg === 'function') bg = bg(this);\n\n  // return (this.uid << 24)\n  //   | ((this.dockBorders ? 32 : 0) << 18)\n  return ((invisible ? 16 : 0) << 18)\n    | ((inverse ? 8 : 0) << 18)\n    | ((blink ? 4 : 0) << 18)\n    | ((underline ? 2 : 0) << 18)\n    | ((bold ? 1 : 0) << 18)\n    | (colors.convert(fg) << 9)\n    | colors.convert(bg);\n};\n\nElement.prototype.onScreenEvent = function(type, handler) {\n  var listeners = this._slisteners = this._slisteners || [];\n  listeners.push({ type: type, handler: handler });\n  this.screen.on(type, handler);\n};\n\nElement.prototype.onceScreenEvent = function(type, handler) {\n  var listeners = this._slisteners = this._slisteners || [];\n  var entry = { type: type, handler: handler };\n  listeners.push(entry);\n  this.screen.once(type, function() {\n    var i = listeners.indexOf(entry);\n    if (~i) listeners.splice(i, 1);\n    return handler.apply(this, arguments);\n  });\n};\n\nElement.prototype.removeScreenEvent = function(type, handler) {\n  var listeners = this._slisteners = this._slisteners || [];\n  for (var i = 0; i < listeners.length; i++) {\n    var listener = listeners[i];\n    if (listener.type === type && listener.handler === handler) {\n      listeners.splice(i, 1);\n      if (this._slisteners.length === 0) {\n        delete this._slisteners;\n      }\n      break;\n    }\n  }\n  this.screen.removeListener(type, handler);\n};\n\nElement.prototype.free = function() {\n  var listeners = this._slisteners = this._slisteners || [];\n  for (var i = 0; i < listeners.length; i++) {\n    var listener = listeners[i];\n    this.screen.removeListener(listener.type, listener.handler);\n  }\n  delete this._slisteners;\n};\n\nElement.prototype.hide = function() {\n  if (this.hidden) return;\n  this.clearPos();\n  this.hidden = true;\n  this.emit('hide');\n  if (this.screen.focused === this) {\n    this.screen.rewindFocus();\n  }\n};\n\nElement.prototype.show = function() {\n  if (!this.hidden) return;\n  this.hidden = false;\n  this.emit('show');\n};\n\nElement.prototype.toggle = function() {\n  return this.hidden ? this.show() : this.hide();\n};\n\nElement.prototype.focus = function() {\n  return this.screen.focused = this;\n};\n\nElement.prototype.setContent = function(content, noClear, noTags) {\n  if (!noClear) this.clearPos();\n  this.content = content || '';\n  this.parseContent(noTags);\n  this.emit('set content');\n};\n\nElement.prototype.getContent = function() {\n  if (!this._clines) return '';\n  return this._clines.fake.join('\\n');\n};\n\nElement.prototype.setText = function(content, noClear) {\n  content = content || '';\n  content = content.replace(/\\x1b\\[[\\d;]*m/g, '');\n  return this.setContent(content, noClear, true);\n};\n\nElement.prototype.getText = function() {\n  return this.getContent().replace(/\\x1b\\[[\\d;]*m/g, '');\n};\n\nElement.prototype.parseContent = function(noTags) {\n  if (this.detached) return false;\n\n  var width = this.width - this.iwidth;\n  if (this._clines == null\n      || this._clines.width !== width\n      || this._clines.content !== this.content) {\n    var content = this.content;\n\n    content = content\n      .replace(/[\\x00-\\x08\\x0b-\\x0c\\x0e-\\x1a\\x1c-\\x1f\\x7f]/g, '')\n      .replace(/\\x1b(?!\\[[\\d;]*m)/g, '')\n      .replace(/\\r\\n|\\r/g, '\\n')\n      .replace(/\\t/g, this.screen.tabc);\n\n    if (this.screen.fullUnicode) {\n      // double-width chars will eat the next char after render. create a\n      // blank character after it so it doesn't eat the real next char.\n      content = content.replace(unicode.chars.all, '$1\\x03');\n      // iTerm2 cannot render combining characters properly.\n      if (this.screen.program.isiTerm2) {\n        content = content.replace(unicode.chars.combining, '');\n      }\n    } else {\n      // no double-width: replace them with question-marks.\n      content = content.replace(unicode.chars.all, '??');\n      // delete combining characters since they're 0-width anyway.\n      // NOTE: We could drop this, the non-surrogates would get changed to ? by\n      // the unicode filter, and surrogates changed to ? by the surrogate\n      // regex. however, the user might expect them to be 0-width.\n      // NOTE: Might be better for performance to drop!\n      content = content.replace(unicode.chars.combining, '');\n      // no surrogate pairs: replace them with question-marks.\n      content = content.replace(unicode.chars.surrogate, '?');\n      // XXX Deduplicate code here:\n      // content = helpers.dropUnicode(content);\n    }\n\n    if (!noTags) {\n      content = this._parseTags(content);\n    }\n\n    this._clines = this._wrapContent(content, width);\n    this._clines.width = width;\n    this._clines.content = this.content;\n    this._clines.attr = this._parseAttr(this._clines);\n    this._clines.ci = [];\n    this._clines.reduce(function(total, line) {\n      this._clines.ci.push(total);\n      return total + line.length + 1;\n    }.bind(this), 0);\n\n    this._pcontent = this._clines.join('\\n');\n    this.emit('parsed content');\n\n    return true;\n  }\n\n  // Need to calculate this every time because the default fg/bg may change.\n  this._clines.attr = this._parseAttr(this._clines) || this._clines.attr;\n\n  return false;\n};\n\n// Convert `{red-fg}foo{/red-fg}` to `\\x1b[31mfoo\\x1b[39m`.\nElement.prototype._parseTags = function(text) {\n  if (!this.parseTags) return text;\n  if (!/{\\/?[\\w\\-,;!#]*}/.test(text)) return text;\n\n  var program = this.screen.program\n    , out = ''\n    , state\n    , bg = []\n    , fg = []\n    , flag = []\n    , cap\n    , slash\n    , param\n    , attr\n    , esc;\n\n  for (;;) {\n    if (!esc && (cap = /^{escape}/.exec(text))) {\n      text = text.substring(cap[0].length);\n      esc = true;\n      continue;\n    }\n\n    if (esc && (cap = /^([\\s\\S]+?){\\/escape}/.exec(text))) {\n      text = text.substring(cap[0].length);\n      out += cap[1];\n      esc = false;\n      continue;\n    }\n\n    if (esc) {\n      // throw new Error('Unterminated escape tag.');\n      out += text;\n      break;\n    }\n\n    if (cap = /^{(\\/?)([\\w\\-,;!#]*)}/.exec(text)) {\n      text = text.substring(cap[0].length);\n      slash = cap[1] === '/';\n      param = cap[2].replace(/-/g, ' ');\n\n      if (param === 'open') {\n        out += '{';\n        continue;\n      } else if (param === 'close') {\n        out += '}';\n        continue;\n      }\n\n      if (param.slice(-3) === ' bg') state = bg;\n      else if (param.slice(-3) === ' fg') state = fg;\n      else state = flag;\n\n      if (slash) {\n        if (!param) {\n          out += program._attr('normal');\n          bg.length = 0;\n          fg.length = 0;\n          flag.length = 0;\n        } else {\n          attr = program._attr(param, false);\n          if (attr == null) {\n            out += cap[0];\n          } else {\n            // if (param !== state[state.length - 1]) {\n            //   throw new Error('Misnested tags.');\n            // }\n            state.pop();\n            if (state.length) {\n              out += program._attr(state[state.length - 1]);\n            } else {\n              out += attr;\n            }\n          }\n        }\n      } else {\n        if (!param) {\n          out += cap[0];\n        } else {\n          attr = program._attr(param);\n          if (attr == null) {\n            out += cap[0];\n          } else {\n            state.push(param);\n            out += attr;\n          }\n        }\n      }\n\n      continue;\n    }\n\n    if (cap = /^[\\s\\S]+?(?={\\/?[\\w\\-,;!#]*})/.exec(text)) {\n      text = text.substring(cap[0].length);\n      out += cap[0];\n      continue;\n    }\n\n    out += text;\n    break;\n  }\n\n  return out;\n};\n\nElement.prototype._parseAttr = function(lines) {\n  var dattr = this.sattr(this.style)\n    , attr = dattr\n    , attrs = []\n    , line\n    , i\n    , j\n    , c;\n\n  if (lines[0].attr === attr) {\n    return;\n  }\n\n  for (j = 0; j < lines.length; j++) {\n    line = lines[j];\n    attrs[j] = attr;\n    for (i = 0; i < line.length; i++) {\n      if (line[i] === '\\x1b') {\n        if (c = /^\\x1b\\[[\\d;]*m/.exec(line.substring(i))) {\n          attr = this.screen.attrCode(c[0], attr, dattr);\n          i += c[0].length - 1;\n        }\n      }\n    }\n  }\n\n  return attrs;\n};\n\nElement.prototype._align = function(line, width, align) {\n  if (!align) return line;\n  //if (!align && !~line.indexOf('{|}')) return line;\n\n  var cline = line.replace(/\\x1b\\[[\\d;]*m/g, '')\n    , len = cline.length\n    , s = width - len;\n\n  if (this.shrink) {\n    s = 0;\n  }\n\n  if (len === 0) return line;\n  if (s < 0) return line;\n\n  if (align === 'center') {\n    s = Array(((s / 2) | 0) + 1).join(' ');\n    return s + line + s;\n  } else if (align === 'right') {\n    s = Array(s + 1).join(' ');\n    return s + line;\n  } else if (this.parseTags && ~line.indexOf('{|}')) {\n    var parts = line.split('{|}');\n    var cparts = cline.split('{|}');\n    s = Math.max(width - cparts[0].length - cparts[1].length, 0);\n    s = Array(s + 1).join(' ');\n    return parts[0] + s + parts[1];\n  }\n\n  return line;\n};\n\nElement.prototype._wrapContent = function(content, width) {\n  var tags = this.parseTags\n    , state = this.align\n    , wrap = this.wrap\n    , margin = 0\n    , rtof = []\n    , ftor = []\n    , out = []\n    , no = 0\n    , line\n    , align\n    , cap\n    , total\n    , i\n    , part\n    , j\n    , lines\n    , rest;\n\n  lines = content.split('\\n');\n\n  if (!content) {\n    out.push(content);\n    out.rtof = [0];\n    out.ftor = [[0]];\n    out.fake = lines;\n    out.real = out;\n    out.mwidth = 0;\n    return out;\n  }\n\n  if (this.scrollbar) margin++;\n  if (this.type === 'textarea') margin++;\n  if (width > margin) width -= margin;\n\nmain:\n  for (; no < lines.length; no++) {\n    line = lines[no];\n    align = state;\n\n    ftor.push([]);\n\n    // Handle alignment tags.\n    if (tags) {\n      if (cap = /^{(left|center|right)}/.exec(line)) {\n        line = line.substring(cap[0].length);\n        align = state = cap[1] !== 'left'\n          ? cap[1]\n          : null;\n      }\n      if (cap = /{\\/(left|center|right)}$/.exec(line)) {\n        line = line.slice(0, -cap[0].length);\n        //state = null;\n        state = this.align;\n      }\n    }\n\n    // If the string is apparently too long, wrap it.\n    while (line.length > width) {\n      // Measure the real width of the string.\n      for (i = 0, total = 0; i < line.length; i++) {\n        while (line[i] === '\\x1b') {\n          while (line[i] && line[i++] !== 'm');\n        }\n        if (!line[i]) break;\n        if (++total === width) {\n          // If we're not wrapping the text, we have to finish up the rest of\n          // the control sequences before cutting off the line.\n          i++;\n          if (!wrap) {\n            rest = line.substring(i).match(/\\x1b\\[[^m]*m/g);\n            rest = rest ? rest.join('') : '';\n            out.push(this._align(line.substring(0, i) + rest, width, align));\n            ftor[no].push(out.length - 1);\n            rtof.push(no);\n            continue main;\n          }\n          if (!this.screen.fullUnicode) {\n            // Try to find a space to break on.\n            if (i !== line.length) {\n              j = i;\n              while (j > i - 10 && j > 0 && line[--j] !== ' ');\n              if (line[j] === ' ') i = j + 1;\n            }\n          } else {\n            // Try to find a character to break on.\n            if (i !== line.length) {\n              // <XXX>\n              // Compensate for surrogate length\n              // counts on wrapping (experimental):\n              // NOTE: Could optimize this by putting\n              // it in the parent for loop.\n              if (unicode.isSurrogate(line, i)) i--;\n              for (var s = 0, n = 0; n < i; n++) {\n                if (unicode.isSurrogate(line, n)) s++, n++;\n              }\n              i += s;\n              // </XXX>\n              j = i;\n              // Break _past_ space.\n              // Break _past_ double-width chars.\n              // Break _past_ surrogate pairs.\n              // Break _past_ combining chars.\n              while (j > i - 10 && j > 0) {\n                j--;\n                if (line[j] === ' '\n                    || line[j] === '\\x03'\n                    || (unicode.isSurrogate(line, j - 1) && line[j + 1] !== '\\x03')\n                    || unicode.isCombining(line, j)) {\n                  break;\n                }\n              }\n              if (line[j] === ' '\n                  || line[j] === '\\x03'\n                  || (unicode.isSurrogate(line, j - 1) && line[j + 1] !== '\\x03')\n                  || unicode.isCombining(line, j)) {\n                i = j + 1;\n              }\n            }\n          }\n          break;\n        }\n      }\n\n      part = line.substring(0, i);\n      line = line.substring(i);\n\n      out.push(this._align(part, width, align));\n      ftor[no].push(out.length - 1);\n      rtof.push(no);\n\n      // Make sure we didn't wrap the line to the very end, otherwise\n      // we get a pointless empty line after a newline.\n      if (line === '') continue main;\n\n      // If only an escape code got cut off, at it to `part`.\n      if (/^(?:\\x1b[\\[\\d;]*m)+$/.test(line)) {\n        out[out.length - 1] += line;\n        continue main;\n      }\n    }\n\n    out.push(this._align(line, width, align));\n    ftor[no].push(out.length - 1);\n    rtof.push(no);\n  }\n\n  out.rtof = rtof;\n  out.ftor = ftor;\n  out.fake = lines;\n  out.real = out;\n\n  out.mwidth = out.reduce(function(current, line) {\n    line = line.replace(/\\x1b\\[[\\d;]*m/g, '');\n    return line.length > current\n      ? line.length\n      : current;\n  }, 0);\n\n  return out;\n};\n\nElement.prototype.__defineGetter__('visible', function() {\n  var el = this;\n  do {\n    if (el.detached) return false;\n    if (el.hidden) return false;\n    // if (!el.lpos) return false;\n    // if (el.position.width === 0 || el.position.height === 0) return false;\n  } while (el = el.parent);\n  return true;\n});\n\nElement.prototype.__defineGetter__('_detached', function() {\n  var el = this;\n  do {\n    if (el.type === 'screen') return false;\n    if (!el.parent) return true;\n  } while (el = el.parent);\n  return false;\n});\n\nElement.prototype.enableMouse = function() {\n  this.screen._listenMouse(this);\n};\n\nElement.prototype.enableKeys = function() {\n  this.screen._listenKeys(this);\n};\n\nElement.prototype.enableInput = function() {\n  this.screen._listenMouse(this);\n  this.screen._listenKeys(this);\n};\n\nElement.prototype.__defineGetter__('draggable', function() {\n  return this._draggable === true;\n});\n\nElement.prototype.__defineSetter__('draggable', function(draggable) {\n  return draggable ? this.enableDrag(draggable) : this.disableDrag();\n});\n\nElement.prototype.enableDrag = function(verify) {\n  var self = this;\n\n  if (this._draggable) return true;\n\n  if (typeof verify !== 'function') {\n    verify = function() { return true; };\n  }\n\n  this.enableMouse();\n\n  this.on('mousedown', this._dragMD = function(data) {\n    if (self.screen._dragging) return;\n    if (!verify(data)) return;\n    self.screen._dragging = self;\n    self._drag = {\n      x: data.x - self.aleft,\n      y: data.y - self.atop\n    };\n    self.setFront();\n  });\n\n  this.onScreenEvent('mouse', this._dragM = function(data) {\n    if (self.screen._dragging !== self) return;\n\n    if (data.action !== 'mousedown' && data.action !== 'mousemove') {\n      delete self.screen._dragging;\n      delete self._drag;\n      return;\n    }\n\n    // This can happen in edge cases where the user is\n    // already dragging and element when it is detached.\n    if (!self.parent) return;\n\n    var ox = self._drag.x\n      , oy = self._drag.y\n      , px = self.parent.aleft\n      , py = self.parent.atop\n      , x = data.x - px - ox\n      , y = data.y - py - oy;\n\n    if (self.position.right != null) {\n      if (self.position.left != null) {\n        self.width = '100%-' + (self.parent.width - self.width);\n      }\n      self.position.right = null;\n    }\n\n    if (self.position.bottom != null) {\n      if (self.position.top != null) {\n        self.height = '100%-' + (self.parent.height - self.height);\n      }\n      self.position.bottom = null;\n    }\n\n    self.rleft = x;\n    self.rtop = y;\n\n    self.screen.render();\n  });\n\n  return this._draggable = true;\n};\n\nElement.prototype.disableDrag = function() {\n  if (!this._draggable) return false;\n  delete this.screen._dragging;\n  delete this._drag;\n  this.removeListener('mousedown', this._dragMD);\n  this.removeScreenEvent('mouse', this._dragM);\n  return this._draggable = false;\n};\n\nElement.prototype.key = function() {\n  return this.screen.program.key.apply(this, arguments);\n};\n\nElement.prototype.onceKey = function() {\n  return this.screen.program.onceKey.apply(this, arguments);\n};\n\nElement.prototype.unkey =\nElement.prototype.removeKey = function() {\n  return this.screen.program.unkey.apply(this, arguments);\n};\n\nElement.prototype.setIndex = function(index) {\n  if (!this.parent) return;\n\n  if (index < 0) {\n    index = this.parent.children.length + index;\n  }\n\n  index = Math.max(index, 0);\n  index = Math.min(index, this.parent.children.length - 1);\n\n  var i = this.parent.children.indexOf(this);\n  if (!~i) return;\n\n  var item = this.parent.children.splice(i, 1)[0];\n  this.parent.children.splice(index, 0, item);\n};\n\nElement.prototype.setFront = function() {\n  return this.setIndex(-1);\n};\n\nElement.prototype.setBack = function() {\n  return this.setIndex(0);\n};\n\nElement.prototype.clearPos = function(get, override) {\n  if (this.detached) return;\n  var lpos = this._getCoords(get);\n  if (!lpos) return;\n  this.screen.clearRegion(\n    lpos.xi, lpos.xl,\n    lpos.yi, lpos.yl,\n    override);\n};\n\nElement.prototype.setLabel = function(options) {\n  var self = this;\n  var Box = require('./box');\n\n  if (typeof options === 'string') {\n    options = { text: options };\n  }\n\n  if (this._label) {\n    this._label.setContent(options.text);\n    if (options.side !== 'right') {\n      this._label.rleft = 2 + (this.border ? -1 : 0);\n      this._label.position.right = undefined;\n      if (!this.screen.autoPadding) {\n        this._label.rleft = 2;\n      }\n    } else {\n      this._label.rright = 2 + (this.border ? -1 : 0);\n      this._label.position.left = undefined;\n      if (!this.screen.autoPadding) {\n        this._label.rright = 2;\n      }\n    }\n    return;\n  }\n\n  this._label = new Box({\n    screen: this.screen,\n    parent: this,\n    content: options.text,\n    top: -this.itop,\n    tags: this.parseTags,\n    shrink: true,\n    style: this.style.label\n  });\n\n  if (options.side !== 'right') {\n    this._label.rleft = 2 - this.ileft;\n  } else {\n    this._label.rright = 2 - this.iright;\n  }\n\n  this._label._isLabel = true;\n\n  if (!this.screen.autoPadding) {\n    if (options.side !== 'right') {\n      this._label.rleft = 2;\n    } else {\n      this._label.rright = 2;\n    }\n    this._label.rtop = 0;\n  }\n\n  var reposition = function() {\n    self._label.rtop = (self.childBase || 0) - self.itop;\n    if (!self.screen.autoPadding) {\n      self._label.rtop = (self.childBase || 0);\n    }\n    self.screen.render();\n  };\n\n  this.on('scroll', this._labelScroll = function() {\n    reposition();\n  });\n\n  this.on('resize', this._labelResize = function() {\n    nextTick(function() {\n      reposition();\n    });\n  });\n};\n\nElement.prototype.removeLabel = function() {\n  if (!this._label) return;\n  this.removeListener('scroll', this._labelScroll);\n  this.removeListener('resize', this._labelResize);\n  this._label.detach();\n  delete this._labelScroll;\n  delete this._labelResize;\n  delete this._label;\n};\n\nElement.prototype.setHover = function(options) {\n  if (typeof options === 'string') {\n    options = { text: options };\n  }\n\n  this._hoverOptions = options;\n  this.enableMouse();\n  this.screen._initHover();\n};\n\nElement.prototype.removeHover = function() {\n  delete this._hoverOptions;\n  if (!this.screen._hoverText || this.screen._hoverText.detached) return;\n  this.screen._hoverText.detach();\n  this.screen.render();\n};\n\n/**\n * Positioning\n */\n\n// The below methods are a bit confusing: basically\n// whenever Box.render is called `lpos` gets set on\n// the element, an object containing the rendered\n// coordinates. Since these don't update if the\n// element is moved somehow, they're unreliable in\n// that situation. However, if we can guarantee that\n// lpos is good and up to date, it can be more\n// accurate than the calculated positions below.\n// In this case, if the element is being rendered,\n// it's guaranteed that the parent will have been\n// rendered first, in which case we can use the\n// parant's lpos instead of recalculating it's\n// position (since that might be wrong because\n// it doesn't handle content shrinkage).\n\nElement.prototype._getPos = function() {\n  var pos = this.lpos;\n\n  assert.ok(pos);\n\n  if (pos.aleft != null) return pos;\n\n  pos.aleft = pos.xi;\n  pos.atop = pos.yi;\n  pos.aright = this.screen.cols - pos.xl;\n  pos.abottom = this.screen.rows - pos.yl;\n  pos.width = pos.xl - pos.xi;\n  pos.height = pos.yl - pos.yi;\n\n  return pos;\n};\n\n/**\n * Position Getters\n */\n\nElement.prototype._getWidth = function(get) {\n  var parent = get ? this.parent._getPos() : this.parent\n    , width = this.position.width\n    , left\n    , expr;\n\n  if (typeof width === 'string') {\n    if (width === 'half') width = '50%';\n    expr = width.split(/(?=\\+|-)/);\n    width = expr[0];\n    width = +width.slice(0, -1) / 100;\n    width = parent.width * width | 0;\n    width += +(expr[1] || 0);\n    return width;\n  }\n\n  // This is for if the element is being streched or shrunken.\n  // Although the width for shrunken elements is calculated\n  // in the render function, it may be calculated based on\n  // the content width, and the content width is initially\n  // decided by the width the element, so it needs to be\n  // calculated here.\n  if (width == null) {\n    left = this.position.left || 0;\n    if (typeof left === 'string') {\n      if (left === 'center') left = '50%';\n      expr = left.split(/(?=\\+|-)/);\n      left = expr[0];\n      left = +left.slice(0, -1) / 100;\n      left = parent.width * left | 0;\n      left += +(expr[1] || 0);\n    }\n    width = parent.width - (this.position.right || 0) - left;\n    if (this.screen.autoPadding) {\n      if ((this.position.left != null || this.position.right == null)\n          && this.position.left !== 'center') {\n        width -= this.parent.ileft;\n      }\n      width -= this.parent.iright;\n    }\n  }\n\n  return width;\n};\n\nElement.prototype.__defineGetter__('width', function() {\n  return this._getWidth(false);\n});\n\nElement.prototype._getHeight = function(get) {\n  var parent = get ? this.parent._getPos() : this.parent\n    , height = this.position.height\n    , top\n    , expr;\n\n  if (typeof height === 'string') {\n    if (height === 'half') height = '50%';\n    expr = height.split(/(?=\\+|-)/);\n    height = expr[0];\n    height = +height.slice(0, -1) / 100;\n    height = parent.height * height | 0;\n    height += +(expr[1] || 0);\n    return height;\n  }\n\n  // This is for if the element is being streched or shrunken.\n  // Although the width for shrunken elements is calculated\n  // in the render function, it may be calculated based on\n  // the content width, and the content width is initially\n  // decided by the width the element, so it needs to be\n  // calculated here.\n  if (height == null) {\n    top = this.position.top || 0;\n    if (typeof top === 'string') {\n      if (top === 'center') top = '50%';\n      expr = top.split(/(?=\\+|-)/);\n      top = expr[0];\n      top = +top.slice(0, -1) / 100;\n      top = parent.height * top | 0;\n      top += +(expr[1] || 0);\n    }\n    height = parent.height - (this.position.bottom || 0) - top;\n    if (this.screen.autoPadding) {\n      if ((this.position.top != null\n          || this.position.bottom == null)\n          && this.position.top !== 'center') {\n        height -= this.parent.itop;\n      }\n      height -= this.parent.ibottom;\n    }\n  }\n\n  return height;\n};\n\nElement.prototype.__defineGetter__('height', function() {\n  return this._getHeight(false);\n});\n\nElement.prototype._getLeft = function(get) {\n  var parent = get ? this.parent._getPos() : this.parent\n    , left = this.position.left || 0\n    , expr;\n\n  if (typeof left === 'string') {\n    if (left === 'center') left = '50%';\n    expr = left.split(/(?=\\+|-)/);\n    left = expr[0];\n    left = +left.slice(0, -1) / 100;\n    left = parent.width * left | 0;\n    left += +(expr[1] || 0);\n    if (this.position.left === 'center') {\n      left -= this._getWidth(get) / 2 | 0;\n    }\n  }\n\n  if (this.position.left == null && this.position.right != null) {\n    return this.screen.cols - this._getWidth(get) - this._getRight(get);\n  }\n\n  if (this.screen.autoPadding) {\n    if ((this.position.left != null\n        || this.position.right == null)\n        && this.position.left !== 'center') {\n      left += this.parent.ileft;\n    }\n  }\n\n  return (parent.aleft || 0) + left;\n};\n\nElement.prototype.__defineGetter__('aleft', function() {\n  return this._getLeft(false);\n});\n\nElement.prototype._getRight = function(get) {\n  var parent = get ? this.parent._getPos() : this.parent\n    , right;\n\n  if (this.position.right == null && this.position.left != null) {\n    right = this.screen.cols - (this._getLeft(get) + this._getWidth(get));\n    if (this.screen.autoPadding) {\n      right += this.parent.iright;\n    }\n    return right;\n  }\n\n  right = (parent.aright || 0) + (this.position.right || 0);\n\n  if (this.screen.autoPadding) {\n    right += this.parent.iright;\n  }\n\n  return right;\n};\n\nElement.prototype.__defineGetter__('aright', function() {\n  return this._getRight(false);\n});\n\nElement.prototype._getTop = function(get) {\n  var parent = get ? this.parent._getPos() : this.parent\n    , top = this.position.top || 0\n    , expr;\n\n  if (typeof top === 'string') {\n    if (top === 'center') top = '50%';\n    expr = top.split(/(?=\\+|-)/);\n    top = expr[0];\n    top = +top.slice(0, -1) / 100;\n    top = parent.height * top | 0;\n    top += +(expr[1] || 0);\n    if (this.position.top === 'center') {\n      top -= this._getHeight(get) / 2 | 0;\n    }\n  }\n\n  if (this.position.top == null && this.position.bottom != null) {\n    return this.screen.rows - this._getHeight(get) - this._getBottom(get);\n  }\n\n  if (this.screen.autoPadding) {\n    if ((this.position.top != null\n        || this.position.bottom == null)\n        && this.position.top !== 'center') {\n      top += this.parent.itop;\n    }\n  }\n\n  return (parent.atop || 0) + top;\n};\n\nElement.prototype.__defineGetter__('atop', function() {\n  return this._getTop(false);\n});\n\nElement.prototype._getBottom = function(get) {\n  var parent = get ? this.parent._getPos() : this.parent\n    , bottom;\n\n  if (this.position.bottom == null && this.position.top != null) {\n    bottom = this.screen.rows - (this._getTop(get) + this._getHeight(get));\n    if (this.screen.autoPadding) {\n      bottom += this.parent.ibottom;\n    }\n    return bottom;\n  }\n\n  bottom = (parent.abottom || 0) + (this.position.bottom || 0);\n\n  if (this.screen.autoPadding) {\n    bottom += this.parent.ibottom;\n  }\n\n  return bottom;\n};\n\nElement.prototype.__defineGetter__('abottom', function() {\n  return this._getBottom(false);\n});\n\nElement.prototype.__defineGetter__('rleft', function() {\n  return this.aleft - this.parent.aleft;\n});\n\nElement.prototype.__defineGetter__('rright', function() {\n  return this.aright - this.parent.aright;\n});\n\nElement.prototype.__defineGetter__('rtop', function() {\n  return this.atop - this.parent.atop;\n});\n\nElement.prototype.__defineGetter__('rbottom', function() {\n  return this.abottom - this.parent.abottom;\n});\n\n/**\n * Position Setters\n */\n\n// NOTE:\n// For aright, abottom, right, and bottom:\n// If position.bottom is null, we could simply set top instead.\n// But it wouldn't replicate bottom behavior appropriately if\n// the parent was resized, etc.\nElement.prototype.__defineSetter__('width', function(val) {\n  if (this.position.width === val) return;\n  if (/^\\d+$/.test(val)) val = +val;\n  this.emit('resize');\n  this.clearPos();\n  return this.position.width = val;\n});\n\nElement.prototype.__defineSetter__('height', function(val) {\n  if (this.position.height === val) return;\n  if (/^\\d+$/.test(val)) val = +val;\n  this.emit('resize');\n  this.clearPos();\n  return this.position.height = val;\n});\n\nElement.prototype.__defineSetter__('aleft', function(val) {\n  var expr;\n  if (typeof val === 'string') {\n    if (val === 'center') {\n      val = this.screen.width / 2 | 0;\n      val -= this.width / 2 | 0;\n    } else {\n      expr = val.split(/(?=\\+|-)/);\n      val = expr[0];\n      val = +val.slice(0, -1) / 100;\n      val = this.screen.width * val | 0;\n      val += +(expr[1] || 0);\n    }\n  }\n  val -= this.parent.aleft;\n  if (this.position.left === val) return;\n  this.emit('move');\n  this.clearPos();\n  return this.position.left = val;\n});\n\nElement.prototype.__defineSetter__('aright', function(val) {\n  val -= this.parent.aright;\n  if (this.position.right === val) return;\n  this.emit('move');\n  this.clearPos();\n  return this.position.right = val;\n});\n\nElement.prototype.__defineSetter__('atop', function(val) {\n  var expr;\n  if (typeof val === 'string') {\n    if (val === 'center') {\n      val = this.screen.height / 2 | 0;\n      val -= this.height / 2 | 0;\n    } else {\n      expr = val.split(/(?=\\+|-)/);\n      val = expr[0];\n      val = +val.slice(0, -1) / 100;\n      val = this.screen.height * val | 0;\n      val += +(expr[1] || 0);\n    }\n  }\n  val -= this.parent.atop;\n  if (this.position.top === val) return;\n  this.emit('move');\n  this.clearPos();\n  return this.position.top = val;\n});\n\nElement.prototype.__defineSetter__('abottom', function(val) {\n  val -= this.parent.abottom;\n  if (this.position.bottom === val) return;\n  this.emit('move');\n  this.clearPos();\n  return this.position.bottom = val;\n});\n\nElement.prototype.__defineSetter__('rleft', function(val) {\n  if (this.position.left === val) return;\n  if (/^\\d+$/.test(val)) val = +val;\n  this.emit('move');\n  this.clearPos();\n  return this.position.left = val;\n});\n\nElement.prototype.__defineSetter__('rright', function(val) {\n  if (this.position.right === val) return;\n  this.emit('move');\n  this.clearPos();\n  return this.position.right = val;\n});\n\nElement.prototype.__defineSetter__('rtop', function(val) {\n  if (this.position.top === val) return;\n  if (/^\\d+$/.test(val)) val = +val;\n  this.emit('move');\n  this.clearPos();\n  return this.position.top = val;\n});\n\nElement.prototype.__defineSetter__('rbottom', function(val) {\n  if (this.position.bottom === val) return;\n  this.emit('move');\n  this.clearPos();\n  return this.position.bottom = val;\n});\n\nElement.prototype.__defineGetter__('ileft', function() {\n  return (this.border ? 1 : 0) + this.padding.left;\n  // return (this.border && this.border.left ? 1 : 0) + this.padding.left;\n});\n\nElement.prototype.__defineGetter__('itop', function() {\n  return (this.border ? 1 : 0) + this.padding.top;\n  // return (this.border && this.border.top ? 1 : 0) + this.padding.top;\n});\n\nElement.prototype.__defineGetter__('iright', function() {\n  return (this.border ? 1 : 0) + this.padding.right;\n  // return (this.border && this.border.right ? 1 : 0) + this.padding.right;\n});\n\nElement.prototype.__defineGetter__('ibottom', function() {\n  return (this.border ? 1 : 0) + this.padding.bottom;\n  // return (this.border && this.border.bottom ? 1 : 0) + this.padding.bottom;\n});\n\nElement.prototype.__defineGetter__('iwidth', function() {\n  // return (this.border\n  //   ? ((this.border.left ? 1 : 0) + (this.border.right ? 1 : 0)) : 0)\n  //   + this.padding.left + this.padding.right;\n  return (this.border ? 2 : 0) + this.padding.left + this.padding.right;\n});\n\nElement.prototype.__defineGetter__('iheight', function() {\n  // return (this.border\n  //   ? ((this.border.top ? 1 : 0) + (this.border.bottom ? 1 : 0)) : 0)\n  //   + this.padding.top + this.padding.bottom;\n  return (this.border ? 2 : 0) + this.padding.top + this.padding.bottom;\n});\n\nElement.prototype.__defineGetter__('tpadding', function() {\n  return this.padding.left + this.padding.top\n    + this.padding.right + this.padding.bottom;\n});\n\n/**\n * Relative coordinates as default properties\n */\n\nElement.prototype.__defineGetter__('left', function() {\n  return this.rleft;\n});\n\nElement.prototype.__defineGetter__('right', function() {\n  return this.rright;\n});\n\nElement.prototype.__defineGetter__('top', function() {\n  return this.rtop;\n});\n\nElement.prototype.__defineGetter__('bottom', function() {\n  return this.rbottom;\n});\n\nElement.prototype.__defineSetter__('left', function(val) {\n  return this.rleft = val;\n});\n\nElement.prototype.__defineSetter__('right', function(val) {\n  return this.rright = val;\n});\n\nElement.prototype.__defineSetter__('top', function(val) {\n  return this.rtop = val;\n});\n\nElement.prototype.__defineSetter__('bottom', function(val) {\n  return this.rbottom = val;\n});\n\n/**\n * Rendering - here be dragons\n */\n\nElement.prototype._getShrinkBox = function(xi, xl, yi, yl, get) {\n  if (!this.children.length) {\n    return { xi: xi, xl: xi + 1, yi: yi, yl: yi + 1 };\n  }\n\n  var i, el, ret, mxi = xi, mxl = xi + 1, myi = yi, myl = yi + 1;\n\n  // This is a chicken and egg problem. We need to determine how the children\n  // will render in order to determine how this element renders, but it in\n  // order to figure out how the children will render, they need to know\n  // exactly how their parent renders, so, we can give them what we have so\n  // far.\n  var _lpos;\n  if (get) {\n    _lpos = this.lpos;\n    this.lpos = { xi: xi, xl: xl, yi: yi, yl: yl };\n    //this.shrink = false;\n  }\n\n  for (i = 0; i < this.children.length; i++) {\n    el = this.children[i];\n\n    ret = el._getCoords(get);\n\n    // Or just (seemed to work, but probably not good):\n    // ret = el.lpos || this.lpos;\n\n    if (!ret) continue;\n\n    // Since the parent element is shrunk, and the child elements think it's\n    // going to take up as much space as possible, an element anchored to the\n    // right or bottom will inadvertantly make the parent's shrunken size as\n    // large as possible. So, we can just use the height and/or width the of\n    // element.\n    // if (get) {\n    if (el.position.left == null && el.position.right != null) {\n      ret.xl = xi + (ret.xl - ret.xi);\n      ret.xi = xi;\n      if (this.screen.autoPadding) {\n        // Maybe just do this no matter what.\n        ret.xl += this.ileft;\n        ret.xi += this.ileft;\n      }\n    }\n    if (el.position.top == null && el.position.bottom != null) {\n      ret.yl = yi + (ret.yl - ret.yi);\n      ret.yi = yi;\n      if (this.screen.autoPadding) {\n        // Maybe just do this no matter what.\n        ret.yl += this.itop;\n        ret.yi += this.itop;\n      }\n    }\n\n    if (ret.xi < mxi) mxi = ret.xi;\n    if (ret.xl > mxl) mxl = ret.xl;\n    if (ret.yi < myi) myi = ret.yi;\n    if (ret.yl > myl) myl = ret.yl;\n  }\n\n  if (get) {\n    this.lpos = _lpos;\n    //this.shrink = true;\n  }\n\n  if (this.position.width == null\n      && (this.position.left == null\n      || this.position.right == null)) {\n    if (this.position.left == null && this.position.right != null) {\n      xi = xl - (mxl - mxi);\n      if (!this.screen.autoPadding) {\n        xi -= this.padding.left + this.padding.right;\n      } else {\n        xi -= this.ileft;\n      }\n    } else {\n      xl = mxl;\n      if (!this.screen.autoPadding) {\n        xl += this.padding.left + this.padding.right;\n        // XXX Temporary workaround until we decide to make autoPadding default.\n        // See widget-listtable.js for an example of why this is necessary.\n        // XXX Maybe just to this for all this being that this would affect\n        // width shrunken normal shrunken lists as well.\n        // if (this._isList) {\n        if (this.type === 'list-table') {\n          xl -= this.padding.left + this.padding.right;\n          xl += this.iright;\n        }\n      } else {\n        //xl += this.padding.right;\n        xl += this.iright;\n      }\n    }\n  }\n\n  if (this.position.height == null\n      && (this.position.top == null\n      || this.position.bottom == null)\n      && (!this.scrollable || this._isList)) {\n    // NOTE: Lists get special treatment if they are shrunken - assume they\n    // want all list items showing. This is one case we can calculate the\n    // height based on items/boxes.\n    if (this._isList) {\n      myi = 0 - this.itop;\n      myl = this.items.length + this.ibottom;\n    }\n    if (this.position.top == null && this.position.bottom != null) {\n      yi = yl - (myl - myi);\n      if (!this.screen.autoPadding) {\n        yi -= this.padding.top + this.padding.bottom;\n      } else {\n        yi -= this.itop;\n      }\n    } else {\n      yl = myl;\n      if (!this.screen.autoPadding) {\n        yl += this.padding.top + this.padding.bottom;\n      } else {\n        yl += this.ibottom;\n      }\n    }\n  }\n\n  return { xi: xi, xl: xl, yi: yi, yl: yl };\n};\n\nElement.prototype._getShrinkContent = function(xi, xl, yi, yl) {\n  var h = this._clines.length\n    , w = this._clines.mwidth || 1;\n\n  if (this.position.width == null\n      && (this.position.left == null\n      || this.position.right == null)) {\n    if (this.position.left == null && this.position.right != null) {\n      xi = xl - w - this.iwidth;\n    } else {\n      xl = xi + w + this.iwidth;\n    }\n  }\n\n  if (this.position.height == null\n      && (this.position.top == null\n      || this.position.bottom == null)\n      && (!this.scrollable || this._isList)) {\n    if (this.position.top == null && this.position.bottom != null) {\n      yi = yl - h - this.iheight;\n    } else {\n      yl = yi + h + this.iheight;\n    }\n  }\n\n  return { xi: xi, xl: xl, yi: yi, yl: yl };\n};\n\nElement.prototype._getShrink = function(xi, xl, yi, yl, get) {\n  var shrinkBox = this._getShrinkBox(xi, xl, yi, yl, get)\n    , shrinkContent = this._getShrinkContent(xi, xl, yi, yl, get)\n    , xll = xl\n    , yll = yl;\n\n  // Figure out which one is bigger and use it.\n  if (shrinkBox.xl - shrinkBox.xi > shrinkContent.xl - shrinkContent.xi) {\n    xi = shrinkBox.xi;\n    xl = shrinkBox.xl;\n  } else {\n    xi = shrinkContent.xi;\n    xl = shrinkContent.xl;\n  }\n\n  if (shrinkBox.yl - shrinkBox.yi > shrinkContent.yl - shrinkContent.yi) {\n    yi = shrinkBox.yi;\n    yl = shrinkBox.yl;\n  } else {\n    yi = shrinkContent.yi;\n    yl = shrinkContent.yl;\n  }\n\n  // Recenter shrunken elements.\n  if (xl < xll && this.position.left === 'center') {\n    xll = (xll - xl) / 2 | 0;\n    xi += xll;\n    xl += xll;\n  }\n\n  if (yl < yll && this.position.top === 'center') {\n    yll = (yll - yl) / 2 | 0;\n    yi += yll;\n    yl += yll;\n  }\n\n  return { xi: xi, xl: xl, yi: yi, yl: yl };\n};\n\nElement.prototype._getCoords = function(get, noscroll) {\n  if (this.hidden) return;\n\n  // if (this.parent._rendering) {\n  //   get = true;\n  // }\n\n  var xi = this._getLeft(get)\n    , xl = xi + this._getWidth(get)\n    , yi = this._getTop(get)\n    , yl = yi + this._getHeight(get)\n    , base = this.childBase || 0\n    , el = this\n    , fixed = this.fixed\n    , coords\n    , v\n    , noleft\n    , noright\n    , notop\n    , nobot\n    , ppos\n    , b;\n\n  // Attempt to shrink the element base on the\n  // size of the content and child elements.\n  if (this.shrink) {\n    coords = this._getShrink(xi, xl, yi, yl, get);\n    xi = coords.xi, xl = coords.xl;\n    yi = coords.yi, yl = coords.yl;\n  }\n\n  // Find a scrollable ancestor if we have one.\n  while (el = el.parent) {\n    if (el.scrollable) {\n      if (fixed) {\n        fixed = false;\n        continue;\n      }\n      break;\n    }\n  }\n\n  // Check to make sure we're visible and\n  // inside of the visible scroll area.\n  // NOTE: Lists have a property where only\n  // the list items are obfuscated.\n\n  // Old way of doing things, this would not render right if a shrunken element\n  // with lots of boxes in it was within a scrollable element.\n  // See: $ node test/widget-shrink-fail.js\n  // var thisparent = this.parent;\n\n  var thisparent = el;\n  if (el && !noscroll) {\n    ppos = thisparent.lpos;\n\n    // The shrink option can cause a stack overflow\n    // by calling _getCoords on the child again.\n    // if (!get && !thisparent.shrink) {\n    //   ppos = thisparent._getCoords();\n    // }\n\n    if (!ppos) return;\n\n    // TODO: Figure out how to fix base (and cbase to only\n    // take into account the *parent's* padding.\n\n    yi -= ppos.base;\n    yl -= ppos.base;\n\n    b = thisparent.border ? 1 : 0;\n\n    // XXX\n    // Fixes non-`fixed` labels to work with scrolling (they're ON the border):\n    // if (this.position.left < 0\n    //     || this.position.right < 0\n    //     || this.position.top < 0\n    //     || this.position.bottom < 0) {\n    if (this._isLabel) {\n      b = 0;\n    }\n\n    if (yi < ppos.yi + b) {\n      if (yl - 1 < ppos.yi + b) {\n        // Is above.\n        return;\n      } else {\n        // Is partially covered above.\n        notop = true;\n        v = ppos.yi - yi;\n        if (this.border) v--;\n        if (thisparent.border) v++;\n        base += v;\n        yi += v;\n      }\n    } else if (yl > ppos.yl - b) {\n      if (yi > ppos.yl - 1 - b) {\n        // Is below.\n        return;\n      } else {\n        // Is partially covered below.\n        nobot = true;\n        v = yl - ppos.yl;\n        if (this.border) v--;\n        if (thisparent.border) v++;\n        yl -= v;\n      }\n    }\n\n    // Shouldn't be necessary.\n    // assert.ok(yi < yl);\n    if (yi >= yl) return;\n\n    // Could allow overlapping stuff in scrolling elements\n    // if we cleared the pending buffer before every draw.\n    if (xi < el.lpos.xi) {\n      xi = el.lpos.xi;\n      noleft = true;\n      if (this.border) xi--;\n      if (thisparent.border) xi++;\n    }\n    if (xl > el.lpos.xl) {\n      xl = el.lpos.xl;\n      noright = true;\n      if (this.border) xl++;\n      if (thisparent.border) xl--;\n    }\n    //if (xi > xl) return;\n    if (xi >= xl) return;\n  }\n\n  if (this.noOverflow && this.parent.lpos) {\n    if (xi < this.parent.lpos.xi + this.parent.ileft) {\n      xi = this.parent.lpos.xi + this.parent.ileft;\n    }\n    if (xl > this.parent.lpos.xl - this.parent.iright) {\n      xl = this.parent.lpos.xl - this.parent.iright;\n    }\n    if (yi < this.parent.lpos.yi + this.parent.itop) {\n      yi = this.parent.lpos.yi + this.parent.itop;\n    }\n    if (yl > this.parent.lpos.yl - this.parent.ibottom) {\n      yl = this.parent.lpos.yl - this.parent.ibottom;\n    }\n  }\n\n  // if (this.parent.lpos) {\n  //   this.parent.lpos._scrollBottom = Math.max(\n  //     this.parent.lpos._scrollBottom, yl);\n  // }\n\n  return {\n    xi: xi,\n    xl: xl,\n    yi: yi,\n    yl: yl,\n    base: base,\n    noleft: noleft,\n    noright: noright,\n    notop: notop,\n    nobot: nobot,\n    renders: this.screen.renders\n  };\n};\n\nElement.prototype.render = function() {\n  this._emit('prerender');\n\n  this.parseContent();\n\n  var coords = this._getCoords(true);\n  if (!coords) {\n    delete this.lpos;\n    return;\n  }\n\n  if (coords.xl - coords.xi <= 0) {\n    coords.xl = Math.max(coords.xl, coords.xi);\n    return;\n  }\n\n  if (coords.yl - coords.yi <= 0) {\n    coords.yl = Math.max(coords.yl, coords.yi);\n    return;\n  }\n\n  var lines = this.screen.lines\n    , xi = coords.xi\n    , xl = coords.xl\n    , yi = coords.yi\n    , yl = coords.yl\n    , x\n    , y\n    , cell\n    , attr\n    , ch\n    , content = this._pcontent\n    , ci = this._clines.ci[coords.base]\n    , battr\n    , dattr\n    , c\n    , visible\n    , i\n    , bch = this.ch;\n\n  // Clip content if it's off the edge of the screen\n  // if (xi + this.ileft < 0 || yi + this.itop < 0) {\n  //   var clines = this._clines.slice();\n  //   if (xi + this.ileft < 0) {\n  //     for (var i = 0; i < clines.length; i++) {\n  //       var t = 0;\n  //       var csi = '';\n  //       var csis = '';\n  //       for (var j = 0; j < clines[i].length; j++) {\n  //         while (clines[i][j] === '\\x1b') {\n  //           csi = '\\x1b';\n  //           while (clines[i][j++] !== 'm') csi += clines[i][j];\n  //           csis += csi;\n  //         }\n  //         if (++t === -(xi + this.ileft) + 1) break;\n  //       }\n  //       clines[i] = csis + clines[i].substring(j);\n  //     }\n  //   }\n  //   if (yi + this.itop < 0) {\n  //     clines = clines.slice(-(yi + this.itop));\n  //   }\n  //   content = clines.join('\\n');\n  // }\n\n  if (coords.base >= this._clines.ci.length) {\n    ci = this._pcontent.length;\n  }\n\n  this.lpos = coords;\n\n  if (this.border && this.border.type === 'line') {\n    this.screen._borderStops[coords.yi] = true;\n    this.screen._borderStops[coords.yl - 1] = true;\n    // if (!this.screen._borderStops[coords.yi]) {\n    //   this.screen._borderStops[coords.yi] = { xi: coords.xi, xl: coords.xl };\n    // } else {\n    //   if (this.screen._borderStops[coords.yi].xi > coords.xi) {\n    //     this.screen._borderStops[coords.yi].xi = coords.xi;\n    //   }\n    //   if (this.screen._borderStops[coords.yi].xl < coords.xl) {\n    //     this.screen._borderStops[coords.yi].xl = coords.xl;\n    //   }\n    // }\n    // this.screen._borderStops[coords.yl - 1] = this.screen._borderStops[coords.yi];\n  }\n\n  dattr = this.sattr(this.style);\n  attr = dattr;\n\n  // If we're in a scrollable text box, check to\n  // see which attributes this line starts with.\n  if (ci > 0) {\n    attr = this._clines.attr[Math.min(coords.base, this._clines.length - 1)];\n  }\n\n  if (this.border) xi++, xl--, yi++, yl--;\n\n  // If we have padding/valign, that means the\n  // content-drawing loop will skip a few cells/lines.\n  // To deal with this, we can just fill the whole thing\n  // ahead of time. This could be optimized.\n  if (this.tpadding || (this.valign && this.valign !== 'top')) {\n    if (this.style.transparent) {\n      for (y = Math.max(yi, 0); y < yl; y++) {\n        if (!lines[y]) break;\n        for (x = Math.max(xi, 0); x < xl; x++) {\n          if (!lines[y][x]) break;\n          lines[y][x][0] = colors.blend(attr, lines[y][x][0]);\n          // lines[y][x][1] = bch;\n          lines[y].dirty = true;\n        }\n      }\n    } else {\n      this.screen.fillRegion(dattr, bch, xi, xl, yi, yl);\n    }\n  }\n\n  if (this.tpadding) {\n    xi += this.padding.left, xl -= this.padding.right;\n    yi += this.padding.top, yl -= this.padding.bottom;\n  }\n\n  // Determine where to place the text if it's vertically aligned.\n  if (this.valign === 'middle' || this.valign === 'bottom') {\n    visible = yl - yi;\n    if (this._clines.length < visible) {\n      if (this.valign === 'middle') {\n        visible = visible / 2 | 0;\n        visible -= this._clines.length / 2 | 0;\n      } else if (this.valign === 'bottom') {\n        visible -= this._clines.length;\n      }\n      ci -= visible * (xl - xi);\n    }\n  }\n\n  // Draw the content and background.\n  for (y = yi; y < yl; y++) {\n    if (!lines[y]) {\n      if (y >= this.screen.height || yl < this.ibottom) {\n        break;\n      } else {\n        continue;\n      }\n    }\n    for (x = xi; x < xl; x++) {\n      cell = lines[y][x];\n      if (!cell) {\n        if (x >= this.screen.width || xl < this.iright) {\n          break;\n        } else {\n          continue;\n        }\n      }\n\n      ch = content[ci++] || bch;\n\n      // if (!content[ci] && !coords._contentEnd) {\n      //   coords._contentEnd = { x: x - xi, y: y - yi };\n      // }\n\n      // Handle escape codes.\n      while (ch === '\\x1b') {\n        if (c = /^\\x1b\\[[\\d;]*m/.exec(content.substring(ci - 1))) {\n          ci += c[0].length - 1;\n          attr = this.screen.attrCode(c[0], attr, dattr);\n          // Ignore foreground changes for selected items.\n          if (this.parent._isList && this.parent.interactive\n              && this.parent.items[this.parent.selected] === this\n              && this.parent.options.invertSelected !== false) {\n            attr = (attr & ~(0x1ff << 9)) | (dattr & (0x1ff << 9));\n          }\n          ch = content[ci] || bch;\n          ci++;\n        } else {\n          break;\n        }\n      }\n\n      // Handle newlines.\n      if (ch === '\\t') ch = bch;\n      if (ch === '\\n') {\n        // If we're on the first cell and we find a newline and the last cell\n        // of the last line was not a newline, let's just treat this like the\n        // newline was already \"counted\".\n        if (x === xi && y !== yi && content[ci - 2] !== '\\n') {\n          x--;\n          continue;\n        }\n        // We could use fillRegion here, name the\n        // outer loop, and continue to it instead.\n        ch = bch;\n        for (; x < xl; x++) {\n          cell = lines[y][x];\n          if (!cell) break;\n          if (this.style.transparent) {\n            lines[y][x][0] = colors.blend(attr, lines[y][x][0]);\n            if (content[ci]) lines[y][x][1] = ch;\n            lines[y].dirty = true;\n          } else {\n            if (attr !== cell[0] || ch !== cell[1]) {\n              lines[y][x][0] = attr;\n              lines[y][x][1] = ch;\n              lines[y].dirty = true;\n            }\n          }\n        }\n        continue;\n      }\n\n      if (this.screen.fullUnicode && content[ci - 1]) {\n        var point = unicode.codePointAt(content, ci - 1);\n        // Handle combining chars:\n        // Make sure they get in the same cell and are counted as 0.\n        if (unicode.combining[point]) {\n          if (point > 0x00ffff) {\n            ch = content[ci - 1] + content[ci];\n            ci++;\n          }\n          if (x - 1 >= xi) {\n            lines[y][x - 1][1] += ch;\n          } else if (y - 1 >= yi) {\n            lines[y - 1][xl - 1][1] += ch;\n          }\n          x--;\n          continue;\n        }\n        // Handle surrogate pairs:\n        // Make sure we put surrogate pair chars in one cell.\n        if (point > 0x00ffff) {\n          ch = content[ci - 1] + content[ci];\n          ci++;\n        }\n      }\n\n      if (this._noFill) continue;\n\n      if (this.style.transparent) {\n        lines[y][x][0] = colors.blend(attr, lines[y][x][0]);\n        if (content[ci]) lines[y][x][1] = ch;\n        lines[y].dirty = true;\n      } else {\n        if (attr !== cell[0] || ch !== cell[1]) {\n          lines[y][x][0] = attr;\n          lines[y][x][1] = ch;\n          lines[y].dirty = true;\n        }\n      }\n    }\n  }\n\n  // Draw the scrollbar.\n  // Could possibly draw this after all child elements.\n  if (this.scrollbar) {\n    // XXX\n    // i = this.getScrollHeight();\n    i = Math.max(this._clines.length, this._scrollBottom());\n  }\n  if (coords.notop || coords.nobot) i = -Infinity;\n  if (this.scrollbar && (yl - yi) < i) {\n    x = xl - 1;\n    if (this.scrollbar.ignoreBorder && this.border) x++;\n    if (this.alwaysScroll) {\n      y = this.childBase / (i - (yl - yi));\n    } else {\n      y = (this.childBase + this.childOffset) / (i - 1);\n    }\n    y = yi + ((yl - yi) * y | 0);\n    if (y >= yl) y = yl - 1;\n    cell = lines[y] && lines[y][x];\n    if (cell) {\n      if (this.track) {\n        ch = this.track.ch || ' ';\n        attr = this.sattr(this.style.track,\n          this.style.track.fg || this.style.fg,\n          this.style.track.bg || this.style.bg);\n        this.screen.fillRegion(attr, ch, x, x + 1, yi, yl);\n      }\n      ch = this.scrollbar.ch || ' ';\n      attr = this.sattr(this.style.scrollbar,\n        this.style.scrollbar.fg || this.style.fg,\n        this.style.scrollbar.bg || this.style.bg);\n      if (attr !== cell[0] || ch !== cell[1]) {\n        lines[y][x][0] = attr;\n        lines[y][x][1] = ch;\n        lines[y].dirty = true;\n      }\n    }\n  }\n\n  if (this.border) xi--, xl++, yi--, yl++;\n\n  if (this.tpadding) {\n    xi -= this.padding.left, xl += this.padding.right;\n    yi -= this.padding.top, yl += this.padding.bottom;\n  }\n\n  // Draw the border.\n  if (this.border) {\n    battr = this.sattr(this.style.border);\n    y = yi;\n    if (coords.notop) y = -1;\n    for (x = xi; x < xl; x++) {\n      if (!lines[y]) break;\n      if (coords.noleft && x === xi) continue;\n      if (coords.noright && x === xl - 1) continue;\n      cell = lines[y][x];\n      if (!cell) continue;\n      if (this.border.type === 'line') {\n        if (x === xi) {\n          ch = '\\u250c'; // '┌'\n          if (!this.border.left) {\n            if (this.border.top) {\n              ch = '\\u2500'; // '─'\n            } else {\n              continue;\n            }\n          } else {\n            if (!this.border.top) {\n              ch = '\\u2502'; // '│'\n            }\n          }\n        } else if (x === xl - 1) {\n          ch = '\\u2510'; // '┐'\n          if (!this.border.right) {\n            if (this.border.top) {\n              ch = '\\u2500'; // '─'\n            } else {\n              continue;\n            }\n          } else {\n            if (!this.border.top) {\n              ch = '\\u2502'; // '│'\n            }\n          }\n        } else {\n          ch = '\\u2500'; // '─'\n        }\n      } else if (this.border.type === 'bg') {\n        ch = this.border.ch;\n      }\n      if (!this.border.top && x !== xi && x !== xl - 1) {\n        ch = ' ';\n        if (dattr !== cell[0] || ch !== cell[1]) {\n          lines[y][x][0] = dattr;\n          lines[y][x][1] = ch;\n          lines[y].dirty = true;\n          continue;\n        }\n      }\n      if (battr !== cell[0] || ch !== cell[1]) {\n        lines[y][x][0] = battr;\n        lines[y][x][1] = ch;\n        lines[y].dirty = true;\n      }\n    }\n    y = yi + 1;\n    for (; y < yl - 1; y++) {\n      if (!lines[y]) continue;\n      cell = lines[y][xi];\n      if (cell) {\n        if (this.border.left) {\n          if (this.border.type === 'line') {\n            ch = '\\u2502'; // '│'\n          } else if (this.border.type === 'bg') {\n            ch = this.border.ch;\n          }\n          if (!coords.noleft)\n          if (battr !== cell[0] || ch !== cell[1]) {\n            lines[y][xi][0] = battr;\n            lines[y][xi][1] = ch;\n            lines[y].dirty = true;\n          }\n        } else {\n          ch = ' ';\n          if (dattr !== cell[0] || ch !== cell[1]) {\n            lines[y][xi][0] = dattr;\n            lines[y][xi][1] = ch;\n            lines[y].dirty = true;\n          }\n        }\n      }\n      cell = lines[y][xl - 1];\n      if (cell) {\n        if (this.border.right) {\n          if (this.border.type === 'line') {\n            ch = '\\u2502'; // '│'\n          } else if (this.border.type === 'bg') {\n            ch = this.border.ch;\n          }\n          if (!coords.noright)\n          if (battr !== cell[0] || ch !== cell[1]) {\n            lines[y][xl - 1][0] = battr;\n            lines[y][xl - 1][1] = ch;\n            lines[y].dirty = true;\n          }\n        } else {\n          ch = ' ';\n          if (dattr !== cell[0] || ch !== cell[1]) {\n            lines[y][xl - 1][0] = dattr;\n            lines[y][xl - 1][1] = ch;\n            lines[y].dirty = true;\n          }\n        }\n      }\n    }\n    y = yl - 1;\n    if (coords.nobot) y = -1;\n    for (x = xi; x < xl; x++) {\n      if (!lines[y]) break;\n      if (coords.noleft && x === xi) continue;\n      if (coords.noright && x === xl - 1) continue;\n      cell = lines[y][x];\n      if (!cell) continue;\n      if (this.border.type === 'line') {\n        if (x === xi) {\n          ch = '\\u2514'; // '└'\n          if (!this.border.left) {\n            if (this.border.bottom) {\n              ch = '\\u2500'; // '─'\n            } else {\n              continue;\n            }\n          } else {\n            if (!this.border.bottom) {\n              ch = '\\u2502'; // '│'\n            }\n          }\n        } else if (x === xl - 1) {\n          ch = '\\u2518'; // '┘'\n          if (!this.border.right) {\n            if (this.border.bottom) {\n              ch = '\\u2500'; // '─'\n            } else {\n              continue;\n            }\n          } else {\n            if (!this.border.bottom) {\n              ch = '\\u2502'; // '│'\n            }\n          }\n        } else {\n          ch = '\\u2500'; // '─'\n        }\n      } else if (this.border.type === 'bg') {\n        ch = this.border.ch;\n      }\n      if (!this.border.bottom && x !== xi && x !== xl - 1) {\n        ch = ' ';\n        if (dattr !== cell[0] || ch !== cell[1]) {\n          lines[y][x][0] = dattr;\n          lines[y][x][1] = ch;\n          lines[y].dirty = true;\n        }\n        continue;\n      }\n      if (battr !== cell[0] || ch !== cell[1]) {\n        lines[y][x][0] = battr;\n        lines[y][x][1] = ch;\n        lines[y].dirty = true;\n      }\n    }\n  }\n\n  if (this.shadow) {\n    // right\n    y = Math.max(yi + 1, 0);\n    for (; y < yl + 1; y++) {\n      if (!lines[y]) break;\n      x = xl;\n      for (; x < xl + 2; x++) {\n        if (!lines[y][x]) break;\n        // lines[y][x][0] = colors.blend(this.dattr, lines[y][x][0]);\n        lines[y][x][0] = colors.blend(lines[y][x][0]);\n        lines[y].dirty = true;\n      }\n    }\n    // bottom\n    y = yl;\n    for (; y < yl + 1; y++) {\n      if (!lines[y]) break;\n      for (x = Math.max(xi + 1, 0); x < xl; x++) {\n        if (!lines[y][x]) break;\n        // lines[y][x][0] = colors.blend(this.dattr, lines[y][x][0]);\n        lines[y][x][0] = colors.blend(lines[y][x][0]);\n        lines[y].dirty = true;\n      }\n    }\n  }\n\n  this.children.forEach(function(el) {\n    if (el.screen._ci !== -1) {\n      el.index = el.screen._ci++;\n    }\n    // if (el.screen._rendering) {\n    //   el._rendering = true;\n    // }\n    el.render();\n    // if (el.screen._rendering) {\n    //   el._rendering = false;\n    // }\n  });\n\n  this._emit('render', [coords]);\n\n  return coords;\n};\n\nElement.prototype._render = Element.prototype.render;\n\n/**\n * Content Methods\n */\n\nElement.prototype.insertLine = function(i, line) {\n  if (typeof line === 'string') line = line.split('\\n');\n\n  if (i !== i || i == null) {\n    i = this._clines.ftor.length;\n  }\n\n  i = Math.max(i, 0);\n\n  while (this._clines.fake.length < i) {\n    this._clines.fake.push('');\n    this._clines.ftor.push([this._clines.push('') - 1]);\n    this._clines.rtof(this._clines.fake.length - 1);\n  }\n\n  // NOTE: Could possibly compare the first and last ftor line numbers to see\n  // if they're the same, or if they fit in the visible region entirely.\n  var start = this._clines.length\n    , diff\n    , real;\n\n  if (i >= this._clines.ftor.length) {\n    real = this._clines.ftor[this._clines.ftor.length - 1];\n    real = real[real.length - 1] + 1;\n  } else {\n    real = this._clines.ftor[i][0];\n  }\n\n  for (var j = 0; j < line.length; j++) {\n    this._clines.fake.splice(i + j, 0, line[j]);\n  }\n\n  this.setContent(this._clines.fake.join('\\n'), true);\n\n  diff = this._clines.length - start;\n\n  if (diff > 0) {\n    var pos = this._getCoords();\n    if (!pos) return;\n\n    var height = pos.yl - pos.yi - this.iheight\n      , base = this.childBase || 0\n      , visible = real >= base && real - base < height;\n\n    if (pos && visible && this.screen.cleanSides(this)) {\n      this.screen.insertLine(diff,\n        pos.yi + this.itop + real - base,\n        pos.yi,\n        pos.yl - this.ibottom - 1);\n    }\n  }\n};\n\nElement.prototype.deleteLine = function(i, n) {\n  n = n || 1;\n\n  if (i !== i || i == null) {\n    i = this._clines.ftor.length - 1;\n  }\n\n  i = Math.max(i, 0);\n  i = Math.min(i, this._clines.ftor.length - 1);\n\n  // NOTE: Could possibly compare the first and last ftor line numbers to see\n  // if they're the same, or if they fit in the visible region entirely.\n  var start = this._clines.length\n    , diff\n    , real = this._clines.ftor[i][0];\n\n  while (n--) {\n    this._clines.fake.splice(i, 1);\n  }\n\n  this.setContent(this._clines.fake.join('\\n'), true);\n\n  diff = start - this._clines.length;\n\n  // XXX clearPos() without diff statement?\n  var height = 0;\n\n  if (diff > 0) {\n    var pos = this._getCoords();\n    if (!pos) return;\n\n    height = pos.yl - pos.yi - this.iheight;\n\n    var base = this.childBase || 0\n      , visible = real >= base && real - base < height;\n\n    if (pos && visible && this.screen.cleanSides(this)) {\n      this.screen.deleteLine(diff,\n        pos.yi + this.itop + real - base,\n        pos.yi,\n        pos.yl - this.ibottom - 1);\n    }\n  }\n\n  if (this._clines.length < height) {\n    this.clearPos();\n  }\n};\n\nElement.prototype.insertTop = function(line) {\n  var fake = this._clines.rtof[this.childBase || 0];\n  return this.insertLine(fake, line);\n};\n\nElement.prototype.insertBottom = function(line) {\n  var h = (this.childBase || 0) + this.height - this.iheight\n    , i = Math.min(h, this._clines.length)\n    , fake = this._clines.rtof[i - 1] + 1;\n\n  return this.insertLine(fake, line);\n};\n\nElement.prototype.deleteTop = function(n) {\n  var fake = this._clines.rtof[this.childBase || 0];\n  return this.deleteLine(fake, n);\n};\n\nElement.prototype.deleteBottom = function(n) {\n  var h = (this.childBase || 0) + this.height - 1 - this.iheight\n    , i = Math.min(h, this._clines.length - 1)\n    , fake = this._clines.rtof[i];\n\n  n = n || 1;\n\n  return this.deleteLine(fake - (n - 1), n);\n};\n\nElement.prototype.setLine = function(i, line) {\n  i = Math.max(i, 0);\n  while (this._clines.fake.length < i) {\n    this._clines.fake.push('');\n  }\n  this._clines.fake[i] = line;\n  return this.setContent(this._clines.fake.join('\\n'), true);\n};\n\nElement.prototype.setBaseLine = function(i, line) {\n  var fake = this._clines.rtof[this.childBase || 0];\n  return this.setLine(fake + i, line);\n};\n\nElement.prototype.getLine = function(i) {\n  i = Math.max(i, 0);\n  i = Math.min(i, this._clines.fake.length - 1);\n  return this._clines.fake[i];\n};\n\nElement.prototype.getBaseLine = function(i) {\n  var fake = this._clines.rtof[this.childBase || 0];\n  return this.getLine(fake + i);\n};\n\nElement.prototype.clearLine = function(i) {\n  i = Math.min(i, this._clines.fake.length - 1);\n  return this.setLine(i, '');\n};\n\nElement.prototype.clearBaseLine = function(i) {\n  var fake = this._clines.rtof[this.childBase || 0];\n  return this.clearLine(fake + i);\n};\n\nElement.prototype.unshiftLine = function(line) {\n  return this.insertLine(0, line);\n};\n\nElement.prototype.shiftLine = function(n) {\n  return this.deleteLine(0, n);\n};\n\nElement.prototype.pushLine = function(line) {\n  if (!this.content) return this.setLine(0, line);\n  return this.insertLine(this._clines.fake.length, line);\n};\n\nElement.prototype.popLine = function(n) {\n  return this.deleteLine(this._clines.fake.length - 1, n);\n};\n\nElement.prototype.getLines = function() {\n  return this._clines.fake.slice();\n};\n\nElement.prototype.getScreenLines = function() {\n  return this._clines.slice();\n};\n\nElement.prototype.strWidth = function(text) {\n  text = this.parseTags\n    ? helpers.stripTags(text)\n    : text;\n  return this.screen.fullUnicode\n    ? unicode.strWidth(text)\n    : helpers.dropUnicode(text).length;\n};\n\nElement.prototype.screenshot = function(xi, xl, yi, yl) {\n  xi = this.lpos.xi + this.ileft + (xi || 0);\n  if (xl != null) {\n    xl = this.lpos.xi + this.ileft + (xl || 0);\n  } else {\n    xl = this.lpos.xl - this.iright;\n  }\n  yi = this.lpos.yi + this.itop + (yi || 0);\n  if (yl != null) {\n    yl = this.lpos.yi + this.itop + (yl || 0);\n  } else {\n    yl = this.lpos.yl - this.ibottom;\n  }\n  return this.screen.screenshot(xi, xl, yi, yl);\n};\n\n/**\n * Expose\n */\n\nmodule.exports = Element;\n"
  },
  {
    "path": "lib/widgets/filemanager.js",
    "content": "/**\n * filemanager.js - file manager element for blessed\n * Copyright (c) 2013-2015, Christopher Jeffrey and contributors (MIT License).\n * https://github.com/chjj/blessed\n */\n\n/**\n * Modules\n */\n\nvar path = require('path')\n  , fs = require('fs');\n\nvar helpers = require('../helpers');\n\nvar Node = require('./node');\nvar List = require('./list');\n\n/**\n * FileManager\n */\n\nfunction FileManager(options) {\n  var self = this;\n\n  if (!(this instanceof Node)) {\n    return new FileManager(options);\n  }\n\n  options = options || {};\n  options.parseTags = true;\n  // options.label = ' {blue-fg}%path{/blue-fg} ';\n\n  List.call(this, options);\n\n  this.cwd = options.cwd || process.cwd();\n  this.file = this.cwd;\n  this.value = this.cwd;\n\n  if (options.label && ~options.label.indexOf('%path')) {\n    this._label.setContent(options.label.replace('%path', this.cwd));\n  }\n\n  this.on('select', function(item) {\n    var value = item.content.replace(/\\{[^{}]+\\}/g, '').replace(/@$/, '')\n      , file = path.resolve(self.cwd, value);\n\n    return fs.stat(file, function(err, stat) {\n      if (err) {\n        return self.emit('error', err, file);\n      }\n      self.file = file;\n      self.value = file;\n      if (stat.isDirectory()) {\n        self.emit('cd', file, self.cwd);\n        self.cwd = file;\n        if (options.label && ~options.label.indexOf('%path')) {\n          self._label.setContent(options.label.replace('%path', file));\n        }\n        self.refresh();\n      } else {\n        self.emit('file', file);\n      }\n    });\n  });\n}\n\nFileManager.prototype.__proto__ = List.prototype;\n\nFileManager.prototype.type = 'file-manager';\n\nFileManager.prototype.refresh = function(cwd, callback) {\n  if (!callback) {\n    callback = cwd;\n    cwd = null;\n  }\n\n  var self = this;\n\n  if (cwd) this.cwd = cwd;\n  else cwd = this.cwd;\n\n  return fs.readdir(cwd, function(err, list) {\n    if (err && err.code === 'ENOENT') {\n      self.cwd = cwd !== process.env.HOME\n        ? process.env.HOME\n        : '/';\n      return self.refresh(callback);\n    }\n\n    if (err) {\n      if (callback) return callback(err);\n      return self.emit('error', err, cwd);\n    }\n\n    var dirs = []\n      , files = [];\n\n    list.unshift('..');\n\n    list.forEach(function(name) {\n      var f = path.resolve(cwd, name)\n        , stat;\n\n      try {\n        stat = fs.lstatSync(f);\n      } catch (e) {\n        ;\n      }\n\n      if ((stat && stat.isDirectory()) || name === '..') {\n        dirs.push({\n          name: name,\n          text: '{light-blue-fg}' + name + '{/light-blue-fg}/',\n          dir: true\n        });\n      } else if (stat && stat.isSymbolicLink()) {\n        files.push({\n          name: name,\n          text: '{light-cyan-fg}' + name + '{/light-cyan-fg}@',\n          dir: false\n        });\n      } else {\n        files.push({\n          name: name,\n          text: name,\n          dir: false\n        });\n      }\n    });\n\n    dirs = helpers.asort(dirs);\n    files = helpers.asort(files);\n\n    list = dirs.concat(files).map(function(data) {\n      return data.text;\n    });\n\n    self.setItems(list);\n    self.select(0);\n    self.screen.render();\n\n    self.emit('refresh');\n\n    if (callback) callback();\n  });\n};\n\nFileManager.prototype.pick = function(cwd, callback) {\n  if (!callback) {\n    callback = cwd;\n    cwd = null;\n  }\n\n  var self = this\n    , focused = this.screen.focused === this\n    , hidden = this.hidden\n    , onfile\n    , oncancel;\n\n  function resume() {\n    self.removeListener('file', onfile);\n    self.removeListener('cancel', oncancel);\n    if (hidden) {\n      self.hide();\n    }\n    if (!focused) {\n      self.screen.restoreFocus();\n    }\n    self.screen.render();\n  }\n\n  this.on('file', onfile = function(file) {\n    resume();\n    return callback(null, file);\n  });\n\n  this.on('cancel', oncancel = function() {\n    resume();\n    return callback();\n  });\n\n  this.refresh(cwd, function(err) {\n    if (err) return callback(err);\n\n    if (hidden) {\n      self.show();\n    }\n\n    if (!focused) {\n      self.screen.saveFocus();\n      self.focus();\n    }\n\n    self.screen.render();\n  });\n};\n\nFileManager.prototype.reset = function(cwd, callback) {\n  if (!callback) {\n    callback = cwd;\n    cwd = null;\n  }\n  this.cwd = cwd || this.options.cwd;\n  this.refresh(callback);\n};\n\n/**\n * Expose\n */\n\nmodule.exports = FileManager;\n"
  },
  {
    "path": "lib/widgets/form.js",
    "content": "/**\n * form.js - form element for blessed\n * Copyright (c) 2013-2015, Christopher Jeffrey and contributors (MIT License).\n * https://github.com/chjj/blessed\n */\n\n/**\n * Modules\n */\n\nvar Node = require('./node');\nvar Box = require('./box');\n\n/**\n * Form\n */\n\nfunction Form(options) {\n  var self = this;\n\n  if (!(this instanceof Node)) {\n    return new Form(options);\n  }\n\n  options = options || {};\n\n  options.ignoreKeys = true;\n  Box.call(this, options);\n\n  if (options.keys) {\n    this.screen._listenKeys(this);\n    this.on('element keypress', function(el, ch, key) {\n      if ((key.name === 'tab' && !key.shift)\n          || (el.type === 'textbox' && options.autoNext && key.name === 'enter')\n          || key.name === 'down'\n          || (options.vi && key.name === 'j')) {\n        if (el.type === 'textbox' || el.type === 'textarea') {\n          if (key.name === 'j') return;\n          if (key.name === 'tab') {\n            // Workaround, since we can't stop the tab from being added.\n            el.emit('keypress', null, { name: 'backspace' });\n          }\n          el.emit('keypress', '\\x1b', { name: 'escape' });\n        }\n        self.focusNext();\n        return;\n      }\n\n      if ((key.name === 'tab' && key.shift)\n          || key.name === 'up'\n          || (options.vi && key.name === 'k')) {\n        if (el.type === 'textbox' || el.type === 'textarea') {\n          if (key.name === 'k') return;\n          el.emit('keypress', '\\x1b', { name: 'escape' });\n        }\n        self.focusPrevious();\n        return;\n      }\n\n      if (key.name === 'escape') {\n        self.focus();\n        return;\n      }\n    });\n  }\n}\n\nForm.prototype.__proto__ = Box.prototype;\n\nForm.prototype.type = 'form';\n\nForm.prototype._refresh = function() {\n  // XXX Possibly remove this if statement and refresh on every focus.\n  // Also potentially only include *visible* focusable elements.\n  // This would remove the need to check for _selected.visible in previous()\n  // and next().\n  if (!this._children) {\n    var out = [];\n\n    this.children.forEach(function fn(el) {\n      if (el.keyable) out.push(el);\n      el.children.forEach(fn);\n    });\n\n    this._children = out;\n  }\n};\n\nForm.prototype._visible = function() {\n  return !!this._children.filter(function(el) {\n    return el.visible;\n  }).length;\n};\n\nForm.prototype.next = function() {\n  this._refresh();\n\n  if (!this._visible()) return;\n\n  if (!this._selected) {\n    this._selected = this._children[0];\n    if (!this._selected.visible) return this.next();\n    if (this.screen.focused !== this._selected) return this._selected;\n  }\n\n  var i = this._children.indexOf(this._selected);\n  if (!~i || !this._children[i + 1]) {\n    this._selected = this._children[0];\n    if (!this._selected.visible) return this.next();\n    return this._selected;\n  }\n\n  this._selected = this._children[i + 1];\n  if (!this._selected.visible) return this.next();\n  return this._selected;\n};\n\nForm.prototype.previous = function() {\n  this._refresh();\n\n  if (!this._visible()) return;\n\n  if (!this._selected) {\n    this._selected = this._children[this._children.length - 1];\n    if (!this._selected.visible) return this.previous();\n    if (this.screen.focused !== this._selected) return this._selected;\n  }\n\n  var i = this._children.indexOf(this._selected);\n  if (!~i || !this._children[i - 1]) {\n    this._selected = this._children[this._children.length - 1];\n    if (!this._selected.visible) return this.previous();\n    return this._selected;\n  }\n\n  this._selected = this._children[i - 1];\n  if (!this._selected.visible) return this.previous();\n  return this._selected;\n};\n\nForm.prototype.focusNext = function() {\n  var next = this.next();\n  if (next) next.focus();\n};\n\nForm.prototype.focusPrevious = function() {\n  var previous = this.previous();\n  if (previous) previous.focus();\n};\n\nForm.prototype.resetSelected = function() {\n  this._selected = null;\n};\n\nForm.prototype.focusFirst = function() {\n  this.resetSelected();\n  this.focusNext();\n};\n\nForm.prototype.focusLast = function() {\n  this.resetSelected();\n  this.focusPrevious();\n};\n\nForm.prototype.submit = function() {\n  var out = {};\n\n  this.children.forEach(function fn(el) {\n    if (el.value != null) {\n      var name = el.name || el.type;\n      if (Array.isArray(out[name])) {\n        out[name].push(el.value);\n      } else if (out[name]) {\n        out[name] = [out[name], el.value];\n      } else {\n        out[name] = el.value;\n      }\n    }\n    el.children.forEach(fn);\n  });\n\n  this.emit('submit', out);\n\n  return this.submission = out;\n};\n\nForm.prototype.cancel = function() {\n  this.emit('cancel');\n};\n\nForm.prototype.reset = function() {\n  this.children.forEach(function fn(el) {\n    switch (el.type) {\n      case 'screen':\n        break;\n      case 'box':\n        break;\n      case 'text':\n        break;\n      case 'line':\n        break;\n      case 'scrollable-box':\n        break;\n      case 'list':\n        el.select(0);\n        return;\n      case 'form':\n        break;\n      case 'input':\n        break;\n      case 'textbox':\n        el.clearInput();\n        return;\n      case 'textarea':\n        el.clearInput();\n        return;\n      case 'button':\n        delete el.value;\n        break;\n      case 'progress-bar':\n        el.setProgress(0);\n        break;\n      case 'file-manager':\n        el.refresh(el.options.cwd);\n        return;\n      case 'checkbox':\n        el.uncheck();\n        return;\n      case 'radio-set':\n        break;\n      case 'radio-button':\n        el.uncheck();\n        return;\n      case 'prompt':\n        break;\n      case 'question':\n        break;\n      case 'message':\n        break;\n      case 'info':\n        break;\n      case 'loading':\n        break;\n      case 'list-bar':\n        //el.select(0);\n        break;\n      case 'dir-manager':\n        el.refresh(el.options.cwd);\n        return;\n      case 'terminal':\n        el.write('');\n        return;\n      case 'image':\n        //el.clearImage();\n        return;\n    }\n    el.children.forEach(fn);\n  });\n\n  this.emit('reset');\n};\n\n/**\n * Expose\n */\n\nmodule.exports = Form;\n"
  },
  {
    "path": "lib/widgets/image.js",
    "content": "/**\n * image.js - image element for blessed\n * Copyright (c) 2013-2015, Christopher Jeffrey and contributors (MIT License).\n * https://github.com/chjj/blessed\n */\n\n/**\n * Modules\n */\n\nvar Node = require('./node');\nvar Box = require('./box');\n\n/**\n * Image\n */\n\nfunction Image(options) {\n  if (!(this instanceof Node)) {\n    return new Image(options);\n  }\n\n  options = options || {};\n  options.type = options.itype || options.type || 'ansi';\n\n  Box.call(this, options);\n\n  if (options.type === 'ansi' && this.type !== 'ansiimage') {\n    var ANSIImage = require('./ansiimage');\n    Object.getOwnPropertyNames(ANSIImage.prototype).forEach(function(key) {\n      if (key === 'type') return;\n      Object.defineProperty(this, key,\n        Object.getOwnPropertyDescriptor(ANSIImage.prototype, key));\n    }, this);\n    ANSIImage.call(this, options);\n    return this;\n  }\n\n  if (options.type === 'overlay' && this.type !== 'overlayimage') {\n    var OverlayImage = require('./overlayimage');\n    Object.getOwnPropertyNames(OverlayImage.prototype).forEach(function(key) {\n      if (key === 'type') return;\n      Object.defineProperty(this, key,\n        Object.getOwnPropertyDescriptor(OverlayImage.prototype, key));\n    }, this);\n    OverlayImage.call(this, options);\n    return this;\n  }\n\n  throw new Error('`type` must either be `ansi` or `overlay`.');\n}\n\nImage.prototype.__proto__ = Box.prototype;\n\nImage.prototype.type = 'image';\n\n/**\n * Expose\n */\n\nmodule.exports = Image;\n"
  },
  {
    "path": "lib/widgets/input.js",
    "content": "/**\n * input.js - abstract input element for blessed\n * Copyright (c) 2013-2015, Christopher Jeffrey and contributors (MIT License).\n * https://github.com/chjj/blessed\n */\n\n/**\n * Modules\n */\n\nvar Node = require('./node');\nvar Box = require('./box');\n\n/**\n * Input\n */\n\nfunction Input(options) {\n  if (!(this instanceof Node)) {\n    return new Input(options);\n  }\n  options = options || {};\n  Box.call(this, options);\n}\n\nInput.prototype.__proto__ = Box.prototype;\n\nInput.prototype.type = 'input';\n\n/**\n * Expose\n */\n\nmodule.exports = Input;\n"
  },
  {
    "path": "lib/widgets/layout.js",
    "content": "/**\n * layout.js - layout element for blessed\n * Copyright (c) 2013-2015, Christopher Jeffrey and contributors (MIT License).\n * https://github.com/chjj/blessed\n */\n\n/**\n * Modules\n */\n\nvar Node = require('./node');\nvar Element = require('./element');\n\n/**\n * Layout\n */\n\nfunction Layout(options) {\n  if (!(this instanceof Node)) {\n    return new Layout(options);\n  }\n\n  options = options || {};\n\n  if ((options.width == null\n      && (options.left == null && options.right == null))\n      || (options.height == null\n      && (options.top == null && options.bottom == null))) {\n    throw new Error('`Layout` must have a width and height!');\n  }\n\n  options.layout = options.layout || 'inline';\n\n  Element.call(this, options);\n\n  if (options.renderer) {\n    this.renderer = options.renderer;\n  }\n}\n\nLayout.prototype.__proto__ = Element.prototype;\n\nLayout.prototype.type = 'layout';\n\nLayout.prototype.isRendered = function(el) {\n  if (!el.lpos) return false;\n  return (el.lpos.xl - el.lpos.xi) > 0\n      && (el.lpos.yl - el.lpos.yi) > 0;\n};\n\nLayout.prototype.getLast = function(i) {\n  while (this.children[--i]) {\n    var el = this.children[i];\n    if (this.isRendered(el)) return el;\n  }\n};\n\nLayout.prototype.getLastCoords = function(i) {\n  var last = this.getLast(i);\n  if (last) return last.lpos;\n};\n\nLayout.prototype._renderCoords = function() {\n  var coords = this._getCoords(true);\n  var children = this.children;\n  this.children = [];\n  this._render();\n  this.children = children;\n  return coords;\n};\n\nLayout.prototype.renderer = function(coords) {\n  var self = this;\n\n  // The coordinates of the layout element\n  var width = coords.xl - coords.xi\n    , height = coords.yl - coords.yi\n    , xi = coords.xi\n    , yi = coords.yi;\n\n  // The current row offset in cells (which row are we on?)\n  var rowOffset = 0;\n\n  // The index of the first child in the row\n  var rowIndex = 0;\n  var lastRowIndex = 0;\n\n  // Figure out the highest width child\n  if (this.options.layout === 'grid') {\n    var highWidth = this.children.reduce(function(out, el) {\n      out = Math.max(out, el.width);\n      return out;\n    }, 0);\n  }\n\n  return function iterator(el, i) {\n    // Make our children shrinkable. If they don't have a height, for\n    // example, calculate it for them.\n    el.shrink = true;\n\n    // Find the previous rendered child's coordinates\n    var last = self.getLast(i);\n\n    // If there is no previously rendered element, we are on the first child.\n    if (!last) {\n      el.position.left = 0;\n      el.position.top = 0;\n    } else {\n      // Otherwise, figure out where to place this child. We'll start by\n      // setting it's `left`/`x` coordinate to right after the previous\n      // rendered element. This child will end up directly to the right of it.\n      el.position.left = last.lpos.xl - xi;\n\n      // Make sure the position matches the highest width element\n      if (self.options.layout === 'grid') {\n        // Compensate with width:\n        // el.position.width = el.width + (highWidth - el.width);\n        // Compensate with position:\n        el.position.left += highWidth - (last.lpos.xl - last.lpos.xi);\n      }\n\n      // If our child does not overlap the right side of the Layout, set it's\n      // `top`/`y` to the current `rowOffset` (the coordinate for the current\n      // row).\n      if (el.position.left + el.width <= width) {\n        el.position.top = rowOffset;\n      } else {\n        // Otherwise we need to start a new row and calculate a new\n        // `rowOffset` and `rowIndex` (the index of the child on the current\n        // row).\n        rowOffset += self.children.slice(rowIndex, i).reduce(function(out, el) {\n          if (!self.isRendered(el)) return out;\n          out = Math.max(out, el.lpos.yl - el.lpos.yi);\n          return out;\n        }, 0);\n        lastRowIndex = rowIndex;\n        rowIndex = i;\n        el.position.left = 0;\n        el.position.top = rowOffset;\n      }\n    }\n\n    // Make sure the elements on lower rows graviatate up as much as possible\n    if (self.options.layout === 'inline') {\n      var above = null;\n      var abovea = Infinity;\n      for (var j = lastRowIndex; j < rowIndex; j++) {\n        var l = self.children[j];\n        if (!self.isRendered(l)) continue;\n        var abs = Math.abs(el.position.left - (l.lpos.xi - xi));\n        // if (abs < abovea && (l.lpos.xl - l.lpos.xi) <= el.width) {\n        if (abs < abovea) {\n          above = l;\n          abovea = abs;\n        }\n      }\n      if (above) {\n        el.position.top = above.lpos.yl - yi;\n      }\n    }\n\n    // If our child overflows the Layout, do not render it!\n    // Disable this feature for now.\n    if (el.position.top + el.height > height) {\n      // Returning false tells blessed to ignore this child.\n      // return false;\n    }\n  };\n};\n\nLayout.prototype.render = function() {\n  this._emit('prerender');\n\n  var coords = this._renderCoords();\n  if (!coords) {\n    delete this.lpos;\n    return;\n  }\n\n  if (coords.xl - coords.xi <= 0) {\n    coords.xl = Math.max(coords.xl, coords.xi);\n    return;\n  }\n\n  if (coords.yl - coords.yi <= 0) {\n    coords.yl = Math.max(coords.yl, coords.yi);\n    return;\n  }\n\n  this.lpos = coords;\n\n  if (this.border) coords.xi++, coords.xl--, coords.yi++, coords.yl--;\n  if (this.tpadding) {\n    coords.xi += this.padding.left, coords.xl -= this.padding.right;\n    coords.yi += this.padding.top, coords.yl -= this.padding.bottom;\n  }\n\n  var iterator = this.renderer(coords);\n\n  if (this.border) coords.xi--, coords.xl++, coords.yi--, coords.yl++;\n  if (this.tpadding) {\n    coords.xi -= this.padding.left, coords.xl += this.padding.right;\n    coords.yi -= this.padding.top, coords.yl += this.padding.bottom;\n  }\n\n  this.children.forEach(function(el, i) {\n    if (el.screen._ci !== -1) {\n      el.index = el.screen._ci++;\n    }\n    var rendered = iterator(el, i);\n    if (rendered === false) {\n      delete el.lpos;\n      return;\n    }\n    // if (el.screen._rendering) {\n    //   el._rendering = true;\n    // }\n    el.render();\n    // if (el.screen._rendering) {\n    //   el._rendering = false;\n    // }\n  });\n\n  this._emit('render', [coords]);\n\n  return coords;\n};\n\n/**\n * Expose\n */\n\nmodule.exports = Layout;\n"
  },
  {
    "path": "lib/widgets/line.js",
    "content": "/**\n * line.js - line element for blessed\n * Copyright (c) 2013-2015, Christopher Jeffrey and contributors (MIT License).\n * https://github.com/chjj/blessed\n */\n\n/**\n * Modules\n */\n\nvar Node = require('./node');\nvar Box = require('./box');\n\n/**\n * Line\n */\n\nfunction Line(options) {\n  if (!(this instanceof Node)) {\n    return new Line(options);\n  }\n\n  options = options || {};\n\n  var orientation = options.orientation || 'vertical';\n  delete options.orientation;\n\n  if (orientation === 'vertical') {\n    options.width = 1;\n  } else {\n    options.height = 1;\n  }\n\n  Box.call(this, options);\n\n  this.ch = !options.type || options.type === 'line'\n    ? orientation === 'horizontal' ? '─' : '│'\n    : options.ch || ' ';\n\n  this.border = {\n    type: 'bg',\n    __proto__: this\n  };\n\n  this.style.border = this.style;\n}\n\nLine.prototype.__proto__ = Box.prototype;\n\nLine.prototype.type = 'line';\n\n/**\n * Expose\n */\n\nmodule.exports = Line;\n"
  },
  {
    "path": "lib/widgets/list.js",
    "content": "/**\n * list.js - list element for blessed\n * Copyright (c) 2013-2015, Christopher Jeffrey and contributors (MIT License).\n * https://github.com/chjj/blessed\n */\n\n/**\n * Modules\n */\n\nvar helpers = require('../helpers');\n\nvar Node = require('./node');\nvar Box = require('./box');\n\n/**\n * List\n */\n\nfunction List(options) {\n  var self = this;\n\n  if (!(this instanceof Node)) {\n    return new List(options);\n  }\n\n  options = options || {};\n\n  options.ignoreKeys = true;\n  // Possibly put this here: this.items = [];\n  options.scrollable = true;\n  Box.call(this, options);\n\n  this.value = '';\n  this.items = [];\n  this.ritems = [];\n  this.selected = 0;\n  this._isList = true;\n\n  if (!this.style.selected) {\n    this.style.selected = {};\n    this.style.selected.bg = options.selectedBg;\n    this.style.selected.fg = options.selectedFg;\n    this.style.selected.bold = options.selectedBold;\n    this.style.selected.underline = options.selectedUnderline;\n    this.style.selected.blink = options.selectedBlink;\n    this.style.selected.inverse = options.selectedInverse;\n    this.style.selected.invisible = options.selectedInvisible;\n  }\n\n  if (!this.style.item) {\n    this.style.item = {};\n    this.style.item.bg = options.itemBg;\n    this.style.item.fg = options.itemFg;\n    this.style.item.bold = options.itemBold;\n    this.style.item.underline = options.itemUnderline;\n    this.style.item.blink = options.itemBlink;\n    this.style.item.inverse = options.itemInverse;\n    this.style.item.invisible = options.itemInvisible;\n  }\n\n  // Legacy: for apps written before the addition of item attributes.\n  ['bg', 'fg', 'bold', 'underline',\n   'blink', 'inverse', 'invisible'].forEach(function(name) {\n    if (self.style[name] != null && self.style.item[name] == null) {\n      self.style.item[name] = self.style[name];\n    }\n  });\n\n  if (this.options.itemHoverBg) {\n    this.options.itemHoverEffects = { bg: this.options.itemHoverBg };\n  }\n\n  if (this.options.itemHoverEffects) {\n    this.style.item.hover = this.options.itemHoverEffects;\n  }\n\n  if (this.options.itemFocusEffects) {\n    this.style.item.focus = this.options.itemFocusEffects;\n  }\n\n  this.interactive = options.interactive !== false;\n\n  this.mouse = options.mouse || false;\n\n  if (options.items) {\n    this.ritems = options.items;\n    options.items.forEach(this.add.bind(this));\n  }\n\n  this.select(0);\n\n  if (options.mouse) {\n    this.screen._listenMouse(this);\n    this.on('element wheeldown', function() {\n      self.select(self.selected + 2);\n      self.screen.render();\n    });\n    this.on('element wheelup', function() {\n      self.select(self.selected - 2);\n      self.screen.render();\n    });\n  }\n\n  if (options.keys) {\n    this.on('keypress', function(ch, key) {\n      if (key.name === 'up' || (options.vi && key.name === 'k')) {\n        self.up();\n        self.screen.render();\n        return;\n      }\n      if (key.name === 'down' || (options.vi && key.name === 'j')) {\n        self.down();\n        self.screen.render();\n        return;\n      }\n      if (key.name === 'enter'\n          || (options.vi && key.name === 'l' && !key.shift)) {\n        self.enterSelected();\n        return;\n      }\n      if (key.name === 'escape' || (options.vi && key.name === 'q')) {\n        self.cancelSelected();\n        return;\n      }\n      if (options.vi && key.name === 'u' && key.ctrl) {\n        self.move(-((self.height - self.iheight) / 2) | 0);\n        self.screen.render();\n        return;\n      }\n      if (options.vi && key.name === 'd' && key.ctrl) {\n        self.move((self.height - self.iheight) / 2 | 0);\n        self.screen.render();\n        return;\n      }\n      if (options.vi && key.name === 'b' && key.ctrl) {\n        self.move(-(self.height - self.iheight));\n        self.screen.render();\n        return;\n      }\n      if (options.vi && key.name === 'f' && key.ctrl) {\n        self.move(self.height - self.iheight);\n        self.screen.render();\n        return;\n      }\n      if (options.vi && key.name === 'h' && key.shift) {\n        self.move(self.childBase - self.selected);\n        self.screen.render();\n        return;\n      }\n      if (options.vi && key.name === 'm' && key.shift) {\n        // TODO: Maybe use Math.min(this.items.length,\n        // ... for calculating visible items elsewhere.\n        var visible = Math.min(\n          self.height - self.iheight,\n          self.items.length) / 2 | 0;\n        self.move(self.childBase + visible - self.selected);\n        self.screen.render();\n        return;\n      }\n      if (options.vi && key.name === 'l' && key.shift) {\n        // XXX This goes one too far on lists with an odd number of items.\n        self.down(self.childBase\n          + Math.min(self.height - self.iheight, self.items.length)\n          - self.selected);\n        self.screen.render();\n        return;\n      }\n      if (options.vi && key.name === 'g' && !key.shift) {\n        self.select(0);\n        self.screen.render();\n        return;\n      }\n      if (options.vi && key.name === 'g' && key.shift) {\n        self.select(self.items.length - 1);\n        self.screen.render();\n        return;\n      }\n\n      if (options.vi && (key.ch === '/' || key.ch === '?')) {\n        if (typeof self.options.search !== 'function') {\n          return;\n        }\n        return self.options.search(function(err, value) {\n          if (typeof err === 'string' || typeof err === 'function'\n              || typeof err === 'number' || (err && err.test)) {\n            value = err;\n            err = null;\n          }\n          if (err || !value) return self.screen.render();\n          self.select(self.fuzzyFind(value, key.ch === '?'));\n          self.screen.render();\n        });\n      }\n    });\n  }\n\n  this.on('resize', function() {\n    var visible = self.height - self.iheight;\n    // if (self.selected < visible - 1) {\n    if (visible >= self.selected + 1) {\n      self.childBase = 0;\n      self.childOffset = self.selected;\n    } else {\n      // Is this supposed to be: self.childBase = visible - self.selected + 1; ?\n      self.childBase = self.selected - visible + 1;\n      self.childOffset = visible - 1;\n    }\n  });\n\n  this.on('adopt', function(el) {\n    if (!~self.items.indexOf(el)) {\n      el.fixed = true;\n    }\n  });\n\n  // Ensure children are removed from the\n  // item list if they are items.\n  this.on('remove', function(el) {\n    self.removeItem(el);\n  });\n}\n\nList.prototype.__proto__ = Box.prototype;\n\nList.prototype.type = 'list';\n\nList.prototype.createItem = function(content) {\n  var self = this;\n\n  // Note: Could potentially use Button here.\n  var options = {\n    screen: this.screen,\n    content: content,\n    align: this.align || 'left',\n    top: 0,\n    left: 0,\n    right: (this.scrollbar ? 1 : 0),\n    tags: this.parseTags,\n    height: 1,\n    hoverEffects: this.mouse ? this.style.item.hover : null,\n    focusEffects: this.mouse ? this.style.item.focus : null,\n    autoFocus: false\n  };\n\n  if (!this.screen.autoPadding) {\n    options.top = 1;\n    options.left = this.ileft;\n    options.right = this.iright + (this.scrollbar ? 1 : 0);\n  }\n\n  // if (this.shrink) {\n  // XXX NOTE: Maybe just do this on all shrinkage once autoPadding is default?\n  if (this.shrink && this.options.normalShrink) {\n    delete options.right;\n    options.width = 'shrink';\n  }\n\n  ['bg', 'fg', 'bold', 'underline',\n   'blink', 'inverse', 'invisible'].forEach(function(name) {\n    options[name] = function() {\n      var attr = self.items[self.selected] === item && self.interactive\n        ? self.style.selected[name]\n        : self.style.item[name];\n      if (typeof attr === 'function') attr = attr(item);\n      return attr;\n    };\n  });\n\n  if (this.style.transparent) {\n    options.transparent = true;\n  }\n\n  var item = new Box(options);\n\n  if (this.mouse) {\n    item.on('click', function() {\n      self.focus();\n      if (self.items[self.selected] === item) {\n        self.emit('action', item, self.selected);\n        self.emit('select', item, self.selected);\n        return;\n      }\n      self.select(item);\n      self.screen.render();\n    });\n  }\n\n  this.emit('create item');\n\n  return item;\n};\n\nList.prototype.add =\nList.prototype.addItem =\nList.prototype.appendItem = function(content) {\n  content = typeof content === 'string' ? content : content.getContent();\n\n  var item = this.createItem(content);\n  item.position.top = this.items.length;\n  if (!this.screen.autoPadding) {\n    item.position.top = this.itop + this.items.length;\n  }\n\n  this.ritems.push(content);\n  this.items.push(item);\n  this.append(item);\n\n  if (this.items.length === 1) {\n    this.select(0);\n  }\n\n  this.emit('add item');\n\n  return item;\n};\n\nList.prototype.removeItem = function(child) {\n  var i = this.getItemIndex(child);\n  if (~i && this.items[i]) {\n    child = this.items.splice(i, 1)[0];\n    this.ritems.splice(i, 1);\n    this.remove(child);\n    for (var j = i; j < this.items.length; j++) {\n      this.items[j].position.top--;\n    }\n    if (i === this.selected) {\n      this.select(i - 1);\n    }\n  }\n  this.emit('remove item');\n  return child;\n};\n\nList.prototype.insertItem = function(child, content) {\n  content = typeof content === 'string' ? content : content.getContent();\n  var i = this.getItemIndex(child);\n  if (!~i) return;\n  if (i >= this.items.length) return this.appendItem(content);\n  var item = this.createItem(content);\n  for (var j = i; j < this.items.length; j++) {\n    this.items[j].position.top++;\n  }\n  item.position.top = i + (!this.screen.autoPadding ? 1 : 0);\n  this.ritems.splice(i, 0, content);\n  this.items.splice(i, 0, item);\n  this.append(item);\n  if (i === this.selected) {\n    this.select(i + 1);\n  }\n  this.emit('insert item');\n};\n\nList.prototype.getItem = function(child) {\n  return this.items[this.getItemIndex(child)];\n};\n\nList.prototype.setItem = function(child, content) {\n  content = typeof content === 'string' ? content : content.getContent();\n  var i = this.getItemIndex(child);\n  if (!~i) return;\n  this.items[i].setContent(content);\n  this.ritems[i] = content;\n};\n\nList.prototype.clearItems = function() {\n  return this.setItems([]);\n};\n\nList.prototype.setItems = function(items) {\n  var original = this.items.slice()\n    , selected = this.selected\n    , sel = this.ritems[this.selected]\n    , i = 0;\n\n  items = items.slice();\n\n  this.select(0);\n\n  for (; i < items.length; i++) {\n    if (this.items[i]) {\n      this.items[i].setContent(items[i]);\n    } else {\n      this.add(items[i]);\n    }\n  }\n\n  for (; i < original.length; i++) {\n    this.remove(original[i]);\n  }\n\n  this.ritems = items;\n\n  // Try to find our old item if it still exists.\n  sel = items.indexOf(sel);\n  if (~sel) {\n    this.select(sel);\n  } else if (items.length === original.length) {\n    this.select(selected);\n  } else {\n    this.select(Math.min(selected, items.length - 1));\n  }\n\n  this.emit('set items');\n};\n\nList.prototype.pushItem = function(content) {\n  this.appendItem(content);\n  return this.items.length;\n};\n\nList.prototype.popItem = function() {\n  return this.removeItem(this.items.length - 1);\n};\n\nList.prototype.unshiftItem = function(content) {\n  this.insertItem(0, content);\n  return this.items.length;\n};\n\nList.prototype.shiftItem = function() {\n  return this.removeItem(0);\n};\n\nList.prototype.spliceItem = function(child, n) {\n  var self = this;\n  var i = this.getItemIndex(child);\n  if (!~i) return;\n  var items = Array.prototype.slice.call(arguments, 2);\n  var removed = [];\n  while (n--) {\n    removed.push(this.removeItem(i));\n  }\n  items.forEach(function(item) {\n    self.insertItem(i++, item);\n  });\n  return removed;\n};\n\nList.prototype.find =\nList.prototype.fuzzyFind = function(search, back) {\n  var start = this.selected + (back ? -1 : 1)\n    , i;\n\n  if (typeof search === 'number') search += '';\n\n  if (search && search[0] === '/' && search[search.length - 1] === '/') {\n    try {\n      search = new RegExp(search.slice(1, -1));\n    } catch (e) {\n      ;\n    }\n  }\n\n  var test = typeof search === 'string'\n    ? function(item) { return !!~item.indexOf(search); }\n    : (search.test ? search.test.bind(search) : search);\n\n  if (typeof test !== 'function') {\n    if (this.screen.options.debug) {\n      throw new Error('fuzzyFind(): `test` is not a function.');\n    }\n    return this.selected;\n  }\n\n  if (!back) {\n    for (i = start; i < this.ritems.length; i++) {\n      if (test(helpers.cleanTags(this.ritems[i]))) return i;\n    }\n    for (i = 0; i < start; i++) {\n      if (test(helpers.cleanTags(this.ritems[i]))) return i;\n    }\n  } else {\n    for (i = start; i >= 0; i--) {\n      if (test(helpers.cleanTags(this.ritems[i]))) return i;\n    }\n    for (i = this.ritems.length - 1; i > start; i--) {\n      if (test(helpers.cleanTags(this.ritems[i]))) return i;\n    }\n  }\n\n  return this.selected;\n};\n\nList.prototype.getItemIndex = function(child) {\n  if (typeof child === 'number') {\n    return child;\n  } else if (typeof child === 'string') {\n    var i = this.ritems.indexOf(child);\n    if (~i) return i;\n    for (i = 0; i < this.ritems.length; i++) {\n      if (helpers.cleanTags(this.ritems[i]) === child) {\n        return i;\n      }\n    }\n    return -1;\n  } else {\n    return this.items.indexOf(child);\n  }\n};\n\nList.prototype.select = function(index) {\n  if (!this.interactive) {\n    return;\n  }\n\n  if (!this.items.length) {\n    this.selected = 0;\n    this.value = '';\n    this.scrollTo(0);\n    return;\n  }\n\n  if (typeof index === 'object') {\n    index = this.items.indexOf(index);\n  }\n\n  if (index < 0) {\n    index = 0;\n  } else if (index >= this.items.length) {\n    index = this.items.length - 1;\n  }\n\n  if (this.selected === index && this._listInitialized) return;\n  this._listInitialized = true;\n\n  this.selected = index;\n  this.value = helpers.cleanTags(this.ritems[this.selected]);\n  if (!this.parent) return;\n  this.scrollTo(this.selected);\n\n  // XXX Move `action` and `select` events here.\n  this.emit('select item', this.items[this.selected], this.selected);\n};\n\nList.prototype.move = function(offset) {\n  this.select(this.selected + offset);\n};\n\nList.prototype.up = function(offset) {\n  this.move(-(offset || 1));\n};\n\nList.prototype.down = function(offset) {\n  this.move(offset || 1);\n};\n\nList.prototype.pick = function(label, callback) {\n  if (!callback) {\n    callback = label;\n    label = null;\n  }\n\n  if (!this.interactive) {\n    return callback();\n  }\n\n  var self = this;\n  var focused = this.screen.focused;\n  if (focused && focused._done) focused._done('stop');\n  this.screen.saveFocus();\n\n  // XXX Keep above:\n  // var parent = this.parent;\n  // this.detach();\n  // parent.append(this);\n\n  this.focus();\n  this.show();\n  this.select(0);\n  if (label) this.setLabel(label);\n  this.screen.render();\n  this.once('action', function(el, selected) {\n    if (label) self.removeLabel();\n    self.screen.restoreFocus();\n    self.hide();\n    self.screen.render();\n    if (!el) return callback();\n    return callback(null, helpers.cleanTags(self.ritems[selected]));\n  });\n};\n\nList.prototype.enterSelected = function(i) {\n  if (i != null) this.select(i);\n  this.emit('action', this.items[this.selected], this.selected);\n  this.emit('select', this.items[this.selected], this.selected);\n};\n\nList.prototype.cancelSelected = function(i) {\n  if (i != null) this.select(i);\n  this.emit('action');\n  this.emit('cancel');\n};\n\n/**\n * Expose\n */\n\nmodule.exports = List;\n"
  },
  {
    "path": "lib/widgets/listbar.js",
    "content": "/**\n * listbar.js - listbar element for blessed\n * Copyright (c) 2013-2015, Christopher Jeffrey and contributors (MIT License).\n * https://github.com/chjj/blessed\n */\n\n/**\n * Modules\n */\n\nvar helpers = require('../helpers');\n\nvar Node = require('./node');\nvar Box = require('./box');\n\n/**\n * Listbar / HorizontalList\n */\n\nfunction Listbar(options) {\n  var self = this;\n\n  if (!(this instanceof Node)) {\n    return new Listbar(options);\n  }\n\n  options = options || {};\n\n  this.items = [];\n  this.ritems = [];\n  this.commands = [];\n\n  this.leftBase = 0;\n  this.leftOffset = 0;\n\n  this.mouse = options.mouse || false;\n\n  Box.call(this, options);\n\n  if (!this.style.selected) {\n    this.style.selected = {};\n  }\n\n  if (!this.style.item) {\n    this.style.item = {};\n  }\n\n  if (options.commands || options.items) {\n    this.setItems(options.commands || options.items);\n  }\n\n  if (options.keys) {\n    this.on('keypress', function(ch, key) {\n      if (key.name === 'left'\n          || (options.vi && key.name === 'h')\n          || (key.shift && key.name === 'tab')) {\n        self.moveLeft();\n        self.screen.render();\n        // Stop propagation if we're in a form.\n        if (key.name === 'tab') return false;\n        return;\n      }\n      if (key.name === 'right'\n          || (options.vi && key.name === 'l')\n          || key.name === 'tab') {\n        self.moveRight();\n        self.screen.render();\n        // Stop propagation if we're in a form.\n        if (key.name === 'tab') return false;\n        return;\n      }\n      if (key.name === 'enter'\n          || (options.vi && key.name === 'k' && !key.shift)) {\n        self.emit('action', self.items[self.selected], self.selected);\n        self.emit('select', self.items[self.selected], self.selected);\n        var item = self.items[self.selected];\n        if (item._.cmd.callback) {\n          item._.cmd.callback();\n        }\n        self.screen.render();\n        return;\n      }\n      if (key.name === 'escape' || (options.vi && key.name === 'q')) {\n        self.emit('action');\n        self.emit('cancel');\n        return;\n      }\n    });\n  }\n\n  if (options.autoCommandKeys) {\n    this.onScreenEvent('keypress', function(ch) {\n      if (/^[0-9]$/.test(ch)) {\n        var i = +ch - 1;\n        if (!~i) i = 9;\n        return self.selectTab(i);\n      }\n    });\n  }\n\n  this.on('focus', function() {\n    self.select(self.selected);\n  });\n}\n\nListbar.prototype.__proto__ = Box.prototype;\n\nListbar.prototype.type = 'listbar';\n\nListbar.prototype.__defineGetter__('selected', function() {\n  return this.leftBase + this.leftOffset;\n});\n\nListbar.prototype.setItems = function(commands) {\n  var self = this;\n\n  if (!Array.isArray(commands)) {\n    commands = Object.keys(commands).reduce(function(obj, key, i) {\n      var cmd = commands[key]\n        , cb;\n\n      if (typeof cmd === 'function') {\n        cb = cmd;\n        cmd = { callback: cb };\n      }\n\n      if (cmd.text == null) cmd.text = key;\n      if (cmd.prefix == null) cmd.prefix = ++i + '';\n\n      if (cmd.text == null && cmd.callback) {\n        cmd.text = cmd.callback.name;\n      }\n\n      obj.push(cmd);\n\n      return obj;\n    }, []);\n  }\n\n  this.items.forEach(function(el) {\n    el.detach();\n  });\n\n  this.items = [];\n  this.ritems = [];\n  this.commands = [];\n\n  commands.forEach(function(cmd) {\n    self.add(cmd);\n  });\n\n  this.emit('set items');\n};\n\nListbar.prototype.add =\nListbar.prototype.addItem =\nListbar.prototype.appendItem = function(item, callback) {\n  var self = this\n    , prev = this.items[this.items.length - 1]\n    , drawn\n    , cmd\n    , title\n    , len;\n\n  if (!this.parent) {\n    drawn = 0;\n  } else {\n    drawn = prev ? prev.aleft + prev.width : 0;\n    if (!this.screen.autoPadding) {\n      drawn += this.ileft;\n    }\n  }\n\n  if (typeof item === 'object') {\n    cmd = item;\n    if (cmd.prefix == null) cmd.prefix = (this.items.length + 1) + '';\n  }\n\n  if (typeof item === 'string') {\n    cmd = {\n      prefix: (this.items.length + 1) + '',\n      text: item,\n      callback: callback\n    };\n  }\n\n  if (typeof item === 'function') {\n    cmd = {\n      prefix: (this.items.length + 1) + '',\n      text: item.name,\n      callback: item\n    };\n  }\n\n  if (cmd.keys && cmd.keys[0]) {\n    cmd.prefix = cmd.keys[0];\n  }\n\n  var t = helpers.generateTags(this.style.prefix || { fg: 'lightblack' });\n\n  title = (cmd.prefix != null ? t.open + cmd.prefix + t.close + ':' : '') + cmd.text;\n\n  len = ((cmd.prefix != null ? cmd.prefix + ':' : '') + cmd.text).length;\n\n  var options = {\n    screen: this.screen,\n    top: 0,\n    left: drawn + 1,\n    height: 1,\n    content: title,\n    width: len + 2,\n    align: 'center',\n    autoFocus: false,\n    tags: true,\n    mouse: true,\n    style: helpers.merge({}, this.style.item),\n    noOverflow: true\n  };\n\n  if (!this.screen.autoPadding) {\n    options.top += this.itop;\n    options.left += this.ileft;\n  }\n\n  ['bg', 'fg', 'bold', 'underline',\n   'blink', 'inverse', 'invisible'].forEach(function(name) {\n    options.style[name] = function() {\n      var attr = self.items[self.selected] === el\n        ? self.style.selected[name]\n        : self.style.item[name];\n      if (typeof attr === 'function') attr = attr(el);\n      return attr;\n    };\n  });\n\n  var el = new Box(options);\n\n  this._[cmd.text] = el;\n  cmd.element = el;\n  el._.cmd = cmd;\n\n  this.ritems.push(cmd.text);\n  this.items.push(el);\n  this.commands.push(cmd);\n  this.append(el);\n\n  if (cmd.callback) {\n    if (cmd.keys) {\n      this.screen.key(cmd.keys, function() {\n        self.emit('action', el, self.selected);\n        self.emit('select', el, self.selected);\n        if (el._.cmd.callback) {\n          el._.cmd.callback();\n        }\n        self.select(el);\n        self.screen.render();\n      });\n    }\n  }\n\n  if (this.items.length === 1) {\n    this.select(0);\n  }\n\n  // XXX May be affected by new element.options.mouse option.\n  if (this.mouse) {\n    el.on('click', function() {\n      self.emit('action', el, self.selected);\n      self.emit('select', el, self.selected);\n      if (el._.cmd.callback) {\n        el._.cmd.callback();\n      }\n      self.select(el);\n      self.screen.render();\n    });\n  }\n\n  this.emit('add item');\n};\n\nListbar.prototype.render = function() {\n  var self = this\n    , drawn = 0;\n\n  if (!this.screen.autoPadding) {\n    drawn += this.ileft;\n  }\n\n  this.items.forEach(function(el, i) {\n    if (i < self.leftBase) {\n      el.hide();\n    } else {\n      el.rleft = drawn + 1;\n      drawn += el.width + 2;\n      el.show();\n    }\n  });\n\n  return this._render();\n};\n\nListbar.prototype.select = function(offset) {\n  if (typeof offset !== 'number') {\n    offset = this.items.indexOf(offset);\n  }\n\n  if (offset < 0) {\n    offset = 0;\n  } else if (offset >= this.items.length) {\n    offset = this.items.length - 1;\n  }\n\n  if (!this.parent) {\n    this.emit('select item', this.items[offset], offset);\n    return;\n  }\n\n  var lpos = this._getCoords();\n  if (!lpos) return;\n\n  var self = this\n    , width = (lpos.xl - lpos.xi) - this.iwidth\n    , drawn = 0\n    , visible = 0\n    , el;\n\n  el = this.items[offset];\n  if (!el) return;\n\n  this.items.forEach(function(el, i) {\n    if (i < self.leftBase) return;\n\n    var lpos = el._getCoords();\n    if (!lpos) return;\n\n    if (lpos.xl - lpos.xi <= 0) return;\n\n    drawn += (lpos.xl - lpos.xi) + 2;\n\n    if (drawn <= width) visible++;\n  });\n\n  var diff = offset - (this.leftBase + this.leftOffset);\n  if (offset > this.leftBase + this.leftOffset) {\n    if (offset > this.leftBase + visible - 1) {\n      this.leftOffset = 0;\n      this.leftBase = offset;\n    } else {\n      this.leftOffset += diff;\n    }\n  } else if (offset < this.leftBase + this.leftOffset) {\n    diff = -diff;\n    if (offset < this.leftBase) {\n      this.leftOffset = 0;\n      this.leftBase = offset;\n    } else {\n      this.leftOffset -= diff;\n    }\n  }\n\n  // XXX Move `action` and `select` events here.\n  this.emit('select item', el, offset);\n};\n\nListbar.prototype.removeItem = function(child) {\n  var i = typeof child !== 'number'\n    ? this.items.indexOf(child)\n    : child;\n\n  if (~i && this.items[i]) {\n    child = this.items.splice(i, 1)[0];\n    this.ritems.splice(i, 1);\n    this.commands.splice(i, 1);\n    this.remove(child);\n    if (i === this.selected) {\n      this.select(i - 1);\n    }\n  }\n\n  this.emit('remove item');\n};\n\nListbar.prototype.move = function(offset) {\n  this.select(this.selected + offset);\n};\n\nListbar.prototype.moveLeft = function(offset) {\n  this.move(-(offset || 1));\n};\n\nListbar.prototype.moveRight = function(offset) {\n  this.move(offset || 1);\n};\n\nListbar.prototype.selectTab = function(index) {\n  var item = this.items[index];\n  if (item) {\n    if (item._.cmd.callback) {\n      item._.cmd.callback();\n    }\n    this.select(index);\n    this.screen.render();\n  }\n  this.emit('select tab', item, index);\n};\n\n/**\n * Expose\n */\n\nmodule.exports = Listbar;\n"
  },
  {
    "path": "lib/widgets/listtable.js",
    "content": "/**\n * listtable.js - list table element for blessed\n * Copyright (c) 2013-2015, Christopher Jeffrey and contributors (MIT License).\n * https://github.com/chjj/blessed\n */\n\n/**\n * Modules\n */\n\nvar Node = require('./node');\nvar Box = require('./box');\nvar List = require('./list');\nvar Table = require('./table');\n\n/**\n * ListTable\n */\n\nfunction ListTable(options) {\n  var self = this;\n\n  if (!(this instanceof Node)) {\n    return new ListTable(options);\n  }\n\n  options = options || {};\n\n  // options.shrink = true;\n  options.normalShrink = true;\n  options.style = options.style || {};\n  options.style.border = options.style.border || {};\n  options.style.header = options.style.header || {};\n  options.style.cell = options.style.cell || {};\n  this.__align = options.align || 'center';\n  delete options.align;\n\n  options.style.selected = options.style.cell.selected;\n  options.style.item = options.style.cell;\n\n  var border = options.border;\n  if (border\n      && border.top === false\n      && border.bottom === false\n      && border.left === false\n      && border.right === false) {\n    delete options.border;\n  }\n\n  List.call(this, options);\n\n  options.border = border;\n\n  this._header = new Box({\n    parent: this,\n    left: this.screen.autoPadding ? 0 : this.ileft,\n    top: 0,\n    width: 'shrink',\n    height: 1,\n    style: options.style.header,\n    tags: options.parseTags || options.tags\n  });\n\n  this.on('scroll', function() {\n    self._header.setFront();\n    self._header.rtop = self.childBase;\n    if (!self.screen.autoPadding) {\n      self._header.rtop = self.childBase + (self.border ? 1 : 0);\n    }\n  });\n\n  this.pad = options.pad != null\n    ? options.pad\n    : 2;\n\n  this.setData(options.rows || options.data);\n\n  this.on('attach', function() {\n    self.setData(self.rows);\n  });\n\n  this.on('resize', function() {\n    var selected = self.selected;\n    self.setData(self.rows);\n    self.select(selected);\n    self.screen.render();\n  });\n}\n\nListTable.prototype.__proto__ = List.prototype;\n\nListTable.prototype.type = 'list-table';\n\nListTable.prototype._calculateMaxes = Table.prototype._calculateMaxes;\n\nListTable.prototype.setRows =\nListTable.prototype.setData = function(rows) {\n  var self = this\n    , align = this.__align\n    , selected = this.selected\n    , original = this.items.slice()\n    , sel = this.ritems[this.selected];\n\n  if (this.visible && this.lpos) {\n    this.clearPos();\n  }\n\n  this.clearItems();\n\n  this.rows = rows || [];\n\n  this._calculateMaxes();\n\n  if (!this._maxes) return;\n\n  this.addItem('');\n\n  this.rows.forEach(function(row, i) {\n    var isHeader = i === 0;\n    var text = '';\n    row.forEach(function(cell, i) {\n      var width = self._maxes[i];\n      var clen = self.strWidth(cell);\n\n      if (i !== 0) {\n        text += ' ';\n      }\n\n      while (clen < width) {\n        if (align === 'center') {\n          cell = ' ' + cell + ' ';\n          clen += 2;\n        } else if (align === 'left') {\n          cell = cell + ' ';\n          clen += 1;\n        } else if (align === 'right') {\n          cell = ' ' + cell;\n          clen += 1;\n        }\n      }\n\n      if (clen > width) {\n        if (align === 'center') {\n          cell = cell.substring(1);\n          clen--;\n        } else if (align === 'left') {\n          cell = cell.slice(0, -1);\n          clen--;\n        } else if (align === 'right') {\n          cell = cell.substring(1);\n          clen--;\n        }\n      }\n\n      text += cell;\n    });\n    if (isHeader) {\n      self._header.setContent(text);\n    } else {\n      self.addItem(text);\n    }\n  });\n\n  this._header.setFront();\n\n  // Try to find our old item if it still exists.\n  sel = this.ritems.indexOf(sel);\n  if (~sel) {\n    this.select(sel);\n  } else if (this.items.length === original.length) {\n    this.select(selected);\n  } else {\n    this.select(Math.min(selected, this.items.length - 1));\n  }\n};\n\nListTable.prototype._select = ListTable.prototype.select;\nListTable.prototype.select = function(i) {\n  if (i === 0) {\n    i = 1;\n  }\n  if (i <= this.childBase) {\n    this.setScroll(this.childBase - 1);\n  }\n  return this._select(i);\n};\n\nListTable.prototype.render = function() {\n  var self = this;\n\n  var coords = this._render();\n  if (!coords) return;\n\n  this._calculateMaxes();\n\n  if (!this._maxes) return coords;\n\n  var lines = this.screen.lines\n    , xi = coords.xi\n    , yi = coords.yi\n    , rx\n    , ry\n    , i;\n\n  var battr = this.sattr(this.style.border);\n\n  var height = coords.yl - coords.yi - this.ibottom;\n\n  var border = this.border;\n  if (!this.border && this.options.border) {\n    border = this.options.border;\n  }\n\n  if (!border || this.options.noCellBorders) return coords;\n\n  // Draw border with correct angles.\n  ry = 0;\n  for (i = 0; i < height + 1; i++) {\n    if (!lines[yi + ry]) break;\n    rx = 0;\n    self._maxes.slice(0, -1).forEach(function(max) {\n      rx += max;\n      if (!lines[yi + ry][xi + rx + 1]) return;\n      // center\n      if (ry === 0) {\n        // top\n        rx++;\n        lines[yi + ry][xi + rx][0] = battr;\n        lines[yi + ry][xi + rx][1] = '\\u252c'; // '┬'\n        // XXX If we alter iheight and itop for no borders - nothing should be written here\n        if (!border.top) {\n          lines[yi + ry][xi + rx][1] = '\\u2502'; // '│'\n        }\n        lines[yi + ry].dirty = true;\n      } else if (ry === height) {\n        // bottom\n        rx++;\n        lines[yi + ry][xi + rx][0] = battr;\n        lines[yi + ry][xi + rx][1] = '\\u2534'; // '┴'\n        // XXX If we alter iheight and ibottom for no borders - nothing should be written here\n        if (!border.bottom) {\n          lines[yi + ry][xi + rx][1] = '\\u2502'; // '│'\n        }\n        lines[yi + ry].dirty = true;\n      } else {\n        // middle\n        rx++;\n      }\n    });\n    ry += 1;\n  }\n\n  // Draw internal borders.\n  for (ry = 1; ry < height; ry++) {\n    if (!lines[yi + ry]) break;\n    rx = 0;\n    self._maxes.slice(0, -1).forEach(function(max) {\n      rx += max;\n      if (!lines[yi + ry][xi + rx + 1]) return;\n      if (self.options.fillCellBorders !== false) {\n        var lbg = lines[yi + ry][xi + rx][0] & 0x1ff;\n        rx++;\n        lines[yi + ry][xi + rx][0] = (battr & ~0x1ff) | lbg;\n      } else {\n        rx++;\n        lines[yi + ry][xi + rx][0] = battr;\n      }\n      lines[yi + ry][xi + rx][1] = '\\u2502'; // '│'\n      lines[yi + ry].dirty = true;\n    });\n  }\n\n  return coords;\n};\n\n/**\n * Expose\n */\n\nmodule.exports = ListTable;\n"
  },
  {
    "path": "lib/widgets/loading.js",
    "content": "/**\n * loading.js - loading element for blessed\n * Copyright (c) 2013-2015, Christopher Jeffrey and contributors (MIT License).\n * https://github.com/chjj/blessed\n */\n\n/**\n * Modules\n */\n\nvar Node = require('./node');\nvar Box = require('./box');\nvar Text = require('./text');\n\n/**\n * Loading\n */\n\nfunction Loading(options) {\n  if (!(this instanceof Node)) {\n    return new Loading(options);\n  }\n\n  options = options || {};\n\n  Box.call(this, options);\n\n  this._.icon = new Text({\n    parent: this,\n    align: 'center',\n    top: 2,\n    left: 1,\n    right: 1,\n    height: 1,\n    content: '|'\n  });\n}\n\nLoading.prototype.__proto__ = Box.prototype;\n\nLoading.prototype.type = 'loading';\n\nLoading.prototype.load = function(text) {\n  var self = this;\n\n  // XXX Keep above:\n  // var parent = this.parent;\n  // this.detach();\n  // parent.append(this);\n\n  this.show();\n  this.setContent(text);\n\n  if (this._.timer) {\n    this.stop();\n  }\n\n  this.screen.lockKeys = true;\n\n  this._.timer = setInterval(function() {\n    if (self._.icon.content === '|') {\n      self._.icon.setContent('/');\n    } else if (self._.icon.content === '/') {\n      self._.icon.setContent('-');\n    } else if (self._.icon.content === '-') {\n      self._.icon.setContent('\\\\');\n    } else if (self._.icon.content === '\\\\') {\n      self._.icon.setContent('|');\n    }\n    self.screen.render();\n  }, 200);\n};\n\nLoading.prototype.stop = function() {\n  this.screen.lockKeys = false;\n  this.hide();\n  if (this._.timer) {\n    clearInterval(this._.timer);\n    delete this._.timer;\n  }\n  this.screen.render();\n};\n\n/**\n * Expose\n */\n\nmodule.exports = Loading;\n"
  },
  {
    "path": "lib/widgets/log.js",
    "content": "/**\n * log.js - log element for blessed\n * Copyright (c) 2013-2015, Christopher Jeffrey and contributors (MIT License).\n * https://github.com/chjj/blessed\n */\n\n/**\n * Modules\n */\n\nvar util = require('util');\n\nvar nextTick = global.setImmediate || process.nextTick.bind(process);\n\nvar Node = require('./node');\nvar ScrollableText = require('./scrollabletext');\n\n/**\n * Log\n */\n\nfunction Log(options) {\n  var self = this;\n\n  if (!(this instanceof Node)) {\n    return new Log(options);\n  }\n\n  options = options || {};\n\n  ScrollableText.call(this, options);\n\n  this.scrollback = options.scrollback != null\n    ? options.scrollback\n    : Infinity;\n  this.scrollOnInput = options.scrollOnInput;\n\n  this.on('set content', function() {\n    if (!self._userScrolled || self.scrollOnInput) {\n      nextTick(function() {\n        self.setScrollPerc(100);\n        self._userScrolled = false;\n        self.screen.render();\n      });\n    }\n  });\n}\n\nLog.prototype.__proto__ = ScrollableText.prototype;\n\nLog.prototype.type = 'log';\n\nLog.prototype.log =\nLog.prototype.add = function() {\n  var args = Array.prototype.slice.call(arguments);\n  if (typeof args[0] === 'object') {\n    args[0] = util.inspect(args[0], true, 20, true);\n  }\n  var text = util.format.apply(util, args);\n  this.emit('log', text);\n  var ret = this.pushLine(text);\n  if (this._clines.fake.length > this.scrollback) {\n    this.shiftLine(0, (this.scrollback / 3) | 0);\n  }\n  return ret;\n};\n\nLog.prototype._scroll = Log.prototype.scroll;\nLog.prototype.scroll = function(offset, always) {\n  if (offset === 0) return this._scroll(offset, always);\n  this._userScrolled = true;\n  var ret = this._scroll(offset, always);\n  if (this.getScrollPerc() === 100) {\n    this._userScrolled = false;\n  }\n  return ret;\n};\n\n/**\n * Expose\n */\n\nmodule.exports = Log;\n"
  },
  {
    "path": "lib/widgets/message.js",
    "content": "/**\n * message.js - message element for blessed\n * Copyright (c) 2013-2015, Christopher Jeffrey and contributors (MIT License).\n * https://github.com/chjj/blessed\n */\n\n/**\n * Modules\n */\n\nvar Node = require('./node');\nvar Box = require('./box');\n\n/**\n * Message / Error\n */\n\nfunction Message(options) {\n  if (!(this instanceof Node)) {\n    return new Message(options);\n  }\n\n  options = options || {};\n  options.tags = true;\n\n  Box.call(this, options);\n}\n\nMessage.prototype.__proto__ = Box.prototype;\n\nMessage.prototype.type = 'message';\n\nMessage.prototype.log =\nMessage.prototype.display = function(text, time, callback) {\n  var self = this;\n\n  if (typeof time === 'function') {\n    callback = time;\n    time = null;\n  }\n\n  if (time == null) time = 3;\n\n  // Keep above:\n  // var parent = this.parent;\n  // this.detach();\n  // parent.append(this);\n\n  if (this.scrollable) {\n    this.screen.saveFocus();\n    this.focus();\n    this.scrollTo(0);\n  }\n\n  this.show();\n  this.setContent(text);\n  this.screen.render();\n\n  if (time === Infinity || time === -1 || time === 0) {\n    var end = function() {\n      if (end.done) return;\n      end.done = true;\n      if (self.scrollable) {\n        try {\n          self.screen.restoreFocus();\n        } catch (e) {\n          ;\n        }\n      }\n      self.hide();\n      self.screen.render();\n      if (callback) callback();\n    };\n\n    setTimeout(function() {\n      self.onScreenEvent('keypress', function fn(ch, key) {\n        if (key.name === 'mouse') return;\n        if (self.scrollable) {\n          if ((key.name === 'up' || (self.options.vi && key.name === 'k'))\n            || (key.name === 'down' || (self.options.vi && key.name === 'j'))\n            || (self.options.vi && key.name === 'u' && key.ctrl)\n            || (self.options.vi && key.name === 'd' && key.ctrl)\n            || (self.options.vi && key.name === 'b' && key.ctrl)\n            || (self.options.vi && key.name === 'f' && key.ctrl)\n            || (self.options.vi && key.name === 'g' && !key.shift)\n            || (self.options.vi && key.name === 'g' && key.shift)) {\n            return;\n          }\n        }\n        if (self.options.ignoreKeys && ~self.options.ignoreKeys.indexOf(key.name)) {\n          return;\n        }\n        self.removeScreenEvent('keypress', fn);\n        end();\n      });\n      // XXX May be affected by new element.options.mouse option.\n      if (!self.options.mouse) return;\n      self.onScreenEvent('mouse', function fn(data) {\n        if (data.action === 'mousemove') return;\n        self.removeScreenEvent('mouse', fn);\n        end();\n      });\n    }, 10);\n\n    return;\n  }\n\n  setTimeout(function() {\n    self.hide();\n    self.screen.render();\n    if (callback) callback();\n  }, time * 1000);\n};\n\nMessage.prototype.error = function(text, time, callback) {\n  return this.display('{red-fg}Error: ' + text + '{/red-fg}', time, callback);\n};\n\n/**\n * Expose\n */\n\nmodule.exports = Message;\n"
  },
  {
    "path": "lib/widgets/node.js",
    "content": "/**\n * node.js - base abstract node for blessed\n * Copyright (c) 2013-2015, Christopher Jeffrey and contributors (MIT License).\n * https://github.com/chjj/blessed\n */\n\n/**\n * Modules\n */\n\nvar EventEmitter = require('../events').EventEmitter;\n\n/**\n * Node\n */\n\nfunction Node(options) {\n  var self = this;\n  var Screen = require('./screen');\n\n  if (!(this instanceof Node)) {\n    return new Node(options);\n  }\n\n  EventEmitter.call(this);\n\n  options = options || {};\n  this.options = options;\n\n  this.screen = this.screen || options.screen;\n\n  if (!this.screen) {\n    if (this.type === 'screen') {\n      this.screen = this;\n    } else if (Screen.total === 1) {\n      this.screen = Screen.global;\n    } else if (options.parent) {\n      this.screen = options.parent;\n      while (this.screen && this.screen.type !== 'screen') {\n        this.screen = this.screen.parent;\n      }\n    } else if (Screen.total) {\n      // This _should_ work in most cases as long as the element is appended\n      // synchronously after the screen's creation. Throw error if not.\n      this.screen = Screen.instances[Screen.instances.length - 1];\n      process.nextTick(function() {\n        if (!self.parent) {\n          throw new Error('Element (' + self.type + ')'\n            + ' was not appended synchronously after the'\n            + ' screen\\'s creation. Please set a `parent`'\n            + ' or `screen` option in the element\\'s constructor'\n            + ' if you are going to use multiple screens and'\n            + ' append the element later.');\n        }\n      });\n    } else {\n      throw new Error('No active screen.');\n    }\n  }\n\n  this.parent = options.parent || null;\n  this.children = [];\n  this.$ = this._ = this.data = {};\n  this.uid = Node.uid++;\n  this.index = this.index != null ? this.index : -1;\n\n  if (this.type !== 'screen') {\n    this.detached = true;\n  }\n\n  if (this.parent) {\n    this.parent.append(this);\n  }\n\n  (options.children || []).forEach(this.append.bind(this));\n}\n\nNode.uid = 0;\n\nNode.prototype.__proto__ = EventEmitter.prototype;\n\nNode.prototype.type = 'node';\n\nNode.prototype.insert = function(element, i) {\n  var self = this;\n\n  if (element.screen && element.screen !== this.screen) {\n    throw new Error('Cannot switch a node\\'s screen.');\n  }\n\n  element.detach();\n  element.parent = this;\n  element.screen = this.screen;\n\n  if (i === 0) {\n    this.children.unshift(element);\n  } else if (i === this.children.length) {\n    this.children.push(element);\n  } else {\n    this.children.splice(i, 0, element);\n  }\n\n  element.emit('reparent', this);\n  this.emit('adopt', element);\n\n  (function emit(el) {\n    var n = el.detached !== self.detached;\n    el.detached = self.detached;\n    if (n) el.emit('attach');\n    el.children.forEach(emit);\n  })(element);\n\n  if (!this.screen.focused) {\n    this.screen.focused = element;\n  }\n};\n\nNode.prototype.prepend = function(element) {\n  this.insert(element, 0);\n};\n\nNode.prototype.append = function(element) {\n  this.insert(element, this.children.length);\n};\n\nNode.prototype.insertBefore = function(element, other) {\n  var i = this.children.indexOf(other);\n  if (~i) this.insert(element, i);\n};\n\nNode.prototype.insertAfter = function(element, other) {\n  var i = this.children.indexOf(other);\n  if (~i) this.insert(element, i + 1);\n};\n\nNode.prototype.remove = function(element) {\n  if (element.parent !== this) return;\n\n  var i = this.children.indexOf(element);\n  if (!~i) return;\n\n  element.clearPos();\n\n  element.parent = null;\n\n  this.children.splice(i, 1);\n\n  i = this.screen.clickable.indexOf(element);\n  if (~i) this.screen.clickable.splice(i, 1);\n  i = this.screen.keyable.indexOf(element);\n  if (~i) this.screen.keyable.splice(i, 1);\n\n  element.emit('reparent', null);\n  this.emit('remove', element);\n\n  (function emit(el) {\n    var n = el.detached !== true;\n    el.detached = true;\n    if (n) el.emit('detach');\n    el.children.forEach(emit);\n  })(element);\n\n  if (this.screen.focused === element) {\n    this.screen.rewindFocus();\n  }\n};\n\nNode.prototype.detach = function() {\n  if (this.parent) this.parent.remove(this);\n};\n\nNode.prototype.free = function() {\n  return;\n};\n\nNode.prototype.destroy = function() {\n  this.detach();\n  this.forDescendants(function(el) {\n    el.free();\n    el.destroyed = true;\n    el.emit('destroy');\n  }, this);\n};\n\nNode.prototype.forDescendants = function(iter, s) {\n  if (s) iter(this);\n  this.children.forEach(function emit(el) {\n    iter(el);\n    el.children.forEach(emit);\n  });\n};\n\nNode.prototype.forAncestors = function(iter, s) {\n  var el = this;\n  if (s) iter(this);\n  while (el = el.parent) {\n    iter(el);\n  }\n};\n\nNode.prototype.collectDescendants = function(s) {\n  var out = [];\n  this.forDescendants(function(el) {\n    out.push(el);\n  }, s);\n  return out;\n};\n\nNode.prototype.collectAncestors = function(s) {\n  var out = [];\n  this.forAncestors(function(el) {\n    out.push(el);\n  }, s);\n  return out;\n};\n\nNode.prototype.emitDescendants = function() {\n  var args = Array.prototype.slice(arguments)\n    , iter;\n\n  if (typeof args[args.length - 1] === 'function') {\n    iter = args.pop();\n  }\n\n  return this.forDescendants(function(el) {\n    if (iter) iter(el);\n    el.emit.apply(el, args);\n  }, true);\n};\n\nNode.prototype.emitAncestors = function() {\n  var args = Array.prototype.slice(arguments)\n    , iter;\n\n  if (typeof args[args.length - 1] === 'function') {\n    iter = args.pop();\n  }\n\n  return this.forAncestors(function(el) {\n    if (iter) iter(el);\n    el.emit.apply(el, args);\n  }, true);\n};\n\nNode.prototype.hasDescendant = function(target) {\n  return (function find(el) {\n    for (var i = 0; i < el.children.length; i++) {\n      if (el.children[i] === target) {\n        return true;\n      }\n      if (find(el.children[i]) === true) {\n        return true;\n      }\n    }\n    return false;\n  })(this);\n};\n\nNode.prototype.hasAncestor = function(target) {\n  var el = this;\n  while (el = el.parent) {\n    if (el === target) return true;\n  }\n  return false;\n};\n\nNode.prototype.get = function(name, value) {\n  if (this.data.hasOwnProperty(name)) {\n    return this.data[name];\n  }\n  return value;\n};\n\nNode.prototype.set = function(name, value) {\n  return this.data[name] = value;\n};\n\n/**\n * Expose\n */\n\nmodule.exports = Node;\n"
  },
  {
    "path": "lib/widgets/overlayimage.js",
    "content": "/**\n * overlayimage.js - w3m image element for blessed\n * Copyright (c) 2013-2015, Christopher Jeffrey and contributors (MIT License).\n * https://github.com/chjj/blessed\n */\n\n/**\n * Modules\n */\n\nvar fs = require('fs')\n  , cp = require('child_process');\n\nvar helpers = require('../helpers');\n\nvar Node = require('./node');\nvar Box = require('./box');\n\n/**\n * OverlayImage\n * Good example of w3mimgdisplay commands:\n * https://github.com/hut/ranger/blob/master/ranger/ext/img_display.py\n */\n\nfunction OverlayImage(options) {\n  var self = this;\n\n  if (!(this instanceof Node)) {\n    return new OverlayImage(options);\n  }\n\n  options = options || {};\n\n  Box.call(this, options);\n\n  if (options.w3m) {\n    OverlayImage.w3mdisplay = options.w3m;\n  }\n\n  if (OverlayImage.hasW3MDisplay == null) {\n    if (fs.existsSync(OverlayImage.w3mdisplay)) {\n      OverlayImage.hasW3MDisplay = true;\n    } else if (options.search !== false) {\n      var file = helpers.findFile('/usr', 'w3mimgdisplay')\n              || helpers.findFile('/lib', 'w3mimgdisplay')\n              || helpers.findFile('/bin', 'w3mimgdisplay');\n      if (file) {\n        OverlayImage.hasW3MDisplay = true;\n        OverlayImage.w3mdisplay = file;\n      } else {\n        OverlayImage.hasW3MDisplay = false;\n      }\n    }\n  }\n\n  this.on('hide', function() {\n    self._lastFile = self.file;\n    self.clearImage();\n  });\n\n  this.on('show', function() {\n    if (!self._lastFile) return;\n    self.setImage(self._lastFile);\n  });\n\n  this.on('detach', function() {\n    self._lastFile = self.file;\n    self.clearImage();\n  });\n\n  this.on('attach', function() {\n    if (!self._lastFile) return;\n    self.setImage(self._lastFile);\n  });\n\n  this.onScreenEvent('resize', function() {\n    self._needsRatio = true;\n  });\n\n  // Get images to overlap properly. Maybe not worth it:\n  // this.onScreenEvent('render', function() {\n  //   self.screen.program.flush();\n  //   if (!self._noImage) return;\n  //   function display(el, next) {\n  //     if (el.type === 'w3mimage' && el.file) {\n  //       el.setImage(el.file, next);\n  //     } else {\n  //       next();\n  //     }\n  //   }\n  //   function done(el) {\n  //     el.children.forEach(recurse);\n  //   }\n  //   function recurse(el) {\n  //     display(el, function() {\n  //       var pending = el.children.length;\n  //       el.children.forEach(function(el) {\n  //         display(el, function() {\n  //           if (!--pending) done(el);\n  //         });\n  //       });\n  //     });\n  //   }\n  //   recurse(self.screen);\n  // });\n\n  this.onScreenEvent('render', function() {\n    self.screen.program.flush();\n    if (!self._noImage) {\n      self.setImage(self.file);\n    }\n  });\n\n  if (this.options.file || this.options.img) {\n    this.setImage(this.options.file || this.options.img);\n  }\n}\n\nOverlayImage.prototype.__proto__ = Box.prototype;\n\nOverlayImage.prototype.type = 'overlayimage';\n\nOverlayImage.w3mdisplay = '/usr/lib/w3m/w3mimgdisplay';\n\nOverlayImage.prototype.spawn = function(file, args, opt, callback) {\n  var spawn = require('child_process').spawn\n    , ps;\n\n  opt = opt || {};\n  ps = spawn(file, args, opt);\n\n  ps.on('error', function(err) {\n    if (!callback) return;\n    return callback(err);\n  });\n\n  ps.on('exit', function(code) {\n    if (!callback) return;\n    if (code !== 0) return callback(new Error('Exit Code: ' + code));\n    return callback(null, code === 0);\n  });\n\n  return ps;\n};\n\nOverlayImage.prototype.setImage = function(img, callback) {\n  var self = this;\n\n  if (this._settingImage) {\n    this._queue = this._queue || [];\n    this._queue.push([img, callback]);\n    return;\n  }\n  this._settingImage = true;\n\n  var reset = function() {\n    self._settingImage = false;\n    self._queue = self._queue || [];\n    var item = self._queue.shift();\n    if (item) {\n      self.setImage(item[0], item[1]);\n    }\n  };\n\n  if (OverlayImage.hasW3MDisplay === false) {\n    reset();\n    if (!callback) return;\n    return callback(new Error('W3M Image Display not available.'));\n  }\n\n  if (!img) {\n    reset();\n    if (!callback) return;\n    return callback(new Error('No image.'));\n  }\n\n  this.file = img;\n\n  return this.getPixelRatio(function(err, ratio) {\n    if (err) {\n      reset();\n      if (!callback) return;\n      return callback(err);\n    }\n\n    return self.renderImage(img, ratio, function(err, success) {\n      if (err) {\n        reset();\n        if (!callback) return;\n        return callback(err);\n      }\n\n      if (self.shrink || self.options.autofit) {\n        delete self.shrink;\n        delete self.options.shrink;\n        self.options.autofit = true;\n        return self.imageSize(function(err, size) {\n          if (err) {\n            reset();\n            if (!callback) return;\n            return callback(err);\n          }\n\n          if (self._lastSize\n              && ratio.tw === self._lastSize.tw\n              && ratio.th === self._lastSize.th\n              && size.width === self._lastSize.width\n              && size.height === self._lastSize.height\n              && self.aleft === self._lastSize.aleft\n              && self.atop === self._lastSize.atop) {\n            reset();\n            if (!callback) return;\n            return callback(null, success);\n          }\n\n          self._lastSize = {\n            tw: ratio.tw,\n            th: ratio.th,\n            width: size.width,\n            height: size.height,\n            aleft: self.aleft,\n            atop: self.atop\n          };\n\n          self.position.width = size.width / ratio.tw | 0;\n          self.position.height = size.height / ratio.th | 0;\n\n          self._noImage = true;\n          self.screen.render();\n          self._noImage = false;\n\n          reset();\n          return self.renderImage(img, ratio, callback);\n        });\n      }\n\n      reset();\n      if (!callback) return;\n      return callback(null, success);\n    });\n  });\n};\n\nOverlayImage.prototype.renderImage = function(img, ratio, callback) {\n  var self = this;\n\n  if (cp.execSync) {\n    callback = callback || function(err, result) { return result; };\n    try {\n      return callback(null, this.renderImageSync(img, ratio));\n    } catch (e) {\n      return callback(e);\n    }\n  }\n\n  if (OverlayImage.hasW3MDisplay === false) {\n    if (!callback) return;\n    return callback(new Error('W3M Image Display not available.'));\n  }\n\n  if (!ratio) {\n    if (!callback) return;\n    return callback(new Error('No ratio.'));\n  }\n\n  // clearImage unsets these:\n  var _file = self.file;\n  var _lastSize = self._lastSize;\n  return self.clearImage(function(err) {\n    if (err) return callback(err);\n\n    self.file = _file;\n    self._lastSize = _lastSize;\n\n    var opt = {\n      stdio: 'pipe',\n      env: process.env,\n      cwd: process.env.HOME\n    };\n\n    var ps = self.spawn(OverlayImage.w3mdisplay, [], opt, function(err, success) {\n      if (!callback) return;\n      return err\n        ? callback(err)\n        : callback(null, success);\n    });\n\n    var width = self.width * ratio.tw | 0\n      , height = self.height * ratio.th | 0\n      , aleft = self.aleft * ratio.tw | 0\n      , atop = self.atop * ratio.th | 0;\n\n    var input = '0;1;'\n      + aleft + ';'\n      + atop + ';'\n      + width + ';'\n      + height + ';;;;;'\n      + img\n      + '\\n4;\\n3;\\n';\n\n    self._props = {\n      aleft: aleft,\n      atop: atop,\n      width: width,\n      height: height\n    };\n\n    ps.stdin.write(input);\n    ps.stdin.end();\n  });\n};\n\nOverlayImage.prototype.clearImage = function(callback) {\n  if (cp.execSync) {\n    callback = callback || function(err, result) { return result; };\n    try {\n      return callback(null, this.clearImageSync());\n    } catch (e) {\n      return callback(e);\n    }\n  }\n\n  if (OverlayImage.hasW3MDisplay === false) {\n    if (!callback) return;\n    return callback(new Error('W3M Image Display not available.'));\n  }\n\n  if (!this._props) {\n    if (!callback) return;\n    return callback(null);\n  }\n\n  var opt = {\n    stdio: 'pipe',\n    env: process.env,\n    cwd: process.env.HOME\n  };\n\n  var ps = this.spawn(OverlayImage.w3mdisplay, [], opt, function(err, success) {\n    if (!callback) return;\n    return err\n      ? callback(err)\n      : callback(null, success);\n  });\n\n  var width = this._props.width + 2\n    , height = this._props.height + 2\n    , aleft = this._props.aleft\n    , atop = this._props.atop;\n\n  if (this._drag) {\n    aleft -= 10;\n    atop -= 10;\n    width += 10;\n    height += 10;\n  }\n\n  var input = '6;'\n   + aleft + ';'\n   + atop + ';'\n   + width + ';'\n   + height\n   + '\\n4;\\n3;\\n';\n\n  delete this.file;\n  delete this._props;\n  delete this._lastSize;\n\n  ps.stdin.write(input);\n  ps.stdin.end();\n};\n\nOverlayImage.prototype.imageSize = function(callback) {\n  var img = this.file;\n\n  if (cp.execSync) {\n    callback = callback || function(err, result) { return result; };\n    try {\n      return callback(null, this.imageSizeSync());\n    } catch (e) {\n      return callback(e);\n    }\n  }\n\n  if (OverlayImage.hasW3MDisplay === false) {\n    if (!callback) return;\n    return callback(new Error('W3M Image Display not available.'));\n  }\n\n  if (!img) {\n    if (!callback) return;\n    return callback(new Error('No image.'));\n  }\n\n  var opt = {\n    stdio: 'pipe',\n    env: process.env,\n    cwd: process.env.HOME\n  };\n\n  var ps = this.spawn(OverlayImage.w3mdisplay, [], opt);\n\n  var buf = '';\n\n  ps.stdout.setEncoding('utf8');\n\n  ps.stdout.on('data', function(data) {\n    buf += data;\n  });\n\n  ps.on('error', function(err) {\n    if (!callback) return;\n    return callback(err);\n  });\n\n  ps.on('exit', function() {\n    if (!callback) return;\n    var size = buf.trim().split(/\\s+/);\n    return callback(null, {\n      raw: buf.trim(),\n      width: +size[0],\n      height: +size[1]\n    });\n  });\n\n  var input = '5;' + img + '\\n';\n\n  ps.stdin.write(input);\n  ps.stdin.end();\n};\n\nOverlayImage.prototype.termSize = function(callback) {\n  var self = this;\n\n  if (cp.execSync) {\n    callback = callback || function(err, result) { return result; };\n    try {\n      return callback(null, this.termSizeSync());\n    } catch (e) {\n      return callback(e);\n    }\n  }\n\n  if (OverlayImage.hasW3MDisplay === false) {\n    if (!callback) return;\n    return callback(new Error('W3M Image Display not available.'));\n  }\n\n  var opt = {\n    stdio: 'pipe',\n    env: process.env,\n    cwd: process.env.HOME\n  };\n\n  var ps = this.spawn(OverlayImage.w3mdisplay, ['-test'], opt);\n\n  var buf = '';\n\n  ps.stdout.setEncoding('utf8');\n\n  ps.stdout.on('data', function(data) {\n    buf += data;\n  });\n\n  ps.on('error', function(err) {\n    if (!callback) return;\n    return callback(err);\n  });\n\n  ps.on('exit', function() {\n    if (!callback) return;\n\n    if (!buf.trim()) {\n      // Bug: w3mimgdisplay will sometimes\n      // output nothing. Try again:\n      return self.termSize(callback);\n    }\n\n    var size = buf.trim().split(/\\s+/);\n\n    return callback(null, {\n      raw: buf.trim(),\n      width: +size[0],\n      height: +size[1]\n    });\n  });\n\n  ps.stdin.end();\n};\n\nOverlayImage.prototype.getPixelRatio = function(callback) {\n  var self = this;\n\n  if (cp.execSync) {\n    callback = callback || function(err, result) { return result; };\n    try {\n      return callback(null, this.getPixelRatioSync());\n    } catch (e) {\n      return callback(e);\n    }\n  }\n\n  // XXX We could cache this, but sometimes it's better\n  // to recalculate to be pixel perfect.\n  if (this._ratio && !this._needsRatio) {\n    return callback(null, this._ratio);\n  }\n\n  return this.termSize(function(err, dimensions) {\n    if (err) return callback(err);\n\n    self._ratio = {\n      tw: dimensions.width / self.screen.width,\n      th: dimensions.height / self.screen.height\n    };\n\n    self._needsRatio = false;\n\n    return callback(null, self._ratio);\n  });\n};\n\nOverlayImage.prototype.renderImageSync = function(img, ratio) {\n  if (OverlayImage.hasW3MDisplay === false) {\n    throw new Error('W3M Image Display not available.');\n  }\n\n  if (!ratio) {\n    throw new Error('No ratio.');\n  }\n\n  // clearImage unsets these:\n  var _file = this.file;\n  var _lastSize = this._lastSize;\n\n  this.clearImageSync();\n\n  this.file = _file;\n  this._lastSize = _lastSize;\n\n  var width = this.width * ratio.tw | 0\n    , height = this.height * ratio.th | 0\n    , aleft = this.aleft * ratio.tw | 0\n    , atop = this.atop * ratio.th | 0;\n\n  var input = '0;1;'\n    + aleft + ';'\n    + atop + ';'\n    + width + ';'\n    + height + ';;;;;'\n    + img\n    + '\\n4;\\n3;\\n';\n\n  this._props = {\n    aleft: aleft,\n    atop: atop,\n    width: width,\n    height: height\n  };\n\n  try {\n    cp.execFileSync(OverlayImage.w3mdisplay, [], {\n      env: process.env,\n      encoding: 'utf8',\n      input: input,\n      timeout: 1000\n    });\n  } catch (e) {\n    ;\n  }\n\n  return true;\n};\n\nOverlayImage.prototype.clearImageSync = function() {\n  if (OverlayImage.hasW3MDisplay === false) {\n    throw new Error('W3M Image Display not available.');\n  }\n\n  if (!this._props) {\n    return false;\n  }\n\n  var width = this._props.width + 2\n    , height = this._props.height + 2\n    , aleft = this._props.aleft\n    , atop = this._props.atop;\n\n  if (this._drag) {\n    aleft -= 10;\n    atop -= 10;\n    width += 10;\n    height += 10;\n  }\n\n  var input = '6;'\n   + aleft + ';'\n   + atop + ';'\n   + width + ';'\n   + height\n   + '\\n4;\\n3;\\n';\n\n  delete this.file;\n  delete this._props;\n  delete this._lastSize;\n\n  try {\n    cp.execFileSync(OverlayImage.w3mdisplay, [], {\n      env: process.env,\n      encoding: 'utf8',\n      input: input,\n      timeout: 1000\n    });\n  } catch (e) {\n    ;\n  }\n\n  return true;\n};\n\nOverlayImage.prototype.imageSizeSync = function() {\n  var img = this.file;\n\n  if (OverlayImage.hasW3MDisplay === false) {\n    throw new Error('W3M Image Display not available.');\n  }\n\n  if (!img) {\n    throw new Error('No image.');\n  }\n\n  var buf = '';\n  var input = '5;' + img + '\\n';\n\n  try {\n    buf = cp.execFileSync(OverlayImage.w3mdisplay, [], {\n      env: process.env,\n      encoding: 'utf8',\n      input: input,\n      timeout: 1000\n    });\n  } catch (e) {\n    ;\n  }\n\n  var size = buf.trim().split(/\\s+/);\n\n  return {\n    raw: buf.trim(),\n    width: +size[0],\n    height: +size[1]\n  };\n};\n\nOverlayImage.prototype.termSizeSync = function(_, recurse) {\n  if (OverlayImage.hasW3MDisplay === false) {\n    throw new Error('W3M Image Display not available.');\n  }\n\n  var buf = '';\n\n  try {\n    buf = cp.execFileSync(OverlayImage.w3mdisplay, ['-test'], {\n      env: process.env,\n      encoding: 'utf8',\n      timeout: 1000\n    });\n  } catch (e) {\n    ;\n  }\n\n  if (!buf.trim()) {\n    // Bug: w3mimgdisplay will sometimes\n    // output nothing. Try again:\n    recurse = recurse || 0;\n    if (++recurse === 5) {\n      throw new Error('Term size not determined.');\n    }\n    return this.termSizeSync(_, recurse);\n  }\n\n  var size = buf.trim().split(/\\s+/);\n\n  return {\n    raw: buf.trim(),\n    width: +size[0],\n    height: +size[1]\n  };\n};\n\nOverlayImage.prototype.getPixelRatioSync = function() {\n  // XXX We could cache this, but sometimes it's better\n  // to recalculate to be pixel perfect.\n  if (this._ratio && !this._needsRatio) {\n    return this._ratio;\n  }\n  this._needsRatio = false;\n\n  var dimensions = this.termSizeSync();\n\n  this._ratio = {\n    tw: dimensions.width / this.screen.width,\n    th: dimensions.height / this.screen.height\n  };\n\n  return this._ratio;\n};\n\nOverlayImage.prototype.displayImage = function(callback) {\n  return this.screen.displayImage(this.file, callback);\n};\n\n/**\n * Expose\n */\n\nmodule.exports = OverlayImage;\n"
  },
  {
    "path": "lib/widgets/progressbar.js",
    "content": "/**\n * progressbar.js - progress bar element for blessed\n * Copyright (c) 2013-2015, Christopher Jeffrey and contributors (MIT License).\n * https://github.com/chjj/blessed\n */\n\n/**\n * Modules\n */\n\nvar Node = require('./node');\nvar Input = require('./input');\n\n/**\n * ProgressBar\n */\n\nfunction ProgressBar(options) {\n  var self = this;\n\n  if (!(this instanceof Node)) {\n    return new ProgressBar(options);\n  }\n\n  options = options || {};\n\n  Input.call(this, options);\n\n  this.filled = options.filled || 0;\n  if (typeof this.filled === 'string') {\n    this.filled = +this.filled.slice(0, -1);\n  }\n  this.value = this.filled;\n\n  this.pch = options.pch || ' ';\n\n  // XXX Workaround that predates the usage of `el.ch`.\n  if (options.ch) {\n    this.pch = options.ch;\n    this.ch = ' ';\n  }\n  if (options.bch) {\n    this.ch = options.bch;\n  }\n\n  if (!this.style.bar) {\n    this.style.bar = {};\n    this.style.bar.fg = options.barFg;\n    this.style.bar.bg = options.barBg;\n  }\n\n  this.orientation = options.orientation || 'horizontal';\n\n  if (options.keys) {\n    this.on('keypress', function(ch, key) {\n      var back, forward;\n      if (self.orientation === 'horizontal') {\n        back = ['left', 'h'];\n        forward = ['right', 'l'];\n      } else if (self.orientation === 'vertical') {\n        back = ['down', 'j'];\n        forward = ['up', 'k'];\n      }\n      if (key.name === back[0] || (options.vi && key.name === back[1])) {\n        self.progress(-5);\n        self.screen.render();\n        return;\n      }\n      if (key.name === forward[0] || (options.vi && key.name === forward[1])) {\n        self.progress(5);\n        self.screen.render();\n        return;\n      }\n    });\n  }\n\n  if (options.mouse) {\n    this.on('click', function(data) {\n      var x, y, m, p;\n      if (!self.lpos) return;\n      if (self.orientation === 'horizontal') {\n        x = data.x - self.lpos.xi;\n        m = (self.lpos.xl - self.lpos.xi) - self.iwidth;\n        p = x / m * 100 | 0;\n      } else if (self.orientation === 'vertical') {\n        y = data.y - self.lpos.yi;\n        m = (self.lpos.yl - self.lpos.yi) - self.iheight;\n        p = y / m * 100 | 0;\n      }\n      self.setProgress(p);\n    });\n  }\n}\n\nProgressBar.prototype.__proto__ = Input.prototype;\n\nProgressBar.prototype.type = 'progress-bar';\n\nProgressBar.prototype.render = function() {\n  var ret = this._render();\n  if (!ret) return;\n\n  var xi = ret.xi\n    , xl = ret.xl\n    , yi = ret.yi\n    , yl = ret.yl\n    , dattr;\n\n  if (this.border) xi++, yi++, xl--, yl--;\n\n  if (this.orientation === 'horizontal') {\n    xl = xi + ((xl - xi) * (this.filled / 100)) | 0;\n  } else if (this.orientation === 'vertical') {\n    yi = yi + ((yl - yi) - (((yl - yi) * (this.filled / 100)) | 0));\n  }\n\n  dattr = this.sattr(this.style.bar);\n\n  this.screen.fillRegion(dattr, this.pch, xi, xl, yi, yl);\n\n  if (this.content) {\n    var line = this.screen.lines[yi];\n    for (var i = 0; i < this.content.length; i++) {\n      line[xi + i][1] = this.content[i];\n    }\n    line.dirty = true;\n  }\n\n  return ret;\n};\n\nProgressBar.prototype.progress = function(filled) {\n  this.filled += filled;\n  if (this.filled < 0) this.filled = 0;\n  else if (this.filled > 100) this.filled = 100;\n  if (this.filled === 100) {\n    this.emit('complete');\n  }\n  this.value = this.filled;\n};\n\nProgressBar.prototype.setProgress = function(filled) {\n  this.filled = 0;\n  this.progress(filled);\n};\n\nProgressBar.prototype.reset = function() {\n  this.emit('reset');\n  this.filled = 0;\n  this.value = this.filled;\n};\n\n/**\n * Expose\n */\n\nmodule.exports = ProgressBar;\n"
  },
  {
    "path": "lib/widgets/prompt.js",
    "content": "/**\n * prompt.js - prompt element for blessed\n * Copyright (c) 2013-2015, Christopher Jeffrey and contributors (MIT License).\n * https://github.com/chjj/blessed\n */\n\n/**\n * Modules\n */\n\nvar Node = require('./node');\nvar Box = require('./box');\nvar Button = require('./button');\nvar Textbox = require('./textbox');\n\n/**\n * Prompt\n */\n\nfunction Prompt(options) {\n  if (!(this instanceof Node)) {\n    return new Prompt(options);\n  }\n\n  options = options || {};\n\n  options.hidden = true;\n\n  Box.call(this, options);\n\n  this._.input = new Textbox({\n    parent: this,\n    top: 3,\n    height: 1,\n    left: 2,\n    right: 2,\n    bg: 'black'\n  });\n\n  this._.okay = new Button({\n    parent: this,\n    top: 5,\n    height: 1,\n    left: 2,\n    width: 6,\n    content: 'Okay',\n    align: 'center',\n    bg: 'black',\n    hoverBg: 'blue',\n    autoFocus: false,\n    mouse: true\n  });\n\n  this._.cancel = new Button({\n    parent: this,\n    top: 5,\n    height: 1,\n    shrink: true,\n    left: 10,\n    width: 8,\n    content: 'Cancel',\n    align: 'center',\n    bg: 'black',\n    hoverBg: 'blue',\n    autoFocus: false,\n    mouse: true\n  });\n}\n\nPrompt.prototype.__proto__ = Box.prototype;\n\nPrompt.prototype.type = 'prompt';\n\nPrompt.prototype.input =\nPrompt.prototype.setInput =\nPrompt.prototype.readInput = function(text, value, callback) {\n  var self = this;\n  var okay, cancel;\n\n  if (!callback) {\n    callback = value;\n    value = '';\n  }\n\n  // Keep above:\n  // var parent = this.parent;\n  // this.detach();\n  // parent.append(this);\n\n  this.show();\n  this.setContent(' ' + text);\n\n  this._.input.value = value;\n\n  this.screen.saveFocus();\n\n  this._.okay.on('press', okay = function() {\n    self._.input.submit();\n  });\n\n  this._.cancel.on('press', cancel = function() {\n    self._.input.cancel();\n  });\n\n  this._.input.readInput(function(err, data) {\n    self.hide();\n    self.screen.restoreFocus();\n    self._.okay.removeListener('press', okay);\n    self._.cancel.removeListener('press', cancel);\n    return callback(err, data);\n  });\n\n  this.screen.render();\n};\n\n/**\n * Expose\n */\n\nmodule.exports = Prompt;\n"
  },
  {
    "path": "lib/widgets/question.js",
    "content": "/**\n * question.js - question element for blessed\n * Copyright (c) 2013-2015, Christopher Jeffrey and contributors (MIT License).\n * https://github.com/chjj/blessed\n */\n\n/**\n * Modules\n */\n\nvar Node = require('./node');\nvar Box = require('./box');\nvar Button = require('./button');\n\n/**\n * Question\n */\n\nfunction Question(options) {\n  if (!(this instanceof Node)) {\n    return new Question(options);\n  }\n\n  options = options || {};\n  options.hidden = true;\n\n  Box.call(this, options);\n\n  this._.okay = new Button({\n    screen: this.screen,\n    parent: this,\n    top: 2,\n    height: 1,\n    left: 2,\n    width: 6,\n    content: 'Okay',\n    align: 'center',\n    bg: 'black',\n    hoverBg: 'blue',\n    autoFocus: false,\n    mouse: true\n  });\n\n  this._.cancel = new Button({\n    screen: this.screen,\n    parent: this,\n    top: 2,\n    height: 1,\n    shrink: true,\n    left: 10,\n    width: 8,\n    content: 'Cancel',\n    align: 'center',\n    bg: 'black',\n    hoverBg: 'blue',\n    autoFocus: false,\n    mouse: true\n  });\n}\n\nQuestion.prototype.__proto__ = Box.prototype;\n\nQuestion.prototype.type = 'question';\n\nQuestion.prototype.ask = function(text, callback) {\n  var self = this;\n  var press, okay, cancel;\n\n  // Keep above:\n  // var parent = this.parent;\n  // this.detach();\n  // parent.append(this);\n\n  this.show();\n  this.setContent(' ' + text);\n\n  this.onScreenEvent('keypress', press = function(ch, key) {\n    if (key.name === 'mouse') return;\n    if (key.name !== 'enter'\n        && key.name !== 'escape'\n        && key.name !== 'q'\n        && key.name !== 'y'\n        && key.name !== 'n') {\n      return;\n    }\n    done(null, key.name === 'enter' || key.name === 'y');\n  });\n\n  this._.okay.on('press', okay = function() {\n    done(null, true);\n  });\n\n  this._.cancel.on('press', cancel = function() {\n    done(null, false);\n  });\n\n  this.screen.saveFocus();\n  this.focus();\n\n  function done(err, data) {\n    self.hide();\n    self.screen.restoreFocus();\n    self.removeScreenEvent('keypress', press);\n    self._.okay.removeListener('press', okay);\n    self._.cancel.removeListener('press', cancel);\n    return callback(err, data);\n  }\n\n  this.screen.render();\n};\n\n/**\n * Expose\n */\n\nmodule.exports = Question;\n"
  },
  {
    "path": "lib/widgets/radiobutton.js",
    "content": "/**\n * radiobutton.js - radio button element for blessed\n * Copyright (c) 2013-2015, Christopher Jeffrey and contributors (MIT License).\n * https://github.com/chjj/blessed\n */\n\n/**\n * Modules\n */\n\nvar Node = require('./node');\nvar Checkbox = require('./checkbox');\n\n/**\n * RadioButton\n */\n\nfunction RadioButton(options) {\n  var self = this;\n\n  if (!(this instanceof Node)) {\n    return new RadioButton(options);\n  }\n\n  options = options || {};\n\n  Checkbox.call(this, options);\n\n  this.on('check', function() {\n    var el = self;\n    while (el = el.parent) {\n      if (el.type === 'radio-set'\n          || el.type === 'form') break;\n    }\n    el = el || self.parent;\n    el.forDescendants(function(el) {\n      if (el.type !== 'radio-button' || el === self) {\n        return;\n      }\n      el.uncheck();\n    });\n  });\n}\n\nRadioButton.prototype.__proto__ = Checkbox.prototype;\n\nRadioButton.prototype.type = 'radio-button';\n\nRadioButton.prototype.render = function() {\n  this.clearPos(true);\n  this.setContent('(' + (this.checked ? '*' : ' ') + ') ' + this.text, true);\n  return this._render();\n};\n\nRadioButton.prototype.toggle = RadioButton.prototype.check;\n\n/**\n * Expose\n */\n\nmodule.exports = RadioButton;\n"
  },
  {
    "path": "lib/widgets/radioset.js",
    "content": "/**\n * radioset.js - radio set element for blessed\n * Copyright (c) 2013-2015, Christopher Jeffrey and contributors (MIT License).\n * https://github.com/chjj/blessed\n */\n\n/**\n * Modules\n */\n\nvar Node = require('./node');\nvar Box = require('./box');\n\n/**\n * RadioSet\n */\n\nfunction RadioSet(options) {\n  if (!(this instanceof Node)) {\n    return new RadioSet(options);\n  }\n  options = options || {};\n  // Possibly inherit parent's style.\n  // options.style = this.parent.style;\n  Box.call(this, options);\n}\n\nRadioSet.prototype.__proto__ = Box.prototype;\n\nRadioSet.prototype.type = 'radio-set';\n\n/**\n * Expose\n */\n\nmodule.exports = RadioSet;\n"
  },
  {
    "path": "lib/widgets/screen.js",
    "content": "/**\n * screen.js - screen node for blessed\n * Copyright (c) 2013-2015, Christopher Jeffrey and contributors (MIT License).\n * https://github.com/chjj/blessed\n */\n\n/**\n * Modules\n */\n\nvar path = require('path')\n  , fs = require('fs')\n  , cp = require('child_process');\n\nvar colors = require('../colors')\n  , program = require('../program')\n  , unicode = require('../unicode');\n\nvar nextTick = global.setImmediate || process.nextTick.bind(process);\n\nvar helpers = require('../helpers');\n\nvar Node = require('./node');\nvar Log = require('./log');\nvar Element = require('./element');\nvar Box = require('./box');\n\n/**\n * Screen\n */\n\nfunction Screen(options) {\n  var self = this;\n\n  if (!(this instanceof Node)) {\n    return new Screen(options);\n  }\n\n  Screen.bind(this);\n\n  options = options || {};\n  if (options.rsety && options.listen) {\n    options = { program: options };\n  }\n\n  this.program = options.program;\n\n  if (!this.program) {\n    this.program = program({\n      input: options.input,\n      output: options.output,\n      log: options.log,\n      debug: options.debug,\n      dump: options.dump,\n      terminal: options.terminal || options.term,\n      resizeTimeout: options.resizeTimeout,\n      forceUnicode: options.forceUnicode,\n      tput: true,\n      buffer: true,\n      zero: true\n    });\n  } else {\n    this.program.setupTput();\n    this.program.useBuffer = true;\n    this.program.zero = true;\n    this.program.options.resizeTimeout = options.resizeTimeout;\n    if (options.forceUnicode != null) {\n      this.program.tput.features.unicode = options.forceUnicode;\n      this.program.tput.unicode = options.forceUnicode;\n    }\n  }\n\n  this.tput = this.program.tput;\n\n  Node.call(this, options);\n\n  this.autoPadding = options.autoPadding !== false;\n  this.tabc = Array((options.tabSize || 4) + 1).join(' ');\n  this.dockBorders = options.dockBorders;\n\n  this.ignoreLocked = options.ignoreLocked || [];\n\n  this._unicode = this.tput.unicode || this.tput.numbers.U8 === 1;\n  this.fullUnicode = this.options.fullUnicode && this._unicode;\n\n  this.dattr = ((0 << 18) | (0x1ff << 9)) | 0x1ff;\n\n  this.renders = 0;\n  this.position = {\n    left: this.left = this.aleft = this.rleft = 0,\n    right: this.right = this.aright = this.rright = 0,\n    top: this.top = this.atop = this.rtop = 0,\n    bottom: this.bottom = this.abottom = this.rbottom = 0,\n    get height() { return self.height; },\n    get width() { return self.width; }\n  };\n\n  this.ileft = 0;\n  this.itop = 0;\n  this.iright = 0;\n  this.ibottom = 0;\n  this.iheight = 0;\n  this.iwidth = 0;\n\n  this.padding = {\n    left: 0,\n    top: 0,\n    right: 0,\n    bottom: 0\n  };\n\n  this.hover = null;\n  this.history = [];\n  this.clickable = [];\n  this.keyable = [];\n  this.grabKeys = false;\n  this.lockKeys = false;\n  this.focused;\n  this._buf = '';\n\n  this._ci = -1;\n\n  if (options.title) {\n    this.title = options.title;\n  }\n\n  options.cursor = options.cursor || {\n    artificial: options.artificialCursor,\n    shape: options.cursorShape,\n    blink: options.cursorBlink,\n    color: options.cursorColor\n  };\n\n  this.cursor = {\n    artificial: options.cursor.artificial || false,\n    shape: options.cursor.shape || 'block',\n    blink: options.cursor.blink || false,\n    color: options.cursor.color || null,\n    _set: false,\n    _state: 1,\n    _hidden: true\n  };\n\n  this.program.on('resize', function() {\n    self.alloc();\n    self.render();\n    (function emit(el) {\n      el.emit('resize');\n      el.children.forEach(emit);\n    })(self);\n  });\n\n  this.program.on('focus', function() {\n    self.emit('focus');\n  });\n\n  this.program.on('blur', function() {\n    self.emit('blur');\n  });\n\n  this.program.on('warning', function(text) {\n    self.emit('warning', text);\n  });\n\n  this.on('newListener', function fn(type) {\n    if (type === 'keypress' || type.indexOf('key ') === 0 || type === 'mouse') {\n      if (type === 'keypress' || type.indexOf('key ') === 0) self._listenKeys();\n      if (type === 'mouse') self._listenMouse();\n    }\n    if (type === 'mouse'\n      || type === 'click'\n      || type === 'mouseover'\n      || type === 'mouseout'\n      || type === 'mousedown'\n      || type === 'mouseup'\n      || type === 'mousewheel'\n      || type === 'wheeldown'\n      || type === 'wheelup'\n      || type === 'mousemove') {\n      self._listenMouse();\n    }\n  });\n\n  this.setMaxListeners(Infinity);\n\n  this.enter();\n\n  this.postEnter();\n}\n\nScreen.global = null;\n\nScreen.total = 0;\n\nScreen.instances = [];\n\nScreen.bind = function(screen) {\n  if (!Screen.global) {\n    Screen.global = screen;\n  }\n\n  if (!~Screen.instances.indexOf(screen)) {\n    Screen.instances.push(screen);\n    screen.index = Screen.total;\n    Screen.total++;\n  }\n\n  if (Screen._bound) return;\n  Screen._bound = true;\n\n  process.on('uncaughtException', Screen._exceptionHandler = function(err) {\n    if (process.listeners('uncaughtException').length > 1) {\n      return;\n    }\n    Screen.instances.slice().forEach(function(screen) {\n      screen.destroy();\n    });\n    err = err || new Error('Uncaught Exception.');\n    console.error(err.stack ? err.stack + '' : err + '');\n    nextTick(function() {\n      process.exit(1);\n    });\n  });\n\n  ['SIGTERM', 'SIGINT', 'SIGQUIT'].forEach(function(signal) {\n    var name = '_' + signal.toLowerCase() + 'Handler';\n    process.on(signal, Screen[name] = function() {\n      if (process.listeners(signal).length > 1) {\n        return;\n      }\n      nextTick(function() {\n        process.exit(0);\n      });\n    });\n  });\n\n  process.on('exit', Screen._exitHandler = function() {\n    Screen.instances.slice().forEach(function(screen) {\n      screen.destroy();\n    });\n  });\n};\n\nScreen.prototype.__proto__ = Node.prototype;\n\nScreen.prototype.type = 'screen';\n\nScreen.prototype.__defineGetter__('title', function() {\n  return this.program.title;\n});\n\nScreen.prototype.__defineSetter__('title', function(title) {\n  return this.program.title = title;\n});\n\nScreen.prototype.__defineGetter__('terminal', function() {\n  return this.program.terminal;\n});\n\nScreen.prototype.__defineSetter__('terminal', function(terminal) {\n  this.setTerminal(terminal);\n  return this.program.terminal;\n});\n\nScreen.prototype.setTerminal = function(terminal) {\n  var entered = !!this.program.isAlt;\n  if (entered) {\n    this._buf = '';\n    this.program._buf = '';\n    this.leave();\n  }\n  this.program.setTerminal(terminal);\n  this.tput = this.program.tput;\n  if (entered) {\n    this.enter();\n  }\n};\n\nScreen.prototype.enter = function() {\n  if (this.program.isAlt) return;\n  if (!this.cursor._set) {\n    if (this.options.cursor.shape) {\n      this.cursorShape(this.cursor.shape, this.cursor.blink);\n    }\n    if (this.options.cursor.color) {\n      this.cursorColor(this.cursor.color);\n    }\n  }\n  if (process.platform === 'win32') {\n    try {\n      cp.execSync('cls', { stdio: 'ignore', timeout: 1000 });\n    } catch (e) {\n      ;\n    }\n  }\n  this.program.alternateBuffer();\n  this.program.put.keypad_xmit();\n  this.program.csr(0, this.height - 1);\n  this.program.hideCursor();\n  this.program.cup(0, 0);\n  // We need this for tmux now:\n  if (this.tput.strings.ena_acs) {\n    this.program._write(this.tput.enacs());\n  }\n  this.alloc();\n};\n\nScreen.prototype.leave = function() {\n  if (!this.program.isAlt) return;\n  this.program.put.keypad_local();\n  if (this.program.scrollTop !== 0\n      || this.program.scrollBottom !== this.rows - 1) {\n    this.program.csr(0, this.height - 1);\n  }\n  // XXX For some reason if alloc/clear() is before this\n  // line, it doesn't work on linux console.\n  this.program.showCursor();\n  this.alloc();\n  if (this._listenedMouse) {\n    this.program.disableMouse();\n  }\n  this.program.normalBuffer();\n  if (this.cursor._set) this.cursorReset();\n  this.program.flush();\n  if (process.platform === 'win32') {\n    try {\n      cp.execSync('cls', { stdio: 'ignore', timeout: 1000 });\n    } catch (e) {\n      ;\n    }\n  }\n};\n\nScreen.prototype.postEnter = function() {\n  var self = this;\n  if (this.options.debug) {\n    this.debugLog = new Log({\n      screen: this,\n      parent: this,\n      hidden: true,\n      draggable: true,\n      left: 'center',\n      top: 'center',\n      width: '30%',\n      height: '30%',\n      border: 'line',\n      label: ' {bold}Debug Log{/bold} ',\n      tags: true,\n      keys: true,\n      vi: true,\n      mouse: true,\n      scrollbar: {\n        ch: ' ',\n        track: {\n          bg: 'yellow'\n        },\n        style: {\n          inverse: true\n        }\n      }\n    });\n\n    this.debugLog.toggle = function() {\n      if (self.debugLog.hidden) {\n        self.saveFocus();\n        self.debugLog.show();\n        self.debugLog.setFront();\n        self.debugLog.focus();\n      } else {\n        self.debugLog.hide();\n        self.restoreFocus();\n      }\n      self.render();\n    };\n\n    this.debugLog.key(['q', 'escape'], self.debugLog.toggle);\n    this.key('f12', self.debugLog.toggle);\n  }\n\n  if (this.options.warnings) {\n    this.on('warning', function(text) {\n      var warning = new Box({\n        screen: self,\n        parent: self,\n        left: 'center',\n        top: 'center',\n        width: 'shrink',\n        padding: 1,\n        height: 'shrink',\n        align: 'center',\n        valign: 'middle',\n        border: 'line',\n        label: ' {red-fg}{bold}WARNING{/} ',\n        content: '{bold}' + text + '{/bold}',\n        tags: true\n      });\n      self.render();\n      var timeout = setTimeout(function() {\n        warning.destroy();\n        self.render();\n      }, 1500);\n      if (timeout.unref) {\n        timeout.unref();\n      }\n    });\n  }\n};\n\nScreen.prototype._destroy = Screen.prototype.destroy;\nScreen.prototype.destroy = function() {\n  this.leave();\n\n  var index = Screen.instances.indexOf(this);\n  if (~index) {\n    Screen.instances.splice(index, 1);\n    Screen.total--;\n\n    Screen.global = Screen.instances[0];\n\n    if (Screen.total === 0) {\n      Screen.global = null;\n\n      process.removeListener('uncaughtException', Screen._exceptionHandler);\n      process.removeListener('SIGTERM', Screen._sigtermHandler);\n      process.removeListener('SIGINT', Screen._sigintHandler);\n      process.removeListener('SIGQUIT', Screen._sigquitHandler);\n      process.removeListener('exit', Screen._exitHandler);\n      delete Screen._exceptionHandler;\n      delete Screen._sigtermHandler;\n      delete Screen._sigintHandler;\n      delete Screen._sigquitHandler;\n      delete Screen._exitHandler;\n\n      delete Screen._bound;\n    }\n\n    this.destroyed = true;\n    this.emit('destroy');\n    this._destroy();\n  }\n\n  this.program.destroy();\n};\n\nScreen.prototype.log = function() {\n  return this.program.log.apply(this.program, arguments);\n};\n\nScreen.prototype.debug = function() {\n  if (this.debugLog) {\n    this.debugLog.log.apply(this.debugLog, arguments);\n  }\n  return this.program.debug.apply(this.program, arguments);\n};\n\nScreen.prototype._listenMouse = function(el) {\n  var self = this;\n\n  if (el && !~this.clickable.indexOf(el)) {\n    el.clickable = true;\n    this.clickable.push(el);\n  }\n\n  if (this._listenedMouse) return;\n  this._listenedMouse = true;\n\n  this.program.enableMouse();\n  if (this.options.sendFocus) {\n    this.program.setMouse({ sendFocus: true }, true);\n  }\n\n  this.on('render', function() {\n    self._needsClickableSort = true;\n  });\n\n  this.program.on('mouse', function(data) {\n    if (self.lockKeys) return;\n\n    if (self._needsClickableSort) {\n      self.clickable = helpers.hsort(self.clickable);\n      self._needsClickableSort = false;\n    }\n\n    var i = 0\n      , el\n      , set\n      , pos;\n\n    for (; i < self.clickable.length; i++) {\n      el = self.clickable[i];\n\n      if (el.detached || !el.visible) {\n        continue;\n      }\n\n      // if (self.grabMouse && self.focused !== el\n      //     && !el.hasAncestor(self.focused)) continue;\n\n      pos = el.lpos;\n      if (!pos) continue;\n\n      if (data.x >= pos.xi && data.x < pos.xl\n          && data.y >= pos.yi && data.y < pos.yl) {\n        el.emit('mouse', data);\n        if (data.action === 'mousedown') {\n          self.mouseDown = el;\n        } else if (data.action === 'mouseup') {\n          (self.mouseDown || el).emit('click', data);\n          self.mouseDown = null;\n        } else if (data.action === 'mousemove') {\n          if (self.hover && el.index > self.hover.index) {\n            set = false;\n          }\n          if (self.hover !== el && !set) {\n            if (self.hover) {\n              self.hover.emit('mouseout', data);\n            }\n            el.emit('mouseover', data);\n            self.hover = el;\n          }\n          set = true;\n        }\n        el.emit(data.action, data);\n        break;\n      }\n    }\n\n    // Just mouseover?\n    if ((data.action === 'mousemove'\n        || data.action === 'mousedown'\n        || data.action === 'mouseup')\n        && self.hover\n        && !set) {\n      self.hover.emit('mouseout', data);\n      self.hover = null;\n    }\n\n    self.emit('mouse', data);\n    self.emit(data.action, data);\n  });\n\n  // Autofocus highest element.\n  // this.on('element click', function(el, data) {\n  //   var target;\n  //   do {\n  //     if (el.clickable === true && el.options.autoFocus !== false) {\n  //       target = el;\n  //     }\n  //   } while (el = el.parent);\n  //   if (target) target.focus();\n  // });\n\n  // Autofocus elements with the appropriate option.\n  this.on('element click', function(el) {\n    if (el.clickable === true && el.options.autoFocus !== false) {\n      el.focus();\n    }\n  });\n};\n\nScreen.prototype.enableMouse = function(el) {\n  this._listenMouse(el);\n};\n\nScreen.prototype._listenKeys = function(el) {\n  var self = this;\n\n  if (el && !~this.keyable.indexOf(el)) {\n    el.keyable = true;\n    this.keyable.push(el);\n  }\n\n  if (this._listenedKeys) return;\n  this._listenedKeys = true;\n\n  // NOTE: The event emissions used to be reversed:\n  // element + screen\n  // They are now:\n  // screen + element\n  // After the first keypress emitted, the handler\n  // checks to make sure grabKeys, lockKeys, and focused\n  // weren't changed, and handles those situations appropriately.\n  this.program.on('keypress', function(ch, key) {\n    if (self.lockKeys && !~self.ignoreLocked.indexOf(key.full)) {\n      return;\n    }\n\n    var focused = self.focused\n      , grabKeys = self.grabKeys;\n\n    if (!grabKeys || ~self.ignoreLocked.indexOf(key.full)) {\n      self.emit('keypress', ch, key);\n      self.emit('key ' + key.full, ch, key);\n    }\n\n    // If something changed from the screen key handler, stop.\n    if (self.grabKeys !== grabKeys || self.lockKeys) {\n      return;\n    }\n\n    if (focused && focused.keyable) {\n      focused.emit('keypress', ch, key);\n      focused.emit('key ' + key.full, ch, key);\n    }\n  });\n};\n\nScreen.prototype.enableKeys = function(el) {\n  this._listenKeys(el);\n};\n\nScreen.prototype.enableInput = function(el) {\n  this._listenMouse(el);\n  this._listenKeys(el);\n};\n\nScreen.prototype._initHover = function() {\n  var self = this;\n\n  if (this._hoverText) {\n    return;\n  }\n\n  this._hoverText = new Box({\n    screen: this,\n    left: 0,\n    top: 0,\n    tags: false,\n    height: 'shrink',\n    width: 'shrink',\n    border: 'line',\n    style: {\n      border: {\n        fg: 'default'\n      },\n      bg: 'default',\n      fg: 'default'\n    }\n  });\n\n  this.on('mousemove', function(data) {\n    if (self._hoverText.detached) return;\n    self._hoverText.rleft = data.x + 1;\n    self._hoverText.rtop = data.y;\n    self.render();\n  });\n\n  this.on('element mouseover', function(el, data) {\n    if (!el._hoverOptions) return;\n    self._hoverText.parseTags = el.parseTags;\n    self._hoverText.setContent(el._hoverOptions.text);\n    self.append(self._hoverText);\n    self._hoverText.rleft = data.x + 1;\n    self._hoverText.rtop = data.y;\n    self.render();\n  });\n\n  this.on('element mouseout', function() {\n    if (self._hoverText.detached) return;\n    self._hoverText.detach();\n    self.render();\n  });\n\n  // XXX This can cause problems if the\n  // terminal does not support allMotion.\n  // Workaround: check to see if content is set.\n  this.on('element mouseup', function(el) {\n    if (!self._hoverText.getContent()) return;\n    if (!el._hoverOptions) return;\n    self.append(self._hoverText);\n    self.render();\n  });\n};\n\nScreen.prototype.__defineGetter__('cols', function() {\n  return this.program.cols;\n});\n\nScreen.prototype.__defineGetter__('rows', function() {\n  return this.program.rows;\n});\n\nScreen.prototype.__defineGetter__('width', function() {\n  return this.program.cols;\n});\n\nScreen.prototype.__defineGetter__('height', function() {\n  return this.program.rows;\n});\n\nScreen.prototype.alloc = function(dirty) {\n  var x, y;\n\n  this.lines = [];\n  for (y = 0; y < this.rows; y++) {\n    this.lines[y] = [];\n    for (x = 0; x < this.cols; x++) {\n      this.lines[y][x] = [this.dattr, ' '];\n    }\n    this.lines[y].dirty = !!dirty;\n  }\n\n  this.olines = [];\n  for (y = 0; y < this.rows; y++) {\n    this.olines[y] = [];\n    for (x = 0; x < this.cols; x++) {\n      this.olines[y][x] = [this.dattr, ' '];\n    }\n  }\n\n  this.program.clear();\n};\n\nScreen.prototype.realloc = function() {\n  return this.alloc(true);\n};\n\nScreen.prototype.render = function() {\n  var self = this;\n\n  if (this.destroyed) return;\n\n  this.emit('prerender');\n\n  this._borderStops = {};\n\n  // TODO: Possibly get rid of .dirty altogether.\n  // TODO: Could possibly drop .dirty and just clear the `lines` buffer every\n  // time before a screen.render. This way clearRegion doesn't have to be\n  // called in arbitrary places for the sake of clearing a spot where an\n  // element used to be (e.g. when an element moves or is hidden). There could\n  // be some overhead though.\n  // this.screen.clearRegion(0, this.cols, 0, this.rows);\n  this._ci = 0;\n  this.children.forEach(function(el) {\n    el.index = self._ci++;\n    //el._rendering = true;\n    el.render();\n    //el._rendering = false;\n  });\n  this._ci = -1;\n\n  if (this.screen.dockBorders) {\n    this._dockBorders();\n  }\n\n  this.draw(0, this.lines.length - 1);\n\n  // XXX Workaround to deal with cursor pos before the screen has rendered and\n  // lpos is not reliable (stale).\n  if (this.focused && this.focused._updateCursor) {\n    this.focused._updateCursor(true);\n  }\n\n  this.renders++;\n\n  this.emit('render');\n};\n\nScreen.prototype.blankLine = function(ch, dirty) {\n  var out = [];\n  for (var x = 0; x < this.cols; x++) {\n    out[x] = [this.dattr, ch || ' '];\n  }\n  out.dirty = dirty;\n  return out;\n};\n\nScreen.prototype.insertLine = function(n, y, top, bottom) {\n  // if (y === top) return this.insertLineNC(n, y, top, bottom);\n\n  if (!this.tput.strings.change_scroll_region\n      || !this.tput.strings.delete_line\n      || !this.tput.strings.insert_line) return;\n\n  this._buf += this.tput.csr(top, bottom);\n  this._buf += this.tput.cup(y, 0);\n  this._buf += this.tput.il(n);\n  this._buf += this.tput.csr(0, this.height - 1);\n\n  var j = bottom + 1;\n\n  while (n--) {\n    this.lines.splice(y, 0, this.blankLine());\n    this.lines.splice(j, 1);\n    this.olines.splice(y, 0, this.blankLine());\n    this.olines.splice(j, 1);\n  }\n};\n\nScreen.prototype.deleteLine = function(n, y, top, bottom) {\n  // if (y === top) return this.deleteLineNC(n, y, top, bottom);\n\n  if (!this.tput.strings.change_scroll_region\n      || !this.tput.strings.delete_line\n      || !this.tput.strings.insert_line) return;\n\n  this._buf += this.tput.csr(top, bottom);\n  this._buf += this.tput.cup(y, 0);\n  this._buf += this.tput.dl(n);\n  this._buf += this.tput.csr(0, this.height - 1);\n\n  var j = bottom + 1;\n\n  while (n--) {\n    this.lines.splice(j, 0, this.blankLine());\n    this.lines.splice(y, 1);\n    this.olines.splice(j, 0, this.blankLine());\n    this.olines.splice(y, 1);\n  }\n};\n\n// This is how ncurses does it.\n// Scroll down (up cursor-wise).\n// This will only work for top line deletion as opposed to arbitrary lines.\nScreen.prototype.insertLineNC = function(n, y, top, bottom) {\n  if (!this.tput.strings.change_scroll_region\n      || !this.tput.strings.delete_line) return;\n\n  this._buf += this.tput.csr(top, bottom);\n  this._buf += this.tput.cup(top, 0);\n  this._buf += this.tput.dl(n);\n  this._buf += this.tput.csr(0, this.height - 1);\n\n  var j = bottom + 1;\n\n  while (n--) {\n    this.lines.splice(j, 0, this.blankLine());\n    this.lines.splice(y, 1);\n    this.olines.splice(j, 0, this.blankLine());\n    this.olines.splice(y, 1);\n  }\n};\n\n// This is how ncurses does it.\n// Scroll up (down cursor-wise).\n// This will only work for bottom line deletion as opposed to arbitrary lines.\nScreen.prototype.deleteLineNC = function(n, y, top, bottom) {\n  if (!this.tput.strings.change_scroll_region\n      || !this.tput.strings.delete_line) return;\n\n  this._buf += this.tput.csr(top, bottom);\n  this._buf += this.tput.cup(bottom, 0);\n  this._buf += Array(n + 1).join('\\n');\n  this._buf += this.tput.csr(0, this.height - 1);\n\n  var j = bottom + 1;\n\n  while (n--) {\n    this.lines.splice(j, 0, this.blankLine());\n    this.lines.splice(y, 1);\n    this.olines.splice(j, 0, this.blankLine());\n    this.olines.splice(y, 1);\n  }\n};\n\nScreen.prototype.insertBottom = function(top, bottom) {\n  return this.deleteLine(1, top, top, bottom);\n};\n\nScreen.prototype.insertTop = function(top, bottom) {\n  return this.insertLine(1, top, top, bottom);\n};\n\nScreen.prototype.deleteBottom = function(top, bottom) {\n  return this.clearRegion(0, this.width, bottom, bottom);\n};\n\nScreen.prototype.deleteTop = function(top, bottom) {\n  // Same as: return this.insertBottom(top, bottom);\n  return this.deleteLine(1, top, top, bottom);\n};\n\n// Parse the sides of an element to determine\n// whether an element has uniform cells on\n// both sides. If it does, we can use CSR to\n// optimize scrolling on a scrollable element.\n// Not exactly sure how worthwile this is.\n// This will cause a performance/cpu-usage hit,\n// but will it be less or greater than the\n// performance hit of slow-rendering scrollable\n// boxes with clean sides?\nScreen.prototype.cleanSides = function(el) {\n  var pos = el.lpos;\n\n  if (!pos) {\n    return false;\n  }\n\n  if (pos._cleanSides != null) {\n    return pos._cleanSides;\n  }\n\n  if (pos.xi <= 0 && pos.xl >= this.width) {\n    return pos._cleanSides = true;\n  }\n\n  if (this.options.fastCSR) {\n    // Maybe just do this instead of parsing.\n    if (pos.yi < 0) return pos._cleanSides = false;\n    if (pos.yl > this.height) return pos._cleanSides = false;\n    if (this.width - (pos.xl - pos.xi) < 40) {\n      return pos._cleanSides = true;\n    }\n    return pos._cleanSides = false;\n  }\n\n  if (!this.options.smartCSR) {\n    return false;\n  }\n\n  // The scrollbar can't update properly, and there's also a\n  // chance that the scrollbar may get moved around senselessly.\n  // NOTE: In pratice, this doesn't seem to be the case.\n  // if (this.scrollbar) {\n  //   return pos._cleanSides = false;\n  // }\n\n  // Doesn't matter if we're only a height of 1.\n  // if ((pos.yl - el.ibottom) - (pos.yi + el.itop) <= 1) {\n  //   return pos._cleanSides = false;\n  // }\n\n  var yi = pos.yi + el.itop\n    , yl = pos.yl - el.ibottom\n    , first\n    , ch\n    , x\n    , y;\n\n  if (pos.yi < 0) return pos._cleanSides = false;\n  if (pos.yl > this.height) return pos._cleanSides = false;\n  if (pos.xi - 1 < 0) return pos._cleanSides = true;\n  if (pos.xl > this.width) return pos._cleanSides = true;\n\n  for (x = pos.xi - 1; x >= 0; x--) {\n    if (!this.olines[yi]) break;\n    first = this.olines[yi][x];\n    for (y = yi; y < yl; y++) {\n      if (!this.olines[y] || !this.olines[y][x]) break;\n      ch = this.olines[y][x];\n      if (ch[0] !== first[0] || ch[1] !== first[1]) {\n        return pos._cleanSides = false;\n      }\n    }\n  }\n\n  for (x = pos.xl; x < this.width; x++) {\n    if (!this.olines[yi]) break;\n    first = this.olines[yi][x];\n    for (y = yi; y < yl; y++) {\n      if (!this.olines[y] || !this.olines[y][x]) break;\n      ch = this.olines[y][x];\n      if (ch[0] !== first[0] || ch[1] !== first[1]) {\n        return pos._cleanSides = false;\n      }\n    }\n  }\n\n  return pos._cleanSides = true;\n};\n\nScreen.prototype._dockBorders = function() {\n  var lines = this.lines\n    , stops = this._borderStops\n    , i\n    , y\n    , x\n    , ch;\n\n  // var keys, stop;\n  //\n  // keys = Object.keys(this._borderStops)\n  //   .map(function(k) { return +k; })\n  //   .sort(function(a, b) { return a - b; });\n  //\n  // for (i = 0; i < keys.length; i++) {\n  //   y = keys[i];\n  //   if (!lines[y]) continue;\n  //   stop = this._borderStops[y];\n  //   for (x = stop.xi; x < stop.xl; x++) {\n\n  stops = Object.keys(stops)\n    .map(function(k) { return +k; })\n    .sort(function(a, b) { return a - b; });\n\n  for (i = 0; i < stops.length; i++) {\n    y = stops[i];\n    if (!lines[y]) continue;\n    for (x = 0; x < this.width; x++) {\n      ch = lines[y][x][1];\n      if (angles[ch]) {\n        lines[y][x][1] = this._getAngle(lines, x, y);\n        lines[y].dirty = true;\n      }\n    }\n  }\n};\n\nScreen.prototype._getAngle = function(lines, x, y) {\n  var angle = 0\n    , attr = lines[y][x][0]\n    , ch = lines[y][x][1];\n\n  if (lines[y][x - 1] && langles[lines[y][x - 1][1]]) {\n    if (!this.options.ignoreDockContrast) {\n      if (lines[y][x - 1][0] !== attr) return ch;\n    }\n    angle |= 1 << 3;\n  }\n\n  if (lines[y - 1] && uangles[lines[y - 1][x][1]]) {\n    if (!this.options.ignoreDockContrast) {\n      if (lines[y - 1][x][0] !== attr) return ch;\n    }\n    angle |= 1 << 2;\n  }\n\n  if (lines[y][x + 1] && rangles[lines[y][x + 1][1]]) {\n    if (!this.options.ignoreDockContrast) {\n      if (lines[y][x + 1][0] !== attr) return ch;\n    }\n    angle |= 1 << 1;\n  }\n\n  if (lines[y + 1] && dangles[lines[y + 1][x][1]]) {\n    if (!this.options.ignoreDockContrast) {\n      if (lines[y + 1][x][0] !== attr) return ch;\n    }\n    angle |= 1 << 0;\n  }\n\n  // Experimental: fixes this situation:\n  // +----------+\n  //            | <-- empty space here, should be a T angle\n  // +-------+  |\n  // |       |  |\n  // +-------+  |\n  // |          |\n  // +----------+\n  // if (uangles[lines[y][x][1]]) {\n  //   if (lines[y + 1] && cdangles[lines[y + 1][x][1]]) {\n  //     if (!this.options.ignoreDockContrast) {\n  //       if (lines[y + 1][x][0] !== attr) return ch;\n  //     }\n  //     angle |= 1 << 0;\n  //   }\n  // }\n\n  return angleTable[angle] || ch;\n};\n\nScreen.prototype.draw = function(start, end) {\n  // this.emit('predraw');\n\n  var x\n    , y\n    , line\n    , out\n    , ch\n    , data\n    , attr\n    , fg\n    , bg\n    , flags;\n\n  var main = ''\n    , pre\n    , post;\n\n  var clr\n    , neq\n    , xx;\n\n  var lx = -1\n    , ly = -1\n    , o;\n\n  var acs;\n\n  if (this._buf) {\n    main += this._buf;\n    this._buf = '';\n  }\n\n  for (y = start; y <= end; y++) {\n    line = this.lines[y];\n    o = this.olines[y];\n\n    if (!line.dirty && !(this.cursor.artificial && y === this.program.y)) {\n      continue;\n    }\n    line.dirty = false;\n\n    out = '';\n    attr = this.dattr;\n\n    for (x = 0; x < line.length; x++) {\n      data = line[x][0];\n      ch = line[x][1];\n\n      // Render the artificial cursor.\n      if (this.cursor.artificial\n          && !this.cursor._hidden\n          && this.cursor._state\n          && x === this.program.x\n          && y === this.program.y) {\n        var cattr = this._cursorAttr(this.cursor, data);\n        if (cattr.ch) ch = cattr.ch;\n        data = cattr.attr;\n      }\n\n      // Take advantage of xterm's back_color_erase feature by using a\n      // lookahead. Stop spitting out so many damn spaces. NOTE: Is checking\n      // the bg for non BCE terminals worth the overhead?\n      if (this.options.useBCE\n          && ch === ' '\n          && (this.tput.bools.back_color_erase\n          || (data & 0x1ff) === (this.dattr & 0x1ff))\n          && ((data >> 18) & 8) === ((this.dattr >> 18) & 8)) {\n        clr = true;\n        neq = false;\n\n        for (xx = x; xx < line.length; xx++) {\n          if (line[xx][0] !== data || line[xx][1] !== ' ') {\n            clr = false;\n            break;\n          }\n          if (line[xx][0] !== o[xx][0] || line[xx][1] !== o[xx][1]) {\n            neq = true;\n          }\n        }\n\n        if (clr && neq) {\n          lx = -1, ly = -1;\n          if (data !== attr) {\n            out += this.codeAttr(data);\n            attr = data;\n          }\n          out += this.tput.cup(y, x);\n          out += this.tput.el();\n          for (xx = x; xx < line.length; xx++) {\n            o[xx][0] = data;\n            o[xx][1] = ' ';\n          }\n          break;\n        }\n\n        // If there's more than 10 spaces, use EL regardless\n        // and start over drawing the rest of line. Might\n        // not be worth it. Try to use ECH if the terminal\n        // supports it. Maybe only try to use ECH here.\n        // //if (this.tput.strings.erase_chars)\n        // if (!clr && neq && (xx - x) > 10) {\n        //   lx = -1, ly = -1;\n        //   if (data !== attr) {\n        //     out += this.codeAttr(data);\n        //     attr = data;\n        //   }\n        //   out += this.tput.cup(y, x);\n        //   if (this.tput.strings.erase_chars) {\n        //     // Use erase_chars to avoid erasing the whole line.\n        //     out += this.tput.ech(xx - x);\n        //   } else {\n        //     out += this.tput.el();\n        //   }\n        //   if (this.tput.strings.parm_right_cursor) {\n        //     out += this.tput.cuf(xx - x);\n        //   } else {\n        //     out += this.tput.cup(y, xx);\n        //   }\n        //   this.fillRegion(data, ' ',\n        //     x, this.tput.strings.erase_chars ? xx : line.length,\n        //     y, y + 1);\n        //   x = xx - 1;\n        //   continue;\n        // }\n\n        // Skip to the next line if the\n        // rest of the line is already drawn.\n        // if (!neq) {\n        //   for (; xx < line.length; xx++) {\n        //     if (line[xx][0] !== o[xx][0] || line[xx][1] !== o[xx][1]) {\n        //       neq = true;\n        //       break;\n        //     }\n        //   }\n        //   if (!neq) {\n        //     attr = data;\n        //     break;\n        //   }\n        // }\n      }\n\n      // Optimize by comparing the real output\n      // buffer to the pending output buffer.\n      if (data === o[x][0] && ch === o[x][1]) {\n        if (lx === -1) {\n          lx = x;\n          ly = y;\n        }\n        continue;\n      } else if (lx !== -1) {\n        if (this.tput.strings.parm_right_cursor) {\n          out += y === ly\n            ? this.tput.cuf(x - lx)\n            : this.tput.cup(y, x);\n        } else {\n          out += this.tput.cup(y, x);\n        }\n        lx = -1, ly = -1;\n      }\n      o[x][0] = data;\n      o[x][1] = ch;\n\n      if (data !== attr) {\n        if (attr !== this.dattr) {\n          out += '\\x1b[m';\n        }\n        if (data !== this.dattr) {\n          out += '\\x1b[';\n\n          bg = data & 0x1ff;\n          fg = (data >> 9) & 0x1ff;\n          flags = data >> 18;\n\n          // bold\n          if (flags & 1) {\n            out += '1;';\n          }\n\n          // underline\n          if (flags & 2) {\n            out += '4;';\n          }\n\n          // blink\n          if (flags & 4) {\n            out += '5;';\n          }\n\n          // inverse\n          if (flags & 8) {\n            out += '7;';\n          }\n\n          // invisible\n          if (flags & 16) {\n            out += '8;';\n          }\n\n          if (bg !== 0x1ff) {\n            bg = this._reduceColor(bg);\n            if (bg < 16) {\n              if (bg < 8) {\n                bg += 40;\n              } else if (bg < 16) {\n                bg -= 8;\n                bg += 100;\n              }\n              out += bg + ';';\n            } else {\n              out += '48;5;' + bg + ';';\n            }\n          }\n\n          if (fg !== 0x1ff) {\n            fg = this._reduceColor(fg);\n            if (fg < 16) {\n              if (fg < 8) {\n                fg += 30;\n              } else if (fg < 16) {\n                fg -= 8;\n                fg += 90;\n              }\n              out += fg + ';';\n            } else {\n              out += '38;5;' + fg + ';';\n            }\n          }\n\n          if (out[out.length - 1] === ';') out = out.slice(0, -1);\n\n          out += 'm';\n        }\n      }\n\n      // If we find a double-width char, eat the next character which should be\n      // a space due to parseContent's behavior.\n      if (this.fullUnicode) {\n        // If this is a surrogate pair double-width char, we can ignore it\n        // because parseContent already counted it as length=2.\n        if (unicode.charWidth(line[x][1]) === 2) {\n          // NOTE: At cols=44, the bug that is avoided\n          // by the angles check occurs in widget-unicode:\n          // Might also need: `line[x + 1][0] !== line[x][0]`\n          // for borderless boxes?\n          if (x === line.length - 1 || angles[line[x + 1][1]]) {\n            // If we're at the end, we don't have enough space for a\n            // double-width. Overwrite it with a space and ignore.\n            ch = ' ';\n            o[x][1] = '\\0';\n          } else {\n            // ALWAYS refresh double-width chars because this special cursor\n            // behavior is needed. There may be a more efficient way of doing\n            // this. See above.\n            o[x][1] = '\\0';\n            // Eat the next character by moving forward and marking as a\n            // space (which it is).\n            o[++x][1] = '\\0';\n          }\n        }\n      }\n\n      // Attempt to use ACS for supported characters.\n      // This is not ideal, but it's how ncurses works.\n      // There are a lot of terminals that support ACS\n      // *and UTF8, but do not declare U8. So ACS ends\n      // up being used (slower than utf8). Terminals\n      // that do not support ACS and do not explicitly\n      // support UTF8 get their unicode characters\n      // replaced with really ugly ascii characters.\n      // It is possible there is a terminal out there\n      // somewhere that does not support ACS, but\n      // supports UTF8, but I imagine it's unlikely.\n      // Maybe remove !this.tput.unicode check, however,\n      // this seems to be the way ncurses does it.\n      if (this.tput.strings.enter_alt_charset_mode\n          && !this.tput.brokenACS && (this.tput.acscr[ch] || acs)) {\n        // Fun fact: even if this.tput.brokenACS wasn't checked here,\n        // the linux console would still work fine because the acs\n        // table would fail the check of: this.tput.acscr[ch]\n        if (this.tput.acscr[ch]) {\n          if (acs) {\n            ch = this.tput.acscr[ch];\n          } else {\n            ch = this.tput.smacs()\n              + this.tput.acscr[ch];\n            acs = true;\n          }\n        } else if (acs) {\n          ch = this.tput.rmacs() + ch;\n          acs = false;\n        }\n      } else {\n        // U8 is not consistently correct. Some terminfo's\n        // terminals that do not declare it may actually\n        // support utf8 (e.g. urxvt), but if the terminal\n        // does not declare support for ACS (and U8), chances\n        // are it does not support UTF8. This is probably\n        // the \"safest\" way to do this. Should fix things\n        // like sun-color.\n        // NOTE: It could be the case that the $LANG\n        // is all that matters in some cases:\n        // if (!this.tput.unicode && ch > '~') {\n        if (!this.tput.unicode && this.tput.numbers.U8 !== 1 && ch > '~') {\n          ch = this.tput.utoa[ch] || '?';\n        }\n      }\n\n      out += ch;\n      attr = data;\n    }\n\n    if (attr !== this.dattr) {\n      out += '\\x1b[m';\n    }\n\n    if (out) {\n      main += this.tput.cup(y, 0) + out;\n    }\n  }\n\n  if (acs) {\n    main += this.tput.rmacs();\n    acs = false;\n  }\n\n  if (main) {\n    pre = '';\n    post = '';\n\n    pre += this.tput.sc();\n    post += this.tput.rc();\n\n    if (!this.program.cursorHidden) {\n      pre += this.tput.civis();\n      post += this.tput.cnorm();\n    }\n\n    // this.program.flush();\n    // this.program._owrite(pre + main + post);\n    this.program._write(pre + main + post);\n  }\n\n  // this.emit('draw');\n};\n\nScreen.prototype._reduceColor = function(color) {\n  return colors.reduce(color, this.tput.colors);\n};\n\n// Convert an SGR string to our own attribute format.\nScreen.prototype.attrCode = function(code, cur, def) {\n  var flags = (cur >> 18) & 0x1ff\n    , fg = (cur >> 9) & 0x1ff\n    , bg = cur & 0x1ff\n    , c\n    , i;\n\n  code = code.slice(2, -1).split(';');\n  if (!code[0]) code[0] = '0';\n\n  for (i = 0; i < code.length; i++) {\n    c = +code[i] || 0;\n    switch (c) {\n      case 0: // normal\n        bg = def & 0x1ff;\n        fg = (def >> 9) & 0x1ff;\n        flags = (def >> 18) & 0x1ff;\n        break;\n      case 1: // bold\n        flags |= 1;\n        break;\n      case 22:\n        flags = (def >> 18) & 0x1ff;\n        break;\n      case 4: // underline\n        flags |= 2;\n        break;\n      case 24:\n        flags = (def >> 18) & 0x1ff;\n        break;\n      case 5: // blink\n        flags |= 4;\n        break;\n      case 25:\n        flags = (def >> 18) & 0x1ff;\n        break;\n      case 7: // inverse\n        flags |= 8;\n        break;\n      case 27:\n        flags = (def >> 18) & 0x1ff;\n        break;\n      case 8: // invisible\n        flags |= 16;\n        break;\n      case 28:\n        flags = (def >> 18) & 0x1ff;\n        break;\n      case 39: // default fg\n        fg = (def >> 9) & 0x1ff;\n        break;\n      case 49: // default bg\n        bg = def & 0x1ff;\n        break;\n      case 100: // default fg/bg\n        fg = (def >> 9) & 0x1ff;\n        bg = def & 0x1ff;\n        break;\n      default: // color\n        if (c === 48 && +code[i+1] === 5) {\n          i += 2;\n          bg = +code[i];\n          break;\n        } else if (c === 48 && +code[i+1] === 2) {\n          i += 2;\n          bg = colors.match(+code[i], +code[i+1], +code[i+2]);\n          if (bg === -1) bg = def & 0x1ff;\n          i += 2;\n          break;\n        } else if (c === 38 && +code[i+1] === 5) {\n          i += 2;\n          fg = +code[i];\n          break;\n        } else if (c === 38 && +code[i+1] === 2) {\n          i += 2;\n          fg = colors.match(+code[i], +code[i+1], +code[i+2]);\n          if (fg === -1) fg = (def >> 9) & 0x1ff;\n          i += 2;\n          break;\n        }\n        if (c >= 40 && c <= 47) {\n          bg = c - 40;\n        } else if (c >= 100 && c <= 107) {\n          bg = c - 100;\n          bg += 8;\n        } else if (c === 49) {\n          bg = def & 0x1ff;\n        } else if (c >= 30 && c <= 37) {\n          fg = c - 30;\n        } else if (c >= 90 && c <= 97) {\n          fg = c - 90;\n          fg += 8;\n        } else if (c === 39) {\n          fg = (def >> 9) & 0x1ff;\n        } else if (c === 100) {\n          fg = (def >> 9) & 0x1ff;\n          bg = def & 0x1ff;\n        }\n        break;\n    }\n  }\n\n  return (flags << 18) | (fg << 9) | bg;\n};\n\n// Convert our own attribute format to an SGR string.\nScreen.prototype.codeAttr = function(code) {\n  var flags = (code >> 18) & 0x1ff\n    , fg = (code >> 9) & 0x1ff\n    , bg = code & 0x1ff\n    , out = '';\n\n  // bold\n  if (flags & 1) {\n    out += '1;';\n  }\n\n  // underline\n  if (flags & 2) {\n    out += '4;';\n  }\n\n  // blink\n  if (flags & 4) {\n    out += '5;';\n  }\n\n  // inverse\n  if (flags & 8) {\n    out += '7;';\n  }\n\n  // invisible\n  if (flags & 16) {\n    out += '8;';\n  }\n\n  if (bg !== 0x1ff) {\n    bg = this._reduceColor(bg);\n    if (bg < 16) {\n      if (bg < 8) {\n        bg += 40;\n      } else if (bg < 16) {\n        bg -= 8;\n        bg += 100;\n      }\n      out += bg + ';';\n    } else {\n      out += '48;5;' + bg + ';';\n    }\n  }\n\n  if (fg !== 0x1ff) {\n    fg = this._reduceColor(fg);\n    if (fg < 16) {\n      if (fg < 8) {\n        fg += 30;\n      } else if (fg < 16) {\n        fg -= 8;\n        fg += 90;\n      }\n      out += fg + ';';\n    } else {\n      out += '38;5;' + fg + ';';\n    }\n  }\n\n  if (out[out.length - 1] === ';') out = out.slice(0, -1);\n\n  return '\\x1b[' + out + 'm';\n};\n\nScreen.prototype.focusOffset = function(offset) {\n  var shown = this.keyable.filter(function(el) {\n    return !el.detached && el.visible;\n  }).length;\n\n  if (!shown || !offset) {\n    return;\n  }\n\n  var i = this.keyable.indexOf(this.focused);\n  if (!~i) return;\n\n  if (offset > 0) {\n    while (offset--) {\n      if (++i > this.keyable.length - 1) i = 0;\n      if (this.keyable[i].detached || !this.keyable[i].visible) offset++;\n    }\n  } else {\n    offset = -offset;\n    while (offset--) {\n      if (--i < 0) i = this.keyable.length - 1;\n      if (this.keyable[i].detached || !this.keyable[i].visible) offset++;\n    }\n  }\n\n  return this.keyable[i].focus();\n};\n\nScreen.prototype.focusPrev =\nScreen.prototype.focusPrevious = function() {\n  return this.focusOffset(-1);\n};\n\nScreen.prototype.focusNext = function() {\n  return this.focusOffset(1);\n};\n\nScreen.prototype.focusPush = function(el) {\n  if (!el) return;\n  var old = this.history[this.history.length - 1];\n  if (this.history.length === 10) {\n    this.history.shift();\n  }\n  this.history.push(el);\n  this._focus(el, old);\n};\n\nScreen.prototype.focusPop = function() {\n  var old = this.history.pop();\n  if (this.history.length) {\n    this._focus(this.history[this.history.length - 1], old);\n  }\n  return old;\n};\n\nScreen.prototype.saveFocus = function() {\n  return this._savedFocus = this.focused;\n};\n\nScreen.prototype.restoreFocus = function() {\n  if (!this._savedFocus) return;\n  this._savedFocus.focus();\n  delete this._savedFocus;\n  return this.focused;\n};\n\nScreen.prototype.rewindFocus = function() {\n  var old = this.history.pop()\n    , el;\n\n  while (this.history.length) {\n    el = this.history.pop();\n    if (!el.detached && el.visible) {\n      this.history.push(el);\n      this._focus(el, old);\n      return el;\n    }\n  }\n\n  if (old) {\n    old.emit('blur');\n  }\n};\n\nScreen.prototype._focus = function(self, old) {\n  // Find a scrollable ancestor if we have one.\n  var el = self;\n  while (el = el.parent) {\n    if (el.scrollable) break;\n  }\n\n  // If we're in a scrollable element,\n  // automatically scroll to the focused element.\n  if (el && !el.detached) {\n    // NOTE: This is different from the other \"visible\" values - it needs the\n    // visible height of the scrolling element itself, not the element within\n    // it.\n    var visible = self.screen.height - el.atop - el.itop - el.abottom - el.ibottom;\n    if (self.rtop < el.childBase) {\n      el.scrollTo(self.rtop);\n      self.screen.render();\n    } else if (self.rtop + self.height - self.ibottom > el.childBase + visible) {\n      // Explanation for el.itop here: takes into account scrollable elements\n      // with borders otherwise the element gets covered by the bottom border:\n      el.scrollTo(self.rtop - (el.height - self.height) + el.itop, true);\n      self.screen.render();\n    }\n  }\n\n  if (old) {\n    old.emit('blur', self);\n  }\n\n  self.emit('focus', old);\n};\n\nScreen.prototype.__defineGetter__('focused', function() {\n  return this.history[this.history.length - 1];\n});\n\nScreen.prototype.__defineSetter__('focused', function(el) {\n  return this.focusPush(el);\n});\n\nScreen.prototype.clearRegion = function(xi, xl, yi, yl, override) {\n  return this.fillRegion(this.dattr, ' ', xi, xl, yi, yl, override);\n};\n\nScreen.prototype.fillRegion = function(attr, ch, xi, xl, yi, yl, override) {\n  var lines = this.lines\n    , cell\n    , xx;\n\n  if (xi < 0) xi = 0;\n  if (yi < 0) yi = 0;\n\n  for (; yi < yl; yi++) {\n    if (!lines[yi]) break;\n    for (xx = xi; xx < xl; xx++) {\n      cell = lines[yi][xx];\n      if (!cell) break;\n      if (override || attr !== cell[0] || ch !== cell[1]) {\n        lines[yi][xx][0] = attr;\n        lines[yi][xx][1] = ch;\n        lines[yi].dirty = true;\n      }\n    }\n  }\n};\n\nScreen.prototype.key = function() {\n  return this.program.key.apply(this, arguments);\n};\n\nScreen.prototype.onceKey = function() {\n  return this.program.onceKey.apply(this, arguments);\n};\n\nScreen.prototype.unkey =\nScreen.prototype.removeKey = function() {\n  return this.program.unkey.apply(this, arguments);\n};\n\nScreen.prototype.spawn = function(file, args, options) {\n  if (!Array.isArray(args)) {\n    options = args;\n    args = [];\n  }\n\n  var screen = this\n    , program = screen.program\n    , spawn = require('child_process').spawn\n    , mouse = program.mouseEnabled\n    , ps;\n\n  options = options || {};\n\n  options.stdio = options.stdio || 'inherit';\n\n  program.lsaveCursor('spawn');\n  // program.csr(0, program.rows - 1);\n  program.normalBuffer();\n  program.showCursor();\n  if (mouse) program.disableMouse();\n\n  var write = program.output.write;\n  program.output.write = function() {};\n  program.input.pause();\n  if (program.input.setRawMode) {\n    program.input.setRawMode(false);\n  }\n\n  var resume = function() {\n    if (resume.done) return;\n    resume.done = true;\n\n    if (program.input.setRawMode) {\n      program.input.setRawMode(true);\n    }\n    program.input.resume();\n    program.output.write = write;\n\n    program.alternateBuffer();\n    // program.csr(0, program.rows - 1);\n    if (mouse) {\n      program.enableMouse();\n      if (screen.options.sendFocus) {\n        screen.program.setMouse({ sendFocus: true }, true);\n      }\n    }\n\n    screen.alloc();\n    screen.render();\n\n    screen.program.lrestoreCursor('spawn', true);\n  };\n\n  ps = spawn(file, args, options);\n\n  ps.on('error', resume);\n\n  ps.on('exit', resume);\n\n  return ps;\n};\n\nScreen.prototype.exec = function(file, args, options, callback) {\n  var ps = this.spawn(file, args, options);\n\n  ps.on('error', function(err) {\n    if (!callback) return;\n    return callback(err, false);\n  });\n\n  ps.on('exit', function(code) {\n    if (!callback) return;\n    return callback(null, code === 0);\n  });\n\n  return ps;\n};\n\nScreen.prototype.readEditor = function(options, callback) {\n  if (typeof options === 'string') {\n    options = { editor: options };\n  }\n\n  if (!callback) {\n    callback = options;\n    options = null;\n  }\n\n  if (!callback) {\n    callback = function() {};\n  }\n\n  options = options || {};\n\n  var self = this\n    , editor = options.editor || process.env.EDITOR || 'vi'\n    , name = options.name || process.title || 'blessed'\n    , rnd = Math.random().toString(36).split('.').pop()\n    , file = '/tmp/' + name + '.' + rnd\n    , args = [file]\n    , opt;\n\n  opt = {\n    stdio: 'inherit',\n    env: process.env,\n    cwd: process.env.HOME\n  };\n\n  function writeFile(callback) {\n    if (!options.value) return callback();\n    return fs.writeFile(file, options.value, callback);\n  }\n\n  return writeFile(function(err) {\n    if (err) return callback(err);\n    return self.exec(editor, args, opt, function(err, success) {\n      if (err) return callback(err);\n      return fs.readFile(file, 'utf8', function(err, data) {\n        return fs.unlink(file, function() {\n          if (!success) return callback(new Error('Unsuccessful.'));\n          if (err) return callback(err);\n          return callback(null, data);\n        });\n      });\n    });\n  });\n};\n\nScreen.prototype.displayImage = function(file, callback) {\n  if (!file) {\n    if (!callback) return;\n    return callback(new Error('No image.'));\n  }\n\n  file = path.resolve(process.cwd(), file);\n\n  if (!~file.indexOf('://')) {\n    file = 'file://' + file;\n  }\n\n  var args = ['w3m', '-T', 'text/html'];\n\n  var input = '<title>press q to exit</title>'\n    + '<img align=\"center\" src=\"' + file + '\">';\n\n  var opt = {\n    stdio: ['pipe', 1, 2],\n    env: process.env,\n    cwd: process.env.HOME\n  };\n\n  var ps = this.spawn(args[0], args.slice(1), opt);\n\n  ps.on('error', function(err) {\n    if (!callback) return;\n    return callback(err);\n  });\n\n  ps.on('exit', function(code) {\n    if (!callback) return;\n    if (code !== 0) return callback(new Error('Exit Code: ' + code));\n    return callback(null, code === 0);\n  });\n\n  ps.stdin.write(input + '\\n');\n  ps.stdin.end();\n};\n\nScreen.prototype.setEffects = function(el, fel, over, out, effects, temp) {\n  if (!effects) return;\n\n  var tmp = {};\n  if (temp) el[temp] = tmp;\n\n  if (typeof el !== 'function') {\n    var _el = el;\n    el = function() { return _el; };\n  }\n\n  fel.on(over, function() {\n    var element = el();\n    Object.keys(effects).forEach(function(key) {\n      var val = effects[key];\n      if (val !== null && typeof val === 'object') {\n        tmp[key] = tmp[key] || {};\n        // element.style[key] = element.style[key] || {};\n        Object.keys(val).forEach(function(k) {\n          var v = val[k];\n          tmp[key][k] = element.style[key][k];\n          element.style[key][k] = v;\n        });\n        return;\n      }\n      tmp[key] = element.style[key];\n      element.style[key] = val;\n    });\n    element.screen.render();\n  });\n\n  fel.on(out, function() {\n    var element = el();\n    Object.keys(effects).forEach(function(key) {\n      var val = effects[key];\n      if (val !== null && typeof val === 'object') {\n        tmp[key] = tmp[key] || {};\n        // element.style[key] = element.style[key] || {};\n        Object.keys(val).forEach(function(k) {\n          if (tmp[key].hasOwnProperty(k)) {\n            element.style[key][k] = tmp[key][k];\n          }\n        });\n        return;\n      }\n      if (tmp.hasOwnProperty(key)) {\n        element.style[key] = tmp[key];\n      }\n    });\n    element.screen.render();\n  });\n};\n\nScreen.prototype.sigtstp = function(callback) {\n  var self = this;\n  this.program.sigtstp(function() {\n    self.alloc();\n    self.render();\n    self.program.lrestoreCursor('pause', true);\n    if (callback) callback();\n  });\n};\n\nScreen.prototype.copyToClipboard = function(text) {\n  return this.program.copyToClipboard(text);\n};\n\nScreen.prototype.cursorShape = function(shape, blink) {\n  var self = this;\n\n  this.cursor.shape = shape || 'block';\n  this.cursor.blink = blink || false;\n  this.cursor._set = true;\n\n  if (this.cursor.artificial) {\n    if (!this.program.hideCursor_old) {\n      var hideCursor = this.program.hideCursor;\n      this.program.hideCursor_old = this.program.hideCursor;\n      this.program.hideCursor = function() {\n        hideCursor.call(self.program);\n        self.cursor._hidden = true;\n        if (self.renders) self.render();\n      };\n    }\n    if (!this.program.showCursor_old) {\n      var showCursor = this.program.showCursor;\n      this.program.showCursor_old = this.program.showCursor;\n      this.program.showCursor = function() {\n        self.cursor._hidden = false;\n        if (self.program._exiting) showCursor.call(self.program);\n        if (self.renders) self.render();\n      };\n    }\n    if (!this._cursorBlink) {\n      this._cursorBlink = setInterval(function() {\n        if (!self.cursor.blink) return;\n        self.cursor._state ^= 1;\n        if (self.renders) self.render();\n      }, 500);\n      if (this._cursorBlink.unref) {\n        this._cursorBlink.unref();\n      }\n    }\n    return true;\n  }\n\n  return this.program.cursorShape(this.cursor.shape, this.cursor.blink);\n};\n\nScreen.prototype.cursorColor = function(color) {\n  this.cursor.color = color != null\n    ? colors.convert(color)\n    : null;\n  this.cursor._set = true;\n\n  if (this.cursor.artificial) {\n    return true;\n  }\n\n  return this.program.cursorColor(colors.ncolors[this.cursor.color]);\n};\n\nScreen.prototype.cursorReset =\nScreen.prototype.resetCursor = function() {\n  this.cursor.shape = 'block';\n  this.cursor.blink = false;\n  this.cursor.color = null;\n  this.cursor._set = false;\n\n  if (this.cursor.artificial) {\n    this.cursor.artificial = false;\n    if (this.program.hideCursor_old) {\n      this.program.hideCursor = this.program.hideCursor_old;\n      delete this.program.hideCursor_old;\n    }\n    if (this.program.showCursor_old) {\n      this.program.showCursor = this.program.showCursor_old;\n      delete this.program.showCursor_old;\n    }\n    if (this._cursorBlink) {\n      clearInterval(this._cursorBlink);\n      delete this._cursorBlink;\n    }\n    return true;\n  }\n\n  return this.program.cursorReset();\n};\n\nScreen.prototype._cursorAttr = function(cursor, dattr) {\n  var attr = dattr || this.dattr\n    , cattr\n    , ch;\n\n  if (cursor.shape === 'line') {\n    attr &= ~(0x1ff << 9);\n    attr |= 7 << 9;\n    ch = '\\u2502';\n  } else if (cursor.shape === 'underline') {\n    attr &= ~(0x1ff << 9);\n    attr |= 7 << 9;\n    attr |= 2 << 18;\n  } else if (cursor.shape === 'block') {\n    attr &= ~(0x1ff << 9);\n    attr |= 7 << 9;\n    attr |= 8 << 18;\n  } else if (typeof cursor.shape === 'object' && cursor.shape) {\n    cattr = Element.prototype.sattr.call(cursor, cursor.shape);\n\n    if (cursor.shape.bold || cursor.shape.underline\n        || cursor.shape.blink || cursor.shape.inverse\n        || cursor.shape.invisible) {\n      attr &= ~(0x1ff << 18);\n      attr |= ((cattr >> 18) & 0x1ff) << 18;\n    }\n\n    if (cursor.shape.fg) {\n      attr &= ~(0x1ff << 9);\n      attr |= ((cattr >> 9) & 0x1ff) << 9;\n    }\n\n    if (cursor.shape.bg) {\n      attr &= ~(0x1ff << 0);\n      attr |= cattr & 0x1ff;\n    }\n\n    if (cursor.shape.ch) {\n      ch = cursor.shape.ch;\n    }\n  }\n\n  if (cursor.color != null) {\n    attr &= ~(0x1ff << 9);\n    attr |= cursor.color << 9;\n  }\n\n  return {\n    ch: ch,\n    attr: attr\n  };\n};\n\nScreen.prototype.screenshot = function(xi, xl, yi, yl, term) {\n  if (xi == null) xi = 0;\n  if (xl == null) xl = this.cols;\n  if (yi == null) yi = 0;\n  if (yl == null) yl = this.rows;\n\n  if (xi < 0) xi = 0;\n  if (yi < 0) yi = 0;\n\n  var x\n    , y\n    , line\n    , out\n    , ch\n    , data\n    , attr;\n\n  var sdattr = this.dattr;\n\n  if (term) {\n    this.dattr = term.defAttr;\n  }\n\n  var main = '';\n\n  for (y = yi; y < yl; y++) {\n    line = term\n      ? term.lines[y]\n      : this.lines[y];\n\n    if (!line) break;\n\n    out = '';\n    attr = this.dattr;\n\n    for (x = xi; x < xl; x++) {\n      if (!line[x]) break;\n\n      data = line[x][0];\n      ch = line[x][1];\n\n      if (data !== attr) {\n        if (attr !== this.dattr) {\n          out += '\\x1b[m';\n        }\n        if (data !== this.dattr) {\n          var _data = data;\n          if (term) {\n            if (((_data >> 9) & 0x1ff) === 257) _data |= 0x1ff << 9;\n            if ((_data & 0x1ff) === 256) _data |= 0x1ff;\n          }\n          out += this.codeAttr(_data);\n        }\n      }\n\n      if (this.fullUnicode) {\n        if (unicode.charWidth(line[x][1]) === 2) {\n          if (x === xl - 1) {\n            ch = ' ';\n          } else {\n            x++;\n          }\n        }\n      }\n\n      out += ch;\n      attr = data;\n    }\n\n    if (attr !== this.dattr) {\n      out += '\\x1b[m';\n    }\n\n    if (out) {\n      main += (y > 0 ? '\\n' : '') + out;\n    }\n  }\n\n  main = main.replace(/(?:\\s*\\x1b\\[40m\\s*\\x1b\\[m\\s*)*$/, '') + '\\n';\n\n  if (term) {\n    this.dattr = sdattr;\n  }\n\n  return main;\n};\n\n/**\n * Positioning\n */\n\nScreen.prototype._getPos = function() {\n  return this;\n};\n\n/**\n * Angle Table\n */\n\nvar angles = {\n  '\\u2518': true, // '┘'\n  '\\u2510': true, // '┐'\n  '\\u250c': true, // '┌'\n  '\\u2514': true, // '└'\n  '\\u253c': true, // '┼'\n  '\\u251c': true, // '├'\n  '\\u2524': true, // '┤'\n  '\\u2534': true, // '┴'\n  '\\u252c': true, // '┬'\n  '\\u2502': true, // '│'\n  '\\u2500': true  // '─'\n};\n\nvar langles = {\n  '\\u250c': true, // '┌'\n  '\\u2514': true, // '└'\n  '\\u253c': true, // '┼'\n  '\\u251c': true, // '├'\n  '\\u2534': true, // '┴'\n  '\\u252c': true, // '┬'\n  '\\u2500': true  // '─'\n};\n\nvar uangles = {\n  '\\u2510': true, // '┐'\n  '\\u250c': true, // '┌'\n  '\\u253c': true, // '┼'\n  '\\u251c': true, // '├'\n  '\\u2524': true, // '┤'\n  '\\u252c': true, // '┬'\n  '\\u2502': true  // '│'\n};\n\nvar rangles = {\n  '\\u2518': true, // '┘'\n  '\\u2510': true, // '┐'\n  '\\u253c': true, // '┼'\n  '\\u2524': true, // '┤'\n  '\\u2534': true, // '┴'\n  '\\u252c': true, // '┬'\n  '\\u2500': true  // '─'\n};\n\nvar dangles = {\n  '\\u2518': true, // '┘'\n  '\\u2514': true, // '└'\n  '\\u253c': true, // '┼'\n  '\\u251c': true, // '├'\n  '\\u2524': true, // '┤'\n  '\\u2534': true, // '┴'\n  '\\u2502': true  // '│'\n};\n\n// var cdangles = {\n//   '\\u250c': true  // '┌'\n// };\n\n// Every ACS angle character can be\n// represented by 4 bits ordered like this:\n// [langle][uangle][rangle][dangle]\nvar angleTable = {\n  '0000': '', // ?\n  '0001': '\\u2502', // '│' // ?\n  '0010': '\\u2500', // '─' // ??\n  '0011': '\\u250c', // '┌'\n  '0100': '\\u2502', // '│' // ?\n  '0101': '\\u2502', // '│'\n  '0110': '\\u2514', // '└'\n  '0111': '\\u251c', // '├'\n  '1000': '\\u2500', // '─' // ??\n  '1001': '\\u2510', // '┐'\n  '1010': '\\u2500', // '─' // ??\n  '1011': '\\u252c', // '┬'\n  '1100': '\\u2518', // '┘'\n  '1101': '\\u2524', // '┤'\n  '1110': '\\u2534', // '┴'\n  '1111': '\\u253c'  // '┼'\n};\n\nObject.keys(angleTable).forEach(function(key) {\n  angleTable[parseInt(key, 2)] = angleTable[key];\n  delete angleTable[key];\n});\n\n/**\n * Expose\n */\n\nmodule.exports = Screen;\n"
  },
  {
    "path": "lib/widgets/scrollablebox.js",
    "content": "/**\n * scrollablebox.js - scrollable box element for blessed\n * Copyright (c) 2013-2015, Christopher Jeffrey and contributors (MIT License).\n * https://github.com/chjj/blessed\n */\n\n/**\n * Modules\n */\n\nvar Node = require('./node');\nvar Box = require('./box');\n\n/**\n * ScrollableBox\n */\n\nfunction ScrollableBox(options) {\n  var self = this;\n\n  if (!(this instanceof Node)) {\n    return new ScrollableBox(options);\n  }\n\n  options = options || {};\n\n  Box.call(this, options);\n\n  if (options.scrollable === false) {\n    return this;\n  }\n\n  this.scrollable = true;\n  this.childOffset = 0;\n  this.childBase = 0;\n  this.baseLimit = options.baseLimit || Infinity;\n  this.alwaysScroll = options.alwaysScroll;\n\n  this.scrollbar = options.scrollbar;\n  if (this.scrollbar) {\n    this.scrollbar.ch = this.scrollbar.ch || ' ';\n    this.style.scrollbar = this.style.scrollbar || this.scrollbar.style;\n    if (!this.style.scrollbar) {\n      this.style.scrollbar = {};\n      this.style.scrollbar.fg = this.scrollbar.fg;\n      this.style.scrollbar.bg = this.scrollbar.bg;\n      this.style.scrollbar.bold = this.scrollbar.bold;\n      this.style.scrollbar.underline = this.scrollbar.underline;\n      this.style.scrollbar.inverse = this.scrollbar.inverse;\n      this.style.scrollbar.invisible = this.scrollbar.invisible;\n    }\n    //this.scrollbar.style = this.style.scrollbar;\n    if (this.track || this.scrollbar.track) {\n      this.track = this.scrollbar.track || this.track;\n      this.style.track = this.style.scrollbar.track || this.style.track;\n      this.track.ch = this.track.ch || ' ';\n      this.style.track = this.style.track || this.track.style;\n      if (!this.style.track) {\n        this.style.track = {};\n        this.style.track.fg = this.track.fg;\n        this.style.track.bg = this.track.bg;\n        this.style.track.bold = this.track.bold;\n        this.style.track.underline = this.track.underline;\n        this.style.track.inverse = this.track.inverse;\n        this.style.track.invisible = this.track.invisible;\n      }\n      this.track.style = this.style.track;\n    }\n    // Allow controlling of the scrollbar via the mouse:\n    if (options.mouse) {\n      this.on('mousedown', function(data) {\n        if (self._scrollingBar) {\n          // Do not allow dragging on the scrollbar:\n          delete self.screen._dragging;\n          delete self._drag;\n          return;\n        }\n        var x = data.x - self.aleft;\n        var y = data.y - self.atop;\n        if (x === self.width - self.iright - 1) {\n          // Do not allow dragging on the scrollbar:\n          delete self.screen._dragging;\n          delete self._drag;\n          var perc = (y - self.itop) / (self.height - self.iheight);\n          self.setScrollPerc(perc * 100 | 0);\n          self.screen.render();\n          var smd, smu;\n          self._scrollingBar = true;\n          self.onScreenEvent('mousedown', smd = function(data) {\n            var y = data.y - self.atop;\n            var perc = y / self.height;\n            self.setScrollPerc(perc * 100 | 0);\n            self.screen.render();\n          });\n          // If mouseup occurs out of the window, no mouseup event fires, and\n          // scrollbar will drag again on mousedown until another mouseup\n          // occurs.\n          self.onScreenEvent('mouseup', smu = function() {\n            self._scrollingBar = false;\n            self.removeScreenEvent('mousedown', smd);\n            self.removeScreenEvent('mouseup', smu);\n          });\n        }\n      });\n    }\n  }\n\n  if (options.mouse) {\n    this.on('wheeldown', function() {\n      self.scroll(self.height / 2 | 0 || 1);\n      self.screen.render();\n    });\n    this.on('wheelup', function() {\n      self.scroll(-(self.height / 2 | 0) || -1);\n      self.screen.render();\n    });\n  }\n\n  if (options.keys && !options.ignoreKeys) {\n    this.on('keypress', function(ch, key) {\n      if (key.name === 'up' || (options.vi && key.name === 'k')) {\n        self.scroll(-1);\n        self.screen.render();\n        return;\n      }\n      if (key.name === 'down' || (options.vi && key.name === 'j')) {\n        self.scroll(1);\n        self.screen.render();\n        return;\n      }\n      if (options.vi && key.name === 'u' && key.ctrl) {\n        self.scroll(-(self.height / 2 | 0) || -1);\n        self.screen.render();\n        return;\n      }\n      if (options.vi && key.name === 'd' && key.ctrl) {\n        self.scroll(self.height / 2 | 0 || 1);\n        self.screen.render();\n        return;\n      }\n      if (options.vi && key.name === 'b' && key.ctrl) {\n        self.scroll(-self.height || -1);\n        self.screen.render();\n        return;\n      }\n      if (options.vi && key.name === 'f' && key.ctrl) {\n        self.scroll(self.height || 1);\n        self.screen.render();\n        return;\n      }\n      if (options.vi && key.name === 'g' && !key.shift) {\n        self.scrollTo(0);\n        self.screen.render();\n        return;\n      }\n      if (options.vi && key.name === 'g' && key.shift) {\n        self.scrollTo(self.getScrollHeight());\n        self.screen.render();\n        return;\n      }\n    });\n  }\n\n  this.on('parsed content', function() {\n    self._recalculateIndex();\n  });\n\n  self._recalculateIndex();\n}\n\nScrollableBox.prototype.__proto__ = Box.prototype;\n\nScrollableBox.prototype.type = 'scrollable-box';\n\n// XXX Potentially use this in place of scrollable checks elsewhere.\nScrollableBox.prototype.__defineGetter__('reallyScrollable', function() {\n  if (this.shrink) return this.scrollable;\n  return this.getScrollHeight() > this.height;\n});\n\nScrollableBox.prototype._scrollBottom = function() {\n  if (!this.scrollable) return 0;\n\n  // We could just calculate the children, but we can\n  // optimize for lists by just returning the items.length.\n  if (this._isList) {\n    return this.items ? this.items.length : 0;\n  }\n\n  if (this.lpos && this.lpos._scrollBottom) {\n    return this.lpos._scrollBottom;\n  }\n\n  var bottom = this.children.reduce(function(current, el) {\n    // el.height alone does not calculate the shrunken height, we need to use\n    // getCoords. A shrunken box inside a scrollable element will not grow any\n    // larger than the scrollable element's context regardless of how much\n    // content is in the shrunken box, unless we do this (call getCoords\n    // without the scrollable calculation):\n    // See: $ node test/widget-shrink-fail-2.js\n    if (!el.detached) {\n      var lpos = el._getCoords(false, true);\n      if (lpos) {\n        return Math.max(current, el.rtop + (lpos.yl - lpos.yi));\n      }\n    }\n    return Math.max(current, el.rtop + el.height);\n  }, 0);\n\n  // XXX Use this? Makes .getScrollHeight() useless!\n  // if (bottom < this._clines.length) bottom = this._clines.length;\n\n  if (this.lpos) this.lpos._scrollBottom = bottom;\n\n  return bottom;\n};\n\nScrollableBox.prototype.setScroll =\nScrollableBox.prototype.scrollTo = function(offset, always) {\n  // XXX\n  // At first, this appeared to account for the first new calculation of childBase:\n  this.scroll(0);\n  return this.scroll(offset - (this.childBase + this.childOffset), always);\n};\n\nScrollableBox.prototype.getScroll = function() {\n  return this.childBase + this.childOffset;\n};\n\nScrollableBox.prototype.scroll = function(offset, always) {\n  if (!this.scrollable) return;\n\n  if (this.detached) return;\n\n  // Handle scrolling.\n  var visible = this.height - this.iheight\n    , base = this.childBase\n    , d\n    , p\n    , t\n    , b\n    , max\n    , emax;\n\n  if (this.alwaysScroll || always) {\n    // Semi-workaround\n    this.childOffset = offset > 0\n      ? visible - 1 + offset\n      : offset;\n  } else {\n    this.childOffset += offset;\n  }\n\n  if (this.childOffset > visible - 1) {\n    d = this.childOffset - (visible - 1);\n    this.childOffset -= d;\n    this.childBase += d;\n  } else if (this.childOffset < 0) {\n    d = this.childOffset;\n    this.childOffset += -d;\n    this.childBase += d;\n  }\n\n  if (this.childBase < 0) {\n    this.childBase = 0;\n  } else if (this.childBase > this.baseLimit) {\n    this.childBase = this.baseLimit;\n  }\n\n  // Find max \"bottom\" value for\n  // content and descendant elements.\n  // Scroll the content if necessary.\n  if (this.childBase === base) {\n    return this.emit('scroll');\n  }\n\n  // When scrolling text, we want to be able to handle SGR codes as well as line\n  // feeds. This allows us to take preformatted text output from other programs\n  // and put it in a scrollable text box.\n  this.parseContent();\n\n  // XXX\n  // max = this.getScrollHeight() - (this.height - this.iheight);\n\n  max = this._clines.length - (this.height - this.iheight);\n  if (max < 0) max = 0;\n  emax = this._scrollBottom() - (this.height - this.iheight);\n  if (emax < 0) emax = 0;\n\n  this.childBase = Math.min(this.childBase, Math.max(emax, max));\n\n  if (this.childBase < 0) {\n    this.childBase = 0;\n  } else if (this.childBase > this.baseLimit) {\n    this.childBase = this.baseLimit;\n  }\n\n  // Optimize scrolling with CSR + IL/DL.\n  p = this.lpos;\n  // Only really need _getCoords() if we want\n  // to allow nestable scrolling elements...\n  // or if we **really** want shrinkable\n  // scrolling elements.\n  // p = this._getCoords();\n  if (p && this.childBase !== base && this.screen.cleanSides(this)) {\n    t = p.yi + this.itop;\n    b = p.yl - this.ibottom - 1;\n    d = this.childBase - base;\n\n    if (d > 0 && d < visible) {\n      // scrolled down\n      this.screen.deleteLine(d, t, t, b);\n    } else if (d < 0 && -d < visible) {\n      // scrolled up\n      d = -d;\n      this.screen.insertLine(d, t, t, b);\n    }\n  }\n\n  return this.emit('scroll');\n};\n\nScrollableBox.prototype._recalculateIndex = function() {\n  var max, emax;\n\n  if (this.detached || !this.scrollable) {\n    return 0;\n  }\n\n  // XXX\n  // max = this.getScrollHeight() - (this.height - this.iheight);\n\n  max = this._clines.length - (this.height - this.iheight);\n  if (max < 0) max = 0;\n  emax = this._scrollBottom() - (this.height - this.iheight);\n  if (emax < 0) emax = 0;\n\n  this.childBase = Math.min(this.childBase, Math.max(emax, max));\n\n  if (this.childBase < 0) {\n    this.childBase = 0;\n  } else if (this.childBase > this.baseLimit) {\n    this.childBase = this.baseLimit;\n  }\n};\n\nScrollableBox.prototype.resetScroll = function() {\n  if (!this.scrollable) return;\n  this.childOffset = 0;\n  this.childBase = 0;\n  return this.emit('scroll');\n};\n\nScrollableBox.prototype.getScrollHeight = function() {\n  return Math.max(this._clines.length, this._scrollBottom());\n};\n\nScrollableBox.prototype.getScrollPerc = function(s) {\n  var pos = this.lpos || this._getCoords();\n  if (!pos) return s ? -1 : 0;\n\n  var height = (pos.yl - pos.yi) - this.iheight\n    , i = this.getScrollHeight()\n    , p;\n\n  if (height < i) {\n    if (this.alwaysScroll) {\n      p = this.childBase / (i - height);\n    } else {\n      p = (this.childBase + this.childOffset) / (i - 1);\n    }\n    return p * 100;\n  }\n\n  return s ? -1 : 0;\n};\n\nScrollableBox.prototype.setScrollPerc = function(i) {\n  // XXX\n  // var m = this.getScrollHeight();\n  var m = Math.max(this._clines.length, this._scrollBottom());\n  return this.scrollTo((i / 100) * m | 0);\n};\n\n/**\n * Expose\n */\n\nmodule.exports = ScrollableBox;\n"
  },
  {
    "path": "lib/widgets/scrollabletext.js",
    "content": "/**\n * scrollabletext.js - scrollable text element for blessed\n * Copyright (c) 2013-2015, Christopher Jeffrey and contributors (MIT License).\n * https://github.com/chjj/blessed\n */\n\n/**\n * Modules\n */\n\nvar Node = require('./node');\nvar ScrollableBox = require('./scrollablebox');\n\n/**\n * ScrollableText\n */\n\nfunction ScrollableText(options) {\n  if (!(this instanceof Node)) {\n    return new ScrollableText(options);\n  }\n  options = options || {};\n  options.alwaysScroll = true;\n  ScrollableBox.call(this, options);\n}\n\nScrollableText.prototype.__proto__ = ScrollableBox.prototype;\n\nScrollableText.prototype.type = 'scrollable-text';\n\n/**\n * Expose\n */\n\nmodule.exports = ScrollableText;\n"
  },
  {
    "path": "lib/widgets/table.js",
    "content": "/**\n * table.js - table element for blessed\n * Copyright (c) 2013-2015, Christopher Jeffrey and contributors (MIT License).\n * https://github.com/chjj/blessed\n */\n\n/**\n * Modules\n */\n\nvar Node = require('./node');\nvar Box = require('./box');\n\n/**\n * Table\n */\n\nfunction Table(options) {\n  var self = this;\n\n  if (!(this instanceof Node)) {\n    return new Table(options);\n  }\n\n  options = options || {};\n  options.shrink = true;\n  options.style = options.style || {};\n  options.style.border = options.style.border || {};\n  options.style.header = options.style.header || {};\n  options.style.cell = options.style.cell || {};\n  options.align = options.align || 'center';\n\n  // Regular tables do not get custom height (this would\n  // require extra padding). Maybe add in the future.\n  delete options.height;\n\n  Box.call(this, options);\n\n  this.pad = options.pad != null\n    ? options.pad\n    : 2;\n\n  this.setData(options.rows || options.data);\n\n  this.on('attach', function() {\n    self.setContent('');\n    self.setData(self.rows);\n  });\n\n  this.on('resize', function() {\n    self.setContent('');\n    self.setData(self.rows);\n    self.screen.render();\n  });\n}\n\nTable.prototype.__proto__ = Box.prototype;\n\nTable.prototype.type = 'table';\n\nTable.prototype._calculateMaxes = function() {\n  var self = this;\n  var maxes = [];\n\n  if (this.detached) return;\n\n  this.rows = this.rows || [];\n\n  this.rows.forEach(function(row) {\n    row.forEach(function(cell, i) {\n      var clen = self.strWidth(cell);\n      if (!maxes[i] || maxes[i] < clen) {\n        maxes[i] = clen;\n      }\n    });\n  });\n\n  var total = maxes.reduce(function(total, max) {\n    return total + max;\n  }, 0);\n  total += maxes.length + 1;\n\n  // XXX There might be an issue with resizing where on the first resize event\n  // width appears to be less than total if it's a percentage or left/right\n  // combination.\n  if (this.width < total) {\n    delete this.position.width;\n  }\n\n  if (this.position.width != null) {\n    var missing = this.width - total;\n    var w = missing / maxes.length | 0;\n    var wr = missing % maxes.length;\n    maxes = maxes.map(function(max, i) {\n      if (i === maxes.length - 1) {\n        return max + w + wr;\n      }\n      return max + w;\n    });\n  } else {\n    maxes = maxes.map(function(max) {\n      return max + self.pad;\n    });\n  }\n\n  return this._maxes = maxes;\n};\n\nTable.prototype.setRows =\nTable.prototype.setData = function(rows) {\n  var self = this\n    , text = ''\n    , align = this.align;\n\n  this.rows = rows || [];\n\n  this._calculateMaxes();\n\n  if (!this._maxes) return;\n\n  this.rows.forEach(function(row, i) {\n    var isFooter = i === self.rows.length - 1;\n    row.forEach(function(cell, i) {\n      var width = self._maxes[i];\n      var clen = self.strWidth(cell);\n\n      if (i !== 0) {\n        text += ' ';\n      }\n\n      while (clen < width) {\n        if (align === 'center') {\n          cell = ' ' + cell + ' ';\n          clen += 2;\n        } else if (align === 'left') {\n          cell = cell + ' ';\n          clen += 1;\n        } else if (align === 'right') {\n          cell = ' ' + cell;\n          clen += 1;\n        }\n      }\n\n      if (clen > width) {\n        if (align === 'center') {\n          cell = cell.substring(1);\n          clen--;\n        } else if (align === 'left') {\n          cell = cell.slice(0, -1);\n          clen--;\n        } else if (align === 'right') {\n          cell = cell.substring(1);\n          clen--;\n        }\n      }\n\n      text += cell;\n    });\n    if (!isFooter) {\n      text += '\\n\\n';\n    }\n  });\n\n  delete this.align;\n  this.setContent(text);\n  this.align = align;\n};\n\nTable.prototype.render = function() {\n  var self = this;\n\n  var coords = this._render();\n  if (!coords) return;\n\n  this._calculateMaxes();\n\n  if (!this._maxes) return coords;\n\n  var lines = this.screen.lines\n    , xi = coords.xi\n    , yi = coords.yi\n    , rx\n    , ry\n    , i;\n\n  var dattr = this.sattr(this.style)\n    , hattr = this.sattr(this.style.header)\n    , cattr = this.sattr(this.style.cell)\n    , battr = this.sattr(this.style.border);\n\n  var width = coords.xl - coords.xi - this.iright\n    , height = coords.yl - coords.yi - this.ibottom;\n\n  // Apply attributes to header cells and cells.\n  for (var y = this.itop; y < height; y++) {\n    if (!lines[yi + y]) break;\n    for (var x = this.ileft; x < width; x++) {\n      if (!lines[yi + y][xi + x]) break;\n      // Check to see if it's not the default attr. Allows for tags:\n      if (lines[yi + y][xi + x][0] !== dattr) continue;\n      if (y === this.itop) {\n        lines[yi + y][xi + x][0] = hattr;\n      } else {\n        lines[yi + y][xi + x][0] = cattr;\n      }\n      lines[yi + y].dirty = true;\n    }\n  }\n\n  if (!this.border || this.options.noCellBorders) return coords;\n\n  // Draw border with correct angles.\n  ry = 0;\n  for (i = 0; i < self.rows.length + 1; i++) {\n    if (!lines[yi + ry]) break;\n    rx = 0;\n    self._maxes.forEach(function(max, i) {\n      rx += max;\n      if (i === 0) {\n        if (!lines[yi + ry][xi + 0]) return;\n        // left side\n        if (ry === 0) {\n          // top\n          lines[yi + ry][xi + 0][0] = battr;\n          // lines[yi + ry][xi + 0][1] = '\\u250c'; // '┌'\n        } else if (ry / 2 === self.rows.length) {\n          // bottom\n          lines[yi + ry][xi + 0][0] = battr;\n          // lines[yi + ry][xi + 0][1] = '\\u2514'; // '└'\n        } else {\n          // middle\n          lines[yi + ry][xi + 0][0] = battr;\n          lines[yi + ry][xi + 0][1] = '\\u251c'; // '├'\n          // XXX If we alter iwidth and ileft for no borders - nothing should be written here\n          if (!self.border.left) {\n            lines[yi + ry][xi + 0][1] = '\\u2500'; // '─'\n          }\n        }\n        lines[yi + ry].dirty = true;\n      } else if (i === self._maxes.length - 1) {\n        if (!lines[yi + ry][xi + rx + 1]) return;\n        // right side\n        if (ry === 0) {\n          // top\n          rx++;\n          lines[yi + ry][xi + rx][0] = battr;\n          // lines[yi + ry][xi + rx][1] = '\\u2510'; // '┐'\n        } else if (ry / 2 === self.rows.length) {\n          // bottom\n          rx++;\n          lines[yi + ry][xi + rx][0] = battr;\n          // lines[yi + ry][xi + rx][1] = '\\u2518'; // '┘'\n        } else {\n          // middle\n          rx++;\n          lines[yi + ry][xi + rx][0] = battr;\n          lines[yi + ry][xi + rx][1] = '\\u2524'; // '┤'\n          // XXX If we alter iwidth and iright for no borders - nothing should be written here\n          if (!self.border.right) {\n            lines[yi + ry][xi + rx][1] = '\\u2500'; // '─'\n          }\n        }\n        lines[yi + ry].dirty = true;\n        return;\n      }\n      if (!lines[yi + ry][xi + rx + 1]) return;\n      // center\n      if (ry === 0) {\n        // top\n        rx++;\n        lines[yi + ry][xi + rx][0] = battr;\n        lines[yi + ry][xi + rx][1] = '\\u252c'; // '┬'\n        // XXX If we alter iheight and itop for no borders - nothing should be written here\n        if (!self.border.top) {\n          lines[yi + ry][xi + rx][1] = '\\u2502'; // '│'\n        }\n      } else if (ry / 2 === self.rows.length) {\n        // bottom\n        rx++;\n        lines[yi + ry][xi + rx][0] = battr;\n        lines[yi + ry][xi + rx][1] = '\\u2534'; // '┴'\n        // XXX If we alter iheight and ibottom for no borders - nothing should be written here\n        if (!self.border.bottom) {\n          lines[yi + ry][xi + rx][1] = '\\u2502'; // '│'\n        }\n      } else {\n        // middle\n        if (self.options.fillCellBorders) {\n          var lbg = (ry <= 2 ? hattr : cattr) & 0x1ff;\n          rx++;\n          lines[yi + ry][xi + rx][0] = (battr & ~0x1ff) | lbg;\n        } else {\n          rx++;\n          lines[yi + ry][xi + rx][0] = battr;\n        }\n        lines[yi + ry][xi + rx][1] = '\\u253c'; // '┼'\n        // rx++;\n      }\n      lines[yi + ry].dirty = true;\n    });\n    ry += 2;\n  }\n\n  // Draw internal borders.\n  for (ry = 1; ry < self.rows.length * 2; ry++) {\n    if (!lines[yi + ry]) break;\n    rx = 0;\n    self._maxes.slice(0, -1).forEach(function(max) {\n      rx += max;\n      if (!lines[yi + ry][xi + rx + 1]) return;\n      if (ry % 2 !== 0) {\n        if (self.options.fillCellBorders) {\n          var lbg = (ry <= 2 ? hattr : cattr) & 0x1ff;\n          rx++;\n          lines[yi + ry][xi + rx][0] = (battr & ~0x1ff) | lbg;\n        } else {\n          rx++;\n          lines[yi + ry][xi + rx][0] = battr;\n        }\n        lines[yi + ry][xi + rx][1] = '\\u2502'; // '│'\n        lines[yi + ry].dirty = true;\n      } else {\n        rx++;\n      }\n    });\n    rx = 1;\n    self._maxes.forEach(function(max) {\n      while (max--) {\n        if (ry % 2 === 0) {\n          if (!lines[yi + ry]) break;\n          if (!lines[yi + ry][xi + rx + 1]) break;\n          if (self.options.fillCellBorders) {\n            var lbg = (ry <= 2 ? hattr : cattr) & 0x1ff;\n            lines[yi + ry][xi + rx][0] = (battr & ~0x1ff) | lbg;\n          } else {\n            lines[yi + ry][xi + rx][0] = battr;\n          }\n          lines[yi + ry][xi + rx][1] = '\\u2500'; // '─'\n          lines[yi + ry].dirty = true;\n        }\n        rx++;\n      }\n      rx++;\n    });\n  }\n\n  return coords;\n};\n\n/**\n * Expose\n */\n\nmodule.exports = Table;\n"
  },
  {
    "path": "lib/widgets/terminal.js",
    "content": "/**\n * terminal.js - term.js terminal element for blessed\n * Copyright (c) 2013-2015, Christopher Jeffrey and contributors (MIT License).\n * https://github.com/chjj/blessed\n */\n\n/**\n * Modules\n */\n\nvar nextTick = global.setImmediate || process.nextTick.bind(process);\n\nvar Node = require('./node');\nvar Box = require('./box');\n\n/**\n * Terminal\n */\n\nfunction Terminal(options) {\n  if (!(this instanceof Node)) {\n    return new Terminal(options);\n  }\n\n  options = options || {};\n  options.scrollable = false;\n\n  Box.call(this, options);\n\n  // XXX Workaround for all motion\n  if (this.screen.program.tmux && this.screen.program.tmuxVersion >= 2) {\n    this.screen.program.enableMouse();\n  }\n\n  this.handler = options.handler;\n  this.shell = options.shell || process.env.SHELL || 'sh';\n  this.args = options.args || [];\n\n  this.cursor = this.options.cursor;\n  this.cursorBlink = this.options.cursorBlink;\n  this.screenKeys = this.options.screenKeys;\n\n  this.style = this.style || {};\n  this.style.bg = this.style.bg || 'default';\n  this.style.fg = this.style.fg || 'default';\n\n  this.termName = options.terminal\n    || options.term\n    || process.env.TERM\n    || 'xterm';\n\n  this.bootstrap();\n}\n\nTerminal.prototype.__proto__ = Box.prototype;\n\nTerminal.prototype.type = 'terminal';\n\nTerminal.prototype.bootstrap = function() {\n  var self = this;\n\n  var element = {\n    // window\n    get document() { return element; },\n    navigator: { userAgent: 'node.js' },\n\n    // document\n    get defaultView() { return element; },\n    get documentElement() { return element; },\n    createElement: function() { return element; },\n\n    // element\n    get ownerDocument() { return element; },\n    addEventListener: function() {},\n    removeEventListener: function() {},\n    getElementsByTagName: function() { return [element]; },\n    getElementById: function() { return element; },\n    parentNode: null,\n    offsetParent: null,\n    appendChild: function() {},\n    removeChild: function() {},\n    setAttribute: function() {},\n    getAttribute: function() {},\n    style: {},\n    focus: function() {},\n    blur: function() {},\n    console: console\n  };\n\n  element.parentNode = element;\n  element.offsetParent = element;\n\n  this.term = require('term.js')({\n    termName: this.termName,\n    cols: this.width - this.iwidth,\n    rows: this.height - this.iheight,\n    context: element,\n    document: element,\n    body: element,\n    parent: element,\n    cursorBlink: this.cursorBlink,\n    screenKeys: this.screenKeys\n  });\n\n  this.term.refresh = function() {\n    self.screen.render();\n  };\n\n  this.term.keyDown = function() {};\n  this.term.keyPress = function() {};\n\n  this.term.open(element);\n\n  // Emits key sequences in html-land.\n  // Technically not necessary here.\n  // In reality if we wanted to be neat, we would overwrite the keyDown and\n  // keyPress methods with our own node.js-keys->terminal-keys methods, but\n  // since all the keys are already coming in as escape sequences, we can just\n  // send the input directly to the handler/socket (see below).\n  // this.term.on('data', function(data) {\n  //   self.handler(data);\n  // });\n\n  // Incoming keys and mouse inputs.\n  // NOTE: Cannot pass mouse events - coordinates will be off!\n  this.screen.program.input.on('data', this._onData = function(data) {\n    if (self.screen.focused === self && !self._isMouse(data)) {\n      self.handler(data);\n    }\n  });\n\n  this.onScreenEvent('mouse', function(data) {\n    if (self.screen.focused !== self) return;\n\n    if (data.x < self.aleft + self.ileft) return;\n    if (data.y < self.atop + self.itop) return;\n    if (data.x > self.aleft - self.ileft + self.width) return;\n    if (data.y > self.atop - self.itop + self.height) return;\n\n    if (self.term.x10Mouse\n        || self.term.vt200Mouse\n        || self.term.normalMouse\n        || self.term.mouseEvents\n        || self.term.utfMouse\n        || self.term.sgrMouse\n        || self.term.urxvtMouse) {\n      ;\n    } else {\n      return;\n    }\n\n    var b = data.raw[0]\n      , x = data.x - self.aleft\n      , y = data.y - self.atop\n      , s;\n\n    if (self.term.urxvtMouse) {\n      if (self.screen.program.sgrMouse) {\n        b += 32;\n      }\n      s = '\\x1b[' + b + ';' + (x + 32) + ';' + (y + 32) + 'M';\n    } else if (self.term.sgrMouse) {\n      if (!self.screen.program.sgrMouse) {\n        b -= 32;\n      }\n      s = '\\x1b[<' + b + ';' + x + ';' + y\n        + (data.action === 'mousedown' ? 'M' : 'm');\n    } else {\n      if (self.screen.program.sgrMouse) {\n        b += 32;\n      }\n      s = '\\x1b[M'\n        + String.fromCharCode(b)\n        + String.fromCharCode(x + 32)\n        + String.fromCharCode(y + 32);\n    }\n\n    self.handler(s);\n  });\n\n  this.on('focus', function() {\n    self.term.focus();\n  });\n\n  this.on('blur', function() {\n    self.term.blur();\n  });\n\n  this.term.on('title', function(title) {\n    self.title = title;\n    self.emit('title', title);\n  });\n\n  this.term.on('passthrough', function(data) {\n    self.screen.program.flush();\n    self.screen.program._owrite(data);\n  });\n\n  this.on('resize', function() {\n    nextTick(function() {\n      self.term.resize(self.width - self.iwidth, self.height - self.iheight);\n    });\n  });\n\n  this.once('render', function() {\n    self.term.resize(self.width - self.iwidth, self.height - self.iheight);\n  });\n\n  this.on('destroy', function() {\n    self.kill();\n    self.screen.program.input.removeListener('data', self._onData);\n  });\n\n  if (this.handler) {\n    return;\n  }\n\n  this.pty = require('pty.js').fork(this.shell, this.args, {\n    name: this.termName,\n    cols: this.width - this.iwidth,\n    rows: this.height - this.iheight,\n    cwd: process.env.HOME,\n    env: this.options.env || process.env\n  });\n\n  this.on('resize', function() {\n    nextTick(function() {\n      try {\n        self.pty.resize(self.width - self.iwidth, self.height - self.iheight);\n      } catch (e) {\n        ;\n      }\n    });\n  });\n\n  this.handler = function(data) {\n    self.pty.write(data);\n    self.screen.render();\n  };\n\n  this.pty.on('data', function(data) {\n    self.write(data);\n    self.screen.render();\n  });\n\n  this.pty.on('exit', function(code) {\n    self.emit('exit', code || null);\n  });\n\n  this.onScreenEvent('keypress', function() {\n    self.screen.render();\n  });\n\n  this.screen._listenKeys(this);\n};\n\nTerminal.prototype.write = function(data) {\n  return this.term.write(data);\n};\n\nTerminal.prototype.render = function() {\n  var ret = this._render();\n  if (!ret) return;\n\n  this.dattr = this.sattr(this.style);\n\n  var xi = ret.xi + this.ileft\n    , xl = ret.xl - this.iright\n    , yi = ret.yi + this.itop\n    , yl = ret.yl - this.ibottom\n    , cursor;\n\n  var scrollback = this.term.lines.length - (yl - yi);\n\n  for (var y = Math.max(yi, 0); y < yl; y++) {\n    var line = this.screen.lines[y];\n    if (!line || !this.term.lines[scrollback + y - yi]) break;\n\n    if (y === yi + this.term.y\n        && this.term.cursorState\n        && this.screen.focused === this\n        && (this.term.ydisp === this.term.ybase || this.term.selectMode)\n        && !this.term.cursorHidden) {\n      cursor = xi + this.term.x;\n    } else {\n      cursor = -1;\n    }\n\n    for (var x = Math.max(xi, 0); x < xl; x++) {\n      if (!line[x] || !this.term.lines[scrollback + y - yi][x - xi]) break;\n\n      line[x][0] = this.term.lines[scrollback + y - yi][x - xi][0];\n\n      if (x === cursor) {\n        if (this.cursor === 'line') {\n          line[x][0] = this.dattr;\n          line[x][1] = '\\u2502';\n          continue;\n        } else if (this.cursor === 'underline') {\n          line[x][0] = this.dattr | (2 << 18);\n        } else if (this.cursor === 'block' || !this.cursor) {\n          line[x][0] = this.dattr | (8 << 18);\n        }\n      }\n\n      line[x][1] = this.term.lines[scrollback + y - yi][x - xi][1];\n\n      // default foreground = 257\n      if (((line[x][0] >> 9) & 0x1ff) === 257) {\n        line[x][0] &= ~(0x1ff << 9);\n        line[x][0] |= ((this.dattr >> 9) & 0x1ff) << 9;\n      }\n\n      // default background = 256\n      if ((line[x][0] & 0x1ff) === 256) {\n        line[x][0] &= ~0x1ff;\n        line[x][0] |= this.dattr & 0x1ff;\n      }\n    }\n\n    line.dirty = true;\n  }\n\n  return ret;\n};\n\nTerminal.prototype._isMouse = function(buf) {\n  var s = buf;\n  if (Buffer.isBuffer(s)) {\n    if (s[0] > 127 && s[1] === undefined) {\n      s[0] -= 128;\n      s = '\\x1b' + s.toString('utf-8');\n    } else {\n      s = s.toString('utf-8');\n    }\n  }\n  return (buf[0] === 0x1b && buf[1] === 0x5b && buf[2] === 0x4d)\n    || /^\\x1b\\[M([\\x00\\u0020-\\uffff]{3})/.test(s)\n    || /^\\x1b\\[(\\d+;\\d+;\\d+)M/.test(s)\n    || /^\\x1b\\[<(\\d+;\\d+;\\d+)([mM])/.test(s)\n    || /^\\x1b\\[<(\\d+;\\d+;\\d+;\\d+)&w/.test(s)\n    || /^\\x1b\\[24([0135])~\\[(\\d+),(\\d+)\\]\\r/.test(s)\n    || /^\\x1b\\[(O|I)/.test(s);\n};\n\nTerminal.prototype.setScroll =\nTerminal.prototype.scrollTo = function(offset) {\n  this.term.ydisp = offset;\n  return this.emit('scroll');\n};\n\nTerminal.prototype.getScroll = function() {\n  return this.term.ydisp;\n};\n\nTerminal.prototype.scroll = function(offset) {\n  this.term.scrollDisp(offset);\n  return this.emit('scroll');\n};\n\nTerminal.prototype.resetScroll = function() {\n  this.term.ydisp = 0;\n  this.term.ybase = 0;\n  return this.emit('scroll');\n};\n\nTerminal.prototype.getScrollHeight = function() {\n  return this.term.rows - 1;\n};\n\nTerminal.prototype.getScrollPerc = function() {\n  return (this.term.ydisp / this.term.ybase) * 100;\n};\n\nTerminal.prototype.setScrollPerc = function(i) {\n  return this.setScroll((i / 100) * this.term.ybase | 0);\n};\n\nTerminal.prototype.screenshot = function(xi, xl, yi, yl) {\n  xi = 0 + (xi || 0);\n  if (xl != null) {\n    xl = 0 + (xl || 0);\n  } else {\n    xl = this.term.lines[0].length;\n  }\n  yi = 0 + (yi || 0);\n  if (yl != null) {\n    yl = 0 + (yl || 0);\n  } else {\n    yl = this.term.lines.length;\n  }\n  return this.screen.screenshot(xi, xl, yi, yl, this.term);\n};\n\nTerminal.prototype.kill = function() {\n  if (this.pty) {\n    this.pty.destroy();\n    this.pty.kill();\n  }\n  this.term.refresh = function() {};\n  this.term.write('\\x1b[H\\x1b[J');\n  if (this.term._blink) {\n    clearInterval(this.term._blink);\n  }\n  this.term.destroy();\n};\n\n/**\n * Expose\n */\n\nmodule.exports = Terminal;\n"
  },
  {
    "path": "lib/widgets/text.js",
    "content": "/**\n * text.js - text element for blessed\n * Copyright (c) 2013-2015, Christopher Jeffrey and contributors (MIT License).\n * https://github.com/chjj/blessed\n */\n\n/**\n * Modules\n */\n\nvar Node = require('./node');\nvar Element = require('./element');\n\n/**\n * Text\n */\n\nfunction Text(options) {\n  if (!(this instanceof Node)) {\n    return new Text(options);\n  }\n  options = options || {};\n  options.shrink = true;\n  Element.call(this, options);\n}\n\nText.prototype.__proto__ = Element.prototype;\n\nText.prototype.type = 'text';\n\n/**\n * Expose\n */\n\nmodule.exports = Text;\n"
  },
  {
    "path": "lib/widgets/textarea.js",
    "content": "/**\n * textarea.js - textarea element for blessed\n * Copyright (c) 2013-2015, Christopher Jeffrey and contributors (MIT License).\n * https://github.com/chjj/blessed\n */\n\n/**\n * Modules\n */\n\nvar unicode = require('../unicode');\n\nvar nextTick = global.setImmediate || process.nextTick.bind(process);\n\nvar Node = require('./node');\nvar Input = require('./input');\n\n/**\n * Textarea\n */\n\nfunction Textarea(options) {\n  var self = this;\n\n  if (!(this instanceof Node)) {\n    return new Textarea(options);\n  }\n\n  options = options || {};\n\n  options.scrollable = options.scrollable !== false;\n\n  Input.call(this, options);\n\n  this.screen._listenKeys(this);\n\n  this.value = options.value || '';\n\n  this.__updateCursor = this._updateCursor.bind(this);\n  this.on('resize', this.__updateCursor);\n  this.on('move', this.__updateCursor);\n\n  if (options.inputOnFocus) {\n    this.on('focus', this.readInput.bind(this, null));\n  }\n\n  if (!options.inputOnFocus && options.keys) {\n    this.on('keypress', function(ch, key) {\n      if (self._reading) return;\n      if (key.name === 'enter' || (options.vi && key.name === 'i')) {\n        return self.readInput();\n      }\n      if (key.name === 'e') {\n        return self.readEditor();\n      }\n    });\n  }\n\n  if (options.mouse) {\n    this.on('click', function(data) {\n      if (self._reading) return;\n      if (data.button !== 'right') return;\n      self.readEditor();\n    });\n  }\n}\n\nTextarea.prototype.__proto__ = Input.prototype;\n\nTextarea.prototype.type = 'textarea';\n\nTextarea.prototype._updateCursor = function(get) {\n  if (this.screen.focused !== this) {\n    return;\n  }\n\n  var lpos = get ? this.lpos : this._getCoords();\n  if (!lpos) return;\n\n  var last = this._clines[this._clines.length - 1]\n    , program = this.screen.program\n    , line\n    , cx\n    , cy;\n\n  // Stop a situation where the textarea begins scrolling\n  // and the last cline appears to always be empty from the\n  // _typeScroll `+ '\\n'` thing.\n  // Maybe not necessary anymore?\n  if (last === '' && this.value[this.value.length - 1] !== '\\n') {\n    last = this._clines[this._clines.length - 2] || '';\n  }\n\n  line = Math.min(\n    this._clines.length - 1 - (this.childBase || 0),\n    (lpos.yl - lpos.yi) - this.iheight - 1);\n\n  // When calling clearValue() on a full textarea with a border, the first\n  // argument in the above Math.min call ends up being -2. Make sure we stay\n  // positive.\n  line = Math.max(0, line);\n\n  cy = lpos.yi + this.itop + line;\n  cx = lpos.xi + this.ileft + this.strWidth(last);\n\n  // XXX Not sure, but this may still sometimes\n  // cause problems when leaving editor.\n  if (cy === program.y && cx === program.x) {\n    return;\n  }\n\n  if (cy === program.y) {\n    if (cx > program.x) {\n      program.cuf(cx - program.x);\n    } else if (cx < program.x) {\n      program.cub(program.x - cx);\n    }\n  } else if (cx === program.x) {\n    if (cy > program.y) {\n      program.cud(cy - program.y);\n    } else if (cy < program.y) {\n      program.cuu(program.y - cy);\n    }\n  } else {\n    program.cup(cy, cx);\n  }\n};\n\nTextarea.prototype.input =\nTextarea.prototype.setInput =\nTextarea.prototype.readInput = function(callback) {\n  var self = this\n    , focused = this.screen.focused === this;\n\n  if (this._reading) return;\n  this._reading = true;\n\n  this._callback = callback;\n\n  if (!focused) {\n    this.screen.saveFocus();\n    this.focus();\n  }\n\n  this.screen.grabKeys = true;\n\n  this._updateCursor();\n  this.screen.program.showCursor();\n  //this.screen.program.sgr('normal');\n\n  this._done = function fn(err, value) {\n    if (!self._reading) return;\n\n    if (fn.done) return;\n    fn.done = true;\n\n    self._reading = false;\n\n    delete self._callback;\n    delete self._done;\n\n    self.removeListener('keypress', self.__listener);\n    delete self.__listener;\n\n    self.removeListener('blur', self.__done);\n    delete self.__done;\n\n    self.screen.program.hideCursor();\n    self.screen.grabKeys = false;\n\n    if (!focused) {\n      self.screen.restoreFocus();\n    }\n\n    if (self.options.inputOnFocus) {\n      self.screen.rewindFocus();\n    }\n\n    // Ugly\n    if (err === 'stop') return;\n\n    if (err) {\n      self.emit('error', err);\n    } else if (value != null) {\n      self.emit('submit', value);\n    } else {\n      self.emit('cancel', value);\n    }\n    self.emit('action', value);\n\n    if (!callback) return;\n\n    return err\n      ? callback(err)\n      : callback(null, value);\n  };\n\n  // Put this in a nextTick so the current\n  // key event doesn't trigger any keys input.\n  nextTick(function() {\n    self.__listener = self._listener.bind(self);\n    self.on('keypress', self.__listener);\n  });\n\n  this.__done = this._done.bind(this, null, null);\n  this.on('blur', this.__done);\n};\n\nTextarea.prototype._listener = function(ch, key) {\n  var done = this._done\n    , value = this.value;\n\n  if (key.name === 'return') return;\n  if (key.name === 'enter') {\n    ch = '\\n';\n  }\n\n  // TODO: Handle directional keys.\n  if (key.name === 'left' || key.name === 'right'\n      || key.name === 'up' || key.name === 'down') {\n    ;\n  }\n\n  if (this.options.keys && key.ctrl && key.name === 'e') {\n    return this.readEditor();\n  }\n\n  // TODO: Optimize typing by writing directly\n  // to the screen and screen buffer here.\n  if (key.name === 'escape') {\n    done(null, null);\n  } else if (key.name === 'backspace') {\n    if (this.value.length) {\n      if (this.screen.fullUnicode) {\n        if (unicode.isSurrogate(this.value, this.value.length - 2)) {\n        // || unicode.isCombining(this.value, this.value.length - 1)) {\n          this.value = this.value.slice(0, -2);\n        } else {\n          this.value = this.value.slice(0, -1);\n        }\n      } else {\n        this.value = this.value.slice(0, -1);\n      }\n    }\n  } else if (ch) {\n    if (!/^[\\x00-\\x08\\x0b-\\x0c\\x0e-\\x1f\\x7f]$/.test(ch)) {\n      this.value += ch;\n    }\n  }\n\n  if (this.value !== value) {\n    this.screen.render();\n  }\n};\n\nTextarea.prototype._typeScroll = function() {\n  // XXX Workaround\n  var height = this.height - this.iheight;\n  if (this._clines.length - this.childBase > height) {\n    this.scroll(this._clines.length);\n  }\n};\n\nTextarea.prototype.getValue = function() {\n  return this.value;\n};\n\nTextarea.prototype.setValue = function(value) {\n  if (value == null) {\n    value = this.value;\n  }\n  if (this._value !== value) {\n    this.value = value;\n    this._value = value;\n    this.setContent(this.value);\n    this._typeScroll();\n    this._updateCursor();\n  }\n};\n\nTextarea.prototype.clearInput =\nTextarea.prototype.clearValue = function() {\n  return this.setValue('');\n};\n\nTextarea.prototype.submit = function() {\n  if (!this.__listener) return;\n  return this.__listener('\\x1b', { name: 'escape' });\n};\n\nTextarea.prototype.cancel = function() {\n  if (!this.__listener) return;\n  return this.__listener('\\x1b', { name: 'escape' });\n};\n\nTextarea.prototype.render = function() {\n  this.setValue();\n  return this._render();\n};\n\nTextarea.prototype.editor =\nTextarea.prototype.setEditor =\nTextarea.prototype.readEditor = function(callback) {\n  var self = this;\n\n  if (this._reading) {\n    var _cb = this._callback\n      , cb = callback;\n\n    this._done('stop');\n\n    callback = function(err, value) {\n      if (_cb) _cb(err, value);\n      if (cb) cb(err, value);\n    };\n  }\n\n  if (!callback) {\n    callback = function() {};\n  }\n\n  return this.screen.readEditor({ value: this.value }, function(err, value) {\n    if (err) {\n      if (err.message === 'Unsuccessful.') {\n        self.screen.render();\n        return self.readInput(callback);\n      }\n      self.screen.render();\n      self.readInput(callback);\n      return callback(err);\n    }\n    self.setValue(value);\n    self.screen.render();\n    return self.readInput(callback);\n  });\n};\n\n/**\n * Expose\n */\n\nmodule.exports = Textarea;\n"
  },
  {
    "path": "lib/widgets/textbox.js",
    "content": "/**\n * textbox.js - textbox element for blessed\n * Copyright (c) 2013-2015, Christopher Jeffrey and contributors (MIT License).\n * https://github.com/chjj/blessed\n */\n\n/**\n * Modules\n */\n\nvar Node = require('./node');\nvar Textarea = require('./textarea');\n\n/**\n * Textbox\n */\n\nfunction Textbox(options) {\n  if (!(this instanceof Node)) {\n    return new Textbox(options);\n  }\n\n  options = options || {};\n\n  options.scrollable = false;\n\n  Textarea.call(this, options);\n\n  this.secret = options.secret;\n  this.censor = options.censor;\n}\n\nTextbox.prototype.__proto__ = Textarea.prototype;\n\nTextbox.prototype.type = 'textbox';\n\nTextbox.prototype.__olistener = Textbox.prototype._listener;\nTextbox.prototype._listener = function(ch, key) {\n  if (key.name === 'enter') {\n    this._done(null, this.value);\n    return;\n  }\n  return this.__olistener(ch, key);\n};\n\nTextbox.prototype.setValue = function(value) {\n  var visible, val;\n  if (value == null) {\n    value = this.value;\n  }\n  if (this._value !== value) {\n    value = value.replace(/\\n/g, '');\n    this.value = value;\n    this._value = value;\n    if (this.secret) {\n      this.setContent('');\n    } else if (this.censor) {\n      this.setContent(Array(this.value.length + 1).join('*'));\n    } else {\n      visible = -(this.width - this.iwidth - 1);\n      val = this.value.replace(/\\t/g, this.screen.tabc);\n      this.setContent(val.slice(visible));\n    }\n    this._updateCursor();\n  }\n};\n\nTextbox.prototype.submit = function() {\n  if (!this.__listener) return;\n  return this.__listener('\\r', { name: 'enter' });\n};\n\n/**\n * Expose\n */\n\nmodule.exports = Textbox;\n"
  },
  {
    "path": "lib/widgets/video.js",
    "content": "/**\n * video.js - video element for blessed\n * Copyright (c) 2013-2015, Christopher Jeffrey and contributors (MIT License).\n * https://github.com/chjj/blessed\n */\n\n/**\n * Modules\n */\n\nvar cp = require('child_process');\n\nvar Node = require('./node');\nvar Box = require('./box');\nvar Terminal = require('./terminal');\n\n/**\n * Video\n */\n\nfunction Video(options) {\n  var self = this\n    , shell\n    , args;\n\n  if (!(this instanceof Node)) {\n    return new Video(options);\n  }\n\n  options = options || {};\n\n  Box.call(this, options);\n\n  if (this.exists('mplayer')) {\n    shell = 'mplayer';\n    args = ['-vo', 'caca', '-quiet', options.file];\n  } else if (this.exists('mpv')) {\n    shell = 'mpv';\n    args = ['--vo', 'caca', '--really-quiet', options.file];\n  } else {\n    this.parseTags = true;\n    this.setContent('{red-fg}{bold}Error:{/bold}'\n      + ' mplayer or mpv not installed.{/red-fg}');\n    return this;\n  }\n\n  var opts = {\n    parent: this,\n    left: 0,\n    top: 0,\n    width: this.width - this.iwidth,\n    height: this.height - this.iheight,\n    shell: shell,\n    args: args.slice()\n  };\n\n  this.now = Date.now() / 1000 | 0;\n  this.start = opts.start || 0;\n  if (this.start) {\n    if (shell === 'mplayer') {\n      opts.args.unshift('-ss', this.start + '');\n    } else if (shell === 'mpv') {\n      opts.args.unshift('--start', this.start + '');\n    }\n  }\n\n  var DISPLAY = process.env.DISPLAY;\n  delete process.env.DISPLAY;\n  this.tty = new Terminal(opts);\n  process.env.DISPLAY = DISPLAY;\n\n  this.on('click', function() {\n    self.tty.pty.write('p');\n  });\n\n  // mplayer/mpv cannot resize itself in the terminal, so we have\n  // to restart it at the correct start time.\n  this.on('resize', function() {\n    self.tty.destroy();\n\n    var opts = {\n      parent: self,\n      left: 0,\n      top: 0,\n      width: self.width - self.iwidth,\n      height: self.height - self.iheight,\n      shell: shell,\n      args: args.slice()\n    };\n\n    var watched = (Date.now() / 1000 | 0) - self.now;\n    self.now = Date.now() / 1000 | 0;\n    self.start += watched;\n    if (shell === 'mplayer') {\n      opts.args.unshift('-ss', self.start + '');\n    } else if (shell === 'mpv') {\n      opts.args.unshift('--start', self.start + '');\n    }\n\n    var DISPLAY = process.env.DISPLAY;\n    delete process.env.DISPLAY;\n    self.tty = new Terminal(opts);\n    process.env.DISPLAY = DISPLAY;\n    self.screen.render();\n  });\n}\n\nVideo.prototype.__proto__ = Box.prototype;\n\nVideo.prototype.type = 'video';\n\nVideo.prototype.exists = function(program) {\n  try {\n    return !!+cp.execSync('type '\n      + program + ' > /dev/null 2> /dev/null'\n      + ' && echo 1', { encoding: 'utf8' }).trim();\n  } catch (e) {\n    return false;\n  }\n};\n\n/**\n * Expose\n */\n\nmodule.exports = Video;\n"
  },
  {
    "path": "package.json",
    "content": "{\n  \"name\": \"blessed\",\n  \"description\": \"A high-level terminal interface library for node.js.\",\n  \"author\": \"Christopher Jeffrey\",\n  \"version\": \"0.1.81\",\n  \"license\": \"MIT\",\n  \"main\": \"./lib/blessed.js\",\n  \"bin\": \"./bin/tput.js\",\n  \"preferGlobal\": false,\n  \"repository\": \"git://github.com/chjj/blessed.git\",\n  \"homepage\": \"https://github.com/chjj/blessed\",\n  \"bugs\": { \"url\": \"http://github.com/chjj/blessed/issues\" },\n  \"keywords\": [\"curses\", \"tui\", \"tput\", \"terminfo\", \"termcap\"],\n  \"tags\": [\"curses\", \"tui\", \"tput\", \"terminfo\", \"termcap\"],\n  \"engines\": {\n    \"node\": \">= 0.8.0\"\n  },\n  \"browserify\": {\n    \"transform\": [\"./browser/transform.js\"]\n  }\n}\n"
  },
  {
    "path": "test/git.diff",
    "content": "\u001b[1mdiff --git a/lib/widget.js b/lib/widget.js\u001b[m\n\u001b[1mindex 8785046..4bfefd3 100644\u001b[m\n\u001b[1m--- a/lib/widget.js\u001b[m\n\u001b[1m+++ b/lib/widget.js\u001b[m\n\u001b[36m@@ -511,6 +511,9 @@\u001b[m \u001b[mElement.prototype.__defineGetter__('left', function() {\u001b[m\n });\u001b[m\n \u001b[m\n Element.prototype.__defineGetter__('right', function() {\u001b[m\n\u001b[32m+\u001b[m\u001b[32m  //if (this.options.right == null && this.options.left != null) {\u001b[m\n\u001b[32m+\u001b[m\u001b[32m  //  return this.screen.cols - (this.left + this.width);\u001b[m\n\u001b[32m+\u001b[m\u001b[32m  //}\u001b[m\n   return (this.parent.right || 0) + this.position.right;\u001b[m\n });\u001b[m\n \u001b[m\n\u001b[36m@@ -532,6 +535,9 @@\u001b[m \u001b[mElement.prototype.__defineGetter__('top', function() {\u001b[m\n });\u001b[m\n \u001b[m\n Element.prototype.__defineGetter__('bottom', function() {\u001b[m\n\u001b[32m+\u001b[m\u001b[32m  //if (this.options.bottom == null && this.options.top != null) {\u001b[m\n\u001b[32m+\u001b[m\u001b[32m  //  return this.screen.rows - (this.top + this.height);\u001b[m\n\u001b[32m+\u001b[m\u001b[32m  //}\u001b[m\n   return (this.parent.bottom || 0) + this.position.bottom;\u001b[m\n });\u001b[m\n \u001b[m\n\u001b[36m@@ -671,7 +677,20 @@\u001b[m \u001b[mBox.prototype.render = function(stop) {\u001b[m\n     var cb = this.childBase\u001b[m\n       , xxl = xl - (this.border ? 1 : 0)\u001b[m\n       , xxi;\u001b[m\n\u001b[31m-    while (cb--) for (xxi = xi + (this.border ? 1 : 0); xxi < xxl; xxi++) ci++;\u001b[m\n\u001b[32m+\u001b[m\u001b[32m    while (cb--) {\u001b[m\n\u001b[32m+\u001b[m\u001b[32m      for (xxi = xi + (this.border ? 1 : 0); xxi < xxl; xxi++) {\u001b[m\n\u001b[32m+\u001b[m\u001b[32m        if (this.content[ci] === '\\n' || this.content[ci] === '\\r') {\u001b[m\n\u001b[32m+\u001b[m\u001b[32m          ci++;\u001b[m\n\u001b[32m+\u001b[m\u001b[32m          if (!cb) break;\u001b[m\n\u001b[32m+\u001b[m\u001b[32m          cb--;\u001b[m\n\u001b[32m+\u001b[m\u001b[32m        } else if (this.content[ci] === '\\x1b') {\u001b[m\n\u001b[32m+\u001b[m\u001b[32m          for (; ci < this.content.length; ci++) {\u001b[m\n\u001b[32m+\u001b[m\u001b[32m            if (this.content[ci] === 'm') break;\u001b[m\n\u001b[32m+\u001b[m\u001b[32m          }\u001b[m\n\u001b[32m+\u001b[m\u001b[32m        }\u001b[m\n\u001b[32m+\u001b[m\u001b[32m        ci++;\u001b[m\n\u001b[32m+\u001b[m\u001b[32m      }\u001b[m\n\u001b[32m+\u001b[m\u001b[32m    }\u001b[m\n   }\u001b[m\n \u001b[m\n   var ret = {\u001b[m\n\u001b[36m@@ -683,6 +702,8 @@\u001b[m \u001b[mBox.prototype.render = function(stop) {\u001b[m\n \u001b[m\n   if (stop) return ret;\u001b[m\n \u001b[m\n\u001b[32m+\u001b[m\u001b[32m  var lastEscape, hasEscapes, c;\u001b[m\n\u001b[32m+\u001b[m\n   for (; yi < yl; yi++) {\u001b[m\n     if (!lines[yi]) break;\u001b[m\n     for (xi = this.left; xi < xl; xi++) {\u001b[m\n\u001b[36m@@ -708,22 +729,52 @@\u001b[m \u001b[mBox.prototype.render = function(stop) {\u001b[m\n       } else {\u001b[m\n         attr = ((this.bold << 18) + (this.underline << 18)) | (this.fg << 9) | this.bg;\u001b[m\n         ch = this.content[ci++] || ' ';\u001b[m\n\u001b[32m+\u001b[m\n\u001b[32m+\u001b[m\u001b[32m        // Handle escape codes.\u001b[m\n\u001b[32m+\u001b[m\u001b[32m        // NOTE: We could also change around `attr`, that might be cleaner.\u001b[m\n\u001b[32m+\u001b[m\u001b[32m        // NOTE: Currently, this will not work with newline handling.\u001b[m\n\u001b[32m+\u001b[m\u001b[32m        if (lastEscape) {\u001b[m\n\u001b[32m+\u001b[m\u001b[32m          ch = lastEscape + ch;\u001b[m\n\u001b[32m+\u001b[m\u001b[32m          lastEscape = '';\u001b[m\n\u001b[32m+\u001b[m\u001b[32m        }\u001b[m\n\u001b[32m+\u001b[m\u001b[32m        if (ch === '\\x1b') {\u001b[m\n\u001b[32m+\u001b[m\u001b[32m          hasEscapes = true;\u001b[m\n\u001b[32m+\u001b[m\u001b[32m          if (c = /^\\x1b\\[\\d+(?:;\\d+)*m/.exec(this.content.substring(ci - 1))) {\u001b[m\n\u001b[32m+\u001b[m\u001b[32m            ci += c[0].length - 1;\u001b[m\n\u001b[32m+\u001b[m\u001b[32m            if (!this.content[c[0].length]) {\u001b[m\n\u001b[32m+\u001b[m\u001b[32m              // Problem: No character to put here\u001b[m\n\u001b[32m+\u001b[m\u001b[32m              // needs to wrap around below.\u001b[m\n\u001b[32m+\u001b[m\u001b[32m              lastEscape = c[0];\u001b[m\n\u001b[32m+\u001b[m\u001b[32m              ch = ' ';\u001b[m\n\u001b[32m+\u001b[m\u001b[32m            } else {\u001b[m\n\u001b[32m+\u001b[m\u001b[32m              ch = c[0] + this.content[ci];\u001b[m\n\u001b[32m+\u001b[m\u001b[32m            }\u001b[m\n\u001b[32m+\u001b[m\u001b[32m            ci++;\u001b[m\n\u001b[32m+\u001b[m\u001b[32m          }\u001b[m\n\u001b[32m+\u001b[m\u001b[32m        }\u001b[m\n\u001b[32m+\u001b[m\u001b[32m        if (hasEscapes && xi === xl - 1) {\u001b[m\n\u001b[32m+\u001b[m\u001b[32m          ch += '\\x1b[m';\u001b[m\n\u001b[32m+\u001b[m\u001b[32m        }\u001b[m\n       }\u001b[m\n \u001b[m\n\u001b[31m-      // TODO: Allow newlines.\u001b[m\n\u001b[31m-      //if (ch === '\\n' || ch === '\\r') {\u001b[m\n\u001b[31m-      //  ch = ' ';\u001b[m\n\u001b[31m-      //  xl = xl - 1 - (this.border ? 1 : 0);\u001b[m\n\u001b[31m-      //  for (; xi < xl; xi++) {\u001b[m\n\u001b[31m-      //    cell = lines[yi][xi];\u001b[m\n\u001b[31m-      //    if (!cell) break;\u001b[m\n\u001b[31m-      //    if (attr !== cell[0] || ch !== cell[1]) {\u001b[m\n\u001b[31m-      //      lines[yi][xi][0] = attr;\u001b[m\n\u001b[31m-      //      lines[yi][xi][1] = ch;\u001b[m\n\u001b[31m-      //      lines[yi].dirty = true;\u001b[m\n\u001b[31m-      //    }\u001b[m\n\u001b[31m-      //  }\u001b[m\n\u001b[31m-      //}\u001b[m\n\u001b[32m+\u001b[m\u001b[32m      // Handle newlines.\u001b[m\n\u001b[32m+\u001b[m\u001b[32m      if (ch === '\\n' || ch === '\\r') {\u001b[m\n\u001b[32m+\u001b[m\u001b[32m        ch = ' ';\u001b[m\n\u001b[32m+\u001b[m\u001b[32m        if (hasEscapes) ch += '\\x1b[m';\u001b[m\n\u001b[32m+\u001b[m\u001b[32m        var xxl = xl - (this.border ? 1 : 0);\u001b[m\n\u001b[32m+\u001b[m\u001b[32m        for (; xi < xxl; xi++) {\u001b[m\n\u001b[32m+\u001b[m\u001b[32m          attr = ((this.bold << 18) + (this.underline << 18)) | (this.fg << 9) | this.bg;\u001b[m\n\u001b[32m+\u001b[m\u001b[32m          cell = lines[yi][xi];\u001b[m\n\u001b[32m+\u001b[m\u001b[32m          if (!cell) break;\u001b[m\n\u001b[32m+\u001b[m\u001b[32m          if (attr !== cell[0] || ch !== cell[1]) {\u001b[m\n\u001b[32m+\u001b[m\u001b[32m            lines[yi][xi][0] = attr;\u001b[m\n\u001b[32m+\u001b[m\u001b[32m            lines[yi][xi][1] = ch;\u001b[m\n\u001b[32m+\u001b[m\u001b[32m            lines[yi].dirty = true;\u001b[m\n\u001b[32m+\u001b[m\u001b[32m          }\u001b[m\n\u001b[32m+\u001b[m\u001b[32m        }\u001b[m\n\u001b[32m+\u001b[m\u001b[32m        if (this.border) xi--;\u001b[m\n\u001b[32m+\u001b[m\u001b[32m        continue;\u001b[m\n\u001b[32m+\u001b[m\u001b[32m      }\u001b[m\n \u001b[m\n       if (attr !== cell[0] || ch !== cell[1]) {\u001b[m\n         lines[yi][xi][0] = attr;\u001b[m\n\u001b[36m@@ -958,6 +1009,7 @@\u001b[m \u001b[mList.prototype.__proto__ = ScrollableBox.prototype;\u001b[m\n List.prototype.add = function(item) {\u001b[m\n   var self = this;\u001b[m\n \u001b[m\n\u001b[32m+\u001b[m\u001b[32m  // TODO: Use box here and get rid of text.\u001b[m\n   var item = new Text({\u001b[m\n     screen: this.screen,\u001b[m\n     parent: this,\u001b[m\n\u001b[1mdiff --git a/test/widget.js b/test/widget.js\u001b[m\n\u001b[1mindex a392a0e..1e62e8c 100644\u001b[m\n\u001b[1m--- a/test/widget.js\u001b[m\n\u001b[1m+++ b/test/widget.js\u001b[m\n\u001b[36m@@ -136,7 +136,7 @@\u001b[m \u001b[mvar progress = new blessed.ProgressBar({\u001b[m\n \u001b[m\n screen.append(progress);\u001b[m\n \u001b[m\n\u001b[31m-var lorem = 'Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.';\u001b[m\n\u001b[32m+\u001b[m\u001b[32mvar lorem = 'Lorem ipsum \\x1b[41mdolor sit amet, \\nconsectetur adipisicing elit, \\x1b[43msed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.';\u001b[m\n \u001b[m\n var stext = new blessed.ScrollableText({\u001b[m\n   screen: screen,\u001b[m\n"
  },
  {
    "path": "test/helpers.js",
    "content": "var blessed = require('../'),\n    screen = blessed.screen();\n\nconsole.log(blessed.helpers.parseTags('{red-fg}This should be red.{/red-fg}'));\nconsole.log(blessed.helpers.parseTags('{green-bg}This should have a green background.{/green-bg}'));\n"
  },
  {
    "path": "test/lorem.txt",
    "content": "Non eram nescius Brute cum quae summis ingeniis exquisitaque doctrina philosophi Graeco sermone tractavissent ea Latinis litteris mandaremus fore ut hic noster labor in varias reprehensiones incurreret nam quibusdam et iis quidem non admodum indoctis totum hoc displicet philosophari quidam autem non tam id reprehendunt si remissius agatur sed tantum studium tamque multam operam ponendam in eo non arbitrantur erunt etiam et ii quidem eruditi Graecis litteris contemnentes Latinas qui se dicant in Graecis legendis operam malle consumere postremo aliquos futuros suspicor qui me ad alias litteras vocent genus hoc scribendi etsi sit elegans personae tamen et dignitatis esse negent Contra quos omnis dicendum breviter existimo Quamquam philosophiae quidem vituperatoribus satis responsum est eo libro quo a nobis philosophia defensa et collaudata est cum esset accusata et vituperata ab Hortensio qui liber cum et tibi probatus videretur et iis quos ego posse iudicare arbitrarer plura suscepi veritus ne movere hominum studia viderer retinere non posse Qui autem si maxime hoc placeat moderatius tamen id volunt fieri difficilem quandam temperantiam postulant in eo quod semel admissum coerceri reprimique non potest ut propemodum iustioribus utamur illis qui omnino avocent a philosophia quam his qui rebus infinitis modum constituant in reque eo meliore quo maior sit mediocritatem desiderent Sive enim ad sapientiam perveniri potest non paranda nobis solum ea sed fruenda etiam sapientia est sive hoc difficile est tamen nec modus est ullus investigandi veri nisi inveneris et quaerendi defatigatio turpis est cum id quod quaeritur sit pulcherrimum etenim si delectamur cum scribimus quis est tam invidus qui ab eo nos abducat sin laboramus quis est qui alienae modum statuat industriae nam ut Terentianus Chremes non inhumanus qui novum vicinum non vult fodere aut arare aut aliquid ferre denique non enim illum ab industria sed ab inliberali labore deterret sic isti curiosi quos offendit noster minime nobis iniucundus labor Iis igitur est difficilius satis facere qui se Latina scripta dicunt contemnere in quibus hoc primum est in quo admirer cur in gravissimis rebus non delectet eos sermo patrius cum idem fabellas Latinas ad verbum e Graecis expressas non inviti legant quis enim tam inimicus paene nomini Romano est qui Ennii Medeam aut Antiopam Pacuvii spernat aut reiciat quod se isdem Euripidis fabulis delectari dicat Latinas litteras oderit Quid si nos non interpretum fungimur munere sed tuemur ea quae dicta sunt ab iis quos probamus eisque nostrum iudicium et nostrum scribendi ordinem adiungimus quid habent cur Graeca anteponant iis quae et splendide dicta sint neque sint conversa de Graecis nam si dicent ab illis has res esse tractatas ne ipsos quidem Graecos est cur tam multos legant quam legendi sunt quid enim est a Chrysippo praetermissum in Stoicis legimus tamen Diogenem Antipatrum Mnesarchum Panaetium multos alios in primisque familiarem nostrum Posidonium quid Theophrastus mediocriterne delectat cum tractat locos ab Aristotele ante tractatos quid Epicurei num desistunt de isdem de quibus et ab Epicuro scriptum est et ab antiquis ad arbitrium suum scribere quodsi Graeci leguntur a Graecis isdem de rebus alia ratione compositis quid est cur nostri a nostris non legantur"
  },
  {
    "path": "test/program-mouse.js",
    "content": "#!/usr/bin/env node\n\nvar blessed = require('../')\n  , util = require('util')\n  , program;\n\nprogram = blessed.program({\n  dump: __dirname + '/logs/mouse.log'\n});\n\n// program.setMouse({\n//   allMotion: true,\n//   //utfMouse: true\n//   urxvtMouse: true\n// }, true);\n\nprogram.alternateBuffer();\nprogram.enableMouse();\nprogram.hideCursor();\n\nprogram.setMouse({ sendFocus: true }, true);\n//program._currentMouse.sendFocus = true;\n//program.enableMouse(program._currentMouse);\n//program.write('\\x1b[?1004h');\n\nprogram.on('mouse', function(data) {\n  program.cup(data.y, data.x);\n  program.write(' ', 'blue bg');\n  program.cup(0, 0);\n  program.write(util.inspect(data));\n});\n\nprogram.on('resize', function(data) {\n  setTimeout(function() {\n    program.clear();\n    program.cup(0, 0);\n    program.write(util.inspect({ cols: program.cols, rows: program.rows }));\n  }, 200);\n});\n\nprocess.on('SIGWINCH', function(data) {\n  setTimeout(function() {\n    program.cup(1, 0);\n    program.write(util.inspect({ winch: true, cols: program.cols, rows: program.rows }));\n  }, 200);\n});\n\nprogram.on('focus', function(data) {\n  program.clear();\n  program.cup(0, 0);\n  program.write('FOCUSIN');\n});\n\nprogram.on('blur', function(data) {\n  program.clear();\n  program.cup(0, 0);\n  program.write('FOCUSOUT');\n});\n\nprogram.key(['q', 'escape', 'C-c'], function() {\n  program.showCursor();\n  program.disableMouse();\n  program.normalBuffer();\n  process.exit(0);\n});\n\nprogram.on('keypress', function(ch, data) {\n  if (data.name === 'mouse') return;\n  program.clear();\n  program.cup(0, 0);\n  program.write(util.inspect(data));\n});\n\n// program.getCursor(function(err, data) {\n//   program.write(util.inspect(data));\n// });\n\n// program.manipulateWindow(18, function(err, data) {\n//   program.write(util.inspect(data));\n// });\n"
  },
  {
    "path": "test/tail.js",
    "content": "// `tail -f` a file.\nmodule.exports = function(file) {\n  var self = this\n    , fs = require('fs')\n    , StringDecoder = require('string_decoder').StringDecoder\n    , decode = new StringDecoder('utf8')\n    , buffer = new Buffer(64 * 1024)\n    , Stream = require('stream').Stream\n    , s = new Stream\n    , buff = ''\n    , pos = 0;\n\n  s.readable = true;\n  s.destroy = function() {\n    s.destroyed = true;\n    s.emit('end');\n    s.emit('close');\n  };\n\n  fs.open(file, 'a+', 0644, function(err, fd) {\n    if (err) {\n      s.emit('error', err);\n      s.destroy();\n      return;\n    }\n\n    (function read() {\n      if (s.destroyed) {\n        fs.close(fd);\n        return;\n      }\n\n      return fs.read(fd, buffer, 0, buffer.length, pos, function(err, bytes) {\n        if (err) {\n          s.emit('error', err);\n          s.destroy();\n          return;\n        }\n\n        if (!bytes) {\n          if (buff) {\n            stream.emit('line', buff);\n            buff = '';\n          }\n          return setTimeout(read, 1000);\n        }\n\n        var data = decode.write(buffer.slice(0, bytes));\n\n        s.emit('data', data);\n\n        var data = (buff + data).split(/\\n+/)\n          , l = data.length - 1\n          , i = 0;\n\n        for (; i < l; i++) {\n          s.emit('line', data[i]);\n        }\n\n        buff = data[l];\n\n        pos += bytes;\n\n        return read();\n      });\n    })();\n  });\n\n  return s;\n};\n"
  },
  {
    "path": "test/terminfo",
    "content": "{ header: \n   { dataSize: 3337,\n     headerSize: 12,\n     magicNumber: 282,\n     namesSize: 28,\n     boolCount: 38,\n     numCount: 15,\n     strCount: 413,\n     strTableSize: 1388,\n     total: 2322,\n     extended: \n      { dataSize: 1015,\n        headerSize: 10,\n        boolCount: 2,\n        numCount: 0,\n        strCount: 62,\n        strTableSize: 126,\n        lastStrTableOffset: 751,\n        total: 262 } },\n  name: 'xterm',\n  names: [ 'xterm' ],\n  desc: 'X11 terminal emulator',\n  bools: \n   { auto_left_margin: false,\n     auto_right_margin: true,\n     no_esc_ctlc: false,\n     ceol_standout_glitch: false,\n     eat_newline_glitch: true,\n     erase_overstrike: false,\n     generic_type: false,\n     hard_copy: false,\n     has_meta_key: true,\n     has_status_line: false,\n     insert_null_glitch: false,\n     memory_above: false,\n     memory_below: false,\n     move_insert_mode: true,\n     move_standout_mode: true,\n     over_strike: false,\n     status_line_esc_ok: false,\n     dest_tabs_magic_smso: false,\n     tilde_glitch: false,\n     transparent_underline: false,\n     xon_xoff: false,\n     needs_xon_xoff: false,\n     prtr_silent: true,\n     hard_cursor: false,\n     non_rev_rmcup: false,\n     no_pad_char: true,\n     non_dest_scroll_region: false,\n     can_change: false,\n     back_color_erase: true,\n     hue_lightness_saturation: false,\n     col_addr_glitch: false,\n     cr_cancels_micro_mode: false,\n     has_print_wheel: false,\n     row_addr_glitch: false,\n     semi_auto_right_margin: false,\n     cpi_changes_res: false,\n     lpi_changes_res: false,\n     backspaces_with_bs: true,\n     AX: true,\n     XT: true },\n  numbers: \n   { columns: 80,\n     init_tabs: 8,\n     lines: 24,\n     lines_of_memory: -1,\n     magic_cookie_glitch: -1,\n     padding_baud_rate: -1,\n     virtual_terminal: -1,\n     width_status_line: -1,\n     num_labels: -1,\n     label_height: -1,\n     label_width: -1,\n     max_attributes: -1,\n     maximum_windows: -1,\n     max_colors: 8,\n     max_pairs: 64 },\n  strings: \n   { back_tab: '\\u001b[Z',\n     bell: '\\u0007',\n     carriage_return: '\\r',\n     change_scroll_region: '\\u001b[%i%p1%d;%p2%dr',\n     clear_all_tabs: '\\u001b[3g',\n     clear_screen: '\\u001b[H\\u001b[2J',\n     clr_eol: '\\u001b[K',\n     clr_eos: '\\u001b[J',\n     column_address: '\\u001b[%i%p1%dG',\n     cursor_address: '\\u001b[%i%p1%d;%p2%dH',\n     cursor_down: '\\n',\n     cursor_home: '\\u001b[H',\n     cursor_invisible: '\\u001b[?25l',\n     cursor_left: '\\b',\n     cursor_normal: '\\u001b[?12l\\u001b[?25h',\n     cursor_right: '\\u001b[C',\n     cursor_up: '\\u001b[A',\n     cursor_visible: '\\u001b[?12;25h',\n     delete_character: '\\u001b[P',\n     delete_line: '\\u001b[M',\n     enter_alt_charset_mode: '\\u001b(0',\n     enter_blink_mode: '\\u001b[5m',\n     enter_bold_mode: '\\u001b[1m',\n     enter_ca_mode: '\\u001b[?1049h',\n     enter_insert_mode: '\\u001b[4h',\n     enter_secure_mode: '\\u001b[8m',\n     enter_reverse_mode: '\\u001b[7m',\n     enter_standout_mode: '\\u001b[7m',\n     enter_underline_mode: '\\u001b[4m',\n     erase_chars: '\\u001b[%p1%dX',\n     exit_alt_charset_mode: '\\u001b(B',\n     exit_attribute_mode: '\\u001b(B\\u001b[m',\n     exit_ca_mode: '\\u001b[?1049l',\n     exit_insert_mode: '\\u001b[4l',\n     exit_standout_mode: '\\u001b[27m',\n     exit_underline_mode: '\\u001b[24m',\n     flash_screen: '\\u001b[?5h$<100/>\\u001b[?5l',\n     init_2string: '\\u001b[!p\\u001b[?3;4l\\u001b[4l\\u001b>',\n     insert_line: '\\u001b[L',\n     key_backspace: '\\b',\n     key_dc: '\\u001b[3~',\n     key_down: '\\u001bOB',\n     key_f1: '\\u001bOP',\n     key_f10: '\\u001b[21~',\n     key_f2: '\\u001bOQ',\n     key_f3: '\\u001bOR',\n     key_f4: '\\u001bOS',\n     key_f5: '\\u001b[15~',\n     key_f6: '\\u001b[17~',\n     key_f7: '\\u001b[18~',\n     key_f8: '\\u001b[19~',\n     key_f9: '\\u001b[20~',\n     key_home: '\\u001bOH',\n     key_ic: '\\u001b[2~',\n     key_left: '\\u001bOD',\n     key_npage: '\\u001b[6~',\n     key_ppage: '\\u001b[5~',\n     key_right: '\\u001bOC',\n     key_sf: '\\u001b[1;2B',\n     key_sr: '\\u001b[1;2A',\n     key_up: '\\u001bOA',\n     keypad_local: '\\u001b[?1l\\u001b>',\n     keypad_xmit: '\\u001b[?1h\\u001b=',\n     meta_off: '\\u001b[?1034l',\n     meta_on: '\\u001b[?1034h',\n     parm_dch: '\\u001b[%p1%dP',\n     parm_delete_line: '\\u001b[%p1%dM',\n     parm_down_cursor: '\\u001b[%p1%dB',\n     parm_ich: '\\u001b[%p1%d@',\n     parm_index: '\\u001b[%p1%dS',\n     parm_insert_line: '\\u001b[%p1%dL',\n     parm_left_cursor: '\\u001b[%p1%dD',\n     parm_right_cursor: '\\u001b[%p1%dC',\n     parm_rindex: '\\u001b[%p1%dT',\n     parm_up_cursor: '\\u001b[%p1%dA',\n     print_screen: '\\u001b[i',\n     prtr_off: '\\u001b[4i',\n     prtr_on: '\\u001b[5i',\n     reset_1string: '\\u001bc',\n     reset_2string: '\\u001b[!p\\u001b[?3;4l\\u001b[4l\\u001b>',\n     restore_cursor: '\\u001b8',\n     row_address: '\\u001b[%i%p1%dd',\n     save_cursor: '\\u001b7',\n     scroll_forward: '\\n',\n     scroll_reverse: '\\u001bM',\n     set_attributes: '%?%p9%t\\u001b(0%e\\u001b(B%;\\u001b[0%?%p6%t;1%;%?%p2%t;4%;%?%p1%p3%|%t;7%;%?%p4%t;5%;%?%p7%t;8%;m',\n     set_tab: '\\u001bH',\n     tab: '\\t',\n     key_b2: '\\u001bOE',\n     acs_chars: '``aaffggiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~',\n     key_btab: '\\u001b[Z',\n     enter_am_mode: '\\u001b[?7h',\n     exit_am_mode: '\\u001b[?7l',\n     key_end: '\\u001bOF',\n     key_enter: '\\u001bOM',\n     key_sdc: '\\u001b[3;2~',\n     key_send: '\\u001b[1;2F',\n     key_shome: '\\u001b[1;2H',\n     key_sic: '\\u001b[2;2~',\n     key_sleft: '\\u001b[1;2D',\n     key_snext: '\\u001b[6;2~',\n     key_sprevious: '\\u001b[5;2~',\n     key_sright: '\\u001b[1;2C',\n     key_f11: '\\u001b[23~',\n     key_f12: '\\u001b[24~',\n     key_f13: '\\u001b[1;2P',\n     key_f14: '\\u001b[1;2Q',\n     key_f15: '\\u001b[1;2R',\n     key_f16: '\\u001b[1;2S',\n     key_f17: '\\u001b[15;2~',\n     key_f18: '\\u001b[17;2~',\n     key_f19: '\\u001b[18;2~',\n     key_f20: '\\u001b[19;2~',\n     key_f21: '\\u001b[20;2~',\n     key_f22: '\\u001b[21;2~',\n     key_f23: '\\u001b[23;2~',\n     key_f24: '\\u001b[24;2~',\n     key_f25: '\\u001b[1;5P',\n     key_f26: '\\u001b[1;5Q',\n     key_f27: '\\u001b[1;5R',\n     key_f28: '\\u001b[1;5S',\n     key_f29: '\\u001b[15;5~',\n     key_f30: '\\u001b[17;5~',\n     key_f31: '\\u001b[18;5~',\n     key_f32: '\\u001b[19;5~',\n     key_f33: '\\u001b[20;5~',\n     key_f34: '\\u001b[21;5~',\n     key_f35: '\\u001b[23;5~',\n     key_f36: '\\u001b[24;5~',\n     key_f37: '\\u001b[1;6P',\n     key_f38: '\\u001b[1;6Q',\n     key_f39: '\\u001b[1;6R',\n     key_f40: '\\u001b[1;6S',\n     key_f41: '\\u001b[15;6~',\n     key_f42: '\\u001b[17;6~',\n     key_f43: '\\u001b[18;6~',\n     key_f44: '\\u001b[19;6~',\n     key_f45: '\\u001b[20;6~',\n     key_f46: '\\u001b[21;6~',\n     key_f47: '\\u001b[23;6~',\n     key_f48: '\\u001b[24;6~',\n     key_f49: '\\u001b[1;3P',\n     key_f50: '\\u001b[1;3Q',\n     key_f51: '\\u001b[1;3R',\n     key_f52: '\\u001b[1;3S',\n     key_f53: '\\u001b[15;3~',\n     key_f54: '\\u001b[17;3~',\n     key_f55: '\\u001b[18;3~',\n     key_f56: '\\u001b[19;3~',\n     key_f57: '\\u001b[20;3~',\n     key_f58: '\\u001b[21;3~',\n     key_f59: '\\u001b[23;3~',\n     key_f60: '\\u001b[24;3~',\n     key_f61: '\\u001b[1;4P',\n     key_f62: '\\u001b[1;4Q',\n     key_f63: '\\u001b[1;4R',\n     clr_bol: '\\u001b[1K',\n     user6: '\\u001b[%i%d;%dR',\n     user7: '\\u001b[6n',\n     user8: '\\u001b[?1;2c',\n     user9: '\\u001b[c',\n     orig_pair: '\\u001b[39;49m',\n     set_foreground: '\\u001b[3%?%p1%{1}%=%t4%e%p1%{3}%=%t6%e%p1%{4}%=%t1%e%p1%{6}%=%t3%e%p1%d%;m',\n     set_background: '\\u001b[4%?%p1%{1}%=%t4%e%p1%{3}%=%t6%e%p1%{4}%=%t1%e%p1%{6}%=%t3%e%p1%d%;m',\n     key_mouse: '\\u001b[M',\n     set_a_foreground: '\\u001b[3%p1%dm',\n     set_a_background: '\\u001b[4%p1%dm',\n     memory_lock: '\\u001bl',\n     memory_unlock: '\\u001bm',\n     Cr: '\\u001b]112\\u0007',\n     Cs: '\\u001b]12;%p1%s\\u0007',\n     E3: '\\u001b[3;J',\n     Ms: '\\u001b]52;%p1%s;%p2%s\\u0007',\n     Se: '\\u001b[2 q',\n     Ss: '\\u001b[%p1%d q',\n     kDC3: '\\u001b[3;3~',\n     kDC4: '\\u001b[3;4~',\n     kDC5: '\\u001b[3;5~',\n     kDC6: '\\u001b[3;6~',\n     kDC7: '\\u001b[3;7~',\n     kDN: '\\u001b[1;2B',\n     kDN3: '\\u001b[1;3B',\n     kDN4: '\\u001b[1;4B',\n     kDN5: '\\u001b[1;5B',\n     kDN6: '\\u001b[1;6B',\n     kDN7: '\\u001b[1;7B',\n     kEND3: '\\u001b[1;3F',\n     kEND4: '\\u001b[1;4F',\n     kEND5: '\\u001b[1;5F',\n     kEND6: '\\u001b[1;6F',\n     kEND7: '\\u001b[1;7F',\n     kHOM3: '\\u001b[1;3H',\n     kHOM4: '\\u001b[1;4H',\n     kHOM5: '\\u001b[1;5H',\n     kHOM6: '\\u001b[1;6H',\n     kHOM7: '\\u001b[1;7H',\n     kIC3: '\\u001b[2;3~',\n     kIC4: '\\u001b[2;4~',\n     kIC5: '\\u001b[2;5~',\n     kIC6: '\\u001b[2;6~',\n     kIC7: '\\u001b[2;7~',\n     kLFT3: '\\u001b[1;3D',\n     kLFT4: '\\u001b[1;4D',\n     kLFT5: '\\u001b[1;5D',\n     kLFT6: '\\u001b[1;6D',\n     kLFT7: '\\u001b[1;7D',\n     kNXT3: '\\u001b[6;3~',\n     kNXT4: '\\u001b[6;4~',\n     kNXT5: '\\u001b[6;5~',\n     kNXT6: '\\u001b[6;6~',\n     kNXT7: '\\u001b[6;7~',\n     kPRV3: '\\u001b[5;3~',\n     kPRV4: '\\u001b[5;4~',\n     kPRV5: '\\u001b[5;5~',\n     kPRV6: '\\u001b[5;6~',\n     kPRV7: '\\u001b[5;7~',\n     kRIT3: '\\u001b[1;3C',\n     kRIT4: '\\u001b[1;4C',\n     kRIT5: '\\u001b[1;5C',\n     kRIT6: '\\u001b[1;6C',\n     kRIT7: '\\u001b[1;7C',\n     kUP: '\\u001b[1;2A',\n     kUP3: '\\u001b[1;3A',\n     kUP4: '\\u001b[1;4A',\n     kUP5: '\\u001b[1;5A',\n     kUP6: '\\u001b[1;6A',\n     kUP7: '\\u001b[1;7A',\n     ka2: '',\n     kb1: '',\n     kb3: '',\n     kc2: '' },\n  features: \n   { unicode: true,\n     brokenACS: false,\n     PCRomSet: false,\n     magicCookie: true,\n     padding: true,\n     setbuf: true,\n     acsc: \n      { '`': '◆',\n        a: '▒',\n        f: '°',\n        g: '±',\n        i: '\\u000b',\n        j: '┘',\n        k: '┐',\n        l: '┌',\n        m: '└',\n        n: '┼',\n        o: '⎺',\n        p: '⎻',\n        q: '─',\n        r: '⎼',\n        s: '⎽',\n        t: '├',\n        u: '┤',\n        v: '┴',\n        w: '┬',\n        x: '│',\n        y: '≤',\n        z: '≥',\n        '{': 'π',\n        '|': '≠',\n        '}': '£',\n        '~': '·' },\n     acscr: \n      { '◆': '`',\n        '▒': 'a',\n        '°': 'f',\n        '±': 'g',\n        '\\u000b': 'i',\n        '┘': 'j',\n        '┐': 'k',\n        '┌': 'l',\n        '└': 'm',\n        '┼': 'n',\n        '⎺': 'o',\n        '⎻': 'p',\n        '─': 'q',\n        '⎼': 'r',\n        '⎽': 's',\n        '├': 't',\n        '┤': 'u',\n        '┴': 'v',\n        '┬': 'w',\n        '│': 'x',\n        '≤': 'y',\n        '≥': 'z',\n        'π': '{',\n        '≠': '|',\n        '£': '}',\n        '·': '~' } } }\nCompiling auto_left_margin: false\nCompiling auto_right_margin: true\nCompiling no_esc_ctlc: false\nCompiling ceol_standout_glitch: false\nCompiling eat_newline_glitch: true\nCompiling erase_overstrike: false\nCompiling generic_type: false\nCompiling hard_copy: false\nCompiling has_meta_key: true\nCompiling has_status_line: false\nCompiling insert_null_glitch: false\nCompiling memory_above: false\nCompiling memory_below: false\nCompiling move_insert_mode: true\nCompiling move_standout_mode: true\nCompiling over_strike: false\nCompiling status_line_esc_ok: false\nCompiling dest_tabs_magic_smso: false\nCompiling tilde_glitch: false\nCompiling transparent_underline: false\nCompiling xon_xoff: false\nCompiling needs_xon_xoff: false\nCompiling prtr_silent: true\nCompiling hard_cursor: false\nCompiling non_rev_rmcup: false\nCompiling no_pad_char: true\nCompiling non_dest_scroll_region: false\nCompiling can_change: false\nCompiling back_color_erase: true\nCompiling hue_lightness_saturation: false\nCompiling col_addr_glitch: false\nCompiling cr_cancels_micro_mode: false\nCompiling has_print_wheel: false\nCompiling row_addr_glitch: false\nCompiling semi_auto_right_margin: false\nCompiling cpi_changes_res: false\nCompiling lpi_changes_res: false\nCompiling backspaces_with_bs: true\nCompiling AX: true\nCompiling XT: true\nCompiling columns: 80\nCompiling init_tabs: 8\nCompiling lines: 24\nCompiling lines_of_memory: -1\nCompiling magic_cookie_glitch: -1\nCompiling padding_baud_rate: -1\nCompiling virtual_terminal: -1\nCompiling width_status_line: -1\nCompiling num_labels: -1\nCompiling label_height: -1\nCompiling label_width: -1\nCompiling max_attributes: -1\nCompiling maximum_windows: -1\nCompiling max_colors: 8\nCompiling max_pairs: 64\nCompiling back_tab: \"\\u001b[Z\"\nreturn \"\\x1b[Z\";\nCompiling bell: \"\\u0007\"\nreturn \"\\x07\";\nCompiling carriage_return: \"\\r\"\nreturn \"\\r\";\nCompiling change_scroll_region: \"\\u001b[%i%p1%d;%p2%dr\"\nvar out = [\"\\x1b[\"];(params[0]++, params[1]++),out.push(params[0]),out.push(\";\"),out.push(params[1]),out.push(\"r\");return out.join(\"\");\nCompiling clear_all_tabs: \"\\u001b[3g\"\nreturn \"\\x1b[3g\";\nCompiling clear_screen: \"\\u001b[H\\u001b[2J\"\nreturn \"\\x1b[H\\x1b[2J\";\nCompiling clr_eol: \"\\u001b[K\"\nreturn \"\\x1b[K\";\nCompiling clr_eos: \"\\u001b[J\"\nreturn \"\\x1b[J\";\nCompiling column_address: \"\\u001b[%i%p1%dG\"\nvar out = [\"\\x1b[\"];(params[0]++, params[1]++),out.push(params[0]),out.push(\"G\");return out.join(\"\");\nCompiling cursor_address: \"\\u001b[%i%p1%d;%p2%dH\"\nvar out = [\"\\x1b[\"];(params[0]++, params[1]++),out.push(params[0]),out.push(\";\"),out.push(params[1]),out.push(\"H\");return out.join(\"\");\nCompiling cursor_down: \"\\n\"\nreturn \"\\n\";\nCompiling cursor_home: \"\\u001b[H\"\nreturn \"\\x1b[H\";\nCompiling cursor_invisible: \"\\u001b[?25l\"\nreturn \"\\x1b[?25l\";\nCompiling cursor_left: \"\\b\"\nreturn \"\\b\";\nCompiling cursor_normal: \"\\u001b[?12l\\u001b[?25h\"\nreturn \"\\x1b[?12l\\x1b[?25h\";\nCompiling cursor_right: \"\\u001b[C\"\nreturn \"\\x1b[C\";\nCompiling cursor_up: \"\\u001b[A\"\nreturn \"\\x1b[A\";\nCompiling cursor_visible: \"\\u001b[?12;25h\"\nreturn \"\\x1b[?12;25h\";\nCompiling delete_character: \"\\u001b[P\"\nreturn \"\\x1b[P\";\nCompiling delete_line: \"\\u001b[M\"\nreturn \"\\x1b[M\";\nCompiling enter_alt_charset_mode: \"\\u001b(0\"\nreturn \"\\x1b(0\";\nCompiling enter_blink_mode: \"\\u001b[5m\"\nreturn \"\\x1b[5m\";\nCompiling enter_bold_mode: \"\\u001b[1m\"\nreturn \"\\x1b[1m\";\nCompiling enter_ca_mode: \"\\u001b[?1049h\"\nreturn \"\\x1b[?1049h\";\nCompiling enter_insert_mode: \"\\u001b[4h\"\nreturn \"\\x1b[4h\";\nCompiling enter_secure_mode: \"\\u001b[8m\"\nreturn \"\\x1b[8m\";\nCompiling enter_reverse_mode: \"\\u001b[7m\"\nreturn \"\\x1b[7m\";\nCompiling enter_standout_mode: \"\\u001b[7m\"\nreturn \"\\x1b[7m\";\nCompiling enter_underline_mode: \"\\u001b[4m\"\nreturn \"\\x1b[4m\";\nCompiling erase_chars: \"\\u001b[%p1%dX\"\nvar out = [\"\\x1b[\"];out.push(params[0]),out.push(\"X\");return out.join(\"\");\nCompiling exit_alt_charset_mode: \"\\u001b(B\"\nreturn \"\\x1b(B\";\nCompiling exit_attribute_mode: \"\\u001b(B\\u001b[m\"\nreturn \"\\x1b(B\\x1b[m\";\nCompiling exit_ca_mode: \"\\u001b[?1049l\"\nreturn \"\\x1b[?1049l\";\nCompiling exit_insert_mode: \"\\u001b[4l\"\nreturn \"\\x1b[4l\";\nCompiling exit_standout_mode: \"\\u001b[27m\"\nreturn \"\\x1b[27m\";\nCompiling exit_underline_mode: \"\\u001b[24m\"\nreturn \"\\x1b[24m\";\nCompiling flash_screen: \"\\u001b[?5h$<100/>\\u001b[?5l\"\nreturn \"\\x1b[?5h\\x1b[?5l\";\nCompiling init_2string: \"\\u001b[!p\\u001b[?3;4l\\u001b[4l\\u001b>\"\nreturn \"\\x1b[!p\\x1b[?3;4l\\x1b[4l\\x1b>\";\nCompiling insert_line: \"\\u001b[L\"\nreturn \"\\x1b[L\";\nCompiling key_backspace: \"\\b\"\nreturn \"\\b\";\nCompiling key_dc: \"\\u001b[3~\"\nreturn \"\\x1b[3~\";\nCompiling key_down: \"\\u001bOB\"\nreturn \"\\x1bOB\";\nCompiling key_f1: \"\\u001bOP\"\nreturn \"\\x1bOP\";\nCompiling key_f10: \"\\u001b[21~\"\nreturn \"\\x1b[21~\";\nCompiling key_f2: \"\\u001bOQ\"\nreturn \"\\x1bOQ\";\nCompiling key_f3: \"\\u001bOR\"\nreturn \"\\x1bOR\";\nCompiling key_f4: \"\\u001bOS\"\nreturn \"\\x1bOS\";\nCompiling key_f5: \"\\u001b[15~\"\nreturn \"\\x1b[15~\";\nCompiling key_f6: \"\\u001b[17~\"\nreturn \"\\x1b[17~\";\nCompiling key_f7: \"\\u001b[18~\"\nreturn \"\\x1b[18~\";\nCompiling key_f8: \"\\u001b[19~\"\nreturn \"\\x1b[19~\";\nCompiling key_f9: \"\\u001b[20~\"\nreturn \"\\x1b[20~\";\nCompiling key_home: \"\\u001bOH\"\nreturn \"\\x1bOH\";\nCompiling key_ic: \"\\u001b[2~\"\nreturn \"\\x1b[2~\";\nCompiling key_left: \"\\u001bOD\"\nreturn \"\\x1bOD\";\nCompiling key_npage: \"\\u001b[6~\"\nreturn \"\\x1b[6~\";\nCompiling key_ppage: \"\\u001b[5~\"\nreturn \"\\x1b[5~\";\nCompiling key_right: \"\\u001bOC\"\nreturn \"\\x1bOC\";\nCompiling key_sf: \"\\u001b[1;2B\"\nreturn \"\\x1b[1;2B\";\nCompiling key_sr: \"\\u001b[1;2A\"\nreturn \"\\x1b[1;2A\";\nCompiling key_up: \"\\u001bOA\"\nreturn \"\\x1bOA\";\nCompiling keypad_local: \"\\u001b[?1l\\u001b>\"\nreturn \"\\x1b[?1l\\x1b>\";\nCompiling keypad_xmit: \"\\u001b[?1h\\u001b=\"\nreturn \"\\x1b[?1h\\x1b=\";\nCompiling meta_off: \"\\u001b[?1034l\"\nreturn \"\\x1b[?1034l\";\nCompiling meta_on: \"\\u001b[?1034h\"\nreturn \"\\x1b[?1034h\";\nCompiling parm_dch: \"\\u001b[%p1%dP\"\nvar out = [\"\\x1b[\"];out.push(params[0]),out.push(\"P\");return out.join(\"\");\nCompiling parm_delete_line: \"\\u001b[%p1%dM\"\nvar out = [\"\\x1b[\"];out.push(params[0]),out.push(\"M\");return out.join(\"\");\nCompiling parm_down_cursor: \"\\u001b[%p1%dB\"\nvar out = [\"\\x1b[\"];out.push(params[0]),out.push(\"B\");return out.join(\"\");\nCompiling parm_ich: \"\\u001b[%p1%d@\"\nvar out = [\"\\x1b[\"];out.push(params[0]),out.push(\"@\");return out.join(\"\");\nCompiling parm_index: \"\\u001b[%p1%dS\"\nvar out = [\"\\x1b[\"];out.push(params[0]),out.push(\"S\");return out.join(\"\");\nCompiling parm_insert_line: \"\\u001b[%p1%dL\"\nvar out = [\"\\x1b[\"];out.push(params[0]),out.push(\"L\");return out.join(\"\");\nCompiling parm_left_cursor: \"\\u001b[%p1%dD\"\nvar out = [\"\\x1b[\"];out.push(params[0]),out.push(\"D\");return out.join(\"\");\nCompiling parm_right_cursor: \"\\u001b[%p1%dC\"\nvar out = [\"\\x1b[\"];out.push(params[0]),out.push(\"C\");return out.join(\"\");\nCompiling parm_rindex: \"\\u001b[%p1%dT\"\nvar out = [\"\\x1b[\"];out.push(params[0]),out.push(\"T\");return out.join(\"\");\nCompiling parm_up_cursor: \"\\u001b[%p1%dA\"\nvar out = [\"\\x1b[\"];out.push(params[0]),out.push(\"A\");return out.join(\"\");\nCompiling print_screen: \"\\u001b[i\"\nreturn \"\\x1b[i\";\nCompiling prtr_off: \"\\u001b[4i\"\nreturn \"\\x1b[4i\";\nCompiling prtr_on: \"\\u001b[5i\"\nreturn \"\\x1b[5i\";\nCompiling reset_1string: \"\\u001bc\"\nreturn \"\\x1bc\";\nCompiling reset_2string: \"\\u001b[!p\\u001b[?3;4l\\u001b[4l\\u001b>\"\nreturn \"\\x1b[!p\\x1b[?3;4l\\x1b[4l\\x1b>\";\nCompiling restore_cursor: \"\\u001b8\"\nreturn \"\\x1b8\";\nCompiling row_address: \"\\u001b[%i%p1%dd\"\nvar out = [\"\\x1b[\"];(params[0]++, params[1]++),out.push(params[0]),out.push(\"d\");return out.join(\"\");\nCompiling save_cursor: \"\\u001b7\"\nreturn \"\\x1b7\";\nCompiling scroll_forward: \"\\n\"\nreturn \"\\n\";\nCompiling scroll_reverse: \"\\u001bM\"\nreturn \"\\x1bM\";\nCompiling set_attributes: \"%?%p9%t\\u001b(0%e\\u001b(B%;\\u001b[0%?%p6%t;1%;%?%p2%t;4%;%?%p1%p3%|%t;7%;%?%p4%t;5%;%?%p7%t;8%;m\"\nvar v, stack = [], out = [];;if ((stack.push(v = params[8]), v)) {out.push(\"\\x1b(0\")} else {out.push(\"\\x1b(B\")}out.push(\"\\x1b[0\");if ((stack.push(v = params[5]), v)) {out.push(\";1\")};if ((stack.push(v = params[1]), v)) {out.push(\";4\")};if ((stack.push(v = params[0]), v),(stack.push(v = params[2]), v),(stack.push(v = (stack.pop() | stack.pop()) || 0), v)) {out.push(\";7\")};if ((stack.push(v = params[3]), v)) {out.push(\";5\")};if ((stack.push(v = params[6]), v)) {out.push(\";8\")}out.push(\"m\");return out.join(\"\");\nCompiling set_tab: \"\\u001bH\"\nreturn \"\\x1bH\";\nCompiling tab: \"\\t\"\nreturn \"\\t\";\nCompiling key_b2: \"\\u001bOE\"\nreturn \"\\x1bOE\";\nCompiling acs_chars: \"``aaffggiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~\"\nreturn \"``aaffggiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~\";\nCompiling key_btab: \"\\u001b[Z\"\nreturn \"\\x1b[Z\";\nCompiling enter_am_mode: \"\\u001b[?7h\"\nreturn \"\\x1b[?7h\";\nCompiling exit_am_mode: \"\\u001b[?7l\"\nreturn \"\\x1b[?7l\";\nCompiling key_end: \"\\u001bOF\"\nreturn \"\\x1bOF\";\nCompiling key_enter: \"\\u001bOM\"\nreturn \"\\x1bOM\";\nCompiling key_sdc: \"\\u001b[3;2~\"\nreturn \"\\x1b[3;2~\";\nCompiling key_send: \"\\u001b[1;2F\"\nreturn \"\\x1b[1;2F\";\nCompiling key_shome: \"\\u001b[1;2H\"\nreturn \"\\x1b[1;2H\";\nCompiling key_sic: \"\\u001b[2;2~\"\nreturn \"\\x1b[2;2~\";\nCompiling key_sleft: \"\\u001b[1;2D\"\nreturn \"\\x1b[1;2D\";\nCompiling key_snext: \"\\u001b[6;2~\"\nreturn \"\\x1b[6;2~\";\nCompiling key_sprevious: \"\\u001b[5;2~\"\nreturn \"\\x1b[5;2~\";\nCompiling key_sright: \"\\u001b[1;2C\"\nreturn \"\\x1b[1;2C\";\nCompiling key_f11: \"\\u001b[23~\"\nreturn \"\\x1b[23~\";\nCompiling key_f12: \"\\u001b[24~\"\nreturn \"\\x1b[24~\";\nCompiling key_f13: \"\\u001b[1;2P\"\nreturn \"\\x1b[1;2P\";\nCompiling key_f14: \"\\u001b[1;2Q\"\nreturn \"\\x1b[1;2Q\";\nCompiling key_f15: \"\\u001b[1;2R\"\nreturn \"\\x1b[1;2R\";\nCompiling key_f16: \"\\u001b[1;2S\"\nreturn \"\\x1b[1;2S\";\nCompiling key_f17: \"\\u001b[15;2~\"\nreturn \"\\x1b[15;2~\";\nCompiling key_f18: \"\\u001b[17;2~\"\nreturn \"\\x1b[17;2~\";\nCompiling key_f19: \"\\u001b[18;2~\"\nreturn \"\\x1b[18;2~\";\nCompiling key_f20: \"\\u001b[19;2~\"\nreturn \"\\x1b[19;2~\";\nCompiling key_f21: \"\\u001b[20;2~\"\nreturn \"\\x1b[20;2~\";\nCompiling key_f22: \"\\u001b[21;2~\"\nreturn \"\\x1b[21;2~\";\nCompiling key_f23: \"\\u001b[23;2~\"\nreturn \"\\x1b[23;2~\";\nCompiling key_f24: \"\\u001b[24;2~\"\nreturn \"\\x1b[24;2~\";\nCompiling key_f25: \"\\u001b[1;5P\"\nreturn \"\\x1b[1;5P\";\nCompiling key_f26: \"\\u001b[1;5Q\"\nreturn \"\\x1b[1;5Q\";\nCompiling key_f27: \"\\u001b[1;5R\"\nreturn \"\\x1b[1;5R\";\nCompiling key_f28: \"\\u001b[1;5S\"\nreturn \"\\x1b[1;5S\";\nCompiling key_f29: \"\\u001b[15;5~\"\nreturn \"\\x1b[15;5~\";\nCompiling key_f30: \"\\u001b[17;5~\"\nreturn \"\\x1b[17;5~\";\nCompiling key_f31: \"\\u001b[18;5~\"\nreturn \"\\x1b[18;5~\";\nCompiling key_f32: \"\\u001b[19;5~\"\nreturn \"\\x1b[19;5~\";\nCompiling key_f33: \"\\u001b[20;5~\"\nreturn \"\\x1b[20;5~\";\nCompiling key_f34: \"\\u001b[21;5~\"\nreturn \"\\x1b[21;5~\";\nCompiling key_f35: \"\\u001b[23;5~\"\nreturn \"\\x1b[23;5~\";\nCompiling key_f36: \"\\u001b[24;5~\"\nreturn \"\\x1b[24;5~\";\nCompiling key_f37: \"\\u001b[1;6P\"\nreturn \"\\x1b[1;6P\";\nCompiling key_f38: \"\\u001b[1;6Q\"\nreturn \"\\x1b[1;6Q\";\nCompiling key_f39: \"\\u001b[1;6R\"\nreturn \"\\x1b[1;6R\";\nCompiling key_f40: \"\\u001b[1;6S\"\nreturn \"\\x1b[1;6S\";\nCompiling key_f41: \"\\u001b[15;6~\"\nreturn \"\\x1b[15;6~\";\nCompiling key_f42: \"\\u001b[17;6~\"\nreturn \"\\x1b[17;6~\";\nCompiling key_f43: \"\\u001b[18;6~\"\nreturn \"\\x1b[18;6~\";\nCompiling key_f44: \"\\u001b[19;6~\"\nreturn \"\\x1b[19;6~\";\nCompiling key_f45: \"\\u001b[20;6~\"\nreturn \"\\x1b[20;6~\";\nCompiling key_f46: \"\\u001b[21;6~\"\nreturn \"\\x1b[21;6~\";\nCompiling key_f47: \"\\u001b[23;6~\"\nreturn \"\\x1b[23;6~\";\nCompiling key_f48: \"\\u001b[24;6~\"\nreturn \"\\x1b[24;6~\";\nCompiling key_f49: \"\\u001b[1;3P\"\nreturn \"\\x1b[1;3P\";\nCompiling key_f50: \"\\u001b[1;3Q\"\nreturn \"\\x1b[1;3Q\";\nCompiling key_f51: \"\\u001b[1;3R\"\nreturn \"\\x1b[1;3R\";\nCompiling key_f52: \"\\u001b[1;3S\"\nreturn \"\\x1b[1;3S\";\nCompiling key_f53: \"\\u001b[15;3~\"\nreturn \"\\x1b[15;3~\";\nCompiling key_f54: \"\\u001b[17;3~\"\nreturn \"\\x1b[17;3~\";\nCompiling key_f55: \"\\u001b[18;3~\"\nreturn \"\\x1b[18;3~\";\nCompiling key_f56: \"\\u001b[19;3~\"\nreturn \"\\x1b[19;3~\";\nCompiling key_f57: \"\\u001b[20;3~\"\nreturn \"\\x1b[20;3~\";\nCompiling key_f58: \"\\u001b[21;3~\"\nreturn \"\\x1b[21;3~\";\nCompiling key_f59: \"\\u001b[23;3~\"\nreturn \"\\x1b[23;3~\";\nCompiling key_f60: \"\\u001b[24;3~\"\nreturn \"\\x1b[24;3~\";\nCompiling key_f61: \"\\u001b[1;4P\"\nreturn \"\\x1b[1;4P\";\nCompiling key_f62: \"\\u001b[1;4Q\"\nreturn \"\\x1b[1;4Q\";\nCompiling key_f63: \"\\u001b[1;4R\"\nreturn \"\\x1b[1;4R\";\nCompiling clr_bol: \"\\u001b[1K\"\nreturn \"\\x1b[1K\";\nCompiling user6: \"\\u001b[%i%d;%dR\"\nvar stack = [], out = [\"\\x1b[\"];(params[0]++, params[1]++),out.push(stack.pop()),out.push(\";\"),out.push(stack.pop()),out.push(\"R\");return out.join(\"\");\nCompiling user7: \"\\u001b[6n\"\nreturn \"\\x1b[6n\";\nCompiling user8: \"\\u001b[?1;2c\"\nreturn \"\\x1b[?1;2c\";\nCompiling user9: \"\\u001b[c\"\nreturn \"\\x1b[c\";\nCompiling orig_pair: \"\\u001b[39;49m\"\nreturn \"\\x1b[39;49m\";\nCompiling set_foreground: \"\\u001b[3%?%p1%{1}%=%t4%e%p1%{3}%=%t6%e%p1%{4}%=%t1%e%p1%{6}%=%t3%e%p1%d%;m\"\nvar v, stack = [], out = [];out.push(\"\\x1b[3\");if ((stack.push(v = params[0]), v),(stack.push(v = 1), v),(stack.push(v = (stack.pop() === stack.pop()) || 0), v)) {out.push(\"4\")} else if ((stack.push(v = params[0]), v),(stack.push(v = 3), v),(stack.push(v = (stack.pop() === stack.pop()) || 0), v)) {out.push(\"6\")} else if ((stack.push(v = params[0]), v),(stack.push(v = 4), v),(stack.push(v = (stack.pop() === stack.pop()) || 0), v)) {out.push(\"1\")} else if ((stack.push(v = params[0]), v),(stack.push(v = 6), v),(stack.push(v = (stack.pop() === stack.pop()) || 0), v)) {out.push(\"3\")} else {out.push(params[0])}out.push(\"m\");return out.join(\"\");\nCompiling set_background: \"\\u001b[4%?%p1%{1}%=%t4%e%p1%{3}%=%t6%e%p1%{4}%=%t1%e%p1%{6}%=%t3%e%p1%d%;m\"\nvar v, stack = [], out = [];out.push(\"\\x1b[4\");if ((stack.push(v = params[0]), v),(stack.push(v = 1), v),(stack.push(v = (stack.pop() === stack.pop()) || 0), v)) {out.push(\"4\")} else if ((stack.push(v = params[0]), v),(stack.push(v = 3), v),(stack.push(v = (stack.pop() === stack.pop()) || 0), v)) {out.push(\"6\")} else if ((stack.push(v = params[0]), v),(stack.push(v = 4), v),(stack.push(v = (stack.pop() === stack.pop()) || 0), v)) {out.push(\"1\")} else if ((stack.push(v = params[0]), v),(stack.push(v = 6), v),(stack.push(v = (stack.pop() === stack.pop()) || 0), v)) {out.push(\"3\")} else {out.push(params[0])}out.push(\"m\");return out.join(\"\");\nCompiling key_mouse: \"\\u001b[M\"\nreturn \"\\x1b[M\";\nCompiling set_a_foreground: \"\\u001b[3%p1%dm\"\nvar out = [\"\\x1b[3\"];out.push(params[0]),out.push(\"m\");return out.join(\"\");\nCompiling set_a_background: \"\\u001b[4%p1%dm\"\nvar out = [\"\\x1b[4\"];out.push(params[0]),out.push(\"m\");return out.join(\"\");\nCompiling memory_lock: \"\\u001bl\"\nreturn \"\\x1bl\";\nCompiling memory_unlock: \"\\u001bm\"\nreturn \"\\x1bm\";\nCompiling Cr: \"\\u001b]112\\u0007\"\nreturn \"\\x1b]112\\x07\";\nCompiling Cs: \"\\u001b]12;%p1%s\\u0007\"\nvar out = [\"\\x1b]12;\"];out.push(params[0]),out.push(\"\\x07\");return out.join(\"\");\nCompiling E3: \"\\u001b[3;J\"\nreturn \"\\x1b[3;J\";\nCompiling Ms: \"\\u001b]52;%p1%s;%p2%s\\u0007\"\nvar out = [\"\\x1b]52;\"];out.push(params[0]),out.push(\";\"),out.push(params[1]),out.push(\"\\x07\");return out.join(\"\");\nCompiling Se: \"\\u001b[2 q\"\nreturn \"\\x1b[2 q\";\nCompiling Ss: \"\\u001b[%p1%d q\"\nvar out = [\"\\x1b[\"];out.push(params[0]),out.push(\" q\");return out.join(\"\");\nCompiling kDC3: \"\\u001b[3;3~\"\nreturn \"\\x1b[3;3~\";\nCompiling kDC4: \"\\u001b[3;4~\"\nreturn \"\\x1b[3;4~\";\nCompiling kDC5: \"\\u001b[3;5~\"\nreturn \"\\x1b[3;5~\";\nCompiling kDC6: \"\\u001b[3;6~\"\nreturn \"\\x1b[3;6~\";\nCompiling kDC7: \"\\u001b[3;7~\"\nreturn \"\\x1b[3;7~\";\nCompiling kDN: \"\\u001b[1;2B\"\nreturn \"\\x1b[1;2B\";\nCompiling kDN3: \"\\u001b[1;3B\"\nreturn \"\\x1b[1;3B\";\nCompiling kDN4: \"\\u001b[1;4B\"\nreturn \"\\x1b[1;4B\";\nCompiling kDN5: \"\\u001b[1;5B\"\nreturn \"\\x1b[1;5B\";\nCompiling kDN6: \"\\u001b[1;6B\"\nreturn \"\\x1b[1;6B\";\nCompiling kDN7: \"\\u001b[1;7B\"\nreturn \"\\x1b[1;7B\";\nCompiling kEND3: \"\\u001b[1;3F\"\nreturn \"\\x1b[1;3F\";\nCompiling kEND4: \"\\u001b[1;4F\"\nreturn \"\\x1b[1;4F\";\nCompiling kEND5: \"\\u001b[1;5F\"\nreturn \"\\x1b[1;5F\";\nCompiling kEND6: \"\\u001b[1;6F\"\nreturn \"\\x1b[1;6F\";\nCompiling kEND7: \"\\u001b[1;7F\"\nreturn \"\\x1b[1;7F\";\nCompiling kHOM3: \"\\u001b[1;3H\"\nreturn \"\\x1b[1;3H\";\nCompiling kHOM4: \"\\u001b[1;4H\"\nreturn \"\\x1b[1;4H\";\nCompiling kHOM5: \"\\u001b[1;5H\"\nreturn \"\\x1b[1;5H\";\nCompiling kHOM6: \"\\u001b[1;6H\"\nreturn \"\\x1b[1;6H\";\nCompiling kHOM7: \"\\u001b[1;7H\"\nreturn \"\\x1b[1;7H\";\nCompiling kIC3: \"\\u001b[2;3~\"\nreturn \"\\x1b[2;3~\";\nCompiling kIC4: \"\\u001b[2;4~\"\nreturn \"\\x1b[2;4~\";\nCompiling kIC5: \"\\u001b[2;5~\"\nreturn \"\\x1b[2;5~\";\nCompiling kIC6: \"\\u001b[2;6~\"\nreturn \"\\x1b[2;6~\";\nCompiling kIC7: \"\\u001b[2;7~\"\nreturn \"\\x1b[2;7~\";\nCompiling kLFT3: \"\\u001b[1;3D\"\nreturn \"\\x1b[1;3D\";\nCompiling kLFT4: \"\\u001b[1;4D\"\nreturn \"\\x1b[1;4D\";\nCompiling kLFT5: \"\\u001b[1;5D\"\nreturn \"\\x1b[1;5D\";\nCompiling kLFT6: \"\\u001b[1;6D\"\nreturn \"\\x1b[1;6D\";\nCompiling kLFT7: \"\\u001b[1;7D\"\nreturn \"\\x1b[1;7D\";\nCompiling kNXT3: \"\\u001b[6;3~\"\nreturn \"\\x1b[6;3~\";\nCompiling kNXT4: \"\\u001b[6;4~\"\nreturn \"\\x1b[6;4~\";\nCompiling kNXT5: \"\\u001b[6;5~\"\nreturn \"\\x1b[6;5~\";\nCompiling kNXT6: \"\\u001b[6;6~\"\nreturn \"\\x1b[6;6~\";\nCompiling kNXT7: \"\\u001b[6;7~\"\nreturn \"\\x1b[6;7~\";\nCompiling kPRV3: \"\\u001b[5;3~\"\nreturn \"\\x1b[5;3~\";\nCompiling kPRV4: \"\\u001b[5;4~\"\nreturn \"\\x1b[5;4~\";\nCompiling kPRV5: \"\\u001b[5;5~\"\nreturn \"\\x1b[5;5~\";\nCompiling kPRV6: \"\\u001b[5;6~\"\nreturn \"\\x1b[5;6~\";\nCompiling kPRV7: \"\\u001b[5;7~\"\nreturn \"\\x1b[5;7~\";\nCompiling kRIT3: \"\\u001b[1;3C\"\nreturn \"\\x1b[1;3C\";\nCompiling kRIT4: \"\\u001b[1;4C\"\nreturn \"\\x1b[1;4C\";\nCompiling kRIT5: \"\\u001b[1;5C\"\nreturn \"\\x1b[1;5C\";\nCompiling kRIT6: \"\\u001b[1;6C\"\nreturn \"\\x1b[1;6C\";\nCompiling kRIT7: \"\\u001b[1;7C\"\nreturn \"\\x1b[1;7C\";\nCompiling kUP: \"\\u001b[1;2A\"\nreturn \"\\x1b[1;2A\";\nCompiling kUP3: \"\\u001b[1;3A\"\nreturn \"\\x1b[1;3A\";\nCompiling kUP4: \"\\u001b[1;4A\"\nreturn \"\\x1b[1;4A\";\nCompiling kUP5: \"\\u001b[1;5A\"\nreturn \"\\x1b[1;5A\";\nCompiling kUP6: \"\\u001b[1;6A\"\nreturn \"\\x1b[1;6A\";\nCompiling kUP7: \"\\u001b[1;7A\"\nreturn \"\\x1b[1;7A\";\nCompiling ka2: \"\"\nCompiling kb1: \"\"\nCompiling kb3: \"\"\nCompiling kc2: \"\"\n"
  },
  {
    "path": "test/tput",
    "content": "#!/bin/bash\n\nterm=\"$1\"\n\ndir=$(dirname $(readlink -f \"$0\"))\ncd \"$dir/..\"\n\nif test -z \"$term\"; then\n  term=\"$dir/../usr/xterm\"\n  set -- \"$term\" \"$@\"\nfi\n\nnode test/tput.js \"$@\" | grep -v 'dir:\\|file:' | tee test/logs/terminfo.log\nout=$(git diff --color=always --no-index test/terminfo test/logs/terminfo.log)\n\nif test -n \"$out\"; then\n  echo \"$out\" | less -c -R\nelse\n  echo 'Files are identical.'\nfi\n"
  },
  {
    "path": "test/tput.js",
    "content": "/**\n * Tput for node.js\n * Copyright (c) 2013, Christopher Jeffrey (MIT License)\n * https://github.com/chjj/blessed\n */\n\n// Compile xterm terminfo/termcap:\n// $ tic -a -I -1 usr/xterm.terminfo\n// $ tic -a -C -U usr/xterm.termcap\n\n// Compile xterm terminfo/termcap:\n// $ tic -a -1 usr/xterm.terminfo\n// $ tic -a -1 usr/xterm.terminfo && ls ~/.terminfo\n// $ tic -a -1 -o usr usr/xterm.terminfo && mv usr/x/xterm usr/ && rm -rf usr/v usr/x\n// $ tic -a -1 -o usr usr/xterm.terminfo && mv usr/x/xterm-256color usr/ && rm -rf usr/v usr/x\n\n// Check tput output:\n// $ node test/tput.js xterm | tee out\n// $ node test/tput.js xterm --ifile usr/xterm | tee out\n// $ node test/tput.js xterm-256color --ifile usr/xterm-256color | tee out\n// $ node test/tput.js vt102 --termcap | tee out\n// $ node test/tput.js xterm --termcap --cfile usr/xterm.termcap | tee out\n// $ node test/tput.js xterm --iprefix ~/.terminfo | tee out\n// $ node test/tput.js xterm-256color --ifile ~/.terminfo/x/xterm-256color | tee out\n// $ cdiff test/terminfo out\n\nvar blessed = require('../');\n\n// Simple argument parser\n// Copyright (c) 2012, Christopher Jeffrey (MIT License)\n\nfunction parseArg() {\n  var argv = process.argv.slice(2)\n    , options = [];\n\n  function getarg() {\n    var arg = argv.shift();\n\n    if (arg.indexOf('--') === 0) {\n      // e.g. --opt\n      arg = arg.split('=');\n      if (arg.length > 1) {\n        // e.g. --opt=val\n        argv.unshift(arg.slice(1).join('='));\n      }\n      arg = arg[0];\n    } else if (arg[0] === '-') {\n      if (arg.length > 2) {\n        // e.g. -abc\n        argv = arg.substring(1).split('').map(function(ch) {\n          return '-' + ch;\n        }).concat(argv);\n        arg = argv.shift();\n      } else {\n        // e.g. -a\n      }\n    } else {\n      // e.g. foo\n    }\n\n    return arg;\n  }\n\n  while (argv.length) {\n    arg = getarg();\n    if (arg.indexOf('-') === 0) {\n      arg = arg.replace(/^--?/, '');\n      if (argv[0] && argv[0].indexOf('-') !== 0) {\n        options[arg] = argv.shift();\n      } else {\n        options[arg] = true;\n      }\n    } else {\n      options.push(arg);\n    }\n  }\n\n  return options;\n}\n\nvar argv = parseArg();\n\nvar tput = blessed.tput({\n  terminal: argv[0] !== 'all' && argv[0] !== 'rand'\n    ? argv[0] || __dirname + '/../usr/xterm'\n    : null,\n  extended: true,\n  debug: true,\n  termcap: argv.termcap,\n  terminfoFile: argv.i || argv.ifile,\n  terminfoPrefix: argv.p || argv.iprefix,\n  termcapFile: argv.c || argv.cfile\n});\n\nif (argv[0] === 'all') {\n  var rl = require('readline').createInterface({\n    input: process.stdin,\n    output: process.stdout\n  });\n\n  var text = '\\x1b[31mWARNING:\\x1b[m '\n    + 'This will compile every single terminfo file on your disk.\\n'\n    + 'It will probably use a lot of CPU.\\n'\n    + 'Do you wish to proceed? (Y/n) ';\n\n  rl.question(text, function(result) {\n    result = result.trim().toLowerCase();\n    if (result !== 'y') return process.exit(0);\n    console.log('\\x1b[32m(You bet your ass I wish to proceed.)\\x1b[m');\n    blessed.tput.print(\n      '$<1000/>.$<1000/>.$<1000/>.$<100/>Let\\'s go...',\n      process.stdout.write.bind(process.stdout),\n      function() {\n        tput.compileAll(argv[1]);\n        process.exit(0);\n      }\n    );\n  });\n\n  return;\n}\n\nif (argv[0] === 'rand') {\n  var terms = tput.getAll()\n    , term;\n\n  term = terms[(terms.length - 1) * Math.random() | 0];\n\n  console.log('Compiling ' + term + '...');\n  tput.compileTerminfo(term);\n  console.log('Compiled ' + term + '.');\n\n  return;\n}\n\n// console.log('Max colors: %d.', tput.colors);\n\n// console.log(tput.strings.acs_chars.split('').map(function(ch) { return ch.charCodeAt(0); }));\n// console.log(JSON.stringify(tput.strings.acs_chars));\n\n// process.stdout.write(blessed.tput.sprintf('%-10s\\n', 'hello'));\n\n// tput._compile({ name: 'xterm' }, 'set_attributes',\n//   '%?%p9%t\\u001b(0%e\\u001b(B%;\\u001b[0%?%p6%t;1%;%?%p2%t;4%;%?%p1%p3%|%t;7%;%?%p4%t;5%;%?%p7%t;8%;m');\n\n// console.log(tput.setaf(4) + 'foo' + tput.sgr0());\n// console.log(tput.setaf(4) + 'foo' + tput.sgr(0));\n\n// tput.padding = true;\n// tput._print('hello$<1000/>world', console.log, function() {\n//   tput._print('$<1000/>foo$<1000/>bar', console.log, process.exit);\n// });\n"
  },
  {
    "path": "test/widget-autopad.js",
    "content": "var blessed = require('../')\n  , screen;\n\nscreen = blessed.screen({\n  dump: __dirname + '/logs/autopad.log',\n  smartCSR: true,\n  autoPadding: true,\n  warnings: true\n});\n\nvar box1 = blessed.box({\n  parent: screen,\n  top: 'center',\n  left: 'center',\n  width: 20,\n  height: 10,\n  border: 'line'\n});\n\nvar box2 = blessed.box({\n  parent: box1,\n  top: 0,\n  left: 0,\n  width: 10,\n  height: 5,\n  border: 'line'\n});\n\nscreen.key('q', function() {\n  return screen.destroy();\n});\n\nscreen.render();\n"
  },
  {
    "path": "test/widget-bigtext.js",
    "content": "var blessed = require('../')\n  , screen;\n\nscreen = blessed.screen({\n  dump: __dirname + '/logs/bigtext.log',\n  smartCSR: true,\n  warnings: true\n});\n\nvar box = blessed.bigtext({\n  parent: screen,\n  content: 'Hello',\n  shrink: true,\n  width: '80%',\n  // height: '80%',\n  height: 'shrink',\n  // width: 'shrink',\n  border: 'line',\n  fch: ' ',\n  ch: '\\u2592',\n  style: {\n    fg: 'red',\n    bg: 'blue',\n    bold: false\n  }\n});\n\nscreen.key('q', function() {\n  return screen.destroy();\n});\n\nscreen.render();\n\n"
  },
  {
    "path": "test/widget-csr.js",
    "content": "var blessed = require('../')\n  , screen;\n\nscreen = blessed.screen({\n  dump: __dirname + '/logs/csr.log',\n  smartCSR: true,\n  warnings: true\n});\n\nvar lorem = require('fs').readFileSync(__dirname + '/git.diff', 'utf8');\n\nvar cleanSides = screen.cleanSides;\nfunction expectClean(value) {\n  screen.cleanSides = function(el) {\n    var ret = cleanSides.apply(this, arguments);\n    if (ret !== value) {\n      throw new Error('Failed. Expected '\n        + value + ' from cleanSides. Got '\n        + ret + '.');\n    }\n    return ret;\n  };\n}\n\n/*\nblessed.box({\n  parent: screen,\n  left: 0,\n  top: 'center',\n  width: '50%',\n  height: 2,\n  style: {\n    bg: 'green'\n  },\n  content: 'This will disallow CSR.'\n});\nexpectClean(false);\n*/\n\nvar btext = blessed.box({\n  parent: screen,\n  left: 'center',\n  top: 'center',\n  width: '80%',\n  height: '80%',\n  style: {\n    bg: 'green'\n  },\n  border: 'line',\n  content: 'CSR should still work.'\n});\nbtext._oscroll = btext.scroll;\nbtext.scroll = function(offset, always) {\n  expectClean(true);\n  return btext._oscroll(offset, always);\n};\n\nvar text = blessed.scrollabletext({\n  parent: screen,\n  content: lorem,\n  border: 'line',\n  left: 'center',\n  top: 'center',\n  draggable: true,\n  width: '50%',\n  height: '50%',\n  mouse: true,\n  keys: true,\n  vi: true\n});\n\ntext._oscroll = text.scroll;\ntext.scroll = function(offset, always) {\n  var el = this;\n  var value = true;\n  if (el.left < 0) value = true;\n  if (el.top < 0) value = false;\n  if (el.left + el.width > screen.width) value = true;\n  if (el.top + el.height > screen.height) value = false;\n  expectClean(value);\n  return text._oscroll(offset, always);\n};\n\ntext.focus();\n\nscreen.key('q', function() {\n  return screen.destroy();\n});\n\nscreen.render();\n"
  },
  {
    "path": "test/widget-dock-noborder.js",
    "content": "var blessed = require('../')\n  , screen;\n\nscreen = blessed.screen({\n  dump: __dirname + '/logs/dock.log',\n  smartCSR: true,\n  dockBorders: true,\n  warnings: true\n});\n\nblessed.box({\n  parent: screen,\n  left: -1,\n  top: -1,\n  width: '50%+1',\n  height: '50%+1',\n  border: 'line',\n  content: 'Foo'\n});\n\nblessed.box({\n  parent: screen,\n  left: '50%-1',\n  top: -1,\n  width: '50%+3',\n  height: '50%+1',\n  content: 'Bar',\n  border: 'line'\n});\n\nblessed.box({\n  parent: screen,\n  left: -1,\n  top: '50%-1',\n  width: '50%+1',\n  height: '50%+3',\n  border: 'line',\n  content: 'Foo'\n});\n\nblessed.listtable({\n  parent: screen,\n  left: '50%-1',\n  top: '50%-1',\n  width: '50%+3',\n  height: '50%+3',\n  border: 'line',\n  align: 'center',\n  tags: true,\n  keys: true,\n  vi: true,\n  mouse: true,\n  style: {\n    header: {\n      fg: 'blue',\n      bold: true\n    },\n    cell: {\n      fg: 'magenta',\n      selected: {\n        bg: 'blue'\n      }\n    }\n  },\n  data: [\n    [ 'Animals',  'Foods',  'Times',   'Numbers' ],\n    [ 'Elephant', 'Apple',  '1:00am',  'One'     ],\n    [ 'Bird',     'Orange', '2:15pm',  'Two'     ],\n    [ 'T-Rex',    'Taco',   '8:45am',  'Three'   ],\n    [ 'Mouse',    'Cheese', '9:05am',  'Four'    ]\n  ]\n}).focus();\n\n// blessed.box({\n//   parent: screen,\n//   left: '50%-1',\n//   top: '50%-1',\n//   width: '50%+1',\n//   height: '50%+1',\n//   border: 'line',\n//   content: 'Bar'\n// });\n\nscreen.key('q', function() {\n  return screen.destroy();\n});\n\nscreen.render();\n"
  },
  {
    "path": "test/widget-dock.js",
    "content": "var blessed = require('../')\n  , screen;\n\nscreen = blessed.screen({\n  dump: __dirname + '/logs/dock.log',\n  smartCSR: true,\n  dockBorders: true,\n  warnings: true\n});\n\nvar topleft = blessed.box({\n  parent: screen,\n  left: 0,\n  top: 0,\n  width: '50%',\n  height: '50%',\n  border: {\n    type: 'line',\n    left: false,\n    top: false,\n    right: true,\n    bottom: false\n  },\n  // border: 'line',\n  content: 'Foo'\n});\n\nvar topright = blessed.box({\n  parent: screen,\n  left: '50%-1',\n  top: 0,\n  width: '50%+1',\n  height: '50%',\n  border: {\n    type: 'line',\n    left: true,\n    top: false,\n    right: false,\n    bottom: false\n  },\n  // border: 'line',\n  content: 'Bar'\n});\n\nvar bottomleft = blessed.box({\n  parent: screen,\n  left: 0,\n  top: '50%-1',\n  width: '50%',\n  height: '50%+1',\n  border: {\n    type: 'line',\n    left: false,\n    top: true,\n    right: false,\n    bottom: false\n  },\n  border: 'line',\n  content: 'Foo'\n});\n\nvar bottomright = blessed.listtable({\n  parent: screen,\n  left: '50%-1',\n  top: '50%-1',\n  width: '50%+1',\n  height: '50%+1',\n  border: {\n    type: 'line',\n    left: true,\n    top: true,\n    right: false,\n    bottom: false\n  },\n  // border: 'line',\n  align: 'center',\n  tags: true,\n  keys: true,\n  vi: true,\n  mouse: true,\n  style: {\n    header: {\n      fg: 'blue',\n      bold: true\n    },\n    cell: {\n      fg: 'magenta',\n      selected: {\n        bg: 'blue'\n      }\n    }\n  },\n  data: [\n    [ 'Animals',  'Foods',  'Times',   'Numbers' ],\n    [ 'Elephant', 'Apple',  '1:00am',  'One'     ],\n    [ 'Bird',     'Orange', '2:15pm',  'Two'     ],\n    [ 'T-Rex',    'Taco',   '8:45am',  'Three'   ],\n    [ 'Mouse',    'Cheese', '9:05am',  'Four'    ]\n  ]\n});\n\nbottomright.focus();\n\nvar over = blessed.box({\n  parent: screen,\n  left: 'center',\n  top: 'center',\n  width: '50%',\n  height: '50%',\n  draggable: true,\n  border: {\n    type: 'line',\n    left: false,\n    top: true,\n    right: true,\n    bottom: true\n  },\n  content: 'Drag Me'\n});\n\nscreen.key('q', function() {\n  return screen.destroy();\n});\n\nscreen.render();\n"
  },
  {
    "path": "test/widget-exit.js",
    "content": "var blessed = require('../');\n\nvar screen = blessed.screen({\n  dump: __dirname + '/logs/exit.log',\n  smartCSR: true,\n  autoPadding: true,\n  warnings: true,\n  ignoreLocked: ['C-q']\n});\n\nvar box = blessed.prompt({\n  parent: screen,\n  left: 'center',\n  top: 'center',\n  width: '70%',\n  height: 'shrink',\n  border: 'line'\n});\n\nscreen.render();\n\nbox.input('Input: ', '', function(err, data) {\n  screen.destroy();\n  if (process.argv[2] === 'resume') {\n    process.stdin.resume();\n  } else if (process.argv[2] === 'end') {\n    process.stdin.setRawMode(false);\n    process.stdin.end();\n  }\n  if (err) throw err;\n  console.log('Input: ' + data);\n});\n\nscreen.key('C-q', function(ch, key) {\n  return screen.destroy();\n});\n"
  },
  {
    "path": "test/widget-file.js",
    "content": "var blessed = require('../');\n\nvar screen = blessed.screen({\n  tput: true,\n  smartCSR: true,\n  dump: __dirname + '/logs/file.log',\n  warnings: true\n});\n\nvar fm = blessed.filemanager({\n  parent: screen,\n  border: 'line',\n  style: {\n    selected: {\n      bg: 'blue'\n    }\n  },\n  height: 'half',\n  width: 'half',\n  top: 'center',\n  left: 'center',\n  label: ' {blue-fg}%path{/blue-fg} ',\n  cwd: process.env.HOME,\n  keys: true,\n  vi: true,\n  scrollbar: {\n    bg: 'white',\n    ch: ' '\n  }\n});\n\nvar box = blessed.box({\n  parent: screen,\n  style: {\n    bg: 'green'\n  },\n  border: 'line',\n  height: 'half',\n  width: 'half',\n  top: 'center',\n  left: 'center',\n  hidden: true\n});\n\nfm.refresh();\n\nscreen.render();\n\nscreen.key('q', function() {\n  screen.destroy();\n});\n\nscreen.key(['s', 'p'], function() {\n  fm.hide();\n  screen.render();\n  setTimeout(function() {\n    fm.pick(function(err, file) {\n      box.show();\n      box.setContent(err ? err + '' : file);\n      screen.render();\n      setTimeout(function() {\n        box.hide();\n        fm.reset(function() {\n          fm.show();\n          screen.render();\n        });\n      }, 2000);\n    });\n  }, 2000);\n});\n"
  },
  {
    "path": "test/widget-form.js",
    "content": "var blessed = require('../')\n  , screen;\n\nscreen = blessed.screen({\n  dump: __dirname + '/logs/form.log',\n  warnings: true\n});\n\nvar form = blessed.form({\n  parent: screen,\n  mouse: true,\n  keys: true,\n  vi: true,\n  left: 0,\n  top: 0,\n  width: '100%',\n  //height: 12,\n  style: {\n    bg: 'green',\n    // border: {\n    //   inverse: true\n    // },\n    scrollbar: {\n      inverse: true\n    }\n  },\n  content: 'foobar',\n  scrollable: true,\n  // border: {\n  //   type: 'ch',\n  //   ch: ' '\n  // },\n  scrollbar: {\n    ch: ' '\n  }\n  //alwaysScroll: true\n});\n\nform.on('submit', function(data) {\n  output.setContent(JSON.stringify(data, null, 2));\n  screen.render();\n});\n\nform.key('d', function() {\n  form.scroll(1, true);\n  screen.render();\n});\n\nform.key('u', function() {\n  form.scroll(-1, true);\n  screen.render();\n});\n\nvar set = blessed.radioset({\n  parent: form,\n  left: 1,\n  top: 1,\n  shrink: true,\n  //padding: 1,\n  //content: 'f',\n  style: {\n    bg: 'magenta'\n  }\n});\n\nvar radio1 = blessed.radiobutton({\n  parent: set,\n  mouse: true,\n  keys: true,\n  shrink: true,\n  style: {\n    bg: 'magenta'\n  },\n  height: 1,\n  left: 0,\n  top: 0,\n  name: 'radio1',\n  content: 'radio1'\n});\n\nvar radio2 = blessed.radiobutton({\n  parent: set,\n  mouse: true,\n  keys: true,\n  shrink: true,\n  style: {\n    bg: 'magenta'\n  },\n  height: 1,\n  left: 15,\n  top: 0,\n  name: 'radio2',\n  content: 'radio2'\n});\n\nvar text = blessed.textbox({\n  parent: form,\n  mouse: true,\n  keys: true,\n  style: {\n    bg: 'blue'\n  },\n  height: 1,\n  width: 20,\n  left: 1,\n  top: 3,\n  name: 'text'\n});\n\ntext.on('focus', function() {\n  text.readInput();\n});\n\nvar check = blessed.checkbox({\n  parent: form,\n  mouse: true,\n  keys: true,\n  shrink: true,\n  style: {\n    bg: 'magenta'\n  },\n  height: 1,\n  left: 28,\n  top: 1,\n  name: 'check',\n  content: 'check'\n});\n\nvar check2 = blessed.checkbox({\n  parent: form,\n  mouse: true,\n  keys: true,\n  shrink: true,\n  style: {\n    bg: 'magenta'\n  },\n  height: 1,\n  left: 28,\n  top: 14,\n  name: 'foooooooo2',\n  content: 'foooooooo2'\n});\n\nvar submit = blessed.button({\n  parent: form,\n  mouse: true,\n  keys: true,\n  shrink: true,\n  padding: {\n    left: 1,\n    right: 1\n  },\n  left: 29,\n  top: 3,\n  shrink: true,\n  name: 'submit',\n  content: 'submit',\n  style: {\n    bg: 'blue',\n    focus: {\n      bg: 'red'\n    }\n  }\n});\n\nsubmit.on('press', function() {\n  form.submit();\n});\n\nvar box1 = blessed.box({\n  parent: form,\n  left: 1,\n  top: 10,\n  height: 10,\n  width: 10,\n  content: 'one',\n  style: {\n    bg: 'cyan'\n  }\n});\n\nvar box2 = blessed.box({\n  parent: box1,\n  left: 1,\n  top: 2,\n  height: 8,\n  width: 9,\n  content: 'two',\n  style: {\n    bg: 'magenta'\n  }\n});\n\nvar box3 = blessed.box({\n  parent: box2,\n  left: 1,\n  top: 2,\n  height: 6,\n  width: 8,\n  content: 'three',\n  style: {\n    bg: 'yellow'\n  }\n});\n\nvar box4 = blessed.box({\n  parent: box3,\n  left: 1,\n  top: 2,\n  height: 4,\n  width: 7,\n  content: 'four',\n  style: {\n    bg: 'blue'\n  }\n});\n\nvar output = blessed.scrollabletext({\n  parent: form,\n  mouse: true,\n  keys: true,\n  left: 0,\n  top: 20,\n  height: 5,\n  left: 0,\n  right: 0,\n  style: {\n    bg: 'red'\n  },\n  content: 'foobar'\n});\n\nvar bottom = blessed.line({\n  parent: form,\n  type: 'line',\n  orientation: 'horizontal',\n  left: 0,\n  right: 0,\n  top: 50,\n  style: {\n    fg: 'blue'\n  }\n});\n\nscreen.key('q', function() {\n  return screen.destroy();\n});\n\nform.focus();\n\nform.submit();\n\nscreen.render();\n"
  },
  {
    "path": "test/widget-image.js",
    "content": "var blessed = require('../')\n  , screen;\n\nscreen = blessed.screen({\n  dump: __dirname + '/logs/image.log',\n  smartCSR: true,\n  warnings: true\n});\n\n// To ensure our w3mimgdisplay search works:\nif (process.argv[2] === 'find') {\n  blessed.image.w3mdisplay = '/does/not/exist';\n  process.argv.length = 2;\n}\n\nvar file = process.argv[2] || __dirname + '/test-image.png';\n\nvar image = blessed.image({\n  parent: screen,\n  type: 'overlay',\n  left: 'center',\n  top: 'center',\n  width: 'shrink',\n  height: 'shrink',\n  style: {\n    bg: 'green'\n  },\n  draggable: true\n});\n\nsetTimeout(function() {\n  image.setImage(file, function() {\n    // XXX For some reason the image sometimes envelopes\n    // the entire screen at the end if this is uncommented:\n    // NOTE: Might have to do with an uncached ratio and\n    // a bad termSize being reported.\n    screen.render();\n    setTimeout(function() {\n      image.rtop = 4;\n      image.rleft = 10;\n      screen.render();\n      setTimeout(function() {\n        image.rtop = 2;\n        image.rleft = 7;\n        screen.render();\n        setTimeout(function() {\n          image.detach();\n          screen.render();\n          setTimeout(function() {\n            screen.append(image);\n            image.enableMouse();\n            screen.render();\n          }, 1000);\n        }, 1000);\n      }, 1000);\n    }, 5000);\n  });\n}, 1000);\n\nimage.focus();\n\nscreen.key('i', function() {\n  screen.displayImage(file);\n});\n\nscreen.key('q', function() {\n  return screen.destroy();\n});\n\nscreen.render();\n"
  },
  {
    "path": "test/widget-insert.js",
    "content": "var blessed = require('../');\n\nvar screen = blessed.screen({\n  dump: __dirname + '/logs/insert.log',\n  warnings: true\n});\n\nvar box = blessed.box({\n  parent: screen,\n  //align: 'center',\n  style: {\n    bg: 'blue'\n  },\n  height: 5,\n  top: 'center',\n  left: 0,\n  width: 12,\n  tags: true,\n  content: '{yellow-fg}line{/yellow-fg}{|}1',\n  //valign: 'middle'\n});\n\nscreen.render();\n\nbox.insertBottom('{yellow-fg}line{/yellow-fg}{|}2');\nbox.insertTop('{yellow-fg}line{/yellow-fg}{|}0');\n\nscreen.render();\n\nsetTimeout(function() {\n  box.deleteTop();\n  screen.render();\n}, 2000);\n\nscreen.key('q', function() {\n  screen.destroy();\n});\n"
  },
  {
    "path": "test/widget-layout.js",
    "content": "var blessed = require('../')\n  , screen;\n\nscreen = blessed.screen({\n  dump: __dirname + '/logs/layout.log',\n  smartCSR: true,\n  autoPadding: true,\n  warnings: true\n});\n\nvar layout = blessed.layout({\n  parent: screen,\n  top: 'center',\n  left: 'center',\n  width: '50%',\n  height: '50%',\n  border: 'line',\n  layout: process.argv[2] === 'grid' ? 'grid' : 'inline',\n  style: {\n    bg: 'red',\n    border: {\n      fg: 'blue'\n    }\n  }\n});\n\nvar box1 = blessed.box({\n  parent: layout,\n  top: 'center',\n  left: 'center',\n  width: 20,\n  height: 10,\n  border: 'line',\n  content: '1'\n});\n\nvar box2 = blessed.box({\n  parent: layout,\n  top: 0,\n  left: 0,\n  width: 10,\n  height: 5,\n  border: 'line',\n  content: '2'\n});\n\nvar box3 = blessed.box({\n  parent: layout,\n  top: 0,\n  left: 0,\n  width: 10,\n  height: 5,\n  border: 'line',\n  content: '3'\n});\n\nvar box4 = blessed.box({\n  parent: layout,\n  top: 0,\n  left: 0,\n  width: 10,\n  height: 5,\n  border: 'line',\n  content: '4'\n});\n\nvar box5 = blessed.box({\n  parent: layout,\n  top: 0,\n  left: 0,\n  width: 10,\n  height: 5,\n  border: 'line',\n  content: '5'\n});\n\nvar box6 = blessed.box({\n  parent: layout,\n  top: 0,\n  left: 0,\n  width: 10,\n  height: 5,\n  border: 'line',\n  content: '6'\n});\n\nvar box7 = blessed.box({\n  parent: layout,\n  top: 0,\n  left: 0,\n  width: 10,\n  height: 5,\n  border: 'line',\n  content: '7'\n});\n\nvar box8 = blessed.box({\n  parent: layout,\n  top: 'center',\n  left: 'center',\n  width: 20,\n  height: 10,\n  border: 'line',\n  content: '8'\n});\n\nvar box9 = blessed.box({\n  parent: layout,\n  top: 0,\n  left: 0,\n  width: 10,\n  height: 5,\n  border: 'line',\n  content: '9'\n});\n\nvar box10 = blessed.box({\n  parent: layout,\n  top: 'center',\n  left: 'center',\n  width: 20,\n  height: 10,\n  border: 'line',\n  content: '10'\n});\n\nvar box11 = blessed.box({\n  parent: layout,\n  top: 0,\n  left: 0,\n  width: 10,\n  height: 5,\n  border: 'line',\n  content: '11'\n});\n\nvar box12 = blessed.box({\n  parent: layout,\n  top: 'center',\n  left: 'center',\n  width: 20,\n  height: 10,\n  border: 'line',\n  content: '12'\n});\n\nif (process.argv[2] !== 'grid') {\n  for (var i = 0; i < 10; i++) {\n    blessed.box({\n      parent: layout,\n      // width: i % 2 === 0 ? 10 : 20,\n      // height: i % 2 === 0 ? 5 : 10,\n      width: Math.random() > 0.5 ? 10 : 20,\n      height: Math.random() > 0.5 ? 5 : 10,\n      border: 'line',\n      content: (i + 1 + 12) + ''\n    });\n  }\n}\n\nscreen.key('q', function() {\n  return screen.destroy();\n});\n\nscreen.render();\n"
  },
  {
    "path": "test/widget-listbar.js",
    "content": "var blessed = require('../')\n  , screen;\n\nvar auto = true;\n\nscreen = blessed.screen({\n  dump: __dirname + '/logs/listbar.log',\n  autoPadding: auto,\n  warnings: true\n});\n\nvar box = blessed.box({\n  parent: screen,\n  top: 0,\n  right: 0,\n  width: 'shrink',\n  height: 'shrink',\n  content: '...'\n});\n\nvar bar = blessed.listbar({\n  //parent: screen,\n  bottom: 0,\n  left: 3,\n  right: 3,\n  height: auto ? 'shrink' : 3,\n  mouse: true,\n  keys: true,\n  autoCommandKeys: true,\n  border: 'line',\n  vi: true,\n  style: {\n    bg: 'green',\n    item: {\n      bg: 'red',\n      hover: {\n        bg: 'blue'\n      },\n      //focus: {\n      //  bg: 'blue'\n      //}\n    },\n    selected: {\n      bg: 'blue'\n    }\n  },\n  commands: {\n    'one': {\n      keys: ['a'],\n      callback: function() {\n        box.setContent('Pressed one.');\n        screen.render();\n      }\n    },\n    'two': function() {\n      box.setContent('Pressed two.');\n      screen.render();\n    },\n    'three': function() {\n      box.setContent('Pressed three.');\n      screen.render();\n    },\n    'four': function() {\n      box.setContent('Pressed four.');\n      screen.render();\n    },\n    'five': function() {\n      box.setContent('Pressed five.');\n      screen.render();\n    },\n    'six': function() {\n      box.setContent('Pressed six.');\n      screen.render();\n    },\n    'seven': function() {\n      box.setContent('Pressed seven.');\n      screen.render();\n    },\n    'eight': function() {\n      box.setContent('Pressed eight.');\n      screen.render();\n    },\n    'nine': function() {\n      box.setContent('Pressed nine.');\n      screen.render();\n    },\n    'ten': function() {\n      box.setContent('Pressed ten.');\n      screen.render();\n    },\n    'eleven': function() {\n      box.setContent('Pressed eleven.');\n      screen.render();\n    },\n    'twelve': function() {\n      box.setContent('Pressed twelve.');\n      screen.render();\n    },\n    'thirteen': function() {\n      box.setContent('Pressed thirteen.');\n      screen.render();\n    },\n    'fourteen': function() {\n      box.setContent('Pressed fourteen.');\n      screen.render();\n    },\n    'fifteen': function() {\n      box.setContent('Pressed fifteen.');\n      screen.render();\n    }\n  }\n});\n\nscreen.append(bar);\n\nbar.focus();\n\nscreen.key('q', function() {\n  return screen.destroy();\n});\n\nscreen.render();\n"
  },
  {
    "path": "test/widget-listtable.js",
    "content": "var blessed = require('../')\n  , screen;\n\nscreen = blessed.screen({\n  dump: __dirname + '/logs/listtable.log',\n  autoPadding: false,\n  fullUnicode: true,\n  warnings: true\n});\n\nvar DU = '杜';\nvar JUAN = '鹃';\n\n/*\nvar box = blessed.box({\n  parent: screen,\n  top: 'center',\n  left: 'center',\n  data: null,\n  border: 'line',\n  align: 'center',\n  tags: true,\n  keys: true,\n  width: '90%',\n  height: '80%',\n  style: {\n    bg: 'red'\n  }\n});\n*/\n\nvar table = blessed.listtable({\n  //parent: screen,\n  top: 'center',\n  left: 'center',\n  data: null,\n  border: 'line',\n  align: 'center',\n  tags: true,\n  keys: true,\n  //width: '80%',\n  width: 'shrink',\n  height: '70%',\n  vi: true,\n  mouse: true,\n  style: {\n    border: {\n      fg: 'red'\n    },\n    header: {\n      fg: 'blue',\n      bold: true\n    },\n    cell: {\n      fg: 'magenta',\n      selected: {\n        bg: 'blue'\n      }\n    }\n  }\n});\n\nvar data1 = [\n  [ 'Animals',  'Foods',  'Times'  ],\n  [ 'Elephant', 'Apple',  '1:00am' ],\n  [ 'Bird',     'Orange', '2:15pm' ],\n  [ 'T-Rex',    'Taco',   '8:45am' ],\n  [ 'Mouse',    'Cheese', '9:05am' ]\n];\n\ndata1[1][0] = '{red-fg}' + data1[1][0] + '{/red-fg}';\ndata1[2][0] += ' (' + DU + JUAN + ')';\n\nvar data2 = [\n  [ 'Animals',  'Foods',  'Times',   'Numbers' ],\n  [ 'Elephant', 'Apple',  '1:00am',  'One'     ],\n  [ 'Bird',     'Orange', '2:15pm',  'Two'     ],\n  [ 'T-Rex',    'Taco',   '8:45am',  'Three'   ],\n  [ 'Mouse',    'Cheese', '9:05am',  'Four'    ]\n];\n\ndata2[1][0] = '{red-fg}' + data2[1][0] + '{/red-fg}';\ndata2[2][0] += ' (' + DU + JUAN + ')';\n\nscreen.key('q', function() {\n  return screen.destroy();\n});\n\ntable.focus();\n\ntable.setData(data2);\n\nscreen.append(table);\n\nscreen.render();\n\nsetTimeout(function() {\n  table.setData(data1);\n  screen.render();\n}, 3000);\n"
  },
  {
    "path": "test/widget-log.js",
    "content": "var blessed = require('../')\n  , screen;\n\nscreen = blessed.screen({\n  dump: __dirname + '/logs/logger.log',\n  smartCSR: true,\n  autoPadding: false,\n  warnings: true\n});\n\nvar logger = blessed.log({\n  parent: screen,\n  top: 'center',\n  left: 'center',\n  width: '50%',\n  height: '50%',\n  border: 'line',\n  tags: true,\n  keys: true,\n  vi: true,\n  mouse: true,\n  scrollback: 100,\n  scrollbar: {\n    ch: ' ',\n    track: {\n      bg: 'yellow'\n    },\n    style: {\n      inverse: true\n    }\n  }\n});\n\nlogger.focus();\n\nsetInterval(function() {\n  logger.log('Hello {#0fe1ab-fg}world{/}: {bold}%s{/bold}.', Date.now().toString(36));\n  if (Math.random() < 0.30) {\n    logger.log({foo:{bar:{baz:true}}});\n  }\n  screen.render();\n}, 1000).unref();\n\nscreen.key('q', function() {\n  return screen.destroy();\n});\n\nscreen.render();\n"
  },
  {
    "path": "test/widget-nested-attr.js",
    "content": "var blessed = require('../')\n  , screen;\n\nscreen = blessed.screen({\n  dump: __dirname + '/logs/nested-attr.log',\n  warnings: true\n});\n\nblessed.box({\n  parent: screen,\n  left: 'center',\n  top: 'center',\n  width: '80%',\n  height: '80%',\n  style: {\n    bg: 'black',\n    fg: 'yellow'\n  },\n  tags: true,\n  border: 'line',\n  content: '{red-fg}hello {blue-fg}how{/blue-fg}'\n    + ' {yellow-bg}are{/yellow-bg} you?{/red-fg}'\n});\n\nscreen.key('q', function() {\n  return screen.destroy();\n});\n\nscreen.render();\n"
  },
  {
    "path": "test/widget-noalt.js",
    "content": "var blessed = require('../')\n  , screen;\n\nscreen = blessed.screen({\n  dump: __dirname + '/logs/noalt.log',\n  title: 'widget-noalt test',\n  noAlt: true,\n  warnings: true\n});\n\nvar list = blessed.list({\n  parent: screen,\n  align: 'center',\n  mouse: true,\n  keys: true,\n  vi: true,\n  width: '50%',\n  height: 'shrink',\n  //border: 'line',\n  top: 5,\n  //bottom: 2,\n  left: 0,\n  style: {\n    fg: 'blue',\n    bg: 'default',\n    selected: {\n      bg: 'green'\n    }\n  },\n  items: [\n    'one',\n    'two',\n    'three'\n  ]\n});\n\nlist.select(0);\n\nlist.on('select', function(item) {\n  console.log(item.getText());\n  screen.destroy();\n});\n\nscreen.key('C-c', function() {\n  screen.destroy();\n});\n\nlist.focus();\n\nscreen.render();\n"
  },
  {
    "path": "test/widget-nowrap.js",
    "content": "var fs = require('fs')\n  , blessed = require('../')\n  , screen;\n\n// {open}xxxx{close} xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx\n// xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx {red-bg}xxxx xxxx xxxx{/red-bg}\n\nscreen = blessed.screen({\n  dump: __dirname + '/logs/nowrap.log',\n  warnings: true\n});\n\nvar box = blessed.box({\n  parent: screen,\n  width: 60,\n  wrap: false,\n  tags: true,\n  content: fs.readFileSync(__filename, 'utf8')\n  //content: '{red-bg}' + blessed.escape('{{{{{}{bold}x{/bold}}') + '{/red-bg}'\n  //  + '\\nescaped: {green-fg}{escape}{{{}{{a{bold}b{/bold}c{/escape}{/green-fg}'\n});\n\nbox.focus();\n\nscreen.key('q', function() {\n  return screen.destroy();\n});\n\nscreen.render();\n"
  },
  {
    "path": "test/widget-obscure-sides.js",
    "content": "var blessed = require('../');\n\nvar screen = blessed.screen({\n  tput: true,\n  smartCSR: true,\n  dump: __dirname + '/logs/obscure-sides.log',\n  autoPadding: true,\n  warnings: true\n});\n\nvar box = blessed.box({\n  parent: screen,\n  scrollable: true,\n  alwaysScroll: true,\n  border: {\n    type: 'bg',\n    ch: ' '\n  },\n  style: {\n    bg: 'blue',\n    border: {\n      inverse: true\n    },\n    scrollbar: {\n      bg: 'white'\n    }\n  },\n  height: 10,\n  width: 30,\n  top: 'center',\n  left: 'center',\n  cwd: process.env.HOME,\n  keys: true,\n  vi: true,\n  scrollbar: {\n    ch: ' '\n  }\n});\n\nvar child = blessed.box({\n  parent: box,\n  content: 'hello',\n  style: {\n    bg: 'green'\n  },\n  // border: 'line',\n  height: 5,\n  width: 20,\n  top: 2,\n  left: 15\n});\n\nvar child2 = blessed.box({\n  parent: box,\n  content: 'hello',\n  style: {\n    bg: 'green',\n  },\n  border: 'line',\n  height: 5,\n  width: 20,\n  top: 25,\n  left: -5\n});\n\nbox.focus();\n\nscreen.render();\n\nscreen.key('q', function() {\n  screen.destroy();\n});\n"
  },
  {
    "path": "test/widget-padding.js",
    "content": "var blessed = require('../')\n  , screen;\n\nscreen = blessed.screen({\n  dump: __dirname + '/logs/padding.log',\n  warnings: true\n});\n\nblessed.box({\n  parent: screen,\n  border: 'line',\n  style: {\n    bg: 'red',\n  },\n  content: 'hello world\\nhi',\n  align: 'center',\n  left: 'center',\n  top: 'center',\n  width: 22,\n  height: 10,\n  padding: 2\n});\n\nscreen.key('q', function() {\n  return screen.destroy();\n});\n\nscreen.render();\n"
  },
  {
    "path": "test/widget-play.js",
    "content": "var blessed = require('../');\n\nvar screen = blessed.screen({\n  dump: __dirname + '/logs/play.log',\n  smartCSR: true,\n  warnings: true\n});\n\nvar frames = require(__dirname + '/frames.json');\n\nvar timer = setInterval(function() {\n  if (!frames.length) {\n    clearInterval(timer);\n    return screen.destroy();\n  }\n  process.stdout.write(frames.shift());\n}, 100);\n"
  },
  {
    "path": "test/widget-png.js",
    "content": "var blessed = require('../');\nvar fs = require('fs');\n\nvar argv = {};\n\nprocess.argv = process.argv.map(function(arg, i) {\n  if (/^--\\w+=/.test(arg)) {\n    arg = arg.split('=');\n    if (/^[0-9.]+$/.test(arg[1])) arg[1] = +arg[1];\n    argv[arg[0].replace(/^--/, '')] = arg[1];\n    return;\n  }\n  if (arg.indexOf('--') === 0) {\n    arg = arg.slice(2);\n    argv[arg] = true;\n    return;\n  }\n  return arg;\n}).filter(Boolean);\n\nvar screen = blessed.screen({\n  tput: true,\n  smartCSR: true,\n  dump: __dirname + '/logs/png.log',\n  warnings: true\n});\n\nvar box1 = blessed.box({\n  parent: screen,\n  left: 4,\n  top: 3,\n  width: 10,\n  height: 6,\n  border: 'line',\n  style: {\n    bg: 'green'\n  },\n  content: fs.readFileSync(__dirname + '/lorem.txt', 'utf8')\n});\n\nvar box2 = blessed.box({\n  parent: screen,\n  left: 20,\n  top: 8,\n  width: 40,\n  height: 15,\n  border: 'line',\n  style: {\n    bg: 'green'\n  },\n  content: fs.readFileSync(__dirname + '/lorem.txt', 'utf8')\n});\n\nvar file = process.argv[2];\nvar testImage = __dirname + '/test-image.png';\nvar spinfox = __dirname + '/spinfox.png';\n\n// XXX I'm not sure of the license of this file,\n// so I'm not going to redistribute it in the repo.\nvar url = 'https://people.mozilla.org/~dolske/apng/spinfox.png';\n\nif (!file) {\n  try {\n    if (!fs.existsSync(spinfox)) {\n      var buf = blessed.ansiimage.curl(url);\n      fs.writeFileSync(spinfox, buf);\n    }\n    file = spinfox;\n  } catch (e) {\n    file = testImage;\n  }\n}\n\nif (!argv.width && !argv.height && !argv.scale) {\n  argv.width = 20;\n}\n\nvar png = blessed.image({\n  parent: screen,\n  // border: 'line',\n  width: argv.width,\n  height: argv.height,\n  top: 2,\n  left: 0,\n  file: file,\n  draggable: true,\n  type: 'ansi',\n  scale: argv.scale,\n  ascii: argv.ascii,\n  optimization: argv.optimization,\n  speed: argv.speed\n});\n\nscreen.render();\n\nscreen.key('q', function() {\n  clearInterval(timeout);\n  screen.destroy();\n});\n\nvar timeout = setInterval(function() {\n  if (png.right <= 0) {\n    clearInterval(timeout);\n    return;\n  }\n  png.left++;\n  screen.render();\n}, 100);\n\nif (timeout.unref) timeout.unref();\n\nscreen.key(['h', 'left'], function() {\n  png.left -= 2;\n});\n\nscreen.key(['k', 'up'], function() {\n  png.top -= 2;\n});\n\nscreen.key(['l', 'right'], function() {\n  png.left += 2;\n});\n\nscreen.key(['j', 'down'], function() {\n  png.top += 2;\n});\n\nscreen.on('keypress', function() {\n  clearInterval(timeout);\n});\n\npng.on('mousedown', function() {\n  clearInterval(timeout);\n});\n"
  },
  {
    "path": "test/widget-pos.js",
    "content": "var blessed = require('../')\n  , assert = require('assert')\n  , screen;\n\nscreen = blessed.screen({\n  dump: __dirname + '/logs/pos.log'\n});\n\n// My terminal size at the time of writing these tests:\nscreen.program.cols = 154;\nscreen.program.rows = 19;\nscreen.alloc();\n\nvar main = blessed.box({\n  //width: '75%',\n  //height: '75%',\n  width: 115,\n  height: 14,\n  style: {\n    bg: 'yellow'\n  },\n  top: 2,\n  left: 2,\n  content: 'Welcome to my program'\n});\n\nscreen.append(main);\n\nvar inner = blessed.box({\n  width: '50%',\n  height: '50%',\n  //width: 57,\n  //height: 7,\n  style: {\n    bg: 'blue'\n  },\n  top: 2,\n  left: 2,\n  content: 'Hello'\n});\n\nmain.append(inner);\n\ninner.setContent(inner.content + '\\n' + JSON.stringify({\n  aleft: inner.aleft,\n  aright: inner.aright,\n  atop: inner.atop,\n  abottom: inner.abottom,\n  width: inner.width,\n  height: inner.height,\n  rleft: inner.rleft,\n  rright: inner.rright,\n  rtop: inner.rtop,\n  rbottom: inner.rbottom\n}));\n\nassert.equal(inner.width, 57);\nassert.equal(inner.height, 7);\n\nassert.equal(inner.aleft, 4);\nassert.equal(inner.aright, 93);\nassert.equal(inner.atop, 4);\nassert.equal(inner.abottom, 8);\n\nassert.equal(inner.rleft, 2);\nassert.equal(inner.rright, 56);\nassert.equal(inner.rtop, 2);\nassert.equal(inner.rbottom, 5);\n\n// Change left to half of the parent width.\ninner.rleft = '50%';\nassert.equal(inner.aleft, 59);\n\n// Change left to half of the screen width.\ninner.aleft = '50%';\nassert.equal(inner.aleft, screen.width / 2 | 0);\n\n// Test implied height/width.\nreset(inner, {\n  top: 5,\n  bottom: 5,\n  left: 5,\n  right: 5\n});\n\nassert.equal(inner.width, 105);\nassert.equal(inner.height, 4);\n\n// Demonstrate the difference between `left: 5`, and `.aleft = 5` (relative vs. absolute):\ninner.atop = inner.abottom = inner.aleft = inner.aright = 5;\n\nassert.equal(inner.width, 144);\nassert.equal(inner.height, 9);\n\n// Test center keyword\nreset(inner, {\n  width: '50%',\n  height: '50%',\n  left: 'center',\n  top: 'center'\n});\n\nassert.equal(inner.rleft, 29);\nassert.equal(inner.rtop, 4);\n\n// TODO: Start storing position.left, etc. as absolute?\n\nscreen.on('keypress', function(ch, key) {\n  if (key.name === 'escape' || key.name === 'q') {\n    return screen.destroy();\n  }\n});\n\nscreen.render();\n\nfunction reset(el, pos) {\n  pos = pos || {};\n  el.position.width = el.options.width = pos.width;\n  el.position.height = el.options.height = pos.height;\n  el.position.left = el.options.left = pos.left;\n  el.position.right = el.options.right = pos.right;\n  el.position.top = el.options.top = pos.top;\n  el.position.bottom = el.options.bottom = pos.bottom;\n}\n"
  },
  {
    "path": "test/widget-prompt.js",
    "content": "var blessed = require('../');\n\nvar screen = blessed.screen({\n  tput: true,\n  smartCSR: true,\n  dump: __dirname + '/logs/prompt.log',\n  autoPadding: true,\n  warnings: true\n});\n\nvar prompt = blessed.prompt({\n  parent: screen,\n  border: 'line',\n  height: 'shrink',\n  width: 'half',\n  top: 'center',\n  left: 'center',\n  label: ' {blue-fg}Prompt{/blue-fg} ',\n  tags: true,\n  keys: true,\n  vi: true\n});\n\nvar question = blessed.question({\n  parent: screen,\n  border: 'line',\n  height: 'shrink',\n  width: 'half',\n  top: 'center',\n  left: 'center',\n  label: ' {blue-fg}Question{/blue-fg} ',\n  tags: true,\n  keys: true,\n  vi: true\n});\n\nvar msg = blessed.message({\n  parent: screen,\n  border: 'line',\n  height: 'shrink',\n  width: 'half',\n  top: 'center',\n  left: 'center',\n  label: ' {blue-fg}Message{/blue-fg} ',\n  tags: true,\n  keys: true,\n  hidden: true,\n  vi: true\n});\n\nvar loader = blessed.loading({\n  parent: screen,\n  border: 'line',\n  height: 'shrink',\n  width: 'half',\n  top: 'center',\n  left: 'center',\n  label: ' {blue-fg}Loader{/blue-fg} ',\n  tags: true,\n  keys: true,\n  hidden: true,\n  vi: true\n});\n\nprompt.input('Question?', '', function(err, value) {\n  question.ask('Question?', function(err, value) {\n    msg.display('Hello world!', 3, function(err) {\n      msg.display('Hello world again!', -1, function(err) {\n        loader.load('Loading...');\n        setTimeout(function() {\n          loader.stop();\n          screen.destroy();\n        }, 3000);\n      });\n    });\n  });\n});\n\nscreen.key('q', function() {\n  screen.destroy();\n});\n\nscreen.render();\n"
  },
  {
    "path": "test/widget-record.js",
    "content": "var blessed = require('../')\n  , fs = require('fs');\n\nvar screen = blessed.screen({\n  dump: __dirname + '/logs/record.log',\n  smartCSR: true,\n  warnings: true\n});\n\nvar btext = blessed.box({\n  parent: screen,\n  left: 'center',\n  top: 'center',\n  width: '80%',\n  height: '80%',\n  style: {\n    bg: 'green'\n  },\n  border: 'line',\n  content: 'CSR should still work.'\n});\n\nvar text = blessed.scrollabletext({\n  parent: screen,\n  content: fs.readFileSync(__dirname + '/git.diff', 'utf8'),\n  border: 'line',\n  left: 'center',\n  top: 'center',\n  draggable: true,\n  width: '50%',\n  height: '50%',\n  mouse: true,\n  keys: true,\n  vi: true\n});\n\ntext.focus();\n\nvar frames = [];\n\nvar timer = setInterval(function() {\n  frames.push(screen.screenshot());\n}, 100);\n\nscreen.key('C-q', function() {\n  fs.writeFileSync(__dirname + '/frames.json', JSON.stringify(frames));\n  clearInterval(timer);\n  return screen.destroy();\n});\n\nscreen.render();\n"
  },
  {
    "path": "test/widget-scrollable-boxes.js",
    "content": "var blessed = require('../')\n  , screen;\n\nscreen = blessed.screen({\n  dump: __dirname + '/logs/scrollable-boxes.log',\n  smartCSR: true,\n  warnings: true\n});\n\nvar box = blessed.box({\n  parent: screen,\n  //padding: 2,\n  scrollable: true,\n  left: 'center',\n  top: 'center',\n  width: '80%',\n  height: '80%',\n  style: {\n    bg: 'green'\n  },\n  border: 'line',\n  content: 'foobar',\n  keys: true,\n  vi: true,\n  alwaysScroll: true,\n  scrollbar: {\n    ch: ' ',\n    inverse: true\n  }\n});\n\nvar text = blessed.box({\n  parent: box,\n  content: 'hello1\\nhello2\\nhello3\\nhello4',\n  padding: 2,\n  style: {\n    bg: 'red'\n  },\n  left: 2,\n  top: 30,\n  width: '50%',\n  height: 6\n});\n\nvar text2 = blessed.box({\n  parent: box,\n  content: 'world',\n  padding: 1,\n  style: {\n    bg: 'red'\n  },\n  left: 2,\n  top: 50,\n  width: '50%',\n  height: 3\n});\n\nvar box2 = blessed.box({\n  parent: box,\n  scrollable: true,\n  content: 'foo-one\\nfoo-two\\nfoo-three',\n  padding: 2,\n  left: 'center',\n  top: 20,\n  width: '80%',\n  height: 9,\n  border: 'line',\n  style: {\n    bg: 'magenta',\n    focus: {\n      bg: 'blue'\n    },\n    hover: {\n      bg: 'red'\n    }\n    // scrollbar: {\n    //   inverse: true\n    // }\n  },\n  keys: true,\n  vi: true,\n  alwaysScroll: true\n  // scrollbar: {\n  //   ch: ' '\n  // }\n});\n\nvar box3 = blessed.box({\n  parent: box2,\n  scrollable: true,\n  //content: 'foo1\\nfoo2\\nfoo3\\nfoo4\\nfoo5\\nfoo6\\nfoo7\\nf008',\n  //left: 'center',\n  left: 3,\n  top: 3,\n  content: 'foo',\n  //shrink: true,\n  height: 4,\n  width: 5,\n  //width: '80%',\n  //height: 5,\n  border: 'line',\n  style: {\n    bg: 'yellow',\n    focus: {\n      bg: 'blue'\n    },\n    hover: {\n      bg: 'red'\n    }\n    // scrollbar: {\n    //   inverse: true\n    // }\n  },\n  keys: true,\n  vi: true,\n  alwaysScroll: true\n  // scrollbar: {\n  //   ch: ' '\n  // }\n});\n\nscreen.key('q', function() {\n  return screen.destroy();\n});\n\nbox.focus();\n\nscreen.render();\n"
  },
  {
    "path": "test/widget-shadow.js",
    "content": "var blessed = require('../')\n  , screen;\n\nscreen = blessed.screen({\n  dump: __dirname + '/logs/shadow.log',\n  smartCSR: true,\n  dockBorders: true,\n  warnings: true\n});\n\nvar bg = blessed.box({\n  parent: screen,\n  shadow: true,\n  left: 0,\n  top: 0,\n  right: 0,\n  bottom: 0,\n  style: {\n    bg: 'lightblue'\n  },\n  content: 'Foo'\n});\n\nvar under = blessed.box({\n  parent: screen,\n  shadow: true,\n  left: 10,\n  top: 4,\n  width: '40%',\n  height: '30%',\n  style: {\n    bg: 'yellow'\n  },\n  border: 'line',\n  tags: true\n});\n\nvar over = blessed.box({\n  parent: screen,\n  shadow: true,\n  left: 'center',\n  top: 'center',\n  width: '50%',\n  height: '50%',\n  style: {\n    bg: 'red',\n    transparent: true\n  },\n  border: 'line',\n  draggable: true,\n  tags: true,\n  content: '{green-bg}{red-fg}{bold} --Drag Me-- {/}'\n});\n\nover.key('left', function() {\n  over.left -= 2;\n  screen.render();\n});\n\nover.key('up', function() {\n  over.top -= 1;\n  screen.render();\n});\n\nover.key('right', function() {\n  over.left += 2;\n  screen.render();\n});\n\nover.key('down', function() {\n  over.top += 1;\n  screen.render();\n});\n\nover.focus();\n\nscreen.key('q', function() {\n  return screen.destroy();\n});\n\nvar lorem = 'Non eram nescius Brute cum quae summis ingeniis exquisitaque'\n+ ' doctrina philosophi Graeco sermone tractavissent ea Latinis litteris mandaremus'\n+ ' fore ut hic noster labor in varias reprehensiones incurreret nam quibusdam et'\n+ ' iis quidem non admodum indoctis totum hoc displicet philosophari quidam autem'\n+ ' non tam id reprehendunt si remissius agatur sed tantum studium tamque multam'\n+ ' operam ponendam in eo non arbitrantur erunt etiam et ii quidem eruditi Graecis'\n+ ' litteris contemnentes Latinas qui se dicant in Graecis legendis operam malle'\n+ ' consumere postremo aliquos futuros suspicor qui me ad alias litteras vocent'\n+ ' genus hoc scribendi etsi sit elegans personae tamen et dignitatis esse negent'\n+ ' Contra quos omnis dicendum breviter existimo Quamquam philosophiae quidem'\n+ ' vituperatoribus satis responsum est eo libro quo a nobis philosophia defensa et'\n+ ' collaudata est cum esset accusata et vituperata ab Hortensio qui liber cum et'\n+ ' tibi probatus videretur et iis quos ego posse iudicare arbitrarer plura suscepi'\n+ ' veritus ne movere hominum studia viderer retinere non posse Qui autem si maxime'\n+ ' hoc placeat moderatius tamen id volunt fieri difficilem quandam temperantiam'\n+ ' postulant in eo quod semel admissum coerceri reprimique non potest ut'\n+ ' propemodum iustioribus utamur illis qui omnino avocent a philosophia quam his'\n+ ' qui rebus infinitis modum constituant in reque eo meliore quo maior sit'\n+ ' mediocritatem desiderent Sive enim ad sapientiam perveniri potest non paranda'\n+ ' nobis solum ea sed fruenda etiam sapientia est sive hoc difficile est tamen nec'\n+ ' modus est ullus investigandi veri nisi inveneris et quaerendi defatigatio'\n+ ' turpis est cum id quod quaeritur sit pulcherrimum etenim si delectamur cum'\n+ ' scribimus quis est tam invidus qui ab eo nos abducat sin laboramus quis est qui'\n+ ' alienae modum statuat industriae nam ut Terentianus Chremes non inhumanus qui'\n+ ' novum vicinum non vult fodere aut arare aut aliquid ferre denique non enim'\n+ ' illum ab industria sed ab inliberali labore deterret sic isti curiosi quos'\n+ ' offendit noster minime nobis iniucundus labor Iis igitur est difficilius satis'\n+ ' facere qui se Latina scripta dicunt contemnere in quibus hoc primum est in quo'\n+ ' admirer cur in gravissimis rebus non delectet eos sermo patrius cum idem'\n+ ' fabellas Latinas ad verbum e Graecis expressas non inviti legant quis enim tam'\n+ ' inimicus paene nomini Romano est qui Ennii Medeam aut Antiopam Pacuvii spernat'\n+ ' aut reiciat quod se isdem Euripidis fabulis delectari dicat Latinas litteras'\n+ ' oderit Quid si nos non interpretum fungimur munere sed tuemur ea quae dicta'\n+ ' sunt ab iis quos probamus eisque nostrum iudicium et nostrum scribendi ordinem'\n+ ' adiungimus quid habent cur Graeca anteponant iis quae et splendide dicta sint'\n+ ' neque sint conversa de Graecis nam si dicent ab illis has res esse tractatas ne'\n+ ' ipsos quidem Graecos est cur tam multos legant quam legendi sunt quid enim est'\n+ ' a Chrysippo praetermissum in Stoicis legimus tamen Diogenem Antipatrum'\n+ ' Mnesarchum Panaetium multos alios in primisque familiarem nostrum Posidonium'\n+ ' quid Theophrastus mediocriterne delectat cum tractat locos ab Aristotele ante'\n+ ' tractatos quid Epicurei num desistunt de isdem de quibus et ab Epicuro scriptum'\n+ ' est et ab antiquis ad arbitrium suum scribere quodsi Graeci leguntur a Graecis'\n+ ' isdem de rebus alia ratione compositis quid est cur nostri a nostris non'\n+ ' legantur';\n\nbg.setContent(lorem);\n\nscreen.render();\n"
  },
  {
    "path": "test/widget-shrink-fail-2.js",
    "content": "var blessed = require('blessed');\nvar screen = blessed.screen({\n  autoPadding: true,\n  warnings: true\n});\n\nvar tab = blessed.box({\n  parent: screen,\n  top: 2,\n  left: 0,\n  right: 0,\n  bottom: 0,\n  scrollable: true,\n  keys: true,\n  vi: true,\n  alwaysScroll: true,\n  scrollbar: {\n    ch: ' '\n  },\n  style: {\n    scrollbar: {\n      inverse: true\n    }\n  }\n});\n\ntab._.data = blessed.text({\n  parent: tab,\n  top: 0,\n  left: 3,\n  height: 'shrink',\n  width: 'shrink',\n  content: '',\n  tags: true\n});\n\ntab._.data.setContent(require('util').inspect(process, null, 6));\n\nscreen.key('q', function() {\n  screen.destroy();\n});\n\nscreen.render();\n"
  },
  {
    "path": "test/widget-shrink-fail.js",
    "content": "var blessed = require('blessed');\nvar screen = blessed.screen({\n  autoPadding: true,\n  warnings: true\n});\n\nvar tab = blessed.box({\n  parent: screen,\n  top: 2,\n  left: 0,\n  right: 0,\n  bottom: 0,\n  scrollable: true,\n  keys: true,\n  vi: true,\n  alwaysScroll: true,\n  scrollbar: {\n    ch: ' '\n  },\n  style: {\n    scrollbar: {\n      inverse: true\n    }\n  }\n});\n\nvar form = blessed.box({\n  parent: tab,\n  top: 0,\n  left: 1,\n  right: 1,\n  //height: 9,\n  keys: true,\n  mouse: true,\n  // XXX Problem:\n  height: 'shrink',\n  label: ' {blue-fg}Form{/blue-fg} ',\n  border: 'line',\n  tags: true\n});\n\nform._.ftext = blessed.text({\n  parent: form,\n  top: 0,\n  left: 0,\n  height: 1,\n  content: 'Foo',\n  tags: true\n});\n\nform._.foo = blessed.textbox({\n  parent: form,\n  name: 'foo',\n  inputOnFocus: true,\n  top: 0,\n  left: 9,\n  right: 1,\n  height: 1,\n  style: {\n    bg: 'black',\n    focus: {\n      bg: 'blue'\n    },\n    hover: {\n      bg: 'blue'\n    }\n  }\n});\n\nform._.btext = blessed.text({\n  parent: form,\n  top: 2,\n  left: 0,\n  height: 1,\n  content: 'Bar',\n  tags: true\n});\n\nform._.bar = blessed.textbox({\n  parent: form,\n  name: 'bar',\n  inputOnFocus: true,\n  top: 2,\n  left: 9,\n  right: 1,\n  height: 1,\n  style: {\n    bg: 'black',\n    focus: {\n      bg: 'blue'\n    },\n    hover: {\n      bg: 'blue'\n    }\n  }\n});\n\nform._.ztext = blessed.text({\n  parent: form,\n  top: 4,\n  left: 0,\n  height: 1,\n  content: 'Baz',\n  tags: true\n});\n\nform._.baz = blessed.textbox({\n  parent: form,\n  name: 'baz',\n  inputOnFocus: true,\n  top: 4,\n  left: 9,\n  right: 1,\n  height: 1,\n  style: {\n    bg: 'black',\n    focus: {\n      bg: 'blue'\n    },\n    hover: {\n      bg: 'blue'\n    }\n  }\n});\n\nform._.submit = blessed.button({\n  parent: form,\n  name: 'submit',\n  top: 6,\n  right: 1,\n  height: 1,\n  //width: 'shrink',\n  width: 10,\n  content: 'send',\n  tags: true,\n  style: {\n    bg: 'black',\n    focus: {\n      bg: 'blue'\n    },\n    hover: {\n      bg: 'blue'\n    }\n  }\n});\n\nform._.submit.on('press', function() {\n  tabs.send._.form.submit();\n});\n\nform.on('submit', function(data) {\n  screen.leave();\n  console.log(data);\n  screen.destroy();\n});\n\nscreen.key('q', function() {\n  screen.destroy();\n});\n\nscreen.render();\n"
  },
  {
    "path": "test/widget-shrink-padding.js",
    "content": "var blessed = require('../')\n  , screen;\n\nscreen = blessed.screen({\n  dump: __dirname + '/logs/shrink-padding.log',\n  warnings: true\n});\n\nvar outer = blessed.box({\n  parent: screen,\n  //left: 0,\n  //top: 0,\n  //left: '50%',\n  //top: '50%',\n  left: 'center',\n  top: 'center',\n  padding: 1,\n  shrink: true,\n  style: {\n    bg: 'green'\n  }\n});\n\nvar inner = blessed.box({\n  parent: outer,\n  left: 0,\n  top: 0,\n  //width: 5,\n  //height: 5,\n  shrink: true,\n  content: 'foobar',\n  //padding: 1,\n  //content: 'f',\n  style: {\n    bg: 'magenta'\n  }\n});\n\nscreen.key('q', function() {\n  return screen.destroy();\n});\n\nscreen.render();\n"
  },
  {
    "path": "test/widget-table.js",
    "content": "var blessed = require('../')\n  , screen;\n\nscreen = blessed.screen({\n  dump: __dirname + '/logs/table.log',\n  autoPadding: false,\n  fullUnicode: true,\n  warnings: true\n});\n\nvar DU = '杜';\nvar JUAN = '鹃';\n\nvar table = blessed.table({\n  //parent: screen,\n  top: 'center',\n  left: 'center',\n  data: null,\n  border: 'line',\n  align: 'center',\n  tags: true,\n  //width: '80%',\n  width: 'shrink',\n  style: {\n    border: {\n      fg: 'red'\n    },\n    header: {\n      fg: 'blue',\n      bold: true\n    },\n    cell: {\n      fg: 'magenta'\n    }\n  }\n});\n\nvar data1 = [\n  [ 'Animals',  'Foods',  'Times'  ],\n  [ 'Elephant', 'Apple',  '1:00am' ],\n  [ 'Bird',     'Orange', '2:15pm' ],\n  [ 'T-Rex',    'Taco',   '8:45am' ],\n  [ 'Mouse',    'Cheese', '9:05am' ]\n];\n\ndata1[1][0] = '{red-fg}' + data1[1][0] + '{/red-fg}';\ndata1[2][0] += ' (' + DU + JUAN + ')';\n\nvar data2 = [\n  [ 'Animals',  'Foods',  'Times',   'Numbers' ],\n  [ 'Elephant', 'Apple',  '1:00am',  'One'     ],\n  [ 'Bird',     'Orange', '2:15pm',  'Two'     ],\n  [ 'T-Rex',    'Taco',   '8:45am',  'Three'   ],\n  [ 'Mouse',    'Cheese', '9:05am',  'Four'    ]\n];\n\ndata2[1][0] = '{red-fg}' + data2[1][0] + '{/red-fg}';\ndata2[2][0] += ' (' + DU + JUAN + ')';\n\nscreen.key('q', function() {\n  return screen.destroy();\n});\n\ntable.setData(data2);\nscreen.append(table);\nscreen.render();\n\nsetTimeout(function() {\n  table.setData(data1);\n  screen.render();\n}, 3000);\n"
  },
  {
    "path": "test/widget-term-blessed.js",
    "content": "var blessed = require('../');\n\nvar screen = blessed.screen({\n  dump: __dirname + '/logs/termblessed.log',\n  smartCSR: true,\n  warnings: true\n});\n\nvar terminal = blessed.terminal({\n  parent: screen,\n  // cursor: 'line',\n  cursorBlink: true,\n  screenKeys: false,\n  top: 'center',\n  left: 'center',\n  width: '90%',\n  height: '90%',\n  border: 'line',\n  handler: function() {},\n  style: {\n    fg: 'default',\n    bg: 'default',\n    focus: {\n      border: {\n        fg: 'green'\n      }\n    }\n  }\n});\n\nterminal.focus();\n\nvar term = terminal.term;\n\nvar screen2 = blessed.screen({\n  dump: __dirname + '/logs/termblessed2.log',\n  smartCSR: true,\n  warnings: true,\n  input: term,\n  output: term\n});\n\nvar box1 = blessed.box({\n  parent: screen2,\n  top: 'center',\n  left: 'center',\n  width: 20,\n  height: 10,\n  border: 'line',\n  content: 'Hello world'\n});\n\nscreen.key('C-q', function() {\n  // NOTE:\n  // not necessary since screen.destroy causes terminal.term to be destroyed\n  // (screen2's input and output are no longer readable/writable)\n  // screen2.destroy();\n  return screen.destroy();\n});\n\nscreen2.render();\nscreen.render();\n"
  },
  {
    "path": "test/widget-termswitch.js",
    "content": "var blessed = require('../')\n  , screen;\n\nscreen = blessed.screen({\n  dump: __dirname + '/logs/termswitch.log',\n  smartCSR: true,\n  warnings: true\n});\n\nvar lorem = require('fs').readFileSync(__dirname + '/git.diff', 'utf8');\n\nvar btext = blessed.box({\n  parent: screen,\n  left: 'center',\n  top: 'center',\n  width: '80%',\n  height: '80%',\n  style: {\n    bg: 'green'\n  },\n  border: 'line',\n  content: 'CSR should still work.'\n});\n\nvar text = blessed.scrollabletext({\n  parent: screen,\n  content: lorem,\n  border: 'line',\n  left: 'center',\n  top: 'center',\n  draggable: true,\n  width: '50%',\n  height: '50%',\n  mouse: true,\n  keys: true,\n  vi: true\n});\n\ntext.focus();\n\nscreen.key('q', function() {\n  return screen.destroy();\n});\n\nscreen.render();\n\nsetTimeout(function() {\n  // screen.setTerminal('vt100');\n  screen.terminal = 'vt100';\n  screen.render();\n  text.setContent(screen.program._terminal);\n  screen.render();\n}, 1000);\n"
  },
  {
    "path": "test/widget-textarea.js",
    "content": "var blessed = require('../')\n  , screen;\n\nscreen = blessed.screen({\n  dump: __dirname + '/logs/textarea.log',\n  fullUnicode: true,\n  warnings: true\n});\n\nvar box = blessed.textarea({\n  parent: screen,\n  // Possibly support:\n  // align: 'center',\n  style: {\n    bg: 'blue'\n  },\n  height: 'half',\n  width: 'half',\n  top: 'center',\n  left: 'center',\n  tags: true\n});\n\nscreen.render();\n\nscreen.key('q', function() {\n  screen.destroy();\n});\n\nscreen.key('i', function() {\n  box.readInput(function() {});\n});\n\nscreen.key('e', function() {\n  box.readEditor(function() {});\n});\n"
  },
  {
    "path": "test/widget-unicode.js",
    "content": "var fs = require('fs')\n  , blessed = require('../')\n  , unicode = blessed.unicode;\n\nvar screen = blessed.screen({\n  dump: __dirname + '/logs/unicode.log',\n  smartCSR: true,\n  dockBorders: true,\n  useBCE: true,\n  fullUnicode: ~process.argv.indexOf('-') ? false : true,\n  warnings: true\n});\n\n/**\n * Unicode Characters\n */\n\n// var DU = '杜';\nvar DU = unicode.fromCodePoint(0x675C);\n\n// var JUAN = '鹃';\nvar JUAN = unicode.fromCodePoint(0x9E43);\n\n// one flew over the 杜鹃's nest.\n// var DOUBLE = '杜鹃';\nvar DOUBLE = DU + JUAN;\n\n// var SURROGATE_DOUBLE = '𰀀';\n// var SURROGATE_DOUBLE = String.fromCharCode(0xD880, 0xDC00);\n// var SURROGATE_DOUBLE = unicode.fromCodePoint(0x30000);\n\n// var SURROGATE_DOUBLE = '𠀀';\n// var SURROGATE_DOUBLE = String.fromCharCode(0xd840, 0xdc00);\nvar SURROGATE_DOUBLE = unicode.fromCodePoint(0x20000);\n\n// var SURROGATE_DOUBLE = '🉐';\n// var SURROGATE_DOUBLE = String.fromCharCode(0xD83C, 0xDE50);\n// var SURROGATE_DOUBLE = unicode.fromCodePoint(0x1F250);\n\n// var SURROGATE_SINGLE = '𝌆';\n// var SURROGATE_SINGLE = String.fromCharCode(0xD834, 0xDF06);\nvar SURROGATE_SINGLE = unicode.fromCodePoint(0x1D306);\n\n// var COMBINE_NONSURROGATE = 's̀'.substring(1); // s + combining\nvar COMBINE_NONSURROGATE = unicode.fromCodePoint(0x0300);\n\n// var COMBINE = 's𐨁'.substring(1); // s + combining\n// var COMBINE = String.fromCharCode(0xD802, 0xDE01);\nvar COMBINE = unicode.fromCodePoint(0x10A01);\n\n/**\n * Content\n */\n\nvar lorem = fs.readFileSync(__dirname + '/lorem.txt', 'utf8');\n\nlorem = lorem.replace(/e/gi, DOUBLE);\n//lorem = lorem.replace(/e/gi, DU);\n//lorem = lorem.replace(/r/gi, JUAN);\nlorem = lorem.replace(/a/gi, SURROGATE_DOUBLE);\nlorem = lorem.replace(/o/gi, SURROGATE_SINGLE);\nif (~process.argv.indexOf('s')) {\n  lorem = lorem.replace(/s/gi, 's' + COMBINE);\n} else {\n  lorem = lorem.replace('s', 's' + COMBINE);\n}\n\n// Surrogate pair emoticons from the SMP:\nlorem += '\\n';\nlorem += 'emoticons: ';\nfor (var point = 0x1f600; point <= 0x1f64f; point++) {\n  // These are technically single-width,\n  // but they _look_ like they should be\n  // double-width in gnome-terminal (they overlap).\n  var emoticon = unicode.fromCodePoint(point);\n  lorem += emoticon + ' ';\n}\n\n/**\n * UI\n */\n\nvar main = blessed.box({\n  parent: screen,\n  left: 'center',\n  top: 'center',\n  width: '50%',\n  height: '50%',\n  style: {\n    bg: 'grey'\n  },\n  border: 'line',\n  draggable: true,\n  tags: true,\n  // content: '{black-bg}{blue-fg}{bold}' + lorem + '{/}',\n  // XXX {bold} breaks JUAN!\n  content: '{black-bg}{light-blue-fg}' + lorem + '{/}',\n  scrollable: true,\n  alwaysScroll: true,\n  keys: true,\n  vi: true,\n  mouse: true\n});\n\nmain.focus();\n\nscreen.key('q', function() {\n  return screen.destroy();\n});\n\nscreen.render();\n"
  },
  {
    "path": "test/widget-valign.js",
    "content": "var blessed = require('../')\n  , screen;\n\nscreen = blessed.screen({\n  dump: __dirname + '/logs/valign.log',\n  smartCSR: true,\n  autoPadding: false,\n  warnings: true\n});\n\nvar box = blessed.box({\n  parent: screen,\n  top: 'center',\n  left: 'center',\n  width: '50%',\n  height: 5,\n  align: 'center',\n  valign: 'middle',\n  // valign: 'bottom',\n  content: 'Foobar.',\n  border: 'line'\n});\n\nscreen.key('q', function() {\n  return screen.destroy();\n});\n\nscreen.render();\n"
  },
  {
    "path": "test/widget-video.js",
    "content": "var blessed = require('../');\nvar fs = require('fs');\n\nvar screen = blessed.screen({\n  tput: true,\n  smartCSR: true,\n  dump: __dirname + '/logs/video.log',\n  warnings: true\n});\n\nvar video = blessed.video({\n  parent: screen,\n  left: 1,\n  top: 1,\n  width: '90%',\n  height: '90%',\n  border: 'line',\n  file: process.argv[2]\n});\n\nvideo.focus();\n\nscreen.render();\n\nscreen.key(['q', 'C-q', 'C-c'], function() {\n  screen.destroy();\n});\n"
  },
  {
    "path": "test/widget.js",
    "content": "var blessed = require('../')\n  , screen;\n\nscreen = blessed.screen({\n  dump: __dirname + '/logs/widget.log',\n  title: 'widget test',\n  resizeTimeout: 300,\n  dockBorders: true,\n  cursor: {\n    artificial: true,\n    shape: 'line',\n    blink: true,\n    color: null\n  },\n  debug: true,\n  warnings: true\n});\n\nscreen.debugLog.parseTags = true;\nvar logs = '';\nrequire('./tail')(__dirname + '/logs/widget.log').on('line', function(line) {\n  // if (!screen.debugLog.hidden) return;\n  logs += line + '\\n';\n});\nscreen.debugLog.on('show', function() {\n  if (logs) {\n    screen.debug(logs);\n    logs = '';\n  }\n  screen.render();\n});\n\nscreen.on('event', function(event, el) {\n  var type = (el && el.type) || Object.prototype.toString.call(el).slice(8, -1);\n  screen.program.log('emit(\"%s\", {%s})', event, type);\n});\n\nscreen.append(blessed.text({\n  top: 0,\n  left: 2,\n  width: '100%',\n  //bg: 'blue',\n  content: '{green-fg}Welcome{/green-fg} to my {red-fg,ul}program{/red-fg,ul}',\n  style: {\n    bg: '#0000ff'\n  },\n  // bg: blessed.colors.match('#0000ff'),\n  tags: true,\n  align: 'center'\n}));\n\nscreen.append(blessed.line({\n  orientation: 'horizontal',\n  top: 1,\n  left: 0,\n  right: 0\n}));\n\nvar list = blessed.list({\n  align: 'center',\n  mouse: true,\n  label: ' My list ',\n  border: 'line',\n  style: {\n    fg: 'blue',\n    bg: 'default',\n    border: {\n      fg: 'default',\n      bg: 'default'\n    },\n    selected: {\n      bg: 'green'\n    }\n  },\n  width: '50%',\n  height: '50%',\n  top: 'center',\n  left: 'center',\n  tags: true,\n  invertSelected: false,\n  items: [\n    'one',\n    '{red-fg}two{/red-fg}',\n    'three',\n    'four',\n    'five',\n    'six',\n    'seven',\n    'eight',\n    'nine',\n    'ten'\n  ],\n  scrollbar: {\n    ch: ' ',\n    track: {\n      bg: 'yellow'\n    },\n    style: {\n      inverse: true\n    }\n  }\n});\n\nscreen.append(list);\nlist.select(0);\n\nlist.items.forEach(function(item) {\n  item.setHover(item.getText().trim());\n});\n\nvar item = list.items[1];\nlist.removeItem(list.items[1]);\nlist.insertItem(1, item.getContent());\n\nlist.on('keypress', function(ch, key) {\n  if (key.name === 'up' || key.name === 'k') {\n    list.up();\n    screen.render();\n    return;\n  } else if (key.name === 'down' || key.name === 'j') {\n    list.down();\n    screen.render();\n    return;\n  }\n});\n\nlist.on('select', function(item, select) {\n  list.setLabel(' ' + item.getText() + ' ');\n  screen.render();\n});\n\nvar progress = blessed.progressbar({\n  border: 'line',\n  style: {\n    fg: 'blue',\n    bg: 'default',\n    bar: {\n      bg: 'default',\n      fg: 'blue'\n    },\n    border: {\n      fg: 'default',\n      bg: 'default'\n    }\n  },\n  ch: ':',\n  //orientation: 'vertical',\n  //height: 10,\n  //width: 3,\n  width: '50%',\n  height: 3,\n  right: 0,\n  bottom: 0,\n  filled: 50\n});\n\nscreen.append(progress);\n\nvar lorem = 'Lorem ipsum \\x1b[41mdolor sit amet, \\nconsectetur adipisicing elit, \\x1b[43msed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.';\n\nvar lorem = require('fs').readFileSync(__dirname + '/git.diff', 'utf8');\n\n//lorem = lorem.replace(/\\x1b[^m]*m/g, '');\n\nvar stext = blessed.scrollabletext({\n  //padding: 1,\n  mouse: true,\n  content: lorem,\n  border: 'line',\n  style: {\n    fg: 'blue',\n    bg: 'black',\n    border: {\n      fg: 'default',\n      bg: 'default'\n    }\n  },\n  width: '50%',\n  //height: 4,\n  height: 6,\n  left: 0,\n  bottom: 0,\n  scrollbar: {\n    inverse: true\n  }\n});\n\nsetTimeout(function() {\n  stext.width = 0;\n  screen.render();\n  setTimeout(function() {\n    stext.width = '50%';\n    screen.render();\n    setTimeout(function() {\n      stext.height = 0;\n      screen.render();\n      setTimeout(function() {\n        stext.height = 6;\n        screen.render();\n        setTimeout(function() {\n          stext.width = 0;\n          stext.height = 0;\n          screen.render();\n          setTimeout(function() {\n            stext.width = '50%';\n            stext.height = 6;\n            screen.render();\n          }, 1000);\n        }, 1000);\n      }, 1000);\n    }, 1000);\n  }, 1000);\n}, 1000);\n\nscreen.append(stext);\nstext.on('keypress', function(ch, key) {\n  if (key.name === 'up' || key.name === 'k') {\n    stext.scroll(-1);\n    screen.render();\n    return;\n  } else if (key.name === 'down' || key.name === 'j') {\n    stext.scroll(1);\n    screen.render();\n    return;\n  }\n});\n\nscreen.on('element focus', function(cur, old) {\n  if (old.border) old.style.border.fg = 'default';\n  if (cur.border) cur.style.border.fg = 'green';\n  screen.render();\n});\n\nvar input = blessed.textbox({\n  label: ' My Input ',\n  content: '',\n  border: 'line',\n  style: {\n    fg: 'blue',\n    bg: 'default',\n    bar: {\n      bg: 'default',\n      fg: 'blue'\n    },\n    border: {\n      fg: 'default',\n      bg: 'default'\n    }\n  },\n  width: '30%',\n  height: 3,\n  right: 0,\n  top: 2,\n  keys: true,\n  vi: true,\n  mouse: true\n  //inputOnFocus: true\n});\n\ninput.on('submit', function(value) {\n  if (value) screen.children[0].setContent(value);\n  input.clearInput();\n  screen.render();\n});\n\nscreen.append(input);\n\nvar button = blessed.button({\n  //content: 'Click me!',\n  content: 'Click\\nme!',\n  shrink: true,\n  mouse: true,\n  border: 'line',\n  style: {\n    fg: 'red',\n    bg: 'blue'\n  },\n  //height: 3,\n  right: 4,\n  //bottom: 6,\n  bottom: 2,\n  padding: 0\n});\n\nbutton.on('press', function() {\n  button.setContent('Clicked!');\n  screen.render();\n});\n\nscreen.append(button);\n\nscreen.key('S-s', function() {\n  var rand = function(min, max) {\n    return Math.floor(Math.random() * (max - min)) + min;\n  };\n  var xi = rand(0, screen.cols - (stext.width - stext.iwidth));\n  var xl = xi + stext.width - stext.iwidth;\n  var yi = rand(0, screen.rows - (stext.height - stext.iheight));\n  var yl = yi + stext.height - stext.iheight;\n  stext.wrap = false;\n  stext.setContent(screen.screenshot(xi, xl, yi, xl));\n  screen.render();\n});\n\nscreen.on('keypress', function(ch, key) {\n  if (key.name === 'tab') {\n    return key.shift\n      ? screen.focusPrevious()\n      : screen.focusNext();\n  }\n  if (key.name === 'escape' || key.name === 'q') {\n    return process.exit(0);\n  }\n});\n\nscreen.key('C-z', function() {\n  screen.sigtstp();\n});\n\nlist.focus();\n\nscreen.render();\n\nsetInterval(function() {\n  progress.toggle();\n  screen.render();\n}, 2000);\n\n(function fill() {\n  if (progress.filled === 100) {\n    progress.reset();\n  }\n  progress.progress(2);\n  progress.atop -= 2;\n  screen.render();\n  setTimeout(fill, 300);\n})();\n"
  },
  {
    "path": "usr/fonts/AUTHORS",
    "content": "Dimitar Zhekov <dimitar.zhekov@gmail.com>\n"
  },
  {
    "path": "usr/fonts/LICENSE",
    "content": "Copyright (c) 2014 Dimitar Toshkov Zhekov,\r\nwith Reserved Font Name \"Terminus Font\".\r\n\r\nThis Font Software is licensed under the SIL Open Font License, Version 1.1.\r\nThis license is copied below, and is also available with a FAQ at:\r\nhttp://scripts.sil.org/OFL\r\n\r\n\r\n-----------------------------------------------------------\r\nSIL OPEN FONT LICENSE Version 1.1 - 26 February 2007\r\n-----------------------------------------------------------\r\n\r\nPREAMBLE\r\nThe goals of the Open Font License (OFL) are to stimulate worldwide\r\ndevelopment of collaborative font projects, to support the font creation\r\nefforts of academic and linguistic communities, and to provide a free and\r\nopen framework in which fonts may be shared and improved in partnership\r\nwith others.\r\n\r\nThe OFL allows the licensed fonts to be used, studied, modified and\r\nredistributed freely as long as they are not sold by themselves. The\r\nfonts, including any derivative works, can be bundled, embedded, \r\nredistributed and/or sold with any software provided that any reserved\r\nnames are not used by derivative works. The fonts and derivatives,\r\nhowever, cannot be released under any other type of license. The\r\nrequirement for fonts to remain under this license does not apply\r\nto any document created using the fonts or their derivatives.\r\n\r\nDEFINITIONS\r\n\"Font Software\" refers to the set of files released by the Copyright\r\nHolder(s) under this license and clearly marked as such. This may\r\ninclude source files, build scripts and documentation.\r\n\r\n\"Reserved Font Name\" refers to any names specified as such after the\r\ncopyright statement(s).\r\n\r\n\"Original Version\" refers to the collection of Font Software components as\r\ndistributed by the Copyright Holder(s).\r\n\r\n\"Modified Version\" refers to any derivative made by adding to, deleting,\r\nor substituting -- in part or in whole -- any of the components of the\r\nOriginal Version, by changing formats or by porting the Font Software to a\r\nnew environment.\r\n\r\n\"Author\" refers to any designer, engineer, programmer, technical\r\nwriter or other person who contributed to the Font Software.\r\n\r\nPERMISSION & CONDITIONS\r\nPermission is hereby granted, free of charge, to any person obtaining\r\na copy of the Font Software, to use, study, copy, merge, embed, modify,\r\nredistribute, and sell modified and unmodified copies of the Font\r\nSoftware, subject to the following conditions:\r\n\r\n1) Neither the Font Software nor any of its individual components,\r\nin Original or Modified Versions, may be sold by itself.\r\n\r\n2) Original or Modified Versions of the Font Software may be bundled,\r\nredistributed and/or sold with any software, provided that each copy\r\ncontains the above copyright notice and this license. These can be\r\nincluded either as stand-alone text files, human-readable headers or\r\nin the appropriate machine-readable metadata fields within text or\r\nbinary files as long as those fields can be easily viewed by the user.\r\n\r\n3) No Modified Version of the Font Software may use the Reserved Font\r\nName(s) unless explicit written permission is granted by the corresponding\r\nCopyright Holder. This restriction only applies to the primary font name as\r\npresented to the users.\r\n\r\n4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font\r\nSoftware shall not be used to promote, endorse or advertise any\r\nModified Version, except to acknowledge the contribution(s) of the\r\nCopyright Holder(s) and the Author(s) or with their explicit written\r\npermission.\r\n\r\n5) The Font Software, modified or unmodified, in part or in whole,\r\nmust be distributed entirely under this license, and must not be\r\ndistributed under any other license. The requirement for fonts to\r\nremain under this license does not apply to any document created\r\nusing the Font Software.\r\n\r\nTERMINATION\r\nThis license becomes null and void if any of the above conditions are\r\nnot met.\r\n\r\nDISCLAIMER\r\nTHE FONT SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\r\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF\r\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT\r\nOF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE\r\nCOPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\r\nINCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL\r\nDAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\r\nFROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM\r\nOTHER DEALINGS IN THE FONT SOFTWARE.\r\n"
  },
  {
    "path": "usr/fonts/README",
    "content": "NOTE: This directory contains the terminus font compiled to a JSON format.\n\nContents:\n\n1. About.\n1.1. Quick installation.\n1.2. Legend.\n1.3. Variants.\n1.4. Notes.\n\n2. Linux console.\n2.1. consoletools.\n2.2. kbd.\n2.3. Quick reference.\n2.4. Legend.\n2.5. Notes.\n\n3. UNIX console.\n3.1. bsd-pcvt.\n3.2. Legend.\n3.3. Notes.\n\n4. X11 Window System.\n4.1. Installation.\n4.2. Notes.\n\n5. Frequently Asked Questions.\n\n6. Legal information.\n6.1. Licenses.\n6.2. Copyright.\n\n\n1. About.\n\nThis archive contains source code for generating and installing Terminus\nFont for Linux console, BSD console and X11 Window System.\n\n- version\t4.39\n- sizes\t\t6x12, 8x14, 8x16, 10x18, 10x20, 11x22, 12x24, 14x28, 16x32\n- styles\tnormal, bold, EGA/VGA bold\n- characters\t891\n- format\tBitmap Distribution Format (BDF) version 2.1\n\nThe character set covers about 120 language sets and supports ISO8859-1/2/5/\n7/9/13/15/16, Paratype-PT154/PT254, KOI8-R/U/E/F, Esperanto and many IBM,\nWindows and Macintosh code pages, as well as the IBM VGA, vt100 and xterm\npseudographic characters.\n\n1.1. Quick installation.\n\nThe commands:\n\n$ ./configure [--prefix=PREFIX]\n$ make\n# make install fontdir\n\ncompile and install the Linux console and X11 Window System fonts.\nThe default PREFIX is /usr/local.\n\n1.2. Legend.\n\nThe file names are structured as follows:\n\nter-u<SIZE><STYLE>.bdf\n\nwhere <SIZE> is the font height, and <STYLE> is n for normal (all sizes), b\nfor bold (all sizes except 6x12) and v for EGA/VGA bold (8x14 and 8x16 only,\nmakes use of the eight character matrix column).\n\n1.3. Variants.\n\nSome characters are implemented in two variants. To use the alternate\nvariant, execute:\n\n$ patch -p1 -i alt/<NAME>.diff\n\nbefore installation. See the font page for examples about the differences.\nIf you want to combine hi2 with dv1 and/or ka2, apply hi2 and then hi2-dv1\nand/or hi2-ka2.\n\n1.4. Notes.\n\nThe commands marked with $ can be executed by a regular user.\nThe configure commands are optional.\nThe make commands require GNU make.\n\nA lot of characters are available only under X11/ISO10646-1 (UTF+8/Unicode).\n\nSizes 6x12, 11x22, 14x28-bold and 16x32-normal are worse than the others.\nAvoid them.\n\n210E and 210F are not italic.\n\n\n2. Linux console.\n\n- sizes\t\tall available, see \"About\"\n- styles\tnormal, bold, framebuffer-bold\n- code pages\tISO8859-1/ISO8859-15/Windows-1252, ISO8859-2/Windows-1250,\n\t\tWindows-1251/ISO8859-5, ISO8859-9/Windows-1254, ISO8859-16,\n\t\tISO8859-7/Windows-1253, ISO8859-13/Windows-1257, IBM-437,\n\t\tBulgarian-MIK, KOI8-R, KOI8-U, Paratype-PT154, combined\n- format\tPC Screen Font (PSF) with unicode data\n\n2.1. consoletools.\n\n$ ./configure [--prefix=PREFIX | --psfdir=DIRECTORY]\n$ make psf\n# make install-psf\n\nThe files are compressed with gzip and installed in DIRECTORY. The default\nDIRECTORY is PREFIX/share/consolefonts. Requires Perl.\n\nIf you lack mappings for Windows-1252/1250/1251/1254/1253/1257, ISO8859-16,\nIBM-437, KOI8-R, Bulgarian-MIK or Paratype-PT154/PT254, also run:\n\n$ ./configure [--prefix=PREFIX | --acmdir=DIRECTORY]\n$ make txt\n# make install-acm\n\nThe default DIRECTORY is PREFIX/share/consoletrans. Requires awk.\nUninstallation of the mappings is not supported. To load a font:\n\n$ consolechars [-m MAPPING] -f ter-<X><SIZE><STYLE>\n\nwhere <X> is a character identifying the code page as listed in p.2.4.\n\n2.2. kbd.\n\n$ ./configure [--psfdir=DIRECTORY]\n$ make psf\n# make install-psf\n\nwhere DIRECTORY should be either PREFIX/lib/kbd/consolefonts or\nPREFIX/share/kbd/consolefonts, depending on kbd version. Missing mappings\nare installed with:\n\n$ ./configure [--prefix=PREFIX | --unidir=DIRECTORY]\n$ make txt\n# make install-uni\n\nThe default DIRECTORY is PREFIX/share/kbd/consoletrans. Requires awk. To\nload a font:\n\n$ setfont [-m MAPPING] ter-<X><SIZE><STYLE>\n\nwhere <X> is a character identifying the code page as listed in p.2.4.\n\n2.3. Quick reference.\n\nThe commands:\n\n$ ./configure [--prefix=PREFIX | --psfdir=DIRECTORY | --ref=FILENAME]\n# make install-ref\n\ninstall the text from p.2.4 as FILENAME (the default is README.terminus)\nin DIRECTORY.\n\n2.4. Legend.\n\nnames\tmappings\t\tcovered codepage(s)\n\nter-1*\tiso01, iso15, cp1252\tISO8859-1, ISO8859-15, Windows-1252\nter-2*\tiso02, cp1250\t\tISO8859-2, Windows-1250\nter-7*\tiso07, cp1253\t\tISO8859-7, Windows-1253\nter-9*\tiso09, cp1254\t\tISO8859-9, Windows-1254\nter-c*\tcp1251, iso05\t\tWindows-1251, ISO8859-5\nter-d*\tiso13, cp1257\t\tISO8859-13, Windows-1257\nter-g*\tiso16\t\t\tISO8859-16\nter-i*\tcp437\t\t\tIBM-437\nter-k*\tkoi8r\t\t\tKOI8-R\nter-m*\tmik\t\t\tBulgarian-MIK\nter-p*\tpt154\t\t\tParatype-PT154\nter-u*\tkoi8u\t\t\tKOI8-U\nter-v*\tall listed above\tall listed above and many others (about 110\n\tand many others\t\tlanguage sets), 8 foreground colors\n\nnames\tstyle\n\nter-*n\tnormal\nter-*b\tbold\nter-*f\tframebuffer-bold\n\n2.5. Notes.\n\nThe combined code page is based on IBM-437 (character 0xFF is ogonek).\nThe ISO8859-16 font also includes all letters and accents from Windows-1250.\n\n\n3. UNIX console.\n\n- sizes\t\t8x14 and 8x16 only\n- styles\tnormal, bold, framebuffer-bold\n- code pages\tISO8859-1/Windows-1252, ISO8859-2, ISO8859-5, ISO8859-7,\n\t\tISO8859-9/Windows-1254, ISO8859-13, ISO8859-15, ISO8859-16,\n\t\tWindows-1251, IBM-437, KOI8-R, KOI8-U, Paratype-PT154\n- format\traw data\n\n3.1. bsd-pcvt.\n\n$ ./configure [--prefix=PREFIX | --rawdir=DIRECTORY]\n$ make raw\n# make install.raw\n\nor, for file names with minus instead of period:\n\n# make install-raw\n\nThe default DIRECTORY is PREFIX/share/misc/pcvtfonts. The fonts are\ninstalled uncompressed. Requires Perl. To load a font:\n\n$ loadfont -f /usr/share/misc/pcvtfonts/ter-<X><STYLE>.8<SIZE>\n\nor, for file names with minus instead of period:\n\n$ loadfont -f /usr/share/misc/pcvtfonts/ter-<X><STYLE>-8x<SIZE>\n\nwhere <X> is a character identifying the code page as listed in p.3.2.\n\n3.2. Legend.\n\nnames\tcovered codepage(s)\n\nter-1*\tISO8859-1, Windows-1252\nter-2*\tISO8859-2\nter-5*\tISO8859-5\nter-7*\tISO8859-7\nter-9*\tISO8859-9, Windows-1254\nter-c*\tWindows-1251\nter-d*\tISO8859-13\nter-f*\tISO8859-15\nter-g*\tISO8859-16\nter-i*\tIBM-437\nter-k*\tKOI8-R\nter-p*\tParatype-PT154\nter-u*\tKOI8-U\n\nnames\tstyle\n\nter-*n\tnormal\nter-*b\tbold\nter-*f\tframebuffer-bold\n\n3.3. Notes.\n\nThe RAW font contains data only and should be compatible with all UNIX\nsystems. If any of the bold fonts doesn't look good try framebuffer-bold,\nor, if you are using an EGA/VGA adapter, program it to to clear column 8 of\nthe character matrix (attribute controller register 0x10 bit 0x02).\n\n\n4. X11 Window System.\n\n- sizes\t\tall available, see \"About\"\n- styles\tnormal, bold\n- code pages\tISO8859-1/Windows-1252, ISO8859-2, ISO8859-5, ISO8859-7,\n\t\tISO8859-9/Windows-1254, ISO8859-13, ISO8859-15, ISO8859-16,\n\t\tWindows-1251, KOI8-R, KOI8-U, Paratype-PT154, ISO10646-1\n- format\tPortable Compiled Font (PCF)\n\n4.1. Installation.\n\n$ ./configure [--prefix=PREFIX | --x11dir=DIRECTORY]\n$ make pcf\n# make install-pcf\n\nThe files are compressed with gzip and installed in DIRECTORY. The default\nDIRECTORY is PREFIX/share/fonts/terminus. Requires Perl and bdftopcf.\n\nA copy of the normal 6x12 font is installed as \"bold\", because some X11\nlibraries and applications substitute the missing bold fonts by shifting the\nnormal fonts, and others do not recognize the bold style at all if the\nlowest font size lacks it. To install only the normal font, use \"n12\"\ninstead of \"pcf\" in the above commands.\n\nTo update the font cache in DIRECTORY after (un)installation, run:\n\n# make fontdir\n\nThe configuration file which lists the font directories must contain\nDIRECTORY. If xfs or the X-server were active during the installation, they\nshould be restarted so the font list can be updated.\n\n4.2. Notes.\n\nThe ISO8859-1 and ISO8859-9 fonts contain the Windows Western characters and\ncan be used as Windows-1252 and Windows-1254 respectively.\n\n\n5. Frequently Asked Questions.\n\nQ. Italic version?\n\nA. No. The quality is significantly lower, and preserving the font width\nrequires overlapping characters, which are not handled very well by X11/Xft.\nIf you need it than much, try mkitalic from FreeBSD or bdfslant from Debian.\n\nQ. Scalable version?\n\nA. Long story short, when the average display resolution becomes at least\n150 DPI. Prefferably 200.\n\nQ. How about some new characters?\n\nA. Contact me and be ready to help.\n\nQ. The bold 6x12 font...\n\nA. ...does not exist, there is no space for a bold font in a 6x12 matrix.\nHowever, the \"normal\" font is somewhere between.\n\nQ. The font works in X11/Motif, but not in GNOME/KDE/Xfce.\n\nA. Try adding 75-yes-terminus.conf to the Fontconfig configuration files.\nSee also mkfontscale(1), mkfontdir(1), fc-cache(1), xorg.conf(5), xfs(1),\nxlsfonts(1), fonts-conf(5) etc.\n\n\n6. Legal information.\n\n6.1. Licenses.\n\nTerminus Font is licensed under the SIL Open Font License, Version 1.1.\nThe license is included as OFL.TXT, and is also available with a FAQ at:\nhttp://scripts.sil.org/OFL\n\nThe files configure, configure.help, bdftopsf.pl and ucstoany.pl are\ndistributed under the GNU General Public License version 2.0 or (at your\nchoice) any later version.\n\n\n6.2. Copyright.\n\nTerminus Font 4.39, Copyright (C) 2014 Dimitar Toshkov Zhekov.\nReport bugs to <dimitar.zhekov@gmail.com>\n\n\nThanks to Anton Zinoviev, Tim Allen, Kir Koliushkin, Antonios Galanopoulos\nand all the others who helped.\n"
  },
  {
    "path": "usr/fonts/ter-u14b.json",
    "content": "{\n  \"width\": 8,\n  \"height\": 14,\n  \"glyphs\": {\n    \"0\": {\n      \"ch\": \"0\",\n      \"code\": 48,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \" -----  \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--  --- \",\n        \"-- ---- \",\n        \"---- -- \",\n        \"---  -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \" -----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"1\": {\n      \"ch\": \"1\",\n      \"code\": 49,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"   --   \",\n        \"  ---   \",\n        \" ----   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \" ------ \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"2\": {\n      \"ch\": \"2\",\n      \"code\": 50,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \" -----  \",\n        \"--   -- \",\n        \"--   -- \",\n        \"     -- \",\n        \"    --  \",\n        \"   --   \",\n        \"  --    \",\n        \" --     \",\n        \"--      \",\n        \"------- \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"3\": {\n      \"ch\": \"3\",\n      \"code\": 51,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \" -----  \",\n        \"--   -- \",\n        \"--   -- \",\n        \"     -- \",\n        \"  ----  \",\n        \"     -- \",\n        \"     -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \" -----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"4\": {\n      \"ch\": \"4\",\n      \"code\": 52,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"     -- \",\n        \"    --- \",\n        \"   ---- \",\n        \"  -- -- \",\n        \" --  -- \",\n        \"--   -- \",\n        \"------- \",\n        \"     -- \",\n        \"     -- \",\n        \"     -- \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"5\": {\n      \"ch\": \"5\",\n      \"code\": 53,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"------- \",\n        \"--      \",\n        \"--      \",\n        \"--      \",\n        \"------  \",\n        \"     -- \",\n        \"     -- \",\n        \"     -- \",\n        \"--   -- \",\n        \" -----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"6\": {\n      \"ch\": \"6\",\n      \"code\": 54,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"  ----  \",\n        \" --     \",\n        \"--      \",\n        \"--      \",\n        \"------  \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \" -----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"7\": {\n      \"ch\": \"7\",\n      \"code\": 55,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"------- \",\n        \"     -- \",\n        \"     -- \",\n        \"    --  \",\n        \"    --  \",\n        \"   --   \",\n        \"   --   \",\n        \"  --    \",\n        \"  --    \",\n        \"  --    \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"8\": {\n      \"ch\": \"8\",\n      \"code\": 56,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \" -----  \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \" -----  \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \" -----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"9\": {\n      \"ch\": \"9\",\n      \"code\": 57,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \" -----  \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \" ------ \",\n        \"     -- \",\n        \"     -- \",\n        \"    --  \",\n        \" ----   \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"\\u0000\": {\n      \"ch\": \"\\u0000\",\n      \"code\": 0,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"--- --- \",\n        \"--   -- \",\n        \"        \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"        \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--- --- \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \" \": {\n      \"ch\": \" \",\n      \"code\": 32,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"!\": {\n      \"ch\": \"!\",\n      \"code\": 33,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"        \",\n        \"   --   \",\n        \"   --   \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"\\\"\": {\n      \"ch\": \"\\\"\",\n      \"code\": 34,\n      \"map\": [\n        \"        \",\n        \" --  -- \",\n        \" --  -- \",\n        \" --  -- \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"#\": {\n      \"ch\": \"#\",\n      \"code\": 35,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \" -- --  \",\n        \" -- --  \",\n        \" -- --  \",\n        \"------- \",\n        \" -- --  \",\n        \" -- --  \",\n        \"------- \",\n        \" -- --  \",\n        \" -- --  \",\n        \" -- --  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"$\": {\n      \"ch\": \"$\",\n      \"code\": 36,\n      \"map\": [\n        \"        \",\n        \"   -    \",\n        \"   -    \",\n        \" -----  \",\n        \"-- - -- \",\n        \"-- -    \",\n        \"-- -    \",\n        \" -----  \",\n        \"   - -- \",\n        \"   - -- \",\n        \"-- - -- \",\n        \" -----  \",\n        \"   -    \",\n        \"   -    \"\n      ]\n    },\n    \"%\": {\n      \"ch\": \"%\",\n      \"code\": 37,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \" --  -- \",\n        \"-- - -- \",\n        \" -- --  \",\n        \"    --  \",\n        \"   --   \",\n        \"   --   \",\n        \"  --    \",\n        \"  -- -- \",\n        \" -- - --\",\n        \" --  -- \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"&\": {\n      \"ch\": \"&\",\n      \"code\": 38,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"  ---   \",\n        \" -- --  \",\n        \" -- --  \",\n        \"  ---   \",\n        \" --- -- \",\n        \"-- ---  \",\n        \"--  --  \",\n        \"--  --  \",\n        \"-- ---  \",\n        \" --- -- \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"'\": {\n      \"ch\": \"'\",\n      \"code\": 39,\n      \"map\": [\n        \"        \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"(\": {\n      \"ch\": \"(\",\n      \"code\": 40,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"    --  \",\n        \"   --   \",\n        \"  --    \",\n        \"  --    \",\n        \"  --    \",\n        \"  --    \",\n        \"  --    \",\n        \"  --    \",\n        \"   --   \",\n        \"    --  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \")\": {\n      \"ch\": \")\",\n      \"code\": 41,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"  --    \",\n        \"   --   \",\n        \"    --  \",\n        \"    --  \",\n        \"    --  \",\n        \"    --  \",\n        \"    --  \",\n        \"    --  \",\n        \"   --   \",\n        \"  --    \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"*\": {\n      \"ch\": \"*\",\n      \"code\": 42,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \" -- --  \",\n        \"  ---   \",\n        \"------- \",\n        \"  ---   \",\n        \" -- --  \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"+\": {\n      \"ch\": \"+\",\n      \"code\": 43,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"   --   \",\n        \"   --   \",\n        \" ------ \",\n        \"   --   \",\n        \"   --   \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \",\": {\n      \"ch\": \",\",\n      \"code\": 44,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"   --   \",\n        \"   --   \",\n        \"  --    \",\n        \"        \"\n      ]\n    },\n    \"-\": {\n      \"ch\": \"-\",\n      \"code\": 45,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"------- \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \".\": {\n      \"ch\": \".\",\n      \"code\": 46,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"   --   \",\n        \"   --   \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"/\": {\n      \"ch\": \"/\",\n      \"code\": 47,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"     -- \",\n        \"     -- \",\n        \"    --  \",\n        \"    --  \",\n        \"   --   \",\n        \"   --   \",\n        \"  --    \",\n        \"  --    \",\n        \" --     \",\n        \" --     \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \":\": {\n      \"ch\": \":\",\n      \"code\": 58,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"   --   \",\n        \"   --   \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"   --   \",\n        \"   --   \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \";\": {\n      \"ch\": \";\",\n      \"code\": 59,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"   --   \",\n        \"   --   \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"   --   \",\n        \"   --   \",\n        \"  --    \",\n        \"        \"\n      ]\n    },\n    \"<\": {\n      \"ch\": \"<\",\n      \"code\": 60,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"     -- \",\n        \"    --  \",\n        \"   --   \",\n        \"  --    \",\n        \" --     \",\n        \"  --    \",\n        \"   --   \",\n        \"    --  \",\n        \"     -- \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"=\": {\n      \"ch\": \"=\",\n      \"code\": 61,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"------- \",\n        \"        \",\n        \"        \",\n        \"------- \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \">\": {\n      \"ch\": \">\",\n      \"code\": 62,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \" --     \",\n        \"  --    \",\n        \"   --   \",\n        \"    --  \",\n        \"     -- \",\n        \"    --  \",\n        \"   --   \",\n        \"  --    \",\n        \" --     \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"?\": {\n      \"ch\": \"?\",\n      \"code\": 63,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \" -----  \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"    --  \",\n        \"   --   \",\n        \"   --   \",\n        \"        \",\n        \"   --   \",\n        \"   --   \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"@\": {\n      \"ch\": \"@\",\n      \"code\": 64,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \" -----  \",\n        \"--   -- \",\n        \"--  --- \",\n        \"-- - -- \",\n        \"-- - -- \",\n        \"-- - -- \",\n        \"-- - -- \",\n        \"--  --- \",\n        \"--      \",\n        \" ------ \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"A\": {\n      \"ch\": \"A\",\n      \"code\": 65,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \" -----  \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"------- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"B\": {\n      \"ch\": \"B\",\n      \"code\": 66,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"------  \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"------  \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"------  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"C\": {\n      \"ch\": \"C\",\n      \"code\": 67,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \" -----  \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--      \",\n        \"--      \",\n        \"--      \",\n        \"--      \",\n        \"--   -- \",\n        \"--   -- \",\n        \" -----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"D\": {\n      \"ch\": \"D\",\n      \"code\": 68,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"-----   \",\n        \"--  --  \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--  --  \",\n        \"-----   \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"E\": {\n      \"ch\": \"E\",\n      \"code\": 69,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"------- \",\n        \"--      \",\n        \"--      \",\n        \"--      \",\n        \"-----   \",\n        \"--      \",\n        \"--      \",\n        \"--      \",\n        \"--      \",\n        \"------- \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"F\": {\n      \"ch\": \"F\",\n      \"code\": 70,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"------- \",\n        \"--      \",\n        \"--      \",\n        \"--      \",\n        \"-----   \",\n        \"--      \",\n        \"--      \",\n        \"--      \",\n        \"--      \",\n        \"--      \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"G\": {\n      \"ch\": \"G\",\n      \"code\": 71,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \" -----  \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--      \",\n        \"--      \",\n        \"-- ---- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \" -----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"H\": {\n      \"ch\": \"H\",\n      \"code\": 72,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"------- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"I\": {\n      \"ch\": \"I\",\n      \"code\": 73,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"  ----  \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"  ----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"J\": {\n      \"ch\": \"J\",\n      \"code\": 74,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"   ---- \",\n        \"    --  \",\n        \"    --  \",\n        \"    --  \",\n        \"    --  \",\n        \"    --  \",\n        \"    --  \",\n        \"--  --  \",\n        \"--  --  \",\n        \" ----   \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"K\": {\n      \"ch\": \"K\",\n      \"code\": 75,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--  --  \",\n        \"-- --   \",\n        \"----    \",\n        \"----    \",\n        \"-- --   \",\n        \"--  --  \",\n        \"--   -- \",\n        \"--   -- \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"L\": {\n      \"ch\": \"L\",\n      \"code\": 76,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"--      \",\n        \"--      \",\n        \"--      \",\n        \"--      \",\n        \"--      \",\n        \"--      \",\n        \"--      \",\n        \"--      \",\n        \"--      \",\n        \"------- \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"M\": {\n      \"ch\": \"M\",\n      \"code\": 77,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"-     - \",\n        \"--   -- \",\n        \"--- --- \",\n        \"------- \",\n        \"-- - -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"N\": {\n      \"ch\": \"N\",\n      \"code\": 78,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"---  -- \",\n        \"---- -- \",\n        \"-- ---- \",\n        \"--  --- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"O\": {\n      \"ch\": \"O\",\n      \"code\": 79,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \" -----  \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \" -----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"P\": {\n      \"ch\": \"P\",\n      \"code\": 80,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"------  \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"------  \",\n        \"--      \",\n        \"--      \",\n        \"--      \",\n        \"--      \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Q\": {\n      \"ch\": \"Q\",\n      \"code\": 81,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \" -----  \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"-- ---- \",\n        \" -----  \",\n        \"     -- \",\n        \"        \"\n      ]\n    },\n    \"R\": {\n      \"ch\": \"R\",\n      \"code\": 82,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"------  \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"------  \",\n        \"----    \",\n        \"-- --   \",\n        \"--  --  \",\n        \"--   -- \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"S\": {\n      \"ch\": \"S\",\n      \"code\": 83,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \" -----  \",\n        \"--   -- \",\n        \"--      \",\n        \"--      \",\n        \" -----  \",\n        \"     -- \",\n        \"     -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \" -----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"T\": {\n      \"ch\": \"T\",\n      \"code\": 84,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"--------\",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"U\": {\n      \"ch\": \"U\",\n      \"code\": 85,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \" -----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"V\": {\n      \"ch\": \"V\",\n      \"code\": 86,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \" -- --  \",\n        \" -- --  \",\n        \" -- --  \",\n        \"  ---   \",\n        \"  ---   \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"W\": {\n      \"ch\": \"W\",\n      \"code\": 87,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"-- - -- \",\n        \"------- \",\n        \"--- --- \",\n        \"--   -- \",\n        \"-     - \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"X\": {\n      \"ch\": \"X\",\n      \"code\": 88,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"--   -- \",\n        \"--   -- \",\n        \" -- --  \",\n        \" -- --  \",\n        \"  ---   \",\n        \"  ---   \",\n        \" -- --  \",\n        \" -- --  \",\n        \"--   -- \",\n        \"--   -- \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Y\": {\n      \"ch\": \"Y\",\n      \"code\": 89,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"--    --\",\n        \"--    --\",\n        \" --  -- \",\n        \" --  -- \",\n        \"  ----  \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Z\": {\n      \"ch\": \"Z\",\n      \"code\": 90,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"------- \",\n        \"     -- \",\n        \"     -- \",\n        \"    --  \",\n        \"   --   \",\n        \"  --    \",\n        \" --     \",\n        \"--      \",\n        \"--      \",\n        \"------- \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"[\": {\n      \"ch\": \"[\",\n      \"code\": 91,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"  ----  \",\n        \"  --    \",\n        \"  --    \",\n        \"  --    \",\n        \"  --    \",\n        \"  --    \",\n        \"  --    \",\n        \"  --    \",\n        \"  --    \",\n        \"  ----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"\\\\\": {\n      \"ch\": \"\\\\\",\n      \"code\": 92,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \" --     \",\n        \" --     \",\n        \"  --    \",\n        \"  --    \",\n        \"   --   \",\n        \"   --   \",\n        \"    --  \",\n        \"    --  \",\n        \"     -- \",\n        \"     -- \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"]\": {\n      \"ch\": \"]\",\n      \"code\": 93,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"  ----  \",\n        \"    --  \",\n        \"    --  \",\n        \"    --  \",\n        \"    --  \",\n        \"    --  \",\n        \"    --  \",\n        \"    --  \",\n        \"    --  \",\n        \"  ----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"^\": {\n      \"ch\": \"^\",\n      \"code\": 94,\n      \"map\": [\n        \"        \",\n        \"   --   \",\n        \"  ----  \",\n        \" --  -- \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"_\": {\n      \"ch\": \"_\",\n      \"code\": 95,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"------- \",\n        \"        \"\n      ]\n    },\n    \"`\": {\n      \"ch\": \"`\",\n      \"code\": 96,\n      \"map\": [\n        \"  --    \",\n        \"   --   \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"a\": {\n      \"ch\": \"a\",\n      \"code\": 97,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \" -----  \",\n        \"     -- \",\n        \" ------ \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \" ------ \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"b\": {\n      \"ch\": \"b\",\n      \"code\": 98,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"--      \",\n        \"--      \",\n        \"--      \",\n        \"------  \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"------  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"c\": {\n      \"ch\": \"c\",\n      \"code\": 99,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \" -----  \",\n        \"--   -- \",\n        \"--      \",\n        \"--      \",\n        \"--      \",\n        \"--   -- \",\n        \" -----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"d\": {\n      \"ch\": \"d\",\n      \"code\": 100,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"     -- \",\n        \"     -- \",\n        \"     -- \",\n        \" ------ \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \" ------ \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"e\": {\n      \"ch\": \"e\",\n      \"code\": 101,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \" -----  \",\n        \"--   -- \",\n        \"--   -- \",\n        \"------- \",\n        \"--      \",\n        \"--      \",\n        \" -----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"f\": {\n      \"ch\": \"f\",\n      \"code\": 102,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"   ---- \",\n        \"  --    \",\n        \"  --    \",\n        \"------  \",\n        \"  --    \",\n        \"  --    \",\n        \"  --    \",\n        \"  --    \",\n        \"  --    \",\n        \"  --    \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"g\": {\n      \"ch\": \"g\",\n      \"code\": 103,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \" ------ \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \" ------ \",\n        \"     -- \",\n        \" -----  \"\n      ]\n    },\n    \"h\": {\n      \"ch\": \"h\",\n      \"code\": 104,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"--      \",\n        \"--      \",\n        \"--      \",\n        \"------  \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"i\": {\n      \"ch\": \"i\",\n      \"code\": 105,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"   --   \",\n        \"   --   \",\n        \"        \",\n        \"  ---   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"  ----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"j\": {\n      \"ch\": \"j\",\n      \"code\": 106,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"     -- \",\n        \"     -- \",\n        \"        \",\n        \"    --- \",\n        \"     -- \",\n        \"     -- \",\n        \"     -- \",\n        \"     -- \",\n        \"     -- \",\n        \" --  -- \",\n        \" --  -- \",\n        \"  ----  \"\n      ]\n    },\n    \"k\": {\n      \"ch\": \"k\",\n      \"code\": 107,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"--      \",\n        \"--      \",\n        \"--      \",\n        \"--   -- \",\n        \"--  --  \",\n        \"-- --   \",\n        \"----    \",\n        \"-- --   \",\n        \"--  --  \",\n        \"--   -- \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"l\": {\n      \"ch\": \"l\",\n      \"code\": 108,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"  ---   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"  ----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"m\": {\n      \"ch\": \"m\",\n      \"code\": 109,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"------  \",\n        \"-- - -- \",\n        \"-- - -- \",\n        \"-- - -- \",\n        \"-- - -- \",\n        \"-- - -- \",\n        \"-- - -- \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"n\": {\n      \"ch\": \"n\",\n      \"code\": 110,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"------  \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"o\": {\n      \"ch\": \"o\",\n      \"code\": 111,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \" -----  \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \" -----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"p\": {\n      \"ch\": \"p\",\n      \"code\": 112,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"------  \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"------  \",\n        \"--      \",\n        \"--      \"\n      ]\n    },\n    \"q\": {\n      \"ch\": \"q\",\n      \"code\": 113,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \" ------ \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \" ------ \",\n        \"     -- \",\n        \"     -- \"\n      ]\n    },\n    \"r\": {\n      \"ch\": \"r\",\n      \"code\": 114,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"-- ---- \",\n        \"----    \",\n        \"---     \",\n        \"--      \",\n        \"--      \",\n        \"--      \",\n        \"--      \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"s\": {\n      \"ch\": \"s\",\n      \"code\": 115,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \" ------ \",\n        \"--      \",\n        \"--      \",\n        \" -----  \",\n        \"     -- \",\n        \"     -- \",\n        \"------  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"t\": {\n      \"ch\": \"t\",\n      \"code\": 116,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"  --    \",\n        \"  --    \",\n        \"  --    \",\n        \"------  \",\n        \"  --    \",\n        \"  --    \",\n        \"  --    \",\n        \"  --    \",\n        \"  --    \",\n        \"   ---- \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"u\": {\n      \"ch\": \"u\",\n      \"code\": 117,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \" ------ \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"v\": {\n      \"ch\": \"v\",\n      \"code\": 118,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \" -- --  \",\n        \" -- --  \",\n        \"  ---   \",\n        \"  ---   \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"w\": {\n      \"ch\": \"w\",\n      \"code\": 119,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"--   -- \",\n        \"--   -- \",\n        \"-- - -- \",\n        \"-- - -- \",\n        \"-- - -- \",\n        \"-- - -- \",\n        \" -----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"x\": {\n      \"ch\": \"x\",\n      \"code\": 120,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"--   -- \",\n        \"--   -- \",\n        \" -- --  \",\n        \"  ---   \",\n        \" -- --  \",\n        \"--   -- \",\n        \"--   -- \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"y\": {\n      \"ch\": \"y\",\n      \"code\": 121,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \" ------ \",\n        \"     -- \",\n        \" -----  \"\n      ]\n    },\n    \"z\": {\n      \"ch\": \"z\",\n      \"code\": 122,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"------- \",\n        \"    --  \",\n        \"   --   \",\n        \"  --    \",\n        \" --     \",\n        \"--      \",\n        \"------- \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"{\": {\n      \"ch\": \"{\",\n      \"code\": 123,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"   ---  \",\n        \"  --    \",\n        \"  --    \",\n        \"  --    \",\n        \" --     \",\n        \"  --    \",\n        \"  --    \",\n        \"  --    \",\n        \"  --    \",\n        \"   ---  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"|\": {\n      \"ch\": \"|\",\n      \"code\": 124,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"}\": {\n      \"ch\": \"}\",\n      \"code\": 125,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \" ---    \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"    --  \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \" ---    \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"~\": {\n      \"ch\": \"~\",\n      \"code\": 126,\n      \"map\": [\n        \"        \",\n        \" ---  --\",\n        \"-- -- --\",\n        \"--  --- \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \" \": {\n      \"ch\": \" \",\n      \"code\": 160,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"¡\": {\n      \"ch\": \"¡\",\n      \"code\": 161,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"   --   \",\n        \"   --   \",\n        \"        \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"¢\": {\n      \"ch\": \"¢\",\n      \"code\": 162,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"   -    \",\n        \"   -    \",\n        \" -----  \",\n        \"-- - -- \",\n        \"-- -    \",\n        \"-- -    \",\n        \"-- -    \",\n        \"-- - -- \",\n        \" -----  \",\n        \"   -    \",\n        \"   -    \"\n      ]\n    },\n    \"£\": {\n      \"ch\": \"£\",\n      \"code\": 163,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"  ---   \",\n        \" -- --  \",\n        \" --     \",\n        \" --     \",\n        \"-----   \",\n        \" --     \",\n        \" --     \",\n        \" --     \",\n        \" --  -- \",\n        \"------- \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"¤\": {\n      \"ch\": \"¤\",\n      \"code\": 164,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \" --  -- \",\n        \"  ----  \",\n        \" --  -- \",\n        \" --  -- \",\n        \" --  -- \",\n        \"  ----  \",\n        \" --  -- \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"¥\": {\n      \"ch\": \"¥\",\n      \"code\": 165,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"--    --\",\n        \"--    --\",\n        \" --  -- \",\n        \"  ----  \",\n        \"   --   \",\n        \" ------ \",\n        \"   --   \",\n        \" ------ \",\n        \"   --   \",\n        \"   --   \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"¦\": {\n      \"ch\": \"¦\",\n      \"code\": 166,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"        \",\n        \"        \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"§\": {\n      \"ch\": \"§\",\n      \"code\": 167,\n      \"map\": [\n        \"        \",\n        \"  ----  \",\n        \" --  -- \",\n        \" --     \",\n        \"  ---   \",\n        \" -- --  \",\n        \" --  -- \",\n        \" --  -- \",\n        \"  -- -- \",\n        \"   ---  \",\n        \"     -- \",\n        \" --  -- \",\n        \"  ----  \",\n        \"        \"\n      ]\n    },\n    \"¨\": {\n      \"ch\": \"¨\",\n      \"code\": 168,\n      \"map\": [\n        \" -- --  \",\n        \" -- --  \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"©\": {\n      \"ch\": \"©\",\n      \"code\": 169,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \" ------ \",\n        \"-      -\",\n        \"-  --  -\",\n        \"- -  - -\",\n        \"- -    -\",\n        \"- -  - -\",\n        \"-  --  -\",\n        \"-      -\",\n        \" ------ \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ª\": {\n      \"ch\": \"ª\",\n      \"code\": 170,\n      \"map\": [\n        \"        \",\n        \"  ----  \",\n        \"     -- \",\n        \"  ----- \",\n        \" --  -- \",\n        \"  ----- \",\n        \"        \",\n        \" ------ \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"«\": {\n      \"ch\": \"«\",\n      \"code\": 171,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"   -- --\",\n        \"  -- -- \",\n        \" -- --  \",\n        \"-- --   \",\n        \" -- --  \",\n        \"  -- -- \",\n        \"   -- --\",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"¬\": {\n      \"ch\": \"¬\",\n      \"code\": 172,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"------- \",\n        \"     -- \",\n        \"     -- \",\n        \"     -- \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"­\": {\n      \"ch\": \"­\",\n      \"code\": 173,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \" -----  \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"®\": {\n      \"ch\": \"®\",\n      \"code\": 174,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \" ------ \",\n        \"-      -\",\n        \"- ---  -\",\n        \"- -  - -\",\n        \"- ---  -\",\n        \"- - -  -\",\n        \"- -  - -\",\n        \"-      -\",\n        \" ------ \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"¯\": {\n      \"ch\": \"¯\",\n      \"code\": 175,\n      \"map\": [\n        \" -----  \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"°\": {\n      \"ch\": \"°\",\n      \"code\": 176,\n      \"map\": [\n        \"        \",\n        \"  ---   \",\n        \" -- --  \",\n        \" -- --  \",\n        \"  ---   \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"±\": {\n      \"ch\": \"±\",\n      \"code\": 177,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"   --   \",\n        \"   --   \",\n        \" ------ \",\n        \"   --   \",\n        \"   --   \",\n        \"        \",\n        \" ------ \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"²\": {\n      \"ch\": \"²\",\n      \"code\": 178,\n      \"map\": [\n        \"        \",\n        \"  ---   \",\n        \" -- --  \",\n        \"   --   \",\n        \"  --    \",\n        \" -----  \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"³\": {\n      \"ch\": \"³\",\n      \"code\": 179,\n      \"map\": [\n        \"        \",\n        \" ----   \",\n        \"    --  \",\n        \"  ---   \",\n        \"    --  \",\n        \" ----   \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"´\": {\n      \"ch\": \"´\",\n      \"code\": 180,\n      \"map\": [\n        \"   --   \",\n        \"  --    \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"µ\": {\n      \"ch\": \"µ\",\n      \"code\": 181,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--  --- \",\n        \"---- -- \",\n        \"--      \",\n        \"--      \"\n      ]\n    },\n    \"¶\": {\n      \"ch\": \"¶\",\n      \"code\": 182,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \" ------ \",\n        \"-- - -- \",\n        \"-- - -- \",\n        \"-- - -- \",\n        \"-- - -- \",\n        \" --- -- \",\n        \"   - -- \",\n        \"   - -- \",\n        \"   - -- \",\n        \"   - -- \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"·\": {\n      \"ch\": \"·\",\n      \"code\": 183,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"   --   \",\n        \"   --   \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"¸\": {\n      \"ch\": \"¸\",\n      \"code\": 184,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"  --    \",\n        \"  --    \",\n        \" --     \"\n      ]\n    },\n    \"¹\": {\n      \"ch\": \"¹\",\n      \"code\": 185,\n      \"map\": [\n        \"        \",\n        \"   --   \",\n        \"  ---   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"º\": {\n      \"ch\": \"º\",\n      \"code\": 186,\n      \"map\": [\n        \"        \",\n        \"  ----  \",\n        \" --  -- \",\n        \" --  -- \",\n        \" --  -- \",\n        \"  ----  \",\n        \"        \",\n        \" ------ \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"»\": {\n      \"ch\": \"»\",\n      \"code\": 187,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"-- --   \",\n        \" -- --  \",\n        \"  -- -- \",\n        \"   -- --\",\n        \"  -- -- \",\n        \" -- --  \",\n        \"-- --   \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"¼\": {\n      \"ch\": \"¼\",\n      \"code\": 188,\n      \"map\": [\n        \" --     \",\n        \"---     \",\n        \" --   - \",\n        \" --  -- \",\n        \" -- --  \",\n        \"   --   \",\n        \"  --    \",\n        \" --  -- \",\n        \"--  --- \",\n        \"-  -- - \",\n        \"  ----- \",\n        \"     -- \",\n        \"     -- \",\n        \"        \"\n      ]\n    },\n    \"½\": {\n      \"ch\": \"½\",\n      \"code\": 189,\n      \"map\": [\n        \" --     \",\n        \"---     \",\n        \" --   - \",\n        \" --  -- \",\n        \" -- --  \",\n        \"   --   \",\n        \"  --    \",\n        \" --     \",\n        \"-- ---  \",\n        \"- -- -- \",\n        \"    --  \",\n        \"   --   \",\n        \"  ----- \",\n        \"        \"\n      ]\n    },\n    \"¾\": {\n      \"ch\": \"¾\",\n      \"code\": 190,\n      \"map\": [\n        \"---     \",\n        \"  --    \",\n        \" --   - \",\n        \"  -- -- \",\n        \"--- --  \",\n        \"   --   \",\n        \"  --    \",\n        \" --  -- \",\n        \"--  --- \",\n        \"-  -- - \",\n        \"  ----- \",\n        \"     -- \",\n        \"     -- \",\n        \"        \"\n      ]\n    },\n    \"¿\": {\n      \"ch\": \"¿\",\n      \"code\": 191,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"  --    \",\n        \"  --    \",\n        \"        \",\n        \"  --    \",\n        \"  --    \",\n        \" --     \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \" -----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"À\": {\n      \"ch\": \"À\",\n      \"code\": 192,\n      \"map\": [\n        \"  --    \",\n        \"   --   \",\n        \"        \",\n        \" -----  \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"------- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Á\": {\n      \"ch\": \"Á\",\n      \"code\": 193,\n      \"map\": [\n        \"   --   \",\n        \"  --    \",\n        \"        \",\n        \" -----  \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"------- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Â\": {\n      \"ch\": \"Â\",\n      \"code\": 194,\n      \"map\": [\n        \"  ---   \",\n        \" -- --  \",\n        \"        \",\n        \" -----  \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"------- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ã\": {\n      \"ch\": \"Ã\",\n      \"code\": 195,\n      \"map\": [\n        \" --- -- \",\n        \"-- ---  \",\n        \"        \",\n        \" -----  \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"------- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ä\": {\n      \"ch\": \"Ä\",\n      \"code\": 196,\n      \"map\": [\n        \" -- --  \",\n        \" -- --  \",\n        \"        \",\n        \" -----  \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"------- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Å\": {\n      \"ch\": \"Å\",\n      \"code\": 197,\n      \"map\": [\n        \"  ---   \",\n        \" -- --  \",\n        \"  ---   \",\n        \" -----  \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"------- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Æ\": {\n      \"ch\": \"Æ\",\n      \"code\": 198,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \" ------ \",\n        \"-- --   \",\n        \"-- --   \",\n        \"-- --   \",\n        \"------- \",\n        \"-- --   \",\n        \"-- --   \",\n        \"-- --   \",\n        \"-- --   \",\n        \"-- ---- \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ç\": {\n      \"ch\": \"Ç\",\n      \"code\": 199,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \" -----  \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--      \",\n        \"--      \",\n        \"--      \",\n        \"--      \",\n        \"--   -- \",\n        \"--   -- \",\n        \" -----  \",\n        \"  --    \",\n        \" --     \"\n      ]\n    },\n    \"È\": {\n      \"ch\": \"È\",\n      \"code\": 200,\n      \"map\": [\n        \"  --    \",\n        \"   --   \",\n        \"        \",\n        \"------- \",\n        \"--      \",\n        \"--      \",\n        \"--      \",\n        \"-----   \",\n        \"--      \",\n        \"--      \",\n        \"--      \",\n        \"------- \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"É\": {\n      \"ch\": \"É\",\n      \"code\": 201,\n      \"map\": [\n        \"   --   \",\n        \"  --    \",\n        \"        \",\n        \"------- \",\n        \"--      \",\n        \"--      \",\n        \"--      \",\n        \"-----   \",\n        \"--      \",\n        \"--      \",\n        \"--      \",\n        \"------- \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ê\": {\n      \"ch\": \"Ê\",\n      \"code\": 202,\n      \"map\": [\n        \"  ---   \",\n        \" -- --  \",\n        \"        \",\n        \"------- \",\n        \"--      \",\n        \"--      \",\n        \"--      \",\n        \"-----   \",\n        \"--      \",\n        \"--      \",\n        \"--      \",\n        \"------- \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ë\": {\n      \"ch\": \"Ë\",\n      \"code\": 203,\n      \"map\": [\n        \" -- --  \",\n        \" -- --  \",\n        \"        \",\n        \"------- \",\n        \"--      \",\n        \"--      \",\n        \"--      \",\n        \"-----   \",\n        \"--      \",\n        \"--      \",\n        \"--      \",\n        \"------- \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ì\": {\n      \"ch\": \"Ì\",\n      \"code\": 204,\n      \"map\": [\n        \"  --    \",\n        \"   --   \",\n        \"        \",\n        \"  ----  \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"  ----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Í\": {\n      \"ch\": \"Í\",\n      \"code\": 205,\n      \"map\": [\n        \"    --  \",\n        \"   --   \",\n        \"        \",\n        \"  ----  \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"  ----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Î\": {\n      \"ch\": \"Î\",\n      \"code\": 206,\n      \"map\": [\n        \"  ---   \",\n        \" -- --  \",\n        \"        \",\n        \"  ----  \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"  ----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ï\": {\n      \"ch\": \"Ï\",\n      \"code\": 207,\n      \"map\": [\n        \" --  -- \",\n        \" --  -- \",\n        \"        \",\n        \"  ----  \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"  ----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ð\": {\n      \"ch\": \"Ð\",\n      \"code\": 208,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \" ----   \",\n        \" -- --  \",\n        \" --  -- \",\n        \" --  -- \",\n        \"---- -- \",\n        \" --  -- \",\n        \" --  -- \",\n        \" --  -- \",\n        \" -- --  \",\n        \" ----   \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ñ\": {\n      \"ch\": \"Ñ\",\n      \"code\": 209,\n      \"map\": [\n        \" --- -- \",\n        \"-- ---  \",\n        \"        \",\n        \"--   -- \",\n        \"--   -- \",\n        \"---  -- \",\n        \"---- -- \",\n        \"-- ---- \",\n        \"--  --- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ò\": {\n      \"ch\": \"Ò\",\n      \"code\": 210,\n      \"map\": [\n        \"  --    \",\n        \"   --   \",\n        \"        \",\n        \" -----  \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \" -----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ó\": {\n      \"ch\": \"Ó\",\n      \"code\": 211,\n      \"map\": [\n        \"   --   \",\n        \"  --    \",\n        \"        \",\n        \" -----  \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \" -----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ô\": {\n      \"ch\": \"Ô\",\n      \"code\": 212,\n      \"map\": [\n        \"  ---   \",\n        \" -- --  \",\n        \"        \",\n        \" -----  \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \" -----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Õ\": {\n      \"ch\": \"Õ\",\n      \"code\": 213,\n      \"map\": [\n        \" --- -- \",\n        \"-- ---  \",\n        \"        \",\n        \" -----  \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \" -----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ö\": {\n      \"ch\": \"Ö\",\n      \"code\": 214,\n      \"map\": [\n        \" -- --  \",\n        \" -- --  \",\n        \"        \",\n        \" -----  \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \" -----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"×\": {\n      \"ch\": \"×\",\n      \"code\": 215,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"--   -- \",\n        \" -- --  \",\n        \"  ---   \",\n        \"  ---   \",\n        \" -- --  \",\n        \"--   -- \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ø\": {\n      \"ch\": \"Ø\",\n      \"code\": 216,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \" -----  \",\n        \"--   ---\",\n        \"--   -- \",\n        \"--  --- \",\n        \"-- ---- \",\n        \"---- -- \",\n        \"---  -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \" -----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ù\": {\n      \"ch\": \"Ù\",\n      \"code\": 217,\n      \"map\": [\n        \"  --    \",\n        \"   --   \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \" -----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ú\": {\n      \"ch\": \"Ú\",\n      \"code\": 218,\n      \"map\": [\n        \"   --   \",\n        \"  --    \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \" -----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Û\": {\n      \"ch\": \"Û\",\n      \"code\": 219,\n      \"map\": [\n        \"  ---   \",\n        \" -- --  \",\n        \"        \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \" -----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ü\": {\n      \"ch\": \"Ü\",\n      \"code\": 220,\n      \"map\": [\n        \" -- --  \",\n        \" -- --  \",\n        \"        \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \" -----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ý\": {\n      \"ch\": \"Ý\",\n      \"code\": 221,\n      \"map\": [\n        \"    --  \",\n        \"   --   \",\n        \"--    --\",\n        \"--    --\",\n        \" --  -- \",\n        \" --  -- \",\n        \"  ----  \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Þ\": {\n      \"ch\": \"Þ\",\n      \"code\": 222,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"--      \",\n        \"--      \",\n        \"------  \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"------  \",\n        \"--      \",\n        \"--      \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ß\": {\n      \"ch\": \"ß\",\n      \"code\": 223,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \" ----   \",\n        \"--  --  \",\n        \"--  --  \",\n        \"--  -   \",\n        \"------  \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"---  -- \",\n        \"-- ---  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"à\": {\n      \"ch\": \"à\",\n      \"code\": 224,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"  --    \",\n        \"   --   \",\n        \"        \",\n        \" -----  \",\n        \"     -- \",\n        \" ------ \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \" ------ \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"á\": {\n      \"ch\": \"á\",\n      \"code\": 225,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"   --   \",\n        \"  --    \",\n        \"        \",\n        \" -----  \",\n        \"     -- \",\n        \" ------ \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \" ------ \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"â\": {\n      \"ch\": \"â\",\n      \"code\": 226,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"  ---   \",\n        \" -- --  \",\n        \"        \",\n        \" -----  \",\n        \"     -- \",\n        \" ------ \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \" ------ \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ã\": {\n      \"ch\": \"ã\",\n      \"code\": 227,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \" --- -- \",\n        \"-- ---  \",\n        \"        \",\n        \" -----  \",\n        \"     -- \",\n        \" ------ \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \" ------ \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ä\": {\n      \"ch\": \"ä\",\n      \"code\": 228,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \" -- --  \",\n        \" -- --  \",\n        \"        \",\n        \" -----  \",\n        \"     -- \",\n        \" ------ \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \" ------ \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"å\": {\n      \"ch\": \"å\",\n      \"code\": 229,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"  ---   \",\n        \" -- --  \",\n        \"  ---   \",\n        \" -----  \",\n        \"     -- \",\n        \" ------ \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \" ------ \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"æ\": {\n      \"ch\": \"æ\",\n      \"code\": 230,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \" -- --  \",\n        \"   - -- \",\n        \"   - -- \",\n        \" ------ \",\n        \"-- -    \",\n        \"-- -    \",\n        \" -- --  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ç\": {\n      \"ch\": \"ç\",\n      \"code\": 231,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \" -----  \",\n        \"--   -- \",\n        \"--      \",\n        \"--      \",\n        \"--      \",\n        \"--   -- \",\n        \" -----  \",\n        \"  --    \",\n        \" --     \"\n      ]\n    },\n    \"è\": {\n      \"ch\": \"è\",\n      \"code\": 232,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"  --    \",\n        \"   --   \",\n        \"        \",\n        \" -----  \",\n        \"--   -- \",\n        \"--   -- \",\n        \"------- \",\n        \"--      \",\n        \"--      \",\n        \" -----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"é\": {\n      \"ch\": \"é\",\n      \"code\": 233,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"   --   \",\n        \"  --    \",\n        \"        \",\n        \" -----  \",\n        \"--   -- \",\n        \"--   -- \",\n        \"------- \",\n        \"--      \",\n        \"--      \",\n        \" -----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ê\": {\n      \"ch\": \"ê\",\n      \"code\": 234,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"  ---   \",\n        \" -- --  \",\n        \"        \",\n        \" -----  \",\n        \"--   -- \",\n        \"--   -- \",\n        \"------- \",\n        \"--      \",\n        \"--      \",\n        \" -----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ë\": {\n      \"ch\": \"ë\",\n      \"code\": 235,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \" -- --  \",\n        \" -- --  \",\n        \"        \",\n        \" -----  \",\n        \"--   -- \",\n        \"--   -- \",\n        \"------- \",\n        \"--      \",\n        \"--      \",\n        \" -----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ì\": {\n      \"ch\": \"ì\",\n      \"code\": 236,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"  --    \",\n        \"   --   \",\n        \"        \",\n        \"  ---   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"  ----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"í\": {\n      \"ch\": \"í\",\n      \"code\": 237,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"    --  \",\n        \"   --   \",\n        \"        \",\n        \"  ---   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"  ----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"î\": {\n      \"ch\": \"î\",\n      \"code\": 238,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"  ---   \",\n        \" -- --  \",\n        \"        \",\n        \"  ---   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"  ----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ï\": {\n      \"ch\": \"ï\",\n      \"code\": 239,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \" -- --  \",\n        \" -- --  \",\n        \"        \",\n        \"  ---   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"  ----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ð\": {\n      \"ch\": \"ð\",\n      \"code\": 240,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \" -- -   \",\n        \"  --    \",\n        \" - --   \",\n        \" -----  \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \" -----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ñ\": {\n      \"ch\": \"ñ\",\n      \"code\": 241,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \" --- -- \",\n        \"-- ---  \",\n        \"        \",\n        \"------  \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ò\": {\n      \"ch\": \"ò\",\n      \"code\": 242,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"  --    \",\n        \"   --   \",\n        \"        \",\n        \" -----  \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \" -----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ó\": {\n      \"ch\": \"ó\",\n      \"code\": 243,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"   --   \",\n        \"  --    \",\n        \"        \",\n        \" -----  \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \" -----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ô\": {\n      \"ch\": \"ô\",\n      \"code\": 244,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"  ---   \",\n        \" -- --  \",\n        \"        \",\n        \" -----  \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \" -----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"õ\": {\n      \"ch\": \"õ\",\n      \"code\": 245,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \" --- -- \",\n        \"-- ---  \",\n        \"        \",\n        \" -----  \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \" -----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ö\": {\n      \"ch\": \"ö\",\n      \"code\": 246,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \" -- --  \",\n        \" -- --  \",\n        \"        \",\n        \" -----  \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \" -----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"÷\": {\n      \"ch\": \"÷\",\n      \"code\": 247,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"   --   \",\n        \"   --   \",\n        \"        \",\n        \" ------ \",\n        \"        \",\n        \"   --   \",\n        \"   --   \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ø\": {\n      \"ch\": \"ø\",\n      \"code\": 248,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"  ---- -\",\n        \" --  ---\",\n        \" -- --- \",\n        \" ------ \",\n        \" --- -- \",\n        \"---  -- \",\n        \"- ----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ù\": {\n      \"ch\": \"ù\",\n      \"code\": 249,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"  --    \",\n        \"   --   \",\n        \"        \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \" ------ \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ú\": {\n      \"ch\": \"ú\",\n      \"code\": 250,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"   --   \",\n        \"  --    \",\n        \"        \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \" ------ \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"û\": {\n      \"ch\": \"û\",\n      \"code\": 251,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"  ---   \",\n        \" -- --  \",\n        \"        \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \" ------ \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ü\": {\n      \"ch\": \"ü\",\n      \"code\": 252,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \" -- --  \",\n        \" -- --  \",\n        \"        \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \" ------ \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ý\": {\n      \"ch\": \"ý\",\n      \"code\": 253,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"   --   \",\n        \"  --    \",\n        \"        \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \" ------ \",\n        \"     -- \",\n        \" -----  \"\n      ]\n    },\n    \"þ\": {\n      \"ch\": \"þ\",\n      \"code\": 254,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"--      \",\n        \"--      \",\n        \"--      \",\n        \"------  \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"------  \",\n        \"--      \",\n        \"--      \"\n      ]\n    },\n    \"ÿ\": {\n      \"ch\": \"ÿ\",\n      \"code\": 255,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \" -- --  \",\n        \" -- --  \",\n        \"        \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \" ------ \",\n        \"     -- \",\n        \" -----  \"\n      ]\n    },\n    \"Ā\": {\n      \"ch\": \"Ā\",\n      \"code\": 256,\n      \"map\": [\n        \" -----  \",\n        \"        \",\n        \" -----  \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"------- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ā\": {\n      \"ch\": \"ā\",\n      \"code\": 257,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \" -----  \",\n        \"        \",\n        \" -----  \",\n        \"     -- \",\n        \" ------ \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \" ------ \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ă\": {\n      \"ch\": \"Ă\",\n      \"code\": 258,\n      \"map\": [\n        \" -- --  \",\n        \"  ---   \",\n        \"        \",\n        \" -----  \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"------- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ă\": {\n      \"ch\": \"ă\",\n      \"code\": 259,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \" -- --  \",\n        \"  ---   \",\n        \"        \",\n        \" -----  \",\n        \"     -- \",\n        \" ------ \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \" ------ \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ą\": {\n      \"ch\": \"Ą\",\n      \"code\": 260,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \" -----  \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"------- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"    --  \",\n        \"     ---\"\n      ]\n    },\n    \"ą\": {\n      \"ch\": \"ą\",\n      \"code\": 261,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \" -----  \",\n        \"     -- \",\n        \" ------ \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \" ------ \",\n        \"    --  \",\n        \"     ---\"\n      ]\n    },\n    \"Ć\": {\n      \"ch\": \"Ć\",\n      \"code\": 262,\n      \"map\": [\n        \"   --   \",\n        \"  --    \",\n        \"        \",\n        \" -----  \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--      \",\n        \"--      \",\n        \"--      \",\n        \"--   -- \",\n        \"--   -- \",\n        \" -----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ć\": {\n      \"ch\": \"ć\",\n      \"code\": 263,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"   --   \",\n        \"  --    \",\n        \"        \",\n        \" -----  \",\n        \"--   -- \",\n        \"--      \",\n        \"--      \",\n        \"--      \",\n        \"--   -- \",\n        \" -----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ĉ\": {\n      \"ch\": \"Ĉ\",\n      \"code\": 264,\n      \"map\": [\n        \"  ---   \",\n        \" -- --  \",\n        \"        \",\n        \" -----  \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--      \",\n        \"--      \",\n        \"--      \",\n        \"--   -- \",\n        \"--   -- \",\n        \" -----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ĉ\": {\n      \"ch\": \"ĉ\",\n      \"code\": 265,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"  ---   \",\n        \" -- --  \",\n        \"        \",\n        \" -----  \",\n        \"--   -- \",\n        \"--      \",\n        \"--      \",\n        \"--      \",\n        \"--   -- \",\n        \" -----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ċ\": {\n      \"ch\": \"Ċ\",\n      \"code\": 266,\n      \"map\": [\n        \"   --   \",\n        \"   --   \",\n        \"        \",\n        \" -----  \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--      \",\n        \"--      \",\n        \"--      \",\n        \"--   -- \",\n        \"--   -- \",\n        \" -----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ċ\": {\n      \"ch\": \"ċ\",\n      \"code\": 267,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"   --   \",\n        \"   --   \",\n        \"        \",\n        \" -----  \",\n        \"--   -- \",\n        \"--      \",\n        \"--      \",\n        \"--      \",\n        \"--   -- \",\n        \" -----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Č\": {\n      \"ch\": \"Č\",\n      \"code\": 268,\n      \"map\": [\n        \" -- --  \",\n        \"  ---   \",\n        \"        \",\n        \" -----  \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--      \",\n        \"--      \",\n        \"--      \",\n        \"--   -- \",\n        \"--   -- \",\n        \" -----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"č\": {\n      \"ch\": \"č\",\n      \"code\": 269,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \" -- --  \",\n        \"  ---   \",\n        \"        \",\n        \" -----  \",\n        \"--   -- \",\n        \"--      \",\n        \"--      \",\n        \"--      \",\n        \"--   -- \",\n        \" -----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ď\": {\n      \"ch\": \"Ď\",\n      \"code\": 270,\n      \"map\": [\n        \" -- --  \",\n        \"  ---   \",\n        \"        \",\n        \"-----   \",\n        \"--  --  \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--  --  \",\n        \"-----   \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ď\": {\n      \"ch\": \"ď\",\n      \"code\": 271,\n      \"map\": [\n        \" -- --  \",\n        \"  ---   \",\n        \"     -- \",\n        \"     -- \",\n        \"     -- \",\n        \" ------ \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \" ------ \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Đ\": {\n      \"ch\": \"Đ\",\n      \"code\": 272,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \" ----   \",\n        \" -- --  \",\n        \" --  -- \",\n        \" --  -- \",\n        \"---- -- \",\n        \" --  -- \",\n        \" --  -- \",\n        \" --  -- \",\n        \" -- --  \",\n        \" ----   \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"đ\": {\n      \"ch\": \"đ\",\n      \"code\": 273,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"     -- \",\n        \"   -----\",\n        \"     -- \",\n        \" ------ \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \" ------ \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ē\": {\n      \"ch\": \"Ē\",\n      \"code\": 274,\n      \"map\": [\n        \" -----  \",\n        \"        \",\n        \"------- \",\n        \"--      \",\n        \"--      \",\n        \"--      \",\n        \"-----   \",\n        \"--      \",\n        \"--      \",\n        \"--      \",\n        \"--      \",\n        \"------- \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ē\": {\n      \"ch\": \"ē\",\n      \"code\": 275,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \" -----  \",\n        \"        \",\n        \" -----  \",\n        \"--   -- \",\n        \"--   -- \",\n        \"------- \",\n        \"--      \",\n        \"--      \",\n        \" -----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ĕ\": {\n      \"ch\": \"Ĕ\",\n      \"code\": 276,\n      \"map\": [\n        \" -- --  \",\n        \"  ---   \",\n        \"        \",\n        \"------- \",\n        \"--      \",\n        \"--      \",\n        \"--      \",\n        \"-----   \",\n        \"--      \",\n        \"--      \",\n        \"--      \",\n        \"------- \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ĕ\": {\n      \"ch\": \"ĕ\",\n      \"code\": 277,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \" -- --  \",\n        \"  ---   \",\n        \"        \",\n        \" -----  \",\n        \"--   -- \",\n        \"--   -- \",\n        \"------- \",\n        \"--      \",\n        \"--      \",\n        \" -----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ė\": {\n      \"ch\": \"Ė\",\n      \"code\": 278,\n      \"map\": [\n        \"   --   \",\n        \"   --   \",\n        \"        \",\n        \"------- \",\n        \"--      \",\n        \"--      \",\n        \"--      \",\n        \"-----   \",\n        \"--      \",\n        \"--      \",\n        \"--      \",\n        \"------- \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ė\": {\n      \"ch\": \"ė\",\n      \"code\": 279,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"   --   \",\n        \"   --   \",\n        \"        \",\n        \" -----  \",\n        \"--   -- \",\n        \"--   -- \",\n        \"------- \",\n        \"--      \",\n        \"--      \",\n        \" -----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ę\": {\n      \"ch\": \"Ę\",\n      \"code\": 280,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"------- \",\n        \"--      \",\n        \"--      \",\n        \"--      \",\n        \"-----   \",\n        \"--      \",\n        \"--      \",\n        \"--      \",\n        \"--      \",\n        \"------- \",\n        \"    --  \",\n        \"     ---\"\n      ]\n    },\n    \"ę\": {\n      \"ch\": \"ę\",\n      \"code\": 281,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \" -----  \",\n        \"--   -- \",\n        \"--   -- \",\n        \"------- \",\n        \"--      \",\n        \"--      \",\n        \" -----  \",\n        \"   --   \",\n        \"    --- \"\n      ]\n    },\n    \"Ě\": {\n      \"ch\": \"Ě\",\n      \"code\": 282,\n      \"map\": [\n        \" -- --  \",\n        \"  ---   \",\n        \"        \",\n        \"------- \",\n        \"--      \",\n        \"--      \",\n        \"--      \",\n        \"-----   \",\n        \"--      \",\n        \"--      \",\n        \"--      \",\n        \"------- \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ě\": {\n      \"ch\": \"ě\",\n      \"code\": 283,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \" -- --  \",\n        \"  ---   \",\n        \"        \",\n        \" -----  \",\n        \"--   -- \",\n        \"--   -- \",\n        \"------- \",\n        \"--      \",\n        \"--      \",\n        \" -----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ĝ\": {\n      \"ch\": \"Ĝ\",\n      \"code\": 284,\n      \"map\": [\n        \"  ---   \",\n        \" -- --  \",\n        \"        \",\n        \" -----  \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--      \",\n        \"-- ---- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \" -----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ĝ\": {\n      \"ch\": \"ĝ\",\n      \"code\": 285,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"  ---   \",\n        \" -- --  \",\n        \"        \",\n        \" ------ \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \" ------ \",\n        \"     -- \",\n        \" -----  \"\n      ]\n    },\n    \"Ğ\": {\n      \"ch\": \"Ğ\",\n      \"code\": 286,\n      \"map\": [\n        \" -- --  \",\n        \"  ---   \",\n        \"        \",\n        \" -----  \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--      \",\n        \"-- ---- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \" -----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ğ\": {\n      \"ch\": \"ğ\",\n      \"code\": 287,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \" -- --  \",\n        \"  ---   \",\n        \"        \",\n        \" ------ \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \" ------ \",\n        \"     -- \",\n        \" -----  \"\n      ]\n    },\n    \"Ġ\": {\n      \"ch\": \"Ġ\",\n      \"code\": 288,\n      \"map\": [\n        \"   --   \",\n        \"   --   \",\n        \"        \",\n        \" -----  \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--      \",\n        \"-- ---- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \" -----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ġ\": {\n      \"ch\": \"ġ\",\n      \"code\": 289,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"   --   \",\n        \"   --   \",\n        \"        \",\n        \" ------ \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \" ------ \",\n        \"     -- \",\n        \" -----  \"\n      ]\n    },\n    \"Ģ\": {\n      \"ch\": \"Ģ\",\n      \"code\": 290,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \" -----  \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--      \",\n        \"--      \",\n        \"-- ---- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \" -----  \",\n        \"  --    \",\n        \" --     \"\n      ]\n    },\n    \"ģ\": {\n      \"ch\": \"ģ\",\n      \"code\": 291,\n      \"map\": [\n        \"        \",\n        \"    --  \",\n        \"   --   \",\n        \"   --   \",\n        \"        \",\n        \" ------ \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \" ------ \",\n        \"     -- \",\n        \" -----  \"\n      ]\n    },\n    \"Ĥ\": {\n      \"ch\": \"Ĥ\",\n      \"code\": 292,\n      \"map\": [\n        \"  ---   \",\n        \" -- --  \",\n        \"        \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"------- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ĥ\": {\n      \"ch\": \"ĥ\",\n      \"code\": 293,\n      \"map\": [\n        \"   ---  \",\n        \"  -- -- \",\n        \"--      \",\n        \"--      \",\n        \"--      \",\n        \"------  \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ħ\": {\n      \"ch\": \"Ħ\",\n      \"code\": 294,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \" --  -- \",\n        \"--------\",\n        \" --  -- \",\n        \" --  -- \",\n        \" ------ \",\n        \" --  -- \",\n        \" --  -- \",\n        \" --  -- \",\n        \" --  -- \",\n        \" --  -- \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ħ\": {\n      \"ch\": \"ħ\",\n      \"code\": 295,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \" --     \",\n        \"-----   \",\n        \" --     \",\n        \" -----  \",\n        \" --  -- \",\n        \" --  -- \",\n        \" --  -- \",\n        \" --  -- \",\n        \" --  -- \",\n        \" --  -- \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ĩ\": {\n      \"ch\": \"Ĩ\",\n      \"code\": 296,\n      \"map\": [\n        \" --- -- \",\n        \"-- ---  \",\n        \"        \",\n        \"  ----  \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"  ----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ĩ\": {\n      \"ch\": \"ĩ\",\n      \"code\": 297,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \" --- -- \",\n        \"-- ---  \",\n        \"        \",\n        \"  ---   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"  ----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ī\": {\n      \"ch\": \"Ī\",\n      \"code\": 298,\n      \"map\": [\n        \" ------ \",\n        \"        \",\n        \"  ----  \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"  ----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ī\": {\n      \"ch\": \"ī\",\n      \"code\": 299,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \" -----  \",\n        \"        \",\n        \"  ---   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"  ----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ĭ\": {\n      \"ch\": \"Ĭ\",\n      \"code\": 300,\n      \"map\": [\n        \" -- --  \",\n        \"  ---   \",\n        \"        \",\n        \"  ----  \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"  ----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ĭ\": {\n      \"ch\": \"ĭ\",\n      \"code\": 301,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \" -- --  \",\n        \"  ---   \",\n        \"        \",\n        \"  ---   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"  ----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Į\": {\n      \"ch\": \"Į\",\n      \"code\": 302,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"  ----  \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"  ----  \",\n        \"   --   \",\n        \"    --- \"\n      ]\n    },\n    \"į\": {\n      \"ch\": \"į\",\n      \"code\": 303,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"   --   \",\n        \"   --   \",\n        \"        \",\n        \"  ---   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"  ----  \",\n        \"   --   \",\n        \"    --- \"\n      ]\n    },\n    \"İ\": {\n      \"ch\": \"İ\",\n      \"code\": 304,\n      \"map\": [\n        \"   --   \",\n        \"   --   \",\n        \"        \",\n        \"  ----  \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"  ----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ı\": {\n      \"ch\": \"ı\",\n      \"code\": 305,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"  ---   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"  ----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ĳ\": {\n      \"ch\": \"Ĳ\",\n      \"code\": 306,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"--  ----\",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"---- -- \",\n        \"---- -- \",\n        \"-- ---  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ĳ\": {\n      \"ch\": \"ĳ\",\n      \"code\": 307,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"--   -- \",\n        \"--   -- \",\n        \"        \",\n        \"--  --- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"---- -- \",\n        \"  -- -- \",\n        \"   ---  \"\n      ]\n    },\n    \"Ĵ\": {\n      \"ch\": \"Ĵ\",\n      \"code\": 308,\n      \"map\": [\n        \"   ---  \",\n        \"  -- -- \",\n        \"        \",\n        \"   ---- \",\n        \"    --  \",\n        \"    --  \",\n        \"    --  \",\n        \"    --  \",\n        \"    --  \",\n        \"--  --  \",\n        \"--  --  \",\n        \" ----   \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ĵ\": {\n      \"ch\": \"ĵ\",\n      \"code\": 309,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"    --- \",\n        \"   -- --\",\n        \"        \",\n        \"    --- \",\n        \"     -- \",\n        \"     -- \",\n        \"     -- \",\n        \"     -- \",\n        \"     -- \",\n        \" --  -- \",\n        \" --  -- \",\n        \"  ----  \"\n      ]\n    },\n    \"Ķ\": {\n      \"ch\": \"Ķ\",\n      \"code\": 310,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--  --  \",\n        \"-- --   \",\n        \"----    \",\n        \"----    \",\n        \"-- --   \",\n        \"--  --  \",\n        \"--   -- \",\n        \"---- -- \",\n        \"  --    \",\n        \" --     \"\n      ]\n    },\n    \"ķ\": {\n      \"ch\": \"ķ\",\n      \"code\": 311,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"--      \",\n        \"--      \",\n        \"--      \",\n        \"--   -- \",\n        \"--  --  \",\n        \"-- --   \",\n        \"----    \",\n        \"-- --   \",\n        \"--  --  \",\n        \"---- -- \",\n        \"  --    \",\n        \" --     \"\n      ]\n    },\n    \"ĸ\": {\n      \"ch\": \"ĸ\",\n      \"code\": 312,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"--   -- \",\n        \"--  --  \",\n        \"-- --   \",\n        \"----    \",\n        \"-- --   \",\n        \"--  --  \",\n        \"--   -- \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ĺ\": {\n      \"ch\": \"Ĺ\",\n      \"code\": 313,\n      \"map\": [\n        \" --     \",\n        \"--      \",\n        \"        \",\n        \"--      \",\n        \"--      \",\n        \"--      \",\n        \"--      \",\n        \"--      \",\n        \"--      \",\n        \"--      \",\n        \"--      \",\n        \"------- \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ĺ\": {\n      \"ch\": \"ĺ\",\n      \"code\": 314,\n      \"map\": [\n        \"    --  \",\n        \"   --   \",\n        \"        \",\n        \"  ---   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"  ----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ļ\": {\n      \"ch\": \"Ļ\",\n      \"code\": 315,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"--      \",\n        \"--      \",\n        \"--      \",\n        \"--      \",\n        \"--      \",\n        \"--      \",\n        \"--      \",\n        \"--      \",\n        \"--      \",\n        \"------- \",\n        \"  --    \",\n        \" --     \"\n      ]\n    },\n    \"ļ\": {\n      \"ch\": \"ļ\",\n      \"code\": 316,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"  ---   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"  ----  \",\n        \"   --   \",\n        \"  --    \"\n      ]\n    },\n    \"Ľ\": {\n      \"ch\": \"Ľ\",\n      \"code\": 317,\n      \"map\": [\n        \" -- --  \",\n        \"  ---   \",\n        \"--      \",\n        \"--      \",\n        \"--      \",\n        \"--      \",\n        \"--      \",\n        \"--      \",\n        \"--      \",\n        \"--      \",\n        \"--      \",\n        \"------- \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ľ\": {\n      \"ch\": \"ľ\",\n      \"code\": 318,\n      \"map\": [\n        \" -- --  \",\n        \"  ---   \",\n        \"        \",\n        \"  ---   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"  ----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ŀ\": {\n      \"ch\": \"Ŀ\",\n      \"code\": 319,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"--      \",\n        \"--      \",\n        \"--      \",\n        \"--      \",\n        \"--  --  \",\n        \"--  --  \",\n        \"--      \",\n        \"--      \",\n        \"--      \",\n        \"------- \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ŀ\": {\n      \"ch\": \"ŀ\",\n      \"code\": 320,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"  ---   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   -- --\",\n        \"   -- --\",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"  ----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ł\": {\n      \"ch\": \"Ł\",\n      \"code\": 321,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \" --     \",\n        \" --     \",\n        \" --     \",\n        \" --     \",\n        \" ---    \",\n        \"---     \",\n        \" --     \",\n        \" --     \",\n        \" --     \",\n        \" -------\",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ł\": {\n      \"ch\": \"ł\",\n      \"code\": 322,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"  ---   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   ---  \",\n        \"  ---   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"  ----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ń\": {\n      \"ch\": \"Ń\",\n      \"code\": 323,\n      \"map\": [\n        \"   --   \",\n        \"  --    \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"---  -- \",\n        \"---- -- \",\n        \"-- ---- \",\n        \"--  --- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ń\": {\n      \"ch\": \"ń\",\n      \"code\": 324,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"   --   \",\n        \"  --    \",\n        \"        \",\n        \"------  \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ņ\": {\n      \"ch\": \"Ņ\",\n      \"code\": 325,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"---  -- \",\n        \"---- -- \",\n        \"-- ---- \",\n        \"--  --- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"---- -- \",\n        \"  --    \",\n        \" --     \"\n      ]\n    },\n    \"ņ\": {\n      \"ch\": \"ņ\",\n      \"code\": 326,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"------  \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"---- -- \",\n        \"  --    \",\n        \" --     \"\n      ]\n    },\n    \"Ň\": {\n      \"ch\": \"Ň\",\n      \"code\": 327,\n      \"map\": [\n        \" -- --  \",\n        \"  ---   \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"---  -- \",\n        \"---- -- \",\n        \"-- ---- \",\n        \"--  --- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ň\": {\n      \"ch\": \"ň\",\n      \"code\": 328,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \" -- --  \",\n        \"  ---   \",\n        \"        \",\n        \"------  \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ŉ\": {\n      \"ch\": \"ŉ\",\n      \"code\": 329,\n      \"map\": [\n        \"        \",\n        \" --     \",\n        \" --     \",\n        \"--      \",\n        \"        \",\n        \"------  \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ŋ\": {\n      \"ch\": \"Ŋ\",\n      \"code\": 330,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"---  -- \",\n        \"---- -- \",\n        \"-- ---- \",\n        \"--  --- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"     -- \",\n        \"   ---  \"\n      ]\n    },\n    \"ŋ\": {\n      \"ch\": \"ŋ\",\n      \"code\": 331,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"------  \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"     -- \",\n        \"   ---  \"\n      ]\n    },\n    \"Ō\": {\n      \"ch\": \"Ō\",\n      \"code\": 332,\n      \"map\": [\n        \" -----  \",\n        \"        \",\n        \" -----  \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \" -----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ō\": {\n      \"ch\": \"ō\",\n      \"code\": 333,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \" -----  \",\n        \"        \",\n        \" -----  \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \" -----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ŏ\": {\n      \"ch\": \"Ŏ\",\n      \"code\": 334,\n      \"map\": [\n        \" -- --  \",\n        \"  ---   \",\n        \"        \",\n        \" -----  \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \" -----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ŏ\": {\n      \"ch\": \"ŏ\",\n      \"code\": 335,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \" -- --  \",\n        \"  ---   \",\n        \"        \",\n        \" -----  \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \" -----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ő\": {\n      \"ch\": \"Ő\",\n      \"code\": 336,\n      \"map\": [\n        \"  -- -- \",\n        \" -- --  \",\n        \"        \",\n        \" -----  \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \" -----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ő\": {\n      \"ch\": \"ő\",\n      \"code\": 337,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"  -- -- \",\n        \" -- --  \",\n        \"        \",\n        \" -----  \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \" -----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Œ\": {\n      \"ch\": \"Œ\",\n      \"code\": 338,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \" ------ \",\n        \"-- --   \",\n        \"-- --   \",\n        \"-- --   \",\n        \"-- ---- \",\n        \"-- --   \",\n        \"-- --   \",\n        \"-- --   \",\n        \"-- --   \",\n        \" ------ \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"œ\": {\n      \"ch\": \"œ\",\n      \"code\": 339,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \" -----  \",\n        \"-- - -- \",\n        \"-- - -- \",\n        \"-- ---- \",\n        \"-- -    \",\n        \"-- -    \",\n        \" -----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ŕ\": {\n      \"ch\": \"Ŕ\",\n      \"code\": 340,\n      \"map\": [\n        \"   --   \",\n        \"  --    \",\n        \"        \",\n        \"------  \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"------  \",\n        \"----    \",\n        \"-- --   \",\n        \"--  --  \",\n        \"--   -- \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ŕ\": {\n      \"ch\": \"ŕ\",\n      \"code\": 341,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"   --   \",\n        \"  --    \",\n        \"        \",\n        \"-- ---- \",\n        \"----    \",\n        \"---     \",\n        \"--      \",\n        \"--      \",\n        \"--      \",\n        \"--      \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ŗ\": {\n      \"ch\": \"Ŗ\",\n      \"code\": 342,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"------  \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"------  \",\n        \"----    \",\n        \"-- --   \",\n        \"--  --  \",\n        \"---- -- \",\n        \"  --    \",\n        \" --     \"\n      ]\n    },\n    \"ŗ\": {\n      \"ch\": \"ŗ\",\n      \"code\": 343,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"-- ---- \",\n        \"----    \",\n        \"---     \",\n        \"--      \",\n        \"--      \",\n        \"--      \",\n        \"---     \",\n        \" --     \",\n        \"--      \"\n      ]\n    },\n    \"Ř\": {\n      \"ch\": \"Ř\",\n      \"code\": 344,\n      \"map\": [\n        \" -- --  \",\n        \"  ---   \",\n        \"        \",\n        \"------  \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"------  \",\n        \"----    \",\n        \"-- --   \",\n        \"--  --  \",\n        \"--   -- \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ř\": {\n      \"ch\": \"ř\",\n      \"code\": 345,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \" -- --  \",\n        \"  ---   \",\n        \"        \",\n        \"-- ---- \",\n        \"----    \",\n        \"---     \",\n        \"--      \",\n        \"--      \",\n        \"--      \",\n        \"--      \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ś\": {\n      \"ch\": \"Ś\",\n      \"code\": 346,\n      \"map\": [\n        \"   --   \",\n        \"  --    \",\n        \"        \",\n        \" -----  \",\n        \"--   -- \",\n        \"--      \",\n        \"--      \",\n        \" -----  \",\n        \"     -- \",\n        \"     -- \",\n        \"--   -- \",\n        \" -----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ś\": {\n      \"ch\": \"ś\",\n      \"code\": 347,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"    --  \",\n        \"   --   \",\n        \"        \",\n        \" ------ \",\n        \"--      \",\n        \"--      \",\n        \" -----  \",\n        \"     -- \",\n        \"     -- \",\n        \"------  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ŝ\": {\n      \"ch\": \"Ŝ\",\n      \"code\": 348,\n      \"map\": [\n        \"  ---   \",\n        \" -- --  \",\n        \"        \",\n        \" -----  \",\n        \"--   -- \",\n        \"--      \",\n        \"--      \",\n        \" -----  \",\n        \"     -- \",\n        \"     -- \",\n        \"--   -- \",\n        \" -----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ŝ\": {\n      \"ch\": \"ŝ\",\n      \"code\": 349,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"  ---   \",\n        \" -- --  \",\n        \"        \",\n        \" ------ \",\n        \"--      \",\n        \"--      \",\n        \" -----  \",\n        \"     -- \",\n        \"     -- \",\n        \"------  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ş\": {\n      \"ch\": \"Ş\",\n      \"code\": 350,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \" -----  \",\n        \"--   -- \",\n        \"--      \",\n        \"--      \",\n        \" -----  \",\n        \"     -- \",\n        \"     -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \" -----  \",\n        \"  --    \",\n        \" --     \"\n      ]\n    },\n    \"ş\": {\n      \"ch\": \"ş\",\n      \"code\": 351,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \" ------ \",\n        \"--      \",\n        \"--      \",\n        \" -----  \",\n        \"     -- \",\n        \"     -- \",\n        \"------  \",\n        \"  --    \",\n        \" --     \"\n      ]\n    },\n    \"Š\": {\n      \"ch\": \"Š\",\n      \"code\": 352,\n      \"map\": [\n        \" -- --  \",\n        \"  ---   \",\n        \"        \",\n        \" -----  \",\n        \"--   -- \",\n        \"--      \",\n        \"--      \",\n        \" -----  \",\n        \"     -- \",\n        \"     -- \",\n        \"--   -- \",\n        \" -----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"š\": {\n      \"ch\": \"š\",\n      \"code\": 353,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \" -- --  \",\n        \"  ---   \",\n        \"        \",\n        \" ------ \",\n        \"--      \",\n        \"--      \",\n        \" -----  \",\n        \"     -- \",\n        \"     -- \",\n        \"------  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ţ\": {\n      \"ch\": \"Ţ\",\n      \"code\": 354,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"--------\",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   ---  \",\n        \"    --  \",\n        \"   --   \"\n      ]\n    },\n    \"ţ\": {\n      \"ch\": \"ţ\",\n      \"code\": 355,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"  --    \",\n        \"  --    \",\n        \"  --    \",\n        \"------  \",\n        \"  --    \",\n        \"  --    \",\n        \"  --    \",\n        \"  --    \",\n        \"  --    \",\n        \"   ---- \",\n        \"    --  \",\n        \"   --   \"\n      ]\n    },\n    \"Ť\": {\n      \"ch\": \"Ť\",\n      \"code\": 356,\n      \"map\": [\n        \" -- --  \",\n        \"  ---   \",\n        \"        \",\n        \"--------\",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ť\": {\n      \"ch\": \"ť\",\n      \"code\": 357,\n      \"map\": [\n        \" -- --  \",\n        \"  ---   \",\n        \"        \",\n        \"  --    \",\n        \"  --    \",\n        \"------  \",\n        \"  --    \",\n        \"  --    \",\n        \"  --    \",\n        \"  --    \",\n        \"  --    \",\n        \"   ---- \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ŧ\": {\n      \"ch\": \"Ŧ\",\n      \"code\": 358,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"--------\",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \" ------ \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ŧ\": {\n      \"ch\": \"ŧ\",\n      \"code\": 359,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"  --    \",\n        \"  --    \",\n        \"  --    \",\n        \"------  \",\n        \"  --    \",\n        \" ----   \",\n        \"  --    \",\n        \"  --    \",\n        \"  --    \",\n        \"   ---- \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ũ\": {\n      \"ch\": \"Ũ\",\n      \"code\": 360,\n      \"map\": [\n        \" --- -- \",\n        \"-- ---  \",\n        \"        \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \" -----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ũ\": {\n      \"ch\": \"ũ\",\n      \"code\": 361,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \" --- -- \",\n        \"-- ---  \",\n        \"        \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \" ------ \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ū\": {\n      \"ch\": \"Ū\",\n      \"code\": 362,\n      \"map\": [\n        \" -----  \",\n        \"        \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \" -----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ū\": {\n      \"ch\": \"ū\",\n      \"code\": 363,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \" -----  \",\n        \"        \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \" ------ \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ŭ\": {\n      \"ch\": \"Ŭ\",\n      \"code\": 364,\n      \"map\": [\n        \" -- --  \",\n        \"  ---   \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \" -----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ŭ\": {\n      \"ch\": \"ŭ\",\n      \"code\": 365,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \" -- --  \",\n        \"  ---   \",\n        \"        \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \" ------ \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ů\": {\n      \"ch\": \"Ů\",\n      \"code\": 366,\n      \"map\": [\n        \"  ---   \",\n        \" -- --  \",\n        \"  ---   \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \" -----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ů\": {\n      \"ch\": \"ů\",\n      \"code\": 367,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"  ---   \",\n        \" -- --  \",\n        \"  ---   \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \" ------ \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ű\": {\n      \"ch\": \"Ű\",\n      \"code\": 368,\n      \"map\": [\n        \"  -- -- \",\n        \" -- --  \",\n        \"        \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \" -----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ű\": {\n      \"ch\": \"ű\",\n      \"code\": 369,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"  -- -- \",\n        \" -- --  \",\n        \"        \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \" ------ \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ų\": {\n      \"ch\": \"Ų\",\n      \"code\": 370,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \" -----  \",\n        \"   --   \",\n        \"    --- \"\n      ]\n    },\n    \"ų\": {\n      \"ch\": \"ų\",\n      \"code\": 371,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \" ------ \",\n        \"    --  \",\n        \"     ---\"\n      ]\n    },\n    \"Ŵ\": {\n      \"ch\": \"Ŵ\",\n      \"code\": 372,\n      \"map\": [\n        \"  ---   \",\n        \" -- --  \",\n        \"        \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"-- - -- \",\n        \"------- \",\n        \"--- --- \",\n        \"--   -- \",\n        \"-     - \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ŵ\": {\n      \"ch\": \"ŵ\",\n      \"code\": 373,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"  ---   \",\n        \" -- --  \",\n        \"        \",\n        \"--   -- \",\n        \"--   -- \",\n        \"-- - -- \",\n        \"-- - -- \",\n        \"-- - -- \",\n        \"-- - -- \",\n        \" -----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ÿ\": {\n      \"ch\": \"Ÿ\",\n      \"code\": 376,\n      \"map\": [\n        \" --  -- \",\n        \" --  -- \",\n        \"        \",\n        \"--    --\",\n        \"--    --\",\n        \" --  -- \",\n        \" --  -- \",\n        \"  ----  \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ź\": {\n      \"ch\": \"Ź\",\n      \"code\": 377,\n      \"map\": [\n        \"   --   \",\n        \"  --    \",\n        \"        \",\n        \"------- \",\n        \"     -- \",\n        \"    --  \",\n        \"   --   \",\n        \"  --    \",\n        \" --     \",\n        \"--      \",\n        \"--      \",\n        \"------- \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ź\": {\n      \"ch\": \"ź\",\n      \"code\": 378,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"   --   \",\n        \"  --    \",\n        \"        \",\n        \"------- \",\n        \"    --  \",\n        \"   --   \",\n        \"  --    \",\n        \" --     \",\n        \"--      \",\n        \"------- \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ż\": {\n      \"ch\": \"Ż\",\n      \"code\": 379,\n      \"map\": [\n        \"   --   \",\n        \"   --   \",\n        \"        \",\n        \"------- \",\n        \"     -- \",\n        \"    --  \",\n        \"   --   \",\n        \"  --    \",\n        \" --     \",\n        \"--      \",\n        \"--      \",\n        \"------- \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ż\": {\n      \"ch\": \"ż\",\n      \"code\": 380,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"   --   \",\n        \"   --   \",\n        \"        \",\n        \"------- \",\n        \"    --  \",\n        \"   --   \",\n        \"  --    \",\n        \" --     \",\n        \"--      \",\n        \"------- \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ž\": {\n      \"ch\": \"Ž\",\n      \"code\": 381,\n      \"map\": [\n        \" -- --  \",\n        \"  ---   \",\n        \"        \",\n        \"------- \",\n        \"     -- \",\n        \"    --  \",\n        \"   --   \",\n        \"  --    \",\n        \" --     \",\n        \"--      \",\n        \"--      \",\n        \"------- \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ž\": {\n      \"ch\": \"ž\",\n      \"code\": 382,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \" -- --  \",\n        \"  ---   \",\n        \"        \",\n        \"------- \",\n        \"    --  \",\n        \"   --   \",\n        \"  --    \",\n        \" --     \",\n        \"--      \",\n        \"------- \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ſ\": {\n      \"ch\": \"ſ\",\n      \"code\": 383,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"   ---- \",\n        \"  --    \",\n        \"  --    \",\n        \"  --    \",\n        \"  --    \",\n        \"  --    \",\n        \"  --    \",\n        \"  --    \",\n        \"  --    \",\n        \"  --    \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ɔ\": {\n      \"ch\": \"Ɔ\",\n      \"code\": 390,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \" -----  \",\n        \"--   -- \",\n        \"--   -- \",\n        \"     -- \",\n        \"     -- \",\n        \"     -- \",\n        \"     -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \" -----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ǝ\": {\n      \"ch\": \"Ǝ\",\n      \"code\": 398,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"------- \",\n        \"     -- \",\n        \"     -- \",\n        \"     -- \",\n        \"  ----- \",\n        \"     -- \",\n        \"     -- \",\n        \"     -- \",\n        \"     -- \",\n        \"------- \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ə\": {\n      \"ch\": \"Ə\",\n      \"code\": 399,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \" -----  \",\n        \"--   -- \",\n        \"     -- \",\n        \"     -- \",\n        \"------- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \" -----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ɛ\": {\n      \"ch\": \"Ɛ\",\n      \"code\": 400,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \" -----  \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--      \",\n        \" ----   \",\n        \"--      \",\n        \"--      \",\n        \"--   -- \",\n        \"--   -- \",\n        \" -----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ƒ\": {\n      \"ch\": \"ƒ\",\n      \"code\": 402,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"    --- \",\n        \"   -- --\",\n        \"   --   \",\n        \"   --   \",\n        \" ------ \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"-- --   \",\n        \" ---    \"\n      ]\n    },\n    \"Ɲ\": {\n      \"ch\": \"Ɲ\",\n      \"code\": 413,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \" --  -- \",\n        \" --  -- \",\n        \" --  -- \",\n        \" --- -- \",\n        \" ------ \",\n        \" -- --- \",\n        \" --  -- \",\n        \" --  -- \",\n        \" --  -- \",\n        \" --  -- \",\n        \" --     \",\n        \"--      \"\n      ]\n    },\n    \"ƞ\": {\n      \"ch\": \"ƞ\",\n      \"code\": 414,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"------  \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"     -- \",\n        \"     -- \"\n      ]\n    },\n    \"Ʒ\": {\n      \"ch\": \"Ʒ\",\n      \"code\": 439,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"------- \",\n        \"     -- \",\n        \"    --  \",\n        \"   --   \",\n        \"  ----  \",\n        \"     -- \",\n        \"     -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \" -----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ș\": {\n      \"ch\": \"Ș\",\n      \"code\": 536,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \" -----  \",\n        \"--   -- \",\n        \"--      \",\n        \"--      \",\n        \" -----  \",\n        \"     -- \",\n        \"     -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \" -----  \",\n        \"  --    \",\n        \" --     \"\n      ]\n    },\n    \"ș\": {\n      \"ch\": \"ș\",\n      \"code\": 537,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \" ------ \",\n        \"--      \",\n        \"--      \",\n        \" -----  \",\n        \"     -- \",\n        \"     -- \",\n        \"------  \",\n        \"  --    \",\n        \" --     \"\n      ]\n    },\n    \"Ț\": {\n      \"ch\": \"Ț\",\n      \"code\": 538,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"--------\",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   ---  \",\n        \"    --  \",\n        \"   --   \"\n      ]\n    },\n    \"ț\": {\n      \"ch\": \"ț\",\n      \"code\": 539,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"  --    \",\n        \"  --    \",\n        \"  --    \",\n        \"------  \",\n        \"  --    \",\n        \"  --    \",\n        \"  --    \",\n        \"  --    \",\n        \"  --    \",\n        \"   ---- \",\n        \"     -- \",\n        \"    --  \"\n      ]\n    },\n    \"Ȳ\": {\n      \"ch\": \"Ȳ\",\n      \"code\": 562,\n      \"map\": [\n        \" ------ \",\n        \"        \",\n        \"--    --\",\n        \"--    --\",\n        \" --  -- \",\n        \" --  -- \",\n        \"  ----  \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ȳ\": {\n      \"ch\": \"ȳ\",\n      \"code\": 563,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \" -----  \",\n        \"        \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \" ------ \",\n        \"     -- \",\n        \" -----  \"\n      ]\n    },\n    \"ȷ\": {\n      \"ch\": \"ȷ\",\n      \"code\": 567,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"    --- \",\n        \"     -- \",\n        \"     -- \",\n        \"     -- \",\n        \"     -- \",\n        \"     -- \",\n        \" --  -- \",\n        \" --  -- \",\n        \"  ----  \"\n      ]\n    },\n    \"ɔ\": {\n      \"ch\": \"ɔ\",\n      \"code\": 596,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \" -----  \",\n        \"--   -- \",\n        \"     -- \",\n        \"     -- \",\n        \"     -- \",\n        \"--   -- \",\n        \" -----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ɘ\": {\n      \"ch\": \"ɘ\",\n      \"code\": 600,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \" -----  \",\n        \"--   -- \",\n        \"--   -- \",\n        \"------- \",\n        \"     -- \",\n        \"     -- \",\n        \" -----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ə\": {\n      \"ch\": \"ə\",\n      \"code\": 601,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \" -----  \",\n        \"     -- \",\n        \"     -- \",\n        \"------- \",\n        \"--   -- \",\n        \"--   -- \",\n        \" -----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ɛ\": {\n      \"ch\": \"ɛ\",\n      \"code\": 603,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \" -----  \",\n        \"--   -- \",\n        \"--      \",\n        \" ----   \",\n        \"--      \",\n        \"--   -- \",\n        \" -----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ɲ\": {\n      \"ch\": \"ɲ\",\n      \"code\": 626,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \" -----  \",\n        \" --  -- \",\n        \" --  -- \",\n        \" --  -- \",\n        \" --  -- \",\n        \" --  -- \",\n        \" --  -- \",\n        \" --     \",\n        \"--      \"\n      ]\n    },\n    \"ʒ\": {\n      \"ch\": \"ʒ\",\n      \"code\": 658,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"------- \",\n        \"     -- \",\n        \"    --  \",\n        \"   --   \",\n        \"  ----  \",\n        \"     -- \",\n        \"     -- \",\n        \"--   -- \",\n        \" -----  \"\n      ]\n    },\n    \"ʻ\": {\n      \"ch\": \"ʻ\",\n      \"code\": 699,\n      \"map\": [\n        \"   --   \",\n        \"  --    \",\n        \"  --    \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ʼ\": {\n      \"ch\": \"ʼ\",\n      \"code\": 700,\n      \"map\": [\n        \"   --   \",\n        \"   --   \",\n        \"  --    \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ʽ\": {\n      \"ch\": \"ʽ\",\n      \"code\": 701,\n      \"map\": [\n        \"  --    \",\n        \"  --    \",\n        \"   --   \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ˆ\": {\n      \"ch\": \"ˆ\",\n      \"code\": 710,\n      \"map\": [\n        \"  ---   \",\n        \" -- --  \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ˇ\": {\n      \"ch\": \"ˇ\",\n      \"code\": 711,\n      \"map\": [\n        \" -- --  \",\n        \"  ---   \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"˘\": {\n      \"ch\": \"˘\",\n      \"code\": 728,\n      \"map\": [\n        \" -- --  \",\n        \"  ---   \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"˙\": {\n      \"ch\": \"˙\",\n      \"code\": 729,\n      \"map\": [\n        \"   --   \",\n        \"   --   \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"˛\": {\n      \"ch\": \"˛\",\n      \"code\": 731,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"     -- \",\n        \"    --  \",\n        \"     ---\"\n      ]\n    },\n    \"˜\": {\n      \"ch\": \"˜\",\n      \"code\": 732,\n      \"map\": [\n        \" --- -- \",\n        \"-- ---  \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"˝\": {\n      \"ch\": \"˝\",\n      \"code\": 733,\n      \"map\": [\n        \"  -- -- \",\n        \" -- --  \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"̀\": {\n      \"ch\": \"̀\",\n      \"code\": 768,\n      \"map\": [\n        \"  --    \",\n        \"   --   \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"́\": {\n      \"ch\": \"́\",\n      \"code\": 769,\n      \"map\": [\n        \"   --   \",\n        \"  --    \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"̂\": {\n      \"ch\": \"̂\",\n      \"code\": 770,\n      \"map\": [\n        \"  ---   \",\n        \" -- --  \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"̃\": {\n      \"ch\": \"̃\",\n      \"code\": 771,\n      \"map\": [\n        \" --- -- \",\n        \"-- ---  \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"̆\": {\n      \"ch\": \"̆\",\n      \"code\": 774,\n      \"map\": [\n        \" -- --  \",\n        \"  ---   \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"̌\": {\n      \"ch\": \"̌\",\n      \"code\": 780,\n      \"map\": [\n        \" -- --  \",\n        \"  ---   \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"̩\": {\n      \"ch\": \"̩\",\n      \"code\": 809,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"   --   \",\n        \"   --   \"\n      ]\n    },\n    \"΄\": {\n      \"ch\": \"΄\",\n      \"code\": 900,\n      \"map\": [\n        \" --     \",\n        \"--      \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"΅\": {\n      \"ch\": \"΅\",\n      \"code\": 901,\n      \"map\": [\n        \"   --   \",\n        \"  --    \",\n        \"        \",\n        \" -- --  \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ά\": {\n      \"ch\": \"Ά\",\n      \"code\": 902,\n      \"map\": [\n        \" --     \",\n        \"--      \",\n        \" -----  \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"------- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"·\": {\n      \"ch\": \"·\",\n      \"code\": 903,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"   --   \",\n        \"   --   \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Έ\": {\n      \"ch\": \"Έ\",\n      \"code\": 904,\n      \"map\": [\n        \" --     \",\n        \"--      \",\n        \"        \",\n        \"------- \",\n        \"--      \",\n        \"--      \",\n        \"--      \",\n        \"-----   \",\n        \"--      \",\n        \"--      \",\n        \"--      \",\n        \"------- \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ή\": {\n      \"ch\": \"Ή\",\n      \"code\": 905,\n      \"map\": [\n        \" --     \",\n        \"--      \",\n        \"        \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"------- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ί\": {\n      \"ch\": \"Ί\",\n      \"code\": 906,\n      \"map\": [\n        \" --     \",\n        \"--      \",\n        \"  ----  \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"  ----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ό\": {\n      \"ch\": \"Ό\",\n      \"code\": 908,\n      \"map\": [\n        \" --     \",\n        \"--      \",\n        \" -----  \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \" -----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ύ\": {\n      \"ch\": \"Ύ\",\n      \"code\": 910,\n      \"map\": [\n        \" --     \",\n        \"--      \",\n        \"        \",\n        \"--    --\",\n        \"--    --\",\n        \" --  -- \",\n        \" --  -- \",\n        \"  ----  \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ώ\": {\n      \"ch\": \"Ώ\",\n      \"code\": 911,\n      \"map\": [\n        \" --     \",\n        \"--      \",\n        \" -----  \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \" -- --  \",\n        \" -- --  \",\n        \"--- --- \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ΐ\": {\n      \"ch\": \"ΐ\",\n      \"code\": 912,\n      \"map\": [\n        \"   --   \",\n        \"  --    \",\n        \"-- --   \",\n        \"-- --   \",\n        \"        \",\n        \" ---    \",\n        \"  --    \",\n        \"  --    \",\n        \"  --    \",\n        \"  --    \",\n        \"  --    \",\n        \"   ---  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Α\": {\n      \"ch\": \"Α\",\n      \"code\": 913,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \" -----  \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"------- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Β\": {\n      \"ch\": \"Β\",\n      \"code\": 914,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"------  \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"------  \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"------  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Γ\": {\n      \"ch\": \"Γ\",\n      \"code\": 915,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"------- \",\n        \"--      \",\n        \"--      \",\n        \"--      \",\n        \"--      \",\n        \"--      \",\n        \"--      \",\n        \"--      \",\n        \"--      \",\n        \"--      \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Δ\": {\n      \"ch\": \"Δ\",\n      \"code\": 916,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"   -    \",\n        \"   -    \",\n        \"  ---   \",\n        \"  ---   \",\n        \" -- --  \",\n        \" -- --  \",\n        \" -- --  \",\n        \"--   -- \",\n        \"--   -- \",\n        \"------- \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ε\": {\n      \"ch\": \"Ε\",\n      \"code\": 917,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"------- \",\n        \"--      \",\n        \"--      \",\n        \"--      \",\n        \"-----   \",\n        \"--      \",\n        \"--      \",\n        \"--      \",\n        \"--      \",\n        \"------- \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ζ\": {\n      \"ch\": \"Ζ\",\n      \"code\": 918,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"------- \",\n        \"     -- \",\n        \"     -- \",\n        \"    --  \",\n        \"   --   \",\n        \"  --    \",\n        \" --     \",\n        \"--      \",\n        \"--      \",\n        \"------- \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Η\": {\n      \"ch\": \"Η\",\n      \"code\": 919,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"------- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Θ\": {\n      \"ch\": \"Θ\",\n      \"code\": 920,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \" -----  \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"-- - -- \",\n        \"-- - -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \" -----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ι\": {\n      \"ch\": \"Ι\",\n      \"code\": 921,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"  ----  \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"  ----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Κ\": {\n      \"ch\": \"Κ\",\n      \"code\": 922,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--  --  \",\n        \"-- --   \",\n        \"----    \",\n        \"----    \",\n        \"-- --   \",\n        \"--  --  \",\n        \"--   -- \",\n        \"--   -- \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Λ\": {\n      \"ch\": \"Λ\",\n      \"code\": 923,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"   -    \",\n        \"   -    \",\n        \"  ---   \",\n        \"  ---   \",\n        \" -- --  \",\n        \" -- --  \",\n        \" -- --  \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Μ\": {\n      \"ch\": \"Μ\",\n      \"code\": 924,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"-     - \",\n        \"--   -- \",\n        \"--- --- \",\n        \"------- \",\n        \"-- - -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ν\": {\n      \"ch\": \"Ν\",\n      \"code\": 925,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"---  -- \",\n        \"---- -- \",\n        \"-- ---- \",\n        \"--  --- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ξ\": {\n      \"ch\": \"Ξ\",\n      \"code\": 926,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"------- \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \" -----  \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"------- \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ο\": {\n      \"ch\": \"Ο\",\n      \"code\": 927,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \" -----  \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \" -----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Π\": {\n      \"ch\": \"Π\",\n      \"code\": 928,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"------- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ρ\": {\n      \"ch\": \"Ρ\",\n      \"code\": 929,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"------  \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"------  \",\n        \"--      \",\n        \"--      \",\n        \"--      \",\n        \"--      \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Σ\": {\n      \"ch\": \"Σ\",\n      \"code\": 931,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"------- \",\n        \"--      \",\n        \" --     \",\n        \"  --    \",\n        \"   --   \",\n        \"   --   \",\n        \"  --    \",\n        \" --     \",\n        \"--      \",\n        \"------- \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Τ\": {\n      \"ch\": \"Τ\",\n      \"code\": 932,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"--------\",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Υ\": {\n      \"ch\": \"Υ\",\n      \"code\": 933,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"--    --\",\n        \"--    --\",\n        \" --  -- \",\n        \" --  -- \",\n        \"  ----  \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Φ\": {\n      \"ch\": \"Φ\",\n      \"code\": 934,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"   -    \",\n        \" -----  \",\n        \"-- - -- \",\n        \"-- - -- \",\n        \"-- - -- \",\n        \"-- - -- \",\n        \"-- - -- \",\n        \"-- - -- \",\n        \" -----  \",\n        \"   -    \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Χ\": {\n      \"ch\": \"Χ\",\n      \"code\": 935,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"--   -- \",\n        \"--   -- \",\n        \" -- --  \",\n        \" -- --  \",\n        \"  ---   \",\n        \"  ---   \",\n        \" -- --  \",\n        \" -- --  \",\n        \"--   -- \",\n        \"--   -- \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ψ\": {\n      \"ch\": \"Ψ\",\n      \"code\": 936,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"-- - -- \",\n        \"-- - -- \",\n        \"-- - -- \",\n        \"-- - -- \",\n        \"-- - -- \",\n        \"-- - -- \",\n        \"-- - -- \",\n        \" -----  \",\n        \"   -    \",\n        \"   -    \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ω\": {\n      \"ch\": \"Ω\",\n      \"code\": 937,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \" -----  \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \" -- --  \",\n        \" -- --  \",\n        \"--- --- \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ϊ\": {\n      \"ch\": \"Ϊ\",\n      \"code\": 938,\n      \"map\": [\n        \" --  -- \",\n        \" --  -- \",\n        \"        \",\n        \"  ----  \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"  ----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ϋ\": {\n      \"ch\": \"Ϋ\",\n      \"code\": 939,\n      \"map\": [\n        \" --  -- \",\n        \" --  -- \",\n        \"        \",\n        \"--    --\",\n        \"--    --\",\n        \" --  -- \",\n        \" --  -- \",\n        \"  ----  \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ά\": {\n      \"ch\": \"ά\",\n      \"code\": 940,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"   --   \",\n        \"  --    \",\n        \"        \",\n        \" ---- - \",\n        \"--  --- \",\n        \"--  --  \",\n        \"--  --  \",\n        \"--  --  \",\n        \"--  --- \",\n        \" ---- - \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"έ\": {\n      \"ch\": \"έ\",\n      \"code\": 941,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"   --   \",\n        \"  --    \",\n        \"        \",\n        \" -----  \",\n        \"--   -- \",\n        \"--      \",\n        \" ----   \",\n        \"--      \",\n        \"--   -- \",\n        \" -----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ή\": {\n      \"ch\": \"ή\",\n      \"code\": 942,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"   --   \",\n        \"  --    \",\n        \"        \",\n        \"------  \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"     -- \",\n        \"     -- \"\n      ]\n    },\n    \"ί\": {\n      \"ch\": \"ί\",\n      \"code\": 943,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"   --   \",\n        \"  --    \",\n        \"        \",\n        \" ---    \",\n        \"  --    \",\n        \"  --    \",\n        \"  --    \",\n        \"  --    \",\n        \"  --    \",\n        \"   ---  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ΰ\": {\n      \"ch\": \"ΰ\",\n      \"code\": 944,\n      \"map\": [\n        \"   --   \",\n        \"  --    \",\n        \"        \",\n        \" -- --  \",\n        \"        \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \" -----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"α\": {\n      \"ch\": \"α\",\n      \"code\": 945,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \" ---- - \",\n        \"--  --- \",\n        \"--  --  \",\n        \"--  --  \",\n        \"--  --  \",\n        \"--  --- \",\n        \" ---- - \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"β\": {\n      \"ch\": \"β\",\n      \"code\": 946,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \" ----   \",\n        \"--  --  \",\n        \"--  --  \",\n        \"--  -   \",\n        \"------  \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"------  \",\n        \"--      \",\n        \"--      \"\n      ]\n    },\n    \"γ\": {\n      \"ch\": \"γ\",\n      \"code\": 947,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"--    --\",\n        \"--    --\",\n        \" --  -- \",\n        \" --  -- \",\n        \"  ----  \",\n        \"  ----  \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \"\n      ]\n    },\n    \"δ\": {\n      \"ch\": \"δ\",\n      \"code\": 948,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \" ------ \",\n        \"  --    \",\n        \"   --   \",\n        \" -----  \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \" -----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ε\": {\n      \"ch\": \"ε\",\n      \"code\": 949,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \" -----  \",\n        \"--   -- \",\n        \"--      \",\n        \" ----   \",\n        \"--      \",\n        \"--   -- \",\n        \" -----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ζ\": {\n      \"ch\": \"ζ\",\n      \"code\": 950,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"------- \",\n        \"    --  \",\n        \"   --   \",\n        \"  --    \",\n        \" --     \",\n        \"--      \",\n        \"--      \",\n        \"--      \",\n        \"--      \",\n        \" -----  \",\n        \"     -- \",\n        \"    --  \"\n      ]\n    },\n    \"η\": {\n      \"ch\": \"η\",\n      \"code\": 951,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"------  \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"     -- \",\n        \"     -- \"\n      ]\n    },\n    \"θ\": {\n      \"ch\": \"θ\",\n      \"code\": 952,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"  ----  \",\n        \" --  -- \",\n        \" --  -- \",\n        \" --  -- \",\n        \" ------ \",\n        \" --  -- \",\n        \" --  -- \",\n        \" --  -- \",\n        \" --  -- \",\n        \"  ----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ι\": {\n      \"ch\": \"ι\",\n      \"code\": 953,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \" ---    \",\n        \"  --    \",\n        \"  --    \",\n        \"  --    \",\n        \"  --    \",\n        \"  --    \",\n        \"   ---  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"κ\": {\n      \"ch\": \"κ\",\n      \"code\": 954,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"--   -- \",\n        \"--  --  \",\n        \"-- --   \",\n        \"----    \",\n        \"-- --   \",\n        \"--  --  \",\n        \"--   -- \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"λ\": {\n      \"ch\": \"λ\",\n      \"code\": 955,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"  --    \",\n        \"  --    \",\n        \"   --   \",\n        \"   --   \",\n        \"  ----  \",\n        \"  ----  \",\n        \" --  -- \",\n        \" --  -- \",\n        \"--    --\",\n        \"--    --\",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"μ\": {\n      \"ch\": \"μ\",\n      \"code\": 956,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--  --- \",\n        \"---- -- \",\n        \"--      \",\n        \"--      \"\n      ]\n    },\n    \"ν\": {\n      \"ch\": \"ν\",\n      \"code\": 957,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \" -- --  \",\n        \" -- --  \",\n        \"  ---   \",\n        \"  ---   \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ξ\": {\n      \"ch\": \"ξ\",\n      \"code\": 958,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \" ------ \",\n        \"--      \",\n        \"--      \",\n        \"--      \",\n        \" -----  \",\n        \"--      \",\n        \"--      \",\n        \"--      \",\n        \"--      \",\n        \" -----  \",\n        \"     -- \",\n        \"    --  \"\n      ]\n    },\n    \"ο\": {\n      \"ch\": \"ο\",\n      \"code\": 959,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \" -----  \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \" -----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"π\": {\n      \"ch\": \"π\",\n      \"code\": 960,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"------- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ρ\": {\n      \"ch\": \"ρ\",\n      \"code\": 961,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \" -----  \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"------  \",\n        \"--      \",\n        \"--      \"\n      ]\n    },\n    \"ς\": {\n      \"ch\": \"ς\",\n      \"code\": 962,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \" -----  \",\n        \"--   -- \",\n        \"--      \",\n        \"--      \",\n        \"--      \",\n        \"--      \",\n        \" -----  \",\n        \"     -- \",\n        \"    --  \"\n      ]\n    },\n    \"σ\": {\n      \"ch\": \"σ\",\n      \"code\": 963,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"  ------\",\n        \" --  -- \",\n        \" --  -- \",\n        \" --  -- \",\n        \" --  -- \",\n        \" --  -- \",\n        \"  ----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"τ\": {\n      \"ch\": \"τ\",\n      \"code\": 964,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"--------\",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"    --- \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"υ\": {\n      \"ch\": \"υ\",\n      \"code\": 965,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \" -----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"φ\": {\n      \"ch\": \"φ\",\n      \"code\": 966,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \" -  --  \",\n        \"-- - -- \",\n        \"-- - -- \",\n        \"-- - -- \",\n        \"-- - -- \",\n        \"-- - -- \",\n        \" -----  \",\n        \"   -    \",\n        \"   -    \"\n      ]\n    },\n    \"χ\": {\n      \"ch\": \"χ\",\n      \"code\": 967,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"--   -- \",\n        \"--   -- \",\n        \" -- --  \",\n        \" -- --  \",\n        \"  ---   \",\n        \" -- --  \",\n        \" -- --  \",\n        \"--   -- \",\n        \"--   -- \"\n      ]\n    },\n    \"ψ\": {\n      \"ch\": \"ψ\",\n      \"code\": 968,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"-- - -- \",\n        \"-- - -- \",\n        \"-- - -- \",\n        \"-- - -- \",\n        \"-- - -- \",\n        \"-- - -- \",\n        \" -----  \",\n        \"   -    \",\n        \"   -    \"\n      ]\n    },\n    \"ω\": {\n      \"ch\": \"ω\",\n      \"code\": 969,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \" -   -  \",\n        \"--   -- \",\n        \"-- - -- \",\n        \"-- - -- \",\n        \"-- - -- \",\n        \"------- \",\n        \" -- --  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ϊ\": {\n      \"ch\": \"ϊ\",\n      \"code\": 970,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"-- --   \",\n        \"-- --   \",\n        \"        \",\n        \" ---    \",\n        \"  --    \",\n        \"  --    \",\n        \"  --    \",\n        \"  --    \",\n        \"  --    \",\n        \"   ---  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ϋ\": {\n      \"ch\": \"ϋ\",\n      \"code\": 971,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \" -- --  \",\n        \" -- --  \",\n        \"        \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \" -----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ό\": {\n      \"ch\": \"ό\",\n      \"code\": 972,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"   --   \",\n        \"  --    \",\n        \"        \",\n        \" -----  \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \" -----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ύ\": {\n      \"ch\": \"ύ\",\n      \"code\": 973,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"   --   \",\n        \"  --    \",\n        \"        \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \" -----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ώ\": {\n      \"ch\": \"ώ\",\n      \"code\": 974,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"   --   \",\n        \"  --    \",\n        \"        \",\n        \" -   -  \",\n        \"--   -- \",\n        \"-- - -- \",\n        \"-- - -- \",\n        \"-- - -- \",\n        \"------- \",\n        \" -- --  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ϳ\": {\n      \"ch\": \"ϳ\",\n      \"code\": 1011,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"     -- \",\n        \"     -- \",\n        \"        \",\n        \"    --- \",\n        \"     -- \",\n        \"     -- \",\n        \"     -- \",\n        \"     -- \",\n        \"     -- \",\n        \" --  -- \",\n        \" --  -- \",\n        \"  ----  \"\n      ]\n    },\n    \"ϴ\": {\n      \"ch\": \"ϴ\",\n      \"code\": 1012,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \" -----  \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"------- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \" -----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ѐ\": {\n      \"ch\": \"Ѐ\",\n      \"code\": 1024,\n      \"map\": [\n        \"  --    \",\n        \"   --   \",\n        \"        \",\n        \"------- \",\n        \"--      \",\n        \"--      \",\n        \"--      \",\n        \"-----   \",\n        \"--      \",\n        \"--      \",\n        \"--      \",\n        \"------- \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ё\": {\n      \"ch\": \"Ё\",\n      \"code\": 1025,\n      \"map\": [\n        \" -- --  \",\n        \" -- --  \",\n        \"        \",\n        \"------- \",\n        \"--      \",\n        \"--      \",\n        \"--      \",\n        \"-----   \",\n        \"--      \",\n        \"--      \",\n        \"--      \",\n        \"------- \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ђ\": {\n      \"ch\": \"Ђ\",\n      \"code\": 1026,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"----    \",\n        \" --     \",\n        \" --     \",\n        \" -----  \",\n        \" --  -- \",\n        \" --  -- \",\n        \" --  -- \",\n        \" --  -- \",\n        \" --  -- \",\n        \" -- --  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ѓ\": {\n      \"ch\": \"Ѓ\",\n      \"code\": 1027,\n      \"map\": [\n        \"   --   \",\n        \"  --    \",\n        \"        \",\n        \"------- \",\n        \"--      \",\n        \"--      \",\n        \"--      \",\n        \"--      \",\n        \"--      \",\n        \"--      \",\n        \"--      \",\n        \"--      \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Є\": {\n      \"ch\": \"Є\",\n      \"code\": 1028,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \" -----  \",\n        \"--   -- \",\n        \"--      \",\n        \"--      \",\n        \"-----   \",\n        \"--      \",\n        \"--      \",\n        \"--      \",\n        \"--   -- \",\n        \" -----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ѕ\": {\n      \"ch\": \"Ѕ\",\n      \"code\": 1029,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \" -----  \",\n        \"--   -- \",\n        \"--      \",\n        \"--      \",\n        \" -----  \",\n        \"     -- \",\n        \"     -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \" -----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"І\": {\n      \"ch\": \"І\",\n      \"code\": 1030,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"  ----  \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"  ----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ї\": {\n      \"ch\": \"Ї\",\n      \"code\": 1031,\n      \"map\": [\n        \" --  -- \",\n        \" --  -- \",\n        \"        \",\n        \"  ----  \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"  ----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ј\": {\n      \"ch\": \"Ј\",\n      \"code\": 1032,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"   ---- \",\n        \"    --  \",\n        \"    --  \",\n        \"    --  \",\n        \"    --  \",\n        \"    --  \",\n        \"    --  \",\n        \"--  --  \",\n        \"--  --  \",\n        \" ----   \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Љ\": {\n      \"ch\": \"Љ\",\n      \"code\": 1033,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"  --    \",\n        \" ---    \",\n        \"-- -    \",\n        \"-- ---  \",\n        \"-- - -- \",\n        \"-- - -- \",\n        \"-- - -- \",\n        \"-- - -- \",\n        \"-- - -- \",\n        \"-  ---  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Њ\": {\n      \"ch\": \"Њ\",\n      \"code\": 1034,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"-- -    \",\n        \"-- -    \",\n        \"-- -    \",\n        \"-- ---  \",\n        \"---- -- \",\n        \"-- - -- \",\n        \"-- - -- \",\n        \"-- - -- \",\n        \"-- - -- \",\n        \"-- ---  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ћ\": {\n      \"ch\": \"Ћ\",\n      \"code\": 1035,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"----    \",\n        \" --     \",\n        \" --     \",\n        \" -----  \",\n        \" --  -- \",\n        \" --  -- \",\n        \" --  -- \",\n        \" --  -- \",\n        \" --  -- \",\n        \" --  -- \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ќ\": {\n      \"ch\": \"Ќ\",\n      \"code\": 1036,\n      \"map\": [\n        \"   --   \",\n        \"  --    \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--  --  \",\n        \"-- --   \",\n        \"----    \",\n        \"----    \",\n        \"-- --   \",\n        \"--  --  \",\n        \"--   -- \",\n        \"--   -- \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ѝ\": {\n      \"ch\": \"Ѝ\",\n      \"code\": 1037,\n      \"map\": [\n        \"  --    \",\n        \"   --   \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--  --- \",\n        \"-- ---- \",\n        \"---- -- \",\n        \"---  -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ў\": {\n      \"ch\": \"Ў\",\n      \"code\": 1038,\n      \"map\": [\n        \" -- --  \",\n        \"  ---   \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \" ------ \",\n        \"     -- \",\n        \"     -- \",\n        \"     -- \",\n        \" -----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Џ\": {\n      \"ch\": \"Џ\",\n      \"code\": 1039,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"------- \",\n        \"  ---   \",\n        \"  ---   \"\n      ]\n    },\n    \"А\": {\n      \"ch\": \"А\",\n      \"code\": 1040,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \" -----  \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"------- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Б\": {\n      \"ch\": \"Б\",\n      \"code\": 1041,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"------  \",\n        \"--      \",\n        \"--      \",\n        \"------  \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"------  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"В\": {\n      \"ch\": \"В\",\n      \"code\": 1042,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"------  \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"------  \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"------  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Г\": {\n      \"ch\": \"Г\",\n      \"code\": 1043,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"------- \",\n        \"--      \",\n        \"--      \",\n        \"--      \",\n        \"--      \",\n        \"--      \",\n        \"--      \",\n        \"--      \",\n        \"--      \",\n        \"--      \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Д\": {\n      \"ch\": \"Д\",\n      \"code\": 1044,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"  ----- \",\n        \" --  -- \",\n        \" --  -- \",\n        \" --  -- \",\n        \" --  -- \",\n        \" --  -- \",\n        \" --  -- \",\n        \" --  -- \",\n        \" --  -- \",\n        \"--------\",\n        \"--    --\",\n        \"        \"\n      ]\n    },\n    \"Е\": {\n      \"ch\": \"Е\",\n      \"code\": 1045,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"------- \",\n        \"--      \",\n        \"--      \",\n        \"--      \",\n        \"-----   \",\n        \"--      \",\n        \"--      \",\n        \"--      \",\n        \"--      \",\n        \"------- \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ж\": {\n      \"ch\": \"Ж\",\n      \"code\": 1046,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"-- - -- \",\n        \"-- - -- \",\n        \"-- - -- \",\n        \" -----  \",\n        \"  ---   \",\n        \" -----  \",\n        \"-- - -- \",\n        \"-- - -- \",\n        \"-- - -- \",\n        \"-- - -- \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"З\": {\n      \"ch\": \"З\",\n      \"code\": 1047,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \" -----  \",\n        \"--   -- \",\n        \"--   -- \",\n        \"     -- \",\n        \"  ----  \",\n        \"     -- \",\n        \"     -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \" -----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"И\": {\n      \"ch\": \"И\",\n      \"code\": 1048,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--  --- \",\n        \"-- ---- \",\n        \"---- -- \",\n        \"---  -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Й\": {\n      \"ch\": \"Й\",\n      \"code\": 1049,\n      \"map\": [\n        \" -- --  \",\n        \"  ---   \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--  --- \",\n        \"-- ---- \",\n        \"---- -- \",\n        \"---  -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"К\": {\n      \"ch\": \"К\",\n      \"code\": 1050,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--  --  \",\n        \"-- --   \",\n        \"----    \",\n        \"----    \",\n        \"-- --   \",\n        \"--  --  \",\n        \"--   -- \",\n        \"--   -- \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Л\": {\n      \"ch\": \"Л\",\n      \"code\": 1051,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"   ---- \",\n        \"  -- -- \",\n        \" --  -- \",\n        \" --  -- \",\n        \" --  -- \",\n        \" --  -- \",\n        \" --  -- \",\n        \" --  -- \",\n        \" --  -- \",\n        \"--   -- \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"М\": {\n      \"ch\": \"М\",\n      \"code\": 1052,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"-     - \",\n        \"--   -- \",\n        \"--- --- \",\n        \"------- \",\n        \"-- - -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Н\": {\n      \"ch\": \"Н\",\n      \"code\": 1053,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"------- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"О\": {\n      \"ch\": \"О\",\n      \"code\": 1054,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \" -----  \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \" -----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"П\": {\n      \"ch\": \"П\",\n      \"code\": 1055,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"------- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Р\": {\n      \"ch\": \"Р\",\n      \"code\": 1056,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"------  \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"------  \",\n        \"--      \",\n        \"--      \",\n        \"--      \",\n        \"--      \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"С\": {\n      \"ch\": \"С\",\n      \"code\": 1057,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \" -----  \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--      \",\n        \"--      \",\n        \"--      \",\n        \"--      \",\n        \"--   -- \",\n        \"--   -- \",\n        \" -----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Т\": {\n      \"ch\": \"Т\",\n      \"code\": 1058,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"--------\",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"У\": {\n      \"ch\": \"У\",\n      \"code\": 1059,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \" ------ \",\n        \"     -- \",\n        \"     -- \",\n        \"     -- \",\n        \" -----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ф\": {\n      \"ch\": \"Ф\",\n      \"code\": 1060,\n      \"map\": [\n        \"        \",\n        \"   -    \",\n        \" -----  \",\n        \"-- - -- \",\n        \"-- - -- \",\n        \"-- - -- \",\n        \"-- - -- \",\n        \"-- - -- \",\n        \"-- - -- \",\n        \"-- - -- \",\n        \"-- - -- \",\n        \" -----  \",\n        \"   -    \",\n        \"        \"\n      ]\n    },\n    \"Х\": {\n      \"ch\": \"Х\",\n      \"code\": 1061,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"--   -- \",\n        \"--   -- \",\n        \" -- --  \",\n        \" -- --  \",\n        \"  ---   \",\n        \"  ---   \",\n        \" -- --  \",\n        \" -- --  \",\n        \"--   -- \",\n        \"--   -- \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ц\": {\n      \"ch\": \"Ц\",\n      \"code\": 1062,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \" -------\",\n        \"      --\",\n        \"      --\"\n      ]\n    },\n    \"Ч\": {\n      \"ch\": \"Ч\",\n      \"code\": 1063,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \" ------ \",\n        \"     -- \",\n        \"     -- \",\n        \"     -- \",\n        \"     -- \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ш\": {\n      \"ch\": \"Ш\",\n      \"code\": 1064,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"-- - -- \",\n        \"-- - -- \",\n        \"-- - -- \",\n        \"-- - -- \",\n        \"-- - -- \",\n        \"-- - -- \",\n        \"-- - -- \",\n        \"-- - -- \",\n        \"-- - -- \",\n        \" ------ \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Щ\": {\n      \"ch\": \"Щ\",\n      \"code\": 1065,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"-- - -- \",\n        \"-- - -- \",\n        \"-- - -- \",\n        \"-- - -- \",\n        \"-- - -- \",\n        \"-- - -- \",\n        \"-- - -- \",\n        \"-- - -- \",\n        \"-- - -- \",\n        \" -------\",\n        \"      --\",\n        \"      --\"\n      ]\n    },\n    \"Ъ\": {\n      \"ch\": \"Ъ\",\n      \"code\": 1066,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"---     \",\n        \" --     \",\n        \" --     \",\n        \" -----  \",\n        \" --  -- \",\n        \" --  -- \",\n        \" --  -- \",\n        \" --  -- \",\n        \" --  -- \",\n        \" -----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ы\": {\n      \"ch\": \"Ы\",\n      \"code\": 1067,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"---  -- \",\n        \"-- - -- \",\n        \"-- - -- \",\n        \"-- - -- \",\n        \"-- - -- \",\n        \"-- - -- \",\n        \"---  -- \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ь\": {\n      \"ch\": \"Ь\",\n      \"code\": 1068,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \" --     \",\n        \" --     \",\n        \" --     \",\n        \" -----  \",\n        \" --  -- \",\n        \" --  -- \",\n        \" --  -- \",\n        \" --  -- \",\n        \" --  -- \",\n        \" -----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Э\": {\n      \"ch\": \"Э\",\n      \"code\": 1069,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \" -----  \",\n        \"--   -- \",\n        \"     -- \",\n        \"     -- \",\n        \"  ----- \",\n        \"     -- \",\n        \"     -- \",\n        \"     -- \",\n        \"--   -- \",\n        \" -----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ю\": {\n      \"ch\": \"Ю\",\n      \"code\": 1070,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"--  --  \",\n        \"-- - -- \",\n        \"-- - -- \",\n        \"-- - -- \",\n        \"-- - -- \",\n        \"---- -- \",\n        \"-- - -- \",\n        \"-- - -- \",\n        \"-- - -- \",\n        \"--  --  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Я\": {\n      \"ch\": \"Я\",\n      \"code\": 1071,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \" ------ \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \" ------ \",\n        \"   ---- \",\n        \"  -- -- \",\n        \" --  -- \",\n        \"--   -- \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"а\": {\n      \"ch\": \"а\",\n      \"code\": 1072,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \" -----  \",\n        \"     -- \",\n        \" ------ \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \" ------ \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"б\": {\n      \"ch\": \"б\",\n      \"code\": 1073,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \" -----  \",\n        \"--      \",\n        \"--      \",\n        \"------  \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"------  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"в\": {\n      \"ch\": \"в\",\n      \"code\": 1074,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \" ----   \",\n        \"--  --  \",\n        \"--  --  \",\n        \"--  -   \",\n        \"------  \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"------  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"г\": {\n      \"ch\": \"г\",\n      \"code\": 1075,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"------- \",\n        \"--      \",\n        \"--      \",\n        \"--      \",\n        \"--      \",\n        \"--      \",\n        \"--      \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"д\": {\n      \"ch\": \"д\",\n      \"code\": 1076,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \" ------ \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \" ------ \",\n        \"     -- \",\n        \" -----  \"\n      ]\n    },\n    \"е\": {\n      \"ch\": \"е\",\n      \"code\": 1077,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \" -----  \",\n        \"--   -- \",\n        \"--   -- \",\n        \"------- \",\n        \"--      \",\n        \"--      \",\n        \" -----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ж\": {\n      \"ch\": \"ж\",\n      \"code\": 1078,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"-- - -- \",\n        \"-- - -- \",\n        \" -----  \",\n        \"  ---   \",\n        \" -----  \",\n        \"-- - -- \",\n        \"-- - -- \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"з\": {\n      \"ch\": \"з\",\n      \"code\": 1079,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \" -----  \",\n        \"--   -- \",\n        \"     -- \",\n        \"  ----  \",\n        \"     -- \",\n        \"--   -- \",\n        \" -----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"и\": {\n      \"ch\": \"и\",\n      \"code\": 1080,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \" ------ \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"й\": {\n      \"ch\": \"й\",\n      \"code\": 1081,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \" -- --  \",\n        \"  ---   \",\n        \"        \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \" ------ \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"к\": {\n      \"ch\": \"к\",\n      \"code\": 1082,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"--   -- \",\n        \"--  --  \",\n        \"-- --   \",\n        \"----    \",\n        \"-- --   \",\n        \"--  --  \",\n        \"--   -- \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"л\": {\n      \"ch\": \"л\",\n      \"code\": 1083,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"  ----- \",\n        \" --  -- \",\n        \" --  -- \",\n        \" --  -- \",\n        \" --  -- \",\n        \" --  -- \",\n        \"--   -- \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"м\": {\n      \"ch\": \"м\",\n      \"code\": 1084,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"--   -- \",\n        \"--- --- \",\n        \"------- \",\n        \"-- - -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"н\": {\n      \"ch\": \"н\",\n      \"code\": 1085,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"------- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"о\": {\n      \"ch\": \"о\",\n      \"code\": 1086,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \" -----  \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \" -----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"п\": {\n      \"ch\": \"п\",\n      \"code\": 1087,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"------- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"р\": {\n      \"ch\": \"р\",\n      \"code\": 1088,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"------  \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"------  \",\n        \"--      \",\n        \"--      \"\n      ]\n    },\n    \"с\": {\n      \"ch\": \"с\",\n      \"code\": 1089,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \" -----  \",\n        \"--   -- \",\n        \"--      \",\n        \"--      \",\n        \"--      \",\n        \"--   -- \",\n        \" -----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"т\": {\n      \"ch\": \"т\",\n      \"code\": 1090,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"--------\",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"у\": {\n      \"ch\": \"у\",\n      \"code\": 1091,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \" ------ \",\n        \"     -- \",\n        \" -----  \"\n      ]\n    },\n    \"ф\": {\n      \"ch\": \"ф\",\n      \"code\": 1092,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"   -    \",\n        \" -----  \",\n        \"-- - -- \",\n        \"-- - -- \",\n        \"-- - -- \",\n        \"-- - -- \",\n        \"-- - -- \",\n        \" -----  \",\n        \"   -    \",\n        \"        \"\n      ]\n    },\n    \"х\": {\n      \"ch\": \"х\",\n      \"code\": 1093,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"--   -- \",\n        \"--   -- \",\n        \" -- --  \",\n        \"  ---   \",\n        \" -- --  \",\n        \"--   -- \",\n        \"--   -- \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ц\": {\n      \"ch\": \"ц\",\n      \"code\": 1094,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \" -------\",\n        \"      --\",\n        \"      --\"\n      ]\n    },\n    \"ч\": {\n      \"ch\": \"ч\",\n      \"code\": 1095,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \" ------ \",\n        \"     -- \",\n        \"     -- \",\n        \"     -- \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ш\": {\n      \"ch\": \"ш\",\n      \"code\": 1096,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"-- - -- \",\n        \"-- - -- \",\n        \"-- - -- \",\n        \"-- - -- \",\n        \"-- - -- \",\n        \"-- - -- \",\n        \" ------ \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"щ\": {\n      \"ch\": \"щ\",\n      \"code\": 1097,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"-- - -- \",\n        \"-- - -- \",\n        \"-- - -- \",\n        \"-- - -- \",\n        \"-- - -- \",\n        \"-- - -- \",\n        \" -------\",\n        \"      --\",\n        \"      --\"\n      ]\n    },\n    \"ъ\": {\n      \"ch\": \"ъ\",\n      \"code\": 1098,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"---     \",\n        \" --     \",\n        \" -----  \",\n        \" --  -- \",\n        \" --  -- \",\n        \" --  -- \",\n        \" -----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ы\": {\n      \"ch\": \"ы\",\n      \"code\": 1099,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"--   -- \",\n        \"--   -- \",\n        \"---  -- \",\n        \"-- - -- \",\n        \"-- - -- \",\n        \"-- - -- \",\n        \"---  -- \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ь\": {\n      \"ch\": \"ь\",\n      \"code\": 1100,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \" --     \",\n        \" --     \",\n        \" -----  \",\n        \" --  -- \",\n        \" --  -- \",\n        \" --  -- \",\n        \" -----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"э\": {\n      \"ch\": \"э\",\n      \"code\": 1101,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \" -----  \",\n        \"--   -- \",\n        \"     -- \",\n        \"  ----- \",\n        \"     -- \",\n        \"--   -- \",\n        \" -----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ю\": {\n      \"ch\": \"ю\",\n      \"code\": 1102,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"--  --  \",\n        \"-- - -- \",\n        \"-- - -- \",\n        \"---- -- \",\n        \"-- - -- \",\n        \"-- - -- \",\n        \"--  --  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"я\": {\n      \"ch\": \"я\",\n      \"code\": 1103,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \" ------ \",\n        \"--   -- \",\n        \"--   -- \",\n        \" ------ \",\n        \"  -- -- \",\n        \" --  -- \",\n        \"--   -- \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ѐ\": {\n      \"ch\": \"ѐ\",\n      \"code\": 1104,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"  --    \",\n        \"   --   \",\n        \"        \",\n        \" -----  \",\n        \"--   -- \",\n        \"--   -- \",\n        \"------- \",\n        \"--      \",\n        \"--      \",\n        \" -----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ё\": {\n      \"ch\": \"ё\",\n      \"code\": 1105,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \" -- --  \",\n        \" -- --  \",\n        \"        \",\n        \" -----  \",\n        \"--   -- \",\n        \"--   -- \",\n        \"------- \",\n        \"--      \",\n        \"--      \",\n        \" -----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ђ\": {\n      \"ch\": \"ђ\",\n      \"code\": 1106,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \" --     \",\n        \"-----   \",\n        \" --     \",\n        \" -----  \",\n        \" --  -- \",\n        \" --  -- \",\n        \" --  -- \",\n        \" --  -- \",\n        \" --  -- \",\n        \" --  -- \",\n        \"     -- \",\n        \"   ---  \"\n      ]\n    },\n    \"ѓ\": {\n      \"ch\": \"ѓ\",\n      \"code\": 1107,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"   --   \",\n        \"  --    \",\n        \"        \",\n        \"------- \",\n        \"--      \",\n        \"--      \",\n        \"--      \",\n        \"--      \",\n        \"--      \",\n        \"--      \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"є\": {\n      \"ch\": \"є\",\n      \"code\": 1108,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \" -----  \",\n        \"--   -- \",\n        \"--      \",\n        \"-----   \",\n        \"--      \",\n        \"--   -- \",\n        \" -----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ѕ\": {\n      \"ch\": \"ѕ\",\n      \"code\": 1109,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \" ------ \",\n        \"--      \",\n        \"--      \",\n        \" -----  \",\n        \"     -- \",\n        \"     -- \",\n        \"------  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"і\": {\n      \"ch\": \"і\",\n      \"code\": 1110,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"   --   \",\n        \"   --   \",\n        \"        \",\n        \"  ---   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"  ----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ї\": {\n      \"ch\": \"ї\",\n      \"code\": 1111,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \" -- --  \",\n        \" -- --  \",\n        \"        \",\n        \"  ---   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"  ----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ј\": {\n      \"ch\": \"ј\",\n      \"code\": 1112,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"     -- \",\n        \"     -- \",\n        \"        \",\n        \"    --- \",\n        \"     -- \",\n        \"     -- \",\n        \"     -- \",\n        \"     -- \",\n        \"     -- \",\n        \" --  -- \",\n        \" --  -- \",\n        \"  ----  \"\n      ]\n    },\n    \"љ\": {\n      \"ch\": \"љ\",\n      \"code\": 1113,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \" ---    \",\n        \"-- -    \",\n        \"-- ---  \",\n        \"-- - -- \",\n        \"-- - -- \",\n        \"-- - -- \",\n        \"-  ---  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"њ\": {\n      \"ch\": \"њ\",\n      \"code\": 1114,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"-- -    \",\n        \"-- -    \",\n        \"-- ---  \",\n        \"---- -- \",\n        \"-- - -- \",\n        \"-- - -- \",\n        \"-- ---  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ћ\": {\n      \"ch\": \"ћ\",\n      \"code\": 1115,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \" --     \",\n        \"-----   \",\n        \" --     \",\n        \" -----  \",\n        \" --  -- \",\n        \" --  -- \",\n        \" --  -- \",\n        \" --  -- \",\n        \" --  -- \",\n        \" --  -- \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ќ\": {\n      \"ch\": \"ќ\",\n      \"code\": 1116,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"   --   \",\n        \"  --    \",\n        \"        \",\n        \"--   -- \",\n        \"--  --  \",\n        \"-- --   \",\n        \"----    \",\n        \"-- --   \",\n        \"--  --  \",\n        \"--   -- \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ѝ\": {\n      \"ch\": \"ѝ\",\n      \"code\": 1117,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"  --    \",\n        \"   --   \",\n        \"        \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \" ------ \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ў\": {\n      \"ch\": \"ў\",\n      \"code\": 1118,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \" -- --  \",\n        \"  ---   \",\n        \"        \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \" ------ \",\n        \"     -- \",\n        \" -----  \"\n      ]\n    },\n    \"џ\": {\n      \"ch\": \"џ\",\n      \"code\": 1119,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"------- \",\n        \"  ---   \",\n        \"  ---   \"\n      ]\n    },\n    \"Ґ\": {\n      \"ch\": \"Ґ\",\n      \"code\": 1168,\n      \"map\": [\n        \"     -- \",\n        \"     -- \",\n        \"------- \",\n        \"--      \",\n        \"--      \",\n        \"--      \",\n        \"--      \",\n        \"--      \",\n        \"--      \",\n        \"--      \",\n        \"--      \",\n        \"--      \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ґ\": {\n      \"ch\": \"ґ\",\n      \"code\": 1169,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"     -- \",\n        \"     -- \",\n        \"------- \",\n        \"--      \",\n        \"--      \",\n        \"--      \",\n        \"--      \",\n        \"--      \",\n        \"--      \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ғ\": {\n      \"ch\": \"Ғ\",\n      \"code\": 1170,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \" -------\",\n        \" --     \",\n        \" --     \",\n        \" --     \",\n        \"------  \",\n        \" --     \",\n        \" --     \",\n        \" --     \",\n        \" --     \",\n        \" --     \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ғ\": {\n      \"ch\": \"ғ\",\n      \"code\": 1171,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \" -------\",\n        \" --     \",\n        \" --     \",\n        \"------  \",\n        \" --     \",\n        \" --     \",\n        \" --     \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ҕ\": {\n      \"ch\": \"Ҕ\",\n      \"code\": 1172,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"------- \",\n        \"--      \",\n        \"--      \",\n        \"--      \",\n        \"--      \",\n        \"------  \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"     -- \",\n        \"    --  \"\n      ]\n    },\n    \"ҕ\": {\n      \"ch\": \"ҕ\",\n      \"code\": 1173,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"------- \",\n        \"--      \",\n        \"--      \",\n        \"-----   \",\n        \"--  --  \",\n        \"--  --  \",\n        \"--  --  \",\n        \"    --  \",\n        \"   --   \"\n      ]\n    },\n    \"Җ\": {\n      \"ch\": \"Җ\",\n      \"code\": 1174,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"-- - -- \",\n        \"-- - -- \",\n        \"-- - -- \",\n        \" -----  \",\n        \"  ---   \",\n        \" -----  \",\n        \"-- - -- \",\n        \"-- - -- \",\n        \"-- - -- \",\n        \"-- - ---\",\n        \"      --\",\n        \"      --\"\n      ]\n    },\n    \"җ\": {\n      \"ch\": \"җ\",\n      \"code\": 1175,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"-- - -- \",\n        \"-- - -- \",\n        \" -----  \",\n        \"  ---   \",\n        \" -----  \",\n        \"-- - -- \",\n        \"-- - ---\",\n        \"      --\",\n        \"      --\"\n      ]\n    },\n    \"Ҙ\": {\n      \"ch\": \"Ҙ\",\n      \"code\": 1176,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \" -----  \",\n        \"--   -- \",\n        \"--   -- \",\n        \"     -- \",\n        \"  ----  \",\n        \"     -- \",\n        \"     -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \" -----  \",\n        \"  --    \",\n        \"  --    \"\n      ]\n    },\n    \"ҙ\": {\n      \"ch\": \"ҙ\",\n      \"code\": 1177,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \" -----  \",\n        \"--   -- \",\n        \"     -- \",\n        \"  ----  \",\n        \"     -- \",\n        \"--   -- \",\n        \" -----  \",\n        \"  --    \",\n        \"  --    \"\n      ]\n    },\n    \"Қ\": {\n      \"ch\": \"Қ\",\n      \"code\": 1178,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--  --  \",\n        \"-- --   \",\n        \"----    \",\n        \"----    \",\n        \"-- --   \",\n        \"--  --  \",\n        \"--   -- \",\n        \"--   ---\",\n        \"      --\",\n        \"      --\"\n      ]\n    },\n    \"қ\": {\n      \"ch\": \"қ\",\n      \"code\": 1179,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"--   -- \",\n        \"--  --  \",\n        \"-- --   \",\n        \"----    \",\n        \"-- --   \",\n        \"--  --  \",\n        \"--   ---\",\n        \"      --\",\n        \"      --\"\n      ]\n    },\n    \"Ҝ\": {\n      \"ch\": \"Ҝ\",\n      \"code\": 1180,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"--   -- \",\n        \"--   -- \",\n        \"-- - -- \",\n        \"-- ---  \",\n        \"-----   \",\n        \"-----   \",\n        \"-- ---  \",\n        \"-- - -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ҝ\": {\n      \"ch\": \"ҝ\",\n      \"code\": 1181,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"--   -- \",\n        \"-- - -- \",\n        \"-- ---  \",\n        \"-----   \",\n        \"-- ---  \",\n        \"-- - -- \",\n        \"--   -- \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ҡ\": {\n      \"ch\": \"Ҡ\",\n      \"code\": 1184,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"---   --\",\n        \"---   --\",\n        \" --  -- \",\n        \" -- --  \",\n        \" ----   \",\n        \" ----   \",\n        \" -- --  \",\n        \" --  -- \",\n        \" --   --\",\n        \" --   --\",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ҡ\": {\n      \"ch\": \"ҡ\",\n      \"code\": 1185,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"---   --\",\n        \" --  -- \",\n        \" -- --  \",\n        \" ----   \",\n        \" -- --  \",\n        \" --  -- \",\n        \" --   --\",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ң\": {\n      \"ch\": \"Ң\",\n      \"code\": 1186,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"------- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   ---\",\n        \"      --\",\n        \"      --\"\n      ]\n    },\n    \"ң\": {\n      \"ch\": \"ң\",\n      \"code\": 1187,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"------- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   ---\",\n        \"      --\",\n        \"      --\"\n      ]\n    },\n    \"Ҥ\": {\n      \"ch\": \"Ҥ\",\n      \"code\": 1188,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"--  ----\",\n        \"--  --  \",\n        \"--  --  \",\n        \"--  --  \",\n        \"------  \",\n        \"--  --  \",\n        \"--  --  \",\n        \"--  --  \",\n        \"--  --  \",\n        \"--  --  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ҥ\": {\n      \"ch\": \"ҥ\",\n      \"code\": 1189,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"--  ----\",\n        \"--  --  \",\n        \"--  --  \",\n        \"------  \",\n        \"--  --  \",\n        \"--  --  \",\n        \"--  --  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ҫ\": {\n      \"ch\": \"Ҫ\",\n      \"code\": 1194,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \" -----  \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--      \",\n        \"--      \",\n        \"--      \",\n        \"--      \",\n        \"--   -- \",\n        \"--   -- \",\n        \" -----  \",\n        \"  --    \",\n        \"  --    \"\n      ]\n    },\n    \"ҫ\": {\n      \"ch\": \"ҫ\",\n      \"code\": 1195,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \" -----  \",\n        \"--   -- \",\n        \"--      \",\n        \"--      \",\n        \"--      \",\n        \"--   -- \",\n        \" -----  \",\n        \"  --    \",\n        \"  --    \"\n      ]\n    },\n    \"Ү\": {\n      \"ch\": \"Ү\",\n      \"code\": 1198,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"--    --\",\n        \"--    --\",\n        \" --  -- \",\n        \" --  -- \",\n        \"  ----  \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ү\": {\n      \"ch\": \"ү\",\n      \"code\": 1199,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"--    --\",\n        \"--    --\",\n        \" --  -- \",\n        \" --  -- \",\n        \"  ----  \",\n        \"  ----  \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \"\n      ]\n    },\n    \"Ұ\": {\n      \"ch\": \"Ұ\",\n      \"code\": 1200,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"--    --\",\n        \"--    --\",\n        \" --  -- \",\n        \" --  -- \",\n        \"  ----  \",\n        \"   --   \",\n        \" ------ \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ұ\": {\n      \"ch\": \"ұ\",\n      \"code\": 1201,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"--    --\",\n        \"--    --\",\n        \" --  -- \",\n        \" --  -- \",\n        \"  ----  \",\n        \"  ----  \",\n        \"   --   \",\n        \" ------ \",\n        \"   --   \"\n      ]\n    },\n    \"Ҳ\": {\n      \"ch\": \"Ҳ\",\n      \"code\": 1202,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"--   -- \",\n        \"--   -- \",\n        \" -- --  \",\n        \" -- --  \",\n        \"  ---   \",\n        \"  ---   \",\n        \" -- --  \",\n        \" -- --  \",\n        \"--   -- \",\n        \"--   ---\",\n        \"      --\",\n        \"      --\"\n      ]\n    },\n    \"ҳ\": {\n      \"ch\": \"ҳ\",\n      \"code\": 1203,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"--   -- \",\n        \"--   -- \",\n        \" -- --  \",\n        \"  ---   \",\n        \" -- --  \",\n        \"--   -- \",\n        \"--   ---\",\n        \"      --\",\n        \"      --\"\n      ]\n    },\n    \"Ҷ\": {\n      \"ch\": \"Ҷ\",\n      \"code\": 1206,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \" ------ \",\n        \"     -- \",\n        \"     -- \",\n        \"     -- \",\n        \"     ---\",\n        \"      --\",\n        \"      --\"\n      ]\n    },\n    \"ҷ\": {\n      \"ch\": \"ҷ\",\n      \"code\": 1207,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \" ------ \",\n        \"     -- \",\n        \"     -- \",\n        \"     ---\",\n        \"      --\",\n        \"      --\"\n      ]\n    },\n    \"Ҹ\": {\n      \"ch\": \"Ҹ\",\n      \"code\": 1208,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"-- - -- \",\n        \"-- - -- \",\n        \" ------ \",\n        \"   - -- \",\n        \"   - -- \",\n        \"     -- \",\n        \"     -- \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ҹ\": {\n      \"ch\": \"ҹ\",\n      \"code\": 1209,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"--   -- \",\n        \"-- - -- \",\n        \"-- - -- \",\n        \" ------ \",\n        \"   - -- \",\n        \"     -- \",\n        \"     -- \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Һ\": {\n      \"ch\": \"Һ\",\n      \"code\": 1210,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"--      \",\n        \"--      \",\n        \"--      \",\n        \"--      \",\n        \"------  \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"һ\": {\n      \"ch\": \"һ\",\n      \"code\": 1211,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"--      \",\n        \"--      \",\n        \"------  \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ӑ\": {\n      \"ch\": \"Ӑ\",\n      \"code\": 1232,\n      \"map\": [\n        \" -- --  \",\n        \"  ---   \",\n        \"        \",\n        \" -----  \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"------- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ӑ\": {\n      \"ch\": \"ӑ\",\n      \"code\": 1233,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \" -- --  \",\n        \"  ---   \",\n        \"        \",\n        \" -----  \",\n        \"     -- \",\n        \" ------ \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \" ------ \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ӓ\": {\n      \"ch\": \"Ӓ\",\n      \"code\": 1234,\n      \"map\": [\n        \" -- --  \",\n        \" -- --  \",\n        \"        \",\n        \" -----  \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"------- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ӓ\": {\n      \"ch\": \"ӓ\",\n      \"code\": 1235,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \" -- --  \",\n        \" -- --  \",\n        \"        \",\n        \" -----  \",\n        \"     -- \",\n        \" ------ \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \" ------ \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ӕ\": {\n      \"ch\": \"Ӕ\",\n      \"code\": 1236,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \" ------ \",\n        \"-- --   \",\n        \"-- --   \",\n        \"-- --   \",\n        \"------- \",\n        \"-- --   \",\n        \"-- --   \",\n        \"-- --   \",\n        \"-- --   \",\n        \"-- ---- \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ӕ\": {\n      \"ch\": \"ӕ\",\n      \"code\": 1237,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \" -- --  \",\n        \"   - -- \",\n        \"   - -- \",\n        \" ------ \",\n        \"-- -    \",\n        \"-- -    \",\n        \" -- --  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ӗ\": {\n      \"ch\": \"Ӗ\",\n      \"code\": 1238,\n      \"map\": [\n        \" -- --  \",\n        \"  ---   \",\n        \"        \",\n        \"------- \",\n        \"--      \",\n        \"--      \",\n        \"--      \",\n        \"-----   \",\n        \"--      \",\n        \"--      \",\n        \"--      \",\n        \"------- \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ӗ\": {\n      \"ch\": \"ӗ\",\n      \"code\": 1239,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \" -- --  \",\n        \"  ---   \",\n        \"        \",\n        \" -----  \",\n        \"--   -- \",\n        \"--   -- \",\n        \"------- \",\n        \"--      \",\n        \"--      \",\n        \" -----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ә\": {\n      \"ch\": \"Ә\",\n      \"code\": 1240,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \" -----  \",\n        \"--   -- \",\n        \"     -- \",\n        \"     -- \",\n        \"------- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \" -----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ә\": {\n      \"ch\": \"ә\",\n      \"code\": 1241,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \" -----  \",\n        \"     -- \",\n        \"     -- \",\n        \"------- \",\n        \"--   -- \",\n        \"--   -- \",\n        \" -----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ӛ\": {\n      \"ch\": \"Ӛ\",\n      \"code\": 1242,\n      \"map\": [\n        \" -- --  \",\n        \" -- --  \",\n        \"        \",\n        \" -----  \",\n        \"--   -- \",\n        \"     -- \",\n        \"     -- \",\n        \"------- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \" -----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ӛ\": {\n      \"ch\": \"ӛ\",\n      \"code\": 1243,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \" -- --  \",\n        \" -- --  \",\n        \"        \",\n        \" -----  \",\n        \"     -- \",\n        \"     -- \",\n        \"------- \",\n        \"--   -- \",\n        \"--   -- \",\n        \" -----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ӝ\": {\n      \"ch\": \"Ӝ\",\n      \"code\": 1244,\n      \"map\": [\n        \" -- --  \",\n        \" -- --  \",\n        \"        \",\n        \"-- - -- \",\n        \"-- - -- \",\n        \"-- - -- \",\n        \" -----  \",\n        \"  ---   \",\n        \" -----  \",\n        \"-- - -- \",\n        \"-- - -- \",\n        \"-- - -- \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ӝ\": {\n      \"ch\": \"ӝ\",\n      \"code\": 1245,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \" -- --  \",\n        \" -- --  \",\n        \"        \",\n        \"-- - -- \",\n        \"-- - -- \",\n        \" -----  \",\n        \"  ---   \",\n        \" -----  \",\n        \"-- - -- \",\n        \"-- - -- \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ӟ\": {\n      \"ch\": \"Ӟ\",\n      \"code\": 1246,\n      \"map\": [\n        \" -- --  \",\n        \" -- --  \",\n        \"        \",\n        \" -----  \",\n        \"--   -- \",\n        \"--   -- \",\n        \"     -- \",\n        \"  ----  \",\n        \"     -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \" -----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ӟ\": {\n      \"ch\": \"ӟ\",\n      \"code\": 1247,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \" -- --  \",\n        \" -- --  \",\n        \"        \",\n        \" -----  \",\n        \"--   -- \",\n        \"     -- \",\n        \"  ----  \",\n        \"     -- \",\n        \"--   -- \",\n        \" -----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ӣ\": {\n      \"ch\": \"Ӣ\",\n      \"code\": 1250,\n      \"map\": [\n        \" -----  \",\n        \"        \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--  --- \",\n        \"-- ---- \",\n        \"---- -- \",\n        \"---  -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ӣ\": {\n      \"ch\": \"ӣ\",\n      \"code\": 1251,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \" -----  \",\n        \"        \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \" ------ \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ӥ\": {\n      \"ch\": \"Ӥ\",\n      \"code\": 1252,\n      \"map\": [\n        \" -- --  \",\n        \" -- --  \",\n        \"        \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--  --- \",\n        \"-- ---- \",\n        \"---- -- \",\n        \"---  -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ӥ\": {\n      \"ch\": \"ӥ\",\n      \"code\": 1253,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \" -- --  \",\n        \" -- --  \",\n        \"        \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \" ------ \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ӧ\": {\n      \"ch\": \"Ӧ\",\n      \"code\": 1254,\n      \"map\": [\n        \" -- --  \",\n        \" -- --  \",\n        \"        \",\n        \" -----  \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \" -----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ӧ\": {\n      \"ch\": \"ӧ\",\n      \"code\": 1255,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \" -- --  \",\n        \" -- --  \",\n        \"        \",\n        \" -----  \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \" -----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ө\": {\n      \"ch\": \"Ө\",\n      \"code\": 1256,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \" -----  \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"------- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \" -----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ө\": {\n      \"ch\": \"ө\",\n      \"code\": 1257,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \" -----  \",\n        \"--   -- \",\n        \"--   -- \",\n        \"------- \",\n        \"--   -- \",\n        \"--   -- \",\n        \" -----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ӫ\": {\n      \"ch\": \"Ӫ\",\n      \"code\": 1258,\n      \"map\": [\n        \" -- --  \",\n        \" -- --  \",\n        \"        \",\n        \" -----  \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"------- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \" -----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ӫ\": {\n      \"ch\": \"ӫ\",\n      \"code\": 1259,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \" -- --  \",\n        \" -- --  \",\n        \"        \",\n        \" -----  \",\n        \"--   -- \",\n        \"--   -- \",\n        \"------- \",\n        \"--   -- \",\n        \"--   -- \",\n        \" -----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ӭ\": {\n      \"ch\": \"Ӭ\",\n      \"code\": 1260,\n      \"map\": [\n        \" -- --  \",\n        \" -- --  \",\n        \"        \",\n        \" -----  \",\n        \"--   -- \",\n        \"     -- \",\n        \"     -- \",\n        \"  ----- \",\n        \"     -- \",\n        \"     -- \",\n        \"--   -- \",\n        \" -----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ӭ\": {\n      \"ch\": \"ӭ\",\n      \"code\": 1261,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \" -- --  \",\n        \" -- --  \",\n        \"        \",\n        \" -----  \",\n        \"--   -- \",\n        \"     -- \",\n        \"  ----- \",\n        \"     -- \",\n        \"--   -- \",\n        \" -----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ӯ\": {\n      \"ch\": \"Ӯ\",\n      \"code\": 1262,\n      \"map\": [\n        \" -----  \",\n        \"        \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \" ------ \",\n        \"     -- \",\n        \"     -- \",\n        \"     -- \",\n        \" -----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ӯ\": {\n      \"ch\": \"ӯ\",\n      \"code\": 1263,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \" -----  \",\n        \"        \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \" ------ \",\n        \"     -- \",\n        \" -----  \"\n      ]\n    },\n    \"Ӱ\": {\n      \"ch\": \"Ӱ\",\n      \"code\": 1264,\n      \"map\": [\n        \" -- --  \",\n        \" -- --  \",\n        \"        \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \" ------ \",\n        \"     -- \",\n        \"     -- \",\n        \"     -- \",\n        \" -----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ӱ\": {\n      \"ch\": \"ӱ\",\n      \"code\": 1265,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \" -- --  \",\n        \" -- --  \",\n        \"        \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \" ------ \",\n        \"     -- \",\n        \" -----  \"\n      ]\n    },\n    \"Ӳ\": {\n      \"ch\": \"Ӳ\",\n      \"code\": 1266,\n      \"map\": [\n        \"  -- -- \",\n        \" -- --  \",\n        \"        \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \" ------ \",\n        \"     -- \",\n        \"     -- \",\n        \"     -- \",\n        \" -----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ӳ\": {\n      \"ch\": \"ӳ\",\n      \"code\": 1267,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"  -- -- \",\n        \" -- --  \",\n        \"        \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \" ------ \",\n        \"     -- \",\n        \" -----  \"\n      ]\n    },\n    \"Ӵ\": {\n      \"ch\": \"Ӵ\",\n      \"code\": 1268,\n      \"map\": [\n        \" -- --  \",\n        \" -- --  \",\n        \"        \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \" ------ \",\n        \"     -- \",\n        \"     -- \",\n        \"     -- \",\n        \"     -- \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ӵ\": {\n      \"ch\": \"ӵ\",\n      \"code\": 1269,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \" -- --  \",\n        \" -- --  \",\n        \"        \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \" ------ \",\n        \"     -- \",\n        \"     -- \",\n        \"     -- \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ӹ\": {\n      \"ch\": \"Ӹ\",\n      \"code\": 1272,\n      \"map\": [\n        \" -- --  \",\n        \" -- --  \",\n        \"        \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"---  -- \",\n        \"-- - -- \",\n        \"-- - -- \",\n        \"-- - -- \",\n        \"-- - -- \",\n        \"---  -- \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ӹ\": {\n      \"ch\": \"ӹ\",\n      \"code\": 1273,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \" -- --  \",\n        \" -- --  \",\n        \"        \",\n        \"--   -- \",\n        \"--   -- \",\n        \"---  -- \",\n        \"-- - -- \",\n        \"-- - -- \",\n        \"-- - -- \",\n        \"---  -- \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ḵ\": {\n      \"ch\": \"Ḵ\",\n      \"code\": 7732,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--  --  \",\n        \"-- --   \",\n        \"----    \",\n        \"----    \",\n        \"-- --   \",\n        \"--  --  \",\n        \"--   -- \",\n        \"--   -- \",\n        \"        \",\n        \" -----  \"\n      ]\n    },\n    \"ḵ\": {\n      \"ch\": \"ḵ\",\n      \"code\": 7733,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"--      \",\n        \"--      \",\n        \"--      \",\n        \"--   -- \",\n        \"--  --  \",\n        \"-- --   \",\n        \"----    \",\n        \"-- --   \",\n        \"--  --  \",\n        \"--   -- \",\n        \"        \",\n        \" -----  \"\n      ]\n    },\n    \"Ẹ\": {\n      \"ch\": \"Ẹ\",\n      \"code\": 7864,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"------- \",\n        \"--      \",\n        \"--      \",\n        \"--      \",\n        \"-----   \",\n        \"--      \",\n        \"--      \",\n        \"--      \",\n        \"--      \",\n        \"------- \",\n        \"   --   \",\n        \"   --   \"\n      ]\n    },\n    \"ẹ\": {\n      \"ch\": \"ẹ\",\n      \"code\": 7865,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \" -----  \",\n        \"--   -- \",\n        \"--   -- \",\n        \"------- \",\n        \"--      \",\n        \"--      \",\n        \" -----  \",\n        \"   --   \",\n        \"   --   \"\n      ]\n    },\n    \"Ẽ\": {\n      \"ch\": \"Ẽ\",\n      \"code\": 7868,\n      \"map\": [\n        \" --- -- \",\n        \"-- ---  \",\n        \"        \",\n        \"------- \",\n        \"--      \",\n        \"--      \",\n        \"--      \",\n        \"-----   \",\n        \"--      \",\n        \"--      \",\n        \"--      \",\n        \"------- \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ẽ\": {\n      \"ch\": \"ẽ\",\n      \"code\": 7869,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \" --- -- \",\n        \"-- ---  \",\n        \"        \",\n        \" -----  \",\n        \"--   -- \",\n        \"--   -- \",\n        \"------- \",\n        \"--      \",\n        \"--      \",\n        \" -----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ị\": {\n      \"ch\": \"Ị\",\n      \"code\": 7882,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"  ----  \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"  ----  \",\n        \"   --   \",\n        \"   --   \"\n      ]\n    },\n    \"ị\": {\n      \"ch\": \"ị\",\n      \"code\": 7883,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"   --   \",\n        \"   --   \",\n        \"        \",\n        \"  ---   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"  ----  \",\n        \"   --   \",\n        \"   --   \"\n      ]\n    },\n    \"Ọ\": {\n      \"ch\": \"Ọ\",\n      \"code\": 7884,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \" -----  \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \" -----  \",\n        \"   --   \",\n        \"   --   \"\n      ]\n    },\n    \"ọ\": {\n      \"ch\": \"ọ\",\n      \"code\": 7885,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \" -----  \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \" -----  \",\n        \"   --   \",\n        \"   --   \"\n      ]\n    },\n    \"Ụ\": {\n      \"ch\": \"Ụ\",\n      \"code\": 7908,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \" -----  \",\n        \"   --   \",\n        \"   --   \"\n      ]\n    },\n    \"ụ\": {\n      \"ch\": \"ụ\",\n      \"code\": 7909,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \" ------ \",\n        \"   --   \",\n        \"   --   \"\n      ]\n    },\n    \"Ỹ\": {\n      \"ch\": \"Ỹ\",\n      \"code\": 7928,\n      \"map\": [\n        \" --- -- \",\n        \"-- ---  \",\n        \"        \",\n        \"--    --\",\n        \"--    --\",\n        \" --  -- \",\n        \" --  -- \",\n        \"  ----  \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ỹ\": {\n      \"ch\": \"ỹ\",\n      \"code\": 7929,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \" --- -- \",\n        \"-- ---  \",\n        \"        \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \" ------ \",\n        \"     -- \",\n        \" -----  \"\n      ]\n    },\n    \" \": {\n      \"ch\": \" \",\n      \"code\": 8192,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \" \": {\n      \"ch\": \" \",\n      \"code\": 8193,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \" \": {\n      \"ch\": \" \",\n      \"code\": 8194,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \" \": {\n      \"ch\": \" \",\n      \"code\": 8195,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \" \": {\n      \"ch\": \" \",\n      \"code\": 8196,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \" \": {\n      \"ch\": \" \",\n      \"code\": 8197,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \" \": {\n      \"ch\": \" \",\n      \"code\": 8198,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \" \": {\n      \"ch\": \" \",\n      \"code\": 8199,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \" \": {\n      \"ch\": \" \",\n      \"code\": 8200,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \" \": {\n      \"ch\": \" \",\n      \"code\": 8201,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \" \": {\n      \"ch\": \" \",\n      \"code\": 8202,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"‐\": {\n      \"ch\": \"‐\",\n      \"code\": 8208,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \" -----  \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"‑\": {\n      \"ch\": \"‑\",\n      \"code\": 8209,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \" -----  \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"‒\": {\n      \"ch\": \"‒\",\n      \"code\": 8210,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"------- \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"–\": {\n      \"ch\": \"–\",\n      \"code\": 8211,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"------- \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"—\": {\n      \"ch\": \"—\",\n      \"code\": 8212,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"------- \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"―\": {\n      \"ch\": \"―\",\n      \"code\": 8213,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"------- \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"‖\": {\n      \"ch\": \"‖\",\n      \"code\": 8214,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \" -- --  \",\n        \" -- --  \",\n        \" -- --  \",\n        \" -- --  \",\n        \" -- --  \",\n        \" -- --  \",\n        \" -- --  \",\n        \" -- --  \",\n        \" -- --  \",\n        \" -- --  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"‗\": {\n      \"ch\": \"‗\",\n      \"code\": 8215,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"------- \",\n        \"        \",\n        \"------- \"\n      ]\n    },\n    \"‘\": {\n      \"ch\": \"‘\",\n      \"code\": 8216,\n      \"map\": [\n        \"        \",\n        \"   --   \",\n        \"  --    \",\n        \"  --    \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"’\": {\n      \"ch\": \"’\",\n      \"code\": 8217,\n      \"map\": [\n        \"        \",\n        \"   --   \",\n        \"   --   \",\n        \"  --    \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"‚\": {\n      \"ch\": \"‚\",\n      \"code\": 8218,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"   --   \",\n        \"   --   \",\n        \"  --    \",\n        \"        \"\n      ]\n    },\n    \"‛\": {\n      \"ch\": \"‛\",\n      \"code\": 8219,\n      \"map\": [\n        \"        \",\n        \"  --    \",\n        \"  --    \",\n        \"   --   \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"“\": {\n      \"ch\": \"“\",\n      \"code\": 8220,\n      \"map\": [\n        \"        \",\n        \" --  -- \",\n        \"--  --  \",\n        \"--  --  \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"”\": {\n      \"ch\": \"”\",\n      \"code\": 8221,\n      \"map\": [\n        \"        \",\n        \"  --  --\",\n        \"  --  --\",\n        \" --  -- \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"„\": {\n      \"ch\": \"„\",\n      \"code\": 8222,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \" --  -- \",\n        \" --  -- \",\n        \"--  --  \",\n        \"        \"\n      ]\n    },\n    \"‟\": {\n      \"ch\": \"‟\",\n      \"code\": 8223,\n      \"map\": [\n        \"        \",\n        \"--  --  \",\n        \"--  --  \",\n        \" --  -- \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"†\": {\n      \"ch\": \"†\",\n      \"code\": 8224,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"   --   \",\n        \"   --   \",\n        \" ------ \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"‡\": {\n      \"ch\": \"‡\",\n      \"code\": 8225,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"   --   \",\n        \"   --   \",\n        \" ------ \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \" ------ \",\n        \"   --   \",\n        \"   --   \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"•\": {\n      \"ch\": \"•\",\n      \"code\": 8226,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"   --   \",\n        \"  ----  \",\n        \"  ----  \",\n        \"   --   \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"…\": {\n      \"ch\": \"…\",\n      \"code\": 8230,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"-- -- --\",\n        \"-- -- --\",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"‰\": {\n      \"ch\": \"‰\",\n      \"code\": 8240,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"--- --  \",\n        \"- - --  \",\n        \"-----   \",\n        \"   --   \",\n        \"  --    \",\n        \"  --    \",\n        \" --     \",\n        \" -------\",\n        \"-- - - -\",\n        \"-- -----\",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"′\": {\n      \"ch\": \"′\",\n      \"code\": 8242,\n      \"map\": [\n        \"        \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"″\": {\n      \"ch\": \"″\",\n      \"code\": 8243,\n      \"map\": [\n        \"        \",\n        \" --  -- \",\n        \" --  -- \",\n        \" --  -- \",\n        \" --  -- \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"‹\": {\n      \"ch\": \"‹\",\n      \"code\": 8249,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"    --  \",\n        \"   --   \",\n        \"  --    \",\n        \" --     \",\n        \"  --    \",\n        \"   --   \",\n        \"    --  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"›\": {\n      \"ch\": \"›\",\n      \"code\": 8250,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \" --     \",\n        \"  --    \",\n        \"   --   \",\n        \"    --  \",\n        \"   --   \",\n        \"  --    \",\n        \" --     \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"‼\": {\n      \"ch\": \"‼\",\n      \"code\": 8252,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \" --  -- \",\n        \" --  -- \",\n        \" --  -- \",\n        \" --  -- \",\n        \" --  -- \",\n        \" --  -- \",\n        \" --  -- \",\n        \"        \",\n        \" --  -- \",\n        \" --  -- \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"‾\": {\n      \"ch\": \"‾\",\n      \"code\": 8254,\n      \"map\": [\n        \"------- \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ⁿ\": {\n      \"ch\": \"ⁿ\",\n      \"code\": 8319,\n      \"map\": [\n        \"        \",\n        \" ----   \",\n        \" -- --  \",\n        \" -- --  \",\n        \" -- --  \",\n        \" -- --  \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"₧\": {\n      \"ch\": \"₧\",\n      \"code\": 8359,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"-----   \",\n        \"--  --  \",\n        \"--  --  \",\n        \"--  --  \",\n        \"----- - \",\n        \"--   -- \",\n        \"--  ----\",\n        \"--   -- \",\n        \"--   -- \",\n        \"--    --\",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"€\": {\n      \"ch\": \"€\",\n      \"code\": 8364,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"   ---- \",\n        \"  --  --\",\n        \" --     \",\n        \"------  \",\n        \" --     \",\n        \"------  \",\n        \" --     \",\n        \"  --  --\",\n        \"   ---- \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"₮\": {\n      \"ch\": \"₮\",\n      \"code\": 8366,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"--------\",\n        \"   --   \",\n        \"   --   \",\n        \"   ---- \",\n        \" ----   \",\n        \"   ---- \",\n        \" ----   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ℎ\": {\n      \"ch\": \"ℎ\",\n      \"code\": 8462,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"--      \",\n        \"--      \",\n        \"--      \",\n        \"------  \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ℏ\": {\n      \"ch\": \"ℏ\",\n      \"code\": 8463,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \" --     \",\n        \"-----   \",\n        \" --     \",\n        \" -----  \",\n        \" --  -- \",\n        \" --  -- \",\n        \" --  -- \",\n        \" --  -- \",\n        \" --  -- \",\n        \" --  -- \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"№\": {\n      \"ch\": \"№\",\n      \"code\": 8470,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"-  - -- \",\n        \"-  - -- \",\n        \"-  - -- \",\n        \"-- -    \",\n        \"----    \",\n        \"----    \",\n        \"- --    \",\n        \"-  - -- \",\n        \"-  -    \",\n        \"-  - -- \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"™\": {\n      \"ch\": \"™\",\n      \"code\": 8482,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"----- --\",\n        \" - - - -\",\n        \" - - - -\",\n        \" - -   -\",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ω\": {\n      \"ch\": \"Ω\",\n      \"code\": 8486,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \" -----  \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \" -- --  \",\n        \" -- --  \",\n        \"--- --- \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"←\": {\n      \"ch\": \"←\",\n      \"code\": 8592,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"  -     \",\n        \" --     \",\n        \"------- \",\n        \"------- \",\n        \" --     \",\n        \"  -     \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"↑\": {\n      \"ch\": \"↑\",\n      \"code\": 8593,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"   --   \",\n        \"  ----  \",\n        \" ------ \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"→\": {\n      \"ch\": \"→\",\n      \"code\": 8594,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"    -   \",\n        \"    --  \",\n        \"------- \",\n        \"------- \",\n        \"    --  \",\n        \"    -   \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"↓\": {\n      \"ch\": \"↓\",\n      \"code\": 8595,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \" ------ \",\n        \"  ----  \",\n        \"   --   \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"↔\": {\n      \"ch\": \"↔\",\n      \"code\": 8596,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"  -  -  \",\n        \" --  -- \",\n        \"--------\",\n        \"--------\",\n        \" --  -- \",\n        \"  -  -  \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"↕\": {\n      \"ch\": \"↕\",\n      \"code\": 8597,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"   --   \",\n        \"  ----  \",\n        \" ------ \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \" ------ \",\n        \"  ----  \",\n        \"   --   \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"↨\": {\n      \"ch\": \"↨\",\n      \"code\": 8616,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"   --   \",\n        \"  ----  \",\n        \" ------ \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \" ------ \",\n        \"  ----  \",\n        \"   --   \",\n        \" ------ \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"↵\": {\n      \"ch\": \"↵\",\n      \"code\": 8629,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"     -- \",\n        \"     -- \",\n        \"     -- \",\n        \"     -- \",\n        \"  -  -- \",\n        \" --  -- \",\n        \"------- \",\n        \"------- \",\n        \" --     \",\n        \"  -     \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"⇐\": {\n      \"ch\": \"⇐\",\n      \"code\": 8656,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"   -    \",\n        \"  ----- \",\n        \" ------ \",\n        \"---     \",\n        \" ------ \",\n        \"  ----- \",\n        \"   -    \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"⇑\": {\n      \"ch\": \"⇑\",\n      \"code\": 8657,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"   -    \",\n        \"  ---   \",\n        \" -----  \",\n        \"--- --- \",\n        \" -- --  \",\n        \" -- --  \",\n        \" -- --  \",\n        \" -- --  \",\n        \" -- --  \",\n        \" -- --  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"⇒\": {\n      \"ch\": \"⇒\",\n      \"code\": 8658,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"   -    \",\n        \"-----   \",\n        \"------  \",\n        \"    --- \",\n        \"------  \",\n        \"-----   \",\n        \"   -    \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"⇓\": {\n      \"ch\": \"⇓\",\n      \"code\": 8659,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \" -- --  \",\n        \" -- --  \",\n        \" -- --  \",\n        \" -- --  \",\n        \" -- --  \",\n        \" -- --  \",\n        \"--- --- \",\n        \" -----  \",\n        \"  ---   \",\n        \"   -    \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"⇔\": {\n      \"ch\": \"⇔\",\n      \"code\": 8660,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"  -  -  \",\n        \" ------ \",\n        \"--------\",\n        \"--    --\",\n        \"--------\",\n        \" ------ \",\n        \"  -  -  \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"⇕\": {\n      \"ch\": \"⇕\",\n      \"code\": 8661,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"   -    \",\n        \"  ---   \",\n        \" -----  \",\n        \"--- --- \",\n        \" -- --  \",\n        \" -- --  \",\n        \"--- --- \",\n        \" -----  \",\n        \"  ---   \",\n        \"   -    \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"∃\": {\n      \"ch\": \"∃\",\n      \"code\": 8707,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"------- \",\n        \"     -- \",\n        \"     -- \",\n        \"     -- \",\n        \"------- \",\n        \"     -- \",\n        \"     -- \",\n        \"     -- \",\n        \"------- \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"∅\": {\n      \"ch\": \"∅\",\n      \"code\": 8709,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"     -- \",\n        \"    --  \",\n        \" -----  \",\n        \"--  --- \",\n        \"-- ---- \",\n        \"---- -- \",\n        \"---  -- \",\n        \" -----  \",\n        \" --     \",\n        \"--      \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"∆\": {\n      \"ch\": \"∆\",\n      \"code\": 8710,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"   -    \",\n        \"   -    \",\n        \"  ---   \",\n        \"  ---   \",\n        \" -- --  \",\n        \" -- --  \",\n        \" -- --  \",\n        \"--   -- \",\n        \"--   -- \",\n        \"------- \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"∈\": {\n      \"ch\": \"∈\",\n      \"code\": 8712,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"  ----- \",\n        \" --     \",\n        \"--      \",\n        \"--      \",\n        \"------- \",\n        \"--      \",\n        \"--      \",\n        \" --     \",\n        \"  ----- \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"∊\": {\n      \"ch\": \"∊\",\n      \"code\": 8714,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"  ----- \",\n        \" --     \",\n        \"--      \",\n        \"------- \",\n        \"--      \",\n        \" --     \",\n        \"  ----- \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"−\": {\n      \"ch\": \"−\",\n      \"code\": 8722,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"------- \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"∙\": {\n      \"ch\": \"∙\",\n      \"code\": 8729,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"  ---   \",\n        \"  ---   \",\n        \"  ---   \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"√\": {\n      \"ch\": \"√\",\n      \"code\": 8730,\n      \"map\": [\n        \"        \",\n        \"    --- \",\n        \"    --  \",\n        \"    --  \",\n        \"    --  \",\n        \"    --  \",\n        \"--  --  \",\n        \"--  --  \",\n        \"--  --  \",\n        \" -- --  \",\n        \"  ----  \",\n        \"   ---  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"∞\": {\n      \"ch\": \"∞\",\n      \"code\": 8734,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \" -----  \",\n        \"-- - -- \",\n        \"-- - -- \",\n        \"-- - -- \",\n        \" -----  \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"∟\": {\n      \"ch\": \"∟\",\n      \"code\": 8735,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"--      \",\n        \"--      \",\n        \"--      \",\n        \"--      \",\n        \"--      \",\n        \"------- \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"∧\": {\n      \"ch\": \"∧\",\n      \"code\": 8743,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"   -    \",\n        \"   -    \",\n        \"  ---   \",\n        \"  ---   \",\n        \" -- --  \",\n        \" -- --  \",\n        \"--   -- \",\n        \"--   -- \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"∨\": {\n      \"ch\": \"∨\",\n      \"code\": 8744,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"--   -- \",\n        \"--   -- \",\n        \" -- --  \",\n        \" -- --  \",\n        \"  ---   \",\n        \"  ---   \",\n        \"   -    \",\n        \"   -    \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"∩\": {\n      \"ch\": \"∩\",\n      \"code\": 8745,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \" -----  \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"∪\": {\n      \"ch\": \"∪\",\n      \"code\": 8746,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \" -----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"≈\": {\n      \"ch\": \"≈\",\n      \"code\": 8776,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \" --- -- \",\n        \"-- ---  \",\n        \"        \",\n        \" --- -- \",\n        \"-- ---  \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"≠\": {\n      \"ch\": \"≠\",\n      \"code\": 8800,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"     -- \",\n        \"------- \",\n        \"   --   \",\n        \"  --    \",\n        \"------- \",\n        \"--      \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"≡\": {\n      \"ch\": \"≡\",\n      \"code\": 8801,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"------- \",\n        \"        \",\n        \"        \",\n        \"------- \",\n        \"        \",\n        \"        \",\n        \"------- \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"≤\": {\n      \"ch\": \"≤\",\n      \"code\": 8804,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"    --  \",\n        \"   --   \",\n        \"  --    \",\n        \" --     \",\n        \"  --    \",\n        \"   --   \",\n        \"    --  \",\n        \"        \",\n        \" ------ \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"≥\": {\n      \"ch\": \"≥\",\n      \"code\": 8805,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"  --    \",\n        \"   --   \",\n        \"    --  \",\n        \"     -- \",\n        \"    --  \",\n        \"   --   \",\n        \"  --    \",\n        \"        \",\n        \" ------ \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"⌀\": {\n      \"ch\": \"⌀\",\n      \"code\": 8960,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"     -- \",\n        \"    --  \",\n        \" -----  \",\n        \"--  --- \",\n        \"-- ---- \",\n        \"---- -- \",\n        \"---  -- \",\n        \" -----  \",\n        \" --     \",\n        \"--      \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"⌂\": {\n      \"ch\": \"⌂\",\n      \"code\": 8962,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"   -    \",\n        \"  ---   \",\n        \" -- --  \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"------- \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"⌐\": {\n      \"ch\": \"⌐\",\n      \"code\": 8976,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"------- \",\n        \"--      \",\n        \"--      \",\n        \"--      \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"⌠\": {\n      \"ch\": \"⌠\",\n      \"code\": 8992,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"    --- \",\n        \"   -- --\",\n        \"   -- --\",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \"\n      ]\n    },\n    \"⌡\": {\n      \"ch\": \"⌡\",\n      \"code\": 8993,\n      \"map\": [\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"-- --   \",\n        \"-- --   \",\n        \" ---    \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"⎺\": {\n      \"ch\": \"⎺\",\n      \"code\": 9146,\n      \"map\": [\n        \"--------\",\n        \"--------\",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"⎻\": {\n      \"ch\": \"⎻\",\n      \"code\": 9147,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"--------\",\n        \"--------\",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"⎼\": {\n      \"ch\": \"⎼\",\n      \"code\": 9148,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"--------\",\n        \"--------\",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"⎽\": {\n      \"ch\": \"⎽\",\n      \"code\": 9149,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"--------\",\n        \"--------\"\n      ]\n    },\n    \"␉\": {\n      \"ch\": \"␉\",\n      \"code\": 9225,\n      \"map\": [\n        \"--  --  \",\n        \"--  --  \",\n        \"------  \",\n        \"--  --  \",\n        \"--  --  \",\n        \"--  --  \",\n        \"        \",\n        \"  ------\",\n        \"    --  \",\n        \"    --  \",\n        \"    --  \",\n        \"    --  \",\n        \"    --  \",\n        \"        \"\n      ]\n    },\n    \"␊\": {\n      \"ch\": \"␊\",\n      \"code\": 9226,\n      \"map\": [\n        \"--      \",\n        \"--      \",\n        \"--      \",\n        \"--      \",\n        \"--      \",\n        \"-----   \",\n        \"        \",\n        \"  ------\",\n        \"  --    \",\n        \"  ----  \",\n        \"  --    \",\n        \"  --    \",\n        \"  --    \",\n        \"        \"\n      ]\n    },\n    \"␋\": {\n      \"ch\": \"␋\",\n      \"code\": 9227,\n      \"map\": [\n        \"--  --  \",\n        \"--  --  \",\n        \"--  --  \",\n        \"--  --  \",\n        \" ----   \",\n        \"  --    \",\n        \"        \",\n        \"  ------\",\n        \"    --  \",\n        \"    --  \",\n        \"    --  \",\n        \"    --  \",\n        \"    --  \",\n        \"        \"\n      ]\n    },\n    \"␌\": {\n      \"ch\": \"␌\",\n      \"code\": 9228,\n      \"map\": [\n        \"------  \",\n        \"--      \",\n        \"----    \",\n        \"--      \",\n        \"--      \",\n        \"--      \",\n        \"        \",\n        \"  ------\",\n        \"  --    \",\n        \"  ----  \",\n        \"  --    \",\n        \"  --    \",\n        \"  --    \",\n        \"        \"\n      ]\n    },\n    \"␍\": {\n      \"ch\": \"␍\",\n      \"code\": 9229,\n      \"map\": [\n        \" ----   \",\n        \"--  --  \",\n        \"--      \",\n        \"--      \",\n        \"--  --  \",\n        \" ----   \",\n        \"        \",\n        \"  ----- \",\n        \"  --  --\",\n        \"  --  --\",\n        \"  ----- \",\n        \"  -- -- \",\n        \"  --  --\",\n        \"        \"\n      ]\n    },\n    \"␤\": {\n      \"ch\": \"␤\",\n      \"code\": 9252,\n      \"map\": [\n        \"--  --  \",\n        \"--- --  \",\n        \"------  \",\n        \"-- ---  \",\n        \"--  --  \",\n        \"--  --  \",\n        \"        \",\n        \"  --    \",\n        \"  --    \",\n        \"  --    \",\n        \"  --    \",\n        \"  --    \",\n        \"  ------\",\n        \"        \"\n      ]\n    },\n    \"─\": {\n      \"ch\": \"─\",\n      \"code\": 9472,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"--------\",\n        \"--------\",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"━\": {\n      \"ch\": \"━\",\n      \"code\": 9473,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"--------\",\n        \"--------\",\n        \"--------\",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"│\": {\n      \"ch\": \"│\",\n      \"code\": 9474,\n      \"map\": [\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \"\n      ]\n    },\n    \"┃\": {\n      \"ch\": \"┃\",\n      \"code\": 9475,\n      \"map\": [\n        \"  ---   \",\n        \"  ---   \",\n        \"  ---   \",\n        \"  ---   \",\n        \"  ---   \",\n        \"  ---   \",\n        \"  ---   \",\n        \"  ---   \",\n        \"  ---   \",\n        \"  ---   \",\n        \"  ---   \",\n        \"  ---   \",\n        \"  ---   \",\n        \"  ---   \"\n      ]\n    },\n    \"┈\": {\n      \"ch\": \"┈\",\n      \"code\": 9480,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"- - - - \",\n        \"- - - - \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"┉\": {\n      \"ch\": \"┉\",\n      \"code\": 9481,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"- - - - \",\n        \"- - - - \",\n        \"- - - - \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"┊\": {\n      \"ch\": \"┊\",\n      \"code\": 9482,\n      \"map\": [\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"        \",\n        \"   --   \",\n        \"   --   \",\n        \"        \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"        \",\n        \"   --   \",\n        \"   --   \",\n        \"        \"\n      ]\n    },\n    \"┋\": {\n      \"ch\": \"┋\",\n      \"code\": 9483,\n      \"map\": [\n        \"  ---   \",\n        \"  ---   \",\n        \"  ---   \",\n        \"        \",\n        \"  ---   \",\n        \"  ---   \",\n        \"        \",\n        \"  ---   \",\n        \"  ---   \",\n        \"  ---   \",\n        \"        \",\n        \"  ---   \",\n        \"  ---   \",\n        \"        \"\n      ]\n    },\n    \"┌\": {\n      \"ch\": \"┌\",\n      \"code\": 9484,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"   -----\",\n        \"   -----\",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \"\n      ]\n    },\n    \"┍\": {\n      \"ch\": \"┍\",\n      \"code\": 9485,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"   -----\",\n        \"   -----\",\n        \"   -----\",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \"\n      ]\n    },\n    \"┎\": {\n      \"ch\": \"┎\",\n      \"code\": 9486,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"  ------\",\n        \"  ------\",\n        \"  ---   \",\n        \"  ---   \",\n        \"  ---   \",\n        \"  ---   \",\n        \"  ---   \",\n        \"  ---   \"\n      ]\n    },\n    \"┏\": {\n      \"ch\": \"┏\",\n      \"code\": 9487,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"  ------\",\n        \"  ------\",\n        \"  ------\",\n        \"  ---   \",\n        \"  ---   \",\n        \"  ---   \",\n        \"  ---   \",\n        \"  ---   \",\n        \"  ---   \"\n      ]\n    },\n    \"┐\": {\n      \"ch\": \"┐\",\n      \"code\": 9488,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"-----   \",\n        \"-----   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \"\n      ]\n    },\n    \"┑\": {\n      \"ch\": \"┑\",\n      \"code\": 9489,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"-----   \",\n        \"-----   \",\n        \"-----   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \"\n      ]\n    },\n    \"┒\": {\n      \"ch\": \"┒\",\n      \"code\": 9490,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"-----   \",\n        \"-----   \",\n        \"  ---   \",\n        \"  ---   \",\n        \"  ---   \",\n        \"  ---   \",\n        \"  ---   \",\n        \"  ---   \"\n      ]\n    },\n    \"┓\": {\n      \"ch\": \"┓\",\n      \"code\": 9491,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"-----   \",\n        \"-----   \",\n        \"-----   \",\n        \"  ---   \",\n        \"  ---   \",\n        \"  ---   \",\n        \"  ---   \",\n        \"  ---   \",\n        \"  ---   \"\n      ]\n    },\n    \"└\": {\n      \"ch\": \"└\",\n      \"code\": 9492,\n      \"map\": [\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   -----\",\n        \"   -----\",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"┕\": {\n      \"ch\": \"┕\",\n      \"code\": 9493,\n      \"map\": [\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   -----\",\n        \"   -----\",\n        \"   -----\",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"┖\": {\n      \"ch\": \"┖\",\n      \"code\": 9494,\n      \"map\": [\n        \"  ---   \",\n        \"  ---   \",\n        \"  ---   \",\n        \"  ---   \",\n        \"  ---   \",\n        \"  ---   \",\n        \"  ------\",\n        \"  ------\",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"┗\": {\n      \"ch\": \"┗\",\n      \"code\": 9495,\n      \"map\": [\n        \"  ---   \",\n        \"  ---   \",\n        \"  ---   \",\n        \"  ---   \",\n        \"  ---   \",\n        \"  ------\",\n        \"  ------\",\n        \"  ------\",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"┘\": {\n      \"ch\": \"┘\",\n      \"code\": 9496,\n      \"map\": [\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"-----   \",\n        \"-----   \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"┙\": {\n      \"ch\": \"┙\",\n      \"code\": 9497,\n      \"map\": [\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"-----   \",\n        \"-----   \",\n        \"-----   \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"┚\": {\n      \"ch\": \"┚\",\n      \"code\": 9498,\n      \"map\": [\n        \"  ---   \",\n        \"  ---   \",\n        \"  ---   \",\n        \"  ---   \",\n        \"  ---   \",\n        \"  ---   \",\n        \"-----   \",\n        \"-----   \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"┛\": {\n      \"ch\": \"┛\",\n      \"code\": 9499,\n      \"map\": [\n        \"  ---   \",\n        \"  ---   \",\n        \"  ---   \",\n        \"  ---   \",\n        \"  ---   \",\n        \"-----   \",\n        \"-----   \",\n        \"-----   \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"├\": {\n      \"ch\": \"├\",\n      \"code\": 9500,\n      \"map\": [\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   -----\",\n        \"   -----\",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \"\n      ]\n    },\n    \"┝\": {\n      \"ch\": \"┝\",\n      \"code\": 9501,\n      \"map\": [\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   -----\",\n        \"   -----\",\n        \"   -----\",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \"\n      ]\n    },\n    \"┞\": {\n      \"ch\": \"┞\",\n      \"code\": 9502,\n      \"map\": [\n        \"  ---   \",\n        \"  ---   \",\n        \"  ---   \",\n        \"  ---   \",\n        \"  ---   \",\n        \"  ---   \",\n        \"  ------\",\n        \"  ------\",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \"\n      ]\n    },\n    \"┟\": {\n      \"ch\": \"┟\",\n      \"code\": 9503,\n      \"map\": [\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"  ------\",\n        \"  ------\",\n        \"  ---   \",\n        \"  ---   \",\n        \"  ---   \",\n        \"  ---   \",\n        \"  ---   \",\n        \"  ---   \"\n      ]\n    },\n    \"┠\": {\n      \"ch\": \"┠\",\n      \"code\": 9504,\n      \"map\": [\n        \"  ---   \",\n        \"  ---   \",\n        \"  ---   \",\n        \"  ---   \",\n        \"  ---   \",\n        \"  ---   \",\n        \"  ------\",\n        \"  ------\",\n        \"  ---   \",\n        \"  ---   \",\n        \"  ---   \",\n        \"  ---   \",\n        \"  ---   \",\n        \"  ---   \"\n      ]\n    },\n    \"┡\": {\n      \"ch\": \"┡\",\n      \"code\": 9505,\n      \"map\": [\n        \"  ---   \",\n        \"  ---   \",\n        \"  ---   \",\n        \"  ---   \",\n        \"  ---   \",\n        \"  ------\",\n        \"  ------\",\n        \"  ------\",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \"\n      ]\n    },\n    \"┢\": {\n      \"ch\": \"┢\",\n      \"code\": 9506,\n      \"map\": [\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"  ------\",\n        \"  ------\",\n        \"  ------\",\n        \"  ---   \",\n        \"  ---   \",\n        \"  ---   \",\n        \"  ---   \",\n        \"  ---   \",\n        \"  ---   \"\n      ]\n    },\n    \"┣\": {\n      \"ch\": \"┣\",\n      \"code\": 9507,\n      \"map\": [\n        \"  ---   \",\n        \"  ---   \",\n        \"  ---   \",\n        \"  ---   \",\n        \"  ---   \",\n        \"  ------\",\n        \"  ------\",\n        \"  ------\",\n        \"  ---   \",\n        \"  ---   \",\n        \"  ---   \",\n        \"  ---   \",\n        \"  ---   \",\n        \"  ---   \"\n      ]\n    },\n    \"┤\": {\n      \"ch\": \"┤\",\n      \"code\": 9508,\n      \"map\": [\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"-----   \",\n        \"-----   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \"\n      ]\n    },\n    \"┥\": {\n      \"ch\": \"┥\",\n      \"code\": 9509,\n      \"map\": [\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"-----   \",\n        \"-----   \",\n        \"-----   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \"\n      ]\n    },\n    \"┦\": {\n      \"ch\": \"┦\",\n      \"code\": 9510,\n      \"map\": [\n        \"  ---   \",\n        \"  ---   \",\n        \"  ---   \",\n        \"  ---   \",\n        \"  ---   \",\n        \"  ---   \",\n        \"-----   \",\n        \"-----   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \"\n      ]\n    },\n    \"┧\": {\n      \"ch\": \"┧\",\n      \"code\": 9511,\n      \"map\": [\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"-----   \",\n        \"-----   \",\n        \"  ---   \",\n        \"  ---   \",\n        \"  ---   \",\n        \"  ---   \",\n        \"  ---   \",\n        \"  ---   \"\n      ]\n    },\n    \"┨\": {\n      \"ch\": \"┨\",\n      \"code\": 9512,\n      \"map\": [\n        \"  ---   \",\n        \"  ---   \",\n        \"  ---   \",\n        \"  ---   \",\n        \"  ---   \",\n        \"  ---   \",\n        \"-----   \",\n        \"-----   \",\n        \"  ---   \",\n        \"  ---   \",\n        \"  ---   \",\n        \"  ---   \",\n        \"  ---   \",\n        \"  ---   \"\n      ]\n    },\n    \"┩\": {\n      \"ch\": \"┩\",\n      \"code\": 9513,\n      \"map\": [\n        \"  ---   \",\n        \"  ---   \",\n        \"  ---   \",\n        \"  ---   \",\n        \"  ---   \",\n        \"-----   \",\n        \"-----   \",\n        \"-----   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \"\n      ]\n    },\n    \"┪\": {\n      \"ch\": \"┪\",\n      \"code\": 9514,\n      \"map\": [\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"-----   \",\n        \"-----   \",\n        \"-----   \",\n        \"  ---   \",\n        \"  ---   \",\n        \"  ---   \",\n        \"  ---   \",\n        \"  ---   \",\n        \"  ---   \"\n      ]\n    },\n    \"┫\": {\n      \"ch\": \"┫\",\n      \"code\": 9515,\n      \"map\": [\n        \"  ---   \",\n        \"  ---   \",\n        \"  ---   \",\n        \"  ---   \",\n        \"  ---   \",\n        \"-----   \",\n        \"-----   \",\n        \"-----   \",\n        \"  ---   \",\n        \"  ---   \",\n        \"  ---   \",\n        \"  ---   \",\n        \"  ---   \",\n        \"  ---   \"\n      ]\n    },\n    \"┬\": {\n      \"ch\": \"┬\",\n      \"code\": 9516,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"--------\",\n        \"--------\",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \"\n      ]\n    },\n    \"┭\": {\n      \"ch\": \"┭\",\n      \"code\": 9517,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"-----   \",\n        \"--------\",\n        \"--------\",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \"\n      ]\n    },\n    \"┮\": {\n      \"ch\": \"┮\",\n      \"code\": 9518,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"   -----\",\n        \"--------\",\n        \"--------\",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \"\n      ]\n    },\n    \"┯\": {\n      \"ch\": \"┯\",\n      \"code\": 9519,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"--------\",\n        \"--------\",\n        \"--------\",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \"\n      ]\n    },\n    \"┰\": {\n      \"ch\": \"┰\",\n      \"code\": 9520,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"--------\",\n        \"--------\",\n        \"  ---   \",\n        \"  ---   \",\n        \"  ---   \",\n        \"  ---   \",\n        \"  ---   \",\n        \"  ---   \"\n      ]\n    },\n    \"┱\": {\n      \"ch\": \"┱\",\n      \"code\": 9521,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"-----   \",\n        \"--------\",\n        \"--------\",\n        \"  ---   \",\n        \"  ---   \",\n        \"  ---   \",\n        \"  ---   \",\n        \"  ---   \",\n        \"  ---   \"\n      ]\n    },\n    \"┲\": {\n      \"ch\": \"┲\",\n      \"code\": 9522,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"  ------\",\n        \"--------\",\n        \"--------\",\n        \"  ---   \",\n        \"  ---   \",\n        \"  ---   \",\n        \"  ---   \",\n        \"  ---   \",\n        \"  ---   \"\n      ]\n    },\n    \"┳\": {\n      \"ch\": \"┳\",\n      \"code\": 9523,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"--------\",\n        \"--------\",\n        \"--------\",\n        \"  ---   \",\n        \"  ---   \",\n        \"  ---   \",\n        \"  ---   \",\n        \"  ---   \",\n        \"  ---   \"\n      ]\n    },\n    \"┴\": {\n      \"ch\": \"┴\",\n      \"code\": 9524,\n      \"map\": [\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"--------\",\n        \"--------\",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"┵\": {\n      \"ch\": \"┵\",\n      \"code\": 9525,\n      \"map\": [\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"-----   \",\n        \"--------\",\n        \"--------\",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"┶\": {\n      \"ch\": \"┶\",\n      \"code\": 9526,\n      \"map\": [\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   -----\",\n        \"--------\",\n        \"--------\",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"┷\": {\n      \"ch\": \"┷\",\n      \"code\": 9527,\n      \"map\": [\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"--------\",\n        \"--------\",\n        \"--------\",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"┸\": {\n      \"ch\": \"┸\",\n      \"code\": 9528,\n      \"map\": [\n        \"  ---   \",\n        \"  ---   \",\n        \"  ---   \",\n        \"  ---   \",\n        \"  ---   \",\n        \"  ---   \",\n        \"--------\",\n        \"--------\",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"┹\": {\n      \"ch\": \"┹\",\n      \"code\": 9529,\n      \"map\": [\n        \"  ---   \",\n        \"  ---   \",\n        \"  ---   \",\n        \"  ---   \",\n        \"  ---   \",\n        \"-----   \",\n        \"--------\",\n        \"--------\",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"┺\": {\n      \"ch\": \"┺\",\n      \"code\": 9530,\n      \"map\": [\n        \"  ---   \",\n        \"  ---   \",\n        \"  ---   \",\n        \"  ---   \",\n        \"  ---   \",\n        \"  ------\",\n        \"--------\",\n        \"--------\",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"┻\": {\n      \"ch\": \"┻\",\n      \"code\": 9531,\n      \"map\": [\n        \"  ---   \",\n        \"  ---   \",\n        \"  ---   \",\n        \"  ---   \",\n        \"  ---   \",\n        \"--------\",\n        \"--------\",\n        \"--------\",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"┼\": {\n      \"ch\": \"┼\",\n      \"code\": 9532,\n      \"map\": [\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"--------\",\n        \"--------\",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \"\n      ]\n    },\n    \"┽\": {\n      \"ch\": \"┽\",\n      \"code\": 9533,\n      \"map\": [\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"-----   \",\n        \"--------\",\n        \"--------\",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \"\n      ]\n    },\n    \"┾\": {\n      \"ch\": \"┾\",\n      \"code\": 9534,\n      \"map\": [\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   -----\",\n        \"--------\",\n        \"--------\",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \"\n      ]\n    },\n    \"┿\": {\n      \"ch\": \"┿\",\n      \"code\": 9535,\n      \"map\": [\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"--------\",\n        \"--------\",\n        \"--------\",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \"\n      ]\n    },\n    \"╀\": {\n      \"ch\": \"╀\",\n      \"code\": 9536,\n      \"map\": [\n        \"  ---   \",\n        \"  ---   \",\n        \"  ---   \",\n        \"  ---   \",\n        \"  ---   \",\n        \"  ---   \",\n        \"--------\",\n        \"--------\",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \"\n      ]\n    },\n    \"╁\": {\n      \"ch\": \"╁\",\n      \"code\": 9537,\n      \"map\": [\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"--------\",\n        \"--------\",\n        \"  ---   \",\n        \"  ---   \",\n        \"  ---   \",\n        \"  ---   \",\n        \"  ---   \",\n        \"  ---   \"\n      ]\n    },\n    \"╂\": {\n      \"ch\": \"╂\",\n      \"code\": 9538,\n      \"map\": [\n        \"  ---   \",\n        \"  ---   \",\n        \"  ---   \",\n        \"  ---   \",\n        \"  ---   \",\n        \"  ---   \",\n        \"--------\",\n        \"--------\",\n        \"  ---   \",\n        \"  ---   \",\n        \"  ---   \",\n        \"  ---   \",\n        \"  ---   \",\n        \"  ---   \"\n      ]\n    },\n    \"╃\": {\n      \"ch\": \"╃\",\n      \"code\": 9539,\n      \"map\": [\n        \"  ---   \",\n        \"  ---   \",\n        \"  ---   \",\n        \"  ---   \",\n        \"  ---   \",\n        \"-----   \",\n        \"--------\",\n        \"--------\",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \"\n      ]\n    },\n    \"╄\": {\n      \"ch\": \"╄\",\n      \"code\": 9540,\n      \"map\": [\n        \"  ---   \",\n        \"  ---   \",\n        \"  ---   \",\n        \"  ---   \",\n        \"  ---   \",\n        \"  ------\",\n        \"--------\",\n        \"--------\",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \"\n      ]\n    },\n    \"╅\": {\n      \"ch\": \"╅\",\n      \"code\": 9541,\n      \"map\": [\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"-----   \",\n        \"--------\",\n        \"--------\",\n        \"  ---   \",\n        \"  ---   \",\n        \"  ---   \",\n        \"  ---   \",\n        \"  ---   \",\n        \"  ---   \"\n      ]\n    },\n    \"╆\": {\n      \"ch\": \"╆\",\n      \"code\": 9542,\n      \"map\": [\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   -----\",\n        \"--------\",\n        \"--------\",\n        \"  ---   \",\n        \"  ---   \",\n        \"  ---   \",\n        \"  ---   \",\n        \"  ---   \",\n        \"  ---   \"\n      ]\n    },\n    \"╇\": {\n      \"ch\": \"╇\",\n      \"code\": 9543,\n      \"map\": [\n        \"  ---   \",\n        \"  ---   \",\n        \"  ---   \",\n        \"  ---   \",\n        \"  ---   \",\n        \"--------\",\n        \"--------\",\n        \"--------\",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \"\n      ]\n    },\n    \"╈\": {\n      \"ch\": \"╈\",\n      \"code\": 9544,\n      \"map\": [\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"--------\",\n        \"--------\",\n        \"--------\",\n        \"  ---   \",\n        \"  ---   \",\n        \"  ---   \",\n        \"  ---   \",\n        \"  ---   \",\n        \"  ---   \"\n      ]\n    },\n    \"╉\": {\n      \"ch\": \"╉\",\n      \"code\": 9545,\n      \"map\": [\n        \"  ---   \",\n        \"  ---   \",\n        \"  ---   \",\n        \"  ---   \",\n        \"  ---   \",\n        \"-----   \",\n        \"--------\",\n        \"--------\",\n        \"  ---   \",\n        \"  ---   \",\n        \"  ---   \",\n        \"  ---   \",\n        \"  ---   \",\n        \"  ---   \"\n      ]\n    },\n    \"╊\": {\n      \"ch\": \"╊\",\n      \"code\": 9546,\n      \"map\": [\n        \"  ---   \",\n        \"  ---   \",\n        \"  ---   \",\n        \"  ---   \",\n        \"  ---   \",\n        \"  ------\",\n        \"--------\",\n        \"--------\",\n        \"  ---   \",\n        \"  ---   \",\n        \"  ---   \",\n        \"  ---   \",\n        \"  ---   \",\n        \"  ---   \"\n      ]\n    },\n    \"╋\": {\n      \"ch\": \"╋\",\n      \"code\": 9547,\n      \"map\": [\n        \"  ---   \",\n        \"  ---   \",\n        \"  ---   \",\n        \"  ---   \",\n        \"  ---   \",\n        \"--------\",\n        \"--------\",\n        \"--------\",\n        \"  ---   \",\n        \"  ---   \",\n        \"  ---   \",\n        \"  ---   \",\n        \"  ---   \",\n        \"  ---   \"\n      ]\n    },\n    \"═\": {\n      \"ch\": \"═\",\n      \"code\": 9552,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"--------\",\n        \"--------\",\n        \"        \",\n        \"--------\",\n        \"--------\",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"║\": {\n      \"ch\": \"║\",\n      \"code\": 9553,\n      \"map\": [\n        \" -- --  \",\n        \" -- --  \",\n        \" -- --  \",\n        \" -- --  \",\n        \" -- --  \",\n        \" -- --  \",\n        \" -- --  \",\n        \" -- --  \",\n        \" -- --  \",\n        \" -- --  \",\n        \" -- --  \",\n        \" -- --  \",\n        \" -- --  \",\n        \" -- --  \"\n      ]\n    },\n    \"╒\": {\n      \"ch\": \"╒\",\n      \"code\": 9554,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"   -----\",\n        \"   -----\",\n        \"   --   \",\n        \"   -----\",\n        \"   -----\",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \"\n      ]\n    },\n    \"╓\": {\n      \"ch\": \"╓\",\n      \"code\": 9555,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \" -------\",\n        \" -------\",\n        \" -- --  \",\n        \" -- --  \",\n        \" -- --  \",\n        \" -- --  \",\n        \" -- --  \",\n        \" -- --  \"\n      ]\n    },\n    \"╔\": {\n      \"ch\": \"╔\",\n      \"code\": 9556,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \" -------\",\n        \" -------\",\n        \" --     \",\n        \" -- ----\",\n        \" -- ----\",\n        \" -- --  \",\n        \" -- --  \",\n        \" -- --  \",\n        \" -- --  \",\n        \" -- --  \"\n      ]\n    },\n    \"╕\": {\n      \"ch\": \"╕\",\n      \"code\": 9557,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"-----   \",\n        \"-----   \",\n        \"   --   \",\n        \"-----   \",\n        \"-----   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \"\n      ]\n    },\n    \"╖\": {\n      \"ch\": \"╖\",\n      \"code\": 9558,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"------  \",\n        \"------  \",\n        \" -- --  \",\n        \" -- --  \",\n        \" -- --  \",\n        \" -- --  \",\n        \" -- --  \",\n        \" -- --  \"\n      ]\n    },\n    \"╗\": {\n      \"ch\": \"╗\",\n      \"code\": 9559,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"------  \",\n        \"------  \",\n        \"    --  \",\n        \"--- --  \",\n        \"--- --  \",\n        \" -- --  \",\n        \" -- --  \",\n        \" -- --  \",\n        \" -- --  \",\n        \" -- --  \"\n      ]\n    },\n    \"╘\": {\n      \"ch\": \"╘\",\n      \"code\": 9560,\n      \"map\": [\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   -----\",\n        \"   -----\",\n        \"   --   \",\n        \"   -----\",\n        \"   -----\",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"╙\": {\n      \"ch\": \"╙\",\n      \"code\": 9561,\n      \"map\": [\n        \" -- --  \",\n        \" -- --  \",\n        \" -- --  \",\n        \" -- --  \",\n        \" -- --  \",\n        \" -- --  \",\n        \" -------\",\n        \" -------\",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"╚\": {\n      \"ch\": \"╚\",\n      \"code\": 9562,\n      \"map\": [\n        \" -- --  \",\n        \" -- --  \",\n        \" -- --  \",\n        \" -- --  \",\n        \" -- ----\",\n        \" -- ----\",\n        \" --     \",\n        \" -------\",\n        \" -------\",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"╛\": {\n      \"ch\": \"╛\",\n      \"code\": 9563,\n      \"map\": [\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"-----   \",\n        \"-----   \",\n        \"   --   \",\n        \"-----   \",\n        \"-----   \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"╜\": {\n      \"ch\": \"╜\",\n      \"code\": 9564,\n      \"map\": [\n        \" -- --  \",\n        \" -- --  \",\n        \" -- --  \",\n        \" -- --  \",\n        \" -- --  \",\n        \" -- --  \",\n        \"------  \",\n        \"------  \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"╝\": {\n      \"ch\": \"╝\",\n      \"code\": 9565,\n      \"map\": [\n        \" -- --  \",\n        \" -- --  \",\n        \" -- --  \",\n        \" -- --  \",\n        \"--- --  \",\n        \"--- --  \",\n        \"    --  \",\n        \"------  \",\n        \"------  \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"╞\": {\n      \"ch\": \"╞\",\n      \"code\": 9566,\n      \"map\": [\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   -----\",\n        \"   -----\",\n        \"   --   \",\n        \"   -----\",\n        \"   -----\",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \"\n      ]\n    },\n    \"╟\": {\n      \"ch\": \"╟\",\n      \"code\": 9567,\n      \"map\": [\n        \" -- --  \",\n        \" -- --  \",\n        \" -- --  \",\n        \" -- --  \",\n        \" -- --  \",\n        \" -- --  \",\n        \" -- ----\",\n        \" -- ----\",\n        \" -- --  \",\n        \" -- --  \",\n        \" -- --  \",\n        \" -- --  \",\n        \" -- --  \",\n        \" -- --  \"\n      ]\n    },\n    \"╠\": {\n      \"ch\": \"╠\",\n      \"code\": 9568,\n      \"map\": [\n        \" -- --  \",\n        \" -- --  \",\n        \" -- --  \",\n        \" -- --  \",\n        \" -- ----\",\n        \" -- ----\",\n        \" --     \",\n        \" -- ----\",\n        \" -- ----\",\n        \" -- --  \",\n        \" -- --  \",\n        \" -- --  \",\n        \" -- --  \",\n        \" -- --  \"\n      ]\n    },\n    \"╡\": {\n      \"ch\": \"╡\",\n      \"code\": 9569,\n      \"map\": [\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"-----   \",\n        \"-----   \",\n        \"   --   \",\n        \"-----   \",\n        \"-----   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \"\n      ]\n    },\n    \"╢\": {\n      \"ch\": \"╢\",\n      \"code\": 9570,\n      \"map\": [\n        \" -- --  \",\n        \" -- --  \",\n        \" -- --  \",\n        \" -- --  \",\n        \" -- --  \",\n        \" -- --  \",\n        \"--- --  \",\n        \"--- --  \",\n        \" -- --  \",\n        \" -- --  \",\n        \" -- --  \",\n        \" -- --  \",\n        \" -- --  \",\n        \" -- --  \"\n      ]\n    },\n    \"╣\": {\n      \"ch\": \"╣\",\n      \"code\": 9571,\n      \"map\": [\n        \" -- --  \",\n        \" -- --  \",\n        \" -- --  \",\n        \" -- --  \",\n        \"--- --  \",\n        \"--- --  \",\n        \"    --  \",\n        \"--- --  \",\n        \"--- --  \",\n        \" -- --  \",\n        \" -- --  \",\n        \" -- --  \",\n        \" -- --  \",\n        \" -- --  \"\n      ]\n    },\n    \"╤\": {\n      \"ch\": \"╤\",\n      \"code\": 9572,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"--------\",\n        \"--------\",\n        \"        \",\n        \"--------\",\n        \"--------\",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \"\n      ]\n    },\n    \"╥\": {\n      \"ch\": \"╥\",\n      \"code\": 9573,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"--------\",\n        \"--------\",\n        \" -- --  \",\n        \" -- --  \",\n        \" -- --  \",\n        \" -- --  \",\n        \" -- --  \",\n        \" -- --  \"\n      ]\n    },\n    \"╦\": {\n      \"ch\": \"╦\",\n      \"code\": 9574,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"--------\",\n        \"--------\",\n        \"        \",\n        \"--- ----\",\n        \"--- ----\",\n        \" -- --  \",\n        \" -- --  \",\n        \" -- --  \",\n        \" -- --  \",\n        \" -- --  \"\n      ]\n    },\n    \"╧\": {\n      \"ch\": \"╧\",\n      \"code\": 9575,\n      \"map\": [\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"--------\",\n        \"--------\",\n        \"        \",\n        \"--------\",\n        \"--------\",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"╨\": {\n      \"ch\": \"╨\",\n      \"code\": 9576,\n      \"map\": [\n        \" -- --  \",\n        \" -- --  \",\n        \" -- --  \",\n        \" -- --  \",\n        \" -- --  \",\n        \" -- --  \",\n        \"--------\",\n        \"--------\",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"╩\": {\n      \"ch\": \"╩\",\n      \"code\": 9577,\n      \"map\": [\n        \" -- --  \",\n        \" -- --  \",\n        \" -- --  \",\n        \" -- --  \",\n        \"--- ----\",\n        \"--- ----\",\n        \"        \",\n        \"--------\",\n        \"--------\",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"╪\": {\n      \"ch\": \"╪\",\n      \"code\": 9578,\n      \"map\": [\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"--------\",\n        \"--------\",\n        \"   --   \",\n        \"--------\",\n        \"--------\",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \"\n      ]\n    },\n    \"╫\": {\n      \"ch\": \"╫\",\n      \"code\": 9579,\n      \"map\": [\n        \" -- --  \",\n        \" -- --  \",\n        \" -- --  \",\n        \" -- --  \",\n        \" -- --  \",\n        \" -- --  \",\n        \"--------\",\n        \"--------\",\n        \" -- --  \",\n        \" -- --  \",\n        \" -- --  \",\n        \" -- --  \",\n        \" -- --  \",\n        \" -- --  \"\n      ]\n    },\n    \"╬\": {\n      \"ch\": \"╬\",\n      \"code\": 9580,\n      \"map\": [\n        \" -- --  \",\n        \" -- --  \",\n        \" -- --  \",\n        \" -- --  \",\n        \"--- ----\",\n        \"--- ----\",\n        \"        \",\n        \"--- ----\",\n        \"--- ----\",\n        \" -- --  \",\n        \" -- --  \",\n        \" -- --  \",\n        \" -- --  \",\n        \" -- --  \"\n      ]\n    },\n    \"╭\": {\n      \"ch\": \"╭\",\n      \"code\": 9581,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"     ---\",\n        \"    ----\",\n        \"   ---  \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \"\n      ]\n    },\n    \"╮\": {\n      \"ch\": \"╮\",\n      \"code\": 9582,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"---     \",\n        \"----    \",\n        \"  ---   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \"\n      ]\n    },\n    \"╯\": {\n      \"ch\": \"╯\",\n      \"code\": 9583,\n      \"map\": [\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"  ---   \",\n        \"----    \",\n        \"---     \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"╰\": {\n      \"ch\": \"╰\",\n      \"code\": 9584,\n      \"map\": [\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   ---  \",\n        \"    ----\",\n        \"     ---\",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"╴\": {\n      \"ch\": \"╴\",\n      \"code\": 9588,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"-----   \",\n        \"-----   \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"╵\": {\n      \"ch\": \"╵\",\n      \"code\": 9589,\n      \"map\": [\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"╶\": {\n      \"ch\": \"╶\",\n      \"code\": 9590,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"   -----\",\n        \"   -----\",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"╷\": {\n      \"ch\": \"╷\",\n      \"code\": 9591,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \"\n      ]\n    },\n    \"╸\": {\n      \"ch\": \"╸\",\n      \"code\": 9592,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"-----   \",\n        \"-----   \",\n        \"-----   \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"╹\": {\n      \"ch\": \"╹\",\n      \"code\": 9593,\n      \"map\": [\n        \"  ---   \",\n        \"  ---   \",\n        \"  ---   \",\n        \"  ---   \",\n        \"  ---   \",\n        \"  ---   \",\n        \"  ---   \",\n        \"  ---   \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"╺\": {\n      \"ch\": \"╺\",\n      \"code\": 9594,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"   -----\",\n        \"   -----\",\n        \"   -----\",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"╻\": {\n      \"ch\": \"╻\",\n      \"code\": 9595,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"  ---   \",\n        \"  ---   \",\n        \"  ---   \",\n        \"  ---   \",\n        \"  ---   \",\n        \"  ---   \",\n        \"  ---   \",\n        \"  ---   \"\n      ]\n    },\n    \"╼\": {\n      \"ch\": \"╼\",\n      \"code\": 9596,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"   -----\",\n        \"--------\",\n        \"--------\",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"╽\": {\n      \"ch\": \"╽\",\n      \"code\": 9597,\n      \"map\": [\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"  ---   \",\n        \"  ---   \",\n        \"  ---   \",\n        \"  ---   \",\n        \"  ---   \",\n        \"  ---   \",\n        \"  ---   \",\n        \"  ---   \"\n      ]\n    },\n    \"╾\": {\n      \"ch\": \"╾\",\n      \"code\": 9598,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"-----   \",\n        \"--------\",\n        \"--------\",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"╿\": {\n      \"ch\": \"╿\",\n      \"code\": 9599,\n      \"map\": [\n        \"  ---   \",\n        \"  ---   \",\n        \"  ---   \",\n        \"  ---   \",\n        \"  ---   \",\n        \"  ---   \",\n        \"  ---   \",\n        \"  ---   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \"\n      ]\n    },\n    \"▀\": {\n      \"ch\": \"▀\",\n      \"code\": 9600,\n      \"map\": [\n        \"--------\",\n        \"--------\",\n        \"--------\",\n        \"--------\",\n        \"--------\",\n        \"--------\",\n        \"--------\",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"▁\": {\n      \"ch\": \"▁\",\n      \"code\": 9601,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"--------\",\n        \"--------\"\n      ]\n    },\n    \"▂\": {\n      \"ch\": \"▂\",\n      \"code\": 9602,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"--------\",\n        \"--------\",\n        \"--------\",\n        \"--------\"\n      ]\n    },\n    \"▃\": {\n      \"ch\": \"▃\",\n      \"code\": 9603,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"--------\",\n        \"--------\",\n        \"--------\",\n        \"--------\",\n        \"--------\"\n      ]\n    },\n    \"▄\": {\n      \"ch\": \"▄\",\n      \"code\": 9604,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"--------\",\n        \"--------\",\n        \"--------\",\n        \"--------\",\n        \"--------\",\n        \"--------\",\n        \"--------\"\n      ]\n    },\n    \"▅\": {\n      \"ch\": \"▅\",\n      \"code\": 9605,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"--------\",\n        \"--------\",\n        \"--------\",\n        \"--------\",\n        \"--------\",\n        \"--------\",\n        \"--------\",\n        \"--------\",\n        \"--------\"\n      ]\n    },\n    \"▆\": {\n      \"ch\": \"▆\",\n      \"code\": 9606,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"--------\",\n        \"--------\",\n        \"--------\",\n        \"--------\",\n        \"--------\",\n        \"--------\",\n        \"--------\",\n        \"--------\",\n        \"--------\",\n        \"--------\",\n        \"--------\"\n      ]\n    },\n    \"▇\": {\n      \"ch\": \"▇\",\n      \"code\": 9607,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"--------\",\n        \"--------\",\n        \"--------\",\n        \"--------\",\n        \"--------\",\n        \"--------\",\n        \"--------\",\n        \"--------\",\n        \"--------\",\n        \"--------\",\n        \"--------\",\n        \"--------\"\n      ]\n    },\n    \"█\": {\n      \"ch\": \"█\",\n      \"code\": 9608,\n      \"map\": [\n        \"--------\",\n        \"--------\",\n        \"--------\",\n        \"--------\",\n        \"--------\",\n        \"--------\",\n        \"--------\",\n        \"--------\",\n        \"--------\",\n        \"--------\",\n        \"--------\",\n        \"--------\",\n        \"--------\",\n        \"--------\"\n      ]\n    },\n    \"▉\": {\n      \"ch\": \"▉\",\n      \"code\": 9609,\n      \"map\": [\n        \"------- \",\n        \"------- \",\n        \"------- \",\n        \"------- \",\n        \"------- \",\n        \"------- \",\n        \"------- \",\n        \"------- \",\n        \"------- \",\n        \"------- \",\n        \"------- \",\n        \"------- \",\n        \"------- \",\n        \"------- \"\n      ]\n    },\n    \"▊\": {\n      \"ch\": \"▊\",\n      \"code\": 9610,\n      \"map\": [\n        \"------  \",\n        \"------  \",\n        \"------  \",\n        \"------  \",\n        \"------  \",\n        \"------  \",\n        \"------  \",\n        \"------  \",\n        \"------  \",\n        \"------  \",\n        \"------  \",\n        \"------  \",\n        \"------  \",\n        \"------  \"\n      ]\n    },\n    \"▋\": {\n      \"ch\": \"▋\",\n      \"code\": 9611,\n      \"map\": [\n        \"-----   \",\n        \"-----   \",\n        \"-----   \",\n        \"-----   \",\n        \"-----   \",\n        \"-----   \",\n        \"-----   \",\n        \"-----   \",\n        \"-----   \",\n        \"-----   \",\n        \"-----   \",\n        \"-----   \",\n        \"-----   \",\n        \"-----   \"\n      ]\n    },\n    \"▌\": {\n      \"ch\": \"▌\",\n      \"code\": 9612,\n      \"map\": [\n        \"----    \",\n        \"----    \",\n        \"----    \",\n        \"----    \",\n        \"----    \",\n        \"----    \",\n        \"----    \",\n        \"----    \",\n        \"----    \",\n        \"----    \",\n        \"----    \",\n        \"----    \",\n        \"----    \",\n        \"----    \"\n      ]\n    },\n    \"▍\": {\n      \"ch\": \"▍\",\n      \"code\": 9613,\n      \"map\": [\n        \"---     \",\n        \"---     \",\n        \"---     \",\n        \"---     \",\n        \"---     \",\n        \"---     \",\n        \"---     \",\n        \"---     \",\n        \"---     \",\n        \"---     \",\n        \"---     \",\n        \"---     \",\n        \"---     \",\n        \"---     \"\n      ]\n    },\n    \"▎\": {\n      \"ch\": \"▎\",\n      \"code\": 9614,\n      \"map\": [\n        \"--      \",\n        \"--      \",\n        \"--      \",\n        \"--      \",\n        \"--      \",\n        \"--      \",\n        \"--      \",\n        \"--      \",\n        \"--      \",\n        \"--      \",\n        \"--      \",\n        \"--      \",\n        \"--      \",\n        \"--      \"\n      ]\n    },\n    \"▏\": {\n      \"ch\": \"▏\",\n      \"code\": 9615,\n      \"map\": [\n        \"-       \",\n        \"-       \",\n        \"-       \",\n        \"-       \",\n        \"-       \",\n        \"-       \",\n        \"-       \",\n        \"-       \",\n        \"-       \",\n        \"-       \",\n        \"-       \",\n        \"-       \",\n        \"-       \",\n        \"-       \"\n      ]\n    },\n    \"▐\": {\n      \"ch\": \"▐\",\n      \"code\": 9616,\n      \"map\": [\n        \"    ----\",\n        \"    ----\",\n        \"    ----\",\n        \"    ----\",\n        \"    ----\",\n        \"    ----\",\n        \"    ----\",\n        \"    ----\",\n        \"    ----\",\n        \"    ----\",\n        \"    ----\",\n        \"    ----\",\n        \"    ----\",\n        \"    ----\"\n      ]\n    },\n    \"░\": {\n      \"ch\": \"░\",\n      \"code\": 9617,\n      \"map\": [\n        \"-   -   \",\n        \"  -   - \",\n        \"-   -   \",\n        \"  -   - \",\n        \"-   -   \",\n        \"  -   - \",\n        \"-   -   \",\n        \"  -   - \",\n        \"-   -   \",\n        \"  -   - \",\n        \"-   -   \",\n        \"  -   - \",\n        \"-   -   \",\n        \"  -   - \"\n      ]\n    },\n    \"▒\": {\n      \"ch\": \"▒\",\n      \"code\": 9618,\n      \"map\": [\n        \"- - - - \",\n        \" - - - -\",\n        \"- - - - \",\n        \" - - - -\",\n        \"- - - - \",\n        \" - - - -\",\n        \"- - - - \",\n        \" - - - -\",\n        \"- - - - \",\n        \" - - - -\",\n        \"- - - - \",\n        \" - - - -\",\n        \"- - - - \",\n        \" - - - -\"\n      ]\n    },\n    \"▓\": {\n      \"ch\": \"▓\",\n      \"code\": 9619,\n      \"map\": [\n        \"--- --- \",\n        \"- --- --\",\n        \"--- --- \",\n        \"- --- --\",\n        \"--- --- \",\n        \"- --- --\",\n        \"--- --- \",\n        \"- --- --\",\n        \"--- --- \",\n        \"- --- --\",\n        \"--- --- \",\n        \"- --- --\",\n        \"--- --- \",\n        \"- --- --\"\n      ]\n    },\n    \"▖\": {\n      \"ch\": \"▖\",\n      \"code\": 9622,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"----    \",\n        \"----    \",\n        \"----    \",\n        \"----    \",\n        \"----    \",\n        \"----    \",\n        \"----    \"\n      ]\n    },\n    \"▗\": {\n      \"ch\": \"▗\",\n      \"code\": 9623,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"    ----\",\n        \"    ----\",\n        \"    ----\",\n        \"    ----\",\n        \"    ----\",\n        \"    ----\",\n        \"    ----\"\n      ]\n    },\n    \"▘\": {\n      \"ch\": \"▘\",\n      \"code\": 9624,\n      \"map\": [\n        \"----    \",\n        \"----    \",\n        \"----    \",\n        \"----    \",\n        \"----    \",\n        \"----    \",\n        \"----    \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"▙\": {\n      \"ch\": \"▙\",\n      \"code\": 9625,\n      \"map\": [\n        \"----    \",\n        \"----    \",\n        \"----    \",\n        \"----    \",\n        \"----    \",\n        \"----    \",\n        \"----    \",\n        \"--------\",\n        \"--------\",\n        \"--------\",\n        \"--------\",\n        \"--------\",\n        \"--------\",\n        \"--------\"\n      ]\n    },\n    \"▚\": {\n      \"ch\": \"▚\",\n      \"code\": 9626,\n      \"map\": [\n        \"----    \",\n        \"----    \",\n        \"----    \",\n        \"----    \",\n        \"----    \",\n        \"----    \",\n        \"----    \",\n        \"    ----\",\n        \"    ----\",\n        \"    ----\",\n        \"    ----\",\n        \"    ----\",\n        \"    ----\",\n        \"    ----\"\n      ]\n    },\n    \"▛\": {\n      \"ch\": \"▛\",\n      \"code\": 9627,\n      \"map\": [\n        \"--------\",\n        \"--------\",\n        \"--------\",\n        \"--------\",\n        \"--------\",\n        \"--------\",\n        \"--------\",\n        \"----    \",\n        \"----    \",\n        \"----    \",\n        \"----    \",\n        \"----    \",\n        \"----    \",\n        \"----    \"\n      ]\n    },\n    \"▜\": {\n      \"ch\": \"▜\",\n      \"code\": 9628,\n      \"map\": [\n        \"--------\",\n        \"--------\",\n        \"--------\",\n        \"--------\",\n        \"--------\",\n        \"--------\",\n        \"--------\",\n        \"    ----\",\n        \"    ----\",\n        \"    ----\",\n        \"    ----\",\n        \"    ----\",\n        \"    ----\",\n        \"    ----\"\n      ]\n    },\n    \"▝\": {\n      \"ch\": \"▝\",\n      \"code\": 9629,\n      \"map\": [\n        \"    ----\",\n        \"    ----\",\n        \"    ----\",\n        \"    ----\",\n        \"    ----\",\n        \"    ----\",\n        \"    ----\",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"▞\": {\n      \"ch\": \"▞\",\n      \"code\": 9630,\n      \"map\": [\n        \"    ----\",\n        \"    ----\",\n        \"    ----\",\n        \"    ----\",\n        \"    ----\",\n        \"    ----\",\n        \"    ----\",\n        \"----    \",\n        \"----    \",\n        \"----    \",\n        \"----    \",\n        \"----    \",\n        \"----    \",\n        \"----    \"\n      ]\n    },\n    \"▟\": {\n      \"ch\": \"▟\",\n      \"code\": 9631,\n      \"map\": [\n        \"    ----\",\n        \"    ----\",\n        \"    ----\",\n        \"    ----\",\n        \"    ----\",\n        \"    ----\",\n        \"    ----\",\n        \"--------\",\n        \"--------\",\n        \"--------\",\n        \"--------\",\n        \"--------\",\n        \"--------\",\n        \"--------\"\n      ]\n    },\n    \"■\": {\n      \"ch\": \"■\",\n      \"code\": 9632,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \" -----  \",\n        \" -----  \",\n        \" -----  \",\n        \" -----  \",\n        \" -----  \",\n        \" -----  \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"▬\": {\n      \"ch\": \"▬\",\n      \"code\": 9644,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"------- \",\n        \"------- \",\n        \"------- \",\n        \"------- \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"▮\": {\n      \"ch\": \"▮\",\n      \"code\": 9646,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"------- \",\n        \"------- \",\n        \"------- \",\n        \"------- \",\n        \"------- \",\n        \"------- \",\n        \"------- \",\n        \"------- \",\n        \"------- \",\n        \"------- \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"▲\": {\n      \"ch\": \"▲\",\n      \"code\": 9650,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"   --   \",\n        \"   --   \",\n        \"  ----  \",\n        \"  ----  \",\n        \" ------ \",\n        \" ------ \",\n        \"--------\",\n        \"--------\",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"▶\": {\n      \"ch\": \"▶\",\n      \"code\": 9654,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"--      \",\n        \"----    \",\n        \"------  \",\n        \"--------\",\n        \"--------\",\n        \"------  \",\n        \"----    \",\n        \"--      \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"▼\": {\n      \"ch\": \"▼\",\n      \"code\": 9660,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"--------\",\n        \"--------\",\n        \" ------ \",\n        \" ------ \",\n        \"  ----  \",\n        \"  ----  \",\n        \"   --   \",\n        \"   --   \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"◀\": {\n      \"ch\": \"◀\",\n      \"code\": 9664,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"      --\",\n        \"    ----\",\n        \"  ------\",\n        \"--------\",\n        \"--------\",\n        \"  ------\",\n        \"    ----\",\n        \"      --\",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"◆\": {\n      \"ch\": \"◆\",\n      \"code\": 9670,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"   --   \",\n        \"  ----  \",\n        \" ------ \",\n        \"--------\",\n        \" ------ \",\n        \"  ----  \",\n        \"   --   \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"◊\": {\n      \"ch\": \"◊\",\n      \"code\": 9674,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"   --   \",\n        \"  ----  \",\n        \" --  -- \",\n        \"--    --\",\n        \" --  -- \",\n        \"  ----  \",\n        \"   --   \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"○\": {\n      \"ch\": \"○\",\n      \"code\": 9675,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"  ----  \",\n        \" --  -- \",\n        \" -    - \",\n        \" -    - \",\n        \" --  -- \",\n        \"  ----  \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"●\": {\n      \"ch\": \"●\",\n      \"code\": 9679,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"  ----  \",\n        \" ------ \",\n        \" ------ \",\n        \" ------ \",\n        \" ------ \",\n        \"  ----  \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"◘\": {\n      \"ch\": \"◘\",\n      \"code\": 9688,\n      \"map\": [\n        \"--------\",\n        \"--------\",\n        \"--------\",\n        \"--------\",\n        \"--------\",\n        \"---  ---\",\n        \"--    --\",\n        \"--    --\",\n        \"---  ---\",\n        \"--------\",\n        \"--------\",\n        \"--------\",\n        \"--------\",\n        \"--------\"\n      ]\n    },\n    \"◙\": {\n      \"ch\": \"◙\",\n      \"code\": 9689,\n      \"map\": [\n        \"--------\",\n        \"--------\",\n        \"--------\",\n        \"--------\",\n        \"--    --\",\n        \"-  --  -\",\n        \"- ---- -\",\n        \"- ---- -\",\n        \"-  --  -\",\n        \"--    --\",\n        \"--------\",\n        \"--------\",\n        \"--------\",\n        \"--------\"\n      ]\n    },\n    \"☺\": {\n      \"ch\": \"☺\",\n      \"code\": 9786,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \" -----  \",\n        \"-     - \",\n        \"- - - - \",\n        \"-     - \",\n        \"-     - \",\n        \"- --- - \",\n        \"-  -  - \",\n        \"-     - \",\n        \"-     - \",\n        \" -----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"☻\": {\n      \"ch\": \"☻\",\n      \"code\": 9787,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \" -----  \",\n        \"------- \",\n        \"-- - -- \",\n        \"------- \",\n        \"------- \",\n        \"--   -- \",\n        \"--- --- \",\n        \"------- \",\n        \"------- \",\n        \" -----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"☼\": {\n      \"ch\": \"☼\",\n      \"code\": 9788,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"   --   \",\n        \"-- -- --\",\n        \" ------ \",\n        \"  ----  \",\n        \"---  ---\",\n        \"  ----  \",\n        \" ------ \",\n        \"-- -- --\",\n        \"   --   \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"♀\": {\n      \"ch\": \"♀\",\n      \"code\": 9792,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"  ----  \",\n        \" --  -- \",\n        \" --  -- \",\n        \" --  -- \",\n        \" --  -- \",\n        \"  ----  \",\n        \"   --   \",\n        \" ------ \",\n        \"   --   \",\n        \"   --   \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"♂\": {\n      \"ch\": \"♂\",\n      \"code\": 9794,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"  ----- \",\n        \"    --- \",\n        \"   -- - \",\n        \"  --  - \",\n        \" ----   \",\n        \"--  --  \",\n        \"--  --  \",\n        \"--  --  \",\n        \"--  --  \",\n        \" ----   \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"♠\": {\n      \"ch\": \"♠\",\n      \"code\": 9824,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"   --   \",\n        \"   --   \",\n        \"  ----  \",\n        \" ------ \",\n        \"--------\",\n        \"--------\",\n        \" ------ \",\n        \"   --   \",\n        \"   --   \",\n        \"  ----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"♣\": {\n      \"ch\": \"♣\",\n      \"code\": 9827,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"   --   \",\n        \"  ----  \",\n        \"  ----  \",\n        \"   --   \",\n        \" - -- - \",\n        \"--------\",\n        \"--------\",\n        \" - -- - \",\n        \"   --   \",\n        \"  ----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"♥\": {\n      \"ch\": \"♥\",\n      \"code\": 9829,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \" -- --  \",\n        \"------- \",\n        \"------- \",\n        \"------- \",\n        \"------- \",\n        \" -----  \",\n        \"  ---   \",\n        \"   -    \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"♦\": {\n      \"ch\": \"♦\",\n      \"code\": 9830,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"   --   \",\n        \"  ----  \",\n        \" ------ \",\n        \"--------\",\n        \" ------ \",\n        \"  ----  \",\n        \"   --   \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"♪\": {\n      \"ch\": \"♪\",\n      \"code\": 9834,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \" ------ \",\n        \" --  -- \",\n        \" ------ \",\n        \" --     \",\n        \" --     \",\n        \" --     \",\n        \" --     \",\n        \" --     \",\n        \"---     \",\n        \"--      \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"♫\": {\n      \"ch\": \"♫\",\n      \"code\": 9835,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \" ------ \",\n        \" --  -- \",\n        \" ------ \",\n        \" --  -- \",\n        \" --  -- \",\n        \" --  -- \",\n        \" --  -- \",\n        \" --  -- \",\n        \" -- --- \",\n        \"--- --  \",\n        \"--      \",\n        \"        \"\n      ]\n    },\n    \"✓\": {\n      \"ch\": \"✓\",\n      \"code\": 10003,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"      --\",\n        \"      --\",\n        \"     -- \",\n        \"     -- \",\n        \"--  --  \",\n        \"--  --  \",\n        \" ----   \",\n        \" ----   \",\n        \"  --    \",\n        \"  --    \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"✔\": {\n      \"ch\": \"✔\",\n      \"code\": 10004,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"     ---\",\n        \"     ---\",\n        \"    --- \",\n        \"    --- \",\n        \"-- ---  \",\n        \"------  \",\n        \" ----   \",\n        \" ----   \",\n        \"  --    \",\n        \"  --    \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"✗\": {\n      \"ch\": \"✗\",\n      \"code\": 10007,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"    --  \",\n        \"--  --  \",\n        \" ----   \",\n        \"  ---   \",\n        \"  ---   \",\n        \"  ----  \",\n        \" --  -- \",\n        \" --     \",\n        \"--      \",\n        \"--      \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"✘\": {\n      \"ch\": \"✘\",\n      \"code\": 10008,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"    --- \",\n        \"--- --- \",\n        \" -----  \",\n        \"  ----  \",\n        \"  ----  \",\n        \"  ----- \",\n        \" --- ---\",\n        \" ---  --\",\n        \"---     \",\n        \"---     \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"\": {\n      \"ch\": \"\",\n      \"code\": 57504,\n      \"map\": [\n        \"--      \",\n        \"--  --  \",\n        \"-- ---- \",\n        \"--------\",\n        \"--  --  \",\n        \"--  --  \",\n        \"--  --  \",\n        \"-  --   \",\n        \"  --    \",\n        \" --     \",\n        \"--      \",\n        \"--      \",\n        \"--      \",\n        \"--      \"\n      ]\n    },\n    \"\": {\n      \"ch\": \"\",\n      \"code\": 57505,\n      \"map\": [\n        \"--      \",\n        \"--      \",\n        \"--      \",\n        \"--      \",\n        \"--      \",\n        \"------  \",\n        \"        \",\n        \"  --  --\",\n        \"  --- --\",\n        \"  ------\",\n        \"  -- ---\",\n        \"  --  --\",\n        \"  --  --\",\n        \"        \"\n      ]\n    },\n    \"\": {\n      \"ch\": \"\",\n      \"code\": 57506,\n      \"map\": [\n        \"  ----  \",\n        \" --  -- \",\n        \" --  -- \",\n        \" --  -- \",\n        \" --  -- \",\n        \"--------\",\n        \"--------\",\n        \"---  ---\",\n        \"--    --\",\n        \"---  ---\",\n        \"--------\",\n        \"--------\",\n        \"--------\",\n        \"        \"\n      ]\n    },\n    \"\": {\n      \"ch\": \"\",\n      \"code\": 57520,\n      \"map\": [\n        \"-       \",\n        \"--      \",\n        \"---     \",\n        \"----    \",\n        \"-----   \",\n        \"------  \",\n        \"------- \",\n        \"------- \",\n        \"------  \",\n        \"-----   \",\n        \"----    \",\n        \"---     \",\n        \"--      \",\n        \"-       \"\n      ]\n    },\n    \"\": {\n      \"ch\": \"\",\n      \"code\": 57521,\n      \"map\": [\n        \"-       \",\n        \"--      \",\n        \" --     \",\n        \"  --    \",\n        \"   --   \",\n        \"    --  \",\n        \"     -- \",\n        \"     -- \",\n        \"    --  \",\n        \"   --   \",\n        \"  --    \",\n        \" --     \",\n        \"--      \",\n        \"-       \"\n      ]\n    },\n    \"\": {\n      \"ch\": \"\",\n      \"code\": 57522,\n      \"map\": [\n        \"       -\",\n        \"      --\",\n        \"     ---\",\n        \"    ----\",\n        \"   -----\",\n        \"  ------\",\n        \" -------\",\n        \" -------\",\n        \"  ------\",\n        \"   -----\",\n        \"    ----\",\n        \"     ---\",\n        \"      --\",\n        \"       -\"\n      ]\n    },\n    \"\": {\n      \"ch\": \"\",\n      \"code\": 57523,\n      \"map\": [\n        \"       -\",\n        \"      --\",\n        \"     -- \",\n        \"    --  \",\n        \"   --   \",\n        \"  --    \",\n        \" --     \",\n        \" --     \",\n        \"  --    \",\n        \"   --   \",\n        \"    --  \",\n        \"     -- \",\n        \"      --\",\n        \"       -\"\n      ]\n    },\n    \"\": {\n      \"ch\": \"\",\n      \"code\": 63166,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"    --- \",\n        \"     -- \",\n        \"     -- \",\n        \"     -- \",\n        \"     -- \",\n        \"     -- \",\n        \" --  -- \",\n        \" --  -- \",\n        \"  ----  \"\n      ]\n    },\n    \"�\": {\n      \"ch\": \"�\",\n      \"code\": 65533,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"------- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"--   -- \",\n        \"------- \",\n        \"        \",\n        \"        \"\n      ]\n    }\n  }\n}"
  },
  {
    "path": "usr/fonts/ter-u14n.json",
    "content": "{\n  \"width\": 8,\n  \"height\": 14,\n  \"glyphs\": {\n    \"0\": {\n      \"ch\": \"0\",\n      \"code\": 48,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"  ----  \",\n        \" -    - \",\n        \" -    - \",\n        \" -   -- \",\n        \" -  - - \",\n        \" - -  - \",\n        \" --   - \",\n        \" -    - \",\n        \" -    - \",\n        \"  ----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"1\": {\n      \"ch\": \"1\",\n      \"code\": 49,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"    -   \",\n        \"   --   \",\n        \"  - -   \",\n        \"    -   \",\n        \"    -   \",\n        \"    -   \",\n        \"    -   \",\n        \"    -   \",\n        \"    -   \",\n        \"  ----- \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"2\": {\n      \"ch\": \"2\",\n      \"code\": 50,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"  ----  \",\n        \" -    - \",\n        \" -    - \",\n        \"      - \",\n        \"     -  \",\n        \"    -   \",\n        \"   -    \",\n        \"  -     \",\n        \" -      \",\n        \" ------ \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"3\": {\n      \"ch\": \"3\",\n      \"code\": 51,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"  ----  \",\n        \" -    - \",\n        \" -    - \",\n        \"      - \",\n        \"   ---  \",\n        \"      - \",\n        \"      - \",\n        \" -    - \",\n        \" -    - \",\n        \"  ----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"4\": {\n      \"ch\": \"4\",\n      \"code\": 52,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"      - \",\n        \"     -- \",\n        \"    - - \",\n        \"   -  - \",\n        \"  -   - \",\n        \" -    - \",\n        \" ------ \",\n        \"      - \",\n        \"      - \",\n        \"      - \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"5\": {\n      \"ch\": \"5\",\n      \"code\": 53,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \" ------ \",\n        \" -      \",\n        \" -      \",\n        \" -      \",\n        \" -----  \",\n        \"      - \",\n        \"      - \",\n        \"      - \",\n        \" -    - \",\n        \"  ----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"6\": {\n      \"ch\": \"6\",\n      \"code\": 54,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"   ---  \",\n        \"  -     \",\n        \" -      \",\n        \" -      \",\n        \" -----  \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \"  ----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"7\": {\n      \"ch\": \"7\",\n      \"code\": 55,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \" ------ \",\n        \"      - \",\n        \"      - \",\n        \"     -  \",\n        \"     -  \",\n        \"    -   \",\n        \"    -   \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"8\": {\n      \"ch\": \"8\",\n      \"code\": 56,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"  ----  \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \"  ----  \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \"  ----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"9\": {\n      \"ch\": \"9\",\n      \"code\": 57,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"  ----  \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \"  ----- \",\n        \"      - \",\n        \"      - \",\n        \"     -  \",\n        \"  ---   \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"\\u0000\": {\n      \"ch\": \"\\u0000\",\n      \"code\": 0,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \" --  -- \",\n        \" -    - \",\n        \"        \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \"        \",\n        \" -    - \",\n        \" -    - \",\n        \" --  -- \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \" \": {\n      \"ch\": \" \",\n      \"code\": 32,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"!\": {\n      \"ch\": \"!\",\n      \"code\": 33,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"        \",\n        \"   -    \",\n        \"   -    \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"\\\"\": {\n      \"ch\": \"\\\"\",\n      \"code\": 34,\n      \"map\": [\n        \"        \",\n        \"  -  -  \",\n        \"  -  -  \",\n        \"  -  -  \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"#\": {\n      \"ch\": \"#\",\n      \"code\": 35,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"  -  -  \",\n        \"  -  -  \",\n        \"  -  -  \",\n        \" ------ \",\n        \"  -  -  \",\n        \"  -  -  \",\n        \" ------ \",\n        \"  -  -  \",\n        \"  -  -  \",\n        \"  -  -  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"$\": {\n      \"ch\": \"$\",\n      \"code\": 36,\n      \"map\": [\n        \"        \",\n        \"   -    \",\n        \"   -    \",\n        \" -----  \",\n        \"-  -  - \",\n        \"-  -    \",\n        \"-  -    \",\n        \" -----  \",\n        \"   -  - \",\n        \"   -  - \",\n        \"-  -  - \",\n        \" -----  \",\n        \"   -    \",\n        \"   -    \"\n      ]\n    },\n    \"%\": {\n      \"ch\": \"%\",\n      \"code\": 37,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \" --  -  \",\n        \"-  - -  \",\n        \" -- -   \",\n        \"    -   \",\n        \"   -    \",\n        \"   -    \",\n        \"  -     \",\n        \"  - --  \",\n        \" - -  - \",\n        \" -  --  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"&\": {\n      \"ch\": \"&\",\n      \"code\": 38,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"   --   \",\n        \"  -  -  \",\n        \"  -  -  \",\n        \"   --   \",\n        \"  --    \",\n        \" -  - - \",\n        \" -   -  \",\n        \" -   -  \",\n        \" -   -  \",\n        \"  --- - \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"'\": {\n      \"ch\": \"'\",\n      \"code\": 39,\n      \"map\": [\n        \"        \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"(\": {\n      \"ch\": \"(\",\n      \"code\": 40,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"    -   \",\n        \"   -    \",\n        \"  -     \",\n        \"  -     \",\n        \"  -     \",\n        \"  -     \",\n        \"  -     \",\n        \"  -     \",\n        \"   -    \",\n        \"    -   \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \")\": {\n      \"ch\": \")\",\n      \"code\": 41,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"  -     \",\n        \"   -    \",\n        \"    -   \",\n        \"    -   \",\n        \"    -   \",\n        \"    -   \",\n        \"    -   \",\n        \"    -   \",\n        \"   -    \",\n        \"  -     \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"*\": {\n      \"ch\": \"*\",\n      \"code\": 42,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"  -  -  \",\n        \"   --   \",\n        \" ------ \",\n        \"   --   \",\n        \"  -  -  \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"+\": {\n      \"ch\": \"+\",\n      \"code\": 43,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"   -    \",\n        \"   -    \",\n        \" -----  \",\n        \"   -    \",\n        \"   -    \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \",\": {\n      \"ch\": \",\",\n      \"code\": 44,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"   -    \",\n        \"   -    \",\n        \"  -     \",\n        \"        \"\n      ]\n    },\n    \"-\": {\n      \"ch\": \"-\",\n      \"code\": 45,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \" ------ \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \".\": {\n      \"ch\": \".\",\n      \"code\": 46,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"   -    \",\n        \"   -    \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"/\": {\n      \"ch\": \"/\",\n      \"code\": 47,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"     -  \",\n        \"     -  \",\n        \"    -   \",\n        \"    -   \",\n        \"   -    \",\n        \"   -    \",\n        \"  -     \",\n        \"  -     \",\n        \" -      \",\n        \" -      \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \":\": {\n      \"ch\": \":\",\n      \"code\": 58,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"   -    \",\n        \"   -    \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"   -    \",\n        \"   -    \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \";\": {\n      \"ch\": \";\",\n      \"code\": 59,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"   -    \",\n        \"   -    \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"   -    \",\n        \"   -    \",\n        \"  -     \",\n        \"        \"\n      ]\n    },\n    \"<\": {\n      \"ch\": \"<\",\n      \"code\": 60,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"     -  \",\n        \"    -   \",\n        \"   -    \",\n        \"  -     \",\n        \" -      \",\n        \"  -     \",\n        \"   -    \",\n        \"    -   \",\n        \"     -  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"=\": {\n      \"ch\": \"=\",\n      \"code\": 61,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \" ------ \",\n        \"        \",\n        \"        \",\n        \" ------ \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \">\": {\n      \"ch\": \">\",\n      \"code\": 62,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \" -      \",\n        \"  -     \",\n        \"   -    \",\n        \"    -   \",\n        \"     -  \",\n        \"    -   \",\n        \"   -    \",\n        \"  -     \",\n        \" -      \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"?\": {\n      \"ch\": \"?\",\n      \"code\": 63,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"  ----  \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \"     -  \",\n        \"    -   \",\n        \"    -   \",\n        \"        \",\n        \"    -   \",\n        \"    -   \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"@\": {\n      \"ch\": \"@\",\n      \"code\": 64,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \" -----  \",\n        \"-     - \",\n        \"-  ---- \",\n        \"- -   - \",\n        \"- -   - \",\n        \"- -   - \",\n        \"- -  -- \",\n        \"-  -- - \",\n        \"-       \",\n        \" ------ \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"A\": {\n      \"ch\": \"A\",\n      \"code\": 65,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"  ----  \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" ------ \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"B\": {\n      \"ch\": \"B\",\n      \"code\": 66,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \" -----  \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -----  \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"C\": {\n      \"ch\": \"C\",\n      \"code\": 67,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"  ----  \",\n        \" -    - \",\n        \" -    - \",\n        \" -      \",\n        \" -      \",\n        \" -      \",\n        \" -      \",\n        \" -    - \",\n        \" -    - \",\n        \"  ----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"D\": {\n      \"ch\": \"D\",\n      \"code\": 68,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \" ----   \",\n        \" -   -  \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -   -  \",\n        \" ----   \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"E\": {\n      \"ch\": \"E\",\n      \"code\": 69,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \" ------ \",\n        \" -      \",\n        \" -      \",\n        \" -      \",\n        \" ----   \",\n        \" -      \",\n        \" -      \",\n        \" -      \",\n        \" -      \",\n        \" ------ \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"F\": {\n      \"ch\": \"F\",\n      \"code\": 70,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \" ------ \",\n        \" -      \",\n        \" -      \",\n        \" -      \",\n        \" ----   \",\n        \" -      \",\n        \" -      \",\n        \" -      \",\n        \" -      \",\n        \" -      \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"G\": {\n      \"ch\": \"G\",\n      \"code\": 71,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"  ----  \",\n        \" -    - \",\n        \" -    - \",\n        \" -      \",\n        \" -      \",\n        \" -  --- \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \"  ----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"H\": {\n      \"ch\": \"H\",\n      \"code\": 72,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" ------ \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"I\": {\n      \"ch\": \"I\",\n      \"code\": 73,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"  ---   \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"  ---   \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"J\": {\n      \"ch\": \"J\",\n      \"code\": 74,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"    --- \",\n        \"     -  \",\n        \"     -  \",\n        \"     -  \",\n        \"     -  \",\n        \"     -  \",\n        \"     -  \",\n        \" -   -  \",\n        \" -   -  \",\n        \"  ---   \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"K\": {\n      \"ch\": \"K\",\n      \"code\": 75,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \" -    - \",\n        \" -   -  \",\n        \" -  -   \",\n        \" - -    \",\n        \" --     \",\n        \" --     \",\n        \" - -    \",\n        \" -  -   \",\n        \" -   -  \",\n        \" -    - \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"L\": {\n      \"ch\": \"L\",\n      \"code\": 76,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \" -      \",\n        \" -      \",\n        \" -      \",\n        \" -      \",\n        \" -      \",\n        \" -      \",\n        \" -      \",\n        \" -      \",\n        \" -      \",\n        \" ------ \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"M\": {\n      \"ch\": \"M\",\n      \"code\": 77,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"-     - \",\n        \"--   -- \",\n        \"- - - - \",\n        \"-  -  - \",\n        \"-  -  - \",\n        \"-     - \",\n        \"-     - \",\n        \"-     - \",\n        \"-     - \",\n        \"-     - \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"N\": {\n      \"ch\": \"N\",\n      \"code\": 78,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" --   - \",\n        \" - -  - \",\n        \" -  - - \",\n        \" -   -- \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"O\": {\n      \"ch\": \"O\",\n      \"code\": 79,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"  ----  \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \"  ----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"P\": {\n      \"ch\": \"P\",\n      \"code\": 80,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \" -----  \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -----  \",\n        \" -      \",\n        \" -      \",\n        \" -      \",\n        \" -      \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Q\": {\n      \"ch\": \"Q\",\n      \"code\": 81,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"  ----  \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -  - - \",\n        \"  ----  \",\n        \"      - \",\n        \"        \"\n      ]\n    },\n    \"R\": {\n      \"ch\": \"R\",\n      \"code\": 82,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \" -----  \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -----  \",\n        \" - -    \",\n        \" -  -   \",\n        \" -   -  \",\n        \" -    - \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"S\": {\n      \"ch\": \"S\",\n      \"code\": 83,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"  ----  \",\n        \" -    - \",\n        \" -      \",\n        \" -      \",\n        \"  ----  \",\n        \"      - \",\n        \"      - \",\n        \" -    - \",\n        \" -    - \",\n        \"  ----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"T\": {\n      \"ch\": \"T\",\n      \"code\": 84,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"------- \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"U\": {\n      \"ch\": \"U\",\n      \"code\": 85,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \"  ----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"V\": {\n      \"ch\": \"V\",\n      \"code\": 86,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \"  -  -  \",\n        \"  -  -  \",\n        \"  -  -  \",\n        \"   --   \",\n        \"   --   \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"W\": {\n      \"ch\": \"W\",\n      \"code\": 87,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"-     - \",\n        \"-     - \",\n        \"-     - \",\n        \"-     - \",\n        \"-     - \",\n        \"-  -  - \",\n        \"-  -  - \",\n        \"- - - - \",\n        \"--   -- \",\n        \"-     - \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"X\": {\n      \"ch\": \"X\",\n      \"code\": 88,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \" -    - \",\n        \" -    - \",\n        \"  -  -  \",\n        \"  -  -  \",\n        \"   --   \",\n        \"   --   \",\n        \"  -  -  \",\n        \"  -  -  \",\n        \" -    - \",\n        \" -    - \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Y\": {\n      \"ch\": \"Y\",\n      \"code\": 89,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"-     - \",\n        \"-     - \",\n        \" -   -  \",\n        \" -   -  \",\n        \"  - -   \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Z\": {\n      \"ch\": \"Z\",\n      \"code\": 90,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \" ------ \",\n        \"      - \",\n        \"      - \",\n        \"     -  \",\n        \"    -   \",\n        \"   -    \",\n        \"  -     \",\n        \" -      \",\n        \" -      \",\n        \" ------ \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"[\": {\n      \"ch\": \"[\",\n      \"code\": 91,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"  ---   \",\n        \"  -     \",\n        \"  -     \",\n        \"  -     \",\n        \"  -     \",\n        \"  -     \",\n        \"  -     \",\n        \"  -     \",\n        \"  -     \",\n        \"  ---   \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"\\\\\": {\n      \"ch\": \"\\\\\",\n      \"code\": 92,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \" -      \",\n        \" -      \",\n        \"  -     \",\n        \"  -     \",\n        \"   -    \",\n        \"   -    \",\n        \"    -   \",\n        \"    -   \",\n        \"     -  \",\n        \"     -  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"]\": {\n      \"ch\": \"]\",\n      \"code\": 93,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"  ---   \",\n        \"    -   \",\n        \"    -   \",\n        \"    -   \",\n        \"    -   \",\n        \"    -   \",\n        \"    -   \",\n        \"    -   \",\n        \"    -   \",\n        \"  ---   \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"^\": {\n      \"ch\": \"^\",\n      \"code\": 94,\n      \"map\": [\n        \"        \",\n        \"   -    \",\n        \"  - -   \",\n        \" -   -  \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"_\": {\n      \"ch\": \"_\",\n      \"code\": 95,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \" ------ \",\n        \"        \"\n      ]\n    },\n    \"`\": {\n      \"ch\": \"`\",\n      \"code\": 96,\n      \"map\": [\n        \"   -    \",\n        \"    -   \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"a\": {\n      \"ch\": \"a\",\n      \"code\": 97,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"  ----  \",\n        \"      - \",\n        \"  ----- \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \"  ----- \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"b\": {\n      \"ch\": \"b\",\n      \"code\": 98,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \" -      \",\n        \" -      \",\n        \" -      \",\n        \" -----  \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"c\": {\n      \"ch\": \"c\",\n      \"code\": 99,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"  ----  \",\n        \" -    - \",\n        \" -      \",\n        \" -      \",\n        \" -      \",\n        \" -    - \",\n        \"  ----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"d\": {\n      \"ch\": \"d\",\n      \"code\": 100,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"      - \",\n        \"      - \",\n        \"      - \",\n        \"  ----- \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \"  ----- \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"e\": {\n      \"ch\": \"e\",\n      \"code\": 101,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"  ----  \",\n        \" -    - \",\n        \" -    - \",\n        \" ------ \",\n        \" -      \",\n        \" -      \",\n        \"  ----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"f\": {\n      \"ch\": \"f\",\n      \"code\": 102,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"    --- \",\n        \"   -    \",\n        \"   -    \",\n        \" -----  \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"g\": {\n      \"ch\": \"g\",\n      \"code\": 103,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"  ----- \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \"  ----- \",\n        \"      - \",\n        \"  ----  \"\n      ]\n    },\n    \"h\": {\n      \"ch\": \"h\",\n      \"code\": 104,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \" -      \",\n        \" -      \",\n        \" -      \",\n        \" -----  \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"i\": {\n      \"ch\": \"i\",\n      \"code\": 105,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"   -    \",\n        \"   -    \",\n        \"        \",\n        \"  --    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"  ---   \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"j\": {\n      \"ch\": \"j\",\n      \"code\": 106,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"     -  \",\n        \"     -  \",\n        \"        \",\n        \"    --  \",\n        \"     -  \",\n        \"     -  \",\n        \"     -  \",\n        \"     -  \",\n        \"     -  \",\n        \" -   -  \",\n        \" -   -  \",\n        \"  ---   \"\n      ]\n    },\n    \"k\": {\n      \"ch\": \"k\",\n      \"code\": 107,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \" -      \",\n        \" -      \",\n        \" -      \",\n        \" -    - \",\n        \" -   -  \",\n        \" -  -   \",\n        \" ---    \",\n        \" -  -   \",\n        \" -   -  \",\n        \" -    - \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"l\": {\n      \"ch\": \"l\",\n      \"code\": 108,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"  --    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"  ---   \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"m\": {\n      \"ch\": \"m\",\n      \"code\": 109,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"------  \",\n        \"-  -  - \",\n        \"-  -  - \",\n        \"-  -  - \",\n        \"-  -  - \",\n        \"-  -  - \",\n        \"-  -  - \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"n\": {\n      \"ch\": \"n\",\n      \"code\": 110,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \" -----  \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"o\": {\n      \"ch\": \"o\",\n      \"code\": 111,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"  ----  \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \"  ----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"p\": {\n      \"ch\": \"p\",\n      \"code\": 112,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \" -----  \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -----  \",\n        \" -      \",\n        \" -      \"\n      ]\n    },\n    \"q\": {\n      \"ch\": \"q\",\n      \"code\": 113,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"  ----- \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \"  ----- \",\n        \"      - \",\n        \"      - \"\n      ]\n    },\n    \"r\": {\n      \"ch\": \"r\",\n      \"code\": 114,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \" - ---- \",\n        \" --     \",\n        \" -      \",\n        \" -      \",\n        \" -      \",\n        \" -      \",\n        \" -      \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"s\": {\n      \"ch\": \"s\",\n      \"code\": 115,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"  ----- \",\n        \" -      \",\n        \" -      \",\n        \"  ----  \",\n        \"      - \",\n        \"      - \",\n        \" -----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"t\": {\n      \"ch\": \"t\",\n      \"code\": 116,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \" -----  \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"    --- \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"u\": {\n      \"ch\": \"u\",\n      \"code\": 117,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \"  ----- \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"v\": {\n      \"ch\": \"v\",\n      \"code\": 118,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \"  -  -  \",\n        \"  -  -  \",\n        \"   --   \",\n        \"   --   \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"w\": {\n      \"ch\": \"w\",\n      \"code\": 119,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"-     - \",\n        \"-     - \",\n        \"-  -  - \",\n        \"-  -  - \",\n        \"-  -  - \",\n        \"-  -  - \",\n        \" -----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"x\": {\n      \"ch\": \"x\",\n      \"code\": 120,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \" -    - \",\n        \" -    - \",\n        \"  -  -  \",\n        \"   --   \",\n        \"  -  -  \",\n        \" -    - \",\n        \" -    - \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"y\": {\n      \"ch\": \"y\",\n      \"code\": 121,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \"  ----- \",\n        \"      - \",\n        \"  ----  \"\n      ]\n    },\n    \"z\": {\n      \"ch\": \"z\",\n      \"code\": 122,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \" ------ \",\n        \"     -  \",\n        \"    -   \",\n        \"   -    \",\n        \"  -     \",\n        \" -      \",\n        \" ------ \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"{\": {\n      \"ch\": \"{\",\n      \"code\": 123,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"    --  \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"  -     \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"    --  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"|\": {\n      \"ch\": \"|\",\n      \"code\": 124,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"}\": {\n      \"ch\": \"}\",\n      \"code\": 125,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"  --    \",\n        \"    -   \",\n        \"    -   \",\n        \"    -   \",\n        \"     -  \",\n        \"    -   \",\n        \"    -   \",\n        \"    -   \",\n        \"    -   \",\n        \"  --    \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"~\": {\n      \"ch\": \"~\",\n      \"code\": 126,\n      \"map\": [\n        \"        \",\n        \" --   - \",\n        \"-  -  - \",\n        \"-   --  \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \" \": {\n      \"ch\": \" \",\n      \"code\": 160,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"¡\": {\n      \"ch\": \"¡\",\n      \"code\": 161,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"   -    \",\n        \"   -    \",\n        \"        \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"¢\": {\n      \"ch\": \"¢\",\n      \"code\": 162,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"   -    \",\n        \"   -    \",\n        \" -----  \",\n        \"-  -  - \",\n        \"-  -    \",\n        \"-  -    \",\n        \"-  -    \",\n        \"-  -  - \",\n        \" -----  \",\n        \"   -    \",\n        \"   -    \"\n      ]\n    },\n    \"£\": {\n      \"ch\": \"£\",\n      \"code\": 163,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"   --   \",\n        \"  -  -  \",\n        \"  -     \",\n        \"  -     \",\n        \" ----   \",\n        \"  -     \",\n        \"  -     \",\n        \"  -     \",\n        \"  -   - \",\n        \" ------ \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"¤\": {\n      \"ch\": \"¤\",\n      \"code\": 164,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \" -   -  \",\n        \"  ---   \",\n        \" -   -  \",\n        \" -   -  \",\n        \" -   -  \",\n        \"  ---   \",\n        \" -   -  \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"¥\": {\n      \"ch\": \"¥\",\n      \"code\": 165,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"-     - \",\n        \"-     - \",\n        \" -   -  \",\n        \"  - -   \",\n        \"   -    \",\n        \" -----  \",\n        \"   -    \",\n        \" -----  \",\n        \"   -    \",\n        \"   -    \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"¦\": {\n      \"ch\": \"¦\",\n      \"code\": 166,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"        \",\n        \"        \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"§\": {\n      \"ch\": \"§\",\n      \"code\": 167,\n      \"map\": [\n        \"        \",\n        \"  ---   \",\n        \" -   -  \",\n        \" -      \",\n        \"  --    \",\n        \" -  -   \",\n        \" -   -  \",\n        \" -   -  \",\n        \"  -  -  \",\n        \"   --   \",\n        \"     -  \",\n        \" -   -  \",\n        \"  ---   \",\n        \"        \"\n      ]\n    },\n    \"¨\": {\n      \"ch\": \"¨\",\n      \"code\": 168,\n      \"map\": [\n        \"  -  -  \",\n        \"  -  -  \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"©\": {\n      \"ch\": \"©\",\n      \"code\": 169,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \" ------ \",\n        \"-      -\",\n        \"-  --  -\",\n        \"- -  - -\",\n        \"- -    -\",\n        \"- -  - -\",\n        \"-  --  -\",\n        \"-      -\",\n        \" ------ \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ª\": {\n      \"ch\": \"ª\",\n      \"code\": 170,\n      \"map\": [\n        \"        \",\n        \"  ---   \",\n        \"     -  \",\n        \"  ----  \",\n        \" -   -  \",\n        \"  ----  \",\n        \"        \",\n        \" -----  \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"«\": {\n      \"ch\": \"«\",\n      \"code\": 171,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"   -  - \",\n        \"  -  -  \",\n        \" -  -   \",\n        \"-  -    \",\n        \" -  -   \",\n        \"  -  -  \",\n        \"   -  - \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"¬\": {\n      \"ch\": \"¬\",\n      \"code\": 172,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \" ------ \",\n        \"      - \",\n        \"      - \",\n        \"      - \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"­\": {\n      \"ch\": \"­\",\n      \"code\": 173,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"  ----  \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"®\": {\n      \"ch\": \"®\",\n      \"code\": 174,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \" ------ \",\n        \"-      -\",\n        \"- ---  -\",\n        \"- -  - -\",\n        \"- ---  -\",\n        \"- - -  -\",\n        \"- -  - -\",\n        \"-      -\",\n        \" ------ \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"¯\": {\n      \"ch\": \"¯\",\n      \"code\": 175,\n      \"map\": [\n        \"  ----  \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"°\": {\n      \"ch\": \"°\",\n      \"code\": 176,\n      \"map\": [\n        \"        \",\n        \"   --   \",\n        \"  -  -  \",\n        \"  -  -  \",\n        \"   --   \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"±\": {\n      \"ch\": \"±\",\n      \"code\": 177,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"   -    \",\n        \"   -    \",\n        \" -----  \",\n        \"   -    \",\n        \"   -    \",\n        \"        \",\n        \" -----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"²\": {\n      \"ch\": \"²\",\n      \"code\": 178,\n      \"map\": [\n        \"        \",\n        \"   --   \",\n        \"  -  -  \",\n        \"    -   \",\n        \"   -    \",\n        \"  ----  \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"³\": {\n      \"ch\": \"³\",\n      \"code\": 179,\n      \"map\": [\n        \"        \",\n        \"  ---   \",\n        \"     -  \",\n        \"   --   \",\n        \"     -  \",\n        \"  ---   \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"´\": {\n      \"ch\": \"´\",\n      \"code\": 180,\n      \"map\": [\n        \"    -   \",\n        \"   -    \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"µ\": {\n      \"ch\": \"µ\",\n      \"code\": 181,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -   -- \",\n        \" ---- - \",\n        \" -      \",\n        \" -      \"\n      ]\n    },\n    \"¶\": {\n      \"ch\": \"¶\",\n      \"code\": 182,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \" ------ \",\n        \"-  -  - \",\n        \"-  -  - \",\n        \"-  -  - \",\n        \"-  -  - \",\n        \" ---  - \",\n        \"   -  - \",\n        \"   -  - \",\n        \"   -  - \",\n        \"   -  - \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"·\": {\n      \"ch\": \"·\",\n      \"code\": 183,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"   -    \",\n        \"   -    \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"¸\": {\n      \"ch\": \"¸\",\n      \"code\": 184,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"   -    \",\n        \"   -    \",\n        \"  -     \"\n      ]\n    },\n    \"¹\": {\n      \"ch\": \"¹\",\n      \"code\": 185,\n      \"map\": [\n        \"        \",\n        \"   -    \",\n        \"  --    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"º\": {\n      \"ch\": \"º\",\n      \"code\": 186,\n      \"map\": [\n        \"        \",\n        \"  ---   \",\n        \" -   -  \",\n        \" -   -  \",\n        \" -   -  \",\n        \"  ---   \",\n        \"        \",\n        \" -----  \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"»\": {\n      \"ch\": \"»\",\n      \"code\": 187,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"-  -    \",\n        \" -  -   \",\n        \"  -  -  \",\n        \"   -  - \",\n        \"  -  -  \",\n        \" -  -   \",\n        \"-  -    \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"¼\": {\n      \"ch\": \"¼\",\n      \"code\": 188,\n      \"map\": [\n        \"  -     \",\n        \" --     \",\n        \"  -     \",\n        \"  -   - \",\n        \"  -  -  \",\n        \"    -   \",\n        \"   -    \",\n        \"  -   - \",\n        \" -   -- \",\n        \"-   - - \",\n        \"   ---- \",\n        \"      - \",\n        \"      - \",\n        \"        \"\n      ]\n    },\n    \"½\": {\n      \"ch\": \"½\",\n      \"code\": 189,\n      \"map\": [\n        \"  -     \",\n        \" --     \",\n        \"  -     \",\n        \"  -   - \",\n        \"  -  -  \",\n        \"    -   \",\n        \"   -    \",\n        \"  -     \",\n        \" -  --  \",\n        \"-  -  - \",\n        \"     -  \",\n        \"    -   \",\n        \"   ---- \",\n        \"        \"\n      ]\n    },\n    \"¾\": {\n      \"ch\": \"¾\",\n      \"code\": 190,\n      \"map\": [\n        \"---     \",\n        \"   -    \",\n        \" --     \",\n        \"   -  - \",\n        \"---  -  \",\n        \"    -   \",\n        \"   -    \",\n        \"  -   - \",\n        \" -   -- \",\n        \"-   - - \",\n        \"   ---- \",\n        \"      - \",\n        \"      - \",\n        \"        \"\n      ]\n    },\n    \"¿\": {\n      \"ch\": \"¿\",\n      \"code\": 191,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"   -    \",\n        \"   -    \",\n        \"        \",\n        \"   -    \",\n        \"   -    \",\n        \"  -     \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \"  ----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"À\": {\n      \"ch\": \"À\",\n      \"code\": 192,\n      \"map\": [\n        \"   -    \",\n        \"    -   \",\n        \"        \",\n        \"  ----  \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" ------ \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Á\": {\n      \"ch\": \"Á\",\n      \"code\": 193,\n      \"map\": [\n        \"    -   \",\n        \"   -    \",\n        \"        \",\n        \"  ----  \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" ------ \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Â\": {\n      \"ch\": \"Â\",\n      \"code\": 194,\n      \"map\": [\n        \"   --   \",\n        \"  -  -  \",\n        \"        \",\n        \"  ----  \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" ------ \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ã\": {\n      \"ch\": \"Ã\",\n      \"code\": 195,\n      \"map\": [\n        \"  --  - \",\n        \" -  --  \",\n        \"        \",\n        \"  ----  \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" ------ \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ä\": {\n      \"ch\": \"Ä\",\n      \"code\": 196,\n      \"map\": [\n        \"  -  -  \",\n        \"  -  -  \",\n        \"        \",\n        \"  ----  \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" ------ \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Å\": {\n      \"ch\": \"Å\",\n      \"code\": 197,\n      \"map\": [\n        \"   --   \",\n        \"  -  -  \",\n        \"   --   \",\n        \"  ----  \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" ------ \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Æ\": {\n      \"ch\": \"Æ\",\n      \"code\": 198,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \" ------ \",\n        \"-  -    \",\n        \"-  -    \",\n        \"-  -    \",\n        \"------  \",\n        \"-  -    \",\n        \"-  -    \",\n        \"-  -    \",\n        \"-  -    \",\n        \"-  ---- \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ç\": {\n      \"ch\": \"Ç\",\n      \"code\": 199,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"  ----  \",\n        \" -    - \",\n        \" -    - \",\n        \" -      \",\n        \" -      \",\n        \" -      \",\n        \" -      \",\n        \" -    - \",\n        \" -    - \",\n        \"  ----  \",\n        \"   -    \",\n        \"  -     \"\n      ]\n    },\n    \"È\": {\n      \"ch\": \"È\",\n      \"code\": 200,\n      \"map\": [\n        \"   -    \",\n        \"    -   \",\n        \"        \",\n        \" ------ \",\n        \" -      \",\n        \" -      \",\n        \" -      \",\n        \" ----   \",\n        \" -      \",\n        \" -      \",\n        \" -      \",\n        \" ------ \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"É\": {\n      \"ch\": \"É\",\n      \"code\": 201,\n      \"map\": [\n        \"    -   \",\n        \"   -    \",\n        \"        \",\n        \" ------ \",\n        \" -      \",\n        \" -      \",\n        \" -      \",\n        \" ----   \",\n        \" -      \",\n        \" -      \",\n        \" -      \",\n        \" ------ \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ê\": {\n      \"ch\": \"Ê\",\n      \"code\": 202,\n      \"map\": [\n        \"   --   \",\n        \"  -  -  \",\n        \"        \",\n        \" ------ \",\n        \" -      \",\n        \" -      \",\n        \" -      \",\n        \" ----   \",\n        \" -      \",\n        \" -      \",\n        \" -      \",\n        \" ------ \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ë\": {\n      \"ch\": \"Ë\",\n      \"code\": 203,\n      \"map\": [\n        \"  -  -  \",\n        \"  -  -  \",\n        \"        \",\n        \" ------ \",\n        \" -      \",\n        \" -      \",\n        \" -      \",\n        \" ----   \",\n        \" -      \",\n        \" -      \",\n        \" -      \",\n        \" ------ \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ì\": {\n      \"ch\": \"Ì\",\n      \"code\": 204,\n      \"map\": [\n        \"  -     \",\n        \"   -    \",\n        \"        \",\n        \"  ---   \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"  ---   \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Í\": {\n      \"ch\": \"Í\",\n      \"code\": 205,\n      \"map\": [\n        \"    -   \",\n        \"   -    \",\n        \"        \",\n        \"  ---   \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"  ---   \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Î\": {\n      \"ch\": \"Î\",\n      \"code\": 206,\n      \"map\": [\n        \"   --   \",\n        \"  -  -  \",\n        \"        \",\n        \"  ---   \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"  ---   \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ï\": {\n      \"ch\": \"Ï\",\n      \"code\": 207,\n      \"map\": [\n        \" -   -  \",\n        \" -   -  \",\n        \"        \",\n        \"  ---   \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"  ---   \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ð\": {\n      \"ch\": \"Ð\",\n      \"code\": 208,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \" ----   \",\n        \" -   -  \",\n        \" -    - \",\n        \" -    - \",\n        \"----  - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -   -  \",\n        \" ----   \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ñ\": {\n      \"ch\": \"Ñ\",\n      \"code\": 209,\n      \"map\": [\n        \"  --  - \",\n        \" -  --  \",\n        \"        \",\n        \" -    - \",\n        \" -    - \",\n        \" --   - \",\n        \" - -  - \",\n        \" -  - - \",\n        \" -   -- \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ò\": {\n      \"ch\": \"Ò\",\n      \"code\": 210,\n      \"map\": [\n        \"   -    \",\n        \"    -   \",\n        \"        \",\n        \"  ----  \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \"  ----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ó\": {\n      \"ch\": \"Ó\",\n      \"code\": 211,\n      \"map\": [\n        \"    -   \",\n        \"   -    \",\n        \"        \",\n        \"  ----  \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \"  ----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ô\": {\n      \"ch\": \"Ô\",\n      \"code\": 212,\n      \"map\": [\n        \"   --   \",\n        \"  -  -  \",\n        \"        \",\n        \"  ----  \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \"  ----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Õ\": {\n      \"ch\": \"Õ\",\n      \"code\": 213,\n      \"map\": [\n        \"  --  - \",\n        \" -  --  \",\n        \"        \",\n        \"  ----  \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \"  ----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ö\": {\n      \"ch\": \"Ö\",\n      \"code\": 214,\n      \"map\": [\n        \"  -  -  \",\n        \"  -  -  \",\n        \"        \",\n        \"  ----  \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \"  ----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"×\": {\n      \"ch\": \"×\",\n      \"code\": 215,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \" -    - \",\n        \"  -  -  \",\n        \"   --   \",\n        \"   --   \",\n        \"  -  -  \",\n        \" -    - \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ø\": {\n      \"ch\": \"Ø\",\n      \"code\": 216,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"  ----  \",\n        \" -    --\",\n        \" -    - \",\n        \" -   -- \",\n        \" -  - - \",\n        \" - -  - \",\n        \" --   - \",\n        \" -    - \",\n        \"--    - \",\n        \"  ----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ù\": {\n      \"ch\": \"Ù\",\n      \"code\": 217,\n      \"map\": [\n        \"   -    \",\n        \"    -   \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \"  ----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ú\": {\n      \"ch\": \"Ú\",\n      \"code\": 218,\n      \"map\": [\n        \"    -   \",\n        \"   -    \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \"  ----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Û\": {\n      \"ch\": \"Û\",\n      \"code\": 219,\n      \"map\": [\n        \"   --   \",\n        \"  -  -  \",\n        \"        \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \"  ----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ü\": {\n      \"ch\": \"Ü\",\n      \"code\": 220,\n      \"map\": [\n        \"  -  -  \",\n        \"  -  -  \",\n        \"        \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \"  ----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ý\": {\n      \"ch\": \"Ý\",\n      \"code\": 221,\n      \"map\": [\n        \"    -   \",\n        \"   -    \",\n        \"-     - \",\n        \"-     - \",\n        \" -   -  \",\n        \" -   -  \",\n        \"  - -   \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Þ\": {\n      \"ch\": \"Þ\",\n      \"code\": 222,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \" -      \",\n        \" -      \",\n        \" -----  \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -----  \",\n        \" -      \",\n        \" -      \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ß\": {\n      \"ch\": \"ß\",\n      \"code\": 223,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"  ---   \",\n        \" -   -  \",\n        \" -   -  \",\n        \" -  -   \",\n        \" -----  \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" --   - \",\n        \" - ---  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"à\": {\n      \"ch\": \"à\",\n      \"code\": 224,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"   -    \",\n        \"    -   \",\n        \"        \",\n        \"  ----  \",\n        \"      - \",\n        \"  ----- \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \"  ----- \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"á\": {\n      \"ch\": \"á\",\n      \"code\": 225,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"    -   \",\n        \"   -    \",\n        \"        \",\n        \"  ----  \",\n        \"      - \",\n        \"  ----- \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \"  ----- \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"â\": {\n      \"ch\": \"â\",\n      \"code\": 226,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"   --   \",\n        \"  -  -  \",\n        \"        \",\n        \"  ----  \",\n        \"      - \",\n        \"  ----- \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \"  ----- \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ã\": {\n      \"ch\": \"ã\",\n      \"code\": 227,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"  --  - \",\n        \" -  --  \",\n        \"        \",\n        \"  ----  \",\n        \"      - \",\n        \"  ----- \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \"  ----- \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ä\": {\n      \"ch\": \"ä\",\n      \"code\": 228,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"  -  -  \",\n        \"  -  -  \",\n        \"        \",\n        \"  ----  \",\n        \"      - \",\n        \"  ----- \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \"  ----- \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"å\": {\n      \"ch\": \"å\",\n      \"code\": 229,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"   --   \",\n        \"  -  -  \",\n        \"   --   \",\n        \"  ----  \",\n        \"      - \",\n        \"  ----- \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \"  ----- \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"æ\": {\n      \"ch\": \"æ\",\n      \"code\": 230,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \" -- --  \",\n        \"   -  - \",\n        \" ---  - \",\n        \"-  ---- \",\n        \"-  -    \",\n        \"-  -    \",\n        \" -- --  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ç\": {\n      \"ch\": \"ç\",\n      \"code\": 231,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"  ----  \",\n        \" -    - \",\n        \" -      \",\n        \" -      \",\n        \" -      \",\n        \" -    - \",\n        \"  ----  \",\n        \"   -    \",\n        \"  -     \"\n      ]\n    },\n    \"è\": {\n      \"ch\": \"è\",\n      \"code\": 232,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"   -    \",\n        \"    -   \",\n        \"        \",\n        \"  ----  \",\n        \" -    - \",\n        \" -    - \",\n        \" ------ \",\n        \" -      \",\n        \" -      \",\n        \"  ----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"é\": {\n      \"ch\": \"é\",\n      \"code\": 233,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"    -   \",\n        \"   -    \",\n        \"        \",\n        \"  ----  \",\n        \" -    - \",\n        \" -    - \",\n        \" ------ \",\n        \" -      \",\n        \" -      \",\n        \"  ----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ê\": {\n      \"ch\": \"ê\",\n      \"code\": 234,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"   --   \",\n        \"  -  -  \",\n        \"        \",\n        \"  ----  \",\n        \" -    - \",\n        \" -    - \",\n        \" ------ \",\n        \" -      \",\n        \" -      \",\n        \"  ----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ë\": {\n      \"ch\": \"ë\",\n      \"code\": 235,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"  -  -  \",\n        \"  -  -  \",\n        \"        \",\n        \"  ----  \",\n        \" -    - \",\n        \" -    - \",\n        \" ------ \",\n        \" -      \",\n        \" -      \",\n        \"  ----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ì\": {\n      \"ch\": \"ì\",\n      \"code\": 236,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"  -     \",\n        \"   -    \",\n        \"        \",\n        \"  --    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"  ---   \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"í\": {\n      \"ch\": \"í\",\n      \"code\": 237,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"    -   \",\n        \"   -    \",\n        \"        \",\n        \"  --    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"  ---   \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"î\": {\n      \"ch\": \"î\",\n      \"code\": 238,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"  --    \",\n        \" -  -   \",\n        \"        \",\n        \"  --    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"  ---   \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ï\": {\n      \"ch\": \"ï\",\n      \"code\": 239,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \" -  -   \",\n        \" -  -   \",\n        \"        \",\n        \"  --    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"  ---   \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ð\": {\n      \"ch\": \"ð\",\n      \"code\": 240,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"  - -   \",\n        \"   -    \",\n        \"  - -   \",\n        \"  ----  \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \"  ----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ñ\": {\n      \"ch\": \"ñ\",\n      \"code\": 241,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"  --  - \",\n        \" -  --  \",\n        \"        \",\n        \" -----  \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ò\": {\n      \"ch\": \"ò\",\n      \"code\": 242,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"   -    \",\n        \"    -   \",\n        \"        \",\n        \"  ----  \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \"  ----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ó\": {\n      \"ch\": \"ó\",\n      \"code\": 243,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"    -   \",\n        \"   -    \",\n        \"        \",\n        \"  ----  \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \"  ----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ô\": {\n      \"ch\": \"ô\",\n      \"code\": 244,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"   --   \",\n        \"  -  -  \",\n        \"        \",\n        \"  ----  \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \"  ----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"õ\": {\n      \"ch\": \"õ\",\n      \"code\": 245,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"  --  - \",\n        \" -  --  \",\n        \"        \",\n        \"  ----  \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \"  ----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ö\": {\n      \"ch\": \"ö\",\n      \"code\": 246,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"  -  -  \",\n        \"  -  -  \",\n        \"        \",\n        \"  ----  \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \"  ----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"÷\": {\n      \"ch\": \"÷\",\n      \"code\": 247,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"   -    \",\n        \"   -    \",\n        \"        \",\n        \" -----  \",\n        \"        \",\n        \"   -    \",\n        \"   -    \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ø\": {\n      \"ch\": \"ø\",\n      \"code\": 248,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"      - \",\n        \"  ----  \",\n        \" -   -- \",\n        \" -  - - \",\n        \" - -  - \",\n        \" --   - \",\n        \" -    - \",\n        \"- ----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ù\": {\n      \"ch\": \"ù\",\n      \"code\": 249,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"   -    \",\n        \"    -   \",\n        \"        \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \"  ----- \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ú\": {\n      \"ch\": \"ú\",\n      \"code\": 250,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"    -   \",\n        \"   -    \",\n        \"        \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \"  ----- \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"û\": {\n      \"ch\": \"û\",\n      \"code\": 251,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"   --   \",\n        \"  -  -  \",\n        \"        \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \"  ----- \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ü\": {\n      \"ch\": \"ü\",\n      \"code\": 252,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"  -  -  \",\n        \"  -  -  \",\n        \"        \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \"  ----- \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ý\": {\n      \"ch\": \"ý\",\n      \"code\": 253,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"    -   \",\n        \"   -    \",\n        \"        \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \"  ----- \",\n        \"      - \",\n        \"  ----  \"\n      ]\n    },\n    \"þ\": {\n      \"ch\": \"þ\",\n      \"code\": 254,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \" -      \",\n        \" -      \",\n        \" -      \",\n        \" -----  \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -----  \",\n        \" -      \",\n        \" -      \"\n      ]\n    },\n    \"ÿ\": {\n      \"ch\": \"ÿ\",\n      \"code\": 255,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"  -  -  \",\n        \"  -  -  \",\n        \"        \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \"  ----- \",\n        \"      - \",\n        \"  ----  \"\n      ]\n    },\n    \"Ā\": {\n      \"ch\": \"Ā\",\n      \"code\": 256,\n      \"map\": [\n        \"  ----  \",\n        \"        \",\n        \"  ----  \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" ------ \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ā\": {\n      \"ch\": \"ā\",\n      \"code\": 257,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"  ----  \",\n        \"        \",\n        \"  ----  \",\n        \"      - \",\n        \"  ----- \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \"  ----- \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ă\": {\n      \"ch\": \"Ă\",\n      \"code\": 258,\n      \"map\": [\n        \"  -  -  \",\n        \"   --   \",\n        \"        \",\n        \"  ----  \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" ------ \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ă\": {\n      \"ch\": \"ă\",\n      \"code\": 259,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"  -  -  \",\n        \"   --   \",\n        \"        \",\n        \"  ----  \",\n        \"      - \",\n        \"  ----- \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \"  ----- \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ą\": {\n      \"ch\": \"Ą\",\n      \"code\": 260,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"  ----  \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" ------ \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \"     -  \",\n        \"      --\"\n      ]\n    },\n    \"ą\": {\n      \"ch\": \"ą\",\n      \"code\": 261,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"  ----  \",\n        \"      - \",\n        \"  ----- \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \"  ----- \",\n        \"     -  \",\n        \"      --\"\n      ]\n    },\n    \"Ć\": {\n      \"ch\": \"Ć\",\n      \"code\": 262,\n      \"map\": [\n        \"    -   \",\n        \"   -    \",\n        \"        \",\n        \"  ----  \",\n        \" -    - \",\n        \" -    - \",\n        \" -      \",\n        \" -      \",\n        \" -      \",\n        \" -    - \",\n        \" -    - \",\n        \"  ----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ć\": {\n      \"ch\": \"ć\",\n      \"code\": 263,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"    -   \",\n        \"   -    \",\n        \"        \",\n        \"  ----  \",\n        \" -    - \",\n        \" -      \",\n        \" -      \",\n        \" -      \",\n        \" -    - \",\n        \"  ----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ĉ\": {\n      \"ch\": \"Ĉ\",\n      \"code\": 264,\n      \"map\": [\n        \"   --   \",\n        \"  -  -  \",\n        \"        \",\n        \"  ----  \",\n        \" -    - \",\n        \" -    - \",\n        \" -      \",\n        \" -      \",\n        \" -      \",\n        \" -    - \",\n        \" -    - \",\n        \"  ----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ĉ\": {\n      \"ch\": \"ĉ\",\n      \"code\": 265,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"   --   \",\n        \"  -  -  \",\n        \"        \",\n        \"  ----  \",\n        \" -    - \",\n        \" -      \",\n        \" -      \",\n        \" -      \",\n        \" -    - \",\n        \"  ----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ċ\": {\n      \"ch\": \"Ċ\",\n      \"code\": 266,\n      \"map\": [\n        \"   -    \",\n        \"   -    \",\n        \"        \",\n        \"  ----  \",\n        \" -    - \",\n        \" -    - \",\n        \" -      \",\n        \" -      \",\n        \" -      \",\n        \" -    - \",\n        \" -    - \",\n        \"  ----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ċ\": {\n      \"ch\": \"ċ\",\n      \"code\": 267,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"   -    \",\n        \"   -    \",\n        \"        \",\n        \"  ----  \",\n        \" -    - \",\n        \" -      \",\n        \" -      \",\n        \" -      \",\n        \" -    - \",\n        \"  ----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Č\": {\n      \"ch\": \"Č\",\n      \"code\": 268,\n      \"map\": [\n        \"  -  -  \",\n        \"   --   \",\n        \"        \",\n        \"  ----  \",\n        \" -    - \",\n        \" -    - \",\n        \" -      \",\n        \" -      \",\n        \" -      \",\n        \" -    - \",\n        \" -    - \",\n        \"  ----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"č\": {\n      \"ch\": \"č\",\n      \"code\": 269,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"  -  -  \",\n        \"   --   \",\n        \"        \",\n        \"  ----  \",\n        \" -    - \",\n        \" -      \",\n        \" -      \",\n        \" -      \",\n        \" -    - \",\n        \"  ----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ď\": {\n      \"ch\": \"Ď\",\n      \"code\": 270,\n      \"map\": [\n        \"  -  -  \",\n        \"   --   \",\n        \"        \",\n        \" ----   \",\n        \" -   -  \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -   -  \",\n        \" ----   \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ď\": {\n      \"ch\": \"ď\",\n      \"code\": 271,\n      \"map\": [\n        \"  -  -  \",\n        \"   --   \",\n        \"      - \",\n        \"      - \",\n        \"      - \",\n        \"  ----- \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \"  ----- \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Đ\": {\n      \"ch\": \"Đ\",\n      \"code\": 272,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \" ----   \",\n        \" -   -  \",\n        \" -    - \",\n        \" -    - \",\n        \"----  - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -   -  \",\n        \" ----   \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"đ\": {\n      \"ch\": \"đ\",\n      \"code\": 273,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"      - \",\n        \"    ----\",\n        \"      - \",\n        \"  ----- \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \"  ----- \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ē\": {\n      \"ch\": \"Ē\",\n      \"code\": 274,\n      \"map\": [\n        \"  ----  \",\n        \"        \",\n        \" ------ \",\n        \" -      \",\n        \" -      \",\n        \" -      \",\n        \" ----   \",\n        \" -      \",\n        \" -      \",\n        \" -      \",\n        \" -      \",\n        \" ------ \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ē\": {\n      \"ch\": \"ē\",\n      \"code\": 275,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"  ----  \",\n        \"        \",\n        \"  ----  \",\n        \" -    - \",\n        \" -    - \",\n        \" ------ \",\n        \" -      \",\n        \" -      \",\n        \"  ----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ĕ\": {\n      \"ch\": \"Ĕ\",\n      \"code\": 276,\n      \"map\": [\n        \"  -  -  \",\n        \"   --   \",\n        \"        \",\n        \" ------ \",\n        \" -      \",\n        \" -      \",\n        \" -      \",\n        \" ----   \",\n        \" -      \",\n        \" -      \",\n        \" -      \",\n        \" ------ \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ĕ\": {\n      \"ch\": \"ĕ\",\n      \"code\": 277,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"  -  -  \",\n        \"   --   \",\n        \"        \",\n        \"  ----  \",\n        \" -    - \",\n        \" -    - \",\n        \" ------ \",\n        \" -      \",\n        \" -      \",\n        \"  ----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ė\": {\n      \"ch\": \"Ė\",\n      \"code\": 278,\n      \"map\": [\n        \"   -    \",\n        \"   -    \",\n        \"        \",\n        \" ------ \",\n        \" -      \",\n        \" -      \",\n        \" -      \",\n        \" ----   \",\n        \" -      \",\n        \" -      \",\n        \" -      \",\n        \" ------ \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ė\": {\n      \"ch\": \"ė\",\n      \"code\": 279,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"   -    \",\n        \"   -    \",\n        \"        \",\n        \"  ----  \",\n        \" -    - \",\n        \" -    - \",\n        \" ------ \",\n        \" -      \",\n        \" -      \",\n        \"  ----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ę\": {\n      \"ch\": \"Ę\",\n      \"code\": 280,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \" ------ \",\n        \" -      \",\n        \" -      \",\n        \" -      \",\n        \" ----   \",\n        \" -      \",\n        \" -      \",\n        \" -      \",\n        \" -      \",\n        \" ------ \",\n        \"     -  \",\n        \"      --\"\n      ]\n    },\n    \"ę\": {\n      \"ch\": \"ę\",\n      \"code\": 281,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"  ----  \",\n        \" -    - \",\n        \" -    - \",\n        \" ------ \",\n        \" -      \",\n        \" -      \",\n        \"  ----  \",\n        \"    -   \",\n        \"     -- \"\n      ]\n    },\n    \"Ě\": {\n      \"ch\": \"Ě\",\n      \"code\": 282,\n      \"map\": [\n        \"  -  -  \",\n        \"   --   \",\n        \"        \",\n        \" ------ \",\n        \" -      \",\n        \" -      \",\n        \" -      \",\n        \" ----   \",\n        \" -      \",\n        \" -      \",\n        \" -      \",\n        \" ------ \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ě\": {\n      \"ch\": \"ě\",\n      \"code\": 283,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"  -  -  \",\n        \"   --   \",\n        \"        \",\n        \"  ----  \",\n        \" -    - \",\n        \" -    - \",\n        \" ------ \",\n        \" -      \",\n        \" -      \",\n        \"  ----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ĝ\": {\n      \"ch\": \"Ĝ\",\n      \"code\": 284,\n      \"map\": [\n        \"   --   \",\n        \"  -  -  \",\n        \"        \",\n        \"  ----  \",\n        \" -    - \",\n        \" -    - \",\n        \" -      \",\n        \" -  --- \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \"  ----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ĝ\": {\n      \"ch\": \"ĝ\",\n      \"code\": 285,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"   --   \",\n        \"  -  -  \",\n        \"        \",\n        \"  ----- \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \"  ----- \",\n        \"      - \",\n        \"  ----  \"\n      ]\n    },\n    \"Ğ\": {\n      \"ch\": \"Ğ\",\n      \"code\": 286,\n      \"map\": [\n        \"  -  -  \",\n        \"   --   \",\n        \"        \",\n        \"  ----  \",\n        \" -    - \",\n        \" -    - \",\n        \" -      \",\n        \" -  --- \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \"  ----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ğ\": {\n      \"ch\": \"ğ\",\n      \"code\": 287,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"  -  -  \",\n        \"   --   \",\n        \"        \",\n        \"  ----- \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \"  ----- \",\n        \"      - \",\n        \"  ----  \"\n      ]\n    },\n    \"Ġ\": {\n      \"ch\": \"Ġ\",\n      \"code\": 288,\n      \"map\": [\n        \"   -    \",\n        \"   -    \",\n        \"        \",\n        \"  ----  \",\n        \" -    - \",\n        \" -    - \",\n        \" -      \",\n        \" -  --- \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \"  ----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ġ\": {\n      \"ch\": \"ġ\",\n      \"code\": 289,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"    -   \",\n        \"    -   \",\n        \"        \",\n        \"  ----- \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \"  ----- \",\n        \"      - \",\n        \"  ----  \"\n      ]\n    },\n    \"Ģ\": {\n      \"ch\": \"Ģ\",\n      \"code\": 290,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"  ----  \",\n        \" -    - \",\n        \" -    - \",\n        \" -      \",\n        \" -      \",\n        \" -  --- \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \"  ----  \",\n        \"   -    \",\n        \"  -     \"\n      ]\n    },\n    \"ģ\": {\n      \"ch\": \"ģ\",\n      \"code\": 291,\n      \"map\": [\n        \"        \",\n        \"     -  \",\n        \"    -   \",\n        \"    -   \",\n        \"        \",\n        \"  ----- \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \"  ----- \",\n        \"      - \",\n        \"  ----  \"\n      ]\n    },\n    \"Ĥ\": {\n      \"ch\": \"Ĥ\",\n      \"code\": 292,\n      \"map\": [\n        \"   --   \",\n        \"  -  -  \",\n        \"        \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" ------ \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ĥ\": {\n      \"ch\": \"ĥ\",\n      \"code\": 293,\n      \"map\": [\n        \"    --  \",\n        \"   -  - \",\n        \" -      \",\n        \" -      \",\n        \" -      \",\n        \" -----  \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ħ\": {\n      \"ch\": \"Ħ\",\n      \"code\": 294,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \" -    - \",\n        \"--------\",\n        \" -    - \",\n        \" -    - \",\n        \" ------ \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ħ\": {\n      \"ch\": \"ħ\",\n      \"code\": 295,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \" -      \",\n        \"-----   \",\n        \" -      \",\n        \" -----  \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ĩ\": {\n      \"ch\": \"Ĩ\",\n      \"code\": 296,\n      \"map\": [\n        \"  --  - \",\n        \" -  --  \",\n        \"        \",\n        \"  ---   \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"  ---   \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ĩ\": {\n      \"ch\": \"ĩ\",\n      \"code\": 297,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"  -- -  \",\n        \" - --   \",\n        \"        \",\n        \"  --    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"  ---   \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ī\": {\n      \"ch\": \"Ī\",\n      \"code\": 298,\n      \"map\": [\n        \" -----  \",\n        \"        \",\n        \"  ---   \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"  ---   \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ī\": {\n      \"ch\": \"ī\",\n      \"code\": 299,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \" ----   \",\n        \"        \",\n        \"  --    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"  ---   \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ĭ\": {\n      \"ch\": \"Ĭ\",\n      \"code\": 300,\n      \"map\": [\n        \"  -  -  \",\n        \"   --   \",\n        \"        \",\n        \"  ---   \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"  ---   \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ĭ\": {\n      \"ch\": \"ĭ\",\n      \"code\": 301,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \" -  -   \",\n        \"  --    \",\n        \"        \",\n        \"  --    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"  ---   \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Į\": {\n      \"ch\": \"Į\",\n      \"code\": 302,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"  ---   \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"  ---   \",\n        \"   -    \",\n        \"    --  \"\n      ]\n    },\n    \"į\": {\n      \"ch\": \"į\",\n      \"code\": 303,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"   -    \",\n        \"   -    \",\n        \"        \",\n        \"  --    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"  ---   \",\n        \"   -    \",\n        \"    --  \"\n      ]\n    },\n    \"İ\": {\n      \"ch\": \"İ\",\n      \"code\": 304,\n      \"map\": [\n        \"   -    \",\n        \"   -    \",\n        \"        \",\n        \"  ---   \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"  ---   \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ı\": {\n      \"ch\": \"ı\",\n      \"code\": 305,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"  --    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"  ---   \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ĳ\": {\n      \"ch\": \"Ĳ\",\n      \"code\": 306,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"---  ---\",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" - -  - \",\n        \" - -  - \",\n        \"--- --  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ĳ\": {\n      \"ch\": \"ĳ\",\n      \"code\": 307,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \" -    - \",\n        \" -    - \",\n        \"        \",\n        \"--   -- \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \"----  - \",\n        \"   -  - \",\n        \"    --  \"\n      ]\n    },\n    \"Ĵ\": {\n      \"ch\": \"Ĵ\",\n      \"code\": 308,\n      \"map\": [\n        \"    --  \",\n        \"   -  - \",\n        \"        \",\n        \"    --- \",\n        \"     -  \",\n        \"     -  \",\n        \"     -  \",\n        \"     -  \",\n        \"     -  \",\n        \" -   -  \",\n        \" -   -  \",\n        \"  ---   \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ĵ\": {\n      \"ch\": \"ĵ\",\n      \"code\": 309,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"    --  \",\n        \"   -  - \",\n        \"        \",\n        \"    --  \",\n        \"     -  \",\n        \"     -  \",\n        \"     -  \",\n        \"     -  \",\n        \"     -  \",\n        \" -   -  \",\n        \" -   -  \",\n        \"  ---   \"\n      ]\n    },\n    \"Ķ\": {\n      \"ch\": \"Ķ\",\n      \"code\": 310,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \" -    - \",\n        \" -   -  \",\n        \" -  -   \",\n        \" - -    \",\n        \" --     \",\n        \" --     \",\n        \" - -    \",\n        \" -  -   \",\n        \" -   -  \",\n        \" - -  - \",\n        \"   -    \",\n        \"  -     \"\n      ]\n    },\n    \"ķ\": {\n      \"ch\": \"ķ\",\n      \"code\": 311,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \" -      \",\n        \" -      \",\n        \" -      \",\n        \" -    - \",\n        \" -   -  \",\n        \" -  -   \",\n        \" ---    \",\n        \" -  -   \",\n        \" -   -  \",\n        \" - -  - \",\n        \"   -    \",\n        \"  -     \"\n      ]\n    },\n    \"ĸ\": {\n      \"ch\": \"ĸ\",\n      \"code\": 312,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \" -    - \",\n        \" -   -  \",\n        \" -  -   \",\n        \" ---    \",\n        \" -  -   \",\n        \" -   -  \",\n        \" -    - \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ĺ\": {\n      \"ch\": \"Ĺ\",\n      \"code\": 313,\n      \"map\": [\n        \"  -     \",\n        \" -      \",\n        \"        \",\n        \" -      \",\n        \" -      \",\n        \" -      \",\n        \" -      \",\n        \" -      \",\n        \" -      \",\n        \" -      \",\n        \" -      \",\n        \" ------ \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ĺ\": {\n      \"ch\": \"ĺ\",\n      \"code\": 314,\n      \"map\": [\n        \"    -   \",\n        \"   -    \",\n        \"        \",\n        \"  --    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"  ---   \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ļ\": {\n      \"ch\": \"Ļ\",\n      \"code\": 315,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \" -      \",\n        \" -      \",\n        \" -      \",\n        \" -      \",\n        \" -      \",\n        \" -      \",\n        \" -      \",\n        \" -      \",\n        \" -      \",\n        \" ------ \",\n        \"   -    \",\n        \"  -     \"\n      ]\n    },\n    \"ļ\": {\n      \"ch\": \"ļ\",\n      \"code\": 316,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"  --    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"  ---   \",\n        \"   -    \",\n        \"  -     \"\n      ]\n    },\n    \"Ľ\": {\n      \"ch\": \"Ľ\",\n      \"code\": 317,\n      \"map\": [\n        \"  -  -  \",\n        \"   --   \",\n        \" -      \",\n        \" -      \",\n        \" -      \",\n        \" -      \",\n        \" -      \",\n        \" -      \",\n        \" -      \",\n        \" -      \",\n        \" -      \",\n        \" ------ \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ľ\": {\n      \"ch\": \"ľ\",\n      \"code\": 318,\n      \"map\": [\n        \" -  -   \",\n        \"  --    \",\n        \"        \",\n        \"  --    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"  ---   \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ŀ\": {\n      \"ch\": \"Ŀ\",\n      \"code\": 319,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \" -      \",\n        \" -      \",\n        \" -      \",\n        \" -      \",\n        \" -   -  \",\n        \" -   -  \",\n        \" -      \",\n        \" -      \",\n        \" -      \",\n        \" ------ \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ŀ\": {\n      \"ch\": \"ŀ\",\n      \"code\": 320,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"  --    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -   -\",\n        \"   -   -\",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"  ---   \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ł\": {\n      \"ch\": \"Ł\",\n      \"code\": 321,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \" -      \",\n        \" -      \",\n        \" -      \",\n        \" -      \",\n        \" --     \",\n        \"--      \",\n        \" -      \",\n        \" -      \",\n        \" -      \",\n        \" ------ \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ł\": {\n      \"ch\": \"ł\",\n      \"code\": 322,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"  --    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   --   \",\n        \"  --    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"  ---   \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ń\": {\n      \"ch\": \"Ń\",\n      \"code\": 323,\n      \"map\": [\n        \"    -   \",\n        \"   -    \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" --   - \",\n        \" - -  - \",\n        \" -  - - \",\n        \" -   -- \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ń\": {\n      \"ch\": \"ń\",\n      \"code\": 324,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"    -   \",\n        \"   -    \",\n        \"        \",\n        \" -----  \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ņ\": {\n      \"ch\": \"Ņ\",\n      \"code\": 325,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" --   - \",\n        \" - -  - \",\n        \" -  - - \",\n        \" -   -- \",\n        \" -    - \",\n        \" -    - \",\n        \" - -  - \",\n        \"   -    \",\n        \"  -     \"\n      ]\n    },\n    \"ņ\": {\n      \"ch\": \"ņ\",\n      \"code\": 326,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \" -----  \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" - -  - \",\n        \"   -    \",\n        \"  -     \"\n      ]\n    },\n    \"Ň\": {\n      \"ch\": \"Ň\",\n      \"code\": 327,\n      \"map\": [\n        \"  -  -  \",\n        \"   --   \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" --   - \",\n        \" - -  - \",\n        \" -  - - \",\n        \" -   -- \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ň\": {\n      \"ch\": \"ň\",\n      \"code\": 328,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"  -  -  \",\n        \"   --   \",\n        \"        \",\n        \" -----  \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ŉ\": {\n      \"ch\": \"ŉ\",\n      \"code\": 329,\n      \"map\": [\n        \"        \",\n        \" -      \",\n        \" -      \",\n        \"-       \",\n        \"        \",\n        \" -----  \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ŋ\": {\n      \"ch\": \"Ŋ\",\n      \"code\": 330,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" --   - \",\n        \" - -  - \",\n        \" -  - - \",\n        \" -   -- \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \"      - \",\n        \"    --  \"\n      ]\n    },\n    \"ŋ\": {\n      \"ch\": \"ŋ\",\n      \"code\": 331,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \" -----  \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \"      - \",\n        \"    --  \"\n      ]\n    },\n    \"Ō\": {\n      \"ch\": \"Ō\",\n      \"code\": 332,\n      \"map\": [\n        \"  ----  \",\n        \"        \",\n        \"  ----  \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \"  ----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ō\": {\n      \"ch\": \"ō\",\n      \"code\": 333,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"  ----  \",\n        \"        \",\n        \"  ----  \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \"  ----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ŏ\": {\n      \"ch\": \"Ŏ\",\n      \"code\": 334,\n      \"map\": [\n        \"  -  -  \",\n        \"   --   \",\n        \"        \",\n        \"  ----  \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \"  ----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ŏ\": {\n      \"ch\": \"ŏ\",\n      \"code\": 335,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"  -  -  \",\n        \"   --   \",\n        \"        \",\n        \"  ----  \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \"  ----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ő\": {\n      \"ch\": \"Ő\",\n      \"code\": 336,\n      \"map\": [\n        \"   -  - \",\n        \"  -  -  \",\n        \"        \",\n        \"  ----  \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \"  ----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ő\": {\n      \"ch\": \"ő\",\n      \"code\": 337,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"   -  - \",\n        \"  -  -  \",\n        \"        \",\n        \"  ----  \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \"  ----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Œ\": {\n      \"ch\": \"Œ\",\n      \"code\": 338,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \" ------ \",\n        \"-  -    \",\n        \"-  -    \",\n        \"-  -    \",\n        \"-  ---  \",\n        \"-  -    \",\n        \"-  -    \",\n        \"-  -    \",\n        \"-  -    \",\n        \" ------ \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"œ\": {\n      \"ch\": \"œ\",\n      \"code\": 339,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \" -----  \",\n        \"-  -  - \",\n        \"-  -  - \",\n        \"-  ---- \",\n        \"-  -    \",\n        \"-  -    \",\n        \" -----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ŕ\": {\n      \"ch\": \"Ŕ\",\n      \"code\": 340,\n      \"map\": [\n        \"    -   \",\n        \"   -    \",\n        \"        \",\n        \" -----  \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -----  \",\n        \" - -    \",\n        \" -  -   \",\n        \" -   -  \",\n        \" -    - \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ŕ\": {\n      \"ch\": \"ŕ\",\n      \"code\": 341,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"    -   \",\n        \"   -    \",\n        \"        \",\n        \" - ---- \",\n        \" --     \",\n        \" -      \",\n        \" -      \",\n        \" -      \",\n        \" -      \",\n        \" -      \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ŗ\": {\n      \"ch\": \"Ŗ\",\n      \"code\": 342,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \" -----  \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -----  \",\n        \" - -    \",\n        \" -  -   \",\n        \" -   -  \",\n        \" - -  - \",\n        \"   -    \",\n        \"  -     \"\n      ]\n    },\n    \"ŗ\": {\n      \"ch\": \"ŗ\",\n      \"code\": 343,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \" - ---- \",\n        \" --     \",\n        \" -      \",\n        \" -      \",\n        \" -      \",\n        \" -      \",\n        \" --     \",\n        \"  -     \",\n        \" -      \"\n      ]\n    },\n    \"Ř\": {\n      \"ch\": \"Ř\",\n      \"code\": 344,\n      \"map\": [\n        \"  -  -  \",\n        \"   --   \",\n        \"        \",\n        \" -----  \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -----  \",\n        \" - -    \",\n        \" -  -   \",\n        \" -   -  \",\n        \" -    - \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ř\": {\n      \"ch\": \"ř\",\n      \"code\": 345,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"  -  -  \",\n        \"   --   \",\n        \"        \",\n        \" - ---- \",\n        \" --     \",\n        \" -      \",\n        \" -      \",\n        \" -      \",\n        \" -      \",\n        \" -      \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ś\": {\n      \"ch\": \"Ś\",\n      \"code\": 346,\n      \"map\": [\n        \"    -   \",\n        \"   -    \",\n        \"        \",\n        \"  ----  \",\n        \" -    - \",\n        \" -      \",\n        \" -      \",\n        \"  ----  \",\n        \"      - \",\n        \"      - \",\n        \" -    - \",\n        \"  ----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ś\": {\n      \"ch\": \"ś\",\n      \"code\": 347,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"     -  \",\n        \"    -   \",\n        \"        \",\n        \"  ----- \",\n        \" -      \",\n        \" -      \",\n        \"  ----  \",\n        \"      - \",\n        \"      - \",\n        \" -----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ŝ\": {\n      \"ch\": \"Ŝ\",\n      \"code\": 348,\n      \"map\": [\n        \"   --   \",\n        \"  -  -  \",\n        \"        \",\n        \"  ----  \",\n        \" -    - \",\n        \" -      \",\n        \" -      \",\n        \"  ----  \",\n        \"      - \",\n        \"      - \",\n        \" -    - \",\n        \"  ----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ŝ\": {\n      \"ch\": \"ŝ\",\n      \"code\": 349,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"   --   \",\n        \"  -  -  \",\n        \"        \",\n        \"  ----- \",\n        \" -      \",\n        \" -      \",\n        \"  ----  \",\n        \"      - \",\n        \"      - \",\n        \" -----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ş\": {\n      \"ch\": \"Ş\",\n      \"code\": 350,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"  ----  \",\n        \" -    - \",\n        \" -      \",\n        \" -      \",\n        \"  ----  \",\n        \"      - \",\n        \"      - \",\n        \" -    - \",\n        \" -    - \",\n        \"  ----  \",\n        \"   -    \",\n        \"  -     \"\n      ]\n    },\n    \"ş\": {\n      \"ch\": \"ş\",\n      \"code\": 351,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"  ----- \",\n        \" -      \",\n        \" -      \",\n        \"  ----  \",\n        \"      - \",\n        \"      - \",\n        \" -----  \",\n        \"   -    \",\n        \"  -     \"\n      ]\n    },\n    \"Š\": {\n      \"ch\": \"Š\",\n      \"code\": 352,\n      \"map\": [\n        \"  -  -  \",\n        \"   --   \",\n        \"        \",\n        \"  ----  \",\n        \" -    - \",\n        \" -      \",\n        \" -      \",\n        \"  ----  \",\n        \"      - \",\n        \"      - \",\n        \" -    - \",\n        \"  ----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"š\": {\n      \"ch\": \"š\",\n      \"code\": 353,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"  -  -  \",\n        \"   --   \",\n        \"        \",\n        \"  ----- \",\n        \" -      \",\n        \" -      \",\n        \"  ----  \",\n        \"      - \",\n        \"      - \",\n        \" -----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ţ\": {\n      \"ch\": \"Ţ\",\n      \"code\": 354,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"------- \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   --   \",\n        \"    -   \",\n        \"   -    \"\n      ]\n    },\n    \"ţ\": {\n      \"ch\": \"ţ\",\n      \"code\": 355,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \" -----  \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"    --- \",\n        \"     -  \",\n        \"    -   \"\n      ]\n    },\n    \"Ť\": {\n      \"ch\": \"Ť\",\n      \"code\": 356,\n      \"map\": [\n        \"  -  -  \",\n        \"   --   \",\n        \"        \",\n        \"------- \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ť\": {\n      \"ch\": \"ť\",\n      \"code\": 357,\n      \"map\": [\n        \"  -  -  \",\n        \"   --   \",\n        \"        \",\n        \"   -    \",\n        \"   -    \",\n        \" -----  \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"    --- \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ŧ\": {\n      \"ch\": \"Ŧ\",\n      \"code\": 358,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"------- \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \" -----  \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ŧ\": {\n      \"ch\": \"ŧ\",\n      \"code\": 359,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \" -----  \",\n        \"   -    \",\n        \"  ---   \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"    --- \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ũ\": {\n      \"ch\": \"Ũ\",\n      \"code\": 360,\n      \"map\": [\n        \"  --  - \",\n        \" -  --  \",\n        \"        \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \"  ----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ũ\": {\n      \"ch\": \"ũ\",\n      \"code\": 361,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"  --  - \",\n        \" -  --  \",\n        \"        \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \"  ----- \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ū\": {\n      \"ch\": \"Ū\",\n      \"code\": 362,\n      \"map\": [\n        \"  ----  \",\n        \"        \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \"  ----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ū\": {\n      \"ch\": \"ū\",\n      \"code\": 363,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"  ----  \",\n        \"        \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \"  ----- \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ŭ\": {\n      \"ch\": \"Ŭ\",\n      \"code\": 364,\n      \"map\": [\n        \"  -  -  \",\n        \"   --   \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \"  ----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ŭ\": {\n      \"ch\": \"ŭ\",\n      \"code\": 365,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"  -  -  \",\n        \"   --   \",\n        \"        \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \"  ----- \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ů\": {\n      \"ch\": \"Ů\",\n      \"code\": 366,\n      \"map\": [\n        \"   --   \",\n        \"  -  -  \",\n        \"   --   \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \"  ----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ů\": {\n      \"ch\": \"ů\",\n      \"code\": 367,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"   --   \",\n        \"  -  -  \",\n        \"   --   \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \"  ----- \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ű\": {\n      \"ch\": \"Ű\",\n      \"code\": 368,\n      \"map\": [\n        \"   -  - \",\n        \"  -  -  \",\n        \"        \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \"  ----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ű\": {\n      \"ch\": \"ű\",\n      \"code\": 369,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"   -  - \",\n        \"  -  -  \",\n        \"        \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \"  ----- \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ų\": {\n      \"ch\": \"Ų\",\n      \"code\": 370,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \"  ----  \",\n        \"    -   \",\n        \"     -- \"\n      ]\n    },\n    \"ų\": {\n      \"ch\": \"ų\",\n      \"code\": 371,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \"  ----- \",\n        \"     -  \",\n        \"      --\"\n      ]\n    },\n    \"Ŵ\": {\n      \"ch\": \"Ŵ\",\n      \"code\": 372,\n      \"map\": [\n        \"   --   \",\n        \"  -  -  \",\n        \"        \",\n        \"-     - \",\n        \"-     - \",\n        \"-     - \",\n        \"-     - \",\n        \"-  -  - \",\n        \"-  -  - \",\n        \"- - - - \",\n        \"--   -- \",\n        \"-     - \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ŵ\": {\n      \"ch\": \"ŵ\",\n      \"code\": 373,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"   --   \",\n        \"  -  -  \",\n        \"        \",\n        \"-     - \",\n        \"-     - \",\n        \"-  -  - \",\n        \"-  -  - \",\n        \"-  -  - \",\n        \"-  -  - \",\n        \" -----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ÿ\": {\n      \"ch\": \"Ÿ\",\n      \"code\": 376,\n      \"map\": [\n        \" -   -  \",\n        \" -   -  \",\n        \"        \",\n        \"-     - \",\n        \"-     - \",\n        \" -   -  \",\n        \" -   -  \",\n        \"  - -   \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ź\": {\n      \"ch\": \"Ź\",\n      \"code\": 377,\n      \"map\": [\n        \"    -   \",\n        \"   -    \",\n        \"        \",\n        \" ------ \",\n        \"      - \",\n        \"     -  \",\n        \"    -   \",\n        \"   -    \",\n        \"  -     \",\n        \" -      \",\n        \" -      \",\n        \" ------ \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ź\": {\n      \"ch\": \"ź\",\n      \"code\": 378,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"    -   \",\n        \"   -    \",\n        \"        \",\n        \" ------ \",\n        \"     -  \",\n        \"    -   \",\n        \"   -    \",\n        \"  -     \",\n        \" -      \",\n        \" ------ \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ż\": {\n      \"ch\": \"Ż\",\n      \"code\": 379,\n      \"map\": [\n        \"   -    \",\n        \"   -    \",\n        \"        \",\n        \" ------ \",\n        \"      - \",\n        \"     -  \",\n        \"    -   \",\n        \"   -    \",\n        \"  -     \",\n        \" -      \",\n        \" -      \",\n        \" ------ \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ż\": {\n      \"ch\": \"ż\",\n      \"code\": 380,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"   -    \",\n        \"   -    \",\n        \"        \",\n        \" ------ \",\n        \"     -  \",\n        \"    -   \",\n        \"   -    \",\n        \"  -     \",\n        \" -      \",\n        \" ------ \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ž\": {\n      \"ch\": \"Ž\",\n      \"code\": 381,\n      \"map\": [\n        \"  -  -  \",\n        \"   --   \",\n        \"        \",\n        \" ------ \",\n        \"      - \",\n        \"     -  \",\n        \"    -   \",\n        \"   -    \",\n        \"  -     \",\n        \" -      \",\n        \" -      \",\n        \" ------ \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ž\": {\n      \"ch\": \"ž\",\n      \"code\": 382,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"  -  -  \",\n        \"   --   \",\n        \"        \",\n        \" ------ \",\n        \"     -  \",\n        \"    -   \",\n        \"   -    \",\n        \"  -     \",\n        \" -      \",\n        \" ------ \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ſ\": {\n      \"ch\": \"ſ\",\n      \"code\": 383,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"    --- \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ɔ\": {\n      \"ch\": \"Ɔ\",\n      \"code\": 390,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"  ----  \",\n        \" -    - \",\n        \" -    - \",\n        \"      - \",\n        \"      - \",\n        \"      - \",\n        \"      - \",\n        \" -    - \",\n        \" -    - \",\n        \"  ----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ǝ\": {\n      \"ch\": \"Ǝ\",\n      \"code\": 398,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \" ------ \",\n        \"      - \",\n        \"      - \",\n        \"      - \",\n        \"   ---- \",\n        \"      - \",\n        \"      - \",\n        \"      - \",\n        \"      - \",\n        \" ------ \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ə\": {\n      \"ch\": \"Ə\",\n      \"code\": 399,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"  ----  \",\n        \" -    - \",\n        \"      - \",\n        \"      - \",\n        \" ------ \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \"  ----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ɛ\": {\n      \"ch\": \"Ɛ\",\n      \"code\": 400,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"  ----  \",\n        \" -    - \",\n        \" -    - \",\n        \" -      \",\n        \"  ---   \",\n        \" -      \",\n        \" -      \",\n        \" -    - \",\n        \" -    - \",\n        \"  ----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ƒ\": {\n      \"ch\": \"ƒ\",\n      \"code\": 402,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"    --  \",\n        \"   -  - \",\n        \"   -    \",\n        \"   -    \",\n        \" -----  \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"-  -    \",\n        \" --     \"\n      ]\n    },\n    \"Ɲ\": {\n      \"ch\": \"Ɲ\",\n      \"code\": 413,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" --   - \",\n        \" - -  - \",\n        \" -  - - \",\n        \" -   -- \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -      \",\n        \"-       \"\n      ]\n    },\n    \"ƞ\": {\n      \"ch\": \"ƞ\",\n      \"code\": 414,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \" -----  \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \"      - \",\n        \"      - \"\n      ]\n    },\n    \"Ʒ\": {\n      \"ch\": \"Ʒ\",\n      \"code\": 439,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \" ------ \",\n        \"      - \",\n        \"     -  \",\n        \"    -   \",\n        \"   ---  \",\n        \"      - \",\n        \"      - \",\n        \" -    - \",\n        \" -    - \",\n        \"  ----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ș\": {\n      \"ch\": \"Ș\",\n      \"code\": 536,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"  ----  \",\n        \" -    - \",\n        \" -      \",\n        \" -      \",\n        \"  ----  \",\n        \"      - \",\n        \"      - \",\n        \" -    - \",\n        \" -    - \",\n        \"  ----  \",\n        \"   -    \",\n        \"  -     \"\n      ]\n    },\n    \"ș\": {\n      \"ch\": \"ș\",\n      \"code\": 537,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"  ----- \",\n        \" -      \",\n        \" -      \",\n        \"  ----  \",\n        \"      - \",\n        \"      - \",\n        \" -----  \",\n        \"   -    \",\n        \"  -     \"\n      ]\n    },\n    \"Ț\": {\n      \"ch\": \"Ț\",\n      \"code\": 538,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"------- \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   --   \",\n        \"    -   \",\n        \"   -    \"\n      ]\n    },\n    \"ț\": {\n      \"ch\": \"ț\",\n      \"code\": 539,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \" -----  \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"    --- \",\n        \"      - \",\n        \"     -  \"\n      ]\n    },\n    \"Ȳ\": {\n      \"ch\": \"Ȳ\",\n      \"code\": 562,\n      \"map\": [\n        \" -----  \",\n        \"        \",\n        \"-     - \",\n        \"-     - \",\n        \" -   -  \",\n        \" -   -  \",\n        \"  - -   \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ȳ\": {\n      \"ch\": \"ȳ\",\n      \"code\": 563,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"  ----  \",\n        \"        \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \"  ----- \",\n        \"      - \",\n        \"  ----  \"\n      ]\n    },\n    \"ȷ\": {\n      \"ch\": \"ȷ\",\n      \"code\": 567,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"    --  \",\n        \"     -  \",\n        \"     -  \",\n        \"     -  \",\n        \"     -  \",\n        \"     -  \",\n        \" -   -  \",\n        \" -   -  \",\n        \"  ---   \"\n      ]\n    },\n    \"ɔ\": {\n      \"ch\": \"ɔ\",\n      \"code\": 596,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"  ----  \",\n        \" -    - \",\n        \"      - \",\n        \"      - \",\n        \"      - \",\n        \" -    - \",\n        \"  ----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ɘ\": {\n      \"ch\": \"ɘ\",\n      \"code\": 600,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"  ----  \",\n        \" -    - \",\n        \" -    - \",\n        \" ------ \",\n        \"      - \",\n        \"      - \",\n        \"  ----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ə\": {\n      \"ch\": \"ə\",\n      \"code\": 601,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"  ----  \",\n        \"      - \",\n        \"      - \",\n        \" ------ \",\n        \" -    - \",\n        \" -    - \",\n        \"  ----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ɛ\": {\n      \"ch\": \"ɛ\",\n      \"code\": 603,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"  ----  \",\n        \" -    - \",\n        \" -      \",\n        \"  ---   \",\n        \" -      \",\n        \" -    - \",\n        \"  ----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ɲ\": {\n      \"ch\": \"ɲ\",\n      \"code\": 626,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \" -----  \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -      \",\n        \"-       \"\n      ]\n    },\n    \"ʒ\": {\n      \"ch\": \"ʒ\",\n      \"code\": 658,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \" ------ \",\n        \"      - \",\n        \"     -  \",\n        \"    -   \",\n        \"   ---  \",\n        \"      - \",\n        \"      - \",\n        \" -    - \",\n        \"  ----  \"\n      ]\n    },\n    \"ʻ\": {\n      \"ch\": \"ʻ\",\n      \"code\": 699,\n      \"map\": [\n        \"    -   \",\n        \"   -    \",\n        \"   -    \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ʼ\": {\n      \"ch\": \"ʼ\",\n      \"code\": 700,\n      \"map\": [\n        \"    -   \",\n        \"    -   \",\n        \"   -    \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ʽ\": {\n      \"ch\": \"ʽ\",\n      \"code\": 701,\n      \"map\": [\n        \"   -    \",\n        \"   -    \",\n        \"    -   \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ˆ\": {\n      \"ch\": \"ˆ\",\n      \"code\": 710,\n      \"map\": [\n        \"   --   \",\n        \"  -  -  \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ˇ\": {\n      \"ch\": \"ˇ\",\n      \"code\": 711,\n      \"map\": [\n        \"  -  -  \",\n        \"   --   \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"˘\": {\n      \"ch\": \"˘\",\n      \"code\": 728,\n      \"map\": [\n        \"  -  -  \",\n        \"   --   \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"˙\": {\n      \"ch\": \"˙\",\n      \"code\": 729,\n      \"map\": [\n        \"   -    \",\n        \"   -    \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"˛\": {\n      \"ch\": \"˛\",\n      \"code\": 731,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"      - \",\n        \"     -  \",\n        \"      --\"\n      ]\n    },\n    \"˜\": {\n      \"ch\": \"˜\",\n      \"code\": 732,\n      \"map\": [\n        \"  --  - \",\n        \" -  --  \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"˝\": {\n      \"ch\": \"˝\",\n      \"code\": 733,\n      \"map\": [\n        \"   -  - \",\n        \"  -  -  \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"̀\": {\n      \"ch\": \"̀\",\n      \"code\": 768,\n      \"map\": [\n        \"   -    \",\n        \"    -   \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"́\": {\n      \"ch\": \"́\",\n      \"code\": 769,\n      \"map\": [\n        \"    -   \",\n        \"   -    \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"̂\": {\n      \"ch\": \"̂\",\n      \"code\": 770,\n      \"map\": [\n        \"   --   \",\n        \"  -  -  \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"̃\": {\n      \"ch\": \"̃\",\n      \"code\": 771,\n      \"map\": [\n        \"  --  - \",\n        \" -  --  \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"̆\": {\n      \"ch\": \"̆\",\n      \"code\": 774,\n      \"map\": [\n        \"  -  -  \",\n        \"   --   \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"̌\": {\n      \"ch\": \"̌\",\n      \"code\": 780,\n      \"map\": [\n        \"  -  -  \",\n        \"   --   \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"̩\": {\n      \"ch\": \"̩\",\n      \"code\": 809,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"   -    \",\n        \"   -    \"\n      ]\n    },\n    \"΄\": {\n      \"ch\": \"΄\",\n      \"code\": 900,\n      \"map\": [\n        \" -      \",\n        \"-       \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"΅\": {\n      \"ch\": \"΅\",\n      \"code\": 901,\n      \"map\": [\n        \"    -   \",\n        \"   -    \",\n        \"        \",\n        \"  -  -  \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ά\": {\n      \"ch\": \"Ά\",\n      \"code\": 902,\n      \"map\": [\n        \" -      \",\n        \"-       \",\n        \"  ----  \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" ------ \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"·\": {\n      \"ch\": \"·\",\n      \"code\": 903,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"   -    \",\n        \"   -    \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Έ\": {\n      \"ch\": \"Έ\",\n      \"code\": 904,\n      \"map\": [\n        \" -      \",\n        \"-       \",\n        \" ------ \",\n        \" -      \",\n        \" -      \",\n        \" -      \",\n        \" ----   \",\n        \" -      \",\n        \" -      \",\n        \" -      \",\n        \" -      \",\n        \" ------ \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ή\": {\n      \"ch\": \"Ή\",\n      \"code\": 905,\n      \"map\": [\n        \" -      \",\n        \"-       \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" ------ \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ί\": {\n      \"ch\": \"Ί\",\n      \"code\": 906,\n      \"map\": [\n        \" -      \",\n        \"-       \",\n        \"  ---   \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"  ---   \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ό\": {\n      \"ch\": \"Ό\",\n      \"code\": 908,\n      \"map\": [\n        \" -      \",\n        \"-       \",\n        \"  ----  \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \"  ----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ύ\": {\n      \"ch\": \"Ύ\",\n      \"code\": 910,\n      \"map\": [\n        \" -      \",\n        \"-       \",\n        \"        \",\n        \"-     - \",\n        \"-     - \",\n        \" -   -  \",\n        \" -   -  \",\n        \"  - -   \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ώ\": {\n      \"ch\": \"Ώ\",\n      \"code\": 911,\n      \"map\": [\n        \" -      \",\n        \"-       \",\n        \"  ----  \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \"  -  -  \",\n        \"  -  -  \",\n        \" --  -- \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ΐ\": {\n      \"ch\": \"ΐ\",\n      \"code\": 912,\n      \"map\": [\n        \"    -   \",\n        \"   -    \",\n        \" -  -   \",\n        \" -  -   \",\n        \"        \",\n        \"  --    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"    --  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Α\": {\n      \"ch\": \"Α\",\n      \"code\": 913,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"  ----  \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" ------ \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Β\": {\n      \"ch\": \"Β\",\n      \"code\": 914,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \" -----  \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -----  \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Γ\": {\n      \"ch\": \"Γ\",\n      \"code\": 915,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \" ------ \",\n        \" -      \",\n        \" -      \",\n        \" -      \",\n        \" -      \",\n        \" -      \",\n        \" -      \",\n        \" -      \",\n        \" -      \",\n        \" -      \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Δ\": {\n      \"ch\": \"Δ\",\n      \"code\": 916,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"   -    \",\n        \"   -    \",\n        \"  - -   \",\n        \"  - -   \",\n        \" -   -  \",\n        \" -   -  \",\n        \" -   -  \",\n        \"-     - \",\n        \"-     - \",\n        \"------- \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ε\": {\n      \"ch\": \"Ε\",\n      \"code\": 917,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \" ------ \",\n        \" -      \",\n        \" -      \",\n        \" -      \",\n        \" ----   \",\n        \" -      \",\n        \" -      \",\n        \" -      \",\n        \" -      \",\n        \" ------ \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ζ\": {\n      \"ch\": \"Ζ\",\n      \"code\": 918,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \" ------ \",\n        \"      - \",\n        \"      - \",\n        \"     -  \",\n        \"    -   \",\n        \"   -    \",\n        \"  -     \",\n        \" -      \",\n        \" -      \",\n        \" ------ \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Η\": {\n      \"ch\": \"Η\",\n      \"code\": 919,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" ------ \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Θ\": {\n      \"ch\": \"Θ\",\n      \"code\": 920,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"  ----  \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" - -- - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \"  ----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ι\": {\n      \"ch\": \"Ι\",\n      \"code\": 921,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"  ---   \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"  ---   \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Κ\": {\n      \"ch\": \"Κ\",\n      \"code\": 922,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \" -    - \",\n        \" -   -  \",\n        \" -  -   \",\n        \" - -    \",\n        \" --     \",\n        \" --     \",\n        \" - -    \",\n        \" -  -   \",\n        \" -   -  \",\n        \" -    - \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Λ\": {\n      \"ch\": \"Λ\",\n      \"code\": 923,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"   -    \",\n        \"   -    \",\n        \"  - -   \",\n        \"  - -   \",\n        \" -   -  \",\n        \" -   -  \",\n        \" -   -  \",\n        \"-     - \",\n        \"-     - \",\n        \"-     - \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Μ\": {\n      \"ch\": \"Μ\",\n      \"code\": 924,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"-     - \",\n        \"--   -- \",\n        \"- - - - \",\n        \"-  -  - \",\n        \"-  -  - \",\n        \"-     - \",\n        \"-     - \",\n        \"-     - \",\n        \"-     - \",\n        \"-     - \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ν\": {\n      \"ch\": \"Ν\",\n      \"code\": 925,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" --   - \",\n        \" - -  - \",\n        \" -  - - \",\n        \" -   -- \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ξ\": {\n      \"ch\": \"Ξ\",\n      \"code\": 926,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \" ------ \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"  ----  \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \" ------ \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ο\": {\n      \"ch\": \"Ο\",\n      \"code\": 927,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"  ----  \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \"  ----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Π\": {\n      \"ch\": \"Π\",\n      \"code\": 928,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \" ------ \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ρ\": {\n      \"ch\": \"Ρ\",\n      \"code\": 929,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \" -----  \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -----  \",\n        \" -      \",\n        \" -      \",\n        \" -      \",\n        \" -      \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Σ\": {\n      \"ch\": \"Σ\",\n      \"code\": 931,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \" ------ \",\n        \" -      \",\n        \"  -     \",\n        \"   -    \",\n        \"    -   \",\n        \"    -   \",\n        \"   -    \",\n        \"  -     \",\n        \" -      \",\n        \" ------ \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Τ\": {\n      \"ch\": \"Τ\",\n      \"code\": 932,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"------- \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Υ\": {\n      \"ch\": \"Υ\",\n      \"code\": 933,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"-     - \",\n        \"-     - \",\n        \" -   -  \",\n        \" -   -  \",\n        \"  - -   \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Φ\": {\n      \"ch\": \"Φ\",\n      \"code\": 934,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"   -    \",\n        \" -----  \",\n        \"-  -  - \",\n        \"-  -  - \",\n        \"-  -  - \",\n        \"-  -  - \",\n        \"-  -  - \",\n        \"-  -  - \",\n        \" -----  \",\n        \"   -    \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Χ\": {\n      \"ch\": \"Χ\",\n      \"code\": 935,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \" -    - \",\n        \" -    - \",\n        \"  -  -  \",\n        \"  -  -  \",\n        \"   --   \",\n        \"   --   \",\n        \"  -  -  \",\n        \"  -  -  \",\n        \" -    - \",\n        \" -    - \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ψ\": {\n      \"ch\": \"Ψ\",\n      \"code\": 936,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"-  -  - \",\n        \"-  -  - \",\n        \"-  -  - \",\n        \"-  -  - \",\n        \"-  -  - \",\n        \"-  -  - \",\n        \"-  -  - \",\n        \" -----  \",\n        \"   -    \",\n        \"   -    \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ω\": {\n      \"ch\": \"Ω\",\n      \"code\": 937,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"  ----  \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \"  -  -  \",\n        \"  -  -  \",\n        \" --  -- \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ϊ\": {\n      \"ch\": \"Ϊ\",\n      \"code\": 938,\n      \"map\": [\n        \" -   -  \",\n        \" -   -  \",\n        \"        \",\n        \"  ---   \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"  ---   \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ϋ\": {\n      \"ch\": \"Ϋ\",\n      \"code\": 939,\n      \"map\": [\n        \" -   -  \",\n        \" -   -  \",\n        \"        \",\n        \"-     - \",\n        \"-     - \",\n        \" -   -  \",\n        \" -   -  \",\n        \"  - -   \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ά\": {\n      \"ch\": \"ά\",\n      \"code\": 940,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"    -   \",\n        \"   -    \",\n        \"        \",\n        \"  --- - \",\n        \" -   -- \",\n        \" -   -  \",\n        \" -   -  \",\n        \" -   -  \",\n        \" -   -- \",\n        \"  --- - \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"έ\": {\n      \"ch\": \"έ\",\n      \"code\": 941,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"    -   \",\n        \"   -    \",\n        \"        \",\n        \"  ----  \",\n        \" -    - \",\n        \" -      \",\n        \"  ---   \",\n        \" -      \",\n        \" -    - \",\n        \"  ----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ή\": {\n      \"ch\": \"ή\",\n      \"code\": 942,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"    -   \",\n        \"   -    \",\n        \"        \",\n        \" -----  \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \"      - \",\n        \"      - \"\n      ]\n    },\n    \"ί\": {\n      \"ch\": \"ί\",\n      \"code\": 943,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"    -   \",\n        \"   -    \",\n        \"        \",\n        \"  --    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"    --  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ΰ\": {\n      \"ch\": \"ΰ\",\n      \"code\": 944,\n      \"map\": [\n        \"    -   \",\n        \"   -    \",\n        \"        \",\n        \"  -  -  \",\n        \"        \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \"  ----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"α\": {\n      \"ch\": \"α\",\n      \"code\": 945,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"  --- - \",\n        \" -   -- \",\n        \" -   -  \",\n        \" -   -  \",\n        \" -   -  \",\n        \" -   -- \",\n        \"  --- - \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"β\": {\n      \"ch\": \"β\",\n      \"code\": 946,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"  ---   \",\n        \" -   -  \",\n        \" -   -  \",\n        \" -  -   \",\n        \" -----  \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -----  \",\n        \" -      \",\n        \" -      \"\n      ]\n    },\n    \"γ\": {\n      \"ch\": \"γ\",\n      \"code\": 947,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"-     - \",\n        \"-     - \",\n        \" -   -  \",\n        \" -   -  \",\n        \"  - -   \",\n        \"  - -   \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \"\n      ]\n    },\n    \"δ\": {\n      \"ch\": \"δ\",\n      \"code\": 948,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"  ----- \",\n        \"   -    \",\n        \"    -   \",\n        \"  ----  \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \"  ----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ε\": {\n      \"ch\": \"ε\",\n      \"code\": 949,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"  ----  \",\n        \" -    - \",\n        \" -      \",\n        \"  ---   \",\n        \" -      \",\n        \" -    - \",\n        \"  ----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ζ\": {\n      \"ch\": \"ζ\",\n      \"code\": 950,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \" ------ \",\n        \"     -  \",\n        \"    -   \",\n        \"   -    \",\n        \"  -     \",\n        \" -      \",\n        \" -      \",\n        \" -      \",\n        \" -      \",\n        \"  ----  \",\n        \"      - \",\n        \"     -  \"\n      ]\n    },\n    \"η\": {\n      \"ch\": \"η\",\n      \"code\": 951,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \" -----  \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \"      - \",\n        \"      - \"\n      ]\n    },\n    \"θ\": {\n      \"ch\": \"θ\",\n      \"code\": 952,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"  ---   \",\n        \" -   -  \",\n        \" -   -  \",\n        \" -   -  \",\n        \" -----  \",\n        \" -   -  \",\n        \" -   -  \",\n        \" -   -  \",\n        \" -   -  \",\n        \"  ---   \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ι\": {\n      \"ch\": \"ι\",\n      \"code\": 953,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"  --    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"    --  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"κ\": {\n      \"ch\": \"κ\",\n      \"code\": 954,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \" -    - \",\n        \" -   -  \",\n        \" -  -   \",\n        \" ---    \",\n        \" -  -   \",\n        \" -   -  \",\n        \" -    - \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"λ\": {\n      \"ch\": \"λ\",\n      \"code\": 955,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"  -     \",\n        \"  -     \",\n        \"   -    \",\n        \"   -    \",\n        \"  - -   \",\n        \"  - -   \",\n        \" -   -  \",\n        \" -   -  \",\n        \"-     - \",\n        \"-     - \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"μ\": {\n      \"ch\": \"μ\",\n      \"code\": 956,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -   -- \",\n        \" ---- - \",\n        \" -      \",\n        \" -      \"\n      ]\n    },\n    \"ν\": {\n      \"ch\": \"ν\",\n      \"code\": 957,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \"  -  -  \",\n        \"  -  -  \",\n        \"   --   \",\n        \"   --   \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ξ\": {\n      \"ch\": \"ξ\",\n      \"code\": 958,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"  ----- \",\n        \" -      \",\n        \" -      \",\n        \" -      \",\n        \"  ----  \",\n        \" -      \",\n        \" -      \",\n        \" -      \",\n        \" -      \",\n        \"  ----  \",\n        \"      - \",\n        \"     -  \"\n      ]\n    },\n    \"ο\": {\n      \"ch\": \"ο\",\n      \"code\": 959,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"  ----  \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \"  ----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"π\": {\n      \"ch\": \"π\",\n      \"code\": 960,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \" ------ \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ρ\": {\n      \"ch\": \"ρ\",\n      \"code\": 961,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"  ----  \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -----  \",\n        \" -      \",\n        \" -      \"\n      ]\n    },\n    \"ς\": {\n      \"ch\": \"ς\",\n      \"code\": 962,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"  ----  \",\n        \" -    - \",\n        \" -      \",\n        \" -      \",\n        \" -      \",\n        \" -      \",\n        \"  ----  \",\n        \"      - \",\n        \"     -  \"\n      ]\n    },\n    \"σ\": {\n      \"ch\": \"σ\",\n      \"code\": 963,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"  ----- \",\n        \" -   -  \",\n        \" -   -  \",\n        \" -   -  \",\n        \" -   -  \",\n        \" -   -  \",\n        \"  ---   \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"τ\": {\n      \"ch\": \"τ\",\n      \"code\": 964,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"------- \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"    --  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"υ\": {\n      \"ch\": \"υ\",\n      \"code\": 965,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \"  ----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"φ\": {\n      \"ch\": \"φ\",\n      \"code\": 966,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \" -  --  \",\n        \"-  -  - \",\n        \"-  -  - \",\n        \"-  -  - \",\n        \"-  -  - \",\n        \"-  -  - \",\n        \" -----  \",\n        \"   -    \",\n        \"   -    \"\n      ]\n    },\n    \"χ\": {\n      \"ch\": \"χ\",\n      \"code\": 967,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \" -    - \",\n        \" -    - \",\n        \"  -  -  \",\n        \"  -  -  \",\n        \"   --   \",\n        \"  -  -  \",\n        \"  -  -  \",\n        \" -    - \",\n        \" -    - \"\n      ]\n    },\n    \"ψ\": {\n      \"ch\": \"ψ\",\n      \"code\": 968,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"-  -  - \",\n        \"-  -  - \",\n        \"-  -  - \",\n        \"-  -  - \",\n        \"-  -  - \",\n        \"-  -  - \",\n        \" -----  \",\n        \"   -    \",\n        \"   -    \"\n      ]\n    },\n    \"ω\": {\n      \"ch\": \"ω\",\n      \"code\": 969,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \" -   -  \",\n        \"-     - \",\n        \"-  -  - \",\n        \"-  -  - \",\n        \"-  -  - \",\n        \"-  -  - \",\n        \" -- --  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ϊ\": {\n      \"ch\": \"ϊ\",\n      \"code\": 970,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \" -  -   \",\n        \" -  -   \",\n        \"        \",\n        \"  --    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"    --  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ϋ\": {\n      \"ch\": \"ϋ\",\n      \"code\": 971,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"  -  -  \",\n        \"  -  -  \",\n        \"        \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \"  ----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ό\": {\n      \"ch\": \"ό\",\n      \"code\": 972,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"    -   \",\n        \"   -    \",\n        \"        \",\n        \"  ----  \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \"  ----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ύ\": {\n      \"ch\": \"ύ\",\n      \"code\": 973,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"    -   \",\n        \"   -    \",\n        \"        \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \"  ----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ώ\": {\n      \"ch\": \"ώ\",\n      \"code\": 974,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"    -   \",\n        \"   -    \",\n        \"        \",\n        \" -   -  \",\n        \"-     - \",\n        \"-  -  - \",\n        \"-  -  - \",\n        \"-  -  - \",\n        \"-  -  - \",\n        \" -- --  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ϳ\": {\n      \"ch\": \"ϳ\",\n      \"code\": 1011,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"     -  \",\n        \"     -  \",\n        \"        \",\n        \"    --  \",\n        \"     -  \",\n        \"     -  \",\n        \"     -  \",\n        \"     -  \",\n        \"     -  \",\n        \" -   -  \",\n        \" -   -  \",\n        \"  ---   \"\n      ]\n    },\n    \"ϴ\": {\n      \"ch\": \"ϴ\",\n      \"code\": 1012,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"  ----  \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" ------ \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \"  ----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ѐ\": {\n      \"ch\": \"Ѐ\",\n      \"code\": 1024,\n      \"map\": [\n        \"   -    \",\n        \"    -   \",\n        \"        \",\n        \" ------ \",\n        \" -      \",\n        \" -      \",\n        \" -      \",\n        \" ----   \",\n        \" -      \",\n        \" -      \",\n        \" -      \",\n        \" ------ \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ё\": {\n      \"ch\": \"Ё\",\n      \"code\": 1025,\n      \"map\": [\n        \"  -  -  \",\n        \"  -  -  \",\n        \"        \",\n        \" ------ \",\n        \" -      \",\n        \" -      \",\n        \" -      \",\n        \" ----   \",\n        \" -      \",\n        \" -      \",\n        \" -      \",\n        \" ------ \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ђ\": {\n      \"ch\": \"Ђ\",\n      \"code\": 1026,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"-----   \",\n        \"  -     \",\n        \"  -     \",\n        \"  ----  \",\n        \"  -   - \",\n        \"  -   - \",\n        \"  -   - \",\n        \"  -   - \",\n        \"  -   - \",\n        \"  -  -  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ѓ\": {\n      \"ch\": \"Ѓ\",\n      \"code\": 1027,\n      \"map\": [\n        \"    -   \",\n        \"   -    \",\n        \"        \",\n        \" ------ \",\n        \" -      \",\n        \" -      \",\n        \" -      \",\n        \" -      \",\n        \" -      \",\n        \" -      \",\n        \" -      \",\n        \" -      \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Є\": {\n      \"ch\": \"Є\",\n      \"code\": 1028,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"  ----  \",\n        \" -    - \",\n        \" -      \",\n        \" -      \",\n        \" ----   \",\n        \" -      \",\n        \" -      \",\n        \" -      \",\n        \" -    - \",\n        \"  ----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ѕ\": {\n      \"ch\": \"Ѕ\",\n      \"code\": 1029,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"  ----  \",\n        \" -    - \",\n        \" -      \",\n        \" -      \",\n        \"  ----  \",\n        \"      - \",\n        \"      - \",\n        \" -    - \",\n        \" -    - \",\n        \"  ----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"І\": {\n      \"ch\": \"І\",\n      \"code\": 1030,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"  ---   \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"  ---   \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ї\": {\n      \"ch\": \"Ї\",\n      \"code\": 1031,\n      \"map\": [\n        \" -   -  \",\n        \" -   -  \",\n        \"        \",\n        \"  ---   \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"  ---   \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ј\": {\n      \"ch\": \"Ј\",\n      \"code\": 1032,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"    --- \",\n        \"     -  \",\n        \"     -  \",\n        \"     -  \",\n        \"     -  \",\n        \"     -  \",\n        \"     -  \",\n        \" -   -  \",\n        \" -   -  \",\n        \"  ---   \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Љ\": {\n      \"ch\": \"Љ\",\n      \"code\": 1033,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"  --    \",\n        \" - -    \",\n        \"-  -    \",\n        \"-  ---  \",\n        \"-  -  - \",\n        \"-  -  - \",\n        \"-  -  - \",\n        \"-  -  - \",\n        \"-  -  - \",\n        \"-  ---  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Њ\": {\n      \"ch\": \"Њ\",\n      \"code\": 1034,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"-  -    \",\n        \"-  -    \",\n        \"-  -    \",\n        \"-  ---  \",\n        \"----  - \",\n        \"-  -  - \",\n        \"-  -  - \",\n        \"-  -  - \",\n        \"-  -  - \",\n        \"-  ---  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ћ\": {\n      \"ch\": \"Ћ\",\n      \"code\": 1035,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"-----   \",\n        \"  -     \",\n        \"  -     \",\n        \"  ----  \",\n        \"  -   - \",\n        \"  -   - \",\n        \"  -   - \",\n        \"  -   - \",\n        \"  -   - \",\n        \"  -   - \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ќ\": {\n      \"ch\": \"Ќ\",\n      \"code\": 1036,\n      \"map\": [\n        \"    -   \",\n        \"   -    \",\n        \" -    - \",\n        \" -   -  \",\n        \" -  -   \",\n        \" - -    \",\n        \" --     \",\n        \" --     \",\n        \" - -    \",\n        \" -  -   \",\n        \" -   -  \",\n        \" -    - \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ѝ\": {\n      \"ch\": \"Ѝ\",\n      \"code\": 1037,\n      \"map\": [\n        \"   -    \",\n        \"    -   \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -   -- \",\n        \" -  - - \",\n        \" - -  - \",\n        \" --   - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ў\": {\n      \"ch\": \"Ў\",\n      \"code\": 1038,\n      \"map\": [\n        \"  -  -  \",\n        \"   --   \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \"  ----- \",\n        \"      - \",\n        \"      - \",\n        \"      - \",\n        \"  ----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Џ\": {\n      \"ch\": \"Џ\",\n      \"code\": 1039,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" ------ \",\n        \"   --   \",\n        \"   --   \"\n      ]\n    },\n    \"А\": {\n      \"ch\": \"А\",\n      \"code\": 1040,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"  ----  \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" ------ \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Б\": {\n      \"ch\": \"Б\",\n      \"code\": 1041,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \" -----  \",\n        \" -      \",\n        \" -      \",\n        \" -----  \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"В\": {\n      \"ch\": \"В\",\n      \"code\": 1042,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \" -----  \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -----  \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Г\": {\n      \"ch\": \"Г\",\n      \"code\": 1043,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \" ------ \",\n        \" -      \",\n        \" -      \",\n        \" -      \",\n        \" -      \",\n        \" -      \",\n        \" -      \",\n        \" -      \",\n        \" -      \",\n        \" -      \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Д\": {\n      \"ch\": \"Д\",\n      \"code\": 1044,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"  ----  \",\n        \" -   -  \",\n        \" -   -  \",\n        \" -   -  \",\n        \" -   -  \",\n        \" -   -  \",\n        \" -   -  \",\n        \" -   -  \",\n        \" -   -  \",\n        \"------- \",\n        \"-     - \",\n        \"        \"\n      ]\n    },\n    \"Е\": {\n      \"ch\": \"Е\",\n      \"code\": 1045,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \" ------ \",\n        \" -      \",\n        \" -      \",\n        \" -      \",\n        \" ----   \",\n        \" -      \",\n        \" -      \",\n        \" -      \",\n        \" -      \",\n        \" ------ \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ж\": {\n      \"ch\": \"Ж\",\n      \"code\": 1046,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"-  -  - \",\n        \"-  -  - \",\n        \"-  -  - \",\n        \" - - -  \",\n        \"  ---   \",\n        \" - - -  \",\n        \"-  -  - \",\n        \"-  -  - \",\n        \"-  -  - \",\n        \"-  -  - \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"З\": {\n      \"ch\": \"З\",\n      \"code\": 1047,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"  ----  \",\n        \" -    - \",\n        \" -    - \",\n        \"      - \",\n        \"   ---  \",\n        \"      - \",\n        \"      - \",\n        \" -    - \",\n        \" -    - \",\n        \"  ----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"И\": {\n      \"ch\": \"И\",\n      \"code\": 1048,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -   -- \",\n        \" -  - - \",\n        \" - -  - \",\n        \" --   - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Й\": {\n      \"ch\": \"Й\",\n      \"code\": 1049,\n      \"map\": [\n        \"  -  -  \",\n        \"   --   \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -   -- \",\n        \" -  - - \",\n        \" - -  - \",\n        \" --   - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"К\": {\n      \"ch\": \"К\",\n      \"code\": 1050,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \" -    - \",\n        \" -   -  \",\n        \" -  -   \",\n        \" - -    \",\n        \" --     \",\n        \" --     \",\n        \" - -    \",\n        \" -  -   \",\n        \" -   -  \",\n        \" -    - \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Л\": {\n      \"ch\": \"Л\",\n      \"code\": 1051,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"    --- \",\n        \"   -  - \",\n        \"  -   - \",\n        \"  -   - \",\n        \"  -   - \",\n        \"  -   - \",\n        \"  -   - \",\n        \"  -   - \",\n        \"  -   - \",\n        \" -    - \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"М\": {\n      \"ch\": \"М\",\n      \"code\": 1052,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"-     - \",\n        \"--   -- \",\n        \"- - - - \",\n        \"-  -  - \",\n        \"-  -  - \",\n        \"-     - \",\n        \"-     - \",\n        \"-     - \",\n        \"-     - \",\n        \"-     - \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Н\": {\n      \"ch\": \"Н\",\n      \"code\": 1053,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" ------ \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"О\": {\n      \"ch\": \"О\",\n      \"code\": 1054,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"  ----  \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \"  ----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"П\": {\n      \"ch\": \"П\",\n      \"code\": 1055,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \" ------ \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Р\": {\n      \"ch\": \"Р\",\n      \"code\": 1056,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \" -----  \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -----  \",\n        \" -      \",\n        \" -      \",\n        \" -      \",\n        \" -      \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"С\": {\n      \"ch\": \"С\",\n      \"code\": 1057,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"  ----  \",\n        \" -    - \",\n        \" -    - \",\n        \" -      \",\n        \" -      \",\n        \" -      \",\n        \" -      \",\n        \" -    - \",\n        \" -    - \",\n        \"  ----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Т\": {\n      \"ch\": \"Т\",\n      \"code\": 1058,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"------- \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"У\": {\n      \"ch\": \"У\",\n      \"code\": 1059,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \"  ----- \",\n        \"      - \",\n        \"      - \",\n        \"      - \",\n        \"  ----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ф\": {\n      \"ch\": \"Ф\",\n      \"code\": 1060,\n      \"map\": [\n        \"        \",\n        \"   -    \",\n        \" -----  \",\n        \"-  -  - \",\n        \"-  -  - \",\n        \"-  -  - \",\n        \"-  -  - \",\n        \"-  -  - \",\n        \"-  -  - \",\n        \"-  -  - \",\n        \"-  -  - \",\n        \" -----  \",\n        \"   -    \",\n        \"        \"\n      ]\n    },\n    \"Х\": {\n      \"ch\": \"Х\",\n      \"code\": 1061,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \" -    - \",\n        \" -    - \",\n        \"  -  -  \",\n        \"  -  -  \",\n        \"   --   \",\n        \"   --   \",\n        \"  -  -  \",\n        \"  -  -  \",\n        \" -    - \",\n        \" -    - \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ц\": {\n      \"ch\": \"Ц\",\n      \"code\": 1062,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \"  ------\",\n        \"       -\",\n        \"       -\"\n      ]\n    },\n    \"Ч\": {\n      \"ch\": \"Ч\",\n      \"code\": 1063,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \"  ----- \",\n        \"      - \",\n        \"      - \",\n        \"      - \",\n        \"      - \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ш\": {\n      \"ch\": \"Ш\",\n      \"code\": 1064,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"-  -  - \",\n        \"-  -  - \",\n        \"-  -  - \",\n        \"-  -  - \",\n        \"-  -  - \",\n        \"-  -  - \",\n        \"-  -  - \",\n        \"-  -  - \",\n        \"-  -  - \",\n        \" ------ \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Щ\": {\n      \"ch\": \"Щ\",\n      \"code\": 1065,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"-  -  - \",\n        \"-  -  - \",\n        \"-  -  - \",\n        \"-  -  - \",\n        \"-  -  - \",\n        \"-  -  - \",\n        \"-  -  - \",\n        \"-  -  - \",\n        \"-  -  - \",\n        \" -------\",\n        \"       -\",\n        \"       -\"\n      ]\n    },\n    \"Ъ\": {\n      \"ch\": \"Ъ\",\n      \"code\": 1066,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"--      \",\n        \" -      \",\n        \" -      \",\n        \" -----  \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ы\": {\n      \"ch\": \"Ы\",\n      \"code\": 1067,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"-     - \",\n        \"-     - \",\n        \"-     - \",\n        \"----  - \",\n        \"-   - - \",\n        \"-   - - \",\n        \"-   - - \",\n        \"-   - - \",\n        \"-   - - \",\n        \"----  - \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ь\": {\n      \"ch\": \"Ь\",\n      \"code\": 1068,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \" -      \",\n        \" -      \",\n        \" -      \",\n        \" -----  \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Э\": {\n      \"ch\": \"Э\",\n      \"code\": 1069,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"  ----  \",\n        \" -    - \",\n        \"      - \",\n        \"      - \",\n        \"   ---- \",\n        \"      - \",\n        \"      - \",\n        \"      - \",\n        \" -    - \",\n        \"  ----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ю\": {\n      \"ch\": \"Ю\",\n      \"code\": 1070,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"-   --  \",\n        \"-  -  - \",\n        \"-  -  - \",\n        \"-  -  - \",\n        \"-  -  - \",\n        \"----  - \",\n        \"-  -  - \",\n        \"-  -  - \",\n        \"-  -  - \",\n        \"-   --  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Я\": {\n      \"ch\": \"Я\",\n      \"code\": 1071,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"  ----- \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \"  ----- \",\n        \"    - - \",\n        \"   -  - \",\n        \"  -   - \",\n        \" -    - \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"а\": {\n      \"ch\": \"а\",\n      \"code\": 1072,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"  ----  \",\n        \"      - \",\n        \"  ----- \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \"  ----- \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"б\": {\n      \"ch\": \"б\",\n      \"code\": 1073,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"  ----  \",\n        \" -      \",\n        \" -      \",\n        \" -----  \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"в\": {\n      \"ch\": \"в\",\n      \"code\": 1074,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"  ---   \",\n        \" -   -  \",\n        \" -   -  \",\n        \" -  -   \",\n        \" -----  \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"г\": {\n      \"ch\": \"г\",\n      \"code\": 1075,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \" ------ \",\n        \" -      \",\n        \" -      \",\n        \" -      \",\n        \" -      \",\n        \" -      \",\n        \" -      \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"д\": {\n      \"ch\": \"д\",\n      \"code\": 1076,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"  ----- \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \"  ----- \",\n        \"      - \",\n        \"  ----  \"\n      ]\n    },\n    \"е\": {\n      \"ch\": \"е\",\n      \"code\": 1077,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"  ----  \",\n        \" -    - \",\n        \" -    - \",\n        \" ------ \",\n        \" -      \",\n        \" -      \",\n        \"  ----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ж\": {\n      \"ch\": \"ж\",\n      \"code\": 1078,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"-  -  - \",\n        \"-  -  - \",\n        \" - - -  \",\n        \"  ---   \",\n        \" - - -  \",\n        \"-  -  - \",\n        \"-  -  - \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"з\": {\n      \"ch\": \"з\",\n      \"code\": 1079,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"  ----  \",\n        \" -    - \",\n        \"      - \",\n        \"   ---  \",\n        \"      - \",\n        \" -    - \",\n        \"  ----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"и\": {\n      \"ch\": \"и\",\n      \"code\": 1080,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \"  ----- \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"й\": {\n      \"ch\": \"й\",\n      \"code\": 1081,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"  -  -  \",\n        \"   --   \",\n        \"        \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \"  ----- \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"к\": {\n      \"ch\": \"к\",\n      \"code\": 1082,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \" -    - \",\n        \" -   -  \",\n        \" -  -   \",\n        \" ---    \",\n        \" -  -   \",\n        \" -   -  \",\n        \" -    - \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"л\": {\n      \"ch\": \"л\",\n      \"code\": 1083,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"   ---- \",\n        \"  -   - \",\n        \"  -   - \",\n        \"  -   - \",\n        \"  -   - \",\n        \"  -   - \",\n        \" -    - \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"м\": {\n      \"ch\": \"м\",\n      \"code\": 1084,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"-     - \",\n        \"--   -- \",\n        \"- - - - \",\n        \"-  -  - \",\n        \"-     - \",\n        \"-     - \",\n        \"-     - \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"н\": {\n      \"ch\": \"н\",\n      \"code\": 1085,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" ------ \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"о\": {\n      \"ch\": \"о\",\n      \"code\": 1086,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"  ----  \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \"  ----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"п\": {\n      \"ch\": \"п\",\n      \"code\": 1087,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \" ------ \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"р\": {\n      \"ch\": \"р\",\n      \"code\": 1088,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \" -----  \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -----  \",\n        \" -      \",\n        \" -      \"\n      ]\n    },\n    \"с\": {\n      \"ch\": \"с\",\n      \"code\": 1089,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"  ----  \",\n        \" -    - \",\n        \" -      \",\n        \" -      \",\n        \" -      \",\n        \" -    - \",\n        \"  ----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"т\": {\n      \"ch\": \"т\",\n      \"code\": 1090,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"------- \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"у\": {\n      \"ch\": \"у\",\n      \"code\": 1091,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \"  ----- \",\n        \"      - \",\n        \"  ----  \"\n      ]\n    },\n    \"ф\": {\n      \"ch\": \"ф\",\n      \"code\": 1092,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"   -    \",\n        \" -----  \",\n        \"-  -  - \",\n        \"-  -  - \",\n        \"-  -  - \",\n        \"-  -  - \",\n        \"-  -  - \",\n        \" -----  \",\n        \"   -    \",\n        \"        \"\n      ]\n    },\n    \"х\": {\n      \"ch\": \"х\",\n      \"code\": 1093,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \" -    - \",\n        \" -    - \",\n        \"  -  -  \",\n        \"   --   \",\n        \"  -  -  \",\n        \" -    - \",\n        \" -    - \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ц\": {\n      \"ch\": \"ц\",\n      \"code\": 1094,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \"  ------\",\n        \"       -\",\n        \"       -\"\n      ]\n    },\n    \"ч\": {\n      \"ch\": \"ч\",\n      \"code\": 1095,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \"  ----- \",\n        \"      - \",\n        \"      - \",\n        \"      - \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ш\": {\n      \"ch\": \"ш\",\n      \"code\": 1096,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"-  -  - \",\n        \"-  -  - \",\n        \"-  -  - \",\n        \"-  -  - \",\n        \"-  -  - \",\n        \"-  -  - \",\n        \" ------ \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"щ\": {\n      \"ch\": \"щ\",\n      \"code\": 1097,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"-  -  - \",\n        \"-  -  - \",\n        \"-  -  - \",\n        \"-  -  - \",\n        \"-  -  - \",\n        \"-  -  - \",\n        \" -------\",\n        \"       -\",\n        \"       -\"\n      ]\n    },\n    \"ъ\": {\n      \"ch\": \"ъ\",\n      \"code\": 1098,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \" --     \",\n        \"  -     \",\n        \"  ----  \",\n        \"  -   - \",\n        \"  -   - \",\n        \"  -   - \",\n        \"  ----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ы\": {\n      \"ch\": \"ы\",\n      \"code\": 1099,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"-     - \",\n        \"-     - \",\n        \"----  - \",\n        \"-   - - \",\n        \"-   - - \",\n        \"-   - - \",\n        \"----  - \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ь\": {\n      \"ch\": \"ь\",\n      \"code\": 1100,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \" -      \",\n        \" -      \",\n        \" ----   \",\n        \" -   -  \",\n        \" -   -  \",\n        \" -   -  \",\n        \" ----   \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"э\": {\n      \"ch\": \"э\",\n      \"code\": 1101,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"  ----  \",\n        \" -    - \",\n        \"      - \",\n        \"   ---- \",\n        \"      - \",\n        \" -    - \",\n        \"  ----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ю\": {\n      \"ch\": \"ю\",\n      \"code\": 1102,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"-   --  \",\n        \"-  -  - \",\n        \"-  -  - \",\n        \"----  - \",\n        \"-  -  - \",\n        \"-  -  - \",\n        \"-   --  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"я\": {\n      \"ch\": \"я\",\n      \"code\": 1103,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"  ----- \",\n        \" -    - \",\n        \" -    - \",\n        \"  ----- \",\n        \"   -  - \",\n        \"  -   - \",\n        \" -    - \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ѐ\": {\n      \"ch\": \"ѐ\",\n      \"code\": 1104,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"   -    \",\n        \"    -   \",\n        \"        \",\n        \"  ----  \",\n        \" -    - \",\n        \" -    - \",\n        \" ------ \",\n        \" -      \",\n        \" -      \",\n        \"  ----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ё\": {\n      \"ch\": \"ё\",\n      \"code\": 1105,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"  -  -  \",\n        \"  -  -  \",\n        \"        \",\n        \"  ----  \",\n        \" -    - \",\n        \" -    - \",\n        \" ------ \",\n        \" -      \",\n        \" -      \",\n        \"  ----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ђ\": {\n      \"ch\": \"ђ\",\n      \"code\": 1106,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \" -      \",\n        \"-----   \",\n        \" -      \",\n        \" -----  \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \"      - \",\n        \"    --  \"\n      ]\n    },\n    \"ѓ\": {\n      \"ch\": \"ѓ\",\n      \"code\": 1107,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"    -   \",\n        \"   -    \",\n        \"        \",\n        \" ------ \",\n        \" -      \",\n        \" -      \",\n        \" -      \",\n        \" -      \",\n        \" -      \",\n        \" -      \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"є\": {\n      \"ch\": \"є\",\n      \"code\": 1108,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"  ----  \",\n        \" -    - \",\n        \" -      \",\n        \" ----   \",\n        \" -      \",\n        \" -    - \",\n        \"  ----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ѕ\": {\n      \"ch\": \"ѕ\",\n      \"code\": 1109,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"  ----- \",\n        \" -      \",\n        \" -      \",\n        \"  ----  \",\n        \"      - \",\n        \"      - \",\n        \" -----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"і\": {\n      \"ch\": \"і\",\n      \"code\": 1110,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"   -    \",\n        \"   -    \",\n        \"        \",\n        \"  --    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"  ---   \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ї\": {\n      \"ch\": \"ї\",\n      \"code\": 1111,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \" -  -   \",\n        \" -  -   \",\n        \"        \",\n        \"  --    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"  ---   \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ј\": {\n      \"ch\": \"ј\",\n      \"code\": 1112,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"     -  \",\n        \"     -  \",\n        \"        \",\n        \"    --  \",\n        \"     -  \",\n        \"     -  \",\n        \"     -  \",\n        \"     -  \",\n        \"     -  \",\n        \" -   -  \",\n        \" -   -  \",\n        \"  ---   \"\n      ]\n    },\n    \"љ\": {\n      \"ch\": \"љ\",\n      \"code\": 1113,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \" ---    \",\n        \"-  -    \",\n        \"-  ---  \",\n        \"-  -  - \",\n        \"-  -  - \",\n        \"-  -  - \",\n        \"-  ---  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"њ\": {\n      \"ch\": \"њ\",\n      \"code\": 1114,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"-  -    \",\n        \"-  -    \",\n        \"-  ---  \",\n        \"----  - \",\n        \"-  -  - \",\n        \"-  -  - \",\n        \"-  ---  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ћ\": {\n      \"ch\": \"ћ\",\n      \"code\": 1115,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \" -      \",\n        \"-----   \",\n        \" -      \",\n        \" -----  \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ќ\": {\n      \"ch\": \"ќ\",\n      \"code\": 1116,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"    -   \",\n        \"   -    \",\n        \"        \",\n        \" -    - \",\n        \" -   -  \",\n        \" -  -   \",\n        \" ---    \",\n        \" -  -   \",\n        \" -   -  \",\n        \" -    - \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ѝ\": {\n      \"ch\": \"ѝ\",\n      \"code\": 1117,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"   -    \",\n        \"    -   \",\n        \"        \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \"  ----- \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ў\": {\n      \"ch\": \"ў\",\n      \"code\": 1118,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"  -  -  \",\n        \"   --   \",\n        \"        \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \"  ----- \",\n        \"      - \",\n        \"  ----  \"\n      ]\n    },\n    \"џ\": {\n      \"ch\": \"џ\",\n      \"code\": 1119,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" ------ \",\n        \"   --   \",\n        \"   --   \"\n      ]\n    },\n    \"Ґ\": {\n      \"ch\": \"Ґ\",\n      \"code\": 1168,\n      \"map\": [\n        \"      - \",\n        \"      - \",\n        \" ------ \",\n        \" -      \",\n        \" -      \",\n        \" -      \",\n        \" -      \",\n        \" -      \",\n        \" -      \",\n        \" -      \",\n        \" -      \",\n        \" -      \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ґ\": {\n      \"ch\": \"ґ\",\n      \"code\": 1169,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"      - \",\n        \"      - \",\n        \" ------ \",\n        \" -      \",\n        \" -      \",\n        \" -      \",\n        \" -      \",\n        \" -      \",\n        \" -      \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ғ\": {\n      \"ch\": \"Ғ\",\n      \"code\": 1170,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \" ------ \",\n        \" -      \",\n        \" -      \",\n        \" -      \",\n        \"-----   \",\n        \" -      \",\n        \" -      \",\n        \" -      \",\n        \" -      \",\n        \" -      \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ғ\": {\n      \"ch\": \"ғ\",\n      \"code\": 1171,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \" ------ \",\n        \" -      \",\n        \" -      \",\n        \"-----   \",\n        \" -      \",\n        \" -      \",\n        \" -      \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ҕ\": {\n      \"ch\": \"Ҕ\",\n      \"code\": 1172,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \" ------ \",\n        \" -      \",\n        \" -      \",\n        \" -      \",\n        \" -      \",\n        \" -----  \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \"      - \",\n        \"     -  \"\n      ]\n    },\n    \"ҕ\": {\n      \"ch\": \"ҕ\",\n      \"code\": 1173,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \" ------ \",\n        \" -      \",\n        \" -      \",\n        \" ----   \",\n        \" -   -  \",\n        \" -   -  \",\n        \" -   -  \",\n        \"     -  \",\n        \"    -   \"\n      ]\n    },\n    \"Җ\": {\n      \"ch\": \"Җ\",\n      \"code\": 1174,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"-  -  - \",\n        \"-  -  - \",\n        \"-  -  - \",\n        \" - - -  \",\n        \"  ---   \",\n        \" - - -  \",\n        \"-  -  - \",\n        \"-  -  - \",\n        \"-  -  - \",\n        \"-  -  --\",\n        \"       -\",\n        \"       -\"\n      ]\n    },\n    \"җ\": {\n      \"ch\": \"җ\",\n      \"code\": 1175,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"-  -  - \",\n        \"-  -  - \",\n        \" - - -  \",\n        \"  ---   \",\n        \" - - -  \",\n        \"-  -  - \",\n        \"-  -  --\",\n        \"       -\",\n        \"       -\"\n      ]\n    },\n    \"Ҙ\": {\n      \"ch\": \"Ҙ\",\n      \"code\": 1176,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"  ----  \",\n        \" -    - \",\n        \" -    - \",\n        \"      - \",\n        \"   ---  \",\n        \"      - \",\n        \"      - \",\n        \" -    - \",\n        \" -    - \",\n        \"  ----  \",\n        \"   -    \",\n        \"   -    \"\n      ]\n    },\n    \"ҙ\": {\n      \"ch\": \"ҙ\",\n      \"code\": 1177,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"  ----  \",\n        \" -    - \",\n        \"      - \",\n        \"   ---  \",\n        \"      - \",\n        \" -    - \",\n        \"  ----  \",\n        \"   -    \",\n        \"   -    \"\n      ]\n    },\n    \"Қ\": {\n      \"ch\": \"Қ\",\n      \"code\": 1178,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \" -    - \",\n        \" -   -  \",\n        \" -  -   \",\n        \" - -    \",\n        \" --     \",\n        \" --     \",\n        \" - -    \",\n        \" -  -   \",\n        \" -   -  \",\n        \" -    --\",\n        \"       -\",\n        \"       -\"\n      ]\n    },\n    \"қ\": {\n      \"ch\": \"қ\",\n      \"code\": 1179,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \" -    - \",\n        \" -   -  \",\n        \" -  -   \",\n        \" ---    \",\n        \" -  -   \",\n        \" -   -  \",\n        \" -    --\",\n        \"       -\",\n        \"       -\"\n      ]\n    },\n    \"Ҝ\": {\n      \"ch\": \"Ҝ\",\n      \"code\": 1180,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \" -    - \",\n        \" -    - \",\n        \" - - -  \",\n        \" - --   \",\n        \" ---    \",\n        \" ---    \",\n        \" - --   \",\n        \" - - -  \",\n        \" -    - \",\n        \" -    - \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ҝ\": {\n      \"ch\": \"ҝ\",\n      \"code\": 1181,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \" -    - \",\n        \" - - -  \",\n        \" - --   \",\n        \" ---    \",\n        \" - --   \",\n        \" - - -  \",\n        \" -    - \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ҡ\": {\n      \"ch\": \"Ҡ\",\n      \"code\": 1184,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"--    - \",\n        \" -   -  \",\n        \" -  -   \",\n        \" - -    \",\n        \" --     \",\n        \" --     \",\n        \" - -    \",\n        \" -  -   \",\n        \" -   -  \",\n        \" -    - \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ҡ\": {\n      \"ch\": \"ҡ\",\n      \"code\": 1185,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"--    - \",\n        \" -   -  \",\n        \" -  -   \",\n        \" ---    \",\n        \" -  -   \",\n        \" -   -  \",\n        \" -    - \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ң\": {\n      \"ch\": \"Ң\",\n      \"code\": 1186,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" ------ \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    --\",\n        \"       -\",\n        \"       -\"\n      ]\n    },\n    \"ң\": {\n      \"ch\": \"ң\",\n      \"code\": 1187,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" ------ \",\n        \" -    - \",\n        \" -    - \",\n        \" -    --\",\n        \"       -\",\n        \"       -\"\n      ]\n    },\n    \"Ҥ\": {\n      \"ch\": \"Ҥ\",\n      \"code\": 1188,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \" -   ---\",\n        \" -   -  \",\n        \" -   -  \",\n        \" -   -  \",\n        \" -----  \",\n        \" -   -  \",\n        \" -   -  \",\n        \" -   -  \",\n        \" -   -  \",\n        \" -   -  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ҥ\": {\n      \"ch\": \"ҥ\",\n      \"code\": 1189,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \" -   ---\",\n        \" -   -  \",\n        \" -   -  \",\n        \" -----  \",\n        \" -   -  \",\n        \" -   -  \",\n        \" -   -  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ҫ\": {\n      \"ch\": \"Ҫ\",\n      \"code\": 1194,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"  ----  \",\n        \" -    - \",\n        \" -    - \",\n        \" -      \",\n        \" -      \",\n        \" -      \",\n        \" -      \",\n        \" -    - \",\n        \" -    - \",\n        \"  ----  \",\n        \"   -    \",\n        \"   -    \"\n      ]\n    },\n    \"ҫ\": {\n      \"ch\": \"ҫ\",\n      \"code\": 1195,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"  ----  \",\n        \" -    - \",\n        \" -      \",\n        \" -      \",\n        \" -      \",\n        \" -    - \",\n        \"  ----  \",\n        \"   -    \",\n        \"   -    \"\n      ]\n    },\n    \"Ү\": {\n      \"ch\": \"Ү\",\n      \"code\": 1198,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"-     - \",\n        \"-     - \",\n        \" -   -  \",\n        \" -   -  \",\n        \"  - -   \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ү\": {\n      \"ch\": \"ү\",\n      \"code\": 1199,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"-     - \",\n        \"-     - \",\n        \" -   -  \",\n        \" -   -  \",\n        \"  - -   \",\n        \"  - -   \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \"\n      ]\n    },\n    \"Ұ\": {\n      \"ch\": \"Ұ\",\n      \"code\": 1200,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"-     - \",\n        \"-     - \",\n        \" -   -  \",\n        \" -   -  \",\n        \"  - -   \",\n        \"   -    \",\n        \" -----  \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ұ\": {\n      \"ch\": \"ұ\",\n      \"code\": 1201,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"-     - \",\n        \"-     - \",\n        \" -   -  \",\n        \" -   -  \",\n        \"  - -   \",\n        \"  - -   \",\n        \"   -    \",\n        \" -----  \",\n        \"   -    \"\n      ]\n    },\n    \"Ҳ\": {\n      \"ch\": \"Ҳ\",\n      \"code\": 1202,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \" -    - \",\n        \" -    - \",\n        \"  -  -  \",\n        \"  -  -  \",\n        \"   --   \",\n        \"   --   \",\n        \"  -  -  \",\n        \"  -  -  \",\n        \" -    - \",\n        \" -    --\",\n        \"       -\",\n        \"       -\"\n      ]\n    },\n    \"ҳ\": {\n      \"ch\": \"ҳ\",\n      \"code\": 1203,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \" -    - \",\n        \" -    - \",\n        \"  -  -  \",\n        \"   --   \",\n        \"  -  -  \",\n        \" -    - \",\n        \" -    --\",\n        \"       -\",\n        \"       -\"\n      ]\n    },\n    \"Ҷ\": {\n      \"ch\": \"Ҷ\",\n      \"code\": 1206,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \"  ----- \",\n        \"      - \",\n        \"      - \",\n        \"      - \",\n        \"      --\",\n        \"       -\",\n        \"       -\"\n      ]\n    },\n    \"ҷ\": {\n      \"ch\": \"ҷ\",\n      \"code\": 1207,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \"  ----- \",\n        \"      - \",\n        \"      - \",\n        \"      --\",\n        \"       -\",\n        \"       -\"\n      ]\n    },\n    \"Ҹ\": {\n      \"ch\": \"Ҹ\",\n      \"code\": 1208,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -  - - \",\n        \" -  - - \",\n        \"  ----- \",\n        \"    - - \",\n        \"    - - \",\n        \"      - \",\n        \"      - \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ҹ\": {\n      \"ch\": \"ҹ\",\n      \"code\": 1209,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \" -    - \",\n        \" -  - - \",\n        \" -  - - \",\n        \"  ----- \",\n        \"    - - \",\n        \"      - \",\n        \"      - \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Һ\": {\n      \"ch\": \"Һ\",\n      \"code\": 1210,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \" -      \",\n        \" -      \",\n        \" -      \",\n        \" -      \",\n        \" -----  \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"һ\": {\n      \"ch\": \"һ\",\n      \"code\": 1211,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \" -      \",\n        \" -      \",\n        \" -----  \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ӑ\": {\n      \"ch\": \"Ӑ\",\n      \"code\": 1232,\n      \"map\": [\n        \"  -  -  \",\n        \"   --   \",\n        \"        \",\n        \"  ----  \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" ------ \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ӑ\": {\n      \"ch\": \"ӑ\",\n      \"code\": 1233,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"  -  -  \",\n        \"   --   \",\n        \"        \",\n        \"  ----  \",\n        \"      - \",\n        \"  ----- \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \"  ----- \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ӓ\": {\n      \"ch\": \"Ӓ\",\n      \"code\": 1234,\n      \"map\": [\n        \"  -  -  \",\n        \"  -  -  \",\n        \"        \",\n        \"  ----  \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" ------ \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ӓ\": {\n      \"ch\": \"ӓ\",\n      \"code\": 1235,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"  -  -  \",\n        \"  -  -  \",\n        \"        \",\n        \"  ----  \",\n        \"      - \",\n        \"  ----- \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \"  ----- \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ӕ\": {\n      \"ch\": \"Ӕ\",\n      \"code\": 1236,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \" ------ \",\n        \"-  -    \",\n        \"-  -    \",\n        \"-  -    \",\n        \"------  \",\n        \"-  -    \",\n        \"-  -    \",\n        \"-  -    \",\n        \"-  -    \",\n        \"-  ---- \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ӕ\": {\n      \"ch\": \"ӕ\",\n      \"code\": 1237,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \" -- --  \",\n        \"   -  - \",\n        \" ---  - \",\n        \"-  ---- \",\n        \"-  -    \",\n        \"-  -    \",\n        \" -- --  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ӗ\": {\n      \"ch\": \"Ӗ\",\n      \"code\": 1238,\n      \"map\": [\n        \"  -  -  \",\n        \"   --   \",\n        \"        \",\n        \" ------ \",\n        \" -      \",\n        \" -      \",\n        \" -      \",\n        \" ----   \",\n        \" -      \",\n        \" -      \",\n        \" -      \",\n        \" ------ \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ӗ\": {\n      \"ch\": \"ӗ\",\n      \"code\": 1239,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"  -  -  \",\n        \"   --   \",\n        \"        \",\n        \"  ----  \",\n        \" -    - \",\n        \" -    - \",\n        \" ------ \",\n        \" -      \",\n        \" -      \",\n        \"  ----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ә\": {\n      \"ch\": \"Ә\",\n      \"code\": 1240,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"  ----  \",\n        \" -    - \",\n        \"      - \",\n        \"      - \",\n        \" ------ \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \"  ----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ә\": {\n      \"ch\": \"ә\",\n      \"code\": 1241,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"  ----  \",\n        \"      - \",\n        \"      - \",\n        \" ------ \",\n        \" -    - \",\n        \" -    - \",\n        \"  ----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ӛ\": {\n      \"ch\": \"Ӛ\",\n      \"code\": 1242,\n      \"map\": [\n        \"  -  -  \",\n        \"  -  -  \",\n        \"        \",\n        \"  ----  \",\n        \" -    - \",\n        \"      - \",\n        \"      - \",\n        \" ------ \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \"  ----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ӛ\": {\n      \"ch\": \"ӛ\",\n      \"code\": 1243,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"  -  -  \",\n        \"  -  -  \",\n        \"        \",\n        \"  ----  \",\n        \"      - \",\n        \"      - \",\n        \" ------ \",\n        \" -    - \",\n        \" -    - \",\n        \"  ----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ӝ\": {\n      \"ch\": \"Ӝ\",\n      \"code\": 1244,\n      \"map\": [\n        \" -   -  \",\n        \" -   -  \",\n        \"        \",\n        \"-  -  - \",\n        \"-  -  - \",\n        \"-  -  - \",\n        \" - - -  \",\n        \"  ---   \",\n        \" - - -  \",\n        \"-  -  - \",\n        \"-  -  - \",\n        \"-  -  - \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ӝ\": {\n      \"ch\": \"ӝ\",\n      \"code\": 1245,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \" -   -  \",\n        \" -   -  \",\n        \"        \",\n        \"-  -  - \",\n        \"-  -  - \",\n        \" - - -  \",\n        \"  ---   \",\n        \" - - -  \",\n        \"-  -  - \",\n        \"-  -  - \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ӟ\": {\n      \"ch\": \"Ӟ\",\n      \"code\": 1246,\n      \"map\": [\n        \"  -  -  \",\n        \"  -  -  \",\n        \"        \",\n        \"  ----  \",\n        \" -    - \",\n        \" -    - \",\n        \"      - \",\n        \"   ---  \",\n        \"      - \",\n        \" -    - \",\n        \" -    - \",\n        \"  ----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ӟ\": {\n      \"ch\": \"ӟ\",\n      \"code\": 1247,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"  -  -  \",\n        \"  -  -  \",\n        \"        \",\n        \"  ----  \",\n        \" -    - \",\n        \"      - \",\n        \"   ---  \",\n        \"      - \",\n        \" -    - \",\n        \"  ----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ӣ\": {\n      \"ch\": \"Ӣ\",\n      \"code\": 1250,\n      \"map\": [\n        \"  ----  \",\n        \"        \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -   -- \",\n        \" -  - - \",\n        \" - -  - \",\n        \" --   - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ӣ\": {\n      \"ch\": \"ӣ\",\n      \"code\": 1251,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"  ----  \",\n        \"        \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \"  ----- \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ӥ\": {\n      \"ch\": \"Ӥ\",\n      \"code\": 1252,\n      \"map\": [\n        \"  -  -  \",\n        \"  -  -  \",\n        \"        \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -   -- \",\n        \" -  - - \",\n        \" - -  - \",\n        \" --   - \",\n        \" -    - \",\n        \" -    - \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ӥ\": {\n      \"ch\": \"ӥ\",\n      \"code\": 1253,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"  -  -  \",\n        \"  -  -  \",\n        \"        \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \"  ----- \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ӧ\": {\n      \"ch\": \"Ӧ\",\n      \"code\": 1254,\n      \"map\": [\n        \"  -  -  \",\n        \"  -  -  \",\n        \"        \",\n        \"  ----  \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \"  ----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ӧ\": {\n      \"ch\": \"ӧ\",\n      \"code\": 1255,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"  -  -  \",\n        \"  -  -  \",\n        \"        \",\n        \"  ----  \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \"  ----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ө\": {\n      \"ch\": \"Ө\",\n      \"code\": 1256,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"  ----  \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" ------ \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \"  ----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ө\": {\n      \"ch\": \"ө\",\n      \"code\": 1257,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"  ----  \",\n        \" -    - \",\n        \" -    - \",\n        \" ------ \",\n        \" -    - \",\n        \" -    - \",\n        \"  ----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ӫ\": {\n      \"ch\": \"Ӫ\",\n      \"code\": 1258,\n      \"map\": [\n        \"  -  -  \",\n        \"  -  -  \",\n        \"        \",\n        \"  ----  \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" ------ \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \"  ----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ӫ\": {\n      \"ch\": \"ӫ\",\n      \"code\": 1259,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"  -  -  \",\n        \"  -  -  \",\n        \"        \",\n        \"  ----  \",\n        \" -    - \",\n        \" -    - \",\n        \" ------ \",\n        \" -    - \",\n        \" -    - \",\n        \"  ----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ӭ\": {\n      \"ch\": \"Ӭ\",\n      \"code\": 1260,\n      \"map\": [\n        \"  -  -  \",\n        \"  -  -  \",\n        \"        \",\n        \"  ----  \",\n        \" -    - \",\n        \"      - \",\n        \"      - \",\n        \"   ---- \",\n        \"      - \",\n        \"      - \",\n        \" -    - \",\n        \"  ----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ӭ\": {\n      \"ch\": \"ӭ\",\n      \"code\": 1261,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"  -  -  \",\n        \"  -  -  \",\n        \"        \",\n        \"  ----  \",\n        \" -    - \",\n        \"      - \",\n        \"   ---- \",\n        \"      - \",\n        \" -    - \",\n        \"  ----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ӯ\": {\n      \"ch\": \"Ӯ\",\n      \"code\": 1262,\n      \"map\": [\n        \"  ----  \",\n        \"        \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \"  ----- \",\n        \"      - \",\n        \"      - \",\n        \"      - \",\n        \"  ----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ӯ\": {\n      \"ch\": \"ӯ\",\n      \"code\": 1263,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"  ----  \",\n        \"        \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \"  ----- \",\n        \"      - \",\n        \"  ----  \"\n      ]\n    },\n    \"Ӱ\": {\n      \"ch\": \"Ӱ\",\n      \"code\": 1264,\n      \"map\": [\n        \"  -  -  \",\n        \"  -  -  \",\n        \"        \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \"  ----- \",\n        \"      - \",\n        \"      - \",\n        \"      - \",\n        \"  ----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ӱ\": {\n      \"ch\": \"ӱ\",\n      \"code\": 1265,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"  -  -  \",\n        \"  -  -  \",\n        \"        \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \"  ----- \",\n        \"      - \",\n        \"  ----  \"\n      ]\n    },\n    \"Ӳ\": {\n      \"ch\": \"Ӳ\",\n      \"code\": 1266,\n      \"map\": [\n        \"   -  - \",\n        \"  -  -  \",\n        \"        \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \"  ----- \",\n        \"      - \",\n        \"      - \",\n        \"      - \",\n        \"  ----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ӳ\": {\n      \"ch\": \"ӳ\",\n      \"code\": 1267,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"   -  - \",\n        \"  -  -  \",\n        \"        \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \"  ----- \",\n        \"      - \",\n        \"  ----  \"\n      ]\n    },\n    \"Ӵ\": {\n      \"ch\": \"Ӵ\",\n      \"code\": 1268,\n      \"map\": [\n        \"  -  -  \",\n        \"  -  -  \",\n        \"        \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \"  ----- \",\n        \"      - \",\n        \"      - \",\n        \"      - \",\n        \"      - \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ӵ\": {\n      \"ch\": \"ӵ\",\n      \"code\": 1269,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"  -  -  \",\n        \"  -  -  \",\n        \"        \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \"  ----- \",\n        \"      - \",\n        \"      - \",\n        \"      - \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ӹ\": {\n      \"ch\": \"Ӹ\",\n      \"code\": 1272,\n      \"map\": [\n        \" -  -   \",\n        \" -  -   \",\n        \"        \",\n        \"-     - \",\n        \"-     - \",\n        \"-     - \",\n        \"----  - \",\n        \"-   - - \",\n        \"-   - - \",\n        \"-   - - \",\n        \"-   - - \",\n        \"----  - \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ӹ\": {\n      \"ch\": \"ӹ\",\n      \"code\": 1273,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \" -  -   \",\n        \" -  -   \",\n        \"        \",\n        \"-     - \",\n        \"-     - \",\n        \"----  - \",\n        \"-   - - \",\n        \"-   - - \",\n        \"-   - - \",\n        \"----  - \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ḵ\": {\n      \"ch\": \"Ḵ\",\n      \"code\": 7732,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \" -    - \",\n        \" -   -  \",\n        \" -  -   \",\n        \" - -    \",\n        \" --     \",\n        \" --     \",\n        \" - -    \",\n        \" -  -   \",\n        \" -   -  \",\n        \" -    - \",\n        \"        \",\n        \"  ----  \"\n      ]\n    },\n    \"ḵ\": {\n      \"ch\": \"ḵ\",\n      \"code\": 7733,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \" -      \",\n        \" -      \",\n        \" -      \",\n        \" -    - \",\n        \" -   -  \",\n        \" -  -   \",\n        \" ---    \",\n        \" -  -   \",\n        \" -   -  \",\n        \" -    - \",\n        \"        \",\n        \"  ----  \"\n      ]\n    },\n    \"Ẹ\": {\n      \"ch\": \"Ẹ\",\n      \"code\": 7864,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \" ------ \",\n        \" -      \",\n        \" -      \",\n        \" -      \",\n        \" ----   \",\n        \" -      \",\n        \" -      \",\n        \" -      \",\n        \" -      \",\n        \" ------ \",\n        \"   -    \",\n        \"   -    \"\n      ]\n    },\n    \"ẹ\": {\n      \"ch\": \"ẹ\",\n      \"code\": 7865,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"  ----  \",\n        \" -    - \",\n        \" -    - \",\n        \" ------ \",\n        \" -      \",\n        \" -      \",\n        \"  ----  \",\n        \"   -    \",\n        \"   -    \"\n      ]\n    },\n    \"Ẽ\": {\n      \"ch\": \"Ẽ\",\n      \"code\": 7868,\n      \"map\": [\n        \"  --  - \",\n        \" -  --  \",\n        \"        \",\n        \" ------ \",\n        \" -      \",\n        \" -      \",\n        \" -      \",\n        \" ----   \",\n        \" -      \",\n        \" -      \",\n        \" -      \",\n        \" ------ \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ẽ\": {\n      \"ch\": \"ẽ\",\n      \"code\": 7869,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"  --  - \",\n        \" -  --  \",\n        \"        \",\n        \"  ----  \",\n        \" -    - \",\n        \" -    - \",\n        \" ------ \",\n        \" -      \",\n        \" -      \",\n        \"  ----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ị\": {\n      \"ch\": \"Ị\",\n      \"code\": 7882,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"  ---   \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"  ---   \",\n        \"   -    \",\n        \"   -    \"\n      ]\n    },\n    \"ị\": {\n      \"ch\": \"ị\",\n      \"code\": 7883,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"   -    \",\n        \"   -    \",\n        \"        \",\n        \"  --    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"  ---   \",\n        \"   -    \",\n        \"   -    \"\n      ]\n    },\n    \"Ọ\": {\n      \"ch\": \"Ọ\",\n      \"code\": 7884,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"  ----  \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \"  ----  \",\n        \"   -    \",\n        \"   -    \"\n      ]\n    },\n    \"ọ\": {\n      \"ch\": \"ọ\",\n      \"code\": 7885,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"  ----  \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \"  ----  \",\n        \"   -    \",\n        \"   -    \"\n      ]\n    },\n    \"Ụ\": {\n      \"ch\": \"Ụ\",\n      \"code\": 7908,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \"  ----  \",\n        \"   -    \",\n        \"   -    \"\n      ]\n    },\n    \"ụ\": {\n      \"ch\": \"ụ\",\n      \"code\": 7909,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \"  ----- \",\n        \"    -   \",\n        \"    -   \"\n      ]\n    },\n    \"Ỹ\": {\n      \"ch\": \"Ỹ\",\n      \"code\": 7928,\n      \"map\": [\n        \" --  -  \",\n        \"-  --   \",\n        \"        \",\n        \"-     - \",\n        \"-     - \",\n        \" -   -  \",\n        \" -   -  \",\n        \"  - -   \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ỹ\": {\n      \"ch\": \"ỹ\",\n      \"code\": 7929,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"  --  - \",\n        \" -  --  \",\n        \"        \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \"  ----- \",\n        \"      - \",\n        \"  ----  \"\n      ]\n    },\n    \" \": {\n      \"ch\": \" \",\n      \"code\": 8192,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \" \": {\n      \"ch\": \" \",\n      \"code\": 8193,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \" \": {\n      \"ch\": \" \",\n      \"code\": 8194,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \" \": {\n      \"ch\": \" \",\n      \"code\": 8195,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \" \": {\n      \"ch\": \" \",\n      \"code\": 8196,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \" \": {\n      \"ch\": \" \",\n      \"code\": 8197,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \" \": {\n      \"ch\": \" \",\n      \"code\": 8198,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \" \": {\n      \"ch\": \" \",\n      \"code\": 8199,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \" \": {\n      \"ch\": \" \",\n      \"code\": 8200,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \" \": {\n      \"ch\": \" \",\n      \"code\": 8201,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \" \": {\n      \"ch\": \" \",\n      \"code\": 8202,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"‐\": {\n      \"ch\": \"‐\",\n      \"code\": 8208,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"  ----  \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"‑\": {\n      \"ch\": \"‑\",\n      \"code\": 8209,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"  ----  \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"‒\": {\n      \"ch\": \"‒\",\n      \"code\": 8210,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \" ------ \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"–\": {\n      \"ch\": \"–\",\n      \"code\": 8211,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \" ------ \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"—\": {\n      \"ch\": \"—\",\n      \"code\": 8212,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"------- \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"―\": {\n      \"ch\": \"―\",\n      \"code\": 8213,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"------- \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"‖\": {\n      \"ch\": \"‖\",\n      \"code\": 8214,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"  - -   \",\n        \"  - -   \",\n        \"  - -   \",\n        \"  - -   \",\n        \"  - -   \",\n        \"  - -   \",\n        \"  - -   \",\n        \"  - -   \",\n        \"  - -   \",\n        \"  - -   \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"‗\": {\n      \"ch\": \"‗\",\n      \"code\": 8215,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \" ------ \",\n        \"        \",\n        \" ------ \"\n      ]\n    },\n    \"‘\": {\n      \"ch\": \"‘\",\n      \"code\": 8216,\n      \"map\": [\n        \"        \",\n        \"    -   \",\n        \"   -    \",\n        \"   -    \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"’\": {\n      \"ch\": \"’\",\n      \"code\": 8217,\n      \"map\": [\n        \"        \",\n        \"    -   \",\n        \"    -   \",\n        \"   -    \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"‚\": {\n      \"ch\": \"‚\",\n      \"code\": 8218,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"    -   \",\n        \"    -   \",\n        \"   -    \",\n        \"        \"\n      ]\n    },\n    \"‛\": {\n      \"ch\": \"‛\",\n      \"code\": 8219,\n      \"map\": [\n        \"        \",\n        \"   -    \",\n        \"   -    \",\n        \"    -   \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"“\": {\n      \"ch\": \"“\",\n      \"code\": 8220,\n      \"map\": [\n        \"        \",\n        \"   -  - \",\n        \"  -  -  \",\n        \"  -  -  \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"”\": {\n      \"ch\": \"”\",\n      \"code\": 8221,\n      \"map\": [\n        \"        \",\n        \"   -  - \",\n        \"   -  - \",\n        \"  -  -  \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"„\": {\n      \"ch\": \"„\",\n      \"code\": 8222,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"  -  -  \",\n        \"  -  -  \",\n        \" -  -   \",\n        \"        \"\n      ]\n    },\n    \"‟\": {\n      \"ch\": \"‟\",\n      \"code\": 8223,\n      \"map\": [\n        \"        \",\n        \" -  -   \",\n        \" -  -   \",\n        \"  -  -  \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"†\": {\n      \"ch\": \"†\",\n      \"code\": 8224,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"   -    \",\n        \"   -    \",\n        \" -----  \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"‡\": {\n      \"ch\": \"‡\",\n      \"code\": 8225,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"   -    \",\n        \"   -    \",\n        \" -----  \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \" -----  \",\n        \"   -    \",\n        \"   -    \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"•\": {\n      \"ch\": \"•\",\n      \"code\": 8226,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"   --   \",\n        \"  ----  \",\n        \"  ----  \",\n        \"   --   \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"…\": {\n      \"ch\": \"…\",\n      \"code\": 8230,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"-  -  - \",\n        \"-  -  - \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"‰\": {\n      \"ch\": \"‰\",\n      \"code\": 8240,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \" -  -   \",\n        \"- - -   \",\n        \" - -    \",\n        \"   -    \",\n        \"  -     \",\n        \"  -     \",\n        \" -      \",\n        \" - - -  \",\n        \"- - - - \",\n        \"-  - -  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"′\": {\n      \"ch\": \"′\",\n      \"code\": 8242,\n      \"map\": [\n        \"        \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"″\": {\n      \"ch\": \"″\",\n      \"code\": 8243,\n      \"map\": [\n        \"        \",\n        \"  -  -  \",\n        \"  -  -  \",\n        \"  -  -  \",\n        \"  -  -  \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"‹\": {\n      \"ch\": \"‹\",\n      \"code\": 8249,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"     -  \",\n        \"    -   \",\n        \"   -    \",\n        \"  -     \",\n        \"   -    \",\n        \"    -   \",\n        \"     -  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"›\": {\n      \"ch\": \"›\",\n      \"code\": 8250,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"  -     \",\n        \"   -    \",\n        \"    -   \",\n        \"     -  \",\n        \"    -   \",\n        \"   -    \",\n        \"  -     \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"‼\": {\n      \"ch\": \"‼\",\n      \"code\": 8252,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"  -  -  \",\n        \"  -  -  \",\n        \"  -  -  \",\n        \"  -  -  \",\n        \"  -  -  \",\n        \"  -  -  \",\n        \"  -  -  \",\n        \"        \",\n        \"  -  -  \",\n        \"  -  -  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"‾\": {\n      \"ch\": \"‾\",\n      \"code\": 8254,\n      \"map\": [\n        \" ------ \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ⁿ\": {\n      \"ch\": \"ⁿ\",\n      \"code\": 8319,\n      \"map\": [\n        \"        \",\n        \"  ---   \",\n        \"  -  -  \",\n        \"  -  -  \",\n        \"  -  -  \",\n        \"  -  -  \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"₧\": {\n      \"ch\": \"₧\",\n      \"code\": 8359,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"----    \",\n        \"-   -   \",\n        \"-   -   \",\n        \"-   -   \",\n        \"---- -  \",\n        \"-    -  \",\n        \"-   --- \",\n        \"-    -  \",\n        \"-    -  \",\n        \"-     - \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"€\": {\n      \"ch\": \"€\",\n      \"code\": 8364,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"   ---  \",\n        \"  -   - \",\n        \" -      \",\n        \"-----   \",\n        \" -      \",\n        \"-----   \",\n        \" -      \",\n        \"  -   - \",\n        \"   ---  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"₮\": {\n      \"ch\": \"₮\",\n      \"code\": 8366,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"------- \",\n        \"   -    \",\n        \"   -    \",\n        \"   ---  \",\n        \" ---    \",\n        \"   ---  \",\n        \" ---    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ℎ\": {\n      \"ch\": \"ℎ\",\n      \"code\": 8462,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \" -      \",\n        \" -      \",\n        \" -      \",\n        \" -----  \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"ℏ\": {\n      \"ch\": \"ℏ\",\n      \"code\": 8463,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \" -      \",\n        \"-----   \",\n        \" -      \",\n        \" -----  \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"№\": {\n      \"ch\": \"№\",\n      \"code\": 8470,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"-  - -- \",\n        \"-  - -- \",\n        \"-  - -- \",\n        \"-- -    \",\n        \"----    \",\n        \"----    \",\n        \"- --    \",\n        \"-  - -- \",\n        \"-  -    \",\n        \"-  - -- \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"™\": {\n      \"ch\": \"™\",\n      \"code\": 8482,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"----- --\",\n        \" - - - -\",\n        \" - - - -\",\n        \" - -   -\",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"Ω\": {\n      \"ch\": \"Ω\",\n      \"code\": 8486,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"  ----  \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \"  -  -  \",\n        \"  -  -  \",\n        \" --  -- \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"←\": {\n      \"ch\": \"←\",\n      \"code\": 8592,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"  -     \",\n        \" -      \",\n        \"------- \",\n        \" -      \",\n        \"  -     \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"↑\": {\n      \"ch\": \"↑\",\n      \"code\": 8593,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"   -    \",\n        \"  ---   \",\n        \" - - -  \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"→\": {\n      \"ch\": \"→\",\n      \"code\": 8594,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"    -   \",\n        \"     -  \",\n        \"------- \",\n        \"     -  \",\n        \"    -   \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"↓\": {\n      \"ch\": \"↓\",\n      \"code\": 8595,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \" - - -  \",\n        \"  ---   \",\n        \"   -    \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"↔\": {\n      \"ch\": \"↔\",\n      \"code\": 8596,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"  -  -  \",\n        \" -    - \",\n        \"--------\",\n        \" -    - \",\n        \"  -  -  \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"↕\": {\n      \"ch\": \"↕\",\n      \"code\": 8597,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"   -    \",\n        \"  ---   \",\n        \" - - -  \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \" - - -  \",\n        \"  ---   \",\n        \"   -    \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"↨\": {\n      \"ch\": \"↨\",\n      \"code\": 8616,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"   -    \",\n        \"  ---   \",\n        \" - - -  \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \" - - -  \",\n        \"  ---   \",\n        \"   -    \",\n        \" -----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"↵\": {\n      \"ch\": \"↵\",\n      \"code\": 8629,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"      - \",\n        \"      - \",\n        \"      - \",\n        \"      - \",\n        \"      - \",\n        \"  -   - \",\n        \" -    - \",\n        \"------- \",\n        \" -      \",\n        \"  -     \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"⇐\": {\n      \"ch\": \"⇐\",\n      \"code\": 8656,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"  -     \",\n        \" ------ \",\n        \"--      \",\n        \" ------ \",\n        \"  -     \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"⇑\": {\n      \"ch\": \"⇑\",\n      \"code\": 8657,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"   -    \",\n        \"  ---   \",\n        \" -- --  \",\n        \"  - -   \",\n        \"  - -   \",\n        \"  - -   \",\n        \"  - -   \",\n        \"  - -   \",\n        \"  - -   \",\n        \"  - -   \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"⇒\": {\n      \"ch\": \"⇒\",\n      \"code\": 8658,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"    -   \",\n        \"------  \",\n        \"     -- \",\n        \"------  \",\n        \"    -   \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"⇓\": {\n      \"ch\": \"⇓\",\n      \"code\": 8659,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"  - -   \",\n        \"  - -   \",\n        \"  - -   \",\n        \"  - -   \",\n        \"  - -   \",\n        \"  - -   \",\n        \"  - -   \",\n        \" -- --  \",\n        \"  ---   \",\n        \"   -    \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"⇔\": {\n      \"ch\": \"⇔\",\n      \"code\": 8660,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"  -  -  \",\n        \" ------ \",\n        \"--    --\",\n        \" ------ \",\n        \"  -  -  \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"⇕\": {\n      \"ch\": \"⇕\",\n      \"code\": 8661,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"   -    \",\n        \"  ---   \",\n        \" -- --  \",\n        \"  - -   \",\n        \"  - -   \",\n        \"  - -   \",\n        \"  - -   \",\n        \" -- --  \",\n        \"  ---   \",\n        \"   -    \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"∃\": {\n      \"ch\": \"∃\",\n      \"code\": 8707,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \" ------ \",\n        \"      - \",\n        \"      - \",\n        \"      - \",\n        \" ------ \",\n        \"      - \",\n        \"      - \",\n        \"      - \",\n        \" ------ \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"∅\": {\n      \"ch\": \"∅\",\n      \"code\": 8709,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"      - \",\n        \"     -  \",\n        \" -----  \",\n        \"-   - - \",\n        \"-  -  - \",\n        \"-  -  - \",\n        \"- -   - \",\n        \" -----  \",\n        \" -      \",\n        \"-       \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"∆\": {\n      \"ch\": \"∆\",\n      \"code\": 8710,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"   -    \",\n        \"   -    \",\n        \"  - -   \",\n        \"  - -   \",\n        \" -   -  \",\n        \" -   -  \",\n        \" -   -  \",\n        \"-     - \",\n        \"-     - \",\n        \"------- \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"∈\": {\n      \"ch\": \"∈\",\n      \"code\": 8712,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"   ---- \",\n        \"  -     \",\n        \" -      \",\n        \" -      \",\n        \" ------ \",\n        \" -      \",\n        \" -      \",\n        \"  -     \",\n        \"   ---- \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"∊\": {\n      \"ch\": \"∊\",\n      \"code\": 8714,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"   ---- \",\n        \"  -     \",\n        \" -      \",\n        \" ------ \",\n        \" -      \",\n        \"  -     \",\n        \"   ---- \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"−\": {\n      \"ch\": \"−\",\n      \"code\": 8722,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \" ------ \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"∙\": {\n      \"ch\": \"∙\",\n      \"code\": 8729,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"   --   \",\n        \"   --   \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"√\": {\n      \"ch\": \"√\",\n      \"code\": 8730,\n      \"map\": [\n        \"        \",\n        \"     -- \",\n        \"     -  \",\n        \"     -  \",\n        \"     -  \",\n        \"     -  \",\n        \" -   -  \",\n        \" -   -  \",\n        \" -   -  \",\n        \"  -  -  \",\n        \"   - -  \",\n        \"    --  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"∞\": {\n      \"ch\": \"∞\",\n      \"code\": 8734,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \" -----  \",\n        \"-  -  - \",\n        \"-  -  - \",\n        \"-  -  - \",\n        \" -----  \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"∟\": {\n      \"ch\": \"∟\",\n      \"code\": 8735,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \" -      \",\n        \" -      \",\n        \" -      \",\n        \" -      \",\n        \" -      \",\n        \" ------ \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"∧\": {\n      \"ch\": \"∧\",\n      \"code\": 8743,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"   -    \",\n        \"   -    \",\n        \"  - -   \",\n        \"  - -   \",\n        \" -   -  \",\n        \" -   -  \",\n        \"-     - \",\n        \"-     - \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"∨\": {\n      \"ch\": \"∨\",\n      \"code\": 8744,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"-     - \",\n        \"-     - \",\n        \" -   -  \",\n        \" -   -  \",\n        \"  - -   \",\n        \"  - -   \",\n        \"   -    \",\n        \"   -    \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"∩\": {\n      \"ch\": \"∩\",\n      \"code\": 8745,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"  ----  \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"∪\": {\n      \"ch\": \"∪\",\n      \"code\": 8746,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \"  ----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"≈\": {\n      \"ch\": \"≈\",\n      \"code\": 8776,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"  --  - \",\n        \" -  --  \",\n        \"        \",\n        \"  --  - \",\n        \" -  --  \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"≠\": {\n      \"ch\": \"≠\",\n      \"code\": 8800,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"      - \",\n        \" ------ \",\n        \"    -   \",\n        \"   -    \",\n        \" ------ \",\n        \" -      \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"≡\": {\n      \"ch\": \"≡\",\n      \"code\": 8801,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \" ------ \",\n        \"        \",\n        \"        \",\n        \" ------ \",\n        \"        \",\n        \"        \",\n        \" ------ \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"≤\": {\n      \"ch\": \"≤\",\n      \"code\": 8804,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"     -  \",\n        \"    -   \",\n        \"   -    \",\n        \"  -     \",\n        \"   -    \",\n        \"    -   \",\n        \"     -  \",\n        \"        \",\n        \"  ----- \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"≥\": {\n      \"ch\": \"≥\",\n      \"code\": 8805,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"  -     \",\n        \"   -    \",\n        \"    -   \",\n        \"     -  \",\n        \"    -   \",\n        \"   -    \",\n        \"  -     \",\n        \"        \",\n        \" -----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"⌀\": {\n      \"ch\": \"⌀\",\n      \"code\": 8960,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"      - \",\n        \"     -  \",\n        \" -----  \",\n        \"-   - - \",\n        \"-  -  - \",\n        \"-  -  - \",\n        \"- -   - \",\n        \" -----  \",\n        \" -      \",\n        \"-       \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"⌂\": {\n      \"ch\": \"⌂\",\n      \"code\": 8962,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"   -    \",\n        \"  - -   \",\n        \" -   -  \",\n        \"-     - \",\n        \"-     - \",\n        \"-     - \",\n        \"-     - \",\n        \"------- \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"⌐\": {\n      \"ch\": \"⌐\",\n      \"code\": 8976,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \" ------ \",\n        \" -      \",\n        \" -      \",\n        \" -      \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"⌠\": {\n      \"ch\": \"⌠\",\n      \"code\": 8992,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"    --  \",\n        \"   -  - \",\n        \"   -  - \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \"\n      ]\n    },\n    \"⌡\": {\n      \"ch\": \"⌡\",\n      \"code\": 8993,\n      \"map\": [\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"-  -    \",\n        \"-  -    \",\n        \" --     \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"⎺\": {\n      \"ch\": \"⎺\",\n      \"code\": 9146,\n      \"map\": [\n        \"--------\",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"⎻\": {\n      \"ch\": \"⎻\",\n      \"code\": 9147,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"--------\",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"⎼\": {\n      \"ch\": \"⎼\",\n      \"code\": 9148,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"--------\",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"⎽\": {\n      \"ch\": \"⎽\",\n      \"code\": 9149,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"--------\"\n      ]\n    },\n    \"␉\": {\n      \"ch\": \"␉\",\n      \"code\": 9225,\n      \"map\": [\n        \"-   -   \",\n        \"-   -   \",\n        \"-----   \",\n        \"-   -   \",\n        \"-   -   \",\n        \"-   -   \",\n        \"        \",\n        \"   -----\",\n        \"     -  \",\n        \"     -  \",\n        \"     -  \",\n        \"     -  \",\n        \"     -  \",\n        \"        \"\n      ]\n    },\n    \"␊\": {\n      \"ch\": \"␊\",\n      \"code\": 9226,\n      \"map\": [\n        \"-       \",\n        \"-       \",\n        \"-       \",\n        \"-       \",\n        \"-       \",\n        \"-----   \",\n        \"        \",\n        \"   -----\",\n        \"   -    \",\n        \"   ---  \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"        \"\n      ]\n    },\n    \"␋\": {\n      \"ch\": \"␋\",\n      \"code\": 9227,\n      \"map\": [\n        \"-   -   \",\n        \"-   -   \",\n        \" - -    \",\n        \" - -    \",\n        \"  -     \",\n        \"  -     \",\n        \"        \",\n        \"   -----\",\n        \"     -  \",\n        \"     -  \",\n        \"     -  \",\n        \"     -  \",\n        \"     -  \",\n        \"        \"\n      ]\n    },\n    \"␌\": {\n      \"ch\": \"␌\",\n      \"code\": 9228,\n      \"map\": [\n        \"-----   \",\n        \"-       \",\n        \"---     \",\n        \"-       \",\n        \"-       \",\n        \"-       \",\n        \"        \",\n        \"   -----\",\n        \"   -    \",\n        \"   ---  \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"        \"\n      ]\n    },\n    \"␍\": {\n      \"ch\": \"␍\",\n      \"code\": 9229,\n      \"map\": [\n        \" ---    \",\n        \"-   -   \",\n        \"-       \",\n        \"-       \",\n        \"-   -   \",\n        \" ---    \",\n        \"        \",\n        \"   ---- \",\n        \"   -   -\",\n        \"   -   -\",\n        \"   ---- \",\n        \"   -  - \",\n        \"   -   -\",\n        \"        \"\n      ]\n    },\n    \"␤\": {\n      \"ch\": \"␤\",\n      \"code\": 9252,\n      \"map\": [\n        \"-   -   \",\n        \"--  -   \",\n        \"- - -   \",\n        \"-  --   \",\n        \"-   -   \",\n        \"-   -   \",\n        \"        \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -----\",\n        \"        \"\n      ]\n    },\n    \"─\": {\n      \"ch\": \"─\",\n      \"code\": 9472,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"--------\",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"━\": {\n      \"ch\": \"━\",\n      \"code\": 9473,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"--------\",\n        \"--------\",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"│\": {\n      \"ch\": \"│\",\n      \"code\": 9474,\n      \"map\": [\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \"\n      ]\n    },\n    \"┃\": {\n      \"ch\": \"┃\",\n      \"code\": 9475,\n      \"map\": [\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \"\n      ]\n    },\n    \"┈\": {\n      \"ch\": \"┈\",\n      \"code\": 9480,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"- - - - \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"┉\": {\n      \"ch\": \"┉\",\n      \"code\": 9481,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"- - - - \",\n        \"- - - - \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"┊\": {\n      \"ch\": \"┊\",\n      \"code\": 9482,\n      \"map\": [\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"        \",\n        \"   -    \",\n        \"   -    \",\n        \"        \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"        \",\n        \"   -    \",\n        \"   -    \",\n        \"        \"\n      ]\n    },\n    \"┋\": {\n      \"ch\": \"┋\",\n      \"code\": 9483,\n      \"map\": [\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"        \",\n        \"   --   \",\n        \"   --   \",\n        \"        \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"        \",\n        \"   --   \",\n        \"   --   \",\n        \"        \"\n      ]\n    },\n    \"┌\": {\n      \"ch\": \"┌\",\n      \"code\": 9484,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"   -----\",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \"\n      ]\n    },\n    \"┍\": {\n      \"ch\": \"┍\",\n      \"code\": 9485,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"   -----\",\n        \"   -----\",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \"\n      ]\n    },\n    \"┎\": {\n      \"ch\": \"┎\",\n      \"code\": 9486,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"   -----\",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \"\n      ]\n    },\n    \"┏\": {\n      \"ch\": \"┏\",\n      \"code\": 9487,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"   -----\",\n        \"   -----\",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \"\n      ]\n    },\n    \"┐\": {\n      \"ch\": \"┐\",\n      \"code\": 9488,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"----    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \"\n      ]\n    },\n    \"┑\": {\n      \"ch\": \"┑\",\n      \"code\": 9489,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"----    \",\n        \"----    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \"\n      ]\n    },\n    \"┒\": {\n      \"ch\": \"┒\",\n      \"code\": 9490,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"-----   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \"\n      ]\n    },\n    \"┓\": {\n      \"ch\": \"┓\",\n      \"code\": 9491,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"-----   \",\n        \"-----   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \"\n      ]\n    },\n    \"└\": {\n      \"ch\": \"└\",\n      \"code\": 9492,\n      \"map\": [\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -----\",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"┕\": {\n      \"ch\": \"┕\",\n      \"code\": 9493,\n      \"map\": [\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -----\",\n        \"   -----\",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"┖\": {\n      \"ch\": \"┖\",\n      \"code\": 9494,\n      \"map\": [\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   -----\",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"┗\": {\n      \"ch\": \"┗\",\n      \"code\": 9495,\n      \"map\": [\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   -----\",\n        \"   -----\",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"┘\": {\n      \"ch\": \"┘\",\n      \"code\": 9496,\n      \"map\": [\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"----    \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"┙\": {\n      \"ch\": \"┙\",\n      \"code\": 9497,\n      \"map\": [\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"----    \",\n        \"----    \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"┚\": {\n      \"ch\": \"┚\",\n      \"code\": 9498,\n      \"map\": [\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"-----   \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"┛\": {\n      \"ch\": \"┛\",\n      \"code\": 9499,\n      \"map\": [\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"-----   \",\n        \"-----   \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"├\": {\n      \"ch\": \"├\",\n      \"code\": 9500,\n      \"map\": [\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -----\",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \"\n      ]\n    },\n    \"┝\": {\n      \"ch\": \"┝\",\n      \"code\": 9501,\n      \"map\": [\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -----\",\n        \"   -----\",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \"\n      ]\n    },\n    \"┞\": {\n      \"ch\": \"┞\",\n      \"code\": 9502,\n      \"map\": [\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   -----\",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \"\n      ]\n    },\n    \"┟\": {\n      \"ch\": \"┟\",\n      \"code\": 9503,\n      \"map\": [\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -----\",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \"\n      ]\n    },\n    \"┠\": {\n      \"ch\": \"┠\",\n      \"code\": 9504,\n      \"map\": [\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   -----\",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \"\n      ]\n    },\n    \"┡\": {\n      \"ch\": \"┡\",\n      \"code\": 9505,\n      \"map\": [\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   -----\",\n        \"   -----\",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \"\n      ]\n    },\n    \"┢\": {\n      \"ch\": \"┢\",\n      \"code\": 9506,\n      \"map\": [\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -----\",\n        \"   -----\",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \"\n      ]\n    },\n    \"┣\": {\n      \"ch\": \"┣\",\n      \"code\": 9507,\n      \"map\": [\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   -----\",\n        \"   -----\",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \"\n      ]\n    },\n    \"┤\": {\n      \"ch\": \"┤\",\n      \"code\": 9508,\n      \"map\": [\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"----    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \"\n      ]\n    },\n    \"┥\": {\n      \"ch\": \"┥\",\n      \"code\": 9509,\n      \"map\": [\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"----    \",\n        \"----    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \"\n      ]\n    },\n    \"┦\": {\n      \"ch\": \"┦\",\n      \"code\": 9510,\n      \"map\": [\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"-----   \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \"\n      ]\n    },\n    \"┧\": {\n      \"ch\": \"┧\",\n      \"code\": 9511,\n      \"map\": [\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"-----   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \"\n      ]\n    },\n    \"┨\": {\n      \"ch\": \"┨\",\n      \"code\": 9512,\n      \"map\": [\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"-----   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \"\n      ]\n    },\n    \"┩\": {\n      \"ch\": \"┩\",\n      \"code\": 9513,\n      \"map\": [\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"-----   \",\n        \"-----   \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \"\n      ]\n    },\n    \"┪\": {\n      \"ch\": \"┪\",\n      \"code\": 9514,\n      \"map\": [\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"-----   \",\n        \"-----   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \"\n      ]\n    },\n    \"┫\": {\n      \"ch\": \"┫\",\n      \"code\": 9515,\n      \"map\": [\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"-----   \",\n        \"-----   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \"\n      ]\n    },\n    \"┬\": {\n      \"ch\": \"┬\",\n      \"code\": 9516,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"--------\",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \"\n      ]\n    },\n    \"┭\": {\n      \"ch\": \"┭\",\n      \"code\": 9517,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"--------\",\n        \"----    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \"\n      ]\n    },\n    \"┮\": {\n      \"ch\": \"┮\",\n      \"code\": 9518,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"--------\",\n        \"   -----\",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \"\n      ]\n    },\n    \"┯\": {\n      \"ch\": \"┯\",\n      \"code\": 9519,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"--------\",\n        \"--------\",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \"\n      ]\n    },\n    \"┰\": {\n      \"ch\": \"┰\",\n      \"code\": 9520,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"--------\",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \"\n      ]\n    },\n    \"┱\": {\n      \"ch\": \"┱\",\n      \"code\": 9521,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"--------\",\n        \"-----   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \"\n      ]\n    },\n    \"┲\": {\n      \"ch\": \"┲\",\n      \"code\": 9522,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"--------\",\n        \"   -----\",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \"\n      ]\n    },\n    \"┳\": {\n      \"ch\": \"┳\",\n      \"code\": 9523,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"--------\",\n        \"--------\",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \"\n      ]\n    },\n    \"┴\": {\n      \"ch\": \"┴\",\n      \"code\": 9524,\n      \"map\": [\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"--------\",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"┵\": {\n      \"ch\": \"┵\",\n      \"code\": 9525,\n      \"map\": [\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"--------\",\n        \"----    \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"┶\": {\n      \"ch\": \"┶\",\n      \"code\": 9526,\n      \"map\": [\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"--------\",\n        \"   -----\",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"┷\": {\n      \"ch\": \"┷\",\n      \"code\": 9527,\n      \"map\": [\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"--------\",\n        \"--------\",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"┸\": {\n      \"ch\": \"┸\",\n      \"code\": 9528,\n      \"map\": [\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"--------\",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"┹\": {\n      \"ch\": \"┹\",\n      \"code\": 9529,\n      \"map\": [\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"--------\",\n        \"-----   \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"┺\": {\n      \"ch\": \"┺\",\n      \"code\": 9530,\n      \"map\": [\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"--------\",\n        \"   -----\",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"┻\": {\n      \"ch\": \"┻\",\n      \"code\": 9531,\n      \"map\": [\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"--------\",\n        \"--------\",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"┼\": {\n      \"ch\": \"┼\",\n      \"code\": 9532,\n      \"map\": [\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"--------\",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \"\n      ]\n    },\n    \"┽\": {\n      \"ch\": \"┽\",\n      \"code\": 9533,\n      \"map\": [\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"--------\",\n        \"----    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \"\n      ]\n    },\n    \"┾\": {\n      \"ch\": \"┾\",\n      \"code\": 9534,\n      \"map\": [\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"--------\",\n        \"   -----\",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \"\n      ]\n    },\n    \"┿\": {\n      \"ch\": \"┿\",\n      \"code\": 9535,\n      \"map\": [\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"--------\",\n        \"--------\",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \"\n      ]\n    },\n    \"╀\": {\n      \"ch\": \"╀\",\n      \"code\": 9536,\n      \"map\": [\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"--------\",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \"\n      ]\n    },\n    \"╁\": {\n      \"ch\": \"╁\",\n      \"code\": 9537,\n      \"map\": [\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"--------\",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \"\n      ]\n    },\n    \"╂\": {\n      \"ch\": \"╂\",\n      \"code\": 9538,\n      \"map\": [\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"--------\",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \"\n      ]\n    },\n    \"╃\": {\n      \"ch\": \"╃\",\n      \"code\": 9539,\n      \"map\": [\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"--------\",\n        \"----    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \"\n      ]\n    },\n    \"╄\": {\n      \"ch\": \"╄\",\n      \"code\": 9540,\n      \"map\": [\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"--------\",\n        \"   -----\",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \"\n      ]\n    },\n    \"╅\": {\n      \"ch\": \"╅\",\n      \"code\": 9541,\n      \"map\": [\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"--------\",\n        \"-----   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \"\n      ]\n    },\n    \"╆\": {\n      \"ch\": \"╆\",\n      \"code\": 9542,\n      \"map\": [\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"--------\",\n        \"   -----\",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \"\n      ]\n    },\n    \"╇\": {\n      \"ch\": \"╇\",\n      \"code\": 9543,\n      \"map\": [\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"--------\",\n        \"--------\",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \"\n      ]\n    },\n    \"╈\": {\n      \"ch\": \"╈\",\n      \"code\": 9544,\n      \"map\": [\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"--------\",\n        \"--------\",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \"\n      ]\n    },\n    \"╉\": {\n      \"ch\": \"╉\",\n      \"code\": 9545,\n      \"map\": [\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"--------\",\n        \"-----   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \"\n      ]\n    },\n    \"╊\": {\n      \"ch\": \"╊\",\n      \"code\": 9546,\n      \"map\": [\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"--------\",\n        \"   -----\",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \"\n      ]\n    },\n    \"╋\": {\n      \"ch\": \"╋\",\n      \"code\": 9547,\n      \"map\": [\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"--------\",\n        \"--------\",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \"\n      ]\n    },\n    \"═\": {\n      \"ch\": \"═\",\n      \"code\": 9552,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"--------\",\n        \"        \",\n        \"--------\",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"║\": {\n      \"ch\": \"║\",\n      \"code\": 9553,\n      \"map\": [\n        \"  - -   \",\n        \"  - -   \",\n        \"  - -   \",\n        \"  - -   \",\n        \"  - -   \",\n        \"  - -   \",\n        \"  - -   \",\n        \"  - -   \",\n        \"  - -   \",\n        \"  - -   \",\n        \"  - -   \",\n        \"  - -   \",\n        \"  - -   \",\n        \"  - -   \"\n      ]\n    },\n    \"╒\": {\n      \"ch\": \"╒\",\n      \"code\": 9554,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"   -----\",\n        \"   -    \",\n        \"   -----\",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \"\n      ]\n    },\n    \"╓\": {\n      \"ch\": \"╓\",\n      \"code\": 9555,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"  ------\",\n        \"  - -   \",\n        \"  - -   \",\n        \"  - -   \",\n        \"  - -   \",\n        \"  - -   \",\n        \"  - -   \",\n        \"  - -   \"\n      ]\n    },\n    \"╔\": {\n      \"ch\": \"╔\",\n      \"code\": 9556,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"  ------\",\n        \"  -     \",\n        \"  - ----\",\n        \"  - -   \",\n        \"  - -   \",\n        \"  - -   \",\n        \"  - -   \",\n        \"  - -   \",\n        \"  - -   \"\n      ]\n    },\n    \"╕\": {\n      \"ch\": \"╕\",\n      \"code\": 9557,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"----    \",\n        \"   -    \",\n        \"----    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \"\n      ]\n    },\n    \"╖\": {\n      \"ch\": \"╖\",\n      \"code\": 9558,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"-----   \",\n        \"  - -   \",\n        \"  - -   \",\n        \"  - -   \",\n        \"  - -   \",\n        \"  - -   \",\n        \"  - -   \",\n        \"  - -   \"\n      ]\n    },\n    \"╗\": {\n      \"ch\": \"╗\",\n      \"code\": 9559,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"-----   \",\n        \"    -   \",\n        \"--- -   \",\n        \"  - -   \",\n        \"  - -   \",\n        \"  - -   \",\n        \"  - -   \",\n        \"  - -   \",\n        \"  - -   \"\n      ]\n    },\n    \"╘\": {\n      \"ch\": \"╘\",\n      \"code\": 9560,\n      \"map\": [\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -----\",\n        \"   -    \",\n        \"   -----\",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"╙\": {\n      \"ch\": \"╙\",\n      \"code\": 9561,\n      \"map\": [\n        \"  - -   \",\n        \"  - -   \",\n        \"  - -   \",\n        \"  - -   \",\n        \"  - -   \",\n        \"  - -   \",\n        \"  ------\",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"╚\": {\n      \"ch\": \"╚\",\n      \"code\": 9562,\n      \"map\": [\n        \"  - -   \",\n        \"  - -   \",\n        \"  - -   \",\n        \"  - -   \",\n        \"  - -   \",\n        \"  - ----\",\n        \"  -     \",\n        \"  ------\",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"╛\": {\n      \"ch\": \"╛\",\n      \"code\": 9563,\n      \"map\": [\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"----    \",\n        \"   -    \",\n        \"----    \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"╜\": {\n      \"ch\": \"╜\",\n      \"code\": 9564,\n      \"map\": [\n        \"  - -   \",\n        \"  - -   \",\n        \"  - -   \",\n        \"  - -   \",\n        \"  - -   \",\n        \"  - -   \",\n        \"-----   \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"╝\": {\n      \"ch\": \"╝\",\n      \"code\": 9565,\n      \"map\": [\n        \"  - -   \",\n        \"  - -   \",\n        \"  - -   \",\n        \"  - -   \",\n        \"  - -   \",\n        \"--- -   \",\n        \"    -   \",\n        \"-----   \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"╞\": {\n      \"ch\": \"╞\",\n      \"code\": 9566,\n      \"map\": [\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -----\",\n        \"   -    \",\n        \"   -----\",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \"\n      ]\n    },\n    \"╟\": {\n      \"ch\": \"╟\",\n      \"code\": 9567,\n      \"map\": [\n        \"  - -   \",\n        \"  - -   \",\n        \"  - -   \",\n        \"  - -   \",\n        \"  - -   \",\n        \"  - -   \",\n        \"  - ----\",\n        \"  - -   \",\n        \"  - -   \",\n        \"  - -   \",\n        \"  - -   \",\n        \"  - -   \",\n        \"  - -   \",\n        \"  - -   \"\n      ]\n    },\n    \"╠\": {\n      \"ch\": \"╠\",\n      \"code\": 9568,\n      \"map\": [\n        \"  - -   \",\n        \"  - -   \",\n        \"  - -   \",\n        \"  - -   \",\n        \"  - -   \",\n        \"  - ----\",\n        \"  -     \",\n        \"  - ----\",\n        \"  - -   \",\n        \"  - -   \",\n        \"  - -   \",\n        \"  - -   \",\n        \"  - -   \",\n        \"  - -   \"\n      ]\n    },\n    \"╡\": {\n      \"ch\": \"╡\",\n      \"code\": 9569,\n      \"map\": [\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"----    \",\n        \"   -    \",\n        \"----    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \"\n      ]\n    },\n    \"╢\": {\n      \"ch\": \"╢\",\n      \"code\": 9570,\n      \"map\": [\n        \"  - -   \",\n        \"  - -   \",\n        \"  - -   \",\n        \"  - -   \",\n        \"  - -   \",\n        \"  - -   \",\n        \"--- -   \",\n        \"  - -   \",\n        \"  - -   \",\n        \"  - -   \",\n        \"  - -   \",\n        \"  - -   \",\n        \"  - -   \",\n        \"  - -   \"\n      ]\n    },\n    \"╣\": {\n      \"ch\": \"╣\",\n      \"code\": 9571,\n      \"map\": [\n        \"  - -   \",\n        \"  - -   \",\n        \"  - -   \",\n        \"  - -   \",\n        \"  - -   \",\n        \"--- -   \",\n        \"    -   \",\n        \"--- -   \",\n        \"  - -   \",\n        \"  - -   \",\n        \"  - -   \",\n        \"  - -   \",\n        \"  - -   \",\n        \"  - -   \"\n      ]\n    },\n    \"╤\": {\n      \"ch\": \"╤\",\n      \"code\": 9572,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"--------\",\n        \"        \",\n        \"--------\",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \"\n      ]\n    },\n    \"╥\": {\n      \"ch\": \"╥\",\n      \"code\": 9573,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"--------\",\n        \"  - -   \",\n        \"  - -   \",\n        \"  - -   \",\n        \"  - -   \",\n        \"  - -   \",\n        \"  - -   \",\n        \"  - -   \"\n      ]\n    },\n    \"╦\": {\n      \"ch\": \"╦\",\n      \"code\": 9574,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"--------\",\n        \"        \",\n        \"--- ----\",\n        \"  - -   \",\n        \"  - -   \",\n        \"  - -   \",\n        \"  - -   \",\n        \"  - -   \",\n        \"  - -   \"\n      ]\n    },\n    \"╧\": {\n      \"ch\": \"╧\",\n      \"code\": 9575,\n      \"map\": [\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"--------\",\n        \"        \",\n        \"--------\",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"╨\": {\n      \"ch\": \"╨\",\n      \"code\": 9576,\n      \"map\": [\n        \"  - -   \",\n        \"  - -   \",\n        \"  - -   \",\n        \"  - -   \",\n        \"  - -   \",\n        \"  - -   \",\n        \"--------\",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"╩\": {\n      \"ch\": \"╩\",\n      \"code\": 9577,\n      \"map\": [\n        \"  - -   \",\n        \"  - -   \",\n        \"  - -   \",\n        \"  - -   \",\n        \"  - -   \",\n        \"--- ----\",\n        \"        \",\n        \"--------\",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"╪\": {\n      \"ch\": \"╪\",\n      \"code\": 9578,\n      \"map\": [\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"--------\",\n        \"   -    \",\n        \"--------\",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \"\n      ]\n    },\n    \"╫\": {\n      \"ch\": \"╫\",\n      \"code\": 9579,\n      \"map\": [\n        \"  - -   \",\n        \"  - -   \",\n        \"  - -   \",\n        \"  - -   \",\n        \"  - -   \",\n        \"  - -   \",\n        \"--------\",\n        \"  - -   \",\n        \"  - -   \",\n        \"  - -   \",\n        \"  - -   \",\n        \"  - -   \",\n        \"  - -   \",\n        \"  - -   \"\n      ]\n    },\n    \"╬\": {\n      \"ch\": \"╬\",\n      \"code\": 9580,\n      \"map\": [\n        \"  - -   \",\n        \"  - -   \",\n        \"  - -   \",\n        \"  - -   \",\n        \"  - -   \",\n        \"--- ----\",\n        \"        \",\n        \"--- ----\",\n        \"  - -   \",\n        \"  - -   \",\n        \"  - -   \",\n        \"  - -   \",\n        \"  - -   \",\n        \"  - -   \"\n      ]\n    },\n    \"╭\": {\n      \"ch\": \"╭\",\n      \"code\": 9581,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"     ---\",\n        \"    -   \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \"\n      ]\n    },\n    \"╮\": {\n      \"ch\": \"╮\",\n      \"code\": 9582,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"--      \",\n        \"  -     \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \"\n      ]\n    },\n    \"╯\": {\n      \"ch\": \"╯\",\n      \"code\": 9583,\n      \"map\": [\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"  -     \",\n        \"--      \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"╰\": {\n      \"ch\": \"╰\",\n      \"code\": 9584,\n      \"map\": [\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"    -   \",\n        \"     ---\",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"╴\": {\n      \"ch\": \"╴\",\n      \"code\": 9588,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"----    \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"╵\": {\n      \"ch\": \"╵\",\n      \"code\": 9589,\n      \"map\": [\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"╶\": {\n      \"ch\": \"╶\",\n      \"code\": 9590,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"   -----\",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"╷\": {\n      \"ch\": \"╷\",\n      \"code\": 9591,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \"\n      ]\n    },\n    \"╸\": {\n      \"ch\": \"╸\",\n      \"code\": 9592,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"----    \",\n        \"----    \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"╹\": {\n      \"ch\": \"╹\",\n      \"code\": 9593,\n      \"map\": [\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"╺\": {\n      \"ch\": \"╺\",\n      \"code\": 9594,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"   -----\",\n        \"   -----\",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"╻\": {\n      \"ch\": \"╻\",\n      \"code\": 9595,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \"\n      ]\n    },\n    \"╼\": {\n      \"ch\": \"╼\",\n      \"code\": 9596,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"--------\",\n        \"   -----\",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"╽\": {\n      \"ch\": \"╽\",\n      \"code\": 9597,\n      \"map\": [\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \"\n      ]\n    },\n    \"╾\": {\n      \"ch\": \"╾\",\n      \"code\": 9598,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"--------\",\n        \"----    \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"╿\": {\n      \"ch\": \"╿\",\n      \"code\": 9599,\n      \"map\": [\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   --   \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \",\n        \"   -    \"\n      ]\n    },\n    \"▀\": {\n      \"ch\": \"▀\",\n      \"code\": 9600,\n      \"map\": [\n        \"--------\",\n        \"--------\",\n        \"--------\",\n        \"--------\",\n        \"--------\",\n        \"--------\",\n        \"--------\",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"▁\": {\n      \"ch\": \"▁\",\n      \"code\": 9601,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"--------\",\n        \"--------\"\n      ]\n    },\n    \"▂\": {\n      \"ch\": \"▂\",\n      \"code\": 9602,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"--------\",\n        \"--------\",\n        \"--------\"\n      ]\n    },\n    \"▃\": {\n      \"ch\": \"▃\",\n      \"code\": 9603,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"--------\",\n        \"--------\",\n        \"--------\",\n        \"--------\",\n        \"--------\"\n      ]\n    },\n    \"▄\": {\n      \"ch\": \"▄\",\n      \"code\": 9604,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"--------\",\n        \"--------\",\n        \"--------\",\n        \"--------\",\n        \"--------\",\n        \"--------\",\n        \"--------\"\n      ]\n    },\n    \"▅\": {\n      \"ch\": \"▅\",\n      \"code\": 9605,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"--------\",\n        \"--------\",\n        \"--------\",\n        \"--------\",\n        \"--------\",\n        \"--------\",\n        \"--------\",\n        \"--------\",\n        \"--------\"\n      ]\n    },\n    \"▆\": {\n      \"ch\": \"▆\",\n      \"code\": 9606,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"--------\",\n        \"--------\",\n        \"--------\",\n        \"--------\",\n        \"--------\",\n        \"--------\",\n        \"--------\",\n        \"--------\",\n        \"--------\",\n        \"--------\"\n      ]\n    },\n    \"▇\": {\n      \"ch\": \"▇\",\n      \"code\": 9607,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"--------\",\n        \"--------\",\n        \"--------\",\n        \"--------\",\n        \"--------\",\n        \"--------\",\n        \"--------\",\n        \"--------\",\n        \"--------\",\n        \"--------\",\n        \"--------\",\n        \"--------\"\n      ]\n    },\n    \"█\": {\n      \"ch\": \"█\",\n      \"code\": 9608,\n      \"map\": [\n        \"--------\",\n        \"--------\",\n        \"--------\",\n        \"--------\",\n        \"--------\",\n        \"--------\",\n        \"--------\",\n        \"--------\",\n        \"--------\",\n        \"--------\",\n        \"--------\",\n        \"--------\",\n        \"--------\",\n        \"--------\"\n      ]\n    },\n    \"▉\": {\n      \"ch\": \"▉\",\n      \"code\": 9609,\n      \"map\": [\n        \"------- \",\n        \"------- \",\n        \"------- \",\n        \"------- \",\n        \"------- \",\n        \"------- \",\n        \"------- \",\n        \"------- \",\n        \"------- \",\n        \"------- \",\n        \"------- \",\n        \"------- \",\n        \"------- \",\n        \"------- \"\n      ]\n    },\n    \"▊\": {\n      \"ch\": \"▊\",\n      \"code\": 9610,\n      \"map\": [\n        \"------  \",\n        \"------  \",\n        \"------  \",\n        \"------  \",\n        \"------  \",\n        \"------  \",\n        \"------  \",\n        \"------  \",\n        \"------  \",\n        \"------  \",\n        \"------  \",\n        \"------  \",\n        \"------  \",\n        \"------  \"\n      ]\n    },\n    \"▋\": {\n      \"ch\": \"▋\",\n      \"code\": 9611,\n      \"map\": [\n        \"-----   \",\n        \"-----   \",\n        \"-----   \",\n        \"-----   \",\n        \"-----   \",\n        \"-----   \",\n        \"-----   \",\n        \"-----   \",\n        \"-----   \",\n        \"-----   \",\n        \"-----   \",\n        \"-----   \",\n        \"-----   \",\n        \"-----   \"\n      ]\n    },\n    \"▌\": {\n      \"ch\": \"▌\",\n      \"code\": 9612,\n      \"map\": [\n        \"----    \",\n        \"----    \",\n        \"----    \",\n        \"----    \",\n        \"----    \",\n        \"----    \",\n        \"----    \",\n        \"----    \",\n        \"----    \",\n        \"----    \",\n        \"----    \",\n        \"----    \",\n        \"----    \",\n        \"----    \"\n      ]\n    },\n    \"▍\": {\n      \"ch\": \"▍\",\n      \"code\": 9613,\n      \"map\": [\n        \"---     \",\n        \"---     \",\n        \"---     \",\n        \"---     \",\n        \"---     \",\n        \"---     \",\n        \"---     \",\n        \"---     \",\n        \"---     \",\n        \"---     \",\n        \"---     \",\n        \"---     \",\n        \"---     \",\n        \"---     \"\n      ]\n    },\n    \"▎\": {\n      \"ch\": \"▎\",\n      \"code\": 9614,\n      \"map\": [\n        \"--      \",\n        \"--      \",\n        \"--      \",\n        \"--      \",\n        \"--      \",\n        \"--      \",\n        \"--      \",\n        \"--      \",\n        \"--      \",\n        \"--      \",\n        \"--      \",\n        \"--      \",\n        \"--      \",\n        \"--      \"\n      ]\n    },\n    \"▏\": {\n      \"ch\": \"▏\",\n      \"code\": 9615,\n      \"map\": [\n        \"-       \",\n        \"-       \",\n        \"-       \",\n        \"-       \",\n        \"-       \",\n        \"-       \",\n        \"-       \",\n        \"-       \",\n        \"-       \",\n        \"-       \",\n        \"-       \",\n        \"-       \",\n        \"-       \",\n        \"-       \"\n      ]\n    },\n    \"▐\": {\n      \"ch\": \"▐\",\n      \"code\": 9616,\n      \"map\": [\n        \"    ----\",\n        \"    ----\",\n        \"    ----\",\n        \"    ----\",\n        \"    ----\",\n        \"    ----\",\n        \"    ----\",\n        \"    ----\",\n        \"    ----\",\n        \"    ----\",\n        \"    ----\",\n        \"    ----\",\n        \"    ----\",\n        \"    ----\"\n      ]\n    },\n    \"░\": {\n      \"ch\": \"░\",\n      \"code\": 9617,\n      \"map\": [\n        \"-   -   \",\n        \"  -   - \",\n        \"-   -   \",\n        \"  -   - \",\n        \"-   -   \",\n        \"  -   - \",\n        \"-   -   \",\n        \"  -   - \",\n        \"-   -   \",\n        \"  -   - \",\n        \"-   -   \",\n        \"  -   - \",\n        \"-   -   \",\n        \"  -   - \"\n      ]\n    },\n    \"▒\": {\n      \"ch\": \"▒\",\n      \"code\": 9618,\n      \"map\": [\n        \"- - - - \",\n        \" - - - -\",\n        \"- - - - \",\n        \" - - - -\",\n        \"- - - - \",\n        \" - - - -\",\n        \"- - - - \",\n        \" - - - -\",\n        \"- - - - \",\n        \" - - - -\",\n        \"- - - - \",\n        \" - - - -\",\n        \"- - - - \",\n        \" - - - -\"\n      ]\n    },\n    \"▓\": {\n      \"ch\": \"▓\",\n      \"code\": 9619,\n      \"map\": [\n        \"--- --- \",\n        \"- --- --\",\n        \"--- --- \",\n        \"- --- --\",\n        \"--- --- \",\n        \"- --- --\",\n        \"--- --- \",\n        \"- --- --\",\n        \"--- --- \",\n        \"- --- --\",\n        \"--- --- \",\n        \"- --- --\",\n        \"--- --- \",\n        \"- --- --\"\n      ]\n    },\n    \"▖\": {\n      \"ch\": \"▖\",\n      \"code\": 9622,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"----    \",\n        \"----    \",\n        \"----    \",\n        \"----    \",\n        \"----    \",\n        \"----    \",\n        \"----    \"\n      ]\n    },\n    \"▗\": {\n      \"ch\": \"▗\",\n      \"code\": 9623,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"    ----\",\n        \"    ----\",\n        \"    ----\",\n        \"    ----\",\n        \"    ----\",\n        \"    ----\",\n        \"    ----\"\n      ]\n    },\n    \"▘\": {\n      \"ch\": \"▘\",\n      \"code\": 9624,\n      \"map\": [\n        \"----    \",\n        \"----    \",\n        \"----    \",\n        \"----    \",\n        \"----    \",\n        \"----    \",\n        \"----    \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"▙\": {\n      \"ch\": \"▙\",\n      \"code\": 9625,\n      \"map\": [\n        \"----    \",\n        \"----    \",\n        \"----    \",\n        \"----    \",\n        \"----    \",\n        \"----    \",\n        \"----    \",\n        \"--------\",\n        \"--------\",\n        \"--------\",\n        \"--------\",\n        \"--------\",\n        \"--------\",\n        \"--------\"\n      ]\n    },\n    \"▚\": {\n      \"ch\": \"▚\",\n      \"code\": 9626,\n      \"map\": [\n        \"----    \",\n        \"----    \",\n        \"----    \",\n        \"----    \",\n        \"----    \",\n        \"----    \",\n        \"----    \",\n        \"    ----\",\n        \"    ----\",\n        \"    ----\",\n        \"    ----\",\n        \"    ----\",\n        \"    ----\",\n        \"    ----\"\n      ]\n    },\n    \"▛\": {\n      \"ch\": \"▛\",\n      \"code\": 9627,\n      \"map\": [\n        \"--------\",\n        \"--------\",\n        \"--------\",\n        \"--------\",\n        \"--------\",\n        \"--------\",\n        \"--------\",\n        \"----    \",\n        \"----    \",\n        \"----    \",\n        \"----    \",\n        \"----    \",\n        \"----    \",\n        \"----    \"\n      ]\n    },\n    \"▜\": {\n      \"ch\": \"▜\",\n      \"code\": 9628,\n      \"map\": [\n        \"--------\",\n        \"--------\",\n        \"--------\",\n        \"--------\",\n        \"--------\",\n        \"--------\",\n        \"--------\",\n        \"    ----\",\n        \"    ----\",\n        \"    ----\",\n        \"    ----\",\n        \"    ----\",\n        \"    ----\",\n        \"    ----\"\n      ]\n    },\n    \"▝\": {\n      \"ch\": \"▝\",\n      \"code\": 9629,\n      \"map\": [\n        \"    ----\",\n        \"    ----\",\n        \"    ----\",\n        \"    ----\",\n        \"    ----\",\n        \"    ----\",\n        \"    ----\",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"▞\": {\n      \"ch\": \"▞\",\n      \"code\": 9630,\n      \"map\": [\n        \"    ----\",\n        \"    ----\",\n        \"    ----\",\n        \"    ----\",\n        \"    ----\",\n        \"    ----\",\n        \"    ----\",\n        \"----    \",\n        \"----    \",\n        \"----    \",\n        \"----    \",\n        \"----    \",\n        \"----    \",\n        \"----    \"\n      ]\n    },\n    \"▟\": {\n      \"ch\": \"▟\",\n      \"code\": 9631,\n      \"map\": [\n        \"    ----\",\n        \"    ----\",\n        \"    ----\",\n        \"    ----\",\n        \"    ----\",\n        \"    ----\",\n        \"    ----\",\n        \"--------\",\n        \"--------\",\n        \"--------\",\n        \"--------\",\n        \"--------\",\n        \"--------\",\n        \"--------\"\n      ]\n    },\n    \"■\": {\n      \"ch\": \"■\",\n      \"code\": 9632,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"  ----  \",\n        \"  ----  \",\n        \"  ----  \",\n        \"  ----  \",\n        \"  ----  \",\n        \"  ----  \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"▬\": {\n      \"ch\": \"▬\",\n      \"code\": 9644,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \" ------ \",\n        \" ------ \",\n        \" ------ \",\n        \" ------ \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"▮\": {\n      \"ch\": \"▮\",\n      \"code\": 9646,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \" ------ \",\n        \" ------ \",\n        \" ------ \",\n        \" ------ \",\n        \" ------ \",\n        \" ------ \",\n        \" ------ \",\n        \" ------ \",\n        \" ------ \",\n        \" ------ \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"▲\": {\n      \"ch\": \"▲\",\n      \"code\": 9650,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"   -    \",\n        \"   -    \",\n        \"  ---   \",\n        \"  ---   \",\n        \" -----  \",\n        \" -----  \",\n        \"------- \",\n        \"------- \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"▶\": {\n      \"ch\": \"▶\",\n      \"code\": 9654,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"--      \",\n        \"----    \",\n        \"------  \",\n        \"--------\",\n        \"------  \",\n        \"----    \",\n        \"--      \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"▼\": {\n      \"ch\": \"▼\",\n      \"code\": 9660,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"------- \",\n        \"------- \",\n        \" -----  \",\n        \" -----  \",\n        \"  ---   \",\n        \"  ---   \",\n        \"   -    \",\n        \"   -    \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"◀\": {\n      \"ch\": \"◀\",\n      \"code\": 9664,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"      --\",\n        \"    ----\",\n        \"  ------\",\n        \"--------\",\n        \"  ------\",\n        \"    ----\",\n        \"      --\",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"◆\": {\n      \"ch\": \"◆\",\n      \"code\": 9670,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"   -    \",\n        \"  ---   \",\n        \" -----  \",\n        \"------- \",\n        \" -----  \",\n        \"  ---   \",\n        \"   -    \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"◊\": {\n      \"ch\": \"◊\",\n      \"code\": 9674,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"   -    \",\n        \"  - -   \",\n        \" -   -  \",\n        \"-     - \",\n        \" -   -  \",\n        \"  - -   \",\n        \"   -    \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"○\": {\n      \"ch\": \"○\",\n      \"code\": 9675,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"   --   \",\n        \"  -  -  \",\n        \"  -  -  \",\n        \"   --   \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"●\": {\n      \"ch\": \"●\",\n      \"code\": 9679,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"   --   \",\n        \"  ----  \",\n        \"  ----  \",\n        \"   --   \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"◘\": {\n      \"ch\": \"◘\",\n      \"code\": 9688,\n      \"map\": [\n        \"--------\",\n        \"--------\",\n        \"--------\",\n        \"--------\",\n        \"--------\",\n        \"---  ---\",\n        \"--    --\",\n        \"--    --\",\n        \"---  ---\",\n        \"--------\",\n        \"--------\",\n        \"--------\",\n        \"--------\",\n        \"--------\"\n      ]\n    },\n    \"◙\": {\n      \"ch\": \"◙\",\n      \"code\": 9689,\n      \"map\": [\n        \"--------\",\n        \"--------\",\n        \"--------\",\n        \"--------\",\n        \"--------\",\n        \"---  ---\",\n        \"-- -- --\",\n        \"-- -- --\",\n        \"---  ---\",\n        \"--------\",\n        \"--------\",\n        \"--------\",\n        \"--------\",\n        \"--------\"\n      ]\n    },\n    \"☺\": {\n      \"ch\": \"☺\",\n      \"code\": 9786,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \" -----  \",\n        \"-     - \",\n        \"- - - - \",\n        \"-     - \",\n        \"-     - \",\n        \"- --- - \",\n        \"-  -  - \",\n        \"-     - \",\n        \"-     - \",\n        \" -----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"☻\": {\n      \"ch\": \"☻\",\n      \"code\": 9787,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \" -----  \",\n        \"------- \",\n        \"-- - -- \",\n        \"------- \",\n        \"------- \",\n        \"--   -- \",\n        \"--- --- \",\n        \"------- \",\n        \"------- \",\n        \" -----  \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"☼\": {\n      \"ch\": \"☼\",\n      \"code\": 9788,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"   -    \",\n        \"-  -  - \",\n        \" - - -  \",\n        \"  ---   \",\n        \"--- --- \",\n        \"  ---   \",\n        \" - - -  \",\n        \"-  -  - \",\n        \"   -    \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"♀\": {\n      \"ch\": \"♀\",\n      \"code\": 9792,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"  ---   \",\n        \" -   -  \",\n        \" -   -  \",\n        \" -   -  \",\n        \" -   -  \",\n        \"  ---   \",\n        \"   -    \",\n        \" -----  \",\n        \"   -    \",\n        \"   -    \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"♂\": {\n      \"ch\": \"♂\",\n      \"code\": 9794,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"   ---- \",\n        \"     -- \",\n        \"    - - \",\n        \"   -  - \",\n        \"  ---   \",\n        \" -   -  \",\n        \" -   -  \",\n        \" -   -  \",\n        \" -   -  \",\n        \"  ---   \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"♠\": {\n      \"ch\": \"♠\",\n      \"code\": 9824,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"   -    \",\n        \"   -    \",\n        \"  ---   \",\n        \" -----  \",\n        \"------- \",\n        \"------- \",\n        \" -----  \",\n        \"   -    \",\n        \"   -    \",\n        \"  ---   \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"♣\": {\n      \"ch\": \"♣\",\n      \"code\": 9827,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"   -    \",\n        \"  ---   \",\n        \"  ---   \",\n        \"   -    \",\n        \" - - -  \",\n        \"------- \",\n        \"------- \",\n        \" - - -  \",\n        \"   -    \",\n        \"  ---   \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"♥\": {\n      \"ch\": \"♥\",\n      \"code\": 9829,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \" -- --  \",\n        \"------- \",\n        \"------- \",\n        \"------- \",\n        \"------- \",\n        \" -----  \",\n        \"  ---   \",\n        \"   -    \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"♦\": {\n      \"ch\": \"♦\",\n      \"code\": 9830,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"   -    \",\n        \"  ---   \",\n        \" -----  \",\n        \"------- \",\n        \" -----  \",\n        \"  ---   \",\n        \"   -    \",\n        \"        \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"♪\": {\n      \"ch\": \"♪\",\n      \"code\": 9834,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"  ----- \",\n        \"  -   - \",\n        \"  ----- \",\n        \"  -     \",\n        \"  -     \",\n        \"  -     \",\n        \"  -     \",\n        \"  -     \",\n        \"  -     \",\n        \"--      \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"♫\": {\n      \"ch\": \"♫\",\n      \"code\": 9835,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \" ------ \",\n        \" -    - \",\n        \" ------ \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -   -  \",\n        \"-       \",\n        \"        \"\n      ]\n    },\n    \"✓\": {\n      \"ch\": \"✓\",\n      \"code\": 10003,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"      - \",\n        \"      - \",\n        \"     -  \",\n        \"     -  \",\n        \"-   -   \",\n        \"-   -   \",\n        \" - -    \",\n        \" - -    \",\n        \"  -     \",\n        \"  -     \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"✔\": {\n      \"ch\": \"✔\",\n      \"code\": 10004,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"      --\",\n        \"      --\",\n        \"     -- \",\n        \"     -- \",\n        \"--  --  \",\n        \"--  --  \",\n        \" ----   \",\n        \" ----   \",\n        \"  --    \",\n        \"  --    \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"✗\": {\n      \"ch\": \"✗\",\n      \"code\": 10007,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"     -  \",\n        \" -   -  \",\n        \"  - -   \",\n        \"   --   \",\n        \"   --   \",\n        \"   - -  \",\n        \"  -   - \",\n        \"  -     \",\n        \" -      \",\n        \" -      \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"✘\": {\n      \"ch\": \"✘\",\n      \"code\": 10008,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"    --  \",\n        \"--  --  \",\n        \" ----   \",\n        \"  ---   \",\n        \"  ---   \",\n        \"  ----  \",\n        \" --  -- \",\n        \" --     \",\n        \"--      \",\n        \"--      \",\n        \"        \",\n        \"        \"\n      ]\n    },\n    \"\": {\n      \"ch\": \"\",\n      \"code\": 57504,\n      \"map\": [\n        \"-       \",\n        \"-   -   \",\n        \"-  ---  \",\n        \"- - - - \",\n        \"-   -   \",\n        \"-   -   \",\n        \"-   -   \",\n        \"   -    \",\n        \"  -     \",\n        \" -      \",\n        \"-       \",\n        \"-       \",\n        \"-       \",\n        \"-       \"\n      ]\n    },\n    \"\": {\n      \"ch\": \"\",\n      \"code\": 57505,\n      \"map\": [\n        \"-       \",\n        \"-       \",\n        \"-       \",\n        \"-       \",\n        \"-       \",\n        \"-----   \",\n        \"        \",\n        \"   -   -\",\n        \"   --  -\",\n        \"   - - -\",\n        \"   -  --\",\n        \"   -   -\",\n        \"   -   -\",\n        \"        \"\n      ]\n    },\n    \"\": {\n      \"ch\": \"\",\n      \"code\": 57506,\n      \"map\": [\n        \"  ---   \",\n        \" -   -  \",\n        \" -   -  \",\n        \" -   -  \",\n        \" -   -  \",\n        \"------- \",\n        \"------- \",\n        \"--- --- \",\n        \"--   -- \",\n        \"--- --- \",\n        \"------- \",\n        \"------- \",\n        \"------- \",\n        \"        \"\n      ]\n    },\n    \"\": {\n      \"ch\": \"\",\n      \"code\": 57520,\n      \"map\": [\n        \"-       \",\n        \"--      \",\n        \"---     \",\n        \"----    \",\n        \"-----   \",\n        \"------  \",\n        \"------- \",\n        \"------- \",\n        \"------  \",\n        \"-----   \",\n        \"----    \",\n        \"---     \",\n        \"--      \",\n        \"-       \"\n      ]\n    },\n    \"\": {\n      \"ch\": \"\",\n      \"code\": 57521,\n      \"map\": [\n        \"-       \",\n        \" -      \",\n        \"  -     \",\n        \"   -    \",\n        \"    -   \",\n        \"     -  \",\n        \"      - \",\n        \"      - \",\n        \"     -  \",\n        \"    -   \",\n        \"   -    \",\n        \"  -     \",\n        \" -      \",\n        \"-       \"\n      ]\n    },\n    \"\": {\n      \"ch\": \"\",\n      \"code\": 57522,\n      \"map\": [\n        \"       -\",\n        \"      --\",\n        \"     ---\",\n        \"    ----\",\n        \"   -----\",\n        \"  ------\",\n        \" -------\",\n        \" -------\",\n        \"  ------\",\n        \"   -----\",\n        \"    ----\",\n        \"     ---\",\n        \"      --\",\n        \"       -\"\n      ]\n    },\n    \"\": {\n      \"ch\": \"\",\n      \"code\": 57523,\n      \"map\": [\n        \"       -\",\n        \"      - \",\n        \"     -  \",\n        \"    -   \",\n        \"   -    \",\n        \"  -     \",\n        \" -      \",\n        \" -      \",\n        \"  -     \",\n        \"   -    \",\n        \"    -   \",\n        \"     -  \",\n        \"      - \",\n        \"       -\"\n      ]\n    },\n    \"\": {\n      \"ch\": \"\",\n      \"code\": 63166,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"        \",\n        \"    --  \",\n        \"     -  \",\n        \"     -  \",\n        \"     -  \",\n        \"     -  \",\n        \"     -  \",\n        \" -   -  \",\n        \" -   -  \",\n        \"  ---   \"\n      ]\n    },\n    \"�\": {\n      \"ch\": \"�\",\n      \"code\": 65533,\n      \"map\": [\n        \"        \",\n        \"        \",\n        \" ------ \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" -    - \",\n        \" ------ \",\n        \"        \",\n        \"        \"\n      ]\n    }\n  }\n}"
  },
  {
    "path": "usr/xterm.termcap",
    "content": "# $XTermId: termcap,v 1.80 2012/06/10 14:30:37 tom Exp $\n#\n# These are termcap entries that correspond to xterm's terminfo file.\n# The file is formatted using ncurses' \"tic -CNx\", but is not mechanically\n# derived from the terminfo.\n#\n#------------------------------------------------------------------------------\n# Copyright 1996-2011,2012 by Thomas E. Dickey\n#\n#                         All Rights Reserved\n#\n# Permission is hereby granted, free of charge, to any person obtaining a\n# copy of this software and associated documentation files (the\n# \"Software\"), to deal in the Software without restriction, including\n# without limitation the rights to use, copy, modify, merge, publish,\n# distribute, sublicense, and/or sell copies of the Software, and to\n# permit persons to whom the Software is furnished to do so, subject to\n# the following conditions:\n#\n# The above copyright notice and this permission notice shall be included\n# in all copies or substantial portions of the Software.\n#\n# THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\n# IN NO EVENT SHALL THE ABOVE LISTED COPYRIGHT HOLDER(S) BE LIABLE FOR ANY\n# CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\n# TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\n# SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n#\n# Except as contained in this notice, the name(s) of the above copyright\n# holders shall not be used in advertising or otherwise to promote the\n# sale, use or other dealings in this Software without prior written\n# authorization.\n#------------------------------------------------------------------------------\n#\n# Note:\n#\ttermcap format is limited to 1023 characters.  This set of descriptions\n#\tis a subset of the terminfo, since not all features can be fit into\n#\tthat limit.  The 'xterm' description supports color.  The monochrome\n#\t'xterm-mono' drops color in favor of additional function keys.  If you\n#\tneed both, use terminfo.\n#\n#\tThe 1023-character limit applies to each entry after resolving the\n#\t\"tc=\" strings.  Some implementations may discount all or part of the\n#\tformatting characters in the entry (i.e., the backslash newline tab\n#\tcolon).  GNU termcap does not have this limit.\n#\n#\tI checked the limits using ncurses \"captoinfo -CrTUvx\", which prints\n#\tthe resolved length of each entry in a comment at the end - T.Dickey\n#\nxf|xterm-new|modern xterm:\\\n\t:*6=\\EOF:@7=\\EOF:F1=\\E[23~:F2=\\E[24~:K2=\\EOE:Km=\\E[M:\\\n\t:k1=\\EOP:k2=\\EOQ:k3=\\EOR:k4=\\EOS:k5=\\E[15~:k6=\\E[17~:\\\n\t:k7=\\E[18~:k8=\\E[19~:k9=\\E[20~:k;=\\E[21~:kB=\\E[Z:kH=\\EOF:\\\n\t:kI=\\E[2~:kN=\\E[6~:kP=\\E[5~:kd=\\EOB:kh=\\EOH:kl=\\EOD:\\\n\t:kr=\\EOC:ku=\\EOA:tc=xterm-basic:\n#\n# This chunk is used for building the VT220/Sun/PC keyboard variants.\nxb|xterm-basic|modern xterm common:\\\n\t:am:bs:km:mi:ms:ut:xn:AX:\\\n\t:Co#8:co#80:kn#12:li#24:pa#64:\\\n\t:AB=\\E[4%dm:AF=\\E[3%dm:AL=\\E[%dL:DC=\\E[%dP:DL=\\E[%dM:\\\n\t:DO=\\E[%dB:LE=\\E[%dD:RI=\\E[%dC:UP=\\E[%dA:ae=\\E(B:al=\\E[L:\\\n\t:as=\\E(0:bl=^G:cd=\\E[J:ce=\\E[K:cl=\\E[H\\E[2J:\\\n\t:cm=\\E[%i%d;%dH:cs=\\E[%i%d;%dr:ct=\\E[3g:dc=\\E[P:dl=\\E[M:\\\n\t:ei=\\E[4l:ho=\\E[H:im=\\E[4h:is=\\E[!p\\E[?3;4l\\E[4l\\E>:\\\n\t:kD=\\E[3~:ke=\\E[?1l\\E>:ks=\\E[?1h\\E=:le=^H:md=\\E[1m:\\\n\t:me=\\E[m:ml=\\El:mr=\\E[7m:mu=\\Em:nd=\\E[C:op=\\E[39;49m:\\\n\t:rc=\\E8:rs=\\E[!p\\E[?3;4l\\E[4l\\E>:sc=\\E7:se=\\E[27m:sf=^J:\\\n\t:so=\\E[7m:sr=\\EM:st=\\EH:te=\\E[?1049l:ti=\\E[?1049h:\\\n\t:ue=\\E[24m:up=\\E[A:us=\\E[4m:ve=\\E[?12l\\E[?25h:vi=\\E[?25l:\\\n\t:vs=\\E[?12;25h:tc=xterm+kbs:\n\n# The xterm-new description has all of the features, but is not completely\n# compatible with vt220.  If you are using a Sun or PC keyboard, set the\n# sunKeyboard resource to true:\n#\t+ maps the editing keypad\n#\t+ interprets control-function-key as a second array of keys, so a\n#\t  12-fkey keyboard can support vt220's 20-fkeys.\n#\t+ maps numeric keypad \"+\" to \",\".\n#\t+ uses DEC-style control sequences for the application keypad.\n#\nvt|xterm-vt220|xterm emulating vt220:\\\n\t:*6=\\E[4~:@7=\\E[4~:K2=\\EOu:Km=\\E[M:kB=\\E[Z:kH=\\E[4~:\\\n\t:kh=\\E[1~:tc=xterm-basic:\n\nv1|xterm-24|xterms|vs100|24x80 xterm:\\\n\t:li#24:tc=xterm-old:\nv2|xterm-65|65x80 xterm:\\\n\t:li#65:tc=xterm-old:\nvb|xterm-bold|xterm with bold for underline:\\\n\t:so=\\E[7m:us=\\E[1m:tc=xterm-old:\nvB|xterm-boldso|xterm with bold for standout:\\\n\t:se=\\E[m:so=\\E[1m:tc=xterm-old:\nvm|xterm-mono|monochrome xterm:\\\n\t:ut@:\\\n\t:Co@:NC@:kn#20:pa@:\\\n\t:AB@:AF@:Sb@:Sf@:op@:st@:tc=xterm-old:\n#\n# Alternate terminal description that \"works\" for interactive shells such as\n# tcsh and bash.\nxn|xterm-noapp|xterm with cursor keys in normal mode:\\\n\t:kd=\\E[B:ke=\\E>:kl=\\E[D:kr=\\E[C:ks=\\E=:ku=\\E[A:te@:ti@:\\\n\t:tc=xterm:\n#\n# This should work for the commonly used \"color xterm\" variations (XFree86\n# xterm, color_xterm, nxterm, rxvt).  Note that it does not set 'bce', so for\n# XFree86 and rxvt, some applications that use colors will be less efficient,\n# and in a few special cases (with \"smart\" optimization) the wrong color will\n# be painted in spots.\nvc|xterm-color|generic \"ANSI\" color xterm:\\\n\t:Co#8:NC@:pa#64:\\\n\t:AB=\\E[4%dm:AF=\\E[3%dm:ac=:op=\\E[m:tc=xterm-r6:\n#\n# These aliases are for compatibility with the terminfo; termcap cannot provide\n# the extra features such as color initialization, but termcap applications\n# still want the names.\nx1|xterm-16color|xterm alias:\\\n\t:tc=xterm-new:\n\nx2|xterm-88color|xterm alias:\\\n\t:Co#88:pa#7744:tc=xterm-256color:\n\nx3|xterm-256color|xterm alias:\\\n\t:Co#256:pa#32767:\\\n\t:AB=\\E[48;5;%dm:AF=\\E[38;5;%dm:tc=xterm-new:\n\nxi|xterm-nrc|xterm alias:\\\n\t:tc=xterm:\nxr|xterm-rep|xterm alias:\\\n\t:tc=xterm:\nxx|xterm-xmc|xterm alias:\\\n\t:sg#1:tc=xterm:\n#\n# An 8-bit description is doable with termcap, but there are probably no\n# termcap (or BSD curses) applications that are able to use it.\nx8|xterm-8bit|xterm terminal emulator 8-bit controls (X Window System):\\\n\t:am:km:mi:ms:xn:\\\n\t:co#80:it#8:li#24:\\\n\t:AL=\\233%dL:DC=\\233%dP:DL=\\233%dM:DO=\\233%dB:IC=\\233%d@:\\\n\t:K2=\\217y:Km=\\233M:LE=\\233%dD:RI=\\233%dC:UP=\\233%dA:\\\n\t:ae=\\E(B:al=\\233L:as=\\E(0:bl=^G:bt=\\233Z:cd=\\233J:ce=\\233K:\\\n\t:cl=\\233H\\2332J:cm=\\233%i%d;%dH:cr=^M:cs=\\233%i%d;%dr:\\\n\t:ct=\\2333g:dc=\\233P:dl=\\233M:do=^J:ei=\\2334l:ho=\\233H:\\\n\t:im=\\2334h:\\\n\t:is=\\E[62\"p\\E G\\233m\\233?7h\\E>\\E7\\233?1;3;4;6l\\2334l\\233r\\E8:\\\n\t:k1=\\23311~:k2=\\23312~:k3=\\23313~:k4=\\23314~:k5=\\23315~:\\\n\t:k6=\\23317~:k7=\\23318~:k8=\\23319~:k9=\\23320~:kD=\\2333~:\\\n\t:kI=\\2332~:kN=\\2336~:kP=\\2335~:kd=\\217B:ke=\\233?1l\\E>:\\\n\t:kh=\\2331~:kl=\\217D:kr=\\217C:ks=\\233?1h\\E=:ku=\\217A:le=^H:\\\n\t:mb=\\2335m:md=\\2331m:me=\\233m:mr=\\2337m:nd=\\233C:rc=\\E8:\\\n\t:sc=\\E7:se=\\23327m:sf=^J:so=\\2337m:sr=\\215:st=\\210:ta=^I:\\\n\t:te=\\233?1049l:ti=\\233?1049h:ue=\\23324m:up=\\233A:\\\n\t:us=\\2334m:vb=\\233?5h\\233?5l:ve=\\233?25l\\233?25h:\\\n\t:vi=\\233?25l:vs=\\233?12;25h:tc=xterm+kbs:\n#\nhp|xterm-hp|xterm with hpterm function keys:\\\n\t:@7=\\EF:k1=\\Ep:k2=\\Eq:k3=\\Er:k4=\\Es:k5=\\Et:k6=\\Eu:k7=\\Ev:\\\n\t:k8=\\Ew:kC=\\EJ:kD=\\EP:kI=\\EQ:kN=\\ES:kP=\\ET:kd=\\EB:kh=\\Eh:\\\n\t:kl=\\ED:kr=\\EC:ku=\\EA:tc=xterm-basic:\n#\nxS|xterm-sco|xterm with SCO function keys:\\\n\t:@7=\\E[F:F1=\\E[W:F2=\\E[X:F3=\\E[Y:F5=\\E[a:F6=\\E[b:F7=\\E[c:\\\n\t:F8=\\E[d:F9=\\E[e:FA=\\E[f:FB=\\E[g:FC=\\E[h:FD=\\E[i:FE=\\E[j:\\\n\t:FF=\\E[k:ac=:k1=\\E[M:k2=\\E[N:k3=\\E[O:k4=\\E[P:k5=\\E[Q:\\\n\t:k6=\\E[R:k7=\\E[S:k8=\\E[T:k9=\\E[U:k;=\\E[V:kD=\\177:kI=\\E[L:\\\n\t:kN=\\E[G:kP=\\E[I:kd=\\E[B:kh=\\E[H:kl=\\E[D:kr=\\E[C:ku=\\E[A:\\\n\t:tc=xterm-basic:\n#\nv5|xterm-vt52|xterm emulating vt52:\\\n\t:bs:\\\n\t:co#80:it#8:li#24:\\\n\t:ae=\\EG:as=\\EF:bl=^G:cd=\\EJ:ce=\\EK:cl=\\EH\\EJ:cm=\\EY%+ %+ :\\\n\t:cr=^M:do=\\EB:ho=\\EH:kd=\\EB:kl=\\ED:kr=\\EC:ku=\\EA:le=\\ED:\\\n\t:nd=\\EC:nw=^M^J:sf=^J:sr=\\EI:ta=^I:up=\\EA:tc=xterm+kbs:\n#\nxs|xterm-sun|xterm with Sun functionkeys:\\\n\t:%1=\\E[196z:&8=\\E[195z:@0=\\E[200z:@5=\\E[197z:@7=\\E[220z:\\\n\t:F1=\\E[192z:F2=\\E[193z:K2=\\E[218z:Km=\\E[M:k1=\\E[224z:\\\n\t:k2=\\E[225z:k3=\\E[226z:k4=\\E[227z:k5=\\E[228z:k6=\\E[229z:\\\n\t:k7=\\E[230z:k8=\\E[231z:k9=\\E[232z:k;=\\E[233z:kD=\\E[3z:\\\n\t:kI=\\E[2z:kN=\\E[222z:kP=\\E[216z:kh=\\E[214z:\\\n\t:tc=xterm-basic:\n#\n# vi may work better with this entry, because vi doesn't use insert mode much.\n# |xterm-ic|xterm-vi|xterm with insert character instead of insert mode:\\\nvi|xterm-ic|xterm-vi|xterm with insert char:\\\n\t:mi@:\\\n\t:IC=\\E[%d@:ei@:ic=\\E[@:im@:tc=xterm:\n#\n# Compatible with the X11R6.3 xterm\nr6|xterm-r6|xterm-old|X11R6 xterm:\\\n\t:am:bs:km:mi:ms:pt:xn:\\\n\t:co#80:kn#20:li#24:\\\n\t:*6=\\E[4~:@0=\\E[1~:@7=\\E[4~:AL=\\E[%dL:DC=\\E[%dP:DL=\\E[%dM:\\\n\t:DO=\\E[%dB:F1=\\E[23~:F2=\\E[24~:F3=\\E[25~:F4=\\E[26~:\\\n\t:F5=\\E[28~:F6=\\E[29~:F7=\\E[31~:F8=\\E[32~:F9=\\E[33~:\\\n\t:FA=\\E[34~:LE=\\E[%dD:RI=\\E[%dC:UP=\\E[%dA:ae=^O:al=\\E[L:\\\n\t:as=^N:bl=^G:cd=\\E[J:ce=\\E[K:cl=\\E[H\\E[2J:cm=\\E[%i%d;%dH:\\\n\t:cs=\\E[%i%d;%dr:ct=\\E[3g:dc=\\E[P:dl=\\E[M:eA=\\E)0:ei=\\E[4l:\\\n\t:ho=\\E[H:im=\\E[4h:\\\n\t:is=\\E[m\\E[?7h\\E[4l\\E>\\E7\\E[r\\E[?1;3;4;6l\\E8:\\\n\t:k1=\\E[11~:k2=\\E[12~:k3=\\E[13~:k4=\\E[14~:k5=\\E[15~:\\\n\t:k6=\\E[17~:k7=\\E[18~:k8=\\E[19~:k9=\\E[20~:k;=\\E[21~:\\\n\t:kD=\\E[3~:kI=\\E[2~:kN=\\E[6~:kP=\\E[5~:kd=\\EOB:ke=\\E[?1l\\E>:\\\n\t:kh=\\E[1~:kl=\\EOD:kr=\\EOC:ks=\\E[?1h\\E=:ku=\\EOA:md=\\E[1m:\\\n\t:me=\\E[m:ml=\\El:mr=\\E[7m:mu=\\Em:nd=\\E[C:rc=\\E8:\\\n\t:rs=\\E[m\\E[?7h\\E[4l\\E>\\E7\\E[r\\E[?1;3;4;6l\\E8:sc=\\E7:\\\n\t:se=\\E[m:sf=^J:so=\\E[7m:sr=\\EM:te=\\E[2J\\E[?47l\\E8:\\\n\t:ti=\\E7\\E[?47h:ue=\\E[m:up=\\E[A:us=\\E[4m:tc=xterm+kbs:\n#\n# Compatible with the R5 xterm\nr5|xterm-r5|X11R5 xterm X11R5:\\\n\t:am:bs:km:mi:ms:pt:xn:\\\n\t:co#80:kn#4:li#24:\\\n\t:@7=\\E[4~:AL=\\E[%dL:DC=\\E[%dP:DL=\\E[%dM:DO=\\E[%dB:\\\n\t:IC=\\E[%d@:UP=\\E[%dA:al=\\E[L:cd=\\E[J:ce=\\E[K:cl=\\E[H\\E[2J:\\\n\t:cm=\\E[%i%d;%dH:cs=\\E[%i%d;%dr:ct=\\E[3g:dc=\\E[P:dl=\\E[M:\\\n\t:ei=\\E[4l:ho=\\E[H:im=\\E[4h:\\\n\t:is=\\E[r\\E[m\\E[2J\\E[H\\E[?7h\\E[?1;3;4;6l\\E[4l:\\\n\t:k1=\\E[11~:k2=\\E[12~:k3=\\E[13~:k4=\\E[14~:kd=\\EOB:\\\n\t:ke=\\E[?1l\\E>:kh=\\E[1~:kl=\\EOD:kr=\\EOC:ks=\\E[?1h\\E=:\\\n\t:ku=\\EOA:md=\\E[1m:me=\\E[m:mr=\\E[7m:nd=\\E[C:rc=\\E8:\\\n\t:rs=\\E>\\E[?1;3;4;5;6l\\E[4l\\E[?7h\\E[m\\E[r\\E[2J\\E[H:\\\n\t:sc=\\E7:se=\\E[m:sf=^J:so=\\E[7m:sr=\\EM:te=\\E[2J\\E[?47l\\E8:\\\n\t:ti=\\E7\\E[?47h:ue=\\E[m:up=\\E[A:us=\\E[4m:tc=xterm+kbs:\n#\n# Customization begins here.\nx0|xterm-xfree86|xterm terminal emulator (XFree86):\\\n\t:tc=xterm-new:\n#\n# This is the only entry which you should have to customize, since \"xterm\"\n# is widely used for a variety of incompatible terminal emulations including\n# color_xterm and rxvt.\nv0|xterm|X11 terminal emulator:\\\n\t:tc=xterm-new:\n#\t:tc=xterm-r6:\n\n# This fragment is for people who cannot agree on what the backspace key\n# should send.\nxterm+kbs|fragment for backspace key:\\\n\t:kb=^H:\n"
  },
  {
    "path": "usr/xterm.terminfo",
    "content": "# $XTermId: terminfo,v 1.161 2012/09/05 00:24:08 tom Exp $\n#\n# Updates/notes/new entries (e.g., xterm-8bit, xterm-16color, xterm-256color)\n# - Thomas E. Dickey\n#\n#------------------------------------------------------------------------------\n# Copyright 1996-2011,2012 by Thomas E. Dickey\n#\n#                         All Rights Reserved\n#\n# Permission is hereby granted, free of charge, to any person obtaining a\n# copy of this software and associated documentation files (the\n# \"Software\"), to deal in the Software without restriction, including\n# without limitation the rights to use, copy, modify, merge, publish,\n# distribute, sublicense, and/or sell copies of the Software, and to\n# permit persons to whom the Software is furnished to do so, subject to\n# the following conditions:\n#\n# The above copyright notice and this permission notice shall be included\n# in all copies or substantial portions of the Software.\n#\n# THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\n# IN NO EVENT SHALL THE ABOVE LISTED COPYRIGHT HOLDER(S) BE LIABLE FOR ANY\n# CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\n# TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\n# SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n#\n# Except as contained in this notice, the name(s) of the above copyright\n# holders shall not be used in advertising or otherwise to promote the\n# sale, use or other dealings in this Software without prior written\n# authorization.\n#------------------------------------------------------------------------------\n#\n# Special Capabilities:\n# --------------------\n# ich has a corresponding capability that inserts a single blank.  We could\n#\thave used ich1=\\E[@, which works with ncurses, but that is not standard\n#\tbehavior.  If it is set, then SVr4 vi (e.g., Solaris 2.6) emits both\n#\tsmir/rmir and ich1.\n# meml locks memory above the cursor; memu unlocks (ala HP terminals).  This\n#\tis not recognized by some older (e.g., SVr3) tic programs, but none\n#\tdo more than warn about it.  Ignore the warning.\n# smcup clears memory before switching to the alternate screen.  The older\n#\t(deprecated) \\E[?47h did not do this, requiring applications to\n#\tembed a \\E[2J in the rmcup string.  However, that behavior cannot\n#\tbe disabled via titeInhibit, making that resource not function as\n#\tintended on systems with terminfo.\n# rs2/is2 are shorter with XFree86 xterm because it supports DECSTR.  We\n#\tuse the shorter sequence for compatibility with the termcap, which\n#\tis trimmed to keep it shorter than 1023 characters.  It (escape \\E[!p)\n#\treplaces these in the conventional vt100 reset-string:\n#\t\t\\E7\t- save cursor (fixes origin-mode side-effect)\n#\t\t\\E[r\t- reset scrolling margins\n#\t\t\\E[m\t- reset SGR (including color)\n#\t\t\\E[?7h\t- reset wraparound mode (DECAWM)\n#\t\t\\E[?1l\t- reset application cursor keys (DECCKM)\n#\t\t\\E[?6l\t- reset origin mode (DECOM)\n#\t\t\\E8\t- restore cursor\n#\tDECSTR is recognized by XFree86 xterm even in vt52 mode.\n#\n# Editing Keypad:\n# --------------\n# XFree86 xterm emulates vt220 if the decTerminalID resource is set to 200 or\n# higher.  Otherwise it emulates a vt100 or vt52 depending on the value of the\n# resource.  When emulating a vt220, we support the editing keypad.  Sun and PC\n# keyboards have an editing keypad which is similar to the vt220:\n#\n#\tVT220 editing keypad\n#\t----------------------------\n#\tFind      Insert      Remove\n#\tSelect    Prev        Next\n#\t----------------------------\n#\n#\tSun/PC editing keypad\n#\t----------------------------\n#\tInsert    Home        PageUp\n#\tDelete    End         PageDn\n#\t----------------------------\n#\n# If the sunKeyboard resource is true, we map it this way (adjusting the values\n# of Home, End and Delete):\n#\tVT220\t\t      Sun/PC\n#\t----------------------------\n#\tFind\t\t      Home\n#\tSelect\t\t      End\n#\tInsert\t\t      Insert\n#\tRemove\t\t      Delete\n#\tPrev\t\t      PageUp\n#\tNext\t\t      PageDn\n#\t----------------------------\n#\n# Note that all of the keys on the editing keypad transmit escape sequences.  A\n# vt220 does this only when in vt220 mode; when emulating a vt100 the editing\n# keypad is inactive.\n#\n# Alternative keycodes:\n# --------------------\n# Several of the function keys have alternative names, depending on the type of\n# host which your xterm is connected to.  DEC (i.e., the VMS system) uses F15\n# as the HELP key, F16 as the DO key.  Unix applications generally do not do\n# this.  Curses applications in particular, assign a unique keycode to each\n# capability string.  These terminal descriptions do not have conflicting\n# definitions, to ensure that Unix curses applications use a consistent set of\n# keycodes.  To get a VMS-bias, make these substitutions:\n#\t1. change khome to kfnd\n#\t2. change kend to kslt\n# The original xterm-r6 entry does in fact have a VMS bias.\n#\n# Some legacy applications using the termcap emulation may expect kll where\n# we have specified kend.\n#\n# Function keys with modifiers (Sun/PC):\n# -------------------------------------\n#\tShift-Fx          - kf{12+x}\n#\tControl-Fx        - kf{24+x}\n#\tShift-Control-Fx  - kf{36+x}\n#\n# The terminfo defines some special keys which are documented as \"shifted\",\n# e.g., kDC is shifted-delete-character.\n#\n# Note however, that even though the terminfo says a key might be sent, there\n# may be conflicts which prevent this.  For example, it is common to use\n# shifted pageup and pagedown for window manager functions.  The default\n# translation for xterm since X11R4 has overridden shifted Insert, Select,\n# PageUp and PageDown, which correspond to terminfo kIC, kEND, kPRV and kNXT\n# respectively.\n#\nxterm-new|modern xterm terminal emulator,\n\tnpc,\n\tindn=\\E[%p1%dS,\n\tkb2=\\EOE,\n\tkcbt=\\E[Z,\n\tkent=\\EOM,\n\trin=\\E[%p1%dT,\n\tuse=xterm+pcfkeys,\n\tuse=xterm+tmux,\n\tuse=xterm-basic,\n#\n# Encode modifiers using parameters (see \"Xterm Control Sequences\" ctlseqs.ms).\n# Note that this is unrelated to PCTERM.\n#\n# Some names are extensions allowed by ncurses, e.g.,\n#\tkDN, kDN5, kDN6, kLFT5, kLFT6, kRIT5, kRIT6, kUP, kUP5, kUP6\n#\n# The uppercase names are made up, since there are no standards that apply.\n# If they were limited to two characters, they could in principle be translated\n# to termcap.  However, termcap sizes are limited to 1023 bytes, so there is\n# little point in ensuring that extended key names can be translated to\n# termcap.  A terminfo file can be up to 4096 bytes; using all extended keys\n# that xterm can generate would in fact exceed that limit.\n#\n# The numbers correspond to the modifier parameters documented in Xterm\n# Control Sequences:\n#\n#\t2\tShift\n#\t3\tAlt\n#\t4\tShift + Alt\n#\t5\tControl\n#\t6\tShift + Control\n#\t7\tAlt + Control\n#\t8\tShift + Alt + Control\n#\n# X/Open Curses defines some shift combinations, which are also used here\n# where applicable.  Since it does define some shift combinations, no number\n# (2) is used for suffixing the made-up names.  Some combinations are not\n# useful, e.g., they may reboot your computer, or they may require too many\n# fingers.  I stopped at modifier 7, just to keep things simple -TD\n#\n# XTerm resources:\n# ---------------\n# The xterm+pcfn, xterm+pcf0, xterm+pcf1, xterm+pcf2 and xterm+pcf3 fragments\n# correspond to default resource settings for xterm on a 104-key PC keyboard\n# with 12 function-keys:\n#\n#\t*sunKeyboard:false\n#\t*oldXtermFKeys:false\n#\t*modifyCursorKeys:2\n#\t*modifyFunctionKeys:2\n#\t*ctrlFKeys:10\n#\n# The key numbers are computed based on the modifiers:\n#\n#\tkf1-kf12 are F1-F12\n#\tkf13-kf24 are shift F1-F12\n#\tkf25-kf36 are control F1-F12\n#\tkf37-kf48 are control+shift F1-F12\n#\tkf49-kf60 are alt F1-F12\n#\tkf61-kf63 are shift-alt F1-F3\n#\n# Note that ncurses would allow definition of kf64 and beyond, if there were\n# an application that required it.\n#\nxterm+pcfkeys|fragment for PC-style keys,\n\tuse=xterm+app,\n\tuse=xterm+pcf2,\n\tuse=xterm+pce2,\n\tuse=xterm+pcc2,\n\n# This chunk is based on suggestions by Ailin Nemui and Nicholas Marriott, who\n# asked for some of xterm's advanced features to be added to its terminfo\n# entry.  It defines extended capabilities not found in standard terminfo or\n# termcap.  These are useful in tmux, for instance, hence the name.\n#\n# One caveat in adding extended capabilities in ncurses is that if the names\n# are longer than two characters, then they will not be visible through the\n# termcap interface.\n#\n# Ms modifies the selection/clipboard.  Its parameters are\n#\tp1 = the storage unit (clipboard, selection or cut buffer)\n#\tp2 = the base64-encoded clipboard content.\n# \n# Ss is used to set the cursor style as described by the DECSCUSR\n#\tfunction to a block or underline.\n# Se resets the cursor style to the terminal power-on default.\n#  \n# Cs and Ce set and reset the cursor colour.\nxterm+tmux|advanced xterm features used in tmux,\n\tCr=\\E]112\\007,\n\tCs=\\E]12;%p1%s\\007,\n\tMs=\\E]52;%p1%s;%p2%s\\007,\n\tSe=\\E[2 q,\n\tSs=\\E[%p1%d q,\n#\n# The ctrlFKeys resource is only relevant to the xterm+pcfn and xterm+pcfN\n# entries, since the modifyFunctionKeys resource overrides ctrlFKeys when it is\n# positive.  A different choice of ctrlFKeys would give a different set of\n# function-key strings.\nxterm+pcfn|fragment with modifyFunctionKeys:-1 and ctrlFKeys:10,\n\tkf1=\\EOP,\n\tkf10=\\E[21~,\n\tkf11=\\E[23~,\n\tkf12=\\E[24~,\n\tkf13=\\E[25~,\n\tkf14=\\E[26~,\n\tkf15=\\E[28~,\n\tkf16=\\E[29~,\n\tkf17=\\E[31~,\n\tkf18=\\E[32~,\n\tkf19=\\E[33~,\n\tkf2=\\EOQ,\n\tkf20=\\E[34~,\n\tkf21=\\E[42~,\n\tkf22=\\E[43~,\n\tkf23=\\E[44~,\n\tkf24=\\E[45~,\n\tkf25=\\E[46~,\n\tkf26=\\E[47~,\n\tkf27=\\E[48~,\n\tkf28=\\E[49~,\n\tkf29=\\E[50~,\n\tkf3=\\EOR,\n\tkf30=\\E[51~,\n\tkf31=\\E[52~,\n\tkf32=\\E[53~,\n\tkf33=\\E[54~,\n\tkf34=\\E[55~,\n\tkf35=\\E[56~,\n\tkf36=\\E[57~,\n\tkf37=\\E[58~,\n\tkf38=\\E[59~,\n\tkf39=\\E[60~,\n\tkf4=\\EOS,\n\tkf40=\\E[61~,\n\tkf41=\\E[62~,\n\tkf42=\\E[63~,\n\tkf43=\\E[64~,\n\tkf44=\\E[65~,\n\tkf45=\\E[66~,\n\tkf46=\\E[67~,\n\tkf47=\\E[68~,\n\tkf48=\\E[69~,\n\tkf5=\\E[15~,\n\tkf6=\\E[17~,\n\tkf7=\\E[18~,\n\tkf8=\\E[19~,\n\tkf9=\\E[20~,\n\n# Changing ctrlFKeys to 12 would let us number the keys using just shift- and\n# control- modifiers:\n#\tkf1-kf12 are F1-F12\n#\tkf13-kf24 are shift F1-F12\n#\tkf25-kf36 are control F1-F12\n#\tkf37-kf48 are control+shift F1-F12\nxterm+pcfN|fragment with modifyFunctionKeys:-1 and ctrlFKeys:12,\n\tkf1=\\EOP,\n\tkf10=\\E[21~,\n\tkf11=\\E[23~,\n\tkf12=\\E[24~,\n\tkf13=\\E[25~,\n\tkf14=\\E[26~,\n\tkf15=\\E[28~,\n\tkf16=\\E[29~,\n\tkf17=\\E[31~,\n\tkf18=\\E[32~,\n\tkf19=\\E[33~,\n\tkf2=\\EOQ,\n\tkf20=\\E[34~,\n\tkf21=\\E[42~,\n\tkf22=\\E[43~,\n\tkf23=\\E[44~,\n\tkf24=\\E[45~,\n\tkf25=\\E[46~,\n\tkf26=\\E[47~,\n\tkf27=\\E[48~,\n\tkf28=\\E[49~,\n\tkf29=\\E[50~,\n\tkf3=\\EOR,\n\tkf30=\\E[51~,\n\tkf31=\\E[52~,\n\tkf32=\\E[53~,\n\tkf33=\\E[54~,\n\tkf34=\\E[55~,\n\tkf35=\\E[56~,\n\tkf36=\\E[57~,\n\tkf37=\\E[58~,\n\tkf38=\\E[59~,\n\tkf39=\\E[60~,\n\tkf4=\\EOS,\n\tkf40=\\E[61~,\n\tkf41=\\E[62~,\n\tkf42=\\E[63~,\n\tkf43=\\E[64~,\n\tkf44=\\E[65~,\n\tkf45=\\E[66~,\n\tkf46=\\E[67~,\n\tkf47=\\E[68~,\n\tkf48=\\E[69~,\n\tkf5=\\E[15~,\n\tkf6=\\E[17~,\n\tkf7=\\E[18~,\n\tkf8=\\E[19~,\n\tkf9=\\E[20~,\n\nxterm+pcf0|fragment with modifyFunctionKeys:0,\n\tkf1=\\EOP,\n\tkf10=\\E[21~,\n\tkf11=\\E[23~,\n\tkf12=\\E[24~,\n\tkf13=\\EO2P,\n\tkf14=\\EO2Q,\n\tkf15=\\EO2R,\n\tkf16=\\EO2S,\n\tkf17=\\E[15;2~,\n\tkf18=\\E[17;2~,\n\tkf19=\\E[18;2~,\n\tkf2=\\EOQ,\n\tkf20=\\E[19;2~,\n\tkf21=\\E[20;2~,\n\tkf22=\\E[21;2~,\n\tkf23=\\E[23;2~,\n\tkf24=\\E[24;2~,\n\tkf25=\\EO5P,\n\tkf26=\\EO5Q,\n\tkf27=\\EO5R,\n\tkf28=\\EO5S,\n\tkf29=\\E[15;5~,\n\tkf3=\\EOR,\n\tkf30=\\E[17;5~,\n\tkf31=\\E[18;5~,\n\tkf32=\\E[19;5~,\n\tkf33=\\E[20;5~,\n\tkf34=\\E[21;5~,\n\tkf35=\\E[23;5~,\n\tkf36=\\E[24;5~,\n\tkf37=\\EO6P,\n\tkf38=\\EO6Q,\n\tkf39=\\EO6R,\n\tkf4=\\EOS,\n\tkf40=\\EO6S,\n\tkf41=\\E[15;6~,\n\tkf42=\\E[17;6~,\n\tkf43=\\E[18;6~,\n\tkf44=\\E[19;6~,\n\tkf45=\\E[20;6~,\n\tkf46=\\E[21;6~,\n\tkf47=\\E[23;6~,\n\tkf48=\\E[24;6~,\n\tkf49=\\EO3P,\n\tkf5=\\E[15~,\n\tkf50=\\EO3Q,\n\tkf51=\\EO3R,\n\tkf52=\\EO3S,\n\tkf53=\\E[15;3~,\n\tkf54=\\E[17;3~,\n\tkf55=\\E[18;3~,\n\tkf56=\\E[19;3~,\n\tkf57=\\E[20;3~,\n\tkf58=\\E[21;3~,\n\tkf59=\\E[23;3~,\n\tkf6=\\E[17~,\n\tkf60=\\E[24;3~,\n\tkf61=\\EO4P,\n\tkf62=\\EO4Q,\n\tkf63=\\EO4R,\n\tkf7=\\E[18~,\n\tkf8=\\E[19~,\n\tkf9=\\E[20~,\n\n# This is almost the same as xterm+pcf2 because the unmodified keys all happen\n# to have a pattern that forces the modifier to the same position.\nxterm+pcf1|fragment with modifyFunctionKeys:1,\n\tkf1=\\EOP,\n\tkf10=\\E[21~,\n\tkf11=\\E[23~,\n\tkf12=\\E[24~,\n\tkf13=\\E[2P,\n\tkf14=\\E[2Q,\n\tkf15=\\E[2R,\n\tkf16=\\E[2S,\n\tkf17=\\E[15;2~,\n\tkf18=\\E[17;2~,\n\tkf19=\\E[18;2~,\n\tkf2=\\EOQ,\n\tkf20=\\E[19;2~,\n\tkf21=\\E[20;2~,\n\tkf22=\\E[21;2~,\n\tkf23=\\E[23;2~,\n\tkf24=\\E[24;2~,\n\tkf25=\\E[5P,\n\tkf26=\\E[5Q,\n\tkf27=\\E[5R,\n\tkf28=\\E[5S,\n\tkf29=\\E[15;5~,\n\tkf3=\\EOR,\n\tkf30=\\E[17;5~,\n\tkf31=\\E[18;5~,\n\tkf32=\\E[19;5~,\n\tkf33=\\E[20;5~,\n\tkf34=\\E[21;5~,\n\tkf35=\\E[23;5~,\n\tkf36=\\E[24;5~,\n\tkf37=\\E[6P,\n\tkf38=\\E[6Q,\n\tkf39=\\E[6R,\n\tkf4=\\EOS,\n\tkf40=\\E[6S,\n\tkf41=\\E[15;6~,\n\tkf42=\\E[17;6~,\n\tkf43=\\E[18;6~,\n\tkf44=\\E[19;6~,\n\tkf45=\\E[20;6~,\n\tkf46=\\E[21;6~,\n\tkf47=\\E[23;6~,\n\tkf48=\\E[24;6~,\n\tkf49=\\E[3P,\n\tkf5=\\E[15~,\n\tkf50=\\E[3Q,\n\tkf51=\\E[3R,\n\tkf52=\\E[3S,\n\tkf53=\\E[15;3~,\n\tkf54=\\E[17;3~,\n\tkf55=\\E[18;3~,\n\tkf56=\\E[19;3~,\n\tkf57=\\E[20;3~,\n\tkf58=\\E[21;3~,\n\tkf59=\\E[23;3~,\n\tkf6=\\E[17~,\n\tkf60=\\E[24;3~,\n\tkf61=\\E[4P,\n\tkf62=\\E[4Q,\n\tkf63=\\E[4R,\n\tkf7=\\E[18~,\n\tkf8=\\E[19~,\n\tkf9=\\E[20~,\n\nxterm+pcf2|fragment with modifyFunctionKeys:2,\n\tkf1=\\EOP,\n\tkf10=\\E[21~,\n\tkf11=\\E[23~,\n\tkf12=\\E[24~,\n\tkf13=\\E[1;2P,\n\tkf14=\\E[1;2Q,\n\tkf15=\\E[1;2R,\n\tkf16=\\E[1;2S,\n\tkf17=\\E[15;2~,\n\tkf18=\\E[17;2~,\n\tkf19=\\E[18;2~,\n\tkf2=\\EOQ,\n\tkf20=\\E[19;2~,\n\tkf21=\\E[20;2~,\n\tkf22=\\E[21;2~,\n\tkf23=\\E[23;2~,\n\tkf24=\\E[24;2~,\n\tkf25=\\E[1;5P,\n\tkf26=\\E[1;5Q,\n\tkf27=\\E[1;5R,\n\tkf28=\\E[1;5S,\n\tkf29=\\E[15;5~,\n\tkf3=\\EOR,\n\tkf30=\\E[17;5~,\n\tkf31=\\E[18;5~,\n\tkf32=\\E[19;5~,\n\tkf33=\\E[20;5~,\n\tkf34=\\E[21;5~,\n\tkf35=\\E[23;5~,\n\tkf36=\\E[24;5~,\n\tkf37=\\E[1;6P,\n\tkf38=\\E[1;6Q,\n\tkf39=\\E[1;6R,\n\tkf4=\\EOS,\n\tkf40=\\E[1;6S,\n\tkf41=\\E[15;6~,\n\tkf42=\\E[17;6~,\n\tkf43=\\E[18;6~,\n\tkf44=\\E[19;6~,\n\tkf45=\\E[20;6~,\n\tkf46=\\E[21;6~,\n\tkf47=\\E[23;6~,\n\tkf48=\\E[24;6~,\n\tkf49=\\E[1;3P,\n\tkf5=\\E[15~,\n\tkf50=\\E[1;3Q,\n\tkf51=\\E[1;3R,\n\tkf52=\\E[1;3S,\n\tkf53=\\E[15;3~,\n\tkf54=\\E[17;3~,\n\tkf55=\\E[18;3~,\n\tkf56=\\E[19;3~,\n\tkf57=\\E[20;3~,\n\tkf58=\\E[21;3~,\n\tkf59=\\E[23;3~,\n\tkf6=\\E[17~,\n\tkf60=\\E[24;3~,\n\tkf61=\\E[1;4P,\n\tkf62=\\E[1;4Q,\n\tkf63=\\E[1;4R,\n\tkf7=\\E[18~,\n\tkf8=\\E[19~,\n\tkf9=\\E[20~,\n\nxterm+pcf3|fragment with modifyFunctionKeys:3,\n\tkf1=\\EOP,\n\tkf10=\\E[21~,\n\tkf11=\\E[23~,\n\tkf12=\\E[24~,\n\tkf13=\\E[>1;2P,\n\tkf14=\\E[>1;2Q,\n\tkf15=\\E[>1;2R,\n\tkf16=\\E[>1;2S,\n\tkf17=\\E[>15;2~,\n\tkf18=\\E[>17;2~,\n\tkf19=\\E[>18;2~,\n\tkf2=\\EOQ,\n\tkf20=\\E[>19;2~,\n\tkf21=\\E[>20;2~,\n\tkf22=\\E[>21;2~,\n\tkf23=\\E[>23;2~,\n\tkf24=\\E[>24;2~,\n\tkf25=\\E[>1;5P,\n\tkf26=\\E[>1;5Q,\n\tkf27=\\E[>1;5R,\n\tkf28=\\E[>1;5S,\n\tkf29=\\E[>15;5~,\n\tkf3=\\EOR,\n\tkf30=\\E[>17;5~,\n\tkf31=\\E[>18;5~,\n\tkf32=\\E[>19;5~,\n\tkf33=\\E[>20;5~,\n\tkf34=\\E[>21;5~,\n\tkf35=\\E[>23;5~,\n\tkf36=\\E[>24;5~,\n\tkf37=\\E[>1;6P,\n\tkf38=\\E[>1;6Q,\n\tkf39=\\E[>1;6R,\n\tkf4=\\EOS,\n\tkf40=\\E[>1;6S,\n\tkf41=\\E[>15;6~,\n\tkf42=\\E[>17;6~,\n\tkf43=\\E[>18;6~,\n\tkf44=\\E[>19;6~,\n\tkf45=\\E[>20;6~,\n\tkf46=\\E[>21;6~,\n\tkf47=\\E[>23;6~,\n\tkf48=\\E[>24;6~,\n\tkf49=\\E[>1;3P,\n\tkf5=\\E[15~,\n\tkf50=\\E[>1;3Q,\n\tkf51=\\E[>1;3R,\n\tkf52=\\E[>1;3S,\n\tkf53=\\E[>15;3~,\n\tkf54=\\E[>17;3~,\n\tkf55=\\E[>18;3~,\n\tkf56=\\E[>19;3~,\n\tkf57=\\E[>20;3~,\n\tkf58=\\E[>21;3~,\n\tkf59=\\E[>23;3~,\n\tkf6=\\E[17~,\n\tkf60=\\E[>24;3~,\n\tkf61=\\E[>1;4P,\n\tkf62=\\E[>1;4Q,\n\tkf63=\\E[>1;4R,\n\tkf7=\\E[18~,\n\tkf8=\\E[19~,\n\tkf9=\\E[20~,\n#\n# The \"PC-style\" modifier scheme was introduced in xterm patch #94 (1999/3/27)\n# and revised in patch #167 (2002/8/24).\n#\n# The original assignments from patch #94 for cursor-keys had some technical\n# issues:\n#\n#\tA parameter for a function-key to represent a modifier is just more\n#\tbits.  But for a cursor-key it may change the behavior of the\n#\tapplication.  For instance, emacs decodes the first parameter of a\n#\tcursor-key as a repeat count.\n#\n#\tA parameterized string should (really) not begin with SS3 (\\EO).\n#\tRather, CSI (\\E[) should be used.\n#\n# For these reasons, the original assignments were deprecated.  For\n# compatibility reasons, they are still available as a setting of xterm's\n# modifyCursorKeys resource.  These fragments list the modified cursor-keys\n# that might apply to xterm+pcfkeys with different values of that resource.\nxterm+pcc3|fragment with modifyCursorKeys:3,\n\tkLFT=\\E[>1;2D,\n\tkRIT=\\E[>1;2C,\n\tkind=\\E[>1;2B,\n\tkri=\\E[>1;2A,\n\tkDN=\\E[>1;2B,\n\tkDN3=\\E[>1;3B,\n\tkDN4=\\E[>1;4B,\n\tkDN5=\\E[>1;5B,\n\tkDN6=\\E[>1;6B,\n\tkDN7=\\E[>1;7B,\n\tkLFT3=\\E[>1;3D,\n\tkLFT4=\\E[>1;4D,\n\tkLFT5=\\E[>1;5D,\n\tkLFT6=\\E[>1;6D,\n\tkLFT7=\\E[>1;7D,\n\tkRIT3=\\E[>1;3C,\n\tkRIT4=\\E[>1;4C,\n\tkRIT5=\\E[>1;5C,\n\tkRIT6=\\E[>1;6C,\n\tkRIT7=\\E[>1;7C,\n\tkUP=\\E[>1;2A,\n\tkUP3=\\E[>1;3A,\n\tkUP4=\\E[>1;4A,\n\tkUP5=\\E[>1;5A,\n\tkUP6=\\E[>1;6A,\n\tkUP7=\\E[>1;7A,\n\nxterm+pcc2|fragment with modifyCursorKeys:2,\n\tkLFT=\\E[1;2D,\n\tkRIT=\\E[1;2C,\n\tkind=\\E[1;2B,\n\tkri=\\E[1;2A,\n\tkDN=\\E[1;2B,\n\tkDN3=\\E[1;3B,\n\tkDN4=\\E[1;4B,\n\tkDN5=\\E[1;5B,\n\tkDN6=\\E[1;6B,\n\tkDN7=\\E[1;7B,\n\tkLFT3=\\E[1;3D,\n\tkLFT4=\\E[1;4D,\n\tkLFT5=\\E[1;5D,\n\tkLFT6=\\E[1;6D,\n\tkLFT7=\\E[1;7D,\n\tkRIT3=\\E[1;3C,\n\tkRIT4=\\E[1;4C,\n\tkRIT5=\\E[1;5C,\n\tkRIT6=\\E[1;6C,\n\tkRIT7=\\E[1;7C,\n\tkUP=\\E[1;2A,\n\tkUP3=\\E[1;3A,\n\tkUP4=\\E[1;4A,\n\tkUP5=\\E[1;5A,\n\tkUP6=\\E[1;6A,\n\tkUP7=\\E[1;7A,\n\nxterm+pcc1|fragment with modifyCursorKeys:1,\n\tkLFT=\\E[2D,\n\tkRIT=\\E[2C,\n\tkind=\\E[2B,\n\tkri=\\E[2A,\n\tkDN=\\E[2B,\n\tkDN3=\\E[3B,\n\tkDN4=\\E[4B,\n\tkDN5=\\E[5B,\n\tkDN6=\\E[6B,\n\tkDN7=\\E[7B,\n\tkLFT3=\\E[3D,\n\tkLFT4=\\E[4D,\n\tkLFT5=\\E[5D,\n\tkLFT6=\\E[6D,\n\tkLFT7=\\E[7D,\n\tkRIT3=\\E[3C,\n\tkRIT4=\\E[4C,\n\tkRIT5=\\E[5C,\n\tkRIT6=\\E[6C,\n\tkRIT7=\\E[7C,\n\tkUP=\\E[2A,\n\tkUP3=\\E[3A,\n\tkUP4=\\E[4A,\n\tkUP5=\\E[5A,\n\tkUP6=\\E[6A,\n\tkUP7=\\E[7A,\n\nxterm+pcc0|fragment with modifyCursorKeys:0,\n\tkLFT=\\EO2D,\n\tkRIT=\\EO2C,\n\tkind=\\EO2B,\n\tkri=\\EO2A,\n\tkDN=\\EO2B,\n\tkDN3=\\EO3B,\n\tkDN4=\\EO4B,\n\tkDN5=\\EO5B,\n\tkDN6=\\EO6B,\n\tkDN7=\\EO7B,\n\tkLFT3=\\EO3D,\n\tkLFT4=\\EO4D,\n\tkLFT5=\\EO5D,\n\tkLFT6=\\EO6D,\n\tkLFT7=\\EO7D,\n\tkRIT3=\\EO3C,\n\tkRIT4=\\EO4C,\n\tkRIT5=\\EO5C,\n\tkRIT6=\\EO6C,\n\tkRIT7=\\EO7C,\n\tkUP=\\EO2A,\n\tkUP3=\\EO3A,\n\tkUP4=\\EO4A,\n\tkUP5=\\EO5A,\n\tkUP6=\\EO6A,\n\tkUP7=\\EO7A,\n\n# The home/end keys on the editing keypad are also treated as cursor keys.\nxterm+pce3|fragment with modifyCursorKeys:3,\n\tkDC=\\E[>3;2~,\n\tkEND=\\E[>1;2F,\n\tkHOM=\\E[>1;2H,\n\tkIC=\\E[>2;2~,\n\tkNXT=\\E[>6;2~,\n\tkPRV=\\E[>5;2~,\n\tkDC3=\\E[>3;3~,\n\tkDC4=\\E[>3;4~,\n\tkDC5=\\E[>3;5~,\n\tkDC6=\\E[>3;6~,\n\tkDC7=\\E[>3;7~,\n\tkEND3=\\E[>1;3F,\n\tkEND4=\\E[>1;4F,\n\tkEND5=\\E[>1;5F,\n\tkEND6=\\E[>1;6F,\n\tkEND7=\\E[>1;7F,\n\tkHOM3=\\E[>1;3H,\n\tkHOM4=\\E[>1;4H,\n\tkHOM5=\\E[>1;5H,\n\tkHOM6=\\E[>1;6H,\n\tkHOM7=\\E[>1;7H,\n\tkIC3=\\E[>2;3~,\n\tkIC4=\\E[>2;4~,\n\tkIC5=\\E[>2;5~,\n\tkIC6=\\E[>2;6~,\n\tkIC7=\\E[>2;7~,\n\tkNXT3=\\E[>6;3~,\n\tkNXT4=\\E[>6;4~,\n\tkNXT5=\\E[>6;5~,\n\tkNXT6=\\E[>6;6~,\n\tkNXT7=\\E[>6;7~,\n\tkPRV3=\\E[>5;3~,\n\tkPRV4=\\E[>5;4~,\n\tkPRV5=\\E[>5;5~,\n\tkPRV6=\\E[>5;6~,\n\tkPRV7=\\E[>5;7~,\n\tuse=xterm+pce0,\n\nxterm+pce2|fragment with modifyCursorKeys:2,\n\tkDC=\\E[3;2~,\n\tkEND=\\E[1;2F,\n\tkHOM=\\E[1;2H,\n\tkIC=\\E[2;2~,\n\tkNXT=\\E[6;2~,\n\tkPRV=\\E[5;2~,\n\tkDC3=\\E[3;3~,\n\tkDC4=\\E[3;4~,\n\tkDC5=\\E[3;5~,\n\tkDC6=\\E[3;6~,\n\tkDC7=\\E[3;7~,\n\tkEND3=\\E[1;3F,\n\tkEND4=\\E[1;4F,\n\tkEND5=\\E[1;5F,\n\tkEND6=\\E[1;6F,\n\tkEND7=\\E[1;7F,\n\tkHOM3=\\E[1;3H,\n\tkHOM4=\\E[1;4H,\n\tkHOM5=\\E[1;5H,\n\tkHOM6=\\E[1;6H,\n\tkHOM7=\\E[1;7H,\n\tkIC3=\\E[2;3~,\n\tkIC4=\\E[2;4~,\n\tkIC5=\\E[2;5~,\n\tkIC6=\\E[2;6~,\n\tkIC7=\\E[2;7~,\n\tkNXT3=\\E[6;3~,\n\tkNXT4=\\E[6;4~,\n\tkNXT5=\\E[6;5~,\n\tkNXT6=\\E[6;6~,\n\tkNXT7=\\E[6;7~,\n\tkPRV3=\\E[5;3~,\n\tkPRV4=\\E[5;4~,\n\tkPRV5=\\E[5;5~,\n\tkPRV6=\\E[5;6~,\n\tkPRV7=\\E[5;7~,\n\tuse=xterm+pce0,\n\nxterm+pce1|fragment with modifyCursorKeys:1,\n\tkDC=\\E[3;2~,\n\tkEND=\\E[2F,\n\tkHOM=\\E[2H,\n\tkIC=\\E[2;2~,\n\tkNXT=\\E[6;2~,\n\tkPRV=\\E[5;2~,\n\tkDC3=\\E[3;3~,\n\tkDC4=\\E[3;4~,\n\tkDC5=\\E[3;5~,\n\tkDC6=\\E[3;6~,\n\tkDC7=\\E[3;7~,\n\tkEND3=\\E[3F,\n\tkEND4=\\E[4F,\n\tkEND5=\\E[5F,\n\tkEND6=\\E[6F,\n\tkEND7=\\E[7F,\n\tkHOM3=\\E[3H,\n\tkHOM4=\\E[4H,\n\tkHOM5=\\E[5H,\n\tkHOM6=\\E[6H,\n\tkHOM7=\\E[7H,\n\tkIC3=\\E[2;3~,\n\tkIC4=\\E[2;4~,\n\tkIC5=\\E[2;5~,\n\tkIC6=\\E[2;6~,\n\tkIC7=\\E[2;7~,\n\tkNXT3=\\E[6;3~,\n\tkNXT4=\\E[6;4~,\n\tkNXT5=\\E[6;5~,\n\tkNXT6=\\E[6;6~,\n\tkNXT7=\\E[6;7~,\n\tkPRV3=\\E[5;3~,\n\tkPRV4=\\E[5;4~,\n\tkPRV5=\\E[5;5~,\n\tkPRV6=\\E[5;6~,\n\tkPRV7=\\E[5;7~,\n\tuse=xterm+pce0,\n\nxterm+pce0|fragment with modifyCursorKeys:0,\n\tkDC=\\E[3;2~,\n\tkEND=\\EO2F,\n\tkHOM=\\EO2H,\n\tkIC=\\E[2;2~,\n\tkNXT=\\E[6;2~,\n\tkPRV=\\E[5;2~,\n\tkDC3=\\E[3;3~,\n\tkDC4=\\E[3;4~,\n\tkDC5=\\E[3;5~,\n\tkDC6=\\E[3;6~,\n\tkDC7=\\E[3;7~,\n\tkEND3=\\EO3F,\n\tkEND4=\\EO4F,\n\tkEND5=\\EO5F,\n\tkEND6=\\EO6F,\n\tkEND7=\\EO7F,\n\tkHOM3=\\EO3H,\n\tkHOM4=\\EO4H,\n\tkHOM5=\\EO5H,\n\tkHOM6=\\EO6H,\n\tkHOM7=\\EO7H,\n\tkIC3=\\E[2;3~,\n\tkIC4=\\E[2;4~,\n\tkIC5=\\E[2;5~,\n\tkIC6=\\E[2;6~,\n\tkIC7=\\E[2;7~,\n\tkNXT3=\\E[6;3~,\n\tkNXT4=\\E[6;4~,\n\tkNXT5=\\E[6;5~,\n\tkNXT6=\\E[6;6~,\n\tkNXT7=\\E[6;7~,\n\tkPRV3=\\E[5;3~,\n\tkPRV4=\\E[5;4~,\n\tkPRV5=\\E[5;5~,\n\tkPRV6=\\E[5;6~,\n\tkPRV7=\\E[5;7~,\n\tuse=xterm+edit,\n#\n# This chunk is used for building the VT220/Sun/PC keyboard variants.\nxterm-basic|modern xterm terminal emulator - common,\n\tOTbs,\n\tam,\n\tbce,\n\tkm,\n\tmc5i,\n\tmir,\n\tmsgr,\n\txenl,\n\tAX,\n\tXT,\n\tcolors#8,\n\tcols#80,\n\tit#8,\n\tlines#24,\n\tpairs#64,\n\tacsc=``aaffggiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~,\n\tbel=^G,\n\tblink=\\E[5m,\n\tbold=\\E[1m,\n\tcbt=\\E[Z,\n\tcivis=\\E[?25l,\n\tclear=\\E[H\\E[2J,\n\tcnorm=\\E[?12l\\E[?25h,\n\tcr=^M,\n\tcsr=\\E[%i%p1%d;%p2%dr,\n\tcub=\\E[%p1%dD,\n\tcub1=^H,\n\tcud=\\E[%p1%dB,\n\tcud1=^J,\n\tcuf=\\E[%p1%dC,\n\tcuf1=\\E[C,\n\tcup=\\E[%i%p1%d;%p2%dH,\n\tcuu=\\E[%p1%dA,\n\tcuu1=\\E[A,\n\tcvvis=\\E[?12;25h,\n\tdch=\\E[%p1%dP,\n\tdch1=\\E[P,\n\tdl=\\E[%p1%dM,\n\tdl1=\\E[M,\n\tech=\\E[%p1%dX,\n\ted=\\E[J,\n\tel=\\E[K,\n\tel1=\\E[1K,\n\tflash=\\E[?5h$<100/>\\E[?5l,\n\thome=\\E[H,\n\thpa=\\E[%i%p1%dG,\n\tht=^I,\n\thts=\\EH,\n\tich=\\E[%p1%d@,\n\til=\\E[%p1%dL,\n\til1=\\E[L,\n\tind=^J,\n\tinvis=\\E[8m,\n\tis2=\\E[!p\\E[?3;4l\\E[4l\\E>,\n\tkmous=\\E[M,\n\tmc0=\\E[i,\n\tmc4=\\E[4i,\n\tmc5=\\E[5i,\n\tmeml=\\El,\n\tmemu=\\Em,\n\top=\\E[39;49m,\n\trc=\\E8,\n\trev=\\E[7m,\n\tri=\\EM,\n\trmacs=\\E(B,\n\trmam=\\E[?7l,\n\trmcup=\\E[?1049l,\n\trmir=\\E[4l,\n\trmkx=\\E[?1l\\E>,\n\trmm=\\E[?1034l,\n\trmso=\\E[27m,\n\trmul=\\E[24m,\n\trs1=\\Ec,\n\trs2=\\E[!p\\E[?3;4l\\E[4l\\E>,\n\tsc=\\E7,\n\tsetab=\\E[4%p1%dm,\n\tsetaf=\\E[3%p1%dm,\n\tsetb=\\E[4%?%p1%{1}%=%t4%e%p1%{3}%=%t6%e%p1%{4}%=%t1%e%p1%{6}%=%t3%e%p1%d%;m,\n\tsetf=\\E[3%?%p1%{1}%=%t4%e%p1%{3}%=%t6%e%p1%{4}%=%t1%e%p1%{6}%=%t3%e%p1%d%;m,\n\tsgr=%?%p9%t\\E(0%e\\E(B%;\\E[0%?%p6%t;1%;%?%p2%t;4%;%?%p1%p3%|%t;7%;%?%p4%t;5%;%?%p7%t;8%;m,\n\tsgr0=\\E(B\\E[m,\n\tsmacs=\\E(0,\n\tsmam=\\E[?7h,\n\tsmcup=\\E[?1049h,\n\tsmir=\\E[4h,\n\tsmkx=\\E[?1h\\E=,\n\tsmm=\\E[?1034h,\n\tsmso=\\E[7m,\n\tsmul=\\E[4m,\n\ttbc=\\E[3g,\n\tu6=\\E[%i%d;%dR,\n\tu7=\\E[6n,\n\tu8=\\E[?1;2c,\n\tu9=\\E[c,\n\tvpa=\\E[%i%p1%dd,\n\tE3=\\E[3;J,\n\tuse=xterm+kbs,\n#\n# The xterm-new description has all of the features, but is not completely\n# compatible with vt220.  If you are using a Sun or PC keyboard, set the\n# sunKeyboard resource to true:\n#\t+ maps the editing keypad\n#\t+ interprets control-function-key as a second array of keys, so a\n#\t  12-fkey keyboard can support vt220's 20-fkeys.\n#\t+ maps numeric keypad \"+\" to \",\".\n#\t+ uses DEC-style control sequences for the application keypad.\n#\n# Some packagers modify xterm's resource definitions to provide extra function\n# keys by using the shift-modifier in the translations resource.  However, that\n# interferes with the DECUDK functionality.\n#\nxterm-vt220|xterm emulating vt220,\n\tka1=\\EOw,\n\tka3=\\EOy,\n\tkb2=\\EOu,\n\tkc1=\\EOq,\n\tkc3=\\EOs,\n\tkcbt=\\E[Z,\n\tkend=\\E[4~,\n\tkent=\\EOM,\n\tkf1=\\EOP,\n\tkf10=\\E[21~,\n\tkf11=\\E[23~,\n\tkf12=\\E[24~,\n\tkf13=\\E[25~,\n\tkf14=\\E[26~,\n\tkf15=\\E[28~,\n\tkf16=\\E[29~,\n\tkf17=\\E[31~,\n\tkf18=\\E[32~,\n\tkf19=\\E[33~,\n\tkf2=\\EOQ,\n\tkf20=\\E[34~,\n\tkf3=\\EOR,\n\tkf4=\\EOS,\n\tkf5=\\E[15~,\n\tkf6=\\E[17~,\n\tkf7=\\E[18~,\n\tkf8=\\E[19~,\n\tkf9=\\E[20~,\n\tkhome=\\E[1~,\n\tkich1=\\E[2~,\n\tknp=\\E[6~,\n\tkpp=\\E[5~,\n\tka2=\\EOx,\n\tkb1=\\EOt,\n\tkb3=\\EOv,\n\tkc2=\\EOr,\n\tuse=xterm+app,\n\tuse=xterm+edit,\n\tuse=xterm-basic,\n#\nxterm-vt52|xterm emulating dec vt52,\n\tcols#80,\n\tit#8,\n\tlines#24,\n\tacsc=``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~,\n\tbel=^G,\n\tclear=\\EH\\EJ,\n\tcr=^M,\n\tcub1=\\ED,\n\tcud1=\\EB,\n\tcuf1=\\EC,\n\tcup=\\EY%p1%' '%+%c%p2%' '%+%c,\n\tcuu1=\\EA,\n\ted=\\EJ,\n\tel=\\EK,\n\thome=\\EH,\n\tht=^I,\n\tind=^J,\n\tkcub1=\\ED,\n\tkcud1=\\EB,\n\tkcuf1=\\EC,\n\tkcuu1=\\EA,\n\tnel=^M^J,\n\tri=\\EI,\n\trmacs=\\EG,\n\tsmacs=\\EF,\n\tuse=xterm+kbs,\n#\n# Sun does not number the function keys this way in their sparse termcap; their\n# terminal descriptions ignore the keypads.  kb(7M) states that there are codes\n# reserved for 64 function keys, 16 each in left, right, top and bottom.  Each\n# keyboard type has a different number of function keys in different\n# arrangements.  Using xkeycaps for reference:\n#\n# Type 3:  left 10, top 9, right 15\n# ------\n# kf1-kf9 are XK_F1-XK_F9\n# There is no kf10 on this keyboard type.\n# kf11-kf20 are keysyms XK_L1 through XK_L10.\n# kf31-kf45 are keysyms XK_R1 through XK_R15.\n#\n# However, X's keysymdef.h is hard-coded to make\n#\tXK_L1==XK_F11 and\n#\tXK_R1==XK_F21,\n# by someone who was unfamiliar with terminal types other than Sun's.  So\n# xterm uses the internal X keysymbols, but the terminfo entry uses the Sun\n# numbering scheme.\n#\n# Type 4:  left 11, top 12, right 15\n# ------\n# The left-keypad contains an unnumbered Help-key.\n# The right-keypad also contains NumLock, Ins, Del, Enter, + and - keys which\n# do not appear to be part of the R-sequence.\n#\n# Type 5:  left 9, top 12, right (more than one keypad)\n# ------\n# These keyboards do not use the same naming convention, look like a hybrid of\n# the type 4 and IBM keyboards.\n#\n# XTerm resources:\n# ---------------\n# Set the modifyFunctionKeys resource to negative (-1) to make it simple to\n# enter the higher function-key values using shift- and control-modifiers.\n#\nxterm-sun|xterm with sun function keys,\n\tkb2=\\E[218z,\n\tkcpy=\\E[197z,\n\tkcub1=\\EOD,\n\tkcud1=\\EOB,\n\tkcuf1=\\EOC,\n\tkcuu1=\\EOA,\n\tkdch1=\\E[3z,\n\tkend=\\E[220z,\n\tkent=\\EOM,\n\tkf1=\\E[224z,\n\tkf10=\\E[233z,\n\tkf11=\\E[192z,\n\tkf12=\\E[193z,\n\tkf13=\\E[194z,\n\tkf14=\\E[195z,\n\tkf15=\\E[196z,\n\tkf17=\\E[198z,\n\tkf18=\\E[199z,\n\tkf19=\\E[200z,\n\tkf2=\\E[225z,\n\tkf20=\\E[201z,\n\tkf3=\\E[226z,\n\tkf31=\\E[208z,\n\tkf32=\\E[209z,\n\tkf33=\\E[210z,\n\tkf34=\\E[211z,\n\tkf35=\\E[212z,\n\tkf36=\\E[213z,\n\tkf38=\\E[215z,\n\tkf4=\\E[227z,\n\tkf40=\\E[217z,\n\tkf42=\\E[219z,\n\tkf44=\\E[221z,\n\tkf45=\\E[222z,\n\tkf46=\\E[234z,\n\tkf47=\\E[235z,\n\tkf5=\\E[228z,\n\tkf6=\\E[229z,\n\tkf7=\\E[230z,\n\tkf8=\\E[231z,\n\tkf9=\\E[232z,\n\tkfnd=\\E[200z,\n\tkhlp=\\E[196z,\n\tkhome=\\E[214z,\n\tkich1=\\E[2z,\n\tknp=\\E[222z,\n\tkpp=\\E[216z,\n\tkund=\\E[195z,\n\tuse=xterm-basic,\n#\nxterm-hp|xterm with hpterm function keys,\n\tkclr=\\EJ,\n\tkcub1=\\ED,\n\tkcud1=\\EB,\n\tkcuf1=\\EC,\n\tkcuu1=\\EA,\n\tkdch1=\\EP,\n\tkend=\\EF,\n\tkf1=\\Ep,\n\tkf2=\\Eq,\n\tkf3=\\Er,\n\tkf4=\\Es,\n\tkf5=\\Et,\n\tkf6=\\Eu,\n\tkf7=\\Ev,\n\tkf8=\\Ew,\n\tkhome=\\Eh,\n\tkich1=\\EQ,\n\tknp=\\ES,\n\tkpp=\\ET,\n\tuse=xterm-basic,\n#\n# scoterm implements 48 function-keys using shift- and control-modifiers to\n# multiple 12 function-keys.  X has a hard-coded limit of 35 function-keys,\n# but xterm can represent larger values.\n#\n# XTerm resources:\n# ---------------\n# Set the modifyFunctionKeys resource to negative (-1) to make it simple to\n# enter the higher function-key values using shift- and control-modifiers.\n#\n# Also, set ctrlFKeys resource to 12 (the default is 10) to make xterm see 48\n# function-keys on a keyboard with 12 function-keys and 4 control/shift\n# modifier combinations.\n#\nxterm-sco|xterm with SCO function keys,\n\tkbeg=\\E[E,\n\tkdch1=\\177,\n\tkf1=\\E[M,\n\tkf10=\\E[V,\n\tkf11=\\E[W,\n\tkf12=\\E[X,\n\tkf13=\\E[Y,\n\tkf14=\\E[Z,\n\tkf15=\\E[a,\n\tkf16=\\E[b,\n\tkf17=\\E[c,\n\tkf18=\\E[d,\n\tkf19=\\E[e,\n\tkf2=\\E[N,\n\tkf20=\\E[f,\n\tkf21=\\E[g,\n\tkf22=\\E[h,\n\tkf23=\\E[i,\n\tkf24=\\E[j,\n\tkf25=\\E[k,\n\tkf26=\\E[l,\n\tkf27=\\E[m,\n\tkf28=\\E[n,\n\tkf29=\\E[o,\n\tkf3=\\E[O,\n\tkf30=\\E[p,\n\tkf31=\\E[q,\n\tkf32=\\E[r,\n\tkf33=\\E[s,\n\tkf34=\\E[t,\n\tkf35=\\E[u,\n\tkf36=\\E[v,\n\tkf37=\\E[w,\n\tkf38=\\E[x,\n\tkf39=\\E[y,\n\tkf4=\\E[P,\n\tkf40=\\E[z,\n\tkf41=\\E[@,\n\tkf42=\\E[[,\n\tkf43=\\E[\\\\,\n\tkf44=\\E[],\n\tkf45=\\E[\\^,\n\tkf46=\\E[_,\n\tkf47=\\E[`,\n\tkf48=\\E[{,\n\tkf5=\\E[Q,\n\tkf6=\\E[R,\n\tkf7=\\E[S,\n\tkf8=\\E[T,\n\tkf9=\\E[U,\n\tkich1=\\E[L,\n\tkmous=\\E[>M,\n\tknp=\\E[G,\n\tkpp=\\E[I,\n\tuse=xterm+noapp,\n\tuse=xterm-basic,\n#\n# Other variants (these are all very old entries, from X11R5):\nxterm-24|xterms|vs100|xterm terminal emulator (X Window System),\n\tlines#24,\n\tuse=xterm-old,\nxterm-65|xterm with tall window 65x80 (X Window System),\n\tlines#65,\n\tuse=xterm-old,\nxterm-bold|xterm with bold instead of underline (X Window System),\n\tsgr=%?%p9%t\\016%e\\017%;B\\E[0%?%p6%t;1%;%?%p2%t;1%;%?%p1%p3%|%t;7%;m,\n\tsmso=\\E[7m,\n\tsmul=\\E[1m,\n\tuse=xterm-old,\nxterm-boldso|xterm with bold for standout (X Window System),\n\trmso=\\E[m,\n\tsmso=\\E[1m,\n\tuse=xterm-old,\nxterm-mono|monochrome xterm,\n\tbce@,\n\tcolors@,\n\tncv@,\n\tpairs@,\n\top@,\n\tsetab@,\n\tsetaf@,\n\tsetb@,\n\tsetf@,\n\tsgr@,\n\tuse=xterm-old,\n#\n# VTxxx terminals are usually set up so that full-screen applications will use\n# the cursor application mode strings.  This is good for full-screen\n# applications, including legacy applications which may have hard-coded\n# behavior, but bad for interactive shells (e.g., tcsh, bash) which use arrow\n# keys to scroll through a history of command strings.\n#\n# To see the difference between normal/application modes, consider this example:\n#\t+ In normal (non-application) mode, the terminal transmits a down-arrow\n#\t  as \\E[C, which happens to echo as a down-arrow.\n#\t+ In application mode the terminal transmits \\EOC, which echoes as C.\n#\t  That is because the \\EO is the SS3 control, which says to use the\n#\t  character from the G3 character set for the next cell.\n#\n# One example of hard-coded behavior would be for applications written to work\n# with VT52 and VT100 terminals.  If the application's parser ignores 'O' and\n# '?' characters after the escape, then the cursor and keypad strings for the\n# two terminals are the same.  (Indeed, one of the first curses applications\n# which I used did something like this to cover \"ANSI\" terminals -TD).\n#\n# To make this work (leaving the cursor keys in normal mode), we have to adjust\n# the terminal initialization sequences:\n#\n#\tsmkx/rmkx set/reset the cursor and keypad application modes.  We retain\n#\t\tthe latter (otherwise many applications fail).\n#\n#\tsmcup/rmcup set/restore cursor-addressing mode for full-screen\n#\t\tapplications.  For xterm, this normally means the alternate\n#\t\tscreen, which is not compatible with interactive shells.  Some\n#\t\tprograms are \"smart\" and disable these.\n#\nxterm-noapp|xterm with cursor keys in normal mode,\n\trmcup@,\n\trmkx=\\E>,\n\tsmcup@,\n\tsmkx=\\E=,\n\tuse=xterm+noapp,\n\tuse=xterm,\n\nxterm+noapp|fragment with cursor keys in normal mode,\n\tkcub1=\\E[D,\n\tkcud1=\\E[B,\n\tkcuf1=\\E[C,\n\tkcuu1=\\E[A,\n\tuse=xterm+noapp+pc,\n\nxterm+app|fragment with cursor keys in application mode,\n\tkcub1=\\EOD,\n\tkcud1=\\EOB,\n\tkcuf1=\\EOC,\n\tkcuu1=\\EOA,\n\tuse=xterm+app+pc,\n\nxterm+noapp+pc|fragment for noapp pc-style home/end,\n\tkend=\\E[F,\n\tkhome=\\E[H,\n\nxterm+app+pc|fragment for app pc-style home/end,\n\tkend=\\EOF,\n\tkhome=\\EOH,\n\nxterm+edit|fragment for 6-key editing-keypad,\n\tkdch1=\\E[3~,\n\tkich1=\\E[2~,\n\tknp=\\E[6~,\n\tkpp=\\E[5~,\n\tuse=xterm+pc+edit,\n\nxterm+decedit|fragment for vt220 6-key editing-keypad,\n\tkdch1=\\E[3~,\n\tkich1=\\E[2~,\n\tknp=\\E[6~,\n\tkpp=\\E[5~,\n\tuse=xterm+vt+edit,\n\nxterm+pc+edit|fragment for pc-style editing keypad,\n\tkend=\\E[4~,\n\tkhome=\\E[1~,\n\nxterm+vt+edit|fragment for vt220-style editing keypad,\n\tkfnd=\\E[1~,\n\tkslt=\\E[4~,\n\n#\n# This should work for the commonly used \"color xterm\" variations (XFree86\n# xterm, color_xterm, nxterm, rxvt).  Note that it does not set 'bce', so for\n# XFree86 and and rxvt, some applications that use colors will be less\n# efficient, and in a few special cases (with \"smart\" optimization) the wrong\n# color will be painted in spots.\nxterm-color|generic \"ANSI\" color xterm (X Window System),\n\tcolors#8,\n\tncv@,\n\tpairs#64,\n\top=\\E[m,\n\tsetab=\\E[4%p1%dm,\n\tsetaf=\\E[3%p1%dm,\n\tuse=xterm-r6,\n#\n# vi may work better with this entry, because vi\n# doesn't use insert mode much\nxterm-ic|xterm-vi|xterm with insert character instead of insert mode,\n\tmir@,\n\tich=\\E[%p1%d@,\n\tich1=\\E[@,\n\trmir@,\n\tsmir@,\n\tuse=xterm,\n#\n# This is used only for testing (it's not relevant to DEC VTxxx terminals, but\n# to ncurses).\nxterm-xmc|xterm with magic-cookie glitch,\n\txmc#1,\n\tuse=xterm-new,\n#\n# This one also is primarily for testing ncurses; while the ISO 6429 defines\n# the REP control, none of the DEC VTxxx terminals (VT52 through VT420) support\n# it.\nxterm-rep|xterm with repeat-character control,\n\trep=%p1%c\\E[%p2%{1}%-%db,\n\tuse=xterm-new,\n#\n# This is mainly for testing xterm; the real VT220 will not let you switch\n# character sets without first altering the keyboard language in the setup\n# screen.  Some emulators allow this anyway.  (Note that these strings are\n# normally used only for printers).  The parameter to csnm and scs is the same\n# in both cases:  the keyboard language parameter returned by CSI ? 2 6 n.\nxterm-nrc|xterm with VT220 national replacement character sets,\n\tcsnm=%?%p1%{1}%=%tNorth American%e%p1%{2}%=%tBritish%e%p1%{3}%=%tFlemish%e%p1%{4}%=%tFrench Canadian%e%p1%{5}%=%tDanish%e%p1%{6}%=%tFinnish%e%p1%{7}%=%tGerman%e%p1%{8}%=%tDutch%e%p1%{9}%=%tItalian%e%p1%{10}%=%tSwiss (French)%e%p1%{11}%=%tSwiss (German)%e%p1%{12}%=%tSwedish%e%p1%{13}%=%tNorwegian%e%p1%{14}%=%tFrench/Belgian%e%p1%{15}%=%tSpanish%;,\n\tscs=%?%p1%{1}%=%t\\E(B%e%p1%{2}%=%t\\E(A%e%p1%{3}%=%t\\E(R%e%p1%{4}%=%t\\E(9%e%p1%{5}%=%t\\E(E%e%p1%{6}%=%t\\E(5%e%p1%{7}%=%t\\E(K%e%p1%{8}%=%t\\E(4%e%p1%{9}%=%t\\E(Y%e%p1%{10}%=%t\\E(=%e%p1%{11}%=%t\\E(=%e%p1%{12}%=%t\\E(7%e%p1%{13}%=%t\\E(E%e%p1%{14}%=%t\\E(R%e%p1%{15}%=%t\\E(Z%;,\n\tuse=xterm-new,\n#\n# Foreground 0-15 maps (with toggles) into 30-37 & 90-97\n# Background 0-15 maps (with toggles) into 40-47 & 100-107\n#\n# Originally I suppressed setaf/setab, since ANSI specifies only 8 colors, but\n# Stephen Marley persuaded me to allow the \"ANSI\" color controls to extend to\n# 16 colors.  (Note that ncurses 4.2 uses setf/setb from this description;\n# however 5.0 selects either according to their availability).  - T.Dickey\n#\n# SVr4 curses does not use more than 8 colors anyway, so using 16 colors is\n# either for terminfo-level applications or via ncurses.\nxterm-16color|xterm with 16 colors,\n\tcolors#16,\n\tpairs#256,\n\tsetab=\\E[%?%p1%{8}%<%t%p1%{40}%+%e%p1%{92}%+%;%dm,\n\tsetaf=\\E[%?%p1%{8}%<%t%p1%{30}%+%e%p1%{82}%+%;%dm,\n\tsetb=%p1%{8}%/%{6}%*%{4}%+\\E[%d%p1%{8}%m%Pa%?%ga%{1}%=%t4%e%ga%{3}%=%t6%e%ga%{4}%=%t1%e%ga%{6}%=%t3%e%ga%d%;m,\n\tsetf=%p1%{8}%/%{6}%*%{3}%+\\E[%d%p1%{8}%m%Pa%?%ga%{1}%=%t4%e%ga%{3}%=%t6%e%ga%{4}%=%t1%e%ga%{6}%=%t3%e%ga%d%;m,\n\tuse=xterm+256color,\n\tuse=xterm-new,\n#\n# This uses RGB values 0..1000\n#\n# 256 colors should give 65536 pairs, but terminfo stores numbers in a signed\n# short.  Most people will not notice problems with only 32767 pairs.\nxterm+256color|xterm 256-color feature,\n\tccc,\n\tcolors#256,\n\tpairs#32767,\n\tinitc=\\E]4;%p1%d;rgb\\:%p2%{255}%*%{1000}%/%2.2X/%p3%{255}%*%{1000}%/%2.2X/%p4%{255}%*%{1000}%/%2.2X\\E\\\\,\n\tsetab=\\E[%?%p1%{8}%<%t4%p1%d%e%p1%{16}%<%t10%p1%{8}%-%d%e48;5;%p1%d%;m,\n\tsetaf=\\E[%?%p1%{8}%<%t3%p1%d%e%p1%{16}%<%t9%p1%{8}%-%d%e38;5;%p1%d%;m,\n\tsetb@,\n\tsetf@,\nxterm-256color|xterm with 256 colors,\n\tuse=xterm+256color,\n\tuse=xterm-new,\nxterm-88color|xterm with 88 colors,\n\tcolors#88,\n\tpairs#7744,\n\tuse=xterm-256color,\n#\n# This is an 8-bit version of xterm, which emulates DEC vt220 with ANSI color.\n# To use it, your decTerminalID resource must be set to 200 or above, and the\n# sunKeyboard resource set to true.\n#\n#\tHTS\t\\E H\t\\210\n#\tRI\t\\E M\t\\215\n#\tSS3\t\\E O\t\\217\n#\tCSI\t\\E [\t\\233\n#\nxterm-8bit|xterm terminal emulator with 8-bit controls (X Window System),\n\tOTbs,\n\tam,\n\tbce,\n\tkm,\n\tmc5i,\n\tmir,\n\tmsgr,\n\tnpc,\n\txenl,\n\tAX,\n\tcolors#8,\n\tcols#80,\n\tit#8,\n\tlines#24,\n\tpairs#64,\n\tacsc=``aaffggiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~,\n\tbel=^G,\n\tblink=\\2335m,\n\tbold=\\2331m,\n\tcbt=\\233Z,\n\tcivis=\\233?25l,\n\tclear=\\233H\\2332J,\n\tcnorm=\\233?25l\\233?25h,\n\tcr=^M,\n\tcsr=\\233%i%p1%d;%p2%dr,\n\tcub=\\233%p1%dD,\n\tcub1=^H,\n\tcud=\\233%p1%dB,\n\tcud1=^J,\n\tcuf=\\233%p1%dC,\n\tcuf1=\\233C,\n\tcup=\\233%i%p1%d;%p2%dH,\n\tcuu=\\233%p1%dA,\n\tcuu1=\\233A,\n\tcvvis=\\233?12;25h,\n\tdch=\\233%p1%dP,\n\tdch1=\\233P,\n\tdl=\\233%p1%dM,\n\tdl1=\\233M,\n\tech=\\233%p1%dX,\n\ted=\\233J,\n\tel=\\233K,\n\tel1=\\2331K,\n\tflash=\\233?5h$<100/>\\233?5l,\n\thome=\\233H,\n\thpa=\\233%i%p1%dG,\n\tht=^I,\n\thts=\\210,\n\tich=\\233%p1%d@,\n\til=\\233%p1%dL,\n\til1=\\233L,\n\tind=^J,\n\tinvis=\\2338m,\n\tis2=\\E[62\"p\\E G\\233m\\233?7h\\E>\\E7\\233?1;3;4;6l\\2334l\\233r\\E8,\n\tka1=\\217w,\n\tka3=\\217u,\n\tkb2=\\217y,\n\tkbeg=\\217E,\n\tkc1=\\217q,\n\tkc3=\\217s,\n\tkcbt=\\233Z,\n\tkcub1=\\217D,\n\tkcud1=\\217B,\n\tkcuf1=\\217C,\n\tkcuu1=\\217A,\n\tkdch1=\\2333~,\n\tkend=\\2334~,\n\tkent=\\217M,\n\tkf1=\\23311~,\n\tkf10=\\23321~,\n\tkf11=\\23323~,\n\tkf12=\\23324~,\n\tkf13=\\23325~,\n\tkf14=\\23326~,\n\tkf15=\\23328~,\n\tkf16=\\23329~,\n\tkf17=\\23331~,\n\tkf18=\\23332~,\n\tkf19=\\23333~,\n\tkf2=\\23312~,\n\tkf20=\\23334~,\n\tkf3=\\23313~,\n\tkf4=\\23314~,\n\tkf5=\\23315~,\n\tkf6=\\23317~,\n\tkf7=\\23318~,\n\tkf8=\\23319~,\n\tkf9=\\23320~,\n\tkhome=\\2331~,\n\tkich1=\\2332~,\n\tkmous=\\233M,\n\tknp=\\2336~,\n\tkpp=\\2335~,\n\tmc0=\\233i,\n\tmc4=\\2334i,\n\tmc5=\\2335i,\n\tmeml=\\El,\n\tmemu=\\Em,\n\top=\\23339;49m,\n\trc=\\E8,\n\trev=\\2337m,\n\tri=\\215,\n\trmacs=\\E(B,\n\trmam=\\233?7l,\n\trmcup=\\233?1049l,\n\trmir=\\2334l,\n\trmkx=\\233?1l\\E>,\n\trmso=\\23327m,\n\trmul=\\23324m,\n\trs1=\\Ec,\n\trs2=\\E[62\"p\\E G\\233m\\233?7h\\E>\\E7\\233?1;3;4;6l\\2334l\\233r\\E8,\n\tsc=\\E7,\n\tsetab=\\2334%p1%dm,\n\tsetaf=\\2333%p1%dm,\n\tsetb=\\2334%?%p1%{1}%=%t4%e%p1%{3}%=%t6%e%p1%{4}%=%t1%e%p1%{6}%=%t3%e%p1%d%;m,\n\tsetf=\\2333%?%p1%{1}%=%t4%e%p1%{3}%=%t6%e%p1%{4}%=%t1%e%p1%{6}%=%t3%e%p1%d%;m,\n\tsgr=\\2330%?%p6%t;1%;%?%p2%t;4%;%?%p1%p3%|%t;7%;%?%p4%t;5%;%?%p7%t;8%;m%?%p9%t\\E(0%e\\E(B%;,\n\tsgr0=\\2330m\\E(B,\n\tsmacs=\\E(0,\n\tsmam=\\233?7h,\n\tsmcup=\\233?1049h,\n\tsmir=\\2334h,\n\tsmkx=\\233?1h\\E=,\n\tsmso=\\2337m,\n\tsmul=\\2334m,\n\ttbc=\\2333g,\n\tu6=\\233[%i%d;%dR,\n\tu7=\\E[6n,\n\tu8=\\233[?1;2c,\n\tu9=\\E[c,\n\tvpa=\\233%i%p1%dd,\n\tuse=xterm+kbs,\n#\nxterm-xf86-v44|xterm terminal emulator (XFree86 4.4 Window System),\n\tOTbs,\n\tam,\n\tbce,\n\tkm,\n\tmc5i,\n\tmir,\n\tmsgr,\n\tnpc,\n\txenl,\n\tAX,\n\tXT,\n\tcolors#8,\n\tcols#80,\n\tit#8,\n\tlines#24,\n\tpairs#64,\n\tacsc=``aaffggiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~,\n\tbel=^G,\n\tblink=\\E[5m,\n\tbold=\\E[1m,\n\tcbt=\\E[Z,\n\tcivis=\\E[?25l,\n\tclear=\\E[H\\E[2J,\n\tcnorm=\\E[?12l\\E[?25h,\n\tcr=^M,\n\tcsr=\\E[%i%p1%d;%p2%dr,\n\tcub=\\E[%p1%dD,\n\tcub1=^H,\n\tcud=\\E[%p1%dB,\n\tcud1=^J,\n\tcuf=\\E[%p1%dC,\n\tcuf1=\\E[C,\n\tcup=\\E[%i%p1%d;%p2%dH,\n\tcuu=\\E[%p1%dA,\n\tcuu1=\\E[A,\n\tcvvis=\\E[?12;25h,\n\tdch=\\E[%p1%dP,\n\tdch1=\\E[P,\n\tdl=\\E[%p1%dM,\n\tdl1=\\E[M,\n\tech=\\E[%p1%dX,\n\ted=\\E[J,\n\tel=\\E[K,\n\tel1=\\E[1K,\n\tenacs=\\E(B\\E)0,\n\tflash=\\E[?5h$<100/>\\E[?5l,\n\thome=\\E[H,\n\thpa=\\E[%i%p1%dG,\n\tht=^I,\n\thts=\\EH,\n\tich=\\E[%p1%d@,\n\til=\\E[%p1%dL,\n\til1=\\E[L,\n\tind=^J,\n\tindn=\\E[%p1%dS,\n\tinvis=\\E[8m,\n\tis2=\\E[!p\\E[?3;4l\\E[4l\\E>,\n\tkDC=\\E[3;2~,\n\tkEND=\\E[1;2F,\n\tkHOM=\\E[1;2H,\n\tkIC=\\E[2;2~,\n\tkLFT=\\E[1;2D,\n\tkNXT=\\E[6;2~,\n\tkPRV=\\E[5;2~,\n\tkRIT=\\E[1;2C,\n\tkb2=\\EOE,\n\tkcbt=\\E[Z,\n\tkcub1=\\EOD,\n\tkcud1=\\EOB,\n\tkcuf1=\\EOC,\n\tkcuu1=\\EOA,\n\tkdch1=\\E[3~,\n\tkend=\\EOF,\n\tkent=\\EOM,\n\tkf1=\\EOP,\n\tkf10=\\E[21~,\n\tkf11=\\E[23~,\n\tkf12=\\E[24~,\n\tkf13=\\EO2P,\n\tkf14=\\EO2Q,\n\tkf15=\\EO2R,\n\tkf16=\\EO2S,\n\tkf17=\\E[15;2~,\n\tkf18=\\E[17;2~,\n\tkf19=\\E[18;2~,\n\tkf2=\\EOQ,\n\tkf20=\\E[19;2~,\n\tkf21=\\E[20;2~,\n\tkf22=\\E[21;2~,\n\tkf23=\\E[23;2~,\n\tkf24=\\E[24;2~,\n\tkf25=\\EO5P,\n\tkf26=\\EO5Q,\n\tkf27=\\EO5R,\n\tkf28=\\EO5S,\n\tkf29=\\E[15;5~,\n\tkf3=\\EOR,\n\tkf30=\\E[17;5~,\n\tkf31=\\E[18;5~,\n\tkf32=\\E[19;5~,\n\tkf33=\\E[20;5~,\n\tkf34=\\E[21;5~,\n\tkf35=\\E[23;5~,\n\tkf36=\\E[24;5~,\n\tkf37=\\EO6P,\n\tkf38=\\EO6Q,\n\tkf39=\\EO6R,\n\tkf4=\\EOS,\n\tkf40=\\EO6S,\n\tkf41=\\E[15;6~,\n\tkf42=\\E[17;6~,\n\tkf43=\\E[18;6~,\n\tkf44=\\E[19;6~,\n\tkf45=\\E[20;6~,\n\tkf46=\\E[21;6~,\n\tkf47=\\E[23;6~,\n\tkf48=\\E[24;6~,\n\tkf5=\\E[15~,\n\tkf6=\\E[17~,\n\tkf7=\\E[18~,\n\tkf8=\\E[19~,\n\tkf9=\\E[20~,\n\tkhome=\\EOH,\n\tkich1=\\E[2~,\n\tkmous=\\E[M,\n\tknp=\\E[6~,\n\tkpp=\\E[5~,\n\tmc0=\\E[i,\n\tmc4=\\E[4i,\n\tmc5=\\E[5i,\n\tmeml=\\El,\n\tmemu=\\Em,\n\top=\\E[39;49m,\n\trc=\\E8,\n\trev=\\E[7m,\n\tri=\\EM,\n\trin=\\E[%p1%dT,\n\trmacs=^O,\n\trmam=\\E[?7l,\n\trmcup=\\E[?1049l,\n\trmir=\\E[4l,\n\trmkx=\\E[?1l\\E>,\n\trmso=\\E[27m,\n\trmul=\\E[24m,\n\trs1=\\Ec,\n\trs2=\\E[!p\\E[?3;4l\\E[4l\\E>,\n\tsc=\\E7,\n\tsetab=\\E[4%p1%dm,\n\tsetaf=\\E[3%p1%dm,\n\tsetb=\\E[4%?%p1%{1}%=%t4%e%p1%{3}%=%t6%e%p1%{4}%=%t1%e%p1%{6}%=%t3%e%p1%d%;m,\n\tsetf=\\E[3%?%p1%{1}%=%t4%e%p1%{3}%=%t6%e%p1%{4}%=%t1%e%p1%{6}%=%t3%e%p1%d%;m,\n\tsgr=\\E[0%?%p6%t;1%;%?%p2%t;4%;%?%p1%p3%|%t;7%;%?%p4%t;5%;%?%p7%t;8%;m%?%p9%t\\016%e\\017%;,\n\tsgr0=\\E[m\\017,\n\tsmacs=^N,\n\tsmam=\\E[?7h,\n\tsmcup=\\E[?1049h,\n\tsmir=\\E[4h,\n\tsmkx=\\E[?1h\\E=,\n\tsmso=\\E[7m,\n\tsmul=\\E[4m,\n\ttbc=\\E[3g,\n\tu6=\\E[%i%d;%dR,\n\tu7=\\E[6n,\n\tu8=\\E[?1;2c,\n\tu9=\\E[c,\n\tvpa=\\E[%i%p1%dd,\n\tka2=\\EOx,\n\tkb1=\\EOt,\n\tkb3=\\EOv,\n\tkc2=\\EOr,\n\tuse=xterm+kbs,\nxterm-xfree86|xterm terminal emulator (XFree86 4.4 Window System),\n\tuse=xterm-xf86-v44,\n#\n# Compatible with the R6 xterm, with the following changes:\n#\t+ added acsc (perhaps some versions of tic assume the standard vt100\n#\t  alternate character set)\n#\t+ added u6, u7, u8, u9 strings for Daniel Weaver's tack program.\n#\t+ added kmous string for ncurses.\n#\t+ added khome/kend strings (which conflict with kfnd/kslt, see note).\nxterm-r6|xterm X11R6 version,\n\tOTbs,\n\tam,\n\tkm,\n\tmir,\n\tmsgr,\n\txenl,\n\tcols#80,\n\tit#8,\n\tlines#24,\n\tacsc=``aaffggiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~,\n\tbel=^G,\n\tbold=\\E[1m,\n\tclear=\\E[H\\E[2J,\n\tcr=^M,\n\tcsr=\\E[%i%p1%d;%p2%dr,\n\tcub=\\E[%p1%dD,\n\tcub1=^H,\n\tcud=\\E[%p1%dB,\n\tcud1=^J,\n\tcuf=\\E[%p1%dC,\n\tcuf1=\\E[C,\n\tcup=\\E[%i%p1%d;%p2%dH,\n\tcuu=\\E[%p1%dA,\n\tcuu1=\\E[A,\n\tdch=\\E[%p1%dP,\n\tdch1=\\E[P,\n\tdl=\\E[%p1%dM,\n\tdl1=\\E[M,\n\ted=\\E[J,\n\tel=\\E[K,\n\tenacs=\\E)0,\n\thome=\\E[H,\n\tht=^I,\n\thts=\\EH,\n\til=\\E[%p1%dL,\n\til1=\\E[L,\n\tind=^J,\n\tis2=\\E[m\\E[?7h\\E[4l\\E>\\E7\\E[r\\E[?1;3;4;6l\\E8,\n\tkcub1=\\EOD,\n\tkcud1=\\EOB,\n\tkcuf1=\\EOC,\n\tkcuu1=\\EOA,\n\tkdch1=\\E[3~,\n\tkf1=\\E[11~,\n\tkf10=\\E[21~,\n\tkf11=\\E[23~,\n\tkf12=\\E[24~,\n\tkf13=\\E[25~,\n\tkf14=\\E[26~,\n\tkf15=\\E[28~,\n\tkf16=\\E[29~,\n\tkf17=\\E[31~,\n\tkf18=\\E[32~,\n\tkf19=\\E[33~,\n\tkf2=\\E[12~,\n\tkf20=\\E[34~,\n\tkf3=\\E[13~,\n\tkf4=\\E[14~,\n\tkf5=\\E[15~,\n\tkf6=\\E[17~,\n\tkf7=\\E[18~,\n\tkf8=\\E[19~,\n\tkf9=\\E[20~,\n\tkmous=\\E[M,\n\tmeml=\\El,\n\tmemu=\\Em,\n\trc=\\E8,\n\trev=\\E[7m,\n\tri=\\EM,\n\trmacs=^O,\n\trmcup=\\E[2J\\E[?47l\\E8,\n\trmir=\\E[4l,\n\trmkx=\\E[?1l\\E>,\n\trmso=\\E[m,\n\trmul=\\E[m,\n\trs2=\\E[m\\E[?7h\\E[4l\\E>\\E7\\E[r\\E[?1;3;4;6l\\E8,\n\tsc=\\E7,\n\tsgr0=\\E[m,\n\tsmacs=^N,\n\tsmcup=\\E7\\E[?47h,\n\tsmir=\\E[4h,\n\tsmkx=\\E[?1h\\E=,\n\tsmso=\\E[7m,\n\tsmul=\\E[4m,\n\ttbc=\\E[3g,\n\tu6=\\E[%i%d;%dR,\n\tu7=\\E[6n,\n\tu8=\\E[?1;2c,\n\tu9=\\E[c,\n\tuse=xterm+kbs,\n\tuse=xterm+decedit,\nxterm-old|antique xterm version,\n\tuse=xterm-r6,\n#\n# Compatible with the R5 xterm, with the following changes:\n#\t+ changed 'blink=@', to 'blink@' (the former meant that \"@\" would start\n#\t  a blink, the latter that it is not supported).\n#\t+ changed kf1 through kf4 to correspond with actual usage.  Though X\n#\t  supports keypad symbols for PF1 to PF4, and xterm interprets these\n#\t  correctly, the F1 to F4 codes are commonly (but incorrectly) used.\n#\t+ moved reset string from rs1 to rs2, to correlate better with termcap.\n#\t+ make khome consistent with other entries.\n#\t+ use rmul/smul, rmir/smir from termcap, but not rmcup/smcup because\n#\t  not everyone wants the alternate screen.\n#\t+ added u6, u7, u8, u9 strings for Daniel Weaver's tack program.\n#\t+ added kmous string for ncurses.\nxterm-r5|xterm R5 version,\n\tOTbs,\n\tam,\n\tkm,\n\tmsgr,\n\txenl,\n\tcols#80,\n\tit#8,\n\tlines#24,\n\tbel=^G,\n\tbold=\\E[1m,\n\tclear=\\E[H\\E[2J,\n\tcr=^M,\n\tcsr=\\E[%i%p1%d;%p2%dr,\n\tcub=\\E[%p1%dD,\n\tcub1=^H,\n\tcud=\\E[%p1%dB,\n\tcud1=^J,\n\tcuf=\\E[%p1%dC,\n\tcuf1=\\E[C,\n\tcup=\\E[%i%p1%d;%p2%dH,\n\tcuu=\\E[%p1%dA,\n\tcuu1=\\E[A,\n\tdch=\\E[%p1%dP,\n\tdch1=\\E[P,\n\tdl=\\E[%p1%dM,\n\tdl1=\\E[M,\n\ted=\\E[J,\n\tel=\\E[K,\n\thome=\\E[H,\n\tht=^I,\n\thts=\\EH,\n\tich=\\E[%p1%d@,\n\tich1=\\E[@,\n\til=\\E[%p1%dL,\n\til1=\\E[L,\n\tind=^J,\n\tkcub1=\\EOD,\n\tkcud1=\\EOB,\n\tkcuf1=\\EOC,\n\tkcuu1=\\EOA,\n\tkdch1=\\E[3~,\n\tkdl1=\\E[31~,\n\tkel=\\E[8~,\n\tkend=\\E[4~,\n\tkf0=\\EOq,\n\tkf1=\\E[11~,\n\tkf10=\\E[21~,\n\tkf11=\\E[23~,\n\tkf12=\\E[24~,\n\tkf2=\\E[12~,\n\tkf3=\\E[13~,\n\tkf4=\\E[14~,\n\tkf5=\\E[15~,\n\tkf6=\\E[17~,\n\tkf7=\\E[18~,\n\tkf8=\\E[19~,\n\tkf9=\\E[20~,\n\tkhome=\\E[1~,\n\tkich1=\\E[2~,\n\tkil1=\\E[30~,\n\tkmous=\\E[M,\n\tknp=\\E[6~,\n\tkpp=\\E[5~,\n\trc=\\E8,\n\trev=\\E[7m,\n\tri=\\EM,\n\trmir=\\E[4l,\n\trmkx=\\E[?1l\\E>,\n\trmso=\\E[m,\n\trmul=\\E[m,\n\trs2=\\E>\\E[?1;3;4;5;6l\\E[4l\\E[?7h\\E[m\\E[r\\E[2J\\E[H,\n\tsc=\\E7,\n\tsgr=\\E[%?%p1%t;7%;%?%p2%t;4%;%?%p3%t;7%;%?%p4%t;5%;%?%p6%t;1%;m,\n\tsgr0=\\E[m,\n\tsmir=\\E[4h,\n\tsmkx=\\E[?1h\\E=,\n\tsmso=\\E[7m,\n\tsmul=\\E[4m,\n\ttbc=\\E[3g,\n\tu6=\\E[%i%d;%dR,\n\tu7=\\E[6n,\n\tu8=\\E[?1;2c,\n\tu9=\\E[c,\n\tuse=xterm+kbs,\n#\n#\n# Customization begins here.\n#\n# This is the only entry which you should have to customize, since \"xterm\"\n# is widely used for a variety of incompatible terminal emulations including\n# color_xterm and rxvt.\nxterm|X11 terminal emulator,\n\tuse=xterm-new,\n#\tuse=xterm-r6,\n\n# This fragment is for people who cannot agree on what the backspace key\n# should send.\nxterm+kbs|fragment for backspace key,\n\tkbs=^H,\n"
  },
  {
    "path": "vendor/tng.js",
    "content": "/**\n * tng.js - png reader\n * Copyright (c) 2015, Christopher Jeffrey (MIT License).\n * https://github.com/chjj/tng\n */\n\nvar fs = require('fs')\n  , util = require('util')\n  , path = require('path')\n  , zlib = require('zlib')\n  , assert = require('assert')\n  , cp = require('child_process')\n  , exec = cp.execFileSync;\n\n/**\n * PNG\n */\n\nfunction PNG(file, options) {\n  var buf\n    , chunks\n    , idat\n    , pixels;\n\n  if (!(this instanceof PNG)) {\n    return new PNG(file, options);\n  }\n\n  if (!file) throw new Error('no file');\n\n  this.options = options || {};\n  this.colors = options.colors || require('blessed/lib/colors');\n  this.optimization = this.options.optimization || 'mem';\n  this.speed = this.options.speed || 1;\n\n  if (Buffer.isBuffer(file)) {\n    this.file = this.options.filename || null;\n    buf = file;\n  } else {\n    this.options.filename = file;\n    this.file = path.resolve(process.cwd(), file);\n    buf = fs.readFileSync(this.file);\n  }\n\n  this.format = buf.readUInt32BE(0) === 0x89504e47 ? 'png'\n    : buf.slice(0, 3).toString('ascii') === 'GIF' ? 'gif'\n    : buf.readUInt16BE(0) === 0xffd8 ? 'jpg'\n    : path.extname(this.file).slice(1).toLowerCase() || 'png';\n\n  if (this.format !== 'png') {\n    try {\n      return this.toPNG(buf);\n    } catch (e) {\n      throw e;\n    }\n  }\n\n  chunks = this.parseRaw(buf);\n  idat = this.parseChunks(chunks);\n  pixels = this.parseLines(idat);\n\n  this.bmp = this.createBitmap(pixels);\n  this.cellmap = this.createCellmap(this.bmp);\n  this.frames = this.compileFrames(this.frames);\n}\n\nPNG.prototype.parseRaw = function(buf) {\n  var chunks = []\n    , index = 0\n    , i = 0\n    , buf\n    , len\n    , type\n    , name\n    , data\n    , crc\n    , check\n    , critical\n    , public_\n    , conforming\n    , copysafe\n    , pos;\n\n  this._debug(this.file);\n\n  if (buf.readUInt32BE(0) !== 0x89504e47\n      || buf.readUInt32BE(4) !== 0x0d0a1a0a) {\n    throw new Error('bad header');\n  }\n\n  i += 8;\n\n  while (i < buf.length) {\n    try {\n      len = buf.readUInt32BE(i);\n      i += 4;\n      pos = i;\n      type = buf.slice(i, i + 4);\n      name = type.toString('ascii');\n      i += 4;\n      data = buf.slice(i, i + len);\n      i += len;\n      check = this.crc32(buf.slice(pos, i));\n      crc = buf.readInt32BE(i);\n      i += 4;\n      critical = !!(~type[0] & 32);\n      public_ = !!(~type[1] & 32);\n      conforming = !!(~type[2] & 32);\n      copysafe = !!(~type[3] & 32);\n      if (crc !== check) {\n        throw new Error(name + ': bad crc');\n      }\n    } catch (e) {\n      if (this.options.debug) throw e;\n      break;\n    }\n    chunks.push({\n      index: index++,\n      id: name.toLowerCase(),\n      len: len,\n      pos: pos,\n      end: i,\n      type: type,\n      name: name,\n      data: data,\n      crc: crc,\n      check: check,\n      raw: buf.slice(pos, i),\n      flags: {\n        critical: critical,\n        public_: public_,\n        conforming: conforming,\n        copysafe: copysafe\n      }\n    });\n  }\n\n  return chunks;\n};\n\nPNG.prototype.parseChunks = function(chunks) {\n  var i\n    , chunk\n    , name\n    , data\n    , p\n    , idat\n    , info;\n\n  for (i = 0; i < chunks.length; i++) {\n    chunk = chunks[i];\n    name = chunk.id;\n    data = chunk.data;\n    info = {};\n    switch (name) {\n      case 'ihdr': {\n        this.width = info.width = data.readUInt32BE(0);\n        this.height = info.height = data.readUInt32BE(4);\n        this.bitDepth = info.bitDepth = data.readUInt8(8);\n        this.colorType = info.colorType = data.readUInt8(9);\n        this.compression = info.compression = data.readUInt8(10);\n        this.filter = info.filter = data.readUInt8(11);\n        this.interlace = info.interlace = data.readUInt8(12);\n        switch (this.bitDepth) {\n          case 1: case 2: case 4: case 8: case 16: case 24: case 32: break;\n          default: throw new Error('bad bit depth: ' + this.bitDepth);\n        }\n        switch (this.colorType) {\n          case 0: case 2: case 3: case 4: case 6: break;\n          default: throw new Error('bad color: ' + this.colorType);\n        }\n        switch (this.compression) {\n          case 0: break;\n          default: throw new Error('bad compression: ' + this.compression);\n        }\n        switch (this.filter) {\n          case 0: case 1: case 2: case 3: case 4: break;\n          default: throw new Error('bad filter: ' + this.filter);\n        }\n        switch (this.interlace) {\n          case 0: case 1: break;\n          default: throw new Error('bad interlace: ' + this.interlace);\n        }\n        break;\n      }\n      case 'plte': {\n        this.palette = info.palette = [];\n        for (p = 0; p < data.length; p += 3) {\n          this.palette.push({\n            r: data[p + 0],\n            g: data[p + 1],\n            b: data[p + 2],\n            a: 255\n          });\n        }\n        break;\n      }\n      case 'idat': {\n        this.size = this.size || 0;\n        this.size += data.length;\n        this.idat = this.idat || [];\n        this.idat.push(data);\n        info.size = data.length;\n        break;\n      }\n      case 'iend': {\n        this.end = true;\n        break;\n      }\n      case 'trns': {\n        this.alpha = info.alpha = Array.prototype.slice.call(data);\n        if (this.palette) {\n          for (p = 0; p < data.length; p++) {\n            if (!this.palette[p]) break;\n            this.palette[p].a = data[p];\n          }\n        }\n        break;\n      }\n      // https://wiki.mozilla.org/APNG_Specification\n      case 'actl': {\n        this.actl = info = {};\n        this.frames = [];\n        this.actl.numFrames = data.readUInt32BE(0);\n        this.actl.numPlays = data.readUInt32BE(4);\n        break;\n      }\n      case 'fctl': {\n        // IDAT is the first frame depending on the order:\n        // IDAT is a frame: acTL->fcTL->IDAT->[fcTL]->fdAT\n        // IDAT is not a frame: acTL->IDAT->[fcTL]->fdAT\n        if (!this.idat) {\n          this.idat = [];\n          this.frames.push({\n            idat: true,\n            fctl: info,\n            fdat: this.idat\n          });\n        } else {\n          this.frames.push({\n            fctl: info,\n            fdat: []\n          });\n        }\n        info.sequenceNumber = data.readUInt32BE(0);\n        info.width = data.readUInt32BE(4);\n        info.height = data.readUInt32BE(8);\n        info.xOffset = data.readUInt32BE(12);\n        info.yOffset = data.readUInt32BE(16);\n        info.delayNum = data.readUInt16BE(20);\n        info.delayDen = data.readUInt16BE(22);\n        info.disposeOp = data.readUInt8(24);\n        info.blendOp = data.readUInt8(25);\n        break;\n      }\n      case 'fdat': {\n        info.sequenceNumber = data.readUInt32BE(0);\n        info.data = data.slice(4);\n        this.frames[this.frames.length - 1].fdat.push(info.data);\n        break;\n      }\n    }\n    chunk.info = info;\n  }\n\n  this._debug(chunks);\n\n  if (this.frames) {\n    this.frames = this.frames.map(function(frame, i) {\n      frame.fdat = this.decompress(frame.fdat);\n      if (!frame.fdat.length) throw new Error('no data');\n      return frame;\n    }, this);\n  }\n\n  idat = this.decompress(this.idat);\n  if (!idat.length) throw new Error('no data');\n\n  return idat;\n};\n\nPNG.prototype.parseLines = function(data) {\n  var pixels = []\n    , x\n    , p\n    , prior\n    , line\n    , filter\n    , samples\n    , pendingSamples\n    , ch\n    , shiftStart\n    , i\n    , toShift\n    , sample;\n\n  this.sampleDepth =\n    this.colorType === 0 ? 1\n    : this.colorType === 2 ? 3\n    : this.colorType === 3 ? 1\n    : this.colorType === 4 ? 2\n    : this.colorType === 6 ? 4\n    : 1;\n  this.bitsPerPixel = this.bitDepth * this.sampleDepth;\n  this.bytesPerPixel = Math.ceil(this.bitsPerPixel / 8);\n  this.wastedBits = ((this.width * this.bitsPerPixel) / 8) - ((this.width * this.bitsPerPixel / 8) | 0);\n  this.byteWidth = Math.ceil(this.width * (this.bitsPerPixel / 8));\n\n  this.shiftStart = ((this.bitDepth + (8 / this.bitDepth - this.bitDepth)) - 1) | 0;\n  this.shiftMult = this.bitDepth >= 8 ? 0 : this.bitDepth;\n  this.mask = this.bitDepth === 32 ? 0xffffffff : (1 << this.bitDepth) - 1;\n\n  if (this.interlace === 1) {\n    samples = this.sampleInterlacedLines(data);\n    for (i = 0; i < samples.length; i += this.sampleDepth) {\n      pixels.push(samples.slice(i, i + this.sampleDepth));\n    }\n    return pixels;\n  }\n\n  for (p = 0; p < data.length; p += this.byteWidth) {\n    prior = line || [];\n    filter = data[p++];\n    line = data.slice(p, p + this.byteWidth);\n    line = this.unfilterLine(filter, line, prior);\n    samples = this.sampleLine(line);\n    for (i = 0; i < samples.length; i += this.sampleDepth) {\n      pixels.push(samples.slice(i, i + this.sampleDepth));\n    }\n  }\n\n  return pixels;\n};\n\nPNG.prototype.unfilterLine = function(filter, line, prior) {\n  for (var x = 0; x < line.length; x++) {\n    if (filter === 0) {\n      break;\n    } else if (filter === 1) {\n      line[x] = this.filters.sub(x, line, prior, this.bytesPerPixel);\n    } else if (filter === 2) {\n      line[x] = this.filters.up(x, line, prior, this.bytesPerPixel);\n    } else if (filter === 3) {\n      line[x] = this.filters.average(x, line, prior, this.bytesPerPixel);\n    } else if (filter === 4) {\n      line[x] = this.filters.paeth(x, line, prior, this.bytesPerPixel);\n    }\n  }\n  return line;\n};\n\nPNG.prototype.sampleLine = function(line, width) {\n  var samples = []\n    , x = 0\n    , pendingSamples\n    , ch\n    , i\n    , sample\n    , shiftStart\n    , toShift;\n\n  while (x < line.length) {\n    pendingSamples = this.sampleDepth;\n    while (pendingSamples--) {\n      ch = line[x];\n      if (this.bitDepth === 16) {\n        ch = (ch << 8) | line[++x];\n      } else if (this.bitDepth === 24) {\n        ch = (ch << 16) | (line[++x] << 8) | line[++x];\n      } else if (this.bitDepth === 32) {\n        ch = (ch << 24) | (line[++x] << 16) | (line[++x] << 8) | line[++x];\n      } else if (this.bitDepth > 32) {\n        throw new Error('bitDepth ' + this.bitDepth + ' unsupported.');\n      }\n      shiftStart = this.shiftStart;\n      toShift = shiftStart - (x === line.length - 1 ? this.wastedBits : 0);\n      for (i = 0; i <= toShift; i++) {\n        sample = (ch >> (this.shiftMult * shiftStart)) & this.mask;\n        if (this.colorType !== 3) {\n          if (this.bitDepth < 8) { // <= 8 would work too, doesn't matter\n            // sample = sample * (0xff / this.mask) | 0; // would work too\n            sample *= 0xff / this.mask;\n            sample |= 0;\n          } else if (this.bitDepth > 8) {\n            sample = (sample / this.mask) * 255 | 0;\n          }\n        }\n        samples.push(sample);\n        shiftStart--;\n      }\n      x++;\n    }\n  }\n\n  // Needed for deinterlacing?\n  if (width != null) {\n    samples = samples.slice(0, width * this.sampleDepth);\n  }\n\n  return samples;\n};\n\n// http://www.w3.org/TR/PNG-Filters.html\nPNG.prototype.filters = {\n  sub: function Sub(x, line, prior, bpp) {\n    if (x < bpp) return line[x];\n    return (line[x] + line[x - bpp]) % 256;\n  },\n  up: function Up(x, line, prior, bpp) {\n    return (line[x] + (prior[x] || 0)) % 256;\n  },\n  average: function Average(x, line, prior, bpp) {\n    if (x < bpp) return Math.floor((prior[x] || 0) / 2);\n    // if (x < bpp) return (prior[x] || 0) >> 1;\n    return (line[x]\n      + Math.floor((line[x - bpp] + prior[x]) / 2)\n      // + ((line[x - bpp] + prior[x]) >> 1)\n    ) % 256;\n  },\n  paeth: function Paeth(x, line, prior, bpp) {\n    if (x < bpp) return prior[x] || 0;\n    return (line[x] + this._predictor(\n      line[x - bpp], prior[x] || 0, prior[x - bpp] || 0\n    )) % 256;\n  },\n  _predictor: function PaethPredictor(a, b, c) {\n    // a = left, b = above, c = upper left\n    var p = a + b - c\n      , pa = Math.abs(p - a)\n      , pb = Math.abs(p - b)\n      , pc = Math.abs(p - c);\n    if (pa <= pb && pa <= pc) return a;\n    if (pb <= pc) return b;\n    return c;\n  }\n};\n\n/**\n * Adam7 deinterlacing ported to javascript from PyPNG:\n * pypng - Pure Python library for PNG image encoding/decoding\n * Copyright (c) 2009-2015, David Jones (MIT License).\n * https://github.com/drj11/pypng\n *\n * Permission is hereby granted, free of charge, to any person\n * obtaining a copy of this software and associated documentation files\n * (the \"Software\"), to deal in the Software without restriction,\n * including without limitation the rights to use, copy, modify, merge,\n * publish, distribute, sublicense, and/or sell copies of the Software,\n * and to permit persons to whom the Software is furnished to do so,\n * subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS\n * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN\n * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nPNG.prototype.sampleInterlacedLines = function(raw) {\n  var psize\n    , vpr\n    , samples\n    , source_offset\n    , i\n    , pass\n    , xstart\n    , ystart\n    , xstep\n    , ystep\n    , recon\n    , ppr\n    , row_size\n    , y\n    , filter_type\n    , scanline\n    , flat\n    , offset\n    , k\n    , end_offset\n    , skip\n    , j\n    , k\n    , f;\n\n  var adam7 = [\n    [0, 0, 8, 8],\n    [4, 0, 8, 8],\n    [0, 4, 4, 8],\n    [2, 0, 4, 4],\n    [0, 2, 2, 4],\n    [1, 0, 2, 2],\n    [0, 1, 1, 2]\n  ];\n\n  // Fractional bytes per pixel\n  psize = (this.bitDepth / 8) * this.sampleDepth;\n\n  // Values per row (of the target image)\n  vpr = this.width * this.sampleDepth;\n\n  // Make a result array, and make it big enough. Interleaving\n  // writes to the output array randomly (well, not quite), so the\n  // entire output array must be in memory.\n  samples = new Buffer(vpr * this.height);\n  samples.fill(0);\n\n  source_offset = 0;\n\n  for (i = 0; i < adam7.length; i++) {\n    pass = adam7[i];\n    xstart = pass[0];\n    ystart = pass[1];\n    xstep = pass[2];\n    ystep = pass[3];\n    if (xstart >= this.width) continue;\n    // The previous (reconstructed) scanline. Empty array at the\n    // beginning of a pass to indicate that there is no previous\n    // line.\n    recon = [];\n    // Pixels per row (reduced pass image)\n    ppr = Math.ceil((this.width - xstart) / xstep);\n    // Row size in bytes for this pass.\n    row_size = Math.ceil(psize * ppr);\n    for (y = ystart; y < this.height; y += ystep) {\n      filter_type = raw[source_offset];\n      source_offset += 1;\n      scanline = raw.slice(source_offset, source_offset + row_size);\n      source_offset += row_size;\n      recon = this.unfilterLine(filter_type, scanline, recon);\n      // Convert so that there is one element per pixel value\n      flat = this.sampleLine(recon, ppr);\n      if (xstep === 1) {\n        assert.equal(xstart, 0);\n        offset = y * vpr;\n        for (k = offset, f = 0; k < offset + vpr; k++, f++) {\n          samples[k] = flat[f];\n        }\n      } else {\n        offset = y * vpr + xstart * this.sampleDepth;\n        end_offset = (y + 1) * vpr;\n        skip = this.sampleDepth * xstep;\n        for (j = 0; j < this.sampleDepth; j++) {\n          for (k = offset + j, f = j; k < end_offset; k += skip, f += this.sampleDepth) {\n            samples[k] = flat[f];\n          }\n        }\n      }\n    }\n  }\n\n  return samples;\n};\n\nPNG.prototype.createBitmap = function(pixels) {\n  var bmp = []\n    , i;\n\n  if (this.colorType === 0) {\n    pixels = pixels.map(function(sample) {\n      return { r: sample[0], g: sample[0], b: sample[0], a: 255 };\n    });\n  } else if (this.colorType === 2) {\n    pixels = pixels.map(function(sample) {\n      return { r: sample[0], g: sample[1], b: sample[2], a: 255 };\n    });\n  } else if (this.colorType === 3) {\n    pixels = pixels.map(function(sample) {\n      if (!this.palette[sample[0]]) throw new Error('bad palette index');\n      return this.palette[sample[0]];\n    }, this);\n  } else if (this.colorType === 4) {\n    pixels = pixels.map(function(sample) {\n      return { r: sample[0], g: sample[0], b: sample[0], a: sample[1] };\n    });\n  } else if (this.colorType === 6) {\n    pixels = pixels.map(function(sample) {\n      return { r: sample[0], g: sample[1], b: sample[2], a: sample[3] };\n    });\n  }\n\n  for (i = 0; i < pixels.length; i += this.width) {\n    bmp.push(pixels.slice(i, i + this.width));\n  }\n\n  return bmp;\n};\n\nPNG.prototype.createCellmap = function(bmp, options) {\n  var bmp = bmp || this.bmp\n    , options = options || this.options\n    , cellmap = []\n    , scale = options.scale || 0.20\n    , height = bmp.length\n    , width = bmp[0].length\n    , cmwidth = options.width\n    , cmheight = options.height\n    , line\n    , x\n    , y\n    , xx\n    , yy\n    , scale\n    , xs\n    , ys;\n\n  if (cmwidth) {\n    scale = cmwidth / width;\n  } else if (cmheight) {\n    scale = cmheight / height;\n  }\n\n  if (!cmheight) {\n    cmheight = Math.round(height * scale);\n  }\n\n  if (!cmwidth) {\n    cmwidth = Math.round(width * scale);\n  }\n\n  ys = height / cmheight;\n  xs = width / cmwidth;\n\n  for (y = 0; y < bmp.length; y += ys) {\n    line = [];\n    yy = Math.round(y);\n    if (!bmp[yy]) break;\n    for (x = 0; x < bmp[yy].length; x += xs) {\n      xx = Math.round(x);\n      if (!bmp[yy][xx]) break;\n      line.push(bmp[yy][xx]);\n    }\n    cellmap.push(line);\n  }\n\n  return cellmap;\n};\n\nPNG.prototype.renderANSI = function(bmp) {\n  var self = this\n    , out = '';\n\n  bmp.forEach(function(line, y) {\n    line.forEach(function(pixel, x) {\n      var outch = self.getOutch(x, y, line, pixel);\n      out += self.pixelToSGR(pixel, outch);\n    });\n    out += '\\n';\n  });\n\n  return out;\n};\n\nPNG.prototype.renderContent = function(bmp, el) {\n  var self = this\n    , out = '';\n\n  bmp.forEach(function(line, y) {\n    line.forEach(function(pixel, x) {\n      var outch = self.getOutch(x, y, line, pixel);\n      out += self.pixelToTags(pixel, outch);\n    });\n    out += '\\n';\n  });\n\n  el.setContent(out);\n\n  return out;\n};\n\nPNG.prototype.renderScreen = function(bmp, screen, xi, xl, yi, yl) {\n  var self = this\n    , lines = screen.lines\n    , cellLines\n    , y\n    , yy\n    , x\n    , xx\n    , alpha\n    , attr\n    , ch;\n\n  cellLines = bmp.reduce(function(cellLines, line, y) {\n    var cellLine = [];\n    line.forEach(function(pixel, x) {\n      var outch = self.getOutch(x, y, line, pixel)\n        , cell = self.pixelToCell(pixel, outch);\n      cellLine.push(cell);\n    });\n    cellLines.push(cellLine);\n    return cellLines;\n  }, []);\n\n  for (y = yi; y < yl; y++) {\n    yy = y - yi;\n    for (x = xi; x < xl; x++) {\n      xx = x - xi;\n      if (lines[y] && lines[y][x] && cellLines[yy] && cellLines[yy][xx]) {\n        alpha = cellLines[yy][xx].pop();\n        // completely transparent\n        if (alpha === 0.0) {\n          continue;\n        }\n        // translucency / blending\n        if (alpha < 1.0) {\n          attr = cellLines[yy][xx][0];\n          ch = cellLines[yy][xx][1];\n          lines[y][x][0] = this.colors.blend(lines[y][x][0], attr, alpha);\n          if (ch !== ' ') lines[y][x][1] = ch;\n          lines[y].dirty = true;\n          continue;\n        }\n        // completely opaque\n        lines[y][x] = cellLines[yy][xx];\n        lines[y].dirty = true;\n      }\n    }\n  }\n};\n\nPNG.prototype.renderElement = function(bmp, el) {\n  var xi = el.aleft + el.ileft\n    , xl = el.aleft + el.width - el.iright\n    , yi = el.atop + el.itop\n    , yl = el.atop + el.height - el.ibottom;\n\n  return this.renderScreen(bmp, el.screen, xi, xl, yi, yl);\n};\n\nPNG.prototype.pixelToSGR = function(pixel, ch) {\n  var bga = 1.0\n    , fga = 0.5\n    , a = pixel.a / 255\n    , bg\n    , fg;\n\n  bg = this.colors.match(\n    pixel.r * a * bga | 0,\n    pixel.g * a * bga | 0,\n    pixel.b * a * bga | 0);\n\n  if (ch && this.options.ascii) {\n    fg = this.colors.match(\n      pixel.r * a * fga | 0,\n      pixel.g * a * fga | 0,\n      pixel.b * a * fga | 0);\n    if (a === 0) {\n      return '\\x1b[38;5;' + fg + 'm' + ch + '\\x1b[m';\n    }\n    return '\\x1b[38;5;' + fg + 'm\\x1b[48;5;' + bg + 'm' + ch + '\\x1b[m';\n  }\n\n  if (a === 0) return ' ';\n\n  return '\\x1b[48;5;' + bg + 'm \\x1b[m';\n};\n\nPNG.prototype.pixelToTags = function(pixel, ch) {\n  var bga = 1.0\n    , fga = 0.5\n    , a = pixel.a / 255\n    , bg\n    , fg;\n\n  bg = this.colors.RGBtoHex(\n    pixel.r * a * bga | 0,\n    pixel.g * a * bga | 0,\n    pixel.b * a * bga | 0);\n\n  if (ch && this.options.ascii) {\n    fg = this.colors.RGBtoHex(\n      pixel.r * a * fga | 0,\n      pixel.g * a * fga | 0,\n      pixel.b * a * fga | 0);\n    if (a === 0) {\n      return '{' + fg + '-fg}' + ch + '{/}';\n    }\n    return '{' + fg + '-fg}{' + bg + '-bg}' + ch + '{/}';\n  }\n\n  if (a === 0) return ' ';\n\n  return '{' + bg + '-bg} {/' + bg + '-bg}';\n};\n\nPNG.prototype.pixelToCell = function(pixel, ch) {\n  var bga = 1.0\n    , fga = 0.5\n    , a = pixel.a / 255\n    , bg\n    , fg;\n\n  bg = this.colors.match(\n    pixel.r * bga | 0,\n    pixel.g * bga | 0,\n    pixel.b * bga | 0);\n\n  if (ch && this.options.ascii) {\n    fg = this.colors.match(\n      pixel.r * fga | 0,\n      pixel.g * fga | 0,\n      pixel.b * fga | 0);\n  } else {\n    fg = 0x1ff;\n    ch = null;\n  }\n\n  // if (a === 0) bg = 0x1ff;\n\n  return [(0 << 18) | (fg << 9) | (bg << 0), ch || ' ', a];\n};\n\n// Taken from libcaca:\nPNG.prototype.getOutch = (function() {\n  var dchars = '????8@8@#8@8##8#MKXWwz$&%x><\\\\/xo;+=|^-:i\\'.`,  `.        ';\n\n  var luminance = function(pixel) {\n    var a = pixel.a / 255\n      , r = pixel.r * a\n      , g = pixel.g * a\n      , b = pixel.b * a\n      , l = 0.2126 * r + 0.7152 * g + 0.0722 * b;\n\n    return l / 255;\n  };\n\n  return function(x, y, line, pixel) {\n    var lumi = luminance(pixel)\n      , outch = dchars[lumi * (dchars.length - 1) | 0];\n\n    return outch;\n  };\n})();\n\nPNG.prototype.compileFrames = function(frames) {\n  return this.optimization === 'mem'\n    ? this.compileFrames_lomem(frames)\n    : this.compileFrames_locpu(frames);\n};\n\nPNG.prototype.compileFrames_lomem = function(frames) {\n  if (!this.actl) return;\n  return frames.map(function(frame, i) {\n    this.width = frame.fctl.width;\n    this.height = frame.fctl.height;\n\n    var pixels = frame._pixels || this.parseLines(frame.fdat)\n      , bmp = frame._bmp || this.createBitmap(pixels)\n      , fc = frame.fctl;\n\n    return {\n      actl: this.actl,\n      fctl: frame.fctl,\n      delay: (fc.delayNum / (fc.delayDen || 100)) * 1000 | 0,\n      bmp: bmp\n    };\n  }, this);\n};\n\nPNG.prototype.compileFrames_locpu = function(frames) {\n  if (!this.actl) return;\n\n  this._curBmp = null;\n  this._lastBmp = null;\n\n  return frames.map(function(frame, i) {\n    this.width = frame.fctl.width;\n    this.height = frame.fctl.height;\n\n    var pixels = frame._pixels || this.parseLines(frame.fdat)\n      , bmp = frame._bmp || this.createBitmap(pixels)\n      , renderBmp = this.renderFrame(bmp, frame, i)\n      , cellmap = this.createCellmap(renderBmp)\n      , fc = frame.fctl;\n\n    return {\n      actl: this.actl,\n      fctl: frame.fctl,\n      delay: (fc.delayNum / (fc.delayDen || 100)) * 1000 | 0,\n      bmp: renderBmp,\n      cellmap: cellmap\n    };\n  }, this);\n};\n\nPNG.prototype.renderFrame = function(bmp, frame, i) {\n  var first = this.frames[0]\n    , last = this.frames[i - 1]\n    , fc = frame.fctl\n    , xo = fc.xOffset\n    , yo = fc.yOffset\n    , lxo\n    , lyo\n    , x\n    , y\n    , line\n    , p;\n\n  if (!this._curBmp) {\n    this._curBmp = [];\n    for (y = 0; y < first.fctl.height; y++) {\n      line = [];\n      for (x = 0; x < first.fctl.width; x++) {\n        p = bmp[y][x];\n        line.push({ r: p.r, g: p.g, b: p.b, a: p.a });\n      }\n      this._curBmp.push(line);\n    }\n  }\n\n  if (last && last.fctl.disposeOp !== 0) {\n    lxo = last.fctl.xOffset;\n    lyo = last.fctl.yOffset;\n    for (y = 0; y < last.fctl.height; y++) {\n      for (x = 0; x < last.fctl.width; x++) {\n        if (last.fctl.disposeOp === 0) {\n          // none / keep\n        } else if (last.fctl.disposeOp === 1) {\n          // background / clear\n          this._curBmp[lyo + y][lxo + x] = { r: 0, g: 0, b: 0, a: 0 };\n        } else if (last.fctl.disposeOp === 2) {\n          // previous / restore\n          p = this._lastBmp[y][x];\n          this._curBmp[lyo + y][lxo + x] = { r: p.r, g: p.g, b: p.b, a: p.a };\n        }\n      }\n    }\n  }\n\n  if (frame.fctl.disposeOp === 2) {\n    this._lastBmp = [];\n    for (y = 0; y < frame.fctl.height; y++) {\n      line = [];\n      for (x = 0; x < frame.fctl.width; x++) {\n        p = this._curBmp[yo + y][xo + x];\n        line.push({ r: p.r, g: p.g, b: p.b, a: p.a });\n      }\n      this._lastBmp.push(line);\n    }\n  } else {\n    this._lastBmp = null;\n  }\n\n  for (y = 0; y < frame.fctl.height; y++) {\n    for (x = 0; x < frame.fctl.width; x++) {\n      p = bmp[y][x];\n      if (fc.blendOp === 0) {\n        // source\n        this._curBmp[yo + y][xo + x] = { r: p.r, g: p.g, b: p.b, a: p.a };\n      } else if (fc.blendOp === 1) {\n        // over\n        if (p.a !== 0) {\n          this._curBmp[yo + y][xo + x] = { r: p.r, g: p.g, b: p.b, a: p.a };\n        }\n      }\n    }\n  }\n\n  return this._curBmp;\n};\n\nPNG.prototype._animate = function(callback) {\n  if (!this.frames) {\n    return callback(this.bmp, this.cellmap);\n  }\n\n  var self = this\n    , numPlays = this.actl.numPlays || Infinity\n    , running = 0\n    , i = -1;\n\n  this._curBmp = null;\n  this._lastBmp = null;\n\n  var next_lomem = function() {\n    if (!running) return;\n\n    var frame = self.frames[++i];\n    if (!frame) {\n      if (!--numPlays) return callback();\n      i = -1;\n      // XXX may be able to optimize by only setting the self._curBmp once???\n      self._curBmp = null;\n      self._lastBmp = null;\n      return setImmediate(next);\n    }\n\n    var bmp = frame.bmp\n      , renderBmp = self.renderFrame(bmp, frame, i)\n      , cellmap = self.createCellmap(renderBmp);\n\n    callback(renderBmp, cellmap);\n    return setTimeout(next, frame.delay / self.speed | 0);\n  };\n\n  var next_locpu = function() {\n    if (!running) return;\n    var frame = self.frames[++i];\n    if (!frame) {\n      if (!--numPlays) return callback();\n      i = -1;\n      return setImmediate(next);\n    }\n    callback(frame.bmp, frame.cellmap);\n    return setTimeout(next, frame.delay / self.speed | 0);\n  };\n\n  var next = this.optimization === 'mem'\n    ? next_lomem\n    : next_locpu;\n\n  this._control = function(state) {\n    if (state === -1) {\n      i = -1;\n      self._curBmp = null;\n      self._lastBmp = null;\n      running = 0;\n      callback(self.frames[0].bmp,\n        self.frames[0].cellmap || self.createCellmap(self.frames[0].bmp));\n      return;\n    }\n    if (state === running) return;\n    running = state;\n    return next();\n  };\n\n  this._control(1);\n};\n\nPNG.prototype.play = function(callback) {\n  if (!this._control || callback) {\n    this.stop();\n    return this._animate(callback);\n  }\n  this._control(1);\n};\n\nPNG.prototype.pause = function() {\n  if (!this._control) return;\n  this._control(0);\n};\n\nPNG.prototype.stop = function() {\n  if (!this._control) return;\n  this._control(-1);\n};\n\nPNG.prototype.toPNG = function(input) {\n  var options = this.options\n    , file = this.file\n    , format = this.format\n    , buf\n    , img\n    , gif\n    , i\n    , control\n    , disposeOp;\n\n  if (format !== 'gif') {\n    buf = exec('convert', [format + ':-', 'png:-'],\n      { stdio: ['pipe', 'pipe', 'ignore'], input: input });\n    img = PNG(buf, options);\n    img.file = file;\n    return img;\n  }\n\n  gif = GIF(input, options);\n\n  this.width = gif.width;\n  this.height = gif.height;\n  this.frames = [];\n\n  for (i = 0; i < gif.images.length; i++) {\n    img = gif.images[i];\n    // Convert from gif disposal to png disposal. See:\n    // http://www.w3.org/Graphics/GIF/spec-gif89a.txt\n    control = img.control || gif;\n    disposeOp = Math.max(0, (control.disposeMethod || 0) - 1);\n    if (disposeOp > 2) disposeOp = 0;\n    this.frames.push({\n      fctl: {\n        sequenceNumber: i,\n        width: img.width,\n        height: img.height,\n        xOffset: img.left,\n        yOffset: img.top,\n        delayNum: control.delay,\n        delayDen: 100,\n        disposeOp: disposeOp,\n        blendOp: 1\n      },\n      fdat: [],\n      _pixels: [],\n      _bmp: img.bmp\n    });\n  }\n\n  this.bmp = this.frames[0]._bmp;\n  this.cellmap = this.createCellmap(this.bmp);\n\n  if (this.frames.length > 1) {\n    this.actl = { numFrames: gif.images.length, numPlays: gif.numPlays || 0 };\n    this.frames = this.compileFrames(this.frames);\n  } else {\n    this.frames = undefined;\n  }\n\n  return this;\n};\n\n// Convert a gif to an apng using imagemagick. Unfortunately imagemagick\n// doesn't support apngs, so we coalesce the gif frames into one image and then\n// slice them into frames.\nPNG.prototype.gifMagick = function(input) {\n  var options = this.options\n    , file = this.file\n    , format = this.format\n    , buf\n    , fmt\n    , img\n    , frames\n    , frame\n    , width\n    , height\n    , iwidth\n    , twidth\n    , i\n    , lines\n    , line\n    , x\n    , y;\n\n  buf = exec('convert',\n    [format + ':-', '-coalesce', '+append', 'png:-'],\n    { stdio: ['pipe', 'pipe', 'ignore'], input: input });\n\n  fmt = '{\"W\":%W,\"H\":%H,\"w\":%w,\"h\":%h,\"d\":%T,\"x\":\"%X\",\"y\":\"%Y\"},'\n  frames = exec('identify', ['-format', fmt, format + ':-'],\n    { encoding: 'utf8', stdio: ['pipe', 'pipe', 'ignore'], input: input });\n  frames = JSON.parse('[' + frames.trim().slice(0, -1) + ']');\n\n  img = PNG(buf, options);\n  img.file = file;\n  Object.keys(img).forEach(function(key) {\n    this[key] = img[key];\n  }, this);\n\n  width = frames[0].W;\n  height = frames[0].H;\n  iwidth = 0;\n  twidth = 0;\n\n  this.width = width;\n  this.height = height;\n\n  this.frames = [];\n\n  for (i = 0; i < frames.length; i++) {\n    frame = frames[i];\n    frame.x = +frame.x;\n    frame.y = +frame.y;\n\n    iwidth = twidth;\n    twidth += width;\n\n    lines = [];\n    for (y = frame.y; y < height; y++) {\n      line = [];\n      for (x = iwidth + frame.x; x < twidth; x++) {\n        line.push(img.bmp[y][x]);\n      }\n      lines.push(line);\n    }\n\n    this.frames.push({\n      fctl: {\n        sequenceNumber: i,\n        width: frame.w,\n        height: frame.h,\n        xOffset: frame.x,\n        yOffset: frame.y,\n        delayNum: frame.d,\n        delayDen: 100,\n        disposeOp: 0,\n        blendOp: 0\n      },\n      fdat: [],\n      _pixels: [],\n      _bmp: lines\n    });\n  }\n\n  this.bmp = this.frames[0]._bmp;\n  this.cellmap = this.createCellmap(this.bmp);\n\n  if (this.frames.length > 1) {\n    this.actl = { numFrames: frames.length, numPlays: 0 };\n    this.frames = this.compileFrames(this.frames);\n  } else {\n    this.frames = undefined;\n  }\n\n  return this;\n};\n\nPNG.prototype.decompress = function(buffers) {\n  return zlib.inflateSync(new Buffer(buffers.reduce(function(out, data) {\n    return out.concat(Array.prototype.slice.call(data));\n  }, [])));\n};\n\n/**\n * node-crc\n * https://github.com/alexgorbatchev/node-crc\n * https://github.com/alexgorbatchev/node-crc/blob/master/LICENSE\n *\n * The MIT License (MIT)\n *\n * Copyright 2014 Alex Gorbatchev\n *\n * Permission is hereby granted, free of charge, to any person obtaining\n * a copy of this software and associated documentation files (the\n * \"Software\"), to deal in the Software without restriction, including\n * without limitation the rights to use, copy, modify, merge, publish,\n * distribute, sublicense, and/or sell copies of the Software, and to\n * permit persons to whom the Software is furnished to do so, subject to\n * the following conditions:\n *\n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\n * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\n * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\n * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n*/\n\nPNG.prototype.crc32 = (function() {\n  var crcTable = [\n    0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, 0x706af48f,\n    0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988,\n    0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91, 0x1db71064, 0x6ab020f2,\n    0xf3b97148, 0x84be41de, 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7,\n    0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9,\n    0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172,\n    0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, 0x35b5a8fa, 0x42b2986c,\n    0xdbbbc9d6, 0xacbcf940, 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59,\n    0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423,\n    0xcfba9599, 0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924,\n    0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190, 0x01db7106,\n    0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433,\n    0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818, 0x7f6a0dbb, 0x086d3d2d,\n    0x91646c97, 0xe6635c01, 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e,\n    0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950,\n    0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65,\n    0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, 0x4adfa541, 0x3dd895d7,\n    0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0,\n    0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa,\n    0xbe0b1010, 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f,\n    0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17, 0x2eb40d81,\n    0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a,\n    0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683, 0xe3630b12, 0x94643b84,\n    0x0d6d6a3e, 0x7a6a5aa8, 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1,\n    0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb,\n    0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc,\n    0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, 0xd6d6a3e8, 0xa1d1937e,\n    0x38d8c2c4, 0x4fdff252, 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b,\n    0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55,\n    0x316e8eef, 0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236,\n    0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe, 0xb2bd0b28,\n    0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d,\n    0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a, 0x9c0906a9, 0xeb0e363f,\n    0x72076785, 0x05005713, 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38,\n    0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242,\n    0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777,\n    0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, 0x8f659eff, 0xf862ae69,\n    0x616bffd3, 0x166ccf45, 0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2,\n    0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc,\n    0x40df0b66, 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9,\n    0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605, 0xcdd70693,\n    0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94,\n    0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d\n  ];\n\n  return function crc32(buf) {\n    //var crc = previous === 0 ? 0 : ~~previous ^ -1;\n    var crc = -1;\n    for (var i = 0, len = buf.length; i < len; i++) {\n      crc = crcTable[(crc ^ buf[i]) & 0xff] ^ (crc >>> 8);\n    }\n    return crc ^ -1;\n  };\n})();\n\nPNG.prototype._debug = function() {\n  if (!this.options.log) return;\n  return this.options.log.apply(null, arguments);\n};\n\n/**\n * GIF\n */\n\nfunction GIF(file, options) {\n  var self = this;\n\n  if (!(this instanceof GIF)) {\n    return new GIF(file, options);\n  }\n\n  var info = {}\n    , p = 0\n    , buf\n    , i\n    , total\n    , sig\n    , desc\n    , img\n    , ext\n    , label\n    , size;\n\n  if (!file) throw new Error('no file');\n\n  options = options || {};\n\n  this.options = options;\n\n  // XXX If the gif is not optimized enough\n  // it may OOM the process with too many frames.\n  // TODO: Implement in PNG reader.\n  this.pixelLimit = this.options.pixelLimit || 7622550;\n  this.totalPixels = 0;\n\n  if (Buffer.isBuffer(file)) {\n    buf = file;\n    file = null;\n  } else {\n    file = path.resolve(process.cwd(), file);\n    buf = fs.readFileSync(file);\n  }\n\n  sig = buf.slice(0, 6).toString('ascii');\n  if (sig !== 'GIF87a' && sig !== 'GIF89a') {\n    throw new Error('bad header: ' + sig);\n  }\n\n  this.width = buf.readUInt16LE(6);\n  this.height = buf.readUInt16LE(8);\n\n  this.flags = buf.readUInt8(10);\n  this.gct = !!(this.flags & 0x80);\n  this.gctsize = (this.flags & 0x07) + 1;\n\n  this.bgIndex = buf.readUInt8(11);\n  this.aspect = buf.readUInt8(12);\n  p += 13;\n\n  if (this.gct) {\n    this.colors = [];\n    total = 1 << this.gctsize;\n    for (i = 0; i < total; i++, p += 3) {\n      this.colors.push([buf[p], buf[p + 1], buf[p + 2], 255]);\n    }\n  }\n\n  this.images = [];\n  this.extensions = [];\n\n  try {\n    while (p < buf.length) {\n      desc = buf.readUInt8(p);\n      p += 1;\n      if (desc === 0x2c) {\n        img = {};\n\n        img.left = buf.readUInt16LE(p);\n        p += 2;\n        img.top = buf.readUInt16LE(p);\n        p += 2;\n\n        img.width = buf.readUInt16LE(p);\n        p += 2;\n        img.height = buf.readUInt16LE(p);\n        p += 2;\n\n        img.flags = buf.readUInt8(p);\n        p += 1;\n\n        img.lct = !!(img.flags & 0x80);\n        img.ilace = !!(img.flags & 0x40);\n        img.lctsize = (img.flags & 0x07) + 1;\n\n        if (img.lct) {\n          img.lcolors = [];\n          total = 1 << img.lctsize;\n          for (i = 0; i < total; i++, p += 3) {\n            img.lcolors.push([buf[p], buf[p + 1], buf[p + 2], 255]);\n          }\n        }\n\n        img.codeSize = buf.readUInt8(p);\n        p += 1;\n\n        img.size = buf.readUInt8(p);\n        p += 1;\n\n        img.lzw = [buf.slice(p, p + img.size)];\n        p += img.size;\n\n        while (buf[p] !== 0x00) {\n          // Some gifs screw up their size.\n          // XXX Same for all subblocks?\n          if (buf[p] === 0x3b && p === buf.length - 1) {\n            p--;\n            break;\n          }\n          size = buf.readUInt8(p);\n          p += 1;\n          img.lzw.push(buf.slice(p, p + size));\n          p += size;\n        }\n\n        assert.equal(buf.readUInt8(p), 0x00);\n        p += 1;\n\n        if (ext && ext.label === 0xf9) {\n          img.control = ext;\n        }\n\n        this.totalPixels += img.width * img.height;\n\n        this.images.push(img);\n\n        if (this.totalPixels >= this.pixelLimit) {\n          break;\n        }\n      } else if (desc === 0x21) {\n        // Extensions:\n        // http://www.w3.org/Graphics/GIF/spec-gif89a.txt\n        ext = {};\n        label = buf.readUInt8(p);\n        p += 1;\n        ext.label = label;\n        if (label === 0xf9) {\n          size = buf.readUInt8(p);\n          assert.equal(size, 0x04);\n          p += 1;\n          ext.fields = buf.readUInt8(p);\n          ext.disposeMethod = (ext.fields >> 2) & 0x07;\n          ext.useTransparent = !!(ext.fields & 0x01);\n          p += 1;\n          ext.delay = buf.readUInt16LE(p);\n          p += 2;\n          ext.transparentColor = buf.readUInt8(p);\n          p += 1;\n          while (buf[p] !== 0x00) {\n            size = buf.readUInt8(p);\n            p += 1;\n            p += size;\n          }\n          assert.equal(buf.readUInt8(p), 0x00);\n          p += 1;\n          this.delay = ext.delay;\n          this.transparentColor = ext.transparentColor;\n          this.disposeMethod = ext.disposeMethod;\n          this.useTransparent = ext.useTransparent;\n        } else if (label === 0xff) {\n          // https://wiki.whatwg.org/wiki/GIF#Specifications\n          size = buf.readUInt8(p);\n          p += 1;\n          ext.id = buf.slice(p, p + 8).toString('ascii');\n          p += 8;\n          ext.auth = buf.slice(p, p + 3).toString('ascii');\n          p += 3;\n          ext.data = [];\n          while (buf[p] !== 0x00) {\n            size = buf.readUInt8(p);\n            p += 1;\n            ext.data.push(buf.slice(p, p + size));\n            p += size;\n          }\n          ext.data = new Buffer(ext.data.reduce(function(out, data) {\n            return out.concat(Array.prototype.slice.call(data));\n          }, []));\n          // AnimExts looping extension (identical to netscape)\n          if (ext.id === 'ANIMEXTS' && ext.auth === '1.0') {\n            ext.id = 'NETSCAPE';\n            ext.auth = '2.0';\n            ext.animexts = true;\n          }\n          // Netscape extensions\n          if (ext.id === 'NETSCAPE' && ext.auth === '2.0') {\n            if (ext.data.readUInt8(0) === 0x01) {\n              // Netscape looping extension\n              // http://graphcomp.com/info/specs/ani_gif.html\n              ext.numPlays = ext.data.readUInt16LE(1);\n              this.numPlays = ext.numPlays;\n            } else if (ext.data.readUInt8(0) === 0x02) {\n              // Netscape buffering extension\n              this.minBuffer = ext.data;\n            }\n          }\n          // Adobe XMP extension\n          if (ext.id === 'XMP Data' && ext.auth === 'XMP') {\n            ext.xmp = ext.data.toString('utf8');\n            this.xmp = ext.xmp;\n          }\n          // ICC extension\n          if (ext.id === 'ICCRGBG1' && ext.auth === '012') {\n            // NOTE: Says size is 4 bytes, not 1? Maybe just buffer size?\n            this.icc = ext.data;\n          }\n          // fractint extension\n          if (ext.id === 'fractint' && /^00[1-7]$/.test(ext.auth)) {\n            // NOTE: Says size is 4 bytes, not 1? Maybe just buffer size?\n            // Size: '!\\377\\013' == [0x00, 0x15, 0xff, 0x0b]\n            this.fractint = ext.data;\n          }\n          assert.equal(buf.readUInt8(p), 0x00);\n          p += 1;\n        } else {\n          ext.data = [];\n          while (buf[p] !== 0x00) {\n            size = buf.readUInt8(p);\n            p += 1;\n            ext.data.push(buf.slice(p, p + size));\n            p += size;\n          }\n          assert.equal(buf.readUInt8(p), 0x00);\n          p += 1;\n        }\n        this.extensions.push(ext);\n      } else if (desc === 0x3b) {\n        break;\n      } else if (p === buf.length - 1) {\n        // } else if (desc === 0x00 && p === buf.length - 1) {\n        break;\n      } else {\n        throw new Error('unknown block');\n      }\n    }\n  } catch (e) {\n    if (options.debug) {\n      throw e;\n    }\n  }\n\n  this.images = this.images.map(function(img, imageIndex) {\n    var control = img.control || this;\n\n    img.lzw = new Buffer(img.lzw.reduce(function(out, data) {\n      return out.concat(Array.prototype.slice.call(data));\n    }, []));\n\n    try {\n      img.data = this.decompress(img.lzw, img.codeSize);\n    } catch (e) {\n      if (options.debug) throw e;\n      return;\n    }\n\n    var interlacing = [\n      [ 0, 8 ],\n      [ 4, 8 ],\n      [ 2, 4 ],\n      [ 1, 2 ],\n      [ 0, 0 ]\n    ];\n\n    var table = img.lcolors || this.colors\n      , row = 0\n      , col = 0\n      , ilp = 0\n      , p = 0\n      , b\n      , idx\n      , i\n      , y\n      , x\n      , line\n      , pixel;\n\n    img.samples = [];\n    // Rewritten version of:\n    // https://github.com/lbv/ka-cs-programs/blob/master/lib/gif-reader.js\n    for (;;) {\n      b = img.data[p++];\n      if (b == null) break;\n      idx = (row * img.width + col) * 4;\n      if (!table[b]) {\n        if (options.debug) throw new Error('bad samples');\n        table[b] = [0, 0, 0, 0];\n      }\n      img.samples[idx] = table[b][0];\n      img.samples[idx + 1] = table[b][1];\n      img.samples[idx + 2] = table[b][2];\n      img.samples[idx + 3] = table[b][3];\n      if (control.useTransparent && b === control.transparentColor) {\n        img.samples[idx + 3] = 0;\n      }\n      if (++col >= img.width) {\n        col = 0;\n        if (img.ilace) {\n          row += interlacing[ilp][1];\n          if (row >= img.height) {\n            row = interlacing[++ilp][0];\n          }\n        } else {\n          row++;\n        }\n      }\n    }\n\n    img.pixels = [];\n    for (i = 0; i < img.samples.length; i += 4) {\n      img.pixels.push(img.samples.slice(i, i + 4));\n    }\n\n    img.bmp = [];\n    for (y = 0, p = 0; y < img.height; y++) {\n      line = [];\n      for (x = 0; x < img.width; x++) {\n        pixel = img.pixels[p++];\n        if (!pixel) {\n          if (options.debug) throw new Error('no pixel');\n          line.push({ r: 0, g: 0, b: 0, a: 0 });\n          continue;\n        }\n        line.push({ r: pixel[0], g: pixel[1], b: pixel[2], a: pixel[3] });\n      }\n      img.bmp.push(line);\n    }\n\n    return img;\n  }, this).filter(Boolean);\n\n  if (!this.images.length) {\n    throw new Error('no image data or bad decompress');\n  }\n}\n\n// Rewritten version of:\n// https://github.com/lbv/ka-cs-programs/blob/master/lib/gif-reader.js\nGIF.prototype.decompress = function(input, codeSize) {\n  var bitDepth = codeSize + 1\n    , CC = 1 << codeSize\n    , EOI = CC + 1\n    , stack = []\n    , table = []\n    , ntable = 0\n    , oldCode = null\n    , buffer = 0\n    , nbuffer = 0\n    , p = 0\n    , buf = []\n    , bits\n    , read\n    , ans\n    , n\n    , code\n    , i\n    , K\n    , b\n    , maxElem;\n\n  for (;;) {\n    if (stack.length === 0) {\n      bits = bitDepth;\n      read = 0;\n      ans = 0;\n      while (read < bits) {\n        if (nbuffer === 0) {\n          if (p >= input.length) return buf;\n          buffer = input[p++];\n          nbuffer = 8;\n        }\n        n = Math.min(bits - read, nbuffer);\n        ans |= (buffer & ((1 << n) - 1)) << read;\n        read += n;\n        nbuffer -= n;\n        buffer >>= n;\n      }\n      code = ans;\n\n      if (code === EOI) {\n        break;\n      }\n\n      if (code === CC) {\n        table = [];\n        for (i = 0; i < CC; ++i) {\n          table[i] = [i, -1, i];\n        }\n        bitDepth = codeSize + 1;\n        maxElem = 1 << bitDepth;\n        ntable = CC + 2;\n        oldCode = null;\n        continue;\n      }\n\n      if (oldCode === null) {\n        oldCode = code;\n        buf.push(table[code][0]);\n        continue;\n      }\n\n      if (code < ntable) {\n        for (i = code; i >= 0; i = table[i][1]) {\n          stack.push(table[i][0]);\n        }\n        table[ntable++] = [\n          table[code][2],\n          oldCode,\n          table[oldCode][2]\n        ];\n      } else {\n        K = table[oldCode][2];\n        table[ntable++] = [K, oldCode, K];\n        for (i = code; i >= 0; i = table[i][1]) {\n          stack.push(table[i][0]);\n        }\n      }\n\n      oldCode = code;\n      if (ntable === maxElem) {\n        maxElem = 1 << (++bitDepth);\n        if (bitDepth > 12) bitDepth = 12;\n      }\n    }\n    b = stack.pop();\n    if (b == null) break;\n    buf.push(b);\n  }\n\n  return buf;\n};\n\n/**\n * Expose\n */\n\nexports = PNG;\nexports.png = PNG;\nexports.gif = GIF;\n\nmodule.exports = exports;\n"
  }
]