{"version":3,"sources":["https://lively-kernel.org/lively4/swt1-debugging/src/components/widgets/lively-code-mirror.js"],"names":["promisedEvent","through","generateUUID","uuid","debounce","isSet","loc","range","boundEval","Morph","diff","SyntaxChecker","Preferences","pt","Strings","letsScript","LivelyCodeMirrorWidgetImport","LivelyCodeMirrorCodeProvider","openMenu","spellCheck","fake","CodeMirror","indentationWidth","DependencyGraph","openLocationInBrowser","navigateToTimeline","DebuggingCache","AExprRegistry","ContextMenu","_","posEq","stripErrorString","self","loadPromise","undefined","s","toString","replace","a","b","line","ch","LivelyCodeMirror","HTMLElement","args","editor","mode","getAttribute","val","setAttribute","codeMirrorPath","lively4url","loadModule","path","force","console","warn","code","fetch","then","r","text","eval","e","error","loadCSS","lively","loadCSSThroughDOM","loadModules","System","import","loadTernModules","ternIsLoaded","terndir","loadJavaScriptThroughDOM","astCapabilities","cm","m","myASTCapabilities","default","codeProvider","autoCompletion","ternWrapper","ternLoaded","TernCodeMirrorWrapper","initialize","_attrObserver","MutationObserver","mutations","forEach","mutation","type","attributeChangedCallback","attributeName","oldValue","target","observe","attributes","applyAttribute","attr","value","attachedCallback","isLoading","root","shadowRoot","textContent","decodeHTML","editView","event","CustomEvent","dispatchEvent","sleep","refresh","updateAExprDependencies","editorLoaded","container","querySelector","innerHTML","setEditor","lineNumbers","gutters","lint","setupEditor","setOption","setupEditorOptions","on","evt","detail","checkSyntax","ac","codeChanged","onCursorActivity","map","ea","name","keyEvent","cancelDefaultEvent","preventDefault","codemirrorIgnore","classList","contains","repeat","exitPsychMode","remove","removeAttribute","key","length","which","inclusive","getJSONAttribute","unifiedKeyDescription","alt","altKey","ctrl","ctrlKey","shift","shiftKey","operations","Escape","i","inlineLocalVariable","operation","notify","clearHistory","getDoc","addKeys","keymap","keys","ensureExtraKeys","extraKeys","Object","assign","split","c","upperCase","defaultASTHandlers","enterPsychMode","toggle","setJSONAttribute","braveNewWorld","slurp","barf","psych","psychEach","psychInSmart","livelyNotify","negateExpression","replaceParentWithSelection","newlineAndIndent","swapConditional","generateIf","insertMarkdownComment","isJavaScript","openContextMenu","toggleOverwrite","setTimeout","execCommand","focus","fixHintsPosition","getSelectionOrLine","tryBoundEval","inspectIt","searchField","lastSearch","oldSearch","addEventListener","select","somethingSelected","indentSelection","doSave","getValue","result","tw","showType","jumpToDefinition","jumpBack","showReferences","expandSelection","reduceSelection","selectNextASTNodeLikeThis","selectNextASTChild","selectNextReference","selectDeclaration","rename","extractExpressionIntoLocalVariable","singalEditorbackNavigation","showAExprDependencyTextMarkers","selection","getSelection","replaceSelection","complete","closeEditor","query","onCancel","bubbles","cancelable","registerExtraKeys","options","keyMap","sublime","normalizeKeyMap","showToken","annotateScrollbar","updateArgHints","widgetEnter","cursorHead","getCursor","cursorAnchor","codemirror","closeCharacters","oldVal","newVal","getLine","getDoitContext","doitContext","window","that","setDoitContext","context","getTargetModule","targetModule","setTargetModule","module","str","match","boundEvalPython","log","xterm","document","term","__socket","data","__sendData","printWidget","wrapWidget","from","to","widget","createElement","add","style","whiteSpace","promise","create","comp","display","minWidth","minHeight","marker","doc","markText","replacedWith","printResult","obj","isPromise","isAsync","setCursor","__asyncresult__","promisedWidget","objClass","constructor","call","Array","isMap","mapObj","sort","get","isArray","every","Node","String","table","setFromJSO","maxHeight","overflow","index","ensuredPrintString","inspector","inspect","hideWorkspace","span","parentElement","insertBefore","appendChild","border","resp","isError","LastError","handleError","catch","showElement","openInspector","detachedCallback","_attached","_value","setValue","setCustomStyle","source","getCustomStyle","encodeHTML","resize","enableAutocompletion","getOption","isMarkdown","isHTML","changeModeForFile","filename","lang","dict","loadDictLang","startSpellCheck","current","livelyPrepareSave","livelyPreMigrate","lastScrollInfo","getScrollInfo","isFocused","activeElement","livelyMigrate","other","composedPath","removeEventListener","scrollTo","left","top","setPosition","scrollingElement","scrollLeft","scrollTop","subPt","getGlobalPosition","addTernFile","url","ternServer","server","addFile","mergeView","originalText","originalLeftText","_mergeView","MergeView","origLeft","orig","scrollbarStyle","highlightDifferences","connect","lineWrapping","collapseIdentical","resizeMergeView","editorHeight","height","mergeViewHeight","Math","max","leftOriginal","rightOriginal","setSize","newHeight","wrap","hideDataURLs","regEx","RegExp","exec","posFromIndex","div","backgroundColor","img","src","title","slice","createTextNode","wrapImports","id","getImportDeclarationRegex","LiteralString","JavaScriptIdentifier","ImportSpecifierPartSimple","ImportSpecifierPartRename","ImportSpecifierPart","ImportSpecifier","ImportDefaultSpecifier","ImportNamespaceSpecifier","anySpecifier","ImportDeclaration","importWidgetForRange","wrapLinks","link","lastWidget","input","find","keyCode","replaceRange","selectionStart","setSelection","checkForSyntaxErrors","found","startPos","indexOf","scrollToLine","heightAtLine","unsavedChanges","navbar","onDetailsContentCursorActivity","livelyMinimizedTitle","dependencyGraph","_deps","showAExprDependencyGutter","registerFileForAEDebugging","fileURL","triplets","allDependenciesByLine","depToAE","AEToDep","clearGutter","showAExprDependencyGutterMarkers","showAExprTextMarkers","resetAExprTextMarkers","getAllActiveExpressions","node","asCM","mark","css","isAExprTextMarker","getAllMarks","clear","some","hideAExprDependencyGutter","filter","resetAExprDependencyTextMarkers","isAExprDependencyTextMarker","cursor","aexprPath","getAexprAtCursor","deps","resolveDependencies","dependencyMap","isAE","aExprs","entries","drawAExprGutter","depsMapInFile","Map","handleDepAEPairing","ae","dependencyLoc","dependencySource","dependencyLine","start","dependencyFile","file","AELocation","meta","AELine","valueChangedEvents","relatedEvents","trigger","includes","set","push","location","events","aes","Set","hook","dependency","locations","getLocations","identifier","getURL","pathname","valid","allParents","body","dependencies","setGutterMarker","drawAExprGutterMarker","faIcon","modifiers","join","sorted","aDep","bDep","column","accumulated","dep","isEqual","lastDep","end","callback","markerBounds","getBoundingClientRect","drawAExprDependencyList","menuItems","allAEs","union","timeline","filterToAEs","description","inThisFile","substring","lastIndexOf","menu","size","openIn","clientX","clientY","bottom","iterables","iterable","item"],"mappings":"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","file":"lively-code-mirror.js","sourcesContent":["/*MD \n# CodeMirror\n\nWorkspace / main source code editing component. \n\n![](lively-code-mirror.png){height=200}\n\nMD*/\n\nimport { promisedEvent, through, uuid as generateUUID } from 'utils';\nimport boundEval from 'src/client/bound-eval.js';\nimport Morph from \"src/components/widgets/lively-morph.js\";\nimport diff from 'src/external/diff-match-patch.js';\nimport SyntaxChecker from 'src/client/syntax.js';\nimport { debounce } from \"utils\";\nimport Preferences from 'src/client/preferences.js';\nimport { pt } from 'src/client/graphics.js';\nimport 'src/client/stablefocus.js';\nimport Strings from 'src/client/strings.js';\nimport { letsScript } from 'src/client/vivide/vivide.js';\nimport LivelyCodeMirrorWidgetImport from 'src/components/widgets/lively-code-mirror-widget-import.js';\nimport LivelyCodeMirrorCodeProvider from 'src/components/widgets/lively-code-mirror-code-provider.js';\nimport openMenu from 'src/components/widgets/lively-code-mirror-context-menu.js';\nimport * as spellCheck from \"src/external/codemirror-spellcheck.js\";\nimport { isSet } from 'utils';\nimport fake from \"./lively-code-mirror-fake.js\";\nimport CodeMirror from \"src/external/code-mirror/lib/codemirror.js\";\nself.CodeMirror = CodeMirror; // for modules\nlet loadPromise = undefined;\nimport { loc, range } from 'utils';\nimport indentationWidth from 'src/components/widgets/indent.js';\nimport { DependencyGraph } from 'src/client/dependency-graph/graph.js';\nimport {openLocationInBrowser, navigateToTimeline} from 'src/client/reactive/components/basic/aexpr-debugging-utils.js'\nimport { DebuggingCache } from 'src/client/reactive/active-expression-rewriting/active-expression-rewriting.js';\nimport { AExprRegistry } from 'src/client/reactive/active-expression/active-expression.js';\nimport ContextMenu from 'src/client/contextmenu.js';\n\nimport _ from 'src/external/lodash/lodash.js';\n\nexport function stripErrorString(s) {\n  return s.toString().replace(/Error: workspace(js)?:[^:]*:/, \"Error:\").replace(/\\n {2}Evaluating workspace(js)?:.*/, \"\").replace(/\\n {2}Loading workspace(js)?:.*/, \"\").replace(/\\n {2}Instantiating workspace(js)?:.*/, \"\");\n}\n\nfunction posEq(a, b) {\n  return a.line == b.line && a.ch == b.ch;\n}\n\nexport default class LivelyCodeMirror extends HTMLElement {\n\n  fake(...args) {\n    fake(this.editor, ...args);\n  }\n\n  get mode() {\n    return this.getAttribute('mode');\n  }\n  set mode(val) {\n    return this.setAttribute('mode', val);\n  }\n\n  static get codeMirrorPath() {\n    return lively4url + \"/src/external/code-mirror/\";\n  }\n\n  static async loadModule(path, force) {\n    if (!self.CodeMirror) {\n      console.warn(\"CodeMirror is missing, could not initialize \" + path);\n      return;\n    }\n    var code = await fetch(this.codeMirrorPath + path).then(r => r.text());\n    try {\n      eval(code);\n    } catch (e) {\n      console.error(\"Could not load CodeMirror module \" + path, e);\n    }\n    // return lively.loadJavaScriptThroughDOM(\"codemirror_\"+path.replace(/[^A-Za-z]/g,\"\"),\n    //   this.codeMirrorPath + path, force)\n  }\n\n  static async loadCSS(path) {\n    return lively.loadCSSThroughDOM(\"codemirror_\" + path.replace(/[^A-Za-z]/g, \"\"), this.codeMirrorPath + path);\n  }\n\n  static async loadModules(force) {\n    // console.log(\"loadModules\", loadPromise);\n    if (loadPromise && !force) return loadPromise;\n    loadPromise = (async () => {\n\n      await this.loadModule(\"addon/fold/foldcode.js\");\n\n      await this.loadModule(\"mode/javascript/javascript.js\");\n      await this.loadModule(\"mode/xml/xml.js\");\n      await this.loadModule(\"mode/css/css.js\");\n      await this.loadModule(\"mode/diff/diff.js\");\n\n      await this.loadModule(\"mode/markdown/markdown.js\");\n      await this.loadModule(\"mode/htmlmixed/htmlmixed.js\");\n      await this.loadModule(\"addon/mode/overlay.js\");\n      await this.loadModule(\"mode/gfm/gfm.js\");\n      await this.loadModule(\"mode/stex/stex.js\");\n      await this.loadModule(\"mode/jsx/jsx.js\");\n      await this.loadModule(\"mode/python/python.js\");\n      await this.loadModule(\"mode/clike/clike.js\");\n      await this.loadModule(\"mode/shell/shell.js\");\n\n      await this.loadModule(\"addon/edit/matchbrackets.js\");\n      await this.loadModule(\"addon/edit/closetag.js\");\n      await this.loadModule(\"addon/edit/closebrackets.js\");\n      await this.loadModule(\"addon/edit/continuelist.js\");\n      await this.loadModule(\"addon/edit/matchtags.js\");\n      await this.loadModule(\"addon/edit/trailingspace.js\");\n      await this.loadModule(\"addon/hint/show-hint.js\");\n      await this.loadModule(\"addon/hint/javascript-hint.js\");\n      await this.loadModule(\"addon/search/searchcursor.js\");\n      await this.loadModule(\"addon/search/search.js\");\n      await this.loadModule(\"addon/search/jump-to-line.js\");\n      await this.loadModule(\"addon/search/matchesonscrollbar.js\");\n      await this.loadModule(\"addon/search/match-highlighter.js\");\n      await this.loadModule(\"addon/scroll/annotatescrollbar.js\");\n      await this.loadModule(\"addon/comment/comment.js\");\n      await this.loadModule(\"addon/dialog/dialog.js\");\n      await this.loadModule(\"addon/scroll/simplescrollbars.js\"\n\n      //await System.import(\"https://raw.githubusercontent.com/jshint/jshint/master/dist/jshint.js\");\n      //await lively.loadJavaScriptThroughDOM(\"jshintAjax\", \"https://ajax.aspnetcdn.com/ajax/jshint/r07/jshint.js\");\n      //await lively.loadJavaScriptThroughDOM(\"eslint\", \"http://eslint.org/js/app/eslint.js\");\n      );await this.loadModule(\"addon/lint/lint.js\");\n      await this.loadModule(\"addon/lint/javascript-lint.js\");\n      await this.loadModule(\"../eslint/eslint.js\");\n      // await this.loadModule(\"../eslint/eslint-lint.js\", force);\n      await System.import(lively4url + '/src/external/eslint/eslint-lint.js');\n      await this.loadModule(\"addon/merge/merge.js\");\n      await this.loadModule(\"addon/selection/mark-selection.js\");\n      await this.loadModule(\"keymap/sublime.js\");\n      await System.import(lively4url + '/src/components/widgets/lively-code-mirror-hint.js');\n\n      this.loadCSS(\"addon/hint/show-hint.css\");\n      this.loadCSS(\"addon/lint/lint.css\");\n      lively.loadCSSThroughDOM(\"CodeMirrorCSS\", lively4url + \"/src/components/widgets/lively-code-mirror.css\");\n    })();\n    return loadPromise;\n  }\n\n  // #TODO #Refactor not needed anymore\n  static async loadTernModules() {\n    if (this.ternIsLoaded) return;\n\n    await this.loadModule(\"addon/tern/tern.js\");\n\n    var terndir = lively4url + '/src/external/tern/';\n    await lively.loadJavaScriptThroughDOM(\"tern_acorn\", terndir + 'acorn.js');\n    await lively.loadJavaScriptThroughDOM(\"tern_acorn_loose\", terndir + 'acorn_loose.js');\n    await lively.loadJavaScriptThroughDOM(\"tern_walk\", terndir + 'walk.js');\n    await lively.loadJavaScriptThroughDOM(\"tern_polyfill\", terndir + 'polyfill.js');\n    await lively.loadJavaScriptThroughDOM(\"tern_signal\", terndir + 'signal.js');\n    await lively.loadJavaScriptThroughDOM(\"tern_tern\", terndir + 'tern.js');\n    await lively.loadJavaScriptThroughDOM(\"tern_def\", terndir + 'def.js');\n    await lively.loadJavaScriptThroughDOM(\"tern_comment\", terndir + 'comment.js');\n    await lively.loadJavaScriptThroughDOM(\"tern_infer\", terndir + 'infer.js');\n    await lively.loadJavaScriptThroughDOM(\"tern_plugin_modules\", terndir + 'modules.js');\n    await lively.loadJavaScriptThroughDOM(\"tern_plugin_esmodules\", terndir + 'es_modules.js');\n    this.ternIsLoaded = true;\n  }\n\n  astCapabilities(cm) {\n    return System.import('src/components/widgets/ast-capabilities.js').then(m => {\n      if (!this.myASTCapabilities || !(this.myASTCapabilities instanceof m.default)) {\n        const codeProvider = new LivelyCodeMirrorCodeProvider(this, cm);\n        this.myASTCapabilities = new m.default(codeProvider);\n      }\n\n      return this.myASTCapabilities;\n    });\n  }\n\n  autoCompletion(cm) {\n    return System.import('src/components/widgets/auto-completion.js').then(m => new m.default(this, cm));\n  }\n\n  get ternWrapper() {\n    return System.import('src/components/widgets/tern-wrapper.js').then(m => {\n      this.ternLoaded = true;\n      return m.TernCodeMirrorWrapper;\n    });\n  }\n\n  initialize() {\n    this._attrObserver = new MutationObserver(mutations => {\n      mutations.forEach(mutation => {\n        if (mutation.type == \"attributes\") {\n          // console.log(\"observation\", mutation.attributeName,mutation.target.getAttribute(mutation.attributeName));\n          this.attributeChangedCallback(mutation.attributeName, mutation.oldValue, mutation.target.getAttribute(mutation.attributeName));\n        }\n      });\n    });\n    this._attrObserver.observe(this, { attributes: true });\n  }\n\n  applyAttribute(attr) {\n    var value = this.getAttribute(attr);\n    if (value !== undefined) {\n      this.setAttribute(attr, value);\n    }\n  }\n\n  async attachedCallback() {\n    if (this.isLoading || this.editor) return;\n    this.isLoading = true;\n    this.root = this.shadowRoot; // used in code mirror to find current element\n    await LivelyCodeMirror.loadModules(); // lazy load modules...\n\n    if (this.textContent) {\n      var value = this.decodeHTML(this.textContent);\n    } else {\n      value = this.value || \"\";\n    }\n    this.editView(value);\n    this.isLoading = false;\n    // console.log(\"[editor] #dispatch editor-loaded\")\n    var event = new CustomEvent(\"editor-loaded\");\n    // event.stopPropagation();\n    this.dispatchEvent(event);\n    this[\"editor-loaded\"] = true; // event can sometimes already be fired\n\n    await lively.sleep(0);\n    this.editor.refresh();\n    this.updateAExprDependencies();\n  }\n\n  async editorLoaded() {\n    if (!this[\"editor-loaded\"]) {\n      return promisedEvent(this, \"editor-loaded\");\n    }\n  }\n\n  editView(value) {\n    if (!value) value = this.value || \"\";\n    var container = this.shadowRoot.querySelector(\"#code-mirror-container\");\n    container.innerHTML = \"\";\n    this.setEditor(CodeMirror(container, {\n      value: value,\n      lineNumbers: true,\n      gutters: [\"leftgutter\", \"CodeMirror-linenumbers\", \"rightgutter\", \"CodeMirror-lint-markers\"],\n      lint: true\n    }));\n\n    //load astCapabilities\n    this.astCapabilities(this.editor);\n  }\n\n  setEditor(editor) {\n    this.editor = editor;\n    this.setupEditor();\n  }\n\n  setupEditor() {\n    var editor = this.editor;\n    if (this.mode) {\n      editor.setOption(\"mode\", this.mode);\n    }\n    this.setupEditorOptions(editor\n    // edit addons\n    // editor.setOption(\"showTrailingSpace\", true)\n    // editor.setOption(\"matchTags\", true)\n\n    );editor.on(\"change\", evt => this.dispatchEvent(new CustomEvent(\"change\", { detail: evt })));\n    editor.on(\"change\", (() => this.checkSyntax()).debounce(500));\n    editor.on(\"change\", (() => this.astCapabilities(editor).then(ac => ac.codeChanged())).debounce(200));\n\n    editor.on(\"cursorActivity\", (() => this.onCursorActivity()).debounce(500));\n\n    // apply attributes\n    _.map(this.attributes, ea => ea.name).forEach(ea => this.applyAttribute(ea));\n\n    // if(Preferences.get('UseTernInCodeMirror')) {\n    //   this.enableTern();\n    // }\n    editor.on(\"keydown\", (...args) => this.keyEvent(...args));\n  }\n\n  keyEvent(cm, evt) {\n    function cancelDefaultEvent() {\n      evt.preventDefault();\n      evt.codemirrorIgnore = true;\n    }\n\n    if (this.classList.contains('psych-mode') && !evt.repeat) {\n      const exitPsychMode = () => {\n        this.classList.remove('psych-mode')\n        this.removeAttribute('psych-mode-command')\n        this.removeAttribute('psych-mode-inclusive')\n      }\n\n      if (evt.key === 'Escape') {\n        cancelDefaultEvent()\n        exitPsychMode()\n        return\n      }\n\n      if (evt.key.length === 1) {\n        const which = this.getAttribute('psych-mode-command');\n        const inclusive = this.getJSONAttribute('psych-mode-inclusive');\n        \n        cancelDefaultEvent()\n        exitPsychMode()\n\n        this.astCapabilities(cm).then(ac => ac[which](evt.key, inclusive));\n        return\n      }\n    }\n\n    if (this.classList.contains('ast-mode') && !evt.repeat) {\n      const unifiedKeyDescription = (e) => {\n        const alt = e.altKey ? 'Alt-' : '';\n        const ctrl = e.ctrlKey ? 'Ctrl-' : '';\n        const shift = e.shiftKey ? 'Shift-' : '';\n        return ctrl + shift + alt + e.key;\n      }\n\n      const operations = {\n        Escape: () => {\n          this.classList.remove('ast-mode');\n        },\n        i: () => {\n          this.astCapabilities(cm).then(ac => ac.inlineLocalVariable());\n        }\n      };\n\n      const operation = operations[unifiedKeyDescription(evt)];\n      if (operation) {\n        evt.preventDefault();\n        evt.codemirrorIgnore = true;\n\n        operation();\n      } else {\n        lively.notify(unifiedKeyDescription(evt), [this, cm, evt]);\n      }\n    }\n  }\n\n  clearHistory() {\n    var cm = this.editor;\n    cm.getDoc().clearHistory();\n  }\n\n  addKeys(keymap) {\n    var keys = this.ensureExtraKeys();\n    this.extraKeys = Object.assign(keys, keymap);\n  }\n\n  ensureExtraKeys() {\n    if (!this.extraKeys) {\n      const keys = '1234567890qwertyuiopasdf hjk zxcvbnm'.replace(/\\s/, '').split('').map(c => c.upperCase());\n      //       const defaultASTHandlers = _.fromPairs(keys.flatMap(c => {\n      //         return ['Alt-', 'Ctrl-Alt-', 'Shift-Alt-'].map(shortcut => {\n      //           const shortcutC = shortcut + c;\n      //           const prop = shortcutC.camelCase();\n\n      //           return [shortcutC, cm => {\n      //             this.astCapabilities(cm).then(ac => {\n      //               if (ac[prop]) {\n      //                 ac[prop]();\n      //               } else {\n      //                 lively.notify(shortcutC, 'No Shortcut defined yet.');\n      //               }\n      //             });\n      //           }];\n      //         });\n      //       }));\n      const defaultASTHandlers = {};\n\n      const enterPsychMode = (which, inclusive) => {\n        this.classList.toggle('psych-mode');\n        this.setAttribute('psych-mode-command', which);\n        this.setJSONAttribute('psych-mode-inclusive', inclusive);\n      }\n\n      this.extraKeys = Object.assign(defaultASTHandlers, {\n\n        // #KeyboardShortcut Alt-X shortcut for experimental features\n        \"Alt-X\": cm => this.astCapabilities(cm).then(ac => ac.braveNewWorld()),\n\n        // #KeyboardShortcut Alt-9 slurp backward\n        \"Alt-9\": cm => this.astCapabilities(cm).then(ac => ac.slurp(false)),\n        // #KeyboardShortcut Alt-0 slurp forward\n        \"Alt-0\": cm => this.astCapabilities(cm).then(ac => ac.slurp(true)),\n        // #KeyboardShortcut Alt-[ barf backward\n        \"Alt-[\": cm => this.astCapabilities(cm).then(ac => ac.barf(false)),\n        // #KeyboardShortcut Alt-] barf forward\n        \"Alt-]\": cm => this.astCapabilities(cm).then(ac => ac.barf(true)),\n\n        // #KeyboardShortcut Alt-C psych: paste word from mouse position\n        \"Alt-C\": cm => this.astCapabilities(cm).then(ac => ac.psych()),\n        // #KeyboardShortcut Shift-Alt-C psych each: paste word part from mouse position\n        \"Shift-Alt-C\": cm => this.astCapabilities(cm).then(ac => ac.psychEach()),\n        // #KeyboardShortcut Alt-V psych to (exclusive): paste from word on mouse position up to (exclusive) <character>\n        \"Alt-V\": cm => enterPsychMode('psychTo', false),\n        // #KeyboardShortcut Shift-Alt-V psych to (inclusive): paste from word on mouse position up to (inclusive) <character>\n        \"Shift-Alt-V\": cm => enterPsychMode('psychTo', true),\n        // #KeyboardShortcut Alt-D psych within (smart): paste group surrounding mouse position enclosed by brackets, braces, or quotes (exclusive)\n        \"Alt-D\": cm => this.astCapabilities(cm).then(ac => ac.psychInSmart(false)),\n        // #KeyboardShortcut Shift-Alt-D psych within (smart): paste group surrounding mouse position enclosed by brackets, braces, or quotes (inclusive)\n        \"Shift-Alt-D\": cm => this.astCapabilities(cm).then(ac => ac.psychInSmart(true)),\n        // #KeyboardShortcut Alt-F psych within: paste group surrounding mouse position with (exclusive) <character>\n        \"Alt-F\": cm => enterPsychMode('psychIn', false),\n        // #KeyboardShortcut Shift-Alt-F psych within: paste group surrounding mouse position with (inclusive) <character>\n        \"Shift-Alt-F\": cm => enterPsychMode('psychIn', true),\n\n        // #KeyboardShortcut Alt-B Alt-N wrap selection in lively notify\n        \"Alt-B Alt-N\": cm => this.astCapabilities(cm).then(ac => ac.livelyNotify()),\n        // #KeyboardShortcut Alt-B Alt-U insert lively4url\n        \"Alt-B Alt-U\": cm => this.astCapabilities(cm).then(ac => ac.lively4url()),\n        // #KeyboardShortcut Alt-N negate an expression\n        \"Alt-N\": cm => this.astCapabilities(cm).then(ac => ac.negateExpression()),\n        // #KeyboardShortcut Alt-U Replace parent node with selection\n        \"Alt-U\": cm => this.astCapabilities(cm).then(ac => ac.replaceParentWithSelection()),\n        // #KeyboardShortcut Alt-O Insert new line below\n        \"Alt-O\": cm => this.astCapabilities(cm).then(ac => ac.newlineAndIndent(true)),\n        // #KeyboardShortcut Shift-Alt-O Insert new line above\n        \"Shift-Alt-O\": cm => this.astCapabilities(cm).then(ac => ac.newlineAndIndent(false)),\n\n        // #KeyboardShortcut Alt-S Swap then and else block of a conditional\n        \"Alt-S\": cm => this.astCapabilities(cm).then(ac => ac.swapConditional()),\n        // #TODO: generate code with Alt-G Alt-_\n        \"Alt-G Alt-I\": cm => this.astCapabilities(cm).then(ac => ac.generateIf('condition')),\n        \"Ctrl-Alt-G Ctrl-Alt-I\": cm => this.astCapabilities(cm).then(ac => ac.generateIf('then')),\n        \"Shift-Alt-G Alt-I\": cm => this.astCapabilities(cm).then(ac => ac.generateIf('else')),\n\n        // #KeyboardShortcut Alt-/ insert markdown comment\n        \"Alt-/\": cm => this.astCapabilities(cm).then(ac => ac.insertMarkdownComment('condition')),\n\n        // #KeyboardShortcut Alt-M ast refactoring/autocomplete menu\n        \"Alt-M\": cm => {\n          if (this.isJavaScript) {\n            this.openContextMenu(cm);\n          } else {\n            lively.warn(\"Context Menu doesn't work outside of js files for now!\");\n          }\n        },\n\n        \"Insert\": cm => {\n          // do nothing... the INSERT mode is so often activated by accident \n        },\n        \"Ctrl-Insert\": cm => {\n          // INSERT mode is so often activated by accident, require CTRL now \n          cm.toggleOverwrite();\n        },\n        // #KeyboardShortcut Ctrl-H search and replace\n        \"Ctrl-H\": cm => {\n          setTimeout(() => {\n            this.editor.execCommand(\"replace\");\n            this.shadowRoot.querySelector(\".CodeMirror-search-field\").focus();\n          }, 10);\n        },\n        // #KeyboardShortcut Ctrl-Space auto complete\n        \"Ctrl-Space\": cm => {\n          this.fixHintsPosition();\n          cm.execCommand(\"autocomplete\");\n        },\n        // #KeyboardShortcut Ctrl-Alt-Space auto complete\n        \"Ctrl-Alt-Space\": cm => {\n          this.fixHintsPosition();\n          cm.execCommand(\"autocomplete\");\n        },\n        // #KeyboardShortcut Ctrl-P eval and print selection or line\n        \"Ctrl-P\": cm => {\n          let text = this.getSelectionOrLine();\n          this.tryBoundEval(text, true);\n        },\n        // #KeyboardShortcut Ctrl-I eval and inspect selection or line\n        \"Ctrl-I\": cm => {\n          let text = this.getSelectionOrLine();\n          this.inspectIt(text);\n        },\n        // #KeyboardShortcut Ctrl-D eval selection or line (do it)\n        \"Ctrl-D\": (cm, b, c) => {\n          let text = this.getSelectionOrLine();\n          this.tryBoundEval(text, false);\n          return true;\n        },\n        // #HACK we seem to be incapable of dealling automatically with code snippets that contain \"await\", so lets make it explicit #FutureWork #Research\n        // #KeyboardShortcut Shift-Ctrl-D async eval selection or line (do it)\n        \"Shift-Ctrl-D\": (cm, b, c) => {\n          let text = this.getSelectionOrLine();\n          this.tryBoundEval(\";(async () => { \" + text +\"})()\", false);\n          return true;\n        },\n        // #KeyboardShortcut Ctrl-F search\n        \"Ctrl-F\": cm => {\n          // something immediately grabs the \"focus\" and we close the search dialog..\n          // #Hack...\n          setTimeout(() => {\n            this.editor.execCommand(\"findPersistent\");\n            var searchField = this.shadowRoot.querySelector(\".CodeMirror-search-field\");\n            if (searchField) {\n              // start with the last search..\n              if (!searchField.value && this.lastSearch) {\n                var oldSearch = searchField.value\n                searchField.value =  this.lastSearch\n              } else {\n                this.lastSearch = searchField.value // we got a new search\n              }\n              lively.addEventListener(\"lively4\", searchField, \"input\", () => {\n                this.lastSearch =  searchField.value\n              })\n              searchField.focus();\n              searchField.select();\n            }\n          }, 10\n          // editor.execCommand(\"find\")\n          );\n        },\n\n        // #KeyboardShortcut Ctrl-Alt-Right multiselect next\n        \"Ctrl-Alt-Right\": \"selectNextOccurrence\",\n        // #KeyboardShortcut Ctrl-Alt-Left undo multiselect\n        \"Ctrl-Alt-Left\": \"undoSelection\",\n\n        // #KeyboardShortcut Ctrl-/ indent selection\n        \"Ctrl-/\": \"toggleCommentIndented\",\n        // #KeyboardShortcut Ctrl-# indent selection\n        \"Ctrl-#\": \"toggleCommentIndented\",\n        // #KeyboardShortcut Tab insert tab or soft indent\n        'Tab': cm => {\n          if (cm.somethingSelected()) {\n            cm.indentSelection(\"add\");\n          } else {\n            cm.execCommand('insertSoftTab');\n          }\n        },\n        // #KeyboardShortcut Ctrl-S save content\n        \"Ctrl-S\": cm => {\n          this.doSave(cm.getValue());\n        },\n        // #KeyboardShortcut Ctrl-Alt-V eval and open in vivide\n        \"Ctrl-Alt-V\": async cm => {\n          let text = this.getSelectionOrLine();\n          let result = await this.tryBoundEval(text, false);\n          letsScript(result);\n        },\n        // #KeyboardShortcut Ctrl-Alt-I show type using tern\n        \"Ctrl-Alt-I\": cm => {\n          this.ternWrapper.then(tw => tw.showType(cm, this));\n        },\n        // #KeyboardShortcut Alt-. jump to definition using tern\n        \"Alt-.\": cm => {\n          lively.notify(\"try to JUMP TO DEFINITION\");\n          this.ternWrapper.then(tw => tw.jumpToDefinition(cm, this));\n        },\n        // #KeyboardShortcut Alt-, jump back from definition using tern\n        \"Alt-,\": cm => {\n          this.ternWrapper.then(tw => tw.jumpBack(cm, this));\n        },\n        // #KeyboardShortcut Shift-Alt-. show references using tern\n        \"Shift-Alt-.\": cm => {\n          this.ternWrapper.then(tw => tw.showReferences(cm, this));\n        },\n\n        /*MD #AST-Navigation MD*/\n\n        // #KeyboardShortcut Alt-Up Expand selection in ast-aware manner\n        \"Alt-Up\": cm => {\n          this.astCapabilities(cm).then(ac => ac.expandSelection(cm));\n        },\n        // #KeyboardShortcut Alt-Down Reduce selection in ast-aware manner\n        \"Alt-Down\": cm => {\n          this.astCapabilities(cm).then(ac => ac.reduceSelection(cm));\n        },\n        // #KeyboardShortcut Alt-Shift-Up Select previous like this\n        \"Shift-Alt-Up\": cm => {\n          this.astCapabilities(cm).then(ac => ac.selectNextASTNodeLikeThis(true));\n        },\n        // #KeyboardShortcut Alt-Shift-Down Select next like this\n        \"Shift-Alt-Down\": cm => {\n          this.astCapabilities(cm).then(ac => ac.selectNextASTNodeLikeThis(false));\n        },\n\n        // #KeyboardShortcut Alt-Left Select previous element in ast-aware manner\n        \"Alt-Left\": cm => {\n          this.astCapabilities(cm).then(ac => ac.selectNextASTChild(true));\n        },\n        // #KeyboardShortcut Alt-Right Select next element in ast-aware manner\n        \"Alt-Right\": cm => {\n          this.astCapabilities(cm).then(ac => ac.selectNextASTChild(false));\n        },\n        // #KeyboardShortcut Alt-Shift-Left Select previous reference\n        \"Shift-Alt-Left\": cm => {\n          this.astCapabilities(cm).then(ac => ac.selectNextReference(true));\n        },\n        // #KeyboardShortcut Alt-Shift-Right Select next reference\n        \"Shift-Alt-Right\": cm => {\n          this.astCapabilities(cm).then(ac => ac.selectNextReference(false));\n        },\n\n        // #KeyboardShortcut Alt-J Jump to declaration of this identifier\n        \"Alt-J\": cm => {\n          this.astCapabilities(cm).then(ac => ac.selectDeclaration());\n        },\n        // #KeyboardShortcut Alt-R Rename this identifier\n        \"Alt-R\": cm => {\n          this.astCapabilities(cm).then(ac => ac.rename());\n        },\n        // #KeyboardShortcut Alt-Enter Toggle AST Mode\n        \"Alt-Enter\": cm => {\n          this.classList.toggle('ast-mode');\n        },\n        // #KeyboardShortcut Alt-I Inline variable\n        \"Alt-I\": cm => {\n          this.astCapabilities(cm).then(ac => ac.inlineLocalVariable());\n        },\n        // #KeyboardShortcut Alt-E Extract Expression into a local variable\n        \"Alt-E\": cm => {\n          this.astCapabilities(cm).then(ac => ac.extractExpressionIntoLocalVariable());\n        },\n\n        // #KeyboardShortcut Alt-Backspace Leave Editor and go to Navigation\n        \"alt-Backspace\": async cm => {\n          this.singalEditorbackNavigation();\n        },\n        // #KeyboardShortcut Shift-Alt-Backspace Leave and Close Editor and go to Navigation\n        \"shift-alt-Backspace\": async cm => {\n          this.singalEditorbackNavigation(true);\n        },\n        // #KeyboardShortcut Shift-Alt-A show additional info of this Active Expression\n        \"Shift-Alt-A\": async cm => {\n          this.showAExprDependencyTextMarkers();\n        },\n        // #Async #Workspace #Snippet #Workaround missing global async/await support in JavaScript / our Workspaces\n        \"Ctrl-Alt-A\": cm => {\n          var selection = this.editor.getSelection\n          // #TODO how can we have custom snippets?\n          ();this.editor.replaceSelection(`var value;\n(async () => {\n  value = ${selection}\n})()`);\n          this.editor.execCommand(`goWordLeft`);\n          this.editor.execCommand(`goCharLeft`);\n        },\n        // #KeyboardShortcut Ctrl-Shift-A Update Active Expression Dependencies\n        \"Ctrl-Shift-A\": cm => {\n          this.updateAExprDependencies();\n        },\n\n        // #KeyboardShortcut Alt-Q sample shortcut for auto-completion\n        \"Alt-Q\": cm => {\n          this.autoCompletion(cm).then(ac => ac.complete(this, cm));\n        }\n\n      });\n    }\n\n    return this.extraKeys;\n  }\n\n  openContextMenu(cm) {\n    this.astCapabilities(cm).then(ac => {\n      openMenu(ac, cm, this);\n    });\n  }\n\n  async singalEditorbackNavigation(closeEditor) {\n    var container = lively.query(this, \"lively-container\");\n    if (container) {\n      if (closeEditor) await container.onCancel();\n      await lively.sleep(10\n      // it seems not to bubble across shadow root boundaries #Bug ?\n      // so we do it manually, but keep it an event\n      );container.dispatchEvent(new CustomEvent(\"editorbacknavigation\", {\n        bubbles: true,\n        cancelable: true\n      }));\n    }\n  }\n\n  registerExtraKeys(options) {\n    if (options) this.addKeys(options);\n    var keys = {};\n    keys = Object.assign(keys, CodeMirror.keyMap.sublime);\n    keys = Object.assign(keys, this.ensureExtraKeys());\n    this.editor.setOption(\"extraKeys\", CodeMirror.normalizeKeyMap(keys));\n  }\n\n  setupEditorOptions(editor) {\n    editor.setOption(\"matchBrackets\", true);\n    editor.setOption(\"styleSelectedText\", true);\n    editor.setOption(\"autoCloseBrackets\", true);\n    editor.setOption(\"autoCloseTags\", true);\n    editor.setOption(\"scrollbarStyle\", \"simple\");\n    editor.setOption(\"scrollbarStyle\", \"simple\");\n\n    editor.setOption(\"tabSize\", indentationWidth());\n    editor.setOption(\"indentWithTabs\", false);\n    editor.setOption(\"indentUnit\", indentationWidth());\n\n    editor.setOption(\"highlightSelectionMatches\", { showToken: /\\w/, annotateScrollbar: true\n\n      // editor.setOption(\"keyMap\",  \"sublime\")\n\n    });editor.on(\"cursorActivity\", cm => {\n      if (this.ternLoaded) {\n        this.ternWrapper.then(tw => tw.updateArgHints(cm, this));\n      }\n    });\n\n    // http://bl.ocks.org/jasongrout/5378313#fiddle.js\n    editor.on(\"cursorActivity\", cm => {\n      // this.ternWrapper.then(tw => tw.updateArgHints(cm, this));\n      const widgetEnter = cm.widgetEnter;\n      cm.widgetEnter = undefined;\n      if (widgetEnter) {\n        // check to see if movement is purely navigational, or if it\n        // doing something like extending selection\n        var cursorHead = cm.getCursor('head');\n        var cursorAnchor = cm.getCursor('anchor');\n        if (posEq(cursorHead, cursorAnchor)) {\n          widgetEnter();\n        }\n      }\n    });\n    editor.setOption(\"hintOptions\", {\n      container: this.shadowRoot.querySelector(\"#code-mirror-hints\"),\n      codemirror: this,\n      closeCharacters: /\\;/ // we want to keep the hint open when typing spaces and \"{\" in imports...\n    });\n\n    this.registerExtraKeys();\n  }\n\n  // Fires when an attribute was added, removed, or updated\n  attributeChangedCallback(attr, oldVal, newVal) {\n    if (!this.editor) {\n      return false;\n    }\n    switch (attr) {\n      // case \"theme\":\n      //     this.editor.setTheme( newVal );\n      //     break;\n      case \"mode\":\n        this.editor.setOption('mode', newVal);\n        break;\n      // case \"fontsize\":\n      //     this.editor.setFontSize( newVal );\n      //     break;\n      // case \"softtabs\":\n      //     this.editor.getSession().setUseSoftTabs( newVal );\n      //     break;\n      // case \"tern\":\n      //   if (newVal)\n      // this.enableTern()\n      //   break;\n\n      case \"tabsize\":\n        this.setOption(\"tabSize\", newVal);\n        break;\n      // case \"readonly\":\n      //     this.editor.setReadOnly( newVal );\n      //     break;\n      case \"wrapmode\":\n        this.setOption(\"lineWrapping\", newVal);\n        break;\n    }\n  }\n\n  setOption(name, value) {\n    if (!this.editor) return; // we loose...\n    this.editor.setOption(name, value);\n  }\n\n  doSave(text) {\n    this.tryBoundEval(text // just a default implementation...\n    );\n  }\n\n  getSelectionOrLine() {\n    var text = this.editor.getSelection();\n    if (text.length > 0) return text;else return this.editor.getLine(this.editor.getCursor(\"end\").line);\n  }\n\n  getDoitContext() {\n    return this.doitContext || window.that;\n  }\n\n  setDoitContext(context) {\n    return this.doitContext = context;\n  }\n\n  getTargetModule() {\n    // lazily initialize a target module name as fallback\n    return this.targetModule || (this.targetModule = lively4url + '/unnamed_module_' + generateUUID().replace(/-/g, '_')); // make it relative to a real path so that relative modules work\n  }\n\n  setTargetModule(module) {\n    return this.targetModule = module;\n  }\n\n  async boundEval(str) {\n    // console.log(\"bound eval \" + str)\n    var targetModule = this.getTargetModule();\n\n    if (targetModule.match(/.py$/)) {\n      return this.boundEvalPython(str);\n    }\n    // Ensure target module loaded (for .js files only)\n    if (targetModule.match(/.js$/)) {\n      await System.import(targetModule);\n    }\n    console.log(\"EVAL (CM)\", targetModule);\n    // src, topLevelVariables, thisReference, <- finalStatement\n    return boundEval(str, this.getDoitContext(), targetModule);\n  }\n\n  async boundEvalPython(str) {\n    var result = \"\";\n    var xterm = document.querySelector(\"lively-xterm.python\");\n    if (xterm) {\n      var term = xterm.term;\n      term.__socket.addEventListener('message', function (event) {\n        result += event.data;\n      });\n      // how long do we want to wait?\n\n      term.__sendData(str + \"\\n\");\n\n      while (!result.match(\">>>\")) {\n        // busy wait for the prompt\n        await lively.sleep(50);\n      }\n      // strip input and prompt.... oh what a hack\n      return { value: result.replace(str, \"\").replace(/^[\\r\\n]+/, \"\").replace(/>>> $/, \"\") };\n    } else {\n      lively.notify(\"no open python terminal session found\");\n    }\n    return { value: \"\" };\n  }\n\n  printWidget(name) {\n    return this.wrapWidget(name, this.editor.getCursor(true), this.editor.getCursor(false));\n  }\n\n  wrapWidget(name, from, to, options) {\n    var widget = document.createElement(\"span\");\n    widget.classList.add(\"lively-widget\");\n    widget.style.whiteSpace = \"normal\";\n    var promise = lively.create(name, widget);\n    promise.then(comp => {\n      Object.assign(comp.style, {\n        display: \"inline\",\n        // backgroundColor: \"rgb(250,250,250)\",\n        display: \"inline-block\",\n        minWidth: \"20px\",\n        minHeight: \"20px\"\n      });\n    });\n    // #TODO, we assume that it will keep the first widget, and further replacements do not work.... and get therefore thrown away\n    var marker = this.editor.doc.markText(from, to, Object.assign({\n      replacedWith: widget\n    }, options));\n    promise.then(comp => comp.marker = marker);\n\n    return promise;\n  }\n\n  async printResult(result, obj, isPromise) {\n    var editor = this.editor;\n    var text = result;\n    var isAsync = false;\n    this.editor.setCursor(this.editor.getCursor(\"end\"\n    // don't replace existing selection\n    ));this.editor.replaceSelection(result, \"around\");\n    if (obj && obj.__asyncresult__) {\n      obj = obj.__asyncresult__; // should be handled in bound-eval.js #TODO\n      isAsync = true;\n    }\n    var promisedWidget;\n    var objClass = obj && obj.constructor && obj.constructor.name || typeof obj;\n    if (isSet.call(obj)) {\n      obj = Array.from(obj);\n    }\n\n    if (_.isMap(obj)) {\n      var mapObj = {};\n      Array.from(obj.keys()).sort().forEach(key => mapObj[key] = obj.get(key));\n      obj = mapObj;\n    }\n    if (Array.isArray(obj) && !obj.every(ea => ea instanceof Node)) {\n      if (obj.every(ea => typeof ea == 'object' && !(ea instanceof String))) {\n        promisedWidget = this.printWidget(\"lively-table\").then(table => {\n          table.setFromJSO(obj);\n          table.style.maxHeight = \"300px\";\n          table.style.overflow = \"auto\";\n          return table;\n        });\n      } else {\n        promisedWidget = this.printWidget(\"lively-table\").then(table => {\n          table.setFromJSO(obj.map((ea, index) => {\n            return {\n              index: index,\n              value: this.ensuredPrintString(ea)\n            };\n          }));\n          table.style.maxHeight = \"300px\";\n          table.style.overflow = \"auto\";\n          return table;\n        });\n      }\n    } else if (objClass == \"Matrix\") {\n      // obj = obj.toString()\n      debugger;\n    } else if (typeof obj == 'object' && obj !== null) {\n      promisedWidget = this.printWidget(\"lively-inspector\").then(inspector => {\n        inspector.inspect(obj);\n        inspector.hideWorkspace();\n        return inspector;\n      });\n    }\n    if (promisedWidget) {\n      var widget = await promisedWidget;\n      var span = <span style=\"border-top:2px solid darkgray;color:darkblue\">\n          {isPromise ? \"PROMISED\" : \"\"} <u>:{objClass}</u> </span>;\n      widget.parentElement.insertBefore(span, widget);\n      span.appendChild(widget);\n      if (isAsync && promisedWidget) {\n        if (widget) widget.style.border = \"2px dashed blue\";\n      }\n    }\n  }\n\n  ensuredPrintString(obj) {\n    var s = \"\";\n    try {\n      s += obj; // #HACK some objects cannot be printed any more\n    } catch (e) {\n      s += `UnprintableObject[Error: ${e}]`; // so we print something else\n    }\n    return s;\n  }\n\n  async tryBoundEval(str, printResult) {\n    var resp = await this.boundEval(str);\n    if (resp.isError) {\n      var e = resp.value;\n      console.error(e);\n      if (printResult) {\n        window.LastError = e;\n        this.printResult(stripErrorString(\"\" + e));\n      } else {\n        lively.handleError(e);\n      }\n      return e;\n    }\n    var result = resp.value;\n\n    if (printResult) {\n      // alaways wait on promises.. when interactively working...\n      if (result && result.then) {\n        //  && result instanceof Promise\n        // we will definitly return a promise on which we can wait here\n        result.then(result => {\n          this.printResult(\"RESOLVED: \" + this.ensuredPrintString(result), result, true);\n        }).catch(error => {\n          console.error(error);\n          // window.LastError = error;\n          this.printResult(stripErrorString(\"Error in Promise: \\n\" + error));\n        });\n      } else {\n        this.printResult(\" \" + this.ensuredPrintString(result), result);\n        if (result instanceof HTMLElement) {\n          try {\n            lively.showElement(result);\n          } catch (e) {\n            // silent fail... not everything can be shown...\n          }\n        }\n      }\n    }\n    return result;\n  }\n\n  async inspectIt(str) {\n    var result = await this.boundEval(str);\n    if (!result.isError) {\n      result = result.value;\n    }\n    if (result.then) {\n      result = await result; // wait on any promise\n    }\n    lively.openInspector(result, undefined, str);\n  }\n\n  doSave(text) {\n    this.tryBoundEval(text // just a default implementation...\n    );\n  }\n\n  detachedCallback() {\n    this._attached = false;\n  }\n\n  get value() {\n    if (this.editor) {\n      return this.editor.getValue();\n    } else {\n      return this._value;\n    }\n  }\n\n  set value(text) {\n    if (text === undefined) text = \"\";\n    if (this.editor) {\n      this.editor.setValue(text);\n    } else {\n      this._value = text;\n    }\n    lively.sleep(0).then(() => {\n      if (this.editor) this.editor.refresh();\n    });\n  }\n\n  setCustomStyle(source) {\n    this.shadowRoot.querySelector(\"#customStyle\").textContent = source;\n  }\n\n  getCustomStyle(source) {\n    return this.shadowRoot.querySelector(\"#customStyle\").textContent;\n  }\n\n  encodeHTML(s) {\n    return s.replace(\"&\", \"&amp;\").replace(\"<\", \"&lt;\");\n  }\n\n  decodeHTML(s) {\n    return s.replace(\"&lt;\", \"<\").replace(\"&amp;\", \"&\");\n  }\n\n  resize() {\n    // #ACE Component compatiblity\n  }\n\n  enableAutocompletion() {\n    // #ACE Component compatiblity\n  }\n\n  get isJavaScript() {\n    if (!this.editor) return false;\n    let mode = this.editor.getOption(\"mode\");\n    return mode === \"javascript\" || mode === 'text/jsx';\n  }\n\n  get isMarkdown() {\n    if (!this.editor) return false;\n    return this.editor.getOption(\"mode\") == \"gfm\";\n  }\n\n  get isHTML() {\n    if (!this.editor) return false;\n    return this.editor.getOption(\"mode\") == \"text/html\";\n  }\n\n  async changeModeForFile(filename) {\n    if (!this.editor) return;\n\n    var mode = \"text\";\n    // #TODO there must be some kind of automatching?\n    if (filename.match(/\\.html$/)) {\n      mode = \"text/html\";\n    } else if (filename.match(/\\.md$/)) {\n      mode = \"gfm\";\n    } else if (filename.match(/\\.tex$/)) {\n      mode = \"text/x-stex\";\n    } else if (filename.match(/\\.css$/)) {\n      mode = \"css\";\n    } else if (filename.match(/\\.xml$/)) {\n      mode = \"xml\";\n    } else if (filename.match(/\\.json$/)) {\n      mode = \"javascript\";\n    } else if (filename.match(/\\.js$/)) {\n      mode = \"text/jsx\";\n    } else if (filename.match(/\\.mjs$/)) {\n      mode = \"text/jsx\";\n    } else if (filename.match(/\\.py$/)) {\n      mode = \"text/x-python\";\n    } else if (filename.match(/\\.c$/)) {\n      mode = \"text/x-csrc\";\n    } else if (filename.match(/\\.cpp$/)) {\n      mode = \"text/x-c++src\";\n    } else if (filename.match(/\\.h$/)) {\n      mode = \"text/x-c++src\";\n    } else if (filename.match(/\\.sh$/)) {\n      mode = \"text/x-sh\";\n    }\n\n    this.mode = mode;\n    this.editor.setOption(\"mode\", mode);\n    if (mode == \"gfm\" || mode == \"text/x-stex\") {\n      // #TODO make language customizable\n      var m = this.value.match(/^.*lang\\:(.._..)/);\n      if (m) {\n        var lang = m[1];\n        var dict = await spellCheck.loadDictLang(lang);\n        if (dict) {\n          lively.notify(\"start spell checking lang: \" + lang);\n          spellCheck.startSpellCheck(this.editor, dict);\n        } else {\n          console.log(\"spellchecking language not found: \" + lang);\n        }\n      } else {\n        spellCheck.startSpellCheck(this.editor, (await spellCheck.current()));\n      }\n    }\n  }\n\n  livelyPrepareSave() {\n    if (!this.editor) {\n      return;\n    }\n    this.textContent = this.encodeHTML(this.editor.getValue());\n  }\n\n  livelyPreMigrate() {\n    if (this.editor) {\n      this.lastScrollInfo = this.editor.getScrollInfo(); // #Example #PreserveContext\n    }\n  }\n\n  focus() {\n    if (this.editor) this.editor.focus();\n  }\n\n  isFocused(doc) {\n    doc = doc || document;\n    if (doc.activeElement === this) return true;\n    // search recursively in shadowDoms\n    if (doc.activeElement && doc.activeElement.shadowRoot) {\n      return this.isFocused(doc.activeElement.shadowRoot);\n    }\n    return false;\n  }\n\n  async livelyMigrate(other) {\n    lively.addEventListener(\"Migrate\", this, \"editor-loaded\", evt => {\n      if (evt.composedPath()[0] !== this) return; // bubbled from another place... that is not me!\n      lively.removeEventListener(\"Migrate\", this, \"editor-loaded\" // make sure we migrate only once\n      );this.value = other.value;\n      if (other.lastScrollInfo) {\n        this.editor.scrollTo(other.lastScrollInfo.left, other.lastScrollInfo.top);\n      }\n    });\n  }\n\n  fixHintsPosition() {\n    lively.setPosition(this.shadowRoot.querySelector(\"#code-mirror-hints\"), pt(-document.scrollingElement.scrollLeft, -document.scrollingElement.scrollTop).subPt(lively.getGlobalPosition(this)));\n  }\n\n  //   async enableTern() {\n  //     await LivelyCodeMirror.loadTernModules()\n\n  //     var ecmascriptdefs = await fetch(lively4url + \"/src/external/tern/ecmascript.json\").then(r => r.json())\n  //     var browserdefs = await fetch(lively4url + \"/src/external/tern/browser.json\").then(r => r.json())\n  //     // var chaidefs = await fetch(lively4url + \"/src/external/tern/chai.json\").then(r => r.json())\n\n  //     // Options supported (all optional):\n  //     // * defs: An array of JSON definition data structures.\n  //     // * plugins: An object mapping plugin names to configuration\n  //     //   options.\n  //     // * getFile: A function(name, c) that can be used to access files in\n  //     //   the project that haven't been loaded yet. Simply do c(null) to\n  //     //   indicate that a file is not available.\n  //     // * fileFilter: A function(value, docName, doc) that will be applied\n  //     //   to documents before passing them on to Tern.\n  //     // * switchToDoc: A function(name, doc) that should, when providing a\n  //     //   multi-file view, switch the view or focus to the named file.\n  //     // * showError: A function(editor, message) that can be used to\n  //     //   override the way errors are displayed.\n  //     // * completionTip: Customize the content in tooltips for completions.\n  //     //   Is passed a single argument the completion's data as returned by\n  //     //   Tern and may return a string, DOM node, or null to indicate that\n  //     //   no tip should be shown. By default the docstring is shown.\n  //     // * typeTip: Like completionTip, but for the tooltips shown for type\n  //     //   queries.\n  //     // * responseFilter: A function(doc, query, request, error, data) that\n  //     //   will be applied to the Tern responses before treating them\n\n  //     // It is possible to run the Tern server in a web worker by specifying\n  //     // these additional options:\n  //     // * useWorker: Set to true to enable web worker mode. You'll probably\n  //     //   want to feature detect the actual value you use here, for example\n  //     //   !!window.Worker.\n  //     // * workerScript: The main script of the worker. Point this to\n  //     //   wherever you are hosting worker.js from this directory.\n  //     // * workerDeps: An array of paths pointing (relative to workerScript)\n  //     //   to the Acorn and Tern libraries and any Tern plugins you want to\n  //     //   load. Or, if you minified those into a single script and included\n  //     //   them in the workerScript, simply leave this undefined.\n\n  //     this.ternServer = new CodeMirror.TernServer({\n  //       defs: [ecmascriptdefs, browserdefs], // chaidefs\n  //       plugins: {\n  //         es_modules: {}\n  //       },\n  //       getFile: (name, c) => {\n  //         lively.notify(\"get file \" + name)\n  //         c(null)\n  //       },\n  //       // responseFilter: (doc, query, request, error, data) => {\n  //       //  return data\n  //       // }\n\n  //     });\n\n  //     this.editor.setOption(\"extraKeys\", Object.assign({},\n  //       this.editor.getOption(\"extraKeys\"),\n  //       {\n  //         \"Ctrl-Space\": (cm) => {\n  //           this.fixHintsPosition();\n  //           this.ternServer.complete(cm);\n  //         },\n  //         \"Ctrl-Alt-I\": (cm) => { this.ternServer.showType(cm); },\n  //         \"Ctrl-O\": (cm) => { this.ternServer.showDocs(cm); },\n  //         \"Alt-.\": (cm) => { this.ternServer.jumpToDef(cm); },\n  //         \"Alt-,\": (cm) => { this.ternServer.jumpBack(cm); },\n  //         \"Ctrl-Q\": (cm) => { this.ternServer.rename(cm); },\n  //         \"Ctrl-.\": (cm) => { this.ternServer.selectName(cm); }\n  //       }))\n\n  //     this.editor.on(\"cursorActivity\", (cm) => { this.ternServer.updateArgHints(cm); });\n  //   }\n\n\n  async addTernFile(name, url, text) {\n    if (!this.ternServer) return;\n    url = url || name;\n    text = text || (await fetch(url).then(r => r.text()));\n    this.ternServer.server.addFile(name, text);\n  }\n\n  mergeView(originalText, originalLeftText) {\n    var target = this.shadowRoot.querySelector(\"#code-mirror-container\");\n    target.innerHTML = \"\";\n    this._mergeView = CodeMirror.MergeView(target, {\n      value: this.value,\n      origLeft: originalLeftText,\n      orig: originalText,\n      lineNumbers: true,\n      mode: this.editor.getOption('mode'),\n      scrollbarStyle: this.editor.getOption('scrollbarStyle'),\n      highlightDifferences: true,\n      connect: \"align\",\n      lineWrapping: true,\n      collapseIdentical: false\n    });\n    // if (this._mergeView.right) {\n    // this.setEditor(this._mergeView.right.edit)\n    // }\n    this.setEditor(this._mergeView.editor\n    // this.resizeMergeView(this._mergeView)\n    ());\n  }\n\n  resizeMergeView(mergeView) {\n    function editorHeight(editor) {\n      if (!editor) return 0;\n      return editor.getScrollInfo().height;\n    }\n\n    function mergeViewHeight(mergeView) {\n      return Math.max(editorHeight(mergeView.leftOriginal()), editorHeight(mergeView.editor()), editorHeight(mergeView.rightOriginal()));\n    }\n    var height = mergeViewHeight(mergeView);\n    for (;;) {\n      if (mergeView.leftOriginal()) mergeView.leftOriginal().setSize(null, height);\n      mergeView.editor().setSize(null, height);\n      if (mergeView.rightOriginal()) mergeView.rightOriginal().setSize(null, height);\n\n      var newHeight = mergeViewHeight(mergeView);\n      if (newHeight >= height) break;else height = newHeight;\n    }\n    mergeView.wrap.style.height = height + \"px\";\n  }\n\n  async hideDataURLs() {\n    var regEx = new RegExp(\"[\\\"\\'](data:[^\\\"\\']*)[\\\"\\']\", \"g\");\n    do {\n      var m = regEx.exec(this.value);\n      if (m) {\n        var from = m.index;\n        var to = m.index + m[0].length;\n        await this.wrapWidget(\"span\", this.editor.posFromIndex(from), this.editor.posFromIndex(to)).then(div => {\n          div.style.backgroundColor = \"rgb(240,240,240)\";\n\n          if (m[1].match(/^data:image/)) {\n            var img = document.createElement(\"img\");\n            img.src = m[1];\n            img.title = m[1].slice(0, 50) + \"...\";\n            img.style.maxHeight = \"100px\";\n\n            div.appendChild(document.createTextNode(\"\\\"\"));\n            div.appendChild(img);\n            div.appendChild(document.createTextNode(\"\\\"\"));\n          } else {\n            div.innerHTML = \"\\\"\" + m[1].slice(0, 50) + \"...\" + \"\\\"\";\n          }\n        });\n      }\n    } while (m);\n  }\n\n  //    async wrapImageLinks() {\n  //     var regEx = new RegExp(\"\\!\\[\\]\\(([A-Za-z0-9_ .]\\.((jpg)|(png)))$\\)\", \"g\");\n  //     do {\n  //       var m = regEx.exec(this.value);\n  //       if (m) {\n  //         var from = m.index\n  //         var to = m.index + m[0].length\n  //         var url = m[1]\n  //         await this.wrapWidget(\"span\", this.editor.posFromIndex(from),\n  //                               this.editor.posFromIndex(to)).then( div => {\n  //           div.style.backgroundColor = \"rgb(240,240,240)\"\n\n  //           if (m[1].match(/^data:image/)) {\n  //             var img = document.createElement(\"img\")\n  //             img.src = m[1]\n  //             img.title = m[1].slice(0,50) + \"...\"\n  //             img.style.maxHeight = \"100px\"\n\n  //             div.appendChild(document.createTextNode(\"\\\"\"))\n  //             div.appendChild(img)\n  //             div.appendChild(document.createTextNode(\"\\\"\"))\n  //           } else {\n  //             div.innerHTML = \"\\\"\"+ m[1].slice(0,50) + \"...\" + \"\\\"\"\n  //           }\n  //         })\n\n  //       }\n  //     } while (m);\n  //   }\n\n\n  async wrapImports() {\n    // dev mode alternative to #DevLayers, a #S3Pattern: add code the scopes your dev example inline while developing\n    if (this.id !== 'spike') {\n      // lively.warn('skip because id is not spike')\n      return;\n    }\n    // lively.success('wrap imports in spike')\n\n    const getImportDeclarationRegex = () => {\n      const LiteralString = `([\"][^\"\\\\n\\\\r]*[\"]|['][^'\\\\n\\\\r]*['])`;\n      const JavaScriptIdentifier = '([a-zA-Z$_][a-zA-Z0-9$_]*)';\n\n      const ImportSpecifierPartSimple = `(${JavaScriptIdentifier})`;\n      const ImportSpecifierPartRename = `(${JavaScriptIdentifier}\\\\s+as\\\\s+${JavaScriptIdentifier})`;\n      const ImportSpecifierPart = `(${ImportSpecifierPartSimple}|${ImportSpecifierPartRename})`;\n      // ImportSpecifier: {foo} or {foo as bar}\n      const ImportSpecifier = `({\\\\s*((${ImportSpecifierPart}\\\\s*\\\\,\\\\s*)*${ImportSpecifierPart}\\\\,?)?\\\\s*})`;\n      // ImportDefaultSpecifier: foo\n      const ImportDefaultSpecifier = `(${JavaScriptIdentifier})`;\n      // ImportNamespaceSpecifier: * as foo\n      const ImportNamespaceSpecifier = `(\\\\*\\\\s*as\\\\s+${JavaScriptIdentifier})`;\n      const anySpecifier = `(${ImportSpecifier}|${ImportDefaultSpecifier}|${ImportNamespaceSpecifier})`;\n      // ImportDeclaration: import [any] from Literal\n      const ImportDeclaration = `import\\\\s*(${anySpecifier}\\\\s*\\\\,\\\\s*)*${anySpecifier}\\\\s*from\\\\s*${LiteralString}(\\\\s*\\\\;)?`;\n\n      return ImportDeclaration;\n    };\n\n    var regEx = new RegExp(getImportDeclarationRegex(), 'g');\n\n    do {\n      var m = regEx.exec(this.value);\n      if (m) {\n        await LivelyCodeMirrorWidgetImport.importWidgetForRange(this, m);\n      }\n    } while (m);\n  }\n\n  async wrapLinks() {\n    // dev mode\n    if (this !== window.that) {\n      return;\n    }\n    var regEx = new RegExp(\"\\<([a-zA-Z0-9]+\\:\\/\\/[^ ]+)\\>\", \"g\");\n    do {\n      var m = regEx.exec(this.value);\n      if (m) {\n        lively.warn(\"wrap link: \" + m[0]);\n        var from = m.index;\n        var to = m.index + m[0].length;\n        var link = m[1];\n        // #TODO check for an existing widget and reuse / update it...\n        await this.wrapWidget(\"span\", this.editor.posFromIndex(from), this.editor.posFromIndex(to)).then(widget => {\n          window.lastWidget = widget;\n\n          widget.style.backgroundColor = \"rgb(120,120, 240)\";\n          var input = <input></input>;\n          input.value = m[0];\n\n          lively.warn(\"new input \" + input);\n\n          input.addEventListener(\"keydown\", evt => {\n            var range = widget.marker.find();\n            if (evt.keyCode == 13) {\n              // ENTER\n              // #TODO how to replace // update text without replacing widgets\n              this.editor.replaceRange(input.value, range.from, range.to // @Stefan, your welcome! ;-)\n              );this.wrapLinks // don't wait and do what you can now\n              ();\n            }\n            if (evt.keyCode == 37) {\n              // Left\n              if (input.selectionStart == 0) {\n                this.editor.setSelection(range.from, range.from);\n                this.focus();\n              }\n            }\n\n            if (evt.keyCode == 39) {\n              // Right\n              if (input.selectionStart == input.value.length) {\n                this.editor.setSelection(range.to, range.to);\n                this.focus();\n              }\n            }\n          });\n\n          widget.appendChild(input\n          // widget.appendChild(<button click={e => {\n          //   lively.openBrowser(link)  // #TODO fix browse and open browser...\n          // }}>browse</button>)\n          );\n        });\n      }\n    } while (m);\n  }\n\n  checkSyntax() {\n    if (this.isJavaScript) {\n      SyntaxChecker.checkForSyntaxErrors(this.editor);\n      this.wrapImports();\n      this.wrapLinks();\n    }\n    if (this.isMarkdown || this.isHTML) {\n      this.hideDataURLs();\n    }\n  }\n\n  find(str) {\n    // #TODO this is horrible... Why is there not a standard method for this?\n    if (!this.editor) return;\n    var found = false;\n    this.value.split(\"\\n\").forEach((ea, index) => {\n      var startPos = ea.indexOf(str);\n      if (!found && startPos != -1) {\n        this.editor.setCursor(index + 20, 10000); // line end ;-)\n        this.editor.focus();\n        this.editor.setSelection({ line: index, ch: startPos }, { line: index, ch: startPos + str.length });\n        found = ea;\n      }\n    });\n  }\n\n  scrollToLine(line) {\n    this.editor.scrollTo(null, this.editor.heightAtLine(line - 1, \"local\"));\n  }\n\n  unsavedChanges() {\n    if (this.editor.getValue() === \"\") return false;\n    return true; // workspaces should be treated carefully\n  }\n\n  onCursorActivity() {\n    var container = lively.query(this, \"lively-container\");\n    if (!container) return;\n    var navbar = lively.query(this, \"lively-container-navbar\");\n    if (!navbar) return;\n    navbar.onDetailsContentCursorActivity(this.editor, this.editor.getCursor(\"start\"), this.editor.getCursor(\"end\"));\n  }\n\n  livelyMinimizedTitle() {\n    return this.value.slice(0, 80);\n  }\n\n  /*MD ## Active Expression Support MD*/\n\n  async dependencyGraph() {\n    return this._deps || (this._deps = new DependencyGraph((await this.astCapabilities(this.editor))));\n  }\n\n  async updateAExprDependencies() {\n    if(!this.isJavaScript || !lively.query(this, \"lively-container\")) return;\n    await this.editor;\n    /*const dependencyGraph = await this.dependencyGraph();\n    if (!dependencyGraph.capabilities.canParse || !dependencyGraph.hasActiveExpressionsDirective) {\n      this.hideAExprDependencyGutter();\n      this.resetAExprTextMarkers();\n      this.resetAExprDependencyTextMarkers();\n      return;\n    }*/\n    // this.showAExprTextMarkers();\n    await this.showAExprDependencyGutter();\n    \n    DebuggingCache.registerFileForAEDebugging(this.fileURL(), this, (triplets) => {   \n      this.allDependenciesByLine(triplets).then(([depToAE, AEToDep]) => {\n        this.editor.doc.clearGutter('activeExpressionGutter');\n        this.showAExprDependencyGutterMarkers(depToAE, false);\n        this.showAExprDependencyGutterMarkers(AEToDep, true);        \n      });\n    });\n  }\n\n  async showAExprTextMarkers() {\n    const editor = await this.editor;\n    await this.resetAExprTextMarkers();\n    const dependencyGraph = await this.dependencyGraph();\n    dependencyGraph.getAllActiveExpressions().forEach(path => {\n      const r = range(path.node.loc).asCM();\n      const mark = this.editor.markText(r[0], r[1], {\n        css: \"background-color: #3BEDED\"\n      });\n      mark.isAExprTextMarker = true;\n    });\n  }\n\n  async resetAExprTextMarkers() {\n    const editor = await this.editor;\n    editor.getAllMarks().forEach(mark => {\n      if (mark.isAExprTextMarker) {\n        mark.clear();\n      }\n    });\n  }\n\n  async showAExprDependencyGutter() {\n    const id = \"activeExpressionGutter\";\n    const editor = await this.editor;\n    let gutters = editor.getOption(\"gutters\");\n    if (!gutters.some(marker => marker === id)) {\n      editor.setOption('gutters', [...gutters, id]);\n    };\n  }\n\n  async hideAExprDependencyGutter() {\n    const id = \"activeExpressionGutter\";\n    const editor = await this.editor;\n    let gutters = editor.getOption(\"gutters\");\n    gutters = gutters.filter(marker => marker !== id);\n    editor.setOption('gutters', gutters);\n  }\n\n  async resetAExprDependencyTextMarkers() {\n    const editor = await this.editor;\n    editor.getAllMarks().forEach(mark => {\n      if (mark.isAExprDependencyTextMarker) {\n        mark.clear();\n      }\n    });\n  }\n\n  async showAExprDependencyTextMarkers() {\n    await this.editor;\n    await this.resetAExprDependencyTextMarkers();\n    const cursor = this.editor.getCursor();\n    const dependencyGraph = await this.dependencyGraph();\n    const aexprPath = dependencyGraph.getAexprAtCursor(cursor);\n    if (!aexprPath) return;\n    const deps = dependencyGraph.resolveDependencies(aexprPath.get(\"arguments\")[0]);\n    deps.forEach(path => {\n      const r = range(path.node.loc).asCM();\n      const mark = this.editor.markText(r[0], r[1], {\n        css: \"background-color: orange\"\n      });\n      mark.isAExprDependencyTextMarker = true;\n    });\n  }\n\n  async showAExprDependencyGutterMarkers(dependencyMap, isAE) {\n    await this.editor;\n\n    for (const [line, aExprs] of dependencyMap.entries()) {\n      this.drawAExprGutter(line, aExprs, isAE);\n    }\n  }\n\n  async allDependenciesByLine(depsMapInFile) {\n    const depToAE = new Map();\n    const AEToDep = new Map();\n\n    await this.editor;\n    /*const dependencyGraph = await this.dependencyGraph();\n    dependencyGraph.getAllActiveExpressions().forEach(path => {\n      const dependencies = dependencyGraph.resolveDependencies(path.get(\"arguments\")[0]);\n      const AELine = path.node.loc.start.line - 1;\n      if (!AEToDep.get(AELine)) {\n        AEToDep.set(AELine, []);\n      }\n\n      dependencies.forEach(statement => {\n        const depLine = statement.node.loc.start.line - 1;\n        if (!depToAE.get(depLine)) {\n          depToAE.set(depLine, []);\n        }\n        depToAE.get(depLine).push({ location: path.node.loc, source: path.get(\"arguments.0.body\").getSource(), events: 0 });\n        AEToDep.get(AELine).push({ location: statement.node.loc, source: statement.getSource(), events: 0 });\n      });\n    });*/\n\n    const handleDepAEPairing = (ae, dependencyLoc, dependencySource) => {\n      const dependencyLine = dependencyLoc.start.line - 1;\n      const dependencyFile = dependencyLoc.file;\n      const AELocation = ae.meta().get(\"location\");\n      const AELine = AELocation.start.line - 1;\n\n      var valueChangedEvents = ae.meta().get(\"events\").filter(event => event.type === \"changed value\");\n      const relatedEvents = valueChangedEvents.filter(event => event.value.trigger && dependencyFile.includes(event.value.trigger.file) && event.value.trigger.start.line - 1 === dependencyLine);\n\n      if (dependencyFile.includes(this.fileURL())) {\n        // Dependency is in this file\n        if (!depToAE.get(dependencyLine)) {\n          depToAE.set(dependencyLine, []);\n        }\n        // Group by AE to distinguish between mutltiple AE Objects in the same line?\n        depToAE.get(dependencyLine).push({ location: AELocation, source: ae.meta().get(\"sourceCode\"), events: relatedEvents.length, aes: new Set([ae]) });\n      }\n\n      if (AELocation.file.includes(this.fileURL())) {\n        // AE is in this file\n        if (!AEToDep.get(AELine)) {\n          AEToDep.set(AELine, []);\n        }\n        AEToDep.get(AELine).push({ location: dependencyLoc, source: dependencySource, events: relatedEvents.length, aes: new Set([ae]) });\n      }\n    };\n    \n    for (const { hook, dependency, ae } of depsMapInFile) {\n      const locations = await hook.getLocations();\n      for (const location of locations) {\n        handleDepAEPairing(ae, location, dependency.identifier);\n      }\n      /*const memberName = dependency.contextIdentifierValue()[1];\n      let deps = dependencyGraph.resolveDependenciesForMember(memberName);\n       deps.forEach(path => {\n        for (const ae of aes) {\n          handleDepAEPairing(ae, this.fileURL(), path.node.loc, path.getSource());\n        }\n      });*/\n    }\n    /*const aeMapInFile = getAETriplesForFile(this.fileURL());\n    for (const { hook, dependency, ae } of aeMapInFile) {\n      const dependencyInfo = dependency.contextIdentifierValue();\n      const locations = await hook.getLocations();\n      for (const location of locations) {\n        const start = { line: location.line, column: location.column };\n        handleDepAEPairing(ae, location.source, { start, end: start /*TODO: Find end*//*, file: location.source }, dependencyInfo[1]);\n      }\n    }*/\n\n    /*let dynamicAES = AExprRegistry.allAsArray();\n    dynamicAES.forEach(ae => {   \n      var valueChangedEvents = ae.meta().get(\"events\").filter(event => event.type === \"changed value\");\n      valueChangedEvents.forEach(event => {        \n        if(event.value.trigger.source.includes(this.fileURL())) {     \n          const line = event.value.trigger.line - 1;\n          if (!dict.get(line)) {\n            dict.set(line, []);\n          }\n          dict.get(line).push({ location: ae._annotations._annotations[0].location, source: ae._annotations._annotations[1].sourceCode });\n        }\n      });\n    });*/\n\n    return [depToAE, AEToDep];\n  }\n\n  fileURL() {\n    return lively.query(this, \"lively-container\").getURL().pathname;\n  }\n  \n  valid() {\n    return lively.allParents(this, [], true).includes(document.body);\n  }\n\n  drawAExprGutter(line, dependencies, isAE) {\n    this.editor.doc.setGutterMarker(line, 'activeExpressionGutter', this.drawAExprGutterMarker(dependencies, isAE));\n  }\n\n  faIcon(name, ...modifiers) {\n    return `<i class=\"fa fa-${name} ${modifiers.map(m => 'fa-' + m).join(' ')}\"></i>`;\n  }\n  \n  drawAExprGutterMarker(dependencies, isAE) {\n    //Use accumulate instead\n    const sorted = dependencies.sort((aDep, bDep) => {\n      const a = aDep.location;\n      const b = bDep.location;\n      if (a.file < b.file) {\n        return -1;\n      } else if (a.file > b.file) {\n        return 1;\n      }\n      if (a.start.line < b.start.line) {\n        return -1;\n      } else if (a.start.line > b.start.line) {\n        return 1;\n      }\n      return a.start.column - b.start.column;\n    });\n\n    const accumulated = [];\n\n    sorted.forEach(dep => {\n      //Location might differ due to one object having this file as source and the other not having a source\n      if (accumulated.length === 0 || !_.isEqual(accumulated[accumulated.length - 1].location.start, dep.location.start)) {\n        accumulated.push(dep);\n      } else {\n        const lastDep = accumulated[accumulated.length - 1];\n\n        lastDep.events += dep.events;\n        if(dep.source.length > lastDep.source.length) {\n          lastDep.source = dep.source;\n        }\n        if(dep.location.end.column > lastDep.location.end.column) {\n          lastDep.location.end = dep.location.end;\n        }\n        lastDep.aes = new Set([...lastDep.aes, ...dep.aes]);\n      }\n    });\n\n    const callback = async evt => {\n      const markerBounds = evt.target.getBoundingClientRect();\n      this.drawAExprDependencyList(accumulated, markerBounds);\n    };\n\n    return <div class={\"activeExpressionGutter-marker\" + (isAE ? \"-ae\" : \"-dep\")} click={callback}>\n      {isAE ? <b>AE</b> : <i class=\"fa fa-share-alt\"></i>}\n    </div>;\n  }\n\n  async drawAExprDependencyList(dependencies, markerBounds) {\n\n    const menuItems = [];\n    const allAEs = this.union(...dependencies.map(dep => dep.aes))\n    menuItems.push([\"open timeline\", () => {navigateToTimeline((timeline) => \n      timeline.filterToAEs(allAEs))}, \"\", \"l\"]);\n\n    dependencies.forEach(dep => {\n      const source = dep.source;\n      const line = dep.location.start.line;\n      let description = `${line}: ${source}`;\n      let path = dep.location.file;\n      const inThisFile = !path || path.includes(this.fileURL());\n      if (inThisFile) {\n        description = 'line ' + description;\n      } else {\n        description = path.substring(path.lastIndexOf(\"/\") + 1) + \":\" + description;\n      }\n      menuItems.push([description, () => {\n        openLocationInBrowser(dep.location);\n        menu.remove();\n      }, dep.events + \" event\" + (dep.events === 1 ? \"\" : \"s\") + \", \" + dep.aes.size + \" instance\" + (dep.aes.size === 1 ? \"\" : \"s\"), this.faIcon(inThisFile ? 'location-arrow' : 'file-code-o')]);\n    });\n\n    const menu = await ContextMenu.openIn(document.body, { clientX: markerBounds.left, clientY: markerBounds.bottom }, undefined, document.body, menuItems);\n    menu.addEventListener(\"DOMNodeRemoved\", () => {\n      this.focus();\n    });\n  }\n  \n  union(...iterables) {\n    const set = new Set();\n\n    for (const iterable of iterables) {\n      for (const item of iterable) {\n        set.add(item);\n      }\n    }\n\n    return set;\n  }\n}"]}