]> git.proxmox.com Git - pve-xtermjs.git/blob - src/www/xterm.js.map
upgrade xterm.js to version 4.7.0
[pve-xtermjs.git] / src / www / xterm.js.map
1 {"version":3,"sources":["webpack:///webpack/universalModuleDefinition","webpack:///webpack/bootstrap","webpack:///./src/common/EventEmitter.ts","webpack:///./src/common/services/Services.ts","webpack:///./src/common/Lifecycle.ts","webpack:///./src/common/buffer/Constants.ts","webpack:///./src/common/buffer/CellData.ts","webpack:///./src/browser/services/Services.ts","webpack:///./src/common/buffer/AttributeData.ts","webpack:///./src/browser/Lifecycle.ts","webpack:///./src/common/input/TextDecoder.ts","webpack:///./src/browser/renderer/atlas/Constants.ts","webpack:///./src/browser/Color.ts","webpack:///./src/common/Platform.ts","webpack:///./src/common/data/EscapeSequences.ts","webpack:///./src/browser/renderer/BaseRenderLayer.ts","webpack:///./src/common/services/ServiceRegistry.ts","webpack:///./src/common/TypedArrayUtils.ts","webpack:///./src/common/buffer/BufferLine.ts","webpack:///./src/browser/Dom.ts","webpack:///./src/browser/LocalizableStrings.ts","webpack:///./src/common/InputHandler.ts","webpack:///./src/common/data/Charsets.ts","webpack:///./src/common/parser/Params.ts","webpack:///./src/common/parser/OscParser.ts","webpack:///./src/common/parser/Constants.ts","webpack:///./src/common/parser/DcsParser.ts","webpack:///./src/browser/renderer/atlas/CharAtlasCache.ts","webpack:///./src/browser/renderer/atlas/CharAtlasUtils.ts","webpack:///./src/browser/ColorManager.ts","webpack:///./src/browser/renderer/RendererUtils.ts","webpack:///./src/browser/renderer/CharacterJoinerRegistry.ts","webpack:///./src/browser/input/Mouse.ts","webpack:///./src/browser/RenderDebouncer.ts","webpack:///./src/browser/ScreenDprMonitor.ts","webpack:///./src/common/Clone.ts","webpack:///./src/browser/public/Terminal.ts","webpack:///./src/browser/Terminal.ts","webpack:///./src/browser/input/CompositionHelper.ts","webpack:///./src/browser/Viewport.ts","webpack:///./src/browser/Clipboard.ts","webpack:///./src/common/parser/EscapeSequenceParser.ts","webpack:///./src/browser/renderer/Renderer.ts","webpack:///./src/browser/renderer/TextRenderLayer.ts","webpack:///./src/browser/renderer/GridCache.ts","webpack:///./src/browser/renderer/atlas/DynamicCharAtlas.ts","webpack:///./src/browser/renderer/atlas/BaseCharAtlas.ts","webpack:///./src/browser/ColorContrastCache.ts","webpack:///./src/browser/renderer/atlas/LRUMap.ts","webpack:///./src/browser/renderer/SelectionRenderLayer.ts","webpack:///./src/browser/renderer/CursorRenderLayer.ts","webpack:///./src/browser/renderer/LinkRenderLayer.ts","webpack:///./src/browser/Linkifier.ts","webpack:///./src/browser/services/SelectionService.ts","webpack:///./src/browser/selection/SelectionModel.ts","webpack:///./src/browser/input/MoveToCell.ts","webpack:///./src/browser/services/SoundService.ts","webpack:///./src/browser/MouseZoneManager.ts","webpack:///./src/browser/AccessibilityManager.ts","webpack:///./src/browser/renderer/dom/DomRenderer.ts","webpack:///./src/browser/renderer/dom/DomRendererRowFactory.ts","webpack:///./src/common/input/Keyboard.ts","webpack:///./src/browser/services/RenderService.ts","webpack:///./src/browser/services/CharSizeService.ts","webpack:///./src/browser/services/MouseService.ts","webpack:///./src/browser/Linkifier2.ts","webpack:///./src/browser/services/CoreBrowserService.ts","webpack:///./src/common/CoreTerminal.ts","webpack:///./src/common/services/InstantiationService.ts","webpack:///./src/common/services/LogService.ts","webpack:///./src/common/services/BufferService.ts","webpack:///./src/common/buffer/BufferSet.ts","webpack:///./src/common/buffer/Buffer.ts","webpack:///./src/common/CircularList.ts","webpack:///./src/common/buffer/BufferReflow.ts","webpack:///./src/common/buffer/Marker.ts","webpack:///./src/common/services/OptionsService.ts","webpack:///./src/common/services/CoreService.ts","webpack:///./src/common/services/CoreMouseService.ts","webpack:///./src/common/services/DirtyRowService.ts","webpack:///./src/common/services/UnicodeService.ts","webpack:///./src/common/input/UnicodeV6.ts","webpack:///./src/common/services/CharsetService.ts","webpack:///./src/common/WindowsMode.ts","webpack:///./src/common/input/WriteBuffer.ts","webpack:///./src/browser/public/AddonManager.ts"],"names":["root","factory","exports","module","define","amd","a","i","window","installedModules","__webpack_require__","moduleId","l","modules","call","m","c","d","name","getter","o","Object","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","prototype","hasOwnProperty","p","s","_listeners","_disposed","this","_event","listener","push","dispose","length","splice","fire","arg1","arg2","queue","undefined","EventEmitter","from","to","e","IBufferService","createDecorator","ICoreMouseService","ICoreService","ICharsetService","IDirtyRowService","IInstantiationService","ILogService","IOptionsService","IUnicodeService","_disposables","_isDisposed","register","unregister","index","indexOf","disposeArray","disposables","Disposable","array","DEFAULT_COLOR","DEFAULT_ATTR","CHAR_DATA_ATTR_INDEX","CHAR_DATA_CHAR_INDEX","CHAR_DATA_WIDTH_INDEX","CHAR_DATA_CODE_INDEX","NULL_CELL_CHAR","NULL_CELL_WIDTH","NULL_CELL_CODE","WHITESPACE_CELL_CHAR","WHITESPACE_CELL_WIDTH","WHITESPACE_CELL_CODE","content","fg","bg","extended","ExtendedAttrs","combinedData","fromCharData","obj","CellData","setFromCharData","isCombined","getWidth","getChars","stringFromCodePoint","getCode","charCodeAt","combined","code","second","getAsCharData","AttributeData","ICharSizeService","ICoreBrowserService","IMouseService","IRenderService","ISelectionService","ISoundService","toColorRGB","fromColorRGB","clone","newObj","isInverse","isBold","isUnderline","isBlink","isInvisible","isItalic","isDim","getFgColorMode","getBgColorMode","isFgRGB","isBgRGB","isFgPalette","isBgPalette","isFgDefault","isBgDefault","isAttributeDefault","getFgColor","getBgColor","hasExtendedAttrs","updateExtended","isEmpty","getUnderlineColor","underlineColor","getUnderlineColorMode","isUnderlineColorRGB","isUnderlineColorPalette","isUnderlineColorDefault","getUnderlineStyle","underlineStyle","node","type","handler","options","addEventListener","disposed","removeEventListener","codePoint","String","fromCharCode","data","start","end","result","codepoint","_interim","clear","decode","input","target","size","startPos","StringToUtf32","interim","Uint8Array","fill","byte1","byte2","byte3","byte4","discardInterim","cp","pos","tmp","missing","fourStop","Utf8ToUtf32","INVERTED_DEFAULT_COLOR","DIM_OPACITY","CHAR_ATLAS_CELL_SPACING","channels","rgb","rgba","toPaddedHex","toString","contrastRatio","l1","l2","toCss","g","b","toRgba","color","blend","css","fgR","fgG","fgB","bgR","bgG","bgB","Math","round","isOpaque","ensureContrastRatio","ratio","toColor","opaque","rgbaColor","toChannels","opacity","parseInt","slice","Error","relativeLuminance2","rs","gs","bs","pow","relativeLuminance","reduceLuminance","bgRgba","fgRgba","cr","max","ceil","increaseLuminance","min","bgL","fgL","isNode","navigator","userAgent","platform","contains","arr","el","isFirefox","isSafari","test","isMac","isIpad","isIphone","isWindows","isLinux","C0","NUL","SOH","STX","ETX","EOT","ENQ","ACK","BEL","BS","HT","LF","VT","FF","CR","SO","SI","DLE","DC1","DC2","DC3","DC4","NAK","SYN","ETB","CAN","EM","SUB","ESC","FS","GS","RS","US","SP","DEL","C1","PAD","HOP","BPH","NBH","IND","NEL","SSA","ESA","HTS","HTJ","VTS","PLD","PLU","RI","SS2","SS3","DCS","PU1","PU2","STS","CCH","MW","SPA","EPA","SOS","SGCI","SCI","CSI","ST","OSC","PM","APC","_container","id","zIndex","_alpha","_colors","_rendererId","_bufferService","_optionsService","_scaledCharWidth","_scaledCharHeight","_scaledCellWidth","_scaledCellHeight","_scaledCharLeft","_scaledCharTop","_currentGlyphIdentifier","chars","bold","dim","italic","_canvas","document","createElement","classList","add","style","_initCanvas","appendChild","removeElementFromParent","_charAtlas","_ctx","throwIfFalsy","getContext","alpha","_clearAll","onOptionsChanged","onBlur","onFocus","onCursorMove","onGridChanged","startRow","endRow","onSelectionChanged","columnSelectMode","setColors","colorSet","_refreshCharAtlas","_setTransparency","oldCanvas","cloneNode","replaceChild","rows","acquireCharAtlas","warmUp","resize","scaledCellWidth","scaledCellHeight","scaledCharWidth","scaledCharHeight","scaledCharLeft","scaledCharTop","width","scaledCanvasWidth","height","scaledCanvasHeight","canvasWidth","canvasHeight","_fillCells","x","y","fillRect","_fillBottomLineAtCells","devicePixelRatio","_fillLeftLineAtCell","_strokeRectAtCell","lineWidth","strokeRect","clearRect","fillStyle","background","_clearCells","_fillCharTrueColor","cell","font","_getFont","textBaseline","_clipRow","fillText","_drawChars","contrastColor","_getContrastColor","_drawUncachedChars","drawBoldTextInBrightColors","draw","fgOverride","save","join","ansi","foreground","globalAlpha","restore","beginPath","rect","cols","clip","fontWeightBold","fontWeight","fontSize","fontFamily","minimumContrastRatio","adjustedColor","contrastCache","getColor","fgColor","fgColorMode","bgColor","bgColorMode","temp","temp2","_resolveBackgroundRgba","_resolveForegroundRgba","setColor","inverse","BaseRenderLayer","storeServiceDependency","serviceRegistry","Map","ctor","has","decorator","arguments","set","fillFallback","constructor","DEFAULT_ATTR_DATA","freeze","fillCellData","isWrapped","_combined","_extendedAttrs","_data","Uint32Array","setCell","hasWidth","getFg","getBg","hasContent","getCodePoint","getString","loadCell","startIndex","setCellFromCodePoint","eAttrs","addCodepointToCell","insertCells","eraseAttr","deleteCells","replaceCells","subarray","keys","copyFrom","line","newLine","BufferLine","getTrimmedLength","copyCellsFrom","src","srcCol","destCol","applyInReverse","srcData","srcCombinedKeys","translateToString","trimRight","startCol","endCol","elements","parentElement","removeChild","promptLabel","tooMuchOutput","WindowsOptionsReportType","GLEVEL","paramToWindowOption","opts","setWinLines","restoreWin","minimizeWin","setWinPosition","setWinSizePixels","raiseWin","lowerWin","refreshWin","setWinSizeChars","maximizeWin","fullscreenWin","getWinState","getWinPosition","getWinSizePixels","getScreenSizePixels","getCellSizePixels","getWinSizeChars","getScreenSizeChars","getIconTitle","getWinTitle","pushTitle","popTitle","_coreService","_logService","hook","params","put","concat","unhook","success","utf32ToString","triggerDataEvent","pt","buffer","scrollTop","scrollBottom","cursorStyle","cursorBlink","debug","_charsetService","_dirtyRowService","_coreMouseService","_unicodeService","_parser","EscapeSequenceParser","_parseBuffer","_stringDecoder","_utf8Decoder","_workCell","_windowTitle","_iconName","_windowTitleStack","_iconNameStack","_curAttrData","_eraseAttrDataInternal","_onRequestBell","_onRequestRefreshRows","_onRequestReset","_onRequestScroll","_onRequestSyncScrollBar","_onRequestWindowsOptionsReport","_onA11yChar","_onA11yTab","_onCursorMove","_onLineFeed","_onScroll","_onTitleChange","setCsiHandlerFallback","ident","identifier","identToString","toArray","setEscHandlerFallback","setExecuteHandlerFallback","setOscHandlerFallback","action","setDcsHandlerFallback","payload","setPrintHandler","print","setCsiHandler","final","insertChars","intermediates","scrollLeft","cursorUp","scrollRight","cursorDown","cursorForward","cursorBackward","cursorNextLine","cursorPrecedingLine","cursorCharAbsolute","cursorPosition","cursorForwardTab","eraseInDisplay","prefix","eraseInLine","insertLines","deleteLines","deleteChars","scrollUp","scrollDown","eraseChars","cursorBackwardTab","charPosAbsolute","hPositionRelative","repeatPrecedingCharacter","sendDeviceAttributesPrimary","sendDeviceAttributesSecondary","linePosAbsolute","vPositionRelative","hVPosition","tabClear","setMode","setModePrivate","resetMode","resetModePrivate","charAttributes","deviceStatus","deviceStatusPrivate","softReset","setCursorStyle","setScrollRegion","saveCursor","windowOptions","restoreCursor","insertColumns","deleteColumns","setExecuteHandler","bell","lineFeed","carriageReturn","backspace","tab","shiftOut","shiftIn","nextLine","tabSet","setOscHandler","OscHandler","setTitle","setIconName","setEscHandler","reverseIndex","keypadApplicationMode","keypadNumericMode","fullReset","setgLevel","selectDefaultCharset","flag","selectCharset","CHARSETS","screenAlignmentPattern","setErrorHandler","state","error","setDcsHandler","DECRQSS","event","parse","cursorStartX","cursorStartY","clearRange","len","substring","chWidth","charset","screenReaderMode","wraparoundMode","decPrivateModes","wraparound","insertMode","modes","curAttr","bufferRow","lines","ybase","markDirty","wcwidth","ch","_eraseAttrData","getNullCell","precedingCodepoint","addCsiHandler","callback","addDcsHandler","DcsHandler","addEscHandler","addOscHandler","convertEol","reverseWraparound","_restrictCursor","originalX","nextStop","maxCol","origin","_setCursor","_moveCursor","diffToTop","diffToBottom","param","tabs","prevStop","_eraseInBufferLine","clearWrap","_resetBufferLine","j","scrollBackSize","trimStart","ydisp","row","scrollBottomRowsOffset","scrollBottomAbsolute","getBlankLine","markRangeDirty","_is","term","termName","applicationCursorKeys","setgCharset","DEFAULT_CHARSET","applicationKeypad","activeProtocol","sendFocus","activeEncoding","isCursorHidden","buffers","activateAltBuffer","isCursorInitialized","bracketedPasteMode","activateNormalBuffer","_updateAttrColor","c1","c2","c3","_extractColor","attr","accu","cSpace","advance","hasSubParams","subparams","getSubParams","_processUnderline","reset","savedX","savedY","savedCurAttrData","savedCharset","isBlinking","bottom","top","GET_WIN_SIZE_PIXELS","GET_CELL_SIZE_PIXELS","shift","pop","_savedCharset","collectAndFlag","scrollRegionHeight","shiftElements","level","yOffset","markAllDirty","InputHandler","maxLength","maxSubParamsLength","Int32Array","_subParams","_subParamsLength","_subParamsIdx","Uint16Array","_rejectDigits","_rejectSubDigits","_digitIsSub","fromArray","values","Params","Array","k","addSubParam","addParam","newParams","res","idx","getSubParamsAll","addDigit","store","cur","_state","_id","_handlers","_handlerFb","addHandler","handlerList","handlerIndex","setHandler","clearHandler","setHandlerFallback","_start","handlers","_put","_end","OscParser","_handler","_hitLimit","PAYLOAD_LIMIT","ret","EMPTY_HANDLERS","_active","_ident","DcsParser","_params","charAtlasCache","rendererId","colors","newConfig","generateConfig","ownedByIndex","entry","ownedBy","configEquals","config","atlas","newEntry","DynamicCharAtlas","clonedColors","cursor","cursorAccent","selection","allowTransparency","colorCode","DEFAULT_FOREGROUND","DEFAULT_BACKGROUND","DEFAULT_CURSOR","DEFAULT_CURSOR_ACCENT","DEFAULT_SELECTION","DEFAULT_ANSI_COLORS","v","canvas","ctx","globalCompositeOperation","_litmusColor","createLinearGradient","_contrastCache","ColorContrastCache","selectionTransparent","selectionOpaque","onOptionsChange","setTheme","theme","_parseColor","black","red","green","yellow","blue","magenta","cyan","white","brightBlack","brightRed","brightGreen","brightYellow","brightBlue","brightMagenta","brightCyan","brightWhite","fallback","console","warn","getImageData","split","map","component","Number","ColorManager","firstCell","_width","JoinedCellData","_characterJoiners","_nextCharacterJoinerId","registerCharacterJoiner","joiner","deregisterCharacterJoiner","joinerId","getJoinedCharacters","ranges","lineStr","rangeStartColumn","currentStringIndex","rangeStartStringIndex","rangeAttrFG","rangeAttrBG","joinedRanges","_getJoinedRanges","endIndex","lineData","text","joinerRanges","CharacterJoinerRegistry","_mergeRanges","_stringRangesToCellRanges","currentRangeIndex","currentRangeStarted","currentRange","newRange","inRange","range","getCoordsRelativeToElement","element","getBoundingClientRect","clientX","left","clientY","colCount","rowCount","hasValidCharSize","actualCellWidth","actualCellHeight","isSelection","coords","_renderCallback","_animationFrame","cancelAnimationFrame","refresh","rowStart","rowEnd","_rowCount","_rowStart","_rowEnd","requestAnimationFrame","_innerRefresh","RenderDebouncer","_currentDevicePixelRatio","setListener","_listener","clearListener","_outerListener","_updateDpr","_resolutionMediaMatchList","removeListener","matchMedia","addListener","ScreenDprMonitor","val","depth","clonedObject","isArray","_core","Terminal","_addonManager","AddonManager","_checkProposedApi","optionsService","allowProposedApi","onLineFeed","onSelectionChange","onData","onBinary","onTitleChange","onScroll","onKey","onRender","onResize","ParserApi","UnicodeApi","textarea","BufferNamespaceApi","markers","blur","focus","columns","_verifyIntegers","open","parent","attachCustomKeyEventHandler","customKeyEventHandler","registerLinkMatcher","regex","deregisterLinkMatcher","matcherId","registerLinkProvider","linkProvider","registerMarker","cursorYOffset","addMarker","hasSelection","select","column","getSelection","getSelectionPosition","clearSelection","selectAll","selectLines","scrollLines","amount","scrollPages","pageCount","scrollToTop","scrollToBottom","scrollToLine","write","writeUtf8","writeln","paste","getOption","setOption","loadAddon","addon","Strings","Infinity","isNaN","_buffer","init","getLine","BufferLineApiView","_buffers","_onBufferChange","_normal","BufferApiView","normal","_alternate","alt","onBufferActivate","active","alternate","_line","getCell","startColumn","endColumn","registerCsiHandler","registerDcsHandler","registerEscHandler","registerOscHandler","provider","unicodeService","versions","activeVersion","version","browser","Browser","_keyDownHandled","_onKey","_onRender","_onSelectionChange","_onFocus","_onBlur","_onA11yCharEmitter","_onA11yTabEmitter","_setup","linkifier","_instantiationService","createInstance","Linkifier","linkifier2","Linkifier2","_inputHandler","onRequestBell","onRequestRefreshRows","onRequestReset","onRequestScroll","scroll","onRequestWindowsOptionsReport","_reportWindowsOptions","forwardEvent","onA11yChar","onA11yTab","_afterResize","_renderService","_customKeyEventHandler","parentNode","preventScroll","_updateOptions","_charSizeService","measure","setRenderer","_createRenderer","viewport","syncScrollArea","_accessibilityManager","AccessibilityManager","setupTabStops","_setTheme","_onTextAreaFocus","ev","updateCursorStyle","_showCursor","_onTextAreaBlur","remove","_initGlobal","_bindKeys","addDisposableDomListener","copyHandler","_selectionService","pasteHandlerWrapper","handlePasteEvent","button","rightClickHandler","screenElement","rightClickSelectsWord","moveTextAreaUnderMouseCursor","_keyUp","_keyDown","_keyPress","_compositionHelper","compositionstart","compositionupdate","compositionend","updateCompositionElements","_queueLinkification","body","_document","ownerDocument","dir","setAttribute","fragment","createDocumentFragment","_viewportElement","_viewportScrollArea","_helperContainer","tabIndex","coreBrowserService","CoreBrowserService","setService","CharSizeService","_compositionView","CompositionHelper","_theme","_colorManager","onOptionChange","renderer","RenderService","onRenderedBufferChange","_soundService","SoundService","_mouseService","MouseService","Viewport","suppressEvent","onThemeChange","onRequestSyncScrollBar","onDimensionsChange","SelectionService","onRequestScrollLines","suppressScrollEvent","onRequestRedraw","onLinuxMouseSelection","_mouseZoneManager","MouseZoneManager","clearAll","attachToDom","onMouseDown","areMouseEventsActive","disable","enable","bindMouse","rendererType","Renderer","DomRenderer","self","sendEvent","but","getRawByteCoords","overrideType","buttons","deltaY","triggerMouseEvent","col","ctrl","ctrlKey","altKey","shiftKey","requestedEvents","mouseup","wheel","mousedrag","mousemove","eventListeners","cancel","preventDefault","onProtocolChange","events","logLevel","explainEvents","passive","shouldForceSelection","hasScrollback","getLinesScrolled","sequence","abs","onWheel","onTouchStart","onTouchMove","refreshRows","linkifyRows","shouldColumnSelect","disp","setSelection","selectionText","selectionStart","selectionEnd","keydown","evaluateKeyboardEvent","macOptionIsMeta","scrollCount","_isThirdLevelShift","domEvent","thirdLevelKey","metaKey","keyCode","wasModifierKeyOnlyEvent","charCode","which","_soundBell","playBellSound","hasValidSize","dimensions","toFixed","cellWidth","cellHeight","force","cancelEvents","stopPropagation","_visualBell","bellStyle","CoreTerminal","_textarea","_isComposing","_isSendingComposition","_compositionPosition","textContent","setTimeout","_finalizeComposition","_handleAnyTextareaChanges","waitForPropagation","_clearTextareaPosition","oldValue","diff","replace","dontRecurse","isCursorInViewport","lineHeight","cursorTop","cursorLeft","compositionViewBounds","_scrollLines","_scrollArea","scrollBarWidth","_currentRowHeight","_lastRecordedBufferLength","_lastRecordedViewportHeight","_lastRecordedBufferHeight","_lastTouchY","_lastScrollTop","_wheelPartialScroll","_refreshAnimationFrame","_ignoreNextScrollEvent","offsetWidth","backgroundColor","_refresh","immediate","offsetHeight","newBufferHeight","newScrollTop","offsetParent","_bubbleScroll","scrollPosFromTop","cancelable","_getPixelsScrolled","_applyScrollModifier","deltaMode","WheelEvent","DOM_DELTA_LINE","DOM_DELTA_PAGE","DOM_DELTA_PIXEL","floor","modifier","fastScrollModifier","fastScrollSensitivity","scrollSensitivity","touches","pageY","prepareTextForTerminal","bracketTextForPaste","coreService","position","selectionService","clipboardData","setData","getData","shouldSelectWord","isClickInSelection","selectWordAtCursor","table","setDefault","next","addMany","codes","TransitionTable","VT500_TRANSITION_TABLE","blueprint","apply","unused","PRINTABLES","EXECUTABLES","states","_transitions","initialState","currentState","_collect","_printHandlerFb","_executeHandlerFb","_csiHandlerFb","_escHandlerFb","_errorHandlerFb","_printHandler","_executeHandlers","_csiHandlers","_escHandlers","_oscParser","_dcsParser","_errorHandler","_identifier","finalRange","intermediate","finalCode","reverse","clearPrintHandler","clearEscHandler","clearExecuteHandler","clearCsiHandler","clearDcsHandler","clearOscHandler","clearErrorHandler","transition","osc","dcs","collect","abort","handlersEsc","jj","nextRendererId","_screenElement","_onRequestRedraw","_characterJoinerRegistry","_renderLayers","TextRenderLayer","SelectionRenderLayer","LinkRenderLayer","CursorRenderLayer","_devicePixelRatio","_updateDimensions","removeTerminalFromCache","onDevicePixelRatioChange","onCharSizeChanged","_runOperation","operation","renderRows","letterSpacing","container","characterJoinerRegistry","bufferService","_characterWidth","_characterFont","_characterOverlapCache","GridCache","terminalFont","_forEachCell","firstRow","lastRow","joinerRegistry","isJoined","lastCharX","_isOverlapping","_drawBackground","startX","startY","prevFillStyle","nextFillStyle","_drawForeground","cache","beginFrame","overlaps","measureText","TRANSPARENT_COLOR","getGlyphCacheKey","glyph","_config","_drawToCacheCount","_glyphsWaitingOnBitmap","_bitmapCommitTimeout","_bitmap","_cacheCanvas","_cacheCtx","tmpCanvas","_tmpCtx","_height","capacity","_cacheMap","LRUMap","prealloc","clearTimeout","_canCache","glyphKey","cacheValue","_drawFromCache","peek","_drawToCache","_toCoordinateX","_toCoordinateY","cacheX","cacheY","drawImage","inBitmap","_getColorFromAnsiIndex","_getBackgroundColor","_getForegroundColor","fontStyle","imageData","offset","clearColor","putImageData","_addGlyphToBitmap","_generateBitmap","glyphsMovingToBitmap","createImageBitmap","then","bitmap","BaseCharAtlas","NoneCharAtlas","_didWarmUp","_doWarmUp","_color","_rgba","setCss","getCss","_map","_head","_tail","_nodePool","_unlinkNode","prev","_appendNode","tail","count","nodePool","peekValue","head","_clearState","_didStateChange","viewportStartRow","viewportEndRow","viewportCappedStartRow","viewportCappedEndRow","startRowEndCol","middleRowsCount","_areCoordinatesEqual","coord1","coord2","_coreBrowserService","_cell","isFocused","_cursorRenderers","_renderBarCursor","_renderBlockCursor","_renderUnderlineCursor","_clearCursor","_cursorBlinkStateManager","pause","resume","CursorBlinkStateManager","_render","restartBlinkAnimation","isPaused","triggeredByAnimationFrame","cursorY","viewportRelativeCursorY","cursorX","_renderBlurCursor","isCursorVisible","cursorWidth","strokeStyle","_restartInterval","_blinkStartTimeout","_blinkInterval","clearInterval","_animationTimeRestarted","Date","now","timeToStart","time","setInterval","onShowLinkUnderline","_onShowLinkUnderline","onHideLinkUnderline","_onHideLinkUnderline","_clearCurrentLink","x1","y1","middleRowCount","y2","x2","is256Color","_linkMatchers","_nextLinkMatcherId","_onLinkTooltip","_rowsToLinkify","mouseZoneManager","_element","_rowsTimeoutId","_linkifyRows","_timeBeforeLatency","absoluteRowIndexStart","absoluteRowIndexEnd","overscanLineLimit","iterator","hasNext","_doLinkifyRow","first","matcher","matchIndex","validationCallback","hoverTooltipCallback","tooltipCallback","hoverLeaveCallback","leaveCallback","willLinkActivate","priority","_addLinkMatcherToList","rowIndex","match","rex","RegExp","source","flags","stringIndex","uri","lastIndex","bufferIndex","stringIndexToBufferIndex","isValid","_addLink","exec","getStringCellWidth","MouseZone","newWindow","opener","location","href","_createLinkHoverEvent","clickCallback","hoverCallback","NON_BREAKING_SPACE_CHAR","ALL_NON_BREAKING_SPACE_REGEX","_dragScrollAmount","_enabled","_mouseDownTimeStamp","_onLinuxMouseSelection","_onRedrawRequest","_onRequestScrollLines","_mouseMoveListener","_onMouseMove","_mouseUpListener","_onMouseUp","onUserInput","_trimListener","onTrim","_onTrim","_onBufferActivate","_model","SelectionModel","_activeSelectionMode","_removeMouseDownListeners","finalSelectionStart","finalSelectionEnd","lineText","translateBufferLineToString","bufferLine","isLinuxMouseSelection","_getMouseBufferCoords","_areCoordsInSelection","_selectWordAt","isSelectAllActive","getCoords","_getMouseEventScrollAmount","terminalHeight","macOptionClickForcesSelection","timeStamp","_onIncrementalClick","detail","_onSingleClick","_onDoubleClick","_onTripleClick","_addMouseDownListeners","_dragScrollIntervalTimer","_dragScroll","selectionStartLength","_selectLineAt","stopImmediatePropagation","previousSelectionEnd","_selectToWordAt","timeElapsed","coordinates","moveToCellSequence","activeBuffer","_convertViewportColToCharacterIndex","charIndex","_getWordAt","allowWhitespaceOnlySelection","followWrappedLinesAbove","followWrappedLinesBelow","charOffset","leftWideCharCount","rightWideCharCount","leftLongCharOffset","rightLongCharOffset","charAt","_isCharWordSeparator","trim","previousBufferLine","previousLineWordPosition","nextBufferLine","nextLineWordPosition","wordPosition","areSelectionValuesReversed","wordSeparator","wrappedRange","getWrappedRangeForLine","last","startPlusLength","moveToRequestedRow","targetY","applicationCursor","wrappedRowsForRow","repeat","wrappedRows","direction","verticalDirection","wrappedRowsCount","currentRow","lineWraps","forward","currentCol","bufferStr","mod","str","rpt","targetX","resetStartingRow","horizontalDirection","moveToRequestedCol","rowDifference","currX","colsFromRowEnd","_audioContext","audioContextCtor","AudioContext","webkitAudioContext","audioContext","bellAudioSource","createBufferSource","decodeAudioData","_base64ToArrayBuffer","_removeMimeType","bellSound","connect","destination","base64","binaryString","atob","bytes","dataURI","_zones","_areZonesActive","_lastHoverCoords","_initialSelectionLength","_onMouseDown","_mouseLeaveListener","_onMouseLeave","_clickListener","_onClick","_deactivate","zone","_activate","_currentZone","pageX","_onHover","_findZoneEventAt","_tooltipTimeout","_onTooltip","linkTooltipHoverDuration","_getSelectionLength","currentSelectionLength","_terminal","_liveRegionLineCount","_charsToConsume","_charsToAnnounce","_accessibilityTreeRoot","_rowContainer","_rowElements","_createAccessibilityTreeNode","_topBoundaryFocusListener","_onBoundaryFocus","_bottomBoundaryFocusListener","_refreshRowsDimensions","_renderRowsDebouncer","_renderRows","_refreshRows","_liveRegion","insertAdjacentElement","_onResize","char","_onChar","spaceCount","_onTab","_clearLiveRegion","_screenDprMonitor","boundaryElement","beforeBoundaryElement","getAttribute","relatedTarget","topBoundaryElement","bottomBoundaryElement","newElement","unshift","children","_refreshRowDimensions","MAX_ROWS_TO_READ","keyChar","setSize","posInSet","innerHTML","_announceCharacters","nextTerminalId","_linkifier","_linkifier2","_terminalClass","_refreshRowElements","_selectionContainer","_injectCss","_rowFactory","DomRendererRowFactory","_onLinkHover","_onLinkLeave","_themeStyleElement","_dimensionsStyleElement","overflow","styles","_terminalSelector","BOLD_CLASS","ITALIC_CLASS","CURSOR_CLASS","CURSOR_STYLE_BLOCK_CLASS","CURSOR_BLINK_CLASS","CURSOR_STYLE_BAR_CLASS","CURSOR_STYLE_UNDERLINE_CLASS","forEach","documentFragment","_createSelectionElement","colStart","colEnd","cursorAbsoluteY","rowElement","createRow","_setCellUnderline","enabled","span","textDecoration","DIM_CLASS","UNDERLINE_CLASS","isCursorRow","lineLength","charElement","_applyMinimumContrast","_addStyle","padStart","padChar","KEYCODE_KEY_MAPPINGS","48","49","50","51","52","53","54","55","56","57","186","187","188","189","190","191","192","219","220","221","222","applicationCursorMode","modifiers","keyMapping","_renderer","charSizeService","_isPaused","_needsFullRefresh","_isNextRenderRedrawOnly","_needsSelectionRefresh","_canvasWidth","_canvasHeight","_selectionState","_onDimensionsChange","_onRefreshRequest","_renderDebouncer","_fullRefresh","onCharSizeChange","IntersectionObserver","_onIntersectionChange","threshold","observe","disconnect","intersectionRatio","isRedrawOnly","_fireOnCanvasResize","changeOptions","_onCharSizeChange","_measureStrategy","DomMeasureStrategy","_parentElement","_result","_measureElement","geometry","_linkProviders","_linkCacheDisposables","_isMouseOut","_activeLine","getDisposeArrayDisposable","providerIndex","mouseService","renderService","_lastMouseEvent","_positionFromMouseEvent","composedPath","_lastBufferCell","_askForLink","_currentLink","_linkAtPosition","link","useLineCache","_activeProviderReplies","linkProvided","_checkLinkProviderResult","provideLinks","links","linksWithState","_removeIntersectingLinks","replies","occupiedCells","Set","providerReply","linkWithState","endX","hasLinkBefore","linkAtPosition","find","_handleNewLink","currentLink","activate","_linkLeave","decorations","underline","pointerCursor","isHovered","_linkHover","defineProperties","toggle","_fireUnderlineEvent","hover","showEvent","scrollOffset","_createLinkUnderlineEvent","leave","sameLine","wrappedFromLeft","wrappedToRight","activeElement","hasFocus","_onBinary","_onData","InstantiationService","OptionsService","BufferService","LogService","CoreService","CoreMouseService","DirtyRowService","UnicodeService","CharsetService","_writeBuffer","WriteBuffer","_windowsMode","writeSync","MINIMUM_COLS","MINIMUM_ROWS","_cachedBlankLine","topRow","bottomRow","willBufferBeTrimmed","isFull","recycle","isUserScrolling","oldYdisp","scrollAmount","windowsMode","_enableWindowsMode","updateWindowsModeWrappedState","_entries","entries","service","instance","ServiceCollection","_services","getService","serviceDependencies","getServiceDependencies","sort","serviceArgs","dependency","firstServiceArgPos","args","LogLevel","optionsKeyToLogLevel","DEBUG","info","INFO","WARN","ERROR","off","OFF","_updateLogLevel","_logLevel","_evalLazyOptionalParams","optionalParams","_log","message","log","BufferSet","Buffer","fillViewportRows","_alt","_activeBuffer","inactiveBuffer","fillAttr","newCols","newRows","MAX_BUFFER_SIZE","_hasScrollback","_nullCell","_whitespaceCell","_cols","_rows","CircularList","_getCorrectBufferLength","getWhitespaceCell","relativeY","correctBufferLength","scrollback","nullCell","newMaxLength","addToY","amountToTrim","_isReflowEnabled","_reflow","_reflowLarger","_reflowSmaller","toRemove","reflowLargerGetLinesToRemove","newLayoutResult","reflowLargerCreateNewLayout","reflowLargerApplyNewLayout","layout","_reflowLargerAdjustViewport","countRemoved","viewportAdjustments","toInsert","countToInsert","wrappedLines","absoluteY","lastLineLength","destLineLengths","reflowSmallerGetNewLineLengths","linesToAdd","trimmedLines","newLines","destLineIndex","srcLineIndex","cellsToCopy","wrappedLinesIndex","getWrappedLineTrimmedLength","insertEvents","originalLines","originalLinesLength","originalLineIndex","nextToInsertIndex","nextToInsert","countInsertedSoFar","nextI","insertCountEmitted","onInsertEmitter","onTrimEmitter","lineIndex","tabStopWidth","marker","Marker","onInsert","onDelete","onDispose","_removeMarker","startOverscan","endOverscan","BufferStringIterator","_trimRight","_startIndex","_endIndex","_startOverscan","_endOverscan","_current","_maxLength","onDeleteEmitter","_array","_length","newArray","_getCyclicIndex","newLength","deleteCount","items","countToTrim","expandListBy","endsInNull","followingLineStartsWithWide","oldCols","bufferAbsoluteY","srcTrimmedTineLength","srcRemainingCells","destRemainingCells","countToRemove","nextToRemoveIndex","nextToRemoveStart","countRemovedSoFar","newLayout","newLayoutLines","newLineLengths","cellsNeeded","reduce","srcLine","cellsAvailable","oldTrimmedLength","endsWithWide","_nextId","isDisposed","_onDispose","DEFAULT_BELL_SOUND","DEFAULT_OPTIONS","disableStdin","CONSTRUCTOR_ONLY_OPTIONS","_onOptionChange","newValue","_sanitizeAndValidateOption","DEFAULT_MODES","DEFAULT_DEC_PRIVATE_MODES","_onUserInput","_scrollToBottom","wasUserInput","triggerBinaryEvent","DEFAULT_PROTOCOLS","NONE","restrict","X10","VT200","DRAG","ANY","eventCode","isSGR","S","DEFAULT_ENCODINGS","DEFAULT","SGR","_protocols","_encodings","_activeProtocol","_activeEncoding","_onProtocolChange","_lastEvent","addProtocol","addEncoding","protocol","encoding","_compareEvents","report","down","up","drag","move","e1","e2","_providers","_onChange","defaultProvider","UnicodeV6","_activeProvider","num","BMP_COMBINING","HIGH_COMBINING","ucs","mid","bisearch","glevel","_charsets","lastChar","_action","_callbacks","_pendingData","_bufferOffset","cb","_innerWrite","startTime","_addons","terminal","loadedAddon","_wrappedAddonDispose"],"mappings":"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","file":"xterm.js","sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse {\n\t\tvar a = factory();\n\t\tfor(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];\n\t}\n})(window, function() {\nreturn "," \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, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\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\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 34);\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IDisposable } from 'common/Types';\n\ninterface IListener<T, U = void> {\n (arg1: T, arg2: U): void;\n}\n\nexport interface IEvent<T, U = void> {\n (listener: (arg1: T, arg2: U) => any): IDisposable;\n}\n\nexport interface IEventEmitter<T, U = void> {\n event: IEvent<T, U>;\n fire(arg1: T, arg2: U): void;\n dispose(): void;\n}\n\nexport class EventEmitter<T, U = void> implements IEventEmitter<T, U> {\n private _listeners: IListener<T, U>[] = [];\n private _event?: IEvent<T, U>;\n private _disposed: boolean = false;\n\n public get event(): IEvent<T, U> {\n if (!this._event) {\n this._event = (listener: (arg1: T, arg2: U) => any) => {\n this._listeners.push(listener);\n const disposable = {\n dispose: () => {\n if (!this._disposed) {\n for (let i = 0; i < this._listeners.length; i++) {\n if (this._listeners[i] === listener) {\n this._listeners.splice(i, 1);\n return;\n }\n }\n }\n }\n };\n return disposable;\n };\n }\n return this._event;\n }\n\n public fire(arg1: T, arg2: U): void {\n const queue: IListener<T, U>[] = [];\n for (let i = 0; i < this._listeners.length; i++) {\n queue.push(this._listeners[i]);\n }\n for (let i = 0; i < queue.length; i++) {\n queue[i].call(undefined, arg1, arg2);\n }\n }\n\n public dispose(): void {\n if (this._listeners) {\n this._listeners.length = 0;\n }\n this._disposed = true;\n }\n}\n\nexport function forwardEvent<T>(from: IEvent<T>, to: IEventEmitter<T>): IDisposable {\n return from(e => to.fire(e));\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IEvent } from 'common/EventEmitter';\nimport { IBuffer, IBufferSet } from 'common/buffer/Types';\nimport { IDecPrivateModes, ICoreMouseEvent, CoreMouseEncoding, ICoreMouseProtocol, CoreMouseEventType, ICharset, IWindowOptions, IModes } from 'common/Types';\nimport { createDecorator } from 'common/services/ServiceRegistry';\n\nexport const IBufferService = createDecorator<IBufferService>('BufferService');\nexport interface IBufferService {\n serviceBrand: undefined;\n\n readonly cols: number;\n readonly rows: number;\n readonly buffer: IBuffer;\n readonly buffers: IBufferSet;\n isUserScrolling: boolean;\n\n onResize: IEvent<{ cols: number, rows: number }>;\n\n resize(cols: number, rows: number): void;\n reset(): void;\n}\n\nexport const ICoreMouseService = createDecorator<ICoreMouseService>('CoreMouseService');\nexport interface ICoreMouseService {\n activeProtocol: string;\n activeEncoding: string;\n areMouseEventsActive: boolean;\n addProtocol(name: string, protocol: ICoreMouseProtocol): void;\n addEncoding(name: string, encoding: CoreMouseEncoding): void;\n reset(): void;\n\n /**\n * Triggers a mouse event to be sent.\n *\n * Returns true if the event passed all protocol restrictions and a report\n * was sent, otherwise false. The return value may be used to decide whether\n * the default event action in the bowser component should be omitted.\n *\n * Note: The method will change values of the given event object\n * to fullfill protocol and encoding restrictions.\n */\n triggerMouseEvent(event: ICoreMouseEvent): boolean;\n\n /**\n * Event to announce changes in mouse tracking.\n */\n onProtocolChange: IEvent<CoreMouseEventType>;\n\n /**\n * Human readable version of mouse events.\n */\n explainEvents(events: CoreMouseEventType): { [event: string]: boolean };\n}\n\nexport const ICoreService = createDecorator<ICoreService>('CoreService');\nexport interface ICoreService {\n serviceBrand: undefined;\n\n /**\n * Initially the cursor will not be visible until the first time the terminal\n * is focused.\n */\n isCursorInitialized: boolean;\n isCursorHidden: boolean;\n\n readonly modes: IModes;\n readonly decPrivateModes: IDecPrivateModes;\n\n readonly onData: IEvent<string>;\n readonly onUserInput: IEvent<void>;\n readonly onBinary: IEvent<string>;\n\n reset(): void;\n\n /**\n * Triggers the onData event in the public API.\n * @param data The data that is being emitted.\n * @param wasFromUser Whether the data originated from the user (as opposed to\n * resulting from parsing incoming data). When true this will also:\n * - Scroll to the bottom of the buffer.s\n * - Fire the `onUserInput` event (so selection can be cleared).\n */\n triggerDataEvent(data: string, wasUserInput?: boolean): void;\n\n /**\n * Triggers the onBinary event in the public API.\n * @param data The data that is being emitted.\n */\n triggerBinaryEvent(data: string): void;\n}\n\nexport const ICharsetService = createDecorator<ICharsetService>('CharsetService');\nexport interface ICharsetService {\n serviceBrand: undefined;\n\n charset: ICharset | undefined;\n readonly glevel: number;\n\n reset(): void;\n\n /**\n * Set the G level of the terminal.\n * @param g\n */\n setgLevel(g: number): void;\n\n /**\n * Set the charset for the given G level of the terminal.\n * @param g\n * @param charset\n */\n setgCharset(g: number, charset: ICharset | undefined): void;\n}\n\nexport const IDirtyRowService = createDecorator<IDirtyRowService>('DirtyRowService');\nexport interface IDirtyRowService {\n serviceBrand: undefined;\n\n readonly start: number;\n readonly end: number;\n\n clearRange(): void;\n markDirty(y: number): void;\n markRangeDirty(y1: number, y2: number): void;\n markAllDirty(): void;\n}\n\nexport interface IServiceIdentifier<T> {\n (...args: any[]): void;\n type: T;\n}\n\nexport interface IBrandedService {\n serviceBrand: undefined;\n}\n\ntype GetLeadingNonServiceArgs<Args> =\n Args extends [...IBrandedService[]] ? []\n : Args extends [infer A1, ...IBrandedService[]] ? [A1]\n : Args extends [infer A1, infer A2, ...IBrandedService[]] ? [A1, A2]\n : Args extends [infer A1, infer A2, infer A3, ...IBrandedService[]] ? [A1, A2, A3]\n : Args extends [infer A1, infer A2, infer A3, infer A4, ...IBrandedService[]] ? [A1, A2, A3, A4]\n : Args extends [infer A1, infer A2, infer A3, infer A4, infer A5, ...IBrandedService[]] ? [A1, A2, A3, A4, A5]\n : Args extends [infer A1, infer A2, infer A3, infer A4, infer A5, infer A6, ...IBrandedService[]] ? [A1, A2, A3, A4, A5, A6]\n : Args extends [infer A1, infer A2, infer A3, infer A4, infer A5, infer A6, infer A7, ...IBrandedService[]] ? [A1, A2, A3, A4, A5, A6, A7]\n : Args extends [infer A1, infer A2, infer A3, infer A4, infer A5, infer A6, infer A7, infer A8, ...IBrandedService[]] ? [A1, A2, A3, A4, A5, A6, A7, A8]\n : never;\n\nexport const IInstantiationService = createDecorator<IInstantiationService>('InstantiationService');\nexport interface IInstantiationService {\n setService<T>(id: IServiceIdentifier<T>, instance: T): void;\n getService<T>(id: IServiceIdentifier<T>): T | undefined;\n createInstance<Ctor extends new (...args: any[]) => any, R extends InstanceType<Ctor>>(t: Ctor, ...args: GetLeadingNonServiceArgs<ConstructorParameters<Ctor>>): R;\n}\n\nexport const ILogService = createDecorator<ILogService>('LogService');\nexport interface ILogService {\n serviceBrand: undefined;\n\n debug(message: any, ...optionalParams: any[]): void;\n info(message: any, ...optionalParams: any[]): void;\n warn(message: any, ...optionalParams: any[]): void;\n error(message: any, ...optionalParams: any[]): void;\n}\n\nexport const IOptionsService = createDecorator<IOptionsService>('OptionsService');\nexport interface IOptionsService {\n serviceBrand: undefined;\n\n readonly options: ITerminalOptions;\n\n readonly onOptionChange: IEvent<string>;\n\n setOption<T>(key: string, value: T): void;\n getOption<T>(key: string): T | undefined;\n}\n\nexport type FontWeight = 'normal' | 'bold' | '100' | '200' | '300' | '400' | '500' | '600' | '700' | '800' | '900';\nexport type LogLevel = 'debug' | 'info' | 'warn' | 'error' | 'off';\nexport type RendererType = 'dom' | 'canvas';\n\nexport interface IPartialTerminalOptions {\n allowTransparency?: boolean;\n bellSound?: string;\n bellStyle?: 'none' | 'sound' /* | 'visual' | 'both' */;\n cols?: number;\n cursorBlink?: boolean;\n cursorStyle?: 'block' | 'underline' | 'bar';\n cursorWidth?: number;\n disableStdin?: boolean;\n drawBoldTextInBrightColors?: boolean;\n fastScrollModifier?: 'alt' | 'ctrl' | 'shift';\n fastScrollSensitivity?: number;\n fontSize?: number;\n fontFamily?: string;\n fontWeight?: FontWeight;\n fontWeightBold?: FontWeight;\n letterSpacing?: number;\n lineHeight?: number;\n logLevel?: LogLevel;\n macOptionIsMeta?: boolean;\n macOptionClickForcesSelection?: boolean;\n rendererType?: RendererType;\n rightClickSelectsWord?: boolean;\n rows?: number;\n screenReaderMode?: boolean;\n scrollback?: number;\n scrollSensitivity?: number;\n tabStopWidth?: number;\n theme?: ITheme;\n windowsMode?: boolean;\n wordSeparator?: string;\n windowOptions?: IWindowOptions;\n}\n\nexport interface ITerminalOptions {\n allowProposedApi: boolean;\n allowTransparency: boolean;\n bellSound: string;\n bellStyle: 'none' | 'sound' /* | 'visual' | 'both' */;\n cols: number;\n cursorBlink: boolean;\n cursorStyle: 'block' | 'underline' | 'bar';\n cursorWidth: number;\n disableStdin: boolean;\n drawBoldTextInBrightColors: boolean;\n fastScrollModifier: 'alt' | 'ctrl' | 'shift' | undefined;\n fastScrollSensitivity: number;\n fontSize: number;\n fontFamily: string;\n fontWeight: FontWeight;\n fontWeightBold: FontWeight;\n letterSpacing: number;\n lineHeight: number;\n linkTooltipHoverDuration: number;\n logLevel: LogLevel;\n macOptionIsMeta: boolean;\n macOptionClickForcesSelection: boolean;\n minimumContrastRatio: number;\n rendererType: RendererType;\n rightClickSelectsWord: boolean;\n rows: number;\n screenReaderMode: boolean;\n scrollback: number;\n scrollSensitivity: number;\n tabStopWidth: number;\n theme: ITheme;\n windowsMode: boolean;\n windowOptions: IWindowOptions;\n wordSeparator: string;\n\n [key: string]: any;\n cancelEvents: boolean;\n convertEol: boolean;\n termName: string;\n}\n\nexport interface ITheme {\n foreground?: string;\n background?: string;\n cursor?: string;\n cursorAccent?: string;\n selection?: string;\n black?: string;\n red?: string;\n green?: string;\n yellow?: string;\n blue?: string;\n magenta?: string;\n cyan?: string;\n white?: string;\n brightBlack?: string;\n brightRed?: string;\n brightGreen?: string;\n brightYellow?: string;\n brightBlue?: string;\n brightMagenta?: string;\n brightCyan?: string;\n brightWhite?: string;\n}\n\nexport const IUnicodeService = createDecorator<IUnicodeService>('UnicodeService');\nexport interface IUnicodeService {\n serviceBrand: undefined;\n /** Register an Unicode version provider. */\n register(provider: IUnicodeVersionProvider): void;\n /** Registered Unicode versions. */\n readonly versions: string[];\n /** Currently active version. */\n activeVersion: string;\n /** Event triggered, when activate version changed. */\n readonly onChange: IEvent<string>;\n\n /**\n * Unicode version dependent\n */\n wcwidth(codepoint: number): number;\n getStringCellWidth(s: string): number;\n}\n\nexport interface IUnicodeVersionProvider {\n readonly version: string;\n wcwidth(ucs: number): 0 | 1 | 2;\n}\n","/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IDisposable } from 'common/Types';\n\n/**\n * A base class that can be extended to provide convenience methods for managing the lifecycle of an\n * object and its components.\n */\nexport abstract class Disposable implements IDisposable {\n protected _disposables: IDisposable[] = [];\n protected _isDisposed: boolean = false;\n\n constructor() {\n }\n\n /**\n * Disposes the object, triggering the `dispose` method on all registered IDisposables.\n */\n public dispose(): void {\n this._isDisposed = true;\n for (const d of this._disposables) {\n d.dispose();\n }\n this._disposables.length = 0;\n }\n\n /**\n * Registers a disposable object.\n * @param d The disposable to register.\n * @returns The disposable.\n */\n public register<T extends IDisposable>(d: T): T {\n this._disposables.push(d);\n return d;\n }\n\n /**\n * Unregisters a disposable object if it has been registered, if not do\n * nothing.\n * @param d The disposable to unregister.\n */\n public unregister<T extends IDisposable>(d: T): void {\n const index = this._disposables.indexOf(d);\n if (index !== -1) {\n this._disposables.splice(index, 1);\n }\n }\n}\n\n/**\n * Dispose of all disposables in an array and set its length to 0.\n */\nexport function disposeArray(disposables: IDisposable[]): void {\n for (const d of disposables) {\n d.dispose();\n }\n disposables.length = 0;\n}\n\n/**\n * Creates a disposable that will dispose of an array of disposables when disposed.\n */\nexport function getDisposeArrayDisposable(array: IDisposable[]): IDisposable {\n return { dispose: () => disposeArray(array) };\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nexport const DEFAULT_COLOR = 256;\nexport const DEFAULT_ATTR = (0 << 18) | (DEFAULT_COLOR << 9) | (256 << 0);\n\nexport const CHAR_DATA_ATTR_INDEX = 0;\nexport const CHAR_DATA_CHAR_INDEX = 1;\nexport const CHAR_DATA_WIDTH_INDEX = 2;\nexport const CHAR_DATA_CODE_INDEX = 3;\n\n/**\n * Null cell - a real empty cell (containing nothing).\n * Note that code should always be 0 for a null cell as\n * several test condition of the buffer line rely on this.\n */\nexport const NULL_CELL_CHAR = '';\nexport const NULL_CELL_WIDTH = 1;\nexport const NULL_CELL_CODE = 0;\n\n/**\n * Whitespace cell.\n * This is meant as a replacement for empty cells when needed\n * during rendering lines to preserve correct aligment.\n */\nexport const WHITESPACE_CELL_CHAR = ' ';\nexport const WHITESPACE_CELL_WIDTH = 1;\nexport const WHITESPACE_CELL_CODE = 32;\n\n/**\n * Bitmasks for accessing data in `content`.\n */\nexport const enum Content {\n /**\n * bit 1..21 codepoint, max allowed in UTF32 is 0x10FFFF (21 bits taken)\n * read: `codepoint = content & Content.codepointMask;`\n * write: `content |= codepoint & Content.codepointMask;`\n * shortcut if precondition `codepoint <= 0x10FFFF` is met:\n * `content |= codepoint;`\n */\n CODEPOINT_MASK = 0x1FFFFF,\n\n /**\n * bit 22 flag indication whether a cell contains combined content\n * read: `isCombined = content & Content.isCombined;`\n * set: `content |= Content.isCombined;`\n * clear: `content &= ~Content.isCombined;`\n */\n IS_COMBINED_MASK = 0x200000, // 1 << 21\n\n /**\n * bit 1..22 mask to check whether a cell contains any string data\n * we need to check for codepoint and isCombined bits to see\n * whether a cell contains anything\n * read: `isEmpty = !(content & Content.hasContent)`\n */\n HAS_CONTENT_MASK = 0x3FFFFF,\n\n /**\n * bit 23..24 wcwidth value of cell, takes 2 bits (ranges from 0..2)\n * read: `width = (content & Content.widthMask) >> Content.widthShift;`\n * `hasWidth = content & Content.widthMask;`\n * as long as wcwidth is highest value in `content`:\n * `width = content >> Content.widthShift;`\n * write: `content |= (width << Content.widthShift) & Content.widthMask;`\n * shortcut if precondition `0 <= width <= 3` is met:\n * `content |= width << Content.widthShift;`\n */\n WIDTH_MASK = 0xC00000, // 3 << 22\n WIDTH_SHIFT = 22\n}\n\nexport const enum Attributes {\n /**\n * bit 1..8 blue in RGB, color in P256 and P16\n */\n BLUE_MASK = 0xFF,\n BLUE_SHIFT = 0,\n PCOLOR_MASK = 0xFF,\n PCOLOR_SHIFT = 0,\n\n /**\n * bit 9..16 green in RGB\n */\n GREEN_MASK = 0xFF00,\n GREEN_SHIFT = 8,\n\n /**\n * bit 17..24 red in RGB\n */\n RED_MASK = 0xFF0000,\n RED_SHIFT = 16,\n\n /**\n * bit 25..26 color mode: DEFAULT (0) | P16 (1) | P256 (2) | RGB (3)\n */\n CM_MASK = 0x3000000,\n CM_DEFAULT = 0,\n CM_P16 = 0x1000000,\n CM_P256 = 0x2000000,\n CM_RGB = 0x3000000,\n\n /**\n * bit 1..24 RGB room\n */\n RGB_MASK = 0xFFFFFF\n}\n\nexport const enum FgFlags {\n /**\n * bit 27..31 (32th bit unused)\n */\n INVERSE = 0x4000000,\n BOLD = 0x8000000,\n UNDERLINE = 0x10000000,\n BLINK = 0x20000000,\n INVISIBLE = 0x40000000\n}\n\nexport const enum BgFlags {\n /**\n * bit 27..32 (upper 3 unused)\n */\n ITALIC = 0x4000000,\n DIM = 0x8000000,\n HAS_EXTENDED = 0x10000000\n}\n\nexport const enum UnderlineStyle {\n NONE = 0,\n SINGLE = 1,\n DOUBLE = 2,\n CURLY = 3,\n DOTTED = 4,\n DASHED = 5\n}\n","/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { CharData, ICellData, IExtendedAttrs } from 'common/Types';\nimport { stringFromCodePoint } from 'common/input/TextDecoder';\nimport { CHAR_DATA_CHAR_INDEX, CHAR_DATA_WIDTH_INDEX, CHAR_DATA_ATTR_INDEX, Content } from 'common/buffer/Constants';\nimport { AttributeData, ExtendedAttrs } from 'common/buffer/AttributeData';\n\n/**\n * CellData - represents a single Cell in the terminal buffer.\n */\nexport class CellData extends AttributeData implements ICellData {\n /** Helper to create CellData from CharData. */\n public static fromCharData(value: CharData): CellData {\n const obj = new CellData();\n obj.setFromCharData(value);\n return obj;\n }\n /** Primitives from terminal buffer. */\n public content = 0;\n public fg = 0;\n public bg = 0;\n public extended: IExtendedAttrs = new ExtendedAttrs();\n public combinedData = '';\n /** Whether cell contains a combined string. */\n public isCombined(): number {\n return this.content & Content.IS_COMBINED_MASK;\n }\n /** Width of the cell. */\n public getWidth(): number {\n return this.content >> Content.WIDTH_SHIFT;\n }\n /** JS string of the content. */\n public getChars(): string {\n if (this.content & Content.IS_COMBINED_MASK) {\n return this.combinedData;\n }\n if (this.content & Content.CODEPOINT_MASK) {\n return stringFromCodePoint(this.content & Content.CODEPOINT_MASK);\n }\n return '';\n }\n /**\n * Codepoint of cell\n * Note this returns the UTF32 codepoint of single chars,\n * if content is a combined string it returns the codepoint\n * of the last char in string to be in line with code in CharData.\n * */\n public getCode(): number {\n return (this.isCombined())\n ? this.combinedData.charCodeAt(this.combinedData.length - 1)\n : this.content & Content.CODEPOINT_MASK;\n }\n /** Set data from CharData */\n public setFromCharData(value: CharData): void {\n this.fg = value[CHAR_DATA_ATTR_INDEX];\n this.bg = 0;\n let combined = false;\n // surrogates and combined strings need special treatment\n if (value[CHAR_DATA_CHAR_INDEX].length > 2) {\n combined = true;\n }\n else if (value[CHAR_DATA_CHAR_INDEX].length === 2) {\n const code = value[CHAR_DATA_CHAR_INDEX].charCodeAt(0);\n // if the 2-char string is a surrogate create single codepoint\n // everything else is combined\n if (0xD800 <= code && code <= 0xDBFF) {\n const second = value[CHAR_DATA_CHAR_INDEX].charCodeAt(1);\n if (0xDC00 <= second && second <= 0xDFFF) {\n this.content = ((code - 0xD800) * 0x400 + second - 0xDC00 + 0x10000) | (value[CHAR_DATA_WIDTH_INDEX] << Content.WIDTH_SHIFT);\n }\n else {\n combined = true;\n }\n }\n else {\n combined = true;\n }\n }\n else {\n this.content = value[CHAR_DATA_CHAR_INDEX].charCodeAt(0) | (value[CHAR_DATA_WIDTH_INDEX] << Content.WIDTH_SHIFT);\n }\n if (combined) {\n this.combinedData = value[CHAR_DATA_CHAR_INDEX];\n this.content = Content.IS_COMBINED_MASK | (value[CHAR_DATA_WIDTH_INDEX] << Content.WIDTH_SHIFT);\n }\n }\n /** Get data as CharData. */\n public getAsCharData(): CharData {\n return [this.fg, this.getChars(), this.getWidth(), this.getCode()];\n }\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IEvent } from 'common/EventEmitter';\nimport { IRenderDimensions, IRenderer, CharacterJoinerHandler } from 'browser/renderer/Types';\nimport { IColorSet } from 'browser/Types';\nimport { ISelectionRedrawRequestEvent as ISelectionRequestRedrawEvent, ISelectionRequestScrollLinesEvent } from 'browser/selection/Types';\nimport { createDecorator } from 'common/services/ServiceRegistry';\nimport { IDisposable } from 'common/Types';\n\nexport const ICharSizeService = createDecorator<ICharSizeService>('CharSizeService');\nexport interface ICharSizeService {\n serviceBrand: undefined;\n\n readonly width: number;\n readonly height: number;\n readonly hasValidSize: boolean;\n\n readonly onCharSizeChange: IEvent<void>;\n\n measure(): void;\n}\n\nexport const ICoreBrowserService = createDecorator<ICoreBrowserService>('CoreBrowserService');\nexport interface ICoreBrowserService {\n serviceBrand: undefined;\n\n readonly isFocused: boolean;\n}\n\nexport const IMouseService = createDecorator<IMouseService>('MouseService');\nexport interface IMouseService {\n serviceBrand: undefined;\n\n getCoords(event: {clientX: number, clientY: number}, element: HTMLElement, colCount: number, rowCount: number, isSelection?: boolean): [number, number] | undefined;\n getRawByteCoords(event: MouseEvent, element: HTMLElement, colCount: number, rowCount: number): { x: number, y: number } | undefined;\n}\n\nexport const IRenderService = createDecorator<IRenderService>('RenderService');\nexport interface IRenderService extends IDisposable {\n serviceBrand: undefined;\n\n onDimensionsChange: IEvent<IRenderDimensions>;\n /**\n * Fires when buffer changes are rendered. This does not fire when only cursor\n * or selections are rendered.\n */\n onRenderedBufferChange: IEvent<{ start: number, end: number }>;\n onRefreshRequest: IEvent<{ start: number, end: number }>;\n\n dimensions: IRenderDimensions;\n\n refreshRows(start: number, end: number): void;\n resize(cols: number, rows: number): void;\n changeOptions(): void;\n setRenderer(renderer: IRenderer): void;\n setColors(colors: IColorSet): void;\n onDevicePixelRatioChange(): void;\n onResize(cols: number, rows: number): void;\n // TODO: Is this useful when we have onResize?\n onCharSizeChanged(): void;\n onBlur(): void;\n onFocus(): void;\n onSelectionChanged(start: [number, number] | undefined, end: [number, number] | undefined, columnSelectMode: boolean): void;\n onCursorMove(): void;\n clear(): void;\n registerCharacterJoiner(handler: CharacterJoinerHandler): number;\n deregisterCharacterJoiner(joinerId: number): boolean;\n}\n\nexport const ISelectionService = createDecorator<ISelectionService>('SelectionService');\nexport interface ISelectionService {\n serviceBrand: undefined;\n\n readonly selectionText: string;\n readonly hasSelection: boolean;\n readonly selectionStart: [number, number] | undefined;\n readonly selectionEnd: [number, number] | undefined;\n\n readonly onLinuxMouseSelection: IEvent<string>;\n readonly onRequestRedraw: IEvent<ISelectionRequestRedrawEvent>;\n readonly onRequestScrollLines: IEvent<ISelectionRequestScrollLinesEvent>;\n readonly onSelectionChange: IEvent<void>;\n\n disable(): void;\n enable(): void;\n reset(): void;\n setSelection(row: number, col: number, length: number): void;\n selectAll(): void;\n selectLines(start: number, end: number): void;\n clearSelection(): void;\n isClickInSelection(event: MouseEvent): boolean;\n selectWordAtCursor(event: MouseEvent): void;\n shouldColumnSelect(event: KeyboardEvent | MouseEvent): boolean;\n shouldForceSelection(event: MouseEvent): boolean;\n refresh(isLinuxMouseSelection?: boolean): void;\n onMouseDown(event: MouseEvent): void;\n}\n\nexport const ISoundService = createDecorator<ISoundService>('SoundService');\nexport interface ISoundService {\n serviceBrand: undefined;\n\n playBellSound(): void;\n}\n","/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IAttributeData, IColorRGB, IExtendedAttrs } from 'common/Types';\nimport { Attributes, FgFlags, BgFlags, UnderlineStyle } from 'common/buffer/Constants';\n\nexport class AttributeData implements IAttributeData {\n public static toColorRGB(value: number): IColorRGB {\n return [\n value >>> Attributes.RED_SHIFT & 255,\n value >>> Attributes.GREEN_SHIFT & 255,\n value & 255\n ];\n }\n\n public static fromColorRGB(value: IColorRGB): number {\n return (value[0] & 255) << Attributes.RED_SHIFT | (value[1] & 255) << Attributes.GREEN_SHIFT | value[2] & 255;\n }\n\n public clone(): IAttributeData {\n const newObj = new AttributeData();\n newObj.fg = this.fg;\n newObj.bg = this.bg;\n newObj.extended = this.extended.clone();\n return newObj;\n }\n\n // data\n public fg = 0;\n public bg = 0;\n public extended = new ExtendedAttrs();\n\n // flags\n public isInverse(): number { return this.fg & FgFlags.INVERSE; }\n public isBold(): number { return this.fg & FgFlags.BOLD; }\n public isUnderline(): number { return this.fg & FgFlags.UNDERLINE; }\n public isBlink(): number { return this.fg & FgFlags.BLINK; }\n public isInvisible(): number { return this.fg & FgFlags.INVISIBLE; }\n public isItalic(): number { return this.bg & BgFlags.ITALIC; }\n public isDim(): number { return this.bg & BgFlags.DIM; }\n\n // color modes\n public getFgColorMode(): number { return this.fg & Attributes.CM_MASK; }\n public getBgColorMode(): number { return this.bg & Attributes.CM_MASK; }\n public isFgRGB(): boolean { return (this.fg & Attributes.CM_MASK) === Attributes.CM_RGB; }\n public isBgRGB(): boolean { return (this.bg & Attributes.CM_MASK) === Attributes.CM_RGB; }\n public isFgPalette(): boolean { return (this.fg & Attributes.CM_MASK) === Attributes.CM_P16 || (this.fg & Attributes.CM_MASK) === Attributes.CM_P256; }\n public isBgPalette(): boolean { return (this.bg & Attributes.CM_MASK) === Attributes.CM_P16 || (this.bg & Attributes.CM_MASK) === Attributes.CM_P256; }\n public isFgDefault(): boolean { return (this.fg & Attributes.CM_MASK) === 0; }\n public isBgDefault(): boolean { return (this.bg & Attributes.CM_MASK) === 0; }\n public isAttributeDefault(): boolean { return this.fg === 0 && this.bg === 0; }\n\n // colors\n public getFgColor(): number {\n switch (this.fg & Attributes.CM_MASK) {\n case Attributes.CM_P16:\n case Attributes.CM_P256: return this.fg & Attributes.PCOLOR_MASK;\n case Attributes.CM_RGB: return this.fg & Attributes.RGB_MASK;\n default: return -1; // CM_DEFAULT defaults to -1\n }\n }\n public getBgColor(): number {\n switch (this.bg & Attributes.CM_MASK) {\n case Attributes.CM_P16:\n case Attributes.CM_P256: return this.bg & Attributes.PCOLOR_MASK;\n case Attributes.CM_RGB: return this.bg & Attributes.RGB_MASK;\n default: return -1; // CM_DEFAULT defaults to -1\n }\n }\n\n // extended attrs\n public hasExtendedAttrs(): number {\n return this.bg & BgFlags.HAS_EXTENDED;\n }\n public updateExtended(): void {\n if (this.extended.isEmpty()) {\n this.bg &= ~BgFlags.HAS_EXTENDED;\n } else {\n this.bg |= BgFlags.HAS_EXTENDED;\n }\n }\n public getUnderlineColor(): number {\n if ((this.bg & BgFlags.HAS_EXTENDED) && ~this.extended.underlineColor) {\n switch (this.extended.underlineColor & Attributes.CM_MASK) {\n case Attributes.CM_P16:\n case Attributes.CM_P256: return this.extended.underlineColor & Attributes.PCOLOR_MASK;\n case Attributes.CM_RGB: return this.extended.underlineColor & Attributes.RGB_MASK;\n default: return this.getFgColor();\n }\n }\n return this.getFgColor();\n }\n public getUnderlineColorMode(): number {\n return (this.bg & BgFlags.HAS_EXTENDED) && ~this.extended.underlineColor\n ? this.extended.underlineColor & Attributes.CM_MASK\n : this.getFgColorMode();\n }\n public isUnderlineColorRGB(): boolean {\n return (this.bg & BgFlags.HAS_EXTENDED) && ~this.extended.underlineColor\n ? (this.extended.underlineColor & Attributes.CM_MASK) === Attributes.CM_RGB\n : this.isFgRGB();\n }\n public isUnderlineColorPalette(): boolean {\n return (this.bg & BgFlags.HAS_EXTENDED) && ~this.extended.underlineColor\n ? (this.extended.underlineColor & Attributes.CM_MASK) === Attributes.CM_P16\n || (this.extended.underlineColor & Attributes.CM_MASK) === Attributes.CM_P256\n : this.isFgPalette();\n }\n public isUnderlineColorDefault(): boolean {\n return (this.bg & BgFlags.HAS_EXTENDED) && ~this.extended.underlineColor\n ? (this.extended.underlineColor & Attributes.CM_MASK) === 0\n : this.isFgDefault();\n }\n public getUnderlineStyle(): UnderlineStyle {\n return this.fg & FgFlags.UNDERLINE\n ? (this.bg & BgFlags.HAS_EXTENDED ? this.extended.underlineStyle : UnderlineStyle.SINGLE)\n : UnderlineStyle.NONE;\n }\n}\n\n\n/**\n * Extended attributes for a cell.\n * Holds information about different underline styles and color.\n */\nexport class ExtendedAttrs implements IExtendedAttrs {\n constructor(\n // underline style, NONE is empty\n public underlineStyle: UnderlineStyle = UnderlineStyle.NONE,\n // underline color, -1 is empty (same as FG)\n public underlineColor: number = -1\n ) {}\n\n public clone(): IExtendedAttrs {\n return new ExtendedAttrs(this.underlineStyle, this.underlineColor);\n }\n\n /**\n * Convenient method to indicate whether the object holds no additional information,\n * that needs to be persistant in the buffer.\n */\n public isEmpty(): boolean {\n return this.underlineStyle === UnderlineStyle.NONE;\n }\n}\n","/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IDisposable } from 'common/Types';\n\n/**\n * Adds a disposable listener to a node in the DOM, returning the disposable.\n * @param type The event type.\n * @param handler The handler for the listener.\n */\nexport function addDisposableDomListener(\n node: Element | Window | Document,\n type: string,\n handler: (e: any) => void,\n options?: boolean | AddEventListenerOptions\n): IDisposable {\n node.addEventListener(type, handler, options);\n let disposed = false;\n return {\n dispose: () => {\n if (disposed) {\n return;\n }\n disposed = true;\n node.removeEventListener(type, handler, options);\n }\n };\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\n/**\n * Polyfill - Convert UTF32 codepoint into JS string.\n * Note: The built-in String.fromCodePoint happens to be much slower\n * due to additional sanity checks. We can avoid them since\n * we always operate on legal UTF32 (granted by the input decoders)\n * and use this faster version instead.\n */\nexport function stringFromCodePoint(codePoint: number): string {\n if (codePoint > 0xFFFF) {\n codePoint -= 0x10000;\n return String.fromCharCode((codePoint >> 10) + 0xD800) + String.fromCharCode((codePoint % 0x400) + 0xDC00);\n }\n return String.fromCharCode(codePoint);\n}\n\n/**\n * Convert UTF32 char codes into JS string.\n * Basically the same as `stringFromCodePoint` but for multiple codepoints\n * in a loop (which is a lot faster).\n */\nexport function utf32ToString(data: Uint32Array, start: number = 0, end: number = data.length): string {\n let result = '';\n for (let i = start; i < end; ++i) {\n let codepoint = data[i];\n if (codepoint > 0xFFFF) {\n // JS strings are encoded as UTF16, thus a non BMP codepoint gets converted into a surrogate pair\n // conversion rules:\n // - subtract 0x10000 from code point, leaving a 20 bit number\n // - add high 10 bits to 0xD800 --> first surrogate\n // - add low 10 bits to 0xDC00 --> second surrogate\n codepoint -= 0x10000;\n result += String.fromCharCode((codepoint >> 10) + 0xD800) + String.fromCharCode((codepoint % 0x400) + 0xDC00);\n } else {\n result += String.fromCharCode(codepoint);\n }\n }\n return result;\n}\n\n/**\n * StringToUtf32 - decodes UTF16 sequences into UTF32 codepoints.\n * To keep the decoder in line with JS strings it handles single surrogates as UCS2.\n */\nexport class StringToUtf32 {\n private _interim: number = 0;\n\n /**\n * Clears interim and resets decoder to clean state.\n */\n public clear(): void {\n this._interim = 0;\n }\n\n /**\n * Decode JS string to UTF32 codepoints.\n * The methods assumes stream input and will store partly transmitted\n * surrogate pairs and decode them with the next data chunk.\n * Note: The method does no bound checks for target, therefore make sure\n * the provided input data does not exceed the size of `target`.\n * Returns the number of written codepoints in `target`.\n */\n public decode(input: string, target: Uint32Array): number {\n const length = input.length;\n\n if (!length) {\n return 0;\n }\n\n let size = 0;\n let startPos = 0;\n\n // handle leftover surrogate high\n if (this._interim) {\n const second = input.charCodeAt(startPos++);\n if (0xDC00 <= second && second <= 0xDFFF) {\n target[size++] = (this._interim - 0xD800) * 0x400 + second - 0xDC00 + 0x10000;\n } else {\n // illegal codepoint (USC2 handling)\n target[size++] = this._interim;\n target[size++] = second;\n }\n this._interim = 0;\n }\n\n for (let i = startPos; i < length; ++i) {\n const code = input.charCodeAt(i);\n // surrogate pair first\n if (0xD800 <= code && code <= 0xDBFF) {\n if (++i >= length) {\n this._interim = code;\n return size;\n }\n const second = input.charCodeAt(i);\n if (0xDC00 <= second && second <= 0xDFFF) {\n target[size++] = (code - 0xD800) * 0x400 + second - 0xDC00 + 0x10000;\n } else {\n // illegal codepoint (USC2 handling)\n target[size++] = code;\n target[size++] = second;\n }\n continue;\n }\n target[size++] = code;\n }\n return size;\n }\n}\n\n/**\n * Utf8Decoder - decodes UTF8 byte sequences into UTF32 codepoints.\n */\nexport class Utf8ToUtf32 {\n public interim: Uint8Array = new Uint8Array(3);\n\n /**\n * Clears interim bytes and resets decoder to clean state.\n */\n public clear(): void {\n this.interim.fill(0);\n }\n\n /**\n * Decodes UTF8 byte sequences in `input` to UTF32 codepoints in `target`.\n * The methods assumes stream input and will store partly transmitted bytes\n * and decode them with the next data chunk.\n * Note: The method does no bound checks for target, therefore make sure\n * the provided data chunk does not exceed the size of `target`.\n * Returns the number of written codepoints in `target`.\n */\n public decode(input: Uint8Array, target: Uint32Array): number {\n const length = input.length;\n\n if (!length) {\n return 0;\n }\n\n let size = 0;\n let byte1: number;\n let byte2: number;\n let byte3: number;\n let byte4: number;\n let codepoint = 0;\n let startPos = 0;\n\n // handle leftover bytes\n if (this.interim[0]) {\n let discardInterim = false;\n let cp = this.interim[0];\n cp &= ((((cp & 0xE0) === 0xC0)) ? 0x1F : (((cp & 0xF0) === 0xE0)) ? 0x0F : 0x07);\n let pos = 0;\n let tmp: number;\n while ((tmp = this.interim[++pos] & 0x3F) && pos < 4) {\n cp <<= 6;\n cp |= tmp;\n }\n // missing bytes - read ahead from input\n const type = (((this.interim[0] & 0xE0) === 0xC0)) ? 2 : (((this.interim[0] & 0xF0) === 0xE0)) ? 3 : 4;\n const missing = type - pos;\n while (startPos < missing) {\n if (startPos >= length) {\n return 0;\n }\n tmp = input[startPos++];\n if ((tmp & 0xC0) !== 0x80) {\n // wrong continuation, discard interim bytes completely\n startPos--;\n discardInterim = true;\n break;\n } else {\n // need to save so we can continue short inputs in next call\n this.interim[pos++] = tmp;\n cp <<= 6;\n cp |= tmp & 0x3F;\n }\n }\n if (!discardInterim) {\n // final test is type dependent\n if (type === 2) {\n if (cp < 0x80) {\n // wrong starter byte\n startPos--;\n } else {\n target[size++] = cp;\n }\n } else if (type === 3) {\n if (cp < 0x0800 || (cp >= 0xD800 && cp <= 0xDFFF)) {\n // illegal codepoint\n } else {\n target[size++] = cp;\n }\n } else {\n if (cp < 0x010000 || cp > 0x10FFFF) {\n // illegal codepoint\n } else {\n target[size++] = cp;\n }\n }\n }\n this.interim.fill(0);\n }\n\n // loop through input\n const fourStop = length - 4;\n let i = startPos;\n while (i < length) {\n /**\n * ASCII shortcut with loop unrolled to 4 consecutive ASCII chars.\n * This is a compromise between speed gain for ASCII\n * and penalty for non ASCII:\n * For best ASCII performance the char should be stored directly into target,\n * but even a single attempt to write to target and compare afterwards\n * penalizes non ASCII really bad (-50%), thus we load the char into byteX first,\n * which reduces ASCII performance by ~15%.\n * This trial for ASCII reduces non ASCII performance by ~10% which seems acceptible\n * compared to the gains.\n * Note that this optimization only takes place for 4 consecutive ASCII chars,\n * for any shorter it bails out. Worst case - all 4 bytes being read but\n * thrown away due to the last being a non ASCII char (-10% performance).\n */\n while (i < fourStop\n && !((byte1 = input[i]) & 0x80)\n && !((byte2 = input[i + 1]) & 0x80)\n && !((byte3 = input[i + 2]) & 0x80)\n && !((byte4 = input[i + 3]) & 0x80))\n {\n target[size++] = byte1;\n target[size++] = byte2;\n target[size++] = byte3;\n target[size++] = byte4;\n i += 4;\n }\n\n // reread byte1\n byte1 = input[i++];\n\n // 1 byte\n if (byte1 < 0x80) {\n target[size++] = byte1;\n\n // 2 bytes\n } else if ((byte1 & 0xE0) === 0xC0) {\n if (i >= length) {\n this.interim[0] = byte1;\n return size;\n }\n byte2 = input[i++];\n if ((byte2 & 0xC0) !== 0x80) {\n // wrong continuation\n i--;\n continue;\n }\n codepoint = (byte1 & 0x1F) << 6 | (byte2 & 0x3F);\n if (codepoint < 0x80) {\n // wrong starter byte\n i--;\n continue;\n }\n target[size++] = codepoint;\n\n // 3 bytes\n } else if ((byte1 & 0xF0) === 0xE0) {\n if (i >= length) {\n this.interim[0] = byte1;\n return size;\n }\n byte2 = input[i++];\n if ((byte2 & 0xC0) !== 0x80) {\n // wrong continuation\n i--;\n continue;\n }\n if (i >= length) {\n this.interim[0] = byte1;\n this.interim[1] = byte2;\n return size;\n }\n byte3 = input[i++];\n if ((byte3 & 0xC0) !== 0x80) {\n // wrong continuation\n i--;\n continue;\n }\n codepoint = (byte1 & 0x0F) << 12 | (byte2 & 0x3F) << 6 | (byte3 & 0x3F);\n if (codepoint < 0x0800 || (codepoint >= 0xD800 && codepoint <= 0xDFFF)) {\n // illegal codepoint, no i-- here\n continue;\n }\n target[size++] = codepoint;\n\n // 4 bytes\n } else if ((byte1 & 0xF8) === 0xF0) {\n if (i >= length) {\n this.interim[0] = byte1;\n return size;\n }\n byte2 = input[i++];\n if ((byte2 & 0xC0) !== 0x80) {\n // wrong continuation\n i--;\n continue;\n }\n if (i >= length) {\n this.interim[0] = byte1;\n this.interim[1] = byte2;\n return size;\n }\n byte3 = input[i++];\n if ((byte3 & 0xC0) !== 0x80) {\n // wrong continuation\n i--;\n continue;\n }\n if (i >= length) {\n this.interim[0] = byte1;\n this.interim[1] = byte2;\n this.interim[2] = byte3;\n return size;\n }\n byte4 = input[i++];\n if ((byte4 & 0xC0) !== 0x80) {\n // wrong continuation\n i--;\n continue;\n }\n codepoint = (byte1 & 0x07) << 18 | (byte2 & 0x3F) << 12 | (byte3 & 0x3F) << 6 | (byte4 & 0x3F);\n if (codepoint < 0x010000 || codepoint > 0x10FFFF) {\n // illegal codepoint, no i-- here\n continue;\n }\n target[size++] = codepoint;\n } else {\n // illegal byte, just skip\n }\n }\n return size;\n }\n}\n","/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nexport const INVERTED_DEFAULT_COLOR = 257;\nexport const DIM_OPACITY = 0.5;\n\nexport const CHAR_ATLAS_CELL_SPACING = 1;\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IColor } from 'browser/Types';\n\n/**\n * Helper functions where the source type is \"channels\" (individual color channels as numbers).\n */\nexport namespace channels {\n export function toCss(r: number, g: number, b: number, a?: number): string {\n if (a !== undefined) {\n return `#${toPaddedHex(r)}${toPaddedHex(g)}${toPaddedHex(b)}${toPaddedHex(a)}`;\n }\n return `#${toPaddedHex(r)}${toPaddedHex(g)}${toPaddedHex(b)}`;\n }\n\n export function toRgba(r: number, g: number, b: number, a: number = 0xFF): number {\n // >>> 0 forces an unsigned int\n return (r << 24 | g << 16 | b << 8 | a) >>> 0;\n }\n}\n\n/**\n * Helper functions where the source type is `IColor`.\n */\nexport namespace color {\n export function blend(bg: IColor, fg: IColor): IColor {\n const a = (fg.rgba & 0xFF) / 255;\n if (a === 1) {\n return {\n css: fg.css,\n rgba: fg.rgba\n };\n }\n const fgR = (fg.rgba >> 24) & 0xFF;\n const fgG = (fg.rgba >> 16) & 0xFF;\n const fgB = (fg.rgba >> 8) & 0xFF;\n const bgR = (bg.rgba >> 24) & 0xFF;\n const bgG = (bg.rgba >> 16) & 0xFF;\n const bgB = (bg.rgba >> 8) & 0xFF;\n const r = bgR + Math.round((fgR - bgR) * a);\n const g = bgG + Math.round((fgG - bgG) * a);\n const b = bgB + Math.round((fgB - bgB) * a);\n const css = channels.toCss(r, g, b);\n const rgba = channels.toRgba(r, g, b);\n return { css, rgba };\n }\n\n export function isOpaque(color: IColor): boolean {\n return (color.rgba & 0xFF) === 0xFF;\n }\n\n export function ensureContrastRatio(bg: IColor, fg: IColor, ratio: number): IColor | undefined {\n const result = rgba.ensureContrastRatio(bg.rgba, fg.rgba, ratio);\n if (!result) {\n return undefined;\n }\n return rgba.toColor(\n (result >> 24 & 0xFF),\n (result >> 16 & 0xFF),\n (result >> 8 & 0xFF)\n );\n }\n\n export function opaque(color: IColor): IColor {\n const rgbaColor = (color.rgba | 0xFF) >>> 0;\n const [r, g, b] = rgba.toChannels(rgbaColor);\n return {\n css: channels.toCss(r, g, b),\n rgba: rgbaColor\n };\n }\n\n export function opacity(color: IColor, opacity: number): IColor {\n const a = Math.round(opacity * 0xFF);\n const [r, g, b] = rgba.toChannels(color.rgba);\n return {\n css: channels.toCss(r, g, b, a),\n rgba: channels.toRgba(r, g, b, a)\n };\n }\n}\n\n/**\n * Helper functions where the source type is \"css\" (string: '#rgb', '#rgba', '#rrggbb', '#rrggbbaa').\n */\nexport namespace css {\n export function toColor(css: string): IColor {\n switch (css.length) {\n case 7: // #rrggbb\n return {\n css,\n rgba: (parseInt(css.slice(1), 16) << 8 | 0xFF) >>> 0\n };\n case 9: // #rrggbbaa\n return {\n css,\n rgba: parseInt(css.slice(1), 16) >>> 0\n };\n }\n throw new Error('css.toColor: Unsupported css format');\n }\n}\n\n/**\n * Helper functions where the source type is \"rgb\" (number: 0xrrggbb).\n */\nexport namespace rgb {\n /**\n * Gets the relative luminance of an RGB color, this is useful in determining the contrast ratio\n * between two colors.\n * @param rgb The color to use.\n * @see https://www.w3.org/TR/WCAG20/#relativeluminancedef\n */\n export function relativeLuminance(rgb: number): number {\n return relativeLuminance2(\n (rgb >> 16) & 0xFF,\n (rgb >> 8 ) & 0xFF,\n (rgb ) & 0xFF);\n }\n\n /**\n * Gets the relative luminance of an RGB color, this is useful in determining the contrast ratio\n * between two colors.\n * @param r The red channel (0x00 to 0xFF).\n * @param g The green channel (0x00 to 0xFF).\n * @param b The blue channel (0x00 to 0xFF).\n * @see https://www.w3.org/TR/WCAG20/#relativeluminancedef\n */\n export function relativeLuminance2(r: number, g: number, b: number): number {\n const rs = r / 255;\n const gs = g / 255;\n const bs = b / 255;\n const rr = rs <= 0.03928 ? rs / 12.92 : Math.pow((rs + 0.055) / 1.055, 2.4);\n const rg = gs <= 0.03928 ? gs / 12.92 : Math.pow((gs + 0.055) / 1.055, 2.4);\n const rb = bs <= 0.03928 ? bs / 12.92 : Math.pow((bs + 0.055) / 1.055, 2.4);\n return rr * 0.2126 + rg * 0.7152 + rb * 0.0722;\n }\n}\n\n/**\n * Helper functions where the source type is \"rgba\" (number: 0xrrggbbaa).\n */\nexport namespace rgba {\n export function ensureContrastRatio(bgRgba: number, fgRgba: number, ratio: number): number | undefined {\n const bgL = rgb.relativeLuminance(bgRgba >> 8);\n const fgL = rgb.relativeLuminance(fgRgba >> 8);\n const cr = contrastRatio(bgL, fgL);\n if (cr < ratio) {\n if (fgL < bgL) {\n return reduceLuminance(bgRgba, fgRgba, ratio);\n }\n return increaseLuminance(bgRgba, fgRgba, ratio);\n }\n return undefined;\n }\n\n export function reduceLuminance(bgRgba: number, fgRgba: number, ratio: number): number {\n // This is a naive but fast approach to reducing luminance as converting to\n // HSL and back is expensive\n const bgR = (bgRgba >> 24) & 0xFF;\n const bgG = (bgRgba >> 16) & 0xFF;\n const bgB = (bgRgba >> 8) & 0xFF;\n let fgR = (fgRgba >> 24) & 0xFF;\n let fgG = (fgRgba >> 16) & 0xFF;\n let fgB = (fgRgba >> 8) & 0xFF;\n let cr = contrastRatio(rgb.relativeLuminance2(fgR, fgB, fgG), rgb.relativeLuminance2(bgR, bgG, bgB));\n while (cr < ratio && (fgR > 0 || fgG > 0 || fgB > 0)) {\n // Reduce by 10% until the ratio is hit\n fgR -= Math.max(0, Math.ceil(fgR * 0.1));\n fgG -= Math.max(0, Math.ceil(fgG * 0.1));\n fgB -= Math.max(0, Math.ceil(fgB * 0.1));\n cr = contrastRatio(rgb.relativeLuminance2(fgR, fgB, fgG), rgb.relativeLuminance2(bgR, bgG, bgB));\n }\n return (fgR << 24 | fgG << 16 | fgB << 8 | 0xFF) >>> 0;\n }\n\n export function increaseLuminance(bgRgba: number, fgRgba: number, ratio: number): number {\n // This is a naive but fast approach to increasing luminance as converting to\n // HSL and back is expensive\n const bgR = (bgRgba >> 24) & 0xFF;\n const bgG = (bgRgba >> 16) & 0xFF;\n const bgB = (bgRgba >> 8) & 0xFF;\n let fgR = (fgRgba >> 24) & 0xFF;\n let fgG = (fgRgba >> 16) & 0xFF;\n let fgB = (fgRgba >> 8) & 0xFF;\n let cr = contrastRatio(rgb.relativeLuminance2(fgR, fgB, fgG), rgb.relativeLuminance2(bgR, bgG, bgB));\n while (cr < ratio && (fgR < 0xFF || fgG < 0xFF || fgB < 0xFF)) {\n // Increase by 10% until the ratio is hit\n fgR = Math.min(0xFF, fgR + Math.ceil((255 - fgR) * 0.1));\n fgG = Math.min(0xFF, fgG + Math.ceil((255 - fgG) * 0.1));\n fgB = Math.min(0xFF, fgB + Math.ceil((255 - fgB) * 0.1));\n cr = contrastRatio(rgb.relativeLuminance2(fgR, fgB, fgG), rgb.relativeLuminance2(bgR, bgG, bgB));\n }\n return (fgR << 24 | fgG << 16 | fgB << 8 | 0xFF) >>> 0;\n }\n\n export function toChannels(value: number): [number, number, number, number] {\n return [(value >> 24) & 0xFF, (value >> 16) & 0xFF, (value >> 8) & 0xFF, value & 0xFF];\n }\n\n export function toColor(r: number, g: number, b: number): IColor {\n return {\n css: channels.toCss(r, g, b),\n rgba: channels.toRgba(r, g, b)\n };\n }\n}\n\nexport function toPaddedHex(c: number): string {\n const s = c.toString(16);\n return s.length < 2 ? '0' + s : s;\n}\n\n/**\n * Gets the contrast ratio between two relative luminance values.\n * @param l1 The first relative luminance.\n * @param l2 The first relative luminance.\n * @see https://www.w3.org/TR/WCAG20/#contrast-ratiodef\n */\nexport function contrastRatio(l1: number, l2: number): number {\n if (l1 < l2) {\n return (l2 + 0.05) / (l1 + 0.05);\n }\n return (l1 + 0.05) / (l2 + 0.05);\n}\n","/**\n * Copyright (c) 2016 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\ninterface INavigator {\n userAgent: string;\n language: string;\n platform: string;\n}\n\n// We're declaring a navigator global here as we expect it in all runtimes (node and browser), but\n// we want this module to live in common.\ndeclare const navigator: INavigator;\n\nconst isNode = (typeof navigator === 'undefined') ? true : false;\nconst userAgent = (isNode) ? 'node' : navigator.userAgent;\nconst platform = (isNode) ? 'node' : navigator.platform;\n\nexport const isFirefox = !!~userAgent.indexOf('Firefox');\nexport const isSafari = /^((?!chrome|android).)*safari/i.test(userAgent);\n\n// Find the users platform. We use this to interpret the meta key\n// and ISO third level shifts.\n// http://stackoverflow.com/q/19877924/577598\nexport const isMac = contains(['Macintosh', 'MacIntel', 'MacPPC', 'Mac68K'], platform);\nexport const isIpad = platform === 'iPad';\nexport const isIphone = platform === 'iPhone';\nexport const isWindows = contains(['Windows', 'Win16', 'Win32', 'WinCE'], platform);\nexport const isLinux = platform.indexOf('Linux') >= 0;\n\n/**\n * Return if the given array contains the given element\n * @param arr The array to search for the given element.\n * @param el The element to look for into the array\n */\nfunction contains(arr: any[], el: any): boolean {\n return arr.indexOf(el) >= 0;\n}\n","/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\n/**\n * C0 control codes\n * See = https://en.wikipedia.org/wiki/C0_and_C1_control_codes\n */\nexport namespace C0 {\n /** Null (Caret = ^@, C = \\0) */\n export const NUL = '\\x00';\n /** Start of Heading (Caret = ^A) */\n export const SOH = '\\x01';\n /** Start of Text (Caret = ^B) */\n export const STX = '\\x02';\n /** End of Text (Caret = ^C) */\n export const ETX = '\\x03';\n /** End of Transmission (Caret = ^D) */\n export const EOT = '\\x04';\n /** Enquiry (Caret = ^E) */\n export const ENQ = '\\x05';\n /** Acknowledge (Caret = ^F) */\n export const ACK = '\\x06';\n /** Bell (Caret = ^G, C = \\a) */\n export const BEL = '\\x07';\n /** Backspace (Caret = ^H, C = \\b) */\n export const BS = '\\x08';\n /** Character Tabulation, Horizontal Tabulation (Caret = ^I, C = \\t) */\n export const HT = '\\x09';\n /** Line Feed (Caret = ^J, C = \\n) */\n export const LF = '\\x0a';\n /** Line Tabulation, Vertical Tabulation (Caret = ^K, C = \\v) */\n export const VT = '\\x0b';\n /** Form Feed (Caret = ^L, C = \\f) */\n export const FF = '\\x0c';\n /** Carriage Return (Caret = ^M, C = \\r) */\n export const CR = '\\x0d';\n /** Shift Out (Caret = ^N) */\n export const SO = '\\x0e';\n /** Shift In (Caret = ^O) */\n export const SI = '\\x0f';\n /** Data Link Escape (Caret = ^P) */\n export const DLE = '\\x10';\n /** Device Control One (XON) (Caret = ^Q) */\n export const DC1 = '\\x11';\n /** Device Control Two (Caret = ^R) */\n export const DC2 = '\\x12';\n /** Device Control Three (XOFF) (Caret = ^S) */\n export const DC3 = '\\x13';\n /** Device Control Four (Caret = ^T) */\n export const DC4 = '\\x14';\n /** Negative Acknowledge (Caret = ^U) */\n export const NAK = '\\x15';\n /** Synchronous Idle (Caret = ^V) */\n export const SYN = '\\x16';\n /** End of Transmission Block (Caret = ^W) */\n export const ETB = '\\x17';\n /** Cancel (Caret = ^X) */\n export const CAN = '\\x18';\n /** End of Medium (Caret = ^Y) */\n export const EM = '\\x19';\n /** Substitute (Caret = ^Z) */\n export const SUB = '\\x1a';\n /** Escape (Caret = ^[, C = \\e) */\n export const ESC = '\\x1b';\n /** File Separator (Caret = ^\\) */\n export const FS = '\\x1c';\n /** Group Separator (Caret = ^]) */\n export const GS = '\\x1d';\n /** Record Separator (Caret = ^^) */\n export const RS = '\\x1e';\n /** Unit Separator (Caret = ^_) */\n export const US = '\\x1f';\n /** Space */\n export const SP = '\\x20';\n /** Delete (Caret = ^?) */\n export const DEL = '\\x7f';\n}\n\n/**\n * C1 control codes\n * See = https://en.wikipedia.org/wiki/C0_and_C1_control_codes\n */\nexport namespace C1 {\n /** padding character */\n export const PAD = '\\x80';\n /** High Octet Preset */\n export const HOP = '\\x81';\n /** Break Permitted Here */\n export const BPH = '\\x82';\n /** No Break Here */\n export const NBH = '\\x83';\n /** Index */\n export const IND = '\\x84';\n /** Next Line */\n export const NEL = '\\x85';\n /** Start of Selected Area */\n export const SSA = '\\x86';\n /** End of Selected Area */\n export const ESA = '\\x87';\n /** Horizontal Tabulation Set */\n export const HTS = '\\x88';\n /** Horizontal Tabulation With Justification */\n export const HTJ = '\\x89';\n /** Vertical Tabulation Set */\n export const VTS = '\\x8a';\n /** Partial Line Down */\n export const PLD = '\\x8b';\n /** Partial Line Up */\n export const PLU = '\\x8c';\n /** Reverse Index */\n export const RI = '\\x8d';\n /** Single-Shift 2 */\n export const SS2 = '\\x8e';\n /** Single-Shift 3 */\n export const SS3 = '\\x8f';\n /** Device Control String */\n export const DCS = '\\x90';\n /** Private Use 1 */\n export const PU1 = '\\x91';\n /** Private Use 2 */\n export const PU2 = '\\x92';\n /** Set Transmit State */\n export const STS = '\\x93';\n /** Destructive backspace, intended to eliminate ambiguity about meaning of BS. */\n export const CCH = '\\x94';\n /** Message Waiting */\n export const MW = '\\x95';\n /** Start of Protected Area */\n export const SPA = '\\x96';\n /** End of Protected Area */\n export const EPA = '\\x97';\n /** Start of String */\n export const SOS = '\\x98';\n /** Single Graphic Character Introducer */\n export const SGCI = '\\x99';\n /** Single Character Introducer */\n export const SCI = '\\x9a';\n /** Control Sequence Introducer */\n export const CSI = '\\x9b';\n /** String Terminator */\n export const ST = '\\x9c';\n /** Operating System Command */\n export const OSC = '\\x9d';\n /** Privacy Message */\n export const PM = '\\x9e';\n /** Application Program Command */\n export const APC = '\\x9f';\n}\n","/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IRenderDimensions, IRenderLayer } from 'browser/renderer/Types';\nimport { ICellData } from 'common/Types';\nimport { DEFAULT_COLOR, WHITESPACE_CELL_CHAR, WHITESPACE_CELL_CODE, Attributes } from 'common/buffer/Constants';\nimport { IGlyphIdentifier } from 'browser/renderer/atlas/Types';\nimport { DIM_OPACITY, INVERTED_DEFAULT_COLOR } from 'browser/renderer/atlas/Constants';\nimport { BaseCharAtlas } from 'browser/renderer/atlas/BaseCharAtlas';\nimport { acquireCharAtlas } from 'browser/renderer/atlas/CharAtlasCache';\nimport { AttributeData } from 'common/buffer/AttributeData';\nimport { IColorSet, IColor } from 'browser/Types';\nimport { CellData } from 'common/buffer/CellData';\nimport { IBufferService, IOptionsService } from 'common/services/Services';\nimport { throwIfFalsy } from 'browser/renderer/RendererUtils';\nimport { channels, color, rgba } from 'browser/Color';\nimport { removeElementFromParent } from 'browser/Dom';\n\nexport abstract class BaseRenderLayer implements IRenderLayer {\n private _canvas: HTMLCanvasElement;\n protected _ctx!: CanvasRenderingContext2D;\n private _scaledCharWidth: number = 0;\n private _scaledCharHeight: number = 0;\n private _scaledCellWidth: number = 0;\n private _scaledCellHeight: number = 0;\n private _scaledCharLeft: number = 0;\n private _scaledCharTop: number = 0;\n\n protected _charAtlas: BaseCharAtlas | undefined;\n\n /**\n * An object that's reused when drawing glyphs in order to reduce GC.\n */\n private _currentGlyphIdentifier: IGlyphIdentifier = {\n chars: '',\n code: 0,\n bg: 0,\n fg: 0,\n bold: false,\n dim: false,\n italic: false\n };\n\n constructor(\n private _container: HTMLElement,\n id: string,\n zIndex: number,\n private _alpha: boolean,\n protected _colors: IColorSet,\n private _rendererId: number,\n protected readonly _bufferService: IBufferService,\n protected readonly _optionsService: IOptionsService\n ) {\n this._canvas = document.createElement('canvas');\n this._canvas.classList.add(`xterm-${id}-layer`);\n this._canvas.style.zIndex = zIndex.toString();\n this._initCanvas();\n this._container.appendChild(this._canvas);\n }\n\n public dispose(): void {\n removeElementFromParent(this._canvas);\n this._charAtlas?.dispose();\n }\n\n private _initCanvas(): void {\n this._ctx = throwIfFalsy(this._canvas.getContext('2d', {alpha: this._alpha}));\n // Draw the background if this is an opaque layer\n if (!this._alpha) {\n this._clearAll();\n }\n }\n\n public onOptionsChanged(): void {}\n public onBlur(): void {}\n public onFocus(): void {}\n public onCursorMove(): void {}\n public onGridChanged(startRow: number, endRow: number): void {}\n public onSelectionChanged(start: [number, number] | undefined, end: [number, number] | undefined, columnSelectMode: boolean = false): void {}\n\n public setColors(colorSet: IColorSet): void {\n this._refreshCharAtlas(colorSet);\n }\n\n protected _setTransparency(alpha: boolean): void {\n // Do nothing when alpha doesn't change\n if (alpha === this._alpha) {\n return;\n }\n\n // Create new canvas and replace old one\n const oldCanvas = this._canvas;\n this._alpha = alpha;\n // Cloning preserves properties\n this._canvas = this._canvas.cloneNode() as HTMLCanvasElement;\n this._initCanvas();\n this._container.replaceChild(this._canvas, oldCanvas);\n\n // Regenerate char atlas and force a full redraw\n this._refreshCharAtlas(this._colors);\n this.onGridChanged(0, this._bufferService.rows - 1);\n }\n\n /**\n * Refreshes the char atlas, aquiring a new one if necessary.\n * @param colorSet The color set to use for the char atlas.\n */\n private _refreshCharAtlas(colorSet: IColorSet): void {\n if (this._scaledCharWidth <= 0 && this._scaledCharHeight <= 0) {\n return;\n }\n this._charAtlas = acquireCharAtlas(this._optionsService.options, this._rendererId, colorSet, this._scaledCharWidth, this._scaledCharHeight);\n this._charAtlas.warmUp();\n }\n\n public resize(dim: IRenderDimensions): void {\n this._scaledCellWidth = dim.scaledCellWidth;\n this._scaledCellHeight = dim.scaledCellHeight;\n this._scaledCharWidth = dim.scaledCharWidth;\n this._scaledCharHeight = dim.scaledCharHeight;\n this._scaledCharLeft = dim.scaledCharLeft;\n this._scaledCharTop = dim.scaledCharTop;\n this._canvas.width = dim.scaledCanvasWidth;\n this._canvas.height = dim.scaledCanvasHeight;\n this._canvas.style.width = `${dim.canvasWidth}px`;\n this._canvas.style.height = `${dim.canvasHeight}px`;\n\n // Draw the background if this is an opaque layer\n if (!this._alpha) {\n this._clearAll();\n }\n\n this._refreshCharAtlas(this._colors);\n }\n\n public abstract reset(): void;\n\n /**\n * Fills 1+ cells completely. This uses the existing fillStyle on the context.\n * @param x The column to start at.\n * @param y The row to start at\n * @param width The number of columns to fill.\n * @param height The number of rows to fill.\n */\n protected _fillCells(x: number, y: number, width: number, height: number): void {\n this._ctx.fillRect(\n x * this._scaledCellWidth,\n y * this._scaledCellHeight,\n width * this._scaledCellWidth,\n height * this._scaledCellHeight);\n }\n\n /**\n * Fills a 1px line (2px on HDPI) at the bottom of the cell. This uses the\n * existing fillStyle on the context.\n * @param x The column to fill.\n * @param y The row to fill.\n */\n protected _fillBottomLineAtCells(x: number, y: number, width: number = 1): void {\n this._ctx.fillRect(\n x * this._scaledCellWidth,\n (y + 1) * this._scaledCellHeight - window.devicePixelRatio - 1 /* Ensure it's drawn within the cell */,\n width * this._scaledCellWidth,\n window.devicePixelRatio);\n }\n\n /**\n * Fills a 1px line (2px on HDPI) at the left of the cell. This uses the\n * existing fillStyle on the context.\n * @param x The column to fill.\n * @param y The row to fill.\n */\n protected _fillLeftLineAtCell(x: number, y: number, width: number): void {\n this._ctx.fillRect(\n x * this._scaledCellWidth,\n y * this._scaledCellHeight,\n window.devicePixelRatio * width,\n this._scaledCellHeight);\n }\n\n /**\n * Strokes a 1px rectangle (2px on HDPI) around a cell. This uses the existing\n * strokeStyle on the context.\n * @param x The column to fill.\n * @param y The row to fill.\n */\n protected _strokeRectAtCell(x: number, y: number, width: number, height: number): void {\n this._ctx.lineWidth = window.devicePixelRatio;\n this._ctx.strokeRect(\n x * this._scaledCellWidth + window.devicePixelRatio / 2,\n y * this._scaledCellHeight + (window.devicePixelRatio / 2),\n width * this._scaledCellWidth - window.devicePixelRatio,\n (height * this._scaledCellHeight) - window.devicePixelRatio);\n }\n\n /**\n * Clears the entire canvas.\n */\n protected _clearAll(): void {\n if (this._alpha) {\n this._ctx.clearRect(0, 0, this._canvas.width, this._canvas.height);\n } else {\n this._ctx.fillStyle = this._colors.background.css;\n this._ctx.fillRect(0, 0, this._canvas.width, this._canvas.height);\n }\n }\n\n /**\n * Clears 1+ cells completely.\n * @param x The column to start at.\n * @param y The row to start at.\n * @param width The number of columns to clear.\n * @param height The number of rows to clear.\n */\n protected _clearCells(x: number, y: number, width: number, height: number): void {\n if (this._alpha) {\n this._ctx.clearRect(\n x * this._scaledCellWidth,\n y * this._scaledCellHeight,\n width * this._scaledCellWidth,\n height * this._scaledCellHeight);\n } else {\n this._ctx.fillStyle = this._colors.background.css;\n this._ctx.fillRect(\n x * this._scaledCellWidth,\n y * this._scaledCellHeight,\n width * this._scaledCellWidth,\n height * this._scaledCellHeight);\n }\n }\n\n /**\n * Draws a truecolor character at the cell. The character will be clipped to\n * ensure that it fits with the cell, including the cell to the right if it's\n * a wide character. This uses the existing fillStyle on the context.\n * @param cell The cell data for the character to draw.\n * @param x The column to draw at.\n * @param y The row to draw at.\n * @param color The color of the character.\n */\n protected _fillCharTrueColor(cell: CellData, x: number, y: number): void {\n this._ctx.font = this._getFont(false, false);\n this._ctx.textBaseline = 'middle';\n this._clipRow(y);\n this._ctx.fillText(\n cell.getChars(),\n x * this._scaledCellWidth + this._scaledCharLeft,\n y * this._scaledCellHeight + this._scaledCharTop + this._scaledCharHeight / 2);\n }\n\n /**\n * Draws one or more characters at a cell. If possible this will draw using\n * the character atlas to reduce draw time.\n * @param chars The character or characters.\n * @param code The character code.\n * @param width The width of the characters.\n * @param x The column to draw at.\n * @param y The row to draw at.\n * @param fg The foreground color, in the format stored within the attributes.\n * @param bg The background color, in the format stored within the attributes.\n * This is used to validate whether a cached image can be used.\n * @param bold Whether the text is bold.\n */\n protected _drawChars(cell: ICellData, x: number, y: number): void {\n const contrastColor = this._getContrastColor(cell);\n\n // skip cache right away if we draw in RGB\n // Note: to avoid bad runtime JoinedCellData will be skipped\n // in the cache handler itself (atlasDidDraw == false) and\n // fall through to uncached later down below\n if (contrastColor || cell.isFgRGB() || cell.isBgRGB()) {\n this._drawUncachedChars(cell, x, y, contrastColor);\n return;\n }\n\n let fg;\n let bg;\n if (cell.isInverse()) {\n fg = (cell.isBgDefault()) ? INVERTED_DEFAULT_COLOR : cell.getBgColor();\n bg = (cell.isFgDefault()) ? INVERTED_DEFAULT_COLOR : cell.getFgColor();\n } else {\n bg = (cell.isBgDefault()) ? DEFAULT_COLOR : cell.getBgColor();\n fg = (cell.isFgDefault()) ? DEFAULT_COLOR : cell.getFgColor();\n }\n\n const drawInBrightColor = this._optionsService.options.drawBoldTextInBrightColors && cell.isBold() && fg < 8;\n\n fg += drawInBrightColor ? 8 : 0;\n this._currentGlyphIdentifier.chars = cell.getChars() || WHITESPACE_CELL_CHAR;\n this._currentGlyphIdentifier.code = cell.getCode() || WHITESPACE_CELL_CODE;\n this._currentGlyphIdentifier.bg = bg;\n this._currentGlyphIdentifier.fg = fg;\n this._currentGlyphIdentifier.bold = !!cell.isBold();\n this._currentGlyphIdentifier.dim = !!cell.isDim();\n this._currentGlyphIdentifier.italic = !!cell.isItalic();\n const atlasDidDraw = this._charAtlas && this._charAtlas.draw(\n this._ctx,\n this._currentGlyphIdentifier,\n x * this._scaledCellWidth + this._scaledCharLeft,\n y * this._scaledCellHeight + this._scaledCharTop\n );\n\n if (!atlasDidDraw) {\n this._drawUncachedChars(cell, x, y);\n }\n }\n\n /**\n * Draws one or more characters at one or more cells. The character(s) will be\n * clipped to ensure that they fit with the cell(s), including the cell to the\n * right if the last character is a wide character.\n * @param chars The character.\n * @param width The width of the character.\n * @param fg The foreground color, in the format stored within the attributes.\n * @param x The column to draw at.\n * @param y The row to draw at.\n */\n private _drawUncachedChars(cell: ICellData, x: number, y: number, fgOverride?: IColor): void {\n this._ctx.save();\n this._ctx.font = this._getFont(!!cell.isBold(), !!cell.isItalic());\n this._ctx.textBaseline = 'middle';\n\n if (cell.isInverse()) {\n if (fgOverride) {\n this._ctx.fillStyle = fgOverride.css;\n } else if (cell.isBgDefault()) {\n this._ctx.fillStyle = color.opaque(this._colors.background).css;\n } else if (cell.isBgRGB()) {\n this._ctx.fillStyle = `rgb(${AttributeData.toColorRGB(cell.getBgColor()).join(',')})`;\n } else {\n let bg = cell.getBgColor();\n if (this._optionsService.options.drawBoldTextInBrightColors && cell.isBold() && bg < 8) {\n bg += 8;\n }\n this._ctx.fillStyle = this._colors.ansi[bg].css;\n }\n } else {\n if (fgOverride) {\n this._ctx.fillStyle = fgOverride.css;\n } else if (cell.isFgDefault()) {\n this._ctx.fillStyle = this._colors.foreground.css;\n } else if (cell.isFgRGB()) {\n this._ctx.fillStyle = `rgb(${AttributeData.toColorRGB(cell.getFgColor()).join(',')})`;\n } else {\n let fg = cell.getFgColor();\n if (this._optionsService.options.drawBoldTextInBrightColors && cell.isBold() && fg < 8) {\n fg += 8;\n }\n this._ctx.fillStyle = this._colors.ansi[fg].css;\n }\n }\n\n this._clipRow(y);\n\n // Apply alpha to dim the character\n if (cell.isDim()) {\n this._ctx.globalAlpha = DIM_OPACITY;\n }\n // Draw the character\n this._ctx.fillText(\n cell.getChars(),\n x * this._scaledCellWidth + this._scaledCharLeft,\n y * this._scaledCellHeight + this._scaledCharTop + this._scaledCharHeight / 2);\n this._ctx.restore();\n }\n\n /**\n * Clips a row to ensure no pixels will be drawn outside the cells in the row.\n * @param y The row to clip.\n */\n private _clipRow(y: number): void {\n this._ctx.beginPath();\n this._ctx.rect(\n 0,\n y * this._scaledCellHeight,\n this._bufferService.cols * this._scaledCellWidth,\n this._scaledCellHeight);\n this._ctx.clip();\n }\n\n /**\n * Gets the current font.\n * @param isBold If we should use the bold fontWeight.\n */\n protected _getFont(isBold: boolean, isItalic: boolean): string {\n const fontWeight = isBold ? this._optionsService.options.fontWeightBold : this._optionsService.options.fontWeight;\n const fontStyle = isItalic ? 'italic' : '';\n\n return `${fontStyle} ${fontWeight} ${this._optionsService.options.fontSize * window.devicePixelRatio}px ${this._optionsService.options.fontFamily}`;\n }\n\n private _getContrastColor(cell: CellData): IColor | undefined {\n if (this._optionsService.options.minimumContrastRatio === 1) {\n return undefined;\n }\n\n // Try get from cache first\n const adjustedColor = this._colors.contrastCache.getColor(cell.bg, cell.fg);\n if (adjustedColor !== undefined) {\n return adjustedColor || undefined;\n }\n\n let fgColor = cell.getFgColor();\n let fgColorMode = cell.getFgColorMode();\n let bgColor = cell.getBgColor();\n let bgColorMode = cell.getBgColorMode();\n const isInverse = !!cell.isInverse();\n const isBold = !!cell.isInverse();\n if (isInverse) {\n const temp = fgColor;\n fgColor = bgColor;\n bgColor = temp;\n const temp2 = fgColorMode;\n fgColorMode = bgColorMode;\n bgColorMode = temp2;\n }\n\n const bgRgba = this._resolveBackgroundRgba(bgColorMode, bgColor, isInverse);\n const fgRgba = this._resolveForegroundRgba(fgColorMode, fgColor, isInverse, isBold);\n const result = rgba.ensureContrastRatio(bgRgba, fgRgba, this._optionsService.options.minimumContrastRatio);\n\n if (!result) {\n this._colors.contrastCache.setColor(cell.bg, cell.fg, null);\n return undefined;\n }\n\n const color: IColor = {\n css: channels.toCss(\n (result >> 24) & 0xFF,\n (result >> 16) & 0xFF,\n (result >> 8) & 0xFF\n ),\n rgba: result\n };\n this._colors.contrastCache.setColor(cell.bg, cell.fg, color);\n\n return color;\n }\n\n private _resolveBackgroundRgba(bgColorMode: number, bgColor: number, inverse: boolean): number {\n switch (bgColorMode) {\n case Attributes.CM_P16:\n case Attributes.CM_P256:\n return this._colors.ansi[bgColor].rgba;\n case Attributes.CM_RGB:\n return bgColor << 8;\n case Attributes.CM_DEFAULT:\n default:\n if (inverse) {\n return this._colors.foreground.rgba;\n }\n return this._colors.background.rgba;\n }\n }\n\n private _resolveForegroundRgba(fgColorMode: number, fgColor: number, inverse: boolean, bold: boolean): number {\n switch (fgColorMode) {\n case Attributes.CM_P16:\n case Attributes.CM_P256:\n if (this._optionsService.options.drawBoldTextInBrightColors && bold && fgColor < 8) {\n fgColor += 8;\n }\n return this._colors.ansi[fgColor].rgba;\n case Attributes.CM_RGB:\n return fgColor << 8;\n case Attributes.CM_DEFAULT:\n default:\n if (inverse) {\n return this._colors.background.rgba;\n }\n return this._colors.foreground.rgba;\n }\n }\n}\n\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n *\n * This was heavily inspired from microsoft/vscode's dependency injection system (MIT).\n */\n/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport { IServiceIdentifier } from 'common/services/Services';\n\nconst DI_TARGET = 'di$target';\nconst DI_DEPENDENCIES = 'di$dependencies';\n\nexport const serviceRegistry: Map<string, IServiceIdentifier<any>> = new Map();\n\nexport function getServiceDependencies(ctor: any): { id: IServiceIdentifier<any>, index: number, optional: boolean }[] {\n return ctor[DI_DEPENDENCIES] || [];\n}\n\nexport function createDecorator<T>(id: string): IServiceIdentifier<T> {\n if (serviceRegistry.has(id)) {\n return serviceRegistry.get(id)!;\n }\n\n const decorator: any = function (target: Function, key: string, index: number): any {\n if (arguments.length !== 3) {\n throw new Error('@IServiceName-decorator can only be used to decorate a parameter');\n }\n\n storeServiceDependency(decorator, target, index);\n };\n\n decorator.toString = () => id;\n\n serviceRegistry.set(id, decorator);\n return decorator;\n}\n\nfunction storeServiceDependency(id: Function, target: Function, index: number): void {\n if ((target as any)[DI_TARGET] === target) {\n (target as any)[DI_DEPENDENCIES].push({ id, index });\n } else {\n (target as any)[DI_DEPENDENCIES] = [{ id, index }];\n (target as any)[DI_TARGET] = target;\n }\n}\n","/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nexport type TypedArray = Uint8Array | Uint16Array | Uint32Array | Uint8ClampedArray | Int8Array | Int16Array | Int32Array | Float32Array | Float64Array;\n\n\n/**\n * polyfill for TypedArray.fill\n * This is needed to support .fill in all safari versions and IE 11.\n */\nexport function fill<T extends TypedArray>(array: T, value: number, start?: number, end?: number): T {\n // all modern engines that support .fill\n if (array.fill) {\n return array.fill(value, start, end) as T;\n }\n return fillFallback(array, value, start, end);\n}\n\nexport function fillFallback<T extends TypedArray>(array: T, value: number, start: number = 0, end: number = array.length): T {\n // safari and IE 11\n // since IE 11 does not support Array.prototype.fill either\n // we cannot use the suggested polyfill from MDN\n // instead we simply fall back to looping\n if (start >= array.length) {\n return array;\n }\n start = (array.length + start) % array.length;\n if (end >= array.length) {\n end = array.length;\n } else {\n end = (array.length + end) % array.length;\n }\n for (let i = start; i < end; ++i) {\n array[i] = value;\n }\n return array;\n}\n\n/**\n * Concat two typed arrays `a` and `b`.\n * Returns a new typed array.\n */\nexport function concat<T extends TypedArray>(a: T, b: T): T {\n const result = new (a.constructor as any)(a.length + b.length);\n result.set(a);\n result.set(b, a.length);\n return result;\n}\n","/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { CharData, IBufferLine, ICellData, IAttributeData, IExtendedAttrs } from 'common/Types';\nimport { stringFromCodePoint } from 'common/input/TextDecoder';\nimport { CHAR_DATA_CHAR_INDEX, CHAR_DATA_WIDTH_INDEX, CHAR_DATA_ATTR_INDEX, NULL_CELL_CHAR, NULL_CELL_WIDTH, NULL_CELL_CODE, WHITESPACE_CELL_CHAR, Content, BgFlags } from 'common/buffer/Constants';\nimport { CellData } from 'common/buffer/CellData';\nimport { AttributeData, ExtendedAttrs } from 'common/buffer/AttributeData';\n\n/**\n * buffer memory layout:\n *\n * | uint32_t | uint32_t | uint32_t |\n * | `content` | `FG` | `BG` |\n * | wcwidth(2) comb(1) codepoint(21) | flags(8) R(8) G(8) B(8) | flags(8) R(8) G(8) B(8) |\n */\n\n\n/** typed array slots taken by one cell */\nconst CELL_SIZE = 3;\n\n/**\n * Cell member indices.\n *\n * Direct access:\n * `content = data[column * CELL_SIZE + Cell.CONTENT];`\n * `fg = data[column * CELL_SIZE + Cell.FG];`\n * `bg = data[column * CELL_SIZE + Cell.BG];`\n */\nconst enum Cell {\n CONTENT = 0,\n FG = 1, // currently simply holds all known attrs\n BG = 2 // currently unused\n}\n\nexport const DEFAULT_ATTR_DATA = Object.freeze(new AttributeData());\n\n/**\n * Typed array based bufferline implementation.\n *\n * There are 2 ways to insert data into the cell buffer:\n * - `setCellFromCodepoint` + `addCodepointToCell`\n * Use these for data that is already UTF32.\n * Used during normal input in `InputHandler` for faster buffer access.\n * - `setCell`\n * This method takes a CellData object and stores the data in the buffer.\n * Use `CellData.fromCharData` to create the CellData object (e.g. from JS string).\n *\n * To retrieve data from the buffer use either one of the primitive methods\n * (if only one particular value is needed) or `loadCell`. For `loadCell` in a loop\n * memory allocs / GC pressure can be greatly reduced by reusing the CellData object.\n */\nexport class BufferLine implements IBufferLine {\n protected _data: Uint32Array;\n protected _combined: {[index: number]: string} = {};\n protected _extendedAttrs: {[index: number]: ExtendedAttrs} = {};\n public length: number;\n\n constructor(cols: number, fillCellData?: ICellData, public isWrapped: boolean = false) {\n this._data = new Uint32Array(cols * CELL_SIZE);\n const cell = fillCellData || CellData.fromCharData([0, NULL_CELL_CHAR, NULL_CELL_WIDTH, NULL_CELL_CODE]);\n for (let i = 0; i < cols; ++i) {\n this.setCell(i, cell);\n }\n this.length = cols;\n }\n\n /**\n * Get cell data CharData.\n * @deprecated\n */\n public get(index: number): CharData {\n const content = this._data[index * CELL_SIZE + Cell.CONTENT];\n const cp = content & Content.CODEPOINT_MASK;\n return [\n this._data[index * CELL_SIZE + Cell.FG],\n (content & Content.IS_COMBINED_MASK)\n ? this._combined[index]\n : (cp) ? stringFromCodePoint(cp) : '',\n content >> Content.WIDTH_SHIFT,\n (content & Content.IS_COMBINED_MASK)\n ? this._combined[index].charCodeAt(this._combined[index].length - 1)\n : cp\n ];\n }\n\n /**\n * Set cell data from CharData.\n * @deprecated\n */\n public set(index: number, value: CharData): void {\n this._data[index * CELL_SIZE + Cell.FG] = value[CHAR_DATA_ATTR_INDEX];\n if (value[CHAR_DATA_CHAR_INDEX].length > 1) {\n this._combined[index] = value[1];\n this._data[index * CELL_SIZE + Cell.CONTENT] = index | Content.IS_COMBINED_MASK | (value[CHAR_DATA_WIDTH_INDEX] << Content.WIDTH_SHIFT);\n } else {\n this._data[index * CELL_SIZE + Cell.CONTENT] = value[CHAR_DATA_CHAR_INDEX].charCodeAt(0) | (value[CHAR_DATA_WIDTH_INDEX] << Content.WIDTH_SHIFT);\n }\n }\n\n /**\n * primitive getters\n * use these when only one value is needed, otherwise use `loadCell`\n */\n public getWidth(index: number): number {\n return this._data[index * CELL_SIZE + Cell.CONTENT] >> Content.WIDTH_SHIFT;\n }\n\n /** Test whether content has width. */\n public hasWidth(index: number): number {\n return this._data[index * CELL_SIZE + Cell.CONTENT] & Content.WIDTH_MASK;\n }\n\n /** Get FG cell component. */\n public getFg(index: number): number {\n return this._data[index * CELL_SIZE + Cell.FG];\n }\n\n /** Get BG cell component. */\n public getBg(index: number): number {\n return this._data[index * CELL_SIZE + Cell.BG];\n }\n\n /**\n * Test whether contains any chars.\n * Basically an empty has no content, but other cells might differ in FG/BG\n * from real empty cells.\n * */\n public hasContent(index: number): number {\n return this._data[index * CELL_SIZE + Cell.CONTENT] & Content.HAS_CONTENT_MASK;\n }\n\n /**\n * Get codepoint of the cell.\n * To be in line with `code` in CharData this either returns\n * a single UTF32 codepoint or the last codepoint of a combined string.\n */\n public getCodePoint(index: number): number {\n const content = this._data[index * CELL_SIZE + Cell.CONTENT];\n if (content & Content.IS_COMBINED_MASK) {\n return this._combined[index].charCodeAt(this._combined[index].length - 1);\n }\n return content & Content.CODEPOINT_MASK;\n }\n\n /** Test whether the cell contains a combined string. */\n public isCombined(index: number): number {\n return this._data[index * CELL_SIZE + Cell.CONTENT] & Content.IS_COMBINED_MASK;\n }\n\n /** Returns the string content of the cell. */\n public getString(index: number): string {\n const content = this._data[index * CELL_SIZE + Cell.CONTENT];\n if (content & Content.IS_COMBINED_MASK) {\n return this._combined[index];\n }\n if (content & Content.CODEPOINT_MASK) {\n return stringFromCodePoint(content & Content.CODEPOINT_MASK);\n }\n // return empty string for empty cells\n return '';\n }\n\n /**\n * Load data at `index` into `cell`. This is used to access cells in a way that's more friendly\n * to GC as it significantly reduced the amount of new objects/references needed.\n */\n public loadCell(index: number, cell: ICellData): ICellData {\n const startIndex = index * CELL_SIZE;\n cell.content = this._data[startIndex + Cell.CONTENT];\n cell.fg = this._data[startIndex + Cell.FG];\n cell.bg = this._data[startIndex + Cell.BG];\n if (cell.content & Content.IS_COMBINED_MASK) {\n cell.combinedData = this._combined[index];\n }\n if (cell.bg & BgFlags.HAS_EXTENDED) {\n cell.extended = this._extendedAttrs[index];\n }\n return cell;\n }\n\n /**\n * Set data at `index` to `cell`.\n */\n public setCell(index: number, cell: ICellData): void {\n if (cell.content & Content.IS_COMBINED_MASK) {\n this._combined[index] = cell.combinedData;\n }\n if (cell.bg & BgFlags.HAS_EXTENDED) {\n this._extendedAttrs[index] = cell.extended;\n }\n this._data[index * CELL_SIZE + Cell.CONTENT] = cell.content;\n this._data[index * CELL_SIZE + Cell.FG] = cell.fg;\n this._data[index * CELL_SIZE + Cell.BG] = cell.bg;\n }\n\n /**\n * Set cell data from input handler.\n * Since the input handler see the incoming chars as UTF32 codepoints,\n * it gets an optimized access method.\n */\n public setCellFromCodePoint(index: number, codePoint: number, width: number, fg: number, bg: number, eAttrs: IExtendedAttrs): void {\n if (bg & BgFlags.HAS_EXTENDED) {\n this._extendedAttrs[index] = eAttrs;\n }\n this._data[index * CELL_SIZE + Cell.CONTENT] = codePoint | (width << Content.WIDTH_SHIFT);\n this._data[index * CELL_SIZE + Cell.FG] = fg;\n this._data[index * CELL_SIZE + Cell.BG] = bg;\n }\n\n /**\n * Add a codepoint to a cell from input handler.\n * During input stage combining chars with a width of 0 follow and stack\n * onto a leading char. Since we already set the attrs\n * by the previous `setDataFromCodePoint` call, we can omit it here.\n */\n public addCodepointToCell(index: number, codePoint: number): void {\n let content = this._data[index * CELL_SIZE + Cell.CONTENT];\n if (content & Content.IS_COMBINED_MASK) {\n // we already have a combined string, simply add\n this._combined[index] += stringFromCodePoint(codePoint);\n } else {\n if (content & Content.CODEPOINT_MASK) {\n // normal case for combining chars:\n // - move current leading char + new one into combined string\n // - set combined flag\n this._combined[index] = stringFromCodePoint(content & Content.CODEPOINT_MASK) + stringFromCodePoint(codePoint);\n content &= ~Content.CODEPOINT_MASK; // set codepoint in buffer to 0\n content |= Content.IS_COMBINED_MASK;\n } else {\n // should not happen - we actually have no data in the cell yet\n // simply set the data in the cell buffer with a width of 1\n content = codePoint | (1 << Content.WIDTH_SHIFT);\n }\n this._data[index * CELL_SIZE + Cell.CONTENT] = content;\n }\n }\n\n public insertCells(pos: number, n: number, fillCellData: ICellData, eraseAttr?: IAttributeData): void {\n pos %= this.length;\n\n // handle fullwidth at pos: reset cell one to the left if pos is second cell of a wide char\n if (pos && this.getWidth(pos - 1) === 2) {\n this.setCellFromCodePoint(pos - 1, 0, 1, eraseAttr?.fg || 0, eraseAttr?.bg || 0, eraseAttr?.extended || new ExtendedAttrs());\n }\n\n if (n < this.length - pos) {\n const cell = new CellData();\n for (let i = this.length - pos - n - 1; i >= 0; --i) {\n this.setCell(pos + n + i, this.loadCell(pos + i, cell));\n }\n for (let i = 0; i < n; ++i) {\n this.setCell(pos + i, fillCellData);\n }\n } else {\n for (let i = pos; i < this.length; ++i) {\n this.setCell(i, fillCellData);\n }\n }\n\n // handle fullwidth at line end: reset last cell if it is first cell of a wide char\n if (this.getWidth(this.length - 1) === 2) {\n this.setCellFromCodePoint(this.length - 1, 0, 1, eraseAttr?.fg || 0, eraseAttr?.bg || 0, eraseAttr?.extended || new ExtendedAttrs());\n }\n }\n\n public deleteCells(pos: number, n: number, fillCellData: ICellData, eraseAttr?: IAttributeData): void {\n pos %= this.length;\n if (n < this.length - pos) {\n const cell = new CellData();\n for (let i = 0; i < this.length - pos - n; ++i) {\n this.setCell(pos + i, this.loadCell(pos + n + i, cell));\n }\n for (let i = this.length - n; i < this.length; ++i) {\n this.setCell(i, fillCellData);\n }\n } else {\n for (let i = pos; i < this.length; ++i) {\n this.setCell(i, fillCellData);\n }\n }\n\n // handle fullwidth at pos:\n // - reset pos-1 if wide char\n // - reset pos if width==0 (previous second cell of a wide char)\n if (pos && this.getWidth(pos - 1) === 2) {\n this.setCellFromCodePoint(pos - 1, 0, 1, eraseAttr?.fg || 0, eraseAttr?.bg || 0, eraseAttr?.extended || new ExtendedAttrs());\n }\n if (this.getWidth(pos) === 0 && !this.hasContent(pos)) {\n this.setCellFromCodePoint(pos, 0, 1, eraseAttr?.fg || 0, eraseAttr?.bg || 0, eraseAttr?.extended || new ExtendedAttrs());\n }\n }\n\n public replaceCells(start: number, end: number, fillCellData: ICellData, eraseAttr?: IAttributeData): void {\n // handle fullwidth at start: reset cell one to the left if start is second cell of a wide char\n if (start && this.getWidth(start - 1) === 2) {\n this.setCellFromCodePoint(start - 1, 0, 1, eraseAttr?.fg || 0, eraseAttr?.bg || 0, eraseAttr?.extended || new ExtendedAttrs());\n }\n // handle fullwidth at last cell + 1: reset to empty cell if it is second part of a wide char\n if (end < this.length && this.getWidth(end - 1) === 2) {\n this.setCellFromCodePoint(end, 0, 1, eraseAttr?.fg || 0, eraseAttr?.bg || 0, eraseAttr?.extended || new ExtendedAttrs());\n }\n\n while (start < end && start < this.length) {\n this.setCell(start++, fillCellData);\n }\n }\n\n public resize(cols: number, fillCellData: ICellData): void {\n if (cols === this.length) {\n return;\n }\n if (cols > this.length) {\n const data = new Uint32Array(cols * CELL_SIZE);\n if (this.length) {\n if (cols * CELL_SIZE < this._data.length) {\n data.set(this._data.subarray(0, cols * CELL_SIZE));\n } else {\n data.set(this._data);\n }\n }\n this._data = data;\n for (let i = this.length; i < cols; ++i) {\n this.setCell(i, fillCellData);\n }\n } else {\n if (cols) {\n const data = new Uint32Array(cols * CELL_SIZE);\n data.set(this._data.subarray(0, cols * CELL_SIZE));\n this._data = data;\n // Remove any cut off combined data, FIXME: repeat this for extended attrs\n const keys = Object.keys(this._combined);\n for (let i = 0; i < keys.length; i++) {\n const key = parseInt(keys[i], 10);\n if (key >= cols) {\n delete this._combined[key];\n }\n }\n } else {\n this._data = new Uint32Array(0);\n this._combined = {};\n }\n }\n this.length = cols;\n }\n\n /** fill a line with fillCharData */\n public fill(fillCellData: ICellData): void {\n this._combined = {};\n this._extendedAttrs = {};\n for (let i = 0; i < this.length; ++i) {\n this.setCell(i, fillCellData);\n }\n }\n\n /** alter to a full copy of line */\n public copyFrom(line: BufferLine): void {\n if (this.length !== line.length) {\n this._data = new Uint32Array(line._data);\n } else {\n // use high speed copy if lengths are equal\n this._data.set(line._data);\n }\n this.length = line.length;\n this._combined = {};\n for (const el in line._combined) {\n this._combined[el] = line._combined[el];\n }\n this._extendedAttrs = {};\n for (const el in line._extendedAttrs) {\n this._extendedAttrs[el] = line._extendedAttrs[el];\n }\n this.isWrapped = line.isWrapped;\n }\n\n /** create a new clone */\n public clone(): IBufferLine {\n const newLine = new BufferLine(0);\n newLine._data = new Uint32Array(this._data);\n newLine.length = this.length;\n for (const el in this._combined) {\n newLine._combined[el] = this._combined[el];\n }\n for (const el in this._extendedAttrs) {\n newLine._extendedAttrs[el] = this._extendedAttrs[el];\n }\n newLine.isWrapped = this.isWrapped;\n return newLine;\n }\n\n public getTrimmedLength(): number {\n for (let i = this.length - 1; i >= 0; --i) {\n if ((this._data[i * CELL_SIZE + Cell.CONTENT] & Content.HAS_CONTENT_MASK)) {\n return i + (this._data[i * CELL_SIZE + Cell.CONTENT] >> Content.WIDTH_SHIFT);\n }\n }\n return 0;\n }\n\n public copyCellsFrom(src: BufferLine, srcCol: number, destCol: number, length: number, applyInReverse: boolean): void {\n const srcData = src._data;\n if (applyInReverse) {\n for (let cell = length - 1; cell >= 0; cell--) {\n for (let i = 0; i < CELL_SIZE; i++) {\n this._data[(destCol + cell) * CELL_SIZE + i] = srcData[(srcCol + cell) * CELL_SIZE + i];\n }\n }\n } else {\n for (let cell = 0; cell < length; cell++) {\n for (let i = 0; i < CELL_SIZE; i++) {\n this._data[(destCol + cell) * CELL_SIZE + i] = srcData[(srcCol + cell) * CELL_SIZE + i];\n }\n }\n }\n\n // Move any combined data over as needed, FIXME: repeat for extended attrs\n const srcCombinedKeys = Object.keys(src._combined);\n for (let i = 0; i < srcCombinedKeys.length; i++) {\n const key = parseInt(srcCombinedKeys[i], 10);\n if (key >= srcCol) {\n this._combined[key - srcCol + destCol] = src._combined[key];\n }\n }\n }\n\n public translateToString(trimRight: boolean = false, startCol: number = 0, endCol: number = this.length): string {\n if (trimRight) {\n endCol = Math.min(endCol, this.getTrimmedLength());\n }\n let result = '';\n while (startCol < endCol) {\n const content = this._data[startCol * CELL_SIZE + Cell.CONTENT];\n const cp = content & Content.CODEPOINT_MASK;\n result += (content & Content.IS_COMBINED_MASK) ? this._combined[startCol] : (cp) ? stringFromCodePoint(cp) : WHITESPACE_CELL_CHAR;\n startCol += (content >> Content.WIDTH_SHIFT) || 1; // always advance by 1\n }\n return result;\n }\n}\n","/**\n * Copyright (c) 2020 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nexport function removeElementFromParent(...elements: (HTMLElement | undefined)[]): void {\n for (const e of elements) {\n e?.parentElement?.removeChild(e);\n }\n}\n","/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\n// eslint-disable-next-line prefer-const\nexport let promptLabel = 'Terminal input';\n\n// eslint-disable-next-line prefer-const\nexport let tooMuchOutput = 'Too much output to announce, navigate to rows manually to read';\n","/**\n * Copyright (c) 2014 The xterm.js authors. All rights reserved.\n * Copyright (c) 2012-2013, Christopher Jeffrey (MIT License)\n * @license MIT\n */\n\nimport { IInputHandler, IAttributeData, IDisposable, IWindowOptions } from 'common/Types';\nimport { C0, C1 } from 'common/data/EscapeSequences';\nimport { CHARSETS, DEFAULT_CHARSET } from 'common/data/Charsets';\nimport { EscapeSequenceParser } from 'common/parser/EscapeSequenceParser';\nimport { Disposable } from 'common/Lifecycle';\nimport { concat } from 'common/TypedArrayUtils';\nimport { StringToUtf32, stringFromCodePoint, utf32ToString, Utf8ToUtf32 } from 'common/input/TextDecoder';\nimport { DEFAULT_ATTR_DATA } from 'common/buffer/BufferLine';\nimport { EventEmitter, IEvent } from 'common/EventEmitter';\nimport { IParsingState, IDcsHandler, IEscapeSequenceParser, IParams, IFunctionIdentifier } from 'common/parser/Types';\nimport { NULL_CELL_CODE, NULL_CELL_WIDTH, Attributes, FgFlags, BgFlags, Content, UnderlineStyle } from 'common/buffer/Constants';\nimport { CellData } from 'common/buffer/CellData';\nimport { AttributeData } from 'common/buffer/AttributeData';\nimport { ICoreService, IBufferService, IOptionsService, ILogService, IDirtyRowService, ICoreMouseService, ICharsetService, IUnicodeService } from 'common/services/Services';\nimport { OscHandler } from 'common/parser/OscParser';\nimport { DcsHandler } from 'common/parser/DcsParser';\n\n/**\n * Map collect to glevel. Used in `selectCharset`.\n */\nconst GLEVEL: {[key: string]: number} = {'(': 0, ')': 1, '*': 2, '+': 3, '-': 1, '.': 2};\n\n/**\n * VT commands done by the parser - FIXME: move this to the parser?\n */\n// @vt: #Y ESC CSI \"Control Sequence Introducer\" \"ESC [\" \"Start of a CSI sequence.\"\n// @vt: #Y ESC OSC \"Operating System Command\" \"ESC ]\" \"Start of an OSC sequence.\"\n// @vt: #Y ESC DCS \"Device Control String\" \"ESC P\" \"Start of a DCS sequence.\"\n// @vt: #Y ESC ST \"String Terminator\" \"ESC \\\" \"Terminator used for string type sequences.\"\n// @vt: #Y ESC PM \"Privacy Message\" \"ESC ^\" \"Start of a privacy message.\"\n// @vt: #Y ESC APC \"Application Program Command\" \"ESC _\" \"Start of an APC sequence.\"\n// @vt: #Y C1 CSI \"Control Sequence Introducer\" \"\\x9B\" \"Start of a CSI sequence.\"\n// @vt: #Y C1 OSC \"Operating System Command\" \"\\x9D\" \"Start of an OSC sequence.\"\n// @vt: #Y C1 DCS \"Device Control String\" \"\\x90\" \"Start of a DCS sequence.\"\n// @vt: #Y C1 ST \"String Terminator\" \"\\x9C\" \"Terminator used for string type sequences.\"\n// @vt: #Y C1 PM \"Privacy Message\" \"\\x9E\" \"Start of a privacy message.\"\n// @vt: #Y C1 APC \"Application Program Command\" \"\\x9F\" \"Start of an APC sequence.\"\n// @vt: #Y C0 NUL \"Null\" \"\\0, \\x00\" \"NUL is ignored.\"\n// @vt: #Y C0 ESC \"Escape\" \"\\e, \\x1B\" \"Start of a sequence. Cancels any other sequence.\"\n\n/**\n * Document common VT features here that are currently unsupported\n */\n// @vt: #N DCS SIXEL \"SIXEL Graphics\" \"DCS Ps ; Ps ; Ps ; q \tPt ST\" \"Draw SIXEL image starting at cursor position.\"\n// @vt: #N OSC 1 \"Set Icon Name\" \"OSC 1 ; Pt BEL\" \"Set icon name.\"\n\n/**\n * Max length of the UTF32 input buffer. Real memory consumption is 4 times higher.\n */\nconst MAX_PARSEBUFFER_LENGTH = 131072;\n\n/**\n * Limit length of title and icon name stacks.\n */\nconst STACK_LIMIT = 10;\n\n// map params to window option\nfunction paramToWindowOption(n: number, opts: IWindowOptions): boolean {\n if (n > 24) {\n return opts.setWinLines || false;\n }\n switch (n) {\n case 1: return !!opts.restoreWin;\n case 2: return !!opts.minimizeWin;\n case 3: return !!opts.setWinPosition;\n case 4: return !!opts.setWinSizePixels;\n case 5: return !!opts.raiseWin;\n case 6: return !!opts.lowerWin;\n case 7: return !!opts.refreshWin;\n case 8: return !!opts.setWinSizeChars;\n case 9: return !!opts.maximizeWin;\n case 10: return !!opts.fullscreenWin;\n case 11: return !!opts.getWinState;\n case 13: return !!opts.getWinPosition;\n case 14: return !!opts.getWinSizePixels;\n case 15: return !!opts.getScreenSizePixels;\n case 16: return !!opts.getCellSizePixels;\n case 18: return !!opts.getWinSizeChars;\n case 19: return !!opts.getScreenSizeChars;\n case 20: return !!opts.getIconTitle;\n case 21: return !!opts.getWinTitle;\n case 22: return !!opts.pushTitle;\n case 23: return !!opts.popTitle;\n case 24: return !!opts.setWinLines;\n }\n return false;\n}\n\nexport enum WindowsOptionsReportType {\n GET_WIN_SIZE_PIXELS = 0,\n GET_CELL_SIZE_PIXELS = 1\n}\n\n/**\n * DCS subparser implementations\n */\n\n/**\n * DCS $ q Pt ST\n * DECRQSS (https://vt100.net/docs/vt510-rm/DECRQSS.html)\n * Request Status String (DECRQSS), VT420 and up.\n * Response: DECRPSS (https://vt100.net/docs/vt510-rm/DECRPSS.html)\n *\n * @vt: #P[See limited support below.] DCS DECRQSS \"Request Selection or Setting\" \"DCS $ q Pt ST\" \"Request several terminal settings.\"\n * Response is in the form `ESC P 1 $ r Pt ST` for valid requests, where `Pt` contains the corresponding CSI string,\n * `ESC P 0 ST` for invalid requests.\n *\n * Supported requests and responses:\n *\n * | Type | Request | Response (`Pt`) |\n * | -------------------------------- | ----------------- | ----------------------------------------------------- |\n * | Graphic Rendition (SGR) | `DCS $ q m ST` | always reporting `0m` (currently broken) |\n * | Top and Bottom Margins (DECSTBM) | `DCS $ q r ST` | `Ps ; Ps r` |\n * | Cursor Style (DECSCUSR) | `DCS $ q SP q ST` | `Ps SP q` |\n * | Protection Attribute (DECSCA) | `DCS $ q \" q ST` | always reporting `0 \" q` (DECSCA is unsupported) |\n * | Conformance Level (DECSCL) | `DCS $ q \" p ST` | always reporting `61 ; 1 \" p` (DECSCL is unsupported) |\n *\n *\n * TODO:\n * - fix SGR report\n * - either implement DECSCA or remove the report\n * - either check which conformance is better suited or remove the report completely\n * --> we are currently a mixture of all up to VT400 but dont follow anyone strictly\n */\nclass DECRQSS implements IDcsHandler {\n private _data: Uint32Array = new Uint32Array(0);\n\n constructor(\n private _bufferService: IBufferService,\n private _coreService: ICoreService,\n private _logService: ILogService,\n private _optionsService: IOptionsService\n ) { }\n\n public hook(params: IParams): void {\n this._data = new Uint32Array(0);\n }\n\n public put(data: Uint32Array, start: number, end: number): void {\n this._data = concat(this._data, data.subarray(start, end));\n }\n\n public unhook(success: boolean): void {\n if (!success) {\n this._data = new Uint32Array(0);\n return;\n }\n const data = utf32ToString(this._data);\n this._data = new Uint32Array(0);\n switch (data) {\n // valid: DCS 1 $ r Pt ST (xterm)\n case '\"q': // DECSCA\n return this._coreService.triggerDataEvent(`${C0.ESC}P1$r0\"q${C0.ESC}\\\\`);\n case '\"p': // DECSCL\n return this._coreService.triggerDataEvent(`${C0.ESC}P1$r61;1\"p${C0.ESC}\\\\`);\n case 'r': // DECSTBM\n const pt = '' + (this._bufferService.buffer.scrollTop + 1) +\n ';' + (this._bufferService.buffer.scrollBottom + 1) + 'r';\n return this._coreService.triggerDataEvent(`${C0.ESC}P1$r${pt}${C0.ESC}\\\\`);\n case 'm': // SGR\n // TODO: report real settings instead of 0m\n return this._coreService.triggerDataEvent(`${C0.ESC}P1$r0m${C0.ESC}\\\\`);\n case ' q': // DECSCUSR\n const STYLES: {[key: string]: number} = {'block': 2, 'underline': 4, 'bar': 6};\n let style = STYLES[this._optionsService.options.cursorStyle];\n style -= this._optionsService.options.cursorBlink ? 1 : 0;\n return this._coreService.triggerDataEvent(`${C0.ESC}P1$r${style} q${C0.ESC}\\\\`);\n default:\n // invalid: DCS 0 $ r Pt ST (xterm)\n this._logService.debug('Unknown DCS $q %s', data);\n this._coreService.triggerDataEvent(`${C0.ESC}P0$r${C0.ESC}\\\\`);\n }\n }\n}\n\n/**\n * DCS Ps; Ps| Pt ST\n * DECUDK (https://vt100.net/docs/vt510-rm/DECUDK.html)\n * not supported\n *\n * @vt: #N DCS DECUDK \"User Defined Keys\" \"DCS Ps ; Ps | Pt ST\" \"Definitions for user-defined keys.\"\n */\n\n/**\n * DCS + q Pt ST (xterm)\n * Request Terminfo String\n * not implemented\n *\n * @vt: #N DCS XTGETTCAP \"Request Terminfo String\" \"DCS + q Pt ST\" \"Request Terminfo String.\"\n */\n\n/**\n * DCS + p Pt ST (xterm)\n * Set Terminfo Data\n * not supported\n *\n * @vt: #N DCS XTSETTCAP \"Set Terminfo Data\" \"DCS + p Pt ST\" \"Set Terminfo Data.\"\n */\n\n\n\n/**\n * The terminal's standard implementation of IInputHandler, this handles all\n * input from the Parser.\n *\n * Refer to http://invisible-island.net/xterm/ctlseqs/ctlseqs.html to understand\n * each function's header comment.\n */\nexport class InputHandler extends Disposable implements IInputHandler {\n private _parseBuffer: Uint32Array = new Uint32Array(4096);\n private _stringDecoder: StringToUtf32 = new StringToUtf32();\n private _utf8Decoder: Utf8ToUtf32 = new Utf8ToUtf32();\n private _workCell: CellData = new CellData();\n private _windowTitle = '';\n private _iconName = '';\n protected _windowTitleStack: string[] = [];\n protected _iconNameStack: string[] = [];\n\n private _curAttrData: IAttributeData = DEFAULT_ATTR_DATA.clone();\n private _eraseAttrDataInternal: IAttributeData = DEFAULT_ATTR_DATA.clone();\n\n private _onRequestBell = new EventEmitter<void>();\n public get onRequestBell(): IEvent<void> { return this._onRequestBell.event; }\n private _onRequestRefreshRows = new EventEmitter<number, number>();\n public get onRequestRefreshRows(): IEvent<number, number> { return this._onRequestRefreshRows.event; }\n private _onRequestReset = new EventEmitter<void>();\n public get onRequestReset(): IEvent<void> { return this._onRequestReset.event; }\n private _onRequestScroll = new EventEmitter<IAttributeData, boolean | void>();\n public get onRequestScroll(): IEvent<IAttributeData, boolean | void> { return this._onRequestScroll.event; }\n private _onRequestSyncScrollBar = new EventEmitter<void>();\n public get onRequestSyncScrollBar(): IEvent<void> { return this._onRequestSyncScrollBar.event; }\n private _onRequestWindowsOptionsReport = new EventEmitter<WindowsOptionsReportType>();\n public get onRequestWindowsOptionsReport(): IEvent<WindowsOptionsReportType> { return this._onRequestWindowsOptionsReport.event; }\n\n private _onA11yChar = new EventEmitter<string>();\n public get onA11yChar(): IEvent<string> { return this._onA11yChar.event; }\n private _onA11yTab = new EventEmitter<number>();\n public get onA11yTab(): IEvent<number> { return this._onA11yTab.event; }\n private _onCursorMove = new EventEmitter<void>();\n public get onCursorMove(): IEvent<void> { return this._onCursorMove.event; }\n private _onLineFeed = new EventEmitter<void>();\n public get onLineFeed(): IEvent<void> { return this._onLineFeed.event; }\n private _onScroll = new EventEmitter<number>();\n public get onScroll(): IEvent<number> { return this._onScroll.event; }\n private _onTitleChange = new EventEmitter<string>();\n public get onTitleChange(): IEvent<string> { return this._onTitleChange.event; }\n\n constructor(\n private readonly _bufferService: IBufferService,\n private readonly _charsetService: ICharsetService,\n private readonly _coreService: ICoreService,\n private readonly _dirtyRowService: IDirtyRowService,\n private readonly _logService: ILogService,\n private readonly _optionsService: IOptionsService,\n private readonly _coreMouseService: ICoreMouseService,\n private readonly _unicodeService: IUnicodeService,\n private readonly _parser: IEscapeSequenceParser = new EscapeSequenceParser()\n ) {\n super();\n this.register(this._parser);\n\n /**\n * custom fallback handlers\n */\n this._parser.setCsiHandlerFallback((ident, params) => {\n this._logService.debug('Unknown CSI code: ', { identifier: this._parser.identToString(ident), params: params.toArray() });\n });\n this._parser.setEscHandlerFallback(ident => {\n this._logService.debug('Unknown ESC code: ', { identifier: this._parser.identToString(ident) });\n });\n this._parser.setExecuteHandlerFallback(code => {\n this._logService.debug('Unknown EXECUTE code: ', { code });\n });\n this._parser.setOscHandlerFallback((identifier, action, data) => {\n this._logService.debug('Unknown OSC code: ', { identifier, action, data });\n });\n this._parser.setDcsHandlerFallback((ident, action, payload) => {\n if (action === 'HOOK') {\n payload = payload.toArray();\n }\n this._logService.debug('Unknown DCS code: ', { identifier: this._parser.identToString(ident), action, payload });\n });\n\n /**\n * print handler\n */\n this._parser.setPrintHandler((data, start, end) => this.print(data, start, end));\n\n /**\n * CSI handler\n */\n this._parser.setCsiHandler({final: '@'}, params => this.insertChars(params));\n this._parser.setCsiHandler({intermediates: ' ', final: '@'}, params => this.scrollLeft(params));\n this._parser.setCsiHandler({final: 'A'}, params => this.cursorUp(params));\n this._parser.setCsiHandler({intermediates: ' ', final: 'A'}, params => this.scrollRight(params));\n this._parser.setCsiHandler({final: 'B'}, params => this.cursorDown(params));\n this._parser.setCsiHandler({final: 'C'}, params => this.cursorForward(params));\n this._parser.setCsiHandler({final: 'D'}, params => this.cursorBackward(params));\n this._parser.setCsiHandler({final: 'E'}, params => this.cursorNextLine(params));\n this._parser.setCsiHandler({final: 'F'}, params => this.cursorPrecedingLine(params));\n this._parser.setCsiHandler({final: 'G'}, params => this.cursorCharAbsolute(params));\n this._parser.setCsiHandler({final: 'H'}, params => this.cursorPosition(params));\n this._parser.setCsiHandler({final: 'I'}, params => this.cursorForwardTab(params));\n this._parser.setCsiHandler({final: 'J'}, params => this.eraseInDisplay(params));\n this._parser.setCsiHandler({prefix: '?', final: 'J'}, params => this.eraseInDisplay(params));\n this._parser.setCsiHandler({final: 'K'}, params => this.eraseInLine(params));\n this._parser.setCsiHandler({prefix: '?', final: 'K'}, params => this.eraseInLine(params));\n this._parser.setCsiHandler({final: 'L'}, params => this.insertLines(params));\n this._parser.setCsiHandler({final: 'M'}, params => this.deleteLines(params));\n this._parser.setCsiHandler({final: 'P'}, params => this.deleteChars(params));\n this._parser.setCsiHandler({final: 'S'}, params => this.scrollUp(params));\n this._parser.setCsiHandler({final: 'T'}, params => this.scrollDown(params));\n this._parser.setCsiHandler({final: 'X'}, params => this.eraseChars(params));\n this._parser.setCsiHandler({final: 'Z'}, params => this.cursorBackwardTab(params));\n this._parser.setCsiHandler({final: '`'}, params => this.charPosAbsolute(params));\n this._parser.setCsiHandler({final: 'a'}, params => this.hPositionRelative(params));\n this._parser.setCsiHandler({final: 'b'}, params => this.repeatPrecedingCharacter(params));\n this._parser.setCsiHandler({final: 'c'}, params => this.sendDeviceAttributesPrimary(params));\n this._parser.setCsiHandler({prefix: '>', final: 'c'}, params => this.sendDeviceAttributesSecondary(params));\n this._parser.setCsiHandler({final: 'd'}, params => this.linePosAbsolute(params));\n this._parser.setCsiHandler({final: 'e'}, params => this.vPositionRelative(params));\n this._parser.setCsiHandler({final: 'f'}, params => this.hVPosition(params));\n this._parser.setCsiHandler({final: 'g'}, params => this.tabClear(params));\n this._parser.setCsiHandler({final: 'h'}, params => this.setMode(params));\n this._parser.setCsiHandler({prefix: '?', final: 'h'}, params => this.setModePrivate(params));\n this._parser.setCsiHandler({final: 'l'}, params => this.resetMode(params));\n this._parser.setCsiHandler({prefix: '?', final: 'l'}, params => this.resetModePrivate(params));\n this._parser.setCsiHandler({final: 'm'}, params => this.charAttributes(params));\n this._parser.setCsiHandler({final: 'n'}, params => this.deviceStatus(params));\n this._parser.setCsiHandler({prefix: '?', final: 'n'}, params => this.deviceStatusPrivate(params));\n this._parser.setCsiHandler({intermediates: '!', final: 'p'}, params => this.softReset(params));\n this._parser.setCsiHandler({intermediates: ' ', final: 'q'}, params => this.setCursorStyle(params));\n this._parser.setCsiHandler({final: 'r'}, params => this.setScrollRegion(params));\n this._parser.setCsiHandler({final: 's'}, params => this.saveCursor(params));\n this._parser.setCsiHandler({final: 't'}, params => this.windowOptions(params));\n this._parser.setCsiHandler({final: 'u'}, params => this.restoreCursor(params));\n this._parser.setCsiHandler({intermediates: '\\'', final: '}'}, params => this.insertColumns(params));\n this._parser.setCsiHandler({intermediates: '\\'', final: '~'}, params => this.deleteColumns(params));\n\n /**\n * execute handler\n */\n this._parser.setExecuteHandler(C0.BEL, () => this.bell());\n this._parser.setExecuteHandler(C0.LF, () => this.lineFeed());\n this._parser.setExecuteHandler(C0.VT, () => this.lineFeed());\n this._parser.setExecuteHandler(C0.FF, () => this.lineFeed());\n this._parser.setExecuteHandler(C0.CR, () => this.carriageReturn());\n this._parser.setExecuteHandler(C0.BS, () => this.backspace());\n this._parser.setExecuteHandler(C0.HT, () => this.tab());\n this._parser.setExecuteHandler(C0.SO, () => this.shiftOut());\n this._parser.setExecuteHandler(C0.SI, () => this.shiftIn());\n // FIXME: What do to with missing? Old code just added those to print.\n\n this._parser.setExecuteHandler(C1.IND, () => this.index());\n this._parser.setExecuteHandler(C1.NEL, () => this.nextLine());\n this._parser.setExecuteHandler(C1.HTS, () => this.tabSet());\n\n /**\n * OSC handler\n */\n // 0 - icon name + title\n this._parser.setOscHandler(0, new OscHandler((data: string) => { this.setTitle(data); this.setIconName(data); }));\n // 1 - icon name\n this._parser.setOscHandler(1, new OscHandler((data: string) => this.setIconName(data)));\n // 2 - title\n this._parser.setOscHandler(2, new OscHandler((data: string) => this.setTitle(data)));\n // 3 - set property X in the form \"prop=value\"\n // 4 - Change Color Number\n // 5 - Change Special Color Number\n // 6 - Enable/disable Special Color Number c\n // 7 - current directory? (not in xterm spec, see https://gitlab.com/gnachman/iterm2/issues/3939)\n // 10 - Change VT100 text foreground color to Pt.\n // 11 - Change VT100 text background color to Pt.\n // 12 - Change text cursor color to Pt.\n // 13 - Change mouse foreground color to Pt.\n // 14 - Change mouse background color to Pt.\n // 15 - Change Tektronix foreground color to Pt.\n // 16 - Change Tektronix background color to Pt.\n // 17 - Change highlight background color to Pt.\n // 18 - Change Tektronix cursor color to Pt.\n // 19 - Change highlight foreground color to Pt.\n // 46 - Change Log File to Pt.\n // 50 - Set Font to Pt.\n // 51 - reserved for Emacs shell.\n // 52 - Manipulate Selection Data.\n // 104 ; c - Reset Color Number c.\n // 105 ; c - Reset Special Color Number c.\n // 106 ; c; f - Enable/disable Special Color Number c.\n // 110 - Reset VT100 text foreground color.\n // 111 - Reset VT100 text background color.\n // 112 - Reset text cursor color.\n // 113 - Reset mouse foreground color.\n // 114 - Reset mouse background color.\n // 115 - Reset Tektronix foreground color.\n // 116 - Reset Tektronix background color.\n // 117 - Reset highlight color.\n // 118 - Reset Tektronix cursor color.\n // 119 - Reset highlight foreground color.\n\n /**\n * ESC handlers\n */\n this._parser.setEscHandler({final: '7'}, () => this.saveCursor());\n this._parser.setEscHandler({final: '8'}, () => this.restoreCursor());\n this._parser.setEscHandler({final: 'D'}, () => this.index());\n this._parser.setEscHandler({final: 'E'}, () => this.nextLine());\n this._parser.setEscHandler({final: 'H'}, () => this.tabSet());\n this._parser.setEscHandler({final: 'M'}, () => this.reverseIndex());\n this._parser.setEscHandler({final: '='}, () => this.keypadApplicationMode());\n this._parser.setEscHandler({final: '>'}, () => this.keypadNumericMode());\n this._parser.setEscHandler({final: 'c'}, () => this.fullReset());\n this._parser.setEscHandler({final: 'n'}, () => this.setgLevel(2));\n this._parser.setEscHandler({final: 'o'}, () => this.setgLevel(3));\n this._parser.setEscHandler({final: '|'}, () => this.setgLevel(3));\n this._parser.setEscHandler({final: '}'}, () => this.setgLevel(2));\n this._parser.setEscHandler({final: '~'}, () => this.setgLevel(1));\n this._parser.setEscHandler({intermediates: '%', final: '@'}, () => this.selectDefaultCharset());\n this._parser.setEscHandler({intermediates: '%', final: 'G'}, () => this.selectDefaultCharset());\n for (const flag in CHARSETS) {\n this._parser.setEscHandler({intermediates: '(', final: flag}, () => this.selectCharset('(' + flag));\n this._parser.setEscHandler({intermediates: ')', final: flag}, () => this.selectCharset(')' + flag));\n this._parser.setEscHandler({intermediates: '*', final: flag}, () => this.selectCharset('*' + flag));\n this._parser.setEscHandler({intermediates: '+', final: flag}, () => this.selectCharset('+' + flag));\n this._parser.setEscHandler({intermediates: '-', final: flag}, () => this.selectCharset('-' + flag));\n this._parser.setEscHandler({intermediates: '.', final: flag}, () => this.selectCharset('.' + flag));\n this._parser.setEscHandler({intermediates: '/', final: flag}, () => this.selectCharset('/' + flag)); // TODO: supported?\n }\n this._parser.setEscHandler({intermediates: '#', final: '8'}, () => this.screenAlignmentPattern());\n\n /**\n * error handler\n */\n this._parser.setErrorHandler((state: IParsingState) => {\n this._logService.error('Parsing error: ', state);\n return state;\n });\n\n /**\n * DCS handler\n */\n this._parser.setDcsHandler({intermediates: '$', final: 'q'}, new DECRQSS(this._bufferService, this._coreService, this._logService, this._optionsService));\n }\n\n public dispose(): void {\n super.dispose();\n }\n\n public parse(data: string | Uint8Array): void {\n let buffer = this._bufferService.buffer;\n const cursorStartX = buffer.x;\n const cursorStartY = buffer.y;\n\n this._logService.debug('parsing data', data);\n\n // resize input buffer if needed\n if (this._parseBuffer.length < data.length) {\n if (this._parseBuffer.length < MAX_PARSEBUFFER_LENGTH) {\n this._parseBuffer = new Uint32Array(Math.min(data.length, MAX_PARSEBUFFER_LENGTH));\n }\n }\n\n // Clear the dirty row service so we know which lines changed as a result of parsing\n this._dirtyRowService.clearRange();\n\n // process big data in smaller chunks\n if (data.length > MAX_PARSEBUFFER_LENGTH) {\n for (let i = 0; i < data.length; i += MAX_PARSEBUFFER_LENGTH) {\n const end = i + MAX_PARSEBUFFER_LENGTH < data.length ? i + MAX_PARSEBUFFER_LENGTH : data.length;\n const len = (typeof data === 'string')\n ? this._stringDecoder.decode(data.substring(i, end), this._parseBuffer)\n : this._utf8Decoder.decode(data.subarray(i, end), this._parseBuffer);\n this._parser.parse(this._parseBuffer, len);\n }\n } else {\n const len = (typeof data === 'string')\n ? this._stringDecoder.decode(data, this._parseBuffer)\n : this._utf8Decoder.decode(data, this._parseBuffer);\n this._parser.parse(this._parseBuffer, len);\n }\n\n buffer = this._bufferService.buffer;\n if (buffer.x !== cursorStartX || buffer.y !== cursorStartY) {\n this._onCursorMove.fire();\n }\n\n // Refresh any dirty rows accumulated as part of parsing\n this._onRequestRefreshRows.fire(this._dirtyRowService.start, this._dirtyRowService.end);\n }\n\n public print(data: Uint32Array, start: number, end: number): void {\n let code: number;\n let chWidth: number;\n const buffer = this._bufferService.buffer;\n const charset = this._charsetService.charset;\n const screenReaderMode = this._optionsService.options.screenReaderMode;\n const cols = this._bufferService.cols;\n const wraparoundMode = this._coreService.decPrivateModes.wraparound;\n const insertMode = this._coreService.modes.insertMode;\n const curAttr = this._curAttrData;\n let bufferRow = buffer.lines.get(buffer.ybase + buffer.y)!;\n\n this._dirtyRowService.markDirty(buffer.y);\n\n // handle wide chars: reset start_cell-1 if we would overwrite the second cell of a wide char\n if (buffer.x && end - start > 0 && bufferRow.getWidth(buffer.x - 1) === 2) {\n bufferRow.setCellFromCodePoint(buffer.x - 1, 0, 1, curAttr.fg, curAttr.bg, curAttr.extended);\n }\n\n for (let pos = start; pos < end; ++pos) {\n code = data[pos];\n\n // calculate print space\n // expensive call, therefore we save width in line buffer\n chWidth = this._unicodeService.wcwidth(code);\n\n // get charset replacement character\n // charset is only defined for ASCII, therefore we only\n // search for an replacement char if code < 127\n if (code < 127 && charset) {\n const ch = charset[String.fromCharCode(code)];\n if (ch) {\n code = ch.charCodeAt(0);\n }\n }\n\n if (screenReaderMode) {\n this._onA11yChar.fire(stringFromCodePoint(code));\n }\n\n // insert combining char at last cursor position\n // buffer.x should never be 0 for a combining char\n // since they always follow a cell consuming char\n // therefore we can test for buffer.x to avoid overflow left\n if (!chWidth && buffer.x) {\n if (!bufferRow.getWidth(buffer.x - 1)) {\n // found empty cell after fullwidth, need to go 2 cells back\n // it is save to step 2 cells back here\n // since an empty cell is only set by fullwidth chars\n bufferRow.addCodepointToCell(buffer.x - 2, code);\n } else {\n bufferRow.addCodepointToCell(buffer.x - 1, code);\n }\n continue;\n }\n\n // goto next line if ch would overflow\n // NOTE: To avoid costly width checks here,\n // the terminal does not allow a cols < 2.\n if (buffer.x + chWidth - 1 >= cols) {\n // autowrap - DECAWM\n // automatically wraps to the beginning of the next line\n if (wraparoundMode) {\n // clear left over cells to the right\n while (buffer.x < cols) {\n bufferRow.setCellFromCodePoint(buffer.x++, 0, 1, curAttr.fg, curAttr.bg, curAttr.extended);\n }\n buffer.x = 0;\n buffer.y++;\n if (buffer.y === buffer.scrollBottom + 1) {\n buffer.y--;\n this._onRequestScroll.fire(this._eraseAttrData(), true);\n } else {\n if (buffer.y >= this._bufferService.rows) {\n buffer.y = this._bufferService.rows - 1;\n }\n // The line already exists (eg. the initial viewport), mark it as a\n // wrapped line\n buffer.lines.get(buffer.ybase + buffer.y)!.isWrapped = true;\n }\n // row changed, get it again\n bufferRow = buffer.lines.get(buffer.ybase + buffer.y)!;\n } else {\n buffer.x = cols - 1;\n if (chWidth === 2) {\n // FIXME: check for xterm behavior\n // What to do here? We got a wide char that does not fit into last cell\n continue;\n }\n }\n }\n\n // insert mode: move characters to right\n if (insertMode) {\n // right shift cells according to the width\n bufferRow.insertCells(buffer.x, chWidth, buffer.getNullCell(curAttr), curAttr);\n // test last cell - since the last cell has only room for\n // a halfwidth char any fullwidth shifted there is lost\n // and will be set to empty cell\n if (bufferRow.getWidth(cols - 1) === 2) {\n bufferRow.setCellFromCodePoint(cols - 1, NULL_CELL_CODE, NULL_CELL_WIDTH, curAttr.fg, curAttr.bg, curAttr.extended);\n }\n }\n\n // write current char to buffer and advance cursor\n bufferRow.setCellFromCodePoint(buffer.x++, code, chWidth, curAttr.fg, curAttr.bg, curAttr.extended);\n\n // fullwidth char - also set next cell to placeholder stub and advance cursor\n // for graphemes bigger than fullwidth we can simply loop to zero\n // we already made sure above, that buffer.x + chWidth will not overflow right\n if (chWidth > 0) {\n while (--chWidth) {\n // other than a regular empty cell a cell following a wide char has no width\n bufferRow.setCellFromCodePoint(buffer.x++, 0, 0, curAttr.fg, curAttr.bg, curAttr.extended);\n }\n }\n }\n // store last char in Parser.precedingCodepoint for REP to work correctly\n // This needs to check whether:\n // - fullwidth + surrogates: reset\n // - combining: only base char gets carried on (bug in xterm?)\n if (end - start > 0) {\n bufferRow.loadCell(buffer.x - 1, this._workCell);\n if (this._workCell.getWidth() === 2 || this._workCell.getCode() > 0xFFFF) {\n this._parser.precedingCodepoint = 0;\n } else if (this._workCell.isCombined()) {\n this._parser.precedingCodepoint = this._workCell.getChars().charCodeAt(0);\n } else {\n this._parser.precedingCodepoint = this._workCell.content;\n }\n }\n\n // handle wide chars: reset cell to the right if it is second cell of a wide char\n if (buffer.x < cols && end - start > 0 && bufferRow.getWidth(buffer.x) === 0 && !bufferRow.hasContent(buffer.x)) {\n bufferRow.setCellFromCodePoint(buffer.x, 0, 1, curAttr.fg, curAttr.bg, curAttr.extended);\n }\n\n this._dirtyRowService.markDirty(buffer.y);\n }\n\n /**\n * Forward addCsiHandler from parser.\n */\n public addCsiHandler(id: IFunctionIdentifier, callback: (params: IParams) => boolean): IDisposable {\n if (id.final === 't' && !id.prefix && !id.intermediates) {\n // security: always check whether window option is allowed\n return this._parser.addCsiHandler(id, params => {\n if (!paramToWindowOption(params.params[0], this._optionsService.options.windowOptions)) {\n return true;\n }\n return callback(params);\n });\n }\n return this._parser.addCsiHandler(id, callback);\n }\n\n /**\n * Forward addDcsHandler from parser.\n */\n public addDcsHandler(id: IFunctionIdentifier, callback: (data: string, param: IParams) => boolean): IDisposable {\n return this._parser.addDcsHandler(id, new DcsHandler(callback));\n }\n\n /**\n * Forward addEscHandler from parser.\n */\n public addEscHandler(id: IFunctionIdentifier, callback: () => boolean): IDisposable {\n return this._parser.addEscHandler(id, callback);\n }\n\n /**\n * Forward addOscHandler from parser.\n */\n public addOscHandler(ident: number, callback: (data: string) => boolean): IDisposable {\n return this._parser.addOscHandler(ident, new OscHandler(callback));\n }\n\n /**\n * BEL\n * Bell (Ctrl-G).\n *\n * @vt: #Y C0 BEL \"Bell\" \"\\a, \\x07\" \"Ring the bell.\"\n * The behavior of the bell is further customizable with `ITerminalOptions.bellStyle`\n * and `ITerminalOptions.bellSound`.\n */\n public bell(): void {\n this._onRequestBell.fire();\n }\n\n /**\n * LF\n * Line Feed or New Line (NL). (LF is Ctrl-J).\n *\n * @vt: #Y C0 LF \"Line Feed\" \"\\n, \\x0A\" \"Move the cursor one row down, scrolling if needed.\"\n * Scrolling is restricted to scroll margins and will only happen on the bottom line.\n *\n * @vt: #Y C0 VT \"Vertical Tabulation\" \"\\v, \\x0B\" \"Treated as LF.\"\n * @vt: #Y C0 FF \"Form Feed\" \"\\f, \\x0C\" \"Treated as LF.\"\n */\n public lineFeed(): void {\n // make buffer local for faster access\n const buffer = this._bufferService.buffer;\n\n this._dirtyRowService.markDirty(buffer.y);\n if (this._optionsService.options.convertEol) {\n buffer.x = 0;\n }\n buffer.y++;\n if (buffer.y === buffer.scrollBottom + 1) {\n buffer.y--;\n this._onRequestScroll.fire(this._eraseAttrData());\n } else if (buffer.y >= this._bufferService.rows) {\n buffer.y = this._bufferService.rows - 1;\n }\n // If the end of the line is hit, prevent this action from wrapping around to the next line.\n if (buffer.x >= this._bufferService.cols) {\n buffer.x--;\n }\n this._dirtyRowService.markDirty(buffer.y);\n\n this._onLineFeed.fire();\n }\n\n /**\n * CR\n * Carriage Return (Ctrl-M).\n *\n * @vt: #Y C0 CR \"Carriage Return\" \"\\r, \\x0D\" \"Move the cursor to the beginning of the row.\"\n */\n public carriageReturn(): void {\n this._bufferService.buffer.x = 0;\n }\n\n /**\n * BS\n * Backspace (Ctrl-H).\n *\n * @vt: #Y C0 BS \"Backspace\" \"\\b, \\x08\" \"Move the cursor one position to the left.\"\n * By default it is not possible to move the cursor past the leftmost position.\n * If `reverse wrap-around` (`CSI ? 45 h`) is set, a previous soft line wrap (DECAWM)\n * can be undone with BS within the scroll margins. In that case the cursor will wrap back\n * to the end of the previous row. Note that it is not possible to peek back into the scrollbuffer\n * with the cursor, thus at the home position (top-leftmost cell) this has no effect.\n */\n public backspace(): void {\n const buffer = this._bufferService.buffer;\n\n // reverse wrap-around is disabled\n if (!this._coreService.decPrivateModes.reverseWraparound) {\n this._restrictCursor();\n if (buffer.x > 0) {\n buffer.x--;\n }\n return;\n }\n\n // reverse wrap-around is enabled\n // other than for normal operation mode, reverse wrap-around allows the cursor\n // to be at x=cols to be able to address the last cell of a row by BS\n this._restrictCursor(this._bufferService.cols);\n\n if (buffer.x > 0) {\n buffer.x--;\n } else {\n /**\n * reverse wrap-around handling:\n * Our implementation deviates from xterm on purpose. Details:\n * - only previous soft NLs can be reversed (isWrapped=true)\n * - only works within scrollborders (top/bottom, left/right not yet supported)\n * - cannot peek into scrollbuffer\n * - any cursor movement sequence keeps working as expected\n */\n if (buffer.x === 0\n && buffer.y > buffer.scrollTop\n && buffer.y <= buffer.scrollBottom\n && buffer.lines.get(buffer.ybase + buffer.y)?.isWrapped)\n {\n buffer.lines.get(buffer.ybase + buffer.y)!.isWrapped = false;\n buffer.y--;\n buffer.x = this._bufferService.cols - 1;\n // find last taken cell - last cell can have 3 different states:\n // - hasContent(true) + hasWidth(1): narrow char - we are done\n // - hasWidth(0): second part of wide char - we are done\n // - hasContent(false) + hasWidth(1): empty cell due to early wrapping wide char, go one cell further back\n const line = buffer.lines.get(buffer.ybase + buffer.y)!;\n if (line.hasWidth(buffer.x) && !line.hasContent(buffer.x)) {\n buffer.x--;\n // We do this only once, since width=1 + hasContent=false currently happens only once before\n // early wrapping of a wide char.\n // This needs to be fixed once we support graphemes taking more than 2 cells.\n }\n }\n }\n this._restrictCursor();\n }\n\n /**\n * TAB\n * Horizontal Tab (HT) (Ctrl-I).\n *\n * @vt: #Y C0 HT \"Horizontal Tabulation\" \"\\t, \\x09\" \"Move the cursor to the next character tab stop.\"\n */\n public tab(): void {\n if (this._bufferService.buffer.x >= this._bufferService.cols) {\n return;\n }\n const originalX = this._bufferService.buffer.x;\n this._bufferService.buffer.x = this._bufferService.buffer.nextStop();\n if (this._optionsService.options.screenReaderMode) {\n this._onA11yTab.fire(this._bufferService.buffer.x - originalX);\n }\n }\n\n /**\n * SO\n * Shift Out (Ctrl-N) -> Switch to Alternate Character Set. This invokes the\n * G1 character set.\n *\n * @vt: #P[Only limited ISO-2022 charset support.] C0 SO \"Shift Out\" \"\\x0E\" \"Switch to an alternative character set.\"\n */\n public shiftOut(): void {\n this._charsetService.setgLevel(1);\n }\n\n /**\n * SI\n * Shift In (Ctrl-O) -> Switch to Standard Character Set. This invokes the G0\n * character set (the default).\n *\n * @vt: #Y C0 SI \"Shift In\" \"\\x0F\" \"Return to regular character set after Shift Out.\"\n */\n public shiftIn(): void {\n this._charsetService.setgLevel(0);\n }\n\n /**\n * Restrict cursor to viewport size / scroll margin (origin mode).\n */\n private _restrictCursor(maxCol: number = this._bufferService.cols - 1): void {\n this._bufferService.buffer.x = Math.min(maxCol, Math.max(0, this._bufferService.buffer.x));\n this._bufferService.buffer.y = this._coreService.decPrivateModes.origin\n ? Math.min(this._bufferService.buffer.scrollBottom, Math.max(this._bufferService.buffer.scrollTop, this._bufferService.buffer.y))\n : Math.min(this._bufferService.rows - 1, Math.max(0, this._bufferService.buffer.y));\n this._dirtyRowService.markDirty(this._bufferService.buffer.y);\n }\n\n /**\n * Set absolute cursor position.\n */\n private _setCursor(x: number, y: number): void {\n this._dirtyRowService.markDirty(this._bufferService.buffer.y);\n if (this._coreService.decPrivateModes.origin) {\n this._bufferService.buffer.x = x;\n this._bufferService.buffer.y = this._bufferService.buffer.scrollTop + y;\n } else {\n this._bufferService.buffer.x = x;\n this._bufferService.buffer.y = y;\n }\n this._restrictCursor();\n this._dirtyRowService.markDirty(this._bufferService.buffer.y);\n }\n\n /**\n * Set relative cursor position.\n */\n private _moveCursor(x: number, y: number): void {\n // for relative changes we have to make sure we are within 0 .. cols/rows - 1\n // before calculating the new position\n this._restrictCursor();\n this._setCursor(this._bufferService.buffer.x + x, this._bufferService.buffer.y + y);\n }\n\n /**\n * CSI Ps A\n * Cursor Up Ps Times (default = 1) (CUU).\n *\n * @vt: #Y CSI CUU \"Cursor Up\" \"CSI Ps A\" \"Move cursor `Ps` times up (default=1).\"\n * If the cursor would pass the top scroll margin, it will stop there.\n */\n public cursorUp(params: IParams): void {\n // stop at scrollTop\n const diffToTop = this._bufferService.buffer.y - this._bufferService.buffer.scrollTop;\n if (diffToTop >= 0) {\n this._moveCursor(0, -Math.min(diffToTop, params.params[0] || 1));\n } else {\n this._moveCursor(0, -(params.params[0] || 1));\n }\n }\n\n /**\n * CSI Ps B\n * Cursor Down Ps Times (default = 1) (CUD).\n *\n * @vt: #Y CSI CUD \"Cursor Down\" \"CSI Ps B\" \"Move cursor `Ps` times down (default=1).\"\n * If the cursor would pass the bottom scroll margin, it will stop there.\n */\n public cursorDown(params: IParams): void {\n // stop at scrollBottom\n const diffToBottom = this._bufferService.buffer.scrollBottom - this._bufferService.buffer.y;\n if (diffToBottom >= 0) {\n this._moveCursor(0, Math.min(diffToBottom, params.params[0] || 1));\n } else {\n this._moveCursor(0, params.params[0] || 1);\n }\n }\n\n /**\n * CSI Ps C\n * Cursor Forward Ps Times (default = 1) (CUF).\n *\n * @vt: #Y CSI CUF \"Cursor Forward\" \"CSI Ps C\" \"Move cursor `Ps` times forward (default=1).\"\n */\n public cursorForward(params: IParams): void {\n this._moveCursor(params.params[0] || 1, 0);\n }\n\n /**\n * CSI Ps D\n * Cursor Backward Ps Times (default = 1) (CUB).\n *\n * @vt: #Y CSI CUB \"Cursor Backward\" \"CSI Ps D\" \"Move cursor `Ps` times backward (default=1).\"\n */\n public cursorBackward(params: IParams): void {\n this._moveCursor(-(params.params[0] || 1), 0);\n }\n\n /**\n * CSI Ps E\n * Cursor Next Line Ps Times (default = 1) (CNL).\n * Other than cursorDown (CUD) also set the cursor to first column.\n *\n * @vt: #Y CSI CNL \"Cursor Next Line\" \"CSI Ps E\" \"Move cursor `Ps` times down (default=1) and to the first column.\"\n * Same as CUD, additionally places the cursor at the first column.\n */\n public cursorNextLine(params: IParams): void {\n this.cursorDown(params);\n this._bufferService.buffer.x = 0;\n }\n\n /**\n * CSI Ps F\n * Cursor Previous Line Ps Times (default = 1) (CPL).\n * Other than cursorUp (CUU) also set the cursor to first column.\n *\n * @vt: #Y CSI CPL \"Cursor Backward\" \"CSI Ps F\" \"Move cursor `Ps` times up (default=1) and to the first column.\"\n * Same as CUU, additionally places the cursor at the first column.\n */\n public cursorPrecedingLine(params: IParams): void {\n this.cursorUp(params);\n this._bufferService.buffer.x = 0;\n }\n\n /**\n * CSI Ps G\n * Cursor Character Absolute [column] (default = [row,1]) (CHA).\n *\n * @vt: #Y CSI CHA \"Cursor Horizontal Absolute\" \"CSI Ps G\" \"Move cursor to `Ps`-th column of the active row (default=1).\"\n */\n public cursorCharAbsolute(params: IParams): void {\n this._setCursor((params.params[0] || 1) - 1, this._bufferService.buffer.y);\n }\n\n /**\n * CSI Ps ; Ps H\n * Cursor Position [row;column] (default = [1,1]) (CUP).\n *\n * @vt: #Y CSI CUP \"Cursor Position\" \"CSI Ps ; Ps H\" \"Set cursor to position [`Ps`, `Ps`] (default = [1, 1]).\"\n * If ORIGIN mode is set, places the cursor to the absolute position within the scroll margins.\n * If ORIGIN mode is not set, places the cursor to the absolute position within the viewport.\n * Note that the coordinates are 1-based, thus the top left position starts at `1 ; 1`.\n */\n public cursorPosition(params: IParams): void {\n this._setCursor(\n // col\n (params.length >= 2) ? (params.params[1] || 1) - 1 : 0,\n // row\n (params.params[0] || 1) - 1);\n }\n\n /**\n * CSI Pm ` Character Position Absolute\n * [column] (default = [row,1]) (HPA).\n * Currently same functionality as CHA.\n *\n * @vt: #Y CSI HPA \"Horizontal Position Absolute\" \"CSI Ps ` \" \"Same as CHA.\"\n */\n public charPosAbsolute(params: IParams): void {\n this._setCursor((params.params[0] || 1) - 1, this._bufferService.buffer.y);\n }\n\n /**\n * CSI Pm a Character Position Relative\n * [columns] (default = [row,col+1]) (HPR)\n *\n * @vt: #Y CSI HPR \"Horizontal Position Relative\" \"CSI Ps a\" \"Same as CUF.\"\n */\n public hPositionRelative(params: IParams): void {\n this._moveCursor(params.params[0] || 1, 0);\n }\n\n /**\n * CSI Pm d Vertical Position Absolute (VPA)\n * [row] (default = [1,column])\n *\n * @vt: #Y CSI VPA \"Vertical Position Absolute\" \"CSI Ps d\" \"Move cursor to `Ps`-th row (default=1).\"\n */\n public linePosAbsolute(params: IParams): void {\n this._setCursor(this._bufferService.buffer.x, (params.params[0] || 1) - 1);\n }\n\n /**\n * CSI Pm e Vertical Position Relative (VPR)\n * [rows] (default = [row+1,column])\n * reuse CSI Ps B ?\n *\n * @vt: #Y CSI VPR \"Vertical Position Relative\" \"CSI Ps e\" \"Move cursor `Ps` times down (default=1).\"\n */\n public vPositionRelative(params: IParams): void {\n this._moveCursor(0, params.params[0] || 1);\n }\n\n /**\n * CSI Ps ; Ps f\n * Horizontal and Vertical Position [row;column] (default =\n * [1,1]) (HVP).\n * Same as CUP.\n *\n * @vt: #Y CSI HVP \"Horizontal and Vertical Position\" \"CSI Ps ; Ps f\" \"Same as CUP.\"\n */\n public hVPosition(params: IParams): void {\n this.cursorPosition(params);\n }\n\n /**\n * CSI Ps g Tab Clear (TBC).\n * Ps = 0 -> Clear Current Column (default).\n * Ps = 3 -> Clear All.\n * Potentially:\n * Ps = 2 -> Clear Stops on Line.\n * http://vt100.net/annarbor/aaa-ug/section6.html\n *\n * @vt: #Y CSI TBC \"Tab Clear\" \"CSI Ps g\" \"Clear tab stops at current position (0) or all (3) (default=0).\"\n * Clearing tabstops off the active row (Ps = 2, VT100) is currently not supported.\n */\n public tabClear(params: IParams): void {\n const param = params.params[0];\n if (param === 0) {\n delete this._bufferService.buffer.tabs[this._bufferService.buffer.x];\n } else if (param === 3) {\n this._bufferService.buffer.tabs = {};\n }\n }\n\n /**\n * CSI Ps I\n * Cursor Forward Tabulation Ps tab stops (default = 1) (CHT).\n *\n * @vt: #Y CSI CHT \"Cursor Horizontal Tabulation\" \"CSI Ps I\" \"Move cursor `Ps` times tabs forward (default=1).\"\n */\n public cursorForwardTab(params: IParams): void {\n if (this._bufferService.buffer.x >= this._bufferService.cols) {\n return;\n }\n let param = params.params[0] || 1;\n while (param--) {\n this._bufferService.buffer.x = this._bufferService.buffer.nextStop();\n }\n }\n\n /**\n * CSI Ps Z Cursor Backward Tabulation Ps tab stops (default = 1) (CBT).\n *\n * @vt: #Y CSI CBT \"Cursor Backward Tabulation\" \"CSI Ps Z\" \"Move cursor `Ps` tabs backward (default=1).\"\n */\n public cursorBackwardTab(params: IParams): void {\n if (this._bufferService.buffer.x >= this._bufferService.cols) {\n return;\n }\n let param = params.params[0] || 1;\n\n // make buffer local for faster access\n const buffer = this._bufferService.buffer;\n\n while (param--) {\n buffer.x = buffer.prevStop();\n }\n }\n\n\n /**\n * Helper method to erase cells in a terminal row.\n * The cell gets replaced with the eraseChar of the terminal.\n * @param y row index\n * @param start first cell index to be erased\n * @param end end - 1 is last erased cell\n */\n private _eraseInBufferLine(y: number, start: number, end: number, clearWrap: boolean = false): void {\n const line = this._bufferService.buffer.lines.get(this._bufferService.buffer.ybase + y)!;\n line.replaceCells(\n start,\n end,\n this._bufferService.buffer.getNullCell(this._eraseAttrData()),\n this._eraseAttrData()\n );\n if (clearWrap) {\n line.isWrapped = false;\n }\n }\n\n /**\n * Helper method to reset cells in a terminal row.\n * The cell gets replaced with the eraseChar of the terminal and the isWrapped property is set to false.\n * @param y row index\n */\n private _resetBufferLine(y: number): void {\n const line = this._bufferService.buffer.lines.get(this._bufferService.buffer.ybase + y)!;\n line.fill(this._bufferService.buffer.getNullCell(this._eraseAttrData()));\n line.isWrapped = false;\n }\n\n /**\n * CSI Ps J Erase in Display (ED).\n * Ps = 0 -> Erase Below (default).\n * Ps = 1 -> Erase Above.\n * Ps = 2 -> Erase All.\n * Ps = 3 -> Erase Saved Lines (xterm).\n * CSI ? Ps J\n * Erase in Display (DECSED).\n * Ps = 0 -> Selective Erase Below (default).\n * Ps = 1 -> Selective Erase Above.\n * Ps = 2 -> Selective Erase All.\n *\n * @vt: #Y CSI ED \"Erase In Display\" \"CSI Ps J\" \"Erase various parts of the viewport.\"\n * Supported param values:\n *\n * | Ps | Effect |\n * | -- | ------------------------------------------------------------ |\n * | 0 | Erase from the cursor through the end of the viewport. |\n * | 1 | Erase from the beginning of the viewport through the cursor. |\n * | 2 | Erase complete viewport. |\n * | 3 | Erase scrollback. |\n *\n * @vt: #P[Protection attributes are not supported.] CSI DECSED \"Selective Erase In Display\" \"CSI ? Ps J\" \"Currently the same as ED.\"\n */\n public eraseInDisplay(params: IParams): void {\n this._restrictCursor();\n let j;\n switch (params.params[0]) {\n case 0:\n j = this._bufferService.buffer.y;\n this._dirtyRowService.markDirty(j);\n this._eraseInBufferLine(j++, this._bufferService.buffer.x, this._bufferService.cols, this._bufferService.buffer.x === 0);\n for (; j < this._bufferService.rows; j++) {\n this._resetBufferLine(j);\n }\n this._dirtyRowService.markDirty(j);\n break;\n case 1:\n j = this._bufferService.buffer.y;\n this._dirtyRowService.markDirty(j);\n // Deleted front part of line and everything before. This line will no longer be wrapped.\n this._eraseInBufferLine(j, 0, this._bufferService.buffer.x + 1, true);\n if (this._bufferService.buffer.x + 1 >= this._bufferService.cols) {\n // Deleted entire previous line. This next line can no longer be wrapped.\n this._bufferService.buffer.lines.get(j + 1)!.isWrapped = false;\n }\n while (j--) {\n this._resetBufferLine(j);\n }\n this._dirtyRowService.markDirty(0);\n break;\n case 2:\n j = this._bufferService.rows;\n this._dirtyRowService.markDirty(j - 1);\n while (j--) {\n this._resetBufferLine(j);\n }\n this._dirtyRowService.markDirty(0);\n break;\n case 3:\n // Clear scrollback (everything not in viewport)\n const scrollBackSize = this._bufferService.buffer.lines.length - this._bufferService.rows;\n if (scrollBackSize > 0) {\n this._bufferService.buffer.lines.trimStart(scrollBackSize);\n this._bufferService.buffer.ybase = Math.max(this._bufferService.buffer.ybase - scrollBackSize, 0);\n this._bufferService.buffer.ydisp = Math.max(this._bufferService.buffer.ydisp - scrollBackSize, 0);\n // Force a scroll event to refresh viewport\n this._onScroll.fire(0);\n }\n break;\n }\n }\n\n /**\n * CSI Ps K Erase in Line (EL).\n * Ps = 0 -> Erase to Right (default).\n * Ps = 1 -> Erase to Left.\n * Ps = 2 -> Erase All.\n * CSI ? Ps K\n * Erase in Line (DECSEL).\n * Ps = 0 -> Selective Erase to Right (default).\n * Ps = 1 -> Selective Erase to Left.\n * Ps = 2 -> Selective Erase All.\n *\n * @vt: #Y CSI EL \"Erase In Line\" \"CSI Ps K\" \"Erase various parts of the active row.\"\n * Supported param values:\n *\n * | Ps | Effect |\n * | -- | -------------------------------------------------------- |\n * | 0 | Erase from the cursor through the end of the row. |\n * | 1 | Erase from the beginning of the line through the cursor. |\n * | 2 | Erase complete line. |\n *\n * @vt: #P[Protection attributes are not supported.] CSI DECSEL \"Selective Erase In Line\" \"CSI ? Ps K\" \"Currently the same as EL.\"\n */\n public eraseInLine(params: IParams): void {\n this._restrictCursor();\n switch (params.params[0]) {\n case 0:\n this._eraseInBufferLine(this._bufferService.buffer.y, this._bufferService.buffer.x, this._bufferService.cols);\n break;\n case 1:\n this._eraseInBufferLine(this._bufferService.buffer.y, 0, this._bufferService.buffer.x + 1);\n break;\n case 2:\n this._eraseInBufferLine(this._bufferService.buffer.y, 0, this._bufferService.cols);\n break;\n }\n this._dirtyRowService.markDirty(this._bufferService.buffer.y);\n }\n\n /**\n * CSI Ps L\n * Insert Ps Line(s) (default = 1) (IL).\n *\n * @vt: #Y CSI IL \"Insert Line\" \"CSI Ps L\" \"Insert `Ps` blank lines at active row (default=1).\"\n * For every inserted line at the scroll top one line at the scroll bottom gets removed.\n * The cursor is set to the first column.\n * IL has no effect if the cursor is outside the scroll margins.\n */\n public insertLines(params: IParams): void {\n this._restrictCursor();\n let param = params.params[0] || 1;\n\n // make buffer local for faster access\n const buffer = this._bufferService.buffer;\n\n if (buffer.y > buffer.scrollBottom || buffer.y < buffer.scrollTop) {\n return;\n }\n\n const row: number = buffer.ybase + buffer.y;\n\n const scrollBottomRowsOffset = this._bufferService.rows - 1 - buffer.scrollBottom;\n const scrollBottomAbsolute = this._bufferService.rows - 1 + buffer.ybase - scrollBottomRowsOffset + 1;\n while (param--) {\n // test: echo -e '\\e[44m\\e[1L\\e[0m'\n // blankLine(true) - xterm/linux behavior\n buffer.lines.splice(scrollBottomAbsolute - 1, 1);\n buffer.lines.splice(row, 0, buffer.getBlankLine(this._eraseAttrData()));\n }\n\n this._dirtyRowService.markRangeDirty(buffer.y, buffer.scrollBottom);\n buffer.x = 0; // see https://vt100.net/docs/vt220-rm/chapter4.html - vt220 only?\n }\n\n /**\n * CSI Ps M\n * Delete Ps Line(s) (default = 1) (DL).\n *\n * @vt: #Y CSI DL \"Delete Line\" \"CSI Ps M\" \"Delete `Ps` lines at active row (default=1).\"\n * For every deleted line at the scroll top one blank line at the scroll bottom gets appended.\n * The cursor is set to the first column.\n * DL has no effect if the cursor is outside the scroll margins.\n */\n public deleteLines(params: IParams): void {\n this._restrictCursor();\n let param = params.params[0] || 1;\n\n // make buffer local for faster access\n const buffer = this._bufferService.buffer;\n\n if (buffer.y > buffer.scrollBottom || buffer.y < buffer.scrollTop) {\n return;\n }\n\n const row: number = buffer.ybase + buffer.y;\n\n let j: number;\n j = this._bufferService.rows - 1 - buffer.scrollBottom;\n j = this._bufferService.rows - 1 + buffer.ybase - j;\n while (param--) {\n // test: echo -e '\\e[44m\\e[1M\\e[0m'\n // blankLine(true) - xterm/linux behavior\n buffer.lines.splice(row, 1);\n buffer.lines.splice(j, 0, buffer.getBlankLine(this._eraseAttrData()));\n }\n\n this._dirtyRowService.markRangeDirty(buffer.y, buffer.scrollBottom);\n buffer.x = 0; // see https://vt100.net/docs/vt220-rm/chapter4.html - vt220 only?\n }\n\n /**\n * CSI Ps @\n * Insert Ps (Blank) Character(s) (default = 1) (ICH).\n *\n * @vt: #Y CSI ICH \"Insert Characters\" \"CSI Ps @\" \"Insert `Ps` (blank) characters (default = 1).\"\n * The ICH sequence inserts `Ps` blank characters. The cursor remains at the beginning of the blank characters.\n * Text between the cursor and right margin moves to the right. Characters moved past the right margin are lost.\n *\n *\n * FIXME: check against xterm - should not work outside of scroll margins (see VT520 manual)\n */\n public insertChars(params: IParams): void {\n this._restrictCursor();\n const line = this._bufferService.buffer.lines.get(this._bufferService.buffer.ybase + this._bufferService.buffer.y);\n if (line) {\n line.insertCells(\n this._bufferService.buffer.x,\n params.params[0] || 1,\n this._bufferService.buffer.getNullCell(this._eraseAttrData()),\n this._eraseAttrData()\n );\n this._dirtyRowService.markDirty(this._bufferService.buffer.y);\n }\n }\n\n /**\n * CSI Ps P\n * Delete Ps Character(s) (default = 1) (DCH).\n *\n * @vt: #Y CSI DCH \"Delete Character\" \"CSI Ps P\" \"Delete `Ps` characters (default=1).\"\n * As characters are deleted, the remaining characters between the cursor and right margin move to the left.\n * Character attributes move with the characters. The terminal adds blank characters at the right margin.\n *\n *\n * FIXME: check against xterm - should not work outside of scroll margins (see VT520 manual)\n */\n public deleteChars(params: IParams): void {\n this._restrictCursor();\n const line = this._bufferService.buffer.lines.get(this._bufferService.buffer.ybase + this._bufferService.buffer.y);\n if (line) {\n line.deleteCells(\n this._bufferService.buffer.x,\n params.params[0] || 1,\n this._bufferService.buffer.getNullCell(this._eraseAttrData()),\n this._eraseAttrData()\n );\n this._dirtyRowService.markDirty(this._bufferService.buffer.y);\n }\n }\n\n /**\n * CSI Ps S Scroll up Ps lines (default = 1) (SU).\n *\n * @vt: #Y CSI SU \"Scroll Up\" \"CSI Ps S\" \"Scroll `Ps` lines up (default=1).\"\n *\n *\n * FIXME: scrolled out lines at top = 1 should add to scrollback (xterm)\n */\n public scrollUp(params: IParams): void {\n let param = params.params[0] || 1;\n\n // make buffer local for faster access\n const buffer = this._bufferService.buffer;\n\n while (param--) {\n buffer.lines.splice(buffer.ybase + buffer.scrollTop, 1);\n buffer.lines.splice(buffer.ybase + buffer.scrollBottom, 0, buffer.getBlankLine(this._eraseAttrData()));\n }\n this._dirtyRowService.markRangeDirty(buffer.scrollTop, buffer.scrollBottom);\n }\n\n /**\n * CSI Ps T Scroll down Ps lines (default = 1) (SD).\n *\n * @vt: #Y CSI SD \"Scroll Down\" \"CSI Ps T\" \"Scroll `Ps` lines down (default=1).\"\n */\n public scrollDown(params: IParams): void {\n let param = params.params[0] || 1;\n\n // make buffer local for faster access\n const buffer = this._bufferService.buffer;\n\n while (param--) {\n buffer.lines.splice(buffer.ybase + buffer.scrollBottom, 1);\n buffer.lines.splice(buffer.ybase + buffer.scrollTop, 0, buffer.getBlankLine(DEFAULT_ATTR_DATA));\n }\n this._dirtyRowService.markRangeDirty(buffer.scrollTop, buffer.scrollBottom);\n }\n\n /**\n * CSI Ps SP @ Scroll left Ps columns (default = 1) (SL) ECMA-48\n *\n * Notation: (Pn)\n * Representation: CSI Pn 02/00 04/00\n * Parameter default value: Pn = 1\n * SL causes the data in the presentation component to be moved by n character positions\n * if the line orientation is horizontal, or by n line positions if the line orientation\n * is vertical, such that the data appear to move to the left; where n equals the value of Pn.\n * The active presentation position is not affected by this control function.\n *\n * Supported:\n * - always left shift (no line orientation setting respected)\n *\n * @vt: #Y CSI SL \"Scroll Left\" \"CSI Ps SP @\" \"Scroll viewport `Ps` times to the left.\"\n * SL moves the content of all lines within the scroll margins `Ps` times to the left.\n * SL has no effect outside of the scroll margins.\n */\n public scrollLeft(params: IParams): void {\n const buffer = this._bufferService.buffer;\n if (buffer.y > buffer.scrollBottom || buffer.y < buffer.scrollTop) {\n return;\n }\n const param = params.params[0] || 1;\n for (let y = buffer.scrollTop; y <= buffer.scrollBottom; ++y) {\n const line = buffer.lines.get(buffer.ybase + y)!;\n line.deleteCells(0, param, buffer.getNullCell(this._eraseAttrData()), this._eraseAttrData());\n line.isWrapped = false;\n }\n this._dirtyRowService.markRangeDirty(buffer.scrollTop, buffer.scrollBottom);\n }\n\n /**\n * CSI Ps SP A Scroll right Ps columns (default = 1) (SR) ECMA-48\n *\n * Notation: (Pn)\n * Representation: CSI Pn 02/00 04/01\n * Parameter default value: Pn = 1\n * SR causes the data in the presentation component to be moved by n character positions\n * if the line orientation is horizontal, or by n line positions if the line orientation\n * is vertical, such that the data appear to move to the right; where n equals the value of Pn.\n * The active presentation position is not affected by this control function.\n *\n * Supported:\n * - always right shift (no line orientation setting respected)\n *\n * @vt: #Y CSI SR \"Scroll Right\" \"CSI Ps SP A\" \"Scroll viewport `Ps` times to the right.\"\n * SL moves the content of all lines within the scroll margins `Ps` times to the right.\n * Content at the right margin is lost.\n * SL has no effect outside of the scroll margins.\n */\n public scrollRight(params: IParams): void {\n const buffer = this._bufferService.buffer;\n if (buffer.y > buffer.scrollBottom || buffer.y < buffer.scrollTop) {\n return;\n }\n const param = params.params[0] || 1;\n for (let y = buffer.scrollTop; y <= buffer.scrollBottom; ++y) {\n const line = buffer.lines.get(buffer.ybase + y)!;\n line.insertCells(0, param, buffer.getNullCell(this._eraseAttrData()), this._eraseAttrData());\n line.isWrapped = false;\n }\n this._dirtyRowService.markRangeDirty(buffer.scrollTop, buffer.scrollBottom);\n }\n\n /**\n * CSI Pm ' }\n * Insert Ps Column(s) (default = 1) (DECIC), VT420 and up.\n *\n * @vt: #Y CSI DECIC \"Insert Columns\" \"CSI Ps ' }\" \"Insert `Ps` columns at cursor position.\"\n * DECIC inserts `Ps` times blank columns at the cursor position for all lines with the scroll margins,\n * moving content to the right. Content at the right margin is lost.\n * DECIC has no effect outside the scrolling margins.\n */\n public insertColumns(params: IParams): void {\n const buffer = this._bufferService.buffer;\n if (buffer.y > buffer.scrollBottom || buffer.y < buffer.scrollTop) {\n return;\n }\n const param = params.params[0] || 1;\n for (let y = buffer.scrollTop; y <= buffer.scrollBottom; ++y) {\n const line = this._bufferService.buffer.lines.get(buffer.ybase + y)!;\n line.insertCells(buffer.x, param, buffer.getNullCell(this._eraseAttrData()), this._eraseAttrData());\n line.isWrapped = false;\n }\n this._dirtyRowService.markRangeDirty(buffer.scrollTop, buffer.scrollBottom);\n }\n\n /**\n * CSI Pm ' ~\n * Delete Ps Column(s) (default = 1) (DECDC), VT420 and up.\n *\n * @vt: #Y CSI DECDC \"Delete Columns\" \"CSI Ps ' ~\" \"Delete `Ps` columns at cursor position.\"\n * DECDC deletes `Ps` times columns at the cursor position for all lines with the scroll margins,\n * moving content to the left. Blank columns are added at the right margin.\n * DECDC has no effect outside the scrolling margins.\n */\n public deleteColumns(params: IParams): void {\n const buffer = this._bufferService.buffer;\n if (buffer.y > buffer.scrollBottom || buffer.y < buffer.scrollTop) {\n return;\n }\n const param = params.params[0] || 1;\n for (let y = buffer.scrollTop; y <= buffer.scrollBottom; ++y) {\n const line = buffer.lines.get(buffer.ybase + y)!;\n line.deleteCells(buffer.x, param, buffer.getNullCell(this._eraseAttrData()), this._eraseAttrData());\n line.isWrapped = false;\n }\n this._dirtyRowService.markRangeDirty(buffer.scrollTop, buffer.scrollBottom);\n }\n\n /**\n * CSI Ps X\n * Erase Ps Character(s) (default = 1) (ECH).\n *\n * @vt: #Y CSI ECH \"Erase Character\" \"CSI Ps X\" \"Erase `Ps` characters from current cursor position to the right (default=1).\"\n * ED erases `Ps` characters from current cursor position to the right.\n * ED works inside or outside the scrolling margins.\n */\n public eraseChars(params: IParams): void {\n this._restrictCursor();\n const line = this._bufferService.buffer.lines.get(this._bufferService.buffer.ybase + this._bufferService.buffer.y);\n if (line) {\n line.replaceCells(\n this._bufferService.buffer.x,\n this._bufferService.buffer.x + (params.params[0] || 1),\n this._bufferService.buffer.getNullCell(this._eraseAttrData()),\n this._eraseAttrData()\n );\n this._dirtyRowService.markDirty(this._bufferService.buffer.y);\n }\n }\n\n /**\n * CSI Ps b Repeat the preceding graphic character Ps times (REP).\n * From ECMA 48 (@see http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-048.pdf)\n * Notation: (Pn)\n * Representation: CSI Pn 06/02\n * Parameter default value: Pn = 1\n * REP is used to indicate that the preceding character in the data stream,\n * if it is a graphic character (represented by one or more bit combinations) including SPACE,\n * is to be repeated n times, where n equals the value of Pn.\n * If the character preceding REP is a control function or part of a control function,\n * the effect of REP is not defined by this Standard.\n *\n * Since we propagate the terminal as xterm-256color we have to follow xterm's behavior:\n * - fullwidth + surrogate chars are ignored\n * - for combining chars only the base char gets repeated\n * - text attrs are applied normally\n * - wrap around is respected\n * - any valid sequence resets the carried forward char\n *\n * Note: To get reset on a valid sequence working correctly without much runtime penalty,\n * the preceding codepoint is stored on the parser in `this.print` and reset during `parser.parse`.\n *\n * @vt: #Y CSI REP \"Repeat Preceding Character\" \"CSI Ps b\" \"Repeat preceding character `Ps` times (default=1).\"\n * REP repeats the previous character `Ps` times advancing the cursor, also wrapping if DECAWM is set.\n * REP has no effect if the sequence does not follow a printable ASCII character\n * (NOOP for any other sequence in between or NON ASCII characters).\n */\n public repeatPrecedingCharacter(params: IParams): void {\n if (!this._parser.precedingCodepoint) {\n return;\n }\n // call print to insert the chars and handle correct wrapping\n const length = params.params[0] || 1;\n const data = new Uint32Array(length);\n for (let i = 0; i < length; ++i) {\n data[i] = this._parser.precedingCodepoint;\n }\n this.print(data, 0, data.length);\n }\n\n /**\n * CSI Ps c Send Device Attributes (Primary DA).\n * Ps = 0 or omitted -> request attributes from terminal. The\n * response depends on the decTerminalID resource setting.\n * -> CSI ? 1 ; 2 c (``VT100 with Advanced Video Option'')\n * -> CSI ? 1 ; 0 c (``VT101 with No Options'')\n * -> CSI ? 6 c (``VT102'')\n * -> CSI ? 6 0 ; 1 ; 2 ; 6 ; 8 ; 9 ; 1 5 ; c (``VT220'')\n * The VT100-style response parameters do not mean anything by\n * themselves. VT220 parameters do, telling the host what fea-\n * tures the terminal supports:\n * Ps = 1 -> 132-columns.\n * Ps = 2 -> Printer.\n * Ps = 6 -> Selective erase.\n * Ps = 8 -> User-defined keys.\n * Ps = 9 -> National replacement character sets.\n * Ps = 1 5 -> Technical characters.\n * Ps = 2 2 -> ANSI color, e.g., VT525.\n * Ps = 2 9 -> ANSI text locator (i.e., DEC Locator mode).\n *\n * @vt: #Y CSI DA1 \"Primary Device Attributes\" \"CSI c\" \"Send primary device attributes.\"\n *\n *\n * TODO: fix and cleanup response\n */\n public sendDeviceAttributesPrimary(params: IParams): void {\n if (params.params[0] > 0) {\n return;\n }\n if (this._is('xterm') || this._is('rxvt-unicode') || this._is('screen')) {\n this._coreService.triggerDataEvent(C0.ESC + '[?1;2c');\n } else if (this._is('linux')) {\n this._coreService.triggerDataEvent(C0.ESC + '[?6c');\n }\n }\n\n /**\n * CSI > Ps c\n * Send Device Attributes (Secondary DA).\n * Ps = 0 or omitted -> request the terminal's identification\n * code. The response depends on the decTerminalID resource set-\n * ting. It should apply only to VT220 and up, but xterm extends\n * this to VT100.\n * -> CSI > Pp ; Pv ; Pc c\n * where Pp denotes the terminal type\n * Pp = 0 -> ``VT100''.\n * Pp = 1 -> ``VT220''.\n * and Pv is the firmware version (for xterm, this was originally\n * the XFree86 patch number, starting with 95). In a DEC termi-\n * nal, Pc indicates the ROM cartridge registration number and is\n * always zero.\n * More information:\n * xterm/charproc.c - line 2012, for more information.\n * vim responds with ^[[?0c or ^[[?1c after the terminal's response (?)\n *\n * @vt: #Y CSI DA2 \"Secondary Device Attributes\" \"CSI > c\" \"Send primary device attributes.\"\n *\n *\n * TODO: fix and cleanup response\n */\n public sendDeviceAttributesSecondary(params: IParams): void {\n if (params.params[0] > 0) {\n return;\n }\n // xterm and urxvt\n // seem to spit this\n // out around ~370 times (?).\n if (this._is('xterm')) {\n this._coreService.triggerDataEvent(C0.ESC + '[>0;276;0c');\n } else if (this._is('rxvt-unicode')) {\n this._coreService.triggerDataEvent(C0.ESC + '[>85;95;0c');\n } else if (this._is('linux')) {\n // not supported by linux console.\n // linux console echoes parameters.\n this._coreService.triggerDataEvent(params.params[0] + 'c');\n } else if (this._is('screen')) {\n this._coreService.triggerDataEvent(C0.ESC + '[>83;40003;0c');\n }\n }\n\n /**\n * Evaluate if the current terminal is the given argument.\n * @param term The terminal name to evaluate\n */\n private _is(term: string): boolean {\n return (this._optionsService.options.termName + '').indexOf(term) === 0;\n }\n\n /**\n * CSI Pm h Set Mode (SM).\n * Ps = 2 -> Keyboard Action Mode (AM).\n * Ps = 4 -> Insert Mode (IRM).\n * Ps = 1 2 -> Send/receive (SRM).\n * Ps = 2 0 -> Automatic Newline (LNM).\n *\n * @vt: #P[Only IRM is supported.] CSI SM \"Set Mode\" \"CSI Pm h\" \"Set various terminal modes.\"\n * Supported param values by SM:\n *\n * | Param | Action | Support |\n * | ----- | -------------------------------------- | ------- |\n * | 2 | Keyboard Action Mode (KAM). Always on. | #N |\n * | 4 | Insert Mode (IRM). | #Y |\n * | 12 | Send/receive (SRM). Always off. | #N |\n * | 20 | Automatic Newline (LNM). Always off. | #N |\n */\n public setMode(params: IParams): void {\n for (let i = 0; i < params.length; i++) {\n switch (params.params[i]) {\n case 4:\n this._coreService.modes.insertMode = true;\n break;\n case 20:\n // this._t.convertEol = true;\n break;\n }\n }\n }\n\n /**\n * CSI ? Pm h\n * DEC Private Mode Set (DECSET).\n * Ps = 1 -> Application Cursor Keys (DECCKM).\n * Ps = 2 -> Designate USASCII for character sets G0-G3\n * (DECANM), and set VT100 mode.\n * Ps = 3 -> 132 Column Mode (DECCOLM).\n * Ps = 4 -> Smooth (Slow) Scroll (DECSCLM).\n * Ps = 5 -> Reverse Video (DECSCNM).\n * Ps = 6 -> Origin Mode (DECOM).\n * Ps = 7 -> Wraparound Mode (DECAWM).\n * Ps = 8 -> Auto-repeat Keys (DECARM).\n * Ps = 9 -> Send Mouse X & Y on button press. See the sec-\n * tion Mouse Tracking.\n * Ps = 1 0 -> Show toolbar (rxvt).\n * Ps = 1 2 -> Start Blinking Cursor (att610).\n * Ps = 1 8 -> Print form feed (DECPFF).\n * Ps = 1 9 -> Set print extent to full screen (DECPEX).\n * Ps = 2 5 -> Show Cursor (DECTCEM).\n * Ps = 3 0 -> Show scrollbar (rxvt).\n * Ps = 3 5 -> Enable font-shifting functions (rxvt).\n * Ps = 3 8 -> Enter Tektronix Mode (DECTEK).\n * Ps = 4 0 -> Allow 80 -> 132 Mode.\n * Ps = 4 1 -> more(1) fix (see curses resource).\n * Ps = 4 2 -> Enable Nation Replacement Character sets (DECN-\n * RCM).\n * Ps = 4 4 -> Turn On Margin Bell.\n * Ps = 4 5 -> Reverse-wraparound Mode.\n * Ps = 4 6 -> Start Logging. This is normally disabled by a\n * compile-time option.\n * Ps = 4 7 -> Use Alternate Screen Buffer. (This may be dis-\n * abled by the titeInhibit resource).\n * Ps = 6 6 -> Application keypad (DECNKM).\n * Ps = 6 7 -> Backarrow key sends backspace (DECBKM).\n * Ps = 1 0 0 0 -> Send Mouse X & Y on button press and\n * release. See the section Mouse Tracking.\n * Ps = 1 0 0 1 -> Use Hilite Mouse Tracking.\n * Ps = 1 0 0 2 -> Use Cell Motion Mouse Tracking.\n * Ps = 1 0 0 3 -> Use All Motion Mouse Tracking.\n * Ps = 1 0 0 4 -> Send FocusIn/FocusOut events.\n * Ps = 1 0 0 5 -> Enable Extended Mouse Mode.\n * Ps = 1 0 1 0 -> Scroll to bottom on tty output (rxvt).\n * Ps = 1 0 1 1 -> Scroll to bottom on key press (rxvt).\n * Ps = 1 0 3 4 -> Interpret \"meta\" key, sets eighth bit.\n * (enables the eightBitInput resource).\n * Ps = 1 0 3 5 -> Enable special modifiers for Alt and Num-\n * Lock keys. (This enables the numLock resource).\n * Ps = 1 0 3 6 -> Send ESC when Meta modifies a key. (This\n * enables the metaSendsEscape resource).\n * Ps = 1 0 3 7 -> Send DEL from the editing-keypad Delete\n * key.\n * Ps = 1 0 3 9 -> Send ESC when Alt modifies a key. (This\n * enables the altSendsEscape resource).\n * Ps = 1 0 4 0 -> Keep selection even if not highlighted.\n * (This enables the keepSelection resource).\n * Ps = 1 0 4 1 -> Use the CLIPBOARD selection. (This enables\n * the selectToClipboard resource).\n * Ps = 1 0 4 2 -> Enable Urgency window manager hint when\n * Control-G is received. (This enables the bellIsUrgent\n * resource).\n * Ps = 1 0 4 3 -> Enable raising of the window when Control-G\n * is received. (enables the popOnBell resource).\n * Ps = 1 0 4 7 -> Use Alternate Screen Buffer. (This may be\n * disabled by the titeInhibit resource).\n * Ps = 1 0 4 8 -> Save cursor as in DECSC. (This may be dis-\n * abled by the titeInhibit resource).\n * Ps = 1 0 4 9 -> Save cursor as in DECSC and use Alternate\n * Screen Buffer, clearing it first. (This may be disabled by\n * the titeInhibit resource). This combines the effects of the 1\n * 0 4 7 and 1 0 4 8 modes. Use this with terminfo-based\n * applications rather than the 4 7 mode.\n * Ps = 1 0 5 0 -> Set terminfo/termcap function-key mode.\n * Ps = 1 0 5 1 -> Set Sun function-key mode.\n * Ps = 1 0 5 2 -> Set HP function-key mode.\n * Ps = 1 0 5 3 -> Set SCO function-key mode.\n * Ps = 1 0 6 0 -> Set legacy keyboard emulation (X11R6).\n * Ps = 1 0 6 1 -> Set VT220 keyboard emulation.\n * Ps = 2 0 0 4 -> Set bracketed paste mode.\n * Modes:\n * http: *vt100.net/docs/vt220-rm/chapter4.html\n *\n * @vt: #P[See below for supported modes.] CSI DECSET \"DEC Private Set Mode\" \"CSI ? Pm h\" \"Set various terminal attributes.\"\n * Supported param values by DECSET:\n *\n * | param | Action | Support |\n * | ----- | ------------------------------------------------------- | --------|\n * | 1 | Application Cursor Keys (DECCKM). | #Y |\n * | 2 | Designate US-ASCII for character sets G0-G3 (DECANM). | #Y |\n * | 3 | 132 Column Mode (DECCOLM). | #Y |\n * | 6 | Origin Mode (DECOM). | #Y |\n * | 7 | Auto-wrap Mode (DECAWM). | #Y |\n * | 8 | Auto-repeat Keys (DECARM). Always on. | #N |\n * | 9 | X10 xterm mouse protocol. | #Y |\n * | 12 | Start Blinking Cursor. | #Y |\n * | 25 | Show Cursor (DECTCEM). | #Y |\n * | 45 | Reverse wrap-around. | #Y |\n * | 47 | Use Alternate Screen Buffer. | #Y |\n * | 66 | Application keypad (DECNKM). | #Y |\n * | 1000 | X11 xterm mouse protocol. | #Y |\n * | 1002 | Use Cell Motion Mouse Tracking. | #Y |\n * | 1003 | Use All Motion Mouse Tracking. | #Y |\n * | 1004 | Send FocusIn/FocusOut events | #Y |\n * | 1005 | Enable UTF-8 Mouse Mode. | #N |\n * | 1006 | Enable SGR Mouse Mode. | #Y |\n * | 1015 | Enable urxvt Mouse Mode. | #N |\n * | 1047 | Use Alternate Screen Buffer. | #Y |\n * | 1048 | Save cursor as in DECSC. | #Y |\n * | 1049 | Save cursor and switch to alternate buffer clearing it. | #P[Does not clear the alternate buffer.] |\n * | 2004 | Set bracketed paste mode. | #Y |\n *\n *\n * FIXME: implement DECSCNM, 1049 should clear altbuffer\n */\n public setModePrivate(params: IParams): void {\n for (let i = 0; i < params.length; i++) {\n switch (params.params[i]) {\n case 1:\n this._coreService.decPrivateModes.applicationCursorKeys = true;\n break;\n case 2:\n this._charsetService.setgCharset(0, DEFAULT_CHARSET);\n this._charsetService.setgCharset(1, DEFAULT_CHARSET);\n this._charsetService.setgCharset(2, DEFAULT_CHARSET);\n this._charsetService.setgCharset(3, DEFAULT_CHARSET);\n // set VT100 mode here\n break;\n case 3:\n /**\n * DECCOLM - 132 column mode.\n * This is only active if 'SetWinLines' (24) is enabled\n * through `options.windowsOptions`.\n */\n if (this._optionsService.options.windowOptions.setWinLines) {\n this._bufferService.resize(132, this._bufferService.rows);\n this._onRequestReset.fire();\n }\n break;\n case 6:\n this._coreService.decPrivateModes.origin = true;\n this._setCursor(0, 0);\n break;\n case 7:\n this._coreService.decPrivateModes.wraparound = true;\n break;\n case 12:\n // this.cursorBlink = true;\n break;\n case 45:\n this._coreService.decPrivateModes.reverseWraparound = true;\n break;\n case 66:\n this._logService.debug('Serial port requested application keypad.');\n this._coreService.decPrivateModes.applicationKeypad = true;\n this._onRequestSyncScrollBar.fire();\n break;\n case 9: // X10 Mouse\n // no release, no motion, no wheel, no modifiers.\n this._coreMouseService.activeProtocol = 'X10';\n break;\n case 1000: // vt200 mouse\n // no motion.\n this._coreMouseService.activeProtocol = 'VT200';\n break;\n case 1002: // button event mouse\n this._coreMouseService.activeProtocol = 'DRAG';\n break;\n case 1003: // any event mouse\n // any event - sends motion events,\n // even if there is no button held down.\n this._coreMouseService.activeProtocol = 'ANY';\n break;\n case 1004: // send focusin/focusout events\n // focusin: ^[[I\n // focusout: ^[[O\n this._coreService.decPrivateModes.sendFocus = true;\n break;\n case 1005: // utf8 ext mode mouse - removed in #2507\n this._logService.debug('DECSET 1005 not supported (see #2507)');\n break;\n case 1006: // sgr ext mode mouse\n this._coreMouseService.activeEncoding = 'SGR';\n break;\n case 1015: // urxvt ext mode mouse - removed in #2507\n this._logService.debug('DECSET 1015 not supported (see #2507)');\n break;\n case 25: // show cursor\n this._coreService.isCursorHidden = false;\n break;\n case 1048: // alt screen cursor\n this.saveCursor();\n break;\n case 1049: // alt screen buffer cursor\n this.saveCursor();\n // FALL-THROUGH\n case 47: // alt screen buffer\n case 1047: // alt screen buffer\n this._bufferService.buffers.activateAltBuffer(this._eraseAttrData());\n this._coreService.isCursorInitialized = true;\n this._onRequestRefreshRows.fire(0, this._bufferService.rows - 1);\n this._onRequestSyncScrollBar.fire();\n break;\n case 2004: // bracketed paste mode (https://cirw.in/blog/bracketed-paste)\n this._coreService.decPrivateModes.bracketedPasteMode = true;\n break;\n }\n }\n }\n\n\n /**\n * CSI Pm l Reset Mode (RM).\n * Ps = 2 -> Keyboard Action Mode (AM).\n * Ps = 4 -> Replace Mode (IRM).\n * Ps = 1 2 -> Send/receive (SRM).\n * Ps = 2 0 -> Normal Linefeed (LNM).\n *\n * @vt: #P[Only IRM is supported.] CSI RM \"Reset Mode\" \"CSI Pm l\" \"Set various terminal attributes.\"\n * Supported param values by RM:\n *\n * | Param | Action | Support |\n * | ----- | -------------------------------------- | ------- |\n * | 2 | Keyboard Action Mode (KAM). Always on. | #N |\n * | 4 | Replace Mode (IRM). (default) | #Y |\n * | 12 | Send/receive (SRM). Always off. | #N |\n * | 20 | Normal Linefeed (LNM). Always off. | #N |\n *\n *\n * FIXME: why is LNM commented out?\n */\n public resetMode(params: IParams): void {\n for (let i = 0; i < params.length; i++) {\n switch (params.params[i]) {\n case 4:\n this._coreService.modes.insertMode = false;\n break;\n case 20:\n // this._t.convertEol = false;\n break;\n }\n }\n }\n\n /**\n * CSI ? Pm l\n * DEC Private Mode Reset (DECRST).\n * Ps = 1 -> Normal Cursor Keys (DECCKM).\n * Ps = 2 -> Designate VT52 mode (DECANM).\n * Ps = 3 -> 80 Column Mode (DECCOLM).\n * Ps = 4 -> Jump (Fast) Scroll (DECSCLM).\n * Ps = 5 -> Normal Video (DECSCNM).\n * Ps = 6 -> Normal Cursor Mode (DECOM).\n * Ps = 7 -> No Wraparound Mode (DECAWM).\n * Ps = 8 -> No Auto-repeat Keys (DECARM).\n * Ps = 9 -> Don't send Mouse X & Y on button press.\n * Ps = 1 0 -> Hide toolbar (rxvt).\n * Ps = 1 2 -> Stop Blinking Cursor (att610).\n * Ps = 1 8 -> Don't print form feed (DECPFF).\n * Ps = 1 9 -> Limit print to scrolling region (DECPEX).\n * Ps = 2 5 -> Hide Cursor (DECTCEM).\n * Ps = 3 0 -> Don't show scrollbar (rxvt).\n * Ps = 3 5 -> Disable font-shifting functions (rxvt).\n * Ps = 4 0 -> Disallow 80 -> 132 Mode.\n * Ps = 4 1 -> No more(1) fix (see curses resource).\n * Ps = 4 2 -> Disable Nation Replacement Character sets (DEC-\n * NRCM).\n * Ps = 4 4 -> Turn Off Margin Bell.\n * Ps = 4 5 -> No Reverse-wraparound Mode.\n * Ps = 4 6 -> Stop Logging. (This is normally disabled by a\n * compile-time option).\n * Ps = 4 7 -> Use Normal Screen Buffer.\n * Ps = 6 6 -> Numeric keypad (DECNKM).\n * Ps = 6 7 -> Backarrow key sends delete (DECBKM).\n * Ps = 1 0 0 0 -> Don't send Mouse X & Y on button press and\n * release. See the section Mouse Tracking.\n * Ps = 1 0 0 1 -> Don't use Hilite Mouse Tracking.\n * Ps = 1 0 0 2 -> Don't use Cell Motion Mouse Tracking.\n * Ps = 1 0 0 3 -> Don't use All Motion Mouse Tracking.\n * Ps = 1 0 0 4 -> Don't send FocusIn/FocusOut events.\n * Ps = 1 0 0 5 -> Disable Extended Mouse Mode.\n * Ps = 1 0 1 0 -> Don't scroll to bottom on tty output\n * (rxvt).\n * Ps = 1 0 1 1 -> Don't scroll to bottom on key press (rxvt).\n * Ps = 1 0 3 4 -> Don't interpret \"meta\" key. (This disables\n * the eightBitInput resource).\n * Ps = 1 0 3 5 -> Disable special modifiers for Alt and Num-\n * Lock keys. (This disables the numLock resource).\n * Ps = 1 0 3 6 -> Don't send ESC when Meta modifies a key.\n * (This disables the metaSendsEscape resource).\n * Ps = 1 0 3 7 -> Send VT220 Remove from the editing-keypad\n * Delete key.\n * Ps = 1 0 3 9 -> Don't send ESC when Alt modifies a key.\n * (This disables the altSendsEscape resource).\n * Ps = 1 0 4 0 -> Do not keep selection when not highlighted.\n * (This disables the keepSelection resource).\n * Ps = 1 0 4 1 -> Use the PRIMARY selection. (This disables\n * the selectToClipboard resource).\n * Ps = 1 0 4 2 -> Disable Urgency window manager hint when\n * Control-G is received. (This disables the bellIsUrgent\n * resource).\n * Ps = 1 0 4 3 -> Disable raising of the window when Control-\n * G is received. (This disables the popOnBell resource).\n * Ps = 1 0 4 7 -> Use Normal Screen Buffer, clearing screen\n * first if in the Alternate Screen. (This may be disabled by\n * the titeInhibit resource).\n * Ps = 1 0 4 8 -> Restore cursor as in DECRC. (This may be\n * disabled by the titeInhibit resource).\n * Ps = 1 0 4 9 -> Use Normal Screen Buffer and restore cursor\n * as in DECRC. (This may be disabled by the titeInhibit\n * resource). This combines the effects of the 1 0 4 7 and 1 0\n * 4 8 modes. Use this with terminfo-based applications rather\n * than the 4 7 mode.\n * Ps = 1 0 5 0 -> Reset terminfo/termcap function-key mode.\n * Ps = 1 0 5 1 -> Reset Sun function-key mode.\n * Ps = 1 0 5 2 -> Reset HP function-key mode.\n * Ps = 1 0 5 3 -> Reset SCO function-key mode.\n * Ps = 1 0 6 0 -> Reset legacy keyboard emulation (X11R6).\n * Ps = 1 0 6 1 -> Reset keyboard emulation to Sun/PC style.\n * Ps = 2 0 0 4 -> Reset bracketed paste mode.\n *\n * @vt: #P[See below for supported modes.] CSI DECRST \"DEC Private Reset Mode\" \"CSI ? Pm l\" \"Reset various terminal attributes.\"\n * Supported param values by DECRST:\n *\n * | param | Action | Support |\n * | ----- | ------------------------------------------------------- | ------- |\n * | 1 | Normal Cursor Keys (DECCKM). | #Y |\n * | 2 | Designate VT52 mode (DECANM). | #N |\n * | 3 | 80 Column Mode (DECCOLM). | #B[Switches to old column width instead of 80.] |\n * | 6 | Normal Cursor Mode (DECOM). | #Y |\n * | 7 | No Wraparound Mode (DECAWM). | #Y |\n * | 8 | No Auto-repeat Keys (DECARM). | #N |\n * | 9 | Don't send Mouse X & Y on button press. | #Y |\n * | 12 | Stop Blinking Cursor. | #Y |\n * | 25 | Hide Cursor (DECTCEM). | #Y |\n * | 45 | No reverse wrap-around. | #Y |\n * | 47 | Use Normal Screen Buffer. | #Y |\n * | 66 | Numeric keypad (DECNKM). | #Y |\n * | 1000 | Don't send Mouse reports. | #Y |\n * | 1002 | Don't use Cell Motion Mouse Tracking. | #Y |\n * | 1003 | Don't use All Motion Mouse Tracking. | #Y |\n * | 1004 | Don't send FocusIn/FocusOut events. | #Y |\n * | 1005 | Disable UTF-8 Mouse Mode. | #N |\n * | 1006 | Disable SGR Mouse Mode. | #Y |\n * | 1015 | Disable urxvt Mouse Mode. | #N |\n * | 1047 | Use Normal Screen Buffer (clearing screen if in alt). | #Y |\n * | 1048 | Restore cursor as in DECRC. | #Y |\n * | 1049 | Use Normal Screen Buffer and restore cursor. | #Y |\n * | 2004 | Reset bracketed paste mode. | #Y |\n *\n *\n * FIXME: DECCOLM is currently broken (already fixed in window options PR)\n */\n public resetModePrivate(params: IParams): void {\n for (let i = 0; i < params.length; i++) {\n switch (params.params[i]) {\n case 1:\n this._coreService.decPrivateModes.applicationCursorKeys = false;\n break;\n case 3:\n /**\n * DECCOLM - 80 column mode.\n * This is only active if 'SetWinLines' (24) is enabled\n * through `options.windowsOptions`.\n */\n if (this._optionsService.options.windowOptions.setWinLines) {\n this._bufferService.resize(80, this._bufferService.rows);\n this._onRequestReset.fire();\n }\n break;\n case 6:\n this._coreService.decPrivateModes.origin = false;\n this._setCursor(0, 0);\n break;\n case 7:\n this._coreService.decPrivateModes.wraparound = false;\n break;\n case 12:\n // this.cursorBlink = false;\n break;\n case 45:\n this._coreService.decPrivateModes.reverseWraparound = false;\n break;\n case 66:\n this._logService.debug('Switching back to normal keypad.');\n this._coreService.decPrivateModes.applicationKeypad = false;\n this._onRequestSyncScrollBar.fire();\n break;\n case 9: // X10 Mouse\n case 1000: // vt200 mouse\n case 1002: // button event mouse\n case 1003: // any event mouse\n this._coreMouseService.activeProtocol = 'NONE';\n break;\n case 1004: // send focusin/focusout events\n this._coreService.decPrivateModes.sendFocus = false;\n break;\n case 1005: // utf8 ext mode mouse - removed in #2507\n this._logService.debug('DECRST 1005 not supported (see #2507)');\n break;\n case 1006: // sgr ext mode mouse\n this._coreMouseService.activeEncoding = 'DEFAULT';\n break;\n case 1015: // urxvt ext mode mouse - removed in #2507\n this._logService.debug('DECRST 1015 not supported (see #2507)');\n break;\n case 25: // hide cursor\n this._coreService.isCursorHidden = true;\n break;\n case 1048: // alt screen cursor\n this.restoreCursor();\n break;\n case 1049: // alt screen buffer cursor\n // FALL-THROUGH\n case 47: // normal screen buffer\n case 1047: // normal screen buffer - clearing it first\n // Ensure the selection manager has the correct buffer\n this._bufferService.buffers.activateNormalBuffer();\n if (params.params[i] === 1049) {\n this.restoreCursor();\n }\n this._coreService.isCursorInitialized = true;\n this._onRequestRefreshRows.fire(0, this._bufferService.rows - 1);\n this._onRequestSyncScrollBar.fire();\n break;\n case 2004: // bracketed paste mode (https://cirw.in/blog/bracketed-paste)\n this._coreService.decPrivateModes.bracketedPasteMode = false;\n break;\n }\n }\n }\n\n /**\n * Helper to write color information packed with color mode.\n */\n private _updateAttrColor(color: number, mode: number, c1: number, c2: number, c3: number): number {\n if (mode === 2) {\n color |= Attributes.CM_RGB;\n color &= ~Attributes.RGB_MASK;\n color |= AttributeData.fromColorRGB([c1, c2, c3]);\n } else if (mode === 5) {\n color &= ~(Attributes.CM_MASK | Attributes.PCOLOR_MASK);\n color |= Attributes.CM_P256 | (c1 & 0xff);\n }\n return color;\n }\n\n /**\n * Helper to extract and apply color params/subparams.\n * Returns advance for params index.\n */\n private _extractColor(params: IParams, pos: number, attr: IAttributeData): number {\n // normalize params\n // meaning: [target, CM, ign, val, val, val]\n // RGB : [ 38/48, 2, ign, r, g, b]\n // P256 : [ 38/48, 5, ign, v, ign, ign]\n const accu = [0, 0, -1, 0, 0, 0];\n\n // alignment placeholder for non color space sequences\n let cSpace = 0;\n\n // return advance we took in params\n let advance = 0;\n\n do {\n accu[advance + cSpace] = params.params[pos + advance];\n if (params.hasSubParams(pos + advance)) {\n const subparams = params.getSubParams(pos + advance)!;\n let i = 0;\n do {\n if (accu[1] === 5) {\n cSpace = 1;\n }\n accu[advance + i + 1 + cSpace] = subparams[i];\n } while (++i < subparams.length && i + advance + 1 + cSpace < accu.length);\n break;\n }\n // exit early if can decide color mode with semicolons\n if ((accu[1] === 5 && advance + cSpace >= 2)\n || (accu[1] === 2 && advance + cSpace >= 5)) {\n break;\n }\n // offset colorSpace slot for semicolon mode\n if (accu[1]) {\n cSpace = 1;\n }\n } while (++advance + pos < params.length && advance + cSpace < accu.length);\n\n // set default values to 0\n for (let i = 2; i < accu.length; ++i) {\n if (accu[i] === -1) {\n accu[i] = 0;\n }\n }\n\n // apply colors\n switch (accu[0]) {\n case 38:\n attr.fg = this._updateAttrColor(attr.fg, accu[1], accu[3], accu[4], accu[5]);\n break;\n case 48:\n attr.bg = this._updateAttrColor(attr.bg, accu[1], accu[3], accu[4], accu[5]);\n break;\n case 58:\n attr.extended = attr.extended.clone();\n attr.extended.underlineColor = this._updateAttrColor(attr.extended.underlineColor, accu[1], accu[3], accu[4], accu[5]);\n }\n\n return advance;\n }\n\n /**\n * SGR 4 subparams:\n * 4:0 - equal to SGR 24 (turn off all underline)\n * 4:1 - equal to SGR 4 (single underline)\n * 4:2 - equal to SGR 21 (double underline)\n * 4:3 - curly underline\n * 4:4 - dotted underline\n * 4:5 - dashed underline\n */\n private _processUnderline(style: number, attr: IAttributeData): void {\n // treat extended attrs as immutable, thus always clone from old one\n // this is needed since the buffer only holds references to it\n attr.extended = attr.extended.clone();\n\n // default to 1 == single underline\n if (!~style || style > 5) {\n style = 1;\n }\n attr.extended.underlineStyle = style;\n attr.fg |= FgFlags.UNDERLINE;\n\n // 0 deactivates underline\n if (style === 0) {\n attr.fg &= ~FgFlags.UNDERLINE;\n }\n\n // update HAS_EXTENDED in BG\n attr.updateExtended();\n }\n\n /**\n * CSI Pm m Character Attributes (SGR).\n *\n * @vt: #P[See below for supported attributes.] CSI SGR \"Select Graphic Rendition\" \"CSI Pm m\" \"Set/Reset various text attributes.\"\n * SGR selects one or more character attributes at the same time. Multiple params (up to 32)\n * are applied in order from left to right. The changed attributes are applied to all new\n * characters received. If you move characters in the viewport by scrolling or any other means,\n * then the attributes move with the characters.\n *\n * Supported param values by SGR:\n *\n * | Param | Meaning | Support |\n * | --------- | -------------------------------------------------------- | ------- |\n * | 0 | Normal (default). Resets any other preceding SGR. | #Y |\n * | 1 | Bold. (also see `options.drawBoldTextInBrightColors`) | #Y |\n * | 2 | Faint, decreased intensity. | #Y |\n * | 3 | Italic. | #Y |\n * | 4 | Underlined (see below for style support). | #Y |\n * | 5 | Slowly blinking. | #N |\n * | 6 | Rapidly blinking. | #N |\n * | 7 | Inverse. Flips foreground and background color. | #Y |\n * | 8 | Invisible (hidden). | #Y |\n * | 9 | Crossed-out characters. | #N |\n * | 21 | Doubly underlined. | #P[Currently outputs a single underline.] |\n * | 22 | Normal (neither bold nor faint). | #Y |\n * | 23 | No italic. | #Y |\n * | 24 | Not underlined. | #Y |\n * | 25 | Steady (not blinking). | #Y |\n * | 27 | Positive (not inverse). | #Y |\n * | 28 | Visible (not hidden). | #Y |\n * | 29 | Not Crossed-out. | #N |\n * | 30 | Foreground color: Black. | #Y |\n * | 31 | Foreground color: Red. | #Y |\n * | 32 | Foreground color: Green. | #Y |\n * | 33 | Foreground color: Yellow. | #Y |\n * | 34 | Foreground color: Blue. | #Y |\n * | 35 | Foreground color: Magenta. | #Y |\n * | 36 | Foreground color: Cyan. | #Y |\n * | 37 | Foreground color: White. | #Y |\n * | 38 | Foreground color: Extended color. | #P[Support for RGB and indexed colors, see below.] |\n * | 39 | Foreground color: Default (original). | #Y |\n * | 40 | Background color: Black. | #Y |\n * | 41 | Background color: Red. | #Y |\n * | 42 | Background color: Green. | #Y |\n * | 43 | Background color: Yellow. | #Y |\n * | 44 | Background color: Blue. | #Y |\n * | 45 | Background color: Magenta. | #Y |\n * | 46 | Background color: Cyan. | #Y |\n * | 47 | Background color: White. | #Y |\n * | 48 | Background color: Extended color. | #P[Support for RGB and indexed colors, see below.] |\n * | 49 | Background color: Default (original). | #Y |\n * | 90 - 97 | Bright foreground color (analogous to 30 - 37). | #Y |\n * | 100 - 107 | Bright background color (analogous to 40 - 47). | #Y |\n *\n * Underline supports subparams to denote the style in the form `4 : x`:\n *\n * | x | Meaning | Support |\n * | ------ | ------------------------------------------------------------- | ------- |\n * | 0 | No underline. Same as `SGR 24 m`. | #Y |\n * | 1 | Single underline. Same as `SGR 4 m`. | #Y |\n * | 2 | Double underline. | #P[Currently outputs a single underline.] |\n * | 3 | Curly underline. | #P[Currently outputs a single underline.] |\n * | 4 | Dotted underline. | #P[Currently outputs a single underline.] |\n * | 5 | Dashed underline. | #P[Currently outputs a single underline.] |\n * | other | Single underline. Same as `SGR 4 m`. | #Y |\n *\n * Extended colors are supported for foreground (Ps=38) and background (Ps=48) as follows:\n *\n * | Ps + 1 | Meaning | Support |\n * | ------ | ------------------------------------------------------------- | ------- |\n * | 0 | Implementation defined. | #N |\n * | 1 | Transparent. | #N |\n * | 2 | RGB color as `Ps ; 2 ; R ; G ; B` or `Ps : 2 : : R : G : B`. | #Y |\n * | 3 | CMY color. | #N |\n * | 4 | CMYK color. | #N |\n * | 5 | Indexed (256 colors) as `Ps ; 5 ; INDEX` or `Ps : 5 : INDEX`. | #Y |\n *\n *\n * FIXME: blinking is implemented in attrs, but not working in renderers?\n * FIXME: remove dead branch for p=100\n */\n public charAttributes(params: IParams): void {\n // Optimize a single SGR0.\n if (params.length === 1 && params.params[0] === 0) {\n this._curAttrData.fg = DEFAULT_ATTR_DATA.fg;\n this._curAttrData.bg = DEFAULT_ATTR_DATA.bg;\n return;\n }\n\n const l = params.length;\n let p;\n const attr = this._curAttrData;\n\n for (let i = 0; i < l; i++) {\n p = params.params[i];\n if (p >= 30 && p <= 37) {\n // fg color 8\n attr.fg &= ~(Attributes.CM_MASK | Attributes.PCOLOR_MASK);\n attr.fg |= Attributes.CM_P16 | (p - 30);\n } else if (p >= 40 && p <= 47) {\n // bg color 8\n attr.bg &= ~(Attributes.CM_MASK | Attributes.PCOLOR_MASK);\n attr.bg |= Attributes.CM_P16 | (p - 40);\n } else if (p >= 90 && p <= 97) {\n // fg color 16\n attr.fg &= ~(Attributes.CM_MASK | Attributes.PCOLOR_MASK);\n attr.fg |= Attributes.CM_P16 | (p - 90) | 8;\n } else if (p >= 100 && p <= 107) {\n // bg color 16\n attr.bg &= ~(Attributes.CM_MASK | Attributes.PCOLOR_MASK);\n attr.bg |= Attributes.CM_P16 | (p - 100) | 8;\n } else if (p === 0) {\n // default\n attr.fg = DEFAULT_ATTR_DATA.fg;\n attr.bg = DEFAULT_ATTR_DATA.bg;\n } else if (p === 1) {\n // bold text\n attr.fg |= FgFlags.BOLD;\n } else if (p === 3) {\n // italic text\n attr.bg |= BgFlags.ITALIC;\n } else if (p === 4) {\n // underlined text\n attr.fg |= FgFlags.UNDERLINE;\n this._processUnderline(params.hasSubParams(i) ? params.getSubParams(i)![0] : UnderlineStyle.SINGLE, attr);\n } else if (p === 5) {\n // blink\n attr.fg |= FgFlags.BLINK;\n } else if (p === 7) {\n // inverse and positive\n // test with: echo -e '\\e[31m\\e[42mhello\\e[7mworld\\e[27mhi\\e[m'\n attr.fg |= FgFlags.INVERSE;\n } else if (p === 8) {\n // invisible\n attr.fg |= FgFlags.INVISIBLE;\n } else if (p === 2) {\n // dimmed text\n attr.bg |= BgFlags.DIM;\n } else if (p === 21) {\n // double underline\n this._processUnderline(UnderlineStyle.DOUBLE, attr);\n } else if (p === 22) {\n // not bold nor faint\n attr.fg &= ~FgFlags.BOLD;\n attr.bg &= ~BgFlags.DIM;\n } else if (p === 23) {\n // not italic\n attr.bg &= ~BgFlags.ITALIC;\n } else if (p === 24) {\n // not underlined\n attr.fg &= ~FgFlags.UNDERLINE;\n } else if (p === 25) {\n // not blink\n attr.fg &= ~FgFlags.BLINK;\n } else if (p === 27) {\n // not inverse\n attr.fg &= ~FgFlags.INVERSE;\n } else if (p === 28) {\n // not invisible\n attr.fg &= ~FgFlags.INVISIBLE;\n } else if (p === 39) {\n // reset fg\n attr.fg &= ~(Attributes.CM_MASK | Attributes.RGB_MASK);\n attr.fg |= DEFAULT_ATTR_DATA.fg & (Attributes.PCOLOR_MASK | Attributes.RGB_MASK);\n } else if (p === 49) {\n // reset bg\n attr.bg &= ~(Attributes.CM_MASK | Attributes.RGB_MASK);\n attr.bg |= DEFAULT_ATTR_DATA.bg & (Attributes.PCOLOR_MASK | Attributes.RGB_MASK);\n } else if (p === 38 || p === 48 || p === 58) {\n // fg color 256 and RGB\n i += this._extractColor(params, i, attr);\n } else if (p === 59) {\n attr.extended = attr.extended.clone();\n attr.extended.underlineColor = -1;\n attr.updateExtended();\n } else if (p === 100) { // FIXME: dead branch, p=100 already handled above!\n // reset fg/bg\n attr.fg &= ~(Attributes.CM_MASK | Attributes.RGB_MASK);\n attr.fg |= DEFAULT_ATTR_DATA.fg & (Attributes.PCOLOR_MASK | Attributes.RGB_MASK);\n attr.bg &= ~(Attributes.CM_MASK | Attributes.RGB_MASK);\n attr.bg |= DEFAULT_ATTR_DATA.bg & (Attributes.PCOLOR_MASK | Attributes.RGB_MASK);\n } else {\n this._logService.debug('Unknown SGR attribute: %d.', p);\n }\n }\n }\n\n /**\n * CSI Ps n Device Status Report (DSR).\n * Ps = 5 -> Status Report. Result (``OK'') is\n * CSI 0 n\n * Ps = 6 -> Report Cursor Position (CPR) [row;column].\n * Result is\n * CSI r ; c R\n * CSI ? Ps n\n * Device Status Report (DSR, DEC-specific).\n * Ps = 6 -> Report Cursor Position (CPR) [row;column] as CSI\n * ? r ; c R (assumes page is zero).\n * Ps = 1 5 -> Report Printer status as CSI ? 1 0 n (ready).\n * or CSI ? 1 1 n (not ready).\n * Ps = 2 5 -> Report UDK status as CSI ? 2 0 n (unlocked)\n * or CSI ? 2 1 n (locked).\n * Ps = 2 6 -> Report Keyboard status as\n * CSI ? 2 7 ; 1 ; 0 ; 0 n (North American).\n * The last two parameters apply to VT400 & up, and denote key-\n * board ready and LK01 respectively.\n * Ps = 5 3 -> Report Locator status as\n * CSI ? 5 3 n Locator available, if compiled-in, or\n * CSI ? 5 0 n No Locator, if not.\n *\n * @vt: #Y CSI DSR \"Device Status Report\" \"CSI Ps n\" \"Request cursor position (CPR) with `Ps` = 6.\"\n */\n public deviceStatus(params: IParams): void {\n switch (params.params[0]) {\n case 5:\n // status report\n this._coreService.triggerDataEvent(`${C0.ESC}[0n`);\n break;\n case 6:\n // cursor position\n const y = this._bufferService.buffer.y + 1;\n const x = this._bufferService.buffer.x + 1;\n this._coreService.triggerDataEvent(`${C0.ESC}[${y};${x}R`);\n break;\n }\n }\n\n // @vt: #P[Only CPR is supported.] CSI DECDSR \"DEC Device Status Report\" \"CSI ? Ps n\" \"Only CPR is supported (same as DSR).\"\n public deviceStatusPrivate(params: IParams): void {\n // modern xterm doesnt seem to\n // respond to any of these except ?6, 6, and 5\n switch (params.params[0]) {\n case 6:\n // cursor position\n const y = this._bufferService.buffer.y + 1;\n const x = this._bufferService.buffer.x + 1;\n this._coreService.triggerDataEvent(`${C0.ESC}[?${y};${x}R`);\n break;\n case 15:\n // no printer\n // this.handler(C0.ESC + '[?11n');\n break;\n case 25:\n // dont support user defined keys\n // this.handler(C0.ESC + '[?21n');\n break;\n case 26:\n // north american keyboard\n // this.handler(C0.ESC + '[?27;1;0;0n');\n break;\n case 53:\n // no dec locator/mouse\n // this.handler(C0.ESC + '[?50n');\n break;\n }\n }\n\n /**\n * CSI ! p Soft terminal reset (DECSTR).\n * http://vt100.net/docs/vt220-rm/table4-10.html\n *\n * @vt: #Y CSI DECSTR \"Soft Terminal Reset\" \"CSI ! p\" \"Reset several terminal attributes to initial state.\"\n * There are two terminal reset sequences - RIS and DECSTR. While RIS performs almost a full terminal bootstrap,\n * DECSTR only resets certain attributes. For most needs DECSTR should be sufficient.\n *\n * The following terminal attributes are reset to default values:\n * - IRM is reset (dafault = false)\n * - scroll margins are reset (default = viewport size)\n * - erase attributes are reset to default\n * - charsets are reset\n * - DECSC data is reset to initial values\n * - DECOM is reset to absolute mode\n *\n *\n * FIXME: there are several more attributes missing (see VT520 manual)\n */\n public softReset(params: IParams): void {\n this._coreService.isCursorHidden = false;\n this._onRequestSyncScrollBar.fire();\n this._bufferService.buffer.scrollTop = 0;\n this._bufferService.buffer.scrollBottom = this._bufferService.rows - 1;\n this._curAttrData = DEFAULT_ATTR_DATA.clone();\n this._coreService.reset();\n this._charsetService.reset();\n\n // reset DECSC data\n this._bufferService.buffer.savedX = 0;\n this._bufferService.buffer.savedY = this._bufferService.buffer.ybase;\n this._bufferService.buffer.savedCurAttrData.fg = this._curAttrData.fg;\n this._bufferService.buffer.savedCurAttrData.bg = this._curAttrData.bg;\n this._bufferService.buffer.savedCharset = this._charsetService.charset;\n\n // reset DECOM\n this._coreService.decPrivateModes.origin = false;\n }\n\n /**\n * CSI Ps SP q Set cursor style (DECSCUSR, VT520).\n * Ps = 0 -> blinking block.\n * Ps = 1 -> blinking block (default).\n * Ps = 2 -> steady block.\n * Ps = 3 -> blinking underline.\n * Ps = 4 -> steady underline.\n * Ps = 5 -> blinking bar (xterm).\n * Ps = 6 -> steady bar (xterm).\n *\n * @vt: #Y CSI DECSCUSR \"Set Cursor Style\" \"CSI Ps SP q\" \"Set cursor style.\"\n * Supported cursor styles:\n * - empty, 0 or 1: steady block\n * - 2: blink block\n * - 3: steady underline\n * - 4: blink underline\n * - 5: steady bar\n * - 6: blink bar\n */\n public setCursorStyle(params: IParams): void {\n const param = params.params[0] || 1;\n switch (param) {\n case 1:\n case 2:\n this._optionsService.options.cursorStyle = 'block';\n break;\n case 3:\n case 4:\n this._optionsService.options.cursorStyle = 'underline';\n break;\n case 5:\n case 6:\n this._optionsService.options.cursorStyle = 'bar';\n break;\n }\n const isBlinking = param % 2 === 1;\n this._optionsService.options.cursorBlink = isBlinking;\n }\n\n /**\n * CSI Ps ; Ps r\n * Set Scrolling Region [top;bottom] (default = full size of win-\n * dow) (DECSTBM).\n *\n * @vt: #Y CSI DECSTBM \"Set Top and Bottom Margin\" \"CSI Ps ; Ps r\" \"Set top and bottom margins of the viewport [top;bottom] (default = viewport size).\"\n */\n public setScrollRegion(params: IParams): void {\n const top = params.params[0] || 1;\n let bottom: number;\n\n if (params.length < 2 || (bottom = params.params[1]) > this._bufferService.rows || bottom === 0) {\n bottom = this._bufferService.rows;\n }\n\n if (bottom > top) {\n this._bufferService.buffer.scrollTop = top - 1;\n this._bufferService.buffer.scrollBottom = bottom - 1;\n this._setCursor(0, 0);\n }\n }\n\n /**\n * CSI Ps ; Ps ; Ps t - Various window manipulations and reports (xterm)\n *\n * Note: Only those listed below are supported. All others are left to integrators and\n * need special treatment based on the embedding environment.\n *\n * Ps = 1 4 supported\n * Report xterm text area size in pixels.\n * Result is CSI 4 ; height ; width t\n * Ps = 14 ; 2 not implemented\n * Ps = 16 supported\n * Report xterm character cell size in pixels.\n * Result is CSI 6 ; height ; width t\n * Ps = 18 supported\n * Report the size of the text area in characters.\n * Result is CSI 8 ; height ; width t\n * Ps = 20 supported\n * Report xterm window's icon label.\n * Result is OSC L label ST\n * Ps = 21 supported\n * Report xterm window's title.\n * Result is OSC l label ST\n * Ps = 22 ; 0 -> Save xterm icon and window title on stack. supported\n * Ps = 22 ; 1 -> Save xterm icon title on stack. supported\n * Ps = 22 ; 2 -> Save xterm window title on stack. supported\n * Ps = 23 ; 0 -> Restore xterm icon and window title from stack. supported\n * Ps = 23 ; 1 -> Restore xterm icon title from stack. supported\n * Ps = 23 ; 2 -> Restore xterm window title from stack. supported\n * Ps >= 24 not implemented\n */\n public windowOptions(params: IParams): void {\n if (!paramToWindowOption(params.params[0], this._optionsService.options.windowOptions)) {\n return;\n }\n const second = (params.length > 1) ? params.params[1] : 0;\n switch (params.params[0]) {\n case 14: // GetWinSizePixels, returns CSI 4 ; height ; width t\n if (second !== 2) {\n this._onRequestWindowsOptionsReport.fire(WindowsOptionsReportType.GET_WIN_SIZE_PIXELS);\n }\n break;\n case 16: // GetCellSizePixels, returns CSI 6 ; height ; width t\n this._onRequestWindowsOptionsReport.fire(WindowsOptionsReportType.GET_CELL_SIZE_PIXELS);\n break;\n case 18: // GetWinSizeChars, returns CSI 8 ; height ; width t\n if (this._bufferService) {\n this._coreService.triggerDataEvent(`${C0.ESC}[8;${this._bufferService.rows};${this._bufferService.cols}t`);\n }\n break;\n case 22: // PushTitle\n if (second === 0 || second === 2) {\n this._windowTitleStack.push(this._windowTitle);\n if (this._windowTitleStack.length > STACK_LIMIT) {\n this._windowTitleStack.shift();\n }\n }\n if (second === 0 || second === 1) {\n this._iconNameStack.push(this._iconName);\n if (this._iconNameStack.length > STACK_LIMIT) {\n this._iconNameStack.shift();\n }\n }\n break;\n case 23: // PopTitle\n if (second === 0 || second === 2) {\n if (this._windowTitleStack.length) {\n this.setTitle(this._windowTitleStack.pop()!);\n }\n }\n if (second === 0 || second === 1) {\n if (this._iconNameStack.length) {\n this.setIconName(this._iconNameStack.pop()!);\n }\n }\n break;\n }\n }\n\n\n /**\n * CSI s\n * ESC 7\n * Save cursor (ANSI.SYS).\n *\n * @vt: #P[TODO...] CSI SCOSC \"Save Cursor\" \"CSI s\" \"Save cursor position, charmap and text attributes.\"\n * @vt: #Y ESC SC \"Save Cursor\" \"ESC 7\" \"Save cursor position, charmap and text attributes.\"\n */\n public saveCursor(params?: IParams): void {\n this._bufferService.buffer.savedX = this._bufferService.buffer.x;\n this._bufferService.buffer.savedY = this._bufferService.buffer.ybase + this._bufferService.buffer.y;\n this._bufferService.buffer.savedCurAttrData.fg = this._curAttrData.fg;\n this._bufferService.buffer.savedCurAttrData.bg = this._curAttrData.bg;\n this._bufferService.buffer.savedCharset = this._charsetService.charset;\n }\n\n\n /**\n * CSI u\n * ESC 8\n * Restore cursor (ANSI.SYS).\n *\n * @vt: #P[TODO...] CSI SCORC \"Restore Cursor\" \"CSI u\" \"Restore cursor position, charmap and text attributes.\"\n * @vt: #Y ESC RC \"Restore Cursor\" \"ESC 8\" \"Restore cursor position, charmap and text attributes.\"\n */\n public restoreCursor(params?: IParams): void {\n this._bufferService.buffer.x = this._bufferService.buffer.savedX || 0;\n this._bufferService.buffer.y = Math.max(this._bufferService.buffer.savedY - this._bufferService.buffer.ybase, 0);\n this._curAttrData.fg = this._bufferService.buffer.savedCurAttrData.fg;\n this._curAttrData.bg = this._bufferService.buffer.savedCurAttrData.bg;\n this._charsetService.charset = (this as any)._savedCharset;\n if (this._bufferService.buffer.savedCharset) {\n this._charsetService.charset = this._bufferService.buffer.savedCharset;\n }\n this._restrictCursor();\n }\n\n\n /**\n * OSC 2; <data> ST (set window title)\n * Proxy to set window title.\n *\n * @vt: #P[Icon name is not exposed.] OSC 0 \"Set Windows Title and Icon Name\" \"OSC 0 ; Pt BEL\" \"Set window title and icon name.\"\n * Icon name is not supported. For Window Title see below.\n *\n * @vt: #Y OSC 2 \"Set Windows Title\" \"OSC 2 ; Pt BEL\" \"Set window title.\"\n * xterm.js does not manipulate the title directly, instead exposes changes via the event `Terminal.onTitleChange`.\n */\n public setTitle(data: string): void {\n this._windowTitle = data;\n this._onTitleChange.fire(data);\n }\n\n /**\n * OSC 1; <data> ST\n * Note: Icon name is not exposed.\n */\n public setIconName(data: string): void {\n this._iconName = data;\n }\n\n /**\n * ESC E\n * C1.NEL\n * DEC mnemonic: NEL (https://vt100.net/docs/vt510-rm/NEL)\n * Moves cursor to first position on next line.\n *\n * @vt: #Y C1 NEL \"Next Line\" \"\\x85\" \"Move the cursor to the beginning of the next row.\"\n * @vt: #Y ESC NEL \"Next Line\" \"ESC E\" \"Move the cursor to the beginning of the next row.\"\n */\n public nextLine(): void {\n this._bufferService.buffer.x = 0;\n this.index();\n }\n\n /**\n * ESC =\n * DEC mnemonic: DECKPAM (https://vt100.net/docs/vt510-rm/DECKPAM.html)\n * Enables the numeric keypad to send application sequences to the host.\n */\n public keypadApplicationMode(): void {\n this._logService.debug('Serial port requested application keypad.');\n this._coreService.decPrivateModes.applicationKeypad = true;\n this._onRequestSyncScrollBar.fire();\n }\n\n /**\n * ESC >\n * DEC mnemonic: DECKPNM (https://vt100.net/docs/vt510-rm/DECKPNM.html)\n * Enables the keypad to send numeric characters to the host.\n */\n public keypadNumericMode(): void {\n this._logService.debug('Switching back to normal keypad.');\n this._coreService.decPrivateModes.applicationKeypad = false;\n this._onRequestSyncScrollBar.fire();\n }\n\n /**\n * ESC % @\n * ESC % G\n * Select default character set. UTF-8 is not supported (string are unicode anyways)\n * therefore ESC % G does the same.\n */\n public selectDefaultCharset(): void {\n this._charsetService.setgLevel(0);\n this._charsetService.setgCharset(0, DEFAULT_CHARSET); // US (default)\n }\n\n /**\n * ESC ( C\n * Designate G0 Character Set, VT100, ISO 2022.\n * ESC ) C\n * Designate G1 Character Set (ISO 2022, VT100).\n * ESC * C\n * Designate G2 Character Set (ISO 2022, VT220).\n * ESC + C\n * Designate G3 Character Set (ISO 2022, VT220).\n * ESC - C\n * Designate G1 Character Set (VT300).\n * ESC . C\n * Designate G2 Character Set (VT300).\n * ESC / C\n * Designate G3 Character Set (VT300). C = A -> ISO Latin-1 Supplemental. - Supported?\n */\n public selectCharset(collectAndFlag: string): void {\n if (collectAndFlag.length !== 2) {\n this.selectDefaultCharset();\n return;\n }\n if (collectAndFlag[0] === '/') {\n return; // TODO: Is this supported?\n }\n this._charsetService.setgCharset(GLEVEL[collectAndFlag[0]], CHARSETS[collectAndFlag[1]] || DEFAULT_CHARSET);\n return;\n }\n\n /**\n * ESC D\n * C1.IND\n * DEC mnemonic: IND (https://vt100.net/docs/vt510-rm/IND.html)\n * Moves the cursor down one line in the same column.\n *\n * @vt: #Y C1 IND \"Index\" \"\\x84\" \"Move the cursor one line down scrolling if needed.\"\n * @vt: #Y ESC IND \"Index\" \"ESC D\" \"Move the cursor one line down scrolling if needed.\"\n */\n public index(): void {\n this._restrictCursor();\n const buffer = this._bufferService.buffer;\n this._bufferService.buffer.y++;\n if (buffer.y === buffer.scrollBottom + 1) {\n buffer.y--;\n this._onRequestScroll.fire(this._eraseAttrData());\n } else if (buffer.y >= this._bufferService.rows) {\n buffer.y = this._bufferService.rows - 1;\n }\n this._restrictCursor();\n }\n\n /**\n * ESC H\n * C1.HTS\n * DEC mnemonic: HTS (https://vt100.net/docs/vt510-rm/HTS.html)\n * Sets a horizontal tab stop at the column position indicated by\n * the value of the active column when the terminal receives an HTS.\n *\n * @vt: #Y C1 HTS \"Horizontal Tabulation Set\" \"\\x88\" \"Places a tab stop at the current cursor position.\"\n * @vt: #Y ESC HTS \"Horizontal Tabulation Set\" \"ESC H\" \"Places a tab stop at the current cursor position.\"\n */\n public tabSet(): void {\n this._bufferService.buffer.tabs[this._bufferService.buffer.x] = true;\n }\n\n /**\n * ESC M\n * C1.RI\n * DEC mnemonic: HTS\n * Moves the cursor up one line in the same column. If the cursor is at the top margin,\n * the page scrolls down.\n *\n * @vt: #Y ESC IR \"Reverse Index\" \"ESC M\" \"Move the cursor one line up scrolling if needed.\"\n */\n public reverseIndex(): void {\n this._restrictCursor();\n const buffer = this._bufferService.buffer;\n if (buffer.y === buffer.scrollTop) {\n // possibly move the code below to term.reverseScroll();\n // test: echo -ne '\\e[1;1H\\e[44m\\eM\\e[0m'\n // blankLine(true) is xterm/linux behavior\n const scrollRegionHeight = buffer.scrollBottom - buffer.scrollTop;\n buffer.lines.shiftElements(buffer.ybase + buffer.y, scrollRegionHeight, 1);\n buffer.lines.set(buffer.ybase + buffer.y, buffer.getBlankLine(this._eraseAttrData()));\n this._dirtyRowService.markRangeDirty(buffer.scrollTop, buffer.scrollBottom);\n } else {\n buffer.y--;\n this._restrictCursor(); // quickfix to not run out of bounds\n }\n }\n\n /**\n * ESC c\n * DEC mnemonic: RIS (https://vt100.net/docs/vt510-rm/RIS.html)\n * Reset to initial state.\n */\n public fullReset(): void {\n this._parser.reset();\n this._onRequestReset.fire();\n }\n\n public reset(): void {\n this._curAttrData = DEFAULT_ATTR_DATA.clone();\n this._eraseAttrDataInternal = DEFAULT_ATTR_DATA.clone();\n }\n\n /**\n * back_color_erase feature for xterm.\n */\n private _eraseAttrData(): IAttributeData {\n this._eraseAttrDataInternal.bg &= ~(Attributes.CM_MASK | 0xFFFFFF);\n this._eraseAttrDataInternal.bg |= this._curAttrData.bg & ~0xFC000000;\n return this._eraseAttrDataInternal;\n }\n\n /**\n * ESC n\n * ESC o\n * ESC |\n * ESC }\n * ESC ~\n * DEC mnemonic: LS (https://vt100.net/docs/vt510-rm/LS.html)\n * When you use a locking shift, the character set remains in GL or GR until\n * you use another locking shift. (partly supported)\n */\n public setgLevel(level: number): void {\n this._charsetService.setgLevel(level);\n }\n\n /**\n * ESC # 8\n * DEC mnemonic: DECALN (https://vt100.net/docs/vt510-rm/DECALN.html)\n * This control function fills the complete screen area with\n * a test pattern (E) used for adjusting screen alignment.\n *\n * @vt: #Y ESC DECALN \"Screen Alignment Pattern\" \"ESC # 8\" \"Fill viewport with a test pattern (E).\"\n */\n public screenAlignmentPattern(): void {\n // prepare cell data\n const cell = new CellData();\n cell.content = 1 << Content.WIDTH_SHIFT | 'E'.charCodeAt(0);\n cell.fg = this._curAttrData.fg;\n cell.bg = this._curAttrData.bg;\n\n const buffer = this._bufferService.buffer;\n\n this._setCursor(0, 0);\n for (let yOffset = 0; yOffset < this._bufferService.rows; ++yOffset) {\n const row = buffer.ybase + buffer.y + yOffset;\n const line = buffer.lines.get(row);\n if (line) {\n line.fill(cell);\n line.isWrapped = false;\n }\n }\n this._dirtyRowService.markAllDirty();\n this._setCursor(0, 0);\n }\n}\n","/**\n * Copyright (c) 2016 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { ICharset } from 'common/Types';\n\n/**\n * The character sets supported by the terminal. These enable several languages\n * to be represented within the terminal with only 8-bit encoding. See ISO 2022\n * for a discussion on character sets. Only VT100 character sets are supported.\n */\nexport const CHARSETS: { [key: string]: ICharset | undefined } = {};\n\n/**\n * The default character set, US.\n */\nexport const DEFAULT_CHARSET: ICharset | undefined = CHARSETS['B'];\n\n/**\n * DEC Special Character and Line Drawing Set.\n * Reference: http://vt100.net/docs/vt102-ug/table5-13.html\n * A lot of curses apps use this if they see TERM=xterm.\n * testing: echo -e '\\e(0a\\e(B'\n * The xterm output sometimes seems to conflict with the\n * reference above. xterm seems in line with the reference\n * when running vttest however.\n * The table below now uses xterm's output from vttest.\n */\nCHARSETS['0'] = {\n '`': '\\u25c6', // '◆'\n 'a': '\\u2592', // '▒'\n 'b': '\\u2409', // '␉' (HT)\n 'c': '\\u240c', // '␌' (FF)\n 'd': '\\u240d', // '␍' (CR)\n 'e': '\\u240a', // '␊' (LF)\n 'f': '\\u00b0', // '°'\n 'g': '\\u00b1', // '±'\n 'h': '\\u2424', // '␤' (NL)\n 'i': '\\u240b', // '␋' (VT)\n 'j': '\\u2518', // '┘'\n 'k': '\\u2510', // '┐'\n 'l': '\\u250c', // '┌'\n 'm': '\\u2514', // '└'\n 'n': '\\u253c', // '┼'\n 'o': '\\u23ba', // '⎺'\n 'p': '\\u23bb', // '⎻'\n 'q': '\\u2500', // '─'\n 'r': '\\u23bc', // '⎼'\n 's': '\\u23bd', // '⎽'\n 't': '\\u251c', // '├'\n 'u': '\\u2524', // '┤'\n 'v': '\\u2534', // '┴'\n 'w': '\\u252c', // '┬'\n 'x': '\\u2502', // '│'\n 'y': '\\u2264', // '≤'\n 'z': '\\u2265', // '≥'\n '{': '\\u03c0', // 'π'\n '|': '\\u2260', // '≠'\n '}': '\\u00a3', // '£'\n '~': '\\u00b7' // '·'\n};\n\n/**\n * British character set\n * ESC (A\n * Reference: http://vt100.net/docs/vt220-rm/table2-5.html\n */\nCHARSETS['A'] = {\n '#': '£'\n};\n\n/**\n * United States character set\n * ESC (B\n */\nCHARSETS['B'] = undefined;\n\n/**\n * Dutch character set\n * ESC (4\n * Reference: http://vt100.net/docs/vt220-rm/table2-6.html\n */\nCHARSETS['4'] = {\n '#': '£',\n '@': '¾',\n '[': 'ij',\n '\\\\': '½',\n ']': '|',\n '{': '¨',\n '|': 'f',\n '}': '¼',\n '~': '´'\n};\n\n/**\n * Finnish character set\n * ESC (C or ESC (5\n * Reference: http://vt100.net/docs/vt220-rm/table2-7.html\n */\nCHARSETS['C'] =\nCHARSETS['5'] = {\n '[': 'Ä',\n '\\\\': 'Ö',\n ']': 'Å',\n '^': 'Ü',\n '`': 'é',\n '{': 'ä',\n '|': 'ö',\n '}': 'å',\n '~': 'ü'\n};\n\n/**\n * French character set\n * ESC (R\n * Reference: http://vt100.net/docs/vt220-rm/table2-8.html\n */\nCHARSETS['R'] = {\n '#': '£',\n '@': 'à',\n '[': '°',\n '\\\\': 'ç',\n ']': '§',\n '{': 'é',\n '|': 'ù',\n '}': 'è',\n '~': '¨'\n};\n\n/**\n * French Canadian character set\n * ESC (Q\n * Reference: http://vt100.net/docs/vt220-rm/table2-9.html\n */\nCHARSETS['Q'] = {\n '@': 'à',\n '[': 'â',\n '\\\\': 'ç',\n ']': 'ê',\n '^': 'î',\n '`': 'ô',\n '{': 'é',\n '|': 'ù',\n '}': 'è',\n '~': 'û'\n};\n\n/**\n * German character set\n * ESC (K\n * Reference: http://vt100.net/docs/vt220-rm/table2-10.html\n */\nCHARSETS['K'] = {\n '@': '§',\n '[': 'Ä',\n '\\\\': 'Ö',\n ']': 'Ü',\n '{': 'ä',\n '|': 'ö',\n '}': 'ü',\n '~': 'ß'\n};\n\n/**\n * Italian character set\n * ESC (Y\n * Reference: http://vt100.net/docs/vt220-rm/table2-11.html\n */\nCHARSETS['Y'] = {\n '#': '£',\n '@': '§',\n '[': '°',\n '\\\\': 'ç',\n ']': 'é',\n '`': 'ù',\n '{': 'à',\n '|': 'ò',\n '}': 'è',\n '~': 'ì'\n};\n\n/**\n * Norwegian/Danish character set\n * ESC (E or ESC (6\n * Reference: http://vt100.net/docs/vt220-rm/table2-12.html\n */\nCHARSETS['E'] =\nCHARSETS['6'] = {\n '@': 'Ä',\n '[': 'Æ',\n '\\\\': 'Ø',\n ']': 'Å',\n '^': 'Ü',\n '`': 'ä',\n '{': 'æ',\n '|': 'ø',\n '}': 'å',\n '~': 'ü'\n};\n\n/**\n * Spanish character set\n * ESC (Z\n * Reference: http://vt100.net/docs/vt220-rm/table2-13.html\n */\nCHARSETS['Z'] = {\n '#': '£',\n '@': '§',\n '[': '¡',\n '\\\\': 'Ñ',\n ']': '¿',\n '{': '°',\n '|': 'ñ',\n '}': 'ç'\n};\n\n/**\n * Swedish character set\n * ESC (H or ESC (7\n * Reference: http://vt100.net/docs/vt220-rm/table2-14.html\n */\nCHARSETS['H'] =\nCHARSETS['7'] = {\n '@': 'É',\n '[': 'Ä',\n '\\\\': 'Ö',\n ']': 'Å',\n '^': 'Ü',\n '`': 'é',\n '{': 'ä',\n '|': 'ö',\n '}': 'å',\n '~': 'ü'\n};\n\n/**\n * Swiss character set\n * ESC (=\n * Reference: http://vt100.net/docs/vt220-rm/table2-15.html\n */\nCHARSETS['='] = {\n '#': 'ù',\n '@': 'à',\n '[': 'é',\n '\\\\': 'ç',\n ']': 'ê',\n '^': 'î',\n // eslint-disable-next-line @typescript-eslint/naming-convention\n '_': 'è',\n '`': 'ô',\n '{': 'ä',\n '|': 'ö',\n '}': 'ü',\n '~': 'û'\n};\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\nimport { IParams, ParamsArray } from 'common/parser/Types';\n\n// max value supported for a single param/subparam (clamped to positive int32 range)\nconst MAX_VALUE = 0x7FFFFFFF;\n// max allowed subparams for a single sequence (hardcoded limitation)\nconst MAX_SUBPARAMS = 256;\n\n/**\n * Params storage class.\n * This type is used by the parser to accumulate sequence parameters and sub parameters\n * and transmit them to the input handler actions.\n *\n * NOTES:\n * - params object for action handlers is borrowed, use `.toArray` or `.clone` to get a copy\n * - never read beyond `params.length - 1` (likely to contain arbitrary data)\n * - `.getSubParams` returns a borrowed typed array, use `.getSubParamsAll` for cloned sub params\n * - hardcoded limitations:\n * - max. value for a single (sub) param is 2^31 - 1 (greater values are clamped to that)\n * - max. 256 sub params possible\n * - negative values are not allowed beside -1 (placeholder for default value)\n *\n * About ZDM (Zero Default Mode):\n * ZDM is not orchestrated by this class. If the parser is in ZDM,\n * it should add 0 for empty params, otherwise -1. This does not apply\n * to subparams, empty subparams should always be added with -1.\n */\nexport class Params implements IParams {\n // params store and length\n public params: Int32Array;\n public length: number;\n\n // sub params store and length\n protected _subParams: Int32Array;\n protected _subParamsLength: number;\n\n // sub params offsets from param: param idx --> [start, end] offset\n private _subParamsIdx: Uint16Array;\n private _rejectDigits: boolean;\n private _rejectSubDigits: boolean;\n private _digitIsSub: boolean;\n\n /**\n * Create a `Params` type from JS array representation.\n */\n public static fromArray(values: ParamsArray): Params {\n const params = new Params();\n if (!values.length) {\n return params;\n }\n // skip leading sub params\n for (let i = (values[0] instanceof Array) ? 1 : 0; i < values.length; ++i) {\n const value = values[i];\n if (value instanceof Array) {\n for (let k = 0; k < value.length; ++k) {\n params.addSubParam(value[k]);\n }\n } else {\n params.addParam(value);\n }\n }\n return params;\n }\n\n /**\n * @param maxLength max length of storable parameters\n * @param maxSubParamsLength max length of storable sub parameters\n */\n constructor(public maxLength: number = 32, public maxSubParamsLength: number = 32) {\n if (maxSubParamsLength > MAX_SUBPARAMS) {\n throw new Error('maxSubParamsLength must not be greater than 256');\n }\n this.params = new Int32Array(maxLength);\n this.length = 0;\n this._subParams = new Int32Array(maxSubParamsLength);\n this._subParamsLength = 0;\n this._subParamsIdx = new Uint16Array(maxLength);\n this._rejectDigits = false;\n this._rejectSubDigits = false;\n this._digitIsSub = false;\n }\n\n /**\n * Clone object.\n */\n public clone(): Params {\n const newParams = new Params(this.maxLength, this.maxSubParamsLength);\n newParams.params.set(this.params);\n newParams.length = this.length;\n newParams._subParams.set(this._subParams);\n newParams._subParamsLength = this._subParamsLength;\n newParams._subParamsIdx.set(this._subParamsIdx);\n newParams._rejectDigits = this._rejectDigits;\n newParams._rejectSubDigits = this._rejectSubDigits;\n newParams._digitIsSub = this._digitIsSub;\n return newParams;\n }\n\n /**\n * Get a JS array representation of the current parameters and sub parameters.\n * The array is structured as follows:\n * sequence: \"1;2:3:4;5::6\"\n * array : [1, 2, [3, 4], 5, [-1, 6]]\n */\n public toArray(): ParamsArray {\n const res: ParamsArray = [];\n for (let i = 0; i < this.length; ++i) {\n res.push(this.params[i]);\n const start = this._subParamsIdx[i] >> 8;\n const end = this._subParamsIdx[i] & 0xFF;\n if (end - start > 0) {\n res.push(Array.prototype.slice.call(this._subParams, start, end));\n }\n }\n return res;\n }\n\n /**\n * Reset to initial empty state.\n */\n public reset(): void {\n this.length = 0;\n this._subParamsLength = 0;\n this._rejectDigits = false;\n this._rejectSubDigits = false;\n this._digitIsSub = false;\n }\n\n /**\n * Add a parameter value.\n * `Params` only stores up to `maxLength` parameters, any later\n * parameter will be ignored.\n * Note: VT devices only stored up to 16 values, xterm seems to\n * store up to 30.\n */\n public addParam(value: number): void {\n this._digitIsSub = false;\n if (this.length >= this.maxLength) {\n this._rejectDigits = true;\n return;\n }\n if (value < -1) {\n throw new Error('values lesser than -1 are not allowed');\n }\n this._subParamsIdx[this.length] = this._subParamsLength << 8 | this._subParamsLength;\n this.params[this.length++] = value > MAX_VALUE ? MAX_VALUE : value;\n }\n\n /**\n * Add a sub parameter value.\n * The sub parameter is automatically associated with the last parameter value.\n * Thus it is not possible to add a subparameter without any parameter added yet.\n * `Params` only stores up to `subParamsLength` sub parameters, any later\n * sub parameter will be ignored.\n */\n public addSubParam(value: number): void {\n this._digitIsSub = true;\n if (!this.length) {\n return;\n }\n if (this._rejectDigits || this._subParamsLength >= this.maxSubParamsLength) {\n this._rejectSubDigits = true;\n return;\n }\n if (value < -1) {\n throw new Error('values lesser than -1 are not allowed');\n }\n this._subParams[this._subParamsLength++] = value > MAX_VALUE ? MAX_VALUE : value;\n this._subParamsIdx[this.length - 1]++;\n }\n\n /**\n * Whether parameter at index `idx` has sub parameters.\n */\n public hasSubParams(idx: number): boolean {\n return ((this._subParamsIdx[idx] & 0xFF) - (this._subParamsIdx[idx] >> 8) > 0);\n }\n\n /**\n * Return sub parameters for parameter at index `idx`.\n * Note: The values are borrowed, thus you need to copy\n * the values if you need to hold them in nonlocal scope.\n */\n public getSubParams(idx: number): Int32Array | null {\n const start = this._subParamsIdx[idx] >> 8;\n const end = this._subParamsIdx[idx] & 0xFF;\n if (end - start > 0) {\n return this._subParams.subarray(start, end);\n }\n return null;\n }\n\n /**\n * Return all sub parameters as {idx: subparams} mapping.\n * Note: The values are not borrowed.\n */\n public getSubParamsAll(): {[idx: number]: Int32Array} {\n const result: {[idx: number]: Int32Array} = {};\n for (let i = 0; i < this.length; ++i) {\n const start = this._subParamsIdx[i] >> 8;\n const end = this._subParamsIdx[i] & 0xFF;\n if (end - start > 0) {\n result[i] = this._subParams.slice(start, end);\n }\n }\n return result;\n }\n\n /**\n * Add a single digit value to current parameter.\n * This is used by the parser to account digits on a char by char basis.\n */\n public addDigit(value: number): void {\n let length;\n if (this._rejectDigits\n || !(length = this._digitIsSub ? this._subParamsLength : this.length)\n || (this._digitIsSub && this._rejectSubDigits)\n ) {\n return;\n }\n\n const store = this._digitIsSub ? this._subParams : this.params;\n const cur = store[length - 1];\n store[length - 1] = ~cur ? Math.min(cur * 10 + value, MAX_VALUE) : value;\n }\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IOscHandler, IHandlerCollection, OscFallbackHandlerType, IOscParser } from 'common/parser/Types';\nimport { OscState, PAYLOAD_LIMIT } from 'common/parser/Constants';\nimport { utf32ToString } from 'common/input/TextDecoder';\nimport { IDisposable } from 'common/Types';\n\n\nexport class OscParser implements IOscParser {\n private _state = OscState.START;\n private _id = -1;\n private _handlers: IHandlerCollection<IOscHandler> = Object.create(null);\n private _handlerFb: OscFallbackHandlerType = () => { };\n\n public addHandler(ident: number, handler: IOscHandler): IDisposable {\n if (this._handlers[ident] === undefined) {\n this._handlers[ident] = [];\n }\n const handlerList = this._handlers[ident];\n handlerList.push(handler);\n return {\n dispose: () => {\n const handlerIndex = handlerList.indexOf(handler);\n if (handlerIndex !== -1) {\n handlerList.splice(handlerIndex, 1);\n }\n }\n };\n }\n public setHandler(ident: number, handler: IOscHandler): void {\n this._handlers[ident] = [handler];\n }\n public clearHandler(ident: number): void {\n if (this._handlers[ident]) delete this._handlers[ident];\n }\n public setHandlerFallback(handler: OscFallbackHandlerType): void {\n this._handlerFb = handler;\n }\n\n public dispose(): void {\n this._handlers = Object.create(null);\n this._handlerFb = () => {};\n }\n\n public reset(): void {\n // cleanup handlers if payload was already sent\n if (this._state === OscState.PAYLOAD) {\n this.end(false);\n }\n this._id = -1;\n this._state = OscState.START;\n }\n\n private _start(): void {\n const handlers = this._handlers[this._id];\n if (!handlers) {\n this._handlerFb(this._id, 'START');\n } else {\n for (let j = handlers.length - 1; j >= 0; j--) {\n handlers[j].start();\n }\n }\n }\n\n private _put(data: Uint32Array, start: number, end: number): void {\n const handlers = this._handlers[this._id];\n if (!handlers) {\n this._handlerFb(this._id, 'PUT', utf32ToString(data, start, end));\n } else {\n for (let j = handlers.length - 1; j >= 0; j--) {\n handlers[j].put(data, start, end);\n }\n }\n }\n\n private _end(success: boolean): void {\n // other than the old code we always have to call .end\n // to keep the bubbling we use `success` to indicate\n // whether a handler should execute\n const handlers = this._handlers[this._id];\n if (!handlers) {\n this._handlerFb(this._id, 'END', success);\n } else {\n let j = handlers.length - 1;\n for (; j >= 0; j--) {\n if (handlers[j].end(success) !== false) {\n break;\n }\n }\n j--;\n // cleanup left over handlers\n for (; j >= 0; j--) {\n handlers[j].end(false);\n }\n }\n }\n\n public start(): void {\n // always reset leftover handlers\n this.reset();\n this._id = -1;\n this._state = OscState.ID;\n }\n\n /**\n * Put data to current OSC command.\n * Expects the identifier of the OSC command in the form\n * OSC id ; payload ST/BEL\n * Payload chunks are not further processed and get\n * directly passed to the handlers.\n */\n public put(data: Uint32Array, start: number, end: number): void {\n if (this._state === OscState.ABORT) {\n return;\n }\n if (this._state === OscState.ID) {\n while (start < end) {\n const code = data[start++];\n if (code === 0x3b) {\n this._state = OscState.PAYLOAD;\n this._start();\n break;\n }\n if (code < 0x30 || 0x39 < code) {\n this._state = OscState.ABORT;\n return;\n }\n if (this._id === -1) {\n this._id = 0;\n }\n this._id = this._id * 10 + code - 48;\n }\n }\n if (this._state === OscState.PAYLOAD && end - start > 0) {\n this._put(data, start, end);\n }\n }\n\n /**\n * Indicates end of an OSC command.\n * Whether the OSC got aborted or finished normally\n * is indicated by `success`.\n */\n public end(success: boolean): void {\n if (this._state === OscState.START) {\n return;\n }\n // do nothing if command was faulty\n if (this._state !== OscState.ABORT) {\n // if we are still in ID state and get an early end\n // means that the command has no payload thus we still have\n // to announce START and send END right after\n if (this._state === OscState.ID) {\n this._start();\n }\n this._end(success);\n }\n this._id = -1;\n this._state = OscState.START;\n }\n}\n\n/**\n * Convenient class to allow attaching string based handler functions\n * as OSC handlers.\n */\nexport class OscHandler implements IOscHandler {\n private _data = '';\n private _hitLimit: boolean = false;\n\n constructor(private _handler: (data: string) => any) {}\n\n public start(): void {\n this._data = '';\n this._hitLimit = false;\n }\n\n public put(data: Uint32Array, start: number, end: number): void {\n if (this._hitLimit) {\n return;\n }\n this._data += utf32ToString(data, start, end);\n if (this._data.length > PAYLOAD_LIMIT) {\n this._data = '';\n this._hitLimit = true;\n }\n }\n\n public end(success: boolean): any {\n let ret;\n if (this._hitLimit) {\n ret = false;\n } else if (success) {\n ret = this._handler(this._data);\n }\n this._data = '';\n this._hitLimit = false;\n return ret;\n }\n}\n","/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\n/**\n * Internal states of EscapeSequenceParser.\n */\nexport const enum ParserState {\n GROUND = 0,\n ESCAPE = 1,\n ESCAPE_INTERMEDIATE = 2,\n CSI_ENTRY = 3,\n CSI_PARAM = 4,\n CSI_INTERMEDIATE = 5,\n CSI_IGNORE = 6,\n SOS_PM_APC_STRING = 7,\n OSC_STRING = 8,\n DCS_ENTRY = 9,\n DCS_PARAM = 10,\n DCS_IGNORE = 11,\n DCS_INTERMEDIATE = 12,\n DCS_PASSTHROUGH = 13\n}\n\n/**\n* Internal actions of EscapeSequenceParser.\n*/\nexport const enum ParserAction {\n IGNORE = 0,\n ERROR = 1,\n PRINT = 2,\n EXECUTE = 3,\n OSC_START = 4,\n OSC_PUT = 5,\n OSC_END = 6,\n CSI_DISPATCH = 7,\n PARAM = 8,\n COLLECT = 9,\n ESC_DISPATCH = 10,\n CLEAR = 11,\n DCS_HOOK = 12,\n DCS_PUT = 13,\n DCS_UNHOOK = 14\n}\n\n/**\n * Internal states of OscParser.\n */\nexport const enum OscState {\n START = 0,\n ID = 1,\n PAYLOAD = 2,\n ABORT = 3\n}\n\n// payload limit for OSC and DCS\nexport const PAYLOAD_LIMIT = 10000000;\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IDisposable } from 'common/Types';\nimport { IDcsHandler, IParams, IHandlerCollection, IDcsParser, DcsFallbackHandlerType } from 'common/parser/Types';\nimport { utf32ToString } from 'common/input/TextDecoder';\nimport { Params } from 'common/parser/Params';\nimport { PAYLOAD_LIMIT } from 'common/parser/Constants';\n\nconst EMPTY_HANDLERS: IDcsHandler[] = [];\n\nexport class DcsParser implements IDcsParser {\n private _handlers: IHandlerCollection<IDcsHandler> = Object.create(null);\n private _active: IDcsHandler[] = EMPTY_HANDLERS;\n private _ident: number = 0;\n private _handlerFb: DcsFallbackHandlerType = () => {};\n\n public dispose(): void {\n this._handlers = Object.create(null);\n this._handlerFb = () => {};\n }\n\n public addHandler(ident: number, handler: IDcsHandler): IDisposable {\n if (this._handlers[ident] === undefined) {\n this._handlers[ident] = [];\n }\n const handlerList = this._handlers[ident];\n handlerList.push(handler);\n return {\n dispose: () => {\n const handlerIndex = handlerList.indexOf(handler);\n if (handlerIndex !== -1) {\n handlerList.splice(handlerIndex, 1);\n }\n }\n };\n }\n\n public setHandler(ident: number, handler: IDcsHandler): void {\n this._handlers[ident] = [handler];\n }\n\n public clearHandler(ident: number): void {\n if (this._handlers[ident]) delete this._handlers[ident];\n }\n\n public setHandlerFallback(handler: DcsFallbackHandlerType): void {\n this._handlerFb = handler;\n }\n\n public reset(): void {\n if (this._active.length) {\n this.unhook(false);\n }\n this._active = EMPTY_HANDLERS;\n this._ident = 0;\n }\n\n public hook(ident: number, params: IParams): void {\n // always reset leftover handlers\n this.reset();\n this._ident = ident;\n this._active = this._handlers[ident] || EMPTY_HANDLERS;\n if (!this._active.length) {\n this._handlerFb(this._ident, 'HOOK', params);\n } else {\n for (let j = this._active.length - 1; j >= 0; j--) {\n this._active[j].hook(params);\n }\n }\n }\n\n public put(data: Uint32Array, start: number, end: number): void {\n if (!this._active.length) {\n this._handlerFb(this._ident, 'PUT', utf32ToString(data, start, end));\n } else {\n for (let j = this._active.length - 1; j >= 0; j--) {\n this._active[j].put(data, start, end);\n }\n }\n }\n\n public unhook(success: boolean): void {\n if (!this._active.length) {\n this._handlerFb(this._ident, 'UNHOOK', success);\n } else {\n let j = this._active.length - 1;\n for (; j >= 0; j--) {\n if (this._active[j].unhook(success) !== false) {\n break;\n }\n }\n j--;\n // cleanup left over handlers\n for (; j >= 0; j--) {\n this._active[j].unhook(false);\n }\n }\n this._active = EMPTY_HANDLERS;\n this._ident = 0;\n }\n}\n\n/**\n * Convenient class to create a DCS handler from a single callback function.\n * Note: The payload is currently limited to 50 MB (hardcoded).\n */\nexport class DcsHandler implements IDcsHandler {\n private _data = '';\n private _params: IParams | undefined;\n private _hitLimit: boolean = false;\n\n constructor(private _handler: (data: string, params: IParams) => any) {}\n\n public hook(params: IParams): void {\n this._params = params.clone();\n this._data = '';\n this._hitLimit = false;\n }\n\n public put(data: Uint32Array, start: number, end: number): void {\n if (this._hitLimit) {\n return;\n }\n this._data += utf32ToString(data, start, end);\n if (this._data.length > PAYLOAD_LIMIT) {\n this._data = '';\n this._hitLimit = true;\n }\n }\n\n public unhook(success: boolean): any {\n let ret;\n if (this._hitLimit) {\n ret = false;\n } else if (success) {\n ret = this._handler(this._data, this._params || new Params());\n }\n this._params = undefined;\n this._data = '';\n this._hitLimit = false;\n return ret;\n }\n}\n","/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { generateConfig, configEquals } from 'browser/renderer/atlas/CharAtlasUtils';\nimport { BaseCharAtlas } from 'browser/renderer/atlas/BaseCharAtlas';\nimport { DynamicCharAtlas } from 'browser/renderer/atlas/DynamicCharAtlas';\nimport { ICharAtlasConfig } from 'browser/renderer/atlas/Types';\nimport { IColorSet } from 'browser/Types';\nimport { ITerminalOptions } from 'common/services/Services';\n\ninterface ICharAtlasCacheEntry {\n atlas: BaseCharAtlas;\n config: ICharAtlasConfig;\n // N.B. This implementation potentially holds onto copies of the terminal forever, so\n // this may cause memory leaks.\n ownedBy: number[];\n}\n\nconst charAtlasCache: ICharAtlasCacheEntry[] = [];\n\n/**\n * Acquires a char atlas, either generating a new one or returning an existing\n * one that is in use by another terminal.\n */\nexport function acquireCharAtlas(\n options: ITerminalOptions,\n rendererId: number,\n colors: IColorSet,\n scaledCharWidth: number,\n scaledCharHeight: number\n): BaseCharAtlas {\n const newConfig = generateConfig(scaledCharWidth, scaledCharHeight, options, colors);\n\n // Check to see if the renderer already owns this config\n for (let i = 0; i < charAtlasCache.length; i++) {\n const entry = charAtlasCache[i];\n const ownedByIndex = entry.ownedBy.indexOf(rendererId);\n if (ownedByIndex >= 0) {\n if (configEquals(entry.config, newConfig)) {\n return entry.atlas;\n }\n // The configs differ, release the renderer from the entry\n if (entry.ownedBy.length === 1) {\n entry.atlas.dispose();\n charAtlasCache.splice(i, 1);\n } else {\n entry.ownedBy.splice(ownedByIndex, 1);\n }\n break;\n }\n }\n\n // Try match a char atlas from the cache\n for (let i = 0; i < charAtlasCache.length; i++) {\n const entry = charAtlasCache[i];\n if (configEquals(entry.config, newConfig)) {\n // Add the renderer to the cache entry and return\n entry.ownedBy.push(rendererId);\n return entry.atlas;\n }\n }\n\n const newEntry: ICharAtlasCacheEntry = {\n atlas: new DynamicCharAtlas(\n document,\n newConfig\n ),\n config: newConfig,\n ownedBy: [rendererId]\n };\n charAtlasCache.push(newEntry);\n return newEntry.atlas;\n}\n\n/**\n * Removes a terminal reference from the cache, allowing its memory to be freed.\n */\nexport function removeTerminalFromCache(rendererId: number): void {\n for (let i = 0; i < charAtlasCache.length; i++) {\n const index = charAtlasCache[i].ownedBy.indexOf(rendererId);\n if (index !== -1) {\n if (charAtlasCache[i].ownedBy.length === 1) {\n // Remove the cache entry if it's the only renderer\n charAtlasCache[i].atlas.dispose();\n charAtlasCache.splice(i, 1);\n } else {\n // Remove the reference from the cache entry\n charAtlasCache[i].ownedBy.splice(index, 1);\n }\n break;\n }\n }\n}\n","/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { ICharAtlasConfig } from 'browser/renderer/atlas/Types';\nimport { DEFAULT_COLOR } from 'common/buffer/Constants';\nimport { IColorSet, IPartialColorSet } from 'browser/Types';\nimport { ITerminalOptions } from 'common/services/Services';\n\nexport function generateConfig(scaledCharWidth: number, scaledCharHeight: number, options: ITerminalOptions, colors: IColorSet): ICharAtlasConfig {\n // null out some fields that don't matter\n const clonedColors = <IPartialColorSet>{\n foreground: colors.foreground,\n background: colors.background,\n cursor: undefined,\n cursorAccent: undefined,\n selection: undefined,\n // For the static char atlas, we only use the first 16 colors, but we need all 256 for the\n // dynamic character atlas.\n ansi: colors.ansi.slice(0, 16)\n };\n return {\n devicePixelRatio: window.devicePixelRatio,\n scaledCharWidth,\n scaledCharHeight,\n fontFamily: options.fontFamily,\n fontSize: options.fontSize,\n fontWeight: options.fontWeight,\n fontWeightBold: options.fontWeightBold,\n allowTransparency: options.allowTransparency,\n colors: clonedColors\n };\n}\n\nexport function configEquals(a: ICharAtlasConfig, b: ICharAtlasConfig): boolean {\n for (let i = 0; i < a.colors.ansi.length; i++) {\n if (a.colors.ansi[i].rgba !== b.colors.ansi[i].rgba) {\n return false;\n }\n }\n return a.devicePixelRatio === b.devicePixelRatio &&\n a.fontFamily === b.fontFamily &&\n a.fontSize === b.fontSize &&\n a.fontWeight === b.fontWeight &&\n a.fontWeightBold === b.fontWeightBold &&\n a.allowTransparency === b.allowTransparency &&\n a.scaledCharWidth === b.scaledCharWidth &&\n a.scaledCharHeight === b.scaledCharHeight &&\n a.colors.foreground === b.colors.foreground &&\n a.colors.background === b.colors.background;\n}\n\nexport function is256Color(colorCode: number): boolean {\n return colorCode < DEFAULT_COLOR;\n}\n","/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IColorManager, IColor, IColorSet, IColorContrastCache } from 'browser/Types';\nimport { ITheme } from 'common/services/Services';\nimport { channels, color, css } from 'browser/Color';\nimport { ColorContrastCache } from 'browser/ColorContrastCache';\n\nconst DEFAULT_FOREGROUND = css.toColor('#ffffff');\nconst DEFAULT_BACKGROUND = css.toColor('#000000');\nconst DEFAULT_CURSOR = css.toColor('#ffffff');\nconst DEFAULT_CURSOR_ACCENT = css.toColor('#000000');\nconst DEFAULT_SELECTION = {\n css: 'rgba(255, 255, 255, 0.3)',\n rgba: 0xFFFFFF4D\n};\n\n// An IIFE to generate DEFAULT_ANSI_COLORS. Do not mutate DEFAULT_ANSI_COLORS, instead make a copy\n// and mutate that.\nexport const DEFAULT_ANSI_COLORS = (() => {\n const colors = [\n // dark:\n css.toColor('#2e3436'),\n css.toColor('#cc0000'),\n css.toColor('#4e9a06'),\n css.toColor('#c4a000'),\n css.toColor('#3465a4'),\n css.toColor('#75507b'),\n css.toColor('#06989a'),\n css.toColor('#d3d7cf'),\n // bright:\n css.toColor('#555753'),\n css.toColor('#ef2929'),\n css.toColor('#8ae234'),\n css.toColor('#fce94f'),\n css.toColor('#729fcf'),\n css.toColor('#ad7fa8'),\n css.toColor('#34e2e2'),\n css.toColor('#eeeeec')\n ];\n\n // Fill in the remaining 240 ANSI colors.\n // Generate colors (16-231)\n const v = [0x00, 0x5f, 0x87, 0xaf, 0xd7, 0xff];\n for (let i = 0; i < 216; i++) {\n const r = v[(i / 36) % 6 | 0];\n const g = v[(i / 6) % 6 | 0];\n const b = v[i % 6];\n colors.push({\n css: channels.toCss(r, g, b),\n rgba: channels.toRgba(r, g, b)\n });\n }\n\n // Generate greys (232-255)\n for (let i = 0; i < 24; i++) {\n const c = 8 + i * 10;\n colors.push({\n css: channels.toCss(c, c, c),\n rgba: channels.toRgba(c, c, c)\n });\n }\n\n return colors;\n})();\n\n/**\n * Manages the source of truth for a terminal's colors.\n */\nexport class ColorManager implements IColorManager {\n public colors: IColorSet;\n private _ctx: CanvasRenderingContext2D;\n private _litmusColor: CanvasGradient;\n private _contrastCache: IColorContrastCache;\n\n constructor(document: Document, public allowTransparency: boolean) {\n const canvas = document.createElement('canvas');\n canvas.width = 1;\n canvas.height = 1;\n const ctx = canvas.getContext('2d');\n if (!ctx) {\n throw new Error('Could not get rendering context');\n }\n this._ctx = ctx;\n this._ctx.globalCompositeOperation = 'copy';\n this._litmusColor = this._ctx.createLinearGradient(0, 0, 1, 1);\n this._contrastCache = new ColorContrastCache();\n this.colors = {\n foreground: DEFAULT_FOREGROUND,\n background: DEFAULT_BACKGROUND,\n cursor: DEFAULT_CURSOR,\n cursorAccent: DEFAULT_CURSOR_ACCENT,\n selectionTransparent: DEFAULT_SELECTION,\n selectionOpaque: color.blend(DEFAULT_BACKGROUND, DEFAULT_SELECTION),\n ansi: DEFAULT_ANSI_COLORS.slice(),\n contrastCache: this._contrastCache\n };\n }\n\n public onOptionsChange(key: string): void {\n if (key === 'minimumContrastRatio') {\n this._contrastCache.clear();\n }\n }\n\n /**\n * Sets the terminal's theme.\n * @param theme The theme to use. If a partial theme is provided then default\n * colors will be used where colors are not defined.\n */\n public setTheme(theme: ITheme = {}): void {\n this.colors.foreground = this._parseColor(theme.foreground, DEFAULT_FOREGROUND);\n this.colors.background = this._parseColor(theme.background, DEFAULT_BACKGROUND);\n this.colors.cursor = this._parseColor(theme.cursor, DEFAULT_CURSOR, true);\n this.colors.cursorAccent = this._parseColor(theme.cursorAccent, DEFAULT_CURSOR_ACCENT, true);\n this.colors.selectionTransparent = this._parseColor(theme.selection, DEFAULT_SELECTION, true);\n this.colors.selectionOpaque = color.blend(this.colors.background, this.colors.selectionTransparent);\n /**\n * If selection color is opaque, blend it with background with 0.3 opacity\n * Issue #2737\n */\n if (color.isOpaque(this.colors.selectionTransparent)) {\n const opacity = 0.3;\n this.colors.selectionTransparent = color.opacity(this.colors.selectionTransparent, opacity);\n }\n this.colors.ansi[0] = this._parseColor(theme.black, DEFAULT_ANSI_COLORS[0]);\n this.colors.ansi[1] = this._parseColor(theme.red, DEFAULT_ANSI_COLORS[1]);\n this.colors.ansi[2] = this._parseColor(theme.green, DEFAULT_ANSI_COLORS[2]);\n this.colors.ansi[3] = this._parseColor(theme.yellow, DEFAULT_ANSI_COLORS[3]);\n this.colors.ansi[4] = this._parseColor(theme.blue, DEFAULT_ANSI_COLORS[4]);\n this.colors.ansi[5] = this._parseColor(theme.magenta, DEFAULT_ANSI_COLORS[5]);\n this.colors.ansi[6] = this._parseColor(theme.cyan, DEFAULT_ANSI_COLORS[6]);\n this.colors.ansi[7] = this._parseColor(theme.white, DEFAULT_ANSI_COLORS[7]);\n this.colors.ansi[8] = this._parseColor(theme.brightBlack, DEFAULT_ANSI_COLORS[8]);\n this.colors.ansi[9] = this._parseColor(theme.brightRed, DEFAULT_ANSI_COLORS[9]);\n this.colors.ansi[10] = this._parseColor(theme.brightGreen, DEFAULT_ANSI_COLORS[10]);\n this.colors.ansi[11] = this._parseColor(theme.brightYellow, DEFAULT_ANSI_COLORS[11]);\n this.colors.ansi[12] = this._parseColor(theme.brightBlue, DEFAULT_ANSI_COLORS[12]);\n this.colors.ansi[13] = this._parseColor(theme.brightMagenta, DEFAULT_ANSI_COLORS[13]);\n this.colors.ansi[14] = this._parseColor(theme.brightCyan, DEFAULT_ANSI_COLORS[14]);\n this.colors.ansi[15] = this._parseColor(theme.brightWhite, DEFAULT_ANSI_COLORS[15]);\n // Clear our the cache\n this._contrastCache.clear();\n }\n\n private _parseColor(\n css: string | undefined,\n fallback: IColor,\n allowTransparency: boolean = this.allowTransparency\n ): IColor {\n if (css === undefined) {\n return fallback;\n }\n\n // If parsing the value results in failure, then it must be ignored, and the attribute must\n // retain its previous value.\n // -- https://html.spec.whatwg.org/multipage/canvas.html#fill-and-stroke-styles\n this._ctx.fillStyle = this._litmusColor;\n this._ctx.fillStyle = css;\n if (typeof this._ctx.fillStyle !== 'string') {\n console.warn(`Color: ${css} is invalid using fallback ${fallback.css}`);\n return fallback;\n }\n\n this._ctx.fillRect(0, 0, 1, 1);\n const data = this._ctx.getImageData(0, 0, 1, 1).data;\n\n // Check if the printed color was transparent\n if (data[3] !== 0xFF) {\n if (!allowTransparency) {\n // Ideally we'd just ignore the alpha channel, but...\n //\n // Browsers may not give back exactly the same RGB values we put in, because most/all\n // convert the color to a pre-multiplied representation. getImageData converts that back to\n // a un-premultipled representation, but the precision loss may make the RGB channels unuable\n // on their own.\n //\n // E.g. In Chrome #12345610 turns into #10305010, and in the extreme case, 0xFFFFFF00 turns\n // into 0x00000000.\n //\n // \"Note: Due to the lossy nature of converting to and from premultiplied alpha color values,\n // pixels that have just been set using putImageData() might be returned to an equivalent\n // getImageData() as different values.\"\n // -- https://html.spec.whatwg.org/multipage/canvas.html#pixel-manipulation\n //\n // So let's just use the fallback color in this case instead.\n console.warn(\n `Color: ${css} is using transparency, but allowTransparency is false. ` +\n `Using fallback ${fallback.css}.`\n );\n return fallback;\n }\n\n // https://html.spec.whatwg.org/multipage/canvas.html#serialisation-of-a-color\n // the color value has alpha less than 1.0, and the string is the color value in the CSS rgba()\n const [r, g, b, a] = this._ctx.fillStyle.substring(5, this._ctx.fillStyle.length - 1).split(',').map(component => Number(component));\n const alpha = Math.round(a * 255);\n const rgba: number = channels.toRgba(r, g, b, alpha);\n return {\n rgba,\n css\n };\n }\n\n return {\n // https://html.spec.whatwg.org/multipage/canvas.html#serialisation-of-a-color\n // if it has alpha equal to 1.0, then the string is a lowercase six-digit hex value, prefixed with a \"#\" character\n css: this._ctx.fillStyle,\n rgba: channels.toRgba(data[0], data[1], data[2], data[3])\n };\n }\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nexport function throwIfFalsy<T>(value: T | undefined | null): T {\n if (!value) {\n throw new Error('value must not be falsy');\n }\n return value;\n}\n","/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IBufferLine, ICellData, CharData } from 'common/Types';\nimport { ICharacterJoinerRegistry, ICharacterJoiner } from 'browser/renderer/Types';\nimport { AttributeData } from 'common/buffer/AttributeData';\nimport { WHITESPACE_CELL_CHAR, Content } from 'common/buffer/Constants';\nimport { CellData } from 'common/buffer/CellData';\nimport { IBufferService } from 'common/services/Services';\n\nexport class JoinedCellData extends AttributeData implements ICellData {\n private _width: number;\n // .content carries no meaning for joined CellData, simply nullify it\n // thus we have to overload all other .content accessors\n public content: number = 0;\n public fg: number;\n public bg: number;\n public combinedData: string = '';\n\n constructor(firstCell: ICellData, chars: string, width: number) {\n super();\n this.fg = firstCell.fg;\n this.bg = firstCell.bg;\n this.combinedData = chars;\n this._width = width;\n }\n\n public isCombined(): number {\n // always mark joined cell data as combined\n return Content.IS_COMBINED_MASK;\n }\n\n public getWidth(): number {\n return this._width;\n }\n\n public getChars(): string {\n return this.combinedData;\n }\n\n public getCode(): number {\n // code always gets the highest possible fake codepoint (read as -1)\n // this is needed as code is used by caches as identifier\n return 0x1FFFFF;\n }\n\n public setFromCharData(value: CharData): void {\n throw new Error('not implemented');\n }\n\n public getAsCharData(): CharData {\n return [this.fg, this.getChars(), this.getWidth(), this.getCode()];\n }\n}\n\nexport class CharacterJoinerRegistry implements ICharacterJoinerRegistry {\n\n private _characterJoiners: ICharacterJoiner[] = [];\n private _nextCharacterJoinerId: number = 0;\n private _workCell: CellData = new CellData();\n\n constructor(private _bufferService: IBufferService) { }\n\n public registerCharacterJoiner(handler: (text: string) => [number, number][]): number {\n const joiner: ICharacterJoiner = {\n id: this._nextCharacterJoinerId++,\n handler\n };\n\n this._characterJoiners.push(joiner);\n return joiner.id;\n }\n\n public deregisterCharacterJoiner(joinerId: number): boolean {\n for (let i = 0; i < this._characterJoiners.length; i++) {\n if (this._characterJoiners[i].id === joinerId) {\n this._characterJoiners.splice(i, 1);\n return true;\n }\n }\n\n return false;\n }\n\n public getJoinedCharacters(row: number): [number, number][] {\n if (this._characterJoiners.length === 0) {\n return [];\n }\n\n const line = this._bufferService.buffer.lines.get(row);\n if (!line || line.length === 0) {\n return [];\n }\n\n const ranges: [number, number][] = [];\n const lineStr = line.translateToString(true);\n\n // Because some cells can be represented by multiple javascript characters,\n // we track the cell and the string indexes separately. This allows us to\n // translate the string ranges we get from the joiners back into cell ranges\n // for use when rendering\n let rangeStartColumn = 0;\n let currentStringIndex = 0;\n let rangeStartStringIndex = 0;\n let rangeAttrFG = line.getFg(0);\n let rangeAttrBG = line.getBg(0);\n\n for (let x = 0; x < line.getTrimmedLength(); x++) {\n line.loadCell(x, this._workCell);\n\n if (this._workCell.getWidth() === 0) {\n // If this character is of width 0, skip it.\n continue;\n }\n\n // End of range\n if (this._workCell.fg !== rangeAttrFG || this._workCell.bg !== rangeAttrBG) {\n // If we ended up with a sequence of more than one character,\n // look for ranges to join.\n if (x - rangeStartColumn > 1) {\n const joinedRanges = this._getJoinedRanges(\n lineStr,\n rangeStartStringIndex,\n currentStringIndex,\n line,\n rangeStartColumn\n );\n for (let i = 0; i < joinedRanges.length; i++) {\n ranges.push(joinedRanges[i]);\n }\n }\n\n // Reset our markers for a new range.\n rangeStartColumn = x;\n rangeStartStringIndex = currentStringIndex;\n rangeAttrFG = this._workCell.fg;\n rangeAttrBG = this._workCell.bg;\n }\n\n currentStringIndex += this._workCell.getChars().length || WHITESPACE_CELL_CHAR.length;\n }\n\n // Process any trailing ranges.\n if (this._bufferService.cols - rangeStartColumn > 1) {\n const joinedRanges = this._getJoinedRanges(\n lineStr,\n rangeStartStringIndex,\n currentStringIndex,\n line,\n rangeStartColumn\n );\n for (let i = 0; i < joinedRanges.length; i++) {\n ranges.push(joinedRanges[i]);\n }\n }\n\n return ranges;\n }\n\n /**\n * Given a segment of a line of text, find all ranges of text that should be\n * joined in a single rendering unit. Ranges are internally converted to\n * column ranges, rather than string ranges.\n * @param line String representation of the full line of text\n * @param startIndex Start position of the range to search in the string (inclusive)\n * @param endIndex End position of the range to search in the string (exclusive)\n */\n private _getJoinedRanges(line: string, startIndex: number, endIndex: number, lineData: IBufferLine, startCol: number): [number, number][] {\n const text = line.substring(startIndex, endIndex);\n // At this point we already know that there is at least one joiner so\n // we can just pull its value and assign it directly rather than\n // merging it into an empty array, which incurs unnecessary writes.\n const joinedRanges: [number, number][] = this._characterJoiners[0].handler(text);\n for (let i = 1; i < this._characterJoiners.length; i++) {\n // We merge any overlapping ranges across the different joiners\n const joinerRanges = this._characterJoiners[i].handler(text);\n for (let j = 0; j < joinerRanges.length; j++) {\n CharacterJoinerRegistry._mergeRanges(joinedRanges, joinerRanges[j]);\n }\n }\n this._stringRangesToCellRanges(joinedRanges, lineData, startCol);\n return joinedRanges;\n }\n\n /**\n * Modifies the provided ranges in-place to adjust for variations between\n * string length and cell width so that the range represents a cell range,\n * rather than the string range the joiner provides.\n * @param ranges String ranges containing start (inclusive) and end (exclusive) index\n * @param line Cell data for the relevant line in the terminal\n * @param startCol Offset within the line to start from\n */\n private _stringRangesToCellRanges(ranges: [number, number][], line: IBufferLine, startCol: number): void {\n let currentRangeIndex = 0;\n let currentRangeStarted = false;\n let currentStringIndex = 0;\n let currentRange = ranges[currentRangeIndex];\n\n // If we got through all of the ranges, stop searching\n if (!currentRange) {\n return;\n }\n\n for (let x = startCol; x < this._bufferService.cols; x++) {\n const width = line.getWidth(x);\n const length = line.getString(x).length || WHITESPACE_CELL_CHAR.length;\n\n // We skip zero-width characters when creating the string to join the text\n // so we do the same here\n if (width === 0) {\n continue;\n }\n\n // Adjust the start of the range\n if (!currentRangeStarted && currentRange[0] <= currentStringIndex) {\n currentRange[0] = x;\n currentRangeStarted = true;\n }\n\n // Adjust the end of the range\n if (currentRange[1] <= currentStringIndex) {\n currentRange[1] = x;\n\n // We're finished with this range, so we move to the next one\n currentRange = ranges[++currentRangeIndex];\n\n // If there are no more ranges left, stop searching\n if (!currentRange) {\n break;\n }\n\n // Ranges can be on adjacent characters. Because the end index of the\n // ranges are exclusive, this means that the index for the start of a\n // range can be the same as the end index of the previous range. To\n // account for the start of the next range, we check here just in case.\n if (currentRange[0] <= currentStringIndex) {\n currentRange[0] = x;\n currentRangeStarted = true;\n } else {\n currentRangeStarted = false;\n }\n }\n\n // Adjust the string index based on the character length to line up with\n // the column adjustment\n currentStringIndex += length;\n }\n\n // If there is still a range left at the end, it must extend all the way to\n // the end of the line.\n if (currentRange) {\n currentRange[1] = this._bufferService.cols;\n }\n }\n\n /**\n * Merges the range defined by the provided start and end into the list of\n * existing ranges. The merge is done in place on the existing range for\n * performance and is also returned.\n * @param ranges Existing range list\n * @param newRange Tuple of two numbers representing the new range to merge in.\n * @returns The ranges input with the new range merged in place\n */\n private static _mergeRanges(ranges: [number, number][], newRange: [number, number]): [number, number][] {\n let inRange = false;\n for (let i = 0; i < ranges.length; i++) {\n const range = ranges[i];\n if (!inRange) {\n if (newRange[1] <= range[0]) {\n // Case 1: New range is before the search range\n ranges.splice(i, 0, newRange);\n return ranges;\n }\n\n if (newRange[1] <= range[1]) {\n // Case 2: New range is either wholly contained within the\n // search range or overlaps with the front of it\n range[0] = Math.min(newRange[0], range[0]);\n return ranges;\n }\n\n if (newRange[0] < range[1]) {\n // Case 3: New range either wholly contains the search range\n // or overlaps with the end of it\n range[0] = Math.min(newRange[0], range[0]);\n inRange = true;\n }\n\n // Case 4: New range starts after the search range\n continue;\n } else {\n if (newRange[1] <= range[0]) {\n // Case 5: New range extends from previous range but doesn't\n // reach the current one\n ranges[i - 1][1] = newRange[1];\n return ranges;\n }\n\n if (newRange[1] <= range[1]) {\n // Case 6: New range extends from prvious range into the\n // current range\n ranges[i - 1][1] = Math.max(newRange[1], range[1]);\n ranges.splice(i, 1);\n return ranges;\n }\n\n // Case 7: New range extends from previous range past the\n // end of the current range\n ranges.splice(i, 1);\n i--;\n }\n }\n\n if (inRange) {\n // Case 8: New range extends past the last existing range\n ranges[ranges.length - 1][1] = newRange[1];\n } else {\n // Case 9: New range starts after the last existing range\n ranges.push(newRange);\n }\n\n return ranges;\n }\n}\n","/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nexport function getCoordsRelativeToElement(event: {clientX: number, clientY: number}, element: HTMLElement): [number, number] {\n const rect = element.getBoundingClientRect();\n return [event.clientX - rect.left, event.clientY - rect.top];\n}\n\n/**\n * Gets coordinates within the terminal for a particular mouse event. The result\n * is returned as an array in the form [x, y] instead of an object as it's a\n * little faster and this function is used in some low level code.\n * @param event The mouse event.\n * @param element The terminal's container element.\n * @param colCount The number of columns in the terminal.\n * @param rowCount The number of rows n the terminal.\n * @param isSelection Whether the request is for the selection or not. This will\n * apply an offset to the x value such that the left half of the cell will\n * select that cell and the right half will select the next cell.\n */\nexport function getCoords(event: {clientX: number, clientY: number}, element: HTMLElement, colCount: number, rowCount: number, hasValidCharSize: boolean, actualCellWidth: number, actualCellHeight: number, isSelection?: boolean): [number, number] | undefined {\n // Coordinates cannot be measured if there are no valid\n if (!hasValidCharSize) {\n return undefined;\n }\n\n const coords = getCoordsRelativeToElement(event, element);\n if (!coords) {\n return undefined;\n }\n\n coords[0] = Math.ceil((coords[0] + (isSelection ? actualCellWidth / 2 : 0)) / actualCellWidth);\n coords[1] = Math.ceil(coords[1] / actualCellHeight);\n\n // Ensure coordinates are within the terminal viewport. Note that selections\n // need an addition point of precision to cover the end point (as characters\n // cover half of one char and half of the next).\n coords[0] = Math.min(Math.max(coords[0], 1), colCount + (isSelection ? 1 : 0));\n coords[1] = Math.min(Math.max(coords[1], 1), rowCount);\n\n return coords;\n}\n\n/**\n * Gets coordinates within the terminal for a particular mouse event, wrapping\n * them to the bounds of the terminal and adding 32 to both the x and y values\n * as expected by xterm.\n */\nexport function getRawByteCoords(coords: [number, number] | undefined): { x: number, y: number } | undefined {\n if (!coords) {\n return undefined;\n }\n\n // xterm sends raw bytes and starts at 32 (SP) for each.\n return { x: coords[0] + 32, y: coords[1] + 32 };\n}\n","/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IDisposable } from 'common/Types';\n\n/**\n * Debounces calls to render terminal rows using animation frames.\n */\nexport class RenderDebouncer implements IDisposable {\n private _rowStart: number | undefined;\n private _rowEnd: number | undefined;\n private _rowCount: number | undefined;\n private _animationFrame: number | undefined;\n\n constructor(\n private _renderCallback: (start: number, end: number) => void\n ) {\n }\n\n public dispose(): void {\n if (this._animationFrame) {\n window.cancelAnimationFrame(this._animationFrame);\n this._animationFrame = undefined;\n }\n }\n\n public refresh(rowStart: number | undefined, rowEnd: number | undefined, rowCount: number): void {\n this._rowCount = rowCount;\n // Get the min/max row start/end for the arg values\n rowStart = rowStart !== undefined ? rowStart : 0;\n rowEnd = rowEnd !== undefined ? rowEnd : this._rowCount - 1;\n // Set the properties to the updated values\n this._rowStart = this._rowStart !== undefined ? Math.min(this._rowStart, rowStart) : rowStart;\n this._rowEnd = this._rowEnd !== undefined ? Math.max(this._rowEnd, rowEnd) : rowEnd;\n\n if (this._animationFrame) {\n return;\n }\n\n this._animationFrame = window.requestAnimationFrame(() => this._innerRefresh());\n }\n\n private _innerRefresh(): void {\n // Make sure values are set\n if (this._rowStart === undefined || this._rowEnd === undefined || this._rowCount === undefined) {\n return;\n }\n\n // Clamp values\n const start = Math.max(this._rowStart, 0);\n const end = Math.min(this._rowEnd, this._rowCount - 1);\n\n // Reset debouncer (this happens before render callback as the render could trigger it again)\n this._rowStart = undefined;\n this._rowEnd = undefined;\n this._animationFrame = undefined;\n\n // Run render callback\n this._renderCallback(start, end);\n }\n}\n","/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { Disposable } from 'common/Lifecycle';\n\nexport type ScreenDprListener = (newDevicePixelRatio?: number, oldDevicePixelRatio?: number) => void;\n\n/**\n * The screen device pixel ratio monitor allows listening for when the\n * window.devicePixelRatio value changes. This is done not with polling but with\n * the use of window.matchMedia to watch media queries. When the event fires,\n * the listener will be reattached using a different media query to ensure that\n * any further changes will register.\n *\n * The listener should fire on both window zoom changes and switching to a\n * monitor with a different DPI.\n */\nexport class ScreenDprMonitor extends Disposable {\n private _currentDevicePixelRatio: number = window.devicePixelRatio;\n private _outerListener: ((this: MediaQueryList, ev: MediaQueryListEvent) => any) | undefined;\n private _listener: ScreenDprListener | undefined;\n private _resolutionMediaMatchList: MediaQueryList | undefined;\n\n public setListener(listener: ScreenDprListener): void {\n if (this._listener) {\n this.clearListener();\n }\n this._listener = listener;\n this._outerListener = () => {\n if (!this._listener) {\n return;\n }\n this._listener(window.devicePixelRatio, this._currentDevicePixelRatio);\n this._updateDpr();\n };\n this._updateDpr();\n }\n\n public dispose(): void {\n super.dispose();\n this.clearListener();\n }\n\n private _updateDpr(): void {\n if (!this._outerListener) {\n return;\n }\n\n // Clear listeners for old DPR\n this._resolutionMediaMatchList?.removeListener(this._outerListener);\n\n // Add listeners for new DPR\n this._currentDevicePixelRatio = window.devicePixelRatio;\n this._resolutionMediaMatchList = window.matchMedia(`screen and (resolution: ${window.devicePixelRatio}dppx)`);\n this._resolutionMediaMatchList.addListener(this._outerListener);\n }\n\n public clearListener(): void {\n if (!this._resolutionMediaMatchList || !this._listener || !this._outerListener) {\n return;\n }\n this._resolutionMediaMatchList.removeListener(this._outerListener);\n this._resolutionMediaMatchList = undefined;\n this._listener = undefined;\n this._outerListener = undefined;\n }\n}\n","/**\n * Copyright (c) 2016 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\n/*\n * A simple utility for cloning values\n */\nexport function clone<T>(val: T, depth: number = 5): T {\n if (typeof val !== 'object') {\n return val;\n }\n\n // If we're cloning an array, use an array as the base, otherwise use an object\n const clonedObject: any = Array.isArray(val) ? [] : {};\n\n for (const key in val) {\n // Recursively clone eack item unless we're at the maximum depth\n clonedObject[key] = depth <= 1 ? val[key] : (val[key] ? clone(val[key], depth - 1) : val[key]);\n }\n\n return clonedObject as T;\n}\n","/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { Terminal as ITerminalApi, ITerminalOptions, IMarker, IDisposable, ILinkMatcherOptions, ITheme, ILocalizableStrings, ITerminalAddon, ISelectionPosition, IBuffer as IBufferApi, IBufferNamespace as IBufferNamespaceApi, IBufferLine as IBufferLineApi, IBufferCell as IBufferCellApi, IParser, IFunctionIdentifier, ILinkProvider, IUnicodeHandling, IUnicodeVersionProvider } from 'xterm';\nimport { ITerminal } from 'browser/Types';\nimport { IBufferLine, ICellData } from 'common/Types';\nimport { IBuffer, IBufferSet } from 'common/buffer/Types';\nimport { CellData } from 'common/buffer/CellData';\nimport { Terminal as TerminalCore } from '../Terminal';\nimport * as Strings from '../LocalizableStrings';\nimport { IEvent, EventEmitter } from 'common/EventEmitter';\nimport { AddonManager } from './AddonManager';\nimport { IParams } from 'common/parser/Types';\n\nexport class Terminal implements ITerminalApi {\n private _core: ITerminal;\n private _addonManager: AddonManager;\n private _parser: IParser | undefined;\n\n constructor(options?: ITerminalOptions) {\n this._core = new TerminalCore(options);\n this._addonManager = new AddonManager();\n }\n\n private _checkProposedApi(): void {\n if (!this._core.optionsService.options.allowProposedApi) {\n throw new Error('You must set the allowProposedApi option to true to use proposed API');\n }\n }\n\n public get onCursorMove(): IEvent<void> { return this._core.onCursorMove; }\n public get onLineFeed(): IEvent<void> { return this._core.onLineFeed; }\n public get onSelectionChange(): IEvent<void> { return this._core.onSelectionChange; }\n public get onData(): IEvent<string> { return this._core.onData; }\n public get onBinary(): IEvent<string> { return this._core.onBinary; }\n public get onTitleChange(): IEvent<string> { return this._core.onTitleChange; }\n public get onScroll(): IEvent<number> { return this._core.onScroll; }\n public get onKey(): IEvent<{ key: string, domEvent: KeyboardEvent }> { return this._core.onKey; }\n public get onRender(): IEvent<{ start: number, end: number }> { return this._core.onRender; }\n public get onResize(): IEvent<{ cols: number, rows: number }> { return this._core.onResize; }\n\n public get element(): HTMLElement | undefined { return this._core.element; }\n public get parser(): IParser {\n this._checkProposedApi();\n if (!this._parser) {\n this._parser = new ParserApi(this._core);\n }\n return this._parser;\n }\n public get unicode(): IUnicodeHandling {\n this._checkProposedApi();\n return new UnicodeApi(this._core);\n }\n public get textarea(): HTMLTextAreaElement | undefined { return this._core.textarea; }\n public get rows(): number { return this._core.rows; }\n public get cols(): number { return this._core.cols; }\n public get buffer(): IBufferNamespaceApi {\n this._checkProposedApi();\n return new BufferNamespaceApi(this._core.buffers);\n }\n public get markers(): ReadonlyArray<IMarker> {\n this._checkProposedApi();\n return this._core.markers;\n }\n public blur(): void {\n this._core.blur();\n }\n public focus(): void {\n this._core.focus();\n }\n public resize(columns: number, rows: number): void {\n this._verifyIntegers(columns, rows);\n this._core.resize(columns, rows);\n }\n public open(parent: HTMLElement): void {\n this._core.open(parent);\n }\n public attachCustomKeyEventHandler(customKeyEventHandler: (event: KeyboardEvent) => boolean): void {\n this._core.attachCustomKeyEventHandler(customKeyEventHandler);\n }\n public registerLinkMatcher(regex: RegExp, handler: (event: MouseEvent, uri: string) => void, options?: ILinkMatcherOptions): number {\n this._checkProposedApi();\n return this._core.registerLinkMatcher(regex, handler, options);\n }\n public deregisterLinkMatcher(matcherId: number): void {\n this._checkProposedApi();\n this._core.deregisterLinkMatcher(matcherId);\n }\n public registerLinkProvider(linkProvider: ILinkProvider): IDisposable {\n this._checkProposedApi();\n return this._core.registerLinkProvider(linkProvider);\n }\n public registerCharacterJoiner(handler: (text: string) => [number, number][]): number {\n this._checkProposedApi();\n return this._core.registerCharacterJoiner(handler);\n }\n public deregisterCharacterJoiner(joinerId: number): void {\n this._checkProposedApi();\n this._core.deregisterCharacterJoiner(joinerId);\n }\n public registerMarker(cursorYOffset: number): IMarker | undefined {\n this._checkProposedApi();\n this._verifyIntegers(cursorYOffset);\n return this._core.addMarker(cursorYOffset);\n }\n public addMarker(cursorYOffset: number): IMarker | undefined {\n return this.registerMarker(cursorYOffset);\n }\n public hasSelection(): boolean {\n return this._core.hasSelection();\n }\n public select(column: number, row: number, length: number): void {\n this._verifyIntegers(column, row, length);\n this._core.select(column, row, length);\n }\n public getSelection(): string {\n return this._core.getSelection();\n }\n public getSelectionPosition(): ISelectionPosition | undefined {\n return this._core.getSelectionPosition();\n }\n public clearSelection(): void {\n this._core.clearSelection();\n }\n public selectAll(): void {\n this._core.selectAll();\n }\n public selectLines(start: number, end: number): void {\n this._verifyIntegers(start, end);\n this._core.selectLines(start, end);\n }\n public dispose(): void {\n this._addonManager.dispose();\n this._core.dispose();\n }\n public scrollLines(amount: number): void {\n this._verifyIntegers(amount);\n this._core.scrollLines(amount);\n }\n public scrollPages(pageCount: number): void {\n this._verifyIntegers(pageCount);\n this._core.scrollPages(pageCount);\n }\n public scrollToTop(): void {\n this._core.scrollToTop();\n }\n public scrollToBottom(): void {\n this._core.scrollToBottom();\n }\n public scrollToLine(line: number): void {\n this._verifyIntegers(line);\n this._core.scrollToLine(line);\n }\n public clear(): void {\n this._core.clear();\n }\n public write(data: string | Uint8Array, callback?: () => void): void {\n this._core.write(data, callback);\n }\n public writeUtf8(data: Uint8Array, callback?: () => void): void {\n this._core.write(data, callback);\n }\n public writeln(data: string | Uint8Array, callback?: () => void): void {\n this._core.write(data);\n this._core.write('\\r\\n', callback);\n }\n public paste(data: string): void {\n this._core.paste(data);\n }\n public getOption(key: 'bellSound' | 'bellStyle' | 'cursorStyle' | 'fontFamily' | 'fontWeight' | 'fontWeightBold' | 'logLevel' | 'rendererType' | 'termName' | 'wordSeparator'): string;\n public getOption(key: 'allowTransparency' | 'cancelEvents' | 'convertEol' | 'cursorBlink' | 'disableStdin' | 'macOptionIsMeta' | 'rightClickSelectsWord' | 'popOnBell' | 'visualBell'): boolean;\n public getOption(key: 'cols' | 'fontSize' | 'letterSpacing' | 'lineHeight' | 'rows' | 'tabStopWidth' | 'scrollback'): number;\n public getOption(key: string): any;\n public getOption(key: any): any {\n return this._core.optionsService.getOption(key);\n }\n public setOption(key: 'bellSound' | 'fontFamily' | 'termName' | 'wordSeparator', value: string): void;\n public setOption(key: 'fontWeight' | 'fontWeightBold', value: 'normal' | 'bold' | '100' | '200' | '300' | '400' | '500' | '600' | '700' | '800' | '900'): void;\n public setOption(key: 'logLevel', value: 'debug' | 'info' | 'warn' | 'error' | 'off'): void;\n public setOption(key: 'bellStyle', value: 'none' | 'visual' | 'sound' | 'both'): void;\n public setOption(key: 'cursorStyle', value: 'block' | 'underline' | 'bar'): void;\n public setOption(key: 'allowTransparency' | 'cancelEvents' | 'convertEol' | 'cursorBlink' | 'disableStdin' | 'macOptionIsMeta' | 'rightClickSelectsWord' | 'popOnBell' | 'visualBell', value: boolean): void;\n public setOption(key: 'fontSize' | 'letterSpacing' | 'lineHeight' | 'tabStopWidth' | 'scrollback', value: number): void;\n public setOption(key: 'theme', value: ITheme): void;\n public setOption(key: 'cols' | 'rows', value: number): void;\n public setOption(key: string, value: any): void;\n public setOption(key: any, value: any): void {\n this._core.optionsService.setOption(key, value);\n }\n public refresh(start: number, end: number): void {\n this._verifyIntegers(start, end);\n this._core.refresh(start, end);\n }\n public reset(): void {\n this._core.reset();\n }\n public loadAddon(addon: ITerminalAddon): void {\n return this._addonManager.loadAddon(this, addon);\n }\n public static get strings(): ILocalizableStrings {\n return Strings;\n }\n\n private _verifyIntegers(...values: number[]): void {\n for (const value of values) {\n if (value === Infinity || isNaN(value) || value % 1 !== 0) {\n throw new Error('This API only accepts integers');\n }\n }\n }\n}\n\nclass BufferApiView implements IBufferApi {\n constructor(\n private _buffer: IBuffer,\n public readonly type: 'normal' | 'alternate'\n ) { }\n\n public init(buffer: IBuffer): BufferApiView {\n this._buffer = buffer;\n return this;\n }\n\n public get cursorY(): number { return this._buffer.y; }\n public get cursorX(): number { return this._buffer.x; }\n public get viewportY(): number { return this._buffer.ydisp; }\n public get baseY(): number { return this._buffer.ybase; }\n public get length(): number { return this._buffer.lines.length; }\n public getLine(y: number): IBufferLineApi | undefined {\n const line = this._buffer.lines.get(y);\n if (!line) {\n return undefined;\n }\n return new BufferLineApiView(line);\n }\n public getNullCell(): IBufferCellApi { return new CellData(); }\n}\n\nclass BufferNamespaceApi implements IBufferNamespaceApi {\n private _normal: BufferApiView;\n private _alternate: BufferApiView;\n private _onBufferChange = new EventEmitter<IBufferApi>();\n public get onBufferChange(): IEvent<IBufferApi> { return this._onBufferChange.event; }\n\n constructor(private _buffers: IBufferSet) {\n this._normal = new BufferApiView(this._buffers.normal, 'normal');\n this._alternate = new BufferApiView(this._buffers.alt, 'alternate');\n this._buffers.onBufferActivate(() => this._onBufferChange.fire(this.active));\n }\n public get active(): IBufferApi {\n if (this._buffers.active === this._buffers.normal) { return this.normal; }\n if (this._buffers.active === this._buffers.alt) { return this.alternate; }\n throw new Error('Active buffer is neither normal nor alternate');\n }\n public get normal(): IBufferApi {\n return this._normal.init(this._buffers.normal);\n }\n public get alternate(): IBufferApi {\n return this._alternate.init(this._buffers.alt);\n }\n}\n\nclass BufferLineApiView implements IBufferLineApi {\n constructor(private _line: IBufferLine) { }\n\n public get isWrapped(): boolean { return this._line.isWrapped; }\n public get length(): number { return this._line.length; }\n public getCell(x: number, cell?: IBufferCellApi): IBufferCellApi | undefined {\n if (x < 0 || x >= this._line.length) {\n return undefined;\n }\n\n if (cell) {\n this._line.loadCell(x, <ICellData>cell);\n return cell;\n }\n return this._line.loadCell(x, new CellData());\n }\n public translateToString(trimRight?: boolean, startColumn?: number, endColumn?: number): string {\n return this._line.translateToString(trimRight, startColumn, endColumn);\n }\n}\n\nclass ParserApi implements IParser {\n constructor(private _core: ITerminal) { }\n\n public registerCsiHandler(id: IFunctionIdentifier, callback: (params: (number | number[])[]) => boolean): IDisposable {\n return this._core.addCsiHandler(id, (params: IParams) => callback(params.toArray()));\n }\n public addCsiHandler(id: IFunctionIdentifier, callback: (params: (number | number[])[]) => boolean): IDisposable {\n return this.registerCsiHandler(id, callback);\n }\n public registerDcsHandler(id: IFunctionIdentifier, callback: (data: string, param: (number | number[])[]) => boolean): IDisposable {\n return this._core.addDcsHandler(id, (data: string, params: IParams) => callback(data, params.toArray()));\n }\n public addDcsHandler(id: IFunctionIdentifier, callback: (data: string, param: (number | number[])[]) => boolean): IDisposable {\n return this.registerDcsHandler(id, callback);\n }\n public registerEscHandler(id: IFunctionIdentifier, handler: () => boolean): IDisposable {\n return this._core.addEscHandler(id, handler);\n }\n public addEscHandler(id: IFunctionIdentifier, handler: () => boolean): IDisposable {\n return this.registerEscHandler(id, handler);\n }\n public registerOscHandler(ident: number, callback: (data: string) => boolean): IDisposable {\n return this._core.addOscHandler(ident, callback);\n }\n public addOscHandler(ident: number, callback: (data: string) => boolean): IDisposable {\n return this.registerOscHandler(ident, callback);\n }\n}\n\nclass UnicodeApi implements IUnicodeHandling {\n constructor(private _core: ITerminal) { }\n\n public register(provider: IUnicodeVersionProvider): void {\n this._core.unicodeService.register(provider);\n }\n\n public get versions(): string[] {\n return this._core.unicodeService.versions;\n }\n\n public get activeVersion(): string {\n return this._core.unicodeService.activeVersion;\n }\n\n public set activeVersion(version: string) {\n this._core.unicodeService.activeVersion = version;\n }\n}\n","/**\n * Copyright (c) 2014 The xterm.js authors. All rights reserved.\n * Copyright (c) 2012-2013, Christopher Jeffrey (MIT License)\n * @license MIT\n *\n * Originally forked from (with the author's permission):\n * Fabrice Bellard's javascript vt100 for jslinux:\n * http://bellard.org/jslinux/\n * Copyright (c) 2011 Fabrice Bellard\n * The original design remains. The terminal itself\n * has been extended to include xterm CSI codes, among\n * other features.\n *\n * Terminal Emulation References:\n * http://vt100.net/\n * http://invisible-island.net/xterm/ctlseqs/ctlseqs.txt\n * http://invisible-island.net/xterm/ctlseqs/ctlseqs.html\n * http://invisible-island.net/vttest/\n * http://www.inwap.com/pdp10/ansicode.txt\n * http://linux.die.net/man/4/console_codes\n * http://linux.die.net/man/7/urxvt\n */\n\nimport { ICompositionHelper, ITerminal, IBrowser, CustomKeyEventHandler, ILinkifier, IMouseZoneManager, LinkMatcherHandler, ILinkMatcherOptions, IViewport, ILinkifier2 } from 'browser/Types';\nimport { IRenderer, CharacterJoinerHandler } from 'browser/renderer/Types';\nimport { CompositionHelper } from 'browser/input/CompositionHelper';\nimport { Viewport } from 'browser/Viewport';\nimport { rightClickHandler, moveTextAreaUnderMouseCursor, handlePasteEvent, copyHandler, paste } from 'browser/Clipboard';\nimport { C0 } from 'common/data/EscapeSequences';\nimport { WindowsOptionsReportType } from '../common/InputHandler';\nimport { Renderer } from 'browser/renderer/Renderer';\nimport { Linkifier } from 'browser/Linkifier';\nimport { SelectionService } from 'browser/services/SelectionService';\nimport * as Browser from 'common/Platform';\nimport { addDisposableDomListener } from 'browser/Lifecycle';\nimport * as Strings from 'browser/LocalizableStrings';\nimport { SoundService } from 'browser/services/SoundService';\nimport { MouseZoneManager } from 'browser/MouseZoneManager';\nimport { AccessibilityManager } from './AccessibilityManager';\nimport { ITheme, IMarker, IDisposable, ISelectionPosition, ILinkProvider } from 'xterm';\nimport { DomRenderer } from 'browser/renderer/dom/DomRenderer';\nimport { IKeyboardEvent, KeyboardResultType, CoreMouseEventType, CoreMouseButton, CoreMouseAction, ITerminalOptions } from 'common/Types';\nimport { evaluateKeyboardEvent } from 'common/input/Keyboard';\nimport { EventEmitter, IEvent, forwardEvent } from 'common/EventEmitter';\nimport { DEFAULT_ATTR_DATA } from 'common/buffer/BufferLine';\nimport { ColorManager } from 'browser/ColorManager';\nimport { RenderService } from 'browser/services/RenderService';\nimport { ICharSizeService, IRenderService, IMouseService, ISelectionService, ISoundService, ICoreBrowserService } from 'browser/services/Services';\nimport { CharSizeService } from 'browser/services/CharSizeService';\nimport { IBuffer } from 'common/buffer/Types';\nimport { MouseService } from 'browser/services/MouseService';\nimport { Linkifier2 } from 'browser/Linkifier2';\nimport { CoreBrowserService } from 'browser/services/CoreBrowserService';\nimport { CoreTerminal } from 'common/CoreTerminal';\nimport { ITerminalOptions as IInitializedTerminalOptions } from 'common/services/Services';\n\n// Let it work inside Node.js for automated testing purposes.\nconst document: Document = (typeof window !== 'undefined') ? window.document : null as any;\n\nexport class Terminal extends CoreTerminal implements ITerminal {\n public textarea: HTMLTextAreaElement | undefined;\n public element: HTMLElement | undefined;\n public screenElement: HTMLElement | undefined;\n\n private _document: Document | undefined;\n private _viewportScrollArea: HTMLElement | undefined;\n private _viewportElement: HTMLElement | undefined;\n private _helperContainer: HTMLElement | undefined;\n private _compositionView: HTMLElement | undefined;\n\n // private _visualBellTimer: number;\n\n public browser: IBrowser = <any>Browser;\n\n // TODO: We should remove options once components adopt optionsService\n public get options(): IInitializedTerminalOptions { return this.optionsService.options; }\n\n private _customKeyEventHandler: CustomKeyEventHandler | undefined;\n\n // browser services\n private _charSizeService: ICharSizeService | undefined;\n private _mouseService: IMouseService | undefined;\n private _renderService: IRenderService | undefined;\n private _selectionService: ISelectionService | undefined;\n private _soundService: ISoundService | undefined;\n\n /**\n * Records whether the keydown event has already been handled and triggered a data event, if so\n * the keypress event should not trigger a data event but should still print to the textarea so\n * screen readers will announce it.\n */\n private _keyDownHandled: boolean = false;\n\n public linkifier: ILinkifier;\n public linkifier2: ILinkifier2;\n public viewport: IViewport | undefined;\n private _compositionHelper: ICompositionHelper | undefined;\n private _mouseZoneManager: IMouseZoneManager | undefined;\n private _accessibilityManager: AccessibilityManager | undefined;\n private _colorManager: ColorManager | undefined;\n private _theme: ITheme | undefined;\n\n private _onCursorMove = new EventEmitter<void>();\n public get onCursorMove(): IEvent<void> { return this._onCursorMove.event; }\n private _onKey = new EventEmitter<{ key: string, domEvent: KeyboardEvent }>();\n public get onKey(): IEvent<{ key: string, domEvent: KeyboardEvent }> { return this._onKey.event; }\n private _onRender = new EventEmitter<{ start: number, end: number }>();\n public get onRender(): IEvent<{ start: number, end: number }> { return this._onRender.event; }\n private _onSelectionChange = new EventEmitter<void>();\n public get onSelectionChange(): IEvent<void> { return this._onSelectionChange.event; }\n private _onTitleChange = new EventEmitter<string>();\n public get onTitleChange(): IEvent<string> { return this._onTitleChange.event; }\n\n private _onFocus = new EventEmitter<void>();\n public get onFocus(): IEvent<void> { return this._onFocus.event; }\n private _onBlur = new EventEmitter<void>();\n public get onBlur(): IEvent<void> { return this._onBlur.event; }\n private _onA11yCharEmitter = new EventEmitter<string>();\n public get onA11yChar(): IEvent<string> { return this._onA11yCharEmitter.event; }\n private _onA11yTabEmitter = new EventEmitter<number>();\n public get onA11yTab(): IEvent<number> { return this._onA11yTabEmitter.event; }\n\n /**\n * Creates a new `Terminal` object.\n *\n * @param options An object containing a set of options, the available options are:\n * - `cursorBlink` (boolean): Whether the terminal cursor blinks\n * - `cols` (number): The number of columns of the terminal (horizontal size)\n * - `rows` (number): The number of rows of the terminal (vertical size)\n *\n * @public\n * @class Xterm Xterm\n * @alias module:xterm/src/xterm\n */\n constructor(\n options: ITerminalOptions = {}\n ) {\n super(options);\n\n this._setup();\n\n this.linkifier = this._instantiationService.createInstance(Linkifier);\n this.linkifier2 = this.register(this._instantiationService.createInstance(Linkifier2));\n\n // Setup InputHandler listeners\n this.register(this._inputHandler.onRequestBell(() => this.bell()));\n this.register(this._inputHandler.onRequestRefreshRows((start, end) => this.refresh(start, end)));\n this.register(this._inputHandler.onRequestReset(() => this.reset()));\n this.register(this._inputHandler.onRequestScroll((eraseAttr, isWrapped) => this.scroll(eraseAttr, isWrapped || undefined)));\n this.register(this._inputHandler.onRequestWindowsOptionsReport(type => this._reportWindowsOptions(type)));\n this.register(forwardEvent(this._inputHandler.onCursorMove, this._onCursorMove));\n this.register(forwardEvent(this._inputHandler.onTitleChange, this._onTitleChange));\n this.register(forwardEvent(this._inputHandler.onA11yChar, this._onA11yCharEmitter));\n this.register(forwardEvent(this._inputHandler.onA11yTab, this._onA11yTabEmitter));\n\n // Setup listeners\n this.register(this._bufferService.onResize(e => this._afterResize(e.cols, e.rows)));\n }\n\n public dispose(): void {\n if (this._isDisposed) {\n return;\n }\n super.dispose();\n this._renderService?.dispose();\n this._customKeyEventHandler = undefined;\n this.write = () => { };\n this.element?.parentNode?.removeChild(this.element);\n }\n\n protected _setup(): void {\n super._setup();\n\n this._customKeyEventHandler = undefined;\n }\n\n /**\n * Convenience property to active buffer.\n */\n public get buffer(): IBuffer {\n return this.buffers.active;\n }\n\n /**\n * Focus the terminal. Delegates focus handling to the terminal's DOM element.\n */\n public focus(): void {\n if (this.textarea) {\n this.textarea.focus({ preventScroll: true });\n }\n }\n\n protected _updateOptions(key: string): void {\n super._updateOptions(key);\n\n // TODO: These listeners should be owned by individual components\n switch (key) {\n case 'fontFamily':\n case 'fontSize':\n // When the font changes the size of the cells may change which requires a renderer clear\n this._renderService?.clear();\n this._charSizeService?.measure();\n break;\n case 'cursorBlink':\n case 'cursorStyle':\n // The DOM renderer needs a row refresh to update the cursor styles\n this.refresh(this.buffer.y, this.buffer.y);\n break;\n case 'drawBoldTextInBrightColors':\n case 'letterSpacing':\n case 'lineHeight':\n case 'fontWeight':\n case 'fontWeightBold':\n case 'minimumContrastRatio':\n // When the font changes the size of the cells may change which requires a renderer clear\n if (this._renderService) {\n this._renderService.clear();\n this._renderService.onResize(this.cols, this.rows);\n this.refresh(0, this.rows - 1);\n }\n break;\n case 'rendererType':\n if (this._renderService) {\n this._renderService.setRenderer(this._createRenderer());\n this._renderService.onResize(this.cols, this.rows);\n }\n break;\n case 'scrollback':\n this.viewport?.syncScrollArea();\n break;\n case 'screenReaderMode':\n if (this.optionsService.options.screenReaderMode) {\n if (!this._accessibilityManager && this._renderService) {\n this._accessibilityManager = new AccessibilityManager(this, this._renderService);\n }\n } else {\n this._accessibilityManager?.dispose();\n this._accessibilityManager = undefined;\n }\n break;\n case 'tabStopWidth': this.buffers.setupTabStops(); break;\n case 'theme':\n this._setTheme(this.optionsService.options.theme);\n break;\n }\n }\n\n /**\n * Binds the desired focus behavior on a given terminal object.\n */\n private _onTextAreaFocus(ev: KeyboardEvent): void {\n if (this._coreService.decPrivateModes.sendFocus) {\n this._coreService.triggerDataEvent(C0.ESC + '[I');\n }\n this.updateCursorStyle(ev);\n this.element!.classList.add('focus');\n this._showCursor();\n this._onFocus.fire();\n }\n\n /**\n * Blur the terminal, calling the blur function on the terminal's underlying\n * textarea.\n */\n public blur(): void {\n return this.textarea?.blur();\n }\n\n /**\n * Binds the desired blur behavior on a given terminal object.\n */\n private _onTextAreaBlur(): void {\n // Text can safely be removed on blur. Doing it earlier could interfere with\n // screen readers reading it out.\n this.textarea!.value = '';\n this.refresh(this.buffer.y, this.buffer.y);\n if (this._coreService.decPrivateModes.sendFocus) {\n this._coreService.triggerDataEvent(C0.ESC + '[O');\n }\n this.element!.classList.remove('focus');\n this._onBlur.fire();\n }\n\n /**\n * Initialize default behavior\n */\n private _initGlobal(): void {\n this._bindKeys();\n\n // Bind clipboard functionality\n this.register(addDisposableDomListener(this.element!, 'copy', (event: ClipboardEvent) => {\n // If mouse events are active it means the selection manager is disabled and\n // copy should be handled by the host program.\n if (!this.hasSelection()) {\n return;\n }\n copyHandler(event, this._selectionService!);\n }));\n const pasteHandlerWrapper = (event: ClipboardEvent): void => handlePasteEvent(event, this.textarea!, this._coreService);\n this.register(addDisposableDomListener(this.textarea!, 'paste', pasteHandlerWrapper));\n this.register(addDisposableDomListener(this.element!, 'paste', pasteHandlerWrapper));\n\n // Handle right click context menus\n if (Browser.isFirefox) {\n // Firefox doesn't appear to fire the contextmenu event on right click\n this.register(addDisposableDomListener(this.element!, 'mousedown', (event: MouseEvent) => {\n if (event.button === 2) {\n rightClickHandler(event, this.textarea!, this.screenElement!, this._selectionService!, this.options.rightClickSelectsWord);\n }\n }));\n } else {\n this.register(addDisposableDomListener(this.element!, 'contextmenu', (event: MouseEvent) => {\n rightClickHandler(event, this.textarea!, this.screenElement!, this._selectionService!, this.options.rightClickSelectsWord);\n }));\n }\n\n // Move the textarea under the cursor when middle clicking on Linux to ensure\n // middle click to paste selection works. This only appears to work in Chrome\n // at the time is writing.\n if (Browser.isLinux) {\n // Use auxclick event over mousedown the latter doesn't seem to work. Note\n // that the regular click event doesn't fire for the middle mouse button.\n this.register(addDisposableDomListener(this.element!, 'auxclick', (event: MouseEvent) => {\n if (event.button === 1) {\n moveTextAreaUnderMouseCursor(event, this.textarea!, this.screenElement!);\n }\n }));\n }\n }\n\n /**\n * Apply key handling to the terminal\n */\n private _bindKeys(): void {\n this.register(addDisposableDomListener(this.textarea!, 'keyup', (ev: KeyboardEvent) => this._keyUp(ev), true));\n this.register(addDisposableDomListener(this.textarea!, 'keydown', (ev: KeyboardEvent) => this._keyDown(ev), true));\n this.register(addDisposableDomListener(this.textarea!, 'keypress', (ev: KeyboardEvent) => this._keyPress(ev), true));\n this.register(addDisposableDomListener(this.textarea!, 'compositionstart', () => this._compositionHelper!.compositionstart()));\n this.register(addDisposableDomListener(this.textarea!, 'compositionupdate', (e: CompositionEvent) => this._compositionHelper!.compositionupdate(e)));\n this.register(addDisposableDomListener(this.textarea!, 'compositionend', () => this._compositionHelper!.compositionend()));\n this.register(this.onRender(() => this._compositionHelper!.updateCompositionElements()));\n this.register(this.onRender(e => this._queueLinkification(e.start, e.end)));\n }\n\n /**\n * Opens the terminal within an element.\n *\n * @param parent The element to create the terminal within.\n */\n public open(parent: HTMLElement): void {\n if (!parent) {\n throw new Error('Terminal requires a parent element.');\n }\n\n if (!document.body.contains(parent)) {\n this._logService.debug('Terminal.open was called on an element that was not attached to the DOM');\n }\n\n this._document = parent.ownerDocument!;\n\n // Create main element container\n this.element = this._document.createElement('div');\n this.element.dir = 'ltr'; // xterm.css assumes LTR\n this.element.classList.add('terminal');\n this.element.classList.add('xterm');\n this.element.setAttribute('tabindex', '0');\n parent.appendChild(this.element);\n\n // Performance: Use a document fragment to build the terminal\n // viewport and helper elements detached from the DOM\n const fragment = document.createDocumentFragment();\n this._viewportElement = document.createElement('div');\n this._viewportElement.classList.add('xterm-viewport');\n fragment.appendChild(this._viewportElement);\n this._viewportScrollArea = document.createElement('div');\n this._viewportScrollArea.classList.add('xterm-scroll-area');\n this._viewportElement.appendChild(this._viewportScrollArea);\n\n this.screenElement = document.createElement('div');\n this.screenElement.classList.add('xterm-screen');\n // Create the container that will hold helpers like the textarea for\n // capturing DOM Events. Then produce the helpers.\n this._helperContainer = document.createElement('div');\n this._helperContainer.classList.add('xterm-helpers');\n this.screenElement.appendChild(this._helperContainer);\n fragment.appendChild(this.screenElement);\n\n this.textarea = document.createElement('textarea');\n this.textarea.classList.add('xterm-helper-textarea');\n this.textarea.setAttribute('aria-label', Strings.promptLabel);\n this.textarea.setAttribute('aria-multiline', 'false');\n this.textarea.setAttribute('autocorrect', 'off');\n this.textarea.setAttribute('autocapitalize', 'off');\n this.textarea.setAttribute('spellcheck', 'false');\n this.textarea.tabIndex = 0;\n this.register(addDisposableDomListener(this.textarea, 'focus', (ev: KeyboardEvent) => this._onTextAreaFocus(ev)));\n this.register(addDisposableDomListener(this.textarea, 'blur', () => this._onTextAreaBlur()));\n this._helperContainer.appendChild(this.textarea);\n\n const coreBrowserService = this._instantiationService.createInstance(CoreBrowserService, this.textarea);\n this._instantiationService.setService(ICoreBrowserService, coreBrowserService);\n\n this._charSizeService = this._instantiationService.createInstance(CharSizeService, this._document, this._helperContainer);\n this._instantiationService.setService(ICharSizeService, this._charSizeService);\n\n this._compositionView = document.createElement('div');\n this._compositionView.classList.add('composition-view');\n this._compositionHelper = this._instantiationService.createInstance(CompositionHelper, this.textarea, this._compositionView);\n this._helperContainer.appendChild(this._compositionView);\n\n // Performance: Add viewport and helper elements from the fragment\n this.element.appendChild(fragment);\n\n this._theme = this.options.theme || this._theme;\n this._colorManager = new ColorManager(document, this.options.allowTransparency);\n this.register(this.optionsService.onOptionChange(e => this._colorManager!.onOptionsChange(e)));\n this._colorManager.setTheme(this._theme);\n\n const renderer = this._createRenderer();\n this._renderService = this.register(this._instantiationService.createInstance(RenderService, renderer, this.rows, this.screenElement));\n this._instantiationService.setService(IRenderService, this._renderService);\n this.register(this._renderService.onRenderedBufferChange(e => this._onRender.fire(e)));\n this.onResize(e => this._renderService!.resize(e.cols, e.rows));\n\n this._soundService = this._instantiationService.createInstance(SoundService);\n this._instantiationService.setService(ISoundService, this._soundService);\n this._mouseService = this._instantiationService.createInstance(MouseService);\n this._instantiationService.setService(IMouseService, this._mouseService);\n\n this.viewport = this._instantiationService.createInstance(Viewport,\n (amount: number, suppressEvent: boolean) => this.scrollLines(amount, suppressEvent),\n this._viewportElement,\n this._viewportScrollArea\n );\n this.viewport.onThemeChange(this._colorManager.colors);\n this.register(this._inputHandler.onRequestSyncScrollBar(() => this.viewport!.syncScrollArea()));\n this.register(this.viewport);\n\n this.register(this.onCursorMove(() => this._renderService!.onCursorMove()));\n this.register(this.onResize(() => this._renderService!.onResize(this.cols, this.rows)));\n this.register(this.onBlur(() => this._renderService!.onBlur()));\n this.register(this.onFocus(() => this._renderService!.onFocus()));\n this.register(this._renderService.onDimensionsChange(() => this.viewport!.syncScrollArea()));\n\n this._selectionService = this.register(this._instantiationService.createInstance(SelectionService,\n this.element,\n this.screenElement));\n this._instantiationService.setService(ISelectionService, this._selectionService);\n this.register(this._selectionService.onRequestScrollLines(e => this.scrollLines(e.amount, e.suppressScrollEvent)));\n this.register(this._selectionService.onSelectionChange(() => this._onSelectionChange.fire()));\n this.register(this._selectionService.onRequestRedraw(e => this._renderService!.onSelectionChanged(e.start, e.end, e.columnSelectMode)));\n this.register(this._selectionService.onLinuxMouseSelection(text => {\n // If there's a new selection, put it into the textarea, focus and select it\n // in order to register it as a selection on the OS. This event is fired\n // only on Linux to enable middle click to paste selection.\n this.textarea!.value = text;\n this.textarea!.focus();\n this.textarea!.select();\n }));\n this.register(this.onScroll(() => {\n this.viewport!.syncScrollArea();\n this._selectionService!.refresh();\n }));\n this.register(addDisposableDomListener(this._viewportElement, 'scroll', () => this._selectionService!.refresh()));\n\n this._mouseZoneManager = this._instantiationService.createInstance(MouseZoneManager, this.element, this.screenElement);\n this.register(this._mouseZoneManager);\n this.register(this.onScroll(() => this._mouseZoneManager!.clearAll()));\n this.linkifier.attachToDom(this.element, this._mouseZoneManager);\n this.linkifier2.attachToDom(this.element, this._mouseService, this._renderService);\n\n // This event listener must be registered aftre MouseZoneManager is created\n this.register(addDisposableDomListener(this.element, 'mousedown', (e: MouseEvent) => this._selectionService!.onMouseDown(e)));\n\n // apply mouse event classes set by escape codes before terminal was attached\n if (this._coreMouseService.areMouseEventsActive) {\n this._selectionService.disable();\n this.element.classList.add('enable-mouse-events');\n } else {\n this._selectionService.enable();\n }\n\n if (this.options.screenReaderMode) {\n // Note that this must be done *after* the renderer is created in order to\n // ensure the correct order of the dprchange event\n this._accessibilityManager = new AccessibilityManager(this, this._renderService);\n }\n\n // Measure the character size\n this._charSizeService.measure();\n\n // Setup loop that draws to screen\n this.refresh(0, this.rows - 1);\n\n // Initialize global actions that need to be taken on the document.\n this._initGlobal();\n\n // Listen for mouse events and translate\n // them into terminal mouse protocols.\n this.bindMouse();\n }\n\n private _createRenderer(): IRenderer {\n switch (this.options.rendererType) {\n case 'canvas': return this._instantiationService.createInstance(Renderer, this._colorManager!.colors, this.screenElement!, this.linkifier, this.linkifier2);\n case 'dom': return this._instantiationService.createInstance(DomRenderer, this._colorManager!.colors, this.element!, this.screenElement!, this._viewportElement!, this.linkifier, this.linkifier2);\n default: throw new Error(`Unrecognized rendererType \"${this.options.rendererType}\"`);\n }\n }\n\n /**\n * Sets the theme on the renderer. The renderer must have been initialized.\n * @param theme The theme to set.\n */\n private _setTheme(theme: ITheme): void {\n this._theme = theme;\n this._colorManager?.setTheme(theme);\n this._renderService?.setColors(this._colorManager!.colors);\n this.viewport?.onThemeChange(this._colorManager!.colors);\n }\n\n /**\n * Bind certain mouse events to the terminal.\n * By default only 3 button + wheel up/down is ativated. For higher buttons\n * no mouse report will be created. Typically the standard actions will be active.\n *\n * There are several reasons not to enable support for higher buttons/wheel:\n * - Button 4 and 5 are typically used for history back and forward navigation,\n * there is no straight forward way to supress/intercept those standard actions.\n * - Support for higher buttons does not work in some platform/browser combinations.\n * - Left/right wheel was not tested.\n * - Emulators vary in mouse button support, typically only 3 buttons and\n * wheel up/down work reliable.\n *\n * TODO: Move mouse event code into its own file.\n */\n public bindMouse(): void {\n const self = this;\n const el = this.element!;\n\n // send event to CoreMouseService\n function sendEvent(ev: MouseEvent | WheelEvent): boolean {\n // get mouse coordinates\n const pos = self._mouseService!.getRawByteCoords(ev, self.screenElement!, self.cols, self.rows);\n if (!pos) {\n return false;\n }\n\n let but: CoreMouseButton;\n let action: CoreMouseAction | undefined;\n switch ((<any>ev).overrideType || ev.type) {\n case 'mousemove':\n action = CoreMouseAction.MOVE;\n if (ev.buttons === undefined) {\n // buttons is not supported on macOS, try to get a value from button instead\n but = CoreMouseButton.NONE;\n if (ev.button !== undefined) {\n but = ev.button < 3 ? ev.button : CoreMouseButton.NONE;\n }\n } else {\n // according to MDN buttons only reports up to button 5 (AUX2)\n but = ev.buttons & 1 ? CoreMouseButton.LEFT :\n ev.buttons & 4 ? CoreMouseButton.MIDDLE :\n ev.buttons & 2 ? CoreMouseButton.RIGHT :\n CoreMouseButton.NONE; // fallback to NONE\n }\n break;\n case 'mouseup':\n action = CoreMouseAction.UP;\n but = ev.button < 3 ? ev.button : CoreMouseButton.NONE;\n break;\n case 'mousedown':\n action = CoreMouseAction.DOWN;\n but = ev.button < 3 ? ev.button : CoreMouseButton.NONE;\n break;\n case 'wheel':\n // only UP/DOWN wheel events are respected\n if ((ev as WheelEvent).deltaY !== 0) {\n action = (ev as WheelEvent).deltaY < 0 ? CoreMouseAction.UP : CoreMouseAction.DOWN;\n }\n but = CoreMouseButton.WHEEL;\n break;\n default:\n // dont handle other event types by accident\n return false;\n }\n\n // exit if we cannot determine valid button/action values\n // do nothing for higher buttons than wheel\n if (action === undefined || but === undefined || but > CoreMouseButton.WHEEL) {\n return false;\n }\n\n return self._coreMouseService.triggerMouseEvent({\n col: pos.x - 33, // FIXME: why -33 here?\n row: pos.y - 33,\n button: but,\n action,\n ctrl: ev.ctrlKey,\n alt: ev.altKey,\n shift: ev.shiftKey\n });\n }\n\n /**\n * Event listener state handling.\n * We listen to the onProtocolChange event of CoreMouseService and put\n * requested listeners in `requestedEvents`. With this the listeners\n * have all bits to do the event listener juggling.\n * Note: 'mousedown' currently is \"always on\" and not managed\n * by onProtocolChange.\n */\n const requestedEvents: { [key: string]: ((ev: Event) => void) | null } = {\n mouseup: null,\n wheel: null,\n mousedrag: null,\n mousemove: null\n };\n const eventListeners: { [key: string]: (ev: any) => void | boolean } = {\n mouseup: (ev: MouseEvent) => {\n sendEvent(ev);\n if (!ev.buttons) {\n // if no other button is held remove global handlers\n this._document!.removeEventListener('mouseup', requestedEvents.mouseup!);\n if (requestedEvents.mousedrag) {\n this._document!.removeEventListener('mousemove', requestedEvents.mousedrag);\n }\n }\n return this.cancel(ev);\n },\n wheel: (ev: WheelEvent) => {\n sendEvent(ev);\n ev.preventDefault();\n return this.cancel(ev);\n },\n mousedrag: (ev: MouseEvent) => {\n // deal only with move while a button is held\n if (ev.buttons) {\n sendEvent(ev);\n }\n },\n mousemove: (ev: MouseEvent) => {\n // deal only with move without any button\n if (!ev.buttons) {\n sendEvent(ev);\n }\n }\n };\n this.register(this._coreMouseService.onProtocolChange(events => {\n // apply global changes on events\n if (events) {\n if (this.optionsService.options.logLevel === 'debug') {\n this._logService.debug('Binding to mouse events:', this._coreMouseService.explainEvents(events));\n }\n this.element!.classList.add('enable-mouse-events');\n this._selectionService!.disable();\n } else {\n this._logService.debug('Unbinding from mouse events.');\n this.element!.classList.remove('enable-mouse-events');\n this._selectionService!.enable();\n }\n\n // add/remove handlers from requestedEvents\n\n if (!(events & CoreMouseEventType.MOVE)) {\n el.removeEventListener('mousemove', requestedEvents.mousemove!);\n requestedEvents.mousemove = null;\n } else if (!requestedEvents.mousemove) {\n el.addEventListener('mousemove', eventListeners.mousemove);\n requestedEvents.mousemove = eventListeners.mousemove;\n }\n\n if (!(events & CoreMouseEventType.WHEEL)) {\n el.removeEventListener('wheel', requestedEvents.wheel!);\n requestedEvents.wheel = null;\n } else if (!requestedEvents.wheel) {\n el.addEventListener('wheel', eventListeners.wheel, { passive: false });\n requestedEvents.wheel = eventListeners.wheel;\n }\n\n if (!(events & CoreMouseEventType.UP)) {\n this._document!.removeEventListener('mouseup', requestedEvents.mouseup!);\n requestedEvents.mouseup = null;\n } else if (!requestedEvents.mouseup) {\n requestedEvents.mouseup = eventListeners.mouseup;\n }\n\n if (!(events & CoreMouseEventType.DRAG)) {\n this._document!.removeEventListener('mousemove', requestedEvents.mousedrag!);\n requestedEvents.mousedrag = null;\n } else if (!requestedEvents.mousedrag) {\n requestedEvents.mousedrag = eventListeners.mousedrag;\n }\n }));\n // force initial onProtocolChange so we dont miss early mouse requests\n this._coreMouseService.activeProtocol = this._coreMouseService.activeProtocol;\n\n /**\n * \"Always on\" event listeners.\n */\n this.register(addDisposableDomListener(el, 'mousedown', (ev: MouseEvent) => {\n ev.preventDefault();\n this.focus();\n\n // Don't send the mouse button to the pty if mouse events are disabled or\n // if the selection manager is having selection forced (ie. a modifier is\n // held).\n if (!this._coreMouseService.areMouseEventsActive || this._selectionService!.shouldForceSelection(ev)) {\n return;\n }\n\n sendEvent(ev);\n\n // Register additional global handlers which should keep reporting outside\n // of the terminal element.\n // Note: Other emulators also do this for 'mousedown' while a button\n // is held, we currently limit 'mousedown' to the terminal only.\n if (requestedEvents.mouseup) {\n this._document!.addEventListener('mouseup', requestedEvents.mouseup);\n }\n if (requestedEvents.mousedrag) {\n this._document!.addEventListener('mousemove', requestedEvents.mousedrag);\n }\n\n return this.cancel(ev);\n }));\n\n this.register(addDisposableDomListener(el, 'wheel', (ev: WheelEvent) => {\n if (!requestedEvents.wheel) {\n // Convert wheel events into up/down events when the buffer does not have scrollback, this\n // enables scrolling in apps hosted in the alt buffer such as vim or tmux.\n if (!this.buffer.hasScrollback) {\n const amount = this.viewport!.getLinesScrolled(ev);\n\n // Do nothing if there's no vertical scroll\n if (amount === 0) {\n return;\n }\n\n // Construct and send sequences\n const sequence = C0.ESC + (this._coreService.decPrivateModes.applicationCursorKeys ? 'O' : '[') + (ev.deltaY < 0 ? 'A' : 'B');\n let data = '';\n for (let i = 0; i < Math.abs(amount); i++) {\n data += sequence;\n }\n this._coreService.triggerDataEvent(data, true);\n }\n return;\n }\n }, { passive: true }));\n\n // allow wheel scrolling in\n // the shell for example\n this.register(addDisposableDomListener(el, 'wheel', (ev: WheelEvent) => {\n if (requestedEvents.wheel) return;\n if (!this.viewport!.onWheel(ev)) {\n return this.cancel(ev);\n }\n }, { passive: true }));\n\n this.register(addDisposableDomListener(el, 'touchstart', (ev: TouchEvent) => {\n if (this._coreMouseService.areMouseEventsActive) return;\n this.viewport!.onTouchStart(ev);\n return this.cancel(ev);\n }, { passive: true }));\n\n this.register(addDisposableDomListener(el, 'touchmove', (ev: TouchEvent) => {\n if (this._coreMouseService.areMouseEventsActive) return;\n if (!this.viewport!.onTouchMove(ev)) {\n return this.cancel(ev);\n }\n }, { passive: true }));\n }\n\n\n /**\n * Tells the renderer to refresh terminal content between two rows (inclusive) at the next\n * opportunity.\n * @param start The row to start from (between 0 and this.rows - 1).\n * @param end The row to end at (between start and this.rows - 1).\n */\n public refresh(start: number, end: number): void {\n this._renderService?.refreshRows(start, end);\n }\n\n /**\n * Queues linkification for the specified rows.\n * @param start The row to start from (between 0 and this.rows - 1).\n * @param end The row to end at (between start and this.rows - 1).\n */\n private _queueLinkification(start: number, end: number): void {\n this.linkifier?.linkifyRows(start, end);\n }\n\n /**\n * Change the cursor style for different selection modes\n */\n public updateCursorStyle(ev: KeyboardEvent): void {\n if (this._selectionService && this._selectionService.shouldColumnSelect(ev)) {\n this.element!.classList.add('column-select');\n } else {\n this.element!.classList.remove('column-select');\n }\n }\n\n /**\n * Display the cursor element\n */\n private _showCursor(): void {\n if (!this._coreService.isCursorInitialized) {\n this._coreService.isCursorInitialized = true;\n this.refresh(this.buffer.y, this.buffer.y);\n }\n }\n\n public scrollLines(disp: number, suppressScrollEvent?: boolean): void {\n super.scrollLines(disp, suppressScrollEvent);\n this.refresh(0, this.rows - 1);\n }\n\n public paste(data: string): void {\n paste(data, this.textarea!, this._coreService);\n }\n\n /**\n * Attaches a custom key event handler which is run before keys are processed,\n * giving consumers of xterm.js ultimate control as to what keys should be\n * processed by the terminal and what keys should not.\n * @param customKeyEventHandler The custom KeyboardEvent handler to attach.\n * This is a function that takes a KeyboardEvent, allowing consumers to stop\n * propagation and/or prevent the default action. The function returns whether\n * the event should be processed by xterm.js.\n */\n public attachCustomKeyEventHandler(customKeyEventHandler: CustomKeyEventHandler): void {\n this._customKeyEventHandler = customKeyEventHandler;\n }\n\n /**\n * Registers a link matcher, allowing custom link patterns to be matched and\n * handled.\n * @param regex The regular expression to search for, specifically\n * this searches the textContent of the rows. You will want to use \\s to match\n * a space ' ' character for example.\n * @param handler The callback when the link is called.\n * @param options Options for the link matcher.\n * @return The ID of the new matcher, this can be used to deregister.\n */\n public registerLinkMatcher(regex: RegExp, handler: LinkMatcherHandler, options?: ILinkMatcherOptions): number {\n const matcherId = this.linkifier.registerLinkMatcher(regex, handler, options);\n this.refresh(0, this.rows - 1);\n return matcherId;\n }\n\n /**\n * Deregisters a link matcher if it has been registered.\n * @param matcherId The link matcher's ID (returned after register)\n */\n public deregisterLinkMatcher(matcherId: number): void {\n if (this.linkifier.deregisterLinkMatcher(matcherId)) {\n this.refresh(0, this.rows - 1);\n }\n }\n\n public registerLinkProvider(linkProvider: ILinkProvider): IDisposable {\n return this.linkifier2.registerLinkProvider(linkProvider);\n }\n\n public registerCharacterJoiner(handler: CharacterJoinerHandler): number {\n const joinerId = this._renderService!.registerCharacterJoiner(handler);\n this.refresh(0, this.rows - 1);\n return joinerId;\n }\n\n public deregisterCharacterJoiner(joinerId: number): void {\n if (this._renderService!.deregisterCharacterJoiner(joinerId)) {\n this.refresh(0, this.rows - 1);\n }\n }\n\n public get markers(): IMarker[] {\n return this.buffer.markers;\n }\n\n public addMarker(cursorYOffset: number): IMarker | undefined {\n // Disallow markers on the alt buffer\n if (this.buffer !== this.buffers.normal) {\n return;\n }\n\n return this.buffer.addMarker(this.buffer.ybase + this.buffer.y + cursorYOffset);\n }\n\n /**\n * Gets whether the terminal has an active selection.\n */\n public hasSelection(): boolean {\n return this._selectionService ? this._selectionService.hasSelection : false;\n }\n\n /**\n * Selects text within the terminal.\n * @param column The column the selection starts at..\n * @param row The row the selection starts at.\n * @param length The length of the selection.\n */\n public select(column: number, row: number, length: number): void {\n this._selectionService!.setSelection(column, row, length);\n }\n\n /**\n * Gets the terminal's current selection, this is useful for implementing copy\n * behavior outside of xterm.js.\n */\n public getSelection(): string {\n return this._selectionService ? this._selectionService.selectionText : '';\n }\n\n public getSelectionPosition(): ISelectionPosition | undefined {\n if (!this._selectionService || !this._selectionService.hasSelection) {\n return undefined;\n }\n\n return {\n startColumn: this._selectionService.selectionStart![0],\n startRow: this._selectionService.selectionStart![1],\n endColumn: this._selectionService.selectionEnd![0],\n endRow: this._selectionService.selectionEnd![1]\n };\n }\n\n /**\n * Clears the current terminal selection.\n */\n public clearSelection(): void {\n this._selectionService?.clearSelection();\n }\n\n /**\n * Selects all text within the terminal.\n */\n public selectAll(): void {\n this._selectionService?.selectAll();\n }\n\n public selectLines(start: number, end: number): void {\n this._selectionService?.selectLines(start, end);\n }\n\n /**\n * Handle a keydown event\n * Key Resources:\n * - https://developer.mozilla.org/en-US/docs/DOM/KeyboardEvent\n * @param ev The keydown event to be handled.\n */\n protected _keyDown(event: KeyboardEvent): boolean | undefined {\n this._keyDownHandled = false;\n\n if (this._customKeyEventHandler && this._customKeyEventHandler(event) === false) {\n return false;\n }\n\n if (!this._compositionHelper!.keydown(event)) {\n if (this.buffer.ybase !== this.buffer.ydisp) {\n this.scrollToBottom();\n }\n return false;\n }\n\n const result = evaluateKeyboardEvent(event, this._coreService.decPrivateModes.applicationCursorKeys, this.browser.isMac, this.options.macOptionIsMeta);\n\n this.updateCursorStyle(event);\n\n if (result.type === KeyboardResultType.PAGE_DOWN || result.type === KeyboardResultType.PAGE_UP) {\n const scrollCount = this.rows - 1;\n this.scrollLines(result.type === KeyboardResultType.PAGE_UP ? -scrollCount : scrollCount);\n return this.cancel(event, true);\n }\n\n if (result.type === KeyboardResultType.SELECT_ALL) {\n this.selectAll();\n }\n\n if (this._isThirdLevelShift(this.browser, event)) {\n return true;\n }\n\n if (result.cancel) {\n // The event is canceled at the end already, is this necessary?\n this.cancel(event, true);\n }\n\n if (!result.key) {\n return true;\n }\n\n // If ctrl+c or enter is being sent, clear out the textarea. This is done so that screen readers\n // will announce deleted characters. This will not work 100% of the time but it should cover\n // most scenarios.\n if (result.key === C0.ETX || result.key === C0.CR) {\n this.textarea!.value = '';\n }\n\n this._onKey.fire({ key: result.key, domEvent: event });\n this._showCursor();\n this._coreService.triggerDataEvent(result.key, true);\n\n // Cancel events when not in screen reader mode so events don't get bubbled up and handled by\n // other listeners. When screen reader mode is enabled, this could cause issues if the event\n // is handled at a higher level, this is a compromise in order to echo keys to the screen\n // reader.\n if (!this.optionsService.options.screenReaderMode) {\n return this.cancel(event, true);\n }\n\n this._keyDownHandled = true;\n }\n\n private _isThirdLevelShift(browser: IBrowser, ev: IKeyboardEvent): boolean {\n const thirdLevelKey =\n (browser.isMac && !this.options.macOptionIsMeta && ev.altKey && !ev.ctrlKey && !ev.metaKey) ||\n (browser.isWindows && ev.altKey && ev.ctrlKey && !ev.metaKey);\n\n if (ev.type === 'keypress') {\n return thirdLevelKey;\n }\n\n // Don't invoke for arrows, pageDown, home, backspace, etc. (on non-keypress events)\n return thirdLevelKey && (!ev.keyCode || ev.keyCode > 47);\n }\n\n protected _keyUp(ev: KeyboardEvent): void {\n if (this._customKeyEventHandler && this._customKeyEventHandler(ev) === false) {\n return;\n }\n\n if (!wasModifierKeyOnlyEvent(ev)) {\n this.focus();\n }\n\n this.updateCursorStyle(ev);\n }\n\n /**\n * Handle a keypress event.\n * Key Resources:\n * - https://developer.mozilla.org/en-US/docs/DOM/KeyboardEvent\n * @param ev The keypress event to be handled.\n */\n protected _keyPress(ev: KeyboardEvent): boolean {\n let key;\n\n if (this._keyDownHandled) {\n return false;\n }\n\n if (this._customKeyEventHandler && this._customKeyEventHandler(ev) === false) {\n return false;\n }\n\n this.cancel(ev);\n\n if (ev.charCode) {\n key = ev.charCode;\n } else if (ev.which === null || ev.which === undefined) {\n key = ev.keyCode;\n } else if (ev.which !== 0 && ev.charCode !== 0) {\n key = ev.which;\n } else {\n return false;\n }\n\n if (!key || (\n (ev.altKey || ev.ctrlKey || ev.metaKey) && !this._isThirdLevelShift(this.browser, ev)\n )) {\n return false;\n }\n\n key = String.fromCharCode(key);\n\n this._onKey.fire({ key, domEvent: ev });\n this._showCursor();\n this._coreService.triggerDataEvent(key, true);\n\n return true;\n }\n\n /**\n * Ring the bell.\n * Note: We could do sweet things with webaudio here\n */\n public bell(): void {\n if (this._soundBell()) {\n this._soundService!.playBellSound();\n }\n\n // if (this._visualBell()) {\n // this.element.classList.add('visual-bell-active');\n // clearTimeout(this._visualBellTimer);\n // this._visualBellTimer = window.setTimeout(() => {\n // this.element.classList.remove('visual-bell-active');\n // }, 200);\n // }\n }\n\n /**\n * Resizes the terminal.\n *\n * @param x The number of columns to resize to.\n * @param y The number of rows to resize to.\n */\n public resize(x: number, y: number): void {\n if (x === this.cols && y === this.rows) {\n // Check if we still need to measure the char size (fixes #785).\n if (this._charSizeService && !this._charSizeService.hasValidSize) {\n this._charSizeService.measure();\n }\n return;\n }\n\n super.resize(x, y);\n }\n\n private _afterResize(x: number, y: number): void {\n this._charSizeService?.measure();\n\n // Sync the scroll area to make sure scroll events don't fire and scroll the viewport to an\n // invalid location\n this.viewport?.syncScrollArea(true);\n }\n\n /**\n * Clear the entire buffer, making the prompt line the new first line.\n */\n public clear(): void {\n if (this.buffer.ybase === 0 && this.buffer.y === 0) {\n // Don't clear if it's already clear\n return;\n }\n this.buffer.lines.set(0, this.buffer.lines.get(this.buffer.ybase + this.buffer.y)!);\n this.buffer.lines.length = 1;\n this.buffer.ydisp = 0;\n this.buffer.ybase = 0;\n this.buffer.y = 0;\n for (let i = 1; i < this.rows; i++) {\n this.buffer.lines.push(this.buffer.getBlankLine(DEFAULT_ATTR_DATA));\n }\n this.refresh(0, this.rows - 1);\n this._onScroll.fire(this.buffer.ydisp);\n }\n\n /**\n * Reset terminal.\n * Note: Calling this directly from JS is synchronous but does not clear\n * input buffers and does not reset the parser, thus the terminal will\n * continue to apply pending input data.\n * If you need in band reset (synchronous with input data) consider\n * using DECSTR (soft reset, CSI ! p) or RIS instead (hard reset, ESC c).\n */\n public reset(): void {\n /**\n * Since _setup handles a full terminal creation, we have to carry forward\n * a few things that should not reset.\n */\n this.options.rows = this.rows;\n this.options.cols = this.cols;\n const customKeyEventHandler = this._customKeyEventHandler;\n\n this._setup();\n super.reset();\n this._selectionService?.reset();\n\n // reattach\n this._customKeyEventHandler = customKeyEventHandler;\n\n // do a full screen refresh\n this.refresh(0, this.rows - 1);\n this.viewport?.syncScrollArea();\n }\n\n private _reportWindowsOptions(type: WindowsOptionsReportType): void {\n if (!this._renderService) {\n return;\n }\n\n switch (type) {\n case WindowsOptionsReportType.GET_WIN_SIZE_PIXELS:\n const canvasWidth = this._renderService.dimensions.scaledCanvasWidth.toFixed(0);\n const canvasHeight = this._renderService.dimensions.scaledCanvasHeight.toFixed(0);\n this._coreService.triggerDataEvent(`${C0.ESC}[4;${canvasHeight};${canvasWidth}t`);\n break;\n case WindowsOptionsReportType.GET_CELL_SIZE_PIXELS:\n const cellWidth = this._renderService.dimensions.scaledCellWidth.toFixed(0);\n const cellHeight = this._renderService.dimensions.scaledCellHeight.toFixed(0);\n this._coreService.triggerDataEvent(`${C0.ESC}[6;${cellHeight};${cellWidth}t`);\n break;\n }\n }\n\n // TODO: Remove cancel function and cancelEvents option\n public cancel(ev: Event, force?: boolean): boolean | undefined {\n if (!this.options.cancelEvents && !force) {\n return;\n }\n ev.preventDefault();\n ev.stopPropagation();\n return false;\n }\n\n private _visualBell(): boolean {\n return false;\n // return this.options.bellStyle === 'visual' ||\n // this.options.bellStyle === 'both';\n }\n\n private _soundBell(): boolean {\n return this.options.bellStyle === 'sound';\n // return this.options.bellStyle === 'sound' ||\n // this.options.bellStyle === 'both';\n }\n}\n\n/**\n * Helpers\n */\n\nfunction wasModifierKeyOnlyEvent(ev: KeyboardEvent): boolean {\n return ev.keyCode === 16 || // Shift\n ev.keyCode === 17 || // Ctrl\n ev.keyCode === 18; // Alt\n}\n","/**\n * Copyright (c) 2016 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { ICharSizeService } from 'browser/services/Services';\nimport { IBufferService, ICoreService, IOptionsService } from 'common/services/Services';\n\ninterface IPosition {\n start: number;\n end: number;\n}\n\n/**\n * Encapsulates the logic for handling compositionstart, compositionupdate and compositionend\n * events, displaying the in-progress composition to the UI and forwarding the final composition\n * to the handler.\n */\nexport class CompositionHelper {\n /**\n * Whether input composition is currently happening, eg. via a mobile keyboard, speech input or\n * IME. This variable determines whether the compositionText should be displayed on the UI.\n */\n private _isComposing: boolean;\n\n /**\n * The position within the input textarea's value of the current composition.\n */\n private _compositionPosition: IPosition;\n\n /**\n * Whether a composition is in the process of being sent, setting this to false will cancel any\n * in-progress composition.\n */\n private _isSendingComposition: boolean;\n\n constructor(\n private readonly _textarea: HTMLTextAreaElement,\n private readonly _compositionView: HTMLElement,\n @IBufferService private readonly _bufferService: IBufferService,\n @IOptionsService private readonly _optionsService: IOptionsService,\n @ICharSizeService private readonly _charSizeService: ICharSizeService,\n @ICoreService private readonly _coreService: ICoreService\n ) {\n this._isComposing = false;\n this._isSendingComposition = false;\n this._compositionPosition = { start: 0, end: 0 };\n }\n\n /**\n * Handles the compositionstart event, activating the composition view.\n */\n public compositionstart(): void {\n this._isComposing = true;\n this._compositionPosition.start = this._textarea.value.length;\n this._compositionView.textContent = '';\n this._compositionView.classList.add('active');\n }\n\n /**\n * Handles the compositionupdate event, updating the composition view.\n * @param ev The event.\n */\n public compositionupdate(ev: CompositionEvent): void {\n this._compositionView.textContent = ev.data;\n this.updateCompositionElements();\n setTimeout(() => {\n this._compositionPosition.end = this._textarea.value.length;\n }, 0);\n }\n\n /**\n * Handles the compositionend event, hiding the composition view and sending the composition to\n * the handler.\n */\n public compositionend(): void {\n this._finalizeComposition(true);\n }\n\n /**\n * Handles the keydown event, routing any necessary events to the CompositionHelper functions.\n * @param ev The keydown event.\n * @return Whether the Terminal should continue processing the keydown event.\n */\n public keydown(ev: KeyboardEvent): boolean {\n if (this._isComposing || this._isSendingComposition) {\n if (ev.keyCode === 229) {\n // Continue composing if the keyCode is the \"composition character\"\n return false;\n }\n if (ev.keyCode === 16 || ev.keyCode === 17 || ev.keyCode === 18) {\n // Continue composing if the keyCode is a modifier key\n return false;\n }\n // Finish composition immediately. This is mainly here for the case where enter is\n // pressed and the handler needs to be triggered before the command is executed.\n this._finalizeComposition(false);\n }\n\n if (ev.keyCode === 229) {\n // If the \"composition character\" is used but gets to this point it means a non-composition\n // character (eg. numbers and punctuation) was pressed when the IME was active.\n this._handleAnyTextareaChanges();\n return false;\n }\n\n return true;\n }\n\n /**\n * Finalizes the composition, resuming regular input actions. This is called when a composition\n * is ending.\n * @param waitForPropagation Whether to wait for events to propagate before sending\n * the input. This should be false if a non-composition keystroke is entered before the\n * compositionend event is triggered, such as enter, so that the composition is sent before\n * the command is executed.\n */\n private _finalizeComposition(waitForPropagation: boolean): void {\n this._compositionView.classList.remove('active');\n this._isComposing = false;\n this._clearTextareaPosition();\n\n if (!waitForPropagation) {\n // Cancel any delayed composition send requests and send the input immediately.\n this._isSendingComposition = false;\n const input = this._textarea.value.substring(this._compositionPosition.start, this._compositionPosition.end);\n this._coreService.triggerDataEvent(input, true);\n } else {\n // Make a deep copy of the composition position here as a new compositionstart event may\n // fire before the setTimeout executes.\n const currentCompositionPosition = {\n start: this._compositionPosition.start,\n end: this._compositionPosition.end\n };\n\n // Since composition* events happen before the changes take place in the textarea on most\n // browsers, use a setTimeout with 0ms time to allow the native compositionend event to\n // complete. This ensures the correct character is retrieved.\n // This solution was used because:\n // - The compositionend event's data property is unreliable, at least on Chromium\n // - The last compositionupdate event's data property does not always accurately describe\n // the character, a counter example being Korean where an ending consonsant can move to\n // the following character if the following input is a vowel.\n this._isSendingComposition = true;\n setTimeout(() => {\n // Ensure that the input has not already been sent\n if (this._isSendingComposition) {\n this._isSendingComposition = false;\n let input;\n if (this._isComposing) {\n // Use the end position to get the string if a new composition has started.\n input = this._textarea.value.substring(currentCompositionPosition.start, currentCompositionPosition.end);\n } else {\n // Don't use the end position here in order to pick up any characters after the\n // composition has finished, for example when typing a non-composition character\n // (eg. 2) after a composition character.\n input = this._textarea.value.substring(currentCompositionPosition.start);\n }\n this._coreService.triggerDataEvent(input, true);\n }\n }, 0);\n }\n }\n\n /**\n * Apply any changes made to the textarea after the current event chain is allowed to complete.\n * This should be called when not currently composing but a keydown event with the \"composition\n * character\" (229) is triggered, in order to allow non-composition text to be entered when an\n * IME is active.\n */\n private _handleAnyTextareaChanges(): void {\n const oldValue = this._textarea.value;\n setTimeout(() => {\n // Ignore if a composition has started since the timeout\n if (!this._isComposing) {\n const newValue = this._textarea.value;\n const diff = newValue.replace(oldValue, '');\n if (diff.length > 0) {\n this._coreService.triggerDataEvent(diff, true);\n }\n }\n }, 0);\n }\n\n /**\n * Positions the composition view on top of the cursor and the textarea just below it (so the\n * IME helper dialog is positioned correctly).\n * @param dontRecurse Whether to use setTimeout to recursively trigger another update, this is\n * necessary as the IME events across browsers are not consistently triggered.\n */\n public updateCompositionElements(dontRecurse?: boolean): void {\n if (!this._isComposing) {\n return;\n }\n\n if (this._bufferService.buffer.isCursorInViewport) {\n const cellHeight = Math.ceil(this._charSizeService.height * this._optionsService.options.lineHeight);\n const cursorTop = this._bufferService.buffer.y * cellHeight;\n const cursorLeft = this._bufferService.buffer.x * this._charSizeService.width;\n\n this._compositionView.style.left = cursorLeft + 'px';\n this._compositionView.style.top = cursorTop + 'px';\n this._compositionView.style.height = cellHeight + 'px';\n this._compositionView.style.lineHeight = cellHeight + 'px';\n this._compositionView.style.fontFamily = this._optionsService.options.fontFamily;\n this._compositionView.style.fontSize = this._optionsService.options.fontSize + 'px';\n // Sync the textarea to the exact position of the composition view so the IME knows where the\n // text is.\n const compositionViewBounds = this._compositionView.getBoundingClientRect();\n this._textarea.style.left = cursorLeft + 'px';\n this._textarea.style.top = cursorTop + 'px';\n this._textarea.style.width = compositionViewBounds.width + 'px';\n this._textarea.style.height = compositionViewBounds.height + 'px';\n this._textarea.style.lineHeight = compositionViewBounds.height + 'px';\n }\n\n if (!dontRecurse) {\n setTimeout(() => this.updateCompositionElements(true), 0);\n }\n }\n\n /**\n * Clears the textarea's position so that the cursor does not blink on IE.\n * @private\n */\n private _clearTextareaPosition(): void {\n this._textarea.style.left = '';\n this._textarea.style.top = '';\n }\n}\n","/**\n * Copyright (c) 2016 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { Disposable } from 'common/Lifecycle';\nimport { addDisposableDomListener } from 'browser/Lifecycle';\nimport { IColorSet, IViewport } from 'browser/Types';\nimport { ICharSizeService, IRenderService } from 'browser/services/Services';\nimport { IBufferService, IOptionsService } from 'common/services/Services';\n\nconst FALLBACK_SCROLL_BAR_WIDTH = 15;\n\n/**\n * Represents the viewport of a terminal, the visible area within the larger buffer of output.\n * Logic for the virtual scroll bar is included in this object.\n */\nexport class Viewport extends Disposable implements IViewport {\n public scrollBarWidth: number = 0;\n private _currentRowHeight: number = 0;\n private _lastRecordedBufferLength: number = 0;\n private _lastRecordedViewportHeight: number = 0;\n private _lastRecordedBufferHeight: number = 0;\n private _lastTouchY: number = 0;\n private _lastScrollTop: number = 0;\n\n // Stores a partial line amount when scrolling, this is used to keep track of how much of a line\n // is scrolled so we can \"scroll\" over partial lines and feel natural on touchpads. This is a\n // quick fix and could have a more robust solution in place that reset the value when needed.\n private _wheelPartialScroll: number = 0;\n\n private _refreshAnimationFrame: number | null = null;\n private _ignoreNextScrollEvent: boolean = false;\n\n constructor(\n private readonly _scrollLines: (amount: number, suppressEvent: boolean) => void,\n private readonly _viewportElement: HTMLElement,\n private readonly _scrollArea: HTMLElement,\n @IBufferService private readonly _bufferService: IBufferService,\n @IOptionsService private readonly _optionsService: IOptionsService,\n @ICharSizeService private readonly _charSizeService: ICharSizeService,\n @IRenderService private readonly _renderService: IRenderService\n ) {\n super();\n\n // Measure the width of the scrollbar. If it is 0 we can assume it's an OSX overlay scrollbar.\n // Unfortunately the overlay scrollbar would be hidden underneath the screen element in that case,\n // therefore we account for a standard amount to make it visible\n this.scrollBarWidth = (this._viewportElement.offsetWidth - this._scrollArea.offsetWidth) || FALLBACK_SCROLL_BAR_WIDTH;\n this.register(addDisposableDomListener(this._viewportElement, 'scroll', this._onScroll.bind(this)));\n\n // Perform this async to ensure the ICharSizeService is ready.\n setTimeout(() => this.syncScrollArea(), 0);\n }\n\n public onThemeChange(colors: IColorSet): void {\n this._viewportElement.style.backgroundColor = colors.background.css;\n }\n\n /**\n * Refreshes row height, setting line-height, viewport height and scroll area height if\n * necessary.\n */\n private _refresh(immediate: boolean): void {\n if (immediate) {\n this._innerRefresh();\n if (this._refreshAnimationFrame !== null) {\n cancelAnimationFrame(this._refreshAnimationFrame);\n }\n return;\n }\n if (this._refreshAnimationFrame === null) {\n this._refreshAnimationFrame = requestAnimationFrame(() => this._innerRefresh());\n }\n }\n\n private _innerRefresh(): void {\n if (this._charSizeService.height > 0) {\n this._currentRowHeight = this._renderService.dimensions.scaledCellHeight / window.devicePixelRatio;\n this._lastRecordedViewportHeight = this._viewportElement.offsetHeight;\n const newBufferHeight = Math.round(this._currentRowHeight * this._lastRecordedBufferLength) + (this._lastRecordedViewportHeight - this._renderService.dimensions.canvasHeight);\n if (this._lastRecordedBufferHeight !== newBufferHeight) {\n this._lastRecordedBufferHeight = newBufferHeight;\n this._scrollArea.style.height = this._lastRecordedBufferHeight + 'px';\n }\n }\n\n // Sync scrollTop\n const scrollTop = this._bufferService.buffer.ydisp * this._currentRowHeight;\n if (this._viewportElement.scrollTop !== scrollTop) {\n // Ignore the next scroll event which will be triggered by setting the scrollTop as we do not\n // want this event to scroll the terminal\n this._ignoreNextScrollEvent = true;\n this._viewportElement.scrollTop = scrollTop;\n }\n\n this._refreshAnimationFrame = null;\n }\n /**\n * Updates dimensions and synchronizes the scroll area if necessary.\n */\n public syncScrollArea(immediate: boolean = false): void {\n // If buffer height changed\n if (this._lastRecordedBufferLength !== this._bufferService.buffer.lines.length) {\n this._lastRecordedBufferLength = this._bufferService.buffer.lines.length;\n this._refresh(immediate);\n return;\n }\n\n // If viewport height changed\n if (this._lastRecordedViewportHeight !== this._renderService.dimensions.canvasHeight) {\n this._refresh(immediate);\n return;\n }\n\n // If the buffer position doesn't match last scroll top\n const newScrollTop = this._bufferService.buffer.ydisp * this._currentRowHeight;\n if (this._lastScrollTop !== newScrollTop) {\n this._refresh(immediate);\n return;\n }\n\n // If element's scroll top changed, this can happen when hiding the element\n if (this._lastScrollTop !== this._viewportElement.scrollTop) {\n this._refresh(immediate);\n return;\n }\n\n // If row height changed\n if (this._renderService.dimensions.scaledCellHeight / window.devicePixelRatio !== this._currentRowHeight) {\n this._refresh(immediate);\n return;\n }\n }\n\n /**\n * Handles scroll events on the viewport, calculating the new viewport and requesting the\n * terminal to scroll to it.\n * @param ev The scroll event.\n */\n private _onScroll(ev: Event): void {\n // Record current scroll top position\n this._lastScrollTop = this._viewportElement.scrollTop;\n\n // Don't attempt to scroll if the element is not visible, otherwise scrollTop will be corrupt\n // which causes the terminal to scroll the buffer to the top\n if (!this._viewportElement.offsetParent) {\n return;\n }\n\n // Ignore the event if it was flagged to ignore (when the source of the event is from Viewport)\n if (this._ignoreNextScrollEvent) {\n this._ignoreNextScrollEvent = false;\n return;\n }\n\n const newRow = Math.round(this._lastScrollTop / this._currentRowHeight);\n const diff = newRow - this._bufferService.buffer.ydisp;\n this._scrollLines(diff, true);\n }\n\n /**\n * Handles bubbling of scroll event in case the viewport has reached top or bottom\n * @param ev The scroll event.\n * @param amount The amount scrolled\n */\n private _bubbleScroll(ev: Event, amount: number): boolean {\n const scrollPosFromTop = this._viewportElement.scrollTop + this._lastRecordedViewportHeight;\n if ((amount < 0 && this._viewportElement.scrollTop !== 0) ||\n (amount > 0 && scrollPosFromTop < this._lastRecordedBufferHeight)) {\n if (ev.cancelable) {\n ev.preventDefault();\n }\n return false;\n }\n return true;\n }\n\n /**\n * Handles mouse wheel events by adjusting the viewport's scrollTop and delegating the actual\n * scrolling to `onScroll`, this event needs to be attached manually by the consumer of\n * `Viewport`.\n * @param ev The mouse wheel event.\n */\n public onWheel(ev: WheelEvent): boolean {\n const amount = this._getPixelsScrolled(ev);\n if (amount === 0) {\n return false;\n }\n this._viewportElement.scrollTop += amount;\n return this._bubbleScroll(ev, amount);\n }\n\n private _getPixelsScrolled(ev: WheelEvent): number {\n // Do nothing if it's not a vertical scroll event\n if (ev.deltaY === 0) {\n return 0;\n }\n\n // Fallback to WheelEvent.DOM_DELTA_PIXEL\n let amount = this._applyScrollModifier(ev.deltaY, ev);\n if (ev.deltaMode === WheelEvent.DOM_DELTA_LINE) {\n amount *= this._currentRowHeight;\n } else if (ev.deltaMode === WheelEvent.DOM_DELTA_PAGE) {\n amount *= this._currentRowHeight * this._bufferService.rows;\n }\n return amount;\n }\n\n /**\n * Gets the number of pixels scrolled by the mouse event taking into account what type of delta\n * is being used.\n * @param ev The mouse wheel event.\n */\n public getLinesScrolled(ev: WheelEvent): number {\n // Do nothing if it's not a vertical scroll event\n if (ev.deltaY === 0) {\n return 0;\n }\n\n // Fallback to WheelEvent.DOM_DELTA_LINE\n let amount = this._applyScrollModifier(ev.deltaY, ev);\n if (ev.deltaMode === WheelEvent.DOM_DELTA_PIXEL) {\n amount /= this._currentRowHeight + 0.0; // Prevent integer division\n this._wheelPartialScroll += amount;\n amount = Math.floor(Math.abs(this._wheelPartialScroll)) * (this._wheelPartialScroll > 0 ? 1 : -1);\n this._wheelPartialScroll %= 1;\n } else if (ev.deltaMode === WheelEvent.DOM_DELTA_PAGE) {\n amount *= this._bufferService.rows;\n }\n return amount;\n }\n\n private _applyScrollModifier(amount: number, ev: WheelEvent): number {\n const modifier = this._optionsService.options.fastScrollModifier;\n // Multiply the scroll speed when the modifier is down\n if ((modifier === 'alt' && ev.altKey) ||\n (modifier === 'ctrl' && ev.ctrlKey) ||\n (modifier === 'shift' && ev.shiftKey)) {\n return amount * this._optionsService.options.fastScrollSensitivity * this._optionsService.options.scrollSensitivity;\n }\n\n return amount * this._optionsService.options.scrollSensitivity;\n }\n\n /**\n * Handles the touchstart event, recording the touch occurred.\n * @param ev The touch event.\n */\n public onTouchStart(ev: TouchEvent): void {\n this._lastTouchY = ev.touches[0].pageY;\n }\n\n /**\n * Handles the touchmove event, scrolling the viewport if the position shifted.\n * @param ev The touch event.\n */\n public onTouchMove(ev: TouchEvent): boolean {\n const deltaY = this._lastTouchY - ev.touches[0].pageY;\n this._lastTouchY = ev.touches[0].pageY;\n if (deltaY === 0) {\n return false;\n }\n this._viewportElement.scrollTop += deltaY;\n return this._bubbleScroll(ev, deltaY);\n }\n}\n","/**\n * Copyright (c) 2016 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { ISelectionService } from 'browser/services/Services';\nimport { ICoreService } from 'common/services/Services';\n\n/**\n * Prepares text to be pasted into the terminal by normalizing the line endings\n * @param text The pasted text that needs processing before inserting into the terminal\n */\nexport function prepareTextForTerminal(text: string): string {\n return text.replace(/\\r?\\n/g, '\\r');\n}\n\n/**\n * Bracket text for paste, if necessary, as per https://cirw.in/blog/bracketed-paste\n * @param text The pasted text to bracket\n */\nexport function bracketTextForPaste(text: string, bracketedPasteMode: boolean): string {\n if (bracketedPasteMode) {\n return '\\x1b[200~' + text + '\\x1b[201~';\n }\n return text;\n}\n\n/**\n * Binds copy functionality to the given terminal.\n * @param ev The original copy event to be handled\n */\nexport function copyHandler(ev: ClipboardEvent, selectionService: ISelectionService): void {\n if (ev.clipboardData) {\n ev.clipboardData.setData('text/plain', selectionService.selectionText);\n }\n // Prevent or the original text will be copied.\n ev.preventDefault();\n}\n\n/**\n * Redirect the clipboard's data to the terminal's input handler.\n * @param ev The original paste event to be handled\n * @param term The terminal on which to apply the handled paste event\n */\nexport function handlePasteEvent(ev: ClipboardEvent, textarea: HTMLTextAreaElement, coreService: ICoreService): void {\n ev.stopPropagation();\n if (ev.clipboardData) {\n const text = ev.clipboardData.getData('text/plain');\n paste(text, textarea, coreService);\n }\n}\n\nexport function paste(text: string, textarea: HTMLTextAreaElement, coreService: ICoreService): void {\n text = prepareTextForTerminal(text);\n text = bracketTextForPaste(text, coreService.decPrivateModes.bracketedPasteMode);\n coreService.triggerDataEvent(text, true);\n textarea.value = '';\n}\n\n/**\n * Moves the textarea under the mouse cursor and focuses it.\n * @param ev The original right click event to be handled.\n * @param textarea The terminal's textarea.\n */\nexport function moveTextAreaUnderMouseCursor(ev: MouseEvent, textarea: HTMLTextAreaElement, screenElement: HTMLElement): void {\n\n // Calculate textarea position relative to the screen element\n const pos = screenElement.getBoundingClientRect();\n const left = ev.clientX - pos.left - 10;\n const top = ev.clientY - pos.top - 10;\n\n // Bring textarea at the cursor position\n textarea.style.position = 'absolute';\n textarea.style.width = '20px';\n textarea.style.height = '20px';\n textarea.style.left = `${left}px`;\n textarea.style.top = `${top}px`;\n textarea.style.zIndex = '1000';\n\n textarea.focus();\n\n // Reset the terminal textarea's styling\n // Timeout needs to be long enough for click event to be handled.\n setTimeout(() => {\n textarea.style.position = '';\n textarea.style.width = '';\n textarea.style.height = '';\n textarea.style.left = '';\n textarea.style.top = '';\n textarea.style.zIndex = '';\n }, 200);\n}\n\n/**\n * Bind to right-click event and allow right-click copy and paste.\n * @param ev The original right click event to be handled.\n * @param textarea The terminal's textarea.\n * @param selectionService The terminal's selection manager.\n * @param shouldSelectWord If true and there is no selection the current word will be selected\n */\nexport function rightClickHandler(ev: MouseEvent, textarea: HTMLTextAreaElement, screenElement: HTMLElement, selectionService: ISelectionService, shouldSelectWord: boolean): void {\n moveTextAreaUnderMouseCursor(ev, textarea, screenElement);\n\n if (shouldSelectWord && !selectionService.isClickInSelection(ev)) {\n selectionService.selectWordAtCursor(ev);\n }\n\n // Get textarea ready to copy from the context menu\n textarea.value = selectionService.selectionText;\n textarea.select();\n}\n","/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IParsingState, IDcsHandler, IEscapeSequenceParser, IParams, IOscHandler, IHandlerCollection, CsiHandlerType, OscFallbackHandlerType, IOscParser, EscHandlerType, IDcsParser, DcsFallbackHandlerType, IFunctionIdentifier, ExecuteFallbackHandlerType, CsiFallbackHandlerType, EscFallbackHandlerType, PrintHandlerType, PrintFallbackHandlerType, ExecuteHandlerType } from 'common/parser/Types';\nimport { ParserState, ParserAction } from 'common/parser/Constants';\nimport { Disposable } from 'common/Lifecycle';\nimport { IDisposable } from 'common/Types';\nimport { fill } from 'common/TypedArrayUtils';\nimport { Params } from 'common/parser/Params';\nimport { OscParser } from 'common/parser/OscParser';\nimport { DcsParser } from 'common/parser/DcsParser';\n\n/**\n * Table values are generated like this:\n * index: currentState << TableValue.INDEX_STATE_SHIFT | charCode\n * value: action << TableValue.TRANSITION_ACTION_SHIFT | nextState\n */\nconst enum TableAccess {\n TRANSITION_ACTION_SHIFT = 4,\n TRANSITION_STATE_MASK = 15,\n INDEX_STATE_SHIFT = 8\n}\n\n/**\n * Transition table for EscapeSequenceParser.\n */\nexport class TransitionTable {\n public table: Uint8Array;\n\n constructor(length: number) {\n this.table = new Uint8Array(length);\n }\n\n /**\n * Set default transition.\n * @param action default action\n * @param next default next state\n */\n public setDefault(action: ParserAction, next: ParserState): void {\n fill(this.table, action << TableAccess.TRANSITION_ACTION_SHIFT | next);\n }\n\n /**\n * Add a transition to the transition table.\n * @param code input character code\n * @param state current parser state\n * @param action parser action to be done\n * @param next next parser state\n */\n public add(code: number, state: ParserState, action: ParserAction, next: ParserState): void {\n this.table[state << TableAccess.INDEX_STATE_SHIFT | code] = action << TableAccess.TRANSITION_ACTION_SHIFT | next;\n }\n\n /**\n * Add transitions for multiple input character codes.\n * @param codes input character code array\n * @param state current parser state\n * @param action parser action to be done\n * @param next next parser state\n */\n public addMany(codes: number[], state: ParserState, action: ParserAction, next: ParserState): void {\n for (let i = 0; i < codes.length; i++) {\n this.table[state << TableAccess.INDEX_STATE_SHIFT | codes[i]] = action << TableAccess.TRANSITION_ACTION_SHIFT | next;\n }\n }\n}\n\n\n// Pseudo-character placeholder for printable non-ascii characters (unicode).\nconst NON_ASCII_PRINTABLE = 0xA0;\n\n\n/**\n * VT500 compatible transition table.\n * Taken from https://vt100.net/emu/dec_ansi_parser.\n */\nexport const VT500_TRANSITION_TABLE = (function (): TransitionTable {\n const table: TransitionTable = new TransitionTable(4095);\n\n // range macro for byte\n const BYTE_VALUES = 256;\n const blueprint = Array.apply(null, Array(BYTE_VALUES)).map((unused: any, i: number) => i);\n const r = (start: number, end: number): number[] => blueprint.slice(start, end);\n\n // Default definitions.\n const PRINTABLES = r(0x20, 0x7f); // 0x20 (SP) included, 0x7F (DEL) excluded\n const EXECUTABLES = r(0x00, 0x18);\n EXECUTABLES.push(0x19);\n EXECUTABLES.push.apply(EXECUTABLES, r(0x1c, 0x20));\n\n const states: number[] = r(ParserState.GROUND, ParserState.DCS_PASSTHROUGH + 1);\n let state: any;\n\n // set default transition\n table.setDefault(ParserAction.ERROR, ParserState.GROUND);\n // printables\n table.addMany(PRINTABLES, ParserState.GROUND, ParserAction.PRINT, ParserState.GROUND);\n // global anywhere rules\n for (state in states) {\n table.addMany([0x18, 0x1a, 0x99, 0x9a], state, ParserAction.EXECUTE, ParserState.GROUND);\n table.addMany(r(0x80, 0x90), state, ParserAction.EXECUTE, ParserState.GROUND);\n table.addMany(r(0x90, 0x98), state, ParserAction.EXECUTE, ParserState.GROUND);\n table.add(0x9c, state, ParserAction.IGNORE, ParserState.GROUND); // ST as terminator\n table.add(0x1b, state, ParserAction.CLEAR, ParserState.ESCAPE); // ESC\n table.add(0x9d, state, ParserAction.OSC_START, ParserState.OSC_STRING); // OSC\n table.addMany([0x98, 0x9e, 0x9f], state, ParserAction.IGNORE, ParserState.SOS_PM_APC_STRING);\n table.add(0x9b, state, ParserAction.CLEAR, ParserState.CSI_ENTRY); // CSI\n table.add(0x90, state, ParserAction.CLEAR, ParserState.DCS_ENTRY); // DCS\n }\n // rules for executables and 7f\n table.addMany(EXECUTABLES, ParserState.GROUND, ParserAction.EXECUTE, ParserState.GROUND);\n table.addMany(EXECUTABLES, ParserState.ESCAPE, ParserAction.EXECUTE, ParserState.ESCAPE);\n table.add(0x7f, ParserState.ESCAPE, ParserAction.IGNORE, ParserState.ESCAPE);\n table.addMany(EXECUTABLES, ParserState.OSC_STRING, ParserAction.IGNORE, ParserState.OSC_STRING);\n table.addMany(EXECUTABLES, ParserState.CSI_ENTRY, ParserAction.EXECUTE, ParserState.CSI_ENTRY);\n table.add(0x7f, ParserState.CSI_ENTRY, ParserAction.IGNORE, ParserState.CSI_ENTRY);\n table.addMany(EXECUTABLES, ParserState.CSI_PARAM, ParserAction.EXECUTE, ParserState.CSI_PARAM);\n table.add(0x7f, ParserState.CSI_PARAM, ParserAction.IGNORE, ParserState.CSI_PARAM);\n table.addMany(EXECUTABLES, ParserState.CSI_IGNORE, ParserAction.EXECUTE, ParserState.CSI_IGNORE);\n table.addMany(EXECUTABLES, ParserState.CSI_INTERMEDIATE, ParserAction.EXECUTE, ParserState.CSI_INTERMEDIATE);\n table.add(0x7f, ParserState.CSI_INTERMEDIATE, ParserAction.IGNORE, ParserState.CSI_INTERMEDIATE);\n table.addMany(EXECUTABLES, ParserState.ESCAPE_INTERMEDIATE, ParserAction.EXECUTE, ParserState.ESCAPE_INTERMEDIATE);\n table.add(0x7f, ParserState.ESCAPE_INTERMEDIATE, ParserAction.IGNORE, ParserState.ESCAPE_INTERMEDIATE);\n // osc\n table.add(0x5d, ParserState.ESCAPE, ParserAction.OSC_START, ParserState.OSC_STRING);\n table.addMany(PRINTABLES, ParserState.OSC_STRING, ParserAction.OSC_PUT, ParserState.OSC_STRING);\n table.add(0x7f, ParserState.OSC_STRING, ParserAction.OSC_PUT, ParserState.OSC_STRING);\n table.addMany([0x9c, 0x1b, 0x18, 0x1a, 0x07], ParserState.OSC_STRING, ParserAction.OSC_END, ParserState.GROUND);\n table.addMany(r(0x1c, 0x20), ParserState.OSC_STRING, ParserAction.IGNORE, ParserState.OSC_STRING);\n // sos/pm/apc does nothing\n table.addMany([0x58, 0x5e, 0x5f], ParserState.ESCAPE, ParserAction.IGNORE, ParserState.SOS_PM_APC_STRING);\n table.addMany(PRINTABLES, ParserState.SOS_PM_APC_STRING, ParserAction.IGNORE, ParserState.SOS_PM_APC_STRING);\n table.addMany(EXECUTABLES, ParserState.SOS_PM_APC_STRING, ParserAction.IGNORE, ParserState.SOS_PM_APC_STRING);\n table.add(0x9c, ParserState.SOS_PM_APC_STRING, ParserAction.IGNORE, ParserState.GROUND);\n table.add(0x7f, ParserState.SOS_PM_APC_STRING, ParserAction.IGNORE, ParserState.SOS_PM_APC_STRING);\n // csi entries\n table.add(0x5b, ParserState.ESCAPE, ParserAction.CLEAR, ParserState.CSI_ENTRY);\n table.addMany(r(0x40, 0x7f), ParserState.CSI_ENTRY, ParserAction.CSI_DISPATCH, ParserState.GROUND);\n table.addMany(r(0x30, 0x3c), ParserState.CSI_ENTRY, ParserAction.PARAM, ParserState.CSI_PARAM);\n table.addMany([0x3c, 0x3d, 0x3e, 0x3f], ParserState.CSI_ENTRY, ParserAction.COLLECT, ParserState.CSI_PARAM);\n table.addMany(r(0x30, 0x3c), ParserState.CSI_PARAM, ParserAction.PARAM, ParserState.CSI_PARAM);\n table.addMany(r(0x40, 0x7f), ParserState.CSI_PARAM, ParserAction.CSI_DISPATCH, ParserState.GROUND);\n table.addMany([0x3c, 0x3d, 0x3e, 0x3f], ParserState.CSI_PARAM, ParserAction.IGNORE, ParserState.CSI_IGNORE);\n table.addMany(r(0x20, 0x40), ParserState.CSI_IGNORE, ParserAction.IGNORE, ParserState.CSI_IGNORE);\n table.add(0x7f, ParserState.CSI_IGNORE, ParserAction.IGNORE, ParserState.CSI_IGNORE);\n table.addMany(r(0x40, 0x7f), ParserState.CSI_IGNORE, ParserAction.IGNORE, ParserState.GROUND);\n table.addMany(r(0x20, 0x30), ParserState.CSI_ENTRY, ParserAction.COLLECT, ParserState.CSI_INTERMEDIATE);\n table.addMany(r(0x20, 0x30), ParserState.CSI_INTERMEDIATE, ParserAction.COLLECT, ParserState.CSI_INTERMEDIATE);\n table.addMany(r(0x30, 0x40), ParserState.CSI_INTERMEDIATE, ParserAction.IGNORE, ParserState.CSI_IGNORE);\n table.addMany(r(0x40, 0x7f), ParserState.CSI_INTERMEDIATE, ParserAction.CSI_DISPATCH, ParserState.GROUND);\n table.addMany(r(0x20, 0x30), ParserState.CSI_PARAM, ParserAction.COLLECT, ParserState.CSI_INTERMEDIATE);\n // esc_intermediate\n table.addMany(r(0x20, 0x30), ParserState.ESCAPE, ParserAction.COLLECT, ParserState.ESCAPE_INTERMEDIATE);\n table.addMany(r(0x20, 0x30), ParserState.ESCAPE_INTERMEDIATE, ParserAction.COLLECT, ParserState.ESCAPE_INTERMEDIATE);\n table.addMany(r(0x30, 0x7f), ParserState.ESCAPE_INTERMEDIATE, ParserAction.ESC_DISPATCH, ParserState.GROUND);\n table.addMany(r(0x30, 0x50), ParserState.ESCAPE, ParserAction.ESC_DISPATCH, ParserState.GROUND);\n table.addMany(r(0x51, 0x58), ParserState.ESCAPE, ParserAction.ESC_DISPATCH, ParserState.GROUND);\n table.addMany([0x59, 0x5a, 0x5c], ParserState.ESCAPE, ParserAction.ESC_DISPATCH, ParserState.GROUND);\n table.addMany(r(0x60, 0x7f), ParserState.ESCAPE, ParserAction.ESC_DISPATCH, ParserState.GROUND);\n // dcs entry\n table.add(0x50, ParserState.ESCAPE, ParserAction.CLEAR, ParserState.DCS_ENTRY);\n table.addMany(EXECUTABLES, ParserState.DCS_ENTRY, ParserAction.IGNORE, ParserState.DCS_ENTRY);\n table.add(0x7f, ParserState.DCS_ENTRY, ParserAction.IGNORE, ParserState.DCS_ENTRY);\n table.addMany(r(0x1c, 0x20), ParserState.DCS_ENTRY, ParserAction.IGNORE, ParserState.DCS_ENTRY);\n table.addMany(r(0x20, 0x30), ParserState.DCS_ENTRY, ParserAction.COLLECT, ParserState.DCS_INTERMEDIATE);\n table.addMany(r(0x30, 0x3c), ParserState.DCS_ENTRY, ParserAction.PARAM, ParserState.DCS_PARAM);\n table.addMany([0x3c, 0x3d, 0x3e, 0x3f], ParserState.DCS_ENTRY, ParserAction.COLLECT, ParserState.DCS_PARAM);\n table.addMany(EXECUTABLES, ParserState.DCS_IGNORE, ParserAction.IGNORE, ParserState.DCS_IGNORE);\n table.addMany(r(0x20, 0x80), ParserState.DCS_IGNORE, ParserAction.IGNORE, ParserState.DCS_IGNORE);\n table.addMany(r(0x1c, 0x20), ParserState.DCS_IGNORE, ParserAction.IGNORE, ParserState.DCS_IGNORE);\n table.addMany(EXECUTABLES, ParserState.DCS_PARAM, ParserAction.IGNORE, ParserState.DCS_PARAM);\n table.add(0x7f, ParserState.DCS_PARAM, ParserAction.IGNORE, ParserState.DCS_PARAM);\n table.addMany(r(0x1c, 0x20), ParserState.DCS_PARAM, ParserAction.IGNORE, ParserState.DCS_PARAM);\n table.addMany(r(0x30, 0x3c), ParserState.DCS_PARAM, ParserAction.PARAM, ParserState.DCS_PARAM);\n table.addMany([0x3c, 0x3d, 0x3e, 0x3f], ParserState.DCS_PARAM, ParserAction.IGNORE, ParserState.DCS_IGNORE);\n table.addMany(r(0x20, 0x30), ParserState.DCS_PARAM, ParserAction.COLLECT, ParserState.DCS_INTERMEDIATE);\n table.addMany(EXECUTABLES, ParserState.DCS_INTERMEDIATE, ParserAction.IGNORE, ParserState.DCS_INTERMEDIATE);\n table.add(0x7f, ParserState.DCS_INTERMEDIATE, ParserAction.IGNORE, ParserState.DCS_INTERMEDIATE);\n table.addMany(r(0x1c, 0x20), ParserState.DCS_INTERMEDIATE, ParserAction.IGNORE, ParserState.DCS_INTERMEDIATE);\n table.addMany(r(0x20, 0x30), ParserState.DCS_INTERMEDIATE, ParserAction.COLLECT, ParserState.DCS_INTERMEDIATE);\n table.addMany(r(0x30, 0x40), ParserState.DCS_INTERMEDIATE, ParserAction.IGNORE, ParserState.DCS_IGNORE);\n table.addMany(r(0x40, 0x7f), ParserState.DCS_INTERMEDIATE, ParserAction.DCS_HOOK, ParserState.DCS_PASSTHROUGH);\n table.addMany(r(0x40, 0x7f), ParserState.DCS_PARAM, ParserAction.DCS_HOOK, ParserState.DCS_PASSTHROUGH);\n table.addMany(r(0x40, 0x7f), ParserState.DCS_ENTRY, ParserAction.DCS_HOOK, ParserState.DCS_PASSTHROUGH);\n table.addMany(EXECUTABLES, ParserState.DCS_PASSTHROUGH, ParserAction.DCS_PUT, ParserState.DCS_PASSTHROUGH);\n table.addMany(PRINTABLES, ParserState.DCS_PASSTHROUGH, ParserAction.DCS_PUT, ParserState.DCS_PASSTHROUGH);\n table.add(0x7f, ParserState.DCS_PASSTHROUGH, ParserAction.IGNORE, ParserState.DCS_PASSTHROUGH);\n table.addMany([0x1b, 0x9c, 0x18, 0x1a], ParserState.DCS_PASSTHROUGH, ParserAction.DCS_UNHOOK, ParserState.GROUND);\n // special handling of unicode chars\n table.add(NON_ASCII_PRINTABLE, ParserState.GROUND, ParserAction.PRINT, ParserState.GROUND);\n table.add(NON_ASCII_PRINTABLE, ParserState.OSC_STRING, ParserAction.OSC_PUT, ParserState.OSC_STRING);\n table.add(NON_ASCII_PRINTABLE, ParserState.CSI_IGNORE, ParserAction.IGNORE, ParserState.CSI_IGNORE);\n table.add(NON_ASCII_PRINTABLE, ParserState.DCS_IGNORE, ParserAction.IGNORE, ParserState.DCS_IGNORE);\n table.add(NON_ASCII_PRINTABLE, ParserState.DCS_PASSTHROUGH, ParserAction.DCS_PUT, ParserState.DCS_PASSTHROUGH);\n return table;\n})();\n\n\n/**\n * EscapeSequenceParser.\n * This class implements the ANSI/DEC compatible parser described by\n * Paul Williams (https://vt100.net/emu/dec_ansi_parser).\n *\n * To implement custom ANSI compliant escape sequences it is not needed to\n * alter this parser, instead consider registering a custom handler.\n * For non ANSI compliant sequences change the transition table with\n * the optional `transitions` constructor argument and\n * reimplement the `parse` method.\n *\n * This parser is currently hardcoded to operate in ZDM (Zero Default Mode)\n * as suggested by the original parser, thus empty parameters are set to 0.\n * This this is not in line with the latest ECMA-48 specification\n * (ZDM was part of the early specs and got completely removed later on).\n *\n * Other than the original parser from vt100.net this parser supports\n * sub parameters in digital parameters separated by colons. Empty sub parameters\n * are set to -1 (no ZDM for sub parameters).\n *\n * About prefix and intermediate bytes:\n * This parser follows the assumptions of the vt100.net parser with these restrictions:\n * - only one prefix byte is allowed as first parameter byte, byte range 0x3c .. 0x3f\n * - max. two intermediates are respected, byte range 0x20 .. 0x2f\n * Note that this is not in line with ECMA-48 which does not limit either of those.\n * Furthermore ECMA-48 allows the prefix byte range at any param byte position. Currently\n * there are no known sequences that follow the broader definition of the specification.\n *\n * TODO: implement error recovery hook via error handler return values\n */\nexport class EscapeSequenceParser extends Disposable implements IEscapeSequenceParser {\n public initialState: number;\n public currentState: number;\n public precedingCodepoint: number;\n\n // buffers over several parse calls\n protected _params: Params;\n protected _collect: number;\n\n // handler lookup containers\n protected _printHandler: PrintHandlerType;\n protected _executeHandlers: {[flag: number]: ExecuteHandlerType};\n protected _csiHandlers: IHandlerCollection<CsiHandlerType>;\n protected _escHandlers: IHandlerCollection<EscHandlerType>;\n protected _oscParser: IOscParser;\n protected _dcsParser: IDcsParser;\n protected _errorHandler: (state: IParsingState) => IParsingState;\n\n // fallback handlers\n protected _printHandlerFb: PrintFallbackHandlerType;\n protected _executeHandlerFb: ExecuteFallbackHandlerType;\n protected _csiHandlerFb: CsiFallbackHandlerType;\n protected _escHandlerFb: EscFallbackHandlerType;\n protected _errorHandlerFb: (state: IParsingState) => IParsingState;\n\n constructor(\n protected readonly _transitions: TransitionTable = VT500_TRANSITION_TABLE\n ) {\n super();\n\n this.initialState = ParserState.GROUND;\n this.currentState = this.initialState;\n this._params = new Params(); // defaults to 32 storable params/subparams\n this._params.addParam(0); // ZDM\n this._collect = 0;\n this.precedingCodepoint = 0;\n\n // set default fallback handlers and handler lookup containers\n this._printHandlerFb = (data, start, end): void => { };\n this._executeHandlerFb = (code: number): void => { };\n this._csiHandlerFb = (ident: number, params: IParams): void => { };\n this._escHandlerFb = (ident: number): void => { };\n this._errorHandlerFb = (state: IParsingState): IParsingState => state;\n this._printHandler = this._printHandlerFb;\n this._executeHandlers = Object.create(null);\n this._csiHandlers = Object.create(null);\n this._escHandlers = Object.create(null);\n this._oscParser = new OscParser();\n this._dcsParser = new DcsParser();\n this._errorHandler = this._errorHandlerFb;\n\n // swallow 7bit ST (ESC+\\)\n this.setEscHandler({final: '\\\\'}, () => {});\n }\n\n protected _identifier(id: IFunctionIdentifier, finalRange: number[] = [0x40, 0x7e]): number {\n let res = 0;\n if (id.prefix) {\n if (id.prefix.length > 1) {\n throw new Error('only one byte as prefix supported');\n }\n res = id.prefix.charCodeAt(0);\n if (res && 0x3c > res || res > 0x3f) {\n throw new Error('prefix must be in range 0x3c .. 0x3f');\n }\n }\n if (id.intermediates) {\n if (id.intermediates.length > 2) {\n throw new Error('only two bytes as intermediates are supported');\n }\n for (let i = 0; i < id.intermediates.length; ++i) {\n const intermediate = id.intermediates.charCodeAt(i);\n if (0x20 > intermediate || intermediate > 0x2f) {\n throw new Error('intermediate must be in range 0x20 .. 0x2f');\n }\n res <<= 8;\n res |= intermediate;\n }\n }\n if (id.final.length !== 1) {\n throw new Error('final must be a single byte');\n }\n const finalCode = id.final.charCodeAt(0);\n if (finalRange[0] > finalCode || finalCode > finalRange[1]) {\n throw new Error(`final must be in range ${finalRange[0]} .. ${finalRange[1]}`);\n }\n res <<= 8;\n res |= finalCode;\n\n return res;\n }\n\n public identToString(ident: number): string {\n const res: string[] = [];\n while (ident) {\n res.push(String.fromCharCode(ident & 0xFF));\n ident >>= 8;\n }\n return res.reverse().join('');\n }\n\n public dispose(): void {\n this._csiHandlers = Object.create(null);\n this._executeHandlers = Object.create(null);\n this._escHandlers = Object.create(null);\n this._oscParser.dispose();\n this._dcsParser.dispose();\n }\n\n public setPrintHandler(handler: PrintHandlerType): void {\n this._printHandler = handler;\n }\n public clearPrintHandler(): void {\n this._printHandler = this._printHandlerFb;\n }\n\n public addEscHandler(id: IFunctionIdentifier, handler: EscHandlerType): IDisposable {\n const ident = this._identifier(id, [0x30, 0x7e]);\n if (this._escHandlers[ident] === undefined) {\n this._escHandlers[ident] = [];\n }\n const handlerList = this._escHandlers[ident];\n handlerList.push(handler);\n return {\n dispose: () => {\n const handlerIndex = handlerList.indexOf(handler);\n if (handlerIndex !== -1) {\n handlerList.splice(handlerIndex, 1);\n }\n }\n };\n }\n public setEscHandler(id: IFunctionIdentifier, handler: EscHandlerType): void {\n this._escHandlers[this._identifier(id, [0x30, 0x7e])] = [handler];\n }\n public clearEscHandler(id: IFunctionIdentifier): void {\n if (this._escHandlers[this._identifier(id, [0x30, 0x7e])]) delete this._escHandlers[this._identifier(id, [0x30, 0x7e])];\n }\n public setEscHandlerFallback(handler: EscFallbackHandlerType): void {\n this._escHandlerFb = handler;\n }\n\n public setExecuteHandler(flag: string, handler: ExecuteHandlerType): void {\n this._executeHandlers[flag.charCodeAt(0)] = handler;\n }\n public clearExecuteHandler(flag: string): void {\n if (this._executeHandlers[flag.charCodeAt(0)]) delete this._executeHandlers[flag.charCodeAt(0)];\n }\n public setExecuteHandlerFallback(handler: ExecuteFallbackHandlerType): void {\n this._executeHandlerFb = handler;\n }\n\n public addCsiHandler(id: IFunctionIdentifier, handler: CsiHandlerType): IDisposable {\n const ident = this._identifier(id);\n if (this._csiHandlers[ident] === undefined) {\n this._csiHandlers[ident] = [];\n }\n const handlerList = this._csiHandlers[ident];\n handlerList.push(handler);\n return {\n dispose: () => {\n const handlerIndex = handlerList.indexOf(handler);\n if (handlerIndex !== -1) {\n handlerList.splice(handlerIndex, 1);\n }\n }\n };\n }\n public setCsiHandler(id: IFunctionIdentifier, handler: CsiHandlerType): void {\n this._csiHandlers[this._identifier(id)] = [handler];\n }\n public clearCsiHandler(id: IFunctionIdentifier): void {\n if (this._csiHandlers[this._identifier(id)]) delete this._csiHandlers[this._identifier(id)];\n }\n public setCsiHandlerFallback(callback: (ident: number, params: IParams) => void): void {\n this._csiHandlerFb = callback;\n }\n\n public addDcsHandler(id: IFunctionIdentifier, handler: IDcsHandler): IDisposable {\n return this._dcsParser.addHandler(this._identifier(id), handler);\n }\n public setDcsHandler(id: IFunctionIdentifier, handler: IDcsHandler): void {\n this._dcsParser.setHandler(this._identifier(id), handler);\n }\n public clearDcsHandler(id: IFunctionIdentifier): void {\n this._dcsParser.clearHandler(this._identifier(id));\n }\n public setDcsHandlerFallback(handler: DcsFallbackHandlerType): void {\n this._dcsParser.setHandlerFallback(handler);\n }\n\n public addOscHandler(ident: number, handler: IOscHandler): IDisposable {\n return this._oscParser.addHandler(ident, handler);\n }\n public setOscHandler(ident: number, handler: IOscHandler): void {\n this._oscParser.setHandler(ident, handler);\n }\n public clearOscHandler(ident: number): void {\n this._oscParser.clearHandler(ident);\n }\n public setOscHandlerFallback(handler: OscFallbackHandlerType): void {\n this._oscParser.setHandlerFallback(handler);\n }\n\n public setErrorHandler(callback: (state: IParsingState) => IParsingState): void {\n this._errorHandler = callback;\n }\n public clearErrorHandler(): void {\n this._errorHandler = this._errorHandlerFb;\n }\n\n public reset(): void {\n this.currentState = this.initialState;\n this._oscParser.reset();\n this._dcsParser.reset();\n this._params.reset();\n this._params.addParam(0); // ZDM\n this._collect = 0;\n this.precedingCodepoint = 0;\n }\n\n\n\n /**\n * Parse UTF32 codepoints in `data` up to `length`.\n *\n * Note: For several actions with high data load the parsing is optimized\n * by using local read ahead loops with hardcoded conditions to\n * avoid costly table lookups. Make sure that any change of table values\n * will be reflected in the loop conditions as well and vice versa.\n * Affected states/actions:\n * - GROUND:PRINT\n * - CSI_PARAM:PARAM\n * - DCS_PARAM:PARAM\n * - OSC_STRING:OSC_PUT\n * - DCS_PASSTHROUGH:DCS_PUT\n */\n public parse(data: Uint32Array, length: number): void {\n let code = 0;\n let transition = 0;\n let currentState = this.currentState;\n const osc = this._oscParser;\n const dcs = this._dcsParser;\n let collect = this._collect;\n const params = this._params;\n const table: Uint8Array = this._transitions.table;\n\n // process input string\n for (let i = 0; i < length; ++i) {\n code = data[i];\n\n // normal transition & action lookup\n transition = table[currentState << TableAccess.INDEX_STATE_SHIFT | (code < 0xa0 ? code : NON_ASCII_PRINTABLE)];\n switch (transition >> TableAccess.TRANSITION_ACTION_SHIFT) {\n case ParserAction.PRINT:\n // read ahead with loop unrolling\n // Note: 0x20 (SP) is included, 0x7F (DEL) is excluded\n for (let j = i + 1; ; ++j) {\n if (j >= length || (code = data[j]) < 0x20 || (code > 0x7e && code < NON_ASCII_PRINTABLE)) {\n this._printHandler(data, i, j);\n i = j - 1;\n break;\n }\n if (++j >= length || (code = data[j]) < 0x20 || (code > 0x7e && code < NON_ASCII_PRINTABLE)) {\n this._printHandler(data, i, j);\n i = j - 1;\n break;\n }\n if (++j >= length || (code = data[j]) < 0x20 || (code > 0x7e && code < NON_ASCII_PRINTABLE)) {\n this._printHandler(data, i, j);\n i = j - 1;\n break;\n }\n if (++j >= length || (code = data[j]) < 0x20 || (code > 0x7e && code < NON_ASCII_PRINTABLE)) {\n this._printHandler(data, i, j);\n i = j - 1;\n break;\n }\n }\n break;\n case ParserAction.EXECUTE:\n if (this._executeHandlers[code]) this._executeHandlers[code]();\n else this._executeHandlerFb(code);\n this.precedingCodepoint = 0;\n break;\n case ParserAction.IGNORE:\n break;\n case ParserAction.ERROR:\n const inject: IParsingState = this._errorHandler(\n {\n position: i,\n code,\n currentState,\n collect,\n params,\n abort: false\n });\n if (inject.abort) return;\n // inject values: currently not implemented\n break;\n case ParserAction.CSI_DISPATCH:\n // Trigger CSI Handler\n const handlers = this._csiHandlers[collect << 8 | code];\n let j = handlers ? handlers.length - 1 : -1;\n for (; j >= 0; j--) {\n // undefined or true means success and to stop bubbling\n if (handlers[j](params) !== false) {\n break;\n }\n }\n if (j < 0) {\n this._csiHandlerFb(collect << 8 | code, params);\n }\n this.precedingCodepoint = 0;\n break;\n case ParserAction.PARAM:\n // inner loop: digits (0x30 - 0x39) and ; (0x3b) and : (0x3a)\n do {\n switch (code) {\n case 0x3b:\n params.addParam(0); // ZDM\n break;\n case 0x3a:\n params.addSubParam(-1);\n break;\n default: // 0x30 - 0x39\n params.addDigit(code - 48);\n }\n } while (++i < length && (code = data[i]) > 0x2f && code < 0x3c);\n i--;\n break;\n case ParserAction.COLLECT:\n collect <<= 8;\n collect |= code;\n break;\n case ParserAction.ESC_DISPATCH:\n const handlersEsc = this._escHandlers[collect << 8 | code];\n let jj = handlersEsc ? handlersEsc.length - 1 : -1;\n for (; jj >= 0; jj--) {\n // undefined or true means success and to stop bubbling\n if (handlersEsc[jj]() !== false) {\n break;\n }\n }\n if (jj < 0) {\n this._escHandlerFb(collect << 8 | code);\n }\n this.precedingCodepoint = 0;\n break;\n case ParserAction.CLEAR:\n params.reset();\n params.addParam(0); // ZDM\n collect = 0;\n break;\n case ParserAction.DCS_HOOK:\n dcs.hook(collect << 8 | code, params);\n break;\n case ParserAction.DCS_PUT:\n // inner loop - exit DCS_PUT: 0x18, 0x1a, 0x1b, 0x7f, 0x80 - 0x9f\n // unhook triggered by: 0x1b, 0x9c (success) and 0x18, 0x1a (abort)\n for (let j = i + 1; ; ++j) {\n if (j >= length || (code = data[j]) === 0x18 || code === 0x1a || code === 0x1b || (code > 0x7f && code < NON_ASCII_PRINTABLE)) {\n dcs.put(data, i, j);\n i = j - 1;\n break;\n }\n }\n break;\n case ParserAction.DCS_UNHOOK:\n dcs.unhook(code !== 0x18 && code !== 0x1a);\n if (code === 0x1b) transition |= ParserState.ESCAPE;\n params.reset();\n params.addParam(0); // ZDM\n collect = 0;\n this.precedingCodepoint = 0;\n break;\n case ParserAction.OSC_START:\n osc.start();\n break;\n case ParserAction.OSC_PUT:\n // inner loop: 0x20 (SP) included, 0x7F (DEL) included\n for (let j = i + 1; ; j++) {\n if (j >= length || (code = data[j]) < 0x20 || (code > 0x7f && code <= 0x9f)) {\n osc.put(data, i, j);\n i = j - 1;\n break;\n }\n }\n break;\n case ParserAction.OSC_END:\n osc.end(code !== 0x18 && code !== 0x1a);\n if (code === 0x1b) transition |= ParserState.ESCAPE;\n params.reset();\n params.addParam(0); // ZDM\n collect = 0;\n this.precedingCodepoint = 0;\n break;\n }\n currentState = transition & TableAccess.TRANSITION_STATE_MASK;\n }\n\n // save collected intermediates\n this._collect = collect;\n\n // save state\n this.currentState = currentState;\n }\n}\n","/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { TextRenderLayer } from 'browser/renderer/TextRenderLayer';\nimport { SelectionRenderLayer } from 'browser/renderer/SelectionRenderLayer';\nimport { CursorRenderLayer } from 'browser/renderer/CursorRenderLayer';\nimport { IRenderLayer, IRenderer, IRenderDimensions, CharacterJoinerHandler, ICharacterJoinerRegistry, IRequestRedrawEvent } from 'browser/renderer/Types';\nimport { LinkRenderLayer } from 'browser/renderer/LinkRenderLayer';\nimport { CharacterJoinerRegistry } from 'browser/renderer/CharacterJoinerRegistry';\nimport { Disposable } from 'common/Lifecycle';\nimport { IColorSet, ILinkifier, ILinkifier2 } from 'browser/Types';\nimport { ICharSizeService, ICoreBrowserService } from 'browser/services/Services';\nimport { IBufferService, IOptionsService, ICoreService } from 'common/services/Services';\nimport { removeTerminalFromCache } from 'browser/renderer/atlas/CharAtlasCache';\nimport { EventEmitter, IEvent } from 'common/EventEmitter';\n\nlet nextRendererId = 1;\n\nexport class Renderer extends Disposable implements IRenderer {\n private _id = nextRendererId++;\n\n private _renderLayers: IRenderLayer[];\n private _devicePixelRatio: number;\n private _characterJoinerRegistry: ICharacterJoinerRegistry;\n\n public dimensions: IRenderDimensions;\n\n private _onRequestRedraw = new EventEmitter<IRequestRedrawEvent>();\n public get onRequestRedraw(): IEvent<IRequestRedrawEvent> { return this._onRequestRedraw.event; }\n\n constructor(\n private _colors: IColorSet,\n private readonly _screenElement: HTMLElement,\n linkifier: ILinkifier,\n linkifier2: ILinkifier2,\n @IBufferService private readonly _bufferService: IBufferService,\n @ICharSizeService private readonly _charSizeService: ICharSizeService,\n @IOptionsService private readonly _optionsService: IOptionsService,\n @ICoreService coreService: ICoreService,\n @ICoreBrowserService coreBrowserService: ICoreBrowserService\n ) {\n super();\n const allowTransparency = this._optionsService.options.allowTransparency;\n this._characterJoinerRegistry = new CharacterJoinerRegistry(this._bufferService);\n this._renderLayers = [\n new TextRenderLayer(this._screenElement, 0, this._colors, this._characterJoinerRegistry, allowTransparency, this._id, this._bufferService, _optionsService),\n new SelectionRenderLayer(this._screenElement, 1, this._colors, this._id, this._bufferService, _optionsService),\n new LinkRenderLayer(this._screenElement, 2, this._colors, this._id, linkifier, linkifier2, this._bufferService, _optionsService),\n new CursorRenderLayer(this._screenElement, 3, this._colors, this._id, this._onRequestRedraw, this._bufferService, _optionsService, coreService, coreBrowserService)\n ];\n this.dimensions = {\n scaledCharWidth: 0,\n scaledCharHeight: 0,\n scaledCellWidth: 0,\n scaledCellHeight: 0,\n scaledCharLeft: 0,\n scaledCharTop: 0,\n scaledCanvasWidth: 0,\n scaledCanvasHeight: 0,\n canvasWidth: 0,\n canvasHeight: 0,\n actualCellWidth: 0,\n actualCellHeight: 0\n };\n this._devicePixelRatio = window.devicePixelRatio;\n this._updateDimensions();\n this.onOptionsChanged();\n }\n\n public dispose(): void {\n for (const l of this._renderLayers) {\n l.dispose();\n }\n super.dispose();\n removeTerminalFromCache(this._id);\n }\n\n public onDevicePixelRatioChange(): void {\n // If the device pixel ratio changed, the char atlas needs to be regenerated\n // and the terminal needs to refreshed\n if (this._devicePixelRatio !== window.devicePixelRatio) {\n this._devicePixelRatio = window.devicePixelRatio;\n this.onResize(this._bufferService.cols, this._bufferService.rows);\n }\n }\n\n public setColors(colors: IColorSet): void {\n this._colors = colors;\n // Clear layers and force a full render\n for (const l of this._renderLayers) {\n l.setColors(this._colors);\n l.reset();\n }\n }\n\n public onResize(cols: number, rows: number): void {\n // Update character and canvas dimensions\n this._updateDimensions();\n\n // Resize all render layers\n for (const l of this._renderLayers) {\n l.resize(this.dimensions);\n }\n\n // Resize the screen\n this._screenElement.style.width = `${this.dimensions.canvasWidth}px`;\n this._screenElement.style.height = `${this.dimensions.canvasHeight}px`;\n }\n\n public onCharSizeChanged(): void {\n this.onResize(this._bufferService.cols, this._bufferService.rows);\n }\n\n public onBlur(): void {\n this._runOperation(l => l.onBlur());\n }\n\n public onFocus(): void {\n this._runOperation(l => l.onFocus());\n }\n\n public onSelectionChanged(start: [number, number] | undefined, end: [number, number] | undefined, columnSelectMode: boolean = false): void {\n this._runOperation(l => l.onSelectionChanged(start, end, columnSelectMode));\n }\n\n public onCursorMove(): void {\n this._runOperation(l => l.onCursorMove());\n }\n\n public onOptionsChanged(): void {\n this._runOperation(l => l.onOptionsChanged());\n }\n\n public clear(): void {\n this._runOperation(l => l.reset());\n }\n\n private _runOperation(operation: (layer: IRenderLayer) => void): void {\n for (const l of this._renderLayers) {\n operation(l);\n }\n }\n\n /**\n * Performs the refresh loop callback, calling refresh only if a refresh is\n * necessary before queueing up the next one.\n */\n public renderRows(start: number, end: number): void {\n for (const l of this._renderLayers) {\n l.onGridChanged(start, end);\n }\n }\n\n /**\n * Recalculates the character and canvas dimensions.\n */\n private _updateDimensions(): void {\n if (!this._charSizeService.hasValidSize) {\n return;\n }\n\n // Calculate the scaled character width. Width is floored as it must be\n // drawn to an integer grid in order for the CharAtlas \"stamps\" to not be\n // blurry. When text is drawn to the grid not using the CharAtlas, it is\n // clipped to ensure there is no overlap with the next cell.\n this.dimensions.scaledCharWidth = Math.floor(this._charSizeService.width * window.devicePixelRatio);\n\n // Calculate the scaled character height. Height is ceiled in case\n // devicePixelRatio is a floating point number in order to ensure there is\n // enough space to draw the character to the cell.\n this.dimensions.scaledCharHeight = Math.ceil(this._charSizeService.height * window.devicePixelRatio);\n\n // Calculate the scaled cell height, if lineHeight is not 1 then the value\n // will be floored because since lineHeight can never be lower then 1, there\n // is a guarentee that the scaled line height will always be larger than\n // scaled char height.\n this.dimensions.scaledCellHeight = Math.floor(this.dimensions.scaledCharHeight * this._optionsService.options.lineHeight);\n\n // Calculate the y coordinate within a cell that text should draw from in\n // order to draw in the center of a cell.\n this.dimensions.scaledCharTop = this._optionsService.options.lineHeight === 1 ? 0 : Math.round((this.dimensions.scaledCellHeight - this.dimensions.scaledCharHeight) / 2);\n\n // Calculate the scaled cell width, taking the letterSpacing into account.\n this.dimensions.scaledCellWidth = this.dimensions.scaledCharWidth + Math.round(this._optionsService.options.letterSpacing);\n\n // Calculate the x coordinate with a cell that text should draw from in\n // order to draw in the center of a cell.\n this.dimensions.scaledCharLeft = Math.floor(this._optionsService.options.letterSpacing / 2);\n\n // Recalculate the canvas dimensions; scaled* define the actual number of\n // pixel in the canvas\n this.dimensions.scaledCanvasHeight = this._bufferService.rows * this.dimensions.scaledCellHeight;\n this.dimensions.scaledCanvasWidth = this._bufferService.cols * this.dimensions.scaledCellWidth;\n\n // The the size of the canvas on the page. It's very important that this\n // rounds to nearest integer and not ceils as browsers often set\n // window.devicePixelRatio as something like 1.100000023841858, when it's\n // actually 1.1. Ceiling causes blurriness as the backing canvas image is 1\n // pixel too large for the canvas element size.\n this.dimensions.canvasHeight = Math.round(this.dimensions.scaledCanvasHeight / window.devicePixelRatio);\n this.dimensions.canvasWidth = Math.round(this.dimensions.scaledCanvasWidth / window.devicePixelRatio);\n\n // Get the _actual_ dimensions of an individual cell. This needs to be\n // derived from the canvasWidth/Height calculated above which takes into\n // account window.devicePixelRatio. ICharSizeService.width/height by itself\n // is insufficient when the page is not at 100% zoom level as it's measured\n // in CSS pixels, but the actual char size on the canvas can differ.\n this.dimensions.actualCellHeight = this.dimensions.canvasHeight / this._bufferService.rows;\n this.dimensions.actualCellWidth = this.dimensions.canvasWidth / this._bufferService.cols;\n }\n\n public registerCharacterJoiner(handler: CharacterJoinerHandler): number {\n return this._characterJoinerRegistry.registerCharacterJoiner(handler);\n }\n\n public deregisterCharacterJoiner(joinerId: number): boolean {\n return this._characterJoinerRegistry.deregisterCharacterJoiner(joinerId);\n }\n}\n","/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { ICharacterJoinerRegistry, IRenderDimensions } from 'browser/renderer/Types';\nimport { CharData, ICellData } from 'common/Types';\nimport { GridCache } from 'browser/renderer/GridCache';\nimport { BaseRenderLayer } from 'browser/renderer/BaseRenderLayer';\nimport { AttributeData } from 'common/buffer/AttributeData';\nimport { NULL_CELL_CODE, Content } from 'common/buffer/Constants';\nimport { JoinedCellData } from 'browser/renderer/CharacterJoinerRegistry';\nimport { IColorSet } from 'browser/Types';\nimport { CellData } from 'common/buffer/CellData';\nimport { IOptionsService, IBufferService } from 'common/services/Services';\n\n/**\n * This CharData looks like a null character, which will forc a clear and render\n * when the character changes (a regular space ' ' character may not as it's\n * drawn state is a cleared cell).\n */\n// const OVERLAP_OWNED_CHAR_DATA: CharData = [null, '', 0, -1];\n\nexport class TextRenderLayer extends BaseRenderLayer {\n private _state: GridCache<CharData>;\n private _characterWidth: number = 0;\n private _characterFont: string = '';\n private _characterOverlapCache: { [key: string]: boolean } = {};\n private _characterJoinerRegistry: ICharacterJoinerRegistry;\n private _workCell = new CellData();\n\n constructor(\n container: HTMLElement,\n zIndex: number,\n colors: IColorSet,\n characterJoinerRegistry: ICharacterJoinerRegistry,\n alpha: boolean,\n rendererId: number,\n bufferService: IBufferService,\n optionsService: IOptionsService\n ) {\n super(container, 'text', zIndex, alpha, colors, rendererId, bufferService, optionsService);\n this._state = new GridCache<CharData>();\n this._characterJoinerRegistry = characterJoinerRegistry;\n }\n\n public resize(dim: IRenderDimensions): void {\n super.resize(dim);\n\n // Clear the character width cache if the font or width has changed\n const terminalFont = this._getFont(false, false);\n if (this._characterWidth !== dim.scaledCharWidth || this._characterFont !== terminalFont) {\n this._characterWidth = dim.scaledCharWidth;\n this._characterFont = terminalFont;\n this._characterOverlapCache = {};\n }\n // Resizing the canvas discards the contents of the canvas so clear state\n this._state.clear();\n this._state.resize(this._bufferService.cols, this._bufferService.rows);\n }\n\n public reset(): void {\n this._state.clear();\n this._clearAll();\n }\n\n private _forEachCell(\n firstRow: number,\n lastRow: number,\n joinerRegistry: ICharacterJoinerRegistry | null,\n callback: (\n cell: ICellData,\n x: number,\n y: number\n ) => void\n ): void {\n for (let y = firstRow; y <= lastRow; y++) {\n const row = y + this._bufferService.buffer.ydisp;\n const line = this._bufferService.buffer.lines.get(row);\n const joinedRanges = joinerRegistry ? joinerRegistry.getJoinedCharacters(row) : [];\n for (let x = 0; x < this._bufferService.cols; x++) {\n line!.loadCell(x, this._workCell);\n let cell = this._workCell;\n\n // If true, indicates that the current character(s) to draw were joined.\n let isJoined = false;\n let lastCharX = x;\n\n // The character to the left is a wide character, drawing is owned by\n // the char at x-1\n if (cell.getWidth() === 0) {\n continue;\n }\n\n // Process any joined character ranges as needed. Because of how the\n // ranges are produced, we know that they are valid for the characters\n // and attributes of our input.\n if (joinedRanges.length > 0 && x === joinedRanges[0][0]) {\n isJoined = true;\n const range = joinedRanges.shift()!;\n\n // We already know the exact start and end column of the joined range,\n // so we get the string and width representing it directly\n\n cell = new JoinedCellData(\n this._workCell,\n line!.translateToString(true, range[0], range[1]),\n range[1] - range[0]\n );\n\n // Skip over the cells occupied by this range in the loop\n lastCharX = range[1] - 1;\n }\n\n // If the character is an overlapping char and the character to the\n // right is a space, take ownership of the cell to the right. We skip\n // this check for joined characters because their rendering likely won't\n // yield the same result as rendering the last character individually.\n if (!isJoined && this._isOverlapping(cell)) {\n // If the character is overlapping, we want to force a re-render on every\n // frame. This is specifically to work around the case where two\n // overlaping chars `a` and `b` are adjacent, the cursor is moved to b and a\n // space is added. Without this, the first half of `b` would never\n // get removed, and `a` would not re-render because it thinks it's\n // already in the correct state.\n // this._state.cache[x][y] = OVERLAP_OWNED_CHAR_DATA;\n if (lastCharX < line!.length - 1 && line!.getCodePoint(lastCharX + 1) === NULL_CELL_CODE) {\n // patch width to 2\n cell.content &= ~Content.WIDTH_MASK;\n cell.content |= 2 << Content.WIDTH_SHIFT;\n // this._clearChar(x + 1, y);\n // The overlapping char's char data will force a clear and render when the\n // overlapping char is no longer to the left of the character and also when\n // the space changes to another character.\n // this._state.cache[x + 1][y] = OVERLAP_OWNED_CHAR_DATA;\n }\n }\n\n callback(\n cell,\n x,\n y\n );\n\n x = lastCharX;\n }\n }\n }\n\n /**\n * Draws the background for a specified range of columns. Tries to batch adjacent cells of the\n * same color together to reduce draw calls.\n */\n private _drawBackground(firstRow: number, lastRow: number): void {\n const ctx = this._ctx;\n const cols = this._bufferService.cols;\n let startX: number = 0;\n let startY: number = 0;\n let prevFillStyle: string | null = null;\n\n ctx.save();\n\n this._forEachCell(firstRow, lastRow, null, (cell, x, y) => {\n // libvte and xterm both draw the background (but not foreground) of invisible characters,\n // so we should too.\n let nextFillStyle = null; // null represents default background color\n\n if (cell.isInverse()) {\n if (cell.isFgDefault()) {\n nextFillStyle = this._colors.foreground.css;\n } else if (cell.isFgRGB()) {\n nextFillStyle = `rgb(${AttributeData.toColorRGB(cell.getFgColor()).join(',')})`;\n } else {\n nextFillStyle = this._colors.ansi[cell.getFgColor()].css;\n }\n } else if (cell.isBgRGB()) {\n nextFillStyle = `rgb(${AttributeData.toColorRGB(cell.getBgColor()).join(',')})`;\n } else if (cell.isBgPalette()) {\n nextFillStyle = this._colors.ansi[cell.getBgColor()].css;\n }\n\n if (prevFillStyle === null) {\n // This is either the first iteration, or the default background was set. Either way, we\n // don't need to draw anything.\n startX = x;\n startY = y;\n }\n\n if (y !== startY) {\n // our row changed, draw the previous row\n ctx.fillStyle = prevFillStyle || '';\n this._fillCells(startX, startY, cols - startX, 1);\n startX = x;\n startY = y;\n } else if (prevFillStyle !== nextFillStyle) {\n // our color changed, draw the previous characters in this row\n ctx.fillStyle = prevFillStyle || '';\n this._fillCells(startX, startY, x - startX, 1);\n startX = x;\n startY = y;\n }\n\n prevFillStyle = nextFillStyle;\n });\n\n // flush the last color we encountered\n if (prevFillStyle !== null) {\n ctx.fillStyle = prevFillStyle;\n this._fillCells(startX, startY, cols - startX, 1);\n }\n\n ctx.restore();\n }\n\n private _drawForeground(firstRow: number, lastRow: number): void {\n this._forEachCell(firstRow, lastRow, this._characterJoinerRegistry, (cell, x, y) => {\n if (cell.isInvisible()) {\n return;\n }\n this._drawChars(cell, x, y);\n if (cell.isUnderline()) {\n this._ctx.save();\n\n if (cell.isInverse()) {\n if (cell.isBgDefault()) {\n this._ctx.fillStyle = this._colors.background.css;\n } else if (cell.isBgRGB()) {\n this._ctx.fillStyle = `rgb(${AttributeData.toColorRGB(cell.getBgColor()).join(',')})`;\n } else {\n let bg = cell.getBgColor();\n if (this._optionsService.options.drawBoldTextInBrightColors && cell.isBold() && bg < 8) {\n bg += 8;\n }\n this._ctx.fillStyle = this._colors.ansi[bg].css;\n }\n } else {\n if (cell.isFgDefault()) {\n this._ctx.fillStyle = this._colors.foreground.css;\n } else if (cell.isFgRGB()) {\n this._ctx.fillStyle = `rgb(${AttributeData.toColorRGB(cell.getFgColor()).join(',')})`;\n } else {\n let fg = cell.getFgColor();\n if (this._optionsService.options.drawBoldTextInBrightColors && cell.isBold() && fg < 8) {\n fg += 8;\n }\n this._ctx.fillStyle = this._colors.ansi[fg].css;\n }\n }\n\n this._fillBottomLineAtCells(x, y, cell.getWidth());\n this._ctx.restore();\n }\n });\n }\n\n public onGridChanged(firstRow: number, lastRow: number): void {\n // Resize has not been called yet\n if (this._state.cache.length === 0) {\n return;\n }\n\n if (this._charAtlas) {\n this._charAtlas.beginFrame();\n }\n\n this._clearCells(0, firstRow, this._bufferService.cols, lastRow - firstRow + 1);\n this._drawBackground(firstRow, lastRow);\n this._drawForeground(firstRow, lastRow);\n }\n\n public onOptionsChanged(): void {\n this._setTransparency(this._optionsService.options.allowTransparency);\n }\n\n /**\n * Whether a character is overlapping to the next cell.\n */\n private _isOverlapping(cell: ICellData): boolean {\n // Only single cell characters can be overlapping, rendering issues can\n // occur without this check\n if (cell.getWidth() !== 1) {\n return false;\n }\n\n // We assume that any ascii character will not overlap\n if (cell.getCode() < 256) {\n return false;\n }\n\n const chars = cell.getChars();\n\n // Deliver from cache if available\n if (this._characterOverlapCache.hasOwnProperty(chars)) {\n return this._characterOverlapCache[chars];\n }\n\n // Setup the font\n this._ctx.save();\n this._ctx.font = this._characterFont;\n\n // Measure the width of the character, but Math.floor it\n // because that is what the renderer does when it calculates\n // the character dimensions we are comparing against\n const overlaps = Math.floor(this._ctx.measureText(chars).width) > this._characterWidth;\n\n // Restore the original context\n this._ctx.restore();\n\n // Cache and return\n this._characterOverlapCache[chars] = overlaps;\n return overlaps;\n }\n\n /**\n * Clear the charcater at the cell specified.\n * @param x The column of the char.\n * @param y The row of the char.\n */\n // private _clearChar(x: number, y: number): void {\n // let colsToClear = 1;\n // // Clear the adjacent character if it was wide\n // const state = this._state.cache[x][y];\n // if (state && state[CHAR_DATA_WIDTH_INDEX] === 2) {\n // colsToClear = 2;\n // }\n // this.clearCells(x, y, colsToClear, 1);\n // }\n}\n","/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nexport class GridCache<T> {\n public cache: (T | undefined)[][];\n\n public constructor() {\n this.cache = [];\n }\n\n public resize(width: number, height: number): void {\n for (let x = 0; x < width; x++) {\n if (this.cache.length <= x) {\n this.cache.push([]);\n }\n for (let y = this.cache[x].length; y < height; y++) {\n this.cache[x].push(undefined);\n }\n this.cache[x].length = height;\n }\n this.cache.length = width;\n }\n\n public clear(): void {\n for (let x = 0; x < this.cache.length; x++) {\n for (let y = 0; y < this.cache[x].length; y++) {\n this.cache[x][y] = undefined;\n }\n }\n }\n}\n","/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { DIM_OPACITY, INVERTED_DEFAULT_COLOR } from 'browser/renderer/atlas/Constants';\nimport { IGlyphIdentifier, ICharAtlasConfig } from 'browser/renderer/atlas/Types';\nimport { BaseCharAtlas } from 'browser/renderer/atlas/BaseCharAtlas';\nimport { DEFAULT_ANSI_COLORS } from 'browser/ColorManager';\nimport { LRUMap } from 'browser/renderer/atlas/LRUMap';\nimport { isFirefox, isSafari } from 'common/Platform';\nimport { IColor } from 'browser/Types';\nimport { throwIfFalsy } from 'browser/renderer/RendererUtils';\nimport { color } from 'browser/Color';\n\n// In practice we're probably never going to exhaust a texture this large. For debugging purposes,\n// however, it can be useful to set this to a really tiny value, to verify that LRU eviction works.\nconst TEXTURE_WIDTH = 1024;\nconst TEXTURE_HEIGHT = 1024;\n\nconst TRANSPARENT_COLOR = {\n css: 'rgba(0, 0, 0, 0)',\n rgba: 0\n};\n\n// Drawing to the cache is expensive: If we have to draw more than this number of glyphs to the\n// cache in a single frame, give up on trying to cache anything else, and try to finish the current\n// frame ASAP.\n//\n// This helps to limit the amount of damage a program can do when it would otherwise thrash the\n// cache.\nconst FRAME_CACHE_DRAW_LIMIT = 100;\n\n/**\n * The number of milliseconds to wait before generating the ImageBitmap, this is to debounce/batch\n * the operation as window.createImageBitmap is asynchronous.\n */\nconst GLYPH_BITMAP_COMMIT_DELAY = 100;\n\ninterface IGlyphCacheValue {\n index: number;\n isEmpty: boolean;\n inBitmap: boolean;\n}\n\nexport function getGlyphCacheKey(glyph: IGlyphIdentifier): number {\n // Note that this only returns a valid key when code < 256\n // Layout:\n // 0b00000000000000000000000000000001: italic (1)\n // 0b00000000000000000000000000000010: dim (1)\n // 0b00000000000000000000000000000100: bold (1)\n // 0b00000000000000000000111111111000: fg (9)\n // 0b00000000000111111111000000000000: bg (9)\n // 0b00011111111000000000000000000000: code (8)\n // 0b11100000000000000000000000000000: unused (3)\n return glyph.code << 21 | glyph.bg << 12 | glyph.fg << 3 | (glyph.bold ? 0 : 4) + (glyph.dim ? 0 : 2) + (glyph.italic ? 0 : 1);\n}\n\nexport class DynamicCharAtlas extends BaseCharAtlas {\n // An ordered map that we're using to keep track of where each glyph is in the atlas texture.\n // It's ordered so that we can determine when to remove the old entries.\n private _cacheMap: LRUMap<IGlyphCacheValue>;\n\n // The texture that the atlas is drawn to\n private _cacheCanvas: HTMLCanvasElement;\n private _cacheCtx: CanvasRenderingContext2D;\n\n // A temporary context that glyphs are drawn to before being transfered to the atlas.\n private _tmpCtx: CanvasRenderingContext2D;\n\n // The number of characters stored in the atlas by width/height\n private _width: number;\n private _height: number;\n\n private _drawToCacheCount: number = 0;\n\n // An array of glyph keys that are waiting on the bitmap to be generated.\n private _glyphsWaitingOnBitmap: IGlyphCacheValue[] = [];\n\n // The timeout that is used to batch bitmap generation so it's not requested for every new glyph.\n private _bitmapCommitTimeout: number | null = null;\n\n // The bitmap to draw from, this is much faster on other browsers than others.\n private _bitmap: ImageBitmap | null = null;\n\n constructor(document: Document, private _config: ICharAtlasConfig) {\n super();\n this._cacheCanvas = document.createElement('canvas');\n this._cacheCanvas.width = TEXTURE_WIDTH;\n this._cacheCanvas.height = TEXTURE_HEIGHT;\n // The canvas needs alpha because we use clearColor to convert the background color to alpha.\n // It might also contain some characters with transparent backgrounds if allowTransparency is\n // set.\n this._cacheCtx = throwIfFalsy(this._cacheCanvas.getContext('2d', {alpha: true}));\n\n const tmpCanvas = document.createElement('canvas');\n tmpCanvas.width = this._config.scaledCharWidth;\n tmpCanvas.height = this._config.scaledCharHeight;\n this._tmpCtx = throwIfFalsy(tmpCanvas.getContext('2d', {alpha: this._config.allowTransparency}));\n\n this._width = Math.floor(TEXTURE_WIDTH / this._config.scaledCharWidth);\n this._height = Math.floor(TEXTURE_HEIGHT / this._config.scaledCharHeight);\n const capacity = this._width * this._height;\n this._cacheMap = new LRUMap(capacity);\n this._cacheMap.prealloc(capacity);\n\n // This is useful for debugging\n // document.body.appendChild(this._cacheCanvas);\n }\n\n public dispose(): void {\n if (this._bitmapCommitTimeout !== null) {\n window.clearTimeout(this._bitmapCommitTimeout);\n this._bitmapCommitTimeout = null;\n }\n }\n\n public beginFrame(): void {\n this._drawToCacheCount = 0;\n }\n\n public draw(\n ctx: CanvasRenderingContext2D,\n glyph: IGlyphIdentifier,\n x: number,\n y: number\n ): boolean {\n // Space is always an empty cell, special case this as it's so common\n if (glyph.code === 32) {\n return true;\n }\n\n // Exit early for uncachable glyphs\n if (!this._canCache(glyph)) {\n return false;\n }\n\n const glyphKey = getGlyphCacheKey(glyph);\n const cacheValue = this._cacheMap.get(glyphKey);\n if (cacheValue !== null && cacheValue !== undefined) {\n this._drawFromCache(ctx, cacheValue, x, y);\n return true;\n }\n if (this._drawToCacheCount < FRAME_CACHE_DRAW_LIMIT) {\n let index;\n if (this._cacheMap.size < this._cacheMap.capacity) {\n index = this._cacheMap.size;\n } else {\n // we're out of space, so our call to set will delete this item\n index = this._cacheMap.peek()!.index;\n }\n const cacheValue = this._drawToCache(glyph, index);\n this._cacheMap.set(glyphKey, cacheValue);\n this._drawFromCache(ctx, cacheValue, x, y);\n return true;\n }\n return false;\n }\n\n private _canCache(glyph: IGlyphIdentifier): boolean {\n // Only cache ascii and extended characters for now, to be safe. In the future, we could do\n // something more complicated to determine the expected width of a character.\n //\n // If we switch the renderer over to webgl at some point, we may be able to use blending modes\n // to draw overlapping glyphs from the atlas:\n // https://github.com/servo/webrender/issues/464#issuecomment-255632875\n // https://webglfundamentals.org/webgl/lessons/webgl-text-texture.html\n return glyph.code < 256;\n }\n\n private _toCoordinateX(index: number): number {\n return (index % this._width) * this._config.scaledCharWidth;\n }\n\n private _toCoordinateY(index: number): number {\n return Math.floor(index / this._width) * this._config.scaledCharHeight;\n }\n\n private _drawFromCache(\n ctx: CanvasRenderingContext2D,\n cacheValue: IGlyphCacheValue,\n x: number,\n y: number\n ): void {\n // We don't actually need to do anything if this is whitespace.\n if (cacheValue.isEmpty) {\n return;\n }\n const cacheX = this._toCoordinateX(cacheValue.index);\n const cacheY = this._toCoordinateY(cacheValue.index);\n ctx.drawImage(\n cacheValue.inBitmap ? this._bitmap! : this._cacheCanvas,\n cacheX,\n cacheY,\n this._config.scaledCharWidth,\n this._config.scaledCharHeight,\n x,\n y,\n this._config.scaledCharWidth,\n this._config.scaledCharHeight\n );\n }\n\n private _getColorFromAnsiIndex(idx: number): IColor {\n if (idx < this._config.colors.ansi.length) {\n return this._config.colors.ansi[idx];\n }\n return DEFAULT_ANSI_COLORS[idx];\n }\n\n private _getBackgroundColor(glyph: IGlyphIdentifier): IColor {\n if (this._config.allowTransparency) {\n // The background color might have some transparency, so we need to render it as fully\n // transparent in the atlas. Otherwise we'd end up drawing the transparent background twice\n // around the anti-aliased edges of the glyph, and it would look too dark.\n return TRANSPARENT_COLOR;\n }\n if (glyph.bg === INVERTED_DEFAULT_COLOR) {\n return this._config.colors.foreground;\n }\n if (glyph.bg < 256) {\n return this._getColorFromAnsiIndex(glyph.bg);\n }\n return this._config.colors.background;\n }\n\n private _getForegroundColor(glyph: IGlyphIdentifier): IColor {\n if (glyph.fg === INVERTED_DEFAULT_COLOR) {\n return color.opaque(this._config.colors.background);\n }\n if (glyph.fg < 256) {\n // 256 color support\n return this._getColorFromAnsiIndex(glyph.fg);\n }\n return this._config.colors.foreground;\n }\n\n // TODO: We do this (or something similar) in multiple places. We should split this off\n // into a shared function.\n private _drawToCache(glyph: IGlyphIdentifier, index: number): IGlyphCacheValue {\n this._drawToCacheCount++;\n\n this._tmpCtx.save();\n\n // draw the background\n const backgroundColor = this._getBackgroundColor(glyph);\n // Use a 'copy' composite operation to clear any existing glyph out of _tmpCtxWithAlpha, regardless of\n // transparency in backgroundColor\n this._tmpCtx.globalCompositeOperation = 'copy';\n this._tmpCtx.fillStyle = backgroundColor.css;\n this._tmpCtx.fillRect(0, 0, this._config.scaledCharWidth, this._config.scaledCharHeight);\n this._tmpCtx.globalCompositeOperation = 'source-over';\n\n // draw the foreground/glyph\n const fontWeight = glyph.bold ? this._config.fontWeightBold : this._config.fontWeight;\n const fontStyle = glyph.italic ? 'italic' : '';\n this._tmpCtx.font =\n `${fontStyle} ${fontWeight} ${this._config.fontSize * this._config.devicePixelRatio}px ${this._config.fontFamily}`;\n this._tmpCtx.textBaseline = 'middle';\n\n this._tmpCtx.fillStyle = this._getForegroundColor(glyph).css;\n\n // Apply alpha to dim the character\n if (glyph.dim) {\n this._tmpCtx.globalAlpha = DIM_OPACITY;\n }\n // Draw the character\n this._tmpCtx.fillText(glyph.chars, 0, this._config.scaledCharHeight / 2);\n this._tmpCtx.restore();\n\n // clear the background from the character to avoid issues with drawing over the previous\n // character if it extends past it's bounds\n const imageData = this._tmpCtx.getImageData(\n 0, 0, this._config.scaledCharWidth, this._config.scaledCharHeight\n );\n let isEmpty = false;\n if (!this._config.allowTransparency) {\n isEmpty = clearColor(imageData, backgroundColor);\n }\n\n // copy the data from imageData to _cacheCanvas\n const x = this._toCoordinateX(index);\n const y = this._toCoordinateY(index);\n // putImageData doesn't do any blending, so it will overwrite any existing cache entry for us\n this._cacheCtx.putImageData(imageData, x, y);\n\n // Add the glyph and queue it to the bitmap (if the browser supports it)\n const cacheValue = {\n index,\n isEmpty,\n inBitmap: false\n };\n this._addGlyphToBitmap(cacheValue);\n\n return cacheValue;\n }\n\n private _addGlyphToBitmap(cacheValue: IGlyphCacheValue): void {\n // Support is patchy for createImageBitmap at the moment, pass a canvas back\n // if support is lacking as drawImage works there too. Firefox is also\n // included here as ImageBitmap appears both buggy and has horrible\n // performance (tested on v55).\n if (!('createImageBitmap' in window) || isFirefox || isSafari) {\n return;\n }\n\n // Add the glyph to the queue\n this._glyphsWaitingOnBitmap.push(cacheValue);\n\n // Check if bitmap generation timeout already exists\n if (this._bitmapCommitTimeout !== null) {\n return;\n }\n\n this._bitmapCommitTimeout = window.setTimeout(() => this._generateBitmap(), GLYPH_BITMAP_COMMIT_DELAY);\n }\n\n private _generateBitmap(): void {\n const glyphsMovingToBitmap = this._glyphsWaitingOnBitmap;\n this._glyphsWaitingOnBitmap = [];\n window.createImageBitmap(this._cacheCanvas).then(bitmap => {\n // Set bitmap\n this._bitmap = bitmap;\n\n // Mark all new glyphs as in bitmap, excluding glyphs that came in after\n // the bitmap was requested\n for (let i = 0; i < glyphsMovingToBitmap.length; i++) {\n const value = glyphsMovingToBitmap[i];\n // It doesn't matter if the value was already evicted, it will be\n // released from memory after this block if so.\n value.inBitmap = true;\n }\n });\n this._bitmapCommitTimeout = null;\n }\n}\n\n// This is used for debugging the renderer, just swap out `new DynamicCharAtlas` with\n// `new NoneCharAtlas`.\nexport class NoneCharAtlas extends BaseCharAtlas {\n constructor(document: Document, config: ICharAtlasConfig) {\n super();\n }\n\n public draw(\n ctx: CanvasRenderingContext2D,\n glyph: IGlyphIdentifier,\n x: number,\n y: number\n ): boolean {\n return false;\n }\n}\n\n/**\n * Makes a partiicular rgb color in an ImageData completely transparent.\n * @returns True if the result is \"empty\", meaning all pixels are fully transparent.\n */\nfunction clearColor(imageData: ImageData, color: IColor): boolean {\n let isEmpty = true;\n const r = color.rgba >>> 24;\n const g = color.rgba >>> 16 & 0xFF;\n const b = color.rgba >>> 8 & 0xFF;\n for (let offset = 0; offset < imageData.data.length; offset += 4) {\n if (imageData.data[offset] === r &&\n imageData.data[offset + 1] === g &&\n imageData.data[offset + 2] === b) {\n imageData.data[offset + 3] = 0;\n } else {\n isEmpty = false;\n }\n }\n return isEmpty;\n}\n","/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IGlyphIdentifier } from 'browser/renderer/atlas/Types';\nimport { IDisposable } from 'common/Types';\n\nexport abstract class BaseCharAtlas implements IDisposable {\n private _didWarmUp: boolean = false;\n\n public dispose(): void { }\n\n /**\n * Perform any work needed to warm the cache before it can be used. May be called multiple times.\n * Implement _doWarmUp instead if you only want to get called once.\n */\n public warmUp(): void {\n if (!this._didWarmUp) {\n this._doWarmUp();\n this._didWarmUp = true;\n }\n }\n\n /**\n * Perform any work needed to warm the cache before it can be used. Used by the default\n * implementation of warmUp(), and will only be called once.\n */\n protected _doWarmUp(): void { }\n\n /**\n * Called when we start drawing a new frame.\n *\n * TODO: We rely on this getting called by TextRenderLayer. This should really be called by\n * Renderer instead, but we need to make Renderer the source-of-truth for the char atlas, instead\n * of BaseRenderLayer.\n */\n public beginFrame(): void { }\n\n /**\n * May be called before warmUp finishes, however it is okay for the implementation to\n * do nothing and return false in that case.\n *\n * @param ctx Where to draw the character onto.\n * @param glyph Information about what to draw\n * @param x The position on the context to start drawing at\n * @param y The position on the context to start drawing at\n * @returns The success state. True if we drew the character.\n */\n public abstract draw(\n ctx: CanvasRenderingContext2D,\n glyph: IGlyphIdentifier,\n x: number,\n y: number\n ): boolean;\n}\n","/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IColor, IColorContrastCache } from 'browser/Types';\n\nexport class ColorContrastCache implements IColorContrastCache {\n private _color: { [bg: number]: { [fg: number]: IColor | null | undefined } | undefined } = {};\n private _rgba: { [bg: number]: { [fg: number]: string | null | undefined } | undefined } = {};\n\n public clear(): void {\n this._color = {};\n this._rgba = {};\n }\n\n public setCss(bg: number, fg: number, value: string | null): void {\n if (!this._rgba[bg]) {\n this._rgba[bg] = {};\n }\n this._rgba[bg]![fg] = value;\n }\n\n public getCss(bg: number, fg: number): string | null | undefined {\n return this._rgba[bg] ? this._rgba[bg]![fg] : undefined;\n }\n\n public setColor(bg: number, fg: number, value: IColor | null): void {\n if (!this._color[bg]) {\n this._color[bg] = {};\n }\n this._color[bg]![fg] = value;\n }\n\n public getColor(bg: number, fg: number): IColor | null | undefined {\n return this._color[bg] ? this._color[bg]![fg] : undefined;\n }\n}\n","/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\ninterface ILinkedListNode<T> {\n prev: ILinkedListNode<T> | null;\n next: ILinkedListNode<T> | null;\n key: number | null;\n value: T | null;\n}\n\nexport class LRUMap<T> {\n private _map: { [key: number]: ILinkedListNode<T> } = {};\n private _head: ILinkedListNode<T> | null = null;\n private _tail: ILinkedListNode<T> | null = null;\n private _nodePool: ILinkedListNode<T>[] = [];\n public size: number = 0;\n\n constructor(public capacity: number) { }\n\n private _unlinkNode(node: ILinkedListNode<T>): void {\n const prev = node.prev;\n const next = node.next;\n if (node === this._head) {\n this._head = next;\n }\n if (node === this._tail) {\n this._tail = prev;\n }\n if (prev !== null) {\n prev.next = next;\n }\n if (next !== null) {\n next.prev = prev;\n }\n }\n\n private _appendNode(node: ILinkedListNode<T>): void {\n const tail = this._tail;\n if (tail !== null) {\n tail.next = node;\n }\n node.prev = tail;\n node.next = null;\n this._tail = node;\n if (this._head === null) {\n this._head = node;\n }\n }\n\n /**\n * Preallocate a bunch of linked-list nodes. Allocating these nodes ahead of time means that\n * they're more likely to live next to each other in memory, which seems to improve performance.\n *\n * Each empty object only consumes about 60 bytes of memory, so this is pretty cheap, even for\n * large maps.\n */\n public prealloc(count: number): void {\n const nodePool = this._nodePool;\n for (let i = 0; i < count; i++) {\n nodePool.push({\n prev: null,\n next: null,\n key: null,\n value: null\n });\n }\n }\n\n public get(key: number): T | null {\n // This is unsafe: We're assuming our keyspace doesn't overlap with Object.prototype. However,\n // it's faster than calling hasOwnProperty, and in our case, it would never overlap.\n const node = this._map[key];\n if (node !== undefined) {\n this._unlinkNode(node);\n this._appendNode(node);\n return node.value;\n }\n return null;\n }\n\n /**\n * Gets a value from a key without marking it as the most recently used item.\n */\n public peekValue(key: number): T | null {\n const node = this._map[key];\n if (node !== undefined) {\n return node.value;\n }\n return null;\n }\n\n public peek(): T | null {\n const head = this._head;\n return head === null ? null : head.value;\n }\n\n public set(key: number, value: T): void {\n // This is unsafe: See note above.\n let node = this._map[key];\n if (node !== undefined) {\n // already exists, we just need to mutate it and move it to the end of the list\n node = this._map[key];\n this._unlinkNode(node);\n node.value = value;\n } else if (this.size >= this.capacity) {\n // we're out of space: recycle the head node, move it to the tail\n node = this._head!;\n this._unlinkNode(node);\n delete this._map[node.key!];\n node.key = key;\n node.value = value;\n this._map[key] = node;\n } else {\n // make a new element\n const nodePool = this._nodePool;\n if (nodePool.length > 0) {\n // use a preallocated node if we can\n node = nodePool.pop()!;\n node.key = key;\n node.value = value;\n } else {\n node = {\n prev: null,\n next: null,\n key,\n value\n };\n }\n this._map[key] = node;\n this.size++;\n }\n this._appendNode(node);\n }\n}\n","/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IRenderDimensions } from 'browser/renderer/Types';\nimport { BaseRenderLayer } from 'browser/renderer/BaseRenderLayer';\nimport { IColorSet } from 'browser/Types';\nimport { IBufferService, IOptionsService } from 'common/services/Services';\n\ninterface ISelectionState {\n start?: [number, number];\n end?: [number, number];\n columnSelectMode?: boolean;\n ydisp?: number;\n}\n\nexport class SelectionRenderLayer extends BaseRenderLayer {\n private _state!: ISelectionState;\n\n constructor(\n container: HTMLElement,\n zIndex: number,\n colors: IColorSet,\n rendererId: number,\n bufferService: IBufferService,\n optionsService: IOptionsService\n ) {\n super(container, 'selection', zIndex, true, colors, rendererId, bufferService, optionsService);\n this._clearState();\n }\n\n private _clearState(): void {\n this._state = {\n start: undefined,\n end: undefined,\n columnSelectMode: undefined,\n ydisp: undefined\n };\n }\n\n public resize(dim: IRenderDimensions): void {\n super.resize(dim);\n // Resizing the canvas discards the contents of the canvas so clear state\n this._clearState();\n }\n\n public reset(): void {\n if (this._state.start && this._state.end) {\n this._clearState();\n this._clearAll();\n }\n }\n\n public onSelectionChanged(start: [number, number] | undefined, end: [number, number] | undefined, columnSelectMode: boolean): void {\n // Selection has not changed\n if (!this._didStateChange(start, end, columnSelectMode, this._bufferService.buffer.ydisp)) {\n return;\n }\n\n // Remove all selections\n this._clearAll();\n\n // Selection does not exist\n if (!start || !end) {\n this._clearState();\n return;\n }\n\n // Translate from buffer position to viewport position\n const viewportStartRow = start[1] - this._bufferService.buffer.ydisp;\n const viewportEndRow = end[1] - this._bufferService.buffer.ydisp;\n const viewportCappedStartRow = Math.max(viewportStartRow, 0);\n const viewportCappedEndRow = Math.min(viewportEndRow, this._bufferService.rows - 1);\n\n // No need to draw the selection\n if (viewportCappedStartRow >= this._bufferService.rows || viewportCappedEndRow < 0) {\n return;\n }\n\n this._ctx.fillStyle = this._colors.selectionTransparent.css;\n\n if (columnSelectMode) {\n const startCol = start[0];\n const width = end[0] - startCol;\n const height = viewportCappedEndRow - viewportCappedStartRow + 1;\n this._fillCells(startCol, viewportCappedStartRow, width, height);\n } else {\n // Draw first row\n const startCol = viewportStartRow === viewportCappedStartRow ? start[0] : 0;\n const startRowEndCol = viewportCappedStartRow === viewportCappedEndRow ? end[0] : this._bufferService.cols;\n this._fillCells(startCol, viewportCappedStartRow, startRowEndCol - startCol, 1);\n\n // Draw middle rows\n const middleRowsCount = Math.max(viewportCappedEndRow - viewportCappedStartRow - 1, 0);\n this._fillCells(0, viewportCappedStartRow + 1, this._bufferService.cols, middleRowsCount);\n\n // Draw final row\n if (viewportCappedStartRow !== viewportCappedEndRow) {\n // Only draw viewportEndRow if it's not the same as viewportStartRow\n const endCol = viewportEndRow === viewportCappedEndRow ? end[0] : this._bufferService.cols;\n this._fillCells(0, viewportCappedEndRow, endCol, 1);\n }\n }\n\n // Save state for next render\n this._state.start = [start[0], start[1]];\n this._state.end = [end[0], end[1]];\n this._state.columnSelectMode = columnSelectMode;\n this._state.ydisp = this._bufferService.buffer.ydisp;\n }\n\n private _didStateChange(start: [number, number] | undefined, end: [number, number] | undefined, columnSelectMode: boolean, ydisp: number): boolean {\n return !this._areCoordinatesEqual(start, this._state.start) ||\n !this._areCoordinatesEqual(end, this._state.end) ||\n columnSelectMode !== this._state.columnSelectMode ||\n ydisp !== this._state.ydisp;\n }\n\n private _areCoordinatesEqual(coord1: [number, number] | undefined, coord2: [number, number] | undefined): boolean {\n if (!coord1 || !coord2) {\n return false;\n }\n\n return coord1[0] === coord2[0] && coord1[1] === coord2[1];\n }\n}\n","/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IRenderDimensions, IRequestRedrawEvent } from 'browser/renderer/Types';\nimport { BaseRenderLayer } from 'browser/renderer/BaseRenderLayer';\nimport { ICellData } from 'common/Types';\nimport { CellData } from 'common/buffer/CellData';\nimport { IColorSet } from 'browser/Types';\nimport { IBufferService, IOptionsService, ICoreService } from 'common/services/Services';\nimport { IEventEmitter } from 'common/EventEmitter';\nimport { ICoreBrowserService } from 'browser/services/Services';\n\ninterface ICursorState {\n x: number;\n y: number;\n isFocused: boolean;\n style: string;\n width: number;\n}\n\n/**\n * The time between cursor blinks.\n */\nconst BLINK_INTERVAL = 600;\n\nexport class CursorRenderLayer extends BaseRenderLayer {\n private _state: ICursorState;\n private _cursorRenderers: {[key: string]: (x: number, y: number, cell: ICellData) => void};\n private _cursorBlinkStateManager: CursorBlinkStateManager | undefined;\n private _cell: ICellData = new CellData();\n\n constructor(\n container: HTMLElement,\n zIndex: number,\n colors: IColorSet,\n rendererId: number,\n private _onRequestRedraw: IEventEmitter<IRequestRedrawEvent>,\n bufferService: IBufferService,\n optionsService: IOptionsService,\n private readonly _coreService: ICoreService,\n private readonly _coreBrowserService: ICoreBrowserService\n ) {\n super(container, 'cursor', zIndex, true, colors, rendererId, bufferService, optionsService);\n this._state = {\n x: 0,\n y: 0,\n isFocused: false,\n style: '',\n width: 0\n };\n this._cursorRenderers = {\n 'bar': this._renderBarCursor.bind(this),\n 'block': this._renderBlockCursor.bind(this),\n 'underline': this._renderUnderlineCursor.bind(this)\n };\n // TODO: Consider initial options? Maybe onOptionsChanged should be called at the end of open?\n }\n\n public resize(dim: IRenderDimensions): void {\n super.resize(dim);\n // Resizing the canvas discards the contents of the canvas so clear state\n this._state = {\n x: 0,\n y: 0,\n isFocused: false,\n style: '',\n width: 0\n };\n }\n\n public reset(): void {\n this._clearCursor();\n if (this._cursorBlinkStateManager) {\n this._cursorBlinkStateManager.dispose();\n this._cursorBlinkStateManager = undefined;\n this.onOptionsChanged();\n }\n }\n\n public onBlur(): void {\n if (this._cursorBlinkStateManager) {\n this._cursorBlinkStateManager.pause();\n }\n this._onRequestRedraw.fire({ start: this._bufferService.buffer.y, end: this._bufferService.buffer.y });\n }\n\n public onFocus(): void {\n if (this._cursorBlinkStateManager) {\n this._cursorBlinkStateManager.resume();\n } else {\n this._onRequestRedraw.fire({ start: this._bufferService.buffer.y, end: this._bufferService.buffer.y });\n }\n }\n\n public onOptionsChanged(): void {\n if (this._optionsService.options.cursorBlink) {\n if (!this._cursorBlinkStateManager) {\n this._cursorBlinkStateManager = new CursorBlinkStateManager(this._coreBrowserService.isFocused, () => {\n this._render(true);\n });\n }\n } else {\n this._cursorBlinkStateManager?.dispose();\n this._cursorBlinkStateManager = undefined;\n }\n // Request a refresh from the terminal as management of rendering is being\n // moved back to the terminal\n this._onRequestRedraw.fire({ start: this._bufferService.buffer.y, end: this._bufferService.buffer.y });\n }\n\n public onCursorMove(): void {\n if (this._cursorBlinkStateManager) {\n this._cursorBlinkStateManager.restartBlinkAnimation();\n }\n }\n\n public onGridChanged(startRow: number, endRow: number): void {\n if (!this._cursorBlinkStateManager || this._cursorBlinkStateManager.isPaused) {\n this._render(false);\n } else {\n this._cursorBlinkStateManager.restartBlinkAnimation();\n }\n }\n\n private _render(triggeredByAnimationFrame: boolean): void {\n // Don't draw the cursor if it's hidden\n if (!this._coreService.isCursorInitialized || this._coreService.isCursorHidden) {\n this._clearCursor();\n return;\n }\n\n const cursorY = this._bufferService.buffer.ybase + this._bufferService.buffer.y;\n const viewportRelativeCursorY = cursorY - this._bufferService.buffer.ydisp;\n\n // Don't draw the cursor if it's off-screen\n if (viewportRelativeCursorY < 0 || viewportRelativeCursorY >= this._bufferService.rows) {\n this._clearCursor();\n return;\n }\n\n // in case cursor.x == cols adjust visual cursor to cols - 1\n const cursorX = Math.min(this._bufferService.buffer.x, this._bufferService.cols - 1);\n this._bufferService.buffer.lines.get(cursorY)!.loadCell(cursorX, this._cell);\n if (this._cell.content === undefined) {\n return;\n }\n\n if (!this._coreBrowserService.isFocused) {\n this._clearCursor();\n this._ctx.save();\n this._ctx.fillStyle = this._colors.cursor.css;\n const cursorStyle = this._optionsService.options.cursorStyle;\n if (cursorStyle && cursorStyle !== 'block') {\n this._cursorRenderers[cursorStyle](cursorX, viewportRelativeCursorY, this._cell);\n } else {\n this._renderBlurCursor(cursorX, viewportRelativeCursorY, this._cell);\n }\n this._ctx.restore();\n this._state.x = cursorX;\n this._state.y = viewportRelativeCursorY;\n this._state.isFocused = false;\n this._state.style = cursorStyle;\n this._state.width = this._cell.getWidth();\n return;\n }\n\n // Don't draw the cursor if it's blinking\n if (this._cursorBlinkStateManager && !this._cursorBlinkStateManager.isCursorVisible) {\n this._clearCursor();\n return;\n }\n\n if (this._state) {\n // The cursor is already in the correct spot, don't redraw\n if (this._state.x === cursorX &&\n this._state.y === viewportRelativeCursorY &&\n this._state.isFocused === this._coreBrowserService.isFocused &&\n this._state.style === this._optionsService.options.cursorStyle &&\n this._state.width === this._cell.getWidth()) {\n return;\n }\n this._clearCursor();\n }\n\n this._ctx.save();\n this._cursorRenderers[this._optionsService.options.cursorStyle || 'block'](cursorX, viewportRelativeCursorY, this._cell);\n this._ctx.restore();\n\n this._state.x = cursorX;\n this._state.y = viewportRelativeCursorY;\n this._state.isFocused = false;\n this._state.style = this._optionsService.options.cursorStyle;\n this._state.width = this._cell.getWidth();\n }\n\n private _clearCursor(): void {\n if (this._state) {\n this._clearCells(this._state.x, this._state.y, this._state.width, 1);\n this._state = {\n x: 0,\n y: 0,\n isFocused: false,\n style: '',\n width: 0\n };\n }\n }\n\n private _renderBarCursor(x: number, y: number, cell: ICellData): void {\n this._ctx.save();\n this._ctx.fillStyle = this._colors.cursor.css;\n this._fillLeftLineAtCell(x, y, this._optionsService.options.cursorWidth);\n this._ctx.restore();\n }\n\n private _renderBlockCursor(x: number, y: number, cell: ICellData): void {\n this._ctx.save();\n this._ctx.fillStyle = this._colors.cursor.css;\n this._fillCells(x, y, cell.getWidth(), 1);\n this._ctx.fillStyle = this._colors.cursorAccent.css;\n this._fillCharTrueColor(cell, x, y);\n this._ctx.restore();\n }\n\n private _renderUnderlineCursor(x: number, y: number, cell: ICellData): void {\n this._ctx.save();\n this._ctx.fillStyle = this._colors.cursor.css;\n this._fillBottomLineAtCells(x, y);\n this._ctx.restore();\n }\n\n private _renderBlurCursor(x: number, y: number, cell: ICellData): void {\n this._ctx.save();\n this._ctx.strokeStyle = this._colors.cursor.css;\n this._strokeRectAtCell(x, y, cell.getWidth(), 1);\n this._ctx.restore();\n }\n}\n\nclass CursorBlinkStateManager {\n public isCursorVisible: boolean;\n\n private _animationFrame: number | undefined;\n private _blinkStartTimeout: number | undefined;\n private _blinkInterval: number | undefined;\n\n /**\n * The time at which the animation frame was restarted, this is used on the\n * next render to restart the timers so they don't need to restart the timers\n * multiple times over a short period.\n */\n private _animationTimeRestarted: number | undefined;\n\n constructor(\n isFocused: boolean,\n private _renderCallback: () => void\n ) {\n this.isCursorVisible = true;\n if (isFocused) {\n this._restartInterval();\n }\n }\n\n public get isPaused(): boolean { return !(this._blinkStartTimeout || this._blinkInterval); }\n\n public dispose(): void {\n if (this._blinkInterval) {\n window.clearInterval(this._blinkInterval);\n this._blinkInterval = undefined;\n }\n if (this._blinkStartTimeout) {\n window.clearTimeout(this._blinkStartTimeout);\n this._blinkStartTimeout = undefined;\n }\n if (this._animationFrame) {\n window.cancelAnimationFrame(this._animationFrame);\n this._animationFrame = undefined;\n }\n }\n\n public restartBlinkAnimation(): void {\n if (this.isPaused) {\n return;\n }\n // Save a timestamp so that the restart can be done on the next interval\n this._animationTimeRestarted = Date.now();\n // Force a cursor render to ensure it's visible and in the correct position\n this.isCursorVisible = true;\n if (!this._animationFrame) {\n this._animationFrame = window.requestAnimationFrame(() => {\n this._renderCallback();\n this._animationFrame = undefined;\n });\n }\n }\n\n private _restartInterval(timeToStart: number = BLINK_INTERVAL): void {\n // Clear any existing interval\n if (this._blinkInterval) {\n window.clearInterval(this._blinkInterval);\n }\n\n // Setup the initial timeout which will hide the cursor, this is done before\n // the regular interval is setup in order to support restarting the blink\n // animation in a lightweight way (without thrashing clearInterval and\n // setInterval).\n this._blinkStartTimeout = window.setTimeout(() => {\n // Check if another animation restart was requested while this was being\n // started\n if (this._animationTimeRestarted) {\n const time = BLINK_INTERVAL - (Date.now() - this._animationTimeRestarted);\n this._animationTimeRestarted = undefined;\n if (time > 0) {\n this._restartInterval(time);\n return;\n }\n }\n\n // Hide the cursor\n this.isCursorVisible = false;\n this._animationFrame = window.requestAnimationFrame(() => {\n this._renderCallback();\n this._animationFrame = undefined;\n });\n\n // Setup the blink interval\n this._blinkInterval = window.setInterval(() => {\n // Adjust the animation time if it was restarted\n if (this._animationTimeRestarted) {\n // calc time diff\n // Make restart interval do a setTimeout initially?\n const time = BLINK_INTERVAL - (Date.now() - this._animationTimeRestarted);\n this._animationTimeRestarted = undefined;\n this._restartInterval(time);\n return;\n }\n\n // Invert visibility and render\n this.isCursorVisible = !this.isCursorVisible;\n this._animationFrame = window.requestAnimationFrame(() => {\n this._renderCallback();\n this._animationFrame = undefined;\n });\n }, BLINK_INTERVAL);\n }, timeToStart);\n }\n\n public pause(): void {\n this.isCursorVisible = true;\n if (this._blinkInterval) {\n window.clearInterval(this._blinkInterval);\n this._blinkInterval = undefined;\n }\n if (this._blinkStartTimeout) {\n window.clearTimeout(this._blinkStartTimeout);\n this._blinkStartTimeout = undefined;\n }\n if (this._animationFrame) {\n window.cancelAnimationFrame(this._animationFrame);\n this._animationFrame = undefined;\n }\n }\n\n public resume(): void {\n // Clear out any existing timers just in case\n this.pause();\n\n this._animationTimeRestarted = undefined;\n this._restartInterval();\n this.restartBlinkAnimation();\n }\n}\n","/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IRenderDimensions } from 'browser/renderer/Types';\nimport { BaseRenderLayer } from './BaseRenderLayer';\nimport { INVERTED_DEFAULT_COLOR } from 'browser/renderer/atlas/Constants';\nimport { is256Color } from 'browser/renderer/atlas/CharAtlasUtils';\nimport { IColorSet, ILinkifierEvent, ILinkifier, ILinkifier2 } from 'browser/Types';\nimport { IBufferService, IOptionsService } from 'common/services/Services';\n\nexport class LinkRenderLayer extends BaseRenderLayer {\n private _state: ILinkifierEvent | undefined;\n\n constructor(\n container: HTMLElement,\n zIndex: number,\n colors: IColorSet,\n rendererId: number,\n linkifier: ILinkifier,\n linkifier2: ILinkifier2,\n bufferService: IBufferService,\n optionsService: IOptionsService\n ) {\n super(container, 'link', zIndex, true, colors, rendererId, bufferService, optionsService);\n linkifier.onShowLinkUnderline(e => this._onShowLinkUnderline(e));\n linkifier.onHideLinkUnderline(e => this._onHideLinkUnderline(e));\n\n linkifier2.onShowLinkUnderline(e => this._onShowLinkUnderline(e));\n linkifier2.onHideLinkUnderline(e => this._onHideLinkUnderline(e));\n }\n\n public resize(dim: IRenderDimensions): void {\n super.resize(dim);\n // Resizing the canvas discards the contents of the canvas so clear state\n this._state = undefined;\n }\n\n public reset(): void {\n this._clearCurrentLink();\n }\n\n private _clearCurrentLink(): void {\n if (this._state) {\n this._clearCells(this._state.x1, this._state.y1, this._state.cols - this._state.x1, 1);\n const middleRowCount = this._state.y2 - this._state.y1 - 1;\n if (middleRowCount > 0) {\n this._clearCells(0, this._state.y1 + 1, this._state.cols, middleRowCount);\n }\n this._clearCells(0, this._state.y2, this._state.x2, 1);\n this._state = undefined;\n }\n }\n\n private _onShowLinkUnderline(e: ILinkifierEvent): void {\n if (e.fg === INVERTED_DEFAULT_COLOR) {\n this._ctx.fillStyle = this._colors.background.css;\n } else if (e.fg && is256Color(e.fg)) {\n // 256 color support\n this._ctx.fillStyle = this._colors.ansi[e.fg].css;\n } else {\n this._ctx.fillStyle = this._colors.foreground.css;\n }\n\n if (e.y1 === e.y2) {\n // Single line link\n this._fillBottomLineAtCells(e.x1, e.y1, e.x2 - e.x1);\n } else {\n // Multi-line link\n this._fillBottomLineAtCells(e.x1, e.y1, e.cols - e.x1);\n for (let y = e.y1 + 1; y < e.y2; y++) {\n this._fillBottomLineAtCells(0, y, e.cols);\n }\n this._fillBottomLineAtCells(0, e.y2, e.x2);\n }\n this._state = e;\n }\n\n private _onHideLinkUnderline(e: ILinkifierEvent): void {\n this._clearCurrentLink();\n }\n}\n","/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { ILinkifierEvent, ILinkMatcher, LinkMatcherHandler, ILinkMatcherOptions, ILinkifier, IMouseZoneManager, IMouseZone, IRegisteredLinkMatcher } from 'browser/Types';\nimport { IBufferStringIteratorResult } from 'common/buffer/Types';\nimport { EventEmitter, IEvent } from 'common/EventEmitter';\nimport { ILogService, IBufferService, IOptionsService, IUnicodeService } from 'common/services/Services';\n\n/**\n * Limit of the unwrapping line expansion (overscan) at the top and bottom\n * of the actual viewport in ASCII characters.\n * A limit of 2000 should match most sane urls.\n */\nconst OVERSCAN_CHAR_LIMIT = 2000;\n\n/**\n * The Linkifier applies links to rows shortly after they have been refreshed.\n */\nexport class Linkifier implements ILinkifier {\n /**\n * The time to wait after a row is changed before it is linkified. This prevents\n * the costly operation of searching every row multiple times, potentially a\n * huge amount of times.\n */\n protected static _timeBeforeLatency = 200;\n\n protected _linkMatchers: IRegisteredLinkMatcher[] = [];\n\n private _mouseZoneManager: IMouseZoneManager | undefined;\n private _element: HTMLElement | undefined;\n\n private _rowsTimeoutId: number | undefined;\n private _nextLinkMatcherId = 0;\n private _rowsToLinkify: { start: number | undefined, end: number | undefined };\n\n private _onShowLinkUnderline = new EventEmitter<ILinkifierEvent>();\n public get onShowLinkUnderline(): IEvent<ILinkifierEvent> { return this._onShowLinkUnderline.event; }\n private _onHideLinkUnderline = new EventEmitter<ILinkifierEvent>();\n public get onHideLinkUnderline(): IEvent<ILinkifierEvent> { return this._onHideLinkUnderline.event; }\n private _onLinkTooltip = new EventEmitter<ILinkifierEvent>();\n public get onLinkTooltip(): IEvent<ILinkifierEvent> { return this._onLinkTooltip.event; }\n\n constructor(\n @IBufferService protected readonly _bufferService: IBufferService,\n @ILogService private readonly _logService: ILogService,\n @IUnicodeService private readonly _unicodeService: IUnicodeService\n ) {\n this._rowsToLinkify = {\n start: undefined,\n end: undefined\n };\n }\n\n /**\n * Attaches the linkifier to the DOM, enabling linkification.\n * @param mouseZoneManager The mouse zone manager to register link zones with.\n */\n public attachToDom(element: HTMLElement, mouseZoneManager: IMouseZoneManager): void {\n this._element = element;\n this._mouseZoneManager = mouseZoneManager;\n }\n\n /**\n * Queue linkification on a set of rows.\n * @param start The row to linkify from (inclusive).\n * @param end The row to linkify to (inclusive).\n */\n public linkifyRows(start: number, end: number): void {\n // Don't attempt linkify if not yet attached to DOM\n if (!this._mouseZoneManager) {\n return;\n }\n\n // Increase range to linkify\n if (this._rowsToLinkify.start === undefined || this._rowsToLinkify.end === undefined) {\n this._rowsToLinkify.start = start;\n this._rowsToLinkify.end = end;\n } else {\n this._rowsToLinkify.start = Math.min(this._rowsToLinkify.start, start);\n this._rowsToLinkify.end = Math.max(this._rowsToLinkify.end, end);\n }\n\n // Clear out any existing links on this row range\n this._mouseZoneManager.clearAll(start, end);\n\n // Restart timer\n if (this._rowsTimeoutId) {\n clearTimeout(this._rowsTimeoutId);\n }\n this._rowsTimeoutId = <number><any>setTimeout(() => this._linkifyRows(), Linkifier._timeBeforeLatency);\n }\n\n /**\n * Linkifies the rows requested.\n */\n private _linkifyRows(): void {\n this._rowsTimeoutId = undefined;\n const buffer = this._bufferService.buffer;\n\n if (this._rowsToLinkify.start === undefined || this._rowsToLinkify.end === undefined) {\n this._logService.debug('_rowToLinkify was unset before _linkifyRows was called');\n return;\n }\n\n // Ensure the start row exists\n const absoluteRowIndexStart = buffer.ydisp + this._rowsToLinkify.start;\n if (absoluteRowIndexStart >= buffer.lines.length) {\n return;\n }\n\n // Invalidate bad end row values (if a resize happened)\n const absoluteRowIndexEnd = buffer.ydisp + Math.min(this._rowsToLinkify.end, this._bufferService.rows) + 1;\n\n // Iterate over the range of unwrapped content strings within start..end\n // (excluding).\n // _doLinkifyRow gets full unwrapped lines with the start row as buffer offset\n // for every matcher.\n // The unwrapping is needed to also match content that got wrapped across\n // several buffer lines. To avoid a worst case scenario where the whole buffer\n // contains just a single unwrapped string we limit this line expansion beyond\n // the viewport to +OVERSCAN_CHAR_LIMIT chars (overscan) at top and bottom.\n // This comes with the tradeoff that matches longer than OVERSCAN_CHAR_LIMIT\n // chars will not match anymore at the viewport borders.\n const overscanLineLimit = Math.ceil(OVERSCAN_CHAR_LIMIT / this._bufferService.cols);\n const iterator = this._bufferService.buffer.iterator(\n false, absoluteRowIndexStart, absoluteRowIndexEnd, overscanLineLimit, overscanLineLimit);\n while (iterator.hasNext()) {\n const lineData: IBufferStringIteratorResult = iterator.next();\n for (let i = 0; i < this._linkMatchers.length; i++) {\n this._doLinkifyRow(lineData.range.first, lineData.content, this._linkMatchers[i]);\n }\n }\n\n this._rowsToLinkify.start = undefined;\n this._rowsToLinkify.end = undefined;\n }\n\n /**\n * Registers a link matcher, allowing custom link patterns to be matched and\n * handled.\n * @param regex The regular expression to search for. Specifically, this\n * searches the textContent of the rows. You will want to use \\s to match a\n * space ' ' character for example.\n * @param handler The callback when the link is called.\n * @param options Options for the link matcher.\n * @return The ID of the new matcher, this can be used to deregister.\n */\n public registerLinkMatcher(regex: RegExp, handler: LinkMatcherHandler, options: ILinkMatcherOptions = {}): number {\n if (!handler) {\n throw new Error('handler must be defined');\n }\n const matcher: IRegisteredLinkMatcher = {\n id: this._nextLinkMatcherId++,\n regex,\n handler,\n matchIndex: options.matchIndex,\n validationCallback: options.validationCallback,\n hoverTooltipCallback: options.tooltipCallback,\n hoverLeaveCallback: options.leaveCallback,\n willLinkActivate: options.willLinkActivate,\n priority: options.priority || 0\n };\n this._addLinkMatcherToList(matcher);\n return matcher.id;\n }\n\n /**\n * Inserts a link matcher to the list in the correct position based on the\n * priority of each link matcher. New link matchers of equal priority are\n * considered after older link matchers.\n * @param matcher The link matcher to be added.\n */\n private _addLinkMatcherToList(matcher: IRegisteredLinkMatcher): void {\n if (this._linkMatchers.length === 0) {\n this._linkMatchers.push(matcher);\n return;\n }\n\n for (let i = this._linkMatchers.length - 1; i >= 0; i--) {\n if (matcher.priority <= this._linkMatchers[i].priority) {\n this._linkMatchers.splice(i + 1, 0, matcher);\n return;\n }\n }\n\n this._linkMatchers.splice(0, 0, matcher);\n }\n\n /**\n * Deregisters a link matcher if it has been registered.\n * @param matcherId The link matcher's ID (returned after register)\n * @return Whether a link matcher was found and deregistered.\n */\n public deregisterLinkMatcher(matcherId: number): boolean {\n for (let i = 0; i < this._linkMatchers.length; i++) {\n if (this._linkMatchers[i].id === matcherId) {\n this._linkMatchers.splice(i, 1);\n return true;\n }\n }\n return false;\n }\n\n /**\n * Linkifies a row given a specific handler.\n * @param rowIndex The row index to linkify (absolute index).\n * @param text string content of the unwrapped row.\n * @param matcher The link matcher for this line.\n */\n private _doLinkifyRow(rowIndex: number, text: string, matcher: ILinkMatcher): void {\n // clone regex to do a global search on text\n const rex = new RegExp(matcher.regex.source, (matcher.regex.flags || '') + 'g');\n let match;\n let stringIndex = -1;\n while ((match = rex.exec(text)) !== null) {\n const uri = match[typeof matcher.matchIndex !== 'number' ? 0 : matcher.matchIndex];\n if (!uri) {\n // something matched but does not comply with the given matchIndex\n // since this is most likely a bug the regex itself we simply do nothing here\n this._logService.debug('match found without corresponding matchIndex', match, matcher);\n break;\n }\n\n // Get index, match.index is for the outer match which includes negated chars\n // therefore we cannot use match.index directly, instead we search the position\n // of the match group in text again\n // also correct regex and string search offsets for the next loop run\n stringIndex = text.indexOf(uri, stringIndex + 1);\n rex.lastIndex = stringIndex + uri.length;\n if (stringIndex < 0) {\n // invalid stringIndex (should not have happened)\n break;\n }\n\n // get the buffer index as [absolute row, col] for the match\n const bufferIndex = this._bufferService.buffer.stringIndexToBufferIndex(rowIndex, stringIndex);\n if (bufferIndex[0] < 0) {\n // invalid bufferIndex (should not have happened)\n break;\n }\n\n const line = this._bufferService.buffer.lines.get(bufferIndex[0]);\n if (!line) {\n break;\n }\n\n const attr = line.getFg(bufferIndex[1]);\n const fg = attr ? (attr >> 9) & 0x1ff : undefined;\n\n if (matcher.validationCallback) {\n matcher.validationCallback(uri, isValid => {\n // Discard link if the line has already changed\n if (this._rowsTimeoutId) {\n return;\n }\n if (isValid) {\n this._addLink(bufferIndex[1], bufferIndex[0] - this._bufferService.buffer.ydisp, uri, matcher, fg);\n }\n });\n } else {\n this._addLink(bufferIndex[1], bufferIndex[0] - this._bufferService.buffer.ydisp, uri, matcher, fg);\n }\n }\n }\n\n /**\n * Registers a link to the mouse zone manager.\n * @param x The column the link starts.\n * @param y The row the link is on.\n * @param uri The URI of the link.\n * @param matcher The link matcher for the link.\n * @param fg The link color for hover event.\n */\n private _addLink(x: number, y: number, uri: string, matcher: ILinkMatcher, fg: number | undefined): void {\n if (!this._mouseZoneManager || !this._element) {\n return;\n }\n // FIXME: get cell length from buffer to avoid mismatch after Unicode version change\n const width = this._unicodeService.getStringCellWidth(uri);\n const x1 = x % this._bufferService.cols;\n const y1 = y + Math.floor(x / this._bufferService.cols);\n let x2 = (x1 + width) % this._bufferService.cols;\n let y2 = y1 + Math.floor((x1 + width) / this._bufferService.cols);\n if (x2 === 0) {\n x2 = this._bufferService.cols;\n y2--;\n }\n\n this._mouseZoneManager.add(new MouseZone(\n x1 + 1,\n y1 + 1,\n x2 + 1,\n y2 + 1,\n e => {\n if (matcher.handler) {\n return matcher.handler(e, uri);\n }\n const newWindow = window.open();\n if (newWindow) {\n newWindow.opener = null;\n newWindow.location.href = uri;\n } else {\n console.warn('Opening link blocked as opener could not be cleared');\n }\n },\n () => {\n this._onShowLinkUnderline.fire(this._createLinkHoverEvent(x1, y1, x2, y2, fg));\n this._element!.classList.add('xterm-cursor-pointer');\n },\n e => {\n this._onLinkTooltip.fire(this._createLinkHoverEvent(x1, y1, x2, y2, fg));\n if (matcher.hoverTooltipCallback) {\n // Note that IViewportRange use 1-based coordinates to align with escape sequences such\n // as CUP which use 1,1 as the default for row/col\n matcher.hoverTooltipCallback(e, uri, { start: { x: x1, y: y1 }, end: { x: x2, y: y2 } });\n }\n },\n () => {\n this._onHideLinkUnderline.fire(this._createLinkHoverEvent(x1, y1, x2, y2, fg));\n this._element!.classList.remove('xterm-cursor-pointer');\n if (matcher.hoverLeaveCallback) {\n matcher.hoverLeaveCallback();\n }\n },\n e => {\n if (matcher.willLinkActivate) {\n return matcher.willLinkActivate(e, uri);\n }\n return true;\n }\n ));\n }\n\n private _createLinkHoverEvent(x1: number, y1: number, x2: number, y2: number, fg: number | undefined): ILinkifierEvent {\n return { x1, y1, x2, y2, cols: this._bufferService.cols, fg };\n }\n}\n\nexport class MouseZone implements IMouseZone {\n constructor(\n public x1: number,\n public y1: number,\n public x2: number,\n public y2: number,\n public clickCallback: (e: MouseEvent) => any,\n public hoverCallback: (e: MouseEvent) => any,\n public tooltipCallback: (e: MouseEvent) => any,\n public leaveCallback: () => void,\n public willLinkActivate: (e: MouseEvent) => boolean\n ) {\n }\n}\n","/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { ISelectionRedrawRequestEvent, ISelectionRequestScrollLinesEvent } from 'browser/selection/Types';\nimport { IBuffer } from 'common/buffer/Types';\nimport { IBufferLine, IDisposable } from 'common/Types';\nimport * as Browser from 'common/Platform';\nimport { SelectionModel } from 'browser/selection/SelectionModel';\nimport { CellData } from 'common/buffer/CellData';\nimport { EventEmitter, IEvent } from 'common/EventEmitter';\nimport { ICharSizeService, IMouseService, ISelectionService, IRenderService } from 'browser/services/Services';\nimport { IBufferService, IOptionsService, ICoreService } from 'common/services/Services';\nimport { getCoordsRelativeToElement } from 'browser/input/Mouse';\nimport { moveToCellSequence } from 'browser/input/MoveToCell';\nimport { Disposable } from 'common/Lifecycle';\n\n/**\n * The number of pixels the mouse needs to be above or below the viewport in\n * order to scroll at the maximum speed.\n */\nconst DRAG_SCROLL_MAX_THRESHOLD = 50;\n\n/**\n * The maximum scrolling speed\n */\nconst DRAG_SCROLL_MAX_SPEED = 15;\n\n/**\n * The number of milliseconds between drag scroll updates.\n */\nconst DRAG_SCROLL_INTERVAL = 50;\n\n/**\n * The maximum amount of time that can have elapsed for an alt click to move the\n * cursor.\n */\nconst ALT_CLICK_MOVE_CURSOR_TIME = 500;\n\nconst NON_BREAKING_SPACE_CHAR = String.fromCharCode(160);\nconst ALL_NON_BREAKING_SPACE_REGEX = new RegExp(NON_BREAKING_SPACE_CHAR, 'g');\n\n/**\n * Represents a position of a word on a line.\n */\ninterface IWordPosition {\n start: number;\n length: number;\n}\n\n/**\n * A selection mode, this drives how the selection behaves on mouse move.\n */\nexport const enum SelectionMode {\n NORMAL,\n WORD,\n LINE,\n COLUMN\n}\n\n/**\n * A class that manages the selection of the terminal. With help from\n * SelectionModel, SelectionService handles with all logic associated with\n * dealing with the selection, including handling mouse interaction, wide\n * characters and fetching the actual text within the selection. Rendering is\n * not handled by the SelectionService but the onRedrawRequest event is fired\n * when the selection is ready to be redrawn (on an animation frame).\n */\nexport class SelectionService extends Disposable implements ISelectionService {\n public serviceBrand: undefined;\n\n protected _model: SelectionModel;\n\n /**\n * The amount to scroll every drag scroll update (depends on how far the mouse\n * drag is above or below the terminal).\n */\n private _dragScrollAmount: number = 0;\n\n /**\n * The current selection mode.\n */\n protected _activeSelectionMode: SelectionMode;\n\n /**\n * A setInterval timer that is active while the mouse is down whose callback\n * scrolls the viewport when necessary.\n */\n private _dragScrollIntervalTimer: number | undefined;\n\n /**\n * The animation frame ID used for refreshing the selection.\n */\n private _refreshAnimationFrame: number | undefined;\n\n /**\n * Whether selection is enabled.\n */\n private _enabled = true;\n\n private _mouseMoveListener: EventListener;\n private _mouseUpListener: EventListener;\n private _trimListener: IDisposable;\n private _workCell: CellData = new CellData();\n\n private _mouseDownTimeStamp: number = 0;\n\n private _onLinuxMouseSelection = this.register(new EventEmitter<string>());\n public get onLinuxMouseSelection(): IEvent<string> { return this._onLinuxMouseSelection.event; }\n private _onRedrawRequest = this.register(new EventEmitter<ISelectionRedrawRequestEvent>());\n public get onRequestRedraw(): IEvent<ISelectionRedrawRequestEvent> { return this._onRedrawRequest.event; }\n private _onSelectionChange = this.register(new EventEmitter<void>());\n public get onSelectionChange(): IEvent<void> { return this._onSelectionChange.event; }\n private _onRequestScrollLines = this.register(new EventEmitter<ISelectionRequestScrollLinesEvent>());\n public get onRequestScrollLines(): IEvent<ISelectionRequestScrollLinesEvent> { return this._onRequestScrollLines.event; }\n\n constructor(\n private readonly _element: HTMLElement,\n private readonly _screenElement: HTMLElement,\n @IBufferService private readonly _bufferService: IBufferService,\n @ICoreService private readonly _coreService: ICoreService,\n @IMouseService private readonly _mouseService: IMouseService,\n @IOptionsService private readonly _optionsService: IOptionsService,\n @IRenderService private readonly _renderService: IRenderService\n ) {\n super();\n\n // Init listeners\n this._mouseMoveListener = event => this._onMouseMove(<MouseEvent>event);\n this._mouseUpListener = event => this._onMouseUp(<MouseEvent>event);\n this._coreService.onUserInput(() => {\n if (this.hasSelection) {\n this.clearSelection();\n }\n });\n this._trimListener = this._bufferService.buffer.lines.onTrim(amount => this._onTrim(amount));\n this.register(this._bufferService.buffers.onBufferActivate(e => this._onBufferActivate(e)));\n\n this.enable();\n\n this._model = new SelectionModel(this._bufferService);\n this._activeSelectionMode = SelectionMode.NORMAL;\n }\n\n public dispose(): void {\n this._removeMouseDownListeners();\n }\n\n public reset(): void {\n this.clearSelection();\n }\n\n /**\n * Disables the selection manager. This is useful for when terminal mouse\n * are enabled.\n */\n public disable(): void {\n this.clearSelection();\n this._enabled = false;\n }\n\n /**\n * Enable the selection manager.\n */\n public enable(): void {\n this._enabled = true;\n }\n\n public get selectionStart(): [number, number] | undefined { return this._model.finalSelectionStart; }\n public get selectionEnd(): [number, number] | undefined { return this._model.finalSelectionEnd; }\n\n /**\n * Gets whether there is an active text selection.\n */\n public get hasSelection(): boolean {\n const start = this._model.finalSelectionStart;\n const end = this._model.finalSelectionEnd;\n if (!start || !end) {\n return false;\n }\n return start[0] !== end[0] || start[1] !== end[1];\n }\n\n /**\n * Gets the text currently selected.\n */\n public get selectionText(): string {\n const start = this._model.finalSelectionStart;\n const end = this._model.finalSelectionEnd;\n if (!start || !end) {\n return '';\n }\n\n const buffer = this._bufferService.buffer;\n const result: string[] = [];\n\n if (this._activeSelectionMode === SelectionMode.COLUMN) {\n // Ignore zero width selections\n if (start[0] === end[0]) {\n return '';\n }\n\n for (let i = start[1]; i <= end[1]; i++) {\n const lineText = buffer.translateBufferLineToString(i, true, start[0], end[0]);\n result.push(lineText);\n }\n } else {\n // Get first row\n const startRowEndCol = start[1] === end[1] ? end[0] : undefined;\n result.push(buffer.translateBufferLineToString(start[1], true, start[0], startRowEndCol));\n\n // Get middle rows\n for (let i = start[1] + 1; i <= end[1] - 1; i++) {\n const bufferLine = buffer.lines.get(i);\n const lineText = buffer.translateBufferLineToString(i, true);\n if (bufferLine && bufferLine.isWrapped) {\n result[result.length - 1] += lineText;\n } else {\n result.push(lineText);\n }\n }\n\n // Get final row\n if (start[1] !== end[1]) {\n const bufferLine = buffer.lines.get(end[1]);\n const lineText = buffer.translateBufferLineToString(end[1], true, 0, end[0]);\n if (bufferLine && bufferLine!.isWrapped) {\n result[result.length - 1] += lineText;\n } else {\n result.push(lineText);\n }\n }\n }\n\n // Format string by replacing non-breaking space chars with regular spaces\n // and joining the array into a multi-line string.\n const formattedResult = result.map(line => {\n return line.replace(ALL_NON_BREAKING_SPACE_REGEX, ' ');\n }).join(Browser.isWindows ? '\\r\\n' : '\\n');\n\n return formattedResult;\n }\n\n /**\n * Clears the current terminal selection.\n */\n public clearSelection(): void {\n this._model.clearSelection();\n this._removeMouseDownListeners();\n this.refresh();\n this._onSelectionChange.fire();\n }\n\n /**\n * Queues a refresh, redrawing the selection on the next opportunity.\n * @param isLinuxMouseSelection Whether the selection should be registered as a new\n * selection on Linux.\n */\n public refresh(isLinuxMouseSelection?: boolean): void {\n // Queue the refresh for the renderer\n if (!this._refreshAnimationFrame) {\n this._refreshAnimationFrame = window.requestAnimationFrame(() => this._refresh());\n }\n\n // If the platform is Linux and the refresh call comes from a mouse event,\n // we need to update the selection for middle click to paste selection.\n if (Browser.isLinux && isLinuxMouseSelection) {\n const selectionText = this.selectionText;\n if (selectionText.length) {\n this._onLinuxMouseSelection.fire(this.selectionText);\n }\n }\n }\n\n /**\n * Fires the refresh event, causing consumers to pick it up and redraw the\n * selection state.\n */\n private _refresh(): void {\n this._refreshAnimationFrame = undefined;\n this._onRedrawRequest.fire({\n start: this._model.finalSelectionStart,\n end: this._model.finalSelectionEnd,\n columnSelectMode: this._activeSelectionMode === SelectionMode.COLUMN\n });\n }\n\n /**\n * Checks if the current click was inside the current selection\n * @param event The mouse event\n */\n public isClickInSelection(event: MouseEvent): boolean {\n const coords = this._getMouseBufferCoords(event);\n const start = this._model.finalSelectionStart;\n const end = this._model.finalSelectionEnd;\n\n if (!start || !end || !coords) {\n return false;\n }\n\n return this._areCoordsInSelection(coords, start, end);\n }\n\n protected _areCoordsInSelection(coords: [number, number], start: [number, number], end: [number, number]): boolean {\n return (coords[1] > start[1] && coords[1] < end[1]) ||\n (start[1] === end[1] && coords[1] === start[1] && coords[0] >= start[0] && coords[0] < end[0]) ||\n (start[1] < end[1] && coords[1] === end[1] && coords[0] < end[0]) ||\n (start[1] < end[1] && coords[1] === start[1] && coords[0] >= start[0]);\n }\n\n /**\n * Selects word at the current mouse event coordinates.\n * @param event The mouse event.\n */\n public selectWordAtCursor(event: MouseEvent): void {\n const coords = this._getMouseBufferCoords(event);\n if (coords) {\n this._selectWordAt(coords, false);\n this._model.selectionEnd = undefined;\n this.refresh(true);\n }\n }\n\n /**\n * Selects all text within the terminal.\n */\n public selectAll(): void {\n this._model.isSelectAllActive = true;\n this.refresh();\n this._onSelectionChange.fire();\n }\n\n public selectLines(start: number, end: number): void {\n this._model.clearSelection();\n start = Math.max(start, 0);\n end = Math.min(end, this._bufferService.buffer.lines.length - 1);\n this._model.selectionStart = [0, start];\n this._model.selectionEnd = [this._bufferService.cols, end];\n this.refresh();\n this._onSelectionChange.fire();\n }\n\n /**\n * Handle the buffer being trimmed, adjust the selection position.\n * @param amount The amount the buffer is being trimmed.\n */\n private _onTrim(amount: number): void {\n const needsRefresh = this._model.onTrim(amount);\n if (needsRefresh) {\n this.refresh();\n }\n }\n\n /**\n * Gets the 0-based [x, y] buffer coordinates of the current mouse event.\n * @param event The mouse event.\n */\n private _getMouseBufferCoords(event: MouseEvent): [number, number] | undefined {\n const coords = this._mouseService.getCoords(event, this._screenElement, this._bufferService.cols, this._bufferService.rows, true);\n if (!coords) {\n return undefined;\n }\n\n // Convert to 0-based\n coords[0]--;\n coords[1]--;\n\n // Convert viewport coords to buffer coords\n coords[1] += this._bufferService.buffer.ydisp;\n return coords;\n }\n\n /**\n * Gets the amount the viewport should be scrolled based on how far out of the\n * terminal the mouse is.\n * @param event The mouse event.\n */\n private _getMouseEventScrollAmount(event: MouseEvent): number {\n let offset = getCoordsRelativeToElement(event, this._screenElement)[1];\n const terminalHeight = this._renderService.dimensions.canvasHeight;\n if (offset >= 0 && offset <= terminalHeight) {\n return 0;\n }\n if (offset > terminalHeight) {\n offset -= terminalHeight;\n }\n\n offset = Math.min(Math.max(offset, -DRAG_SCROLL_MAX_THRESHOLD), DRAG_SCROLL_MAX_THRESHOLD);\n offset /= DRAG_SCROLL_MAX_THRESHOLD;\n return (offset / Math.abs(offset)) + Math.round(offset * (DRAG_SCROLL_MAX_SPEED - 1));\n }\n\n /**\n * Returns whether the selection manager should force selection, regardless of\n * whether the terminal is in mouse events mode.\n * @param event The mouse event.\n */\n public shouldForceSelection(event: MouseEvent): boolean {\n if (Browser.isMac) {\n return event.altKey && this._optionsService.options.macOptionClickForcesSelection;\n }\n\n return event.shiftKey;\n }\n\n /**\n * Handles te mousedown event, setting up for a new selection.\n * @param event The mousedown event.\n */\n public onMouseDown(event: MouseEvent): void {\n this._mouseDownTimeStamp = event.timeStamp;\n // If we have selection, we want the context menu on right click even if the\n // terminal is in mouse mode.\n if (event.button === 2 && this.hasSelection) {\n return;\n }\n\n // Only action the primary button\n if (event.button !== 0) {\n return;\n }\n\n // Allow selection when using a specific modifier key, even when disabled\n if (!this._enabled) {\n if (!this.shouldForceSelection(event)) {\n return;\n }\n\n // Don't send the mouse down event to the current process, we want to select\n event.stopPropagation();\n }\n\n // Tell the browser not to start a regular selection\n event.preventDefault();\n\n // Reset drag scroll state\n this._dragScrollAmount = 0;\n\n if (this._enabled && event.shiftKey) {\n this._onIncrementalClick(event);\n } else {\n if (event.detail === 1) {\n this._onSingleClick(event);\n } else if (event.detail === 2) {\n this._onDoubleClick(event);\n } else if (event.detail === 3) {\n this._onTripleClick(event);\n }\n }\n\n this._addMouseDownListeners();\n this.refresh(true);\n }\n\n /**\n * Adds listeners when mousedown is triggered.\n */\n private _addMouseDownListeners(): void {\n // Listen on the document so that dragging outside of viewport works\n if (this._screenElement.ownerDocument) {\n this._screenElement.ownerDocument.addEventListener('mousemove', this._mouseMoveListener);\n this._screenElement.ownerDocument.addEventListener('mouseup', this._mouseUpListener);\n }\n this._dragScrollIntervalTimer = window.setInterval(() => this._dragScroll(), DRAG_SCROLL_INTERVAL);\n }\n\n /**\n * Removes the listeners that are registered when mousedown is triggered.\n */\n private _removeMouseDownListeners(): void {\n if (this._screenElement.ownerDocument) {\n this._screenElement.ownerDocument.removeEventListener('mousemove', this._mouseMoveListener);\n this._screenElement.ownerDocument.removeEventListener('mouseup', this._mouseUpListener);\n }\n clearInterval(this._dragScrollIntervalTimer);\n this._dragScrollIntervalTimer = undefined;\n }\n\n /**\n * Performs an incremental click, setting the selection end position to the mouse\n * position.\n * @param event The mouse event.\n */\n private _onIncrementalClick(event: MouseEvent): void {\n if (this._model.selectionStart) {\n this._model.selectionEnd = this._getMouseBufferCoords(event);\n }\n }\n\n /**\n * Performs a single click, resetting relevant state and setting the selection\n * start position.\n * @param event The mouse event.\n */\n private _onSingleClick(event: MouseEvent): void {\n this._model.selectionStartLength = 0;\n this._model.isSelectAllActive = false;\n this._activeSelectionMode = this.shouldColumnSelect(event) ? SelectionMode.COLUMN : SelectionMode.NORMAL;\n\n // Initialize the new selection\n this._model.selectionStart = this._getMouseBufferCoords(event);\n if (!this._model.selectionStart) {\n return;\n }\n this._model.selectionEnd = undefined;\n\n // Ensure the line exists\n const line = this._bufferService.buffer.lines.get(this._model.selectionStart[1]);\n if (!line) {\n return;\n }\n\n // Return early if the click event is not in the buffer (eg. in scroll bar)\n if (line.length === this._model.selectionStart[0]) {\n return;\n }\n\n // If the mouse is over the second half of a wide character, adjust the\n // selection to cover the whole character\n if (line.hasWidth(this._model.selectionStart[0]) === 0) {\n this._model.selectionStart[0]++;\n }\n }\n\n /**\n * Performs a double click, selecting the current work.\n * @param event The mouse event.\n */\n private _onDoubleClick(event: MouseEvent): void {\n const coords = this._getMouseBufferCoords(event);\n if (coords) {\n this._activeSelectionMode = SelectionMode.WORD;\n this._selectWordAt(coords, true);\n }\n }\n\n /**\n * Performs a triple click, selecting the current line and activating line\n * select mode.\n * @param event The mouse event.\n */\n private _onTripleClick(event: MouseEvent): void {\n const coords = this._getMouseBufferCoords(event);\n if (coords) {\n this._activeSelectionMode = SelectionMode.LINE;\n this._selectLineAt(coords[1]);\n }\n }\n\n /**\n * Returns whether the selection manager should operate in column select mode\n * @param event the mouse or keyboard event\n */\n public shouldColumnSelect(event: KeyboardEvent | MouseEvent): boolean {\n return event.altKey && !(Browser.isMac && this._optionsService.options.macOptionClickForcesSelection);\n }\n\n /**\n * Handles the mousemove event when the mouse button is down, recording the\n * end of the selection and refreshing the selection.\n * @param event The mousemove event.\n */\n private _onMouseMove(event: MouseEvent): void {\n // If the mousemove listener is active it means that a selection is\n // currently being made, we should stop propagation to prevent mouse events\n // to be sent to the pty.\n event.stopImmediatePropagation();\n\n // Do nothing if there is no selection start, this can happen if the first\n // click in the terminal is an incremental click\n if (!this._model.selectionStart) {\n return;\n }\n\n // Record the previous position so we know whether to redraw the selection\n // at the end.\n const previousSelectionEnd = this._model.selectionEnd ? [this._model.selectionEnd[0], this._model.selectionEnd[1]] : null;\n\n // Set the initial selection end based on the mouse coordinates\n this._model.selectionEnd = this._getMouseBufferCoords(event);\n if (!this._model.selectionEnd) {\n this.refresh(true);\n return;\n }\n\n // Select the entire line if line select mode is active.\n if (this._activeSelectionMode === SelectionMode.LINE) {\n if (this._model.selectionEnd[1] < this._model.selectionStart[1]) {\n this._model.selectionEnd[0] = 0;\n } else {\n this._model.selectionEnd[0] = this._bufferService.cols;\n }\n } else if (this._activeSelectionMode === SelectionMode.WORD) {\n this._selectToWordAt(this._model.selectionEnd);\n }\n\n // Determine the amount of scrolling that will happen.\n this._dragScrollAmount = this._getMouseEventScrollAmount(event);\n\n // If the cursor was above or below the viewport, make sure it's at the\n // start or end of the viewport respectively. This should only happen when\n // NOT in column select mode.\n if (this._activeSelectionMode !== SelectionMode.COLUMN) {\n if (this._dragScrollAmount > 0) {\n this._model.selectionEnd[0] = this._bufferService.cols;\n } else if (this._dragScrollAmount < 0) {\n this._model.selectionEnd[0] = 0;\n }\n }\n\n // If the character is a wide character include the cell to the right in the\n // selection. Note that selections at the very end of the line will never\n // have a character.\n const buffer = this._bufferService.buffer;\n if (this._model.selectionEnd[1] < buffer.lines.length) {\n const line = buffer.lines.get(this._model.selectionEnd[1]);\n if (line && line.hasWidth(this._model.selectionEnd[0]) === 0) {\n this._model.selectionEnd[0]++;\n }\n }\n\n // Only draw here if the selection changes.\n if (!previousSelectionEnd ||\n previousSelectionEnd[0] !== this._model.selectionEnd[0] ||\n previousSelectionEnd[1] !== this._model.selectionEnd[1]) {\n this.refresh(true);\n }\n }\n\n /**\n * The callback that occurs every DRAG_SCROLL_INTERVAL ms that does the\n * scrolling of the viewport.\n */\n private _dragScroll(): void {\n if (!this._model.selectionEnd || !this._model.selectionStart) {\n return;\n }\n if (this._dragScrollAmount) {\n this._onRequestScrollLines.fire({ amount: this._dragScrollAmount, suppressScrollEvent: false });\n // Re-evaluate selection\n // If the cursor was above or below the viewport, make sure it's at the\n // start or end of the viewport respectively. This should only happen when\n // NOT in column select mode.\n const buffer = this._bufferService.buffer;\n if (this._dragScrollAmount > 0) {\n if (this._activeSelectionMode !== SelectionMode.COLUMN) {\n this._model.selectionEnd[0] = this._bufferService.cols;\n }\n this._model.selectionEnd[1] = Math.min(buffer.ydisp + this._bufferService.rows, buffer.lines.length - 1);\n } else {\n if (this._activeSelectionMode !== SelectionMode.COLUMN) {\n this._model.selectionEnd[0] = 0;\n }\n this._model.selectionEnd[1] = buffer.ydisp;\n }\n this.refresh();\n }\n }\n\n /**\n * Handles the mouseup event, removing the mousedown listeners.\n * @param event The mouseup event.\n */\n private _onMouseUp(event: MouseEvent): void {\n const timeElapsed = event.timeStamp - this._mouseDownTimeStamp;\n\n this._removeMouseDownListeners();\n\n if (this.selectionText.length <= 1 && timeElapsed < ALT_CLICK_MOVE_CURSOR_TIME && event.altKey) {\n if (this._bufferService.buffer.ybase === this._bufferService.buffer.ydisp) {\n const coordinates = this._mouseService.getCoords(\n event,\n this._element,\n this._bufferService.cols,\n this._bufferService.rows,\n false\n );\n if (coordinates && coordinates[0] !== undefined && coordinates[1] !== undefined) {\n const sequence = moveToCellSequence(coordinates[0] - 1, coordinates[1] - 1, this._bufferService, this._coreService.decPrivateModes.applicationCursorKeys);\n this._coreService.triggerDataEvent(sequence, true);\n }\n }\n } else if (this.hasSelection) {\n this._onSelectionChange.fire();\n }\n }\n\n private _onBufferActivate(e: {activeBuffer: IBuffer, inactiveBuffer: IBuffer}): void {\n this.clearSelection();\n // Only adjust the selection on trim, shiftElements is rarely used (only in\n // reverseIndex) and delete in a splice is only ever used when the same\n // number of elements was just added. Given this is could actually be\n // beneficial to leave the selection as is for these cases.\n this._trimListener.dispose();\n this._trimListener = e.activeBuffer.lines.onTrim(amount => this._onTrim(amount));\n }\n\n /**\n * Converts a viewport column to the character index on the buffer line, the\n * latter takes into account wide characters.\n * @param coords The coordinates to find the 2 index for.\n */\n private _convertViewportColToCharacterIndex(bufferLine: IBufferLine, coords: [number, number]): number {\n let charIndex = coords[0];\n for (let i = 0; coords[0] >= i; i++) {\n const length = bufferLine.loadCell(i, this._workCell).getChars().length;\n if (this._workCell.getWidth() === 0) {\n // Wide characters aren't included in the line string so decrement the\n // index so the index is back on the wide character.\n charIndex--;\n } else if (length > 1 && coords[0] !== i) {\n // Emojis take up multiple characters, so adjust accordingly. For these\n // we don't want ot include the character at the column as we're\n // returning the start index in the string, not the end index.\n charIndex += length - 1;\n }\n }\n return charIndex;\n }\n\n public setSelection(col: number, row: number, length: number): void {\n this._model.clearSelection();\n this._removeMouseDownListeners();\n this._model.selectionStart = [col, row];\n this._model.selectionStartLength = length;\n this.refresh();\n }\n\n /**\n * Gets positional information for the word at the coordinated specified.\n * @param coords The coordinates to get the word at.\n */\n private _getWordAt(coords: [number, number], allowWhitespaceOnlySelection: boolean, followWrappedLinesAbove: boolean = true, followWrappedLinesBelow: boolean = true): IWordPosition | undefined {\n // Ensure coords are within viewport (eg. not within scroll bar)\n if (coords[0] >= this._bufferService.cols) {\n return undefined;\n }\n\n const buffer = this._bufferService.buffer;\n const bufferLine = buffer.lines.get(coords[1]);\n if (!bufferLine) {\n return undefined;\n }\n\n const line = buffer.translateBufferLineToString(coords[1], false);\n\n // Get actual index, taking into consideration wide characters\n let startIndex = this._convertViewportColToCharacterIndex(bufferLine, coords);\n let endIndex = startIndex;\n\n // Record offset to be used later\n const charOffset = coords[0] - startIndex;\n let leftWideCharCount = 0;\n let rightWideCharCount = 0;\n let leftLongCharOffset = 0;\n let rightLongCharOffset = 0;\n\n if (line.charAt(startIndex) === ' ') {\n // Expand until non-whitespace is hit\n while (startIndex > 0 && line.charAt(startIndex - 1) === ' ') {\n startIndex--;\n }\n while (endIndex < line.length && line.charAt(endIndex + 1) === ' ') {\n endIndex++;\n }\n } else {\n // Expand until whitespace is hit. This algorithm works by scanning left\n // and right from the starting position, keeping both the index format\n // (line) and the column format (bufferLine) in sync. When a wide\n // character is hit, it is recorded and the column index is adjusted.\n let startCol = coords[0];\n let endCol = coords[0];\n\n // Consider the initial position, skip it and increment the wide char\n // variable\n if (bufferLine.getWidth(startCol) === 0) {\n leftWideCharCount++;\n startCol--;\n }\n if (bufferLine.getWidth(endCol) === 2) {\n rightWideCharCount++;\n endCol++;\n }\n\n // Adjust the end index for characters whose length are > 1 (emojis)\n const length = bufferLine.getString(endCol).length;\n if (length > 1) {\n rightLongCharOffset += length - 1;\n endIndex += length - 1;\n }\n\n // Expand the string in both directions until a space is hit\n while (startCol > 0 && startIndex > 0 && !this._isCharWordSeparator(bufferLine.loadCell(startCol - 1, this._workCell))) {\n bufferLine.loadCell(startCol - 1, this._workCell);\n const length = this._workCell.getChars().length;\n if (this._workCell.getWidth() === 0) {\n // If the next character is a wide char, record it and skip the column\n leftWideCharCount++;\n startCol--;\n } else if (length > 1) {\n // If the next character's string is longer than 1 char (eg. emoji),\n // adjust the index\n leftLongCharOffset += length - 1;\n startIndex -= length - 1;\n }\n startIndex--;\n startCol--;\n }\n while (endCol < bufferLine.length && endIndex + 1 < line.length && !this._isCharWordSeparator(bufferLine.loadCell(endCol + 1, this._workCell))) {\n bufferLine.loadCell(endCol + 1, this._workCell);\n const length = this._workCell.getChars().length;\n if (this._workCell.getWidth() === 2) {\n // If the next character is a wide char, record it and skip the column\n rightWideCharCount++;\n endCol++;\n } else if (length > 1) {\n // If the next character's string is longer than 1 char (eg. emoji),\n // adjust the index\n rightLongCharOffset += length - 1;\n endIndex += length - 1;\n }\n endIndex++;\n endCol++;\n }\n }\n\n // Incremenet the end index so it is at the start of the next character\n endIndex++;\n\n // Calculate the start _column_, converting the the string indexes back to\n // column coordinates.\n let start =\n startIndex // The index of the selection's start char in the line string\n + charOffset // The difference between the initial char's column and index\n - leftWideCharCount // The number of wide chars left of the initial char\n + leftLongCharOffset; // The number of additional chars left of the initial char added by columns with strings longer than 1 (emojis)\n\n // Calculate the length in _columns_, converting the the string indexes back\n // to column coordinates.\n let length = Math.min(this._bufferService.cols, // Disallow lengths larger than the terminal cols\n endIndex // The index of the selection's end char in the line string\n - startIndex // The index of the selection's start char in the line string\n + leftWideCharCount // The number of wide chars left of the initial char\n + rightWideCharCount // The number of wide chars right of the initial char (inclusive)\n - leftLongCharOffset // The number of additional chars left of the initial char added by columns with strings longer than 1 (emojis)\n - rightLongCharOffset); // The number of additional chars right of the initial char (inclusive) added by columns with strings longer than 1 (emojis)\n\n if (!allowWhitespaceOnlySelection && line.slice(startIndex, endIndex).trim() === '') {\n return undefined;\n }\n\n // Recurse upwards if the line is wrapped and the word wraps to the above line\n if (followWrappedLinesAbove) {\n if (start === 0 && bufferLine.getCodePoint(0) !== 32 /* ' ' */) {\n const previousBufferLine = buffer.lines.get(coords[1] - 1);\n if (previousBufferLine && bufferLine.isWrapped && previousBufferLine.getCodePoint(this._bufferService.cols - 1) !== 32 /* ' ' */) {\n const previousLineWordPosition = this._getWordAt([this._bufferService.cols - 1, coords[1] - 1], false, true, false);\n if (previousLineWordPosition) {\n const offset = this._bufferService.cols - previousLineWordPosition.start;\n start -= offset;\n length += offset;\n }\n }\n }\n }\n\n // Recurse downwards if the line is wrapped and the word wraps to the next line\n if (followWrappedLinesBelow) {\n if (start + length === this._bufferService.cols && bufferLine.getCodePoint(this._bufferService.cols - 1) !== 32 /* ' ' */) {\n const nextBufferLine = buffer.lines.get(coords[1] + 1);\n if (nextBufferLine && nextBufferLine.isWrapped && nextBufferLine.getCodePoint(0) !== 32 /* ' ' */) {\n const nextLineWordPosition = this._getWordAt([0, coords[1] + 1], false, false, true);\n if (nextLineWordPosition) {\n length += nextLineWordPosition.length;\n }\n }\n }\n }\n\n return { start, length };\n }\n\n /**\n * Selects the word at the coordinates specified.\n * @param coords The coordinates to get the word at.\n * @param allowWhitespaceOnlySelection If whitespace should be selected\n */\n protected _selectWordAt(coords: [number, number], allowWhitespaceOnlySelection: boolean): void {\n const wordPosition = this._getWordAt(coords, allowWhitespaceOnlySelection);\n if (wordPosition) {\n // Adjust negative start value\n while (wordPosition.start < 0) {\n wordPosition.start += this._bufferService.cols;\n coords[1]--;\n }\n this._model.selectionStart = [wordPosition.start, coords[1]];\n this._model.selectionStartLength = wordPosition.length;\n }\n }\n\n /**\n * Sets the selection end to the word at the coordinated specified.\n * @param coords The coordinates to get the word at.\n */\n private _selectToWordAt(coords: [number, number]): void {\n const wordPosition = this._getWordAt(coords, true);\n if (wordPosition) {\n let endRow = coords[1];\n\n // Adjust negative start value\n while (wordPosition.start < 0) {\n wordPosition.start += this._bufferService.cols;\n endRow--;\n }\n\n // Adjust wrapped length value, this only needs to happen when values are reversed as in that\n // case we're interested in the start of the word, not the end\n if (!this._model.areSelectionValuesReversed()) {\n while (wordPosition.start + wordPosition.length > this._bufferService.cols) {\n wordPosition.length -= this._bufferService.cols;\n endRow++;\n }\n }\n\n this._model.selectionEnd = [this._model.areSelectionValuesReversed() ? wordPosition.start : wordPosition.start + wordPosition.length, endRow];\n }\n }\n\n /**\n * Gets whether the character is considered a word separator by the select\n * word logic.\n * @param char The character to check.\n */\n private _isCharWordSeparator(cell: CellData): boolean {\n // Zero width characters are never separators as they are always to the\n // right of wide characters\n if (cell.getWidth() === 0) {\n return false;\n }\n return this._optionsService.options.wordSeparator.indexOf(cell.getChars()) >= 0;\n }\n\n /**\n * Selects the line specified.\n * @param line The line index.\n */\n protected _selectLineAt(line: number): void {\n const wrappedRange = this._bufferService.buffer.getWrappedRangeForLine(line);\n this._model.selectionStart = [0, wrappedRange.first];\n this._model.selectionEnd = [this._bufferService.cols, wrappedRange.last];\n this._model.selectionStartLength = 0;\n }\n}\n","/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IBufferService } from 'common/services/Services';\n\n/**\n * Represents a selection within the buffer. This model only cares about column\n * and row coordinates, not wide characters.\n */\nexport class SelectionModel {\n /**\n * Whether select all is currently active.\n */\n public isSelectAllActive: boolean = false;\n\n /**\n * The minimal length of the selection from the start position. When double\n * clicking on a word, the word will be selected which makes the selection\n * start at the start of the word and makes this variable the length.\n */\n public selectionStartLength: number = 0;\n\n /**\n * The [x, y] position the selection starts at.\n */\n public selectionStart: [number, number] | undefined;\n\n /**\n * The [x, y] position the selection ends at.\n */\n public selectionEnd: [number, number] | undefined;\n\n constructor(\n private _bufferService: IBufferService\n ) {\n }\n\n /**\n * Clears the current selection.\n */\n public clearSelection(): void {\n this.selectionStart = undefined;\n this.selectionEnd = undefined;\n this.isSelectAllActive = false;\n this.selectionStartLength = 0;\n }\n\n /**\n * The final selection start, taking into consideration select all.\n */\n public get finalSelectionStart(): [number, number] | undefined {\n if (this.isSelectAllActive) {\n return [0, 0];\n }\n\n if (!this.selectionEnd || !this.selectionStart) {\n return this.selectionStart;\n }\n\n return this.areSelectionValuesReversed() ? this.selectionEnd : this.selectionStart;\n }\n\n /**\n * The final selection end, taking into consideration select all, double click\n * word selection and triple click line selection.\n */\n public get finalSelectionEnd(): [number, number] | undefined {\n if (this.isSelectAllActive) {\n return [this._bufferService.cols, this._bufferService.buffer.ybase + this._bufferService.rows - 1];\n }\n\n if (!this.selectionStart) {\n return undefined;\n }\n\n // Use the selection start + length if the end doesn't exist or they're reversed\n if (!this.selectionEnd || this.areSelectionValuesReversed()) {\n const startPlusLength = this.selectionStart[0] + this.selectionStartLength;\n if (startPlusLength > this._bufferService.cols) {\n return [startPlusLength % this._bufferService.cols, this.selectionStart[1] + Math.floor(startPlusLength / this._bufferService.cols)];\n }\n return [startPlusLength, this.selectionStart[1]];\n }\n\n // Ensure the the word/line is selected after a double/triple click\n if (this.selectionStartLength) {\n // Select the larger of the two when start and end are on the same line\n if (this.selectionEnd[1] === this.selectionStart[1]) {\n return [Math.max(this.selectionStart[0] + this.selectionStartLength, this.selectionEnd[0]), this.selectionEnd[1]];\n }\n }\n return this.selectionEnd;\n }\n\n /**\n * Returns whether the selection start and end are reversed.\n */\n public areSelectionValuesReversed(): boolean {\n const start = this.selectionStart;\n const end = this.selectionEnd;\n if (!start || !end) {\n return false;\n }\n return start[1] > end[1] || (start[1] === end[1] && start[0] > end[0]);\n }\n\n /**\n * Handle the buffer being trimmed, adjust the selection position.\n * @param amount The amount the buffer is being trimmed.\n * @return Whether a refresh is necessary.\n */\n public onTrim(amount: number): boolean {\n // Adjust the selection position based on the trimmed amount.\n if (this.selectionStart) {\n this.selectionStart[1] -= amount;\n }\n if (this.selectionEnd) {\n this.selectionEnd[1] -= amount;\n }\n\n // The selection has moved off the buffer, clear it.\n if (this.selectionEnd && this.selectionEnd[1] < 0) {\n this.clearSelection();\n return true;\n }\n\n // If the selection start is trimmed, ensure the start column is 0.\n if (this.selectionStart && this.selectionStart[1] < 0) {\n this.selectionStart[1] = 0;\n }\n return false;\n }\n}\n","/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { C0 } from 'common/data/EscapeSequences';\nimport { IBufferService } from 'common/services/Services';\n\nconst enum Direction {\n UP = 'A',\n DOWN = 'B',\n RIGHT = 'C',\n LEFT = 'D'\n}\n\n/**\n * Concatenates all the arrow sequences together.\n * Resets the starting row to an unwrapped row, moves to the requested row,\n * then moves to requested col.\n */\nexport function moveToCellSequence(targetX: number, targetY: number, bufferService: IBufferService, applicationCursor: boolean): string {\n const startX = bufferService.buffer.x;\n const startY = bufferService.buffer.y;\n\n // The alt buffer should try to navigate between rows\n if (!bufferService.buffer.hasScrollback) {\n return resetStartingRow(startX, startY, targetX, targetY, bufferService, applicationCursor) +\n moveToRequestedRow(startY, targetY, bufferService, applicationCursor) +\n moveToRequestedCol(startX, startY, targetX, targetY, bufferService, applicationCursor);\n }\n\n // Only move horizontally for the normal buffer\n let direction;\n if (startY === targetY) {\n direction = startX > targetX ? Direction.LEFT : Direction.RIGHT;\n return repeat(Math.abs(startX - targetX), sequence(direction, applicationCursor));\n }\n direction = startY > targetY ? Direction.LEFT : Direction.RIGHT;\n const rowDifference = Math.abs(startY - targetY);\n const cellsToMove = colsFromRowEnd(startY > targetY ? targetX : startX, bufferService) +\n (rowDifference - 1) * bufferService.cols + 1 /* wrap around 1 row */ +\n colsFromRowBeginning(startY > targetY ? startX : targetX, bufferService);\n return repeat(cellsToMove, sequence(direction, applicationCursor));\n}\n\n/**\n * Find the number of cols from a row beginning to a col.\n */\nfunction colsFromRowBeginning(currX: number, bufferService: IBufferService): number {\n return currX - 1;\n}\n\n/**\n * Find the number of cols from a col to row end.\n */\nfunction colsFromRowEnd(currX: number, bufferService: IBufferService): number {\n return bufferService.cols - currX;\n}\n\n/**\n * If the initial position of the cursor is on a row that is wrapped, move the\n * cursor up to the first row that is not wrapped to have accurate vertical\n * positioning.\n */\nfunction resetStartingRow(startX: number, startY: number, targetX: number, targetY: number, bufferService: IBufferService, applicationCursor: boolean): string {\n if (moveToRequestedRow(startY, targetY, bufferService, applicationCursor).length === 0) {\n return '';\n }\n return repeat(bufferLine(\n startX, startY, startX,\n startY - wrappedRowsForRow(bufferService, startY), false, bufferService\n ).length, sequence(Direction.LEFT, applicationCursor));\n}\n\n/**\n * Using the reset starting and ending row, move to the requested row,\n * ignoring wrapped rows\n */\nfunction moveToRequestedRow(startY: number, targetY: number, bufferService: IBufferService, applicationCursor: boolean): string {\n const startRow = startY - wrappedRowsForRow(bufferService, startY);\n const endRow = targetY - wrappedRowsForRow(bufferService, targetY);\n\n const rowsToMove = Math.abs(startRow - endRow) - wrappedRowsCount(startY, targetY, bufferService);\n\n return repeat(rowsToMove, sequence(verticalDirection(startY, targetY), applicationCursor));\n}\n\n/**\n * Move to the requested col on the ending row\n */\nfunction moveToRequestedCol(startX: number, startY: number, targetX: number, targetY: number, bufferService: IBufferService, applicationCursor: boolean): string {\n let startRow;\n if (moveToRequestedRow(startY, targetY, bufferService, applicationCursor).length > 0) {\n startRow = targetY - wrappedRowsForRow(bufferService, targetY);\n } else {\n startRow = startY;\n }\n\n const endRow = targetY;\n const direction = horizontalDirection(startX, startY, targetX, targetY, bufferService, applicationCursor);\n\n return repeat(bufferLine(\n startX, startRow, targetX, endRow,\n direction === Direction.RIGHT, bufferService\n ).length, sequence(direction, applicationCursor));\n}\n\n/**\n * Utility functions\n */\n\n/**\n * Calculates the number of wrapped rows between the unwrapped starting and\n * ending rows. These rows need to ignored since the cursor skips over them.\n */\nfunction wrappedRowsCount(startY: number, targetY: number, bufferService: IBufferService): number {\n let wrappedRows = 0;\n const startRow = startY - wrappedRowsForRow(bufferService, startY);\n const endRow = targetY - wrappedRowsForRow(bufferService, targetY);\n\n for (let i = 0; i < Math.abs(startRow - endRow); i++) {\n const direction = verticalDirection(startY, targetY) === Direction.UP ? -1 : 1;\n const line = bufferService.buffer.lines.get(startRow + (direction * i));\n if (line && line.isWrapped) {\n wrappedRows++;\n }\n }\n\n return wrappedRows;\n}\n\n/**\n * Calculates the number of wrapped rows that make up a given row.\n * @param currentRow The row to determine how many wrapped rows make it up\n */\nfunction wrappedRowsForRow(bufferService: IBufferService, currentRow: number): number {\n let rowCount = 0;\n let line = bufferService.buffer.lines.get(currentRow);\n let lineWraps = line && line.isWrapped;\n\n while (lineWraps && currentRow >= 0 && currentRow < bufferService.rows) {\n rowCount++;\n line = bufferService.buffer.lines.get(--currentRow);\n lineWraps = line && line.isWrapped;\n }\n\n return rowCount;\n}\n\n/**\n * Direction determiners\n */\n\n/**\n * Determines if the right or left arrow is needed\n */\nfunction horizontalDirection(startX: number, startY: number, targetX: number, targetY: number, bufferService: IBufferService, applicationCursor: boolean): Direction {\n let startRow;\n if (moveToRequestedRow(targetX, targetY, bufferService, applicationCursor).length > 0) {\n startRow = targetY - wrappedRowsForRow(bufferService, targetY);\n } else {\n startRow = startY;\n }\n\n if ((startX < targetX &&\n startRow <= targetY) || // down/right or same y/right\n (startX >= targetX &&\n startRow < targetY)) { // down/left or same y/left\n return Direction.RIGHT;\n }\n return Direction.LEFT;\n}\n\n/**\n * Determines if the up or down arrow is needed\n */\nfunction verticalDirection(startY: number, targetY: number): Direction {\n return startY > targetY ? Direction.UP : Direction.DOWN;\n}\n\n/**\n * Constructs the string of chars in the buffer from a starting row and col\n * to an ending row and col\n * @param startCol The starting column position\n * @param startRow The starting row position\n * @param endCol The ending column position\n * @param endRow The ending row position\n * @param forward Direction to move\n */\nfunction bufferLine(\n startCol: number,\n startRow: number,\n endCol: number,\n endRow: number,\n forward: boolean,\n bufferService: IBufferService\n): string {\n let currentCol = startCol;\n let currentRow = startRow;\n let bufferStr = '';\n\n while (currentCol !== endCol || currentRow !== endRow) {\n currentCol += forward ? 1 : -1;\n\n if (forward && currentCol > bufferService.cols - 1) {\n bufferStr += bufferService.buffer.translateBufferLineToString(\n currentRow, false, startCol, currentCol\n );\n currentCol = 0;\n startCol = 0;\n currentRow++;\n } else if (!forward && currentCol < 0) {\n bufferStr += bufferService.buffer.translateBufferLineToString(\n currentRow, false, 0, startCol + 1\n );\n currentCol = bufferService.cols - 1;\n startCol = currentCol;\n currentRow--;\n }\n }\n\n return bufferStr + bufferService.buffer.translateBufferLineToString(\n currentRow, false, startCol, currentCol\n );\n}\n\n/**\n * Constructs the escape sequence for clicking an arrow\n * @param direction The direction to move\n */\nfunction sequence(direction: Direction, applicationCursor: boolean): string {\n const mod = applicationCursor ? 'O' : '[';\n return C0.ESC + mod + direction;\n}\n\n/**\n * Returns a string repeated a given number of times\n * Polyfill from https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/repeat\n * @param count The number of times to repeat the string\n * @param string The string that is to be repeated\n */\nfunction repeat(count: number, str: string): string {\n count = Math.floor(count);\n let rpt = '';\n for (let i = 0; i < count; i++) {\n rpt += str;\n }\n return rpt;\n}\n","/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IOptionsService } from 'common/services/Services';\nimport { ISoundService } from 'browser/services/Services';\n\nexport class SoundService implements ISoundService {\n public serviceBrand: undefined;\n\n private static _audioContext: AudioContext;\n\n public static get audioContext(): AudioContext | null {\n if (!SoundService._audioContext) {\n const audioContextCtor: typeof AudioContext = (<any>window).AudioContext || (<any>window).webkitAudioContext;\n if (!audioContextCtor) {\n console.warn('Web Audio API is not supported by this browser. Consider upgrading to the latest version');\n return null;\n }\n SoundService._audioContext = new audioContextCtor();\n }\n return SoundService._audioContext;\n }\n\n constructor(\n @IOptionsService private _optionsService: IOptionsService\n ) {\n }\n\n public playBellSound(): void {\n const ctx = SoundService.audioContext;\n if (!ctx) {\n return;\n }\n const bellAudioSource = ctx.createBufferSource();\n ctx.decodeAudioData(this._base64ToArrayBuffer(this._removeMimeType(this._optionsService.options.bellSound)), (buffer) => {\n bellAudioSource.buffer = buffer;\n bellAudioSource.connect(ctx.destination);\n bellAudioSource.start(0);\n });\n }\n\n private _base64ToArrayBuffer(base64: string): ArrayBuffer {\n const binaryString = window.atob(base64);\n const len = binaryString.length;\n const bytes = new Uint8Array(len);\n\n for (let i = 0; i < len; i++) {\n bytes[i] = binaryString.charCodeAt(i);\n }\n\n return bytes.buffer;\n }\n\n private _removeMimeType(dataURI: string): string {\n // Split the input to get the mime-type and the data itself\n const splitUri = dataURI.split(',');\n\n // Return only the data\n return splitUri[1];\n }\n}\n","/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { Disposable } from 'common/Lifecycle';\nimport { addDisposableDomListener } from 'browser/Lifecycle';\nimport { IMouseService, ISelectionService } from 'browser/services/Services';\nimport { IMouseZoneManager, IMouseZone } from 'browser/Types';\nimport { IBufferService, IOptionsService } from 'common/services/Services';\n\n/**\n * The MouseZoneManager allows components to register zones within the terminal\n * that trigger hover and click callbacks.\n *\n * This class was intentionally made not so robust initially as the only case it\n * needed to support was single-line links which never overlap. Improvements can\n * be made in the future.\n */\nexport class MouseZoneManager extends Disposable implements IMouseZoneManager {\n private _zones: IMouseZone[] = [];\n\n private _areZonesActive: boolean = false;\n private _mouseMoveListener: (e: MouseEvent) => any;\n private _mouseLeaveListener: (e: MouseEvent) => any;\n private _clickListener: (e: MouseEvent) => any;\n\n private _tooltipTimeout: number | undefined;\n private _currentZone: IMouseZone | undefined;\n private _lastHoverCoords: [number | undefined, number | undefined] = [undefined, undefined];\n private _initialSelectionLength: number = 0;\n\n constructor(\n private readonly _element: HTMLElement,\n private readonly _screenElement: HTMLElement,\n @IBufferService private readonly _bufferService: IBufferService,\n @IMouseService private readonly _mouseService: IMouseService,\n @ISelectionService private readonly _selectionService: ISelectionService,\n @IOptionsService private readonly _optionsService: IOptionsService\n ) {\n super();\n\n this.register(addDisposableDomListener(this._element, 'mousedown', e => this._onMouseDown(e)));\n\n // These events are expensive, only listen to it when mouse zones are active\n this._mouseMoveListener = e => this._onMouseMove(e);\n this._mouseLeaveListener = e => this._onMouseLeave(e);\n this._clickListener = e => this._onClick(e);\n }\n\n public dispose(): void {\n super.dispose();\n this._deactivate();\n }\n\n public add(zone: IMouseZone): void {\n this._zones.push(zone);\n if (this._zones.length === 1) {\n this._activate();\n }\n }\n\n public clearAll(start?: number, end?: number): void {\n // Exit if there's nothing to clear\n if (this._zones.length === 0) {\n return;\n }\n\n // Clear all if start/end weren't set\n if (!start || !end) {\n start = 0;\n end = this._bufferService.rows - 1;\n }\n\n // Iterate through zones and clear them out if they're within the range\n for (let i = 0; i < this._zones.length; i++) {\n const zone = this._zones[i];\n if ((zone.y1 > start && zone.y1 <= end + 1) ||\n (zone.y2 > start && zone.y2 <= end + 1) ||\n (zone.y1 < start && zone.y2 > end + 1)) {\n if (this._currentZone && this._currentZone === zone) {\n this._currentZone.leaveCallback();\n this._currentZone = undefined;\n }\n this._zones.splice(i--, 1);\n }\n }\n\n // Deactivate the mouse zone manager if all the zones have been removed\n if (this._zones.length === 0) {\n this._deactivate();\n }\n }\n\n private _activate(): void {\n if (!this._areZonesActive) {\n this._areZonesActive = true;\n this._element.addEventListener('mousemove', this._mouseMoveListener);\n this._element.addEventListener('mouseleave', this._mouseLeaveListener);\n this._element.addEventListener('click', this._clickListener);\n }\n }\n\n private _deactivate(): void {\n if (this._areZonesActive) {\n this._areZonesActive = false;\n this._element.removeEventListener('mousemove', this._mouseMoveListener);\n this._element.removeEventListener('mouseleave', this._mouseLeaveListener);\n this._element.removeEventListener('click', this._clickListener);\n }\n }\n\n private _onMouseMove(e: MouseEvent): void {\n // TODO: Ideally this would only clear the hover state when the mouse moves\n // outside of the mouse zone\n if (this._lastHoverCoords[0] !== e.pageX || this._lastHoverCoords[1] !== e.pageY) {\n this._onHover(e);\n // Record the current coordinates\n this._lastHoverCoords = [e.pageX, e.pageY];\n }\n }\n\n private _onHover(e: MouseEvent): void {\n const zone = this._findZoneEventAt(e);\n\n // Do nothing if the zone is the same\n if (zone === this._currentZone) {\n return;\n }\n\n // Fire the hover end callback and cancel any existing timer if a new zone\n // is being hovered\n if (this._currentZone) {\n this._currentZone.leaveCallback();\n this._currentZone = undefined;\n if (this._tooltipTimeout) {\n clearTimeout(this._tooltipTimeout);\n }\n }\n\n // Exit if there is not zone\n if (!zone) {\n return;\n }\n this._currentZone = zone;\n\n // Trigger the hover callback\n if (zone.hoverCallback) {\n zone.hoverCallback(e);\n }\n\n // Restart the tooltip timeout\n this._tooltipTimeout = window.setTimeout(() => this._onTooltip(e), this._optionsService.options.linkTooltipHoverDuration);\n }\n\n private _onTooltip(e: MouseEvent): void {\n this._tooltipTimeout = undefined;\n const zone = this._findZoneEventAt(e);\n if (zone && zone.tooltipCallback) {\n zone.tooltipCallback(e);\n }\n }\n\n private _onMouseDown(e: MouseEvent): void {\n // Store current terminal selection length, to check if we're performing\n // a selection operation\n this._initialSelectionLength = this._getSelectionLength();\n\n // Ignore the event if there are no zones active\n if (!this._areZonesActive) {\n return;\n }\n\n // Find the active zone, prevent event propagation if found to prevent other\n // components from handling the mouse event.\n const zone = this._findZoneEventAt(e);\n if (zone?.willLinkActivate(e)) {\n e.preventDefault();\n e.stopImmediatePropagation();\n }\n }\n\n private _onMouseLeave(e: MouseEvent): void {\n // Fire the hover end callback and cancel any existing timer if the mouse\n // leaves the terminal element\n if (this._currentZone) {\n this._currentZone.leaveCallback();\n this._currentZone = undefined;\n if (this._tooltipTimeout) {\n clearTimeout(this._tooltipTimeout);\n }\n }\n }\n\n private _onClick(e: MouseEvent): void {\n // Find the active zone and click it if found and no selection was\n // being performed\n const zone = this._findZoneEventAt(e);\n const currentSelectionLength = this._getSelectionLength();\n\n if (zone && currentSelectionLength === this._initialSelectionLength) {\n zone.clickCallback(e);\n e.preventDefault();\n e.stopImmediatePropagation();\n }\n }\n\n private _getSelectionLength(): number {\n const selectionText = this._selectionService.selectionText;\n return selectionText ? selectionText.length : 0;\n }\n\n private _findZoneEventAt(e: MouseEvent): IMouseZone | undefined {\n const coords = this._mouseService.getCoords(e, this._screenElement, this._bufferService.cols, this._bufferService.rows);\n if (!coords) {\n return undefined;\n }\n const x = coords[0];\n const y = coords[1];\n for (let i = 0; i < this._zones.length; i++) {\n const zone = this._zones[i];\n if (zone.y1 === zone.y2) {\n // Single line link\n if (y === zone.y1 && x >= zone.x1 && x < zone.x2) {\n return zone;\n }\n } else {\n // Multi-line link\n if ((y === zone.y1 && x >= zone.x1) ||\n (y === zone.y2 && x < zone.x2) ||\n (y > zone.y1 && y < zone.y2)) {\n return zone;\n }\n }\n }\n return undefined;\n }\n}\n","/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport * as Strings from 'browser/LocalizableStrings';\nimport { ITerminal } from 'browser/Types';\nimport { IBuffer } from 'common/buffer/Types';\nimport { isMac } from 'common/Platform';\nimport { RenderDebouncer } from 'browser/RenderDebouncer';\nimport { addDisposableDomListener } from 'browser/Lifecycle';\nimport { Disposable } from 'common/Lifecycle';\nimport { ScreenDprMonitor } from 'browser/ScreenDprMonitor';\nimport { IRenderService } from 'browser/services/Services';\nimport { removeElementFromParent } from 'browser/Dom';\n\nconst MAX_ROWS_TO_READ = 20;\n\nconst enum BoundaryPosition {\n TOP,\n BOTTOM\n}\n\nexport class AccessibilityManager extends Disposable {\n private _accessibilityTreeRoot: HTMLElement;\n private _rowContainer: HTMLElement;\n private _rowElements: HTMLElement[];\n private _liveRegion: HTMLElement;\n private _liveRegionLineCount: number = 0;\n\n private _renderRowsDebouncer: RenderDebouncer;\n private _screenDprMonitor: ScreenDprMonitor;\n\n private _topBoundaryFocusListener: (e: FocusEvent) => void;\n private _bottomBoundaryFocusListener: (e: FocusEvent) => void;\n\n /**\n * This queue has a character pushed to it for keys that are pressed, if the\n * next character added to the terminal is equal to the key char then it is\n * not announced (added to live region) because it has already been announced\n * by the textarea event (which cannot be canceled). There are some race\n * condition cases if there is typing while data is streaming, but this covers\n * the main case of typing into the prompt and inputting the answer to a\n * question (Y/N, etc.).\n */\n private _charsToConsume: string[] = [];\n\n private _charsToAnnounce: string = '';\n\n constructor(\n private readonly _terminal: ITerminal,\n private readonly _renderService: IRenderService\n ) {\n super();\n this._accessibilityTreeRoot = document.createElement('div');\n this._accessibilityTreeRoot.classList.add('xterm-accessibility');\n\n this._rowContainer = document.createElement('div');\n this._rowContainer.classList.add('xterm-accessibility-tree');\n this._rowContainer.setAttribute('role', 'list');\n this._rowElements = [];\n for (let i = 0; i < this._terminal.rows; i++) {\n this._rowElements[i] = this._createAccessibilityTreeNode();\n this._rowContainer.appendChild(this._rowElements[i]);\n }\n\n this._topBoundaryFocusListener = e => this._onBoundaryFocus(e, BoundaryPosition.TOP);\n this._bottomBoundaryFocusListener = e => this._onBoundaryFocus(e, BoundaryPosition.BOTTOM);\n this._rowElements[0].addEventListener('focus', this._topBoundaryFocusListener);\n this._rowElements[this._rowElements.length - 1].addEventListener('focus', this._bottomBoundaryFocusListener);\n\n this._refreshRowsDimensions();\n this._accessibilityTreeRoot.appendChild(this._rowContainer);\n\n this._renderRowsDebouncer = new RenderDebouncer(this._renderRows.bind(this));\n this._refreshRows();\n\n this._liveRegion = document.createElement('div');\n this._liveRegion.classList.add('live-region');\n this._liveRegion.setAttribute('aria-live', 'assertive');\n this._accessibilityTreeRoot.appendChild(this._liveRegion);\n\n if (!this._terminal.element) {\n throw new Error('Cannot enable accessibility before Terminal.open');\n }\n this._terminal.element.insertAdjacentElement('afterbegin', this._accessibilityTreeRoot);\n\n this.register(this._renderRowsDebouncer);\n this.register(this._terminal.onResize(e => this._onResize(e.rows)));\n this.register(this._terminal.onRender(e => this._refreshRows(e.start, e.end)));\n this.register(this._terminal.onScroll(() => this._refreshRows()));\n // Line feed is an issue as the prompt won't be read out after a command is run\n this.register(this._terminal.onA11yChar(char => this._onChar(char)));\n this.register(this._terminal.onLineFeed(() => this._onChar('\\n')));\n this.register(this._terminal.onA11yTab(spaceCount => this._onTab(spaceCount)));\n this.register(this._terminal.onKey(e => this._onKey(e.key)));\n this.register(this._terminal.onBlur(() => this._clearLiveRegion()));\n this.register(this._renderService.onDimensionsChange(() => this._refreshRowsDimensions()));\n\n this._screenDprMonitor = new ScreenDprMonitor();\n this.register(this._screenDprMonitor);\n this._screenDprMonitor.setListener(() => this._refreshRowsDimensions());\n // This shouldn't be needed on modern browsers but is present in case the\n // media query that drives the ScreenDprMonitor isn't supported\n this.register(addDisposableDomListener(window, 'resize', () => this._refreshRowsDimensions()));\n }\n\n public dispose(): void {\n super.dispose();\n removeElementFromParent(this._accessibilityTreeRoot);\n this._rowElements.length = 0;\n }\n\n private _onBoundaryFocus(e: FocusEvent, position: BoundaryPosition): void {\n const boundaryElement = <HTMLElement>e.target;\n const beforeBoundaryElement = this._rowElements[position === BoundaryPosition.TOP ? 1 : this._rowElements.length - 2];\n\n // Don't scroll if the buffer top has reached the end in that direction\n const posInSet = boundaryElement.getAttribute('aria-posinset');\n const lastRowPos = position === BoundaryPosition.TOP ? '1' : `${this._terminal.buffer.lines.length}`;\n if (posInSet === lastRowPos) {\n return;\n }\n\n // Don't scroll when the last focused item was not the second row (focus is going the other\n // direction)\n if (e.relatedTarget !== beforeBoundaryElement) {\n return;\n }\n\n // Remove old boundary element from array\n let topBoundaryElement: HTMLElement;\n let bottomBoundaryElement: HTMLElement;\n if (position === BoundaryPosition.TOP) {\n topBoundaryElement = boundaryElement;\n bottomBoundaryElement = this._rowElements.pop()!;\n this._rowContainer.removeChild(bottomBoundaryElement);\n } else {\n topBoundaryElement = this._rowElements.shift()!;\n bottomBoundaryElement = boundaryElement;\n this._rowContainer.removeChild(topBoundaryElement);\n }\n\n // Remove listeners from old boundary elements\n topBoundaryElement.removeEventListener('focus', this._topBoundaryFocusListener);\n bottomBoundaryElement.removeEventListener('focus', this._bottomBoundaryFocusListener);\n\n // Add new element to array/DOM\n if (position === BoundaryPosition.TOP) {\n const newElement = this._createAccessibilityTreeNode();\n this._rowElements.unshift(newElement);\n this._rowContainer.insertAdjacentElement('afterbegin', newElement);\n } else {\n const newElement = this._createAccessibilityTreeNode();\n this._rowElements.push(newElement);\n this._rowContainer.appendChild(newElement);\n }\n\n // Add listeners to new boundary elements\n this._rowElements[0].addEventListener('focus', this._topBoundaryFocusListener);\n this._rowElements[this._rowElements.length - 1].addEventListener('focus', this._bottomBoundaryFocusListener);\n\n // Scroll up\n this._terminal.scrollLines(position === BoundaryPosition.TOP ? -1 : 1);\n\n // Focus new boundary before element\n this._rowElements[position === BoundaryPosition.TOP ? 1 : this._rowElements.length - 2].focus();\n\n // Prevent the standard behavior\n e.preventDefault();\n e.stopImmediatePropagation();\n }\n\n private _onResize(rows: number): void {\n // Remove bottom boundary listener\n this._rowElements[this._rowElements.length - 1].removeEventListener('focus', this._bottomBoundaryFocusListener);\n\n // Grow rows as required\n for (let i = this._rowContainer.children.length; i < this._terminal.rows; i++) {\n this._rowElements[i] = this._createAccessibilityTreeNode();\n this._rowContainer.appendChild(this._rowElements[i]);\n }\n // Shrink rows as required\n while (this._rowElements.length > rows) {\n this._rowContainer.removeChild(this._rowElements.pop()!);\n }\n\n // Add bottom boundary listener\n this._rowElements[this._rowElements.length - 1].addEventListener('focus', this._bottomBoundaryFocusListener);\n\n this._refreshRowsDimensions();\n }\n\n private _createAccessibilityTreeNode(): HTMLElement {\n const element = document.createElement('div');\n element.setAttribute('role', 'listitem');\n element.tabIndex = -1;\n this._refreshRowDimensions(element);\n return element;\n }\n\n private _onTab(spaceCount: number): void {\n for (let i = 0; i < spaceCount; i++) {\n this._onChar(' ');\n }\n }\n\n private _onChar(char: string): void {\n if (this._liveRegionLineCount < MAX_ROWS_TO_READ + 1) {\n if (this._charsToConsume.length > 0) {\n // Have the screen reader ignore the char if it was just input\n const shiftedChar = this._charsToConsume.shift();\n if (shiftedChar !== char) {\n this._charsToAnnounce += char;\n }\n } else {\n this._charsToAnnounce += char;\n }\n\n if (char === '\\n') {\n this._liveRegionLineCount++;\n if (this._liveRegionLineCount === MAX_ROWS_TO_READ + 1) {\n this._liveRegion.textContent += Strings.tooMuchOutput;\n }\n }\n\n // Only detach/attach on mac as otherwise messages can go unaccounced\n if (isMac) {\n if (this._liveRegion.textContent && this._liveRegion.textContent.length > 0 && !this._liveRegion.parentNode) {\n setTimeout(() => {\n this._accessibilityTreeRoot.appendChild(this._liveRegion);\n }, 0);\n }\n }\n }\n }\n\n private _clearLiveRegion(): void {\n this._liveRegion.textContent = '';\n this._liveRegionLineCount = 0;\n\n // Only detach/attach on mac as otherwise messages can go unaccounced\n if (isMac) {\n removeElementFromParent(this._liveRegion);\n }\n }\n\n private _onKey(keyChar: string): void {\n this._clearLiveRegion();\n this._charsToConsume.push(keyChar);\n }\n\n private _refreshRows(start?: number, end?: number): void {\n this._renderRowsDebouncer.refresh(start, end, this._terminal.rows);\n }\n\n private _renderRows(start: number, end: number): void {\n const buffer: IBuffer = this._terminal.buffer;\n const setSize = buffer.lines.length.toString();\n for (let i = start; i <= end; i++) {\n const lineData = buffer.translateBufferLineToString(buffer.ydisp + i, true);\n const posInSet = (buffer.ydisp + i + 1).toString();\n const element = this._rowElements[i];\n if (element) {\n if (lineData.length === 0) {\n element.innerHTML = '&nbsp;';\n } else {\n element.textContent = lineData;\n }\n element.setAttribute('aria-posinset', posInSet);\n element.setAttribute('aria-setsize', setSize);\n }\n }\n this._announceCharacters();\n }\n\n private _refreshRowsDimensions(): void {\n if (!this._renderService.dimensions.actualCellHeight) {\n return;\n }\n if (this._rowElements.length !== this._terminal.rows) {\n this._onResize(this._terminal.rows);\n }\n for (let i = 0; i < this._terminal.rows; i++) {\n this._refreshRowDimensions(this._rowElements[i]);\n }\n }\n\n private _refreshRowDimensions(element: HTMLElement): void {\n element.style.height = `${this._renderService.dimensions.actualCellHeight}px`;\n }\n\n private _announceCharacters(): void {\n if (this._charsToAnnounce.length === 0) {\n return;\n }\n this._liveRegion.textContent += this._charsToAnnounce;\n this._charsToAnnounce = '';\n }\n}\n","/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IRenderer, IRenderDimensions, CharacterJoinerHandler, IRequestRedrawEvent } from 'browser/renderer/Types';\nimport { BOLD_CLASS, ITALIC_CLASS, CURSOR_CLASS, CURSOR_STYLE_BLOCK_CLASS, CURSOR_BLINK_CLASS, CURSOR_STYLE_BAR_CLASS, CURSOR_STYLE_UNDERLINE_CLASS, DomRendererRowFactory } from 'browser/renderer/dom/DomRendererRowFactory';\nimport { INVERTED_DEFAULT_COLOR } from 'browser/renderer/atlas/Constants';\nimport { Disposable } from 'common/Lifecycle';\nimport { IColorSet, ILinkifierEvent, ILinkifier, ILinkifier2 } from 'browser/Types';\nimport { ICharSizeService } from 'browser/services/Services';\nimport { IOptionsService, IBufferService } from 'common/services/Services';\nimport { EventEmitter, IEvent } from 'common/EventEmitter';\nimport { color } from 'browser/Color';\nimport { removeElementFromParent } from 'browser/Dom';\n\nconst TERMINAL_CLASS_PREFIX = 'xterm-dom-renderer-owner-';\nconst ROW_CONTAINER_CLASS = 'xterm-rows';\nconst FG_CLASS_PREFIX = 'xterm-fg-';\nconst BG_CLASS_PREFIX = 'xterm-bg-';\nconst FOCUS_CLASS = 'xterm-focus';\nconst SELECTION_CLASS = 'xterm-selection';\n\nlet nextTerminalId = 1;\n\n/**\n * A fallback renderer for when canvas is slow. This is not meant to be\n * particularly fast or feature complete, more just stable and usable for when\n * canvas is not an option.\n */\nexport class DomRenderer extends Disposable implements IRenderer {\n private _rowFactory: DomRendererRowFactory;\n private _terminalClass: number = nextTerminalId++;\n\n private _themeStyleElement!: HTMLStyleElement;\n private _dimensionsStyleElement!: HTMLStyleElement;\n private _rowContainer: HTMLElement;\n private _rowElements: HTMLElement[] = [];\n private _selectionContainer: HTMLElement;\n\n public dimensions: IRenderDimensions;\n\n public get onRequestRedraw(): IEvent<IRequestRedrawEvent> { return new EventEmitter<IRequestRedrawEvent>().event; }\n\n constructor(\n private _colors: IColorSet,\n private readonly _element: HTMLElement,\n private readonly _screenElement: HTMLElement,\n private readonly _viewportElement: HTMLElement,\n private readonly _linkifier: ILinkifier,\n private readonly _linkifier2: ILinkifier2,\n @ICharSizeService private readonly _charSizeService: ICharSizeService,\n @IOptionsService private readonly _optionsService: IOptionsService,\n @IBufferService private readonly _bufferService: IBufferService\n ) {\n super();\n this._rowContainer = document.createElement('div');\n this._rowContainer.classList.add(ROW_CONTAINER_CLASS);\n this._rowContainer.style.lineHeight = 'normal';\n this._rowContainer.setAttribute('aria-hidden', 'true');\n this._refreshRowElements(this._bufferService.cols, this._bufferService.rows);\n this._selectionContainer = document.createElement('div');\n this._selectionContainer.classList.add(SELECTION_CLASS);\n this._selectionContainer.setAttribute('aria-hidden', 'true');\n\n this.dimensions = {\n scaledCharWidth: 0,\n scaledCharHeight: 0,\n scaledCellWidth: 0,\n scaledCellHeight: 0,\n scaledCharLeft: 0,\n scaledCharTop: 0,\n scaledCanvasWidth: 0,\n scaledCanvasHeight: 0,\n canvasWidth: 0,\n canvasHeight: 0,\n actualCellWidth: 0,\n actualCellHeight: 0\n };\n this._updateDimensions();\n this._injectCss();\n\n this._rowFactory = new DomRendererRowFactory(document, this._optionsService, this._colors);\n\n this._element.classList.add(TERMINAL_CLASS_PREFIX + this._terminalClass);\n this._screenElement.appendChild(this._rowContainer);\n this._screenElement.appendChild(this._selectionContainer);\n\n this._linkifier.onShowLinkUnderline(e => this._onLinkHover(e));\n this._linkifier.onHideLinkUnderline(e => this._onLinkLeave(e));\n\n this._linkifier2.onShowLinkUnderline(e => this._onLinkHover(e));\n this._linkifier2.onHideLinkUnderline(e => this._onLinkLeave(e));\n }\n\n public dispose(): void {\n this._element.classList.remove(TERMINAL_CLASS_PREFIX + this._terminalClass);\n\n // Outside influences such as React unmounts may manipulate the DOM before our disposal.\n // https://github.com/xtermjs/xterm.js/issues/2960\n removeElementFromParent(this._rowContainer, this._selectionContainer, this._themeStyleElement, this._dimensionsStyleElement);\n\n super.dispose();\n }\n\n private _updateDimensions(): void {\n this.dimensions.scaledCharWidth = this._charSizeService.width * window.devicePixelRatio;\n this.dimensions.scaledCharHeight = Math.ceil(this._charSizeService.height * window.devicePixelRatio);\n this.dimensions.scaledCellWidth = this.dimensions.scaledCharWidth + Math.round(this._optionsService.options.letterSpacing);\n this.dimensions.scaledCellHeight = Math.floor(this.dimensions.scaledCharHeight * this._optionsService.options.lineHeight);\n this.dimensions.scaledCharLeft = 0;\n this.dimensions.scaledCharTop = 0;\n this.dimensions.scaledCanvasWidth = this.dimensions.scaledCellWidth * this._bufferService.cols;\n this.dimensions.scaledCanvasHeight = this.dimensions.scaledCellHeight * this._bufferService.rows;\n this.dimensions.canvasWidth = Math.round(this.dimensions.scaledCanvasWidth / window.devicePixelRatio);\n this.dimensions.canvasHeight = Math.round(this.dimensions.scaledCanvasHeight / window.devicePixelRatio);\n this.dimensions.actualCellWidth = this.dimensions.canvasWidth / this._bufferService.cols;\n this.dimensions.actualCellHeight = this.dimensions.canvasHeight / this._bufferService.rows;\n\n for (const element of this._rowElements) {\n element.style.width = `${this.dimensions.canvasWidth}px`;\n element.style.height = `${this.dimensions.actualCellHeight}px`;\n element.style.lineHeight = `${this.dimensions.actualCellHeight}px`;\n // Make sure rows don't overflow onto following row\n element.style.overflow = 'hidden';\n }\n\n if (!this._dimensionsStyleElement) {\n this._dimensionsStyleElement = document.createElement('style');\n this._screenElement.appendChild(this._dimensionsStyleElement);\n }\n\n const styles =\n `${this._terminalSelector} .${ROW_CONTAINER_CLASS} span {` +\n ` display: inline-block;` +\n ` height: 100%;` +\n ` vertical-align: top;` +\n ` width: ${this.dimensions.actualCellWidth}px` +\n `}`;\n\n this._dimensionsStyleElement.innerHTML = styles;\n\n this._selectionContainer.style.height = this._viewportElement.style.height;\n this._screenElement.style.width = `${this.dimensions.canvasWidth}px`;\n this._screenElement.style.height = `${this.dimensions.canvasHeight}px`;\n }\n\n public setColors(colors: IColorSet): void {\n this._colors = colors;\n this._injectCss();\n }\n\n private _injectCss(): void {\n if (!this._themeStyleElement) {\n this._themeStyleElement = document.createElement('style');\n this._screenElement.appendChild(this._themeStyleElement);\n }\n\n // Base CSS\n let styles =\n `${this._terminalSelector} .${ROW_CONTAINER_CLASS} {` +\n ` color: ${this._colors.foreground.css};` +\n ` font-family: ${this._optionsService.options.fontFamily};` +\n ` font-size: ${this._optionsService.options.fontSize}px;` +\n `}`;\n // Text styles\n styles +=\n `${this._terminalSelector} span:not(.${BOLD_CLASS}) {` +\n ` font-weight: ${this._optionsService.options.fontWeight};` +\n `}` +\n `${this._terminalSelector} span.${BOLD_CLASS} {` +\n ` font-weight: ${this._optionsService.options.fontWeightBold};` +\n `}` +\n `${this._terminalSelector} span.${ITALIC_CLASS} {` +\n ` font-style: italic;` +\n `}`;\n // Blink animation\n styles +=\n `@keyframes blink_box_shadow` + `_` + this._terminalClass + ` {` +\n ` 50% {` +\n ` box-shadow: none;` +\n ` }` +\n `}`;\n styles +=\n `@keyframes blink_block` + `_` + this._terminalClass + ` {` +\n ` 0% {` +\n ` background-color: ${this._colors.cursor.css};` +\n ` color: ${this._colors.cursorAccent.css};` +\n ` }` +\n ` 50% {` +\n ` background-color: ${this._colors.cursorAccent.css};` +\n ` color: ${this._colors.cursor.css};` +\n ` }` +\n `}`;\n // Cursor\n styles +=\n `${this._terminalSelector} .${ROW_CONTAINER_CLASS}:not(.${FOCUS_CLASS}) .${CURSOR_CLASS}.${CURSOR_STYLE_BLOCK_CLASS} {` +\n ` outline: 1px solid ${this._colors.cursor.css};` +\n ` outline-offset: -1px;` +\n `}` +\n `${this._terminalSelector} .${ROW_CONTAINER_CLASS}.${FOCUS_CLASS} .${CURSOR_CLASS}.${CURSOR_BLINK_CLASS}:not(.${CURSOR_STYLE_BLOCK_CLASS}) {` +\n ` animation: blink_box_shadow` + `_` + this._terminalClass + ` 1s step-end infinite;` +\n `}` +\n `${this._terminalSelector} .${ROW_CONTAINER_CLASS}.${FOCUS_CLASS} .${CURSOR_CLASS}.${CURSOR_BLINK_CLASS}.${CURSOR_STYLE_BLOCK_CLASS} {` +\n ` animation: blink_block` + `_` + this._terminalClass + ` 1s step-end infinite;` +\n `}` +\n `${this._terminalSelector} .${ROW_CONTAINER_CLASS}.${FOCUS_CLASS} .${CURSOR_CLASS}.${CURSOR_STYLE_BLOCK_CLASS} {` +\n ` background-color: ${this._colors.cursor.css};` +\n ` color: ${this._colors.cursorAccent.css};` +\n `}` +\n `${this._terminalSelector} .${ROW_CONTAINER_CLASS} .${CURSOR_CLASS}.${CURSOR_STYLE_BAR_CLASS} {` +\n ` box-shadow: ${this._optionsService.options.cursorWidth}px 0 0 ${this._colors.cursor.css} inset;` +\n `}` +\n `${this._terminalSelector} .${ROW_CONTAINER_CLASS} .${CURSOR_CLASS}.${CURSOR_STYLE_UNDERLINE_CLASS} {` +\n ` box-shadow: 0 -1px 0 ${this._colors.cursor.css} inset;` +\n `}`;\n // Selection\n styles +=\n `${this._terminalSelector} .${SELECTION_CLASS} {` +\n ` position: absolute;` +\n ` top: 0;` +\n ` left: 0;` +\n ` z-index: 1;` +\n ` pointer-events: none;` +\n `}` +\n `${this._terminalSelector} .${SELECTION_CLASS} div {` +\n ` position: absolute;` +\n ` background-color: ${this._colors.selectionTransparent.css};` +\n `}`;\n // Colors\n this._colors.ansi.forEach((c, i) => {\n styles +=\n `${this._terminalSelector} .${FG_CLASS_PREFIX}${i} { color: ${c.css}; }` +\n `${this._terminalSelector} .${BG_CLASS_PREFIX}${i} { background-color: ${c.css}; }`;\n });\n styles +=\n `${this._terminalSelector} .${FG_CLASS_PREFIX}${INVERTED_DEFAULT_COLOR} { color: ${color.opaque(this._colors.background).css}; }` +\n `${this._terminalSelector} .${BG_CLASS_PREFIX}${INVERTED_DEFAULT_COLOR} { background-color: ${this._colors.foreground.css}; }`;\n\n this._themeStyleElement.innerHTML = styles;\n }\n\n public onDevicePixelRatioChange(): void {\n this._updateDimensions();\n }\n\n private _refreshRowElements(cols: number, rows: number): void {\n // Add missing elements\n for (let i = this._rowElements.length; i <= rows; i++) {\n const row = document.createElement('div');\n this._rowContainer.appendChild(row);\n this._rowElements.push(row);\n }\n // Remove excess elements\n while (this._rowElements.length > rows) {\n this._rowContainer.removeChild(this._rowElements.pop()!);\n }\n }\n\n public onResize(cols: number, rows: number): void {\n this._refreshRowElements(cols, rows);\n this._updateDimensions();\n }\n\n public onCharSizeChanged(): void {\n this._updateDimensions();\n }\n\n public onBlur(): void {\n this._rowContainer.classList.remove(FOCUS_CLASS);\n }\n\n public onFocus(): void {\n this._rowContainer.classList.add(FOCUS_CLASS);\n }\n\n public onSelectionChanged(start: [number, number] | undefined, end: [number, number] | undefined, columnSelectMode: boolean): void {\n // Remove all selections\n while (this._selectionContainer.children.length) {\n this._selectionContainer.removeChild(this._selectionContainer.children[0]);\n }\n\n // Selection does not exist\n if (!start || !end) {\n return;\n }\n\n // Translate from buffer position to viewport position\n const viewportStartRow = start[1] - this._bufferService.buffer.ydisp;\n const viewportEndRow = end[1] - this._bufferService.buffer.ydisp;\n const viewportCappedStartRow = Math.max(viewportStartRow, 0);\n const viewportCappedEndRow = Math.min(viewportEndRow, this._bufferService.rows - 1);\n\n // No need to draw the selection\n if (viewportCappedStartRow >= this._bufferService.rows || viewportCappedEndRow < 0) {\n return;\n }\n\n // Create the selections\n const documentFragment = document.createDocumentFragment();\n\n if (columnSelectMode) {\n documentFragment.appendChild(\n this._createSelectionElement(viewportCappedStartRow, start[0], end[0], viewportCappedEndRow - viewportCappedStartRow + 1)\n );\n } else {\n // Draw first row\n const startCol = viewportStartRow === viewportCappedStartRow ? start[0] : 0;\n const endCol = viewportCappedStartRow === viewportCappedEndRow ? end[0] : this._bufferService.cols;\n documentFragment.appendChild(this._createSelectionElement(viewportCappedStartRow, startCol, endCol));\n // Draw middle rows\n const middleRowsCount = viewportCappedEndRow - viewportCappedStartRow - 1;\n documentFragment.appendChild(this._createSelectionElement(viewportCappedStartRow + 1, 0, this._bufferService.cols, middleRowsCount));\n // Draw final row\n if (viewportCappedStartRow !== viewportCappedEndRow) {\n // Only draw viewportEndRow if it's not the same as viewporttartRow\n const endCol = viewportEndRow === viewportCappedEndRow ? end[0] : this._bufferService.cols;\n documentFragment.appendChild(this._createSelectionElement(viewportCappedEndRow, 0, endCol));\n }\n }\n this._selectionContainer.appendChild(documentFragment);\n }\n\n /**\n * Creates a selection element at the specified position.\n * @param row The row of the selection.\n * @param colStart The start column.\n * @param colEnd The end columns.\n */\n private _createSelectionElement(row: number, colStart: number, colEnd: number, rowCount: number = 1): HTMLElement {\n const element = document.createElement('div');\n element.style.height = `${rowCount * this.dimensions.actualCellHeight}px`;\n element.style.top = `${row * this.dimensions.actualCellHeight}px`;\n element.style.left = `${colStart * this.dimensions.actualCellWidth}px`;\n element.style.width = `${this.dimensions.actualCellWidth * (colEnd - colStart)}px`;\n return element;\n }\n\n public onCursorMove(): void {\n // No-op, the cursor is drawn when rows are drawn\n }\n\n public onOptionsChanged(): void {\n // Force a refresh\n this._updateDimensions();\n this._injectCss();\n }\n\n public clear(): void {\n for (const e of this._rowElements) {\n e.innerHTML = '';\n }\n }\n\n public renderRows(start: number, end: number): void {\n const cursorAbsoluteY = this._bufferService.buffer.ybase + this._bufferService.buffer.y;\n const cursorX = Math.min(this._bufferService.buffer.x, this._bufferService.cols - 1);\n const cursorBlink = this._optionsService.options.cursorBlink;\n\n for (let y = start; y <= end; y++) {\n const rowElement = this._rowElements[y];\n rowElement.innerHTML = '';\n\n const row = y + this._bufferService.buffer.ydisp;\n const lineData = this._bufferService.buffer.lines.get(row);\n const cursorStyle = this._optionsService.options.cursorStyle;\n rowElement.appendChild(this._rowFactory.createRow(lineData!, row === cursorAbsoluteY, cursorStyle, cursorX, cursorBlink, this.dimensions.actualCellWidth, this._bufferService.cols));\n }\n }\n\n private get _terminalSelector(): string {\n return `.${TERMINAL_CLASS_PREFIX}${this._terminalClass}`;\n }\n\n public registerCharacterJoiner(handler: CharacterJoinerHandler): number { return -1; }\n public deregisterCharacterJoiner(joinerId: number): boolean { return false; }\n\n private _onLinkHover(e: ILinkifierEvent): void {\n this._setCellUnderline(e.x1, e.x2, e.y1, e.y2, e.cols, true);\n }\n\n private _onLinkLeave(e: ILinkifierEvent): void {\n this._setCellUnderline(e.x1, e.x2, e.y1, e.y2, e.cols, false);\n }\n\n private _setCellUnderline(x: number, x2: number, y: number, y2: number, cols: number, enabled: boolean): void {\n while (x !== x2 || y !== y2) {\n const row = this._rowElements[y];\n if (!row) {\n return;\n }\n const span = <HTMLElement>row.children[x];\n if (span) {\n span.style.textDecoration = enabled ? 'underline' : 'none';\n }\n if (++x >= cols) {\n x = 0;\n y++;\n }\n }\n }\n}\n","/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IBufferLine } from 'common/Types';\nimport { INVERTED_DEFAULT_COLOR } from 'browser/renderer/atlas/Constants';\nimport { NULL_CELL_CODE, WHITESPACE_CELL_CHAR, Attributes } from 'common/buffer/Constants';\nimport { CellData } from 'common/buffer/CellData';\nimport { IOptionsService } from 'common/services/Services';\nimport { color, rgba } from 'browser/Color';\nimport { IColorSet, IColor } from 'browser/Types';\n\nexport const BOLD_CLASS = 'xterm-bold';\nexport const DIM_CLASS = 'xterm-dim';\nexport const ITALIC_CLASS = 'xterm-italic';\nexport const UNDERLINE_CLASS = 'xterm-underline';\nexport const CURSOR_CLASS = 'xterm-cursor';\nexport const CURSOR_BLINK_CLASS = 'xterm-cursor-blink';\nexport const CURSOR_STYLE_BLOCK_CLASS = 'xterm-cursor-block';\nexport const CURSOR_STYLE_BAR_CLASS = 'xterm-cursor-bar';\nexport const CURSOR_STYLE_UNDERLINE_CLASS = 'xterm-cursor-underline';\n\nexport class DomRendererRowFactory {\n private _workCell: CellData = new CellData();\n\n constructor(\n private readonly _document: Document,\n private readonly _optionsService: IOptionsService,\n private _colors: IColorSet\n ) {\n }\n\n public setColors(colors: IColorSet): void {\n this._colors = colors;\n }\n\n public createRow(lineData: IBufferLine, isCursorRow: boolean, cursorStyle: string | undefined, cursorX: number, cursorBlink: boolean, cellWidth: number, cols: number): DocumentFragment {\n const fragment = this._document.createDocumentFragment();\n\n // Find the line length first, this prevents the need to output a bunch of\n // empty cells at the end. This cannot easily be integrated into the main\n // loop below because of the colCount feature (which can be removed after we\n // properly support reflow and disallow data to go beyond the right-side of\n // the viewport).\n let lineLength = 0;\n for (let x = Math.min(lineData.length, cols) - 1; x >= 0; x--) {\n if (lineData.loadCell(x, this._workCell).getCode() !== NULL_CELL_CODE || (isCursorRow && x === cursorX)) {\n lineLength = x + 1;\n break;\n }\n }\n\n for (let x = 0; x < lineLength; x++) {\n lineData.loadCell(x, this._workCell);\n const width = this._workCell.getWidth();\n\n // The character to the left is a wide character, drawing is owned by the char at x-1\n if (width === 0) {\n continue;\n }\n\n const charElement = this._document.createElement('span');\n if (width > 1) {\n charElement.style.width = `${cellWidth * width}px`;\n }\n\n if (isCursorRow && x === cursorX) {\n charElement.classList.add(CURSOR_CLASS);\n\n if (cursorBlink) {\n charElement.classList.add(CURSOR_BLINK_CLASS);\n }\n\n switch (cursorStyle) {\n case 'bar':\n charElement.classList.add(CURSOR_STYLE_BAR_CLASS);\n break;\n case 'underline':\n charElement.classList.add(CURSOR_STYLE_UNDERLINE_CLASS);\n break;\n default:\n charElement.classList.add(CURSOR_STYLE_BLOCK_CLASS);\n break;\n }\n }\n\n if (this._workCell.isBold()) {\n charElement.classList.add(BOLD_CLASS);\n }\n\n if (this._workCell.isItalic()) {\n charElement.classList.add(ITALIC_CLASS);\n }\n\n if (this._workCell.isDim()) {\n charElement.classList.add(DIM_CLASS);\n }\n\n if (this._workCell.isUnderline()) {\n charElement.classList.add(UNDERLINE_CLASS);\n }\n\n if (this._workCell.isInvisible()) {\n charElement.textContent = WHITESPACE_CELL_CHAR;\n } else {\n charElement.textContent = this._workCell.getChars() || WHITESPACE_CELL_CHAR;\n }\n\n let fg = this._workCell.getFgColor();\n let fgColorMode = this._workCell.getFgColorMode();\n let bg = this._workCell.getBgColor();\n let bgColorMode = this._workCell.getBgColorMode();\n const isInverse = !!this._workCell.isInverse();\n if (isInverse) {\n const temp = fg;\n fg = bg;\n bg = temp;\n const temp2 = fgColorMode;\n fgColorMode = bgColorMode;\n bgColorMode = temp2;\n }\n\n // Foreground\n switch (fgColorMode) {\n case Attributes.CM_P16:\n case Attributes.CM_P256:\n if (this._workCell.isBold() && fg < 8 && this._optionsService.options.drawBoldTextInBrightColors) {\n fg += 8;\n }\n if (!this._applyMinimumContrast(charElement, this._colors.background, this._colors.ansi[fg])) {\n charElement.classList.add(`xterm-fg-${fg}`);\n }\n break;\n case Attributes.CM_RGB:\n const color = rgba.toColor(\n (fg >> 16) & 0xFF,\n (fg >> 8) & 0xFF,\n (fg ) & 0xFF\n );\n if (!this._applyMinimumContrast(charElement, this._colors.background, color)) {\n this._addStyle(charElement, `color:#${padStart(fg.toString(16), '0', 6)}`);\n }\n break;\n case Attributes.CM_DEFAULT:\n default:\n if (!this._applyMinimumContrast(charElement, this._colors.background, this._colors.foreground)) {\n if (isInverse) {\n charElement.classList.add(`xterm-fg-${INVERTED_DEFAULT_COLOR}`);\n }\n }\n }\n\n // Background\n switch (bgColorMode) {\n case Attributes.CM_P16:\n case Attributes.CM_P256:\n charElement.classList.add(`xterm-bg-${bg}`);\n break;\n case Attributes.CM_RGB:\n this._addStyle(charElement, `background-color:#${padStart(bg.toString(16), '0', 6)}`);\n break;\n case Attributes.CM_DEFAULT:\n default:\n if (isInverse) {\n charElement.classList.add(`xterm-bg-${INVERTED_DEFAULT_COLOR}`);\n }\n }\n\n fragment.appendChild(charElement);\n }\n return fragment;\n }\n\n private _applyMinimumContrast(element: HTMLElement, bg: IColor, fg: IColor): boolean {\n if (this._optionsService.options.minimumContrastRatio === 1) {\n return false;\n }\n\n // Try get from cache first\n let adjustedColor = this._colors.contrastCache.getColor(this._workCell.bg, this._workCell.fg);\n\n // Calculate and store in cache\n if (adjustedColor === undefined) {\n adjustedColor = color.ensureContrastRatio(bg, fg, this._optionsService.options.minimumContrastRatio);\n this._colors.contrastCache.setColor(this._workCell.bg, this._workCell.fg, adjustedColor ?? null);\n }\n\n if (adjustedColor) {\n this._addStyle(element, `color:${adjustedColor.css}`);\n return true;\n }\n\n return false;\n }\n\n private _addStyle(element: HTMLElement, style: string): void {\n element.setAttribute('style', `${element.getAttribute('style') || ''}${style};`);\n }\n}\n\nfunction padStart(text: string, padChar: string, length: number): string {\n while (text.length < length) {\n text = padChar + text;\n }\n return text;\n}\n","/**\n * Copyright (c) 2014 The xterm.js authors. All rights reserved.\n * Copyright (c) 2012-2013, Christopher Jeffrey (MIT License)\n * @license MIT\n */\n\nimport { IKeyboardEvent, IKeyboardResult, KeyboardResultType } from 'common/Types';\nimport { C0 } from 'common/data/EscapeSequences';\n\n// reg + shift key mappings for digits and special chars\nconst KEYCODE_KEY_MAPPINGS: { [key: number]: [string, string]} = {\n // digits 0-9\n 48: ['0', ')'],\n 49: ['1', '!'],\n 50: ['2', '@'],\n 51: ['3', '#'],\n 52: ['4', '$'],\n 53: ['5', '%'],\n 54: ['6', '^'],\n 55: ['7', '&'],\n 56: ['8', '*'],\n 57: ['9', '('],\n\n // special chars\n 186: [';', ':'],\n 187: ['=', '+'],\n 188: [',', '<'],\n 189: ['-', '_'],\n 190: ['.', '>'],\n 191: ['/', '?'],\n 192: ['`', '~'],\n 219: ['[', '{'],\n 220: ['\\\\', '|'],\n 221: [']', '}'],\n 222: ['\\'', '\"']\n};\n\nexport function evaluateKeyboardEvent(\n ev: IKeyboardEvent,\n applicationCursorMode: boolean,\n isMac: boolean,\n macOptionIsMeta: boolean\n): IKeyboardResult {\n const result: IKeyboardResult = {\n type: KeyboardResultType.SEND_KEY,\n // Whether to cancel event propagation (NOTE: this may not be needed since the event is\n // canceled at the end of keyDown\n cancel: false,\n // The new key even to emit\n key: undefined\n };\n const modifiers = (ev.shiftKey ? 1 : 0) | (ev.altKey ? 2 : 0) | (ev.ctrlKey ? 4 : 0) | (ev.metaKey ? 8 : 0);\n switch (ev.keyCode) {\n case 0:\n if (ev.key === 'UIKeyInputUpArrow') {\n if (applicationCursorMode) {\n result.key = C0.ESC + 'OA';\n } else {\n result.key = C0.ESC + '[A';\n }\n }\n else if (ev.key === 'UIKeyInputLeftArrow') {\n if (applicationCursorMode) {\n result.key = C0.ESC + 'OD';\n } else {\n result.key = C0.ESC + '[D';\n }\n }\n else if (ev.key === 'UIKeyInputRightArrow') {\n if (applicationCursorMode) {\n result.key = C0.ESC + 'OC';\n } else {\n result.key = C0.ESC + '[C';\n }\n }\n else if (ev.key === 'UIKeyInputDownArrow') {\n if (applicationCursorMode) {\n result.key = C0.ESC + 'OB';\n } else {\n result.key = C0.ESC + '[B';\n }\n }\n break;\n case 8:\n // backspace\n if (ev.shiftKey) {\n result.key = C0.BS; // ^H\n break;\n } else if (ev.altKey) {\n result.key = C0.ESC + C0.DEL; // \\e ^?\n break;\n }\n result.key = C0.DEL; // ^?\n break;\n case 9:\n // tab\n if (ev.shiftKey) {\n result.key = C0.ESC + '[Z';\n break;\n }\n result.key = C0.HT;\n result.cancel = true;\n break;\n case 13:\n // return/enter\n result.key = ev.altKey ? C0.ESC + C0.CR : C0.CR;\n result.cancel = true;\n break;\n case 27:\n // escape\n result.key = C0.ESC;\n if (ev.altKey) {\n result.key = C0.ESC + C0.ESC;\n }\n result.cancel = true;\n break;\n case 37:\n // left-arrow\n if (ev.metaKey) {\n break;\n }\n if (modifiers) {\n result.key = C0.ESC + '[1;' + (modifiers + 1) + 'D';\n // HACK: Make Alt + left-arrow behave like Ctrl + left-arrow: move one word backwards\n // http://unix.stackexchange.com/a/108106\n // macOS uses different escape sequences than linux\n if (result.key === C0.ESC + '[1;3D') {\n result.key = C0.ESC + (isMac ? 'b' : '[1;5D');\n }\n } else if (applicationCursorMode) {\n result.key = C0.ESC + 'OD';\n } else {\n result.key = C0.ESC + '[D';\n }\n break;\n case 39:\n // right-arrow\n if (ev.metaKey) {\n break;\n }\n if (modifiers) {\n result.key = C0.ESC + '[1;' + (modifiers + 1) + 'C';\n // HACK: Make Alt + right-arrow behave like Ctrl + right-arrow: move one word forward\n // http://unix.stackexchange.com/a/108106\n // macOS uses different escape sequences than linux\n if (result.key === C0.ESC + '[1;3C') {\n result.key = C0.ESC + (isMac ? 'f' : '[1;5C');\n }\n } else if (applicationCursorMode) {\n result.key = C0.ESC + 'OC';\n } else {\n result.key = C0.ESC + '[C';\n }\n break;\n case 38:\n // up-arrow\n if (ev.metaKey) {\n break;\n }\n if (modifiers) {\n result.key = C0.ESC + '[1;' + (modifiers + 1) + 'A';\n // HACK: Make Alt + up-arrow behave like Ctrl + up-arrow\n // http://unix.stackexchange.com/a/108106\n // macOS uses different escape sequences than linux\n if (!isMac && result.key === C0.ESC + '[1;3A') {\n result.key = C0.ESC + '[1;5A';\n }\n } else if (applicationCursorMode) {\n result.key = C0.ESC + 'OA';\n } else {\n result.key = C0.ESC + '[A';\n }\n break;\n case 40:\n // down-arrow\n if (ev.metaKey) {\n break;\n }\n if (modifiers) {\n result.key = C0.ESC + '[1;' + (modifiers + 1) + 'B';\n // HACK: Make Alt + down-arrow behave like Ctrl + down-arrow\n // http://unix.stackexchange.com/a/108106\n // macOS uses different escape sequences than linux\n if (!isMac && result.key === C0.ESC + '[1;3B') {\n result.key = C0.ESC + '[1;5B';\n }\n } else if (applicationCursorMode) {\n result.key = C0.ESC + 'OB';\n } else {\n result.key = C0.ESC + '[B';\n }\n break;\n case 45:\n // insert\n if (!ev.shiftKey && !ev.ctrlKey) {\n // <Ctrl> or <Shift> + <Insert> are used to\n // copy-paste on some systems.\n result.key = C0.ESC + '[2~';\n }\n break;\n case 46:\n // delete\n if (modifiers) {\n result.key = C0.ESC + '[3;' + (modifiers + 1) + '~';\n } else {\n result.key = C0.ESC + '[3~';\n }\n break;\n case 36:\n // home\n if (modifiers) {\n result.key = C0.ESC + '[1;' + (modifiers + 1) + 'H';\n } else if (applicationCursorMode) {\n result.key = C0.ESC + 'OH';\n } else {\n result.key = C0.ESC + '[H';\n }\n break;\n case 35:\n // end\n if (modifiers) {\n result.key = C0.ESC + '[1;' + (modifiers + 1) + 'F';\n } else if (applicationCursorMode) {\n result.key = C0.ESC + 'OF';\n } else {\n result.key = C0.ESC + '[F';\n }\n break;\n case 33:\n // page up\n if (ev.shiftKey) {\n result.type = KeyboardResultType.PAGE_UP;\n } else {\n result.key = C0.ESC + '[5~';\n }\n break;\n case 34:\n // page down\n if (ev.shiftKey) {\n result.type = KeyboardResultType.PAGE_DOWN;\n } else {\n result.key = C0.ESC + '[6~';\n }\n break;\n case 112:\n // F1-F12\n if (modifiers) {\n result.key = C0.ESC + '[1;' + (modifiers + 1) + 'P';\n } else {\n result.key = C0.ESC + 'OP';\n }\n break;\n case 113:\n if (modifiers) {\n result.key = C0.ESC + '[1;' + (modifiers + 1) + 'Q';\n } else {\n result.key = C0.ESC + 'OQ';\n }\n break;\n case 114:\n if (modifiers) {\n result.key = C0.ESC + '[1;' + (modifiers + 1) + 'R';\n } else {\n result.key = C0.ESC + 'OR';\n }\n break;\n case 115:\n if (modifiers) {\n result.key = C0.ESC + '[1;' + (modifiers + 1) + 'S';\n } else {\n result.key = C0.ESC + 'OS';\n }\n break;\n case 116:\n if (modifiers) {\n result.key = C0.ESC + '[15;' + (modifiers + 1) + '~';\n } else {\n result.key = C0.ESC + '[15~';\n }\n break;\n case 117:\n if (modifiers) {\n result.key = C0.ESC + '[17;' + (modifiers + 1) + '~';\n } else {\n result.key = C0.ESC + '[17~';\n }\n break;\n case 118:\n if (modifiers) {\n result.key = C0.ESC + '[18;' + (modifiers + 1) + '~';\n } else {\n result.key = C0.ESC + '[18~';\n }\n break;\n case 119:\n if (modifiers) {\n result.key = C0.ESC + '[19;' + (modifiers + 1) + '~';\n } else {\n result.key = C0.ESC + '[19~';\n }\n break;\n case 120:\n if (modifiers) {\n result.key = C0.ESC + '[20;' + (modifiers + 1) + '~';\n } else {\n result.key = C0.ESC + '[20~';\n }\n break;\n case 121:\n if (modifiers) {\n result.key = C0.ESC + '[21;' + (modifiers + 1) + '~';\n } else {\n result.key = C0.ESC + '[21~';\n }\n break;\n case 122:\n if (modifiers) {\n result.key = C0.ESC + '[23;' + (modifiers + 1) + '~';\n } else {\n result.key = C0.ESC + '[23~';\n }\n break;\n case 123:\n if (modifiers) {\n result.key = C0.ESC + '[24;' + (modifiers + 1) + '~';\n } else {\n result.key = C0.ESC + '[24~';\n }\n break;\n default:\n // a-z and space\n if (ev.ctrlKey && !ev.shiftKey && !ev.altKey && !ev.metaKey) {\n if (ev.keyCode >= 65 && ev.keyCode <= 90) {\n result.key = String.fromCharCode(ev.keyCode - 64);\n } else if (ev.keyCode === 32) {\n result.key = C0.NUL;\n } else if (ev.keyCode >= 51 && ev.keyCode <= 55) {\n // escape, file sep, group sep, record sep, unit sep\n result.key = String.fromCharCode(ev.keyCode - 51 + 27);\n } else if (ev.keyCode === 56) {\n result.key = C0.DEL;\n } else if (ev.keyCode === 219) {\n result.key = C0.ESC;\n } else if (ev.keyCode === 220) {\n result.key = C0.FS;\n } else if (ev.keyCode === 221) {\n result.key = C0.GS;\n }\n } else if ((!isMac || macOptionIsMeta) && ev.altKey && !ev.metaKey) {\n // On macOS this is a third level shift when !macOptionIsMeta. Use <Esc> instead.\n const keyMapping = KEYCODE_KEY_MAPPINGS[ev.keyCode];\n const key = keyMapping && keyMapping[!ev.shiftKey ? 0 : 1];\n if (key) {\n result.key = C0.ESC + key;\n } else if (ev.keyCode >= 65 && ev.keyCode <= 90) {\n const keyCode = ev.ctrlKey ? ev.keyCode - 64 : ev.keyCode + 32;\n result.key = C0.ESC + String.fromCharCode(keyCode);\n }\n } else if (isMac && !ev.altKey && !ev.ctrlKey && ev.metaKey) {\n if (ev.keyCode === 65) { // cmd + a\n result.type = KeyboardResultType.SELECT_ALL;\n }\n } else if (ev.key && !ev.ctrlKey && !ev.altKey && !ev.metaKey && ev.keyCode >= 48 && ev.key.length === 1) {\n // Include only keys that that result in a _single_ character; don't include num lock, volume up, etc.\n result.key = ev.key;\n } else if (ev.key && ev.ctrlKey) {\n if (ev.key === '_') { // ^_\n result.key = C0.US;\n }\n }\n break;\n }\n\n return result;\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IRenderer, IRenderDimensions, CharacterJoinerHandler } from 'browser/renderer/Types';\nimport { RenderDebouncer } from 'browser/RenderDebouncer';\nimport { EventEmitter, IEvent } from 'common/EventEmitter';\nimport { Disposable } from 'common/Lifecycle';\nimport { ScreenDprMonitor } from 'browser/ScreenDprMonitor';\nimport { addDisposableDomListener } from 'browser/Lifecycle';\nimport { IColorSet } from 'browser/Types';\nimport { IOptionsService, IBufferService } from 'common/services/Services';\nimport { ICharSizeService, IRenderService } from 'browser/services/Services';\n\ninterface ISelectionState {\n start: [number, number] | undefined;\n end: [number, number] | undefined;\n columnSelectMode: boolean;\n}\n\nexport class RenderService extends Disposable implements IRenderService {\n public serviceBrand: undefined;\n\n private _renderDebouncer: RenderDebouncer;\n private _screenDprMonitor: ScreenDprMonitor;\n\n private _isPaused: boolean = false;\n private _needsFullRefresh: boolean = false;\n private _isNextRenderRedrawOnly: boolean = true;\n private _needsSelectionRefresh: boolean = false;\n private _canvasWidth: number = 0;\n private _canvasHeight: number = 0;\n private _selectionState: ISelectionState = {\n start: undefined,\n end: undefined,\n columnSelectMode: false\n };\n\n private _onDimensionsChange = new EventEmitter<IRenderDimensions>();\n public get onDimensionsChange(): IEvent<IRenderDimensions> { return this._onDimensionsChange.event; }\n private _onRender = new EventEmitter<{ start: number, end: number }>();\n public get onRenderedBufferChange(): IEvent<{ start: number, end: number }> { return this._onRender.event; }\n private _onRefreshRequest = new EventEmitter<{ start: number, end: number }>();\n public get onRefreshRequest(): IEvent<{ start: number, end: number }> { return this._onRefreshRequest.event; }\n\n public get dimensions(): IRenderDimensions { return this._renderer.dimensions; }\n\n constructor(\n private _renderer: IRenderer,\n private _rowCount: number,\n screenElement: HTMLElement,\n @IOptionsService optionsService: IOptionsService,\n @ICharSizeService charSizeService: ICharSizeService,\n @IBufferService bufferService: IBufferService\n ) {\n super();\n\n this.register({ dispose: () => this._renderer.dispose() });\n\n this._renderDebouncer = new RenderDebouncer((start, end) => this._renderRows(start, end));\n this.register(this._renderDebouncer);\n\n this._screenDprMonitor = new ScreenDprMonitor();\n this._screenDprMonitor.setListener(() => this.onDevicePixelRatioChange());\n this.register(this._screenDprMonitor);\n\n this.register(bufferService.onResize(e => this._fullRefresh()));\n this.register(optionsService.onOptionChange(() => this._renderer.onOptionsChanged()));\n this.register(charSizeService.onCharSizeChange(() => this.onCharSizeChanged()));\n\n // No need to register this as renderer is explicitly disposed in RenderService.dispose\n this._renderer.onRequestRedraw(e => this.refreshRows(e.start, e.end, true));\n\n // dprchange should handle this case, we need this as well for browsers that don't support the\n // matchMedia query.\n this.register(addDisposableDomListener(window, 'resize', () => this.onDevicePixelRatioChange()));\n\n // Detect whether IntersectionObserver is detected and enable renderer pause\n // and resume based on terminal visibility if so\n if ('IntersectionObserver' in window) {\n const observer = new IntersectionObserver(e => this._onIntersectionChange(e[e.length - 1]), { threshold: 0 });\n observer.observe(screenElement);\n this.register({ dispose: () => observer.disconnect() });\n }\n }\n\n private _onIntersectionChange(entry: IntersectionObserverEntry): void {\n this._isPaused = entry.intersectionRatio === 0;\n if (!this._isPaused && this._needsFullRefresh) {\n this.refreshRows(0, this._rowCount - 1);\n this._needsFullRefresh = false;\n }\n }\n\n public refreshRows(start: number, end: number, isRedrawOnly: boolean = false): void {\n if (this._isPaused) {\n this._needsFullRefresh = true;\n return;\n }\n if (!isRedrawOnly) {\n this._isNextRenderRedrawOnly = false;\n }\n this._renderDebouncer.refresh(start, end, this._rowCount);\n }\n\n private _renderRows(start: number, end: number): void {\n this._renderer.renderRows(start, end);\n\n // Update selection if needed\n if (this._needsSelectionRefresh) {\n this._renderer.onSelectionChanged(this._selectionState.start, this._selectionState.end, this._selectionState.columnSelectMode);\n this._needsSelectionRefresh = false;\n }\n\n // Fire render event only if it was not a redraw\n if (!this._isNextRenderRedrawOnly) {\n this._onRender.fire({ start, end });\n }\n this._isNextRenderRedrawOnly = true;\n }\n\n public resize(cols: number, rows: number): void {\n this._rowCount = rows;\n this._fireOnCanvasResize();\n }\n\n public changeOptions(): void {\n this._renderer.onOptionsChanged();\n this.refreshRows(0, this._rowCount - 1);\n this._fireOnCanvasResize();\n }\n\n private _fireOnCanvasResize(): void {\n // Don't fire the event if the dimensions haven't changed\n if (this._renderer.dimensions.canvasWidth === this._canvasWidth && this._renderer.dimensions.canvasHeight === this._canvasHeight) {\n return;\n }\n this._onDimensionsChange.fire(this._renderer.dimensions);\n }\n\n public dispose(): void {\n super.dispose();\n }\n\n public setRenderer(renderer: IRenderer): void {\n // TODO: RenderService should be the only one to dispose the renderer\n this._renderer.dispose();\n this._renderer = renderer;\n this._renderer.onRequestRedraw(e => this.refreshRows(e.start, e.end, true));\n\n // Force a refresh\n this._needsSelectionRefresh = true;\n this._fullRefresh();\n }\n\n private _fullRefresh(): void {\n if (this._isPaused) {\n this._needsFullRefresh = true;\n } else {\n this.refreshRows(0, this._rowCount - 1);\n }\n }\n\n public setColors(colors: IColorSet): void {\n this._renderer.setColors(colors);\n this._fullRefresh();\n }\n\n public onDevicePixelRatioChange(): void {\n this._renderer.onDevicePixelRatioChange();\n this.refreshRows(0, this._rowCount - 1);\n }\n\n public onResize(cols: number, rows: number): void {\n this._renderer.onResize(cols, rows);\n this._fullRefresh();\n }\n\n // TODO: Is this useful when we have onResize?\n public onCharSizeChanged(): void {\n this._renderer.onCharSizeChanged();\n }\n\n public onBlur(): void {\n this._renderer.onBlur();\n }\n\n public onFocus(): void {\n this._renderer.onFocus();\n }\n\n public onSelectionChanged(start: [number, number] | undefined, end: [number, number] | undefined, columnSelectMode: boolean): void {\n this._selectionState.start = start;\n this._selectionState.end = end;\n this._selectionState.columnSelectMode = columnSelectMode;\n this._renderer.onSelectionChanged(start, end, columnSelectMode);\n }\n\n public onCursorMove(): void {\n this._renderer.onCursorMove();\n }\n\n public clear(): void {\n this._renderer.clear();\n }\n\n public registerCharacterJoiner(handler: CharacterJoinerHandler): number {\n return this._renderer.registerCharacterJoiner(handler);\n }\n\n public deregisterCharacterJoiner(joinerId: number): boolean {\n return this._renderer.deregisterCharacterJoiner(joinerId);\n }\n}\n","/**\n * Copyright (c) 2016 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IOptionsService } from 'common/services/Services';\nimport { IEvent, EventEmitter } from 'common/EventEmitter';\nimport { ICharSizeService } from 'browser/services/Services';\n\nexport class CharSizeService implements ICharSizeService {\n public serviceBrand: undefined;\n\n public width: number = 0;\n public height: number = 0;\n private _measureStrategy: IMeasureStrategy;\n\n public get hasValidSize(): boolean { return this.width > 0 && this.height > 0; }\n\n private _onCharSizeChange = new EventEmitter<void>();\n public get onCharSizeChange(): IEvent<void> { return this._onCharSizeChange.event; }\n\n constructor(\n document: Document,\n parentElement: HTMLElement,\n @IOptionsService private readonly _optionsService: IOptionsService\n ) {\n this._measureStrategy = new DomMeasureStrategy(document, parentElement, this._optionsService);\n }\n\n public measure(): void {\n const result = this._measureStrategy.measure();\n if (result.width !== this.width || result.height !== this.height) {\n this.width = result.width;\n this.height = result.height;\n this._onCharSizeChange.fire();\n }\n }\n}\n\ninterface IMeasureStrategy {\n measure(): IReadonlyMeasureResult;\n}\n\ninterface IReadonlyMeasureResult {\n readonly width: number;\n readonly height: number;\n}\n\ninterface IMeasureResult {\n width: number;\n height: number;\n}\n\n// TODO: For supporting browsers we should also provide a CanvasCharDimensionsProvider that uses ctx.measureText\nclass DomMeasureStrategy implements IMeasureStrategy {\n private _result: IMeasureResult = { width: 0, height: 0 };\n private _measureElement: HTMLElement;\n\n constructor(\n private _document: Document,\n private _parentElement: HTMLElement,\n private _optionsService: IOptionsService\n ) {\n this._measureElement = this._document.createElement('span');\n this._measureElement.classList.add('xterm-char-measure-element');\n this._measureElement.textContent = 'W';\n this._measureElement.setAttribute('aria-hidden', 'true');\n this._parentElement.appendChild(this._measureElement);\n }\n\n public measure(): IReadonlyMeasureResult {\n this._measureElement.style.fontFamily = this._optionsService.options.fontFamily;\n this._measureElement.style.fontSize = `${this._optionsService.options.fontSize}px`;\n\n // Note that this triggers a synchronous layout\n const geometry = this._measureElement.getBoundingClientRect();\n\n // If values are 0 then the element is likely currently display:none, in which case we should\n // retain the previous value.\n if (geometry.width !== 0 && geometry.height !== 0) {\n this._result.width = geometry.width;\n this._result.height = Math.ceil(geometry.height);\n }\n\n return this._result;\n }\n}\n","/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { ICharSizeService, IRenderService, IMouseService } from './Services';\nimport { getCoords, getRawByteCoords } from 'browser/input/Mouse';\n\nexport class MouseService implements IMouseService {\n public serviceBrand: undefined;\n\n constructor(\n @IRenderService private readonly _renderService: IRenderService,\n @ICharSizeService private readonly _charSizeService: ICharSizeService\n ) {\n }\n\n public getCoords(event: {clientX: number, clientY: number}, element: HTMLElement, colCount: number, rowCount: number, isSelection?: boolean): [number, number] | undefined {\n return getCoords(\n event,\n element,\n colCount,\n rowCount,\n this._charSizeService.hasValidSize,\n this._renderService.dimensions.actualCellWidth,\n this._renderService.dimensions.actualCellHeight,\n isSelection\n );\n }\n\n public getRawByteCoords(event: MouseEvent, element: HTMLElement, colCount: number, rowCount: number): { x: number, y: number } | undefined {\n const coords = this.getCoords(event, element, colCount, rowCount);\n return getRawByteCoords(coords);\n }\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { ILinkifier2, ILinkProvider, IBufferCellPosition, ILink, ILinkifierEvent, ILinkDecorations } from 'browser/Types';\nimport { IDisposable } from 'common/Types';\nimport { IMouseService, IRenderService } from './services/Services';\nimport { IBufferService } from 'common/services/Services';\nimport { EventEmitter, IEvent } from 'common/EventEmitter';\nimport { Disposable, getDisposeArrayDisposable, disposeArray } from 'common/Lifecycle';\nimport { addDisposableDomListener } from 'browser/Lifecycle';\n\ninterface ILinkState {\n decorations: ILinkDecorations;\n isHovered: boolean;\n}\n\ninterface ILinkWithState {\n link: ILink;\n state?: ILinkState;\n}\n\nexport class Linkifier2 extends Disposable implements ILinkifier2 {\n private _element: HTMLElement | undefined;\n private _mouseService: IMouseService | undefined;\n private _renderService: IRenderService | undefined;\n private _linkProviders: ILinkProvider[] = [];\n protected _currentLink: ILinkWithState | undefined;\n private _lastMouseEvent: MouseEvent | undefined;\n private _linkCacheDisposables: IDisposable[] = [];\n private _lastBufferCell: IBufferCellPosition | undefined;\n private _isMouseOut: boolean = true;\n private _activeProviderReplies: Map<Number, ILinkWithState[] | undefined> | undefined;\n private _activeLine: number = -1;\n\n private _onShowLinkUnderline = this.register(new EventEmitter<ILinkifierEvent>());\n public get onShowLinkUnderline(): IEvent<ILinkifierEvent> { return this._onShowLinkUnderline.event; }\n private _onHideLinkUnderline = this.register(new EventEmitter<ILinkifierEvent>());\n public get onHideLinkUnderline(): IEvent<ILinkifierEvent> { return this._onHideLinkUnderline.event; }\n\n constructor(\n @IBufferService private readonly _bufferService: IBufferService\n ) {\n super();\n this.register(getDisposeArrayDisposable(this._linkCacheDisposables));\n }\n\n public registerLinkProvider(linkProvider: ILinkProvider): IDisposable {\n this._linkProviders.push(linkProvider);\n return {\n dispose: () => {\n // Remove the link provider from the list\n const providerIndex = this._linkProviders.indexOf(linkProvider);\n\n if (providerIndex !== -1) {\n this._linkProviders.splice(providerIndex, 1);\n }\n }\n };\n }\n\n public attachToDom(element: HTMLElement, mouseService: IMouseService, renderService: IRenderService): void {\n this._element = element;\n this._mouseService = mouseService;\n this._renderService = renderService;\n\n this.register(addDisposableDomListener(this._element, 'mouseleave', () => {\n this._isMouseOut = true;\n this._clearCurrentLink();\n }));\n this.register(addDisposableDomListener(this._element, 'mousemove', this._onMouseMove.bind(this)));\n this.register(addDisposableDomListener(this._element, 'click', this._onClick.bind(this)));\n }\n\n private _onMouseMove(event: MouseEvent): void {\n this._lastMouseEvent = event;\n\n if (!this._element || !this._mouseService) {\n return;\n }\n\n const position = this._positionFromMouseEvent(event, this._element, this._mouseService);\n if (!position) {\n return;\n }\n this._isMouseOut = false;\n\n // Ignore the event if it's an embedder created hover widget\n const composedPath = event.composedPath() as HTMLElement[];\n for (let i = 0; i < composedPath.length; i++) {\n const target = composedPath[i];\n // Hit Terminal.element, break and continue\n if (target.classList.contains('xterm')) {\n break;\n }\n // It's a hover, don't respect hover event\n if (target.classList.contains('xterm-hover')) {\n return;\n }\n }\n\n if (!this._lastBufferCell || (position.x !== this._lastBufferCell.x || position.y !== this._lastBufferCell.y)) {\n this._onHover(position);\n this._lastBufferCell = position;\n }\n }\n\n private _onHover(position: IBufferCellPosition): void {\n // TODO: This currently does not cache link provider results across wrapped lines, activeLine should be something like `activeRange: {startY, endY}`\n // Check if we need to clear the link\n if (this._activeLine !== position.y) {\n this._clearCurrentLink();\n this._askForLink(position, false);\n return;\n }\n\n // Check the if the link is in the mouse position\n const isCurrentLinkInPosition = this._currentLink && this._linkAtPosition(this._currentLink.link, position);\n if (!isCurrentLinkInPosition) {\n this._clearCurrentLink();\n this._askForLink(position, true);\n }\n }\n\n private _askForLink(position: IBufferCellPosition, useLineCache: boolean): void {\n if (!this._activeProviderReplies || !useLineCache) {\n this._activeProviderReplies = new Map();\n this._activeLine = position.y;\n }\n let linkProvided = false;\n\n // There is no link cached, so ask for one\n this._linkProviders.forEach((linkProvider, i) => {\n if (useLineCache) {\n const existingReply = this._activeProviderReplies?.get(i);\n // If there isn't a reply, the provider hasn't responded yet.\n\n // TODO: If there isn't a reply yet it means that the provider is still resolving. Ensuring\n // provideLinks isn't triggered again saves ILink.hover firing twice though. This probably\n // needs promises to get fixed\n if (existingReply) {\n linkProvided = this._checkLinkProviderResult(i, position, linkProvided);\n }\n } else {\n linkProvider.provideLinks(position.y, (links: ILink[] | undefined) => {\n if (this._isMouseOut) {\n return;\n }\n const linksWithState: ILinkWithState[] | undefined = links?.map(link => ({ link }));\n this._activeProviderReplies?.set(i, linksWithState);\n linkProvided = this._checkLinkProviderResult(i, position, linkProvided);\n\n // If all providers have responded, remove lower priority links that intersect ranges of\n // higher priority links\n if (this._activeProviderReplies?.size === this._linkProviders.length) {\n this._removeIntersectingLinks(position.y, this._activeProviderReplies);\n }\n });\n }\n });\n }\n\n private _removeIntersectingLinks(y: number, replies: Map<Number, ILinkWithState[] | undefined>): void {\n const occupiedCells = new Set<number>();\n for (let i = 0; i < replies.size; i++) {\n const providerReply = replies.get(i);\n if (!providerReply) {\n continue;\n }\n for (let i = 0; i < providerReply.length; i++) {\n const linkWithState = providerReply[i];\n const startX = linkWithState.link.range.start.y < y ? 0 : linkWithState.link.range.start.x;\n const endX = linkWithState.link.range.end.y > y ? this._bufferService.cols : linkWithState.link.range.end.x;\n for (let x = startX; x <= endX; x++) {\n if (occupiedCells.has(x)) {\n providerReply.splice(i--, 1);\n break;\n }\n occupiedCells.add(x);\n }\n }\n }\n }\n\n private _checkLinkProviderResult(index: number, position: IBufferCellPosition, linkProvided: boolean): boolean {\n if (!this._activeProviderReplies) {\n return linkProvided;\n }\n\n const links = this._activeProviderReplies.get(index);\n\n // Check if every provider before this one has come back undefined\n let hasLinkBefore = false;\n for (let j = 0; j < index; j++) {\n if (!this._activeProviderReplies.has(j) || this._activeProviderReplies.get(j)) {\n hasLinkBefore = true;\n }\n }\n\n // If all providers with higher priority came back undefined, then this provider's link for\n // the position should be used\n if (!hasLinkBefore && links) {\n const linkAtPosition = links.find(link => this._linkAtPosition(link.link, position));\n if (linkAtPosition) {\n linkProvided = true;\n this._handleNewLink(linkAtPosition);\n }\n }\n\n // Check if all the providers have responded\n if (this._activeProviderReplies.size === this._linkProviders.length && !linkProvided) {\n // Respect the order of the link providers\n for (let j = 0; j < this._activeProviderReplies.size; j++) {\n const currentLink = this._activeProviderReplies.get(j)?.find(link => this._linkAtPosition(link.link, position));\n if (currentLink) {\n linkProvided = true;\n this._handleNewLink(currentLink);\n break;\n }\n }\n }\n\n return linkProvided;\n }\n\n private _onClick(event: MouseEvent): void {\n if (!this._element || !this._mouseService || !this._currentLink) {\n return;\n }\n\n const position = this._positionFromMouseEvent(event, this._element, this._mouseService);\n\n if (!position) {\n return;\n }\n\n if (this._linkAtPosition(this._currentLink.link, position)) {\n this._currentLink.link.activate(event, this._currentLink.link.text);\n }\n }\n\n private _clearCurrentLink(startRow?: number, endRow?: number): void {\n if (!this._element || !this._currentLink || !this._lastMouseEvent) {\n return;\n }\n\n // If we have a start and end row, check that the link is within it\n if (!startRow || !endRow || (this._currentLink.link.range.start.y >= startRow && this._currentLink.link.range.end.y <= endRow)) {\n this._linkLeave(this._element, this._currentLink.link, this._lastMouseEvent);\n this._currentLink = undefined;\n disposeArray(this._linkCacheDisposables);\n }\n }\n\n private _handleNewLink(linkWithState: ILinkWithState): void {\n if (!this._element || !this._lastMouseEvent || !this._mouseService) {\n return;\n }\n\n const position = this._positionFromMouseEvent(this._lastMouseEvent, this._element, this._mouseService);\n\n if (!position) {\n return;\n }\n\n // Trigger hover if the we have a link at the position\n if (this._linkAtPosition(linkWithState.link, position)) {\n this._currentLink = linkWithState;\n this._currentLink.state = {\n decorations: {\n underline: linkWithState.link.decorations === undefined ? true : linkWithState.link.decorations.underline,\n pointerCursor: linkWithState.link.decorations === undefined ? true : linkWithState.link.decorations.pointerCursor\n },\n isHovered: true\n };\n this._linkHover(this._element, linkWithState.link, this._lastMouseEvent);\n\n // Add listener for tracking decorations changes\n linkWithState.link.decorations = {} as ILinkDecorations;\n Object.defineProperties(linkWithState.link.decorations, {\n pointerCursor: {\n get: () => this._currentLink?.state?.decorations.pointerCursor,\n set: v => {\n if (this._currentLink?.state && this._currentLink.state.decorations.pointerCursor !== v) {\n this._currentLink.state.decorations.pointerCursor = v;\n if (this._currentLink.state.isHovered) {\n this._element?.classList.toggle('xterm-cursor-pointer', v);\n }\n }\n }\n },\n underline: {\n get: () => this._currentLink?.state?.decorations.underline,\n set: v => {\n if (this._currentLink?.state && this._currentLink?.state?.decorations.underline !== v) {\n this._currentLink.state.decorations.underline = v;\n if (this._currentLink.state.isHovered) {\n this._fireUnderlineEvent(linkWithState.link, v);\n }\n }\n }\n }\n });\n\n // Add listener for rerendering\n if (this._renderService) {\n this._linkCacheDisposables.push(this._renderService.onRenderedBufferChange(e => {\n // When start is 0 a scroll most likely occurred, make sure links above the fold also get\n // cleared.\n const start = e.start === 0 ? 0 : e.start + 1 + this._bufferService.buffer.ydisp;\n this._clearCurrentLink(start, e.end + 1 + this._bufferService.buffer.ydisp);\n }));\n }\n }\n }\n\n protected _linkHover(element: HTMLElement, link: ILink, event: MouseEvent): void {\n if (this._currentLink?.state) {\n this._currentLink.state.isHovered = true;\n if (this._currentLink.state.decorations.underline) {\n this._fireUnderlineEvent(link, true);\n }\n if (this._currentLink.state.decorations.pointerCursor) {\n element.classList.add('xterm-cursor-pointer');\n }\n }\n\n if (link.hover) {\n link.hover(event, link.text);\n }\n }\n\n private _fireUnderlineEvent(link: ILink, showEvent: boolean): void {\n const range = link.range;\n const scrollOffset = this._bufferService.buffer.ydisp;\n const event = this._createLinkUnderlineEvent(range.start.x - 1, range.start.y - scrollOffset - 1, range.end.x, range.end.y - scrollOffset - 1, undefined);\n const emitter = showEvent ? this._onShowLinkUnderline : this._onHideLinkUnderline;\n emitter.fire(event);\n }\n\n protected _linkLeave(element: HTMLElement, link: ILink, event: MouseEvent): void {\n if (this._currentLink?.state) {\n this._currentLink.state.isHovered = false;\n if (this._currentLink.state.decorations.underline) {\n this._fireUnderlineEvent(link, false);\n }\n if (this._currentLink.state.decorations.pointerCursor) {\n element.classList.remove('xterm-cursor-pointer');\n }\n }\n\n if (link.leave) {\n link.leave(event, link.text);\n }\n }\n\n /**\n * Check if the buffer position is within the link\n * @param link\n * @param position\n */\n private _linkAtPosition(link: ILink, position: IBufferCellPosition): boolean {\n const sameLine = link.range.start.y === link.range.end.y;\n const wrappedFromLeft = link.range.start.y < position.y;\n const wrappedToRight = link.range.end.y > position.y;\n\n // If the start and end have the same y, then the position must be between start and end x\n // If not, then handle each case seperately, depending on which way it wraps\n return ((sameLine && link.range.start.x <= position.x && link.range.end.x >= position.x) ||\n (wrappedFromLeft && link.range.end.x >= position.x) ||\n (wrappedToRight && link.range.start.x <= position.x) ||\n (wrappedFromLeft && wrappedToRight)) &&\n link.range.start.y <= position.y &&\n link.range.end.y >= position.y;\n }\n\n /**\n * Get the buffer position from a mouse event\n * @param event\n */\n private _positionFromMouseEvent(event: MouseEvent, element: HTMLElement, mouseService: IMouseService): IBufferCellPosition | undefined {\n const coords = mouseService.getCoords(event, element, this._bufferService.cols, this._bufferService.rows);\n if (!coords) {\n return;\n }\n\n return { x: coords[0], y: coords[1] + this._bufferService.buffer.ydisp };\n }\n\n private _createLinkUnderlineEvent(x1: number, y1: number, x2: number, y2: number, fg: number | undefined): ILinkifierEvent {\n return { x1, y1, x2, y2, cols: this._bufferService.cols, fg };\n }\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { ICoreBrowserService } from './Services';\n\nexport class CoreBrowserService implements ICoreBrowserService {\n public serviceBrand: undefined;\n\n constructor(\n private _textarea: HTMLTextAreaElement\n ) {\n }\n\n public get isFocused(): boolean {\n return document.activeElement === this._textarea && document.hasFocus();\n }\n}\n","/**\n * Copyright (c) 2014-2020 The xterm.js authors. All rights reserved.\n * Copyright (c) 2012-2013, Christopher Jeffrey (MIT License)\n * @license MIT\n *\n * Originally forked from (with the author's permission):\n * Fabrice Bellard's javascript vt100 for jslinux:\n * http://bellard.org/jslinux/\n * Copyright (c) 2011 Fabrice Bellard\n * The original design remains. The terminal itself\n * has been extended to include xterm CSI codes, among\n * other features.\n *\n * Terminal Emulation References:\n * http://vt100.net/\n * http://invisible-island.net/xterm/ctlseqs/ctlseqs.txt\n * http://invisible-island.net/xterm/ctlseqs/ctlseqs.html\n * http://invisible-island.net/vttest/\n * http://www.inwap.com/pdp10/ansicode.txt\n * http://linux.die.net/man/4/console_codes\n * http://linux.die.net/man/7/urxvt\n */\n\nimport { Disposable } from 'common/Lifecycle';\nimport { IInstantiationService, IOptionsService, IBufferService, ILogService, ICharsetService, ICoreService, ICoreMouseService, IUnicodeService, IDirtyRowService } from 'common/services/Services';\nimport { InstantiationService } from 'common/services/InstantiationService';\nimport { LogService } from 'common/services/LogService';\nimport { BufferService, MINIMUM_COLS, MINIMUM_ROWS } from 'common/services/BufferService';\nimport { OptionsService } from 'common/services/OptionsService';\nimport { ITerminalOptions, IDisposable, IBufferLine, IAttributeData, ICoreTerminal } from 'common/Types';\nimport { CoreService } from 'common/services/CoreService';\nimport { EventEmitter, IEvent, forwardEvent } from 'common/EventEmitter';\nimport { CoreMouseService } from 'common/services/CoreMouseService';\nimport { DirtyRowService } from 'common/services/DirtyRowService';\nimport { UnicodeService } from 'common/services/UnicodeService';\nimport { CharsetService } from 'common/services/CharsetService';\nimport { updateWindowsModeWrappedState } from 'common/WindowsMode';\nimport { IFunctionIdentifier, IParams } from 'common/parser/Types';\nimport { IBufferSet } from 'common/buffer/Types';\nimport { InputHandler } from 'common/InputHandler';\nimport { WriteBuffer } from 'common/input/WriteBuffer';\n\nexport abstract class CoreTerminal extends Disposable implements ICoreTerminal {\n protected readonly _instantiationService: IInstantiationService;\n protected readonly _bufferService: IBufferService;\n protected readonly _logService: ILogService;\n protected readonly _coreService: ICoreService;\n protected readonly _charsetService: ICharsetService;\n protected readonly _coreMouseService: ICoreMouseService;\n protected readonly _dirtyRowService: IDirtyRowService;\n\n public readonly unicodeService: IUnicodeService;\n public readonly optionsService: IOptionsService;\n\n protected _inputHandler: InputHandler;\n private _writeBuffer: WriteBuffer;\n private _windowsMode: IDisposable | undefined;\n /** An IBufferline to clone/copy from for new blank lines */\n private _cachedBlankLine: IBufferLine | undefined;\n\n private _onBinary = new EventEmitter<string>();\n public get onBinary(): IEvent<string> { return this._onBinary.event; }\n private _onData = new EventEmitter<string>();\n public get onData(): IEvent<string> { return this._onData.event; }\n protected _onLineFeed = new EventEmitter<void>();\n public get onLineFeed(): IEvent<void> { return this._onLineFeed.event; }\n private _onResize = new EventEmitter<{ cols: number, rows: number }>();\n public get onResize(): IEvent<{ cols: number, rows: number }> { return this._onResize.event; }\n protected _onScroll = new EventEmitter<number>();\n public get onScroll(): IEvent<number> { return this._onScroll.event; }\n\n public get cols(): number { return this._bufferService.cols; }\n public get rows(): number { return this._bufferService.rows; }\n public get buffers(): IBufferSet { return this._bufferService.buffers; }\n\n constructor(\n options: ITerminalOptions\n ) {\n super();\n\n // Setup and initialize services\n this._instantiationService = new InstantiationService();\n this.optionsService = new OptionsService(options);\n this._instantiationService.setService(IOptionsService, this.optionsService);\n this._bufferService = this.register(this._instantiationService.createInstance(BufferService));\n this._instantiationService.setService(IBufferService, this._bufferService);\n this._logService = this._instantiationService.createInstance(LogService);\n this._instantiationService.setService(ILogService, this._logService);\n this._coreService = this.register(this._instantiationService.createInstance(CoreService, () => this.scrollToBottom()));\n this._instantiationService.setService(ICoreService, this._coreService);\n this._coreMouseService = this._instantiationService.createInstance(CoreMouseService);\n this._instantiationService.setService(ICoreMouseService, this._coreMouseService);\n this._dirtyRowService = this._instantiationService.createInstance(DirtyRowService);\n this._instantiationService.setService(IDirtyRowService, this._dirtyRowService);\n this.unicodeService = this._instantiationService.createInstance(UnicodeService);\n this._instantiationService.setService(IUnicodeService, this.unicodeService);\n this._charsetService = this._instantiationService.createInstance(CharsetService);\n this._instantiationService.setService(ICharsetService, this._charsetService);\n\n // Register input handler and handle/forward events\n this._inputHandler = new InputHandler(this._bufferService, this._charsetService, this._coreService, this._dirtyRowService, this._logService, this.optionsService, this._coreMouseService, this.unicodeService);\n this.register(forwardEvent(this._inputHandler.onLineFeed, this._onLineFeed));\n this.register(this._inputHandler);\n\n // Setup listeners\n this.register(forwardEvent(this._bufferService.onResize, this._onResize));\n this.register(forwardEvent(this._coreService.onData, this._onData));\n this.register(forwardEvent(this._coreService.onBinary, this._onBinary));\n this.register(this.optionsService.onOptionChange(key => this._updateOptions(key)));\n\n // Setup WriteBuffer\n this._writeBuffer = new WriteBuffer(data => this._inputHandler.parse(data));\n }\n\n public dispose(): void {\n if (this._isDisposed) {\n return;\n }\n super.dispose();\n this._windowsMode?.dispose();\n this._windowsMode = undefined;\n }\n\n public write(data: string | Uint8Array, callback?: () => void): void {\n this._writeBuffer.write(data, callback);\n }\n\n public writeSync(data: string | Uint8Array): void {\n this._writeBuffer.writeSync(data);\n }\n\n public resize(x: number, y: number): void {\n if (isNaN(x) || isNaN(y)) {\n return;\n }\n\n x = Math.max(x, MINIMUM_COLS);\n y = Math.max(y, MINIMUM_ROWS);\n\n this._bufferService.resize(x, y);\n }\n\n /**\n * Scroll the terminal down 1 row, creating a blank line.\n * @param isWrapped Whether the new line is wrapped from the previous line.\n */\n public scroll(eraseAttr: IAttributeData, isWrapped: boolean = false): void {\n const buffer = this._bufferService.buffer;\n\n let newLine: IBufferLine | undefined;\n newLine = this._cachedBlankLine;\n if (!newLine || newLine.length !== this.cols || newLine.getFg(0) !== eraseAttr.fg || newLine.getBg(0) !== eraseAttr.bg) {\n newLine = buffer.getBlankLine(eraseAttr, isWrapped);\n this._cachedBlankLine = newLine;\n }\n newLine.isWrapped = isWrapped;\n\n const topRow = buffer.ybase + buffer.scrollTop;\n const bottomRow = buffer.ybase + buffer.scrollBottom;\n\n if (buffer.scrollTop === 0) {\n // Determine whether the buffer is going to be trimmed after insertion.\n const willBufferBeTrimmed = buffer.lines.isFull;\n\n // Insert the line using the fastest method\n if (bottomRow === buffer.lines.length - 1) {\n if (willBufferBeTrimmed) {\n buffer.lines.recycle().copyFrom(newLine);\n } else {\n buffer.lines.push(newLine.clone());\n }\n } else {\n buffer.lines.splice(bottomRow + 1, 0, newLine.clone());\n }\n\n // Only adjust ybase and ydisp when the buffer is not trimmed\n if (!willBufferBeTrimmed) {\n buffer.ybase++;\n // Only scroll the ydisp with ybase if the user has not scrolled up\n if (!this._bufferService.isUserScrolling) {\n buffer.ydisp++;\n }\n } else {\n // When the buffer is full and the user has scrolled up, keep the text\n // stable unless ydisp is right at the top\n if (this._bufferService.isUserScrolling) {\n buffer.ydisp = Math.max(buffer.ydisp - 1, 0);\n }\n }\n } else {\n // scrollTop is non-zero which means no line will be going to the\n // scrollback, instead we can just shift them in-place.\n const scrollRegionHeight = bottomRow - topRow + 1 /* as it's zero-based */;\n buffer.lines.shiftElements(topRow + 1, scrollRegionHeight - 1, -1);\n buffer.lines.set(bottomRow, newLine.clone());\n }\n\n // Move the viewport to the bottom of the buffer unless the user is\n // scrolling.\n if (!this._bufferService.isUserScrolling) {\n buffer.ydisp = buffer.ybase;\n }\n\n // Flag rows that need updating\n this._dirtyRowService.markRangeDirty(buffer.scrollTop, buffer.scrollBottom);\n\n this._onScroll.fire(buffer.ydisp);\n }\n\n /**\n * Scroll the display of the terminal\n * @param disp The number of lines to scroll down (negative scroll up).\n * @param suppressScrollEvent Don't emit the scroll event as scrollLines. This is used\n * to avoid unwanted events being handled by the viewport when the event was triggered from the\n * viewport originally.\n */\n public scrollLines(disp: number, suppressScrollEvent?: boolean): void {\n const buffer = this._bufferService.buffer;\n if (disp < 0) {\n if (buffer.ydisp === 0) {\n return;\n }\n this._bufferService.isUserScrolling = true;\n } else if (disp + buffer.ydisp >= buffer.ybase) {\n this._bufferService.isUserScrolling = false;\n }\n\n const oldYdisp = buffer.ydisp;\n buffer.ydisp = Math.max(Math.min(buffer.ydisp + disp, buffer.ybase), 0);\n\n // No change occurred, don't trigger scroll/refresh\n if (oldYdisp === buffer.ydisp) {\n return;\n }\n\n if (!suppressScrollEvent) {\n this._onScroll.fire(buffer.ydisp);\n }\n }\n\n /**\n * Scroll the display of the terminal by a number of pages.\n * @param pageCount The number of pages to scroll (negative scrolls up).\n */\n public scrollPages(pageCount: number): void {\n this.scrollLines(pageCount * (this.rows - 1));\n }\n\n /**\n * Scrolls the display of the terminal to the top.\n */\n public scrollToTop(): void {\n this.scrollLines(-this._bufferService.buffer.ydisp);\n }\n\n /**\n * Scrolls the display of the terminal to the bottom.\n */\n public scrollToBottom(): void {\n this.scrollLines(this._bufferService.buffer.ybase - this._bufferService.buffer.ydisp);\n }\n\n public scrollToLine(line: number): void {\n const scrollAmount = line - this._bufferService.buffer.ydisp;\n if (scrollAmount !== 0) {\n this.scrollLines(scrollAmount);\n }\n }\n\n /** Add handler for ESC escape sequence. See xterm.d.ts for details. */\n public addEscHandler(id: IFunctionIdentifier, callback: () => boolean): IDisposable {\n return this._inputHandler.addEscHandler(id, callback);\n }\n\n /** Add handler for DCS escape sequence. See xterm.d.ts for details. */\n public addDcsHandler(id: IFunctionIdentifier, callback: (data: string, param: IParams) => boolean): IDisposable {\n return this._inputHandler.addDcsHandler(id, callback);\n }\n\n /** Add handler for CSI escape sequence. See xterm.d.ts for details. */\n public addCsiHandler(id: IFunctionIdentifier, callback: (params: IParams) => boolean): IDisposable {\n return this._inputHandler.addCsiHandler(id, callback);\n }\n\n /** Add handler for OSC escape sequence. See xterm.d.ts for details. */\n public addOscHandler(ident: number, callback: (data: string) => boolean): IDisposable {\n return this._inputHandler.addOscHandler(ident, callback);\n }\n\n protected _setup(): void {\n if (this.optionsService.options.windowsMode) {\n this._enableWindowsMode();\n }\n }\n\n public reset(): void {\n this._inputHandler.reset();\n this._bufferService.reset();\n this._charsetService.reset();\n this._coreService.reset();\n this._coreMouseService.reset();\n }\n\n protected _updateOptions(key: string): void {\n // TODO: These listeners should be owned by individual components\n switch (key) {\n case 'scrollback':\n this.buffers.resize(this.cols, this.rows);\n break;\n case 'windowsMode':\n if (this.optionsService.options.windowsMode) {\n this._enableWindowsMode();\n } else {\n this._windowsMode?.dispose();\n this._windowsMode = undefined;\n }\n break;\n }\n }\n\n protected _enableWindowsMode(): void {\n if (!this._windowsMode) {\n const disposables: IDisposable[] = [];\n disposables.push(this.onLineFeed(updateWindowsModeWrappedState.bind(null, this._bufferService)));\n disposables.push(this.addCsiHandler({ final: 'H' }, () => {\n updateWindowsModeWrappedState(this._bufferService);\n return false;\n }));\n this._windowsMode = {\n dispose: () => {\n for (const d of disposables) {\n d.dispose();\n }\n }\n };\n }\n }\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n *\n * This was heavily inspired from microsoft/vscode's dependency injection system (MIT).\n */\n/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport { IInstantiationService, IServiceIdentifier } from 'common/services/Services';\nimport { getServiceDependencies } from 'common/services/ServiceRegistry';\n\nexport class ServiceCollection {\n\n private _entries = new Map<IServiceIdentifier<any>, any>();\n\n constructor(...entries: [IServiceIdentifier<any>, any][]) {\n for (const [id, service] of entries) {\n this.set(id, service);\n }\n }\n\n public set<T>(id: IServiceIdentifier<T>, instance: T): T {\n const result = this._entries.get(id);\n this._entries.set(id, instance);\n return result;\n }\n\n public forEach(callback: (id: IServiceIdentifier<any>, instance: any) => any): void {\n this._entries.forEach((value, key) => callback(key, value));\n }\n\n public has(id: IServiceIdentifier<any>): boolean {\n return this._entries.has(id);\n }\n\n public get<T>(id: IServiceIdentifier<T>): T | undefined {\n return this._entries.get(id);\n }\n}\n\nexport class InstantiationService implements IInstantiationService {\n private readonly _services: ServiceCollection = new ServiceCollection();\n\n constructor() {\n this._services.set(IInstantiationService, this);\n }\n\n public setService<T>(id: IServiceIdentifier<T>, instance: T): void {\n this._services.set(id, instance);\n }\n\n public getService<T>(id: IServiceIdentifier<T>): T | undefined {\n return this._services.get(id);\n }\n\n public createInstance<T>(ctor: any, ...args: any[]): T {\n const serviceDependencies = getServiceDependencies(ctor).sort((a, b) => a.index - b.index);\n\n const serviceArgs: any[] = [];\n for (const dependency of serviceDependencies) {\n const service = this._services.get(dependency.id);\n if (!service) {\n throw new Error(`[createInstance] ${ctor.name} depends on UNKNOWN service ${dependency.id}.`);\n }\n serviceArgs.push(service);\n }\n\n const firstServiceArgPos = serviceDependencies.length > 0 ? serviceDependencies[0].index : args.length;\n\n // check for argument mismatches, adjust static args if needed\n if (args.length !== firstServiceArgPos) {\n throw new Error(`[createInstance] First service dependency of ${ctor.name} at position ${firstServiceArgPos + 1} conflicts with ${args.length} static arguments`);\n }\n\n // now create the instance\n return new ctor(...[...args, ...serviceArgs]);\n }\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { ILogService, IOptionsService } from 'common/services/Services';\n\ntype LogType = (message?: any, ...optionalParams: any[]) => void;\n\ninterface IConsole {\n log: LogType;\n error: LogType;\n info: LogType;\n trace: LogType;\n warn: LogType;\n}\n\n// console is available on both node.js and browser contexts but the common\n// module doesn't depend on them so we need to explicitly declare it.\ndeclare const console: IConsole;\n\n\nexport enum LogLevel {\n DEBUG = 0,\n INFO = 1,\n WARN = 2,\n ERROR = 3,\n OFF = 4\n}\n\nconst optionsKeyToLogLevel: { [key: string]: LogLevel } = {\n debug: LogLevel.DEBUG,\n info: LogLevel.INFO,\n warn: LogLevel.WARN,\n error: LogLevel.ERROR,\n off: LogLevel.OFF\n};\n\nconst LOG_PREFIX = 'xterm.js: ';\n\nexport class LogService implements ILogService {\n public serviceBrand: any;\n\n private _logLevel!: LogLevel;\n\n constructor(\n @IOptionsService private readonly _optionsService: IOptionsService\n ) {\n this._updateLogLevel();\n this._optionsService.onOptionChange(key => {\n if (key === 'logLevel') {\n this._updateLogLevel();\n }\n });\n }\n\n private _updateLogLevel(): void {\n this._logLevel = optionsKeyToLogLevel[this._optionsService.options.logLevel];\n }\n\n private _evalLazyOptionalParams(optionalParams: any[]): void {\n for (let i = 0; i < optionalParams.length; i++) {\n if (typeof optionalParams[i] === 'function') {\n optionalParams[i] = optionalParams[i]();\n }\n }\n }\n\n private _log(type: LogType, message: string, optionalParams: any[]): void {\n this._evalLazyOptionalParams(optionalParams);\n type.call(console, LOG_PREFIX + message, ...optionalParams);\n }\n\n public debug(message: string, ...optionalParams: any[]): void {\n if (this._logLevel <= LogLevel.DEBUG) {\n this._log(console.log, message, optionalParams);\n }\n }\n\n public info(message: string, ...optionalParams: any[]): void {\n if (this._logLevel <= LogLevel.INFO) {\n this._log(console.info, message, optionalParams);\n }\n }\n\n public warn(message: string, ...optionalParams: any[]): void {\n if (this._logLevel <= LogLevel.WARN) {\n this._log(console.warn, message, optionalParams);\n }\n }\n\n public error(message: string, ...optionalParams: any[]): void {\n if (this._logLevel <= LogLevel.ERROR) {\n this._log(console.error, message, optionalParams);\n }\n }\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IBufferService, IOptionsService } from 'common/services/Services';\nimport { BufferSet } from 'common/buffer/BufferSet';\nimport { IBufferSet, IBuffer } from 'common/buffer/Types';\nimport { EventEmitter, IEvent } from 'common/EventEmitter';\nimport { Disposable } from 'common/Lifecycle';\n\nexport const MINIMUM_COLS = 2; // Less than 2 can mess with wide chars\nexport const MINIMUM_ROWS = 1;\n\nexport class BufferService extends Disposable implements IBufferService {\n public serviceBrand: any;\n\n public cols: number;\n public rows: number;\n public buffers: IBufferSet;\n /** Whether the user is scrolling (locks the scroll position) */\n public isUserScrolling: boolean = false;\n\n private _onResize = new EventEmitter<{ cols: number, rows: number }>();\n public get onResize(): IEvent<{ cols: number, rows: number }> { return this._onResize.event; }\n\n public get buffer(): IBuffer { return this.buffers.active; }\n\n constructor(\n @IOptionsService private _optionsService: IOptionsService\n ) {\n super();\n this.cols = Math.max(_optionsService.options.cols, MINIMUM_COLS);\n this.rows = Math.max(_optionsService.options.rows, MINIMUM_ROWS);\n this.buffers = new BufferSet(_optionsService, this);\n }\n\n public dispose(): void {\n super.dispose();\n this.buffers.dispose();\n }\n\n public resize(cols: number, rows: number): void {\n this.cols = cols;\n this.rows = rows;\n this.buffers.resize(cols, rows);\n this.buffers.setupTabStops(this.cols);\n this._onResize.fire({ cols, rows });\n }\n\n public reset(): void {\n this.buffers.dispose();\n this.buffers = new BufferSet(this._optionsService, this);\n this.isUserScrolling = false;\n }\n}\n","/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IBuffer, IBufferSet } from 'common/buffer/Types';\nimport { IAttributeData } from 'common/Types';\nimport { Buffer } from 'common/buffer/Buffer';\nimport { EventEmitter, IEvent } from 'common/EventEmitter';\nimport { IOptionsService, IBufferService } from 'common/services/Services';\nimport { Disposable } from 'common/Lifecycle';\n\n/**\n * The BufferSet represents the set of two buffers used by xterm terminals (normal and alt) and\n * provides also utilities for working with them.\n */\nexport class BufferSet extends Disposable implements IBufferSet {\n private _normal: Buffer;\n private _alt: Buffer;\n private _activeBuffer: Buffer;\n\n\n private _onBufferActivate = this.register(new EventEmitter<{activeBuffer: IBuffer, inactiveBuffer: IBuffer}>());\n public get onBufferActivate(): IEvent<{activeBuffer: IBuffer, inactiveBuffer: IBuffer}> { return this._onBufferActivate.event; }\n\n /**\n * Create a new BufferSet for the given terminal.\n * @param _terminal - The terminal the BufferSet will belong to\n */\n constructor(\n optionsService: IOptionsService,\n bufferService: IBufferService\n ) {\n super();\n\n this._normal = new Buffer(true, optionsService, bufferService);\n this._normal.fillViewportRows();\n\n // The alt buffer should never have scrollback.\n // See http://invisible-island.net/xterm/ctlseqs/ctlseqs.html#h2-The-Alternate-Screen-Buffer\n this._alt = new Buffer(false, optionsService, bufferService);\n this._activeBuffer = this._normal;\n\n this.setupTabStops();\n }\n\n /**\n * Returns the alt Buffer of the BufferSet\n */\n public get alt(): Buffer {\n return this._alt;\n }\n\n /**\n * Returns the normal Buffer of the BufferSet\n */\n public get active(): Buffer {\n return this._activeBuffer;\n }\n\n /**\n * Returns the currently active Buffer of the BufferSet\n */\n public get normal(): Buffer {\n return this._normal;\n }\n\n /**\n * Sets the normal Buffer of the BufferSet as its currently active Buffer\n */\n public activateNormalBuffer(): void {\n if (this._activeBuffer === this._normal) {\n return;\n }\n this._normal.x = this._alt.x;\n this._normal.y = this._alt.y;\n // The alt buffer should always be cleared when we switch to the normal\n // buffer. This frees up memory since the alt buffer should always be new\n // when activated.\n this._alt.clear();\n this._activeBuffer = this._normal;\n this._onBufferActivate.fire({\n activeBuffer: this._normal,\n inactiveBuffer: this._alt\n });\n }\n\n /**\n * Sets the alt Buffer of the BufferSet as its currently active Buffer\n */\n public activateAltBuffer(fillAttr?: IAttributeData): void {\n if (this._activeBuffer === this._alt) {\n return;\n }\n // Since the alt buffer is always cleared when the normal buffer is\n // activated, we want to fill it when switching to it.\n this._alt.fillViewportRows(fillAttr);\n this._alt.x = this._normal.x;\n this._alt.y = this._normal.y;\n this._activeBuffer = this._alt;\n this._onBufferActivate.fire({\n activeBuffer: this._alt,\n inactiveBuffer: this._normal\n });\n }\n\n /**\n * Resizes both normal and alt buffers, adjusting their data accordingly.\n * @param newCols The new number of columns.\n * @param newRows The new number of rows.\n */\n public resize(newCols: number, newRows: number): void {\n this._normal.resize(newCols, newRows);\n this._alt.resize(newCols, newRows);\n }\n\n /**\n * Setup the tab stops.\n * @param i The index to start setting up tab stops from.\n */\n public setupTabStops(i?: number): void {\n this._normal.setupTabStops(i);\n this._alt.setupTabStops(i);\n }\n}\n","/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { CircularList, IInsertEvent } from 'common/CircularList';\nimport { IBuffer, BufferIndex, IBufferStringIterator, IBufferStringIteratorResult } from 'common/buffer/Types';\nimport { IBufferLine, ICellData, IAttributeData, ICharset } from 'common/Types';\nimport { BufferLine, DEFAULT_ATTR_DATA } from 'common/buffer/BufferLine';\nimport { CellData } from 'common/buffer/CellData';\nimport { NULL_CELL_CHAR, NULL_CELL_WIDTH, NULL_CELL_CODE, WHITESPACE_CELL_CHAR, WHITESPACE_CELL_WIDTH, WHITESPACE_CELL_CODE, CHAR_DATA_WIDTH_INDEX, CHAR_DATA_CHAR_INDEX } from 'common/buffer/Constants';\nimport { reflowLargerApplyNewLayout, reflowLargerCreateNewLayout, reflowLargerGetLinesToRemove, reflowSmallerGetNewLineLengths, getWrappedLineTrimmedLength } from 'common/buffer/BufferReflow';\nimport { Marker } from 'common/buffer/Marker';\nimport { IOptionsService, IBufferService } from 'common/services/Services';\nimport { DEFAULT_CHARSET } from 'common/data/Charsets';\nimport { ExtendedAttrs } from 'common/buffer/AttributeData';\n\nexport const MAX_BUFFER_SIZE = 4294967295; // 2^32 - 1\n\n/**\n * This class represents a terminal buffer (an internal state of the terminal), where the\n * following information is stored (in high-level):\n * - text content of this particular buffer\n * - cursor position\n * - scroll position\n */\nexport class Buffer implements IBuffer {\n public lines: CircularList<IBufferLine>;\n public ydisp: number = 0;\n public ybase: number = 0;\n public y: number = 0;\n public x: number = 0;\n public scrollBottom: number;\n public scrollTop: number;\n // TODO: Type me\n public tabs: any;\n public savedY: number = 0;\n public savedX: number = 0;\n public savedCurAttrData = DEFAULT_ATTR_DATA.clone();\n public savedCharset: ICharset | undefined = DEFAULT_CHARSET;\n public markers: Marker[] = [];\n private _nullCell: ICellData = CellData.fromCharData([0, NULL_CELL_CHAR, NULL_CELL_WIDTH, NULL_CELL_CODE]);\n private _whitespaceCell: ICellData = CellData.fromCharData([0, WHITESPACE_CELL_CHAR, WHITESPACE_CELL_WIDTH, WHITESPACE_CELL_CODE]);\n private _cols: number;\n private _rows: number;\n\n constructor(\n private _hasScrollback: boolean,\n private _optionsService: IOptionsService,\n private _bufferService: IBufferService\n ) {\n this._cols = this._bufferService.cols;\n this._rows = this._bufferService.rows;\n this.lines = new CircularList<IBufferLine>(this._getCorrectBufferLength(this._rows));\n this.scrollTop = 0;\n this.scrollBottom = this._rows - 1;\n this.setupTabStops();\n }\n\n public getNullCell(attr?: IAttributeData): ICellData {\n if (attr) {\n this._nullCell.fg = attr.fg;\n this._nullCell.bg = attr.bg;\n this._nullCell.extended = attr.extended;\n } else {\n this._nullCell.fg = 0;\n this._nullCell.bg = 0;\n this._nullCell.extended = new ExtendedAttrs();\n }\n return this._nullCell;\n }\n\n public getWhitespaceCell(attr?: IAttributeData): ICellData {\n if (attr) {\n this._whitespaceCell.fg = attr.fg;\n this._whitespaceCell.bg = attr.bg;\n this._whitespaceCell.extended = attr.extended;\n } else {\n this._whitespaceCell.fg = 0;\n this._whitespaceCell.bg = 0;\n this._whitespaceCell.extended = new ExtendedAttrs();\n }\n return this._whitespaceCell;\n }\n\n public getBlankLine(attr: IAttributeData, isWrapped?: boolean): IBufferLine {\n return new BufferLine(this._bufferService.cols, this.getNullCell(attr), isWrapped);\n }\n\n public get hasScrollback(): boolean {\n return this._hasScrollback && this.lines.maxLength > this._rows;\n }\n\n public get isCursorInViewport(): boolean {\n const absoluteY = this.ybase + this.y;\n const relativeY = absoluteY - this.ydisp;\n return (relativeY >= 0 && relativeY < this._rows);\n }\n\n /**\n * Gets the correct buffer length based on the rows provided, the terminal's\n * scrollback and whether this buffer is flagged to have scrollback or not.\n * @param rows The terminal rows to use in the calculation.\n */\n private _getCorrectBufferLength(rows: number): number {\n if (!this._hasScrollback) {\n return rows;\n }\n\n const correctBufferLength = rows + this._optionsService.options.scrollback;\n\n return correctBufferLength > MAX_BUFFER_SIZE ? MAX_BUFFER_SIZE : correctBufferLength;\n }\n\n /**\n * Fills the buffer's viewport with blank lines.\n */\n public fillViewportRows(fillAttr?: IAttributeData): void {\n if (this.lines.length === 0) {\n if (fillAttr === undefined) {\n fillAttr = DEFAULT_ATTR_DATA;\n }\n let i = this._rows;\n while (i--) {\n this.lines.push(this.getBlankLine(fillAttr));\n }\n }\n }\n\n /**\n * Clears the buffer to it's initial state, discarding all previous data.\n */\n public clear(): void {\n this.ydisp = 0;\n this.ybase = 0;\n this.y = 0;\n this.x = 0;\n this.lines = new CircularList<IBufferLine>(this._getCorrectBufferLength(this._rows));\n this.scrollTop = 0;\n this.scrollBottom = this._rows - 1;\n this.setupTabStops();\n }\n\n /**\n * Resizes the buffer, adjusting its data accordingly.\n * @param newCols The new number of columns.\n * @param newRows The new number of rows.\n */\n public resize(newCols: number, newRows: number): void {\n // store reference to null cell with default attrs\n const nullCell = this.getNullCell(DEFAULT_ATTR_DATA);\n\n // Increase max length if needed before adjustments to allow space to fill\n // as required.\n const newMaxLength = this._getCorrectBufferLength(newRows);\n if (newMaxLength > this.lines.maxLength) {\n this.lines.maxLength = newMaxLength;\n }\n\n // The following adjustments should only happen if the buffer has been\n // initialized/filled.\n if (this.lines.length > 0) {\n // Deal with columns increasing (reducing needs to happen after reflow)\n if (this._cols < newCols) {\n for (let i = 0; i < this.lines.length; i++) {\n this.lines.get(i)!.resize(newCols, nullCell);\n }\n }\n\n // Resize rows in both directions as needed\n let addToY = 0;\n if (this._rows < newRows) {\n for (let y = this._rows; y < newRows; y++) {\n if (this.lines.length < newRows + this.ybase) {\n if (this._optionsService.options.windowsMode) {\n // Just add the new missing rows on Windows as conpty reprints the screen with it's\n // view of the world. Once a line enters scrollback for conpty it remains there\n this.lines.push(new BufferLine(newCols, nullCell));\n } else {\n if (this.ybase > 0 && this.lines.length <= this.ybase + this.y + addToY + 1) {\n // There is room above the buffer and there are no empty elements below the line,\n // scroll up\n this.ybase--;\n addToY++;\n if (this.ydisp > 0) {\n // Viewport is at the top of the buffer, must increase downwards\n this.ydisp--;\n }\n } else {\n // Add a blank line if there is no buffer left at the top to scroll to, or if there\n // are blank lines after the cursor\n this.lines.push(new BufferLine(newCols, nullCell));\n }\n }\n }\n }\n } else { // (this._rows >= newRows)\n for (let y = this._rows; y > newRows; y--) {\n if (this.lines.length > newRows + this.ybase) {\n if (this.lines.length > this.ybase + this.y + 1) {\n // The line is a blank line below the cursor, remove it\n this.lines.pop();\n } else {\n // The line is the cursor, scroll down\n this.ybase++;\n this.ydisp++;\n }\n }\n }\n }\n\n // Reduce max length if needed after adjustments, this is done after as it\n // would otherwise cut data from the bottom of the buffer.\n if (newMaxLength < this.lines.maxLength) {\n // Trim from the top of the buffer and adjust ybase and ydisp.\n const amountToTrim = this.lines.length - newMaxLength;\n if (amountToTrim > 0) {\n this.lines.trimStart(amountToTrim);\n this.ybase = Math.max(this.ybase - amountToTrim, 0);\n this.ydisp = Math.max(this.ydisp - amountToTrim, 0);\n this.savedY = Math.max(this.savedY - amountToTrim, 0);\n }\n this.lines.maxLength = newMaxLength;\n }\n\n // Make sure that the cursor stays on screen\n this.x = Math.min(this.x, newCols - 1);\n this.y = Math.min(this.y, newRows - 1);\n if (addToY) {\n this.y += addToY;\n }\n this.savedX = Math.min(this.savedX, newCols - 1);\n\n this.scrollTop = 0;\n }\n\n this.scrollBottom = newRows - 1;\n\n if (this._isReflowEnabled) {\n this._reflow(newCols, newRows);\n\n // Trim the end of the line off if cols shrunk\n if (this._cols > newCols) {\n for (let i = 0; i < this.lines.length; i++) {\n this.lines.get(i)!.resize(newCols, nullCell);\n }\n }\n }\n\n this._cols = newCols;\n this._rows = newRows;\n }\n\n private get _isReflowEnabled(): boolean {\n return this._hasScrollback && !this._optionsService.options.windowsMode;\n }\n\n private _reflow(newCols: number, newRows: number): void {\n if (this._cols === newCols) {\n return;\n }\n\n // Iterate through rows, ignore the last one as it cannot be wrapped\n if (newCols > this._cols) {\n this._reflowLarger(newCols, newRows);\n } else {\n this._reflowSmaller(newCols, newRows);\n }\n }\n\n private _reflowLarger(newCols: number, newRows: number): void {\n const toRemove: number[] = reflowLargerGetLinesToRemove(this.lines, this._cols, newCols, this.ybase + this.y, this.getNullCell(DEFAULT_ATTR_DATA));\n if (toRemove.length > 0) {\n const newLayoutResult = reflowLargerCreateNewLayout(this.lines, toRemove);\n reflowLargerApplyNewLayout(this.lines, newLayoutResult.layout);\n this._reflowLargerAdjustViewport(newCols, newRows, newLayoutResult.countRemoved);\n }\n }\n\n private _reflowLargerAdjustViewport(newCols: number, newRows: number, countRemoved: number): void {\n const nullCell = this.getNullCell(DEFAULT_ATTR_DATA);\n // Adjust viewport based on number of items removed\n let viewportAdjustments = countRemoved;\n while (viewportAdjustments-- > 0) {\n if (this.ybase === 0) {\n if (this.y > 0) {\n this.y--;\n }\n if (this.lines.length < newRows) {\n // Add an extra row at the bottom of the viewport\n this.lines.push(new BufferLine(newCols, nullCell));\n }\n } else {\n if (this.ydisp === this.ybase) {\n this.ydisp--;\n }\n this.ybase--;\n }\n }\n this.savedY = Math.max(this.savedY - countRemoved, 0);\n }\n\n private _reflowSmaller(newCols: number, newRows: number): void {\n const nullCell = this.getNullCell(DEFAULT_ATTR_DATA);\n // Gather all BufferLines that need to be inserted into the Buffer here so that they can be\n // batched up and only committed once\n const toInsert = [];\n let countToInsert = 0;\n // Go backwards as many lines may be trimmed and this will avoid considering them\n for (let y = this.lines.length - 1; y >= 0; y--) {\n // Check whether this line is a problem\n let nextLine = this.lines.get(y) as BufferLine;\n if (!nextLine || !nextLine.isWrapped && nextLine.getTrimmedLength() <= newCols) {\n continue;\n }\n\n // Gather wrapped lines and adjust y to be the starting line\n const wrappedLines: BufferLine[] = [nextLine];\n while (nextLine.isWrapped && y > 0) {\n nextLine = this.lines.get(--y) as BufferLine;\n wrappedLines.unshift(nextLine);\n }\n\n // If these lines contain the cursor don't touch them, the program will handle fixing up\n // wrapped lines with the cursor\n const absoluteY = this.ybase + this.y;\n if (absoluteY >= y && absoluteY < y + wrappedLines.length) {\n continue;\n }\n\n const lastLineLength = wrappedLines[wrappedLines.length - 1].getTrimmedLength();\n const destLineLengths = reflowSmallerGetNewLineLengths(wrappedLines, this._cols, newCols);\n const linesToAdd = destLineLengths.length - wrappedLines.length;\n let trimmedLines: number;\n if (this.ybase === 0 && this.y !== this.lines.length - 1) {\n // If the top section of the buffer is not yet filled\n trimmedLines = Math.max(0, this.y - this.lines.maxLength + linesToAdd);\n } else {\n trimmedLines = Math.max(0, this.lines.length - this.lines.maxLength + linesToAdd);\n }\n\n // Add the new lines\n const newLines: BufferLine[] = [];\n for (let i = 0; i < linesToAdd; i++) {\n const newLine = this.getBlankLine(DEFAULT_ATTR_DATA, true) as BufferLine;\n newLines.push(newLine);\n }\n if (newLines.length > 0) {\n toInsert.push({\n // countToInsert here gets the actual index, taking into account other inserted items.\n // using this we can iterate through the list forwards\n start: y + wrappedLines.length + countToInsert,\n newLines\n });\n countToInsert += newLines.length;\n }\n wrappedLines.push(...newLines);\n\n // Copy buffer data to new locations, this needs to happen backwards to do in-place\n let destLineIndex = destLineLengths.length - 1; // Math.floor(cellsNeeded / newCols);\n let destCol = destLineLengths[destLineIndex]; // cellsNeeded % newCols;\n if (destCol === 0) {\n destLineIndex--;\n destCol = destLineLengths[destLineIndex];\n }\n let srcLineIndex = wrappedLines.length - linesToAdd - 1;\n let srcCol = lastLineLength;\n while (srcLineIndex >= 0) {\n const cellsToCopy = Math.min(srcCol, destCol);\n wrappedLines[destLineIndex].copyCellsFrom(wrappedLines[srcLineIndex], srcCol - cellsToCopy, destCol - cellsToCopy, cellsToCopy, true);\n destCol -= cellsToCopy;\n if (destCol === 0) {\n destLineIndex--;\n destCol = destLineLengths[destLineIndex];\n }\n srcCol -= cellsToCopy;\n if (srcCol === 0) {\n srcLineIndex--;\n const wrappedLinesIndex = Math.max(srcLineIndex, 0);\n srcCol = getWrappedLineTrimmedLength(wrappedLines, wrappedLinesIndex, this._cols);\n }\n }\n\n // Null out the end of the line ends if a wide character wrapped to the following line\n for (let i = 0; i < wrappedLines.length; i++) {\n if (destLineLengths[i] < newCols) {\n wrappedLines[i].setCell(destLineLengths[i], nullCell);\n }\n }\n\n // Adjust viewport as needed\n let viewportAdjustments = linesToAdd - trimmedLines;\n while (viewportAdjustments-- > 0) {\n if (this.ybase === 0) {\n if (this.y < newRows - 1) {\n this.y++;\n this.lines.pop();\n } else {\n this.ybase++;\n this.ydisp++;\n }\n } else {\n // Ensure ybase does not exceed its maximum value\n if (this.ybase < Math.min(this.lines.maxLength, this.lines.length + countToInsert) - newRows) {\n if (this.ybase === this.ydisp) {\n this.ydisp++;\n }\n this.ybase++;\n }\n }\n }\n this.savedY = Math.min(this.savedY + linesToAdd, this.ybase + newRows - 1);\n }\n\n // Rearrange lines in the buffer if there are any insertions, this is done at the end rather\n // than earlier so that it's a single O(n) pass through the buffer, instead of O(n^2) from many\n // costly calls to CircularList.splice.\n if (toInsert.length > 0) {\n // Record buffer insert events and then play them back backwards so that the indexes are\n // correct\n const insertEvents: IInsertEvent[] = [];\n\n // Record original lines so they don't get overridden when we rearrange the list\n const originalLines: BufferLine[] = [];\n for (let i = 0; i < this.lines.length; i++) {\n originalLines.push(this.lines.get(i) as BufferLine);\n }\n const originalLinesLength = this.lines.length;\n\n let originalLineIndex = originalLinesLength - 1;\n let nextToInsertIndex = 0;\n let nextToInsert = toInsert[nextToInsertIndex];\n this.lines.length = Math.min(this.lines.maxLength, this.lines.length + countToInsert);\n let countInsertedSoFar = 0;\n for (let i = Math.min(this.lines.maxLength - 1, originalLinesLength + countToInsert - 1); i >= 0; i--) {\n if (nextToInsert && nextToInsert.start > originalLineIndex + countInsertedSoFar) {\n // Insert extra lines here, adjusting i as needed\n for (let nextI = nextToInsert.newLines.length - 1; nextI >= 0; nextI--) {\n this.lines.set(i--, nextToInsert.newLines[nextI]);\n }\n i++;\n\n // Create insert events for later\n insertEvents.push({\n index: originalLineIndex + 1,\n amount: nextToInsert.newLines.length\n });\n\n countInsertedSoFar += nextToInsert.newLines.length;\n nextToInsert = toInsert[++nextToInsertIndex];\n } else {\n this.lines.set(i, originalLines[originalLineIndex--]);\n }\n }\n\n // Update markers\n let insertCountEmitted = 0;\n for (let i = insertEvents.length - 1; i >= 0; i--) {\n insertEvents[i].index += insertCountEmitted;\n this.lines.onInsertEmitter.fire(insertEvents[i]);\n insertCountEmitted += insertEvents[i].amount;\n }\n const amountToTrim = Math.max(0, originalLinesLength + countToInsert - this.lines.maxLength);\n if (amountToTrim > 0) {\n this.lines.onTrimEmitter.fire(amountToTrim);\n }\n }\n }\n\n // private _reflowSmallerGetLinesNeeded()\n\n /**\n * Translates a string index back to a BufferIndex.\n * To get the correct buffer position the string must start at `startCol` 0\n * (default in translateBufferLineToString).\n * The method also works on wrapped line strings given rows were not trimmed.\n * The method operates on the CharData string length, there are no\n * additional content or boundary checks. Therefore the string and the buffer\n * should not be altered in between.\n * TODO: respect trim flag after fixing #1685\n * @param lineIndex line index the string was retrieved from\n * @param stringIndex index within the string\n * @param startCol column offset the string was retrieved from\n */\n public stringIndexToBufferIndex(lineIndex: number, stringIndex: number, trimRight: boolean = false): BufferIndex {\n while (stringIndex) {\n const line = this.lines.get(lineIndex);\n if (!line) {\n return [-1, -1];\n }\n const length = (trimRight) ? line.getTrimmedLength() : line.length;\n for (let i = 0; i < length; ++i) {\n if (line.get(i)[CHAR_DATA_WIDTH_INDEX]) {\n // empty cells report a string length of 0, but get replaced\n // with a whitespace in translateToString, thus replace with 1\n stringIndex -= line.get(i)[CHAR_DATA_CHAR_INDEX].length || 1;\n }\n if (stringIndex < 0) {\n return [lineIndex, i];\n }\n }\n lineIndex++;\n }\n return [lineIndex, 0];\n }\n\n /**\n * Translates a buffer line to a string, with optional start and end columns.\n * Wide characters will count as two columns in the resulting string. This\n * function is useful for getting the actual text underneath the raw selection\n * position.\n * @param line The line being translated.\n * @param trimRight Whether to trim whitespace to the right.\n * @param startCol The column to start at.\n * @param endCol The column to end at.\n */\n public translateBufferLineToString(lineIndex: number, trimRight: boolean, startCol: number = 0, endCol?: number): string {\n const line = this.lines.get(lineIndex);\n if (!line) {\n return '';\n }\n return line.translateToString(trimRight, startCol, endCol);\n }\n\n public getWrappedRangeForLine(y: number): { first: number, last: number } {\n let first = y;\n let last = y;\n // Scan upwards for wrapped lines\n while (first > 0 && this.lines.get(first)!.isWrapped) {\n first--;\n }\n // Scan downwards for wrapped lines\n while (last + 1 < this.lines.length && this.lines.get(last + 1)!.isWrapped) {\n last++;\n }\n return { first, last };\n }\n\n /**\n * Setup the tab stops.\n * @param i The index to start setting up tab stops from.\n */\n public setupTabStops(i?: number): void {\n if (i !== null && i !== undefined) {\n if (!this.tabs[i]) {\n i = this.prevStop(i);\n }\n } else {\n this.tabs = {};\n i = 0;\n }\n\n for (; i < this._cols; i += this._optionsService.options.tabStopWidth) {\n this.tabs[i] = true;\n }\n }\n\n /**\n * Move the cursor to the previous tab stop from the given position (default is current).\n * @param x The position to move the cursor to the previous tab stop.\n */\n public prevStop(x?: number): number {\n if (x === null || x === undefined) {\n x = this.x;\n }\n while (!this.tabs[--x] && x > 0);\n return x >= this._cols ? this._cols - 1 : x < 0 ? 0 : x;\n }\n\n /**\n * Move the cursor one tab stop forward from the given position (default is current).\n * @param x The position to move the cursor one tab stop forward.\n */\n public nextStop(x?: number): number {\n if (x === null || x === undefined) {\n x = this.x;\n }\n while (!this.tabs[++x] && x < this._cols);\n return x >= this._cols ? this._cols - 1 : x < 0 ? 0 : x;\n }\n\n public addMarker(y: number): Marker {\n const marker = new Marker(y);\n this.markers.push(marker);\n marker.register(this.lines.onTrim(amount => {\n marker.line -= amount;\n // The marker should be disposed when the line is trimmed from the buffer\n if (marker.line < 0) {\n marker.dispose();\n }\n }));\n marker.register(this.lines.onInsert(event => {\n if (marker.line >= event.index) {\n marker.line += event.amount;\n }\n }));\n marker.register(this.lines.onDelete(event => {\n // Delete the marker if it's within the range\n if (marker.line >= event.index && marker.line < event.index + event.amount) {\n marker.dispose();\n }\n\n // Shift the marker if it's after the deleted range\n if (marker.line > event.index) {\n marker.line -= event.amount;\n }\n }));\n marker.register(marker.onDispose(() => this._removeMarker(marker)));\n return marker;\n }\n\n private _removeMarker(marker: Marker): void {\n this.markers.splice(this.markers.indexOf(marker), 1);\n }\n\n public iterator(trimRight: boolean, startIndex?: number, endIndex?: number, startOverscan?: number, endOverscan?: number): IBufferStringIterator {\n return new BufferStringIterator(this, trimRight, startIndex, endIndex, startOverscan, endOverscan);\n }\n}\n\n/**\n * Iterator to get unwrapped content strings from the buffer.\n * The iterator returns at least the string data between the borders\n * `startIndex` and `endIndex` (exclusive) and will expand the lines\n * by `startOverscan` to the top and by `endOverscan` to the bottom,\n * if no new line was found in between.\n * It will never read/return string data beyond `startIndex - startOverscan`\n * or `endIndex + endOverscan`. Therefore the first and last line might be truncated.\n * It is possible to always get the full string for the first and last line as well\n * by setting the overscan values to the actual buffer length. This not recommended\n * since it might return the whole buffer within a single string in a worst case scenario.\n */\nexport class BufferStringIterator implements IBufferStringIterator {\n private _current: number;\n\n constructor (\n private _buffer: IBuffer,\n private _trimRight: boolean,\n private _startIndex: number = 0,\n private _endIndex: number = _buffer.lines.length,\n private _startOverscan: number = 0,\n private _endOverscan: number = 0\n ) {\n if (this._startIndex < 0) {\n this._startIndex = 0;\n }\n if (this._endIndex > this._buffer.lines.length) {\n this._endIndex = this._buffer.lines.length;\n }\n this._current = this._startIndex;\n }\n\n public hasNext(): boolean {\n return this._current < this._endIndex;\n }\n\n public next(): IBufferStringIteratorResult {\n const range = this._buffer.getWrappedRangeForLine(this._current);\n // limit search window to overscan value at both borders\n if (range.first < this._startIndex - this._startOverscan) {\n range.first = this._startIndex - this._startOverscan;\n }\n if (range.last > this._endIndex + this._endOverscan) {\n range.last = this._endIndex + this._endOverscan;\n }\n // limit to current buffer length\n range.first = Math.max(range.first, 0);\n range.last = Math.min(range.last, this._buffer.lines.length);\n let content = '';\n for (let i = range.first; i <= range.last; ++i) {\n content += this._buffer.translateBufferLineToString(i, this._trimRight);\n }\n this._current = range.last + 1;\n return {range, content};\n }\n}\n","/**\n * Copyright (c) 2016 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { ICircularList } from 'common/Types';\nimport { EventEmitter, IEvent } from 'common/EventEmitter';\n\nexport interface IInsertEvent {\n index: number;\n amount: number;\n}\n\nexport interface IDeleteEvent {\n index: number;\n amount: number;\n}\n\n/**\n * Represents a circular list; a list with a maximum size that wraps around when push is called,\n * overriding values at the start of the list.\n */\nexport class CircularList<T> implements ICircularList<T> {\n protected _array: (T | undefined)[];\n private _startIndex: number;\n private _length: number;\n\n public onDeleteEmitter = new EventEmitter<IDeleteEvent>();\n public get onDelete(): IEvent<IDeleteEvent> { return this.onDeleteEmitter.event; }\n public onInsertEmitter = new EventEmitter<IInsertEvent>();\n public get onInsert(): IEvent<IInsertEvent> { return this.onInsertEmitter.event; }\n public onTrimEmitter = new EventEmitter<number>();\n public get onTrim(): IEvent<number> { return this.onTrimEmitter.event; }\n\n constructor(\n private _maxLength: number\n ) {\n this._array = new Array<T>(this._maxLength);\n this._startIndex = 0;\n this._length = 0;\n }\n\n public get maxLength(): number {\n return this._maxLength;\n }\n\n public set maxLength(newMaxLength: number) {\n // There was no change in maxLength, return early.\n if (this._maxLength === newMaxLength) {\n return;\n }\n\n // Reconstruct array, starting at index 0. Only transfer values from the\n // indexes 0 to length.\n const newArray = new Array<T | undefined>(newMaxLength);\n for (let i = 0; i < Math.min(newMaxLength, this.length); i++) {\n newArray[i] = this._array[this._getCyclicIndex(i)];\n }\n this._array = newArray;\n this._maxLength = newMaxLength;\n this._startIndex = 0;\n }\n\n public get length(): number {\n return this._length;\n }\n\n public set length(newLength: number) {\n if (newLength > this._length) {\n for (let i = this._length; i < newLength; i++) {\n this._array[i] = undefined;\n }\n }\n this._length = newLength;\n }\n\n /**\n * Gets the value at an index.\n *\n * Note that for performance reasons there is no bounds checking here, the index reference is\n * circular so this should always return a value and never throw.\n * @param index The index of the value to get.\n * @return The value corresponding to the index.\n */\n public get(index: number): T | undefined {\n return this._array[this._getCyclicIndex(index)];\n }\n\n /**\n * Sets the value at an index.\n *\n * Note that for performance reasons there is no bounds checking here, the index reference is\n * circular so this should always return a value and never throw.\n * @param index The index to set.\n * @param value The value to set.\n */\n public set(index: number, value: T | undefined): void {\n this._array[this._getCyclicIndex(index)] = value;\n }\n\n /**\n * Pushes a new value onto the list, wrapping around to the start of the array, overriding index 0\n * if the maximum length is reached.\n * @param value The value to push onto the list.\n */\n public push(value: T): void {\n this._array[this._getCyclicIndex(this._length)] = value;\n if (this._length === this._maxLength) {\n this._startIndex = ++this._startIndex % this._maxLength;\n this.onTrimEmitter.fire(1);\n } else {\n this._length++;\n }\n }\n\n /**\n * Advance ringbuffer index and return current element for recycling.\n * Note: The buffer must be full for this method to work.\n * @throws When the buffer is not full.\n */\n public recycle(): T {\n if (this._length !== this._maxLength) {\n throw new Error('Can only recycle when the buffer is full');\n }\n this._startIndex = ++this._startIndex % this._maxLength;\n this.onTrimEmitter.fire(1);\n return this._array[this._getCyclicIndex(this._length - 1)]!;\n }\n\n /**\n * Ringbuffer is at max length.\n */\n public get isFull(): boolean {\n return this._length === this._maxLength;\n }\n\n /**\n * Removes and returns the last value on the list.\n * @return The popped value.\n */\n public pop(): T | undefined {\n return this._array[this._getCyclicIndex(this._length-- - 1)];\n }\n\n /**\n * Deletes and/or inserts items at a particular index (in that order). Unlike\n * Array.prototype.splice, this operation does not return the deleted items as a new array in\n * order to save creating a new array. Note that this operation may shift all values in the list\n * in the worst case.\n * @param start The index to delete and/or insert.\n * @param deleteCount The number of elements to delete.\n * @param items The items to insert.\n */\n public splice(start: number, deleteCount: number, ...items: T[]): void {\n // Delete items\n if (deleteCount) {\n for (let i = start; i < this._length - deleteCount; i++) {\n this._array[this._getCyclicIndex(i)] = this._array[this._getCyclicIndex(i + deleteCount)];\n }\n this._length -= deleteCount;\n }\n\n // Add items\n for (let i = this._length - 1; i >= start; i--) {\n this._array[this._getCyclicIndex(i + items.length)] = this._array[this._getCyclicIndex(i)];\n }\n for (let i = 0; i < items.length; i++) {\n this._array[this._getCyclicIndex(start + i)] = items[i];\n }\n\n // Adjust length as needed\n if (this._length + items.length > this._maxLength) {\n const countToTrim = (this._length + items.length) - this._maxLength;\n this._startIndex += countToTrim;\n this._length = this._maxLength;\n this.onTrimEmitter.fire(countToTrim);\n } else {\n this._length += items.length;\n }\n }\n\n /**\n * Trims a number of items from the start of the list.\n * @param count The number of items to remove.\n */\n public trimStart(count: number): void {\n if (count > this._length) {\n count = this._length;\n }\n this._startIndex += count;\n this._length -= count;\n this.onTrimEmitter.fire(count);\n }\n\n public shiftElements(start: number, count: number, offset: number): void {\n if (count <= 0) {\n return;\n }\n if (start < 0 || start >= this._length) {\n throw new Error('start argument out of range');\n }\n if (start + offset < 0) {\n throw new Error('Cannot shift elements in list beyond index 0');\n }\n\n if (offset > 0) {\n for (let i = count - 1; i >= 0; i--) {\n this.set(start + i + offset, this.get(start + i));\n }\n const expandListBy = (start + count + offset) - this._length;\n if (expandListBy > 0) {\n this._length += expandListBy;\n while (this._length > this._maxLength) {\n this._length--;\n this._startIndex++;\n this.onTrimEmitter.fire(1);\n }\n }\n } else {\n for (let i = 0; i < count; i++) {\n this.set(start + i + offset, this.get(start + i));\n }\n }\n }\n\n /**\n * Gets the cyclic index for the specified regular index. The cyclic index can then be used on the\n * backing array to get the element associated with the regular index.\n * @param index The regular index.\n * @returns The cyclic index.\n */\n private _getCyclicIndex(index: number): number {\n return (this._startIndex + index) % this._maxLength;\n }\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { BufferLine } from 'common/buffer/BufferLine';\nimport { CircularList } from 'common/CircularList';\nimport { IBufferLine, ICellData } from 'common/Types';\n\nexport interface INewLayoutResult {\n layout: number[];\n countRemoved: number;\n}\n\n/**\n * Evaluates and returns indexes to be removed after a reflow larger occurs. Lines will be removed\n * when a wrapped line unwraps.\n * @param lines The buffer lines.\n * @param newCols The columns after resize.\n */\nexport function reflowLargerGetLinesToRemove(lines: CircularList<IBufferLine>, oldCols: number, newCols: number, bufferAbsoluteY: number, nullCell: ICellData): number[] {\n // Gather all BufferLines that need to be removed from the Buffer here so that they can be\n // batched up and only committed once\n const toRemove: number[] = [];\n\n for (let y = 0; y < lines.length - 1; y++) {\n // Check if this row is wrapped\n let i = y;\n let nextLine = lines.get(++i) as BufferLine;\n if (!nextLine.isWrapped) {\n continue;\n }\n\n // Check how many lines it's wrapped for\n const wrappedLines: BufferLine[] = [lines.get(y) as BufferLine];\n while (i < lines.length && nextLine.isWrapped) {\n wrappedLines.push(nextLine);\n nextLine = lines.get(++i) as BufferLine;\n }\n\n // If these lines contain the cursor don't touch them, the program will handle fixing up wrapped\n // lines with the cursor\n if (bufferAbsoluteY >= y && bufferAbsoluteY < i) {\n y += wrappedLines.length - 1;\n continue;\n }\n\n // Copy buffer data to new locations\n let destLineIndex = 0;\n let destCol = getWrappedLineTrimmedLength(wrappedLines, destLineIndex, oldCols);\n let srcLineIndex = 1;\n let srcCol = 0;\n while (srcLineIndex < wrappedLines.length) {\n const srcTrimmedTineLength = getWrappedLineTrimmedLength(wrappedLines, srcLineIndex, oldCols);\n const srcRemainingCells = srcTrimmedTineLength - srcCol;\n const destRemainingCells = newCols - destCol;\n const cellsToCopy = Math.min(srcRemainingCells, destRemainingCells);\n\n wrappedLines[destLineIndex].copyCellsFrom(wrappedLines[srcLineIndex], srcCol, destCol, cellsToCopy, false);\n\n destCol += cellsToCopy;\n if (destCol === newCols) {\n destLineIndex++;\n destCol = 0;\n }\n srcCol += cellsToCopy;\n if (srcCol === srcTrimmedTineLength) {\n srcLineIndex++;\n srcCol = 0;\n }\n\n // Make sure the last cell isn't wide, if it is copy it to the current dest\n if (destCol === 0 && destLineIndex !== 0) {\n if (wrappedLines[destLineIndex - 1].getWidth(newCols - 1) === 2) {\n wrappedLines[destLineIndex].copyCellsFrom(wrappedLines[destLineIndex - 1], newCols - 1, destCol++, 1, false);\n // Null out the end of the last row\n wrappedLines[destLineIndex - 1].setCell(newCols - 1, nullCell);\n }\n }\n }\n\n // Clear out remaining cells or fragments could remain;\n wrappedLines[destLineIndex].replaceCells(destCol, newCols, nullCell);\n\n // Work backwards and remove any rows at the end that only contain null cells\n let countToRemove = 0;\n for (let i = wrappedLines.length - 1; i > 0; i--) {\n if (i > destLineIndex || wrappedLines[i].getTrimmedLength() === 0) {\n countToRemove++;\n } else {\n break;\n }\n }\n\n if (countToRemove > 0) {\n toRemove.push(y + wrappedLines.length - countToRemove); // index\n toRemove.push(countToRemove);\n }\n\n y += wrappedLines.length - 1;\n }\n return toRemove;\n}\n\n/**\n * Creates and return the new layout for lines given an array of indexes to be removed.\n * @param lines The buffer lines.\n * @param toRemove The indexes to remove.\n */\nexport function reflowLargerCreateNewLayout(lines: CircularList<IBufferLine>, toRemove: number[]): INewLayoutResult {\n const layout: number[] = [];\n // First iterate through the list and get the actual indexes to use for rows\n let nextToRemoveIndex = 0;\n let nextToRemoveStart = toRemove[nextToRemoveIndex];\n let countRemovedSoFar = 0;\n for (let i = 0; i < lines.length; i++) {\n if (nextToRemoveStart === i) {\n const countToRemove = toRemove[++nextToRemoveIndex];\n\n // Tell markers that there was a deletion\n lines.onDeleteEmitter.fire({\n index: i - countRemovedSoFar,\n amount: countToRemove\n });\n\n i += countToRemove - 1;\n countRemovedSoFar += countToRemove;\n nextToRemoveStart = toRemove[++nextToRemoveIndex];\n } else {\n layout.push(i);\n }\n }\n return {\n layout,\n countRemoved: countRemovedSoFar\n };\n}\n\n/**\n * Applies a new layout to the buffer. This essentially does the same as many splice calls but it's\n * done all at once in a single iteration through the list since splice is very expensive.\n * @param lines The buffer lines.\n * @param newLayout The new layout to apply.\n */\nexport function reflowLargerApplyNewLayout(lines: CircularList<IBufferLine>, newLayout: number[]): void {\n // Record original lines so they don't get overridden when we rearrange the list\n const newLayoutLines: BufferLine[] = [];\n for (let i = 0; i < newLayout.length; i++) {\n newLayoutLines.push(lines.get(newLayout[i]) as BufferLine);\n }\n\n // Rearrange the list\n for (let i = 0; i < newLayoutLines.length; i++) {\n lines.set(i, newLayoutLines[i]);\n }\n lines.length = newLayout.length;\n}\n\n/**\n * Gets the new line lengths for a given wrapped line. The purpose of this function it to pre-\n * compute the wrapping points since wide characters may need to be wrapped onto the following line.\n * This function will return an array of numbers of where each line wraps to, the resulting array\n * will only contain the values `newCols` (when the line does not end with a wide character) and\n * `newCols - 1` (when the line does end with a wide character), except for the last value which\n * will contain the remaining items to fill the line.\n *\n * Calling this with a `newCols` value of `1` will lock up.\n *\n * @param wrappedLines The wrapped lines to evaluate.\n * @param oldCols The columns before resize.\n * @param newCols The columns after resize.\n */\nexport function reflowSmallerGetNewLineLengths(wrappedLines: BufferLine[], oldCols: number, newCols: number): number[] {\n const newLineLengths: number[] = [];\n const cellsNeeded = wrappedLines.map((l, i) => getWrappedLineTrimmedLength(wrappedLines, i, oldCols)).reduce((p, c) => p + c);\n\n // Use srcCol and srcLine to find the new wrapping point, use that to get the cellsAvailable and\n // linesNeeded\n let srcCol = 0;\n let srcLine = 0;\n let cellsAvailable = 0;\n while (cellsAvailable < cellsNeeded) {\n if (cellsNeeded - cellsAvailable < newCols) {\n // Add the final line and exit the loop\n newLineLengths.push(cellsNeeded - cellsAvailable);\n break;\n }\n srcCol += newCols;\n const oldTrimmedLength = getWrappedLineTrimmedLength(wrappedLines, srcLine, oldCols);\n if (srcCol > oldTrimmedLength) {\n srcCol -= oldTrimmedLength;\n srcLine++;\n }\n const endsWithWide = wrappedLines[srcLine].getWidth(srcCol - 1) === 2;\n if (endsWithWide) {\n srcCol--;\n }\n const lineLength = endsWithWide ? newCols - 1 : newCols;\n newLineLengths.push(lineLength);\n cellsAvailable += lineLength;\n }\n\n return newLineLengths;\n}\n\nexport function getWrappedLineTrimmedLength(lines: BufferLine[], i: number, cols: number): number {\n // If this is the last row in the wrapped line, get the actual trimmed length\n if (i === lines.length - 1) {\n return lines[i].getTrimmedLength();\n }\n // Detect whether the following line starts with a wide character and the end of the current line\n // is null, if so then we can be pretty sure the null character should be excluded from the line\n // length]\n const endsInNull = !(lines[i].hasContent(cols - 1)) && lines[i].getWidth(cols - 1) === 1;\n const followingLineStartsWithWide = lines[i + 1].getWidth(0) === 2;\n if (endsInNull && followingLineStartsWithWide) {\n return cols - 1;\n }\n return cols;\n}\n","/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { EventEmitter, IEvent } from 'common/EventEmitter';\nimport { Disposable } from 'common/Lifecycle';\nimport { IMarker } from 'common/Types';\n\nexport class Marker extends Disposable implements IMarker {\n private static _nextId = 1;\n\n private _id: number = Marker._nextId++;\n public isDisposed: boolean = false;\n\n public get id(): number { return this._id; }\n\n private _onDispose = new EventEmitter<void>();\n public get onDispose(): IEvent<void> { return this._onDispose.event; }\n\n constructor(\n public line: number\n ) {\n super();\n }\n\n public dispose(): void {\n if (this.isDisposed) {\n return;\n }\n this.isDisposed = true;\n this.line = -1;\n // Emit before super.dispose such that dispose listeners get a change to react\n this._onDispose.fire();\n }\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IOptionsService, ITerminalOptions, IPartialTerminalOptions } from 'common/services/Services';\nimport { EventEmitter, IEvent } from 'common/EventEmitter';\nimport { isMac } from 'common/Platform';\nimport { clone } from 'common/Clone';\n\n// Source: https://freesound.org/people/altemark/sounds/45759/\n// This sound is released under the Creative Commons Attribution 3.0 Unported\n// (CC BY 3.0) license. It was created by 'altemark'. No modifications have been\n// made, apart from the conversion to base64.\nexport const DEFAULT_BELL_SOUND = 'data:audio/mp3;base64,SUQzBAAAAAAAI1RTU0UAAAAPAAADTGF2ZjU4LjMyLjEwNAAAAAAAAAAAAAAA//tQxAADB8AhSmxhIIEVCSiJrDCQBTcu3UrAIwUdkRgQbFAZC1CQEwTJ9mjRvBA4UOLD8nKVOWfh+UlK3z/177OXrfOdKl7pyn3Xf//WreyTRUoAWgBgkOAGbZHBgG1OF6zM82DWbZaUmMBptgQhGjsyYqc9ae9XFz280948NMBWInljyzsNRFLPWdnZGWrddDsjK1unuSrVN9jJsK8KuQtQCtMBjCEtImISdNKJOopIpBFpNSMbIHCSRpRR5iakjTiyzLhchUUBwCgyKiweBv/7UsQbg8isVNoMPMjAAAA0gAAABEVFGmgqK////9bP/6XCykxBTUUzLjEwMKqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq';\n\n// TODO: Freeze?\nexport const DEFAULT_OPTIONS: ITerminalOptions = Object.freeze({\n cols: 80,\n rows: 24,\n cursorBlink: false,\n cursorStyle: 'block',\n cursorWidth: 1,\n bellSound: DEFAULT_BELL_SOUND,\n bellStyle: 'none',\n drawBoldTextInBrightColors: true,\n fastScrollModifier: 'alt',\n fastScrollSensitivity: 5,\n fontFamily: 'courier-new, courier, monospace',\n fontSize: 15,\n fontWeight: 'normal',\n fontWeightBold: 'bold',\n lineHeight: 1.0,\n linkTooltipHoverDuration: 500,\n letterSpacing: 0,\n logLevel: 'info',\n scrollback: 1000,\n scrollSensitivity: 1,\n screenReaderMode: false,\n macOptionIsMeta: false,\n macOptionClickForcesSelection: false,\n minimumContrastRatio: 1,\n disableStdin: false,\n allowProposedApi: true,\n allowTransparency: false,\n tabStopWidth: 8,\n theme: {},\n rightClickSelectsWord: isMac,\n rendererType: 'canvas',\n windowOptions: {},\n windowsMode: false,\n wordSeparator: ' ()[]{}\\',\"`',\n\n convertEol: false,\n termName: 'xterm',\n cancelEvents: false\n});\n\n/**\n * The set of options that only have an effect when set in the Terminal constructor.\n */\nconst CONSTRUCTOR_ONLY_OPTIONS = ['cols', 'rows'];\n\nexport class OptionsService implements IOptionsService {\n public serviceBrand: any;\n\n public options: ITerminalOptions;\n\n private _onOptionChange = new EventEmitter<string>();\n public get onOptionChange(): IEvent<string> { return this._onOptionChange.event; }\n\n constructor(options: IPartialTerminalOptions) {\n this.options = clone(DEFAULT_OPTIONS);\n for (const k of Object.keys(options)) {\n if (k in this.options) {\n const newValue = options[k as keyof IPartialTerminalOptions] as any;\n this.options[k] = newValue;\n }\n }\n }\n\n public setOption(key: string, value: any): void {\n if (!(key in DEFAULT_OPTIONS)) {\n throw new Error('No option with key \"' + key + '\"');\n }\n if (CONSTRUCTOR_ONLY_OPTIONS.indexOf(key) !== -1) {\n throw new Error(`Option \"${key}\" can only be set in the constructor`);\n }\n if (this.options[key] === value) {\n return;\n }\n\n value = this._sanitizeAndValidateOption(key, value);\n\n // Don't fire an option change event if they didn't change\n if (this.options[key] === value) {\n return;\n }\n\n this.options[key] = value;\n this._onOptionChange.fire(key);\n }\n\n private _sanitizeAndValidateOption(key: string, value: any): any {\n switch (key) {\n case 'bellStyle':\n case 'cursorStyle':\n case 'fontWeight':\n case 'fontWeightBold':\n case 'rendererType':\n case 'wordSeparator':\n if (!value) {\n value = DEFAULT_OPTIONS[key];\n }\n break;\n case 'cursorWidth':\n value = Math.floor(value);\n // Fall through for bounds check\n case 'lineHeight':\n case 'tabStopWidth':\n if (value < 1) {\n throw new Error(`${key} cannot be less than 1, value: ${value}`);\n }\n break;\n case 'minimumContrastRatio':\n value = Math.max(1, Math.min(21, Math.round(value * 10) / 10));\n break;\n case 'scrollback':\n value = Math.min(value, 4294967295);\n if (value < 0) {\n throw new Error(`${key} cannot be less than 0, value: ${value}`);\n }\n break;\n case 'fastScrollSensitivity':\n case 'scrollSensitivity':\n if (value <= 0) {\n throw new Error(`${key} cannot be less than or equal to 0, value: ${value}`);\n }\n break;\n }\n return value;\n }\n\n public getOption(key: string): any {\n if (!(key in DEFAULT_OPTIONS)) {\n throw new Error(`No option with key \"${key}\"`);\n }\n return this.options[key];\n }\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { ICoreService, ILogService, IOptionsService, IBufferService } from 'common/services/Services';\nimport { EventEmitter, IEvent } from 'common/EventEmitter';\nimport { IDecPrivateModes, IModes } from 'common/Types';\nimport { clone } from 'common/Clone';\nimport { Disposable } from 'common/Lifecycle';\n\nconst DEFAULT_MODES: IModes = Object.freeze({\n insertMode: false\n});\n\nconst DEFAULT_DEC_PRIVATE_MODES: IDecPrivateModes = Object.freeze({\n applicationCursorKeys: false,\n applicationKeypad: false,\n bracketedPasteMode: false,\n origin: false,\n reverseWraparound: false,\n sendFocus: false,\n wraparound: true // defaults: xterm - true, vt100 - false\n});\n\nexport class CoreService extends Disposable implements ICoreService {\n public serviceBrand: any;\n\n public isCursorInitialized: boolean = false;\n public isCursorHidden: boolean = false;\n public modes: IModes;\n public decPrivateModes: IDecPrivateModes;\n\n // Circular dependency, this must be unset or memory will leak after Terminal.dispose\n private _scrollToBottom: (() => void) | undefined;\n\n private _onData = this.register(new EventEmitter<string>());\n public get onData(): IEvent<string> { return this._onData.event; }\n private _onUserInput = this.register(new EventEmitter<void>());\n public get onUserInput(): IEvent<void> { return this._onUserInput.event; }\n private _onBinary = this.register(new EventEmitter<string>());\n public get onBinary(): IEvent<string> { return this._onBinary.event; }\n\n constructor(\n // TODO: Move this into a service\n scrollToBottom: () => void,\n @IBufferService private readonly _bufferService: IBufferService,\n @ILogService private readonly _logService: ILogService,\n @IOptionsService private readonly _optionsService: IOptionsService\n ) {\n super();\n this._scrollToBottom = scrollToBottom;\n this.register({ dispose: () => this._scrollToBottom = undefined });\n this.modes = clone(DEFAULT_MODES);\n this.decPrivateModes = clone(DEFAULT_DEC_PRIVATE_MODES);\n }\n\n public reset(): void {\n this.modes = clone(DEFAULT_MODES);\n this.decPrivateModes = clone(DEFAULT_DEC_PRIVATE_MODES);\n }\n\n public triggerDataEvent(data: string, wasUserInput: boolean = false): void {\n // Prevents all events to pty process if stdin is disabled\n if (this._optionsService.options.disableStdin) {\n return;\n }\n\n // Input is being sent to the terminal, the terminal should focus the prompt.\n const buffer = this._bufferService.buffer;\n if (buffer.ybase !== buffer.ydisp) {\n this._scrollToBottom!();\n }\n\n // Fire onUserInput so listeners can react as well (eg. clear selection)\n if (wasUserInput) {\n this._onUserInput.fire();\n }\n\n // Fire onData API\n this._logService.debug(`sending data \"${data}\"`, () => data.split('').map(e => e.charCodeAt(0)));\n this._onData.fire(data);\n }\n\n public triggerBinaryEvent(data: string): void {\n if (this._optionsService.options.disableStdin) {\n return;\n }\n this._logService.debug(`sending binary \"${data}\"`, () => data.split('').map(e => e.charCodeAt(0)));\n this._onBinary.fire(data);\n }\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\nimport { IBufferService, ICoreService, ICoreMouseService } from 'common/services/Services';\nimport { EventEmitter, IEvent } from 'common/EventEmitter';\nimport { ICoreMouseProtocol, ICoreMouseEvent, CoreMouseEncoding, CoreMouseEventType, CoreMouseButton, CoreMouseAction } from 'common/Types';\n\n/**\n * Supported default protocols.\n */\nconst DEFAULT_PROTOCOLS: {[key: string]: ICoreMouseProtocol} = {\n /**\n * NONE\n * Events: none\n * Modifiers: none\n */\n NONE: {\n events: CoreMouseEventType.NONE,\n restrict: () => false\n },\n /**\n * X10\n * Events: mousedown\n * Modifiers: none\n */\n X10: {\n events: CoreMouseEventType.DOWN,\n restrict: (e: ICoreMouseEvent) => {\n // no wheel, no move, no up\n if (e.button === CoreMouseButton.WHEEL || e.action !== CoreMouseAction.DOWN) {\n return false;\n }\n // no modifiers\n e.ctrl = false;\n e.alt = false;\n e.shift = false;\n return true;\n }\n },\n /**\n * VT200\n * Events: mousedown / mouseup / wheel\n * Modifiers: all\n */\n VT200: {\n events: CoreMouseEventType.DOWN | CoreMouseEventType.UP | CoreMouseEventType.WHEEL,\n restrict: (e: ICoreMouseEvent) => {\n // no move\n if (e.action === CoreMouseAction.MOVE) {\n return false;\n }\n return true;\n }\n },\n /**\n * DRAG\n * Events: mousedown / mouseup / wheel / mousedrag\n * Modifiers: all\n */\n DRAG: {\n events: CoreMouseEventType.DOWN | CoreMouseEventType.UP | CoreMouseEventType.WHEEL | CoreMouseEventType.DRAG,\n restrict: (e: ICoreMouseEvent) => {\n // no move without button\n if (e.action === CoreMouseAction.MOVE && e.button === CoreMouseButton.NONE) {\n return false;\n }\n return true;\n }\n },\n /**\n * ANY\n * Events: all mouse related events\n * Modifiers: all\n */\n ANY: {\n events:\n CoreMouseEventType.DOWN | CoreMouseEventType.UP | CoreMouseEventType.WHEEL\n | CoreMouseEventType.DRAG | CoreMouseEventType.MOVE,\n restrict: (e: ICoreMouseEvent) => true\n }\n};\n\nconst enum Modifiers {\n SHIFT = 4,\n ALT = 8,\n CTRL = 16\n}\n\n// helper for default encoders to generate the event code.\nfunction eventCode(e: ICoreMouseEvent, isSGR: boolean): number {\n let code = (e.ctrl ? Modifiers.CTRL : 0) | (e.shift ? Modifiers.SHIFT : 0) | (e.alt ? Modifiers.ALT : 0);\n if (e.button === CoreMouseButton.WHEEL) {\n code |= 64;\n code |= e.action;\n } else {\n code |= e.button & 3;\n if (e.button & 4) {\n code |= 64;\n }\n if (e.button & 8) {\n code |= 128;\n }\n if (e.action === CoreMouseAction.MOVE) {\n code |= CoreMouseAction.MOVE;\n } else if (e.action === CoreMouseAction.UP && !isSGR) {\n // special case - only SGR can report button on release\n // all others have to go with NONE\n code |= CoreMouseButton.NONE;\n }\n }\n return code;\n}\n\nconst S = String.fromCharCode;\n\n/**\n * Supported default encodings.\n */\nconst DEFAULT_ENCODINGS: {[key: string]: CoreMouseEncoding} = {\n /**\n * DEFAULT - CSI M Pb Px Py\n * Single byte encoding for coords and event code.\n * Can encode values up to 223 (1-based).\n */\n DEFAULT: (e: ICoreMouseEvent) => {\n const params = [eventCode(e, false) + 32, e.col + 32, e.row + 32];\n // supress mouse report if we exceed addressible range\n // Note this is handled differently by emulators\n // - xterm: sends 0;0 coords instead\n // - vte, konsole: no report\n if (params[0] > 255 || params[1] > 255 || params[2] > 255) {\n return '';\n }\n return `\\x1b[M${S(params[0])}${S(params[1])}${S(params[2])}`;\n },\n /**\n * SGR - CSI < Pb ; Px ; Py M|m\n * No encoding limitation.\n * Can report button on release and works with a well formed sequence.\n */\n SGR: (e: ICoreMouseEvent) => {\n const final = (e.action === CoreMouseAction.UP && e.button !== CoreMouseButton.WHEEL) ? 'm' : 'M';\n return `\\x1b[<${eventCode(e, true)};${e.col};${e.row}${final}`;\n }\n};\n\n/**\n * CoreMouseService\n *\n * Provides mouse tracking reports with different protocols and encodings.\n * - protocols: NONE (default), X10, VT200, DRAG, ANY\n * - encodings: DEFAULT, SGR (UTF8, URXVT removed in #2507)\n *\n * Custom protocols/encodings can be added by `addProtocol` / `addEncoding`.\n * To activate a protocol/encoding, set `activeProtocol` / `activeEncoding`.\n * Switching a protocol will send a notification event `onProtocolChange`\n * with a list of needed events to track.\n *\n * The service handles the mouse tracking state and decides whether to send\n * a tracking report to the backend based on protocol and encoding limitations.\n * To send a mouse event call `triggerMouseEvent`.\n */\nexport class CoreMouseService implements ICoreMouseService {\n private _protocols: {[name: string]: ICoreMouseProtocol} = {};\n private _encodings: {[name: string]: CoreMouseEncoding} = {};\n private _activeProtocol: string = '';\n private _activeEncoding: string = '';\n private _onProtocolChange = new EventEmitter<CoreMouseEventType>();\n private _lastEvent: ICoreMouseEvent | null = null;\n\n constructor(\n @IBufferService private readonly _bufferService: IBufferService,\n @ICoreService private readonly _coreService: ICoreService\n ) {\n // register default protocols and encodings\n for (const name of Object.keys(DEFAULT_PROTOCOLS)) this.addProtocol(name, DEFAULT_PROTOCOLS[name]);\n for (const name of Object.keys(DEFAULT_ENCODINGS)) this.addEncoding(name, DEFAULT_ENCODINGS[name]);\n // call reset to set defaults\n this.reset();\n }\n\n public addProtocol(name: string, protocol: ICoreMouseProtocol): void {\n this._protocols[name] = protocol;\n }\n\n public addEncoding(name: string, encoding: CoreMouseEncoding): void {\n this._encodings[name] = encoding;\n }\n\n public get activeProtocol(): string {\n return this._activeProtocol;\n }\n\n public get areMouseEventsActive(): boolean {\n return this._protocols[this._activeProtocol].events !== 0;\n }\n\n public set activeProtocol(name: string) {\n if (!this._protocols[name]) {\n throw new Error(`unknown protocol \"${name}\"`);\n }\n this._activeProtocol = name;\n this._onProtocolChange.fire(this._protocols[name].events);\n }\n\n public get activeEncoding(): string {\n return this._activeEncoding;\n }\n\n public set activeEncoding(name: string) {\n if (!this._encodings[name]) {\n throw new Error(`unknown encoding \"${name}\"`);\n }\n this._activeEncoding = name;\n }\n\n public reset(): void {\n this.activeProtocol = 'NONE';\n this.activeEncoding = 'DEFAULT';\n this._lastEvent = null;\n }\n\n /**\n * Event to announce changes in mouse tracking.\n */\n public get onProtocolChange(): IEvent<CoreMouseEventType> {\n return this._onProtocolChange.event;\n }\n\n /**\n * Triggers a mouse event to be sent.\n *\n * Returns true if the event passed all protocol restrictions and a report\n * was sent, otherwise false. The return value may be used to decide whether\n * the default event action in the bowser component should be omitted.\n *\n * Note: The method will change values of the given event object\n * to fullfill protocol and encoding restrictions.\n */\n public triggerMouseEvent(e: ICoreMouseEvent): boolean {\n // range check for col/row\n if (e.col < 0 || e.col >= this._bufferService.cols\n || e.row < 0 || e.row >= this._bufferService.rows) {\n return false;\n }\n\n // filter nonsense combinations of button + action\n if (e.button === CoreMouseButton.WHEEL && e.action === CoreMouseAction.MOVE) {\n return false;\n }\n if (e.button === CoreMouseButton.NONE && e.action !== CoreMouseAction.MOVE) {\n return false;\n }\n if (e.button !== CoreMouseButton.WHEEL && (e.action === CoreMouseAction.LEFT || e.action === CoreMouseAction.RIGHT)) {\n return false;\n }\n\n // report 1-based coords\n e.col++;\n e.row++;\n\n // debounce move at grid level\n if (e.action === CoreMouseAction.MOVE && this._lastEvent && this._compareEvents(this._lastEvent, e)) {\n return false;\n }\n\n // apply protocol restrictions\n if (!this._protocols[this._activeProtocol].restrict(e)) {\n return false;\n }\n\n // encode report and send\n const report = this._encodings[this._activeEncoding](e);\n if (report) {\n // always send DEFAULT as binary data\n if (this._activeEncoding === 'DEFAULT') {\n this._coreService.triggerBinaryEvent(report);\n } else {\n this._coreService.triggerDataEvent(report, true);\n }\n }\n\n this._lastEvent = e;\n\n return true;\n }\n\n public explainEvents(events: CoreMouseEventType): {[event: string]: boolean} {\n return {\n down: !!(events & CoreMouseEventType.DOWN),\n up: !!(events & CoreMouseEventType.UP),\n drag: !!(events & CoreMouseEventType.DRAG),\n move: !!(events & CoreMouseEventType.MOVE),\n wheel: !!(events & CoreMouseEventType.WHEEL)\n };\n }\n\n private _compareEvents(e1: ICoreMouseEvent, e2: ICoreMouseEvent): boolean {\n if (e1.col !== e2.col) return false;\n if (e1.row !== e2.row) return false;\n if (e1.button !== e2.button) return false;\n if (e1.action !== e2.action) return false;\n if (e1.ctrl !== e2.ctrl) return false;\n if (e1.alt !== e2.alt) return false;\n if (e1.shift !== e2.shift) return false;\n return true;\n }\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IBufferService, IDirtyRowService } from 'common/services/Services';\n\nexport class DirtyRowService implements IDirtyRowService {\n public serviceBrand: any;\n\n private _start!: number;\n private _end!: number;\n\n public get start(): number { return this._start; }\n public get end(): number { return this._end; }\n\n constructor(\n @IBufferService private readonly _bufferService: IBufferService\n ) {\n this.clearRange();\n }\n\n public clearRange(): void {\n this._start = this._bufferService.buffer.y;\n this._end = this._bufferService.buffer.y;\n }\n\n public markDirty(y: number): void {\n if (y < this._start) {\n this._start = y;\n } else if (y > this._end) {\n this._end = y;\n }\n }\n\n public markRangeDirty(y1: number, y2: number): void {\n if (y1 > y2) {\n const temp = y1;\n y1 = y2;\n y2 = temp;\n }\n if (y1 < this._start) {\n this._start = y1;\n }\n if (y2 > this._end) {\n this._end = y2;\n }\n }\n\n public markAllDirty(): void {\n this.markRangeDirty(0, this._bufferService.rows - 1);\n }\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\nimport { IUnicodeService, IUnicodeVersionProvider } from 'common/services/Services';\nimport { EventEmitter, IEvent } from 'common/EventEmitter';\nimport { UnicodeV6 } from 'common/input/UnicodeV6';\n\n\nexport class UnicodeService implements IUnicodeService {\n public serviceBrand: any;\n\n private _providers: {[key: string]: IUnicodeVersionProvider} = Object.create(null);\n private _active: string = '';\n private _activeProvider: IUnicodeVersionProvider;\n private _onChange = new EventEmitter<string>();\n public get onChange(): IEvent<string> { return this._onChange.event; }\n\n constructor() {\n const defaultProvider = new UnicodeV6();\n this.register(defaultProvider);\n this._active = defaultProvider.version;\n this._activeProvider = defaultProvider;\n }\n\n public get versions(): string[] {\n return Object.keys(this._providers);\n }\n\n public get activeVersion(): string {\n return this._active;\n }\n\n public set activeVersion(version: string) {\n if (!this._providers[version]) {\n throw new Error(`unknown Unicode version \"${version}\"`);\n }\n this._active = version;\n this._activeProvider = this._providers[version];\n this._onChange.fire(version);\n }\n\n public register(provider: IUnicodeVersionProvider): void {\n this._providers[provider.version] = provider;\n }\n\n /**\n * Unicode version dependent interface.\n */\n public wcwidth(num: number): number {\n return this._activeProvider.wcwidth(num);\n }\n\n public getStringCellWidth(s: string): number {\n let result = 0;\n const length = s.length;\n for (let i = 0; i < length; ++i) {\n let code = s.charCodeAt(i);\n // surrogate pair first\n if (0xD800 <= code && code <= 0xDBFF) {\n if (++i >= length) {\n // this should not happen with strings retrieved from\n // Buffer.translateToString as it converts from UTF-32\n // and therefore always should contain the second part\n // for any other string we still have to handle it somehow:\n // simply treat the lonely surrogate first as a single char (UCS-2 behavior)\n return result + this.wcwidth(code);\n }\n const second = s.charCodeAt(i);\n // convert surrogate pair to high codepoint only for valid second part (UTF-16)\n // otherwise treat them independently (UCS-2 behavior)\n if (0xDC00 <= second && second <= 0xDFFF) {\n code = (code - 0xD800) * 0x400 + second - 0xDC00 + 0x10000;\n } else {\n result += this.wcwidth(second);\n }\n }\n result += this.wcwidth(code);\n }\n return result;\n }\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\nimport { IUnicodeVersionProvider } from 'common/services/Services';\nimport { fill } from 'common/TypedArrayUtils';\n\ntype CharWidth = 0 | 1 | 2;\n\nconst BMP_COMBINING = [\n [0x0300, 0x036F], [0x0483, 0x0486], [0x0488, 0x0489],\n [0x0591, 0x05BD], [0x05BF, 0x05BF], [0x05C1, 0x05C2],\n [0x05C4, 0x05C5], [0x05C7, 0x05C7], [0x0600, 0x0603],\n [0x0610, 0x0615], [0x064B, 0x065E], [0x0670, 0x0670],\n [0x06D6, 0x06E4], [0x06E7, 0x06E8], [0x06EA, 0x06ED],\n [0x070F, 0x070F], [0x0711, 0x0711], [0x0730, 0x074A],\n [0x07A6, 0x07B0], [0x07EB, 0x07F3], [0x0901, 0x0902],\n [0x093C, 0x093C], [0x0941, 0x0948], [0x094D, 0x094D],\n [0x0951, 0x0954], [0x0962, 0x0963], [0x0981, 0x0981],\n [0x09BC, 0x09BC], [0x09C1, 0x09C4], [0x09CD, 0x09CD],\n [0x09E2, 0x09E3], [0x0A01, 0x0A02], [0x0A3C, 0x0A3C],\n [0x0A41, 0x0A42], [0x0A47, 0x0A48], [0x0A4B, 0x0A4D],\n [0x0A70, 0x0A71], [0x0A81, 0x0A82], [0x0ABC, 0x0ABC],\n [0x0AC1, 0x0AC5], [0x0AC7, 0x0AC8], [0x0ACD, 0x0ACD],\n [0x0AE2, 0x0AE3], [0x0B01, 0x0B01], [0x0B3C, 0x0B3C],\n [0x0B3F, 0x0B3F], [0x0B41, 0x0B43], [0x0B4D, 0x0B4D],\n [0x0B56, 0x0B56], [0x0B82, 0x0B82], [0x0BC0, 0x0BC0],\n [0x0BCD, 0x0BCD], [0x0C3E, 0x0C40], [0x0C46, 0x0C48],\n [0x0C4A, 0x0C4D], [0x0C55, 0x0C56], [0x0CBC, 0x0CBC],\n [0x0CBF, 0x0CBF], [0x0CC6, 0x0CC6], [0x0CCC, 0x0CCD],\n [0x0CE2, 0x0CE3], [0x0D41, 0x0D43], [0x0D4D, 0x0D4D],\n [0x0DCA, 0x0DCA], [0x0DD2, 0x0DD4], [0x0DD6, 0x0DD6],\n [0x0E31, 0x0E31], [0x0E34, 0x0E3A], [0x0E47, 0x0E4E],\n [0x0EB1, 0x0EB1], [0x0EB4, 0x0EB9], [0x0EBB, 0x0EBC],\n [0x0EC8, 0x0ECD], [0x0F18, 0x0F19], [0x0F35, 0x0F35],\n [0x0F37, 0x0F37], [0x0F39, 0x0F39], [0x0F71, 0x0F7E],\n [0x0F80, 0x0F84], [0x0F86, 0x0F87], [0x0F90, 0x0F97],\n [0x0F99, 0x0FBC], [0x0FC6, 0x0FC6], [0x102D, 0x1030],\n [0x1032, 0x1032], [0x1036, 0x1037], [0x1039, 0x1039],\n [0x1058, 0x1059], [0x1160, 0x11FF], [0x135F, 0x135F],\n [0x1712, 0x1714], [0x1732, 0x1734], [0x1752, 0x1753],\n [0x1772, 0x1773], [0x17B4, 0x17B5], [0x17B7, 0x17BD],\n [0x17C6, 0x17C6], [0x17C9, 0x17D3], [0x17DD, 0x17DD],\n [0x180B, 0x180D], [0x18A9, 0x18A9], [0x1920, 0x1922],\n [0x1927, 0x1928], [0x1932, 0x1932], [0x1939, 0x193B],\n [0x1A17, 0x1A18], [0x1B00, 0x1B03], [0x1B34, 0x1B34],\n [0x1B36, 0x1B3A], [0x1B3C, 0x1B3C], [0x1B42, 0x1B42],\n [0x1B6B, 0x1B73], [0x1DC0, 0x1DCA], [0x1DFE, 0x1DFF],\n [0x200B, 0x200F], [0x202A, 0x202E], [0x2060, 0x2063],\n [0x206A, 0x206F], [0x20D0, 0x20EF], [0x302A, 0x302F],\n [0x3099, 0x309A], [0xA806, 0xA806], [0xA80B, 0xA80B],\n [0xA825, 0xA826], [0xFB1E, 0xFB1E], [0xFE00, 0xFE0F],\n [0xFE20, 0xFE23], [0xFEFF, 0xFEFF], [0xFFF9, 0xFFFB]\n];\nconst HIGH_COMBINING = [\n [0x10A01, 0x10A03], [0x10A05, 0x10A06], [0x10A0C, 0x10A0F],\n [0x10A38, 0x10A3A], [0x10A3F, 0x10A3F], [0x1D167, 0x1D169],\n [0x1D173, 0x1D182], [0x1D185, 0x1D18B], [0x1D1AA, 0x1D1AD],\n [0x1D242, 0x1D244], [0xE0001, 0xE0001], [0xE0020, 0xE007F],\n [0xE0100, 0xE01EF]\n];\n\n// BMP lookup table, lazy initialized during first addon loading\nlet table: Uint8Array;\n\nfunction bisearch(ucs: number, data: number[][]): boolean {\n let min = 0;\n let max = data.length - 1;\n let mid;\n if (ucs < data[0][0] || ucs > data[max][1]) {\n return false;\n }\n while (max >= min) {\n mid = (min + max) >> 1;\n if (ucs > data[mid][1]) {\n min = mid + 1;\n } else if (ucs < data[mid][0]) {\n max = mid - 1;\n } else {\n return true;\n }\n }\n return false;\n}\n\nexport class UnicodeV6 implements IUnicodeVersionProvider {\n public readonly version = '6';\n\n constructor() {\n // init lookup table once\n if (!table) {\n table = new Uint8Array(65536);\n fill(table, 1);\n table[0] = 0;\n // control chars\n fill(table, 0, 1, 32);\n fill(table, 0, 0x7f, 0xa0);\n\n // apply wide char rules first\n // wide chars\n fill(table, 2, 0x1100, 0x1160);\n table[0x2329] = 2;\n table[0x232a] = 2;\n fill(table, 2, 0x2e80, 0xa4d0);\n table[0x303f] = 1; // wrongly in last line\n\n fill(table, 2, 0xac00, 0xd7a4);\n fill(table, 2, 0xf900, 0xfb00);\n fill(table, 2, 0xfe10, 0xfe1a);\n fill(table, 2, 0xfe30, 0xfe70);\n fill(table, 2, 0xff00, 0xff61);\n fill(table, 2, 0xffe0, 0xffe7);\n\n // apply combining last to ensure we overwrite\n // wrongly wide set chars:\n // the original algo evals combining first and falls\n // through to wide check so we simply do here the opposite\n // combining 0\n for (let r = 0; r < BMP_COMBINING.length; ++r) {\n fill(table, 0, BMP_COMBINING[r][0], BMP_COMBINING[r][1] + 1);\n }\n }\n }\n\n public wcwidth(num: number): CharWidth {\n if (num < 32) return 0;\n if (num < 127) return 1;\n if (num < 65536) return table[num] as CharWidth;\n if (bisearch(num, HIGH_COMBINING)) return 0;\n if ((num >= 0x20000 && num <= 0x2fffd) || (num >= 0x30000 && num <= 0x3fffd)) return 2;\n return 1;\n }\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { ICharsetService } from 'common/services/Services';\nimport { ICharset } from 'common/Types';\n\nexport class CharsetService implements ICharsetService {\n public serviceBrand: any;\n\n public charset: ICharset | undefined;\n public glevel: number = 0;\n\n private _charsets: (ICharset | undefined)[] = [];\n\n public reset(): void {\n this.charset = undefined;\n this._charsets = [];\n this.glevel = 0;\n }\n\n public setgLevel(g: number): void {\n this.glevel = g;\n this.charset = this._charsets[g];\n }\n\n public setgCharset(g: number, charset: ICharset | undefined): void {\n this._charsets[g] = charset;\n if (this.glevel === g) {\n this.charset = charset;\n }\n }\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { CHAR_DATA_CODE_INDEX, NULL_CELL_CODE, WHITESPACE_CELL_CODE } from 'common/buffer/Constants';\nimport { IBufferService } from 'common/services/Services';\n\nexport function updateWindowsModeWrappedState(bufferService: IBufferService): void {\n // Winpty does not support wraparound mode which means that lines will never\n // be marked as wrapped. This causes issues for things like copying a line\n // retaining the wrapped new line characters or if consumers are listening\n // in on the data stream.\n //\n // The workaround for this is to listen to every incoming line feed and mark\n // the line as wrapped if the last character in the previous line is not a\n // space. This is certainly not without its problems, but generally on\n // Windows when text reaches the end of the terminal it's likely going to be\n // wrapped.\n const line = bufferService.buffer.lines.get(bufferService.buffer.ybase + bufferService.buffer.y - 1);\n const lastChar = line?.get(bufferService.cols - 1);\n\n const nextLine = bufferService.buffer.lines.get(bufferService.buffer.ybase + bufferService.buffer.y);\n if (nextLine && lastChar) {\n nextLine.isWrapped = (lastChar[CHAR_DATA_CODE_INDEX] !== NULL_CELL_CODE && lastChar[CHAR_DATA_CODE_INDEX] !== WHITESPACE_CELL_CODE);\n }\n}\n","\n/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\ndeclare const setTimeout: (handler: () => void, timeout?: number) => void;\n\n/**\n * Safety watermark to avoid memory exhaustion and browser engine crash on fast data input.\n * Enable flow control to avoid this limit and make sure that your backend correctly\n * propagates this to the underlying pty. (see docs for further instructions)\n * Since this limit is meant as a safety parachute to prevent browser crashs,\n * it is set to a very high number. Typically xterm.js gets unresponsive with\n * a 100 times lower number (>500 kB).\n */\nconst DISCARD_WATERMARK = 50000000; // ~50 MB\n\n/**\n * The max number of ms to spend on writes before allowing the renderer to\n * catch up with a 0ms setTimeout. A value of < 33 to keep us close to\n * 30fps, and a value of < 16 to try to run at 60fps. Of course, the real FPS\n * depends on the time it takes for the renderer to draw the frame.\n */\nconst WRITE_TIMEOUT_MS = 12;\n\n/**\n * Threshold of max held chunks in the write buffer, that were already processed.\n * This is a tradeoff between extensive write buffer shifts (bad runtime) and high\n * memory consumption by data thats not used anymore.\n */\nconst WRITE_BUFFER_LENGTH_THRESHOLD = 50;\n\nexport class WriteBuffer {\n private _writeBuffer: (string | Uint8Array)[] = [];\n private _callbacks: ((() => void) | undefined)[] = [];\n private _pendingData = 0;\n private _bufferOffset = 0;\n\n constructor(private _action: (data: string | Uint8Array) => void) { }\n\n public writeSync(data: string | Uint8Array): void {\n // force sync processing on pending data chunks to avoid in-band data scrambling\n // does the same as innerWrite but without event loop\n if (this._writeBuffer.length) {\n for (let i = this._bufferOffset; i < this._writeBuffer.length; ++i) {\n const data = this._writeBuffer[i];\n const cb = this._callbacks[i];\n this._action(data);\n if (cb) cb();\n }\n // reset all to avoid reprocessing of chunks with scheduled innerWrite call\n this._writeBuffer = [];\n this._callbacks = [];\n this._pendingData = 0;\n // stop scheduled innerWrite by offset > length condition\n this._bufferOffset = 0x7FFFFFFF;\n }\n // handle current data chunk\n this._action(data);\n }\n\n public write(data: string | Uint8Array, callback?: () => void): void {\n if (this._pendingData > DISCARD_WATERMARK) {\n throw new Error('write data discarded, use flow control to avoid losing data');\n }\n\n // schedule chunk processing for next event loop run\n if (!this._writeBuffer.length) {\n this._bufferOffset = 0;\n setTimeout(() => this._innerWrite());\n }\n\n this._pendingData += data.length;\n this._writeBuffer.push(data);\n this._callbacks.push(callback);\n }\n\n protected _innerWrite(): void {\n const startTime = Date.now();\n while (this._writeBuffer.length > this._bufferOffset) {\n const data = this._writeBuffer[this._bufferOffset];\n const cb = this._callbacks[this._bufferOffset];\n this._bufferOffset++;\n\n this._action(data);\n this._pendingData -= data.length;\n if (cb) cb();\n\n if (Date.now() - startTime >= WRITE_TIMEOUT_MS) {\n break;\n }\n }\n if (this._writeBuffer.length > this._bufferOffset) {\n // Allow renderer to catch up before processing the next batch\n // trim already processed chunks if we are above threshold\n if (this._bufferOffset > WRITE_BUFFER_LENGTH_THRESHOLD) {\n this._writeBuffer = this._writeBuffer.slice(this._bufferOffset);\n this._callbacks = this._callbacks.slice(this._bufferOffset);\n this._bufferOffset = 0;\n }\n setTimeout(() => this._innerWrite(), 0);\n } else {\n this._writeBuffer = [];\n this._callbacks = [];\n this._pendingData = 0;\n this._bufferOffset = 0;\n }\n }\n}\n","/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { ITerminalAddon, IDisposable, Terminal } from 'xterm';\n\nexport interface ILoadedAddon {\n instance: ITerminalAddon;\n dispose: () => void;\n isDisposed: boolean;\n}\n\nexport class AddonManager implements IDisposable {\n protected _addons: ILoadedAddon[] = [];\n\n constructor() {\n }\n\n public dispose(): void {\n for (let i = this._addons.length - 1; i >= 0; i--) {\n this._addons[i].instance.dispose();\n }\n }\n\n public loadAddon(terminal: Terminal, instance: ITerminalAddon): void {\n const loadedAddon: ILoadedAddon = {\n instance,\n dispose: instance.dispose,\n isDisposed: false\n };\n this._addons.push(loadedAddon);\n instance.dispose = () => this._wrappedAddonDispose(loadedAddon);\n instance.activate(<any>terminal);\n }\n\n private _wrappedAddonDispose(loadedAddon: ILoadedAddon): void {\n if (loadedAddon.isDisposed) {\n // Do nothing if already disposed\n return;\n }\n let index = -1;\n for (let i = 0; i < this._addons.length; i++) {\n if (this._addons[i] === loadedAddon) {\n index = i;\n break;\n }\n }\n if (index === -1) {\n throw new Error('Could not dispose an addon that has not been loaded');\n }\n loadedAddon.isDisposed = true;\n loadedAddon.dispose.apply(loadedAddon.instance);\n this._addons.splice(index, 1);\n }\n}\n"],"sourceRoot":""}