{"version":3,"sources":["webpack:///./node_modules/core-js/modules/_array-methods.js","webpack:///./node_modules/vue2-jsoneditor/src/components/JsonEditor.vue?3719","webpack:///node_modules/vue2-jsoneditor/src/components/JsonEditor.vue","webpack:///./node_modules/vue2-jsoneditor/src/components/JsonEditor.vue?e17d","webpack:///./node_modules/vue2-jsoneditor/src/components/JsonEditor.vue","webpack:///./node_modules/core-js/modules/es6.array.find.js","webpack:///./node_modules/jsoneditor/dist/jsoneditor-minimalist.js","webpack:///./node_modules/core-js/modules/_array-species-create.js","webpack:///./node_modules/core-js/modules/_array-species-constructor.js"],"names":["ctx","__webpack_require__","IObject","toObject","toLength","asc","module","exports","TYPE","$create","IS_MAP","IS_FILTER","IS_SOME","IS_EVERY","IS_FIND_INDEX","NO_HOLES","create","$this","callbackfn","that","val","res","O","self","f","length","index","result","undefined","push","render","_vm","this","_h","$createElement","_c","_self","ref","staticRenderFns","JsonEditorvue_type_script_lang_js_","name","data","editor","props","json","required","options","type","Object","default","onChange","Function","watch","handler","newJson","set","deep","methods","_onChange","e","get","mounted","container","$refs","jsoneditor","lodash_default","a","extend","jsoneditor_minimalist_default","beforeDestroy","destroy","components_JsonEditorvue_type_script_lang_js_","component","componentNormalizer","__webpack_exports__","$export","$find","KEY","forced","Array","P","F","find","arguments","root","factory","modules","installedModules","moduleId","id","loaded","call","m","c","p","Ajv","Error","code","err","treemode","textmode","util","JSONEditor","ieVersion","getInternetExplorerVersion","error","console","warn","onError","change","editable","onEditable","VALID_OPTIONS","keys","forEach","option","indexOf","_create","modes","prototype","DEBOUNCE_INTERVAL","mode","setMode","setText","jsonText","parse","getText","JSON","stringify","setName","getName","oldMode","config","asText","clear","mixin","load","onModeChange","_onError","getMode","setSchema","schema","ajv","allErrors","verbose","validateSchema","compile","validate","refresh","registerMode","i","prop","isArray","reserved","Highlighter","History","SearchBox","ContextMenu","Node","ModeSwitcher","dom","highlighter","selection","multiselection","nodes","errorNodes","node","focusTarget","_setOptions","history","_createFrame","_createTable","frame","parentNode","removeChild","_debouncedValidate","searchBox","modeSwitcher","search","hasOwnProperty","debounce","bind","content","table","params","field","value","_setRoot","recurse","expand","appendChild","getNodeFromTarget","blur","getValue","updateField","focus","input","querySelector","menu","collapse","tbody","getDom","text","results","expandAll","collapseAll","_onAction","action","add","setError","duplicateErrors","schemaErrors","valid","errors","map","improveSchemaError","findNode","dataPath","filter","entry","concat","reduce","all","findParents","parent","child","message","updateDom","startAutoScroll","mouseY","me","top","getAbsoluteTop","height","clientHeight","bottom","margin","interval","scrollTop","autoScrollStep","scrollHeight","autoScrollTimer","setInterval","stopAutoScroll","clearTimeout","setSelection","select","range","setSelectionOffset","getSelection","getSelectionOffset","nodeName","slice","scrollTo","callback","animateTimeout","animateCallback","finalScrollTop","Math","min","max","animate","diff","abs","setTimeout","document","createElement","className","onEvent","event","_onEvent","onclick","target","preventDefault","oninput","onchange","onkeydown","onkeyup","oncut","onpaste","onmousedown","onmouseup","onmouseover","onmouseout","addEventListener","onfocusin","onfocusout","title","undo","_onUndo","redo","_onRedo","disabled","canUndo","canRedo","_onKeyDown","_startDragDistance","_updateDragDistance","selected","showContextMenu","hasMoved","deselect","onDragStart","drag","_onMultiSelectStart","dragDistanceEvent","initialTarget","initialPageX","pageX","initialPageY","pageY","dragDistance","diffX","diffY","sqrt","start","end","mousemove","window","_onMultiSelect","mouseup","_onMultiSelectEnd","_findTopLevelNodes","removeEventListener","clearStartAndEnd","setSelected","first","startPath","getNodePath","endPath","startChild","endChild","childs","startIndex","endIndex","firstIndex","lastIndex","keynum","which","keyCode","ctrlKey","shiftKey","handled","selectContentEditable","previous","next","stopPropagation","col","contentOuter","colgroupContent","width","anchor","onClose","items","click","onDuplicate","onRemove","close","show","locked","highlight","setHighlight","_cancelUnhighlight","unhighlight","unhighlightTimer","lock","unlock","actions","editField","oldValue","newValue","editValue","updateValue","changeType","oldType","newType","appendNodes","insertBeforeNodes","insertBefore","beforeNode","insertAfterNodes","afterNode","insertAfter","removeNodes","append","duplicateNodes","moveNodes","oldBeforeNode","moveBefore","newBeforeNode","sort","hideChilds","oldSort","oldChilds","showChilds","newSort","newChilds","timestamp","Date","splice","obj","oldSelection","newSelection","jsonlint","jsonString","sanitize","jsString","chars","match","curr","charAt","prev","lastNonWhitespace","pp","skipBlockComment","skipComment","parseString","quote","parseKey","specialValues","key","regexp","test","join","escapeUnicodeChars","replace","charCodeAt","toString","b","object","Number","String","Boolean","RegExp","isUrlRegex","isUrl","getAbsoluteLeft","elem","rect","getBoundingClientRect","left","pageXOffset","scrollLeft","pageYOffset","addClassName","classes","split","removeClassName","stripFormatting","divElement","childNodes","iMax","style","removeAttribute","attributes","j","attribute","specified","setEndOfContentEditable","contentEditableElement","createRange","selectNodeContents","removeAllRanges","addRange","sel","getRangeAt","rangeCount","startContainer","endContainer","startOffset","endOffset","firstChild","createTextNode","setStart","setEnd","getInnerText","element","buffer","flush","nodeValue","hasChildNodes","innerText","prevChild","prevName","_ieVersion","rv","navigator","appName","ua","userAgent","re","exec","parseFloat","$1","isFirefox","listener","useCapture","attachEvent","detachEvent","parsePath","jsonPath","remainder","substr","SyntaxError","substring","keyword","enums","more","additionalProperty","insideRect","_margin","right","func","wait","immediate","timeout","context","args","later","apply","callNow","textDiff","oldText","newText","len","oldEnd","newEnd","parser","trace","yy","symbols_","JSONString","STRING","JSONNumber","NUMBER","JSONNullLiteral","NULL","JSONBooleanLiteral","TRUE","FALSE","JSONText","JSONValue","EOF","JSONObject","JSONArray","{","}","JSONMemberList","JSONMember",":",",","[","]","JSONElementList","$accept","$end","terminals_","2","4","6","8","10","11","14","17","18","21","22","23","24","productions_","performAction","yytext","yyleng","yylineno","yystate","$$","_$","$0","$","3","5","7","9","12","13","15","16","1","19","20","25","defaultActions","parseError","str","hash","stack","vstack","lstack","recovering","TERROR","lexer","setInput","yylloc","yyloc","popStack","n","lex","token","symbol","preErrorSymbol","state","r","newState","expected","yyval","errStr","showPosition","line","loc","first_line","last_line","first_column","last_column","_input","_more","_less","done","matched","conditionStack","ch","lines","unput","less","pastInput","past","upcomingInput","pre","tempMatch","rules","_currentRules","flex","begin","condition","popState","pop","conditions","topState","pushState","yy_","$avoiding_name_collisions","YY_START","INITIAL","inclusive","delay","lastText","tr","td","divInput","tableInput","tbodySearch","refreshSearch","_onDelayedSearch","_onSearch","_onKeyUp","searchNext","searchPrevious","resultIndex","_setActiveResult","activeResult","prevNode","prevElem","searchFieldActive","searchValueActive","_clearDelay","forceSearch","resultCount","innerHTML","eventListeners","list","focusButton","li","createMenuItems","domItems","item","separator","domItem","button","hide","submenu","buttonSubmenu","divIcon","buttonExpand","submenuTitle","divExpand","_onExpandItem","domSubItems","subItems","ul","overflow","maxHeight","_getVisibleButtons","buttons","expandedItem","subItem","visibleMenu","contentWindow","showBelow","anchorRect","contentRect","anchorHeight","offsetHeight","mousedown","_isChildOf","keydown","fn","alreadyVisible","padding","display","targetIndex","prevButton","nextButton","naturalSort","appendNodeFactory","expanded","setField","fieldEditable","setValue","_debouncedOnChangeValue","_onChangeValue","_debouncedOnChangeField","_onChangeField","_updateEditability","path","getPath","unshift","shift","parents","tdError","tdValue","popover","onfocus","directions","direction","popoverRect","fit","getIndex","setParent","previousField","getField","_getDomField","childValue","_getType","childField","sortObjectKeys","previousValue","arr","_getDomValue","getLevel","clone","fieldInnerText","valueInnerText","cloneChilds","childClone","getAppend","nextTr","nextSibling","_hasChilds","newTr","appendTr","updateIndexes","trTemp","AppendNode","moveTo","currentIndex","toLowerCase","searchField","searchValue","_updateDomField","childResults","_updateDomValue","offsetTop","focusElement","elementName","editableDiv","containsNode","_move","clearDom","removedNode","_remove","lastTr","_stringCast","silent","_unescapeHTML","undoDiff","redoDiff","domValue","classNames","isEmpty","count","checkbox","tdCheckbox","checked","enum","getUTCMilliseconds","tdSelect","valueFieldHTML","visibility","domField","duplicateKeys","tdDrag","domDrag","tdMenu","tdField","tree","_createDomTree","firstNode","lastNode","draggedNode","_nextSibling","offsetY","onDrag","onDragEnd","oldCursor","body","cursor","mouseX","level","trThis","trPrev","trNext","trFirst","trLast","trRoot","nodePrev","nodeNext","topThis","topPrev","topFirst","heightThis","bottomNext","heightNext","moved","previousSibling","diffLevel","round","levelNext","isDraggedNode","some","_createDomField","isFirst","domTree","marginLeft","fieldText","contentEditable","spellcheck","_escapeHTML","_updateSchema","_updateDomIndexes","_findSchema","_findEnum","composite","oneOf","anyOf","allOf","childSchema","properties","_createDomValue","href","_createDomExpandButton","borderCollapse","tdExpand","tdSeparator","srcElement","expandable","_onExpand","open","offsetX","onKeyDown","nextNode","nextDom","nextDom2","altKey","selectedNodes","_onInsertBefore","_onInsertAfter","endNode","_lastNode","_getElementName","homeNode","_firstNode","prevElement","_previousElement","appendDom","nextNode2","_previousNode","nextElement","_nextElement","prevDom","isVisible","_nextNode","blurNodes","clones","newNode","_onAppend","_onChangeType","order","oldSortOrder","sortOrder","firstDom","lastDom","lastChild","TYPE_TITLES","auto","array","string","titles","lower","num","numFloat","isNaN","htmlEscaped","html","escapeUnicode","escapedText","_escapeJSON","escaped","oFxNcL","oFyNcL","sre","dre","hre","ore","s","insensitive","x","y","xN","yN","xD","parseInt","yD","cLoc","numS","trAppend","tdAppend","domText","paddingLeft","current","onSwitch","availableModes","form","view","currentMode","currentTitle","box","position","ace","MAX_ERRORS","DEFAULT_THEME","indentation","_ace","theme","aceEditor","textarea","clientWidth","buttonFormat","format","buttonCompact","compact","editorDom","edit","$blockScrolling","Infinity","setTheme","setShowPrintMargin","setFontSize","getSession","setTabSize","setUseSoftTabs","setUseWrapMode","commands","bindKey","defineProperty","poweredBy","on","resize","force","originalOnChange","validationErrors","marginBottom","paddingBottom","doValidate","limit","hidden","define","acequire","oop","TextHighlightRules","JsonHighlightRules","$rules","regex","inherits","Range","MatchingBraceOutdent","checkOutdent","autoOutdent","doc","row","getLine","column","openBracePos","findMatchingBracket","indent","$getIndent","Behaviour","TokenIterator","lang","SAFE_INSERT_IN_TOKENS","SAFE_INSERT_BEFORE_TOKENS","contextCache","initContext","multiSelect","autoInsertedBrackets","autoInsertedRow","autoInsertedLineEnd","maybeInsertedBrackets","maybeInsertedRow","maybeInsertedLineStart","maybeInsertedLineEnd","getWrapped","opening","closing","rowDiff","CstyleBehaviour","session","getCursorPosition","getSelectionRange","getTextRange","getWrapBehavioursEnabled","isSaneInsertion","inMultiSelectMode","recordAutoInsert","recordMaybeInsert","rightChar","matching","$findOpeningBracket","isAutoInsertedClosing","popAutoInsertedClosing","isMaybeInsertedClosing","stringRepeat","clearMaybeInsertedClosing","next_indent","getTabString","isMultiLine","leftChar","getTokenAt","rightToken","pair","stringBefore","stringAfter","wordRe","$mode","tokenRe","isWordBefore","isWordAfter","iterator","$matchTokenType","getCurrentToken","iterator2","stepForward","getCurrentTokenRow","types","bracket","BaseFoldMode","FoldMode","commentRegex","foldingStartMarker","source","foldingStopMarker","singleLineBlockCommentRe","tripleStarBlockCommentRe","startRegionRe","_getFoldWidgetBase","getFoldWidget","foldStyle","fw","getFoldWidgetRange","forceMultiline","getCommentRegionBlock","openingBracketBlock","getCommentFoldRange","getSectionRange","closingBracketBlock","startIndent","startRow","startColumn","endRow","maxRow","getLength","subRange","depth","TextMode","Mode","HighlightRules","CStyleFoldMode","WorkerClient","$outdent","$behaviour","foldingRules","getNextLineIndent","tab","createWorker","worker","attachToDocument","getDocument","setAnnotations","clearAnnotations","$id","src","searchboxCss","HashHandler","keyUtil","importCssString","showReplaceForm","div","$init","setEditor","$initElements","sb","replaceBox","searchOptions","regExpOption","caseSensitiveOption","wholeWordOption","searchInput","replaceInput","_this","addListener","activeInput","t","getAttribute","$searchBarKb","addCommandKeyListener","hashId","keyString","keyCodeToString","command","findKeyCommand","stopEvent","$onChange","delayedCall","schedule","$closeSearchBarKb","bindKeys","Ctrl-f|Command-f","isReplace","Ctrl-H|Command-Option-F","Ctrl-G|Command-G","findNext","Ctrl-Shift-G|Command-Shift-G","findPrev","esc","Return","Shift-Return","Alt-Return","replaceAll","findAll","Tab","addCommands","win","mac","$syncOptions","setCssClass","$search","$options","renderer","updateBackMarkers","skipCurrent","backwards","preventScroll","wrap","regExp","caseSensitive","wholeWord","noMatch","_emit","getReadOnly","replaceAndFindNext","keyBinding","removeKeyboardHandler","addKeyboardHandler","isFocused","el","activeElement","Search","isDark","cssClass","cssText","speciesConstructor","original","isObject","SPECIES","C","constructor"],"mappings":"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","file":"js/chunk-6467ee84.264e18e0.js","sourcesContent":["// 0 -> Array#forEach\n// 1 -> Array#map\n// 2 -> Array#filter\n// 3 -> Array#some\n// 4 -> Array#every\n// 5 -> Array#find\n// 6 -> Array#findIndex\nvar ctx = require('./_ctx');\nvar IObject = require('./_iobject');\nvar toObject = require('./_to-object');\nvar toLength = require('./_to-length');\nvar asc = require('./_array-species-create');\nmodule.exports = function (TYPE, $create) {\n var IS_MAP = TYPE == 1;\n var IS_FILTER = TYPE == 2;\n var IS_SOME = TYPE == 3;\n var IS_EVERY = TYPE == 4;\n var IS_FIND_INDEX = TYPE == 6;\n var NO_HOLES = TYPE == 5 || IS_FIND_INDEX;\n var create = $create || asc;\n return function ($this, callbackfn, that) {\n var O = toObject($this);\n var self = IObject(O);\n var f = ctx(callbackfn, that, 3);\n var length = toLength(self.length);\n var index = 0;\n var result = IS_MAP ? create($this, length) : IS_FILTER ? create($this, 0) : undefined;\n var val, res;\n for (;length > index; index++) if (NO_HOLES || index in self) {\n val = self[index];\n res = f(val, index, O);\n if (TYPE) {\n if (IS_MAP) result[index] = res; // map\n else if (res) switch (TYPE) {\n case 3: return true; // some\n case 5: return val; // find\n case 6: return index; // findIndex\n case 2: result.push(val); // filter\n } else if (IS_EVERY) return false; // every\n }\n }\n return IS_FIND_INDEX ? -1 : IS_SOME || IS_EVERY ? IS_EVERY : result;\n };\n};\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{ref:\"jsoneditor\"})}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n\n\n\n\n","import mod from \"-!../../../cache-loader/dist/cjs.js??ref--12-0!../../../thread-loader/dist/cjs.js!../../../babel-loader/lib/index.js!../../../cache-loader/dist/cjs.js??ref--0-0!../../../vue-loader/lib/index.js??vue-loader-options!./JsonEditor.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../cache-loader/dist/cjs.js??ref--12-0!../../../thread-loader/dist/cjs.js!../../../babel-loader/lib/index.js!../../../cache-loader/dist/cjs.js??ref--0-0!../../../vue-loader/lib/index.js??vue-loader-options!./JsonEditor.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./JsonEditor.vue?vue&type=template&id=bf866286&\"\nimport script from \"./JsonEditor.vue?vue&type=script&lang=js&\"\nexport * from \"./JsonEditor.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","'use strict';\n// 22.1.3.8 Array.prototype.find(predicate, thisArg = undefined)\nvar $export = require('./_export');\nvar $find = require('./_array-methods')(5);\nvar KEY = 'find';\nvar forced = true;\n// Shouldn't skip holes\nif (KEY in []) Array(1)[KEY](function () { forced = false; });\n$export($export.P + $export.F * forced, 'Array', {\n find: function find(callbackfn /* , that = undefined */) {\n return $find(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\nrequire('./_add-to-unscopables')(KEY);\n","/*!\n * jsoneditor.js\n *\n * @brief\n * JSONEditor is a web-based tool to view, edit, format, and validate JSON.\n * It has various modes such as a tree editor, a code editor, and a plain text\n * editor.\n *\n * Supported browsers: Chrome, Firefox, Safari, Opera, Internet Explorer 8+\n *\n * @license\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not\n * use this file except in compliance with the License. You may obtain a copy\n * of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the\n * License for the specific language governing permissions and limitations under\n * the License.\n *\n * Copyright (c) 2011-2017 Jos de Jong, http://jsoneditoronline.org\n *\n * @author Jos de Jong, \n * @version 5.5.11\n * @date 2017-01-06\n */\n(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 if(typeof exports === 'object')\n\t\texports[\"JSONEditor\"] = factory();\n\telse\n\t\troot[\"JSONEditor\"] = factory();\n})(this, function() {\nreturn /******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId])\n/******/ \t\t\treturn installedModules[moduleId].exports;\n\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\texports: {},\n/******/ \t\t\tid: moduleId,\n/******/ \t\t\tloaded: false\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.loaded = 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// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(0);\n/******/ })\n/************************************************************************/\n/******/ ([\n/* 0 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar Ajv;\n\ttry {\n\t Ajv = __webpack_require__(!(function webpackMissingModule() { var e = new Error(\"Cannot find module \\\"ajv\\\"\"); e.code = 'MODULE_NOT_FOUND'; throw e; }()));\n\t}\n\tcatch (err) {\n\t // no problem... when we need Ajv we will throw a neat exception\n\t}\n\n\tvar treemode = __webpack_require__(1);\n\tvar textmode = __webpack_require__(12);\n\tvar util = __webpack_require__(4);\n\n\t/**\n\t * @constructor JSONEditor\n\t * @param {Element} container Container element\n\t * @param {Object} [options] Object with options. available options:\n\t * {String} mode Editor mode. Available values:\n\t * 'tree' (default), 'view',\n\t * 'form', 'text', and 'code'.\n\t * {function} onChange Callback method, triggered\n\t * on change of contents\n\t * {function} onError Callback method, triggered\n\t * when an error occurs\n\t * {Boolean} search Enable search box.\n\t * True by default\n\t * Only applicable for modes\n\t * 'tree', 'view', and 'form'\n\t * {Boolean} history Enable history (undo/redo).\n\t * True by default\n\t * Only applicable for modes\n\t * 'tree', 'view', and 'form'\n\t * {String} name Field name for the root node.\n\t * Only applicable for modes\n\t * 'tree', 'view', and 'form'\n\t * {Number} indentation Number of indentation\n\t * spaces. 4 by default.\n\t * Only applicable for\n\t * modes 'text' and 'code'\n\t * {boolean} escapeUnicode If true, unicode\n\t * characters are escaped.\n\t * false by default.\n\t * {boolean} sortObjectKeys If true, object keys are\n\t * sorted before display.\n\t * false by default.\n\t * @param {Object | undefined} json JSON object\n\t */\n\tfunction JSONEditor (container, options, json) {\n\t if (!(this instanceof JSONEditor)) {\n\t throw new Error('JSONEditor constructor called without \"new\".');\n\t }\n\n\t // check for unsupported browser (IE8 and older)\n\t var ieVersion = util.getInternetExplorerVersion();\n\t if (ieVersion != -1 && ieVersion < 9) {\n\t throw new Error('Unsupported browser, IE9 or newer required. ' +\n\t 'Please install the newest version of your browser.');\n\t }\n\n\t if (options) {\n\t // check for deprecated options\n\t if (options.error) {\n\t console.warn('Option \"error\" has been renamed to \"onError\"');\n\t options.onError = options.error;\n\t delete options.error;\n\t }\n\t if (options.change) {\n\t console.warn('Option \"change\" has been renamed to \"onChange\"');\n\t options.onChange = options.change;\n\t delete options.change;\n\t }\n\t if (options.editable) {\n\t console.warn('Option \"editable\" has been renamed to \"onEditable\"');\n\t options.onEditable = options.editable;\n\t delete options.editable;\n\t }\n\n\t // validate options\n\t if (options) {\n\t var VALID_OPTIONS = [\n\t 'ace', 'theme',\n\t 'ajv', 'schema',\n\t 'onChange', 'onEditable', 'onError', 'onModeChange',\n\t 'escapeUnicode', 'history', 'search', 'mode', 'modes', 'name', 'indentation', 'sortObjectKeys'\n\t ];\n\n\t Object.keys(options).forEach(function (option) {\n\t if (VALID_OPTIONS.indexOf(option) === -1) {\n\t console.warn('Unknown option \"' + option + '\". This option will be ignored');\n\t }\n\t });\n\t }\n\t }\n\n\t if (arguments.length) {\n\t this._create(container, options, json);\n\t }\n\t}\n\n\t/**\n\t * Configuration for all registered modes. Example:\n\t * {\n\t * tree: {\n\t * mixin: TreeEditor,\n\t * data: 'json'\n\t * },\n\t * text: {\n\t * mixin: TextEditor,\n\t * data: 'text'\n\t * }\n\t * }\n\t *\n\t * @type { Object. }\n\t */\n\tJSONEditor.modes = {};\n\n\t// debounce interval for JSON schema vaidation in milliseconds\n\tJSONEditor.prototype.DEBOUNCE_INTERVAL = 150;\n\n\t/**\n\t * Create the JSONEditor\n\t * @param {Element} container Container element\n\t * @param {Object} [options] See description in constructor\n\t * @param {Object | undefined} json JSON object\n\t * @private\n\t */\n\tJSONEditor.prototype._create = function (container, options, json) {\n\t this.container = container;\n\t this.options = options || {};\n\t this.json = json || {};\n\n\t var mode = this.options.mode || 'tree';\n\t this.setMode(mode);\n\t};\n\n\t/**\n\t * Destroy the editor. Clean up DOM, event listeners, and web workers.\n\t */\n\tJSONEditor.prototype.destroy = function () {};\n\n\t/**\n\t * Set JSON object in editor\n\t * @param {Object | undefined} json JSON data\n\t */\n\tJSONEditor.prototype.set = function (json) {\n\t this.json = json;\n\t};\n\n\t/**\n\t * Get JSON from the editor\n\t * @returns {Object} json\n\t */\n\tJSONEditor.prototype.get = function () {\n\t return this.json;\n\t};\n\n\t/**\n\t * Set string containing JSON for the editor\n\t * @param {String | undefined} jsonText\n\t */\n\tJSONEditor.prototype.setText = function (jsonText) {\n\t this.json = util.parse(jsonText);\n\t};\n\n\t/**\n\t * Get stringified JSON contents from the editor\n\t * @returns {String} jsonText\n\t */\n\tJSONEditor.prototype.getText = function () {\n\t return JSON.stringify(this.json);\n\t};\n\n\t/**\n\t * Set a field name for the root node.\n\t * @param {String | undefined} name\n\t */\n\tJSONEditor.prototype.setName = function (name) {\n\t if (!this.options) {\n\t this.options = {};\n\t }\n\t this.options.name = name;\n\t};\n\n\t/**\n\t * Get the field name for the root node.\n\t * @return {String | undefined} name\n\t */\n\tJSONEditor.prototype.getName = function () {\n\t return this.options && this.options.name;\n\t};\n\n\t/**\n\t * Change the mode of the editor.\n\t * JSONEditor will be extended with all methods needed for the chosen mode.\n\t * @param {String} mode Available modes: 'tree' (default), 'view', 'form',\n\t * 'text', and 'code'.\n\t */\n\tJSONEditor.prototype.setMode = function (mode) {\n\t var container = this.container;\n\t var options = util.extend({}, this.options);\n\t var oldMode = options.mode;\n\t var data;\n\t var name;\n\n\t options.mode = mode;\n\t var config = JSONEditor.modes[mode];\n\t if (config) {\n\t try {\n\t var asText = (config.data == 'text');\n\t name = this.getName();\n\t data = this[asText ? 'getText' : 'get'](); // get text or json\n\n\t this.destroy();\n\t util.clear(this);\n\t util.extend(this, config.mixin);\n\t this.create(container, options);\n\n\t this.setName(name);\n\t this[asText ? 'setText' : 'set'](data); // set text or json\n\n\t if (typeof config.load === 'function') {\n\t try {\n\t config.load.call(this);\n\t }\n\t catch (err) {\n\t console.error(err);\n\t }\n\t }\n\n\t if (typeof options.onModeChange === 'function' && mode !== oldMode) {\n\t try {\n\t options.onModeChange(mode, oldMode);\n\t }\n\t catch (err) {\n\t console.error(err);\n\t }\n\t }\n\t }\n\t catch (err) {\n\t this._onError(err);\n\t }\n\t }\n\t else {\n\t throw new Error('Unknown mode \"' + options.mode + '\"');\n\t }\n\t};\n\n\t/**\n\t * Get the current mode\n\t * @return {string}\n\t */\n\tJSONEditor.prototype.getMode = function () {\n\t return this.options.mode;\n\t};\n\n\t/**\n\t * Throw an error. If an error callback is configured in options.error, this\n\t * callback will be invoked. Else, a regular error is thrown.\n\t * @param {Error} err\n\t * @private\n\t */\n\tJSONEditor.prototype._onError = function(err) {\n\t if (this.options && typeof this.options.onError === 'function') {\n\t this.options.onError(err);\n\t }\n\t else {\n\t throw err;\n\t }\n\t};\n\n\t/**\n\t * Set a JSON schema for validation of the JSON object.\n\t * To remove the schema, call JSONEditor.setSchema(null)\n\t * @param {Object | null} schema\n\t */\n\tJSONEditor.prototype.setSchema = function (schema) {\n\t // compile a JSON schema validator if a JSON schema is provided\n\t if (schema) {\n\t var ajv;\n\t try {\n\t // grab ajv from options if provided, else create a new instance\n\t ajv = this.options.ajv || Ajv({ allErrors: true, verbose: true });\n\n\t }\n\t catch (err) {\n\t console.warn('Failed to create an instance of Ajv, JSON Schema validation is not available. Please use a JSONEditor bundle including Ajv, or pass an instance of Ajv as via the configuration option `ajv`.');\n\t }\n\n\t if (ajv) {\n\t this.validateSchema = ajv.compile(schema);\n\n\t // add schema to the options, so that when switching to an other mode,\n\t // the set schema is not lost\n\t this.options.schema = schema;\n\n\t // validate now\n\t this.validate();\n\t }\n\n\t this.refresh(); // update DOM\n\t }\n\t else {\n\t // remove current schema\n\t this.validateSchema = null;\n\t this.options.schema = null;\n\t this.validate(); // to clear current error messages\n\t this.refresh(); // update DOM\n\t }\n\t};\n\n\t/**\n\t * Validate current JSON object against the configured JSON schema\n\t * Throws an exception when no JSON schema is configured\n\t */\n\tJSONEditor.prototype.validate = function () {\n\t // must be implemented by treemode and textmode\n\t};\n\n\t/**\n\t * Refresh the rendered contents\n\t */\n\tJSONEditor.prototype.refresh = function () {\n\t // can be implemented by treemode and textmode\n\t};\n\n\t/**\n\t * Register a plugin with one ore multiple modes for the JSON Editor.\n\t *\n\t * A mode is described as an object with properties:\n\t *\n\t * - `mode: String` The name of the mode.\n\t * - `mixin: Object` An object containing the mixin functions which\n\t * will be added to the JSONEditor. Must contain functions\n\t * create, get, getText, set, and setText. May have\n\t * additional functions.\n\t * When the JSONEditor switches to a mixin, all mixin\n\t * functions are added to the JSONEditor, and then\n\t * the function `create(container, options)` is executed.\n\t * - `data: 'text' | 'json'` The type of data that will be used to load the mixin.\n\t * - `[load: function]` An optional function called after the mixin\n\t * has been loaded.\n\t *\n\t * @param {Object | Array} mode A mode object or an array with multiple mode objects.\n\t */\n\tJSONEditor.registerMode = function (mode) {\n\t var i, prop;\n\n\t if (util.isArray(mode)) {\n\t // multiple modes\n\t for (i = 0; i < mode.length; i++) {\n\t JSONEditor.registerMode(mode[i]);\n\t }\n\t }\n\t else {\n\t // validate the new mode\n\t if (!('mode' in mode)) throw new Error('Property \"mode\" missing');\n\t if (!('mixin' in mode)) throw new Error('Property \"mixin\" missing');\n\t if (!('data' in mode)) throw new Error('Property \"data\" missing');\n\t var name = mode.mode;\n\t if (name in JSONEditor.modes) {\n\t throw new Error('Mode \"' + name + '\" already registered');\n\t }\n\n\t // validate the mixin\n\t if (typeof mode.mixin.create !== 'function') {\n\t throw new Error('Required function \"create\" missing on mixin');\n\t }\n\t var reserved = ['setMode', 'registerMode', 'modes'];\n\t for (i = 0; i < reserved.length; i++) {\n\t prop = reserved[i];\n\t if (prop in mode.mixin) {\n\t throw new Error('Reserved property \"' + prop + '\" not allowed in mixin');\n\t }\n\t }\n\n\t JSONEditor.modes[name] = mode;\n\t }\n\t};\n\n\t// register tree and text modes\n\tJSONEditor.registerMode(treemode);\n\tJSONEditor.registerMode(textmode);\n\n\tmodule.exports = JSONEditor;\n\n\n/***/ },\n/* 1 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\n\tvar Highlighter = __webpack_require__(2);\n\tvar History = __webpack_require__(3);\n\tvar SearchBox = __webpack_require__(6);\n\tvar ContextMenu = __webpack_require__(7);\n\tvar Node = __webpack_require__(8);\n\tvar ModeSwitcher = __webpack_require__(11);\n\tvar util = __webpack_require__(4);\n\n\t// create a mixin with the functions for tree mode\n\tvar treemode = {};\n\n\t/**\n\t * Create a tree editor\n\t * @param {Element} container Container element\n\t * @param {Object} [options] Object with options. available options:\n\t * {String} mode Editor mode. Available values:\n\t * 'tree' (default), 'view',\n\t * and 'form'.\n\t * {Boolean} search Enable search box.\n\t * True by default\n\t * {Boolean} history Enable history (undo/redo).\n\t * True by default\n\t * {function} onChange Callback method, triggered\n\t * on change of contents\n\t * {String} name Field name for the root node.\n\t * {boolean} escapeUnicode If true, unicode\n\t * characters are escaped.\n\t * false by default.\n\t * {Object} schema A JSON Schema for validation\n\t * @private\n\t */\n\ttreemode.create = function (container, options) {\n\t if (!container) {\n\t throw new Error('No container element provided.');\n\t }\n\t this.container = container;\n\t this.dom = {};\n\t this.highlighter = new Highlighter();\n\t this.selection = undefined; // will hold the last input selection\n\t this.multiselection = {\n\t nodes: []\n\t };\n\t this.validateSchema = null; // will be set in .setSchema(schema)\n\t this.errorNodes = [];\n\n\t this.node = null;\n\t this.focusTarget = null;\n\n\t this._setOptions(options);\n\n\t if (this.options.history && this.options.mode !== 'view') {\n\t this.history = new History(this);\n\t }\n\n\t this._createFrame();\n\t this._createTable();\n\t};\n\n\t/**\n\t * Destroy the editor. Clean up DOM, event listeners, and web workers.\n\t */\n\ttreemode.destroy = function () {\n\t if (this.frame && this.container && this.frame.parentNode == this.container) {\n\t this.container.removeChild(this.frame);\n\t this.frame = null;\n\t }\n\t this.container = null;\n\n\t this.dom = null;\n\n\t this.clear();\n\t this.node = null;\n\t this.focusTarget = null;\n\t this.selection = null;\n\t this.multiselection = null;\n\t this.errorNodes = null;\n\t this.validateSchema = null;\n\t this._debouncedValidate = null;\n\n\t if (this.history) {\n\t this.history.destroy();\n\t this.history = null;\n\t }\n\n\t if (this.searchBox) {\n\t this.searchBox.destroy();\n\t this.searchBox = null;\n\t }\n\n\t if (this.modeSwitcher) {\n\t this.modeSwitcher.destroy();\n\t this.modeSwitcher = null;\n\t }\n\t};\n\n\t/**\n\t * Initialize and set default options\n\t * @param {Object} [options] See description in constructor\n\t * @private\n\t */\n\ttreemode._setOptions = function (options) {\n\t this.options = {\n\t search: true,\n\t history: true,\n\t mode: 'tree',\n\t name: undefined, // field name of root node\n\t schema: null\n\t };\n\n\t // copy all options\n\t if (options) {\n\t for (var prop in options) {\n\t if (options.hasOwnProperty(prop)) {\n\t this.options[prop] = options[prop];\n\t }\n\t }\n\t }\n\n\t // compile a JSON schema validator if a JSON schema is provided\n\t this.setSchema(this.options.schema);\n\n\t // create a debounced validate function\n\t this._debouncedValidate = util.debounce(this.validate.bind(this), this.DEBOUNCE_INTERVAL);\n\t};\n\n\t/**\n\t * Set JSON object in editor\n\t * @param {Object | undefined} json JSON data\n\t * @param {String} [name] Optional field name for the root node.\n\t * Can also be set using setName(name).\n\t */\n\ttreemode.set = function (json, name) {\n\t // adjust field name for root node\n\t if (name) {\n\t // TODO: deprecated since version 2.2.0. Cleanup some day.\n\t console.warn('Second parameter \"name\" is deprecated. Use setName(name) instead.');\n\t this.options.name = name;\n\t }\n\n\t // verify if json is valid JSON, ignore when a function\n\t if (json instanceof Function || (json === undefined)) {\n\t this.clear();\n\t }\n\t else {\n\t this.content.removeChild(this.table); // Take the table offline\n\n\t // replace the root node\n\t var params = {\n\t field: this.options.name,\n\t value: json\n\t };\n\t var node = new Node(this, params);\n\t this._setRoot(node);\n\n\t // validate JSON schema (if configured)\n\t this.validate();\n\n\t // expand\n\t var recurse = false;\n\t this.node.expand(recurse);\n\n\t this.content.appendChild(this.table); // Put the table online again\n\t }\n\n\t // TODO: maintain history, store last state and previous document\n\t if (this.history) {\n\t this.history.clear();\n\t }\n\n\t // clear search\n\t if (this.searchBox) {\n\t this.searchBox.clear();\n\t }\n\t};\n\n\t/**\n\t * Get JSON object from editor\n\t * @return {Object | undefined} json\n\t */\n\ttreemode.get = function () {\n\t // remove focus from currently edited node\n\t if (this.focusTarget) {\n\t var node = Node.getNodeFromTarget(this.focusTarget);\n\t if (node) {\n\t node.blur();\n\t }\n\t }\n\n\t if (this.node) {\n\t return this.node.getValue();\n\t }\n\t else {\n\t return undefined;\n\t }\n\t};\n\n\t/**\n\t * Get the text contents of the editor\n\t * @return {String} jsonText\n\t */\n\ttreemode.getText = function() {\n\t return JSON.stringify(this.get());\n\t};\n\n\t/**\n\t * Set the text contents of the editor\n\t * @param {String} jsonText\n\t */\n\ttreemode.setText = function(jsonText) {\n\t this.set(util.parse(jsonText));\n\t};\n\n\t/**\n\t * Set a field name for the root node.\n\t * @param {String | undefined} name\n\t */\n\ttreemode.setName = function (name) {\n\t this.options.name = name;\n\t if (this.node) {\n\t this.node.updateField(this.options.name);\n\t }\n\t};\n\n\t/**\n\t * Get the field name for the root node.\n\t * @return {String | undefined} name\n\t */\n\ttreemode.getName = function () {\n\t return this.options.name;\n\t};\n\n\t/**\n\t * Set focus to the editor. Focus will be set to:\n\t * - the first editable field or value, or else\n\t * - to the expand button of the root node, or else\n\t * - to the context menu button of the root node, or else\n\t * - to the first button in the top menu\n\t */\n\ttreemode.focus = function () {\n\t var input = this.content.querySelector('[contenteditable=true]');\n\t if (input) {\n\t input.focus();\n\t }\n\t else if (this.node.dom.expand) {\n\t this.node.dom.expand.focus();\n\t }\n\t else if (this.node.dom.menu) {\n\t this.node.dom.menu.focus();\n\t }\n\t else {\n\t // focus to the first button in the menu\n\t input = this.frame.querySelector('button');\n\t if (input) {\n\t input.focus();\n\t }\n\t }\n\t};\n\n\t/**\n\t * Remove the root node from the editor\n\t */\n\ttreemode.clear = function () {\n\t if (this.node) {\n\t this.node.collapse();\n\t this.tbody.removeChild(this.node.getDom());\n\t delete this.node;\n\t }\n\t};\n\n\t/**\n\t * Set the root node for the json editor\n\t * @param {Node} node\n\t * @private\n\t */\n\ttreemode._setRoot = function (node) {\n\t this.clear();\n\n\t this.node = node;\n\n\t // append to the dom\n\t this.tbody.appendChild(node.getDom());\n\t};\n\n\t/**\n\t * Search text in all nodes\n\t * The nodes will be expanded when the text is found one of its childs,\n\t * else it will be collapsed. Searches are case insensitive.\n\t * @param {String} text\n\t * @return {Object[]} results Array with nodes containing the search results\n\t * The result objects contains fields:\n\t * - {Node} node,\n\t * - {String} elem the dom element name where\n\t * the result is found ('field' or\n\t * 'value')\n\t */\n\ttreemode.search = function (text) {\n\t var results;\n\t if (this.node) {\n\t this.content.removeChild(this.table); // Take the table offline\n\t results = this.node.search(text);\n\t this.content.appendChild(this.table); // Put the table online again\n\t }\n\t else {\n\t results = [];\n\t }\n\n\t return results;\n\t};\n\n\t/**\n\t * Expand all nodes\n\t */\n\ttreemode.expandAll = function () {\n\t if (this.node) {\n\t this.content.removeChild(this.table); // Take the table offline\n\t this.node.expand();\n\t this.content.appendChild(this.table); // Put the table online again\n\t }\n\t};\n\n\t/**\n\t * Collapse all nodes\n\t */\n\ttreemode.collapseAll = function () {\n\t if (this.node) {\n\t this.content.removeChild(this.table); // Take the table offline\n\t this.node.collapse();\n\t this.content.appendChild(this.table); // Put the table online again\n\t }\n\t};\n\n\t/**\n\t * The method onChange is called whenever a field or value is changed, created,\n\t * deleted, duplicated, etc.\n\t * @param {String} action Change action. Available values: \"editField\",\n\t * \"editValue\", \"changeType\", \"appendNode\",\n\t * \"removeNode\", \"duplicateNode\", \"moveNode\", \"expand\",\n\t * \"collapse\".\n\t * @param {Object} params Object containing parameters describing the change.\n\t * The parameters in params depend on the action (for\n\t * example for \"editValue\" the Node, old value, and new\n\t * value are provided). params contains all information\n\t * needed to undo or redo the action.\n\t * @private\n\t */\n\ttreemode._onAction = function (action, params) {\n\t // add an action to the history\n\t if (this.history) {\n\t this.history.add(action, params);\n\t }\n\n\t this._onChange();\n\t};\n\n\t/**\n\t * Handle a change:\n\t * - Validate JSON schema\n\t * - Send a callback to the onChange listener if provided\n\t * @private\n\t */\n\ttreemode._onChange = function () {\n\t // validate JSON schema (if configured)\n\t this._debouncedValidate();\n\n\t // trigger the onChange callback\n\t if (this.options.onChange) {\n\t try {\n\t this.options.onChange();\n\t }\n\t catch (err) {\n\t console.error('Error in onChange callback: ', err);\n\t }\n\t }\n\t};\n\n\t/**\n\t * Validate current JSON object against the configured JSON schema\n\t * Throws an exception when no JSON schema is configured\n\t */\n\ttreemode.validate = function () {\n\t // clear all current errors\n\t if (this.errorNodes) {\n\t this.errorNodes.forEach(function (node) {\n\t node.setError(null);\n\t });\n\t }\n\n\t var root = this.node;\n\t if (!root) { // TODO: this should be redundant but is needed on mode switch\n\t return;\n\t }\n\n\t // check for duplicate keys\n\t var duplicateErrors = root.validate();\n\n\t // validate the JSON\n\t var schemaErrors = [];\n\t if (this.validateSchema) {\n\t var valid = this.validateSchema(root.getValue());\n\t if (!valid) {\n\t // apply all new errors\n\t schemaErrors = this.validateSchema.errors\n\t .map(function (error) {\n\t return util.improveSchemaError(error);\n\t })\n\t .map(function findNode (error) {\n\t return {\n\t node: root.findNode(error.dataPath),\n\t error: error\n\t }\n\t })\n\t .filter(function hasNode (entry) {\n\t return entry.node != null\n\t });\n\t }\n\t }\n\n\t // display the error in the nodes with a problem\n\t this.errorNodes = duplicateErrors\n\t .concat(schemaErrors)\n\t .reduce(function expandParents (all, entry) {\n\t // expand parents, then merge such that parents come first and\n\t // original entries last\n\t return entry.node\n\t .findParents()\n\t .map(function (parent) {\n\t return {\n\t node: parent,\n\t child: entry.node,\n\t error: {\n\t message: parent.type === 'object'\n\t ? 'Contains invalid properties' // object\n\t : 'Contains invalid items' // array\n\t }\n\t };\n\t })\n\t .concat(all, [entry]);\n\t }, [])\n\t // TODO: dedupe the parent nodes\n\t .map(function setError (entry) {\n\t entry.node.setError(entry.error, entry.child);\n\t return entry.node;\n\t });\n\t};\n\n\t/**\n\t * Refresh the rendered contents\n\t */\n\ttreemode.refresh = function () {\n\t if (this.node) {\n\t this.node.updateDom({recurse: true});\n\t }\n\t};\n\n\t/**\n\t * Start autoscrolling when given mouse position is above the top of the\n\t * editor contents, or below the bottom.\n\t * @param {Number} mouseY Absolute mouse position in pixels\n\t */\n\ttreemode.startAutoScroll = function (mouseY) {\n\t var me = this;\n\t var content = this.content;\n\t var top = util.getAbsoluteTop(content);\n\t var height = content.clientHeight;\n\t var bottom = top + height;\n\t var margin = 24;\n\t var interval = 50; // ms\n\n\t if ((mouseY < top + margin) && content.scrollTop > 0) {\n\t this.autoScrollStep = ((top + margin) - mouseY) / 3;\n\t }\n\t else if (mouseY > bottom - margin &&\n\t height + content.scrollTop < content.scrollHeight) {\n\t this.autoScrollStep = ((bottom - margin) - mouseY) / 3;\n\t }\n\t else {\n\t this.autoScrollStep = undefined;\n\t }\n\n\t if (this.autoScrollStep) {\n\t if (!this.autoScrollTimer) {\n\t this.autoScrollTimer = setInterval(function () {\n\t if (me.autoScrollStep) {\n\t content.scrollTop -= me.autoScrollStep;\n\t }\n\t else {\n\t me.stopAutoScroll();\n\t }\n\t }, interval);\n\t }\n\t }\n\t else {\n\t this.stopAutoScroll();\n\t }\n\t};\n\n\t/**\n\t * Stop auto scrolling. Only applicable when scrolling\n\t */\n\ttreemode.stopAutoScroll = function () {\n\t if (this.autoScrollTimer) {\n\t clearTimeout(this.autoScrollTimer);\n\t delete this.autoScrollTimer;\n\t }\n\t if (this.autoScrollStep) {\n\t delete this.autoScrollStep;\n\t }\n\t};\n\n\n\t/**\n\t * Set the focus to an element in the editor, set text selection, and\n\t * set scroll position.\n\t * @param {Object} selection An object containing fields:\n\t * {Element | undefined} dom The dom element\n\t * which has focus\n\t * {Range | TextRange} range A text selection\n\t * {Node[]} nodes Nodes in case of multi selection\n\t * {Number} scrollTop Scroll position\n\t */\n\ttreemode.setSelection = function (selection) {\n\t if (!selection) {\n\t return;\n\t }\n\n\t if ('scrollTop' in selection && this.content) {\n\t // TODO: animated scroll\n\t this.content.scrollTop = selection.scrollTop;\n\t }\n\t if (selection.nodes) {\n\t // multi-select\n\t this.select(selection.nodes);\n\t }\n\t if (selection.range) {\n\t util.setSelectionOffset(selection.range);\n\t }\n\t if (selection.dom) {\n\t selection.dom.focus();\n\t }\n\t};\n\n\t/**\n\t * Get the current focus\n\t * @return {Object} selection An object containing fields:\n\t * {Element | undefined} dom The dom element\n\t * which has focus\n\t * {Range | TextRange} range A text selection\n\t * {Node[]} nodes Nodes in case of multi selection\n\t * {Number} scrollTop Scroll position\n\t */\n\ttreemode.getSelection = function () {\n\t var range = util.getSelectionOffset();\n\t if (range && range.container.nodeName !== 'DIV') { // filter on (editable) divs)\n\t range = null;\n\t }\n\n\t return {\n\t dom: this.focusTarget,\n\t range: range,\n\t nodes: this.multiselection.nodes.slice(0),\n\t scrollTop: this.content ? this.content.scrollTop : 0\n\t };\n\t};\n\n\t/**\n\t * Adjust the scroll position such that given top position is shown at 1/4\n\t * of the window height.\n\t * @param {Number} top\n\t * @param {function(boolean)} [callback] Callback, executed when animation is\n\t * finished. The callback returns true\n\t * when animation is finished, or false\n\t * when not.\n\t */\n\ttreemode.scrollTo = function (top, callback) {\n\t var content = this.content;\n\t if (content) {\n\t var editor = this;\n\t // cancel any running animation\n\t if (editor.animateTimeout) {\n\t clearTimeout(editor.animateTimeout);\n\t delete editor.animateTimeout;\n\t }\n\t if (editor.animateCallback) {\n\t editor.animateCallback(false);\n\t delete editor.animateCallback;\n\t }\n\n\t // calculate final scroll position\n\t var height = content.clientHeight;\n\t var bottom = content.scrollHeight - height;\n\t var finalScrollTop = Math.min(Math.max(top - height / 4, 0), bottom);\n\n\t // animate towards the new scroll position\n\t var animate = function () {\n\t var scrollTop = content.scrollTop;\n\t var diff = (finalScrollTop - scrollTop);\n\t if (Math.abs(diff) > 3) {\n\t content.scrollTop += diff / 3;\n\t editor.animateCallback = callback;\n\t editor.animateTimeout = setTimeout(animate, 50);\n\t }\n\t else {\n\t // finished\n\t if (callback) {\n\t callback(true);\n\t }\n\t content.scrollTop = finalScrollTop;\n\t delete editor.animateTimeout;\n\t delete editor.animateCallback;\n\t }\n\t };\n\t animate();\n\t }\n\t else {\n\t if (callback) {\n\t callback(false);\n\t }\n\t }\n\t};\n\n\t/**\n\t * Create main frame\n\t * @private\n\t */\n\ttreemode._createFrame = function () {\n\t // create the frame\n\t this.frame = document.createElement('div');\n\t this.frame.className = 'jsoneditor jsoneditor-mode-' + this.options.mode;\n\t this.container.appendChild(this.frame);\n\n\t // create one global event listener to handle all events from all nodes\n\t var editor = this;\n\t function onEvent(event) {\n\t // when switching to mode \"code\" or \"text\" via the menu, some events\n\t // are still fired whilst the _onEvent methods is already removed.\n\t if (editor._onEvent) {\n\t editor._onEvent(event);\n\t }\n\t }\n\t this.frame.onclick = function (event) {\n\t var target = event.target;// || event.srcElement;\n\n\t onEvent(event);\n\n\t // prevent default submit action of buttons when editor is located\n\t // inside a form\n\t if (target.nodeName == 'BUTTON') {\n\t event.preventDefault();\n\t }\n\t };\n\t this.frame.oninput = onEvent;\n\t this.frame.onchange = onEvent;\n\t this.frame.onkeydown = onEvent;\n\t this.frame.onkeyup = onEvent;\n\t this.frame.oncut = onEvent;\n\t this.frame.onpaste = onEvent;\n\t this.frame.onmousedown = onEvent;\n\t this.frame.onmouseup = onEvent;\n\t this.frame.onmouseover = onEvent;\n\t this.frame.onmouseout = onEvent;\n\t // Note: focus and blur events do not propagate, therefore they defined\n\t // using an eventListener with useCapture=true\n\t // see http://www.quirksmode.org/blog/archives/2008/04/delegating_the.html\n\t util.addEventListener(this.frame, 'focus', onEvent, true);\n\t util.addEventListener(this.frame, 'blur', onEvent, true);\n\t this.frame.onfocusin = onEvent; // for IE\n\t this.frame.onfocusout = onEvent; // for IE\n\n\t // create menu\n\t this.menu = document.createElement('div');\n\t this.menu.className = 'jsoneditor-menu';\n\t this.frame.appendChild(this.menu);\n\n\t // create expand all button\n\t var expandAll = document.createElement('button');\n\t expandAll.type = 'button';\n\t expandAll.className = 'jsoneditor-expand-all';\n\t expandAll.title = 'Expand all fields';\n\t expandAll.onclick = function () {\n\t editor.expandAll();\n\t };\n\t this.menu.appendChild(expandAll);\n\n\t // create expand all button\n\t var collapseAll = document.createElement('button');\n\t collapseAll.type = 'button';\n\t collapseAll.title = 'Collapse all fields';\n\t collapseAll.className = 'jsoneditor-collapse-all';\n\t collapseAll.onclick = function () {\n\t editor.collapseAll();\n\t };\n\t this.menu.appendChild(collapseAll);\n\n\t // create undo/redo buttons\n\t if (this.history) {\n\t // create undo button\n\t var undo = document.createElement('button');\n\t undo.type = 'button';\n\t undo.className = 'jsoneditor-undo jsoneditor-separator';\n\t undo.title = 'Undo last action (Ctrl+Z)';\n\t undo.onclick = function () {\n\t editor._onUndo();\n\t };\n\t this.menu.appendChild(undo);\n\t this.dom.undo = undo;\n\n\t // create redo button\n\t var redo = document.createElement('button');\n\t redo.type = 'button';\n\t redo.className = 'jsoneditor-redo';\n\t redo.title = 'Redo (Ctrl+Shift+Z)';\n\t redo.onclick = function () {\n\t editor._onRedo();\n\t };\n\t this.menu.appendChild(redo);\n\t this.dom.redo = redo;\n\n\t // register handler for onchange of history\n\t this.history.onChange = function () {\n\t undo.disabled = !editor.history.canUndo();\n\t redo.disabled = !editor.history.canRedo();\n\t };\n\t this.history.onChange();\n\t }\n\n\t // create mode box\n\t if (this.options && this.options.modes && this.options.modes.length) {\n\t var me = this;\n\t this.modeSwitcher = new ModeSwitcher(this.menu, this.options.modes, this.options.mode, function onSwitch(mode) {\n\t me.modeSwitcher.destroy();\n\n\t // switch mode and restore focus\n\t me.setMode(mode);\n\t me.modeSwitcher.focus();\n\t });\n\t }\n\n\t // create search box\n\t if (this.options.search) {\n\t this.searchBox = new SearchBox(this, this.menu);\n\t }\n\t};\n\n\t/**\n\t * Perform an undo action\n\t * @private\n\t */\n\ttreemode._onUndo = function () {\n\t if (this.history) {\n\t // undo last action\n\t this.history.undo();\n\n\t // fire change event\n\t this._onChange();\n\t }\n\t};\n\n\t/**\n\t * Perform a redo action\n\t * @private\n\t */\n\ttreemode._onRedo = function () {\n\t if (this.history) {\n\t // redo last action\n\t this.history.redo();\n\n\t // fire change event\n\t this._onChange();\n\t }\n\t};\n\n\t/**\n\t * Event handler\n\t * @param event\n\t * @private\n\t */\n\ttreemode._onEvent = function (event) {\n\t if (event.type == 'keydown') {\n\t this._onKeyDown(event);\n\t }\n\n\t if (event.type == 'focus') {\n\t this.focusTarget = event.target;\n\t }\n\n\t if (event.type == 'mousedown') {\n\t this._startDragDistance(event);\n\t }\n\t if (event.type == 'mousemove' || event.type == 'mouseup' || event.type == 'click') {\n\t this._updateDragDistance(event);\n\t }\n\n\t var node = Node.getNodeFromTarget(event.target);\n\n\t if (node && node.selected) {\n\t if (event.type == 'click') {\n\t if (event.target == node.dom.menu) {\n\t this.showContextMenu(event.target);\n\n\t // stop propagation (else we will open the context menu of a single node)\n\t return;\n\t }\n\n\t // deselect a multi selection\n\t if (!event.hasMoved) {\n\t this.deselect();\n\t }\n\t }\n\n\t if (event.type == 'mousedown') {\n\t // drag multiple nodes\n\t Node.onDragStart(this.multiselection.nodes, event);\n\t }\n\t }\n\t else {\n\t if (event.type == 'mousedown') {\n\t this.deselect();\n\n\t if (node && event.target == node.dom.drag) {\n\t // drag a singe node\n\t Node.onDragStart(node, event);\n\t }\n\t else if (!node || (event.target != node.dom.field && event.target != node.dom.value && event.target != node.dom.select)) {\n\t // select multiple nodes\n\t this._onMultiSelectStart(event);\n\t }\n\t }\n\t }\n\n\t if (node) {\n\t node.onEvent(event);\n\t }\n\t};\n\n\ttreemode._startDragDistance = function (event) {\n\t this.dragDistanceEvent = {\n\t initialTarget: event.target,\n\t initialPageX: event.pageX,\n\t initialPageY: event.pageY,\n\t dragDistance: 0,\n\t hasMoved: false\n\t };\n\t};\n\n\ttreemode._updateDragDistance = function (event) {\n\t if (!this.dragDistanceEvent) {\n\t this._startDragDistance(event);\n\t }\n\n\t var diffX = event.pageX - this.dragDistanceEvent.initialPageX;\n\t var diffY = event.pageY - this.dragDistanceEvent.initialPageY;\n\n\t this.dragDistanceEvent.dragDistance = Math.sqrt(diffX * diffX + diffY * diffY);\n\t this.dragDistanceEvent.hasMoved =\n\t this.dragDistanceEvent.hasMoved || this.dragDistanceEvent.dragDistance > 10;\n\n\t event.dragDistance = this.dragDistanceEvent.dragDistance;\n\t event.hasMoved = this.dragDistanceEvent.hasMoved;\n\n\t return event.dragDistance;\n\t};\n\n\t/**\n\t * Start multi selection of nodes by dragging the mouse\n\t * @param event\n\t * @private\n\t */\n\ttreemode._onMultiSelectStart = function (event) {\n\t var node = Node.getNodeFromTarget(event.target);\n\n\t if (this.options.mode !== 'tree' || this.options.onEditable !== undefined) {\n\t // dragging not allowed in modes 'view' and 'form'\n\t // TODO: allow multiselection of items when option onEditable is specified\n\t return;\n\t }\n\n\t this.multiselection = {\n\t start: node || null,\n\t end: null,\n\t nodes: []\n\t };\n\n\t this._startDragDistance(event);\n\n\t var editor = this;\n\t if (!this.mousemove) {\n\t this.mousemove = util.addEventListener(window, 'mousemove', function (event) {\n\t editor._onMultiSelect(event);\n\t });\n\t }\n\t if (!this.mouseup) {\n\t this.mouseup = util.addEventListener(window, 'mouseup', function (event ) {\n\t editor._onMultiSelectEnd(event);\n\t });\n\t }\n\n\t};\n\n\t/**\n\t * Multiselect nodes by dragging\n\t * @param event\n\t * @private\n\t */\n\ttreemode._onMultiSelect = function (event) {\n\t event.preventDefault();\n\n\t this._updateDragDistance(event);\n\t if (!event.hasMoved) {\n\t return;\n\t }\n\n\t var node = Node.getNodeFromTarget(event.target);\n\n\t if (node) {\n\t if (this.multiselection.start == null) {\n\t this.multiselection.start = node;\n\t }\n\t this.multiselection.end = node;\n\t }\n\n\t // deselect previous selection\n\t this.deselect();\n\n\t // find the selected nodes in the range from first to last\n\t var start = this.multiselection.start;\n\t var end = this.multiselection.end || this.multiselection.start;\n\t if (start && end) {\n\t // find the top level childs, all having the same parent\n\t this.multiselection.nodes = this._findTopLevelNodes(start, end);\n\t this.select(this.multiselection.nodes);\n\t }\n\t};\n\n\t/**\n\t * End of multiselect nodes by dragging\n\t * @param event\n\t * @private\n\t */\n\ttreemode._onMultiSelectEnd = function (event) {\n\t // set focus to the context menu button of the first node\n\t if (this.multiselection.nodes[0]) {\n\t this.multiselection.nodes[0].dom.menu.focus();\n\t }\n\n\t this.multiselection.start = null;\n\t this.multiselection.end = null;\n\n\t // cleanup global event listeners\n\t if (this.mousemove) {\n\t util.removeEventListener(window, 'mousemove', this.mousemove);\n\t delete this.mousemove;\n\t }\n\t if (this.mouseup) {\n\t util.removeEventListener(window, 'mouseup', this.mouseup);\n\t delete this.mouseup;\n\t }\n\t};\n\n\t/**\n\t * deselect currently selected nodes\n\t * @param {boolean} [clearStartAndEnd=false] If true, the `start` and `end`\n\t * state is cleared too.\n\t */\n\ttreemode.deselect = function (clearStartAndEnd) {\n\t this.multiselection.nodes.forEach(function (node) {\n\t node.setSelected(false);\n\t });\n\t this.multiselection.nodes = [];\n\n\t if (clearStartAndEnd) {\n\t this.multiselection.start = null;\n\t this.multiselection.end = null;\n\t }\n\t};\n\n\t/**\n\t * select nodes\n\t * @param {Node[] | Node} nodes\n\t */\n\ttreemode.select = function (nodes) {\n\t if (!Array.isArray(nodes)) {\n\t return this.select([nodes]);\n\t }\n\n\t if (nodes) {\n\t this.deselect();\n\n\t this.multiselection.nodes = nodes.slice(0);\n\n\t var first = nodes[0];\n\t nodes.forEach(function (node) {\n\t node.setSelected(true, node === first);\n\t });\n\t }\n\t};\n\n\t/**\n\t * From two arbitrary selected nodes, find their shared parent node.\n\t * From that parent node, select the two child nodes in the brances going to\n\t * nodes `start` and `end`, and select all childs in between.\n\t * @param {Node} start\n\t * @param {Node} end\n\t * @return {Array.} Returns an ordered list with child nodes\n\t * @private\n\t */\n\ttreemode._findTopLevelNodes = function (start, end) {\n\t var startPath = start.getNodePath();\n\t var endPath = end.getNodePath();\n\t var i = 0;\n\t while (i < startPath.length && startPath[i] === endPath[i]) {\n\t i++;\n\t }\n\t var root = startPath[i - 1];\n\t var startChild = startPath[i];\n\t var endChild = endPath[i];\n\n\t if (!startChild || !endChild) {\n\t if (root.parent) {\n\t // startChild is a parent of endChild or vice versa\n\t startChild = root;\n\t endChild = root;\n\t root = root.parent\n\t }\n\t else {\n\t // we have selected the root node (which doesn't have a parent)\n\t startChild = root.childs[0];\n\t endChild = root.childs[root.childs.length - 1];\n\t }\n\t }\n\n\t if (root && startChild && endChild) {\n\t var startIndex = root.childs.indexOf(startChild);\n\t var endIndex = root.childs.indexOf(endChild);\n\t var firstIndex = Math.min(startIndex, endIndex);\n\t var lastIndex = Math.max(startIndex, endIndex);\n\n\t return root.childs.slice(firstIndex, lastIndex + 1);\n\t }\n\t else {\n\t return [];\n\t }\n\t};\n\n\t/**\n\t * Event handler for keydown. Handles shortcut keys\n\t * @param {Event} event\n\t * @private\n\t */\n\ttreemode._onKeyDown = function (event) {\n\t var keynum = event.which || event.keyCode;\n\t var ctrlKey = event.ctrlKey;\n\t var shiftKey = event.shiftKey;\n\t var handled = false;\n\n\t if (keynum == 9) { // Tab or Shift+Tab\n\t var me = this;\n\t setTimeout(function () {\n\t // select all text when moving focus to an editable div\n\t util.selectContentEditable(me.focusTarget);\n\t }, 0);\n\t }\n\n\t if (this.searchBox) {\n\t if (ctrlKey && keynum == 70) { // Ctrl+F\n\t this.searchBox.dom.search.focus();\n\t this.searchBox.dom.search.select();\n\t handled = true;\n\t }\n\t else if (keynum == 114 || (ctrlKey && keynum == 71)) { // F3 or Ctrl+G\n\t var focus = true;\n\t if (!shiftKey) {\n\t // select next search result (F3 or Ctrl+G)\n\t this.searchBox.next(focus);\n\t }\n\t else {\n\t // select previous search result (Shift+F3 or Ctrl+Shift+G)\n\t this.searchBox.previous(focus);\n\t }\n\n\t handled = true;\n\t }\n\t }\n\n\t if (this.history) {\n\t if (ctrlKey && !shiftKey && keynum == 90) { // Ctrl+Z\n\t // undo\n\t this._onUndo();\n\t handled = true;\n\t }\n\t else if (ctrlKey && shiftKey && keynum == 90) { // Ctrl+Shift+Z\n\t // redo\n\t this._onRedo();\n\t handled = true;\n\t }\n\t }\n\n\t if (handled) {\n\t event.preventDefault();\n\t event.stopPropagation();\n\t }\n\t};\n\n\t/**\n\t * Create main table\n\t * @private\n\t */\n\ttreemode._createTable = function () {\n\t var contentOuter = document.createElement('div');\n\t contentOuter.className = 'jsoneditor-outer';\n\t this.contentOuter = contentOuter;\n\n\t this.content = document.createElement('div');\n\t this.content.className = 'jsoneditor-tree';\n\t contentOuter.appendChild(this.content);\n\n\t this.table = document.createElement('table');\n\t this.table.className = 'jsoneditor-tree';\n\t this.content.appendChild(this.table);\n\n\t // create colgroup where the first two columns don't have a fixed\n\t // width, and the edit columns do have a fixed width\n\t var col;\n\t this.colgroupContent = document.createElement('colgroup');\n\t if (this.options.mode === 'tree') {\n\t col = document.createElement('col');\n\t col.width = \"24px\";\n\t this.colgroupContent.appendChild(col);\n\t }\n\t col = document.createElement('col');\n\t col.width = \"24px\";\n\t this.colgroupContent.appendChild(col);\n\t col = document.createElement('col');\n\t this.colgroupContent.appendChild(col);\n\t this.table.appendChild(this.colgroupContent);\n\n\t this.tbody = document.createElement('tbody');\n\t this.table.appendChild(this.tbody);\n\n\t this.frame.appendChild(contentOuter);\n\t};\n\n\t/**\n\t * Show a contextmenu for this node.\n\t * Used for multiselection\n\t * @param {HTMLElement} anchor Anchor element to attache the context menu to.\n\t * @param {function} [onClose] Callback method called when the context menu\n\t * is being closed.\n\t */\n\ttreemode.showContextMenu = function (anchor, onClose) {\n\t var items = [];\n\t var editor = this;\n\n\t // create duplicate button\n\t items.push({\n\t text: 'Duplicate',\n\t title: 'Duplicate selected fields (Ctrl+D)',\n\t className: 'jsoneditor-duplicate',\n\t click: function () {\n\t Node.onDuplicate(editor.multiselection.nodes);\n\t }\n\t });\n\n\t // create remove button\n\t items.push({\n\t text: 'Remove',\n\t title: 'Remove selected fields (Ctrl+Del)',\n\t className: 'jsoneditor-remove',\n\t click: function () {\n\t Node.onRemove(editor.multiselection.nodes);\n\t }\n\t });\n\n\t var menu = new ContextMenu(items, {close: onClose});\n\t menu.show(anchor, this.content);\n\t};\n\n\n\t// define modes\n\tmodule.exports = [\n\t {\n\t mode: 'tree',\n\t mixin: treemode,\n\t data: 'json'\n\t },\n\t {\n\t mode: 'view',\n\t mixin: treemode,\n\t data: 'json'\n\t },\n\t {\n\t mode: 'form',\n\t mixin: treemode,\n\t data: 'json'\n\t }\n\t];\n\n\n/***/ },\n/* 2 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\n\t/**\n\t * The highlighter can highlight/unhighlight a node, and\n\t * animate the visibility of a context menu.\n\t * @constructor Highlighter\n\t */\n\tfunction Highlighter () {\n\t this.locked = false;\n\t}\n\n\t/**\n\t * Hightlight given node and its childs\n\t * @param {Node} node\n\t */\n\tHighlighter.prototype.highlight = function (node) {\n\t if (this.locked) {\n\t return;\n\t }\n\n\t if (this.node != node) {\n\t // unhighlight current node\n\t if (this.node) {\n\t this.node.setHighlight(false);\n\t }\n\n\t // highlight new node\n\t this.node = node;\n\t this.node.setHighlight(true);\n\t }\n\n\t // cancel any current timeout\n\t this._cancelUnhighlight();\n\t};\n\n\t/**\n\t * Unhighlight currently highlighted node.\n\t * Will be done after a delay\n\t */\n\tHighlighter.prototype.unhighlight = function () {\n\t if (this.locked) {\n\t return;\n\t }\n\n\t var me = this;\n\t if (this.node) {\n\t this._cancelUnhighlight();\n\n\t // do the unhighlighting after a small delay, to prevent re-highlighting\n\t // the same node when moving from the drag-icon to the contextmenu-icon\n\t // or vice versa.\n\t this.unhighlightTimer = setTimeout(function () {\n\t me.node.setHighlight(false);\n\t me.node = undefined;\n\t me.unhighlightTimer = undefined;\n\t }, 0);\n\t }\n\t};\n\n\t/**\n\t * Cancel an unhighlight action (if before the timeout of the unhighlight action)\n\t * @private\n\t */\n\tHighlighter.prototype._cancelUnhighlight = function () {\n\t if (this.unhighlightTimer) {\n\t clearTimeout(this.unhighlightTimer);\n\t this.unhighlightTimer = undefined;\n\t }\n\t};\n\n\t/**\n\t * Lock highlighting or unhighlighting nodes.\n\t * methods highlight and unhighlight do not work while locked.\n\t */\n\tHighlighter.prototype.lock = function () {\n\t this.locked = true;\n\t};\n\n\t/**\n\t * Unlock highlighting or unhighlighting nodes\n\t */\n\tHighlighter.prototype.unlock = function () {\n\t this.locked = false;\n\t};\n\n\tmodule.exports = Highlighter;\n\n\n/***/ },\n/* 3 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar util = __webpack_require__(4);\n\n\t/**\n\t * @constructor History\n\t * Store action history, enables undo and redo\n\t * @param {JSONEditor} editor\n\t */\n\tfunction History (editor) {\n\t this.editor = editor;\n\t this.history = [];\n\t this.index = -1;\n\n\t this.clear();\n\n\t // map with all supported actions\n\t this.actions = {\n\t 'editField': {\n\t 'undo': function (params) {\n\t params.node.updateField(params.oldValue);\n\t },\n\t 'redo': function (params) {\n\t params.node.updateField(params.newValue);\n\t }\n\t },\n\t 'editValue': {\n\t 'undo': function (params) {\n\t params.node.updateValue(params.oldValue);\n\t },\n\t 'redo': function (params) {\n\t params.node.updateValue(params.newValue);\n\t }\n\t },\n\t 'changeType': {\n\t 'undo': function (params) {\n\t params.node.changeType(params.oldType);\n\t },\n\t 'redo': function (params) {\n\t params.node.changeType(params.newType);\n\t }\n\t },\n\n\t 'appendNodes': {\n\t 'undo': function (params) {\n\t params.nodes.forEach(function (node) {\n\t params.parent.removeChild(node);\n\t });\n\t },\n\t 'redo': function (params) {\n\t params.nodes.forEach(function (node) {\n\t params.parent.appendChild(node);\n\t });\n\t }\n\t },\n\t 'insertBeforeNodes': {\n\t 'undo': function (params) {\n\t params.nodes.forEach(function (node) {\n\t params.parent.removeChild(node);\n\t });\n\t },\n\t 'redo': function (params) {\n\t params.nodes.forEach(function (node) {\n\t params.parent.insertBefore(node, params.beforeNode);\n\t });\n\t }\n\t },\n\t 'insertAfterNodes': {\n\t 'undo': function (params) {\n\t params.nodes.forEach(function (node) {\n\t params.parent.removeChild(node);\n\t });\n\t },\n\t 'redo': function (params) {\n\t var afterNode = params.afterNode;\n\t params.nodes.forEach(function (node) {\n\t params.parent.insertAfter(params.node, afterNode);\n\t afterNode = node;\n\t });\n\t }\n\t },\n\t 'removeNodes': {\n\t 'undo': function (params) {\n\t var parent = params.parent;\n\t var beforeNode = parent.childs[params.index] || parent.append;\n\t params.nodes.forEach(function (node) {\n\t parent.insertBefore(node, beforeNode);\n\t });\n\t },\n\t 'redo': function (params) {\n\t params.nodes.forEach(function (node) {\n\t params.parent.removeChild(node);\n\t });\n\t }\n\t },\n\t 'duplicateNodes': {\n\t 'undo': function (params) {\n\t params.nodes.forEach(function (node) {\n\t params.parent.removeChild(node);\n\t });\n\t },\n\t 'redo': function (params) {\n\t var afterNode = params.afterNode;\n\t params.nodes.forEach(function (node) {\n\t params.parent.insertAfter(node, afterNode);\n\t afterNode = node;\n\t });\n\t }\n\t },\n\t 'moveNodes': {\n\t 'undo': function (params) {\n\t params.nodes.forEach(function (node) {\n\t params.oldBeforeNode.parent.moveBefore(node, params.oldBeforeNode);\n\t });\n\t },\n\t 'redo': function (params) {\n\t params.nodes.forEach(function (node) {\n\t params.newBeforeNode.parent.moveBefore(node, params.newBeforeNode);\n\t });\n\t }\n\t },\n\n\t 'sort': {\n\t 'undo': function (params) {\n\t var node = params.node;\n\t node.hideChilds();\n\t node.sort = params.oldSort;\n\t node.childs = params.oldChilds;\n\t node.showChilds();\n\t },\n\t 'redo': function (params) {\n\t var node = params.node;\n\t node.hideChilds();\n\t node.sort = params.newSort;\n\t node.childs = params.newChilds;\n\t node.showChilds();\n\t }\n\t }\n\n\t // TODO: restore the original caret position and selection with each undo\n\t // TODO: implement history for actions \"expand\", \"collapse\", \"scroll\", \"setDocument\"\n\t };\n\t}\n\n\t/**\n\t * The method onChange is executed when the History is changed, and can\n\t * be overloaded.\n\t */\n\tHistory.prototype.onChange = function () {};\n\n\t/**\n\t * Add a new action to the history\n\t * @param {String} action The executed action. Available actions: \"editField\",\n\t * \"editValue\", \"changeType\", \"appendNode\",\n\t * \"removeNode\", \"duplicateNode\", \"moveNode\"\n\t * @param {Object} params Object containing parameters describing the change.\n\t * The parameters in params depend on the action (for\n\t * example for \"editValue\" the Node, old value, and new\n\t * value are provided). params contains all information\n\t * needed to undo or redo the action.\n\t */\n\tHistory.prototype.add = function (action, params) {\n\t this.index++;\n\t this.history[this.index] = {\n\t 'action': action,\n\t 'params': params,\n\t 'timestamp': new Date()\n\t };\n\n\t // remove redo actions which are invalid now\n\t if (this.index < this.history.length - 1) {\n\t this.history.splice(this.index + 1, this.history.length - this.index - 1);\n\t }\n\n\t // fire onchange event\n\t this.onChange();\n\t};\n\n\t/**\n\t * Clear history\n\t */\n\tHistory.prototype.clear = function () {\n\t this.history = [];\n\t this.index = -1;\n\n\t // fire onchange event\n\t this.onChange();\n\t};\n\n\t/**\n\t * Check if there is an action available for undo\n\t * @return {Boolean} canUndo\n\t */\n\tHistory.prototype.canUndo = function () {\n\t return (this.index >= 0);\n\t};\n\n\t/**\n\t * Check if there is an action available for redo\n\t * @return {Boolean} canRedo\n\t */\n\tHistory.prototype.canRedo = function () {\n\t return (this.index < this.history.length - 1);\n\t};\n\n\t/**\n\t * Undo the last action\n\t */\n\tHistory.prototype.undo = function () {\n\t if (this.canUndo()) {\n\t var obj = this.history[this.index];\n\t if (obj) {\n\t var action = this.actions[obj.action];\n\t if (action && action.undo) {\n\t action.undo(obj.params);\n\t if (obj.params.oldSelection) {\n\t this.editor.setSelection(obj.params.oldSelection);\n\t }\n\t }\n\t else {\n\t console.error(new Error('unknown action \"' + obj.action + '\"'));\n\t }\n\t }\n\t this.index--;\n\n\t // fire onchange event\n\t this.onChange();\n\t }\n\t};\n\n\t/**\n\t * Redo the last action\n\t */\n\tHistory.prototype.redo = function () {\n\t if (this.canRedo()) {\n\t this.index++;\n\n\t var obj = this.history[this.index];\n\t if (obj) {\n\t var action = this.actions[obj.action];\n\t if (action && action.redo) {\n\t action.redo(obj.params);\n\t if (obj.params.newSelection) {\n\t this.editor.setSelection(obj.params.newSelection);\n\t }\n\t }\n\t else {\n\t console.error(new Error('unknown action \"' + obj.action + '\"'));\n\t }\n\t }\n\n\t // fire onchange event\n\t this.onChange();\n\t }\n\t};\n\n\t/**\n\t * Destroy history\n\t */\n\tHistory.prototype.destroy = function () {\n\t this.editor = null;\n\n\t this.history = [];\n\t this.index = -1;\n\t};\n\n\tmodule.exports = History;\n\n\n/***/ },\n/* 4 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar jsonlint = __webpack_require__(5);\n\n\t/**\n\t * Parse JSON using the parser built-in in the browser.\n\t * On exception, the jsonString is validated and a detailed error is thrown.\n\t * @param {String} jsonString\n\t * @return {JSON} json\n\t */\n\texports.parse = function parse(jsonString) {\n\t try {\n\t return JSON.parse(jsonString);\n\t }\n\t catch (err) {\n\t // try to throw a more detailed error message using validate\n\t exports.validate(jsonString);\n\n\t // rethrow the original error\n\t throw err;\n\t }\n\t};\n\n\t/**\n\t * Sanitize a JSON-like string containing. For example changes JavaScript\n\t * notation into JSON notation.\n\t * This function for example changes a string like \"{a: 2, 'b': {c: 'd'}\"\n\t * into '{\"a\": 2, \"b\": {\"c\": \"d\"}'\n\t * @param {string} jsString\n\t * @returns {string} json\n\t */\n\texports.sanitize = function (jsString) {\n\t // escape all single and double quotes inside strings\n\t var chars = [];\n\t var i = 0;\n\n\t //If JSON starts with a function (characters/digits/\"_-\"), remove this function.\n\t //This is useful for \"stripping\" JSONP objects to become JSON\n\t //For example: /* some comment */ function_12321321 ( [{\"a\":\"b\"}] ); => [{\"a\":\"b\"}]\n\t var match = jsString.match(/^\\s*(\\/\\*(.|[\\r\\n])*?\\*\\/)?\\s*[\\da-zA-Z_$]+\\s*\\(([\\s\\S]*)\\)\\s*;?\\s*$/);\n\t if (match) {\n\t jsString = match[3];\n\t }\n\n\t // helper functions to get the current/prev/next character\n\t function curr () { return jsString.charAt(i); }\n\t function next() { return jsString.charAt(i + 1); }\n\t function prev() { return jsString.charAt(i - 1); }\n\n\t // get the last parsed non-whitespace character\n\t function lastNonWhitespace () {\n\t var p = chars.length - 1;\n\n\t while (p >= 0) {\n\t var pp = chars[p];\n\t if (pp !== ' ' && pp !== '\\n' && pp !== '\\r' && pp !== '\\t') { // non whitespace\n\t return pp;\n\t }\n\t p--;\n\t }\n\n\t return '';\n\t }\n\n\t // skip a block comment '/* ... */'\n\t function skipBlockComment () {\n\t i += 2;\n\t while (i < jsString.length && (curr() !== '*' || next() !== '/')) {\n\t i++;\n\t }\n\t i += 2;\n\t }\n\n\t // skip a comment '// ...'\n\t function skipComment () {\n\t i += 2;\n\t while (i < jsString.length && (curr() !== '\\n')) {\n\t i++;\n\t }\n\t }\n\n\t // parse single or double quoted string\n\t function parseString(quote) {\n\t chars.push('\"');\n\t i++;\n\t var c = curr();\n\t while (i < jsString.length && c !== quote) {\n\t if (c === '\"' && prev() !== '\\\\') {\n\t // unescaped double quote, escape it\n\t chars.push('\\\\');\n\t }\n\n\t // handle escape character\n\t if (c === '\\\\') {\n\t i++;\n\t c = curr();\n\n\t // remove the escape character when followed by a single quote ', not needed\n\t if (c !== '\\'') {\n\t chars.push('\\\\');\n\t }\n\t }\n\t chars.push(c);\n\n\t i++;\n\t c = curr();\n\t }\n\t if (c === quote) {\n\t chars.push('\"');\n\t i++;\n\t }\n\t }\n\n\t // parse an unquoted key\n\t function parseKey() {\n\t var specialValues = ['null', 'true', 'false'];\n\t var key = '';\n\t var c = curr();\n\n\t var regexp = /[a-zA-Z_$\\d]/; // letter, number, underscore, dollar character\n\t while (regexp.test(c)) {\n\t key += c;\n\t i++;\n\t c = curr();\n\t }\n\n\t if (specialValues.indexOf(key) === -1) {\n\t chars.push('\"' + key + '\"');\n\t }\n\t else {\n\t chars.push(key);\n\t }\n\t }\n\n\t while(i < jsString.length) {\n\t var c = curr();\n\n\t if (c === '/' && next() === '*') {\n\t skipBlockComment();\n\t }\n\t else if (c === '/' && next() === '/') {\n\t skipComment();\n\t }\n\t else if (c === '\\'' || c === '\"') {\n\t parseString(c);\n\t }\n\t else if (/[a-zA-Z_$]/.test(c) && ['{', ','].indexOf(lastNonWhitespace()) !== -1) {\n\t // an unquoted object key (like a in '{a:2}')\n\t parseKey();\n\t }\n\t else {\n\t chars.push(c);\n\t i++;\n\t }\n\t }\n\n\t return chars.join('');\n\t};\n\n\t/**\n\t * Escape unicode characters.\n\t * For example input '\\u2661' (length 1) will output '\\\\u2661' (length 5).\n\t * @param {string} text\n\t * @return {string}\n\t */\n\texports.escapeUnicodeChars = function (text) {\n\t // see https://www.wikiwand.com/en/UTF-16\n\t // note: we leave surrogate pairs as two individual chars,\n\t // as JSON doesn't interpret them as a single unicode char.\n\t return text.replace(/[\\u007F-\\uFFFF]/g, function(c) {\n\t return '\\\\u'+('0000' + c.charCodeAt(0).toString(16)).slice(-4);\n\t })\n\t};\n\n\t/**\n\t * Validate a string containing a JSON object\n\t * This method uses JSONLint to validate the String. If JSONLint is not\n\t * available, the built-in JSON parser of the browser is used.\n\t * @param {String} jsonString String with an (invalid) JSON object\n\t * @throws Error\n\t */\n\texports.validate = function validate(jsonString) {\n\t if (typeof(jsonlint) != 'undefined') {\n\t jsonlint.parse(jsonString);\n\t }\n\t else {\n\t JSON.parse(jsonString);\n\t }\n\t};\n\n\t/**\n\t * Extend object a with the properties of object b\n\t * @param {Object} a\n\t * @param {Object} b\n\t * @return {Object} a\n\t */\n\texports.extend = function extend(a, b) {\n\t for (var prop in b) {\n\t if (b.hasOwnProperty(prop)) {\n\t a[prop] = b[prop];\n\t }\n\t }\n\t return a;\n\t};\n\n\t/**\n\t * Remove all properties from object a\n\t * @param {Object} a\n\t * @return {Object} a\n\t */\n\texports.clear = function clear (a) {\n\t for (var prop in a) {\n\t if (a.hasOwnProperty(prop)) {\n\t delete a[prop];\n\t }\n\t }\n\t return a;\n\t};\n\n\t/**\n\t * Get the type of an object\n\t * @param {*} object\n\t * @return {String} type\n\t */\n\texports.type = function type (object) {\n\t if (object === null) {\n\t return 'null';\n\t }\n\t if (object === undefined) {\n\t return 'undefined';\n\t }\n\t if ((object instanceof Number) || (typeof object === 'number')) {\n\t return 'number';\n\t }\n\t if ((object instanceof String) || (typeof object === 'string')) {\n\t return 'string';\n\t }\n\t if ((object instanceof Boolean) || (typeof object === 'boolean')) {\n\t return 'boolean';\n\t }\n\t if ((object instanceof RegExp) || (typeof object === 'regexp')) {\n\t return 'regexp';\n\t }\n\t if (exports.isArray(object)) {\n\t return 'array';\n\t }\n\n\t return 'object';\n\t};\n\n\t/**\n\t * Test whether a text contains a url (matches when a string starts\n\t * with 'http://*' or 'https://*' and has no whitespace characters)\n\t * @param {String} text\n\t */\n\tvar isUrlRegex = /^https?:\\/\\/\\S+$/;\n\texports.isUrl = function isUrl (text) {\n\t return (typeof text == 'string' || text instanceof String) &&\n\t isUrlRegex.test(text);\n\t};\n\n\t/**\n\t * Tes whether given object is an Array\n\t * @param {*} obj\n\t * @returns {boolean} returns true when obj is an array\n\t */\n\texports.isArray = function (obj) {\n\t return Object.prototype.toString.call(obj) === '[object Array]';\n\t};\n\n\t/**\n\t * Retrieve the absolute left value of a DOM element\n\t * @param {Element} elem A dom element, for example a div\n\t * @return {Number} left The absolute left position of this element\n\t * in the browser page.\n\t */\n\texports.getAbsoluteLeft = function getAbsoluteLeft(elem) {\n\t var rect = elem.getBoundingClientRect();\n\t return rect.left + window.pageXOffset || document.scrollLeft || 0;\n\t};\n\n\t/**\n\t * Retrieve the absolute top value of a DOM element\n\t * @param {Element} elem A dom element, for example a div\n\t * @return {Number} top The absolute top position of this element\n\t * in the browser page.\n\t */\n\texports.getAbsoluteTop = function getAbsoluteTop(elem) {\n\t var rect = elem.getBoundingClientRect();\n\t return rect.top + window.pageYOffset || document.scrollTop || 0;\n\t};\n\n\t/**\n\t * add a className to the given elements style\n\t * @param {Element} elem\n\t * @param {String} className\n\t */\n\texports.addClassName = function addClassName(elem, className) {\n\t var classes = elem.className.split(' ');\n\t if (classes.indexOf(className) == -1) {\n\t classes.push(className); // add the class to the array\n\t elem.className = classes.join(' ');\n\t }\n\t};\n\n\t/**\n\t * add a className to the given elements style\n\t * @param {Element} elem\n\t * @param {String} className\n\t */\n\texports.removeClassName = function removeClassName(elem, className) {\n\t var classes = elem.className.split(' ');\n\t var index = classes.indexOf(className);\n\t if (index != -1) {\n\t classes.splice(index, 1); // remove the class from the array\n\t elem.className = classes.join(' ');\n\t }\n\t};\n\n\t/**\n\t * Strip the formatting from the contents of a div\n\t * the formatting from the div itself is not stripped, only from its childs.\n\t * @param {Element} divElement\n\t */\n\texports.stripFormatting = function stripFormatting(divElement) {\n\t var childs = divElement.childNodes;\n\t for (var i = 0, iMax = childs.length; i < iMax; i++) {\n\t var child = childs[i];\n\n\t // remove the style\n\t if (child.style) {\n\t // TODO: test if child.attributes does contain style\n\t child.removeAttribute('style');\n\t }\n\n\t // remove all attributes\n\t var attributes = child.attributes;\n\t if (attributes) {\n\t for (var j = attributes.length - 1; j >= 0; j--) {\n\t var attribute = attributes[j];\n\t if (attribute.specified === true) {\n\t child.removeAttribute(attribute.name);\n\t }\n\t }\n\t }\n\n\t // recursively strip childs\n\t exports.stripFormatting(child);\n\t }\n\t};\n\n\t/**\n\t * Set focus to the end of an editable div\n\t * code from Nico Burns\n\t * http://stackoverflow.com/users/140293/nico-burns\n\t * http://stackoverflow.com/questions/1125292/how-to-move-cursor-to-end-of-contenteditable-entity\n\t * @param {Element} contentEditableElement A content editable div\n\t */\n\texports.setEndOfContentEditable = function setEndOfContentEditable(contentEditableElement) {\n\t var range, selection;\n\t if(document.createRange) {\n\t range = document.createRange();//Create a range (a range is a like the selection but invisible)\n\t range.selectNodeContents(contentEditableElement);//Select the entire contents of the element with the range\n\t range.collapse(false);//collapse the range to the end point. false means collapse to end rather than the start\n\t selection = window.getSelection();//get the selection object (allows you to change selection)\n\t selection.removeAllRanges();//remove any selections already made\n\t selection.addRange(range);//make the range you have just created the visible selection\n\t }\n\t};\n\n\t/**\n\t * Select all text of a content editable div.\n\t * http://stackoverflow.com/a/3806004/1262753\n\t * @param {Element} contentEditableElement A content editable div\n\t */\n\texports.selectContentEditable = function selectContentEditable(contentEditableElement) {\n\t if (!contentEditableElement || contentEditableElement.nodeName != 'DIV') {\n\t return;\n\t }\n\n\t var sel, range;\n\t if (window.getSelection && document.createRange) {\n\t range = document.createRange();\n\t range.selectNodeContents(contentEditableElement);\n\t sel = window.getSelection();\n\t sel.removeAllRanges();\n\t sel.addRange(range);\n\t }\n\t};\n\n\t/**\n\t * Get text selection\n\t * http://stackoverflow.com/questions/4687808/contenteditable-selected-text-save-and-restore\n\t * @return {Range | TextRange | null} range\n\t */\n\texports.getSelection = function getSelection() {\n\t if (window.getSelection) {\n\t var sel = window.getSelection();\n\t if (sel.getRangeAt && sel.rangeCount) {\n\t return sel.getRangeAt(0);\n\t }\n\t }\n\t return null;\n\t};\n\n\t/**\n\t * Set text selection\n\t * http://stackoverflow.com/questions/4687808/contenteditable-selected-text-save-and-restore\n\t * @param {Range | TextRange | null} range\n\t */\n\texports.setSelection = function setSelection(range) {\n\t if (range) {\n\t if (window.getSelection) {\n\t var sel = window.getSelection();\n\t sel.removeAllRanges();\n\t sel.addRange(range);\n\t }\n\t }\n\t};\n\n\t/**\n\t * Get selected text range\n\t * @return {Object} params object containing parameters:\n\t * {Number} startOffset\n\t * {Number} endOffset\n\t * {Element} container HTML element holding the\n\t * selected text element\n\t * Returns null if no text selection is found\n\t */\n\texports.getSelectionOffset = function getSelectionOffset() {\n\t var range = exports.getSelection();\n\n\t if (range && 'startOffset' in range && 'endOffset' in range &&\n\t range.startContainer && (range.startContainer == range.endContainer)) {\n\t return {\n\t startOffset: range.startOffset,\n\t endOffset: range.endOffset,\n\t container: range.startContainer.parentNode\n\t };\n\t }\n\n\t return null;\n\t};\n\n\t/**\n\t * Set selected text range in given element\n\t * @param {Object} params An object containing:\n\t * {Element} container\n\t * {Number} startOffset\n\t * {Number} endOffset\n\t */\n\texports.setSelectionOffset = function setSelectionOffset(params) {\n\t if (document.createRange && window.getSelection) {\n\t var selection = window.getSelection();\n\t if(selection) {\n\t var range = document.createRange();\n\n\t if (!params.container.firstChild) {\n\t params.container.appendChild(document.createTextNode(''));\n\t }\n\n\t // TODO: do not suppose that the first child of the container is a textnode,\n\t // but recursively find the textnodes\n\t range.setStart(params.container.firstChild, params.startOffset);\n\t range.setEnd(params.container.firstChild, params.endOffset);\n\n\t exports.setSelection(range);\n\t }\n\t }\n\t};\n\n\t/**\n\t * Get the inner text of an HTML element (for example a div element)\n\t * @param {Element} element\n\t * @param {Object} [buffer]\n\t * @return {String} innerText\n\t */\n\texports.getInnerText = function getInnerText(element, buffer) {\n\t var first = (buffer == undefined);\n\t if (first) {\n\t buffer = {\n\t 'text': '',\n\t 'flush': function () {\n\t var text = this.text;\n\t this.text = '';\n\t return text;\n\t },\n\t 'set': function (text) {\n\t this.text = text;\n\t }\n\t };\n\t }\n\n\t // text node\n\t if (element.nodeValue) {\n\t return buffer.flush() + element.nodeValue;\n\t }\n\n\t // divs or other HTML elements\n\t if (element.hasChildNodes()) {\n\t var childNodes = element.childNodes;\n\t var innerText = '';\n\n\t for (var i = 0, iMax = childNodes.length; i < iMax; i++) {\n\t var child = childNodes[i];\n\n\t if (child.nodeName == 'DIV' || child.nodeName == 'P') {\n\t var prevChild = childNodes[i - 1];\n\t var prevName = prevChild ? prevChild.nodeName : undefined;\n\t if (prevName && prevName != 'DIV' && prevName != 'P' && prevName != 'BR') {\n\t innerText += '\\n';\n\t buffer.flush();\n\t }\n\t innerText += exports.getInnerText(child, buffer);\n\t buffer.set('\\n');\n\t }\n\t else if (child.nodeName == 'BR') {\n\t innerText += buffer.flush();\n\t buffer.set('\\n');\n\t }\n\t else {\n\t innerText += exports.getInnerText(child, buffer);\n\t }\n\t }\n\n\t return innerText;\n\t }\n\t else {\n\t if (element.nodeName == 'P' && exports.getInternetExplorerVersion() != -1) {\n\t // On Internet Explorer, a

with hasChildNodes()==false is\n\t // rendered with a new line. Note that a

with\n\t // hasChildNodes()==true is rendered without a new line\n\t // Other browsers always ensure there is a
inside the

,\n\t // and if not, the

does not render a new line\n\t return buffer.flush();\n\t }\n\t }\n\n\t // br or unknown\n\t return '';\n\t};\n\n\t/**\n\t * Returns the version of Internet Explorer or a -1\n\t * (indicating the use of another browser).\n\t * Source: http://msdn.microsoft.com/en-us/library/ms537509(v=vs.85).aspx\n\t * @return {Number} Internet Explorer version, or -1 in case of an other browser\n\t */\n\texports.getInternetExplorerVersion = function getInternetExplorerVersion() {\n\t if (_ieVersion == -1) {\n\t var rv = -1; // Return value assumes failure.\n\t if (navigator.appName == 'Microsoft Internet Explorer')\n\t {\n\t var ua = navigator.userAgent;\n\t var re = new RegExp(\"MSIE ([0-9]{1,}[\\.0-9]{0,})\");\n\t if (re.exec(ua) != null) {\n\t rv = parseFloat( RegExp.$1 );\n\t }\n\t }\n\n\t _ieVersion = rv;\n\t }\n\n\t return _ieVersion;\n\t};\n\n\t/**\n\t * Test whether the current browser is Firefox\n\t * @returns {boolean} isFirefox\n\t */\n\texports.isFirefox = function isFirefox () {\n\t return (navigator.userAgent.indexOf(\"Firefox\") != -1);\n\t};\n\n\t/**\n\t * cached internet explorer version\n\t * @type {Number}\n\t * @private\n\t */\n\tvar _ieVersion = -1;\n\n\t/**\n\t * Add and event listener. Works for all browsers\n\t * @param {Element} element An html element\n\t * @param {string} action The action, for example \"click\",\n\t * without the prefix \"on\"\n\t * @param {function} listener The callback function to be executed\n\t * @param {boolean} [useCapture] false by default\n\t * @return {function} the created event listener\n\t */\n\texports.addEventListener = function addEventListener(element, action, listener, useCapture) {\n\t if (element.addEventListener) {\n\t if (useCapture === undefined)\n\t useCapture = false;\n\n\t if (action === \"mousewheel\" && exports.isFirefox()) {\n\t action = \"DOMMouseScroll\"; // For Firefox\n\t }\n\n\t element.addEventListener(action, listener, useCapture);\n\t return listener;\n\t } else if (element.attachEvent) {\n\t // Old IE browsers\n\t var f = function () {\n\t return listener.call(element, window.event);\n\t };\n\t element.attachEvent(\"on\" + action, f);\n\t return f;\n\t }\n\t};\n\n\t/**\n\t * Remove an event listener from an element\n\t * @param {Element} element An html dom element\n\t * @param {string} action The name of the event, for example \"mousedown\"\n\t * @param {function} listener The listener function\n\t * @param {boolean} [useCapture] false by default\n\t */\n\texports.removeEventListener = function removeEventListener(element, action, listener, useCapture) {\n\t if (element.removeEventListener) {\n\t if (useCapture === undefined)\n\t useCapture = false;\n\n\t if (action === \"mousewheel\" && exports.isFirefox()) {\n\t action = \"DOMMouseScroll\"; // For Firefox\n\t }\n\n\t element.removeEventListener(action, listener, useCapture);\n\t } else if (element.detachEvent) {\n\t // Old IE browsers\n\t element.detachEvent(\"on\" + action, listener);\n\t }\n\t};\n\n\t/**\n\t * Parse a JSON path like '.items[3].name' into an array\n\t * @param {string} jsonPath\n\t * @return {Array}\n\t */\n\texports.parsePath = function parsePath(jsonPath) {\n\t var prop, remainder;\n\n\t if (jsonPath.length === 0) {\n\t return [];\n\t }\n\n\t // find a match like '.prop'\n\t var match = jsonPath.match(/^\\.(\\w+)/);\n\t if (match) {\n\t prop = match[1];\n\t remainder = jsonPath.substr(prop.length + 1);\n\t }\n\t else if (jsonPath[0] === '[') {\n\t // find a match like\n\t var end = jsonPath.indexOf(']');\n\t if (end === -1) {\n\t throw new SyntaxError('Character ] expected in path');\n\t }\n\t if (end === 1) {\n\t throw new SyntaxError('Index expected after [');\n\t }\n\n\t var value = jsonPath.substring(1, end);\n\t if (value[0] === '\\'') {\n\t // ajv produces string prop names with single quotes, so we need\n\t // to reformat them into valid double-quoted JSON strings\n\t value = '\\\"' + value.substring(1, value.length - 1) + '\\\"';\n\t }\n\n\t prop = value === '*' ? value : JSON.parse(value); // parse string and number\n\t remainder = jsonPath.substr(end + 1);\n\t }\n\t else {\n\t throw new SyntaxError('Failed to parse path');\n\t }\n\n\t return [prop].concat(parsePath(remainder))\n\t};\n\n\t/**\n\t * Improve the error message of a JSON schema error\n\t * @param {Object} error\n\t * @return {Object} The error\n\t */\n\texports.improveSchemaError = function (error) {\n\t if (error.keyword === 'enum' && Array.isArray(error.schema)) {\n\t var enums = error.schema;\n\t if (enums) {\n\t enums = enums.map(function (value) {\n\t return JSON.stringify(value);\n\t });\n\n\t if (enums.length > 5) {\n\t var more = ['(' + (enums.length - 5) + ' more...)'];\n\t enums = enums.slice(0, 5);\n\t enums.push(more);\n\t }\n\t error.message = 'should be equal to one of: ' + enums.join(', ');\n\t }\n\t }\n\n\t if (error.keyword === 'additionalProperties') {\n\t error.message = 'should NOT have additional property: ' + error.params.additionalProperty;\n\t }\n\n\t return error;\n\t};\n\n\t/**\n\t * Test whether the child rect fits completely inside the parent rect.\n\t * @param {ClientRect} parent\n\t * @param {ClientRect} child\n\t * @param {number} margin\n\t */\n\texports.insideRect = function (parent, child, margin) {\n\t var _margin = margin !== undefined ? margin : 0;\n\t return child.left - _margin >= parent.left\n\t && child.right + _margin <= parent.right\n\t && child.top - _margin >= parent.top\n\t && child.bottom + _margin <= parent.bottom;\n\t};\n\n\t/**\n\t * Returns a function, that, as long as it continues to be invoked, will not\n\t * be triggered. The function will be called after it stops being called for\n\t * N milliseconds.\n\t *\n\t * Source: https://davidwalsh.name/javascript-debounce-function\n\t *\n\t * @param {function} func\n\t * @param {number} wait Number in milliseconds\n\t * @param {boolean} [immediate=false] If `immediate` is passed, trigger the\n\t * function on the leading edge, instead\n\t * of the trailing.\n\t * @return {function} Return the debounced function\n\t */\n\texports.debounce = function debounce(func, wait, immediate) {\n\t var timeout;\n\t return function() {\n\t var context = this, args = arguments;\n\t var later = function() {\n\t timeout = null;\n\t if (!immediate) func.apply(context, args);\n\t };\n\t var callNow = immediate && !timeout;\n\t clearTimeout(timeout);\n\t timeout = setTimeout(later, wait);\n\t if (callNow) func.apply(context, args);\n\t };\n\t};\n\n\t/**\n\t * Determines the difference between two texts.\n\t * Can only detect one removed or inserted block of characters.\n\t * @param {string} oldText\n\t * @param {string} newText\n\t * @return {{start: number, end: number}} Returns the start and end\n\t * of the changed part in newText.\n\t */\n\texports.textDiff = function textDiff(oldText, newText) {\n\t var len = newText.length;\n\t var start = 0;\n\t var oldEnd = oldText.length;\n\t var newEnd = newText.length;\n\n\t while (newText.charAt(start) === oldText.charAt(start)\n\t && start < len) {\n\t start++;\n\t }\n\n\t while (newText.charAt(newEnd - 1) === oldText.charAt(oldEnd - 1)\n\t && newEnd > start && oldEnd > 0) {\n\t newEnd--;\n\t oldEnd--;\n\t }\n\n\t return {start: start, end: newEnd};\n\t};\n\n\n/***/ },\n/* 5 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t/* Jison generated parser */\n\tvar jsonlint = (function(){\n\tvar parser = {trace: function trace() { },\n\tyy: {},\n\tsymbols_: {\"error\":2,\"JSONString\":3,\"STRING\":4,\"JSONNumber\":5,\"NUMBER\":6,\"JSONNullLiteral\":7,\"NULL\":8,\"JSONBooleanLiteral\":9,\"TRUE\":10,\"FALSE\":11,\"JSONText\":12,\"JSONValue\":13,\"EOF\":14,\"JSONObject\":15,\"JSONArray\":16,\"{\":17,\"}\":18,\"JSONMemberList\":19,\"JSONMember\":20,\":\":21,\",\":22,\"[\":23,\"]\":24,\"JSONElementList\":25,\"$accept\":0,\"$end\":1},\n\tterminals_: {2:\"error\",4:\"STRING\",6:\"NUMBER\",8:\"NULL\",10:\"TRUE\",11:\"FALSE\",14:\"EOF\",17:\"{\",18:\"}\",21:\":\",22:\",\",23:\"[\",24:\"]\"},\n\tproductions_: [0,[3,1],[5,1],[7,1],[9,1],[9,1],[12,2],[13,1],[13,1],[13,1],[13,1],[13,1],[13,1],[15,2],[15,3],[20,3],[19,1],[19,3],[16,2],[16,3],[25,1],[25,3]],\n\tperformAction: function anonymous(yytext,yyleng,yylineno,yy,yystate,$$,_$) {\n\n\tvar $0 = $$.length - 1;\n\tswitch (yystate) {\n\tcase 1: // replace escaped characters with actual character\n\t this.$ = yytext.replace(/\\\\(\\\\|\")/g, \"$\"+\"1\")\n\t .replace(/\\\\n/g,'\\n')\n\t .replace(/\\\\r/g,'\\r')\n\t .replace(/\\\\t/g,'\\t')\n\t .replace(/\\\\v/g,'\\v')\n\t .replace(/\\\\f/g,'\\f')\n\t .replace(/\\\\b/g,'\\b');\n\t \n\tbreak;\n\tcase 2:this.$ = Number(yytext);\n\tbreak;\n\tcase 3:this.$ = null;\n\tbreak;\n\tcase 4:this.$ = true;\n\tbreak;\n\tcase 5:this.$ = false;\n\tbreak;\n\tcase 6:return this.$ = $$[$0-1];\n\tbreak;\n\tcase 13:this.$ = {};\n\tbreak;\n\tcase 14:this.$ = $$[$0-1];\n\tbreak;\n\tcase 15:this.$ = [$$[$0-2], $$[$0]];\n\tbreak;\n\tcase 16:this.$ = {}; this.$[$$[$0][0]] = $$[$0][1];\n\tbreak;\n\tcase 17:this.$ = $$[$0-2]; $$[$0-2][$$[$0][0]] = $$[$0][1];\n\tbreak;\n\tcase 18:this.$ = [];\n\tbreak;\n\tcase 19:this.$ = $$[$0-1];\n\tbreak;\n\tcase 20:this.$ = [$$[$0]];\n\tbreak;\n\tcase 21:this.$ = $$[$0-2]; $$[$0-2].push($$[$0]);\n\tbreak;\n\t}\n\t},\n\ttable: [{3:5,4:[1,12],5:6,6:[1,13],7:3,8:[1,9],9:4,10:[1,10],11:[1,11],12:1,13:2,15:7,16:8,17:[1,14],23:[1,15]},{1:[3]},{14:[1,16]},{14:[2,7],18:[2,7],22:[2,7],24:[2,7]},{14:[2,8],18:[2,8],22:[2,8],24:[2,8]},{14:[2,9],18:[2,9],22:[2,9],24:[2,9]},{14:[2,10],18:[2,10],22:[2,10],24:[2,10]},{14:[2,11],18:[2,11],22:[2,11],24:[2,11]},{14:[2,12],18:[2,12],22:[2,12],24:[2,12]},{14:[2,3],18:[2,3],22:[2,3],24:[2,3]},{14:[2,4],18:[2,4],22:[2,4],24:[2,4]},{14:[2,5],18:[2,5],22:[2,5],24:[2,5]},{14:[2,1],18:[2,1],21:[2,1],22:[2,1],24:[2,1]},{14:[2,2],18:[2,2],22:[2,2],24:[2,2]},{3:20,4:[1,12],18:[1,17],19:18,20:19},{3:5,4:[1,12],5:6,6:[1,13],7:3,8:[1,9],9:4,10:[1,10],11:[1,11],13:23,15:7,16:8,17:[1,14],23:[1,15],24:[1,21],25:22},{1:[2,6]},{14:[2,13],18:[2,13],22:[2,13],24:[2,13]},{18:[1,24],22:[1,25]},{18:[2,16],22:[2,16]},{21:[1,26]},{14:[2,18],18:[2,18],22:[2,18],24:[2,18]},{22:[1,28],24:[1,27]},{22:[2,20],24:[2,20]},{14:[2,14],18:[2,14],22:[2,14],24:[2,14]},{3:20,4:[1,12],20:29},{3:5,4:[1,12],5:6,6:[1,13],7:3,8:[1,9],9:4,10:[1,10],11:[1,11],13:30,15:7,16:8,17:[1,14],23:[1,15]},{14:[2,19],18:[2,19],22:[2,19],24:[2,19]},{3:5,4:[1,12],5:6,6:[1,13],7:3,8:[1,9],9:4,10:[1,10],11:[1,11],13:31,15:7,16:8,17:[1,14],23:[1,15]},{18:[2,17],22:[2,17]},{18:[2,15],22:[2,15]},{22:[2,21],24:[2,21]}],\n\tdefaultActions: {16:[2,6]},\n\tparseError: function parseError(str, hash) {\n\t throw new Error(str);\n\t},\n\tparse: function parse(input) {\n\t var self = this,\n\t stack = [0],\n\t vstack = [null], // semantic value stack\n\t lstack = [], // location stack\n\t table = this.table,\n\t yytext = '',\n\t yylineno = 0,\n\t yyleng = 0,\n\t recovering = 0,\n\t TERROR = 2,\n\t EOF = 1;\n\n\t //this.reductionCount = this.shiftCount = 0;\n\n\t this.lexer.setInput(input);\n\t this.lexer.yy = this.yy;\n\t this.yy.lexer = this.lexer;\n\t if (typeof this.lexer.yylloc == 'undefined')\n\t this.lexer.yylloc = {};\n\t var yyloc = this.lexer.yylloc;\n\t lstack.push(yyloc);\n\n\t if (typeof this.yy.parseError === 'function')\n\t this.parseError = this.yy.parseError;\n\n\t function popStack (n) {\n\t stack.length = stack.length - 2*n;\n\t vstack.length = vstack.length - n;\n\t lstack.length = lstack.length - n;\n\t }\n\n\t function lex() {\n\t var token;\n\t token = self.lexer.lex() || 1; // $end = 1\n\t // if token isn't its numeric value, convert\n\t if (typeof token !== 'number') {\n\t token = self.symbols_[token] || token;\n\t }\n\t return token;\n\t }\n\n\t var symbol, preErrorSymbol, state, action, a, r, yyval={},p,len,newState, expected;\n\t while (true) {\n\t // retreive state number from top of stack\n\t state = stack[stack.length-1];\n\n\t // use default actions if available\n\t if (this.defaultActions[state]) {\n\t action = this.defaultActions[state];\n\t } else {\n\t if (symbol == null)\n\t symbol = lex();\n\t // read action for current state and first input\n\t action = table[state] && table[state][symbol];\n\t }\n\n\t // handle parse error\n\t _handle_error:\n\t if (typeof action === 'undefined' || !action.length || !action[0]) {\n\n\t if (!recovering) {\n\t // Report error\n\t expected = [];\n\t for (p in table[state]) if (this.terminals_[p] && p > 2) {\n\t expected.push(\"'\"+this.terminals_[p]+\"'\");\n\t }\n\t var errStr = '';\n\t if (this.lexer.showPosition) {\n\t errStr = 'Parse error on line '+(yylineno+1)+\":\\n\"+this.lexer.showPosition()+\"\\nExpecting \"+expected.join(', ') + \", got '\" + this.terminals_[symbol]+ \"'\";\n\t } else {\n\t errStr = 'Parse error on line '+(yylineno+1)+\": Unexpected \" +\n\t (symbol == 1 /*EOF*/ ? \"end of input\" :\n\t (\"'\"+(this.terminals_[symbol] || symbol)+\"'\"));\n\t }\n\t this.parseError(errStr,\n\t {text: this.lexer.match, token: this.terminals_[symbol] || symbol, line: this.lexer.yylineno, loc: yyloc, expected: expected});\n\t }\n\n\t // just recovered from another error\n\t if (recovering == 3) {\n\t if (symbol == EOF) {\n\t throw new Error(errStr || 'Parsing halted.');\n\t }\n\n\t // discard current lookahead and grab another\n\t yyleng = this.lexer.yyleng;\n\t yytext = this.lexer.yytext;\n\t yylineno = this.lexer.yylineno;\n\t yyloc = this.lexer.yylloc;\n\t symbol = lex();\n\t }\n\n\t // try to recover from error\n\t while (1) {\n\t // check for error recovery rule in this state\n\t if ((TERROR.toString()) in table[state]) {\n\t break;\n\t }\n\t if (state == 0) {\n\t throw new Error(errStr || 'Parsing halted.');\n\t }\n\t popStack(1);\n\t state = stack[stack.length-1];\n\t }\n\n\t preErrorSymbol = symbol; // save the lookahead token\n\t symbol = TERROR; // insert generic error symbol as new lookahead\n\t state = stack[stack.length-1];\n\t action = table[state] && table[state][TERROR];\n\t recovering = 3; // allow 3 real symbols to be shifted before reporting a new error\n\t }\n\n\t // this shouldn't happen, unless resolve defaults are off\n\t if (action[0] instanceof Array && action.length > 1) {\n\t throw new Error('Parse Error: multiple actions possible at state: '+state+', token: '+symbol);\n\t }\n\n\t switch (action[0]) {\n\n\t case 1: // shift\n\t //this.shiftCount++;\n\n\t stack.push(symbol);\n\t vstack.push(this.lexer.yytext);\n\t lstack.push(this.lexer.yylloc);\n\t stack.push(action[1]); // push state\n\t symbol = null;\n\t if (!preErrorSymbol) { // normal execution/no error\n\t yyleng = this.lexer.yyleng;\n\t yytext = this.lexer.yytext;\n\t yylineno = this.lexer.yylineno;\n\t yyloc = this.lexer.yylloc;\n\t if (recovering > 0)\n\t recovering--;\n\t } else { // error just occurred, resume old lookahead f/ before error\n\t symbol = preErrorSymbol;\n\t preErrorSymbol = null;\n\t }\n\t break;\n\n\t case 2: // reduce\n\t //this.reductionCount++;\n\n\t len = this.productions_[action[1]][1];\n\n\t // perform semantic action\n\t yyval.$ = vstack[vstack.length-len]; // default to $$ = $1\n\t // default location, uses first token for firsts, last for lasts\n\t yyval._$ = {\n\t first_line: lstack[lstack.length-(len||1)].first_line,\n\t last_line: lstack[lstack.length-1].last_line,\n\t first_column: lstack[lstack.length-(len||1)].first_column,\n\t last_column: lstack[lstack.length-1].last_column\n\t };\n\t r = this.performAction.call(yyval, yytext, yyleng, yylineno, this.yy, action[1], vstack, lstack);\n\n\t if (typeof r !== 'undefined') {\n\t return r;\n\t }\n\n\t // pop off stack\n\t if (len) {\n\t stack = stack.slice(0,-1*len*2);\n\t vstack = vstack.slice(0, -1*len);\n\t lstack = lstack.slice(0, -1*len);\n\t }\n\n\t stack.push(this.productions_[action[1]][0]); // push nonterminal (reduce)\n\t vstack.push(yyval.$);\n\t lstack.push(yyval._$);\n\t // goto new state = table[STATE][NONTERMINAL]\n\t newState = table[stack[stack.length-2]][stack[stack.length-1]];\n\t stack.push(newState);\n\t break;\n\n\t case 3: // accept\n\t return true;\n\t }\n\n\t }\n\n\t return true;\n\t}};\n\t/* Jison generated lexer */\n\tvar lexer = (function(){\n\tvar lexer = ({EOF:1,\n\tparseError:function parseError(str, hash) {\n\t if (this.yy.parseError) {\n\t this.yy.parseError(str, hash);\n\t } else {\n\t throw new Error(str);\n\t }\n\t },\n\tsetInput:function (input) {\n\t this._input = input;\n\t this._more = this._less = this.done = false;\n\t this.yylineno = this.yyleng = 0;\n\t this.yytext = this.matched = this.match = '';\n\t this.conditionStack = ['INITIAL'];\n\t this.yylloc = {first_line:1,first_column:0,last_line:1,last_column:0};\n\t return this;\n\t },\n\tinput:function () {\n\t var ch = this._input[0];\n\t this.yytext+=ch;\n\t this.yyleng++;\n\t this.match+=ch;\n\t this.matched+=ch;\n\t var lines = ch.match(/\\n/);\n\t if (lines) this.yylineno++;\n\t this._input = this._input.slice(1);\n\t return ch;\n\t },\n\tunput:function (ch) {\n\t this._input = ch + this._input;\n\t return this;\n\t },\n\tmore:function () {\n\t this._more = true;\n\t return this;\n\t },\n\tless:function (n) {\n\t this._input = this.match.slice(n) + this._input;\n\t },\n\tpastInput:function () {\n\t var past = this.matched.substr(0, this.matched.length - this.match.length);\n\t return (past.length > 20 ? '...':'') + past.substr(-20).replace(/\\n/g, \"\");\n\t },\n\tupcomingInput:function () {\n\t var next = this.match;\n\t if (next.length < 20) {\n\t next += this._input.substr(0, 20-next.length);\n\t }\n\t return (next.substr(0,20)+(next.length > 20 ? '...':'')).replace(/\\n/g, \"\");\n\t },\n\tshowPosition:function () {\n\t var pre = this.pastInput();\n\t var c = new Array(pre.length + 1).join(\"-\");\n\t return pre + this.upcomingInput() + \"\\n\" + c+\"^\";\n\t },\n\tnext:function () {\n\t if (this.done) {\n\t return this.EOF;\n\t }\n\t if (!this._input) this.done = true;\n\n\t var token,\n\t match,\n\t tempMatch,\n\t index,\n\t col,\n\t lines;\n\t if (!this._more) {\n\t this.yytext = '';\n\t this.match = '';\n\t }\n\t var rules = this._currentRules();\n\t for (var i=0;i < rules.length; i++) {\n\t tempMatch = this._input.match(this.rules[rules[i]]);\n\t if (tempMatch && (!match || tempMatch[0].length > match[0].length)) {\n\t match = tempMatch;\n\t index = i;\n\t if (!this.options.flex) break;\n\t }\n\t }\n\t if (match) {\n\t lines = match[0].match(/\\n.*/g);\n\t if (lines) this.yylineno += lines.length;\n\t this.yylloc = {first_line: this.yylloc.last_line,\n\t last_line: this.yylineno+1,\n\t first_column: this.yylloc.last_column,\n\t last_column: lines ? lines[lines.length-1].length-1 : this.yylloc.last_column + match[0].length}\n\t this.yytext += match[0];\n\t this.match += match[0];\n\t this.yyleng = this.yytext.length;\n\t this._more = false;\n\t this._input = this._input.slice(match[0].length);\n\t this.matched += match[0];\n\t token = this.performAction.call(this, this.yy, this, rules[index],this.conditionStack[this.conditionStack.length-1]);\n\t if (this.done && this._input) this.done = false;\n\t if (token) return token;\n\t else return;\n\t }\n\t if (this._input === \"\") {\n\t return this.EOF;\n\t } else {\n\t this.parseError('Lexical error on line '+(this.yylineno+1)+'. Unrecognized text.\\n'+this.showPosition(), \n\t {text: \"\", token: null, line: this.yylineno});\n\t }\n\t },\n\tlex:function lex() {\n\t var r = this.next();\n\t if (typeof r !== 'undefined') {\n\t return r;\n\t } else {\n\t return this.lex();\n\t }\n\t },\n\tbegin:function begin(condition) {\n\t this.conditionStack.push(condition);\n\t },\n\tpopState:function popState() {\n\t return this.conditionStack.pop();\n\t },\n\t_currentRules:function _currentRules() {\n\t return this.conditions[this.conditionStack[this.conditionStack.length-1]].rules;\n\t },\n\ttopState:function () {\n\t return this.conditionStack[this.conditionStack.length-2];\n\t },\n\tpushState:function begin(condition) {\n\t this.begin(condition);\n\t }});\n\tlexer.options = {};\n\tlexer.performAction = function anonymous(yy,yy_,$avoiding_name_collisions,YY_START) {\n\n\tvar YYSTATE=YY_START\n\tswitch($avoiding_name_collisions) {\n\tcase 0:/* skip whitespace */\n\tbreak;\n\tcase 1:return 6\n\tbreak;\n\tcase 2:yy_.yytext = yy_.yytext.substr(1,yy_.yyleng-2); return 4\n\tbreak;\n\tcase 3:return 17\n\tbreak;\n\tcase 4:return 18\n\tbreak;\n\tcase 5:return 23\n\tbreak;\n\tcase 6:return 24\n\tbreak;\n\tcase 7:return 22\n\tbreak;\n\tcase 8:return 21\n\tbreak;\n\tcase 9:return 10\n\tbreak;\n\tcase 10:return 11\n\tbreak;\n\tcase 11:return 8\n\tbreak;\n\tcase 12:return 14\n\tbreak;\n\tcase 13:return 'INVALID'\n\tbreak;\n\t}\n\t};\n\tlexer.rules = [/^(?:\\s+)/,/^(?:(-?([0-9]|[1-9][0-9]+))(\\.[0-9]+)?([eE][-+]?[0-9]+)?\\b)/,/^(?:\"(?:\\\\[\\\\\"bfnrt/]|\\\\u[a-fA-F0-9]{4}|[^\\\\\\0-\\x09\\x0a-\\x1f\"])*\")/,/^(?:\\{)/,/^(?:\\})/,/^(?:\\[)/,/^(?:\\])/,/^(?:,)/,/^(?::)/,/^(?:true\\b)/,/^(?:false\\b)/,/^(?:null\\b)/,/^(?:$)/,/^(?:.)/];\n\tlexer.conditions = {\"INITIAL\":{\"rules\":[0,1,2,3,4,5,6,7,8,9,10,11,12,13],\"inclusive\":true}};\n\n\n\t;\n\treturn lexer;})()\n\tparser.lexer = lexer;\n\treturn parser;\n\t})();\n\tif (true) {\n\t exports.parser = jsonlint;\n\t exports.parse = jsonlint.parse.bind(jsonlint);\n\t}\n\n/***/ },\n/* 6 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\n\t/**\n\t * @constructor SearchBox\n\t * Create a search box in given HTML container\n\t * @param {JSONEditor} editor The JSON Editor to attach to\n\t * @param {Element} container HTML container element of where to\n\t * create the search box\n\t */\n\tfunction SearchBox (editor, container) {\n\t var searchBox = this;\n\n\t this.editor = editor;\n\t this.timeout = undefined;\n\t this.delay = 200; // ms\n\t this.lastText = undefined;\n\n\t this.dom = {};\n\t this.dom.container = container;\n\n\t var table = document.createElement('table');\n\t this.dom.table = table;\n\t table.className = 'jsoneditor-search';\n\t container.appendChild(table);\n\t var tbody = document.createElement('tbody');\n\t this.dom.tbody = tbody;\n\t table.appendChild(tbody);\n\t var tr = document.createElement('tr');\n\t tbody.appendChild(tr);\n\n\t var td = document.createElement('td');\n\t tr.appendChild(td);\n\t var results = document.createElement('div');\n\t this.dom.results = results;\n\t results.className = 'jsoneditor-results';\n\t td.appendChild(results);\n\n\t td = document.createElement('td');\n\t tr.appendChild(td);\n\t var divInput = document.createElement('div');\n\t this.dom.input = divInput;\n\t divInput.className = 'jsoneditor-frame';\n\t divInput.title = 'Search fields and values';\n\t td.appendChild(divInput);\n\n\t // table to contain the text input and search button\n\t var tableInput = document.createElement('table');\n\t divInput.appendChild(tableInput);\n\t var tbodySearch = document.createElement('tbody');\n\t tableInput.appendChild(tbodySearch);\n\t tr = document.createElement('tr');\n\t tbodySearch.appendChild(tr);\n\n\t var refreshSearch = document.createElement('button');\n\t refreshSearch.type = 'button';\n\t refreshSearch.className = 'jsoneditor-refresh';\n\t td = document.createElement('td');\n\t td.appendChild(refreshSearch);\n\t tr.appendChild(td);\n\n\t var search = document.createElement('input');\n\t // search.type = 'button';\n\t this.dom.search = search;\n\t search.oninput = function (event) {\n\t searchBox._onDelayedSearch(event);\n\t };\n\t search.onchange = function (event) { // For IE 9\n\t searchBox._onSearch();\n\t };\n\t search.onkeydown = function (event) {\n\t searchBox._onKeyDown(event);\n\t };\n\t search.onkeyup = function (event) {\n\t searchBox._onKeyUp(event);\n\t };\n\t refreshSearch.onclick = function (event) {\n\t search.select();\n\t };\n\n\t // TODO: ESC in FF restores the last input, is a FF bug, https://bugzilla.mozilla.org/show_bug.cgi?id=598819\n\t td = document.createElement('td');\n\t td.appendChild(search);\n\t tr.appendChild(td);\n\n\t var searchNext = document.createElement('button');\n\t searchNext.type = 'button';\n\t searchNext.title = 'Next result (Enter)';\n\t searchNext.className = 'jsoneditor-next';\n\t searchNext.onclick = function () {\n\t searchBox.next();\n\t };\n\t td = document.createElement('td');\n\t td.appendChild(searchNext);\n\t tr.appendChild(td);\n\n\t var searchPrevious = document.createElement('button');\n\t searchPrevious.type = 'button';\n\t searchPrevious.title = 'Previous result (Shift+Enter)';\n\t searchPrevious.className = 'jsoneditor-previous';\n\t searchPrevious.onclick = function () {\n\t searchBox.previous();\n\t };\n\t td = document.createElement('td');\n\t td.appendChild(searchPrevious);\n\t tr.appendChild(td);\n\t}\n\n\t/**\n\t * Go to the next search result\n\t * @param {boolean} [focus] If true, focus will be set to the next result\n\t * focus is false by default.\n\t */\n\tSearchBox.prototype.next = function(focus) {\n\t if (this.results != undefined) {\n\t var index = (this.resultIndex != undefined) ? this.resultIndex + 1 : 0;\n\t if (index > this.results.length - 1) {\n\t index = 0;\n\t }\n\t this._setActiveResult(index, focus);\n\t }\n\t};\n\n\t/**\n\t * Go to the prevous search result\n\t * @param {boolean} [focus] If true, focus will be set to the next result\n\t * focus is false by default.\n\t */\n\tSearchBox.prototype.previous = function(focus) {\n\t if (this.results != undefined) {\n\t var max = this.results.length - 1;\n\t var index = (this.resultIndex != undefined) ? this.resultIndex - 1 : max;\n\t if (index < 0) {\n\t index = max;\n\t }\n\t this._setActiveResult(index, focus);\n\t }\n\t};\n\n\t/**\n\t * Set new value for the current active result\n\t * @param {Number} index\n\t * @param {boolean} [focus] If true, focus will be set to the next result.\n\t * focus is false by default.\n\t * @private\n\t */\n\tSearchBox.prototype._setActiveResult = function(index, focus) {\n\t // de-activate current active result\n\t if (this.activeResult) {\n\t var prevNode = this.activeResult.node;\n\t var prevElem = this.activeResult.elem;\n\t if (prevElem == 'field') {\n\t delete prevNode.searchFieldActive;\n\t }\n\t else {\n\t delete prevNode.searchValueActive;\n\t }\n\t prevNode.updateDom();\n\t }\n\n\t if (!this.results || !this.results[index]) {\n\t // out of range, set to undefined\n\t this.resultIndex = undefined;\n\t this.activeResult = undefined;\n\t return;\n\t }\n\n\t this.resultIndex = index;\n\n\t // set new node active\n\t var node = this.results[this.resultIndex].node;\n\t var elem = this.results[this.resultIndex].elem;\n\t if (elem == 'field') {\n\t node.searchFieldActive = true;\n\t }\n\t else {\n\t node.searchValueActive = true;\n\t }\n\t this.activeResult = this.results[this.resultIndex];\n\t node.updateDom();\n\n\t // TODO: not so nice that the focus is only set after the animation is finished\n\t node.scrollTo(function () {\n\t if (focus) {\n\t node.focus(elem);\n\t }\n\t });\n\t};\n\n\t/**\n\t * Cancel any running onDelayedSearch.\n\t * @private\n\t */\n\tSearchBox.prototype._clearDelay = function() {\n\t if (this.timeout != undefined) {\n\t clearTimeout(this.timeout);\n\t delete this.timeout;\n\t }\n\t};\n\n\t/**\n\t * Start a timer to execute a search after a short delay.\n\t * Used for reducing the number of searches while typing.\n\t * @param {Event} event\n\t * @private\n\t */\n\tSearchBox.prototype._onDelayedSearch = function (event) {\n\t // execute the search after a short delay (reduces the number of\n\t // search actions while typing in the search text box)\n\t this._clearDelay();\n\t var searchBox = this;\n\t this.timeout = setTimeout(function (event) {\n\t searchBox._onSearch();\n\t },\n\t this.delay);\n\t};\n\n\t/**\n\t * Handle onSearch event\n\t * @param {boolean} [forceSearch] If true, search will be executed again even\n\t * when the search text is not changed.\n\t * Default is false.\n\t * @private\n\t */\n\tSearchBox.prototype._onSearch = function (forceSearch) {\n\t this._clearDelay();\n\n\t var value = this.dom.search.value;\n\t var text = (value.length > 0) ? value : undefined;\n\t if (text != this.lastText || forceSearch) {\n\t // only search again when changed\n\t this.lastText = text;\n\t this.results = this.editor.search(text);\n\t this._setActiveResult(undefined);\n\n\t // display search results\n\t if (text != undefined) {\n\t var resultCount = this.results.length;\n\t switch (resultCount) {\n\t case 0: this.dom.results.innerHTML = 'no results'; break;\n\t case 1: this.dom.results.innerHTML = '1 result'; break;\n\t default: this.dom.results.innerHTML = resultCount + ' results'; break;\n\t }\n\t }\n\t else {\n\t this.dom.results.innerHTML = '';\n\t }\n\t }\n\t};\n\n\t/**\n\t * Handle onKeyDown event in the input box\n\t * @param {Event} event\n\t * @private\n\t */\n\tSearchBox.prototype._onKeyDown = function (event) {\n\t var keynum = event.which;\n\t if (keynum == 27) { // ESC\n\t this.dom.search.value = ''; // clear search\n\t this._onSearch();\n\t event.preventDefault();\n\t event.stopPropagation();\n\t }\n\t else if (keynum == 13) { // Enter\n\t if (event.ctrlKey) {\n\t // force to search again\n\t this._onSearch(true);\n\t }\n\t else if (event.shiftKey) {\n\t // move to the previous search result\n\t this.previous();\n\t }\n\t else {\n\t // move to the next search result\n\t this.next();\n\t }\n\t event.preventDefault();\n\t event.stopPropagation();\n\t }\n\t};\n\n\t/**\n\t * Handle onKeyUp event in the input box\n\t * @param {Event} event\n\t * @private\n\t */\n\tSearchBox.prototype._onKeyUp = function (event) {\n\t var keynum = event.keyCode;\n\t if (keynum != 27 && keynum != 13) { // !show and !Enter\n\t this._onDelayedSearch(event); // For IE 9\n\t }\n\t};\n\n\t/**\n\t * Clear the search results\n\t */\n\tSearchBox.prototype.clear = function () {\n\t this.dom.search.value = '';\n\t this._onSearch();\n\t};\n\n\t/**\n\t * Destroy the search box\n\t */\n\tSearchBox.prototype.destroy = function () {\n\t this.editor = null;\n\t this.dom.container.removeChild(this.dom.table);\n\t this.dom = null;\n\n\t this.results = null;\n\t this.activeResult = null;\n\n\t this._clearDelay();\n\n\t};\n\n\tmodule.exports = SearchBox;\n\n\n/***/ },\n/* 7 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar util = __webpack_require__(4);\n\n\t/**\n\t * A context menu\n\t * @param {Object[]} items Array containing the menu structure\n\t * TODO: describe structure\n\t * @param {Object} [options] Object with options. Available options:\n\t * {function} close Callback called when the\n\t * context menu is being closed.\n\t * @constructor\n\t */\n\tfunction ContextMenu (items, options) {\n\t this.dom = {};\n\n\t var me = this;\n\t var dom = this.dom;\n\t this.anchor = undefined;\n\t this.items = items;\n\t this.eventListeners = {};\n\t this.selection = undefined; // holds the selection before the menu was opened\n\t this.onClose = options ? options.close : undefined;\n\n\t // create root element\n\t var root = document.createElement('div');\n\t root.className = 'jsoneditor-contextmenu-root';\n\t dom.root = root;\n\n\t // create a container element\n\t var menu = document.createElement('div');\n\t menu.className = 'jsoneditor-contextmenu';\n\t dom.menu = menu;\n\t root.appendChild(menu);\n\n\t // create a list to hold the menu items\n\t var list = document.createElement('ul');\n\t list.className = 'jsoneditor-menu';\n\t menu.appendChild(list);\n\t dom.list = list;\n\t dom.items = []; // list with all buttons\n\n\t // create a (non-visible) button to set the focus to the menu\n\t var focusButton = document.createElement('button');\n\t focusButton.type = 'button';\n\t dom.focusButton = focusButton;\n\t var li = document.createElement('li');\n\t li.style.overflow = 'hidden';\n\t li.style.height = '0';\n\t li.appendChild(focusButton);\n\t list.appendChild(li);\n\n\t function createMenuItems (list, domItems, items) {\n\t items.forEach(function (item) {\n\t if (item.type == 'separator') {\n\t // create a separator\n\t var separator = document.createElement('div');\n\t separator.className = 'jsoneditor-separator';\n\t li = document.createElement('li');\n\t li.appendChild(separator);\n\t list.appendChild(li);\n\t }\n\t else {\n\t var domItem = {};\n\n\t // create a menu item\n\t var li = document.createElement('li');\n\t list.appendChild(li);\n\n\t // create a button in the menu item\n\t var button = document.createElement('button');\n\t button.type = 'button';\n\t button.className = item.className;\n\t domItem.button = button;\n\t if (item.title) {\n\t button.title = item.title;\n\t }\n\t if (item.click) {\n\t button.onclick = function (event) {\n\t event.preventDefault();\n\t me.hide();\n\t item.click();\n\t };\n\t }\n\t li.appendChild(button);\n\n\t // create the contents of the button\n\t if (item.submenu) {\n\t // add the icon to the button\n\t var divIcon = document.createElement('div');\n\t divIcon.className = 'jsoneditor-icon';\n\t button.appendChild(divIcon);\n\t button.appendChild(document.createTextNode(item.text));\n\n\t var buttonSubmenu;\n\t if (item.click) {\n\t // submenu and a button with a click handler\n\t button.className += ' jsoneditor-default';\n\n\t var buttonExpand = document.createElement('button');\n\t buttonExpand.type = 'button';\n\t domItem.buttonExpand = buttonExpand;\n\t buttonExpand.className = 'jsoneditor-expand';\n\t buttonExpand.innerHTML = '

';\n\t li.appendChild(buttonExpand);\n\t if (item.submenuTitle) {\n\t buttonExpand.title = item.submenuTitle;\n\t }\n\n\t buttonSubmenu = buttonExpand;\n\t }\n\t else {\n\t // submenu and a button without a click handler\n\t var divExpand = document.createElement('div');\n\t divExpand.className = 'jsoneditor-expand';\n\t button.appendChild(divExpand);\n\n\t buttonSubmenu = button;\n\t }\n\n\t // attach a handler to expand/collapse the submenu\n\t buttonSubmenu.onclick = function (event) {\n\t event.preventDefault();\n\t me._onExpandItem(domItem);\n\t buttonSubmenu.focus();\n\t };\n\n\t // create the submenu\n\t var domSubItems = [];\n\t domItem.subItems = domSubItems;\n\t var ul = document.createElement('ul');\n\t domItem.ul = ul;\n\t ul.className = 'jsoneditor-menu';\n\t ul.style.height = '0';\n\t li.appendChild(ul);\n\t createMenuItems(ul, domSubItems, item.submenu);\n\t }\n\t else {\n\t // no submenu, just a button with clickhandler\n\t button.innerHTML = '
' + item.text;\n\t }\n\n\t domItems.push(domItem);\n\t }\n\t });\n\t }\n\t createMenuItems(list, this.dom.items, items);\n\n\t // TODO: when the editor is small, show the submenu on the right instead of inline?\n\n\t // calculate the max height of the menu with one submenu expanded\n\t this.maxHeight = 0; // height in pixels\n\t items.forEach(function (item) {\n\t var height = (items.length + (item.submenu ? item.submenu.length : 0)) * 24;\n\t me.maxHeight = Math.max(me.maxHeight, height);\n\t });\n\t}\n\n\t/**\n\t * Get the currently visible buttons\n\t * @return {Array.} buttons\n\t * @private\n\t */\n\tContextMenu.prototype._getVisibleButtons = function () {\n\t var buttons = [];\n\t var me = this;\n\t this.dom.items.forEach(function (item) {\n\t buttons.push(item.button);\n\t if (item.buttonExpand) {\n\t buttons.push(item.buttonExpand);\n\t }\n\t if (item.subItems && item == me.expandedItem) {\n\t item.subItems.forEach(function (subItem) {\n\t buttons.push(subItem.button);\n\t if (subItem.buttonExpand) {\n\t buttons.push(subItem.buttonExpand);\n\t }\n\t // TODO: change to fully recursive method\n\t });\n\t }\n\t });\n\n\t return buttons;\n\t};\n\n\t// currently displayed context menu, a singleton. We may only have one visible context menu\n\tContextMenu.visibleMenu = undefined;\n\n\t/**\n\t * Attach the menu to an anchor\n\t * @param {HTMLElement} anchor Anchor where the menu will be attached\n\t * as sibling.\n\t * @param {HTMLElement} [contentWindow] The DIV with with the (scrollable) contents\n\t */\n\tContextMenu.prototype.show = function (anchor, contentWindow) {\n\t this.hide();\n\n\t // determine whether to display the menu below or above the anchor\n\t var showBelow = true;\n\t if (contentWindow) {\n\t var anchorRect = anchor.getBoundingClientRect();\n\t var contentRect = contentWindow.getBoundingClientRect();\n\n\t if (anchorRect.bottom + this.maxHeight < contentRect.bottom) {\n\t // fits below -> show below\n\t }\n\t else if (anchorRect.top - this.maxHeight > contentRect.top) {\n\t // fits above -> show above\n\t showBelow = false;\n\t }\n\t else {\n\t // doesn't fit above nor below -> show below\n\t }\n\t }\n\n\t // position the menu\n\t if (showBelow) {\n\t // display the menu below the anchor\n\t var anchorHeight = anchor.offsetHeight;\n\t this.dom.menu.style.left = '0px';\n\t this.dom.menu.style.top = anchorHeight + 'px';\n\t this.dom.menu.style.bottom = '';\n\t }\n\t else {\n\t // display the menu above the anchor\n\t this.dom.menu.style.left = '0px';\n\t this.dom.menu.style.top = '';\n\t this.dom.menu.style.bottom = '0px';\n\t }\n\n\t // attach the menu to the parent of the anchor\n\t var parent = anchor.parentNode;\n\t parent.insertBefore(this.dom.root, parent.firstChild);\n\n\t // create and attach event listeners\n\t var me = this;\n\t var list = this.dom.list;\n\t this.eventListeners.mousedown = util.addEventListener(window, 'mousedown', function (event) {\n\t // hide menu on click outside of the menu\n\t var target = event.target;\n\t if ((target != list) && !me._isChildOf(target, list)) {\n\t me.hide();\n\t event.stopPropagation();\n\t event.preventDefault();\n\t }\n\t });\n\t this.eventListeners.keydown = util.addEventListener(window, 'keydown', function (event) {\n\t me._onKeyDown(event);\n\t });\n\n\t // move focus to the first button in the context menu\n\t this.selection = util.getSelection();\n\t this.anchor = anchor;\n\t setTimeout(function () {\n\t me.dom.focusButton.focus();\n\t }, 0);\n\n\t if (ContextMenu.visibleMenu) {\n\t ContextMenu.visibleMenu.hide();\n\t }\n\t ContextMenu.visibleMenu = this;\n\t};\n\n\t/**\n\t * Hide the context menu if visible\n\t */\n\tContextMenu.prototype.hide = function () {\n\t // remove the menu from the DOM\n\t if (this.dom.root.parentNode) {\n\t this.dom.root.parentNode.removeChild(this.dom.root);\n\t if (this.onClose) {\n\t this.onClose();\n\t }\n\t }\n\n\t // remove all event listeners\n\t // all event listeners are supposed to be attached to document.\n\t for (var name in this.eventListeners) {\n\t if (this.eventListeners.hasOwnProperty(name)) {\n\t var fn = this.eventListeners[name];\n\t if (fn) {\n\t util.removeEventListener(window, name, fn);\n\t }\n\t delete this.eventListeners[name];\n\t }\n\t }\n\n\t if (ContextMenu.visibleMenu == this) {\n\t ContextMenu.visibleMenu = undefined;\n\t }\n\t};\n\n\t/**\n\t * Expand a submenu\n\t * Any currently expanded submenu will be hided.\n\t * @param {Object} domItem\n\t * @private\n\t */\n\tContextMenu.prototype._onExpandItem = function (domItem) {\n\t var me = this;\n\t var alreadyVisible = (domItem == this.expandedItem);\n\n\t // hide the currently visible submenu\n\t var expandedItem = this.expandedItem;\n\t if (expandedItem) {\n\t //var ul = expandedItem.ul;\n\t expandedItem.ul.style.height = '0';\n\t expandedItem.ul.style.padding = '';\n\t setTimeout(function () {\n\t if (me.expandedItem != expandedItem) {\n\t expandedItem.ul.style.display = '';\n\t util.removeClassName(expandedItem.ul.parentNode, 'jsoneditor-selected');\n\t }\n\t }, 300); // timeout duration must match the css transition duration\n\t this.expandedItem = undefined;\n\t }\n\n\t if (!alreadyVisible) {\n\t var ul = domItem.ul;\n\t ul.style.display = 'block';\n\t var height = ul.clientHeight; // force a reflow in Firefox\n\t setTimeout(function () {\n\t if (me.expandedItem == domItem) {\n\t ul.style.height = (ul.childNodes.length * 24) + 'px';\n\t ul.style.padding = '5px 10px';\n\t }\n\t }, 0);\n\t util.addClassName(ul.parentNode, 'jsoneditor-selected');\n\t this.expandedItem = domItem;\n\t }\n\t};\n\n\t/**\n\t * Handle onkeydown event\n\t * @param {Event} event\n\t * @private\n\t */\n\tContextMenu.prototype._onKeyDown = function (event) {\n\t var target = event.target;\n\t var keynum = event.which;\n\t var handled = false;\n\t var buttons, targetIndex, prevButton, nextButton;\n\n\t if (keynum == 27) { // ESC\n\t // hide the menu on ESC key\n\n\t // restore previous selection and focus\n\t if (this.selection) {\n\t util.setSelection(this.selection);\n\t }\n\t if (this.anchor) {\n\t this.anchor.focus();\n\t }\n\n\t this.hide();\n\n\t handled = true;\n\t }\n\t else if (keynum == 9) { // Tab\n\t if (!event.shiftKey) { // Tab\n\t buttons = this._getVisibleButtons();\n\t targetIndex = buttons.indexOf(target);\n\t if (targetIndex == buttons.length - 1) {\n\t // move to first button\n\t buttons[0].focus();\n\t handled = true;\n\t }\n\t }\n\t else { // Shift+Tab\n\t buttons = this._getVisibleButtons();\n\t targetIndex = buttons.indexOf(target);\n\t if (targetIndex == 0) {\n\t // move to last button\n\t buttons[buttons.length - 1].focus();\n\t handled = true;\n\t }\n\t }\n\t }\n\t else if (keynum == 37) { // Arrow Left\n\t if (target.className == 'jsoneditor-expand') {\n\t buttons = this._getVisibleButtons();\n\t targetIndex = buttons.indexOf(target);\n\t prevButton = buttons[targetIndex - 1];\n\t if (prevButton) {\n\t prevButton.focus();\n\t }\n\t }\n\t handled = true;\n\t }\n\t else if (keynum == 38) { // Arrow Up\n\t buttons = this._getVisibleButtons();\n\t targetIndex = buttons.indexOf(target);\n\t prevButton = buttons[targetIndex - 1];\n\t if (prevButton && prevButton.className == 'jsoneditor-expand') {\n\t // skip expand button\n\t prevButton = buttons[targetIndex - 2];\n\t }\n\t if (!prevButton) {\n\t // move to last button\n\t prevButton = buttons[buttons.length - 1];\n\t }\n\t if (prevButton) {\n\t prevButton.focus();\n\t }\n\t handled = true;\n\t }\n\t else if (keynum == 39) { // Arrow Right\n\t buttons = this._getVisibleButtons();\n\t targetIndex = buttons.indexOf(target);\n\t nextButton = buttons[targetIndex + 1];\n\t if (nextButton && nextButton.className == 'jsoneditor-expand') {\n\t nextButton.focus();\n\t }\n\t handled = true;\n\t }\n\t else if (keynum == 40) { // Arrow Down\n\t buttons = this._getVisibleButtons();\n\t targetIndex = buttons.indexOf(target);\n\t nextButton = buttons[targetIndex + 1];\n\t if (nextButton && nextButton.className == 'jsoneditor-expand') {\n\t // skip expand button\n\t nextButton = buttons[targetIndex + 2];\n\t }\n\t if (!nextButton) {\n\t // move to first button\n\t nextButton = buttons[0];\n\t }\n\t if (nextButton) {\n\t nextButton.focus();\n\t handled = true;\n\t }\n\t handled = true;\n\t }\n\t // TODO: arrow left and right\n\n\t if (handled) {\n\t event.stopPropagation();\n\t event.preventDefault();\n\t }\n\t};\n\n\t/**\n\t * Test if an element is a child of a parent element.\n\t * @param {Element} child\n\t * @param {Element} parent\n\t * @return {boolean} isChild\n\t */\n\tContextMenu.prototype._isChildOf = function (child, parent) {\n\t var e = child.parentNode;\n\t while (e) {\n\t if (e == parent) {\n\t return true;\n\t }\n\t e = e.parentNode;\n\t }\n\n\t return false;\n\t};\n\n\tmodule.exports = ContextMenu;\n\n\n/***/ },\n/* 8 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar naturalSort = __webpack_require__(9);\n\tvar ContextMenu = __webpack_require__(7);\n\tvar appendNodeFactory = __webpack_require__(10);\n\tvar util = __webpack_require__(4);\n\n\t/**\n\t * @constructor Node\n\t * Create a new Node\n\t * @param {./treemode} editor\n\t * @param {Object} [params] Can contain parameters:\n\t * {string} field\n\t * {boolean} fieldEditable\n\t * {*} value\n\t * {String} type Can have values 'auto', 'array',\n\t * 'object', or 'string'.\n\t */\n\tfunction Node (editor, params) {\n\t /** @type {./treemode} */\n\t this.editor = editor;\n\t this.dom = {};\n\t this.expanded = false;\n\n\t if(params && (params instanceof Object)) {\n\t this.setField(params.field, params.fieldEditable);\n\t this.setValue(params.value, params.type);\n\t }\n\t else {\n\t this.setField('');\n\t this.setValue(null);\n\t }\n\n\t this._debouncedOnChangeValue = util.debounce(this._onChangeValue.bind(this), Node.prototype.DEBOUNCE_INTERVAL);\n\t this._debouncedOnChangeField = util.debounce(this._onChangeField.bind(this), Node.prototype.DEBOUNCE_INTERVAL);\n\t}\n\n\t// debounce interval for keyboard input in milliseconds\n\tNode.prototype.DEBOUNCE_INTERVAL = 150;\n\n\t/**\n\t * Determine whether the field and/or value of this node are editable\n\t * @private\n\t */\n\tNode.prototype._updateEditability = function () {\n\t this.editable = {\n\t field: true,\n\t value: true\n\t };\n\n\t if (this.editor) {\n\t this.editable.field = this.editor.options.mode === 'tree';\n\t this.editable.value = this.editor.options.mode !== 'view';\n\n\t if ((this.editor.options.mode === 'tree' || this.editor.options.mode === 'form') &&\n\t (typeof this.editor.options.onEditable === 'function')) {\n\t var editable = this.editor.options.onEditable({\n\t field: this.field,\n\t value: this.value,\n\t path: this.getPath()\n\t });\n\n\t if (typeof editable === 'boolean') {\n\t this.editable.field = editable;\n\t this.editable.value = editable;\n\t }\n\t else {\n\t if (typeof editable.field === 'boolean') this.editable.field = editable.field;\n\t if (typeof editable.value === 'boolean') this.editable.value = editable.value;\n\t }\n\t }\n\t }\n\t};\n\n\t/**\n\t * Get the path of this node\n\t * @return {String[]} Array containing the path to this node\n\t */\n\tNode.prototype.getPath = function () {\n\t var node = this;\n\t var path = [];\n\t while (node) {\n\t var field = !node.parent\n\t ? undefined // do not add an (optional) field name of the root node\n\t : (node.parent.type != 'array')\n\t ? node.field\n\t : node.index;\n\n\t if (field !== undefined) {\n\t path.unshift(field);\n\t }\n\t node = node.parent;\n\t }\n\t return path;\n\t};\n\n\t/**\n\t * Find a Node from a JSON path like '.items[3].name'\n\t * @param {string} jsonPath\n\t * @return {Node | null} Returns the Node when found, returns null if not found\n\t */\n\tNode.prototype.findNode = function (jsonPath) {\n\t var path = util.parsePath(jsonPath);\n\t var node = this;\n\t while (node && path.length > 0) {\n\t var prop = path.shift();\n\t if (typeof prop === 'number') {\n\t if (node.type !== 'array') {\n\t throw new Error('Cannot get child node at index ' + prop + ': node is no array');\n\t }\n\t node = node.childs[prop];\n\t }\n\t else { // string\n\t if (node.type !== 'object') {\n\t throw new Error('Cannot get child node ' + prop + ': node is no object');\n\t }\n\t node = node.childs.filter(function (child) {\n\t return child.field === prop;\n\t })[0];\n\t }\n\t }\n\n\t return node;\n\t};\n\n\t/**\n\t * Find all parents of this node. The parents are ordered from root node towards\n\t * the original node.\n\t * @return {Array.}\n\t */\n\tNode.prototype.findParents = function () {\n\t var parents = [];\n\t var parent = this.parent;\n\t while (parent) {\n\t parents.unshift(parent);\n\t parent = parent.parent;\n\t }\n\t return parents;\n\t};\n\n\t/**\n\t *\n\t * @param {{dataPath: string, keyword: string, message: string, params: Object, schemaPath: string} | null} error\n\t * @param {Node} [child] When this is the error of a parent node, pointing\n\t * to an invalid child node, the child node itself\n\t * can be provided. If provided, clicking the error\n\t * icon will set focus to the invalid child node.\n\t */\n\tNode.prototype.setError = function (error, child) {\n\t // ensure the dom exists\n\t this.getDom();\n\n\t this.error = error;\n\t var tdError = this.dom.tdError;\n\t if (error) {\n\t if (!tdError) {\n\t tdError = document.createElement('td');\n\t this.dom.tdError = tdError;\n\t this.dom.tdValue.parentNode.appendChild(tdError);\n\t }\n\n\t var popover = document.createElement('div');\n\t popover.className = 'jsoneditor-popover jsoneditor-right';\n\t popover.appendChild(document.createTextNode(error.message));\n\n\t var button = document.createElement('button');\n\t button.type = 'button';\n\t button.className = 'jsoneditor-schema-error';\n\t button.appendChild(popover);\n\n\t // update the direction of the popover\n\t button.onmouseover = button.onfocus = function updateDirection() {\n\t var directions = ['right', 'above', 'below', 'left'];\n\t for (var i = 0; i < directions.length; i++) {\n\t var direction = directions[i];\n\t popover.className = 'jsoneditor-popover jsoneditor-' + direction;\n\n\t var contentRect = this.editor.content.getBoundingClientRect();\n\t var popoverRect = popover.getBoundingClientRect();\n\t var margin = 20; // account for a scroll bar\n\t var fit = util.insideRect(contentRect, popoverRect, margin);\n\n\t if (fit) {\n\t break;\n\t }\n\t }\n\t }.bind(this);\n\n\t // when clicking the error icon, expand all nodes towards the invalid\n\t // child node, and set focus to the child node\n\t if (child) {\n\t button.onclick = function showInvalidNode() {\n\t child.findParents().forEach(function (parent) {\n\t parent.expand(false);\n\t });\n\n\t child.scrollTo(function () {\n\t child.focus();\n\t });\n\t };\n\t }\n\n\t // apply the error message to the node\n\t while (tdError.firstChild) {\n\t tdError.removeChild(tdError.firstChild);\n\t }\n\t tdError.appendChild(button);\n\t }\n\t else {\n\t if (tdError) {\n\t this.dom.tdError.parentNode.removeChild(this.dom.tdError);\n\t delete this.dom.tdError;\n\t }\n\t }\n\t};\n\n\t/**\n\t * Get the index of this node: the index in the list of childs where this\n\t * node is part of\n\t * @return {number} Returns the index, or -1 if this is the root node\n\t */\n\tNode.prototype.getIndex = function () {\n\t return this.parent ? this.parent.childs.indexOf(this) : -1;\n\t};\n\n\t/**\n\t * Set parent node\n\t * @param {Node} parent\n\t */\n\tNode.prototype.setParent = function(parent) {\n\t this.parent = parent;\n\t};\n\n\t/**\n\t * Set field\n\t * @param {String} field\n\t * @param {boolean} [fieldEditable]\n\t */\n\tNode.prototype.setField = function(field, fieldEditable) {\n\t this.field = field;\n\t this.previousField = field;\n\t this.fieldEditable = (fieldEditable === true);\n\t};\n\n\t/**\n\t * Get field\n\t * @return {String}\n\t */\n\tNode.prototype.getField = function() {\n\t if (this.field === undefined) {\n\t this._getDomField();\n\t }\n\n\t return this.field;\n\t};\n\n\t/**\n\t * Set value. Value is a JSON structure or an element String, Boolean, etc.\n\t * @param {*} value\n\t * @param {String} [type] Specify the type of the value. Can be 'auto',\n\t * 'array', 'object', or 'string'\n\t */\n\tNode.prototype.setValue = function(value, type) {\n\t var childValue, child;\n\n\t // first clear all current childs (if any)\n\t var childs = this.childs;\n\t if (childs) {\n\t while (childs.length) {\n\t this.removeChild(childs[0]);\n\t }\n\t }\n\n\t // TODO: remove the DOM of this Node\n\n\t this.type = this._getType(value);\n\n\t // check if type corresponds with the provided type\n\t if (type && type != this.type) {\n\t if (type == 'string' && this.type == 'auto') {\n\t this.type = type;\n\t }\n\t else {\n\t throw new Error('Type mismatch: ' +\n\t 'cannot cast value of type \"' + this.type +\n\t ' to the specified type \"' + type + '\"');\n\t }\n\t }\n\n\t if (this.type == 'array') {\n\t // array\n\t this.childs = [];\n\t for (var i = 0, iMax = value.length; i < iMax; i++) {\n\t childValue = value[i];\n\t if (childValue !== undefined && !(childValue instanceof Function)) {\n\t // ignore undefined and functions\n\t child = new Node(this.editor, {\n\t value: childValue\n\t });\n\t this.appendChild(child);\n\t }\n\t }\n\t this.value = '';\n\t }\n\t else if (this.type == 'object') {\n\t // object\n\t this.childs = [];\n\t for (var childField in value) {\n\t if (value.hasOwnProperty(childField)) {\n\t childValue = value[childField];\n\t if (childValue !== undefined && !(childValue instanceof Function)) {\n\t // ignore undefined and functions\n\t child = new Node(this.editor, {\n\t field: childField,\n\t value: childValue\n\t });\n\t this.appendChild(child);\n\t }\n\t }\n\t }\n\t this.value = '';\n\n\t // sort object keys\n\t if (this.editor.options.sortObjectKeys === true) {\n\t this.sort('asc');\n\t }\n\t }\n\t else {\n\t // value\n\t this.childs = undefined;\n\t this.value = value;\n\t }\n\n\t this.previousValue = this.value;\n\t};\n\n\t/**\n\t * Get value. Value is a JSON structure\n\t * @return {*} value\n\t */\n\tNode.prototype.getValue = function() {\n\t //var childs, i, iMax;\n\n\t if (this.type == 'array') {\n\t var arr = [];\n\t this.childs.forEach (function (child) {\n\t arr.push(child.getValue());\n\t });\n\t return arr;\n\t }\n\t else if (this.type == 'object') {\n\t var obj = {};\n\t this.childs.forEach (function (child) {\n\t obj[child.getField()] = child.getValue();\n\t });\n\t return obj;\n\t }\n\t else {\n\t if (this.value === undefined) {\n\t this._getDomValue();\n\t }\n\n\t return this.value;\n\t }\n\t};\n\n\t/**\n\t * Get the nesting level of this node\n\t * @return {Number} level\n\t */\n\tNode.prototype.getLevel = function() {\n\t return (this.parent ? this.parent.getLevel() + 1 : 0);\n\t};\n\n\t/**\n\t * Get path of the root node till the current node\n\t * @return {Node[]} Returns an array with nodes\n\t */\n\tNode.prototype.getNodePath = function() {\n\t var path = this.parent ? this.parent.getNodePath() : [];\n\t path.push(this);\n\t return path;\n\t};\n\n\t/**\n\t * Create a clone of a node\n\t * The complete state of a clone is copied, including whether it is expanded or\n\t * not. The DOM elements are not cloned.\n\t * @return {Node} clone\n\t */\n\tNode.prototype.clone = function() {\n\t var clone = new Node(this.editor);\n\t clone.type = this.type;\n\t clone.field = this.field;\n\t clone.fieldInnerText = this.fieldInnerText;\n\t clone.fieldEditable = this.fieldEditable;\n\t clone.value = this.value;\n\t clone.valueInnerText = this.valueInnerText;\n\t clone.expanded = this.expanded;\n\n\t if (this.childs) {\n\t // an object or array\n\t var cloneChilds = [];\n\t this.childs.forEach(function (child) {\n\t var childClone = child.clone();\n\t childClone.setParent(clone);\n\t cloneChilds.push(childClone);\n\t });\n\t clone.childs = cloneChilds;\n\t }\n\t else {\n\t // a value\n\t clone.childs = undefined;\n\t }\n\n\t return clone;\n\t};\n\n\t/**\n\t * Expand this node and optionally its childs.\n\t * @param {boolean} [recurse] Optional recursion, true by default. When\n\t * true, all childs will be expanded recursively\n\t */\n\tNode.prototype.expand = function(recurse) {\n\t if (!this.childs) {\n\t return;\n\t }\n\n\t // set this node expanded\n\t this.expanded = true;\n\t if (this.dom.expand) {\n\t this.dom.expand.className = 'jsoneditor-expanded';\n\t }\n\n\t this.showChilds();\n\n\t if (recurse !== false) {\n\t this.childs.forEach(function (child) {\n\t child.expand(recurse);\n\t });\n\t }\n\t};\n\n\t/**\n\t * Collapse this node and optionally its childs.\n\t * @param {boolean} [recurse] Optional recursion, true by default. When\n\t * true, all childs will be collapsed recursively\n\t */\n\tNode.prototype.collapse = function(recurse) {\n\t if (!this.childs) {\n\t return;\n\t }\n\n\t this.hideChilds();\n\n\t // collapse childs in case of recurse\n\t if (recurse !== false) {\n\t this.childs.forEach(function (child) {\n\t child.collapse(recurse);\n\t });\n\n\t }\n\n\t // make this node collapsed\n\t if (this.dom.expand) {\n\t this.dom.expand.className = 'jsoneditor-collapsed';\n\t }\n\t this.expanded = false;\n\t};\n\n\t/**\n\t * Recursively show all childs when they are expanded\n\t */\n\tNode.prototype.showChilds = function() {\n\t var childs = this.childs;\n\t if (!childs) {\n\t return;\n\t }\n\t if (!this.expanded) {\n\t return;\n\t }\n\n\t var tr = this.dom.tr;\n\t var table = tr ? tr.parentNode : undefined;\n\t if (table) {\n\t // show row with append button\n\t var append = this.getAppend();\n\t var nextTr = tr.nextSibling;\n\t if (nextTr) {\n\t table.insertBefore(append, nextTr);\n\t }\n\t else {\n\t table.appendChild(append);\n\t }\n\n\t // show childs\n\t this.childs.forEach(function (child) {\n\t table.insertBefore(child.getDom(), append);\n\t child.showChilds();\n\t });\n\t }\n\t};\n\n\t/**\n\t * Hide the node with all its childs\n\t */\n\tNode.prototype.hide = function() {\n\t var tr = this.dom.tr;\n\t var table = tr ? tr.parentNode : undefined;\n\t if (table) {\n\t table.removeChild(tr);\n\t }\n\t this.hideChilds();\n\t};\n\n\n\t/**\n\t * Recursively hide all childs\n\t */\n\tNode.prototype.hideChilds = function() {\n\t var childs = this.childs;\n\t if (!childs) {\n\t return;\n\t }\n\t if (!this.expanded) {\n\t return;\n\t }\n\n\t // hide append row\n\t var append = this.getAppend();\n\t if (append.parentNode) {\n\t append.parentNode.removeChild(append);\n\t }\n\n\t // hide childs\n\t this.childs.forEach(function (child) {\n\t child.hide();\n\t });\n\t};\n\n\n\t/**\n\t * Add a new child to the node.\n\t * Only applicable when Node value is of type array or object\n\t * @param {Node} node\n\t */\n\tNode.prototype.appendChild = function(node) {\n\t if (this._hasChilds()) {\n\t // adjust the link to the parent\n\t node.setParent(this);\n\t node.fieldEditable = (this.type == 'object');\n\t if (this.type == 'array') {\n\t node.index = this.childs.length;\n\t }\n\t this.childs.push(node);\n\n\t if (this.expanded) {\n\t // insert into the DOM, before the appendRow\n\t var newTr = node.getDom();\n\t var appendTr = this.getAppend();\n\t var table = appendTr ? appendTr.parentNode : undefined;\n\t if (appendTr && table) {\n\t table.insertBefore(newTr, appendTr);\n\t }\n\n\t node.showChilds();\n\t }\n\n\t this.updateDom({'updateIndexes': true});\n\t node.updateDom({'recurse': true});\n\t }\n\t};\n\n\n\t/**\n\t * Move a node from its current parent to this node\n\t * Only applicable when Node value is of type array or object\n\t * @param {Node} node\n\t * @param {Node} beforeNode\n\t */\n\tNode.prototype.moveBefore = function(node, beforeNode) {\n\t if (this._hasChilds()) {\n\t // create a temporary row, to prevent the scroll position from jumping\n\t // when removing the node\n\t var tbody = (this.dom.tr) ? this.dom.tr.parentNode : undefined;\n\t if (tbody) {\n\t var trTemp = document.createElement('tr');\n\t trTemp.style.height = tbody.clientHeight + 'px';\n\t tbody.appendChild(trTemp);\n\t }\n\n\t if (node.parent) {\n\t node.parent.removeChild(node);\n\t }\n\n\t if (beforeNode instanceof AppendNode) {\n\t this.appendChild(node);\n\t }\n\t else {\n\t this.insertBefore(node, beforeNode);\n\t }\n\n\t if (tbody) {\n\t tbody.removeChild(trTemp);\n\t }\n\t }\n\t};\n\n\t/**\n\t * Move a node from its current parent to this node\n\t * Only applicable when Node value is of type array or object.\n\t * If index is out of range, the node will be appended to the end\n\t * @param {Node} node\n\t * @param {Number} index\n\t */\n\tNode.prototype.moveTo = function (node, index) {\n\t if (node.parent == this) {\n\t // same parent\n\t var currentIndex = this.childs.indexOf(node);\n\t if (currentIndex < index) {\n\t // compensate the index for removal of the node itself\n\t index++;\n\t }\n\t }\n\n\t var beforeNode = this.childs[index] || this.append;\n\t this.moveBefore(node, beforeNode);\n\t};\n\n\t/**\n\t * Insert a new child before a given node\n\t * Only applicable when Node value is of type array or object\n\t * @param {Node} node\n\t * @param {Node} beforeNode\n\t */\n\tNode.prototype.insertBefore = function(node, beforeNode) {\n\t if (this._hasChilds()) {\n\t if (beforeNode == this.append) {\n\t // append to the child nodes\n\n\t // adjust the link to the parent\n\t node.setParent(this);\n\t node.fieldEditable = (this.type == 'object');\n\t this.childs.push(node);\n\t }\n\t else {\n\t // insert before a child node\n\t var index = this.childs.indexOf(beforeNode);\n\t if (index == -1) {\n\t throw new Error('Node not found');\n\t }\n\n\t // adjust the link to the parent\n\t node.setParent(this);\n\t node.fieldEditable = (this.type == 'object');\n\t this.childs.splice(index, 0, node);\n\t }\n\n\t if (this.expanded) {\n\t // insert into the DOM\n\t var newTr = node.getDom();\n\t var nextTr = beforeNode.getDom();\n\t var table = nextTr ? nextTr.parentNode : undefined;\n\t if (nextTr && table) {\n\t table.insertBefore(newTr, nextTr);\n\t }\n\n\t node.showChilds();\n\t }\n\n\t this.updateDom({'updateIndexes': true});\n\t node.updateDom({'recurse': true});\n\t }\n\t};\n\n\t/**\n\t * Insert a new child before a given node\n\t * Only applicable when Node value is of type array or object\n\t * @param {Node} node\n\t * @param {Node} afterNode\n\t */\n\tNode.prototype.insertAfter = function(node, afterNode) {\n\t if (this._hasChilds()) {\n\t var index = this.childs.indexOf(afterNode);\n\t var beforeNode = this.childs[index + 1];\n\t if (beforeNode) {\n\t this.insertBefore(node, beforeNode);\n\t }\n\t else {\n\t this.appendChild(node);\n\t }\n\t }\n\t};\n\n\t/**\n\t * Search in this node\n\t * The node will be expanded when the text is found one of its childs, else\n\t * it will be collapsed. Searches are case insensitive.\n\t * @param {String} text\n\t * @return {Node[]} results Array with nodes containing the search text\n\t */\n\tNode.prototype.search = function(text) {\n\t var results = [];\n\t var index;\n\t var search = text ? text.toLowerCase() : undefined;\n\n\t // delete old search data\n\t delete this.searchField;\n\t delete this.searchValue;\n\n\t // search in field\n\t if (this.field != undefined) {\n\t var field = String(this.field).toLowerCase();\n\t index = field.indexOf(search);\n\t if (index != -1) {\n\t this.searchField = true;\n\t results.push({\n\t 'node': this,\n\t 'elem': 'field'\n\t });\n\t }\n\n\t // update dom\n\t this._updateDomField();\n\t }\n\n\t // search in value\n\t if (this._hasChilds()) {\n\t // array, object\n\n\t // search the nodes childs\n\t if (this.childs) {\n\t var childResults = [];\n\t this.childs.forEach(function (child) {\n\t childResults = childResults.concat(child.search(text));\n\t });\n\t results = results.concat(childResults);\n\t }\n\n\t // update dom\n\t if (search != undefined) {\n\t var recurse = false;\n\t if (childResults.length == 0) {\n\t this.collapse(recurse);\n\t }\n\t else {\n\t this.expand(recurse);\n\t }\n\t }\n\t }\n\t else {\n\t // string, auto\n\t if (this.value != undefined ) {\n\t var value = String(this.value).toLowerCase();\n\t index = value.indexOf(search);\n\t if (index != -1) {\n\t this.searchValue = true;\n\t results.push({\n\t 'node': this,\n\t 'elem': 'value'\n\t });\n\t }\n\t }\n\n\t // update dom\n\t this._updateDomValue();\n\t }\n\n\t return results;\n\t};\n\n\t/**\n\t * Move the scroll position such that this node is in the visible area.\n\t * The node will not get the focus\n\t * @param {function(boolean)} [callback]\n\t */\n\tNode.prototype.scrollTo = function(callback) {\n\t if (!this.dom.tr || !this.dom.tr.parentNode) {\n\t // if the node is not visible, expand its parents\n\t var parent = this.parent;\n\t var recurse = false;\n\t while (parent) {\n\t parent.expand(recurse);\n\t parent = parent.parent;\n\t }\n\t }\n\n\t if (this.dom.tr && this.dom.tr.parentNode) {\n\t this.editor.scrollTo(this.dom.tr.offsetTop, callback);\n\t }\n\t};\n\n\n\t// stores the element name currently having the focus\n\tNode.focusElement = undefined;\n\n\t/**\n\t * Set focus to this node\n\t * @param {String} [elementName] The field name of the element to get the\n\t * focus available values: 'drag', 'menu',\n\t * 'expand', 'field', 'value' (default)\n\t */\n\tNode.prototype.focus = function(elementName) {\n\t Node.focusElement = elementName;\n\n\t if (this.dom.tr && this.dom.tr.parentNode) {\n\t var dom = this.dom;\n\n\t switch (elementName) {\n\t case 'drag':\n\t if (dom.drag) {\n\t dom.drag.focus();\n\t }\n\t else {\n\t dom.menu.focus();\n\t }\n\t break;\n\n\t case 'menu':\n\t dom.menu.focus();\n\t break;\n\n\t case 'expand':\n\t if (this._hasChilds()) {\n\t dom.expand.focus();\n\t }\n\t else if (dom.field && this.fieldEditable) {\n\t dom.field.focus();\n\t util.selectContentEditable(dom.field);\n\t }\n\t else if (dom.value && !this._hasChilds()) {\n\t dom.value.focus();\n\t util.selectContentEditable(dom.value);\n\t }\n\t else {\n\t dom.menu.focus();\n\t }\n\t break;\n\n\t case 'field':\n\t if (dom.field && this.fieldEditable) {\n\t dom.field.focus();\n\t util.selectContentEditable(dom.field);\n\t }\n\t else if (dom.value && !this._hasChilds()) {\n\t dom.value.focus();\n\t util.selectContentEditable(dom.value);\n\t }\n\t else if (this._hasChilds()) {\n\t dom.expand.focus();\n\t }\n\t else {\n\t dom.menu.focus();\n\t }\n\t break;\n\n\t case 'value':\n\t default:\n\t if (dom.value && !this._hasChilds()) {\n\t dom.value.focus();\n\t util.selectContentEditable(dom.value);\n\t }\n\t else if (dom.field && this.fieldEditable) {\n\t dom.field.focus();\n\t util.selectContentEditable(dom.field);\n\t }\n\t else if (this._hasChilds()) {\n\t dom.expand.focus();\n\t }\n\t else {\n\t dom.menu.focus();\n\t }\n\t break;\n\t }\n\t }\n\t};\n\n\t/**\n\t * Select all text in an editable div after a delay of 0 ms\n\t * @param {Element} editableDiv\n\t */\n\tNode.select = function(editableDiv) {\n\t setTimeout(function () {\n\t util.selectContentEditable(editableDiv);\n\t }, 0);\n\t};\n\n\t/**\n\t * Update the values from the DOM field and value of this node\n\t */\n\tNode.prototype.blur = function() {\n\t // retrieve the actual field and value from the DOM.\n\t this._getDomValue(false);\n\t this._getDomField(false);\n\t};\n\n\t/**\n\t * Check if given node is a child. The method will check recursively to find\n\t * this node.\n\t * @param {Node} node\n\t * @return {boolean} containsNode\n\t */\n\tNode.prototype.containsNode = function(node) {\n\t if (this == node) {\n\t return true;\n\t }\n\n\t var childs = this.childs;\n\t if (childs) {\n\t // TODO: use the js5 Array.some() here?\n\t for (var i = 0, iMax = childs.length; i < iMax; i++) {\n\t if (childs[i].containsNode(node)) {\n\t return true;\n\t }\n\t }\n\t }\n\n\t return false;\n\t};\n\n\t/**\n\t * Move given node into this node\n\t * @param {Node} node the childNode to be moved\n\t * @param {Node} beforeNode node will be inserted before given\n\t * node. If no beforeNode is given,\n\t * the node is appended at the end\n\t * @private\n\t */\n\tNode.prototype._move = function(node, beforeNode) {\n\t if (node == beforeNode) {\n\t // nothing to do...\n\t return;\n\t }\n\n\t // check if this node is not a child of the node to be moved here\n\t if (node.containsNode(this)) {\n\t throw new Error('Cannot move a field into a child of itself');\n\t }\n\n\t // remove the original node\n\t if (node.parent) {\n\t node.parent.removeChild(node);\n\t }\n\n\t // create a clone of the node\n\t var clone = node.clone();\n\t node.clearDom();\n\n\t // insert or append the node\n\t if (beforeNode) {\n\t this.insertBefore(clone, beforeNode);\n\t }\n\t else {\n\t this.appendChild(clone);\n\t }\n\n\t /* TODO: adjust the field name (to prevent equal field names)\n\t if (this.type == 'object') {\n\t }\n\t */\n\t};\n\n\t/**\n\t * Remove a child from the node.\n\t * Only applicable when Node value is of type array or object\n\t * @param {Node} node The child node to be removed;\n\t * @return {Node | undefined} node The removed node on success,\n\t * else undefined\n\t */\n\tNode.prototype.removeChild = function(node) {\n\t if (this.childs) {\n\t var index = this.childs.indexOf(node);\n\n\t if (index != -1) {\n\t node.hide();\n\n\t // delete old search results\n\t delete node.searchField;\n\t delete node.searchValue;\n\n\t var removedNode = this.childs.splice(index, 1)[0];\n\t removedNode.parent = null;\n\n\t this.updateDom({'updateIndexes': true});\n\n\t return removedNode;\n\t }\n\t }\n\n\t return undefined;\n\t};\n\n\t/**\n\t * Remove a child node node from this node\n\t * This method is equal to Node.removeChild, except that _remove fire an\n\t * onChange event.\n\t * @param {Node} node\n\t * @private\n\t */\n\tNode.prototype._remove = function (node) {\n\t this.removeChild(node);\n\t};\n\n\t/**\n\t * Change the type of the value of this Node\n\t * @param {String} newType\n\t */\n\tNode.prototype.changeType = function (newType) {\n\t var oldType = this.type;\n\n\t if (oldType == newType) {\n\t // type is not changed\n\t return;\n\t }\n\n\t if ((newType == 'string' || newType == 'auto') &&\n\t (oldType == 'string' || oldType == 'auto')) {\n\t // this is an easy change\n\t this.type = newType;\n\t }\n\t else {\n\t // change from array to object, or from string/auto to object/array\n\t var table = this.dom.tr ? this.dom.tr.parentNode : undefined;\n\t var lastTr;\n\t if (this.expanded) {\n\t lastTr = this.getAppend();\n\t }\n\t else {\n\t lastTr = this.getDom();\n\t }\n\t var nextTr = (lastTr && lastTr.parentNode) ? lastTr.nextSibling : undefined;\n\n\t // hide current field and all its childs\n\t this.hide();\n\t this.clearDom();\n\n\t // adjust the field and the value\n\t this.type = newType;\n\n\t // adjust childs\n\t if (newType == 'object') {\n\t if (!this.childs) {\n\t this.childs = [];\n\t }\n\n\t this.childs.forEach(function (child, index) {\n\t child.clearDom();\n\t delete child.index;\n\t child.fieldEditable = true;\n\t if (child.field == undefined) {\n\t child.field = '';\n\t }\n\t });\n\n\t if (oldType == 'string' || oldType == 'auto') {\n\t this.expanded = true;\n\t }\n\t }\n\t else if (newType == 'array') {\n\t if (!this.childs) {\n\t this.childs = [];\n\t }\n\n\t this.childs.forEach(function (child, index) {\n\t child.clearDom();\n\t child.fieldEditable = false;\n\t child.index = index;\n\t });\n\n\t if (oldType == 'string' || oldType == 'auto') {\n\t this.expanded = true;\n\t }\n\t }\n\t else {\n\t this.expanded = false;\n\t }\n\n\t // create new DOM\n\t if (table) {\n\t if (nextTr) {\n\t table.insertBefore(this.getDom(), nextTr);\n\t }\n\t else {\n\t table.appendChild(this.getDom());\n\t }\n\t }\n\t this.showChilds();\n\t }\n\n\t if (newType == 'auto' || newType == 'string') {\n\t // cast value to the correct type\n\t if (newType == 'string') {\n\t this.value = String(this.value);\n\t }\n\t else {\n\t this.value = this._stringCast(String(this.value));\n\t }\n\n\t this.focus();\n\t }\n\n\t this.updateDom({'updateIndexes': true});\n\t};\n\n\t/**\n\t * Retrieve value from DOM\n\t * @param {boolean} [silent] If true (default), no errors will be thrown in\n\t * case of invalid data\n\t * @private\n\t */\n\tNode.prototype._getDomValue = function(silent) {\n\t if (this.dom.value && this.type != 'array' && this.type != 'object') {\n\t this.valueInnerText = util.getInnerText(this.dom.value);\n\t }\n\n\t if (this.valueInnerText != undefined) {\n\t try {\n\t // retrieve the value\n\t var value;\n\t if (this.type == 'string') {\n\t value = this._unescapeHTML(this.valueInnerText);\n\t }\n\t else {\n\t var str = this._unescapeHTML(this.valueInnerText);\n\t value = this._stringCast(str);\n\t }\n\t if (value !== this.value) {\n\t this.value = value;\n\t this._debouncedOnChangeValue();\n\t }\n\t }\n\t catch (err) {\n\t this.value = undefined;\n\t // TODO: sent an action with the new, invalid value?\n\t if (silent !== true) {\n\t throw err;\n\t }\n\t }\n\t }\n\t};\n\n\t/**\n\t * Handle a changed value\n\t * @private\n\t */\n\tNode.prototype._onChangeValue = function () {\n\t // get current selection, then override the range such that we can select\n\t // the added/removed text on undo/redo\n\t var oldSelection = this.editor.getSelection();\n\t if (oldSelection.range) {\n\t var undoDiff = util.textDiff(String(this.value), String(this.previousValue));\n\t oldSelection.range.startOffset = undoDiff.start;\n\t oldSelection.range.endOffset = undoDiff.end;\n\t }\n\t var newSelection = this.editor.getSelection();\n\t if (newSelection.range) {\n\t var redoDiff = util.textDiff(String(this.previousValue), String(this.value));\n\t newSelection.range.startOffset = redoDiff.start;\n\t newSelection.range.endOffset = redoDiff.end;\n\t }\n\n\t this.editor._onAction('editValue', {\n\t node: this,\n\t oldValue: this.previousValue,\n\t newValue: this.value,\n\t oldSelection: oldSelection,\n\t newSelection: newSelection\n\t });\n\n\t this.previousValue = this.value;\n\t};\n\n\t/**\n\t * Handle a changed field\n\t * @private\n\t */\n\tNode.prototype._onChangeField = function () {\n\t // get current selection, then override the range such that we can select\n\t // the added/removed text on undo/redo\n\t var oldSelection = this.editor.getSelection();\n\t if (oldSelection.range) {\n\t var undoDiff = util.textDiff(this.field, this.previousField);\n\t oldSelection.range.startOffset = undoDiff.start;\n\t oldSelection.range.endOffset = undoDiff.end;\n\t }\n\t var newSelection = this.editor.getSelection();\n\t if (newSelection.range) {\n\t var redoDiff = util.textDiff(this.previousField, this.field);\n\t newSelection.range.startOffset = redoDiff.start;\n\t newSelection.range.endOffset = redoDiff.end;\n\t }\n\n\t this.editor._onAction('editField', {\n\t node: this,\n\t oldValue: this.previousField,\n\t newValue: this.field,\n\t oldSelection: oldSelection,\n\t newSelection: newSelection\n\t });\n\n\t this.previousField = this.field;\n\t};\n\n\t/**\n\t * Update dom value:\n\t * - the text color of the value, depending on the type of the value\n\t * - the height of the field, depending on the width\n\t * - background color in case it is empty\n\t * @private\n\t */\n\tNode.prototype._updateDomValue = function () {\n\t var domValue = this.dom.value;\n\t if (domValue) {\n\t var classNames = ['jsoneditor-value'];\n\n\n\t // set text color depending on value type\n\t var value = this.value;\n\t var type = (this.type == 'auto') ? util.type(value) : this.type;\n\t var isUrl = type == 'string' && util.isUrl(value);\n\t classNames.push('jsoneditor-' + type);\n\t if (isUrl) {\n\t classNames.push('jsoneditor-url');\n\t }\n\n\t // visual styling when empty\n\t var isEmpty = (String(this.value) == '' && this.type != 'array' && this.type != 'object');\n\t if (isEmpty) {\n\t classNames.push('jsoneditor-empty');\n\t }\n\n\t // highlight when there is a search result\n\t if (this.searchValueActive) {\n\t classNames.push('jsoneditor-highlight-active');\n\t }\n\t if (this.searchValue) {\n\t classNames.push('jsoneditor-highlight');\n\t }\n\n\t domValue.className = classNames.join(' ');\n\n\t // update title\n\t if (type == 'array' || type == 'object') {\n\t var count = this.childs ? this.childs.length : 0;\n\t domValue.title = this.type + ' containing ' + count + ' items';\n\t }\n\t else if (isUrl && this.editable.value) {\n\t domValue.title = 'Ctrl+Click or Ctrl+Enter to open url in new window';\n\t }\n\t else {\n\t domValue.title = '';\n\t }\n\n\t // show checkbox when the value is a boolean\n\t if (type === 'boolean' && this.editable.value) {\n\t if (!this.dom.checkbox) {\n\t this.dom.checkbox = document.createElement('input');\n\t this.dom.checkbox.type = 'checkbox';\n\t this.dom.tdCheckbox = document.createElement('td');\n\t this.dom.tdCheckbox.className = 'jsoneditor-tree';\n\t this.dom.tdCheckbox.appendChild(this.dom.checkbox);\n\n\t this.dom.tdValue.parentNode.insertBefore(this.dom.tdCheckbox, this.dom.tdValue);\n\t }\n\n\t this.dom.checkbox.checked = this.value;\n\t }\n\t else {\n\t // cleanup checkbox when displayed\n\t if (this.dom.tdCheckbox) {\n\t this.dom.tdCheckbox.parentNode.removeChild(this.dom.tdCheckbox);\n\t delete this.dom.tdCheckbox;\n\t delete this.dom.checkbox;\n\t }\n\t }\n\n\t if (this.enum && this.editable.value) {\n\t // create select box when this node has an enum object\n\t if (!this.dom.select) {\n\t this.dom.select = document.createElement('select');\n\t this.id = this.field + \"_\" + new Date().getUTCMilliseconds();\n\t this.dom.select.id = this.id;\n\t this.dom.select.name = this.dom.select.id;\n\n\t //Create the default empty option\n\t this.dom.select.option = document.createElement('option');\n\t this.dom.select.option.value = '';\n\t this.dom.select.option.innerHTML = '--';\n\t this.dom.select.appendChild(this.dom.select.option);\n\n\t //Iterate all enum values and add them as options\n\t for(var i = 0; i < this.enum.length; i++) {\n\t this.dom.select.option = document.createElement('option');\n\t this.dom.select.option.value = this.enum[i];\n\t this.dom.select.option.innerHTML = this.enum[i];\n\t if(this.dom.select.option.value == this.value){\n\t this.dom.select.option.selected = true;\n\t }\n\t this.dom.select.appendChild(this.dom.select.option);\n\t }\n\n\t this.dom.tdSelect = document.createElement('td');\n\t this.dom.tdSelect.className = 'jsoneditor-tree';\n\t this.dom.tdSelect.appendChild(this.dom.select);\n\t this.dom.tdValue.parentNode.insertBefore(this.dom.tdSelect, this.dom.tdValue);\n\t }\n\n\t // If the enum is inside a composite type display\n\t // both the simple input and the dropdown field\n\t if(this.schema && (\n\t !this.schema.hasOwnProperty(\"oneOf\") &&\n\t !this.schema.hasOwnProperty(\"anyOf\") &&\n\t !this.schema.hasOwnProperty(\"allOf\"))\n\t ) {\n\t this.valueFieldHTML = this.dom.tdValue.innerHTML;\n\t this.dom.tdValue.style.visibility = 'hidden';\n\t this.dom.tdValue.innerHTML = '';\n\t } else {\n\t delete this.valueFieldHTML;\n\t }\n\t }\n\t else {\n\t // cleanup select box when displayed\n\t if (this.dom.tdSelect) {\n\t this.dom.tdSelect.parentNode.removeChild(this.dom.tdSelect);\n\t delete this.dom.tdSelect;\n\t delete this.dom.select;\n\t this.dom.tdValue.innerHTML = this.valueFieldHTML;\n\t this.dom.tdValue.style.visibility = '';\n\t delete this.valueFieldHTML;\n\t }\n\t }\n\n\t // strip formatting from the contents of the editable div\n\t util.stripFormatting(domValue);\n\t }\n\t};\n\n\t/**\n\t * Update dom field:\n\t * - the text color of the field, depending on the text\n\t * - the height of the field, depending on the width\n\t * - background color in case it is empty\n\t * @private\n\t */\n\tNode.prototype._updateDomField = function () {\n\t var domField = this.dom.field;\n\t if (domField) {\n\t // make backgound color lightgray when empty\n\t var isEmpty = (String(this.field) == '' && this.parent.type != 'array');\n\t if (isEmpty) {\n\t util.addClassName(domField, 'jsoneditor-empty');\n\t }\n\t else {\n\t util.removeClassName(domField, 'jsoneditor-empty');\n\t }\n\n\t // highlight when there is a search result\n\t if (this.searchFieldActive) {\n\t util.addClassName(domField, 'jsoneditor-highlight-active');\n\t }\n\t else {\n\t util.removeClassName(domField, 'jsoneditor-highlight-active');\n\t }\n\t if (this.searchField) {\n\t util.addClassName(domField, 'jsoneditor-highlight');\n\t }\n\t else {\n\t util.removeClassName(domField, 'jsoneditor-highlight');\n\t }\n\n\t // strip formatting from the contents of the editable div\n\t util.stripFormatting(domField);\n\t }\n\t};\n\n\t/**\n\t * Retrieve field from DOM\n\t * @param {boolean} [silent] If true (default), no errors will be thrown in\n\t * case of invalid data\n\t * @private\n\t */\n\tNode.prototype._getDomField = function(silent) {\n\t if (this.dom.field && this.fieldEditable) {\n\t this.fieldInnerText = util.getInnerText(this.dom.field);\n\t }\n\n\t if (this.fieldInnerText != undefined) {\n\t try {\n\t var field = this._unescapeHTML(this.fieldInnerText);\n\n\t if (field !== this.field) {\n\t this.field = field;\n\t this._debouncedOnChangeField();\n\t }\n\t }\n\t catch (err) {\n\t this.field = undefined;\n\t // TODO: sent an action here, with the new, invalid value?\n\t if (silent !== true) {\n\t throw err;\n\t }\n\t }\n\t }\n\t};\n\n\t/**\n\t * Validate this node and all it's childs\n\t * @return {Array.<{node: Node, error: {message: string}}>} Returns a list with duplicates\n\t */\n\tNode.prototype.validate = function () {\n\t var errors = [];\n\n\t // find duplicate keys\n\t if (this.type === 'object') {\n\t var keys = {};\n\t var duplicateKeys = [];\n\t for (var i = 0; i < this.childs.length; i++) {\n\t var child = this.childs[i];\n\t if (keys.hasOwnProperty(child.field)) {\n\t duplicateKeys.push(child.field);\n\t }\n\t keys[child.field] = true;\n\t }\n\n\t if (duplicateKeys.length > 0) {\n\t errors = this.childs\n\t .filter(function (node) {\n\t return duplicateKeys.indexOf(node.field) !== -1;\n\t })\n\t .map(function (node) {\n\t return {\n\t node: node,\n\t error: {\n\t message: 'duplicate key \"' + node.field + '\"'\n\t }\n\t }\n\t });\n\t }\n\t }\n\n\t // recurse over the childs\n\t if (this.childs) {\n\t for (var i = 0; i < this.childs.length; i++) {\n\t var e = this.childs[i].validate();\n\t if (e.length > 0) {\n\t errors = errors.concat(e);\n\t }\n\t }\n\t }\n\n\t return errors;\n\t};\n\n\t/**\n\t * Clear the dom of the node\n\t */\n\tNode.prototype.clearDom = function() {\n\t // TODO: hide the node first?\n\t //this.hide();\n\t // TODO: recursively clear dom?\n\n\t this.dom = {};\n\t};\n\n\t/**\n\t * Get the HTML DOM TR element of the node.\n\t * The dom will be generated when not yet created\n\t * @return {Element} tr HTML DOM TR Element\n\t */\n\tNode.prototype.getDom = function() {\n\t var dom = this.dom;\n\t if (dom.tr) {\n\t return dom.tr;\n\t }\n\n\t this._updateEditability();\n\n\t // create row\n\t dom.tr = document.createElement('tr');\n\t dom.tr.node = this;\n\n\t if (this.editor.options.mode === 'tree') { // note: we take here the global setting\n\t var tdDrag = document.createElement('td');\n\t if (this.editable.field) {\n\t // create draggable area\n\t if (this.parent) {\n\t var domDrag = document.createElement('button');\n\t domDrag.type = 'button';\n\t dom.drag = domDrag;\n\t domDrag.className = 'jsoneditor-dragarea';\n\t domDrag.title = 'Drag to move this field (Alt+Shift+Arrows)';\n\t tdDrag.appendChild(domDrag);\n\t }\n\t }\n\t dom.tr.appendChild(tdDrag);\n\n\t // create context menu\n\t var tdMenu = document.createElement('td');\n\t var menu = document.createElement('button');\n\t menu.type = 'button';\n\t dom.menu = menu;\n\t menu.className = 'jsoneditor-contextmenu';\n\t menu.title = 'Click to open the actions menu (Ctrl+M)';\n\t tdMenu.appendChild(dom.menu);\n\t dom.tr.appendChild(tdMenu);\n\t }\n\n\t // create tree and field\n\t var tdField = document.createElement('td');\n\t dom.tr.appendChild(tdField);\n\t dom.tree = this._createDomTree();\n\t tdField.appendChild(dom.tree);\n\n\t this.updateDom({'updateIndexes': true});\n\n\t return dom.tr;\n\t};\n\n\t/**\n\t * DragStart event, fired on mousedown on the dragarea at the left side of a Node\n\t * @param {Node[] | Node} nodes\n\t * @param {Event} event\n\t */\n\tNode.onDragStart = function (nodes, event) {\n\t if (!Array.isArray(nodes)) {\n\t return Node.onDragStart([nodes], event);\n\t }\n\t if (nodes.length === 0) {\n\t return;\n\t }\n\n\t var firstNode = nodes[0];\n\t var lastNode = nodes[nodes.length - 1];\n\t var draggedNode = Node.getNodeFromTarget(event.target);\n\t var beforeNode = lastNode._nextSibling();\n\t var editor = firstNode.editor;\n\n\t // in case of multiple selected nodes, offsetY prevents the selection from\n\t // jumping when you start dragging one of the lower down nodes in the selection\n\t var offsetY = util.getAbsoluteTop(draggedNode.dom.tr) - util.getAbsoluteTop(firstNode.dom.tr);\n\n\t if (!editor.mousemove) {\n\t editor.mousemove = util.addEventListener(window, 'mousemove', function (event) {\n\t Node.onDrag(nodes, event);\n\t });\n\t }\n\n\t if (!editor.mouseup) {\n\t editor.mouseup = util.addEventListener(window, 'mouseup',function (event ) {\n\t Node.onDragEnd(nodes, event);\n\t });\n\t }\n\n\t editor.highlighter.lock();\n\t editor.drag = {\n\t oldCursor: document.body.style.cursor,\n\t oldSelection: editor.getSelection(),\n\t oldBeforeNode: beforeNode,\n\t mouseX: event.pageX,\n\t offsetY: offsetY,\n\t level: firstNode.getLevel()\n\t };\n\t document.body.style.cursor = 'move';\n\n\t event.preventDefault();\n\t};\n\n\t/**\n\t * Drag event, fired when moving the mouse while dragging a Node\n\t * @param {Node[] | Node} nodes\n\t * @param {Event} event\n\t */\n\tNode.onDrag = function (nodes, event) {\n\t if (!Array.isArray(nodes)) {\n\t return Node.onDrag([nodes], event);\n\t }\n\t if (nodes.length === 0) {\n\t return;\n\t }\n\n\t // TODO: this method has grown too large. Split it in a number of methods\n\t var editor = nodes[0].editor;\n\t var mouseY = event.pageY - editor.drag.offsetY;\n\t var mouseX = event.pageX;\n\t var trThis, trPrev, trNext, trFirst, trLast, trRoot;\n\t var nodePrev, nodeNext;\n\t var topThis, topPrev, topFirst, heightThis, bottomNext, heightNext;\n\t var moved = false;\n\n\t // TODO: add an ESC option, which resets to the original position\n\n\t // move up/down\n\t var firstNode = nodes[0];\n\t trThis = firstNode.dom.tr;\n\t topThis = util.getAbsoluteTop(trThis);\n\t heightThis = trThis.offsetHeight;\n\t if (mouseY < topThis) {\n\t // move up\n\t trPrev = trThis;\n\t do {\n\t trPrev = trPrev.previousSibling;\n\t nodePrev = Node.getNodeFromTarget(trPrev);\n\t topPrev = trPrev ? util.getAbsoluteTop(trPrev) : 0;\n\t }\n\t while (trPrev && mouseY < topPrev);\n\n\t if (nodePrev && !nodePrev.parent) {\n\t nodePrev = undefined;\n\t }\n\n\t if (!nodePrev) {\n\t // move to the first node\n\t trRoot = trThis.parentNode.firstChild;\n\t trPrev = trRoot ? trRoot.nextSibling : undefined;\n\t nodePrev = Node.getNodeFromTarget(trPrev);\n\t if (nodePrev == firstNode) {\n\t nodePrev = undefined;\n\t }\n\t }\n\n\t if (nodePrev) {\n\t // check if mouseY is really inside the found node\n\t trPrev = nodePrev.dom.tr;\n\t topPrev = trPrev ? util.getAbsoluteTop(trPrev) : 0;\n\t if (mouseY > topPrev + heightThis) {\n\t nodePrev = undefined;\n\t }\n\t }\n\n\t if (nodePrev) {\n\t nodes.forEach(function (node) {\n\t nodePrev.parent.moveBefore(node, nodePrev);\n\t });\n\t moved = true;\n\t }\n\t }\n\t else {\n\t // move down\n\t var lastNode = nodes[nodes.length - 1];\n\t trLast = (lastNode.expanded && lastNode.append) ? lastNode.append.getDom() : lastNode.dom.tr;\n\t trFirst = trLast ? trLast.nextSibling : undefined;\n\t if (trFirst) {\n\t topFirst = util.getAbsoluteTop(trFirst);\n\t trNext = trFirst;\n\t do {\n\t nodeNext = Node.getNodeFromTarget(trNext);\n\t if (trNext) {\n\t bottomNext = trNext.nextSibling ?\n\t util.getAbsoluteTop(trNext.nextSibling) : 0;\n\t heightNext = trNext ? (bottomNext - topFirst) : 0;\n\n\t if (nodeNext.parent.childs.length == nodes.length &&\n\t nodeNext.parent.childs[nodes.length - 1] == lastNode) {\n\t // We are about to remove the last child of this parent,\n\t // which will make the parents appendNode visible.\n\t topThis += 27;\n\t // TODO: dangerous to suppose the height of the appendNode a constant of 27 px.\n\t }\n\t }\n\n\t trNext = trNext.nextSibling;\n\t }\n\t while (trNext && mouseY > topThis + heightNext);\n\n\t if (nodeNext && nodeNext.parent) {\n\t // calculate the desired level\n\t var diffX = (mouseX - editor.drag.mouseX);\n\t var diffLevel = Math.round(diffX / 24 / 2);\n\t var level = editor.drag.level + diffLevel; // desired level\n\t var levelNext = nodeNext.getLevel(); // level to be\n\n\t // find the best fitting level (move upwards over the append nodes)\n\t trPrev = nodeNext.dom.tr.previousSibling;\n\t while (levelNext < level && trPrev) {\n\t nodePrev = Node.getNodeFromTarget(trPrev);\n\n\t var isDraggedNode = nodes.some(function (node) {\n\t return node === nodePrev || nodePrev._isChildOf(node);\n\t });\n\n\t if (isDraggedNode) {\n\t // neglect the dragged nodes themselves and their childs\n\t }\n\t else if (nodePrev instanceof AppendNode) {\n\t var childs = nodePrev.parent.childs;\n\t if (childs.length != nodes.length || childs[nodes.length - 1] != lastNode) {\n\t // non-visible append node of a list of childs\n\t // consisting of not only this node (else the\n\t // append node will change into a visible \"empty\"\n\t // text when removing this node).\n\t nodeNext = Node.getNodeFromTarget(trPrev);\n\t levelNext = nodeNext.getLevel();\n\t }\n\t else {\n\t break;\n\t }\n\t }\n\t else {\n\t break;\n\t }\n\n\t trPrev = trPrev.previousSibling;\n\t }\n\n\t // move the node when its position is changed\n\t if (trLast.nextSibling != nodeNext.dom.tr) {\n\t nodes.forEach(function (node) {\n\t nodeNext.parent.moveBefore(node, nodeNext);\n\t });\n\t moved = true;\n\t }\n\t }\n\t }\n\t }\n\n\t if (moved) {\n\t // update the dragging parameters when moved\n\t editor.drag.mouseX = mouseX;\n\t editor.drag.level = firstNode.getLevel();\n\t }\n\n\t // auto scroll when hovering around the top of the editor\n\t editor.startAutoScroll(mouseY);\n\n\t event.preventDefault();\n\t};\n\n\t/**\n\t * Drag event, fired on mouseup after having dragged a node\n\t * @param {Node[] | Node} nodes\n\t * @param {Event} event\n\t */\n\tNode.onDragEnd = function (nodes, event) {\n\t if (!Array.isArray(nodes)) {\n\t return Node.onDrag([nodes], event);\n\t }\n\t if (nodes.length === 0) {\n\t return;\n\t }\n\n\t var firstNode = nodes[0];\n\t var editor = firstNode.editor;\n\t var parent = firstNode.parent;\n\t var firstIndex = parent.childs.indexOf(firstNode);\n\t var beforeNode = parent.childs[firstIndex + nodes.length] || parent.append;\n\n\t // set focus to the context menu button of the first node\n\t if (nodes[0]) {\n\t nodes[0].dom.menu.focus();\n\t }\n\n\t var params = {\n\t nodes: nodes,\n\t oldSelection: editor.drag.oldSelection,\n\t newSelection: editor.getSelection(),\n\t oldBeforeNode: editor.drag.oldBeforeNode,\n\t newBeforeNode: beforeNode\n\t };\n\n\t if (params.oldBeforeNode != params.newBeforeNode) {\n\t // only register this action if the node is actually moved to another place\n\t editor._onAction('moveNodes', params);\n\t }\n\n\t document.body.style.cursor = editor.drag.oldCursor;\n\t editor.highlighter.unlock();\n\t nodes.forEach(function (node) {\n\t if (event.target !== node.dom.drag && event.target !== node.dom.menu) {\n\t editor.highlighter.unhighlight();\n\t }\n\t });\n\t delete editor.drag;\n\n\t if (editor.mousemove) {\n\t util.removeEventListener(window, 'mousemove', editor.mousemove);\n\t delete editor.mousemove;\n\t }\n\t if (editor.mouseup) {\n\t util.removeEventListener(window, 'mouseup', editor.mouseup);\n\t delete editor.mouseup;\n\t }\n\n\t // Stop any running auto scroll\n\t editor.stopAutoScroll();\n\n\t event.preventDefault();\n\t};\n\n\t/**\n\t * Test if this node is a child of an other node\n\t * @param {Node} node\n\t * @return {boolean} isChild\n\t * @private\n\t */\n\tNode.prototype._isChildOf = function (node) {\n\t var n = this.parent;\n\t while (n) {\n\t if (n == node) {\n\t return true;\n\t }\n\t n = n.parent;\n\t }\n\n\t return false;\n\t};\n\n\t/**\n\t * Create an editable field\n\t * @return {Element} domField\n\t * @private\n\t */\n\tNode.prototype._createDomField = function () {\n\t return document.createElement('div');\n\t};\n\n\t/**\n\t * Set highlighting for this node and all its childs.\n\t * Only applied to the currently visible (expanded childs)\n\t * @param {boolean} highlight\n\t */\n\tNode.prototype.setHighlight = function (highlight) {\n\t if (this.dom.tr) {\n\t if (highlight) {\n\t util.addClassName(this.dom.tr, 'jsoneditor-highlight');\n\t }\n\t else {\n\t util.removeClassName(this.dom.tr, 'jsoneditor-highlight');\n\t }\n\n\t if (this.append) {\n\t this.append.setHighlight(highlight);\n\t }\n\n\t if (this.childs) {\n\t this.childs.forEach(function (child) {\n\t child.setHighlight(highlight);\n\t });\n\t }\n\t }\n\t};\n\n\t/**\n\t * Select or deselect a node\n\t * @param {boolean} selected\n\t * @param {boolean} [isFirst]\n\t */\n\tNode.prototype.setSelected = function (selected, isFirst) {\n\t this.selected = selected;\n\n\t if (this.dom.tr) {\n\t if (selected) {\n\t util.addClassName(this.dom.tr, 'jsoneditor-selected');\n\t }\n\t else {\n\t util.removeClassName(this.dom.tr, 'jsoneditor-selected');\n\t }\n\n\t if (isFirst) {\n\t util.addClassName(this.dom.tr, 'jsoneditor-first');\n\t }\n\t else {\n\t util.removeClassName(this.dom.tr, 'jsoneditor-first');\n\t }\n\n\t if (this.append) {\n\t this.append.setSelected(selected);\n\t }\n\n\t if (this.childs) {\n\t this.childs.forEach(function (child) {\n\t child.setSelected(selected);\n\t });\n\t }\n\t }\n\t};\n\n\t/**\n\t * Update the value of the node. Only primitive types are allowed, no Object\n\t * or Array is allowed.\n\t * @param {String | Number | Boolean | null} value\n\t */\n\tNode.prototype.updateValue = function (value) {\n\t this.value = value;\n\t this.updateDom();\n\t};\n\n\t/**\n\t * Update the field of the node.\n\t * @param {String} field\n\t */\n\tNode.prototype.updateField = function (field) {\n\t this.field = field;\n\t this.updateDom();\n\t};\n\n\t/**\n\t * Update the HTML DOM, optionally recursing through the childs\n\t * @param {Object} [options] Available parameters:\n\t * {boolean} [recurse] If true, the\n\t * DOM of the childs will be updated recursively.\n\t * False by default.\n\t * {boolean} [updateIndexes] If true, the childs\n\t * indexes of the node will be updated too. False by\n\t * default.\n\t */\n\tNode.prototype.updateDom = function (options) {\n\t // update level indentation\n\t var domTree = this.dom.tree;\n\t if (domTree) {\n\t domTree.style.marginLeft = this.getLevel() * 24 + 'px';\n\t }\n\n\t // apply field to DOM\n\t var domField = this.dom.field;\n\t if (domField) {\n\t if (this.fieldEditable) {\n\t // parent is an object\n\t domField.contentEditable = this.editable.field;\n\t domField.spellcheck = false;\n\t domField.className = 'jsoneditor-field';\n\t }\n\t else {\n\t // parent is an array this is the root node\n\t domField.className = 'jsoneditor-readonly';\n\t }\n\n\t var fieldText;\n\t if (this.index != undefined) {\n\t fieldText = this.index;\n\t }\n\t else if (this.field != undefined) {\n\t fieldText = this.field;\n\t }\n\t else if (this._hasChilds()) {\n\t fieldText = this.type;\n\t }\n\t else {\n\t fieldText = '';\n\t }\n\t domField.innerHTML = this._escapeHTML(fieldText);\n\n\t this._updateSchema();\n\t }\n\n\t // apply value to DOM\n\t var domValue = this.dom.value;\n\t if (domValue) {\n\t var count = this.childs ? this.childs.length : 0;\n\t if (this.type == 'array') {\n\t domValue.innerHTML = '[' + count + ']';\n\t util.addClassName(this.dom.tr, 'jsoneditor-expandable');\n\t }\n\t else if (this.type == 'object') {\n\t domValue.innerHTML = '{' + count + '}';\n\t util.addClassName(this.dom.tr, 'jsoneditor-expandable');\n\t }\n\t else {\n\t domValue.innerHTML = this._escapeHTML(this.value);\n\t util.removeClassName(this.dom.tr, 'jsoneditor-expandable');\n\t }\n\t }\n\n\t // update field and value\n\t this._updateDomField();\n\t this._updateDomValue();\n\n\t // update childs indexes\n\t if (options && options.updateIndexes === true) {\n\t // updateIndexes is true or undefined\n\t this._updateDomIndexes();\n\t }\n\n\t if (options && options.recurse === true) {\n\t // recurse is true or undefined. update childs recursively\n\t if (this.childs) {\n\t this.childs.forEach(function (child) {\n\t child.updateDom(options);\n\t });\n\t }\n\t }\n\n\t // update row with append button\n\t if (this.append) {\n\t this.append.updateDom();\n\t }\n\t};\n\n\t/**\n\t * Locate the JSON schema of the node and check for any enum type\n\t * @private\n\t */\n\tNode.prototype._updateSchema = function () {\n\t //Locating the schema of the node and checking for any enum type\n\t if(this.editor && this.editor.options) {\n\t // find the part of the json schema matching this nodes path\n\t this.schema = Node._findSchema(this.editor.options.schema, this.getPath());\n\t if (this.schema) {\n\t this.enum = Node._findEnum(this.schema);\n\t }\n\t else {\n\t delete this.enum;\n\t }\n\t }\n\t};\n\n\t/**\n\t * find an enum definition in a JSON schema, as property `enum` or inside\n\t * one of the schemas composites (`oneOf`, `anyOf`, `allOf`)\n\t * @param {Object} schema\n\t * @return {Array | null} Returns the enum when found, null otherwise.\n\t * @private\n\t */\n\tNode._findEnum = function (schema) {\n\t if (schema.enum) {\n\t return schema.enum;\n\t }\n\n\t var composite = schema.oneOf || schema.anyOf || schema.allOf;\n\t if (composite) {\n\t var match = composite.filter(function (entry) {return entry.enum});\n\t if (match.length > 0) {\n\t return match[0].enum;\n\t }\n\t }\n\n\t return null\n\t};\n\n\t/**\n\t * Return the part of a JSON schema matching given path.\n\t * @param {Object} schema\n\t * @param {Array.} path\n\t * @return {Object | null}\n\t * @private\n\t */\n\tNode._findSchema = function (schema, path) {\n\t var childSchema = schema;\n\n\t for (var i = 0; i < path.length && childSchema; i++) {\n\t var key = path[i];\n\t if (typeof key === 'string' && childSchema.properties) {\n\t childSchema = childSchema.properties[key] || null\n\t }\n\t else if (typeof key === 'number' && childSchema.items) {\n\t childSchema = childSchema.items\n\t }\n\t }\n\n\t return childSchema\n\t};\n\n\t/**\n\t * Update the DOM of the childs of a node: update indexes and undefined field\n\t * names.\n\t * Only applicable when structure is an array or object\n\t * @private\n\t */\n\tNode.prototype._updateDomIndexes = function () {\n\t var domValue = this.dom.value;\n\t var childs = this.childs;\n\t if (domValue && childs) {\n\t if (this.type == 'array') {\n\t childs.forEach(function (child, index) {\n\t child.index = index;\n\t var childField = child.dom.field;\n\t if (childField) {\n\t childField.innerHTML = index;\n\t }\n\t });\n\t }\n\t else if (this.type == 'object') {\n\t childs.forEach(function (child) {\n\t if (child.index != undefined) {\n\t delete child.index;\n\n\t if (child.field == undefined) {\n\t child.field = '';\n\t }\n\t }\n\t });\n\t }\n\t }\n\t};\n\n\t/**\n\t * Create an editable value\n\t * @private\n\t */\n\tNode.prototype._createDomValue = function () {\n\t var domValue;\n\n\t if (this.type == 'array') {\n\t domValue = document.createElement('div');\n\t domValue.innerHTML = '[...]';\n\t }\n\t else if (this.type == 'object') {\n\t domValue = document.createElement('div');\n\t domValue.innerHTML = '{...}';\n\t }\n\t else {\n\t if (!this.editable.value && util.isUrl(this.value)) {\n\t // create a link in case of read-only editor and value containing an url\n\t domValue = document.createElement('a');\n\t domValue.href = this.value;\n\t domValue.target = '_blank';\n\t domValue.innerHTML = this._escapeHTML(this.value);\n\t }\n\t else {\n\t // create an editable or read-only div\n\t domValue = document.createElement('div');\n\t domValue.contentEditable = this.editable.value;\n\t domValue.spellcheck = false;\n\t domValue.innerHTML = this._escapeHTML(this.value);\n\t }\n\t }\n\n\t return domValue;\n\t};\n\n\t/**\n\t * Create an expand/collapse button\n\t * @return {Element} expand\n\t * @private\n\t */\n\tNode.prototype._createDomExpandButton = function () {\n\t // create expand button\n\t var expand = document.createElement('button');\n\t expand.type = 'button';\n\t if (this._hasChilds()) {\n\t expand.className = this.expanded ? 'jsoneditor-expanded' : 'jsoneditor-collapsed';\n\t expand.title =\n\t 'Click to expand/collapse this field (Ctrl+E). \\n' +\n\t 'Ctrl+Click to expand/collapse including all childs.';\n\t }\n\t else {\n\t expand.className = 'jsoneditor-invisible';\n\t expand.title = '';\n\t }\n\n\t return expand;\n\t};\n\n\n\t/**\n\t * Create a DOM tree element, containing the expand/collapse button\n\t * @return {Element} domTree\n\t * @private\n\t */\n\tNode.prototype._createDomTree = function () {\n\t var dom = this.dom;\n\t var domTree = document.createElement('table');\n\t var tbody = document.createElement('tbody');\n\t domTree.style.borderCollapse = 'collapse'; // TODO: put in css\n\t domTree.className = 'jsoneditor-values';\n\t domTree.appendChild(tbody);\n\t var tr = document.createElement('tr');\n\t tbody.appendChild(tr);\n\n\t // create expand button\n\t var tdExpand = document.createElement('td');\n\t tdExpand.className = 'jsoneditor-tree';\n\t tr.appendChild(tdExpand);\n\t dom.expand = this._createDomExpandButton();\n\t tdExpand.appendChild(dom.expand);\n\t dom.tdExpand = tdExpand;\n\n\t // create the field\n\t var tdField = document.createElement('td');\n\t tdField.className = 'jsoneditor-tree';\n\t tr.appendChild(tdField);\n\t dom.field = this._createDomField();\n\t tdField.appendChild(dom.field);\n\t dom.tdField = tdField;\n\n\t // create a separator\n\t var tdSeparator = document.createElement('td');\n\t tdSeparator.className = 'jsoneditor-tree';\n\t tr.appendChild(tdSeparator);\n\t if (this.type != 'object' && this.type != 'array') {\n\t tdSeparator.appendChild(document.createTextNode(':'));\n\t tdSeparator.className = 'jsoneditor-separator';\n\t }\n\t dom.tdSeparator = tdSeparator;\n\n\t // create the value\n\t var tdValue = document.createElement('td');\n\t tdValue.className = 'jsoneditor-tree';\n\t tr.appendChild(tdValue);\n\t dom.value = this._createDomValue();\n\t tdValue.appendChild(dom.value);\n\t dom.tdValue = tdValue;\n\n\t return domTree;\n\t};\n\n\t/**\n\t * Handle an event. The event is caught centrally by the editor\n\t * @param {Event} event\n\t */\n\tNode.prototype.onEvent = function (event) {\n\t var type = event.type,\n\t target = event.target || event.srcElement,\n\t dom = this.dom,\n\t node = this,\n\t expandable = this._hasChilds();\n\n\t // check if mouse is on menu or on dragarea.\n\t // If so, highlight current row and its childs\n\t if (target == dom.drag || target == dom.menu) {\n\t if (type == 'mouseover') {\n\t this.editor.highlighter.highlight(this);\n\t }\n\t else if (type == 'mouseout') {\n\t this.editor.highlighter.unhighlight();\n\t }\n\t }\n\n\t // context menu events\n\t if (type == 'click' && target == dom.menu) {\n\t var highlighter = node.editor.highlighter;\n\t highlighter.highlight(node);\n\t highlighter.lock();\n\t util.addClassName(dom.menu, 'jsoneditor-selected');\n\t this.showContextMenu(dom.menu, function () {\n\t util.removeClassName(dom.menu, 'jsoneditor-selected');\n\t highlighter.unlock();\n\t highlighter.unhighlight();\n\t });\n\t }\n\n\t // expand events\n\t if (type == 'click') {\n\t if (target == dom.expand ||\n\t ((node.editor.options.mode === 'view' || node.editor.options.mode === 'form') && target.nodeName === 'DIV')) {\n\t if (expandable) {\n\t var recurse = event.ctrlKey; // with ctrl-key, expand/collapse all\n\t this._onExpand(recurse);\n\t }\n\t }\n\t }\n\n\t // swap the value of a boolean when the checkbox displayed left is clicked\n\t if (type == 'change' && target == dom.checkbox) {\n\t this.dom.value.innerHTML = !this.value;\n\t this._getDomValue();\n\t }\n\n\t // update the value of the node based on the selected option\n\t if (type == 'change' && target == dom.select) {\n\t this.dom.value.innerHTML = dom.select.value;\n\t this._getDomValue();\n\t this._updateDomValue();\n\t }\n\n\t // value events\n\t var domValue = dom.value;\n\t if (target == domValue) {\n\t //noinspection FallthroughInSwitchStatementJS\n\t switch (type) {\n\t case 'blur':\n\t case 'change':\n\t this._getDomValue(true);\n\t this._updateDomValue();\n\t if (this.value) {\n\t domValue.innerHTML = this._escapeHTML(this.value);\n\t }\n\t break;\n\n\t case 'input':\n\t //this._debouncedGetDomValue(true); // TODO\n\t this._getDomValue(true);\n\t this._updateDomValue();\n\t break;\n\n\t case 'keydown':\n\t case 'mousedown':\n\t // TODO: cleanup\n\t this.editor.selection = this.editor.getSelection();\n\t break;\n\n\t case 'click':\n\t if (event.ctrlKey || !this.editable.value) {\n\t if (util.isUrl(this.value)) {\n\t window.open(this.value, '_blank');\n\t }\n\t }\n\t break;\n\n\t case 'keyup':\n\t //this._debouncedGetDomValue(true); // TODO\n\t this._getDomValue(true);\n\t this._updateDomValue();\n\t break;\n\n\t case 'cut':\n\t case 'paste':\n\t setTimeout(function () {\n\t node._getDomValue(true);\n\t node._updateDomValue();\n\t }, 1);\n\t break;\n\t }\n\t }\n\n\t // field events\n\t var domField = dom.field;\n\t if (target == domField) {\n\t switch (type) {\n\t case 'blur':\n\t case 'change':\n\t this._getDomField(true);\n\t this._updateDomField();\n\t if (this.field) {\n\t domField.innerHTML = this._escapeHTML(this.field);\n\t }\n\t break;\n\n\t case 'input':\n\t this._getDomField(true);\n\t this._updateSchema();\n\t this._updateDomField();\n\t this._updateDomValue();\n\t break;\n\n\t case 'keydown':\n\t case 'mousedown':\n\t this.editor.selection = this.editor.getSelection();\n\t break;\n\n\t case 'keyup':\n\t this._getDomField(true);\n\t this._updateDomField();\n\t break;\n\n\t case 'cut':\n\t case 'paste':\n\t setTimeout(function () {\n\t node._getDomField(true);\n\t node._updateDomField();\n\t }, 1);\n\t break;\n\t }\n\t }\n\n\t // focus\n\t // when clicked in whitespace left or right from the field or value, set focus\n\t var domTree = dom.tree;\n\t if (target == domTree.parentNode && type == 'click' && !event.hasMoved) {\n\t var left = (event.offsetX != undefined) ?\n\t (event.offsetX < (this.getLevel() + 1) * 24) :\n\t (event.pageX < util.getAbsoluteLeft(dom.tdSeparator));// for FF\n\t if (left || expandable) {\n\t // node is expandable when it is an object or array\n\t if (domField) {\n\t util.setEndOfContentEditable(domField);\n\t domField.focus();\n\t }\n\t }\n\t else {\n\t if (domValue && !this.enum) {\n\t util.setEndOfContentEditable(domValue);\n\t domValue.focus();\n\t }\n\t }\n\t }\n\t if (((target == dom.tdExpand && !expandable) || target == dom.tdField || target == dom.tdSeparator) &&\n\t (type == 'click' && !event.hasMoved)) {\n\t if (domField) {\n\t util.setEndOfContentEditable(domField);\n\t domField.focus();\n\t }\n\t }\n\n\t if (type == 'keydown') {\n\t this.onKeyDown(event);\n\t }\n\t};\n\n\t/**\n\t * Key down event handler\n\t * @param {Event} event\n\t */\n\tNode.prototype.onKeyDown = function (event) {\n\t var keynum = event.which || event.keyCode;\n\t var target = event.target || event.srcElement;\n\t var ctrlKey = event.ctrlKey;\n\t var shiftKey = event.shiftKey;\n\t var altKey = event.altKey;\n\t var handled = false;\n\t var prevNode, nextNode, nextDom, nextDom2;\n\t var editable = this.editor.options.mode === 'tree';\n\t var oldSelection;\n\t var oldBeforeNode;\n\t var nodes;\n\t var multiselection;\n\t var selectedNodes = this.editor.multiselection.nodes.length > 0\n\t ? this.editor.multiselection.nodes\n\t : [this];\n\t var firstNode = selectedNodes[0];\n\t var lastNode = selectedNodes[selectedNodes.length - 1];\n\n\t // console.log(ctrlKey, keynum, event.charCode); // TODO: cleanup\n\t if (keynum == 13) { // Enter\n\t if (target == this.dom.value) {\n\t if (!this.editable.value || event.ctrlKey) {\n\t if (util.isUrl(this.value)) {\n\t window.open(this.value, '_blank');\n\t handled = true;\n\t }\n\t }\n\t }\n\t else if (target == this.dom.expand) {\n\t var expandable = this._hasChilds();\n\t if (expandable) {\n\t var recurse = event.ctrlKey; // with ctrl-key, expand/collapse all\n\t this._onExpand(recurse);\n\t target.focus();\n\t handled = true;\n\t }\n\t }\n\t }\n\t else if (keynum == 68) { // D\n\t if (ctrlKey && editable) { // Ctrl+D\n\t Node.onDuplicate(selectedNodes);\n\t handled = true;\n\t }\n\t }\n\t else if (keynum == 69) { // E\n\t if (ctrlKey) { // Ctrl+E and Ctrl+Shift+E\n\t this._onExpand(shiftKey); // recurse = shiftKey\n\t target.focus(); // TODO: should restore focus in case of recursing expand (which takes DOM offline)\n\t handled = true;\n\t }\n\t }\n\t else if (keynum == 77 && editable) { // M\n\t if (ctrlKey) { // Ctrl+M\n\t this.showContextMenu(target);\n\t handled = true;\n\t }\n\t }\n\t else if (keynum == 46 && editable) { // Del\n\t if (ctrlKey) { // Ctrl+Del\n\t Node.onRemove(selectedNodes);\n\t handled = true;\n\t }\n\t }\n\t else if (keynum == 45 && editable) { // Ins\n\t if (ctrlKey && !shiftKey) { // Ctrl+Ins\n\t this._onInsertBefore();\n\t handled = true;\n\t }\n\t else if (ctrlKey && shiftKey) { // Ctrl+Shift+Ins\n\t this._onInsertAfter();\n\t handled = true;\n\t }\n\t }\n\t else if (keynum == 35) { // End\n\t if (altKey) { // Alt+End\n\t // find the last node\n\t var endNode = this._lastNode();\n\t if (endNode) {\n\t endNode.focus(Node.focusElement || this._getElementName(target));\n\t }\n\t handled = true;\n\t }\n\t }\n\t else if (keynum == 36) { // Home\n\t if (altKey) { // Alt+Home\n\t // find the first node\n\t var homeNode = this._firstNode();\n\t if (homeNode) {\n\t homeNode.focus(Node.focusElement || this._getElementName(target));\n\t }\n\t handled = true;\n\t }\n\t }\n\t else if (keynum == 37) { // Arrow Left\n\t if (altKey && !shiftKey) { // Alt + Arrow Left\n\t // move to left element\n\t var prevElement = this._previousElement(target);\n\t if (prevElement) {\n\t this.focus(this._getElementName(prevElement));\n\t }\n\t handled = true;\n\t }\n\t else if (altKey && shiftKey && editable) { // Alt + Shift + Arrow left\n\t if (lastNode.expanded) {\n\t var appendDom = lastNode.getAppend();\n\t nextDom = appendDom ? appendDom.nextSibling : undefined;\n\t }\n\t else {\n\t var dom = lastNode.getDom();\n\t nextDom = dom.nextSibling;\n\t }\n\t if (nextDom) {\n\t nextNode = Node.getNodeFromTarget(nextDom);\n\t nextDom2 = nextDom.nextSibling;\n\t nextNode2 = Node.getNodeFromTarget(nextDom2);\n\t if (nextNode && nextNode instanceof AppendNode &&\n\t !(lastNode.parent.childs.length == 1) &&\n\t nextNode2 && nextNode2.parent) {\n\t oldSelection = this.editor.getSelection();\n\t oldBeforeNode = lastNode._nextSibling();\n\n\t selectedNodes.forEach(function (node) {\n\t nextNode2.parent.moveBefore(node, nextNode2);\n\t });\n\t this.focus(Node.focusElement || this._getElementName(target));\n\n\t this.editor._onAction('moveNodes', {\n\t nodes: selectedNodes,\n\t oldBeforeNode: oldBeforeNode,\n\t newBeforeNode: nextNode2,\n\t oldSelection: oldSelection,\n\t newSelection: this.editor.getSelection()\n\t });\n\t }\n\t }\n\t }\n\t }\n\t else if (keynum == 38) { // Arrow Up\n\t if (altKey && !shiftKey) { // Alt + Arrow Up\n\t // find the previous node\n\t prevNode = this._previousNode();\n\t if (prevNode) {\n\t this.editor.deselect(true);\n\t prevNode.focus(Node.focusElement || this._getElementName(target));\n\t }\n\t handled = true;\n\t }\n\t else if (!altKey && ctrlKey && shiftKey && editable) { // Ctrl + Shift + Arrow Up\n\t // select multiple nodes\n\t prevNode = this._previousNode();\n\t if (prevNode) {\n\t multiselection = this.editor.multiselection;\n\t multiselection.start = multiselection.start || this;\n\t multiselection.end = prevNode;\n\t nodes = this.editor._findTopLevelNodes(multiselection.start, multiselection.end);\n\n\t this.editor.select(nodes);\n\t prevNode.focus('field'); // select field as we know this always exists\n\t }\n\t handled = true;\n\t }\n\t else if (altKey && shiftKey && editable) { // Alt + Shift + Arrow Up\n\t // find the previous node\n\t prevNode = firstNode._previousNode();\n\t if (prevNode && prevNode.parent) {\n\t oldSelection = this.editor.getSelection();\n\t oldBeforeNode = lastNode._nextSibling();\n\n\t selectedNodes.forEach(function (node) {\n\t prevNode.parent.moveBefore(node, prevNode);\n\t });\n\t this.focus(Node.focusElement || this._getElementName(target));\n\n\t this.editor._onAction('moveNodes', {\n\t nodes: selectedNodes,\n\t oldBeforeNode: oldBeforeNode,\n\t newBeforeNode: prevNode,\n\t oldSelection: oldSelection,\n\t newSelection: this.editor.getSelection()\n\t });\n\t }\n\t handled = true;\n\t }\n\t }\n\t else if (keynum == 39) { // Arrow Right\n\t if (altKey && !shiftKey) { // Alt + Arrow Right\n\t // move to right element\n\t var nextElement = this._nextElement(target);\n\t if (nextElement) {\n\t this.focus(this._getElementName(nextElement));\n\t }\n\t handled = true;\n\t }\n\t else if (altKey && shiftKey && editable) { // Alt + Shift + Arrow Right\n\t dom = firstNode.getDom();\n\t var prevDom = dom.previousSibling;\n\t if (prevDom) {\n\t prevNode = Node.getNodeFromTarget(prevDom);\n\t if (prevNode && prevNode.parent &&\n\t (prevNode instanceof AppendNode)\n\t && !prevNode.isVisible()) {\n\t oldSelection = this.editor.getSelection();\n\t oldBeforeNode = lastNode._nextSibling();\n\n\t selectedNodes.forEach(function (node) {\n\t prevNode.parent.moveBefore(node, prevNode);\n\t });\n\t this.focus(Node.focusElement || this._getElementName(target));\n\n\t this.editor._onAction('moveNodes', {\n\t nodes: selectedNodes,\n\t oldBeforeNode: oldBeforeNode,\n\t newBeforeNode: prevNode,\n\t oldSelection: oldSelection,\n\t newSelection: this.editor.getSelection()\n\t });\n\t }\n\t }\n\t }\n\t }\n\t else if (keynum == 40) { // Arrow Down\n\t if (altKey && !shiftKey) { // Alt + Arrow Down\n\t // find the next node\n\t nextNode = this._nextNode();\n\t if (nextNode) {\n\t this.editor.deselect(true);\n\t nextNode.focus(Node.focusElement || this._getElementName(target));\n\t }\n\t handled = true;\n\t }\n\t else if (!altKey && ctrlKey && shiftKey && editable) { // Ctrl + Shift + Arrow Down\n\t // select multiple nodes\n\t nextNode = this._nextNode();\n\t if (nextNode) {\n\t multiselection = this.editor.multiselection;\n\t multiselection.start = multiselection.start || this;\n\t multiselection.end = nextNode;\n\t nodes = this.editor._findTopLevelNodes(multiselection.start, multiselection.end);\n\n\t this.editor.select(nodes);\n\t nextNode.focus('field'); // select field as we know this always exists\n\t }\n\t handled = true;\n\t }\n\t else if (altKey && shiftKey && editable) { // Alt + Shift + Arrow Down\n\t // find the 2nd next node and move before that one\n\t if (lastNode.expanded) {\n\t nextNode = lastNode.append ? lastNode.append._nextNode() : undefined;\n\t }\n\t else {\n\t nextNode = lastNode._nextNode();\n\t }\n\t var nextNode2 = nextNode && (nextNode._nextNode() || nextNode.parent.append);\n\t if (nextNode2 && nextNode2.parent) {\n\t oldSelection = this.editor.getSelection();\n\t oldBeforeNode = lastNode._nextSibling();\n\n\t selectedNodes.forEach(function (node) {\n\t nextNode2.parent.moveBefore(node, nextNode2);\n\t });\n\t this.focus(Node.focusElement || this._getElementName(target));\n\n\t this.editor._onAction('moveNodes', {\n\t nodes: selectedNodes,\n\t oldBeforeNode: oldBeforeNode,\n\t newBeforeNode: nextNode2,\n\t oldSelection: oldSelection,\n\t newSelection: this.editor.getSelection()\n\t });\n\t }\n\t handled = true;\n\t }\n\t }\n\n\t if (handled) {\n\t event.preventDefault();\n\t event.stopPropagation();\n\t }\n\t};\n\n\t/**\n\t * Handle the expand event, when clicked on the expand button\n\t * @param {boolean} recurse If true, child nodes will be expanded too\n\t * @private\n\t */\n\tNode.prototype._onExpand = function (recurse) {\n\t if (recurse) {\n\t // Take the table offline\n\t var table = this.dom.tr.parentNode; // TODO: not nice to access the main table like this\n\t var frame = table.parentNode;\n\t var scrollTop = frame.scrollTop;\n\t frame.removeChild(table);\n\t }\n\n\t if (this.expanded) {\n\t this.collapse(recurse);\n\t }\n\t else {\n\t this.expand(recurse);\n\t }\n\n\t if (recurse) {\n\t // Put the table online again\n\t frame.appendChild(table);\n\t frame.scrollTop = scrollTop;\n\t }\n\t};\n\n\t/**\n\t * Remove nodes\n\t * @param {Node[] | Node} nodes\n\t */\n\tNode.onRemove = function(nodes) {\n\t if (!Array.isArray(nodes)) {\n\t return Node.onRemove([nodes]);\n\t }\n\n\t if (nodes && nodes.length > 0) {\n\t var firstNode = nodes[0];\n\t var parent = firstNode.parent;\n\t var editor = firstNode.editor;\n\t var firstIndex = firstNode.getIndex();\n\t editor.highlighter.unhighlight();\n\n\t // adjust the focus\n\t var oldSelection = editor.getSelection();\n\t Node.blurNodes(nodes);\n\t var newSelection = editor.getSelection();\n\n\t // remove the nodes\n\t nodes.forEach(function (node) {\n\t node.parent._remove(node);\n\t });\n\n\t // store history action\n\t editor._onAction('removeNodes', {\n\t nodes: nodes.slice(0), // store a copy of the array!\n\t parent: parent,\n\t index: firstIndex,\n\t oldSelection: oldSelection,\n\t newSelection: newSelection\n\t });\n\t }\n\t};\n\n\n\t/**\n\t * Duplicate nodes\n\t * duplicated nodes will be added right after the original nodes\n\t * @param {Node[] | Node} nodes\n\t */\n\tNode.onDuplicate = function(nodes) {\n\t if (!Array.isArray(nodes)) {\n\t return Node.onDuplicate([nodes]);\n\t }\n\n\t if (nodes && nodes.length > 0) {\n\t var lastNode = nodes[nodes.length - 1];\n\t var parent = lastNode.parent;\n\t var editor = lastNode.editor;\n\n\t editor.deselect(editor.multiselection.nodes);\n\n\t // duplicate the nodes\n\t var oldSelection = editor.getSelection();\n\t var afterNode = lastNode;\n\t var clones = nodes.map(function (node) {\n\t var clone = node.clone();\n\t parent.insertAfter(clone, afterNode);\n\t afterNode = clone;\n\t return clone;\n\t });\n\n\t // set selection to the duplicated nodes\n\t if (nodes.length === 1) {\n\t clones[0].focus();\n\t }\n\t else {\n\t editor.select(clones);\n\t }\n\t var newSelection = editor.getSelection();\n\n\t editor._onAction('duplicateNodes', {\n\t afterNode: lastNode,\n\t nodes: clones,\n\t parent: parent,\n\t oldSelection: oldSelection,\n\t newSelection: newSelection\n\t });\n\t }\n\t};\n\n\t/**\n\t * Handle insert before event\n\t * @param {String} [field]\n\t * @param {*} [value]\n\t * @param {String} [type] Can be 'auto', 'array', 'object', or 'string'\n\t * @private\n\t */\n\tNode.prototype._onInsertBefore = function (field, value, type) {\n\t var oldSelection = this.editor.getSelection();\n\n\t var newNode = new Node(this.editor, {\n\t field: (field != undefined) ? field : '',\n\t value: (value != undefined) ? value : '',\n\t type: type\n\t });\n\t newNode.expand(true);\n\t this.parent.insertBefore(newNode, this);\n\t this.editor.highlighter.unhighlight();\n\t newNode.focus('field');\n\t var newSelection = this.editor.getSelection();\n\n\t this.editor._onAction('insertBeforeNodes', {\n\t nodes: [newNode],\n\t beforeNode: this,\n\t parent: this.parent,\n\t oldSelection: oldSelection,\n\t newSelection: newSelection\n\t });\n\t};\n\n\t/**\n\t * Handle insert after event\n\t * @param {String} [field]\n\t * @param {*} [value]\n\t * @param {String} [type] Can be 'auto', 'array', 'object', or 'string'\n\t * @private\n\t */\n\tNode.prototype._onInsertAfter = function (field, value, type) {\n\t var oldSelection = this.editor.getSelection();\n\n\t var newNode = new Node(this.editor, {\n\t field: (field != undefined) ? field : '',\n\t value: (value != undefined) ? value : '',\n\t type: type\n\t });\n\t newNode.expand(true);\n\t this.parent.insertAfter(newNode, this);\n\t this.editor.highlighter.unhighlight();\n\t newNode.focus('field');\n\t var newSelection = this.editor.getSelection();\n\n\t this.editor._onAction('insertAfterNodes', {\n\t nodes: [newNode],\n\t afterNode: this,\n\t parent: this.parent,\n\t oldSelection: oldSelection,\n\t newSelection: newSelection\n\t });\n\t};\n\n\t/**\n\t * Handle append event\n\t * @param {String} [field]\n\t * @param {*} [value]\n\t * @param {String} [type] Can be 'auto', 'array', 'object', or 'string'\n\t * @private\n\t */\n\tNode.prototype._onAppend = function (field, value, type) {\n\t var oldSelection = this.editor.getSelection();\n\n\t var newNode = new Node(this.editor, {\n\t field: (field != undefined) ? field : '',\n\t value: (value != undefined) ? value : '',\n\t type: type\n\t });\n\t newNode.expand(true);\n\t this.parent.appendChild(newNode);\n\t this.editor.highlighter.unhighlight();\n\t newNode.focus('field');\n\t var newSelection = this.editor.getSelection();\n\n\t this.editor._onAction('appendNodes', {\n\t nodes: [newNode],\n\t parent: this.parent,\n\t oldSelection: oldSelection,\n\t newSelection: newSelection\n\t });\n\t};\n\n\t/**\n\t * Change the type of the node's value\n\t * @param {String} newType\n\t * @private\n\t */\n\tNode.prototype._onChangeType = function (newType) {\n\t var oldType = this.type;\n\t if (newType != oldType) {\n\t var oldSelection = this.editor.getSelection();\n\t this.changeType(newType);\n\t var newSelection = this.editor.getSelection();\n\n\t this.editor._onAction('changeType', {\n\t node: this,\n\t oldType: oldType,\n\t newType: newType,\n\t oldSelection: oldSelection,\n\t newSelection: newSelection\n\t });\n\t }\n\t};\n\n\t/**\n\t * Sort the child's of the node. Only applicable when the node has type 'object'\n\t * or 'array'.\n\t * @param {String} direction Sorting direction. Available values: \"asc\", \"desc\"\n\t * @private\n\t */\n\tNode.prototype.sort = function (direction) {\n\t if (!this._hasChilds()) {\n\t return;\n\t }\n\n\t var order = (direction == 'desc') ? -1 : 1;\n\t var prop = (this.type == 'array') ? 'value': 'field';\n\t this.hideChilds();\n\n\t var oldChilds = this.childs;\n\t var oldSortOrder = this.sortOrder;\n\n\t // copy the array (the old one will be kept for an undo action\n\t this.childs = this.childs.concat();\n\n\t // sort the arrays\n\t this.childs.sort(function (a, b) {\n\t return order * naturalSort(a[prop], b[prop]);\n\t });\n\t this.sortOrder = (order == 1) ? 'asc' : 'desc';\n\n\t this.editor._onAction('sort', {\n\t node: this,\n\t oldChilds: oldChilds,\n\t oldSort: oldSortOrder,\n\t newChilds: this.childs,\n\t newSort: this.sortOrder\n\t });\n\n\t this.showChilds();\n\t};\n\n\t/**\n\t * Create a table row with an append button.\n\t * @return {HTMLElement | undefined} buttonAppend or undefined when inapplicable\n\t */\n\tNode.prototype.getAppend = function () {\n\t if (!this.append) {\n\t this.append = new AppendNode(this.editor);\n\t this.append.setParent(this);\n\t }\n\t return this.append.getDom();\n\t};\n\n\t/**\n\t * Find the node from an event target\n\t * @param {Node} target\n\t * @return {Node | undefined} node or undefined when not found\n\t * @static\n\t */\n\tNode.getNodeFromTarget = function (target) {\n\t while (target) {\n\t if (target.node) {\n\t return target.node;\n\t }\n\t target = target.parentNode;\n\t }\n\n\t return undefined;\n\t};\n\n\t/**\n\t * Remove the focus of given nodes, and move the focus to the (a) node before,\n\t * (b) the node after, or (c) the parent node.\n\t * @param {Array. | Node} nodes\n\t */\n\tNode.blurNodes = function (nodes) {\n\t if (!Array.isArray(nodes)) {\n\t Node.blurNodes([nodes]);\n\t return;\n\t }\n\n\t var firstNode = nodes[0];\n\t var parent = firstNode.parent;\n\t var firstIndex = firstNode.getIndex();\n\n\t if (parent.childs[firstIndex + nodes.length]) {\n\t parent.childs[firstIndex + nodes.length].focus();\n\t }\n\t else if (parent.childs[firstIndex - 1]) {\n\t parent.childs[firstIndex - 1].focus();\n\t }\n\t else {\n\t parent.focus();\n\t }\n\t};\n\n\t/**\n\t * Get the next sibling of current node\n\t * @return {Node} nextSibling\n\t * @private\n\t */\n\tNode.prototype._nextSibling = function () {\n\t var index = this.parent.childs.indexOf(this);\n\t return this.parent.childs[index + 1] || this.parent.append;\n\t};\n\n\t/**\n\t * Get the previously rendered node\n\t * @return {Node | null} previousNode\n\t * @private\n\t */\n\tNode.prototype._previousNode = function () {\n\t var prevNode = null;\n\t var dom = this.getDom();\n\t if (dom && dom.parentNode) {\n\t // find the previous field\n\t var prevDom = dom;\n\t do {\n\t prevDom = prevDom.previousSibling;\n\t prevNode = Node.getNodeFromTarget(prevDom);\n\t }\n\t while (prevDom && (prevNode instanceof AppendNode && !prevNode.isVisible()));\n\t }\n\t return prevNode;\n\t};\n\n\t/**\n\t * Get the next rendered node\n\t * @return {Node | null} nextNode\n\t * @private\n\t */\n\tNode.prototype._nextNode = function () {\n\t var nextNode = null;\n\t var dom = this.getDom();\n\t if (dom && dom.parentNode) {\n\t // find the previous field\n\t var nextDom = dom;\n\t do {\n\t nextDom = nextDom.nextSibling;\n\t nextNode = Node.getNodeFromTarget(nextDom);\n\t }\n\t while (nextDom && (nextNode instanceof AppendNode && !nextNode.isVisible()));\n\t }\n\n\t return nextNode;\n\t};\n\n\t/**\n\t * Get the first rendered node\n\t * @return {Node | null} firstNode\n\t * @private\n\t */\n\tNode.prototype._firstNode = function () {\n\t var firstNode = null;\n\t var dom = this.getDom();\n\t if (dom && dom.parentNode) {\n\t var firstDom = dom.parentNode.firstChild;\n\t firstNode = Node.getNodeFromTarget(firstDom);\n\t }\n\n\t return firstNode;\n\t};\n\n\t/**\n\t * Get the last rendered node\n\t * @return {Node | null} lastNode\n\t * @private\n\t */\n\tNode.prototype._lastNode = function () {\n\t var lastNode = null;\n\t var dom = this.getDom();\n\t if (dom && dom.parentNode) {\n\t var lastDom = dom.parentNode.lastChild;\n\t lastNode = Node.getNodeFromTarget(lastDom);\n\t while (lastDom && (lastNode instanceof AppendNode && !lastNode.isVisible())) {\n\t lastDom = lastDom.previousSibling;\n\t lastNode = Node.getNodeFromTarget(lastDom);\n\t }\n\t }\n\t return lastNode;\n\t};\n\n\t/**\n\t * Get the next element which can have focus.\n\t * @param {Element} elem\n\t * @return {Element | null} nextElem\n\t * @private\n\t */\n\tNode.prototype._previousElement = function (elem) {\n\t var dom = this.dom;\n\t // noinspection FallthroughInSwitchStatementJS\n\t switch (elem) {\n\t case dom.value:\n\t if (this.fieldEditable) {\n\t return dom.field;\n\t }\n\t // intentional fall through\n\t case dom.field:\n\t if (this._hasChilds()) {\n\t return dom.expand;\n\t }\n\t // intentional fall through\n\t case dom.expand:\n\t return dom.menu;\n\t case dom.menu:\n\t if (dom.drag) {\n\t return dom.drag;\n\t }\n\t // intentional fall through\n\t default:\n\t return null;\n\t }\n\t};\n\n\t/**\n\t * Get the next element which can have focus.\n\t * @param {Element} elem\n\t * @return {Element | null} nextElem\n\t * @private\n\t */\n\tNode.prototype._nextElement = function (elem) {\n\t var dom = this.dom;\n\t // noinspection FallthroughInSwitchStatementJS\n\t switch (elem) {\n\t case dom.drag:\n\t return dom.menu;\n\t case dom.menu:\n\t if (this._hasChilds()) {\n\t return dom.expand;\n\t }\n\t // intentional fall through\n\t case dom.expand:\n\t if (this.fieldEditable) {\n\t return dom.field;\n\t }\n\t // intentional fall through\n\t case dom.field:\n\t if (!this._hasChilds()) {\n\t return dom.value;\n\t }\n\t default:\n\t return null;\n\t }\n\t};\n\n\t/**\n\t * Get the dom name of given element. returns null if not found.\n\t * For example when element == dom.field, \"field\" is returned.\n\t * @param {Element} element\n\t * @return {String | null} elementName Available elements with name: 'drag',\n\t * 'menu', 'expand', 'field', 'value'\n\t * @private\n\t */\n\tNode.prototype._getElementName = function (element) {\n\t var dom = this.dom;\n\t for (var name in dom) {\n\t if (dom.hasOwnProperty(name)) {\n\t if (dom[name] == element) {\n\t return name;\n\t }\n\t }\n\t }\n\t return null;\n\t};\n\n\t/**\n\t * Test if this node has childs. This is the case when the node is an object\n\t * or array.\n\t * @return {boolean} hasChilds\n\t * @private\n\t */\n\tNode.prototype._hasChilds = function () {\n\t return this.type == 'array' || this.type == 'object';\n\t};\n\n\t// titles with explanation for the different types\n\tNode.TYPE_TITLES = {\n\t 'auto': 'Field type \"auto\". ' +\n\t 'The field type is automatically determined from the value ' +\n\t 'and can be a string, number, boolean, or null.',\n\t 'object': 'Field type \"object\". ' +\n\t 'An object contains an unordered set of key/value pairs.',\n\t 'array': 'Field type \"array\". ' +\n\t 'An array contains an ordered collection of values.',\n\t 'string': 'Field type \"string\". ' +\n\t 'Field type is not determined from the value, ' +\n\t 'but always returned as string.'\n\t};\n\n\t/**\n\t * Show a contextmenu for this node\n\t * @param {HTMLElement} anchor Anchor element to attach the context menu to\n\t * as sibling.\n\t * @param {function} [onClose] Callback method called when the context menu\n\t * is being closed.\n\t */\n\tNode.prototype.showContextMenu = function (anchor, onClose) {\n\t var node = this;\n\t var titles = Node.TYPE_TITLES;\n\t var items = [];\n\n\t if (this.editable.value) {\n\t items.push({\n\t text: 'Type',\n\t title: 'Change the type of this field',\n\t className: 'jsoneditor-type-' + this.type,\n\t submenu: [\n\t {\n\t text: 'Auto',\n\t className: 'jsoneditor-type-auto' +\n\t (this.type == 'auto' ? ' jsoneditor-selected' : ''),\n\t title: titles.auto,\n\t click: function () {\n\t node._onChangeType('auto');\n\t }\n\t },\n\t {\n\t text: 'Array',\n\t className: 'jsoneditor-type-array' +\n\t (this.type == 'array' ? ' jsoneditor-selected' : ''),\n\t title: titles.array,\n\t click: function () {\n\t node._onChangeType('array');\n\t }\n\t },\n\t {\n\t text: 'Object',\n\t className: 'jsoneditor-type-object' +\n\t (this.type == 'object' ? ' jsoneditor-selected' : ''),\n\t title: titles.object,\n\t click: function () {\n\t node._onChangeType('object');\n\t }\n\t },\n\t {\n\t text: 'String',\n\t className: 'jsoneditor-type-string' +\n\t (this.type == 'string' ? ' jsoneditor-selected' : ''),\n\t title: titles.string,\n\t click: function () {\n\t node._onChangeType('string');\n\t }\n\t }\n\t ]\n\t });\n\t }\n\n\t if (this._hasChilds()) {\n\t var direction = ((this.sortOrder == 'asc') ? 'desc': 'asc');\n\t items.push({\n\t text: 'Sort',\n\t title: 'Sort the childs of this ' + this.type,\n\t className: 'jsoneditor-sort-' + direction,\n\t click: function () {\n\t node.sort(direction);\n\t },\n\t submenu: [\n\t {\n\t text: 'Ascending',\n\t className: 'jsoneditor-sort-asc',\n\t title: 'Sort the childs of this ' + this.type + ' in ascending order',\n\t click: function () {\n\t node.sort('asc');\n\t }\n\t },\n\t {\n\t text: 'Descending',\n\t className: 'jsoneditor-sort-desc',\n\t title: 'Sort the childs of this ' + this.type +' in descending order',\n\t click: function () {\n\t node.sort('desc');\n\t }\n\t }\n\t ]\n\t });\n\t }\n\n\t if (this.parent && this.parent._hasChilds()) {\n\t if (items.length) {\n\t // create a separator\n\t items.push({\n\t 'type': 'separator'\n\t });\n\t }\n\n\t // create append button (for last child node only)\n\t var childs = node.parent.childs;\n\t if (node == childs[childs.length - 1]) {\n\t items.push({\n\t text: 'Append',\n\t title: 'Append a new field with type \\'auto\\' after this field (Ctrl+Shift+Ins)',\n\t submenuTitle: 'Select the type of the field to be appended',\n\t className: 'jsoneditor-append',\n\t click: function () {\n\t node._onAppend('', '', 'auto');\n\t },\n\t submenu: [\n\t {\n\t text: 'Auto',\n\t className: 'jsoneditor-type-auto',\n\t title: titles.auto,\n\t click: function () {\n\t node._onAppend('', '', 'auto');\n\t }\n\t },\n\t {\n\t text: 'Array',\n\t className: 'jsoneditor-type-array',\n\t title: titles.array,\n\t click: function () {\n\t node._onAppend('', []);\n\t }\n\t },\n\t {\n\t text: 'Object',\n\t className: 'jsoneditor-type-object',\n\t title: titles.object,\n\t click: function () {\n\t node._onAppend('', {});\n\t }\n\t },\n\t {\n\t text: 'String',\n\t className: 'jsoneditor-type-string',\n\t title: titles.string,\n\t click: function () {\n\t node._onAppend('', '', 'string');\n\t }\n\t }\n\t ]\n\t });\n\t }\n\n\t // create insert button\n\t items.push({\n\t text: 'Insert',\n\t title: 'Insert a new field with type \\'auto\\' before this field (Ctrl+Ins)',\n\t submenuTitle: 'Select the type of the field to be inserted',\n\t className: 'jsoneditor-insert',\n\t click: function () {\n\t node._onInsertBefore('', '', 'auto');\n\t },\n\t submenu: [\n\t {\n\t text: 'Auto',\n\t className: 'jsoneditor-type-auto',\n\t title: titles.auto,\n\t click: function () {\n\t node._onInsertBefore('', '', 'auto');\n\t }\n\t },\n\t {\n\t text: 'Array',\n\t className: 'jsoneditor-type-array',\n\t title: titles.array,\n\t click: function () {\n\t node._onInsertBefore('', []);\n\t }\n\t },\n\t {\n\t text: 'Object',\n\t className: 'jsoneditor-type-object',\n\t title: titles.object,\n\t click: function () {\n\t node._onInsertBefore('', {});\n\t }\n\t },\n\t {\n\t text: 'String',\n\t className: 'jsoneditor-type-string',\n\t title: titles.string,\n\t click: function () {\n\t node._onInsertBefore('', '', 'string');\n\t }\n\t }\n\t ]\n\t });\n\n\t if (this.editable.field) {\n\t // create duplicate button\n\t items.push({\n\t text: 'Duplicate',\n\t title: 'Duplicate this field (Ctrl+D)',\n\t className: 'jsoneditor-duplicate',\n\t click: function () {\n\t Node.onDuplicate(node);\n\t }\n\t });\n\n\t // create remove button\n\t items.push({\n\t text: 'Remove',\n\t title: 'Remove this field (Ctrl+Del)',\n\t className: 'jsoneditor-remove',\n\t click: function () {\n\t Node.onRemove(node);\n\t }\n\t });\n\t }\n\t }\n\n\t var menu = new ContextMenu(items, {close: onClose});\n\t menu.show(anchor, this.editor.content);\n\t};\n\n\t/**\n\t * get the type of a value\n\t * @param {*} value\n\t * @return {String} type Can be 'object', 'array', 'string', 'auto'\n\t * @private\n\t */\n\tNode.prototype._getType = function(value) {\n\t if (value instanceof Array) {\n\t return 'array';\n\t }\n\t if (value instanceof Object) {\n\t return 'object';\n\t }\n\t if (typeof(value) == 'string' && typeof(this._stringCast(value)) != 'string') {\n\t return 'string';\n\t }\n\n\t return 'auto';\n\t};\n\n\t/**\n\t * cast contents of a string to the correct type. This can be a string,\n\t * a number, a boolean, etc\n\t * @param {String} str\n\t * @return {*} castedStr\n\t * @private\n\t */\n\tNode.prototype._stringCast = function(str) {\n\t var lower = str.toLowerCase(),\n\t num = Number(str), // will nicely fail with '123ab'\n\t numFloat = parseFloat(str); // will nicely fail with ' '\n\n\t if (str == '') {\n\t return '';\n\t }\n\t else if (lower == 'null') {\n\t return null;\n\t }\n\t else if (lower == 'true') {\n\t return true;\n\t }\n\t else if (lower == 'false') {\n\t return false;\n\t }\n\t else if (!isNaN(num) && !isNaN(numFloat)) {\n\t return num;\n\t }\n\t else {\n\t return str;\n\t }\n\t};\n\n\t/**\n\t * escape a text, such that it can be displayed safely in an HTML element\n\t * @param {String} text\n\t * @return {String} escapedText\n\t * @private\n\t */\n\tNode.prototype._escapeHTML = function (text) {\n\t if (typeof text !== 'string') {\n\t return String(text);\n\t }\n\t else {\n\t var htmlEscaped = String(text)\n\t .replace(/&/g, '&') // must be replaced first!\n\t .replace(//g, '>')\n\t .replace(/ /g, '  ') // replace double space with an nbsp and space\n\t .replace(/^ /, ' ') // space at start\n\t .replace(/ $/, ' '); // space at end\n\n\t var json = JSON.stringify(htmlEscaped);\n\t var html = json.substring(1, json.length - 1);\n\t if (this.editor.options.escapeUnicode === true) {\n\t html = util.escapeUnicodeChars(html);\n\t }\n\t return html;\n\t }\n\t};\n\n\t/**\n\t * unescape a string.\n\t * @param {String} escapedText\n\t * @return {String} text\n\t * @private\n\t */\n\tNode.prototype._unescapeHTML = function (escapedText) {\n\t var json = '\"' + this._escapeJSON(escapedText) + '\"';\n\t var htmlEscaped = util.parse(json);\n\n\t return htmlEscaped\n\t .replace(/</g, '<')\n\t .replace(/>/g, '>')\n\t .replace(/ |\\u00A0/g, ' ')\n\t .replace(/&/g, '&'); // must be replaced last\n\t};\n\n\t/**\n\t * escape a text to make it a valid JSON string. The method will:\n\t * - replace unescaped double quotes with '\\\"'\n\t * - replace unescaped backslash with '\\\\'\n\t * - replace returns with '\\n'\n\t * @param {String} text\n\t * @return {String} escapedText\n\t * @private\n\t */\n\tNode.prototype._escapeJSON = function (text) {\n\t // TODO: replace with some smart regex (only when a new solution is faster!)\n\t var escaped = '';\n\t var i = 0;\n\t while (i < text.length) {\n\t var c = text.charAt(i);\n\t if (c == '\\n') {\n\t escaped += '\\\\n';\n\t }\n\t else if (c == '\\\\') {\n\t escaped += c;\n\t i++;\n\n\t c = text.charAt(i);\n\t if (c === '' || '\"\\\\/bfnrtu'.indexOf(c) == -1) {\n\t escaped += '\\\\'; // no valid escape character\n\t }\n\t escaped += c;\n\t }\n\t else if (c == '\"') {\n\t escaped += '\\\\\"';\n\t }\n\t else {\n\t escaped += c;\n\t }\n\t i++;\n\t }\n\n\t return escaped;\n\t};\n\n\t// TODO: find a nicer solution to resolve this circular dependency between Node and AppendNode\n\tvar AppendNode = appendNodeFactory(Node);\n\n\tmodule.exports = Node;\n\n\n/***/ },\n/* 9 */\n/***/ function(module, exports) {\n\n\t/*\n\t * Natural Sort algorithm for Javascript - Version 0.7 - Released under MIT license\n\t * Author: Jim Palmer (based on chunking idea from Dave Koelle)\n\t */\n\t/*jshint unused:false */\n\tmodule.exports = function naturalSort (a, b) {\n\t\t\"use strict\";\n\t\tvar re = /(^([+\\-]?(?:0|[1-9]\\d*)(?:\\.\\d*)?(?:[eE][+\\-]?\\d+)?)?$|^0x[0-9a-f]+$|\\d+)/gi,\n\t\t\tsre = /(^[ ]*|[ ]*$)/g,\n\t\t\tdre = /(^([\\w ]+,?[\\w ]+)?[\\w ]+,?[\\w ]+\\d+:\\d+(:\\d+)?[\\w ]?|^\\d{1,4}[\\/\\-]\\d{1,4}[\\/\\-]\\d{1,4}|^\\w+, \\w+ \\d+, \\d{4})/,\n\t\t\thre = /^0x[0-9a-f]+$/i,\n\t\t\tore = /^0/,\n\t\t\ti = function(s) { return naturalSort.insensitive && ('' + s).toLowerCase() || '' + s; },\n\t\t\t// convert all to strings strip whitespace\n\t\t\tx = i(a).replace(sre, '') || '',\n\t\t\ty = i(b).replace(sre, '') || '',\n\t\t\t// chunk/tokenize\n\t\t\txN = x.replace(re, '\\0$1\\0').replace(/\\0$/,'').replace(/^\\0/,'').split('\\0'),\n\t\t\tyN = y.replace(re, '\\0$1\\0').replace(/\\0$/,'').replace(/^\\0/,'').split('\\0'),\n\t\t\t// numeric, hex or date detection\n\t\t\txD = parseInt(x.match(hre), 16) || (xN.length !== 1 && x.match(dre) && Date.parse(x)),\n\t\t\tyD = parseInt(y.match(hre), 16) || xD && y.match(dre) && Date.parse(y) || null,\n\t\t\toFxNcL, oFyNcL;\n\t\t// first try and sort Hex codes or Dates\n\t\tif (yD) {\n\t\t\tif ( xD < yD ) { return -1; }\n\t\t\telse if ( xD > yD ) { return 1; }\n\t\t}\n\t\t// natural sorting through split numeric strings and default strings\n\t\tfor(var cLoc=0, numS=Math.max(xN.length, yN.length); cLoc < numS; cLoc++) {\n\t\t\t// find floats not starting with '0', string or 0 if not defined (Clint Priest)\n\t\t\toFxNcL = !(xN[cLoc] || '').match(ore) && parseFloat(xN[cLoc]) || xN[cLoc] || 0;\n\t\t\toFyNcL = !(yN[cLoc] || '').match(ore) && parseFloat(yN[cLoc]) || yN[cLoc] || 0;\n\t\t\t// handle numeric vs string comparison - number < string - (Kyle Adams)\n\t\t\tif (isNaN(oFxNcL) !== isNaN(oFyNcL)) { return (isNaN(oFxNcL)) ? 1 : -1; }\n\t\t\t// rely on string comparison if different types - i.e. '02' < 2 != '02' < '2'\n\t\t\telse if (typeof oFxNcL !== typeof oFyNcL) {\n\t\t\t\toFxNcL += '';\n\t\t\t\toFyNcL += '';\n\t\t\t}\n\t\t\tif (oFxNcL < oFyNcL) { return -1; }\n\t\t\tif (oFxNcL > oFyNcL) { return 1; }\n\t\t}\n\t\treturn 0;\n\t};\n\n\n/***/ },\n/* 10 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar util = __webpack_require__(4);\n\tvar ContextMenu = __webpack_require__(7);\n\n\t/**\n\t * A factory function to create an AppendNode, which depends on a Node\n\t * @param {Node} Node\n\t */\n\tfunction appendNodeFactory(Node) {\n\t /**\n\t * @constructor AppendNode\n\t * @extends Node\n\t * @param {TreeEditor} editor\n\t * Create a new AppendNode. This is a special node which is created at the\n\t * end of the list with childs for an object or array\n\t */\n\t function AppendNode (editor) {\n\t /** @type {TreeEditor} */\n\t this.editor = editor;\n\t this.dom = {};\n\t }\n\n\t AppendNode.prototype = new Node();\n\n\t /**\n\t * Return a table row with an append button.\n\t * @return {Element} dom TR element\n\t */\n\t AppendNode.prototype.getDom = function () {\n\t // TODO: implement a new solution for the append node\n\t var dom = this.dom;\n\n\t if (dom.tr) {\n\t return dom.tr;\n\t }\n\n\t this._updateEditability();\n\n\t // a row for the append button\n\t var trAppend = document.createElement('tr');\n\t trAppend.node = this;\n\t dom.tr = trAppend;\n\n\t // TODO: consistent naming\n\n\t if (this.editor.options.mode === 'tree') {\n\t // a cell for the dragarea column\n\t dom.tdDrag = document.createElement('td');\n\n\t // create context menu\n\t var tdMenu = document.createElement('td');\n\t dom.tdMenu = tdMenu;\n\t var menu = document.createElement('button');\n\t menu.type = 'button';\n\t menu.className = 'jsoneditor-contextmenu';\n\t menu.title = 'Click to open the actions menu (Ctrl+M)';\n\t dom.menu = menu;\n\t tdMenu.appendChild(dom.menu);\n\t }\n\n\t // a cell for the contents (showing text 'empty')\n\t var tdAppend = document.createElement('td');\n\t var domText = document.createElement('div');\n\t domText.innerHTML = '(empty)';\n\t domText.className = 'jsoneditor-readonly';\n\t tdAppend.appendChild(domText);\n\t dom.td = tdAppend;\n\t dom.text = domText;\n\n\t this.updateDom();\n\n\t return trAppend;\n\t };\n\n\t /**\n\t * Update the HTML dom of the Node\n\t */\n\t AppendNode.prototype.updateDom = function () {\n\t var dom = this.dom;\n\t var tdAppend = dom.td;\n\t if (tdAppend) {\n\t tdAppend.style.paddingLeft = (this.getLevel() * 24 + 26) + 'px';\n\t // TODO: not so nice hard coded offset\n\t }\n\n\t var domText = dom.text;\n\t if (domText) {\n\t domText.innerHTML = '(empty ' + this.parent.type + ')';\n\t }\n\n\t // attach or detach the contents of the append node:\n\t // hide when the parent has childs, show when the parent has no childs\n\t var trAppend = dom.tr;\n\t if (!this.isVisible()) {\n\t if (dom.tr.firstChild) {\n\t if (dom.tdDrag) {\n\t trAppend.removeChild(dom.tdDrag);\n\t }\n\t if (dom.tdMenu) {\n\t trAppend.removeChild(dom.tdMenu);\n\t }\n\t trAppend.removeChild(tdAppend);\n\t }\n\t }\n\t else {\n\t if (!dom.tr.firstChild) {\n\t if (dom.tdDrag) {\n\t trAppend.appendChild(dom.tdDrag);\n\t }\n\t if (dom.tdMenu) {\n\t trAppend.appendChild(dom.tdMenu);\n\t }\n\t trAppend.appendChild(tdAppend);\n\t }\n\t }\n\t };\n\n\t /**\n\t * Check whether the AppendNode is currently visible.\n\t * the AppendNode is visible when its parent has no childs (i.e. is empty).\n\t * @return {boolean} isVisible\n\t */\n\t AppendNode.prototype.isVisible = function () {\n\t return (this.parent.childs.length == 0);\n\t };\n\n\t /**\n\t * Show a contextmenu for this node\n\t * @param {HTMLElement} anchor The element to attach the menu to.\n\t * @param {function} [onClose] Callback method called when the context menu\n\t * is being closed.\n\t */\n\t AppendNode.prototype.showContextMenu = function (anchor, onClose) {\n\t var node = this;\n\t var titles = Node.TYPE_TITLES;\n\t var items = [\n\t // create append button\n\t {\n\t 'text': 'Append',\n\t 'title': 'Append a new field with type \\'auto\\' (Ctrl+Shift+Ins)',\n\t 'submenuTitle': 'Select the type of the field to be appended',\n\t 'className': 'jsoneditor-insert',\n\t 'click': function () {\n\t node._onAppend('', '', 'auto');\n\t },\n\t 'submenu': [\n\t {\n\t 'text': 'Auto',\n\t 'className': 'jsoneditor-type-auto',\n\t 'title': titles.auto,\n\t 'click': function () {\n\t node._onAppend('', '', 'auto');\n\t }\n\t },\n\t {\n\t 'text': 'Array',\n\t 'className': 'jsoneditor-type-array',\n\t 'title': titles.array,\n\t 'click': function () {\n\t node._onAppend('', []);\n\t }\n\t },\n\t {\n\t 'text': 'Object',\n\t 'className': 'jsoneditor-type-object',\n\t 'title': titles.object,\n\t 'click': function () {\n\t node._onAppend('', {});\n\t }\n\t },\n\t {\n\t 'text': 'String',\n\t 'className': 'jsoneditor-type-string',\n\t 'title': titles.string,\n\t 'click': function () {\n\t node._onAppend('', '', 'string');\n\t }\n\t }\n\t ]\n\t }\n\t ];\n\n\t var menu = new ContextMenu(items, {close: onClose});\n\t menu.show(anchor, this.editor.content);\n\t };\n\n\t /**\n\t * Handle an event. The event is catched centrally by the editor\n\t * @param {Event} event\n\t */\n\t AppendNode.prototype.onEvent = function (event) {\n\t var type = event.type;\n\t var target = event.target || event.srcElement;\n\t var dom = this.dom;\n\n\t // highlight the append nodes parent\n\t var menu = dom.menu;\n\t if (target == menu) {\n\t if (type == 'mouseover') {\n\t this.editor.highlighter.highlight(this.parent);\n\t }\n\t else if (type == 'mouseout') {\n\t this.editor.highlighter.unhighlight();\n\t }\n\t }\n\n\t // context menu events\n\t if (type == 'click' && target == dom.menu) {\n\t var highlighter = this.editor.highlighter;\n\t highlighter.highlight(this.parent);\n\t highlighter.lock();\n\t util.addClassName(dom.menu, 'jsoneditor-selected');\n\t this.showContextMenu(dom.menu, function () {\n\t util.removeClassName(dom.menu, 'jsoneditor-selected');\n\t highlighter.unlock();\n\t highlighter.unhighlight();\n\t });\n\t }\n\n\t if (type == 'keydown') {\n\t this.onKeyDown(event);\n\t }\n\t };\n\n\t return AppendNode;\n\t}\n\n\tmodule.exports = appendNodeFactory;\n\n\n/***/ },\n/* 11 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar ContextMenu = __webpack_require__(7);\n\n\t/**\n\t * Create a select box to be used in the editor menu's, which allows to switch mode\n\t * @param {HTMLElement} container\n\t * @param {String[]} modes Available modes: 'code', 'form', 'text', 'tree', 'view'\n\t * @param {String} current Available modes: 'code', 'form', 'text', 'tree', 'view'\n\t * @param {function(mode: string)} onSwitch Callback invoked on switch\n\t * @constructor\n\t */\n\tfunction ModeSwitcher(container, modes, current, onSwitch) {\n\t // available modes\n\t var availableModes = {\n\t code: {\n\t 'text': 'Code',\n\t 'title': 'Switch to code highlighter',\n\t 'click': function () {\n\t onSwitch('code')\n\t }\n\t },\n\t form: {\n\t 'text': 'Form',\n\t 'title': 'Switch to form editor',\n\t 'click': function () {\n\t onSwitch('form');\n\t }\n\t },\n\t text: {\n\t 'text': 'Text',\n\t 'title': 'Switch to plain text editor',\n\t 'click': function () {\n\t onSwitch('text');\n\t }\n\t },\n\t tree: {\n\t 'text': 'Tree',\n\t 'title': 'Switch to tree editor',\n\t 'click': function () {\n\t onSwitch('tree');\n\t }\n\t },\n\t view: {\n\t 'text': 'View',\n\t 'title': 'Switch to tree view',\n\t 'click': function () {\n\t onSwitch('view');\n\t }\n\t }\n\t };\n\n\t // list the selected modes\n\t var items = [];\n\t for (var i = 0; i < modes.length; i++) {\n\t var mode = modes[i];\n\t var item = availableModes[mode];\n\t if (!item) {\n\t throw new Error('Unknown mode \"' + mode + '\"');\n\t }\n\n\t item.className = 'jsoneditor-type-modes' + ((current == mode) ? ' jsoneditor-selected' : '');\n\t items.push(item);\n\t }\n\n\t // retrieve the title of current mode\n\t var currentMode = availableModes[current];\n\t if (!currentMode) {\n\t throw new Error('Unknown mode \"' + current + '\"');\n\t }\n\t var currentTitle = currentMode.text;\n\n\t // create the html element\n\t var box = document.createElement('button');\n\t box.type = 'button';\n\t box.className = 'jsoneditor-modes jsoneditor-separator';\n\t box.innerHTML = currentTitle + ' ▾';\n\t box.title = 'Switch editor mode';\n\t box.onclick = function () {\n\t var menu = new ContextMenu(items);\n\t menu.show(box);\n\t };\n\n\t var frame = document.createElement('div');\n\t frame.className = 'jsoneditor-modes';\n\t frame.style.position = 'relative';\n\t frame.appendChild(box);\n\n\t container.appendChild(frame);\n\n\t this.dom = {\n\t container: container,\n\t box: box,\n\t frame: frame\n\t };\n\t}\n\n\t/**\n\t * Set focus to switcher\n\t */\n\tModeSwitcher.prototype.focus = function () {\n\t this.dom.box.focus();\n\t};\n\n\t/**\n\t * Destroy the ModeSwitcher, remove from DOM\n\t */\n\tModeSwitcher.prototype.destroy = function () {\n\t if (this.dom && this.dom.frame && this.dom.frame.parentNode) {\n\t this.dom.frame.parentNode.removeChild(this.dom.frame);\n\t }\n\t this.dom = null;\n\t};\n\n\tmodule.exports = ModeSwitcher;\n\n\n/***/ },\n/* 12 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar ace;\n\ttry {\n\t ace = __webpack_require__(13);\n\t}\n\tcatch (err) {\n\t // failed to load ace, no problem, we will fall back to plain text\n\t}\n\n\tvar ModeSwitcher = __webpack_require__(11);\n\tvar util = __webpack_require__(4);\n\n\t// create a mixin with the functions for text mode\n\tvar textmode = {};\n\n\tvar MAX_ERRORS = 3; // maximum number of displayed errors at the bottom\n\n\tvar DEFAULT_THEME = 'ace/theme/jsoneditor';\n\n\t/**\n\t * Create a text editor\n\t * @param {Element} container\n\t * @param {Object} [options] Object with options. available options:\n\t * {String} mode Available values:\n\t * \"text\" (default)\n\t * or \"code\".\n\t * {Number} indentation Number of indentation\n\t * spaces. 2 by default.\n\t * {function} onChange Callback method\n\t * triggered on change\n\t * {function} onModeChange Callback method\n\t * triggered after setMode\n\t * {Object} ace A custom instance of\n\t * Ace editor.\n\t * {boolean} escapeUnicode If true, unicode\n\t * characters are escaped.\n\t * false by default.\n\t * @private\n\t */\n\ttextmode.create = function (container, options) {\n\t // read options\n\t options = options || {};\n\t this.options = options;\n\n\t // indentation\n\t if (options.indentation) {\n\t this.indentation = Number(options.indentation);\n\t }\n\t else {\n\t this.indentation = 2; // number of spaces\n\t }\n\n\t // grab ace from options if provided\n\t var _ace = options.ace ? options.ace : ace;\n\n\t // determine mode\n\t this.mode = (options.mode == 'code') ? 'code' : 'text';\n\t if (this.mode == 'code') {\n\t // verify whether Ace editor is available and supported\n\t if (typeof _ace === 'undefined') {\n\t this.mode = 'text';\n\t console.warn('Failed to load Ace editor, falling back to plain text mode. Please use a JSONEditor bundle including Ace, or pass Ace as via the configuration option `ace`.');\n\t }\n\t }\n\n\t // determine theme\n\t this.theme = options.theme || DEFAULT_THEME;\n\t if (this.theme === DEFAULT_THEME && window.ace) {\n\t __webpack_require__(17);\n\t }\n\n\t var me = this;\n\t this.container = container;\n\t this.dom = {};\n\t this.aceEditor = undefined; // ace code editor\n\t this.textarea = undefined; // plain text editor (fallback when Ace is not available)\n\t this.validateSchema = null;\n\n\t // create a debounced validate function\n\t this._debouncedValidate = util.debounce(this.validate.bind(this), this.DEBOUNCE_INTERVAL);\n\n\t this.width = container.clientWidth;\n\t this.height = container.clientHeight;\n\n\t this.frame = document.createElement('div');\n\t this.frame.className = 'jsoneditor jsoneditor-mode-' + this.options.mode;\n\t this.frame.onclick = function (event) {\n\t // prevent default submit action when the editor is located inside a form\n\t event.preventDefault();\n\t };\n\t this.frame.onkeydown = function (event) {\n\t me._onKeyDown(event);\n\t };\n\n\t // create menu\n\t this.menu = document.createElement('div');\n\t this.menu.className = 'jsoneditor-menu';\n\t this.frame.appendChild(this.menu);\n\n\t // create format button\n\t var buttonFormat = document.createElement('button');\n\t buttonFormat.type = 'button';\n\t buttonFormat.className = 'jsoneditor-format';\n\t buttonFormat.title = 'Format JSON data, with proper indentation and line feeds (Ctrl+\\\\)';\n\t this.menu.appendChild(buttonFormat);\n\t buttonFormat.onclick = function () {\n\t try {\n\t me.format();\n\t me._onChange();\n\t }\n\t catch (err) {\n\t me._onError(err);\n\t }\n\t };\n\n\t // create compact button\n\t var buttonCompact = document.createElement('button');\n\t buttonCompact.type = 'button';\n\t buttonCompact.className = 'jsoneditor-compact';\n\t buttonCompact.title = 'Compact JSON data, remove all whitespaces (Ctrl+Shift+\\\\)';\n\t this.menu.appendChild(buttonCompact);\n\t buttonCompact.onclick = function () {\n\t try {\n\t me.compact();\n\t me._onChange();\n\t }\n\t catch (err) {\n\t me._onError(err);\n\t }\n\t };\n\n\t // create mode box\n\t if (this.options && this.options.modes && this.options.modes.length) {\n\t this.modeSwitcher = new ModeSwitcher(this.menu, this.options.modes, this.options.mode, function onSwitch(mode) {\n\t // switch mode and restore focus\n\t me.setMode(mode);\n\t me.modeSwitcher.focus();\n\t });\n\t }\n\n\t this.content = document.createElement('div');\n\t this.content.className = 'jsoneditor-outer';\n\t this.frame.appendChild(this.content);\n\n\t this.container.appendChild(this.frame);\n\n\t if (this.mode == 'code') {\n\t this.editorDom = document.createElement('div');\n\t this.editorDom.style.height = '100%'; // TODO: move to css\n\t this.editorDom.style.width = '100%'; // TODO: move to css\n\t this.content.appendChild(this.editorDom);\n\n\t var aceEditor = _ace.edit(this.editorDom);\n\t aceEditor.$blockScrolling = Infinity;\n\t aceEditor.setTheme(this.theme);\n\t aceEditor.setShowPrintMargin(false);\n\t aceEditor.setFontSize(13);\n\t aceEditor.getSession().setMode('ace/mode/json');\n\t aceEditor.getSession().setTabSize(this.indentation);\n\t aceEditor.getSession().setUseSoftTabs(true);\n\t aceEditor.getSession().setUseWrapMode(true);\n\t aceEditor.commands.bindKey('Ctrl-L', null); // disable Ctrl+L (is used by the browser to select the address bar)\n\t aceEditor.commands.bindKey('Command-L', null); // disable Ctrl+L (is used by the browser to select the address bar)\n\t this.aceEditor = aceEditor;\n\n\t // TODO: deprecated since v5.0.0. Cleanup backward compatibility some day\n\t if (!this.hasOwnProperty('editor')) {\n\t Object.defineProperty(this, 'editor', {\n\t get: function () {\n\t console.warn('Property \"editor\" has been renamed to \"aceEditor\".');\n\t return me.aceEditor;\n\t },\n\t set: function (aceEditor) {\n\t console.warn('Property \"editor\" has been renamed to \"aceEditor\".');\n\t me.aceEditor = aceEditor;\n\t }\n\t });\n\t }\n\n\t var poweredBy = document.createElement('a');\n\t poweredBy.appendChild(document.createTextNode('powered by ace'));\n\t poweredBy.href = 'http://ace.ajax.org';\n\t poweredBy.target = '_blank';\n\t poweredBy.className = 'jsoneditor-poweredBy';\n\t poweredBy.onclick = function () {\n\t // TODO: this anchor falls below the margin of the content,\n\t // therefore the normal a.href does not work. We use a click event\n\t // for now, but this should be fixed.\n\t window.open(poweredBy.href, poweredBy.target);\n\t };\n\t this.menu.appendChild(poweredBy);\n\n\t // register onchange event\n\t aceEditor.on('change', this._onChange.bind(this));\n\t }\n\t else {\n\t // load a plain text textarea\n\t var textarea = document.createElement('textarea');\n\t textarea.className = 'jsoneditor-text';\n\t textarea.spellcheck = false;\n\t this.content.appendChild(textarea);\n\t this.textarea = textarea;\n\n\t // register onchange event\n\t if (this.textarea.oninput === null) {\n\t this.textarea.oninput = this._onChange.bind(this);\n\t }\n\t else {\n\t // oninput is undefined. For IE8-\n\t this.textarea.onchange = this._onChange.bind(this);\n\t }\n\t }\n\n\t this.setSchema(this.options.schema);\n\t};\n\n\t/**\n\t * Handle a change:\n\t * - Validate JSON schema\n\t * - Send a callback to the onChange listener if provided\n\t * @private\n\t */\n\ttextmode._onChange = function () {\n\t // validate JSON schema (if configured)\n\t this._debouncedValidate();\n\n\t // trigger the onChange callback\n\t if (this.options.onChange) {\n\t try {\n\t this.options.onChange();\n\t }\n\t catch (err) {\n\t console.error('Error in onChange callback: ', err);\n\t }\n\t }\n\t};\n\n\t/**\n\t * Event handler for keydown. Handles shortcut keys\n\t * @param {Event} event\n\t * @private\n\t */\n\ttextmode._onKeyDown = function (event) {\n\t var keynum = event.which || event.keyCode;\n\t var handled = false;\n\n\t if (keynum == 220 && event.ctrlKey) {\n\t if (event.shiftKey) { // Ctrl+Shift+\\\n\t this.compact();\n\t this._onChange();\n\t }\n\t else { // Ctrl+\\\n\t this.format();\n\t this._onChange();\n\t }\n\t handled = true;\n\t }\n\n\t if (handled) {\n\t event.preventDefault();\n\t event.stopPropagation();\n\t }\n\t};\n\n\t/**\n\t * Destroy the editor. Clean up DOM, event listeners, and web workers.\n\t */\n\ttextmode.destroy = function () {\n\t // remove old ace editor\n\t if (this.aceEditor) {\n\t this.aceEditor.destroy();\n\t this.aceEditor = null;\n\t }\n\n\t if (this.frame && this.container && this.frame.parentNode == this.container) {\n\t this.container.removeChild(this.frame);\n\t }\n\n\t if (this.modeSwitcher) {\n\t this.modeSwitcher.destroy();\n\t this.modeSwitcher = null;\n\t }\n\n\t this.textarea = null;\n\t \n\t this._debouncedValidate = null;\n\t};\n\n\t/**\n\t * Compact the code in the formatter\n\t */\n\ttextmode.compact = function () {\n\t var json = this.get();\n\t var text = JSON.stringify(json);\n\t this.setText(text);\n\t};\n\n\t/**\n\t * Format the code in the formatter\n\t */\n\ttextmode.format = function () {\n\t var json = this.get();\n\t var text = JSON.stringify(json, null, this.indentation);\n\t this.setText(text);\n\t};\n\n\t/**\n\t * Set focus to the formatter\n\t */\n\ttextmode.focus = function () {\n\t if (this.textarea) {\n\t this.textarea.focus();\n\t }\n\t if (this.aceEditor) {\n\t this.aceEditor.focus();\n\t }\n\t};\n\n\t/**\n\t * Resize the formatter\n\t */\n\ttextmode.resize = function () {\n\t if (this.aceEditor) {\n\t var force = false;\n\t this.aceEditor.resize(force);\n\t }\n\t};\n\n\t/**\n\t * Set json data in the formatter\n\t * @param {Object} json\n\t */\n\ttextmode.set = function(json) {\n\t this.setText(JSON.stringify(json, null, this.indentation));\n\t};\n\n\t/**\n\t * Get json data from the formatter\n\t * @return {Object} json\n\t */\n\ttextmode.get = function() {\n\t var text = this.getText();\n\t var json;\n\n\t try {\n\t json = util.parse(text); // this can throw an error\n\t }\n\t catch (err) {\n\t // try to sanitize json, replace JavaScript notation with JSON notation\n\t text = util.sanitize(text);\n\n\t // try to parse again\n\t json = util.parse(text); // this can throw an error\n\t }\n\n\t return json;\n\t};\n\n\t/**\n\t * Get the text contents of the editor\n\t * @return {String} jsonText\n\t */\n\ttextmode.getText = function() {\n\t if (this.textarea) {\n\t return this.textarea.value;\n\t }\n\t if (this.aceEditor) {\n\t return this.aceEditor.getValue();\n\t }\n\t return '';\n\t};\n\n\t/**\n\t * Set the text contents of the editor\n\t * @param {String} jsonText\n\t */\n\ttextmode.setText = function(jsonText) {\n\t var text;\n\n\t if (this.options.escapeUnicode === true) {\n\t text = util.escapeUnicodeChars(jsonText);\n\t }\n\t else {\n\t text = jsonText;\n\t }\n\n\t if (this.textarea) {\n\t this.textarea.value = text;\n\t }\n\t if (this.aceEditor) {\n\t // prevent emitting onChange events while setting new text\n\t var originalOnChange = this.options.onChange;\n\t this.options.onChange = null;\n\n\t this.aceEditor.setValue(text, -1);\n\n\t this.options.onChange = originalOnChange;\n\t }\n\n\t // validate JSON schema\n\t this.validate();\n\t};\n\n\t/**\n\t * Validate current JSON object against the configured JSON schema\n\t * Throws an exception when no JSON schema is configured\n\t */\n\ttextmode.validate = function () {\n\t // clear all current errors\n\t if (this.dom.validationErrors) {\n\t this.dom.validationErrors.parentNode.removeChild(this.dom.validationErrors);\n\t this.dom.validationErrors = null;\n\n\t this.content.style.marginBottom = '';\n\t this.content.style.paddingBottom = '';\n\t }\n\n\t var doValidate = false;\n\t var errors = [];\n\t var json;\n\t try {\n\t json = this.get(); // this can fail when there is no valid json\n\t doValidate = true;\n\t }\n\t catch (err) {\n\t // no valid JSON, don't validate\n\t }\n\n\t // only validate the JSON when parsing the JSON succeeded\n\t if (doValidate && this.validateSchema) {\n\t var valid = this.validateSchema(json);\n\t if (!valid) {\n\t errors = this.validateSchema.errors.map(function (error) {\n\t return util.improveSchemaError(error);\n\t });\n\t }\n\t }\n\n\t if (errors.length > 0) {\n\t // limit the number of displayed errors\n\t var limit = errors.length > MAX_ERRORS;\n\t if (limit) {\n\t errors = errors.slice(0, MAX_ERRORS);\n\t var hidden = this.validateSchema.errors.length - MAX_ERRORS;\n\t errors.push('(' + hidden + ' more errors...)')\n\t }\n\n\t var validationErrors = document.createElement('div');\n\t validationErrors.innerHTML = '' +\n\t '' +\n\t errors.map(function (error) {\n\t var message;\n\t if (typeof error === 'string') {\n\t message = '';\n\t }\n\t else {\n\t message = '' +\n\t '';\n\t }\n\n\t return '' + message + ''\n\t }).join('') +\n\t '' +\n\t '
' + error + '
' + error.dataPath + '' + error.message + '
';\n\n\t this.dom.validationErrors = validationErrors;\n\t this.frame.appendChild(validationErrors);\n\n\t var height = validationErrors.clientHeight;\n\t this.content.style.marginBottom = (-height) + 'px';\n\t this.content.style.paddingBottom = height + 'px';\n\t }\n\n\t // update the height of the ace editor\n\t if (this.aceEditor) {\n\t var force = false;\n\t this.aceEditor.resize(force);\n\t }\n\t};\n\n\t// define modes\n\tmodule.exports = [\n\t {\n\t mode: 'text',\n\t mixin: textmode,\n\t data: 'text',\n\t load: textmode.format\n\t },\n\t {\n\t mode: 'code',\n\t mixin: textmode,\n\t data: 'text',\n\t load: textmode.format\n\t }\n\t];\n\n\n/***/ },\n/* 13 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t// load brace\n\tvar ace = __webpack_require__(!(function webpackMissingModule() { var e = new Error(\"Cannot find module \\\"brace\\\"\"); e.code = 'MODULE_NOT_FOUND'; throw e; }()));\n\n\t// load required ace modules\n\t__webpack_require__(14);\n\t__webpack_require__(16);\n\n\tmodule.exports = ace;\n\n\n/***/ },\n/* 14 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tace.define(\"ace/mode/json_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"], function(acequire, exports, module) {\n\t\"use strict\";\n\n\tvar oop = acequire(\"../lib/oop\");\n\tvar TextHighlightRules = acequire(\"./text_highlight_rules\").TextHighlightRules;\n\n\tvar JsonHighlightRules = function() {\n\t this.$rules = {\n\t \"start\" : [\n\t {\n\t token : \"variable\", // single line\n\t regex : '[\"](?:(?:\\\\\\\\.)|(?:[^\"\\\\\\\\]))*?[\"]\\\\s*(?=:)'\n\t }, {\n\t token : \"string\", // single line\n\t regex : '\"',\n\t next : \"string\"\n\t }, {\n\t token : \"constant.numeric\", // hex\n\t regex : \"0[xX][0-9a-fA-F]+\\\\b\"\n\t }, {\n\t token : \"constant.numeric\", // float\n\t regex : \"[+-]?\\\\d+(?:(?:\\\\.\\\\d*)?(?:[eE][+-]?\\\\d+)?)?\\\\b\"\n\t }, {\n\t token : \"constant.language.boolean\",\n\t regex : \"(?:true|false)\\\\b\"\n\t }, {\n\t token : \"invalid.illegal\", // single quoted strings are not allowed\n\t regex : \"['](?:(?:\\\\\\\\.)|(?:[^'\\\\\\\\]))*?[']\"\n\t }, {\n\t token : \"invalid.illegal\", // comments are not allowed\n\t regex : \"\\\\/\\\\/.*$\"\n\t }, {\n\t token : \"paren.lparen\",\n\t regex : \"[[({]\"\n\t }, {\n\t token : \"paren.rparen\",\n\t regex : \"[\\\\])}]\"\n\t }, {\n\t token : \"text\",\n\t regex : \"\\\\s+\"\n\t }\n\t ],\n\t \"string\" : [\n\t {\n\t token : \"constant.language.escape\",\n\t regex : /\\\\(?:x[0-9a-fA-F]{2}|u[0-9a-fA-F]{4}|[\"\\\\\\/bfnrt])/\n\t }, {\n\t token : \"string\",\n\t regex : '[^\"\\\\\\\\]+'\n\t }, {\n\t token : \"string\",\n\t regex : '\"',\n\t next : \"start\"\n\t }, {\n\t token : \"string\",\n\t regex : \"\",\n\t next : \"start\"\n\t }\n\t ]\n\t };\n\t \n\t};\n\n\toop.inherits(JsonHighlightRules, TextHighlightRules);\n\n\texports.JsonHighlightRules = JsonHighlightRules;\n\t});\n\n\tace.define(\"ace/mode/matching_brace_outdent\",[\"require\",\"exports\",\"module\",\"ace/range\"], function(acequire, exports, module) {\n\t\"use strict\";\n\n\tvar Range = acequire(\"../range\").Range;\n\n\tvar MatchingBraceOutdent = function() {};\n\n\t(function() {\n\n\t this.checkOutdent = function(line, input) {\n\t if (! /^\\s+$/.test(line))\n\t return false;\n\n\t return /^\\s*\\}/.test(input);\n\t };\n\n\t this.autoOutdent = function(doc, row) {\n\t var line = doc.getLine(row);\n\t var match = line.match(/^(\\s*\\})/);\n\n\t if (!match) return 0;\n\n\t var column = match[1].length;\n\t var openBracePos = doc.findMatchingBracket({row: row, column: column});\n\n\t if (!openBracePos || openBracePos.row == row) return 0;\n\n\t var indent = this.$getIndent(doc.getLine(openBracePos.row));\n\t doc.replace(new Range(row, 0, row, column-1), indent);\n\t };\n\n\t this.$getIndent = function(line) {\n\t return line.match(/^\\s*/)[0];\n\t };\n\n\t}).call(MatchingBraceOutdent.prototype);\n\n\texports.MatchingBraceOutdent = MatchingBraceOutdent;\n\t});\n\n\tace.define(\"ace/mode/behaviour/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/behaviour\",\"ace/token_iterator\",\"ace/lib/lang\"], function(acequire, exports, module) {\n\t\"use strict\";\n\n\tvar oop = acequire(\"../../lib/oop\");\n\tvar Behaviour = acequire(\"../behaviour\").Behaviour;\n\tvar TokenIterator = acequire(\"../../token_iterator\").TokenIterator;\n\tvar lang = acequire(\"../../lib/lang\");\n\n\tvar SAFE_INSERT_IN_TOKENS =\n\t [\"text\", \"paren.rparen\", \"punctuation.operator\"];\n\tvar SAFE_INSERT_BEFORE_TOKENS =\n\t [\"text\", \"paren.rparen\", \"punctuation.operator\", \"comment\"];\n\n\tvar context;\n\tvar contextCache = {};\n\tvar initContext = function(editor) {\n\t var id = -1;\n\t if (editor.multiSelect) {\n\t id = editor.selection.index;\n\t if (contextCache.rangeCount != editor.multiSelect.rangeCount)\n\t contextCache = {rangeCount: editor.multiSelect.rangeCount};\n\t }\n\t if (contextCache[id])\n\t return context = contextCache[id];\n\t context = contextCache[id] = {\n\t autoInsertedBrackets: 0,\n\t autoInsertedRow: -1,\n\t autoInsertedLineEnd: \"\",\n\t maybeInsertedBrackets: 0,\n\t maybeInsertedRow: -1,\n\t maybeInsertedLineStart: \"\",\n\t maybeInsertedLineEnd: \"\"\n\t };\n\t};\n\n\tvar getWrapped = function(selection, selected, opening, closing) {\n\t var rowDiff = selection.end.row - selection.start.row;\n\t return {\n\t text: opening + selected + closing,\n\t selection: [\n\t 0,\n\t selection.start.column + 1,\n\t rowDiff,\n\t selection.end.column + (rowDiff ? 0 : 1)\n\t ]\n\t };\n\t};\n\n\tvar CstyleBehaviour = function() {\n\t this.add(\"braces\", \"insertion\", function(state, action, editor, session, text) {\n\t var cursor = editor.getCursorPosition();\n\t var line = session.doc.getLine(cursor.row);\n\t if (text == '{') {\n\t initContext(editor);\n\t var selection = editor.getSelectionRange();\n\t var selected = session.doc.getTextRange(selection);\n\t if (selected !== \"\" && selected !== \"{\" && editor.getWrapBehavioursEnabled()) {\n\t return getWrapped(selection, selected, '{', '}');\n\t } else if (CstyleBehaviour.isSaneInsertion(editor, session)) {\n\t if (/[\\]\\}\\)]/.test(line[cursor.column]) || editor.inMultiSelectMode) {\n\t CstyleBehaviour.recordAutoInsert(editor, session, \"}\");\n\t return {\n\t text: '{}',\n\t selection: [1, 1]\n\t };\n\t } else {\n\t CstyleBehaviour.recordMaybeInsert(editor, session, \"{\");\n\t return {\n\t text: '{',\n\t selection: [1, 1]\n\t };\n\t }\n\t }\n\t } else if (text == '}') {\n\t initContext(editor);\n\t var rightChar = line.substring(cursor.column, cursor.column + 1);\n\t if (rightChar == '}') {\n\t var matching = session.$findOpeningBracket('}', {column: cursor.column + 1, row: cursor.row});\n\t if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {\n\t CstyleBehaviour.popAutoInsertedClosing();\n\t return {\n\t text: '',\n\t selection: [1, 1]\n\t };\n\t }\n\t }\n\t } else if (text == \"\\n\" || text == \"\\r\\n\") {\n\t initContext(editor);\n\t var closing = \"\";\n\t if (CstyleBehaviour.isMaybeInsertedClosing(cursor, line)) {\n\t closing = lang.stringRepeat(\"}\", context.maybeInsertedBrackets);\n\t CstyleBehaviour.clearMaybeInsertedClosing();\n\t }\n\t var rightChar = line.substring(cursor.column, cursor.column + 1);\n\t if (rightChar === '}') {\n\t var openBracePos = session.findMatchingBracket({row: cursor.row, column: cursor.column+1}, '}');\n\t if (!openBracePos)\n\t return null;\n\t var next_indent = this.$getIndent(session.getLine(openBracePos.row));\n\t } else if (closing) {\n\t var next_indent = this.$getIndent(line);\n\t } else {\n\t CstyleBehaviour.clearMaybeInsertedClosing();\n\t return;\n\t }\n\t var indent = next_indent + session.getTabString();\n\n\t return {\n\t text: '\\n' + indent + '\\n' + next_indent + closing,\n\t selection: [1, indent.length, 1, indent.length]\n\t };\n\t } else {\n\t CstyleBehaviour.clearMaybeInsertedClosing();\n\t }\n\t });\n\n\t this.add(\"braces\", \"deletion\", function(state, action, editor, session, range) {\n\t var selected = session.doc.getTextRange(range);\n\t if (!range.isMultiLine() && selected == '{') {\n\t initContext(editor);\n\t var line = session.doc.getLine(range.start.row);\n\t var rightChar = line.substring(range.end.column, range.end.column + 1);\n\t if (rightChar == '}') {\n\t range.end.column++;\n\t return range;\n\t } else {\n\t context.maybeInsertedBrackets--;\n\t }\n\t }\n\t });\n\n\t this.add(\"parens\", \"insertion\", function(state, action, editor, session, text) {\n\t if (text == '(') {\n\t initContext(editor);\n\t var selection = editor.getSelectionRange();\n\t var selected = session.doc.getTextRange(selection);\n\t if (selected !== \"\" && editor.getWrapBehavioursEnabled()) {\n\t return getWrapped(selection, selected, '(', ')');\n\t } else if (CstyleBehaviour.isSaneInsertion(editor, session)) {\n\t CstyleBehaviour.recordAutoInsert(editor, session, \")\");\n\t return {\n\t text: '()',\n\t selection: [1, 1]\n\t };\n\t }\n\t } else if (text == ')') {\n\t initContext(editor);\n\t var cursor = editor.getCursorPosition();\n\t var line = session.doc.getLine(cursor.row);\n\t var rightChar = line.substring(cursor.column, cursor.column + 1);\n\t if (rightChar == ')') {\n\t var matching = session.$findOpeningBracket(')', {column: cursor.column + 1, row: cursor.row});\n\t if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {\n\t CstyleBehaviour.popAutoInsertedClosing();\n\t return {\n\t text: '',\n\t selection: [1, 1]\n\t };\n\t }\n\t }\n\t }\n\t });\n\n\t this.add(\"parens\", \"deletion\", function(state, action, editor, session, range) {\n\t var selected = session.doc.getTextRange(range);\n\t if (!range.isMultiLine() && selected == '(') {\n\t initContext(editor);\n\t var line = session.doc.getLine(range.start.row);\n\t var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n\t if (rightChar == ')') {\n\t range.end.column++;\n\t return range;\n\t }\n\t }\n\t });\n\n\t this.add(\"brackets\", \"insertion\", function(state, action, editor, session, text) {\n\t if (text == '[') {\n\t initContext(editor);\n\t var selection = editor.getSelectionRange();\n\t var selected = session.doc.getTextRange(selection);\n\t if (selected !== \"\" && editor.getWrapBehavioursEnabled()) {\n\t return getWrapped(selection, selected, '[', ']');\n\t } else if (CstyleBehaviour.isSaneInsertion(editor, session)) {\n\t CstyleBehaviour.recordAutoInsert(editor, session, \"]\");\n\t return {\n\t text: '[]',\n\t selection: [1, 1]\n\t };\n\t }\n\t } else if (text == ']') {\n\t initContext(editor);\n\t var cursor = editor.getCursorPosition();\n\t var line = session.doc.getLine(cursor.row);\n\t var rightChar = line.substring(cursor.column, cursor.column + 1);\n\t if (rightChar == ']') {\n\t var matching = session.$findOpeningBracket(']', {column: cursor.column + 1, row: cursor.row});\n\t if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {\n\t CstyleBehaviour.popAutoInsertedClosing();\n\t return {\n\t text: '',\n\t selection: [1, 1]\n\t };\n\t }\n\t }\n\t }\n\t });\n\n\t this.add(\"brackets\", \"deletion\", function(state, action, editor, session, range) {\n\t var selected = session.doc.getTextRange(range);\n\t if (!range.isMultiLine() && selected == '[') {\n\t initContext(editor);\n\t var line = session.doc.getLine(range.start.row);\n\t var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n\t if (rightChar == ']') {\n\t range.end.column++;\n\t return range;\n\t }\n\t }\n\t });\n\n\t this.add(\"string_dquotes\", \"insertion\", function(state, action, editor, session, text) {\n\t if (text == '\"' || text == \"'\") {\n\t initContext(editor);\n\t var quote = text;\n\t var selection = editor.getSelectionRange();\n\t var selected = session.doc.getTextRange(selection);\n\t if (selected !== \"\" && selected !== \"'\" && selected != '\"' && editor.getWrapBehavioursEnabled()) {\n\t return getWrapped(selection, selected, quote, quote);\n\t } else if (!selected) {\n\t var cursor = editor.getCursorPosition();\n\t var line = session.doc.getLine(cursor.row);\n\t var leftChar = line.substring(cursor.column-1, cursor.column);\n\t var rightChar = line.substring(cursor.column, cursor.column + 1);\n\t \n\t var token = session.getTokenAt(cursor.row, cursor.column);\n\t var rightToken = session.getTokenAt(cursor.row, cursor.column + 1);\n\t if (leftChar == \"\\\\\" && token && /escape/.test(token.type))\n\t return null;\n\t \n\t var stringBefore = token && /string|escape/.test(token.type);\n\t var stringAfter = !rightToken || /string|escape/.test(rightToken.type);\n\t \n\t var pair;\n\t if (rightChar == quote) {\n\t pair = stringBefore !== stringAfter;\n\t } else {\n\t if (stringBefore && !stringAfter)\n\t return null; // wrap string with different quote\n\t if (stringBefore && stringAfter)\n\t return null; // do not pair quotes inside strings\n\t var wordRe = session.$mode.tokenRe;\n\t wordRe.lastIndex = 0;\n\t var isWordBefore = wordRe.test(leftChar);\n\t wordRe.lastIndex = 0;\n\t var isWordAfter = wordRe.test(leftChar);\n\t if (isWordBefore || isWordAfter)\n\t return null; // before or after alphanumeric\n\t if (rightChar && !/[\\s;,.})\\]\\\\]/.test(rightChar))\n\t return null; // there is rightChar and it isn't closing\n\t pair = true;\n\t }\n\t return {\n\t text: pair ? quote + quote : \"\",\n\t selection: [1,1]\n\t };\n\t }\n\t }\n\t });\n\n\t this.add(\"string_dquotes\", \"deletion\", function(state, action, editor, session, range) {\n\t var selected = session.doc.getTextRange(range);\n\t if (!range.isMultiLine() && (selected == '\"' || selected == \"'\")) {\n\t initContext(editor);\n\t var line = session.doc.getLine(range.start.row);\n\t var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n\t if (rightChar == selected) {\n\t range.end.column++;\n\t return range;\n\t }\n\t }\n\t });\n\n\t};\n\n\t \n\tCstyleBehaviour.isSaneInsertion = function(editor, session) {\n\t var cursor = editor.getCursorPosition();\n\t var iterator = new TokenIterator(session, cursor.row, cursor.column);\n\t if (!this.$matchTokenType(iterator.getCurrentToken() || \"text\", SAFE_INSERT_IN_TOKENS)) {\n\t var iterator2 = new TokenIterator(session, cursor.row, cursor.column + 1);\n\t if (!this.$matchTokenType(iterator2.getCurrentToken() || \"text\", SAFE_INSERT_IN_TOKENS))\n\t return false;\n\t }\n\t iterator.stepForward();\n\t return iterator.getCurrentTokenRow() !== cursor.row ||\n\t this.$matchTokenType(iterator.getCurrentToken() || \"text\", SAFE_INSERT_BEFORE_TOKENS);\n\t};\n\n\tCstyleBehaviour.$matchTokenType = function(token, types) {\n\t return types.indexOf(token.type || token) > -1;\n\t};\n\n\tCstyleBehaviour.recordAutoInsert = function(editor, session, bracket) {\n\t var cursor = editor.getCursorPosition();\n\t var line = session.doc.getLine(cursor.row);\n\t if (!this.isAutoInsertedClosing(cursor, line, context.autoInsertedLineEnd[0]))\n\t context.autoInsertedBrackets = 0;\n\t context.autoInsertedRow = cursor.row;\n\t context.autoInsertedLineEnd = bracket + line.substr(cursor.column);\n\t context.autoInsertedBrackets++;\n\t};\n\n\tCstyleBehaviour.recordMaybeInsert = function(editor, session, bracket) {\n\t var cursor = editor.getCursorPosition();\n\t var line = session.doc.getLine(cursor.row);\n\t if (!this.isMaybeInsertedClosing(cursor, line))\n\t context.maybeInsertedBrackets = 0;\n\t context.maybeInsertedRow = cursor.row;\n\t context.maybeInsertedLineStart = line.substr(0, cursor.column) + bracket;\n\t context.maybeInsertedLineEnd = line.substr(cursor.column);\n\t context.maybeInsertedBrackets++;\n\t};\n\n\tCstyleBehaviour.isAutoInsertedClosing = function(cursor, line, bracket) {\n\t return context.autoInsertedBrackets > 0 &&\n\t cursor.row === context.autoInsertedRow &&\n\t bracket === context.autoInsertedLineEnd[0] &&\n\t line.substr(cursor.column) === context.autoInsertedLineEnd;\n\t};\n\n\tCstyleBehaviour.isMaybeInsertedClosing = function(cursor, line) {\n\t return context.maybeInsertedBrackets > 0 &&\n\t cursor.row === context.maybeInsertedRow &&\n\t line.substr(cursor.column) === context.maybeInsertedLineEnd &&\n\t line.substr(0, cursor.column) == context.maybeInsertedLineStart;\n\t};\n\n\tCstyleBehaviour.popAutoInsertedClosing = function() {\n\t context.autoInsertedLineEnd = context.autoInsertedLineEnd.substr(1);\n\t context.autoInsertedBrackets--;\n\t};\n\n\tCstyleBehaviour.clearMaybeInsertedClosing = function() {\n\t if (context) {\n\t context.maybeInsertedBrackets = 0;\n\t context.maybeInsertedRow = -1;\n\t }\n\t};\n\n\n\n\toop.inherits(CstyleBehaviour, Behaviour);\n\n\texports.CstyleBehaviour = CstyleBehaviour;\n\t});\n\n\tace.define(\"ace/mode/folding/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/range\",\"ace/mode/folding/fold_mode\"], function(acequire, exports, module) {\n\t\"use strict\";\n\n\tvar oop = acequire(\"../../lib/oop\");\n\tvar Range = acequire(\"../../range\").Range;\n\tvar BaseFoldMode = acequire(\"./fold_mode\").FoldMode;\n\n\tvar FoldMode = exports.FoldMode = function(commentRegex) {\n\t if (commentRegex) {\n\t this.foldingStartMarker = new RegExp(\n\t this.foldingStartMarker.source.replace(/\\|[^|]*?$/, \"|\" + commentRegex.start)\n\t );\n\t this.foldingStopMarker = new RegExp(\n\t this.foldingStopMarker.source.replace(/\\|[^|]*?$/, \"|\" + commentRegex.end)\n\t );\n\t }\n\t};\n\toop.inherits(FoldMode, BaseFoldMode);\n\n\t(function() {\n\t \n\t this.foldingStartMarker = /(\\{|\\[)[^\\}\\]]*$|^\\s*(\\/\\*)/;\n\t this.foldingStopMarker = /^[^\\[\\{]*(\\}|\\])|^[\\s\\*]*(\\*\\/)/;\n\t this.singleLineBlockCommentRe= /^\\s*(\\/\\*).*\\*\\/\\s*$/;\n\t this.tripleStarBlockCommentRe = /^\\s*(\\/\\*\\*\\*).*\\*\\/\\s*$/;\n\t this.startRegionRe = /^\\s*(\\/\\*|\\/\\/)#?region\\b/;\n\t this._getFoldWidgetBase = this.getFoldWidget;\n\t this.getFoldWidget = function(session, foldStyle, row) {\n\t var line = session.getLine(row);\n\t \n\t if (this.singleLineBlockCommentRe.test(line)) {\n\t if (!this.startRegionRe.test(line) && !this.tripleStarBlockCommentRe.test(line))\n\t return \"\";\n\t }\n\t \n\t var fw = this._getFoldWidgetBase(session, foldStyle, row);\n\t \n\t if (!fw && this.startRegionRe.test(line))\n\t return \"start\"; // lineCommentRegionStart\n\t \n\t return fw;\n\t };\n\n\t this.getFoldWidgetRange = function(session, foldStyle, row, forceMultiline) {\n\t var line = session.getLine(row);\n\t \n\t if (this.startRegionRe.test(line))\n\t return this.getCommentRegionBlock(session, line, row);\n\t \n\t var match = line.match(this.foldingStartMarker);\n\t if (match) {\n\t var i = match.index;\n\n\t if (match[1])\n\t return this.openingBracketBlock(session, match[1], row, i);\n\t \n\t var range = session.getCommentFoldRange(row, i + match[0].length, 1);\n\t \n\t if (range && !range.isMultiLine()) {\n\t if (forceMultiline) {\n\t range = this.getSectionRange(session, row);\n\t } else if (foldStyle != \"all\")\n\t range = null;\n\t }\n\t \n\t return range;\n\t }\n\n\t if (foldStyle === \"markbegin\")\n\t return;\n\n\t var match = line.match(this.foldingStopMarker);\n\t if (match) {\n\t var i = match.index + match[0].length;\n\n\t if (match[1])\n\t return this.closingBracketBlock(session, match[1], row, i);\n\n\t return session.getCommentFoldRange(row, i, -1);\n\t }\n\t };\n\t \n\t this.getSectionRange = function(session, row) {\n\t var line = session.getLine(row);\n\t var startIndent = line.search(/\\S/);\n\t var startRow = row;\n\t var startColumn = line.length;\n\t row = row + 1;\n\t var endRow = row;\n\t var maxRow = session.getLength();\n\t while (++row < maxRow) {\n\t line = session.getLine(row);\n\t var indent = line.search(/\\S/);\n\t if (indent === -1)\n\t continue;\n\t if (startIndent > indent)\n\t break;\n\t var subRange = this.getFoldWidgetRange(session, \"all\", row);\n\t \n\t if (subRange) {\n\t if (subRange.start.row <= startRow) {\n\t break;\n\t } else if (subRange.isMultiLine()) {\n\t row = subRange.end.row;\n\t } else if (startIndent == indent) {\n\t break;\n\t }\n\t }\n\t endRow = row;\n\t }\n\t \n\t return new Range(startRow, startColumn, endRow, session.getLine(endRow).length);\n\t };\n\t this.getCommentRegionBlock = function(session, line, row) {\n\t var startColumn = line.search(/\\s*$/);\n\t var maxRow = session.getLength();\n\t var startRow = row;\n\t \n\t var re = /^\\s*(?:\\/\\*|\\/\\/|--)#?(end)?region\\b/;\n\t var depth = 1;\n\t while (++row < maxRow) {\n\t line = session.getLine(row);\n\t var m = re.exec(line);\n\t if (!m) continue;\n\t if (m[1]) depth--;\n\t else depth++;\n\n\t if (!depth) break;\n\t }\n\n\t var endRow = row;\n\t if (endRow > startRow) {\n\t return new Range(startRow, startColumn, endRow, line.length);\n\t }\n\t };\n\n\t}).call(FoldMode.prototype);\n\n\t});\n\n\tace.define(\"ace/mode/json\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/json_highlight_rules\",\"ace/mode/matching_brace_outdent\",\"ace/mode/behaviour/cstyle\",\"ace/mode/folding/cstyle\",\"ace/worker/worker_client\"], function(acequire, exports, module) {\n\t\"use strict\";\n\n\tvar oop = acequire(\"../lib/oop\");\n\tvar TextMode = acequire(\"./text\").Mode;\n\tvar HighlightRules = acequire(\"./json_highlight_rules\").JsonHighlightRules;\n\tvar MatchingBraceOutdent = acequire(\"./matching_brace_outdent\").MatchingBraceOutdent;\n\tvar CstyleBehaviour = acequire(\"./behaviour/cstyle\").CstyleBehaviour;\n\tvar CStyleFoldMode = acequire(\"./folding/cstyle\").FoldMode;\n\tvar WorkerClient = acequire(\"../worker/worker_client\").WorkerClient;\n\n\tvar Mode = function() {\n\t this.HighlightRules = HighlightRules;\n\t this.$outdent = new MatchingBraceOutdent();\n\t this.$behaviour = new CstyleBehaviour();\n\t this.foldingRules = new CStyleFoldMode();\n\t};\n\toop.inherits(Mode, TextMode);\n\n\t(function() {\n\n\t this.getNextLineIndent = function(state, line, tab) {\n\t var indent = this.$getIndent(line);\n\n\t if (state == \"start\") {\n\t var match = line.match(/^.*[\\{\\(\\[]\\s*$/);\n\t if (match) {\n\t indent += tab;\n\t }\n\t }\n\n\t return indent;\n\t };\n\n\t this.checkOutdent = function(state, line, input) {\n\t return this.$outdent.checkOutdent(line, input);\n\t };\n\n\t this.autoOutdent = function(state, doc, row) {\n\t this.$outdent.autoOutdent(doc, row);\n\t };\n\n\t this.createWorker = function(session) {\n\t var worker = new WorkerClient([\"ace\"], __webpack_require__(15), \"JsonWorker\");\n\t worker.attachToDocument(session.getDocument());\n\n\t worker.on(\"annotate\", function(e) {\n\t session.setAnnotations(e.data);\n\t });\n\n\t worker.on(\"terminate\", function() {\n\t session.clearAnnotations();\n\t });\n\n\t return worker;\n\t };\n\n\n\t this.$id = \"ace/mode/json\";\n\t}).call(Mode.prototype);\n\n\texports.Mode = Mode;\n\t});\n\n\n/***/ },\n/* 15 */\n/***/ function(module, exports) {\n\n\tmodule.exports.id = 'ace/mode/json_worker';\n\tmodule.exports.src = \"\\\"no use strict\\\";(function(window){function resolveModuleId(id,paths){for(var testPath=id,tail=\\\"\\\";testPath;){var alias=paths[testPath];if(\\\"string\\\"==typeof alias)return alias+tail;if(alias)return alias.location.replace(/\\\\/*$/,\\\"/\\\")+(tail||alias.main||alias.name);if(alias===!1)return\\\"\\\";var i=testPath.lastIndexOf(\\\"/\\\");if(-1===i)break;tail=testPath.substr(i)+tail,testPath=testPath.slice(0,i)}return id}if(!(void 0!==window.window&&window.document||window.acequire&&window.define)){window.console||(window.console=function(){var msgs=Array.prototype.slice.call(arguments,0);postMessage({type:\\\"log\\\",data:msgs})},window.console.error=window.console.warn=window.console.log=window.console.trace=window.console),window.window=window,window.ace=window,window.onerror=function(message,file,line,col,err){postMessage({type:\\\"error\\\",data:{message:message,data:err.data,file:file,line:line,col:col,stack:err.stack}})},window.normalizeModule=function(parentId,moduleName){if(-1!==moduleName.indexOf(\\\"!\\\")){var chunks=moduleName.split(\\\"!\\\");return window.normalizeModule(parentId,chunks[0])+\\\"!\\\"+window.normalizeModule(parentId,chunks[1])}if(\\\".\\\"==moduleName.charAt(0)){var base=parentId.split(\\\"/\\\").slice(0,-1).join(\\\"/\\\");for(moduleName=(base?base+\\\"/\\\":\\\"\\\")+moduleName;-1!==moduleName.indexOf(\\\".\\\")&&previous!=moduleName;){var previous=moduleName;moduleName=moduleName.replace(/^\\\\.\\\\//,\\\"\\\").replace(/\\\\/\\\\.\\\\//,\\\"/\\\").replace(/[^\\\\/]+\\\\/\\\\.\\\\.\\\\//,\\\"\\\")}}return moduleName},window.acequire=function acequire(parentId,id){if(id||(id=parentId,parentId=null),!id.charAt)throw Error(\\\"worker.js acequire() accepts only (parentId, id) as arguments\\\");id=window.normalizeModule(parentId,id);var module=window.acequire.modules[id];if(module)return module.initialized||(module.initialized=!0,module.exports=module.factory().exports),module.exports;if(!window.acequire.tlns)return console.log(\\\"unable to load \\\"+id);var path=resolveModuleId(id,window.acequire.tlns);return\\\".js\\\"!=path.slice(-3)&&(path+=\\\".js\\\"),window.acequire.id=id,window.acequire.modules[id]={},importScripts(path),window.acequire(parentId,id)},window.acequire.modules={},window.acequire.tlns={},window.define=function(id,deps,factory){if(2==arguments.length?(factory=deps,\\\"string\\\"!=typeof id&&(deps=id,id=window.acequire.id)):1==arguments.length&&(factory=id,deps=[],id=window.acequire.id),\\\"function\\\"!=typeof factory)return window.acequire.modules[id]={exports:factory,initialized:!0},void 0;deps.length||(deps=[\\\"require\\\",\\\"exports\\\",\\\"module\\\"]);var req=function(childId){return window.acequire(id,childId)};window.acequire.modules[id]={exports:{},factory:function(){var module=this,returnExports=factory.apply(this,deps.map(function(dep){switch(dep){case\\\"require\\\":return req;case\\\"exports\\\":return module.exports;case\\\"module\\\":return module;default:return req(dep)}}));return returnExports&&(module.exports=returnExports),module}}},window.define.amd={},acequire.tlns={},window.initBaseUrls=function(topLevelNamespaces){for(var i in topLevelNamespaces)acequire.tlns[i]=topLevelNamespaces[i]},window.initSender=function(){var EventEmitter=window.acequire(\\\"ace/lib/event_emitter\\\").EventEmitter,oop=window.acequire(\\\"ace/lib/oop\\\"),Sender=function(){};return function(){oop.implement(this,EventEmitter),this.callback=function(data,callbackId){postMessage({type:\\\"call\\\",id:callbackId,data:data})},this.emit=function(name,data){postMessage({type:\\\"event\\\",name:name,data:data})}}.call(Sender.prototype),new Sender};var main=window.main=null,sender=window.sender=null;window.onmessage=function(e){var msg=e.data;if(msg.event&&sender)sender._signal(msg.event,msg.data);else if(msg.command)if(main[msg.command])main[msg.command].apply(main,msg.args);else{if(!window[msg.command])throw Error(\\\"Unknown command:\\\"+msg.command);window[msg.command].apply(window,msg.args)}else if(msg.init){window.initBaseUrls(msg.tlns),acequire(\\\"ace/lib/es5-shim\\\"),sender=window.sender=window.initSender();var clazz=acequire(msg.module)[msg.classname];main=window.main=new clazz(sender)}}}})(this),ace.define(\\\"ace/lib/oop\\\",[\\\"require\\\",\\\"exports\\\",\\\"module\\\"],function(acequire,exports){\\\"use strict\\\";exports.inherits=function(ctor,superCtor){ctor.super_=superCtor,ctor.prototype=Object.create(superCtor.prototype,{constructor:{value:ctor,enumerable:!1,writable:!0,configurable:!0}})},exports.mixin=function(obj,mixin){for(var key in mixin)obj[key]=mixin[key];return obj},exports.implement=function(proto,mixin){exports.mixin(proto,mixin)}}),ace.define(\\\"ace/range\\\",[\\\"require\\\",\\\"exports\\\",\\\"module\\\"],function(acequire,exports){\\\"use strict\\\";var comparePoints=function(p1,p2){return p1.row-p2.row||p1.column-p2.column},Range=function(startRow,startColumn,endRow,endColumn){this.start={row:startRow,column:startColumn},this.end={row:endRow,column:endColumn}};(function(){this.isEqual=function(range){return this.start.row===range.start.row&&this.end.row===range.end.row&&this.start.column===range.start.column&&this.end.column===range.end.column},this.toString=function(){return\\\"Range: [\\\"+this.start.row+\\\"/\\\"+this.start.column+\\\"] -> [\\\"+this.end.row+\\\"/\\\"+this.end.column+\\\"]\\\"},this.contains=function(row,column){return 0==this.compare(row,column)},this.compareRange=function(range){var cmp,end=range.end,start=range.start;return cmp=this.compare(end.row,end.column),1==cmp?(cmp=this.compare(start.row,start.column),1==cmp?2:0==cmp?1:0):-1==cmp?-2:(cmp=this.compare(start.row,start.column),-1==cmp?-1:1==cmp?42:0)},this.comparePoint=function(p){return this.compare(p.row,p.column)},this.containsRange=function(range){return 0==this.comparePoint(range.start)&&0==this.comparePoint(range.end)},this.intersects=function(range){var cmp=this.compareRange(range);return-1==cmp||0==cmp||1==cmp},this.isEnd=function(row,column){return this.end.row==row&&this.end.column==column},this.isStart=function(row,column){return this.start.row==row&&this.start.column==column},this.setStart=function(row,column){\\\"object\\\"==typeof row?(this.start.column=row.column,this.start.row=row.row):(this.start.row=row,this.start.column=column)},this.setEnd=function(row,column){\\\"object\\\"==typeof row?(this.end.column=row.column,this.end.row=row.row):(this.end.row=row,this.end.column=column)},this.inside=function(row,column){return 0==this.compare(row,column)?this.isEnd(row,column)||this.isStart(row,column)?!1:!0:!1},this.insideStart=function(row,column){return 0==this.compare(row,column)?this.isEnd(row,column)?!1:!0:!1},this.insideEnd=function(row,column){return 0==this.compare(row,column)?this.isStart(row,column)?!1:!0:!1},this.compare=function(row,column){return this.isMultiLine()||row!==this.start.row?this.start.row>row?-1:row>this.end.row?1:this.start.row===row?column>=this.start.column?0:-1:this.end.row===row?this.end.column>=column?0:1:0:this.start.column>column?-1:column>this.end.column?1:0},this.compareStart=function(row,column){return this.start.row==row&&this.start.column==column?-1:this.compare(row,column)},this.compareEnd=function(row,column){return this.end.row==row&&this.end.column==column?1:this.compare(row,column)},this.compareInside=function(row,column){return this.end.row==row&&this.end.column==column?1:this.start.row==row&&this.start.column==column?-1:this.compare(row,column)},this.clipRows=function(firstRow,lastRow){if(this.end.row>lastRow)var end={row:lastRow+1,column:0};else if(firstRow>this.end.row)var end={row:firstRow,column:0};if(this.start.row>lastRow)var start={row:lastRow+1,column:0};else if(firstRow>this.start.row)var start={row:firstRow,column:0};return Range.fromPoints(start||this.start,end||this.end)},this.extend=function(row,column){var cmp=this.compare(row,column);if(0==cmp)return this;if(-1==cmp)var start={row:row,column:column};else var end={row:row,column:column};return Range.fromPoints(start||this.start,end||this.end)},this.isEmpty=function(){return this.start.row===this.end.row&&this.start.column===this.end.column},this.isMultiLine=function(){return this.start.row!==this.end.row},this.clone=function(){return Range.fromPoints(this.start,this.end)},this.collapseRows=function(){return 0==this.end.column?new Range(this.start.row,0,Math.max(this.start.row,this.end.row-1),0):new Range(this.start.row,0,this.end.row,0)},this.toScreenRange=function(session){var screenPosStart=session.documentToScreenPosition(this.start),screenPosEnd=session.documentToScreenPosition(this.end);return new Range(screenPosStart.row,screenPosStart.column,screenPosEnd.row,screenPosEnd.column)},this.moveBy=function(row,column){this.start.row+=row,this.start.column+=column,this.end.row+=row,this.end.column+=column}}).call(Range.prototype),Range.fromPoints=function(start,end){return new Range(start.row,start.column,end.row,end.column)},Range.comparePoints=comparePoints,Range.comparePoints=function(p1,p2){return p1.row-p2.row||p1.column-p2.column},exports.Range=Range}),ace.define(\\\"ace/apply_delta\\\",[\\\"require\\\",\\\"exports\\\",\\\"module\\\"],function(acequire,exports){\\\"use strict\\\";exports.applyDelta=function(docLines,delta){var row=delta.start.row,startColumn=delta.start.column,line=docLines[row]||\\\"\\\";switch(delta.action){case\\\"insert\\\":var lines=delta.lines;if(1===lines.length)docLines[row]=line.substring(0,startColumn)+delta.lines[0]+line.substring(startColumn);else{var args=[row,1].concat(delta.lines);docLines.splice.apply(docLines,args),docLines[row]=line.substring(0,startColumn)+docLines[row],docLines[row+delta.lines.length-1]+=line.substring(startColumn)}break;case\\\"remove\\\":var endColumn=delta.end.column,endRow=delta.end.row;row===endRow?docLines[row]=line.substring(0,startColumn)+line.substring(endColumn):docLines.splice(row,endRow-row+1,line.substring(0,startColumn)+docLines[endRow].substring(endColumn))}}}),ace.define(\\\"ace/lib/event_emitter\\\",[\\\"require\\\",\\\"exports\\\",\\\"module\\\"],function(acequire,exports){\\\"use strict\\\";var EventEmitter={},stopPropagation=function(){this.propagationStopped=!0},preventDefault=function(){this.defaultPrevented=!0};EventEmitter._emit=EventEmitter._dispatchEvent=function(eventName,e){this._eventRegistry||(this._eventRegistry={}),this._defaultHandlers||(this._defaultHandlers={});var listeners=this._eventRegistry[eventName]||[],defaultHandler=this._defaultHandlers[eventName];if(listeners.length||defaultHandler){\\\"object\\\"==typeof e&&e||(e={}),e.type||(e.type=eventName),e.stopPropagation||(e.stopPropagation=stopPropagation),e.preventDefault||(e.preventDefault=preventDefault),listeners=listeners.slice();for(var i=0;listeners.length>i&&(listeners[i](e,this),!e.propagationStopped);i++);return defaultHandler&&!e.defaultPrevented?defaultHandler(e,this):void 0}},EventEmitter._signal=function(eventName,e){var listeners=(this._eventRegistry||{})[eventName];if(listeners){listeners=listeners.slice();for(var i=0;listeners.length>i;i++)listeners[i](e,this)}},EventEmitter.once=function(eventName,callback){var _self=this;callback&&this.addEventListener(eventName,function newCallback(){_self.removeEventListener(eventName,newCallback),callback.apply(null,arguments)})},EventEmitter.setDefaultHandler=function(eventName,callback){var handlers=this._defaultHandlers;if(handlers||(handlers=this._defaultHandlers={_disabled_:{}}),handlers[eventName]){var old=handlers[eventName],disabled=handlers._disabled_[eventName];disabled||(handlers._disabled_[eventName]=disabled=[]),disabled.push(old);var i=disabled.indexOf(callback);-1!=i&&disabled.splice(i,1)}handlers[eventName]=callback},EventEmitter.removeDefaultHandler=function(eventName,callback){var handlers=this._defaultHandlers;if(handlers){var disabled=handlers._disabled_[eventName];if(handlers[eventName]==callback)handlers[eventName],disabled&&this.setDefaultHandler(eventName,disabled.pop());else if(disabled){var i=disabled.indexOf(callback);-1!=i&&disabled.splice(i,1)}}},EventEmitter.on=EventEmitter.addEventListener=function(eventName,callback,capturing){this._eventRegistry=this._eventRegistry||{};var listeners=this._eventRegistry[eventName];return listeners||(listeners=this._eventRegistry[eventName]=[]),-1==listeners.indexOf(callback)&&listeners[capturing?\\\"unshift\\\":\\\"push\\\"](callback),callback},EventEmitter.off=EventEmitter.removeListener=EventEmitter.removeEventListener=function(eventName,callback){this._eventRegistry=this._eventRegistry||{};var listeners=this._eventRegistry[eventName];if(listeners){var index=listeners.indexOf(callback);-1!==index&&listeners.splice(index,1)}},EventEmitter.removeAllListeners=function(eventName){this._eventRegistry&&(this._eventRegistry[eventName]=[])},exports.EventEmitter=EventEmitter}),ace.define(\\\"ace/anchor\\\",[\\\"require\\\",\\\"exports\\\",\\\"module\\\",\\\"ace/lib/oop\\\",\\\"ace/lib/event_emitter\\\"],function(acequire,exports){\\\"use strict\\\";var oop=acequire(\\\"./lib/oop\\\"),EventEmitter=acequire(\\\"./lib/event_emitter\\\").EventEmitter,Anchor=exports.Anchor=function(doc,row,column){this.$onChange=this.onChange.bind(this),this.attach(doc),column===void 0?this.setPosition(row.row,row.column):this.setPosition(row,column)};(function(){function $pointsInOrder(point1,point2,equalPointsInOrder){var bColIsAfter=equalPointsInOrder?point1.column<=point2.column:point1.columnthis.row)){var point=$getTransformedPoint(delta,{row:this.row,column:this.column},this.$insertRight);this.setPosition(point.row,point.column,!0)}},this.setPosition=function(row,column,noClip){var pos;if(pos=noClip?{row:row,column:column}:this.$clipPositionToDocument(row,column),this.row!=pos.row||this.column!=pos.column){var old={row:this.row,column:this.column};this.row=pos.row,this.column=pos.column,this._signal(\\\"change\\\",{old:old,value:pos})}},this.detach=function(){this.document.removeEventListener(\\\"change\\\",this.$onChange)},this.attach=function(doc){this.document=doc||this.document,this.document.on(\\\"change\\\",this.$onChange)},this.$clipPositionToDocument=function(row,column){var pos={};return row>=this.document.getLength()?(pos.row=Math.max(0,this.document.getLength()-1),pos.column=this.document.getLine(pos.row).length):0>row?(pos.row=0,pos.column=0):(pos.row=row,pos.column=Math.min(this.document.getLine(pos.row).length,Math.max(0,column))),0>column&&(pos.column=0),pos}}).call(Anchor.prototype)}),ace.define(\\\"ace/document\\\",[\\\"require\\\",\\\"exports\\\",\\\"module\\\",\\\"ace/lib/oop\\\",\\\"ace/apply_delta\\\",\\\"ace/lib/event_emitter\\\",\\\"ace/range\\\",\\\"ace/anchor\\\"],function(acequire,exports){\\\"use strict\\\";var oop=acequire(\\\"./lib/oop\\\"),applyDelta=acequire(\\\"./apply_delta\\\").applyDelta,EventEmitter=acequire(\\\"./lib/event_emitter\\\").EventEmitter,Range=acequire(\\\"./range\\\").Range,Anchor=acequire(\\\"./anchor\\\").Anchor,Document=function(textOrLines){this.$lines=[\\\"\\\"],0===textOrLines.length?this.$lines=[\\\"\\\"]:Array.isArray(textOrLines)?this.insertMergedLines({row:0,column:0},textOrLines):this.insert({row:0,column:0},textOrLines)};(function(){oop.implement(this,EventEmitter),this.setValue=function(text){var len=this.getLength()-1;this.remove(new Range(0,0,len,this.getLine(len).length)),this.insert({row:0,column:0},text)},this.getValue=function(){return this.getAllLines().join(this.getNewLineCharacter())},this.createAnchor=function(row,column){return new Anchor(this,row,column)},this.$split=0===\\\"aaa\\\".split(/a/).length?function(text){return text.replace(/\\\\r\\\\n|\\\\r/g,\\\"\\\\n\\\").split(\\\"\\\\n\\\")}:function(text){return text.split(/\\\\r\\\\n|\\\\r|\\\\n/)},this.$detectNewLine=function(text){var match=text.match(/^.*?(\\\\r\\\\n|\\\\r|\\\\n)/m);this.$autoNewLine=match?match[1]:\\\"\\\\n\\\",this._signal(\\\"changeNewLineMode\\\")},this.getNewLineCharacter=function(){switch(this.$newLineMode){case\\\"windows\\\":return\\\"\\\\r\\\\n\\\";case\\\"unix\\\":return\\\"\\\\n\\\";default:return this.$autoNewLine||\\\"\\\\n\\\"}},this.$autoNewLine=\\\"\\\",this.$newLineMode=\\\"auto\\\",this.setNewLineMode=function(newLineMode){this.$newLineMode!==newLineMode&&(this.$newLineMode=newLineMode,this._signal(\\\"changeNewLineMode\\\"))},this.getNewLineMode=function(){return this.$newLineMode},this.isNewLine=function(text){return\\\"\\\\r\\\\n\\\"==text||\\\"\\\\r\\\"==text||\\\"\\\\n\\\"==text},this.getLine=function(row){return this.$lines[row]||\\\"\\\"},this.getLines=function(firstRow,lastRow){return this.$lines.slice(firstRow,lastRow+1)},this.getAllLines=function(){return this.getLines(0,this.getLength())},this.getLength=function(){return this.$lines.length},this.getTextRange=function(range){return this.getLinesForRange(range).join(this.getNewLineCharacter())},this.getLinesForRange=function(range){var lines;if(range.start.row===range.end.row)lines=[this.getLine(range.start.row).substring(range.start.column,range.end.column)];else{lines=this.getLines(range.start.row,range.end.row),lines[0]=(lines[0]||\\\"\\\").substring(range.start.column);var l=lines.length-1;range.end.row-range.start.row==l&&(lines[l]=lines[l].substring(0,range.end.column))}return lines},this.insertLines=function(row,lines){return console.warn(\\\"Use of document.insertLines is deprecated. Use the insertFullLines method instead.\\\"),this.insertFullLines(row,lines)},this.removeLines=function(firstRow,lastRow){return console.warn(\\\"Use of document.removeLines is deprecated. Use the removeFullLines method instead.\\\"),this.removeFullLines(firstRow,lastRow)},this.insertNewLine=function(position){return console.warn(\\\"Use of document.insertNewLine is deprecated. Use insertMergedLines(position, ['', '']) instead.\\\"),this.insertMergedLines(position,[\\\"\\\",\\\"\\\"])},this.insert=function(position,text){return 1>=this.getLength()&&this.$detectNewLine(text),this.insertMergedLines(position,this.$split(text))},this.insertInLine=function(position,text){var start=this.clippedPos(position.row,position.column),end=this.pos(position.row,position.column+text.length);return this.applyDelta({start:start,end:end,action:\\\"insert\\\",lines:[text]},!0),this.clonePos(end)},this.clippedPos=function(row,column){var length=this.getLength();void 0===row?row=length:0>row?row=0:row>=length&&(row=length-1,column=void 0);var line=this.getLine(row);return void 0==column&&(column=line.length),column=Math.min(Math.max(column,0),line.length),{row:row,column:column}},this.clonePos=function(pos){return{row:pos.row,column:pos.column}},this.pos=function(row,column){return{row:row,column:column}},this.$clipPosition=function(position){var length=this.getLength();return position.row>=length?(position.row=Math.max(0,length-1),position.column=this.getLine(length-1).length):(position.row=Math.max(0,position.row),position.column=Math.min(Math.max(position.column,0),this.getLine(position.row).length)),position},this.insertFullLines=function(row,lines){row=Math.min(Math.max(row,0),this.getLength());var column=0;this.getLength()>row?(lines=lines.concat([\\\"\\\"]),column=0):(lines=[\\\"\\\"].concat(lines),row--,column=this.$lines[row].length),this.insertMergedLines({row:row,column:column},lines)},this.insertMergedLines=function(position,lines){var start=this.clippedPos(position.row,position.column),end={row:start.row+lines.length-1,column:(1==lines.length?start.column:0)+lines[lines.length-1].length};return this.applyDelta({start:start,end:end,action:\\\"insert\\\",lines:lines}),this.clonePos(end)},this.remove=function(range){var start=this.clippedPos(range.start.row,range.start.column),end=this.clippedPos(range.end.row,range.end.column);return this.applyDelta({start:start,end:end,action:\\\"remove\\\",lines:this.getLinesForRange({start:start,end:end})}),this.clonePos(start)},this.removeInLine=function(row,startColumn,endColumn){var start=this.clippedPos(row,startColumn),end=this.clippedPos(row,endColumn);return this.applyDelta({start:start,end:end,action:\\\"remove\\\",lines:this.getLinesForRange({start:start,end:end})},!0),this.clonePos(start)},this.removeFullLines=function(firstRow,lastRow){firstRow=Math.min(Math.max(0,firstRow),this.getLength()-1),lastRow=Math.min(Math.max(0,lastRow),this.getLength()-1);var deleteFirstNewLine=lastRow==this.getLength()-1&&firstRow>0,deleteLastNewLine=this.getLength()-1>lastRow,startRow=deleteFirstNewLine?firstRow-1:firstRow,startCol=deleteFirstNewLine?this.getLine(startRow).length:0,endRow=deleteLastNewLine?lastRow+1:lastRow,endCol=deleteLastNewLine?0:this.getLine(endRow).length,range=new Range(startRow,startCol,endRow,endCol),deletedLines=this.$lines.slice(firstRow,lastRow+1);return this.applyDelta({start:range.start,end:range.end,action:\\\"remove\\\",lines:this.getLinesForRange(range)}),deletedLines},this.removeNewLine=function(row){this.getLength()-1>row&&row>=0&&this.applyDelta({start:this.pos(row,this.getLine(row).length),end:this.pos(row+1,0),action:\\\"remove\\\",lines:[\\\"\\\",\\\"\\\"]})},this.replace=function(range,text){if(range instanceof Range||(range=Range.fromPoints(range.start,range.end)),0===text.length&&range.isEmpty())return range.start;if(text==this.getTextRange(range))return range.end;this.remove(range);var end;return end=text?this.insert(range.start,text):range.start},this.applyDeltas=function(deltas){for(var i=0;deltas.length>i;i++)this.applyDelta(deltas[i])},this.revertDeltas=function(deltas){for(var i=deltas.length-1;i>=0;i--)this.revertDelta(deltas[i])},this.applyDelta=function(delta,doNotValidate){var isInsert=\\\"insert\\\"==delta.action;(isInsert?1>=delta.lines.length&&!delta.lines[0]:!Range.comparePoints(delta.start,delta.end))||(isInsert&&delta.lines.length>2e4&&this.$splitAndapplyLargeDelta(delta,2e4),applyDelta(this.$lines,delta,doNotValidate),this._signal(\\\"change\\\",delta))},this.$splitAndapplyLargeDelta=function(delta,MAX){for(var lines=delta.lines,l=lines.length,row=delta.start.row,column=delta.start.column,from=0,to=0;;){from=to,to+=MAX-1;var chunk=lines.slice(from,to);if(to>l){delta.lines=chunk,delta.start.row=row+from,delta.start.column=column;break}chunk.push(\\\"\\\"),this.applyDelta({start:this.pos(row+from,column),end:this.pos(row+to,column=0),action:delta.action,lines:chunk},!0)}},this.revertDelta=function(delta){this.applyDelta({start:this.clonePos(delta.start),end:this.clonePos(delta.end),action:\\\"insert\\\"==delta.action?\\\"remove\\\":\\\"insert\\\",lines:delta.lines.slice()})},this.indexToPosition=function(index,startRow){for(var lines=this.$lines||this.getAllLines(),newlineLength=this.getNewLineCharacter().length,i=startRow||0,l=lines.length;l>i;i++)if(index-=lines[i].length+newlineLength,0>index)return{row:i,column:index+lines[i].length+newlineLength};return{row:l-1,column:lines[l-1].length}},this.positionToIndex=function(pos,startRow){for(var lines=this.$lines||this.getAllLines(),newlineLength=this.getNewLineCharacter().length,index=0,row=Math.min(pos.row,lines.length),i=startRow||0;row>i;++i)index+=lines[i].length+newlineLength;return index+pos.column}}).call(Document.prototype),exports.Document=Document}),ace.define(\\\"ace/lib/lang\\\",[\\\"require\\\",\\\"exports\\\",\\\"module\\\"],function(acequire,exports){\\\"use strict\\\";exports.last=function(a){return a[a.length-1]},exports.stringReverse=function(string){return string.split(\\\"\\\").reverse().join(\\\"\\\")},exports.stringRepeat=function(string,count){for(var result=\\\"\\\";count>0;)1&count&&(result+=string),(count>>=1)&&(string+=string);return result};var trimBeginRegexp=/^\\\\s\\\\s*/,trimEndRegexp=/\\\\s\\\\s*$/;exports.stringTrimLeft=function(string){return string.replace(trimBeginRegexp,\\\"\\\")},exports.stringTrimRight=function(string){return string.replace(trimEndRegexp,\\\"\\\")},exports.copyObject=function(obj){var copy={};for(var key in obj)copy[key]=obj[key];return copy},exports.copyArray=function(array){for(var copy=[],i=0,l=array.length;l>i;i++)copy[i]=array[i]&&\\\"object\\\"==typeof array[i]?this.copyObject(array[i]):array[i];return copy},exports.deepCopy=function deepCopy(obj){if(\\\"object\\\"!=typeof obj||!obj)return obj;var copy;if(Array.isArray(obj)){copy=[];for(var key=0;obj.length>key;key++)copy[key]=deepCopy(obj[key]);return copy}var cons=obj.constructor;if(cons===RegExp)return obj;copy=cons();for(var key in obj)copy[key]=deepCopy(obj[key]);return copy},exports.arrayToMap=function(arr){for(var map={},i=0;arr.length>i;i++)map[arr[i]]=1;return map},exports.createMap=function(props){var map=Object.create(null);for(var i in props)map[i]=props[i];return map},exports.arrayRemove=function(array,value){for(var i=0;array.length>=i;i++)value===array[i]&&array.splice(i,1)},exports.escapeRegExp=function(str){return str.replace(/([.*+?^${}()|[\\\\]\\\\/\\\\\\\\])/g,\\\"\\\\\\\\$1\\\")},exports.escapeHTML=function(str){return str.replace(/&/g,\\\"&\\\").replace(/\\\"/g,\\\""\\\").replace(/'/g,\\\"'\\\").replace(/i;i+=2){if(Array.isArray(data[i+1]))var d={action:\\\"insert\\\",start:data[i],lines:data[i+1]};else var d={action:\\\"remove\\\",start:data[i],end:data[i+1]};doc.applyDelta(d,!0)}return _self.$timeout?deferredUpdate.schedule(_self.$timeout):(_self.onUpdate(),void 0)})};(function(){this.$timeout=500,this.setTimeout=function(timeout){this.$timeout=timeout},this.setValue=function(value){this.doc.setValue(value),this.deferredUpdate.schedule(this.$timeout)},this.getValue=function(callbackId){this.sender.callback(this.doc.getValue(),callbackId)},this.onUpdate=function(){},this.isPending=function(){return this.deferredUpdate.isPending()}}).call(Mirror.prototype)}),ace.define(\\\"ace/mode/json/json_parse\\\",[\\\"require\\\",\\\"exports\\\",\\\"module\\\"],function(){\\\"use strict\\\";var at,ch,text,value,escapee={'\\\"':'\\\"',\\\"\\\\\\\\\\\":\\\"\\\\\\\\\\\",\\\"/\\\":\\\"/\\\",b:\\\"\\\\b\\\",f:\\\"\\\\f\\\",n:\\\"\\\\n\\\",r:\\\"\\\\r\\\",t:\\\"\\t\\\"},error=function(m){throw{name:\\\"SyntaxError\\\",message:m,at:at,text:text}},next=function(c){return c&&c!==ch&&error(\\\"Expected '\\\"+c+\\\"' instead of '\\\"+ch+\\\"'\\\"),ch=text.charAt(at),at+=1,ch},number=function(){var number,string=\\\"\\\";for(\\\"-\\\"===ch&&(string=\\\"-\\\",next(\\\"-\\\"));ch>=\\\"0\\\"&&\\\"9\\\">=ch;)string+=ch,next();if(\\\".\\\"===ch)for(string+=\\\".\\\";next()&&ch>=\\\"0\\\"&&\\\"9\\\">=ch;)string+=ch;if(\\\"e\\\"===ch||\\\"E\\\"===ch)for(string+=ch,next(),(\\\"-\\\"===ch||\\\"+\\\"===ch)&&(string+=ch,next());ch>=\\\"0\\\"&&\\\"9\\\">=ch;)string+=ch,next();return number=+string,isNaN(number)?(error(\\\"Bad number\\\"),void 0):number},string=function(){var hex,i,uffff,string=\\\"\\\";if('\\\"'===ch)for(;next();){if('\\\"'===ch)return next(),string;if(\\\"\\\\\\\\\\\"===ch)if(next(),\\\"u\\\"===ch){for(uffff=0,i=0;4>i&&(hex=parseInt(next(),16),isFinite(hex));i+=1)uffff=16*uffff+hex;string+=String.fromCharCode(uffff)}else{if(\\\"string\\\"!=typeof escapee[ch])break;string+=escapee[ch]}else string+=ch}error(\\\"Bad string\\\")},white=function(){for(;ch&&\\\" \\\">=ch;)next()},word=function(){switch(ch){case\\\"t\\\":return next(\\\"t\\\"),next(\\\"r\\\"),next(\\\"u\\\"),next(\\\"e\\\"),!0;case\\\"f\\\":return next(\\\"f\\\"),next(\\\"a\\\"),next(\\\"l\\\"),next(\\\"s\\\"),next(\\\"e\\\"),!1;case\\\"n\\\":return next(\\\"n\\\"),next(\\\"u\\\"),next(\\\"l\\\"),next(\\\"l\\\"),null}error(\\\"Unexpected '\\\"+ch+\\\"'\\\")},array=function(){var array=[];if(\\\"[\\\"===ch){if(next(\\\"[\\\"),white(),\\\"]\\\"===ch)return next(\\\"]\\\"),array;for(;ch;){if(array.push(value()),white(),\\\"]\\\"===ch)return next(\\\"]\\\"),array;next(\\\",\\\"),white()}}error(\\\"Bad array\\\")},object=function(){var key,object={};if(\\\"{\\\"===ch){if(next(\\\"{\\\"),white(),\\\"}\\\"===ch)return next(\\\"}\\\"),object;for(;ch;){if(key=string(),white(),next(\\\":\\\"),Object.hasOwnProperty.call(object,key)&&error('Duplicate key \\\"'+key+'\\\"'),object[key]=value(),white(),\\\"}\\\"===ch)return next(\\\"}\\\"),object;next(\\\",\\\"),white()}}error(\\\"Bad object\\\")};return value=function(){switch(white(),ch){case\\\"{\\\":return object();case\\\"[\\\":return array();case'\\\"':return string();case\\\"-\\\":return number();default:return ch>=\\\"0\\\"&&\\\"9\\\">=ch?number():word()}},function(source,reviver){var result;return text=source,at=0,ch=\\\" \\\",result=value(),white(),ch&&error(\\\"Syntax error\\\"),\\\"function\\\"==typeof reviver?function walk(holder,key){var k,v,value=holder[key];if(value&&\\\"object\\\"==typeof value)for(k in value)Object.hasOwnProperty.call(value,k)&&(v=walk(value,k),void 0!==v?value[k]=v:delete value[k]);return reviver.call(holder,key,value)}({\\\"\\\":result},\\\"\\\"):result}}),ace.define(\\\"ace/mode/json_worker\\\",[\\\"require\\\",\\\"exports\\\",\\\"module\\\",\\\"ace/lib/oop\\\",\\\"ace/worker/mirror\\\",\\\"ace/mode/json/json_parse\\\"],function(acequire,exports){\\\"use strict\\\";var oop=acequire(\\\"../lib/oop\\\"),Mirror=acequire(\\\"../worker/mirror\\\").Mirror,parse=acequire(\\\"./json/json_parse\\\"),JsonWorker=exports.JsonWorker=function(sender){Mirror.call(this,sender),this.setTimeout(200)};oop.inherits(JsonWorker,Mirror),function(){this.onUpdate=function(){var value=this.doc.getValue(),errors=[];try{value&&parse(value)}catch(e){var pos=this.doc.indexToPosition(e.at-1);errors.push({row:pos.row,column:pos.column,text:e.message,type:\\\"error\\\"})}this.sender.emit(\\\"annotate\\\",errors)}}.call(JsonWorker.prototype)}),ace.define(\\\"ace/lib/es5-shim\\\",[\\\"require\\\",\\\"exports\\\",\\\"module\\\"],function(){function Empty(){}function doesDefinePropertyWork(object){try{return Object.defineProperty(object,\\\"sentinel\\\",{}),\\\"sentinel\\\"in object}catch(exception){}}function toInteger(n){return n=+n,n!==n?n=0:0!==n&&n!==1/0&&n!==-(1/0)&&(n=(n>0||-1)*Math.floor(Math.abs(n))),n}Function.prototype.bind||(Function.prototype.bind=function(that){var target=this;if(\\\"function\\\"!=typeof target)throw new TypeError(\\\"Function.prototype.bind called on incompatible \\\"+target);var args=slice.call(arguments,1),bound=function(){if(this instanceof bound){var result=target.apply(this,args.concat(slice.call(arguments)));return Object(result)===result?result:this}return target.apply(that,args.concat(slice.call(arguments)))};return target.prototype&&(Empty.prototype=target.prototype,bound.prototype=new Empty,Empty.prototype=null),bound});var defineGetter,defineSetter,lookupGetter,lookupSetter,supportsAccessors,call=Function.prototype.call,prototypeOfArray=Array.prototype,prototypeOfObject=Object.prototype,slice=prototypeOfArray.slice,_toString=call.bind(prototypeOfObject.toString),owns=call.bind(prototypeOfObject.hasOwnProperty);if((supportsAccessors=owns(prototypeOfObject,\\\"__defineGetter__\\\"))&&(defineGetter=call.bind(prototypeOfObject.__defineGetter__),defineSetter=call.bind(prototypeOfObject.__defineSetter__),lookupGetter=call.bind(prototypeOfObject.__lookupGetter__),lookupSetter=call.bind(prototypeOfObject.__lookupSetter__)),2!=[1,2].splice(0).length)if(function(){function makeArray(l){var a=Array(l+2);return a[0]=a[1]=0,a}var lengthBefore,array=[];return array.splice.apply(array,makeArray(20)),array.splice.apply(array,makeArray(26)),lengthBefore=array.length,array.splice(5,0,\\\"XXX\\\"),lengthBefore+1==array.length,lengthBefore+1==array.length?!0:void 0\\n}()){var array_splice=Array.prototype.splice;Array.prototype.splice=function(start,deleteCount){return arguments.length?array_splice.apply(this,[void 0===start?0:start,void 0===deleteCount?this.length-start:deleteCount].concat(slice.call(arguments,2))):[]}}else Array.prototype.splice=function(pos,removeCount){var length=this.length;pos>0?pos>length&&(pos=length):void 0==pos?pos=0:0>pos&&(pos=Math.max(length+pos,0)),length>pos+removeCount||(removeCount=length-pos);var removed=this.slice(pos,pos+removeCount),insert=slice.call(arguments,2),add=insert.length;if(pos===length)add&&this.push.apply(this,insert);else{var remove=Math.min(removeCount,length-pos),tailOldPos=pos+remove,tailNewPos=tailOldPos+add-remove,tailCount=length-tailOldPos,lengthAfterRemove=length-remove;if(tailOldPos>tailNewPos)for(var i=0;tailCount>i;++i)this[tailNewPos+i]=this[tailOldPos+i];else if(tailNewPos>tailOldPos)for(i=tailCount;i--;)this[tailNewPos+i]=this[tailOldPos+i];if(add&&pos===lengthAfterRemove)this.length=lengthAfterRemove,this.push.apply(this,insert);else for(this.length=lengthAfterRemove+add,i=0;add>i;++i)this[pos+i]=insert[i]}return removed};Array.isArray||(Array.isArray=function(obj){return\\\"[object Array]\\\"==_toString(obj)});var boxedString=Object(\\\"a\\\"),splitString=\\\"a\\\"!=boxedString[0]||!(0 in boxedString);if(Array.prototype.forEach||(Array.prototype.forEach=function(fun){var object=toObject(this),self=splitString&&\\\"[object String]\\\"==_toString(this)?this.split(\\\"\\\"):object,thisp=arguments[1],i=-1,length=self.length>>>0;if(\\\"[object Function]\\\"!=_toString(fun))throw new TypeError;for(;length>++i;)i in self&&fun.call(thisp,self[i],i,object)}),Array.prototype.map||(Array.prototype.map=function(fun){var object=toObject(this),self=splitString&&\\\"[object String]\\\"==_toString(this)?this.split(\\\"\\\"):object,length=self.length>>>0,result=Array(length),thisp=arguments[1];if(\\\"[object Function]\\\"!=_toString(fun))throw new TypeError(fun+\\\" is not a function\\\");for(var i=0;length>i;i++)i in self&&(result[i]=fun.call(thisp,self[i],i,object));return result}),Array.prototype.filter||(Array.prototype.filter=function(fun){var value,object=toObject(this),self=splitString&&\\\"[object String]\\\"==_toString(this)?this.split(\\\"\\\"):object,length=self.length>>>0,result=[],thisp=arguments[1];if(\\\"[object Function]\\\"!=_toString(fun))throw new TypeError(fun+\\\" is not a function\\\");for(var i=0;length>i;i++)i in self&&(value=self[i],fun.call(thisp,value,i,object)&&result.push(value));return result}),Array.prototype.every||(Array.prototype.every=function(fun){var object=toObject(this),self=splitString&&\\\"[object String]\\\"==_toString(this)?this.split(\\\"\\\"):object,length=self.length>>>0,thisp=arguments[1];if(\\\"[object Function]\\\"!=_toString(fun))throw new TypeError(fun+\\\" is not a function\\\");for(var i=0;length>i;i++)if(i in self&&!fun.call(thisp,self[i],i,object))return!1;return!0}),Array.prototype.some||(Array.prototype.some=function(fun){var object=toObject(this),self=splitString&&\\\"[object String]\\\"==_toString(this)?this.split(\\\"\\\"):object,length=self.length>>>0,thisp=arguments[1];if(\\\"[object Function]\\\"!=_toString(fun))throw new TypeError(fun+\\\" is not a function\\\");for(var i=0;length>i;i++)if(i in self&&fun.call(thisp,self[i],i,object))return!0;return!1}),Array.prototype.reduce||(Array.prototype.reduce=function(fun){var object=toObject(this),self=splitString&&\\\"[object String]\\\"==_toString(this)?this.split(\\\"\\\"):object,length=self.length>>>0;if(\\\"[object Function]\\\"!=_toString(fun))throw new TypeError(fun+\\\" is not a function\\\");if(!length&&1==arguments.length)throw new TypeError(\\\"reduce of empty array with no initial value\\\");var result,i=0;if(arguments.length>=2)result=arguments[1];else for(;;){if(i in self){result=self[i++];break}if(++i>=length)throw new TypeError(\\\"reduce of empty array with no initial value\\\")}for(;length>i;i++)i in self&&(result=fun.call(void 0,result,self[i],i,object));return result}),Array.prototype.reduceRight||(Array.prototype.reduceRight=function(fun){var object=toObject(this),self=splitString&&\\\"[object String]\\\"==_toString(this)?this.split(\\\"\\\"):object,length=self.length>>>0;if(\\\"[object Function]\\\"!=_toString(fun))throw new TypeError(fun+\\\" is not a function\\\");if(!length&&1==arguments.length)throw new TypeError(\\\"reduceRight of empty array with no initial value\\\");var result,i=length-1;if(arguments.length>=2)result=arguments[1];else for(;;){if(i in self){result=self[i--];break}if(0>--i)throw new TypeError(\\\"reduceRight of empty array with no initial value\\\")}do i in this&&(result=fun.call(void 0,result,self[i],i,object));while(i--);return result}),Array.prototype.indexOf&&-1==[0,1].indexOf(1,2)||(Array.prototype.indexOf=function(sought){var self=splitString&&\\\"[object String]\\\"==_toString(this)?this.split(\\\"\\\"):toObject(this),length=self.length>>>0;if(!length)return-1;var i=0;for(arguments.length>1&&(i=toInteger(arguments[1])),i=i>=0?i:Math.max(0,length+i);length>i;i++)if(i in self&&self[i]===sought)return i;return-1}),Array.prototype.lastIndexOf&&-1==[0,1].lastIndexOf(0,-3)||(Array.prototype.lastIndexOf=function(sought){var self=splitString&&\\\"[object String]\\\"==_toString(this)?this.split(\\\"\\\"):toObject(this),length=self.length>>>0;if(!length)return-1;var i=length-1;for(arguments.length>1&&(i=Math.min(i,toInteger(arguments[1]))),i=i>=0?i:length-Math.abs(i);i>=0;i--)if(i in self&&sought===self[i])return i;return-1}),Object.getPrototypeOf||(Object.getPrototypeOf=function(object){return object.__proto__||(object.constructor?object.constructor.prototype:prototypeOfObject)}),!Object.getOwnPropertyDescriptor){var ERR_NON_OBJECT=\\\"Object.getOwnPropertyDescriptor called on a non-object: \\\";Object.getOwnPropertyDescriptor=function(object,property){if(\\\"object\\\"!=typeof object&&\\\"function\\\"!=typeof object||null===object)throw new TypeError(ERR_NON_OBJECT+object);if(owns(object,property)){var descriptor,getter,setter;if(descriptor={enumerable:!0,configurable:!0},supportsAccessors){var prototype=object.__proto__;object.__proto__=prototypeOfObject;var getter=lookupGetter(object,property),setter=lookupSetter(object,property);if(object.__proto__=prototype,getter||setter)return getter&&(descriptor.get=getter),setter&&(descriptor.set=setter),descriptor}return descriptor.value=object[property],descriptor}}}if(Object.getOwnPropertyNames||(Object.getOwnPropertyNames=function(object){return Object.keys(object)}),!Object.create){var createEmpty;createEmpty=null===Object.prototype.__proto__?function(){return{__proto__:null}}:function(){var empty={};for(var i in empty)empty[i]=null;return empty.constructor=empty.hasOwnProperty=empty.propertyIsEnumerable=empty.isPrototypeOf=empty.toLocaleString=empty.toString=empty.valueOf=empty.__proto__=null,empty},Object.create=function(prototype,properties){var object;if(null===prototype)object=createEmpty();else{if(\\\"object\\\"!=typeof prototype)throw new TypeError(\\\"typeof prototype[\\\"+typeof prototype+\\\"] != 'object'\\\");var Type=function(){};Type.prototype=prototype,object=new Type,object.__proto__=prototype}return void 0!==properties&&Object.defineProperties(object,properties),object}}if(Object.defineProperty){var definePropertyWorksOnObject=doesDefinePropertyWork({}),definePropertyWorksOnDom=\\\"undefined\\\"==typeof document||doesDefinePropertyWork(document.createElement(\\\"div\\\"));if(!definePropertyWorksOnObject||!definePropertyWorksOnDom)var definePropertyFallback=Object.defineProperty}if(!Object.defineProperty||definePropertyFallback){var ERR_NON_OBJECT_DESCRIPTOR=\\\"Property description must be an object: \\\",ERR_NON_OBJECT_TARGET=\\\"Object.defineProperty called on non-object: \\\",ERR_ACCESSORS_NOT_SUPPORTED=\\\"getters & setters can not be defined on this javascript engine\\\";Object.defineProperty=function(object,property,descriptor){if(\\\"object\\\"!=typeof object&&\\\"function\\\"!=typeof object||null===object)throw new TypeError(ERR_NON_OBJECT_TARGET+object);if(\\\"object\\\"!=typeof descriptor&&\\\"function\\\"!=typeof descriptor||null===descriptor)throw new TypeError(ERR_NON_OBJECT_DESCRIPTOR+descriptor);if(definePropertyFallback)try{return definePropertyFallback.call(Object,object,property,descriptor)}catch(exception){}if(owns(descriptor,\\\"value\\\"))if(supportsAccessors&&(lookupGetter(object,property)||lookupSetter(object,property))){var prototype=object.__proto__;object.__proto__=prototypeOfObject,delete object[property],object[property]=descriptor.value,object.__proto__=prototype}else object[property]=descriptor.value;else{if(!supportsAccessors)throw new TypeError(ERR_ACCESSORS_NOT_SUPPORTED);owns(descriptor,\\\"get\\\")&&defineGetter(object,property,descriptor.get),owns(descriptor,\\\"set\\\")&&defineSetter(object,property,descriptor.set)}return object}}Object.defineProperties||(Object.defineProperties=function(object,properties){for(var property in properties)owns(properties,property)&&Object.defineProperty(object,property,properties[property]);return object}),Object.seal||(Object.seal=function(object){return object}),Object.freeze||(Object.freeze=function(object){return object});try{Object.freeze(function(){})}catch(exception){Object.freeze=function(freezeObject){return function(object){return\\\"function\\\"==typeof object?object:freezeObject(object)}}(Object.freeze)}if(Object.preventExtensions||(Object.preventExtensions=function(object){return object}),Object.isSealed||(Object.isSealed=function(){return!1}),Object.isFrozen||(Object.isFrozen=function(){return!1}),Object.isExtensible||(Object.isExtensible=function(object){if(Object(object)===object)throw new TypeError;for(var name=\\\"\\\";owns(object,name);)name+=\\\"?\\\";object[name]=!0;var returnValue=owns(object,name);return delete object[name],returnValue}),!Object.keys){var hasDontEnumBug=!0,dontEnums=[\\\"toString\\\",\\\"toLocaleString\\\",\\\"valueOf\\\",\\\"hasOwnProperty\\\",\\\"isPrototypeOf\\\",\\\"propertyIsEnumerable\\\",\\\"constructor\\\"],dontEnumsLength=dontEnums.length;for(var key in{toString:null})hasDontEnumBug=!1;Object.keys=function(object){if(\\\"object\\\"!=typeof object&&\\\"function\\\"!=typeof object||null===object)throw new TypeError(\\\"Object.keys called on a non-object\\\");var keys=[];for(var name in object)owns(object,name)&&keys.push(name);if(hasDontEnumBug)for(var i=0,ii=dontEnumsLength;ii>i;i++){var dontEnum=dontEnums[i];owns(object,dontEnum)&&keys.push(dontEnum)}return keys}}Date.now||(Date.now=function(){return(new Date).getTime()});var ws=\\\"\\t\\\\n\\u000b\\\\f\\\\r   ᠎              \\\\u2028\\\\u2029\\\";if(!String.prototype.trim||ws.trim()){ws=\\\"[\\\"+ws+\\\"]\\\";var trimBeginRegexp=RegExp(\\\"^\\\"+ws+ws+\\\"*\\\"),trimEndRegexp=RegExp(ws+ws+\\\"*$\\\");String.prototype.trim=function(){return(this+\\\"\\\").replace(trimBeginRegexp,\\\"\\\").replace(trimEndRegexp,\\\"\\\")}}var toObject=function(o){if(null==o)throw new TypeError(\\\"can't convert \\\"+o+\\\" to object\\\");return Object(o)}});\";\n\n/***/ },\n/* 16 */\n/***/ function(module, exports) {\n\n\tace.define(\"ace/ext/searchbox\",[\"require\",\"exports\",\"module\",\"ace/lib/dom\",\"ace/lib/lang\",\"ace/lib/event\",\"ace/keyboard/hash_handler\",\"ace/lib/keys\"], function(acequire, exports, module) {\n\t\"use strict\";\n\n\tvar dom = acequire(\"../lib/dom\");\n\tvar lang = acequire(\"../lib/lang\");\n\tvar event = acequire(\"../lib/event\");\n\tvar searchboxCss = \"\\\n\t.ace_search {\\\n\tbackground-color: #ddd;\\\n\tborder: 1px solid #cbcbcb;\\\n\tborder-top: 0 none;\\\n\tmax-width: 325px;\\\n\toverflow: hidden;\\\n\tmargin: 0;\\\n\tpadding: 4px;\\\n\tpadding-right: 6px;\\\n\tpadding-bottom: 0;\\\n\tposition: absolute;\\\n\ttop: 0px;\\\n\tz-index: 99;\\\n\twhite-space: normal;\\\n\t}\\\n\t.ace_search.left {\\\n\tborder-left: 0 none;\\\n\tborder-radius: 0px 0px 5px 0px;\\\n\tleft: 0;\\\n\t}\\\n\t.ace_search.right {\\\n\tborder-radius: 0px 0px 0px 5px;\\\n\tborder-right: 0 none;\\\n\tright: 0;\\\n\t}\\\n\t.ace_search_form, .ace_replace_form {\\\n\tborder-radius: 3px;\\\n\tborder: 1px solid #cbcbcb;\\\n\tfloat: left;\\\n\tmargin-bottom: 4px;\\\n\toverflow: hidden;\\\n\t}\\\n\t.ace_search_form.ace_nomatch {\\\n\toutline: 1px solid red;\\\n\t}\\\n\t.ace_search_field {\\\n\tbackground-color: white;\\\n\tborder-right: 1px solid #cbcbcb;\\\n\tborder: 0 none;\\\n\t-webkit-box-sizing: border-box;\\\n\t-moz-box-sizing: border-box;\\\n\tbox-sizing: border-box;\\\n\tfloat: left;\\\n\theight: 22px;\\\n\toutline: 0;\\\n\tpadding: 0 7px;\\\n\twidth: 214px;\\\n\tmargin: 0;\\\n\t}\\\n\t.ace_searchbtn,\\\n\t.ace_replacebtn {\\\n\tbackground: #fff;\\\n\tborder: 0 none;\\\n\tborder-left: 1px solid #dcdcdc;\\\n\tcursor: pointer;\\\n\tfloat: left;\\\n\theight: 22px;\\\n\tmargin: 0;\\\n\tposition: relative;\\\n\t}\\\n\t.ace_searchbtn:last-child,\\\n\t.ace_replacebtn:last-child {\\\n\tborder-top-right-radius: 3px;\\\n\tborder-bottom-right-radius: 3px;\\\n\t}\\\n\t.ace_searchbtn:disabled {\\\n\tbackground: none;\\\n\tcursor: default;\\\n\t}\\\n\t.ace_searchbtn {\\\n\tbackground-position: 50% 50%;\\\n\tbackground-repeat: no-repeat;\\\n\twidth: 27px;\\\n\t}\\\n\t.ace_searchbtn.prev {\\\n\tbackground-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAFCAYAAAB4ka1VAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAADFJREFUeNpiSU1NZUAC/6E0I0yACYskCpsJiySKIiY0SUZk40FyTEgCjGgKwTRAgAEAQJUIPCE+qfkAAAAASUVORK5CYII=); \\\n\t}\\\n\t.ace_searchbtn.next {\\\n\tbackground-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAFCAYAAAB4ka1VAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAADRJREFUeNpiTE1NZQCC/0DMyIAKwGJMUAYDEo3M/s+EpvM/mkKwCQxYjIeLMaELoLMBAgwAU7UJObTKsvAAAAAASUVORK5CYII=); \\\n\t}\\\n\t.ace_searchbtn_close {\\\n\tbackground: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAcCAYAAABRVo5BAAAAZ0lEQVR42u2SUQrAMAhDvazn8OjZBilCkYVVxiis8H4CT0VrAJb4WHT3C5xU2a2IQZXJjiQIRMdkEoJ5Q2yMqpfDIo+XY4k6h+YXOyKqTIj5REaxloNAd0xiKmAtsTHqW8sR2W5f7gCu5nWFUpVjZwAAAABJRU5ErkJggg==) no-repeat 50% 0;\\\n\tborder-radius: 50%;\\\n\tborder: 0 none;\\\n\tcolor: #656565;\\\n\tcursor: pointer;\\\n\tfloat: right;\\\n\tfont: 16px/16px Arial;\\\n\theight: 14px;\\\n\tmargin: 5px 1px 9px 5px;\\\n\tpadding: 0;\\\n\ttext-align: center;\\\n\twidth: 14px;\\\n\t}\\\n\t.ace_searchbtn_close:hover {\\\n\tbackground-color: #656565;\\\n\tbackground-position: 50% 100%;\\\n\tcolor: white;\\\n\t}\\\n\t.ace_replacebtn.prev {\\\n\twidth: 54px\\\n\t}\\\n\t.ace_replacebtn.next {\\\n\twidth: 27px\\\n\t}\\\n\t.ace_button {\\\n\tmargin-left: 2px;\\\n\tcursor: pointer;\\\n\t-webkit-user-select: none;\\\n\t-moz-user-select: none;\\\n\t-o-user-select: none;\\\n\t-ms-user-select: none;\\\n\tuser-select: none;\\\n\toverflow: hidden;\\\n\topacity: 0.7;\\\n\tborder: 1px solid rgba(100,100,100,0.23);\\\n\tpadding: 1px;\\\n\t-moz-box-sizing: border-box;\\\n\tbox-sizing: border-box;\\\n\tcolor: black;\\\n\t}\\\n\t.ace_button:hover {\\\n\tbackground-color: #eee;\\\n\topacity:1;\\\n\t}\\\n\t.ace_button:active {\\\n\tbackground-color: #ddd;\\\n\t}\\\n\t.ace_button.checked {\\\n\tborder-color: #3399ff;\\\n\topacity:1;\\\n\t}\\\n\t.ace_search_options{\\\n\tmargin-bottom: 3px;\\\n\ttext-align: right;\\\n\t-webkit-user-select: none;\\\n\t-moz-user-select: none;\\\n\t-o-user-select: none;\\\n\t-ms-user-select: none;\\\n\tuser-select: none;\\\n\t}\";\n\tvar HashHandler = acequire(\"../keyboard/hash_handler\").HashHandler;\n\tvar keyUtil = acequire(\"../lib/keys\");\n\n\tdom.importCssString(searchboxCss, \"ace_searchbox\");\n\n\tvar html = ''.replace(/>\\s+/g, \">\");\n\n\tvar SearchBox = function(editor, range, showReplaceForm) {\n\t var div = dom.createElement(\"div\");\n\t div.innerHTML = html;\n\t this.element = div.firstChild;\n\n\t this.$init();\n\t this.setEditor(editor);\n\t};\n\n\t(function() {\n\t this.setEditor = function(editor) {\n\t editor.searchBox = this;\n\t editor.container.appendChild(this.element);\n\t this.editor = editor;\n\t };\n\n\t this.$initElements = function(sb) {\n\t this.searchBox = sb.querySelector(\".ace_search_form\");\n\t this.replaceBox = sb.querySelector(\".ace_replace_form\");\n\t this.searchOptions = sb.querySelector(\".ace_search_options\");\n\t this.regExpOption = sb.querySelector(\"[action=toggleRegexpMode]\");\n\t this.caseSensitiveOption = sb.querySelector(\"[action=toggleCaseSensitive]\");\n\t this.wholeWordOption = sb.querySelector(\"[action=toggleWholeWords]\");\n\t this.searchInput = this.searchBox.querySelector(\".ace_search_field\");\n\t this.replaceInput = this.replaceBox.querySelector(\".ace_search_field\");\n\t };\n\t \n\t this.$init = function() {\n\t var sb = this.element;\n\t \n\t this.$initElements(sb);\n\t \n\t var _this = this;\n\t event.addListener(sb, \"mousedown\", function(e) {\n\t setTimeout(function(){\n\t _this.activeInput.focus();\n\t }, 0);\n\t event.stopPropagation(e);\n\t });\n\t event.addListener(sb, \"click\", function(e) {\n\t var t = e.target || e.srcElement;\n\t var action = t.getAttribute(\"action\");\n\t if (action && _this[action])\n\t _this[action]();\n\t else if (_this.$searchBarKb.commands[action])\n\t _this.$searchBarKb.commands[action].exec(_this);\n\t event.stopPropagation(e);\n\t });\n\n\t event.addCommandKeyListener(sb, function(e, hashId, keyCode) {\n\t var keyString = keyUtil.keyCodeToString(keyCode);\n\t var command = _this.$searchBarKb.findKeyCommand(hashId, keyString);\n\t if (command && command.exec) {\n\t command.exec(_this);\n\t event.stopEvent(e);\n\t }\n\t });\n\n\t this.$onChange = lang.delayedCall(function() {\n\t _this.find(false, false);\n\t });\n\n\t event.addListener(this.searchInput, \"input\", function() {\n\t _this.$onChange.schedule(20);\n\t });\n\t event.addListener(this.searchInput, \"focus\", function() {\n\t _this.activeInput = _this.searchInput;\n\t _this.searchInput.value && _this.highlight();\n\t });\n\t event.addListener(this.replaceInput, \"focus\", function() {\n\t _this.activeInput = _this.replaceInput;\n\t _this.searchInput.value && _this.highlight();\n\t });\n\t };\n\t this.$closeSearchBarKb = new HashHandler([{\n\t bindKey: \"Esc\",\n\t name: \"closeSearchBar\",\n\t exec: function(editor) {\n\t editor.searchBox.hide();\n\t }\n\t }]);\n\t this.$searchBarKb = new HashHandler();\n\t this.$searchBarKb.bindKeys({\n\t \"Ctrl-f|Command-f\": function(sb) {\n\t var isReplace = sb.isReplace = !sb.isReplace;\n\t sb.replaceBox.style.display = isReplace ? \"\" : \"none\";\n\t sb.searchInput.focus();\n\t },\n\t \"Ctrl-H|Command-Option-F\": function(sb) {\n\t sb.replaceBox.style.display = \"\";\n\t sb.replaceInput.focus();\n\t },\n\t \"Ctrl-G|Command-G\": function(sb) {\n\t sb.findNext();\n\t },\n\t \"Ctrl-Shift-G|Command-Shift-G\": function(sb) {\n\t sb.findPrev();\n\t },\n\t \"esc\": function(sb) {\n\t setTimeout(function() { sb.hide();});\n\t },\n\t \"Return\": function(sb) {\n\t if (sb.activeInput == sb.replaceInput)\n\t sb.replace();\n\t sb.findNext();\n\t },\n\t \"Shift-Return\": function(sb) {\n\t if (sb.activeInput == sb.replaceInput)\n\t sb.replace();\n\t sb.findPrev();\n\t },\n\t \"Alt-Return\": function(sb) {\n\t if (sb.activeInput == sb.replaceInput)\n\t sb.replaceAll();\n\t sb.findAll();\n\t },\n\t \"Tab\": function(sb) {\n\t (sb.activeInput == sb.replaceInput ? sb.searchInput : sb.replaceInput).focus();\n\t }\n\t });\n\n\t this.$searchBarKb.addCommands([{\n\t name: \"toggleRegexpMode\",\n\t bindKey: {win: \"Alt-R|Alt-/\", mac: \"Ctrl-Alt-R|Ctrl-Alt-/\"},\n\t exec: function(sb) {\n\t sb.regExpOption.checked = !sb.regExpOption.checked;\n\t sb.$syncOptions();\n\t }\n\t }, {\n\t name: \"toggleCaseSensitive\",\n\t bindKey: {win: \"Alt-C|Alt-I\", mac: \"Ctrl-Alt-R|Ctrl-Alt-I\"},\n\t exec: function(sb) {\n\t sb.caseSensitiveOption.checked = !sb.caseSensitiveOption.checked;\n\t sb.$syncOptions();\n\t }\n\t }, {\n\t name: \"toggleWholeWords\",\n\t bindKey: {win: \"Alt-B|Alt-W\", mac: \"Ctrl-Alt-B|Ctrl-Alt-W\"},\n\t exec: function(sb) {\n\t sb.wholeWordOption.checked = !sb.wholeWordOption.checked;\n\t sb.$syncOptions();\n\t }\n\t }]);\n\n\t this.$syncOptions = function() {\n\t dom.setCssClass(this.regExpOption, \"checked\", this.regExpOption.checked);\n\t dom.setCssClass(this.wholeWordOption, \"checked\", this.wholeWordOption.checked);\n\t dom.setCssClass(this.caseSensitiveOption, \"checked\", this.caseSensitiveOption.checked);\n\t this.find(false, false);\n\t };\n\n\t this.highlight = function(re) {\n\t this.editor.session.highlight(re || this.editor.$search.$options.re);\n\t this.editor.renderer.updateBackMarkers()\n\t };\n\t this.find = function(skipCurrent, backwards, preventScroll) {\n\t var range = this.editor.find(this.searchInput.value, {\n\t skipCurrent: skipCurrent,\n\t backwards: backwards,\n\t wrap: true,\n\t regExp: this.regExpOption.checked,\n\t caseSensitive: this.caseSensitiveOption.checked,\n\t wholeWord: this.wholeWordOption.checked,\n\t preventScroll: preventScroll\n\t });\n\t var noMatch = !range && this.searchInput.value;\n\t dom.setCssClass(this.searchBox, \"ace_nomatch\", noMatch);\n\t this.editor._emit(\"findSearchBox\", { match: !noMatch });\n\t this.highlight();\n\t };\n\t this.findNext = function() {\n\t this.find(true, false);\n\t };\n\t this.findPrev = function() {\n\t this.find(true, true);\n\t };\n\t this.findAll = function(){\n\t var range = this.editor.findAll(this.searchInput.value, { \n\t regExp: this.regExpOption.checked,\n\t caseSensitive: this.caseSensitiveOption.checked,\n\t wholeWord: this.wholeWordOption.checked\n\t });\n\t var noMatch = !range && this.searchInput.value;\n\t dom.setCssClass(this.searchBox, \"ace_nomatch\", noMatch);\n\t this.editor._emit(\"findSearchBox\", { match: !noMatch });\n\t this.highlight();\n\t this.hide();\n\t };\n\t this.replace = function() {\n\t if (!this.editor.getReadOnly())\n\t this.editor.replace(this.replaceInput.value);\n\t }; \n\t this.replaceAndFindNext = function() {\n\t if (!this.editor.getReadOnly()) {\n\t this.editor.replace(this.replaceInput.value);\n\t this.findNext()\n\t }\n\t };\n\t this.replaceAll = function() {\n\t if (!this.editor.getReadOnly())\n\t this.editor.replaceAll(this.replaceInput.value);\n\t };\n\n\t this.hide = function() {\n\t this.element.style.display = \"none\";\n\t this.editor.keyBinding.removeKeyboardHandler(this.$closeSearchBarKb);\n\t this.editor.focus();\n\t };\n\t this.show = function(value, isReplace) {\n\t this.element.style.display = \"\";\n\t this.replaceBox.style.display = isReplace ? \"\" : \"none\";\n\n\t this.isReplace = isReplace;\n\n\t if (value)\n\t this.searchInput.value = value;\n\t \n\t this.find(false, false, true);\n\t \n\t this.searchInput.focus();\n\t this.searchInput.select();\n\n\t this.editor.keyBinding.addKeyboardHandler(this.$closeSearchBarKb);\n\t };\n\n\t this.isFocused = function() {\n\t var el = document.activeElement;\n\t return el == this.searchInput || el == this.replaceInput;\n\t }\n\t}).call(SearchBox.prototype);\n\n\texports.SearchBox = SearchBox;\n\n\texports.Search = function(editor, isReplace) {\n\t var sb = editor.searchBox || new SearchBox(editor);\n\t sb.show(editor.session.getTextRange(), isReplace);\n\t};\n\n\t});\n\t (function() {\n\t ace.acequire([\"ace/ext/searchbox\"], function() {});\n\t })();\n\t \n\n/***/ },\n/* 17 */\n/***/ function(module, exports) {\n\n\t/* ***** BEGIN LICENSE BLOCK *****\n\t * Distributed under the BSD license:\n\t *\n\t * Copyright (c) 2010, Ajax.org B.V.\n\t * All rights reserved.\n\t * \n\t * Redistribution and use in source and binary forms, with or without\n\t * modification, are permitted provided that the following conditions are met:\n\t * * Redistributions of source code must retain the above copyright\n\t * notice, this list of conditions and the following disclaimer.\n\t * * Redistributions in binary form must reproduce the above copyright\n\t * notice, this list of conditions and the following disclaimer in the\n\t * documentation and/or other materials provided with the distribution.\n\t * * Neither the name of Ajax.org B.V. nor the\n\t * names of its contributors may be used to endorse or promote products\n\t * derived from this software without specific prior written permission.\n\t * \n\t * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n\t * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n\t * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n\t * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY\n\t * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n\t * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n\t * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n\t * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n\t * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n\t * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\t *\n\t * ***** END LICENSE BLOCK ***** */\n\n\tace.define('ace/theme/jsoneditor', ['require', 'exports', 'module', 'ace/lib/dom'], function(acequire, exports, module) {\n\n\texports.isDark = false;\n\texports.cssClass = \"ace-jsoneditor\";\n\texports.cssText = \".ace-jsoneditor .ace_gutter {\\\n\tbackground: #ebebeb;\\\n\tcolor: #333\\\n\t}\\\n\t\\\n\t.ace-jsoneditor.ace_editor {\\\n\tfont-family: droid sans mono, consolas, monospace, courier new, courier, sans-serif;\\\n\tline-height: 1.3;\\\n\t}\\\n\t.ace-jsoneditor .ace_print-margin {\\\n\twidth: 1px;\\\n\tbackground: #e8e8e8\\\n\t}\\\n\t.ace-jsoneditor .ace_scroller {\\\n\tbackground-color: #FFFFFF\\\n\t}\\\n\t.ace-jsoneditor .ace_text-layer {\\\n\tcolor: gray\\\n\t}\\\n\t.ace-jsoneditor .ace_variable {\\\n\tcolor: #1a1a1a\\\n\t}\\\n\t.ace-jsoneditor .ace_cursor {\\\n\tborder-left: 2px solid #000000\\\n\t}\\\n\t.ace-jsoneditor .ace_overwrite-cursors .ace_cursor {\\\n\tborder-left: 0px;\\\n\tborder-bottom: 1px solid #000000\\\n\t}\\\n\t.ace-jsoneditor .ace_marker-layer .ace_selection {\\\n\tbackground: lightgray\\\n\t}\\\n\t.ace-jsoneditor.ace_multiselect .ace_selection.ace_start {\\\n\tbox-shadow: 0 0 3px 0px #FFFFFF;\\\n\tborder-radius: 2px\\\n\t}\\\n\t.ace-jsoneditor .ace_marker-layer .ace_step {\\\n\tbackground: rgb(255, 255, 0)\\\n\t}\\\n\t.ace-jsoneditor .ace_marker-layer .ace_bracket {\\\n\tmargin: -1px 0 0 -1px;\\\n\tborder: 1px solid #BFBFBF\\\n\t}\\\n\t.ace-jsoneditor .ace_marker-layer .ace_active-line {\\\n\tbackground: #FFFBD1\\\n\t}\\\n\t.ace-jsoneditor .ace_gutter-active-line {\\\n\tbackground-color : #dcdcdc\\\n\t}\\\n\t.ace-jsoneditor .ace_marker-layer .ace_selected-word {\\\n\tborder: 1px solid lightgray\\\n\t}\\\n\t.ace-jsoneditor .ace_invisible {\\\n\tcolor: #BFBFBF\\\n\t}\\\n\t.ace-jsoneditor .ace_keyword,\\\n\t.ace-jsoneditor .ace_meta,\\\n\t.ace-jsoneditor .ace_support.ace_constant.ace_property-value {\\\n\tcolor: #AF956F\\\n\t}\\\n\t.ace-jsoneditor .ace_keyword.ace_operator {\\\n\tcolor: #484848\\\n\t}\\\n\t.ace-jsoneditor .ace_keyword.ace_other.ace_unit {\\\n\tcolor: #96DC5F\\\n\t}\\\n\t.ace-jsoneditor .ace_constant.ace_language {\\\n\tcolor: darkorange\\\n\t}\\\n\t.ace-jsoneditor .ace_constant.ace_numeric {\\\n\tcolor: red\\\n\t}\\\n\t.ace-jsoneditor .ace_constant.ace_character.ace_entity {\\\n\tcolor: #BF78CC\\\n\t}\\\n\t.ace-jsoneditor .ace_invalid {\\\n\tcolor: #FFFFFF;\\\n\tbackground-color: #FF002A;\\\n\t}\\\n\t.ace-jsoneditor .ace_fold {\\\n\tbackground-color: #AF956F;\\\n\tborder-color: #000000\\\n\t}\\\n\t.ace-jsoneditor .ace_storage,\\\n\t.ace-jsoneditor .ace_support.ace_class,\\\n\t.ace-jsoneditor .ace_support.ace_function,\\\n\t.ace-jsoneditor .ace_support.ace_other,\\\n\t.ace-jsoneditor .ace_support.ace_type {\\\n\tcolor: #C52727\\\n\t}\\\n\t.ace-jsoneditor .ace_string {\\\n\tcolor: green\\\n\t}\\\n\t.ace-jsoneditor .ace_comment {\\\n\tcolor: #BCC8BA\\\n\t}\\\n\t.ace-jsoneditor .ace_entity.ace_name.ace_tag,\\\n\t.ace-jsoneditor .ace_entity.ace_other.ace_attribute-name {\\\n\tcolor: #606060\\\n\t}\\\n\t.ace-jsoneditor .ace_markup.ace_underline {\\\n\ttext-decoration: underline\\\n\t}\\\n\t.ace-jsoneditor .ace_indent-guide {\\\n\tbackground: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==\\\") right repeat-y\\\n\t}\";\n\n\tvar dom = acequire(\"../lib/dom\");\n\tdom.importCssString(exports.cssText, exports.cssClass);\n\t});\n\n\n/***/ }\n/******/ ])\n});\n;","// 9.4.2.3 ArraySpeciesCreate(originalArray, length)\nvar speciesConstructor = require('./_array-species-constructor');\n\nmodule.exports = function (original, length) {\n return new (speciesConstructor(original))(length);\n};\n","var isObject = require('./_is-object');\nvar isArray = require('./_is-array');\nvar SPECIES = require('./_wks')('species');\n\nmodule.exports = function (original) {\n var C;\n if (isArray(original)) {\n C = original.constructor;\n // cross-realm fallback\n if (typeof C == 'function' && (C === Array || isArray(C.prototype))) C = undefined;\n if (isObject(C)) {\n C = C[SPECIES];\n if (C === null) C = undefined;\n }\n } return C === undefined ? Array : C;\n};\n"],"sourceRoot":""}