{"version":3,"sources":["webpack:///app.310033b.js","webpack:///webpack/bootstrap 21d3956fd434cbda121b","webpack:///./js/utils.js","webpack:///./js/lib/chibi.js","webpack:///./js/modal.js","webpack:///./js/notif.js","webpack:///./js/term/themes.js","webpack:///./node_modules/events/events.js","webpack:///./js/term/demo.js","webpack:///./js/index.js","webpack:///./js/lib/polyfills.js","webpack:///./js/appcommon.js","webpack:///./js/wifi.js","webpack:///./js/lang.js","webpack:///./js/term/index.js","webpack:///./js/term/screen.js","webpack:///./js/term/screen_parser.js","webpack:///./js/term/screen_renderer.js","webpack:///./js/term/connection.js","webpack:///./js/term/input.js","webpack:///./js/term/upload.js","webpack:///./js/term/soft_keyboard.js","webpack:///./js/term/debug_screen.js"],"names":["modules","__webpack_require__","moduleId","installedModules","exports","module","i","l","call","m","c","d","name","getter","o","Object","defineProperty","configurable","enumerable","get","n","__esModule","object","property","prototype","hasOwnProperty","p","s","mk","a","document","createElement","qs","querySelector","qsa","querySelectorAll","cr","b","which","bool","parse2B","arguments","length","charCodeAt","parse3B","encode2B","String","fromCharCode","encode3B","e","_typeof","Symbol","iterator","constructor","q","replace","charAt","toUpperCase","f","currentStyle","getComputedStyle","getPropertyValue","g","encodeURIComponent","h","style","display","j","Array","nodeName","elements","disabled","type","value","selected","checked","substring","k","split","classList","remove","add","toggle","contains","r","innerHTML","lastChild","parentNode","insertBefore","nextSibling","appendChild","firstChild","nodeType","each","apply","first","shift","last","pop","odd","push","even","hide","show","removeChild","css","getClass","className","setClass","addClass","removeClass","toggleClass","hasClass","html","htmlBefore","htmlAfter","htmlAppend","htmlPrepend","attr","toLowerCase","cssText","setAttribute","getAttribute","data","val","on","addEventListener","attachEvent","off","removeEventListener","detachEvent","window","onload","ajax","assign","method","nocache","timeout","loader","callback","_loader","url","indexOf","XMLHttpRequest","Date","toString","open","setTimeout","console","error","abort","onreadystatechange","readyState","responseText","status","clearTimeout","setRequestHeader","send","post","ready","loaded","t","&","<",">","\"","'","/","`","=","htmlEscape","$","modal","curCloseCb","init","this","stopImmediatePropagation","$balloon","timerHideBegin","timerHideEnd","nt","canCancel","stopTimeouts","themes","fgbgThemes","colorTable256","buildColorTable","fill","SELECTION_FG","SELECTION_BG","themePreview","forEach","dataset","fg","color","bg","backgroundColor","EventEmitter","_events","_maxListeners","undefined","isFunction","arg","isNumber","isObject","isUndefined","defaultMaxListeners","setMaxListeners","isNaN","TypeError","emit","er","handler","len","args","listeners","Error","err","context","slice","addListener","listener","newListener","warned","trace","once","removeListener","fired","list","position","splice","removeAllListeners","key","listenerCount","evlistener","emitter","_toConsumableArray","isArray","from","_possibleConstructorReturn","ReferenceError","_inherits","create","writable","setPrototypeOf","__proto__","_classCallCheck","_get","Function","getOwnPropertyDescriptor","getPrototypeOf","_createClass","_require","_require2","ANSIParser","reset","joinChunks","currentSequence","sequence","map","next","done","codePointAt","match","parseSequence","return","getRainbowColor","Math","PI","floor","sin","ScrollingTerminal","width","height","termScreen","parser","handleParsed","_lastLoad","now","load","serialize","showPage","min","max","cursor","x","y","visible","trackMouse","theme","rainbow","clear","screen","scroll","newLine","moveBack","writeChar","deleteForward","insertBlanks","clampCursor","write","scheduleLoad","fromCodePoint","_scheduledLoad","clearInterval","_rainbowTimer","setInterval","Process","demoData","buttons","1","2","3","4","5","child","destroy","substr","mouseReceiver","demoshIndex","screenfetch","location","hostname","devicePixelRatio","filter","trim","local-echo","includes","info","showSplash","then","printText"," ",".","-","*","#","repeat","abs","Promise","join","colors","ls","shell","Number","isFinite","terminal","drawnScreenFG","rainbowTimer","mouse","randomData","highlighted","random","scrollOffset","render","sudo","index","run","make","pwd","cd","whoami","navigator","userAgent","uname","mkdir","rm","cp","mv","ln","touch","exit","github","DemoShell","history","historyIndex","cursorPos","prompt","unshift","copyFromHistoryIndex","warn","moveForward","parse","spawn","demoInterface","input","mouseMove","mouseDown","mouseUp","didInit","termInit","RangeError","pageShown","notify","keyCode","ctrlKey","submit","wheelDelta","createEvent","initEvent","dispatchEvent","fireEvent","preventDefault","search","childNodes","textContent","innerWidth","removeAttribute","href","noAutoShow","id","tr","round","JSON","log","result","inProgress","APs","sort","rssi","enc","parseInt","essid","rssi_perc","_demo","_demo_aps","_root","sta_ssid","sta_password","sta_active_ip","sta_active_ssid","startScanning","WiFi","_tr","Notify","TermScreen","TermConnection","TermInput","TermUpload","initSoftKeyboard","attachDebugScreen","termUpload","statusScreen","title","loading","screenFG","screenBG","screenAttrs","onerror","canvas","labels","fitIntoWidth","fitIntoHeight","innerHeight","Element","requestFullscreen","webkitRequestFullscreen","updateSize","conn","termUpl","ScreenParser","ScreenRenderer","ctx","getContext","renderer","_debug","audioCtx","AudioContext","webkitAudioContext","Proxy","blinking","hanging","_window","fontFamily","fontSize","gridScaleX","gridScaleY","debug","graphics","_windowScale","windowState","selection","selectable","start","end","mouseMode","clicks","movement","set","scheduleSizeUpdate","scheduleDraw","bracketedPaste","blinkingCellCount","reverseVideo","screenToGrid","getNormalizedSelection","altKey","button","offsetX","offsetY","onMouseDown","concat","getBoundingClientRect","clientX","left","clientY","top","touches","gridToScreen","transform","copySelectionToClipboard","onMouseMove","onMouseUp","onMouseWheel","deltaY","_scheduledSizeUpdate","weight","getCellSize","font","getFont","measureText","ceil","getCharSize","resetDrawn","draw","isInSelection","getSelectedText","body","select","execCommand","Notification","permission","focus","requestPermission","pow","_lastBeep","_convolver","createConvolver","sampleRate","createBuffer","getChannelData","buffer","connect","destination","createOscillator","createGain","gain","frequency","currentTime","stop","requestAnimationFrame","contentLoaded","resetCursorBlink","setAlts","setMouseMode","u","v","w","z","A","B","C","D","E","opacity","defaultFg","defaultBg","setDefaultColors","palette","loadContent","loadLabels","beep","showNotification","stringify","frakturExceptions","_palette","defaultBgNum","defaultFgNum","blinkStyleOn","blinkInterval","cursorBlinkOn","cursorBlinkInterval","resetBlink","drawnScreen","drawnScreenBG","drawnScreenAttrs","drawnCursor","_scheduledDraw","cellWidth","cellHeight","fillStyle","getColor","clearRect","fillRect","charSize","text","attrs","globalAlpha","alphaToFraktur","beginPath","rect","fillText","strokeStyle","lineWidth","lineCap","moveTo","lineTo","F","G","stroke","drawStatus","startDrawLoop","stopDrawLoop","setTransform","drawStart","textAlign","textBaseline","Map","ha","ia","ja","ka","la","ma","na","oa","pa","qa","ra","sa","has","cell","isCursor","inSelection","keys","getAdjacentCells","save","ta","ua","va","wa","xa","clipRect","clip","ya","H","I","J","za","K","L","M","N","O","drawBackground","Aa","setCell","P","Q","R","S","T","Ba","Ca","U","V","W","X","Y","Da","Z","_","aa","ba","ca","da","ea","fa","drawCharacter","ga","restore","drawEnd","translate","rotate","_drawTimerThread","drawTimerLoop","demo","ws","heartbeatTimeout","pingInterval","xoff","autoXoffTimeout","reconnTimeout","forceClosing","hidden","closeSocket","heartbeat","code","close","alert","WebSocket","onWSOpen","onWSClose","onWSMessage","onHeartbeatFail","allFn","metaKey","clipboardData","setData","getData","setContent","all_fn","6","8","9","12","13","16","17","18","19","20","27","32","33","34","35","36","37","38","39","40","41","42","43","44","45","46","58","59","60","61","62","63","64","91","92","93","106","107","109","110","111","144","145","160","161","162","163","164","165","166","167","168","169","170","171","172","173","174","175","176","186","187","188","189","190","192","194","219","220","221","222","224","np_alt","cu_alt","fn_alt","mt_click","mt_move","no_keys","crlf_mode","Backspace","Tab","Enter","Control+Enter","Escape","ArrowUp","ArrowDown","ArrowRight","ArrowLeft","Home","Insert","Delete","End","PageUp","PageDown","F1","F2","F3","F4","F5","F6","F7","F8","F9","F10","F11","F12","Shift+F1","Shift+F2","Shift+F3","Shift+F4","Shift+F5","Shift+F6","Shift+F7","Shift+F8","Shift+F9","Shift+F10","Shift+F11","Shift+F12","Numpad0","Numpad1","Numpad2","Numpad3","Numpad4","Numpad5","Numpad6","Numpad7","Numpad8","Numpad9","Numpad*","Numpad+","Numpad-","Numpad.","Numpad/","Control+]","Control+\\","Control+[","Control+^","Control+_","Control+ArrowLeft","Control+ArrowRight","Control+ArrowUp","Control+ArrowDown","Control+Home","Control+End","Shift+ArrowLeft","Shift+ArrowRight","Shift+ArrowUp","Shift+ArrowDown","Shift+Home","Shift+End","Alt+ArrowLeft","Alt+ArrowRight","Meta+ArrowLeft","Meta+ArrowRight","Alt+Backspace","Meta+Backspace","Control+Shift+C","Control+Insert","Control+F12","activeElement","HTMLTextAreaElement","shiftKey","sendString","blockKeys","handleKeyDown","CR","LF","CRLF","canSend","FileReader","target","files","confirm","readAsText","_slicedToArray","startsWith","stopPropagation","isComposing","inputType","←","↓","↑","→","^C","pointerEvents","createPattern","strokeRect"],"mappings":"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","file":"app.310033b.js","sourcesContent":["/******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n/******/\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId]) {\n/******/ \t\t\treturn installedModules[moduleId].exports;\n/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\ti: moduleId,\n/******/ \t\t\tl: false,\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n/******/\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.l = true;\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/******/\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n/******/\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n/******/\n/******/ \t// define getter function for harmony exports\n/******/ \t__webpack_require__.d = function(exports, name, getter) {\n/******/ \t\tif(!__webpack_require__.o(exports, name)) {\n/******/ \t\t\tObject.defineProperty(exports, name, {\n/******/ \t\t\t\tconfigurable: false,\n/******/ \t\t\t\tenumerable: true,\n/******/ \t\t\t\tget: getter\n/******/ \t\t\t});\n/******/ \t\t}\n/******/ \t};\n/******/\n/******/ \t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t__webpack_require__.n = function(module) {\n/******/ \t\tvar getter = module && module.__esModule ?\n/******/ \t\t\tfunction getDefault() { return module['default']; } :\n/******/ \t\t\tfunction getModuleExports() { return module; };\n/******/ \t\t__webpack_require__.d(getter, 'a', getter);\n/******/ \t\treturn getter;\n/******/ \t};\n/******/\n/******/ \t// Object.prototype.hasOwnProperty.call\n/******/ \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n/******/\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(__webpack_require__.s = 7);\n/******/ })\n/************************************************************************/\n/******/ ([\n/* 0 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\nexports.mk=function(a){return document.createElement(a)},exports.qs=function(a){return document.querySelector(a)},exports.qsa=function(a){return document.querySelectorAll(a)},exports.cr=function(a){return function(b){(10===b.which||13===b.which||32===b.which)&&a()}},exports.bool=function(a){return 1===a||'1'===a||!0===a||'true'===a},exports.parse2B=function(a){var b=1\":'>','\"':'"',\"'\":''',\"/\":'/',\"`\":'`',\"=\":'='};m.htmlEscape=function(a){return(a+'').replace(/[&<>\"'`=\\/]/g,function(a){return t[a]})},module.exports=m})();\n\n/***/ }),\n/* 2 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\nvar $=__webpack_require__(1);var modal={};var curCloseCb=null;modal.show=function(a,b){var c=$(a);c.removeClass('hidden visible'),setTimeout(function(){c.addClass('visible')},1),curCloseCb=b},modal.hide=function(a){var b=$(a);b.removeClass('visible'),setTimeout(function(){b.addClass('hidden'),curCloseCb&&curCloseCb()},500)},modal.init=function(){$('.Modal').on('click',function(){$(this).hasClass('no-close')||modal.hide(this)}),$('.Dialog').on('click',function(a){a.stopImmediatePropagation()}),$(window).on('keydown',function(a){27===a.which&&modal.hide('.Modal')})},module.exports=modal;\n\n/***/ }),\n/* 3 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\nvar $=__webpack_require__(1);var modal=__webpack_require__(2);var nt={};var sel='#notif';var $balloon;var timerHideBegin;var timerHideEnd;var canCancel=!1;var stopTimeouts=function(){clearTimeout(timerHideBegin),clearTimeout(timerHideEnd)};nt.show=function(a,b,c){$balloon.toggleClass('error',!0===c),$balloon.html(a),modal.show($balloon),stopTimeouts(),(!b||0>=b)&&(b=2500),timerHideBegin=setTimeout(nt.hide,b),canCancel=!1,setTimeout(function(){canCancel=!0},500)},nt.hide=function(){var a=$(sel);a.removeClass('visible'),timerHideEnd=setTimeout(function(){a.addClass('hidden')},250)},nt.init=function(){$balloon=$(sel),$(document).on('click',function(){canCancel&&nt.hide(this)}),$balloon.on('click',function(a){return a.stopImmediatePropagation(),!1}),$balloon.on('mouseenter',function(){stopTimeouts(),$balloon.removeClass('hidden').addClass('visible')})},module.exports=nt;\n\n/***/ }),\n/* 4 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\nvar themes=exports.themes=[['#111213','#CC0000','#4E9A06','#C4A000','#3465A4','#75507B','#06989A','#D3D7CF','#555753','#EF2929','#8AE234','#FCE94F','#729FCF','#AD7FA8','#34E2E2','#EEEEEC'],['#000000','#aa0000','#00aa00','#aa5500','#0000aa','#aa00aa','#00aaaa','#aaaaaa','#555555','#ff5555','#55ff55','#ffff55','#5555ff','#ff55ff','#55ffff','#ffffff'],['#000000','#cd0000','#00cd00','#cdcd00','#0000ee','#cd00cd','#00cdcd','#e5e5e5','#7f7f7f','#ff0000','#00ff00','#ffff00','#5c5cff','#ff00ff','#00ffff','#ffffff'],['#000000','#cd0000','#00cd00','#cdcd00','#0000cd','#cd00cd','#00cdcd','#faebd7','#404040','#ff0000','#00ff00','#ffff00','#0000ff','#ff00ff','#00ffff','#ffffff'],['#2e3436','#cc0000','#4e9a06','#c4a000','#3465a4','#75507b','#06989a','#d3d7cf','#555753','#ef2929','#8ae234','#fce94f','#729fcf','#ad7fa8','#34e2e2','#eeeeec'],['#073642','#dc322f','#859900','#b58900','#268bd2','#d33682','#2aa198','#eee8d5','#002b36','#cb4b16','#586e75','#657b83','#839496','#6c71c4','#93a1a1','#fdf6e3'],['#073642','#dc322f','#859900','#b58900','#268bd2','#d33682','#2aa198','#eee8d5','#002b36','#cb4b16','#586e75','#657b83','#839496','#6c71c4','#93a1a1','#fdf6e3'],['#000000','#69001A','#117800','#769100','#1A00A6','#8019AB','#289E76','#A4A4A4','#484848','#C54E76','#6DD441','#D2ED46','#765BFF','#DC75FF','#84FAD2','#FFFFFF'],['#000000','#aa0000','#00aa00','#aaaa00','#0000aa','#aa00aa','#00aaaa','#aaaaaa','#000000','#ff0000','#00FF00','#ffff00','#0000ff','#ff00ff','#00ffff','#ffffff'],['#000000','#722640','#0E5940','#808080','#40337F','#E434FE','#1B9AFE','#BFB3FF','#404C00','#E46501','#1BCB01','#BFCC80','#808080','#F1A6BF','#8DD9BF','#ffffff'],['#000000','#8D3E37','#55A049','#AAB95D','#40318D','#80348B','#72C1C8','#D59F74','#8B5429','#B86962','#94E089','#FFFFB2','#8071CC','#AA5FB6','#87D6DD','#ffffff']];exports.fgbgThemes=[['#aaaaaa','#000000'],['#000000','#ffffdd'],['#000000','#ffffff'],['#ffffff','#000000'],['#00ff00','#000000'],['#e53c00','#000000'],['#ffffff','#300a24'],['#657b83','#fdf6e3'],['#839496','#002b36']];var colorTable256=null;exports.buildColorTable=function(){if(null!=colorTable256)return colorTable256;colorTable256=Array(16).fill('rgba(0, 0, 0, 0)');for(var a=0;6>a;a++)for(var b=0;6>b;b++)for(var c=0;6>c;c++){var d=40*a+(a?55:0);var e=40*b+(b?55:0);var f=40*c+(c?55:0);colorTable256.push('rgb('+d+', '+e+', '+f+')')}for(var g=0;24>g;g++){var h=10*g+8;colorTable256.push('rgb('+h+', '+h+', '+h+')')}return colorTable256},exports.SELECTION_FG='#333',exports.SELECTION_BG='#b2d7fe',exports.themePreview=function(a){document.querySelectorAll('[data-fg]').forEach(function(b){var c=+b.dataset.fg;b.style.color=themes[a][c]}),document.querySelectorAll('[data-bg]').forEach(function(b){var c=+b.dataset.bg;b.style.backgroundColor=themes[a][c]})};\n\n/***/ }),\n/* 5 */\n/***/ (function(module, exports) {\n\n// Copyright Joyent, Inc. and other Node contributors.\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 permit\n// persons to whom the Software is furnished to do so, subject to the\n// 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. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\nfunction EventEmitter() {\n this._events = this._events || {};\n this._maxListeners = this._maxListeners || undefined;\n}\nmodule.exports = EventEmitter;\n\n// Backwards-compat with node 0.10.x\nEventEmitter.EventEmitter = EventEmitter;\n\nEventEmitter.prototype._events = undefined;\nEventEmitter.prototype._maxListeners = undefined;\n\n// By default EventEmitters will print a warning if more than 10 listeners are\n// added to it. This is a useful default which helps finding memory leaks.\nEventEmitter.defaultMaxListeners = 10;\n\n// Obviously not all Emitters should be limited to 10. This function allows\n// that to be increased. Set to zero for unlimited.\nEventEmitter.prototype.setMaxListeners = function(n) {\n if (!isNumber(n) || n < 0 || isNaN(n))\n throw TypeError('n must be a positive number');\n this._maxListeners = n;\n return this;\n};\n\nEventEmitter.prototype.emit = function(type) {\n var er, handler, len, args, i, listeners;\n\n if (!this._events)\n this._events = {};\n\n // If there is no 'error' event listener then throw.\n if (type === 'error') {\n if (!this._events.error ||\n (isObject(this._events.error) && !this._events.error.length)) {\n er = arguments[1];\n if (er instanceof Error) {\n throw er; // Unhandled 'error' event\n } else {\n // At least give some kind of context to the user\n var err = new Error('Uncaught, unspecified \"error\" event. (' + er + ')');\n err.context = er;\n throw err;\n }\n }\n }\n\n handler = this._events[type];\n\n if (isUndefined(handler))\n return false;\n\n if (isFunction(handler)) {\n switch (arguments.length) {\n // fast cases\n case 1:\n handler.call(this);\n break;\n case 2:\n handler.call(this, arguments[1]);\n break;\n case 3:\n handler.call(this, arguments[1], arguments[2]);\n break;\n // slower\n default:\n args = Array.prototype.slice.call(arguments, 1);\n handler.apply(this, args);\n }\n } else if (isObject(handler)) {\n args = Array.prototype.slice.call(arguments, 1);\n listeners = handler.slice();\n len = listeners.length;\n for (i = 0; i < len; i++)\n listeners[i].apply(this, args);\n }\n\n return true;\n};\n\nEventEmitter.prototype.addListener = function(type, listener) {\n var m;\n\n if (!isFunction(listener))\n throw TypeError('listener must be a function');\n\n if (!this._events)\n this._events = {};\n\n // To avoid recursion in the case that type === \"newListener\"! Before\n // adding it to the listeners, first emit \"newListener\".\n if (this._events.newListener)\n this.emit('newListener', type,\n isFunction(listener.listener) ?\n listener.listener : listener);\n\n if (!this._events[type])\n // Optimize the case of one listener. Don't need the extra array object.\n this._events[type] = listener;\n else if (isObject(this._events[type]))\n // If we've already got an array, just append.\n this._events[type].push(listener);\n else\n // Adding the second element, need to change to array.\n this._events[type] = [this._events[type], listener];\n\n // Check for listener leak\n if (isObject(this._events[type]) && !this._events[type].warned) {\n if (!isUndefined(this._maxListeners)) {\n m = this._maxListeners;\n } else {\n m = EventEmitter.defaultMaxListeners;\n }\n\n if (m && m > 0 && this._events[type].length > m) {\n this._events[type].warned = true;\n console.error('(node) warning: possible EventEmitter memory ' +\n 'leak detected. %d listeners added. ' +\n 'Use emitter.setMaxListeners() to increase limit.',\n this._events[type].length);\n if (typeof console.trace === 'function') {\n // not supported in IE 10\n console.trace();\n }\n }\n }\n\n return this;\n};\n\nEventEmitter.prototype.on = EventEmitter.prototype.addListener;\n\nEventEmitter.prototype.once = function(type, listener) {\n if (!isFunction(listener))\n throw TypeError('listener must be a function');\n\n var fired = false;\n\n function g() {\n this.removeListener(type, g);\n\n if (!fired) {\n fired = true;\n listener.apply(this, arguments);\n }\n }\n\n g.listener = listener;\n this.on(type, g);\n\n return this;\n};\n\n// emits a 'removeListener' event iff the listener was removed\nEventEmitter.prototype.removeListener = function(type, listener) {\n var list, position, length, i;\n\n if (!isFunction(listener))\n throw TypeError('listener must be a function');\n\n if (!this._events || !this._events[type])\n return this;\n\n list = this._events[type];\n length = list.length;\n position = -1;\n\n if (list === listener ||\n (isFunction(list.listener) && list.listener === listener)) {\n delete this._events[type];\n if (this._events.removeListener)\n this.emit('removeListener', type, listener);\n\n } else if (isObject(list)) {\n for (i = length; i-- > 0;) {\n if (list[i] === listener ||\n (list[i].listener && list[i].listener === listener)) {\n position = i;\n break;\n }\n }\n\n if (position < 0)\n return this;\n\n if (list.length === 1) {\n list.length = 0;\n delete this._events[type];\n } else {\n list.splice(position, 1);\n }\n\n if (this._events.removeListener)\n this.emit('removeListener', type, listener);\n }\n\n return this;\n};\n\nEventEmitter.prototype.removeAllListeners = function(type) {\n var key, listeners;\n\n if (!this._events)\n return this;\n\n // not listening for removeListener, no need to emit\n if (!this._events.removeListener) {\n if (arguments.length === 0)\n this._events = {};\n else if (this._events[type])\n delete this._events[type];\n return this;\n }\n\n // emit removeListener for all listeners on all events\n if (arguments.length === 0) {\n for (key in this._events) {\n if (key === 'removeListener') continue;\n this.removeAllListeners(key);\n }\n this.removeAllListeners('removeListener');\n this._events = {};\n return this;\n }\n\n listeners = this._events[type];\n\n if (isFunction(listeners)) {\n this.removeListener(type, listeners);\n } else if (listeners) {\n // LIFO order\n while (listeners.length)\n this.removeListener(type, listeners[listeners.length - 1]);\n }\n delete this._events[type];\n\n return this;\n};\n\nEventEmitter.prototype.listeners = function(type) {\n var ret;\n if (!this._events || !this._events[type])\n ret = [];\n else if (isFunction(this._events[type]))\n ret = [this._events[type]];\n else\n ret = this._events[type].slice();\n return ret;\n};\n\nEventEmitter.prototype.listenerCount = function(type) {\n if (this._events) {\n var evlistener = this._events[type];\n\n if (isFunction(evlistener))\n return 1;\n else if (evlistener)\n return evlistener.length;\n }\n return 0;\n};\n\nEventEmitter.listenerCount = function(emitter, type) {\n return emitter.listenerCount(type);\n};\n\nfunction isFunction(arg) {\n return typeof arg === 'function';\n}\n\nfunction isNumber(arg) {\n return typeof arg === 'number';\n}\n\nfunction isObject(arg) {\n return typeof arg === 'object' && arg !== null;\n}\n\nfunction isUndefined(arg) {\n return arg === void 0;\n}\n\n\n/***/ }),\n/* 6 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\nvar _get=function a(b,c,d){null===b&&(b=Function.prototype);var e=Object.getOwnPropertyDescriptor(b,c);if(e===void 0){var f=Object.getPrototypeOf(b);return null===f?void 0:a(f,c,d)}if('value'in e)return e.value;var g=e.get;return void 0===g?void 0:g.call(d)};var _createClass=function(){function a(a,b){for(var c=0;c=b)this.handler('move-cursor-'+('B'>=b?'y':'x'),('B'===b||'C'===b?1:-1)*e);else if('E'===b||'F'===b)this.handler('move-cursor-line',('E'===b?1:-1)*e);else if('G'===b)this.handler('set-cursor-x',e-1);else if('J'===b){var f=d.length?d[0]:2;2===f&&this.handler('clear')}else if('P'===b)this.handler('delete',e);else if('@'===b)this.handler('insert-blanks',e);else if('q'===b)this.handler('set-cursor-style',e);else if('m'===b){if(!d.length||0===d[0])return void this.handler('reset-style');var g=d[0];if(1===g)this.handler('add-attrs',1);else if(2===g)this.handler('add-attrs',2);else if(3===g)this.handler('add-attrs',4);else if(4===g)this.handler('add-attrs',8);else if(5===g||6===g)this.handler('add-attrs',16);else if(7===g)this.handler('add-attrs',-1);else if(9===g)this.handler('add-attrs',64);else if(20===g)this.handler('add-attrs',32);else if(30<=g&&37>=g)this.handler('set-color-fg',g%10);else if(40<=g&&47>=g)this.handler('set-color-bg',g%10);else if(39===g)this.handler('reset-color-fg');else if(49===g)this.handler('reset-color-bg');else if(90<=g&&98>=g)this.handler('set-color-fg',g%10+8);else if(100<=g&&108>=g)this.handler('set-color-bg',g%10+8);else if((38===g||48===g)&&5===d[1]){var h=255&(0|d[2]);38===g&&this.handler('set-color-fg',h),48===g&&this.handler('set-color-bg',h)}}else('h'===b||'l'===b)&&'?25'===c&&('h'===b?this.handler('show-cursor'):'l'===b&&this.handler('hide-cursor'))}}},{key:'write',value:function write(a){var b=!0;var c=!1;var d=void 0;try{for(var e,f=a.toString()[Symbol.iterator]();!(b=(e=f.next()).done);b=!0){var g=e.value;var h=g.codePointAt(0);27===h?this.currentSequence=1:1===this.currentSequence&&'['===g?(this.currentSequence=2,this.sequence+='['):this.currentSequence&&g.match(/[\\x40-\\x7e]/)?(this.parseSequence(this.sequence+g),this.currentSequence=0,this.sequence=''):1h?this.handler('_null'):3===h?this.handler('sigint'):6>=h?this.handler('_null'):7===h?this.handler('bell'):8===h?this.handler('back'):9===h?this.handler('tab'):10===h?this.handler('new-line'):13===h?this.handler('return'):21===h?this.handler('delete-line'):23===h?this.handler('delete-word'):this.handler('write',g)}}catch(a){c=!0,d=a}finally{try{!b&&f.return&&f.return()}finally{if(c)throw d}}this.joinChunks||this.reset()}}]),a}();var TERM_DEFAULT_STYLE=0;var TERM_MIN_DRAW_DELAY=10;var getRainbowColor=function(a){var c=Math.PI;var d=Math.floor;var e=Math.sin;var f=d(2.5*e(a)+2.5);var h=d(2.5*e(a+2/3*c)+2.5);var g=d(2.5*e(a+4/3*c)+2.5);return 16+36*f+6*h+g};var ScrollingTerminal=function(){function a(b){var c=this;_classCallCheck(this,a),this.width=80,this.height=25,this.termScreen=b,this.parser=new ANSIParser(function(){return c.handleParsed.apply(c,arguments)}),this.reset(),this._lastLoad=Date.now(),this.termScreen.load(this.serialize()),window.showPage()}var b=Math.min;var c=Math.max;return _createClass(a,[{key:'reset',value:function reset(){this.style=TERM_DEFAULT_STYLE,this.cursor={x:0,y:0,style:1,visible:!0},this.trackMouse=!1,this.theme=-1,this.rainbow=!1,this.parser.reset(),this.clear()}},{key:'clear',value:function clear(){this.screen=[];for(var a=0;a=this.height&&this.scroll()}},{key:'writeChar',value:function writeChar(a){this.screen[this.cursor.y*this.width+this.cursor.x]=[a,this.style],this.cursor.x++,this.cursor.x>=this.width&&(this.cursor.x=0,this.newLine())}},{key:'moveBack',value:function moveBack(){var a=0this.cursor.x&&(this.cursor.x=0=this.width&&(this.cursor.x=0,this.cursor.y++,this.cursor.y>=this.height&&this.scroll())}},{key:'deleteChar',value:function deleteChar(){this.moveBack(),this.screen.splice((this.cursor.y+1)*this.width,0,[' ',TERM_DEFAULT_STYLE]),this.screen.splice(this.cursor.y*this.width+this.cursor.x,1)}},{key:'deleteForward',value:function deleteForward(a){a=b(this.width,a);for(var c=0;cthis.cursor.x&&(this.cursor.x=0),0>this.cursor.y&&(this.cursor.y=0),this.cursor.x>this.width-1&&(this.cursor.x=this.width-1),this.cursor.y>this.height-1&&(this.cursor.y=this.height-1)}},{key:'handleParsed',value:function handleParsed(a){'write'===a?this.writeChar(1>=arguments.length?void 0:arguments[1]):'delete'===a?this.deleteForward(1>=arguments.length?void 0:arguments[1]):'insert-blanks'===a?this.insertBlanks(1>=arguments.length?void 0:arguments[1]):'clear'===a?this.clear():'bell'===a?this.termScreen.load('B'):'back'===a?this.moveBack():'new-line'===a?this.newLine():'return'===a?this.cursor.x=0:'set-cursor'===a?(this.cursor.x=2>=arguments.length?void 0:arguments[2],this.cursor.y=1>=arguments.length?void 0:arguments[1],this.clampCursor()):'move-cursor-y'===a?(this.cursor.y+=1>=arguments.length?void 0:arguments[1],this.clampCursor()):'move-cursor-x'===a?(this.cursor.x+=1>=arguments.length?void 0:arguments[1],this.clampCursor()):'move-cursor-line'===a?(this.cursor.x=0,this.cursor.y+=1>=arguments.length?void 0:arguments[1],this.clampCursor()):'set-cursor-x'===a?this.cursor.x=1>=arguments.length?void 0:arguments[1]:'set-cursor-style'===a?this.cursor.style=c(0,b(6,1>=arguments.length?void 0:arguments[1])):'reset-style'===a?this.style=TERM_DEFAULT_STYLE:'add-attrs'===a?this.style|=(1>=arguments.length?void 0:arguments[1])<<16:'set-color-fg'===a?this.style=16777216|4294967040&this.style|(1>=arguments.length?void 0:arguments[1]):'set-color-bg'===a?this.style=33554432|4294902015&this.style|(1>=arguments.length?void 0:arguments[1])<<8:'reset-color-fg'===a?this.style&=4294901504:'reset-color-bg'===a?this.style&=4294770943:'hide-cursor'===a?this.cursor.visible=!1:'show-cursor'===a&&(this.cursor.visible=!0)}},{key:'write',value:function write(a){this.parser.write(a),this.scheduleLoad()}},{key:'serialize',value:function serialize(){var a=String.fromCodePoint;var b='S';b+=a(this.height+1)+a(this.width+1),b+=a(this.cursor.y+1)+a(this.cursor.x+1);var c=+this.cursor.visible;c|=96*+this.trackMouse,c|=384,c|=this.cursor.style<<9,b+=a(c+1);var d=null;var e=0;var f=!0;var g=!1;var h=void 0;try{for(var i,j=this.screen[Symbol.iterator]();!(f=(i=j.next()).done);f=!0){var k=i.value;var l=k[1];if(this.rainbow){var m=e%this.width;var n=Math.floor(e/this.width);l=16777216|4294705152&l|getRainbowColor((m+n)/10+Date.now()/1e3),e++}if(l!==d){var o=255&l;var p=255&l>>8;var q=65535&l>>16;var r=o!=(255&d);var s=p!=(255&d>>8);var t=q!=(65535&d>>16);r&&s?b+='\\x03'+a((65535&l)+1):r?b+='\\x05'+a(o+1):s&&(b+='\\x06'+a(p+1)),t&&(b+='\\x04'+a(q+1)),d=l}b+=k[0]}}catch(a){g=!0,h=a}finally{try{!f&&j.return&&j.return()}finally{if(g)throw h}}return b}},{key:'scheduleLoad',value:function scheduleLoad(){var a=this;clearTimeout(this._scheduledLoad),this._lastLoadf;f++)c+=b[e][f]?'\\x1B[38;5;'+getRainbowColor((f+e)/10)+'m'+b[e][f]:' ';this.emit('write','\\r\\n\\x1B[?25l');var d=function(){a.emit('write',c.substr(0,80)),c=c.substr(80),c.length?setTimeout(d,50):(a.emit('write','\\r\\n\\x1B[?25h'),a.destroy())};d()}}]),b}(Process),\"local-echo\":function(a){function b(){return _classCallCheck(this,b),_possibleConstructorReturn(this,(b.__proto__||Object.getPrototypeOf(b)).apply(this,arguments))}return _inherits(b,a),_createClass(b,[{key:'run',value:function run(){for(var a=arguments.length,b=Array(a),c=0;cb[j].length&&(b[j]+=' '.repeat(79-b[j].length));this.emit('write','\\r\\n'.repeat(b.length+1)),this.emit('write','\\x1B[A'.repeat(b.length)),this.emit('write','\\x1B[?25l');var e=0;var f=0;var g=function(b,c){var d=Math.abs;var g=b-e;var h=c-f;a.emit('write','\\x1B['+d(g)+(0++d?3<=++e?(setTimeout(f,20),e=0):f():(g(0,b.length),a.emit('write','\\x1B[m\\x1B[?25h'),c())};f()})}},{key:'printText',value:function printText(){var a=0a;a++)this.emit('write','\\x1B['+(8>a?'3'+a:'9'+(a-8))+'m'),this.emit('write','foreground-color'[a]+' ');this.emit('write','\\r\\n ');for(var c=0;16>c;c++)this.emit('write','\\x1B['+(8>c?'4'+c:'10'+(c-8))+'m ');this.emit('write','\\x1B[m\\r\\n');for(var d=0;6>d;d++){this.emit('write',' ');for(var e=0;6>e;e++){for(var f=0;6>f;f++)this.emit('write','\\x1B[48;5;'+(16+36*d+6*e+f)+'m ');this.emit('write','\\x1B[m')}this.emit('write','\\r\\n')}this.emit('write',' ');for(var b=0;24>b;b++)this.emit('write','\\x1B[48;5;'+(232+b)+'m ');this.emit('write','\\x1B[m\\r\\n\\n'),this.destroy()}}]),b}(Process),ls:function(a){function b(){return _classCallCheck(this,b),_possibleConstructorReturn(this,(b.__proto__||Object.getPrototypeOf(b)).apply(this,arguments))}return _inherits(b,a),_createClass(b,[{key:'run',value:function run(){for(var a in this.emit('write','\\x1B[92mList of demo commands\\x1B[m\\r\\n'),demoshIndex)'string'!=typeof demoshIndex[a]&&this.emit('write',a+'\\r\\n');this.destroy()}}]),b}(Process),theme:function(a){function b(a){_classCallCheck(this,b);var c=_possibleConstructorReturn(this,(b.__proto__||Object.getPrototypeOf(b)).call(this));return c.shell=a,c}return _inherits(b,a),_createClass(b,[{key:'run',value:function run(){var a=0|+(0>=arguments.length?void 0:arguments[0]);var b=themes.length;return!arguments.length||!Number.isFinite(a)||0>a||a>=b?(this.emit('write','\\x1B[31mUsage: theme [0\\u2013'+(b-1)+']\\r\\n'),void this.destroy()):void(this.shell.terminal.theme=a,this.shell.terminal.termScreen.drawnScreenFG=[],this.emit('write',''),this.destroy())}}]),b}(Process),cursor:function(a){function b(){return _classCallCheck(this,b),_possibleConstructorReturn(this,(b.__proto__||Object.getPrototypeOf(b)).apply(this,arguments))}return _inherits(b,a),_createClass(b,[{key:'run',value:function run(){for(var a=arguments.length,b=Array(a),c=0;cb;b++){var c='';for(var d=0;79>d;d++)c+=a[Math.floor(a.length*Math.random())];this.randomData.push(c)}this.scrollOffset=0,this.render()}},{key:'render',value:function render(){this.emit('write','\\x1B[m\\x1B[2J\\x1B[1;1H'),this.emit('write','\\x1B[97m\\x1B[1mMouse Demo\\r\\n\\x1B[mMouse movement, clicking and scrolling!');for(var a=0;23>a;a++){var b=a+this.scrollOffset;b=(b%this.randomData.length+this.randomData.length)%this.randomData.length;var c=this.randomData[b];var d='\\x1B['+(3+a)+';1H\\x1B[38;5;239m';for(var e in c)this.highlighted[80*(a+2)+ +e]&&(d+='\\x1B[97m'),d+=c[e],this.highlighted[80*(a+2)+ +e]&&(d+='\\x1B[38;5;239m');this.emit('write',d)}this.mouse&&this.emit('write','\\x1B['+(this.mouse.y+1)+';'+(this.mouse.x+1)+'H')}},{key:'mouseMove',value:function mouseMove(a,b){this.mouse={x:a,y:b},this.render()}},{key:'mouseDown',value:function mouseDown(a,b,c){4===c?this.scrollOffset--:5===c?this.scrollOffset++:this.highlighted[80*b+a]=!this.highlighted[80*b+a],this.render()}},{key:'mouseUp',value:function mouseUp(){}},{key:'destroy',value:function destroy(){this.shell.terminal.write('\\x1B[2J\\x1B[1;1H'),this.shell.terminal.trackMouse=!1,demoData.mouseReceiver===this&&(demoData.mouseReceiver=null),_get(b.prototype.__proto__||Object.getPrototypeOf(b.prototype),'destroy',this).call(this)}}]),b}(Process),sudo:function(a){function b(a){_classCallCheck(this,b);var c=_possibleConstructorReturn(this,(b.__proto__||Object.getPrototypeOf(b)).call(this));return c.shell=a,c}return _inherits(b,a),_createClass(b,[{key:'run',value:function run(){var a=this;for(var d=arguments.length,e=Array(d),f=0;f\\x1B[m\\r\\n'),this.destroy();else if(4===e.length&&'make me a sandwich'===e.join(' ').toLowerCase()){var g='\\x1B[33m';var b='\\x1B[32m';var i='\\x1B[38;5;229m';var c='\\x1B[38;5;225m';this.emit('write',' '+g+'_.---._\\r\\n _.-~ ~-._\\r\\n _.-~ ~-._\\r\\n _.-~ ~---._\\r\\n _.-~ ~\\\\\\r\\n .-~ _.;\\r\\n :-._ _.-~ ./\\r\\n `-._~-._ _..__.-~ _.-~\\r\\n'+(' '+i+'/ '+g+'~-._~-._ / .__..--'+i+'~-'+b+'---._\\r\\n')+(i+' \\\\_____(_'+g+';-._\\\\. _.-~_/'+i+' ~)'+b+'.. . \\\\\\r\\n')+(b+' /(_____ '+g+'\\\\`--...--~_.-~'+i+'______..-+'+b+'_______)\\r\\n')+(b+' .(_________/'+g+'`--...--~/'+b+' _/ '+c+' '+g+'/\\\\\\r\\n')+(g+' /-._'+c+' \\\\_ '+b+'(___./_..-~'+c+'__.....'+g+'__..-~./\\r\\n')+(g+' `-._~-._'+c+' ~\\\\--------~ .-~'+g+'_..__.-~ _.-~\\r\\n')+(g+' ~-._~-._ '+c+'~---------` '+g+'/ .__..--~\\r\\n')+(g+' ~-._\\\\. _.-~_/\\r\\n')+(g+' \\\\`--...--~_.-~\\r\\n')+(g+' `--...--~'+'\\x1B[0m'+'\\r\\n')),this.destroy()}else{var h=e.shift();if(this.shell.index[h]){var j=this.shell.index[h];if(j instanceof Function){var k=new j(this);var l=function(b){return a.emit('write',b)};k.on('write',l),k.on('exit',function(){k.removeListener('write',l),a.destroy()}),k.run.apply(k,e)}else this.emit('write',j),this.destroy()}else this.emit('write','sudo: '+h+': command not found\\r\\n'),this.destroy()}}}]),b}(Process),make:function(a){function b(){return _classCallCheck(this,b),_possibleConstructorReturn(this,(b.__proto__||Object.getPrototypeOf(b)).apply(this,arguments))}return _inherits(b,a),_createClass(b,[{key:'run',value:function run(){for(var a=arguments.length,b=Array(a),c=0;c=arguments.length?void 0:arguments[1])+this.history[0].substr(this.cursorPos),this.cursorPos++;else if('back'===a)this.copyFromHistoryIndex(),this.history[0]=this.history[0].substr(0,this.cursorPos-1)+this.history[0].substr(this.cursorPos),this.cursorPos--,0>this.cursorPos&&(this.cursorPos=0);else if('tab'===a)console.warn('TAB not implemented');else if('move-cursor-x'===a)this.cursorPos=Math.max(0,Math.min(this.history[this.historyIndex].length,this.cursorPos+(1>=arguments.length?void 0:arguments[1])));else if('delete-line'===a)this.copyFromHistoryIndex(),this.history[0]='',this.cursorPos=0;else if('delete-word'===a){this.copyFromHistoryIndex();var b=this.history[0].substr(0,this.cursorPos).split(' ');b.pop(),this.history[0]=b.join(' ')+this.history[0].substr(this.cursorPos),this.cursorPos=b.join(' ').length}else'move-cursor-y'===a&&(this.historyIndex-=1>=arguments.length?void 0:arguments[1],0>this.historyIndex&&(this.historyIndex=0),this.historyIndex>=this.history.length&&(this.historyIndex=this.history.length-1),this.cursorPos=this.history[this.historyIndex].length);this.terminal.write(this.history[this.historyIndex]),this.terminal.write('\\b'.repeat(this.history[this.historyIndex].length)),this.terminal.moveForward(this.cursorPos),this.terminal.write(''),'return'===a&&(this.terminal.write('\\r\\n'),this.parse(this.history[this.historyIndex]))}},{key:'parse',value:function parse(a){'help'===a&&(a='info'),this.run(a)}},{key:'run',value:function run(a){var b=[''];var c=!1;var d=!0;var e=!1;var f=void 0;try{for(var g,h=a.trim()[Symbol.iterator]();!(d=(g=h.next()).done);d=!0){var j=g.value;c&&j!==c?b[b.length-1]+=j:c?c=!1:'\"'===j||'\\''===j?c=j:j.match(/\\s/)?b[b.length-1]&&b.push(''):b[b.length-1]+=j}}catch(a){e=!0,f=a}finally{try{!d&&h.return&&h.return()}finally{if(e)throw f}}var i=b.shift();i in this.index?this.spawn(i,b):(this.terminal.write('demosh: Unknown command: '+i+'\\r\\n'),this.prompt(!1))}},{key:'spawn',value:function spawn(a){var b=this;var c=1i||1114111=i?a.push(i):(i-=65536,d=(i>>10)+55296,e=i%1024+56320,a.push(d,e)),(f+1==g||a.length>16384)&&(h+=b.apply(null,a),a.length=0)}return h};a?a(String,'fromCodePoint',{value:d,configurable:!0,writable:!0}):String.fromCodePoint=d}();\n\n/***/ }),\n/* 9 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\nvar $=__webpack_require__(1);var _require=__webpack_require__(0),mk=_require.mk,qs=_require.qs,qsa=_require.qsa,cr=_require.cr;var modal=__webpack_require__(2);var notify=__webpack_require__(3);$.ready(function(){function a(){$('#menu').toggleClass('expanded')}$('#brand').on('click',a).on('keypress',cr(a)),$('.Row.checkbox').forEach(function(a){var b=a.querySelector('input');var c=a.querySelector('.box');$(c).toggleClass('checked',b.value);var d=function(){b.value=1-b.value,$(c).toggleClass('checked',b.value)};$(a).on('click',d).on('keypress',cr(d))}),$('.Box.mobcol,.Box.fold').forEach(function(a){var b=a.querySelector('h2');var c=function(){$(a).toggleClass('expanded')};$(b).on('click',c).on('keypress',cr(c))}),$('form').forEach(function(a){$(a).on('keypress',function(b){(10===b.keyCode||13===b.keyCode)&&b.ctrlKey&&a.submit()})}),setInterval(function(){$('.anim-dots').each(function(a){var b=$(a);var c=b.html()+'.';5===c.length&&(c='.'),b.html(c)})},1e3),$('input[type=number]').on('mousewheel',function(a){var b=Number.isFinite;var c=$(this);var d=+c.val();isNaN(d)&&(d=1);var e=+(c.attr('step')||1);var f=+c.attr('min');var g=+c.attr('max');if(0.',qs('#screen').appendChild(a),showPage()}},2e3):setTimeout(function(){showPage()},1)});\n\n/***/ }),\n/* 10 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\nvar $=__webpack_require__(1);var _require=__webpack_require__(0),mk=_require.mk,bool=_require.bool;var tr=__webpack_require__(11);(function(a){function b(a){return Math.round(100*(a.value/a.max))+'%'}function c(a,b,c){$('#sta_ssid').val(a),$('#sta_password').val(b),$('#sta-nw').toggleClass('hidden',0===a.length),$('#sta-nw-nil').toggleClass('hidden',0'+a.rssi_perc+'').htmlAppend('
'+i+'
').htmlAppend('
'+g[a.enc]+'
'),d.on('click',function(){var a=$(this);var b=a.data('ssid');var d='';+a.data('pwd')&&(d=window.prompt(tr('wifi.enter_passwd').replace(':ssid:',b)),!d)||($('#sta_password').val(d),$('#sta_ssid').val(b),c(b,d,''))}),b.appendChild(f),e[0].appendChild(b)}})}}function e(){window._demo?d(window._demo_aps,200):$.get('http://'+window._root+'/cfg/wifi/scan',d)}function f(a){setTimeout(e,a)}var g=['Open','WEP','WPA','WPA2','WPA/WPA2'];var h;a.init=function(a){$('.Row.range').forEach(function(a){var c=a.querySelector('input');var d=a.querySelector('.x-disp1');var e=a.querySelector('.x-disp2');var f=b(c);$(d).html(f),$(e).html(f),$(c).on('input',function(){f=b(c),$(d).html(f),$(e).html(f)})}),$('#forget-sta').on('click',function(){return c('','',''),!1}),c(a.sta_ssid,a.sta_password,a.sta_active_ip),h=a.sta_active_ssid},a.startScanning=function(){$('#ap-loader').removeClass('hidden'),$('#ap-scan').addClass('hidden'),$('#ap-loader .anim-dots').html('.'),e()}})(window.WiFi={});\n\n/***/ }),\n/* 11 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\nvar _tr={\"wifi.connected_ip_is\":\"Connected, IP is \",\"wifi.not_conn\":\"Not connected.\",\"wifi.enter_passwd\":\"Enter password for \\\":ssid:\\\"\"};module.exports=function(a){return _tr[a]||\"?\"+a+\"?\"};\n\n/***/ }),\n/* 12 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\nvar _require=__webpack_require__(0),qs=_require.qs,mk=_require.mk;var Notify=__webpack_require__(3);var TermScreen=__webpack_require__(13);var TermConnection=__webpack_require__(16);var TermInput=__webpack_require__(17);var TermUpload=__webpack_require__(18);var initSoftKeyboard=__webpack_require__(19);var attachDebugScreen=__webpack_require__(20);module.exports=function(a){var b=new TermScreen;var c=new TermConnection(b);var d=TermInput(c,b);var e=TermUpload(c,d,b);b.input=d,d.termUpload=e;var f=-1;c.on('open',function(){f=setTimeout(function(){b.window.statusScreen={title:'Connecting',loading:!0}},250)}),c.on('connect',function(){clearTimeout(f),b.window.statusScreen={title:'Waiting for content',loading:!0}}),c.on('load',function(){b.window.statusScreen&&(b.window.statusScreen=null)}),c.on('disconnect',function(){clearTimeout(f),b.window.statusScreen={title:'Disconnected'},b.screen=[],b.screenFG=[],b.screenBG=[],b.screenAttrs=[]}),c.on('silence',function(){b.window.statusScreen={title:'Waiting for server',loading:!0}}),c.on('ping-success',function(){b.window.statusScreen={title:'Re-connecting',loading:!0}}),c.init(),d.init(a),e.init(),Notify.init(),window.onerror=function(a,b,c,d){return Notify.show('JS ERROR!
'+a+'
at '+b+':'+c+':'+d,1e4,!0),!1},qs('#screen').appendChild(b.canvas),b.load(a.labels,a),initSoftKeyboard(b,d),attachDebugScreen&&attachDebugScreen(b);var g=!1;var h=!1;var i=function(){g?(b.window.fitIntoWidth=window.screen.width,b.window.fitIntoHeight=window.screen.height):(b.window.fitIntoWidth=h?window.innerWidth-20:0,b.window.fitIntoHeight=h?window.innerHeight:0)};i(),window.addEventListener('resize',i);var j=function(){h=!h;var a=qs('#resize-button-icon');h?(a.classList.remove('icn-resize-small'),a.classList.add('icn-resize-full')):(a.classList.remove('icn-resize-full'),a.classList.add('icn-resize-small')),i()};if(qs('#term-fit-screen').addEventListener('click',function(){return j(),!1}),window.Element.prototype.requestFullscreen||window.Element.prototype.webkitRequestFullscreen){setInterval(function checkForFullscreen(){g&&(window.innerWidth!==window.screen.width||window.innerHeight!==window.screen.height)&&(g=!1,i())},500);var k=mk('a');k.href='#',k.addEventListener('click',function(a){a.preventDefault(),g=!0,i(),b.updateSize(),b.canvas.requestFullscreen?b.canvas.requestFullscreen():b.canvas.webkitRequestFullscreen()});var l=mk('i');l.classList.add('icn-resize-full'),k.appendChild(l);var m=mk('span');m.textContent='Fullscreen',k.appendChild(m),qs('#term-nav').insertBefore(k,qs('#term-nav').firstChild)}window.termScreen=b,window.conn=c,window.input=d,window.termUpl=e};\n\n/***/ }),\n/* 13 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\nvar _createClass=function(){function a(a,b){for(var c=0;cc[1]||b[1]===c[1]&&b[0]>c[0]){var d=[c,b];b=d[0],c=d[1]}return{start:b,end:c}}},{key:'isInSelection',value:function isInSelection(a,b){var c=this.getNormalizedSelection(),d=c.start,e=c.end;var f=d[0]<=a;var g=aDate.now()-50)){if(this._lastBeep=Date.now(),!this._convolver){this._convolver=b.createConvolver();var j=0.8*b.sampleRate;var k=b.createBuffer(2,j,b.sampleRate);for(var l=0;l>9;0>1;var q=!(1&o);0==p?this.screen.cursor.style='block':1==p?this.screen.cursor.style='line':2==p&&(this.screen.cursor.style='bar'),this.screen.cursor.blinking!==q&&(this.screen.cursor.blinking=q,this.screen.renderer.resetCursorBlink()),this.screen.input.setMouseMode(m,n),this.screen.selection.selectable=!m&&!n,$(this.screen.canvas).toggleClass('selectable',this.screen.selection.selectable),this.screen.mouseMode={clicks:m,movement:n};$('.x-term-conf-btn').toggleClass('hidden',!!!(256&l)),$('#action-buttons').toggleClass('hidden',!!!(128&l)),this.screen.bracketedPaste=!!(8192&l),this.screen.reverseVideo=!!(16384&l);var r=7;var s=0;var t=0;var u=0;var v=' ';var w=this.screen.window.width*this.screen.window.height;g&&(this.screen.updateSize(),this.screen.blinkingCellCount=0,this.screen.screen=Array(w).fill(' '),this.screen.screenFG=Array(w).fill(' '),this.screen.screenBG=Array(w).fill(' '),this.screen.screenAttrs=Array(w).fill(0));var x=16;for(var z=function(){var a=t;var c=256&t;var d=512&t;0!=(a&x)&&(' '==v&&0==(a&200)||r==s&&c&&d)&&(a^=x),(b.screen.screenAttrs[u]&x)!=(a&x)&&(a&x?b.screen.blinkingCellCount++:b.screen.blinkingCellCount--),b.screen.screen[u]=v,b.screen.screenFG[u]=r,b.screen.screenBG[u]=s,b.screen.screenAttrs[u]=a};cw));E++);break;case SEQ_SET_COLORS:C=d[c++].codePointAt(0)-1,r=255&C,s=255&C>>8;break;case SEQ_SET_ATTRS:C=d[c++].codePointAt(0)-1,t=65535&C;break;case SEQ_SET_FG:C=d[c++].codePointAt(0)-1,r=255&C;break;case SEQ_SET_BG:C=d[c++].codePointAt(0)-1,s=255&C;break;default:32>B&&(A='\\uFFFD'),v=A,z(),u++;}}this.screen.window.debug&&console.log('Blinky cells: '+this.screen.blinkingCellCount),this.screen.renderer.scheduleDraw('load',16),this.screen.emit('load')}},{key:'loadLabels',value:function loadLabels(a){var b=a.split('\\x01');var c=b[0];qs('#screen-title').textContent=c,0===c.length&&(c='Terminal'),qs('title').textContent=c+' :: ESPTerm',$('#action-buttons button').forEach(function(a,c){var d=b[c+1].trim();a.innerHTML=d?$.htmlEscape(d):' ',a.style.opacity=d?1:0.2})}},{key:'load',value:function load(a){var b=1a&&a in this.palette)return this.palette[a];if(-1===a)return SELECTION_FG;if(-2===a)return SELECTION_BG;if(15a)return this.colorTable256[a];if(255>16;var c=255&a>>8;var d=255&a;return'rgb('+b+', '+c+', '+d+')'}return 0==Date.now()/1e3%2?'#f0f':'#0f0'}},{key:'resetCursorBlink',value:function resetCursorBlink(){var a=this;this.cursorBlinkOn=!0,clearInterval(this.cursorBlinkInterval),this.cursorBlinkInterval=setInterval(function(){a.cursorBlinkOn=!a.screen.cursor.blinking||!a.cursorBlinkOn,a.screen.cursor.blinking&&a.scheduleDraw('cursor-blink')},500)}},{key:'resetBlink',value:function resetBlink(){var a=this;this.blinkStyleOn=!0,clearInterval(this.blinkInterval);var b=0;this.blinkInterval=setInterval(function(){0>=a.screen.blinkingCellCount||(b++,4<=b&&a.blinkStyleOn?(a.blinkStyleOn=!1,b=0,a.scheduleDraw('blink-style')):1<=b&&!a.blinkStyleOn&&(a.blinkStyleOn=!0,b=0,a.scheduleDraw('blink-style')))},200)}},{key:'drawBackground',value:function drawBackground(a){var b=a.x,c=a.y,d=a.cellWidth,e=a.cellHeight,f=a.bg;var g=this.ctx;g.fillStyle=this.getColor(f),g.clearRect(b*d,c*e,d,e),g.fillRect(b*d,c*e,d,e)}},{key:'drawCharacter',value:function drawCharacter(b){var c=Math.round;var d=b.x,e=b.y,f=b.charSize,g=b.cellWidth,h=b.cellHeight,i=b.text,j=b.fg,k=b.attrs;if(i){var l=this.ctx;var m=!1;var n=!1;var o=!1;2&k&&(l.globalAlpha=0.5),8&k&&(m=!0),32&k&&(i=a.alphaToFraktur(i)),64&k&&(n=!0),128&k&&(o=!0),l.fillStyle=this.getColor(j);var p=i.codePointAt(0);if(9600<=p&&9631>=p){l.beginPath();var q=d*g;var r=e*h;var s=g;var t=h;var u=g/2;var v=h/2;if(9600===p)l.rect(q,r,s,v);else if(9608>=p){var w=(1-(p-9600)/8)*t;l.rect(q,r+w,s,t-w)}else if(9615>=p){l.rect(q,r,s-(p-9608)/8*s,t)}else if(9616===p)l.rect(q+u,r,u,t);else if(9619>=p){var x,y,z;9617===p?(x=s/4,y=t/10,z=1):9618===p?(x=s/6,y=s/10,z=1):9619===p&&(x=s/4,y=s/7,z=2);var A=!1;for(var B=0;B=k+0.05};var s=function(a){var c=n.get(a)||q.get(a)||!1;var d=b.screen.screen[a];var e=r(d);var f=e?2:1;if(!c){var l=!1;var g=!0;var h=!1;var i=void 0;try{for(var j,k=b.getAdjacentCells(a,f)[Symbol.iterator]();!(g=(j=k.next()).done);g=!0){var m=j.value;if(n.get(m)&&(2>b.screen.window.graphics||e||r(b.screen.screen[m]))){l=!0;break}}}catch(a){h=!0,i=a}finally{try{!g&&k.return&&k.return()}finally{if(h)throw i}}l&&(c=!0)}q.set(a,c)};var t=!0;var u=!1;var v=void 0;try{for(var w,z=n.keys()[Symbol.iterator]();!(t=(w=z.next()).done);t=!0){var x=w.value;s(x)}}catch(a){u=!0,v=a}finally{try{!t&&z.return&&z.return()}finally{if(u)throw v}}if(1<=this.screen.window.graphics){var y=this.screen.window.debug&&this.screen._debug;c.save(),c.beginPath();for(var ta=0;tam;m++){b.rotate(Math.PI/6);var i=(12*l-m)%12;b.globalAlpha=Math.max(0.2,1-i/3),b.beginPath(),b.moveTo(0,15),b.lineTo(0,30),b.stroke()}b.restore()}}},{key:'startDrawLoop',value:function startDrawLoop(){if(!this._drawTimerThread){var a=Math.random().toString(36);this._drawTimerThread=a,this.drawTimerLoop(a)}}},{key:'stopDrawLoop',value:function stopDrawLoop(){this._drawTimerThread=null}},{key:'drawTimerLoop',value:function drawTimerLoop(a){var b=this;a&&a===this._drawTimerThread&&(window.requestAnimationFrame(function(){return b.drawTimerLoop(a)}),this.draw('draw-loop'))}},{key:'palette',get:function get(){return this._palette||themes[0]},set:function set(a){this._palette!==a&&(this._palette=a,this.resetDrawn(),this.scheduleDraw('palette'))}}],[{key:'alphaToFraktur',value:function alphaToFraktur(a){var b=String.fromCodePoint;return'a'<=a&&'z'>=a?a=b(119997+a.charCodeAt(0)):'A'<=a&&'Z'>=a&&(a=frakturExceptions[a]||b(120003+a.charCodeAt(0))),a}}]),a}();\n\n/***/ }),\n/* 16 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\nvar _createClass=function(){function a(a,b){for(var c=0;ca.code&&console.error('Bad code from socket!'),clearTimeout(this.reconnTimeout),this.reconnTimeout=setTimeout(function(){return b.init()},2e3),this.emit('disconnect',a.code))}},{key:'onWSMessage',value:function onWSMessage(a){var b=this;try{switch(a.data.charAt(0)){case'.':break;case'-':this.xoff=!0,this.autoXoffTimeout=setTimeout(function(){b.xoff=!1},250);break;case'+':this.xoff=!1,clearTimeout(this.autoXoffTimeout);break;default:this.emit('load'),this.screen.load(a.data),this.pageShown||(window.showPage(),this.pageShown=!0);}this.heartbeat()}catch(a){console.error(a)}}},{key:'canSend',value:function canSend(){return!this.xoff}},{key:'send',value:function send(a){return window._demo?('undefined'==typeof window.demoInterface?console.log('TX: '+JSON.stringify(a)):demo.input(a),!0):this.xoff?(console.log('Can\\'t send, flood control.'),!1):!!this.ws&&(1===this.ws.readyState?('string'!=typeof a&&(a=JSON.stringify(a)),this.ws.send(a),!0):(console.error('Socket not ready'),!1))}},{key:'closeSocket',value:function closeSocket(){this.ws&&(this.forceClosing=!0,this.ws.close(),this.ws=null)}},{key:'init',value:function init(){var a=this;return window._demo?void('undefined'==typeof window.demoInterface?window.alert('Demoing non-demo build!'):demo.init(this.screen)):void(clearTimeout(this.reconnTimeout),clearTimeout(this.heartbeatTimeout),this.closeSocket(),this.ws=new window.WebSocket('ws://'+window._root+'/term/update.ws'),this.ws.addEventListener('open',function(){return a.onWSOpen.apply(a,arguments)}),this.ws.addEventListener('close',function(){return a.onWSClose.apply(a,arguments)}),this.ws.addEventListener('message',function(){return a.onWSMessage.apply(a,arguments)}),console.log('Opening socket.'),this.heartbeat(),this.emit('open'))}},{key:'heartbeat',value:function heartbeat(){var a=this;clearTimeout(this.heartbeatTimeout),this.heartbeatTimeout=setTimeout(function(){return a.onHeartbeatFail()},2e3)}},{key:'onHeartbeatFail',value:function onHeartbeatFail(){var a=this;this.closeSocket(),this.emit('silence'),console.error('Heartbeat lost, probing server...'),clearInterval(this.pingInterval),this.pingInterval=setInterval(function(){console.log('> ping'),a.emit('ping'),$.get('http://'+window._root+'/system/ping',function(b,c){200===c?(clearInterval(a.pingInterval),console.info('Server ready, opening socket\\u2026'),a.emit('ping-success'),a.init()):a.emit('ping-fail',c)},{timeout:100,loader:!1})},1e3)}}]),b}(EventEmitter);\n\n/***/ }),\n/* 17 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\nvar $=__webpack_require__(1);var _require=__webpack_require__(0),encode2B=_require.encode2B;module.exports=function(a,b){function c(b){return a.send('s'+b)}function d(b){a.send('b'+g(b))}function e(a){var d=a.allFn;window.addEventListener('keypress',function(a){if(p()&&!(a.ctrlKey||a.metaKey)){var b='';a.key&&1===a.key.length?b=a.key:a.which&&229!==a.which&&(b=String.fromCodePoint(a.which)),0',63:'?',64:'@',91:'Meta',92:'Meta',93:'ContextMenu',106:'Numpad*',107:'Numpad+',109:'Numpad-',110:'Numpad.',111:'Numpad/',144:'NumLock',145:'ScrollLock',160:'^',161:'!',162:'\"',163:'#',164:'$',165:'%',166:'&',167:'_',168:'(',169:')',170:'*',171:'+',172:'|',173:'-',174:'{',175:'}',176:'~',186:';',187:'=',188:'Numpad,',189:'-',190:'Numpad,',192:'`',194:'Numpad,',219:'[',220:'\\\\',221:']',222:'\\'',224:'Meta'};for(var w=48;57>=w;w++)j[w]=g(w);for(var i=65;90>=i;i++)j[i]=g(i);for(var x=112;131>=x;x++)j[x]='F'+(x-112+1);for(var y=96;105>=y;y++)j[y]='Numpad'+(y-96);var k={np_alt:!1,cu_alt:!1,fn_alt:!1,mt_click:!1,mt_move:!1,no_keys:!1,crlf_mode:!1,all_fn:!1};var l=function(a,b){return k.fn_alt?a:b};var m=function(a,b){return k.cu_alt?a:b};var n=function(a,b){return k.np_alt?a:b};var o={Backspace:'\\b',Tab:'\\t',Enter:function Enter(){return k.crlf_mode?'\\r\\n':'\\r'},\"Control+Enter\":'\\n',Escape:'\\x1B',ArrowUp:function ArrowUp(){return m('\\x1BOA','\\x1B[A')},ArrowDown:function ArrowDown(){return m('\\x1BOB','\\x1B[B')},ArrowRight:function ArrowRight(){return m('\\x1BOC','\\x1B[C')},ArrowLeft:function ArrowLeft(){return m('\\x1BOD','\\x1B[D')},Home:function Home(){return m('\\x1BOH',l('\\x1B[H','\\x1B[1~'))},Insert:'\\x1B[2~',Delete:'\\x1B[3~',End:function End(){return m('\\x1BOF',l('\\x1B[F','\\x1B[4~'))},PageUp:'\\x1B[5~',PageDown:'\\x1B[6~',F1:function F1(){return l('\\x1BOP','\\x1B[11~')},F2:function F2(){return l('\\x1BOQ','\\x1B[12~')},F3:function F3(){return l('\\x1BOR','\\x1B[13~')},F4:function F4(){return l('\\x1BOS','\\x1B[14~')},F5:'\\x1B[15~',F6:'\\x1B[17~',F7:'\\x1B[18~',F8:'\\x1B[19~',F9:'\\x1B[20~',F10:'\\x1B[21~',F11:'\\x1B[23~',F12:'\\x1B[24~',\"Shift+F1\":function ShiftF1(){return l('\\x1BO1;2P','\\x1B[25~')},\"Shift+F2\":function ShiftF2(){return l('\\x1BO1;2Q','\\x1B[26~')},\"Shift+F3\":function ShiftF3(){return l('\\x1BO1;2R','\\x1B[28~')},\"Shift+F4\":function ShiftF4(){return l('\\x1BO1;2S','\\x1B[29~')},\"Shift+F5\":function ShiftF5(){return l('\\x1B[15;2~','\\x1B[31~')},\"Shift+F6\":function ShiftF6(){return l('\\x1B[17;2~','\\x1B[32~')},\"Shift+F7\":function ShiftF7(){return l('\\x1B[18;2~','\\x1B[33~')},\"Shift+F8\":function ShiftF8(){return l('\\x1B[19;2~','\\x1B[34~')},\"Shift+F9\":function ShiftF9(){return l('\\x1B[20;2~','\\x1B[35~')},\"Shift+F10\":function ShiftF10(){return l('\\x1B[21;2~','\\x1B[36~')},\"Shift+F11\":function ShiftF11(){return l('\\x1B[22;2~','\\x1B[37~')},\"Shift+F12\":function ShiftF12(){return l('\\x1B[23;2~','\\x1B[38~')},Numpad0:function Numpad0(){return n('\\x1BOp','0')},Numpad1:function Numpad1(){return n('\\x1BOq','1')},Numpad2:function Numpad2(){return n('\\x1BOr','2')},Numpad3:function Numpad3(){return n('\\x1BOs','3')},Numpad4:function Numpad4(){return n('\\x1BOt','4')},Numpad5:function Numpad5(){return n('\\x1BOu','5')},Numpad6:function Numpad6(){return n('\\x1BOv','6')},Numpad7:function Numpad7(){return n('\\x1BOw','7')},Numpad8:function Numpad8(){return n('\\x1BOx','8')},Numpad9:function Numpad9(){return n('\\x1BOy','9')},\"Numpad*\":function Numpad(){return n('\\x1BOR','*')},\"Numpad+\":function Numpad(){return n('\\x1BOl','+')},\"Numpad-\":function Numpad(){return n('\\x1BOS','-')},\"Numpad.\":function Numpad(){return n('\\x1BOn','.')},\"Numpad/\":function Numpad(){return n('\\x1BOQ','/')},\"Control+]\":'\\x1B',\"Control+\\\\\":'\\x1C',\"Control+[\":'\\x1D',\"Control+^\":'\\x1E',\"Control+_\":'\\x1F',\"Control+ArrowLeft\":'\\x1F[1;5D',\"Control+ArrowRight\":'\\x1F[1;5C',\"Control+ArrowUp\":'\\x1F[1;5A',\"Control+ArrowDown\":'\\x1F[1;5B',\"Control+Home\":'\\x1F[1;5H',\"Control+End\":'\\x1F[1;5F',\"Shift+ArrowLeft\":'\\x1F[1;2D',\"Shift+ArrowRight\":'\\x1F[1;2C',\"Shift+ArrowUp\":'\\x1F[1;2A',\"Shift+ArrowDown\":'\\x1F[1;2B',\"Shift+Home\":'\\x1F[1;2H',\"Shift+End\":'\\x1F[1;2F',\"Alt+ArrowLeft\":'\\x1Bb',\"Alt+ArrowRight\":'\\x1Bf',\"Meta+ArrowLeft\":'\\x01',\"Meta+ArrowRight\":'\\x05',\"Alt+Backspace\":'\\x17',\"Meta+Backspace\":'\\x15',\"Control+Shift+C\":function ControlShiftC(){b.copySelectionToClipboard()},\"Control+Insert\":function ControlInsert(){b.copySelectionToClipboard()},\"Control+F12\":function ControlF12(){b.window.debug^=1}};for(var z=1;26>=z;z++)o['Control+'+g(64+z)]=g(z);var p=function(){return!k.no_keys&&!(document.activeElement instanceof window.HTMLTextAreaElement)};var q=['F5','F11','F12','Shift+F5'];var r=function(a){if(p()&&!k.no_keys){var b=[];a.altKey&&b.push('Alt'),a.ctrlKey&&b.push('Control'),a.metaKey&&b.push('Meta'),a.shiftKey&&b.push('Shift');var d=j[a.which]||a.key;if(!((a.ctrlKey||a.metaKey)&&'V'===d)){var e=null;for(var f in o){var g=f.split('+');var h=g.pop();if(h===d&&g.sort().join()===b.join()){if(q.includes(f)&&!k.all_fn)continue;e=o[f];break}}e&&(e instanceof Function&&(e=e()),a.preventDefault(),'string'==typeof e&&c(e))}}};var s=0;var t=0;var u=0;var v=0;return window.addEventListener('keydown',function(a){a.ctrlKey&&(v|=1),a.shiftKey&&(v|=2),a.altKey&&(v|=4),a.metaKey&&(v|=8)}),window.addEventListener('keyup',function(a){v=0,a.ctrlKey&&(v|=1),a.shiftKey&&(v|=2),a.altKey&&(v|=4),a.metaKey&&(v|=8)}),h={init:function(a){e(a),$('#action-buttons button').forEach(function(a){a.addEventListener('click',function(){d(+this.dataset.n)})}),window.addEventListener('mousedown',function(a){0===a.button&&(s=1),1===a.button&&(t=1),2===a.button&&(u=1)}),window.addEventListener('mouseup',function(a){0===a.button&&(s=0),1===a.button&&(t=0),2===a.button&&(u=0)})},sendString:c,setAlts:function setAlts(a,b,c,d){(k.cu_alt!==a||k.np_alt!==b||k.fn_alt!==c||k.crlf_mode!==d)&&(k.cu_alt=a,k.np_alt=b,k.fn_alt=c,k.crlf_mode=d)},setMouseMode:function setMouseMode(a,b){k.mt_click=a,k.mt_move=b},onMouseMove:function onMouseMove(c,d){if(k.mt_move){var e=s?1:t?2:u?3:0;var b=f();a.send('m'+encode2B(d)+encode2B(c)+encode2B(e)+encode2B(b))}},onMouseDown:function onMouseDown(c,d,e){if(k.mt_click&&!(3e)){var b=f();a.send('p'+encode2B(d)+encode2B(c)+encode2B(e)+encode2B(b))}},onMouseUp:function onMouseUp(c,d,e){if(k.mt_click&&!(3e)){var b=f();a.send('r'+encode2B(d)+encode2B(c)+encode2B(e)+encode2B(b))}},onMouseWheel:function onMouseWheel(c,d,e){if(k.mt_click){var g=f();var h=0>e?4:5;a.send('p'+encode2B(d)+encode2B(c)+encode2B(h)+encode2B(g))}},blockKeys:function blockKeys(a){k.no_keys=a},handleKeyDown:r},h};\n\n/***/ }),\n/* 18 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\nvar $=__webpack_require__(1);var _require=__webpack_require__(0),qs=_require.qs;var modal=__webpack_require__(2);module.exports=function(a,b,c){function d(){f('Ready...'),modal.show('#fu_modal',e),$('#fu_form').toggleClass('busy',!1),b.blockKeys(!0)}function e(){console.log('Upload modal closed.'),clearTimeout(m),l=0,b.blockKeys(!1)}function f(a){qs('#fu_prog').textContent=a}function g(){var a=qs('#fu_text').value;return a.length?void(k=a.split('\\n'),l=0,q=0,n=qs('#fu_delay').value,0>n&&(n=0,qs('#fu_delay').value=n),o={CR:'\\r',LF:'\\n',CRLF:'\\r\\n'}[qs('#fu_crlf').value],$('#fu_form').toggleClass('busy',!0),f('Starting...'),h()):void j()}function h(){if($('#fu_modal').hasClass('visible')){if(!a.canSend())return void(m=setTimeout(h,1));0===q&&(p='',0===l&&c.bracketedPaste&&(p='\\x1B[200~'),p+=k[l++]+o,l===k.length&&c.bracketedPaste&&(p+='\\x1B[201~'));var d;if(p.length-q<=r?(d=p.substr(q,r),q=0):(d=p.substr(q,r),q+=r),!b.sendString(d))return void f('FAILED!');var e=Math.round(1e3*(l/k.length))/10;f(l+' / '+k.length+' ('+e+'%)'),k.length>l||0g.length?a.startsWith(g)?b.sendString(a.substr(g.length)):c=!0:a.lengthg.length&&(g=('0000'+g).substr(-4)),g='U+'+g,p.textContent='Cursor cell ('+b+'): '+g+' FG: '+c+' BG: '+d+' Attrs: '+f.toString(2)}})};\n\n/***/ })\n/******/ ]);\n\n\n// WEBPACK FOOTER //\n// app.310033b.js"," \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 7);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 21d3956fd434cbda121b","/** Make a node */\nexports.mk = function mk (e) {\n return document.createElement(e)\n}\n\n/** Find one by query */\nexports.qs = function qs (s) {\n return document.querySelector(s)\n}\n\n/** Find all by query */\nexports.qsa = function qsa (s) {\n return document.querySelectorAll(s)\n}\n\n/**\n * Filter 'spacebar' and 'return' from keypress handler,\n * and when they're pressed, fire the callback.\n * use $(...).on('keypress', cr(handler))\n */\nexports.cr = function cr (hdl) {\n return function (e) {\n if (e.which === 10 || e.which === 13 || e.which === 32) {\n hdl()\n }\n }\n}\n\n/** Convert any to bool safely */\nexports.bool = function bool (x) {\n return (x === 1 || x === '1' || x === true || x === 'true')\n}\n\n/** Decode number from 2B encoding */\nexports.parse2B = function parse2B (s, i = 0) {\n return (s.charCodeAt(i++) - 1) + (s.charCodeAt(i) - 1) * 127\n}\n\n/** Decode number from 3B encoding */\nexports.parse3B = function parse3B (s, i = 0) {\n return (s.charCodeAt(i) - 1) + (s.charCodeAt(i + 1) - 1) * 127 + (s.charCodeAt(i + 2) - 1) * 127 * 127\n}\n\n/** Encode using 2B encoding, returns string. */\nexports.encode2B = function encode2B (n) {\n let lsb, msb\n lsb = (n % 127)\n n = ((n - lsb) / 127)\n lsb += 1\n msb = (n + 1)\n return String.fromCharCode(lsb) + String.fromCharCode(msb)\n}\n\n/** Encode using 3B encoding, returns string. */\nexports.encode3B = function encode3B (n) {\n let lsb, msb, xsb\n lsb = (n % 127)\n n = (n - lsb) / 127\n lsb += 1\n msb = (n % 127)\n n = (n - msb) / 127\n msb += 1\n xsb = (n + 1)\n return String.fromCharCode(lsb) + String.fromCharCode(msb) + String.fromCharCode(xsb)\n}\n\n\n\n// WEBPACK FOOTER //\n// ./js/utils.js","/*!chibi 3.0.7, Copyright 2012-2016 Kyle Barrow, released under MIT license */\n\n// MODIFIED VERSION.\n(function () {\n\t'use strict';\n\n\tvar readyfn = [],\n\t\tloadedfn = [],\n\t\tdomready = false,\n\t\tpageloaded = false,\n\t\td = document,\n\t\tw = window;\n\n\t// Fire any function calls on ready event\n\tfunction fireReady() {\n\t\tvar i;\n\t\tdomready = true;\n\t\tfor (i = 0; i < readyfn.length; i += 1) {\n\t\t\treadyfn[i]();\n\t\t}\n\t\treadyfn = [];\n\t}\n\n\t// Fire any function calls on loaded event\n\tfunction fireLoaded() {\n\t\tvar i;\n\t\tpageloaded = true;\n\t\t// For browsers with no DOM loaded support\n\t\tif (!domready) {\n\t\t\tfireReady();\n\t\t}\n\t\tfor (i = 0; i < loadedfn.length; i += 1) {\n\t\t\tloadedfn[i]();\n\t\t}\n\t\tloadedfn = [];\n\t}\n\n\t// Check DOM ready, page loaded\n\tif (d.addEventListener) {\n\t\t// Standards\n\t\td.addEventListener('DOMContentLoaded', fireReady, false);\n\t\tw.addEventListener('load', fireLoaded, false);\n\t} else if (d.attachEvent) {\n\t\t// IE\n\t\td.attachEvent('onreadystatechange', fireReady);\n\t\t// IE < 9\n\t\tw.attachEvent('onload', fireLoaded);\n\t} else {\n\t\t// Anything else\n\t\tw.onload = fireLoaded;\n\t}\n\n\t// Utility functions\n\n\t// Loop through node array\n\tfunction nodeLoop(fn, nodes) {\n\t\tvar i;\n\t\t// Good idea to walk up the DOM\n\t\tfor (i = nodes.length - 1; i >= 0; i -= 1) {\n\t\t\tfn(nodes[i]);\n\t\t}\n\t}\n\n\t// Convert to camel case\n\tfunction cssCamel(property) {\n\t\treturn property.replace(/-\\w/g, function (result) {\n\t\t\treturn result.charAt(1).toUpperCase();\n\t\t});\n\t}\n\n\t// Get computed style\n\tfunction computeStyle(elm, property) {\n\t\t// IE, everything else or null\n\t\treturn (elm.currentStyle) ? elm.currentStyle[cssCamel(property)] : (w.getComputedStyle) ? w.getComputedStyle(elm, null).getPropertyValue(property) : null;\n\n\t}\n\n\t// Returns URI encoded query string pair\n\tfunction queryPair(name, value) {\n\t\treturn encodeURIComponent(name).replace(/%20/g, '+') + '=' + encodeURIComponent(value).replace(/%20/g, '+');\n\t}\n\n\t// Set CSS, important to wrap in try to prevent error thown on unsupported property\n\tfunction setCss(elm, property, value) {\n\t\ttry {\n\t\t\telm.style[cssCamel(property)] = value;\n\t\t} catch (e) {\n\t\t}\n\t}\n\n\t// Show CSS\n\tfunction showCss(elm) {\n\t\telm.style.display = '';\n\t\t// For elements still hidden by style block\n\t\tif (computeStyle(elm, 'display') === 'none') {\n\t\t\telm.style.display = 'block';\n\t\t}\n\t}\n\n\t// Serialize form & JSON values\n\tfunction serializeData(nodes) {\n\t\tvar querystring = '', subelm, i, j;\n\t\tif (nodes.constructor === Object) { // Serialize JSON data\n\t\t\tfor (subelm in nodes) {\n\t\t\t\tif (nodes.hasOwnProperty(subelm)) {\n\t\t\t\t\tif (nodes[subelm].constructor === Array) {\n\t\t\t\t\t\tfor (i = 0; i < nodes[subelm].length; i += 1) {\n\t\t\t\t\t\t\tquerystring += '&' + queryPair(subelm, nodes[subelm][i]);\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tquerystring += '&' + queryPair(subelm, nodes[subelm]);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t} else { // Serialize node data\n\t\t\tnodeLoop(function (elm) {\n\t\t\t\tif (elm.nodeName === 'FORM') {\n\t\t\t\t\tfor (i = 0; i < elm.elements.length; i += 1) {\n\t\t\t\t\t\tsubelm = elm.elements[i];\n\n\t\t\t\t\t\tif (!subelm.disabled) {\n\t\t\t\t\t\t\tswitch (subelm.type) {\n\t\t\t\t\t\t\t\t// Ignore buttons, unsupported XHR 1 form fields\n\t\t\t\t\t\t\t\tcase 'button':\n\t\t\t\t\t\t\t\tcase 'image':\n\t\t\t\t\t\t\t\tcase 'file':\n\t\t\t\t\t\t\t\tcase 'submit':\n\t\t\t\t\t\t\t\tcase 'reset':\n\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\tcase 'select-one':\n\t\t\t\t\t\t\t\t\tif (subelm.length > 0) {\n\t\t\t\t\t\t\t\t\t\tquerystring += '&' + queryPair(subelm.name, subelm.value);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\tcase 'select-multiple':\n\t\t\t\t\t\t\t\t\tfor (j = 0; j < subelm.length; j += 1) {\n\t\t\t\t\t\t\t\t\t\tif (subelm[j].selected) {\n\t\t\t\t\t\t\t\t\t\t\tquerystring += '&' + queryPair(subelm.name, subelm[j].value);\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\tcase 'checkbox':\n\t\t\t\t\t\t\t\tcase 'radio':\n\t\t\t\t\t\t\t\t\tif (subelm.checked) {\n\t\t\t\t\t\t\t\t\t\tquerystring += '&' + queryPair(subelm.name, subelm.value);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\t// Everything else including shinny new HTML5 input types\n\t\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\t\tquerystring += '&' + queryPair(subelm.name, subelm.value);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}, nodes);\n\t\t}\n\t\t// Tidy up first &\n\t\treturn (querystring.length > 0) ? querystring.substring(1) : '';\n\t}\n\n\t// Class helper\n\tfunction classHelper(classes, action, nodes) {\n\t\tvar classarray, search, i, replace, has = false;\n\t\tif (classes) {\n\t\t\t// Trim any whitespace\n\t\t\tclassarray = classes.split(/\\s+/);\n\t\t\tnodeLoop(function (elm) {\n\t\t\t\tfor (i = 0; i < classarray.length; i += 1) {\n\t\t\t\t\tvar clz = classarray[i];\n\t\t\t\t\tif (action === 'remove') {\n\t\t\t\t\t\telm.classList.remove(clz);\n\t\t\t\t\t}\n\t\t\t\t\telse if (action === 'add') {\n\t\t\t\t\t\telm.classList.add(clz);\n\t\t\t\t\t}\n\t\t\t\t\telse if (action === 'toggle') {\n\t\t\t\t\t\telm.classList.toggle(clz);\n\t\t\t\t\t}\n\t\t\t\t\telse if (action === 'has') {\n\t\t\t\t\t\tif (elm.classList.contains(clz)) {\n\t\t\t\t\t\t\thas = true;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// search = new RegExp('\\\\b' + classarray[i] + '\\\\b', 'g');\n\t\t\t\t\t// replace = new RegExp(' *' + classarray[i] + '\\\\b', 'g');\n\t\t\t\t\t// if (action === 'remove') {\n\t\t\t\t\t// \telm.className = elm.className.replace(search, '');\n\t\t\t\t\t// } else if (action === 'toggle') {\n\t\t\t\t\t// \telm.className = (elm.className.match(search)) ? elm.className.replace(replace, '') : elm.className + ' ' + classarray[i];\n\t\t\t\t\t// } else if (action === 'has') {\n\t\t\t\t\t// \tif (elm.className.match(search)) {\n\t\t\t\t\t// \t\thas = true;\n\t\t\t\t\t// \t\tbreak;\n\t\t\t\t\t// \t}\n\t\t\t\t\t// }\n\t\t\t\t}\n\t\t\t}, nodes);\n\t\t}\n\t\treturn has;\n\t}\n\n\t// HTML insertion helper\n\tfunction insertHtml(value, position, nodes) {\n\t\tvar tmpnodes, tmpnode;\n\t\tif (value) {\n\t\t\tnodeLoop(function (elm) {\n\t\t\t\t// No insertAdjacentHTML support for FF < 8 and IE doesn't allow insertAdjacentHTML table manipulation, so use this instead\n\t\t\t\t// Convert string to node. We can't innerHTML on a document fragment\n\t\t\t\ttmpnodes = d.createElement('div');\n\t\t\t\ttmpnodes.innerHTML = value;\n\t\t\t\twhile ((tmpnode = tmpnodes.lastChild) !== null) {\n\t\t\t\t\t// Catch error in unlikely case elm has been removed\n\t\t\t\t\ttry {\n\t\t\t\t\t\tif (position === 'before') {\n\t\t\t\t\t\t\telm.parentNode.insertBefore(tmpnode, elm);\n\t\t\t\t\t\t} else if (position === 'after') {\n\t\t\t\t\t\t\telm.parentNode.insertBefore(tmpnode, elm.nextSibling);\n\t\t\t\t\t\t} else if (position === 'append') {\n\t\t\t\t\t\t\telm.appendChild(tmpnode);\n\t\t\t\t\t\t} else if (position === 'prepend') {\n\t\t\t\t\t\t\telm.insertBefore(tmpnode, elm.firstChild);\n\t\t\t\t\t\t}\n\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}, nodes);\n\t\t}\n\t}\n\n\t// Get nodes and return chibi\n\tfunction chibi(selector) {\n\t\tvar cb, nodes = [], json = false, nodelist, i;\n\n\t\tif (selector) {\n\n\t\t\t// Element node, would prefer to use (selector instanceof HTMLElement) but no IE support\n\t\t\tif (selector.nodeType && selector.nodeType === 1) {\n\t\t\t\tnodes = [selector]; // return element as node list\n\t\t\t} else if (typeof selector === 'object') {\n\t\t\t\t// JSON, document object or node list, would prefer to use (selector instanceof NodeList) but no IE support\n\t\t\t\tjson = (typeof selector.length !== 'number');\n\t\t\t\tnodes = selector;\n\t\t\t} else if (typeof selector === 'string') {\n\t\t\t\tnodelist = d.querySelectorAll(selector);\n\n\t\t\t\t// Convert node list to array so results have full access to array methods\n\t\t\t\t// Array.prototype.slice.call not supported in IE < 9 and often slower than loop anyway\n\t\t\t\tfor (i = 0; i < nodelist.length; i += 1) {\n\t\t\t\t\tnodes[i] = nodelist[i];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Only attach nodes if not JSON\n\t\tcb = json ? {} : nodes;\n\n\t\t// Public functions\n\n\t\t// Executes a function on nodes\n\t\tcb.each = function (fn) {\n\t\t\tif (typeof fn === 'function') {\n\t\t\t\tnodeLoop(function (elm) {\n\t\t\t\t\t// <= IE 8 loses scope so need to apply\n\t\t\t\t\treturn fn.apply(elm, arguments);\n\t\t\t\t}, nodes);\n\t\t\t}\n\t\t\treturn cb;\n\t\t};\n\t\t// Find first\n\t\tcb.first = function () {\n\t\t\treturn chibi(nodes.shift());\n\t\t};\n\t\t// Find last\n\t\tcb.last = function () {\n\t\t\treturn chibi(nodes.pop());\n\t\t};\n\t\t// Find odd\n\t\tcb.odd = function () {\n\t\t\tvar odds = [], i;\n\t\t\tfor (i = 0; i < nodes.length; i += 2) {\n\t\t\t\todds.push(nodes[i]);\n\t\t\t}\n\t\t\treturn chibi(odds);\n\t\t};\n\t\t// Find even\n\t\tcb.even = function () {\n\t\t\tvar evens = [], i;\n\t\t\tfor (i = 1; i < nodes.length; i += 2) {\n\t\t\t\tevens.push(nodes[i]);\n\t\t\t}\n\t\t\treturn chibi(evens);\n\t\t};\n\t\t// Hide node\n\t\tcb.hide = function () {\n\t\t\tnodeLoop(function (elm) {\n\t\t\t\telm.style.display = 'none';\n\t\t\t}, nodes);\n\t\t\treturn cb;\n\t\t};\n\t\t// Show node\n\t\tcb.show = function () {\n\t\t\tnodeLoop(function (elm) {\n\t\t\t\tshowCss(elm);\n\t\t\t}, nodes);\n\t\t\treturn cb;\n\t\t};\n\t\t// Toggle node display\n\t\tcb.toggle = function (state) {\n\t\t\tif (typeof state != 'undefined') { // ADDED\n\t\t\t\tif (state)\n\t\t\t\t\tcb.show();\n\t\t\t\telse\n\t\t\t\t\tcb.hide();\n\t\t\t} else {\n\t\t\t\tnodeLoop(function (elm) {\n\t\t\t\t\t// computeStyle instead of style.display == 'none' catches elements that are hidden via style block\n\t\t\t\t\tif (computeStyle(elm, 'display') === 'none') {\n\t\t\t\t\t\tshowCss(elm);\n\t\t\t\t\t} else {\n\t\t\t\t\t\telm.style.display = 'none';\n\t\t\t\t\t}\n\n\t\t\t\t}, nodes);\n\t\t\t}\n\t\t\treturn cb;\n\t\t};\n\t\t// Remove node\n\t\tcb.remove = function () {\n\t\t\tnodeLoop(function (elm) {\n\t\t\t\t// Catch error in unlikely case elm has been removed\n\t\t\t\ttry {\n\t\t\t\t\telm.parentNode.removeChild(elm);\n\t\t\t\t} catch (e) {\n\t\t\t\t}\n\t\t\t}, nodes);\n\t\t\treturn chibi();\n\t\t};\n\t\t// Get/Set CSS\n\t\tcb.css = function (property, value) {\n\t\t\tif (property) {\n\t\t\t\tif (value || value === '') {\n\t\t\t\t\tnodeLoop(function (elm) {\n\t\t\t\t\t\tsetCss(elm, property, value);\n\t\t\t\t\t}, nodes);\n\t\t\t\t\treturn cb;\n\t\t\t\t}\n\t\t\t\tif (nodes[0]) {\n\t\t\t\t\tif (nodes[0].style[cssCamel(property)]) {\n\t\t\t\t\t\treturn nodes[0].style[cssCamel(property)];\n\t\t\t\t\t}\n\t\t\t\t\tif (computeStyle(nodes[0], property)) {\n\t\t\t\t\t\treturn computeStyle(nodes[0], property);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t\t// Get class(es)\n\t\tcb.getClass = function () {\n\t\t\tif (nodes[0] && nodes[0].className.length > 0) {\n\t\t\t\t// Weak IE trim support\n\t\t\t\treturn nodes[0].className.replace(/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g, '').replace(/\\s+/, ' ');\n\t\t\t}\n\t\t};\n\t\t// Set (replaces) classes\n\t\tcb.setClass = function (classes) {\n\t\t\tif (classes || classes === '') {\n\t\t\t\tnodeLoop(function (elm) {\n\t\t\t\t\telm.className = classes;\n\t\t\t\t}, nodes);\n\t\t\t}\n\t\t\treturn cb;\n\t\t};\n\t\t// Add class\n\t\tcb.addClass = function (classes) {\n\t\t\tclassHelper(classes, 'add', nodes);\n\t\t\t// if (classes) {\n\t\t\t// \tnodeLoop(function (elm) {\n\t\t\t// \t\telm.className += ' ' + classes;\n\t\t\t// \t}, nodes);\n\t\t\t// }\n\t\t\treturn cb;\n\t\t};\n\t\t// Remove class\n\t\tcb.removeClass = function (classes) {\n\t\t\tclassHelper(classes, 'remove', nodes);\n\t\t\treturn cb;\n\t\t};\n\t\t// Toggle class\n\t\tcb.toggleClass = function (classes, set) {\n\t\t\tvar method = ((typeof set === 'undefined') ? 'toggle' : (+set ? 'add' : 'remove'));\n\t\t\tclassHelper(classes, method, nodes);\n\t\t\treturn cb;\n\t\t};\n\t\t// Has class\n\t\tcb.hasClass = function (classes) {\n\t\t\treturn classHelper(classes, 'has', nodes);\n\t\t};\n\t\t// Get/set HTML\n\t\tcb.html = function (value) {\n\t\t\tif (value || value === '') {\n\t\t\t\tnodeLoop(function (elm) {\n\t\t\t\t\telm.innerHTML = value;\n\t\t\t\t}, nodes);\n\t\t\t\treturn cb;\n\t\t\t}\n\t\t\tif (nodes[0]) {\n\t\t\t\treturn nodes[0].innerHTML;\n\t\t\t}\n\t\t};\n\t\t// Insert HTML before selector\n\t\tcb.htmlBefore = function (value) {\n\t\t\tinsertHtml(value, 'before', nodes);\n\t\t\treturn cb;\n\t\t};\n\t\t// Insert HTML after selector\n\t\tcb.htmlAfter = function (value) {\n\t\t\tinsertHtml(value, 'after', nodes);\n\t\t\treturn cb;\n\t\t};\n\t\t// Insert HTML after selector innerHTML\n\t\tcb.htmlAppend = function (value) {\n\t\t\tinsertHtml(value, 'append', nodes);\n\t\t\treturn cb;\n\t\t};\n\t\t// Insert HTML before selector innerHTML\n\t\tcb.htmlPrepend = function (value) {\n\t\t\tinsertHtml(value, 'prepend', nodes);\n\t\t\treturn cb;\n\t\t};\n\t\t// Get/Set HTML attributes\n\t\tcb.attr = function (property, value) {\n\t\t\tif (property) {\n\t\t\t\tproperty = property.toLowerCase();\n\t\t\t\t// IE < 9 doesn't allow style or class via get/setAttribute so switch. cssText returns prettier CSS anyway\n\t\t\t\tif (typeof value !== 'undefined') {//FIXED BUG HERE\n\t\t\t\t\tnodeLoop(function (elm) {\n\t\t\t\t\t\tif (property === 'style') {\n\t\t\t\t\t\t\telm.style.cssText = value;\n\t\t\t\t\t\t} else if (property === 'class') {\n\t\t\t\t\t\t\telm.className = value;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\telm.setAttribute(property, value);\n\t\t\t\t\t\t}\n\t\t\t\t\t}, nodes);\n\t\t\t\t\treturn cb;\n\t\t\t\t}\n\t\t\t\tif (nodes[0]) {\n\t\t\t\t\tif (property === 'style') {\n\t\t\t\t\t\tif (nodes[0].style.cssText) {\n\t\t\t\t\t\t\treturn nodes[0].style.cssText;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else if (property === 'class') {\n\t\t\t\t\t\tif (nodes[0].className) {\n\t\t\t\t\t\t\treturn nodes[0].className;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif (nodes[0].getAttribute(property)) {\n\t\t\t\t\t\t\treturn nodes[0].getAttribute(property);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t\t// Get/Set HTML data property\n\t\tcb.data = function (key, value) {\n\t\t\tif (key) {\n\t\t\t\treturn cb.attr('data-' + key, value);\n\t\t\t}\n\t\t};\n\t\t// Get/Set form element values\n\t\tcb.val = function (value) {\n\t\t\tvar values, i, j;\n\t\t\tif (typeof value != 'undefined') { // FIXED A BUG HERE\n\t\t\t\tnodeLoop(function (elm) {\n\t\t\t\t\tswitch (elm.nodeName) {\n\t\t\t\t\t\tcase 'SELECT':\n\t\t\t\t\t\t\tif (typeof value === 'string' || typeof value === 'number') {\n\t\t\t\t\t\t\t\tvalue = [value];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tfor (i = 0; i < elm.length; i += 1) {\n\t\t\t\t\t\t\t\t// Multiple select\n\t\t\t\t\t\t\t\tfor (j = 0; j < value.length; j += 1) {\n\t\t\t\t\t\t\t\t\telm[i].selected = '';\n\t\t\t\t\t\t\t\t\tif (elm[i].value === \"\"+value[j]) {\n\t\t\t\t\t\t\t\t\t\telm[i].selected = 'selected';\n\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'INPUT':\n\t\t\t\t\t\tcase 'TEXTAREA':\n\t\t\t\t\t\tcase 'BUTTON':\n\t\t\t\t\t\t\telm.value = value;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}, nodes);\n\n\t\t\t\treturn cb;\n\t\t\t}\n\t\t\tif (nodes[0]) {\n\t\t\t\tswitch (nodes[0].nodeName) {\n\t\t\t\t\tcase 'SELECT':\n\t\t\t\t\t\tvalues = [];\n\t\t\t\t\t\tfor (i = 0; i < nodes[0].length; i += 1) {\n\t\t\t\t\t\t\tif (nodes[0][i].selected) {\n\t\t\t\t\t\t\t\tvalues.push(nodes[0][i].value);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn (values.length > 1) ? values : values[0];\n\t\t\t\t\tcase 'INPUT':\n\t\t\t\t\tcase 'TEXTAREA':\n\t\t\t\t\tcase 'BUTTON':\n\t\t\t\t\t\treturn nodes[0].value;\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t\t// Return matching checked checkbox or radios\n\t\tcb.checked = function (check) {\n\t\t\tif (typeof check === 'boolean') {\n\t\t\t\tnodeLoop(function (elm) {\n\t\t\t\t\tif (elm.nodeName === 'INPUT' && (elm.type === 'checkbox' || elm.type === 'radio')) {\n\t\t\t\t\t\telm.checked = check;\n\t\t\t\t\t}\n\t\t\t\t}, nodes);\n\t\t\t\treturn cb;\n\t\t\t}\n\t\t\tif (nodes[0] && nodes[0].nodeName === 'INPUT' && (nodes[0].type === 'checkbox' || nodes[0].type === 'radio')) {\n\t\t\t\treturn (!!nodes[0].checked);\n\t\t\t}\n\t\t};\n\t\t// Add event handler\n\t\tcb.on = function (event, fn) {\n\t\t\tif (selector === w || selector === d) {\n\t\t\t\tnodes = [selector];\n\t\t\t}\n\t\t\tnodeLoop(function (elm) {\n\t\t\t\tif (d.addEventListener) {\n\t\t\t\t\telm.addEventListener(event, fn, false);\n\t\t\t\t} else if (d.attachEvent) {\n\t\t\t\t\t// <= IE 8 loses scope so need to apply, we add this to object so we can detach later (can't detach anonymous functions)\n\t\t\t\t\telm[event + fn] = function () {\n\t\t\t\t\t\treturn fn.apply(elm, arguments);\n\t\t\t\t\t};\n\t\t\t\t\telm.attachEvent('on' + event, elm[event + fn]);\n\t\t\t\t}\n\t\t\t}, nodes);\n\t\t\treturn cb;\n\t\t};\n\t\t// Remove event handler\n\t\tcb.off = function (event, fn) {\n\t\t\tif (selector === w || selector === d) {\n\t\t\t\tnodes = [selector];\n\t\t\t}\n\t\t\tnodeLoop(function (elm) {\n\t\t\t\tif (d.addEventListener) {\n\t\t\t\t\telm.removeEventListener(event, fn, false);\n\t\t\t\t} else if (d.attachEvent) {\n\t\t\t\t\telm.detachEvent('on' + event, elm[event + fn]);\n\t\t\t\t\t// Tidy up\n\t\t\t\t\telm[event + fn] = null;\n\t\t\t\t}\n\t\t\t}, nodes);\n\t\t\treturn cb;\n\t\t};\n\t\treturn cb;\n\t}\n\n\t// Basic XHR\n\tchibi.ajax = function (options) { // if options is a number, it's timeout in ms\n\t\tvar opts = Object.assign({\n\t\t\tmethod: 'GET',\n\t\t\tnocache: true,\n\t\t\ttimeout: 5000,\n\t\t\tloader: true,\n\t\t\tcallback: null\n\t\t}, options);\n\t\topts.method = opts.method.toUpperCase();\n\n\t\tvar loaderFn = opts.loader ? chibi._loader : function(){};\n\t\tvar url = opts.url;\n\t\tvar method = opts.method;\n\t\tvar query = null;\n\n\t\tif (opts.data) {\n\t\t\tquery = serializeData(opts.data);\n\t\t}\n\n\t\tif (query && (method === 'GET')) {\n\t\t\turl += (url.indexOf('?') === -1) ? '?' + query : '&' + query;\n\t\t\tquery = null;\n\t\t}\n\n\t\tvar xhr = new XMLHttpRequest();\n\n\t\t// prevent caching\n\t\tif (opts.nocache) {\n\t\t\tvar ts = (+(new Date())).toString(36);\n\t\t\turl += ((url.indexOf('?') === -1) ? '?' : '&') + '_=' + ts;\n\t\t}\n\n\t\tloaderFn(true);\n\n\t\txhr.open(method, url, true);\n\t\txhr.timeout = opts.timeout;\n\n\t\t// Abort after given timeout\n\t\tvar abortTmeo = setTimeout(function () {\n\t\t\tconsole.error(\"XHR timed out.\");\n\t\t\txhr.abort();\n\t\t\tloaderFn(false);\n\t\t}, opts.timeout + 10);\n\n\t\txhr.onreadystatechange = function () {\n\t\t\tif (xhr.readyState === 4) {\n\t\t\t\tloaderFn(false);\n\n\t\t\t\topts.callback && opts.callback(xhr.responseText, xhr.status);\n\n\t\t\t\tclearTimeout(abortTmeo);\n\t\t\t}\n\t\t};\n\n\t\txhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest');\n\t\tif (method === 'POST') {\n\t\t\txhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');\n\t\t}\n\n\t\txhr.send(query);\n\t\treturn xhr;\n\t};\n\n\tchibi._loader = function(){};\n\n\t// Alias to cb.ajax(url, 'get', callback)\n\tchibi.get = function (url, callback, opts) {\n\t\topts = opts || {};\n\t\topts.url = url;\n\t\topts.callback = callback;\n\t\topts.method = 'GET';\n\t\treturn chibi.ajax(opts);\n\t};\n\n\t// Alias to cb.ajax(url, 'post', callback)\n\tchibi.post = function (url, callback, opts) {\n\t\topts = opts || {};\n\t\topts.url = url;\n\t\topts.callback = callback;\n\t\topts.method = 'POST';\n\t\treturn chibi.ajax(opts);\n\t};\n\n\t// Fire on DOM ready\n\tchibi.ready = function (fn) {\n\t\tif (fn) {\n\t\t\tif (domready) {\n\t\t\t\tfn();\n\t\t\t\treturn chibi;\n\t\t\t} else {\n\t\t\t\treadyfn.push(fn);\n\t\t\t}\n\t\t}\n\t};\n\n\t// Fire on page loaded\n\tchibi.loaded = function (fn) {\n\t\tif (fn) {\n\t\t\tif (pageloaded) {\n\t\t\t\tfn();\n\t\t\t\treturn chibi;\n\t\t\t} else {\n\t\t\t\tloadedfn.push(fn);\n\t\t\t}\n\t\t}\n\t};\n\n\tvar entityMap = {\n\t\t'&': '&',\n\t\t'<': '<',\n\t\t'>': '>',\n\t\t'\"': '"',\n\t\t\"'\": ''',\n\t\t'/': '/',\n\t\t'`': '`',\n\t\t'=': '='\n\t};\n\n\tchibi.htmlEscape = function(string) {\n\t\treturn String(string).replace(/[&<>\"'`=\\/]/g, function (s) {\n\t\t\treturn entityMap[s];\n\t\t});\n\t};\n\n\t// Set Chibi's global namespace here ($)\n\tmodule.exports = chibi;\n}());\n\n\n\n// WEBPACK FOOTER //\n// ./js/lib/chibi.js","const $ = require('./lib/chibi')\n\n/** Module for toggling a modal overlay */\nlet modal = {}\nlet curCloseCb = null\n\nmodal.show = function (sel, closeCb) {\n let $m = $(sel)\n $m.removeClass('hidden visible')\n setTimeout(function () {\n $m.addClass('visible')\n }, 1)\n curCloseCb = closeCb\n}\n\nmodal.hide = function (sel) {\n let $m = $(sel)\n $m.removeClass('visible')\n setTimeout(function () {\n $m.addClass('hidden')\n if (curCloseCb) curCloseCb()\n }, 500) // transition time\n}\n\nmodal.init = function () {\n // close modal by click outside the dialog\n $('.Modal').on('click', function () {\n if ($(this).hasClass('no-close')) return // this is a no-close modal\n modal.hide(this)\n })\n\n $('.Dialog').on('click', function (e) {\n e.stopImmediatePropagation()\n })\n\n // Hide all modals on esc\n $(window).on('keydown', function (e) {\n if (e.which === 27) {\n modal.hide('.Modal')\n }\n })\n}\n\nmodule.exports = modal\n\n\n\n// WEBPACK FOOTER //\n// ./js/modal.js","const $ = require('./lib/chibi')\nconst modal = require('./modal')\n\nlet nt = {}\nconst sel = '#notif'\nlet $balloon\n\nlet timerHideBegin // timeout to start hiding (transition)\nlet timerHideEnd // timeout to add the hidden class\nlet canCancel = false\n\nlet stopTimeouts = function () {\n clearTimeout(timerHideBegin)\n clearTimeout(timerHideEnd)\n}\n\nnt.show = function (message, timeout, isError) {\n $balloon.toggleClass('error', isError === true)\n $balloon.html(message)\n modal.show($balloon)\n stopTimeouts()\n\n if (!timeout || timeout <= 0) {\n timeout = 2500\n }\n\n timerHideBegin = setTimeout(nt.hide, timeout)\n\n canCancel = false\n setTimeout(() => {\n canCancel = true\n }, 500)\n}\n\nnt.hide = function () {\n let $m = $(sel)\n $m.removeClass('visible')\n timerHideEnd = setTimeout(function () {\n $m.addClass('hidden')\n }, 250) // transition time\n}\n\nnt.init = function () {\n $balloon = $(sel)\n\n // close by click outside\n $(document).on('click', function () {\n if (!canCancel) return\n nt.hide(this)\n })\n\n // click caused by selecting, prevent it from bubbling\n $balloon.on('click', function (e) {\n e.stopImmediatePropagation()\n return false\n })\n\n // stop fading if moused\n $balloon.on('mouseenter', function () {\n stopTimeouts()\n $balloon.removeClass('hidden').addClass('visible')\n })\n}\n\nmodule.exports = nt\n\n\n\n// WEBPACK FOOTER //\n// ./js/notif.js","\nconst themes = exports.themes = [\n [ // Tango\n '#111213', '#CC0000', '#4E9A06', '#C4A000', '#3465A4', '#75507B', '#06989A', '#D3D7CF',\n '#555753', '#EF2929', '#8AE234', '#FCE94F', '#729FCF', '#AD7FA8', '#34E2E2', '#EEEEEC'\n ],\n [ // Linux (CGA)\n '#000000', '#aa0000', '#00aa00', '#aa5500', '#0000aa', '#aa00aa', '#00aaaa', '#aaaaaa',\n '#555555', '#ff5555', '#55ff55', '#ffff55', '#5555ff', '#ff55ff', '#55ffff', '#ffffff'\n ],\n [ // xterm\n '#000000', '#cd0000', '#00cd00', '#cdcd00', '#0000ee', '#cd00cd', '#00cdcd', '#e5e5e5',\n '#7f7f7f', '#ff0000', '#00ff00', '#ffff00', '#5c5cff', '#ff00ff', '#00ffff', '#ffffff'\n ],\n [ // rxvt\n '#000000', '#cd0000', '#00cd00', '#cdcd00', '#0000cd', '#cd00cd', '#00cdcd', '#faebd7',\n '#404040', '#ff0000', '#00ff00', '#ffff00', '#0000ff', '#ff00ff', '#00ffff', '#ffffff'\n ],\n [ // Ambience\n '#2e3436', '#cc0000', '#4e9a06', '#c4a000', '#3465a4', '#75507b', '#06989a', '#d3d7cf',\n '#555753', '#ef2929', '#8ae234', '#fce94f', '#729fcf', '#ad7fa8', '#34e2e2', '#eeeeec'\n ],\n [ // Solarized light\n '#073642', '#dc322f', '#859900', '#b58900', '#268bd2', '#d33682', '#2aa198', '#eee8d5',\n '#002b36', '#cb4b16', '#586e75', '#657b83', '#839496', '#6c71c4', '#93a1a1', '#fdf6e3'\n ],\n [ // Solarized dark\n '#073642', '#dc322f', '#859900', '#b58900', '#268bd2', '#d33682', '#2aa198', '#eee8d5',\n '#002b36', '#cb4b16', '#586e75', '#657b83', '#839496', '#6c71c4', '#93a1a1', '#fdf6e3'\n ],\n [ // CGA NTSC\n '#000000', '#69001A', '#117800', '#769100', '#1A00A6', '#8019AB', '#289E76', '#A4A4A4',\n '#484848', '#C54E76', '#6DD441', '#D2ED46', '#765BFF', '#DC75FF', '#84FAD2', '#FFFFFF'\n ],\n [ // ZX Spectrum\n '#000000', '#aa0000', '#00aa00', '#aaaa00', '#0000aa', '#aa00aa', '#00aaaa', '#aaaaaa',\n '#000000', '#ff0000', '#00FF00', '#ffff00', '#0000ff', '#ff00ff', '#00ffff', '#ffffff'\n ],\n [ // Apple II\n '#000000', '#722640', '#0E5940', '#808080', '#40337F', '#E434FE', '#1B9AFE', '#BFB3FF',\n '#404C00', '#E46501', '#1BCB01', '#BFCC80', '#808080', '#F1A6BF', '#8DD9BF', '#ffffff'\n ],\n [ // Commodore\n '#000000', '#8D3E37', '#55A049', '#AAB95D', '#40318D', '#80348B', '#72C1C8', '#D59F74',\n '#8B5429', '#B86962', '#94E089', '#FFFFB2', '#8071CC', '#AA5FB6', '#87D6DD', '#ffffff'\n ]\n]\n\nexports.fgbgThemes = [\n ['#aaaaaa', '#000000'], // grey_on_black\n ['#000000', '#ffffdd'], // black_on_yellow\n ['#000000', '#ffffff'], // black_on_white\n ['#ffffff', '#000000'], // white_on_black\n ['#00ff00', '#000000'], // green_on_black\n ['#e53c00', '#000000'], // orange_on_black\n ['#ffffff', '#300a24'], // ambience\n ['#657b83', '#fdf6e3'], // solarized_light\n ['#839496', '#002b36'] // solarized_dark\n]\n\nlet colorTable256 = null\n\nexports.buildColorTable = function () {\n if (colorTable256 !== null) return colorTable256\n\n // 256color lookup table\n // should not be used to look up 0-15 (will return transparent)\n colorTable256 = new Array(16).fill('rgba(0, 0, 0, 0)')\n\n // fill color table\n // colors 16-231 are a 6x6x6 color cube\n for (let red = 0; red < 6; red++) {\n for (let green = 0; green < 6; green++) {\n for (let blue = 0; blue < 6; blue++) {\n let redValue = red * 40 + (red ? 55 : 0)\n let greenValue = green * 40 + (green ? 55 : 0)\n let blueValue = blue * 40 + (blue ? 55 : 0)\n colorTable256.push(`rgb(${redValue}, ${greenValue}, ${blueValue})`)\n }\n }\n }\n // colors 232-255 are a grayscale ramp, sans black and white\n for (let gray = 0; gray < 24; gray++) {\n let value = gray * 10 + 8\n colorTable256.push(`rgb(${value}, ${value}, ${value})`)\n }\n\n return colorTable256\n}\n\nexports.SELECTION_FG = '#333'\nexports.SELECTION_BG = '#b2d7fe'\n\nexports.themePreview = function (n) {\n document.querySelectorAll('[data-fg]').forEach((elem) => {\n let shade = +elem.dataset.fg\n elem.style.color = themes[n][shade]\n })\n document.querySelectorAll('[data-bg]').forEach((elem) => {\n let shade = +elem.dataset.bg\n elem.style.backgroundColor = themes[n][shade]\n })\n}\n\n\n\n// WEBPACK FOOTER //\n// ./js/term/themes.js","// Copyright Joyent, Inc. and other Node contributors.\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 permit\n// persons to whom the Software is furnished to do so, subject to the\n// 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. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\nfunction EventEmitter() {\n this._events = this._events || {};\n this._maxListeners = this._maxListeners || undefined;\n}\nmodule.exports = EventEmitter;\n\n// Backwards-compat with node 0.10.x\nEventEmitter.EventEmitter = EventEmitter;\n\nEventEmitter.prototype._events = undefined;\nEventEmitter.prototype._maxListeners = undefined;\n\n// By default EventEmitters will print a warning if more than 10 listeners are\n// added to it. This is a useful default which helps finding memory leaks.\nEventEmitter.defaultMaxListeners = 10;\n\n// Obviously not all Emitters should be limited to 10. This function allows\n// that to be increased. Set to zero for unlimited.\nEventEmitter.prototype.setMaxListeners = function(n) {\n if (!isNumber(n) || n < 0 || isNaN(n))\n throw TypeError('n must be a positive number');\n this._maxListeners = n;\n return this;\n};\n\nEventEmitter.prototype.emit = function(type) {\n var er, handler, len, args, i, listeners;\n\n if (!this._events)\n this._events = {};\n\n // If there is no 'error' event listener then throw.\n if (type === 'error') {\n if (!this._events.error ||\n (isObject(this._events.error) && !this._events.error.length)) {\n er = arguments[1];\n if (er instanceof Error) {\n throw er; // Unhandled 'error' event\n } else {\n // At least give some kind of context to the user\n var err = new Error('Uncaught, unspecified \"error\" event. (' + er + ')');\n err.context = er;\n throw err;\n }\n }\n }\n\n handler = this._events[type];\n\n if (isUndefined(handler))\n return false;\n\n if (isFunction(handler)) {\n switch (arguments.length) {\n // fast cases\n case 1:\n handler.call(this);\n break;\n case 2:\n handler.call(this, arguments[1]);\n break;\n case 3:\n handler.call(this, arguments[1], arguments[2]);\n break;\n // slower\n default:\n args = Array.prototype.slice.call(arguments, 1);\n handler.apply(this, args);\n }\n } else if (isObject(handler)) {\n args = Array.prototype.slice.call(arguments, 1);\n listeners = handler.slice();\n len = listeners.length;\n for (i = 0; i < len; i++)\n listeners[i].apply(this, args);\n }\n\n return true;\n};\n\nEventEmitter.prototype.addListener = function(type, listener) {\n var m;\n\n if (!isFunction(listener))\n throw TypeError('listener must be a function');\n\n if (!this._events)\n this._events = {};\n\n // To avoid recursion in the case that type === \"newListener\"! Before\n // adding it to the listeners, first emit \"newListener\".\n if (this._events.newListener)\n this.emit('newListener', type,\n isFunction(listener.listener) ?\n listener.listener : listener);\n\n if (!this._events[type])\n // Optimize the case of one listener. Don't need the extra array object.\n this._events[type] = listener;\n else if (isObject(this._events[type]))\n // If we've already got an array, just append.\n this._events[type].push(listener);\n else\n // Adding the second element, need to change to array.\n this._events[type] = [this._events[type], listener];\n\n // Check for listener leak\n if (isObject(this._events[type]) && !this._events[type].warned) {\n if (!isUndefined(this._maxListeners)) {\n m = this._maxListeners;\n } else {\n m = EventEmitter.defaultMaxListeners;\n }\n\n if (m && m > 0 && this._events[type].length > m) {\n this._events[type].warned = true;\n console.error('(node) warning: possible EventEmitter memory ' +\n 'leak detected. %d listeners added. ' +\n 'Use emitter.setMaxListeners() to increase limit.',\n this._events[type].length);\n if (typeof console.trace === 'function') {\n // not supported in IE 10\n console.trace();\n }\n }\n }\n\n return this;\n};\n\nEventEmitter.prototype.on = EventEmitter.prototype.addListener;\n\nEventEmitter.prototype.once = function(type, listener) {\n if (!isFunction(listener))\n throw TypeError('listener must be a function');\n\n var fired = false;\n\n function g() {\n this.removeListener(type, g);\n\n if (!fired) {\n fired = true;\n listener.apply(this, arguments);\n }\n }\n\n g.listener = listener;\n this.on(type, g);\n\n return this;\n};\n\n// emits a 'removeListener' event iff the listener was removed\nEventEmitter.prototype.removeListener = function(type, listener) {\n var list, position, length, i;\n\n if (!isFunction(listener))\n throw TypeError('listener must be a function');\n\n if (!this._events || !this._events[type])\n return this;\n\n list = this._events[type];\n length = list.length;\n position = -1;\n\n if (list === listener ||\n (isFunction(list.listener) && list.listener === listener)) {\n delete this._events[type];\n if (this._events.removeListener)\n this.emit('removeListener', type, listener);\n\n } else if (isObject(list)) {\n for (i = length; i-- > 0;) {\n if (list[i] === listener ||\n (list[i].listener && list[i].listener === listener)) {\n position = i;\n break;\n }\n }\n\n if (position < 0)\n return this;\n\n if (list.length === 1) {\n list.length = 0;\n delete this._events[type];\n } else {\n list.splice(position, 1);\n }\n\n if (this._events.removeListener)\n this.emit('removeListener', type, listener);\n }\n\n return this;\n};\n\nEventEmitter.prototype.removeAllListeners = function(type) {\n var key, listeners;\n\n if (!this._events)\n return this;\n\n // not listening for removeListener, no need to emit\n if (!this._events.removeListener) {\n if (arguments.length === 0)\n this._events = {};\n else if (this._events[type])\n delete this._events[type];\n return this;\n }\n\n // emit removeListener for all listeners on all events\n if (arguments.length === 0) {\n for (key in this._events) {\n if (key === 'removeListener') continue;\n this.removeAllListeners(key);\n }\n this.removeAllListeners('removeListener');\n this._events = {};\n return this;\n }\n\n listeners = this._events[type];\n\n if (isFunction(listeners)) {\n this.removeListener(type, listeners);\n } else if (listeners) {\n // LIFO order\n while (listeners.length)\n this.removeListener(type, listeners[listeners.length - 1]);\n }\n delete this._events[type];\n\n return this;\n};\n\nEventEmitter.prototype.listeners = function(type) {\n var ret;\n if (!this._events || !this._events[type])\n ret = [];\n else if (isFunction(this._events[type]))\n ret = [this._events[type]];\n else\n ret = this._events[type].slice();\n return ret;\n};\n\nEventEmitter.prototype.listenerCount = function(type) {\n if (this._events) {\n var evlistener = this._events[type];\n\n if (isFunction(evlistener))\n return 1;\n else if (evlistener)\n return evlistener.length;\n }\n return 0;\n};\n\nEventEmitter.listenerCount = function(emitter, type) {\n return emitter.listenerCount(type);\n};\n\nfunction isFunction(arg) {\n return typeof arg === 'function';\n}\n\nfunction isNumber(arg) {\n return typeof arg === 'number';\n}\n\nfunction isObject(arg) {\n return typeof arg === 'object' && arg !== null;\n}\n\nfunction isUndefined(arg) {\n return arg === void 0;\n}\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/events/events.js\n// module id = 5\n// module chunks = 0","const EventEmitter = require('events')\nconst { parse2B } = require('../utils')\nconst { themes } = require('./themes')\n\nclass ANSIParser {\n constructor (handler) {\n this.reset()\n this.handler = handler\n this.joinChunks = true\n }\n reset () {\n this.currentSequence = 0\n this.sequence = ''\n }\n parseSequence (sequence) {\n if (sequence[0] === '[') {\n let type = sequence[sequence.length - 1]\n let content = sequence.substring(1, sequence.length - 1)\n\n let numbers = content ? content.split(';').map(i => +i.replace(/\\D/g, '')) : []\n let numOr1 = numbers.length ? numbers[0] : 1\n if (type === 'H') {\n this.handler('set-cursor', (numbers[0] | 0) - 1, (numbers[1] | 0) - 1)\n } else if (type >= 'A' && type <= 'D') {\n this.handler(`move-cursor-${type <= 'B' ? 'y' : 'x'}`, ((type === 'B' || type === 'C') ? 1 : -1) * numOr1)\n } else if (type === 'E' || type === 'F') {\n this.handler('move-cursor-line', (type === 'E' ? 1 : -1) * numOr1)\n } else if (type === 'G') {\n this.handler('set-cursor-x', numOr1 - 1)\n } else if (type === 'J') {\n let number = numbers.length ? numbers[0] : 2\n if (number === 2) this.handler('clear')\n } else if (type === 'P') {\n this.handler('delete', numOr1)\n } else if (type === '@') {\n this.handler('insert-blanks', numOr1)\n } else if (type === 'q') this.handler('set-cursor-style', numOr1)\n else if (type === 'm') {\n if (!numbers.length || numbers[0] === 0) {\n this.handler('reset-style')\n return\n }\n let type = numbers[0]\n if (type === 1) this.handler('add-attrs', 1) // bold\n else if (type === 2) this.handler('add-attrs', 1 << 1) // faint\n else if (type === 3) this.handler('add-attrs', 1 << 2) // italic\n else if (type === 4) this.handler('add-attrs', 1 << 3) // underline\n else if (type === 5 || type === 6) this.handler('add-attrs', 1 << 4) // blink\n else if (type === 7) this.handler('add-attrs', -1) // invert\n else if (type === 9) this.handler('add-attrs', 1 << 6) // strike\n else if (type === 20) this.handler('add-attrs', 1 << 5) // fraktur\n else if (type >= 30 && type <= 37) this.handler('set-color-fg', type % 10)\n else if (type >= 40 && type <= 47) this.handler('set-color-bg', type % 10)\n else if (type === 39) this.handler('reset-color-fg')\n else if (type === 49) this.handler('reset-color-bg')\n else if (type >= 90 && type <= 98) this.handler('set-color-fg', (type % 10) + 8)\n else if (type >= 100 && type <= 108) this.handler('set-color-bg', (type % 10) + 8)\n else if (type === 38 || type === 48) {\n if (numbers[1] === 5) {\n let color = (numbers[2] | 0) & 0xFF\n if (type === 38) this.handler('set-color-fg', color)\n if (type === 48) this.handler('set-color-bg', color)\n }\n }\n } else if (type === 'h' || type === 'l') {\n if (content === '?25') {\n if (type === 'h') this.handler('show-cursor')\n else if (type === 'l') this.handler('hide-cursor')\n }\n }\n }\n }\n write (text) {\n for (let character of text.toString()) {\n let code = character.codePointAt(0)\n if (code === 0x1b) this.currentSequence = 1\n else if (this.currentSequence === 1 && character === '[') {\n this.currentSequence = 2\n this.sequence += '['\n } else if (this.currentSequence && character.match(/[\\x40-\\x7e]/)) {\n this.parseSequence(this.sequence + character)\n this.currentSequence = 0\n this.sequence = ''\n } else if (this.currentSequence > 1) this.sequence += character\n else if (this.currentSequence === 1) {\n // something something nothing\n this.currentSequence = 0\n this.handler('write', character)\n } else if (code < 0x03) this.handler('_null')\n else if (code === 0x03) this.handler('sigint')\n else if (code <= 0x06) this.handler('_null')\n else if (code === 0x07) this.handler('bell')\n else if (code === 0x08) this.handler('back')\n else if (code === 0x09) this.handler('tab')\n else if (code === 0x0a) this.handler('new-line')\n else if (code === 0x0d) this.handler('return')\n else if (code === 0x15) this.handler('delete-line')\n else if (code === 0x17) this.handler('delete-word')\n else this.handler('write', character)\n }\n if (!this.joinChunks) this.reset()\n }\n}\nconst TERM_DEFAULT_STYLE = 0\nconst TERM_MIN_DRAW_DELAY = 10\n\nlet getRainbowColor = t => {\n let r = Math.floor(Math.sin(t) * 2.5 + 2.5)\n let g = Math.floor(Math.sin(t + 2 / 3 * Math.PI) * 2.5 + 2.5)\n let b = Math.floor(Math.sin(t + 4 / 3 * Math.PI) * 2.5 + 2.5)\n return 16 + 36 * r + 6 * g + b\n}\n\nclass ScrollingTerminal {\n constructor (screen) {\n this.width = 80\n this.height = 25\n this.termScreen = screen\n this.parser = new ANSIParser((...args) => this.handleParsed(...args))\n\n this.reset()\n\n this._lastLoad = Date.now()\n this.termScreen.load(this.serialize())\n\n window.showPage()\n }\n reset () {\n this.style = TERM_DEFAULT_STYLE\n this.cursor = { x: 0, y: 0, style: 1, visible: true }\n this.trackMouse = false\n this.theme = -1\n this.rainbow = false\n this.parser.reset()\n this.clear()\n }\n clear () {\n this.screen = []\n for (let i = 0; i < this.width * this.height; i++) {\n this.screen.push([' ', this.style])\n }\n }\n scroll () {\n this.screen.splice(0, this.width)\n for (let i = 0; i < this.width; i++) {\n this.screen.push([' ', TERM_DEFAULT_STYLE])\n }\n this.cursor.y--\n }\n newLine () {\n this.cursor.y++\n if (this.cursor.y >= this.height) this.scroll()\n }\n writeChar (character) {\n this.screen[this.cursor.y * this.width + this.cursor.x] = [character, this.style]\n this.cursor.x++\n if (this.cursor.x >= this.width) {\n this.cursor.x = 0\n this.newLine()\n }\n }\n moveBack (n = 1) {\n for (let i = 0; i < n; i++) {\n this.cursor.x--\n if (this.cursor.x < 0) {\n if (this.cursor.y > 0) this.cursor.x = this.width - 1\n else this.cursor.x = 0\n this.cursor.y = Math.max(0, this.cursor.y - 1)\n }\n }\n }\n moveForward (n = 1) {\n for (let i = 0; i < n; i++) {\n this.cursor.x++\n if (this.cursor.x >= this.width) {\n this.cursor.x = 0\n this.cursor.y++\n if (this.cursor.y >= this.height) this.scroll()\n }\n }\n }\n deleteChar () { // FIXME unused?\n this.moveBack()\n this.screen.splice((this.cursor.y + 1) * this.width, 0, [' ', TERM_DEFAULT_STYLE])\n this.screen.splice(this.cursor.y * this.width + this.cursor.x, 1)\n }\n deleteForward (n) {\n n = Math.min(this.width, n)\n for (let i = 0; i < n; i++) this.screen.splice((this.cursor.y + 1) * this.width, 0, [' ', TERM_DEFAULT_STYLE])\n this.screen.splice(this.cursor.y * this.width + this.cursor.x, n)\n }\n clampCursor () {\n if (this.cursor.x < 0) this.cursor.x = 0\n if (this.cursor.y < 0) this.cursor.y = 0\n if (this.cursor.x > this.width - 1) this.cursor.x = this.width - 1\n if (this.cursor.y > this.height - 1) this.cursor.y = this.height - 1\n }\n handleParsed (action, ...args) {\n if (action === 'write') {\n this.writeChar(args[0])\n } else if (action === 'delete') {\n this.deleteForward(args[0])\n } else if (action === 'insert-blanks') {\n this.insertBlanks(args[0]) // FIXME undefined?\n } else if (action === 'clear') {\n this.clear()\n } else if (action === 'bell') {\n this.termScreen.load('B')\n } else if (action === 'back') {\n this.moveBack()\n } else if (action === 'new-line') {\n this.newLine()\n } else if (action === 'return') {\n this.cursor.x = 0\n } else if (action === 'set-cursor') {\n this.cursor.x = args[1]\n this.cursor.y = args[0]\n this.clampCursor()\n } else if (action === 'move-cursor-y') {\n this.cursor.y += args[0]\n this.clampCursor()\n } else if (action === 'move-cursor-x') {\n this.cursor.x += args[0]\n this.clampCursor()\n } else if (action === 'move-cursor-line') {\n this.cursor.x = 0\n this.cursor.y += args[0]\n this.clampCursor()\n } else if (action === 'set-cursor-x') {\n this.cursor.x = args[0]\n } else if (action === 'set-cursor-style') {\n this.cursor.style = Math.max(0, Math.min(6, args[0]))\n } else if (action === 'reset-style') {\n this.style = TERM_DEFAULT_STYLE\n } else if (action === 'add-attrs') {\n this.style |= (args[0] << 16)\n } else if (action === 'set-color-fg') {\n this.style = (this.style & 0xFFFFFF00) | (1 << 8 << 16) | args[0]\n } else if (action === 'set-color-bg') {\n this.style = (this.style & 0xFFFF00FF) | (1 << 9 << 16) | (args[0] << 8)\n } else if (action === 'reset-color-fg') {\n this.style = this.style & 0xFFFEFF00\n } else if (action === 'reset-color-bg') {\n this.style = this.style & 0xFFFD00FF\n } else if (action === 'hide-cursor') {\n this.cursor.visible = false\n } else if (action === 'show-cursor') {\n this.cursor.visible = true\n }\n }\n write (text) {\n this.parser.write(text)\n this.scheduleLoad()\n }\n serialize () {\n let serialized = 'S'\n serialized += String.fromCodePoint(this.height + 1) + String.fromCodePoint(this.width + 1)\n serialized += String.fromCodePoint(this.cursor.y + 1) + String.fromCodePoint(this.cursor.x + 1)\n\n let attributes = +this.cursor.visible\n attributes |= (3 << 5) * +this.trackMouse // track mouse controls both\n attributes |= 3 << 7 // buttons/links always visible\n attributes |= (this.cursor.style << 9)\n serialized += String.fromCodePoint(attributes + 1)\n\n let lastStyle = null\n let index = 0\n for (let cell of this.screen) {\n let style = cell[1]\n if (this.rainbow) {\n let x = index % this.width\n let y = Math.floor(index / this.width)\n // C instead of F in mask and 1 << 8 in attrs to change attr bits 8 and 9\n style = (style & 0xFFFC0000) | (1 << 8 << 16) | getRainbowColor((x + y) / 10 + Date.now() / 1000)\n index++\n }\n if (style !== lastStyle) {\n let foreground = style & 0xFF\n let background = (style >> 8) & 0xFF\n let attributes = (style >> 16) & 0xFFFF\n let setForeground = foreground !== (lastStyle & 0xFF)\n let setBackground = background !== ((lastStyle >> 8) & 0xFF)\n let setAttributes = attributes !== ((lastStyle >> 16) & 0xFFFF)\n\n if (setForeground && setBackground) serialized += '\\x03' + String.fromCodePoint((style & 0xFFFF) + 1)\n else if (setForeground) serialized += '\\x05' + String.fromCodePoint(foreground + 1)\n else if (setBackground) serialized += '\\x06' + String.fromCodePoint(background + 1)\n if (setAttributes) serialized += '\\x04' + String.fromCodePoint(attributes + 1)\n lastStyle = style\n }\n serialized += cell[0]\n }\n return serialized\n }\n scheduleLoad () {\n clearTimeout(this._scheduledLoad)\n if (this._lastLoad < Date.now() - TERM_MIN_DRAW_DELAY) {\n this.termScreen.load(this.serialize(), { theme: this.theme })\n this.theme = -1 // prevent useless theme setting next time\n } else {\n this._scheduledLoad = setTimeout(() => {\n this.termScreen.load(this.serialize())\n }, TERM_MIN_DRAW_DELAY - this._lastLoad)\n }\n }\n rainbowTimer () {\n if (!this.rainbow) return\n clearInterval(this._rainbowTimer)\n this._rainbowTimer = setInterval(() => {\n if (this.rainbow) this.scheduleLoad()\n }, 50)\n }\n}\n\nclass Process extends EventEmitter {\n write (data) {\n this.emit('in', data)\n }\n destroy () {\n // death.\n this.emit('exit', 0)\n }\n run () {\n // noop\n }\n}\n\nlet demoData = {\n buttons: {\n 1: '',\n 2: '',\n 3: '',\n 4: '',\n 5: function (terminal, shell) {\n if (shell.child) shell.child.destroy()\n let chars = 'info\\r'\n let loop = function () {\n shell.write(chars[0])\n chars = chars.substr(1)\n if (chars) setTimeout(loop, 100)\n }\n setTimeout(loop, 200)\n }\n },\n mouseReceiver: null\n}\n\nlet demoshIndex = {\n clear: class Clear extends Process {\n run () {\n this.emit('write', '\\x1b[2J\\x1b[1;1H')\n this.destroy()\n }\n },\n screenfetch: class Screenfetch extends Process {\n run () {\n let image = `\n ###. ESPTerm Demo\n '###. Hostname: ${window.location.hostname}\n '###. Shell: ESPTerm Demo Shell\n '###. Resolution: 80x25@${window.devicePixelRatio}x\n :###-\n .###'\n .###'\n .###' ###############\n ###' ###############\n `.split('\\n').filter(line => line.trim())\n\n let chars = ''\n for (let y = 0; y < image.length; y++) {\n for (let x = 0; x < 80; x++) {\n if (image[y][x]) {\n chars += `\\x1b[38;5;${getRainbowColor((x + y) / 10)}m${image[y][x]}`\n } else chars += ' '\n }\n }\n\n this.emit('write', '\\r\\n\\x1b[?25l')\n let loop = () => {\n this.emit('write', chars.substr(0, 80))\n chars = chars.substr(80)\n if (chars.length) setTimeout(loop, 50)\n else {\n this.emit('write', '\\r\\n\\x1b[?25h')\n this.destroy()\n }\n }\n loop()\n }\n },\n 'local-echo': class LocalEcho extends Process {\n run (...args) {\n if (!args.includes('--suppress-note')) {\n this.emit('write', '\\x1b[38;5;239mNote: not all terminal features are supported or and may not work as expected in this demo\\x1b[0m\\r\\n')\n }\n }\n write (data) {\n this.emit('write', data)\n }\n },\n 'info': class Info extends Process {\n run (...args) {\n let fast = args.includes('--fast')\n this.showSplash().then(() => {\n this.printText(fast)\n })\n }\n showSplash () {\n let splash = `\n -#####- -###*..#####- ######-\n -#* -#- .## .##. *#-\n -##### .-###*..#####- *#- -*##*- #*-#--#**#-*##-\n -#* -#-.##. *#- *##@#* ##. -#* *# .#*\n -#####--####- .##. *#- -*#@@- ##. -#* *# .#*\n `.split('\\n').filter(line => line.trim())\n let levels = {\n ' ': -231,\n '.': 4,\n '-': 8,\n '*': 17,\n '#': 24\n }\n let characters = {\n ' ': ' ',\n '.': '░',\n '-': '▒',\n '*': '▓',\n '#': '█'\n }\n for (let i in splash) {\n if (splash[i].length < 79) splash[i] += ' '.repeat(79 - splash[i].length)\n }\n this.emit('write', '\\r\\n'.repeat(splash.length + 1))\n this.emit('write', '\\x1b[A'.repeat(splash.length))\n this.emit('write', '\\x1b[?25l')\n\n let cursorX = 0\n let cursorY = 0\n let moveTo = (x, y) => {\n let moveX = x - cursorX\n let moveY = y - cursorY\n this.emit('write', `\\x1b[${Math.abs(moveX)}${moveX > 0 ? 'C' : 'D'}`)\n this.emit('write', `\\x1b[${Math.abs(moveY)}${moveY > 0 ? 'B' : 'A'}`)\n cursorX = x\n cursorY = y\n }\n let drawCell = (x, y) => {\n moveTo(x, y)\n if (splash[y][x] === '@') {\n this.emit('write', '\\x1b[48;5;238m\\x1b[38;5;255m▄\\b')\n } else {\n let level = 231 + levels[splash[y][x]]\n let character = characters[splash[y][x]]\n this.emit('write', `\\x1b[48;5;${level}m\\x1b[38;5;${level}m${character}\\b`)\n }\n }\n return new Promise((resolve, reject) => {\n const self = this\n let x = 14\n let cycles = 0\n let loop = function () {\n for (let y = 0; y < splash.length; y++) {\n let dx = x - y\n if (dx > 0) drawCell(dx, y)\n }\n\n if (++x < 69) {\n if (++cycles >= 3) {\n setTimeout(loop, 20)\n cycles = 0\n } else loop()\n } else {\n moveTo(0, splash.length)\n self.emit('write', '\\x1b[m\\x1b[?25h')\n resolve()\n }\n }\n loop()\n })\n }\n printText (fast = false) {\n // lots of printing\n let parts = [\n '',\n ' ESPTerm is a VT100-like terminal emulator running on the ESP8266 WiFi chip.',\n '',\n ' \\x1b[93mThis is an online demo of the web user interface, simulating a simple ',\n ' terminal in your browser.\\x1b[m',\n '',\n ' Type \\x1b[92mls\\x1b[m to list available commands.',\n ' Use the \\x1b[94mlinks\\x1b[m below this screen for a demo of the options and more info.',\n ''\n ]\n\n if (fast) {\n this.emit('write', parts.join('\\r\\n') + '\\r\\n')\n this.destroy()\n } else {\n const self = this\n let loop = function () {\n self.emit('write', parts.shift() + '\\r\\n')\n if (parts.length) setTimeout(loop, 17)\n else self.destroy()\n }\n loop()\n }\n }\n },\n colors: class PrintColors extends Process {\n run () {\n this.emit('write', '\\r\\n')\n let fgtext = 'foreground-color'\n this.emit('write', ' ')\n for (let i = 0; i < 16; i++) {\n this.emit('write', '\\x1b[' + (i < 8 ? `3${i}` : `9${i - 8}`) + 'm')\n this.emit('write', fgtext[i] + ' ')\n }\n this.emit('write', '\\r\\n ')\n for (let i = 0; i < 16; i++) {\n this.emit('write', '\\x1b[' + (i < 8 ? `4${i}` : `10${i - 8}`) + 'm ')\n }\n this.emit('write', '\\x1b[m\\r\\n')\n for (let r = 0; r < 6; r++) {\n this.emit('write', ' ')\n for (let g = 0; g < 6; g++) {\n for (let b = 0; b < 6; b++) {\n this.emit('write', `\\x1b[48;5;${16 + r * 36 + g * 6 + b}m `)\n }\n this.emit('write', '\\x1b[m')\n }\n this.emit('write', '\\r\\n')\n }\n this.emit('write', ' ')\n for (let g = 0; g < 24; g++) {\n this.emit('write', `\\x1b[48;5;${232 + g}m `)\n }\n this.emit('write', '\\x1b[m\\r\\n\\n')\n this.destroy()\n }\n },\n ls: class ListCommands extends Process {\n run () {\n this.emit('write', '\\x1b[92mList of demo commands\\x1b[m\\r\\n')\n for (let i in demoshIndex) {\n if (typeof demoshIndex[i] === 'string') continue\n this.emit('write', i + '\\r\\n')\n }\n this.destroy()\n }\n },\n theme: class SetTheme extends Process {\n constructor (shell) {\n super()\n this.shell = shell\n }\n run (...args) {\n let theme = +args[0] | 0\n const maxnum = themes.length\n if (!args.length || !Number.isFinite(theme) || theme < 0 || theme >= maxnum) {\n this.emit('write', `\\x1b[31mUsage: theme [0–${maxnum - 1}]\\r\\n`)\n this.destroy()\n return\n }\n this.shell.terminal.theme = theme\n // HACK: reset drawn screen to prevent only partly redrawn screen\n this.shell.terminal.termScreen.drawnScreenFG = []\n this.emit('write', '')\n this.destroy()\n }\n },\n cursor: class SetCursor extends Process {\n run (...args) {\n let steady = args.includes('--steady')\n if (args.includes('block')) {\n this.emit('write', `\\x1b[${2 * steady} q`)\n } else if (args.includes('line')) {\n this.emit('write', `\\x1b[${3 + steady} q`)\n } else if (args.includes('bar') || args.includes('beam')) {\n this.emit('write', `\\x1b[${5 + steady} q`)\n } else {\n this.emit('write', '\\x1b[31mUsage: cursor [block|line|bar] [--steady]\\r\\n')\n }\n this.destroy()\n }\n },\n rainbow: class ToggleRainbow extends Process {\n constructor (shell) {\n super()\n this.shell = shell\n }\n run () {\n this.shell.terminal.rainbow = !this.shell.terminal.rainbow\n this.shell.terminal.rainbowTimer()\n this.emit('write', '')\n this.destroy()\n }\n },\n mouse: class ShowMouse extends Process {\n constructor (shell) {\n super()\n this.shell = shell\n }\n run () {\n this.shell.terminal.trackMouse = true\n demoData.mouseReceiver = this\n this.randomData = []\n this.highlighted = {}\n let characters = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'\n for (let i = 0; i < 23; i++) {\n let line = ''\n for (let j = 0; j < 79; j++) {\n line += characters[Math.floor(characters.length * Math.random())]\n }\n this.randomData.push(line)\n }\n this.scrollOffset = 0\n this.render()\n }\n render () {\n this.emit('write', '\\x1b[m\\x1b[2J\\x1b[1;1H')\n this.emit('write', '\\x1b[97m\\x1b[1mMouse Demo\\r\\n\\x1b[mMouse movement, clicking and scrolling!')\n\n // render random data for scrolling\n for (let y = 0; y < 23; y++) {\n let index = y + this.scrollOffset\n // proper modulo:\n index = ((index % this.randomData.length) + this.randomData.length) % this.randomData.length\n let line = this.randomData[index]\n let lineData = `\\x1b[${3 + y};1H\\x1b[38;5;239m`\n for (let x in line) {\n if (this.highlighted[(y + 2) * 80 + (+x)]) lineData += '\\x1b[97m'\n lineData += line[x]\n if (this.highlighted[(y + 2) * 80 + (+x)]) lineData += '\\x1b[38;5;239m'\n }\n this.emit('write', lineData)\n }\n\n // move cursor to mouse\n if (this.mouse) {\n this.emit('write', `\\x1b[${this.mouse.y + 1};${this.mouse.x + 1}H`)\n }\n }\n mouseMove (x, y) {\n this.mouse = { x, y }\n this.render()\n }\n mouseDown (x, y, button) {\n if (button === 4) this.scrollOffset--\n else if (button === 5) this.scrollOffset++\n else this.highlighted[y * 80 + x] = !this.highlighted[y * 80 + x]\n this.render()\n }\n mouseUp (x, y, button) {}\n destroy () {\n this.shell.terminal.write('\\x1b[2J\\x1b[1;1H')\n this.shell.terminal.trackMouse = false\n if (demoData.mouseReceiver === this) demoData.mouseReceiver = null\n super.destroy()\n }\n },\n sudo: class Sudo extends Process {\n constructor (shell) {\n super()\n this.shell = shell\n }\n run (...args) {\n if (args.length === 0) {\n this.emit('write', '\\x1b[31mUsage: sudo \\x1b[m\\r\\n')\n this.destroy()\n } else if (args.length === 4 && args.join(' ').toLowerCase() === 'make me a sandwich') {\n const b = '\\x1b[33m'\n const r = '\\x1b[0m'\n const l = '\\x1b[32m'\n const c = '\\x1b[38;5;229m'\n const h = '\\x1b[38;5;225m'\n this.emit('write',\n ` ${b}_.---._\\r\\n` +\n ` _.-~ ~-._\\r\\n` +\n ` _.-~ ~-._\\r\\n` +\n ` _.-~ ~---._\\r\\n` +\n ` _.-~ ~\\\\\\r\\n` +\n ` .-~ _.;\\r\\n` +\n ` :-._ _.-~ ./\\r\\n` +\n ` \\`-._~-._ _..__.-~ _.-~\\r\\n` +\n ` ${c}/ ${b}~-._~-._ / .__..--${c}~-${l}---._\\r\\n` +\n `${c} \\\\_____(_${b};-._\\\\. _.-~_/${c} ~)${l}.. . \\\\\\r\\n` +\n `${l} /(_____ ${b}\\\\\\`--...--~_.-~${c}______..-+${l}_______)\\r\\n` +\n `${l} .(_________/${b}\\`--...--~/${l} _/ ${h} ${b}/\\\\\\r\\n` +\n `${b} /-._${h} \\\\_ ${l}(___./_..-~${h}__.....${b}__..-~./\\r\\n` +\n `${b} \\`-._~-._${h} ~\\\\--------~ .-~${b}_..__.-~ _.-~\\r\\n` +\n `${b} ~-._~-._ ${h}~---------\\` ${b}/ .__..--~\\r\\n` +\n `${b} ~-._\\\\. _.-~_/\\r\\n` +\n `${b} \\\\\\`--...--~_.-~\\r\\n` +\n `${b} \\`--...--~${r}\\r\\n`)\n this.destroy()\n } else {\n let name = args.shift()\n if (this.shell.index[name]) {\n let Process = this.shell.index[name]\n if (Process instanceof Function) {\n let child = new Process(this)\n let write = data => this.emit('write', data)\n child.on('write', write)\n child.on('exit', code => {\n child.removeListener('write', write)\n this.destroy()\n })\n child.run(...args)\n } else {\n this.emit('write', Process)\n this.destroy()\n }\n } else {\n this.emit('write', `sudo: ${name}: command not found\\r\\n`)\n this.destroy()\n }\n }\n }\n },\n make: class Make extends Process {\n run (...args) {\n if (args.length === 0) this.emit('write', '\\x1b[31mmake: *** No targets specified. Stop.\\x1b[0m\\r\\n')\n else if (args.length === 3 && args.join(' ').toLowerCase() === 'me a sandwich') {\n this.emit('write', '\\x1b[31mmake: me a sandwich : Permission denied\\x1b[0m\\r\\n')\n } else {\n this.emit('write', `\\x1b[31mmake: *** No rule to make target '${args.join(' ').toLowerCase()}'. Stop.\\x1b[0m\\r\\n`)\n }\n this.destroy()\n }\n },\n pwd: '/this/is/a/demo\\r\\n',\n cd: '\\x1b[38;5;239mNo directories to change to\\r\\n',\n whoami: `${window.navigator.userAgent}\\r\\n`,\n hostname: `${window.location.hostname}`,\n uname: 'ESPTerm Demo\\r\\n',\n mkdir: '\\x1b[38;5;239mDid not create a directory because this is a demo.\\r\\n',\n rm: '\\x1b[38;5;239mDid not delete anything because this is a demo.\\r\\n',\n cp: '\\x1b[38;5;239mNothing to copy because this is a demo.\\r\\n',\n mv: '\\x1b[38;5;239mNothing to move because this is a demo.\\r\\n',\n ln: '\\x1b[38;5;239mNothing to link because this is a demo.\\r\\n',\n touch: '\\x1b[38;5;239mNothing to touch\\r\\n',\n exit: '\\x1b[38;5;239mNowhere to go\\r\\n',\n github: class GoToGithub extends Process {\n run () {\n window.open('https://github.com/espterm/espterm-firmware')\n this.destroy()\n }\n }\n}\n\nclass DemoShell {\n constructor (terminal, printInfo) {\n this.terminal = terminal\n this.terminal.reset()\n this.parser = new ANSIParser((...args) => this.handleParsed(...args))\n this.history = []\n this.historyIndex = 0\n this.cursorPos = 0\n this.child = null\n this.index = demoshIndex\n\n if (printInfo) this.run('info')\n else this.prompt()\n }\n write (text) {\n if (this.child) {\n if (text.codePointAt(0) === 3) this.child.destroy()\n else this.child.write(text)\n } else this.parser.write(text)\n }\n prompt (success = true) {\n if (this.terminal.cursor.x !== 0) this.terminal.write('\\x1b[m\\x1b[38;5;238m⏎\\r\\n')\n this.terminal.write('\\x1b[34;1mdemosh \\x1b[m')\n if (!success) this.terminal.write('\\x1b[31m')\n this.terminal.write('$ \\x1b[m')\n this.history.unshift('')\n this.cursorPos = 0\n }\n copyFromHistoryIndex () {\n if (!this.historyIndex) return\n let current = this.history[this.historyIndex]\n this.history[0] = current\n this.historyIndex = 0\n }\n handleParsed (action, ...args) {\n this.terminal.write('\\b\\x1b[P'.repeat(this.cursorPos))\n if (action === 'write') {\n this.copyFromHistoryIndex()\n this.history[0] = this.history[0].substr(0, this.cursorPos) + args[0] + this.history[0].substr(this.cursorPos)\n this.cursorPos++\n } else if (action === 'back') {\n this.copyFromHistoryIndex()\n this.history[0] = this.history[0].substr(0, this.cursorPos - 1) + this.history[0].substr(this.cursorPos)\n this.cursorPos--\n if (this.cursorPos < 0) this.cursorPos = 0\n } else if (action === 'tab') {\n console.warn('TAB not implemented') // TODO completion\n } else if (action === 'move-cursor-x') {\n this.cursorPos = Math.max(0, Math.min(this.history[this.historyIndex].length, this.cursorPos + args[0]))\n } else if (action === 'delete-line') {\n this.copyFromHistoryIndex()\n this.history[0] = ''\n this.cursorPos = 0\n } else if (action === 'delete-word') {\n this.copyFromHistoryIndex()\n let words = this.history[0].substr(0, this.cursorPos).split(' ')\n words.pop()\n this.history[0] = words.join(' ') + this.history[0].substr(this.cursorPos)\n this.cursorPos = words.join(' ').length\n } else if (action === 'move-cursor-y') {\n this.historyIndex -= args[0]\n if (this.historyIndex < 0) this.historyIndex = 0\n if (this.historyIndex >= this.history.length) this.historyIndex = this.history.length - 1\n this.cursorPos = this.history[this.historyIndex].length\n }\n\n this.terminal.write(this.history[this.historyIndex])\n this.terminal.write('\\b'.repeat(this.history[this.historyIndex].length))\n this.terminal.moveForward(this.cursorPos)\n this.terminal.write('') // dummy. Apply the moveFoward\n\n if (action === 'return') {\n this.terminal.write('\\r\\n')\n this.parse(this.history[this.historyIndex])\n }\n }\n parse (input) {\n if (input === 'help') input = 'info'\n // TODO: basic chaining (i.e. semicolon)\n this.run(input)\n }\n run (command) {\n let parts = ['']\n\n let inQuote = false\n for (let character of command.trim()) {\n if (inQuote && character !== inQuote) {\n parts[parts.length - 1] += character\n } else if (inQuote) {\n inQuote = false\n } else if (character === '\"' || character === \"'\") {\n inQuote = character\n } else if (character.match(/\\s/)) {\n if (parts[parts.length - 1]) parts.push('')\n } else parts[parts.length - 1] += character\n }\n\n let name = parts.shift()\n\n if (name in this.index) {\n this.spawn(name, parts)\n } else {\n this.terminal.write(`demosh: Unknown command: ${name}\\r\\n`)\n this.prompt(false)\n }\n }\n spawn (name, args = []) {\n let Process = this.index[name]\n if (Process instanceof Function) {\n this.child = new Process(this)\n let write = data => this.terminal.write(data)\n this.child.on('write', write)\n this.child.on('exit', code => {\n if (this.child) this.child.removeListener('write', write)\n this.child = null\n this.prompt(!code)\n })\n this.child.run(...args)\n } else {\n this.terminal.write(Process)\n this.prompt()\n }\n }\n}\n\nwindow.demoInterface = module.exports = {\n input (data) {\n let type = data[0]\n let content = data.substr(1)\n\n if (type === 's') {\n this.shell.write(content)\n } else if (type === 'b') {\n let button = content.charCodeAt(0)\n let action = demoData.buttons[button]\n if (action) {\n if (typeof action === 'string') this.shell.write(action)\n else if (action instanceof Function) action(this.terminal, this.shell)\n }\n } else if (type === 'm' || type === 'p' || type === 'r') {\n let row = parse2B(content, 0)\n let column = parse2B(content, 2)\n let button = parse2B(content, 4)\n let modifiers = parse2B(content, 6)\n\n if (demoData.mouseReceiver) {\n if (type === 'm') demoData.mouseReceiver.mouseMove(column, row, button, modifiers)\n else if (type === 'p') demoData.mouseReceiver.mouseDown(column, row, button, modifiers)\n else if (type === 'r') demoData.mouseReceiver.mouseUp(column, row, button, modifiers)\n }\n }\n },\n didInit: false,\n init (screen) {\n if (this.didInit) return\n this.didInit = true\n this.terminal = new ScrollingTerminal(screen)\n this.shell = new DemoShell(this.terminal, true)\n }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./js/term/demo.js","require('./lib/polyfills')\nrequire('./modal')\nrequire('./notif')\nrequire('./appcommon')\ntry { require('./term/demo') } catch (err) {}\nrequire('./wifi')\n\nconst $ = require('./lib/chibi')\nconst { qs } = require('./utils')\n\n/* Export stuff to the global scope for inline scripts */\nwindow.termInit = require('./term')\nwindow.$ = $\nwindow.qs = qs\n\nwindow.themes = require('./term/themes')\n\n\n\n// WEBPACK FOOTER //\n// ./js/index.js","/*! http://mths.be/fromcodepoint v0.1.0 by @mathias */\nif (!String.fromCodePoint) {\n (function () {\n var defineProperty = (function () {\n // IE 8 only supports `Object.defineProperty` on DOM elements\n try {\n var object = {};\n var $defineProperty = Object.defineProperty;\n var result = $defineProperty(object, object, object) && $defineProperty;\n } catch (error) {\n }\n return result;\n }());\n var stringFromCharCode = String.fromCharCode;\n var floor = Math.floor;\n var fromCodePoint = function () {\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 if (defineProperty) {\n defineProperty(String, 'fromCodePoint', {\n 'value': fromCodePoint,\n 'configurable': true,\n 'writable': true\n });\n } else {\n String.fromCodePoint = fromCodePoint;\n }\n }());\n}\n\n\n\n// WEBPACK FOOTER //\n// ./js/lib/polyfills.js","const $ = require('./lib/chibi')\nconst { mk, qs, qsa, cr } = require('./utils')\nconst modal = require('./modal')\nconst notify = require('./notif')\n\n/** Global generic init */\n$.ready(function () {\n // Opening menu on mobile / narrow screen\n function menuOpen () {\n $('#menu').toggleClass('expanded')\n }\n $('#brand')\n .on('click', menuOpen)\n .on('keypress', cr(menuOpen))\n\n // Checkbox UI (checkbox CSS and hidden input with int value)\n $('.Row.checkbox').forEach(function (x) {\n let inp = x.querySelector('input')\n let box = x.querySelector('.box')\n\n $(box).toggleClass('checked', inp.value)\n\n let hdl = function () {\n inp.value = 1 - inp.value\n $(box).toggleClass('checked', inp.value)\n }\n\n $(x).on('click', hdl).on('keypress', cr(hdl))\n })\n\n // Expanding boxes on mobile\n $('.Box.mobcol,.Box.fold').forEach(function (x) {\n let h = x.querySelector('h2')\n\n let hdl = function () {\n $(x).toggleClass('expanded')\n }\n $(h).on('click', hdl).on('keypress', cr(hdl))\n })\n\n $('form').forEach(function (x) {\n $(x).on('keypress', function (e) {\n if ((e.keyCode === 10 || e.keyCode === 13) && e.ctrlKey) {\n x.submit()\n }\n })\n })\n\n // loader dots...\n setInterval(function () {\n $('.anim-dots').each(function (x) {\n let $x = $(x)\n let dots = $x.html() + '.'\n if (dots.length === 5) dots = '.'\n $x.html(dots)\n })\n }, 1000)\n\n // flipping number boxes with the mouse wheel\n $('input[type=number]').on('mousewheel', function (e) {\n let $this = $(this)\n let val = +$this.val()\n if (isNaN(val)) val = 1\n\n const step = +($this.attr('step') || 1)\n const min = +$this.attr('min')\n const max = +$this.attr('max')\n if (e.wheelDelta > 0) {\n val += step\n } else {\n val -= step\n }\n\n if (!Number.isFinite(min)) val = Math.max(val, +min)\n if (!Number.isFinite(max)) val = Math.min(val, +max)\n $this.val(val)\n\n if ('createEvent' in document) {\n let evt = document.createEvent('HTMLEvents')\n evt.initEvent('change', false, true)\n $this[0].dispatchEvent(evt)\n } else {\n $this[0].fireEvent('onchange')\n }\n\n e.preventDefault()\n })\n\n // populate the form errors box from GET arg ?err=...\n // (a way to pass errors back from server via redirect)\n let errAt = window.location.search.indexOf('err=')\n if (errAt !== -1 && qs('.Box.errors')) {\n let errs = window.location.search.substr(errAt + 4).split(',')\n let humanReadableErrors = []\n errs.forEach(function (er) {\n let lbls = qsa('label[for=\"' + er + '\"]')\n for (let i = 0; i < lbls.length; i++) {\n let lbl = lbls[i]\n lbl.classList.add('error')\n if (i === 0) humanReadableErrors.push(lbl.childNodes[0].textContent.trim().replace(/: ?$/, ''))\n }\n // else {\n // hres.push(er)\n // }\n })\n\n qs('.Box.errors .list').innerHTML = humanReadableErrors.join(', ')\n qs('.Box.errors').classList.remove('hidden')\n }\n\n modal.init()\n notify.init()\n\n // remove tabindices from h2 if wide\n if (window.innerWidth > 550) {\n $('.Box h2').forEach(function (x) {\n x.removeAttribute('tabindex')\n })\n\n // brand works as a link back to term in widescreen mode\n let br = qs('#brand')\n br && br.addEventListener('click', function () {\n window.location.href = '/' // go to terminal\n })\n }\n})\n\n// setup the ajax loader\n$._loader = function (vis) {\n $('#loader').toggleClass('show', vis)\n}\n\nlet pageShown = false\n// reveal content on load\nfunction showPage () {\n pageShown = true\n $('#content').addClass('load')\n}\n// HACKITY HACK: fix this later\nwindow.showPage = showPage\n\n// Auto reveal pages other than the terminal (sets window.noAutoShow)\n$.ready(function () {\n if (window.noAutoShow === true) {\n setTimeout(function () {\n if (!pageShown) {\n let bnr = mk('P')\n bnr.id = 'load-failed'\n bnr.innerHTML =\n 'Server connection failed! Trying again' +\n '.'\n qs('#screen').appendChild(bnr)\n showPage()\n }\n }, 2000)\n } else {\n setTimeout(function () {\n showPage()\n }, 1)\n }\n})\n\n\n\n// WEBPACK FOOTER //\n// ./js/appcommon.js","const $ = require('./lib/chibi')\nconst { mk, bool } = require('./utils')\nconst tr = require('./lang')\n\n;(function (w) {\n const authStr = ['Open', 'WEP', 'WPA', 'WPA2', 'WPA/WPA2']\n let curSSID\n\n // Get XX % for a slider input\n function rangePt (inp) {\n return Math.round(((inp.value / inp.max) * 100)) + '%'\n }\n\n // Display selected STA SSID etc\n function selectSta (name, password, ip) {\n $('#sta_ssid').val(name)\n $('#sta_password').val(password)\n\n $('#sta-nw').toggleClass('hidden', name.length === 0)\n $('#sta-nw-nil').toggleClass('hidden', name.length > 0)\n\n $('#sta-nw .essid').html($.htmlEscape(name))\n const nopw = !password || password.length === 0\n $('#sta-nw .passwd').toggleClass('hidden', nopw)\n $('#sta-nw .nopasswd').toggleClass('hidden', !nopw)\n $('#sta-nw .ip').html(ip.length > 0 ? tr('wifi.connected_ip_is') + ip : tr('wifi.not_conn'))\n }\n\n /** Update display for received response */\n function onScan (resp, status) {\n // var ap_json = {\n // \"result\": {\n // \"inProgress\": \"0\",\n // \"APs\": [\n // {\"essid\": \"Chlivek\", \"bssid\": \"88:f7:c7:52:b3:99\", \"rssi\": \"204\", \"enc\": \"4\", \"channel\": \"1\"},\n // {\"essid\": \"TyNikdy\", \"bssid\": \"5c:f4:ab:0d:f1:1b\", \"rssi\": \"164\", \"enc\": \"3\", \"channel\": \"1\"},\n // ]\n // }\n // };\n\n if (status !== 200) {\n // bad response\n rescan(5000) // wait 5sm then retry\n return\n }\n\n try {\n resp = JSON.parse(resp)\n } catch (e) {\n console.log(e)\n rescan(5000)\n return\n }\n\n const done = !bool(resp.result.inProgress) && (resp.result.APs.length > 0)\n rescan(done ? 15000 : 1000)\n if (!done) return // no redraw yet\n\n // clear the AP list\n let $list = $('#ap-list')\n // remove old APs\n $('#ap-list .AP').remove()\n\n $list.toggleClass('hidden', !done)\n $('#ap-loader').toggleClass('hidden', done)\n\n // scan done\n resp.result.APs.sort(function (a, b) {\n return b.rssi - a.rssi\n }).forEach(function (ap) {\n ap.enc = parseInt(ap.enc)\n\n if (ap.enc > 4) return // hide unsupported auths\n\n let item = mk('div')\n\n let $item = $(item)\n .data('ssid', ap.essid)\n .data('pwd', ap.enc)\n .attr('tabindex', 0)\n .addClass('AP')\n\n // mark current SSID\n if (ap.essid === curSSID) {\n $item.addClass('selected')\n }\n\n let inner = mk('div')\n let escapedSSID = $.htmlEscape(ap.essid)\n $(inner).addClass('inner')\n .htmlAppend(`
${ap.rssi_perc}
`)\n .htmlAppend(`
${escapedSSID}
`)\n .htmlAppend(`
${authStr[ap.enc]}
`)\n\n $item.on('click', function () {\n let $th = $(this)\n\n const conn_ssid = $th.data('ssid')\n let conn_pass = ''\n\n if (+$th.data('pwd')) {\n // this AP needs a password\n conn_pass = window.prompt(tr('wifi.enter_passwd').replace(':ssid:', conn_ssid))\n if (!conn_pass) return\n }\n\n $('#sta_password').val(conn_pass)\n $('#sta_ssid').val(conn_ssid)\n selectSta(conn_ssid, conn_pass, '')\n })\n\n item.appendChild(inner)\n $list[0].appendChild(item)\n })\n }\n\n function startScanning () {\n $('#ap-loader').removeClass('hidden')\n $('#ap-scan').addClass('hidden')\n $('#ap-loader .anim-dots').html('.')\n\n scanAPs()\n }\n\n /** Ask the CGI what APs are visible (async) */\n function scanAPs () {\n if (window._demo) {\n onScan(window._demo_aps, 200)\n } else {\n $.get('http://' + window._root + '/cfg/wifi/scan', onScan)\n }\n }\n\n function rescan (time) {\n setTimeout(scanAPs, time)\n }\n\n /** Set up the WiFi page */\n function wifiInit (cfg) {\n // Update slider value displays\n $('.Row.range').forEach(function (x) {\n let inp = x.querySelector('input')\n let disp1 = x.querySelector('.x-disp1')\n let disp2 = x.querySelector('.x-disp2')\n let t = rangePt(inp)\n $(disp1).html(t)\n $(disp2).html(t)\n $(inp).on('input', function () {\n t = rangePt(inp)\n $(disp1).html(t)\n $(disp2).html(t)\n })\n })\n\n // Forget STA credentials\n $('#forget-sta').on('click', () => {\n selectSta('', '', '')\n return false\n })\n\n selectSta(cfg.sta_ssid, cfg.sta_password, cfg.sta_active_ip)\n curSSID = cfg.sta_active_ssid\n }\n\n w.init = wifiInit\n w.startScanning = startScanning\n})(window.WiFi = {})\n\n\n\n// WEBPACK FOOTER //\n// ./js/wifi.js","// Generated from PHP locale file\nlet _tr = {\n \"wifi.connected_ip_is\": \"Connected, IP is \",\n \"wifi.not_conn\": \"Not connected.\",\n \"wifi.enter_passwd\": \"Enter password for \\\":ssid:\\\"\"\n};\n\nmodule.exports = function tr (key) { return _tr[key] || '?' + key + '?' }\n\n\n\n// WEBPACK FOOTER //\n// ./js/lang.js","const { qs, mk } = require('../utils')\nconst Notify = require('../notif')\nconst TermScreen = require('./screen')\nconst TermConnection = require('./connection')\nconst TermInput = require('./input')\nconst TermUpload = require('./upload')\nconst initSoftKeyboard = require('./soft_keyboard')\nconst attachDebugScreen = require('./debug_screen')\n\n/** Init the terminal sub-module - called from HTML */\nmodule.exports = function (opts) {\n const screen = new TermScreen()\n const conn = new TermConnection(screen)\n const input = TermInput(conn, screen)\n const termUpload = TermUpload(conn, input, screen)\n screen.input = input\n input.termUpload = termUpload\n\n // we delay the display of \"connecting\" to avoid flash when changing tabs with the terminal open\n let showConnectingTimeout = -1\n conn.on('open', () => {\n showConnectingTimeout = setTimeout(() => {\n screen.window.statusScreen = { title: 'Connecting', loading: true }\n }, 250)\n })\n conn.on('connect', () => {\n clearTimeout(showConnectingTimeout)\n screen.window.statusScreen = { title: 'Waiting for content', loading: true }\n })\n conn.on('load', () => {\n if (screen.window.statusScreen) screen.window.statusScreen = null\n })\n conn.on('disconnect', () => {\n clearTimeout(showConnectingTimeout)\n screen.window.statusScreen = { title: 'Disconnected' }\n screen.screen = []\n screen.screenFG = []\n screen.screenBG = []\n screen.screenAttrs = []\n })\n conn.on('silence', () => { screen.window.statusScreen = { title: 'Waiting for server', loading: true } })\n // conn.on('ping-fail', () => { screen.window.statusScreen = { title: 'Disconnected' } })\n conn.on('ping-success', () => { screen.window.statusScreen = { title: 'Re-connecting', loading: true } })\n\n conn.init()\n input.init(opts)\n termUpload.init()\n Notify.init()\n\n window.onerror = function (errorMsg, file, line, col) {\n Notify.show(`JS ERROR!
${errorMsg}
at ${file}:${line}:${col}`, 10000, true)\n return false\n }\n\n qs('#screen').appendChild(screen.canvas)\n screen.load(opts.labels, opts) // load labels and theme\n\n initSoftKeyboard(screen, input)\n if (attachDebugScreen) attachDebugScreen(screen)\n\n let isFullscreen = false\n let fitScreen = false\n let fitScreenIfNeeded = function fitScreenIfNeeded () {\n if (isFullscreen) {\n screen.window.fitIntoWidth = window.screen.width\n screen.window.fitIntoHeight = window.screen.height\n } else {\n screen.window.fitIntoWidth = fitScreen ? window.innerWidth - 20 : 0\n screen.window.fitIntoHeight = fitScreen ? window.innerHeight : 0\n }\n }\n fitScreenIfNeeded()\n window.addEventListener('resize', fitScreenIfNeeded)\n\n let toggleFitScreen = function () {\n fitScreen = !fitScreen\n const resizeButtonIcon = qs('#resize-button-icon')\n if (fitScreen) {\n resizeButtonIcon.classList.remove('icn-resize-small')\n resizeButtonIcon.classList.add('icn-resize-full')\n } else {\n resizeButtonIcon.classList.remove('icn-resize-full')\n resizeButtonIcon.classList.add('icn-resize-small')\n }\n fitScreenIfNeeded()\n }\n\n qs('#term-fit-screen').addEventListener('click', function () {\n toggleFitScreen()\n return false\n })\n\n // add fullscreen mode & button\n if (window.Element.prototype.requestFullscreen || window.Element.prototype.webkitRequestFullscreen) {\n let checkForFullscreen = function () {\n // document.fullscreenElement is not really supported yet, so here's a hack\n if (isFullscreen && (window.innerWidth !== window.screen.width || window.innerHeight !== window.screen.height)) {\n isFullscreen = false\n fitScreenIfNeeded()\n }\n }\n setInterval(checkForFullscreen, 500)\n\n // (why are the buttons anchors?)\n let button = mk('a')\n button.href = '#'\n button.addEventListener('click', e => {\n e.preventDefault()\n\n isFullscreen = true\n fitScreenIfNeeded()\n screen.updateSize()\n\n if (screen.canvas.requestFullscreen) screen.canvas.requestFullscreen()\n else screen.canvas.webkitRequestFullscreen()\n })\n let icon = mk('i')\n icon.classList.add('icn-resize-full') // TODO: less confusing icons\n button.appendChild(icon)\n let span = mk('span')\n span.textContent = 'Fullscreen'\n button.appendChild(span)\n qs('#term-nav').insertBefore(button, qs('#term-nav').firstChild)\n }\n\n // for debugging\n window.termScreen = screen\n window.conn = conn\n window.input = input\n window.termUpl = termUpload\n}\n\n\n\n// WEBPACK FOOTER //\n// ./js/term/index.js","const EventEmitter = require('events')\nconst $ = require('../lib/chibi')\nconst { mk, qs } = require('../utils')\nconst notify = require('../notif')\nconst ScreenParser = require('./screen_parser')\nconst ScreenRenderer = require('./screen_renderer')\n\nmodule.exports = class TermScreen extends EventEmitter {\n constructor () {\n super()\n\n this.canvas = mk('canvas')\n this.ctx = this.canvas.getContext('2d')\n\n this.parser = new ScreenParser(this)\n this.renderer = new ScreenRenderer(this)\n\n // debug screen handle\n this._debug = null\n\n if ('AudioContext' in window || 'webkitAudioContext' in window) {\n this.audioCtx = new (window.AudioContext || window.webkitAudioContext)()\n } else {\n console.warn('No AudioContext!')\n }\n\n // dummy. Handle for Input\n this.input = new Proxy({}, {\n get () {\n return () => console.warn('TermScreen#input not set!')\n }\n })\n\n this.cursor = {\n x: 0,\n y: 0,\n blinking: true,\n visible: true,\n hanging: false,\n style: 'block'\n }\n\n this._window = {\n width: 0,\n height: 0,\n devicePixelRatio: 1,\n fontFamily: '\"DejaVu Sans Mono\", \"Liberation Mono\", \"Inconsolata\", \"Menlo\", monospace',\n fontSize: 20,\n gridScaleX: 1.0,\n gridScaleY: 1.2,\n fitIntoWidth: 0,\n fitIntoHeight: 0,\n debug: false,\n graphics: 0,\n statusScreen: null\n }\n\n // scaling caused by fitIntoWidth/fitIntoHeight\n this._windowScale = 1\n\n // properties of this.window that require updating size and redrawing\n this.windowState = {\n width: 0,\n height: 0,\n devicePixelRatio: 0,\n gridScaleX: 0,\n gridScaleY: 0,\n fontFamily: '',\n fontSize: 0,\n fitIntoWidth: 0,\n fitIntoHeight: 0\n }\n\n // current selection\n this.selection = {\n // when false, this will prevent selection in favor of mouse events,\n // though alt can be held to override it\n selectable: true,\n\n // selection start and end (x, y) tuples\n start: [0, 0],\n end: [0, 0]\n }\n\n // mouse features\n this.mouseMode = { clicks: false, movement: false }\n\n // make writing to window update size and draw\n const self = this\n this.window = new Proxy(this._window, {\n set (target, key, value, receiver) {\n target[key] = value\n self.scheduleSizeUpdate()\n self.renderer.scheduleDraw(`window:${key}=${value}`)\n self.emit(`update-window:${key}`, value)\n return true\n }\n })\n\n this.bracketedPaste = false\n this.blinkingCellCount = 0\n this.reverseVideo = false\n\n this.screen = []\n this.screenFG = []\n this.screenBG = []\n this.screenAttrs = []\n\n let selecting = false\n\n let selectStart = (x, y) => {\n if (selecting) return\n selecting = true\n this.selection.start = this.selection.end = this.screenToGrid(x, y, true)\n this.renderer.scheduleDraw('select-start')\n }\n\n let selectMove = (x, y) => {\n if (!selecting) return\n this.selection.end = this.screenToGrid(x, y, true)\n this.renderer.scheduleDraw('select-move')\n }\n\n let selectEnd = (x, y) => {\n if (!selecting) return\n selecting = false\n this.selection.end = this.screenToGrid(x, y, true)\n this.renderer.scheduleDraw('select-end')\n Object.assign(this.selection, this.getNormalizedSelection())\n }\n\n // bind event listeners\n\n this.canvas.addEventListener('mousedown', e => {\n if ((this.selection.selectable || e.altKey) && e.button === 0) {\n selectStart(e.offsetX, e.offsetY)\n } else {\n this.input.onMouseDown(...this.screenToGrid(e.offsetX, e.offsetY),\n e.button + 1)\n }\n })\n\n window.addEventListener('mousemove', e => {\n selectMove(e.offsetX, e.offsetY)\n })\n\n window.addEventListener('mouseup', e => {\n selectEnd(e.offsetX, e.offsetY)\n })\n\n // touch event listeners\n\n let touchPosition = null\n let touchDownTime = 0\n let touchSelectMinTime = 500\n let touchDidMove = false\n\n let getTouchPositionOffset = touch => {\n let rect = this.canvas.getBoundingClientRect()\n return [touch.clientX - rect.left, touch.clientY - rect.top]\n }\n\n this.canvas.addEventListener('touchstart', e => {\n touchPosition = getTouchPositionOffset(e.touches[0])\n touchDidMove = false\n touchDownTime = Date.now()\n })\n\n this.canvas.addEventListener('touchmove', e => {\n touchPosition = getTouchPositionOffset(e.touches[0])\n\n if (!selecting && touchDidMove === false) {\n if (touchDownTime < Date.now() - touchSelectMinTime) {\n selectStart(...touchPosition)\n }\n } else if (selecting) {\n e.preventDefault()\n selectMove(...touchPosition)\n }\n\n touchDidMove = true\n })\n\n this.canvas.addEventListener('touchend', e => {\n if (e.touches[0]) {\n touchPosition = getTouchPositionOffset(e.touches[0])\n }\n\n if (selecting) {\n e.preventDefault()\n selectEnd(...touchPosition)\n\n // selection ended; show touch select menu\n let touchSelectMenu = qs('#touch-select-menu')\n touchSelectMenu.classList.add('open')\n let rect = touchSelectMenu.getBoundingClientRect()\n\n // use middle position for x and one line above for y\n let selectionPos = this.gridToScreen(\n (this.selection.start[0] + this.selection.end[0]) / 2,\n this.selection.start[1] - 1\n )\n selectionPos[0] -= rect.width / 2\n selectionPos[1] -= rect.height / 2\n touchSelectMenu.style.transform = `translate(${selectionPos[0]}px, ${\n selectionPos[1]}px)`\n }\n\n if (!touchDidMove) {\n this.emit('tap', Object.assign(e, {\n x: touchPosition[0],\n y: touchPosition[1]\n }))\n }\n\n touchPosition = null\n })\n\n this.on('tap', e => {\n if (this.selection.start[0] !== this.selection.end[0] ||\n this.selection.start[1] !== this.selection.end[1]) {\n // selection is not empty\n // reset selection\n this.selection.start = this.selection.end = [0, 0]\n qs('#touch-select-menu').classList.remove('open')\n this.renderer.scheduleDraw('select-reset')\n } else {\n e.preventDefault()\n this.emit('open-soft-keyboard')\n }\n })\n\n $.ready(() => {\n let copyButton = qs('#touch-select-copy-btn')\n if (copyButton) {\n copyButton.addEventListener('click', () => {\n this.copySelectionToClipboard()\n })\n }\n })\n\n this.canvas.addEventListener('mousemove', e => {\n if (!selecting) {\n this.input.onMouseMove(...this.screenToGrid(e.offsetX, e.offsetY))\n }\n })\n\n this.canvas.addEventListener('mouseup', e => {\n if (!selecting) {\n this.input.onMouseUp(...this.screenToGrid(e.offsetX, e.offsetY),\n e.button + 1)\n }\n })\n\n this.canvas.addEventListener('wheel', e => {\n if (this.mouseMode.clicks) {\n this.input.onMouseWheel(...this.screenToGrid(e.offsetX, e.offsetY),\n e.deltaY > 0 ? 1 : -1)\n\n // prevent page scrolling\n e.preventDefault()\n }\n })\n\n this.canvas.addEventListener('contextmenu', e => {\n if (this.mouseMode.clicks) {\n // prevent mouse keys getting stuck\n e.preventDefault()\n }\n selectEnd(e.offsetX, e.offsetY)\n })\n }\n\n /**\n * Schedule a size update in the next millisecond\n */\n scheduleSizeUpdate () {\n clearTimeout(this._scheduledSizeUpdate)\n this._scheduledSizeUpdate = setTimeout(() => this.updateSize(), 1)\n }\n\n /**\n * Returns a CSS font string with this TermScreen's font settings and the\n * font modifiers.\n * @param {Object} modifiers\n * @param {string} [modifiers.style] - the font style\n * @param {string} [modifiers.weight] - the font weight\n * @returns {string} a CSS font string\n */\n getFont (modifiers = {}) {\n let fontStyle = modifiers.style || 'normal'\n let fontWeight = modifiers.weight || 'normal'\n return `${fontStyle} normal ${fontWeight} ${this.window.fontSize}px ${this.window.fontFamily}`\n }\n\n /**\n * Converts screen coordinates to grid coordinates.\n * @param {number} x - x in pixels\n * @param {number} y - y in pixels\n * @param {boolean} rounded - whether to round the coord, used for select highlighting\n * @returns {number[]} a tuple of (x, y) in cells\n */\n screenToGrid (x, y, rounded = false) {\n let cellSize = this.getCellSize()\n\n return [\n Math.floor((x + (rounded ? cellSize.width / 2 : 0)) / cellSize.width),\n Math.floor(y / cellSize.height)\n ]\n }\n\n /**\n * Converts grid coordinates to screen coordinates.\n * @param {number} x - x in cells\n * @param {number} y - y in cells\n * @param {boolean} [withScale] - when true, will apply window scale\n * @returns {number[]} a tuple of (x, y) in pixels\n */\n gridToScreen (x, y, withScale = false) {\n let cellSize = this.getCellSize()\n\n return [x * cellSize.width, y * cellSize.height].map(v => withScale ? v * this._windowScale : v)\n }\n\n /**\n * The character size, used for calculating the cell size. The space character\n * is used for measuring.\n * @returns {Object} the character size with `width` and `height` in pixels\n */\n getCharSize () {\n this.ctx.font = this.getFont()\n\n return {\n width: Math.floor(this.ctx.measureText(' ').width),\n height: this.window.fontSize\n }\n }\n\n /**\n * The cell size, which is the character size multiplied by the grid scale.\n * @returns {Object} the cell size with `width` and `height` in pixels\n */\n getCellSize () {\n let charSize = this.getCharSize()\n\n return {\n width: Math.ceil(charSize.width * this.window.gridScaleX),\n height: Math.ceil(charSize.height * this.window.gridScaleY)\n }\n }\n\n /**\n * Updates the canvas size if it changed\n */\n updateSize () {\n // see below (this is just updating it)\n this._window.devicePixelRatio = Math.round(this._windowScale * (window.devicePixelRatio || 1) * 2) / 2\n\n let didChange = false\n for (let key in this.windowState) {\n if (this.windowState.hasOwnProperty(key) && this.windowState[key] !== this.window[key]) {\n didChange = true\n this.windowState[key] = this.window[key]\n }\n }\n\n if (didChange) {\n const {\n width,\n height,\n fitIntoWidth,\n fitIntoHeight\n } = this.window\n const cellSize = this.getCellSize()\n\n // real height of the canvas element in pixels\n let realWidth = width * cellSize.width\n let realHeight = height * cellSize.height\n\n if (fitIntoWidth && fitIntoHeight) {\n let terminalAspect = realWidth / realHeight\n let fitAspect = fitIntoWidth / fitIntoHeight\n\n if (terminalAspect < fitAspect) {\n // align heights\n realHeight = fitIntoHeight\n realWidth = realHeight * terminalAspect\n } else {\n // align widths\n realWidth = fitIntoWidth\n realHeight = realWidth / terminalAspect\n }\n } else if (fitIntoWidth) {\n realHeight = fitIntoWidth / (realWidth / realHeight)\n realWidth = fitIntoWidth\n } else if (fitIntoHeight) {\n realWidth = fitIntoHeight * (realWidth / realHeight)\n realHeight = fitIntoHeight\n }\n\n // store new window scale\n this._windowScale = realWidth / (width * cellSize.width)\n\n // the DPR must be rounded to a very nice value to prevent gaps between cells\n let devicePixelRatio = this._window.devicePixelRatio = Math.round(this._windowScale * (window.devicePixelRatio || 1) * 2) / 2\n\n this.canvas.width = width * devicePixelRatio * cellSize.width\n this.canvas.style.width = `${realWidth}px`\n this.canvas.height = height * devicePixelRatio * cellSize.height\n this.canvas.style.height = `${realHeight}px`\n\n // the screen has been cleared (by changing canvas width)\n this.renderer.resetDrawn()\n\n // draw immediately; the canvas shouldn't flash\n this.renderer.draw('update-size')\n }\n }\n\n /**\n * Returns a normalized version of the current selection, such that `start`\n * is always before `end`.\n * @returns {Object} the normalized selection, with `start` and `end`\n */\n getNormalizedSelection () {\n let { start, end } = this.selection\n // if the start line is after the end line, or if they're both on the same\n // line but the start column comes after the end column, swap\n if (start[1] > end[1] || (start[1] === end[1] && start[0] > end[0])) {\n [start, end] = [end, start]\n }\n return { start, end }\n }\n\n /**\n * Returns whether or not a given cell is in the current selection.\n * @param {number} col - the column (x)\n * @param {number} line - the line (y)\n * @returns {boolean}\n */\n isInSelection (col, line) {\n let { start, end } = this.getNormalizedSelection()\n let colAfterStart = start[0] <= col\n let colBeforeEnd = col < end[0]\n let onStartLine = line === start[1]\n let onEndLine = line === end[1]\n\n if (onStartLine && onEndLine) return colAfterStart && colBeforeEnd\n else if (onStartLine) return colAfterStart\n else if (onEndLine) return colBeforeEnd\n else return start[1] < line && line < end[1]\n }\n\n /**\n * Sweeps for selected cells and joins them in a multiline string.\n * @returns {string} the selection\n */\n getSelectedText () {\n const screenLength = this.window.width * this.window.height\n let lines = []\n let previousLineIndex = -1\n\n for (let cell = 0; cell < screenLength; cell++) {\n let x = cell % this.window.width\n let y = Math.floor(cell / this.window.width)\n\n if (this.isInSelection(x, y)) {\n if (previousLineIndex !== y) {\n previousLineIndex = y\n lines.push('')\n }\n lines[lines.length - 1] += this.screen[cell]\n }\n }\n\n return lines.join('\\n')\n }\n\n /**\n * Copies the selection to clipboard and creates a notification balloon.\n */\n copySelectionToClipboard () {\n let selectedText = this.getSelectedText()\n // don't copy anything if nothing is selected\n if (!selectedText) return\n let textarea = mk('textarea')\n document.body.appendChild(textarea)\n textarea.value = selectedText\n textarea.select()\n if (document.execCommand('copy')) {\n notify.show('Copied to clipboard')\n } else {\n notify.show('Failed to copy')\n }\n document.body.removeChild(textarea)\n }\n\n /**\n * Shows an actual notification (if possible) or a notification balloon.\n * @param {string} text - the notification content\n */\n showNotification (text) {\n console.info(`Notification: ${text}`)\n if (window.Notification && window.Notification.permission === 'granted') {\n let notification = new window.Notification('ESPTerm', {\n body: text\n })\n notification.addEventListener('click', () => window.focus())\n } else {\n if (window.Notification && window.Notification.permission !== 'denied') {\n window.Notification.requestPermission()\n } else {\n // Fallback using the built-in notification balloon\n notify.show(text)\n }\n }\n }\n\n /**\n * Creates a beep sound.\n */\n beep () {\n const audioCtx = this.audioCtx\n if (!audioCtx) return\n\n // prevent screeching\n if (this._lastBeep && this._lastBeep > Date.now() - 50) return\n this._lastBeep = Date.now()\n\n if (!this._convolver) {\n this._convolver = audioCtx.createConvolver()\n let impulseLength = audioCtx.sampleRate * 0.8\n let impulse = audioCtx.createBuffer(2, impulseLength, audioCtx.sampleRate)\n for (let i = 0; i < impulseLength; i++) {\n impulse.getChannelData(0)[i] = (1 - i / impulseLength) ** (7 + Math.random())\n impulse.getChannelData(1)[i] = (1 - i / impulseLength) ** (7 + Math.random())\n }\n this._convolver.buffer = impulse\n this._convolver.connect(audioCtx.destination)\n }\n\n // main beep\n const mainOsc = audioCtx.createOscillator()\n const mainGain = audioCtx.createGain()\n mainOsc.connect(mainGain)\n mainGain.gain.value = 6\n mainOsc.frequency.value = 750\n mainOsc.type = 'sine'\n\n // surrogate beep (making it sound like 'oops')\n const surrOsc = audioCtx.createOscillator()\n const surrGain = audioCtx.createGain()\n surrOsc.connect(surrGain)\n surrGain.gain.value = 4\n surrOsc.frequency.value = 400\n surrOsc.type = 'sine'\n\n mainGain.connect(this._convolver)\n surrGain.connect(this._convolver)\n\n let startTime = audioCtx.currentTime\n mainOsc.start()\n mainOsc.stop(startTime + 0.5)\n surrOsc.start(startTime + 0.05)\n surrOsc.stop(startTime + 0.8)\n\n let loop = function () {\n if (audioCtx.currentTime < startTime + 0.8) window.requestAnimationFrame(loop)\n mainGain.gain.value *= 0.8\n surrGain.gain.value *= 0.8\n }\n loop()\n }\n\n load (...args) {\n this.parser.load(...args)\n }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./js/term/screen.js","const $ = require('../lib/chibi')\nconst { qs } = require('../utils')\nconst { themes } = require('./themes')\n\n// constants for decoding the update blob\nconst SEQ_REPEAT = 2\nconst SEQ_SET_COLORS = 3\nconst SEQ_SET_ATTRS = 4\nconst SEQ_SET_FG = 5\nconst SEQ_SET_BG = 6\n\nmodule.exports = class ScreenParser {\n constructor (screen) {\n this.screen = screen\n\n // true if TermScreen#load was called at least once\n this.contentLoaded = false\n }\n /**\n * Parses the content of an `S` message and schedules a draw\n * @param {string} str - the message content\n */\n loadContent (str) {\n // current index\n let i = 0\n let strArray = Array.from ? Array.from(str) : str.split('')\n\n // Uncomment to capture screen content for the demo page\n // console.log(JSON.stringify(`S${str}`))\n\n if (!this.contentLoaded) {\n let errmsg = qs('#load-failed')\n if (errmsg) errmsg.parentNode.removeChild(errmsg)\n this.contentLoaded = true\n }\n\n // window size\n const newHeight = strArray[i++].codePointAt(0) - 1\n const newWidth = strArray[i++].codePointAt(0) - 1\n const resized = (this.screen.window.height !== newHeight) || (this.screen.window.width !== newWidth)\n this.screen.window.height = newHeight\n this.screen.window.width = newWidth\n\n // cursor position\n let [cursorY, cursorX] = [\n strArray[i++].codePointAt(0) - 1,\n strArray[i++].codePointAt(0) - 1\n ]\n let cursorMoved = (cursorX !== this.screen.cursor.x || cursorY !== this.screen.cursor.y)\n this.screen.cursor.x = cursorX\n this.screen.cursor.y = cursorY\n\n if (cursorMoved) {\n this.screen.renderer.resetCursorBlink()\n this.screen.emit('cursor-moved')\n }\n\n // attributes\n let attributes = strArray[i++].codePointAt(0) - 1\n\n this.screen.cursor.visible = !!(attributes & 1)\n this.screen.cursor.hanging = !!(attributes & (1 << 1))\n\n this.screen.input.setAlts(\n !!(attributes & (1 << 2)), // cursors alt\n !!(attributes & (1 << 3)), // numpad alt\n !!(attributes & (1 << 4)), // fn keys alt\n !!(attributes & (1 << 12)) // crlf mode\n )\n\n let trackMouseClicks = !!(attributes & (1 << 5))\n let trackMouseMovement = !!(attributes & (1 << 6))\n\n // 0 - Block blink 2 - Block steady (1 is unused)\n // 3 - Underline blink 4 - Underline steady\n // 5 - I-bar blink 6 - I-bar steady\n let cursorShape = (attributes >> 9) & 0x07\n\n // if it's not zero, decrement such that the two most significant bits\n // are the type and the least significant bit is the blink state\n if (cursorShape > 0) cursorShape--\n\n let cursorStyle = cursorShape >> 1\n let cursorBlinking = !(cursorShape & 1)\n\n if (cursorStyle === 0) this.screen.cursor.style = 'block'\n else if (cursorStyle === 1) this.screen.cursor.style = 'line'\n else if (cursorStyle === 2) this.screen.cursor.style = 'bar'\n\n if (this.screen.cursor.blinking !== cursorBlinking) {\n this.screen.cursor.blinking = cursorBlinking\n this.screen.renderer.resetCursorBlink()\n }\n\n this.screen.input.setMouseMode(trackMouseClicks, trackMouseMovement)\n this.screen.selection.selectable = !trackMouseClicks && !trackMouseMovement\n $(this.screen.canvas).toggleClass('selectable', this.screen.selection.selectable)\n this.screen.mouseMode = {\n clicks: trackMouseClicks,\n movement: trackMouseMovement\n }\n\n let showButtons = !!(attributes & (1 << 7))\n let showConfigLinks = !!(attributes & (1 << 8))\n\n $('.x-term-conf-btn').toggleClass('hidden', !showConfigLinks)\n $('#action-buttons').toggleClass('hidden', !showButtons)\n\n this.screen.bracketedPaste = !!(attributes & (1 << 13))\n this.screen.reverseVideo = !!(attributes & (1 << 14))\n\n // content\n let fg = 7\n let bg = 0\n let attrs = 0\n let cell = 0 // cell index\n let lastChar = ' '\n let screenLength = this.screen.window.width * this.screen.window.height\n\n if (resized) {\n this.screen.updateSize()\n this.screen.blinkingCellCount = 0\n this.screen.screen = new Array(screenLength).fill(' ')\n this.screen.screenFG = new Array(screenLength).fill(' ')\n this.screen.screenBG = new Array(screenLength).fill(' ')\n this.screen.screenAttrs = new Array(screenLength).fill(0)\n }\n\n const MASK_LINE_ATTR = 0xC8\n const MASK_BLINK = 1 << 4\n\n let setCellContent = () => {\n // Remove blink attribute if it wouldn't have any effect\n let myAttrs = attrs\n let hasFG = attrs & (1 << 8)\n let hasBG = attrs & (1 << 9)\n if ((myAttrs & MASK_BLINK) !== 0 &&\n ((lastChar === ' ' && ((myAttrs & MASK_LINE_ATTR) === 0)) || // no line styles\n (fg === bg && hasFG && hasBG) // invisible text\n )\n ) {\n myAttrs ^= MASK_BLINK\n }\n // update blinking cells counter if blink state changed\n if ((this.screen.screenAttrs[cell] & MASK_BLINK) !== (myAttrs & MASK_BLINK)) {\n if (myAttrs & MASK_BLINK) this.screen.blinkingCellCount++\n else this.screen.blinkingCellCount--\n }\n\n this.screen.screen[cell] = lastChar\n this.screen.screenFG[cell] = fg\n this.screen.screenBG[cell] = bg\n this.screen.screenAttrs[cell] = myAttrs\n }\n\n while (i < strArray.length && cell < screenLength) {\n let character = strArray[i++]\n let charCode = character.codePointAt(0)\n\n let data\n switch (charCode) {\n case SEQ_REPEAT:\n let count = strArray[i++].codePointAt(0) - 1\n for (let j = 0; j < count; j++) {\n setCellContent()\n if (++cell > screenLength) break\n }\n break\n\n case SEQ_SET_COLORS:\n data = strArray[i++].codePointAt(0) - 1\n fg = data & 0xFF\n bg = (data >> 8) & 0xFF\n break\n\n case SEQ_SET_ATTRS:\n data = strArray[i++].codePointAt(0) - 1\n attrs = data & 0xFFFF\n break\n\n case SEQ_SET_FG:\n data = strArray[i++].codePointAt(0) - 1\n fg = data & 0xFF\n break\n\n case SEQ_SET_BG:\n data = strArray[i++].codePointAt(0) - 1\n bg = data & 0xFF\n break\n\n default:\n if (charCode < 32) character = '\\ufffd'\n lastChar = character\n setCellContent()\n cell++\n }\n }\n\n if (this.screen.window.debug) console.log(`Blinky cells: ${this.screen.blinkingCellCount}`)\n\n this.screen.renderer.scheduleDraw('load', 16)\n this.screen.emit('load')\n }\n\n /**\n * Parses the content of a `T` message and updates the screen title and button\n * labels.\n * @param {string} str - the message content\n */\n loadLabels (str) {\n let pieces = str.split('\\x01')\n let screenTitle = pieces[0]\n qs('#screen-title').textContent = screenTitle\n if (screenTitle.length === 0) screenTitle = 'Terminal'\n qs('title').textContent = `${screenTitle} :: ESPTerm`\n $('#action-buttons button').forEach((button, i) => {\n let label = pieces[i + 1].trim()\n // if empty string, use the \"dim\" effect and put nbsp instead to\n // stretch the button vertically\n button.innerHTML = label ? $.htmlEscape(label) : ' '\n button.style.opacity = label ? 1 : 0.2\n })\n }\n\n /**\n * Loads a message from the server, and optionally a theme.\n * @param {string} str - the message\n * @param {object} [opts] - options\n * @param {number} [opts.theme] - theme\n * @param {number} [opts.defaultFg] - default foreground\n * @param {number} [opts.defaultBg] - default background\n */\n load (str, opts = null) {\n const content = str.substr(1)\n\n if (opts) {\n if (typeof opts.defaultFg !== 'undefined' && typeof opts.defaultBg !== 'undefined') {\n this.screen.renderer.setDefaultColors(opts.defaultFg, opts.defaultBg)\n }\n\n if (typeof opts.theme !== 'undefined') {\n if (opts.theme >= 0 && opts.theme < themes.length) {\n this.screen.renderer.palette = themes[opts.theme]\n }\n }\n }\n\n switch (str[0]) {\n case 'S':\n this.loadContent(content)\n break\n\n case 'T':\n this.loadLabels(content)\n break\n\n case 'B':\n this.screen.beep()\n break\n\n case 'G':\n this.screen.showNotification(content)\n break\n\n default:\n console.warn(`Bad data message type; ignoring.\\n${JSON.stringify(str)}`)\n }\n }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./js/term/screen_parser.js","const { themes, buildColorTable, SELECTION_FG, SELECTION_BG } = require('./themes')\n\n// Some non-bold Fraktur symbols are outside the contiguous block\nconst frakturExceptions = {\n 'C': '\\u212d',\n 'H': '\\u210c',\n 'I': '\\u2111',\n 'R': '\\u211c',\n 'Z': '\\u2128'\n}\n\nmodule.exports = class ScreenRenderer {\n constructor (screen) {\n this.screen = screen\n this.ctx = screen.ctx\n\n this._palette = null // colors 0-15\n this.defaultBgNum = 0\n this.defaultFgNum = 7\n\n // 256color lookup table\n // should not be used to look up 0-15 (will return transparent)\n this.colorTable256 = buildColorTable()\n\n this.resetDrawn()\n\n this.blinkStyleOn = false\n this.blinkInterval = null\n this.cursorBlinkOn = false\n this.cursorBlinkInterval = null\n\n // start blink timers\n this.resetBlink()\n this.resetCursorBlink()\n }\n\n resetDrawn () {\n // used to determine if a cell should be redrawn; storing the current state\n // as it is on screen\n this.drawnScreen = []\n this.drawnScreenFG = []\n this.drawnScreenBG = []\n this.drawnScreenAttrs = []\n this.drawnCursor = [-1, -1, '']\n }\n\n /**\n * The color palette. Should define 16 colors in an array.\n * @type {string[]}\n */\n get palette () {\n return this._palette || themes[0]\n }\n\n /** @type {string[]} */\n set palette (palette) {\n if (this._palette !== palette) {\n this._palette = palette\n this.resetDrawn()\n this.scheduleDraw('palette')\n }\n }\n\n setDefaultColors (fg, bg) {\n this.defaultFgNum = fg\n this.defaultBgNum = bg\n this.resetDrawn()\n this.scheduleDraw('defaultColors')\n }\n\n /**\n * Schedule a draw in the next millisecond\n * @param {string} why - the reason why the draw occured (for debugging)\n * @param {number} [aggregateTime] - time to wait for more scheduleDraw calls\n * to occur. 1 ms by default.\n */\n scheduleDraw (why, aggregateTime = 1) {\n clearTimeout(this._scheduledDraw)\n this._scheduledDraw = setTimeout(() => this.draw(why), aggregateTime)\n }\n\n /**\n * Returns the specified color. If `i` is in the palette, it will return the\n * palette color. If `i` is between 16 and 255, it will return the 256color\n * value. If `i` is larger than 255, it will return an RGB color value. If `i`\n * is -1 (foreground) or -2 (background), it will return the selection colors.\n * @param {number} i - the color\n * @returns {string} the CSS color\n */\n getColor (i) {\n // return palette color if it exists\n if (i < 16 && i in this.palette) return this.palette[i]\n\n // -1 for selection foreground, -2 for selection background\n if (i === -1) return SELECTION_FG\n if (i === -2) return SELECTION_BG\n\n // 256 color\n if (i > 15 && i < 256) return this.colorTable256[i]\n\n // true color, encoded as (hex) + 256 (such that #000 == 256)\n if (i > 255) {\n i -= 256\n let red = (i >> 16) & 0xFF\n let green = (i >> 8) & 0xFF\n let blue = i & 0xFF\n return `rgb(${red}, ${green}, ${blue})`\n }\n\n // return error color\n return (Date.now() / 1000) % 2 === 0 ? '#f0f' : '#0f0'\n }\n\n /**\n * Resets the cursor blink to on and restarts the timer\n */\n resetCursorBlink () {\n this.cursorBlinkOn = true\n clearInterval(this.cursorBlinkInterval)\n this.cursorBlinkInterval = setInterval(() => {\n this.cursorBlinkOn = this.screen.cursor.blinking\n ? !this.cursorBlinkOn\n : true\n if (this.screen.cursor.blinking) this.scheduleDraw('cursor-blink')\n }, 500)\n }\n\n /**\n * Resets the blink style to on and restarts the timer\n */\n resetBlink () {\n this.blinkStyleOn = true\n clearInterval(this.blinkInterval)\n let intervals = 0\n this.blinkInterval = setInterval(() => {\n if (this.screen.blinkingCellCount <= 0) return\n\n intervals++\n if (intervals >= 4 && this.blinkStyleOn) {\n this.blinkStyleOn = false\n intervals = 0\n this.scheduleDraw('blink-style')\n } else if (intervals >= 1 && !this.blinkStyleOn) {\n this.blinkStyleOn = true\n intervals = 0\n this.scheduleDraw('blink-style')\n }\n }, 200)\n }\n\n /**\n * Draws a cell's background with the given parameters.\n * @param {Object} options\n * @param {number} options.x - x in cells\n * @param {number} options.y - y in cells\n * @param {number} options.cellWidth - cell width in pixels\n * @param {number} options.cellHeight - cell height in pixels\n * @param {number} options.bg - the background color\n */\n drawBackground ({ x, y, cellWidth, cellHeight, bg }) {\n const ctx = this.ctx\n ctx.fillStyle = this.getColor(bg)\n ctx.clearRect(x * cellWidth, y * cellHeight, cellWidth, cellHeight)\n ctx.fillRect(x * cellWidth, y * cellHeight, cellWidth, cellHeight)\n }\n\n /**\n * Draws a cell's character with the given parameters. Won't do anything if\n * text is an empty string.\n * @param {Object} options\n * @param {number} options.x - x in cells\n * @param {number} options.y - y in cells\n * @param {Object} options.charSize - the character size, an object with\n * `width` and `height` in pixels\n * @param {number} options.cellWidth - cell width in pixels\n * @param {number} options.cellHeight - cell height in pixels\n * @param {string} options.text - the cell content\n * @param {number} options.fg - the foreground color\n * @param {number} options.attrs - the cell's attributes\n */\n drawCharacter ({ x, y, charSize, cellWidth, cellHeight, text, fg, attrs }) {\n if (!text) return\n\n const ctx = this.ctx\n\n let underline = false\n let strike = false\n let overline = false\n if (attrs & (1 << 1)) ctx.globalAlpha = 0.5\n if (attrs & (1 << 3)) underline = true\n if (attrs & (1 << 5)) text = ScreenRenderer.alphaToFraktur(text)\n if (attrs & (1 << 6)) strike = true\n if (attrs & (1 << 7)) overline = true\n\n ctx.fillStyle = this.getColor(fg)\n\n let codePoint = text.codePointAt(0)\n if (codePoint >= 0x2580 && codePoint <= 0x259F) {\n // block elements\n ctx.beginPath()\n const left = x * cellWidth\n const top = y * cellHeight\n const cw = cellWidth\n const ch = cellHeight\n const c2w = cellWidth / 2\n const c2h = cellHeight / 2\n\n // http://www.fileformat.info/info/unicode/block/block_elements/utf8test.htm\n // 0x00 0x01 0x02 0x03 0x04 0x05 0x06 0x07 0x08 0x09 0x0A 0x0B 0x0C 0x0D 0x0E 0x0F\n // 0x2580 ▀ ▁ ▂ ▃ ▄ ▅ ▆ ▇ █ ▉ ▊ ▋ ▌ ▍ ▎ ▏\n // 0x2590 ▐ ░ ▒ ▓ ▔ ▕ ▖ ▗ ▘ ▙ ▚ ▛ ▜ ▝ ▞ ▟\n\n if (codePoint === 0x2580) {\n // upper half block >▀<\n ctx.rect(left, top, cw, c2h)\n } else if (codePoint <= 0x2588) {\n // lower n eighth block (increasing) >▁< to >█<\n let offset = (1 - (codePoint - 0x2580) / 8) * ch\n ctx.rect(left, top + offset, cw, ch - offset)\n } else if (codePoint <= 0x258F) {\n // left n eighth block (decreasing) >▉< to >▏<\n let offset = (codePoint - 0x2588) / 8 * cw\n ctx.rect(left, top, cw - offset, ch)\n } else if (codePoint === 0x2590) {\n // right half block >▐<\n ctx.rect(left + c2w, top, c2w, ch)\n } else if (codePoint <= 0x2593) {\n // shading >░< >▒< >▓<\n\n // dot spacing by dividing cell size by a constant. This could be\n // reworked to always return a whole number, but that would require\n // prime factorization, and doing that without a loop would let you\n // take over the world, which is not within the scope of this project.\n let dotSpacingX, dotSpacingY, dotSize\n if (codePoint === 0x2591) {\n dotSpacingX = cw / 4\n dotSpacingY = ch / 10\n dotSize = 1\n } else if (codePoint === 0x2592) {\n dotSpacingX = cw / 6\n dotSpacingY = cw / 10\n dotSize = 1\n } else if (codePoint === 0x2593) {\n dotSpacingX = cw / 4\n dotSpacingY = cw / 7\n dotSize = 2\n }\n\n let alignRight = false\n for (let dy = 0; dy < ch; dy += dotSpacingY) {\n for (let dx = 0; dx < cw; dx += dotSpacingX) {\n // prevent overflow\n let dotSizeY = Math.min(dotSize, ch - dy)\n ctx.rect(x * cw + (alignRight ? cw - dx - dotSize : dx), y * ch + dy, dotSize, dotSizeY)\n }\n alignRight = !alignRight\n }\n } else if (codePoint === 0x2594) {\n // upper one eighth block >▔<\n ctx.rect(x * cw, y * ch, cw, ch / 8)\n } else if (codePoint === 0x2595) {\n // right one eighth block >▕<\n ctx.rect((x + 7 / 8) * cw, y * ch, cw / 8, ch)\n } else if (codePoint === 0x2596) {\n // left bottom quadrant >▖<\n ctx.rect(left, top + c2h, c2w, c2h)\n } else if (codePoint === 0x2597) {\n // right bottom quadrant >▗<\n ctx.rect(left + c2w, top + c2h, c2w, c2h)\n } else if (codePoint === 0x2598) {\n // left top quadrant >▘<\n ctx.rect(left, top, c2w, c2h)\n } else if (codePoint === 0x2599) {\n // left chair >▙<\n ctx.rect(left, top, c2w, ch)\n ctx.rect(left + c2w, top + c2h, c2w, c2h)\n } else if (codePoint === 0x259A) {\n // quadrants lt rb >▚<\n ctx.rect(left, top, c2w, c2h)\n ctx.rect(left + c2w, top + c2h, c2w, c2h)\n } else if (codePoint === 0x259B) {\n // left chair upside down >▛<\n ctx.rect(left, top, c2w, ch)\n ctx.rect(left + c2w, top, c2w, c2h)\n } else if (codePoint === 0x259C) {\n // right chair upside down >▜<\n ctx.rect(left, top, cw, c2h)\n ctx.rect(left + c2w, top + c2h, c2w, c2h)\n } else if (codePoint === 0x259D) {\n // right top quadrant >▝<\n ctx.rect(left + c2w, top, c2w, c2h)\n } else if (codePoint === 0x259E) {\n // quadrants lb rt >▞<\n ctx.rect(left, top + c2h, c2w, c2h)\n ctx.rect(left + c2w, top, c2w, c2h)\n } else if (codePoint === 0x259F) {\n // right chair upside down >▟<\n ctx.rect(left, top + c2h, c2w, c2h)\n ctx.rect(left + c2w, top, c2w, ch)\n }\n\n ctx.fill()\n } else {\n // Draw other characters using the text renderer\n ctx.fillText(text, (x + 0.5) * cellWidth, (y + 0.5) * cellHeight)\n }\n\n // -- line drawing - a reference for a possible future rect/line implementation ---\n // http://www.fileformat.info/info/unicode/block/box_drawing/utf8test.htm\n // 0x00 0x01 0x02 0x03 0x04 0x05 0x06 0x07 0x08 0x09 0x0A 0x0B 0x0C 0x0D 0x0E 0x0F\n // 0x2500 ─ ━ │ ┃ ┄ ┅ ┆ ┇ ┈ ┉ ┊ ┋ ┌ ┍ ┎ ┏\n // 0x2510 ┐ ┑ ┒ ┓ └ ┕ ┖ ┗ ┘ ┙ ┚ ┛ ├ ┝ ┞ ┟\n // 0x2520 ┠ ┡ ┢ ┣ ┤ ┥ ┦ ┧ ┨ ┩ ┪ ┫ ┬ ┭ ┮ ┯\n // 0x2530 ┰ ┱ ┲ ┳ ┴ ┵ ┶ ┷ ┸ ┹ ┺ ┻ ┼ ┽ ┾ ┿\n // 0x2540 ╀ ╁ ╂ ╃ ╄ ╅ ╆ ╇ ╈ ╉ ╊ ╋ ╌ ╍ ╎ ╏\n // 0x2550 ═ ║ ╒ ╓ ╔ ╕ ╖ ╗ ╘ ╙ ╚ ╛ ╜ ╝ ╞ ╟\n // 0x2560 ╠ ╡ ╢ ╣ ╤ ╥ ╦ ╧ ╨ ╩ ╪ ╫ ╬ ╭ ╮ ╯\n // 0x2570 ╰ ╱ ╲ ╳ ╴ ╵ ╶ ╷ ╸ ╹ ╺ ╻ ╼ ╽ ╾ ╿\n\n if (underline || strike || overline) {\n ctx.strokeStyle = this.getColor(fg)\n ctx.lineWidth = 1\n ctx.lineCap = 'round'\n ctx.beginPath()\n\n if (underline) {\n let lineY = Math.round(y * cellHeight + charSize.height) + 0.5\n ctx.moveTo(x * cellWidth, lineY)\n ctx.lineTo((x + 1) * cellWidth, lineY)\n }\n\n if (strike) {\n let lineY = Math.round((y + 0.5) * cellHeight) + 0.5\n ctx.moveTo(x * cellWidth, lineY)\n ctx.lineTo((x + 1) * cellWidth, lineY)\n }\n\n if (overline) {\n let lineY = Math.round(y * cellHeight) + 0.5\n ctx.moveTo(x * cellWidth, lineY)\n ctx.lineTo((x + 1) * cellWidth, lineY)\n }\n\n ctx.stroke()\n }\n\n ctx.globalAlpha = 1\n }\n\n /**\n * Returns all adjacent cell indices given a radius.\n * @param {number} cell - the center cell index\n * @param {number} [radius] - the radius. 1 by default\n * @returns {number[]} an array of cell indices\n */\n getAdjacentCells (cell, radius = 1) {\n const { width, height } = this.screen.window\n const screenLength = width * height\n\n let cells = []\n\n for (let x = -radius; x <= radius; x++) {\n for (let y = -radius; y <= radius; y++) {\n if (x === 0 && y === 0) continue\n cells.push(cell + x + y * width)\n }\n }\n\n return cells.filter(cell => cell >= 0 && cell < screenLength)\n }\n\n /**\n * Updates the screen.\n * @param {string} why - the draw reason (for debugging)\n */\n draw (why) {\n const ctx = this.ctx\n const {\n width,\n height,\n devicePixelRatio,\n statusScreen\n } = this.screen.window\n\n if (statusScreen) {\n // draw status screen instead\n this.drawStatus(statusScreen)\n this.startDrawLoop()\n return\n } else this.stopDrawLoop()\n\n const charSize = this.screen.getCharSize()\n const { width: cellWidth, height: cellHeight } = this.screen.getCellSize()\n const screenLength = width * height\n\n ctx.setTransform(devicePixelRatio, 0, 0, devicePixelRatio, 0, 0)\n\n if (this.screen.window.debug && this.screen._debug) this.screen._debug.drawStart(why)\n\n ctx.font = this.screen.getFont()\n ctx.textAlign = 'center'\n ctx.textBaseline = 'middle'\n\n // bits in the attr value that affect the font\n const FONT_MASK = 0b101\n\n // Map of (attrs & FONT_MASK) -> Array of cell indices\n let fontGroups = new Map()\n\n // Map of (cell index) -> boolean, whether or not a cell has updated\n let updateMap = new Map()\n\n for (let cell = 0; cell < screenLength; cell++) {\n let x = cell % width\n let y = Math.floor(cell / width)\n let isCursor = !this.screen.cursor.hanging &&\n this.screen.cursor.x === x &&\n this.screen.cursor.y === y &&\n this.screen.cursor.visible &&\n this.cursorBlinkOn\n\n let wasCursor = x === this.drawnCursor[0] && y === this.drawnCursor[1]\n\n let inSelection = this.screen.isInSelection(x, y)\n\n let text = this.screen.screen[cell]\n let fg = this.screen.screenFG[cell] | 0\n let bg = this.screen.screenBG[cell] | 0\n let attrs = this.screen.screenAttrs[cell] | 0\n\n if (!(attrs & (1 << 8))) fg = this.defaultFgNum\n if (!(attrs & (1 << 9))) bg = this.defaultBgNum\n\n if (attrs & (1 << 10)) [fg, bg] = [bg, fg] // swap - reversed character colors\n if (this.screen.reverseVideo) [fg, bg] = [bg, fg] // swap - reversed all screen\n\n if (attrs & (1 << 4) && !this.blinkStyleOn) {\n // blinking is enabled and blink style is off\n // set text to nothing so drawCharacter doesn't draw anything\n text = ''\n }\n\n if (inSelection) {\n fg = -1\n bg = -2\n }\n\n let didUpdate = text !== this.drawnScreen[cell] || // text updated\n fg !== this.drawnScreenFG[cell] || // foreground updated, and this cell has text\n bg !== this.drawnScreenBG[cell] || // background updated\n attrs !== this.drawnScreenAttrs[cell] || // attributes updated\n isCursor !== wasCursor || // cursor blink/position updated\n (isCursor && this.screen.cursor.style !== this.drawnCursor[2]) // cursor style updated\n\n let font = attrs & FONT_MASK\n if (!fontGroups.has(font)) fontGroups.set(font, [])\n\n fontGroups.get(font).push({ cell, x, y, text, fg, bg, attrs, isCursor, inSelection })\n updateMap.set(cell, didUpdate)\n }\n\n // Map of (cell index) -> boolean, whether or not a cell should be redrawn\n const redrawMap = new Map()\n\n let isTextWide = text =>\n text !== ' ' && ctx.measureText(text).width >= (cellWidth + 0.05)\n\n // decide for each cell if it should be redrawn\n let updateRedrawMapAt = cell => {\n let shouldUpdate = updateMap.get(cell) || redrawMap.get(cell) || false\n\n // TODO: fonts (necessary?)\n let text = this.screen.screen[cell]\n let isWideCell = isTextWide(text)\n let checkRadius = isWideCell ? 2 : 1\n\n if (!shouldUpdate) {\n // check adjacent cells\n let adjacentDidUpdate = false\n\n for (let adjacentCell of this.getAdjacentCells(cell, checkRadius)) {\n // update this cell if:\n // - the adjacent cell updated (For now, this'll always be true because characters can be slightly larger than they say they are)\n // - the adjacent cell updated and this cell or the adjacent cell is wide\n if (updateMap.get(adjacentCell) && (this.screen.window.graphics < 2 || isWideCell || isTextWide(this.screen.screen[adjacentCell]))) {\n adjacentDidUpdate = true\n break\n }\n }\n\n if (adjacentDidUpdate) shouldUpdate = true\n }\n\n redrawMap.set(cell, shouldUpdate)\n }\n\n for (let cell of updateMap.keys()) updateRedrawMapAt(cell)\n\n // mask to redrawing regions only\n if (this.screen.window.graphics >= 1) {\n let debug = this.screen.window.debug && this.screen._debug\n ctx.save()\n ctx.beginPath()\n for (let y = 0; y < height; y++) {\n let regionStart = null\n for (let x = 0; x < width; x++) {\n let cell = y * width + x\n let redrawing = redrawMap.get(cell)\n if (redrawing && regionStart === null) regionStart = x\n if (!redrawing && regionStart !== null) {\n ctx.rect(regionStart * cellWidth, y * cellHeight, (x - regionStart) * cellWidth, cellHeight)\n if (debug) this.screen._debug.clipRect(regionStart * cellWidth, y * cellHeight, (x - regionStart) * cellWidth, cellHeight)\n regionStart = null\n }\n }\n if (regionStart !== null) {\n ctx.rect(regionStart * cellWidth, y * cellHeight, (width - regionStart) * cellWidth, cellHeight)\n if (debug) this.screen._debug.clipRect(regionStart * cellWidth, y * cellHeight, (width - regionStart) * cellWidth, cellHeight)\n }\n }\n ctx.clip()\n }\n\n // pass 1: backgrounds\n for (let font of fontGroups.keys()) {\n for (let data of fontGroups.get(font)) {\n let { cell, x, y, text, bg } = data\n\n if (redrawMap.get(cell)) {\n this.drawBackground({ x, y, cellWidth, cellHeight, bg })\n\n if (this.screen.window.debug && this.screen._debug) {\n // set cell flags\n let flags = (+redrawMap.get(cell))\n flags |= (+updateMap.get(cell)) << 1\n flags |= (+isTextWide(text)) << 2\n this.screen._debug.setCell(cell, flags)\n }\n }\n }\n }\n\n // reset drawn cursor\n this.drawnCursor = [-1, -1, -1]\n\n // pass 2: characters\n for (let font of fontGroups.keys()) {\n // set font once because in Firefox, this is a really slow action for some\n // reason\n let modifiers = {}\n if (font & 1) modifiers.weight = 'bold'\n if (font & 1 << 2) modifiers.style = 'italic'\n ctx.font = this.screen.getFont(modifiers)\n\n for (let data of fontGroups.get(font)) {\n let { cell, x, y, text, fg, bg, attrs, isCursor, inSelection } = data\n\n if (redrawMap.get(cell)) {\n this.drawCharacter({\n x, y, charSize, cellWidth, cellHeight, text, fg, attrs\n })\n\n this.drawnScreen[cell] = text\n this.drawnScreenFG[cell] = fg\n this.drawnScreenBG[cell] = bg\n this.drawnScreenAttrs[cell] = attrs\n\n if (isCursor) this.drawnCursor = [x, y, this.screen.cursor.style]\n\n if (isCursor && !inSelection) {\n ctx.save()\n ctx.beginPath()\n if (this.screen.cursor.style === 'block') {\n // block\n ctx.rect(x * cellWidth, y * cellHeight, cellWidth, cellHeight)\n } else if (this.screen.cursor.style === 'bar') {\n // vertical bar\n let barWidth = 2\n ctx.rect(x * cellWidth, y * cellHeight, barWidth, cellHeight)\n } else if (this.screen.cursor.style === 'line') {\n // underline\n let lineHeight = 2\n ctx.rect(x * cellWidth, y * cellHeight + charSize.height, cellWidth, lineHeight)\n }\n ctx.clip()\n\n // swap foreground/background\n ;[fg, bg] = [bg, fg]\n\n // HACK: ensure cursor is visible\n if (fg === bg) bg = fg === 0 ? 7 : 0\n\n this.drawBackground({ x, y, cellWidth, cellHeight, bg })\n this.drawCharacter({\n x, y, charSize, cellWidth, cellHeight, text, fg, attrs\n })\n ctx.restore()\n }\n }\n }\n }\n\n if (this.screen.window.graphics >= 1) ctx.restore()\n\n if (this.screen.window.debug && this.screen._debug) this.screen._debug.drawEnd()\n\n this.screen.emit('draw')\n }\n\n drawStatus (statusScreen) {\n const ctx = this.ctx\n const {\n fontFamily,\n width,\n height,\n devicePixelRatio\n } = this.screen.window\n\n // reset drawnScreen to force redraw when statusScreen is disabled\n this.drawnScreen = []\n\n const cellSize = this.screen.getCellSize()\n const screenWidth = width * cellSize.width\n const screenHeight = height * cellSize.height\n\n ctx.setTransform(devicePixelRatio, 0, 0, devicePixelRatio, 0, 0)\n ctx.clearRect(0, 0, screenWidth, screenHeight)\n\n ctx.font = `24px ${fontFamily}`\n ctx.fillStyle = '#fff'\n ctx.textAlign = 'center'\n ctx.textBaseline = 'middle'\n ctx.fillText(statusScreen.title || '', screenWidth / 2, screenHeight / 2 - 50)\n\n if (statusScreen.loading) {\n // show loading spinner\n ctx.save()\n ctx.translate(screenWidth / 2, screenHeight / 2 + 20)\n\n ctx.strokeStyle = '#fff'\n ctx.lineWidth = 5\n ctx.lineCap = 'round'\n\n let t = Date.now() / 1000\n\n for (let i = 0; i < 12; i++) {\n ctx.rotate(Math.PI / 6)\n let offset = ((t * 12) - i) % 12\n ctx.globalAlpha = Math.max(0.2, 1 - offset / 3)\n ctx.beginPath()\n ctx.moveTo(0, 15)\n ctx.lineTo(0, 30)\n ctx.stroke()\n }\n\n ctx.restore()\n }\n }\n\n startDrawLoop () {\n if (this._drawTimerThread) return\n let threadID = Math.random().toString(36)\n this._drawTimerThread = threadID\n this.drawTimerLoop(threadID)\n }\n\n stopDrawLoop () {\n this._drawTimerThread = null\n }\n\n drawTimerLoop (threadID) {\n if (!threadID || threadID !== this._drawTimerThread) return\n window.requestAnimationFrame(() => this.drawTimerLoop(threadID))\n this.draw('draw-loop')\n }\n\n /**\n * Converts an alphabetic character to its fraktur variant.\n * @param {string} character - the character\n * @returns {string} the converted character\n */\n static alphaToFraktur (character) {\n if (character >= 'a' && character <= 'z') {\n character = String.fromCodePoint(0x1d51e - 0x61 + character.charCodeAt(0))\n } else if (character >= 'A' && character <= 'Z') {\n character = frakturExceptions[character] || String.fromCodePoint(0x1d504 - 0x41 + character.charCodeAt(0))\n }\n return character\n }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./js/term/screen_renderer.js","const EventEmitter = require('events')\nconst $ = require('../lib/chibi')\nlet demo\ntry { demo = require('./demo') } catch (err) {}\n\n/** Handle connections */\nmodule.exports = class TermConnection extends EventEmitter {\n constructor (screen) {\n super()\n\n this.screen = screen\n this.ws = null\n this.heartbeatTimeout = null\n this.pingInterval = null\n this.xoff = false\n this.autoXoffTimeout = null\n this.reconnTimeout = null\n this.forceClosing = false\n\n this.pageShown = false\n\n document.addEventListener('visibilitychange', () => {\n if (document.hidden === true) {\n console.info('Window lost focus, freeing socket')\n this.closeSocket()\n clearTimeout(this.heartbeatTimeout)\n } else {\n console.info('Window got focus, re-connecting')\n this.init()\n }\n }, false)\n }\n\n onWSOpen (evt) {\n console.log('CONNECTED')\n this.heartbeat()\n this.send('i')\n this.forceClosing = false\n\n this.emit('connect')\n }\n\n onWSClose (evt) {\n if (this.forceClosing) {\n this.forceClosing = false\n return\n }\n console.warn('SOCKET CLOSED, code ' + evt.code + '. Reconnecting...')\n if (evt.code < 1000) {\n console.error('Bad code from socket!')\n // this sometimes happens for unknown reasons, code < 1000 is invalid\n // location.reload()\n }\n\n clearTimeout(this.reconnTimeout)\n this.reconnTimeout = setTimeout(() => this.init(), 2000)\n\n this.emit('disconnect', evt.code)\n }\n\n onWSMessage (evt) {\n try {\n switch (evt.data.charAt(0)) {\n case '.':\n // heartbeat, no-op message\n break\n\n case '-':\n // console.log('xoff');\n this.xoff = true\n this.autoXoffTimeout = setTimeout(() => {\n this.xoff = false\n }, 250)\n break\n\n case '+':\n // console.log('xon');\n this.xoff = false\n clearTimeout(this.autoXoffTimeout)\n break\n\n default:\n this.emit('load')\n this.screen.load(evt.data)\n if (!this.pageShown) {\n window.showPage()\n this.pageShown = true\n }\n break\n }\n this.heartbeat()\n } catch (e) {\n console.error(e)\n }\n }\n\n canSend () {\n return !this.xoff\n }\n\n send (message) {\n if (window._demo) {\n if (typeof window.demoInterface !== 'undefined') {\n demo.input(message)\n } else {\n console.log(`TX: ${JSON.stringify(message)}`)\n }\n return true // Simulate success\n }\n if (this.xoff) {\n // TODO queue\n console.log(\"Can't send, flood control.\")\n return false\n }\n\n if (!this.ws) return false // for dry testing\n if (this.ws.readyState !== 1) {\n console.error('Socket not ready')\n return false\n }\n if (typeof message != 'string') {\n message = JSON.stringify(message)\n }\n this.ws.send(message)\n return true\n }\n\n /** Safely close the socket */\n closeSocket () {\n if (this.ws) {\n this.forceClosing = true\n this.ws.close()\n this.ws = null\n }\n }\n\n init () {\n if (window._demo) {\n if (typeof window.demoInterface === 'undefined') {\n window.alert('Demoing non-demo build!') // this will catch mistakes when deploying to the website\n } else {\n demo.init(this.screen)\n }\n return\n }\n\n clearTimeout(this.reconnTimeout)\n clearTimeout(this.heartbeatTimeout)\n\n this.closeSocket()\n\n this.ws = new window.WebSocket('ws://' + window._root + '/term/update.ws')\n this.ws.addEventListener('open', (...args) => this.onWSOpen(...args))\n this.ws.addEventListener('close', (...args) => this.onWSClose(...args))\n this.ws.addEventListener('message', (...args) => this.onWSMessage(...args))\n console.log('Opening socket.')\n this.heartbeat()\n\n this.emit('open')\n }\n\n heartbeat () {\n clearTimeout(this.heartbeatTimeout)\n this.heartbeatTimeout = setTimeout(() => this.onHeartbeatFail(), 2000)\n }\n\n onHeartbeatFail () {\n this.closeSocket()\n this.emit('silence')\n console.error('Heartbeat lost, probing server...')\n clearInterval(this.pingInterval)\n\n this.pingInterval = setInterval(() => {\n console.log('> ping')\n this.emit('ping')\n $.get('http://' + window._root + '/system/ping', (resp, status) => {\n if (status === 200) {\n clearInterval(this.pingInterval)\n console.info('Server ready, opening socket…')\n this.emit('ping-success')\n this.init()\n // location.reload()\n } else this.emit('ping-fail', status)\n }, {\n timeout: 100,\n loader: false // we have loader on-screen\n })\n }, 1000)\n }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./js/term/connection.js","const $ = require('../lib/chibi')\nconst { encode2B } = require('../utils')\n\n/**\n * User input\n *\n * --- Rx messages: ---\n * S - screen content (binary encoding of the entire screen with simple compression)\n * T - text labels - Title and buttons, \\0x01-separated\n * B - beep\n * . - heartbeat\n *\n * --- Tx messages ---\n * s - string\n * b - action button\n * p - mb press\n * r - mb release\n * m - mouse move\n */\nmodule.exports = function (conn, screen) {\n // handle for input object\n let input\n\n const KEY_NAMES = {\n 0x03: 'Cancel',\n 0x06: 'Help',\n 0x08: 'Backspace',\n 0x09: 'Tab',\n 0x0C: 'Clear',\n 0x0D: 'Enter',\n 0x10: 'Shift',\n 0x11: 'Control',\n 0x12: 'Alt',\n 0x13: 'Pause',\n 0x14: 'CapsLock',\n 0x1B: 'Escape',\n 0x20: ' ',\n 0x21: 'PageUp',\n 0x22: 'PageDown',\n 0x23: 'End',\n 0x24: 'Home',\n 0x25: 'ArrowLeft',\n 0x26: 'ArrowUp',\n 0x27: 'ArrowRight',\n 0x28: 'ArrowDown',\n 0x29: 'Select',\n 0x2A: 'Print',\n 0x2B: 'Execute',\n 0x2C: 'PrintScreen',\n 0x2D: 'Insert',\n 0x2E: 'Delete',\n 0x3A: ':',\n 0x3B: ';',\n 0x3C: '<',\n 0x3D: '=',\n 0x3E: '>',\n 0x3F: '?',\n 0x40: '@',\n 0x5B: 'Meta',\n 0x5C: 'Meta',\n 0x5D: 'ContextMenu',\n 0x6A: 'Numpad*',\n 0x6B: 'Numpad+',\n 0x6D: 'Numpad-',\n 0x6E: 'Numpad.',\n 0x6F: 'Numpad/',\n 0x90: 'NumLock',\n 0x91: 'ScrollLock',\n 0xA0: '^',\n 0xA1: '!',\n 0xA2: '\"',\n 0xA3: '#',\n 0xA4: '$',\n 0xA5: '%',\n 0xA6: '&',\n 0xA7: '_',\n 0xA8: '(',\n 0xA9: ')',\n 0xAA: '*',\n 0xAB: '+',\n 0xAC: '|',\n 0xAD: '-',\n 0xAE: '{',\n 0xAF: '}',\n 0xB0: '~',\n 0xBA: ';',\n 0xBB: '=',\n 0xBC: 'Numpad,',\n 0xBD: '-',\n 0xBE: 'Numpad,',\n 0xC0: '`',\n 0xC2: 'Numpad,',\n 0xDB: '[',\n 0xDC: '\\\\',\n 0xDD: ']',\n 0xDE: \"'\",\n 0xE0: 'Meta'\n }\n // numbers 0-9\n for (let i = 0x30; i <= 0x39; i++) KEY_NAMES[i] = String.fromCharCode(i)\n // characters A-Z\n for (let i = 0x41; i <= 0x5A; i++) KEY_NAMES[i] = String.fromCharCode(i)\n // function F1-F20\n for (let i = 0x70; i <= 0x83; i++) KEY_NAMES[i] = `F${i - 0x70 + 1}`\n // numpad 0-9\n for (let i = 0x60; i <= 0x69; i++) KEY_NAMES[i] = `Numpad${i - 0x60}`\n\n let cfg = {\n np_alt: false,\n cu_alt: false,\n fn_alt: false,\n mt_click: false,\n mt_move: false,\n no_keys: false,\n crlf_mode: false,\n all_fn: false\n }\n\n /** Fn alt choice for key message */\n const fa = (alt, normal) => cfg.fn_alt ? alt : normal\n\n /** Cursor alt choice for key message */\n const ca = (alt, normal) => cfg.cu_alt ? alt : normal\n\n /** Numpad alt choice for key message */\n const na = (alt, normal) => cfg.np_alt ? alt : normal\n\n const keymap = {\n /* eslint-disable key-spacing */\n 'Backspace': '\\x08',\n 'Tab': '\\x09',\n 'Enter': () => cfg.crlf_mode ? '\\x0d\\x0a' : '\\x0d',\n 'Control+Enter': '\\x0a',\n 'Escape': '\\x1b',\n 'ArrowUp': () => ca('\\x1bOA', '\\x1b[A'),\n 'ArrowDown': () => ca('\\x1bOB', '\\x1b[B'),\n 'ArrowRight': () => ca('\\x1bOC', '\\x1b[C'),\n 'ArrowLeft': () => ca('\\x1bOD', '\\x1b[D'),\n 'Home': () => ca('\\x1bOH', fa('\\x1b[H', '\\x1b[1~')),\n 'Insert': '\\x1b[2~',\n 'Delete': '\\x1b[3~',\n 'End': () => ca('\\x1bOF', fa('\\x1b[F', '\\x1b[4~')),\n 'PageUp': '\\x1b[5~',\n 'PageDown': '\\x1b[6~',\n 'F1': () => fa('\\x1bOP', '\\x1b[11~'),\n 'F2': () => fa('\\x1bOQ', '\\x1b[12~'),\n 'F3': () => fa('\\x1bOR', '\\x1b[13~'),\n 'F4': () => fa('\\x1bOS', '\\x1b[14~'),\n 'F5': '\\x1b[15~', // note the disconnect\n 'F6': '\\x1b[17~',\n 'F7': '\\x1b[18~',\n 'F8': '\\x1b[19~',\n 'F9': '\\x1b[20~',\n 'F10': '\\x1b[21~', // note the disconnect\n 'F11': '\\x1b[23~',\n 'F12': '\\x1b[24~',\n 'Shift+F1': () => fa('\\x1bO1;2P', '\\x1b[25~'),\n 'Shift+F2': () => fa('\\x1bO1;2Q', '\\x1b[26~'), // note the disconnect\n 'Shift+F3': () => fa('\\x1bO1;2R', '\\x1b[28~'),\n 'Shift+F4': () => fa('\\x1bO1;2S', '\\x1b[29~'), // note the disconnect\n 'Shift+F5': () => fa('\\x1b[15;2~', '\\x1b[31~'),\n 'Shift+F6': () => fa('\\x1b[17;2~', '\\x1b[32~'),\n 'Shift+F7': () => fa('\\x1b[18;2~', '\\x1b[33~'),\n 'Shift+F8': () => fa('\\x1b[19;2~', '\\x1b[34~'),\n 'Shift+F9': () => fa('\\x1b[20;2~', '\\x1b[35~'), // 35-38 are not standard - but what is?\n 'Shift+F10': () => fa('\\x1b[21;2~', '\\x1b[36~'),\n 'Shift+F11': () => fa('\\x1b[22;2~', '\\x1b[37~'),\n 'Shift+F12': () => fa('\\x1b[23;2~', '\\x1b[38~'),\n 'Numpad0': () => na('\\x1bOp', '0'),\n 'Numpad1': () => na('\\x1bOq', '1'),\n 'Numpad2': () => na('\\x1bOr', '2'),\n 'Numpad3': () => na('\\x1bOs', '3'),\n 'Numpad4': () => na('\\x1bOt', '4'),\n 'Numpad5': () => na('\\x1bOu', '5'),\n 'Numpad6': () => na('\\x1bOv', '6'),\n 'Numpad7': () => na('\\x1bOw', '7'),\n 'Numpad8': () => na('\\x1bOx', '8'),\n 'Numpad9': () => na('\\x1bOy', '9'),\n 'Numpad*': () => na('\\x1bOR', '*'),\n 'Numpad+': () => na('\\x1bOl', '+'),\n 'Numpad-': () => na('\\x1bOS', '-'),\n 'Numpad.': () => na('\\x1bOn', '.'),\n 'Numpad/': () => na('\\x1bOQ', '/'),\n // we don't implement numlock key (should change in numpad_alt mode,\n // but it's even more useless than the rest and also has the side\n // effect of changing the user's numlock state)\n\n // shortcuts\n 'Control+]': '\\x1b', // alternate way to enter ESC\n 'Control+\\\\': '\\x1c',\n 'Control+[': '\\x1d',\n 'Control+^': '\\x1e',\n 'Control+_': '\\x1f',\n\n // extra controls\n 'Control+ArrowLeft': '\\x1f[1;5D',\n 'Control+ArrowRight': '\\x1f[1;5C',\n 'Control+ArrowUp': '\\x1f[1;5A',\n 'Control+ArrowDown': '\\x1f[1;5B',\n 'Control+Home': '\\x1f[1;5H',\n 'Control+End': '\\x1f[1;5F',\n\n // extra shift controls\n 'Shift+ArrowLeft': '\\x1f[1;2D',\n 'Shift+ArrowRight': '\\x1f[1;2C',\n 'Shift+ArrowUp': '\\x1f[1;2A',\n 'Shift+ArrowDown': '\\x1f[1;2B',\n 'Shift+Home': '\\x1f[1;2H',\n 'Shift+End': '\\x1f[1;2F',\n\n // macOS text editing commands\n 'Alt+ArrowLeft': '\\x1bb', // ⌥← to go back a word (^[b)\n 'Alt+ArrowRight': '\\x1bf', // ⌥→ to go forward one word (^[f)\n 'Meta+ArrowLeft': '\\x01', // ⌘← to go to the beginning of a line (^A)\n 'Meta+ArrowRight': '\\x05', // ⌘→ to go to the end of a line (^E)\n 'Alt+Backspace': '\\x17', // ⌥⌫ to delete a word (^W)\n 'Meta+Backspace': '\\x15', // ⌘⌫ to delete to the beginning of a line (^U)\n\n // copy to clipboard\n 'Control+Shift+C' () {\n screen.copySelectionToClipboard()\n },\n 'Control+Insert' () {\n screen.copySelectionToClipboard()\n },\n\n // toggle debug mode\n 'Control+F12' () {\n screen.window.debug ^= 1\n }\n /* eslint-enable key-spacing */\n }\n\n // ctrl+[A-Z] sent as simple low ASCII codes\n for (let i = 1; i <= 26; i++) {\n keymap[`Control+${String.fromCharCode(0x40 + i)}`] = String.fromCharCode(i)\n }\n\n /** Send a literal message */\n function sendString (str) {\n return conn.send('s' + str)\n }\n\n /** Send a button event */\n function sendButton (n) {\n conn.send('b' + String.fromCharCode(n))\n }\n\n const shouldAcceptEvent = function () {\n if (cfg.no_keys) return false\n if (document.activeElement instanceof window.HTMLTextAreaElement) return false\n return true\n }\n\n const keyBlacklist = [\n 'F5', 'F11', 'F12', 'Shift+F5'\n ]\n\n const handleKeyDown = function (e) {\n if (!shouldAcceptEvent()) return\n if (cfg.no_keys) return\n\n let modifiers = []\n // sorted alphabetically\n if (e.altKey) modifiers.push('Alt')\n if (e.ctrlKey) modifiers.push('Control')\n if (e.metaKey) modifiers.push('Meta')\n if (e.shiftKey) modifiers.push('Shift')\n\n let key = KEY_NAMES[e.which] || e.key\n\n // ignore clipboard events\n if ((e.ctrlKey || e.metaKey) && key === 'V') return\n\n let binding = null\n\n for (let name in keymap) {\n let itemModifiers = name.split('+')\n let itemKey = itemModifiers.pop()\n\n if (itemKey === key && itemModifiers.sort().join() === modifiers.join()) {\n if (keyBlacklist.includes(name) && !cfg.all_fn) continue\n binding = keymap[name]\n break\n }\n }\n\n if (binding) {\n if (binding instanceof Function) binding = binding()\n e.preventDefault()\n if (typeof binding === 'string') {\n sendString(binding)\n }\n }\n }\n\n /** Bind/rebind key messages */\n function initKeys ({ allFn }) {\n // This takes care of text characters typed\n window.addEventListener('keypress', function (evt) {\n if (!shouldAcceptEvent()) return\n if (evt.ctrlKey || evt.metaKey) return\n\n let str = ''\n if (evt.key && evt.key.length === 1) str = evt.key\n else if (evt.which && evt.which !== 229) str = String.fromCodePoint(evt.which)\n\n if (str.length > 0 && str.charCodeAt(0) >= 32) {\n // prevent space from scrolling\n if (evt.which === 32) evt.preventDefault()\n sendString(str)\n }\n })\n\n window.addEventListener('keydown', handleKeyDown)\n window.addEventListener('copy', e => {\n if (!shouldAcceptEvent()) return\n let selectedText = screen.getSelectedText()\n if (selectedText) {\n e.preventDefault()\n e.clipboardData.setData('text/plain', selectedText)\n }\n })\n window.addEventListener('paste', e => {\n if (!shouldAcceptEvent()) return\n e.preventDefault()\n let string = e.clipboardData.getData('text/plain')\n if (string.includes('\\n') || string.length > 90) {\n if (!input.termUpload) console.error('input.termUpload is undefined')\n input.termUpload.setContent(string)\n input.termUpload.open()\n } else {\n // simple string, just paste it\n if (screen.bracketedPaste) string = `\\x1b[200~${string}\\x1b[201~`\n sendString(string)\n }\n })\n\n cfg.all_fn = allFn\n }\n\n // mouse button states\n let mb1 = 0\n let mb2 = 0\n let mb3 = 0\n\n /** Init the Input module */\n function init (opts) {\n initKeys(opts)\n\n // Button presses\n $('#action-buttons button').forEach(s => {\n s.addEventListener('click', function (evt) {\n sendButton(+this.dataset['n'])\n })\n })\n\n // global mouse state tracking - for motion reporting\n window.addEventListener('mousedown', evt => {\n if (evt.button === 0) mb1 = 1\n if (evt.button === 1) mb2 = 1\n if (evt.button === 2) mb3 = 1\n })\n\n window.addEventListener('mouseup', evt => {\n if (evt.button === 0) mb1 = 0\n if (evt.button === 1) mb2 = 0\n if (evt.button === 2) mb3 = 0\n })\n }\n\n // record modifier keys\n // bits: Meta, Alt, Shift, Ctrl\n let modifiers = 0b0000\n\n window.addEventListener('keydown', e => {\n if (e.ctrlKey) modifiers |= 1\n if (e.shiftKey) modifiers |= 2\n if (e.altKey) modifiers |= 4\n if (e.metaKey) modifiers |= 8\n })\n window.addEventListener('keyup', e => {\n modifiers = 0\n if (e.ctrlKey) modifiers |= 1\n if (e.shiftKey) modifiers |= 2\n if (e.altKey) modifiers |= 4\n if (e.metaKey) modifiers |= 8\n })\n\n /** Prepare modifiers byte for mouse message */\n function packModifiersForMouse () {\n return modifiers\n }\n\n input = {\n /** Init the Input module */\n init,\n\n /** Send a literal string message */\n sendString,\n\n /** Enable alternate key modes (cursors, numpad, fn) */\n setAlts: function (cu, np, fn, crlf) {\n if (cfg.cu_alt !== cu || cfg.np_alt !== np || cfg.fn_alt !== fn || cfg.crlf_mode !== crlf) {\n cfg.cu_alt = cu\n cfg.np_alt = np\n cfg.fn_alt = fn\n cfg.crlf_mode = crlf\n }\n },\n\n setMouseMode (click, move) {\n cfg.mt_click = click\n cfg.mt_move = move\n },\n\n // Mouse events\n onMouseMove (x, y) {\n if (!cfg.mt_move) return\n const b = mb1 ? 1 : mb2 ? 2 : mb3 ? 3 : 0\n const m = packModifiersForMouse()\n conn.send('m' + encode2B(y) + encode2B(x) + encode2B(b) + encode2B(m))\n },\n\n onMouseDown (x, y, b) {\n if (!cfg.mt_click) return\n if (b > 3 || b < 1) return\n const m = packModifiersForMouse()\n conn.send('p' + encode2B(y) + encode2B(x) + encode2B(b) + encode2B(m))\n },\n\n onMouseUp (x, y, b) {\n if (!cfg.mt_click) return\n if (b > 3 || b < 1) return\n const m = packModifiersForMouse()\n conn.send('r' + encode2B(y) + encode2B(x) + encode2B(b) + encode2B(m))\n // console.log(\"B \",b,\" M \",m);\n },\n\n onMouseWheel (x, y, dir) {\n if (!cfg.mt_click) return\n // -1 ... btn 4 (away from user)\n // +1 ... btn 5 (towards user)\n const m = packModifiersForMouse()\n const b = (dir < 0 ? 4 : 5)\n conn.send('p' + encode2B(y) + encode2B(x) + encode2B(b) + encode2B(m))\n // console.log(\"B \",b,\" M \",m);\n },\n\n /**\n * Prevent capturing keys. This is used for text input\n * modals on the terminal screen\n */\n blockKeys (yes) {\n cfg.no_keys = yes\n },\n\n handleKeyDown\n }\n return input\n}\n\n\n\n// WEBPACK FOOTER //\n// ./js/term/input.js","const $ = require('../lib/chibi')\nconst { qs } = require('../utils')\nconst modal = require('../modal')\n\n/** File upload utility */\nmodule.exports = function (conn, input, screen) {\n let lines, // array of lines without newlines\n line_i, // current line index\n fuTout, // timeout handle for line sending\n send_delay_ms, // delay between lines (ms)\n nl_str, // newline string to use\n curLine, // current line (when using fuOil)\n inline_pos // Offset in line (for long lines)\n\n // lines longer than this are split to chunks\n // sending a super-ling string through the socket is not a good idea\n const MAX_LINE_LEN = 128\n\n function openUploadDialog () {\n updateStatus('Ready...')\n modal.show('#fu_modal', onDialogClose)\n $('#fu_form').toggleClass('busy', false)\n input.blockKeys(true)\n }\n\n function onDialogClose () {\n console.log('Upload modal closed.')\n clearTimeout(fuTout)\n line_i = 0\n input.blockKeys(false)\n }\n\n function updateStatus (msg) {\n qs('#fu_prog').textContent = msg\n }\n\n function startUpload () {\n let v = qs('#fu_text').value\n if (!v.length) {\n fuClose()\n return\n }\n\n lines = v.split('\\n')\n line_i = 0\n inline_pos = 0 // offset in line\n send_delay_ms = qs('#fu_delay').value\n\n // sanitize - 0 causes overflows\n if (send_delay_ms < 0) {\n send_delay_ms = 0\n qs('#fu_delay').value = send_delay_ms\n }\n\n nl_str = {\n 'CR': '\\r',\n 'LF': '\\n',\n 'CRLF': '\\r\\n'\n }[qs('#fu_crlf').value]\n\n $('#fu_form').toggleClass('busy', true)\n updateStatus('Starting...')\n uploadLine()\n }\n\n function uploadLine () {\n if (!$('#fu_modal').hasClass('visible')) {\n // Modal is closed, cancel\n return\n }\n\n if (!conn.canSend()) {\n // postpone\n fuTout = setTimeout(uploadLine, 1)\n return\n }\n\n if (inline_pos === 0) {\n curLine = ''\n if (line_i === 0) {\n if (screen.bracketedPaste) {\n curLine = '\\x1b[200~'\n }\n }\n\n curLine += lines[line_i++] + nl_str\n\n if (line_i === lines.length) {\n if (screen.bracketedPaste) {\n curLine += '\\x1b[201~'\n }\n }\n }\n\n let chunk\n if ((curLine.length - inline_pos) <= MAX_LINE_LEN) {\n chunk = curLine.substr(inline_pos, MAX_LINE_LEN)\n inline_pos = 0\n } else {\n chunk = curLine.substr(inline_pos, MAX_LINE_LEN)\n inline_pos += MAX_LINE_LEN\n }\n\n if (!input.sendString(chunk)) {\n updateStatus('FAILED!')\n return\n }\n\n let pt = Math.round((line_i / lines.length) * 1000) / 10\n updateStatus(`${line_i} / ${lines.length} (${pt}%)`)\n\n if (lines.length > line_i || inline_pos > 0) {\n fuTout = setTimeout(uploadLine, send_delay_ms)\n } else {\n closeWhenReady()\n }\n }\n\n function closeWhenReady () {\n if (!conn.canSend()) {\n // stuck in XOFF still, wait to process...\n updateStatus('Waiting for Tx buffer...')\n setTimeout(closeWhenReady, 100)\n } else {\n updateStatus('Done.')\n // delay to show it\n fuClose()\n }\n }\n\n function fuClose () {\n modal.hide('#fu_modal')\n }\n\n return {\n init: function () {\n qs('#fu_file').addEventListener('change', function (evt) {\n let reader = new window.FileReader()\n let file = evt.target.files[0]\n let ftype = file.type || 'application/octet-stream'\n console.log('Selected file type: ' + ftype)\n if (!ftype.match(/text\\/.*|application\\/(json|csv|.*xml.*|.*script.*|x-php)/)) {\n // Deny load of blobs like img - can crash browser and will get corrupted anyway\n if (!window.confirm(`This does not look like a text file: ${ftype}\\nReally load?`)) {\n qs('#fu_file').value = ''\n return\n }\n }\n reader.onload = function (e) {\n const txt = e.target.result.replace(/[\\r\\n]+/, '\\n')\n qs('#fu_text').value = txt\n }\n console.log('Loading file...')\n reader.readAsText(file)\n }, false)\n\n qs('#term-fu-open').addEventListener('click', function () {\n openUploadDialog()\n return false\n })\n\n qs('#term-fu-start').addEventListener('click', function () {\n startUpload()\n return false\n })\n\n qs('#term-fu-close').addEventListener('click', function () {\n fuClose()\n return false\n })\n },\n open: openUploadDialog,\n setContent (content) {\n qs('#fu_text').value = content\n }\n }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./js/term/upload.js","const { qs } = require('../utils')\n\nmodule.exports = function (screen, input) {\n const keyInput = qs('#softkb-input')\n if (!keyInput) return // abort, we're not on the terminal page\n\n const shortcutBar = document.createElement('div')\n shortcutBar.id = 'keyboard-shortcut-bar'\n if (navigator.userAgent.match(/iPad|iPhone|iPod/)) {\n qs('#screen').appendChild(shortcutBar)\n }\n\n let keyboardOpen = false\n\n // moves the input to where the cursor is on the canvas.\n // this is because most browsers will always scroll to wherever the focused\n // input is\n let updateInputPosition = function () {\n if (!keyboardOpen) return\n\n let [x, y] = screen.gridToScreen(screen.cursor.x, screen.cursor.y, true)\n keyInput.style.transform = `translate(${x}px, ${y}px)`\n }\n\n keyInput.addEventListener('focus', () => {\n keyboardOpen = true\n updateInputPosition()\n shortcutBar.classList.add('open')\n })\n\n keyInput.addEventListener('blur', () => {\n keyboardOpen = false\n shortcutBar.classList.remove('open')\n })\n\n screen.on('cursor-moved', updateInputPosition)\n\n qs('#term-kb-open').addEventListener('click', e => {\n e.preventDefault()\n keyInput.focus()\n })\n\n // Chrome for Android doesn't send proper keydown/keypress events with\n // real key values instead of 229 “Unidentified,” so here's a workaround\n // that deals with the input composition events.\n\n let lastCompositionString = ''\n\n // sends the difference between the last and the new composition string\n let sendInputDelta = function (newValue) {\n let resend = false\n if (newValue.length > lastCompositionString.length) {\n if (newValue.startsWith(lastCompositionString)) {\n // characters have been added at the end\n input.sendString(newValue.substr(lastCompositionString.length))\n } else resend = true\n } else if (newValue.length < lastCompositionString.length) {\n if (lastCompositionString.startsWith(newValue)) {\n // characters have been removed at the end\n input.sendString('\\b'.repeat(lastCompositionString.length -\n newValue.length))\n } else resend = true\n } else if (newValue !== lastCompositionString) resend = true\n\n if (resend) {\n // the entire string changed; resend everything\n input.sendString('\\b'.repeat(lastCompositionString.length) +\n newValue)\n }\n lastCompositionString = newValue\n }\n\n keyInput.addEventListener('keydown', e => {\n if (e.key === 'Unidentified') return\n\n keyInput.value = ''\n\n e.stopPropagation()\n input.handleKeyDown(e)\n })\n\n keyInput.addEventListener('keypress', e => {\n // prevent key duplication on iOS (because Safari *does* send proper events)\n e.stopPropagation()\n })\n\n keyInput.addEventListener('input', e => {\n e.stopPropagation()\n\n if (e.isComposing && 'data' in e) {\n sendInputDelta(e.data)\n } else if (e.isComposing) {\n // Firefox Mobile doesn't support InputEvent#data, so here's a hack\n // that just takes the input value and uses that\n sendInputDelta(keyInput.value)\n } else {\n if (e.inputType === 'insertCompositionText') input.sendString(e.data)\n else if (e.inputType === 'deleteContentBackward') {\n lastCompositionString = ''\n sendInputDelta('')\n } else if (e.inputType === 'insertText') {\n input.sendString(e.data)\n }\n }\n })\n\n keyInput.addEventListener('compositionstart', e => {\n lastCompositionString = ''\n })\n\n keyInput.addEventListener('compositionend', e => {\n lastCompositionString = ''\n keyInput.value = ''\n })\n\n screen.on('open-soft-keyboard', () => keyInput.focus())\n\n // shortcut bar\n const shortcuts = {\n Tab: 0x09,\n '←': 0x25,\n '↓': 0x28,\n '↑': 0x26,\n '→': 0x27,\n '^C': { which: 0x43, ctrlKey: true }\n }\n\n for (const shortcut in shortcuts) {\n const button = document.createElement('button')\n button.classList.add('shortcut-button')\n button.textContent = shortcut\n shortcutBar.appendChild(button)\n\n const key = shortcuts[shortcut]\n button.addEventListener('click', e => {\n e.preventDefault()\n let fakeEvent = key\n if (typeof key === 'number') fakeEvent = { which: key }\n fakeEvent.preventDefault = () => {}\n input.handleKeyDown(fakeEvent)\n })\n }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./js/term/soft_keyboard.js","const { mk } = require('../utils')\n\nmodule.exports = function attachDebugScreen (screen) {\n const debugCanvas = mk('canvas')\n const ctx = debugCanvas.getContext('2d')\n\n debugCanvas.style.position = 'absolute'\n // hackity hack should probably set this in CSS\n debugCanvas.style.top = '6px'\n debugCanvas.style.left = '6px'\n debugCanvas.style.pointerEvents = 'none'\n\n let addCanvas = function () {\n if (!debugCanvas.parentNode) screen.canvas.parentNode.appendChild(debugCanvas)\n }\n let removeCanvas = function () {\n if (debugCanvas.parentNode) debugCanvas.parentNode.removeChild(debugCanvas)\n }\n let updateCanvasSize = function () {\n let { width, height, devicePixelRatio } = screen.window\n let cellSize = screen.getCellSize()\n debugCanvas.width = width * cellSize.width * devicePixelRatio\n debugCanvas.height = height * cellSize.height * devicePixelRatio\n debugCanvas.style.width = `${width * cellSize.width}px`\n debugCanvas.style.height = `${height * cellSize.height}px`\n }\n\n let startTime, endTime, lastReason\n let cells = new Map()\n let clippedRects = []\n\n let startDrawing\n\n screen._debug = {\n drawStart (reason) {\n lastReason = reason\n startTime = Date.now()\n clippedRects = []\n },\n drawEnd () {\n endTime = Date.now()\n console.log(`Draw: ${lastReason} (${(endTime - startTime)} ms) with fancy graphics: ${screen.window.graphics}`)\n startDrawing()\n },\n setCell (cell, flags) {\n cells.set(cell, [flags, Date.now()])\n },\n clipRect (...args) {\n clippedRects.push(args)\n }\n }\n\n let clipPattern\n {\n let patternCanvas = document.createElement('canvas')\n patternCanvas.width = patternCanvas.height = 12\n let pctx = patternCanvas.getContext('2d')\n pctx.lineWidth = 1\n pctx.strokeStyle = '#00f'\n pctx.beginPath()\n pctx.moveTo(0, 0)\n pctx.lineTo(0 - 4, 12)\n pctx.moveTo(4, 0)\n pctx.lineTo(4 - 4, 12)\n pctx.moveTo(8, 0)\n pctx.lineTo(8 - 4, 12)\n pctx.moveTo(12, 0)\n pctx.lineTo(12 - 4, 12)\n pctx.moveTo(16, 0)\n pctx.lineTo(16 - 4, 12)\n pctx.stroke()\n clipPattern = ctx.createPattern(patternCanvas, 'repeat')\n }\n\n let isDrawing = false\n\n let drawLoop = function () {\n if (isDrawing) window.requestAnimationFrame(drawLoop)\n\n let { devicePixelRatio, width, height } = screen.window\n let { width: cellWidth, height: cellHeight } = screen.getCellSize()\n let screenLength = width * height\n let now = Date.now()\n\n ctx.setTransform(devicePixelRatio, 0, 0, devicePixelRatio, 0, 0)\n ctx.clearRect(0, 0, width * cellWidth, height * cellHeight)\n\n let activeCells = 0\n for (let cell = 0; cell < screenLength; cell++) {\n if (!cells.has(cell) || cells.get(cell)[0] === 0) continue\n\n let [flags, timestamp] = cells.get(cell)\n let elapsedTime = (now - timestamp) / 1000\n\n if (elapsedTime > 1) continue\n\n activeCells++\n ctx.globalAlpha = 0.5 * Math.max(0, 1 - elapsedTime)\n\n let x = cell % width\n let y = Math.floor(cell / width)\n\n if (flags & 1) {\n // redrawn\n ctx.fillStyle = '#f0f'\n }\n if (flags & 2) {\n // updated\n ctx.fillStyle = '#0f0'\n }\n\n ctx.fillRect(x * cellWidth, y * cellHeight, cellWidth, cellHeight)\n\n if (flags & 4) {\n // wide cell\n ctx.lineWidth = 2\n ctx.strokeStyle = '#f00'\n ctx.strokeRect(x * cellWidth, y * cellHeight, cellWidth, cellHeight)\n }\n }\n\n if (clippedRects.length) {\n ctx.globalAlpha = 0.5\n ctx.beginPath()\n\n for (let rect of clippedRects) {\n ctx.rect(...rect)\n }\n\n ctx.fillStyle = clipPattern\n ctx.fill()\n }\n\n if (activeCells === 0) {\n isDrawing = false\n removeCanvas()\n }\n }\n\n startDrawing = function () {\n if (isDrawing) return\n addCanvas()\n updateCanvasSize()\n isDrawing = true\n drawLoop()\n }\n\n // debug toolbar\n const toolbar = mk('div')\n toolbar.classList.add('debug-toolbar')\n let toolbarAttached = false\n\n const attachToolbar = function () {\n screen.canvas.parentNode.appendChild(toolbar)\n }\n const detachToolbar = function () {\n toolbar.parentNode.removeChild(toolbar)\n }\n\n screen.on('update-window:debug', debug => {\n if (debug !== toolbarAttached) {\n toolbarAttached = debug\n if (debug) attachToolbar()\n else detachToolbar()\n }\n })\n\n screen.on('draw', () => {\n if (!toolbarAttached) return\n let cursorCell = screen.cursor.y * screen.window.width + screen.cursor.x\n let cellFG = screen.screenFG[cursorCell]\n let cellBG = screen.screenBG[cursorCell]\n let cellCode = (screen.screen[cursorCell] || '').codePointAt(0)\n let cellAttrs = screen.screenAttrs[cursorCell]\n let hexcode = cellCode.toString(16).toUpperCase()\n if (hexcode.length < 4) hexcode = `0000${hexcode}`.substr(-4)\n hexcode = `U+${hexcode}`\n toolbar.textContent = `Cursor cell (${cursorCell}): ${hexcode} FG: ${cellFG} BG: ${cellBG} Attrs: ${cellAttrs.toString(2)}`\n })\n}\n\n\n\n// WEBPACK FOOTER //\n// ./js/term/debug_screen.js"],"sourceRoot":""}